OmniAICreator/Qiita-1.07M huggingface dataset:
OSI参照モデルをたとえてみた

## 0. はじめに
ネットワークというのは、コンピュータやスマホなどが通信して情報をやり取りする仕組みのことです。  
でも、この仕組みを一つ一つ分解して考えると、実はいろんな「やること」が順番に行われています。  
それを整理して「レイヤー（層）」という形にしているんです。  
手紙も「送り手」と「受け手」で情報をやりとりしているので、今回はそれに合わせて説明してみます。

## 1. 手紙の例で考える「レイヤー」
- **まず、手紙を書く（内容を決める）**  
  これが一番大事な部分です。相手に何を伝えたいのかを決めます。

- **封筒に入れて、住所を書く**  
  手紙そのままじゃ届かないので、相手に分かるように封筒に入れて住所を書きます。

- **ポストに投函する**  
  自分で届けるのは大変なので、郵便局の人に手紙を渡します。

- **郵便局が手紙を配送する**  
  郵便局の人が手紙を持って、相手の住所まで運びます。

- **相手が手紙を受け取る**  
  最後に相手が手紙を開いて読むことで、情報が伝わります。

## 2. OSI参照モデルにおける各レイヤーの具体的な役割

### 第1層: 物理層（Physical Layer）
- **実際のネットワークでの役割**:  
  物理層は、データが実際にケーブルや無線で送信されるための「物理的な仕組み」を担っています。具体的には、データを0と1のビットに変換し、電気信号や光信号として送信します。

- **郵便局の例**:  
  これは、手紙が実際にポストに投函される部分に相当します。手紙（データ）が物理的に運ばれるために、郵便局のトラックが動き出します。

- **実例**:  
  イーサネットケーブルやWi-Fiがこの層の一部です。イーサネットでは、ケーブルを通して電気信号がやり取りされ、Wi-Fiでは電波を使って通信が行われます。

### 第2層: データリンク層（Data Link Layer）
- **実際のネットワークでの役割**:  
  データリンク層は、隣接する機器間の通信を管理し、データのフレーム化、エラー検出、フロー制御を行います。この層では、データが正しく届くかどうかを確認します。

- **郵便局の例**:  
  これは、郵便局の窓口での作業に例えられます。窓口のスタッフが手紙の封筒をチェックして、正しい住所が書かれているか、重さが適切かを確認します。

- **実例**:  
  MACアドレスを使って、デバイス同士の通信を管理します。例えば、Wi-Fiルーターがネットワーク上のデバイスにデータを送るとき、MACアドレスを使って正しいデバイスを特定します。

### 第3層: ネットワーク層（Network Layer）
- **実際のネットワークでの役割**:  
  ネットワーク層は、データがどのようにして目的地に届くかを決定します。ルーティングを行い、パケットを異なるネットワーク間で転送します。

- **郵便局の例**:  
  これは、郵便トラックが手紙を配送する際に、どのルートを通るかを決める部分に相当します。たとえば、渋滞や工事を避けるための最適な道を選ぶことです。

- **実例**:  
  IPアドレスを使用して、データがどのネットワークを通過して目的地に到達するかを決めます。ルーターは、パケットを送る最適な経路を計算します。

### 第4層: トランスポート層（Transport Layer）
- **実際のネットワークでの役割**:  
  トランスポート層は、データの信頼性を管理します。データを小さなパケットに分けて、再送やエラー検出を行います。

- **郵便局の例**:  
  これは、手紙がちゃんと届いたかを確認する部分です。もし手紙が途中で壊れたりした場合、再送の指示を出すことが含まれます。

- **実例**:  
  TCPやUDPがこの層で動作します。TCPはデータの到達確認を行い、エラーがあれば再送します。一方、UDPはスピード重視で確認を行わないため、動画ストリーミングなどでよく使われます。

### 第5層: セッション層（Session Layer）
- **実際のネットワークでの役割**:  
  セッション層は、通信セッションを管理します。これには、通信を開始、維持、終了するためのプロセスが含まれます。

- **郵便局の例**:  
  友達と手紙のやり取りの約束をし、途中で何度か手紙を送ったり確認し合いながら、最後に「これで終わります」と言って通信を終了する。

- **実例**:  
  セッション層では、リモートデスクトップ接続やオンライン会議のように、接続が切れたときに再接続を行う役割を担います。

### 第6層: プレゼンテーション層（Presentation Layer）
- **実際のネットワークでの役割**:  
  プレゼンテーション層は、データの形式を変換したり、暗号化や圧縮を行ったりします。異なるシステム間でデータを理解できるようにします。

- **郵便局の例**:  
  これは、手紙の言葉が相手に通じるようにする部分です。たとえば、手紙の内容が日本語なのか英語なのかを確認することに似ています。

- **実例**:  
  JPEG画像やMP3音声の圧縮、暗号化などがここで行われます。たとえば、Webページが表示されるときに、ブラウザがHTMLを読み取って表示します。

### 第7層: アプリケーション層（Application Layer）
- **実際のネットワークでの役割**:  
  アプリケーション層は、ユーザーが直接利用するアプリケーションやサービスが動作する層です。ここで実際にやり取りされるデータや情報が扱われます。

- **郵便局の例**:  
  これは、手紙の内容そのものです。実際に「友達に何かを伝えたい」と思って書く手紙の中身です。

- **実例**:  
  ウェブブラウザ、メールクライアント、SNSアプリなどがこの層で動作します。ユーザーが直接触れる部分であり、最も身近な層です。
Azure DevOpsとテスト自動化ツールを連携してみた

## Azure DevOps とは
[Azure DevOps](https://azure.microsoft.com/ja-jp/products/devops) は、Microsoftが提供する、ソフトウェア開発プロジェクトを支援するための統合ツールです。
Azure DevOpsには、以下のようなサービスが含まれています。


| サービス名　　　　| 概要 |
| ---- | ---- |
|**Azure Boards**| プロジェクトの管理ツール。タスク管理、バックログ管理、スプリント計画、作業項目の追跡などの機能がある。| 
|**Azure Repos**|Gitリポジトリを提供するサービス。ソースコードのバージョン管理を行うことができる。
|**Azure Pipelines**|CI/CDのパイプラインを作成し、ビルド・テスト・デプロイを自動化するためのサービス。
|**Azure Test Plans**|テスト管理ツール。テスト計画の作成・実行・トラッキングを行うことができる。
|**Azure Artifacts**|パッケージやモジュールなどを管理するためのパッケージマネージャー。パッケージの作成、共有、配布、バージョン管理ができる。

Azure DevOpsを使用することで、開発やリリースをはじめとするソフトウェア開発の手助けをしてくれます。

## テスト自動化ツールとの連携
今回、UIテスト自動化ツール [Ranorex](https://ranorex.techmatrix.jp/)（※） で作成したテストシナリオをAzure DevOpsのサービスを使って動かしてみました。
※Ranorex は、デスクトップ/Web/モバイルアプリの自動化に対応しています。
　テスト対象アプリのUI操作を記録し、テストの作成/実行を可能とします。

実行構成は以下となります。
![Ranorex と Azure DevOps.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826211/3ea28ad3-436c-91c6-b1d4-8bf2ab0b5c27.png)

Gitで管理しているRanorexのテストシナリオ（Ranorexソリューション）をAzure DevOpsのReposで管理しています。

Azure DevOpsのPipelines機能で、Reposで管理しているRanorexソリューションを取得し、テストを実行するという流れでパイプラインを作成してみました。

パイプラインを作成する際には、実行したいタスクをGUI操作で簡単に追加できます。
今回は、Ranorexソリューションをビルド（※）するための **Visual Studio build** と、Ranorexのテストを実行するための **Run Ranorex Studio test executable** のタスクを使用しています。
※Ranorexソリューションは、slnファイルが生成されており、**Visual Studio build** タスクを使うことで、ソリューションのビルドを実施することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826211/d6cd0003-4b56-4b76-bebb-baef45f1f6c4.png)

パイプラインを実行すると、パイプライン上で設定したタスクが順次実行されていきます。
![パイプライン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826211/f1f15508-0984-b960-9618-6b12e6ee788b.png)

今回は、Ranorex で作成したUIテストを自動実行したので、マシン上でテストが実行されました。また、Ranorex 側で生成されるレポートも出力されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826211/cedea21c-e883-167f-f796-7e3c8f5ad9c6.png)

このように、テスト自動化ツールで作成したテストシナリオをAzure DevOpsのパイプラインで実行することができました。

## まとめ
Azure DevOpsのReposとPipelines機能を使用し、UIテスト自動化ツールで作成したテストを実行してみました。
Azure DevOps自体は今回初めて触ってみたため、最初は各サービスを使うときの手順などに戸惑いましたが、基本的にどのサービスもGUI操作で設定できることから初心者でも分かりやすいと感じました。
Azure DevOpsにはさまざまなサービスが含まれているため、まずは気になるサービスを試してみることでAzure DevOpsに触れてみるのもお勧めします。

Azure DevOpsとRanorexの連携に関するより詳しい内容は、Ranorex Blogの記事で紹介されています。
・Azure DevOpsとの連携
https://ranorex.techmatrix.jp/blog/2024/10/16/integrating-azure-devops/
URLスキームを使わず任意のアプリで開くWebクリップ

# 使途

# 結論

https://developer.apple.com/documentation/devicemanagement/webclip

- TargetApplicationBundleIdentifier を設定する
    - 対応しているMDMがほぼなく、AC2.17もこの設定をGUI上で設定できない
        - テキストエディタで編集・追記してやる必要がある
    - To use this property, install the profile through MDM
        - このパラメータはMDMからのインストールが必要
        - と言いつつ、プロファイル手動インストールでも動いていたような気が
            - 組織識別情報を持っていたせいかもしれないので基本MDMからで
    - 挙動についてはきちんと確認する必要がある
        - iOS標準系アプリ（Safariを含む）との相性があまり良くないように見える
        - アプリ側の対応も必要か
    - アプリ指定、フルスクリーン設定、iOSのデフォルトアプリ設定の組み合わせで挙動が変わった
        - なんかの組み合わせで「Chromeでフルスクリーン」となったがどの組み合わせか忘れた


# 動作イメージ

https://www.youtube.com/watch?v=xxxxxxxx

# サンプルプロファイル

```xml:Webclip_sample.mobileconfig

	<key>PayloadContent</key>
	<array>
		<dict>
			<key>FullScreen</key>
			<false/>
			<key>IgnoreManifestScope</key>
			<true/>
			<key>IsRemovable</key>
			<true/>
			<key>Label</key>
			<string>WebClip_1</string>
			<key>PayloadDescription</key>
			<string>Webクリップの設定を構成します</string>
			<key>PayloadDisplayName</key>
			<string>Webクリップ</string>
			<key>PayloadIdentifier</key>
			<string>com.apple.webClip.managed.F0A24574-51E3-44E7-8630-2732174B0706</string>
			<key>PayloadType</key>
			<string>com.apple.webClip.managed</string>
			<key>PayloadUUID</key>
			<string>F0A24574-51E3-44E7-8630-2732174B0706</string>
			<key>PayloadVersion</key>
			<integer>1</integer>
			<key>Precomposed</key>
			<false/>
			<key>URL</key>
			<string>https://www.google.com/</string>
			<key>TargetApplicationBundleIdentifier</key>
			<string>com.google.chrome.ios</string>
		</dict>
	</array>

```
UnityでQuest向けに開発時、左右で異なるレンダリングがされてしまう？

# 環境
Unity 2021.3.29
Oculus XR Plugin 3.3.0
Meta XR Core SDK 68.0.3
Meta XR Interaction SDK 68.0.2
Meta XR Simulator 68.0.0
VR：Meta Quest2,3

# 問題
映像が撮れなかったためテキストで説明します。

複数のシーンにて、UnityでPlayしてQuestで見ようとすると、右目にUIやhandから出るrayが映らなかったり。
他のシーンでは右目で特定のモデル以外が映らなかったりと、法則が分からない映り方をしてしまう。
実際に試したのは
Assets > Samples > Meta XR Core SDK > 62.0.0 > Sample Scenesに入っている、
・SimultaneousHandsAndControllers
・HandTrackingWideMotionMode
Assets > Samples > Meta XR Interaction SDK > 68.0.2 > Example Scenesに入っている
・TouchGrabExamples
の計３つ。

Quest2,3の２つで試しましたがどちらも同じ不具合。

Unity Recorderではちゃんと撮れている。
たぶんCenter Eyeの映像を出力しているだけだから。

# 解決策
数時間迷った上で辿りついたのがこの動画
https://www.youtube.com/watch?v=JiCJN8EvoCA

Project Settings > XR Plugin Management > Oculusに入り、
Windows, mac, Linux Settings項目にある
"Stereo Rendering Mode"をSingle Pass InstancedからMulti Passに変更する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3860179/ed98850c-e604-c0a5-6b21-8ec98bd3a8fa.png)
これだけ！

最初はUIの設定がおかしいはずだ、と思ってUIについて調べまくったけどこっちの設定でした、、、
ってかこんな設定しろってマニュアル書いてたっけ！？！？
数時間悩んだのにこれだけで解決かぁ。まぁエンジニアなんてそんなもんだよね！
【Rails】Rspecでテストを行う際に使ったメソッドまとめてみた

こんにちは！
今回は、実際にRspecでテストをする上で使ったメソッドをまとめてみました。

### 1, ``` describe ```
テストのグループ化に使用され、テスト対象となるクラスやメソッドの説明を行う。
```php
describe 'User' do
  # Userクラスに関するテスト
end
```

### 2, ``` context ```
条件によるグループ化を行う。
```php
context 'when user is an test' do
  # ユーザーがテストの場合
end
```

### 3, ``` it ```
具体的なテストケースを記述し,期待する結果をexpectを使って定義。
```php
it 'returns the correct name' do
  expect(user.name).to eq('Yamada')
end

```

### 4, ``` expect ```
テストで期待する結果を定義するために使用。
メソッドやオブジェクトの動作が期待通りであるかどうかを確認
```php
expect(user.name).to eq('Yamada')
```


### 5, ``` let ```
テスト内で使うオブジェクトを定義するために使われる遅延評価されるヘルパーメソッド.

```php
let(:user) { User.new(name: 'Yamada') }
```

### 6, ``` before / after ```
各テストの前後で共通のセットアップやクリーンアップを行いたい場合に使用。beforeは各テストの実行前、afterは実行後に処理を行う。

```php
before do
  @user = create(:user)
end
```

### 7, ``` subject ```
テスト対象のオブジェクトを定義する際に使う。

```php
subject { User.new(name: 'Yamada') }
it { is_expected.to be_valid }
```

### 8, ``` change ```
オブジェクトの状態が変化することを確認。主にデータベースのレコード数や属性の変更を検証。

```php
expect { user.save }.to change(User, :count).by(1)
```

### 9, ``` have_http_status ```
リクエストスペックで、HTTPステータスコードが期待通りかどうかを確認。
```php
expect(response).to have_http_status(:success)
```

### 10, ``` redirect_to ```
HTTPリクエストのテストで、リダイレクト先のURLが正しいかどうかを検証。
```php
expect(response).to redirect_to(root_path)
```



## 最後に
今回は以上になります！
最後まで見ていただきありがとうございました！
vbsの作法 その83

# 概要
vbsの作法、調べてみた。
練習問題やってみた。
構想編

# 練習問題
クローラーを作れ。

# 要件
- 指定されたURLを起点に巡回を実施する。
- リンクを巡回できること。
 Webページからaタグを検出してリンクされたページにアクセスしていくことを指す。
- フォームを巡回できること。
 Webページ内のformタグを検出し、何らかの内容をフォームに入力して適切なリクエストが送信できることを指す。
- ログインを実施できること。
 ログインフォームにあらかじめ登録されたID/passを入力し、その後発行されたセッションIDを管理してログイン状態を保つ。
- 高速化のための並行実行ができること。
 イベントループによる並行実行を活用して高速化を行う。
 並行実行数を指定できること。
- 巡回結果はデータベースに保存すること。
 データベースにはURL、リクエスト、ページタイトル、ステータスコード、レスポンスを保存すること。
 巡回結果をCSV出力できること。
- 巡回を停止・再開できること。
- 開発言語はvbsを使用すること。



# 方針
- IE11使う。
- ConnectObject使う。
- 並列化、無理。
- getElementsByName使う。
- getElementById使う。



以上
AWSの返金体験談：学習目的での利用が予期せず課金に

こんにちは、皆さん、
ユです。
今回はAWSを学習目的で使用していた際に発生した予期しない課金と、その後の返金対応について共有します。同じようにAWSを使い始めた方に参考になれば幸いです。

1. 背景
AWSを使ってクラウドサービスの学習を始めた際、EC2やAmazon DocumentDBの無料枠を利用していました。しかし、サービス利用の仕組みや課金条件について十分に理解していなかったため、1年間全て無料で使えると誤解していました。その結果、予期せずに請求が発生してしまいました。

痛かったの24万円でした、、

2. どのように気づいたか
2024年9月4日に、先月（9月）の利用料金がクレジットカードから自動引き落としされたとのメールを受け取り、その時点で初めて課金が発生していることに気づきました。すぐにAWSのサポート窓口に連絡し、詳細を確認しました。

3. AWSからの返金対応
AWSサポートにいくつの理由を説明したところ、慎重に審査をしていただき、以下の対応をしてもらいました。

これはAWSの担当者からの確認内容
「
・請求調整を希望する明細の具体的な情報をお知らせください
　サービス：
　リージョン：
　使用タイプ：
　請求発生期間：
　調整希望金額：
　※請求書の明細やコストエクスプローラーを使用して、具体的な金額や期間をお知らせください

・請求発生の根本原因をお知らせください

・発生した請求のお支払いが難しい特別なご事情がある場合、具体的な理由をお知らせください

・予期しない請求の再発を防ぐために設定した予防策をお知らせください
　予防策を実施いただけない場合は請求調整を進めかねる場合がございます

・請求発生からお問い合わせまでに時間を要したようにお見受けいたします。遅延が発生した理由についてお知らせください
」

ユの回答例として
「
AWS 　ご担当者様

お世話になっております。
今日電話対応頂き誠にありがとうございます。

ご質問の内容を回答いたしますので、
確認のほどお願いします。

　サービス：EC２、AmazonDocumentDB
　リージョン：  Asia Pacific (Tokyo)
　使用タイプ： DocumentDBと Virtual Private Cloudと Elastic Compute Cloud
　請求発生期間：2024年9月と2024年10月
　調整希望金額：2024年9月はUSD1,665　　 2024年10月はUSD203
　※請求書の明細やコストエクスプローラーを使用して、具体的な金額や期間をお知らせください

・請求発生の根本原因をお知らせください
先月から学習目的でAWSの利用を開始し、EC2を含む各種サービスを試しておりました。

しかし、AWSの利用にあたり、EC2などのリソースの利用について正確に理解しておらず、当初は1年間すべての利用が無料であると誤解しておりました。

このため、知らないうちに料金が発生してしまったことを認識しました。

今回の利用はあくまで技術習得のためであり、意図的に課金される行為ではありませんでした。

そのため、今回発生した料金に関して、返金のご対応をお願いできれば幸いです。



・発生した請求のお支払いが難しい特別なご事情がある場合、具体的な理由をお知らせください
今回の請求に関しまして、学習目的でAWSの無料利用枠を利用していたにもかかわらず、誤って予期しない課金が発生してしまいました。

私は現在、個人で技術習得を行っており、収入の限られた状況で生活をしております。

そのため、今回の請求額は予算を大きく超えてしまい、支払いが非常に困難な状況です。

学習のための使用であったため、予期しない高額の請求が発生することを防ぐために、今後はリソース管理や料金の確認を徹底する所存です。



・予期しない請求の再発を防ぐために設定した予防策をお知らせください
　予防策を実施いただけない場合は請求調整を進めかねる場合がございます

今後の対策としては、下のような４つを考えました。
１：  AWSの「請求アラート機能」を有効にし、使用料金が一定の金額に達した際に通知を受け取るよう設定しました。これにより、使用料金が無料枠を超えた時点で速やかに対応できるようになっています。  
２： 毎週のスケジュールを設定し、EC2や他のサービスの稼働状況を確認し、不必要なリソースが稼働し続けていないか監視しています。これにより、無駄なコストが発生しないようにしています。
３： 「コストエクスプローラー」を利用して、各サービスの利用料金を可視化し、どのサービスが課金の原因になっているかを把握しています。特に、無料枠を超えないようにリソースを削減する計画を立てています。
４： 不要なEC2インスタンスなどのリソースが長時間稼働し続けないよう、スケジュールによる自動停止設定を実施しています。これにより、誤って長時間稼働してしまうことを防止しています。

・請求発生からお問い合わせまでに時間を要したようにお見受けいたします。遅延が発生した理由についてお知らせください
今回の件に関して、請求が発生していることに全く気づいておりませんでした。

また、利用額についても正確に把握しておりませんでした。

先月分の利用料金がクレジットカードから自動的に引き落とされた旨のメールを受け取り、それで初めて請求が発生していたことに気づきました。

そのため、すぐにAWSの問い合わせ窓口に連絡し、状況を確認した次第です。遅延が発生してしまった理由は、

このように請求が発生していることに気づくのが遅れたためです。ご理解いただけますと幸いです。



今回の予期しない請求について、詳細をご説明させていただきました通り、学習目的での利用であり、請求が発生するとは考えておりませんでした。

利用方法についての誤解や不注意があったことを深く反省しております。今後は、今回のような状況が再発しないよう、より一層注意してAWSを利用する所存です。

大変恐縮ですが、私の現在の経済状況では、この請求額の支払いが難しい状況です。

つきましては、可能であれば今回の請求について返金のご対応をお願いできないでしょうか。ご検討いただけますと非常に助かります。

何卒、よろしくお願い申し上げます。
」

その２日後！！！

![スクリーンショット 2024-10-10 101052.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3906673/62ab0633-5c55-7058-5994-e1a9d134dc22.png)


9月分の利用料金：$1,488.86（税抜）が返金されました。
日本円は2024年10月時点の為替は23万５千円でした。ほぼ全額返金してもらいました。

10月分の利用料金：$199.43分のクレジットを付与していただきました。このクレジットは10月の利用料金に対して自動的に適用されるため、追加の操作は不要でした。

まとめ
AWSの学習はITエンジニアにて、非常に有益ですが、無料枠の利用方法や課金条件をしっかり理解することが大切です。私のように誤解して予期しない請求が発生しないよう、慎重に管理することをおすすめします。

同じような状況で困っている方がいらっしゃれば、参考になれば幸いです！
【Qiita Web API①】Pythonを使ってQiita APIの記事情報を取得してみた！

# はじめに
Qiita APIを使うことで、タグやタイトルから記事を検索したり、データを効率的に活用できるます。本記事ではPythonを使って、Qiita APIの記事情報を取得する方法を解説しております。

# Qiita APIとは
Qiitaが提供するWeb APIで、Qiitaのプラットフォーム上にあるさまざまなデータや機能にアクセスするためのインターフェースです。Qiitaは、プログラミングや技術に関する情報を共有するためのコミュニティであり、APIを利用することで、記事に関する様々な情報を取得することができます。

# Qiita APIでできること
**記事の取得**
Qiitaに投稿された記事を検索したり、特定の条件に基づいて取得することができます。

**ユーザー情報の取得**
Qiitaユーザーのプロフィール情報やフォロワー、フォローしているユーザーの情報を取得できます。

**タグ情報の取得**
Qiitaで使用されているタグの情報を取得し、どのタグがどれだけの数の記事に関連しているかを分析することができます。

**検索機能**
キーワードやタグを使用して、関連する記事を検索することができ、必要な情報を迅速に見つけることができます。

# 認証について
未認証の場合は1時間に60回までのリクエスト制限があるところ、認証をすることで1時間に1000回までリクエストが可能になります。

**アクセストークンの発行**

Qiitaにログイン後、「個人用アクセストークン」のところに「新しくトークンを発行する」のリンクから発行できます。

![スクリーンショット 2024-10-09 184227.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816986/bd0d75f8-47c9-5a93-d2fe-e5309ea98bdd.png)

今回は「read_qiita」にチェックし、「発行する」をクリックします。
![スクリーンショット 2024-10-09 184758.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816986/b56adaf7-5467-8a5e-1f25-56dd37067227.png)

トークンが発行されますが、一度しか表示されないのでメモをしておきましょう。



# 実装
では実際にPythonでQiitaの記事情報を取得してみたいと思います。
ここではタイトルとタグを取得してみたいと思います。

まずライブラリをインポートします。
```python
import requests
```
headerとparamsを定義します。
pageはページ数、per_pageは1ページ当たりの記事数を表しています。
queryは検索機能のようなもので、title:pythonでtitleにpythonが含まれているものを取得します。
```python
token = "先ほどメモしたアクセストークン"
url = f'https://qiita.com/api/v2/items'
headers = {
    "Authorization":"Bearer " + token
}
params = {
    "page":1,
    "per_page":10,
    "query":"title:python"
}
```
先ほどの条件に当てはまる記事のデータをjson形式で出力します。
```python
res = requests.get(url,params = params,headers = headers)
data = res.json()
```
記事のタイトルとタグを取得していきます。
```python
for item in data:
    item["title"]
    tags = item["tags"]
    for tag in tags:
        tag["name"]
```
正しく記事のタイトルとタグが取得できてれば成功です。

# おわりに
Pythonを使用することで、Qiita APIから効率的に記事の内容を取得することができます。さらに取得したデータを用いて、データ分析をすることも可能です。今後Qiita APIを使用する機会があれば、本記事で学んだ内容を生かしてみてください。
Kubernetes コンポーネントの出力

# はじめに

あるとき、Kubernetesのコンポーネントの情報を見る際に、 pod, deployment, service, role, service account 等の現在デプロイされている情報を取得する際に、いちいち kubectl コマンドを叩いて調べていくのが面倒になり、
現在デプロイされている情報を一気にYAMLファイルで出力したいと思いました。

# Kubernetes コンポーネントをすべてYAMLファイルとして出力するシェルスクリプトを作成してみた

```shell
#!/bin/bash

# 出力ディレクトリの設定
OUTPUT_DIR="output"
mkdir -p $OUTPUT_DIR

# すべてのリソースタイプを取得
RESOURCE_TYPES=$(kubectl api-resources --output=name)

# すべての名前空間を取得
NAMESPACES=$(kubectl get namespaces -o jsonpath='{.items[*].metadata.name}')

# 各リソースタイプに対してリソースの詳細を取得し、YAMLファイルに出力
for RESOURCE in $RESOURCE_TYPES; do
  # リソースが名前空間に依存するかどうかをチェック
  NAMESPACED=$(kubectl api-resources --output=name --namespaced=true | grep "^${RESOURCE}$")

  if [ -n "$NAMESPACED" ]; then
    # 名前空間に依存するリソースの場合、各名前空間で処理
    for NAMESPACE in $NAMESPACES; do
      # 出力ディレクトリを名前空間とリソースタイプ名に基づいて作成
      RESOURCE_DIR="$OUTPUT_DIR/$NAMESPACE/$RESOURCE"
      mkdir -p $RESOURCE_DIR

      # 名前空間内のリソースのインスタンスを取得
      RESOURCE_INSTANCES=$(kubectl get $RESOURCE -n $NAMESPACE -o name 2>/dev/null)

      # 各リソースインスタンスの詳細をYAMLで保存
      for INSTANCE in $RESOURCE_INSTANCES; do
        # リソース名からファイル名を生成
        FILE_NAME=$(echo $INSTANCE | awk -F '/' '{print $2}')
        
        # YAMLファイルに詳細を保存
        kubectl get $INSTANCE -n $NAMESPACE -o yaml 2>/dev/null > "$RESOURCE_DIR/$FILE_NAME.yaml"
      done

      # ファイルがない場合はディレクトリを削除
      if [ -z "$(ls -A $RESOURCE_DIR)" ]; then
        rmdir $RESOURCE_DIR
      fi
    done
  else
    # 名前空間に依存しないリソースの場合
    RESOURCE_DIR="$OUTPUT_DIR/cluster-wide/$RESOURCE"
    mkdir -p $RESOURCE_DIR

    # クラスタ全体のリソースのインスタンスを取得
    RESOURCE_INSTANCES=$(kubectl get $RESOURCE -o name 2>/dev/null)

    # 各リソースインスタンスの詳細をYAMLで保存
    for INSTANCE in $RESOURCE_INSTANCES; do
      # リソース名からファイル名を生成
      FILE_NAME=$(echo $INSTANCE | awk -F '/' '{print $2}')
      
      # YAMLファイルに詳細を保存
      kubectl get $INSTANCE -o yaml 2>/dev/null > "$RESOURCE_DIR/$FILE_NAME.yaml"
    done

    # ファイルがない場合はディレクトリを削除
    if [ -z "$(ls -A $RESOURCE_DIR)" ]; then
      rmdir $RESOURCE_DIR
    fi
  fi
done

echo "全てのリソースが出力フォルダに保存されました。"
```

上記の内容を記載した`output-k8s.sh`ファイルを作成し、以下のコマンドを実行する

```shell
chmod +x output-k8s.sh
bash ./output-k8s.sh
```

### 出力フォルダの確認

outputフォルダが作成されている
outputフォルダの中身は
Namespace > pod, service, deployment, role, service account等のK8sコンポーネント種類 > 各Pod等のYAMLファイル
という構造になっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306043/c0d0ea43-eaf3-9f07-fec3-dbe59d44ab16.png)

# まとめ

作成してみたものの、圧倒的に、![K9s](https://k9scli.io/)というCLIツールを使用したほうが、早い気がしました。

K9sのインストール方法や使い方はこちら↓の公式ページを御覧ください

https://k9scli.io/
【ネットワーク】3分間NetWorking 第1回～第3回 LANとWAN 帯域幅、プロトコル

# はじめに
この記事は、3分間NetWorkingを読んでインプットした知識をアウトプットするために執筆しています。
学習内容のまとめ、学習してみての所感や疑問などを記載しています。
記事を読んでみて、間違っていることへの指摘や感想などありましたら、ぜひコメントをいただければと思います。
3分間NetWorkingのリンクは以下の通り。
https://www5e.biglobe.ne.jp/aji/3min/
# 学習内容まとめ
### LAN(Local Area Network)
建物内などの狭い範囲のネットワーク。PCやルーター、プリンターを相互に接続している。
各ネットワーク機器はLANケーブルで繋がり、ケーブルは自分で敷設する必要がある。
各ネットワーク機器の距離が近ければ近いほど、通信速度は速く、通信の質は高くなる。

### WAN(Wide Area Network)
LANとLANを繋いだネットワーク。例えば東京本社のデータベースに大阪支社からアクセスするために、それぞれのLANを繋げてWANを形成する必要がある。

ケーブルを物理的に自分で敷設することは難しいため、電気通信事業者（キャリア）から電話回線を借りて通信を行う。
電話回線はLANケーブルに比べて、通信速度が遅く、エラーが発生しやすい。

### 帯域幅
帯域幅とは、簡潔に言うとデータの転送速度を指す。帯域幅とは、実際には使用できる周波数の幅のことを指す。
※データの転送速度＝1秒間に何bitのデータを送ることができるか

帯域幅が広い＝使用できる周波数が多く、転送速度が上昇する。
帯域幅が狭い＝使用できる周波数が少なく、転送速度が低下する。

例）帯域幅を道路に見立てた場合、片側1車線道路だと1台ずつしか車が通れない。
片側2車線道路は2台ずつ車が通れる。車をデータに変換すると、単純に1秒間に送ることができるデータ量が2倍になる。
稀に超大型トラックのような1台で2車線使う車がある。これはデータが大きく、1つのデータで帯域幅を多く使うということになる。

### プロトコル
通信を行う時の約束事をプロトコルと言う。
プロトコルを決めておかないと、相手との通信を行う際に、どのように通信して良いか分からなくなってしまう。
プロトコルはTCP/IPがデファクトスタンダードとなっている。

# 用語まとめ
**電気通信事業者（キャリア）**：固定電話や携帯電話、プロバイダなど電気通信サービスを提供する企業のこと。
**デファクトスタンダード**：標準という意味。
**bit**：情報量の単位。bitは最小単位となる。

# 所感・疑問
**LANでも有線LANと無線Wi-Fiではまた別の話になってくるのだろうか。**
Wi-Fiだと通信速度も低速で、繋がらないこともままある。
どうしてWi-Fiだと通信が不安定になるのか、今までは何となくケーブル繋いでいないから、電波だからと思っていたが、しっかりと理由を調べてみよう。

**帯域幅は広い、狭いはどのように決まるのだろうか。**
自分で設定できるものなのか、ネットワーク機器や環境に依存するのだろうか。
もっと掘り下げてみよう。
作業メモ: uvからtestpypiにpublish

# はじめに
uvで作成したpythonライブラリをtestpypiにアップロードしたときの作業メモです。

以下の3ステップで行けました。簡単でした。

- uv init testlib --lib
- uv build
- uv publish --publish-url https://test.pypi.org/legacy/ --token $TEST_PYPI_TOKEN

# 環境
- M1 macOSで作業しました。
- uv（バージョン0.4）をインストール済みとします。
- testpypiのアカウント作成済みとします。
- testpypiのトークンを作成済みとします。
- testpypiのトークンを環境変数TEST_PYPI_TOKENに登録済みとします

# 補足
- pypiにuploadするときは、--publish-urlを省略し、tokenはUV_PUBLISH_TOKEN環境変数に登録するとよいです。
- pipからtestpypiを試したい場合は以下
  - mkdir test && cd test && uv venv && source .venv/bin/activate && uv pip install ipython # テスト用のuv仮想環境作成
  - uv pip install --index-url https://test.pypi.org/simple/ --extra-index-url https://pypi.org/simple/ your-package
  - ipython環境でいろんなコマンドをテスト

# 参考
- https://packaging.python.org/ja/latest/guides/using-testpypi/
インスタンスストアとEBSの違いと用途まとめ

# インスタンスストアとEBSの違いと用途まとめ

AWSのEC2インスタンスを利用する際、ストレージの選択は重要なポイントです。ここでは、**インスタンスストア**と**Elastic Block Store (EBS)** の違いと、それぞれの使用用途について説明します。

## インスタンスストア
### 説明  
インスタンスストアは、EC2インスタンスに直接接続された一時的なストレージです。コンピュータをシャットダウンするとデータが消えるため、長期保存には適していませんが、非常に高速なアクセスが可能です。データにすぐアクセスする必要がある場合に便利です。

### 使用用途  
- **一時的なデータ処理**: ビデオ編集やデータ処理の際、編集が完了するまでの一時的な保存に利用。
- **キャッシュ**: ウェブサイトやアプリケーションのデータを高速に保存し、アクセス時間を短縮するために活用。
- **実験やテスト**: 新しいアプリやソフトウェアを試す際に、一時的なデータ保存として利用。

---

## Elastic Block Store (EBS)
### 説明  
EBSは、EC2インスタンスから独立して管理される永続的なストレージです。インスタンスが停止またはシャットダウンされてもデータが失われることはありません。スナップショット機能により、データのバックアップやリストアが可能で、信頼性の高いストレージです。

### 使用用途  
- **データベース運用**: 常時アクセスが必要な企業のデータベース運用に最適。
- **アプリケーションデータ保存**: ウェブアプリやサービスが利用するユーザー情報や設定を保存するのに適しています。
- **バックアップ**: 大切なデータをスナップショットとして定期的に保存し、必要に応じて復元することが可能。

---

## まとめ  
- **インスタンスストア**: 一時的で高速なストレージ。短期間のデータ処理やキャッシュ、実験に適している。
- **EBS**: 永続的で安全なストレージ。重要なデータの保存やバックアップに最適。

インスタンスストアとEBSはそれぞれに適した用途があるため、状況に応じて使い分けることが重要です。特に長期的にデータを保管したり、重要なバックアップが必要な場合はEBSが推奨されます。一方で、一時的に高速なストレージが必要な場合は、インスタンスストアが有効です。
Windowsのaws-vault

### GPGインストール
参考：https://mytech-blog.com/ubuntu-aws-vault/

```
$ sudo apt-get update && sudo apt-get install -y pass gnupg
$ gpg --gen-key
   gpg (GnuPG) 2.2.27; Copyright (C) 2021 Free Software Foundation, Inc.
   ...
   公開鍵と秘密鍵を作成し、署名しました。
 
   pub   rsa3072 2024-10-09 [SC] [有効期限: 2026-10-09]
          E94E7E7733DEA707685656E1D895E3B647B56666
   uid                      sawada.taiji <sawada.taiji@jp.panasonic.com>
   sub   rsa3072 2024-10-09 [E] [有効期限: 2026-10-09]
```

```
$ MY_PUBLIC_KEY="E94E7E7733DEA707685656E1D895E3B647B56666"
$ pass init "$MY_PUBLIC_KEY"
```

```
$ emacs ~/.bashrc # 下記を追加
   export AWS_VAULT_BACKEND=pass
   export AWS_VAULT_PASS_PREFIX=aws-vault
   export GPG_TTY=$(tty)
```
Laravel 初級入門 

### 前提
- laravel初学者、触ったことない人が投稿しています
- 誤っている箇所等があればコメントでご指摘いただけると幸いです


## Laravelについて
- PHPで書かれたオープンソースのWebアプリケーションフレームワーク
- 開発者にとって使いやすい構造と豊富な機能を備え、特にWebアプリケーションやAPIの開発を効率化するために設計されている

### 主な特徴
- MVCアーキテクチャ
    - Model-View-Controller（MVC）アーキテクチャを採用しており、ビジネスロジック（Model）、ユーザーインターフェース（View）、アプリケーションの制御（Controller）を分けて管理し、コードが整理されやすく、保守性が向上する
- 豊富な機能
    - ルーティング：URLとコントローラーメソッドを簡単に結びつける
    - ORM（Eloquent）：データベース操作をオブジェクト指向で行える
    - Bladeテンプレートエンジン：独自のテンプレートエンジン「Blade」で、HTMLとPHPの混在コードをシンプルに管理する
    - 認証・認可機能：ユーザー認証やアクセス制御を容易にする機能
    - タスクスケジューラ：バックグラウンドジョブや自動化タスクの管理をサポート
- 豊富な公式ドキュメントとコミュニティ
    - Laravelの公式ドキュメントは充実し、コミュニティも非常に活発
    - オンラインリソースやプラグイン、ライブラリが豊富で、開発に役立つ情報が簡単に見つかる
- テスト機能の充実
    - PHPUnitをベースにしたテスト機能が標準であり、ユニットテストや統合テストが簡単に行える
- 柔軟な設定と拡張性
    - 拡張性が高く、サービスプロバイダを用いたモジュール式の設計が特徴
    - 設定ファイルが分かりやすく整理されており、アプリケーションの設定を柔軟に行える


### 基本的な仕組み
- ルーティング
    - URLパターンに対応する処理を定義
        ```php
        Route::get('/hello-world', function () {
            return view('hello world');
        });
        
        #引数を指定する場合
        Route::get('/hello-world', function () {
            return view('hello world',['name' => 'taro yamada', 'course' => 'Laravel']);
        });
        ```
- ビュー
    - Bladeテンプレートエンジン
        - `resources/views`フォルダに`Blade`テンプレート（`.blade.php`ファイル）を配置して、HTMLとPHPを組み合わせる
        ```
        <h1>Hello, {{ $name }}</h1>
        ```
- コントローラー
    - ビジネスロジックを整理するための場所
    - `php artisan make:controller SampleController`コマンドでコントローラを作成
    - ルートやビューと連携させます
    ```php
    class SampleController extends Controller
    {
        public function index()
        {
            return view('sample');
        }
    }
    ```

## 実際に実装してみよう
- 完了したら記載します
【HTML&CSS】margin-inlineで中央揃いやってみた

# はじめに
こんにちは。
皆さんはブロック要素を中央揃いにする時、CSSプロパティは何を使用していますか？
私は、``margin``プロパティで左右の余白にautoを指定することで中央揃いにしています。
最近、``margin``以外でも中央揃いにできるプロパティを発見したので、備忘録として残しておこうと思います。

# margin-inlineプロパティ
``margin``以外で中央揃いにする方法として、<INS>margin-inlineプロパティ</INS>を使用する方法があります。
ではmargin-inlineプロパティとは何か、MDNの解説を参考に説明します。

>margin-inline は CSS の一括指定プロパティで、論理的なインライン方向の先頭と末尾のマージンを設定します。これは要素の書字方向やテキストの向きに応じて物理的なマージンに変換されます。
引用：MDN

https://developer.mozilla.org/ja/docs/Web/CSS/margin-inline

簡単に説明すると、``margin-inline``は<INS>インライン方向(水平方向)の余白を設定</INS>することができます。但し解説にある通り、<INS>テキストの向きによって余白の位置が変わります。</INS>例えばテキストの向きが<INS>縦書きの場合、垂直方向の余白が設定</INS>されます。
論理プロパティをご存知ない方は、以下の記事で詳しく解説しているので参考にしてみてください。

https://qiita.com/tanimoto-hikari/items/d9bc520d5a100612d599

# margin-inlineプロパティで中央揃い
それでは実際に``margin-inline``を使って中央揃いをやってみます。
値の指定方法は以下の通りとなります。
>margin-inline プロパティは、 1 つまたは 2 つの値を使用して指定します。
1 つの値が指定された場合は、先頭と末尾の両方に同じマージンを適用します。
2 つの値が指定された場合は、 1 つ目のマージンが先頭に、 2 つ目のマージンが末尾に指定されます。
引用：MDN

以下のコードでは、``div`` 要素に``margin-inline:auto``を使用することで、左右に均等な余白が設定されます。
これにより要素は中央揃いになります。

<p class="codepen" data-height="300" data-default-tab="html" data-slug-hash="PoMzPmp" data-pen-title="margin-inline/中央揃い" data-user="iwdulmiq-the-builder" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/iwdulmiq-the-builder/pen/PoMzPmp">
  margin-inline/中央揃い</a> by 丸山悠希 (<a href="https://codepen.io/iwdulmiq-the-builder">@iwdulmiq-the-builder</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>
※ "Result"ボタンを押すとプレビューが表示されます。

# テキストの向きが垂直方向の場合
MDNにもサンプルが掲載されていいますが、テキストが垂直方向の時にどのような動きをするか実際にやってみました。
テキストの向きを垂直方向に設定し、``margin-inline: 100px 0``を指定すると、要素の上に100pxの余白ができました。このように、テキストの向きによって余白の位置が変わることが分かりました。

<p class="codepen" data-height="300" data-default-tab="html" data-slug-hash="zYgBvLg" data-pen-title="margin-inline/垂直方向" data-user="iwdulmiq-the-builder" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/iwdulmiq-the-builder/pen/zYgBvLg">
  margin-inline/垂直方向</a> by 丸山悠希 (<a href="https://codepen.io/iwdulmiq-the-builder">@iwdulmiq-the-builder</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>
※ "Result"ボタンを押すとプレビューが表示されます。

# 最後に
本記事では、``margin-inline``プロパティを使用した要素の中央揃いを紹介しました。
結局どのプロパティを使うのがベストなの？と思う方もいると思います。筆者としては、左右の余白のみ指定する時は``margin-inline``プロパティ、上下左右の余白を設定する時は``margin``プロパティを使うようにしています。このほうが個人的にコードが読みやすいと思ったからです。もちろん自由に記述していただいて構いませんが、一つのアイディアとして参考にしていただければ幸いです。
長々とありがとうございました。
【基本情報】独学マラソン メッセージ認証 Day 10

課題の分離が結果的に自他の成長を促進させる
アドラー心理学より

:::note worn
この記事は自分用の備忘録です。
:::



# メッセージって改ざんできるの？
通信中のパケットを傍受して内容を変更できたりするらしい

https://github.com/NIFCLOUD-mbaas/UserCommunity/issues/1075

スマホゲーでガチャし放題ができそうこわい

# メッセージ認証とは？
データが改ざんされていないか確認するプロセス
MAC (Message Authentication Code)を使う
デジタル署名と違い、誰が送ったのかまではわからない
その分処理が早い

### 仕組み

図解が一番わかりやすいので

![スクリーンショット 2024-10-09 23.00.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3736578/a6488712-c520-e70c-514a-d945bdc705f0.png)

https://zenn.dev/torachi0401/articles/message_authentication_code1

### ハッシュ関数？
例えば「りんご」をハッシュ関数に入れたら「3」が返ってくる
「みかん」だと「banana」が返ってくる
このように、何か値を入れたら決められたルールで変換された値が返ってくる
その値がハッシュ値で、ハッシュ値を生成する関数がハッシュ関数
同じ値を入れたら毎回同じハッシュ値が返ってくる
ハッシュから元の値を推測するのはほぼ無理

- 実際の例
    - りんご
        - f372b9d4b8c5a8a6f9639c5c43b9839c8f0498ab3341203dc5c1e7a8ad6bbbd2

- セキュリティを強化するために、りんご＋ランダムの値（ソルト値）など工夫して作るらしい
    - 固有名詞だと狙われるから

### 共通鍵？
データを暗号化、復号化できるもの
- 例
    - a3f5b6c24d78e2f914a90bfe12345678

railsのmaster.keyみたいなもんかな？
共有するときは気をつけないといけない

この共通鍵とハッシュ値を使って、メッセージの送信者と受信者はMACを作る
それが一致すれば改ざんされていないということ



# 感想
セキュリティ対策がされていない時代もきっとあったはずだから
今のAI発達によるセキュリティ突破もダークウェブ界隈では恐ろしいことになっているのかもしれない


# 参考

今回は本文中に載せたので割愛
Symbol-SDK(JavaScript/TypeScript) ビルド

まだ公開されていない SDK 使いたくなりますよね。

## 実行した環境
- Ubuntu 22
- Symbol サーバがビルドできる環境

## 準備
### 必要なパッケージをインストール
#### lark インストール
```bash
pip install --user lark
```
#### Rust インストール
```bash
curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh
```
インストール方法を聞かれたら 1 を選択する。
```bash
source "$HOME/.cargo/env"
rustc --version
```
#### wasm-pack インストール
```bash
cargo install wasm-pack
```

## Symbol-SDK ビルド
### クローン
```bash
git clone https://github.com/symbol/symbol.git
```

### ビルド
```bash
cd symbol/sdk/javascript/
```

```bash
npm i
```

```bash
./scripts/ci/build.sh
```

### rustc 1.82.0 だと失敗する

```plaintext
Error: failed to execute `wasm-opt`: exited with exit status: 1
  full command: "/home/harvestasya/.cache/.wasm-pack/wasm-opt-1ceaaea8b7b5f7e0/bin/wasm-opt" "/home/harvestasya/symbol-repo/symbol_dev/sdk/javascript/_build/wasm/node/symbol_crypto_wasm_bg.wasm" "-o" "/home/harvestasya/symbol-repo/symbol_dev/sdk/javascript/_build/wasm/node/symbol_crypto_wasm_bg.wasm-opt.wasm" "-O"
To disable `wasm-opt`, add `wasm-opt = false` to your package metadata in your `Cargo.toml`.
```



1.81.0に変更する。

toolchain listを確認する。

```plaintext
$ rustup toolchain list
stable-x86_64-unknown-linux-gnu (default)
```

1.81.0をインストールしてデフォルトを変更する。

```bash
rustup toolchain add 1.81.0
rustup default 1.81.0-x86_64-unknown-linux-gnu
```

デフォルトが1.81.0になったことを確認する。

```
$ rustup toolchain list
stable-x86_64-unknown-linux-gnu
1.81.0-x86_64-unknown-linux-gnu (default)
```

このままだと、またstableに戻されるので`scripts/ci/build.sh`を編集する。
`rustup default stable`をコメントアウト。

```scripts/ci/build.sh
#!/bin/bash

set -ex

bash scripts/run_catbuffer_generator.sh dryrun
bash scripts/run_catbuffer_generator_ts.sh dryrun

# build wasm variants
cd wasm
#rustup default stable
wasm-pack build --release --no-typescript --target nodejs --out-dir ../_build/wasm/node
wasm-pack build --release --no-typescript --target web --out-dir ../_build/wasm/web
cd ..

# build frontend webpack
npm run bundle

# build TS bindings
npx tsc -p ./tsconfig/build-bindings.json
npx tsc -p ./tsconfig/check-bindings.json
npx tsc -p ./tsconfig/check-examples.json
```

再度、`scripts/ci/build.sh`を実行する。

## 使いたいプロジェクトにインストール
```bash
npm i symbol/sdk/javascript/
```
or
```bash
yarn add symbol/sdk/javascript/
```
M5NanoC6のライブラリーで遊ぶ。(M5NanoC6.h)



参考


↓クリック


https://logikara.blog/m5nanoc6-setting/


↑クリック


x 過去ログを見よ!!
x Adafruit_NeoPixel.hをインストール



インストール

![o_coq500.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/bec7473f-937c-8e7a-ae7f-e5bb092b1cca.jpeg)

![o_coq499.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/0a27206a-1a0b-2a7a-939b-c4558d36bba8.jpeg)


![o_coq501.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/54f39f79-0fe6-db69-aef2-f71c48698204.jpeg)


結果

![o_coq502.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/2a963244-40fe-a1e8-cc18-599d88ab3879.jpeg)


プログラム



```c++


/**
 * @file rgb_led.ino
 * @author SeanKwok (shaoxiang@m5stack.com)
 * @brief
 * @version 0.1
 * @date 2024-03-19
 *
 *
 * @Hardwares: M5NanoC6
 * @Platform Version: Arduino ESP32 Board Manager v3.0.0-alpha3
 * @Dependent Library:
 * M5NanoC6: https://github.com/m5stack/M5NanoC6
 * Adafruit_NeoPixel: https://github.com/adafruit/Adafruit_NeoPixel
 */

#include <M5NanoC6.h>
#include <Adafruit_NeoPixel.h>

#define NUM_LEDS 1
Adafruit_NeoPixel strip(NUM_LEDS, M5NANO_C6_RGB_LED_DATA_PIN,
                        NEO_GRB + NEO_KHZ800);

void setup() {
    // Enable RGB LED Power
    pinMode(M5NANO_C6_RGB_LED_PWR_PIN, OUTPUT);
    digitalWrite(M5NANO_C6_RGB_LED_PWR_PIN, HIGH);

    strip.begin();
    strip.show();
}

void loop() {
    strip.setPixelColor(0, strip.Color(255, 0, 0));
    strip.show();
    delay(100);

    strip.setPixelColor(0, strip.Color(0, 255, 0));
    strip.show();
    delay(100);

    // 蓝色
    strip.setPixelColor(0, strip.Color(0, 0, 255));
    strip.show();
    delay(100);
}



```
モダンとは何？どこで調べたらいいの？

# モダン技術とは？

## ① モダンとは
「モダン技術」は、最新の技術を活用して効率的で拡張性のあるシステムを開発する方法です。主に以下のような特徴を持つ技術を指します：
- コードの簡潔さと開発効率の向上
- スケーラビリティ（拡張性）を考慮した設計
- 開発プロセスがシンプルであること

---

## ② モダン技術のトレンドと調べ方

### 調べ先リスト
1. **Stack Overflow Developer Survey 2024**  
   世界中の開発者が使用している最新の技術トレンドを知ることができます。  
   [Stack Overflow Developer Survey 2024](https://survey.stackoverflow.co/2024/)

2. **JetBrains Developer Ecosystem Survey**  
   JavaScriptやTypeScriptを中心とした開発ツールや技術に関するデータが豊富です。  
   [JetBrains Developer Ecosystem Survey](https://www.jetbrains.com/research/devecosystem/)

3. **GitHub Octoverse**  
   オープンソースプロジェクトで使用されている技術トレンドを確認できます。  
   [GitHub Octoverse](https://octoverse.github.com/)

   ※英語が苦手な方は、翻訳機能を活用するのがおすすめです。
![スクリーンショット 2024-10-10 6.58.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884985/dbb4cc58-ce04-ecba-5b3e-c195e368dd09.png)


   

---

## ③ 2024年現在のモダン技術とは

2024年のモダン技術は、以下のような技術が注目されています：

- **フロントエンド**:  
  **React**, **Vue.js**, **Next.js**などが主流で、再利用可能なコンポーネントベースの設計が人気です。

- **バックエンド**:  
  **Node.js**, **Python**, **Go**が人気で、非同期処理を活用した高性能なシステムが構築されています。

- **クラウドネイティブ技術**:  
  **Kubernetes**や**Docker**などのコンテナ技術が、スケーラブルで柔軟なインフラ構築に利用されています。

- **AIと機械学習**:  
  **Python**が主流で、**TensorFlow**, **PyTorch**などがAI開発で広く使用されています。

---
参考にしてみてください！
[C言語 #7] 変数③ ~変数の定義~

<!--
 <font color="c00000"></font> 赤
-->
## はじめに
こんにちは　こんばんは
最近急に寒くなってきたのでヒートテックを引っ張りだしました。（ユニクロの）
でも夜は風が冷たい...:fearful:

では今回は[前回の続き](https://qiita.com/aoiku/items/34f5920d7491dff3d72e)で <font color="c00000"> **「変数を定義」**</font>してみたいと思います。

## 変数を定義する
変数に使いたい「**型**（int float charなど...）」と「**名前**」が決まったら、コードの中で変数を使ってみたいと思います。まず初めに「 <font color="c00000">**変数を用意する**</font>」という作業が必要になります。これは...

 <font color="c00000">**変数を定義する**</font>

と呼ばれています。変数は次のように定義します。

```c
// 型名 識別子;
```
変数の定義は１つの文となるので、最後に **セミコロン（;）** をつけます。
```c
int number;    // ①int型の変数numberです
float min;    // ②float型の変数minです
char text;    // ③char型の変数textです
double average, max;    // ④double型の２つの変数averageとmaxです
```
①は**int型**の変数numberを定義した文です。
②は**float型**の変数minを定義した文です。
③は**char型**の変数textを定義した文です。
④は**double型**の変数averageとmaxを２つまとめて定義したものです。

:upside_down: このように、変数は**カンマ（,）** で名前を区切り、１つの文の中にまとめて定義することもできます。

変数を定義すると、その名前の変数をコードの中で使っていくことができるようになります。
## おわりに
今回のちょっとしたまとめになります。

:::note info
変数は **「型」と「名前」を指定して定義** します
:::
:::note info
変数を定義すると、**変数が用意されます**
:::

今回は変数を「定義」する仕組みについて学びました。次回は定義した変数を**使ってみたい**と思います。最後までお読みいただきありがとうございました！

> **「参考書」**
[やさしいC 第5版 (「やさしい」シリーズ)](https://www.amazon.co.jp/%E3%82%84%E3%81%95%E3%81%97%E3%81%84C-%E7%AC%AC5%E7%89%88-%E3%80%8C%E3%82%84%E3%81%95%E3%81%97%E3%81%84%E3%80%8D%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E9%AB%98%E6%A9%8B-%E9%BA%BB%E5%A5%88/dp/4797392584)
>
パッケージのインストール：障害があるパッケージ


+ [パッケージのインストール：障害があるパッケージ](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007igBAu)
+ [社員募集アプリケーション用のデータモデルの作成のパッケージについて](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007igBAu)

:::note
私も試しにインストールしてみましたが、以下のようにエラーになります。

何かパッケージの入替か障害が発生しているのではないでしょうか？

トレイルヘッドのサポートチームに確認してみるのがいいかもしれません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/ff9cfe84-9163-8980-7d4d-caee26794457.png)
:::

# Trailhead support teamに頼むしかないみたい

+ [Iam not able to install this package from the provided link](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54V00007epmidSAA)
+ [I can't find the Install Package "04t8b000001FBRG".](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ifk27)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/e975ae97-1671-0c61-b386-d85dfd4f8694.png)

:::note
 also checked in my organization, on a new Playground, and received a similar error. So, indeed, it is necessary to submit a support ticket here to have them address this issue.

Please raise a ticket to the trailhead team using this link: https://trailhead.salesforce.com/help?support=home&category=Trailhead&casereason=Trailhead%20Technical%20Issue&questiondetail=Other%20Trailhead%20Technical%20Issue#cfPanel

私も自分の組織で新しい Playground をチェックしましたが、同様のエラーが発生しました。したがって、実際に、この問題を解決するには、ここでサポート チケットを送信する必要があります。

次のリンクを使用して、Trailhead チームにチケットを発行してください: https://trailhead.salesforce.com/help?support=home&category=Trailhead&casereason=Trailhead%20Technical%20Issue&questiondetail=Other%20Trailhead%20Technical%20Issue#cfPanel
:::

# In-App Guidanceのパッケージも

+ [How to resolve this issue?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007erxbV)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/9f940756-c07f-5bb7-648c-5aa75feca3f6.png)

:::note
I proceeded to clear the cache and logged in again and that's how it worked.
:::
Vercel AI チャットボットテンプレートの迷宮をDevv AIで攻略する方法

こんにちは、AIパワードチャットボットの世界に足を踏み入れたデザイナーです。Vercelの AI チャットボット GitHub テンプレートを発見したときの興奮は、すぐに圧倒される感覚に変わりました。未知のリポジトリを前に、どこから手をつければいいのか途方に暮れていたのです。そんなとき、Devv AIが私のデジタルシェルパとなり、ファイルとフォルダの迷宮を案内してくれました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884704/35264e28-0052-8262-c92f-bafe94a7b93a.png)

複雑さに直面する:
VercelのAIチャットボットテンプレートは、Next.js、React、Vercel AI SDKを使用してカスタムチャットボットを作成できる強力なフレームワークです。AI実装の経験が限られている私にとって、このテンプレートは完璧な出発点に思えました。しかし、深く掘り下げるにつれ、見慣れないファイルと構造の海に迷い込んでしまいました。

次々と疑問が湧いてきました：
チャットボット情報を編集するファイルはどこ？
ファビコンはどこで置き換えられる？
ナビゲーションバーのスタイリングはどこで編集する？
これらの質問に答えるため、リポジトリを検索する時間が増え、チャットボット構築という本来の作業から気が散ってしまいました。

Devv AI：デジタルシェルパの登場
途方に暮れていたとき、Devv AIに助けを求めることにしました。他のAIアシスタントが曖昧な提案をするのとは違い、Devv AIはリポジトリ構造について正確で実用的な情報を提供してくれました。

例えば、チャットボット情報の編集について尋ねたとき、Devv AIは単に可能性のある場所を示唆するだけでなく、正確なファイル位置を指摘してくれました。これにより、何時間もの検索と推測の時間を節約できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884704/5ed7c764-0e47-3f3e-6336-424dc9f379fd.png)

効率的なリポジトリナビゲーションの力:
Devv AIを使い続けるうちに、ファイル探しの雑務からどれだけ時間を節約できているかに気づきました。リポジトリ構造をナビゲートする時間を費やす代わりに、チャットボットの実際の開発に集中できるようになりました。
Devv AIのリポジトリ構造に関する文脈を理解した回答を提供する能力は、非常に価値がありました。具体的には：
特定のファイルとコンポーネントをすぐに見つけられる
プロジェクトのファイル構成を理解できる
コードベースの異なる部分を効率的にナビゲートできる
この効率的なアプローチにより、リポジトリナビゲーションに悩まされることなく、チャットボット開発の創造的な側面に集中できました。


Devv AIコミュニティに参加して報酬を獲得しよう:
Devv AIとの旅は時間の節約だけでなく、AI開発の新しい可能性も開いてくれました。そして今、Devv AIはユーザーがプロジェクトを紹介し、報酬を獲得できる素晴らしい機会を提供しています。
エキサイティングなプロモーション：Devv AI成功体験を共有しよう
Devv AIは、ユーザーの体験を祝福し、報酬を提供するキャンペーンを開始しました。参加方法は以下の通りです：
作成して共有: Devv AIを使用して完了したプロジェクトや解決したバグについて投稿する。
Devv AIをタグ付け: 投稿でDevv AIの公式アカウントをタグ付けする。
ハッシュタグを使用: #DevvAI や #AI革新 などの関連ハッシュタグを含める。
報酬ティア
レベル1: 投稿してDevv AIをタグ付けするだけで、2週間のDevv Proアクセスを獲得！
レベル2: 10以上のいいね/アップボートを獲得し、次の注文で$20オフ。
レベル3: 50以上のいいね/アップボートで、次の購入で$100の割引を獲得。
このプロモーションは、将来のDevv AI使用料を節約するだけでなく、革新的な開発者やAI愛好家のコミュニティとつながる素晴らしい方法です。

私自身、チャットボットの旅が進むにつれて、さらに多くの体験を共有していく予定です。Devv AIはこのプロセスで非常に貴重なパートナーとなっており、他の開発者がこの強力なツールで何を達成するのか楽しみです。

あなたも、Devv AI成功体験を今すぐ共有し、AI開発の未来を形作る革新者のコミュニティに参加しませんか？
[Swift] Live Activity関連の非推奨コードへの対応　'request(attributes:contentState:pushType:)' was deprecated in iOS 16.2

## はじめに
Chat GPTにコードの相談をしていると時々非推奨のコードを返してくることがある。今回はLive Activityを実装する過程で非推奨コードのwarningと出会った。Live Activityのrequestに関する非推奨コードへどのように対応したかを備忘録も兼ねて書く。

遭遇したwarningは
```
'request(attributes:contentState:pushType:)' was deprecated in iOS 16.2: Use request(attributes:content:pushType:) instead
```
要はrequestの中のcontentStateの代わりにcontentを使えということらしい。

## 非推奨になった理由（Chat GPT曰く）

AppleはActivityKitの`Activity.request`APIを更新し、これまでの`contentState`の代わりに、より精細な情報を一元的に管理できる`ActivityContent`を使う形式に変更しました。これは、ユーザーに常に最新の情報を提供し、通知の管理を柔軟かつ拡張性のあるものにするための改良です。`ActivityContent`を使うことで、動的なコンテンツの有効期限を含めた情報を一括して設定できるようになり、アクティビティの管理がより明確になりました。

## 変更点について

### 今までのコード
非推奨となったコードの例：
```swift
let initialContentState = StatusAttributes.ContentState()
activity = try Activity<StatusAttributes>.request(
    attributes: attributes,
    contentState: initialContentState,
    pushType: nil
)
```
`contentState`パラメータを使用して、アクティビティの初期状態を設定していた。

### 新しいコード
変更後のコード例：
```swift
let content = ActivityContent(
    state: initialContentState,
    staleDate: nil
)

activity = try Activity<StatusAttributes>.request(
    attributes: attributes,
    content: content,
    pushType: nil
)
```
このように、`contentState`の代わりに`ActivityContent`クラスを使うことで、状態（`state`）と有効期限（`staleDate`）を一つにまとめて扱う形式に変更となった。

#### 今までの型とiOS16.2以降の型

- **以前：** `contentState`には、`ActivityContentState`型のデータが渡されていた。
- **現在：** 新たに`ActivityContent`型を使用し、その中に状態（`state`）や有効期限（`staleDate`）を含める形式になった。

#### どのように変更すれば良いか

1. **`ActivityContent`の作成**  
   新しい`ActivityContent`オブジェクトを作成し、その中に初期状態（`state`）と任意の有効期限（`staleDate`）を設定する。

   ```swift
   let content = ActivityContent(
       state: initialContentState,
       staleDate: nil
   )
   ```

2. **`request`メソッドで`content`を渡す**  
   `request`メソッドの`content`パラメータに新しく作成した`ActivityContent`オブジェクトを渡す。

   ```swift
   activity = try Activity<StatusAttributes>.request(
       attributes: attributes,
       content: content,
       pushType: nil
   )
   ```

## まとめ
`Activity.request`メソッドの変更により、アクティビティの状態と有効期限を一つの`ActivityContent`で包括的に扱うことが求められるようになった。これにより、情報の管理がより明確で柔軟になり、ユーザーに常に最新の状態を届ける仕組みが強化されている。この変更に合わせてコードを修正することで、最新のAPIに対応し、将来の拡張にも備えることができる。



## 参考:
[非推奨コードのドキュメント - request(attributes:contentState:pushType:)](https://developer.apple.com/documentation/activitykit/activity/request(attributes:contentstate:pushtype:))
[推奨コードのドキュメント - request(attributes:content:pushType:)](https://developer.apple.com/documentation/activitykit/activity/request(attributes:contentstate:pushtype:))
Windows Python JupyterLab 仮想環境 構築手順

WindowsでのPython仮想環境の構築とJupyter Labの使用方法を以下に示します。手順はMacの場合とほとんど同じですが、WindowsのコマンドプロンプトやPowerShellでのコマンドが少し異なります。

### 手順: Windowsで仮想環境を作成しJupyter Labを利用する方法

1. **任意のディレクトリに移動**
    まず、WindowsのコマンドプロンプトやPowerShellを開き、プロジェクト用のディレクトリに移動します。

    ```cmd
    cd C:\path\to\your\project
    ```

    上記のコマンドで、プロジェクトのディレクトリに移動します。ここでの`C:\path\to\your\project`は、あなたが仮想環境を作成したいフォルダパスに置き換えてください。

2. **仮想環境の構築**
    次に、以下のコマンドを実行して仮想環境を作成します。

    ```cmd
    python -m venv venv1
    ```

    このコマンドにより、`venv1`という名前の仮想環境が作成されます。仮想環境はプロジェクトディレクトリ内に作成されます。

3. **仮想環境のアクティベーション**
    作成した仮想環境をアクティブにするには、以下のコマンドを使用します。

    ```cmd
    .\venv1\Scripts\activate
    ```

    仮想環境がアクティブになり、プロンプトの先頭に`(venv1)`が表示されます。これにより、以降の作業が仮想環境内で行われることが確認できます。

4. **Jupyterにカーネルとして登録**
    仮想環境をJupyter Labで使用するために、以下のコマンドを実行して仮想環境をカーネルとして登録します。

    ```cmd
    python -m ipykernel install --user --name venv1 --display-name "Python (venv1)"
    ```

    このコマンドにより、仮想環境`venv1`がJupyter Labのカーネルに登録され、Jupyter Lab内で選択可能になります。

5. **Jupyter Labのインストール**
    もしJupyter Labがまだインストールされていない場合は、仮想環境をアクティベートした状態で以下のコマンドを実行します。

    ```cmd
    pip install jupyterlab
    ```

    これで、Jupyter Labが仮想環境にインストールされます。

6. **Jupyter Labの起動**
    Jupyter Labを起動するには、以下のコマンドを実行します。

    ```cmd
    jupyter lab
    ```

    これで、ブラウザが開き、Jupyter Labのインターフェースが表示されます。

7. **カーネルの選択**
    Jupyter Labで新しいノートブックを作成する際、カーネルの選択画面が表示されます。「Python (venv1)」を選択して、作成した仮想環境で作業を開始します。

### 補足: PowerShellでの仮想環境のアクティベーション
PowerShellを使用している場合、仮想環境のアクティベートコマンドは少し異なるかもしれません。

```powershell
.\venv1\Scripts\Activate.ps1
```

ただし、PowerShellの実行ポリシーによってはエラーが出ることがあります。その場合は、以下のように実行ポリシーを一時的に変更して仮想環境をアクティブ化できます。

```powershell
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
.\venv1\Scripts\Activate.ps1
```

### まとめ
この手順でWindows上でPythonの仮想環境を作成し、Jupyter Labを利用できるようになります。この仮想環境の利用により、プロジェクトごとに異なるライブラリのバージョンや設定を独立して管理することが可能になり、効率的に開発を進めることができます。
Go言語(Golang)における、goroutineとchannelの使い方の基本的な例


```go
package main

import (
	"fmt"
	"sync"
)

func main() {
	ch1 := make(chan int)
	var wg sync.WaitGroup
	wg.Add(1)
	go func() {
		defer wg.Done()
		fmt.Println(<-ch1)
	}()
	ch1 <- 10
	close(ch1)

	v, ok := <-ch1
	fmt.Printf("%v %v\n", v, ok)
	wg.Wait()

	ch2 := make(chan int, 2)
	ch2 <- 1
	ch2 <- 2
	close(ch2)

	v, ok = <-ch2
	fmt.Printf("%v %v\n", v, ok)

	v, ok = <-ch2
	fmt.Printf("%v %v\n", v, ok)

	v, ok = <-ch2
	fmt.Printf("%v %v\n", v, ok)
}
```
このコードは、goroutineを使って非同期にデータを受信し、channelを使ってデータの送受信を行う基本的な例です。

gooroutineは、Go言語の並行処理を実現するための仕組みです。goキーワードを使って新しいgoroutineを作成します。goroutineは軽量なスレッドとして動作し、独立して実行されます。

channelは、goroutine間でデータを安全にやり取りするための構造です。Goでは、channelを使って値を送受信することができます。

```go
	ch1 := make(chan int)
```
- **channelの作成**: 整数型のchannel `ch1`を作成します。このchannelは、goroutine間で整数を送受信するために使用されます。

```go
	var wg sync.WaitGroup
```
- **WaitGroupの宣言**: `sync.WaitGroup`型の変数`wg`を宣言します。これにより、複数のgoroutineが終了するのを待つことができます。

```go
	wg.Add(1)
```
- **カウントの追加**: `wg`に1を追加します。これにより、現在1つのgoroutineが終了するのを待つことを示します。

```go
	go func() {
```
- **goroutineの開始**: 無名関数を新しいgoroutineとして実行します。この関数内のコードは、メインのgoroutineとは別に並行して実行されます。

```go
		defer wg.Done()
```
- **defer文**: この行は、関数の終了時に`wg.Done()`を呼び出すことを指定します。これにより、`wg`のカウントが1減ります。goroutineが終了したことを示します。

```go
		fmt.Println(<-ch1)
```
- **channelからの受信**: `ch1`から値を受信し、その値をコンソールに出力します。`<-ch1`は、`ch1`から値を読み取る操作です。この操作は、`ch1`に値が送信されるまでブロックされます。

```go
	}()
```
- **無名関数の終了**: ここで無名関数の定義が終了し、goroutineが実行を開始します。

```go
	ch1 <- 10
```
- **channelへの送信**: メインのgoroutineから`ch1`に整数10を送信します。この操作により、先ほどのgoroutineが`fmt.Println`で受信した値として10が出力されます。

```go
	close(ch1)
```
- **channelの閉鎖**: `ch1`を閉じます。これにより、これ以上の値を送信しないことを示します。受信側は、channelが閉じられたことを知ることができます。

```go
	v, ok := <-ch1
```
- **channelからの再受信**: `ch1`から値を受信しようとしますが、`ch1`は既に閉じられているため、`ok`は`false`になります。`v`には0が設定されます（整数型のデフォルト値）。

```go
	fmt.Printf("%v %v\n", v, ok)
```
- **出力**: 受信した値`v`と、受信が成功したかどうかを示す`ok`の値をフォーマットしてコンソールに出力します。

```go
	wg.Wait()
```
- **WaitGroupの待機**: `wg`のカウントが0になるまでメインのgoroutineをブロックします。ここでは、先ほどのgoroutineが終了するのを待ちます。

```go
	ch2 := make(chan int, 2)
```
- **バッファ付きchannelの作成**: 整数型のバッファ付きchannel `ch2`を作成します。このchannelは最大2つの値を保持できます。

```go
	ch2 <- 1
```
- **channelへの送信**: `ch2`に整数1を送信します。この操作は非ブロッキングです。バッファが空いているため、すぐに送信が完了します。

```go
	ch2 <- 2
```
- **channelへの送信**: `ch2`に整数2を送信します。この操作も非ブロッキングで、バッファが空いているため、すぐに完了します。

```go
	close(ch2)
```
- **channelの閉鎖**: `ch2`を閉じます。これにより、これ以上の値を送信しないことを示します。

```go
	v, ok = <-ch2
```
- **channelからの受信**: `ch2`から値を受信します。ここでは、最初に送信された値1が受信され、`v`に1が、`ok`に`true`が設定されます。

```go
	fmt.Printf("%v %v\n", v, ok)
```
- **出力**: 受信した値`v`と、受信が成功したかどうかを示す`ok`の値をフォーマットしてコンソールに出力します。

```go
	v, ok = <-ch2
```
- **channelからの再受信**: `ch2`から次の値を受信します。ここでは、2が受信され、`v`に2が、`ok`に`true`が設定されます。

```go
	fmt.Printf("%v %v\n", v, ok)
```
- **出力**: 受信した値`v`と、受信が成功したかどうかを示す`ok`の値をフォーマットしてコンソールに出力します。

```go
	v, ok = <-ch2
```
- **channelからの再受信**: `ch2`から値を受信しようとしますが、`ch2`は既に閉じられているため、`v`には0が、`ok`には`false`が設定されます。

```go
	fmt.Printf("%v %v\n", v, ok)
```
- **出力**: 受信した値`v`と、受信が成功したかどうかを示す`ok`の値をフォーマットしてコンソールに出力します。
freee APIのtax_codeまとめ

APIのリファレンスからなかなか見つけ出せなかったのでメモ。

対象外: 2
課税売上 10%: 129
課税売上 8%: 101
課税売上 8%（軽）: 156
課税売上: 21
課対仕入 10%: 136
課対仕入 8%（軽）: 163
課対仕入 8%: 108
課対仕入: 34
不課税: 20
非課売上: 23
非課仕入: 37

自分は「対象外」が使いたかったが、Claudeに何度聞いても"0"もしくは"00"と返ってきて困った。

誰かの役に立てば幸いです。
ufwで外向けの通信を遮断する

Raspberry piで外に抜けていく通信を切りたくて試行錯誤したのでメモ書き
# 経緯
ufwで通信を完全にlocalネットワークのみに制限したいのだが
googleDNS向けにpingが飛んでしまう。
```console:status
raspberrypi:~# ufw status
Status: active

To                         Action      From
--                         ------      ----
192.168.1.0/26             ALLOW       192.168.1.0/26
Anywhere                   DENY        Anywhere
```


```console:ping結果
raspberrypi:~# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=60 time=7.03 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=60 time=6.45 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=60 time=6.56 ms
```
# 結論
ルール登録時にin, outを指定しないと基本的にincomingしか適用していなかった。
なのでdenyを入れる前に以下のようにまずはallowを追加。
```
ufw out allow from 192.168.1.0/24 to any 192.168.1.0/24
```

outgoing向けのdenyも追加。
```
ufw out deny from any to any 
```

そもそもstatusを見るときにverboseをつければおもいっきりINとOUTって書いてある。
```console:status
raspberrypi:~# ufw status verbose
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 192.168.1.0/26             ALLOW IN    192.168.1.0/26
[ 2] 192.168.1.0/26             ALLOW OUT   192.168.1.0/26             (out)
[ 3] Anywhere                   DENY IN     Anywhere
[ 4] Anywhere                   DENY OUT    Anywhere                   (out)
```

googleDNS向けのpingも飛ばなくなりました
```console:ping結果
raspberrypi:~# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
^C
--- 8.8.8.8 ping statistics ---
14 packets transmitted, 0 received, 100% packet loss, time 13295ms
```

# 雑記
外向けってサーバ側から締める必要あるのかといわれるとなんとも言えないが・・・（不便になるだけでは？）。
常時稼働させているというのもあり、無駄な通信を発生させたくないポリシーなのでやってみました。

あとdeault設定もdenyにしてるけどこれもoutgoingは関係ないようになってる？？？
curlコマンドても自動でhttpヘッダーに設定されるもの

curlコマンドでHTTPリクエストを送信する際、自動的に設定される主なヘッダーは以下のものです。

## 1. Host
説明: URLのホスト部分（ドメイン名やIPアドレス）に基づいて自動的に設定されます。HostヘッダーはHTTP/1.1の必須ヘッダーであり、リクエストの宛先を示します。
例: curl `http://example.com` とすると、Host: example.com が自動で付与されます。
## 2. User-Agent
説明: リクエストを送信しているクライアント（ここではcurl）の情報を示すヘッダーです。curlはバージョン情報を含むUser-Agentヘッダーを自動で付与します。
例: User-Agent: curl/7.79.1（バージョンは使用しているcurlに依存）
## 3. Accept
説明: クライアントがサーバーから受け取ることができるレスポンスのメディアタイプを指定します。curlはデフォルトで全てのメディアタイプを受け入れる設定になっているため、Accept: */* が自動的に設定されます。
例: Accept: */*
## 4. Connection
説明: 接続の持続性を指定します。デフォルトでは、HTTP/1.1の仕様に従ってConnection: keep-aliveが自動で付与されますが、HTTP/1.0の場合はConnection: closeが付与されることもあります。
例: Connection: keep-alive
## 5. Content-Length（POSTやPUTなどのリクエストでデータ送信時）
説明: リクエストボディのサイズ（バイト単位）を示すヘッダーです。データを送信するリクエスト（例えばPOSTやPUT）で、送信するデータのサイズに応じて自動的に設定されます。
例: Content-Length: 348
## 6. Expect（条件付きで設定される）
説明: POSTやPUTリクエストでサイズが大きい場合（デフォルトでは1KB以上）、Expect: 100-continue ヘッダーが自動的に追加されます。これにより、サーバーが100-continueレスポンスを返すまで、リクエストのボディ部分を送信するのを待機します。
例: Expect: 100-continue
## これら以外に自動で設定されることはない
その他のヘッダー（例えばAuthorizationやContent-Type）は、特定の条件が揃わない限り自動的には設定されません。これらは必要に応じて手動で指定する必要があります。