OmniAICreator/Qiita-1.07M huggingface dataset:
Azure Administrator(AZ-104)：Azure でのストレージの実装と管理「Azure Storageのセキュリティ戦略」

Microsoft Learnを用いたMicrosoft Azure Administrator(AZ-104)の試験内容をまとめる投稿です。
この投稿ではMicrosoft Learnで学ぶ内容をできるだけ簡潔にまとめております。
Azureの勉強を一から始め、AZ-900取得後の資格としてAZ-104取得を目指している方の参考になれば幸いです。
※AZ-900の内容は本投稿では省略しております。再度復習したい方は下記をご参照ください。
[Azure Fundamentals(AZ-900)：試験合格に向けた学習内容のまとめ](https://qiita.com/fsd-jume/items/e4ec76959adb547ac5e8)

## 今回の学習内容
**◆「Azure Storageのセキュリティ戦略」**
◇対応するMicrosoft Learn ラーニングパス
[AZ-104:Azure でのストレージの実装と管理](https://learn.microsoft.com/ja-jp/training/paths/az-104-manage-storage/)
◇対応するモジュール
[Azure Storage セキュリティの戦略を確認する](https://learn.microsoft.com/ja-jp/training/modules/configure-storage-security/2-review-strategies)

※前回の投稿は下記から確認できます。
[Azure Administrator(AZ-104)：Azure でのストレージの実装と管理「Blob Storageの価格」](https://qiita.com/fsd-jume/items/054cbace9939e0dd38ac)

## Azure Storageのセキュリティ戦略
### Azure Storageのセキュリティの特徴
**◆暗号化**
・Azure Storageに書き込まれるすべてのデータが対象
・サーバ側暗号化(SSE)を使用してデータを自動的に暗号化

**◆認証**
・Azure ADとRBACは下記の両方でサポート
　-Azure Storageのリソース管理操作
　-Azure Storageのデータ操作
・RBACロールをセキュリティプリンシパルに割り当て
⇒Azure ADを使ってリソース管理操作を承認
・Azure AD統合におけるデータ操作のサポート対象
　-Blob Storage
　-Queue Storage

**◆転送中のデータ**
・アプリとAzure間の転送中のデータを保護する方法
　-クライアント側の暗号化
　-HTTPS
　-SMB3.0

**◆ディスクの暗号化(Azure Disk Encryption)**
・Azure VMのOSやデータディスクを暗号化可能
　-Linuxの場合：DM-Crypt機能を使用
　-Windowsの場合：BitLocker機能を使用
・Azure Key Vaultと統合されている

**◆共有アクセス署名(Shared Access Signature：SAS)**
・Azure Storage内のリソースへの委任アクセスを付与可能

**◆承認**
・下記のセキュリティで保護されたリソースへのすべての要求は認可が必要
　-Blob Storage
　-Azure Files
　-Queue Storage
　-Azure Cosmos DB(Azure Table Storage)
・認可によりストレージアカウント内のリソースにアクセス可能となる
⇒必要な場合にのみアクセス許可されたユーザ/アプリだけ

### 各認可の特徴
**◆Azure AD**
・RBACを使い、ユーザ/グループ/アプリにきめ細かいアクセスの割り当てが可能

**◆共有キー**
・ストレージアカウントのアクセスキーとその他のパラメータを使用
⇒暗号化された署名文字列を生成
・文字列は要求のAuthorizationヘッダーで渡される

**◆共有アクセス署名(SAS)**
・ストレージアカウント内の特定のリソースに下記条件のアクセスを委任
　-指定したアクセス許可
　-指定した期間

**◆コンテナとBLOBへの匿名読み取りアクセス**
・Azure Storageにオプションとしてサポートされている
・既定ではコンテナとBLOBへのすべての要求には認可が必要
⇒コンテナとBLOBに対する読み取り要求の認可が不要になる
・匿名読み取りアクセスを有効化するために必要な設定
　-ストレージアカウントのパブリックアクセスを許可
　-コンテナのパブリックアクセスレベルを変更

## 次の学習内容
**◆Shared Access Signature**

https://qiita.com/fsd-jume/items/c153f0a656db09c97d54

## 学習内容をまとめたページの一覧

https://qiita.com/fsd-jume/items/6eda24728c9c03c36bc3
Goでcpコマンド的なの作ってみた🌱

# Goでcpみたいなものを作ってみました

この記事は初心者🌱の自分のためのメモに近いです。ご容赦を。
paizaで学習するときに、いちいちディレクトリを複製するのが手間だったのでディレクトリの複製がしたかった。
ちょうどGoでなんでもいいからツールを作ってみたかったから作った。

cpなんていう便利なものがあったことは知らなかった

## 主に使用したパッケージ
どれも標準パッケージですね
- `io`
- `os`
- `path/filepath`
## 今回のリポジトリ
https://github.com/takaryo1010/copyDirectory


## 面白かったところ
### [`os.Args`](https://pkg.go.dev/os#Args)について
これを使用することによって、`go run `以降の引数を取得できる。
`go run . filename`だと `os.Args`の要素の0番目が`.`なのでファイルのパス。1番目が`filename`となる。
 `os.Args`の要素の1番目がある場合のみプログラムを続けたかったので、以下のように書いた。
```os.Args.go
if len(os.Args) == 2 {
		directory_name = os.Args[1]
	} else {
		os.Exit(1)
	}
```

### `os`パッケージまわりについて
`os.Stat`は返り値に`fs.FileInfo`と`error`を持つ。
[`fs.FileInfo`](https://pkg.go.dev/io/fs#FileInfo)とはなんぞや。
```fileInfo.go
type FileInfo interface {
	Name() string       // base name of the file
	Size() int64        // length in bytes for regular files; system-dependent for others
	Mode() FileMode     // file mode bits
	ModTime() time.Time // modification time
	IsDir() bool        // abbreviation for Mode().IsDir()
	Sys() any           // underlying data source (can return nil)
}
```
ということらしい。
ぱっと見で理解できそうなのは、`Name`と`Size`くらいかな...
と思ってたら`IsDir`が目についた。
これ、ディレクトリかそうじゃないかboolで返してくれるじゃん。天才じゃん。
ってことで利用する。
`os`パッケージにはディレクトリ作成の関数と、ファイル作成の関数が別で用意されているので、`IsDir`を使って区別できた。


### [ `filepath.Walk()`](https://pkg.go.dev/path/filepath#Walk)について
`func Walk(root string, fn WalkFunc) error`
`root`には探索したいディレクトリを入れる。
`fn`の[`WalkFunc`](https://pkg.go.dev/path/filepath#WalkFunc)ってなに。
```
type WalkFunc func(path string, info fs.FileInfo, err error) error
```
ってことらしい。
おそらく、 `filepath.Walk()`君が、`WalkFunc`君の引数にそれぞれのディレクトリ等のパスとかinfoを投げて、それらを利用した関数を書けるということだと思う。
実際に書いてみた。
```make_directory_or_file.go
func make_directory_or_file(filename string) {
	var new_path string
	filepath.Walk("original_directory", func(path string, info os.FileInfo, err error) error {
		if err != nil {
			return err
		}

		new_path = strings.Replace(path, "original_directory", filename, -1)
		if info.IsDir() {
			err := os.MkdirAll(new_path, 0755)
			if err != nil {
				log.Println(err)
				os.Exit(1)
			}
		} else {
			dst, err := os.Create(new_path)
			if err != nil {
				log.Println(err)
				os.Exit(1)
			}
			src, err := os.Open(path)
			if err != nil {
				log.Println(err)
				os.Exit(1)
			}
			_, err = io.Copy(dst, src)
			if err != nil {
				log.Println(err)
				os.Exit(1)
			}
		}
		return nil
	})

}
```
これはさっきの`os`パッケージも使って書いてみた。
わりかしコンパクトに書けたのではないかと思いたい。

#### ひとりごと
`Walk`で思い出したけど、これはおそらくグラフ理論の木構造とか使ってんのかなぁみたいな。
[静的解析ツールを学習する機会](https://note.com/knowledgework/n/n4ae80c7a479c)があったけどおそらく今回の`Walk`と似たことをやっていたんだと思う。抽象構文木をつかって、要素を一つ一つに関数を実行してたんだね。今やっと理解できた。ってことで多少は理解が進んだから静的解析ツールの話も記事にまとめます。
今回の学習を先にしていればもっと理解が早かったのかあ…

## 感想
cpコマンドとほとんど同じことをやってるので便利なツールができた！みたいな感じにはならなかったけど得たものが凄い多かった。
こういう感じで簡単なものでもツールいっぱい作ってみようと思う。
【Laravel】migrate実行時の　Base table or view already exists ~ や Column already exists〜　のエラー対応

# 対象
migrate実行後に、マイグレーションファイルのファイル名のみを変更してstatusを実行済にしたい人向け。

# 結論
マイグレーションファイルのupメソッド内をコメントアウトしてmigrateを実行します。
```2023_03_21_192233_create_items_table.php
    public function up()
    {
//        Schema::create('items', function (Blueprint $table) {
//            $table->unsignedInteger('id');
//            $table->string('name');
//        });
    }
```
※これは実行済のmigrationファイルのファイル名のみを変更した時だけを想定しています。


## エラーの原因
既に実行済のマイグレーションファイルのファイル名を変更すると、新規のマイグレーションファイル扱いとなりmigrate実行前になる。

```
$ php artisan migrate:status

| No   | 2023_03_21_192233_create_items_table
```

これで、migrateを実行すると既にテーブルやカラムが存在する状態なので表題のエラーが出る。

## 今までしていたエラー回避
### ロールバック
developブランチなどにマージ前の作業ブランチでmigrateした時は、他のブランチに切り替える際都度ロールバックを行い不要なテーブルやカラムは元に戻した状態にする。

```
php artisan migrate:rollback --step=1
```

→レコードが全てなくなるので再度テストしたいときに面倒。developにマージ後にmigrateをする。

### テーブル、カラムを削除
ロールバックは行わず、追加したテーブルやカラムをGUIツールやSQLなどで削除をしてmigrateを実行する。`already exists~`のエラーはでず`migrate`できる。
→これも、レコードが全てなくなるので再度テストしたいときに面倒。


## 結論のコメントアウトについて
`Schema::create~`をコメントアウトして実行することで、migrateは実行済状態になり、データも失われずにファイル名の変更だけができました。



他にいい方法などがあれば、コメントお待ちしおります。
Instruments Timeprofilerで計測しシンボルを表示する方法

# 実施前提
・今回は実機端末でおこなう為、実機と有線の用意
・アプリのdSYMファイルの用意
# 手順
1. Macと実機を有線で繋ぐ

2. Xcode>Open Developer Tools -> Instruments Time Profiler -> Choose

3. 左上で接続した実機を選択。検証するアプリをRunning Applicationsより選択。
　　※Installed Appsから選択すると計測できなかったので注意
![スクリーンショット 2023-10-16 16.40.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2027418/6ba2aae3-e822-0909-56bd-33940b33ff25.png)

4. 左上のレコードマークを押し、実機でアプリを操作する

5. 操作完了後、左上の停止ボタンで記録を停止する
　※この状態だとまだ計測結果のSymbol Nameが非表示となっている。

6. File>Symbolsを開き、dSYM Paths:Locate -> 該当するdSYMファイルを選択
　（Locateが完了したら各項目左の緑色の丸が黄色になる）

計測結果のSymbol Nameが表示され、API名などが確認できる。
※画面下のCallTreeからHideSystemLibrariesにチェックを入れるとシンボル名が見やすい。
command+Sで名前を付けて保存。
GitHub の RSA SSH host key が変わった

## 突然 Warning が出て GitHub につながらなくなった

```
$ ssh git@github.com
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
SHA256:uNiVztksCsDhcc0u9e8BujQXVUpKZIDTMczCvj3tD2s.
Please contact your system administrator.
Add correct host key in /Users/xxx/.ssh/known_hosts to get rid of this message.
Offending RSA key in /Users/xxx/.ssh/known_hosts:4
Host key for github.com has changed and you have requested strict checking.
Host key verification failed.
```

## NASTY な SOMEONE の正体

GitHub 自身だった。

https://github.blog/2023-03-23-we-updated-our-rsa-ssh-host-key/

3月24日5時UTC頃（14時JST）、セキュリティのために変更したとのこと。


## 解決方法
上記ページに書いてある通り。

```bash
$ ssh-keygen -R github.com
$ curl -L https://api.github.com/meta | jq -r '.ssh_keys | .[]' | sed -e 's/^/github.com /' >> ~/.ssh/known_hosts
```

ビビる。
【php】相対的な日付の書き方

メモです。

```
date('Y/m/d'); //今日　"2023/03/24"
date('Y/m/d', strtotime('first day of this month')); //今月1日 "2023/03/01"
date('Y/m/d', strtotime('first day of next month')); //来月1日 "2023/04/01"
date('Y/m/d', strtotime('last day of previous month')); //先月末日 "2023/02/28"
```

参考：

https://www.php.net/manual/en/datetime.formats.relative.php

https://musubite-job.com/recruitments/XPriPw?utm_source=qiita
Googleデジタルマーケティング＆Eコマース：Google Adsのメトリックス

# はじめに

”Googleデジタルマーケティング＆Eコマース プロフェッショナル認定証"　の受講が完了しました(2022/3/3)。私がこのコースから得られた素晴らしい体験を、テーマごとに分割して、わかりやすくご紹介しています。興味を持たれた方は、是非下記を受講してみてください。

https://jp.coursera.org/professional-certificates/google-digital-marketing-ecommerce

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/41012708-dfb2-da45-b1a3-5a683fab51bc.png" width="800">

# Google Adsのメトリックス

キャンペーンのページでは、表示するメトリックスを選択することでコントロールすることができます。メトリックスを選択できることは、マーケティングファネルの異なるステージでのメトリックスを表示したい場合に便利です。今回、マーケティングファネルの認知、検討、コンバージョンの各ステージでよく評価される指標を選択し表示する方法を学びます。

こちらはGoogle Adsのキャンペーンページです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/ffac6f40-8169-a4a1-10b7-405acb8a4996.png" width="７00">

### 認知メトリックス

マーケティングファネルの認知ステージにおいて、あなたがモニターするであろうメトリックスは、

- クリック数
    - キャンペーンのクリック数
- インプレッション数
    - キャンペーン内の広告を潜在顧客が見た回数

です。

これらの列がまだ表示されていない場合は、追加することができます。これらのメトリックスはパフォーマンスセクションにあり、クリック数とインプレッションのチェックボックスをマークするために展開できます。変更を適用すると、クリック数とインプレッション数の列が表示されます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/5ab71d4a-0b39-278a-da5a-0b7a68d14e05.png" width="７00">

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/631c201b-574c-d73c-3019-6b76385fdea2.png" width="７00">

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/8f3b455a-1c35-9b01-9392-c5f2bcb909ff.png" width="７00">

### 検討メトリックス

マーケティングファネルの検討ステージでは、

- クリックスルー率（CTR）
    - クリック数のみの割合
- インタラクション率
    - クリック、スワイプ、および画像、テキスト、拡張機能とのその他のインタラクションの割合

を監視することが多いでしょう。

パフォーマンスメトリクスのセクションに戻ると、これらのメトリクスをクリックして追加できます。変更を適用すると、CTRとインタラクション率の列が表示されます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/9794137d-8f0b-f69d-8bce-bb6549187040.png" width="７00">

# コンバージョン・メトリックス

マーケティングファネルのコンバージョン・ステージでは、

- コンバージョン数
- コスト
    - キャンペーン広告への投資額
- コストあたりのコンバージョン値（Conversion value per cost）
    - 投資に対するリターンを推定するもの。これは、コンバージョン値の合計をすべての広告インタラクションの合計コストで割って計算されます。
- コンバージョン率
    - 広告インタラクションごとの平均コンバージョン数

を監視することになるでしょう。

これらの指標を追加するには、キャンペーンページの「コンバージョン」セクションを展開します。チェックボックスを選択したら、"適用 "をクリックします。これで、これら4つの指標の追加列が表示されました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/5b09c5dc-56b4-ca3a-04b6-765587dead65.png" width="７00">

:::note info
キャンペーン指標、キャンペーン予算、潜在顧客がマーケティングファネルのさまざまなステージをどのように進んでいるかを監視することは、全てあなたが目指すマーケティングの役割に不可欠なスキルです。 
:::
WindowsのGitでdiffが文字化けする場合の対応

## 環境

OS : Windows11  
シェル : Windowsターミナル + PowerShell  
ツール : Git for Windows

## 現象

SJIS のファイルの diff を見ようとすると文字化けが発生する

```diff
PS C:\work\test> git diff
diff --git a/fruit_sjis.txt b/fruit_sjis.txt
index 3c85617..6a92bf9 100644
--- a/fruit_sjis.txt
+++ b/fruit_sjis.txt
@@ -1,2 +1,3 @@
 apple : <97>ь<E7>
 banana : <83>o<83>i<83>i
+chocolate : <83>`<83><87><83>R<83><8C><81>[<83>g^M
```

## 試したこと

[git diff や git status での日本語の文字化けを防ぐ](https://maku77.github.io/git/settings/garbling.html)
の通りにしてみたが、ダメだった

## 解決策

git diff の出力を nkf に通してみたところ、文字化けが発生しなくなった

※nkf とは、文字コードを良い感じに判別して変換してくれるツール

1. nfk を <https://www.vector.co.jp/soft/dl/win95/util/se295331.html> からダウンロードして展開
2. nkf のパスを通す
    1. 適当なディレクトリを作成する(何でもいいけど、ここでは `C:\Tools\nkf` とする)
    2. 展開したディレクトリから `nkfwin\vc2005\win32(98,Me,NT,2000,XP,Vista,7)Windows-31J` の `nkf32.exe` を `C:\Tools\nkf` にコピー
    3. `nkf32.exe` を `nkf.exe` にリネーム
    4. ユーザー環境変数の Path に `C:\Tools\nkf` を追加
    5. シェルを開きなおして、`nkf --version` でバージョンが表示されればOK
3. `git config --global core.pager "nkf -w8 | less"` を実行

対応後 SJISのファイルの日本語がちゃんと表示されるようになった!

```diff
PS C:\work\test> git diff
 diff --git a/fruit_sjis.txt b/fruit_sjis.txt
index 3c85617..6a92bf9 100644
--- a/fruit_sjis.txt
+++ b/fruit_sjis.txt
@@ -1,2 +1,3 @@
 apple : 林檎
 banana : バナナ
+chocolate : チョコレート^M
```

## 参考サイト

- [git diff の文字化け対応](https://mistymagich.wordpress.com/2013/04/20/git-diff-%E3%81%AE%E6%96%87%E5%AD%97%E5%8C%96%E3%81%91%E5%AF%BE%E5%BF%9C/)

## [Optional] 文字コードと改行コードについて

よほどの理由が無い限り、文字コードは UTF-8 で統一した方が良い  

SJIS を使用してしまうと、Azure DevOps 上で差分を見る際に日本語が全て文字化けしたりする  
(SJISはMicrosoftが作った規格なのだから、それくらい対応して欲しいのだが...)  

また、改行コードが CRLF だと Git で差分を見るときに `^M` が末尾に付いて鬱陶しいなどの弊害があるので、改行コードは LF に統一した方が良い  
.gitattributes をリポジトリ内に置いておくことで改行コードを LF に強制できる

```shell:.gitattributes
* text=auto eol=lf
*.{cmd,[cC][mM][dD]} text eol=crlf
*.{bat,[bB][aA][tT]} text eol=crlf
```

エディタ側でも改行コードの設定をしておくと良い

```json:.vscode/settings.json
{
    "files.eol": "\n",
}
```
App Storeの価格設定が2023年5月から勝手に変わる？？

# はじめに
AppStoreでいくつかアプリを出しています。
有償アイテムもあるアプリがほとんどで、今まで何度も価格設定の変更の対応を行ってきました。
今回も、対応が必要になるケースだったので記録を残しておきます。
※ 2023/03/24 時点の記事となり、正確なアプローチを行っているかは分かりません。参考程度に見ていただけると幸いです。

# ある日
アカウント整理でApp Store Connectにログインしたら下記の価格変更の注意書きが。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865644/68825f6f-ac21-59c4-bf22-ce49408fe225.png)

おや？？ また価格の改定するのか？ つい最近大変な思いをして対応したのに？？
とりあえず3/9に発表されていた、公式のデベロッパーサイトの[ニュースとアップデート](https://developer.apple.com/jp/news/?id=dbrszv62)を確認すると気になる箇所が。


>App Store ConnectまたはApp Store Connect APIを使用して強化された世界的な価格設定を活用し、既存の価格設定を更新できます。5月9日までにデベロッパが既存のAppおよび1回限りのApp内課金の価格を更新しない場合、Appleは、現在米国を基準に設定されているデベロッパの現在の価格をもとに更新を行います。

うん・・・？　なんかよくわからんが、何もしなかったら5月から勝手に価格が変わるのか・・・？
それはヤバくね・・？？
（データベースで値段を保持していたりするので画面に差異が出てしまう）

# 要約すると（おそらく）

何やら対応が必要に感じたので、しっかりと読んで自分的に要約すると
* ベースの地域(国)にあわせて他の国の価格が為替レートに応じて自動で変更されるようになる
* ベースを日本にすれば勝手に価格が変動することはないはず
* 価格変動は5月9日から適用される

ってことかなと思いました。

# 影響確認（ベース地域の確認）
まぁ、日本向けのアプリしか出してないし、日本をベースにしてるだろうと思って一応下記の手順で確認してみると・・・

**任意のApp** ＞ **機能** ＞ **App内課金** ＞ **設定中の任意販売アイテム**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865644/d6bf06a3-7aaf-c10b-7cb3-d7e1ecc24825.png)
**ア、アメリカになっとる！！**

他アプリを見ても、全てアメリカ合衆国になってました。
恐らくですが、デフォルトはアメリカになってる気が？？

このままでは5月9日から勝手に値段が変更されてしまう結果に。（今回は勝手に値下げされるパターンでした）

# 対応へ
ってことで、一番影響が少ないようにベース地域を日本に変更することにします。
### 1.アイテムの[App内課金の価格]の編集ボタンを押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865644/4c2c6574-34ae-8478-e85e-994830900182.png)

### 2.確認ポップアップにチェックを入れ、編集ボタンを押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865644/afbca4a5-3b01-4568-1e1a-a2d938dc35f1.png)

### 3.基準を日本を選択し、元の設定されてた値段を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865644/0b62a2ce-7a73-3f94-cab0-e925d68c2ffa.png)

### 4.他全てのアイテムを同様に設定変更し完了
一括では出来ないのでご注意を。


# さいごに
恐らくこれで5月9日を迎えても日本への価格は変わることはないかと思います。
ちなみに、価格帯がない場合もあるのでその場合は何かしらの対応がアプリ側でも必要になるケースが発生するかと思います。

ただこの作業を行えば、価格改定の作業は今後しなくてもよいのでは？
あくまでも日本ベースで考えればですが。

まだまだ情報が曖昧のまま進めてしまってるので5月9日までは注視していきたいと思います。
Vue 3で一度だけwatchする方法

# 🆕一度きりのウォッチャー Vue 3.4+

Vue 3.4にてウォッチャーに`once`オプション[^1]が追加されたので、単純にこれを使えば良くなりました！
```ts
watch(something, () => {
  // 一度だけ実行したい処理
}, { once: true })
```

[^1]: [一度きりのウォッチャー](https://ja.vuejs.org/guide/essentials/watchers#once-watchers)

下記は、Vue 3.3以前向けの当初の記事になります。

---

# 結論
`watch`関数から返されるハンドル関数を使用する（`watchEffect`も同様）[^1]。

[^1]: [ウォッチャーの停止](https://ja.vuejs.org/guide/essentials/watchers.html#stopping-a-watcher)

```ts
const unwatch = watch(something, () => {
  // 実行したい処理

  unwatch() // ウォッチャーの停止
})
```

# デモ

```vue
<script setup>
  import { ref, reactive, watch } from 'vue'

  const counter = ref(0)
  const watcher = reactive({ normal: 0, once: 0 })

  // normal watch
  watch(counter, () => {
    watcher.normal++
  })

  // watch only once
  const unwatch = watch(counter, () => {
    watcher.once++
    unwatch()
  })
</script>

<template>
  <div v-for="(value, key) in watcher" :key="key">
    {{ key }} watcher: {{ value }}
  </div>
  <button @click="counter++">{{ counter }}</button>
</template>
```

ボタンをクリックするたびに`counter`がインクリメントされます。`normal`と`once`は両方とも`counter`を監視しますが、`once`は1回目の変更検知時に`unwatch()`でウォッチャーを停止しているので、2回目以降の変更は検知しません。

https://codesandbox.io/embed/eager-carlos-n9edh6?autoresize=1&fontsize=14&hidenavigation=1&module=%2Fsrc%2FApp.vue&theme=dark
Chatgptでお金を稼ぐ : 11 の簡単な例

こんにちは！今回は、<a href="https://chatgptfy.com/">ChatGPT</a>
を使ってお金を稼ぐ方法についてお話しします。ChatGPTは、OpenAIによって開発された言語モデルで、人工知能を使って様々なタスクをこなすことができます。その中でも、ChatGPTを使ってお金を稼ぐ方法は様々あります。

まず、ChatGPTを使って文章を書くことができます。これは、ウェブサイトのコンテンツやブログの記事など、様々な場面で活用することができます。例えば、企業がウェブサイトのSEO対策のために、ChatGPTを使って記事を自動生成することがあります。また、ブログの運営者がChatGPTを使って記事を書くことで、時間や労力を節約することができます。ChatGPTを使った文章作成によって、報酬を得ることができる場合もあります。例えば、クラウドソーシングサイトで、ChatGPTを使って記事を書く仕事を受注することができます。また、ウェブサイトのオーナーが、ChatGPTを使って記事を書くライターを募集している場合もあります。

次に、ChatGPTを使って問題を解決することができます。例えば、企業がChatGPTを使って、顧客対応の自動化を図ることがあります。これによって、人件費を節約することができます。また、ChatGPTを使って、特定のテーマに関する質問に答えるサービスを提供することもできます。これによって、報酬を得ることができます。

さらに、ChatGPTを使って翻訳することができます。ChatGPTは、様々な言語に翻訳することができます。これは、海外のクライアントとのコミュニケーションに役立ちます。また、海外のクライアントからの翻訳の仕事を受注することもできます。ChatGPTを使って翻訳することで、報酬を得ることができます。

以上のように、<a href="https://chatgptfy.com/ja/chatgpt%e3%81%a7%e3%81%8a%e9%87%91%e3%82%92%e7%a8%bc%e3%81%90%e6%96%b9%e6%b3%95/">ChatGPTを使ってお金を稼ぐ方法は様々あります。</a>
しかし、稼ぐためには、いくつかのポイントに気を付ける必要があります。

まず、質の高い成果物を提供することが大切です。ChatGPTを使って仕事をする場合、最も重要なこと
C言語 char a[20]に値設定できない!!!

# はじめに
こんにちは。
30代から未経験からエンジニアです。

大変です。
文字型と文字列型が違うことは理解できたのですが、今度は値を設定できなくなってしまいました・・・。

初歩だと思うのですが、備忘録に残します。

# なぜ代入できない？
まず今回やりたかったことを説明いたします。

```test.c
char a[20];

a = "dainyuusitai";
puts(a);
```

ん？
左辺値に関するエラーが出ている？

と思い色々やってみました。

```test.c
char a[20];

a[0] = "dainyuusitai";
puts(a);
```
これも例外処理流れて実行できず。

結局よくわからず下記初期化宣言で対応。

```test.c
char a[20]= "dainyuusitai";

puts(a);
```
できたけども・・・

あとから値を受けて入れるときにこれだと不便だと思い調べる。

一応こんな感じでもいけるらしい。

```test.c
	char a[20];
	a[0] = 'd';
	a[1] = 'a';
	a[2] = 'i';
	a[3] = 'n';
	a[4] = 'y';
	a[5] = 'u';
	a[6] = 'u';
	a[7] = 's';
	a[8] = 'i';
	a[9] = 't';
	a[10] = 'a';
	a[11] = 'i';
	a[12] = '\0';
	printf("%c", a[0]); // 一番最初の「d」が取れる。
```

いや、めんどいよ！

てことで解決策書いていきます。


# 解決策

てことで、調べたらこんなのありました： ``strcpy(配列変数 , "いれたい文字列");``

```test.c
#include <string.h> //下記includeが必要です。
#pragma warning(disable : 4996) //非推奨エラー非表示にできる。

	char a[20];
	strcpy(a, "dainyuusitai");
	puts(a); //結果「dainyuusitai」と表示できました。
```

とこんな感じで解決できるみたいです。

とまあ、他の言語と違いString型がなかったのでこんな最初の方で苦戦しましたので書いておきます。
(自分への戒めです。)
【SSH】REMOTE HOST IDENTIFICATION HAS CHANGED が出た場合の対処法【github】

githubに接続しようとすると、たまに下記のエラーが出る。

```
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
```

- ~/.ssh/known_hostsからホスト情報を削除
`ssh-keygen -R github.com`

- ssh接続を試す
`ssh -T git@github.com`


`Are you sure you want to continue connecting (yes/no/[fingerprint])? `
と警告が出たら "yes" と入力

- つながる

github以外のホストでも対処法は同じなはず。
S3 Syncに改めて入門してみる

# 概要
S3 Syncを使用する機会があったので、改めて理解を整理してみました。

**S3 Syncとは**
```
s3 sync コマンドはバケットとディレクトリの内容、または 2 つのバケットの内容を同期します。
通常、s3 sync は欠落しているか古くなったファイルやオブジェクトを、ソースとターゲットの間でコピーします。
```
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-services-s3-commands.html#using-s3-commands-managing-objects-sync
## cpとsyncの違いは？
- cpは**ファイルをコピー**するコマンド
- syncは**ディレクトリの更新差分をコピーする(同期する)** コマンド

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435702/4358354f-b68b-c186-95ed-66b16ab18e36.png)
※赤文字が更新部分


## やってみる
### 基本的なコマンド
```
$ aws s3 sync files/  s3://kurono-test-sync/
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435702/8c4185f4-30f9-0736-e50c-37231f954746.png)

#### S3内ファイル確認コマンド
```
$ aws s3 ls --recursive s3://kurono-test-sync --summarize
```

### ローカルファイルを削除して実行
削除して、実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435702/8b08bfef-b0e4-a00c-cc0d-8863e66909d9.png)
何も行われない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435702/f5eebf9e-fb5b-59d4-e415-4d96481285e2.png)


### 宛先のファイル削除コマンド
```
$ aws s3 sync files/ s3://kurono-test-sync/ --delete
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435702/5abd8fa0-903f-125b-9d1a-f4c12036bb5d.png)


宛先からもファイルを削除するには`--delete`オプションを付けて実行する必要がある。
> `--delete（ブール値）`宛先には存在するがソースには存在しないファイルは、同期中に削除されます


## S3 Syncが更新されたとみなす条件
以下の様な、条件があるため注意が必要です。

- 指定されたバケットとプレフィックスの下にローカルファイルが存在しません。
- ローカルファイルのサイズは、s3オブジェクトのサイズとは異なります。
- ローカルファイルの最終変更時刻は、s3オブジェクトの最終変更時刻よりも新しいです。

### 上記をコントロールする方法

- `--size-only（ブール値）`各キーのサイズを、ソースから宛先に同期するかどうかを決定するために使用される唯一の基準にします。

- `--exact-timestamps（ブール値）`S3からローカルに同期する場合、タイムスタンプが完全に一致する場合にのみ、同じサイズのアイテムは無視されます。


# まとめ
- 今回は、ローカル→S3で試しましたが、S3→S3も実行できるので機会があれば試してみたいです。
- `--dryrun`で実行前に確認を入れるとより良いかと思います。
基本情報技術者試験受かったから話すよ

令和4年度上期基本情報技術者試験(以下FE)に見事合格しました。
令和3年度下期にセキュリティマネジメントに受かってそのままの流れで受験してみた感じです。
この記事では主に私がどのようにして勉強を進めていったのか話していけたらな～なんて考えています。

## まずは当時の試験の概要から
令和4年度上期基本情報技術者試験CBT方式
試験会場：各地にあるプロメトリックのテストセンター
受験手数料：￥7,500（消費税込み）
合否発表：メールで即時
試験時間：（午前）150分、（午後）150分
問題数：（午前）80問、（午後）出題11問のうち5問回答
合格点：（午前）60点以上/100点、（午後）60点以上/100点

## 勉強方法
流れとしては、
①参考書を１周読む
②午前過去問を解きまくる
③午後過去問を解きまくる　です。

実際のところ過去問から同じような問題から出題されますので、過去問を解きまくるだけで合格できるのも事実です。
ただ、参考書を読んだうえで過去問を解いたほうが将来的な知識の定着が違うためこの流れを選択しました。

#### ①参考書を１周読む
私の選んだ参考書は
 [キタミ式イラストIT塾 基本情報技術者](https://www.amazon.co.jp/dp/B09HC74PPR/ref=cm_sw_r_cp_api_glt_QWSVT50BSG3R87M57MF1)です。
いわゆる有名なキタミ式です。
キタミ式ではよくイラストを使って説明してくれます。
そのため言葉だけで説明されると分かりづらい用語も分かりやすく砕けた説明をしてくれてITに詳しくない人には一番おすすめかなと思います。
まずは一通り読んで、その後問題を解いていく中で分からない用語に遭遇したら辞書的な使い方もしました。

#### ②午前過去問を解きまくる
参考書を読んだらあとはひたすら問題をひたすら解くのみです。
とにかく過去問過去問過去問過去問過去問です。
平均8～9割とれるようになるまで解きまくりました。
間違った問題は即復習。
過去10回分は解いておきました。

#### ③午後過去問を解きまくる
午前が安心してきたら次は午後。
午後も午前同様に過去問ひたすら解くのみです。
午後は選択問題でどれを選択するかが重要だと感じました。
私の場合は試しにすべての選択問題を解いてみてどれが点を取れそうかを考えて決めました。
最後のプログラミング言語問題は実際の仕事で使っているものがあればそれでいいかなと思います。
無ければ表計算が無難かな。

## さいごに
以上、FEを合格してみたレポートでした。
プログラマーの登竜門だとよく言われているのでやっとこれでスタートラインに立てた気がします。
周りの友人たちにも胸を張ってITで働いていると言うことができます。
次は応用情報技術者試験を受ける予定です。
ただ、一旦仕事を優先したいので勉強は休憩して、いろいろ整えてからまたタイミングがきたら受けようと思います。
【SwiftUI】macでフローティングウィンドウを表示する方法

# はじめに
macアプリでは、クイックメモやカラーピッカーなどでフローティングウィンドウが使われます。私が以前リリースした、プレゼンター向けmac用タイマーアプリ「FloatingTimer」でもフローティングウィンドウを使用しました。
今回は、その時に使用したウィンドウを常に最前面に表示する技術を紹介します。

https://twitter.com/shota_appdev/status/1621366673965223936?s=61&t=PJU39MzSMcDHmTBL-tgkBA

# NSPanel
macアプリでモーダルウィンドウを表示するには、NSPanelを使用します。
NSPanelを使って、フローティングウィンドウを実現できます。

# NSHostingController
NSPanelはAppKitのクラスであるため、SwiftUIのViewを表示するには一度NSViewControllerに変換する必要があります。

その際に利用するのが、NSHostingControllerです。NSHostingControllerを使うとSwiftUIのViewをNSViewControllerに変換することができます。NSHostingControllerを利用することで、SwiftUIとAppKitを組み合わせたアプリケーションを開発することができます。

# コード解説

以下のコードを使って、簡単なフローティングウィンドウを作成することができます。

```swift
import SwiftUI

struct ContentView: View {
     var body: some View {
         VStack {
             Button("button") {
                 let view = Text("hello")
                     .frame(minWidth: 200, minHeight: 200)
                     .frame(maxWidth: .infinity, maxHeight: .infinity)
                 let controller = NSHostingController(rootView: view)
                 
                 let panel = NSPanel(
                     contentRect: .zero,
                     styleMask: [
                         .closable,
                         .miniaturizable,
                         .nonactivatingPanel,
                         .titled,
                         .resizable
                     ],
                     backing: .buffered,
                     defer: false)
                 panel.contentViewController = controller
                 panel.level = .floating
                 panel.collectionBehavior = [
                     .canJoinAllSpaces,
                     .fullScreenAuxiliary
                 ]
                 panel.isMovableByWindowBackground = true
                 panel.center()
                 panel.makeKeyAndOrderFront(nil)
             }
         }
         .padding()
     }
}
```

このコードでは、Buttonをタップすると、フローティングウィンドウが表示されます。

ポイントは以下の7点です。
- styleMask（後述）
- contentViewControllerにNSHostingControllerをセット
- levelプロパティ：ウィンドウの表示レベルを設定するためのプロパティ。floatingにすることで最前面に表示できる。
- collectionBehaviorプロパティ（後述）
- isMovableByWindowBackgroundプロパティ：trueにするとウィンドウの背景部分をドラッグしてウィンドウを移動できる。
- centerメソッド：ウィンドウを中心に配置できる。
- makeKeyAndOrderFrontメソッド：ウィンドウをアクティブにして、画面上に最前面に表示する

## styleMask
NSPanelのstyleMaskは、ウィンドウのスタイルを設定するためのオプションです。
ここでは、styleMaskのパラメータとして以下のオプションを使用しています。

- closable: ウィンドウを閉じるボタンを含める。
- miniaturizable: ウィンドウを最小化するボタンを含める。
- nonactivatingPanel: ウィンドウをアクティブ化させない。
- titled: タイトルバーを表示する。
- resizable: ウィンドウのサイズを変更できるようにする。

## collectionBehavior
NSPanelのcollectionBehaviorプロパティは、ウィンドウが複数スペースにまたがるときの動作を設定するためのオプションです。上記の例では、.canJoinAllSpacesと.fullScreenAuxiliaryを設定しています。

- .canJoinAllSpaces: ウィンドウを複数スペースで共有することができる。
- .fullScreenAuxiliary: フルスクリーンアプリケーションの画面の上にウィンドウが表示されるようになる

# まとめ

SwiftUI製macアプリでフローティングウィンドウを表示する方法を解説しました。これを参考にして、macアプリで様々なフローティングウィンドウを実現してみてください。

---

ご覧いただきありがとうございました。

🐦 [Twitter: @shota_appdev](https://twitter.com/shota_appdev)

📱 [個人アプリ: Symbols Explorer](https://apps.apple.com/jp/app/symbols-explorer/id1612933742)
すごい中華系AI見つけました

こんにちは、Pic氏です。

中華系AIまじですごい
![images (3).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297213/b5267a64-984b-c0a3-d3cc-694c3b8019c0.jpeg)
このように顔も見えないような写真を、「HitPaw Photo Enhancer」という製品を使って完璧に再現できるのはすごい。 特に、違和感がないのがまじですごい。
![20230324153111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3297213/02583392-d822-5ce5-f15b-0cfd430b2307.png)
操作もすごくシンプルで、見れば大体わかる。
公式URLはこちらhttps://www.hitpaw.jp/photo-enhancer.html
HitPaw Photo Enhancer」は画像の画質補正を目的とし、「HitPaw Video Enhancer」は動画の画質補正を目的とするみたい。また時間あれば、試しを。
GitHubにpushしようとしたらWARNINGが出た(2023.03.24)

さきほどGitHubにpushしようとしたら、こんなWARNINGが出ました。

```
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
SHA256:uNiVztksCsDhcc0u9e8BujQXVUpKZIDTMczCvj3tD2s.
Please contact your system administrator.
Add correct host key in ~/.ssh/known_hosts to get rid of this message.
Host key for github.com has changed and you have requested strict checking.
Host key verification failed.
```

正直かなりビビりましたが、GitHubさんが以下お知らせを出しておりましたのでご共有です。

https://github.blog/2023-03-23-we-updated-our-rsa-ssh-host-key/

書いてあるとおり、`~/.ssh/known_hosts`からgithub.comの行を削除すると、新しいfingerprintに更新され、これまで通りpushできるようになりました。
OpenUSD python API でエラーメッセージが読めないことがある件

ご無沙汰しております。
2023年3月より、オフィシャルに Pixar USD は OpenUSD と呼ぶ方向になっていくそうなので、なるべく OpenUSD と書いていこうと思います。ようやく検索しやすくなって助かりますね。

# エラーメッセージを読みたい
OpenUSD は python API が充実していて、たいていの処理は python で書けば済んでしまいます。とても便利でよいのですが、ここに日本語ユーザ固有の問題が一つひそんでいます。

特に OpenUSD のプラグイン開発やちょっと込み入った使い方をしている大手ユーザで遭遇しやすいと思うのですが、python スクリプト中に USD でエラーが発生した際に

```
pxr.Tf.ErrorException: <unprintable ErrorException object>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8e in position 152: invalid start byte
```

と出て、はて何のことやら、となることがありませんか。
（このメッセージをググってここに来た人、手を挙げて）

これは今（USD 2302）のところ、Windows 日本語環境で python 3.x で OpenUSD を使っているときに発生する問題です。USD 処理中のエラーメッセージでプラットフォーム固有部分のエラー（入出力とか、DLLとか）に Windows のエラーメッセージが混ざって出力されることがあるのですが、その際に SJIS で生成された文字列が python3 用に utf-8 文字列として渡されてしまった結果、python3 処理系がデコードできずにエラーになっているのでした。

この例は DLL が読めなかったケースなのですが、実際には

```
ImportError: DLL load failed: 指定されたモジュールが見つかりません。
```

という文字列です。「指」の字は SJIS では 0x8e77 なので、上のエラーでは 0x8e が utf-8 でデコードできないよ、と言ってるのですね。

USD レベルが上達してくるとこの1バイトの情報でどんなエラーかおおよそ想像できるようになってくる場合がありますが、さすがにみんなにそれを強いるのはしんどいので、対策を考えたいと思います。

このメッセージを処理している部分は base/arch/errno.cpp です。
https://github.com/PixarAnimationStudios/USD/blob/release/pxr/base/arch/errno.cpp#L73

```c++
size_t len = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
                           FORMAT_MESSAGE_FROM_SYSTEM |
                           FORMAT_MESSAGE_IGNORE_INSERTS,
                           nullptr,
                           errorCode,
                           MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                           (LPSTR)&buffer,
                           0,
                           nullptr);
```
この MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT) が、ユーザ環境指定の言語のメッセージを作って buffer にポインタを返してくれます。したがって windows を英語環境に切り替えればもちろん英語メッセージになって解決するのですが、日本語環境で仕事している私たちにとってはあまりうれしい解決ではありません。

この言語指定は WinAPI の setThreadUILanguage でスレッド単位に行えるようです。python の locale モジュールでできるのかな、と思って試したのですがうまくいきませんでした。どなたか正しい方法ご存じでしたら教えて下さい。とりあえず僕らは winapi をたたきます。

```python
import ctypes
ctypes.windll.kernel32.SetThreadUILanguage(1033)  #1033 は en-US の言語 ID
```

これを各スクリプトの先頭で実行すればいいんですが、USD グルたる我々としては、OpenUSD にパッチ当てちゃうのが美しい解決でしょう。オープンソース万歳。

上記のファイルの MAKELANGID 部分を
```  MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), ```
と書き換えて OpenUSD（正確には lib_arch.dll） をビルドします。

これでめでたく、winapi を呼び出さずとも、上記エラーも
```
Error in 'pxrInternal_v0_22__pxrReserved__::PlugPlugin::_Load' at line 258 in file pxr\base\plug\plugin.cpp
: Failed to load plugin : The specified module could not be found.
```
となって、Windows の出すエラーメッセージも、その前の OpenUSD の出す情報も無事見ることができるようになりました。


めでたしめでたし。
というか windows はいつ SJIS から解放されるのでしょうか。
Orgnization の Account に対して SSO する

# 結論
Orgnization に所属する Account に対して、AWS CLI で SSO する場合は、`SSO start URL` を Identity Center directory の `AWS access portal URL` に変更しよう。

IdP が異なるなら、`SSO start URL` もまた異なる。

## なにがあったのか
Orgnization に所属する Account に対して、AWS CLI で SSO を試みた。手順は以下のとおりである。
https://docs.aws.amazon.com/cli/latest/userguide/sso-configure-profile-token.html

失敗した。画面に以下のエラーメッセージが表示された。はじめはパスワードを間違えたのかと思ったが、AWS CLI 経由ではなく画面からはログインできていたのでそういうわけでもなさそう。
```
Something doesn't compute We couldn't verify your sign-in credentials. Please try again.
``` 

## どうすればいいか
`SSO start URL` を Identity Center directory の `AWS access portal URL` に書き換えると成功した。
そういえば 画面からログインする場合は `AWS access portal URL` を使用していることに気づいた。

失敗する:
```console
$ aws configure sso
SSO start URL [None]: https://my-sso-portal.awsapps.com/start
```

成功する:
```console
$ aws configure sso
SSO start URL [None]: [`AWS access portal URL`]
```
Javascriptで掲示板の投稿をローカルストレージに保存


ブラウザをロードしても投稿したメッセージが残るようにするには、投稿されたメッセージをブラウザのローカルストレージに保存する必要があります。以下は、JavaScriptを使用して掲示板を作成し、投稿されたメッセージをブラウザのローカルストレージに保存するサンプルコードです。
HTMLファイルのコード：
~~~
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>掲示板</title>
</head>
<body>
    <h1>掲示板</h1>
    <form>
        <label for="name">名前：</label>
        <input type="text" id="name">
        <br>
        <label for="message">メッセージ：</label>
        <textarea id="message"></textarea>
        <br>
        <button type="button" onclick="addMessage()">投稿</button>
    </form>
    <ul id="messageList"></ul>
    <script src="script.js"></script>
</body>
</html>
~~~


~~~

let messageList = document.getElementById("messageList");
let messages = JSON.parse(localStorage.getItem("messages")) || [];

function addMessage() {
    let nameInput = document.getElementById("name");
    let messageInput = document.getElementById("message");
    let name = nameInput.value;
    let message = messageInput.value;
    let newMessage = document.createElement("li");
    let messageText = document.createTextNode(name + ": " + message);
    newMessage.appendChild(messageText);
    messageList.appendChild(newMessage);
    messages.push({name: name, message: message});
    localStorage.setItem("messages", JSON.stringify(messages));
    nameInput.value = "";
    messageInput.value = "";
}

for (let i = 0; i < messages.length; i++) {
    let newMessage = document.createElement("li");
    let messageText = document.createTextNode(messages[i].name + ": " + messages[i].message);
    newMessage.appendChild(messageText);
    messageList.appendChild(newMessage);
}
~~~

上記のコードでは、messagesという名前の配列変数を定義し、ローカルストレージからこの配列を取得します。JSON.parse()関数を使用して、ローカルストレージから取得したデータをJavaScriptオブジェクトに変換します。もしローカルストレージに保存されたデータがない場合は、空の配列を使用します。

addMessage()関数では、投稿されたメッセージを配列に追加し、localStorage.setItem()関数を使用して、ローカルストレージに配列を保存します。また、配列に追加したメッセージを一覧に表示します。

最後に、forループを使用して、ローカルストレージに保存されたメッセージを一覧に表示します。
初めてのデプロイ

# 初めてのウェブアプリ公開

今日初めてウェブアプリをrender.comで公開しました。デプロイするのが想像していたよりかなり難しく、中身がよくわからないまま写経してしまいましたが、1歩踏み出せたと思っています。加えて今回初めてQiitaで投稿してみることにしました。このような小さな達成を大事にしたいです。
アウトプットは大切ですが、大体自分の思っているより周りがやっていることが多く、キャッチアップを上手くならないといけないと思っています。

とにかく、作ったものを置いておきます。
[Calcross](https://calcross.onrender.com/)
（デザインが不十分なのと、データがたまりすぎたら表示が壊れそうなのが心配です。というか、この記事誰が見つけて読んでくれるんでしょうね？）
WSLでPyTorch使う時にGPU使う方法（DirectML）

WSLでPyTorch使う時にGPU使う方法ないか？と調べていたら、nVIDIA系はちらほら情報見かけるけどAMD系がなかなかない（当方AMD環境）。で、たどり着いたのがMicrosoftが作っている[DirectML](https://github.com/microsoft/DirectML)というもので、環境構築も楽でした。以下、導入方法と使い方。

### インストール
2023年3月時点でPyTorchの1.13にしか対応していらしい。
```console
$ pip install torch==1.13 torchvision torch-directml
```
TensorFlowの場合は、torch-directmlのかわりにtensorflow-directmlを入れればいいだけのようです。


### 使い方
torch_directmlをインポートしてデバイス指定するだけ。
```python
import torch
import torch_directml

if torch.cuda.is_available():
    device = torch.device('cuda')
elif torch_directml.is_available():
    device = torch_directml.device()
else:
    device = torch.device('cpu')
```
あとはcuda使う時と同様、 .to(device) を必要なとこにつけてあげましょう。

普通のGPUと、CPU内蔵のGPUも認識してくれるようです。
```python
for n in range(torch_directml.device_count()):
    print(torch_directml.device_name(n))
```
```console
AMD Radeon RX 6600M
AMD Radeon(TM) Graphics
```

#

ちなみに、CUDAを使って直接GPU使うよりDirectMLの方が性能は落ちるそう。海外の検証動画（youtube: [Tensorflow CUDA vs DirectML on 3090,Titan RTX and Radeon 6800](https://www.youtube.com/watch?v=046ae2OoINc)）によるとDirectMLでトレーニングした場合3倍くらい時間がかかるようです。

というわけで、

* 素のOS環境は汚したくないWSL上で検証したい。
* GPU余らせておくのはもったいない。

という方はお試しあれ。
WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!が出た時の対処法

サーバーが変わってしまいアラートが表示され、pushできなくなってしまった。
gitのサーバー自体は見つかっている。

↓原文

```
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@       WARNING: POSSIBLE DNS SPOOFING DETECTED!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Please contact your system administrator.
Add correct host key in /Users/USER_NAME/.ssh/known_hosts to get rid of this message.
Offending RSA key in /Users/USER_NAME/.ssh/known_hosts:6
Host key for github.com has changed and you have requested strict checking.
Host key verification failed.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```

# 対策1

known_hostsからgithubの記述を消す
```
ssh-keygen -R github.com
```

## 結果
```#makdown
"github.com"のフィンガープリントは
"SHAXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"です
接続を続行しますか？
はい
no
```
→はい　を選択
```
"or"のフィンガープリントは""です
接続を続行しますか？
はい
no
```
を繰り返し一生接続されない

→ noを選択

```
Host key verification failed.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```

 接続先のフィンガープリントが変わったため、合わないと怒っているくさい。

### それ道

./ssh/configの Host githubの場所に
```
StrictHostKeyChecking no
```
を追加したら一時的に接続はできるようになった。
ホストのkeyをチェックしなくなったので、セキュリティー的には激弱になってしまうので、
良い解決策ではない。

# 対策2

対策1でconfigからgithubの記述を消す。

https://docs.github.com/ja/authentication/keeping-your-account-and-data-secure/githubs-ssh-key-fingerprints

こちらを元にフィンガープリントの登録をおこなう。

```.ssh/known_hosts
github.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOMqqnkVzrm0SdG6UOoqKLsabgH5C9okWi0dh2l9GKJl
github.com ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEmKSENjQEezOmxkZMy7opKgwFB9nkt5YRrYMjNuG5N87uRgg6CLrbo5wAdT/y6v0mKV0U2w0WZ2YB/++Tpockg=
github.com ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==
```

これでいけました！
【Deployer】Laravelプロジェクトのデプロイ実行中に生じたエラー「Permission denied (publickey).」への対応

# **はじめに**

先日、Deployerでのデプロイ実行中にエラー「Permission denied (publickey).」が発生しましたが、無事に解決することができました。この記事では、この問題とその対処法を紹介します。

※対象となるデプロイ方法
Deployerがインストールされているサーバー上（弊社では踏み台サーバー）にて、デプロイ先のリモートサーバーに対してDeployerのデプロイコマンド(dep deploy)を実行するやり方。

# バージョン情報

踏み台サーバー：　OpenSSH_6.6.1、Deployer_6.4.6
リモートサーバー：　OpenSSH_7.4
Laravelプロジェクト：　PHP_7.3、Laravel_8.8

# **エラー内容**

リモートサーバーへのデプロイの際に、以下のエラーが出ていました。
エラーの内容的には、デプロイ先のリモートサーバーへのSSH接続でパーミッションが拒否されているというような内容です。

```plaintext
In Client.php line 103:
                                                                                
  [Deployer\Exception\RuntimeException (-1)]                                    
  The command "rm -f /var/www/html/.dep/deploy.lock" failed.                    
                                                                                
  Exit Code: -1 (Unknown error)                                                 
                                                                                
  Host Name: [弊社リモートサーバーのPrivate IP]                                                        
                                                                                
  ================                                                              
  Warning: Permanently added '[弊社リモートサーバーのPrivate IP]' (ECDSA) to the list of known hosts.  
  Permission denied (publickey).
```

# ****対処法****

Deployerの設定ファイルである`deploy.php`に記述されていた以下のコードを編集しました。

```php: deploy.php
host($ip)
  ->user('appdeploy')
  ->port(22)
  // ->identityFile('~/.ssh/id_rsa') →ココを削除
  ->stage('develop')
  ->set('deploy_path', $deploy_path)
  ->addSshOption('UserKnownHostsFile', '/dev/null')
  ->addSshOption('StrictHostKeyChecking', 'no');
```

上記のコードではデプロイ時に必要なSSH接続を設定していますが、結果的には`->identityFile('~/.ssh/id_rsa')`というコードを削除することでエラーは解消されました。

# おわりに:　なぜエラーが起きたのか

sshコマンドは認証キーのパスを指定(`-i`)しない場合は、自動的に利用可能な認証キーを検索して有効な認証キーを利用することでSSH接続を実行します。つまり、今回のエラーの原因は認証キーのパスを指定していたことによってうまくSSH接続ができていなかったことになります。

ただし、なぜ認証キーのパスを指定するとSSH接続ができなくなるのかは今のところ不明です。しかし、弊社ではAWS OpsWorksを利用しているので、その関係でOpenSSHのバージョンが変わったりなど、そのほか環境の変化により今回の問題が発生したのではないかと社内では結論づけています。

# 最後に

私たちの会社、ナイトレイでは一緒に自社開発のWebサービスを盛り上げてくれるエンジニアメンバーを募集しています！ 
基本的には直接ユーザーと接することのないポジションですが、セールス部門から
「顧客の声」を教えてもらったり、希望すればユーザーとのMTGに参加することも可能です。
モチベーションの高め方はあなた次第。

このような方は是非Wantedlyからお気軽にご連絡ください（もしくはこちらまで recruit@nightley.jp ）

 ✔︎ 自社Webサービスの開発で事業の発展に携わってみたい
 ✔︎ 自分が開発したサービスで地域活性化に貢献したい
 ✔︎ 位置情報ビッグデータに興味があり、新しい活用方法を提案したい
 ✔︎ 地理や地図が好きで仕事中も眺めていたい 

一つでも当てはまる方は是非こちらの記事をご覧ください 
「受託開発一切なし！自社WEBサービスを社長やセールスチームと一緒に開発！」

 https://www.wantedly.com/projects/467606 

▼ナイトレイとは？

https://www.wantedly.com/companies/nightley
javascript - pdfmakeで改ページする

#  コード例

 ```js
pdfMake.createPdf(
    {
      content: [
      {
        // ...
      },
      {
        // ...
        pageBreak: 'before',
      },
      {
        // ...
        pageBreak: 'before',
      },
      ]
    }
  )

```


# チャットメンバー募集


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

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


# Twitter

https://twitter.com/YumaInaura
wi-san 評価ボード 開発環境セットアップ手順 1 / 3



# はじめに
このドキュメントはwi-sanを初めて使うに当たり、検証ボードのセットアップを行った時の備忘録として残します。
----

# 用意した物
1. PC(Windows10)
1. Raspberry Pi4 または　Raspberry Pi3
1. M5Stack BASIC　　（今は使いません）
1. M5Stick 　　　　　（今は使いません）
1. Wi-SUN USBドングル　BP35C2-J11-T01
 以下のwebから購入
  https://www.chip1stop.com/sp/products/rohm_wi-sun-module
1. LAN環境　
    YAMAHA RTX1200
1. WiFi環境
    1F Bufferlo Wifiルーター （AUTOモード）
    2F Bufferlo Wifiルーター（ブリッジモード）



----
# ネットワーク情報
#### LAN 
   **YAMAHA RTX1200** 

````
設定内容を抜粋
ip lan1 address 192.168.6.1/24
pppoe use lan2
dhcp scope 1 192.168.6.20-192.168.6.100/24
dns server 202.238.95.24 202.238.95.26 
````

**WiFiルーター(1Fリビング）**              192.168.6.201(固定IP設定＝手動）
**lan-server3(File・PrintServer)**         192.168.6.3 (固定IP設定＝手動）
**lan-server5(SVNサーバー）**　　　        192.168.6.5(固定IP設定＝手動）                   
**WiFi(2F自室)**                           BRIDGEモードIPの割り当てなし？）

#### WAN

WANはドコモ光
 WAN(so-net)<---docomo光1Gbps<----(lan2)              





----
# Raspberr Piの準備

Raspberr Piは、IoT機器でBP35C2-J11-T01をドライブする時に使用します。

## RaspberryにOSをインストールする
![Qiita](https://compactsoft.co.jp/qiita/wi-san/20230322Qiita_0001RaspberrySetup01.png
)

Raspberry Pi ImagerでOSイメージをSDカードに書き込みます。
私の環境では、RaspberryPi OS(64bit)をインストールしました。
RaspberryPi3とRaspberryPi4とも同じ状態にしました。



## RaspberryPiのIPアドレスを設定する。

[ ] TODO スクリーンショットを張る予定

| 機材           | IPアドレス（有線) | IPアドレス（wifi)         | アカウント      |
|:-:            |:-:               |:-:                         |:-:             |
|RaspberryPi4   |192.168.6.10/24   |192.168.6.11/24             | makishima      |
|RaspberryPi3   |192.168.6.12/24   |192.168.6.13/24             | makishima-pi3  |


RaspberryPiは固定IPを設定してあります。（DHCPのスコープ外）
次のVNCで接続する歳、アクセスの利便性を考えて固定にしました。

## VNC Server をインストールする

下記のページを参考にVNCを設定します。
https://www.indoorcorgielec.com/resources/raspberry-pi/raspberry-pi-vnc/


## Windowsに　VNC viewer をインストールする。
WindowsにVNC Viewerをインストールし、RaspberryPiのIPを指定すると以下の様な画面になります。

![Qiita](https://compactsoft.co.jp/qiita/wi-san/20230323Qiita_0001RaspberrySetup02.png
)




IPを入力して、VNCを設定するとWindowsからアクセスできます。


### ディスプレイなしで起動できるようにする
「設定」「Raspberry Piの設定」「ディスプレイ」を選択し解像度を[1920x1080]に設定します。

![Qiita](https://compactsoft.co.jp/qiita/wi-san/20230323Qiita_0001RaspberrySetup03_1.png
)


![Qiita](https://compactsoft.co.jp/qiita/wi-san/20230323Qiita_0001RaspberrySetup02_3.png
)

#### 「設定」「Raspberry Piの設定」「システム」を選択し自動ログインを[ON]に設定します。

![Qiita](https://compactsoft.co.jp/qiita/wi-san/20230324Qiita_0001RaspberrySetup07.png
)



### VNC用にスクリーンショットの調整をする。
WindowsのVNC ViewerでPrtScnを押すと以下のようにRaspberryPi側にスクリーンショットが保存されてしまいます。

![Qiita](https://compactsoft.co.jp/qiita/wi-san/20230323Qiita_0001RaspberrySetup04.png
)

使い勝手が悪いのでWindows上でスクリーンショットをとれるように設定を変更します。
VNC Viewerの設定を開き「Pass special keys directly to VNC Server」のチェックボックスを外します。

![Qiita](https://compactsoft.co.jp/qiita/wi-san/20230323Qiita_0001RaspberrySetup06.png
)



以上でRaspberriPi側の基本設定は完了です。
次回は、RaspberriPiでの開発環境の説明をしていきます。
VoltMX Iris プレビューアプリにデフォルト表示されるヘッダーフッターを非表示にする方法

# 目次
1. はじめに
1. 対処法


# はじめに

Irisで作成したアプリをプレビューできるVoltMX Previewアプリがありますが、
iOSのアプリをLive Previewすると、デフォルトでヘッダーとフッターが表示されます。
![IMG_0010-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/dfd4af37-5209-79ad-d937-35bee632ff86.png)

このヘッダーとフッターは指で移動させることができますが、
アプリのボタンを押したい時などその都度動かさなければならず、消したい場合があるかと思います😢

今回は、プレビューアプリでデフォルト表示される
ヘッダーとフッターを非表示にする方法について紹介します！

# 対処法
↓の動画のように、フッター部分を
中央に向かってピンチインをすることで非表示にすることができます。
![ezgif-3-e3724a4801.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/ccac2e68-c009-15aa-dabc-39df6ca37b4a.gif)

ピンチインの際に他のボタンを押してしまったりするとうまく非表示にできないため、
少しコツは必要ですが、この方法で非表示にすることができます。

困っている方がいたら是非参考にしてみてくださいね！
【vue勉強】Vue CLIインストール後、XXXXX\npm\vue.ps1というエラーが出た

Vue.jsを独学しようと考えて、さっそくVue CLIをインストールしましょう！
`npm install -g @vue/cli`
`vue --version`で確認したところ、あれ、エラーが出た！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348039/b1555080-fbaa-d678-1e04-bec29abf9292.png)
いろいろ調べてきた結果、解決方法は以下とおり：
1. 管理者権限でWindows　PowerShellを実行する。
2. `set-ExecutionPolicy RemoteSigned`を入力する。
3. Yを入力する。

無事解決できました。
地理コードのまとめ geocode


+ [住所複合項目](https://developer.salesforce.com/docs/atlas.ja-jp.object_reference.meta/object_reference/compound_fields_address.htm)

|項目	|型	|説明|
|:--------------------------------|:----------------------|:----------------------|
|Latitude|	double	|Longitude と一緒に使用して、住所の正確な地理位置情報を指定します。たとえば、この項目は Contact では MailingLatitude と呼ばれます。|
|Longitude|	double|	Latitude と一緒に使用して、住所の正確な地理位置情報を指定します。たとえば、この項目は Contact では MailingLongitude と呼ばれます。|

メモ
標準住所の複合項目は参照のみであり、SOAP および REST API を使用してのみアクセスできます。これによる制約の詳細は、「複合項目の考慮事項と制限」を参照してください。

```
SELECT Name, BillingStreet, BillingCity, BillingState, BillingPostalCode,
       BillingCountry, BillingLatitude, BillingLongitude
FROM Account
```


更新できない？

+ [地理コード項目および精度](https://help.salesforce.com/s/articleView?id=sf.data_dot_com_clean_geocode_information_fields.htm&type=5)

# アカウント オブジェクトのジオコード フィールドがページ レイアウトに表示されない

+ [Account Object Geocode Fields Not Showing On Page Layout](https://salesforce.stackexchange.com/questions/303532/account-object-geocode-fields-not-showing-on-page-layout)

数式を使って表示するしかないみたい

# ユーザーの 1 人が間違ったジオコードを取得しており、確認済みの場所の設定アクションを使用して修正したいと考えています。しかし、マップでこのアクションを見つけることができません。検証済みの場所のサポートチェックボックスが有効になっていません。

+ [Set Verified Location](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000Pkf4a)

Steps:

1. Plot a Marker layer on the Map.
2. Click the incorrectly placed Marker. Select the Actions Tab.
3. Select Set Verified Location.
4. The marker should turn transparent. Grab it and manually move it to the correct location.
5. Once you move the marker, Salesforce Maps stores the latitude and longitude fields directly from the map to the Verified Latitude and Verified Longitude fields you created. When Salesforce Maps plots this record again, it will use the Verified Latitude and Verified Longitude fields to plot the marker where you specified.
 

Use Set Verified Location in Maps
https://help.salesforce.com/s/articleView?id=000381393&type=1

Customizing Controls Available to Users
https://help.salesforce.com/s/articleView?id=sf.salesforce_maps_setup_button_sets_manage.htm&type=5
Pandasで年月日や時間に関する計算するメソッド一覧をリストアップ


### Pandasで年月日や時間に関する計算を行うための一般的なメソッド一覧

- to_datetime(): 文字列や数値を日付/時刻型に変換します。
- date_range(): 指定した期間内の日付を生成します。
- timedelta(): 日付/時刻型のオブジェクトに時間差を加算または減算します。
- strftime(): 日付/時刻型のオブジェクトを指定したフォーマットの文字列に変換します。
- pd.Timestamp(): 日付/時刻を表すオブジェクトを生成します。
- pd.DateOffset(): 日付/時刻のオフセットを表すオブジェクトを生成します。
- pd.Timedelta(): 日付/時刻の時間差を表すオブジェクトを生成します。
- resample(): 時系列データの再サンプリングを行います。
- shift(): データを指定した数の期間だけシフトします。
- rolling(): 移動平均を計算するために、ウィンドウ内の値をローリングすることができます。

### Pythonで年月日や時間に関する計算を行うための一般的なメソッド一覧

#### datetime: 日付/時刻を操作するためのモジュール
- datetime.datetime(): 日付/時刻を表すオブジェクトを生成します。
- datetime.date(): 日付を表すオブジェクトを生成します。
- datetime.time(): 時刻を表すオブジェクトを生成します。
- datetime.timedelta(): 日付/時刻の時間差を表すオブジェクトを生成します。
- datetime.now(): 現在の日付/時刻を取得します。
- time: 時刻を操作するためのモジュールです。以下のメソッドを持ちます。
- time.time(): 現在の時刻を取得します。

#### calendar: カレンダーを操作するためのモジュール
- calendar.monthrange(): 指定した月の日数と最初の曜日を返します。

#### dateutil: 日付/時刻のパースや操作に便利なモジュール
- dateutil.parser.parse(): 文字列から日付/時刻をパースします。
- dateutil.relativedelta.relativedelta(): 日付/時刻のオフセットを表すオブジェクトを生成します。
他のメンバーがマージした時にgit pullをして作業中のブランチに反映させる方法

# 対象者
・Gitに不慣れな人
・共同開発中の人
・git pullを知っている人


# この記事の背景
とある共同開発をしていた時のことです。
自分がログイン機能とログアウト機能を実装していた時のことです。
ログイン機能を実装して名前とパスワードを入力し、ログインするぞーと
思ったら以下のエラーがでました。

![スクリーンショット 2023-03-23 22.36.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748789/b602ce1b-6e23-3a89-60dc-c09bcd1090fa.png)

原因はusersのtableが実装されていないことが原因でした。
users_tableは自分のタスクではなかったので、メンバーAが実装を終わるのを
待つことになりました。実装が終わり、メンバーAがマージをしました。
その時に新しく反映されたdevelopブランチから
作業中のブランチに反映することになり、git pullをすることになりました。

このように```他のメンバーがマージした時に自分にも反映させる```ことは
あるあるなので手順を書いておきます。


# 作業中のgit pullの手順
まずは***gitの状態を確認***します。
そして***作業ブランチfeatureにいることを確認***します。
```
laravelapp % git branch
*feature/~

laravelapp % git status 
````
次に以下の手順でコミットしていきます。
```
laravelapp % git add . 
laravelapp % git commit -m "コミット内容" 
```
developブランチに移動します。
```
laravelapp % git checkout develop  
```
そしてpullをします。
```
laravelapp % git pull origin develop
```
pullできたらgit statusで状態も確認しておきます。作業ブランチに移動します。

```
 laravelapp % git checkout feature/~
```
そしてgit mergeをします。
```
laravelapp % git merge develop
```

これで無事反映されてエラーも解決できてタスクが進みました。

# stashを使う場合もある
こんな表示が出る場合もあります。
```
省略
Please commit your changes or stash them before you merge.
Aborting
```
コミットするかマージする前にstashしろ!ってエラーが出てくる場合があります。
***この時は自分はプッシュをしていません***でした。
新しく自分の作業ブランチに反映させるには
```
git stash
```
を使います。


# 有益な記事

https://qiita.com/wann/items/688bc17460a457104d7d
【Java】List・Map のnull または空のチェック CollectionUtils.isEmpty

# List・Mapのnull または 空チェックには　CollectionUtils.isEmpty　が便利です。

(例)1
~~~java:Test1.java
package jp.co;

import java.util.List;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;

public class Test1 {
    public static void main(String[] args) {
        List<String> strList = new ArrayList<>();
        boolean trueOrFalse1 = CollectionUtils.isEmpty(strList); // trueOrFalse1 = true

        strList.add("1つ追加");
        boolean trueOrFalse2 = CollectionUtils.isEmpty(strList); // trueOrFalse2 = false

        strList = null;
        boolean trueOrFalse3 = CollectionUtils.isEmpty(strList); // trueOrFalse3 = true
    }
}
~~~