OmniAICreator/Qiita-1.07M huggingface dataset:
🚀 MacにNVMとNode.jsをインストール

Node.jsのバージョン管理ツールである NVM (Node Version Manager) を使ってNode.jsをインストールする手順を解説します。

# 📚 公式ドキュメント

NVMの詳細については、公式ドキュメントをご覧ください👇
https://github.com/nvm-sh/nvm

# 🛠️ NVMのインストール方法

##### NVMのインストール

公式サイトで公開されているインストールコマンドを実行します

```bash
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
```

##### プロファイルを再読み込み

インストール後、以下を実行してプロファイルを再読み込みします

```bash
source ~/.zshrc
```

##### インストール確認

```bash
command -v nvm
```

# 📦 Node.jsのインストール手順

##### インストール可能なバージョンを確認

以下のコマンドで利用可能なNode.jsのバージョン一覧を表示します

```bash
nvm ls-remote
```

表示例： `v22.11.0   (Latest LTS: Jod)`

##### Node.jsのインストール

任意のバージョン（例: 22.11.0）をインストールします

```bash
nvm install 22.11.0
```

これで、NVMを使ったNode.jsのインストールは完了です🎉

バージョン管理が簡単になるNVMをぜひ活用してください😊
【ネットワーク】URLとURI

# はじめに
こんにちは。アメリカで独学でエンジニアを目指している者です。
現在、ネットワークについて学んでいるのですが、その中で「URLとURIの違いって何だろう？」という疑問がわきました。名前が似ていてわかりづらいため、本記事でまとめてみました。


## URI (Uniform Resource Identifier)
皆さん、URLについてはご存じだと思いますので、今回はURIについて説明していきます。
URIは**リソースを一意に（重複しないように）識別するための文字列全般**を指します。
ここでいうリソースとは、ウェブページ、画像、ファイル、APIエンドポイントなど、インターネット上でアクセスできるものを指します。

URIは大きく2つのタイプに分けられます
1. URL (Uniform Resource Locator): リソースの場所（アドレス）を指定する。
2. URN (Uniform Resource Name): リソースの名前を指定する。

URNの例としては、本を識別する「ISBN番号」が挙げられます。
なお、URLについては以前記事を書いたので、詳しく知りたい方は以下をご覧ください

https://qiita.com/Taira0222/items/889b6b4e8683cd195acd

これらの違いを一般的な比喩で表すと、URL・URN・URIはそれぞれ「住所」「名前」「宛先」と捉えることができます。

1. URL(住所):東京都新宿区西新宿2丁目8－1
リソースが「どこにあり」、「どのようにアクセスするか」を具体的に示します。
2. URN(名前):東京都庁(場所の詳細はわからないが、名前で識別可能)
リソースの「名前」を示しますが、その「場所」や「アクセス方法」は含まれません。
3. URI(宛先)
リソースを一意に識別するための「総称」。URLやURNを含む広い概念です。
宛先には住所（URL）や名前（URN）が含まれるため、住所だけでなく、ほかの識別方法も許容します。

# まとめ
今回は主にURIについて、一般的な例えを使いながらイメージしやすく解説しました。
ウェブを扱ううえでURNが登場する場面は少ないので、実際には「URI＝URL」をイメージしても、そこまで大きくはずれないと思います。
AI駆動開発勉強会（第5回）レポート

オンサイト＋オンラインで開催されたAI駆動開発勉強会（第5回）に参加したので、そのレポートです。

https://aid.connpass.com/event/340284/

## AI駆動開発とは

- 要件整理、UI/UXデザイン、設計、コーディング、テスト、リリース、インフラ構築などをAIを活用を前提にした開発プロセス

## OpenAI Operatorについて

- 食料品の購入や情報収集など、人々の日常的なタスクをAIへ依頼できるようになる

### 所感
- 画像生成にしてもCopilotのコード提案にしても、これまではAIを直接的に活用する人は限られていたが、それこそスマホが普及したように人々が日常的にAIを活用する世界が迫ってきていることを感じた

## Github Spark

- アプリの仕様を自然言語で指示するだけでAIが勝手に実装してくれるサービス
    - デモとしてオセロアプリの実装を見せてもらったが、人が指示を入力するだけでオセロの盤面が目まぐるしく変わっていた。具体的に何が起きているのかはわからなかったので、実際に使って理解したい

### 所感
- これまでエンジニアはコードを書くことが前提にあったが、Githubはすでにその先の未来を見ているように思った。ITエンジニアの世界がAIによってこれからどう変わるのかは未知数だが、どのように変わったとしてもその変化に遅れないよう、変化を注視していく必要がある

## Copilot Extensions

- AIエージェントをcopilotに召喚することができる
- 外部サービスとの連携やアクションの実行が可能
    - 例えば、Confluenceなどのナレッジ共有ツールやSlackのチャット履歴を活用することができるようになる？
    - AIエージェントがプロジェクト固有のナレッジを活用してさまざまな課題の最適な解決策の提案などができるようになるかも

### 所感
- プロジェクトが大規模になるにつれてプロジェクトの全容を把握することが困難になっていくが、プロジェクトの成長とともに成長するAIエージェントが実現できれば、そういった課題を解決できるかもしれない。なんでこの機能こういう風に作ったんだっけみたいな質問にAIが答えてくれたら嬉しい

## テストにおけるAI活用

### Autify NoCode

- Webのツールで直感的にテストケースを作成できる
- ウェブサイトやアプリが更新された際、AutifyのAIが変更を検出し、テストケースを自動的に修正できる

### Autify Genesis

- プロダクトの仕様書や設計書をAIに伝えると自動でテストケースを作成してくれるサービス

- テストケースからテストシナリオの作成も可能
- AutifyNoCodeと連携することでテストコードの自動生成も可能になる？

### 所感
- プロダクトが成長するにつれて、E2Eテストの実装コストも増大しがち。料金にもよるが、これらのサービスの活用でE2Eテストの実装コストを半分にできたらかなり実用的なサービスだと思った。

## 個人開発におけるAIの活用

- 個人開発レベルではAI駆動開発は実用レベルに達している
    - 要件整理：ChatPGT4-o
    - UI/UXデザイン：v0
    - エディタ：Cursor
- AI駆動開発は速くなるが、品質が上がるわけではない
    - AIだけで到達できるレベルには限界がある
    - AIで実装したレベルからリリースできるレベルに持っていくには、コーディングのスキルと根性が必要
- AIが作成するデザインは、AIが生成した画像や文章と同じ課題を抱えている
    - 人はいかにもAIが作成した画像や文章に対してあまり価値を感じることができない
    - デザインも同じで、いかにもAIが作成したっぽいテンプレデザインが存在し、そのデザインをそのまま使うとそのサービスの価値が過小評価されかねない
    - 人々に価値を感じてもらうには、AIが出力したデザインをそのまま使うのではなく、人間自身が使う人のことを考えた工夫を凝らす必要がある

## 全体的な所感
AIの活用により、開発者はより創造的な仕事に集中できる未来が想像できました。
これまでは実装スピードの大部分はコーディングスキルが占めていましたが、今後はそれに加えAIの活用スキルも大きく影響してきそうです。
とはいえ、現状AIで実装できるレベルには限界があり、サービスのクオリティと品質を高めるには人間の開発スキルが必要となります。
それはAIがさらに発展したとしても変わらず、人間はAIでは代替できない、より高度なスキルを扱うようになっていくだけなのかなと思います。
AIに仕事が奪われるという未来を想像するのではなく、AIと協働して開発する未来を目指して、より一層スキルを磨いていきたいです。
ABC390

久しぶりにAtCodeに参加した．完全に分からなかった．今まではCくらいまでは解けていたのに今回は，Aしか解けなかった．
これからはちょくちょく頑張ろう．

```python
import sys

input = sys.stdin.readline
n = list(input().split())
count = 0
ans= False
for index,mm in enumerate(n):
    if (index+1) != int(mm):
        count+=1
        if count>=2 and index != int(n(index)):
            ans = True

if count==2 and ans:
    print('Yes')
else:
    print('No')
```
Copilotの同人誌を書いてみて

年明けてますが体調ダウンしてアドベントカレンダーで書ききれなかった分をいまさら書いています。

## ノンプロ研での技術同人誌プロジェクト
所属する「ノンプログラマーのためのスキルアップ研究会」（通称ノンプロ研）では技術ライティング講座を受講後、技術同人誌の出版にチャレンジできます。年2回開催される技術同人誌即売会イベント「技術書典」等で販売できます。コミュニティ内で企画書を通す必要がありますが、書きたい内容とターゲットが明確であることや、少し需要があれば通るかと思います。

これまでノンプロ研ではノンプログラマー向けに16冊もの同人誌がでています。エクセル系やGoogle系のネタが多いです。

https://techbookfest.org/organization/5633780930838528

## 2年連続での出版
2023年はいろんな理由でBIを使えない人向けに、ExcelでBIライクなダッシュボードを作ろうという本を書きました。2024年は流行とマイブームに乗って、もっとCopilotが活用されるように無料で使えるCopilotにフォーカスした本を執筆しました。

1冊目ははじめての執筆だったため、気が付けば内容てんこもりの100ページ超の大作ができあがりましたが、2冊目はブログを書く習慣ができたことや1冊目での要領をつかんで、きちんと薄い本に仕上げることができました。値段も1冊目と比べてお手頃となっています。

https://techbookfest.org/product/wzTB84rGkRS7jaADVSi80T

https://techbookfest.org/product/75nPR6Xw4hheLHwmc517NN

## Copilotの同人誌を書いてみて
### 執筆トラブル！Copilot自体の大幅改変
2冊目は11月のイベントに向けて書いていたので、ちょうど9－10月が執筆期間でした。そのころにちょうど今回の書籍のメインであったEdgeのCopilotが大幅改変。改変されるとは事前になんとなくアナウンスはあったものの、想像以上だったため大混乱。使いたかった・伝えたかった機能がクローズになったり、改悪になったりでかなりのネタがボツになってしまい大混乱でした。また、Copilotのアウトプットの質もかなり悪化してしまいました（現在は今よりも改善されています。）

ですが、逆にUIと機能、応答がシンプルになったことで、いいこともありました。結果的にどのAIでも汎用的に使えるようなネタになったことです。また汎用的に使える使い方の紹介にしたことで、多少アップデートがあってもだいたいは引き続き使えるネタとなりました。

### 執筆もAIに頼れた
1冊目はほぼAIに頼らない執筆でしたが、今回は校正作業を中心にAIの力を借りて仕上げました。Copilotが当時ポンコツになってしまったこともあり、ChatGPT、Gemini、Perplexityを中心に使いました。それぞれいいところがあり、ChatGPTはよき先生（すぐに答えを出してくれる）、Geminiはよきメンター（いろんな提案・改善をしてくれる）、PerplexityはダウンしてしまったCopilotの代わりに検索用途・深堀で利用しておりました。

おかげさまで、同人誌編集メンバーからの指摘は1冊目よりも圧倒的に少なく、執筆開始から入稿まで実質1週間程度で作業することができました。2冊目は書籍の特性上ユーモアを入れながら書きましたが、思いつかないような言い回しもAIが出してくれてありがたかったです。

### 書籍の反響
ありがたいことに2回の増刷！会場もオンラインでも、たくさんの方に買っていただきました。オンライン活動中心の「なんでもCopilot」きっかけで購入してくださった方とも、この書籍をきっかけにリアルで交流ができたので本当に書いてよかったです。また、コパ本を職場で布教したり、読みまわししてくださったり、職場用に大量発注される方もいらっしゃって、このコパ本がAIをはじめて触る方向けの教科書的な存在にもなっていました。

ネタ本として書きましたが、意図せず社会（主語デカ？）に意味のある役割も果たすことができました。AI本は巷にたくさんありますが、同人誌の薄さ・インディーさ・気軽さもよかったのかもしれません。

またなんらか、書きたいです！！
Googleカレンダーのカンバンボードが使いやすくてオススメ

# はじめに
Googleでは様々な機能を提供していますが、その中の一つとしてTODOリストがあるのはご存知でしょうか？
昔からよく使っている機能の一つなのですが、ここ最近でカンバンのような機能に一新されました。
これがとても使い勝手が良く、作業効率が爆上がりしたので今回はこの機能についてご紹介したいと思います。

# Google Tasks

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354522/fc4b8dae-07fa-91b6-f969-aaae20b9b275.png" width="520px">

もともとGmailやGoogleカレンダー内の機能として提供されていた機能で、当初はおまけのような機能だったのですが、2018年にスタンドアロンのアプリとしてリリースされ、そこから独立した機能として利用できるようになりました。

さらにここ最近でデザインが一新され、カンバンに近い形へ変わり、とても使いやすいツールへと変貌しました。

# Google Tasksの使い方

https://tasks.google.com/

このリンクから飛んでもらうか、Googleカレンダーの以下アイコンから切り替えていただくことで使用可能です。

![スクリーンショット 2025-01-26 14.51.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354522/f11c5bd8-12dd-e817-620c-aff6b4bf4b65.png)

ちなみに執筆時点では、Googleカレンダー右側にあるTODOリストを表示すると古いデザインのまま・・・

![スクリーンショット 2025-01-26 14.54.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354522/7a837665-b39a-698a-fb4c-c7fec751fb36.png)

執筆時点ではまだ新しいデザインh変わったばかりなので、追いついていないようです。
アプリ側やgmailから飛べるTODOリストも古いデザインなので、今後に期待したいところ。

また、実際にタスクを登録する手順ですが、以下画像内にある【タスクを追加】から設定可能です。
設定したタスクは、きちんとカレンダーにも反映されます。

![スクリーンショット 2025-01-26 14.57.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354522/ede193c1-314b-493f-789a-1d0d4e378508.png)

![スクリーンショット 2025-01-26 14.57.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354522/34bb72a8-4d8e-d3d2-71b0-0c649ea16f1f.png)

カレンダーと照らしあわせながらタスクを設定、管理できたり、カレンダーとサイドバーをひと目見るだけでタスク管理を完結できたりするのが最大のメリットですね。
操作もシンプルでわかりやすく、タスクを動かしやすいのでこれであればタスク整理も時短で済みますし、とても効率的です。

他のカンバンシステムとは方向性が少々異なっていますが、Googleカレンダーの利用頻度が高い方や自身のタスク管理にお困りの方にはおすすめのツールです。
効率化につながるツールであると思いますので、是非利用してみてください。

# さいごに
医者に怒られてから本気でダイエットしています、もう少しで4キロ減・・・
【電脳少女プログラミング2088 ─壊レタ君を再構築─】初心者におすすめ！やってみた

## はじめに
先日、paizaが新作ゲーム「電脳少女プログラミング2088」をリリースしたので遊んでみた！

## 概要
このゲームはWebサイトで遊べるゲームであり、用意された問題を解いていくことで、ゲーム内キャラクター「レイミ」の衣装や表情などをゲットできる。
問題のレベルはS(最難関), A〜Eがある。
ゲームは[こちら](https://ppg.paiza.jp/denno2088/ "電脳少女プログラミング2088")から

## D. カジノ (簡単め)
※問題は実際のゲームから抜粋
![d1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1938842/15c44dd7-15ee-23ed-cc4f-956ba580eeda.png)
最初のプログラミングの問題はこんな感じ。

```python
dollar_1 = int(input())
dollar_5 = int(input())
dollar_10 = int(input())

sum = dollar_1 * 1 + dollar_5 * 5 + dollar_10 * 10
print(sum)
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1938842/14878ff3-a776-313f-3b4d-3881520ba402.png" width=50%>

クリア！！！！
これで一つレイミの衣装をゲット！！！！
ね？簡単でしょ？

あとこのゲーム、最後の結果の画面でコードのbyte数が見られるから、そこを突き詰めるのも面白さの一つ！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1938842/4a6180ec-fe23-e756-1168-6aca79f51118.png" width=50%>
半分以下になりました！
こんな感じでより短いコードを書けるか選手権(ランキングイベント)もやってるみたい((早い者勝ちゲームでもありますが...))

色々面白い問題がいっぱいあるのでそれは是非是非、ご自身の手で解いてみてはいかがでしょうか〜！

やってみよう！って思った方、この記事いいな！って思った方はいいね❤️ぜひお願いします！忘れない様に保存も👍

ゲームは[こちら](https://ppg.paiza.jp/denno2088/ "電脳少女プログラミング2088")から！！
MacでGitHubリポジトリをクローンする際にアクセストークン入力で詰まった件

<h2>つまずいたところ</h2>
<p>GitHubでリモートリポジトリの内容を、ローカル環境にクローン(コピー)する際、ターミナルへ <ins>アクセストークンを入力したいのに、ユーザー名とパスワードを求められてしまった。</ins></p>

## 解決方法

1：ターミナルで、クローンを作りたいディレクトリ(フォルダ)へ移動
```
$ cd /Users/あなたのユーザー名/Documents/your_project_directory
```

2：以下の「git clone」コマンドで 実行しました。

```
$ git clone https://<あなたのGitHubユーザー名>:<作成したアクセストークン>@github.com/ユーザー名/リモートリポジトリ名.git
```

※注意点※
生成されたアクセストークンは一度しか表示されません。
アクセストークンw「Developer settings」>「Personal access tokens」から制作したら、必ずコピーしておきましょう（自分への戒め）
Rustを少しだけ...

# Rust（ラスト）
Rustは、効率的で信頼性の高いソフトウェアを誰でも作成できるように設計されたプログラミング言語です。
マルチパラダイムをサポートしており、手続き型プログラミング、オブジェクト指向プログラミング、関数型プログラミングなど、さまざまな実装手法を活用できます。
コンパイル基盤にはLLVMを使用しており、強力な型システムとリソース管理機構により、メモリ安全性が保証されています。

### 目次
- 言語の仕様や文法について
- 環境構築
- 実際に環境を構築する
- hello world
- 問題

# Rustの資料
- [The Rust Programming Language 日本語版](https://doc.rust-jp.rs/book-ja/title-page.html
)
Rustの教科書。これを読めばまともなコードが書ける。

- [Rust Language Cheat Sheet](https://cheats.rs/)
Rustの文法のチートシート。

## 言語の仕様や文法について
Rustは、メモリの安全性を保証しながら、低レベルな制御も可能にするプログラミング言語である。その核となるのが「所有権」と「借用」の仕組みであり、コンパイラがコード内の参照やライフタイムを厳密にチェックする。この仕組み（borrow checker）のおかげで、二重解放やダングリングポインタといったメモリバグをコンパイル時に未然に防ぐことができる。

この仕組みにより、Rustは高い安全性を提供し、特にマルチスレッド環境においてもデータ競合やメモリ破壊のリスクを大幅に低減している。さらに、プログラム全体のメモリ管理をコンパイラがサポートしてくれるため、大規模な開発プロジェクトでも安定した運用が可能である。

しかし、この安全性を実現するための所有権やライフタイムの概念は一筋縄ではいかず、習得には一定の学習コストが伴う。また、コンパイラがすべてを管理できるわけではなく、場合によっては低レベルな制御が必要になる場面もある。

~~~Rust:変数宣言
fn main() {
    let a; //定数に変数を代入
    let b = 5; //定数に変数を代入
    let mut = 1; //可変
}
~~~
~~~Rust:四則演算
fn main() {
    // 足し算
    let sum = 10 + 10; //結果は20

    // 引き算
    let difference = 9.5 - 4.4; //結果は5.1

    // 掛け算
    let product = 4 * 10; //結果は40

    // 割り算
    let quotient = 50 / 25; //結果は2
    let floored = 2 / 3; // 結果は0

    // 余り
    let remainder = 213 % 2; //あまり1
}
~~~
~~~Rust:大文字小文字変換
fn main() {
    let str: String = "SuPerNova".to_string();

    println!("{}", str.to_uppercase()); // SUPERNOVA
    println!("{}", str.to_lowercase()); // supernova
}
~~~
~~~Rust:入力受付
fn main() {
    let mut hoge = String::new();
    std::io::stdin().read_line(&mut hoge).ok();
    let answer = hoge.trim().to_string();
    print!("{}",answer);
}
~~~
# 環境構築
### Rustをインストールする。
https://www.rust-lang.org/ja

この公式サイトからダウンロード。
もし一度ダウンロードしている場合はアップデートをする。
~~~:コマンドプロンプト
$ rustup update stable
~~~

### VSCodeの拡張機能の紹介
下記の拡張機能をインストール

#### rust-analyzer
VSCodeにRustのサポート

#### CodeLLDB
高機能デバッガー

# 実際に環境を構築する
~~~ : コマンドプロンプト
cd ~/
cargo new rust_hello_world
# Created binary (application) `rust_hello_world` package
cd rust_hello_world
code .
~~~
上記のコードをVSCodeのコンソールに打ち込みましょう（コピーペーストでも構いません）。

C:\Users\user\rust_hello_world
上手くできていればこのディレクトリにファイルが存在しています。

# 問題1: Hello,Worldと出力するプログラム
コンソール上にHello,Worldと出力してください。
~~~Rust:入力例
なし
~~~
~~~Rust:出力例
Hello,World
~~~
# 問題2: 文字列内の大文字と小文字を入れ替えるプログラム
与えられた文字列に対して、大文字を小文字に、小文字を大文字に変換して出力するプログラムを作成してください。

~~~:与えられる文字列
RustProgramming
~~~

~~~:出力例
rUSTpROGRAMMING
~~~

### 補足:
差の絶対値を計算して比較します。
複数候補がある場合は小さい値を選択します。

# 問題3: 数字の桁和を計算する関数を作成するプログラム
標準入力から1つの整数を受け取り、その整数の各桁の和を求める関数を実装してください。関数を作成し、桁の合計を返すようにしてください。
~~~Rust:入力例1
12345
出力例1:
~~~
~~~Rust:
合計:15
~~~
~~~Rust:入力例2
987
~~~
~~~Rust:出力例2:
合計:24
~~~

# 終わりに
少しだけラストを触るための情報を載せた。Rust入門の参考になれば幸いだ。
LeftHookでUI開発もAPI開発もどっちも捗った話

初投稿です。
DevContainerを用いたフルスタックでの開発にLeftHookがとてもマッチしたので紹介します。
UI側はBun(Node.js)、API側はPythonを使用しています。

## [LeftHook](https://lefthook.dev/)とは

LeftHookは一言でまとめると「マルチプラットフォーム対応のGitフック管理ツール」です。
似たようなツールとしては[Husky](https://typicode.github.io/husky/)や[pre-commit](https://pre-commit.com/)等があります。

### 機能のざっくり説明

コミット前やプッシュ前に任意のコマンドを実行できます。

### 例（以下のようなことができます）

* コミット前にステージングされているファイルに対してフォーマットを行い、修正された内容も含めてコミットを上げる
* コミット前にリントやビルドを実行して、なんらかのエラーがあった場合はコミットさせない
* コミット前にコミットメッセージの検証を行い、エラーがあった場合はコミットさせない

上記で挙げた例以外にも、プッシュ前に何か行ったり、上記のすべてを同時に行ったり等も可能です。

### なぜLeftHookなのか

例に挙げた内容は上述したHuskyやpre-commit等でも可能です。
その中で私がLeftHookを推す理由はひとえに***マルチプラットフォーム対応***だからです。
> 他にもいいとこいっぱいあるよ

Huskyの場合は導入にNode.jsが必須です。
ただ、私の場合はDevContainerで開発を行っているため、API側にHuskyを導入したい場合は、そのためだけにPythonのDevContainerにNode.jsも入れないといけません。逆も然りです。
これは正直微妙だと思いました。

かといって、UI側はHusky、API側はpre-commitとそれぞれ別のツールを導入するとその分学習コストが増し、管理も大変そうです。

この点、LeftHookは環境の差異を気にしないでいいのがとても良い点だと思いました。

## 導入について

詳細は[こちら](https://lefthook.dev/installation/index.html)

UI側もAPI側もやることは同じです。

インストールして`lefthook.yml`を書いて`lefthook install`するだけです。
そうしたら、lefthook.ymlに書いた通りにGitフックが作成されて実行されます。

参考までに私のlefthook.ymlを置いておきます。

<details><summary>UI側のlefthook.yml</summary>

> コミット時にBiomeのリントとNext.jsのビルドを並列実行して、エラーがあった場合はコミットさせない設定です。

``` yml
pre-commit:
  parallel: true # 並列実行
  commands:
    check:
      run: bunx biome check
    build:
      run: bun run build
```
</details>

<details><summary>API側のlefthook.yml</summary>

> コミット時にRuffのリントを実行して、エラーがあった場合はコミットさせない設定です。

``` yml
pre-commit:
  commands:
    check:
      run: ruff check
```
</details>

欲を言えばコミットメッセージのリントも行いたかったのですが、マルチプラットフォーム対応のcommitlintが見つからなかったため断念しました...
何かいいリンターがあったら教えていただけると嬉しいです。

その他の構築例も[こちら](https://lefthook.dev/examples/index.html)にいくつかあるので興味があったら見てみてください。

## 実行

UI側（Next.js）での実行結果です。
Hello Worldを表示するだけのページを作成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3995216/844171b0-7db8-9914-399b-71630eeb69ab.png)

適当な場所に以下のような、constで定義した定数に値を代入しようとしてエラーになる文を追加します。
``` ts
const test = 1;
test = 2;
```

ステージングに上げてコミットすると
`git add .`
`git commit -m "test"`

`lefthook.yml`に定義したcheckとbuildが走り...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3995216/d4e16cf7-c33a-4a49-e1d3-3c0e0943ca78.png)

エラーによりコミットが中断されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3995216/cd344e29-7bc7-c575-bebd-e2e4f77c250b.png)

エラー文によると「定数に代入はできないよ」ということなのでletに直します。
``` diff
- const test = 1;
+ let test = 1;
test = 2;
```

再コミット
`git add .`
`git commit -m "test"`

先ほどと同様checkとbuildが走り...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3995216/0de8a88e-a296-c2b4-ccef-cb1dd71de4c7.png)

今度はエラーが無いためコミットが完了しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3995216/fc876cdd-0906-5fbe-5de0-3212776f8f6b.png)

プッシュを忘れずに
`git push`

## まとめ

以上です。
個人的に積極的に使っていきたいと思えるツールでしたので記事を書かせていただきました。

誤字・脱字・ご指摘点等ありましたらコメントで教えていただけると助かります。

LeftHookで良いコミットライフを！
Nuxt.js Vuetify入門 個人メモ

# 1. npmインストール
参考：https://develop365.gitlab.io/nuxtjs-2.8.X-doc/ja/guide/installation/
```
$ npm install -g npx
```


# 2. Nuxt.jsインストール
コマンド実行後に質問されるので、コマンド実行前に以下を確認することがおすすめ。
参考：https://zenn.dev/melos/articles/3e083ecda8440b

```
$ npx create-nuxt-app nuxt_study
```


・メモ：TypeScriptとVuetify.jsを選択

# 3. フォルダ構成(私の場合の例)
▪️ フォルダ名：nuxt_study
・assets
・components：コンポーネント
・layouts：親画面みたいなもの
・node_modules：CSSとか
・pages：子画面みたいなもの
・static：ファビコンとか
・store
.editorconfig
.gitignore
nuxt.config.js
package-lock.json
package.json
README.md
tsconfig.json

```
$ npm run dev
```
http://localhost:3000/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497869/019f75ff-6f57-6648-f16b-5c84717fae08.png)

4. 参考
ありがとうございました。
https://develop365.gitlab.io/nuxtjs-2.8.X-doc/ja/guide/installation/
https://zenn.dev/melos/articles/3e083ecda8440b
Gorm関連のデバッグの最適解

# Gormのデバッグモード

# はじめに
先日、gormの機能にデバッグモードがあると気付いたのでこれの概要と使用するべき場面を紹介します。

# 目次
1. デバッグモードの概要
1. 使用したら効果的な場面

# デバッグモードの概要
## 使用方法
使用方法はいたって簡単でgormで宣言した「データベース接続用インスタンス」をデバッグ用に変更するだけです。

例として以下のようなコードがあったとします。
```go:db.go
	var (
		db  *gorm.DB
		err error
	)

	if env == "prod" {
		db, err = gorm.Open(postgres.Open(dsn), &gorm.Config{})
		log.Println("Setup postgresql database")
	} 
    
	if err != nil {
		panic("Failed to connect database")
	}

	db = db.Debug()
	return db

```

上記には下記のような記述があります。
```go:db.go
db = db.Debug()
```
これだけでデータベース接続用のインスタンスがデバッグモードに変更されます。

例としてこの処理を行うとgormを用いてPOSTリクエストを行ったときに下記のようなものがターミナルに表示されます。
```
2025/01/26 14:14:28 C:/Users/user/Documents/webapp/product/PortfolioPlatform/backend/repositories/Portfolio_repository.go:27
[6.100ms] [rows:1] INSERT INTO "posts" ("created_at","updated_at","deleted_at","title","description","genres","skills","user_id") VALUES ('2025-01-26 05:14:28.43','2025-01-26 05:14:28.43',NULL,'作品名','作 品の説明文','{"ゲーム開発"}','{"GCP"}',84) RETURNING "id"
```
ここには以下のものが記述されています
- いつリクエストが呼び出されたか
- どのファイルからの呼び出しがあったか
- 実行時間
- 返却された行数
- 実際に使用されたSQL文

ここでは例としてPOSTリクエストを挙げていますが他のCRUD操作でも表示されるものは同じです。

# 使用したら効果的な場面
この機能を使用するのに有効な場面としては下記のような場面があげられます。
- 実際にどのような SQL が発行されているのか確認したい
- SQL の実行速度(ミリ秒)や結果件数を見て、クエリの最適化やインデックスの検証をしたい
- クエリの実行元(どのファイル・行で発行されたか)を特定したい

また**逆に大規模なシステムなどでは大きい負荷がかかってしまったり、ログが大量に排出されてしまって煩雑になる場面での使用は向かないと思われます**。
制御構造

bashはプログラミング言語と同じように値による条件分岐や、繰り替え一処理を行うことができる。これを制御構造と呼ぶ。

## 複合コマンド

シェルスクリプトで制御構造を利用するためには、複合コマンドを利用する、よく使われるのは「if」「for 」「case」「while」の四つの複合コマンド。

### if文

if文は条件を評価して、その真偽に応じて処理を分岐するための機能を持つ。

```
#!/bin/bash

# []の前後にスペースを入れないけれならない
## ["$1" = "hello"]; と書くとエラーになるので注意が必要
# 条件式の後には「;」を入れなければならない、入れないのであれば改行する必要がある
## ["$1" = "hello"] と書くとエラーになるので注意が必要

if[ "$1" = "hello" ]; then
  echo "OK"
else
  echo "NG"
fi

# ※ testコマンドと[]
# [] はコマンドであり条件を引数としてとるコマンド。
# testコマンドは[]と同じ動きをするコマンド

# 下記は等価
if [ "$1" = "hello" ]; then
if test "$1" = "hello"; then
```

条件に利用される文字列の比較

| = | 左辺と右辺が等しいか |
| --- | --- |
| != | 左辺と右辺が等しくないか |
| -n | 与えられる引数が空文字でないかどうか |
| -z | 与えられる引数がから文字であるか |

 

条件に利用される数字の比較

| -eq | 左辺と右辺が等しい |
| --- | --- |
| -ne | 左辺と右辺が等しくない |
| -lt | 左辺が右辺より小さい |
| -le | 左辺が右辺以下 |
| -gt | 左辺が右辺より大きい |
| -ge | 左辺が右辺以上 |

条件を結合するための演算子

| 条件式1 -a 条件式2 | 条件式が両方真の場合真 |
| --- | --- |
| 条件式1 -o 条件式2 | 条件式のどちらかが真の場合真 |
| ! 条件 | 条件の反転 |
| () | 条件のグループ化 |

### for文

スペースや、タブで区切られた単語に対して繰り返し処理を行う構文。

```
# for.sh
for str in aaa bbb ccc
do
  echo $name
done

./for.sh
=> aaa
=> bbb
=> ccc

# 下記で引数を区切って渡しても良い
for name in $@  # (for name in $* でも良い)
do
  echo $str
done

./for.sh aaa bbb ccc

=> aaa
=> bbb
=> ccc
```

### case文

指定された文字列がパターンにマッチするかどうかを判断し、マッチしたパターンに対応する処理を行うための制御構文。

```
case "$1" in
  *.txt)
    echo "$1 is txt"
    ;;
  *.sh)
    echo "$1 is sh"
    ;;
  *)
    echo "not eq"
    ;;
esac
```

### while文

指定した条件が真である場合、do ~ doneの間の処理を繰り返す制御構文。

```
# while.sh

i=1
while [ $1 -le 10 ]
do
  echo $i
  i=$((i + 2)) # $(()) という書き方は「算術式展開」という
done

./while.sh

=> 1
=> 3
=> 5
=> 7
=> 9
```
docker-composeで立ち上げたAppからDBにアクセスするとConnection refusedになる

# 背景
- laravel + Vue3 + mysqlの構成でアプリを開発中
- ローカル開発環境をXAMPPからDockerに移行
- docker-composeでappコンテナとdbコンテナを立ち上げることはできたが、appにアクセスすると以下のエラーになる
  ```sql
  SQLSTATE[HY000] [2002] Connection refused (Connection: mysql, SQL: select * from `sessions` where `id` = xxx limit 1)`
  ```

# 解決法

接続先の`DB_HOST`をDBのサービス名またはコンテナ名にする

```yml:docker-compose.yml
services:
  ...
  mysql: #サービス名
    image: mysql:8.0
    container_name: mysql-db #コンテナ名
    ports:
      - "3306:3306"
```

```.env
DB_HOST=127.0.0.1 ⇒ NG
DB_HOST=mysql ⇒ OK
DB_HOST=mysql-db ⇒ OK
```

## 参考
https://zenn.dev/hashi8084/articles/84cf664e587d44
自宅でかつ英語でAWS certsを受験してみた

自宅でAWS certsを受験する場合、試験監督の話す言語を選択する項目がある。これを英語にしてみた話。

試験当日の流れなどは言語によって変わらないと思うので、説明は他の方々のブログ記事に譲る

### 経緯
普段はアプリケーションレイヤーの開発を主にしているので、クラウドに関する体系的な知識がなかった。会社に資格報奨金制度もあるので、Cloud Practitioner を受けてみようと思い立った。

なんでも後回しにする癖があるので、受験予定日の2日前にようやく予約をした。AWS certsは受験場所をテストセンター or 自宅で選択できる。自宅であれば直前でも予約できるだろうと高をくくっていた。しかし、残念ながら自宅受験であっても空きスロットが見つからなかった。厳密にいうと、私が希望する時間帯に日本語を話せる試験監督がいないという状況。試しに試験監督の言語を英語にしてみると、2日前にも関わらず多くの空きがあった。であれば、いっそのこと英語にしようと思い、勢いで予約した。試験問題の言語と試験監督(proctor)の言語は別で選ぶことになっている。試験勉強は全部英語でやっていたので、どちらも英語にした。

## 実際のやりとり

通話でやり取りをするはずだったのだが、接続が悪く（？）全てチャットベースでのやりとりだった。以下内容。

- （試験監督からのメッセージ）
    - （私の回答）
- あなたの声が聞こえません
    - 私も聞こえません
- 腕時計をしていないことを確認したいので、腕をカメラに見せてください
    - （見せる）
- ありがとうございます。ラップトップか外付けカメラを持ち上げて、机の前を写してください
    - （写す）
- ラップトップをドッキングステーションとして使っていますか？
    - ※ラップトップに外付けモニターを1枚接続して受験していた
    - はいそうです（一応ラップトップ部分をカメラに映す）
- ありがとうございます。今試験問題をリリースします
    - はい

試験の注意事項などが記載された新しいウィンドウが立ち上がる

- Welcome Screenが表示されましたか？
    - はい、始めてもいいですか？
- 大丈夫です。 Good luck on your exam!

チャットを閉じて、試験を始める。

## 余談

自宅受験についてネットで調べると、画面がフリーズした、チャットが重い、など色々とtechnical issuesについての話があるが、私の場合は特に何もなく、無事終了した。（通話ができないという事象があったが、特に影響はなかった）次の問題に行くのに毎回数秒かかるみたいな話も聞いていたが、それもなく、むしろ快適な受験だった。

英語問題文も特に問題はなかった。むしろカタカナ日本語に魔翻訳されるAWS文学を読み解くよりも簡単なのではないかと思う。

次AWS certsを受験するときもぜひ、全て英語で受けてみたい。
【C#】constよりもreadonlyを使うべし

# C#で使える定数
C#では定数を宣言する際に`const`または`readonly`を使います
それぞれの特徴は下記の通りです
| 定数 |値決定タイミング|パフォーマンス|
|:-:|:-:|:-:|
|const|コンパイル時|優れている|
|readonly|実行時|やや劣る|

"値の変わらないもの"という役割は同じですが、それぞれ大きく異なる動きをするため、用法を誤るとバグに繋がってしまうかも!?

# どっちを使うべきか？
タイトルでネタバレしちゃってますが、基本的には`readonly`を使うことが推奨されています
以下の観点でなぜ`resdonly`を使うべきなのか考察していきます
- 値変更後の再コンパイル必要有無
- 扱える型の違い

## 値変更後の再コンパイル必要有無
`const`と`readonly`の最も大きな違いは値決定のタイミングです
`const`はコンパイル時、`readonly`は実行時に値が決まります

C#コードはビルド時にコンパイルが行われ、コンパイル完了後の成果物を使用して処理が実行されます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3889500/92187d8b-22c4-2299-0e66-6995437c8024.png)

つまり、定数の中身に変更があった場合、コンパイル時に値が決定する`const`は、再ビルドを実行しないと定数値の変更が処理に反映されません

### 例） アセンブリの変更時に再ビルト実行が漏れたケース
`VersionInfo`というアセンブリのクラス`VersionDefinition`に以下の定数が設定されているとします
```c#
class VersionDefinition
{
   public static readonly double AvailableVersion = 1.5;

   public const double CurrentVersion = 2.0;
}
```
この定数を別アセンブリから参照する以下の処理があったとします
```c#
if (VersionDefinition.CurrentVersion > VersionDefinition.AvailableVersion)
{
    Console.WriteLine($"This version is available!");
}
```
現状、定数の変更がなければ問題なく`Console.WriteLine()`が実行されます

ただ、アセンブリ`VersionInfo`のアップデートが行われ、以下のように変更があった場合を考えてみましょう
```c#
class VersionDefinition
{
   public static readonly double AvailableVersion = 2.0;

   public const double CurrentVersion = 2.1;
}
```
このケースで`VersionInfo`の再ビルドが漏れると実行時の各定数の値は以下になります
`AvailableVersion`: 2.0
`CurrentVersion`: 2.0

`if`の条件式が`false`になりアセンブリ`VersionInfo`で設定した定数が意図する処理とは異なる挙動になってしまいますね

長期的なメンテナンス性を加味すると`readonly`を使うのが得策と言えるでしょう

## 扱える型の違い
`const`はコンパイル時に値が決まっていなければならないという特性上、扱える型に制限があります

具体的には、
- 整数型や浮動小数型
- 列挙型
- 文字列型
のみとなります

それに対して、`readonly`は処理実行時に値を決定するため、すべての型に対応可能です

この問題に関しては実装時に気づくことができるため不具合につながる可能性等は低いですが、`const`で対応できない定数は`readonly`で補えることを知っておくと便利でしょう

# じゃあconstはいつ使うの？

上記の理由から定数は基本的に`readonly`を使用することを推奨しますが、`const`を使うメリットはあります

それはパフォーマンスです

実行時に値へアクセスする`readonly`よりも、コンパイル時に値が決まっている`const`の方が処理時間が早いのは自明ですね

将来的に値の変更が想定されない定数や、参照されているアセンブリごとに値変更の反映タイミングをずらしたい定数などは`const`が有効となります


# 参考
https://qiita.com/4_mio_11/items/203c88eb5299e4a45f31

https://learn.microsoft.com/ja-jp/dotnet/standard/assembly/

[Effective C# 6.0/7.0](https://www.amazon.co.jp/More-Effective-C-6-0-7-0/dp/4798153982/ref=pd_sbs_d_sccl_1_2/356-7634902-3355205?pd_rd_w=OHlzC&content-id=amzn1.sym.dcca1cb7-d8ee-4f71-9db0-310358fcccf4&pf_rd_p=dcca1cb7-d8ee-4f71-9db0-310358fcccf4&pf_rd_r=QHY2B9S90GCSC8W641SD&pd_rd_wg=99dVn&pd_rd_r=ddd36e2e-1255-4249-bcaa-731b854bbd13&pd_rd_i=4798153982&psc=1) Bill Wagner (著), 鈴木 幸敏 (監修, 翻訳)
Claude のレート制限について - 429 エラー

## Cline で Claude を使っていると 429 エラーが出力されることがある

![スクリーンショット 2025-01-26 13.40.13.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3995253/6c677777-1e41-b6dd-5b9d-0d183179fe08.jpeg)

API Request Failed
`429 {"type":"error","error":{"type":"rate_limit_error","message":"This request would exceed your organization’s rate limit of 80,000 input tokens per minute. For details, refer to: https://docs.anthropic.com/en/api/rate-limits; see the response headers for current usage. Please reduce the prompt length or the maximum tokens requested, or try again later. You may also contact sales at https://www.anthropic.com/contact-sales to discuss your options for a rate limit increase."}}`


これが出始めると1回コード修正したらしばらく時間空けて、リトライして・・・と面倒です。

https://qiita.com/tocchi-739/items/becf95c51adf98a5b005

## これは何なのか

これは Claude のレート制限にかかっている状態です。
リクエスト多すぎるので制限しますね〜というイメージですね。

## レート制限の上限は増やせる？

とはいえもっとリクエストしたい！という方も多いのではないでしょうか？
この上限は増やすことができます。

ここで　Tier という概念が出てきます。

## Tier とは？

会員グレードというようなイメージでいいと思います。
そのグレードに応じて、上限が変わってきます。

- 入金額を増やすことでグレードを上げることができます。
- 入金後、グレードが上がるまでに待機期間があるので注意が必要です。（※下の表で言うと`Wait After First Purchase`の箇所）
    - 40ドル入金後、コンソール上はすぐに Tier 2 の表示になりましたが、おそらく適用は7日後なのかと思います。
    - `Credit Purchase` が累計の入金額か、一括で入金する必要があるかはわかっておらず、、ご存じの方は教えていただけると助かります:pray:

![スクリーンショット 2025-01-26 13.56.41.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3995253/90ccf124-3fe4-eabb-e2b9-ff2259dd760a.jpeg)
(<https://docs.anthropic.com/en/api/rate-limits#requirements-to-advance-tier>)


## Tier 毎の上限

- Tier 1 の場合
![スクリーンショット 2025-01-26 13.51.20.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3995253/288924cb-95ac-00fe-589a-4ca4ac81235e.jpeg)
- Tier 2 の場合
![スクリーンショット 2025-01-26 13.54.03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3995253/b6d1ae56-7fec-86ee-c234-113da74ca91d.jpeg)


上記は執筆時点(2025/01/26)の表です。
詳しくは、[Anthropic の Rate limits のページ](https://docs.anthropic.com/en/api/rate-limits#updated-rate-limits)をご覧ください。


以上、参考になれば幸いです。
MindEase - ストレスを軽減する Web サービスを開発しました！(現在はストレスを記録する機能だけでPC限定)

# MindEase - ストレスを軽減する Web サービスを開発しました！

## はじめに

こんにちは！最近、ストレス管理に役立つ Web サービス **「MindEase」** を開発しました。この記事では、開発の背景、使用技術、実装の流れについて紹介します。

**MindEase とは？**
- ストレスの記録を簡単に管理
- 過去のストレス状況を振り返り、改善のヒントを得る
- シンプルな UI で誰でも使いやすい


## 開発の背景

仕事や日常生活の中で、ストレスを感じることは多いですよね。しかし、
"何にストレスを感じたのか？" を客観的に振り返ることは意外と難しいです。

そこで、ストレスの記録を手軽に行い、あとで振り返ることができる Web サービスを作ろうと思いました。


## 技術スタック

- **フロントエンド**: Tailwind CSS
- **バックエンド**: Django (Python)
- **データベース**: SQLite (開発時) / MySQL (本番環境)
- **認証機能**: Django 認証（Google / Instagram / TikTok 認証も検討）
- **デプロイ環境**: PythonAnywhere


## 実装した機能

### 1️⃣ ストレス記録機能
- Django の `CreateView` を活用して、ユーザーが簡単にストレスを記録できる
- 記録をリスト形式で表示し、過去のストレスを振り返ることが可能

### 2️⃣ ユーザー認証
- Django の `auth` を使用し、メールとパスワードでログインできるように実装
- `django-allauth` を活用し、Google / Instagram / TikTok 認証を追加予定

### 3️⃣ 管理画面のカスタマイズ
- `django-admin-interface` を導入し、管理画面のデザインをカスタマイズ
- 管理者がユーザーのストレスデータを確認しやすい UI を実装
- なぜかdjango-admin-interfaceがPythonAnyWhereにおいて適応されていなくて困っている


## 開発時に苦労した点

### 1️⃣ Django の管理画面のスタイルが適用されない問題
- `django-admin-interface` を導入したが、`collectstatic` を適用しないと CSS が反映されなかった
- `STATIC_URL` と `STATIC_ROOT` の設定を見直し、PythonAnywhere で静的ファイルを適切に管理

### 2️⃣ PythonAnywhere でのデプロイ
- `wsgi.py` の設定ミスで `ModuleNotFoundError` が発生
- `sys.path` に仮想環境のパスを適切に追加することで解決

### 3️⃣ Django の `CBV`（Class-Based Views）の学習
- `CreateView`, `ListView`, `LoginView` などを活用し、効率的に実装

## 実際のサイト

- **MindEase の URL:** `[https://inori0218adt.pythonanywhere.com/]`

### スクリーンショット 📷
(ここに画像を追加)


## 今後の展望

- **AI を活用したストレス診断機能の追加**
- **ユーザーのストレス傾向を分析し、アドバイスを提供**
- **モバイル対応の最適化（レスポンシブデザイン強化）**


## まとめ

Djangoシンプルかつ使いやすいストレス管理アプリを開発しました。
PythonAnywhere を活用したデプロイもスムーズに行えました。

**Qiita でのフィードバックも大歓迎です！** 😊
[AWS]CloudFront OAI ・OAC メモ


AWSのCDNサービスCloudFrontのOAI・OAC機能についてまとめる。

## 1. 概要

### OAI (Origin Access Identity)

- 概要
  - CloudFront と S3 バケット間のアクセス制御に特化した仕組み。
  - OAI を使用して、S3 バケットをパブリックアクセス不可にしつつ、CloudFront 経由でのみオブジェクトを取得可能にすることができる。
  - S3 バケットポリシーで「CloudFront の OAI からのアクセスだけ許可」する形で制御する。

### OAC (Origin Access Control)

- 概要
  - OAI の後継的な機能。
  - OAI と同様に、CloudFront からのアクセスのみをオリジンで許可する仕組みだが、より柔軟かつ拡張性が高い。
  - S3 以外のオリジン（カスタムオリジンなど）にも対応可能で、今後は OAC の利用が推奨されつつある。
  - OAIと比較して優れている点
    - **セキュリティ** – OAC は、短期間のクレデンシャル、頻繁なクレデンシャルのローテーション、およびリソースベースのポリシーのような強化されたセキュリティプラクティスで実装されている。
    - **包括的な HTTP メソッドのサポート** – OAC は GET、PUT、POST、PATCH、DELETE、OPTIONS、および HEAD をサポートする。
    - **SSE-KMS** – OAC は、SSE-KMS で暗号化された S3 オブジェクトのダウンロードとアップロードをサポートする。

## 2. 用途

### OAI の用途

1. S3 バケットの直接アクセスをブロック
   - バケットを完全にプライベートにし、OAI を用いて CloudFront 経由でのみファイルにアクセスさせる。
2. セキュアなコンテンツ配信
   - S3 バケットの URL を隠蔽し、CloudFront のディストリビューション URL を通じたアクセスに統一。

### OAC の用途

1. OAI の拡張・代替機能として
   - OAI から移行しやすく、機能的にはほぼ上位互換。
2. 複数のオリジンタイプでの柔軟なアクセス制御
   - S3 に限らず、カスタムオリジンや他の AWS サービス（Lambda@Edge など）にも対応。
3. 将来のセキュリティ拡張への対応
   - OAI では難しかったさらなる制御機能（IAM ポリシーとの連携など）に柔軟に対応可能。



## 3. 設定方法

### OAI の設定方法

1. S3 バケットをプライベートに設定

   - S3 コンソールやバケットポリシーで「パブリックアクセスをブロック」する。

2. CloudFront で OAI を作成

   - CloudFront コンソールでディストリビューションを作成/編集する際に「オリジンアクセスアイデンティティの設定」から作成。
   - 作成時に自動的にバケットポリシーへ反映するオプションを選択する/手動設定する。

3. バケットポリシーの設定

   - OAI に対して `s3:GetObject` を許可する。

   - 例:

     ```json
     {
       "Version": "2012-10-17",
       "Statement": [
         {
           "Effect": "Allow",
           "Principal": {
             "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity XXXXXXXXXXXX"
           },
           "Action": "s3:GetObject",
           "Resource": "arn:aws:s3:::my-sample-bucket/*"
         }
       ]
     }
     ```

### OAC の設定方法

1. CloudFront コンソールでオリジンアクセスコントロール (OAC) を有効化
   - 「オリジン」タブでオリジンを追加または編集し、「オリジンアクセスコントロールを作成」を選択。
2. OAC のタイプを選択
   - S3 バケットの場合は `S3Origin` として署名付きリクエスト(“Sign requests”)を設定。
   - 必要に応じて "AWS シグネチャバージョン4" を使用するなど設定を行う。
3. S3 バケットポリシーを自動または手動で更新
   - OAC 作成時に CloudFront がバケットポリシーを自動生成・設定可能。
   - 手動で行う場合は、OAC で作成された IAM エンティティ(または条件付きポリシー)を参照して、`s3:GetObject` を許可する。
4. ディストリビューションをデプロイ
   - 設定が完了したらディストリビューションを保存し、デプロイが完了するのを待つ。



## 4. 仕組み (シーケンス)

以下は、クライアントが OAI/OACを利用したCloudFront 経由で S3 からコンテンツを取得する流れ。

```mermaid
sequenceDiagram
    participant Client as クライアント
    participant CF as CloudFront
    participant S3 as S3バケット(プライベート)

    Client->>CF: 1. コンテンツへのリクエスト
    alt 認可されたディストリビューション
        CF->>S3: 2. (OAI/OACにより署名された)リクエスト
        S3-->>CF: 3. アクセスが許可されればオブジェクトを返す
        CF->>Client: 4. コンテンツをレスポンス
    else 認可されていないディストリビューション
        CF-->>Client: エラー (403 Forbiddenなど)
    end
```

- **OAI**: CloudFront は OAI を用いて S3 バケットポリシーで許可された IAM ユーザとしてリクエストを行う。
- **OAC**: CloudFront は IAM シグネチャを使ってリクエストし、S3 側でその署名が有効かどうかチェックする（バケットポリシーまたは IAM ポリシーで制御）。



## 5. 参考文献

- [Amazon CloudFront オリジンアクセスコントロール（OAC）のご紹介](https://aws.amazon.com/jp/blogs/news/amazon-cloudfront-introduces-origin-access-control-oac/)
VSCODEにおいて PageUp とPageDown のキーバインドを差し替える

キーボードの "PageUp (PgUp) キー" と "PageDown (PgDn) キー" を押下したときのVisual Studio Codeのふるまい（ページスクロール）を差し替える方法

## keybindings.json の例

```js
[
    {
        "key": "pageup",
        "command": "cursorWordLeft",
        "when": "textInputFocus"
    },
    {
        "key": "pagedown",
        "command": "cursorWordRight",
        "when": "textInputFocus"
    }
]
```

+ PageUp キー : 単語単位のカーソル左移動
+ PageDown キー : 単語単位のカーソル右移動


## キーバインドを差し替える背景

一部のノートパソコンのキー配列において、下図のように矢印キーとPage UpキーやPage Downキーが隣接しているときに矢印キーを叩いたつもりでページのアップダウンが発生することを防ぐため。

![pageUpDownKey.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34816/fc0f5edc-45dd-938a-e1f2-c7d9d6977c35.png)

PageUpキーとPageDownキーにどのような機能を割り当てるかはユーザーの好みによるが、上記の例では比較的機能が近い単語(word)単位のカーソル左右移動に割り当てている。ちなみにデフォルトのキーバインディングでは CTRL + &larr; と CTRL + &rarr; が単語単位のカーソル移動。

## 補足

レジストリキー `Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout` に設定を追加することで Windows OS レベルで Page Up, Page Downキー入力を無効化することも可能である。
ローカルLLMを手のひらサイズで動かしてみよう！ M5 Cardputer + ModuleLLM

# はじめに

OpenAI の ChatGPT のような LLM(大規模言語モデル)、このLLMをローカルで動かすにはCUDAが動くGPUだったり、Apple SiliconなMac（しかもメモリ大量）だったりが必要でした。そんな中、近年では組み込み向けのマイコン用のエッジLLMモジュールなどが登場してきました。


この記事では、M5Stack社が発売しているクレジットカード💳サイズのキーボード付きコンピュータCardputerとローカルLLMが動くModuleLLMを組み合わせることで「手のひらサイズでローカルLLMが動く」世界を実現させます。

**↓動作のようす**
https://x.com/GOROman/status/1883032143884103767


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30621/c86f6e53-e168-7d53-5381-74e0a071cb99.png)


# やり方

## 用意するもの

### ModuleLLM

まずは、ModuleLLM(LLM モジュール)を用意しましょう！。国内正規代理店であるスイッチサイエンスでは売り切れで、M5Stack公式Storeでも売り切れで、Aliexpressの最後の1個は私が買いました。多分春節明けで量産が再開されて3月くらいには在庫が戻る可能性はあります。勢いで買ったけどよく分からず使えてない人とかに凸って譲ってもらうなど手段を選ばなければゲットできるかもしれません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30621/5e386a6b-b1a9-146f-6264-08df13599d3d.png)


- https://www.switch-science.com/products/10034


### Cardputer

Cardputer も用意しましょう。こっちは在庫が最近復活したようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30621/356b072b-f940-1a73-64b4-19c3f1b2ff39.png)


- https://www.switch-science.com/products/9277

## まずは、おもむろに分解します。

ModuleLLMを枠から外します。４つのネジをレンチで回します。
Cardputerも分解します。Cardputerはデカいバッテリーが両面テープで止めてあるので丁寧に剥がします（力任せにしてバッテリーを曲げて燃えないように注意！）
Cardputerの上の黒いやつも外しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30621/e9f33e0d-a8a6-6d01-96bc-a66c74095e12.png)

あとは、適当にガシガシと削ってModuleLLMをケース内に収めます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30621/d656d9cb-c5e5-ce5b-a606-b8dc422c1a6f.png)

後ろもカッターで切ってピン(M.BUS)が出るようにしました。ショートすると良くないのでカプトンとかアセテートテープなどで絶縁しましょう。

#### 収まった（？）様子

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30621/f667125d-5818-1972-7307-1683f092a009.png)


## 接続方法

ModuleLLMとのやりとりは UART or TCP(10001)で可能です。今回はUARTを使用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30621/27e74244-4d01-b4db-8f7e-0a9f5440c224.png)

ModuleLLMとCardputerの接続は

- Cardputer 側 GROVE端子(G1,G2,+5V,GND)
- ModuleLLM 側 UARTのピン と +5V と GND

です。
今回は基板へ直接ハンダ付けしましたが、もっと良い方法はありそうです。


|Cardputer側(GROVE)|ModuleLLM側(M.BUS)|
|---------|---------|
|G(黒)|GND|
|5V(赤)|5V|
|G1(黄)|UART(Tx)|
|G2(白)|UART(Rx)|

(2025.2.9 TxとRxを入れ替えました。LLM630 Kit をそのまま繋いで動作可能です)




![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30621/b6b1f52c-d0f8-157c-7818-986509cff129.png)

↑注意. この写真はG1がTxで、G2がRxになっています。






## コーディング

### コードをサクッと書きましょう。

公式のサンプルを適当に改造すればすぐできます。

- https://github.com/m5stack/M5Module-LLM/blob/main/examples/SerialTextAssistant/SerialTextAssistant.ino

と

- https://github.com/m5stack/M5Cardputer/blob/master/examples/Basic/keyboard/inputText/inputText.ino

を合体させました。キー入力で音を出すと良いです。

UARTのTX, RXのGPIOは以下のように指定します。
```c
  Serial2.begin(115200, SERIAL_8N1, 2, 1);
```

## 完成！！！

お楽しみください！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30621/b6668bcf-2dad-5de2-d8a7-e054b35feb26.png)





----
# (2025/2/3 追記) ↓↓↓実際に作られた人が現れました！↓↓↓

https://posfie.com/@necobut/p/JKAorjR

----

# (2025/2/9 追記) ソースコード公開しました
https://github.com/GOROman/LLMCardputer
.gitignoreについてメモ

# .gitignoreとは


ここに書いとくとgit addしたときに反映されなくなります
以下のようなファイルを指定してるのを防げます


・色んなライブラリが作り散らかすキャッシュファイル
・開発環境で動かしたときに保存されてしまったあれこれ
・ID、パスワード、トークンなど公開したらあかんファイル


# 使い方


.gitignoreはリポジトリフォルダ内のどこにあっても構いませんし、複数あってもすべてが適用されます。.gitignoreが存在するフォルダ以下のすべてのファイル/フォルダに適用されます。リポジトリ内にDjango APIとReact SPAのディレクトリがそれぞれある場合、それぞれのディレクトリ毎に.gitignoreがあるのが普通ですし、特定のフォルダ内だけ.gitignoreしたい場合はそこに置けば他のフォルダへの影響はありません。シンプルだけど素晴らしい仕組み。これ設計した奴は天才やろ、と思ってます


## 1. フレームワークが勝手に作ってくれたのを使う


ウェブアプリ開発のフレームワーク (Next.js, Remix, React Routerなど) の場合、プロジェクトフォルダを自動生成した際に.gitignoreにだいたいこの辺だよね、というのを.gitignoreに書いておいてくれたりします。書き足したり消したりしても良いですが、開発側としてはこの辺だと思ってるよ、というのが分かってありがたいです


フレームワークによってはアップロードしないでほしいものはここに置け、みたいなフォルダが用意されていたりしますので、それに従う事で他の開発者にも読みやすくなります


## 2. 自分で書く


### ファイル, フォルダ単位


.gitignoreからの相対PATHで指定するだけです
たくさんある時はたくさん並べて書きます


```terminal:.gitignore
api/mysite/db.sqlite3
```


```terminal:.gitignore
node_modules

/.cache
# /build
/public/build
.env
```



### ワイルドカード


まとめて指定するのも簡単です


```terminal:.gitignore
**/__pycache__/
```


例えば、Pythonを動かすと大量にファイルが生成される__pycache__フォルダですが、Djangoアプリを作るとあちこちのフォルダにこれが生成されてしまいます。そういう時はワイルドカードで指定してしまえばOKです


## 3. pushしちゃったファイルを.gitignoreしたい


一度commitしてしまうとgitがファイル情報をキャッシュに持って、登録対象ファイルとして記憶してしまっている状態になります。.gitignoreは新たに登録されるファイルのみが対象になりますので、既にキャッシュされている場合は消してやり直してやる必要があります


git rm -r --cached . でカレントディレクト以下のファイルをキャッシュから削除
git add . でカレントディレクト以下のファイルを登録対象に追加
最後にgit commitして上記変更を反映します


```terminal:terminal
git rm -r --cached .
git add .
git commit -m "Ignore __pycache__ directories"
git push
```


# .gitignoreを分けて書く


gitはリポジトリのルートディレクトリにキャッシュやconfigを保存する.gitディレクトリを置いて動きますが、.gitignoreについてはどこに置いてあっても反映してくれます


.gitignoreのあるディレクトリ以下に対して相対PATHで指定されたものが対象となります。ワイルドカードも置いてあるディレクトリより下にしか効かないので管理が楽だと思います


# まとめ


簡単です
レッツトライ
議長さんに敬意を表して

# 発端
N-Prologは私の趣味的な処理系で１９８０年代を懐かしみつつRUN\PROLOGのコードを動かす目的で作ってます。ところで最近、UWNという人からissuesをもらいました。ISO-Prolog規格との対比を持ち出してきて、それは違うと指摘をもらいました。「ああ、めんどくせ。言語仕様の隅を突くのが大好きな暇人かな？」とテキトーに距離をおいていたのですが、どうもこの傍若無人なコメント、どこかで見たことあるような雰囲気...

何日かして思い出しました。ああ、ISO-Prologの議長のウルリッヒさんだよ。頭文字をとるとUWN、あのお方だ!!!。

# 言い訳
UWNさんにはN-Prologは１９８０年代のDEC10-Prologをお手本にしているもので、日本でRUN\PROLOGと呼ばれたいたものの互換でして・・・と言い訳をしたのですが。なんか、考えてるうちにISO-Prologは好きじゃないけど、実装できないのか？と言われるのも悔しい気がしてきました。以前、作っていたO-PrologではISO準拠を目指して頑張ってはみたものの、そのシンタックスのハードルの高さと、その割にはエレガントではないところ、文字列が不満足なところ、モジュールが曖昧なところが嫌になって離脱したのでした。

でも、これもなんかの御縁かもしれません。いっちょやってみますか。


# RUN/PROLOG上位互換
というわけでISO-Prologのコアの部分を取り込んで実装を追加したところです。ウルリッヒさんから「ああ、その結果はISOの仕様と違うと言われそうなので、ドキュメントに逃げ口上をたっぷり書いておきました。

今のところ追加したのは下記の述語たちです。

```
\+ (not)
atom_concat/3
append/3
member/2
between/3
select/3
succ/2
maplist/2
compound/1
ground/1
once/1
atom_codes/2
atom_chars/2
char_code/2
number_codes/2
number_chars/2
predicate_property/2
bagof/3
setof/3
findall/3
existerrors/2
write_canonical/1 /2
atom_length/2
get_char/1 2
get_byte/1 2
put_char/1 
flush_output/0
catch/3
throw/1
unify_with_occurs_check/2
current_input/1
current_output/1
set_input/1
set_output/1
use_module/1
module/1
copy_term/2

```

モジュールはSWI-Prologを参考にしつつも、独自です。ISOはモジュールはゆるくしか定めてないのでセーフでしょう。


# 案外、楽しいかも
何年か前はほんとISOが苦手で嫌ってました。でも、やってみると案外と楽しいかもしれません。ISOの仕様にとらわれずに自分ならこう考えて、こういう仕様にした、ということをやっています。ChatGPTも相手になってくれるので百人力です。あいつは大学教授並に博識です。本業が忙しいのですが、こんなことをするのも気分転換、リラックスできるのでいいかもしれません。

![2025-01-26 13-28-18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/fd22a07a-57ca-20b1-2571-2873cff41f48.png)


https://github.com/sasagawa888/nprolog
RStudioでデータフレームをRとPythonの間でやり取りをする方法

# この記事のモチベーション

* RStudioでRをメインに使用しているが、やりたいことがPythonでシンプルに可能である場合に、RとPythonのいいとこ取りをしたい。
* Pythonで作成したデータフレームをRに読み込んでRの慣れた環境で解析できるようにしたい。

# 問題点
* Pythonのpandasはデータ分析のライブラリを収載したパッケージである。
* RStudio上でPythonでのpandas作成したデータフレームをreticulateライブラリで読み込むことはできるが、Pythonのデータフレーム名をそのままRで読み込むと、全く形式が異なってしまいRで再利用できない。
* Rで作成したデータフレームはPythonで読み込み可能であることから、PythonからRのデータのやり取りをスムーズに行いたい。

# 解決方法
* [参考記事](https://qiita.com/takano_tak/items/0be0305c2450dc81736e)に記載のPythonで作成したデータフレームをRで読み込める形のファイル（RDF形式）に出力し、Rで読み込むことで可能となった。
* 本記事はmacOSかつminiconda/conda-forgeの環境でPythonを設定した条件で動作確認を行いました。

# 方法

## 必要なパッケージのインストール

今回はpandas, pyperの2つのパッケージをインストールする。

ターミナルにてRStudioで使用するPythonの仮想環境をアクティベートして、以下のコマンドで事前にインストールしておく。**pyperパッケージはcondaではなくpipコマンドでインストールを行う。**

まずはターミナルで仮想環境に切り替えてpandasパッケージをインストールする。
``` 
% conda activate DSCFA39
% conda install pandas
```

続いて、pyperパッケージをpipコマンドでインストールする。


```
% pip install pyper
```

## RのデータフレームをPythonに読み込む

RStudioのPythonのエディタ内で以下のsave_rds関数をPythonで作成する。

```save_rds.py
import pyper
import pandas as pd
from pathlib import Path, PosixPath
from typing import Union

def save_rds(df: pd.core.frame.DataFrame, file: Union[str, PosixPath]) -> bool:
    strfile = str(file)
    pathfile = Path(file)
    # datetime型があると変換エラーが起こるのでstrにする
    df = pd.concat([df.select_dtypes('datetime').astype(str), df.select_dtypes(exclude='datetime')], axis=1)
    # PosixPathがあると変換エラーが起こるのでstrにする
    df = pd.concat([df.select_dtypes('object').astype(str), df.select_dtypes(exclude='object')], axis=1)
    r = pyper.R(use_pandas='True')
    r.assign("df", df)
    r(f'saveRDS(df, file="{strfile}")')
    ret = r.get(f'readRDS("{strfile}")')
    if ret is None:
        print('Conversion failed')
        pathfile.unlink()
        return False
    else:
        return True
```

引用元：https://qiita.com/takano_tak/items/0be0305c2450dc81736e


上記Pythonスクリプトを実行して、RStudioの環境変数の確認画面で、Pythonにsave_rds関数が登録されていれば実行可能である。


## RStudioのWorking directryの設定
   
上記関数を使用する前に、データフレームのやり取りを行うRおよびPythonのスクリプトを同じフォルダーに置いて、セッションのWorking Directoryを合わせておく。

各スクリプトを同じフォルダーに保存して、Session – Set working Directory のTo Source File Locationをクリックする。
 


## Pythonの環境で、以下のコマンドで出力する。
```export.py
    save_rds(df, "AAAA.RDS")
```

※ここで、dfは出力したいデータフレームのオブジェクト名、“AAAA.RDS”は区別ができるファイル名を指定する。

## R環境で読み込み
Rの環境で、以下のコマンドでRに読み込んでオブジェクトに保存する。

```Load_df.R
rdf_1 <- readRDS ("AAAA.RDS")
rdf_1
```

class()関数で読み込んだオブジェクトを確認し、data frameの型であることを確認する。

```Confirm.R
    class(rdf_1)
```
    
> class(rdf_1)
[1] "data.frame"

* ここで、rdf_1は任意のオブジェクト名を指定する。
* 後にPythonで読み込む際にはこのオブジェクト名を使用するため、ピリオド(.)などのPythonの動作に支障をきたす特殊文字は使用不可となる。


# Rで作成したデータフレームをPythonで読み込む方法

Pythonのエディタ内で、 ”r.” をオブジェクトの前に付けることで、Pythonで読み込むことができる。

```LoadRdf.py
	py_rdf1 = r.rdf_1
```
VRC_Stationで遊ぼう（危険）

## 初めに
これはVRChat向けの記事です。
VRChatにおけるUnityを前提として書いているため、一般的なUnityとは乖離しているケースが多々含まれます。ご注意ください。

また、今回は特に分かりやすく書き残そうという意思はあまりありません。
簡単に悪さが出来る特殊動作についての記事になりますので…
一切記事がない状況も不健全なので一応残しておこう程度のものになります

また、これらのギミックを作ってキック投票もらったりブロックされたりしても当方は一切責任を負いません

### 前提知識
この記事では以下の知識を前提としています。

* 基本的なUnity操作（アニメーターのState遷移など）
* VRC_Stationの基礎動作
* 筆者の拙い文章を理解する読解力と根気 

### 今回の内容
今回紹介するのはアニメーターのStateに付けるVRC SDKに内蔵されているコンポーネント（Scripts）を使って遊びます
普通の使い方や、翻訳文はこちらを参照してください。

https://ankoro199.hatenablog.com/entry/2021/04/24/123922

## VRC Animator Tracking Control
アニメーションを優先するかトラッキングを優先するかの設定
これを「Animation」に設定する事で、トラッキングを無効化し椅子に座ったプレイヤーをダンスさせる事が出来る
たまに降りた後も元のトラッキングやリップシンクが返ってこない事がある。再度トラッキング優先の椅子に座ると直るので、別途用意しましょう

## VRC Animator Locomotion Control
Locomotionなので移動に関する設定
これも実は使える上に、「Disable」にしたら「Enable」にする入力が再度行われるまで無効化し続けてしまう。
アバターリセットでも直らないのでワールド入り直し必須になってしまう
悪用厳禁！！再度「Enable」にする椅子も用意しましょう！！

## VRC Avatar Parameter Driver
アニメーターのパラメーター変更を行う
実は使える。勝手に着せ替えたり、手を触れずに「みみのこ」の耳を抜く、何てことも可能

「VRC Animator Layer Control」「VRC Playable Layer Control」
アニメーターのレイヤーのウェイトを操作するこれらを利用して着せ替えた後、戻せなくするとかも…

## VRC Animator Temporary Pose Space
視点（view point）に関する設定
デフォ設定だとダンスさせても視点はその場に置いてけぼりになります。「Enter」にすると視点追従状態になる
「これ設定してゲッダン踊らせたいな」とか考えてはダメですよ？

## VRC Animator Play Audio
これは椅子ではなく自分自身に使う。
オーディオソース（音源）の参照先ファイルの変更
ダンスを複数入れるなら音源も複数必要になりますが、軽量化の為にこれ使いましょうね
解説動画も置いておきます

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

## 最後に
再三になりますが、今回の記事はわざと分かり難く書いてます。
また、これらのギミックを作ってキック投票もらったりブロックされたりしても当方は一切責任を負いません
Intel Markets ERC-20トークンをPythonで簡単操作！初心者向けガイド

# 🚀 Intel MarketsのERC-20トークンをPythonで操作してみよう！

こんにちは！今回は、Intel MarketsのERC-20トークンをPythonを使って操作する方法をご紹介します。Ethereumネットワーク上でトークンの残高を確認するコード例を交えながら、技術的な側面を解説します。初心者でも簡単に実践できる内容ですので、ぜひ試してみてください！💻

---

## 🌟 Intel Marketsとは？

Intel Marketsは、EthereumとSolanaのデュアルチェーンアーキテクチャを採用した暗号通貨取引プラットフォームです。そのトークン（$INTL）はERC-20規格に準拠しており、スマートコントラクトで管理されています。

---

## 🛠️ PythonでERC-20トークンを操作する

以下は、PythonとWeb3ライブラリを使ってERC-20トークンの残高を確認するコード例です。

### **コード例：ERC-20トークンの残高確認**

```python
# 必要なライブラリをインポート
from web3 import Web3

# Ethereumネットワークに接続（Infuraを利用）
infura_url = "https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID"
web3 = Web3(Web3.HTTPProvider(infura_url))

# ネットワーク接続確認
if web3.isConnected():
    print("✅ Ethereumネットワークに接続成功！")
else:
    print("❌ 接続失敗。URLやネットワーク設定を確認してください。")

# ERC-20トークンのコントラクトアドレスとABI（適宜変更してください）
token_address = "0xYourTokenAddressHere"  # Intel Marketsのトークンアドレス
token_abi = [
    {
        "constant": True,
        "inputs": [{"name": "_owner", "type": "address"}],
        "name": "balanceOf",
        "outputs": [{"name": "balance", "type": "uint256"}],
        "type": "function"
    }
]

# コントラクトインスタンスを作成
token_contract = web3.eth.contract(address=token_address, abi=token_abi)

# ウォレットアドレス（残高を確認したいアドレス）
wallet_address = "0xYourWalletAddressHere"

# 残高取得
balance = token_contract.functions.balanceOf(wallet_address).call()

# 残高をEther単位に変換（必要に応じて）
print(f"💰 残高: {web3.fromWei(balance, 'ether')} トークン")
```

---

### **コード解説**

1. **Web3ライブラリの利用**  
   `web3`ライブラリは、Ethereumブロックチェーンとやり取りするための主要なツールです。

2. **Infuraによるネットワーク接続**  
   Ethereumネットワークに接続するためにInfuraのエンドポイントを使用しています。`YOUR_INFURA_PROJECT_ID`には自身のプロジェクトIDを入力してください。

3. **ERC-20スマートコントラクト**  
   トークンの残高確認には`balanceOf`関数を使用します。この関数は特定アドレスのトークン残高を返します。

4. **残高表示**  
   残高は通常Wei単位で返されるため、必要に応じてEther単位に変換しています。

---

## 💡 実践ヒント

- **必要なライブラリのインストール**  
  上記コードを実行する前に、以下のコマンドで`web3`ライブラリをインストールしてください：
  ```bash
  pip install web3
  ```

- **セキュリティ注意**  
  プライベートキーやウォレット情報は絶対に公開しないよう注意してください。

- **カスタマイズ可能**  
  トークンアドレスやウォレットアドレスは適宜変更して、自分が操作したいトークンやアカウント情報に合わせてください。

---

## 🤔 実際に試してみた感想

このコードは初心者でも簡単に実行できるため、自分のウォレット内のERC-20トークン残高を確認する良い練習になります。また、Intel Marketsなど新しいプロジェクトのトークンにも応用可能です。Solana対応バージョンも試してみたいですね！

---

## 🔗 参考リンク

- [Intel Markets公式サイト](https://intelmarkets.io/invite?ref=INTL17378500622850842261)
- [Intel Marketsホワイトペーパー](https://intel-markets.gitbook.io/intel-markets-whitepaper)
- [Web3.py公式ドキュメント](https://web3py.readthedocs.io/)
- [Infura公式サイト](https://infura.io/)

---

この記事が皆さんのお役に立てれば幸いです！次回はSolanaブロックチェーン上でのSPLトークン操作についても解説予定です。ぜひお楽しみに！🚀
Intel Marketsの魅力を徹底解説：EthereumとSolanaで加速する暗号通貨取引

# 🚀 Intel Markets：暗号通貨取引の未来を切り開くデュアルチェーンプラットフォーム

こんにちは！今回は、暗号通貨取引の新たな可能性を提供する「**Intel Markets**」について、ホワイトペーパーの内容を基に技術的な視点から深掘りしていきます。EthereumとSolanaという2つのブロックチェーンを活用したデュアルチェーンアーキテクチャや、高度なレバレッジ機能を備えた永久先物取引など、革新的な特徴が満載です。初心者から経験豊富なトレーダーまで、すべてのユーザーにとって興味深い内容となっています！

---

## 🌟 Intel Marketsとは？

[![スクリーンショット 2025-01-26 13.14.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3637864/6c2e4cac-fd52-cdb3-634f-41a0267ae10d.png)](https://intelmarkets.io/invite?ref=INTL17378500622850842261)

**Intel Markets**は、暗号通貨取引エコシステムの最前線に立つプラットフォームであり、以下のような特徴を持っています：

1. **永久先物取引へのアクセス**  
   高度なレバレッジオプションを提供し、トレーダーが効率的にポジションを管理できる環境を構築。

2. **デュアルチェーンアーキテクチャ**  
   EthereumとSolanaという2つのブロックチェーン上で動作し、それぞれの強み（セキュリティとスピード）を活用可能。

3. **多様な資産ペア**  
   幅広い取引ペアに対応し、初心者からプロまで幅広いニーズに応える。

4. **リスク管理ツール**  
   包括的なリスク管理機能を備え、トレーダーが市場の変動に対応しやすい設計。

---

## 🛠️ 技術的特徴：デュアルチェーンアーキテクチャ

Intel Marketsの最大の技術的革新は、その**デュアルチェーンアーキテクチャ**です。この仕組みにより、ユーザーはEthereumとSolanaという2つの異なるブロックチェーンの利点を選択的に活用できます。

### **1. Ethereumブロックチェーン**
- **セキュリティ重視**：Ethereumはその成熟度と分散性から、高いセキュリティを提供します。
- **ERC-20トークン対応**：多くのウォレットやDAppsとの互換性が確保されています。
- **課題**：ガス代が高騰する可能性があるため、小額取引には不向き。

### **2. Solanaブロックチェーン**
- **高速処理**：Solanaは1秒間に65,000件以上のトランザクション処理が可能で、リアルタイム性が求められる取引に最適。
- **低コスト**：手数料が非常に安価で、小額取引にも適しています。
- **課題**：Ethereumほどエコシステムが成熟していない部分もあります。

---

## 💡 永久先物取引とは？

Intel Marketsでは、暗号通貨市場で人気のある「永久先物取引」を提供しています。これは、従来の先物契約とは異なり、有効期限が設定されていない取引形式です。

### **特徴**
1. **高度なレバレッジオプション**  
   トレーダーは少額資金で大きなポジションを持つことが可能。ただし、リスク管理が重要です。

2. **資産ペアの多様性**  
   ビットコイン（BTC）やイーサリアム（ETH）など主要通貨だけでなく、多様な資産ペアに対応。

3. **リスク管理ツール**  
   ストップロスやテイクプロフィット機能など、損失を最小限に抑えるためのツールが充実しています。

---

## ⚙️ トレーディング体験：スピードと利便性

Intel Marketsは、初心者からプロフェッショナルまで幅広いユーザー層に対応した設計となっています。以下はその主な特徴です：

### **1. ライトニング高速実行**
Solanaブロックチェーン上での取引では、トランザクション処理速度が非常に速く、リアルタイムでポジション管理が可能です。

### **2. ユーザーフレンドリーなインターフェース**
直感的で使いやすいUI/UX設計により、初心者でも簡単に操作できます。

### **3. 包括的なサポート**
24時間体制でカスタマーサポートを提供し、新規ユーザーにも安心感を与えます。

---

## 🤔 Intel Marketsを選ぶ理由

1. **柔軟性とスケーラビリティ**  
   デュアルチェーン対応により、ユーザーは自身のニーズや市場状況に応じて最適なブロックチェーンを選択できます。

2. **包括的な機能セット**  
   永久先物取引、高度なリスク管理ツール、多様な資産ペアなど、必要な機能がすべて揃っています。

3. **初心者にも優しい設計**  
   シンプルなインターフェースと充実したサポート体制で、新規参入者も安心して利用可能です。

---

## 🔗 参考リンク

- [Intel Markets公式サイト](https://intelmarkets.io/invite?ref=INTL17378500622850842261)
- [Intel Marketsホワイトペーパー](https://intel-markets.gitbook.io/intel-markets-whitepaper)
- [Ethereum公式ドキュメント](https://ethereum.org/en/)
- [Solana公式ドキュメント](https://solana.com/)

---

Intel Marketsは、その革新的なデザインと多機能性によって暗号通貨市場で注目されています。特にデュアルチェーンアーキテクチャや永久先物取引など、高度かつ柔軟性のある仕組みは今後さらに需要が高まるでしょう。この記事が皆さんの参考になれば幸いです！🚀