OmniAICreator/Qiita-1.07M huggingface dataset:
Nim言語でうるう年を判定する

Nimの標準モジュールである、`std/times`にうるう年であるか判定する関数(`isLeapYear`)が存在する。

https://nim-lang.org/docs/times.html#isLeapYear%2Cint


## 例(ABC365-A)
https://atcoder.jp/contests/abc365/tasks/abc365_a
### 問題概要
1583以上2023以下の整数Yが与えられるので、西暦Y年の日数を求めてください。
### 解答コード
```nim
import times,strutils

let Y = stdin.readLine().parseInt()

if isLeapYear(Y):
  echo 366
else:
  echo 365
```
IPA データベーススペシャリスト 過去問R3 午後Ⅱ 問２ 脳が・・・

IPA主催のデータベーススペシャリスト試験を受けるためその勉強中。

普段の仕様理解などの甘さがあからさまとなってしまった。

とりあえず、問題文の分量が多く解きながら頭がパンクしそうになった。
結果は正答率56%・・・

愚痴
　・問題多い
　・時間がない
　・少しすく雑さが増すと焦ってしまう。

絶対無理ではないが、
午後２は解くだけで２時間、答え合わせ＋間違え分析で3時間かかるので
かなりの労力がかかってしまう。

しかも、DB設計の経験はなく、開発の中でテーブル構造を解析した程度。
ERPなど題材となりやすい実務は全く経験したことがない

辛し！
Eメールアドレス (paizaランク D 相当) Java解答例

# 問題文
https://paiza.jp/works/mondai/d_rank_skillcheck_archive/email_address

# 解答例
```java
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		try (Scanner scanner = new Scanner(System.in)) {
			String s = scanner.next();
			String t = scanner.next();
			System.out.println(s + "@" + t);
		}
	}
}
```

# 補足
この問題ではローカル部とドメインを@で連結してEメールアドレスとしているが、実際にはなんか細かい仕様があるので実務だとちゃんとその仕様に沿っているか入力チェックしたりする必要がある。
昔居た現場だと単にフォーマットが仕様に沿っているかだけでなく実在しているかどうかまでチェックしていたので、どの程度チェックするのかは都度要件と相談。
PL-200 学習メモ (6) : キャンバス アプリ（パフォーマンス、アクセシビリティ、公開、バージョン）

# はじめに
この投稿は PL-200: Microsoft Power Platform 業務コンサルタントの学習をした内容のメモです。

投稿の一覧は以下のリンク先にあります。

https://qiita.com/atsmin77/items/f25bd707921c421cee03

# 前の投稿

https://qiita.com/atsmin77/items/1bb456f221ab8223913c

## パフォーマンス

アプリのパフォーマンスを低下させないための一般的な考慮事項

* ページの読み込みの最適化
　App.OnStart に式を書くと起動が遅くなるため、代わりに App.Fomulas を使用します。

* クエリをクライアントではなくサーバー側で処理させる
　Dataverse や Excel の関数といったサーバ側に処理を委任できる関数を使用します。
　クエリに文字列結合などの関数が含まれると処理を委任できません。委任できないクエリの結果は既定で 500 行（最大 2000 行）までしか取得できません。

* 不要なメディアを削除する
　不要な画像、音声、動画などのメディアを削除し、通信量を減らします。

https://learn.microsoft.com/ja-jp/power-apps/maker/canvas-apps/create-performant-apps-overview

https://learn.microsoft.com/ja-jp/power-apps/maker/canvas-apps/delegation-overview

## アクセシビリティ

* スクリーンリーダー
  以下のプロパティを設定することで、スクリーンリーダーで画面を読み上げる際の名称を制御します

| 名前 | コントロール| 説明 |
|:-:|:-:|:-:|
| AccessibleLabel  | 画像、アイコン など | スクリーンリーダーで読み上げる際の内容を設定します  |
| Live  | テキストラベル  | 内容が変更された際のスクリーンリーダーの動作を設定します  |
| Role  | テキストラベル  | 内容がヘッダなのか、通常のテキストなのかをスクリーンリーダーに知らせます  |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/4e7ab3d8-65c9-8bb7-ffa9-3fc4d63cb0b8.png)

* タブインデックス プロパティ
  タブキーが押された際に遷移する順番を制御します

::: note info
アプリの編集画面右上の [アプリのチェック] からはパフォーマンスやアクセシビリティについてのエラーや警告を確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/0313fabd-8363-8f74-8652-5d114081bd34.png)
:::
  
https://learn.microsoft.com/ja-jp/power-apps/maker/canvas-apps/accessible-apps

https://learn.microsoft.com/ja-jp/power-apps/maker/canvas-apps/controls/properties-accessibility

## アプリの公開

アプリを公開すると、編集権限を持っていないほかのユーザーもアプリを利用できるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/1c4ad798-2c8e-e388-b8f7-0aa86d4d8f4d.png)

アプリは保存する度に、新たなバージョン番号が採番されます。以前のバージョンに戻すこともできます。現在公開中のアプリのバージョンは [ライブ] と表示されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/a6fdcea0-8d4f-142b-529f-408e2b61e927.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/bfa96252-05b8-a215-200f-3713313ba586.png)

https://learn.microsoft.com/ja-jp/power-apps/maker/canvas-apps/save-publish-app

# 次の投稿

https://qiita.com/atsmin77/items/d9f78c7c7a2f31ac716d
PL-200 学習メモ

# この投稿について
この投稿は PL-200: Microsoft Power Platform 業務コンサルタント の取得のため、以下の Udemy の動画で学習した内容のメモです。
これから PL-200 の学習を始める方の参考になれば幸いです。

https://www.udemy.com/course/pl-100-microsoft-power-platform-app-maker-ms

https://www.udemy.com/course/pl-200-microsoft-power-platform-functional-consultant-course

※ あくまで自身の復習用の内容のため、記載が不十分なところもあります、ご了承ください。また、動画の内容をすべて網羅できている訳ではありません。

|番号|記事名とリンク|公開日|
|:-:|:-:|:-:|
| 1 | [ライセンス、環境、Dataverse](https://qiita.com/atsmin77/items/641445ee60d7271f23c3) | 2024/5/17  |
| 2 | [キャンバス アプリ（一覧画面、詳細画面）](https://qiita.com/atsmin77/items/a8821f48a53cdacd7a5d)  | 2024/5/29  |
| 3 | [キャンバス アプリ（編集画面、新規作成画面）](https://qiita.com/atsmin77/items/aca397c0f2c6aa615422)  | 2024/6/6  |
| 4 | [キャンバス アプリ（リレーション、メディア、変数、検索）](https://qiita.com/atsmin77/items/3e43f73c871cd2c56c50)  | 2024/6/27  |
| 5 | [キャンバス アプリ（コンポーネント、コンテナー、コレクション）](https://qiita.com/atsmin77/items/1bb456f221ab8223913c)  | 2024/08/05  |
| 6 | [キャンバス アプリ（パフォーマンス、アクセシビリティ、公開、バージョン）](https://qiita.com/atsmin77/items/1bbf110aafbd3dec7876)  | 2024/08/05 |
| 7 | [モデル駆動型アプリ（ページ、エリア、フォーム、キャンバスアプリの埋め込み）](https://qiita.com/atsmin77/items/d9f78c7c7a2f31ac716d) | 2024/08/19 |
| 8 | [モデル駆動型アプリ（ビュー、グラフ、ビジネスルール、コマンド）](https://qiita.com/atsmin77/items/758c7f80d883acb625fb) | 2024/08/19 |
| 9 | [Power Automate（ライセンス、条件分岐・繰り返し・変数）](https://qiita.com/atsmin77/items/36cae322b7b002230734) | 2024/08/19 |
| 10 | [Power Automate（承認フロー、フローの共有、キャンバスアプリとの連携、ビジネスプロセスフロー）](https://qiita.com/atsmin77/items/b0afa21e7451cbf69ccb) | 2024/08/19 |
| 11 | [ソリューション、セキュリティロール](https://qiita.com/atsmin77/items/29ffb856a855259e81b3)  | 2024/08/30 |
| 12 | [Power BI (ライセンス、レポート、ダッシュボード)](https://qiita.com/atsmin77/items/fc6f311edecc2adc68fe) | 2024/08/30 |
| 13 | [AI Builder](https://qiita.com/atsmin77/items/cc1c9270b1031eb09fd4) | 2024/08/30 |
| 14 | [Power Pages (テンプレート、ページ、コンポーネント)](https://qiita.com/atsmin77/items/7c43b446c15fdc741ccd) | 2024/08/30 |
| 15 | [Power Pages (サインイン、アクセス制御、管理センター)](https://qiita.com/atsmin77/items/2d3c9d83e5a147807f0b) | 2024/08/30 |

# あとがき
先日無事に PL-200 の試験に合格することができました。点数は 800 点 (700 点以上で合格) でした。試験の範囲が広く、実務経験もほとんどなかったので最初は難しく感じましたが、公開されている練習問題や Udemy で販売されている以下の問題集も繰り返し解くことでより理解が深まりました。

問題集を解く際には 1 問ずつ回答を確認して分からないところは都度調べながら勉強しました。
※ Udemy の問題集は問題数が多い上に全部回答を終えないと答えが見れないので、何も回答せずテストを終了して問題と正解を確認しながら勉強しました^^;

PL-200 は Power Platform について、アクセス制御やパッケージングなど、より実務で求められる知識を体系的に学ぶことができ、勉強して良かったと思います。拙い投稿ですが参考になりましたら幸いです。

https://learn.microsoft.com/ja-jp/credentials/certifications/exams/pl-200/

https://www.udemy.com/course/practice-exams-ms-pl-200-power-platform-functional-consult
AI Artifacts: オープンソースでAIコード生成・実行環境を実現

## はじめに
X(旧Twitter）を眺めていると、チャエンさんのある投稿が目に飛び込んできました。私は単なる読者です。もしも、このタイトルに興味有る方は、以下の投稿をチェックしてみてください。また、この投稿も読んでみてください。

https://x.com/masahirochaen/status/1819858835173224862

## AI Artifactsとは
AI Artifactsは、AIによるコード生成と安全な実行環境を提供するオープンソースプロジェクトです。このプロジェクトは、Anthropic社のClaude AIチャットアプリに搭載されているアーティファクト機能を参考に、同様の機能をオープンソースで実現することを目指しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/0d940958-2ed5-e466-0b25-94b8499d91a3.png)

デモサイトでstreamlitで「カレーの作り方」のWebサイトを実装してもらっている様子。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/aabde878-b0fa-4c9a-2502-1f988d0fa9e7.png)
生成されたコード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/a78e23b7-7481-d047-c41c-b66de0a484bc.png)
プレビューでstreamlitのアプリを実行している様子

## プロジェクトの概要

AI Artifactsの主な目的は、AIが生成したコードを安全に実行できる環境を、より多くの開発者に提供することです。このプロジェクトは、最新のAI技術と安全なコード実行環境を組み合わせることで、開発者がAIとより効率的に協力して作業を行えるようサポートします。

## 主な特徴

1. **Claude AI Sonnet 3.5モデルの活用**
   - 最新のAIモデルを使用してコード生成を行います。
   - 高度な自然言語処理能力により、複雑な要求にも対応可能です。

2. **E2Bによる安全なコード実行環境**
   - E2BのCode Interpreter SDKとCore SDKを使用し、サンドボックス環境でコードを実行します。
   - ライブラリのインストールやシェルコマンドの実行も可能です。

3. **多言語・多フレームワーク対応**
   - Python、JavaScriptをサポートしています。
   - Jupyter notebook、Next.js、Streamlitなどの環境にも対応しています。

4. **Vercel AI SDKの統合**
   - ツール呼び出しとモデルからのストリーミングレスポンスを実現しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/4bb94c4f-1c3a-b3eb-69ce-478a9c53a8b5.png)
一部まだToDoの項目もある　詳細は公式のGitHubのページを参照ください

## セットアップ方法

AI Artifactsを使用するには、以下の手順に従ってセットアップを行います：
（2024年8月4日時点）

1. 依存関係のインストール
   ```
   npm i
   ```

2. APIキーの設定
   `.env.local`ファイルを作成し、以下の内容を設定します：
   ```
   E2B_API_KEY="your-e2b-api-key"
   ANTHROPIC_API_KEY="your-anthropic-api-key"
   ```
   ※APIキーは[E2Bのサイト](https://e2b.dev/)と[Anthropicのサイト](https://www.anthropic.com/)で取得できます。

3. アプリケーションの起動
   ```
   npm run dev
   ```

## 使用例

AI Artifactsを使用することで、以下のようなタスクを効率的に行うことができます：

1. 自然言語による複雑なコードの生成
2. 生成されたコードの即時実行と結果の確認
3. 複数の言語やフレームワークを跨いだプロトタイピング
4. AIとの対話を通じたコードの最適化や改善

## まとめ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/ef97b8eb-9c73-08c7-ba62-86c684da0b34.png)

AI Artifactsは、AIによるコード生成と安全な実行環境を組み合わせた革新的なプロジェクトです。オープンソースで提供されることにより、多くの開発者がAI技術を活用した開発手法を試すことができます。AI Artifactsを通じて、開発者はAIとの新しい協力関係を築き、より効率的で創造的なソフトウェア開発プロセスを実現することが可能となります。

## 参考情報

https://github.com/e2b-dev/ai-artifacts

https://e2b.dev/

https://x.com/e2b_dev/status/1781401878057926979

https://x.com/e2b_dev/status/1819382443893526814
NAT(ナット)ゲートウェイ

# 0.はじめに
この記事はAWS SAA試験勉強のための、Amazon VPCに関する知識のまとめです。

# 1.NAT(ナット)ゲートウェイ
内部からインターネットを使いたいときはNATゲートウェイを使用します。

アプリケーションへのパブリックアクセスを制限しながら、最低限の管理と高可用性、高拡張性を備えたAWSサービスを構築しようとする時、NATゲートウェイは、<font color="red">**パブリックサブネット**</font>に構成します。そして、**プライベートサブネット**から**NATゲートウェイ**への**ルーティング**を設定します。

:::note info
NATとはNetwork Address Translationの略で、プライベートIPアドレスをパブリックIPアドレスに変換することを意味し、「プライベートサブネット→インターネット」の向きの通信だけを許可します。
:::

例えば、プライベートサブネットのデータベースがパッチの更新用に、インターネットに接続するためには、パブリックサブネットにNATゲートウェイを配置します。

- NATゲートウェイは、AWSの1年間の無料利用枠の対象外。作成した時点から、1時間単位で課金されます
- NATゲートウェイにはNATインスタンスと違って「停止」という操作はありません
- AWSによってAZ内で冗長化されています

#### NATとNAPT

NATには「IPアドレスだけを置換するもの」と「IPアドレスとポート番号の両方を置換するもの」の2種類があります。前者をNATと呼び、後者をNAPTと呼んで区別することもありますが、両方ともNATと呼ぶことが多いです。
IPAの試験ではNAPTという言葉がしばしば出て来ます。

# 2.NATインスタンス
NATインスタンスは、NATゲートウェイと同じくプライベートサブネットからインターネットへの通信を可能にするIPv4専用の機能です。NATゲートウェイはマネージドサービスなのに対し、NATインスタンスはEC2インスタンスから作成するため、ユーザーが障害対応などの運用管理を実施する必要があります。

NATインスタンスは、NATゲートウェイでは利用できないポート転送機能を設定できます。


# 3.NATゲートウェイとインターネットゲートウェイ

パブリックサブネットのリソースがインターネットと双方向に通信する必要がある場合は、インターネットゲートウェイを使用します。
プライベートサブネットのリソースがインターネットにアウトバウンド接続をする必要がある場合は、NATゲートウェイを使用します。
mainとdivについて考察

## はじめに
mainとdivについてどちらを使用しても同じ結果が得られることがつい最近になっての発見。
実際に自分でいろいろ試してみないと、このままずっと気づかずに終わっていたんだろうな。という事でmainとdivについて調べたことをまとめてみます。

## mainタグ
#### 意味と目的:
- mainタグは、HTML5で導入されたセマンティックな要素で、文書内の主要なコンテンツを囲むために使用されます。これはページ内で一番重要なコンテンツを含む部分であることを示します
- mainタグは、通常、ページ内で唯一のコンテンツ領域として使用され、ヘッダーやフッターなどのナビゲーション要素とは分離されているべきです

#### 使用例
ページの主要なコンテンツや主要なセクションを含む場合に mainタグを使用します。これにより、スクリーンリーダーや検索エンジンがページの重要な部分を識別しやすくなります
```java
<main class="pb-36 md:pb-48">
  <%= yield %>
</main>
```

## divタグ
#### 意味と目的:
- divタグは、特定の意味やセマンティックな役割を持たない汎用的なコンテナ要素です。スタイリングやレイアウトの目的で使用され、特定の意味は持ちません
- ページ内のどの部分にも使用でき、特定のセマンティックな意味付けが必要ない場合に使用します

#### 使用例:
スタイリングやレイアウトのための汎用的なコンテナとして使用します。特にセマンティックな意味が必要ない部分に使用します
```java
<div class="pb-36 md:pb-48">
  <%= yield %>
</div>
```

## 適切な選択
#### mainタグの利点:
- mainタグは、ページの主要なコンテンツ領域としての意味を持ち、アクセシビリティやSEOにおいて有利です
- ページ内で唯一のmainタグを使用することで、ページの構造が明確になり、スクリーンリーダーなどの支援技術がコンテンツをより効果的に理解できます

#### divタグの利点:
- divタグは、意味を持たないため、どんなコンテンツにも使用でき、スタイリングやレイアウトの柔軟性があります

## さいごに
ちょっとしたエラーから調べてみた事。基本的なことを知らずに使用していました。これからもエラーが出るたびに調べて知識をつけていきたいと思います。
とりあえず今回は、ページの主要なコンテンツを含む場合は`main`で。
AWS CloudTrail

# はじめに
この記事はAWS SAA試験勉強のための、AWS CloudTrailに関する知識のまとめです。

# AWS CloudTrailとは

AWSアカウント内のすべてのAPI呼び出しをS3バケットに記憶します。デフォルトは90日。

取得するログはユーザーアクティビティに関するものです。Day1に設定します。デフォルトで暗号化されています。

地味なアプリケーションですが、非常に重要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359600/ba0a5d1c-768e-7142-b592-fb94891cb505.png)






# 証跡情報の登録
証跡情報を登録することによって以下が可能になります。

- 保存する先のS3バケットの設定
- 90日以上の操作ログの保存
- ログを記録するイベントの種類の設定


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359600/b7c09a1e-4682-7fba-07f2-5dab0c52d887.png)

# CloudTrail Insights
CloudTrail Insights は、CloudTrail から管理イベントを自動的に分析して通常の動作のベースラインを確立して、異常な動作パターンを検出した際に Insights イベントを生成して通知することができます。有料。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359600/6970a99d-a419-5b48-6550-32e862c787c3.png)


# 整合性検証機能

CloudTrailログファイルの整合性検証機能を有効にすることで、監査人からのコンプライアンス証跡取得に役立ちます。


# KMSとの連携
KMSはAWS CloudTrailと連携しており、鍵の使用ログが記録されるため、鍵の利用状況を監査することができます。
【iOS】AdMobでバナー広告を表示する流れ（SwiftUI）

## 概要
個人開発アプリで初めてバナー広告を表示してみました。
その時の流れをメモとして残します。


（余談）このアプリに広告を入れた時のメモです。
https://apps.apple.com/jp/app/hit-blow-app/id6587553399
[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469133/18c5608e-b9de-3541-928b-7ab6a9c84019.png)](https://apps.apple.com/jp/app/hit-blow-app/id6587553399
)

## 本題
### AdMobアカウントの作成
https://support.google.com/admob/answer/7356219?hl=ja&visit_id=638582155447511477-2789080356&rd=1

お支払い情報なども入力。

### AdMobにアプリを登録
https://support.google.com/admob/answer/9989980?hl=ja&visit_id=638582155449250774-1771633242&rd=1

基本的にはAppStoreにリリース前の段階なので、AdMobでアプリを作成するまで。
アプリの確認や審査は後で実施する。

### 広告ユニットの作成
今回実施したのはバナー広告。
https://support.google.com/admob/answer/7311346?hl=ja

### iOSアプリにライブラリを追加
今回はSwift Package Managerで追加。
https://qiita.com/SNQ-2001/items/aabae7d494139dee0d01

Info.plistの設定周りは下記を参考にした。
リリースビルドとデバッグビルドで、使用する広告IDなどを分けたかったため。
https://kkfactory92.com/swiftui-google-ad-mob/

### 広告を表示するためのView
SwiftUIで表示するにあたって、下記を参考。
https://qiita.com/hyuga_amazia/items/f09eba473b55a1ed68e1

### app-ads.txtの作成
app-ads.txtをWeb上に表示しないと、AdMobが広告配信するための審査が通らないので、作成する必要がある。

Web周りは疎いので、iOS開発よりのFirebaseで対応。
https://zenn.dev/k9i/articles/8b91ee1e7dcc53

app-ads.txtの内容はAdMob上に記載されている。
リダイレクト先はプライバシーポリシーと同じページにした。

### 審査〜リリース
普通のアプリと同様に審査〜リリースを行う。

### AdMobアプリの確認、審査
AdMob上でアプリの確認と審査を行う。
アプリの確認はAppStoreの検索に引っ掛かれば問題なく終わる。

審査もapp-ads.txtがすぐに認識されれば、即座に審査が始まる。
app-ads.txtの対応が遅れたりすると、ここの反映に時間がかかり、なかなか審査が始まらない。
辛抱強くやるしかない。だいたい1日待てばいけるっぽい。

## これで
晴れてバナーが表示されると思います！
先人たちのいろんな情報に助けられています。感謝 :pray:
JavaScriptの『エラー解決に困ったとき』に見るサイト

エンジニアのみなさま、日々の学習本当にお疲れ様です！
また本記事まで足を運んでいただき本当に感謝です。
約2分程度で読めるので最後まで読んでもらえると幸いです。

# はじめに

エラーが発生したとき、みなさまはどのように対処していますか？
多くのエンジニアが最初に頼るのは、誰かが書いたブログ記事やフォーラムの投稿かもしれません。しかしながら、記事の情報が古かったり、記事自体の解釈が間違っていたりする可能性もあるため、解決までに時間がかかることも多々あります。

一方で、主観にはなりますが「できるエンジニア」と呼ばれる人は、 **公式ドキュメントやオープンソース** など、いわゆる **「一次情報」** と呼ばれる質の高いものに触れながら解決している人が多い印象です。

今回ご紹介するのは **Mozilla Developer Network（MDN）** になります。

MDNは、問題を解決するためのテーマが丁寧に書かれた **オープンソース** になります。
そのため、特に初学者のみなさまには心強いサイトになると考えます。

この記事では「JavaScript」を例にして、MDNをどのように活用してエラーを解決できるかを紹介します。この記事で、みなさまの一助になれば幸いです。

# 対象のページ

https://developer.mozilla.org/ja/

上記サイト上で「References」 > 「JavaScript」 > サイドバー「Errors」にあります。
例として「Erorr: Permission denied to access property "x" 」　を選択します。

![スクリーンショット 2024-08-04 14.39.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744730/b8fe7091-2fae-d0fb-fd6f-ca639b5a7225.png)

![スクリーンショット 2024-08-04 14.44.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744730/b1aa312e-a5f3-88c4-e5a8-4f9b29d1a64e.png)

選択すると、対象のエラーメッセージページが開きます。

![20240804.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744730/14c973e4-3771-de29-2acf-ad93a3f96473.gif)

このページの良いところはエラーの要約や原因が簡潔に書かれていることです。
加えて、関連情報に用語のリンクが貼られているため、不明な用語が出てきてもリンクに飛んですぐ調べることができます。
今回例として挙げたエラー以外にも主要なエラー内容がサイドバーにリスト化されているため、時間がある時に眺めてみるのも良さそうですね！

# おまけ

https://developer.mozilla.org/ja/docs/Learn/JavaScript/First_steps/What_went_wrong

MDNのサイト内には上記の様に検証ツールを使ってどうエラーに向き合うのかも掲載してくれています。

「数字当てゲーム」のリポジトリが存在しており、そのリポジトリを使って段階を踏んでトラブルシューティングの説明をしています。手を動かしながら理解を深めることができるため、個人的にはオススメです！リポジトリはこちら。

https://github.com/mdn/learning-area/blob/main/javascript/introduction-to-js-1/troubleshooting/number-game-errors.html

# さいごに

いかがだったでしょうか？
他の言語は調べきれていないですが、ここまで丁寧に書かれているサイトはなかなか無いと感じてます。ぜひ有効活用して、理解を深めていきましょう！


----------------------------------
唐突ですが弊社のご紹介もさせてください。

▼ コーポレートサイト

https://prum.jp/

▼ Wantedly求人

https://www.wantedly.com/projects/626662

弊社メンバーは学習した内容を日々Qiitaの記事にアウトプットしております。
弊社にご興味のある方、まずは求人を見てみてください！
ご応募お待ちしておりますー！

### 最後までご覧いただき、ありがとうございました！
Docker立ち上がらないポート5432エラー


# まえがき
Dockerが立ち上がらないポート5432エラーで私自身が苦しんだので今回の解決方法を見てあなたの役に立てたらいいなと思います。それでは行きましょう！

## 動作環境

macbook 13.4.1 (c)（22F770820d）

Rails 7.0.4.3

ruby 3.1.3p185

psql (PostgreSQL) 14.8 (Homebrew)

# もくじ
1.Docker5432ポートエラーとは？
2.原因とその対策
3.その他の対策

# 1.Docker5432ポートエラーとは？
Dockerを使ってPostgreSQLを起動しようとすると、以下のようなエラーが発生することがあります。

`Couldn't connect to Docker daemon at http+docker://localhost - is it running?`

`If it's at a non-standard location, specify the URL with the DOCKER_HOST environment variable.`

`dial tcp 127.0.0.1:5432: connect: connection refused` 

これは、ポート5432がすでに使用されているため、DockerがPostgreSQLを起動できないためです。

簡単に伝えると、港にあるコンテナが積まれた5432の船がすでに使用されているから空かないと使えないよと言われているということです。

# 2.原因とその対策

### 原因1：ローカルのPostgreSQLが起動している

 ローカルのPostgreSQLとDockerで使うデータベースは同時に起動できないような仕組みになっています。なので、Dockerを立ち上げるためのPostgreSQLを起動する前にローカルのPostgreSQLを停止させる必要があります。

まずは、ローカルのデータベースの起動状況を確認するコマンドを実行し、すべてnoneになっていれば停止しています。

```ruby
brew services list
```

もしnoneになっていなければsql停止コマンドを実行し停止させます。

```ruby
brew services stop　postgresql@<バージョン番号>
```

その後`docker compose up -d` でDockerを立ち上げてみます。

### 原因2：すでにポート5432が使用されている

すでにポート5432が使用されている場合、空ける必要があります。

まずは、ポート5432を使用しているプロセスを確認するコマンドを実行します。

```ruby
lsof -i :5432
```

出力されたらプロセスを切るコマンドを実行しすべてのプロセスを切ります。

```ruby
kill <プロセス番号>
```

もしプロセスが出力されなかった場合、sudoコマンドも試してみます。

```ruby
sudo lsof -i :5432
```

それで出力されたらsudoコマンドでプロセスを切ります。

```ruby
sudo kill <プロセス番号>
```

その後`docker compose up -d` でDockerを立ち上げてみます。

# 3.その他の対策
- Dockerを再起動する
- Dockerコンテナを再作成する
- MacBookを再起動
- PostgreSQLを再インストール

これらの方法でも解決しない場合は、Docker Desktopを再インストールすることも考慮してください。

Dockerを使ってPostgreSQLを起動する際には、このようなエラーが発生することがありますが、原因を正しく特定し、適切な対策を取ることで解決することができます。

# あとがき
いかがだったでしょうか。このガイドがDockerポート5432エラーの問題解決にお役に立てば幸いです。Dockerを起動する前に、常にそのポートを使用しているプロセスがないか確認し、停止することを忘れないでください。もしうまくいかなかったら、Dockerを再起動したり、Docker Desktopを再インストールしてみてください。正しいトラブルシューティングを行えば、すぐにDockerでPostgreSQLを起動できるようになるはずです。楽しいコーディングライフを！

# おまけ
唐突ですが弊社のご紹介もさせてください。

▼ コーポレートサイト
https://prum.jp/

▼ Wantedly求人
https://www.wantedly.com/projects/626662

弊社メンバーは学習した内容を日々Qiitaの記事にアウトプットしております。
弊社にご興味のある方、まずは求人を見てみてください！
ご応募お待ちしておりますー！
roslaunchとnodeの役割の関係性

　はじめに
=
Roboticsを扱うにあたってC++は避けて通れない道ですが、私自身まだまだ初学者であり、nodeもpythonに置き換えたいな……と密かに企んでいる中でふとscriptsとnodeの違いはなんだ？？と疑問に思いました。また、roslaunchを行うにあたって影響はないのか疑問に思ったので誰得？って感じですが（自分のために）まとめてみます。







Nodeファイルの役割
=
Nodeファイルの役割は、特定の用途が定められているわけではありませんが、Nodeを配置するために使用されます。これは特に決まった規則があるわけではありません。ですのでチームやプロジェクトの規則に従ってください。

NodeはROSシステムにおける基本的な実行単位であり、各Nodeは独立したプロセスとして動作し、他のNodeと通信を行います。NodeはC++or Pythonで実装されることが一般的です。Nodeの役割は、センサーからデータを取得したり、制御コマンドを発行したりするなど、特定の機能を実行することです。



scriptsファイルの役割と格納するファイルの種類
=

一般的には、pythonスクリプトなどのインタプリタ言語のスクリプトを配置する場所として使用されます。
このディレクトリに置かれたスクリプトは、実行可能なファイルとして使用され、CmakeLists.txtでインストールされます。


なぜscriptsファイルがpythonのようなインタプリタ言語ファイルの格納に適しているのか
=


scriptsディレクトリがPythonスクリプトを整理して配置する場所として適している理由はいくつかあります。以下にその主な理由を説明します。

### 1.コンパイルの必要がない

インタプリタ言語: Pythonはインタプリタ言語であり、コンパイルが不要です。これに対して、C++などの言語はコンパイルが必要であり、通常srcディレクトリに配置されます。Pythonスクリプトはそのまま実行可能であるため、scriptsディレクトリに配置するのが適しています。

### 2.プロジェクトの可読性と整理

ディレクトリ構造の明確化: scriptsディレクトリにPythonスクリプトを配置することで、どのファイルがPythonスクリプトであるかが明確になります。これにより、プロジェクトの構造が整理され、可読性が向上します。
分離と整理: コンパイルが必要なファイルと不要なファイルを分離することで、ビルドシステムの管理が容易になります。

### 3.標準的な慣習とベストプラクティス

コミュニティの標準: ROSコミュニティでは、Pythonスクリプトをscriptsディレクトリに配置することが一般的な慣習です。これに従うことで、他の開発者もディレクトリ構造を理解しやすくなります。
ドキュメントとサポート: 多くのROSドキュメントやチュートリアルでも、Pythonスクリプトはscriptsディレクトリに配置することが推奨されています。これに従うことで、ドキュメントとの整合性が保たれ、サポートを受けやすくなります。

### 4.インストールと実行の容易さ

catkin_install_python: CMakeLists.txtでcatkin_install_pythonを使用して、scriptsディレクトリ内のPythonスクリプトを簡単にインストールできます。これにより、スクリプトが適切な場所にインストールされ、rosrunやroslaunchで簡単に実行できます。




nodeファイルにpythonファイルを格納することは出来ますが、管理の一貫性が欠けてしまい、ビルドプロセスが複雑になってしまう恐れがあります。



## launchファイルの役割

launchファイルには主に5つの役割があります。


### 1. 複数のノードの起動

複数のノードを一度に起動するための設定を提供します。これにより、個別にノードを起動する手間を省くことができます。

### 2.パラメータの設定

ROSパラメータサーバーにパラメータを設定することができます。これにより、ノードが起動時に必要とするパラメータを一元管理できます。

### 3. ノードのリマッピング

トピックやサービスの名前をリマッピングする設定を行うことができます。これにより、ノード間の通信設定を柔軟に変更することができます。


### 4. ノードの設定

各ノードの名前、出力先、起動するパッケージや実行ファイルを指定することができます。ノードのログ出力先などの設定も行えます。

### 5. 機能の統合


単一のlaunchファイルで、複数の機能を持つノードや、複数のlaunchファイルを呼び出すことができ、複雑なシステムの起動を簡略化します。


まとめ
=


今回は、scripts,node,launchファイルのそれぞれの役割とその違いについて説明しました。一般的に、scriptsにはインタプリタ言語であるpython,nodeにはC++等のファイルを格納するのが管理をする上で良いとされているということでした。
【殿堂入りキャンペーン】N倍の文字列 (paizaランク D 相当) Java解答例

# 問題文
https://paiza.jp/works/mondai/d_rank_skillcheck_archive/square

# 解答例
```java
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		try (Scanner scanner = new Scanner(System.in)) {
			int n = scanner.nextInt();
			for (int i = 0; i < n; i++) {
				System.out.print("*");
			}
			System.out.println();
		}
	}
}
```

# 補足
特になし。
基本的に*をn個分出力すれば良いだけだが、最後は改行しないといけないようなので`System.out.print`と`System.out.println`を使っているくらい。
mikoto2000 の Rust 関連記事まとめ

自分が書いた記事をまとめておく。

Tauri 関連は [mikoto2000 の Tauri 関連記事まとめ #Rust - Qiita](https://qiita.com/mikoto2000/items/b0015fa20162970a0e60) にあるため除外。

# ブログ記事一覧

1. [ttyd の main 関数を Rust プログラムから呼び出す(Rust から C の関数を呼び出す) - mikoto2000 の日記](https://mikoto2000.blogspot.com/2024/03/ttyd-main-rust-rust-c.html)
2. [clap-rs で Rust のコマンドライン引数をパースする - mikoto2000 の日記](https://mikoto2000.blogspot.com/2024/07/clap-rs-rust.html)
3. [serde_yaml を使って Rust で YAML をパースする - mikoto2000 の日記](https://mikoto2000.blogspot.com/2024/07/serdeyaml-rust-yaml.html)
4. [byteorder クレートを使って Rust でバイナリファイルをパースする - mikoto2000 の日記](https://mikoto2000.blogspot.com/2024/07/byteorder-rust.html)
5. [serde_yaml を使って Rust で YAML をパースするやつを Internally tagged で作り直した - mikoto2000 の日記](https://mikoto2000.blogspot.com/2024/07/serdeyaml-rust-yaml-internally-tagged.html)
6. [notify クレートを使って Rust でファイル監視する - mikoto2000 の日記](https://mikoto2000.blogspot.com/2024/07/notify-rust.html)
7. [Rust のテンプレートエンジンを試す(Tera 編) - mikoto2000 の日記](https://mikoto2000.blogspot.com/2024/07/rust-tera.html)
8. [Rust のテンプレートエンジンを試す(Liquid 編) - mikoto2000 の日記](https://mikoto2000.blogspot.com/2024/07/rust-liquid.html)
9. [Rust で DB を使う(diesel + SQLite3) - mikoto2000 の日記](https://mikoto2000.blogspot.com/2024/08/rust-db-diesel-sqlite3.html)
Githubのリポジトリを削除する方法

Githubのリポジトリを削除しようと思ったら、削除のメニューを探すのに手間取ったのでメモとして残しておきます。

# リポジトリの削除手順

自分のGithubのページを開き、「Repositories」をクリックします。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292434/9c1269e9-4fe7-0c21-cae4-7fa773db6c44.png)

---

削除したいプロジェクトをクリックします。（ここでは「java」）
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292434/4c00248e-0b3a-bd78-6fa7-28f279635362.png)

---

「Settings」をクリックします。
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292434/862d5193-c078-0441-63b8-e161f58c393d.png)

---

一番下までスクロールして、「Danger Zone」の中の「Delete this repository」をクリックします。
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292434/9504a7f5-a2b5-37b2-e19a-f37bcefb94f3.png)

---

「I want to delete this repository」をクリックします。
![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292434/21027ab5-e6f8-a2f0-c07c-132e384f9d1f.png)

---

「I have read and understand these effects」をクリックします。
![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292434/e5f5d4e8-4ba9-8524-f6f7-dcafcfc14150.png)

---

削除するリポジトリの名称を入力し、「Delete this repository」をクリックします。

![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292434/1a6f0672-9025-8c11-863f-81ce9fea6182.png)

---

以上でGithubのリポジトリを削除できました。

---

以上
ABC365回答メモ

# 0.はじめに
　低調が続きますが、いつも苦戦するトヨタコンテストに参戦。
　予想通りA～Cしか解けず順調にレートが下がり
　706に・・・。600台まで見えてきました・・・。


# 1.A - Leap Year
　言語標準ライブラリで何とかなるようですが
　まぁ、条件すべて問題に書いてあるのでそれ通りの
　条件分岐で365か366を出力してACでした。

　https://atcoder.jp/contests/abc365/submissions/56247451


# 2.B - Second Best
　リストAを読み込み、A[i]とiをタプルにして
　リストLに追加していく。
　Lを降順ソートして先頭から2個目のi+1を表示して終了。

　https://atcoder.jp/contests/abc365/submissions/56253921


# 3.C - Transportation Expenses
　最初に思い付いた考え方の穴を埋めずに
　提出し続け3回くらいダメ出しを食らったため
　ペナルティが多くなってしまいました。
　【考え方】
　　・リストAを昇順に並べて、ansに0をセット
　　・1番目の人に満額交通費（A[i]）を払った場合に、その後の人には一律払う
　　　場合にの数をxとしansとxの大きい方をansにセット
　　・2番目以降もそれを繰り返し最後にansを出力して終了
　上記で進めましたがWA1個が減らずに悩んでいました。
　冷静に考えると、以下のケースの時に
　答えが0になってしまうことが分かりました。
　2 2
　2 2
　ansの初期化時に、M//Nをセットすることで
　正しく計算できることが分かりました。
　

　https://atcoder.jp/contests/abc365/submissions/56282736


以上
markedのコードを少しずつ読む

[marked](marked)
上記のコードを少しずつ読む。

理由としたら、
- オープンソースのコードを読む練習
- markdownからhtmlを生成する実装方法について知りたい

なので、markdownからhtmlを生成する部分を読み進めていく。
使用方法を見ると、
``` js
marked.parse("## test")
```
となっている。

## src内のコード
markdownからhtmlを生成する流れとしては、
おそらく
1. lexer
1. parser

の順番で処理をしていると思う。
### lexer
lexerは単語に分解している。
`## test`であれば、`##とtest`に分解をする。
tokenはlexerで分解する単語について定義している部分？

### parser
lexerで分解した単語をつなげて、文を作成している。

### marked.ts
多分これが、いちばん外側。
``` js
marked.parse = marked
```
の記載があった。
markedをたどると、`markedInstance.parse`をしている関数があった。
なので、markedInstance.ts内を見る。

### markedInstance.ts
``` js
parse = this.#parseMarkdown(_Lexer.lex, _Parser.parse);
```
の記載があった。

## 終わり
とりあえず、ここまで見ることができた。
これから、少しずつ読んでmarkdownからhtmlを生成する実装方法を理解したい。
そして、最終的には自分自身で実装できれば良いっすね。
【CSS】calcの使い方

## calc()とは？
- cssで数値計算を行うための関数
- 異なる単位の値を組み合わせたり、動的に計算された値をスタイル適切に活用することで、柔軟なレスポンシブなデザインを実現することが可能
- 加算、減算、乗算、除算式で指定できる

## 使い方
コンテナ幅が、親要素の幅から50ピクセル引いた値になる
```css:index.css
.container {
  width: calc(100% - 50px);
}
```


## 使用例
#### 下記ではカードをレスポンシブ対応の表示例です
```HTML:index.html
<div class="container">
    <div class="card">カード1</div>
    <div class="card">カード2</div>
    <div class="card">カード3</div>
    <div class="card">カード4</div>
    <div class="card">カード5</div>
    <div class="card">カード6</div>
</div>
```
```CSS:index.css
.container {
    display: flex;
    flex-wrap: wrap;
    gap: 20px;
    padding: 10px;
    box-sizing: border-box;
}
.card {
    background-color: #f0f0f0;
    padding: 20px;
    border: 1px solid #ddd;
    border-radius: 5px;
    /* 幅を画面幅の割合として計算 */
    width: calc(33.33% - 20px);
    box-sizing: border-box;
}
@media (max-width: 768px) {
    .card {
        width: calc(50% - 20px);
    }
}
@media (max-width: 480px) {
    .card {
        width: calc(100% - 20px);
    }
}
```

## 参考資料
https://coliss.com/articles/build-websites/operation/css/how-calc-works-by-ire.html
【DAY11】PHPについて

# PHPとは
PHPはプログラミング言語の一つで、動的なコンテンツの作成に向いています。
正式名称は「PHP:Hypertext Preprocessor」です。

## PHPの特徴
* コンパイルが不要
PHPはスクリプト言語であるため、コンパイル処理が必要なく、テキストベースで記述したプログラムをそのまま実行できます。
* データベースと連携させやすい
PHPは「MySQL」や「PostgreSQL」などといったデータベースシステムと簡単に連携することができます。
* 文法がわかりやすい
PHPは文法がシンプルでわかりやすいという特徴があります。例えば、変数を扱う際に型の定義宣言が必要ありません。
* フレームワークが豊富に用意されている
PHPにはフレームワークが豊富に用意されているため、搭載したい機能や開発規模に合わせてフレームワークを使い分けることができます。PHPのフレームワークには、Laravel、CakePHPなどがあります。
複雑な状況でない場合の誤ってGitHubにプッシュしてしまった場合の対処法

## 概要
- 時々やらかして、いろいろ調べることになるので簡単にまとめる


## 複雑でない状況とは

1. 誰も誤ってプッシュしてしまったブランチを利用していない

## 対処法
:::note warn
危険な操作もあるため、バックアップを取ってから実行することをお勧めします
:::

### 間違ってプッシュしたコミットを元のブランチから変更を戻す

```sh
git checkout original-branch-name
# 変更維持した状態で戻す
git reset --mixed HEAD^
```
`HEAD^`は直前のコミットを指すので、複数のコミットを戻す場合は、`HEAD~n`を使用するとよい（nは戻したいコミット数）。

### ローカルで新しいブランチを作成する
```sh
git checkout -b new-branch-name
```

### 新しいブランチに変更をコミットしてプッシュする

```sh
git checkout new-branch-name
git add .  # 全ての変更をステージングエリアに追加
git commit -m "新しいブランチでの変更内容の説明"
git push -u origin new-branch-name
```

### 元のブランチをローカルの状態で強制上書きする
:::note alert
git push --force の操作は危険が伴うため、十分に注意してください
:::

:::note info
より安全な方法を[より安全な方法で強制上書き](https://qiita.com/koinunopochi/items/a428c8ef7bccf8c7621d#%E3%82%88%E3%82%8A%E5%AE%89%E5%85%A8%E3%81%AA%E5%BC%B7%E5%88%B6%E4%B8%8A%E6%9B%B8%E3%81%8D)で書いておきます
:::

```sh
git checkout original-branch-name
git push --force origin original-branch-name
```

### より安全な強制上書き
@YuneKichiさんから教えていただきました！ありがとうございます！
>git push --forceよりはgit push --force-with-lease、さらにはgit push --force-with-lease --force-if-includesを使うと、より安全になります。

とのことで、オプションをつけることでより安全になるようです！

簡単にどのようなオプションであるかを調べてみると、

https://zenn.dev/mary_pp/articles/eaac544eaf600a

>--force-with-lease オプションを指定すると、ローカルの ref とリモートの ref を比較しローカルが最新か判定。最新なら push し、そうでなければが失敗してくれるので、誤って古いファイルで上書きといった悲惨な状態を回避できるようになる。
>
>--force-if-includes オプションは、reflog に remotes/origin/main (I) が含まれていることをチェックし、直前fetch状態なら拒否してくる仕組み。
>
>--force-with-lease オプションだけでは、直前にfetchしていると push が成功してしまうので、
--force-if-includes オプションを併用すると更に安全に行えるというのがポイント。

とのことでした。なので次のようになります

```sh
git checkout original-branch-name
git push --force-with-lease --force-if-includes origin original-branch-name
```

エイリアスの設定もしておくとよいとのことです

https://qiita.com/ototonari/items/fd67801a2812f33ace1a
【備忘録】KoyebにNestで作ったアプリケーションをデプロイする

# はじめに
`Koyeb`に`Nest`で作ったバックエンドサーバをデプロイする備忘録です。

# Koyeb側
・**ダッシュボード**でGitHubをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3348923/3ec50249-e800-f659-161e-4b494200a06f.png)

・**install github app**をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3348923/e23f062c-8088-096b-ab47-65967226448d.png)

・デプロイしたいリポジトリを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3348923/4ff58189-01ae-0a06-6e81-83e0b20efb17.png)

・**Next**をクリックします。
無料プランだと東京リージョンは選択できないようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3348923/09c6932f-b494-e1a2-476a-5e7bced986cd.png)

・`Port`に**Nest**で指定したポートと同じ番号を指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3348923/ce27f8c8-fb22-7309-08e0-6090a3e25333.png)

・Deploymentのログでヘルスチェックが通っていたら成功！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3348923/c1200388-952a-ac29-8666-e3f603a24464.png)

# さいごに
**Koyeb**はフリープランでも**DB**を一つ立てられるようです。
今回はDBに**Neon**を使ったので、次回は**Koyeb**で**DB・デプロイ**どちらも完結しようと思います。
【Java】SQLiteのJDBCドライバを用いる際のデータベース接続文字列に関する注意点

# 環境
- Windows11
- Tomcat9
- OpenJDK11
- SQLite3

# パスは"/(スラッシュ)"で区切る
Mac上のEclipseで開発した後、Windowsマシンにデプロイをした際に、「データベース接続文字列中のパスは、Windowsだから"¥"(実際のコード上ではバックスラッシュで表示される。)で区切るのだろう」とデータベース接続文字列中のスラッシュをバックスラッシュに書き直したところ、データベースに接続することができなかった。
データベース接続文字列は、Windowsにおいてもスラッシュで区切る。
```diff_java:コネクションオブジェクトの取得部分
- Connection conn = DriverManager.getConnection("jdbc:sqlite:C:\mydb\sample.db");
+ Connection conn = DriverManager.getConnection("jdbc:sqlite:C:/mydb/sample.db");
```
peerの情報が簡単に見れる！peer-toolsの紹介と導入方法

※この記事は ubuntu22.04で動作確認を取っています

**はいはいみなさん**
**symbolNode　建ててますか？**
ほとんどは dual(roles:3)(api,peer)nodeだと思います
でもね？　peerNodeでもしっかり nodeするんですよ？
でも　ちゃんと動作してるかの確認方法がわからなかったりします
せっかく建てても `node/info`とか`chain/info`が見れなくちゃ
つまんないですよね！

**そこで！今回は！こちらをご紹介致します！　じゃん！**

これは、
https://qiita.com/ccHarvestasya 氏が作成した
peerNodeの情報を簡単に見る事が出来る ﾂｰﾙである
`peer-tools`
これを導入する為の ｼｪﾙｽｸﾘﾌﾟﾄです
この peer-toolsの詳しい解説は下記で見れます

https://qiita.com/ccHarvestasya/items/68e32b15883167138fd4

https://github.com/ccHarvestasya/peer-tools

# 導入
ﾎｰﾑﾃﾞｨﾚｸﾄﾘで
`vi peert`
まぁ ﾌｧｲﾙ名はなんでもいいです
```
#!/bin/bash
cd
pip install symbol-sdk-python pyopenssl zenlog
git clone https://github.com/ccHarvestasya/peer-tools.git
git clone https://github.com/ccHarvestasya/symbol-node-configurator.git
cd peer-tools
openssl genpkey -algorithm ed25519 -outform PEM -out ca.key.pem
python3 ../symbol-node-configurator/certtool.py --working cert --name-ca "my cool CA" --name-node "my cool node name" --ca ca.key.pem
cat cert/node.crt.pem cert/ca.crt.pem > cert/node.full.crt.pem
python3 peer_tools.py nodeInfo 4t.dusanjp.com

sudo apt install python3-waitress
pip install flask waitress --user

sudo ufw allow 3000
```
上記 ｼｪﾙｽｸﾘﾌﾟﾄを保存します

# nodeへの変更
あらかじめ ｶｽﾀﾑﾌﾟﾘｾｯﾄの nodes:項目に
`trustedHosts: 172.20.0.1`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582454/2f2018fd-965b-a2b1-0d7c-2cdd8bf9943a.png)


上記項目を追記して、nodeを停止して下さい
`symbol-bootstrap stop`
`symbol-bootstrap start --upgrade -c ｶｽﾀﾑﾌﾟﾘｾｯﾄ -d`
上記命令を実行して、ｶｽﾀﾑﾌﾟﾘｾｯﾄへの追記内容を nodeに反映させ、nodeを再起動させます
この nodeへの操作で node/unlockaccountも見れる様になります

# ｼｪﾙｽｸﾘﾌﾟﾄの実行
この ｽｸﾘﾌﾟﾄは ﾎｰﾑﾃﾞｨﾚｸﾄﾘからの実行を推奨します
この ｽｸﾘﾌﾟﾄを実行したら、一度 ﾛｸﾞｱｳﾄをしてから再 ﾛｸﾞｲﾝをして下さい
再 ﾛｸﾞｲﾝ後、peer-tools ﾃﾞｨﾚｸﾄﾘに入って下さい
下記命令を実行して下さい
```
nohup waitress-serve --port=3000 peer_simple_rest:app > waitress-serve.log 2>&1 &
```
これで waitress-serveが開始、外部からの ｱｸｾｽで dualNodeと同様に nodeの状態が見れる様になります

**※ 外部から見れる項目**
node/info
node/peers
node/unlockedaccount
chain/info

# 停止方法
下記命令を実行して下さい　※命令を実行する場所は不問
sudo ps -A | grep waitress-serve
結果表示例
	
	 1410 pts/0    00:00:00 waitress-serve	

先頭に '1410'とあるので
kill 1410
これで waitress-serveは停止し、外部からの ｱｸｾｽで見れなくなります
【学習メモ】ソケットプログラミング

# 初めに

　ソケットプログラミングについて学習したので簡単にメモしておく。

# ソケットとは

　ソケットは通信の終端点を指す概念であり、データを送受信するための抽象化されたインターフェースである。ソケットにより簡単にネットワーク通信を行うことができる。

# ソケットの種類

## ストリームソケット（TCPソケット）

　TCP により信頼性の高いデータ転送を行うために使用される。

## データグラムソケット（UDPソケット）

　UDP により信頼性よりも速度を重視したデータ転送を行うために使用される。

## ソケットの操作

　以下は python の `socket` モジュールを例にしている。

| 操作   | 説明                                          | Pythonのメソッド    |
|--------|----------------------------------------------|--------------------|
| 作成   | ソケットを作成する                             | `socket.socket()`   |
| 接続   | クライアントソケットがサーバーソケットに接続する  | `socket.connect()`  |
| 送信   | ソケットを通じてデータを送信する                | `socket.send()`     |
| 受信   | ソケットを通じてデータを受信する                | `socket.recv()`     |
| 閉じる | 使用が終わったソケットを閉じる                  | `socket.close()`    |

https://docs.python.org/ja/3/library/socket.html

# 参考

https://docs.python.org/ja/3/howto/sockets.html

https://docs.python.org/ja/3/library/socket.html
EVE-NGのCiscoIOLルータへのssh接続のRSA暗号鍵の保存


RSAキーはデバイスのNVRAMに保存され、configファイルの一部として直接表示されることはありません。EVE-NGでWipe Nodeを実施すると、消えてしまうので、config中に埋め込もうとしましたが、Key pair import failed.のエラーで出てしまい、断念。結果簡単な技で実現出来ました。
```
(config)#hostname R1
(config)#ip domain-name cisco.com
(config)#username USER password 0 PASS
(config)#ip ssh version 2
(config)#line vty 0 4
(config-line)#login local
(config-line)#transport input telnet ssh

(config)# crypto key generate rsa
How many bits in the modulus [512]:1024

#show crypto key mypubkey rsa
% Key pair was generated at: 13:56:00 JST Aug 4 2024
Key name: R1.cisco.com
Key type: RSA KEYS
 Storage Device: not specified
 Usage: General Purpose Key
 Key is not exportable.
 Key Data:
  30819F30 0D06092A 864886F7 0D010101 05000381 8D003081 89028181 00A4C0EB 
  3C032A72 6DD6AFF2 7F9186CB F793FA67 5B41ABF9 B9AA8379 161DFDAF 98EE845F 
  455A1D57 0AD26075 DBDA9E18 2498F7E1 D953107E D45AE082 2D99AB62 C0531DAA 
  E2BB9B83 0288F66F D3A8C20B 48461127 6EA7C95C 49560872 54E84913 91D1D820 
  6B9EE580 0CA22865 F016BDF2 BFA6BD5B 208BA046 8D7A9089 DB4CF54E 17020301 
  0001
% Key pair was generated at: 13:56:00 JST Aug 4 2024
Key name: R1.cisco.com.server
Key type: RSA KEYS
Temporary key
 Usage: Encryption Key
 Key is not exportable.
 Key Data:
  307C300D 06092A86 4886F70D 01010105 00036B00 30680261 00B53EB3 A4AEE9AE 
  7DF7FA8B E2970E5A 4E28D297 1442A6D8 113A3880 AD36A726 38DC8D91 8C87B88B 
  1DE7EB0B F084DAEC A5E89C95 0FA112A7 06AF9A62 FB569F89 49758E58 9D20A7ED 
  B5CB2EDB 0869F8AA 20943326 3C9E9F7A 2A3B8702 2642ADA4 59020301 0001

(config)#crypto key import rsa mypubkey pem terminal      
% Enter PEM-formatted public General Purpose key or certificate.
% End with a blank line or "quit" on a line by itself.

Enter the base 64 encoded RSA key.
Paste the key in base 64 encoding and terminate with a "quit" or "end" on a line by itself:
30819F30 0D06092A 864886F7 0D010101 05000381 8D003081 89028181 00A18A21 
E8A4C89E 73BB1C5E 80215FF2 0C235EEB 806D0BE8 2B057E5C AD513110 4D63F036 
0D2F3FCD 454B57A4 1D306612 51AB89B6 013941C0 8BCCCBB5 4ACCE192 358CFCBE 
62D39455 1D430074 E9C12107 34D34FA1 F5F64EF5 E4E5CBC0 8A9B1DD0 D26173E3 
92D2F04D 018E8ED0 137FABE1 D78A1C2A 475F66ED 1736F1A7 E7BD8954 F7020301 
0001
quit
% Key pair import failed
→どうしてもこのエラーが発生してしまいました。
```
試しに、Startup-configsの最後に、追加した所、Wipe Nodeしても、大丈夫になりました。
```
!
crypto key generate rsa modulus 1024
end
```
夏休みの宿題① ~mod7占い~

paizaの問題キャンペーンが始まっているので夏休みの宿題がてらに解いてみました✨
まずはウォーミングアップとpaizaの使い方になれるため、まずはこちらの問題を解いてみました🎵

https://paiza.jp/works/mondai/s_rank_skillcheck_sample/mod7

# 結果
入力の仕組みに戸惑いましたが、無事100点取ることができました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273072/efe28e9e-4e59-4e24-3f26-7cd81f80797d.png)

解き方は、Pythonのcombinationsライブラリを活用して、配列の中にある数字3組で組み合わせを作成し、後は配列ごとに加算して7で割れるかどうか判定するだけです。

うーん...もっと最適化できる気がする...
Node.jsの環境合わせ(Macの場合)

## Homebruw
Homebruwはソフトを管理するツールです。
```sh
% /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

Homebruwのパスを通します。（bash利用時は~/.bashrc）
```sh
% vi ~/.zshrc
export PATH=$PATH:/opt/homebrew/bin
% source ~/.zshrc
```
## nodebrew
nodebrewはnodeのバージョンを管理するツールです。Homebruwでインストールすることができます。

```sh
% brew upgrade nodebrew
% brew install nodebrew

% nodebrew -v          
nodebrew 1.2.0
```

nodebrewのパスを通します。

```sh
% nodebrew setup
% vi ~/.zshrc
export PATH=$HOME/.nodebrew/current/bin:$PATH
% source ~/.zshrc
```

nodebrewでNode.jsのバージョンを自由に変更する。
```sh
# バージョン一覧
% nodebrew ls-remote
# ローカルにインストール
% nodebrew install-binary v22.4.1
# ローカルのインストール一覧インストール
% nodebrew list
# 使用するバージョンの選択
% nodebrew use v22.4.1
# 現在のバージョンを確認
% nodebrew ls
% node -v
v22.4.1
```
つまづき１　JSXを返すときのセミコロン

UdemyのReact講座で少しつまづいたのでメモ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3853126/77b2bcb3-81c1-7cc3-1a61-d89f399e7528.png)

このようにセミコロンを消してくださいというエラーが出てしまったので原因を調査してみた

原因

セミコロンを書くことでreturn文の後のように使われていると判断されている

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3853126/92c6f7f3-68bd-8d8c-8487-38c3d683d038.png)

上のように｛｝とreturn文を省略せずに書くとエラーが消えたことが分かった

まとめ

JSXを返す場合: セミコロンは必要ない。
[WSL] Windows の絶対パスへの cd で wslpath を自動化する

WSL 上の `cd` コマンドで Windows の絶対パスへ移動出来るようにします。

# 1. ソースコード

```bash:~/.bash_aliases
set -uoo pipefail posix

# 
function cd_wsl() {
	if [[ $# -gt 0 ]]; then
		local -r last="${@:$#}"
		if [[ "$last" =~ ^[A-Za-z]: ]]; then
			builtin cd "${@:1:$#-1}" "$(wslpath "$last")"
			return
		fi
	fi
	builtin cd "$@"
}

alias cd=cd_wsl
```

```bash:使用例
cd 'C:\'
pwd

cd '/usr/lib'
pwd
```

```text:使用例の実行結果
/mnt/c
/usr/lib
```

# 2. 説明

## 2.1. `wslpath` コマンド

WSL 上で `wslpath` コマンドを使用することで、Windows のパスと WSL のパスの相互変換が可能です。

```
Usage:
    -a    force result to absolute path format
    -u    translate from a Windows path to a WSL path (default)
    -w    translate from a WSL path to a Windows path
    -m    translate from a WSL path to a Windows path, with '/' instead of '\'

EX: wslpath 'c:\users'
```

※ `wslpath` コマンドの使い方は `wslpath 2> /dev/null` 等で確認出来ます。

参考「[ビルド 17046 - WSL のリリース ノート | Microsoft Learn](https://learn.microsoft.com/ja-jp/windows/wsl/release-notes#build-17046)」

## 2.2. Windows のパスと Linux のパスの判別

Windows ではファイル名に使用できない記号が多くあります。

しかし、ほとんどの Linux のディストリビューションで用いられるファイルシステム ext4 では、仕様上はスラッシュ `/`、`.` および `..` 以外の記号を全て使用可能です。

そのため、厳密に「この文字さえ含まれていれば Linux のパスでなく Windows のパス」と断定することは出来ません。

ここでは、「**ドライブ文字を含むかどうか**」で簡易的に判別することにします。

ドライブ文字の有無は正規表現 `^[A-Za-z]:` で確認します。

```bash
[[ 'C:\' =~ ^[A-Za-z]: ]] && echo 'Windows' || echo 'Linux'
[[ '/usr/lib' =~ ^[A-Za-z]: ]] && echo 'Windows' || echo 'Linux'
```

```text:実行結果
Windows
Linux
```

ファイルシステム ext4 では `C:\` のようなディレクトリ名を使用可能ですが、環境変数 `PATH` 等でコロン `:` が区切り文字として使用されていることもあり、ディレクトリ名にコロン `:` を使用することは避けるべきです。

(もし `C:\` という名前のディレクトリに移動したければ、`cd 'C:\'` の代わりに `cd './C:\'` とすれば可能です。)

参考「[命名規則 - ファイル、パス、名前空間の名前付け - Win32 apps | Microsoft Learn](https://learn.microsoft.com/ja-jp/windows/win32/fileio/naming-a-file#naming-conventions)」
参考「[ext4 - Wikipedia](https://en.wikipedia.org/wiki/Ext4)」
参考「[PATH - Bash Reference Manual](https://www.gnu.org/software/bash/manual/bash.html#index-PATH)」

## 2.3. Linux の `cd` コマンドの引数

Linux の `cd` コマンドの引数はパスだけでなくオプションを伴うことがあります。

```
cd [-L|[-P [-e]] [-@]] [dir]
```

※ `cd` コマンドの詳細は `help cd` 等を参照。

参考「[cd - Bash Reference Manual](https://www.gnu.org/software/bash/manual/bash.html#index-cd)」

ここでは**最後の位置パラメータ** `"${@:$#}"` を分割し、Windows の絶対パスかどうかを確認します。

`cd ~` と同じ意味で引数なしの `cd` を使用する場合があるため、引数なしの場合は位置パラメータの確認をしないようにします。

※引数なしの `cd` は `cd ''` と意味が異なります。

`cd -L` のように最後の位置パラメータがパスでなくオプションの場合も、最後の位置パラメータが Windows の絶対パスでないとみなせるため、問題なく処理出来ます。

参考「[[シェル] 位置パラメータを配列のように扱う - Qiita](https://qiita.com/kerupani129/items/2b205ac47dda70b9bc12)」

# 3. おまけ: `wslpath` コマンドでドライブ文字を含む相対パスを指定した場合の不具合について

Windows では「ドライブ文字を含む相対パス」が存在しますが、`wslpath` コマンドで正しく変換されない上にエラー終了しないようです。

(「ドライブ文字を含む相対パス」が「コロン `:` を含む相対パス」とみなされる？)

```bash
cd /mnt/c
wslpath 'C:' && echo 'OK' || echo 'NG'
```

```text:実行結果
C:
OK
```

参考「[Windows システムのファイル パス形式 - .NET | Microsoft Learn](https://learn.microsoft.com/ja-jp/dotnet/standard/io/file-path-formats)」
Debian 12系Raspberry Pi OSでIPアドレスを固定する

# はじめに
比較的新しいRaspberry PI OSを使ったところ、IPアドレスの固定化の方法が変わっていたのでメモです。

# 設定ファイルの修正
今までは無線LANでIPアドレスを固定する場合、dhcpcd.confでIP固定の設定をしていたかと思いますが、```/etc/NetworkManager/system-connections/preconfigured.nmconnection ```ファイルに変わっています。

ipv4セクションを下記の内容に修正します
```conf
[ipv4]
# method=auto
address1=<固定IP>/<ネットマスク(例24>,<デフォルトゲートウェイ>
dns=<DNSサーバアドレス>;
method=manual
```

# 設定の反映
設定を再読み込みさせ、コネクションをアップします。
ここで指定しているpreconfiguredは設定ファイルのファイル名です。
複数のWifiで同じ設定をする場合などはファイルごとに行う必要があります。
```shell
$ sudo nmcli connection reload
$ sudo nmcli connection up preconfigured
```
symbol-node-watcherを改造してSymbolPeerノードを監視する

## はじめに
symbol-node-watcherを使ってデュアルノードを監視するようにしましたが、私は冗長化ノードでPeerのみも持っているため、こちらも監視したいと思いました。

https://qiita.com/ccHarvestasya/items/9fb9047090c909ab5ff0

しかし、symbol-node-watcherはRestの`/chain/info`でノードの状態を監視しているので、Restを持っていないPeerノードは監視できません。

ただ、PeerノードでもSSLソケット通信でブロック高を取得出来るので、Peerノードの場合はSSLソケット通信を使って`/chain/info`と同等のJSONを取得するように改造しました。***証明書の準備がちょっと面倒ですけど。。。***

ちなみに、Rest内部でも同じことやってるので、`/chain/info`部分だけ自力で作った感じデスね。

## インストール

```sh
git clone https://github.com/ccHarvestasya/symbol-node-watcher.git
cd symbol-node-watcher
npm i
npm run build
sudo npm i -g .
```

## 証明書の準備
こちらに関しては、下記の「ノード証明書の生成」を参照してください。

https://qiita.com/ccHarvestasya/items/a42baff1baad0d7d0ab2

## symbol-node-watcherの設定ファイル作成

`~/symbol-node`にノードを設置してると仮定し、symbol-node-watcherの起動場所もココにします。証明書の入ったディレクトリ`cert`も同様にココに置きます。

:::note alert
symbol-bootstrapの場合、ノードの証明書が`target/nodes/node/cert`にありますが、これは利用出来ません。
※ノードとローカルのIPが異なるため通信出来ない。
:::

:::note info
IP/HostとMain証明書は1:1です。1:n、n:1の場合などは他ノードから通信を拒絶されることがあります。
（同じ証明書を複数人が持ってたら怪しさ満点で許可なんて出せないでしょう？）
:::


```sh
cd symbol-node
vi config.json
```

```config.json
{
  "nodePath": "/home/user/symbol-node",
  "discordWebhookUrl": "https://discord.com/api/webhooks/1247840486480****/xwcTXEKBL-NC9fXoByZZbb-s5A8qxLAhmD5ikToCBwz79aX3WBYWEF3k7xX4M******",
  "cronExpression": "0 0 * * * *",
  "symbolServiceUrl": "https://symbol.services/nodes?filter=suggested&limit=5",
  "differenceHeight": 5,
  "stopCommand": "symbol-bootstrap stop",
  "runCommand": "symbol-bootstrap run -d",
  "enablePeerCheck": true,
  "peerPort": 7900,
  "certPath": "cert"
}
```
私が追加したのは以下の3つ。
<dl>
  <dt>enablePeerCheck</dt>
  <dd>Peerノードのチェックを有効にする。</dd>
  <dt>peerPort</dt>
  <dd>変更している変態以外は7900。</dd>
  <dt>certPath</dt>
  <dd>証明書が入ってるディレクトリのパス。<br/>絶対パスの方が良いかも。</dd>
</dl>

## 起動
起動は変更ありません。
```sh
symbol-node-watcher start
```

## 停止
停止も変更ありません。
```sh
symbol-node-watcher stop
```

## ログ
ログは起動場所に出力されるように変更しています。また、ファイル名も変えています。
```sh
less symbolNodeWatcher.log
```


## GitHub

https://github.com/ccHarvestasya/symbol-node-watcher
RustでPythonのライブラリを使用する

PyO3は、RustとPythonを連携させるための強力なツールです。これにより、RustからPythonを呼び出したり、PythonからRustの関数を使用したりすることが可能になります。

## PyO3の主な特徴

1. **Pythonネイティブ拡張モジュールの作成**: Rustを使用してPythonの拡張モジュールを作成できます。これにより、Pythonの処理速度を大幅に向上させることができます。

2. **RustバイナリへのPythonの埋め込み**: RustプログラムからPythonコードを実行し、その結果を操作することができます。

3. **幅広いPythonバージョンのサポート**: PyO3は、Python 3.7以降のバージョン（CPython、PyPy、GraalPy）をサポートしています。

4. **Rustバージョンの要件**: Rust 1.63以降で動作します。

## 使用例

```bash
cargo add pyo3 --features auto-initialize
```


以下は、RustからPythonを呼び出す簡単な例です：

```rust
use pyo3::prelude::*;
use pyo3::types::IntoPyDict;

fn main() -> PyResult<()> {
    Python::with_gil(|py| {
        let sys = py.import_bound("sys")?;
        let version: String = sys.getattr("version")?.extract()?;

        let locals = [("os", py.import_bound("os")?)].into_py_dict_bound(py);

        let code = "os.getenv('USER') or os.getenv('USERNAME') or 'Unknown'";
        let user: String = py.eval_bound(code, None, Some(&locals))?.extract()?;

        println!("Hello {}, I'm Python {}", user, version);
        Ok(())
    })
}
```

このコードは、Pythonのバージョンを取得し、現在のユーザー名を環境変数から読み取ります。

## PyO3の利点

1. **パフォーマンス**: RustはC言語に匹敵する速度を持ちながら、メモリ安全性も確保しています。

2. **安全性**: Rustの強力な型システムとメモリ管理により、多くのバグを防ぐことができます。

3. **柔軟性**: PythonとRustの両方の長所を活かしたアプリケーションを開発できます。

## コミュニティとサポート

PyO3は活発なコミュニティによって支えられています。GitHubやDiscordでの問題解決、ドキュメンテーションの改善、機能追加やバグ修正など、さまざまな形で貢献することができます。

PyO3を使用することで、PythonとRustの両方の利点を活かした効率的で安全なアプリケーションを開発することができます。高速な処理が必要な部分はRustで、それ以外はPythonで記述するといった柔軟な開発が可能になります。

## 参考文献
1. [PyO3 GitHub Repository](https://github.com/PyO3/pyo3) (アクセス日: 2024-08-04)
2. [PyO3 User Guide](https://pyo3.rs/) (アクセス日: 2024-08-04)
ESP32: 同じプログラムを実機と QEMU で走らせる

参考ページ
[WSL2でQEMU上の仮想ESP32での開発](https://lang-ship.com/blog/work/wsl2-qemu-esp32/#google_vignette)

esp-idf の準備はこちら
[esp-idf の使い方](https://qiita.com/ekzemplaro/items/b12d4d3bc0b770cf8986)

## QEMU を使えるようにする

```bash
sudo apt install -y libgcrypt20 libglib2.0-0 libpixman-1-0 libsdl2-2.0-0 libslirp0
python $IDF_PATH/tools/idf_tools.py install qemu-xtensa qemu-riscv32
. $HOME/esp/esp-idf/export.sh
```

## ソースコードの用意

```bash
cd ~/esp
cp -r esp-idf/examples/get-started/hello_world .
```

ソースコードの修正

```bash
cd hello_world
```

```c:main/hello_world.c
// -----------------------------------------------------------------------
/*
	main/hello_world_main.c

					Aug/04/2024
*/
// -----------------------------------------------------------------------
#include <stdio.h>
#include <unistd.h>

#define	VERSION	"2024-8-04 AM 11:54"
// -----------------------------------------------------------------------
void loop()
{
	int icount = 0;

	while(1)
	{
	printf("icount = %d\n",icount);
	printf("*** loop *** %s ***\n",VERSION);
	printf("Hello world!\n");
	printf("Good Morning!\n");
	printf("Good Afternoon!\n");
	printf("こんにちは\n");
	printf("\n");
	printf("*** check *** %s ***\n",VERSION);
	sleep(3);

	icount++;
	}
}

// -----------------------------------------------------------------------
void app_main(void)
{
	sleep(3);
	printf("*** 開始 *** %s ***\n",VERSION);
	sleep(3);

	loop();
}

// -----------------------------------------------------------------------
```

## コンパイル

```bash
idf.py build
```

## 実機で動かす

```bash
df.py flash
```

```text
$ cu -l /dev/ttyUSB0 -s 115200
Connected.
icount = 0
*** loop *** 2024-8-04 AM 11:54 ***
Hello world!
Good Morning!
Good Afternoon!
こんにちは

*** check *** 2024-8-04 AM 11:54 ***
icount = 1
*** loop *** 2024-8-04 AM 11:54 ***
Hello world!
Good Morning!
Good Afternoon!
こんにちは

*** check *** 2024-8-04 AM 11:54 ***
```

## QEMU で動かす

```bash
idf.py qemu monitor
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/c3057bc5-b3ac-ae76-a157-363c54ef6896.png)

停止させるには

Process を調べて

```bash
ps ax | grep esp
```

```bash
kill -9 **** ****
```