OmniAICreator/Qiita-1.07M huggingface dataset:
Attiny13AとArduinoを使って任意の周波数を作ってみる～キャリブレーションに関する覚書～

## そもそも任意の周波数を作るならpwmでいいんじゃない？
Arduinoで任意の周波数を作るならpwmを使うのが主流のようですし、生成AIに聞いてもたいていpwmとレジストリで実現する方法を教えてくれます。
例えば[こんな記事](http://blog.kts.jp.net/arduino-pwm-change-freq/ "Arduino Uno – PWM周波数を”自由に”変更する")が私にはわかりやすかったです。
しかし、Attiny13Aのようなマイコンだと
```
'TCCR1B' was not declared in this scope
```
のようなエラーでコンパイルができません。

## 私にはPWMは難しすぎる：ATTinyではpwd＋レジストリが使えなかった
そこで、仕方なく単純にForループで時間調整をすることにしたのですが、最初は周波数に合わせてForで回す回数を調整するのに勘を頼っていたのでなかなか正確な周波数にならないし、複数の周波数のためのパラメーターを見つけるためには種類分試行錯誤を繰り返す必要がありました。

## Forで周波数を調整：勘頼りの調整はやめよう！
試行錯誤だと精度が出なかったことと、作業ががあまりに大変だったので、演繹的にパラメーターを決める方法を考えました。

1.　最初に下記ソースのwavelengthに適当に散らばらせた数字を代入して出力される周波数を測ります。

```C++
#define SP 0
const unsigned int calibration[]={
  5, 10, 20, 40, 80, 200, 1000
};

unsigned int wavelength, j;
int timespan;
unsigned char i;


void setup() {
}

void loop() {
  timespan=10; playList(calibration, ARRAY_LENGTH(calibration));
}

void playList(const unsigned int *list, int arrayLength){
  for(i=0; i<arrayLength; i++){
    wavelength=list[i];
    my_tone();
  }
}

void my_tone(){
    unsigned long cycle_number=timespan*285714/(wavelength+2); // forループで回す総数
    for(; cycle_number>0; cycle_number--){
      PORTB |=  _BV(SP); // LEDピンをHIGH
      for(j=wavelength; j>1; j--){}
      PORTB &= ~_BV(SP); // LEDピンをLOW
      for(j=wavelength; j>1; j--){}
    }
}
```
キャリブレーションとか言いながら、my_tone関数のcycle_numberのところで使っている285714とか2とかいう値は勘で決めています（汗

2.　wavelengthと周波数のプロットを作成して近似直線を引きます。私はオシロスコープを使って1周期の長さを測定しました。下の図では両対数でグラフを書いています。下の絵はLibreOfficeで作成しました。

![キャリブレーション.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199416/bc586322-0a34-46ab-82af-0fd1cc26c5bf.png)

3.　近似直線（y=ax+b）の定数を求めます。
ここではLibreOfficeの関数を用いて以下のように求めました。
傾き　a=LINEST($C$3:$C$9,$B3:$B9, 1, TRUE())
切片　b=INDEX(LINEST($C$3:$C$9,$B3:$B9, TRUE(), TRUE()), 1,2)
精度　R^2=INDEX(LINEST($C$3:$C$9,$B3:$B9, TRUE(), TRUE()), 3,1)
Attiny13A 4.8MHzとかなら　-LOG(1-R^2)　が6以上になれば合格といっていいでしょう。下記スクリーンショットはAttiny13A 4.8MHzでキャリブレーションした結果です。
![スクリーンショット 2025-01-21 021802.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199416/bfaeee27-a6cf-d48a-96f2-52202ffe8f3a.png)

4.　あとは任意の周波数からwavelengthに代入すべき周波数が簡単に計算できます。
wavelength_float=(1000000/周波数-ｂ)/ａ
このままだと小数点が付いてしまうので四捨五入して整数にします。
wavelength_int=int(wavelength_float+0.5)
最後に小数点を四捨五入した結果出力される予定の周波数を確認します。
出力予定の周波数=1000000/(wavelength_int*ａ+ｂ)
![スクリーンショット 2025-01-21 021949.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199416/75429f54-ad39-7983-837f-a03b25c990ab.png)

周波数が高い領域では目的の周波数に近づけるのが難しくなるので、そういう時はマイコンの周波数を9.6MHzとかにあげると周波数を刻む間隔が小さくなるので精度が上げやすくなります。
私はキャリブレーションにオシロスコープを使いましたが、テスターの周波数測定機能を使っても同様のことはできると思います。
とりあえずもう一つwebアプリを作る。環境設定でこんなに調べると思ってなかった。


# Laravelで新しいアプリを作成した記録

## お題：「もう一つアプリを作ってください」

またまた新しいお題が出ました。「もう一つアプリを作ってください。」とのこと。

今回は**要件定義からスタート**です。  
レビューをしてもらった結果、内容が盛りだくさんすぎたため、1週間で開発できるレベルまで機能を削ることになりました。  

ふと思うと、1週目で作ったアプリよりも理解が深まっているな、と感じています。

---

## 振り返り: 1週目のラフな作り方

1週目はひたすら**GPTに聞いてはコピペ**を繰り返していました。  
その結果どうなったかというと……。

- **「blueprint」を「bluepoint」と読み間違える**など、基礎的な部分での理解が浅いまま進んでいた。
- GPTのコードは動くから問題ないけど、書いたり話したときに「あれ？」となることが多々あった。

---

## 新しい作業フローを試す

そんな反省を踏まえ、今回は**作業フローを変更**しました：

1. **GPTに質問** → コード生成。
2. **生成されたコードをしっかり読む**。
3. **分からない箇所は追加で質問**。
4. **納得したら手で模写**（コピーせずに自分で書く）。

### **これ、めっちゃ良い！**
手で書くことで、「さっき理解した内容」を復習できるから、すぐ忘れてもまた確認できる。**2度美味しいフロー**だ。

と思ったが、すでに掲示板で少し書き方を見ている可能性もあることに気がついた。
慣れてきていることにはかわりない。



---

## 環境構築スタート！

早速、作った要件定義とシステム設計書をGPTに投げつつ進めた。  
まずは環境構築の確認から。

### **確認した項目**
- **PHP** → 動作OK。
- **Composer** → Laravelプロジェクト作成に必須。
- **Node.jsとnpm**:
  - Node.jsって、サーバーサイドでJavaScriptを動かせる。
  - npmはVue.jsとかReactとか、ライブラリを管理するツール。
- **Git** → バージョン管理。

---

## Node.jsって結局なに？
ここでちょっと脱線。

- Node.jsは「JavaScriptをサーバーサイドで動かせるもの」。
- PHPでショッピングサイトを作ったときには使っていなかった。
- だから「Node.jsってどういう時に使うものなんだ？」という疑問が湧いた。→Progateで少し触ってみている。

### **今の理解**
- まだ「へー、こう書くんだ」程度の浅い理解。  

---

## npmとViteについても少しだけ調べた

- **npm (Node Package Manager)**:
  - Vue.js、React、Bootstrapをインストールして管理するツール。
- **Vite**:
  - **ビルドツール**で、Laravelではフロントエンドの最適化に使う。
  - 圧縮や統合をして、動作を早くする役割があるらしい。

---

## PHPとNode.jsを比べてみた

調べていると「サーバーサイドでJSを動かす？」という話題に。

「え、PHPもサーバーサイドで動くじゃん。じゃあ重複してるの？」と思ったら、以下のような違いが。

### **PHPの特徴**
- **同期的な処理**: リクエストを1つずつ順番に処理。
- **Webサーバーとの連携**: ApacheやNginxと連携して動く。
    - 過去にPHPでXAMPPを使った経験がある。

### **Node.jsの特徴**
- **非同期的な処理**: 複数のリクエストを同時に処理可能。
- **自分でWebサーバーを作れる**: JavaScriptでHTTPサーバーを構築できる。


---
今Laravelを使っていてApacheとか使ってないからJavaScriptでサーバー構築してるのかな？と思ったら違った。

**「php artisan serve」というコマンドで簡易サーバーが立ち上がる**ことを知る。


---

## Laravel環境構築手順

1. **Laravelプロジェクトを作成**
   ```bash
   composer create-project --prefer-dist laravel/laravel calorie-busters
   ```

2. **ディレクトリを移動**
   ```bash
   cd calorie-busters
   ```

3. **簡易サーバーを起動**
   ```bash
   php artisan serve
   ```



---

### **気づき**
- PHPもNode.jsも同じサーバーサイドの処理ができるけど、得意分野が違う。
    - 違う発見があるな笑
- npmやViteの役割も少し分かってきた。
リピーターハブや、スイッチングハブといった『ハブ』がよく分からない

# ハブで躓く理由
以下2点に当てはまる人向け。
```
1."ハブ"と呼ばれる特定の機器があると思い込んで混乱。（これは間違った認識）

2.ハブの役割について調べると「電気信号の減衰を防ぐため、信号を増幅する役割」だったり、
「部署などで10本のLANケーブルを1つにまとめる役割」だったりと言っていることが異なり混乱。
```
1.について、ハブと呼ばれる機器は
>L1（リピーターハブ）
>L2（スイッチングハブ）
>L3（L3スイッチ）

と、大きく分けて3種類存在するので、「"ハブ"という単語が特定の機器を指している」という認識は誤りです。

2.について、これは単純にハブと呼ばれるものは主に『延長装置』『集線装置』の2つがこなせる機器だから、どちらも正解なのです。

これらは、全部歴史を勉強すると一瞬で違いと役割を理解できます。

# そもそも何故L1、L2、L3レベルの異なる機器に全部"ハブ"という単語がくっ付いているのか
>L1（リピーターハブ）
>L2（スイッチングハブ）
>L3（L3スイッチ）

それは"ハブ"という単語が"要所"という意味を持つからです。集線している機器は"要所"といえるため、ハブと呼ばれています。
そんな事言ったらFWだってルーターだって全部ハブやんけ


# 歴史
## 一章 延長装置リピーターの登場
大昔、LANケーブルが何十メートルにもなるとPCからの信号が次第に弱くなり困っていました。
そこで開発されたのが __リピーター__ です。
(まだリピーターハブではありません)こいつから全ては始まります。
<img width="400" alt="左から右へ。ただそれだけ" src="https://medium-company.com/wp-content/uploads/2020/01/repeater2.png">

## 二章 集線装置リピーターハブ誕生
リピーターが開発されたはいいものの、こいつの役割は『左からきた弱くなった信号を増幅して右に流すだけ』のしょぼい性能でした。
そこで｢増幅して右に流すついでに、その先を複数に出来れば便利なのでは？｣という流れで生まれたのが __リピーターハブ__ です。
ここからも分かるように、ただ信号を増幅させてばら撒くだけなので、MACアドレスやIPアドレスは全く扱いません。つまりリピーターハブはL1の装置と言えます。
<img width="400" alt="左から右へ。複数の宛先へ" src="https://medium-company.com/wp-content/uploads/2019/12/repeater.png">

## 三章 ブリッジリの登場
先述した通り、リピーターハブには欠点がありました。それは繋がっているLANケーブル全てにデータをバラまいてしまうという点です。
これでは無駄が多すぎるということで次に開発されたのが、MACアドレスを見て該当するネットワークを選んで信号を送信する機器です。
これがネットワークの橋渡しのようになっていることから __ブリッジ__ と呼ばれるようになりました。
つまり、MACアドレスを見ているのでL2の装置です。
しかしブリッジ君のポートは最悪の場合、2ポートしかありません。つまり、やってきた通信を営業部と人事部にしか分けられないという話です…暗雲立ち込める。
<img width="400" alt="" src="https://it-biz.online/wp-content/uploads/2022/01/image-29.png">


## 四章 スイッチングハブ（L3スイッチ）の登場
時代が進み、こんなカスみたいなポート数では足りないという話になりました。
そこで登場したのが、単純にポート数を増やした機器です（ホントはもっと違いがありますが資格試験ではそこまで問われません）
こいつを命名する際、「信号の行き先を、より自在に切り替え（スイッチ）ができる集線（ハブ）装置…スイッチングハブでいいか」ということで誕生したのが __スイッチングハブ__ です。
つまり、 __スイッチングハブはリピーターハブやブリッジの完全上位互換__ といえます。


# 『延長装置の役割』『集線装置の役割』とは？
文字通りの意味です。
『延長装置の役割』とは、LANケーブルを何十メートルも伸ばしては信号が弱くなるため、中継地点のような用途で信号を強める機器です。
『集線装置の役割』とは、LANケーブル（線）を集める機器です。
営業部、人事部、社内SE部…などのネットワークを束ねて、一つのポートからネットワークへ。といったイメージ。



# 余談
昔はハブといえばリピーターの事を指していたが、当初から完全上位互換であるスイッチハブは発売されていたのだが高価格である事から暫くはリピーターハブが優勢だった。
「スイッチングハブを使えばいいことは、みんな分かっていた」なんて言われていたそう。


色々ガバガバな箇所があるかもしれません。

# 参考資料
https://ascii.jp/elem/000/000/182/182893/
https://xtech.nikkei.com/it/article/COLUMN/20140131/533782/
https://qiita.com/pinecode1/items/672417576bacc9c49828
https://it-biz.online/it-skills/brideg_switch/
痒い所に手が届く孫の手的なMDソフトウェアobsidianを是非紹介させて欲しい！

#

## obsidianの特徴

NotionやEvernoteなどのクラウドにデータを保存する最新型のソフトウェアとは異なり、obsidianは古き良きローカルインストール型のソフトウェアであり、ローカルにデータを保存する。

しかもそのデータの保存形式は単純明快であり、既存の作成してあるファイル保管場所をデータ保存ディレクトリとして指定できるなど、とても高い柔軟性を備えている。

かつローカルにテキストデータを保存するという事は、Gitによるバージョン管理に融和性があり、Githubによるバックアップ機能なども利用することができるなど、とてもエンジニア心をくすぐる仕様となっている。

なおデータの保存形式はエンジニアが大好きな一部独自仕様を加えられたMarkdown形式を採用されており、高い互換性も兼ね備えている。

Markdownの仕様にはないタグ機能がサポートされており、柔軟な情報設計ができる。

美麗なグラフ機能やミニマルで美しく、わかりずらいUIなど、素晴らしいGUIソフトである。

ローカルインストール型なのでオフラインでも動作する。

(筆者はあまり利用してないので深くは語れないのだが、)Markdownファイル同士をリンクさせる機能が充実しており、スパイダーウェブやWiki的な情報管理を可能としている。そしてリンクしたファイルを前述したグラフ機能で俯瞰的に見ることができるなどのユニークな機能が搭載されている。

大事なことだが、個人利用では無償のソフトである。つまりはタダである。(二回言った。大事だからだ。)

充実のプラグイン　筆者おすすめのプラグインを後述する。

## おすすめのプラグイン
+ Google chromeのプラグイン Obsidian Web Clipper
Evernoteでも似たプラグインがあって筆者もよく利用していたのだが、こちらのプラグインはより強力である。webページをMarkdownに変換し、obsidianに送信する。あとはgit管理するなり焼くなり煮るなり好きにできる。最高である。
---
+ Advanced Tables
Markdownでテーブルを作るのはぶっちゃけめんどっちぃのである。それをサポートしてくれるプラグイン。途中まで書けば、GUIでポチポチすると綺麗なテーブルを作成してくれる。
---
+ Git
Gitのプラグイン　使い方はわかりずらい
---
+ PlantUML
PlantUMLってなんだい？って読者の為に解説すると、Markdownの中に埋め込めるUML図。
UMLって何って人には、私が、それを書くには余白が狭すぎるので各自ggr。とてもきれいにUML図を表示してくれるので実用に耐えられる代物だと感じました。
---
+ Editing Toolbar
Excelみたいなツールバーを上部に表示する。標準搭載でもいいんじゃないかってぐらいしっくりとくる。ボタンをぽちぽちするだけでMarkdownが完成するので生産性が上がります。
RailsのPumaでのHTTPS設定

RailsのPumaを使って、開発環境でHTTPSを有効にしたい場合に、正しく設定しないと問題が発生することがあります。本記事では、HTTPS設定における問題の解決方法を詳細に解説します。

## 問題の原因

`config/puma.rb`に下記のように設定した場合、サーバーが正しく動作しません:

```ruby
port ENV.fetch("PORT", 3000)
ssl_bind "0.0.0.0", "3000", {
  key: ENV.fetch("SSL_KEY_PATH"),
  cert: ENV.fetch("SSL_CERT_PATH")
}
```

### 問題のポイント
- **`port` と `ssl_bind` で同じポートを使用していること**が原因となり、サーバーがエラーを起こす。
- `port` は普通のHTTP接続用、`ssl_bind` はHTTPS接続用ですが、同じポートは一時に1つのプロセスでしか使用できません。

## 解決方法

### 1. 開発環境でHTTPSを有効にする設定
開発環境でしか使用しない場合、`ssl_bind` のみを設定します。

```ruby
ssl_bind "0.0.0.0", "3000", {
  key: ENV.fetch("SSL_KEY_PATH"),
  cert: ENV.fetch("SSL_CERT_PATH")
}
```

これにより、HTTPS接続のみを認めるようになります。

---

## サーバー起動の確認
設定を変更した後、サーバーが正常にHTTPSを使用できるかを確認します。

1. Railsサーバーを起動:
   ```bash
   rails s
   ```

2. ブラウザでアクセス確認:
   ```
   https://localhost:3000
   ```

これで正常にHTTPSでアクセスできるはずです。
＜個人的な備忘録～フロントエンド編～＞HTMLの書き方②

## はじめに
ハッカソンでフロントエンドを担当する機会を頂きましたが、理解が乏しいため備忘録として記事に残し、少しでも整理していきたいと思います。
個人的な備忘録です。IT未経験のため間違っている点がありましたらご指摘いただけますと幸いです。

## HTMLコードの`<head>`部分の意味
コード例をもとに、各部がどのような意味をもっているのかコメントで整理してみます。
`<head>`はメタ情報を記述する部分なので、ブラウザには直接表示されません。
作成する画面が複数ある場合、`<head>`の部分はbase.htmlに記述し、それを各ページで読み込む形にすることが多いです。これはFlask,Djangoなどのフレームワークの機能を利用します。

```
<!-- ブラウザにHTMLであることを明示 -->
<!DOCTYPE html>

<!-- HTML文書の開始。日本語を指定 -->
<html lang="ja">

<head>
	<!-- 文字コードを指定 -->
  <meta charset="UTF-8">
  
	<!-- レスポンシブデザインを有効化 -->
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  
	<!-- SEO用のページの説明文 -->
  <meta name="description" content="ページの説明">
  
  <!-- タブや検索結果に表示されるページタイトル -->
	<title>ページタイトル</title>
    
	<!-- ファビコンの指定 -->
  <link rel="icon" href="img/favicon.ico">
  
	<!-- ブラウザ間のスタイルの違いを防ぐためにリセットCSSを適用 -->
  <link rel="stylesheet" href="https://meyerweb.com/eric/tools/css/reset/reset.css">
  
  <!-- このページに適用するcssファイルを指定 -->
	<link rel="stylesheet" href="css/style.css">
</head>
</html>
```


## 用語の意味の補足
1. `<link>`タグ `href`属性について
 "Hypertext REFerence" の略です。どこにリンクさせるか？を指定します。リンク先はURLやファイルのパスを指定することでHTMLファイルと紐づけることができます。

2. `<link>`タグ `rel`属性について
"RELationship" の略です。`href`でリンクさせた先が何であるかを明示します。たとえばstylesheetであればCSS、iconであればファビコンを表します。

3. リセットCSSについて
ブラウザによってスタイルのデフォルト設定に違いがあるため、その差異をなくすために使用されます。なにも指定しなかった場合に、ブラウザが自動的に適用しているデザインがあります。これをリセットすることで、どのブラウザで開いても共通の見た目となります。いくつか種類がある様です（Eric Meyer’s ResetやNormalize.cssなど）。

## まとめ
何度も練習すれば当たり前のように書けるようになると思いますが、各部がどんな意味を持つのか、しっかり理解した上で記述していけるように学習を継続していきます。
Splatoon3のリザルトを分析したい①【日記】

# はじめに
スプラトゥーンを遊ぶうえで感じたことといえば「あの武器苦手」「この武器苦手」「味方弱い」「敵強い」……
色々あると思いますが、果たしてそれらは実際に勝敗に影響しているのか？
よく「リザルト(キルデス)がすべてじゃない」という言葉を聞きますが本当にそうなのか？

気になりますね？……ね？？

単純に、勝ったときと負けたときでリザルトにどんな差があるのかわかれば勝率を上げられるかもしれませんし、実際のデータを見ればわかることは色々ありそうです。

今回はXマッチに絞ってリザルトを分析していこうと思います。

### 目標
- データの抽出するスクリプトをつくる
    - 50件前後のスクショからデータ抽出
    - sqlite3に格納(予定)
- 分析
    - 勝率に影響する特徴量を知りたい

最低限動くものを作りたいので手抜き工事ですがあしからず。


# そもそもどうやってデータを取るのか
Splatoon3では、ゲーム内かイカリング３(スマホアプリ)でのみリザルトを確認することができます。

ゲーム内の場合は試合自体を分析したいような気がしますが、今回はなるべく簡単に作りたいので**イカリング３**からリザルトを収集することにします。

イカリング３はスマホ版しかないのでスクリーンショットからOCRやらパターンマッチングやらを用いてデータを引っこ抜くことにします。(webでイカリング３を閲覧する方法があるようですが、非公式なのでやめておきます。)

僕のスマホはandroidなのでマクロアプリでデータを抽出……ということはできなくなさそうですが、いちいちスクショをしてpythonで抽出することにします。

この際、イカリング３は50試合前までのリザルトしか閲覧できないので50試合ごとにスクショを１枚１枚取る必要があります。(たぶんここが一番のめんどいポイント)
それこそマクロで簡単にできることだと思うのでひとまずこの案を強行します。

### イカリング３から取れるデータの種類
**実際のスクリーンショット**
![Screenshot_20241128_225658_Nintendo Switch Online.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524271/c9a991ae-2f70-1957-181c-5a4614bfade3.png)

赤い丸をつけた部分が今回イカリング３から抽出したいデータとなっています。

- ガチルール
- 勝敗
- ステージ名
- カウント
- プレイヤーごとの武器
- プレイヤーごとのリザルト(塗りポイント、キル、アシスト、デス、スペシャル)
- 自分の位置(黄色い矢印)
- 試合の時点でのXパワー
- 日時
- 試合時間

これらを抽出することを短期の目標として頑張ります。
【競技プログラミング】AtCoder Beginner Contest 373_C問題

# 問題
https://atcoder.jp/contests/abc373/tasks/abc373_c

# 既存投稿一覧ページへのリンク
[一覧ページ](https://qiita.com/o_chan_t/items/fc759695acfaef8df2cc)

## Before
[AtCoder Beginner Contest 372_E 問題](https://qiita.com/o_chan_t/items/ede9ff0c9fe4b76d2396)

## Next
[Next:AtCoder Beginner Contest 373_D問題](https://qiita.com/o_chan_t/items/124b7f949006f5329505)


# 解法手順1

1. 入力から整数Nを読み取る。
2. 整数列Aを入力から読み取り、リストとして保存する。
3. 整数列Bを入力から読み取り、リストとして保存する。
4. リストAの最大値を求める。
5. リストBの最大値を求める。
6. AとBの最大値の和を計算する。
7. 計算結果を出力する。

なにか引っ掛けがあるかな？と思って構えたけれど、普通にリスト内の値の最大要素を足すだけみたい⋯
C問題の難易度の差って、コンテスト回数ごとにえぐいな


# ACコード1
```python:ac.py
def io_func():
    # 整数Nを入力から読み取る
    N = int(input())
    # 整数列Aを入力から読み取り、リストとして保存
    A = list(map(int, input().split()))
    # 整数列Bを入力から読み取り、リストとして保存
    B = list(map(int, input().split()))
    return N, A, B

def solve(N, A, B):
    # リストAの最大値を求める
    max_A = max(A)
    # リストBの最大値を求める
    max_B = max(B)
    # AとBの最大値の和を計算する
    result = max_A + max_B
    # 計算結果を出力する
    print(result)

# メイン処理
N, A, B = io_func()
solve(N, A, B)

###
# N: 整数列の長さ
# A: 整数列A
# B: 整数列B
# max_A: 整数列Aの最大値
# max_B: 整数列Bの最大値
# result: AとBの最大値の和
# 
# 1. io_func関数:
#    - 標準入力から整数N、整数列A、整数列Bを読み取る
#    - 読み取った値をタプルとして返す
# 
# 2. solve関数:
#    - 引数としてN, A, Bを受け取る
#    - Aの最大値とBの最大値を求める
#    - 二つの最大値の和を計算する
#    - 結果を出力する
# 
# 3. メイン処理:
#    - io_func関数を呼び出して入力を取得
#    - solve関数を呼び出して問題を解く

```
30日デザインチャレンジ [Community Labs]

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1926720/f01932b2-7a1d-4fae-a3b5-dec7a34d28d8.png)

:::note info
本記事は下記の翻訳となります。
[『30 Day Design Challenge』](https://www.communitylabs.com/blog/30-day-design-challenge)（by Community Labs）
:::

今後 30 日間、Pace Studio の創設者であり、Community Labs のデザイン部門責任者である Fayaz が、毎日ショートフォームの動画を投稿し、以下の内容を共有します。

🎨 インスピレーションからデザインの原則、フォントなどに至るまでのデザインリソース

💡 Figma および Framer のハックを使って、より効率的にデザインし、コードなしでウェブサイトを公開する方法

🚀 プロジェクトを 0 から 1 へと進めるための、よりスムーズなデザインプロセスのためのワークフローヒント＆コツ

[https://twitter.com/fayazux](https://twitter.com/fayazux)でフォローしてください！

---

---

:::note info
【Arweave Japan とは】
Arweave Japan は Arweave / AO の日本語ビルダーエコシステム構築を目的とした分散型組織です。

【​Arweave / AO とは？】
​Arweave は無制限にスケール可能な分散型ストレージであり、AO は Arweave 上に構築された無制限にスケール可能な分散型スーパーコンピュータです。Arweave と AO を使って既存のブロックチェーンでは実現不可能であった実用的なプロダクトが開発できます。

イーサリアム L1 のリステーキングによってセキュリティが担保され、TVL はローンチ数ヶ月で 1000 億円近くまで上がり、今後数兆円規模の市場が期待されます。完全フェアローンチされた AO のトークン設計によって、この流動性は AO 上のプロジェクトが活用することができ、ビットコインと同じ半減スケジュールでミントされる AO トークンは開発者やプロジェクトが受け取れる仕組みとなっています。

​Web2 を置き換えるレベルで実用的なプロジェクトが構築できる唯一無二の分散型プロトコル AO で開発することはグローバルの第一線で活躍する非常に大きなチャンスとなっています。

【Social Links】

- [Website](https://arweave.jp)
- [X(Twitter)](https://twitter.com/arweavejp)
- [Discord Community](https://discord.com/invite/bB4N7fAMmp)
- [Github](https://github.com/arweavejp)

【Blog】

- [Zenn Publication](https://dev.to/arweavejp)
- [Note Magazine](https://note.com/kyohei_nft/m/m35c7443e98d0/)
- [dev[.]to](https://dev.to/arweavejp)

![1080x360.jpeg](https://images.lumacdn.com/cdn-cgi/image/format=auto,fit=cover,dpr=2,quality=75,width=1500/editor-images/wj/43c64e53-3361-44d5-a05c-155e4fbf3188)

:::
Git の自動修正機能で開発効率を上げる：help.autoCorrect の正しい使い方

Git を使用していると、誰しも経験するのが「タイプミス」の問題です。特に慌ただしい開発の現場では、`git push` を `git psuh` と打ち間違えるようなケースが頻繁に発生します。このような場合、Git は親切にも「もしかして: push」という提案をしてくれますが、もう一度コマンドを入力し直すのは少なからず面倒です。

本記事では、Git の自動修正機能（help.autoCorrect）について解説します。この機能を適切に設定することで、タイプミスによる作業の中断を最小限に抑え、開発効率を向上させることができます。

## 前提知識：Git とは

Git は分散型バージョン管理システムとして、現代のソフトウェア開発において不可欠なツールとなっています。主にコマンドラインインターフェース（CLI）を通じて操作を行い、`git push`、`git commit` などのコマンドを使用してコードの変更履歴を管理します。

## 自動修正機能の基本

Git の自動修正機能は、コマンドのタイプミスを検知して自動的に修正してくれる便利な機能です。例えば、以下のようなケースで動作します：

```bash
$ git psuh
'psuh' を 'push' に修正して実行します...
```

この機能がない場合は、以下のようなメッセージが表示されるだけで、手動でコマンドを再入力する必要があります：

```bash
$ git psuh
'psuh' というgitコマンドはありません。
もしかして: push
```

## help.autoCorrect の設定方法

自動修正機能は `help.autoCorrect` というパラメータで制御します。グローバルに設定する場合は、以下のコマンドを使用します：

```bash
git config --global help.autoCorrect 30  # 3秒待ってから自動修正
```

## 重要：設定値の正しい理解

help.autoCorrect の設定値については、多くの開発者が誤解しがちな重要なポイントがあります。**設定値の単位は「0.1秒」** であり、以下のように解釈します：

- 30 → 3.0秒の待機時間
- 20 → 2.0秒の待機時間
- 10 → 1.0秒の待機時間
- 1 → 0.1秒の待機時間

特に注目すべきは、設定値「1」の場合です。0.1秒という待機時間は、人間の平均的な反応時間（約0.25秒）よりも短く、**F1ドライバーの反応時間（約0.15秒）をも上回る速さ**です。

## 安全な利用のためのベストプラクティス

自動修正機能を安全に活用するために、以下の点に注意を払うことを推奨します：

1. **適切な待機時間の設定**
設定値は最初は30（3秒）から始め、慣れてきたら徐々に短くしていくことをお勧めします。

2. **修正内容の確認**
自動修正が実行される前に、提案されたコマンドが意図したものであるか必ず確認します。

3. **中断手段の把握**
誤った修正が提案された場合は、待機時間中に Ctrl+C を押すことで実行を中断できます。

## 機能の無効化

自動修正機能が不要になった場合や、より慎重にコマンドを扱いたい場合は、以下のいずれかの方法で無効化できます：

```bash
# 方法1：設定を0にする
git config --global help.autoCorrect 0

# 方法2：設定を完全に削除する
git config --global --unset help.autoCorrect
```

この設定は可逆的であり、必要に応じていつでも再度有効化することができます。

## まとめ

Git の自動修正機能は、開発効率を向上させる有用なツールですが、その設定値の意味を正しく理解し、適切に使用することが重要です。初めは長めの待機時間を設定し、徐々に自分のペースに合わせて調整していくことで、より快適な開発環境を構築することができます。

また、この機能は便利である一方で、誤ったコマンドが実行されるリスクも伴います。そのため、常に修正内容を確認する習慣をつけ、必要に応じて実行を中断できるよう、Ctrl+C の使用を心がけましょう。
【Rails】シリアライザーに対応するTypeScriptの型を生成する方法

Typelizerを使用するとシリアライザーに対応するTypeScriptの型を生成できます。

https://github.com/skryukov/typelizer?tab=readme-ov-file#installation

## インストール

`Gemfile`に以下を追記します。

```rb:Gemfile
gem "typelizer"
```

`bundle install`を実行します。

```terminal
bundle install
```

## 使い方

Albaを使用している場合には`application_resource.rb`に`include Typelizer::DSL`を追記します。

```rb:app/resources/application_resource.rb
class ApplicationResource
  include Alba::Resource
  include Typelizer::DSL
end
```

ターミナルで以下のコマンドを実行すると型定義ファイルが生成されます。
デフォルトでは`app/javascript/types/serializers`に生成されます。

```terminal
rails typelizer:generate
```
EC2で初めて静的ページをデプロイする

AWSを学んで１時間目ぐらいの方向けの記事です。
EC2のみを使ってhtmlをデプロイします。

## 準備するもの
適当なhtmlファイル（友人、知人を驚かせるために凝った仕掛けを入れるのもありですね～）

## AWSでインスタンスを起動する
AWSのアカウントは作成済みの段階で、rootユーザー以外のアカウントで実施するようにしましょう。
まず、コンソールにサインインすると上の方に検索バーがあるので、EC2と検索します（EC2が最初の画面で見つかればそちらから入れます）。オレンジ色のボタンで「インスタンスを起動」を押下。

:::note info 
そもそもEC2、インスタンスとは...
EC2は仮想サーバーのことで、インスタンスはEC2を利用して作成された１台の仮想サーバーのことです。
:::

次のページでは立ち上げるインスタンスの設定をします。
AMI (Amazon Machine Image): Amazon Linux 2
インスタンスタイプ: t2.micro
キーペア: 新規作成（"first_ec2"と名前を付けて.pemを設定し、作成します。自動で秘密鍵がダウンロードされますので、わかりやすいところに保存しましょう。）
セキュリティグループ: 新規作成（SSH トラフィックを許可）

設定したら起動します。

:::note info
・AMIとは（[小さな宇宙人](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%9F_%E5%B0%8F%E3%81%95%E3%81%AA%E5%AE%87%E5%AE%99%E4%BA%BA)の方ではないです笑）、サーバーのOSのことです。

・キーペアとは、SSHの公開鍵と秘密鍵のペアのことです。SSH接続では公開鍵をEC2インスタンスに保存し、ローカルPCに秘密鍵を保存しておきます。接続時、秘密鍵を使用し、接続します。接続するとローカルPCからEC2インスタンスを操作できます。

・セキュリティグループとは、インスタンスへのインバウンド（受信）とアウトバウンド（送信）の通信を管理したり、特定のポート（例: SSHは22番、HTTPは80番）を許可するルールを設定します。
:::

## ローカルPCからSSHでEC2インスタンスに接続する
ターミナルを起動します。

ここで、先ほど立ち上げたインスタンスのパブリックIPをコピーします。
以下を実行
```
ssh -i "first_ec2.pemのフルパス" ec2-user@"インスタンスのパブリックIP"
```

```
sudo yum update -y
sudo yum install -y httpd
sudo systemctl enable httpd  # 自動起動設定 (Amazon Linux)
```

## サイトのファイルを配置します
```
scp -i "first_ec2.pemのフルパス" -r "用意したhtmlのフルパス" ec2-user@"インスタンスのパブリックIP":/tmp
sudo mv /tmp/your-site-files/* /var/www/html/
sudo chown -R apache:apache /var/www/html
sudo chmod -R 755 /var/www/html
```
:::note warn
このとき、EC2インスタンスと接続がされているか確認してください。接続されていると[ec2-user@ip-xx-xx-xx]のように表示されています。
:::

以上が完了し、http://パブリックIP/に接続するとhtmlが表示されます。
作成したものが、スマホでも、誰のデバイスからも見れるというのは感動します。。。
ぜひお試しください～
Arweave Kitプラグイン：Arweave Kitの上に構築することがパーミッションレスに [Community Labs]

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1926720/4bca2577-c7a8-42ab-a785-5c3257c293cb.png)

:::note info
本記事は下記の翻訳となります。
[『Arweave Kit Plugins: Building on top of Arweave Kit is now permissionless』](https://www.communitylabs.com/blog/arweave-kit-plugins-building-on-top-of-arweave-kit-is-now-permissionless)（by Community Labs）
:::

本日、Arweave Kit の最新リリースを発表できることを嬉しく思います。私たちは Arweave の開発をさらに簡素化するために、新しいプラグインシステムを追加しました。このシステムは、主要な Arweave ツールや SDK の大部分をサポートします。GraphQL、暗号化、Wallet Kit のサポートなど、バージョン 1.5.0 は Arweave Kit を Arweave 上でのビルダー向けワンストップライブラリにするという約束をさらに進展させました。

## Arweave のすべてに対応するプラグインシステム

複数のツールや機能をアプリケーションに統合するのは、複雑で時間がかかる作業です。プラグインシステムは、開発者が直接統合することなく、さまざまな Arweave プロジェクトの外部パッケージを活用できるようにし、コーディングプロセスを効率化します。サポートされている外部パッケージをインポートするのに必要なのは、5 行未満のコードだけです。

すでに[ArConnect](https://www.arconnect.io/?utm_source=Blog&utm_medium=Post&utm_campaign=Plugin+System+Announcement&utm_id=Plugin+System+Announcement)や[Othent](https://othent.io/?utm_source=Blog&utm_medium=Post&utm_campaign=Plugin+System+Announcement&utm_id=Plugin+System+Announcement)といった Arweave プロジェクトが含まれており、プラグインシステムはウォレット、取引、認証、スマートコントラクトなどに関するさまざまな機能を提供します。

プラグインシステムを使えば、Arweave での開発がこれまでにないほど簡単になります。プラグインシステムの詳細については、[こちらのドキュメント](https://docs.arweavekit.com/?utm_source=Blog&utm_medium=Post&utm_campaign=Plugin+System+Announcement&utm_id=Plugin+System+Announcement)をご覧ください。

## あなたのプロジェクトをプラグインシステムに追加する

誰でも新しいプラグインをパーミッションレスで作成して共有できます。プラグインギャラリーに追加したい場合は、[こちら](https://github.com/labscommunity/permawebjs-landing/blob/main/src/components/plugIn/plugIns.json)から PR を提出し、ドキュメントを追加してください。

質問があったりサポートが必要な場合は、[Discord](https://discord.gg/UaBMt24yka)でお問い合わせください。

楽しい開発を！🚀

---

---

:::note info
【Arweave Japan とは】
Arweave Japan は Arweave / AO の日本語ビルダーエコシステム構築を目的とした分散型組織です。

【​Arweave / AO とは？】
​Arweave は無制限にスケール可能な分散型ストレージであり、AO は Arweave 上に構築された無制限にスケール可能な分散型スーパーコンピュータです。Arweave と AO を使って既存のブロックチェーンでは実現不可能であった実用的なプロダクトが開発できます。

イーサリアム L1 のリステーキングによってセキュリティが担保され、TVL はローンチ数ヶ月で 1000 億円近くまで上がり、今後数兆円規模の市場が期待されます。完全フェアローンチされた AO のトークン設計によって、この流動性は AO 上のプロジェクトが活用することができ、ビットコインと同じ半減スケジュールでミントされる AO トークンは開発者やプロジェクトが受け取れる仕組みとなっています。

​Web2 を置き換えるレベルで実用的なプロジェクトが構築できる唯一無二の分散型プロトコル AO で開発することはグローバルの第一線で活躍する非常に大きなチャンスとなっています。

【Social Links】

- [Website](https://arweave.jp)
- [X(Twitter)](https://twitter.com/arweavejp)
- [Discord Community](https://discord.com/invite/bB4N7fAMmp)
- [Github](https://github.com/arweavejp)

【Blog】

- [Zenn Publication](https://dev.to/arweavejp)
- [Note Magazine](https://note.com/kyohei_nft/m/m35c7443e98d0/)
- [dev[.]to](https://dev.to/arweavejp)

![1080x360.jpeg](https://images.lumacdn.com/cdn-cgi/image/format=auto,fit=cover,dpr=2,quality=75,width=1500/editor-images/wj/43c64e53-3361-44d5-a05c-155e4fbf3188)

:::
Othentモバイルベータ版が登場 [Community Labs]

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1926720/2a48e296-9c02-44e5-964c-de224e7b06bd.png)

:::note info
本記事は下記の翻訳となります。
[『Othent Mobile Beta Has Arrived』](https://www.communitylabs.com/blog/othent-mobile-beta-has-launched)（by Community Labs）
:::

## Arweave をポケットに

本日、Othent Mobile Beta をリリースしました。これは、スマートフォンから Arweave アプリを簡単に利用できる方法です。Othent Mobile Beta は以下の 2 つの理由で設計されました：

- 最も広く使用されているプラットフォームであるモバイルと Google で、エコシステムへのオンボーディングをスムーズにするため。
- 開発者が修正を加えることなく、モバイルで Arweave アプリをシームレスに利用できるようにするため。

## ユーザー向け

Alex や Permapages のようなアプリへのリンクをスマートフォンでクリックするだけで、今すぐに使えるようになりました。ランディングページで詰まることも、コンピューターを取り出して$U トークンを転送したり、Universal Content Marketplace で取引するために PC を使う必要もありません。

今すぐ[mobile.othent.io](https://mobile.othent.io/)にアクセスして、Othent Mobile Beta をダウンロードできます。これで、あなたも Othent に参加できます。

Othent Mobile Beta をダウンロードしたら、次のことが Permaweb でできるようになります：

- [画像を永続的に Arweave に保存](https://weavetransfer.com/)
- [Permapage を公開](https://permapages.app/)
- [Alex Pool に貢献](https://alex.arweave.dev/)
- [(新しいモバイルユーザー向けに) UDL ライセンス付きアトミックアセットを作成](https://img.arweave.dev/)

Othent であなたの Arweave の旅を加速させ、[u.othent.io](https://u.othent.io/)で無料の$U トークンを期間限定でゲットしましょう！

## 開発者向け

今日から、ArConnect との統合がモバイルデバイス向けにも統合されました。特に何かをする必要はありません；そのまま機能します。ユーザーは、デスクトップで ArConnect を使ってオンボードしたり、モバイルで Othent を使ってオンボードしたりすることができます。

Othent の目標は、Arweave を大衆に利用可能にすることです。あなたがスマートフォンを使って Permaweb で何をするのか、楽しみにしています！

Othent Mobile を統合するには、[docs.arconnect.io](https://docs.arconnect.io/)の ArConnect のドキュメントを参照してください！

---

---

:::note info
【Arweave Japan とは】
Arweave Japan は Arweave / AO の日本語ビルダーエコシステム構築を目的とした分散型組織です。

【​Arweave / AO とは？】
​Arweave は無制限にスケール可能な分散型ストレージであり、AO は Arweave 上に構築された無制限にスケール可能な分散型スーパーコンピュータです。Arweave と AO を使って既存のブロックチェーンでは実現不可能であった実用的なプロダクトが開発できます。

イーサリアム L1 のリステーキングによってセキュリティが担保され、TVL はローンチ数ヶ月で 1000 億円近くまで上がり、今後数兆円規模の市場が期待されます。完全フェアローンチされた AO のトークン設計によって、この流動性は AO 上のプロジェクトが活用することができ、ビットコインと同じ半減スケジュールでミントされる AO トークンは開発者やプロジェクトが受け取れる仕組みとなっています。

​Web2 を置き換えるレベルで実用的なプロジェクトが構築できる唯一無二の分散型プロトコル AO で開発することはグローバルの第一線で活躍する非常に大きなチャンスとなっています。

【Social Links】

- [Website](https://arweave.jp)
- [X(Twitter)](https://twitter.com/arweavejp)
- [Discord Community](https://discord.com/invite/bB4N7fAMmp)
- [Github](https://github.com/arweavejp)

【Blog】

- [Zenn Publication](https://dev.to/arweavejp)
- [Note Magazine](https://note.com/kyohei_nft/m/m35c7443e98d0/)
- [dev[.]to](https://dev.to/arweavejp)

![1080x360.jpeg](https://images.lumacdn.com/cdn-cgi/image/format=auto,fit=cover,dpr=2,quality=75,width=1500/editor-images/wj/43c64e53-3361-44d5-a05c-155e4fbf3188)

:::
Community Labs, $13Kの賞金プールでArweaveコミュニティハッカソンに参加 [Community Labs]

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1926720/c8811a3c-d60c-4330-9914-95c6107858ad.png)

:::note info
本記事は下記の翻訳となります。
[『Community Labs participates in Arweave Community Hackathon with $13K Prize Pool』](https://www.communitylabs.com/blog/community-labs-participates-in-arweave-community-hackathon-with-13k-prize-pool)（by Community Labs）
:::

Arweave コミュニティハッカソンは、2023 年 6 月 28 日から 2023 年 8 月 10 日まで開催されました。50 を超えるプロジェクトが提出され、38 以上の国々から参加者が集まり、このハッカソンは Arweave の歴史における重要な節目となり、コミュニティを前進させる協力の力を示しました。

Community Labs は、このイベントをさまざまな形でサポートする機会を得ました。チームは、[Othent](https://othent.io/)と[ArweaveKit](https://www.arweavekit.com/)の概要を紹介する 2 つのワークショップを開催し、開発者と Community Labs のチームメンバーがプロジェクトやエコシステムについて議論する「チームとの交流イベント」も実施しました。

Community Labs は、ツールの統合から野心的なフルスケールプロジェクトまで、6 つの異なるハッカソンカテゴリーに賞金を提供しました。提出されたプロジェクトは、非常に印象的でした。ツールカテゴリーでは、[Othent](https://othent.io/)、[ArConnect](https://www.arconnect.io/)、[ArweaveKit](https://www.arweavekit.com/)の統合に関する賞金が設定されました。その他の賞金プロジェクトには、Arweave チェーン全体をダウンロードするスクリプト、Permaweb メール通知システム、スマートコントラクトステートステッパーが含まれていました。

Community Labs のツールがこれらの革新的なプロジェクトにシームレスに統合される様子は印象的でした。Arweave チェーンダウンローダー、Permaweb メールシステム、スマートコントラクトステートステッパーは、エコシステム内での利用可能性を示しており、これらのプロジェクトはすぐに Arweave のユーザーや開発者の日常的なソリューションとなるでしょう。

Arweave コミュニティハッカソンは、2023 年 8 月 10 日にデモデーで終了し、$13,000 の Community Labs 賞金プールが 12 の優れたプロジェクトに授与されました。このイベントは、エコシステムの成長と活力を強調し、すべての貢献者の共同の努力の証となりました。

以下の優秀なプロジェクトをチェックし、[Discord](https://discord.com/invite/UaBMt24yka)で Arweave コミュニティハッカソンやプロジェクトについての会話に参加してください。

- [SmartContractAR](https://smartcontractar-web.vercel.app/)
- [ArTrackrHub](https://artrackrhub.vercel.app/)
- [Blip](https://blip-play.vercel.app/)
- [BuyMeAStorage](https://buymeastorage.vercel.app/home)
- [Arweaver](https://www.arweaver.xyz/)
- [LotusLink](https://lotuslink.vercel.app/)

---

---

:::note info
【Arweave Japan とは】
Arweave Japan は Arweave / AO の日本語ビルダーエコシステム構築を目的とした分散型組織です。

【​Arweave / AO とは？】
​Arweave は無制限にスケール可能な分散型ストレージであり、AO は Arweave 上に構築された無制限にスケール可能な分散型スーパーコンピュータです。Arweave と AO を使って既存のブロックチェーンでは実現不可能であった実用的なプロダクトが開発できます。

イーサリアム L1 のリステーキングによってセキュリティが担保され、TVL はローンチ数ヶ月で 1000 億円近くまで上がり、今後数兆円規模の市場が期待されます。完全フェアローンチされた AO のトークン設計によって、この流動性は AO 上のプロジェクトが活用することができ、ビットコインと同じ半減スケジュールでミントされる AO トークンは開発者やプロジェクトが受け取れる仕組みとなっています。

​Web2 を置き換えるレベルで実用的なプロジェクトが構築できる唯一無二の分散型プロトコル AO で開発することはグローバルの第一線で活躍する非常に大きなチャンスとなっています。

【Social Links】

- [Website](https://arweave.jp)
- [X(Twitter)](https://twitter.com/arweavejp)
- [Discord Community](https://discord.com/invite/bB4N7fAMmp)
- [Github](https://github.com/arweavejp)

【Blog】

- [Zenn Publication](https://dev.to/arweavejp)
- [Note Magazine](https://note.com/kyohei_nft/m/m35c7443e98d0/)
- [dev[.]to](https://dev.to/arweavejp)

![1080x360.jpeg](https://images.lumacdn.com/cdn-cgi/image/format=auto,fit=cover,dpr=2,quality=75,width=1500/editor-images/wj/43c64e53-3361-44d5-a05c-155e4fbf3188)

:::
(DAY27) 俺と学ぶRust言語~tree簡易版~

# 今日の内容
- treeコマンドの簡易版を作る

# はじめに
今日はtreeコマンドの簡易版を作成しました。

# 成果物
```rust
use std::path::Path;
use walkdir::WalkDir;

fn main() {
    let args: Vec<String> = std::env::args().collect();
    //もし開始するディレクトリが指定されなければ、今の位置の構造を表示する
    let dir = args.get(1).unwrap_or(&".".to_string()).clone();
    let path = Path::new(&dir);
    let depth: usize = if args.len() > 2 { args[2].parse().unwrap_or(usize::MAX) }
    else { usize::MAX };

    if path.is_dir() { 
        println!("{}", path.display());
        print_tree(path, depth);
    }
    else { eprintln!("指定されたパスはディレクトリではありません: {}", dir); }
}

fn print_tree(path: &Path, depth: usize) {
    for entry in WalkDir::new(path).min_depth(1).max_depth(depth).into_iter().filter_map(|e| e.ok()) {
        let depth = entry.depth();
        let name = entry.file_name().to_string_lossy();
        let prefix = "│   ".repeat( depth - 1 );
        let connector = if entry.file_type().is_dir() { "├───" } else { "└───" };
        println!("{}{}{}", prefix, connector, name);
    }
}
```
フォルダの端に行ったら`└───` と表示させたかったのですが、知識不足が故に思ったより実装が難しくて断念しました。

# おわりに
どなたかWalkDirを用いたときに、エントリがフォルダの端かどうかを判定する方法を教えてください。
似ている表記法

## はじめに
TypeScriptを使う中で、幾つか似ている記法があり  
自分の中での整理も兼ねてまとめました。

## オブジェクト
### オブジェクトとは？
オブジェクトとはキーと値のペア(プロパティ)を、1つ以上持っている  
以下のようなデータ構造のことを指す。  
また、JavaScriptにおいてはその表記法を**オブジェクトリテラル**と呼称する。
```ts
{ 
    id: 0,
    name: "Mac mini",
    cpu: "M4",
    ram: "16",
};
```
#### プロパティとは？
```ts
name: "Mac mini"
```
上記のような、キー(name)と値("Mac mini")のペアのことを指す
- キーに関しては、プロパティ名とも呼称される
### 表記法
- キーをクォートで囲むのは省略可能
- 末尾のプロパティの後に、カンマを置くのは自由
- 末尾にセミコロンを置くのは自由

## JSON
JSONとは、オブジェクトリテラルをベースに作られたデータフォーマットである。  
そのため、JSON自体はデータを作成するためのお約束ごとを指しており  
文字列やオブジェクトのことを指しているわけではない。

```json
{ 
    "id": 0,
    "name": "Mac mini",
    "cpu": "M4",
    "ram": "16"
}
```
### 表記法
- キーをクォートで囲む必要がある
- 末尾のプロパティの後に、カンマを置いてはいけない
- 末尾にセミコロンを置いてはいけない

## 型エイリアス
型エイリアスとは、TypeScriptの記法を用いて名前の付けられた型のことを指す。
```ts
type Product = {
    id: number;
    name: string;
    cpu: string;
    ram: string;
};
```
### 表記法
- 区切りにセミコロンの有無は自由
- 代入文のため、末尾にセミコロンが必要

## interface
interfaceとは、TypeScriptにおいてオブジェクトの構造を定義するための機能を指す。
```ts
interface Product {
    id: number;
    name: string;
    cpu: string;
    ram: string;
}
```
### 表記法
- 区切りにセミコロンの有無は自由
- 末尾にセミコロンは不要

## class
（2025/01/22 追記）

class定義の表記においてもコメントをいただいたので項目として追加  
コンストラクタやメソッドを利用せず、データ構造として使うパターン
```ts
class Product {
    id: number;
    name: string;
    cpu: string;
    ram: string;
}
```
### 表記法
- 各プロパティ宣言の末尾にはセミコロンをつける
- 末尾のプロパティに関しては、セミコロンを省略することも可能だが付けるのが大多数
- 定義の末尾にセミコロンは不要

## 参考
- TypeScript の基礎から始める AWS CDK 開発入門
  - https://catalog.workshops.aws/typescript-and-cdk-for-beginner/ja-JP
- オブジェクト
  - https://jsprimer.net/basic/object/
- JSON
  - https://jsprimer.net/basic/json/
- 末尾のカンマ
  - https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Trailing_commas
- interfaceとtypeの違い、そして何を使うべきかについて
  - https://zenn.dev/luvmini511/articles/6c6f69481c2d17
- 一日一処: TypeScriptのinterface vs type論争の個人的解釈と記述ルール(ESLint)について
  - https://zenn.dev/jinkutoriu/articles/ef7f4dd9b61367
- クラス
  - https://typescript-jp.gitbook.io/deep-dive/future-javascript/classes
新機能リリース：ArweaveKitの強化 [Community Labs]

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1926720/0ef0ea1c-4bd9-40d3-85b6-1f68e9cc4aa8.png)

:::note info
本記事は下記の翻訳となります。
[『New Feature Release: Enhancing ArweaveKit』](https://www.communitylabs.com/blog/arweavekit-release-graphql-encryption-functions)（by Community Labs）
:::

ArweaveKit の最新の改良を発表できることを大変嬉しく思います。このライブラリは、Arweave 上での開発を簡素化するために設計されています。コミュニティからの熱いリクエストに応じて、GraphQL クエリ機能とデータ暗号化機能を追加しました！

## クエリの簡素化

![](https://cdn.prod.website-files.com/66c607043f775347e75460f6/66c628ab5ba6d9d9af2c6864_66c62870c6429a7b588e6bc3_ZEqLMajREIC3xjUM4A6pvyEdQE4.avif)

Arweave ブロックチェーン上のトランザクションデータへのアクセスは、分析からスマートコントラクトのインタラクションまで、さまざまな目的において重要です。GraphQL は以前から Arweave のクエリエコシステムの一部でしたが、今回は ArweaveKit 内でさらに簡単に使用できるようになりました。

ユーザーはもはや GraphQL の API を設定する必要はありません。代わりに、クエリを直接いくつかのゲートウェイに渡すことができるようになりました。このアプローチにより、より効率的でスケーラブル、かつリアルタイムでデータを取得できます。

ArweaveKit でのクエリの使い方についてさらに学ぶには、[こちら](https://docs.arweavekit.com/graphql/introduction-to-graphql?utm_source=CLabs+Blog&utm_medium=Blog&utm_campaign=EncryptGraphQLLaunch&utm_id=ArweaveKit+-+Encrypt+GraphQL)をご覧ください。

## アクセス可能な暗号化

![](https://cdn.prod.website-files.com/66c607043f775347e75460f6/66c628ab5ba6d9d9af2c6861_66c62897da97f30296789cc2_QrNIzg7S0eDureaPqDySL1wU8Y.avif)

永久的なデータストレージの利点から、機密性の高いプライベート情報の適切なデータ保護が求められます。暗号化と復号化の機能は一部のプロトコルで既に存在していましたが、ArweaveKit はこれらの機能を一般公開し、必要に応じてデータのプライバシーと機密性を確保できるようにしました。

ユーザーはもはや複雑な暗号化プロトコルを独自にナビゲートする必要はありません。代わりに、ArweaveKit に組み込まれた暗号化および復号化機能を直接利用することで、データのセキュリティを簡素化できます。このアプローチは、信頼性が高く、ユーザーフレンドリーで効率的なデータ保護手段を提供します。

暗号化、ベストプラクティス、実装方法については、[こちらのドキュメント](https://docs.arweavekit.com/encryption/introduction-to-encryption?utm_source=CLabs+Blog&utm_medium=Blog&utm_campaign=EncryptGraphQLLaunch&utm_id=ArweaveKit+-+Encrypt+GraphQL)をご覧ください。

## 結論

今回の改良は、Arweave をさらに使いやすくするための重要なステップです。ユーザーは、データのクエリとセキュリティの設定を簡単に行えるようになりました。今後も引き続き改善を重ね、ArweaveKit での体験を再定義する新しい機能を提供していきます。今後のアップデートにもご期待ください！

ご質問や作成したものを[Twitter](https://twitter.com/CommunityLabs)や[Discord](https://discord.gg/vWBamba7)でシェアしてください。

ハッピービルディング！🚀

---

---

:::note info
【Arweave Japan とは】
Arweave Japan は Arweave / AO の日本語ビルダーエコシステム構築を目的とした分散型組織です。

【​Arweave / AO とは？】
​Arweave は無制限にスケール可能な分散型ストレージであり、AO は Arweave 上に構築された無制限にスケール可能な分散型スーパーコンピュータです。Arweave と AO を使って既存のブロックチェーンでは実現不可能であった実用的なプロダクトが開発できます。

イーサリアム L1 のリステーキングによってセキュリティが担保され、TVL はローンチ数ヶ月で 1000 億円近くまで上がり、今後数兆円規模の市場が期待されます。完全フェアローンチされた AO のトークン設計によって、この流動性は AO 上のプロジェクトが活用することができ、ビットコインと同じ半減スケジュールでミントされる AO トークンは開発者やプロジェクトが受け取れる仕組みとなっています。

​Web2 を置き換えるレベルで実用的なプロジェクトが構築できる唯一無二の分散型プロトコル AO で開発することはグローバルの第一線で活躍する非常に大きなチャンスとなっています。

【Social Links】

- [Website](https://arweave.jp)
- [X(Twitter)](https://twitter.com/arweavejp)
- [Discord Community](https://discord.com/invite/bB4N7fAMmp)
- [Github](https://github.com/arweavejp)

【Blog】

- [Zenn Publication](https://dev.to/arweavejp)
- [Note Magazine](https://note.com/kyohei_nft/m/m35c7443e98d0/)
- [dev[.]to](https://dev.to/arweavejp)

![1080x360.jpeg](https://images.lumacdn.com/cdn-cgi/image/format=auto,fit=cover,dpr=2,quality=75,width=1500/editor-images/wj/43c64e53-3361-44d5-a05c-155e4fbf3188)

:::
Arweave Wallet Kitの発表 [Community Labs]

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1926720/e7031078-b83d-4291-b6a8-5bf97d2177b8.png)

:::note info
本記事は下記の翻訳となります。
[『Announcing Arweave Wallet Kit』](https://www.communitylabs.com/blog/announcing-arweave-wallet-kit)（by Community Labs）
:::

Community Labs が Arweave Wallet Kit を発表し、開発者に次世代の統合を提供します！ Arweave Wallet Kit は、Arweave ウォレットとパーマウェブアプリケーションとのインタラクションを強化するために設計された開発者向けツールです。Arweave Wallet Kit は、Arweave での開発者向けワンストップライブラリである ArweaveKit の最新の追加ツールです。

従来、Web3 dApp は独自のウォレットを作成するのではなく、主要なウォレットを統合する決定を下してきました。多くのブロックチェーンエコシステムには複数のウォレットが存在するため、dApp は各ウォレットに対応する責任があります。

これまでの数年間で、統合を容易かつスケーラブルにするためのツールの改善が行われてきました。特に、Ethereum および EVM エコシステムでは、WalletConnect や RainbowKit のようなソリューションが、複数のウォレットを 1 つのソリューションに統合することで大きな成功を収めました。

Arweave Wallet Kit は、Arweave エコシステムにおいてまさにその役割を果たします。

これにより、開発者は 1 つのソリューションを統合することで複数の Arweave ウォレットをサポートでき、Arweave Wallet Kit が統合の細かい部分を処理します。

統一された API と React フックおよびコンポーネントの包括的なライブラリを提供することにより、Arweave Wallet Kit は既存の Arweave エコシステムにシームレスに統合され、開発プロセスを簡素化し、開発者が魅力的なパーマウェブアプリケーションを簡単に作成できるようにします。現在、Arweave Wallet Kit は、最も人気のある 2 つの Arweave ウォレット[ArConnect](https://www.arconnect.io/)、[Othent](https://othent.io/)、および Arweave.app をサポートしています。

Arweave Wallet Kit はオープンソースプロジェクトであり、Arweave コミュニティ内でのコラボレーションを促進することを目的としています。新しいウォレットがエコシステムに加わる際には、それらの新しいウォレットもウォレット開発者によって直接ツールキットに追加されることになります。

## 今日から Arweave Wallet Kit を使い始めよう！

Community Labs は、すべての Arweave dApp 開発者に Arweave Wallet Kit が提供する可能性を探るよう呼びかけています。経験豊富な開発者であれ、Web3 の旅を始めたばかりの方であれ、[ArweaveKit.com](https://www.arweavekit.com/?utm_source=CLabs+Blog&utm_medium=Blog&utm_campaign=WalletKitLaunch&utm_id=WalletKitLaunch)にアクセスし、「Get Started」ボタンをクリックして、Arweave Wallet Kit にアクセスしてください。ウェブサイトでは、Arweave Wallet Kit をプロジェクトにシームレスに統合するための包括的なドキュメント、チュートリアル、リソースが提供されています。

最新情報、チュートリアル、そして新機能については、Community Labs の[Twitter](https://twitter.com/CommunityLabs)をフォローしてください。サポートが必要な場合は、Community Labs の[Discord サーバー](https://discord.gg/UaBMt24yka)にご連絡ください。Arweave Wallet Kit を使って作成した素晴らしいパーマウェブアプリケーションを拝見するのを楽しみにしています！

---

---

:::note info
【Arweave Japan とは】
Arweave Japan は Arweave / AO の日本語ビルダーエコシステム構築を目的とした分散型組織です。

【​Arweave / AO とは？】
​Arweave は無制限にスケール可能な分散型ストレージであり、AO は Arweave 上に構築された無制限にスケール可能な分散型スーパーコンピュータです。Arweave と AO を使って既存のブロックチェーンでは実現不可能であった実用的なプロダクトが開発できます。

イーサリアム L1 のリステーキングによってセキュリティが担保され、TVL はローンチ数ヶ月で 1000 億円近くまで上がり、今後数兆円規模の市場が期待されます。完全フェアローンチされた AO のトークン設計によって、この流動性は AO 上のプロジェクトが活用することができ、ビットコインと同じ半減スケジュールでミントされる AO トークンは開発者やプロジェクトが受け取れる仕組みとなっています。

​Web2 を置き換えるレベルで実用的なプロジェクトが構築できる唯一無二の分散型プロトコル AO で開発することはグローバルの第一線で活躍する非常に大きなチャンスとなっています。

【Social Links】

- [Website](https://arweave.jp)
- [X(Twitter)](https://twitter.com/arweavejp)
- [Discord Community](https://discord.com/invite/bB4N7fAMmp)
- [Github](https://github.com/arweavejp)

【Blog】

- [Zenn Publication](https://dev.to/arweavejp)
- [Note Magazine](https://note.com/kyohei_nft/m/m35c7443e98d0/)
- [dev[.]to](https://dev.to/arweavejp)

![1080x360.jpeg](https://images.lumacdn.com/cdn-cgi/image/format=auto,fit=cover,dpr=2,quality=75,width=1500/editor-images/wj/43c64e53-3361-44d5-a05c-155e4fbf3188)

:::
[Ruby]最近paiza始めた人向け！入力の受け取り`gets`時の小技を3つ紹介！[paizaラーニング]

# はじめに
こんにちは！Ruby学習中の、やま さかな(@YamzknA)と申します。

paizaラーニングやってますか？
やってみるとパズルみたいな感じで楽しいですよね。
でも、標準入力受け取るのが、ひと手間で、ちょっと面倒ですよね。
そこで、入力値を受け取るときに、少し楽になる方法をご紹介します！

https://paiza.jp/challenges/info

## 前提


### 3つの紹介項目 
この記事では以下の３つの項目についてご紹介します

- 入力を受け取るときに整数型にしておく
- 何度か入力を受け取る場合に配列で受け取る
- 一度の入力でいくつか値を受け取る場合に、分割して処理する

また、最後には３つの小技をすべて合わせて使用すると、こんな風に楽に書けるというものを紹介します。
<br>

### 以下注意事項です
- 言語は`Ruby`です
- 筆者はBランクが解ける程度のスキルレベルですので、参考程度に留めてください

<br>
また、paizaはスキルチェックにおいて、結構<INS>厳しく相談等を禁止</INS>していますので、ほかの人と問題について相談する際はご注意ください。

↓↓paizaスキルチェック禁止事項については、以下を参照

https://paizasupport.zendesk.com/hc/ja/articles/360038932191

それでは、さっそく紹介していきます！

# 入力を受け取るときに整数型にしておく
入力は`gets`では、文字列型として受け取ります。
使うときに毎回処理するのが面倒なので、文字を含まない場合は最初から整数型に変換しておきます。

また、入力の末尾には改行コードが含まれますが、to_iで処理した際に消えます。
（文字を受け取る際に忘れがちなので、僕は考えることをやめ、毎回chompしてます）
```ruby
#入力が一桁の数字 3 の場合

#＃getだけで受け取る
hoge = gets
p hoge

=> '3\n' #文字列型、かつ、末尾に改行コード\nが入っている

##gets.to_iまたはgets.chomp.to_iで受け取る
hoge = gets.to_i
fuga = gets.chomp.to_i

=> 3 #整数型となる
```
↓↓`chomp`に関しては、以下を参照

https://docs.ruby-lang.org/ja/latest/method/String/i/chomp.html

# 何度か入力を受け取る場合に配列で受け取る
paizaではたびたび、数回分`gets`で取得した値を一度に扱いたいことがあります。
その際に文字列として受け取って、毎回処理していると大変なので、最初から配列として受け取ります。
その際に使用するのが、`Array.new()`になります。
`Array.new(n){}`は配列を新しく作ることができ、引数のn回分ブロック内の処理を行うというものです。
```ruby
#入力が一桁の数字で、5回分受け取る場合
ary = Array.new(5) { gets.chomp.to_i }
p ary

=> [1, 2, 3, 4, 5] 
#5回getsしたので、5つの入力受け取ったことになる
#受け取った値は毎度.chomp.to_iで処理している
```

↓↓`Array.new`に関しては以下を参照

https://docs.ruby-lang.org/ja/latest/method/Array/s/new.html

# 一度の入力でいくつか値を受け取る場合に、分割して処理する
入力として`1 3 5 7 9`のように一度でいくつも渡される場合があります。
それらを一つずつ扱いたい場合は、`split`で分割してから、`map`で処理してしまいます。
ここで使用する`map(&:to_i)`は少し特殊な書き方ですが、やっていることは配列の要素に対して個別に`.to_i`を行うというものです。

```ruby
#入力が複数の数字で、一度に受け取る場合
nums = gets.chomp.split.map(&:to_i)

=> [1, 3, 5, 7, 9] 
#文字列'1 3 5 7 9\n'をchompとsplitで処理し→['1', '3', '5', '7', '9']
#それらを個別にto_iした
```

↓↓`map(&:to_i)`に関しては以下の[ mapメソッドの省略した書き方 ]を参照

https://pikawaka.com/ruby/map#mapメソッドの省略した書き方

# これまで紹介してきたモノの合わせ技
上記3つのメソッドを合わせることで、複数の値を複数回受け取るといった処理を、1行で書くことができます。
例えば、一行目に以下何行にわたって値があるか記載がある場合で考えます。
```ruby
4
1 2 3 4 5
2 4 6 8 10
1 3 5 7 9
5 4 3 2 1
```
```ruby
num = gets.chomp.to_i
ary = Array.new(num) { gets.chomp.split.map(&:to_i) } #この1行で二次元配列を生成
p ary

=>
[[1, 2, 3, 4, 5], [2, 4, 6, 8, 10], [1, 3, 5, 7, 9], [5, 4, 3, 2, 1]]
```

# さいごに
ここまでお付き合いいただき、ありがとうございました。
今回は標準入力をパパっと受け取って、アルゴリズムに向き合うための小技をご紹介しました。
少しでも皆様のお役に立てれば幸いです。
ReactにおけるJSX構文と仮想DOMの基本

# はじめに
この記事は、Reactを学ぶ中で得た知識や感じたことを記録したメモをまとめたものです。エンジニア初学者として学習する中で気づいたポイントや躓いた部分を整理し、後から振り返った際に役立てるとともに、Reactを学び始めた方々にも少しでも参考になる内容になれば幸いです。

# JSX構文とは
Reactでは、```JSX構文```というHTMLに似た構文を使用してUIを定義する。JSXを使うと、HTMLのような記述でコンポーネントの構造をわかりやすく表現することができる。
JSX（JavaScript XML）は、JavaScriptの中でHTMLのような構文を記述できる機能。以下のように、JSXを使用するとUIを直感的に記述することができる。

```
const element = <h1>Hello world!</h1>;
```

このコードは、ブラウザがそのまま理解できるHTMLではなく、JavaScriptコードに変換されてから実行される。


# JSXをJavaScriptに変換する方法
JSXをそのままブラウザに読み込むことはできないため、```Babel```というソフトウェアを使ってJavaScriptに変換する。Babelは、JSX構文をJavaScriptのオブジェクト形式に変換する役割を果たす。

Babelを利用するには、HTMLファイルの```<head>```タグに以下のスクリプトを追加する。

```
<script src="https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/6.26.0/babel.min.js"></script>
```

このスクリプトにより、ブラウザ上でBabelを動作させることが可能になる。

# JSXを使用する際の記述方法
JSXを利用するには、```<script>```タグの```type```属性を```text/babel```に設定。これにより、ブラウザはBabelを使用してJSXをJavaScriptに変換する。

```
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>JSXの基本</title>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/6.26.0/babel.min.js"></script>
</head>
<body>
  <div id="root"></div>

  <script type="text/babel">
    const root = ReactDOM.createRoot(document.getElementById('root'));
    root.render(<h1> Hello world! </h1>);
  </script>
</body>
</html>
```

# 仮想DOMとは
Reactは、UIの効率的な更新を実現するために**仮想DOM**を使用する。仮想DOMは、ブラウザの実際のDOMとは別に、軽量なコピーをメモリ上に保持する仕組み。

## 実際のDOMとは？
実際のDOM（ブラウザのDOM）は、HTMLドキュメントを元にブラウザが構築するツリー状のデータ構造。これを使うことで、Webページの内容を操作や更新が可能。

```
<h1 id="title">こんにちは</h1>
```
上記HTMLは以下のようなDOMツリーとしてブラウザに保存される。
```
- h1 (id: title)
  - テキストノード: "こんにちは"
```

一方、仮想DOMではこのHTMLを以下のようにJavaScriptオブジェクトで表現する。
```
{
  type: "h1",
  props: { id: "title" },
  children: ["こんにちは"]
}
```
## 仮想DOMの仕組み
### 1. 軽量なJavaScriptオブジェクト
仮想DOMは、実際のDOMではなく、JavaScriptオブジェクトとして表現される。これにより、実際のDOM操作よりも高速に動作する。
### 2. 変更箇所の効率的な追跡
Reactは仮想DOMの古い状態と新しい状態を比較して、変更が必要な部分だけを実際のDOMに反映する。これにより、ブラウザへの負荷を最小限に抑えながら、高速なUIの更新を実現。
### 3. React.createElementの役割
JSXを使って記述されたコードは、Babelを通じて```React.createElement```関数が呼び出され、仮想DOMが生成される。

## 仮想DOMと実際のDOMの更新の流れ
Reactの仮想DOMは、次のような流れでUIを更新する。
1. **仮想DOMを生成**: 
JSXで記述されたUI（例: ```<h1>こんにちは</h1>```）は、仮想DOMのJavaScriptオブジェクト（例: ```{ type: "h1", children: ["こんにちは"] }```）として作成される。

2. **仮想DOMを比較**: 
UIが変更されると、新しい仮想DOMを作り、以前の仮想DOMと比較する（これを「差分計算」という）。

3. **差分のみを実際のDOMに反映**: 
差分計算で見つかった変更箇所だけを実際のDOMに反映。これにより、ブラウザの負担を最小限に抑えつつ、高速にUIを更新する。

# JSXの基本的なルール
### 1. 1つの要素で囲む
JSXでは、複数の要素を返す場合、すべてを1つの親要素で囲む必要がある。
```
return (
  <div>
    <h1>タイトル</h1>
    <p>説明文です。</p>
  </div>
);
```

### 2. JavaScriptの式を埋め込む
JSX内で```{}```を使うと、JavaScriptの式を埋め込むことができる。
```
const name = '太郎';
const element = <h1>こんにちは、{name}さん！</h1>;
```

### 3. クラス名の指定
HTMLの```class```属性は、JSXでは```className```として記述する。
```
const element = <div className="container">内容</div>;
```
オブジェクトとMapの違い

# はじめに
`Map`はオブジェクトと似たようにキーと値のペアを格納できますが、いくつかの重要な違いがあります。

# 主な違い
#### **1. キーの種類**
- **オブジェクト**: キーは文字列またはシンボルに限定されます。それ以外のデータ型は文字列に変換されます。
  ```javascript
  const obj = {};
  obj[1] = 'one'; // 数値キーは文字列"1"に変換される
  console.log(obj); // { '1': 'one' }
  ```
- **Map**: 任意のデータ型をキーとして使用できます。
  ```javascript
  const map = new Map();
  map.set(1, 'one'); // 数値キーそのまま使用可能
  map.set({ key: 'value' }, 'object value');
  console.log(map);
  ```

#### **2. キーの順序**
- **オブジェクト**: 挿入順は保証されません。ただし、数値に見えるキーは数値順に並べられます。
  ```javascript
  const obj = { b: 'B', 2: 'two', a: 'A', 1: 'one' };
  console.log(obj); // { '1': 'one', '2': 'two', b: 'B', a: 'A' }
  ```
- **Map**: 挿入順が保持されます。
  ```javascript
  const map = new Map();
  map.set('b', 'B').set(2, 'two').set('a', 'A').set(1, 'one');
  console.log([...map.keys()]); // ['b', 2, 'a', 1]
  ```

#### **3. パフォーマンス**
- **オブジェクト**: 小規模なデータでは効率的ですが、大量のデータ操作には不向きです。
- **Map**: 大規模なデータセットの頻繁な追加、削除、ルックアップにはより適しています。

#### **4. イテレーション**
- **オブジェクト**: 直接イテレーションできません。`Object.keys()`や`Object.entries()`を使う必要があります。
  ```javascript
  const obj = { a: 1, b: 2 };
  for (const key of Object.keys(obj)) {
    console.log(key, obj[key]);
  }
  ```
- **Map**: `for...of`や`.keys()`, `.values()`などのメソッドで直接イテレーション可能です。
  ```javascript
  const map = new Map([['a', 1], ['b', 2]]);
  for (const [key, value] of map) {
    console.log(key, value);
  }
  ```

#### **5. サイズの取得**
- **オブジェクト**: サイズを取得するには`Object.keys(obj).length`を使用します。
  ```javascript
  const obj = { a: 1, b: 2 };
  console.log(Object.keys(obj).length); // 2
  ```
- **Map**: `size`プロパティで簡単に取得できます。
  ```javascript
  const map = new Map([['a', 1], ['b', 2]]);
  console.log(map.size); // 2
  ```

#### **6. メソッド**
- **オブジェクト**: 基本的な操作のみ（プロパティの追加、削除、存在確認）。
- **Map**: 豊富なメソッドが用意されています。
  - `.set(key, value)` - キーと値の追加または更新
  - `.get(key)` - キーに対応する値を取得
  - `.has(key)` - キーの存在確認
  - `.delete(key)` - キーと値の削除
  - `.clear()` - 全エントリーの削除

#### **7. プロトタイプ継承**
- **オブジェクト**: `Object.prototype`を継承するため、`toString`や`hasOwnProperty`といったメソッドが衝突する可能性があります。
  ```javascript
  const obj = {};
  console.log(obj.toString); // [Function: toString]
  ```
- **Map**: プロトタイプの衝突がなく、キーや値が純粋に管理されます。
  ```javascript
  const map = new Map();
  console.log(map.toString); // [Function: toString] from Map prototype
  ```

# 使い分け
- **Object**:  
  シンプルな構造で、文字列のキーだけで十分な場合に最適です。  
  **例**: エンティティの表現、設定オブジェクト、またはJSON形式のデータ。

- **Map**:  
  以下のような複雑なユースケースに適しています：  
  - キーに任意の型を使用できる必要がある場合。  
  - 挿入順序を保持することが重要な場合。  
  - 頻繁な追加・削除が必要で、パフォーマンスが重要な場合。  
  **例**: キャッシュ、非文字列キーを使った検索処理。

# 早見表

| 特徴                  | オブジェクト              | Map                      |
|-----------------------|--------------------------|--------------------------|
| **キーの種類**        | 文字列/シンボル          | 任意のデータ型           |
| **キーの順序**        | 保証されない（数値キーは順序）| 挿入順が保持される      |
| **パフォーマンス**    | 小規模データ向け          | 大規模データ向け          |
| **イテレーション**    | 間接的                   | 直接的                   |
| **サイズの取得**      | `Object.keys()`が必要     | `.size`プロパティ         |
| **メソッド**          | 制限あり                 | 豊富なメソッド            |
| **プロトタイプ継承**  | 衝突の可能性あり         | 衝突なし                 |
Arweave Frontier：バージニア州ブラックスバーグでブロックチェーンの最前線を構築 [Community Labs]

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1926720/ec6fd391-c294-4c21-86d8-e222d6aade77.png)

:::note info
本記事は下記の翻訳となります。
[『Arweave Frontier: Building on the Edge of Blockchain in Blacksburg, Virginia』](https://www.communitylabs.com/blog/arweave-frontier-building-on-the-edge-of-blockchain-in-blacksburg-virginia)（by Community Labs）
:::

2023 年 4 月 21 日金曜日、Arweave の初の基礎イベントがヴァージニア工科大学のアペックス・センター・フォー・アントレプレナーズで開催されました。このイベントは、Community Labs と AFTR Market がヴァージニア工科大学のブロックチェーンクラブと協力して主催しました。参加した学生たちは、フロントエンドとバックエンド開発の新しいスキルを学び、Arweave Fundamentals Certificate を取得しました。

イベントには、Arweave エコシステムの創業者である Joe Berenbaum と Tate Berenbaum が登壇し、Web3 企業の立ち上げと運営に関する彼らの経験や洞察を共有しました。

さまざまな専攻の学生たちは、Arweave と Permaweb（Web2 と Web3 をつなぐ架け橋として機能する）に関する技術的な基礎を学び、その後、得た知識を活用して、完全に Arweave 上で分散型ソーシャルメディアプラットフォームを共同で構築しました。

これは、Community Labs と AFTR Market が今後開催予定のイベントのうちの最初のものです。両社は、ヴァージニア工科大学コミュニティにより永続的な存在感を確立することを目指しています。

Community Labs は、永続的なデータ保存を可能にする分散型エコシステムである Arweave 上のプロジェクトをサポートするソフトウェアスタートアップおよびベンチャースタジオです。昨年、[Community Labs は 3000 万ドル](https://www.bloomberg.com/news/articles/2022-09-08/teenage-founder-raises-30-million-for-crypto-startup-community-labs#xj4y7vzkg)を調達し、その資金の一部をブロックチェーン教育の推進や Arweave エコシステム内での学生の作品の支援に活用する予定です。

もしあなたの組織や大学が同様のイベントの開催に興味がある場合は、Twitter の[@CommunityLabs](https://twitter.com/CommunityLabs)またはメール（team at communitylabs dot com）でご連絡ください。

---

---

:::note info
【Arweave Japan とは】
Arweave Japan は Arweave / AO の日本語ビルダーエコシステム構築を目的とした分散型組織です。

【​Arweave / AO とは？】
​Arweave は無制限にスケール可能な分散型ストレージであり、AO は Arweave 上に構築された無制限にスケール可能な分散型スーパーコンピュータです。Arweave と AO を使って既存のブロックチェーンでは実現不可能であった実用的なプロダクトが開発できます。

イーサリアム L1 のリステーキングによってセキュリティが担保され、TVL はローンチ数ヶ月で 1000 億円近くまで上がり、今後数兆円規模の市場が期待されます。完全フェアローンチされた AO のトークン設計によって、この流動性は AO 上のプロジェクトが活用することができ、ビットコインと同じ半減スケジュールでミントされる AO トークンは開発者やプロジェクトが受け取れる仕組みとなっています。

​Web2 を置き換えるレベルで実用的なプロジェクトが構築できる唯一無二の分散型プロトコル AO で開発することはグローバルの第一線で活躍する非常に大きなチャンスとなっています。

【Social Links】

- [Website](https://arweave.jp)
- [X(Twitter)](https://twitter.com/arweavejp)
- [Discord Community](https://discord.com/invite/bB4N7fAMmp)
- [Github](https://github.com/arweavejp)

【Blog】

- [Zenn Publication](https://dev.to/arweavejp)
- [Note Magazine](https://note.com/kyohei_nft/m/m35c7443e98d0/)
- [dev[.]to](https://dev.to/arweavejp)

![1080x360.jpeg](https://images.lumacdn.com/cdn-cgi/image/format=auto,fit=cover,dpr=2,quality=75,width=1500/editor-images/wj/43c64e53-3361-44d5-a05c-155e4fbf3188)

:::