OmniAICreator/Qiita-1.07M huggingface dataset:
VisualStudioのテストエクスプローラの結果をhtml出力

# はじめに
Visual Studioのテストエクスプローラの結果をhtmlに変換するツールを作成したので共有します。

# ツールの概要


以下のような、テストエクスプローラの結果を
![テストエクスプローラ出力](https://user-images.githubusercontent.com/2186957/149645616-53d97b4e-c49d-4c95-b1dd-1812b916efff.PNG)

このような感じのhtmlに変換します。
![html出力結果](https://user-images.githubusercontent.com/2186957/149645647-425f78b5-b4f0-482f-9517-dee63b3a73ef.PNG)

ツールのリポジトリはこちらです。
https://github.com/HikosakaRyo/trxlog2html

# インストール
NuGet.orgからインストールできます。

.NETグローバルツールとしてインストールする場合

```
dotnet tool install --global trxlog2html --version 1.0.0
```

.NETローカルツールとしてインストールする場合

```
dotnet new tool-manifest
dotnet tool install --local trxlog2html --version 1.0.0
```

※)グローバルツールとローカルツールの違いについては以下を参照してください。
https://docs.microsoft.com/ja-jp/dotnet/core/tools/global-tools

# 使い方
以下の手順で使用します。

1. テストを実行してTRXログ(Visual Studio Test Result File)を出力します。
2. 1のTRXログを、当ツールを使ってhtmlに変換します。

各手順の詳細は以下の通りです。

## テストを実行してTRXログを出力する
通常のテストはVisualStudioのGUIから実行できるのですが、TRXログを出力するためには、テストをコマンドラインから実行する必要があります。
VisualStudioには、テストをコマンドラインから実行するためにVSTest.Console.exeというツールが同梱されています。
ツールはVisual Studioインストールディレクトリ配下にあるのですが、ディレクトリが深いため、パスを通すか以下のようなバッチを作成することをお勧めします。

```bat
@echo off
setlocal

REM VSTEST_DIRの部分を自分の環境に合わせてカスタマイズしてください
SET VSTEST_DIR=C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\Common7\IDE\CommonExtensions\Microsoft\TestWindow\

REM TEST_DLL_PATHに、テスト用DLLのパスを指定します
SET TEST_DLL_PATH=.\bin\Debug\.netcoreapp,version=v5.0\UnitTestSampleTests.dll

"%VSTEST_DIR%vstest.console.exe" %TEST_DLL_PATH% /logger:trx;LogFileName=utest_result.xml

endlocal
```

## TRXログをhtmlに変換する
コマンドプロンプトから以下を実行します。

```
dotnet run trxlog2html -i [TRXログファイルのパス] -o [出力するhtmlのパス]
```

# 出力するhtmlのカスタマイズ
当ツールではRazorテンプレートエンジンを利用して最終的なhtmlを生成しています。
利用するテンプレートを差し替えることで、出力されるhtmlをカスタマイズすることが可能です。
テンプレートを指定する場合は、以下のように-tオプションにテンプレートのパスを指定してください。

```
dotnet run trxlog2html -i [TRXログファイルのパス] -o [出力するhtmlのパス] -t [テンプレートのパス]

```

以下は、デフォルトで使用されるテンプレートです。
色々いじって試してみてください。
https://github.com/HikosakaRyo/trxlog2html/blob/main/built_in_templates/jstest_like.cshtml


# 類似ツール
このツールをNuGetに公開したときに、似たようなツールを見つけたため、ついでにご紹介します。

https://github.com/AlexMatsyuk/TrxToHtmlNetCore

私は試してみてはいないのですが、こちらはXSLTでTRXファイルをhtmlに変換しているっぽいですね。
RazorよりもXSLTのほうが使い慣れているという方は、こちらの利用を検討してもよいかもしれません。
miniforge / windows (うまくいっていない)


windows にベタに miniforge インストールする。

ダウンロードは、[miniforge の Releases](https://github.com/conda-forge/miniforge/releases) から一番シンプルなファイル名の ``Miniforge3-Windows-x86_64.exe`` をダウンロードしてインストール。


インストールが終わって、仮想環境を作ろうとして、

```
$HOME\miniforge3\Scripts\conda.exe create -n py39 
```

すると、proxy 関係ないはずなのに HTTP CONNECTION のエラーでつながらない。

というときは、

```
$HOME\miniforge3\condabin\conda.bat create -n py39 python=3.9
```

インストーラーを信じて、各自環境にインストールして、環境変数の PATH に miniforge3 のパスを設定**しない**ようにしたのに、正解の conda のパスを教えてくれないというイケズな公式。
たぶん、miniforge3 の下に PATH を通しまくったら動くとは思うけど、他の環境と混在しているときに動かんよとインストーラーで書かれているので、一番上の選択肢をチェックせずにインストールしたのに。

※ 2022/1/17現在、自分の環境では ``miniforge3\condabin\activate.bat ph39`` してもなんだかうまく動いていない。。。とりえあず WSL2 とか python3 のインストーラーで py.exe で使うからいいのだけど、Tk 動かさねばなのでネイティブ環境要るのですよ。
Lightningレコードページに「Chatterコンポーネント」が表示されない問題について

「Chatterコンポーネント」を表示する方法：
①設定>機能設定>Chatter>フィード追跡>該当するカスタムオブジェクト>フィード追加の有効化にする
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487243/68271cb1-aab4-6844-9c42-c164ce1baea8.png)

②Lightningレコードページに追加する
![２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487243/047026f5-43d2-4bc3-fb2f-fe5dba6877ed.png)

備考：
*フィード追跡の各言語表示↓*
#
| 言語                 | 表示内容            |
|:--------------------|:-------------------|
| 英語：                | Feed Tracking      |
| 日本語               | フィード追跡           |
| 中国語：              | 摘要跟踪             |
2行目以降もインデントされるようにリストを作成する

![スクリーンショット 2022-01-17 10.08.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552308/842f7f7f-afdc-f996-50a4-bbf1687a77e2.png)
数字や※でのリストを作成するときに、上記のように2行目以降は字下げをしてほしいな〜っていうことありますよね…

疑似要素を使用して作成するのがよくあると思いますが、text-indentを使用する方法がすごく簡単だったのでメモ。

```html:index.html
<ul class="text-wrap">
  <li>1.テキストテキストテキストテキストテキストテキストテキスト</li>
  <li>2.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz</li>
</ul>
```
```css:style.css
.text-wrap {
    width: 300px;
    border: 1px solid;
    padding: 12px;
}

.text-wrap > li {
    text-indent: -1em; /*ここで字下げ。今回は一文字分なので1em*/
    padding-left: 1em; /*text-indentでデザインが崩れるので修正*/
    word-break: break-all; /*枠内にテキストを収める*/
}
.text-wrap > li + li {
    margin-top: 24px;
}
```
「text-indent」で任意の文字分（余白文）後ろにずらす。
↓
デザインが崩れるので、paddingで調整
という考え方です。
[py2rb] 直列化

# はじめに
移植やってます。
( from python 3.7 to ruby 2.7 )
# 直列化 (Python)
```python
import pickle
self.assertEqual(dict_, pickle.loads(pickle.dumps(dict_)))
```
https://docs.python.org/ja/3.7/library/pickle.html

オブジェクトと、オブジェクトを直列化しさらに復元されたオブジェクトを比較していますが、Equal にならないこともあるのでしょうかねえ？
# 直列化 (Ruby)
```ruby
assert_equal dict_, Marshal.load(Marshal.dump(dict_))
```
https://www.shoeisha.co.jp/book/detail/9784798168845

独習Ruby 330p
> 7.2.7 オブジェクトのシリアライズ

ここでは、dumpをオーバーライドして特定のデータのみシリアライズする例が紹介されています。
# メモ
+ Python の 直列化 を学習した
+ 百里を行く者は九十里を半ばとす
読み方がわからない英単語を読み上げてくれる相棒(BOT)をみつけました

#はじめに

最近では、スマホでちょっとググるだけで、色んな情報を得ることが出来ます。知らない英単語なんか、検索するとすぐに出てきます。もう、冊子になった辞書を引くより断然早い。

ただ、検索結果の表示で「いつもの辞書」が最上段に出てこないので、いつもの辞書を選ばないと見たい部分を探さないといけません。これがちょっと面倒です。

そこで、最近覚えたLINE-BOTとWEB-APIを利用して作った、「英単語を送るだけで発音させることまで出来る辞書検索」を紹介したいと思います。

英語が苦手な私にとって、読み方を教えてくれる力強い相棒です。しかも、見返りを求めない。（全部無料で利用出来る）
なんていい奴なんだ！

#必要な環境

使用するのはLINE-DevelopersとHEROKUに用意したNode-RED。

Node-REDでLINE-Developersのノードを使うためには、「line-messaing-api」をインストールする必要があります。ハンバーガーメニューからパレットの管理を選び、タブ「ノードを追加」で「line-m」と検索すると一つだけ出てくるので、これをインストールすればOKです。

それと、予めスマホのLINEアカウントでLINE-Developersのアカウントをともだち登録しておきます。

※ここまでは既に多くの方が技術情報として公開されていますので、詳細は割愛します。

#構成

Node-REDでLINE-Messagingのノードが利用できる状態になったら、図のようにノードを配置して繋いでいきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496293/9d69da15-9157-e0af-0b9e-7ae7e07c4161.png)

使用するノードとその設定は、以下の通りです。

##１．webhook

Pathには、/webhook　と指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496293/9673bf20-7579-c104-5676-79ab052107b3.png)

##２．template

テンプレートにWEB-APIのURLを入力します。
※ハードコピーでは全体が収まりきらないので、枠内に入力すべきURLを記載しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496293/53a97101-9fae-da17-a945-6f380eb17f20.png)

##３．http request

メソッドをGET、出力形式をUTF8文字列にしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496293/d38ae510-c25a-7079-687f-78d1447f5cb4.png)

##４．change

ルールの1行目をmsg.payload、
2行目をmsg.payload.descriiption.bodyTextとします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496293/d8ae79b7-0849-c3d6-490a-c7045bf54400.png)

##５．Reply

Secretには、LINE DevelopersのBasicSettingタブにあるChannel secret、
AccessTokenには、同じくLINE DevelopersのMessagingAPIタブにあるChannelAccessTokenの文字列を登録します。

※探しづらい位置にあるので、ハードコピーを付けておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496293/feb797a3-7f63-49dd-7b98-bb3c6ac8e84b.png)

(Channel secret)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496293/52307ab1-1e62-e70d-b423-a8bf34a5c87f.png)
(ChannelAccessToken)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496293/bde95c2a-f2e0-9b07-7f63-8abf6610a036.png)

##６．debug

対象をmsg.payloadとし、スマホから受け取った文字列をデバッグウィンドウに表示します。

※動作チェック用です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496293/c408b559-fd9f-dc96-9a3a-1e3f2e82c1dd.png)


ここまで出来たら、デプロイをクリックします。
エラーがなければ、早速試してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496293/e9674d85-fc6d-8749-9503-c626b0b600eb.png)

#使い方

ともだち登録したbotに向けて、英単語を送る。たったこれだけ。
青く表示されている部分をタップすれば、発音してくれる優れものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496293/163d3a79-6f53-29c0-f7ae-0bb1123c0c0b.png)


#おわりに

Node-REDやWEB-APIといった最近の技術の存在は知りつつも、何となく億劫で手を出してこなかった私が、ちょっとしたきっかけでこの世界に飛び込みました。はじめて触ってみた印象は、ただただ「凄い」です。短時間で、身近なツールに組み込むことができるBOTを作成して、しかも誰もが無料で利用出来る。

これからもっと勉強して、使えるもの、面白いものを作って、出来上がったら照会しますね。
『エラトステネスの篩』の記述例（Python版）

[元記事](https://qiita.com/ytaki0801/items/40060bdad04edcd1bd3c)より分離しました．アルゴリズム等は元記事を御参照下さい．趣旨は元記事と同じく『「エラトステネスの篩」だとこれだけ速く素数が求まる！』ですが，ライブラリ等によってよりシンプルな記述表現がある場合など，他のプログラミング言語との比較を避けるため，個別記事としている次第です．特にPythonについては，現状で標準ライブラリと化しているNumPyを用いる場合とそうでない場合とで，記述表現や処理速度に大きな違いが出ています．

# 記述例および実行例（NumPy未使用その１）

```py:sieve.py
x = int(input())
a = [True] * (x+1)
a[1], r = False, []

for i in range(1, x+1):
    if a[i]:
      if i <= x**0.5:
        for j in range(i*i, x+1, i):
          a[j] = False
      r += [i]

print(len(r))
print(r[-1])
```

次の実行環境にて，百万までの素数の個数と最大の素数を表示しています．

* ASUS Zenfone 5: Qualcomm Snapdragon 636 1.8GHz, 6GBメモリ
* Android 9 + Termux + AnLinux(Debian GNU/Linux 10) + Python 3.7.3

```sh
$ time python3 sieve.py <<< 1000000
78498
999983

real    0m1.268s
user    0m0.970s
sys     0m0.050s
```

# 記述例および実行例（NumPy未使用その２）

```py:sieve2.py
x = int(input())
a = [True] * (x+1)
a[0] = a[1] = False

for i in range(1, int(x**0.5) + 1):
    if a[i]: a[i*i::i] = [False] * (x//i - i + 1)
r = [i for i, p in enumerate(a) if p]

print(len(r))
print(r[-1])
```

上記と同じ次の実行環境にて，**一千万**までの素数の個数と最大の素数を表示しています．

* ASUS Zenfone 5: Qualcomm Snapdragon 636 1.8GHz, 6GBメモリ
* Android 9 + Termux + AnLinux(Debian GNU/Linux 10) + Python 3.7.3

```sh
$ time python3 sieve2.py <<< 10000000
664579
9999991

real    0m2.657s
user    0m2.270s
sys     0m0.290s
```

# 記述例および実行例（NumPy使用）

```py:sieve.py
from numpy import ones, sqrt, arange

x = int(input())
a = ones(x+1, dtype=bool)
a[0:2] = False

for i in range(2, int(sqrt(x))+1):
    if a[i]: a[i*i::i] = False
r = arange(x+1)[a]

print(len(r))
print(r[-1])
```

上記と同じ次の実行環境にて，**一億**までの素数の個数と最大の素数を表示しています．

* ASUS Zenfone 5: Qualcomm Snapdragon 636 1.8GHz, 6GBメモリ
* Android 9 + Termux + AnLinux(Debian GNU/Linux 10) + Python 3.7.3

```sh
$ time python3 sieve-numpy.py <<< 100000000
5761455
99999989

real    0m6.163s
user    0m5.010s
sys     0m1.940s
```

# 備考

## 更新履歴
* 2022-01-17：NumPyなし記述例その２追加（コメントより）
* 2022-01-17：元記事より移行
BudouX を Go と Rust で使えるようにした

少し前に [BudouX](https://github.com/google/budoux) というライブラリが公開されました。

https://twitter.com/tushuhei/status/1461184410473033742

日本語の文章を与えると適切な改行位置を推測してくれるライブラリで、 Python と JavaScript に対応しています。

これを Go で使いたい！
と、思って移植しました。

https://github.com/sg0hsmt/budoux-go

ついでに Rust にも移植しました。

https://github.com/sg0hsmt/budoux-rs

この記事では移植したライブラリについて軽く紹介したいと思います。
(使い方とかは README を読んだほうが早いかもしれません)

## 本家 BudouX の中身

オリジナルの BudouX は次の要素で構成されています。

- 機械学習モデルを訓練するための Python スクリプト
- JSON 形式の学習済み機械学習モデル (約 10 KB)
- 機械学習モデルを使用した予測処理の Python 実装
- 機械学習モデルを使用した予測処理の TypeScript 実装 (Web component を含む)

BudouX の機械学習モデルは次の情報を feature として使用しています。

- 過去の予測結果
- 対象付近にある文字
- 対象付近にある文字の UNICODE ブロック
- 他の feature の組み合わせ

JSON 形式の学習済み機械学習モデルには feature をキー、スコアを値にした連想配列が格納されており、予測処理では入力を feature に変換してスコアの合計を算出、閾値を超えたところを区切りとみなしています。

予測処理は外部ライブラリに依存していません。
つまり BudouX と同じように feature に変換してスコアの合計を算出できれば他言語でも動くことになります。

## Go への移植 (BudouX-Go)

https://github.com/sg0hsmt/budoux-go

- [デモページ](https://sg0hsmt.github.io/budoux-go/)
- [Go Playground](https://go.dev/play/p/PWcZH3eULL6)

本家由来の機械学習モデルを同梱しており次のようなコードですぐに利用可能です。
(本家は HTML の入出力をサポートしていますが BudouX-Go はプレーンテキストのみをサポートしています)

```go
model := models.DefaultJapaneseModel()
words := budoux.Parse(model, "これはテストです。")

fmt.Printf("%q", words)
// Output:
// ["これは" "テストです。"]
```

Go への移植版である BudouX-Go は本家 BudouX から次の JSON ファイルを取得して UNICODE のブロック情報と学習済みモデルの Go コードを生成しています。

- [`budoux/unicode_blocks.json`](https://github.com/google/budoux/blob/main/budoux/unicode_blocks.json)
- [`budoux/models/ja-knbc.json`](https://github.com/google/budoux/blob/main/budoux/models/ja-knbc.json)

取得とコード生成処理は `gen/generate.go` に実装されています。
(エラー処理の問題があり Go 1.13 未満では動かないようにしています)

本体は Go 1.11 の標準パッケージのみで動くようになっており GAE/Go 1.11 に魂を縛られている同志 [^1] も安心してご利用いただけます。

[^1]: https://cloud.google.com/appengine/docs/standard/go/go-differences

デモページは [go-app](https://github.com/maxence-charriere/go-app) を使用した wasm で動いています。
(go-app は Go 1.17 以降が必要なため `go.mod` を用意して別モジュールに分離しています）

## Rust への移植 (BudouX-rs)

https://github.com/sg0hsmt/budoux-rs

- [デモページ](https://sg0hsmt.github.io/budoux-rs/)

本家由来の機械学習モデルを同梱しており次のようなコードですぐに利用可能です。
(本家は HTML の入出力をサポートしていますが BudouX-rs はプレーンテキストのみをサポートしています)

```rust
let model = budoux::models::default_japanese_model();
let words = budoux::parse(model, "これはテストです。");

assert_eq!(words, vec!["これは", "テストです。"])
```

Rust への移植である BudouX-rs は BudouX-Go をベースに開発しました。
実は Rust を書くのが初めてなので変なところがあるかもしれません。

BudouX-Go と同様に本家 BudouX から JSON ファイルを取得して UNICODE のブロック情報と学習済みモデルの Rust コードを生成しています。
取得とコード生成処理は Go (`gen/generate.go`) で実装されており、生成されたコードは `rustfmt` で整形しています。

本体はできる限り依存をなくしたかったのですが機械学習モデルをスタティックな領域に保持するため [once_cell](https://github.com/matklad/once_cell) を使用しています。

デモページは [Yew](https://github.com/yewstack/yew) を使用した wasm で動いています。
(`Cargo.toml` のワークスペース機能で別クレートに分離しています)

## 他言語への移植

Swift に移植した方がいるようです。

https://zenn.dev/griffin_stewie/articles/2112211657_introducing_budoux_swift

## その他

本家は HTML の入出力をサポートしていますが移植版は次の理由でプレーンテキストしかサポートしていません。

- 依存関係を最小にしたかった
- HTML の処理は外部 (フレームワーク) に任せた方がよいと思った

また、同梱している本家由来のモデルは日本語で学習されているため英語をうまく処理できないようです。(元の用途的に空白で区切られている英語をさらに分割する必要がないからかもしれません)
用途によってはカスタムモデルを用意するか後処理を追加したほうがいいかもしれません。
３か月でTOEIC420→720になるためにやったこと

#  TOEICは短期集中で
こんにちは。メーカーの開発に携わり３年目
といいつつも、研修ばかりで業務をあまりできていない人です
大企業はお金があるなぁと思いつつ、正気か？と思うことも多々あり
同期は転職を考え始める人も出てきました

ということで、
転職にも有利なTOEIC、とるだけとっとこ！という気持ちでやったことを
備忘録として残しておきます


#文法書は１冊でいい

文法書はTOEICの本番形式を模したものが３回分くらい入っていればなんでもいいと思います
文法って10年くらいたっても変わっていないので
ブックオフで300円くらいのを買いました

TOEICの傾向は変わっていると言っても基本ができれば700点はかたい
費用対効果を大きくするため安いのかってやりこみましょう


#リスニングはVtuver(EN)
リスニング、それは英語の速さに慣れることが最大の近道だと思ってます
慣れないうちはリエゾンが全く聞き取れず
？？？
となっていましたが

１か月聞いているうちにだんだん耳が速さになれていきます

なんでVが良いかというと、
・自分の好きな分野の話をしてほしい
・30分ー2時間と時間に幅を持たせてほしい（作業用BGMに長いのが欲しい）
・途中聞いていなくても問題なくあってほしい（ドラマと映画はここで×）
・声が聞きやすい

・キャラが良いからやる気出る


一番最後が一番モチベに繋がるので大切です
かわいい子や綺麗な子、かっこいい子選び放題で嬉しいですね



#集中するには犬
ついついスマホを見たり、席を立ったり...あんまり集中できないことがあると思います

そこに、犬です

犬はずっと寝てるので、膝にのって寝たら２時間は動けません
この間スマホを少し遠くに、参考所と飲み物は手元に置いておけば
集中必死な環境の出来上がり！



#今年の目標
私は去年720点でした
あと10点の730点でBランク評価となります

今の業務に英語は必要ありませんが
自分の価値を上げるため今年はＢランクに入りたい！
エッジAI端末を使ってみた 〜Node-RED編〜

## 概要
* データの発生源に近い場所でデータを処理する「エッジAIコンピューティング」が注目されている
* まず、エッジAIのおおまかな概念を理解し、実際にエッジAI端末を購入して使ってみる
* 前回までで、YOLOというアルゴリズムを利用して物体検知のデモの動作を確認した
* Node-REDを使って検出結果のペイロードを拾ってみる

## エッジAIとは何か
* 通常AI利用する場合は、センサーから収集された各種データはマイコンボードやスマホ、ネットワークを経由し  
、クラウド上や従来型のサーバーで解析処理を行う
* エッジAIを利用すると、センサーから収集された各種データはマイコンボードやスマホ内で解析される

![スクリーンショット 2021-11-05 9.57.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701445/c860f214-fb02-3180-c4a4-554e91e7371a.png)

![スクリーンショット 2022-01-16 17.45.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701445/49fcdad4-6147-7de6-cff4-f17759579b13.png)



## 用意するもの
* Jetson Nano開発者キット 2GB
* RaspberryPi4 対応 電源セット(5V 3.0A)　←Jetson Nanoにも使えます
* USBカメラ
* microSDカード(32GB以上推奨)
* USB接続のマウス・キーボード
* HDMI接続のディスプレイ(4K推奨)

## インストール  
tiny_yolov2というライブラリで物体検出できるようにしておく
https://github.com/tsutof/tiny_yolov2_onnx_cam
【過去記事】
https://qiita.com/cami_oshimo/items/55406a7c5e532d53cc9a

## MQTTブローカーのmosquittoをインストールする　　

```
# sudo apt install mosquitto
```

mosquittoの動作状況を確認する

```
# systemctl status mosquitto 
```

![IMG_0607.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701445/8a25f735-82c8-cd03-01a0-54573c99e4bc.jpeg)


## Node-REDをインストールする
Jetson Nano 2GBの場合は、メニューからPreferences→Softwareをクリックする
検索窓にNode-REDと入力し、インストールする  
（表示されない場合はOSのアップデートを行ってみる）

Jetson NanoのIPアドレスを確認しておく

```
# ip a
```

## Node-REDを起動する
メニュー→Run→node-red.desktop.launch  
mqtt in/outノードの設定は以下の通り（伏せている部分はJetson NanoのIPアドレス ポート1883は自動でセットされる）

![IMG_0610.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701445/5e827baa-9c50-590c-761f-f09d207659fc.jpeg)
![IMG_0611.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701445/4763bca4-d980-bcfd-c802-6a3081ee7b51.jpeg)
![IMG_0612.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701445/9b82bfaa-a2fb-8f4d-de7b-759c203ca6b5.jpeg)

## Tiny YOLOV2からMQTTでデータを送る  

```
# cd tiny_yolov2_onnx_cam
# python3 tiny_yolov2_onnx_cam_mqtt.py --host (Jetson NanoのIPアドレス) --topic test --port 1883
```

Node-REDのデバッグ表示部分に検知されたデータ（この場合はTV Monitor）が確認できる

![名称未設定-1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701445/c0eafc31-516e-34f9-2238-59b5a9ebe784.gif)

![IMG_0610.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701445/32d77cca-ca5e-9bef-ac89-b329e9c84e9a.jpeg)


## 次回に向けて
* 他の物体でも検出結果を確認し、デバッグログと照合して精度を確かめてみたい
* MQTTで他の機器が制御できないか考えてみる
nextjsでクエリパラメータを取得する

# 実装方法
next/routerで用意されているuseRouterを使うことで簡単に実装できます。

# 失敗例

/pages/Page.tsx

``` 
  import { useRouter } from "next/router";
  export default function Page() {
      const router = useRouter();
      console.log("query:", router.query);

      return <div>Hello</div>
  }
```
として
http://0.0.0.0:3000/page?query=testquery
にアクセスすると、
`query: {}`
とコンソールに表示されてしまいます。

# 対策
router.isReadyを使ってrouter.queryの読み込みを制御します

``` 
  import { useEffect } from "react";
  import { useRouter } from "next/router";
  export default function Page() {
      const router = useRouter();

      useEffect(() => {
          if (router.isReady) console.log("query:", router.query);
      }, [router.isReady]);

      return <div>Hello</div>
  }
```
以上のようにすることで
`query: {query: "testquery"}`
と期待通り取得できます。
各SNSサービスのアイコン用ブランドガイドラインについて

## はじめに
これ違反してるサイト多くない？って思ったのがはじまり

## 簡単な概要

- 基本的に勝手にいじっちゃだめ（色を変更したりもだめ）
- 公式が配布している素材を使うのが楽でよい

## 知ってる限りの規約

### Youtube
https://www.youtube.com/howyoutubeworks/resources/brand-resources/#logos-icons-and-colors

長いので大事そうなとろこだけ。

> The YouTube Logo Icon should never be altered in any way.
訳：アイコンは変更しないでください。

> Important: The only time a Logo or Icon can be made a link is when the destination URL is a YouTube channel.
訳：【重要】ロゴまたはアイコンをリンクできるのはリンク先URLがYouTubeチャンネルの場合のみです。

### Twitter
https://about.twitter.com/en/who-we-are/brand-toolkit

長いので大事そうなところだけ。

> ・Keep the logo in blue or white only.
You may, however, change the
background of the icon to match
your creative.
訳：色は青か白のみ。ただし、白は透過されてるので背景色によって色を変えるのはあり。

> • The minimum width of the Logo
Social Icon is 32px.
訳：アイコンの最小サイズは32px

> • Whenever possible, take our logo
out of its container.
> • If a container is needed, feel free
to use either a circle, square, or a
square with rounded corners. 
訳：枠なしで使用できます。枠をつける場合は丸か四角が角が丸い四角を使ってください。

## 終わりに

「ここ間違ってるよ」とか、他に何か知っている方がいらっしゃればコメントか編集リクエストを貼っていただけると助かります。
選択リストを動的に設定することに関するまとめ

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめN～Z](https://qiita.com/Keiji_otsubo/items/92f92bb9f668ca9688be)


普通に考えると選択リストの値はMETA DATAの範疇。よって通常の処理ではできない。

しかし、フローで追加しているようです。


+ [選択リストの値を動的に追加するにはどうすればよいですか？](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000EA1PZ)

フローを使って選択リストの値は追加できるけど有効化はできないようです。そこだけApexが必要みたいです。
+ [フローで取引先名を選択リスト項目に転記したい](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000E03gySAB)
[OutSystems]Entityの更新を1箇所に限定するパターン

OutSystemsで作るEntityはテーブル定義とプリミティブなCRUD操作をパッケージしたもの。
このEntityの更新処理を1箇所（特定のeSpace）に閉じ込めることで、権限チェック／バリデーション／ログ出力／計算／共通列の設定が確実に行われるようにする設計パターンが、Core Entity Pattern。

このパターンに従っていないと、Architecture Dashboardの指摘事項に挙がってしまう。
詳細は[コード解析パターン](https://success.outsystems.com/ja-jp/Documentation/11/Managing_the_Applications_Lifecycle/Manage_technical_debt/Code_Patterns)の「パブリックエンティティが読み取り専用でない」を参照。

# 確認環境
Personal Environment(Version 11.14.0 (Build 33133))
Service Studio (Version 11.14.3)

# 概要
以下の、CoreモジュールがCore Entity Patternの実装。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/519afb51-e7c2-8c04-1316-4e0b67abb431.png)

- CoreモジュールにEntityを定義する
- Entityは参照のみ公開設定
- Entityを更新するためのActionを公開設定で作成する
- Consumerは、検索はEntityに対するAggregateで、更新は公開されたActionで行う

# 設定方法
## Entity
「Entityは参照のみ公開設定」の実現方法：

- EntityのPublicプロパティ=Yes　→　他のモジュールから参照可能になる
- EntityのExpose Read Onlyプロパティ=Yes　→　他のモジュールからは、Entityに対する更新処理（SQL要素による更新や更新用Entity Action）を使えなくなる

この設定をしたEntityを参照すると、以下のような見た目になる。
（更新系のEntity Actionが全て表示されない）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/a2de4442-c83a-a7f1-ef72-f24510882a0a.png)

## Action
一般的にはServer Action。
Public=Yesにする。

# 実装例
あくまで例として
- ログ出力
- 権限チェック
- バリデーション
- 共通属性設定

を含めたものは以下のようなイメージになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/2e9d4638-a887-6839-b7d0-0780e4c44264.png)

環境内のProduct Entityに対する更新が、全てこのActionを呼ぶことによって問題発生時に見るべき場所、保守対応時に修正すべき場所を一箇所にすることができる。

# 外部DBの場合の注意
外部DBのEntityはPublicやExpose Read Onlyプロパティを変更できない（すべて公開になる）。
Core Entity Patternを完全に強制することはできないということ。

仕方ないので、標準として、「更新処理はCore Entity Patternにしたがって実装する。該当モジュール以外での直接の更新は禁止」としてレビューで検出する。

# 参考資料
公式ドキュメントでは見つからず。
公式動画はあった。
[Architecture Patterns in OutSystems](https://www.outsystems.com/training/lesson/1226/core-module-patterns)の4分あたりから。
SpringBoot+KotlinでWebアプリ開発からDockerでのビルドまで

# 概要
Spring Boot + Kotlinで簡単なWebアプリケーションを作り、Dockerイメージにビルドする方法を記載します。


# Webアプリケーションの開発

## プロジェクトファイルの準備

[spring initializr](https://start.spring.io/)へアクセスし、以下の画面キャプチャのように設定してGENERATEボタンを押下することでプロジェクトを作成します。

* Gradle Project
* Kotlin
* Jar
* Java 11
* Dependencies
    * Spring Web
    * Thymeleaf

ダウンロードしたプロジェクトファイルを`unzip`し、インストールしておいた[IntelliJ IDEA](https://www.jetbrains.com/idea/)のFile > Openから開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400927/37368d72-bcf7-1c2f-5762-69f4b7f162dd.png)

## コーディング

以下のKotlinファイルを作成します。

```kotlin:demo/src/main/kotlin/com.example.demo/Controller.kt
package com.example.demo

import org.springframework.stereotype.Controller
import org.springframework.ui.Model
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RequestMapping

@Controller
class Controller {
    @GetMapping("/demo")
    fun index(model: Model): String {
        model.addAttribute("message", "Hello World!")
        return "index"
    }
}
```

上記のコードは`/demo`のパスにアクセスした際に、`return "index"`で指定した`index`.htmlのファイルが表示されるように紐づけています。

また、`model.addAttribute`で指定した`message`属性の値`Hello World!`がindex.htmlへ渡されることになります。

続いて、index.htmlを作成しましょう。

```html:demo/src/main/resources/templates/index.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>Hello World!!</title>
</head>
<body>
    <p th:text="${message}"></p>
</body>
</html>
```

上記HTMLファイルでは、`<p th:text="${message}"></p>`の部分で、`model.addAttribute`にて指定した属性値を取得しています。

## Webアプリの起動

シェルにて以下のコマンドを実行することでWebアプリが起動します。

```bash
$ ./gradlew bootRun
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400927/6d5f7a96-8c51-d07f-de5e-02e19e9b883b.png)

なお、IntelliJのUIからもアプリを起動することは出来ます。

## 起動したWebアプリの画面

ブラウザにて`localhost:8080/demo`にアクセスすることで以下の応答が得られます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400927/ab4d057a-af15-e04d-1a8e-e2ad95d9180d.png)


# Dockerイメージのビルドおよび起動手順

Boot SpringのProject直下に以下のDockerfileを作成する。

※`gradlew bootJar`ではなく`gradlew build`を記述してしまうと、`*-plain.jar`が生成されてしまい`docker build`に失敗します。

```Dockerfile:Dockerfile
FROM adoptopenjdk/openjdk11:alpine
VOLUME /tmp
RUN mkdir /work
COPY . /work
WORKDIR /work
RUN /work/gradlew bootJar
RUN mv /work/build/libs/*.jar /work/app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/work/app.jar"]
```


シェルで以下のコマンドを実行することで、Dockerイメージの作成および実行が完了します。

```bash:bash
$ docker build --no-cache -t <image name> .
$ docker run -p 8081:8080 <image name>
```

# 参考
- Dockerイメージのビルドでは、以下の記事を参考にさせてもらいました。以下の記事のやり方では`No such file or directory`のエラーによってDockerイメージのビルドに失敗してしまったため本記事ではその修正対応を行っております。

https://qiita.com/qphsmt/items/10520fa92c06df022ef7


```:修正対応したエラー内容
mv: can't rename '/work/build/libs/<project name>-plain.jar': No such file or directory
mv: can't rename '/work/build/libs/<project name>.jar': No such file or directory
The command '/bin/sh -c mv /work/build/libs/*.jar /work/app.jar' returned a non-zero code: 1
```
【Docker Compose】別プロジェクトでも同じディレクトリ名だとコンテナが置き換わってしまう話

## 参考
- https://qiita.com/hiroism/items/833170159d1d57a20e41
- https://stackoverflow.com/questions/62969110/compose-up-recreating-the-compose-service-created-by-other-directories

## 問題発生
 開発用DBを用意するため、docker-compose.ymlで以下のような記述をしてdb/フォルダ内で`docker-compose up -d`をした

- myapp2/db/docker-compose.yml

```
version: '3'

services:
  mysql:
    image: mysql:5.7
    container_name: mysql_myapp2
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: myapp2
      MYSQL_USER: user
      MYSQL_PASSWORD: root
    volumes:
      - ./docker/db/data:/var/lib/mysql
      - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
    restart: always
    ports:
      - 3307:3306

```

container_nameを独自のものにしていたため、独立して新しくコンテナが作られると思っていた。

しかし、同時に別プロジェクト同じフォルダ名(db)で以下のdocker-compose.ymlでDBを起動していた。

- myapp1/db/docker-compose.yml

```
 version: '3'

   services:
     mysql:
       image: mysql:5.7
       container_name: mysql_myapp1
       environment:
         MYSQL_ROOT_PASSWORD: root
         MYSQL_DATABASE: myapp1
         MYSQL_USER: user
         MYSQL_PASSWORD: root
       volumes:
       - ./docker/db/data:/var/lib/mysql
       - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
       restart: always
       ports:
       - 3306:3306
```

container_nameが別なので別のコンテナが作成され、新規のコンテナ（mysql_myapp2)と共存するものかと思っていた。

#しかし、docker-compose up -dをすると、以前(myapp1)のコンテナが消され、置き換わってしまった！！！！！！！！！！


これは困った。

## 原因
上記参考リンクにある通りだが、原因はプロジェクト名（フォルダ名）の衝突にあるらしいことがわかった。双方ともdb/配下に`docker-compose.yml`を配置していたため。

ここではプロジェクト名を指定していないのでdbがプロジェクト名とされ、その衝突によってcontainerのrecreateが発生しているようである。

## 対処
1. プロジェクト名を-pオプションで指定する
2. ディレクトリ名をdb/から変える


結論、私は2の方法でdb-> myapp-dbというディレクトリ名に変えることによって解決した。
プロジェクト名を指定するのもよいが起動時に毎回それやるのが面倒なので（envファイルに書けばいいというのはある）。

## 感想
container_name違うんだから別コンテナ扱いしてくれないのなんで？？わからない。
MCP(マイクロソフト認定資格)を受けようと思った時にみるべき記事

# TL;DR
私は定期的にMCP（Microsoft Certifications Program：マイクロソフト認定資格）を受験するのですが、そのときに毎回チェックしたりまとまっていたらいいなと思う情報をまとめました。

# 試験一覧
まずMCPの試験一覧は以下です。試験はどんどん更新されるので、[こちら](https://query.prod.cms.rt.microsoft.com/cms/api/am/binary/RE2PjDI)もチェックしてください。
![スクリーンショット 2022-01-17 5.43.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252806/d62e13ae-cc45-e8c9-ff89-2659a963f871.png)
（参照：Become Microsoft Certified）

基本的には一つの試験に一つの資格が対応していますが、中には複数の試験に合格することで取得できる資格もあります。（Expertなど）

# 資格の更新
資格の有効期限には以下の３種類あります。

- Fundamentals（xx-900）は無期限
- 2021年5月以前に取得されたMCPは有効期限が__２年間__
- 2021年6月以降に取得されたMCPは有効期限が__１年間__

有効期限が切れる6ヶ月間以内なら、いつでも自分の好きな時間にオンラインで更新テストを受けられて、それに合格すると、認定資格の有効期限が１年延長されます。有効期限が切れる前に届くリマインダーメールから更新テストが受けられます。

有効期限以内に更新テストに合格しなかった場合、資格は失効するので再び試験を受けて合格する必要があります。

参考）

- [更新手順](https://blogs.partner.microsoft.com/mpn-japan/wp-content/uploads/sites/176/2021/10/%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E3%81%AE%E6%9C%89%E5%8A%B9%E6%9C%9F%E9%99%90%E3%81%A8%E6%9B%B4%E6%96%B0%E2%80%97202110.pdf)
- [Microsoft Base | 技術ブログ](https://blogs.partner.microsoft.com/mpn-japan/2021/10/08/renew-your-certification-please/)

# キャンペーン
不定期にMCP合格応援キャンペーンが開催されます。これはキャンペーン期間中に対象の試験に合格し、LinkedInで結果をシェアすると、__先着で__豪華景品がもらえちゃうというものです。（対象をシステム管理者、運用管理者、アプリケーション設計開発者としており、申し込む際に所属企業名等が必要になるのでご注意ください）
[Microsoft TechのTwitter](https://twitter.com/msdevjp/status/1471812434876899330?s=20)で情報が配信されるので、フォローして、チェックしておくといいでしょう。

応募方法など、これまでのキャンペーン情報はこちら

- [第１弾](https://www.microsoft.com/cms/api/am/binary/RWGW1k?sccid=tw_bst_20210806&ocid=AID3033945_TWITTER_oo_spl100002355294820)
- [第２弾](https://www.microsoft.com/cms/api/am/binary/RWMLMQ)
- [Microsoft Base | 技術ブログ](https://www.microsoft.com/ja-jp/events/azurebase/blog/2nd-campaign_ms-certification-pass-support/)


# 最後に
また更新します。
LINE Botを使ってYahoo!ショッピングから価格を取得する

##はじめに
内勤小売マンです。
自分自身買い物に行った時「この商品はネット大手通販と比較して安いのか？」と気になることがあり、プログラミングの勉強がてら価格を比較するツールを作ってみました。

##使ったもの
- Node-RED
- LINE Messaging API
- Yahoo! JAPAN Web API 商品検索（v3)

##成果物
JANコードを入力することで、最安値～３位までの店名と価格の結果を返信できた。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491573/64a098e5-3952-d45f-5a87-3b21a8476c5e.png)
※企業名は非表示

##Node-RED全体
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491573/f2aeb13c-eaab-8ba4-d95c-9b6604dedb69.png)

##詳細
changeノード設定
sortは安い順、resultsは3件とした。
user_rankは最終的なポイントがいくら付与されるか見たかったが、うまく作動していない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491573/95e9488e-5e59-3e82-0bb4-4668c296a085.png)

http requestノード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491573/98c57c53-7b3e-9d88-4b26-c969f7245f1a.png)

ここまでのDebug
payload.hitsはarray[3]なのでresults=3が反映されていた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491573/f2d93827-44cf-452d-2311-62feacf58bd0.png)

hits以下の内容は下記の構成だった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491573/8c9a7f4b-94f7-bfa7-57f4-f0821a362862.png)

changeノード
hitsが配列なので、payloadに配列を代入
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491573/4e12690a-51b0-55fe-6dde-9bec40e8a6a4.png)

splitノード
\n 改行コードで分割
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491573/f9570bb3-c38b-911e-b164-4686e4585b9e.png)

templateノード
店名と価格を抽出
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491573/2b74926c-639d-a80f-fa20-ab2241c90ee6.png)

joinノード
文字列を結合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491573/6bb001f7-8480-e899-722d-413c978a3ad9.png)

debug:最終結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491573/9871acea-f873-dec4-5423-34e2571e59bb.png)

##まとめ
とりあえずは最低限の機能として実装はできました。
以下の内容を肉付けしoutputする内容も整理したいと考えています。

バーコードの画像からJANコードを画像認識でLINEに入力
Amazonから最安値を取得する
Yahoo!ショッピング,楽天市場から特定の店舗を指定し、価格を取得する
結果をランキング＋平均値にしてLINEメッセージとして返す
やりたかった最終的な内容はまだまだ未実装なので


##引用
LINE周りは以下のリンクを参考に構築

https://zenn.dev/ukkz/articles/a389105e400ea2

https://qiita.com/youtoy/items/287a0782fdd185fc2004

Yahoo! JAPAN Web API 商品検索（v3)の詳細

https://developer.yahoo.co.jp/webapi/shopping/shopping/v3/itemsearch.html
2022/1/17主にITとかセキュリティの記事

ドコモ「d払い」不正利用、主犯格と見られる男性逮捕(1/14)
https://cybersecurity-jp.com/news/62340

米議会襲撃調査委、ネット大手4社に召喚状　過激思想の拡散巡り(1/14)
https://newspicks.com/news/6569417/body?sentlog

Google、最新OSで「2Gを無効」機能を実装〜セキュリティ性能が向上(1/13)
https://iphone-mania.jp/news-432384/

任天堂、なりすまし偽サイトの存在を報告　同社ロゴの不正使用や商品が大幅割引価格で購入できるかのように表示(1/15)
https://news.yahoo.co.jp/articles/995ad1ec095de23ac590f5ab9fc9fc4fe6d9820d

あなたのスマホがハッキングされている？ 判断する方法とは(1/14)
https://ascii.jp/elem/000/004/079/4079934/

72歳男性、「ウイルスに感染した」PCに表示され4万円を騙し取られる 同様のケース相次ぐ(1/14)
https://npn.co.jp/article/detail/200018803

Windows 11ミニTips 第36回 見えにくくなった文字はテキストサイズで調整(1/14)
https://news.biglobe.ne.jp/it/0114/mnn_220114_4874148266.html

英でメタに代表訴訟　個人情報搾取と追及、3600億円超(1/15)
https://www.nikkei.com/article/DGXZQOGR14DVG0U2A110C2000000/

サーバー設置国公表など義務化　情報保護規制強化案(1/14)
https://news.yahoo.co.jp/articles/d9e8a562c631e13c7b6dda3a660bb9e546d1c29a

グーグルのSonosへの敗訴で大手テック企業による知的財産権侵害問題が改めて明らかに(1/14)
https://jp.techcrunch.com/2022/01/14/2022-01-13-googles-loss-to-sonos-settles-it-big-tech-has-an-ip-piracy-problem/

米国政府の要請でサイバー集団のメンバー2人がロシアで逮捕(1/15)
https://jp.sputniknews.com/20220115/9954574.html

IT規制強化案まとまる　閲覧履歴、利用者への「通知」義務付け(1/14)
https://news.yahoo.co.jp/articles/a2428fbd8e32879fc7879ded4250208ccc2e63f3

「中国などによるスパイ活動で脅威増大」デンマーク情報機関が警告(1/14)
https://www.epochtimes.jp/2022/01/84778.html

「荷物が届いてます」というSMS、タップするとどうなる!? - いまさら聞けないiPhoneのなぜ(1/14)
https://news.mynavi.jp/article/20220114-iphone_why/

パキスタンは中央銀行推奨で全面仮想通貨禁止か(1/14)
https://nextmoney.jp/?p=47499

Ciscoが2022年1月に合計13のセキュリティアドバイザリを発行　「緊急」の脆弱性2つに対処(1/15)
https://www.itmedia.co.jp/enterprise/spv/2201/15/news020.html

クラウドに関する記事のまとめ(2022.1.10～2022.1.15)
https://blogs.itmedia.co.jp/business20/2022/01/20221102022115.html?ref=rss

Android一部端末、「Googleの音声サービス」のアップロード表示が続く症状(1/15)
https://www.zaikei.co.jp/article/20220115/656009.html

あなたもパスワードを使い回しているはず、ユーザー認証の「常識」はもう限界(1/17)
https://xtech.nikkei.com/atcl/nxt/column/18/01897/122200007/
【React】import * as React と import React の違い

## はじめに
　本記事は、プログラミング初学者が、学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。
　そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。
　間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。

##`import * as React` と `import React` の違い
Reactでコンポーネントをインポートする際に以下の2通りの記述をよく見かけます。

```.js

import * as React from 'react';

import React from 'react';

```


###`import * as React from 'react';`
`import * as React from 'react';`は`react`でexportされているもの全てをimportして`React`という変数に格納する記述です。
以下のようになります。

```Sample.js
// named export
export const test = "Hoge";

// default import
const Default = "Fuga";

export default Default;

```

```App.js
import * as Sample from './Sample';

console.log(Sample); 
/*
  {
    test: "Hoge",
    default: "Default"
  }
*/

```


###`import React from 'react';`
`import * as React from 'react';`は`react`でexportされているもの全てをimportして`React`という変数に格納する記述です。
以下のようになります。

```Sample.js
// named export
export const test = "Hoge";

// default import
const Default = "Fuga";

export default Default;

```

```App.js
// default import
import Sample from './Sample';

console.log(Sample); 
/*
  {
    test: "Hoge",
    default: "Default"
  }
*/

```
##まとめ
`import * as ～`は、バンドラーを使用した際にビルドファイルが肥大化する恐れがあります。
ビルドファイルの肥大化をため、なるべくdefault importもしくは、named importを使用しましょう。
なお、default importは、各自が名前を決められてしまうため、named exportとnamed importを使用するのが良いようです。
firebaseのhostingが使えない場合の対処法

firebase hostingで
https://firebase.google.com/docs/hosting/quickstart?hl=ja
上記のとおりにやったつもりだが、
![スクリーンショット 2022-01-17 4.18.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/998564/1d6f4387-c2d1-58dd-4287-cfdb85a6366e.png)
この画面が出てきてうまくいかなかったので備忘録として残しておきます。

https://zenn.dev/kazutxt/books/flutter_practice_introduction/viewer/release_web
上記を参考に
? What do you want to use as your public directory? (public)の回答でそのままエンターを押すのではなく、
build/webと指定してあげる必要があったようです。
2022年版 TypeScript / モノレポによるライブラリ開発の技術選定

# 背景

TypeScriptのライブラリを作る際は、txdxというツールを使っていたのですが、メンテナンスが不十分で使うに耐えなくなったので、自分で環境構築することにしました。ただ、情報が錯綜して理解するのが大変だったので、そのまとめです。

技術選定を「ビルド」「パッケージ管理」「タスクランナー」「バージョン管理」の4つに分割し、それぞれ見ていくことにします。

## ビルド

a. RollUp
b. WebPack（一般的ではない）
c. tsc

RollUpがもっとも一般的であり、現在、ほとんどの有名パッケージではRollUpが使われています。WebPackでも同様のことができますが、ライブラリ用途では一般的ではありません。

ビルドしたい内容がTypeScriptのみであり、単一の形式で出力すれば良い時は、tscを使う方法もあります。チーム内で使えば良いパッケージの場合は、こちらの方法も検討可能です。

ちなみに、個人的にはtsdx(rollupを内部で呼び出すツール）からの移行だったので、迷わずRollUPにしました。

## パッケージ管理
a. npm workspace
b. yarn workspace 
c. lerna bootstrap (時代遅れ）
d. tsconfigのreference (バンドラーを使わず、tscを直接使う場合のみ）

かつて、Workspaceのパッケージ管理は、lernaを使うのが一般的でしたが、npm, yarnにこの機能が実装されたため、lernaは使わず、npm / yarnのworkspace機能を使うのが一般的になりつつあります。

注意事項として、どの方法を取る場合でも、それぞれのパッケージ管理手法を一貫して取る必要があるということがあります。混ぜるな危険。

ちなみに、バンドラーを使わず、tscで直接ビルドする場合は、tsconfigのreference機能で依存関係を処理することもできます。この場合、tscが1プロセスで済むため、CPU負荷が低いのがメリットですが、package.jsonと二重管理になるのが欠点です。

## タスクランナー
a. yarn workspaces foreach
b. lerna run

Workspaces内の全てのパッケージでコマンドを実行する機能です。yarnとlernaには、依存関係を考慮してタスクを実行してくれる機能や並列実行の機能がありますが、npmにこの機能はありません。

基本的には、yarn / lernaの選択になると思います。ただ、tsconfigのリファレンスで依存関係を処理する場合は、依存関係の処理はtsc側でやってくれるので、多くの場合、npm run --workspaces でも問題ないかと思います。

## バージョン管理
a. lerna publish
b. 手動バージョン管理

ファイルの変更を検知したり、バージョン番号を自動で割り振ってくれる機能です。これはlernaにしかありません。ただ、lernaを使わないとできないかというとそうではなく、手動で実行するのはありだと思います。

# ポイント

## lerna
lernaですが、複数の機能の集合体としての要素が強く、異なる機能であれば他のツールと併用可能です。

要するに、npm workspaceを使っているがlenra runだけを使いたい、yarn workspaceを使っているが、lerna publishを使いたい・・・と言ったことが問題なく可能です。

ただし、パッケージ管理の方法だけは統一しましょう。

## tscのreference

モノレポ管理で調べるとtscのreferenceを使う方法がしばしば書いてありますが、これは主に、バックエンド / フロントエンドのようにレポジトリ内に複数のプロジェクトを配置することを想定されている機能で、ライブラリ開発には合っていません。ライブラリ開発の場合は、素直にRollUpを使えば良いのではないかと思います。この場合、referenceの設定は不要です。

# まとめ

無駄に多くのツールを使いたくないことを考えると、以下の3パターンからの選択がきれいにまとまって良さそうです。こちらは異論もあると思いますが、参考まで。

1. lerna派
RollUp
npm workspace
lerna run
lerna publish

2. Yarn派
RollUp
yarn workspace
yarn workspaces foreach
手動バージョン管理

3. ｔｓｃ派
tscでビルド
tsconfigのreferenceで依存関係処理
npm run -workspaces *or* yarn workspaces run (依存関係無視）
手動バージョン管理
【LINEBot】で店舗の在庫を確認出来るものを作りたい。プログラム初心者の苦闘・・

LINEBotを初めて触ってみて、オウム返しや決められたメッセージを返せる機能を体験しました。
これは便利！と思い作ってみようと思いました。

#テーマを選んだ理由
自分自身が小売業で勤務していて、お客様に「この商品扱ってますか？」「この商品在庫ある？」と
聞かれる事が多かったのでLINEBotを駆使すれば解決出来るのでは？と思いました。
（お客様も来店する前に在庫確認出来るのでサービス向上にも繋がる！）

#やりたい事
LINE友達登録した店舗で、在庫確認したい商品のJANコードか名称を入力すると、
そのお店の在庫数を返信するLINEBotが作りたい。

#使用した機能
・Messaging API
・Node-Red
・GoogleSpreadSheet

#作成手順
１．node-red-contrib-google-sheetsをインストール
　　GoogleSpreadSheetと紐づけ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2476728/8afc1d01-1f71-404c-c4d0-67a0f6eb2569.png)

　　
２．在庫数のデータをGoogleSpreadSheetにインポート
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2476728/6f781583-701f-f786-9cb8-8c2227cf7a0d.png)

３．Node-Red構成
色々調べながら並べてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2476728/8f58d6a4-1950-7031-2714-42a1ae239dd8.png)
ここからどの様に条件指定すれば良いのかわからず・・
（コードを書けば解決するのか？書き方がわからない・・汗）
色々検索してみましたがわからず力尽きました。

#今後
GoogleSpreadSheetにデータを更新する作業が発生するので、
それをRPAで解決出来ないかと思いながら取り組みましたが、
それ以前で挫折しました。

何がわからないかわからない状態なので、
少しずつ学んでいきたいと思います。
金融機関の支店一覧を教えてくれるLINE Bot「プログラミング初心者の初挑戦記録」

![見出しを追加.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491190/953abae5-ca4f-69fa-495a-fd20ec3857e2.png)
##「公園横にあるさあ…。」「見たことありますね、そういえば」
新人営業の時代、お客さまとの商談中に口座書類記載の為に聞かれて慌ててスマホを探した経験があります。

今回はプログラミング経験ゼロの私がLINE Botのプロトタイプ作成に初挑戦しました。
まだまだ改善点が多いため、開発ポイントと今後の課題を記載しています。

## 出来ること
LINEのトーク画面で検索したい金融機関名をひらがなで入力すると金融機関とその支店それぞれの名称とコードを教えてくれます。
＊途中送信も可能です。
[![Image from Gyazo](https://i.gyazo.com/33e0bc02ff9a45d6da44137a0f952950.png)](https://gyazo.com/33e0bc02ff9a45d6da44137a0f952950)
画像: [Gyazo](https://gyazo.com/33e0bc02ff9a45d6da44137a0f952950)


また、候補の金融機関が複数ある場合やデータが取得できなかった時は以下のようにエラーメッセージが表示されます。
[![Image from Gyazo](https://i.gyazo.com/16619e89bad67278758e5d94cdbe25bf.png)](https://gyazo.com/16619e89bad67278758e5d94cdbe25bf)
画像: [Gyazo](https://gyazo.com/16619e89bad67278758e5d94cdbe25bf)

##使用ツール
・Heroku
・Node-RED v2.1.5
・LINE Developers
・[BankCodeJP API](https://bankcode-jp.com/)（金融機関コードAPI）
　
　

 
##LINE Bot構造
LINE Botの構造は以下の通りです。
![NodeーREDフロー画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491190/9bd080b0-d7e8-f425-a736-1e77072b8603.png)
フロー画像: [Gyazo](https://gyazo.com/b7561d7660066b313de29ed1007ee149)


##処理手順
1.入力メッセージをAPIに連携し、検索結果を取得。
2.データサイズを変数として取得し、金融機関特定の成否を判定。
3.失敗した場合はエラー内容に応じてエラーメッセージを作成し、成功した場合は支店一覧を取得。
4.作成したメッセージをLINEにて回答。

## LINE Botの改善点
**絞り込み検索の実装**
支店の絞り込みが実装出来ておらず支店一覧を表示するため、支店数の多い先への活用に難があります。

**利用回数の制限**
APIライセンスの関係で一日の利用回数に制限が有ります。

##次回に活かすポイント
**APIキーの設定**
API利用にあたり、APIキーの設定をしておらずアクセス制限を受けてしまいました。

**複数回同じAPIを使用する際のdelay設定**
このLINE Botは同じAPIへ短時間に２度接続しています。そのため、接続間隔が短くなっていることによりエラーメッセージが返されました。
今回は利便性が落ちますが2度目の接続時にdelay設定を行い解消しています。

**配列内から複数要素を取得する**
　APIから各支店データをJSON形式で取得した際、1拠点毎にdata内に結果が格納されていました。
　このままでは拠点の名称とコードをそれぞれ取得出来なかったため、以下の処理を実施。
　1.dataの要素を取得したいので、dataをpayloadへ代入。
　2. splitノードで分割し、取得したい要素をtemplateで取得。
　3. joinで再結合。
　　参考:[Node-REDクックブック](https://cookbook.nodered.jp/basic/operate-on-array"Node-REDクックブックリンク")

###まとめ
今回は初のLINE Bot作成という事で色々な方にご教示いただきながら何とか形にすることが出来ました。

新しい技術や知識をフル活用して試行錯誤する事の難しさを実感すると共に、その面白さも感じました。
さらなる改善が図れるよう自分の知識アップの為の勉強はもちろん、情報を収集する手段についても勉強していこうと思います。

閲覧ありがとうございました！
「newする」の感覚的解釈

##■よく分かんないけどnewする
プログラミングを始めてから、ずっと分からなかったんです。
newってなんなんだ？
なんだかよく分かんないけど、
newしないとできないことがあって、
newするとできるようになることがある。
どうやらこれがインスタンス化って言うらしい。
ふーん？
newするって何なの...って思いながらいつもnewしてました。

調べると記事は色々出てきますよね。
設計図を実体化するみたいな感じ、とか大体そんなふうに。

ふむふむなるほど、、、、
**わ〜、全然ピンと来ないなあ** 😇

あ、決してわたしの見た記事がダメだったとかそういうことはなくて
わたしの理解力のなさがピンと来なかった原因なんですが、
つい先日ようやく開眼（？）いたしまして、
今回はそれを記事にしたいと思います。

##■newするっていうのは
思ったんですよ。
newするっていうのはもしかして、

**召喚獣を召喚するのと同じなんじゃない？？　** って。

いきなり召喚獣とか言い出して大丈夫でしょうか。
大丈夫です。
（あまりゲームに馴染みのない方には意味不明ですね、すみません汗）


さてここに魔術書があることにします。
魔術書にはありとあらゆる召喚獣を呼び出すための魔術が書かれていますが
その中から召喚獣をひとつピックアップしてみましょう。

```php:tsuyoi_dragon.php
class TsuyoiDragon
{
    public function flame_breath ($energy, $anger) {
        $flame_power = $energy*$anger;
        return $flame_power;
    }

    public function blizzard_breath ($eneregy, $sadness) {
        $blizzard_power = $eneregy*$sadness;
        return $blizzard_power;
    }
}
```

旅の途中で敵に遭遇して、
このツヨイドラゴン（強い）を呼び出して敵をやっつけたい！と思ったとき
魔術書に向かって「flame_breath!!!」と叫んでも
**本に向かって何やら大きい声を出している人** に
なってしまうだけなのですが
それはちょっと恥ずかしいので、ここで代々伝わる詠唱方法を使います。

**そうです、それが「new」です。**

newとは言い換えると、「出でよ！！」なのであります。
「出でよ！ツヨイドラゴン！flame_breathだ！」　をphp風に記述すると

```php:summon_spell.php
$tsuyoi_dragon = new TsuyoiDragon;
$attack = $tsuyoi_dragon->flame_breath($energy, $anger);
```
こんな感じになるかと思います。
いかがでしょう。伝わりますでしょうか。

魔術書に書かれているだけの状態ではツヨイドラゴンの必殺技は使えないので、
**「new（出でよ）して召喚獣を出現させてから任意の必殺技を指示できる状態にする」**
これがインスタンス化なのだと理解したとき、
ようやくわたしのなかで腑に落とすことができまして
大変スッキリしました。

##■さいごに
この記事に辿り着いて頂いた方に、
スッキリが少しでもシェアできましたら嬉しいです。
最後までお読み頂きありがとうございました！
【windows】「docker」「docker-compose」コマンドを省略しよう

# 前置き
毎回打つのが地味に手間なdockerコマンド。
>**「docker」→「d」**
**「docker-compose」→「dc」**

と省略設定をしてみたいと思います。**「d ps -a」「dc up -d」**などとコマンドが打てるようになります。

windowsのDOSKEYコマンドを利用することで、コマンドに対してエイリアス（別名）を付ける事ができます。
「dir」コマンドをlinuxのように「ls」と設定するにはコマンドプロンプトで

```
doskey ls=dir
```

と入力すればlsが使えるようになります。

# dockerコマンド省略
同じようにdocker,docker-composeそれぞれにエイリアス設定（＝名前をつける）が可能です。

```
doskey d=docker $*
doskey dc=docker-compose $*
```

$*は引数受け取りを意味します。下記が使えるようになりました。

```
d ps -a
dc up -d
```

「dc」だと「cd」と混同しますね😅
適宜お好きに名付けてください。

ただし、この設定は永続的なものではなく。コマンドプロンプトを閉じると使えなくなってしまいます。
# エイリアスの永続化
windowsの仕様上泥臭い方法になるのですが、doskeyを入力後ファイルに書き出し、出力したマクロファイルを毎度読み込ませるという形で事実上の永続化を行います。

まずエイリアス設定。

```
doskey d=docker $*
doskey dc=docker-compose $*
```

ユーザディレクトリに「macros.txt」として出力。「%USERPROFILE%」とはカレントユーザディレクトリのこと。保存場所は適宜変えてください

```
doskey /macros > %USERPROFILE%\macros.txt
```

マクロ読み込みコマンド

```
doskey /macrofile=%USERPROFILE%\macros.txt
```

これをコマンドプロンプト起動時に毎度打ち込めばエイリアスが使えます。
ただ毎回手打ち入力してらん無いんで、コマンドライン引数として実行させる必要があります。**方法は２つ。**


**1. cmd.exeのショートカット作ってコマンドライン引数に指定**
一番お手軽・安全。cmd.exeの後ろに半角スペース入れて上記をペースト。
`/k "doskey /macrofile=%USERPROFILE%\macros.txt"`
ただし作ったショートカットから毎回開かないエイリアスが適用されない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295263/e23ef79f-cf82-7b8c-7042-66ed56fd6757.png)

レジストリ値設定
この方法だと全体にalias設定が可能です。

レジストリ エディターを開いて、
HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor
HKEY_CURRENT_USER\Software\Microsoft\Command Processor
のどちらかを探し、右クリック＞新規＞文字列値
名前を
`AutoRun`
値を
`doskey /macrofile=%USERPROFILE%\macros.txt`
として保存するだけでOK

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295263/4339444d-da61-c090-1fbc-d379fdfe7f66.png)

※ちなみにConEmu/Cmderでの設定①とほぼ同じ。&で繋いで下記入力して適用押す。
![2022-01-15_15h31_57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295263/84de1479-44b9-603f-937e-4a20b8ed09d2.png)

```
/k "doskey /macrofile=%USERPROFILE%\macros.txt"
```


# 「無効なマクロ定義です。」と表示される場合は
無効と言われるのに設定したエイリアスは使えるという現象が起きました。意味不明に

```
doskey /macros > %USERPROFILE%\macros.txt
```

で出力後、一度cmd.exeを閉じてもう一度cmd.exeを開き、

```
doskey /macrofile=%USERPROFILE%\macros.txt
```

を入力、①で作ったショートカットで開くとこの表示はなくなりました。

この現象ググっても全然出てこない・・
詳しい方いましたらコメントください

- 参考
https://windows.command-ref.com/cmd-doskey.html
http://piyopiyocs.blog115.fc2.com/blog-entry-878.html
https://blog.kunst1080.net/post/2015/12/01/221724/
https://qiita.com/RoaaaA/items/694ae4ccfa4a69fc8286
AWS CLI v2の公式Dockerイメージのセットアップ方法

# 概要
初投稿です。
aws-cli公式Dockerイメージを利用することで、Dockerのインストールのみでaws-cliを使用できます。
しかし、簡潔なセットアップ方法の記事が見つけられないので作りましました。
<br>

- 前提条件
    - Linux OS(shellが使えれば他のOSでもOK)
    - Dockerをインストール済み
<br>
<br>


## 1.「.aws」ディレクトリの作成
下記のコマンドを実行し、「.aws」ディレクトリおよび認証ファイルを作成する

~~~bash
cd ~
mkdir ~/.aws && touch ~/.aws/credentials && touch ~/.aws/config
~~~
<br>

続いて、それぞれのファイルを下記のとおりに編集する

`~/.aws/credentials` 
<br>

~~~
[default]
aws_access_key_id=AKIAIOSFODNN7EXAMPLE
aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
~~~
※記載されているキーはAWS公式のサンプルなので、そのままコピペしても動きません。
※配布された自分のアクセスキーとシークレットキーを設定しましょう。

<br>

`~/.aws/config` 
<br>

~~~
[default]
region=ap-northeast-1
output=json
~~~
<br>

## 2.aws-cliの実行
下記のコマンドを実行し、動作確認を行う。

~~~
docker run --rm -it amazon/aws-cli --version
~~~
<br>

下記のような表示がされればOK

~~~
aws-cli/2.4.11 Python/3.8.8 Linux/4.19.104-microsoft-standard docker/x86_64.amzn.2 prompt/off
~~~
<br>

続いて、下記のコマンドを実行し、「.aws」ディレクトリが正しくマウント出来ていることを確認する。

~~~
docker run --rm -it -v ~/.aws:/root/.aws amazon/aws-cli sts get-caller-identity
~~~
<br>

下記のように表示されれば、設定完了。

~~~
{
    "UserId": "AIDAXXXXXXXXXEXAMPLE",
    "Account": "XXX",
    "Arn": "arn:aws:iam::XXX:user/XXX"
}
~~~
【Unity】 Addressables.LoadResourceLocationsAsync を使って同じラベルのデータを読み込む

# 環境
* Unity 2020.3.18f1
* Addressables 1.18.19


# 手順
今回は検証のため[いらすとや](https://www.irasutoya.com/2021/01/onepiece.html)からいくつか素材をダウンロードして使います。
また、検証で作ったプロジェクトは[Github](https://github.com/takesi0627/AASTest)に上げております。

## アセットの登録
1. `Windows > Asset Management > Addressables > Groups` で設定ウィンドウを開く
2. ダウンロードした素材をドラッグ＆ドロップして登録
3. `Labels > Manage Labels` でラベルの管理ウィンドウを開く<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259886/2c0c0c08-0410-85e9-3932-6133fe2507e6.png)
4. 「+」ボタン押して付けたい名前を入力。ここでは`OnePiece`にします。
4. 一括選択してラベルをつける<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259886/238e5a0c-9129-9723-fa3a-d2907e144bb7.png)

これでアセットの登録が完了です。

## スクリプトの作成
今回は「ボタンを押したらロードを開始して、読み込んだアセット毎をログで出力する」というスクリプトを作る。


```csharp:LoadAsset.cs
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.EventSystems;

public class LoadAsset : MonoBehaviour, IPointerClickHandler
{
    public async void OnPointerClick(PointerEventData eventData)
    {
        // タイプ指定しない場合Texture2Dアセットもロードされてしまい、その後のLoadAssetでエラーになる
        // var locations = await Addressables.LoadResourceLocationsAsync("OnePiece").Task;
        var locations = await Addressables.LoadResourceLocationsAsync("OnePiece", typeof(Sprite)).Task;
        
        foreach (var location in locations)
        {
            Addressables.LoadAssetAsync<Sprite>(location).Completed += (op =>
            {
                Debug.Log($"{op.Result.name} loaded");
            });
        }
    }
}
```

ここで大事なのは、`Addressables.LoadResourceLocationsAsync`を使うときに、第２引数の`type`はデフォルトで`null`となっていますが、タイプを指定していない場合、図のようにロケーションの取得で同じアセットが複数回登場してしまうことがある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259886/8d8996b0-9d44-bf23-73e5-2ca05d9db44b.png)
特にイメージアセットの場合は、同じアセットが`Sprite`と`Texture2D`の２種類としてカウントされているようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259886/e5637342-a903-34ea-d0d5-86a002865231.png)

# 終わりに
`Addressable.LoadResourceLocationsAsync`でアドレスを取得するときにあらかじめタイプを指定するか、
取得したアドレスに対して読み込むときに

```csharp
if (location.ResourceType == typeof(Sprite))
```
で型のチェックをした方が無難でしょう。




# 参考
https://docs.unity3d.com/Packages/com.unity.addressables@1.19/api/UnityEngine.AddressableAssets.Addressables.LoadResourceLocationsAsync.html?q=LoadResourceLocationsAsync#UnityEngine_AddressableAssets_Addressables_LoadResourceLocationsAsync_System_Object_Type_
【GCP】Cloud Load Balancingによる負荷分散

# はじめに

Cloud Load Balancingによる負荷分散する方法を備忘録としてまとめる

https://cloud.google.com/load-balancing

## 全体像

![スクリーンショット 2022-01-17 0.10.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555632/a00b8bb1-82cf-6792-4a04-84bed353d8e1.png)


# やり方

# Cloud Load Balancingの作成

> 　GCPのロードバランサは「アジア/北アメリカ/ヨーロッパ」の3リージョンに分類し、アクセス元から近くのリージョンへアクセスし、GCPの内部ネットワークを経由してGCEサービスに到達します。

https://www.apps-gcp.com/gcp-load-balancer-setting/

## 負荷分散タイプの設定

![スクリーンショット 2022-01-16 23.54.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555632/aae54875-7d01-7384-624b-90af2c10bd5a.png)

## バックエンドの設定

### GCEで作成したインスタンスグループを設定する

![スクリーンショット 2022-01-16 23.59.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555632/0f136838-3714-a865-8490-ef231cecbae4.png)

### ヘルスチェックの設定

> サーバが動いているのか、ダウンしているのかをロードバランサが判定して、ダウンしているサーバにはアクセスを向けないようにする設定

https://sys-guard.com/post-16032/

![スクリーンショット 2022-01-17 0.02.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555632/a9c94c78-1040-8c10-94bd-fea85885f147.png)

# フロントエンドの設定

![スクリーンショット 2022-01-17 0.14.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555632/3ec9c65b-d8d6-4e47-d4c0-4da76c71feba.png)

IPポート番号にアクセスすると`GCE`インスタンスに振り分けされる
![スクリーンショット 2022-01-17 0.57.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555632/b80d6a9e-1d82-b127-5f55-172c072044bf.png)


# さいごに

読んでいただきありがとうございます。
いいねしていただけると記事執筆の励みになりますので、参考になったと思った方は是非よろしくお願いします！