OmniAICreator/Qiita-1.07M huggingface dataset:
４頂点楕円体描画

### 弾としての表現
は色々とありますが（要するにシューティングゲームの弾です）

- 球状だと進行方向がわかりにくい、味気ない
- 板状は視線と平行になるとつぶれてしまう

ので、私は楕円体の描画を好んでよく使っています。ビルボードと同様に少ない頂点で描画でき、カメラの位置で破綻することもありません。

![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90046/4beeb036-837b-f1ab-93a5-bb21b33d9d07.gif)

今回は Godot での実装例を紹介します。
（Unityの実装例は・・・だいぶ前にソースを公開しただけだったかも）

### 頂点の算出

進行方向を持つ弾は、２点で表現されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90046/a5027cbb-2a9d-0c1c-ccea-17fbafdab617.png)

カメラに対してこのような位置関係にある場合、頂点シェーダで

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90046/cdbb5e46-5eb5-8013-9732-4e57904f6c1a.png)

このようなオレンジ色の頂点を算出します。このようにカメラに対して垂直な点を作れば、ワールド座標の２点が視線方向に重なっても

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90046/fbb3a305-147c-7a14-00ac-b5c6b793884f.png)

こうなりますから、潰れることはありません。楕円体を真横から見れば円になる理屈に沿っていますね。

### GDScript

```gdscript
func _ready():
	var vertices := PackedVector3Array([
		Vector3(0,0,0),
		Vector3(0,0,1),
		Vector3(0,0,0),
		Vector3(0,0,1),
	])
	var normals := PackedVector3Array([
		Vector3(-0.5,-0.5,-1),
		Vector3(-0.5, 0.5, 1),
		Vector3( 0.5,-0.5,-1),
		Vector3( 0.5, 0.5, 1),
	])
	var UVs := PackedVector2Array([
		Vector2(0, 0),
		Vector2(0, 1),
		Vector2(1, 0),
		Vector2(1, 1),
	])
	var indices := PackedInt32Array([
		0, 1, 2,
		2, 1, 3,
	])
 ```
頂点シェーダの計算に都合の良い４頂点のメッシュを用意します。どうせ頂点は計算で出すので、ここがモデルとしてどんな形をしていようがかまいません。
手元では、大量に出すために instancing の設定をしていますが、本筋ではないので割愛。

### シェーダー

```glsl
shader_type spatial;
render_mode cull_disabled, blend_add, depth_draw_never, unshaded, specular_disabled, shadows_disabled, ambient_light_disabled, skip_vertex_transform;

void vertex()
{
	vec3 objSpaceViewDir = normalize(transpose(MODEL_NORMAL_MATRIX) * (CAMERA_POSITION_WORLD - NODE_POSITION_WORLD) + VERTEX);
	float width = 1.0;
	vec3 forward = vec3(0, 0, 1);
	vec3 side = normalize(cross(objSpaceViewDir, forward));
	vec3 vert = normalize(cross(objSpaceViewDir, side));
	vec3 tv = NORMAL.x * width * side;
	tv += NORMAL.y * width * vert;
	float len = 2.0 - width;
	tv -= VERTEX.xyz * len;
    VERTEX = (MODELVIEW_MATRIX * vec4(tv, 1.0)).xyz;
}

void fragment()
{
	float x = (UV.x-0.5)*2.0;
	float y = (UV.y-0.5)*2.0;
	float dist2 = x*x + y*y;
	ALBEDO = COLOR.rgb;
	ALPHA = (1.0-dist2)*0.5;
}
```

こんなふうに頂点シェーダで外積を多用すると望んだ結果が得られます。
わざわざNORMALを用意せずUVの値で計算してもいいのですが、UVの値はテクスチャなしで円を描画するのに使用しているため、このような実装になっています。

### おまけ： objSpaceViewDir

```glsl
	vec3 objSpaceViewDir = normalize(transpose(MODEL_NORMAL_MATRIX) * (CAMERA_POSITION_WORLD - NODE_POSITION_WORLD) + VERTEX);
```
これ。カメラの方向をオブジェクト空間で欲しいってことはよくありますが・・
Unityのシェーダならすぐにとってこれる値なのですが、Godotだとなかなか複雑な演算を必要とします（それなりに探しましたが他に方法を見つけられなかった）。
イディオムとして使いまわしていきましょう。これを標準で用意すべきとも、あまり思いませんね・・書けばいいのですよ。

### そんな小ネタでした
というか Advent Calendar の援護射撃でした。
[IDMC]正確性、一貫性、、データ品質の評価軸について

この記事は インフォマティカ Advent Calendar 2023 Day 18 の記事として書かれています。

## データ品質の評価軸＝データ品質の次元とは
Informaticaのデータ品質ソリューションではデータ品質チェックの評価軸を指定する事が出来、またそれを元にCloud Data Governance & catalog(CDGC)で視覚化して把握し易く出来ます。Informaticaではこれをデータ品質の次元(Dimensions of data quality)として表記しています。
現在用意されている評価軸は以下の6つです。
- 正確性(Accuracy)
- 有効性(Validity)
- 完了度(Completeness)  ・・"完全性"とも言う
- 一貫性(Consistency)
- 一意性(Uniqueness)
- 適時性(Timeliness)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985453/2983ec9e-89e0-b17c-93bc-f506a135349a.png)
現在の6つの評価軸はデータマネジメントの教科書DMBOKの中で定義されているデータ品質の8つの評価軸のうちの6つとなっているようです。

尚、実際に作ったデータ品質ルール・ロジックがどのような評価を行っているか≒どの評価軸に関連するのか、については、そのルールを作った人・組織が自身で判断して指定することになります。
今日はこれらデータ品質の評価軸について改めて確認してみます。

### 正確性(Accuracy)
マニュアルより：
アセット・ロジックが主にデータ値の正確性を確認する場合に［正確性］を選択します。アセットが検証できる既知のデータファクトとデータが一致する場合、そのデータは正確であると言えます。

例：
- データが事実を正確に表しているか

### 有効性(Validity)
マニュアルより：
アセット・ロジックがデータの妥当性を確立することを主な目的としている場合は、［有効性］を選択します。データが、組織が定義するビジネスルールの形式的および構造的要件を満たしている場合、そのデータは有効であると言えます。

例：
- データ型が一致しているか
- 文字列長が適合しているか


### 完了度(Completeness)
マニュアルより：
アセット・ロジックが主にデータの完全性を確立することを目的としている場合は、［完了度］を選択します。例えば、組織のビジネスルールでは、1つ以上のデータカラムにNULLデータが含まれていないことが求められる場合があります。

例：
- 欠損値(null)が無いか

### 一貫性(Consistency)
マニュアルより：
アセット・ロジックが主に1つ以上のカラム内のデータの一貫性の確立に関係している場合は、［一貫性］を選択します。カラムの値が統一された文字形式に準拠している場合、カラム内のこのデータは一貫していると言えます。

例：
- データ内容・表記が統一できているか

### 一意性(Uniqueness)
マニュアルより：
アセットロジックが、主に重複したレコードがデータセットに含まれていないことに関係している場合は、［一意性］を選択します。2つ以上のレコードが実質的に同じデータを持つ同じデータエンティティを参照している場合、それらのレコードは互いに重複していると言えます。

例：
- データが重複していないか

### 適時性(Timeliness)
マニュアルより：
アセットの主な目的が、レコードデータが最新であることを確認することである場合は、［適時性］を選択します。現在のデータは、データファクトの最新のバージョンを表します。

例：
- 最新のデータになっているか

## まとめ
データ品質のルールは様々な考え方がありますが、上述の評価軸を参考にして設定しておくとデータ品質の状況把握がし易くなると思います。ぜひご活用下さい。
フォームを POST するときの注意事項まとめ



わかっていてもよく抜けてしまう場合のある事項をチェックリストとしてまとめてみました。

# method=”POST”

フォームの属性に method=”POST” がないと、フォームの動作のデフォルトでは “GET” メソッドでフォームが送信される。

&lt;form method="POST"> ... </form>

# enctype=”multipart/form-data”

ファイルアップロードを行う際には enctype=”multipart/form-data” の指定が必要である。

&lt;form method="POST" enctype="multipart/form-data"> ... &lt;/form>

## (参考)

enctype=”multipart/form-data” の指定があるとリクエストヘッダの Content-Type が “multipart/form-data; boundary=—-…..” などとなり、通常のフォームの場合と異なる。フォームデータはコントロールごとに boundary 文字列により分けられる。
input タグなどには name 属性が必要

# input, textarea, select, hidden などホストへ送りたいデータを含む HTML エレメントには name 属性を必ずつける。

サーバへは name 属性と value 属性の内容が送信されるため、name の指定が必要である。(id ではダメ)

&lt;input type="text" name="occupation" ... >

なお、JavaScript を使って自分で送信データを構築する場合は必須ではない。

# フォームを送信するボタンの type 属性を指定する

input タグで type 属性の指定がないと type=”button” になるようです。一方、button タグでは type 属性の指定がないと type=”submit” になるようです。そのため、type 指定がない場合、意図しない動作を避けるために必ず type 属性を指定すること。

&lt;input type="submit" value="Click">
&lt;button type="button" ...>Click</button>

# JavaScript を使ってフォームを POST する場合は、デフォルトの動作を抑止する。

JavaScript でユーザ入力をチェックしてからフォームを POST したい場合、フォームのデフォルト動作を抑止しないと正しく動作しない場合がある。

## onsubmit=”return false;”

次のように、フォームに onsubmit=”return false;” 属性を設定しておくと、フォームのデフォルト動作を抑止できる。

<form name="form1" class="row" onsubmit="return false;">

## event.preventDefault()

あるいは、JavaScript のハンドラで event.preventDefault() メソッドをコールすることによりフォームのデフォルト動作を抑止することもできる。

form.addEventListener("submit", function(e) {
  e.preventDefault(); // <= これ！
});

# FormData オブジェクトを使ってフォームを POST する場合は、サーバ側が対応しているか確認する。

JavaScript を使ってフォームを POST する場合、フォームを FormData オブジェクトとして Fetch API で送信することもできる。

この場合、FormData の内容は Content-Type=”x-www-form-urlencoded” (普通のフォームデータ) でなく、Content-Type=”multipart/form-data” にエンコードされる。

よって、サーバ側がリクエストヘッダの Content-Type からリクエストボディが multipart/form-data であることを判断できないとエラーになり正しく動作しない。

(正しく動作しない場合、サーバ側でミドルウェアを追加することで解決できる場合もある)

# JSON や XML を Fetch API で POST する場合の注意

JavaScript の Fetch API を使うとフォームデータを JSON や XML 形式で POST することができる。

その際は、サーバ側がこれらのデータ形式のリクエストつまりリクエストヘッダの Content-Type を読み取り、その内容に対して対して正しく動作できないとエラーになる。

また、 Content-Type は必ず application/json や application/xml とすること。

text/json はないが、text/xml は MIME として存在する。text/… は人が読むデータであることを意味し、application/… はシステムが理解・処理するデータであることを意味する。

# BLOB データを POST する場合はエンコードしてはならない

ArrayBuffer のようなバイナリーデータ (BLOB) を Fetch API で POST することが可能である。その際は、これらのデータはそのまま純粋なバイナリーデータとして送信する。
PHP 変数まとめ

## はじめに
変数関連の自分用のまとめ記事です。自分用のまとめなので間違いや自分が完全に理解しているところに関しては省略して書いていることもあります。ご了承お願いします。

## 定数の定義
変数まとめの記事の初っ端から定数の定義について記述します。
```php
const NAME = "keia";
```
定数は基本的に大文字で定数名の先頭に"$"をつけません。


## 変数、定数の型を知る方法
var_dump()を使うことで変数、定数の型を知ることができます。
```php
$name = "keia";
$price = 12500;
$tf = true;

var_dump($name);
var_dump($price);
var_dump($tf);
```
```php
string(4) "keia"
int(12500)
bool(true)
```

## 変数の型指定
変数の前に変換したい型を記述することで型指定が可能になります。
```php
$price = (float)12500;
$tax = (string)1.08;
```
```php
float(12500)
string(3) "1.08"
```


## 終わりに
理解したことでも時が経つと忘れてしまいます。仕方がないことですが、再度勉強するには時間効率が悪すぎます。
忘れた時にぱっと見返せるように追加していきます。
とある社内読書会の取り組み方

# はじめに

この記事は「[さくらインターネット Advent Calendar 2023](https://qiita.com/advent-calendar/2023/sakura)」の17日目の記事となります。
本記事では、さくらインターネットのとある社内読書会の取り組み方の共有を行いたいと思います。

# 読書会の前提条件

- 場所
    - さくらインターネットは[リモート前提の働き方](https://www.sakura.ad.jp/corporate/corp/work-environment/)であり、それぞれ異なる場所での勤務のため、オンラインでの開催となります。
- 頻度
    - 週1回の頻度で開催しています。
- 時間
    - 60分での読書会です。
    - 短すぎず長すぎずという、ちょうどいい時間だと思います。
- 人数
    - 8人で開催しています。
    - ひとりひとり発表する形式の読書会のため、60分の読書会ですと、ひとりあたり6分くらいの持ち時間となります。
- ファシリテーターや発表順
    - ランダムスクリプトで決めています。
- コミュニケーション
    - 出欠や延期のコミュニケーションは Slack です。
    - 読書会自体は Zoom での開催です。

# 読書会の題材や範囲

- 題材
    - 組織やチームワークに関する書籍が題材となっています。
    - 参考までに、これまでに扱った本は以下となります。
        - 『[LeanとDevOpsの科学](https://book.impress.co.jp/books/1118101029)』
        - 『[アジャイルなチームをつくる ふりかえりガイドブック](https://www.shoeisha.co.jp/book/detail/9784798168791)』
- 1回の読書会の読む範囲
    - 60分の読書会ということを踏まえ、時間内で議論しやすい範囲を事前に話し合い、読む範囲を都度決めるものとなります。
    - ページ数や内容の密度で読む範囲は変わります。
    - そのため、1章のみを読む回もあれば、数章を取り扱う回もあります。

# 読書会の事前準備

各位、共同編集できるドキュメントに、事前に以下についてメモを準備してきます。

|名前|わかったこと|わからなかったこと|考察・議論したいこと|備考| 
| --- | --- | --- | --- | --- | 
| Aさん | | | |
| Bさん | | | |
| Cさん | | | |
| ... | | | |

# 読書会の進め方

8人で60分の読書会を、以下のように進めています。

- タイムライン
    - 00 〜 03: アイスブレイク
    - 03 〜 52: 各自6分程の発表（その日の参加人数で時間は調整）
    - 52 〜 60: 次回の範囲の認識合わせ
- 各自の発表
    - 本の内容を読んでいることを前提に、みんなで各自書いてきたメモを読みます。
    - 「わかったこと」はだいたいみんな共通しているのですが...
    - 「わからなかったこと」「考察・議論したいこと」は、それぞれの観点の違いが出るため、議論が盛り上がるものとなります。
    - また、「備考」については、本を読んで連想した別の本の概念などが出たりするため、非常に参考になります。
- ファシリテーター
    - ファシリテーターの方は、発表内容に対して、リアルタイムでメモを取りつつ、他の方の意見を引き出したり、タイムキーパーをしたりします。

# まとめ

この記事では、さくらインターネットのとある読書会の取り組み方について共有しました。
この読書会の方法のいいところとしては、

- 各位の発表の時間が確保されており、みんなで発言できる
- 一言一句精読する会ではないので、議論したいところに重点的に時間を使える
- それぞれの観点の違いを知ることができ、深い学びを得ることができる

にあると思います。
以上、「とある社内読書会の取り組み方」の共有でした。
読書会の一例として、何かしらの参考になれば幸いです。

最後になりますが、さくらインターネットでは現在採用を強化しています。
もし、ご興味があれば、以下のURLを参照いただけるとありがたいです。

https://www.sakura.ad.jp/lp/22engineer/
iTerm2 のおすすめ設定 まとめ

#  同じディレクトリで新しいタブを開く


**Preference > Profiles > General > WorkingDirectory > Reuse previouse sessions's directory** にチェックを入れる

<img width="910" alt="image" src="https://github.com/YumaInaura/YumaInaura/assets/13635059/8ecef806-692f-4021-8d97-6af051074727">

# Option + Command + 左右キーで タブを移動できるようにする

- Settings (Preferenses) > Keys > KeyBindings
- Settings (Preferenses) > Profiles > Keys > KeyMappings

どちらかで Move Tab Right / Move Tab Left を設定する


<img width="779" alt="image" src="https://github.com/YumaInaura/YumaInaura/assets/13635059/adca5d02-8c90-4a7a-bc1f-41834d4cba50">

# option + 左右キー で 単語を移動する

**Settings (Preferenses) > Profiles > Keys > KeyMappings**

- 左への単語移動: Send Escape Sequence に b を設定する
- 右への単語移動: Send Escape Sequence に f を設定する


<img width="1005" alt="image" src="https://github.com/YumaInaura/YumaInaura/assets/13635059/42abe2fa-7710-47a8-8e5b-8fbf5063d86d">

# 表示行数を無制限にする

**Settings (Preferenses) > Profiles > Terminal > Unlimited scrollback** にチェックを入れる

<img width="929" alt="image" src="https://github.com/YumaInaura/YumaInaura/assets/13635059/7b895aca-998d-437e-b8ab-8d39956038d9">


# Mac のポップアップ通知を無効にする

Macの通知設定を変えれば良い

<img width="712" alt="image" src="https://github.com/YumaInaura/YumaInaura/assets/13635059/20271ba8-4520-427a-8de5-420fb814eece">


# Command+クリックで開くアプリを変更する


Macの設定と連動しているので、Macのファイルを開くための関連付けを変えれば良いようだ


![image](https://github.com/YumaInaura/YumaInaura/assets/13635059/381385e6-a4f9-4999-b3d8-9de481b92314)
![image](https://github.com/YumaInaura/YumaInaura/assets/13635059/5d30d650-9a20-44eb-9cfc-58ccdb8fec8c)

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# Twitter

https://twitter.com/YumaInaura
自衛官からエンジニアへ Elixirから始める Web開発 Part17

この記事は「Elixir Advent Calendar 2023」17日目の記事です
東京にいるけどfukuokaexのYOSUKEです。

普段は 合同会社TheWaggle で教材開発・システム開発・研修講師などマルチに活動してます。

このシリーズでは、文系ですらない、体育会系でも始められるプログラミング学習　というテーマで元自衛官だった僕が
自衛官からエンジニアになってもらいたいという気持ちを込めて、普段は大人しいですが、このコラムシリーズでは、あえて、体育会系のノリで、貴様ら理屈で覚えるなら体で覚えろ！というノリで書いてみたいと思います。

なので、初学者向けですが、理論は後回し、まずは動かして体感しろってノリの第17回目です。

それでは、いくぞ！

## 貴様らには文字列操作をしてもらおう

```elixir
defmodule TNT do
    def create_c4({"RDX", rdx},{"ポリイソブチレン", polyisobutylene},{"モーターオイル", motorOil},{"セバシン酸ジオクチル", dioctylSebacate},{"ガソリン", gasoline}) do
        [
            rdx,
            polyisobutylene,
            motorOil,
            dioctylSebacate,
            gasoline,
        ]
    end
end
```


貴様ら、前回は引数でパターンマッチして、取得した数値は文字列のままだ、これをきちんと利用できるように文字で受け取ったデータを重量を表す部品を取り除き数値に変換する手順を考えて作成していくアイデアを考えろ、いいな！
もちろん、どんな便利な道具があるかリファレンスを色々と物色しながらでいいぞ！

* はい！
* できました！

よーし、貴様らが考えたアイデアを見せてみろ。

* はい、まずは、文字列を分解して、最後の文字を一つ削除して、また文字に戻して最後に数字へ変換しました。

```elixir
"45.5g" |> String.codepoints() |> List.delete_at(-1) |> List.to_string() |> String.to_float()
```
* 次に`"25ml"`と最後の文字１つだけでなく２つ削除することが必要なものもあるので、以下のようにしました。
```elixir
"25ml" |> String.codepoints() |> List.delete_at(-1) |> List.delete_at(-1) |> List.to_string() |> String.to_integer()
```
* これで、`g`と`ml`の作業を分ける必要があるので次に以下のようにして分割しました。

```elixir
["45.5g", "10.5g", "0.8g", "2.65g", "25ml"]
|> Enum.split(-1)
{["45.5g", "10.5g", "0.8g", "2.65g"], ["25ml"]}
```
* これらをこのように組み合わせてこうなりました！

```elixir
defmodule TNT do
    def create_c4({"RDX", rdx},{"ポリイソブチレン", polyisobutylene},{"モーターオイル", motorOil},{"セバシン酸ジオクチル", dioctylSebacate},{"ガソリン", gasoline}) do
        { g , ml } =
        [ rdx, polyisobutylene, motorOil, dioctylSebacate, gasoline ]
        |> Enum.split(-1)

        g_results = 
        Enum.map(g, &(String.codepoints(&1) |> List.delete_at(-1) |> List.to_string() |> String.to_float()))

        ml_result = "25ml" |> String.codepoints() |> List.delete_at(-1) |> List.delete_at(-1) |> List.to_string() |> String.to_integer()
        
        g_results ++ [ml_result]
    end
end
```
* 実行すると以下のようになります！

```elixir
TNT.create_c4({"RDX", "45.5g"}, {"ポリイソブチレン", "10.5g"}, {"モーターオイル", "0.8g"}, {"セバシン酸ジオクチル", "2.65g"},{"ガソリン", "25ml"})
[45.5, 10.5, 0.8, 2.65, 25]
```
よーし、初めてにしては上出来だ！
まずは、貴様らは実行できる所まで、やれれば良い！　ちまたでは、やれ綺麗なコードがとか、冗長性がとか、コードの書き方でマウントする輩が多いが、そんな声には惑わされるな！

汚くても、貴様らが今日書いたクソみたいなコードでも実行できればまずは十分だ！　
いいか、貴様らはまずは任務の遂行を優先しろ！ 綺麗なコードを書く練習は怠るな！　ただし、それは任務達成してからじっくりやれば良い！あとは自己練習だ！

毎日訓練中に2時間走ってるが、それに加えて優秀な奴は早起きして毎朝鍛錬を自らしてるだろう。それと同じだ。

貴様らが、稼業外も自己鍛錬するのは、貴様らはプロの戦闘集団だからだろう。プロとアマチュアの違いは、考え方だ。
自分の仕事を全うし完遂するために自分で日々鍛錬するのはプロとして当たり前の心構えだ。

わかったな！

* はい、

よーし、わかれば良い、では貴様らが書いたクソコードを次回以降で少しづつ改善していこう。

なぜ、このクソコードが生まれたか、それは知識不足だ。貴様らにはまだまだ教えることが腐るほどある。
しかし、教わるばかりだと追いつかない。

貴様らも、自己学習に励め！

では、今日はここまで、それでは次回 Part18でまた会おう！
知っていますか？Pandasをノーコーディングで高速化（CPU環境でも）できるらしい… FireDucks🔥🐦

# <font color=royalblue> はじめに </font>
Pandasで大量データを扱って処理時間にイライラしたことはないでしょうか？
なんと、Pandasを<font color=darkred>従来のコードを変えずに高速化する</font>ライブラリィが出たみたいです。
NEC研究所が出した`FireDucks` 🔥🐦  というライブラリィで、ベータ版が無償公開されています。
しかも <font color=darkred>CPU環境でも高速化</font>されるみたいです。詳細は下記のサイトを参照してください。

https://fireducks-dev.github.io/ja/

&nbsp;
<font color=darkgreen>ベーター版ですが無償とは素晴らしいですね！</font>　　
&nbsp;
早速検証してみましょう。

# <font color=royalblue> 環境 </font>
`FireDucks`の利用方法には、「インポートフック」、「明示的なインポート」の２種類があります。
「インポートフック」の場合は、pythonの起動時にオプションを指定することでコードの書き換えなしに動かすことができます。一方、「明示的なインポート」の場合は、import文に`fireducks`を明示的に指定します。

``` python:インポートフック
python3 -m fireducks.imhook your_script.py
```

``` python:明示的なインポート
# import pandas as pd
import fireducks.pandas as pd
```

今回、Googleコラボで検証するため、「明示的なインポート」を使用します。

# <font color=royalblue> 簡単な検証 </font>
定番の [tatanicデータ](https://raw.githubusercontent.com/pandas-dev/pandas/master/doc/data/titanic.csv) を使って検証してみます。
groupby()メソッドでの効果を測定(してみますが、データ量が少ないので1万回ループして計測して見ます。
動作環境はGoogleコラボ上で、効果の違いが出そうな`cpu`リソースを使います。

## <font color=green>通常のPandas環境 </font>

``` python
import pandas as pd
import time

# Githubに公開されているデータを直接読み込む
url = 'https://raw.githubusercontent.com/pandas-dev/pandas/master/doc/data/titanic.csv'
titanic = pd.read_csv(url)

start = time.time()

for i in range(10000):
    titanic.groupby(["Sex", "Pclass"])["Fare"].mean()

elaps = time.time() - start
print(elaps)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1413278/d3da3712-369f-5b97-768d-4d420a0b9cf8.png)

おおよそ`9.5秒`でした。

## <font color=green>FireDucks環境 </font>

+  `fireducks`　のインストールを行います

``` python
!pip install fireducks
```

+ FireDucksでの処理時間の検証

``` python
import fireducks.pandas as pd2
url = 'https://raw.githubusercontent.com/pandas-dev/pandas/master/doc/data/titanic.csv'
titanic2 = pd2.read_csv(url)

import time

start = time.time()

for i in range(10000):
    titanic2.groupby(["Sex", "Pclass"])["Fare"].mean()

elaps = time.time() - start
print(elaps)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1413278/e72a6f61-8d54-a9bb-0ed6-f94f919dfb3a.png)

約3.4秒で <font color=darkred>おおよそ３倍</font> もの高速化がされています。
<font color=darkred>これはすごい！。</font>

大量データを扱う場合にはかなり効果が発揮されそうです。

#  <font color=royalblue> おわりに </font>
無償かつコードの変更なしに手軽るに使えるとなれば、使わない手はないと思います。
[公式ホームページ](https://fireducks-dev.github.io/ja/)によると、全てのpandasのメソッドが高速化されている訳ではなく、順次対応メソッドを増やしていくとのことみたいです（FireDucksに対応されていないメソッドは、内部で通常のpandasのメソッドを呼び出しているので、使えないわけではなく高速化されないだけみたいです）。
&nbsp;
今後とも応援していきたいですね（今後とも無償での継続提供を期待しています!）。

&nbsp;
## <font color=gray>[補足] </font>
<font color=gray>Pandasをはじめ、Pythonやmatplotlib等のチュートリアルをオンラインで自己学習できるコンテンツを公開しています。よろしかったらこちらもご参照ください。</font>

https://qiita.com/DeepTama/items/25eccdf154988b93a570
expoのプロジェクト作成まで

>メモ：手順のみ残す！
expoについての説明はこれがわかりやすい

https://zenn.dev/username/articles/2021-12-25-9b543d55e9ff81afff09

# 下準備
■node.jsのインストール/バージョン確認
node --version
->v20.10.0

■expoのアカウント作成
expo公式サイト：

https://expo.dev/

# プロジェクト作成

■フォルダ作る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676445/7ef53397-3b29-7ccc-151e-64adcf39b26a.png)


■expoのインストール
npm install expo-cli --global

■プロジェクト作成
expo init プロジェクト名
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676445/740fe05d-019f-ba48-36ea-4c36b6f0b13e.png)

blankを選択

■expoログイン
expo login

usernameとpasswordの入力

# サーバの起動と停止

■サーバ起動
expo start
※プロジェクトフォルダに移動してからコマンド操作

■接続終了
stopped server(Ctrl+C)
【Elixirテストの効率化】スタブをMimicで簡単に実装する

この記事は [Elixir Advent Calendar 2023 シリーズ2](https://qiita.com/advent-calendar/2023/elixir) 20日目の記事です。

# TL;DR

Elixir のテストで爆速にスタブを書きたかったら、Hex のライブラリ __[Mimic](https://hex.pm/packages/mimic)__ を使うとよいです。

- GitHub https://github.com/edgurgel/mimic

# 概要

テストはソフトウェア開発において重要な役割を果たしますが、外部依存関係や API の呼び出しによって複雑化することがあったりします。
Elixir のエコシステムでは、これらの課題を解決する選択肢の1つに __Mimic__ というライブラリがあります。

この記事では、Mimic を使用して Elixir のテストでスタブを簡単に実装する方法を紹介します。

## Mimic とは？

Mimic は、__Elixir のテスト実行中に外部モジュールの関数呼び出しをオーバーライドする__ ためのライブラリです。
Mimic を使用すると、テスト中に特定の関数が返すべき値を簡単に制御できるようになります。これにより、外部APIの呼び出しやその他の外部依存関係をスタブすることが可能になります。

なお、Mimic の作者 [edgurgel](https://github.com/edgurgel) さんは、他にも [HTTPoison](https://github.com/edgurgel/httpoison) などの各種 Elixir ライブラリを開発されてる方です。

## 実行環境

- Elixir 1.15.7 (compiled with Erlang/OTP 26)
- Phoenix v1.7

# セットアップ

Mimicをプロジェクトに追加するには、mix.exs に以下の依存関係を追加し、`mix deps.get` を実行して依存関係をインストールします。

```elixir:mix.exs
  defp deps do
    [
      ... ,
      {:mimic, "~> 1.7", only: :test}
    ]
  end
```

今回の使用例では [Timex](https://hex.pm/packages/timex) を test_helper.exs に追記してスタブできるようにします。
（別途 Timex ライブラリの追加 → `mix deps.get` も必要）

```elixir:test/test_helper.exs
Mimic.copy(Timex)  # <- add

ExUnit.start()
```

# スタブの実装

Mimic を使用したスタブの実装例として、`Timex.now` 関数のふるまいをスタブ化する手順を示します。

サンプルコードは、__現在の日時__ を取得し`YYYY-MM-DD`形式の文字列にして返すメソッドです。

```elixir:lib/sample_app/datetime_processor.ex
defmodule SampleApp.DatetimeProcessor do
  @spec get_current_date_string() :: String.t()
  def get_current_date_string() do
    Timex.format!(get_current_datetime(), "{YYYY}-{0M}-{0D}")
  end

  defp get_current_datetime() do
    Timex.now("Asia/Tokyo")
  end
end
```

これに対するテストを書きたいとします。

```elixir:test/sample_app/datetime_processor/get_current_date_string_test.exs
defmodule SampleApp.DatetimeProcessor.GetCurrentDateStringTest do
  use ExUnit.Case
  use Mimic

  test "Get current datetime and return the YYYY-MM-DD formatted date string." do
    stub(
      Timex,
      :now,
      fn "Asia/Tokyo" -> DateTime.from_naive!(~N[2024-01-01 12:00:00], "Asia/Tokyo") end
    )

    assert SampleApp.DatetimeProcessor.get_current_date_string() == "2024-01-01"
  end
end
```

ここでは、`Mimic.stub` によって `Timex.now` が `"Asia/Tokyo"` タイムゾーンで呼ばれた際に固定の日時を返すよう設定しています。

たったのこれだけで、テストがその関数の実際の実行に依存することなく、任意の結果を返すことができるようになります。

# おわりに

Mimic は、外部依存関係のあるテストを書く際の複雑さを減らすための強力なツールです。
中長期的な観点を踏まえれば [Mox](https://hexdocs.pm/mox/Mox.html) が技術選択肢に上がってきますが、規模の小さいプロダクトや検証段階において初速を出してまず動くものを作りたいようなケースでは Mimic はとても有用です。

`Mimic.reject` みたいな便利なメソッドも揃っているし、Mimic、何より名前がよいので(大事)、Elixir プロジェクトのテスト戦略に Mimic の活用をぜひ検討してみてください。
CI/CD に入門しました

# CI/CD に入門しました

# はじめに

docker かなり初心者。AWS に Docker を利用してデプロイする方法の備忘録。
AWS は SSA を持っているけど実務経験なし、GithubActions は何も知らない。

# 問題

GitActions を使って Github に push されたのをトリガーにビルド・テストしデプロイする
CI/CD の基本をイメージできるようにする

# 基本的な流れ

- デプロイ資材
  - Docker を使って環境とデプロイ資材を用意する
  - DockerFile を用意する
    - 環境設定
      - 設定ファイルのコピー
      - 環境変数の設定
    - ビルドの設定
    - デプロイ資材の作成
- CI/CD
  - GithubActions
    - トリガーの設定
    - タスクの設定
      - イメージの作成（docker コマンド）
      - ECR(AWS) へプッシュする
      - Task Difinition のイメージ ID を差し替える
      - デプロイする
- デプロイ先
  - ECS(AWS)
    - Task Definition
      - Task を構成するコンテナの定義
      - サーバーのスペック・権限の設定
    - Cluster
      - 基本的にはただの箱、基盤として作成する
    - Service
      - 実行している Task の管理
      - Task に障害発生したら Task を再起動するとか
    - Task
      - Task Difinition に従って作成されるコンテナ
      - Task 内は複数コンテナも可能
      - アプリケーションの実行単位

# おわりに

CI/CD で必要なことがイメージでき始めた。デプロイ部分のイメージがまだできていないので次は Kubernetes の勉強をする。
Docker のコマンドなんて結局使わないじゃんとか思っていたけど、CI/CD と組み合わせると普通に使う。

# 参考

- [ECS(Amazon Elastic Container Service)とは](https://envader.plus/article/180)
- [今さら聞けない AWS ECS とは？Fargate とは？](https://qiita.com/K5K/items/0d8dbdb39fbb0375e2bd)
PHP 計算

## はじめに
PHPの勉強を進めています。勉強した内容のまとめです。
自分用のまとめなので間違いや自分が完全に理解しているところに関しては省略して書いていることもあります。ご了承お願いします。

## 今回の記事
今回は数値の計算の勉強をした時に「へー、こんなのもあるんだ」と思ったものを書きます。
基礎の四則演算は飛ばします。

## へー、こんなのもあるんだ
```php
echo 10 ** 3 . PHP_EOL;//アスタリスクを２つ付けることで累乗で計算することが可能になります
echo 10 + '5' . PHP_EOL; //数字と文字列の数字で計算しても計算できます。
echo '10' + 5 . PHP_EOL; //先頭が文字列の数字でも計算できます。
```
```
1000
15
15
```

## 終わりに
四則演算くらいは知っていたのですが、累乗は初めて知りました。覚えていて損はないかもしれませんね。
【AWS】Route 53

# Route 53とは
AWSが提供しているDNSサービス

:::note info
**DNS(Domain Name System)**
IPアドレスとドメイン名の対応を管理する仕組み。IPアドレス(数字とカンマの羅列)をドメイン名(文字列)に置き換える。
:::

# ホストゾーン
Route 53は**権威DNSサーバー**としての役割りを持つ。

:::note info
**権威DNSサーバー**
ゾーンの情報を持ち，各システムやサーバからの問い合わせに応じて管理するゾーンの情報を返却するサーバ
:::

ユーザはドメインごとにホストゾーン(DNSレコードを管理するコンテナ)を作成し，AWS内のリソースとドメイン名の紐づけをする。

ホストゾーンは**パブリックホストゾーン**(インターネットでどうやってトラフィックをルーティングするかを指定)と**プライベートホストゾーン**(VPC内でのルーティングを指定)

# Route 53のルーティング機能
名前解決をする際に最も高速なレスポンスを返せるよう，応答の挙動を制御する方式を**ルーティングポリシー**という。

## シンプルルーティング
1つのリクエストに対して1つの値を返す。

## 加重ルーティング
1つのドメインに対して複数のルーティング先を用意し，ルーティングされる割合をあらかじめ決めておく。

## レイテンシルーティング
1つのドメインに対して複数のルーティング先を用意，より少ない往復時間で最良のレイテンシーを実現するリージョンにトラフィックをルーティング。
つまり早く接続できるリージョンにルーティングする。

:::note info
**レイテンシ**
転送要求を出してから実際にデータが送られてくるまでに生じる、通信の遅延時間のこと
:::

# ヘルスチェック
ルーティング先に対してヘルスチェックが可能。1つ目のルーティング先で障害発生した場合は，自動的に2つ目のルーティング先へフェイルオーバーすることができる。これにより可用性を向上できる。

:::note info
**フェイルオーバー**
稼働中のシステムで問題が生じてシステムやサーバーが停止してしまった際に、自動的に待機システムに切り替える仕組み
:::

# Route 53 Resolver
VPC内で標準に備わっているDNSサーバ。フォワードするドメインのルールとDNSサーバの対応づけを**インバウンド・アウトバウンドエンドポイント**として名前解決を行う。
なお，VPC外からの直接的な名前解決要求は受け付けない。

# 参照
https://www.idcf.jp/words/latency.html
https://www.idcf.jp/words/failover.html
AWSの基本・仕組み・重要用語が全部わかる教科書
p5.jsでじゃんけんゲームを作った話

本記事は、[めんどい太郎の Advent Calendar 2023](https://qiita.com/advent-calendar/2023/mendoitarou_first_calendar) 20日目の記事です。

# はじめに

この記事は初心者が書いています。

今回はp5.jsで無理やり実装なじゃんけんゲームを作成しましたのでご紹介します。

# p5.jsとは

まずそもそもp5.jsとはなにかです。

p5.jsというのはJavaのProcessingというライブラリをJavaScriptでも使えるようにするというライブラリです。

私はこのライブラリを使うと簡単にグラフィックが扱えると考えています。

p5.jsについては完全なにわかです。ほぼ理解していません。

# じゃんけんゲーム

それでは早速じゃんけんゲームをご紹介します。

まぁとりあえず、実際にプレイしてみてください。

https://editor.p5js.org/mendoitarou/full/vKbOlREWg

はい。ただじゃんけんするだけです。

それではクソゲーポイント。

## クソゲーポイント

### 疑似乱数をそのまま使っている

プログラミング言語のランダム関数は大抵疑似乱数です。

このプログラムではじゃんけんで何を出すかを``Math.random()``関数で決めています。

> Math.random() 関数は、 0 以上 1 未満 (0 は含むが、 1 は含まない) の範囲で浮動小数点の擬似乱数を返します。
> mdn web docs

ということで、ドキュメントにもばっちり疑似乱数と書かれています。

そのため実際にプレイしていると気づくと思いますが出す手に偏りがあります。

まぁしょうがない。

### スマホ非対応

この記事をスマートフォンで見ていた方、すみませんでした。このゲームはスマホ非対応です。

というか元々このゲームはPCでのみプレイされる予定でしたのでわざわざ対応させる必要がありません。

### 手が絵文字

手は絵文字を用いているので端末によっては正しく表示されないです。

フォントにもよりますし。

### テキストがてきとう

テキストがてきとうすぎます。

負けたときには「**お前の**負け」なんて表示されます。

口が悪い。

### 無理やり実装

そうです。このゲームは無理やり実装でできています。

1年以上前に3日ほどで無理やり完成させたこのゲーム、無理やり実装なため今どんなふうに書かれているのか解析するのは非常に面倒です。

いわゆるクソコードの嵐。

もう何がなんだかわかりません。

p5.jsには便利なライブラリであるp5.playというものが存在するのですが当時の私は存在すら知らなかったので無理やり実装で構築されています。

ひどいところを一つ見てみましょう。

```JavaScript
function draw() {
  if(s == "ope") {
    // オープニング描写
    background('#4169e1');
    textSize(100);
    textAlign(CENTER);
    text('じゃんけん', 600, 200);
    textSize(50);
    text('Please Press Enter Key', 600, 500);
    // キー入力判定(スタート)
    if(keyIsDown(ENTER)) {
      start();
    }
  }
  if(s == "start") {
    // 開始処理
  }
}
```

ここでひどいポイントがいくつかあります。

まずテキストの表示位置が固定です。

そう。解像度が変わるとレイアウトが崩れたり、画面外だったりします。

さらに、``draw()``内にて``keyIsDown``でキー入力を受け付けています。

そのせいか画面がチカチカします。

目に悪いです。

## そもそも
そもそもじゃんけんゲームなんてのはプログラムのデモとかで作られそうなゲームです。

遊んだって別に楽しくありません。

出す手に偏りがあればなおさら。

# 終わりに
今回は、p5.jsでじゃんけんゲームを作ったよという話でした。

部活の活動の一つで作ったのですが、他の方のゲームのクオリティが高くなんとも言えない気持ちになったことを覚えています。

ゲームは遊ぶ側も作る側もセンスが大事ですね...

私は遊ぶのも作るのも下手なので...
二宮和也さんのホームページを見てみる

# 事のはじまり

妹「二宮くんのホームページがオープンしたの！」
妹「でも画像とかがなかなか見れないの」
妹「ホームページのプロでしょ？ちょっとどうなってるか見てみて！」
僕「えーーー？！」

というわけで部外者が見れる範囲で見ていきます。

# ドメイン

```
office-nino.co.jp
```

いいドメインですね。電話口やラジオ番組などでも伝えやすいでしょう。


# サーバー

nslookupで調べたところ、某serverさんをお使いのようです。
さすがに知名度的に二宮和也さんのホームページだと、CDNを挟んだりした方がいいかもしれません。

# CMS周り

WordPressをお使いです。
管理ログインページはデフォルトの場所から移動済みのようです。
OGPの設定がされていないようなので、設定したほうがSNSでシェアしたときなどに映えると思います。

# ついでにメール周り

SPF：設定されていました
DKIM：セレクターがわからないので不明
DMARC：未設定

現時点ではSPFが設定されているので特に問題はないでしょう。

# おわりに

二宮さんホームページ開設おめでとうございます。
(勝手にあれこれ確認してごめんなさい)

※ 情報は2023年12月17日現在のものです。
ベイビーステップで学ぶマップリストの値の操作⑥ -Enum.intoの紹介

こんにちは！
プログラミング未経験文系出身、Elixirの国に迷い込んだ？！見習いアルケミストのaliceと申します。
今回はマップリストの要素を検索する方法を学びましたのでまとめます。

# 目次
1.[Ectoスキーマからパターンマッチを使用してパラメータを取り出す](https://qiita.com/Alicesky2127/items/480816252525e9ae45ed)
2.[Ectoスキーマからパラメータを取り出して更新する(iex内のみ)](https://qiita.com/Alicesky2127/items/13a3edbf441256054a3b)
3.[Enum.mapの紹介](https://qiita.com/Alicesky2127/items/34c751267a254522bae6)
4.[Enum.filterの紹介](https://qiita.com/Alicesky2127/items/a9069ee013c3b1603920)
5.[String.contains?の紹介](https://qiita.com/Alicesky2127/items/ca81efcf8cca6907364a)
6.Enum.intoの紹介(本記事)
7.[Map.putの紹介](https://qiita.com/Alicesky2127/items/4700d913c6df3b81a1a5)
8.[(番外編)元データがマップ→リスト→マップのもう一段深い入れ子構造だったらどうするか？(Map.getの紹介)](https://qiita.com/Alicesky2127/items/23c8d9ed8d47c22fd6aa)


# 目的
リストの要素がマップ(あるいはその逆)になっている場合に値を取り出して操作できるようになりたい。

## 実行環境
Windows 11 ＋ WSL2 ＋ Ubuntu 22.04
Elixir v1.14.3
Erlang v26.0.2
Phoenix v1.7.10

# 今回やりたいこと
前回、Enum.filter+String.contains?で要素を一つずつ取り出して検索条件に合ったものだけ取り出す方法を学んだので、検索条件にヒットしたnameの値`"piyopiyo"`を`"piyopiyo_updated"`に更新したい。

しかし、「タプル各の要素はメモリ上に隣接して格納されます。このため、タプルの長さを得るのは高速ですが、修正を行うのは高コストとなります」[^0]ということなので、まずタプルをマップの形に変換しようと思います。

```diff_elixir:iex
result = 
  users
  |> Enum.map(&{&1.id, &1.name})
  |> Enum.filter(fn {_id, name} -> String.contains?(name, "piyopiyo") end)
[{5, "piyopiyo"}]
```

# Enum.intoとは
第一引数を第二引数のデータ構造に挿入します。
今回は第一引数のリストを第二引数のマップのデータ構造にして出力します。

https://hexdocs.pm/elixir/1.12/Enum.html#into/2


```diff_elixir:iex
result |> Enum.into(%{})
%{5 => "piyopiyo"}
```
リストがマップの形になりました(^▽^)/

## (余談)複数の要素をもつリスト
複数の要素をもつリストでも同様のことができます。
```diff_elixir:iex
[{1, "hogehoge"}, {5, "piyopiyo"}, {4, "hogefuga"}] |> Enum.into(%{})
%{1 => "hogehoge", 4 => "hogefuga", 5 => "piyopiyo"}
```

## (途中経過)元データからここまでをパイプでつなげる
```diff_elixir:iex
result = 
  users
  |> Enum.map(&{&1.id, &1.name})
  |> Enum.filter(fn {_id, name} -> String.contains?(name, "piyopiyo") end)
  |> Enum.into(%{})
%{5 => "piyopiyo"}  
```

# ～Elixirの国のご案内～
↓Elixirって何ぞや？と思ったらこちらもどぞ。Elixirは先端のアレコレをだいたい全部できちゃいます:laughing::sparkles::sparkles:

https://qiita.com/piacerex/items/09876caa1e17169ec5e1

↓ゼロからElixirを始めるなら「エリクサーチ」がおすすめ！私もエンジニア未経験から学習中です。

https://elixir-lang.info/topics/entry_column


↓[We Are The Alchemists, my friends!:bouquet:](https://qiita.com/torifukukaiou/items/6bcd5bbb80df9e594e9e "Awesome-san's Awesome article")[^10]
Elixirコミュニティは本当に優しくて温かい人たちばかり！
私が挫折せずにいられるのもこの恵まれた環境のおかげです。
まずは気軽にコミュニティを訪れてみてください。[^11]


https://speakerdeck.com/elijo/elixirkomiyunitei-falsebu-kifang-guo-nei-onrainbian


[^0]:https://elixirschool.com/ja/lessons/basics/collections#%E3%82%BF%E3%83%97%E3%83%AB-4

[^10]: @torifukukaiouさんのAwesomeな名言をお借りしました。Elixirコミュニティを一言で表すと、これに尽きます。


[^11]: @kn339264さんの素敵なスライドをお借りしました。Elixirコミュニティはいろんな形で活動中！
共感ベースのコミュニケーション～HAI Conference2023の論文を読み解く～

こんにちは。この記事は[ARISE analytics Advent Calender 2023](https://qiita.com/advent-calendar/2023/ariseanalytics) 20日目の記事です。
この記事では、先日行われた[HAI Conference 2023](https://hai-conference.net/hai2023/)で発表された論文についてご紹介します。

# はじめに

私は人とAIのコミュニケーションについて関心を持っており、以前も「[LLM時代に人は対話AIを信頼できるか？Human Agent Interaction (HAI) の視点から考える](https://www.ariseanalytics.com/activities/report/20230920-2/)」という記事を書いたりしています。
この記事でも扱っている通り、人が信頼を獲得するうえで、AIに対する人の共感というのは重要な要因の一つとなります。
この「共感」という点に関しては、先日行われたHAI分野の国際会議である[HAI Conference 2023](https://hai-conference.net/hai2023/)において「Session 8: Trust & Empathy in Human-Agent Interaction」というセッションが設けられるなど、「共感」の重要さが分かると思います。
このセッションの中で、特に興味のある論文がありましたのでご紹介します。

# 論文紹介

## 論文概要

【論文】
[Empathy-Based communication Framework for Chatbots: A Mental Health Chatbot Application and Evaluation](https://dl.acm.org/doi/10.1145/3623809.3623865)

【概要】
こちらの論文は中国の研究者が発表した論文となっており、中国語でのチャットボットにおける共感ベースのコミュニケーションフレームワークに関する検証とその評価についての内容となっています。
ポジティブ心理学という観点に基づいたチャットボットを利用することで、ユーザの幸福感を向上させ、ユーザが理解されていると感じられるようになったと記載されています。

## 仕組み

### フロー

共感コミュニケーションについて、著者は先行研究を元に図のCommunication flowのような手順を構築しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542065/b8672b83-bc41-0cae-e3bd-0a6aa9cccaa5.png)
構築されたシステムフロー (論文のFigure 2より引用)

最初の数回のオープンな対話を通じて、ユーザの感情・その原因・認知の歪みの状態を認識します。次にユーザの感情がモデルによって認識された感情と同じかを質問することで確認します。3番目に共感モデルがユーザの話題や状態に基づいて応答を生成し、最後にユーザの状態に基づいてポジティブ心理学のコンテンツをユーザに提示し、活用を促します。

### 使用技術

フローは主に自然言語理解 (NLU) と自然言語生成 (NLG) に分けることができます。NLUタスクは感情認識、感情の理由抽出、認知の歪み特定、感情的なイベントが関与しているかの判断が含まれ、NLGタスクは共感応答生成と肯定的応答生成が含まれます。

NLUタスクをこなすための実装は図の通りとなっています。主に中国語の事前学習済みモデルの RoBERTa-wwm-ext-largeが利用されています。RoBERTaはBERTの改良版である24層のTransformerエンコーダ構造を使用したもので、これを中国語に最適化しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542065/19cf0539-50b1-c1b1-4bc0-9872f3716957.png)
NLUタスクフロー (論文のFigure 4より引用)

NLGタスクをこなす実装では、対話生成モデルとしてCDual-GPTを利用しています。これは会話生成に特化した中国の小規模事前学習モデルを採用したものです。

## 実験内容と結果

### 実験内容
実験では、男性14名と女性11名に対してチャットボットを2週間利用してもらって実施しています。仮説として、チャットボット2週間継続的に利用すると、ユーザの幸福と生活満足度が向上するとしていました。継続的に利用してもらうため、毎日5~10分チャットボットを利用してもらっています。

### 結果

結果として、表のとおりチャットボットを2週間で5回以上利用すると充実度と生活満足度が統計的に有意に増加することが確認されています。
また、今後の展望として、被験者を増やして結果を再確認すること、チャットボットの技術的な改良によるよりよいフィードバックをユーザに渡せるようにすることが挙げられていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542065/ee5225f6-9f95-a545-e86a-4e8d650cbab9.png)
チャットボットの利用頻度別充実度と生活満足度のグラフ (論文のFigure 6より引用)

# まとめ

本記事では、最新のAIに対する共感をテーマとした論文を紹介しました。この論文では小規模言語モデルのCDual-GPTが活用されていましたが、これは今後大規模言語モデル (LLM) に置き換わっていくのではないかと考えています。また、この論文ではメンタルヘルスをターゲットとしているように、共感というテーマは実用的なテーマとなっています。このような分野もあると知っていただけると嬉しいです。
【AWS】VPCのアクセス制御

# ルートテーブル
サブネットに関連付けることでサブネット内のリソースの通信経路を設定できる。
ルートテーブルでインターネットゲートウェイまでの通信経路を示すことで，インターネットとの通信が可能なサブネットにできる。

VPCを作成するとメインルートテーブルが自動的に作成される。サブネット間のアクセス・通信制御はカスタムルートテーブルを追加・作成することで行う。

またVPC内の各サブネットは何かしらのルートテーブルに関連づける必要があり，関連づけられていない場合はメインルートテーブルに関連づけられる。複数のサブネットを1つのルートテーブルに紐づけることは可能。

# セキュリティグループ
仮想ファイアウォール機能。EC2やRDSなどのVPC内リソースのトラフィック制御をすることができる。ステートフルに動作する。

:::note info
**トラフィック**
一定時間にネットワークを流れるデータ量
:::

:::note info
**ステートフル**
通信や処理において状態を保持すること
:::

# ネットワークACL
仮想ファイアウォール機能。サブネットに対して通信の設定を行い，受信と送信の両方をサブネットレベルで制御できる。サブネット内の全てのリソースにネットワークACLの通信制御が反映されるので，セキュリティグループよりも広範囲な制御が可能。

# VPCフローログ
VPCのIPトラフィック情報をキャプチャする機能。ログは**Amazon Cloud Watch Logs**やS3に保存でき，ENI(Elastic Newtowk Interface)単位で収集可能。

# GuardDuty
VPCのフローログなどから不正なアクセスを検知するサービス。

# VPCの利用料金
VPCやサブネット，インターネットゲートウェイの構築自体に費用はかからないが，オンプレミスからのインバウンド接続やVPCからのアウトバウンド接続で，データ転送量に応じた従量課金が発生。

# 参考
https://www.arteria-net.com/business/column/traffic_increase/
https://the-simple.jp/what-is-stateful-network-terminology
AWSの基本・仕組み・重要用語が全部わかる教科書
PHP ヒアドキュメント EOL

## はじめに
PHPの勉強を進めています。勉強した内容のまとめです。
自分用のまとめなので間違いや自分が完全に理解しているところに関しては省略して書いていることもあります。ご了承お願いします。


## ヒアドキュメントとは
文字列を扱う方法でテキストの改行などを保持したまま変数に代入や出力が可能になります。
コードを見れば簡単に理解できます。
```php
$text = <<<EOF
    sample
    text
php
EOF;
echo EOF;
```

```
    sample
    text
php
```

ヒアドキュメントは<<<のあとに任意に終末端子と呼ばれるものを指定します。上記の例文だとEOFです。そして終わりも終末端子です。
終末端子内に記述した内容は改行やインデント含め保持されます。

また、終末端子を""(ダブルクオーテーション)で囲む、終末端子のみにすると変数を扱うこともできます。
```php
$name = keia;

$text = <<<EOF
    $name
    sample
    text
php
EOF;
echo EOF;
```

```
    keia
    sample
    text
php
```

## 終わりに
PHPはまとまった文章を扱うことが多いか知らないですが、もしそうだとしたら便利ですよね。
記事を書いていて思うのですが文章にするって難しいですね。他人に見せれるようなもんじゃないです。
ですが、これからも自分用にまとめていきたいと思います。
paiza.ioでelixir その266

# 概要
paiza.ioでelixirやってみた。
with知らなかったのでやってみた。

# 参考にしたページ

https://qiita.com/GeekMasahiro/items/4f55565d69e66e098d5f

# サンプルコード

```

opts = %{width: 10, height: 15}
with {:ok, width} <- Map.fetch(opts, :width), {:ok, height} <- Map.fetch(opts, :height), do: {:ok, width * height}
|> IO.inspect
IO.puts("ok0")

opts = %{width: 10}
with {:ok, width} <- Map.fetch(opts, :width), {:ok, height} <- Map.fetch(opts, :height), do: {:ok, width * height}
|> IO.inspect
IO.puts("ok1")

users = %{"melany" => "guest", "bob" => :admin}
with {:ok, role} when not is_binary(role) <- Map.fetch(users, "bob"), do: {:ok, to_string(role)}
|> IO.inspect
IO.puts("ok2")

opts = %{width: 10, height: 15}
with {:ok, width} <- Map.fetch(opts, :width), double_width = width * 2, {:ok, height} <- Map.fetch(opts, :height), do: {:ok, double_width * height}
|> IO.inspect
IO.puts("ok3")

opts = %{width: 10}
with {:ok, width} <- Map.fetch(opts, :width), {:ok, height} <- Map.fetch(opts, :height) do 
	 {:ok, width * height}
else
 	:error ->
		 {:error, :wrong_data}
end
|> IO.inspect
IO.puts("ok4")



```

# 実行結果

```
{:ok, 150}
ok0
ok1
{:ok, "admin"}
ok2
{:ok, 300}
ok3
{:error, :wrong_data}
ok4




```

# 成果物


https://paiza.io/projects/IXiiWutYvHEOPuT4m0OhSQ


以上。
SymbolDualノードのRestとMongoを外してBrokerの話に耳を傾けてみた

## テストネットのノードを構築

機能を削る方が楽なので、デュアルノードで構築します。

```my-preset.yml
nodes:
  -
    host: XXX HARVESTASYA XXX
    friendlyName: XXX HARVESTASYA XXX
```

IP は教えないぜという意思。
各自、好きなように設定してください。

```bash
symbol-bootstrap config -p testnet -a dual -c my-preset.yml --upgrade
```

```bash
symbol-bootstrap compose --upgrade
```

何回かやるかもしれないので`--upgrade`付き。

## Mongo エクステンションの無効化

**broker**の Mongo エクステンションを無効にします。

```target\nodes\node\broker-config\resources\config-extensions-broker.properties
[extensions]

# addressextraction must be first because mongo and zeromq depend on extracted addresses
extension.addressextraction = true
extension.mongo = false
extension.zeromq = true

extension.hashcache = true
```

## docker compose の変更

node, broker コンテナのみにします。
broker の 7902 ポートをローカルのみに向けて空けてます。

```target\docker\docker-compose.yml
version: '2.4'
services:
    node:
        container_name: node
        image: symbolplatform/symbol-server:gcc-1.0.3.6
        command: /bin/bash /symbol-commands/start.sh /usr/catapult ./data server broker node NORMAL true
        stop_signal: SIGINT
        working_dir: /symbol-workdir
        restart: on-failure:2
        ports:
            - '7900:7900'
        volumes:
            - ../nodes/node:/symbol-workdir:rw
            - ./server:/symbol-commands:ro
        depends_on:
            - broker
        networks:
            default:
                aliases:
                    - XXX HARVESTASYA XXX
        hostname: XXX HARVESTASYA XXX
    broker:
        container_name: broker
        image: symbolplatform/symbol-server:gcc-1.0.3.6
        working_dir: /symbol-workdir
        command: /bin/bash /symbol-commands/start.sh /usr/catapult ./data broker server broker NORMAL
        stop_signal: SIGINT
        restart: on-failure:2
        ports:
            - '127.0.0.1:7902:7902'
        volumes:
            - ../nodes/node:/symbol-workdir:rw
            - ./server:/symbol-commands:ro
networks:
    default:
        ipam:
            config:
                - subnet: 172.20.0.0/24
```

## broker の話に耳を傾ける

2022 年のアドカレにギムレさんが投稿してた話になります。

https://gimre-xymcity.github.io/2022-12-06.zmq.html

上記、記事内の Python コードはこちら。

https://gist.github.com/gimre-xymcity/718cc15d9e9c3ff48a493bcfb7986834

Python、symbol-bootstrap の起動順は、どちらが先でも動作します。
Python が Ctrl+C で止まらない場合は kill してください。

websokect 部分を作り込めば、Peer+なノードが出来る感じデスね。
通知だけほしい場合に使えるかな？
paiza.ioでelixir その265

# 概要
paiza.ioでelixirやってみた。
when知らなかったのでやってみた。

# 参考にしたページ

https://qiita.com/GeekMasahiro/items/412d9b20b3dbd2e6fc3c

#  サンプルコード

```

defmodule Main do
  def test(n) do
    case n do
    1 -> 
        "one"
    _ when n <= 10 -> 
        "two-ten"
    _ -> 
        "over ten"
    end
  end
end


Main.test(5)
|> IO.inspect

Main.test(1)
|> IO.inspect

Main.test(11)
|> IO.inspect

```

# 実行結果

```
"two-ten"
"one"
"over ten"

```

# 成果物

https://paiza.io/projects/xhwrC0-E_N06WRO7-HV2Hg


以上。
Pythonで、supabase の Storage Clientを使用しているときに出力されるログを抑制する

# 結論から言うと
PythonのSupabase Storage Clientは内部でhttpxを使用しているため、そのログレベルを指定する。
```python
import logging
# 好みのログレベルを指定する
logging.getLogger("httpx").setLevel(logging.WARNING)
```

# 事の顛末
ダウンロードの度にINFOが常に表示されると邪魔だった
```
2023-12-17 09:52:23,931:INFO - HTTP Request: GET https://~~~
(本当に確認したい内容)
2023-12-17 09:52:23,931:INFO - HTTP Request: GET https://~~~
2023-12-17 09:52:23,931:INFO - HTTP Request: GET https://~~~
(本当に確認したい内容)
2023-12-17 09:52:23,931:INFO - HTTP Request: GET https://~~~
(本当に確認したい内容)
```
機械学習で株価分析 02.環境構築

# はじめに
本記事では、**Google ColaboratoryでPython実行環境を構築する方法**を紹介します。

# 手順
以下の記事が参考になります。

https://www.teijitaisya.com/googlecolaboratory/

# 目次へのリンク

https://qiita.com/ryo2_9393/items/2b1ada62c2537c901b6b
AUTOSAR Adaptive Platform Demonstrator

AUTOSARが、いつからかAdaptive Platform Demonstratorを非公開にした。

理由はよくわかっていない。

過去に公開された版で、現在でもネットで閲覧できる文書があちこちにある。

一度公開したら、非公開にするのには、相当の理由説明がないと意味がわからない。


<この項は書きかけです。順次追記します。>
This article is not completed. I will add some words in order.

# Open source
Adaptive Platform は、Open Sourceを多く利用し、特にDemonstratorの半分以上はOpen Sourceでできているらしい。

仕方なく、過去に公開された情報を頼りに、Open Sourceの部分を順次記事を書いてみる。

一部記憶違いのものがあるかもしれません。ごめんなさい。

gcc/g++
cmake
linux kernel
google test/gmock
clang++
covesa dlt
covesa some/ip


# 補足資料（Additions）

2023 Countdown Calendar 主催・参加一覧
https://qiita.com/kaizen_nagoya/items/c4c2f08ac97f38d08543

CountDownCalendar月間　いいねをいただいた記事群　views　順
https://qiita.com/kaizen_nagoya/items/583c5cbc225dac23398a

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
This article is an individual impression based on the individual's experience. It has nothing to do with the organization or business to which I currently belong.

# 文書履歴(document history)
ver. 0.01 初稿 　20231217
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
#### Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
ROS 2 コマンドチートシート

## topic
```bash:topic一覧
ros2 topic list
```

```bash:topic出力
ros2 topic echo <topic name>
```

```bash:topic周期
ros2 topic hz <topic name>
```
```bash:topic帯域
ros2 topic bw <topic name>
```

<details>
<summary>Example</summary>

```bash:パラメーター例
ros2 topic list
ros2 topic echo /camera/camera/color/image_raw
ros2 topic hz /camera/camera/color/image_raw
ros2 topic bw /camera/camera/color/image_raw
```
</details>


## ros2 run

```bash:基本
ros2 run <pkg name> <pkg exec>
```
```bash:リマップ(オプション)
--ros-args -r /before:=/after
```

```bash:パラメーター(オプション)
--ros-args -p param_name:=param_value
```
<details>
<summary>Example</summary>

```bash:パラメーター例
ros2 run realsense2_camera realsense2_camera_node --ros-args -p enable_color:=false -r /camera/camera/color/image_raw:=/image_raw
```
</details>

## ros2 launch

```bash:基本
ros2 launch <pkg name> <launch file>
```

```bash:ファイル直
ros2 launch <launch file path>
```

```bash:launchパラメータ(runパラメータとは違う)
param_name:=param
```
<details>
<summary>Example</summary>

```bash:パラメーター例
ros2 launch realsense2_camera rs_launch.py depth_module.profile:=1280x720x30 
```
</details>


## Build
```bash:基本
colcon build
```
```bash:シンボルリンクを貼る(おすすめ)
colcon build --symlink-install
```
```bash:シンボルリンク+リリースビルド
colcon build --symlink-install --cmake-args -DCMAKE_BUILD_TYPE=Release
```
```bash:シンボルリンク+リリースビルド+rustリリースビルド
colcon build --symlink-install --cmake-args -DCMAKE_BUILD_TYPE=Release --cargo-args --release
```
```bash:マージビルド
colcon build --merge-install --cmake-args -DCMAKE_BUILD_TYPE=Release
```
```bash:単一のパッケージのみビルド(依存を考慮する
colcon build --packages-up-to <pkg name>
```

```bash:オプション一覧
--symlink-install
--merge-install
--cmake-args -DCMAKE_BUILD_TYPE=Release
--cmake-args -DCMAKE_BUILD_TYPE=Debug
--packages-up-to
--cargo-args --release
--cargo-args --debug
```

<details>
<summary>Example</summary>

```bash:パラメーター例
colcon build --packages-up-to realsense2_camera
```
</details>

## Buildトラブった時
```bash:src以外消す
rm -rf ./install ./log ./build
```


```bash:rust関連でおかしいときに全てを消す
rm $HOME/.cargo/config.toml
touch $HOME/.cargo/config.toml
rm -rf ./install/ ./log/ ./build/
find ./ -name 'Cargo.lock' -type f -exec rm -rf {} \;
```
機械学習で株価分析 05.銘柄一覧データの取得

# はじめに
本記事では、**TOPIX Core30 の構成銘柄一覧をデータフレーム形式で取得する方法**を紹介します。

# 手順
### 1. TOPIX構成銘柄一覧のダウンロード
[日本取引所グループの公式ホームページ](https://www.jpx.co.jp/markets/indices/topix/#heading_3)（2023/12/17参照）から、TOPIXの構成銘柄の一覧をCSV形式でダウンロードします。ページ中の「構成銘柄別ウエイト一覧」が該当ファイルです。ダウンロードしたファイルは、Google Drive内の任意のフォルダに保存します。

### 2. データフレーム形式で銘柄コード一覧を保存
以下のコードを実行することで、データフレーム形式で銘柄コード一覧を保存・表示できます。なお、csvファイルから銘柄データ一覧を読み込む際には、ご自身で該当ファイルまでのパスを指定してください。


```python
# ライブラリのインポート
import numpy  as np
import pandas as pd
from   pandas_datareader import data
from   IPython.display   import display
from   google.colab      import drive
drive.mount('/content/drive', force_remount=True)

# csvファイルから銘柄データ一覧を読み込み
data_csv = pd.read_csv("/content/drive/MyDrive/"自身のパスを指定"/topixweight_j.csv", encoding="shift-jis")

# topixCore30銘柄を抽出
data_topix30 = data_csv[["銘柄名","コード","ニューインデックス区分"]]
data_topix30 = data_topix30[(data_topix30['ニューインデックス区分'] == "TOPIX Core30")]
data_topix30["コード"] = data_topix30["コード"].astype(str).str[:4]

# 行・列のラベルを編集
data_topix30 = data_topix30.reset_index(drop=True)
data_topix30 = data_topix30.rename(columns={'銘柄名':'name', 'コード':'code', 'ニューインデックス区分':'new_index'})

# 結果を表示
display(data_topix30)
```
プログラムを実行すると、Google Driveへのアクセス許可を求められますので許可します。その後コンソール上に取得したデータが表示されれば成功です。

# 目次へのリンク

https://qiita.com/ryo2_9393/items/2b1ada62c2537c901b6b
AUTOSAR R23-11 雑記帳

AUTOSAR R23-11が公開され、記事を書き始めていろいろな事象に遭遇した。

AUTOSAR側の課題と、自分の記事の課題と。

圧倒的に後者が多い。



<この項は書きかけです。順次追記します。>
This article is not completed. I will add some words in order.


# AUTOSARの課題

過去１年に２度URLを変更した。


# 2023年11月URL変更

2023年11月にもAUTOSAR文書のURLが変更になっている。
/user_upload/standards/classic/21-11/
を
/standards/R21-11/CP/
などに書き換えてください。

/user_upload/standards/adaptive/21-11/
を
/standards/R21-11/AP/

/user_upload/standards/foundation/21-11/
を
/standards/R21-11/FO/

お手数をおかけします。
１年に２度URLを変更するなんて、新しい記事が書ける。とても嬉しい。

# 2023年4月URL変更

この項は2023年4月21日、AUTOSARの文書のURLが変更になった。
/classic/22-11/
が
/R22-11/CP/
過去記事で、URLでエラーが出たら書き換えてみてください。

/adaptive/22-11/
は　
/R22-11/AP/

/foundation/22-11/
は　
/R22-11/FO/
です。

# 20231201
FO, CP, APがPDFのファイル名の前の方につけ加わった。
たとえば、
https://www.autosar.org/fileadmin/standards/23-11/FO/AUTOSAR_FO_TPS_XMLSchemaProductionRules.pdf
区分がわかって嬉しい。R22-11では。
https://www.autosar.org/fileadmin/standards/R22-11/FO/AUTOSAR_TPS_XMLSchemaProductionRules.pdf

R23-11のURLは、R23-11ではなく23−11になっていた。
# 2023120XX
その後、何日か後に訂正されていた。

https://www.autosar.org/fileadmin/standards/23-11/FO/AUTOSAR_FO_TPS_XMLSchemaProductionRules.pdf

なにしてくれちゃうのAUTOSAR

# 自己記事
１　文書のURL間違い。コピペ誤りでありとあらゆる種類あり。人のことは言えない。
２　参考文献欄の更新ができていない。一つ前の年のまま。それはほかの項目でもときどきある。ごめんなさい。
３　一覧のURLが一つ前の番、一つ前の編集していた版など。ごめんなさい。

なにしてくれちゃうの自分。


# 補足資料（Additions）

2023 Countdown Calendar 主催・参加一覧
https://qiita.com/kaizen_nagoya/items/c4c2f08ac97f38d08543

CountDownCalendar月間　いいねをいただいた記事群　views　順
https://qiita.com/kaizen_nagoya/items/583c5cbc225dac23398a

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
This article is an individual impression based on the individual's experience. It has nothing to do with the organization or business to which I currently belong.

# 文書履歴(document history)
ver. 0.01 初稿 　20231217
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
#### Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
みんな大好き！Microsoft Entra ID ライセンス クイズ

:::message
この投稿は [Microsoft Security Advent Calender 2023](https://qiita.com/advent-calendar/2023/microsoft-security) に参加しています！
:::
# はじめに
早いもので 2023 年も終わりですね。クリスマス プレゼントとして？「Microsoft Entra ID ライセンス クイズ」を作成しましたので是非チャレンジしてみてください！

ライセンスに関する問題ですので、普段関わらない方はもちろん、新人からベテラン、技術職から営業職まで楽しめたらと思います。
もともとは 1 つで 20 問でしたが長すぎるというフィードバックも多かったため、2 パートに分けています。😅

# 🥈SILVER
何問正解できるかな？まずは腕試し・・・以下のリンクからチャレンジを！
[![](https://storage.googleapis.com/zenn-user-upload/1637b0143674-20231216.png)
](https://forms.office.com/Pages/ResponsePage.aspx?id=v4j5cvGGr0GRqy180BHbR65WurG_Nr9ImRKL9SbLl_hUQU5FVlo4SU9PSFdKWDhOR041WEVIQ1lJWC4u)

# 🥇GOLD
マニアックな問題も含まれています・・・以下のリンクからチャレンジを！
[![](https://storage.googleapis.com/zenn-user-upload/37d68afe79ff-20231216.png)](
https://forms.office.com/Pages/ResponsePage.aspx?id=v4j5cvGGr0GRqy180BHbR65WurG_Nr9ImRKL9SbLl_hUN0dZMlg5S1RSNVhNMjhDN1FBNUxHT0o1NS4u)

# あとがき
是非ご感想などいただければありがたいです！😉

ちなみに、こちらのクイズは社内向けの勉強用として作成しましたが、社内でも部署・ロールを問わず予想を上回る参加者に楽しんでいただけたことより、外部向けのバージョンを作成しました。

ちなみに、社内でも平均 6 割程度の正解率でしたので結構難しいかなと思います。
MS のライセンスは非常にややこしいですし、変更などもあったりでご迷惑おかけしているかと思います。クイズを通してある程度の考え方の原則みたいなものを掴んでいただき、お役に立てればなと思っております。

最後まで読んでいただきありがとうございました！
【GitHub】ローカルリポジトリの変更を誤ってリモートリポジトリのmainに直接commitしてしまったら

# 今回の課題
間違えてローカルリポジトリの変更をリモートリポジトリのmainに
直接commitしてしまった場合の対処法を記事にしました。

## 対処手順
### 1)`$ git log`を実行
`$ git log`コマンドでコミット履歴を確認して、
取り消したいcommitのハッシュ値をコピーする。
```
commit 123456789abcdef0123456789abcdef01234567　　　　　<-こちらです
Author: John Doe <john.doe@example.com>
Date:   Fri Jan 1 12:34:56 2023 +0100

    誤ってmainにマージしてしまったcommit

commit abcdef0123456789abcdef01234567890123456
Author: Jane Smith <jane.smith@example.com>
Date:   Thu Dec 31 23:45:01 2022 -0500

    誤ってmainにマージしてしまったcommitの前のcommit
```
### 2)`＄ git revert`を実行
上記でコピーしたハッシュ値を、`$ git revert`と合わせて以下のように使う。
```
$ git revert 123456789abcdef0123456789abcdef01234567
```

こんな感じでエディタが表示されるので`:wq`で抜ける。
```
Revert ""

This reverts commit 123456789abcdef0123456789abcdef01234567.

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# On branch test
# Your branch is up to date with 'origin/main'.
#
# Changes to be committed:
#	[変更点(commitを取り消す内容)が表示される]
#
```

以上で間違えてcommitしてしまったものを取り消すことができます！
ちなみに、この後`$ git log`を実行することで、revertした履歴も確認することができます。
```
$ git log

commit 123456789abcdef0123456789abcdef01234567
Author: John Doe <john.doe@example.com>
Date:   Fri Jan 1 12:34:56 2023 +0100

    Revert "誤ってmainにマージしてしまったcommit"

    This reverts commit

commit 123456789abcdef0123456789abcdef01234567
Author: John Doe <john.doe@example.com>
Date:   Fri Jan 1 12:34:56 2023 +0100

    誤ってmainにマージしてしまったcommit

commit abcdef0123456789abcdef01234567890123456
Author: Jane Smith <jane.smith@example.com>
Date:   Thu Dec 31 23:45:01 2022 -0500

    誤ってmainにマージしてしまったcommitの前のcommit
```

以上です！

# まとめ
mainブランチを誤更新してしまったら、上記の方法で対処できます。

リポジトリを作成したら、最初に以下の記事のような設定をして、
mainブランチの誤更新を避けられるように注意するのが大切だなと思いました。

https://dev.classmethod.jp/articles/github-main-branch-protection/
軽深演習 #13 守破離

### 軽深（かるしん　なんちゃって圏論） Advent Calendar 2023 13日目の記事です。

演習形式をとっているので、ぜひ　回答を試みてください。


### 前提知識　守破離
守破離とは、剣道や茶道で、修業上の段階を示したものです。

守破離を図式で表現すると

```mermaid
flowchart LR
A[守]-->B[破]-->C[離]
```

対象が３つ、射が２つの例です。孫子の兵法とも形式的には同じ図式になります。

```mermaid
flowchart LR
A[敵を知り]-->B[己を知れば]-->C[危うからず]
```

ポアンカレの言葉を思い出してください。**数学とは違うものを同じものとみなす技術である** 同じ図式でかけるなら同じとみなすことにしてみましょう。
これだけでは当たり前過ぎて。ちっとも面白くありませんね。面白くしてみましょう。
守破離には、**もっと前**があるという大塚商会の記事があります。それは**型**です。

[第28回 600年前から伝わる『守破離』で人材育成？](https://www.otsuka-shokai.co.jp/erpnavi/topics/column/increase-sales/shuharidejinzaiikusei.html)

```mermaid
flowchart LR
A[型]-->B[守]-->C[破]-->D[離]
```

どの図式にも**もっと前**がありますね。それで、**もっと前**があると考えるとどんないいことがあるのでしょうか？
「守るってなんかよく分かんなかったけど。型を守るってことなんですね。」と理解しやすくなる気はしませんか？　見通しはよくなったとも思えますね。


### 演習　有名な孫氏の兵法の【敵を知り、己を知れば危うからず】の敵を知るのもっと前はなんでしょうか？　守破離のように、「敵を知る」ってこうゆうことなんだというのはあるはずです。
圏論って面白いんじゃないかとなんとなく思えるようになりませんか？
**もっと前**でなく、**一つ前**はなんだっけって。考えるだけでも見通しが良くなりませんか？

**もっと前**を探索するのは、シフトレフトやなぜなぜ分析も同じようなものですね。