OmniAICreator/Qiita-1.07M huggingface dataset:
ICCA受験記

![ICCA_Certifications.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3839979/8ede2fc0-a143-4d53-9a04-7c00dc5ddd3c.png)

 ◯ 概要
eJPTに続きICCAにも無事合格しました。
ICCAについては、日本語による受験体験などの情報がなく、情報収集が難しかったことから本記事では、これから受験を考えている方に向けて、試験の概要や私が実施した勉強方法などについて紹介します。参考にしてください。

# ◯ 目次
1. ICCAとは
1. 受験動機
1. 学習方法
1. 認定試験の概要
1. 試験内容の感想
1. ICCAの価値

---

> # 1. ICCAとは
INE Securityが提供する、クラウドセキュリティの入門レベルの認定資格です。

- ### 概要
この資格は、クラウドの基本、クラウド管理の概念、そしてクラウドにおけるセキュリティ、コンプライアンスの基礎を学ぶことを目的としています。
クラウド分野への参入を目指す方や、基本的なクラウド知識を身につけたい方に適しています。

ICCAは、クラウド学習の初心者にとって、基礎を固めるのに適した資格と言えるでしょう。

> # 2. 受験動機
eJPT受験を目的としてINEのトレーニング（Fundamentals）を購入したところ、ICCAのバウチャーが付属していました。せっかくなので、このバウチャーを無駄にしたくないという気持ちから、ICCAの取得を検討しています。

クラウドに関する知識については、業務でクラウドサービスの構築を行う機会はありませんが、最低限の知識（クラウド特有の用語など）は必要だと考えており、以前にAWSクラウドプラクティショナーを取得しています。

> # 3. 学習方法
### 3-1. INEのトレーニング
1. 動画
    - ICCAの動画コンテンツは、eJPTの動画と比べて量が少ないため、短時間で全て視聴できます。
    - 内容は英語での解説ですが、日本語字幕を表示することが可能です。
        - しかし、eJPTの動画とは異なり、ハンズオンの状況を映した部分が少ない点が気になりました。
        - そのため、大まかな内容は理解できるものの、個人的には学習しづらいと感じました。

1. ラボ
    - ICCAのラボでは、AWS、Azure、GCPを操作する環境が提供されるため、自分でアカウントを作成する必要がありません。
        - 私はAWSしか使ったことがなかったので、この点は非常に助かりました。
    - ラボの内容は難しいものではありませんが、Write Upを見ながら実際に手を動かし、概要を把握することができました。
    - このハンズオンは試験に直結する内容なので、とても重要だと感じました。

### 3-2. 書籍
- 動画での学習が私にはあまり合わなかったため、以下の書籍を読み進めました。しかし、その書籍がICCAの試験対策に役立ったかというと、正直なところ疑問が残ります。（もちろん、書籍の内容自体は悪くありませんし、事実、この本でAWSクラウドプラクティショナーは取得できました。）
    - いちばんやさしい新しいAWSの教本
    - 一夜漬けAWS認定クラウドプラクティショナー直前対策テキスト

### 3-3. ネットでの情報収集
- 日本語での情報が見つからなかったので、Mediumというブログプラットフォームで受験記などを検索しました。記事の数は少なかったものの、いくつか参考になるものが見つかりました。
- また、チートシートとして綺麗にまとめられた記事もあったので、参考にさせていただきました。
    - https://github.com/iabdullah215/ICCA-Notes?tab=readme-ov-file
    - https://blog.syselement.com/ine/courses/icca

---
試験の期限が5月末までだったため、それまでに受験しようと決め、eJPT受験後と同様のペース（毎日1時間弱、1ヶ月程度）で学習しました。
- 正直なところ、eJPTほどモチベーションは上がりませんでした。
- AWSの資格も取得していたため、「楽に取れるだろう」と安易に考えていました。

> # 4. 認定試験の概要
|||
|---|---|
|試験時間|90分|
|問題形式|・46問の多肢選択式問題<br>・4つのラボタスク|
|合格ライン|多肢選択式問題について正答率70％以上 かつ 4つのラボタスクのうち最低2つは正解すること|

- 合格ラインは「正答率70%以上」とされていますが、試験後の採点結果を見ると、各セクションで個別の正答率が求められるようでした。
    - しかし、eJPTの受験記にも書いたように、どの問題がどのセクションに該当するかが明確ではないため、これを意識してもあまり意味がないと感じます。
- ラボについては、トレーニングと同様に環境が提供されるため、出題内容に合わせて構築を進めます。
    - ラボの4つの出題については、そのうち2つ以上を正解する必要があります。
    - 私は1つ間違えてしまいましたが、何が間違いだったのかは正直分かりませんでした（おそらく、求められた設定になっていなかったのでしょう）。
![ICCA_結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3839979/f3cdd9f9-d8e2-488d-80b7-4826dfc59d41.png)


> # 5. 試験内容の感想
- 試験内容は思っていたよりもかなり難しく、正直なめていました。
- IaaS、PaaS、SaaSといったクラウドサービスの違いや、責任共有モデルのような基本的な概念を理解しているだけでは不十分で、各クラウドサービスのより詳細な機能まで把握しておく必要がありました。
- 特に、AWS、Azure、GCPといった各クラウドサービスの機能に関する問題が多く出題されました。
    - 私の場合、Azureに関する問題が多く出題され、かなり悩まされました。（AWSに関する問題なら、まだ楽に解けたと思います。）

# 6. ICCAの価値
- ICCAは、クラウドを学ぶ初学者向けのコンテンツです。
- そのため、以下を目的とする方には非常に適しているでしょう。
    - これからクラウドの学習を始めたい方
    - クラウドの概要を把握したい方
    - AWS、Azure、GCPの各サービスを体験してみたい初学者の方
- しかし正直なところ、今後クラウド関連の仕事に就くことや、クラウドを利用したサービスを展開することを考えている方には、おそらく物足りない内容です。
- その場合は、AWSやAzureなど、特定のクラウドサービスに特化した学習に注力すべきだと感じました。

とはいえ、無事に合格できたことは非常に嬉しく、ひと安心しました。

---
拙い文章で恐縮ですが、今後受験を考えている方の役に立てば幸いです。
Androidでアプリがネイティブ コードを使用しているかを調べる


# 実践

まずはAndroidStudio上部にある
**Build** → **Build App Bundle(s)/APK(s)** → **Build APK(s)**　を選択しAPKを作成します。

![スクリーンショット 2025-06-15 19.22.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2394054/10582ce5-5a3a-44bf-858a-5382c71d8a12.png)

次に公式にも書いてあるとおりAndroidStudio上部から
**Build** → **Analyze APK...** で先ほど作成したAPKを選択します。




![スクリーンショット 2025-06-15 19.25.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2394054/58f53057-9212-4841-b80c-8fca6b70e2b4.png)


AndroidStudio内にAPKを分析したものが表示されるので、その中の**lib** フォルダ内を確認します。

**lib** フォルダ内に.soとつく共有オブジェクトファイルが存在する場合、アプリはネイティブコードを使用しています。存在しない場合はネイティブコードは使用していません。
libhogehoge.soという感じで表示されるので詳細を調べたい場合は、hogehogeの部分を調べてみるといいかもしれません。


# 参考


https://developer.android.com/guide/practices/page-sizes?hl=ja#native-code
JUNIT5でParameterizedTestを実施する

JUnit 5（Jupiter）でのパラメータ化テスト（`@ParameterizedTest`）のサンプルをJavaで作成します。

---

### 例：加算メソッドのパラメータ化テスト

```java:Calculator.java
public class Calculator {
    public int add(int a, int b) {
        return a + b;
    }
}
```

```java:CalculatorTest.java
import static org.junit.jupiter.api.Assertions.assertEquals;

import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;

public class CalculatorTest {

    private final Calculator calculator = new Calculator();

    @ParameterizedTest
    @CsvSource({
        "1, 2, 3",
        "0, 0, 0",
        "-1, 1, 0",
        "100, 200, 300"
    })
    void testAdd(int a, int b, int expected) {
        assertEquals(expected, calculator.add(a, b));
    }
}
```

---

### ポイント

- `@ParameterizedTest` でパラメータ化テストを宣言。
- `@CsvSource` で複数の入力値と期待結果を渡します。
pythonのユーザー定義関数「Pythonの文字列で、(　と　,　の間の文字列を抽出したい。」をAI先生ヘ。



# (本日の)ChatGPT先生へ
```
# 質問リスト
1. Pythonの文字列で、(　と　,　の間の文字列を抽出したい。
2. ユーザー定義関数でお願いします。
3. 私の質問をMarkdown形式でリスト化して出力して。Markdown形式でリストからアスタリスクは削除して。1行目に、# 質問リスト の文字を出力して。最後の質問も追加して下さい。追番を追加して下さい。Markdownのテキスト形式で。
```
#### (以下回答抜粋)
>例：
```python
import re

text = "関数(抽出したい文字列, その他)"
match = re.search(r'\(([^,]+),', text)

if match:
    result = match.group(1)
    print("抽出結果:", result)
else:
    print("該当する文字列が見つかりませんでした。")
```
>✅ 関数定義：
```python
import re

def extract_between_parenthesis_and_comma(text):
    """
    文字列から、最初の '(' と ',' の間の文字列を抽出する関数。

    Parameters:
        text (str): 対象の文字列

    Returns:
        str or None: 抽出された文字列。見つからなければ None。
    """
    match = re.search(r'\(([^,]+),', text)
    if match:
        return match.group(1)
    else:
        return None
```
>・以下省略

# Gemini先生へ

# copilot先生へ

# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342)

https://qiita.com/mrrclb48z/items/b6351b48e47bcf6265c0

# いつもと違うおすすめです。
#### Qiita内
【備忘録】転職活動の振り返りと今後のキャリアプランについて


## 記事の目的
1. 転職活動を振り返る事で転職活動中に得た気付きを明確化すること
2. 1.に基づいて今後のキャリアプランを整理すること
## 執筆者の経歴
- 大学卒業後は無線機のレンタル企業に入社（2019/04）
- 在籍中は主に無線機の通信設定や免許申請書類の作成業務を担当（2019/04～2021/10）
- 退職後はIT業界への興味・関心からプログラミングスクールに通学（2021/11～2022/04）
- プログラミングスクール卒業後は大手SES企業に転職（2022/07）
- 入社時研修としてJAVAとAWSに関する基本的な研修を受講（2022/07～2022/10）
- 研修受講後は大手Sierにてデータ活用基盤サービスの運用保守案件に配属（2022/10）
- 「障害対応」「脆弱性対応」「運用ドキュメントの作成」「インフラ基盤の構築」「リプレイス対応」など幅広い業務を経験（2022/10～2025/06）
## 転職活動の振り返り
### 実施概要
- 実施期間：2025年4月〜6月
- 応募企業：25社
- 面談：15社
- 内定：5社
### 転職軸
- 人とのつながりを感じられる環境
チームや顧客と協力しながら働くことにやりがいを感じているため
- これまでの知識や経験を活かせる環境
現職での経験をベースに、即戦力として貢献したいため
- 未経験の技術領域にも挑戦できる環境
成長のために新たなスキルや分野への挑戦を大切にしているため
### 良かった点 / 成功体験
- 書類選考や面接の通過率が約60％と比較的高く、これまでの職務経歴に対して一定の評価を得られた点
- 自己分析や面接を進める中で、「仕事に対する価値観」や「自分に不足しているスキル・経験」が明確になり、今後のキャリアプランを考える上での重要なヒントを得ることができた点
- 面接対策を通じて、これまでの経験をわかりやすく伝えるための**STAR法（Situation, Task, Action, Result）**を身につけることができ、これにより、面接でのエピソードの整理や説得力のある伝え方が可能になった点
### 改善点 / 課題
- エージェントを複数併用しすぎた結果、各社からの連絡対応や企業管理が煩雑になり、選考効率が下がってしまった点
- 面接後のフィードバックでは「学習意欲」「自走力」「技術力」に関する部分で指摘を受けることが多く、改善の余地を強く感じた点
### 得られた学び・気づき
- 仕事に対する価値観として、「仕事を通じて人とのつながりを実感できること」が自分にとって大切である事に気づいた
- 仕事を通じて人とのつながりを実感するためには、まず市場価値の高い人材へと成長する必要があること、そしてそのためにまだ知識や経験が不足していることに気づいた
- 不足している知識や経験を補うためには、日々の業務や自己学習を通じて継続的にインプットを行い、Qiitaや社内の発表会などで積極的にアウトプットしていくことが重要であることに気づいた

## 今後のキャリアプラン
### Will（実現したい働き方・価値観）
- 社内SEや自社開発のインフラ構築・運用のポジションで働きたい。  
同じ会社で働く社員という「身近な人たち」に対して、仕事を通じて直接貢献できる点に魅力を感じている。利用者との距離が近い環境で、人とのつながりを実感しながら仕事に取り組みたい。
- 社員の定着率が高い企業を選びたい
一緒に仕事をする中で築いたつながりを長く大切にしながら、安心して働ける環境でキャリアを積み上げていきたい。
### Gap（目指すキャリアとのギャップ）
- インフラ領域（ネットワーク/セキュリティ）やクラウド領域（AWS/GCP）における基礎的な知識が不足している
- 顧客や自社社員に対して技術的な内容をわかりやすく説明する力が不足している
### Plan（課題解決に向けた具体的な取り組み）
- 書籍・動画・資格学習を通じて、インフラやクラウド領域の体系的な知識をインプットする
- 学んだ内容はQiitaや社内発表会などで積極的にアウトプットし、知識の定着と説明力の向上を図る

以上
【LeetCode #9】Palindrome Numberの所見ログ

# 【LeetCode #9】Palindrome Numberの所見ログ

## はじめに  
一週間ぶりです。
今回はLeetCode#9の**Palindrome Number**に取り組んだので、そのレポを残します。

どうでもいいけど、"Palindrome"ってなじみがなさ過ぎてスペル間違えそうになるね。

ではいきましょう。

## 問題概要  
LeetCode 9: Palindrome Number

問題：
整数 x が与えられる。これが回文数（前から読んでも後ろから読んでも同じ）であるかを判定せよ。

例：
- 121 → True（121 == 121）

- 121 → False（負数は回文じゃない。"-121" != "121-"）

- 10 → False（10 != 01）

## 初見の思考

### 問題を見て最初に思ったこと：  
- 相変わらずなんもわからん。
- 配列に数字を一個ずつ取り出して、どっかで比較するのかな。
- （GPTからのヒント開示時）桁数が奇数なら中央、偶数なら折り返しで比較かな？
- 新しい変数に元の数の％１０で求めた値を格納していく？
- 条件でふるいにかけたのをループして、任意の桁数まで終わらせて比較処理をする？
- 例外処理として、負数と一桁目が０の時（０単体は除く）はとりあえず弾いて良い。

---

## 自分で書いたコード（初版）：

```java
int reversed = 0;

if (x > 0 || (x % 10 == 0 && x != 0)) {
    while (x < reversed) {
        int n = x % 10;
        x / 10;
        reversed = reversed * 10 + n;
    }
}

```
とりあえずGPTのヒントをもとに頑張って書いた、みたいな感じだね。
これの問題点は、最初の思考で、弾く時の条件がループに突入するための条件になってしまっていること。
あとはループの制御式も逆だね。 x > reversedにしないと、**一生ループに入らないよ**。

当時の僕。大丈夫そ？
あと見落としてたけど、xを１０で割って、**その変数どこにも入ってない**。 

**アホかお前**

x = x / 10;にしないとね。
あとはreturnが欲しいね。

##　正しくはこう。（GPT先生）
---
```java
public boolean isPalindrome(int x) {
    // 例外処理：負数 or 末尾が0（ただし0はOK）
    if (x < 0 || (x % 10 == 0 && x != 0)) {
        return false;
    }

    int reversed = 0;
    while (x > reversed) {
        int n = x % 10;
        x /= 10;
        reversed = reversed * 10 + n;
    }

    // 偶数桁なら x == reversed、奇数桁なら x == reversed / 10
    return x == reversed || x == reversed / 10;
}

```

### 安定の綺麗さ。

例外処理を先にやって、returnに式を使うのが無駄がなくていい感じ。
これを自分で作れるようになりたいね。

## 学び

- 例外処理は先にやる。
- 回文の判定は折り返しまでやれば十分。
- ↑の条件はx <= reversedになった時。
- booleanで条件式を使うと綺麗に戻り値を返す。

## おわりに
今回の問題は大部分をGPTに助けてもらった感じでした。

とはいえ、着々と前進してきているような気もする。

この調子で引き続き、Leetcodeに取り組んでいきます。
htmlファイルに対して、「サーバーで実行する」ときに、「選択をサーバー上で実行できません。」が出てきた。

# 前提
時間がたって、スッキリわかるサーブレット&JSP入門第2版を再学習中。

# 解決方法
発生した問題は掲題のとおりのため、もう解決方法を書く。
私の場合は、サーバーで実行→既存の構成を実行のところで既存のサーバー構成を選択していなかったので発生した。
そのため、既存の構成を選択してから「完了」を押して無事にサーバーは起動してhtmlのページが開かれた。

# 個人的なメモ
今の環境だとどうにもならないので転職しなくてはと勉強しなおし始めました。
【CCNA】QoS(Quality of Service)とは

　**QoS(Quality of Service**)とは、ネットワークを介して提供しているサービスの品質を保つための技術です。QoSを実現するためのアーキテクチャとして、以下の3つがあります。

・**ベストエフォート**
　パケットの優先順位などは考慮せず、先に来たものを先に出すという処理を行います。

・**IntServ(Integrated Services)**
　**RSVP(Resource reSerVation Protocol:リソース予約プロトコル**)を使用してフローが必要とする帯域をあらかじめ確保しておくアーキテクチャです。

・**DiffServ(Differentiated Services)**
　各ルータやスイッチごとにパケットの優先順位に基づいて区別して転送処理を行うアーキテクチャです。イーサネットフレームの優先度を表す**CoS(Class of Service**)やIPパケットの優先度を表す**DSCP(Differentiated Services Code Point**)や**IP Precedence(IPプレシデンス**)を利用します。
【まとめ】2025 Microsoft Build: AIの最新動向とサステナビリティへの取り組みから得た気づき

### はじめに
このたび、2025年5月19日〜22日の4日間、現地で「2025 Microsoft Build」に参加してきました。私はエンジニアではありませんが、一般の立場から見た最新技術（特にAI）やエネルギーに関する気づきを、みなさんとシェアできればと思います。よろしくお願いします。

![Image_20250606_135203_157.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4101511/c76b0725-5c0f-46ba-85cf-ee12895ad1df.jpeg)

## AI について
今年の Microsoft Build では、AI を中心にさまざまなトピックが取り上げられていました。

以下は、マイクロソフト公式サイトのまとめです：
All the Azure news you don’t want to miss from Microsoft Build 2025

https://azure.microsoft.com/en-us/blog/all-the-azure-news-you-dont-want-to-miss-from-microsoft-build-2025/?utm_source=chatgpt.com

その中でも特に印象に残った内容を以下に記録します。
### AI Platform: Coding Agent
Coding Agent は、GitHub Copilot を「ペアプログラマー」から進化させ、コードレビューやテスト作成、バグ修正、仕様の実装などのタスクを担う、より本格的なチームメンバーとして機能するようになります。

https://github.blog/news-insights/product-news/github-copilot-meet-the-new-coding-agent/ 

### AI Platform: SRE Agent
Azure の Site Reliability Engineering (SRE) エージェントは、システムを24時間体制で監視し、リアルタイムでインシデントに対応、自律的にトラブルシューティングを行うことで、開発者の負担軽減を図ります。

https://techcommunity.microsoft.com/blog/azurepaasblog/introducing-azure-sre-agent/4414569


### AI Platform: Copilot Agent+Power Apps+Teams
Copilot Studio を活用することで、自社データを用いたモデル訓練やエージェント作成を、ローコード（Low code）で実現可能に。
さらに、複数エージェントによる「multi-agent orchestration（多エージェント協調）」、Microsoft Teams を含むさまざまな環境で自由にエージェントを構築できる「New tools」も発表されました。

https://www.microsoft.com/en-us/microsoft-365/blog/2025/05/19/introducing-microsoft-365-copilot-tuning-multi-agent-orchestration-and-more-from-microsoft-build-2025/#tune-the-latest-ai-models-for-your-specific-business-needs

### AI活用事例

マイクロソフトのプロダクトに限らず、多くの企業によるAI活用の事例も紹介され、まさにAIの時代が到来していることを実感しました。

![画像2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4101511/a08a0b29-5a49-4903-8916-fab39f9324d6.png)

私が参加したセッションのまとめはこちらに記載しています：

https://qiita.com/kanhi/items/bc60a5e962a8546cfa62

## Sustainability（持続可能性） について

2日目のKeynoteの最後では、AI技術を支える基盤である「データセンター」にも焦点が当てられました。以下、内容を簡単にまとめます：

データセンターについて
- 2025年中に、100％再生可能エネルギーの使用を達成することを目指す
（Googleは2017年に達成済み、Amazonも2025年中を目標に掲げています）
- この1年間で増加した容量は、3年前のすべての容量を上回る
- AI向けに特化したデータセンターが求められている
- 液冷方式を採用し、クローズドループ循環により水の無駄をゼロに抑制

その他、現地セッションで得た知見や、Microsoftの持続可能性への取り組みについては、以下の記事にまとめています：

https://qiita.com/kanhi/items/28ce06942b828bcb6efd

https://qiita.com/kanhi/items/c2806be103078759d6f0

https://qiita.com/kanhi/items/b4dbca3ba1c3cec974f0

## Microsoft Build後で私が考えたこと

今回の参加を経て、今後取り組んでみたいと思ったことを4つにまとめました：

- ChatGPT 以外の AI サービスを実際に使ってみる
- 自分自身の AI エージェントを作ってみる
- 持続可能なソフトウェアエンジニアリングを学ぶ
- AIデータセンターとそのサプライチェーンについてさらに深く理解する

最近はこちらの記事も気になっています：

https://www.technologyreview.com/supertopic/ai-energy-package/ 

## 雑談
今回が私にとって初めてのアメリカでのイベント参加となり、記念も兼ねて、現地の様子をたくさん写真に収めました。
雰囲気をお伝えできればと思い、まとめ記事を作成しましたので、よろしければご覧ください。

https://qiita.com/kanhi/items/92ee015109dfb6e1db1b
DISCO Equipment Coding Contest（DECC2025）本戦参加レポート


2025年3月に開催された半導体製造装置メーカー主催のプログラミングコンテスト「DISCO Equipment Coding Contest（DECC2025）」にファイナリストとして本戦に参加しました。

---

## DECCコンテストについて

DECCは、実際の半導体製造装置をプログラムで動かし、その動作の正確さや効率性で競い合う唯一無二のプログラミングコンテストです。  
多くのプログラミング大会が仮想環境上で行われる中、実機を用いて「ものづくり」の現場に直結した技術力を試せる貴重な場となっています。

参加者は自分のプログラムが装置を動かす様子をリアルタイムで確認し、制御の調整を行いながら得点を競います。  
こうした「実物が答え合わせとなる」体験は、他のコンテストでは味わえない緊張感と高揚感をもたらします。

---

## 感想

- **ものづくりの魅力を体感**  
  ソフトウェアが実際の装置に直結し、動きをコントロールする難しさと面白さを実感しました。  
  物理的な制約やリアルタイム性への対応が求められるため、高度な設計力と即応力が必要でした。

- **運営の手作り感と熱量**  
  ディスコ社内の技術者たちが企画・運営に携わり、現場の知見が反映された質の高いコンテストでした。  
  参加者同士の交流や対面開催にも力を入れており、コミュニティとしての温かさも感じられました。

- **キャリアの可能性を広げる場**  
  DECCをきっかけに製品開発の現場に進む参加者も多く、ソフトウェアとハードウェアの融合領域での活躍に繋がっています。  
  自分自身もこの経験を活かして、リアルな制御系やロボティクス分野でのスキルを高めていきたいと考えています。

---

## 結果

本戦ではファイナリストとして上位に食い込み、入賞は惜しくも逃しましたが、  
リアルな装置制御という高度な課題に挑戦し、得難い経験と知見を得ることができました。

---

## 最後に

DECCは単なるプログラミングコンテストの枠を超え、ものづくりの最前線で活躍する技術者の技と工夫が詰まった大会です。  
これからも実機制御をはじめ、現場に直結する技術チャレンジに積極的に取り組み、技術力と経験を磨いていきます。

---

**参考:**  
[DISCO Equipment Coding Contest（DECC）2025](https://news.mynavi.jp/techplus/lp/2024/enterprise/decc_2025/)
【Udemy】Rubyでイチから未経験開発 vol1

# はじめに
今まで動画教材はなんとなく避けていたのですが、ハンズオンでアプリをデプロイまでしてみたくUdemyで購入した教材を今週から始めてみました。
# はじめてのUdemy
今までプログラミング言語はjavascriptしか勉強してきたことがなく、Udemyの教材で初めてRubyを触りました。
少し違うところももちろんありますが、基本的にはjavascriptができればそこまで難しくはないなと思いました。
### 購入した教材
https://www.udemy.com/course/ruby-on-rails-rspec/?couponCode=LOCLZDOFFPJPTRMT

CSの勉強と並行して進めていこうと思っています！
# さいごに
並行して学習しているRecursionでもアプリ作成はありますが、なかなか最初はハードルが高めなので、Udemyのハンズオンで開発出来たらなと思い購入しました！いろいろ手を出しすぎると迷子になってしまうので気を付けて学習を進めていきます！
【LookerStudio】統合データのグラフが、年単位で表示されない

# はじめに

こんにちは、ユーゴです。
今回は、BIツールであるLookerStudioのバグ(？)と、解決方法について紹介します。

# 問題

統合データの期間ディメンションを「年」にすると、グラフが表示されなくなる。

![lookerstudio-bug-004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/809e025d-f388-4e4e-9ea5-6866201046ad.png)

# 原因

おそらくLookerStudio側のバグです。統合データじゃなければ、この問題は発生しません。

# 解決策

(1) ディメンションのドリルダウンをONにする

(2) 「ディメンションを追加」を押下

(3) 「計算フィールドを追加」を押下

![lookerstudio-bug-007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/9e7a9dc8-aa60-400c-93cb-e944495b1c42.png)

(4) `YEAR(date)`という計算で年を取得 (dateはデータに含まれる日付のフィールドに変える)

![lookerstudio-bug-008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/31040029-6a7c-414e-881a-1bb767c878e2.png)

直りました

![lookerstudio-bug-009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/01b0d39b-1bec-44f1-bfc7-5f7c208026ec.png)

# 補足

ちなみに、統合データの日付について、`年/月/日`のうち`月/日`が一致していれば、この問題は起きないことが判明しています。データ整形を行えるレイヤーにいる方(エンジニアなど)は、その時点でデータを合わせるのも一つの手かもしれません。

# 付録

今回、試験的に使用した環境を添付しておきます。

![lookerstudio-bug-010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/0e754257-4096-4885-8526-96752dc4215c.png)

![lookerstudio-bug-020.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/b0930733-838a-448e-b56b-50238fa03bbb.png)

![lookerstudio-bug-040.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/84a146fe-6b83-41cc-96bb-649e32a23aa7.png)

# まとめ

いかがだったでしょうか。今回は、LookerStudioの統合データについて、グラフが表示されないバグ(or 仕様？)についてと、その解決策について紹介しました。

このように、BIツールの紹介から、スプレッドシートやフォームとGASの連携, Unity, 量子コンピューティングなど、縦横広くエンジニアリングについて紹介しております。

お役に立てましたら、いいね, フォローなど、よろしくお願いします！！
Facebook動画を簡単に保存する方法【SnapSaveで安心ダウンロード】

Facebookで見つけた感動的な動画や、役立つレシピ動画、思い出に残るライブ配信など、「もう一度見たい」「保存しておきたい」と思ったことはありませんか？

しかし、Facebook自体には公式な動画ダウンロード機能がありません。そんなときに便利なのが、[facebook video download snapsave](https://snapsave.blog/) です。

このオンラインツールを使えば、ソフトをインストールせずに、URLを貼り付けるだけでFacebookの動画を簡単にダウンロードできます。MP4形式での保存はもちろん、音声だけをMP3形式で保存することも可能です。

主な特徴：
高画質の動画をすぐに保存できる

Facebookリールやストーリー、ライブ動画にも対応

スマホ・PCどちらでも利用可能

完全無料で安全、登録不要

SnapSaveは、使い方も非常に簡単で、技術に詳しくない人でも安心して使えるのが魅力です。

家族との思い出や大切なコンテンツをいつでも見返せるよう、今すぐ [b][url=https://snapsave.blog]facebook video download snapsave[/url][/b] を試してみてください！
Architecture Challenge サイバーエージェントインターン参加レポート

〜 複数のサービスを支えるマルチテナンシーなプラットフォームを設計せよ 〜

---

## インターン概要

サイバーエージェント主催の技術インターン「**Architecture Challenge**」に参加しました。  
本インターンでは、**複数のWebサービス（ファンクラブサイトなど）を支えるマルチテナント型プラットフォームのアーキテクチャ設計**をテーマに、SRE・インフラ・セキュリティ・スケーラビリティなど様々な要素を考慮した構成を自ら提案し、社員エンジニアからのフィードバックを受けることができました。

---

## 課題テーマ

> **「複数のサービスを支えるマルチテナンシーなプラットフォームを設計せよ」**

- アーティストごとに異なるWebサービスを効率よくホストするための設計
- 信頼性・スケーラビリティ・コスト最適化を満たす必要あり
- ノイジーネイバー問題やデータ分離の工夫も必須

---

## 提案した構成のポイント

| 項目 | 内容 |
|------|------|
| アーキテクチャ | ECS Fargate + ALB + API Gateway によるマイクロサービス構成 |
| 可用性 | マルチAZ構成・オートスケーリング・Auroraの自動フェイルオーバー |
| セキュリティ | WAF・Secrets Manager・JWT認証とRBACによる多層防御 |
| スケーラビリティ | CloudFront・SQS・ElastiCacheで分散 & 非同期処理 |
| モニタリング | CloudWatch Logs・X-Ray によるトレーシングと可視化 |
| テナント設計 | データレイヤーは論理分離、アプリケーションは共有基盤上でマルチテナント対応 |

---

## 苦労した点

- **マルチテナントとマイクロサービスの両立**：分離と共通化のトレードオフの設計
- **ノイジーネイバー対策**：テナントごとのリソース制限の方法（リクエスト制御や隔離）
- **コスト最適化**：可用性と性能を保ちつつ、運用コストを抑える設計

---

## 得られた学び

- プロダクト単位ではなく「**プラットフォーム視点で設計する力**」の重要性
- サービスごとの特性を踏まえた**スケーリング戦略・負荷対策**の考え方
- 「**ベストプラクティスが常に最適とは限らない**」という現場視点の重要性
- 社員エンジニアのフィードバックから学ぶ**構成の伝え方や妥当性の説明力**

---

## 今後に活かしたいこと

- SRE/MLOps視点での**障害設計・スケーラビリティ設計**のスキルアップ
- **IaC（Terraform）やGitOpsの自動化技術**の習得
- **複雑な構成をシンプルに伝える資料設計力・プレゼンスキル**

---

## 最後に

Architecture Challengeは、インフラやSREの視点から**現実的な制約と設計上の工夫を体感できる最高の機会**でした。  
「ただ動く」だけでなく、「落ちずにスケールし、運用し続けられる」システムを作るとはどういうことか。  
その本質に触れることができ、大きな学びとなりました。

サイバーエージェントの皆さま、貴重な機会を本当にありがとうございました！

---
launchctlコマンド操作マニュアル（Macサービス管理）

# サービス管理コマンド 「launchctl」
Mac環境でサービス管理を行うlaunchctlコマンドの使い方をまとめています。plistファイル設定方法もあわせて解説。

## コマンド

launchctl 

## オプション

|オプション|説明|
|---|---|
|start |サービス開始 |
|stop|サービス停止|
|list|サービス有効なものを確認|
|load|サービス有効|
|unload|サービス無効|

**⚠️ エラーが起きた時などplist変更加えた後はunloadしてloadする**

## ファイルを置き場

```~/Library/LaunchAgents/```


## plist

- dictionayのkey-valueで構成

- Label: plist このファイル名<str>

- ProgramArguments: [スクリプトフルパス<str>]

- StartCalendarInterval: {Hour: 時間<int>} {Minute: 分<int>}

- StandardOutPath: /tmp/<ファイル名>.log<str> # ログ

- StandardErrorPath: /tmp/<ファイル名>.error<str> # エラーログ

- RunAtLoad: true<bool>
  
サンプル

```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.<ユーザー名(識別できればなんでも良い)>.<ファイル名(識別できればなんでも良い)></string>

    <key>ProgramArguments</key>
    <array>
        <string><スクリプトパス></string>
    </array>

    <key>StartCalendarInterval</key>
    <dict>
        <key>Hour</key>
        <integer><実行時間(時間)></integer>
        <key>Minute</key>
        <integer><実行時間(分)></integer>
    </dict>

    <key>StandardOutPath</key>
    <string>/tmp/<ファイル名>.log</string>

    <key>StandardErrorPath</key>
    <string>/tmp/<ファイル名>.error</string>

    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>
```

---

1891年 ヴィクトリア朝のシャーロックホームズの世界に3名の生成AIが突如現れる。 
現代社会の不可思議なビジネス課題をこの3名の生成AIが謎に迫る。

ビジネスコンテンツ × ミステリー × 生成AIの世界観をお楽しみください。

https://roi-blog.playground.style

ROI探偵事務所の事件で使用した知識をこちらに掲載しています

https://business-on.playground.style
「デジタル名刺アプリ」を作成しました【React｜TypeScript｜Supabase】

# はじめに
今回は、前回作成した学習記録アプリからステップアップし、デジタル名刺アプリを開発しました。 実際にどのような機能を実装したかは、以下でご紹介します。

# 実装内容
## 概要
まず、このアプリを開発する上で、以下のような背景を想定しています。

### 背景(想定)
> - 勉強会で名刺交換をする中で、記載内容がそれぞれ異なるために話題が生まれにくいこと、そして名刺を持っていない人もいることに着目。そこで、誰もがその場で登録できるオンライン名刺システムの開発を企画
> - オンライン名刺はその日限りで有効とし、翌日には閲覧できなくする仕様
> - 実装はスマートフォンの画面サイズに最適化

## 主な機能
1.**名刺登録機能:** 好きな英単語、氏名、自己紹介、好きな技術、SNSアカウント(GitHub、Qiita、X)の情報を登録し、デジタル名刺を作成できます

<img width="315" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3775597/ddd1d203-b834-4c85-8b0e-bf08ac1993bd.png">

:::note info
補足
登録操作のデモ動画の容量が大きすぎて表示できなかったので、以下のように名刺検索のみGIFを載せています
:::

2.**名刺検索機能:** 登録時の「好きな英単語」で検索し、閲覧できます

<img width="315" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3775597/2a4f8223-ba3d-43b0-88c4-cc59626e442f.gif">

3.**ユーザー情報自動削除機能:** 登録されたユーザー情報は翌日にすべて自動で削除されます


# 開発における課題と工夫
開発において特に苦労したのは、データベースの部分でした。
今回のアプリ開発では、複数のテーブルを関連付ける必要があったため、理解に時間を要しました。

# 今回の開発で得られた学び
前回開発した学習記録アプリでは、データベースはテーブルが一つで済んだため、特に深く考える必要はありませんでした。
しかし、今回のアプリ開発で複雑なデータベース操作を経験し、今後より高度なデータベース知識が不可欠になると痛感しました。

# さいごに
次回はオリジナルアプリの開発に取り掛かる予定です。これまでの経験を最大限に活かし、開発に臨んでいきたいと思います。

# JISOUのメンバー募集中！
プログラミングコーチングJISOUでは、新たなメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？
興味のある方は、ぜひホームページをのぞいてみてくださ！
▼▼▼

https://projisou.jp
Windows で Docker Desktop その6

[Windows で Docker Desktop その5](https://qiita.com/intrajp/items/e8f1e658ab9f0823ee76)の続きです。

フォークしておいたリポジトリをクローンして、ファイルを書き換えると、自動的にサービスで内容が書き換わるということをやってみたいと思います。

このページを参考に、Visual Studio Code の設定を施しました。同時に、Windows マシンで SSH キーも作成して、github に登録しました。日本語化等もやりました。
このページがすごく参考になりました。

https://zenn.dev/kd_gamegikenblg/articles/b220e23b0b7ef9

Windows マシンにクローンしたレポジトリの index.html ファイルを開くと、このようになっています。
![スクリーンショット 2025-06-15 180602.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470368/c892e7f9-8bff-4a87-b6bc-b968ef3a7ca0.png)

webページでは、このようになっています。

![スクリーンショット 2025-06-15 171013.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470368/ad5b285f-7c30-4082-8074-d7ab415662b2.png)

では、index.htmlをちょっと書き直してみます。

This is version 1.1 としました。

次に、index.html をクリックして、「変更をステージ」をクリックします。
このようになりました。

![スクリーンショット 2025-06-15 182115.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470368/8ae3a5c2-95fd-4504-b977-45c5820bc23f.png)

そして、コミットして（メッセージは適宜）、プッシュしたところ、web ページも更新されています。

![スクリーンショット 2025-06-15 183030.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470368/e9d80250-be98-4562-9648-a4d7063bb972.png)

VSCode を設定したので、そこのターミナルから、オブジェクトを削除できます。

```
PS C:\Users\xxx\GIT\TKB\pods> kubectl delete pod hello-pod initpod git-sync
pod "hello-pod" deleted
pod "initpod" deleted
pod "git-sync" deleted

PS C:\Users\xxx\GIT\TKB\pods> kubectl delete svc k8sbook svc-sidecar
service "k8sbook" deleted
service "svc-sidecar" deleted
```

参考文献

Poulton, N. (2025). The kubernetes book (2025 ed.). Nigel Poulton.
[Android]Pixel9をroot化する

最近はあまりroot化需要がないかもしれませんが、Pixel9をroot化（bootloader unlock + Magisk導入）したので、その手順を残しておきます。
# 0.前提条件
+ 失敗すると端末が起動しなくなる恐れがあります。作業にあたっては複数の情報を確認するとともに、自己責任により実施してください
+ 作業工程で端末が初期化されます。データのバックアップ等は忘れずに実施してください
+ root化したのはPixel9（無印）です。9Proや9Pro XLでの動作は未確認です
+ root化時のAndroidバージョンは14、ビルド番号はAD1A.240530.047です
+ 作業にはPCが必要です。今回の作業環境はMacでadbは当時(2024年11月)の最新版です。大まかな作業はWindows・Mac問わず変わりません
+ 作業にはadbを使用します。adbの導入方法が分からない場合は他で調べてください
# 1.参考サイト
> [Guide] Rooting your Pixel 9 [Tokay] (Magisk / APatch / KernelSU)
> https://xdaforums.com/t/guide-rooting-your-pixel-9-tokay-magisk-apatch-kernelsu.4690837/

# 2.必要なファイル（2つ）
+ ファクトリーイメージ（factory image）の中のinit_boot.img
[Nexus デバイスと Pixel デバイスのファクトリー イメージ](https://developers.google.com/android/images?hl=ja)から、Pixel9のビルド番号が同じfactory imageをダウンロード（Linkより）します。
今回の場合、「"tokay" for Pixel 9」の14.0.0 (AD1A.240530.047, Aug 2024)が該当しますので、任意の場所にダウンロードします。
解凍（展開）後、フォルダ「tokay-ad1a.240530.047」の中の「image-tokay-ad1a.240530.047.zip」を解凍し、その中に入っているinit_boot.imgを任意の場所に格納しておきます。
作業工程でPixel9を初期化した後、Pixel9の中の任意の場所に入れておきます。（初期化したら消えてしまうので。）
+ Magisk
[githubのMagiskのページ](https://github.com/topjohnwu/magisk/releases)から最新のMagiskのapkをダウンロードしておきます。
私が実施した際は28.0(28000)を使用しました。
初期化後、Pixel9にインストールする作業があります。apkファイルのインストール方法について、この記事では触れません。
# 3.手順
大まかな手順は下記のとおりです。
1.開発者向けオプションを有効にする
2.ブートローダー（bootloader）をアンロック（unlock）する（※ここで初期化されます）
3.Magiskを導入する

## (1)開発者向けオプションを有効にする
まずPixel9の「開発者向けオプション」を有効にします。
1.「設定」アイコンをタップ
2.「デバイス情報」をタップ
3.「ビルド番号」を7回タップすると、有効になる。
「設定」→「システム」の中に「開発者向けオプション」が出てきますので、オプションのうち「OEMロック解除」と　「USBデバッグ」を有効にします。
（途中で「実施しますか？」というようなことが聞かれた気もしますが、実施してください。）
## (2)ブートローダー（bootloader）をアンロック(unlock)する
 PCとPixel9を接続し、ターミナル（コマンドプロンプト）からbootloaderにアクセスする。
（初めての接続の場合はデバイス認証が入る場合があります。adb devicesで確認して、Pixel9を操作して認証してください。）
```
adb bootloader
```
bootloaderに入ったら、unlockします。
下記コマンドを叩くとbootloaderがunlockされるとともに、Pixel9が初期化されます。データのバックアップ等が必要な場合は必ずこの手順の前にバックアップを済ませてください。
```
fastboot flashing unlock
```
これでbootloaderのunlockは完了です。
下記コードでPixel9を再起動します。
## (3)Magiskを導入する
Pixel9にMagiskをインストールします。
apkのインストールはadb pushでもPixel9から直接でも、別の方法でもインストールされていればOKです。

インストールしたMagiskを開いて、
Magisk「インストール」→「パッチするファイルの選択」で事前に用意しているinit_boot.imgを指定し、「はじめる」を押します。
少しの間処理が走り、「All done!」が出たら終了です。init_boot.imgが入っていたフォルダに、「magisk_patched-********.img」というファイルが作成されているはずなので、ファイルを作業用のPCのadbパスが通っている場所に移します。

再びPCとPixel9を接続し、bootloaderにアクセスします。
```
adb bootloader
```
bootloaderに入ったら、下記コードでinit_bootをflashします。
（Magiskでパッチを当てたファイルを、init_boot_aとinit_boot_bの両方にflashします。）
```
fastboot flash init_boot_a magisk_patched-********.img
fastboot flash init_boot_b magisk_patched-********.img
```
無事処理が済んだら、Pixel9を再起動します。
```
fatsboot reboot
```
これで、Pixel9のroot化は終了です。
# 4.雑感
以前（Pixel6あたりまで？）はinit_boot.imgではなく、boot.imgにパッチをあててflashしていましたが、今では手順が変わったようですね。
インスタグラム音声ダウンローダーオンライン：シンプル、迅速、そして効果的           Select 90 more words to run Humanizer.

 バズるリールや印象的なストーリーなど、ユーザーはしばしば音声クリップを保存したいと思います。しかし、Instagramでは音声を直接ダウンロードすることができません。そこで役立つのが、[Instagram音声ダウンローダーオンライン](https://i2mate.online/)のようなツールです。これらのツールは、Instagramの投稿から音声を素早く簡単に抽出できます。特別な技術は必要ありません。クリエイターでも一般ユーザーでも、このようなツールを使えば時間を節約でき、創造力も広がります。ここではその仕組みと、信頼できるダウンローダーの特徴を見ていきましょう。
 
Instagram音声ダウンローダーオンラインとは？

Instagram音声ダウンローダーオンラインとは、Instagramの公開投稿から音声を抽出できるツールです。アプリのインストールは不要で、Webブラウザから利用できます。そのため、動作は高速で軽量、誰でも使いやすいのが特徴です。ほとんどのツールでは、Instagramの投稿URLを貼り付けるだけで、数秒で音声ファイルがダウンロード可能になります。

なぜInstagramの音声をオンラインでダウンロードするのか？

Instagramの音声をダウンロードすることには、多くの利点があります。編集用、好きな音の保存、またはコンテンツの再利用など、さまざまな場面で役立ちます。
このような場面で便利です：
アプリや拡張機能のインストール不要
モバイル・PCなどすべてのデバイスで使用可能
リール、IGTV、ストーリーから高音質の音声を保存
サインアップなしで迅速にダウンロード
クリエイター、編集者、マーケターに最適

Instagramの音声をダウンロードするのは合法？

使用目的によって異なります。個人利用であれば、通常は問題ありません。ただし、共有・公開する場合は、権利を確認し、必要な許可を取得する必要があります。著作権法を常に尊重し、適切なクレジットも忘れずに。

Instagram音声ダウンローダーの使い方は？


使い方はとても簡単です。以下のステップに従ってください：
Instagramで音声付き投稿のURLをコピー
ブラウザを開き、[i2mate](https://i2mate.online/)にアクセス
入力欄にURLを貼り付ける
「ダウンロード」ボタンをクリック
音声ファイルをデバイスに保存

信頼できるInstagram音声ダウンローダーはどこにある？

おすすめのプラットフォームのひとつが i2mate です。広告が少なく、操作もスムーズで、さまざまな形式に対応しています。Instagramの音声を楽しく、または仕事でダウンロードしたい場合でも、i2mate を使えば、シンプル・高速・安全です。
二重ループ：基本編　積の最大



今日は多重ループの範囲で、配列Aと配列Bの要素をかけたときの最大値を求める問題に挑戦！

それぞれの配列の最大値をとって掛ければ簡単に解決！と思ったけど…。違ったみたい(´;ω;｀)

<br>

## 問題概要

- 配列 A と B についての情報が与えられる

- (A の 1 つの要素) × (B の 1 つの要素) の最大値を求めよ

<b4r>

入力例:

    10 10
    85 -46 93 44 -40 -75 -75 -18 -54 95
    1 95 -92 -90 32 -25 36 55 22 86

出力例:

    902

<br>

https://paiza.jp/works/mondai/double_roop_problems/double_roop_problems__multi_max

<br><br><br>


## ❌ NG例：「最大値×最大値」で間違えたコード
```js
const rl = require('readline').createInterface({input:process.stdin});

const lines = [];

rl.on('line', (input) => {
    lines.push(input);
});



rl.on('close', () => {
    const [N, K] = lines[0].split(' ').map(Number);
    const arrA = lines[1].split(' ').map(Number);
    const arrB = lines[2].split(' ').map(Number);
    
    const maxA = Math.max(...arrA);
    const maxB = Math.max(...arrB);
    
    console.log(maxA * maxB);
});
```

<br>

## ❓ なぜ maxA * maxB じゃダメなときがある？

### ✅ 例を見てみる：

- arrA = [-10, -5];
- arrB = [-20, -3];

最大値は：

- maxA = -5
- maxB = -3

maxA * maxB = (-5) * (-3) = 15

<br>

でも…

💡-10 * -20 = 200 ← こっちの方がでかい！！

<br>

❗ 結論：

単に「最大値」を取るだけでは不十分。
なぜなら、負の数 × 負の数 = 正の数で、しかも大きくなり得るから！


<br>

### ❓ じゃあ、絶対値で見てみるのは？

一見よさそうだけど…

- arrA = [-1000, 2]
- arrB = [-1000, 2]

最大の絶対値は 1000 → 1000 * 1000 = 1,000,000

<br>

でも…
その 絶対値 をとった数が同じ符号同士だった場合のみ有効で、異なる符号だった場合、

本来は、
1000 * -1000 = -1,000,000 なのに…。となってしまう。
<br>

→ 絶対値の最大同士を掛けるのは 得策ではない。

<br><br>

## ✅ OK例：すべての組み合わせを試す安全な方法
```js
let max = -Infinity;

for (let a of arrA) {
  for (let b of arrB) {
    max = Math.max(max, a * b);
  }
}

console.log(max);
```
初期値を 0 にしちゃうと、すべての積が負だったときに正しい結果が出ない！
→ だから `-Infinity` を使うのが安全。

<br><br>

## 📝メモ

- 負の数も含める場合、配列Aの最大値 ✖️ 配列Bの最大値 が 最大値 になるとは限らない。
- 絶対値がでかくても、符号の組み合わせ次第でマイナスになる
- 配列×配列の全通りを調べる2重ループが安定かも
- `-Infinity` を初期値にする → どんな数と比べても常に意図した比較ができる

<br>

## まとめ

計算量を減らしたり、スマートなコードにするために、メソッドを駆使してみようと思ったけど、結局、基本の多重ループが安定だった。


<br><br><br>[僕の失敗談(´;ω;｀)と解決法🐈](https://paizabeginner.wordpress.com/2025/06/15/paiza%e3%81%a7%e5%9f%ba%e6%9c%ac%e3%83%9e%e3%82%b9%e3%82%bf%e3%83%bc%ef%bc%9a%e4%ba%8c%e9%87%8d%e3%83%ab%e3%83%bc%e3%83%97%ef%bc%9a%e5%9f%ba%e6%9c%ac%e7%b7%a8%e3%80%80%e7%a9%8d%e3%81%ae%e6%9c%80/)
【応用情報】NFC(Near Field Communication)とは

NFCとは、スマートフォンなどで交通系ICカード機能を利用する際などに用いられる、至近距離での無線通信規格である。
また、NFCには、ピアツーピア(Peer to Peer)通信が可能なモードがあり、対応した機器同士が直接通信することができる。
【Python初心者】struct_timeとZoneInfoの基礎と使い方

今回は、日付と時刻に関する少し発展的な内容として、以下の2つを学びました。

- `struct_time`：時間情報の構造体  
- `ZoneInfo`：タイムゾーンの扱い方（Python 3.9以降）

それぞれの基本的な使い方を見ていきます。

## struct_time：時間情報の構造体

`struct_time` は、`time.localtime()` や `time.gmtime()` などの関数で返ってくる**時間情報のまとまり**です。  
タプルのようにインデックスでも、属性名でもアクセスできます。

```python
import time

t = time.localtime()
print(t)
```

実行例：

```
time.struct_time(tm_year=2025, tm_mon=6, tm_mday=15, tm_hour=15, tm_min=0, tm_sec=0, tm_wday=6, tm_yday=166, tm_isdst=0)
```

それぞれの属性は次のような意味があります：

| 属性名      | 意味               | 例           |
|-------------|--------------------|--------------|
| `tm_year`   | 年                 | 2025         |
| `tm_mon`    | 月（1〜12）        | 6            |
| `tm_mday`   | 日（1〜31）        | 15           |
| `tm_hour`   | 時（0〜23）        | 15           |
| `tm_min`    | 分（0〜59）        | 0            |
| `tm_sec`    | 秒（0〜59）        | 0            |
| `tm_wday`   | 曜日（0=月, 6=日） | 6            |
| `tm_yday`   | 年内通算日（1〜366）| 166          |
| `tm_isdst`  | サマータイムか否か | 0（非対応）  |

### 属性へのアクセス例：

```python
print(t.tm_year)   # 2025
print(t.tm_wday)   # 6（日曜日）
```

日付や時刻を**分解して扱いたいとき**に便利です。

## ZoneInfo：タイムゾーンの指定（Python 3.9以降）

Python 3.9 から `zoneinfo` モジュールを使うと、**タイムゾーンつきの日時処理**ができるようになりました。

これにより、たとえば「UTC」と「日本時間（Asia/Tokyo）」の変換が簡単にできます。

```python
from datetime import datetime
from zoneinfo import ZoneInfo

# タイムゾーンを指定して現在時刻を取得
dt_tokyo = datetime.now(ZoneInfo("Asia/Tokyo"))
dt_utc = datetime.now(ZoneInfo("UTC"))

print("Tokyo:", dt_tokyo)
print("UTC  :", dt_utc)
```

実行例（※一例）：

```
Tokyo: 2025-06-15 15:00:00+09:00  
UTC  : 2025-06-15 06:00:00+00:00
```

### 他のタイムゾーン例：
- `"America/New_York"`
- `"Europe/London"`
- `"Asia/Shanghai"`

### UTC との変換も簡単

```python
# UTCの日時を東京時間に変換
dt_utc = datetime(2025, 6, 15, 6, 0, tzinfo=ZoneInfo("UTC"))
dt_tokyo = dt_utc.astimezone(ZoneInfo("Asia/Tokyo"))
print("UTC時間:", dt_utc)
print("東京時間:", dt_tokyo)
```

出力例：

```
UTC時間: 2025-06-15 06:00:00+00:00  
東京時間: 2025-06-15 15:00:00+09:00
```

これによって、**国際化された日時処理**が正確に行えます。

## おわりに

今回は `struct_time` での時間の構造的な扱い方と、`ZoneInfo` を使ったタイムゾーン処理をまとめました。

`ZoneInfo` は Python 3.9 以降でのみ使えるため、環境のバージョン確認も忘れないようにしようと思います。
[cmd]フォルダ内のファイル拡張子をtxtに統一して、全ファイルを1つのtxtに結合する

仕事の中で

1.バラバラな拡張子を1つに統一する
2.拡張子を統一したファイルを1ファイルに統合する

というような作業が必要になり、ネットを漁った結果、コマンドプロンプトを用いて簡単に作業できることを学んだので、その備忘録です。

仕事中にさっと調べて使ってしまったので、学ばせていただいたサイトは失念してしまいました…感謝しています。

# 前提条件
職場のパソコンはWindows10、再現してみたのもWindows10です。
再現している状況下でのコマンドプロンプトはVersion 10.0.19045.5131です。

コマンドプロンプトを使う中で、作業フォルダへ移動するためのコマンドcdは特に説明なく使います。cdの説明については他に譲ります。

今回再現で使用したファイルは、メモ帳でファイル名＋改行をして保存してあります。

# 1.バラバラの拡張子を1つに統一する。
使用するのはrenコマンドです。
```
C:\Users\[ファイルが入っているフォルダ]>ren <変更前のファイル名> <変更後のファイル名>
```
変更前のファイル名はワイルドカードが使えます。
今回はフォルダ内にあるtxt、dat、csvの3種類をtxtに統一したいので
```
C:\Users\[ファイルが入っているフォルダ]>ren *.* *.txt
```
と打ち込みます。
![0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505452/9240a973-974a-4286-8bb4-29ea727923a7.png)
変更前：統一されていないファイル種類

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505452/4fbea7d6-ead0-415c-99e3-b7ad76262823.png)
変更後：txtファイルに統一

# 2.拡張子を統一したファイルを1ファイルに統合する
使用するのはcopyコマンドです。

> copy
> 1つ以上のファイルを別の場所にコピーします。
> Microsoft Learn
> https://learn.microsoft.com/ja-jp/windows-server/administration/windows-commands/copy

```
C:\Users\[ファイルが入っているフォルダ]>copy <コピー元のファイル名> <コピー後のファイル名>
```
このコマンドもワイルドカードを用いて
```
C:\Users\[ファイルが入っているフォルダ]>copy *.txt 合体.txt
```
と打ち込みます。

# 3.雑感
今回は統一した名前付けをしているファイルだったため、上から順番に結合されましたが、ファイル名によっては結合する順番が異なるとのことです。（要調査）

このTipsを書いている途中、
「拡張子を統一しないでそもそもcopyコマンドで結合できてしまうのでは？」
と思い、下記コマンドを実行してみたところ、問題なく同じ結果が出ました…日々勉強ですね。
```
C:\Users\[ファイルが入っているフォルダ]>copy *.* 合体.txt
```
WSLからGitLabへのプッシュを楽にする



## 初めに

不勉強が原因で, GitLabに対してコードをプッシュする度に, 毎回ユーザネームとパスワードを手打ちしていました. これが結構なストレスでして, 怠惰な私でも我慢できなくなってきた為, 改善を試みたら思ったより簡単だったので共有します.

また, 今回はSSHキーを使用する方法を書きます. 備忘録がてら記事にいたします.

## WSLからGitLabへのプッシュを楽にする手順

- SSHキーペアの生成
- 公開鍵をGitLabに登録
- GitリポジトリのURLをSSH形式に変更

順を追って説明していきます.

### SSHキーペアの生成

やりたいことは, "ローカル環境(WSL)でSSH公開鍵と秘密鍵のペアを生成"です.

#### コマンド実行

WSLのターミナルを開き, 下記のコマンドを実行します.

```bash
ssh-keygen -t ed25519 -C "comment"
```

簡単に解説

- "ssh-keygen"
    - 文字通り, sshで公開鍵と秘密鍵を生成する
- "-t"
    - 暗号化アルゴリズム指定
- "ed25519"
    - 現在推奨されている強力な暗号化アルゴリズムらしい. 詳しくは調べていません
- "-C"
    - コメントを付けるための指定
- "comment"
    - コメント. 通常はGitLab, GitHubに登録しているメールアドレス

#### 質問に答える

```bash
Enter file in which to save the key (/home/your_user/.ssh/id_ed25519):
```
鍵の保存先パス. 特に変えたい理由が無ければデフォルトでOK.
私はそのままEnterを押しました.

```bash
Enter passphrase (empty for no passphrase):
```
パスフレーズの設定. GitHubは登録を推奨しているとのことです.
私は怠惰なので何も入力せずにパスフレーズなしの設定にしました.
(エンタープライズ向けのレポジトリだったら問答無用で設定でしょうね.)

### 公開鍵をGitLabに登録

#### WSL上での作業

生成された公開鍵の内容を表示してコピー.

```bash
cat ~/.ssh/id_ed25519.pub
# 下記のような文字列が表示されるはず. 下記文字列をすべてコピーする.
# ssh-ed25519 AAAA... comment
```

#### GitLab上での作業

- GitLabにログイン->Preferences->SSH Keys
- keyのテキストエリアに, コピーした文字列を貼り付け
- Titleはお好きにどうぞ
- Add keyをクリック

### GitリポジトリのURLをSSH形式に変更

ローカルのGitリポジトリのディレクトリに移動し, リモートURLを確認
```bash
git remote -v
```

これで以下のような文字列が出てくるはず. これはhttps方式
```bash
origin  https://gitlab.com/your-group/your-project.git (fetch)
origin  https://gitlab.com/your-group/your-project.git (push)
```

GitLabのプロジェクトページにて, CloneボタンからSSH形式のURLをコピーしてくる
```bash
# 下記のような形になっているはず
git@gitlab.com:your-group/your-project.git
```

次のコマンドを実行してURLを変更
```bash
git remote set-url origin git@gitlab.com:your-group/your-project.git
```

以上.

## 参考記事
[SSH鍵の作成方法と -t -C オプションのすすめ](https://qiita.com/ryemug1/items/bacf6e6583656f3cf0d1)
ABC410-D を Python で解いた

ABC410 D - XOR Shortest Walk
https://atcoder.jp/contests/abc410/tasks/abc410_d

解けなくて悔しかったので復習のために記事にしてみました。

## コンテスト中の自分の動き
C までは楽に終わりましたが D で手が止まりました。いろいろなアイデアが浮かびました。全ての経路を列挙して比較できればいいですが、多重辺はまだしも閉路の扱いが厄介です。最小値を求める際に上の桁から順に桁ごとに考えれば楽になる気がします。前々回 ABC408-E がそんな問題だったと聞きましたし、 XOR を桁ごとにみて 1 の個数の偶奇を調べるのは典型ですね。そもそも経路を全て列挙できるようなら桁ごとに考えるような工夫は不要でしょうし、やはり XOR であることに意味があるのではないかと考えました。というわけで経路を列挙することは諦めました。

その後も考えていくと、桁ごとに考えるのは無理があるという結論に達しました。最上位桁が 0 になるような walk を把握しておき、次はそれらの中から次の桁が 0 になるような walk を探し……みたいになっていくと結局経路を列挙できなければいけません。これは先ほども書いたように多重辺やら閉路やらで扱いきれません。ここでようやく桁ごとに処理する方針を抹消します。

E問題を考えたりしている間に、重みが最大で 1023 までしかないことに気づきます。各頂点ごとに、その頂点に辿り着いたときの XOR の最小値を記録していく DP はどうか？と思いつきました。ただ、最小値だけを記録してもいけません。XOR の値は掛け合わせる数字次第でいくらでも上下してしまうので、取り得る値を全て記録しておく必要があります。

これを実装しました。お察しの通り結果は TLE でした。7つ出ました。以下のコードを見ていただければわかるように、G[v] と dp[v] を掛け合わせる2重ループがあります。dp[v] に入る値の個数が最大 1024 個しかないといってもやはりこんな風にループさせるのは無茶だったようです。結局ここから解決の糸口が見えず、不正解のまま終わってしまいました。

```python
from collections import deque
N, M = map(int, input().split())
dp = [set() for _ in range(N+1)]
dp[1] = {0}
G = [[] for _ in range(N+1)]
for i in range(M):
  a, b, w = map(int, input().split())
  G[a].append((b, w))

que = deque([1])
while(que):
  v = que.popleft()
  for (v2, w) in G[v]: #### このループと
    v_xors = []
    for v_xor in dp[v]: ###### このループが重なるのが嫌な予感
      v_xors.append(v_xor)
    for v_xor in v_xors:
      new_xor = v_xor ^ w
      if new_xor not in dp[v2]:
        dp[v2].add(new_xor)
        que.append(v2)

if len(dp[N]) == 0:
  print(-1)
else:
  print(min(dp[N]))
```

余談ですが E 問題も解けませんでした。解説を見たら簡単だったのでこれすら思いつけないのかと落ち込みました。DPが弱い自覚はあるので特に鍛えないといけないかもしれません。結局3完に終わり、直近3回のABCでレートを70も落とす大惨事となりました……。


## コンテスト後
まず大人しく公式解説を読みました。頂点倍化。初めて聞く単語で、完全に目から鱗でした。ただ頂点を増やすアイデア自体は知っていたはずで、実際に ABC395-E はこれを用いてコンテスト中に正解しています。表の世界と裏の世界を用意して両者を行き来するというやつですね。

https://atcoder.jp/contests/abc395/tasks/abc395_e

ただ、2倍どころか 1024 倍にできるなんて想像もしておらず完全に虚を突かれました。

## 実装
最初にグラフを作る際に頂点番号と XOR の値をそれぞれ持たせるようにします。辺を張る際、相方になる頂点は頂点番号と XOR の値の組（tuple）で表現します。後で BFS をする際にもこの組を deque に入れておくようにします。あとは基本的な BFS ですね。

```python
from collections import deque
N, M = map(int, input().split())
G = [[[] for _ in range(2**10)] for _ in range(N+1)]
for i in range(M):
  a, b, w = map(int, input().split())
  for bit in range(2**10):
    G[a][bit].append((b, bit ^ w))

seen = [[False for _ in range(2**10)] for _ in range(N+1)]
seen[1][0] = True
que = deque([(1, 0)])
while(que):
  (v, bit) = que.popleft()
  for (v2, bit2) in G[v][bit]:
    if seen[v2][bit2]:
      continue
    seen[v2][bit2] = True
    que.append((v2, bit2))
ans = -1
for bit in range(2**10):
  if seen[N][bit]:
    ans = bit
    break
print(ans)
```

## まとめ
最大 1024 にしかならないことに着目するところまでは良かったようです。あり得る XOR の値を全て持っておくのもあながち間違ってはいなかったと思います。ただそれを表現する方法がまずかったんですね。頂点数を増やすことでとり得る値を全て把握する必要がありました。

ある頂点からの最短距離を求める問題みたいに頂点ごとに 1 種類の値を持たせればいい場合なら基本的な BFS でいいですが、この問題みたいに頂点ごとに複数の値を持たせる必要がある場合は頂点そのものを増やすことで対応できるということで自分の中では納得しました。今後この考え方を柔軟に使えるようにしたいものです。

また、これはDPにも似ている気がしました。あれも

DP[i][j] := i 個目までの荷物から何個か選んで合計の価値を j にできるかどうか（$ i \leq 100 , j \leq 1000 $）

みたいにしますよね。取り得る値の範囲が小さいことを利用して全ての値を網羅できる配列を用意してしまうという豪快な手法です。そもそも BFS 自体が DP に似ている気もします。そんなことを考えていたら少し理解が深まった気がしました。
【HTML】Data URI スキームの書式

``` html:Data URI スキームの書式
data:[メディアタイプ][;base64],データ
```

　Data URI スキームには、**data:を接頭辞（プレフィックス）としてつけます**。続いて、外部リソースのメディアタイプを指定します。外部リソースが単純な文字列の場合、メディアタイプを省略して、直接文字列をデータとして付加できます。
　外部リソースが画像の場合は、メディアタイプの後にbase64キーワードとBase64化したデータを記述します。

``` html:Data URI スキームの記述例
data:image/png;base64,iVBORw0KGgoAA・・・
```
ブロックとはなんなのか

## ブロックとは？（抜粋）
“ブロックはメソッドの引数として渡すことができる**処理のかたまり**です。ブロック内で記述した処理は必要に応じてメソッドから呼び出されます。”

“Rubyでは「要件を問わず共通する処理」はメソッド自身に、**「要件によって異なる処理」はブロック**にそれぞれ分担させて、1つの処理を完了させるメソッドが数多く用意されています。”

### 処理のかたまりとは何か
　例えば配列がから要素を受け取って、それを総計にして返すといったような複雑な処理
```ruby
 numbers = [1,2,3,4,5]
 sum = 0  
 numbers.each do |n|
   sum += n 
 end
 puts sum # 15が出力
 ```
 doからendまでが処理の塊
また以下のようにも書ける
 ```ruby
 numbers = [1,2,3,4,5]
 sum = 0  
 numbers.each{|n|
   sum += n 
 }
 puts sum # 15が出力
 ```

### 要件を問わない処理、要件によって異なる処理ということはどういうことか
上の例で言えば、配列をすべ取り出す同じ処理がeachメソッドで行われる。これはハッシュでも同じだが、どんなものが来ても要素を一つずつ最後まで渡すという処理は変わらない。
逆にブロックの要素は例えば奇数だけ合計するといった処理にも変更できる。
```ruby
numbers = [1, 2, 3, 4, 5]
sum = 0  
numbers.each do |n|
  if n.odd?  # 奇数の場合のみ
    sum += n
  end
end

puts sum
# 9が出力

```


## 参考文献
https://style.potepan.com/articles/29063.html
## 抜粋
Software Design plusシリーズ プロを目指す人のためのRuby入門［改訂２版］ 言語仕様からテスト駆動開発・デバッグ技法まで
伊藤　淳一
Claude CodeをAltaryの開発に実戦投入してみた｜現場目線で感じたメリットと課題

## この記事の内容

Altaryの一部機能を実際にClaude Codeで開発し、  
「現場で本当に使えるのか？」という視点で、その使用感や課題をまとめました。


## Claude Codeとは

[Claude Code](https://docs.anthropic.com/en/docs/claude-code/overview) は、Anthropic社が提供するAI開発支援ツールです。  
ソースコードの解析・修正・生成を、対話ベースで行えるインタラクティブなエディタとなっています。

単なるチャット型のAIではなく、**リポジトリ全体を読み込み、特定ファイルを直接編集・保存できる**のが特徴です。

特に、以下のようなシーンで威力を発揮します：

- コード全体の文脈を踏まえて、該当箇所の修正提案を受けたいとき  
- ファイルを開いて「ここ直して」と自然言語で指示したいとき  
- 実装意図や構造を質問しながら、**会話感覚で開発・保守したいとき**

コードを貼り付ける手間がなくなることで、**開発者支援AIとしての実用性が大幅に向上**します。


## 利用イメージ

以下のように、CLIから自然言語で修正を依頼すると、Claude Codeがコードの編集案を提示し、「反映してよいか？」を尋ねてきます。

![スクリーンショット 2025-06-15 17.24.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4026790/71414fcd-69bd-4fc9-90a0-78a7f9669a61.png)

---

## Claude Code導入前の開発フロー

導入前は、主にChatGPTとの対話を通じて以下のような手順で開発を進めていました。

1. **要件の整理**  
   実装すべき機能や仕様を明確にする。

2. **ChatGPTに要件を提示し、コード提案を受け取る**  
   回答されたコードを元に実装。

3. **動作確認**  
   正しく動作するか検証し、必要があれば修正。

※問題が発生した場合は、原因を整理し、再び①からやり直していました。

なお、**スクラッチでの開発は極力避け**、  
**細部のチューニング**や、**ChatGPTの提案が繰り返し誤っていたケース**に限定して手動対応を行っていました。


## 今回試したこと

Altaryの一部機能を、Claude Codeを使って実際に開発してみました。  
その結果として、

- 作業時間は短縮できたのか？  
- 料金はどれくらいかかったのか？  
- 操作感はどうだったのか？  

といった点から所感を整理します。


## 実際に使ってみての感想

Claude Codeを使って感じた**メリット**と**デメリット**を、以下にまとめます。

### ⭕️ メリット

- **自然言語の指示で修正が進む**  
  「かっこよくして」といった曖昧な表現でも意図を汲み取り、的確な修正を提案してくれました。

- **Gitログが綺麗に整理される**  
  変更内容が意味のある単位で履歴に残り、後から見返しても分かりやすい構成になっていました。

- **導入や操作が簡単**  
  ファイルを開いて「ここをこう直したい」と言うだけで操作できるため、**初心者でも使いやすい印象**です。



### 🔺デメリット

- **料金がやや高め**  
  コード全体の文脈把握にトークンを使うため、**1時間未満の利用で約5ドル程度を消費**。  
  継続利用にはコスト意識が必要です。

- **コード全体との整合性に弱さがある**  
  単一ファイルに対する提案は的確ですが、**他ファイルとの連携や副作用の考慮は甘め**。結局、手動で調整する場面がありました。

- **作業時間は意外と短縮されなかった**  
  Claudeへの指示調整や、提案後の最終調整に時間がかかり、**通常の開発フローと比べても劇的な効率化は感じませんでした**。


## 総評

Claude Codeは、「手を動かさずに思考で開発する体験」を提供してくれる、非常に面白いツールです。  
実際に作っていて「楽しい」と感じる瞬間も多くありました。

ただし現時点では、

- トータルの作業時間  
- コスト  
- 他ファイルとの整合性

といった点において、少々課題が残るのではないかという印象をうけました



## 今後の期待

使っていて感じたのは、**「未来感」と「ワクワク感」**。  
従来の開発体験とは一線を画す体験で、今後の開発への本格導入も前向きに検討したいと感じました。

また、**Gitのコミット単位を細かく切り分けて整理しながら更新できる点**も非常に魅力的でした。  
修正履歴が明快に残るため、コード管理の観点でも実用性が高いと感じています。
【HTML】Data URI スキーム

　**Data URI スキーム**とは、HTMLドキュメントやCSSに外部リソースを埋め込むための方法です。Data URI スキームを用いることで、外部リソースの数が減り、ブラウザ/Webサーバ間の通信回数を減らすことができます。一方、画像ファイルを埋め込む場合には、**Base64**化する必要があるため、サイズが大きくなります。なお、Base64化とハッシュ値化は異なります。
　また、リソースが外部ファイルではなくHTMLドキュメントに埋め込まれるため、ファイルごとのキャッシュもされません。そのため、パフォーマンスの向上につながるかはケースバイケースです。
　なお、Data URI スキームは、**Data URL スキーム**と呼ばれることが多くなっています。
【React×TypeScript】React初心者が3ヶ月で「名刺作成アプリ」を実装しました

## はじめに
こんにちは。Reactの学習を始めて3ヶ月強のものです。これまで学習の一環としていくつかミニアプリを作成してきました。

https://qiita.com/nagi-0106/items/c958aa9bee4cc29f6268

https://qiita.com/nagi-0106/items/c3675afffd867e5934f9

今回はReact Routerを用いたルーティング等が含まれた**名刺作成アプリ**を作成しました。

作成した名刺アプリの挙動は以下のようになります。

![sample1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4021196/977e47ff-e4f4-4bd5-85c0-3f636858b8c9.gif)

## 使用技術
今回のアプリ制作では以下の技術を新たに取り入れました。
* **React Router**を用いたルーティング、パラメータを基準にルーティングする機能
* **Supabase**のデータベース上で複数テーブルにまたがったデータのやり取り
* **dangerouslySetInnerHTML**を用いてReact上でHTMLを表示させる方法
* **サニタイズ**を用いたXSS対策
* GitHub Actions上での**クーロン**機能の実装

その他具体的に使用したライブラリ等は以下になります。
* 【フォーム】React Hook Form
* 【テスト】Jest, React Teesting Library
* 【データベース】Supabase
* 【言語】TypeScript, JavaScript
* 【CI/CD】 GitHub Actions
* 【UIコンポーネント】 Chakra UI

## 大変だったこと
今回のアプリでは大きく分けて2つの部分で苦労しました。

### ①DB上の複数テーブルとの紐付け
初期画面のような**入力された値とDB上の値が一致しているかの照合**や、**テーブル上の特定の値を参照して別のテーブルの値を取得する**といった実装があり、その部分に苦労しました。

ロジック自体は照合用の関数+別の取得用の関数で実行できるものであり既存の知識の範疇だったものの、その発想に辿り着くまでに時間と労力を要しました。

### ②テスト作成とデータの型の照合
Jestを用いたテストの経験そのものは前回のアプリ作成を通して行っていたのですが、今回はSupabaseとの連携上、「実際にテーブルに登録されているデータの型」を意識してテストを記述しなくてはいけない点が苦労しました。

一方で、前回と今回のアプリ作成で連続してテストコード作成に苦労した分、どうすればエラーになるのか・どうすればスムーズにテストを書けるのかのノウハウは蓄積できた気がします。
詳しくは次の部分で記載しようと思います。

## 気づいたこと
### ①一度使った知識を一定期間空けてもう一度学習することでより頭に入りやすくなった
今回も含めて複数回アプリ制作を行ってきた中で実感したことがあります。

それは、**一度詰まったものをもう一度別の場面で使うことで理解度が深まる**というものでした。
実際にテストコードの書き方、フォームのバリデーション等は以前のアプリでも実装しましたが時間を空けてもう一度実装することでノウハウの理解度が以前よりも格段に上がりました。

上記の方法は**分散学習**と呼ばれ、科学的に効果が実証されている勉強法です。

※参考文献

https://www.kadokawa.co.jp/product/322310000993/

今後も何かを習得したり技術を使いこなしたいときは、一度の勉強だけでなく定期的に時間を空けて復習する習慣を転用させたいと思いました。


### ②一見難しそうなロジックも「既存の知識の組み合わせ」「ロジックの分解」で解決できることが多い
今回実装したSupabaseのデータ紐付け部分がまさにそうでした。

一見複雑に感じられたり糸口が掴めなさそうなロジックであっても、細かく分解してみると今まで学んだ技術の組み合わせで構成されている部分が多く存在していました。

実際に複数テーブルの紐付けという難しそうな実装も「今までやってきたSupabaseの登録や照合を組み合わせたもの」と気づいてから実装の方法が掴めるようになりました。

今回を通して「ロジックが想像できない実装が出てきた際には一度問題を整理・細分化して既存概念に落とし込む」ことを今後も意識していきたいと思います。

## 最後に
アプリ制作を重ねるにつれ、最初は全くわからなかった実装やライブラリを少しずつ使いこなせるようになり成長を実感しています。
この調子で更に様々な実装を積み重ねていきたいです。

## JISOUのメンバー募集中！
プログラミングコーチングJISOUでは、新たなメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？
興味のある方は、ぜひホームページをのぞいてみてください！
▼▼▼

https://projisou.jp/
New Relic Network Performance MonitorでのICMP監視設定ガイド

# New Relic Network Performance MonitorでのICMP監視設定（snmp-base.yaml）ガイド

## 概要：New Relic Network Performance Monitorとは

New Relic Network Performance Monitor（NPM）は、アプリケーションやインフラストラクチャだけでなく、ネットワークレイヤのパフォーマンスも可視化し、システム全体の健全性や問題箇所の特定を支援するSaaS型の監視サービスです。SNMPやICMP、ネットワークフロー、Syslogなど多様なデータを一元的に収集・分析でき、ネットワークがシステムのボトルネックとなっているかどうかを迅速に判断できます。

## SNMP監視とICMP監視

New RelicではSNMP監視とICMP監視が同じ機能のサブセットとして動作します。この記事ではSNMP監視ではなくICMP監視にフォーカスした内容を記載していますが、そもそものSNMP監視とICMP監視についての違いについてをまとめてみました。

### SNMP監視
- SNMP（Simple Network Management Protocol）は、ネットワーク機器の詳細なパフォーマンス情報（インターフェースごとのトラフィック量、CPU/メモリ使用率など）を取得できます。
- SNMPv1/v2cはコミュニティストリングによる認証、SNMPv3はよりセキュアな認証・暗号化に対応しています。
- SNMP監視には機器側でSNMPエージェントの有効化と適切なMIBプロファイルの設定が必要です。

### ICMP監視
- ICMP（Internet Control Message Protocol）は、主に「ping」によるラウンドトリップタイム（RTT）やパケットロスなど、シンプルな到達性・応答速度の監視に使います。
- SNMPのような詳細なメトリクスは取得できませんが、ICMPのみで監視したい場合やSNMPが無効な機器にも利用できます。
- ICMP監視は`snmp-base.yaml`で`ping_only: true`を指定することで有効化できます。

#### 注意点
- `ping_only: true`の場合、SNMPによる監視は行われず、ICMPによるRTT・パケットロスのみが収集されます。
- SNMPとICMPの両方を有効にしたい場合は、`response_time: true`を利用します（この場合はSNMP監視＋ICMP応答時間も取得）。

## ICMP監視用snmp-base.yamlの設定

### 必要なパラメータと意味（表）

| パラメータ名         | 必須 | 意味・用途                                                         |
|----------------------|------|---------------------------------------------------------------------|
| device_name          | ○    | デバイスの識別名                                                    |
| device_ip            | ○    | 監視対象デバイスのIPアドレス                                        |
| provider             | ○    | New Relic上のエンティティ種別（例: kentik-ping）                    |
| ping_only            | ○    | ICMP監視のみを有効化（trueでSNMP無効）                              |
| user_tags            | 任意 | 任意のタグ情報（例: チーム名や用途など）                            |

> ※SNMP関連（snmp_comm, oid, mib_profile等）はICMP監視のみの場合は不要。

### サンプル：ICMP監視専用snmp-base.yaml

```
devices:
  ping_only_192.168.0.1:
    device_name: sample_device
    device_ip: 192.168.0.1
    provider: kentik-ping
    ping_only: true
    user_tags:
      owning_team: net_ops
      environment: production

global:
  poll_time_sec: 60
  response_time: true
  mibs_enabled: 
  timeout_ms: 3000
  retries: 0
```
この設定例では、`192.0.2.100`に対しICMP pingを実施し、RTTやパケットロスを監視します。

## Dockerコンテナの起動方法

ICMP監視を行う場合も、Kentik社の`ktranslate`コンテナを利用します。`snmp-base.yaml`をマウントし、必要な環境変数を指定して起動します。

```
docker run -d --name ktranslate-ping \
  --restart unless-stopped \
  --pull=always \
  -v `pwd`/snmp-base.yaml:/snmp-base.yaml \
  -e NEW_RELIC_API_KEY=＜NewRelicのLICENSE_KEY＞ \
  kentik/ktranslate:v2 \
  -snmp /snmp-base.yaml \
  -nr_account_id=＜NewRelicアカウントID＞ \
  -metrics=jchf \
  -tee_logs=true \
  -service_name=ktranslate-ping \
  nr1.snmp
```
> SNMP関連の環境変数やオプションはICMP監視のみの場合は不要です。

## まとめ

- New Relic NPMはネットワークの可視化・監視を強力にサポートし、ICMP監視を使えばSNMP非対応機器や到達性だけを監視したいケースにも柔軟に対応できます。
- `snmp-base.yaml`で`ping_only: true`を設定し、必要なパラメータのみ記載すればシンプルにICMP監視が実現できます。
- Dockerコンテナによる導入も容易で、既存の監視基盤に追加しやすいのも大きなメリットです。

## おまけ
ICMP監視設定用のsnmp-base.yamlファイルを簡単に作成するためのツールを作成してみました。よかったら使ってみてください。

https://m-shiono.github.io/ktranslate/icmp/index.html

※当ツールは個人開発の位置づけで作成したものになるため、動作保証は一切行いません。