OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonで読み込んだ音声ファイルを指定した周波数以上の音ををカットするプログラム(ローパスフィルター)

まずpyhubをインストールします。

```Python:install.py
pip install pydub scipy
```
次にプログラムです。

```Python:program.py
from pydub import AudioSegment
import numpy as np
from scipy.signal import butter, lfilter
from google.colab import files

# 音源をアップロードする
uploaded = files.upload()

# アップロードされたファイル名を取得
input_file = list(uploaded.keys())[0]
print(f"Uploaded file: {input_file}")

# カットオフ周波数をユーザーから入力
cutoff = float(input("Enter the cutoff frequency in Hz: "))

# ローパスフィルタを定義
def low_pass_filter(data, cutoff, fs, order=5):
    nyquist = 0.5 * fs
    normal_cutoff = cutoff / nyquist
    b, a = butter(order, normal_cutoff, btype='low', analog=False)
    filtered_data = lfilter(b, a, data)
    return filtered_data

# 音源を読み込む
audio = AudioSegment.from_wav(input_file)

# サンプリングレートとデータを取得
fs = audio.frame_rate
data = np.array(audio.get_array_of_samples())

# ローパスフィルタを適用
filtered_data = low_pass_filter(data, cutoff, fs)

# フィルタリングされたデータをAudioSegmentに変換
filtered_audio = audio._spawn(filtered_data.astype(np.int16).tobytes())

# フィルタリングされた音源を保存
output_file = "/content/filtered_" + input_file
filtered_audio.export(output_file, format="wav")

print(f"Filtered audio saved as {output_file}")

# フィルタリングされた音源をダウンロード
files.download(output_file)
```

これをgooglecolabなどに貼り付けると使えます。
音源はwavを使ってください。
ファイルを読み込んだらカットオフ周波数を入力してください。
後は自動的にダウンロードされます。
[Python] 環境変数のテストで役立つreload

# TL; DR
configやsettingsでの環境変数を動的に変えるテストで [importlib.reload](https://docs.python.org/ja/3/library/importlib.html#importlib.reload) が便利。jupyterでの検証時も使える。


# 状況
settingsなどに環境変数からの読み込みを集めるということをすることもあるかと思います。

```python:settings.py
import os
API_KEY = os.getenv("API_KEY") 
```

何らかの事情で新しい環境変数を入れて上書きをしたいというのを、旧環境も保ったままやりたくなったとしましょう[^1]。

```python:settings.py
import os
API_KEY = os.getenv("API_KEY") 
API_KEY_ALT = os.getenv("API_KEY_ALT") 
if API_KEY_ALT is not None:
    API_KEY = API_KEY_ALT
```

何だかsettingsにロジックが入ってしまいました。ロジックが入ってしまったからにはテストを書かなければいけません[^2]。

# テストを書こう
環境変数のテストは`os.environ`をpatchすればよさそうです。

```python:test_settings.py
import os
from unittest import TestCase
from unittest import mock


class MyTestCase(TestCase):
    def test_1(self):
        env = {}
        with mock.patch.dict(os.environ, env):
            import settings
        self.assertIsNone(settings.API_KEY)
```

環境変数として何もない状況。これの結果は`API_KEY`はNoneになりそうです。これは通ります。

```python:test_settings.py
import os
from unittest import TestCase
from unittest import mock


class MyTestCase(TestCase):
    def test_2(self):
        env = {"API_KEY": "api"}
        with mock.patch.dict(os.environ, env):
            import settings
        self.assertEqual(settings.API_KEY, "api")
```
環境変数に`"api"`を入れました。当然、このテストも通ります。ですが、
```python:test_settings.py
import os
from unittest import TestCase
from unittest import mock


class MyTestCase(TestCase):
    def test_1(self):
        env = {}
        with mock.patch.dict(os.environ, env):
            import settings
        self.assertIsNone(settings.API_KEY)

    def test_2(self):
        env = {"API_KEY": "api"}
        with mock.patch.dict(os.environ, env):
            import settings
        self.assertEqual(settings.API_KEY, "api")
```
こうすると2番目のテストが通らなくなってしまいました。

# インポートが邪魔をする
これの理由は2回目のインポートが1回目のインポートに影響を受けていることによります。test結果を見ていると2回目の`API_KEY`もNoneになっているというのがわかります。
これを解決するのが[importlib.reload](https://docs.python.org/ja/3/library/importlib.html#importlib.reload)です。この関数
> 以前にインポートされた module をリロードします。引数はモジュールオブジェクトでなければならず、したがってそれ以前に必ずインポートに成功していなければなりません。この関数は、モジュールのソースファイルを外部エディタで編集していて Python インタープリタから離れることなく新しいバージョンを試したい際に便利です。戻り値はモジュールオブジェクトです。

ということで呼びたいモジュールをコードレベルで読み込んでくれます。これを利用すると

```python:test_settings.py
from importlib import reload
import os
from unittest import TestCase
from unittest import mock


class MyTestCase(TestCase):
    def test_1(self):
        env = {}
        with mock.patch.dict(os.environ, env):
            import settings
        self.assertIsNone(settings.API_KEY)

    def test_2(self):
        env = {"API_KEY": "api"}
        with mock.patch.dict(os.environ, env):
            import settings
            reload(settings)
        self.assertEqual(settings.API_KEY, "api")
```

これで通るようになります。これでやっと書きたかったテストが書けるようになりました。

# 他の使い方
この`reload`ですが、この[記事](https://qiita.com/Krypf/items/68c1f7c26efd084cf207)によるとjupyterで動作検証しているときにも便利そうです。関数を書くたびにカーネルを上げ直す日々にさよならできますね。

[^1]:そんな横着するな。という状況。
[^2]:ちゃんと先に書きましょう。
SCPコマンドでファイルをローカルにダウンロードする手順（SORACOM Napter前提）

## 概要

SCPコマンドの使い方はなんとかわかったのでいざやってみると`permission denied`になる。うまくデータが送れない。そんな人向けの備忘録です。

※ SORACOM Napterによるsshが前提

## 背景

普段から頻繁に使うわけではないけど定期的に使う。この類って一番困りませんか？

私の場合は、SCPコマンドがそれです。特にSORACOM Napterを経由してログを取ってくるみたいな操作ですね。

1年に3回あれば多いぐらいの操作なので次やるときは脳がリセットされてます。

### 権限の確認

送信したいファイルの所有者と送信するユーザが異なる場合、権限不足でエラーになりがちです。そんなときは`chmod`コマンドによる権限変更が必要です。

```shell
# 所有者以外のユーザが送るときの権限追加の例
chmod 757 {ファイル名}
```

:::note warn
ファイルによっては実行後に権限を戻すなどの判断が必要になることもあります。
:::

ちなみに`chmod`コマンドを実行して下記のエラーが出た場合は`mount`コマンドを実行するか、`cp`コマンドでマウント済みのディレクトリへ移動させてから`chmod`コマンドを実行しないといけないようです。

```
chmod: changing permissions of '{変更対象のファイルやディレクトリ名}': Read-only file system
```


## コマンドTips

ここからはSORACOM Napterを前提としたscpコマンドを紹介します。


### ファイル単位で送りたい場合のコマンド


```
scp -P {ポート番号} {ユーザ名}@{IPアドレス}.napter.soracom.io:{送信元ファイルパス}  {送信先ファイルパス}
```

#### 例） hoge.txtをDocuments配下に送る。（送信者はuser1）

```
scp -P 26157 user1@33-33-333-33.napter.soracom.io:/home/user1/test/hoge.txt  /Users/hoge/Documents/
```

### フォルダ単位で送りたい場合のコマンド

`-r` オプションをつけてパスをディレクトリ直指定すればOK

```
scp -r -P {ポート番号} {ユーザ名}@{IPアドレス}.napter.soracom.io:{送信元ディレクトリパス}  {送信先ディレクトリパス}
```

#### 例） testディレクトリをDocuments配下に送る。（送信者はuser1）

```
scp -r -P 26157 user1@33-33-333-33.napter.soracom.io:/home/user1/test  /Users/hoge/Documents/
```


## ケーススタディ

### consolelog配下のファイルを`user`ユーザ経由でローカルに送信したい。


consolelog配下のファイルはroot所有なのでそのままコマンドを実行してもダメです。
権限を変えようと思って`chmod`コマンドを実行したところ下記のエラーがでました。

```
chmod: changing permissions of 'consolelog/': Read-only file system
```

そこで`cp`コマンドを使って`home/user1`配下にディレクトリ毎コピーします。

```shell
cp -r consolelog /home/user1/consolelog
```

なお、複製先のファイルの所有者はコマンド実行者になります。例えば`root`で実行した場合は、所有者が`root`になります。（今回は`root`がコマンドを実行したとして話を進めます。）

　`/home/user1/consolelog`にファイルが複製されていますが、このままだと`user`はファイルを見る権限しかないので`chmod`コマンドでを実行します。今回は　`/home/user1/consolelog`配下の全てのファイルが対象なので　`/home/user1/consolelog`に移動した上で下記コマンドを実行します。

```shell
chmod -R 757 .
```

※ 厳密には他ユーザに対する読み込み権限だけ付与されていればいいかもです。

最後にscpコマンドを実行します。今回はフォルダ毎ダウンロードしたいので下記コマンドを実行します。

```
scp -r -P 26157 user@33-33-333-33.napter.soracom.io:　/home/user1/consolelog  /Users/hoge/Documents/
```
Excel VBAを動かす XLSX .ods拡張子

https://x.com/Tattyan_03/status/1796476428621582358

.xlsm拡張子 .ods拡張子を推奨していました。

書籍　Excel マクロ&VBA ISBN978-4-8156-1730-1 税込み1,760円　SBクリエイティブ株式会社
https://isbn2.sbcr.jp/17301/ 　トンプルデータのdownload 詳細書籍参照の事。

downloadして解凍後、ファイルのプロパティ
![スクリーンショット 2024-05-31 163932.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/2c63a57f-5d5b-3846-5ce5-56b329c3fbbc.png)
![スクリーンショット 2024-05-31 164020.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/a222d88e-44d2-bf1c-0ad4-db37373f0009.png)
![スクリーンショット 2024-05-31 164133.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/0d6e873c-a4fe-6524-9abc-3387cf0d1190.png)
許可するにcheckを入れ承認した方が良いと思えます。

![スクリーンショット 2024-05-31 164630.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/5bd07c2f-6594-d69d-8ad6-88e140a656e7.png)
重要なのは２行1,2をコピーしてREM  **BASIC を抜くか'コメントとする。

```VBA VBA(main)
 VBA(main)
 他のアプリにより、ソースが消し去られて、参照不能。写真を参照してください。
 アプリの併用には、注意がいるものと、思えます。
```

![スクリーンショット 2024-05-31 175312.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/6a5893a0-07b4-a7ab-c503-553353d766aa.png)

おさらい。
![スクリーンショット 2024-05-31 182528.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/18296100-4d92-d9e7-3ddd-07d71d507eaa.png)
ここからやり直しです。

ではよろしく。
LaravelBreezeにReactを導入してみた

Reactに必要なプラグインをviteを通して入れる
```
npm install @vitejs/plugin-react --save-dev
```
reactとdomも入れる
```
npm install react react-dom --save-dev
```

reactのフレームワークを入れる
```
composer require laravel/ui
```

react本体を入れる
```
php artisan ui react 
```
Reactでルーティングするためにreact-routeをインストールします。
```
npm install react-router-dom
```
ルートを変更する
web.php
```
Route::get('/', function () {
    return view('app');
});
```
ルーティングはLaravelで行います。


resourc/view/app.blade.phpを作成する
```
!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>SPA</title>
    @viteReactRefresh
    //↓ここのreactのファイルを読み込む
    @vite('resources/js/components/Example.jsx')

</head>

<body>
    <div id="app"></div>
</body>

</html>
```

Example.jsxを修正
resoucrc/js/components/Example.jsx
```
import React from 'react';
import ReactDOM from 'react-dom/client';

function Example() {
    return (
      <h1>Hello</h1>
    );
}

export default Example;

if (document.getElementById('app')) {
    const Index = ReactDOM.createRoot(document.getElementById("app"));

    Index.render(
        <React.StrictMode>
            <Example/>
        </React.StrictMode>
    )
}
```

以上の設定でlocalhost:8000 でreactのExampleページで出てきます。
色々と説明をはしょってすいません。
LaravelでSlackに通知を送る方法

# LaravelからSlackに通知を送る方法

これからLaravelでslackと連携して通知を送る方法を記述します。
Facadaを使用するので少しややこしいです、

## 1.envファイルの編集

```
SLACK_WEBHOOK_URL= ここにslackのwebhook_urlを載せて下さい。
```
↓是非、参考にして下さい
SlackのWebhook URL取得手順
https://qiita.com/vmmhypervisor/items/18c99624a84df8b31008


## 2 config/service.phpに追加

returnの配列の中に追加して下さい

```
    'default' => env('MAIL_MAILER', 'slack'),

'slack' => [
        'url' => env('SLACK_WEBHOOK_URL'),
    ],
```

## 3 Guzzle HTTPクライアントパッケージをインストールします
Slack通知にはGuzzleが必要です。
```
composer require guzzlehttp/guzzle
```



## 4 Notificationsクラスを作成
作成コマンド
```
php artisan make:notification SlackNotification
```
App\Notifications/SlackNotification.phpが作成されます。

まずviaメゾットを変更して下さい。
```
public function via($notifiable)
    {
        return ['mail'];
    }
```

そしてtoSlackメゾットを追加してそこのslackに通知する処理を書き込みます。
今回は通知でメッセージを送るだけの処理になっています。
```
 public function toSlack($notifiable)
    {
        return (new SlackMessage)
            //ユーザー名
            ->from('Laravel Notification');
            //メッセージ内容
            ->content('Laravelからこんにちわ');
    }
}
```

## 5 ファサードを作成する
手動でファサードクラスを作成します。Illuminate\Support\Facades\の中に
SlackFacade.phpファイルを作成します。
下記のように記述して下さい。
```
<?php

namespace Illuminate\Support\Facades;

use Illuminate\Support\Facades\Facade;

class SlackFacade extends Facade
{
    protected static function getFacadeAccessor()
    {
        return 'slack';
    }
}
```
## 6 SlackFacadeにしてもらう処理クラスを作成する
今回はReffectsディレクトリーにSlack.phpを作成します（手動)
```
<?php
namespace App\Reffects;

use Illuminate\Notifications\Notifiable;
use App\Notifications\SlackNotification;

class Slack
{
    use Notifiable;

    public function send()
    {
        $this->notify(new SlackNotification());
    }

    public function routeNotificationForSlack()
    {
        return env('SLACK_WEBHOOK_URL');
    }
}

```

## 7 AppServiceProbider.phpに登録
Facadeクラスをregisterメゾットに登録します。

```
 $this->app->bind('slack', \App\Reffects\Slack::class);
```

## 8 ファサードをエイリアスに登録
config/app.phpの'aliases'にSlackFacadeをSlackという名前で登録します。
```
 'Slack' => Illuminate\Support\Facades\SlackFacade::class,
```

## 9 実際に呼び出す
呼び出し方はどこでも呼び出すことができて\Slack::send()で呼び出すことができる
```
 public function index()
    {
  \Slack::send();
}
```

以上で終わりです。
ありがとうございました。
Git Submodulesでよく使うコマンド一覧

Gitでよく使うコマンドは2部構成です。

- [Gitでよく使うコマンド一覧](https://qiita.com/uhooi/items/c26c7c1beb5b36e7418e)
- Git Submodulesでよく使うコマンド一覧　__←イマココ__

## はじめに

Git Submodulesがよくわからなかったので、よく使うコマンドを調べてまとめました。

## 環境

- Git：2.45.1

## Git Submodulesでよく使うコマンド一覧

### git submodule

|コマンド|説明|
|:--|:--|
|`git submodule update --init --recursive`|サブモジュールをクローンする|
|`git submodule update --remote`|全サブモジュールの変更を取り込む|
|`git submodule update --remote {サブモジュールのパス}`|対象サブモジュールの変更を取り込む|

## Git Submodulesでよく使うテクニック

### クローン時にサブモジュールもクローンする

`git clone --recursive {リポジトリのURL}` でサブモジュールを含むリポジトリをクローンできます。

`--recursive` を付けないとサブモジュールがクローンされないので注意です。

```shell-session
$ git clone --recursive {リポジトリのURL}
```

### サブモジュールをクローンし忘れたリポジトリを再クローンせずに対応する

`--recursive` を付け忘れてクローンすることはまれによくあります。
その場合は以下のコマンドを実行することで、ローカルからリポジトリを削除して再クローンしなくても済みます。

```shell-session
$ git submodule update --init --recursive
```

### サブモジュールの変更を取り込む

サブモジュールのフォルダまで移動し、 `git fetch` → `git rebase origin/main` を実行することで、サブモジュールの変更を取り込めます。

要は通常のリポジトリを扱うときと同様です。

```shell-session
$ cd foo/
$ git switch main
$ git fetch
$ git rebase origin/main
```

ちなみに上記の作業は `git submodule update --remote {サブモジュールのパス}` を実行すれば一発で完結します。

```shell-session
$ git submodule update --remote foo/
```

あとはメインモジュールのフォルダへ戻り、 `git add` → `git commit` します。

```shell-session
$ cd -
$ git add foo
$ git commit
```

これでサブモジュールの変更を取り込めました。

## おわりに

私はGit Submodulesにおいて最低限の操作しか行いません。
他にもよく使うコマンドやテクニックがあれば教えていただけると嬉しいです :relaxed:

## 参考リンク

- [Git - Submodules](https://git-scm.com/book/en/v2/Git-Tools-Submodules)
- [Git - サブモジュール](https://git-scm.com/book/ja/v2/Git-のさまざまなツール-サブモジュール)
- [Git - git-submodule Documentation](https://git-scm.com/docs/git-submodule)
Docker-Composeで立てたコンテナにプロジェクト名を指定する

# はじめに
Lavavelの環境構築で外せない、docker-composeについて。
今回はコンテナ名にプロジェクト名を指定して作成する指定する方法を記載します。

## 結論
`docker-compose.yml`と同じ階層に`.env`を作成して

以下の値を設定する

```.env
COMPOSE_PROJECT_NAME=iikanji_project
```
これだけです。




プロジェクト名を指定する利点としては、
```yaml
version: "3"

services:
    mysql:
        container_name: mysql
```
のような形で`container_name`を指定した`docker-compose.yml`を
複数のプロジェクトで使いまわしたりしていた場合は
`mysql`コンテナ名で重複してしまうため同時に立ち上げることができません。

しかし、先ほどの`.env`のパラメータを設定することで
`iikanji_project_mysql_1`と名付けられるように設定することができるため、
コンテナ名の重複を回避することができます。

# まとめ

`COMPOSE_PROJECT_NAME`のパラメータで
コンテナ名に自動でプロジェクト名を付与することができます。

# 参考
https://qiita.com/okashoi/items/1ddf3724ad5c166e417b

https://qiita.com/P-man_Brown/items/ac14c70423fcc8827210

# 告知
最後にお知らせとなりますが、イーディーエーでは一緒に働くエンジニアを
募集しております。詳しくは採用情報ページをご確認ください。

https://eda-inc.jp/recruit/

みなさまからのご応募をお待ちしております。
Error: Failed to download metadata for repo 'pgdg-common': repomd.xml GPG signature verification error: Bad GPG signature なんだ???

# 概要
AlmaLinux8にzabbix-agentをインストールしようとしたところ、GPGエラーで詰まったので解決までを備忘録として残します。

# zabbix-agentインストール

GPG署名の検証に失敗してしまった
```
# dnf install zabbix-agent zabbix-get zabbix-sender
PostgreSQL common RPMs for RHEL / Rocky 8 - x86_64                                                                                                       
PostgreSQL common RPMs for RHEL / Rocky 8 - x86_64                                                                                                       
PostgreSQL common RPMs for RHEL / Rocky 8 - x86_64                                                                                                      
Error: Failed to download metadata for repo 'pgdg-common': repomd.xml GPG signature verification error: Bad GPG signature
```

# GPGキーのバージョン確認
```
# rpm -qa | grep pgdg
pgdg-redhat-repo-42.0-32.noarch
```

以下公式を確認するとGPGキーの更新があったらしい

https://yum.postgresql.org/news/pgdg-rpm-repo-gpg-key-update/

# GPGキーのアップデート
公式に書いてある通り、コマンドを実行してGPGキーをアップデートします

```
# dnf --disablerepo=* -y install https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
```

:::note warn
注意
OSのバージョンによってコマンドが違うので公式サイトを要確認。
:::

# バージョン確認
OK!!
```
# rpm -qa | grep pgdg
pgdg-redhat-repo-42.0-43PGDG.noarch
```

# 再度zabbix-agentをインストール
GPGキーのアップデートが完了したので再度zabbix-agentをインストールします

```
# dnf install zabbix-agent zabbix-get zabbix-sender
Installed:
  zabbix-agent-5.0.42-1.el8.x86_64                              zabbix-get-5.0.42-1.el8.x86_64                              zabbix-sender-5.0.42-1.el8.x86_64                             

Complete!
```

# 最後に
調べていると、一時的にGPGの検証を無効化している方法もありましたがセキュリティ上よろしくなさそうなので、公式を確認することが大切だと思いました。
Javaで「論理演算子」の動作を確認してみた

# 概要

Javaで「論理演算子」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/start/ope/index12.html

# 実装

以下のファイルを作成しました。
```
class JSample12_1{
  public static void main(String[] args){
    int a = 7;
    int b = 4;

    System.out.println(a < 0 && b > 5);
    System.out.println(a < 5 && b > 3);
    System.out.println(a < 9 && b > 7);
    System.out.println(a < 9 && b > 3);

    System.out.println(a < 0 || b > 5);
    System.out.println(a < 5 || b > 3);
    System.out.println(a < 9 || b > 7);
    System.out.println(a < 9 || b > 3);

    System.out.println(!(a > 0));
    System.out.println(!(a > 9));
  }
}
```

以下のコマンドを実行しました。
```
$ javac JSample12_1.java 
$ java JSample12_1 
false
false
false
true
false
true
true
true
false
true
```

# まとめ

何かの役に立てばと。
マネージドKubernetesサービスをOracle Container Engine for Kubernetes(OKE)でサクッと作ってみる

#### Kubernetesと聞くと、「ええ・・なんかとっつきづらい」と思う私のようなエンジニア~~おじさん~~は多いと考えていますが、マネージド形式のサービスであるOracle Container Engine for Kubernetes(OKE)を使えばサクッとできますのでやってみました。

### 1.プロビジョニング
まずはOCIへログインし、左上ハンバーガーメニューから「開発者サービス」→「コンテナとアーティファクト」→Kubernatesクラスタの作成（OKE）を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009902/de0bc34a-8670-892a-4973-1bf2cc429e87.png)

クラスタの作成を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009902/95b8c23d-9f7c-7286-e377-fe472912a40e.png)

クイック作成とカスタム作成の2通り聞かれますが、今回はクイック作成でサクッと作ってみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009902/797c81c3-55a4-767c-b042-998e23e7499f.png)

以下の設定を埋めていきます。
名前：otameshi-cluster
コンパートメント：任意選択
バージョン：v1.29.1
Kubernetes APIエンドポイント：プライベート・エンドポイント
→場合に応じてプライベート or パブリックを選択してください。
ノード・タイプ：管理対象
Kubernetesワーカー・ノード：プライベート
→場合に応じてプライベート or パブリックを選択してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009902/8e0be8c8-eb87-202f-494a-7551aefe5709.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009902/d8e7293f-a26d-6e2d-2063-ffcf8cc85c13.png)

シェイプとイメージ
ポッドシェイプ：ワークロードに適切な基盤環境を選択します。
今回はOCIならではの柔軟性とお値打ち価格のE4インスタンスを選択します。
ポッド・シェイプ：VM.StandardE4.Flex
OCPU：1
メモリ：16GB
ノード数：3
イメージ：Oracle Linux8

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009902/f2794862-4066-cba7-fc72-ad2d4232a6f5.png)

次へを選択すると確認画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009902/814837bd-3259-5dfe-cc32-e35b952d1489.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009902/03311cbe-2e69-cb67-e031-60e933cf3ebf.png)

基本的なクラスタの確認にチェックを入れ、クラスタの作成を選択します。

関連リソースは30秒程度でできてしまいました・・！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009902/0b3c17ab-3c19-8181-e21f-ee2cb9bc7c16.png)

できました！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009902/2d6d093f-1be8-1db1-c1b4-305de7a40fb0.png)

Computeの一覧からも、3台のマシンが参加しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009902/236a72e8-5d54-49f0-0c9a-dfe5970eceed.png)

### 2.いきなり基盤テスト：1つのマシンを終了してみる
さて、ここで突然テストとして、今回作成したクラスタのうち、1台のマシンを削除するとどうなるかやってみましょう。

0号機、君に決めた！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009902/55b55253-ce49-a6c4-fbff-53de12c2190e.png)

えいやっ！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009902/09de27a3-c516-37b0-fc84-55c05f8bdf35.png)

お前はもう死んでいる・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009902/d3903c1e-2ce4-e24a-c376-381618f5630c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009902/41e91e8e-c1e6-49a0-3142-2ee62e3b8c85.png)

5分後・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009902/821feece-d9a5-d954-1bb9-69ba1db18086.png)

### おおおっ！何もせずとも復活してきました！！

このように、Kubernetesと聞くとなんとなくとっつきづらいイメージもあるかとは思いますが、OKEのようなマネージドサービスを使うとお手軽に堅牢な基盤をつくれてしまうということで、今後新しいシステムを構築する際にはこうしたサービスも選択肢に挙がってくるのではないでしょうか？

今後は作成した環境をゴリゴリ使うような記事も投稿していきたいと思います！
ファイル、フォルダのサイズを分析する

# 概要
私なりのファイル毎やフォルダ毎のサイズを分析する方法を記載しています。
目新しいコードは書いておらず、大体はネットで調べた知識 + Excelの操作を忘れないための備忘録です。

# ファイルサイズを取得する
以下の項目を修正してから、PowerShellを実行する
- dirPath（調査対象のフォルダ（最後に\\が必要））
- exportFolder（調査結果を出力するファイルを指定。新規ファイルでも可。）

```powershell
# ★★★サイズを取得する対象のフォルダを指定する★★★
$dirPath = "C:Users\Desktop\・・・\"

# ★★★結果を出力するフォルダパスを指定してください★★★
$exportFile = "C:\Users\ユーザー名\Desktop\test.csv"

# 指定したフォルダパスのファイル一覧を出力する（フルパス、フォルダパス、ファイル名、拡張子、
Get-ChildItem -Path $dirPath -Recurse -File | Select-Object FullName, DirectoryName, Name, Extension, Length, LastAccessTime, LastWriteTime | Export-Csv -Encoding Default $exportFile
```

# フォルダ毎のサイズ取得する（Excelで分析する）
往々にしてフォルダ毎のサイズを知りたくなる。
その場合は以下を実施する。

1. ひとまずExcelで結果を開く
2. B列にフォルダが一覧で出力されるので、重複を削除し、I列あたりに記入する
3. J2列に以下を入力し、J10までセルをコピーする（10行出力されている場合で記載している）
```
=SUMIF($B$2:$B$10,$I2,$E$2:$E$10)
```

フォルダ毎のサイズが分かるので便利。

# 感想
PowerShellでフォルダ毎のサイズを取得することも可能ですが、分析していく上でPowerShellだけでやるよりは、Excelで分析したいときがある。
1 マスの移動 (paizaランク C 相当)

### 問題
>グリッドの行数 H と列数 W が与えられるので、マス (y,x) から次の移動を 1 回おこなった時に到達>することができるマスを '*' , それ以外のマスを '.' にしたグリッドを出力してください。
>
>・現在いるマスを (y,x) としたとき、(y+1,x), (y-1,x), (y,x+1), (y,x-1) のいずれかのマスに移動する。
>
>ただし、グリッドの外へは移動することができません。
なお、グリッドの左上・右上・左下・右下のマスをそれぞれ (0,0), (0,W-1), (H-1,0), (H-1,W-1) とします。
到達できるマスに (y,x) が含まれることに気をつけてください。
>出典:[Paizaラーニング](https://paiza.jp/works/mondai/bfs_dfs_problems/bfs_dfs_problems__move_once?language_uid=php)


模範解答を参考にして、作成しました。全く分からなかった戒めとして、何がどうなっているのか書き留めていこうかなと。

### 論理値型配列を作る
論理値型配列を作って、最後に真偽値の判定から`grid`を出力します。

```diff_php
<?php
    list($h, $w) = explode(" ", trim(fgets(STDIN)));
    list($y, $x) = explode(" ", trim(fgets(STDIN)));
    
    for($i = 0; $i < $h; $i++) {
        $grid = ""; 
        for($j = 0; $j < $w; $j++) {
            $able_reach = false;
```
### 移動できる範囲の判定
横方向に移動できるのか判定しています。
```diff_php
            if($i == $y) {
                if(0 <= $j && $j == $x-1) {
                // 0以上であるかつ、出発地点から横方向に-1の場所
                    $able_reach = true;
                }
                if($j < $w && $j == $x+1) {
                // 列数の間に入っている、出発地点から横方向に+1の場所
                    $able_reach = true;
                }
            }
```
縦方向に移動できるのか判定しています。
```diff_php
            if($j == $x) {
                if(0 <= $i && $i == $y-1) {
                // 0以上であるかつ、出発地点から縦方向に-1の場所
                    $able_reach = true;
                }
                if($i < $h && $i == $y+1) {
                // 列数の間に入っている、出発地点から縦方向に+1の場所
                    $able_reach = true;
                }
            }
```
### 出発地点
出発地点です。
```diff_php
            if($i == $y && $j == $x) {
                $able_reach = true;
            }
```
### 出力
```diff_php
            if($able_reach) {
                $grid .= "*"; 
            }else{
                $grid .= ".";
            }
        }
       echo $grid."\n"; 
    }
```
### 終わりに
　この問題は列と行の関係をしっかりと押さえておかないと、頭の中がごちゃごちゃになってしまいます。今回は`移動できる範囲の判定`のところですね。
　正直言って自分も、ほんとにあっているのかわからないところもあります。自分なりの解釈なので、悪しからず。何か間違いなどがありました、コメントでご教授いただけますと幸いです。
信頼性と安全性のある取引プラットフォームの選び方

オンライン取引の普及に伴い、多くの人々が投資を始めています。しかし、成功するためには、信頼できる取引プラットフォームを選ぶことが不可欠です。例えば、https://exinvest.jp のようなプラットフォームは、多くの投資家にとって魅力的な選択肢となっています。本記事では、信頼性と安全性のある取引プラットフォームを選ぶためのポイントを紹介します。

![кпернгошщ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3805120/7de8b2e5-0754-cd4c-ff51-ad15ae856ae1.png)


取引プラットフォームの信頼性を確認する方法
規制とライセンス
まず、プラットフォームが適切な金融規制当局からライセンスを取得しているかどうかを確認しましょう。これは、プラットフォームが規制に準拠し、投資家の資金を保護するための措置を講じていることを意味します。たとえば、Exnessは複数の国際的な規制機関によって認可されており、高い信頼性を誇ります。

利用者のレビューと評価
次に、他の利用者のレビューや評価をチェックすることが重要です。インターネット上には多くのレビューサイトがありますが、信頼できるサイトを選び、総合的な評価を確認しましょう。Exnessは、多くのトレーダーから高評価を受けており、その理由として、使いやすさと優れた顧客サポートが挙げられます。

取引ツールと機能
信頼性の高いプラットフォームは、最新の取引ツールと機能を提供しています。これにより、投資家は市場の変動に迅速に対応し、効果的な取引を行うことができます。Exnessは、先進的な取引ツールと柔軟なサービスを提供しており、ユーザーのニーズに応じた最適な取引環境を整えています。

安全性の確保
データの保護
取引プラットフォームを選ぶ際には、データの保護対策が十分に施されているかどうかも確認しましょう。暗号化技術を使用しているプラットフォームは、投資家の個人情報や資金を守るための重要なセキュリティ対策を実施しています。Exnessは、最新の暗号化技術を導入し、高いセキュリティレベルを維持しています。

資金の分離管理
投資家の資金が分離管理されていることも重要なポイントです。これは、プラットフォームが万が一破綻した場合でも、投資家の資金が保護されることを意味します。Exnessでは、顧客の資金を会社の運営資金とは別に管理しており、安心して取引を行うことができます。

認証とセキュリティ対策
二要素認証（2FA）などのセキュリティ対策を実施しているプラットフォームは、より高い安全性を提供します。これにより、不正アクセスやアカウントの乗っ取りを防ぐことができます。Exnessでは、二要素認証をはじめとする高度なセキュリティ対策を採用し、ユーザーのアカウントを保護しています。

Exness Japanの特長
Exness Japanは、投資家にとって信頼性と安全性を兼ね備えた理想的な取引プラットフォームです。Exnessは、世界中で多くのトレーダーに利用されており、その月間取引額は4兆ドルを超えています。これは、同社が提供するサービスとツールがいかに優れているかを物語っています。

さらに、Exnessは顧客の資金の保護を最優先に考えています。顧客の資金は分離管理されており、二要素認証などの高度なセキュリティ対策が講じられています。また、同社は定期的にセキュリティシステムを更新し、最新の脅威にも対応できるよう努めています。

顧客サポートと教育リソース
顧客サポートの質
優れた取引プラットフォームは、質の高い顧客サポートを提供しています。投資家が問題に直面したとき、迅速かつ効果的に対応できるサポート体制が整っていることは非常に重要です。Exnessは24時間365日の多言語サポートを提供しており、投資家がいつでも安心して取引を行えるようにしています。サポートスタッフは専門的な知識を持ち、迅速かつ親切に対応することで、多くのユーザーから高い評価を得ています。

教育リソースの充実
特に初心者にとって、取引の教育リソースが充実しているプラットフォームは非常に有益です。これには、ウェビナー、チュートリアルビデオ、記事、取引ガイドなどが含まれます。Exnessは、投資家がスキルを向上させるための包括的な教育リソースを提供しており、初心者から上級者まで幅広いレベルのトレーダーに対応しています。これにより、投資家は自分のペースで学び、取引の知識を深めることができます。

手数料とコスト
取引コストの透明性
取引プラットフォームを選ぶ際には、手数料やスプレッドの透明性も重要なポイントです。隠れたコストや不明瞭な手数料は、投資家にとって大きなデメリットとなります。Exnessは、透明性のある料金体系を採用しており、すべての手数料やコストを明確に開示しています。これにより、投資家は安心して取引を行うことができ、自分の取引戦略を効果的に計画することができます。

競争力のあるスプレッド
さらに、競争力のあるスプレッドを提供するプラットフォームは、取引コストを低く抑えることができるため、投資家にとって有利です。Exnessは、市場で最も競争力のあるスプレッドを提供しており、取引コストを最小限に抑えることで、投資家の利益を最大化するサポートを行っています。

取引環境とユーザー体験
プラットフォームの使いやすさ
ユーザーインターフェースが直感的で使いやすいプラットフォームは、取引の効率性を高めます。Exnessは、シンプルでわかりやすいインターフェースを提供しており、初心者でも簡単に操作できます。また、モバイルアプリも提供されているため、場所を選ばず取引を行うことが可能です。

高速な取引実行
取引のスピードは、特にデイトレーダーにとって重要な要素です。Exnessは、高速で安定した取引実行を提供しており、市場の変動に迅速に対応できるため、取引機会を逃すことがありません。これにより、投資家は効率的に取引を行い、利益を最大化することができます。

多様な取引商品
多様な取引商品を提供するプラットフォームは、ポートフォリオの分散を図るために重要です。Exnessは、通貨ペア、株式、コモディティ、暗号通貨など、幅広い取引商品を提供しており、投資家は自分のリスク許容度と投資目標に応じた取引商品を選ぶことができます。

信頼性と安全性のある取引プラットフォームを選ぶことは、成功するための第一歩です。規制とライセンス、利用者のレビュー、取引ツールと機能、データの保護、資金の分離管理、認証とセキュリティ対策、顧客サポートと教育リソース、透明な手数料と競争力のあるスプレッド、使いやすさ、高速な
#3 【React】ResizeObserverでDOM要素のサイズを監視する

# はじめに

DOM要素のサイズが変更されたことを検知して、そのサイズにあったコンポーネントの表示に変更したいといったことがあるかと思います。

ReactではuseRefを使用することでDOM要素にアクセスすることが可能ですが、変更があってもコンポーネントが再レンダリングされないためDOM要素のサイズ変更を検知することができません。

そういった場合には、ResizeObserverというWebAPIを使うことで実現することができます。

## サンプルコード

以下、サンプルコードになります。右端を選択してドラッグするとプレビューで動作を確認できます。
（プレビューをデフォルトで表示する方法がわかる方教えてください:bow_tone2:）

画面にDiv要素が表示されていて、リサイズするとdiv内に表示しているwidthの値が変更されるサンプルになります。

https://codesandbox.io/embed/d8jwdk?view=editor+%2B+preview&module=%2Fsrc%2FApp.tsx&fontsize=12&previewwindow=browser

## 解説

まずは、コンポーネントで保持するwidthのstateとdiv要素への参照を定義します。

```typescript
  const [width, setWidth] = useState<number | undefined>();
  const ref = useRef<HTMLDivElement>(null);
```

次にResizeObserverを定義します。その際のコールバック関数として、サイズ変更を検出したときの処理を渡します。ここでは、stateの更新処理を行っていますので、DOM要素のサイズ変更が行われるたびにコンポーネントがリレンダリングされることになります。

```typescript
 const elm = ref.current;
 const observer = new ResizeObserver(() => setWidth(elm?.offsetWidth));
```

observe()、unobserve()は、それぞれパラメーターで設定した要素のサイズ監視を開始、終了するメソッドです。useEffectで監視を開始し、クリーンアップ時に監視を終了しています。

```typescript
    if (elm) {
      observer.observe(elm);
    }
    return () => {
      elm ? observer.unobserve(elm) : "";
    };
```
[Tips集]OCVSへの移行プロジェクトで困ったこと＆解決方法の一覧

OCVSのプロジェクト（VMware基盤のオンプレミス→クラウド移行）を実施中のお客様において、いくつか困ったことが発生し、支援したもののナレッジが溜まってきましたので、こちらに記載することで他のお客様でプロジェクトがすいすい進むようお祈りしたいと思います。

### HCXでvMotionを実施する際に帯域制御をかけたい
オンプレミス環境の vSphere Web Client の HCX プラグインから設定する。
(コンフィグの途中でWAN Optimizationという項目があり、ここで帯域制御のパラメータを設定できる)

#### ↑で帯域制御を仕掛けたのに制御されない
WAN Optimizationを再デプロイしてみてください（設定完了だけでは再デプロイされない）

### OCVSの仮想マシンからFTPなど通信が遅い
トロンボーントラフィックが発生していませんか？HCXのMON(Mobility Optimization Networking)を有効にしてみてください。調査は↓を参考に、tcpdumpやiperf3等で地道に速度を測っていくしかありません。

### そもそもOCVSの仮想マシンからFTPなどの通信が失敗する
以下を確認してみましょう。
1.tracerouteによる経路確認
　- FTPサーバー→FTPクライアント
　- FTPクライアント→FTPサーバー
　経路が想定通りか？非対称ルーティングは発生していないか？
2.FTPモードの確認
　- アクティブモード/パッシブモード
アクティブモードの場合パッシブモードでの接続は可能か？
3.その他
　- FTPサーバー/クライアントのOS種別とバージョン
　- FTP以外のSSHなどの通信
　- 各種ルーターが示されている簡易構成図を起こして被疑箇所（FireWall等で途中遮断されていないか）の確認

### OCVSのホストを削除する際にNSX-Tの状態を確認せずいきなりホストをTerminationした！
基本的には問題はないですが、NSX-Tのマネージャーノードにログインしてget nodesコマンドでゴミが残ってないことを確認しましょう（削除したノードがなんらか残っていないか実行結果を確認）

### MONを利用する場合にDRGアタッチメントのVCNルート表にスタティックルートが必要だが、VCNルート表のルートルールを追加したい
OCIで初期の上限は200となっているので、それ以上必要であれば拡張申請をしてください。上限は公表できないので営業経由でエンジニアに問い合わせることをおすすめします。

### Veeamを利用してOCVS仮想マシン上のOracle Databaseをバックアップする方法
1.Agentレスバックアップ
Oracle Databaseを意識せずVMwareの仮想マシンとしてバックアップを取る手法です。VMware ToolsやスケジュールでBEGIN Backup/END Backupを実行してOracle Databaseのオンラインバックアップができます。
2.Oracle Agentを利用したバックアップ
Oracle Database用Agent(Plug-inとは別物)を仮想マシンへインストールして、システムバックアップとともにRMANと連携してバックアップを取る手法です。
3.Plug-in for Oracle RMAN
Veeam AgentのPlug-inとしてOracle Databaseのバックアップだけを取得する方法です。システムバックアップは別に取る必要があります。

### OCVSをご採用いただいたお客様に深く感謝を申し上げます。
今後も適宜、追記していきます😼
AWS CloudWatchアラーム履歴が30日間に延長！


CloudWatchの地味アプデがありました
アラーム履歴にアクセスできる期間を延長されたとの事です。

あまり普段アラーム履歴について見る事がないので、この際活用方法など考えてみようかと思います。（結果特に思いつきませんでしたが）

Amazon CloudWatch が 30 日間のアラーム履歴を提供開始

https://aws.amazon.com/about-aws/whats-new/2024/05/amazon-cloudwatch-offers-30-days-alarm-history/

# ■CloudWatchのアラーム履歴について
CloudWatchアラームを開いて「履歴」から確認できます

![履歴1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954355/cbd7e064-bf0c-870c-2d05-b3b7dbd3e12e.png)


少し勘違いしていた部分があったんですが、ここで見れるのはアラームの変移履歴だけではありません。
具体的には以下の３つを確認する事ができます。

:::note info
・StateUpdate（状態更新）
→ アラームの状態には、「OK（閾値内）」「ALARM（閾値外）」「INSUFFICIENT_DATA（データ不足）」の３つがあります。
:::

:::note info
・Action（アクション）
→ 例えば、SNSトピックに通知を送信したり、Auto Scalingグループをスケールアップまたはスケールダウンしたなどです。
:::

:::note info
・ConfigurationUpdate（設定更新）
→ アラームの設定更新に関する項目です。
:::

# ■どんなアップデートがあったのか
元々は2週間のアラーム履歴を遡る事ができましたが、最大30日遡ってアラーム状態の変化の履歴を確認できるようになりました。

ただ30日間全ての履歴が見れるという条件ではありますが、状態変移が多かったアラームを見ると履歴の最大数は「50件まで」のような気がします。
（明記されている場所が見つかりませんでした…）

なので10日で100件の項目が発生しても50件しか残らないって事ですね。
必ずしも30日の履歴を確認できるって訳でもなさそうです。

# ■履歴の内容

json形式で見る事もできます。
AWS CLIで引き出す事も可能みたいなので、情報収集やCloudWatchをトリガーとする場合の確認では有用なシーンも訪れるかもしれません。

AWS CLIを使用してアラーム履歴を取得し、ファイルに保存する簡単な例です↓

```
aws cloudwatch describe-alarm-history --alarm-name "your-alarm-name" > alarm-history.json
```

・OKからアラーム状態に更新したアラームの例

```
{
  "alarmName": "[xx]xxxxxxxxxxxxxx-CPU-Utilization",
  "alarmType": "MetricAlarm",
  "timestamp": "2024-05-21T12:36:20.199Z",
  "historyItemType": "StateUpdate",
  "historySummary": "Alarm updated from OK to ALARM",
  "historyData": {
    "version": "1.0",
    "oldState": {
      "stateValue": "OK",
      "stateReason": "Threshold Crossed: 1 out of the last 1 datapoints [89.91787094261954 (23/04/24 15:25:00)] was not greater than the threshold (90.0) (minimum 1 datapoint for ALARM -> OK transition).",
      "stateReasonData": {
        "version": "1.0",
        "queryDate": "2024-04-23T15:30:15.219+0000",
        "startDate": "2024-04-23T15:25:00.000+0000",
        "statistic": "Average",
        "period": 300,
        "recentDatapoints": [
          89.91787094261954
        ],
        "threshold": 90,
        "evaluatedDatapoints": [
          {
            "timestamp": "2024-04-23T15:25:00.000+0000",
            "sampleCount": 5,
            "value": 89.91787094261954
          }
        ]
      }
    },
    "newState": {
      "stateValue": "ALARM",
      "stateReason": "Threshold Crossed: 1 out of the last 1 datapoints [99.60029977516862 (21/05/24 12:31:00)] was greater than the threshold (90.0) (minimum 1 datapoint for OK -> ALARM transition).",
      "stateReasonData": {
        "version": "1.0",
        "queryDate": "2024-05-21T12:36:20.194+0000",
        "startDate": "2024-05-21T12:31:00.000+0000",
        "statistic": "Average",
        "period": 300,
        "recentDatapoints": [
          99.60029977516862
        ],
        "threshold": 90,
        "evaluatedDatapoints": [
          {
            "timestamp": "2024-05-21T12:31:00.000+0000",
            "sampleCount": 1,
            "value": 99.60029977516862
          }
        ]
      }
    }
  }
}
```

以上です！
【Git】git log 範囲指定／ファイル指定

# はじめに
本記事では、以下の状態のリポジトリを参考に解説していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257421/f9270f05-a8e5-da6d-a5b4-4832523af751.png)

# 範囲指定
## (1)指定なし
HEADから参照できる全てのコミットを表示します。
`git log`（⇒コミット1,2,4,5を表示）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257421/c7a8b143-1771-38a4-f3e8-a0a738623bdc.png)

## (2)ブランチ指定
指定したブランチから参照できる全てのコミットを表示します。
`git log origin/main`（⇒コミット1,2,3を表示）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257421/64f1acb8-13c1-f569-f81f-c3790371ade3.png)

## (3)複数指定
指定した全てのブランチから参照できる全てのコミットを表示します。
`git log origin/main origin/develop`（⇒コミット1,2,3,4を表示）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257421/875f53e6-b64f-39a5-981a-b7f01d7e0362.png)

## (4)「^」特定の範囲を除いて指定
キャレット「^」を指定したブランチから参照できるコミットを除いて表示します。
`git log develop ^main`（⇒コミット4,5を表示）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257421/30e092e2-7744-0831-9334-669bdfb2be2f.png)

## (5)「..」ここからここで指定
特定の範囲を指定して表示します。
（※正確には(4)「git log develop ^main」の省略形）
`git log main..develop`（⇒コミット4,5を表示）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257421/30e092e2-7744-0831-9334-669bdfb2be2f.png)

## (6)「...」分岐以降を比較するように指定
指定したブランチ同士の、分岐以降のコミットを表示します。
`git log origin/main…develop`（⇒コミット3,4,5を表示）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257421/fca12649-d199-fbd6-9cc0-ac01faebea3d.png)

:::note info
これまで「origin/main」と指定してきた箇所は、「origin」だけでも同一の動きをするので問題ありません。
なぜなら、ブランチ名を省略するとHEADを見にいくので、「origin/HEAD」を指定＝「origin/main」を指定となるためです。
:::

# ファイル指定
## (1)単一ファイル指定
`git log a.txt`（⇒コミット1,2,5を表示）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257421/1e093e4a-47b6-e972-92f1-649f6e24ee23.png)

:::note warn
削除済みのファイルを指定する時は、以下の通りファイルパスの前に「--」を付与する必要があります。
`git log -- a.txt`
:::

## (2)複数ファイル指定
`git log a.txt b.txt`（⇒コミット1,2,4,5を表示）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257421/d47b1ab0-f4a0-cf95-8b47-b3e4fc695ec5.png)

:::note info
ファイルの指定は、gitリポジトリのルートディレクトリからの相対パスになります。
（本記事のサンプルでは、ルートディレクトリにファイルを置いているため、実質的にファイル指定となりました）
:::

# 合わせ技
範囲指定しつつファイル指定をすると、例えばこんな感じになります。
`git log origin...develop b.txt`（⇒コミット3,4を表示）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257421/0320dd44-53e3-13b6-3ec4-532d46ed7ed5.png)

# おわりに
git logコマンドの範囲指定とファイル指定の方法についてまとめてみました。
華麗にログを表示して開発に活かしていただけると幸いです！

オプション周りについては本記事では触れていないので、他の記事などを参考にしていただければと思います。

また、質問やご指摘など、少しでもお送りいただけると力になりますので助かります。

ご一読いただき、ありがとうございました！
別のAWSアカウントで使用している証明書を使用したい

環境構築中に、作業しているアカウント(以下：Aアカウント)とは別アカウント(以下：Bアカウント)で管理しているドメインを経由して接続を行わなければならないといったことがございました。

その際にALBの構築中に証明書を選択する必要があったのですが、Bアカウントの証明書は当然使用できないため、方法はないかと対応した際の手順をまとめさせていただきます。

<h2>イメージ</h2>

![スクリーンショット 2024-06-06 151050.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3167293/d634b46e-a5f8-3beb-e9f6-a2bfe72f850c.png)

<h1>前提</h1>

・今回使用したいドメインはBアカウントのRoute53で管理している。
・Aアカウントでロードバランサーを作成する際にBアカウントで管理している証明を使用したい。

<h1>Aアカウントでの作業</h1>
<h3>証明書をリクエストする</h3>

1，AWSのホーム画面からAWS Certificate Managerへ移動
2，「証明書を一覧」からリクエストを選択

![スクリーンショット 2024-05-31 162111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3167293/7e422b7e-e2b3-b2d7-9109-657a72ad63cf.png)

3，証明書タイプに「パブリック証明書をリクエスト」を選択して次へを選択。

![スクリーンショット 2024-05-31 163938.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3167293/94423d3d-186b-e9f4-bc2d-4c98c13eff52.png)

4,以下の項目を埋めてリクエストを選択
・ドメイン名：今回利用したいBアカウントのドメインを入力する。
　ワイルドカード証明書が必要な場合は「この証明書に別の名前を追加」をクリックして下記のように入力してください。
 ・検証方法：「DNS検証」を選択
 ・キーアルゴリズム：任意のものを選択
 ・タグ：必要に応じて入力
 
![screencapture-ap-northeast-1-console-aws-amazon-acm-home-2024-05-31-16_27_47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3167293/be71f44c-13e5-4029-220a-a18507cb5c69.png)

5,画面遷移後、ドメイン横のステータスが「自動更新を保留中」となっていることを確認
　※画像が成功となっていますが初回は保留中になっております。
6,ドメインの項目から「CNAME 名」「CNAME 値」を控えておく

![スクリーンショット 2024-05-31 171149.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3167293/cbdc7c53-59d1-57eb-702f-b64a17f24b6b.png)



<H1>Bアカウントでの作業</H1>
<H3>Route53の登録を行う</H3>

1，AWSのホーム画面からRoute53 > (対象の)ホストゾーン > レコードの作成 の順で移動

![スクリーンショット 2024-05-31 170729.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3167293/2136b0d0-742b-3c67-a1f1-7dcb933544c2.png)

2，以下の項目を埋めて「レコードを作成」を選択
・レコード名：Aアカウントの証明書リクエスト時に取得した「CNAME 名」を貼り付ける
・レコードタイプ：「CNAME -別ドメイン名及び～」を選択
・値：Aアカウントの証明書リクエスト時に取得した「CNAME 値」を貼り付ける

![スクリーンショット 2024-05-31 175422.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3167293/6d6d17bb-8321-1faf-5cbf-6dfdbbd1d3ce.png)

<H1>Aアカウントを確認する</H1>

1,レコードを追加してからしばらくすると証明書画面で証明書のステータスが「発行済み」、ドメインが「成功」になります。※私が作業した際は成功になるまでに10～15分程度かかりました。

<H3>[証明書が使用できているか確認]</H3>

・当初の目的であったロードバランサーの作成時に証明書選択のプルダウンから今回登録したドメインが選択できました。
ターミナル文字列出力時、かっこいいエフェクトを追加する

## はじめに
とにかくかっこいい見た目が好きなので、ターミナル・かっこいい・エフェクトというワードを見つけたので、やってみました。

ターミナルの文字列出力にかっこいいエフェクトを追加できるライブラリ「TerminalTextEffects」

https://gigazine.net/news/20240529-terminal-text-effects/

## 環境
- WSL2(Linux-Ubuntu)
- python3が必要

## TerminalTextEffectsインストール

```bash:WSL2:Ubuntu
# アップデート
sudo apt update
sudo apt upgrade -y

# pipxのインストール
sudo apt install pipx -y

# terminaltexteffectsのインストール 
pipx install terminaltexteffects

# パスを通す
pipx ensurepath
```

ターミナルを再起動が必要

## ScreenFetchインストール

紹介されていた記事で使っていたScreenFetchをインストール

```bash:WSL2:Ubuntu
sudo apt install screenfetch
```

ScreenFetchの参考URL

https://zenn.dev/ryuu/articles/screenart-installation


## 実行してみる

たくさんのエフェクトが用意されており、「Effects Showroom」ページで確認可能。

https://chrisbuilds.github.io/terminaltexteffects/

```bash:WSL2:Ubuntu
# 例
screenfetch -N | tte beams
screenfetch -N | tte burn
screenfetch -N | tte binarypath
```


![b1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167772/6dd16557-7c56-2ffb-5633-11b0d6feddf3.gif)


![c1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167772/42278317-c85f-38b2-743f-729c55d74d6b.gif)

#### 他のコマンドは？
あまり試していませんが、「txtファイルをcatでみる」・「lsコマンド」・「historyコマンド」とかもうまく表示できました。

#### 表示がうまくいかない場合もある
screenfetchについては、-Nのオプションをつけないとうまく表示されません。また、screenfetchに似ているシステム情報を表示するコマンドneofetchもうまく表示されませんでした。（もともとカラフルに結果表示するものはダメなのかな、と思います）

## 終わりに
インストールするだけなので、とても簡単です。結果が表示される際にエフェクトがかかるので、表示は当然遅いですが、気分転換にはよいかと思いました。

## 参考URL

https://chrisbuilds.github.io/terminaltexteffects/showroom/
水原一平で CORS を理解したい



<!--

Docker Compose で Uvicorn のサーバを２つたてて
middleware を自作するみたいなことをしたら理解しやすいのかもしれない

-->


ワイ、水原一平、大谷翔平の３人がいます

```
ワイ -> 水原一平
「水原一平さん、今日も天気がいいですな」 *1

水原一平 -> ワイ
「そやな、ところで大谷翔平から銀行口座の暗証番号を聞いてきてや」

ワイ -> 大谷翔平
「大谷翔平さん、水原一平さんから銀行口座の暗証番号を聞いて来てっていわれました」

大谷翔平 -> ワイ
「銀行口座の暗証番号はこれやで、でも教えてもいい人は資産管理会社の社長だけやで」 *2

ワイ 
「水原一平は教えてもいい人じゃないやんけ、ほな暗証番号を教えるのはやめとこ」 *3
```
```mermaid
sequenceDiagram
    participant 水原一平
    participant ワイ
    participant 大谷翔平
    
    ワイ->>水原一平: 水原さん、今日も天気がいいですな
    水原一平->>ワイ: そやな、ところで大谷翔平から銀行口座の暗証番号聞いてきて
    ワイ->>大谷翔平: 大谷翔平さん、水原一平さんから銀行口座の暗証番号聞てっていわれました
    大谷翔平->>ワイ: 銀行口座の暗証番号はこれやで、でも教えても良い人リストはこれやで
    Note left of ワイ: 教えてもいい人リストに水原一平ははいっとらんやんけ、ほな暗証番号を教えるのはやめとこ

```

*1 うっかり悪意のある人、サイトにアクセスしてしまった設定...
*2 極悪人の「水原一平から聞いてきてって言われた」って伝えているのに大谷翔平はピュアJ民だからワイに暗証番号を教えてくれる...
*3 ワイが「これアカンやつやんけ」って大谷から返信を貰った段階で気づいて止める...
*4 ChatGPT に「Mermaid 記法に直して」って言ったら直してくれた ChatGPT 便利過ぎて泣きました...
*5 やめ太郎さんの真似がしたかった...


https://x.com/30R9gmaMUy3guDJ/status/1798826774220230839


<!--

。大谷が指摘するわけではないこと, 大谷からメッセージを受け取った段階で気づくこと, 水原にメッセージを送る段階で気づくわけではないことに留意したい...

-->


https://www.youtube.com/watch?v=RT0BK0q61Gs
Excelの条件付き書式で行に網掛けをする


今回はExcelの条件付き書式で行に網掛けをする方法を覚書していきたいと思います。

## 手順

#### 1. 網掛けしたい範囲のセルを選択します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3069823/0acbe6e0-8961-1ed6-b47a-9bfcdb18d60f.png)


#### 2. ホーム>条件付き書式>新しいルールをクリックします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3069823/fd8b3ff4-72ce-b077-5770-55e0f36e347e.png)



#### 3. 数式を使用して、書式設定するセルを決定をクリックします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3069823/f362cca2-ffa7-34b9-c143-92afd046bc94.png)


#### 4. 数式を設定します

以下、どちらかの数式をコピペしてご利用してください

↓偶数行に色をつけたい場合
`=MOD(ROW(),2)=0`

↓奇数行に色をつけたい場合
`=MOD(ROW(),2)=1`

------------------------------------------------
実際の設定例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3069823/cd31831e-7e14-12b7-70a5-502168d0990e.png)

#### 5. 書式を設定します

新しい書式ルールの右下の[書式]ボタンをクリックします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3069823/be7f29c6-8950-d55f-f441-1fd4610da95f.png)

[塗りつぶし]タブ>お好みの色を選択したら、[OK]ボタンをクリックします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3069823/23aa0862-a50a-219f-9bb8-3f7baaea0a4b.png)

続いて、新しい書式ルールの右下の[OK]ボタンをクリックします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3069823/b2215d1d-e56b-cbe4-4735-718c7e1a337e.png)


## 出来上がり

ちゃんと網掛けされました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3069823/cda87abd-cd03-8640-6d64-2b69e57158f3.png)


## おまけ (網掛けの範囲を変える方法)

設定した条件付き書式の管理は、ホーム>条件付き書式>ルールの管理からできます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3069823/e6744cd5-c324-abb8-ca48-63c7d23ddd41.png)

初期値の書式ルールの表示が[現在の選択範囲]となっているので、[このワークシート]に変更します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3069823/54c3a772-b7f6-2831-7102-580d6cc9589e.png)

すると、先ほど設定した条件付き書式が表示されました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3069823/ca2ca51c-7672-3632-dbf4-3b4ced9c4c0d.png)

あとは、赤四角で囲った部分へセル番地を指定してあげるか、赤丸で囲った部分をクリックして直接手で範囲選択し適用することで、網掛け範囲を変更することができます◎

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3069823/a0be1b3b-4825-c22b-947f-43d7429c5d2e.png)

ちなみに、[ルールの削除]をクリックして適用すると網掛け設定を削除することができますよ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3069823/a4c52dab-8dc4-6c3c-10c4-4f2550a805ef.png)

## おわりに

読んでいただきありがとうございました！

お役に立てれば幸いです。

------------

**参考記事**
* [1 行おきまたは 1 列おきに色を設定する](https://support.microsoft.com/ja-jp/office/-1-%E8%A1%8C%E3%81%8A%E3%81%8D%E3%81%BE%E3%81%9F%E3%81%AF-1-%E5%88%97%E3%81%8A%E3%81%8D%E3%81%AB%E8%89%B2%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B-30002ce0-7a1c-4d70-a70c-4b6232f09f5e)
LLMで機能分解木をつくる。v1

# chatGPTで機能分解木を作る。v1

## 機能分解木とは
機能分解木は親目的ー子方式ー子目的ー孫方式ー孫目的ー・・・と目的を機能を対象として顕在化しながら記述する手法である。目的を達成する手法を書いていく。ある子方式の下階層に複数の小目的を時系列に配置する。方式は基本的には独立である。手法は単語で書き。目的は文章で書く。主語は自明な場合は省略する。

行為に対しては行為分解木と呼ぶが両者をあわせてここでは機能分解木と呼ぶことにする。

## 目的
LLMは過程をよく知っているのでLLMを使って機能分解木を書きたい。しかし，chatGPTは過程＋特徴というまとめ方をするため，過程と特徴が混乱するという問題がある。マインドマップならはこれでOKだが，機能分解木としてはNGである。

chatGPT v4o, v4で図を書けというとDalleを用いてしまう。そのために可視化にはPlatUMLのmindmapフォーマットを出力してもらう。親が一つの場合これでdiagramの記述ができる。


## プロンプト
プロンプトをこちらに置く。
https://github.com/nim-hrkn/LLM_FDN
正しくpushできているかわからないが現在はtag: v1である。
prompt/prompt.txtにある。

## 生成過程
phase1 からphase3に分けてある。
1. phase1は第一段階生成
1. phase2でconsistency チェック
1. phase3でplantUMLによる変換を行う

としている。試行錯誤でLLMの誤りからチェックをして欲しい事項を書いたのだが，phase2はうまく動作していない。few shot learnerとしてphase2の替わりに例を幾つか置いたおかげで動作しているように見える。プロンプトの例もLLMでの試行錯誤中にできた成果を使っている。

plantUMLのマインドマップは(https://www.plantuml.com/)で変換できる。plantUMLのマインドマップでは目的と方式の図形を分けることができないので，「目的：文章。」「方式：単語」と表示させている。

この時点での結果を書いておく。

## 結果：明かり

まず，
```
明かりについて説明してください。どのような明かりがありますか。
その原理を説明してください。
```
としてLLMに話してもらう。その知識で十分であれば，
```
「目的：室内を明るくする。'の機能分解木を書いてください。
```
とする。しかし，方式が単語で無いので修正してもらう。
```
方式は単語で書いてください。
```

https://www.plantuml.com/で変化した結果がこちら。

![TP9FJi905CRtFGLhJi52Trw2H1SkC4OvW6yUvO-ADHfGw4gj4KeiA0cAGZpCvp1qvHLySH93Hzmrytrvlr_VJE6mN3mebtRtjal5VI-VCs5YkfMlMLSdaQxwK1UBwpEe4r00wiW7ZfINp-SMxQcU1T9Bm_V5wChu3zAJO6L2IdrThu5Y6-fEJ_ilCZ2bLz34pbcTjBMvuPmimwRs6uQ6ph.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3713556/9a14fbe2-4f0d-ea8c-ad2f-ad55f25412b0.png)

目的ー方式ー目的ー方式と書くことはできたが，時系列を方式で書いてしまうという問題がある。

## 結果：エアコン

```
エアコンの原理を説明してください。
```
で良さそうな回答が得られることを確認してから
```
「目的：エアコンで室内の気温を下げる。」を機能分解木で書いてください。
```
で機能分解木を書かせる。「目的：エアコンで室内の気温を下げる。」の直下の階層の方式で過程を書いてしまう。

```
"""
** 方式：設定調整
** 方式：運転開始
** 方式：冷却
** 方式：空気循環
** 方式：温度維持
"""
を目的で書いてください。
```
とする。

以下の結果が得られた。
![VLBHJkf047tdAtZcA_WLadiVVC0OvGFSNQLgCPX6D81Ah0IM6XeIH4ejyZ73xBPF_e8JDXfPBSa-dPavvyoSBH_LAeUrwjx-lshbe50gwcweEoSVIGUu1Eu3duAO0XjYsCVwAR1GJMvLD0BkhICNc0VSXMDUA9MAwcQ1ITEQN2zN-bfIEPSvJEKOGmAzD5YfrWkmzZVdJrOInNXWcgrIvi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3713556/bf61a590-1474-6b67-53d2-e1b53e8a4397.png)


## 結果：冷媒を循環させて冷却する
```
「目的：冷媒を循環させて冷却する。」を機能分解木で書いてください。
```
再び方式で目的を書いているので修正させる。

```
** 方式：圧縮
** 方式：凝縮
** 方式：膨張
** 方式：蒸発
"""
を目的としてください。
```
ではそれぞれに目的を作成してしまう。

```
"""
* 目的：冷媒を循環させて冷却する。
** 方式：冷媒循環方式
"""
として書き直してください。
とすると正しく書き直せる。

```
![VP5DJW9148Ntd8Brd8AhaEZ21SOe1x0wPZGIGTluCup6dGvW9ahyQNJmCZNLZIklu2ELA8iPDhMeb_UzbwhMNhUzs-riRMzqsZkDg1dIF0mFVegXnEyojcoiV8s3VMAwO4gPxfVxanUcX4sFzqqZYfh-SYR5uC-Z1br2hcJUF0INCrq1-3svzcw4YILJpkQHpOnfiXgn6g9UFxghPAlRMA.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3713556/771b4b99-8317-8ecc-fba3-fa9af2099bdb.png)

## まとめ

- 多くの場合に目的を文章，方式を単語で書けるようになった。（最初はできなかった。）
- 過程を方式で書いてしまうことが現状の欠点である。目的と方式を理解させられるわけでは無い。
- まだ作成できる階層が浅い。
会社では教えてもらえない 上に行く人の 報連相のキホン

https://www.amazon.co.jp/%E4%BC%9A%E7%A4%BE%E3%81%A7%E3%81%AF%E6%95%99%E3%81%88%E3%81%A6%E3%82%82%E3%82%89%E3%81%88%E3%81%AA%E3%81%84-%E4%B8%8A%E3%81%AB%E8%A1%8C%E3%81%8F%E4%BA%BA%E3%81%AE-%E5%A0%B1%E9%80%A3%E7%9B%B8%E3%81%AE%E3%82%AD%E3%83%9B%E3%83%B3-%E8%BB%8A%E5%A1%9A-%E5%85%83%E7%AB%A0/dp/4799106635

## 本書を手に取った背景
そこそこいい年になってきたのだが、過去に報連相がうまくできてなくて失敗したことがあった。
報連相はめんどくさいというイメージがあったが、今一度学び直して、今後のビジネスライフに活かしたいと思った。

## 本書のテーマ
今更必要ないと思っている報連相に焦点を当て、きちんと仕事をしているのに評価されない。仕事が思うように進まない。と悩んでいるビジネスパーソンに向けて書いている。

## 個人的なポイント
#### ①　ミスやトラブル時
速さに最大の価値がある

174ページ
1　なんの報告なのか
２　現状を伝える
３　自分の考え答えを伝える
４　相手に意見　アドバイスを求める

お聞きしたいより、教えていただきたい
時間をくださいより、◯◯の件です

#### ②　心構え
上司の方が忙しい
上司の気持ちになる
上司はなんだかんだ、報連相の上手い人がほしい

#### ③　どこにいっても活躍できる能力
・リーダーシップ力
・報連相

#### ④　
報告は、上司も一緒に考えてもらうこと
相談ができる人が上に上がれる

「上司のスケジュールを把握し、実績を作り、アピールして評価をあげていくこと」が上に行くポイント
これらを行う部下たちと熾烈な争いをして登っていく


#### ⑤　常時行うこと
・やったことのメモをとっておく
・まとめておく　テンプレは１１７ページ
・何かあったら随時チャットで共有

#### ⑥　方法
・３点要約法
１つ目は〇〇、２つ目は◯◯、３つ目は◯◯です。まず１ですが、、、という感じで話す

・３ステップ
何に関する報告か→結論はどうなったのか→今後どうしていくか

結果報告、経過報告もある

じぶんの評価をあげる報告は「しかし」ではなく、「そこで」を使う。
いくつか候補がありましたが、◯にしました。そこで、◯を使うと予算オーバーしますが、売上増が見込めます。

#### ⑦真新しい手法なんかない
大事なのは上司のスケジュールを把握し、タイミングを見計らって適切にホウレンソウすること
一人で進めたり、アピールできてなければやってないことと同じになってしまう
言われるのはめんどくさいけど評価されないよりはまし

ゴールは「提案までできるようになる」ということ

## 今後やれること
この内容をもとに上司とコミュニケーションをとる

## まとめ
優先順位や常に本記事に書いてあることを意識しているかどうかかもしれない。
いつも念頭にあるのは対応を進めることだが、認識を変えないといけない。
Edgeの分割機能でVueのデバッグがとても簡単になった

Viteにはデバッグツールが備わってるんです。
![2024-05-31 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744180/80f29cac-7720-18b4-ad05-8e99a43d886d.png)
しかし、ここのボタンから使うととても画面が邪魔。
そんなときにEdgeの分割機能！　簡単に開発者ツールの大きさを調整可能！
![2024-05-31 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744180/f74f956f-8474-6428-20c7-192c2f4920e2.png)
ウインドウでの分割ではないので、最小化もワンクリックで簡単♪
また、下のボタンからとは違い縦に伸びているのでスクロールの手間が少なくなる！

でひこれを機にEdgeの検討をお願いします。
Apple Developer Programの登録が全然進まない！！

# Apple Developer Programの登録ができない！
初めWebの方で登録していたが、アクティベーションメールが返ってこないという現象に襲われた。Appleのサポートに問い合わせたところ、Developerアプリを使って登録をしろと言われるのみだった。
とりあえず、Developerアプリをで登録を進めることにした。

# 本人確認書類が通らない。
ほんっっとに通らないです。自分は20回ぐらいやってやっと通りました。それまでにいろいろやったことがあるので、それについてまとめておきます。
とりあえず、自分と似たようにApple Developer Programの登録に苦しめられた以下のサイトが参考になったのと心の支えになりました。
https://zenn.dev/chiiirotty/articles/39cbd153be639f

# 本人確認書類を通すときに行ったこと
iPhoneのDeveloperアプリで登録しましたが、自分は以下のような登録手順になっていました。
1. 性、名、電話番号の登録
1. 本人確認書類の種類の選択(パスポートかその他の書類か)
1. 本人確認書類の表面の撮影
1. 本人確認書類の裏面の撮影

ここで、送信を押すとしばらくたった後に、「情報が確認できませんでした」と「情報が無効です」の2通りが返ってきました。

「情報が無効」っていうのは、免許証がダメなの？って思っていましたが、上のサイトで通ったという話だったので、何回も送りました。原因ですが、手順1のところで性と名を反対に入力していたっのが原因かなと思っています。はじめApple IDの名前のところが漢字だったので、手順1.のところが空欄だったのですが、Apple IDの名前をローマ字表記に直したことで、手順1. が自動で入力されたおかげで気づけました。皆さんも気を付けてください。（こんなことをぽかすのは自分だけでしょうか...)
次に、本人確認書類の写真撮影ですが、免許証の場合てかてか反射しているので、それを防ぐために周りを覆いながら撮影を行っていました。そのため、全体的に暗い感じになっていたのですが、通らなかったのはこれが原因ではないかと考えています。

暗いのがダメなのかなと思ったので机のスタンドライトを使って、明るくするようにしました。ただ、直接光を当てると反射が映り込んで、本人確認書類が白飛びしてしまうので、私は、壁に光を向け、間接照明で本人確認書類を明るくすることを意識しました。本人確認書類をこの方法で撮影したところ、2回目で通りました。
とりあえず、本人確認書類がなかなか通らない場合は、以下の条件を満たしていることを確認すると良いかもしれないです。

・本人確認書類が全体的に明るい
・本人確認書類の白飛びなどの光の反射が写っていない

自分の場合は、本人確認書類が通った後は、サブスクリプションの購入までエラーなしに到達することができました。
皆さんの検討を祈るとともに、この記事が心の支えになることを願っています。