OmniAICreator/Qiita-1.07M huggingface dataset:
【Goで学ぶコンピューターサイエンス】ファイルシステムとストレージ

## ファイルシステムの基本構造
### セクター・ブロック
- ストレージデバイス（HDDやSSD）は、物理的な単位でデータを保存します。この単位を「セクター」と呼び、通常は512バイトまたは4096バイトが1セクターに相当します。  
- ファイルシステムはこれらのセクターをまとめて「ブロック」という単位で扱います。1ブロックのサイズは通常、4KBや8KBなどです。  

### メタデータ
ファイルシステムは、ファイルそのもの以外にも、以下の情報を管理します。  
- ファイル名  
- 作成日時や更新日時  
- ファイルサイズ  
- アクセス権限（誰が読み書きできるか）  
- ファイルの場所（ストレージ上のどのブロックに保存されているか）  

### ディレクトリ構造
ファイルを整理するために階層的な構造を提供します。たとえば、Linuxではディレクトリ・Windowsではフォルダを使ってデータを分類できます。  

### インデックス
- ファイルシステムは、ストレージ上のどのブロックが特定のファイルに対応するかを記録しています。これをインデックスと呼びます。  
- インデックスの管理方法にはいくつか種類があります
    - FAT
    - inode

## ファイルシステムの動作原理

### データの保存
- ユーザーが新しいファイルを保存するとき、ファイルシステムはストレージ上の空きブロックを検索して、データを書き込みます。  
- また、そのファイルがどのブロックに保存されたかをインデックスとして記録します。  

### データの読み込み
- ファイルを開く際、ファイルシステムはインデックスを使ってファイルの場所を特定し、データを結合してユーザーに提供します。  

### データの削除
- ファイルを削除すると、ファイルのインデックスを削除してストレージ上のブロックを「空き」とマークします。しかし、データそのものは上書きされるまで残っています。  

### ファイルの拡張
- ファイルサイズが増える場合、追加のデータを保存するために新しいブロックを割り当て、インデックスを更新します。  

## ファイルシステムの主要な要素

### ジャーナリング
- 書き込み中の障害によるデータ破損を防ぐ仕組み。  
- 書き込み作業を始める前に、変更内容を「ジャーナル」に記録します。  
- 障害が発生した場合、ジャーナルを参照してデータを復元します。  

### ファイル割り当て方法
ファイルがどのブロックに保存されるかを管理する方法には、以下の3つがあります。  

#### 連続割り当て
- ファイルを連続したブロックに保存します。  
- メリット
  - 読み書きが高速
- デメリット
  - ファイルサイズが変わると断片化が発生

#### 連結割り当て
- ファイルの各ブロックが次のブロックのポインタを持つ方式。  
- メリット
  - ファイルサイズの増減が柔軟
- デメリット
  - 断片化が起こりやすく、アクセスが遅い

#### インデックス割り当て
- ファイルの全ブロックを指すインデックスを持つ方式。  
- メリット
  - ランダムアクセスが容易
- デメリット
  - インデックスを管理するための追加のメモリが必要

## **断片化（フラグメンテーション）とその対策**  

### 断片化
ファイルのデータがストレージ上で連続して配置されず、分散する現象。これにより、読み書き速度が低下します。  

### **対策**  
#### デフラグ（デフラグメンテーション）
- ファイルを再配置して連続性を回復する操作。  
- 現代のSSDではほとんど不要（フラッシュメモリの特性により断片化の影響が少ないため）

## ファイルシステムの基本操作Goサンプルコード

```go
package main

import (
	"fmt"
	"os"
)

func main() {
	// ファイルの作成
	file, err := os.Create("sample.txt")
	if err != nil {
		fmt.Println("エラー:", err)
		return
	}
	defer file.Close()

	// データの書き込み
	content := "ファイルシステムの仕組みを学びましょう！"
	_, err = file.WriteString(content)
	if err != nil {
		fmt.Println("書き込みエラー:", err)
		return
	}
	fmt.Println("ファイルにデータを書き込みました。")

	// ファイルの読み込み
	data, err := os.ReadFile("sample.txt")
	if err != nil {
		fmt.Println("読み込みエラー:", err)
		return
	}
	fmt.Println("ファイルの内容:", string(data))

	// ファイルの削除
	err = os.Remove("sample.txt")
	if err != nil {
		fmt.Println("削除エラー:", err)
		return
	}
	fmt.Println("ファイルを削除しました。")
}
```
Clojure「らしい」コードを書くための第一歩

## 📝記事の趣旨
私自身がClojureに入門してから3年ほどが経ち、動けばいいという状態から、段々Clojureらしい書き方がどんなものか？というのを実践や先輩方のコードから学ばせて頂きました。


"Clojureらしい"コードが書けるようになることのメリットとしては、主に可読性の向上、変更のしやすさ、単体テストの容易さ、バグを防ぎやすくなること、などが挙げられるかと思います。

### 🌟Clojureらしいコードとは？
Clojureの作者、Rich Hickey氏の有名なプレゼンに、**Simple Made Easy**というものがあり、このフレーズはClojureコミュニティの中で広く共感されているものと思います。
Rich Hickey氏はこのプレゼンで、「単一の役割」「単一の責務」「単一の概念」「単一の次元」のような要素をSimpleと呼んでいます。
この文脈でのsimpleとは「物事が互いに独立していて絡み合っていない状態」を指し、「要素の数が少ない」とか「使いやすい」という意味ではありません。
また、simpleとは逆の、「物事が互いに絡み合っている」ものはcomplectと呼ばれます。

私の解釈では、Clojureらしいコードの書き方とは、コードを可能な限りSimpleな要素で構成すること、すなわち、基本的な構造の値を単一の役割を持つ関数によるフローで加工することである、と考えています。

### 🔒基本的にimmutableな値を使う
immutableな値とは、変数が宣言されてから値を変更することが禁止されている変数です。
他の言語では、プログラミング初心者が度々戸惑う概念として`x = x + 1`のようなコードがありますが、Clojureの世界、もっと言えば関数型プログラミングの世界ではこのような式は異端です。
要は、`x = x + 1`は既に存在する変数`x`に対して、`x + 1`を再代入する式ですが、Clojureでは基本的に一度定義した変数の値(数値に留まらず、マップや文字列などの全てのデータ型)を変更することは行いません。
基本的には、`x`という値に対して`x + 1`という値を使いたい時は、`(+ x 1)`のように`x`に関数を適用した返り値を使うか、`(def new-x (+ x 1))`のように新たな変数定義をすることになります。
この変数の変更の制限は、一見すると不便にも見えますが、このようにすることで、プログラム実行のどの時点で参照しても値が一貫しているという重要なメリットがあるのです。

### 📦極力基本的なデータ構造を使用する
これはオリジナルなクラスやインスタンスを使ったプログラミングをするのではなく、マップ、リスト、関数のような基本的なClojureのデータ構造で構成されたデータを使用するということです。基本的なデータ構造を使うと、コードリーディングの際に処理がわかりやすくなります。
データの中身をREPL確認しやすい、Clojureやライブラリの関数を簡単に利用できる、といったメリットもあります。

### ✂️デストラクチャリングを効果的に活用する

Clojureには充実したデストラクチャリングのための構文があります。
特に、map構造に対するデストラクチャリングを使うことで、データを扱いやすい形に分解することと、可読性を大きく上げることが同時に実現されます。

以下は単純なコードをmap構造のデストラクチャリングを使って書き換えた例ですが、これだけでもこの記法による変数利用の利便性向上を感じて頂けるかと思います。
```clojure
(def alice {:first-name "Alice"
            :last-name "Smith"
            :age 20})

;; デストラクチャリングを使わない場合
(defn format-user [user]
  (str (:first-name user) " " (:last-name user) 
       " (" (:age user) "歳)"))

;; map構造のデストラクチャリングを使う場合
(defn format-user [{:keys [first-name last-name age]}]
  (str first-name " " last-name " (" age "歳)"))
```

この他にも、有用なデストラクチャリングの記法があるので、初心者は公式のガイド([Destructuring in Clojure](https://clojure.org/guides/destructuring))を一読してみることをおすすめします！

### 🎯アローマクロを使う
Clojureでは入力の値に対して、パイプラインのように順番に関数を適用するフローを実行することで、目的の出力を得る、というスタイルでコーディングする機会が多いです。このようなプログラミングのスタイルに対して、非常に相性が良く、可読性を向上させてくれるのが、アローマクロを使った書き方です。

以下はアローマクロを使った書き換えの簡単な例です。アローマクロを使わない場合には、1つの関数の処理の範囲を一目で認識するのが難しいですが、アローマクロを使って書けば、データに対する一連の操作が1行ずつ上から順に適用される様子が分かりやすくなります。
```clojure
;; アローマクロを使わない場合
(update (assoc {:name "Alice" :age 20} :email "alice@foo.com") :age inc)

;; アローマクロ(->)を使う場合
(-> {:name "Alice" :age 20}
    (assoc :email "alice@example.com")
    (update :age inc))
```
このサンプルコードに使用した`->`以外にも`->>`, `as->`, `some->` `cond->`などが、引数の位置の違いや、処理条件の違いなどで使い分けられますので、使いこなせるようになると良いでしょう！このトピックにも、公式のガイド([Threading Macros Guide](https://clojure.org/guides/threading_macros))があります。

### 🎓おわりに
Clojureは上手く書けるようになるのが中々難しく、上達に時間の必要な言語だと思います。しかし、他の手続き型の言語しか触れて来なかったプログラマに様々な新しい視点を与えてくれる言語だとも感じます。
私自身は例えば、以下のような変化があったように思います。

- データとその操作を分離して考えること
- 入力値から出力値へのパイプライン状に値を変換する、という視点
- 副作用の影響への強い意識
- 問題解決を、極力シンプルで小さな関数の組み合わせで実現できないか考えるような意識付け(これはまさに、Simple Made Easyの考え方です)

これからClojueを学ぶ方々が、新たな発見や学びが得られるよう願っています！
TCPとは

> TCP(Transmission Control Protocol:伝送制御プロトコル)は低信頼インターネットワーク上で`高信頼エンド・ツー・エンドのバイト・ストリームを提供するよう設計`された。インターネットワークは、その各部分でトポロジ、帯域、遅延、パケットサイズなどのパラメータが大きく異なるという点で単一のネットワークとは異なる。`TCPは多くの種類の障害に対して頑強で、インターネットワークの特性に動的に対応`するように設定されている。

### TCPが存在する場所はライブラリ、OSの中
>TCPをサポートする各マシンは、TCPトランスポート・エンティティを持つ。TCPトランスポート・エンティティはライブラリ手続きか、ユーザー・プロセス、カーネルの一部として実装され、TCPストリームとIP層へのインタフェースを管理する

### TCPはIPにない信頼性をツケ加える
>IP層はデータグラムを適切に配送することを保証しないため、TCPは必要に応じてタイムアウトを起こし、再送する。また、データグラムは間違った順で到着することもあるので、それを再組み立てして適切な順番にする。要するに、TCPは、ユーザーは要求するが、IPが提供しない信頼性を与える

https://bookplus.nikkei.com/atcl/catalog/23/03/16/00728/

* バイトストリームとは?
ラズパイとAmazonS3を使った子豚の出産通知の改善

## はじめに

以前、畜産農家が深夜に子豚が産まれていないかを見に行く手間の削減として、ラズパイを使って子豚の出産通知を作ったのですが、GoogleDriveとの認証でエラーが出るようになってしまい、調べたのですが解決できず。
また、通知された画像を見る際、GoogoleDriveにアクセスする必要があり、ワンクリック必要なのがちょっと煩わしかったので、その課題解決としてAmazonS3を活用することにしました。

その結果、LINE通知でGoogleDriveのURLを送っていた部分が、画像で送付されるようになったので、LINEの画面だけで完結するようになり、以前のものより使いやすいものになりました。

※変更の内容
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1359985/c1e3da5e-b380-b236-0bb0-456e060173cb.png)


## システムの概要と改善箇所

このシステムの処理の流れは以下のようになっています。
ラズパイで撮影した画像をユーザに見せる方法として、GoogleDriveを使用していたのですが、エラーになってしまったので、通知の方法をAWSを活用するように置き換えました。

1. 画像を撮影
2. 画像を保存
3. 画像分析
4. 写真に情報を追記
5. 画像をGoogleDriveにアップロード　→　**画像をAmazonS3にアップロード**
6. GoogleDriveのURLをLINE通知　→　**URLを参照して画像そのものをLINE通知**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1359985/cba66034-e17e-61a4-8c07-0ca717013b3c.png)



## AmazonS3にアップロードする処理
引数で撮影した画像のファイルパスを渡して、S3にファイルをアップロードします。
その後、URLを取得して戻り値で返します。

'XXXXXXXXXX'にはAWSでバケットを作るときに取得したアクセスキーを、
'YYYYYYYYYY'にはAWSでバケットを作るときに取得したシークレットキーを設定します。

``` python
import boto3
from botocore.exceptions import NoCredentialsError

def s3_upload(filepath):
    # AWSの設定
    AWS_ACCESS_KEY = 'XXXXXXXXXX'
    AWS_SECRET_KEY = 'YYYYYYYYYY'
    REGION_NAME = 'ap-northeast-1'
    BUCKET_NAME = 'piglet-bucket'

    # boto3のS3クライアントを作成
    s3 = boto3.client(
        's3',
        aws_access_key_id=AWS_ACCESS_KEY,
        aws_secret_access_key=AWS_SECRET_KEY,
        region_name=REGION_NAME
    )

    #日時からファイル名を作成
    now = datetime.datetime.now()
    nowtime = now.strftime('%Y%m%d%H%M')
    object_name = nowtime + ".jpg"

    s3.upload_file(filepath, BUCKET_NAME, object_name)
    url = s3.generate_presigned_url('get_object',
                                    Params={'Bucket': BUCKET_NAME,
                                               'Key': object_name},
                                    ExpiresIn=3600)
    return url
```

## URLを取得して画像をLINE通知する処理
取得したURLを使って、linebotAPIで通知します。

"XXXXXXXXXXXXXX"にはLINEBotのアクセストークンを設定します。

``` python
def line_notice_image(url):
    # アクセストークンの設定
    LINE_CHANNEL_ACCESS_TOKEN = "XXXXXXXXXXXXXX"
    line_bot_api = LineBotApi(LINE_CHANNEL_ACCESS_TOKEN)

    # 画像の送信
    messages = ImageSendMessage(
        original_content_url=url,  # 画像のオリジナルURL
        preview_image_url=url  # プレビュー画像のURL（同じURLを使うことができます）
    )
    line_bot_api.broadcast(messages)

```

## おわりに
子豚の出産通知自体が技術を使った解決で、この改善はちいさなものですが、システムを作った後も困りごとは尽きません。課題にぶつかって心が折れそうなとき、少し引いてみると新しいものや便利なものが見つかったりするので、この記事がその一助のなればいいなと思います。

ちなみに、当初AWSを使わなかったのはコストの面も大きかったのですが、実際にこの程度の使用ならつけっぱなしでも大した額にはならなそう(1ドル以下)です。
【TypeScript】TypeScriptを理解する - その1：なぜTypeScriptを使うのか

## typescriptなぜ使うのか？

:::note warn
自己理解のためのアウトプット記事
:::

### 型定義でコードの意図を明確にできる（ドキュメント的な役割）

TypeScriptを使うと、関数の引数や戻り値に型をつけることで、コードがどのように動くのかを明確にできます。これにより、関数の使い方を理解しやすくなるだけでなく、他の人または過去の自分が書いたコードも読みやすくなります。

```tsx
Javascriptの場合

// この関数が何を受け取るか？何の計算なのかが不明
function add(a, b) {
 return a + b　
}


Typescriptの場合

// この関数が「数値を受け取り、数値を返す」ことが明確
funtion add(a:number, b:number): number {
 return a + b;
}

```

さらに、TypeScript対応のライブラリを利用する場合、型定義を読むことで、そのライブラリの使い方がすぐにわかる。

**例: axiosライブラリ**
``` tsx
// node_module内のintex.d.tsにある型定義を読むことで、引数に何を渡すべきかが簡単に理解できる
import axios from "axios";

const request = axios.get("https://aaa/get", {
  headers: {
    "Content-Type": "application/json",  }
});
```

### エラーを未然に防ぎ、安心して開発できる（linterとしての側面）
コードを書いている途中で頻繁にチェックができ、間違いを教えてくれるので、後から動かない原因を探す手間が減るし未然にエラーを防ぐことができる。

```tsx
// JavaScript:

console.log(request);
// 実行時にエラー：ReferenceError: request is not defined.
// 実行するまでエラーに気づくことができない（後からどこでエラーになっているかを探す必要がある）


// TypeScript:

console.log(request);
// コンパイル時にエラー: ReferenceError: request is not defined.
```

### 最新の構文を使いつつ、古いバージョンの環境にも対応できる
- TypeScriptを使うと、最新のJavascript構文を活用しつつ、古いJavaScript環境（例えばES5やES3）でも動くコードにコンパイルできる。
perl 1

```
[root@centos8_1 ~]# cat perl.pl
#!/usr/bin/perl

my $a = "SHIBATAZZZZZZZZZZZ";
my $b = "HI";

if ( $a =~ $b ) {

   print "$aに$bは含まれます\n";

}

print "END\n";
```

<h2>shiftの使い方</h2>

```
[root@centos8_1 ~]# cat perl2.pl
#!/usr/bin/perl

sub make {

my $num1 = shift;
my $num2 = shift;
my $num3 = shift;

print "$num1\n";
print "$num2\n";
print "$num3\n";

}

&make(1,2,3);
```

<h2>splitの使い方</h2>

```
root@centos8_1 ~]# cat perl3.pl
#!/usr/bin/perl

my $user = "xyzzys:x:1000:1000:xyzzys:/home/xyzzys:/bin/bash";

my @users = split(/:/,$user);


for (my $i = 0; $i < @users; $i++){
  print "$users[$i]\n";
}

[root@centos8_1 ~]#

```

<h2>perl正規表現の技</h2>　

<h3>大前提　chompは行いましょう！！</h3>

```

####文字列の前のスペースをなくす方法####

s/^\s+//;

####文字列の後ろにあるスペースをなくす方法####

s/\s+$//;


```
χ二乗分布と正規分布を用いたシミュレーション

# はじめに
χ二乗分布は互いに独立な$n$個の確率変数$Z_1,Z_2,\cdot \cdot \cdot Z_n$が標準正規分布を満たしているとき、確率変数$X=\Sigma_{n=1}^{n}Z_k$の自由度$n$の確率分布を意味する。ここで、今回は、正規分布にしたがうとみなせる、Pythonの乱数生成機能（np.random.normal）を用いて、χ二乗分布のヒストグラムが描写できるかどうかを調査する。結果、以下のようなグラフになった。

![x2_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/5031d877-aa6d-dd4f-05ae-1d0e484f0f67.png)

# プログラム
以下のようなプログラムを作成した。

``` python x2.py
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
import math
#自由度
num=10
#サンプル数
n=10**6
Z=np.zeros(n)
for i in range(num):
  #標準正規分布の作成
  Z_add=np.random.normal(0,1,n)
  #χ二乗分布の作成
  Z=Z+Z_add**2
  
plt.title("自由度"+str(num))
plt.hist(Z,bins=100,density=True,alpha=0.5,label="Z_1")
plt.savefig("x2_"+str(num)+".png")
plt.show()
```

# 結果
自由度が2,3,5,10のときのヒストグラムを以下に示す。


![x2_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/5031d877-aa6d-dd4f-05ae-1d0e484f0f67.png)


![x2_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/f9d0fe55-c73a-8a88-d61f-139bc6da7bd9.png)

![x2_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/652794b3-766e-13f5-f3ef-3c9292f439ac.png)

![x2_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/b67bca70-a7e4-ad60-8e00-325c368685fa.png)

このように、正規分布とは似て非なる独特な分布様式を描写することができた。

# まとめ
今回は、標準正規分布に従う乱数をPythonで作成してそれの二乗和を算出することで、χ二乗分布を描写した。結果、独特な分布を表現することができた。


# 参考文献

https://amzn.asia/d/ihNhJMP
CI/CDについて

### CI/CDとは

ソフトウェア開発におけるビルドやテスト・デリバリー・デプロイメントを自動化し継続的に行うアプローチを指す名称。

### CIとは

継続的インテグレーション。

**1.コードの統合**
 定期的に自分の作業したコードを共有リポジトリに統合すること。
**2.自動ビルド**
 コードがリポジトリに統合されるたびに、自動的にビルドが実行される。
**3.自動テスト**
 ビルドが成功したら、自動テストが実行される
**4.結果のフィードバック**
 テストの結果やビルドの状態が即座に開発者にフィードバックされる。
**5.一貫性の確保**
 共通の基準でコードを統合しテストするため、コードの品質や一貫性が保たれる。
 
例としてはJenkins,Travis CI,Circle CI,GitHub Actionsがある。
これらのツールにより、コードの統合とテストを自動化し開発プロセスの高速化と品質向上に大きく貢献する。

### CDとは

継続的デリバリー。
例としてはSpinnakerやArgo CDがある。
オペレーションが簡単で、できるだけ属人化が排除されていることが重要。
点と直線の距離公式の感覚的な理解と証明

# はじめに
$xy$平面における点と直線の距離の公式は有名でありかつ形が綺麗で美しい。そこで、まずは直線状の動点と定点との距離を最小値が点と直線の距離であるという事実を用いた証明をまずは行う。距離計算をコンピュータに行わせることによって点と直線の距離公式が正しいということを感覚的に理解することを目指す。具体的には、ある定点$(x_1,y_1)$と直線$ax+by+c=0$上の動点$(x,y)$の距離の二乗を計算して、その最小値が点と直線の距離の二乗と等しいか以下のようなグラフで調査する。

![点と直線の距離の二乗.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/d33f4892-7cbd-ec73-1bca-c977de994ead.png)


# 公式の導入

定点$(x_1,y_1)$と直線$ax+by+c=0$の距離$d$は、以下の式で表すことができる。（証明は、ベクトルの内積を使うと楽であるが今回は割愛する。）

```math
d=\frac{|ax_1+by_1+c|}{\sqrt{a^2+b^2}}
```


したがって、

```math
d^2=\frac{(ax_1+by_1+c)^2}{a^2+b^2}
```



# 解析条件と方法

## 解析の前提条件
以下の式を解析で使用したいため、$b\ne0$とする。（点と直線公式自体は、$b=0$でも成立する。）

```math
y=-\frac{ax+c}{b}
```

ここで、定点$(x_1,y_1)$と直線状を動く動点$(x,y)$との距離の二乗は三平方の定理より以下の式で表せる。

```math
f(x)=(x_1-x)^2+(y_1-y)^2=(x_1-x)^2+(y_1+\frac{ax+c}{b})^2
```

これは、$x$について下に凸な二次関数なので、最小値$min(f(x))$が1つだけ存在する。そこで、以下微分を用いた証明をしよう。（なぜ平方完成ではなく微分を用いて、最小値を議論したいかというと、平方完成では、項の数が膨大になり計算過程が複雑になるからである。）

## 証明
本記事では、細かい手計算は省略するが、大学受験生や大学生の方は是非とも手を動かして証明して欲しい。

```math
f(x)=(x_1-x)^2+(y_1+\frac{ax+c}{b})^2
```
を$x$で微分して、以下のような方程式を考える。

```math
f'(x)=-2(x_1-x)+2(y_1+\frac{ax+c}{b})(\frac{a}{b})=0
```

これを満たす$x$を求めると以下のようになる。

```math
x=\frac{b^2x_1+aby_1-ac}{a^2+b^2}(=x_{min})
```

したがって、

```math
f(x_{min})=\frac{(ax_1+bx_1+c)^2}{(a^2+b^2)^2}(a^2+b^2)=\frac{(ax_1+bx_1+c)^2}{a^2+b^2}=d^2
```


このことから、点と直線の距離の公式が示された。（定点と直線の距離は、直線状の動点と定点との距離の最小を意味する。）そこで、上記のことを考慮して以下のようなプログラムを作成した。


# プログラム

``` python line_d.py
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
import math
# 分割数
num=100
#直線のパラメータ（一般式）
a=1
b=2
c=3
#最小値が存在する範囲を選定する
x=np.linspace(-1,1,num)
x_1=1
y_1=2
#直線の式の変形板
y=-(1*x+c)/b
f=(x-x_1)**2+(y-y_1)**2
#xとlの値をプロットする
plt.plot(x,f,label="距離の二乗")
# y=d^2の直線を作成するたの配列
ones=np.ones(num)
#点と直線の距離の公式より、d^2=(ax_1+by_1+c)^2/(a^2+b^2)
d2=(a*x_1+b*y_1+c)**2/(a**2+b**2)
plt.plot(x,d2*ones,label="点と直線の距離の二乗")
plt.xlabel("x")
plt.ylabel("距離の二乗f(x)")
plt.legend()  
plt.savefig("点と直線の距離の二乗.png")
plt.show()
```

これを実行すると以下のようなグラフができる。

![点と直線の距離の二乗.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/d33f4892-7cbd-ec73-1bca-c977de994ead.png)


このグラフから、定点と直線上の動点の距離の二乗は二次関数で表されて、最小値は定点と直線の距離の二乗と等しくなることが分かる。


# まとめ
今回は、高校数学の図形と方程式で学ぶ重要公式である点と直線の距離の公式を視覚的に理解することを試みた。点と直線の距離公式は、その証明から応用まで、様々な問題に応用されている。しかし、二乗距離の最小値から攻める問題は計算量が膨大になるので作られにくい。ゆえに、今回のような考察をしてみるのも新鮮である。

# 参考文献

https://manabitimes.jp/math/857
Pythonを基礎から学ぶその3　Seaborn、Matplotlibなどについて学ぶ

この記事は、[JavaとPythonを基礎から学びたい私のための Advent Calendar 2024](https://qiita.com/advent-calendar/2024/aruhitonocalendar)の15日目の記事です。Pythonの参考書を買いました。
# ライブラリ、パッケージ、モジュール
あいまいだったので勉強しました。
### ライブラリ
numpyとか、Seabornとか。importできる大きさのものを総称してライブラリというそうです。ライブラリには2種類が存在しており、それぞれ「外部ライブラリ」「内部ライブラリ」と呼ばれているそうです。昨日勉強したnumpy、seabornは外部からインストールして使っているので外部ライブラリです。一方でインストールしなくても、Pythonを入れた段階で使うことができるのは内部ライブラリです。
### モジュール
おそらく.pyのファイルのことです。ちなみに、モジュールから別のモジュールを参照することができます。
```TEST.py
A=100
```
TEST.pyを作って
```B.py
import TEST
print (TEST.A)
```
結果:100
B.pyからTEST.pyの中にあるAを参照して、Aの中の100を出力しています。
### パッケージ
今説明したモジュールが入っているフォルダのことです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/0b7e05cf-b5c4-d98b-6427-4da668977c7b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/709d2a00-9176-37a3-f93f-5004c2f2c8a7.png)
こんな感じでしょうか。モジュールをまとめたものがパッケージだそうです。
# Seabornとは
表やグラフを出すために使われるもののようです。Matplotlibとかいうのもあるようです。後ほど紹介します。
下のようなデータがあるとします
| x | y |
|:-:|:-:|
| 3 | 3 |
| 7 | 6 |
| 4 | 9 |
| 8 | 8 |
| 5 | 5 |
| 1 | 2 |

xとyに関するデータです。今作りました。
seabornを使うことで、このようなデータをグラフにすることができるようです。
### グラフを出す
```
import seaborn as sns
import pandas as pd
Kazu=pd.read_excel('Kazu.xlsx')

F=sns.pairplot(Kazu)
print(type(F))
```
データの読み込みのためにpandasを使用しています。
```
F=sns.pairplot(Kazu)
```
ここでデータのxとyについてのグラフを作成しています。
```
print(type(F))
```
データをグラフとして出しています。
type Fのグラフ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/ed126f39-7b2d-339b-be0e-40d898086d64.png)
見ての通り、xとyの関係がグラフになります。seabornでは、一瞬でグラフを作れます
# Matplotlib
こちらはseabornよりも使われているグラフ描画系のライブラリのようです。できることは大体同じっぽいです。seabornではグラフを一度にまとめて出してくれるのに対して、Matplotlibではグラフは一つ出てきます。
試しに棒グラフを出してみます。
```
import matplotlib.pyplot as plt
import pandas as pd
Kazu=pd.read_excel('Kazu.xlsx')

plt.barh(Kazu.x,Kazu.y)
plt.show()
```
importをする際は、matplotlib.pyplotと書くようです。pyplotは図や表を作成するために必要なもののようです。
```
plt.barh(Kazu.x,Kazu.y)
```
barhを使うことで横棒グラフを作成できます。縦棒グラフではbarと記述することで書くことができます。調べても出てこなかったのですが、hはhorizontal(水平)とかでしょうか。
ちなみに縦棒グラフはこちら
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/8e5b6cff-fa0c-983c-700c-011905179797.png)
一つだけグラフが作成されていることがわかると思います。
色も変えられます
```
plt.bar(Kazu.x,Kazu.y,color="g")
```
さっきのところにcolor="g"とすることでgreenなグラフを作れます。
また使い方によってはカーブを描く曲線のグラフなど、高度なグラフを作れるようです。
# まとめ
大きい順にライブラリ、パッケージ、モジュール。外部から取り入れる系は外部ライブラリ。
グラフを作成するとき一度に大量に出したい場合はseaborn、ひとつづつ出したいときはMatplotlibを使った方がよい。Matploplibでは色を変えることができる。
# 参考文献

https://kanda-it-school-kensyu.com/python-basic-contents/pbc_ch11/pbc_1101/

https://www.codexa.net/seaborn-python/

https://pythondatascience.plavox.info/matplotlib/%E6%A3%92%E3%82%B0%E3%83%A9%E3%83%95

https://kentei.ai/blog/archives/464
c#で、なでしこ その12

# 概要
c#で、なでしこ、やってみた。
c#な、なでしこ、見つけたので、msbuildでコンパイルしてみた。
不具合、見つけてしまった。

# 投入したソース

```
●フィボナッチ (Iの)
　もしI<2ならば
　　Iで戻る
　違えば
　　F1 = (I-2)のフィボナッチ
　　F2 = (I-1)のフィボナッチ
　　F1 + F2で戻る

6のフィボナッチを表示
```

# 実行結果

```
>cnako2 fib.nako
[ERROR] オブジェクト参照がオブジェクト インスタンスに設定されていません。
[TRACE]    場所 Libnako.JPNCompiler.Parser.NakoParser._def_function() 場所 c:\Users\ore\csc\nadesiko2-master\nadesiko2-master\Libnako\JPNCompiler\Parser\NakoParser.cs:行 831
   場所 Libnako.JPNCompiler.Parser.NakoParser._statement() 場所 c:\Users\ore\csc\nadesiko2-master\nadesiko2-master\Libnako\JPNCompiler\Parser\NakoParser.cs:行 130
   場所 Libnako.JPNCompiler.Parser.NakoParser._blocks() 場所 c:\Users\ore\csc\nadesiko2-master\nadesiko2-master\Libnako\JPNCompiler\Parser\NakoParser.cs:行 77
   場所 Libnako.JPNCompiler.Parser.NakoParser._program() 場所 c:\Users\ore\csc\nadesiko2-master\nadesiko2-master\Libnako\JPNCompiler\Parser\NakoParser.cs:行 37
   場所 Libnako.JPNCompiler.Parser.NakoParser.Parse() 場所 c:\Users\ore\csc\nadesiko2-master\nadesiko2-master\Libnako\JPNCompiler\Parser\NakoParser.cs:行 27
   場所 Libnako.JPNCompiler.NakoCompiler.Parse() 場所 c:\Users\ore\csc\nadesiko2-master\nadesiko2-master\Libnako\JPNCompiler\NakoCompiler.cs:行 136
   場所 Libnako.JPNCompiler.NakoLoader.ParseEx(String src, String filename) 場所 c:\Users\ore\csc\nadesiko2-master\nadesiko2-master\Libnako\JPNCompiler\NakoLoader.cs:行 67
   場所 Libnako.JPNCompiler.NakoLoader.LoadFromFile(String filename) 場所 c:\Users\ore\csc\nadesiko2-master\nadesiko2-master\Libnako\JPNCompiler\NakoLoader.cs:行 86
   場所 cnako2.CNako2Executor.RunFileMode(String sourcefile) 場所 c:\Users\ore\csc\nadesiko2-master\nadesiko2-master\cnako2\CNako2Executor.cs:行 188
```
調査中。。。


以上
わかりませんでした。P1P2片持ち梁の複数荷重(3/4) 「はりのたわみの エネルギー法のsympyのコードを 微分方程式の直接解法のsympyのコードへ 変換して下さい。」AI先生へ 

・いくらなんでもと思いましたが、チャレンジ? しました。
・私の聞き方が悪いかも。

:::note info
前　 [(2/4)Gemini先生に私のコードを解説してもらいました。
](https://qiita.com/mrrclb48z/items/3d9ba6940c91f6e73b27)次　 [(4/4)sympyで、マコーレーの括弧を使って、片持ち梁の2つの荷重の弾性方程式を表示して下さい。
](https://qiita.com/mrrclb48z/items/38bac0b593bd8759f74b)
:::

```
下記のはりのたわみの エネルギー法のsympyのコードを 微分方程式の直接解法のsympyのコードへ 変換して下さい。
# ver0.4
from sympy import *
EI,P1,P2,a,b,x =symbols('EI,P1,P2,a,b,x')
M01_str="-(P1*(a-x)+P2*(a+b-x))"                               #;print("#",M01_str)
M12_str=          "-P2*(a+b-x) "                               #;print("#",M12_str)
U      = "1/(2*EI)*integrate((" + M01_str+")**2,(x,0,a)) +" \
        +"1/(2*EI)*integrate((" + M12_str+")**2,(x,a,a+b))"    #;print("#,U)
δ1=collect((diff(sympify(U),P1).expand()),[P1,P2])              ;print("#",δ1)
δ2=collect((diff(sympify(U),P2).expand()),[P1,P2])              ;print("#",δ2)
# P2*(a**3/(3*EI) + a**2*b/(2*EI)) + P1*a**3/(3*EI)
# P1*(a**3/(3*EI) + a**2*b/(2*EI)) + P2*(a**3/(3*EI) + a**2*b/EI + a*b**2/EI + b**3/(3*EI))
```
# Gemini先生より
回答抜粋
```python
from sympy import *

# 変数定義
EI, P1, P2, a, b, x = symbols('EI,P1,P2,a,b,x')

# 変位式
δ1 = P2*(a**3/(3*EI) + a**2*b/(2*EI)) + P1*a**3/(3*EI)
δ2 = P1*(a**3/(3*EI) + a**2*b/(2*EI)) + P2*(a**3/(3*EI) + a**2*b/EI + a*b**2/EI + b**3/(3*EI))

# 曲率を求める (例: δ1について)
kappa1 = diff(δ1, x, x)
M1 = EI * kappa1

# 微分方程式を立てる (例: δ1について)
diff_eq1 = Eq(EI * diff(y(x), x, 2), M1)

# 境界条件の設定 (例: 両端単純支持)
BCs = [y(0), y(a)]

# 微分方程式を解く
sol = dsolve(diff_eq1, y(x), ics=BCs)

# 解を表示
print(sol)
```
(vscodeで）
NameError: name 'y' is not defined
・以下、私は、修正をあきらめました。(2024-12-14)
・修正の聞き方も、思いつきませんでした。アドバイスをいただけると幸いです。
・先生に、修正の聞き方のアドバイスの　アドバイスを聞く？？？

# ChatGPT先生より


# copilot先生より
1日1ハム語🐹 ハムちゃんが適当にお返事してくれるチャットアプリつくってみた

クソアプリ Advent Calendar 2024 14日目の記事です。

https://qiita.com/advent-calendar/2024/kuso-app

# 初アドカレです

ごきげんよう！[株式会社スーパーハムスター](URL "https://app.path.progate.com/job-postings/c-Klkk5CIVZudFDH7ogH-")でエンジニア見習いをしているちなっちゃんです。授業レベルのC言語以外ほぼ何もわからないレベルの完全未経験からスタートして、React/Typescriptを触り始めて9ヶ月くらいが経ちました。普段はフロントエンドに参画してます。
今回はアドカレに登録して、自分でcreate next appから業務外で作ろう！という環境をつくることで、趣味開発デビューしました✨

▼リポジトリはこちら（publicリポジトリ作るのはじめて）▼

https://github.com/toremolo72/hamu-language

想定外にも前日夜しか時間が取れず、高倉町珈琲で修論がやばい友達と一緒に限界作業祭でなんとか完成👏 所要時間４時間くらいです

# できあがったもの

ハム語でおしゃべりしてくれるwebアプリをつくりました‪🐹

▼ここから遊べます（アプリ名は初期のまま変えてないクソ仕様）▼
https://hamu-language.vercel.app/

会社がハムちゃんなので、ハムネタにしたいなと思いハムベースで考えてました。そういえば私ハム語マスターだな！と思いハムちゃんとおしゃべりできるもの作りたいな〜というのがきっかけです。

# みため

斜めストライプです🩵🤍🩵🤍
作りながら見た目を考えたので、CSSで指定している数値は目分量です。
最初はレスポンシブ非対応で作ってましたが、スマホの方が使うかなと思ってスマホでも見た目が（あんまり）崩れないように記事投稿前にちょっと修正しました。

パソ（MacBookAir13inch）<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3689151/89dfeff4-f1f1-e7db-6dee-5aa6da2e797c.png">

スマホ（iPhone13mini）![EF3FB4EC-B3B2-4E6E-96F0-CE1D7045EA48.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3689151/433364d9-9216-9c4c-dc59-07fc00da99eb.jpeg)

# （クソみたいな）仕様

任天堂のハムご！（https://www.nintendo.co.jp/n02/dmg/b86j/hamugo01/index.html ）に掲載されているハム語を完全ランダムで返してくれます。

ハム語はワードリストとしてデータを持っているので、その中から適当にハムちゃんがお返事してくれるという感じです

```react:ハム語リスト
const hamWords: string[] = [
        "アウチッチ",
        "うちゃー",
        "あかいトーン",
        "うにに～",
        "あたっちゅ",
        .....以下略
        ];      

const randomWord: string = hamWords[Math.floor(Math.random() * hamWords.length)];
```

ランダムなのにたまにぴったりなお返事が来ることがあって、ちょっと嬉しい🐹✨

ユーザーからメッセージが送られたら、1秒後にハムちゃんがお返事をくれます。この部分はちょっと工夫しました。

```react:メッセージの表示部分
try {
      const res = await fetch("/api/randomWord");
      if (!res.ok) {
        throw new Error("Failed to fetch random word");
      }
      const data: { word: string } = await res.json();

      // ユーザーのメッセージを会話履歴に追加
      setConversation((prevConversation) => [
        ...prevConversation,
        { ham: '' , user: message}, // ハム語はまだ空で追加
      ]);

      setMessage(''); // メッセージを送信後、入力欄を空にする

      // 1秒後にハム語の返答を会話履歴に追加
      setTimeout(() => {
        setConversation((prevConversation) => {
          const updatedConversation = [...prevConversation];
          updatedConversation[updatedConversation.length - 1].ham = data.word;
          return updatedConversation;
        });
      }, 1000); // 1秒後にハム語を更新
    } catch (error) {
      console.error("Error fetching word:", error);
    }
```


### つくるプロセス

大体何するか考える→適当に作り始める→困ったらGPTに聞く→…を繰り返したらできました。
特に、ランダムに単語を返すAPIの部分は全然わからなかったのでGPTに頑張ってもらいました〜時代だ〜！

### ちょっとしたこだわりポイント

1. ハム語の返答が表示されるのを「1秒後」にしました。考えてる感を演出したく…🧐
1. チャットみたいな見た目にしました！喋ってる感出るかなと思って
1. メッセージ送信ボタンを「送信」じゃなくて「📤」にしました、スマホで見るとちょうど良くなります

# さいごに
create next appから作るの難しいと思ってたけど、適当で良ければ思ったより簡単に触れるということがわかってよかったです！！次はちゃんとした何か作りたい〜！！

来年もクソアプリアドカレ参加したいです！！最後までご覧くださりありがとうございました！！
会社が倒産してどうなることかと思ったら転職できたお話

転職活動の際にしたことを記載していきます。
私の状況について記載しないと未経験から転職したのかと誤認させてしまうかもしれないのではじめにで簡単に私の状況について記載しております。
その上でどういったことをしたのかややらなかった方が良いことについて書いていきます。
この記事が転職をお考えの方の参考になれば幸いです。

## はじめに
転職の前の状態について記載します。
SEとして2年ほど働いており、何年かの空白期間を得て2023年に別の会社でSEとして働いていました。
そこで案件先に常駐して作業員として働いていましたが、本社で社員に対する給料の未払いが発生しました。
その後会社が立て直し不可能となったために空白期間から１年経たずに所属組織を失うこととなりました。
幸い案件先さんに拾って頂き個人事業主として再度契約させていただきましたが、上の都合で自分の生活があっさり脅かされることを危惧して自分の能力でキチンと食べて行けるようになりたいと思い転職を希望しました。
ここまでが私の転職前の状況になります。
それではここからやってよかったことややらないでよかったことについて記載していきます。

## やってよかったこと
**・アウトプット**
自分一人で誰も見てないと無限にサボれてしまうのでXにアウトプットをしました。
最初は拙くて出来が悪くても注目してくださったりアドバイスを頂けたりし少しずつ色々な方とお知り合いになることができました。
そこで相互フォローになった方からお仕事を頂けるようになりました。
そのためSNSという不特定多数の方が見ている状況でのアウトプットは強くオススメします。

**・前の仕事を辞めずにいたこと**
よく転職のための無職期間を作って退路を断つなんて言う方もいますが、退路を断つと大抵余裕を失って焦燥感に駆られます
そして焦燥感は学習効率や理解力の妨げになるので生活のタネは保持したまま転職活動をしましょう。
もちろん転職に際して短期決戦を挑むという姿勢も否定しませんが個人的にはオススメしません。

**・必要なガジェットを揃える**
モニターやちゃんとした椅子、キーボードやPCスペックなど仕事をする上で必要なツールはキチンと揃えましょう。
できればいいものを早めに買っておくと手になじむ時間も増えますし費用対効果も高いです。
良いものは手入れや扱いを丁寧にすれば長持ちしますし、交換の際のトラブルや購入の手間や発送のラグなどを削除できるのは有用です。
当初質の悪いPCを使っていたのですが、環境構築やちょっとしたソフトが対応していなかったりとフラストレーションがたまってしまったのでちゃんとした道具は取り揃えましょう。

**・コミュニティに参加する**
知らなかった知識を手に入れられるだけでなくLTの機会があれば積極的に発言しましょう。
LTは話す練習にもなりますし、継続していると色々な方が注目してくださります。
また現地開催のイベントがあるならそこにも参加しましょう。
イベント内容だけでは手に入らない情報や働き口の打診もできるので非常に有用です。

**・健康に気を遣う**
健康には気を付けましょう。
病気や不眠、ストレスなどが発生してしまうと学習効率が悪化します。
また定期的な運動をすることで頭が冴えます。
休みを取ったり好きなものを気兼ねなく楽しんだりすることも必要と考え休むことへの罪悪感を持たないようにしましょう。

**・勉強会の内容をXに投稿する**
勉強会でハッシュタグを付けて投稿を許可してくれている勉強会もあります。
そう言った場合には積極的にやったこと思ったことを投稿しましょう。
投稿することで主催者の方に自身の存在をアピールできますし、発表者がいる場合には相互フォローになれたりします。

**・朝一で勉強をする**
ゲーム繋がりで仲良くなったエンジニアの方が朝起きてすぐにPCの電源を付けておられるのを見て真似してます。
朝一でPCを付けて簡単なコードを書いたり知識を深めたりすると習慣化しやすいです。
長い時間勉強をするというよりも数分からはじめて少しずつ勉強時間を増やすといいでしょう。

**・技術ブログへの執筆**
ネットにはqiita、zennなど様々な技術ブログがあります。
それらに学んだこと理解した内容をまとめていきましょう。
他の方の役に立つだけでなく自分の理解の整理にもなります。
また日数が空いてしまってどうやるのかを忘れてしまった操作についても見返すことで調査の時間を取られずに済みます。

**・役所、公的機関へ行くこと**
公的機関には就職支援だったり失業時の相談だったりが存在します。
それらを活用することで転職を楽に進めたりもできます。
またいくらかお金をもらいながら勉強できる制度もあります。
積極的に活用しましょう。

## あまり効果のなかったこと
**・資格勉強**
これは正直そこまで役に立った気はしませんでした。
ある程度の知識は既に備えていたのも大きかったとは思うのでその人その人の状況に合わせて違ってきますが、少なくとも特定の資格を持っていたことで転職が有利になった場面はありませんでした。
ただ今後大きく役立つ可能性や会話の足しになるのを考えると今後活きてくるのかもしれません。
もちろん高度な資格であれば有益なのかもしれませんが、そこに費やす勉強時間でポートフォリオを整備したり執筆を頑張った方が有益に思います。

**・自分の考えをつらつら書くこと**
技術に対してどんな影響があるかを書いていた時期もあったのですがこれは役に立ちませんでした。
下手の考え休むに似たりとは良く言ったもので素人の意見は大抵誰も関心を寄せないようです。
そんな暇があるなら寝るなりリフレッシュするなりした方がいいです。
もちろん考えを持つのは重要だと思いますが、それを公開するメリットは皆無な気がします。
誰かの話に議論する形で提示するのはありかもですが、自分から考えを公開したことはあまり何かに繋がった気がしませんでした。

**・お気持ち表明**
無意味です。
役に立たないどころか害さえ感じるレベル
私も含めて他人の感傷的な発言は一瞬の反射くらいにしかならないです
そして聡明な方にはそっぽを向かれます
何か気に食わないことがあっても不特定多数の方が見ているところには記載しないようにしましょう。
これはセキュリティ意識としてもとても重要な観点になります。
業務の内容や問題をつらつら書く技術者に仕事は任せられないでしょうし、信用を失う行為なのでやめておきましょう。

## 最後に
ここまで読んでいただきありがとうございました。
【Ruby】class_evalで何が渡されたかによってネストの状態が変わるのややこしや〜

どうもこんにちは。

今回も完全なるメモ書きです。温かい目で見守ってください。

# 定数の探索


```rb
module M
  CONST = "Hello, world"

  class C
    def awesome_method
      CONST    # レキシカルスコープ内で`CONST`が定義されているので、参照ができる
    end
  end
end

p M::C.new.awesome_method
```

```rb
module M
  CONST = "Hello, world"
end

class M::C
  # ここに`CONST`が定義されていれば参照可能
  def awesome_method
    CONST     # レキシカルスコープ内に`CONST`が定義されていないので、参照ができない
  end
end

p M::C.new.awesome_method
```

:::note info
定数の探索は基本的にレキシカルスコープで行われますが、レキシカルスコープ内に定数が見つからなかった場合には、継承元クラスへ定数の探索を行います。
:::

# さぁ、ここから`class_eval`出てきます！

```rb
class C
end

module M
  CONST = "Hello, world"

  C.class_eval do        # `class_eval`にはブロックが渡されています。この時のブロック内のネストの状態はモジュールMになります。
    def awesome_method
      CONST              # ネストの状態はモジュールMであり、レキシカルスコープ内にCONSTも存在しているので、参照が可能
    end
  end
end

p C.new.awesome_method
```


```rb
class C
  CONST = "Hello, world"
end

module M
  C.class_eval(<<-CODE)    # `class_eval`にはヒアドキュメントが渡されています。この時のネストの状態はクラスCです。
    def awesome_method
      CONST                # ネストの状態がクラスCである、クラスCに`CONST`が定義されているので、CONSTの参照が可能
    end
  CODE
end

p C.new.awesome_method
```

```rb
class C
  CONST = "Hello, world"
end

module M
  C.class_eval do        # `class_eval`にはブロックが渡されています。この時のブロック内のネストの状態はモジュールMになります。
    def awesome_method
      CONST              # ネストの状態はモジュールMですが、レキシカルスコープ内に`CONST`が存在していないので参照が不可能
    end
  end
end

p C.new.awesome_method
```
web3の基礎：ブロックチェーン

今回は、ブロックチェーンについて簡単にまとめます。
web3についての基本的な情報は[web3の基礎](https://qiita.com/yam_dev/items/febcaa227ced05a99605)を参照してください。

# 従来のインターネットとの違い

web3は、ブロックチェーン技術を使った新しいインターネットの形です。
従来のインターネット（Web1.0やWeb2.0）と比べて、以下の特徴があります。

1. 非中央集権：特定の企業や組織が情報を管理するのではなく、ユーザー同士で直接やりとりができる
2. 透明性：情報が公開され、誰でも確認できる
3. セキュリティ：データの改ざんが難しく、安全性が高い

![napkin-selection.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/9ac1995d-67af-12ec-5d26-d4f80815b138.png)

### ブロックチェーンとは？

ブロックチェーンは、Web3を支える重要な技術です。簡単に言えば、以下のような特徴を持つデータベースです：

1. 分散型：情報が世界中のコンピューターに分散して保存される
2. 改ざん耐性：一度記録された情報を変更するのが非常に難しい
3. 透明性：誰でも情報を確認できる

![napkin-selection (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/665c18bc-72aa-0b05-8e45-10898081da45.png)


### ブロックチェーンの仕組み

ブロックチェーンは、以下のような仕組みで動いています：

1. 取引情報を「ブロック」というまとまりに記録する
2. ブロックをチェーンのようにつなげて保存する
3. 物理的に離れた、たくさんのサーバーでこの情報を共有し、検証する

この仕組みにより、情報の信頼性が高まり、中央管理者がいなくても安全にデータをやりとりできます。

![napkin-selection (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/0b3e3cd5-c73b-0606-f3f7-fe0b3df25c56.png)


### web3とブロックチェーンの可能性

web3とブロックチェーン技術は、以下のような可能性を秘めています。

1. 個人情報の管理：自分のデータを自分で管理できるようになる
2. 新しい経済システム：仮想通貨やNFTなど、新しい価値の交換方法が生まれる
3. 透明性の向上：ビジネスや政治の透明性が高まる可能性がある

![napkin-selection (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/be357591-6883-1a14-65c6-ed5d5b5df705.png)


### まとめ

web3とブロックチェーンは、インターネットの未来を変える可能性を秘めた技術です。
安全で透明性の高いシステムを作り出すことができるため、これからの社会で重要な役割を果たす可能性があります。
Svelte 5 アップデートに向けて行っていること


これは [CAMPFIRE Advent Calendar 2024](https://qiita.com/advent-calendar/2024/campfire) の 14 日目の記事です。

CAMPFIRE ではフロントエンドフレームワークに Svelte を利用しています。
参考: https://note.com/tkhs0813/n/n93f7affdddd3

10 月に Svelte5 がリリースされたので、アップデートに向けて行っていることを書いてみます。

## やっていること

### レガシーモードでの動作確認

Svelte5 では Runes、Snippet など新しい機能がありますが、現時点ではレガシーモードを使用し、Svelte 4 までの構文で動作させています。
Runes モードとレガシーモードは共存できないため、以下の対応を行っています：

- `compilerOptions` の `runes` オプションを無効化。
- 必要なコンポーネントに `<svelte:options runes={true} />` を設定し、段階的に移行。

また、レガシーモードで動作させた際、独自プリプロセッサで使用していた `svelte/compiler#walk` が非推奨となりエラーが発生しました。これを `estree-walker` に置き換えることで解消しています。
参考: https://svelte.dev/docs/svelte/svelte-compiler#walk

さらに、Svelte 5 では HTML 構造の厳格化に伴い、違反するコードがコンパイルエラーを引き起こすようになりました。このため該当箇所を修正しました。
参考: https://svelte.dev/docs/svelte/v5-migration-guide#Breaking-changes-in-runes-mode-HTML-structure-is-stricter

これらの対応を経て、アプリケーションの起動が確認できました。

### Svelte Compiler の警告対応

レガシーモードでの動作は確認できたものの、Svelte Compiler から多数の警告が出力されていましたので修正します。
参考: https://svelte.dev/docs/svelte/compiler-warnings

### 一部コンポーネントの Rune モード移行

警告対応を進める中で、一部コンポーネントは Rune モードにする必要があったので移行しています。
このとき、Rune モードで Breaking Change のものがあったり、Slot を Snippet に書き換える必要があったりして修正ファイル数が膨らんでしまいましたが、Svelte VSCode Plugin のマイグレーション機能を活用し、そこまで時間をかけずに移行することができました
参考: https://svelte.dev/docs/svelte/v5-migration-guide#Breaking-changes-in-runes-mode
参考: https://svelte.dev/docs/svelte/v5-migration-guide#Migration-script

## やってみて感じたこと

- レガシーモードの有用性
  - Svelte4 までの構文もサポートしているため、大規模なコード修正を行わずに動作確認を行えた点はとても助かりました。
- マイグレーションツールが便利
  - 今回は使ってないですが、`npx sv migrate`で一括移行できたり、Svelte VSCode Plugin でファイル単位で Rune に書き換えてくれるのがとても便利でした。

## 日頃の取り組みが役立ったこと

- ライブラリ、Node.js の自動バージョンアップ
  - Renovate を活用し、毎週ライブラリや Node.js の自動アップデートを行っていたため、他ライブラリの古いバージョンが原因で移行が妨げられることがありませんでした。
- ライブラリの使用を最小限に抑える
  - 基本的に自作可能な部分は自作し、採用するライブラリについても可能な限り Svelte に依存しないものを選定していたため、移行作業がスムーズに進みました。

## 最後に

Svelte 5 リリース当初は多くの Issue が報告され、不安定感じがあったので現段階ではリリースを見送っています。
しかし、アップデートの見通しは立っているので近い将来 Svelte5 アップデートを行いたいと思っています。
ChatGPTを活用してデザイン制作を効率化！

ChatGPT、活用していますか？
私は質問にも調べ物にも多くのことで活用していますが、その中でもよくお願いしているのがデザイン制作関連のことになります。
chatGPTを使う前と比べてかなり効率化できたので、日頃の使い方をご紹介したいと思います！

## キャッチコピーや文章の提案
チラシやLPなど、提案段階でダミーテキストを使用することが多かったのですが、最近はchatGPTで仮の文章を生成してもらうことが多くなりました。
もちろんそのまま使うことはほとんどないですが、ベースがあるとひねりも考えやすくなるので助かっています。
![FireShot Capture 070 - ChatGPT - 日本語 - ログイン 🇯🇵 - chatgpt.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530660/574e7db1-1dd8-1594-526e-06a9ab219f0f.png)

## オリジナルアイコン・ロゴの提案
無料版では回数制限がありますが、画像生成もしてくれるため、悩んだ時に提案を受けています。
こちらも文章同様、そのまま使用することはないですが、ベースとして考えることができるのでお世話になっています。
![FireShot Capture 071 - ChatGPT - chatgpt.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530660/b2a43972-b8c1-6315-00cb-745b9e436792.png)

## デザイン添削
chatGPTでデザインの添削ができることは最近知ったのですが、とても助かっています。
というのも、作成しているときはどうしても視野が狭くなってしまうので、自分だけでの確認ではどうしてもミスは無くせないため確認をお願いしています。
また、ちょっと行き詰まった時にもアドバイスをくれたりするのでよくお世話になっています。

## その他活用例
使用頻度は低いですが、上記の他にも
・配色の提案
・Webデザインのアニメーションの提案
などでお世話になっています。

## おわり
デザインだけでなく、何かしらで行き詰まったりした時に一旦すぐに聞けるというのは気持ちの余裕にも繋がります。
以上、私のデザイン制作でのchatGPTの使い方でした。
もし他にもこういう使い方をしているよ！というものがあればぜひ教えてください！
【Rails】VSCode＋Ruby LSPでDockerコンテナのRailsアプリをデバッグ

# はじめに
DockerコンテナでRailsアプリを開発している環境で、VSCodeのRuby LSPとデバッグ接続するのにえらい苦労したのでメモ。

基本的なことまで書くとごちゃごちゃするのでポイントだけ記載。ある程度VSCodeとRailsを理解している人向け。
# 環境
- Windows 11 Home 23H2
  - ruby 3.3.6 （コンテナ側のバージョンと合わせる）
  - VSCode 1.96.0
    - Ruby LSP 0.8.16
  - Docker Desktop 4.35.1
    - ruby 3.3.6
      - gem rails 8.0.0
      - gem debug 1.9.2
# 設定
## コンテナ側
- 環境変数に以下を追加。
```
RUBY_DEBUG_LOCAL_FS_MAP=リモートパス:ローカルパス
```
パスにはRailsのルートディレクトリ（Gemfileが置いてあるディレクトリ）の絶対パスを指定。
リモートパスにはコンテナのパス、ローカスパスにはWindowsのパスを指定。先頭の`C:`は付けない。
私の環境だと以下のような指定。
```
RUBY_DEBUG_LOCAL_FS_MAP=/web:/Users/tamanegisoul/workspace/docker/web
```
- コンテナのrailsサーバはデバッグモード（rdbg）で起動。
```
rdbg -n --open --host 0.0.0.0 --port 12345 -c -- bundle exec rails s -p 3000 -b '0.0.0.0'
```
## VSCode側
- launch.jsonに以下を追記
```
{
    "configurations": [
        {
            "type": "ruby_lsp",
            "request": "attach",
            "name": "Attach to a debuggee",
            "debugPort": 12345,
        },
    ]
}
```
# デバッグ方法
VSCodeで`Attach to a debuggee`でデバッガを起動。
VSCodeでブレークポイントを設定しても効かない（泣）ので、ソースコードの停止させたい位置に以下を追記。
```
binding.break
```
この状態でWebブラウザからアプリを実行すればVSCodeでデバッグできる。やほー。
# 課題
停止位置のファイルが絶対パス参照の別ウィンドウで開いてしまう（画像赤枠）のが少し残念。
![aaa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3771124/120001df-4e32-ccd2-ecf6-7b93d40ff9ed.png)
`RUBY_DEBUG_LOCAL_FS_MAP`に`${workspaceFolder}`を指定してみたが以下のエラーになるので、これはどうしようもない気がする。いつか解決したい。
```
Could not load source '${workspaceFolder}/app/controllers/users_controller.rb': not found....
```

# 参考にしたページ
スペシャルサンクス！
https://github.com/Shopify/ruby-lsp/issues/1765#issuecomment-2348162459
https://zenn.dev/igaiga/books/rails-practice-note/viewer/ruby_rails_debug_gem
web3の基礎

「web3」という言葉が世の中で知られるようになってから、だいぶ経ちましたね。
私も最近離れていたので、復習を兼ねて簡単にまとめます。

# web3とは

web3とは、インターネットの次世代型とされる新しい仕組みです。
現在のインターネット（Web2.0）と比べて、データや情報の管理が「分散型」で行われる点が特徴です。

### **1. Web1.0、Web2.0、web3の違い**
- **Web1.0**: 初期のインターネットで、主に情報を「見るだけ」の時代。ウェブサイトは一方通行で、ユーザーは受け取るだけでした。
- **Web2.0**: ソーシャルメディア（例：InstagramやTwitter）が普及し、ユーザーが情報を発信し合う「双方向」の時代。データは大企業（例：GoogleやFacebook）が管理しています。
- **web3**: ブロックチェーン技術を使い、データやサービスが特定の企業に依存せず、ユーザー自身が管理できる「分散型」のインターネット。

### **2. web3 ？ Web3.0 ？**
web3について調べると、「web3」「Web3」「Web3.0」などがあり、あまり統一されてませんが、小文字の「web3」が正しいようです。

「Web3.0」は別物だとか。
過去に「Web3.0」を提唱した方がいらっしゃったようですが、世の中にあまり浸透しなかったようです。
そして、ブロックチェーン技術の方が、「Web2.0」の次になるのでは、ということで、区別するために「web3」という名称にしたそうです。（私が知る限りでは）


### **3. web3を支える技術**
- **ブロックチェーン**:
  - データを改ざんできない形で記録する技術
  - たくさんのコンピューターが協力してデータを管理するため、一部が壊れても全体は安全
- **スマートコントラクト**:
  - プログラムによって自動的に契約や取引を実行する仕組み
  - 例えば、「条件を満たしたらお金を送る」といった取引が自動化されます
- **暗号資産（仮想通貨）**:
  - web3内で使われるデジタル通貨


### **4. web3の特徴とメリット**
- **非中央集権化**:
    - データやサービスが特定の企業に集中せず、全員で分散して管理します
- **透明性**:
    - 誰でも取引内容を確認できるため、不正が起きにくい
- **プライバシー保護**:
    - ユーザー自身がデータを管理し、大企業に預ける必要がありません
- **新しい経済活動**:
    - NFT（デジタルアートなどの所有権）やDeFi（分散型金融）など、新しい形のビジネスが可能になります


### **5. web3の応用例**
- **NFT（非代替性トークン）**:
  - デジタルアートやゲームアイテムなど、唯一無二のデジタル資産を管理する仕組み
- **メタバース**:
  - 仮想空間で人々が交流したり買い物したりする世界。web3はその基盤技術として活用されています
- **DAO（分散型自律組織）**:
  - 特定のリーダーがいなくても、参加者全員で運営されるオンラインコミュニティ


### **6. web3の課題**
- 技術的な難しさ: ブロックチェーンはまだ発展途上で、使いやすさには課題があります
- 法律と規制: 新しい技術なので、法律が追いついていない部分があります
- エネルギー消費: ブロックチェーン技術には多くの電力を使うものもあり、環境への影響が懸念されています


# まとめ
web3にはまだ課題がありますが、その可能性は非常に大きいです。
興味を持ったら、まずはブロックチェーンや暗号資産について調べたり、小さなプロジェクトに参加してみることから始めてはいかがでしょうか。
Udemy記事　

## はじめに

こんにちは、rickyです。
この記事ではUdemyのおススメの講座を紹介します。
現時点で19講座購入しましたがその中でも特に初学者に優しく取っつきやすい講座を紹介します。

## AWSの講座

https://www.udemy.com/course/aws-4260/learn/quiz/4766842#overview

AWSのCLF-C02を勉強するために購入しました。
問題のみの講座になりますが、シンプルに勉強ができますし、詳しい解説が付いているので資格勉強に最適です。
これを何周かやった後に資格を受けましたが問題なく１発で合格することができました。
AWSの資格を勉強しようとする方の第一歩としておススメです。

## Blenderの講座

https://www.udemy.com/course/blenderperfectcourse/learn/lecture/42080626?start=0#overview

ヘラクレスオオカブトの作り方を丁寧に解説しています。
容量が大きいため何日かかけての勉強になりますが、それに見合った達成感と知識の獲得が期待できます。
Blenderは日々変更が行われるためUIに変化はあるかもしれませんが根底にある考え方や操作方法は身につくかと思います。
なお実際に利用する際はバージョンを一致させて進めていくことをおススメします。

## 最後に
Udemyには色々な講座があるため定期的に検索欄からご自身の興味がある内容を調べてみることをおススメします。
思わぬ良講座と巡り合えるかもしれません。
私自身またこのような記事を執筆し質が良いと感じた講座について記事化する予定です。

以上となります。
ここまで読んでいただきありがとうございました。
Karabiner-Elementsでhhkb風のキーバインドに変更してみた

# Karabiner-Elements JSON設定の内容
USキーボードの設定です
右シフトを使わないので右シフトを装飾キーにしました

## 🔥 **キーバインド一覧**

| **動作**         | **右Shift + キー** | **JSONのkey_code** | **変換後のキー**  |
|-----------------|-----------------|-------------------|------------------|
| **左矢印 (←)**   | **;**             | **semicolon**      | **left_arrow**    |
| **上矢印 (↑)**   | **[**             | **open_bracket**    | **up_arrow**      |
| **右矢印 (→)**   | **'**             | **quote**          | **right_arrow**   |
| **下矢印 (↓)**   | **/**             | **slash**          | **down_arrow**    |
| **PageUp**      | **L**             | **l**              | **page_up**       |
| **PageDown**    | **.**             | **period**         | **page_down**     |
| **Home**        | **K**             | **k**              | **home**          |
| **End**         | **,**             | **comma**          | **end**           |

---

## 📋 **JSONファイルの内容**

```json
{
    "manipulators": [
        {
            "description": "右Shift + [, ;, ', / を矢印キーにする",
            "from": {
                "key_code": "semicolon",
                "modifiers": { "mandatory": ["right_shift"] }
            },
            "to": [{ "key_code": "left_arrow" }],
            "type": "basic"
        },
        {
            "from": {
                "key_code": "slash",
                "modifiers": { "mandatory": ["right_shift"] }
            },
            "to": [{ "key_code": "down_arrow" }],
            "type": "basic"
        },
        {
            "from": {
                "key_code": "quote",
                "modifiers": { "mandatory": ["right_shift"] }
            },
            "to": [{ "key_code": "right_arrow" }],
            "type": "basic"
        },
        {
            "from": {
                "key_code": "open_bracket",
                "modifiers": { "mandatory": ["right_shift"] }
            },
            "to": [{ "key_code": "up_arrow" }],
            "type": "basic"
        },
        {
            "description": "右Shift + L, ., K, , を PageUp, PageDown, Home, End に変更する",
            "from": {
                "key_code": "l",
                "modifiers": { "mandatory": ["right_shift"] }
            },
            "to": [{ "key_code": "page_up" }],
            "type": "basic"
        },
        {
            "from": {
                "key_code": "period",
                "modifiers": { "mandatory": ["right_shift"] }
            },
            "to": [{ "key_code": "page_down" }],
            "type": "basic"
        },
        {
            "from": {
                "key_code": "k",
                "modifiers": { "mandatory": ["right_shift"] }
            },
            "to": [{ "key_code": "home" }],
            "type": "basic"
        },
        {
            "from": {
                "key_code": "comma",
                "modifiers": { "mandatory": ["right_shift"] }
            },
            "to": [{ "key_code": "end" }],
            "type": "basic"
        }
    ]
}
```
Webアプリのデザインチェックを自動化したい

## 背景

私が関わっているプロジェクトでは、デザインチームと開発チームで協力してプロダクトの開発を行っています。

プロダクトの品質を保つためデザインシステムの導入が進められているのですが、デザインに関するルールがまだプロジェクト内に浸透し切っておらず、デザインチェックのフェーズでデザインと実装に齟齬が見つかることが結構あります。

開発チーム側で実装が完了した段階でデザインガイドライン通りの実装になっているのが理想ですが、開発メンバーが全てのルールを記憶するのはハードルが高く、コードレビューの段階でデザインの齟齬に気付きづらいのが現状です。

このような課題に対して、AIを活用してデザインチェックを自動化することで、課題が解決できないか検証してみました。

## 手法

今回の検証ではAIレビューツールである「CodeRabbit」を使用します。

https://www.coderabbit.ai/

CodeRabbitはGitHubのプルリクエストをAIが自動でレビューしてくれるサービスですが、プロンプトをカスタマイズすることで独自のルールでレビューさせることができます。

https://docs.coderabbit.ai/guides/review-instructions/

今回はこのプロンプトにデザインルールを記述することでプルリク作成時に自動でデザインチェックができないか検証してみます。

## 検証

Rails + Bootstrapで作成したシンプルな入力フォームを対象に、デザインチェックをさせてみます。

![スクリーンショット 2024-12-13 17.15.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325543/94c4816d-f665-5d2a-f6c4-bda4e4951499.png)


### プロンプト未設定の場合

まずプロンプトを設定しない状態でCodeRabbitにレビューをさせてみると

![スクリーンショット 2024-12-14 11.39.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325543/c821c39c-470b-a43b-26d9-f3ac752265a0.png)

このように機能追加の提案はしてくれますが、デザインに関する指摘は特にありませんでした。


### シンプルなプロンプトを設定してみる

次に以下のようなシンプルなプロンプトを設定してみます。

```
- ボタンの横幅は最小80pxであること
```

このプロンプトを設定した状態でレビューさせてみると

![スクリーンショット 2024-12-14 11.46.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325543/0539b7d5-1218-1245-c518-de3fe6ba559c.png)

**おお、ちゃんと指摘してくれてる！**

とはいえstyle直書きなのはいただけないので、プロンプトでクラスも指定してみましょう。

```
- ボタンの横幅は最小80pxであること
  - 横幅の指定には min-w80 クラスを使用すること
```

![スクリーンショット 2024-12-14 11.58.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325543/06dabe60-7d11-02c0-da8c-651bc4fc0abd.png)

いい感じですね！

### プロンプトを拡充してみる

以下のようにプロンプトを拡充して検証してみます。

```
以下のデザインガイドラインに従ってレビューしてください

## 色のルール
### 基本パレット
- プライマリカラー: ボタン、リンク、アクティブな要素に使用
- セカンダリカラー: 補助的な要素や背景に使用
- サクセスカラー: 成功メッセージや確認アクションに使用
- エラーカラー: エラーメッセージや警告に使用
- ワーニングカラー: 注意を引く必要がある情報に使用

### 使用規則
- プライマリカラーはユーザーのアクションを促す主要な要素に限定して使用。
- エラーや警告カラーはユーザーの注意を必要とする場面でのみ使用し、多用を避ける。

## ボタンのルール
### スタイル
- プライマリボタン: 深い青色の背景に白文字。最も重要なアクションに使用。
- セカンダリボタン: グレーの背景に白文字。プライマリボタンと並んで使用する場合に。
- エラーボタン: 赤色の背景に白文字。危険や削除などの重要なアクションに使用。
### 使用規則
- ボタンのサイズは一貫性を持たせ、btn-lg, btn-md, btn-sm のクラスを適切に使用
- アクティブな状態やホバー時のスタイル変更を明確にする。
- ボタンには十分なマージンを持たせ、クリックしやすいようにすること
- ボタンの横幅は最小80pxであること。
	- 横幅の指定には min-w80 クラスを使用すること
```

ついでに入力フォームにもちょっと手を入れて、タイトル文字にプライマリカラーを使ってみたり、戻るボタンを危険色にしてみました。

![スクリーンショット 2024-12-14 12.06.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325543/65430f6a-54c9-3a6f-327e-1cd4c2fdf101.png)

この状態でレビューをさせてみると

![スクリーンショット 2024-12-14 12.18.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325543/a142eec6-6d2f-7fcf-c393-5d2f6421966c.png)

戻るボタンの色やマージンについては指摘してくれましたが、タイトルの文字色については特に指摘なしでした。
プライマリカラーの使い方についてプロンプトでは「主要な要素に限定して使用」と曖昧な表現をしているので、ここは判断が分かれるところなのかもしれません。
プロンプトにより詳細にルールを記載すれば、厳密にチェックしてくれそうですね。

## まとめ
今回はシンプルな入力フォーム、シンプルなプロンプトによる検証でしたが、AIでデザインチェックの自動化できそうな兆しが見えました。同じ課題感を抱えている方の参考になれば幸いです。

今後はさらにプロンプトの調整を行い、実際のプロダクトで利用できないか調査を進めていこうと思います。
Next.jsの復習

最近、Next.jsで開発し始めたので復習がてらまとめ。


# Next.js とは

Next.jsは、Reactベースのウェブ開発フレームワーク。

ウェブ開発フレームワークとは：
Webアプリケーションの開発プロセスを簡素化し、効率化するために、様々な機能やツールを用意しているソフトウェア。

## 主な仕様

1. **サーバーサイドレンダリング (SSR):**
ページリクエストごとにサーバーでHTMLを生成する
2. **静的サイト生成 (SSG):**
ビルド時にHTMLを生成する
3. **ファイルベースのルーティング:**
ファイルシステムに基づいてルーティングを自動的に設定する
4. **自動コード分割:**
各ページはそのページに必要なものだけを読み込み、パフォーマンスを向上させる
5. **画像最適化:**
組み込みのコンポーネントにより、レスポンシブな画像を提供する
6. **API Routes:**
サーバーレス関数を作成し、APIエンドポイントを簡単に構築できる
7. **TypeScriptサポート:**
TypeScriptを標準でサポートしている


## App RouterとPages Routerの違い

Next.js 13以降では、App Router (`app` ディレクトリ) が推奨されるルーティングシステムとなっている。
Pages Router (`pages` ディレクトリ) は引き続き使用できるが、App Routerはより多くの機能とパフォーマンスの向上が提供されている。

### App Router (`app` ディレクトリ)

- **React Server Components (RSC) をサポート:**
サーバー上でレンダリングされるコンポーネントを使用することで、クライアントへのJavaScriptの配信量を削減し、パフォーマンスを向上させる。
- **ネストされたレイアウト:**
コンポーネントの階層構造を反映した柔軟なレイアウトを簡単に作成できる。
- **サーバーコンポーネントによるデータフェッチ:**
サーバーコンポーネント内で非同期にデータを取得し、効率的にクライアントに配信できる。
- **ストリーミング:**
コンテンツを段階的にレンダリングし、ユーザー体験を向上させる。
- **レイアウト、ローディングステート、エラーハンドリングの改善:**
より直感的で宣言的な方法でこれらの機能を実装できる。


### Pages Router (`pages` ディレクトリ)

- クライアントサイドレンダリング中心 (SSR/SSGも可能):
ページ全体がクライアントサイドでレンダリングされるが、`getServerSideProps`または`getStaticProps`を使用してサーバーサイドレンダリングまたは静的サイト生成を行うこともできる。
- シンプルな構造:
ファイルベースのルーティングに基づいたシンプルな構造。


## ディレクトリ構造例

```
├── app/
│   ├── layout.tsx
│   ├── page.tsx
│   └── api/
│       └── hello/
│           └── route.ts
├── public/
│   └── images/
├── components/
├── styles/
├── lib/
├── next.config.js
└── package.json
```


## 新機能と使用例 (Next.js 13 以降)


### 1. Server Components (RSC)

```jsx
// app/page.tsx
async function Page() {
  const data = await fetchData();
  return <div>{data}</div>;
}

export default Page;
```

### 2. 新しいルーティングシステム (App Router)

```jsx
// app/blog/[slug]/page.tsx
export default function BlogPost({ params }) {
  return <h1>Blog Post: {params.slug}</h1>;
}
```


### 3. TurboPack (Next.js 13のデフォルト)

TurboPackはNext.js 13のデフォルトのバンドラーとなり、Webpackに代わる高速なビルド体験を提供。

# まとめ
今回は、Next.jsの基本的な内容についてまとめました。
開発を進める中で、いい情報があれば、改めてまとめます。
【備忘メモ】ローカルとHerokuで処理を書き換えずに環境変数を読み分けたい（後日アプデします）

【やりたいこと】
Javaアプリケーションで、ローカル環境でもデプロイ後のHeroku環境でも処理を書き換えずに環境変数を読み取りたい

【背景】
・Discordのbotを開発している
・このbotはGitHubでバージョン管理→ここからHerokuにデプロイする
・botアカウントとプログラムを紐づけるため、bot側が発行したトークンをプログラムに読み込ませる必要がある

:::note warn
乗っ取り被害防止のため、botのトークンは絶対に人に教えないこと！
:::

・上記理由により、プログラムにベタ書きしたり、トークンを書いたプロパティファイル等をGitHubで管理はしない
・デプロイ後のトークンはHeroku環境変数に持たせて、それを読ませる
→この処理では、ローカルのファイルを読むことはしない。当然クラスのプロパティであるはずもない。
・ローカルでアプリケーションを動作させるときは、Heroku環境変数を読むことはできない
⇨じゃあ動作確認の時は別ファイル等を読ませるような処理にいちいち書き換えるのか？それともわざわざ動作環境を読み取って分岐処理をさせるのか？という問題が発生する

【解決方法】
[dotenv-java](https://github.com/cdimascio/dotenv-java)ライブラリを使用する。
asyncioとtkinterの共存

# TL;DR
tkinterの定期タスク上でasyncioを1サイクルのみ実行します。
```python
import tkinter as tk
import asyncio

loop = asyncio.new_event_loop()
def do_async_tasks(loop):
    loop.call_soon(loop.stop)
    loop.run_forever()  # execute one cycle only
    master.after(100, do_async_tasks, loop)

master = tk.Tk()
var = tk.StringVar(master)
tk.Label(master, textvariable=var, width=10).pack()

async def update(var):
    for i in range(5):
        await asyncio.sleep(1)
        var.set(str(i))
loop.create_task(update(var))

master.after(100, do_async_tasks, loop)
master.mainloop()
```

# 背景
GUI表示(tkinter)とI/O待ちを伴う処理がありました。GUIの応答性を上げるためI/O待ちをバックグラウンド処理として並行処理したいと考えました。
一般には並列処理(スレッドなど)で並行処理を実現しますが、様々な面倒事(再現性の低い不具合など)を伴うので避けたいです。
そこで、asyncioを用い非並列処理な並行処理を用いたいと考えました。
しかし、tkinterの`mainloop()`はブロック処理でありコルーチン上で実行できない=asyncioと共存できない、はてどうしよう…

# 試行錯誤
## 方法1: tkinterスレッドとasyncioスレッドを分離する
メインスレッドでtkinterを実行、別スレッドでasyncioを実行し、スレッドセーフな協調メカニズムで連携します。
tkinter→asyncioの協調は`asyncio.get_event_loop().loop.call_soon_threadsafe(...)`です。
asyncio→tkinterの協調は`master.after(...)`です。

```python
import threading
import tkinter as tk
import asyncio

master = tk.Tk()
var = tk.StringVar(master)
tk.Label(master, textvariable=var, width=10).pack()

async def update(master, var):
    for i in range(5):
        await asyncio.sleep(1)
        master.after_idle(var.set, str(i))
loop = asyncio.new_event_loop()
loop.create_task(update(master, var))

t = threading.Thread(target=loop.run_forever, daemon=True)
t.start()
master.mainloop()
```

### 問題
「結局スレッドをつかっているよね？」はい、使っています。うっかりtkinterスレッドからasyncioスレッドのオブジェクトを操作すると不可解な挙動をします。asyncio利用の動機(並列処理を避けたい)を達成していません。
また、原因を特定出来ていませんが特定の処理をasyncioのタスクに入れたら描画を目視できるほどGUIの応答性が著しく低下しました。

## 方法2: asyncio上でtkinterを動かす
tkinterの`master.mainloop()`の代わりに、`master.update()`を定期的に呼びます。
```python
import tkinter as tk
import asyncio

master = tk.Tk()
var = tk.StringVar(master)
tk.Label(master, textvariable=var, width=10).pack()

async def update(master, var):
    for i in range(5):
        await asyncio.sleep(1)
        master.after_idle(var.set, str(i))
loop = asyncio.new_event_loop()
loop.create_task(update(master, var))

async def async_mainloop(master, loop):
    master.wm_protocol("WM_DELETE_WINDOW", loop.stop)
    while True:
        master.update()
        await asyncio.sleep(0.1)
loop.create_task(async_mainloop(master, loop))

loop.run_forever()
```
### 問題
致命的な欠陥があります。それはtkinterがブロック処理を含むことです。
ドラッグ中、ウィンドウ移動中の間、`master.update()`は処理をブロックします。
またダイアログ完了待ち処理`wait_window()`も処理をブロックします。
これらブロック中は他のasyncioタスクが停止します。

## 方法3: tkinter上でasyncioを動かす
冒頭で述べた方法です。
tkinterのブロック処理中でもafterは実行され続け、問題は見つかっていません。

# 参考文献
- [Use asyncio and Tkinter (or another GUI lib) together without freezing the GUI](https://stackoverflow.com/questions/47895765/use-asyncio-and-tkinter-or-another-gui-lib-together-without-freezing-the-gui)
- [Is it possible to run only a single step of the asyncio event loop](https://stackoverflow.com/questions/29782377/is-it-possible-to-run-only-a-single-step-of-the-asyncio-event-loop)