OmniAICreator/Qiita-1.07M huggingface dataset:
99%負けない鞘取りbot：Bybit編

# 趣旨
僕もせっかくbotが書けるようになったので鞘を取るようなbotを書いてみたいと思って一番簡単に書けそうなコードを書いてみました。

Bybitのステーブルコインの仕様を利用してあまりお金にならないけど、お金が減る可能性も極限に低いゆるい脱力botです。

USDC/USDTペアはBybitでは手数料がかかりません。
なので指値注文で1超・未満になった時、必ず後でその逆に行く性質を利用します。

:::note alert
以下のコードを実行する場合は全て自己責任でお願い致します。
本記事は教育目的での共有であり、投資を勧誘するものではありません。
:::

# 環境設定
まずは仮想環境を用意します。
用意しなくてもコードは実行できますが、念のためにやっておいた方が良いです。
```
python3 -m venv myenv
source myenv/bin/activate
```
次にディレクトリを作ってそのディレクトリの中に移動します。
```
mkdir bybit
cd bybit
```

# コード（コピペ可）
結果を先に表示すると以下のように注文が入ります。
このコードでは "Insufficient balance" が多発します。
それで正常な動きとなります。
```
Last Price: 1.0001
Selling USDC for USDT
An error occurred: bybit {"retCode":12131,"retMsg":"Insufficient balance.","result":{},"retExtInfo":{},"time":1706641077175}
Current time: 2024-01-30 18:57:54 UTC
-------
Last Price: 1.0001
Selling USDC for USDT
An error occurred: bybit {"retCode":12131,"retMsg":"Insufficient balance.","result":{},"retExtInfo":{},"time":1706641087431}
Current time: 2024-01-30 18:57:57 UTC
-------
```
## Websocketの設定
Websocketはpybitの方が簡単そうだったので、そっちを使いました。
ここで価格情報を取得します。
価格の判定はここでは行わずに`order.py`に丸投げしてます。

```python: ws.py
import json
import threading
from order import place_order
from pybit.unified_trading import WebSocket
from time import sleep
from datetime import datetime

def convert_timestamp_to_readable(timestamp_ms):
    timestamp_s = timestamp_ms / 1000
    date_time = datetime.utcfromtimestamp(timestamp_s)
    return date_time.strftime('%Y-%m-%d %H:%M:%S UTC')

ws = WebSocket(
    testnet=False,
    channel_type="spot",
)

def handle_message(message):
    if isinstance(message, str):
        message = json.loads(message)
    if 'data' in message and 'lastPrice' in message['data']:
        last_price = message['data']['lastPrice']
        print(f"Last Price: {last_price}")
        place_order(last_price)
    if 'data' in message:
        time = message['ts']
        print(f"Current time: {convert_timestamp_to_readable(time)}")
        print('-------')
    sleep(3600)

ws.ticker_stream(
    symbol="USDCUSDT",
    callback=handle_message
)

while True:
    sleep(10)
```

## CCXT設定
今まで何度も使ってきたccxtのコードですね。
今回は注文の部分だけccxtにしました。
あとは数値を自由に弄って微調整すればbotが完成します。

```python: order.py
import ccxt
import config

bybit = ccxt.bybit({
    'apiKey': config.api_key,
    'secret': config.api_secret,
})

def place_order(price_str):
    try:
        price = float(price_str)
        if price > 1:
            print("Selling USDC for USDT")
            order = bybit.create_order('USDC/USDT', 'limit', 'sell', 10, 1.0001)
            print(order)

        elif price < 1:
            print("Buying USDT with USDC")
            order = bybit.create_order('USDC/USDT','limit', 'buy', 10, 0.9999)
            print(order)

    except ValueError:
        print(f"Invalid price format: {price_str}")
        pass
    except Exception as e:
        print(f"An error occurred: {e}")
        pass
```
## Config設定

APIキーを直に書いて保存しているのでセキュリティに問題があるかも知れません。気になる方は暗号化の方法を学んでご自身で暗号化してください。

```python: config
api_key = ''
api_secret = ''
```
Postgresqlのcsvインポート・エクスポートメモ

# SQL Shellでインポート・エクスポート
* スタートメニュー等から、SQL Shell (psql)を起動する（Enter何回か押して、パスワード入力して「postgres=#」が現れるとこまで行く）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545173/4a539daf-54ad-7f2d-0bd2-276d106b747e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545173/28a03fb4-153d-059e-e8fb-3327d88e2d44.png)

#### test_tblをデスクトップにtest_tbl.csvとしてエクスポート（ヘッダーあり）
```bat
\COPY test_tbl TO 'C:\Users\ユーザー名\Desktop\test_tbl.csv' DELIMITER ',' CSV HEADER;
```
#### SQLの結果をデスクトップにtest_tbl.csvとしてエクスポート（ヘッダーあり）
 ```bat
\COPY (select * from test_tbl where id = 2330) TO 'C:\Users\ユーザー名\Desktop\test_tbl.csv' DELIMITER ',' CSV HEADER;
```
#### test_tblへデスクトップのtest_tbl.csv（ヘッダーあり）をインポート
(TOをFROMに変えるだけ）
```bat
\COPY test_tbl FROM 'C:\Users\ユーザー名\Desktop\test_tbl.csv' DELIMITER ',' CSV HEADER;
```
引数の参考
https://www.postgresql.jp/document/15/html/sql-copy.html




# コマンドプロンプトでエクスポート

前提
・psqlのパスは通っていない
・デスクトップにtest_tbl.csvとしてエクスポート
### コマンドプロンプト内にSQLを直接書く場合
-tと-Aをつけないと文字化けした
```batch
"C:\Program Files\PostgreSQL\16\bin\psql.exe" -h localhost -U postgres -d postgres -p 5432 -c "select * from public.test_tbl;" -t -A -F, > "C:\Users\ユーザー名\Desktop\test_tbl.csv"
```

### SQLファイルを読み込んで実行する場合
デスクトップのsql.txtを読み込んで実行
```batch
"C:\Program Files\PostgreSQL\16\bin\psql.exe" -h localhost -U postgres -d postgres -p 5432 -f "C:\Users\ユーザー名\Desktop\sql.txt" -t -A -F, > "C:\Users\ユーザー名\Desktop\test_tbl.csv"
```


毎回パスワードを求められるのが面倒な場合は、環境変数にパスワードを設定するとパスワード入力しなくて済む
```bat
set PGPASSWORD=パスワード
```
引数の参考
https://www.postgresql.jp/document/15/html/app-psql.html

# 今後
* コマンドプロンプトでヘッダーありでcsv出力する方法を調べる
* メタコマンドのpsetについて調べる
ディレクトリ構造がVSCodeで簡単に作れる「Ascii Tree Generator」の紹介

# はじめに
ディレクトリ構造などを書く時に、よく用いられる記法としてツリー構造が挙げられます。

```md
└── button
    ├── FlatButton
    │   ├── FlatButton.tsx
    │   └── flatButton.css
    ├── RoundedButton
    │   ├── RoundedButton.tsx
    │   └── roundedButton.css
    ├── Button.tsx
    └── button.css
```
こういうのです。ですがこれを自力で書くのはめんどくさすぎますよね？

そんな時に簡単にこのツリーをかけるのが、今回紹介する「Ascii Tree Generator」です！


## 事前準備

以下のリンクから開くか、VSCode上の拡張機能ストアで`Ascii Tree Generator`と検索してインストールします。

https://marketplace.visualstudio.com/items?itemName=aprilandjan.ascii-tree-generator

次に、適当な`.txt`や`.md`ファイルを作成します。

これで準備は完了です。

## 使い方

以下のように書きます。

```
# テスト
## テスト
### テスト
### テスト
### テスト
```

`#`の数で階層が決まります。

これを範囲選択し、右クリックのメニューでツリー構造に変換してくれます。
`Format Text to Tree String`を選択してください。

![スクリーンショット 2024-02-04 22.51.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2778030/7677d1ac-cad2-34c6-7054-880acae449f4.png)

変換されました。`#`の数に応じて階層が深くなっていくのがわかると思います。
![スクリーンショット 2024-02-04 22.54.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2778030/634043e1-a68a-a3f6-a08d-c5096ba268d2.png)

基本的な使い方は以上になります！

## おわりに

最後まで読んでいただきありがとうございました！
デバッガーのStep Into, Step Over, Step Outの使い分け 

## 経緯

普段なんとなくデバッガーを使っていた

Step IntoやStep Over, Step Outの操作の違いについて、使い分けを特に意識せず、
なんとなくで感覚的に使っていた。

ふと気になったので、この機会に調べてみて、
自分なりに使い分けを考えてみた。

## 公式ドキュメント
公式ドキュメントを調べてみた。


>
># [Debug actions](https://code.visualstudio.com/docs/editor/debugging#_debug-actions)
>
>Once a debug session starts, the **Debug toolbar** will appear on the top of the editor.
>
>![Debug toolbar](https://code.visualstudio.com/assets/docs/editor/debugging/toolbar.png)
>
>| Action | Explanation |
>| --- | --- |
>| Continue / PauseF5 | Continue: Resume normal program/script execution (up to the next >breakpoint).Pause: Inspect code executing at the current line and debug line-by-line. |
>| Step OverF10 | Execute the next method as a single command without inspecting or following >its component steps. |
>| Step IntoF11 | Enter the next method to follow its execution line-by-line. |
>| Step OutShift+F11 | When inside a method or subroutine, return to the earlier execution >context by completing remaining lines of the current method as though it were a single >command. |
>| RestartCtrl+Shift+F5 | Terminate the current program execution and start debugging again >using the current run configuration. |
>| StopShift+F5 | Terminate the current program execution. |
>



## デバッガーのstep in, step over, step out の使い分け
以下のように考えてみた。
目的意識がはっきりと持てた気がする。
とくに、Step Into連打して、よく迷子になっていたので、
スコープ内の粒度を意識して、Step Overを使用する用に意識付けると、
コンテキストが保たれるので迷子にならなさそう。

### Step Into 
1行1行処理を追いかけたい時に使用する。
特定の関数やメソッドなど、処理内容を詳細に理解する必要がある時に使う。

### Step Over
現在のスコープ内で処理の流れを追いたい時に使用する。
スコープ内の粒度を保ち、大まかな流れを把握したい時に使用する。

### Step Out
スコープ内で途中まで処理を追いかけて、途中で処理内容を把握できた時に使う。
Step Intoで関数やメソッド内部に入りデバッグするという場面において、
そのスコープ内で知りたい事を把握でき目的が達成された時、デバッグを切り上げるために使う。

2024/2/24 追記
デバッガ―のショートカットのキーマッピングから気づいたが、
Step IntoとStep Overは、F11とShift+F11に割付けられているので、
セットで使うというのは、当たり前の事だったかもしれない。
シュートカットのキーマッピングに着目すると、使い方を理解するヒントになるかもしれない。


## 参考
https://code.visualstudio.com/docs/editor/debugging


## 感想
ドキュメントを読んでいたら、
把握していなかった機能が結構あった。


- Logpoints(処理を一時停止するかわりに、ログを出力するブレークポイント的なもの)
- Data breakpoints(変数へのアクセスや変更に対するブレークポイント)
- Conditional breakpoints(条件式に概要する場合に、一時停止されるブレークポイント)など


実は、VS Codeのデバッガーの機能のほとんどを知らなかった事が分かった。
ドキュメントを読んで見ると、新たな発見が多く面白かった。
【SwiftUI】SFSymbolsのアニメーションはSFSymbolsアプリを活用しよう

# はじめに
iOS17から`symbolEffect`を使用してSFSymbolsにアニメーションをつけることができるようになりました。
しかし、指定の方法が結構難しいです。

```swift
.symbolEffect(.pulse.wholeSymbol)
```

こんな感じで、連なって指定しなければいけないので、いろんなパターンがあり、ビルドして確認するのは大変です。

そんな問題を解決するのが、SFSymbolsのアプリです。
ボタンでポチポチ設定していくだけで、`.pulse.wholeSymbol`ここの部分を生成してくれます。

# やりかた
① 使用したいSymbolを選択します。
![スクリーンショット 2024-02-04 22.15.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/af51ecf8-9b2e-617b-cdf8-51369893bbe1.png)

② セグメントコントロールで再生ボタンを選択します。
![スクリーンショット 2024-02-04 22.19.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/1fb9c50d-ad95-0f74-8e18-e33e0cdecd3f.png)

③ アニメーションの形式と詳細を設定します。
(「プレビュー」ボタンを押すとアニメーションが再生されるので、確認することができます。)
![スクリーンショット 2024-02-04 22.20.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/acc1b436-8ba0-9da1-9690-0f5dd805a848.png)

④ コピーアイコンを押すとメニューが出てきます。
⑤ 「Swift用の構成をコピー」を選択します。
![スクリーンショット 2024-02-04 22.32.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/6fb574f4-fb77-57a9-3124-08eb2a1ac5de.png)


⑥ 先ほどコピーした構成を`symbolEffect`の中にペーストします。
```diff_swift
import SwiftUI

struct ContentView: View {
    @State private var trigger = false
    
    var body: some View {
        Image(systemName: "cloud.sun.rain.fill")
            .font(.system(size: 100))
+           .symbolEffect(.bounce.down.byLayer, value: trigger)
            .onTapGesture {
                trigger.toggle()
            }
    }
}
```

思った通りのアニメーションになりました！
![Simulator Screen Recording - iPhone 15 - 2024-02-04 at 22.35.51.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/d90231a5-f870-79ae-3f05-14f532ede2f1.gif)

# おわり
SFSymbolsのアプリをいじっていたらたまたま見つけました。
今までSymbol名のコピーだけにしか使えないと思ってました。

# 公式ドキュメント
https://developer.apple.com/documentation/swiftui/view/symboleffect(_:options:value:)
Windows 11 HomeでPICKit3を動かすには

# この記事は何？
Raspberry PiやArduinoの価格が高くなっているので、
簡単な事はPICマイコンで処理しようとしました。

しかし、昔購入したPICKit3がなかなか動かせずにLチカまでに
苦労したので、半分は自分用の備忘録として使い方のポイントを書きます。


#### 参考にさせて頂いたURL
開発環境のインストールや初期設定の大部分


https://www2.kaiyodai.ac.jp/~jtahar0/posts/activity19.html

長時間ハマリつづけた電源の問題

https://neo-sahara.com/wp/2017/09/19/%E4%B8%8D%E8%AA%BF%E3%81%AEpickit3%E5%AF%BE%E7%AD%96%E3%81%A7%E3%83%AC%E3%82%B8%E3%82%B9%E3%83%88%E3%83%AA%E3%81%AE%E5%80%A4%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%97%E3%81%A6%E9%9B%BB%E6%BA%90%E7%AE%A1/

# 開発環境のダウンロード
公式サイトから、MPLAB X IDEとC言語のコンパイラをダウンロードしましょう。
コンパイラの方は、使いたいPICマイコンのbit数に合わせて選ぶ必要があります。

https://www.microchip.com/en-us/tools-resources/develop/mplab-x-ide

https://www.microchip.com/en-us/tools-resources/develop/mplab-xc-compilers

古い解説記事では、昔のソフト（MPLAB）が紹介されていると思います。
UIなどが相当変わっているので、惑わされないように注意しましょう。

# インストール
指示に従ってインストールすればOKです。

# レジストリで設定変更
一番のハマリポイントです。

参考URLの画面を参考に、
EnhancedPowerManagementEnabled
を変更してください。

これが無いと、PICKit3でマイコンと通信しようとしても、
「Connection Failed」となってしまいます。


# プロジェクトを作り、コードを記述する。
参考URLと同様の手順で、プロジェクトを作成し、
ソースコードを記述してください。

マイコンの型番を間違えないように注意してください。

# PICKit3からの電源供給
二番目のハマリポイントです。

PICマイコンへの書き込み時には、何らかの方法でマイコンへ電力が
供給されている必要があります。

外部の電源回路が無い場合、PICKitから電力を供給することになりますが、
デフォルトでは供給しない設定となっており、変更が必要です。

MPLAB X IDEでプロジェクトのプロパティを開き、
以下の画像の赤丸を参考に、PICKit3⇒Power⇒Voltage Levelの順に
選択して電圧設定をすれば電源供給ができます。

![20240204_pickit3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111593/0663a6d4-e2eb-0c51-4448-e1db96da308a.jpeg)

# コンパイル⇒書き込み
無事に目的の動作をすればOKです。
「Connection Failed」が出たら、
これまでに記述した事項を確認してください。

それでも出るようならば、マイコンやPICKitの故障を疑うことになります。

# 最後に
Raspberry PiやArduinoは値段が高くなりましたが、
PICは安くて大量に手に入るので、上手に使い分けていきましょう。
【04】Next.js app routerのチュートリアルやってみる(レイアウトとページの作成)

# はじめに

Next.js app routerのチュートリアルの第４章のアウトプットします。

https://nextjs.org/learn/dashboard-app/creating-layouts-and-pages

<details><summary>前の記事</summary>

【01】Next.js app routerのチュートリアルやってみる

https://qiita.com/naoyuki2/items/af58da3d20cbc790e767

【02】Next.js app routerのチュートリアルやってみる

https://qiita.com/naoyuki2/items/edf450b3ee135e83d1e8

【03】Next.js app routerのチュートリアルやってみる
https://qiita.com/naoyuki2/items/612221eac233aa9cbb74

</details>

# 第４章 レイアウトとページの作成

この章では下記を学習しました。

- ファイルシステムルーティングを使用する。
- 新しいルートセグメントを作成するときのフォルダーとファイルの役割を理解する。
- 複数のページで共有されるレイアウトを作成する。
- 部分レンダリングとは何かを理解する。

# ファイルシステムルーティング

`Next.js`ではファイルシステムルーティングというシステムを採用しています。

下の画像のようにフォルダ名がそのままURLになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582046/48be022c-fc62-ca78-7ba3-62a2395d8990.png)

ですが、ただフォルダを作ればルートができるというわけでもありません。

下の画像のようにフォルダの中に`page.tsx`という名前のファイルを作成することでルートが作成されます。

ちなみに`app/page.tsx`だけは、フォルダ名ではなく、`/`だけでアクセスできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582046/d951eccb-ec04-83f5-c405-7f8eb0f1ef27.png)

# layout.tsx

`layout.tsx`は[第2章](https://qiita.com/naoyuki2/items/edf450b3ee135e83d1e8)で勉強したように、アプリケーション全体に共有されるものです。

ですが、下の画像のように`dashboard`フォルダ直下に、`layout.tsx`を追加すると、

- /dashboard/page.tsx
- /dashboard/customers/page.tsx
- /dashboard/invoices/page.tsx

の3つのファイルすべてに共有されます。

逆に言えば、`dashboard`フォルダ外の`page.tsx`には共有されません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582046/9df2a03b-930c-f652-ebb5-c74c2786171b.png)

```jsx:/app/dashboard/layout.tsx
import SideNav from '@/app/ui/dashboard/sidenav'

export default function Layout({ children }: { children: React.ReactNode }) {
    return (
        <div className="flex h-screen flex-col md:flex-row md:overflow-hidden">
            <div className="w-full flex-none md:w-64">
                <SideNav />
            </div>
            <div className="flex-grow p-6 md:overflow-y-auto md:p-12">
                {children}
            </div>
        </div>
    )
}

```

- /dashboard
- /dashboard/customers
- /dashboard/invoices

この3つのページでは、`サイドバー`を共通して表示したいので、`layout.tsx`に`<SideNav />`という記述をしています。

また、`{children}`の中にそれぞれのページのレイアウトが入るといった感じです。

分かりづらいですが、下の画像のように、ページは違えど、`サイドバー`は共通して表示されていることが分かりますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582046/35e1d9bf-e174-6bf8-2028-7b477bafc1c5.png)

そして、`layout.tsx`を使う利点はもう一つあります。

それは、`page.tsx`が更新されても、`再レンダリング`が起こらないことです。

これを`部分レンダリング`といいます。

下の画像のように、`dashboard/setting`から`/dashboard/analytics`に移動しても、`dashboard/layout.js`は共通であるため、`layout.js`に対しては`再レンダリング`が起こりません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582046/a823cfaf-342f-3d60-ea1f-d1f8d5b5df6d.png)

# おわりに

なかなか面白くなってきましたね。

# 次の記事

https://qiita.com/naoyuki2/items/8b71b1d1df7c9435a9c9
Flutter学習のロードマップを視聴して忘備録

Flutterエンジニアを目指す初心者の僕が、最近お世話になっている（個人的に見てるだけ）
Flutter大学さんのロードマップを参考にしようと思ったので、忘備録のためここに残します！

僕と同じ様に下記を知りたい方に。
    ・効果的な学び方を知りたい
    ・できるだけ最短で身につけたい

下記を参考にしました（ほぼ②なぞってるだけですが…）

[【2023年版】Flutterエンジニアになるためのロードマップ (Flutter大学を使い倒す)](https://zenn.dev/flutteruniv_dev/articles/flutter-roadmap)
[Flutter学習のロードマップ](https://youtu.be/kL-xNZmTfFc?si=9nxfIT_vD9GvZe9J)

## ①Flutterに慣れてみる

超入門動画集をとりあえずなぞってやってみる。そうすると画面を作るところまでわかるようになる。
全体（大枠）から攻めて、その次に詳細を攻めていく。身につけることの全体像が見えから、詳細を見ていく方が、地図を見て進んでいくように迷子になりづらくなる。
できるだけ自分が理解・把握していく方向で進めていけば！学びの基本かも！

### Flutterの教科書を読む
Flutter教科書を読むのが筋なのかもしれないが、kboyさんはこれは飛ばしても良いとのこと。
You Tube動画も投稿されてあるので、お財布状況が厳しい僕は、とりあえず動画を見る方で進める…

## ②個人アプリをつくる
現状の自分のレベルを把握する。現状の効果測定。
上の簡単なレベルの「範囲で作る。無理にレベルをあげたものを作ろうとすると挫折する可能性があるので、できるだけ最初は敷居を下げたほうがいいのかもしれない。
	
kboyさんは筋トレ好きだったということで当時、筋トレを記録するアプリを作った。好きなことに関連したものを作ったほうがモチベーションに繋がる！
	
アプリを作ることで、何がわからないのか？どこで詰まるのか？など色々自分のレベル把握することができる。
やっぱり実際に作らないと本当の意味でわからない。
	
	
## ③プログラミングの基礎を身につける
ここまできて、プログラムの基礎を学んでいく。
このタイミングで基礎を身に着けていくことに少し驚いた。最初にここからじゃないんだな。と思った。

kboyさんのおすすめは
[スッキリわかるJava入門 第3版](https://amzn.asia/d/acHT1K8)
名著。プログラム基礎が学べる。
    
それからDartの基礎を学ぶ。その方が吸収力違うみたい！

上記まで基礎を理解したら、教材を読むのではなく、検索とかで対処していくイメージ。

## ④個人アプリをアップグレードする
個人アプリを作ったものをアップグレードする
改善点が見つかるとか。次のアプリ開発でもいい。

ここから難しくなる。モチベ保てないなら、Flutter大学に入るのがおすすめ。
	
## ⑤ zennで記事を10記事書く
私は、知り合いの勧めからQiitaに投稿しました。
アウトプットすることで、更に気づけなかったこととか、わからなかったこととか見えてくる。
教える立場になると、一段と難しくなり、理解が大幅に上がる。人にうまく伝えられないことは、理解していないことと同じことに近い。

## ⑥仕事を獲得する
ここで一気にハードルが上がる。
ここまでで、アプリ開発したものをアプデしたり、記事をアップしたりすること。
実務経験が一番成長が早い。
人脈というコネクションを繋げていく・広げいてくことが、仕事を獲得する近道なのかもしれない！気づき！

## 感想
このロードマップは、kboyさんの経験則に基づくもの、
すべてをこの通りとはいかずとも、参考にする価値ありだと思う！小心者は「郷に入っては郷に従え」精神で学んだら成長の近道かも！？
参考にしよ！それでは！
p5.js でカラーモードが RGB の時に色指定で HSB（HSBA）を使う：ランダムな値の指定でテンプレートリテラルを利用して行う

## はじめに
p5.js で、カラーモードを HSB に変更しないで RGB のままにしつつ、色指定には HSB（HSBA）を使えないかな、と思って試してみた内容です。

例えば、p5.js の　RGB のカラーモードで色をランダムにする時は、以下の書き方をすることがあります。

```javascript
fill(random(255), random(255), random(255));
```

シンプルなプログラムで用いた例は、例えば以下のような感じです。

```javascript
function setup() {
  createCanvas(400, 400);
  background(220);
  noStroke();

  fill(random(255), 100, 200);
  circle(200, 200, 100);
}
```

また、明度や彩度を一定にしつつ色相を変えたい場合は、例えば `colorMode(HSB, 360, 100, 100)` として、以下の書き方を使う方法などがあります。

```javascript
fill(random(360), 80, 100);
```

そんな方法がある中、「カラーモードは RGB にしつつ、色の指定のところで HSB（HSBA）が使えないかな？」と思った場面があり、今回の内容を試してみました。

## お試し用の処理
試した方法は、とてもシンプルです。

以下のリファレンス中に出てくる書式で HSB（HSBA）のものを、色の指定時に使うだけです。

●reference | color()
　https://p5js.org/reference/#/p5/color

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/82e99d5e-b166-a303-a6b3-abe797381fa4.png)

上記は HSB（HSBA）を固定の値にしているため、その部分をランダムにできるようにします。
文字列の中の一部を数値にしたい、という時には、以下のテンプレートリテラルを使うのがシンプルで良いかな、と思います。

●テンプレートリテラル (テンプレート文字列) - JavaScript | MDN
　https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Template_literals

例えば、以下の書き方です。

```javascript
fill(`hsb(${floor(random(360))}, 80%, 100%)`);
```

上記で random() で生成した値をそのまま 1つ目（Hue、色相）の値で使うと、色がうまく反映されないため、floor() を組み合わせています。
（HSB のカラーモードで、p5.js の数値指定で指定するときは `fill(random(360), 80, 100)` などという書き方で問題ないのですが）

直接、数値を指定して試すと、1つ目（Hue、色相）の値は整数で、2つ目・3つ目（Saturation・Brightness、彩度・明度）の値は整数でなくても大丈夫そうでした。

1つ目・3つ目の値をランダムにする時は、以下の書き方で良いです。

```javascript
fill(`hsb(${floor(random(360))}, 80%, ${random(50, 100)}%)`);
```

HSBA の指定をする場合の 4つ目（Alpha、透明度）の値は、以下のような値にします。

```javascript
fill(`hsba(${floor(random(360))}, 80%, 100%, 0.5)`);
```

このようにして、カラーモードが RGB の時にも色指定で HSB（HSBA） を使って、そして値の一部をランダムにするということができました。
Talescaleで外から家のパソコンにリモートデスクトップした話し

# ○やりたいこと
家の中のLAN内の端末に外からスマホでリモートデスクトップしたい

# ○やったこと
スマホと家の中のLAN内の端末にtailscaleをインストールした。
リモートデスクトップはマイクロソフトのRD clientを使用。
宛先はMagic DNSを使用。

# ○結果
スマホから家の中のLAN内の端末にリモートデスクトップできた

## ○わからなかったところ
パソコンのTailscaleの設定がいまいち分からなかった。

# ○その他
仕組みを全然理解していないので公式ページの中身を見てみる。設定方法の詳細は今後記事にする予定。
仕組み全然理解してないけどやりたいことが実現できた。直感的で分かりやすいサービスだ。
Chromeのデスクトップでも良かったけどVPN接続について興味あったのでこちらを実施。
Chromeデスクトップもいつやってみる。

# ○参考記事
参考になりました。ありがとうございました。

Tailscaleについて
https://internet.watch.impress.co.jp/docs/column/shimizu/1303751.html
https://blog.tsukumijima.net/article/tailscale-vpn/#toc1

公式サイト
https://tailscale.com
IBM CloudのVSI(クラシック・インフラストラクチャー)で利用できるOS

**CentOS7**のサポート終了がいよいよ近づいてきました。
本格的にサーバーの移行を進めている方がほとんどかと思います。

今回はIBM Cloud上のサーバーを**CentOS7**から移行する先について自分なりにまとめたので、書き残しておきます。

## IBM Cloudで選べるOS一覧
**IBM Cloud® Virtual Servers for Classic**で選択できるOSの一覧情報はIBM Cloudドキュメント上にはありません。（サポートに問い合わせましたが、無いとのことです😢）
実際に**IBM Cloud® Virtual Servers for Classic**購入画面から選択できるOSは2024年2月頭の時点では以下のとおりです。

|ベンダー|バージョン|
|--|--|
|CentOS|CentOS Stream 9.x - Minimal Install (64 bit)|
|CentOS|CentOS 7.x - Minimal Install (64 bit)|
|CentOS|CentOS 7.x - LAMP Install (64 bit)|
|Debian|Debian GNU/Linux 12.x Bullseye/Stable - Minimal Install (64 bit)|
|Debian|Debian GNU/Linux 11.x Bullseye/Stable - Minimal Install (64 bit)|
|Debian|Debian GNU/Linux 10.x Buster/Stable - Minimal Install (64 bit)|
|Microsoft|Windows Server 2022 Standard Edition (64 bit)|
|Microsoft|Windows Server 2019 Standard Edition (64 bit)|
|Microsoft|Windows Server 2016 Standard Edition (64 bit)|
|Red Hat|Red Hat Enterprise Linux 9.x - Minimal Install (64 bit)|
|Red Hat|Red Hat Enterprise Linux 8.x - Minimal Install (64 bit)|
|Red Hat|Red Hat Enterprise Linux 7.x - Minimal Install (64 bit)|
|Red Hat|Red Hat Enterprise Linux 7.x - LAMP Install (64 bit)|
|Rocky Linux|Rocky Linux 9.x - Minimal Install (64 bit)|
|Rocky Linux|Rocky Linux 8.x - Minimal Install (64 bit)|
|Ubuntu|Ubuntu Linux 22.04 LTS Jammy Jellyfish Minimal Install (64 bit)|
|Ubuntu|Ubuntu Linux 20.04 LTS Focal Fossa Minimal Install (64 bit)|


なお、**IBM Cloud® Virtual Servers for VPC**のOS一覧は以下となります。
https://cloud.ibm.com/docs/vpc?topic=vpc-guest-os-lifecycle&interface=ui

また、ベアメタルサーバーのOS一覧は以下となります
https://cloud.ibm.com/docs/bare-metal?topic=bare-metal-product-lifecycle-classic

## OS選定要素
案件等の要件次第ではありますが、OS選定時に重要となる要素をまとめました。

- GUIの必要性
- メインで動かすアプリケーション
- サポート期限
- 課金

|OS|GUIの有無|系統|サポート期限※1|課金|
|--|--|--|--|--|
|CentOS Stream 9|無|Red Hat|不明※2|無料|
|CentOS 7|無|Red Hat|2024 年 6 月 30 日|無料|
|Debian 11|無|Debian|2026 年 6 月 1 日|無料|
|Debian 10|無|Debian|2024 年 6 月 1 日|無料|
|Windows Server 2022|**有**|Windows|2031 年 10 月 14 日|**有料**|
|Windows Server 2019|**有**|Windows|2029 年 1 月 9 日|**有料**|
|Windows Server 2016|**有**|Windows|2027 年 1 月 11 日|**有料**|
|Red Hat 9|無|Red Hat|2025 年 5 月 31 日|**有料**|
|Red Hat 8|無|Red Hat|2025 年 5 月 31 日|**有料**|
|Red Hat 7|無|Red Hat|2024 年 6 月 30 日|**有料**|
|Rocky Linux 9|無|Red Hat|**2032 年 5 月 31 日**|無料|
|Rocky Linux 8|無|Red Hat|2029 年 5 月 31 日|無料|
|Ubuntu 22|無|Debian|2027 年 4 月 30 日|無料|
|Ubuntu 20|無|Debian|2025 年 4 月 30 日|無料|

※1 前述したように公式からクラシック・インフラストラクチャーのサポート情報がないため、記載したサポート期限はVirtual Servers for VPCのものとなります。(IBMのサポートにも問い合わせしたが、ここのサイトを参考にするようにとのこと)

※2 ベアメタルサーバー側にRHEL9と合わせるという記載があるため、2025 年 5 月 31 日の可能性が高い
https://cloud.ibm.com/docs/bare-metal?topic=bare-metal-product-lifecycle-classic#centos-classic

## 最後に
純粋にcentos7のサポート終了に伴う移行であれば、サポート期間等を見る限りは「**Rocky Linux 9**」が良いかと思います。（RHELと100%の互換性あり）

OSサポート情報については急に変更になる可能性もあるので、基本的には公式からの最新情報を確認するようにした方が良いです。
（この記事を作成している間に、Rocky Linux 9のサポートが始まっていました、大変びっくり）
プログラミングでは知らない事は知らないと言い、エキスパートに説明を求めん

![IMG_8596.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/24658219-8adb-c489-48f3-a055ecbdff3a.jpeg)

「世界一流のエンジニア思考法」を読むと、GAFAで働いているような一流エンジニアでも知らない事は知らないと言うらしい。

「え、そんなことも知らないの？」というぐらいの質問もバンバンするそうだ。

僕も「知っていて当たり前」ではなくて「知らないのが当たり前」という世界観で過ごした方がエンジニアならびに人類は幸せになれる気がする。

日本人的な奥ゆかしさで、質問が恥ずかしければ「大変お恥ずかしくて恐縮なのですが」などと枕詞をつけて聞いたって良い。

「ググレカス」という言葉があるが、ではごく基本的な事柄は人に聞かずにGoogle検索ならびにAIで質問した方が良いのではないか？

いやそうとも限らない。Google検索結果から物事の概念を理解するのは案外難易度が高い。最近は特にGoogle検索の検索結果は粗悪なものになってきている。AIに聞いても常に間違っている可能性がある。

時代は変わったのだ。「ググレカス」では成り立たない。

それよりは口頭やチャットで話している時などに、エキスパートに「それ何ですか？」と聞いてしまった方が早いし、ググっても簡単には得られないような深い洞察まで、短いセンテンスで答えてくれるかもしれない。

Google検索は効率が悪い。AIに聞くのも効率が悪い。「知らないことを気軽に聞けない文化は非常に効率が悪い」という前提を持ちたいと思う。

知らない物事は「エキスパートがものの数十秒で答えてくれる」が最強なのではないだろうか。少なくとも自分はそういう文化の方が好きだ。
`



# チャットメンバー募集


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

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


# Twitter

https://twitter.com/YumaInaura
機械学習の勉強：初歩

機械学習について勉強を始めたので初歩的なことをまとめてみました。


人工知能が機械学習を包含しており、さらに機械学習はニューラルネットワークやディープラーニング（深層学習）を内包しているという関係性

分類問題とは
目的はデータが属するクラス(Yes,Noのような)を予測すること
画像に写っている物の判断も多クラス分類問題

回帰問題とは
目的は連続値などの値の予測であり、要因となる説明変数が1つの場合が「単回帰分析」、複数ある場合を「重回帰分析」

ニューラルネットワークとは
人間の脳内にある神経回路網を人工ニューロンという数式的なモデルで表現したもの
cl.exe による Win32 アプリのビルドについて

## 概要
Visual Studio Community をインストールすると、コマンドラインから C/C++ のWin32アプリをビルドすることができます。いちいちプロジェクトを作ってからコードを試すことがなく、手軽に導入できるので、ちょっと試してみたいときに有効です。手順もそれほど複雑ではないので、覚えてしまいましょう。

## テスト環境
・Windows11 Pro 64bit
・Visual Studio 2022 Community

### パスを通す
環境変数に以下のパスを追加する

    C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\bin\Hostx64\x64

### cl.exe を打ってみる
Deveoper Command Prompt for VS 2022 を起動したら、
cl.exe と打ってみる

    C:\Program Files\Microsoft Visual Studio\2022\Community>cl
    Microsoft(R) C/C++ Optimizing Compiler Version 19.38.33133 for x64
    Copyright (C) Microsoft Corporation.  All rights reserved.

    使い方: cl [ オプション... ] ファイル名... [ /link リンク オプション... ]

と出てきたらOK !

## Win32アプリをビルドする

https://wisdom.sakura.ne.jp/system/winapi/win32/win5.html
から引用したソースコードをメモ帳に書き写す。

```c:test1.c
    #include<windows.h>

    int WINAPI WinMain(
		HINSTANCE hInstance ,
		HINSTANCE hPrevInstance ,
		PSTR lpCmdLine ,
		int nCmdShow ) {
	MessageBox(NULL , TEXT("Kitty on your lap") , TEXT("メッセージボックス") , MB_OK);
	return 0;
}
```

:::note warn
Deveoper Command Prompt for VS 2022 から、コマンドを打ちますが、user32.lib と kernel32.lib、 GUIツールを使うときは、 gdi32.lib をリンクしてください。
これがないとリンクエラーが出ます。
:::

:::note alert
(失敗例)

    D:\win32\test1\cl.exe test1.c
    Microsoft(R) C/C++ Optimizing Compiler Version 19.38.33133 for x64
    Copyright (C) Microsoft Corporation.  All rights reserved.

    test1.c
    test1.c(1): warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐた めに、ファイルを Unicode 形式で保存してください。
    Microsoft (R) Incremental Linker Version 14.38.33133.0
    Copyright (C) Microsoft Corporation.  All rights reserved.

    /out:test1.exe
    test1.obj
    test1.obj : error LNK2019: 未解決の外部シンボル __imp_MessageBoxA が関数 WinMain で参照されました
    test1.exe : fatal error LNK1120: 1 件の未解決の外部参照
:::

:::note info
(成功例)

    D:\win32\test1\cl.exe test1.c user32.lib kernel32.lib
    Microsoft(R) C/C++ Optimizing Compiler Version 19.38.33133 for x64
    Copyright (C) Microsoft Corporation.  All rights reserved.

    test1.c
    test1.c(1): warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐた めに、ファイルを Unicode 形式で保存してください。
    Microsoft (R) Incremental Linker Version 14.38.33133.0
    Copyright (C) Microsoft Corporation.  All rights reserved.

    /out:test1.exe
    test1.obj
    user32.lib
:::

[Wisdomsoft旧](https://wisdom.sakura.ne.jp/system/winapi/win32/index.html)にたくさん例示があるのでいろいろ試してみてください。

## 最後に
環境構築の段階で間違ってしまっていると、当然ビルドが通りません。
今回の場合は、ビルドコマンドを打った時に、ライブラリをリンクしていないとドはまりするので、ご注意ください。
「Amazon Web Service負荷試験入門」を読みました

# 概要
負荷試験のノウハウについてまとめられた教材って少ないですよね。
[Amazon Web Service負荷試験入門](https://gihyo.jp/book/2017/978-4-7741-9262-8)という書籍がクラウドアプリケーションの負荷試験ノウハウについて整理されており非常に参考になります。(2~3周読みました。)
この書籍を読んで、今後参考にしたい、注意したいと感じた点を激選してまとめます。


# メモ
 - 負荷試験の指標の目標値の定め方
負荷試験の指標としては①スループット、②レイテンシの２つが一般的かと思いますが、具体的な事例を元にそれぞれの値の定め方が記載されております。
①スループット：1日の利用者数、一人あたりの1日の平均アクセス数、1日の平均アクセスに対するピーク時の倍率、の3つから最大rps(回/秒)を算出されています。
②レイテンシ：「各APIエンドポイントのレスポンスが〇ms以下」のような目標値が設定されています。〇は適切な値の判断が難しいですが、本書を読んだ感じでは長くても200ms以下が望ましいような印象でした。
 - 負荷試験シナリオの決め方
クラウド時代の負荷試験の目的は **「システムのスケール性を確認すること」** であるため、シナリオはユーザー導線を完全に再現したものである必要はないとされています。(そもそもユーザー導線の完全再現は困難)
「アクセス頻度の高いページ」や「DB参照・更新を伴うページ」などの負荷試験シナリオに取り入れるべきページを網羅できていれば、具体的なシナリオの内容自体は問題ないということです。
 - **全体に対して一度に負荷試験を実施すべきではない**
いきなりシナリオ試験から実施すべきではないという内容です。いきなりシナリオ試験から実施すると、根本のボトルネックがどこなのかわからなくなってしまい、性能の改善が難しくなってしまうためです。
本書では、9つのステップで負荷試験を進めており、実際にシナリオ試験を実施するのはステップ6です。ステップ5までは負荷試験ツールや環境の検証、DB関連の性能検証・・・のように、ボトルネックとなり得る箇所をパーツ単位で試験していきます。これにより、各条件下での最大の性能値を確認しながら負荷試験を進めることができます。前のステップに比べて著しく性能の低下が見られた場合やボトルネックが作り出せない状態になった場合は、現在のステップに何か改善すべき点が隠れているということになります。
なお本書では、良い負荷試験の条件として **「ボトルネックがどこなのか特定できている」** が挙げられています。
「ボトルネックがどこなのか特定できている」を満たしていれば、必ずしも9つ全てのステップを実施する必要はないのだと思います。
 - 試験対象に負荷が集中していること
**「試験対象システムに負荷が集中していること」** も良い負荷試験の条件として挙げられています。評価する必要のない外部連携サービスや周辺システムがボトルネックとなってしまって、肝心な試験対象に十分な負荷がかかっていない状態はNGだということです。(前述の「ボトルネックがどこなのか特定できている」が達成できなくなる)
試験対象システムに負荷を集中させるためには一部本番環境と異なる構成にするという選択もアリだとされています。
 - 負荷試験ツールの攻撃クライアント数は多すぎても少なすぎてもNG
少なすぎる場合は試験対象に十分な負荷がかからずボトルネックを作り出すことができないためNGだというのは想像がつきます。(前述の「ボトルネックがどこなのか特定できている」が満たせない)
一方で多すぎる場合は、レイテンシが正しく測定できなくなる場合があります。実際に処理にかかる時間に加えて、処理に入るまでの順番待ちの時間がレイテンシに加算されてしまうためです。
攻撃クライアント数を徐々に増やしながら、「ボトルネックを作り出せており十分なスループットも観測できている、かつレイテンシの急激な悪化も見られない」クライアント数を見極める必要があります。
 - New Relic便利そう
本書の中で負荷試験のケーススタディの章があり、New Relicが解析ツールとして使われています。New Relicでは1つのWebアクセスをTransactionと呼び、各Transactionの時間消費の内訳が確認できます。例えば外部APIへのアクセスでどれくらいかかっているとか、DB周りの処理でどれくらいかかっているのか、といったことがビジュアルで確認できます。これは負荷試験でボトルネックを分析する際に大いに役立ちそうです。

 # 最後に
 本書の中で **「負荷試験は卓球のラリーである」** というコラムがあり、この説明が負荷試験の概念を理解する上で非常にわかりやすかったです。
また本書ではJMeterの使い方についてかなり詳しくまとめられていますが、個人的にはk6が非常に使いやすいと感じています。後日記事でまとめたいと思います。
GISの基本的なこと

GISの基本的なことを勉強をしたので、まとめていきます。

シェープファイルについて
Esri 社の提唱したベクター形式の業界標準フォーマット

ESRIで公開している仕様
https://www.esrij.com/cgi-bin/wp/wp-content/uploads/documents/shapefile_j.pdf

必須ファイルとオプションファイルで構成される
①必須ファイル： .shp ： 図形の情報を格納する主なファイル。
.shx ： 図形のインデックス情報を格納するファイル。
.dbf ： 図形の属性情報を格納するテーブル。

②オプションのファイル： .prj ： 図形の持つ座標系の定義情報を格納するファイル。ArcGIS で使用されます。
.sbn および .sbx ： 空間インデックスを格納するファイル。空間インデックスを持つと、ArcGIS で空間検索のパフォーマンスを向上させることができます。
など

シャープファイルの制限：
シェープファイルを構成する各ファイルのファイルサイズは2GBが上限
フィールド名には10バイト（日本語5文字）まで


prjファイル(座標系)について
地球上の位置を座標で表すための原点や座標の単位などの取り決めのこと

地理座標系は、3 次元である地球上の位置を緯度と経度で表現する座標系

投影座標系は、3 次元である地球を 2 次元の平面に投影し、XY 座標で表現する座標系

どのような座標系に基づいて GIS データが作成されているのかがわかれば、原点や座標の単位が異なる座標系の GIS データ同士でも重ね合わせることが可能

地図データがうまく表示されない場合、地図データの座標系がそれぞれ異なることが主な原因として考えられます。

日本固有の地理座標系として
日本測地系 2000（JGD2000)は、世界測地系とも呼ばれ、世界的に多くの国で使用されている GRS 80 を準拠楕円体として採用している
日本測地系 2011（JGD2011）は、年）東北地方太平洋沖地震による大きな地殻変動が観測された東日本（北海道を除く）や北陸地方の測量成果に基づいて構築された日本の測地系
そのほかにも、WGS 84は、米国で採用されている世界測地系で、 GPS の運用に使用されています。
【VBA】Outlookの受信メールの件数を取得

以下のような内容でVBEに記述していく。

Sub GetMail()

'Outlookを操作するインスタンス取得
Dim oApp As New Outlook.Application

'Outlook の NameSpace オブジェクトを取得
Dim oNs  As Outlook.Namespace
Set oNs = oApp.GetNamespace("MAPI")

'受信トレイフォルダーを取得
Dim oF As Folder
Set oF = oNs.Folders("任意のプロファイル").Folders("フォルダ名")

MsgBox oF.Items.Count

End Sub

実行すると、メッセージボックスで件数が表示される。

![スクリーンショット 2024-02-04 221507.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2350668/14050222-f132-9d4d-255f-8234398b261c.png)
![スクリーンショット 2024-02-05 033831.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2350668/3b61fc75-f059-9daa-c829-e2c7dfb44d7c.png)
![スクリーンショット 2024-02-05 033956.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2350668/149c7ca6-cc2b-7b83-0b60-94bbd97d93f1.png)
![スクリーンショット 2024-02-05 034139.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2350668/0968bccf-b70e-0cd5-13a3-b4ef4bd21483.png)
![スクリーンショット 2024-02-05 034255.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2350668/c52dfeb6-5192-b91c-f3bc-f1cfb2967eaf.png)
![スクリーンショット 2024-02-05 034354.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2350668/7342c9da-a6f8-856b-ff8f-277ab3c81787.png)

![スクリーンショット 2024-02-05 034439.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2350668/76b80176-0fff-a428-e421-68a9098e9ef3.png)
![スクリーンショット 2024-02-05 034512.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2350668/6419974a-be52-5d99-bb1a-5c167e16d449.png)
空配管に有線LANを入れるのを諦めた話し

# ○やりたいこと
空配管に有線LANを入れる

# ○やったこと
空配管に有線LANをいれる

# ○結果
出来なかった。空配管に全然有線LANが入らない。右側の赤い物が空配管。
![IMG_4292.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3683457/d79287a8-97e3-f53a-c3b6-c156befb8245.jpeg)
DIYするならちゃんと調査が必要。家にあるものでなんとかなると思わないこと…ビニール紐とか専用の針金みたいの買えばできたかも。


## ○ハマったところ
有線LANの先端切って空配管に入れたけど全然スムーズ入らない。
手も痛くなったので諦めて無線の中継機を使った。

# ○参考記事
参考にしました。ありがとうございました。
https://r1st205.com/lan-cable-diy/
自宅ネットワークでポートマッピングしようとして出来なかった話

# ○やりたいこと
自宅ルーターでポートマッピングして外の環境からFortigateにSSL-VPN接続してLAN配下の機器とSSL-VPN通信する

# ○NW環境
![image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3683457/0efd3b60-0494-f407-7279-17b2d6043ec6.jpeg)

# ○やったこと
Aterm WG2600HS2(Wi-Fiルーター)でポートマッピングの設定

# ○結果
契約している回線がポートマッピング対応してなくてポート解放出来なかった。
この結論に辿り着くまでに休みを1日つぶした。
![IMG_4290.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3683457/63388755-2cfc-c091-8205-80dcb4153d3e.jpeg)
PPPoE接続に変更してもダメだった。
Powershellでtest net connectionしてもポートが開いてること確認できなかった。
ウェブでtest net connectionを実施してくれるサイト見つけてやってみてもダメだった。

## ○ハマったところ
ポートマッピング設定でポートが解放できないこと。

## ○わからなかったところ
ipv6プラスからPPPoE接続にしたのに何故ポート解放出来なかったのか。

# ○その他
ポートマッピングとポートフォワーディングはほぼ同じ意味らしい。
Fortigateをルーターの位置に置き換えればポートマッピングを気にしなくて良かったけど、サポート期限切れてるし古いOSだから外に出したくなかったのでこの構成となった。

# ○参考記事
参考にさせていただきました。ありがとうございました！

Atermのポートマッピング設定
https://www.aterm.jp/function/wg2600hs2/guide/portmapping.html

ポートとは
※使われていないポートなら適当なポートでもSSLVPN接続できた
https://27bit.com/question-number.html

v6プラスのポート解放
https://www.akakagemaru.info/port/v6-portfw.html
https://kuritaroh.com/2018/04/05/v6plusportopen/
http://dotsukareta.blogspot.com/2018/01/v6portopen.html
macOS を Ventura にアップデートしたら ssh でサーバに入れなくなった


### 事象

macOS を Monterey 12 から Ventura 13 にしたら、 ssh でサーバに入れなくなった。

### 原因

MacOS Ventura に同梱されているバージョンの OpenSSH がデフォルトで RSA 署名を無効にしているため。

### 対処方法

`.ssh/config` に以下の設定を追加したら解消した。

```conf
Host *
  : (省略)
  HostkeyAlgorithms +ssh-rsa
  PubkeyAcceptedAlgorithms +ssh-rsa
```

人によっては以下の設定も必要だったりする。（Monterey でセキュリティ強化されたため。）

```
  KexAlgorithms +diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1
```

### 参考ページ

https://osxdaily.com/2022/12/22/fix-ssh-not-working-macos-rsa-issue/
魔改造の夜（第8回　カメレオンちゃんダーツ）を題材に、アイデア出しにChatGPTが活用できないか、を検証してみる

# 魔改造の夜（第8回　カメレオンちゃんダーツ）を題材に、アイデア出しにChatGPTが活用できないか、を検証してみる

# 魔改造の夜

第8回　カメレオンちゃんダーツ
　https://www.nhk.jp/p/ts/6LQ2ZM4Z3Q/episode/te/MX7WV473WM/
![IMG_8327.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181708/3e45a045-d6b2-d0e1-9c8a-7d40ee9ccacd.jpeg)

 # 背景
 いまChatGPTを新規企画の際に活用できないか、を検証しています。

 そこで魔改造の夜を題材にアイデア出しに使ってみたいと思います。

 # プロンプト

 ```promp
 あなたは優秀なエンジニアです。
ダーツを7メートル先に飛ばす方法を10個挙げてください。
下記の｛項目｝で表形式でまとめて

＃ルール
火薬の使用は禁止
機械で発射する事


#項目
番号、射出方法、特徴、既存の道具や機械、メリット、デメリット
#例
1、板バネ、板の反動を使用、ボーガン、安定、横幅が大きい

markdown形式で出力して

```
#回答

もちろんです。下記にマークダウン形式で表を再度記載します。

| 番号 | 射出方法      | 特徴                     | 既存の道具や機械            | メリット           | デメリット          |
|------|---------------|--------------------------|--------------------------|-------------------|---------------------|
| 1    | 板バネ        | 板の反動を使用           | ボーガン                | 安定した射出が可能 | 横幅が大きい        |
| 2    | ゴムバンド    | ゴムの伸縮性を利用       | スリングショット        | 簡単に製作可能     | 力の加減が難しい    |
| 3    | 圧縮エアー    | 圧縮した空気を放出       | エアガン                | 強力な射出が可能   | エアタンクが必要    |
| 4    | 弓            | 弓の弾力性を利用         | 弓                      | 遠距離射出に適している | 手入れが必要        |
| 5    | カタパルト    | レバーの原理を利用       | カタパルト              | 大きな力で射出可能 | 設置にスペースが必要 |
| 6    | ピストン      | 機械的な押し出し         | エアピストン            | 精密な力加減が可能 | 構造が複雑          |
| 7    | レールガン    | 電磁力を利用             | レールガン（実験的）    | 高速射出が可能     | 技術的な知識が必要  |
| 8    | トレブシェット| 重量物を利用した反動     | トレブシェット          | 重い物体でも射出可能 | 大規模な設計が必要  |
| 9    | 弾性コード    | 弾性のある紐を使用       | 弾性コードランチャー    | 軽量で携帯しやすい | 耐久性に限界がある  |
| 10   | 電動ファン    | 空気の流れを利用         | 電動ファンを改造したランチャー | 静かに射出可能     | 風向きに左右される  |


この表は、ダーツを7メートル先に飛ばすための様々な方法とそれらの特性を概説しています。それぞれの方法は特定の状況やニーズに応じて選択することができます。


# 感想

最初のアイデア出しには便利そうでした。
RDS Blue/Greenデプロイした後のmigrationファイルはどうするべきか？

RDSのBlue/Green Deploymentsは本当に便利な機能ですね。昔はレプリカのサーバーを0から構築していたことを考えると隔世の感があります。

さて、この機能を使ってDBのスキーマを変更した時に問題となるのが、アプリケーションフレームワークにmigration管理の仕組みがあった場合に、DBのスキーマとmigrationの結果に乖離が生じるというものです。要するにmigrationを使わずに直接DBのスキーマを変更したのと同様の状態になってしまうということですね。

これの対応をすることがあったので参考になればと思います。フレームワークはRuby on Railsです。

## migrationを改ざんして辻褄を合わせる

### 空のmigrationを作成する

```shell
$ bundle exec rails g migration ChangeTableItTakesVeryLongTime
      invoke  active_record
      create    db/migrate/20240204115013_change_table_it_takes_very_long_time.rb
```

```20240204115013_change_table_it_takes_very_long_time.rb
class ChangeTableItTakesVeryLongTime < ActiveRecord::Migration[7.0]
  def up
    # 何もしません
  end
end
```

Railsではこの `20240204115013` という数値がmigrationのidになります。
開発環境でmigrationを実行します。
```
$ bundle exec rails db:migrate
== 20240204115013 ChangeTableItTakesVeryLongTime: migrating ===================
== 20240204115013 ChangeTableItTakesVeryLongTime: migrated (0.0000s) ==========
```

`db/schema.rb` のversion:のところが変更されます。このファイルもcommitします。
```diff
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,7 +10,7 @@
 #
 # It's strongly recommended that you check this file into your version control system.

-ActiveRecord::Schema[7.0].define(version: 2024_02_01_xxxxxx) do
+ActiveRecord::Schema[7.0].define(version: 2024_02_04_115013) do
```

### migrationを実行する

前のステップで作成した空のmigrationを本番環境にdeployします。
空なのでスキーマに変更はありません。
migrationが実行済になっていることを確認。
```shell
$ bundle exec rails db:migrate:status

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20240204115013  Change table it takes very long time
```

### RDSのBlue/Green Deploymentsで切り替えを実施する

ここで本番のDBのスキーマが実際に変更されます。
便宜的にこのステップを挟みましたが、本番DBの変更はどの時点でやっても同じです。migrationの改ざんを事前にやっておくか、後からやるかの違いになります。

### migrationファイルを変更する

```20240204115013_change_table_it_takes_very_long_time.rb
class ChangeTableItTakesVeryLongTime < ActiveRecord::Migration[7.0]
  def up
    # Blue/Greenデプロイで行ったスキーマの変更と同等のmigrationを書きます。
    execute("...")
  end
end
```

既にこのmigrationは本番環境で実行済となっているので、後から改ざんしても再度は実行されません。


:::note warn
migrationのidが間違っていると大変なことになるので必ず開発環境やステージング環境などで同じ手順を踏んで、migrationが実行されないことを確認してくださいね。
:::

### db/schema.rbを更新する

Blue/Greenデプロイで行ったスキーマの変更内容は`db/schema.rb`に反映されていないので、このタイミングで反映させます。

以上で辻褄が合うようになりました。

## あるいは何もしない

上記の手順を不要と判断し何もしないでおく、というのも一つの手です。その場合、migrationファイルにはBlue/Greenデプロイで実施した変更が記録されていない点を留意しておく必要があります。
【Rails】カラムのデータ型、booleanとは？

今日勉強していて初めて扱うカラムのデータ型があったので紹介します！

## booleanとは？？
　**true/falseのいずれかを扱う**ことを想定して設定するカラムです。
 例えばDM機能においてメッセージを既読か未読に分けたいとき、
 既読=true、未読=falseと扱うとデータの管理がしやすくなります。
 
 しかし、マイグレーションファイルに何も制約(あとで説明します)をつけないと、
 nilというカラムの値も存在してしまいます。

 ### 制約とは？

#### NOT NULL制約
 
 モデルを作った時点では、値として`true`、`false`、`nil`の3つが存在してしまい、
 nil=??という状態ができてしまうため、booleanを扱うカラムは、
 基本的に`null: false`という記述をセットでしましょう。
 この記述を**NOT NULL制約**と言います。

 #### DEFAULT制約
 　また、booleanではもう一つ重要な設定が必要です。それはdefaultがtrueかfalseかという記述です。
  この記述がないと、初期の状態(default)がどちらか定まりません。
  先ほどの既読や未読の例を用いると未読が初期状態か既読が初期状態か
  分からなくなってしまい、データ管理ができなくなります。
  （既読がdefaultだとしたら、既読という概念自体いらなくなってしまいます。）
  そのため、defaultの記述も必ずモデル作成後に行いましょう。
  (`default: false` or `default: true`)
  このような記述のことを**DEFAULT制約**といいます。
  
### まとめ

  booleanというデータ型を用いたときは、NOT NULL制約とDEFAULT制約の2点セットを
  マイグレーションファイルに追加し、rails db:migrateすることを忘れないようにしましょう。
  記述例も一応載せておきます。(既読か未読か管理する場合のカラム設定)

  ```Ruby:記述例
t.boolean :read, default: false, null: false
 ```
【ハマったので備忘録】Eclipse2022にTomcat10をインストールする手順

Eclipse2022にTomcat10が入っていなかったので、インストールする手順をまとめました。
いろいろ手こずったので、備忘録として残します。

# ローカル環境
OS：Windows11
Eclipse 2022

# EclipseにTomcat10.0.x系を入れておかないと、以降のバージョン10.1.x系がインストールできない
2024年2月4日時点では､Tomcat10のバージョンは、10.1.x系になっています。
私のローカル環境には。Tomcat9までしか入っておらず、最新バージョンのTomcatであるver10.1.xを入れようとするとエラーになりました💦

![10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1169664/cb97446b-85ee-3945-a367-b35554c4d393.jpeg)


エラーの理由は、<b>Tomcatのバージョン10.0.x系をEclipseに入れていないから</b>ですね。
![11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1169664/4222b573-6a8d-3247-aaad-7dfb7e7878a2.jpeg)

なので、まずはTomcat10.0.x系をインストールしましょう。

# Tomcat公式サイトからver.10.0.xをダウンロードする。

## Tomcat公式サイトへ移動する。
tomcat公式サイトへ移動しましょう。
<b>【公式サイトのURL】</b>
https://tomcat.apache.org/download-10.cgi

このページでは、最新バージョンの情報しか表示されていません。
旧バージョンの、ソフトウェアをダウンロードするためには、赤枠で囲った
<b>「Archives」</b>をクリックしましょう。

![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1169664/692acfa5-cdae-d1c1-893f-bbcdf1c0e3f9.jpeg)

そうすると、こちらのサイトに飛びます。(レイアウトは味気ないですが、ちゃんとした公式サイトなのでご安心を...)

さて、ここからTomcat10.0.x系のものを選択しましょう。
Tomcat10.0.x系のサポート期限は、2022年10月までとのことでしたので、赤枠のソフトウェアをクリックしましょう。

![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1169664/57329da6-de78-c358-172e-1bbc8b2b35ef.jpeg)

そいて、「<b>bin</b>」を選択します。
![3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1169664/2d6e82d0-05d3-fec9-7bd1-d1d86fd7d99f.jpeg)

ダウンロードする形式は、<b>Zip形式</b>でも<b>tar.gz形式</b>でも良いです。
今回は、zip形式を選びましょう。
![4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1169664/96c6290d-ac09-33d2-00e8-dd49e4063ca1.jpeg)

ダウンロードしたZipファイルを解凍したら、まずはCドライブ直下に配置しましょう。
![5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1169664/903fa9e4-814a-0c98-7807-76688b19d57a.jpeg)

つぎに、Pleadesフォルダ配下の、Tomcatフォルダに解凍フォルダを配置しましょう。
ここでは、フォルダ名を<b>「10」</b>に変更しています。

![7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1169664/bf764d55-6252-cd5d-fcd0-ccc19a7d4308.jpeg)

では、Eclipseを起動して、先ほど配置したフォルダを選択しましょう。

![12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1169664/539dac11-1f78-a254-945f-fd085959c60e.jpeg)

Tomcat10では、JREのバージョンをJava8より以降のバージョンを指定する必要があるので、JREのリストボックスからJava8以降のバージョンを選択します。

ここでは、Java11を選択しました。
![13.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1169664/0e2f86b3-f717-49d9-766e-7bbe7a1a7c27.jpeg)

これで、エラーがすべて消えたので<b>「完了」</b>ボタンを押しましょう。
![14.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1169664/47f7cf20-26c6-ea9f-e7ee-6753d2fc9885.jpeg)

Tomcat10が追加されましたね。
![15.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1169664/261b4aa4-c11b-b228-9cac-118a30ba1682.jpeg)

# 動的WebプロジェクトでTomcat10をサーバに追加する。
たとえば、JSTL(Jakarta Standard Tag Library)を使用したいとなると、Tomcat10が必要です。
JSTLを使ったプロジェクトをTomcat10で動かすためには、サーバの設定が必要です。

プロジェクトの上で右クリックして、「サーバの実行」を選択します。
すると、下記の画面が表示されるので、ラジオボタン<b>「サーバの選択方法」</b>から,b>「手動で新規サーバを定義」</b>を選択して、Tomcat10のサーバを設定します。

![16.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1169664/b831e55a-bd50-52c2-cb6e-a1574e62d0ef.jpeg)

以上で、Eclipse2022にTomcat10を仁洙トーする手順をまとめました。（結構てこずった...💦)
お役に立てれば幸いです。
Colab上のPyMC5をGPUで動かす

## はじめに
『Pythonでスラスラわかる ベイズ推論「超」入門』著者の赤石です。
本書の実習のうち、後ろの方の実習は、sample関数呼び出しに相当の時間がかかります。
その対策として、6.3節のコラムに変分推論法の利用について書いているわけですが、他に手はないのだろうかと思っていました。
条件によってはGPU利用が有効であることがわかったので、その方法を説明することにします。
取り上げる例題は、6.3節の『IRT(Item Response Theory)によるテスト評価』です。

## 手順
Colab上でGPUを利用してsample関数を呼び出すための手順は、以下になります。

* ランタイムのタイプをGPUに変更
* ライブラリの更新・追加導入
* sample関数呼び出し時のオプション追加

では、早速、実際に試してみましょう。

### ランタイム環境の変更
Colabのランタイム環境をGPUに変える手順は通常と同じです。
念のため、step by stepで説明します。

最初に画面右上の「接続」のドロップダウンをクリックします。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/4cf86ba2-ee77-4e5a-2b54-ee62a932d16f.png' width=400>

下のメニューが出たら、上から2番目の「ランタイムのタイプを変更」を選択します。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/50944b6a-7e50-a1ef-8e13-f5a9c90ae5a8.png' width=500>

次のパネルが表示されたら、

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/2811ba33-cc96-224b-7aca-676cda78442d.png' width=400>


①ラジオボタンを「T4 GPUに変更」
②「保存」をクリック

とします。

下の画面のように、右上に「T4」という表示がされていれば、ランタイムの切り替えに成功しています。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/653a523c-6209-c8b7-aafa-53485cc0edb1.png' width=400>

### ライブラリの更新・追加導入

Notebookの冒頭に新しくセルをつくり、次のコードを実行してください。

```
# ライブラリの更新・追加導入
!pip install 'pymc>=5.9' | tail -n 1
!pip install numpyro | tail -n 1
```

PyMCのバージョンを上げ、　更にnumpyroというライブラリを追加導入しています。

### sample関数のパラメータ追加

次のように、``nuts_sampler="numpyro"``のパラメータを追加します、

```
%%time

with model1:
#    idata1 = pm.sample(random_seed=42)
# サンプリング関数呼び出し時のパラメータ追加
    idata1 = pm.sample(random_seed=42, nuts_sampler="numpyro")
```

## 結果

これだけの対応で、処理時間は劇的に早くなります。
以下に、実際の結果の画面コピーを示しました。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/15ab29b5-06a9-f4d2-8e0a-60292fbc0c8a.png' width=800>

普通にCPUを使った場合、約15分 必要だったサンプリングの処理時間が、わずか2分で済むようになりました。

## 注意点

試したところ、GPU化は向いている処理と、向いていない処理があるようです。
ここで示した6.3節の実習は、確率変数の数が多く、それが処理に時間がかかっている理由でした。
こういうタイプの処理には、GPUは向いています。
逆に、確率変数の数は少ないが``target_accept=0.998``のように、target_acceptの値をチューニングしているため処理に時間がかかる5.3/5.4節の場合は、GPU化することで時間が余分にかかるようです。
GPUを利用する場合は、この点に注意するようにしてください。

## おわりに
活用するための制約があるとはいえ、たったこれだけの変更でGPUが使えることにビックリしました。
PyMC、まだまだ私の知らない凄いところがあるようです。


## 参考リンク
今回の話を6.3節に適用した実装コードは、下記にアップしておきました。

https://github.com/makaishi2/python_bayes_intro/blob/main/sample-notebooks/6_3_IRT%E3%81%AB%E3%82%88%E3%82%8B%E3%83%86%E3%82%B9%E3%83%88%E7%B5%90%E6%9E%9C%E8%A9%95%E4%BE%A1_GPU%E7%89%88.ipynb
【Vue3 / Composition API】親コンポーネントから子コンポーネントのメソッドを実行・データを参照

## 課題
- 親コンポーネントから子コンポーネントのメソッドを実行したい
- 親コンポーネントから子コンポーネントのデータを参照したい

## 解決策
1. 子コンポーネント側で、`defineExpose`を使用して外部から参照可能なプロパティの定義をする
2. 親コンポーネント側で、子コンポーネントにアクセスができる`ref`を使用する
3. 親コンポーネント側で、(2) で定義した`ref`を通して、(1)で定義した参照可能なプロパティにアクセス、実行する

```vuejs:子コンポーネント
<template>
  <button @click="countUp()">{{ count }}</button>
</template>

<script setup>
import { ref } from "vue";

const count = ref(0);

const countUp = () => {
  count.value++
};

// "defineExpose"を使用して、外部から参照できるプロパティを定義する
defineExpose({
  countUp,
  count
});
</script>
```

```vuejs:親コンポーネント
<template>
  <div>
    <ChildComponent ref="child" />
    <button @click="onChildClick">子コンポーネントのカウント + 1</button>
    <p>子コンポーネントのカウント: {{ childCount }}</p>
  </div>
</template>

<script setup>
import ChildComponent from "./ChildComponent.vue";
import { ref, onMounted } from "vue";

// 子コンポーネントにアクセスする為の"ref"を定義
const child = ref(null);

const onChildClick = () => {
  // "ref"を通して子コンポーネントのメソッドにアクセス、実行
  child.value.countUp();
};

const childCount = ref(0);

onMounted(() => {
  // "ref"を通して子コンポーネントのデータにアクセス
  childCount.value = child.value.count;
});
</script>
```
【TailwindCSS】子要素にスタイルを適用する方法

## 子要素にスタイルを適用する

以下のように記述すると子要素の`<li>`にスタイルを適用できます。

```html
<ul class="[&>li]:p-1">
  <li>サンプル</li>
</ul>
```

また`&>*`とすると全ての子要素にスタイルを適用できます。

```html
<ul class="[&>*]:p-1">
  <li>サンプル</li>
</ul>
```

## 子孫要素にスタイルを適用する

以下のように記述すると子孫要素にスタイルを適用できます。

```html
<ul class="[&_a]:block">
  <li><a href="http://example.com/">サンプル</a></li>
</ul>
```
Next.jsをFirebaseにCI/CDするときCaller is missing permission 'iam.serviceaccounts.actAs' on service accountエラーになる

# はじめに

Next.jsをFirebaseにCDをするさいにGCPの権限でつまづいたのでまとめます

# 問題

```
$ firebase deploy
```

をすると以下のようなエラーが発生して失敗しました

```
⚠  functions: HTTP Error: 403, Caller is missing permission 'iam.serviceaccounts.actAs' on service account projects/-/serviceAccounts/407119337190-compute@developer.gserviceaccount.com.Grant the role 'roles/iam.serviceAccountUser' to the caller on the service account projects/-/serviceAccounts/407119337190-compute@developer.gserviceaccount.com.You can do that by running 'gcloud iam service-accounts add-iam-policy-binding projects/-/serviceAccounts/407119337190-compute@developer.gserviceaccount.com --member MEMBER --role roles/iam.serviceAccountUser'where MEMBER has a prefix like 'user:' or 'serviceAccount:'.Details and instructions for the Cloud Console can be found at 
```

# 解決方法

権限を追加することで解決しました

GCPの「IAM」から作成したサービスアカウントの鉛筆マークをクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/1cac3697-7144-1f97-2990-70e621118e18.png)

`iam.serviceAccountUser`(サービスアカウントユーザー)を追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/1df3626e-7e16-b345-e500-0077d53f891d.png)

これでうまくいくようになりました

# おわりに

かなり沼りましたがなんとかいきました
どのアカウントにロールをつけるかが大切でした
【GitHub 】PRを下書き状態にする

# はじめに
Pull Request（PR）を勝手にマージできなくなる方法を紹介します！

# 前提
- Gitのリポジトリは、PublicでないとDraft状態にならないので注意（※組織ではPrivateでもなります。）


# Draft Pull Requestについて

- Draft Pull Requestは、下書き状態のこと~~PRがまだ完了しておらず、レビュー待ちであることを示す状態のこと~~

# Draft PRの作成方法

1. コミットしたい変更をブランチにコミットする

2. PRを送信する前に、PR作成の際に「Draft」を選択

![スクリーンショット 2024-02-04 20.15.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/923146/dd344cfb-4d98-746c-4056-587a59734f77.png)

![スクリーンショット 2024-02-04 20.16.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/923146/975e34f9-1e40-a6fc-e1dd-39394079614e.png)

 3.下記のような状態になり、勝手にマージできなくなる

![スクリーンショット 2024-02-04 20.16.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/923146/90ec5aa5-c0e8-95f2-20df-952c075d58a7.png)

 4.「Ready for review」をクリックすると下記の状態になりマージができる

 ![スクリーンショット 2024-02-04 20.16.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/923146/4b1d595f-e325-d4d9-31e0-bda207f8276d.png)




# まとめ

- Pull RequestをDraft状態にして、意図せぬマージを防ぐための方法を紹介しました。参考になれば幸いです。


# 参考資料
- [GitHubブログ](https://arc.net/l/quote/dndolumb)