OmniAICreator/Qiita-1.07M huggingface dataset:
React18.2.0対応　JSX記法を丁寧に学ぶ　Hello World表示まで

# 目的
Reactを自己学習しています。「React最新バージョン18.2.0を学ばないと！」と思い、一通り一から復習をしています。最初の関門であるJSX記法についての自分への備忘録として記します。これも学んだ方がいい、こうした方がよいとうものがあればぜひコメントをお願いします。
# 画面に出力する方法
#  root.renderに直書きしてHelloWorld!を表示させる
```React
import { createRoot } from "react-dom/client"; //react-dom/clientからcreatRootをインポート(createRoot関数が利用可能となる)

const rootElement = document.getElementById("root"); //index.htmlの<div id="root"></div>を取得しているイメージ
const root = createRoot(rootElement);//取得したルート要素を指定して新しいルートを作成、新しいルートが root 変数に格納される

root.render(
  <>
    <h1>HelloWorld!</h1>
    <p>いとっちです</p>
  </>
); //非同期レンダリングを行う
```

#  関数コンポーネントを使ってHelloWorldを表示
```React
import { createRoot } from "react-dom/client"; //react-dom/clientからcreatRootをインポート(createRoot関数が利用可能となる)
import { StrictMode } from "react"; //StrictModeをインポート

const rootElement = document.getElementById("root"); //index.htmlの<div id="root"></div>を取得しているイメージ
const root = createRoot(rootElement); 

const App = () => {
  return( //複数行をリターンする時は、改行して（）内に記述する。
  <> {/*//関数のコンポーネントとして返すタグは大きな一つのタグにしなけらばならない,<React.Fragment>を<></>として省略できる*/}
    <h1>Hello World!</h1>
    <p>いとっちです</p>
  </>
  )//App関数の結果として表示したい要素を返却する
}

root.render( //非同期レンダリングを行う
  <StrictMode> 
     <App /> {/* App関数の結果（returnされたHelloWorldといとっちが表示される） */}
  </StrictMode>
); //<StrictMode>でより厳しいルールで記述をすることを設定、警告を表示することができる
```
どちらも下記のように表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3185982/13619143-fb86-dc3f-c38b-b459abe9d272.png)

現時点では、どちらも同じならば、コードが短い直書きのほうが良い気もしますが、保守性や再利用性を考えると、関数コンポーネントを使う方法が主流となっているようです。
また、以下にJSX記法の主なルールをあげます。

#  JSX記法のルール①関数コンポーネントの名前の定義について
　　const App = () => {...のように関数コンポーネントは基本的に大文字で始まります。単語のつなぎ目も大文字始まりとなる。
```React
    const App = () => {...
    const AppHoge = () => {...
```

#  JSX記法のルール②returnについて
returnで返すのが単一行の場合→()を省略可

```React
const App = () => {
  return <h1>Hello World!</h1>
}
```

returnで返すのが複数行になる場合→改行して（）内に記述、
```React
const App = () => {
  return( 
  <> 
    <h1>Hello World!</h1>
    <p>いとっちです</p>
  </>
  )
}
```

#  JSX記法のルール③フラグメント
複数行をリターンする時は、`<>`や`<div>`、`<React.Fragment>`を使って大きな一つの要素として返す。

`<>`を使う場合
```React
const App = () => {
  return( 
  <> 　
    <h1>Hello World!</h1>
    <p>いとっちです</p>
  </>
  )
}
```

`<div>` を使う場合
```React
const App = () => {
  return( 
  <div> 　
    <h1>Hello World!</h1>
    <p>いとっちです</p>
  </div>
  )
}
```

`<React.Fragment>`を使う場合
```React
const App = () => {
  return( 
  <> 　
    <h1>Hello World!</h1>
    <p>いとっちです</p>
  </>
  )
}
```
NGの例
```React
const App = () => {
  return( 
    <h1>Hello World!</h1>
    <p>いとっちです</p>
  )
}
```

# 参考資料
Udemy　モダンJavaScriptの基礎から始める挫折しないためのReact入門
AttributeError: module 'numpy' has no attribute 'XXX' エラーの解決ログ

## はじめに

[TensorFlow](tensorflow.org)を使用していて、以下のエラーが発生した際の解決ログをまとめました。このエラーはTensorFlowに限らず、他のライブラリでも同様の問題が発生する可能性があるため、記事にまとめました。

```
AttributeError: module 'numpy' has no attribute 'object'.
`np.object` was a deprecated alias for the builtin `object`. To avoid this error in existing code, use `object` by itself. Doing this will not modify any behavior and is safe. 
The aliases was originally deprecated in NumPy 1.20; for more details and guidance see the original release note at:
    https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations
```

## 上記のエラーが出た環境
- conda 23.10.0
- tensorflow 2.4.1
- numpy 1.26.0

筆者がこのエラーに遭遇したのは、Anaconda仮想環境で`conda install tensorflow-gpu`を使用しTensorFlowをインストールし、Pythonで`import tenosrflow as tf`を実行した時でした。

## エラーの原因

このエラーは、エラーメッセージに記載された[numpy v1.20のリリースノート](https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations)を確認すると、`np.int`が組み込み型`int`のエイリアスであり、混乱を招いていたため、そのような書き方が非推奨となったことが原因です。

さらに、[numpy v1.24のリリースノート](https://numpy.org/devdocs/release/1.24.0-notes.html#expired-deprecations)で非推奨期限が切れが公表され、このバージョンを境に徐々に廃止が進み、エラーが発生するようになりました。

## 解決策

基本的に`np.int`のような書き方をしなければ問題ないです。`np.int`の代わりに`int`を使うといった具合です。
しかし、実際のケースではライブラリの中で使われていることもあり、なかなかソースコードを直接手で変更することが困難な場合が多いです。

その場合の解決策として3種類の方法を紹介します。

### 解決策1. numpyをダウングレード
このエラーはnumpyのバージョン1.24で廃止が開始されたため、それ以前のバージョンを利用すれば問題ありません。
例えば、numpyの1.24.0以下で最新のバージョンが1.23.5なので、このバージョンを指定してインストールし直すと良いと思います。

### 解決策2. numpyの依存関係のあるライブラリをアップグレード

このnumpyの変更を受け、numpyと依存関係にあるライブラリも`np.int`などを使わずに開発されている場合があります。最新のものにアップグレードすることで解決する可能性があります。

### 解決策3. 組込み型の`int`を`np.int`にエイリアスを貼る（非推奨）

こちらは、廃止となったnp.intをエイリアスで復活させる方法ですが、非推奨です。numpy以外のライブラリでエラーが出ている場合は、先にnumpyをインポートしてエイリアスを貼ることで、エラーを回避することはできると思います。

例えば、tensorflow 2.4.1、numpy 1.26.0を使っているとして、この方法を取るには以下のように書きます。

```python
import numpy as np

# 廃止となったエイリアスを書く（この例はtensorflow v2.4.1で使われている最低限の変更。ライブラリに応じて適宜修正が必要。）
np.object = object
np.bool = bool
np.int = int
np.float = float
np.typeDict = {k: v for k, v in np.sctypeDict.items() if isinstance(v, type)}

# その後にインポート
import tensorflow as tf
```

ただし、この手法は非推奨であり、互換性の問題を引き起こす可能性があるため、慎重に検討すると良いと思います。

## まとめ

`conda insatll tensorflow-gpu`でこの問題に遭遇し、解決に時間を溶かしていたので、この解決ログが同様の問題に悩む方々の助けになれば幸いです。

## 参考資料

https://stackoverflow.com/questions/75069062/module-numpy-has-no-attribute-object

https://numpy.org/devdocs/release/1.20.0-notes.html

https://numpy.org/devdocs/release/1.24.0-notes.html
Macで文字数カウントが出来る機能を作ってみた ~Automator ~

# 目次
* きっかけ
* 設定方法
* 最後に


# 1. きっかけ
**Macbookで文字数カウントする時みなさんはどうしていますか？**
Wordにペーストして文字数カウントしたり、、、
とても面倒！！ショートカットキーで文字数をカウントしてくれるものはないのか！！！

ということでMac限定で作ってみました。
(と言ってもAutomatorを使ってるだけなので大したものではありません)

就職活動などの際に、文字数をカウントする機能が自分はとても欲していました...

今回の記事を最後まで読むと以下のような文字数カウントが出来るようになります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1936739/0495423b-2fa0-d839-a8b3-6fae6853dac0.png" width=80%>


# 2. 設定方法

MacでAutomatorを開き、クイックアクションを選択します。

![スクリーンショット 2023-11-09 23.28.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1936739/8e586a16-052f-e7b7-0dfb-5c8ddac62336.png)


その後、検索欄で、シェルと入力すると、「シェルスクリプトを実行」が出てくるので押してください。

![スクリーンショット 2023-11-09 23.28.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1936739/3d425157-a106-df0f-0ca4-c3fb2f33864b.png)

その後、スクリプトの欄に、以下を貼り付けてください。

```shell
#!/bin/zsh
input=$(cat)
count=$(perl -C -Mutf8 -e "print scalar(() = '$input' =~ /\\S/g)")
osascript -e "display notification \"文字数: $count\" with title \"カウント結果\""
```

これは、入力されたテキストを読み込み、文字数をカウントし、結果を通知させます。
空白は除去するようになっています。

その後、クイックアクションの名前をつけます。

![スクリーンショット 2023-11-09 23.29.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1936739/3382c858-0c13-ffc9-eab0-b14aa793ac76.png)

これで、クイックアクションの作成は完了です。

次に、
システム環境設定 > キーボード > ショートカットを開き、その中のサービスというものを選択します。

![スクリーンショット 2023-11-09 23.32.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1936739/22161ec5-01ed-a2ac-dd26-90d92ed33020.png)

先程のクイックアクションが見つかりましたね。
これにショートカットキーを割り当てます。
今回は `command +  Y`を割り当てました。

:::note alert
他のショートカットキーと衝突しないように割り当てましょう。
:::

# 3.最後に

今回もお読みいただき、ありがとうございました。
簡単に選択した文字列の文字数をカウントすることができました！
【ActiveRecord】find・find_by・whereの違いと主要メソッド

# 【ActiveRecord】find・find_by・whereの違いと主要メソッド

Ruby on Railsの強力な機能の一つであるActiveRecordは、データベースの操作を簡単かつ効率的にするORM(Object-Relational Mapping)システムです。この記事では、ActiveRecordの基本的な使い方、特に`find`、`find_by`、`where`メソッドの違いに注目し、New、Create、Update、Delete、Saveといった主要メソッドの概要を解説します。

## ActiveRecordの概要

ActiveRecordは、Ruby on RailsのMVCモデルの中でモデル層を担当し、データベースとの間でデータをやり取りする役割を果たします。SQLを直接書く代わりに、Rubyのメソッドを使用してデータベースを操作することができます。これにより、コードの可読性が向上し、データベース操作が容易になります。

## find・find_by・whereの違い

### findメソッド

`find`メソッドは主にIDに基づいてレコードを検索し、見つかったレコードを返します。見つからない場合は`ActiveRecord::RecordNotFound`エラーが発生します。

```ruby
User.find(1) # IDが1のUserレコードを検索
```

### find_byメソッド

`find_by`メソッドは、指定した条件に一致する最初のレコードを返します。該当するレコードがない場合は`nil`を返します。

```ruby
User.find_by(name: 'Alice') # 名前がAliceの最初のUserレコードを検索
```

### whereメソッド

`where`メソッドは、指定した条件に一致するすべてのレコードを`ActiveRecord::Relation`オブジェクトとして返します。これにより、さらにクエリを連鎖させることが可能です。

```ruby
User.where(age: 20) # 年齢が20のすべてのUserレコードを検索
```

## New、Create、Update、Delete、Saveの概要

### Newメソッド

`new`メソッドは新しいレコードをメモリ上に作成しますが、データベースには保存しません。

```ruby
user = User.new(name: 'Bob', age: 25) # 新しいUserインスタンスを生成
```

### Createメソッド

`create`メソッドは新しいレコードを作成し、データベースに保存します。

```ruby
User.create(name: 'Bob', age: 25) # 新しいUserレコードを作成して保存
```

### Updateメソッド

`update`メソッドは既存のレコードを更新します。

```ruby
user = User.find(1)
user.update(age: 26) # IDが1のUserレコードの年齢を26に更新
```

### Deleteメソッド

`delete`メソッドは指定されたIDのレコードをデータベースから削除します。

```ruby
User.delete(1) # IDが1のUserレコードを削除
```

### Saveメソッド

`save`メソッドは新しいレコードをデータベースに保存するか、既存のレコードを更新します。

```ruby
user = User.new(name: 'Charlie', age: 30)
user.save # 新しいUserレコードを保存
```

## まとめ

ActiveRecordを使いこなすことで、Ruby on Railsにおけるデータベース操作が大幅に簡単になります。

`find`、`find_by`、`where`のような検索メソッドや、`create`、`update`、`delete`などのデータ操作メソッドを適切に使い分けることで、アプリケーションの効率的な開発が可能になります。
うなづき検出

人にとって重要な認識技術は、人に関する認識です。
人検出、頭部検出、顔検出、顔landmark などの検出。
人のpose推定、head pose の推定、hand poseの推定などがあります。

## うなづき検出が重要な理由
- 人についての理解を持たせようとしたら、人の動作の意味を解釈する必要があります。
- その１つが、うなづき動作です。
- 同意、不同意の区別をするために、首を縦にふる、横にふる動作です。
- この動作が、どれくらい世界的に共通性があるのかどうかを私は知りません。
- それでも、私が属している文化圏の中では、同意・不同意のジェスチャーとしてうなづきがあります。

## head pose推定(またはlandmark検出)とうなづき検出とのあいだ
- head pose 推定は、最近の顔検出ライブラリに含まれることが多くなっています。
- 顔向きが重要な理由：
    - 正面顔でない横向きの顔は、顔照合の対象から除外したい。
    - 顔をどちらに向けていているのかで、何に関心を持っているのかがわかる。
        - よそ見、居眠りの検出
    - カメラの側（ロボットのカメラの場合には、ロボットの側）にその人が注意を払っているのかがわかる。

- landmark 検出も顔検出ライブラリで重要な出力として含まれていることも増えています。
    - 5点という少ないlandmarkからもっと多いlandmarkの場合の両方があります。
    - landmarkが重要な理由：
        - 顔照合のための顔の正規化をするのに重要
        - 顔の向きを判定するために顔のlandmarkが情報源として重要
        - 口を空いているのかなどの判定材料
        - 顔画像への加工のヒント（例：　口紅を塗る。アバターの表情を作るうえで、元となる顔の表情を取得する。）
- 顔向きと頭部のジェスチャとの違い
    - 頭部のジェスチャを見極めるには、顔向き(head pose)の変化を見極めること
    - 単にhead pose が各フレームでわかったからといって、すぐにhead のジェスチャーを判定できるわけでない。
## うなづき(nodding) 検出 
- 以下の実装を見つけた
https://github.com/bhky/nodding-pigeon


> The Nodding Pigeon library provides a pre-trained model and a simple inference API for detecting head gestures in short videos. Under the hood, it uses Google MediaPipe for collecting the landmark features.


Nodding Pigeon ライブラリは、短いビデオで頭のジェスチャーを検出するための事前トレーニング済みモデルと単純な推論 API を提供します。 内部では、ランドマーク機能を収集するために Google MediaPipe を使用します。

以下のコードは、README.mdに書かれているサンプルコードです

```:py
from noddingpigeon.inference import predict_video
from noddingpigeon.video import VideoSegment  # Optional.

result = predict_video(
  "your_head_gesture_video.mp4",
  video_segment=VideoSegment.LAST,  # Optionally change these parameters.
  motion_threshold=0.5,
  gesture_threshold=0.9
)
```


以下の値は、ジェスチャーの判定結果の例です。
```
{
  'gesture': 'turning',
  'probabilities': {
    'has_motion': 1.0,
    'gestures': {
      'nodding': 0.009188028052449226,
      'turning': 0.9908120036125183
    }
  }
}
```

## Person-Nodding-Detection
https://github.com/ayushkothari27/Person-Nodding-Detection

Requirements
- dlib
- OpenCV


## head nod detection
https://gist.github.com/smeschke/e59a9f5a40f0b0ed73305d34695d916b
Requirements
- OpenCV

この実装では、顔landmark を利用していない。
代わりにOptical flow を用いている。

## そのうなづき検出は、実用になるものですか
- ここにあるようなOpen Source, Open Modelでの実装で、あなたのユースケースでは、十分な結果がでますか？
### ありがちな状況（起こるかもしれないこと）：
- 簡単な状況ではうまくいっても、実ケースの状況ではなぜかうまくいかない。
- 人によって、うなづきの動作の大きさが異なり、そのためにうなづきが無視される。
- うなづき以外の動作まで、うなづきと判定してしまう。
- 顔が正面顔ではうまくいくが、３０度横向きになったとたんにうまくいかない。
- マスクをしている状況だとうまくいかない。
- 複数の顔が同時に見えていて、しかも顔がすぐ隣にあるとうまくいかない。
- 帽子をかぶっているとうまくいなかい。
- サングラスをかぶっているとうまくいかない。

### 実用に耐えるかどうかテストしよう。
- これらの問題に対して言えることは、testを書こうということだ。
- ユースケースに対するテストは、Open Source、商用ライブラリのどちらでも必要だ。
- testに対してうまくいくことを示すことが、うまくいくことを示す一番の方法だ。

## 付記：[顔向き推定について調査中](https://qiita.com/nonbiri15/items/f6910a993457a1862632)を改訂しました。
mediapipeを用いた実装などについて追記しています。
うなづき検出は、顔のlandmark 検出の派生用途になります。そのため、顔のlandmarkを検出する各種ライブラリの最新の動向を気にかけてください。
ゆ っ く り し ゃ べ ろ う【エンジニア心理学】




あらためまして、みねぎしれいです

https://minegishirei.hatenablog.com/entry/2023/01/27/193827


近年の研究によると、忙しくストレスの多い現代社会では、多くの人が早口でしゃべる傾向があるそうです。
わたくしの周りのエンジニアの方々にも（特に優れた技術を持ったエンジニア）この傾向が強いように感じます。

実は、早口で話すこと自体が必ずしも問題になるわけではありません。
相手の心理的安全性を確保するためには、レスポンスを早くすることも求められます。

ですが、早口で話すことで明瞭さ、言葉遣い、一貫性が犠牲になり、効果的なコミュニケーションが著しく阻害される可能性があります。

そこで本日は

- 早口で話すのが何が問題なのか？
- どうすれば治るのか？

の2点を心理学的な観点から改善したいと思います。


<img src="https://eiga.k-img.com/images/buzz/67044/2ba7ea9ca2d4e954/1200.jpg">

## なぜ早口でしゃべることが問題なのか?

### 「コミュニケーションが苦手」と思われるから

端的に言えば、コミュニケーションを「終わらせる」ために早口になる人もいます。

早口になればなるほど会話の時間が減少し、早く終わるのは明白です。

さらに研究によると、この現象は「内向的」や「外交的」などの性格特性とは関係なく発現するため、誰にでも起こりえる現象です。

そしてこの「早口」は自分では気づかれていないつもりでも、「この人コミュニケーションが苦手なんだなぁ」と気づかれることが多いです。

https://www.psychologytoday.com/intl/blog/communication-success/201911/do-you-talk-too-fast-how-to-slow-down


### 威厳がなくなるから

結論、早口でしゃべることで威厳がなくなります（どこかの研究結果か紛失してしまいましたが...）

裁判の弁護における、「謝罪」と「沈黙」の研究です。
容疑をかけられた容疑者が「沈黙」をとるか「多弁」をとるかの二択でどのような印象を受けるのかのデータをとる研究でした。

結果は

- 「沈黙」を選択 : 誠実性が上がる
- 「多弁」を選択 : 誠実性が下がる

でした。

しかしこれは研究成果を見なくても我々の経験上明らかですよね。

<img src="https://github.com/minegishirei/psy/blob/main/img/speak/speak_alot.png?raw=true">




## ゆっくりしゃべるためにできること

### ペットボトルをそばに置く

<img src="https://eiga.k-img.com/images/buzz/67044/2ba7ea9ca2d4e954/1200.jpg">

ボトル入りの水を小道具として使用します。早口で話すのを避けるための簡単な「コツ」は、話すときに隣にボトル入りの水を置いて定期的に飲み、自然な間を作ることです。これは、社交的な会話、仕事上の会議、人前で話す場面でも機能します。

加えて、**緊張してしまう人は喉がからからになってしまうけいこうがあります。**

> それでは，咳払いはどのようにして起こるのでしょうか。緊張すると喉が渇くことは，よく経験されます。これは，交感神経興奮による唾液分泌量の低下の影響が考えられます。口渇感が増す結果，咳嗽と同時に咳払いを起こしやすくなります。

https://www.jmedj.co.jp/journal/paper/detail.php?id=3938

**ペットボトルをそばに置くことで、意識して飲もうとしなくても自然と飲んでしまうことで、自然と間をあけたゆっくりとした話し方になるのです。**



### 短くしゃべる

この「ゆっくりしゃべる」はチャットにも応用できます。

以下の二つの文章だと、どちらが良いでしょうか?

<img src="https://appliv-domestic.akamaized.net/v1/900x/r/articles/129036/10588119_1600144729_087921400_0_672_513.jpeg">


<img src="https://appliv-domestic.akamaized.net/v1/900x/r/articles/129036/10588119_1600144710_083681700_0_673_191.jpeg">


チャットでも一文が長い人がいますがそれは損です。
自らの印象を良いものにするためには、一文一文を短くして、相手のレスポンスを引き出しましょう！


## まとめ

最後まで確認していただきありがとうございます！

最後に今回のお話を要約します。

- 早口を回避するべき理由は以下の二つ
    - 「コミュニケーションが苦手」と思われるから
    - 誠意がないように思われるから
- ゆっくりしゃべるために
    - 短くしゃべる
    - ペットボトルをそばに置く


お役に立ちそうだなと思った方は「LGTM」お願い致します！

 

## そのほかの心理学の記事はこちらを参照

https://psy.hatenadiary.com/entry/2025/01/27/210452
paloaltoの解析講座2：Wireshark

<!--2023/11/12-->
* ためになりそうなので、引き続きpaloalto解析講座

https://unit42.paloaltonetworks.jp/using-wireshark-display-filter-expressions/

## FilterButtonsの登録
* 完成のイメージ
いくつかのボタンを登録して、フィルターの入力を楽ちんにした状態。
![screenshot 7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160736/b424a996-253f-050a-51d9-46a447e52b73.png)
<br>

* 設定画面のイメージ
Filterの右側になる'+'ボタンをクリック。
`Filter Buttons Preference…`から内容を確認可能。
![screenshot 8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160736/c2ce8974-7efa-e49d-78ae-2a426529bd9a.png)
![screenshot 9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160736/d4268cce-2ad0-50ce-a563-b35f5c1868fd.png)
<br>

* 基本的な手順
Display Filterに登録したい内容を入力。
* Filterの右側になる'+'ボタンをクリック。
真ん中の`Label`の項目に、`basic`と入力。

|Label|Filter Expression|Protocol|
|-|-|-|
|basic|(http.request or tls.handshake.type eq 1) and !(ssdp)|HTTP, HTTPS|
|basic+|(http.request or tls.handshake.type eq 1 or (tcp.flags.syn eq 1 and tcp.flags.ack eq 0)) and !(ssdp)|HTTP, HTTPs, TCP(Syn)|
|basic+dns|(http.request or tls.handshake.type eq 1 or (tcp.flags.syn eq 1 and tcp.flags.ack eq 0) or dns) and !(ssdp)|HTTP, HTTPs, TCP(Syn), DNS|
|ftp|ftp.request.command or (ftp-data and tcp.seq eq 1)|FTP|
|smtp|smtp.req.command|SMTP(command)|
|mail|smtp or pop or imap|SMTP, POP, IMAP|
|tls|tls.handshake.type == 11|TLS Certificate|
<br>

* よく使うものは登録すると便利。
ただ設定ファイルが自動生成されるため、編集をしない方が良いみたい。
ファイルのコピーとかもしない方が良いかと思いました。
<br>

* 以上です。
勉強記録ウェブアプリ作成の軌跡 2:フロントエンド設計

# 概要
「【Rails×React】UberEats風アプリを作りながら、SPA開発を学ぼう」を使って学んでいく上で自分で勉強記録アプリを作りたいと思ったので、完成するかは置いといて、とりあえず学んだことを自分が作りたいものに置き換えて考えていく。

# 内容
前回の記事で決めたデータを元に画面とコンポーネントの設計を行う。
画面に対応するコンポーネントはデータを扱うため、最初の設計を誤ると保守性の低いフロントエンドのコードになるため注意が必要。
コンポーネントというのは、ボタンや画像などのUIのパーツや部品のこと。

# コンポーネント
### 「データを扱うコンポーネント」 Container Component
こちらは親コンポーネントとして複数の子コンポーネントにデータを渡す役割がある。
### 「受け取ったデータをただ表示するためのコンポーネント」 Presentational Component
これはボタンやモーダルなどが含まれる。

コンポーネントがこの２種類に分けられている最も大きい理由として、子コンポーネントの再利用性を高めることが挙げられる。
例えば、複数のページにおいて同じようなUIではあるが、データは異なるといった場合に、子コンポーネントではデータを持たずどのようなデータが入ってきても対応できるようにすることで、無駄なコードをなくし、デザインやコードの整理を行うことができる。

そのため、今回はわかりやすくするためにContainer層とComponent層を以下のようにディレクトリから分ける。

- Container層
    - `containers/Main.jsx`
    - `containers/User.jsx`
    - `containers/Review.jsx`
- Component層
    - `components/Button.jsx`
    - `components/Wrapper.jsx`

# API(Application Programming Interface)
次にフロントエンドからAPIを叩く部分を考える。一般的にファイルごとに分離すべきということ。
そのため、Reactのコンポーネントはあくまでレイアウトやデータを保持することを担当させる。
注意点として、コンポーネントファイルの中にAPIを叩く関数を定義してしまうと、他のページから同じAPIを叩きたい時に参照できずコピペしてしまい、冗長なコードとなってしまう。そのため、コンポーネントファイルとAPI関数ファイルを分ける。

- `api/Main.js`
- `api/User.js`
- `api/Review.js`

# reducer
今回はReactの組み込みAPIであるReact Hooksでシンプルにデータを保持できるようにする。
一般的には、reduceなどのデータライブラリを用いることもある。
複数コンポーネントで同じような状態を持ちたい場合に便利であるため、desucerもコンポーネント内で定義せずAPIと同様別のディレクトリ・ファイルで管理する。

- `reducers/Main.js`
- `reducers/User.js`
- `reducers/Review.js`

# URLの管理
APIのURL管理も別ファイルに分ける。これはRailsでURLがroutes.rbにまとまっているようにフロントエンドでもここを参照すれば使われているURLがわかるというようにする。
今回は`urls/index.js`を作成し、ここにAPIのURL文字列を定義していく。

参考記事
- 【Rails×React】UberEats風アプリを作りながら、SPA開発を学ぼう
    - https://www.techpit.jp/courses/138
Next.jsが入ったコンテナからローカルのSupabaseコンテナに疎通確認するまで

詰まったので知見として残しておきます

## Supabaseコンテナの起動
```bash
% supabase start
Seeding data supabase/seed.sql...
Started supabase local development setup.

         API URL: http://localhost:54321
     GraphQL URL: http://localhost:54321/graphql/v1
          DB URL: postgresql://postgres:postgres@localhost:54322/postgres
      Studio URL: http://localhost:54323
    Inbucket URL: http://localhost:54324
```

ホストからは`postgresql://postgres:postgres@localhost:54322/postgres`でDBにアクセスできる
しかし，NextコンテナからDBにアクセスするにはSupabaseコンテナと同一ネットワークに配置させる必要がある

`supabase start`するとSupabaseコンテナは`supabase_network_<project_name>`というネットワークに割り当てられる
このネットワークに`docker-compose`でNextコンテナを所属させる
```docker-compose.yml
略
services: 
  next: 
    略
    
    networks:
      - supabase_network_<project_name>

networks:
  supabase_network_<project_name>:
    external: true
```

## 疎通確認
コンテナ間の通信ではipアドレスではなくDockerホスト名を指定する
```
% docker compose exec next /bin/sh
/app # ping -c 3 supabase_db_<project_name>
PING supabase_db_<project_name> (192.168.128.2): 56 data bytes
64 bytes from 192.168.128.2: seq=0 ttl=64 time=0.560 ms
64 bytes from 192.168.128.2: seq=1 ttl=64 time=0.139 ms
64 bytes from 192.168.128.2: seq=2 ttl=64 time=0.198 ms

--- supabase_db_<project_name> ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.139/0.299/0.560 ms
```

## Postgresへの接続
SupabaseのDBコンテナは`54322:5432`でフォワードされているので，コンテナの5432番にアクセス
```
# psql 'postgresql://postgres:postgres@supabase_db_<project_name>:5432/postgres'             
psql (15.2 (Debian 15.2-1.pgdg110+1), server 15.1 (Ubuntu 15.1-1.pgdg20.04+1))
Type "help" for help.

postgres=> 
```

:::note info
54322番ではなく5432番にアクセスすることに注意．NextコンテナでDATABASE_URLみたいなものを設定するときも5432番を指定する
:::

完了
なでしこ3で作るブラウザ楽器はじめの一歩

今年一番の大ニュースと言えば、、、日本語プログラミング言語「なでしこ3」に『[MML演奏](https://nadesi.com/v3/doc/index.php?nadesiko3-music%2FMML%E6%BC%94%E5%A5%8F&show)』という命令が追加されたことでしょう。

筆者を含め皆さんもとても忙しい年でした。自分へのご褒美として、年末に向けて、ブラウザ楽器を作って遊んでみるのはどうでしょうか。

# 「MML演奏」を使ってブラウザで音を鳴らそう

最初に「MML演奏」を使う方法を確認してみましょう。以下は一番簡単なMML演奏のサンプルです。

```一番簡単なMML演奏のサンプル.nako3
# 『MML演奏』の一番簡単なサンプル

# 拡張プラグインの取り込み --- (*1)
!『拡張プラグイン:music.js@1.0.2』を取り込む。

# --- 音楽を再生 --- (*2)
「音階5 ドレミ」をMML演奏。
```

上記のプログラムは、[なでしこ3貯蔵庫](https://n3s.nadesi.com/id.php?2694)で実行できます。プログラムを確認しましょう。実行すると、ドレミっと音がなります。

- まず、(*1)では、MML演奏を有効にするための宣言を記述します。この命令は、なでしこの拡張プラグインとして用意されています。そのため、このようにプラグインの取り込み宣言を書く必要があります。
- 次に、(*2)で、MML演奏を記述しています。「ド」とか「レ」と記述することで、その音を演奏できます。

# 簡単なブラウザ楽器を作ろう

次に、ボタンを押したら音が鳴るという以下のようなプログラムを作ってみましょう。

![スクリーンショット 2023-11-24 22.31.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33180/4983260b-6a77-ae6a-50bc-11bc7f41d6c5.png)

```ボタンを押したら音が鳴るサンプル.nako3
# 拡張プラグインの取り込み --- (*1)
!『拡張プラグイン:music.js@1.0.2』を取り込む。

# --- ボタンを押したら音楽を再生 --- (*2)
C=「ド」のボタン作成。
Cをクリックした時には
　　「音階5 ド」をMML演奏。
ここまで。
E=「ミ」のボタン作成。
Eをクリックした時には
　　「音階5 ミ」をMML演奏。
ここまで。
```

[なでしこ貯蔵庫で見る](https://n3s.nadesi.com/id.php?2695)

プログラムを見てみましょう。(*1)は先ほどと同じです。(*2)ではボタンを作成し、それをクリックしたら音が鳴るようにしています。

# ラップボタンも作る？

なお、最近のブラウザは、TTS(テキストを読み上げる)機能が備わっています。そのため、TTS機能を使うと、より面白い楽器になるでしょう。

![スクリーンショット 2023-11-24 22.39.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33180/3ef6c2c6-e240-1c45-2ad2-e3600b156f52.png)

```ボタンを押したら音楽を再生その2.nako3
# 拡張プラグインの取り込み
!『拡張プラグイン:music.js@1.0.2』を取り込む。

# --- ボタンを押したら音楽を再生
C=「🎹ド」のボタン作成。
Cをクリックした時には
　　「音階5 ド」をMML演奏。
ここまで。
E=「🎹ミ」のボタン作成。
Eをクリックした時には
　　「音階5 ミ」をMML演奏。
ここまで。
G=「🎹ソ」のボタン作成。
Gをクリックした時には
　　「音階5 ソ」をMML演奏。
ここまで。
SP=「こんにちは」のボタン作成。
SPをクリックした時には
　　「こんにちは」と話す。
ここまで。
SP2=「げっっつ」のボタン作成。
SP2をクリックした時には
　　「げっっつ」と話す。
ここまで。
```

[貯蔵庫で実行](https://n3s.nadesi.com/id.php?2696)

プログラムでは「話す」命令を使っています。ボタンを押すと、音がなったり「こんにちは」と言ったり、ダンディー坂野のような切れのある逆を繰り出したりできます。

# まとめ

以上、今回は「MML演奏」を使ったら、簡単なプログラムを紹介しました。
音が鳴るってとても面白いですよね。
こんな感じで、面白いブラウザ楽器を作ってみてください！
きっと楽しい（はず）です。
[Go]不確実性なテストで使える assert.InDelta と assert.InEpsilon の使い方

# はじめに
Hello wolrd!
今日は testify パッケージの中でも特に便利な `assert.InDelta` と `assert.InEpsilon` の使い方について解説します。
これらの関数は、数値の比較テストを行う際に非常に役立ちます。特に、浮動小数点数の精度問題や、小さな誤差を許容する必要があるテストケースに適しています。

## assert.InDelta の基本
assert.InDelta は、2つの数値間の差が特定の絶対値（デルタ）以内であることを検証するために使用されます。これは、特に浮動小数点数の計算結果が完全に一致しない場合に便利です。以下の例を見てみましょう。

```go
func TestInDelta(t *testing.T) {
	tests := []struct {
		name     string
		expected interface{}
		actual   interface{}
		delta    float64 // 許容可能な差分の範囲
	}{
		{
			name:     "許容範囲が0、実際の差が0",
			expected: 10,
			actual:   10,
			delta:    0,
		},
		{
			name:     "許容範囲が1、実際の差が1(expected < actual)",
			expected: 10,
			actual:   11,
			delta:    1,
		},
		{
			name:     "許容範囲が1、実際の差が1(expected > actual)",
			expected: 10,
			actual:   9,
			delta:    1,
		},
		{
			name:     "intとfloatの比較もできる",
			expected: int32(10),
			actual:   float64(10.1),
			delta:    0.1,
		},
		{
			name:     "異常系: 許容範囲が1、実際の差が2(expected < actual)",
			expected: 10,
			actual:   12,
			delta:    1,
		},
		{
			name:     "異常系: 許容範囲が1、実際の差が2(expected > actual)",
			expected: 10,
			actual:   8,
			delta:    1,
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			assert.InDelta(t, tt.expected, tt.actual, tt.delta)
		})
	}
}
```
ここで、expected と actual の値の差が delta で指定された範囲内にある場合、テストは成功します。
また、数値の型が異なっていても比較することが可能です。これはInDeltaの中で引数をfloat64に変換しているためです。

## assert.InEpsilon の基本
一方、assert.InEpsilon は相対的な差異に注目します。これは、特定の割合（イプシロン）内での数値の近似を検証する際に使用されます。例えば、以下のように使います。

```go
func TestInEpsilon(t *testing.T) {
	tests := []struct {
		name     string
		expected interface{}
		actual   interface{}
		delta    float64 // 許容可能な差分の範囲
	}{
		{
			name:     "許容範囲が10%(期待値としては100 ±10)、実際の差が10",
			expected: 100,
			actual:   110,
			delta:    0.1, // 10%
		},
		{
			name:     "異常系: 許容範囲が10%(期待値としては100 ±10)、実際の差が11",
			expected: 100,
			actual:   111,
			delta:    0.1, // 10%
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			assert.InEpsilon(t, tt.expected, tt.actual, tt.delta)
		})
	}
}

```
この例では、expected と actual の値が delta で指定された割合内にある場合、テストは成功します。

## まとめ
assert.InDelta と assert.InEpsilon は、微小な数値の差異や浮動小数点数の不確実性を扱う際に非常に便利です。これらの関数を使うことで、より柔軟かつ正確な数値比較のテストケースを書くことができます。是非あなたのプロジェクトで活用してみてください！
exp(x)の極限の覚え方

# exp(x)の極限

```math
\begin{eqnarray}
e^x = \lim_{n \rightarrow \infty} (1+ \frac{x}{n})^n
\end{eqnarray}
```
です。この式って結構覚えられないですよね。

```math
\begin{eqnarray}
e = \lim_{n \rightarrow \infty} (1+ \frac{1}{n})^n
\end{eqnarray}
```
から、導出できます。

```math
\begin{eqnarray}
e^2 &=& \lim_{n \rightarrow \infty} (1+ \frac{1}{n})^{2n}\\
&=& \lim_{n \rightarrow \infty} ((1+ \frac{1}{n})^2)^{n}\\
&=& \lim_{n \rightarrow \infty} (1+  \frac{2}{n} +\frac{1}{n^2})^{n}\\
&=& \lim_{n \rightarrow \infty} (1+  \frac{2}{n} )^{n}\\
\end{eqnarray}
```
中身の累乗を計算すれば、$1$と$1/n$の2項以外は小さくなるので無視できます。

```math
\begin{eqnarray}
e^x &=& \lim_{n \rightarrow \infty} (1+ \frac{1}{n})^{xn}\\
&=& \lim_{n \rightarrow \infty} ((1+ \frac{1}{n})^x)^{n}\\
&=& \lim_{n \rightarrow \infty} (1+  \frac{x}{n} +\frac{_x C_2}{n^2} + \cdots)^{n}\\
&=& \lim_{n \rightarrow \infty} (1+  \frac{x}{n} )^{n}\\
\end{eqnarray}
```
証明できました（整数の場合のみ）。

こう考えると$exp(x)$の場合は$e$の中身に$x$をつければいいというのが頭で理解できます。

# eの極限の覚え方

```math
\begin{eqnarray}
e = \lim_{n \rightarrow \infty} (1+ \frac{1}{n})^n
\end{eqnarray}
```
この式も結構覚えられないですよね。ネイピア数の定義式なので、他の式から出すものではないですが、
次のやり方がいいかもしれません（定理から定義を出すウロボロスの極限）

```math
\begin{eqnarray}
1 &=& \log e\\
更に\\
1&=& \lim_{n \rightarrow \infty}  n \frac{1}{n}\\
&=& \lim_{n \rightarrow \infty} n \log ( 1+  \frac{1}{n})\\
&=& \lim_{n \rightarrow \infty}  \log ( 1+  \frac{1}{n})^n \\
右辺同士を比較して\\
\therefore e &=& \lim_{n \rightarrow \infty} ( 1+  \frac{1}{n})^n
\end{eqnarray}
```
1行目から2行目までは$\log(x)$の$x = 1$の傾きが$1$であることを使った。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/34a3379f-cc24-7e82-14f1-87b442897ef4.png)

ちょっとは覚えやすくなったらいいな・・・
AtCoder初心者 DailyTrainingメモ 2023/11/24

# ABC236 C-問題
https://atcoder.jp/contests/abc236/tasks/abc236_c

![236C.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547298/4b65db9d-12c0-9fdf-441b-9efe83c32b7a.png)

**ポイント**
急行の停まる駅を「defaultdict(int)」に格納します。
全ての駅（各停が止まる駅）を読み込んで、「defaultdict(int)」を参照し格納している値であれば、"Yes"を回答します。「Python:236C.py」

````Python:236C.py
from collections import defaultdict

N,M = map(int,input().split())

# リストで受け取る
S = list(map(str, input().split()))
T = list(map(str, input().split()))

# 連想配列に格納してカウントする
DIC = defaultdict(int)

# 急行の停まる駅を格納する
for c in T:
    DIC[c] += 1

# 駅名をループして　急行の停まる駅にヒットしたら　Yes
for c in S:
    if DIC[c] == 1:
        print("Yes")
    else:
        print("No")
````
先人の方はどう解いているのか見ていたら、とてもシンプルに解いていました。
急行に停まる駅をsetに格納し、in セット　で参照する解法でした。
とても勉強になりました。「Python:236C2.py」

````Python:236C2.py

N,M = map(int,input().split())
# リストで受け取る
S = list(map(str, input().split()))
# 急行停車駅は、setに格納する
T = set(map(str, input().split()))

# 駅名が set にヒットしたら　Yes
for i in range(N):
    if S[i] in T:
        print("Yes")
    else:
        print("No")
````
BigQueryからGCSにエクスポートし、外部ステージ経由でSnowflakeのテーブルにCOPY INTOするときの具体的クエリと注意点

# 前提
- BigQuery上、Snowflake上での権限周りの設定は済んでいること
- Snowflake側の外部ステージの設定は済んでいること
- BigQuery上とSnowflake上に同じスキーマのテーブルがすでに作成済みであること


# コマンド
## BigQuery→GCSエクスポート
export data文をBigQuery上で発行して行います。
この例ではgzip圧縮したCSV形式で行います。

```
EXPORT DATA OPTIONS(
  -- GCSのパス。適宣変えてください。
  uri='gs://some_bucket/path_prefix/*.csv.gz',
  -- 圧縮形式を指定(GZIP, DEFLATE, SNAPPY)。未指定の場合は圧縮無し
  compression='GZIP',
  -- ファイルフォーマットを指定。CSV, JSON, AVROが選択可能
  format='CSV',
  -- ファイルが存在していた場合は上書きたいのでtrue。未指定の場合はfalseになる
  overwrite=true,
  -- ヘッダ行はつけないのでfalse
  header=false,
  -- 区切り文字を指定。デフォルトは「,」だがわかりやすいように明示的に指定
  field_delimiter=','
) AS
-- クエリ。適宜変える。ソーステーブルにカラム追加されたときにエラーにならないようにするにはカラムを明示的に指定する。今回は簡易的に行うだけなので*を指定。洗い替えを想定しているのでWHERE句はつけていないが、追記であれば更新日時などの条件をつけること
select 
  *
from
  `project_id.dataset.src_table_name`

```

## Snowflake側

```
-- 削除。洗い替えを想定しているため削除している。追記であれば不要
truncate table database_name.schama_name.dst_table_name;

-- 全量投入。カラムは適宣追加・削除する
copy into database_name.schama_name.dst_table_name 
from @database_name.schema.external_storage_name/path/prefix/
-- ファイルフォーマット設定
FILE_FORMAT = (
    -- CSV形式
    TYPE = CSV
    -- gzipしているので指定
    , COMPRESSION = GZIP
    -- export data文ではカラムにエスケープが必要な値が入っているときは「"」で囲われるのでこの指定が必要
    , FIELD_OPTIONALLY_ENCLOSED_BY = '"'
    -- ↓にNONEを指定しないと、BigQuery上のカラム値に「abc\」のようなバックスラッシュが末尾に来る文字列があったときに、その後ろの「,」が区切り文字として認識されずにCOPY INTO時にエラーとなってしまうため必ず指定する
    , ESCAPE_UNENCLOSED_FIELD = NONE
)
-- 再取り込みのことを考え、必ず読み込むようにFORCEをつける
FORCE = true;

```

# 注意点
- GCSのAPIコール数
    - 大きなテーブル（数百GB〜数TB）を転送するときにはGCSに大量のファイルが作成される。1日に何回も転送するなど高頻度で転送する場合にはGCSのAPIコール課金に注意が必要。[料金計算ツール](https://cloud.google.com/products/calculator?hl=ja)や[Cloud Storage の料金
](https://cloud.google.com/storage/pricing?hl=ja)で試算をすること
- 実行前後での外部ステージクリーンアップ
    - 外部ステージにエクスポートしたファイルをそのまま残しておくとストレージ料金がかかったり、次回読み込み時の邪魔になるため、実行後に削除すること
    - 前回の転送が途中でエラーとなった場合にGCSパス上に中途半端にファイルが残っているかもしれない。実行直前にもクリーンアップすること
    - クリーンアップ用クエリ例：Snowflake上で `rm @database_name.schema.external_storage_name/path/prefix/;`
PowerShellでいろんな表示方法を試してみた。

## はじめに
lsの結果を横に1列に表示するにはどうしたらいいんだろうと思い、いろんな表示方法を調べましたので紹介します。

## 紹介コマンドのまとめ
| 機能                     | コマンド例                                         |
|------------------------|-------------------------------------------------|
| ファイルのフィルタリング      | `ls -Path "D:\PS\" -Filter "*.txt"`            |
| ファイルのソート           | `ls -Path "D:\PS\" \| Sort Name`                |
| ファイルサイズの表示        | `(Get-Item -Path D:\PS\logs.csv).Length/1KB`    |
| サブフォルダのアイテム表示   | `Get-ChildItem -Path C:\ -Force -Recurse`       |
| リスト形式での詳細表示      | `ls -Path "D:\PS\" \| Format-List`             |
| 幅広い形式での表示         | `ls -Path "D:\PS\" \| Format-Wide`             |
| 特定のプロパティのみの選択    | `ls -Path "D:\PS\" \| Select-Object Name, LastWriteTime` |
| グループ化して表示         | `ls -Path "D:\PS\" \| Group-Object Extension`  |


##  コマンドの紹介
### ファイルのフィルタリング
条件に基づいてファイルやディレクトリをフィルタリングできます。

```powershell
ls -Filter "*.txt"
```

**出力結果:**
```
    Directory: D:\PS

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        1/12/2022   6:00 AM           1024 notes.txt
-a----        1/10/2022   4:00 PM           512  readme.txt
```

### ファイルのソート
ファイルやディレクトリを特定の条件でソートします。

```powershell
ls  | Sort Name
```

**出力結果:**
```
    Directory: D:\PS

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        1/10/2022   4:00 PM           512  config.xml
-a----        1/11/2022   5:00 PM           2048 logs.csv
```

### ファイルサイズの表示
ファイルサイズを異なる単位で表示します。

```powershell
# KBで表示
(Get-Item -Path D:\PS\logs.csv).Length/1KB
```

**出力結果:**
```
2.048
```

### サブフォルダのアイテムを含むリスト
サブフォルダ内のアイテムも表示します。

```powershell
ls -Force -Recurse
```

**出力結果:**
```
    Directory: C:\

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----        1/12/2022   6:00 AM                Program Files
d-----        1/11/2022   5:00 PM                Users
...
```

### Format-List（リスト形式での表示）
リスト形式での詳細な表示を行います。

```powershell
ls -Path "D:\PS\" | Format-List
```

**出力結果:**
```
Name : config.xml
Length : 512
LastWriteTime : 1/10/2022 4:00 PM
...

Name : logs.csv
Length : 2048
LastWriteTime : 1/11/2022 5:00 PM
...
```

### Format-Wide（幅広い形式での表示）
幅広い形式でコンパクトに表示します。
→これがやりたかった！

```powershell
ls | Format-Wide
```

**出力結果:**
```
config.xml    logs.csv
notes.txt    readme.txt
```

何列で表示したいか指定
```powershell
ls | Format-Wide -Column 4
```
**出力結果:**
```
config.xml    logs.csv    notes.txt    readme.txt
```

### Select-Object（特定のプロパティのみを選択）
特定のプロパティのみを表示します。

```powershell
ls -Path "D:\PS\" | Select-Object Name, LastWriteTime
```

**出力結果:**
```
Name       LastWriteTime
----       -------------
config.xml 1/10/2022 4:00 PM


logs.csv   1/11/2022 5:00 PM
```

### Group-Object（グループ化して表示）
特定のプロパティに基づいてグループ化します。
拡張ごとに表示できるので便利！

```powershell
ls  | Group-Object Extension
```

**出力結果:**
```
Count Name    Group
----- ----    -----
2     .txt    {notes.txt, readme.txt}
1     .xml    {config.xml}
1     .csv    {logs.csv}
```

# まとめ
このようにPowerShellの`ls`コマンドを用いることで、ファイルやディレクトリの情報を多角的に把握し、効率的なファイル管理を行うことが可能になります！
価格の算出 Python3編

https://paiza.jp/works/mondai/data_structure/data_structure__dict_step4

価格リストを作ってその中から買い物リストにあるモノの値段を出力せよという問題。

前のがヒントになってこれは解けた。
一瞬難しかったのが、`name,price = map(str,input().split())`
数値の部分を数値にせず文字列のままにしたが
問題なく検索できたのでそのあとも最後までできた。

```py
N, M = map(int,input().split())
prices = {}
for i in range(N):
    name,price = map(str,input().split())
    prices[name] = price
    
for order in range(M):
    item = input()
    if item not in prices:
        print(-1)
    else:
        print(prices[item])

```

で、答えを見てみると
どうやらひっかかったところ、こうすればよかったらしい。
たしかにそうだ。
splitのときだけ文字列のままにしといて、あとで型変換するという方法は
覚えておこう。

```py
prices[name] = int(price)
```
オブジェクト指向の再利用部品群の概要

## はじめに
オブジェクト指向がもたらした再利用部品群の、
クラスライブラリやフレームワークについて理解する。





## クラスライブラリ
　汎用的な機能を持つクラスを集めたもの。
 
　クラスライブラリには２種類あり、
　プログラミング言語に標準で付属するものと、サードパーティ製のものである。

 
### 1. プログラミング言語に標準で付属するもの
　Rubyなどの言語は、
　言語仕様を最小に抑え必要な機能をライブラリとして提供している。
 
:::note info
利点：
・文法や構文がシンプルになることで、言語学習や理解が容易になる。
・新機能をライブラリで実装するため、言語仕様のバージョンアップが必要ない。
:::

#### 言語標準クラスライブラリは継承構造
　言語標準のクラスライブラリは継承構造になっており、
　最上位の唯一のクラス(基底クラス)が存在する。

:::note info
基底クラスは言語により名称は異なる。
例えば、JavaではObject、Pythonではobject、RubyではBasicObjectである。
:::

　基底クラスには、基本的な処理を行うメソッドが定義されている。

:::note warn
Rubyの場合、最上位のBasicObjectはほとんど何も定義されていないクラスで、
そのクラスを継承しているObjectクラスが多数のメソッドを有している。
:::

#### Rubyにおける標準クラスライブラリの継承関係図
　最上位にBasicObjectがあり、
　それをObjectが継承しさらに多岐にわたるクラスが継承している。
　下図は一例であり、他にも多数のクラスライブラリが存在する。
 
　　　　　　　<img width="500" alt="Ruby_inheritance" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1620826/c4d79063-0771-57b3-65fb-d14918584eab.jpeg">


### 2. サードパーティ製のもの
　プログラミング言語の開発元以外の企業や個人によって提供されるクラスライブラリ。
　用途は特定の機能を実装するため。

#### Rubyの場合
　Rubyでは*RubyGems.org*でサードパーティ製クラスライブラリを提供している。
　そこでは、gemと呼ばれる配布用フォーマットでクラスライブラリを扱っている。

 :::note info
サードパーティ製クラスライブラリの例：
・bundler：gem間の依存関係を管理するためのライブラリ。

・rack　 ：webアプリケーションやフレームワークと、
　　　　　 APサーバを接続するためのインターフェースを提供するライブラリ。
:::





## フレームワーク
　アプリケーション開発においてよく利用される機能を集め、
　それらを枠組みとして提供する再利用部品群である。

### 役割
　フレームワークはクラスライブラリとは違い、
　アプリケーションから呼び出されるのではなく、
　逆にフレームワークからアプリケーションを呼び出すように使用する。

　基本的な処理の制御をフレームワーク側で提供し、
　そこにアプリケーション固有の処理を組み込んでいく。

:::note info
基本的な処理とは？
　ネットワーク通信によるHTTPリクエスト/レスポンス処理、アクセス認証、
　データベースにアクセス、画面描画など
:::

### 仕組み
　フレームワークは、継承やポリモーフィズムなどオブジェクト指向の仕組みによって、
　簡単なコード記述でアプリケーションを開発することができる。
 
　フレームワークは、基本的な処理をメソッドとして定義したクラスを用意している。
　そのクラスをアプリケーション側で継承させることで、
　アプリケーション独自の処理に書き換えたり、またはデフォルト処理として使用できる。
　そしてポリモーフィッズムによってクラスの処理を呼び出す。

　　　　　　　<img width="500" alt="FrameWork" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1620826/3641b40b-2f67-a8c5-5eb8-5633d9ff73b6.png">
別プロセスから起動されるコマンドをgdbでデバッグしてみる

gdbを使う場合、デバッグしたいプログラムを直接gdbで起動することは可能だが、あるプログラムから実行されたプログラムをデバッグしたい場合、どうすれば可能かを考えてみた。あるプログラムを wrapper.sh とした場合に、そｒを gdbserver コマンドで実行するラッパープログラム（シェル）を作ってみてはどうだろうか？

wrapper.sh を実行するプログラム名に置き換えることで、呼び元を騙す。
gdbserverはgdbコマンドから接続されるまではじっと待っているので、すぐに終了してしまうようなプログラムでもデバッグできるのではないか、という考え。

未検証。

```shell: shell
# chmod +x wrapper.sh
# mv wrapper.sh <実行したいプログラム名>
```

```shell: wrapper.sh
#!/bin/sh

CMD="ls aa"
HOST="localhost"
PORT="12345"

EXCEPT_CODE="99"

# usage
echo "execute command:[${CMD}]" 1>&2
echo "Please execute gdb" 1>&2
echo "# gdb"
CMD_LIST=($CMD)
echo "(gdb) file ${CMD_LIST[0]}"
echo "(gdb) target remote ${HOST}:${PORT}"
echo "(gdb) b main"
echo "(gdb) run"
echo -e

# デバッグしたいコマンドを実行
STATUS=$(gdbserver ${HOST}:${PORT} ${CMD} |& awk '/Child exited with status/ {print $5}')

# if gdbserverが status code なしで終了した場合
if [ -z ${RET} ]; then
        echo "Child exited with status is not set!!" 1>&2
        ret=${EXCEPT_CODE}
else
        echo "Child exited with status ${STATUS}" 1>&2
fi

exit ${STATUS}

```
自動運転AIチャレンジRacing大会(仮称) 〜粗動作させてみた〜

# 概要
本記事は、[自動運転AIチャレンジRacing大会(仮称)](https://github.com/AutomotiveAIChallenge/aichallenge2023-racing)のプログラムを粗動作させてみたという内容です。

# 自動運転AIチャレンジRacing大会(仮称)とは
[公式HP](https://www.jsae.or.jp/jaaic/about.php)の通り。  
前回までと異なり高価グラボを積まなくてもCPUがそれなりならCPU onlyバージョンで参加できるようになっています。  
ちなみにAWSIM GPU描画版もNVIDIA GPUもそんなに古いものでなければ動くはずです。

# セットアップ
[セットアップドキュメント](https://github.com/AutomotiveAIChallenge/aichallenge2023-racing/blob/main/documentation/docfx_project/setup/index.md)通りやって普通にうまく動きました。

自分はCPU only版でもGPU搭載でもAutoware/AWSIMが動作することを確認しました。  
ちなみに自分のPCが搭載しているCPUはAMD 5600Gです。  

参加者の方のCPU onlyでの動作実績は[こちら](https://github.com/AutomotiveAIChallenge/aichallenge2023-racing/issues/15)に記載されております。  

本記事では以降GPU描画版での実行結果を記載します。(CPUオンリーは割愛)

# パラメータ未調整バージョン(2023/11/24)
実行。  
それなりに動いてくれるがパラメータ未調整なのとメンテ中なのもあり動作がまだぎこちない。  

![Screenshot from 2023-11-24 20-44-17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3154772/2e6d6d09-6681-5904-95ba-126fccbe6f22.png)

# 参考
以前CPU onlyで粗動作させたときのスクショを載せておきます。
すこし昔なので今とIF変わってると思いますが。。。
![284259871-b7653cee-d69c-42d4-ba0c-16dd71778f0a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3154772/e1f6dce8-8d0f-00ce-0afe-331df2501f02.png)

# 追記(2023/12/04)
本家のリポジトリが更新されレーシングカーが完走するようになりました！

https://x.com/masarisu04/status/1731642527411994926?s=20

# 終わりに
とりあえず粗動作させてまではいけました。  
セットアップドキュメントを読めばCPUバージョンもGPUバージョンもわりとあっさり粗動作まではできると思います。  
今月は絶賛メンテ中ぽいのとパラメータが膨大で何をいじればよいか不明なので適当にパラメータのあたりをつけてゆるり動かして見る予定。
Tailwind CSSで動的なクラス名を割り当てる方法


## 事象

Tailwind CSSを使用している際に、背景色を動的に割り当てる方法についての問題に直面しました。特定の条件下で背景色を変更する必要がありましたが、標準的なアプローチでは解決できませんでした。

## 対処法

React コンポーネントで動的にクラスを割り当てる方法を紹介します。以下のコードでは、Tag コンポーネントを作成し、`colorClass` プロパティを使用して背景色を動的に設定しています。

```tag.tsx
import React from 'react';

interface TagType {
  tagName: string;
  colorClass: string;
}

const Tag: React.FC<TagType> = (props) => {
  const { tagName, colorClass } = props;

  const colorVariants: { [key: string]: string } = {
    'red': 'bg-red',
    'pink': 'bg-pink',
  }

  return (
    <div
      className={`${colorVariants[colorClass]} ...`}
    >
      {tagName}
    </div>
  );
};

export default Tag;
```

`colorVariants` オブジェクトは、色の名前と Tailwind CSS の背景色クラスをマッピングしています。これにより、色の名前に基づいて適切な背景色クラスを動的に適用できます。

```tailwind.config.js
module.exports = {
  theme: {
    extend: {
      colors: {
        red: '#E74B61',
        pink: '#FB93B3',
      },
    },
  },
}
```

この tailwind.config.js ファイルでは、カスタムカラーを定義しています。これにより、コンポーネントで指定されたカラー名が Tailwind CSS のクラスとして正しく解釈され、期待通りのスタイリングが可能になります。

## 参照

https://tailwindcss.com/docs/content-configuration#dynamic-class-names

自らの備忘録のために投稿してますが、なにかお役に立てましたら幸いです！:clap:
また、なにか間違ってましたらご指摘いただけますと幸いです！:pray:
IoTメガネだけで動くVTuber配信用アプリつくってみた

この記事は [ここのえ Advent Calendar 2023](https://qiita.com/advent-calendar/2023/99no_exit) Day 24 の記事です。

# Streamemeの紹介

2023年4月、IoTメガネである **JINS MEME** を使用してVtuberの配信ができるツール、「**Streameme**」をリリースしました。

![title.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617021/bcdc6df0-8114-4e9a-176b-c00e2cceb331.png)

MEMEのジャイロ情報をLoggerアプリ経由で取ってきて、PCのアプリケーション上でVRMを動かすことができるアプリになっています。

カメラ切り替え・背景のGB/BB化・リップシンクにも対応しており最低限配信に必要な機能が揃っています。

![gyro_1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617021/7224cd41-6728-0691-bd12-0ccea5c46602.gif)

現在はα版で、将来的に [VMCProtocol](https://protocol.vmc.info/) にも対応予定です。

# 開発の動機

一時期Twitchの配信や、オンラインの集会、LTイベントなどの機会に、VRChatで使っているアバターのVRMを使っていました。

ただVTuber的なことをやろうとすると面倒なのが機材のセットアップです。フェイストラッキングするのに机の上から機材をどかして、スタンドを設置しiPhoneを置く…という手順を踏まなければならず、どうにも手間になっていました。

そこで白羽の矢が立ったのが **JINS MEME** です。前から面白そうなデバイスだと思って購入はしていたのですが、実はあまり活用できておらず…　公式アプリでたまに集中度とかを計測して遊んでいたのですが、そういえばLoggerアプリでWebsocket送れたな…？と思い作り始めました。

# 全体の構造

以下、クローズドなLTで登壇した際の資料と並行して紹介します。少し見辛づらいですがご了承ください。

![Slide11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617021/f97dc07b-b1e0-2da8-5e55-7adea83a075e.jpeg)

JINS MEMEからiPhoneに接続し、iPhoneの専用Loggerアプリでデータを取得します。iPhoneからPC側にWebsocketで転送し、送られてきたデータをC#でパースし、Unityでモデルを動かします。

またリップシンクには [**uLipSync**](https://github.com/hecomi/uLipSync) を使用しています。

# LoggerアプリからのWebsocket通信について

![Slide12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617021/388e7965-98e2-aac0-6d55-3cae1c44c4de.jpeg)

JINS MEMEのデータ送信には幾つか形式があり、集中力とかを計測するのであれば15,60sec間隔の統計データを使用することができます。今回の用途ではリアルタイム性が求められるので、20Hz間隔のデータ(`currentData`)形式を使用して送信しています。統計データに比べると取得できる情報は制限されてしまいます[^1]が、モーションキャプチャに必要な情報は取得できているため、問題ありません。

またYawの方向が正面とは限らないので正面リセット機能を付けたりしています。精度についてはシンプルな制御しか行っておらず、まだ最低ラインに達したぐらいなので、今後改善していきたいなーという気持ちです。

# 一番大変なのはuGUIだった

これは大正コソコソ噂話なのですが、一番実装に手間がかかっているのはUIの部分だったりします。

他のアプリケーションでは大抵uGUIのデフォルトのボタンを使っていたり、別ウィンドウでインターフェースを用意している場合が多いと思います。
ただ今回はシンプルかつ分かりやすく機能を纏めたかったので、イラレでアイコンを作ったり、uGUIのアニメーション周りをゴリゴリに書きました。

実は実装コスト的に結構洒落にならなくて、`v0.1.0`の実装作業のうち半分ぐらいの時間はここに手間をかけています。特にボタン周りのアニメーションを伝播させようとしたりするのが面倒でした…

最近だと**UI Toolkit**という新しい仕組みも出来ているので、どこかのタイミングでそちらに移行してもいいかな…と考えています。HTML/CSSをベースにした`UXML`, `USS`で定義できるようです。

# まとめ

暫くWeb開発やBlenderの3Dモデリングにリソースを振ってしまっていたため、実はちょっと開発が停滞してます…　そろそろ開発を再開せねば、という気持ちでこの記事を書いています。

JINS MEME自体は面白いデバイスですし、度付き眼鏡にしても2万円弱で購入できるので結構お得です。もし手に取る機会があったら、一度試してみてください :bow: 

https://github.com/nonuplet/streameme

[^1]:https://jins-meme.github.io/sdkdoc2/basics/definition.html
リバースプロキシ vs. APIゲートウェイ vs. ロードバランサー

# はじめに
Xで目にした技術Tipsの紹介です。

WEBサーバー（アプリケーションサーバー）の前段に配置し通信やデータに対して何かしらの制御を行う技術として挙げられる三者ですが、それぞれの使い所や目的の違いを意識せずなんとなく運用しがちなケースが多いように思うので、知識の見直しを図るのにうってつけの情報です。

# 原典
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Reverse proxy vs. API gateway vs. load balancer<br><br>As modern websites and applications are like busy beehives, we use a variety of tools to manage the buzz. Here we&#39;ll explore three superheroes: Reverse Proxy, API Gateway, and Load Balancer.<br><br>🔹Reverse Proxy: change identity<br>-… <a href="https://t.co/szyBYf2msC">pic.twitter.com/szyBYf2msC</a></p>&mdash; Bytebytego (@bytebytego) <a href="https://twitter.com/bytebytego/status/1724322287837671593?ref_src=twsrc%5Etfw">November 14, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 結論
実処理を担うサーバーの存在を外から見えなくしたいならリバースプロキシ。
サービス間通信の体系化を実現するならAPIゲートウェイ。
トラフィックの制御を求めるならロードバランサー。

これらは三者択一ではない。時には全てを網羅するのも賢い選択である。
いずれを選択しても、安全かつ効率的なシステム運用に役立つ。

# リバースプロキシ
>🔹Reverse Proxy: change identity
>- Fetching data secretly, keeping servers hidden.
>- Perfect for shielding sensitive websites from cyber-attacks and prying eyes.
>
>主目的は「アイデンティティの変更」です。
> - データを秘密裏に取得し、またサーバーの存在を隠します。
> - センシティブなWEBサイトをサイバー攻撃や好奇の目から保護するのに最適です。

「WEBサーバーという子供をラップする親のような存在」と言えそうです。
WEBサイトのユーザー（ブラウザ等）に対する「表の顔」として存在し、大切なWEBサーバーたちをセキュリティリスクから保護するのが主目的であると。
リバースプロキシとして代表的なサービスは何と言ってもNginxですね。

なお原文では触れられていませんが、詳細な役割としては他にも豊富にあります。SSL終端、バックエンドサーバー構成の拡張変更容易性、キャッシングによるバックエンド負荷軽減など。
Nginx公式が非常にわかりやすいです。
https://www.nginx.co.jp/resources/glossary/reverse-proxy-vs-load-balancer/

# APIゲートウェイ
>🔹API Gateway: postman
>- Delivers requests to the right services.
>- Ideal for bustling applications with numerous intercommunicating services.
> 
>喩えるなら「郵便配達人」です。
> - 受信したリクエストを適切な宛先のサービスへ配送します。
> - 相互通信を行う多数のサービス群で構成される複雑なアプリケーションにピッタリです。

APIゲートウェイは、異なる処理目的を持つ複数のサービスを集約する単一のエンドポイントとして公開されるのが通常で、受信したリクエストの種別（クエリストリングやPOSTボディデータで表現されることが多い）に応じて、適切な処理サービスへリクエストを振り分ける、という役割を担います。
よく使われるのはAWSが提供するAmazon API Gatewayあたりでしょうか。
その他よく求められる役割を補足すると、API使用状況モニタリング、クライアントの認証認可、Open API Specificationとの統合、流量制御、APIバージョン管理、等があります。
APIゲートウェイ自体がサーバレスなフルマネージドのサービスとして実装されていることが多いので、サーバレスアーキテクチャと組み合わせることでシステム運用上のシナジーを最大化できます。

# ロードバランサー
>🔹Load Balancer: traffic cop
>- Directs traffic evenly across servers, preventing bottlenecks
>- Essential for popular websites with heavy traffic and high demand
>
>例えるなら「交通整理の警察官」です。
> - 受信トラフィックを各サーバー間に均等に振り分けることでボトルネック発生を未然に防ぎます。
> - 大量のトラフィックと高い需要に対応する人気WEBサイトで不可欠です。

ロードバランサーは冗長化された複数のバックエンドサーバー群の前段に配置され、各サーバーの処理量が均等になるように受信トラフィックを振り分けることで可用性を確保します。
よく使われるのはNginxやAWS Elastic Load Balancer(ELB)でしょうか。

# おわりに
これら三つの要素がどのような主目的で存在するのかを理解することで、システム運用の適切な設計に役立てることができると思います。
Ubuntuでのpyenvの始め方

備忘録用のメモとして記します。

## 1. pyenvのインストール

[公式URL](https://github.com/pyenv/pyenv#basic-github-checkout)

まずは、Gitでpyenvをクローンする。

```sh
$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv
```

## 2. PATHを通して、pyenvの初期化

[公式URL](https://github.com/pyenv/pyenv#set-up-your-shell-environment-for-pyenv)

`.bashrc`ファイルにPATHを通す。

```sh
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
$ echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(pyenv init -)"' >> ~/.bashrc
```

## 3. Pythonのbuildに必要なパッケージをインストール

[公式URL](https://github.com/pyenv/pyenv/wiki#suggested-build-environment)

以下の操作は、ビルド環境のための推奨事項。

```sh
sudo apt update; sudo apt install build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev curl \
libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev
```

## 4. シェルの設定を反映

Bashの場合は、一度ターミナルを閉じることでPATHが通ることになる。
ターミナルを閉じない場合は、以下のコマンドを実行する。

```sh
$ source .bashrc
```
勉強記録ウェブアプリ作成の軌跡 0:仕様・要件定義

# 概要
「【Rails×React】UberEats風アプリを作りながら、SPA開発を学ぼう」を使って学んでいく上で自分で勉強記録アプリを作りたいと思ったので、完成するかは置いといて、とりあえず学んだことを自分が作りたいものに置き換えて考えていく。

# 内容
今回はどういったものを作りたいか、そして作成したいウェブアプリの仕様や要件等を決めていく。

# 何を作りたいのか
### 勉強記録アプリ
ざっくり言うと、資格など勉強したことを記事のような形でまとめていき、のちに復習できるよう重要な点については見え隠れすることができるウェブアプリを作る。

# 環境
- サーバーサイド
    - Ruby on Rails
- フロントエンド
    - slim
    - css
    - JavaScript(React)

# 必要な実装
- メインページ
    - 他の画面に遷移するための動線
    - どういったページなのか
- ユーザページ
    - ユーザが作成した記事の一覧表示
        - 各記事に前回解いた時にどれぐらいの正解率だったか
    - 記事の検索
- 復習ページ
    - 記事を表示
    - 穴埋め
    - そのページ内でどれだけ会ってたかどうか
- 記事作成ページ
    - htmlで記事を作成する⁇
    - もしくはMarkdownで作成⁇
    - いったんhtml形式の記事を作成
- テスト
- ユーザの登録・ログイン処理

# 特に実装しないこと
- システム管理者用画面
    - もしちゃんと完成すれば考える
- 本番デプロイ
    - もしちゃんと完成すれば考える
- 他のユーザとの共有機能
    - いったん自分の記事のみしか参照できないようにする
    - 本番デプロイ等した際はqiitaのようないろんな人と記事を共有できるようにしたい

# 実装の順番
今回は参考にしている教材がありそちらに則り進めていくため、サーバーサイドを作成したのち、フロントエンドの実装に移っていきたいと思う。
このような方法を取る理由としては、サーバーサイドとフロントエンドを切り替える手間を省くことが理由としてあるらしい。
自分としては、1ページごとにサーバーサイド・フロントエンドを同時に作成していきたいが、今回はやめておく。

# 参考記事
- 【Rails×React】UberEats風アプリを作りながら、SPA開発を学ぼう
    - https://www.techpit.jp/courses/138
【Firebase + React】開発時に発生したエラーまとめ

FierbaseにReact AppをGithub Actionを用いたCI/CD経由でデプロイした際にエラーが
「Project IDが見つかりません」とのエラーが出た。

## 環境
```
"firebase": "^10.6.0",
"react": "^18.2.0",
node v18.18.2
"vite": "^4.4.5",
```

## 原因
Github Actionの環境変数設定が正しく行えていなかった

## 解消方法
Github Actionの環境変数を下記の通り設定する

1. 対象のリポジトリの「Settings」を開く
1. 左メニューバーの「Security」にある「Secrets and variables」> 「Actions」の順に開く
1. Variablesタブを開き、「New repository variable」を押下する
1. キー名と値をセットし保存する

※Viteで構築しているアプリの場合、環境変数名は「VITE_〇〇」のようにVITE_からはじめるひつようがあｒ
融合智慧的學海航行：線上課程與兩種不同的學習方式


在現代社會，學習方式多元化，人們有著更多的選擇來獲取知識。本文將著重介紹三種不同的學習方式，其中之一是線上課程，它以其方便、靈活的特性，受到越來越多人的青睞。

首先，讓我們來探討[線上課程](https://www.elevo.com.tw/featured-article/trend/online-tutor)這一種學習方式。隨著科技的不斷進步，網路已經貫穿了我們的日常生活，也改變了教育的面貌。線上課程提供了學習者一個在任何時間、任何地點都能夠取得知識的機會。透過各種學習平台，學生可以根據自己的節奏和時間表進行學習，無需受制於傳統課堂的時間和地點限制。此外，豐富的學習資源，如影片講座、線上測驗和討論區，也使得學習變得更加生動和互動。

然而，線上課程也面臨一些挑戰。學習者在這種方式下需要擁有一定的自律性，因為沒有老師即時的監督和提醒。有時，學生可能因為太過於放鬆而無法保持學習的動力。此外，對於某些專業領域，特別是需要實際操作和實習的課程，線上學習難以完全替代傳統課堂。

除了線上課程，傳統的面對面課堂仍然是一種主流的學習方式。在這種環境下，學生可以直接與老師和同學互動，即時解答疑問，並且享受到更多的社交和合作機會。傳統課堂的優勢之一是老師可以根據學生的反饋和表現調整教學方法，提供更加個性化的學習體驗。

然而，傳統課堂也有其不足之處。時間和地點的限制使得一些有意愿學習的人難以參與。此外，傳統教學可能無法滿足每個學生的學習風格和速度，因此一些學生可能感到被拖慢或被忽視。

除了線上課程和傳統課堂，還有一種相對較新的學習方式，即混合式學習。這種方式將線上學習和傳統面對面的教學相結合，取長補短。學生可以在網上預習課程內容，然後在課堂上進行實際應用和討論。這樣的模式既充分利用了線上學習的靈活性，又確保了面對面互動的重要性。

總的來說，每種學習方式都有其優勢和不足，並且適用於不同的學生和學科。線上課程提供了方便和靈活性，傳統課堂提供了更多的互動和社交機會，而混合式學習則融匯了兩者的優點。在這個多元化的學習環境中，選擇一種或多種學習方式，取決於個人的學習風格、需求和目標。無論選擇何種方式，重要的是保持學習的動力和持續進步，使自己在這個知識的海洋中不斷航行。
AIエディタCursorをインストールして環境設定でまごついた事（Windows）

CursorをインストールするとVS Codeの設定やプラグインを引き継いでくれるとのことで、すぐにすんなりと使えると思ったがそうはいかなかった話。


#### 1. デフォルトのダークなカラーテーマを白っぽいのにしたい
##### 2. レポジトリルートで`code .`コマンド打ったら相変わらずVS Codeが開くので、Cursor画面が開くようにしたい。

<br />

１から。
- Cursorを開いて「ファイル」→「ユーザー設定」→「設定」。
- 検索窓で「color theme」と入力。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/fbd8cd95-7c13-6104-5eb9-eac6d0608392.png)
- 「Workbench: Color Theme」のプルダウンメニューで「ライト＋」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/a7d3c98d-6602-33e1-46d9-6e7c357872b8.png)

- 馴染み深い白い画面になりました（ダーク画面、嫌いなんです…）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/991e8c49-ab98-1160-f925-12f666aa35d3.png)

以上
<br />

２について。
- 例えば以下のようにプロジェクトルートで`code .`と打つとVS Codeが開いてしまう。
```cmd
C:\Users\atyah\Git\portfolio-web>code .
```
- 対処方法は、Windowsのユーザー環境変数の設定を変える。以下やり方。
- システムの詳細設定（システムのプロパティ）を開く。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/e03e621e-d487-8162-97b2-2297ed84526e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/afbc64c1-17bd-43ec-7bc2-6a87bab3b9aa.png)
- 「環境変数」ボタンをクリックして「環境変数」画面を開く。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/2fb1e577-d721-71a0-a0f6-1220a6a04a62.png)

- 環境変数画面で「ユーザーの環境変数」の「Path」をダブルクリック、あるいは「編集」ボタンをクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/8dae575e-4214-cb79-334e-79aba1a329a3.png)

- 「環境変数名の編集」画面が開くので、「新規」ボタンをクリックし、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/aebeab91-e9a5-e649-90f8-4b3146971b26.png)

`C:\Users\[ユーザー名]\AppData\Local\Programs\cursor\resources\app\bin`を追加する。

私の場合、`C:\Users\atyah\AppData\Local\Programs\cursor\resources\app\bin`
を追加した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/fc90989a-f2bd-666c-3b9b-a746c96b955d.png)

- 「OK」ボタンをクリックして閉じる。
- さらに「OK」ボタンをクリックして閉じる。
- さらに最後に「OK」ボタンをクリックして「システムのプロパティ」画面を閉じる。

これにより、レポジトリルートで`cursor .`コマンドを打つとCursor画面で開けるようになる。
`code .`コマンドだと今まで通りVS Code画面が開く。

以上。


<br />
参考：

[新時代のコードエディタ、Cursorのメリット・できることを網羅的に解説](https://zenn.dev/gamuprog/articles/53e7adee04b337)

[VSCodeとCursor両方のエディタをインストールした時のトラブル (Windows版：CursorはOSSのVSCodeをforkしてAIを追加したエディタ)](https://qiita.com/masakinihirota/items/a92914d50a8d36e5a12f)