OmniAICreator/Qiita-1.07M huggingface dataset:
Flask: Google でログイン

こちらのページと同じことを、Arch Linux で行いました。
[Create a Flask Application With Google Login](https://realpython.com/flask-google-login/)

コードは、zip でダウンロードできます。
>materials-flask-google-login.zip

## client_id　を作成
次を入れて下さい

承認済みの JavaScript 生成元
>https://127.0.0.1:5000

承認済みのリダイレクト URI
>https://127.0.0.1:5000/login/callback


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/d186824f-b04b-387e-10a3-045be18dba4e.png)

## 必要なライブラリーのインストール

```bash
sudo pacman -S python-flask
sudo pacman -S python-flask-login
sudo pacman -S python-pyopenssl
```

## コードを解凍

```bash
unzip materials-flask-google-login.zip
```

```text
$ tree
.
├── Pipfile
├── Pipfile.lock
├── README.md
├── app.py
├── db.py
├── requirements.txt
├── schema.sql
└── user.py
```

## データベースの初期化

```text
$ python app.py
Initialized the database.
```

## サーバーの実行

実行スクリプト

```bash
export GOOGLE_CLIENT_ID="371868132900-e******.apps.googleusercontent.com"
export GOOGLE_CLIENT_SECRET="GOCSPX-J1YsuHlu*******"
export SECRET_KEY="hello"
python app.py
```

実行

```text
$ ./server.sh 
 * Serving Flask app 'app'
 * Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on https://127.0.0.1:5000
Press CTRL+C to quit
```

## クライアントでアクセス
https://127.0.0.1:5000/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/da19f820-7b05-308d-8c20-d1f66b7c46b7.png)

Advanced をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/e3ff3f3e-dc99-70ec-a765-0fa361adfe9c.png)


Proceed to 127.0.0.1 (unsafe)　をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/4e8918b3-8dff-a689-96f3-f084586571e9.png)

Google Login　をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/0d5a1a59-16bd-e848-be81-9a2d31ad1345.png)

Gmail のアドレスでログイン

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/f8bdf89e-d82f-9c87-fbed-bd151a557d8c.png)

## 確認したバージョン

```text
$ python --version
Python 3.11.3

$ flask --version
Python 3.11.3
Flask 2.2.5
Werkzeug 2.3.2
```
米国起業家が実践済み「収益をあげるまでのビジネスアイデアの練り方」

# 対象読者
・真に消費者のニーズに答えたサービスを作りたい方
・遠回りせず収益を上げたい開発者、ビジネスマン、起業家
・ブレインストーミングでアイデアだしする方法を知りたい方

# はじめに
皆さん、こう思ったことはないでしょうか。
あの人はなぜあんな斬新なことが思いつくのだろうか。
頭の出来が違うからだろうと・・・
やはり限られた才能ある者だけが誰もやったことのないサービスを思いつき、結果を残せるのだと・・・

実はアイデアを形にして成功を納めるには典型的な型があるのです。
アメリカで何百万ものオンラインビジネスを立ち上げているCourtland Allen氏が運営しているコミュニティで学ばれている内容を紹介したいと思います。

https://www.indiehackers.com/


「How to brainstorm great business ideas」
優れたビジネスアイデアをどうやっておもいつきますか？

https://www.indiehackers.com/post/how-to-brainstorm-great-business-ideas-ab51c3d51c

# 本題
まず冒頭で作者はビジネスには優れたアイデアと実行力の両方が大事だと主張しています。
今回はアイデアにフォーカスするので、優れたアイデアを思いつくための要素として4つの柱を上げています。

今回は4つの柱についてのお話になります。

## 基本
多くの人は製品とビジネスはイコールだと思っているが、実は製品はビジネスのただの一部です。ビジネスには4つの要素が最低でも存在しています。
1.あなたが解決しようとしている問題と、それを抱えている人々 (つまり市場)
2.消費者に届けるための販売経路
3.お金を稼ぐために使用する収益化モデル
4.問題の解決方法 (つまり、あなたの製品またはサービス)

上記のすべてに強いのが優れたビジネスアイデアです。
考えるステップとしては1~4の流れになるようです。

## 問題が最初、解決策は最後
前提として問題を第一に見つけるように言っています。
なぜなら、その方が後の要素を決めやすいからです。

もし、解決策を先に思いつき、後から問題を探すのなら、本来のやり方よりも難しい方法でチャレンジしているということになります。

同じ問題を多く抱えている人のエリアを先に見つけ、後から解決策を検討するのが本記事では正しいやり方です。

## 良い問題とは何でしょうか?
初めのステップはよい問題をあなたが見たとき、正しく認識できる必要があります。
ここでいう良い問題とは以下の条件です。
・数十万程度の人が抱えている問題
・あなたも同様に抱えている
・直接はなしを聞ける相手がいる
・「エンジニア」「教師」「医師」などカテゴライズできるもの
・できれば、お金を払ってでも解決したい内容

## 問題を見つける
前章の基準を日常生活から念頭に置いて、常に課題を探し続けてください。

作者のお気に入りの探し方は人々がすでに多くの時間とお金を費やしているところに注目することです。

## 致命的な失敗を避ける
ここまでのステップでたいていの人は<span style="color: red; ">大きな間違い</span>を1つや2つはしているそうです。

1. **解決策を念頭に置いてしまうこと**
   これが一番重要。絶好の機会を逃すことになります。

2. **すでに解決されている問題を除外する**
   すでに解決されている問題には確実なニーズがあるということです。既存の企業が解決できていない可能性もあります。
3. **価値の高い問題を解決することを恐れる**
   安くて価値のないサービスで解決できることなどたかが知れているので人々は使ってくれはしません。
4. **特定の顧客を念頭に置いていない**
   どんな相手のどんなことを解決しようとしているのか明確にしましょう。

## 流通を飛ばさないで
特に開発者、デザイナー、クリエイターに多いが消費者にサービスを提供するために行う戦略について毛嫌いするひとが一定数います。
宝くじにでもあたらない限り自然と売れていくことはありえません。

## 販売経路について考える
SNSや広告など販売するための方法は限定されているので、どの方法が自分に合っているのか考慮します。
個人が行うときのおすすめは直接電話することです。

直接電話することでユーザの生の声を聴くことができます。
もし、具体的な方法がなにも浮かばなかった場合、顧客と販売方法について十分に理解できていない可能性が高いため、一度決めた問題や顧客について考え直す必要があります。

## 退屈な問題、革新的な解決策
 考えた問題について、解決策を考えてみましょう。
問題は既存でだれかがやっていてもいい。解決策は全く違った角度からアプローチしましょう。
自分が特定している消費者像と照らし合わせ、ぴったりの解決策を提示してあげましょう。
ここでさらに必要なことは、すでに確立している販売経路に適した解決方法にしてあげることです。
これは先に販売方法を検討していたことによる利点です。

## 小さく始める
　簡単にできることから始めてください。
　解決しようとしている問題と市場の規模、流通チャネルそして製品について考えるとき、じぶんができる最も簡単な方法を考えてください。
　考えたらそれよりもシンプルな方法で実践してください。

# おわりに
お読みいただきありがとうございました。
今後の参考のため、感想、ご意見いただければ幸いです。

SNSのフォローもぜひよろしくお願いいたします🙇
自分も今回の記事を参考に個人開発を進めていこうと思います。
rex0220 一括更新プラグイン チェックボックス・複数選択

[一括更新プラグイン](https://qiita.com/rex0220/items/f90ca06fde6b6e362583)のチェックボックスと複数選択について、プラグイン設定と動作を解説します。

# 概要
一括更新プラグインで、チェックボックスと複数選択は、チェックボックス形式で表示されます。
選択肢が多い場合、縦スクロールで表示されます。

![2023-08-14_15h55_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/69cce9c9-1acc-afe6-7067-20755793a807.png)

操作例
![2023-08-14_15h57_54.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/2be4fb1f-5dd9-3a3c-b2c3-2e3b6aa60bc8.gif)

# プラグイン設定
ボタン名を「都道府県」として、項目を登録します。
![2023-08-14_16h00_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/30498e28-5842-c443-5a62-b3d4b6d65752.png)

項目別設定
![2023-08-14_16h00_43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/102e5fa4-f41d-4977-db78-0b5c24c5a3a6.png)

## チェックボックス・複数選択の初期設定

チェックボックス・複数選択の初期設定は、選択肢を ARRAY 関数で指定してください。

```.js
// チェックボックス
ARRAY("sample1")

// 都道府県_チェックボックス
ARRAY("北海道","青森県")

// 都道府県_複数選択
ARRAY("北海道")
```
Dockerコンテナ内の処理をバックグラウンドで実行する方法

# はじめに
[別記事](https://qiita.com/YujiMatsu/items/a37349aede186189bccf)に、Linux上でバックグラウンドで実行する方法をまとめた。
今回は、Dockerコンテナ内でバックグラウンドで実行する方法をまとめる。

SSH接続したマシンで実行し、接続を切断しても処理は続くため、ジョブを提出し一度そこから離れ、終わった頃に結果を確認する、といったことも可能。
（ちゃんと書くと、ジョブを投稿後にSSH接続を切り、処理が終わった頃に再接続し結果を確認することも可能）

# 時間がない人向け
## コンテナの立ち上げ方法
通常通り、`docker run`から立ち上げる。ただし、`--rm`のオプションは入れないこと。
## バックグラウンドでの実行方法
```bash
root@container_id:# python3 run.py &
```
## コンテナから出る方法
`ctrl + q + p`で出る

# 方法
## コンテナの立ち上げ方法
通常通り、`docker run`から立ち上げる。ただし、`--rm`のオプションを入れないこと。入れてしまうと、コンテナから出たときにコンテナが削除されてしまう。
以下はコンテナが立ち上がった前提で書く。
## バックグラウンドでの実行方法
[Linux版の記事](https://qiita.com/YujiMatsu/items/a37349aede186189bccf)同様、末尾に`&`をつけるだけで良い。
例えば、pythonで`run.py`というモジュールをバックグラウンドで処理する場合、以下のようなコマンドを入力する。
```bash
root@container_id:# python3 run.py &
```
※ `root@container_id:#`はコンテナ内のコマンドプロンプト。

## 標準出力の保存方法
標準出力を保存する場合、以下のように実行する。そうすると、標準出力が`run.log`のファイルにテキストファイル形式で保存される。
```bash
root@container_id:# python3 run.py > run.log &
```
または、標準エラー出力と区別するために以下のように書いても良い。
```bash
root@container_id:# python3 run.py 1> run.log &
```
ログファイルが上書きされるのを防ぎたい場合は、以下のように書く。
```bash
root@container_id:# python3 run.py >> run.log &
```
または
```bash
root@container_id:# python3 run.py 1>> run.log &
```

## 標準エラー出力の保存方法
標準エラー出力を保存する場合は以下のように実行する。そうすると、標準エラー出力が`run_error.log`のファイルにテキストファイル形式で保存される。
```bash
root@container_id:# python3 run.py 2> run_error.log &
```
上書きを防ぎたい場合は以下のように書く。
```bash
root@container_id:# python3 run.py 2>> run_error.log &
```

## 標準出力と標準エラー出力を別々のファイルに記録する方法
以下のようなコマンドを実行する。そうすると、標準出力が`run.log`ファイルへ、標準エラー出力が`run_error.log`へそれぞれテキストファイル形式で保存される。
```bash
root@container_id:# python3 run.py 1> run.log 2> run_error.log &
```
上書きを防ぐ場合は以下
```bash
root@container_id:# python3 run.py 1>> run.log 2>> run_error.log &
```

## コンテナから出る方法
`ctrl + q + p`を押し、コンテナから出る。`exit`で出てしまうと、コンテナがストップされるため注意。（ただし、コンテナを立ち上げるとき、`docker exec`から立ち上げると、`exit`から出てもストップされない）

# 参考
- https://qiita.com/skyknsk/items/5aff81529c5c848915c8
- https://atmarkit.itmedia.co.jp/ait/articles/1707/21/news001.html
- https://www.guri2o1667.work/entry/2020/11/10/【docker】docker_run_/_docker_exec時のシェルからの抜けるときのコンテ
【WordPress】ショートコードを使ってみる

## 手順
1. functions.php を保存
1. ショートコード化したい処理を functions.php に関数形式で記述
1. add_shortcode関数を使って 2.の関数をショートコードとして登録
1. 記事にショートコードを追加

## 1. functions.php を保存
functions.phpはWordPressのテーマで使われる関数が記述されているPHPファイルです。
編集中の記述ミスによりWordPressの動作が停止する可能性があるため、バックアップを取っておく必要があります。
### 方法
利用しているレンタルサーバのFTP管理画面でダウンロードして保存しておく。
今回はロリポップ！を使っているので以下を方法でダウンロードする。
https://lolipop.jp/manual/user/ftp2-03/

## 2. ショートコード化したい処理を関数で記述
WordPress管理画面でfunctions.phpを編集して、ショートコード化したい処理を実行する関数を作成します。


### 方法
WordPress管理画面の ツール > テーマファイルエディター にてfunctions.phpを編集する。
今回は投稿タイトルを表示する関数を作成する。
``` functions.phpに追記
function get_title() {
    return get_the_title();
}
```

#### get_the_title
投稿タイトルを取得する関数
リファレンス：https://developer.wordpress.org/reference/functions/get_the_title/

## 3. ショートコードの登録
WordPressで用意されている関数 add_shortcode を使ってPHPの関数とショートコードを紐づける。
リファレンス：https://developer.wordpress.org/reference/functions/add_shortcode/

### 方法
functions.php にて add_shortcode関数を実行する。
このとき、引数は ( ショートコード名, 関数名 ) とする。
今回は”title”というショートコードにget_title関数を紐づけている。
``` functions.phpに追記
add_shortcode('title', 'get_title')
```

## 4. 記事にショートコードを追加
投稿または固定ページの編集画面で文中にショートコードを追加する。（記述方法は "[ショートコード名]"）
ショートコードが紐付けた関数の返り値に置き換わる。

**編集画面**
![Screenshot 2023-08-14 at 14.22.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3525309/c5e3c0e1-392a-2a6c-ead4-803f26607156.png "編集画面")

**プレビュー**
![Screenshot 2023-08-14 at 14.26.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3525309/46a231b8-4ae0-f077-0df9-e202fd714b9e.png "プレビュー")


## 次回以降
- ショートコードの裏の動きについて深掘りする
- ショートコードでパラメータを引き渡す
PF作成：１３日目

今日の進捗は良かったと思う。この調子でやっていこう。

## 進捗
- エラーの修正
- 御朱印編集機能
- 御朱印投稿データ一覧をTop、place/show、マイページに表示させた。
- ヘッダーを少し変更

## 学習
### 【レイアウト】
- 要素の位置を変更したい。Bootstrapのd-flexで可能。d-flexを動かしたい要素の親要素に指定。その後にオプションでどうしたいのか指定してあげると可能。<br>(参考資料：https://getbootstrap.jp/docs/4.2/utilities/flex/）
- 縦長に表示させたい。BootstrapのCardsで可能。ただしCardsを使用するとデフォルトで背景が白で枠組みができるので、いらない場合はCardsを使用しないでオプションだけ使用も可能。<br>(参考資料：https://getbootstrap.jp/docs/5.0/components/card/）

### 【機能】
- 変数名を一緒にすれば中身のデータが違くても部分テンプレートが使用できる。
- セレクトボックスの初期値の指定。JavaScriptを使用してセレクトボックスの初期値を設定している。新規投稿フォームならそれでも良かったのだが、編集フォームには保存されたデータを表示させたいのでselected: @goshuin.place.idとオプションでつけてあげると可能。記述する場所についてはRuby公式ドキュメント参照。


## エラー
- 御朱印の投稿を神社かお寺を選択してから投稿できる仕組みを作成したのだが、お寺の投稿はできても神社の投稿ができなかった。必要なplace_idが空の所為でバリデーションに引っかかっていた。原因はラジオボタンで選択した内容によってセレクトボックスの中身を変更するために元とも中身の違うセレクトボックスを２つ作成してJavaScriptで表示非表示を管理していたのだが、そこで同じカラム名を使用していため見た目上では一つでもHTMLコード上で２つ存在しているので上書きされてしまい投稿できないというものだった。なのでカラム名変更してあげればいいのだが、form_withのf〜という記述方法だとカラム名が存在しないとエラーが起こるので記述方法を変更させる必要がある。<br><%= select_tag :place_id2, options_for_select(@otera.map { |place| [place.name, place.id] }, selected: params[:place_id2]), prompt: "選択してください", class: "form-control" %><br>このような記述になる。重要なのはselect_tagとselected: params[:place_id2]。
- 御朱印を投稿する時にアソシエーションで御朱印モデルと寺社モデルを結んだので、御朱印投稿データか寺社データを引き出せる。寺社データは都道府県データを所持しているのでそれを表示させたたい。他にも御朱印投稿データに入ってる寺社データやユーザーデータを表示させたい。
```ruby:controllers.rb
@user = current_user
    @goshuins = @user.goshuins.page(params[:page]).per(10) # ページネーションを適用（１ページ１０件表示）
    @goshuin_names = @goshuins.map { |goshuin| goshuin.place.name }
    @goshuin_users = @goshuins.map { |goshuin| goshuin.user.nickname }
    @goshuin_prefectures = @goshuins.map { |goshuin| goshuin.place.prefecture.name }
```
インスタンス変数 ＝　インスタンス変数.map {　｜変数|　変数.取り出したい変数.カラム名 } と記述する。最後は必ずモデル名で終わらせること
M1 Macでbrew installがエラーになる際の対処方法

## 概要
M1のMacbookでbrewを用いてパッケージのインストールをしようとする際に、以下のようなエラーに遭遇することが多々ある。
```bash
Error: Cannot install in Homebrew on ARM processor in Intel default prefix (/usr/local)!
Please create a new installation in /opt/homebrew using one of the
"Alternative Installs" from:
  https://docs.brew.sh/Installation
You can migrate your previously installed formula list with:
  brew bundle dump
```

## 原因
Intel版で使用されるbrewとM1版で使用されるbrewが異なるため、おそらく上記エラーが出るものと思われる。
具体的には、Intel版だと/usr/local 配下にbrewのディレクトリが生成され、M1版だと/opt/homebrew配下にディレクトリが生成される。
※M1版のパッケージが提供されていないものもあるため、基本的にはIntel版(x86_64)を使用するのが良さそう。

## 対策
- コマンドかブラウザでバイナリファイルをダウンロードする
```コマンド例.sh
curl -O https:XXXXX.tar.gz
```
- 以下コマンドでファイルを解凍
```コマンド例.sh
tar -zxvf XXXXX.tar.gz
```
- 解凍後に生成されたディレクトリ or ファイルをbinディレクトリに移動
```コマンド例.sh
sudo mv XXXXX /usr/local/bin/XXXXX
```
- Finderの「移動」→「フォルダへ移動」にて、ディレクトリを開く
- 実行ファイルを右クリックし、「このアプリケーションで開く」→「ターミナル」を選択
- ポップアップで未確認の開発者というメッセージが出るが、「OK」を選択
- ターミナルで一旦実行が走るので、完了するまで待機
- 実行完了後、ターミナルの画面で該当のパッケージコマンドを実行できればOK
Linuxで処理をバックグラウンドで実行する方法

# はじめに
Linuxで処理をバックグラウンドで実行する方法をまとめる。
コマンドプロンプトが表示されるまで待機する必要がなくなるため、長時間の処理を実行するのに便利。
また、標準出力を保存する方法も記載する。標準出力にログを表示し、進捗を確認するようにしている際に便利。
**ただし、Macユーザなどに人気なzshでは本記事の方法では動かないので注意してください！**


SSH接続したマシンで実行し、接続を切断しても処理は続くため、ジョブを提出し一度そこから離れ、終わった頃に結果を確認する、といったことも可能。
（ちゃんと書くと、ジョブを投稿後にSSH接続を切り、処理が終わった頃に再接続し結果を確認することも可能）

関連して、[Dockerコンテナ内の処理をバックグラウンドで実行する方法](https://qiita.com/YujiMatsu/items/7bbd56789077f85b10f0)もまとめたので参考にしてほしい。


# 時間がない人向け
## バックグラウンドでの実行方法
コマンドの末尾に`&`をつけるだけ。例えば以下。
```bash
$ python3 run.py &
```


# 方法
## バックグラウンドでの実行方法
コマンドの最後に`&`を入れるだけ。
例えば、pythonで`run.py`というモジュールをバックグラウンドで処理する場合、以下のようなコマンドを入力する。
```bash
$ python3 run.py &
```

ここで、`run.py`のモジュールを以下のように想定する。
```python: run.py
print('hello world')
```
これを通常通りフォアグラウンドで実行（通常どおり実行）すると、以下のようになる。
```bash
$ python3 run.py
hello world
```
しかしバックグラウンドで実行すると標準出力がコマンドプロンプトに表示されてしまう。

## 標準出力の保存方法
標準出力を保存する場合、以下のように実行する。
```bash
$ python3 run.py > run.log &
```
または、標準エラー出力と区別するために以下のように書いても良い。
```bash
$ python3 run.py 1> run.log &
```
ログファイルが上書きされるのを防ぎたい場合は、以下のように書く。
```bash
$ python3 run.py >> run.log &
```
または
```bash
$ python3 run.py 1>> run.log &
```

## 標準エラー出力の保存方法
標準エラー出力を保存する場合は以下のように実行する。
```bash
$ python3 run.py 2> run_error.log &
```
上書きを防ぎたい場合は以下のように書く。
```bash
$ python3 run.py 2>> run_error.log &
```

## 標準出力と標準エラー出力を別々のファイルに記録する方法
以下のようなコマンドを実行する。
```bash
$ python3 run.py 1> run.log 2> run_error.log &
```
上書きを防ぐ場合は以下
```bash
$ python3 run.py 1>> run.log 2>> run_error.log &
```

# 参考
https://qiita.com/skyknsk/items/5aff81529c5c848915c8
https://atmarkit.itmedia.co.jp/ait/articles/1707/21/news001.html
bootstrapでモーダルウィンドウを実装する

# 結論
下記のサンプルコードに従ってモーダルウィンドウを実装することができます。

# 使用バージョン
- bootstrap 4.4.1
- jquery 3.4.1.slim

# 注意事項
javascriptに各ライブラリをインポートする必要があります。このとき、インポートする順番は
1. jquery
1. bootstrap

にする必要があります。

# サンプルコード

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="zYMgZwb" data-user="kabuto64425" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/kabuto64425/pen/zYMgZwb">
  Untitled</a> by kabuto64425 (<a href="https://codepen.io/kabuto64425">@kabuto64425</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

以上です。

# 参考

https://getbootstrap.jp/docs/4.2/components/modal/

https://qiita.com/okoppe8/items/4cc0f87ea933749f5a49
@Published #SwiftUIの修飾子に関して簡単にアウトプットしてみる

## はじめに
今回は@Publishedに関してアウトプットしていく。
[@State](https://qiita.com/RammaruIshii/items/1faef73952f273090895)と[@Binding](https://qiita.com/RammaruIshii/items/8d67621c12ccb540d152)についても記事にしているので良かったら見てくれ。

## 詳細
前提として、＠State(値の変更を監視して、値が変更されたらViewの再描画をトリガーする)と似ている。
- オブジェクトの状態を監視し、それに応じてViewが自動的に再描画する（データフローをスムーズに管理）
- 通常、@Publishedは@OvservableObjectを継承したクラスで使用される。
- データモデルやビジネスロジックを表現するクラスでの状態管理に使用される。
## ソースコード
```swift:Swift

// ボタンを押すとインクリメントされて、そのインクリメント状況を表示させる

// Modelの状態管理
// ObservableObjectを継承することによって、監視可能なオブジェクトであると示している
class CounterModel: ObservableObject {
    //この値が変更されたら再描画
    @Published var count: Int = 0
}

struct ContentView: View {
    // ObservedObjectはObservableObjectを継承しているクラスを他のViewで使用する、すなわち、他のViewにインスタンス化（宣言）するためのプロパティラッパーである。
    @ObservedObject var counterModel = CounterModel()

    var body: some View {
        VStack {
            Text("\(counterModel.count)")
            Button("インクリメントボタン") {
                counterModel.count += 1
            }
            ChildView(counterModel: counterModel)
        }
    }
}

struct ChildView: View {
    @ObservedObject var counterModel: CounterModel
    var body: some View {
        Text("現在のcounterModelの値: \(counterModel.count)")
    }
}

```

## おわりに
間違い等ありましたらコメント欄にてご指摘ください！

## 参考記事
- [SwiftUIドキュメント](https://developer.apple.com/documentation/swiftui/)
- [カピ通信](https://capibara1969.com/)
- [iOS-Docs](https://ios-docs.dev/)

## 開発環境
- Xcode-14.3
- Swift version 5.8
Pythonでのツール作成時に困ったこと①

前回初めてPythonでのツールを作成することができました！
いろんなQIITAの記事やサイトを参考させていただいたおかげです。

今回は、Pythonのツール作成時に実際に起きた間違いをまとめてみました。


①ファイルパス
文字列を組み合わせてファイルパスを作ろうとした際に、フォルダ名の部分がファイル名と判断されず、ファイル名が「●●(本来フォルダ名)¥▲▲(本来のファイル名)」となったファイルが出力された。
Windowsのファイルパスは「/」だか、Pythonでは「/」はエスケープとして判断されるそうで
フォルダ名と判断されなかった。
解決方法として、os.path.joinにしたらファイルパスと判断されました。

②DateFrameの型
DateFrameを二つ用意して、結合しようとしたところ、同じフォルダ名をキーにしていたのにエラーとなってしまった。
同じファイル名でも、typeがそれぞれ別でDateFrameに格納されていたために、キーが不一致と判断されてしまっていた。
結合の前にDateFrameの型を同じになるようにastype()で変換した。

③関数の位置
独自の関数を作成したところ、エラーとなってしまう。
独自の関数は、関数の定義を本体の処理の前に書いておかないといけないということが漏れていた。
解決策として、関数の定義を本体の処理の前にしたら、正常に動いた。
SwiftUI Previewのクラッシュ対処のためにPreviewの状態をリセットする

## 背景
SwiftUIのPreviewがクラッシュして使えない。
今回、Realmなどのデータが半端な状態で残っているとクラッシュしているようだった。

Previewの状態をリセットしたい。

## 対処法
- クラッシュログの確認
`~/Library/Logs/DiagnosticReports/`

- Preview状態のリセット
`xcrun simctl --set previews delete all`

## 参考
[Swift UI Preview Crash](https://developer.apple.com/forums/thread/661669)
マルチキャスト通信とは

## マルチキャストの存在意義

### ブロードキャストやユニキャストに比べて帯域を圧迫しない

### ユニキャスト場合、データを欲しがる相手と1対1で通信量が発生する。

### マルチキャストの場合、
### データ受信側のルータまたはスイッチ側でデータを複製してくれる（これがすごい！！）、だからギリギリまで帯域を圧迫しないでいい。送信側は1対多を実現できる。

## 具体的にIGMP Join IGMP leave

詳しくは
https://www.infraexpert.com/study/multicastz11.html

### ルータにはマルチキャストデフォルト拒否なので明示的に許可設定は必要

### スイッチcatalystの場合はデフォルトでIGMP有効

## IGMPスヌーピング
https://www.infraexpert.com/study/multicastz12.html
直前のコミットメッセージを変更する

## Push済みの場合

### 1. 直前のコミットメッセージを修正
```code
git commit --amend -m "コミットメッセージ"
```

### 2. 強制Push

```code
git push -f origin ブランチ名
```


## まだPushしていない場合
### 1. 直前のコミットメッセージをなかったことにする
```
git reset --soft HEAD^
```

### 2. pushしたい場合は通常通り再度commit→pushすればOK
```
git commit -m "コミットメッセージ"
git push origin ブランチ名
```
【自作アプリ　第四期】

そろそろ完成が見えてきました！
今回も画面レイアウトを確認しながら実装機能について説明していきますー！

#### 【画面レイアウト】
・収支確認画面
![第四期　収支確認画面➀.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918178/0b845eac-3146-ade5-9aef-10dae38a248b.png)
![第四期　収支確認画面➁.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918178/94a1e892-4b7b-2d0c-6539-36c8b890093f.png)
・集計画面
![第四期　集計画面➀.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918178/b3edd7ab-cf8c-67d0-b92c-3e32586d2221.png)
・収支確定画面
![第四期　集計確定画面➀.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918178/17e6f4d0-4f97-23b9-2cf6-a4fdeeac75e6.png)
・集計画面　ダイアログ
![第四期　集計画面　ダイアログ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918178/9b646612-6d98-fa88-f908-edcecd979dfe.png)
・エラー画面
![第四期　エラー画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918178/44826fa2-cebc-2983-bc8c-983a33546c53.png)

#### 【機能概要】
・株式投資別（銘柄別）に集計をして現在の投資額を管理する事が出来る

#### 【詳細機能】
※画面レイアウト参照
##### ●集計確認を実施
「収支確認画面」にて「集計」ボタンを押下
↓
「集計画面」に遷移
↓
「集計画面」にてヘッダ部分の「集計確認」ボタンを押下
↓
「集計確定画面」に遷移

・「収支確認画面」にて「確定」ボタンを押下すると一日一回までは集計を確定する事が出来ますがそれ以降はエラー画面に遷移してしまうので確定はせずとも確認したい場合はこちらの「集計確認」ボタンを押下する

##### ●エラー画面に遷移
「集計画面」にてヘッダ部分の「確定」ボタンを押下
↓
確認ダイアログが表示される
↓
「OK」ボタンを押下
↓
「エラー画面」に遷移　（※集計は一日一回までの為）

#### 予定
８月末を目処に「テストシナリオ」を作成して「テスト」を実施していこうと思います。アプリケーションとして完成度の高いものを目指そうと思います！
Laravel + Vuetify + Tailwind cssアプリでVuetifyのデザインがずれてしまう

# 起きたこと
Vuetifyの検索Boxを使用するとデザインがずれてしまう。

![スクリーンショット (75).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3027729/2b1238fa-10b2-c3b8-4137-88f81cf37e1c.png)


# 対策
`resources/css/app.css`の一番上の@tailwind base;を消すとズレは治りました。
```php:resources/css/app.css
// 削除
// @tailwind base;
@tailwind components;
@tailwind utilities;
```

![スクリーンショット (77).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3027729/76e3e89c-1e3e-52b1-cb97-5bb8708161c9.png)

# 少し問題も
これでデザインのずれは治りましたが他の場所で所々cssが消えてしまうところがあるのでそこを手動で直す必要がありました。他にもあるかもしれないので適宜直す必要があるかもしれません。
例：
```css
a {
    text-decoration: none;
}

li {
    list-style: none;
}
```


## まとめ
正直あまりいい方法ではないような気がしますが、調べても出てこなかったのでとりあえずこれで我慢するしかないのかなと思います。
Oncyberで3Dファイルを並べて表示する

## oncyberにログイン(ログイン方法はメールアドレスでもethereumでもなんでも良い)

https://oncyber.io/

##  右上のworld builderを押下

![スクリーンショット 2023-08-14 13.48.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/e00d201d-a2a8-bc15-9b74-5693ec6c3630.png)

## テンプレートから作るを選択

![スクリーンショット 2023-08-14 13.49.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/87cdf1ef-09a3-d8a3-37e4-acfc1c83082a.png)

## Hang Outを選択(目的に合ったものを選ぶ)

![スクリーンショット 2023-08-14 13.49.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/5fd117a2-374c-7e48-7ac4-d0fc6ff0ddc2.png)

## 無料で選べるルームを選択する(課金すれば他にも選べるようになる)

![スクリーンショット 2023-08-14 13.49.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/ec7a479e-3d77-b16e-adc9-c07570bf6a15.png)


## 部屋完成

![スクリーンショット 2023-08-14 13.50.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/00866f03-b182-45f2-c97d-3576eed9abe0.png)

## アップロードからglbファイルを選択

![スクリーンショット 2023-08-14 13.50.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/fd644a1e-6b77-f898-44dc-5fab78e33782.png)

## 設定画面で部屋の名前を決めて、その下にあるリンクを教えてあげると誰でもアクセス可能。

![スクリーンショット 2023-08-14 13.54.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/9319534a-1d64-b2a7-2a1a-47b1dfc4adfb.png)
【備忘録】GithubのSSH生成・設定と接続方法

# GithubのSSHについて
<dl>
  <dt>SSHとは</dt>
    <dd>・ローカルとサーバーの通信を暗号化したもの</dd>
    <dd>・ローカル内で公開鍵と秘密鍵を生成し、サーバーに公開鍵を渡すことによって<strong>この公開鍵はこのユーザーだ</strong>と認識する</dd>
    <dd>・RSA,DSA,ECDSA,EdDSA(ed25519)の４種類の公開鍵が存在する</dd>
    <dd>・パフォーマンスとセキュリティ重視なら<strong>ed25519</strong>を推奨されてる</dd>
</dl>

##### 確認コマンド
まず現在の接続状況を確認する
```
$ ssh -T git@github.com
```

NGな場合
```
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```
OKな場合
```
Hi [account_name] You've successfully authenticated, but GitHub does not provide shell access.
```
デバックログ確認 ※見るのはidentity fileのみ
```
$ ssh -vT git@github.com
```
鍵ファイルの確認(そこにあるか)
```
$ ls ~/.ssh
```
## SSHkey生成
##### .sshディレクトリに移動
```
$ cd ~/.ssh
```
##### sshkeyコマンドで鍵を生成(アドレス部分は自分のアドレスに変更)
```
$ ssh-keygen -t ed25519 -C "your_email@example.com"
```

##### keyの保存場所
上記生成コマンドを実行するとkey保存場所について聞かれる
```
Enter file in which to save the key (/home/user/.ssh/id_ed25519): 
```
##### パスフレーズについて
特に設定しない場合はEnter
```
Enter passphrase (empty for no passphrase):　
```
##### パスフレーズの再設定
パスフレーズを設定していない場合はEnter
```
Enter same passphrase again: 
```
##### 鍵が生成されるのでコピーする
Macの場合
```
$ pbcopy < ~/.ssh/id_ed25519.pub 
```
Windowsの場合
```
$ clip < ~/.ssh/id_ed25519.pub
```

## Githubに公開鍵を登録
![スクリーンショット 2023-08-14 13.31.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513569/b9f18a89-6bd5-f08f-255e-5660d48889ad.png)
![スクリーンショット 2023-08-14 13.32.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513569/df328ae7-fdad-6170-c99b-2e59d7d00625.png)

あとはNewSSHkeyをクリックして先ほどコピペした鍵を貼るだけ。

##### Githubと接続の確認
```
$ ssh -T git@github.com
```
以前SSHkeyをed25519で作成したことがあり、
![スクリーンショット 2023-08-14 13.34.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513569/58fc19d9-458e-68d4-d9c2-5a264151bd77.png)
情報が残っているとこの警告が出てきます。
※githubが2023/3/23にサーバー情報（SSHホストキー）を更新したことにより、/ssh/known.hostsと情報誤差があるよと教えてくれている

ここはyesと答え、無事sucessflyとなりました。
OCI FunctionsのProvisioned Concurrencyを確認する

# はじめに
OCI Fuctionsの実行環境はコンテナです。
Functionsをキックすると、コンテナイメージがPullされてコンテナが起動し、コードが実行されますが、初回起動時にはこの実行環境の起動に時間がかかります。（コールドスタート）

これを回避するための機能としてProvisioned Concurrencyがあります。

https://docs.oracle.com/ja-jp/iaas/Content/Functions/Tasks/functionsusingprovisionedconcurrency.htm

Provisioned Concurrencyを活用することで、事前にコンテナを起動しておいて、初回起動時の遅延を少なくすることができます。（ホットスタート）

# Provisioned Concurrencyなしの状態
今回はGoのサンプルアプリを使用して実行時間を比べます。
[こちら](https://qiita.com/dingtianhongjie/items/8ba223df0a6e189c14ab#function%E3%81%AE%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4)と同じ手順でサンプルアプリをデプロイし、Functionsを実行します。

```
$ time fn invoke app01 hello-func01
{"message":"Hello World"}

real    0m24.168s
user    0m0.081s
sys     0m0.012s
```

実行時間は約24秒でした。
なお、2回目以降はコンテナが保持されているので、約3秒となります。コンテナは一定時間が経過すると削除されます。

```
$ time fn invoke app01 hello-func01
{"message":"Hello World"}

real    0m3.664s
user    0m0.073s
sys     0m0.015s
```

# Provisioned Concurrencyありの状態

OCIコンソールから新しいアプリケーションを作成し、関数を作成します。
その際、使用するコンテナイメージは同じイメージを指定します。

![スクリーンショット 2023-08-14 12.57.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/2a907b53-08bf-73c3-6aa8-1524daf35725.png)

Functionsを実行します。

```
$ time fn invoke app02 hello-func02-pc
{"message":"Hello World"}

real    0m3.591s
user    0m0.076s
sys     0m0.010s
```

約3秒となり、Provisioned Concurrencyを活用したホットスタートの効果がわかります。

# 補足
実は、最初に実行したProvisioned Concurrency「なし」と同じコンテナが使われてるから早いのではないかと思ったので、念のためさらに別のアプリケーションを作成して、Provisioned Concurrency「なし」の状態でFunctionsを実行したところ、20秒以上かかりました。
これでProvisioned Concurrencyの効果が確認できたと思います。

```
$ time fn invoke app03 hello-func03
{"message":"Hello World"}

real    0m21.789s
user    0m0.077s
sys     0m0.009s
```
Power Automate for desktop で最新のダウンロードファイルを取得する

こんにちは。日本マイクロソフトの向井です。

こちらの記事では、マイクロソフトのRPA、**Power Automate for desktop を使って最新のダウンロードファイルを取得する方法** をご紹介します。


# 0.フローの全体像
今回はダウンロードしたファイルがExcelだったとして、その後にExcelの処理をすることを見越して、Excelの起動を入れていますが、ファイルの取得だけなら1ステップでできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/29b9203b-6ada-f25a-06e7-7d76d5851a80.png)

# 1.フォルダー内のファイルの一覧を取得する
画面左のアクション一覧から フォルダー＞フォルダー内のファイルを取得 を使用します。
この**アクションでは指定したフォルダ内のファイルの一覧を所得する**ことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/9b968ae2-473b-992d-c926-bfebc36ce456.png)

## 「全般」で設定すること
全般＞フォルダーからフォルダーを指定します。
今回はダウンロードフォルダーを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/1a7edc80-f9d0-c4fd-7f90-10effe4b08f0.png)

## 「詳細」で設定すること
以下のように設定すると、指定したフォルダー内のファイル一覧を最終変更日時が新しい順に一覧で取得できます。
詳細＞
・並べ替え基準：最終変更日時
・降順：チェック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/ba6df8b4-8d1c-f7e9-92b2-9ae079dbfdbb.png)

## 取得されるファイルの一覧
「生成された変数」から既定だとFiles という変数に取得したファイルの一覧が格納されることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/eb0dff62-cce2-2726-1a09-7ece424bd997.png)

# 2. 取得したファイルの一覧から最新のファイルを選択する
先ほどのアクションを実行し、画面左のフロー変数のFilesを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/7afe4915-09d7-a397-df1b-a285c3a86838.png)

Filesはファイルのリストになっていて、一番上から0,1,2,…と番号が振られています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/2af185b5-ef54-fe8e-1912-a660faef99dc.png)

今回は最新のファイルを取得したいので、このリストの0番のファイルを取得する必要があります。

リスト内のアイテムを指定するときは、
*Files[0]*
のように書きます。

## 最新のExcelファイルを開く
最新のファイルがExcelだったと仮定して、「Excelの起動」アクションで、取得した最新のファイルを開くには、以下のように設定します。

ドキュメントパスに
*%Files[0]%*
と入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1004488/184cb817-9389-f84a-da58-f87fcfa475df.png)
※変数は%%で囲うのがPADのお作法です。


# まとめ
フローの中でファイルをダウンロードし、そのダウンロードファイルを次のアクションで使うというようなシナリオが実現できそうです。
SQL fiddle をもっと簡単に使うには

# はじめに
SQLを学習、もしくは実務で自身の作成したクエリが想定通り動くかどうかを
テストデータを使って検証する際、SQL fiddleが便利と以前以下の記事で記載しました。
https://qiita.com/shoxxx/items/d5a9557de07a9659c3a6

ただ、さらに使いやすい方法があったので紹介します。

# SQLでのデータ検証の大変なところ
 SQLを学習や検証で使う上で当然ですがデータを登録する必要があります。その際、create文を使いテーブルを作りinsert文でデータを登録するという流れが毎回発生しめんどくさいと感じる方も多いのではないでしょうか。
SQL fiddleも同様に以下の画像の赤い部分にcreate~insertでデータを登録するという作業が発生します。
![x1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1522066/1913dd54-9372-169a-603b-c483c58b4ebe.png)
しかし、SQL fiddleでは別機能で簡単にデータを作成する機能があります。

# SQL fiddleで簡単にデータを読み込むには
①まず以下の「Text to DDL」を選択
![x2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1522066/fdadf1b0-ce28-c34c-f842-674be22cce94.png)
②読み込みたいデータをコピーします(今回は仮に以下のデータを読み込みます)。
![x3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1522066/279ebde0-7bfd-51f8-e471-0834515ac1fc.png)
③一番上の四角にテーブル名を記入します。
　 次の四角に②でコピーしたデータを貼り付けます。
 「Append to DDL」を選択します。
![x4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1522066/2efbbb0f-9f12-6707-b192-0830f3ad8811.png)
上記を実行するとSQL fiddleがデータを自動でcreate文とinsert文に変換してくれます。
※test Perseを実行すると実行予定のcreate文とinsert文が確認できます。

④以上を実行すると以下の四角の箇所のようにcreate文とinsert文が作成されているので以前記載した以下のURLの通りに実行することでSQLをさらに簡単に実行することができます。
![x1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1522066/1913dd54-9372-169a-603b-c483c58b4ebe.png)
https://qiita.com/shoxxx/items/d5a9557de07a9659c3a6

# おわりに
上記を実行することで面倒だったcreate文とinsert文を考えずにSQLを実行することができるようになりました。
また、複数のテーブルを読み込みたい場合は、上記の作業を繰り返すことで複数テーブルを登録することができるようになります。

本記事で皆さんのSQLの検証が少しでも快適になれば幸いです。
ユークリッドの互除法で最大公約数を求める

※ユークリッドの互除法
* １，(関数ONE)
    まず、二つの変数a、bのうち、片方が0の場合、３(関数THREE)に送る。どちらも0でない場合、２の(関数TWO)に送る。
* ２、(関数TWO)
    変数aとbの大きい方の数字を小さい方の数字で割り、その余りを求め。その数値を大きかった変数に書き替える。もしその数値が0の場合、二つの変数を３の(関数THREE)に送る。
そうでない場合、もう一度、関数TWOに送り返す。
* ３、(関数THREE)
    変数aとbのうち、0でない方が元の二つの数字の最大公約数になっている。


~~~
<?php
    $x=0;
    $y=0;
    [$a,$b]=preg_split('/ /', trim(fgets(STDIN)));

//関数one    
function one($a,$b){　
    if($a==0 || $b==0){
        return three($a,$b);
    }elseif($a!=0 && $b!=0){
        return two($a,$b);
    }    
}

//関数two
function two($a,$b){
    if($a>$b){
        $x=$a%$b;
        $a=$x;
        if($a==0){
            return three($a,$b);
        }else{
            return two($a,$b);
        }
    }elseif($a<$b){
        $y=$b%$a;
        $b=$y;
        if($b==0){
            return three($a,$b);
        }else{
            return two($a,$b);
        }
    }
}

//関数three    
function three($a,$b){
    if($a==0){
        return $b;
    }elseif($b==0){
        return $a;
    }    
}
echo one($a,$b);
?>
~~~

:::note
数値の入力はコンソールから取得するため、 trim(fgets(STDIN))にしてあります。
リーダーシップ理論とコーチングから状況にあった動機付けをしたい

# 内容
昔サービス業を運営する会社の情シスをやっていた時期がありますが、その時コーチングの研修を受けました。パートやアルバイトの方達にヤル気を出して働いてもらう必要があるため、若いうちからマネジメントやリーダーシップを発揮する能力が必要とされている傾向にあります。そのためコーチングなどのスキルが重視されているものだと思います。今回はヤル気を引き出すリーダーシップとコーチングについての記事になります。

# マネジメントとリーダーシップ
経営学では2つの機能は区別されています。イメージとしてマネジメントは「計画を作成してそれが上手くいくように管理してく」、リーダーシップは「ビジョンを明確にして、それを達成するために動機付けをおこなっていく」といった感じです。言葉の定義は分かれていますが、プロジェクトマネジメントだったり、組織運営上の管理者は両方の機能が求められます。

# リーダーシップ理論
その中で今回はヤル気を出してもらう＝動機付けを行うリーダーシップの話です。どのようなリーダーシップが効果的かは諸所研究がありますが、「効果的なリーダーシップのあり方は状況によって変わる」という考え方があります。その中の理論の一つとしてSL理論というものがあります。

# SL理論
これはメンバーの成熟度によって有効なリーダーシップの形が異なるという考え方です。縦軸に「リーダーがどれだけ指示するか=（指示的行動）」、横軸に「リーダーがどれだけ一緒に働くか=（協力的行動）」をとります。指示的行動、協力的行動の高低でリーダシップのスタイルを変えます。メンバーの成熟度が低い内は指示的、高くなるにつれて説得的→参加的→委任的の順になります。

![Leader1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/fd363e18-cef0-be7f-b6b1-1d8666558d39.png)


* 指示的
メンバーの成熟度が低い状況下で細かい内容まで指示を行う。

* 説得的
メンバーとのコミュニケーションを重視しつつ正しい方向に導く。

* 参加的
メンバーの意見を丁寧に聞き適切なアドバイスを与えて結論を出す。

* 委任的
細かな指示は行わずにメンバーの自主性を尊重する。

# ティーチングとコーチング
教育の際にやり方を教える=ティーチングと答えを引き出す=コーチングという概念があります。ティーチングは指示的ですが、コーチングの場合は「相手の意見を傾聴して答えを考えてもらう」、そのために「適切なアドバイスを行う」ということをします。上記SL理論では指示的リーダーシップの際はティーチング、参加型リーダーシップの際はコーチングが有効となります。（説得型は中間です。）

# コーチングにおけるタイプ分け
やり方を教えるティーチングと違って、コーチングは相手の考えかたを形成していくため時間がかかります。そしてこの過程でコミュニケーションが最も重要になりますが、人によって有効なコミュニケーションの取り方も異なります。そんな中でコーチングを行う際にタイプ分けという考え方があります。人によって求められているコミュニケーションが異なるのでその人にあった対応を行ってみましょうということになります。タイプ分けの定義と各タイプの特徴については下記のサイトを引用させて頂きました。

![Leader2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/3775c5cb-7f04-7c0c-fc36-0cecd65273d9.png)

https://coach.co.jp/whatscoaching/20170821.html

* タイプ分けの定義

>「タイプ分け™」は、「人をもっとも特徴づけるのは、他者とのコミュニケーションである」という前提に立ち、臨床心理学、組織行動学などをベースにつくられたコミュニケーションの分類方法です。「感情表出」と「自己主張」という2つの軸で、コミュニケーションのタイプを次の4つに分けて考えます。


* 各タイプの特徴

|タイプ|特徴|
|:---|:---|
|コントローラー|行動的で自分が思ったとおりに物事を進めることを好む|
|プロモーター|アイディアを大切にし、人と活気あることをするのを好む|
|サポーター|他人を援助することを好み、協力関係を好む|
|アナライザー|行動に際して多くの情報を集め、分析、計画を好む|

何個か質問に答えていくと、自分がどのタイプか分かるのですが、私はこの診断をやった時、プロモーターでした。そしてプロモータータイプの人とのコミュニケーションのポイントを上記サイトから引用すると下記になります。

>コミュニケーションのポイント
>彼らと接するときは、次のポイントを意識してみましょう。
>* 話を聞くときは相づちをうつなどして明確に反応する
>* 質問は間口の広い質問をして自由に話をさせる
>* たくさんほめる（特に彼らの影響力をほめると効果的）
>* 彼らのオリジナルなアイデアに耳を傾ける

確かに当たっているといえばあたっているかもしれません。何かほめられれば嬉しいですからね。タイプ分けの注意点は決めつけを行わないことは、どのタイプが良いかなのどの優劣はないということです。目的はコミュニケーションを円滑に行うために参考にするということです。

# まとめ
メンバーの状況やタイプによって効果的なリーダーシップの取り方は異なります。その人が持っている能力を活かせるかどうかは組織やリーダーシップの対応力によって大きく変わってしまうため、適切な対応が取れるようになりたいです。
Javaで「ファイルやディレクトリを移動する(Files.move)」の動作を確認してみた

# 概要
Javaで「ファイルやディレクトリを移動する(Files.move)」の動作を確認してみました。以下のページを参考にしました。

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

# 実装
以下のファイルを作成しました。
```JSample12_1.java
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.Files;
import java.io.IOException;

class JSample12_1{
  public static void main(String[] args){
    Path p1 = Paths.get("/code/java/file/doc/memo.txt");
    Path p2 = Paths.get("/code/java/file/doc/memo.back");
    Path p3 = Paths.get("/code/java/file/doc/src");
    Path p4 = Paths.get("/code/java/file/doc/dest");

    try{
      Files.move(p1, p2);
      Files.move(p3, p4);
    }catch(IOException e){
      System.out.println(e);
    }
  }
}
```
以下のコマンドを実行しました。
```
$ javac JSample12_1.java
$ java JSample12_1
```
以下のファイルを作成しました。
```JSample11_1.java
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.Files;
import java.io.IOException;
import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;

class JSample11_1{
  public static void main(String[] args){
    Path p1 = Paths.get("/code/java/file/doc/memo.txt");
    Path p2 = Paths.get("/code/java/file/doc/memo.back");

    try{
      Files.move(p1, p2, REPLACE_EXISTING);
    }catch(IOException e){
      System.out.println(e);
    }
  }
}
```
以下のコマンドを実行しました。
```
$ javac JSample11_1.java 
$ java JSample11_1
```

# まとめ
何かの役に立てばと。
Citrix Remote PowershellでAzureVMをCitrix DaaSのマシンカタログ・デリバリーグループに登録する方法

# はじめに
Citrix DaaSのCitrix Remote Powershell SDKのコマンドドキュメントが雑すぎて全然よくわからず腹が立っています。
ほとんど需要はないと思いますが、Citrix DaaSのマシンカタログ、デリバリーグループに、AzureVMをRemote PowerShellで登録する方法を共有します。

Citrix DaaSでパブリッククラウドをVDI基盤としている場合、だいたいAzureを利用している認識ですので（知らんけど）、参考になれば幸いです。
ほぼ、Citrix DaaSを触っている人向けに書いていますので、細かい説明はありません。

# 前提
- 公開デスクトップの利用である。（公開アプリケーションではない）
- Citrix VDIマシンはAzureVMを使用している。
- AzureVMで既にCitrix VDIをセットアップしている状況。（MCS、PVSではなく、**他のサービスまたはテクノロジーのマシン**でAzureVMにVDAはインストール、設定済みである。）
- Citrix Remote PowerShellをインストール済みである。

# 手順
Remote PowerShellを使用した手順を記載します。

## 認証
### Remote PowershellでCitrix Cloudにログインする
Remote PowerShellを使って、Citrix Cloudにログインします。
```powershell
asnp citrix.*
Get-XdAuthentication
```
## 登録のための情報取得

### 登録するマシンカタログのCatalogUidを確認する。
Get-BrokerCatalogコマンドを実行します。

Get-BrokerCatalog -Name マシンカタログ名

例）
```powershell
Get-BrokerCatalog -Name MachineCatalogName
```

出力された Uid を後で使用します。（①）

### マシンのホストのUidを確認する。
Get-BrokerHypervisorConnectionコマンドを実行します。

Get-BrokerHypervisorConnection -name Citrix DaaSに登録されているマシンが存在するホスト名

例）
```powershell
Get-BrokerHypervisorConnection -name HostName
```

結果の Uid を後で使用します。（②）

## マシンカタログ・デリバリーグループへの登録

### マシンをマシンカタログに登録する
New-brokermachineコマンドを使用し登録します。
**AzureVMの場合、HostedMachineIdの設定が必要です。**
HostedMachineIdは、登録するAzureVMが存在する**Azureのリソースグループ名/AzureVM名**となります。

New-brokermachine -CatalogUid マシンカタログUid(①) -MachineName ドメイン\ADコンピュータ名 -HypervisorConnectionUid ホストUid(②) -HostedMachineId Azureリソースグループ名/AzureVM名

例）CatalogUidが88、HypervisorConnectionUidが23の場合
```powershell
New-brokermachine -CatalogUid 88 -MachineName Domain\MachineName -HypervisorConnectionUid 23 -HostedMachineId resource_group/AzureVM_Name
```

### マシンをデリバリーグループに登録する
Add-BrokerMachineコマンドを使用し登録します。
Add-BrokerMachine -MachineName ドメイン\ADコンピュータ名 -DesktopGroup デリバリーグループ名

例）
```powershell
Add-BrokerMachine -MachineName Domain\MachineName -DesktopGroup DeliveryGroupName
```

## 登録確認

### マシンが正しく登録されたか確認する
Get-BrokerMachineコマンドを使ってマシンが正しく登録されたか確認します。

Get-BrokerMachine -Machinename ドメイン\ADコンピュータ名

例）
```powershell
Get-BrokerMachine -Machinename Domain\MachineName
```

取得した情報の以下の項目を確認します。
- CatalogName
  --> 正しいマシンカタログ名が登録されているか
- DesktopGroupName
  --> 正しいデリバリーグループ名が登録されているか
- HostedMachineId
  --> 正しいAzureのリソースグループ名/AzureVM名が登録されているか
- PowerState 
  --> Onになっているか **※重要**
- RegistrationState 
  -->Registeredになっているか **※重要**

# 終わりに
運用などRemote PowerShellで手順化した方が効率的ですので使うべきですが、公式ドキュメントが雑すぎるのは如何なものかと思いますYo!
【ChatGPT】デスクトップアプリ「itos」を公開しました

![header.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219708/7cb81131-41e9-a87d-8b3a-9f43baf45529.png)

# 概要

ChatGPT と会話をするためのデスクトップアプリ **itos** を公開しました。
読みは イートス です。Thread(糸)を並べられるので **糸s** です。
Windows、MacOS、Linux に対応しています。

リリースページは [こちらです](https://github.com/Mikoshiba-Kyu/Tauri-itos/releases)。
お使いのOSに対応したインストーラーをDLしてご利用ください。

使用するためには ChatGPT API KEY が必要です。
利用できるモデルは `gpt-4` と `gpt-3.5-turbo` です。 

![overview_fixes.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219708/2c65ffd1-7acc-666d-cca7-17566f9cde6e.png)
 
# 特徴

- 複数の会話を並べて表示することが可能です。
個々の会話は並べかえや 表示/非表示 を切り替えることができます。
関連性のある複数の議論を ChatGPT とやり取りする、などの用途で扱いやすいです。

- 会話全体でのプロンプト (ChatGPT API における `role: "system"` ) を指定可能です。

- 自身のアバターアイコンと、会話ごとの ChatGPT のアバターアイコンを設定可能です。
前述したプロンプト指定と合わせて、特定のキャラクターとの疑似会話をする、などの遊びができます。

- アプリの表示言語は英日対応で、2種類のテーマ設定にも対応しています。

# 開発

アプリケーションフレームワークは Tauri を使用しました。
現時点ではすべての実装を TypeScript のみで行い、Rust が必要になる場面はありませんでした。
フロントエンドは React と MUI を使用しています。
好きなものだけを使ってのびのびと開発しました。

# あとがき

*If my product could be a great experience for you, Please buy me a hot cup of coffee. Thank you.*

https://www.buymeacoffee.com/mikoshibakyu

# 関連リンク

https://github.com/Mikoshiba-Kyu/Tauri-itos

https://tauri.app/

https://openai.com/
Prod環境のCloud FunctionsでFunctions codebase could not be analyzed successfully. It may have a syntax or runtime error

Dev環境でうまく行っていたindex.jsの内容をProd環境のindex.jsにコピーし、

`firebase deploy --only functions`
を実行したところ
`Functions codebase could not be analyzed successfully. It may have a syntax or runtime error`
とエラー

解決策

prod環境でもdev環境のpackage.jsonの内容を反映させる。
Go言語向けNCMB SDKの使い方（ファイルストアの使い方）

NCMBはモバイル向けのBaaS（mobile Backend as a Service）ですが、サーバー側のデータとNCMB上のデータを連係させたいというニーズは良くあります。

そんなときには各言語向けのSDKがあると便利です。サーバー向けにはRuby、Python、PHP、Java、C#のSDKがあります（すべて公式サポート対象外の、コミュニティSDKという位置づけです）。

今回はGo言語向けのSDK開発をはじめたので、その使い方を紹介します。この記事ではファイルストアの使い方を解説します。

## ソースコード

ソースコードはGitHubにて公開しています。ライセンスはMIT Licenseになります。

[NCMBMania/ncmb\_go](https://github.com/NCMBMania/ncmb_go)

## インストール

SDKのインストールは下記コマンドで行います。

```bash
go get -u github.com/NCMBMania/ncmb_go
```

## インポート

続けてSDKをインポートします。

```go
import (
    "github.com/NCMBMania/ncmb_go"
)
```

## 初期化

NCMBより取得したアプリケーションキー、クライアントキーを使って初期化します。

```go
ncmb := NCMB.Initialize("YOUR_APPLICATION_KEY", "YOUR_CLIENT_KEY")
```

## ファイルストアの使い方

ファイルアップロードはFileメソッドから開始します。引数はファイル名です。

```go
file := ncmb.File("test.txt")
```

ファイルの内容はバイト文字列を付与します。

```go
text := []byte("Hello, NCMB!")
file.Bytes = text
```

コンテンツを適用したら、 `Upload` メソッドでアップロードを行います。ファイルのmime typeはバイト文字列から自動的に決定します。

```go
bol, err := file.Upload()
if err != nil {
	t.Errorf("file.Upload() = %T, %s", bol, err)
}
```

## ファイルの内容を更新する

ファイルの内容を更新する場合は `Upload` を利用します。

```go
text := []byte("更新内容")
file.Bytes = text
bol, err := file.Upload()
if err != nil {
	t.Errorf("file.Upload() = %T, %s", bol, err)
}
```

## ファイルのACLを更新する

ファイルの内容ではなく、ACL（アクセス権限）を更新する場合には `Update` メソッドを使います。

```go
acl, err := file.GetAcl()
if err != nil {
	t.Errorf("file.GetAcl() = %T, %s", acl, err)
}
acl.SetRoleReadAccess("Admin", true)
file.SetAcl(acl)
bol, err = file.Update()
if err != nil {
	t.Errorf("file.Update() = %T, %s", bol, err)
}
```

新規作成する際には、元々Aclを適用してください。

```go
file := ncmb.File("test.txt")
text := []byte("Hello, NCMB!")
file.Bytes = text
acl := ncmb.Acl()
acl.SetRoleReadAccess("Admin", true)
file.SetAcl(acl)
bol, err := file.Upload()
if err != nil {
	t.Errorf("file.Upload() = %T, %s", bol, err)
}
```

## ファイルのダウンロード

ファイルをダウンロードする際には `Download` メソッドを使います。ダウンロードされる内容はバイト文字列なので、必要に応じて変換してください。

```go
data, err := file.Download()
if err != nil {
	t.Errorf("file.Download() = %s", err)
}
```

## ファイルの削除

ファイルの削除は `Delete` メソッドを使います。

```go
bol, err := file.Delete()
```

## まとめ

まだ基本的な機能しかありませんが、徐々にバージョンアップしていきます。

Go言語を使ってWebアプリケーションを開発している方は、そのデータ保存先としてNCMBを利用してみてください。

[mBaaSでサーバー開発不要！ \| ニフクラ mobile backend](https://mbaas.nifcloud.com/)
Rubyの累乗計算

累乗の計算を***Ruby***で実装しました。

```Ruby
    # 累乗の計算
    #  Create  2023/8/14

    A = 80
    B = 22
    C = 10
    ANS = ((A+B)*C) ** 3
    puts ANS

```

```Ruby
   ANS = ((A+B)*C) ** 3  
```
の例は3乗の計算を表します。
スッキリわかるJava入門 第３版を読んでみて- part10 -継承

# はじめに
こんにちは(・ω・）ﾉ
今回は継承について学びました！

## 第１０章　継承
### 1.継承の基礎
似通ったクラスの開発⇨コピペで作る
問題点
・追加、修正に時間がかかる
・把握や管理が難しくなる

コードの重複を懸念することなく類似したクラスを作れる機能
⇨ __継承__

:pencil2: 継承を用いたクラスの定義
```
class クラス名 extends 元となるクラス名{
    親クラスとの「差分」メンバ
}
```
元のクラスの「差分」だけを記述して新たなクラスを宣言する

#### 継承関係
![スクリーンショット 2023-08-14 10.33.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3336192/cd257a65-89cb-eda7-9138-dd90cf1a228c.png)
上記の画像を参考にすると
元となる"Hero"クラス...親クラス、スーパークラス、基底クラス
新たに定義されるクラス...子クラス、サブクラス、派生クラス
などと呼ばれます

子クラスが複数の親クラスを持つこと...多重継承
:warning:Javaでは許可されていない

#### オーバーライド
親クラスのメンバを子クラスで上書きすること

:sparkles: 継承を用いて子クラスに宣言されたメンバの扱い
1.親クラスに同じメンバがなければ、そのメンバは「追加」になる
2.親クラスに同じメンバがあれば、そのメンバは「上書き変更」される

:sparkles:オーバーライドができない条件
・クラス宣言にfinalを付けると、継承禁止となる
・メソッド宣言にfinalをつけると、オーバーライド禁止となる

### 2.インスタンスの姿
継承されたインスタンスのイメージ
![スクリーンショット 2023-08-14 10.53.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3336192/3555813d-683e-281b-9abb-560e798d46e5.png)
↑二重構造になっている

メソッドの呼び出し
　極力、外側の子インスタンスのメソッドで対応している

親、子とメソッドがある場合
⇨子メソッドが呼び出される
　⇨親メソッドに呼び出しが届いていない...上書きされたように見える

__super__ ...「今より１つ内側のインスタンス部分」を表す予約語

:pencil2: 親インスタンス部分のフィールドを利用する
`super.フィールド名`

:pencil2: 親インスタンス部分のメソッドを呼び出す
`super.メソッド名（引数）`

### 3.継承とコンストラクタ
__すべてのコンストラクタはその先頭で必ず、
内部インスタンス部分(親クラス)のコンストラクタを呼び出さなければいけない__

:pencil2: 親クラスのコンストラクタ
`super（引数）;`
※１行目に書かれていない時
⇨コンパイラによって「super();」という行が自動的に挿入される

### 4.正しい継承、間違った継承
正しい継承とは...?
「is-aの原則」に則っている継承

:sparkles: is-aの関係
子クラスis-a親クラス
⇨子クラスは親クラスの１種である

間違った継承の例
概念としてis-aの間んけいがないにも関わらず継承に使ってしまう

:sparkles: 継承のルール
is-aの原則が成立しないなら継承を使ってはいけない

なぜ...?
・将来、クラスを拡張していった場合に現実世界との矛盾が生じるから
・オブジェクト指向の３大機能の１つ「多様性」を利用できなくなるか

汎化・特化の関係
![スクリーンショット 2023-08-14 12.21.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3336192/6256fac4-d9d4-4ca3-3c79-86b4f54f4d92.png)
子クラスになるほど「特殊で具体的なもの」に具体化...__特化__
親クラスになるほど「抽象的で曖昧なもの」に一般化...__汎化__

## まとめ
継承という元のクラスから以下よったクラスを作るときに活用できる
子クラスにはオーバーライドでメソッドを追加、上書きをすることができる
継承にはis-aの原則があり、それに則った継承をすることができるということを学びました。

今回もありがとうございました！
ではまた〜　＊˙︶˙＊)ﾉ"
【SQL】カラム追加・編集ALTER TABLEを使う

# カラム追加
```SQL
ALTER TABLE TB名 ADD カラム名 varchar(50) DEFAULT NULL COMMENT 'コメント' AFTER カラム名 ;
ALTER TABLE TB名 ADD カラム名 text        DEFAULT NULL COMMENT 'コメント' AFTER カラム名 ;
ALTER TABLE TB名 ADD カラム名 int(10)     DEFAULT 0    COMMENT 'コメント' AFTER カラム名 ;
ALTER TABLE TB名 ADD カラム名 tinyint(2)  DEFAULT 0    COMMENT 'コメント' AFTER カラム名 ;
```

# カラム型編集
```PHP
ALTER TABLE テーブル名 MODIFY 編集するカラム varchar(1000) COMMENT '新しいコメント';

```

# カラム名編集
```PHP
ALTER TABLE テーブル名 CHANGE old_column new_column VARCHAR(255) COMMENT '新しいコメント';

```


# SQLのテンプレ
```PHP
ALTER TABLE テーブル名 MODIFY 編集するカラム varchar(1000);

```

# コード
```SQL
    $sql="
    SELECT 
         A.id,A.name
        ,A.img_banner_flg
    WHERE X.id = ? 
    ";
    $res = $wpdb->db->query($sql,[$id])->row_array();   

```





# コード
```PHP
<?php

$a = 11;
$a === 11 && $b=1 ;

echo $b ?? '';

```

# 結果
```javascript
process.stdin.resume();
process.stdin.setEncoding('utf8');
// Your code here!

var lists = [33,22,4,4,4,4,5,44];



lists.sort(function(v2, v1) {
    return v2 - v1;

})

console.log(lists);

```
＃騙されたと思って買った自作キーボードキットが、いつの間にか「すこぉ///」になった話

# 【プロローグ】
初めまして！大学を卒業して、春からエンジニアなりたてのNecozeっていいます！今回は私がここ数ヶ月で1番愛用しているガジェットについて紹介します！
休日は趣味のプログラミングや開発をしており、iPadでGPT先生にヒントをもらいながら、そのままメモをして、MacBookではプログラムを書くという感じで、開発をしてきました。<br>
ですがあるとき… 
**『iPadにタップで文字を入力するのめんどくせぇぇぇぇ！』**　<br>
と思い、市販のキーボードを購入。しかし打ち心地が悪いし、長物だと持ち運びも微妙…
そこでふと思い出したのが、友人やエンジニア仲間がよく言っていた、『自作キーボードはいいぞお:smirk:』でした。

#  「キーボードは自作 & カスタムに限る」
はい、私が紹介するガジェットは『自作キーボード』です！<br>
:person_with_pouting_face_tone3:「自作キーボードって言ったって、どうせ普通のUSキーボードとかキーキャップ変えただけなんでしょ？既製品の方がいいじゃないの！値段安いし！使えればいいじゃん（笑）」
と言われそうなので、紹介します。<br>
私が愛用するキーボードは、一味違う… **変態キーボード『Lily58** **Pro**』です！！

# Lily58 Pro
エルゴノミクス的キー配置の左右分割式自作キーボードで、58キーの可もなく不可もないキー数で構成されています。
ちなみにキースイッチ部分はソケット式になっており、差し替えがとっても楽！メンテもカスタマイズも簡単にできて、ソケット種類も2種類、MX版（身長が高いスイッチ）とCHOC版（身長が低いスイッチ）があり、好みで購入できるのもいいところ！<br>
では、早速どんなカスタマイズしたかを紹介します！

# すこぉカスタマイズ-（初期モデル）
初期モデルは、まだカスタムの沼にハマっていない純粋なエンジニアでした。なので、とりあえず、オススメされて気になった変態キーボード。それに合うカスタムパーツを購入。

| 購入部品名称　| 個数　| 合計値段　|
| ---- | ---- | ---- | 
| Lily58 Pro（Kaikh Choc）　| 1 | ¥17050　|
| Kailhロープロファイルスイッチ35pcs(Pink軸)| 2 | ¥4620　|
| Kailh Low-Profile Keycap for Choc v1 97key - Black| 1 | ¥3300　|
| 1U homing keycap black　| 2 | ¥300　|
| 1.5U keycap black　| 2 | ¥300　|
| TRRSケーブル1m　| 1 | ¥330　|
| micro-USB(接続用)　| 1 | ¥110　|

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528290/70ced2fb-13a9-c6aa-18d7-926425ba472d.jpeg" width="50%">

うん、これはこれで…肩こりが減った？かな？
ていうか、ピンク軸、全然打感ないじゃん！！もうちょっとこう…Macキーボードみたいに打ちやすい感じで…
キーボードカスタム愛が始まってしまいました。

# すこぉカスタマイズ-（ﾋｬｯﾊｧ!モデル）
いろんなキーボードスイッチを触ってきて、落ち着いたのが茶軸。
押した時にクリック感が気持ち良く、今ではバックに忍ばすほど気に入ってます。
あ、あとイライラしたらクリックをカチカチしてﾋｬｯﾊｰってできるし！ハンドスピナーの代わりにも(笑)

| 購入部品名称　| 個数　| 合計値段　|
| ---- | ---- | ---- | 
| Kailhロープロファイルスイッチ35pcs(茶軸)| 1 | ¥2117　|

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528290/464c0aac-70c2-3ae4-99c5-d93baa419496.jpeg" width="50%">

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528290/216bab5d-be6b-6b3f-a43b-d594c189e447.jpeg" width="50%">


# 【結論】 自作&カスタムはいいぞぉ
以前までは「自作キーボード、変態キーボードは自分には合わない。」と思っていたのですが、
キットを組み立てて行って自作の良さと愛着が湧き、使ってからは「より使いやすいモデルに改造したい。」という感じで、沼にハマっていきました。ぜひみなさんも自作&カスタムに挑戦してみてください！
ほんとに友人たちありがとう。そして、これからは…

**自作キーキャップも作っちゃおうかな**:smirk:

# 最後に
ここまで読んでくれてありがとうございます！普段はC言語やPython、マイコンや機械学習などの開発をしてます。記事を書ける時にはいままでの開発してきたものを紹介しますので、みてやってください笑！

# 購入サイト　
遊舎工房：https://shop.yushakobo.jp/

https://shop.yushakobo.jp/
予約済パブリックIPでOCI Computeインスタンスの作成方法

本ブログは、[オラクル・クラウドの個人ブログ](https://qiita.com/letian/items/10152a4fec813c1b7d98)の1つです。

# 初めに
他クラウド・プロバイダーに比べて、パブリックIPが<font color=blue>無料</font>で使えるのは、OCIのメリットの一つです（自動割当てのパブリックIPも、予約済パブリックIPも、共に無料）。なお、どの種類のOCIパブリックIPでも、Computeインスタンスのライフサイクルに、IPアドレスが変わりません。これはありがたいです。

パブリック・サブネットに、OCI Computeインスタンスを新規する時、デフォルトで、パブリックIPは自動割当となります。インスタンスを消さない限り、このIPアドレスが変わりません。もし、自動割り当てはなく、予約済パブリックIPでComputeインスタンスを立てたい場合、以下の作成方法をご参考ください。

__ステップ__
- [1. 予約済パブリックIPの作成](#1-予約済パブリックipの作成)
- [2. Computeインスタンスの新規作成](#2-computeインスタンスの新規作成)
- [3. 予約パブリックIPをインスタンスに割当てる](#3-予約パブリックipをインスタンスに割当てる)

# 1. 予約済パブリックIPの作成
ネットワーキング (Networking) → IP管理 (IP management) → 予約済パブリックIP (Reserved public IPs)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/5e800dc9-2310-149c-bdcf-f38015b6011c.png)

「パブリックIPアドレスの予約」(Reserve public IP address)をクリックし、作成画面を開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/7fcf9ea9-ff88-6de9-ddd0-70a947f2da32.png)

名前を入力し、予約ボタンをクリックする。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/3e30c940-9af6-d859-9a78-c7ed37ccac10.png", width="450">

作成後：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/205e5c19-d9d6-0f21-eeb6-225f1ca38b6d.png)

※、一つリージョン内、<strong>最大５個</strong>の予約済パブリックIPが作れるというサービス制限がある。

# 2. Computeインスタンスの新規作成
作成時、自動割当てではなく、「<font color=blue>プライベートIPv4アドレスの手動割当て</font>」(Do not assign a public IPv4 address)を指定してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/ad905c39-c02b-262b-f17b-da2133505378.png)

作成後、パブリックIPは空白となる。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/63220254-8c86-ca43-5bdf-ccfca1cd759d.png", width="500">


# 3. 予約パブリックIPをインスタンスに割当てる
「アタッチされたVNIC」画面に、プライマーVNICの名前をクリックし、VNICの詳細画面を開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/8b29f87a-5b6c-a76f-c263-dff4992815e4.png)

詳細画面の下、「IPv4アドレス」を選択し、編集ボタンをクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/57003119-cbfe-95e2-b933-d89c8b206f37.png)

パブリックIPタイプのところに、「<font color=blue>予約済パブリックIP</font>」を選択し、リストから、作成した予約済パブリックIPを指定する。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/59621c77-759f-46db-b420-4f13125dc14b.png", width="600">

更新後、予約済パブリックIPが割当てられた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/d724989b-a2d8-aa71-a814-282b4214d4b9.png)

以上です。

----
__関連記事__
[オラクル・クラウドの個人ブログ一覧](https://qiita.com/liu-wei/items/10152a4fec813c1b7d98)