OmniAICreator/Qiita-1.07M huggingface dataset:
インスタンスとは？

# はじめに
インスタンスがなんなのか説明できないので備忘録も兼ねてまとめます。
# インスタンスとは？
クラスを元に生成された実体のこと。
簡単に言えば、クラスは設計図であり、その設計図に基づいて作られる実際の物体がインスタンスです。
```ruby
# クラスの定義
class Car
  def initialize(make, model)
    @make = make
    @model = model
  end

  def display_info
    puts "Make: #{@make}, Model: #{@model}"
  end
end

# インスタンスの生成
car_instance = Car.new("Toyota", "Camry")

# インスタンスの利用
car_instance.display_info  # 出力: Make: Toyota, Model: Camry
```
この例では、`Car`クラスが定義され、そのクラスから`Car.new("Toyota", "Camry")`としてインスタンスが生成されています。`initialize`メソッドはインスタンスが生成される際に呼び出され、引数を使ってインスタンス変数 `@make` と `@model` に代入されます。
また、display_infoメソッドはインスタンスの情報を表示するためのメソッドです。

Rubyでは、インスタンス変数は`@`で始まり、そのスコープはクラス内でのみ有効です。インスタンスメソッドはクラス内で定義され、インスタンス変数にアクセスすることができます。

この例を実行すると、`Make: Toyota, Model: Camry`が表示されます。
ChatGPTくんと妄想の世界を冒険する


## 前書き

無料で使えるChatGPT3.5を使ってます。

## 命令

```
シミュレーションゲームをしましょう。
以下に従ってください。

・まずあなたは物語の冒頭を語ってください。
・その後の行動をあなたが提示し、私に選択させてください。
・物語が完結するまで選択肢を提示し続けてください。
・単調な物語はつまらないので適度にアクシデントを起こしてください。
・できれば会話ベースにしてください。
・謎多き少女とであうところから物語を開始してください。
```

## 結果

![screencapture-chat-openai-c-0190b4b0-e1cf-4998-8ba2-ea34075a7757-2024-01-13-06_51_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649673/2cac9c96-f034-55b1-4040-49c6f14424c5.png)

## チラ裏

スクロール込みでスクショするときに邪魔な下矢印を消すためにSVGタグをdisplay:none;にしたため、ChatGPTくんのマークが消えています。
ターミナルを起動するたびにポケモンが見たい

# はじめに
無機質なターミナルに彩りを。

[![Image from Gyazo](https://i.gyazo.com/290cbc1ddd43b516fdda60737a63ec2d.jpg)](https://gyazo.com/290cbc1ddd43b516fdda60737a63ec2d)

https://github.com/possatti/pokemonsay

# 環境
・MacOSを使用していること。
・Homebrewをインストール済みであること。

# 手順1：pokemonsayをインストール

1-1
`pokemonsay`をインストールします。

```
brew tap possatti/possatti
```
```
brew install pokemonsay
```

1-2
ランダムなポケモンに「Hello World」と喋ってもらいます。
```
pokemonsay Hello World
```

ポケモンが表示されればインストールが成功しています。

# 手順2：ターミナル起動時に自動でポケモンを呼び出す

2-1
`.zshrc`ファイルをテキストエディタで開きます。

```
vi ~/.zshrc
```

```
(bashを使っている方はこちら)
vi ~/.bashrc
```

2-2
`vi`エディタが開いたら`i`キーを押して挿入モードに入ります。

2-3
ファイルの末尾に移動して、次の行を追加します。
```
pokemonsay "Welcome to the terminal!"
```
2-4
編集が終わったら、`Esc`キーを押してコマンドモードに戻ります。

2-5
コマンドモードで`:wq`と入力し、`Enter`キーを押して`vi`を閉じます。

2-6
`command`+`T`でターミナルを別タブで開き、ポケモンが表示されれば成功です。

# おまけ：表示するポケモンを固定する方法
ポケモン一覧を表示します。
```
pokemonsay -l
```
表示されたリストの中から1体、ポケモンを選びます。
「`Pikachu`、君に決めた！」

あとは手順2と同じですが、
2-3の時に、こちらに置き換えてください。

```
pokemonsay -p Pikachu Hello World
```
`-p [ポケモンの名前]`で好きなポケモンを呼び出せます。


今回は`Pikachu`が表示されていれば成功です。

[![Image from Gyazo](https://i.gyazo.com/3e3a18bc41bd48b4be5e1674827e7d12.jpg)](https://gyazo.com/3e3a18bc41bd48b4be5e1674827e7d12)


# 参考サイト
https://zenn.dev/torkralle/articles/4973fffdf3ffb2

https://github.com/possatti/pokemonsay
GitHub Foundationsの学習

## GitHub Certifications Guide
GitHub Certifications Guideが出てたので、なんとなく使っていたGitHubをしっかり学習してみる。
[GitHub Certifications Guide](https://github.com/LadyKerr/github-certification-guide)

自分が分かってなかったこと部分を中心に記録する。

### 4つのオブジェクト
- BLOBオブジェクト：通常のファイル　
- ツリーオブジェクト：ディレクトリを表し、名前、ハッシュおよびアクセス許可が含まれる。
- コミットオブジェクト：作業ツリーの特定のバージョンで、コミットによって作成される。
- タグ：コミットにアタッチされている名前

### Gitリポジトリ内のファイル状態
- 未追跡：Gitリポジトリに含まれていない状態
- 追跡対象：Gitがアクティブに監視しているファイル
    - 未変更：前回のコミット以降は変更されていない。
    - 変更済み：前回のコミットから変更されているが、ステージされていない。
    - ステージ済み：変更され、ステージング領域(インデックス)に追加されている。コミットする準備ができている。
    - コミット済み：リポジトリのデータベース内にあり、最新のコミット済みバージョンを表す。

### Projects
チームの計画管理を支援する機能で、主に以下のような機能がある。(無料アカウントだと使えない。)

1\. 項目の管理
pull requestやissueを、カンバンで見れるようにしたり、優先度付けをしたバックログのようにすることができる。

2\. グラフ化機能
- projectの項目の積み上げ棒グラフ
- バーンアップグラフ

3\. ワークフロー
GitHub Actionsをトリガーとした自動化を行うための機能

### オープンソースプロジェクトに参加する
[GitHub](https://github.com/search)で検索し、以下のドキュメントを読む。これらのドキュメントがあるプロジェクトは参加しやすい。
- LICENSE
オープンソースライセンス。これがないとオープンソースではない。
- README
ウェルカムページ。プロジェクトの使い方やコミュニティへの参加方法などが記載されている。
- CONTRIBUTING
プロジェクトへの貢献方法についてのガイダンスが提供されている。貢献プロセスが説明され、開発環境の設定方法について詳細に説明されている。
- CODE_OF_CONDUCT
コミュニティメンバーのルールが記載されている。
インメモリ キーバリュー型NoSQL「Memcached」コマンドの使い方

### 1. Memcached とは
- Memcached（メムキャッシュディー）は、memory cache daemonの略。
- ファイルやデータベースのセッションデータの内容を、キーバリュー型のペアデータとしてサーバのメモリ上に一時保管して、データを高速に読み出すキャッシュサーバ（インメモリデータストア）として、よく利用される。
- 高性能な分散メモリ・オブジェクト・キャッシュ・システムであり、もともとはデータベースの負荷を軽減することで、動的なウェブ・アプリケーションを高速化するために使用することを目的としていた。

![memcached_logo_icon_170963.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288256/d0331459-53df-ec19-5226-7f959dbef756.png)

### 2. Memcached の導入（前準備）
- Windows
MemcachedのWindows用バイナリをダウンロードし、ZIPファイルを任意の場所に解凍する。

:::note
ダウンロード（windows64ビット版　memcached-1.6.8-win64-mingw.zip）：
https://github.com/jefyt/memcached-windows/releases/tag/1.6.8_mingw
:::

- macOS (Homebrewを使う場合)
```
> brew install memcached
```

- Debian/Ubuntu
```
> sudo apt update
> sudo apt install memcached
```

- Redhat
```
> sudo yum install memcached
```

:::note
参考：Memchached公式サイト
https://memcached.org/downloads
:::

### 3. Memcached サーバの起動
Memcached サーバを起動する（デフォルトポート番号：11211）。
```
> memcached -d start

※特定のポートで起動する場合：
> memcashed -p <ポート番号> -d start
```

Memcachedサーバを停止する。
```
> memcached -d stop
```

### 4. TelnetでMemcached サーバに接続
Memcached サーバには、telnet／専用のクライアントライブラリを使用して対話的にコマンド操作する。ここではTelnetで接続する。
```
> telnet localhost 11211
```

### 5. Memcached コマンドの使い方
Memcachedのデータ操作を行う基本的なTelnetコマンドを以下に紹介する。

#### 5-1. データの登録（SET）
> set [ キー ]  [ フラグ ]  [ 有効期限 ]  [ バリュー（値）のバイト数 ]
> [バリュー（値）]
- キー　　：キーバリューのキーを入力（最大：250文字）
- フラグ　：符号なし整数を入力（特別な意味は無く、ユーザ自身で管理するフラグ）
- 有効期限：有効期限を秒単位で入力（0秒で設定すると有効期限は無期限になる）
- バリュー（値）のバイト数：バリューのデータのバイト数を入力
- バリュー（値）：バリューのデータ（文字／数字 等）

例1）”orange”（オレンジ）というキーに、"100"（円）というバリュー（値）を設定する。
```
> set orange 0 0 3
100
STORED
```

例2）”user1”（ユーザ１）というキーに、"taro"（太郎）というバリュー（値）を設定する。
```
> set user1 0 0 4
taro
STORED
```

#### 5-2. データの取得（GET）
例3）”orange”というキーのバリュー（値）を取得する。
```
> get orange
VALUE orange 0 3
100
END
```

例4）”user1”というキーのバリュー（値）を取得する。
```
> get user1
VALUE user1 0 4
taro
END
```

#### 5-3. データの更新／置換（REPLACE）
例5）”user1”というキーのバリュー（値）を”taro”から”hanako”に更新／置換する。
```
> replace user1 0 0 6
hanako
STORED
```

#### 5-4. データの加算（INCR）
例6）”orange”というキーのバリュー（値）を10（円）加算する。100+10=110円になる。
```
> incr orange 10
110
```

#### 5-5. データの減算（DECR）
例7）”orange”というキーのバリュー（値）を5（円）減算する。110-5=105円になる。
```
> decr orange 5
105
```

#### 5-6. データの削除（DELETE）
例8）”user1”というキーとそのバリュー（値）を削除する。
```
> delete orange
DELETED
```

#### 5-7. 全データの削除（FLUSH_ALL）
例8）インメモリに登録されている全データを削除する。
```
> flush_all
OK
```

以上
Pythonで「集合と他の集合との関係を調べる(等しいかどうか、部分集合かどうかなど)」の動作を確認してみた

# 概要

Pythonで「集合と他の集合との関係を調べる(等しいかどうか、部分集合かどうかなど)」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/python/set/index5.html

# 実装

以下のファイルを作成しました。
```
set1 = {"A", "B", "C"}
set2 = {"B", "C", "A"}
print(set1 == set2)

set1 = {"A", "B", "C"}
set2 = frozenset(["B", "A", "C"])
print(set1 == set2)

set1 = {"A", "B"}
set2 = {"B", "D", "C", "A"}
set3 = {"B", "A"}
print(set1 <= set2)
print(set2 <= set1)
print(set1 <= set3)

set1 = {"A", "B"}
set2 = {"B", "D", "C", "A"}
set3 = {"A", "B"}
print(set1.issubset(set2))
print(set2.issubset(set1))
print(set1.issubset(set3))

set1 = {"A", "B"}
set2 = {"B", "D", "C", "A"}
set3 = {"A", "B"}
print(set1 < set2)
print(set2 < set1)
print(set1 < set3)

set1 = {"A", "B"}
set2 = {"B", "D", "C", "A"}
set3 = {"B", "A"}
print(set1 >= set2)
print(set2 >= set1)
print(set1 >= set3)
print(set3 >= set1)

set1 = {"A", "B"}
set2 = {"B", "D", "C", "A"}
set3 = {"A", "B"}
print(set1.issuperset(set2))
print(set2.issuperset(set1))
print(set1.issuperset(set3))
print(set3.issuperset(set1))

set1 = {"A", "B"}
set2 = {"B", "D", "C", "A"}
set3 = {"A", "B"}
print(set1 > set2)
print(set2 > set1)
print(set1 > set3)

set1 = {"A", "B"}
set2 = {"C", "D", "E"}
set3 = {"A", "C"}
print(set1.isdisjoint(set2))
print(set1.isdisjoint(set3))
print(set2.isdisjoint(set3))
```

以下のコマンドを実行しました。
```
$ python3 sample.py 
True
True
True
False
True
True
False
True
True
False
False
False
True
True
True
False
True
True
True
False
True
False
True
False
False
```

# まとめ

何かの役に立てばと。
python.おかしな時間

```python
import math
import datetime
import msvcrt
timer0_timup_bol = bool(0)

timer0_interval_in=2000
timer0_interval = 1000
timer0_interval_hafe=1000
if timer0_interval_in>1000:
    timer0_interval = timer0_interval_in

timer0_interval_hafe = int(math.floor(timer0_interval / 2))
bol_stato_tim = bool(0)
bol_hafe_time0 = bool(0)
count=0
my_over_bol = bool(0)
bol_set_time0 =bool(0)
my_count_tim =0
my_count_tim_sub = 0
while True:

    now = datetime.datetime.now()
    formatted_now = now.strftime("%Y-%m-%d %H:%M:%S.%f")
#    print(formatted_now)

#2024-01-12 15:32:11.123456
    new_tim0_now = 0
    arrey_time_now = formatted_now.split(":")
    time0_now_sec=int(float(arrey_time_now[2])*1000)
    
    if new_tim0_now != time0_now_sec:
        new_tim0_now = time0_now_sec
        my_count_tim_sub += 1
        if my_count_tim_sub > 60:
            my_count_tim += 1
        #    print (my_count_tim_sub,";",my_count_tim,"\n")
            my_count_tim_sub = 0
        

        if my_count_tim == timer0_interval_hafe and bol_set_time0 == (0):
            display = "□"
            print (display,my_count_tim,":",timer0_interval_hafe,"\n")
            bol_set_time0 =bool(1)
            bol_hafe_time0 = bool(1)
        #elif my_sectr_tim % timer0_interval <= timer0_interval_hafe and bol_set_time0 == (1):
        elif my_count_tim == timer0_interval and bol_set_time0 == (1): 
            bol_set_time0 = bool(0) 
            display = "■"
            print (display,my_count_tim,":",timer0_interval_hafe,"\n")
        #   bol_hafe_time0 = bool(0) #time up after cller

        if my_count_tim == timer0_interval and bol_hafe_time0 ==(1):
            bol_set_time0 = bool(0) 
            timer0_timup_bol = bool(1)
            my_count_tim = 0
            bol_hafe_time0 = bool(0)
        #it cller
        #s = msvcrt.getch().decode('utf-8')

    if count >=10 and timer0_timup_bol ==(1):
        print ("Geme Over\n")
        my_over_bol = bool(1)
    elif timer0_timup_bol ==(1):
        count +=1
        timer0_timup_bol = bool(0)
        print (int(count), "\n")
    
    if my_over_bol==(1):
        break
     


    elif msvcrt.kbhit():
        x = msvcrt.getch().decode('utf-8')
        print(f"Received input: {x}")
        break
exit()
```
1/100と1/60間違えていませんか?
さらに10分の10倍にして10secをストップウォッチで、計ってみてください。
ProxmoxVEに置いてるUbuntu 20.04のext4パーティションを拡張した

忘れがちなのでメモ。

# 下準備
PVEの画面から`VM > ハードウェア > ハードディスク(scsi0)`を選択して、
`ディスクの動作 > リサイズ`にて増やしたい分のサイズを追加してください。
![見たな.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3529047/effaff3f-d4a1-893e-7b91-0db95c37a048.png)


今回は`/dev/sda2`を拡張します。

# 作業1
```
ubuntu@server:~$ sudo parted /dev/sda
GNU Parted 3.3
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.

Warning: Not all of the space available to /dev/sda appears to be used, you can
fix the GPT to use all of the space (an extra 419430400 blocks) or continue with
the current setting?
Fix/Ignore? Fix #ここでFixを選ぶ

#確認
(parted) p
Model: QEMU QEMU HARDDISK (scsi)
Disk /dev/sda: 322GB #/dev/sdaに増加分のサイズが割り当てられている
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system  Name  Flags
 1      1049kB  2097kB  1049kB                     bios_grub
 2      2097kB  107GB   107GB   ext4 

(parted) resizepart 2 #/dev/sda2は2番なので2番をresize

#警告でたらYes

End? [107GB]? 100% #全部割り当て

(parted) quit #おわり
 ```

# 作業2

```
ubuntu@server:~$ sudo resize2fs /dev/sda2 #ext4のresize
resize2fs 1.45.5 (07-Jan-2020)
Filesystem at /dev/sda2 is mounted on /; on-line resizing required
old_desc_blocks = 13, new_desc_blocks = 38
The filesystem on /dev/sda2 is now 78642683 (4k) blocks long.

ubuntu@server:~$ df -h #確認
Filesystem      Size  Used Avail Use% Mounted on
udev            2.9G     0  2.9G   0% /dev
tmpfs           593M  2.6M  591M   1% /run
/dev/sda2       295G   75G  207G  27% /
tmpfs           2.9G  264K  2.9G   1% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           2.9G     0  2.9G   0% /sys/fs/cgroup
/dev/loop1       56M   56M     0 100% /snap/core18/2812
/dev/loop3       81M   81M     0 100% /snap/ffmpeg/1286
/dev/loop2       64M   64M     0 100% /snap/core20/2105
/dev/loop4       41M   41M     0 100% /snap/snapd/20290
/dev/loop0       56M   56M     0 100% /snap/core18/2796
/dev/loop5       92M   92M     0 100% /snap/lxd/24061
/dev/loop6       64M   64M     0 100% /snap/core20/2015
/dev/loop7       71M   71M     0 100% /snap/lxd/21029
/dev/loop8       41M   41M     0 100% /snap/snapd/20671
tmpfs           593M     0  593M   0% /run/user/1000
```

おわり！
Next.jsの環境構築（Manjaro）

# はじめに
調べれば腐るほど出てくるだろうけど、個人的に必要であるので書き残しておく・・・

## 環境
デスクトップ環境はKDE。
`neofetch`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294563/0fc89b27-4822-e3c9-f790-2d8d2172b8ce.png)

# 使用コマンド

## 更新
`sudo pacman -Sy`

## nodejsのインストール
`sudo pacman -S nodejs`

## Next.jsの環境作成
（必要なディレクトリに移動して）
`npx create-next-app`

## 起動
`npm run dev`

# おわりに
Tailwind CSSはいいぞ。
質問受け付けます。
富岳のPyTorch-1.13.0で係り受け解析モジュールStanzaを動かすには

スーパーコンピュータ「富岳」のspack0.19版PyTorch-1.13.0には、今のところ[transformersは乗っていない](https://qiita.com/KoichiYasuoka/items/521087a76186b4432145)ものの、[Stanza](https://stanfordnlp.github.io/stanza/)なら乗せて動かすことができそうだ。[一昨日の記事](https://qiita.com/KoichiYasuoka/items/fec7602bcca7fb2a6bf7)のプログラムを、spack向けに書き換えてみよう。

```
#! /bin/bash
#PJM -L rscgrp=small
#PJM -L elapse=1:00:00
#PJM -L node=1
#PJM -j
#PJM -S

. /vol0004/apps/oss/spack/share/spack/setup-env.sh
spack load py-torch@1.13.0/glqavnh
G=`id | sed 's/^.*gid=[0-9]*(\([^)]*\)).*$/\1/'`
set `ls -d /vol*/$G /vol*/data/$G` $HOME
export PYTHONUSERBASE=$1/Stanza
export PATH=$PYTHONUSERBASE/bin:$PATH
export STANZA_RESOURCES_DIR=$PYTHONUSERBASE/stanza_resources_dir
export TMPDIR=$PYTHONUSERBASE/tmp
mkdir -p $TMPDIR
pip3 install -U stanza deplacy tqdm typing_extensions --user

P=$TMPDIR/stanza_eu.$PJM_JOBID.$$.py
cat << 'EOF' > $P
import stanza
nlp=stanza.Pipeline("eu")
doc=nlp("Gaur ama hil zen, gaur goizean ama hil nuen.")
import deplacy
print(deplacy.to_conllu(doc))
deplacy.render(doc)
EOF
python3 $P
```

富岳のログインノードから`pjsub`してみたところ、ジョブ待ち・インストール・ダウンロード等も含め、20分ほどで以下の結果が得られた。

```
# text = Gaur ama hil zen, gaur goizean ama hil nuen.
# sent_id = 0
1	Gaur	gaur	ADV	_	_	3	advmod	_	start_char=0|end_char=4
2	ama	ama	NOUN	_	Case=Abs|Definite=Def|Number=Sing	3	nsubj	_	start_char=5|end_char=8
3	hil	hil	VERB	_	Aspect=Perf|VerbForm=Part	0	root	_	start_char=9|end_char=12
4	zen	izan	AUX	_	Mood=Ind|Number[abs]=Sing|Person[abs]=3|VerbForm=Fin	3	aux	_	start_char=13|end_char=16
5	,	,	PUNCT	_	_	9	punct	_	start_char=16|end_char=17
6	gaur	gaur	ADV	_	_	9	advmod	_	start_char=18|end_char=22
7	goizean	goiz	NOUN	_	Animacy=Inan|Case=Ine|Definite=Def|Number=Sing	9	obl	_	start_char=23|end_char=30
8	ama	ama	NOUN	_	Case=Abs|Definite=Def|Number=Sing	9	obj	_	start_char=31|end_char=34
9	hil	hil	VERB	_	Aspect=Perf|VerbForm=Part	3	conj	_	start_char=35|end_char=38
10	nuen	edun	AUX	_	Mood=Ind|Number[abs]=Sing|Number[erg]=Sing|Person[abs]=3|Person[erg]=1|VerbForm=Fin	9	aux	_	start_char=39|end_char=43
11	.	.	PUNCT	_	_	3	punct	_	start_char=43|end_char=44

Gaur    ADV   <════╗         advmod
ama     NOUN  <══╗ ║         nsubj
hil     VERB  ═╗═╝═╝═════╗═╗ root
zen     AUX   <╝         ║ ║ aux
,       PUNCT <════════╗ ║ ║ punct
gaur    ADV   <══════╗ ║ ║ ║ advmod
goizean NOUN  <════╗ ║ ║ ║ ║ obl
ama     NOUN  <══╗ ║ ║ ║ ║ ║ obj
hil     VERB  ═╗═╝═╝═╝═╝<╝ ║ conj
nuen    AUX   <╝           ║ aux
.       PUNCT <════════════╝ punct
```

バスク語の例文「Gaur ama hil zen, gaur goizean ama hil nuen.」に対し、2つある「ama hil」が[それぞれnsubjとobjで繋がれている](https://qiita.com/KoichiYasuoka/items/48da436803e828a3c8d4)点も含め、ちゃんとUniversal Dependenciesで係り受け解析できている。これなら、富岳における「[PythonはSpackでのご使用をお願いします](https://www.fugaku.r-ccs.riken.jp/doc_root/ja/guidances/HelpdeskReport_202401.pdf#page=15)」もクリアできるので、とりあえずStanzaは、富岳のspack0.19版PyTorch-1.13.0で動かす方がいいかな。
トップレベルドメインについて

## 概要

Route53の勉強を今一度行っていたときにネームサーバーについて後々混乱思想だったので簡単にまとめる。

## トップレベルドメイン

トップレベルドメインとはなんだろうか？再度確認しておこう。
トップレベルドメインとは`example.com`の`.com`の部分の事を言う。

トップレベルドメインはすべてのトップレベルドメイン専用のネームサーバーを持っている。
更にトップレベルドメインのネームサーバーはそのトップレベルドメインを使用しているドメイン（`example.com`）のネームサーバーの情報を持っている。
そのため`.com`などのトップレベルドメインのネームサーバーは名前解決のクエリ（DNSクエリ）が来たときに次にどのネームサーバーに問い合わせるかを指示する。
AlmaLinux9で自宅サーバーを構築

# はじめに
2024年は勉強を兼ねて新たな自宅サーバーを構築したいな・・・
と思い立ち、小さなPCに構築してみることにしました。

:::note
本記事は、あくまでも個人のメモでありこの記事を読んだ人の役に立つかは謎ですが、少しずつ詳細を記載した投稿を行ってリンクを増やすつもりです。
:::

# 構築対象のハードウェア
常時起動のLinuxマシンが欲しくなり色々と検討＆物色しました。
小さいこと、そして静かなことが必須要件。
小型PCが無難かな・・・と考え、[Intel NUC NUC7CJYH](https://www.intel.co.jp/content/www/jp/ja/products/sku/126135/intel-nuc-kit-nuc7cjyh/specifications.html) の中古品をYahoo!フリマで購入。SSDは自宅に余っていたものを取り付け。
　　
CPU: Intel® Celeron® J4005 Processor (4M Cache, up to 2.70 GHz)
メモリ: 4GB
ディスク: eMMC 32GB + SATA SSD 240GB
　　
充分でしょ！(欲を言うとメモリがもう少し欲しいような・・・)
常時起動のLinuxサーバにするのにちょうどよいサイズだし、ほとんど無音かつ消費電力少ない(アイドル時は5wくらい)のがありがたい。 

次点として[ChromeBox CN60](https://www.asus.com/commercial-desktop/asus_chromebox_commercial/)も用意したけど、第4世代のCPUのためか、気持ち消費電力が多かったです(といってもアイドル時で10wくらいです)

# 構築手順メモ
## 1. BIOSアップデート
一度ためしにAlmaLinux8で構築した後にBIOS設定変更をしたところ、SATA SSDを認識せずAlmaLinux8が起動しないという謎現象が。
BIOSが2018年10月のものだったので最新のもの(2023年11月27日リリース)に更新。BIOSアップデートしたら謎現象はなくなりました。BIOSの更新も重要ということを認識。
 
## 2. AlmaLinux9インストール
初めてのRHEL9系OSをインストール。RHEL8系とほぼ一緒だったので特筆することはなし。

## 3. selinux & Firewalld無効化
家庭内サーバには邪魔なので・・・
```
$ sudo systemctl stop firewalld
$ sudo systemctl disable firewalld
Removed "/etc/systemd/system/multi-user.target.wants/firewalld.service".
Removed "/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service".
```
```:/etc/selinux/config
SELINUX=disabled
```
上記変更後reboot

## 4. wireguardでVPSと接続
WebARENAでVPSを借りているのでそのVPSと接続
 
## 5. DNSサーバ構築(dnsmasq)
自宅内用DNSサーバ

## 6. [docker-ceの導入](https://qiita.com/adamihs3/items/262106b1ef83d1c0443c)
自宅サーバで動作させるサービスは基本的にdockerで起動させたいので

## 7. docker-composeでzabbixによる監視サーバを構築
自宅内監視用
 
## 8. docker-composeでPrometheusによる監視サーバを構築
zabbixよりもこっちの方が今どき？
 
## 9. docker-composeでminidlnaによるDLNAサーバを構築
AlmaLinux9にdockerとdocker-composeを導入した

# はじめに
自宅サーバ用にIntel NUCを用意したのでそのNUC上に色々構築したい。
ひとまずNUCには AlmaLinux9 をインストールしてあるのでその後の構築メモです。

今回は、docker-ceをインストールしたときの手順メモです。
podman? ubuntu環境でdocker使っているので個人的には却下です。本当にdockerと同じUIで使用できるのか、試してみても良いのですが・・・・

# 手順
まずはリポジトリ追加します。
```
$ sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
```

dnfコマンドでdocker-ceをインストール
```
$ sudo dnf -y install docker-ce docker-ce-cli containerd.io

   :
   :

インストール済み:
  checkpolicy-3.5-1.el9.x86_64                      container-selinux-3:2.221.0-1.el9.noarch            containerd.io-1.6.26-3.1.el9.x86_64
  docker-buildx-plugin-0.11.2-1.el9.x86_64          docker-ce-3:24.0.7-1.el9.x86_64                     docker-ce-cli-1:24.0.7-1.el9.x86_64
  docker-ce-rootless-extras-24.0.7-1.el9.x86_64     docker-compose-plugin-2.21.0-1.el9.x86_64           fuse-common-3.10.2-6.el9.x86_64
  fuse-overlayfs-1.12-1.el9.x86_64                  fuse3-3.10.2-6.el9.x86_64                           fuse3-libs-3.10.2-6.el9.x86_64
  libslirp-4.4.0-7.el9.x86_64                       policycoreutils-python-utils-3.5-3.el9_3.noarch     python3-audit-3.0.7-104.el9.x86_64
  python3-distro-1.5.0-7.el9.noarch                 python3-libsemanage-3.5-2.el9.x86_64                python3-policycoreutils-3.5-3.el9_3.noarch
  python3-setools-4.4.3-1.el9.x86_64                python3-setuptools-53.0.0-12.el9.noarch             slirp4netns-1.2.1-1.el9.x86_64
  tar-2:1.34-6.el9_1.x86_64

完了しました!
```

実際にdockerコマンドが実行できることの確認
```
$ docker --version
Docker version 24.0.7, build afdd53b
```

dockerサービスの起動
```
$ sudo systemctl enable docker
$ sudo systemctl start docker
```

続いて、docker-composeをインストール
深く考えずに最新バージョンをインストールしました。(参考にさせてもらった情報はなぜかバージョン固定になっている情報が多かった)
```
$ sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
```

実際にdocker-composeコマンドが実行できることの確認
```
$ /usr/local/bin/docker-compose --version
Docker Compose version v2.23.3
```

dockerグループにユーザを追加
```
$ sudo gpasswd -a username docker
```

# まとめ
今更感が満載のメモですみません。

:::note
後日、全く同じ手順でRocky Linux 8.7 にも導入しました
:::

# 参照リンク
https://qiita.com/Nats72/items/660798a9146baf68e376
https://higmasan.com/docker/almalinux-9-1%E3%81%ABdocker%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B/
https://blog.mitsuto.com/docker-compose-v2
FM WhatsApp APK ダウンロード v9.95

FM [WhatsApp](https://qiita.com/whatsappgb_icu) APK ダウンロード (アップデート) v9.95 – 2024 年 1 月

**最終更新日: 2024 年 1 月 10 日**

進化し続けるインスタント メッセージング アプリの世界で、[WhatsApp GB](https://whatsgb.icu/) は友人や家族とつながるための人気の選択肢となっています。 しかし、WhatsApp エクスペリエンスをまったく新しいレベルに引き上げることができたらどうでしょうか? そこでFM WhatsApp APKの出番です。 これは、デフォルトの WhatsApp アプリが提供していないさまざまな魅力的な機能を提供する WhatsApp の修正バージョンです。

## FM WhatsApp APK 最新バージョンをダウンロード

 - [ ] ダウンロード (v9.95)
       
       ダウンロード (v20.93.03)
       
       まとめ
       
       FMWhatsAppとは何ですか? FM Whatsapp APK 仕様 FM WhatsAppの特徴 カスタマイズオプション
       高度なプライバシー機能 複数のアカウントのサポート ファイル共有機能

ステータスビューを非表示にする
独自の絵文字とテーマ
禁止行為とセキュリティ
削除反対メッセージとステータス
自動応答
FM Whatsapp APKをアップデートする方法?
FM WhatsAppをダウンロードしてインストールする方法?
よくある質問
結論

## FMWhatsAppとは何ですか?

FM WhatsApp は、サードパーティによって開発されたオリジナルの WhatsApp アプリケーションの修正バージョンです。 さまざまなカスタマイズ オプション、プライバシー機能、公式アプリにはない追加機能を導入することで、ユーザー エクスペリエンスを向上させることを目的としています。 Android デバイスで利用でき、APK ファイルとしてダウンロードできます。 非公式アプリケーションであるため、FMWhatsApp を使用する利点と潜在的なリスクの両方を考慮することが重要です。

## FM Whatsapp APK 仕様

アプリ名: FM Whatsapp APK
開発者: Fouad Mods
バージョン: 9.95
サイズ: 53MB
目的: 追加の会話リソース
OS：アンドロイド5.0以上
総ダウンロード数：5,000万
評価: 4.87
FM WhatsAppの特徴

## カスタマイズオプション

FM WhatsApp の顕著な特徴の 1 つは、その広範なカスタマイズ オプションです。 ユーザーは独自のテーマ、フォント、スタイルを使用して会話をパーソナライズし、高度にパーソナライズされたメッセージング エクスペリエンスを提供できます。 チャット ウィンドウの背景を変更する場合でも、スタイルに合わせてフォントをカスタマイズする場合でも、FM WhatsApp にはさまざまな選択肢があります。

## 高度なプライバシー機能

FM WhatsApp のアップデートでは、お客様のプライバシーを重視しています。 オンラインステータス、青いチェックマーク、さらには入力ステータスを非表示にするなどの機能が提供されます。 これにより、あなたがアクティブなときや入力しているときを誰が見ることができるかをより詳細に制御できるようになります。 高度なプライバシー設定は、プラットフォーム上で通信中にプライバシーを維持したい人にとって特に価値があります。

## 複数のアカウントのサポート

公式の WhatsApp とは異なり、FM WhatsApp APK を使用すると、ユーザーは同じデバイス上で複数の WhatsApp アカウントを実行できます。 これは、アカウントを切り替える手間をかけずに、個人的なコミュニケーションと仕事上のコミュニケーションを分離したい人にとって、非常に便利です。

## ファイル共有機能

FM WhatsApp を使用すると、連絡先とのファイル共有がこれまでより簡単になります。 より大きなファイルやさまざまな形式を送信できるため、個人用と仕事用の両方に実用的な選択肢になります。 高解像度の写真、ビデオ、ドキュメントを共有する場合でも、FM WhatsApp はファイル共有プロセスを簡素化します。

## ステータスビューを非表示にする

この機能を使用すると、ユーザーは連絡先のステータス更新を通知せずに秘密裏に表示できます。 これは倫理的な懸念を引き起こす可能性がありますが、ステータスを閲覧する際に一定レベルの匿名性を維持したい人にとっては便利かもしれません。

## 独自の絵文字とテーマ

WhatsApp のこの修正バージョンには、会話にユニークな雰囲気を加える絵文字やテーマの豊富なコレクションが含まれています。 これらの追加機能を使用して、新しくエキサイティングな方法で自分自身を表現してください。 さまざまな絵文字を使用し、多数のテーマから選択して、会話に独特の外観を与えることができます。

## 禁止行為とセキュリティ

FM WhatsApp は安全で禁止されないよう設計されているため、アプリの使用が禁止されることを心配する必要はありません。 メッセージング エクスペリエンスに追加のセキュリティ層を提供します。 さらに、FM WhatsApp はセキュリティ機能を定期的に更新して、データや会話を潜在的な脅威から守ります。

## 削除反対メッセージとステータス

この機能により、ユーザーに送信されたメッセージやステータスが他の人によって削除されるのを防ぎ、重要な情報が確実に保持され、常にアクセスできるようになります。

## 自動応答

FM WhatsApp APK を使用すると、すぐに応答できない場合に、受信メッセージに対する自動応答を作成できます。 この機能は多忙な専門家にとって便利であり、特定の連絡先またはグループ向けにカスタマイズできます。

FM Whatsapp APKをアップデートする方法?
FMWhat を更新するには
この岐阜大学起業部のアカウントについて

## 岐阜大学起業部のアントレプレナーシップ支援

岐阜大学は、アントレプレナーシップ（起業家精神／企業家精神）を大切にし、学生の成長を促し、起業家の育成・輩出を積極的に支援する環境を整えています。ここでは、岐阜大学が提供する起業家支援のプラットフォーム、「岐阜大学起業部」に焦点を当て、その役割と重要性について探ります。

### アントレプレナーシップの重要性

アントレプレナーシップは、現代のビジネス環境で非常に重要な要素です。起業家精神を持った個人と組織は、新しいアイデアを生み出し、市場に革命をもたらす力を持っています。また、起業家は地域社会への貢献も果たし、経済の発展に寄与します。岐阜大学では、学生たちがアントレプレナーシップの力を身につけ、社会への影響を創り出すことを奨励しています。

https://www.gifu-u.ac.jp/about/publication/g_lec/special/42_2.html

### 岐阜大学起業部の役割

岐阜大学起業部は、このビジョンを具現化するために設立されました。この部署は、学生たちがビジネスの世界で挑戦し、自分のアイデアを実現するためのサポートを提供しています。岐阜大学起業部は以下のような役割を果たしています。

1. **起業家の育成**: 学生たちに起業家精神を養う機会を提供し、彼らのビジネススキルを向上させます。

2. **アイデアの支援**: 学生が持つアイデアを具現化するためのアドバイスやリソースを提供します。

3. **地域社会への貢献**: 起業家活動を通じて地域社会に貢献し、経済発展を後押しします。

### サイトのコンテンツについて

このサイトでは、アントレプレナーシップの重要性を理解し、岐阜大学起業部の活動について知るための情報を提供していきます。また、現代の起業において不可欠な要素であるウェブサイト制作に焦点を当て、関連する記事も投稿予定です。プログラミングやウェブ開発に興味を持つ学生や起業家志望の方々にとって、貴重な情報となることでしょう。

岐阜大学起業部のアントレプレナーシップ支援について詳しく知り、起業家の一歩を踏み出す学生たちを応援してください。どうぞよろしくお願いします。
Route53のホストゾーンでよく設定する「〇〇レコード」って結局なんなの？

## 概要

Route53を使ったときによく聞く「〇〇レコード」がちゃんと理解できていなかったので簡単にまとめる

## そもそもホストゾーンって？

どうやら特定のドメインに関連する情報を入れておく箱のようなものらしい

## じゃあ〇〇レコードは何なの？

特定のドメインに関する個々の設定情報だと思っていただきたい。（レコードと言う名前がついているのでなんだかすごいものに感じるが、単純に「そのドメインに関連する個々の設定」に過ぎない）

### Aレコード

Aは「Address」の頭文字らしい。
ドメイン名と対象リソースのIPアドレスを紐付ける役割を持っている。
IPだけではなく、EC2インスタンスやCloudFront、ALBなどなど色々なものを紐付ける。
ルーティング設定の役割を持っている。

### NSレコード

NSとはName Serverの略で、当該のドメインがどこのネームサーバーで名前解決されているかの情報を登録する。
ちなみに、上記の説明の「ネームサーバー」とは下記の記述の「トップレベルドメインを使用しているドメイン（example.com）のネームサーバー」のことである。

https://qiita.com/miriwo/items/3af2bbf0812d33382120

### CNAMEレコード

Cは「Canonical」の頭文字らしい。
サブドメインを作りたいときに使う。
「このサブドメインは、どのドメインのサブドメインなのか」を設定する。
VScodeにて git add の前に叩くコマンド

# やりたいこと
毎回以下の確認コマンドを叩いているのが、面倒くさい
```s
$ git status -s
$ git diff --stat
```

# 実施した内容1
Macの.zshrcに以下を登録
```s
alias gf='echo -e "\033[33m$ git status -s\033[0m"; git status -s; echo; echo -e "\033[33m$ git diff --stat\033[0m"; git diff --stat'
```

# VScodeの画面1
gfと叩くと、2つのコマンドが実施される。
echo で叩いているコマンドも表示させるようにしている。
#ベアプロ時に見てる側にも分かるような配慮
echo の部分は黄色で分かるようにしている。
![スクリーンショット 2024-01-13 0.03.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2292878/1b47628f-d27b-6263-c150-9bf77c587b16.png)

# 実施した内容2
`実施した内容1`のパワーアップver
Macの.zshrcに以下を登録
```s
alias gf='echo -e "\033[33m$ git status -s\033[0m"; git status -s; echo; echo "Status Codes:"; echo -e "A\tadded\t\t新規ファイル。gitが新規に追跡したファイル\nM\tmodified\t変更があったファイル\nD\tdeleted\t\t削除されたファイル\nR\trenamed\t\t名前変更\nC\tcopied\t\tコピー\nU\tunmerged\tマージしていない\n?\tuntracked\t未追跡。gitが認識していない。\n!\tignored\t\t無視"; echo; echo -e "\033[33m$ git diff --stat\033[0m"; git diff --stat'

```

# VScodeの画面2
`実施した内容1` で出てくる `git status -s` の結果だが、意外とマークの意味を覚えていなかったので表示させるようにした・・・・
![スクリーンショット 2024-01-15 0.28.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2292878/1e43dffb-82db-40ea-0929-3c81d703967e.png)
【Next.js】再レンダリングせずにURLを更新する方法

以下のように記述することで再レンダリングなしでURLを更新することができます。

```js
  history.replaceState(
    { ...history.state, as: pathname, url: pathname },
    '',
    pathname
  )
```

`history.replaceState(null, '', pathname)`のようにすると`Intercepting Routes`を使用したモーダルが進むボタンを押した際に表示されません。

https://github.com/vercel/next.js/discussions/18072#discussioncomment-109059
libstdc++の実装の調べ方(dequeの場合)

C++のデータ構造の実装を調べたいと思った時のソースコードの追い方と簡単なTIPSです。

- Webベースでよい場合

stdlibc++はdoxygenがあるのでそれを見ればよいです。
例: [std::_Deque_iterator](https://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/a07763.html)
...のですが、データ構造の実装を調べる段階ではクラスの構造もよくわかっていないと思うので難しいかと思います。

- ソースコードのダウンロード / 探し方

[gnu/gcc(例: 10.1.0)](https://ftp.gnu.org/gnu/gcc/gcc-10.1.0/)からtar.gzをダウンロードして伸張します。以下、dequeを調べてみます。
```shell
wget https://ftp.gnu.org/gnu/gcc/gcc-10.1.0/gcc-10.1.0.tar.gz
tar zxfv gcc-10.1.0.tar.gz
cd gcc-10.1.0
# 目当てのファイルを探す
find . | grep deque
  ...
  ./libstdc++-v3/include/std/deque
  ./libstdc++-v3/include/debug/deque
  ./libstdc++-v3/include/bits/stl_deque.h
  ./libstdc++-v3/include/bits/deque.tcc
  ./gcc/testsuite/gnat.dg/show_deques_priority.adb
  ./gcc/testsuite/gnat.dg/deques.ads
```
このうち、以下の２つに注目します。
- ./libstdc++-v3/include/bits/stl_deque.h

最初に読むべきファイルです。<b>dequeの場合は</b>クラス自体の構造体定義やメンバ変数がvirtualで定義されています。さらに、実装やTIPSの説明が含まれています。

 - (ない場合もある)./libstdc++-v3/include/bits/deque.tcc
tccには詳細なメンバ関数の実装が含まれています。例えば、dequeであれば
```c++
    deque<_Tp, _Alloc>::insert(iterator __position, const value_type& __x)
    {
      if (__position._M_cur == this->_M_impl._M_start._M_cur)
        {
          push_front(__x);
          return this->_M_impl._M_start;
        }
      else if (__position._M_cur == this->_M_impl._M_finish._M_cur)
        {
          push_back(__x);
          iterator __tmp = this->_M_impl._M_finish;
          --__tmp;
          return __tmp;
        }
      else
        return _M_insert_aux(__position._M_const_cast(), __x);
   }
...
```
といったコードが含まれ、データ構造の挙動を知ることができます。

# TIPS: libstdc特有のprefixを削って読む
先ほど紹介したコードは`_M_`や`__`が多く出現し読みにくいです。sedなどで不要そうなパターンを削除して読むと良いです。
```shell
cat ./libstdc++-v3/include/bits/deque.tcc | 
  sed -e 's/__//g' -e 's/_M_//g' -e 's/_S_//g' -e 's/difference_type//g' |
  less
```
以下のように読みやすくなりました。
```c++
    deque<_Tp, _Alloc>::insert(const_iterator position, const value_type& x)
    {
      if (position.cur == this->impl.start.cur)
        {
          push_front(x);
          return this->impl.start;
        }
      else if (position.cur == this->impl.finish.cur)
        {
          push_back(x);
          iterator tmp = this->impl.finish;
          --tmp;
          return tmp;
        }
      else
        return insert_aux(position.const_cast(), x);
   }
```

# TIPS
- ほとんどのメモリ確保にはmallocが使われず、allocatorが使われることを知っておくと読みやすいです。
 allocatorについては [江添亮のC++入門 vectorの実装 : 基礎](https://cpp.rainy.me/033-vector-implementation.html)
Reactでデータベースを作りたい

Reactがわからないことだらけなので備忘録です。
Reactで現在アプリ開発をしていたのですが、「DBに保存する方法」がわかりませんでした。いつもRailsで開発をしているのでRailsと同じようにReact単体でできるだろうと思っていたら大間違いだったようです。

# Reactはフロントエンド開発向け
まずReactはUIコンポーネント作成に活用されるJavaScriptライブラリです。ユーザインタフェース構築に向いているわけですね。そのためバックエンドなデータベースを作成する機能だったりは提供していないようです。
[React：ユーザインターフェース構築のためのJavaScriptライブラリ](https://ja.legacy.reactjs.org/)

# Reactでデータベースを作るには
## サーバーサイドのAPIを使用する
Reactアプリケーションは通常、サーバーサイドのAPIエンドポイントを利用してデータベースと通信します。サーバーサイドでデータベースにアクセスするためのエンドポイントを作成し、Reactアプリケーションはこれらのエンドポイントを利用してデータを取得・送信します。
## サードパーティのデータベースサービスを使用する
Firebase、AWS、DynamoDB、MongoDBなどのサードパーティのデータベースサービスを利用することで、Reactアプリケーションは直接データベースにアクセスできます。これらのサービスは通常クラウド上にホストされており、APIを介してデータベースとやり取りします。

# 実装
今回はFirebaseを利用して、Firebase上に保存したGoalsテーブルのデータをGoals.jsで表示することを実装します。
ディレクトリ構造は以下の通りです。
```
- src
    - components
        - Goals.js
    -FirebaseConfig.js 
```


```JavaScript:FirebaseConfig.js
// FirebaseConfig.js
import { initializeApp } from "firebase/app";
import { getFirestore } from "firebase/firestore";

const firebaseConfig = {
  // Firebaseの設定情報
};

const app = initializeApp(firebaseConfig);
const db = getFirestore(app);

// db変数をエクスポート
export { db };
```
FirebaseConfig.jsをsrcの中に作成し、上記のコードを書きます。
`export { db };`で他のファイルでdb変数を使用したいのでしっかりdbをエクスポートします。

```JavaScript:Goals.js
import { db } from "../FirebaseConfig";
import { collection, addDoc, getDocs } from "firebase/firestore";
import { useState, useEffect } from "react";

const usersCollection = collection(db, "Goals");

const GoalsList = () => {
  const [goals, setGoals] = useState([]);

  useEffect(() => {
    const fetchData = async () => {
      const goalsSnapshot = await getDocs(usersCollection);
      const goalsData = goalsSnapshot.docs.map((doc) => ({ id: doc.id, ...doc.data() }));
      setGoals(goalsData);
    };

    fetchData();
  }, []);

  return (
    <div>
      <h2>Goals List</h2>
      <ul>
        {goals.map((goal) => (
          <li key={goal.id}>
            <strong>{goal.title}</strong>
            <p>{goal.introduction}</p>
          </li>
        ))}
      </ul>
    </div>
  );
};

export default GoalsList;
```
Goals.jsをcomponentsの中に作成し、上記のコードを書きます。
このコードによってFirebaseに保存されているデータをGoals.jsで表示することができました。
Windows11でWSL2が起動しなくなったときにやったこと

updateコマンド実行。

```powershell
> wsl --update
```

フリーズするしたので、Windows Subsystem for Linux Serviceを停止。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/02dbf134-24c3-4836-12ae-97942e66e775.png)

Serviceが再起動した瞬間にupdateが完了する。

**Before**

```powershell
> wsl --version
WSL バージョン: 2.0.9.0
カーネル バージョン: 5.15.133.1-1
WSLg バージョン: 1.0.59
MSRDC バージョン: 1.2.4677
Direct3D バージョン: 1.611.1-81528511
DXCore バージョン: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windows バージョン: 10.0.22631.2861
```

**After**

```powershell
> wsl --version
WSL バージョン: 2.0.14.0
カーネル バージョン: 5.15.133.1-1
WSLg バージョン: 1.0.59
MSRDC バージョン: 1.2.4677
Direct3D バージョン: 1.611.1-81528511
DXCore バージョン: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windows バージョン: 10.0.22631.3007
```

すると起動するようになっている。
コミュニティ食わず嫌いがRSGT2024に参加して見えた景色

\* 本記事はコミュニティイベント初心者がいきなりRSGT2024に参加した感想であり、イベント内特定のセッションの内容は含みません
　
　
# TL; DR
今まで忌避していた社外コミュニティ参加の山を思い切って越えてみたら
みたことのない景色と、今まで悩んでいたものの答えを見つけられた
後ろを見ると社内の景色も変わっていた


# 見えたもの
ホールでセッションを聞く、ワークショップに参加する、廊下・ブースでコーヒー片手に話す、一緒に酒を飲む...
どんな時でも、どんな人でも皆初心者に優しく、私を話の輪に入れてくれて、私の話を聞いてくれて、私の知らない話をしてくれた
自分の所属しているチームで抱えている課題だったり、自分の考えを聞いてもらう機会もあって
初対面で背景もあまり説明できていない中、自分の思考も整理できていない中でもちゃんと話を聞いてくれてアドバイスをくれる先人の方々のなんと素敵なことか
惜しむらくは無知な初心者すぎて目の前の人がどれだけすごい人なのか、今がどれだけ貴重な瞬間なのかが実感できなかったこと

特に自分が運営に参加している社内コミュニティイベントの相談に乗ってもらって
自分がしてきたことを自分で肯定できるようになり
そして、自分が本当に目指したかったものが見えた気がした

正直セッションはオンライン視聴もできるし、なんなら後日アーカイブで倍速再生もできる
それでもオンサイトでないとできない体験がそこにはあったし
壮絶なチケット争奪戦を越えてでも現地参加したい人たちの気持ちも理解できた



学びも多かった
自分の伸びしろもまだありそうだぞと思えた
次はこうしたい、こうなりたいもできた
実はアジャイルなコミュニティってすごいのでは？と今更感じた
コミュニティイベント最高〜〜〜  
\#RSGT2024 #最高のイベント
\#尊敬するコミュニティ #来年も参加するぞ　

まぁ、これで終わってもいい気はする
  　


# でもちょっと待って
そもそも...

社内の人ともまだ話し足りてないのでは？
　

 　
一人前になるまでコミュニティイベントに出たくない　ではないけど
そんな所に行かなくても社内でもやれることってたくさんあるのでは？
RSGTに限らず社内外のコミュニティイベントに参加したり、主催している人は社内にたくさんいて
実は手の届くところにあるものを見てこなかった、
実は自分がRSGT2024で受けた衝撃の幾らかは社内でも再現できるものだったのかもしれない
実際スポンサーブースで先輩社員と話しているだけでとても有意義だった訳で



# この体験を"共有する"ではもったいない　　だから
はじめ「RSGT2024に初めて参加して見えた景色」というタイトルでこの記事を書き始めたときにはこの考えは全く頭になく
ただ単純に自分が初めて社外コミュニティイベントなるものに参加して　そこで受けた・感じたことを言語化しよう、そして雰囲気の幾らかが伝われば良いな程度に書き進めていた
でもそれって本当に価値あるもの？
本当は同じ場所に立って、その人自身の体験として感じて欲しいんじゃないの？
　
　
　
とは言っても社外の、しかもオンサイトのイベントに参加するのはとてもハードルが高い
高くて目に入っていなかったり、拒絶しちゃったり
でももし同じものを社内で体験できるなら
心理的なハードルはかなり下げられるしチケット争奪戦という物理的なハードルもない
きっと社外イベントに参加するよりハードルは遥かに低いはず
　
　
　
私は図らずもいきなりRSGTに参加という強烈な体験をしてしまったけど
この衝撃をまだ体験したことのない人にも体験して欲しいと感じてしまった
でも私と同じように社外コミュニティへの参加にハードルを感じてしまう人が殆どで、無理矢理超えさせるようなことはしたくないとも思う（そういう人・行為がとても嫌いだった）

必要なのは社外コミュニティにつながるような前段的・中間点的なコミュニティ
私が感じたものと同じ衝撃を感じたいと思える人が増える場所なのではないか

そういう雰囲気というか空間が社内あったら幸せだし、それは自分で作るものなのかも
MacBookとiPhone間で連携カメラが使えない時のTips

## 連携カメラとは？

Macで通話したりするときに、iPhoneをWebカメラやマイクとして使うことができる機能です。iPhoneの方が比べ物にならないくらい画質がいいので、通話の時に重宝します。

## まずは公式

なんか急に動かなくなってハマったので解決策をメモする。

まずは公式ドキュメント通りにやってみてください。

https://support.apple.com/ja-jp/guide/mac-help/mchl77879b8a/mac

- iPhoneの設定→一般→AirPlayとHandoff→連携カメラ がONか確認
- Wi-FiとBluetoothはオンになっていますか？
- 一回USBでMacと接続してみましょう。信頼できていますか？（感情ではなくシステム的な意味でw）

## 必殺コマンド

ターミナルでこのコマンド打つと治ります。

```zsh
% sudo killall ContinuityCaptureAgent
```

キャプチャらへんのプロセスを斬る(kill)だけです。

## 環境

```
shirokuma89dev@shiro89dev.local
-------------------------------
OS: macOS 14.2.1 23C71 arm64
Host: Mac14,2
Kernel: 23.2.0
Uptime: 8 days, 23 hours, 8 mins
Packages: 67 (brew)
Shell: zsh 5.9
Resolution: 1710x1112
DE: Aqua
WM: Quartz Compositor
WM Theme: Blue (Dark)
Terminal: iTerm2
Terminal Font: UDEVGothic35NFLG-Regular 16
CPU: Apple M2
GPU: Apple M2
Memory: 4335MiB / 24576MiB
```
AL2023学習メモ➀ OpenJDK 17.0.9導入

# 前置き
学習メモをまとめています。
私と同じ初心者さんの助けになれば幸いです。

# この記事でわかること
 1\.AL2023（amazon linux 2023）でのOpenJDK 17.0.9インストール方法
 2\.javaファイル作成方法
 3\.javaファイルコンパイル方法
 4\.コンパイルしたクラスの実行方法
 
:::note warn
2024年1月13日現在の情報です。
今後のアップデートで、OpenJDKのバージョンが上がっていく可能性があります。
:::

# 事前環境
* EC2
    * AL2023
# 1\.インストール方法
AL2023で、OpenJDKをインストールする方法は非常に単純です。
AWSで既にパッケージが用意されているため、そこからインストールすることになります。

* java-17がパッケージとして用意されているかを確認
```
# yumのsearchコマンドでjava-17に該当するパッケージを検索
$ sudo yum search java-17
```

```
# 実行結果
メタデータの期限切れの最終確認: 21:16:11 時間前の 2024年01月11日 02時51分26秒 に実施しました。
=========================================================== 名前 一致: java-17 ============================================================
java-17-amazon-corretto.x86_64 : Amazon Corretto development environment
java-17-amazon-corretto-devel.x86_64 : Amazon Corretto 17 development tools
java-17-amazon-corretto-headless.x86_64 : Amazon Corretto headless development environment
java-17-amazon-corretto-javadoc.x86_64 : Amazon Corretto 17 API documentation
java-17-amazon-corretto-jmods.x86_64 : Amazon Corretto 17 jmods
```
*  リストにあるjava-17-amazon-corretto-develをインストールする
    * java-17-amazon-corretto-develは開発用のツール
    * コンパイル用のjavacも入っているため、こちらをインストール
```
# パッケージをインストール
$ sudo yum install -y java-17-amazon-corretto-devel

# javaのバージョン確認
$ java --version

# 実行結果
openjdk 17.0.9（以下略）

#javacのバージョン確認
$ javac --version

# 実行結果
javac 17.0.9
```

# 2\. javaファイル作成方法
作成箇所は、とりあえず/usr/binディレクトリとします。
今後も使う可能性があるなら別の箇所で作成してください。
```
#ディレクトリ移動
$cd /usr/bin

#javaファイル作成
$sudo vi HelloWorld.java

#以下の記述をエディタに追加
#なお、「I」でインサートモード、「ESC」でインサートモード終了、:wで保存、:qでエディタ終了です。

public class HelloWorld {
	public static void main(String[] args) {
		System.out.println("java実行出来たよ！");
	}
}
```
```
#作成出来ていることを確認する
$ls

#実行結果
#HelloWorld.java　（以下略）
```
 
# 3\. javaファイルコンパイル方法
```
#javacでコンパイルし、javaファイルを実行可能状態にする
#権限ではじかれる可能性があるので、sudoでコマンドを実行する
$sudo javac HelloWorld.java

#コンパイル出来ていることを確認する
$ls

#実行結果
#HelloWorld.class　HelloWorld.java （以下略）
```

# 4\. コンパイルしたクラスの実行方法
```
$sudo java HelloWorld
#「Java実行出来たよ！」と表示されれば成功です
```

# 後書き
長くなりましたが、以上がOpenJDKをインストールしてから、実行するまでの手順です。
かなり丁寧に書きましたが、私はこのぐらい丁寧の方が助かるので、丁寧にしました。
今後もこんな感じで書きたいですね。
NetworkX入門(4)

# NetworkX グラフ型
DiGraphのついで、他のグラフ型も見ておく：

- Graph
- DiGraph
- MultiGraph
- MultiDiGraph

[NetworkX公式](https://networkx.org/documentation/stable/reference/classes/index.html)に親切な説明があるのだけれど、図がない。図があった方がわかりやすいと思う。

## Graph (無向グラフ)
例えば①→②というエッジがあったとして、さらに②→①というエッジを追加すると、②→①は①→②に読み替えられる。
AliceとBobが友人だったとしたら、Alice→BobとBob→Aliceの2個のエッジは不要で、Alice-Bobという１つの無向エッジで十分ということ。

![file04_graph.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78475/fe8808f3-ad7a-5324-327e-f1a9edb7c5e6.png)

## DiGraph (有向グラフ)
例えば①→②というエッジがあったとして、さらに②→①というエッジを追加することができる。
AliceとBobが互いに借金し合っているとしたら、Alice→BobとBob→Aliceという2個のエッジが必要。

![file04_bigraph.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78475/41d4e8b0-fc7e-8f53-e5c5-7ec00758780d.png)

## MultiGraph (１組のノードに対し複数エッジを持てる無向グラフ)
MultiDiGraphの無向版。

## MultiDiGraph (１組のノードに対し複数エッジを持てる有向グラフ)
例えば①→②というエッジがあったとして、さらに①→②というエッジを追加することができる。
BobがAliceから100円借りていて、それを返さずにさらに200円借りたとしたら、同方向の2個のエッジが必要。

![multi_di.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78475/9259cce4-0a0a-4a14-1250-506bbaf5ae6c.png)

ちなみに、NetworkX+MatplotlibでMultiDiGraphを作ろうとしたが、矢印が重なってしまったので、手描きの絵にした。エッジにラベルを表示させるようにすれば、矢印をそれぞれ出してくれるのだろうか？
ネットワークACL

## はじめに
この記事はAWS SAA試験勉強のための、ネットワークACLに関する知識のまとめです。

## ネットワークACLとは

VPCの**サブネット**に関連付けられて、ネットワーク上の着信トラフィックリクエストをフィルタリングする機能。(セキュリティグループはインスタンス。)

Webサーバへの特定のIPアドレスからのアクセスを拒否する時に用いる。

## ネットワークACLの基本的性質

- ネットワークACLはステートレスであるため、アウトバウンド通信の許可設定も必要となる。その場合は、PC側の広範囲なポート番号が必要となるため、エフェメラルポートの設定が必要となる。これは1024-65535のポート番号範囲でSSHを許可する設定である。
- ネットワークACLはサブネットとVPCに対するプロトコル通信の許可と拒否を設定するためのファイアウォールである。インスタンスへの通信許可を設定することはできない。
- ネットワークACLを直接にアプリケーションサーバーに設定することはできない。

## ネットワークACLルール

ネットワークACLルールは低い値から高い値に順番に評価されて、低い値が優先されるルールとなっています。

## ネットワークACLとセキュリティグループ
ネットワークACLおよびセキュリティグループは共にURLに基づいてリクエストをフィルタリングすることができません。
- セキュリティグループ
特定のインスタンスに対して不審なIPアドレスからのアクセスをブロックしたい場合、該当インスタンスのセキュリティグループに該当IPを許可しないルールを追加します。
- ネットワークACL
サブネット全体に対して不審なIPアドレスからのアクセスをブロックしたい場合、ネットワークACLに拒否ルールを追加します。
Linuxカーネルアップデート後の有線LAN問題の解決法

## 概要
Linuxカーネルをアップデートしたところ、有線LANが認識されなくなってしまいました。以下は、この問題を解決するための手順です。
また問題解決にあたり以下の記事を参考にさせて頂きました。
https://qiita.com/bunnyhopper_isolated/items/40aea93b72fb11a0d6a0

## 環境

マザーボード：PRO B760M-A WIFI
カーネルバージョン：6.2.0-39-generic
LANコントローラ：Realtek RTL8125 2.5GbE Controller
## 解決手順

### 1. カーネルのインストール
VirtualBox上のUbuntu 22.04で、必要なカーネルバージョンをインストールします。
```bash
sudo apt install linux-image-6.2.0-39-generic
```
これにより、ドライバとカーネルバージョンの互換性を確保します。

### 2. カーネルの選択
システムを再起動し、GRUBメニューから「Advanced options for Ubuntu」を選択します。ここで、6.2.0-39-genericカーネルを選択して起動します。

### 3. カーネルヘッダーのインストール
新しいカーネルに対応するヘッダーをインストールします。
```bash
sudo apt -y install linux-headers-$(uname -r)
```

### 4. パッケージのアップデート
最新のパッケージに更新します。
```bash
sudo apt update
sudo apt upgrade
```

### 5. ドライバのダウンロード
Realtekの公式サイトからRTL8125用のドライバをダウンロードします。
https://www.realtek.com/en/component/zoo/category/network-interface-controllers-10-100-1000m-gigabit-ethernet-pci-express-software

### 6. ドライバのビルドとインストール
ダウンロードしたドライバのディレクトリに移動し、以下のコマンドでドライバをビルドし、インストールします。
```bash
sudo sh autorun.sh
```

### 7. ドライバファイルのコピー
ビルドされたr8125.koファイルをVirtualBox環境から実際のシステムにコピーします。この過程で「invalid module format」というエラーが発生した場合は、カーネルのバージョンに不一致がある可能性が高いです。そのため、カーネルのバージョンを再度確認し、必要に応じて対応するバージョンに合わせてみてください

### 8. ドライバの反映

手順を完了した後、変更をシステムに反映させるために次のステップを実行します。

 まず、以下のコマンドを使って、新しくビルドされたドライバを一時的にシステムに適用します。
```bash
sudo insmod /lib/modules/6.2.0-39-generic/kernel/drivers/net/ethernet/realtek/r8125.ko
```
このコマンドは、r8125.koファイルをカーネルモジュールとして直接読み込みます。
数秒後、ネットワーク接続が復活していることを確認します。これにより、ドライバが正しく機能していることが分かります。

次に、以下のコマンドを実行して、再起動後もドライバが有効になるようにします。
```bash
sudo depmod -a
```
このコマンドは、ドライバの依存関係を更新し、システムが再起動した際にもドライバが自動的に読み込まれるようにします。

以上の手順を実行した後、システムを再起動して、すべての変更が正しく適用されていることを確認します。

## まとめ
この記事では、Linuxカーネルをアップデートした後に有線LANが認識されなくなった問題の解決法を紹介しました。特に、autorun.shを実行した際のエラー解決には苦労しましたが、カーネルヘッダーの更新とシステムパッケージのアップデートにより、この問題を克服することができました。この記事が同じような状況に直面している方々にとって、問題解決の一助となれば幸いです。
Looker Studio にて会社ホームページの画像からテーマを作成する方法

## 概要

この記事では、Looker Studioを使用して、会社のホームページの画像から、コーポレートカラーに基づいたレポートテーマの作成方法を詳しく説明します。具体的には、あるサッカーチームのホームページのデザインを参考に、レポートのテンプレートを作成する手順を紹介します。このテンプレートを使用することで、レポートのデザインを統一し、エンブレムや企業ロゴを追加することで、プロフェッショナルな見た目のレポートを作成することができます。

某サッカーチームのホームページから次のデザインのレポートを作成する手順を紹介します。利用しているデータはチームと関係のないものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/17546127-b538-73a8-9f32-863e773d9d6b.png)

グラフなどを除いたページをテンプレートとして保持させておくことで、デザインの共通化を図ることができます。左上にエンブレムや企業ロゴを配置すると、より洗礼されたレポートとなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/120e5f36-8d46-1fef-a28f-f147a825d039.png)


## 手順

### 1. ホームページ等からテーマを作成するための画像を取得

＜省略＞

### 2. `ファイル`タブ -> `テーマのレイアウト`を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/7fb96b20-cd80-c1f6-42ea-7729bd0197fc.png)

### 3. `テーマとレイアウト`ウィンドウにて`画像からテーマを抽出` -> `パソコンからアップロード`を選択し取得した画像を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/6cc5b66f-d4f5-2614-f5ff-17f4b2cb18e4.png)

### 4. 表示されたテーマから任意のテーマを選択後、`適用`を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/4236a7bf-fb34-97f1-e191-58c9c62e556c.png)

### 5. グラフを追加してテーマが追加されたことを確認（表示しているデータは関係のないデータ）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/8ea73266-2856-2a6d-ad9b-40013d4d4f61.png)

### 6. 図形を追加してレポートを調整（左上に画像を追加できる）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/7e70be99-8c5d-acc5-4370-39fda6383f43.png)

### 7. ページを複製後、グラフとコントロールなどを削除したページを非表示して保持し、テンプレートとして保持

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/120e5f36-8d46-1fef-a28f-f147a825d039.png)
RocketMQ、Docker Composeによるテスト環境の構築およびSpringBoot3.0へのインポート

RocketMQはよく使用されるメッセージキューです。以下、ワンクリックでテスト環境を構築し、SpringBoot3.0にインポートする方法について説明します。

## テスト環境
ここではテスト環境をDocker Composeを使用してワンクリックでデプロイします。

使用するファイルは以下の通りです:
![Pasted image 20240112205132.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322984/1fa8ba31-8ac9-e6f5-6a8a-2e44bb36c690.png)

docker-compose.yamlの設定は以下の通りです：
```yaml
version: '3.3'

services:

  namesrv:

    image: apache/rocketmq:4.9.4

    container_name: rmqnamesrv

    ports:

      - 9876:9876

    environment:

      JAVA_OPT_EXT: "-server -Xms512m -Xmx512m"

    volumes:

      - /opt/rocketmq/namesrv/logs:/home/rocketmq/logs

    command: sh mqnamesrv

    restart: always

  broker1:

    image: apache/rocketmq:4.9.4

    container_name: rmqbroker

    links:

      - namesrv

    ports:

      - 10909:10909

      - 10911:10911

      - 10912:10912

    environment:

      NAMESRV_ADDR: namesrv:9876

      JAVA_OPT_EXT: "-server -Xms512m -Xmx512m  -Drocketmq.broker.diskSpaceWarningLevelRatio=0.99"

    volumes:

      - ./logs:/home/rocketmq/logs

      - ./store:/home/rocketmq/store

      - ./conf/broker.conf:/opt/rocketmq-4.9.4/conf/broker.conf

    command: sh mqbroker -c /opt/rocketmq-4.9.4/conf/broker.conf

    restart: always

  dashbord:

    image: apacherocketmq/rocketmq-dashboard:1.0.0

    ports:

      - 10081:8080

    environment:

      JAVA_OPTS: "-Drocketmq.namesrv.addr=namesrv:9876"

    restart: always

  rmqconsole:

    image: styletang/rocketmq-console-ng

    container_name: rocketmq-console

    restart: always

    ports:

      - 11112:8080

    depends_on:

      - namesrv

    volumes:

      - /etc/localtime:/etc/localtime:ro

      - /home/rocketmq/console/logs:/root/logs

    environment:

      NAMESRV_ADDR: namesrv:9876

      JAVA_OPTS: "-Drocketmq.namesrv.addr=namesrv:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false  -Drocketmq.broker.diskSpaceWarningLevelRatio=0.99"
```
broker.confの設定は以下の通りです：
```yaml
brokerClusterName = DefaultCluster

brokerName = broker-1

brokerId = 0

deleteWhen = 04

fileReservedTime = 72

mapedFileSizeConsumeQueue=300000

mapedFileSizeCommitLog=1073741824

maxMessageSize=65536

autoCreateSubscriptionGroup=true

autoCreateTopicEnable=true

defaultTopicQueueNums=4

brokerRole = ASYNC_MASTER

flushDiskType = ASYNC_FLUSH

brokerIP1 = xxx.xxx.x.x //ここにあなたのローカルエリアネットワークのIPを記入してください。
```
これら2つのファイルを準備した後、Docker-compose.yamlがあるディレクトリで以下のコマンドを実行します。
```bash
docker compose up -d //旧バージョンではdocker-compose up -d
```
起動が完了したら、127.0.0.1:10081にアクセスしてダッシュボードで起動状態を確認できます。

## SpringBoot3.0へのインポート
このブログを書いている時点では、まだ2.2.3バージョンです。
```groovy
implementation 'org.apache.rocketmq:rocketmq-spring-boot-starter:2.2.3'
```
このバージョンを使用する場合は、META-INF内で手動で以下をインポートする必要があります。
```text
org.apache.rocketmq.spring.autoconfigure.RocketMQAutoConfiguration
```
上記のコードを以下の画像に示されているファイルに手動で配置してください。
![Pasted image 20240112205927.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322984/93c5a2f6-34a4-648e-6095-36f07a416876.png)
マインドマップ 無料 おすすめ，初心者におすすめ

1. マインドマップとは何か？ マインドマップは、情報を視覚的に整理するためのツールです。中心のアイデアから放射状に広がる枝を描き、キーワードやイメージを用いて情報を組み立てます。この手法は、複雑な情報を簡潔にまとめ、アイデアの発想やメモ取り、プロジェクト計画に非常に有効です。

2. 初心者におすすめの無料マインドマップツール 初心者にとって、使いやすく、費用がかからないマインドマップツールの選択は重要です。ここでは、無料で利用できるおすすめのマインドマップツールをいくつか紹介します。

Flowlist.jp

特徴：大纲ノートと思维导图ツールを組み合わせたもので、モバイル端末での使用に特に適しています。大纲の編集や思维导图の共有が可能で、豊富な思维导图テンプレートを提供しています。

適用：個人のアイデア整理や小規模チームでのプロジェクトに最適。

3. マインドマップの使い方 マインドマップの基本的な使い方には、以下のステップが含まれます。

中心のアイデアを定める：マップの中心には、テーマや主題となるアイデアを置きます。

主要な枝を描く：中心から放射状に主要な枝を描き、それぞれの枝に主要なキーワードを配置します。

サブ枝を加える：各主要枝から更に詳細なサブ枝を広げ、関連するアイデアや情報を追加します。

色やイメージを使う：視覚的な記憶を促進するために、色やイメージを使って情報を強調します。

4. マインドマップを活用するコツ 初心者がマインドマップを最大限に活用するためのコツは次のとおりです。

シンプルに始める：複雑に考えすぎず、基本的な構造から始めて徐々に発展させまし
UbuntuでHTTPサーバを用意してみる（wiremock, docker）

記載日 : 2024/01/12

備忘録として、HTTPサーバを用意する手順を記載します。
なお、HTTPサーバは　rodolpheche/wiremock　のdocker imageを使って起動します。

## 環境
OS : Ubuntu 22.04
dockerインストール済
docker-composeインストール済
VSCodeインストール済（拡張機能からGit Graphをインストール済）
curlインストール済

## ファイル構成
project
　|
　|- docker-compose.yml


## 作業 (計5分)
### 1. docker composeファイルを作成する (2分)
HTTPサーバを用意するにあたり、rodolpheche/wiremockのdocker imageを使ったdocker-compose.ymlファイルを作る。ファイルの記述は以下の通り。

~~~
version: '3'
services:
  http_server:
    image: rodolpheche/wiremock:latest-alpine
    container_name: http-server
    ports:
      - "8080:8080"

    restart: always
~~~

docker-compose.ymlファイルが容易で来たら、以下コマンドでFTPサーバを起動する。

~~~
docker compose up -d
~~~

### 2. HTTPサーバへのデータ登録 （2分)
以下のパスへデータ登録してみる。
　`/testpath/data/1`

以下curlコマンドを実行して、データ登録する。
rodolpheche/wiremockでは、データ登録するときには`http://～:8080/__admin/mappings`というパスへPOSTすれば良いらしい。
~~~
curl -X POST "http://localhost:8080/__admin/mappings"\
     -H "Content-Type: application/json"\
     -d '{"request":\
           {"method":"POST",\
             "urlPath": "/testpath/data/1",\
             "bodyPatterns":\
               [{"equalToJson":\
                 {"jsonrpc":1,\
                   "method":"get_value",\
                   "params":["a", "b"],\
                   "id":1}}],\
             "basicAuthCredentials":\
               {"username": "uname",\
                 "password": "P@ssw0rd"}},\
           "response":{\
             "status": 201,\
             "headers":{\
               "Content-type": "application/json"},\
             "jsonBody":{\
               "id": 1,\
               "OS": "Ubuntu",\
               "body":{\
                 "color": ["red", "blue", "green"],"style": "line"}}}}'

~~~

### 3. 動作確（データ取得）（1分)

HTTPサーバにリクエストを投げて、先ほど登録したデータを取得できるか確認する。
次のcurlコマンドを実行する。
~~~curl
curl -X POST http://localhost:8080/testpath/data/1 \
     -H 'Content-Type: application/json'\
     -u uname:P@ssw0rd\
     -d '{"jsonrpc": 1,"method": "get_value", "params": ["a", "b"], "id": 1}'
~~~

レスポンスに以下が返り、登録したデータが帰ってきたことが確認できる。
~~~
{"id":1,"OS":"Ubuntu","body":{"color":["red","blue","green"],"style":"line"}}
~~~


### 4. VSCodeのdocker（拡張機能）で Permission Denied エラーが出ることの対応
環境を用意した時に、"Got Permission denied while trying to connect to the Docker daemon socket"エラーが出て、状態が見れない状態になりました。

章 ”参考にさせて頂いたサイト” のサイトを参考にさせて頂き解決しました。
dockerグループへ自分のユーザを追加して動くようになりました。
~~~
# dockerグループへユーザを追加
$ sudo gpasswd -a USER_NAME docker
~~~


## 参考にさせて頂いたサイト
・wiremockのdocker image
https://hub.docker.com/r/rodolpheche/wiremock/tags


・VSCodeのDockerで、Permission Diniedが出た件の対応
https://www.eureka-moments-blog.com/entry/2023/09/24/222354
https://akamist.com/blog/archives/3536