OmniAICreator/Qiita-1.07M huggingface dataset:
Amazon configとAWS System Managerで組織ルールをらくらく監査　その２

#### 前回、AWS ConfigやSystems Managerの準備をしました
https://qiita.com/Misshii/items/ed260af83a374f437fdb

#### 今回は、組織ルールでAWSリソースにOwnerタグを付与することとなっていたとして、EC2にOwnerタグが付与されていない場合、EC2インスタンスが自動停止する設定を加えたいと思います。

## AWS Configの新規ルールを追加する
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141348/86314cfa-5fc1-c2a8-fb12-e78b6035faf4.png">

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141348/3d4144d1-c9e5-bd34-1202-22ee027c97e6.png)

## ルールタイプの選択と、AWSに初めから用意されているrequired-tagsを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141348/380c81ed-0565-c7c0-58c1-bcddac64e1e8.png)


## 評価モードで、必須タグ名を「値」にいれて（今回のケースはタグ名がOwnerで、値にOwnerを入れる）、次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141348/2017b832-a9b0-e303-1d5d-764388392ad5.png)

## ルールを追加すると、数十秒〜数分後には自動監査がはじまります
下の例では、required-tagsの非準拠リソースが３つ検出されました
この時点では、まだ自動修復アクションを設定していません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141348/66cd17dc-ae67-64e8-caee-ce36d56c92cb.png)


## 次に、自動修復アクションで必要となるSSM用のIAMロールを以下の内容で作成する
作成したら、「ARNの値」が後で必要になるので控えておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141348/687240ac-6c2e-f762-ae20-45cb25cccefe.png)


## required-tagsに、自動修復アクションの設定を追加する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141348/41b5240c-aee7-c9ac-73db-5f6b4fe25f8d.png)

## 修復アクションは、AWSに最初から用意されている「AWS-StopEC2instance」を選択
パラメーターのAutomationAssumeRoleに先ほど控えた「ARNの値」を入れて、「変更を保存」
これで、設定完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141348/f047238f-cd8c-a056-459d-7de509d813a9.png)

## 動作確認
試しにOwnerタグを付与せずに、EC2インスタンスを新規作成し、起動する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141348/0e437648-d726-69a8-51d4-13bf6c84623a.png)

## AWS Configでタグが無いことで自動検知され「非準拠」になりつつ、インスタンス停止の「アクションの実行がキューに入りました」と表示されました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141348/f18d3032-3aac-64d1-db6b-92490dcb4c3f.png)

## EC2インスタンスが自動停止しました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141348/c61f7b66-d323-61f9-8774-f1b12f5a3675.png)
やさしいD言語クイズ（その４）

# はじめに
やさしいD言語クイズの第４回です。
クイズを通して、D言語の言語仕様を紹介することが目的です。
これをきっかけにD言語に興味を持ってもらえると幸いです。

# クイズの前提
D言語コンパイラ [DMD](https://dlang.org/download.html) v2.106でのコンパイル、実行結果をクイズの正解とします。

# 問題１０
ソースコードをコンパイル、実行すると、どんな出力結果になるでしょうか。

```d:
import std;

void main()
{
    int a, b, c;
    a = b = c = 2;
    f(a, b, c);
    writeln(a, b, c);
    f(a, b, c);
    writeln(a, b, c);
}

void f(int a,out int b,ref int c)
{
    a++;
    b++;
    c++;
}
```

# 問題１１
ソースコードをコンパイル、実行すると、どんな出力結果になるでしょうか。

```d:
import std.stdio;

void f(int[] i){
    write("1");
}
void f(const int[] i){
    write("2");
}
void f(const shared int[] i){
    write("3");
}
void f(const inout shared int[] i){
    write("4");
}
void f(inout(int)[] i){
    write("5");
}

void main(){
    int[]           i1 = [0];
    const(int)[]    i2 = [0];
    immutable int[] i3 = [0];
    shared int[]    i4 = [0];
    f(i1);
    f(i2);
    f(i3);
    f(i4);
}
```

# 問題１２
ソースコードをコンパイル、実行すると、どんな出力結果になるでしょうか。

```d:
import std;
void main()
{
    auto i = ubyte.min;
    writeln(i.sizeof);
    writeln(i.stringof);
    writeln(typeof(i).stringof);
    auto s = (++i).stringof;
    writeln(i);
}
```

:::note warn
ここから回答編です。ネタばれ注意！！
:::

# 問題１０の答え

<details><summary>問題１０の実行結果</summary><div>

```text:実行結果
213
214
```
</div></details>

答えへの補足
関数のパラメータについての問題です。
関数`f`のパラメータについて
* `int`型は値渡しのため、`main`関数の変数`a`に影響を与えません。
* `out int`は参照渡しとなり、関数呼び出し時に初期化(`= 0`)されます。
  `main`関数の変数`b`の値に影響を与えます。
* `ref int`も参照渡しとなりますが、初期化を行いません。
  `main`関数の変数`c`の値に影響を与えます。

https://dlang.org/spec/function.html#parameters

# 問題１１の答え

<details><summary>問題１１の実行結果</summary><div>

```text:実行結果
1543
```
</div></details>

答えへの補足
[暗黙的な修飾子変換](https://dlang.org/spec/const3.html#implicit_qualifier_conversions)についての問題です。
呼び出し関数に一致する修飾子がない場合は、下図に従って暗黙的に変換されます。

https://dlang.org/images/qualifier-conversions.svg

`inout`については、以下を参照。

https://dlang.org/spec/const3.html#inout


# 問題１２の答え

<details><summary>問題１２の実行結果</summary><div>

```text:実行結果
1
i
ubyte
0
```
</div></details>

答えへの補足
[プロパティ](https://dlang.org/spec/property.html)についての問題です。
１行目は、変数`i`は`ubyte`型と推論されるので、そのサイズを表示します。
２行目は、変数名そのものを表示します。
３行目は、`auto`ではなく、推論された型名を表示します。
４行目は、`.stringof`は式の内容を評価しません。つまり`(++i).stringof`で`i`はインクリメントされません。

https://dlang.org/spec/property.html

# 参考までに
過去の出題内容はこちらです。

https://qiita.com/devmynote/items/2c3763246f74ef983fcd

https://qiita.com/devmynote/items/15d4b5c14fb500524aa5

https://qiita.com/devmynote/items/778e1c30d34265453902
オレたちのオブザーバビリティ実例編～都会の真ん中でオブザーバビリティした話～

システム監視をやっていると、様々なところで「オブザーバビリティ」という言葉を聞くが、可観測性という今までよりいい感じに監視するくらいのフワッとした意味合いで使われていることが多く正直よくわからなかったので、オブザーバービリティとは何なのか深掘りしてみた。

## この記事を読む際の心構え
きっとオブザーバービリティとは何かということがわかります。
ただし記事の内容を深く考えずに、とりあえず最後まで読んでみてください。

## 言葉の定義
こういう言葉の定義はまずwikipediaの情報を見てから考えるということで、wikipediaの情報をながめてみることにした。

>可観測性は、外部出力の知識からシステムの内部状態をどの程度推測できるかを 示す尺度です。
>https://en.wikipedia.org/wiki/Observability

はい。全くよくわかりません(笑)

次に、オブザーバビリティといえばやっぱり外すことができないリーダー的な立ち位置にいらっしゃるNew Relicさん。New Relicさんの中でオブザーバビリティがどのように解釈されているか見てみましょう。

>オブザーバビリティを簡単に説明すると、システムそのものを、動態からどれだけ理解できるかということです。制御理論では、オブザーバビリティとはシステムが外部出力する情報から、そのシステム内部の状態についてエンジニアが推測する方法として定義されています。
>
> https://newrelic.com/jp/blog/best-practices/what-is-observability

これを見るだけでも、まだ腑に落ちてきません。言いたいこととしては「オブザーバビリティによって、エンジニアはシステムの最適化に向けて能動的なプローチを取ることができます。」の部分ではないかと個人的に考えております。


次に、オブザーバビリティという言葉をググってみて、一般的に使われている言葉として個人的にしっくりくるものをいくつかピックアップしてまとめてみました。

オブザーバビリティとは二つの言葉の造語で、Observe （観察する）と ability （能力） で、その意味合いは観察する力。普段システムはユーザーの裏側で問題なく動いており、ユーザーもその事を意識することはありません。これが何らかの障害が発生した場合に普段の状態と比べてどういう点が違うかという観点で異常な部分をすばやく見つけて対処すること。傾向がわかっているなら異常な状態になる前に対処までしてしまおうよというのがシステム運用者の中で使われている本来のオブザーバビリティの意味合いではないかと解釈しました。

## オブザーバビリティの実例
ここから、オブザーバビリティの実例を見ていきましょう。


オブザーバビリティは観察する力という意味合いになりますね。普段の平均と異常値を見比べて対処するというのが本質的なところになるのは定義の部分でお伝えしました。

それでは、ここからはシステムのオブザーブではなく都会の真ん中でオブザーバビリティを試した話をしていきましょう（迷走

さてさて、街の中を歩いているといろんな所で見かける例のアレ・・・

そう、今回のオブザーブ対象は自動販売機です。


自動販売機の平均といえば、販売されている缶コーヒーやらお茶やら、あるいは紅茶やコーラのような清涼飲料水になるのかもしれません。世の中の清涼飲料水を販売する自動販売機の中に、ごく稀ですがたまに異常値と思われる変なものが販売されていることがあります。

たまたまみつけちゃったのがこれです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620986/6e923f7e-8fe2-de80-8df0-e966c36f0a0c.png)

コーンスープはよく見かけますが、過去オニオンスープを見たことは私の経験上はありません。ましてやカレーなんて初めて見ました。

ここに二つある異常値。これは試すしかない(笑)

ひとつだけ言えることとして、特殊なものが激安価格で売られている・・・それだけでお察しできそうな味。きっと見た目だけじゃないんでしょう。

ということで、まず最初にオニオンスープを試して見ました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620986/1e081884-6dbc-4301-dda1-95986f76d243.png)


缶を開けてひとくち、ゴクリ・・・

よくありそうなオニオンスープの香りが鼻に抜けつつ、小さくカットされたオニオンの粒が口の中に入ってきました。なるほど・・・。確かにタイトルの通りオニオンスープではあるけど、スープの味はちょっと薄いような・・。しかも飲めば飲むほどカットオニオンのエグ味が鼻に抜けてくる。きっとカットオニオンはない方が美味しいかもしれない。缶のサイズの割にカットオニオンがそこそこ入っていたせいか、一気にオニオンスープを飲み干したらちょっとお腹が膨れた。そういう意味ではアリっちゃありだけど、間違いなく次は買わないな、コレ。

それでは次いきましょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620986/90836d6d-5338-f814-ee7e-0c0714eab035.png)

カレードリンクというところで若干抵抗はあるのですが・・・

缶を開けてみるとカレーの香りがしますが、中の液体はサラサラとした感じ。どちらかといえばスープカレーといったほうがイメージしやすいのでしょうか。それではこちらもオブザーブ（能動的に観察というか体験）してみましょう（笑）

一口ゴクリといくと、カレーなのでスパイシーではありますがそこまで辛くなく、一般的な甘口カレーのあたりでしょうか。スープカレーのようにサラサラしていましたが、ドリンクということもあり味もやや薄めでスパイスカレーほど香辛料の香りはしてきません。なるほど・・たしかにおにぎりやパンと合わなくはないですが、これをおにぎりやパンと一緒に飲むなら私ならもう少しちゃんとしたカレーを食べたいと思いました。値段が値段なので~~冒険~~お試しするのはありですが、この値段でも次買うかというと個人的な感想ですがちょっと悩みます。

## まとめ
街中にあるものを~~オブザーブ~~能動的に体験してきた迷走オブザーバビリティの記事はいかがでしたでしょうか。観察すること、そして観察した結果どのようなアクションを起こすかという点ではシステム運用だけに限った話でもなく普段からこういったアンテナを張っていろいろ試してみると、色々なものがちょっと違った目線で観察できるかもしれません。

間違いなくどなたのお役にも立てていないはずですが、記事を読んで一ミリくらいはクスッと笑っていただけたら嬉しいです。
pythonの基本構文　selfとreturnによる書き方の違い

# はじめに

Carクラスのインスタンスの色を表示する一般的な方法としては、以下の２つのアプローチがあります。

# 属性への直接の入力

```python:python.py
class Car:
    def __init__(self, color):
        self.color = color

# インスタンスの作成
my_car = Car("red")

# 属性に直接アクセス
print(my_car.color)  # "red"が出力される

```

# ゲッターメソッドを使用


```python:python.py
class Car:
    def __init__(self, color):
        self.color = color  # selfを使ってインスタンスの属性を設定

    def get_color(self):
        return self.color  # returnを使ってインスタンスの属性を返す

# インスタンスの作成
my_car = Car("red")

# ゲッターメソッドを使って色を取得
car_color = my_car.get_color()
print(car_color)  # "red"が出力される


```

#  違いについて

* シンプルなアクセスが必要な場合：属性への直接アクセスを使用します。
* 追加の処理やカプセル化が必要な場合：ゲッターメソッドを使用します。

どちらの方法を使うかは、プログラムの要件や設計の方針によって異なります。
一般的に、属性の値を外部から変更されたくない場合や、属性の値を取得する際に何らかの計算や検証が必要な場合には、ゲッターメソッドを使う方が適しています。
Wordpressサーバー移転メモ


Wordpressのサーバー移転をしたときの自分用メモ
もうブログとかいらなくね？と思ったけど、色々やる方が面倒な気がしたので、そのまま移転
PHP7.4から8.2にも変わった

nginxやらPHPは入っている前提。

# サーバーの設定

nginxを利用しているので、
旧サーバーにある `/etc/nginx/conf.d/***.conf` の設定で新サーバーにも立てます。


```sh:新サーバー（confの確認・再起動）
sudo nginx -t
service nginx restart
```

# pluginをオフに

Wordpress UI上からオフにします
あんまり考えずに入れ替えたらWordpressのバージョンが古く、結果Yoast SEOのバージョンも古くなり、それがPHP8に対応していませんでした。
オフしてから切り替えましょう

https://github.com/Yoast/wordpress-seo/issues/17772

最悪PHP7系も入れて動かすこともできると思いますが、PHP7系はサポート切れてますからね

# ファイルの移動

ほんとそのままFTPとかSCPとかで移動すれば良い

```sh:local
scp <旧サーバー>:<wordpress置き場所> .
scp ./ <新サーバー>:<wordpress置き場所>

```

権限つける
つけ忘れても動きますが、パッケージ更新とかが自動でうまくできなくなります
今回はnginxを動かすwww-dataに切り替えましたがパーミッション変える方法とかも有ると思います。

```sh:新サーバーの上記データ送ったところ
chown -R www-data <wordpress置き場所>
chgrp -R www-data <wordpress置き場所>
```

# DBデータ移行

旧サーバーにおいてlocalhostに立ててた `blog` データベースのデーを取得。オプションはなしでも良さそう
この辺のユーザー名とかデータベース名とかは人によって異なるでしょう
DB名などは忘れていても `wp-config.php` に記載されています

```sh:旧サーバー
mysqldump -h localhost -u root -p blog > blog.sql
```

sqlを新サーバーに送る

```sh:local
scp <旧サーバー>:blog.sql .
scp blog.sql <新サーバー>:
```

ユーザー名なども `wp-config.php`  に記載されています。パスワードも直書きなので変えない場合はそのままでもいけます。
権限はとりあえず全部つけています

```sh:新サーバー
mysql -uroot -p
CREATE DATABASE `blog`;
CREATE USER 'blog'@'localhost' IDENTIFIED BY '*******';
GRANT ALL PRIVILEGES ON `blog`.* TO 'blog'@'localhost';
```

# 飛んでみる

これでもう動いているはず。
動いていなかったら画面に出ているエラーを見る、nginxのエラーを見るなど

# pluginをオン

オンして動作確認して終了です
【TypeScript】空オブジェクトの判定

# 空オブジェクトの判定ってどうするんだっけ？
空オブジェクトの判定を行いたかったので、下記コードを実行。
```ts
const obj = {};

if (obj === {}) {
    console.log('true')
} else {
    console.log('false')
};
// false
```
結果はfalesだった。
意味がわからなかったので、今回は備忘録としてこの記事を残す。

# なぜ"obj === {}"がfalseなのか？
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Strict_equality

> 両方のオペランドがオブジェクトである場合、同じオブジェクトを指している場合に限り true を返します。

MDNによると、`obj`と比較しようとしている`{}`は、別の新しいオブジェクトとして認識されるため`false`が返されるようです。

# では、空オブジェクトの判定はどうやってやるの？
いくつかやり方はあるみたいですが、一番知られてる方法として、下記のように`Object.keys`の`length`が`0`がどうか検証する方法があるみたいです。
```ts
const obj: Record<string, any> = {};

if (Object.keys(obj).length === 0) {
  console.log('empty');
}
```

# utils関数に整形
毎回`Object.keys(obj).length === 0`と書いてると手間なので、再利用できる形に整形します。
```ts
const isEmptyObject = (obj: object): boolean => {
    return Object.keys(obj).length === 0;
}

const obj: Record<string, any> = {};

if (isEmptyObject(obj)) {
  console.log('empty');
}
```

## 参考
https://qiita.com/takengineer1216/items/fffe440375ea0ff2443b

## 今回実装したコード

下記リポジトリに便利ツールを蓄積しているので、参照してみてください。

https://github.com/49takaya3989/toolkit_box#:~:text=%E7%A9%BA%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%8B%E3%81%A9%E3%81%86%E3%81%8B%E3%81%AE%E5%88%A4%E5%AE%9A%E3%81%99%E3%82%8B%E9%96%A2%E6%95%B0%EF%BC%9AisEmptyObject
wolfBootを使ってみる

# はじめに
[wolfSSL Inc.](https://wolfssl.jp/ "wolfSSL")社から提供されている組込み向けセキュアブートローダー wolfBoot を使ってみました。

# 使用機器
+ Windows11
+ WSL2
+ Ubuntu

# 手順
使用手順は[GitHub](https://github.com/wolfSSL/wolfBoot)にある**INSTALL.md**の手順に従って準備を進めます。
私は、WSL2のUbuntuを使用して環境を整えました。

WindowsのターミナルからUbuntuを起動してINSTALL.mdにある下記のコマンドを実行します。
```
$> git clone https://github.com/wolfSSL/wolfBoot.git
$> cd wolfBoot
wolfBoot$> git submodule init
wolfBoot$> git submodule update
```
これで準備が整います。
あとは、wolfBootのルートフォルダでmakeします。
```
wolfBoot$> make
```
ルートフォルダでmakeを実行するとデフォルトでSTM32F407用の実行ファイルが作られます。
下記のファイルが作成されれば準備は完了になります。
+ wolfBoot/factory.bin
+ wolfBoot/wolfboot.elf
+ wolfBoot/test-app/image.elf

# 編集後記
ドキュメントが揃っておりとても助かるのですが、途中参加の私には情報が多く、どこから手を付ければいいのか分からず何度も挫折しました。ようやくmakeまでたどり着くことができました。
今後は、**STM32F407**の評価ボードを持っていないので、**NUCLEO-F401RE**で動作できるようにwolfBootをカスタマイズして行きたいと思います。

# 参考
[WSLでUbuntuを起動したときに、指定されたファイルが見つかりませんとなったとき](https://qiita.com/kawauso5/items/9b8e64cc1a2421f8c4fc)
[gccのインストールでエラーになったとき](https://www.lisz-works.com/entry/wsl-install-gcc)
【Docker】Composeファイルってどうやって書くの？

DockerコンテナでのPostgreSQLの立ち上げを例にdocker-compose.ymlの書き方をまとめました。

# この記事から得るもの
- docker-compose.ymlの基本的な書き方

# 前提知識
- dockerの基礎知識
- 何のためにdocker-compose.ymlが必要なのか知っていること

※この記事はdocker-compose.ymlの書き方を説明したものであり、docker-compose.ymlの役割や必要性については言及していません。

# 最終的な成果物
この記事を最後まで読むと、以下のdocker-compose.ymlを自分で理解しながら書けるようになります。

```docker-compose.yml
version: '3'
services:
  db:
    image: postgres:15-alpine
    container_name: postgres-db-qiita
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: pass
    ports:
      - "55001:5432"
    volumes:
      - ./data:/var/lib/postgresql/data
      - ./init:/docker-entrypoint-initdb.d
```

# "version"とは

```docker-compose.yml
version: '3'
```
docker-compose.ymlのバージョンを指定します。

※公式ドキュメントでは記述不要とありますが、実際のプロジェクトではversion指定している場合が多くあるので今回は説明のために記述しています。

# "services"の中に書くもの
```docker-compose.yml
services:
  <サービス名1>:
    image: 使用するコンテナイメージ名
    container_name: コンテナ名
    environment:
      コンテナで使用する環境変数
    ports:
      - localhostのポート番号:コンテナのポート番号
    volumes:
      - ホストOS内のパス:コンテナ内のパス
  
  <サービス名2>:
    ...
    ...
```
servicesの中には起動するサービス群を記述します。サービス名の中にネストして詳細を記述していきます。

# image
```docker-compose.yml
services:
  db:
    image: postgres:15-alpine
```
imageには使用するコンテナイメージ名を記述します。今回はpostgres:15-alpineを使用します。
コンテナイメージは<a href="https://hub.docker.com/">docker hub</a>から探すことができます。

# container_name
```docker-compose.yml
version: '3'
services:
  db:
    image: postgres:15-alpine
    container_name: postgres-db-qiita
```
container_nameにはコンテナ名を記述します。
コンテナ名は自由に決めることができますが、何のコンテナかわかりやすい名前にしましょう。
記述していない場合は自動で名前が設定されます。

# environment
```docker-compose.yml
services:
  db:
    image: postgres:15-alpine
    container_name: postgres-db-qiita
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: pass
```
environmentはコンテナ内で使用する環境変数を記述します。今回はPostgreSQLのユーザ名とパスワードを設定しています。
POSTGRES_USERやPOSTGRES_PASSWORDはコンテナイメージによって決まった環境変数ですが、独自の環境変数を設定することもできます。

# ports
```docker-compose.yml
version: '3'
services:
  db:
    image: postgres:15-alpine
    container_name: postgres-db-qiita
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: pass
    ports:
      - "55001:5432"
```
portsではlocalhostで使用するポート番号（:の左側）とコンテナのポート番号（:の右側）を紐付けることができます。
PostgreSQLの場合はポート番号がデフォルトで5432になっています。localhostから接続するポート番号を指定したい場合に自分でポート番号を設定します。

# volume
```docker-compose.yml
services:
  db:
    image: postgres:15-alpine
    container_name: postgres-db-qiita
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: pass
    ports:
      - "55501:5432"
    volumes:
      - ./data:/var/lib/postgresql/data
      - ./init:/docker-entrypoint-initdb.d
```
volumesはホストOSのパス（:の左側）とコンテナ内のパス（:の右側
）で同期をとりたい場合に記述します。ボリュームやバインドマウントといいます。
PostgreSQLの場合データの永続化のためなどに使用することがあります。

# 参考記事
- https://docs.docker.com/get-started/08_using_compose/
第二世代　外部給電のための回路の改造

「aibo ers-11x/210で遊ぶ Advent Calendar 2023」の23日目です。

ERS-210のバッテリーについて、Loïc POLLIERさんのレポジトリbattmonを参考に、一から勉強したメモをまとめています。
https://github.com/lpollier/battmon/tree/master

1日目のERS-11xでの改造のようにERS-210も外部給電で動かせるようにして、実験しやすくしたりバッテリーの不安から解放されたいと考えました。
https://qiita.com/nakmura/items/12859bb67192f13170a0

今回はオリジナルの保護回路を改造し、外部給電の準備を進めたいと思います。

:::note alert
警告
この記事について作者はいかなる責任も負いません。
バッテリーの分解、改造は非常に危険な行為です。
:::

:::note
業務外の個人的な検討活動です。
:::

#### 保護回路の改造
- IC1, Q2, Q3の無効化
過充電や過放電を検出して端子6とセルの端子BAT-を切断する機構は外部給電には不要なので無効化しました。具体的にはQ2のソースとQ3のソースを短絡しました。

- IC21の無効化
過充電を検出してフューズF1を切断する機構も外部給電には不要なので、無効化しました。具体的にはフューズF1の1-3を短絡しました。

- BQ2040の無効化
セルの残量などを調査してaibo本体に回答するBQ2040も外部給電には不要なので無効化しました。具体的にはBQ2040を取り外し、代わりにESP32のI2C用の端子を取り付けました。

- ACアダプタからの出力をセルと交換
ACアダプタの出力を7.2Vに変換するステップダウンレギュレータの出力と交換しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/0ee4defe-bd2b-76b3-e0b3-d27d83685e77.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/e393cb6c-b08a-bc7c-285c-9acceafbf8c5.png)

#### ESP32のスクリプト
ESP32がBQ2040に成り代わってaiboに返答させます。
そのスクリプトは24日目に続きます。

#### 警告をもう一度
今回のAdvent Calenderでバッテリーセルの交換について考察しますが、非常に危険ですので知識と教養を深める目的で調べたことをまとめました。
十分な安全対策を講じなければ、実行することはお勧めできません。
重要なことなので、もう一度書きます。

:::note alert
警告
この記事について作者はいかなる責任も負いません。
バッテリーの分解、改造は非常に危険な行為です。
:::
【React(TypeScript)】カメラを使ってQRコードを読み取る

# 概要
カメラを使ってQRコードを読み取るライブラリは複数あります。色々試した結果、現時点(2023/12時点)で一番良いと思ったライブラリとその使い方をマイベストプラクティスとして共有させていただきたいと思います。

# やり方
ライブラリとして「react-xing」を使用します。コンパイル時にエラーが無く、コーディング量も非常に少なかったのでこのライブラリがお勧めです。

（他のライブラリは使い方が難しかったり、コンパイル時に参照ライブラリのバージョン問題と思われるエラーが発生して解消できませんでした。。）

https://www.npmjs.com/package/react-zxing


## ReadQRCode.tsx
これだけでカメラでQRコード読み取りができます。

```jsx
import { useZxing } from 'react-zxing'

export const ReadQRCode = () => {
  const { ref } = useZxing({
    onDecodeResult(result) {
      const text = result.getText()
      console.log(text)
    },
  })

  return (
    <div>
      <video ref={ref} />
    </div>
  )
}

export default ReadQRCode
```
Nuxt.jsでTailwindCSSを使用する際の設定

ディレクトリ構成
![ディレクトリ構成](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249803/322a3529-1244-8807-e8cd-2cdc2ad36754.png)

#### TailwindCSSのインストール
```
npm install -D @nuxtjs/tailwindcss tailwindcss@latest postcss@latest autoprefixer@latest`
```

#### tailwind.config.jsの生成
```
npx tailwindcss init`
```
#### ./tailwind.config.js
```javascript
/** @type {import('tailwindcss').Config} */
export default {
  purge: ["./components/*.{vue,js}", "./app.vue", "./nuxt.config.{js,ts}"],
  content: [],
  theme: {
    extend: {},
  },
  plugins: [],
  mode: "jit",
};
```

#### ./nuxt.config.ts
```typescript
// https://nuxt.com/docs/api/configuration/nuxt-config
export default defineNuxtConfig({
  devtools: { enabled: true },
  css: ["~/assets/css/main.css"],
  postcss: {
    plugins: {
      tailwindcss: {},
      autoprefixer: {},
    },
  },
});

```

#### ./assets/css/main.css
```css
@tailwind base;
@tailwind components;
@tailwind utilities;
```
RDS認証局証明書更新作業

🎅🦌こちらは ZYYX Advent Calendar 2023/12/16の記事です。✨🎄✨

# はじめに
今後もうやることはない作業かもですが、RDS認証局証明書の更新作業（ `rds-ca-2019` から `rds-ca-rsa2048-g1` ）について備忘録として残しておこうと思います。（というか私のQiita記事はほぼ自分向けの備忘録…）

# 概要
2023年8月末、

> [アクションが必要] 2024 年 8 月 22 日までに Amazon RDS 証明書と Amazon Aurora SSL/TLS 証明書を更新してください

といったメールが手元に何通も何通も飛んできました。
RDSのDBインスタンスに設定されているCA証明書の期限が切れるから更新してね、というお知らせです。（2019年10月にも、 `rds-ca-2015` から `rds-ca-2019` への変更対応がありました）

手順としてはRDSの「DB インスタンス証明書」の変更を、AWSコンソール上で操作するのみ。
ただ、DBエンジンの種類・バージョンによってはRDSの再起動が発生します。
この場合、本番稼働しているデータベースでは再起動のタイミング調整が必要です。

# 手順
最初に、変更対象のデータベースについて変更後に再起動が発生するかどうかを確認しましょう。AWSコンソール画面の「RDS」で、左側メニュー内下部にある「証明書の更新」をクリックします。

![スクリーンショット 2023-12-16 17.49.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128331/52ec19d5-895d-88de-11d5-2a0cab02e2d3.png)
　
「証明書の更新が必要なデータベース（件数）」画面にて該当データベースの「再起動が必要です（英語ではRestart Required）」列をチェック。
MySQLは古いバージョンだと再起動が発生するみたいです。
SQL ServerやMariaDBではバージョン問わず再起動が発生するみたいです。

![スクリーンショット 2023-12-16 17.53.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128331/176a7963-a961-8154-2dc5-38cc5ea48161.png)

　
 AWSコンソール画面の「RDS」で、該当データベースの「接続とセキュリティ」タブより状態を確認。 `rds-ca-2019` を設定してました。期限は2024/08/23。

![スクリーンショット 2023-12-16 17.20.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128331/c6a897fd-519d-58b1-649a-2ead73b47f39.png)

　
該当データベースの「変更」ボタンを押して変更画面に入ります。
認証機関で、  `rds-ca-2019` から `rds-ca-rsa2048-g1` に変更し、「続行」を押します。

![スクリーンショット 2023-12-16 17.14.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128331/9d24b907-92e1-b69d-2dbd-7dc119d27f1e.png)

　
次回の定期メンテナンス時間帯に適用か、即時適用かを選び「DBインスタンスを変更」を押します。
　
変更が適用されたら、表示内容も変わっていました。

![スクリーンショット 2023-12-16 17.20.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128331/d5dfa942-ed94-e545-2c18-6536d6c40b68.png)


# 補足
証明書は `rds-ca-rsa2048-g1` の他に、期限が100年後の `rds-ca-rsa4096-g1` `rds-ca-ecc384-g1` が選択可能でした。（Oracle、SQL Serverは `rds-ca-ecc384-g1` は選択不可）

`rds-ca-rsa4096-g1`と `rds-ca-ecc384-g1` は秘密鍵のアルゴリズムが今の `rds-ca-2019` で使用している `RSA2048` から、 `RSA4096` や `ECC384` に変わりますが、クライアント側で対応できてないなどの問題が発生するかも知れません。
なるべく他に影響が出ないようにしたいケースでは `rds-ca-2019` と同じアルゴリズムの `RSA2048` を使用している `rds-ca-rsa2048-g1` に変更するのがよいかと思います。

# おわりに
作業に入る前は、とりあえず期限の長いものを選べばいいのかな〜、とか思ってたのですが、調べてみると色々な情報が出てきて勉強になりました。
間違いのないように、分からないことは勘を頼りに突き進む…😅のではなく、ちゃんと調べる癖をつけておこうと思います。
GitLabのissue管理方法

GitLabのissueでチケット管理を行いますが、プロジェクトとしてissueで何をどう管理したいかによって、必要な設定や運用が変わります。

本資料ではGitLab(Self-Mnaged:Free版)で使用可能な機能での管理例を説明します。

## 概要

管理方法としては開発案件ごとに`マイルストーン`を作成し、`マイルストーン`にissueとマージリクエストを紐づけることで、その開発案件の作業状況を管理することになると考えています。

### ラベル

Azure Boradsではワークアイテムというチケットがあり、ワークアイテムは帳票自体をユーザが作成可能で、項目等のカスタマイズも可能です。そのため、Azure Boradsでチケット管理を行う場合には管理が必要となる情報に合わせてワークアイテムを作成して管理を行います。

但し、GitLabにはその機能がないため、ラベルという機能を利用することで任意設定可能な項目を代替します。

例えば、以下のようなラベルを定義し、マージリクエストやイシューに設定することで、そのマージリクエストやイシューに情報を付与することができます。ラベルは任意で定義可能なので、プロジェクトで管理したい情報に合わせて定義します。

以下がラベルの設定例となります。  
尚、Premium版では`::`で区切ることでスコープのラベルセットとして扱うことができます。

![sample_label.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575313/86d561cc-4d12-425e-3232-e110e83ddd39.png)

### issue

issueはタスク・バグ・機能追加等を管理するチケットとなります。  
以下はラベルを設定したissueの例となります。

![sample_issue.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575313/db24f12d-76c6-9fb1-5386-a9f8937de181.png)

尚、issueは色々な条件でフィルタ表示が可能です。  
また、標準機能で一覧をExportするにはメール送付が必要になります。Self-ManagedのGitLabでメールサーバがなくてメール送信が出来ない場合には、APIでExportするようなスクリプト等を作成する必要があります。

![sample_issue_filter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575313/fdc94ba8-3cae-895f-a6d9-09c2e4bd4cd5.png)

### マージリクエスト

マージリクエストはブランチからブランチにマージを行う際のレビュー・承認を管理するためのチケットとなります。  
以下はラベルを設定したマージリクエストとなります。

![sample_mr.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575313/55fec5f5-87cc-ba3b-94f0-2b1464e9d4f6.png)

マージリクエストもissueと同じようにフィルタ表示が可能です。  
また、標準機能で一覧をExportするにはメール送付が必要になります。Self-ManagedのGitLabでメールサーバがなくてメール送信が出来ない場合には、APIでExportするようなスクリプト等を作成する必要があります。

尚、ラベルはマージリクエスト内のコメントにも設定が可能であるため、マージリクエスト内のコメントでどのバグを摘出したか管理することも可能です。  
但し、コメントに設定したラベルはマージリクエスト全体に設定されていないため、この情報を機械的に取得するためにはAPIでマージリクエストのコメントから情報を抽出するようなスクリプト等を作成する必要があります。

![sample_mr_comment.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575313/f9def7e0-b034-d1df-8973-4c1f509c2728.png)

### マイルストーン

マイルストーンとはissueやマージリクエストをまとめて管理することが可能な機能です。  

マイルストーンは機能追加やバージョンアップ対応等を名前として、開始・終了期間を設定します。以下は設定例になります。

![sample_milestone.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575313/7a21dcc6-e326-c4dd-754f-f0fa230789e3.png)

マイルストーンを開くと以下のようにissueやマージリクエストのステータスを確認することが可能です。

![sample_milestone_issue.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575313/348e73f7-0a87-3e9a-bee9-501e7bbab90e.png)
AWS Skill Builder で完全日本語版の新たな生成系AI学習コンテンツが利用可能に！

生成系AI学習の第一歩はこれから、、という方向けのコースが、[Skill Builder](https://aws.amazon.com/jp/training/digital/)で新たに開設されました。
コース名は[AWS で始める生成系 AI for Entry (Japanese ONLY) (Na) 日本語実写版](https://explore.skillbuilder.aws/learn/course/internal/view/elearning/18330/aws-de-shimeru-sheng-cheng-xi-ai-for-entry-japanese-only-na-ri-ben-yu-shi-xie-ban)。

当記事は、当該コースのまとめ記事となります。

全体の構成は「生成系AIの基礎」「AWSでの生成系AI」の2章建てです。

## 生成系AIの基礎
### 生成系AIとは
新しいコンテンツやアイデアを生み出すことができるAI。
→基盤モデル（FM, Foundation Model）と呼ばれる膨大なデータに基づき事前にトレーニング（機械学習）された大規模モデルにより実現している。

### 機械学習(ML, Machine Learning)とモデル
例）オンラインショッピングサイトで、過去の購入履歴に基づいてお客様におすすめの商品を提供したい
**＜従来の古典的なプログラミング手法＞**
おすすめ商品の選定を担う「ルール」は**プログラマーが実装する**。
→そのルールが個々のお客様のニーズに当てはまるかは未知数。。商品数が多くなれば、その分ルールは複雑に。。

**＜MLアプローチ＞**
おすすめ商品の選定を担う「ルール」は**AIにより導き出される**。
→流れは次の通り。
1. お客様の年齢/季節ごとの売上データなどの重要な要素（パラメータ）を選び出し、それらが次に購入する商品にどう影響するかを予測する数式を作成する
2. コンピュータ（機械）でその数式にデータを代入して、各要素の影響度「重み」を繰り返し調整する＝トレーニング（学習）
3. トレーニングを経て、数式（モデル）が最適化される

補足）
|  | 従来の機械学習モデル | 基盤モデル |
|:-----------:|:-----------:|:------------:|
| 用途 | タスク特化型 | 汎用型 |
| 学習データ | 専用のデータ | 膨大なデータ |

#### ■基盤モデルの例
BERT、GPT、Amazon Titan、Claude、Cohere、BLOOM、Stable Diffusion、Hugging Faceなど

#### ■基盤モデルの主な種類
***Text-to-text***：簡単な自然言語プロンプトから、複数アプリケーションのためにテキストを生成
***Text-to-embedding***：検索や文書間の類似点検索などの用途向けに、テキストの数値表現を生成
***Multimodal***：自然言語プロンプトから画像生成・編集

### 基盤モデルを実務利用するパターン3つ
1. **プロプライエタリモデル**活用
1-a. **プロンプトエンジニアリング**：インプット（プロンプト）を試行錯誤することで、アウトプットをカスタマイズする方法。
前提を与えずにモデルに指示するZero-shot プロンプティング、前提を与えた上でモデルに指示するFew-shot プロンプティングがある。
1-b. **RAG(***Retrieval Augmented Generetion***)**：ユーザー独自のデータを参照させて、アウトプットをカスタマイズする方法。
ハルシネーションを抑制する効果がある。
2. **公開済みモデルをチューニング**
2-a.***Fine-Tuning***：ユーザー独自のデータを使って基盤モデルを追加でトレーニングして、基盤モデル自体をカスタマイズする方法。
3. **スクラッチでモデルを開発**

※数字が大きくなるにつれ、様々なコストが増大し、必要なスキルも増える。

### 基盤モデルの課題
1. 構築に膨大な費用とリソースが必要である。
2. 基盤モデルをソフトウェアスタックに統合し、アプリケーションとしての使いやすさを実現することが求められる。
3. 運用時に正しくない出力を監視する必要がある。

## AWSで生成系AIを活用する方法
### Amazon Bedrock
- サーバレス（完全マネージドサービス）
- AI21 Labs、Anthropic などが開発した基盤モデルから業務用途に合わせて選択し、単一のAPIで利用可能

### Amazon SageMaker
- 非サーバレス
- Amazon SageMaker JumpStart を使うと、公開されているさまざまな基盤モデルにアクセスして、スペックやコストを最適化した生成系 AI の開発・運用が可能

#### ■Amazon SageMaker JumpStart で基盤モデルを利用する方法
1. SageMaker コンソールでマネージメントコンソールから利用
1-a. 利用できるモデル、バージョンはリージョンによって異なる。
2. SageMaker ノートブックで1つずつ実行
3. SageMaker Studio（機械学習の統合開発環境）を使ってワンクリックでデプロイ

## 参考資料
[Machine Learning Basic（日本語実写版）](https://explore.skillbuilder.aws/learn/course/external/view/elearning/1741/aws-foundations-machine-learning-basics-japanese-na-ri-ben-yu-shi-xie-ban)
[基盤モデルとは何ですか？](https://aws.amazon.com/jp/what-is/foundation-models/)
[Amazon Bedrock Getting Started (Japanese) 日本語字幕版](https://explore.skillbuilder.aws/learn/course/external/view/elearning/18290/amazon-bedrock-getting-started-japanese-sub-ri-ben-yu-zi-mu-ban)
[Amazon SageMaker ノートブックで生成系 AI を開発](https://www.youtube.com/watch?v=4C8acMazp1E)
[Amazon SageMaker JumpStart で始める生成系 AI（日本語実写版）](https://explore.skillbuilder.aws/learn/course/external/view/elearning/18092/amazon-sagemaker-jumpstart-de-shimeru-sheng-cheng-xi-ai-japanese-only-na-ri-ben-yu-shi-xie-ban)
【New Relic】Synthetic Monitoringを用いてPhotonFusionの統計情報をお手軽に可視化してみた

## はじめに
この記事はNew Relic Advent Calender 2023 シリーズ1の16日目です。

ゲームやXRのサービスでは、マルチプレイ同期の実装を簡単にするSaaS製品のPhoton Fusionがよく使われます。

実際の運用ではプレイヤーのCCU(同時接続数)などを監視し、適切に設定変更をする必要があります。

そこで今回は、お手軽にSynthetic Monitoringを使って、PhotonFusionのCCU数を取得してダッシュボード化しようと思います。

## 使用するもの
- [Photon Analytics API](https://doc-api.photonengine.com/ja-jp/analytics-api/current/)
- [New Relic Synthetic Monitoring Scripted APIモニター](https://docs.newrelic.com/jp/docs/synthetics/synthetic-monitoring/scripting-monitors/write-synthetic-api-tests/)

## 事前準備
- [Photonの管理画面](https://id.photonengine.com/ja-jp)から、対象アプリIDと、アナリティクスAPI用のトークンを取得してください。
- New RelicのSynthetic MonitoringからScripted API モニターを新規作成し、60秒間隔に設定してください。また、Photon側で設定しているリージョンと揃えて設定してください。

## スクリプト
PhotonのアナリティクスAPIは4分ほどの遅延があるようなので、4分前〜3分前の60秒間を指定してAPIを叩いています。

```javascript:PhotonCCU.js
var assert = require('assert');

var options = {
  url: "https://counter.photonengine.com/Counter/api/data/app/appID/jp/ccu?start=-300s&end=-240",
  headers: {
        'accept': 'text/plain',
        'Authorization': 'hogehohe' //Photonダッシュボードで発行できるAPIトークン
        }
};

$http.get(options, 
  // Callback
  function (err, response, body) {
    if (err) {
      console.error('Request failed:', err);
      assert.fail('Request failed');
      return;
    }

    console.log(response.statusCode + " status code");
    assert.equal(response.statusCode, 200, 'Expected a 200 OK response');
    
    // Assuming the body returns a plain text value representing the CCU
    var ccu = parseInt(body, 10);
    if (isNaN(ccu)) {
      console.error('Failed to parse CCU from response:', body);
      assert.fail('Invalid CCU value');
      return;
    }

    // Send the CCU value to New Relic Insights as a custom event
    $util.insights.set('CCUValue', ccu);
    console.log("CCU : " + ccu)
  }
);
```

## ダッシュボード
下記のNRQLを入力してください。
```
SELECT max (custom.CCUValue) FROM SyntheticCheck SINCE 1 hour ago TIMESERIES
```


![スクリーンショット 2023-12-16 17.10.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254414/837b6e03-e808-885b-369a-d427b0441783.png)


## 終わりに
今回はSynthetic Monitoringで簡易的にCCUをメトリクス化してみましたが、よりカスタムするには[New Relic Flex](https://docs.newrelic.com/jp/docs/infrastructure/host-integrations/host-integrations-list/flex-integration-tool-build-your-own-integration/)に移行したほうが良さそうです。

また、Photonから提供されているアナリティクスAPIを用いましたが、これだけだとルームごとの情報が分かりません。
Fusionのクライアント側のAPI([SessionInfo](https://doc-api.photonengine.com/en/fusion/current/class_fusion_1_1_session_info.html)など)を叩かないと取得できないので、今後はCCU監視用のBotをUnityで作成し、NewRelicと連携したいと思います。
(~~Exit Gamesさん、ルームごとのアナリティクスAPI公開してくれてもいいんですよ…！~~)
【React(TypeScript)】React Routerでログインチェック、未ログインならログイン画面遷移、さらにログイン後にリダイレクトする

# 概要
React Routerで画面遷移前に共通処理を入れる方法は[以前の記事](https://qiita.com/kaden_taro/items/62694a21534a5bf8e992 "【React(TypeScript)】React Routerで画面遷移前にログインチェックなどの共通処理を入れる")でできるようになりました。
今回は画面遷移前にログインチェックを行い、未ログインの場合はログイン画面に遷移させ、さらにログイン後に元々の画面遷移先にリダイレクトする方法をマイベストプラクティスとして共有させていただきたいと思います。

# Router.tsx
PrivateRoutesで未ログインの場合はNavigateでログイン画面に画面遷移させます。この時、stateでリダイレクト先を渡します。リダイレクト先はuseLocation()を使ってlocation.pathnameで取得しています。

```jsx
const PrivateRoutes = () => {
  const location = useLocation()
  
  // 未ログインチェック
  // （isLoginを判定する処理は省略してます）
  if (isLogin === false) {
    return (
      <Navigate to='/signin' state={{ redirectPath: location.pathname }} />
    )
  }
  return <Outlet />
}

const Router = () => (
  <BrowserRouter>
    <Routes>
      <Route path="signin" element={<SignIn />} />
      {/* PrivaeRoutes内に設定された画面はサインインが必須になる */}
      <Route element={<PrivateRoutes />}>
        <Route path="home" element={<Home />} />
      </Route>
      <Route path="*" element={<Error404 />} />
    </Routes>
  </BrowserRouter>
)

export default Router
```

## SignIn.tsx
ログイン成功後、stateからリダイレクト先を取得できればリダイレクトさせます。

```jsx
type State = {
  redirectPath?: string
}

const SignIn = () => {
  const location = useLocation()
  const state = location?.state as State

  function handleSignInButton() {
    // サインイン処理
    
    (省略)

    // サインイン成功後
    
    const redirectPath = state?.redirectPath
    // リダイレクト先が指定されている場合
    if (redirectPath != null) {
      navigate(redirectPath)
    }
    navigate('/home')
  }

  return (
  
    (省略）
    
    <button onClick={() => { handleSignInButton() }}>
      サインイン
    </button>
  )
}
```
APIを使わず Slack の特定チャンネルを開くスクリプトを作りたい

# APIを使わずに特定チャンネルをサクッと開きたい

例えば times チャンネルなど、気軽に自身の思考を書き込むようなチャンネルをサクッと開きたいニーズがあると思うのでそういった場合に便利。

```zsh:open slack channel
# Safariで特定のURLを開く（チャンネルを右クリックしてURLのリンクをコピー
open -a "Safari.app" "https://xxxx.slack.com/archives/C06A3FAN4R4"

# 1秒待機
sleep 1

# Safariを終了させる
osascript -e 'tell application "Safari" to quit'
```

## BTTなどと組み合わせて
もちろん shell script なのでそれでも便利だと思いますが
特定のショートカットキーを押した時の動作として割り当てておけば
特定のショートカットキーとSlackチャンネルが 1:1 で紐づくので便利ですね。

## APIキーを使うなら
APIキーを利用して良いならシンプルに用意されている機能があるので使えますね
汎用性とお手軽さを求めて上記のようになってます。

```:zsh
curl -X GET -H "Authorization: Bearer {API_TOKEN}" "https://slack.com/api/channels.history?channel={CHANNEL_ID}"
```

## 思考
ヘッドレスブラウザで js の挙動だけ実行するコードも入れれば Safari が開かないので良さそう？
とも思いましたが、要件に対して実装が複雑になるのでシンプルな shell script に収めました。
Railsにおける共通化の方法: Concern, Helper, Service, Decorator

# Railsにおける共通化の方法: Concern, Helper, Service, Decorator

### はじめに

Ruby on Railsはその堅牢性と柔軟性で知られており、アプリケーションのコードベースを整理し、再利用可能にする多くの機能を提供しています。この記事では、Rails開発における主要な共通化のパターンである`Concerns`, `Helpers`, `Service Objects`, および`Decorators`について詳しく見ていきます。

### Concerns

#### 概要
- `ActiveSupport::Concern`は、モデルやコントローラのコードをモジュール化し、関連する機能を整理して再利用するために使われます。
- モジュール内で定義されたメソッドやスコープは、複数のクラスで簡単に共有できます。

#### 使用例
```ruby
module Commentable
  extend ActiveSupport::Concern

  included do
    has_many :comments
  end

  def find_recent_comments
    comments.order('created_at DESC')
  end
end

class Article < ApplicationRecord
  include Commentable
end
```

#### ActiveSupport::Concern`の主な機能
`ActiveSupport::Concern`の主な機能は、Ruby on Railsのモジュールの再利用性と組織化を改善するために設計されています。ここでその主な機能についてさらに詳しく説明します。

##### 1. 依存関係の自動解決

- **機能**: モジュール間の依存関係を自動的に管理します。
- **詳細**: 通常、モジュールが他のモジュールに依存している場合、それらを正しい順序でincludeする必要があります。`ActiveSupport::Concern`を使用すると、依存するモジュールが自動的にロードされ、正しい順序でincludeされます。
- **利点**: コードの可読性が向上し、依存関係の管理が容易になります。

##### 2. `included`ブロック

- **機能**: モジュールがクラスにincludeされた際に特定のコードを実行します。
- **詳細**: `included`メソッドを使用して、モジュールがクラスに組み込まれた時に実行されるコードブロックを定義できます。これはクラスレベルの設定、メソッドの追加、またはその他の初期化処理に使用されます。
- **利点**: クラスに影響を与えるコードをモジュール内に明確に定義できるため、コードの整理と再利用が容易になります。

##### 3. `class_methods`ブロック

- **機能**: クラスメソッドを簡単に定義できます。
- **詳細**: `class_methods`ブロック内で定義されたメソッドは、モジュールをincludeするクラスのクラスメソッドとして自動的に追加されます。
- **利点**: クラスメソッドを定義する際の冗長なコードを削減し、モジュールのコードをより簡潔に保つことができます。

##### 4. 再利用性と整理

- **機能**: コードのモジュール化と再利用性の向上。
- **詳細**: `ActiveSupport::Concern`を使用すると、モジュール内のコードをクリーンに整理し、異なるクラス間で簡単に再利用することができます。
- **利点**: モジュールのコードを整理し、複数のクラスにわたって再利用することで、DRY（Don't Repeat Yourself）原則に沿った開発を促進します。

これらの機能により、`ActiveSupport::Concern`はRails開発におけるモジュールの使い勝手を大幅に向上させています。コードの再利用性と整理を促進し、より保守しやすいアプリケーションの開発を支援します。

### Helpers

#### 概要
- Railsのビューで共通の処理を行うためのモジュールです。
- ビューに関連するロジックを整理し、コードの重複を避けることができます。

#### 使用例
```ruby
module ApplicationHelper
  def formatted_date(date)
    date.strftime("%Y年%m月%d日")
  end
end
```

### Service Objects

#### 概要
- 複雑なビジネスロジックや操作をカプセル化します。
- モデルやコントローラをスリムに保ち、コードのテストや保守を容易にします。

#### 使用例
```ruby
class UserRegistrationService
  def initialize(user_params)
    @user_params = user_params
  end

  def call
    User.create(@user_params)
  end
end
```

### Decorators

#### 概要
- オブジェクトに動的に新しい責任を追加します。
- 主にビューでオブジェクトの表示をカスタマイズするために使用されます。

#### 使用例
```ruby
class UserDecorator < SimpleDelegator
  def full_name
    "#{first_name} #{last_name}"
  end
end
```

### まとめ
Railsの`Concerns`, `Helpers`, `Service Objects`, および`Decorators`は、アプリケーションのコードを整理し、再利用性を高めるための強力なツールです。それぞれのパターンを適切に使い分けることで、効率的で保守しやすいコードベースの構築が可能になります。
【PCA9685が動かない】Adafruit PWMServoDriverでドライバが動かない

## Adafruit_PWMServoDriver.h ライブラリで PCA9685 が動かなくなってしまった

## 環境
- Arduino UNO
- Adafruit_PWMServoDriver.h (v3.0.1)
- PCA9685 (互換品)

## 原因
- バージョン問題
- Adafruit_PWMServoDriver.hのバージョンが最新の v3.0.1 だった場合、PCA9685 (互換品)が動かなくなってしまう現象が発生した

## 解決策
- Adafruit_PWMServoDriver.hのバージョンを **v2.4.1** にすることで解決した

## さいごに
- PCA9685が互換品の場合にこの現象が発生すると考えた
Gitによるチケット管理

Gitホスティングサービスではチケット管理が可能ですが、昔ながらのやり方のプロジェクトの場合、Azure Borads以外のチケットでは管理できる項目が不足しているため、Gitホスティングサービスとは別にプロジェクト管理ツールを導入したり、Excel管理したりすることがあります。

## 概要

Azure DevOpsではワークアイテムというチケットがあり、ワークアイテムは帳票自体をユーザが作成可能で、項目等のカスタマイズも可能です。そのため、Azure DevOpsで開発で管理が必要となる情報に合わせてワークアイテムを作成して管理を行います。

但し、GitLabやGitHubはそのような機能がないため、ラベルという機能を利用することで任意設定可能な項目を代替します。

例えば、以下のようなラベルを定義し、マージリクエスト(プルリクエスト)やイシューに設定することで、そのマージリクエストやイシューに情報を付与することができます。ラベルは任意で定義可能なので、開発で管理が必要となる情報に合わせて定義します。

GitLabはPremium版以上であれば`::`で区切ることでスコープのラベルセットとして扱うことができますが、GitHubではセットとして扱うことはできません。

| ラベル名                         |
| -------------------------------- |
| a_分類::機能追加                 |
| a_分類::要件変更                 |
| a_分類::作業依頼                 |
| a_分類::バグ                     |
| a_分類::タスク                   |
| a_分類::問合せ                   |
| a_分類::その他                   |
| b_ステータス::未着手             |
| b_ステータス::対応中             |
| b_ステータス::レビュー中         |
| b_ステータス::承認済             |
| b_ステータス::差し戻し           |
| b_ステータス::保留               |
| c_優先度::高                     |
| c_優先度::中                     |
| c_優先度::低                     |
| d_グループ::GW                   |
| d_グループ::UI                   |
| d_グループ::基盤                 |
| d_グループ::運用                 |
| d_グループ::その他               |
| e_環境::本番                     |
| e_環境::準本番                   |
| e_環境::テスト                   |
| e_環境::開発                     |
| e_環境::机上                     |
| e_環境::その他                   |
| y_バグ事象::システムダウン       |
| y_バグ事象::異常終了             |
| y_バグ事象::データ破壊           |
| y_バグ事象::データ誤更新         |
| y_バグ事象::一部機能障害         |
| y_バグ事象::表記誤り             |
| y_バグ事象::その他               |
| z_バグ原因::非エラー扱い         |
| z_バグ原因::設計もれ             |
| z_バグ原因::設計誤り             |
| z_バグ原因::説明内容不明確       |
| z_バグ原因::再利用誤り           |
| z_バグ原因::データバリエーション |
| z_バグ原因::コーディング誤り     |
| z_バグ原因::環境のバグ           |
| z_バグ原因::その他               |

## バージョン管理システム別の管理方法

### GitLab

レビュー時にコメントがある場合にはマージリクエストにコメントを追記しますが、どういった種類のエラーか分からないため、上記の`zx_バグ原因`のようなラベルを定義し、コメントにエラー種類を設定することでエラー種類を管理することが可能です。設定はレビュー者が実施します。

GitLabからAPIで情報を取得・加工することで、イシューやマージリクエストのステータスとレビュー時のコメントを取得することが可能です。
尚、BIツールやスクリプト、Excelマクロ等色々方法はありますが、プロジェクト要件にあわせて作成が必要となります。

### GitHub

GitLabではコメントごとにラベル設定が可能でしたが、GitHubではその機能がないため、プルリクエスト内で出たすべてのエラーをプルリクエスト自体に設定することでレビュー時に出たエラーの管理が可能です。

GitLabと同じようにAPIで情報を取得・加工することで、イシューやプルリクエストのステータスとレビュー時のコメントを取得することが可能です。
尚、BIツールやスクリプト、Excelマクロ等色々方法はありますが、プロジェクト要件にあわせて作成が必要となります。

### Azure Boards

Azure DevOpsではワークアイテムを任意の種類を作成することが可能であるため、例えば`レビュー`のようなワークアイテムを作成することが可能です。  
その`レビュー`のワークアイテムではプロジェクトとして管理をしたい項目を管理するように設計し、そのワークアイテムをプルリクエストに紐づけることでレビュー結果の確認が可能となります。

Azure DevOpsではクエリで抽出したい条件で集計することが可能。
尚、Self-ManagedのAzure DevOpsの場合にはSQL Server Analysis Servicesが使用可能であり、様々な品質管理のレポートを取得することが可能。
Excelの闇 ～画面解像度編～

## はじめに
　私は、画面解像度の違うパソコンを同時に利用することがあります。その時のハプニングを記事にしたいと思います。

## セルがずれてる！！！
　最初は、「なんで？」って思いました。私がその時に作成していたExcelのシートは、印刷することを前提にしていたため、最初からページ設定をしていました。以下の画像みたいな感じでです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2942430/efebbf81-48d7-c50f-4140-42b6ab260635.png)

　そして、そのExcelファイルを別のパソコンに移して開いたときに事件は起きました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2942430/7747a8d2-91c0-29f8-9b31-0be8dbd8363d.png)
　セルがずれているではないですか！これでは１ページに収まらないじゃないですか！

## 原因
　結論としては、画面の解像度が異なることが原因だったみたいです。以下のサイトが参考になりました。

https://answers.microsoft.com/ja-jp/msoffice/forum/all/%E3%82%A8%E3%82%AF%E3%82%BB%E3%83%AB%E3%81%AB/a70a7734-42aa-4753-a907-eb5d48422114

## おわりに
　Microsoftさんには、この問題を解決してほしいものですね。私も次から気を付けようと思いました。
プログラミング覚えたてでできる簡単なツールの自作


アドベントカレンダーの空いてる場所を勝手に埋めていますNMRです。
よろしくお願いします。

※今回作成するソースでは計算に誤差が発生します。
金融業務に使うためのものではないことをご了承ください。
NISAの正確な計算には金融庁のサイトなどをお使いください。
https://www.fsa.go.jp/policy/nisa2/moneyplan_sim/index.html

計算の誤差に興味がある方は、
https://qiita.com/2754github/items/26a18fe01c8ad221f0ba
こちらの記事などが個人的に面白かったです。

基本情報技術者試験でも扱われますので、キタミ式の参考書も誤差の理由を知るためにおすすめです。

### 毎年2%の複利で積み立て投資をしたらどれくらい儲かるのかを知りたい

新NISAが流行っていますね。

じゃあ結局新NISAで毎月積み立てていったらどれくらい儲かるんだろう？

こういったことを計算するのにコンピュータは向いています。

実際にJava Bronzeくらいの知識だけで実装してみましょう。

### 以下ソース

まず「Sample.java」という名前でファイルを作成します。

Sample.java内のソースコードがこちらです。

``` 
import java.util.Scanner;

public class Sample {
    public static void main(String[] args) {
        
        // Scannerインスタンスを作成して、ユーザー入力を受け取る
        Scanner scanner = new Scanner(System.in);
        
        try {
            // ユーザーに年利2%での貯金のシナリオについて案内
            System.out.println("あなたが毎年2%の利子を受け取ったらどうなるでしょう");
            System.out.println("毎年いくら貯金するか教えてください");
            
            // 年間の貯金額をユーザーから入力させる
            int save = scanner.nextInt();
            
            // 貯金する年数をユーザーから入力させる
            System.out.println("何年貯金しますか？");
            int year = scanner.nextInt();

            // 利子を含めない合計貯金額を計算
            int totalMoneyWithoutInterest = save * year;
            
            // 利子を含めた合計金額を計算するための変数を初期化
            int result = 0;
            
            // 年数に応じて複利計算を行う
            for(int i = 0; i < year; i++) {
                result += save;  // 年間貯金額を加算
                result *= 1.02; // 利子を加算（2%）
            }

            // 利子を含めない合計貯金額を出力
            System.out.println("利子を含めない貯金額は以下です");
            System.out.println(totalMoneyWithoutInterest);
            
            // 利子を含めた合計貯金額を出力
            System.out.println("利子を含めた貯金額は以下です");
            System.out.println(result);
            
            // 付加された利子の合計額を出力
            System.out.println("利子はこれだけつきました");
            System.out.println(result - totalMoneyWithoutInterest);
            
        } finally {
            // Scannerインスタンスをクローズ
            scanner.close();
        }
    }
}

```

実行例
```
あなたが毎年2%の利子を受け取ったらどうなるでしょう
毎年いくら貯金するか教えてください
36000
何年貯金しますか？
30
利子を含めない貯金額は以下です
1080000
利子を含めた貯金額は以下です
1489641
利子はこれだけつきました
409641
```

はい。
実際に（誤差はあるのですが）利子が計算できました。

Eclipseさんに警告を出されるのが嫌でtry-finallyを書いたくらいで、例外処理も行っていないため、ほぼJava Bronzeの知識のみのコードになっていると思います。

難しい資格を取ったり大規模なシステムにかかわっていなくとも、自分の生活や業務に役立つツールは意外とすぐ作れますよということを紹介したく書いてみました。

以上

読んでいただきありがとうございました。
AWS Cloud Practitioner対策1 - クラウドコンピューティング

# はじめに
AWS Cloud Practitionerの対策として自分用に執筆しています。

:::note warn
この記事はAWS・執筆学びたての初心者が執筆しています。間違いがあるかもしれませんので、ぜひ各項目にある**参考文献**も確認してください。また、誤りがあればコメントで教えていただけると幸いです。
:::

## クラウドコンピューティング
ITリソース（コンピューティング能力、データベース、ストレージ、アプリケーションなど）をオンデマンドでインターネット経由、かつ従量制料金で利用できるサービスのこと。

クラウドコンピューティングを利用すると、インフラをハードウェアからソフトウェアとして利用することが可能になる。

### 違い
ハードウェアはスペースやスタッフ、物理的なセキュリティや設備投資が必要です。また、調達サイクルが長かったり、キャパシティーを考える必要があります。

ソフトウェアはそれら問題点を全て解決し、面倒な作業を排除することができます。

## デプロイ方法
 - クラウド
     - 全体がクラウド上にある。
 - ハイブリッド
     - クラウドベースのリソースとクラウド以外にあるリソースとの間でインフラとアプリを接続させる。
 - オンプレミス
     - リソースをオンプレミスでデプロイする。
     - プライベートクラウドとも呼ばれる

## メリット
 - 資本支出を変動支出へ
 - 圧倒的なスケールメリット
 - キャパシティーの予測が不要
 - スピードと俊敏性の向上
 - データセンターの運用保守費が不要
 - 分単位で世界中へのデプロイ

## AWSの操作方法
 - AWSマネジメントコンソール
     - web上で操作する
 - AWSコマンドラインインターフェイス（AWS CLI）
     - コマンドスクリプトから操作する
 - ソフトウェア開発キット（SDK）
     - プログラミング言語を用いて操作する

## AWSクラウドへの移行
### CAF
Cloud Adoption Framework。組織が組織全体およびITライフ採掘全体にわたってクラウドコンピューティングに対する包括的なアプローチを構築し、クラウド導入の成功を促進するためのガイダンスとベストプラクティスを提供する。

### ビジネス
クラウド導入のための強力なビジネスケースを作成。
 - ITファイナンス
 - IT戦略
 - メリットの実現
 - ビジネスリスク管理

### 人的
組織の構造と役割、新しいスキルとプロセス要件を評価し、新しいスキルとプロセス要件を評価し、ギャップを特定する
 - リソース管理
 - インセンティブマネジメント
 - キャリアマネジメント
 - トレーニング管理
 - 組織変更管理

### ガバナンス
ITの戦略・目標とビジネスの戦略・目標を合致させるために必要なスキルとプロセスに集中できる。
 - ポートフォリオ管理
 - プログラムとプロジェクト管理
 - ビジネスパフォーマンス測定
 - ライセンス管理

### プラットフォーム
さまざまなアーキテクチャの切り口やモデルを使用して、ITシステムの性質やその関係を理解して伝える。
 - コンピューティングプロビジョニング
 - ネットワークプロビジョニング
 - ストレージプロビジョニング
 - データベースプロビジョニング
 - システムとソリューションアーキテクチャ
 - アプリケーション開発

### セキュリティ
組織のニーズを満たすセキュリティ制御の選択と実装を構築できる。
 - アイデンティティとアクセス制御
 - 検出制御
 - インフラストラクチャのセキュリティ
 - データ保護
 - インシデント対応

### 運用
現在の運用手順を定義する。必要なプロセスの変更やトレーニングを特定する。
 - サービスモニタリング
 - アプリケーションのパフォーマンスモニタリング
 - リソースインベントリ管理
 - レポートと分析
 - ビジネスの継続性/災害対策
 - ITサービスカタログ

## 移行戦略
 - リホスト
 - リプラットフォーム
 - リファクタリング/リアーキテクト
 - 再購入
 - 保持
 - 廃止

## Snowファミリ
AWSへのデータ移行やエッジコンピューティングのための物理的なデバイス。
 - Snowcone
 - Snowbal
 - Snowmobile

## AWSイノベーション
 - サーバーレスアプリケーション
 - 機械学習
 - AI
ubuntu アップデート方法

コマンドは以下のようになります。

```
sudo apt update

sudo apt upgrade
```

GUI(コマンドじゃない方)はubuntuのアプリ
「ソフトウェアとアップデート」を利用する。


Linuxディストリビューションの種類によっては「apt」の部分が
「yum」だったり「dnf」だったりする。


以上
Renderの3ヶ月無料枠終了後の対応方針を考える

# はじめに

`Render`とは`Heroku`の無料枠廃止に伴い、代替案として台頭してきた`PaaS`ですが、今回、`PostgreSQL`の無料枠期限である3ヶ月が過ぎたので、その後の対応について考えてみました。

https://render.com/


# 対応方針

# 1.無料枠での継続

テーブル構成がマスタのみなど、ユーザのデータを持たない設計になっている場合は素直に無料枠内に作り直すのが良いかもしれません。



`Ruby on Rails`の場合ですが、ダッシュボード内、`Delete Database`にて削除を実行、再度`DB`を作成し、`Internal Database URL`を`DATABASE_URL`の値として再設定するだけで対応することができます。

![スクリーンショット 2023-12-16 16.38.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517817/eb7e2e52-a921-730a-f428-90be21673f95.png)
![スクリーンショット 2023-12-16 16.40.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517817/90cd7224-f7f1-feb1-c98e-ee208f33f7c8.png)

![スクリーンショット 2023-12-16 16.40.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517817/2c80cfab-131b-7b76-521e-f114f2443ea7.png)


# 2.有料枠でのアップデート

当たり前の話ですが期限内に有料枠にすることで、データをそのまま残すことができます。
`Starter`で7ドル、日本円で約1000円なので、比較的低コストでアップデートすることが可能です。

| インスタンスタイプ | 価格/月額 | RAM | CPU |
| --- | --- | --- | --- |
| Free | $0 | 制限付き | 制限付き |
| Starter | $7 | 512MB | 0.5 |
| Standard | $25 | 2GB | 1 |
| Pro | $85 | 4GB | 2 |
| Pro Plus | $175 | 8GB | 4 |
| Pro Max | $225 | 16GB | 4 |
| Pro Ultra | $450 | 32GB | 8 |
| Custom | カスタム価格設定 | 最大512GB | 最大64 |

https://render.com/pricing



# 3.pg_dump/pg_resotreによるデータ移行

無料枠削除前に、`pg_dump`を用いて既存の`PostgreSQL`からデータを落としてくる方法も考えられます。

その後、`pg_restore`でデータを`INSERT`することでデータの維持をすることも可能なようです。

::: note alert
この方法について前提としているのはユーザの個人情報などではない、**無関係な一般的なデータを扱う場合**です。
個人情報を扱い、dumpする行為に関しては**絶対NG**です。諦めて削除を行うか、アップデートのみを検討してください。
:::



https://zenn.dev/takeyuwebinc/articles/76dce4dea3ea90

https://zenn.dev/philomagi/scraps/ed822344510408


# 4.設計の再検討
前提からの話にはなってしまいますが、`WEBサーバ(APサーバ)`のみ、`Render`を使用し、`DB`に関しては`PlanetScale`を用いる方法も検討できます。

`PlanetScale`は`MySQL`のマネージドサービスであり、`PostgreSQL`から`MySQL`に変更する必要がありますが、**無料枠でも無期限で使用することができる**為、代替案の一つとしても考えられるかと思います。


https://planetscale.com/
Rubyにおける`include`と`extend`の使い分け

# Rubyにおける`include`と`extend`の使い分け

### はじめに

Rubyプログラミングにおいて、`include`と`extend`はモジュールのメソッドをクラスに組み込む際に非常に重要な役割を果たします。これらのキーワードは同じ目的のために使用されるように見えますが、実際には異なる動作をします。この記事では、これらの違いとそれぞれの使用例を紹介します。

### `include`の理解

`include`キーワードは、モジュール内のメソッドをクラスのインスタンスメソッドとして追加するために使用されます。これにより、クラスのインスタンスがモジュールのメソッドを利用できるようになります。

#### 使用例:

```ruby
module Loggable
  def log
    puts "#{self.class} log something."
  end
end

class Product
  include Loggable
end

product = Product.new
product.log  # "Product log something." を出力
```

この例では、`Loggable`モジュールの`log`メソッドが`Product`クラスのインスタンスメソッドとして使えるようになっています。

### `extend`の理解

一方で、`extend`キーワードは、モジュールのメソッドをクラスのクラスメソッドとして追加するために使用されます。`extend`を使用すると、クラス自体がモジュールのメソッドを呼び出すことができます。

#### 使用例:

```ruby
module Loggable
  def log
    puts "#{self} log something."
  end
end

class Product
  extend Loggable
end

Product.log  # "Product log something." を出力
```

このケースでは、`Product`クラス自体が`log`メソッドを持っているように振る舞います。

### `include`の`included`メソッド

さらに、`include`された際に特定の動作を実行するために`included`メソッドを使用することができます。これは、モジュールがクラスに組み込まれたときに実行されるコードを定義するために使用されます。

### まとめ

Rubyにおける`include`と`extend`の違いを理解することは、モジュールの機能を効果的にクラスに組み込むために重要です。`include`はインスタンスメソッドとして、`extend`はクラスメソッドとしてモジュールのメソッドを追加することを覚えておくと良いでしょう。これにより、コードの再利用性を高め、より効率的で保守しやすいプログラムを作成することができます。
Macオススメ初期設定(Sonoma)

かなり久しぶりにMacを使い始めることになりました。
いろいろ初期設定を試した結果、個人的なおすすめ設定をまとめてみました。

初心者向け、OSの基本設定の部分のみ（各アプリの設定に深くは踏み込みません）。

## 確認環境
- MacBook Pro (M3 Pro)
- OSバージョン Sonoma 14.2

## iCloud関連（Apple IDでログインしている場合のみ）
### 「デスクトップ」「書類」フォルダをiCloud同期する
システム設定→自分の名前→iCloud Drive→"デスクトップ"フォルダと"書類"フォルダのチェックをオン

**※iCloudの容量をかなり消費する可能性があるため注意して下さい。**

「デスクトップ」「書類」フォルダの内容を自動的にiCloud Driveに同期できるようになります。
他のiCloudに接続したデバイスとファイルが共有できることと、バックアップとしての目的があります。
Macのバックアップの仕組みとしては他にTime Machineがありますが、外部ストレージを接続する必要があり、ノートブック型のMacではやや面倒なため私はiCloud同期をバックアップの代わりにしています。
ただしTime Machineと違い、指定フォルダのデータのみしかバックアップ出来ない点に注意して下さい。（Time Machineも利用することを推奨します。）

## キーボード関連
### Caps LockキーをCommandキーにする（日本語キーボードの場合）
システム設定→キーボード→キーボードショートカット→修飾キー
にてcommand, option等のキーの割当を変えられます。

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

私はCaps Lockキーはほとんど使わないためCommandに割り当てています。
Macの基本的なキーボードショートカットはWindowsと共通のものが多く、WindowsでいうCtrlがCommandに当たるため、日本語キーボードだと左下に来るCaps LockキーをCommandに割り当ててWindowsと同じ感覚で使えるようにしています。

### fnキーを押さずにファンクションキーをF1～F12キーとして利用できるようにする
システム設定→キーボード→キーボードショートカット→修飾キー→ファンクションキー

デフォルトではファンクションキーの動作は画面の明るさや音量変更など、印字アイコンの動作になっており、fnキーを押しながらだと一般的なF1～F12キーとして動作します。
これを逆に設定することができます。

https://support.apple.com/ja-jp/102439

ショートカット等でF1～F12キーを多様する場合にはおすすめです。

### ライブ変換オフ
日本語入力モードにし、画面上部メニューバーの「あ」アイコン→ライブ変換のチェックをオフ

ライブ変換はスペースキーを押さずとも入力中にどんどん変換が行われる機能です。
便利ではあるのですが、Windows標準のIMEとは操作感が異なるためオフにしています。

## トラックパッド関連
### ポインタ速度の調整
システム設定→トラックパッド→軌跡の速さ

設定値はお好みですが、トラックパッド操作に慣れている人にとって初期設定は遅すぎると思うのでやや早くしています。

### タップでクリック
システム設定→トラックパッド→タップでクリック

トラックパッドを押し込まずにタップするだけでクリックできるようになります。
一般的なノートPCではオンとして動作していることが多い気がします。

## Finder関連
### 拡張子を表示
Finderを起動→上部メニューバーの「Finder」→設定→詳細→すべてのファイル名拡張子を表示

### パスバーを表示
Finderを起動→上部メニューバーの「表示」→パスバーを表示

Finder下部にパスバー（現在のディレクトリの位置）が表示されるようになります。

## Sonomaの新機能
### Safari Webアプリ

https://support.apple.com/ja-jp/104996

Webサイトをあたかも1つのアプリかのようにDockに配置し起動することができます。
私はよく使うWebメールやSNS、音楽サブスクのページをWebアプリ化しています。
よく使うサイトは「タブを固定」でも良いですが、UIの好みで決めてもいいでしょう。