OmniAICreator/Qiita-1.07M huggingface dataset:
YouTube Liveでの勉強会用にアカウントを分ける技術

## はじめに

オンライン勉強会などでYouTube Liveを使うものがあります。YouTube Liveでの勉強会の醍醐味はやはりチャット欄での実況ですが、普段遣いのアカウント名を晒したくないこともあると思います。そういった場合の対処法です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2542067/d3bfda66-c372-f15d-18bc-c654661adb72.png)

## チャンネルを作ろう
タイトルでアカウントと言いつつズレてるのですが、YouTubeでは同じアカウントで複数のチャンネルを作り、切り替えることができます。勉強会用のチャンネルを作ることで、冒頭の問題を解決できます。

### チャンネル作成手順
チャンネル作成が初めてなら「チャンネルを作成」、すでにチャンネルがあるなら「設定」を押します。「チャンネルを作成」は画面通りに進めたら作れるはず。
![SCR-20231006-otug.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2542067/423ec44c-55cd-903c-a0d0-5473c35530dd.png)

赤枠のところを押す
![SCR-20231006-ovog.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2542067/7ca05364-6de7-9a5f-9f73-ac2ac599e6ba.png)

ここを押したら後は流れで
![SCR-20231006-oweh.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2542067/213611ea-5057-4839-7cbb-bf54741cfbbd.png)

### チャンネルを切り替える
ここから切り替えられます！
![SCR-20231006-owqa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2542067/c55ec6b5-f69d-96cd-5b59-83579b2eb8a7.png)

## まとめ
オンライン勉強会で実況しよう！
sedで特定範囲行の内容を置換する

sed を用いてファイルの中身を変更する際などに特定の範囲内の値だけ対象にしたいときがある。
`sed -e 's/BEFORE/AFTER/'` などと記述する際に s の前に行数やパターン (アドレス) を記載することで変更範囲を絞ることができる。

行数は単純に数字で、パターンは `/` で囲んで記述する。
範囲は開始場所と終了場所をカンマ区切りで指定する。

```shell:2～3行目を置換
$ cat sample.txt
111
222
333
444
555
$ sed sample.txt -e '2,3s/^.*$/hoge/'
111
hoge
hoge
444
555
```

```shell:'fuga' を含む行から 'piyo' を含む行までを置換 
$ cat sample.txt
hoge
fuga
foo
piyo
nya
$ sed sample.txt -e '/fuga/,/piyo/s/^.*$/xxx/'
hoge
xxx
xxx
xxx
nya
```
静的解析ツールで生まれたSQLインジェクション

Security.Tokyo #2 で発表した、CakePHPの脆弱性 CVE-2023-22727の話です。
CakePHPはいいぞ
 
https://www.docswell.com/s/hoge/Z7VNMJ-2023-09-04-010055
Rails - Rspec で paralells test を利用して並列処理する ( create / migrate / prepare / setup / drop の違い )

# 公式

https://github.com/grosser/parallel_tests

# Gemfile

gem を追加して bundle install する

```
gem 'parallel_tests'
```

# database.yml

公式READMEの通り DB設定で環境変数を利用するようにする
この環境変数はテスト実行時などに自動的に paralells spec が付与してくれる

```yml
test:
  database: yourproject_test<%= ENV['TEST_ENV_NUMBER'] %>
```

# テスト実行

```
rails parallel:setup
rails parallel:spec
```

うまく行かない場合は以下でも良いかもしれない
`parallel:setup` / `parallel:prepare` コマンドは使わなくてもテスト実行できる

```
rails parallel:create
rails parallel:migrate
rails parallel:spec
```

何か思わぬエラーが起きた時は drop してからやり直すと良い

```
rails parallel:drop
```

# コマンド

## DB作成

```
rake parallel:create
```

結果の例

すべてのテスト用DBを作成してくれる

```
Created database 'example_test2'
Created database 'example_test4'
Created database 'example_test'
Created database 'example_test3'
```


## マイグレーション

すべてのテスト用DBをマイグレーションする

```
rake parallel:migrate
```

## Prepare

>Copy development schema (repeat after migrations)

```
rake parallel:prepare
```


developementのスキーマをコピーしてくれるようだ
テスト用DBがない状態でもDB作成・テーブル作成までしてくれる

ここでいうスキーマとは何かというと、schema.rb を見ているわけではなくて実際の development のデータベース内容を見てコピーしてるっぽい

なので例えばCIでの実行であれば、まずdevelopのDBを作成しておく必要がある

例:

```
RAILS_ENV=development bundle exec rails db:create db:schema:load
bundle exec rails parallel:prepare
```

自動テスト用のDB作成でマイグレーションファイルの内容を全て走らせていると時間がかかるので、このような方式のほうがテスト時間を縮められるかもしれない


## セットアップ

>Setup environment from scratch (create db and loads schema, useful for CI

```
rake parallel:setup
```

もろもろ準備してくれてテスト用DBを作成してくれるみたいだ

こちらはprepareとは違って実際のDBではなく schema.rb を見てそう
ただし `seeds.rb` も実行されるようなのでテストにseeds.rbの値を含めたくない場合は注意


## DB削除

すべてのテスト用DBを削除してくれる

```
rake parallel:drop
```



# チャットメンバー募集


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

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


# Twitter

https://twitter.com/YumaInaura


# 公開日時

2023-10-06
Inkscapeで複数ページにする（イラレのアートボードみたいな感じ）

## やり方

1. 左のサイドバーの一番下の`ページツール`をクリック
![inks01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526103/558d03db-166b-1b94-9b73-c80c0fd9f8fc.png)

2. 上部ツールバーの二段目がページツールになるので、一番左の`新規ページ`をクリック
![inks02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526103/a0cc76f8-ade9-eeaf-99cf-e53b4fa32e20.png)

3. ページが追加されて行きます。
![inks03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526103/48a22b00-4d3f-6baf-f5e0-d6ff1af0f2e3.png)
![inks04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526103/30842c0d-2601-ffd9-17a8-b4c7209c9165.png)
Salesforce: オブジェクト・レコード・項目・レポート

## はじめに
最近、新しい職場に転職し、新たなチャレンジとして**Salesforce認定アドミニストレーター**の資格取得の機会をいただきました。Salesforceの学びは刺激的で、私の成長をサポートしてくれると感じています。この経験と学びを共有するため、記事を随時更新していこうと思います。

**Salesforce基本用語徹底解説：初心者向け**

SalesforceはCRMツールとしての機能や役割が豊富であり、初心者には少々複雑に感じられるかもしれません。この記事では、Salesforceの基本的な用語をみんなが使っているExcelを使って例示し、初心者でも理解しやすいように説明します。
Excelの表は[こちら](https://www.dospara.co.jp/5info/cts_str_pcuse_excelfixedline.html)にサイトからお借りしました。

[![Image from Gyazo](https://i.gyazo.com/7f72ae2c5e5bfd2463e567ef64e482b2.png)](https://gyazo.com/7f72ae2c5e5bfd2463e567ef64e482b2)


## 1. オブジェクト (Object)
- **Excelでの例**: シートタブ
- **説明**: Salesforceでの「オブジェクト」は、Excelの「シートタブ」のようなものです。異なる種類のデータを管理するための「箱」としての役割を果たします。例えば、会社情報や商談情報など、異なるデータカテゴリごとにオブジェクトを使用して管理します。
 [![Image from Gyazo](https://i.gyazo.com/7a760ceaa4601d45340d2cf7143bea49.png)](https://gyazo.com/7a760ceaa4601d45340d2cf7143bea49)

## 2. レコード (Record)
- **Excelでの例**: 1行1行のデータ
- **説明**: Salesforceでの「レコード」は、Excelの各行のデータに相当します。例えば、ある商談の詳細情報や、ある顧客の連絡先情報などがレコードとして保存されます。
 [![Image from Gyazo](https://i.gyazo.com/3b58cd0f151e31454b42674f57752cce.png)](https://gyazo.com/3b58cd0f151e31454b42674f57752cce)

## 3. 項目 (Field)
- **Excelでの例**: 列（例：名前、電話番号、メールアドレスなど）
- **説明**: Salesforceの「項目」は、Excelの列に該当します。特定の種類のデータを保存するためのフィールドとして機能します。例えば、商談オブジェクト内には「商談名の項目」や「金額の項目」などが存在します。
[![Image from Gyazo](https://i.gyazo.com/b5a926fc0c58f472bcaf322643622905.png)](https://gyazo.com/b5a926fc0c58f472bcaf322643622905)

## 4. レポート (Report)
- **Excelでの例**: グラフや集計表
- **説明**: Salesforceの「レポート」は、データを可視化・集計するためのツールです。Excelのグラフや集計表のように、保存されているデータを基に情報を可視化し、分析や意思決定のサポートとなります。
[![Image from Gyazo](https://i.gyazo.com/75bf63b0672f2d75f9b0bb7b8a8816b5.png)](https://gyazo.com/75bf63b0672f2d75f9b0bb7b8a8816b5)

## まとめ

| 用語       | Excelでの例            | 説明                                                                                   |
|------------|------------------------|----------------------------------------------------------------------------------------|
| オブジェクト | シートタブ             | Salesforceの「オブジェクト」はExcelの「シートタブ」のようなもの。異なる種類のデータを管理。|
| レコード   | 1行1行のデータ         | Salesforceの「レコード」はExcelの各行のデータに相当。例: 商談の詳細情報など。                |
| 項目       | 列（名前、電話番号など） | Salesforceの「項目」はExcelの列に該当。特定のデータを保存するフィールドとして機能。        |
| レポート   | グラフや集計表         | Salesforceの「レポート」はデータを可視化・集計するツール。Excelのグラフや集計表に相当。   |


## 終わりに
私もまだSalesforce認定アドミニストレーターの資格取得への道を歩み始めたばかりです。疑問や困難に直面することもあるかと思いますが、一緒にそれを解決していく過程を楽しんでいきたいと思います。

Salesforceを学ぶ際、多くの用語や概念に圧倒されるかもしれませんが、身近なツールとの比較を通じて理解を深めることができます。この記事を通じて、Salesforceの基本的な概念や用語の理解が少しでも進んだことを願っています。

## 参考文献
https://youtu.be/OuyAEmlehtU?si=CvGReiQq_KUDGabz
「ChatGPT(有料) vs Bing Chat(無料)」今話題のAIの性能を検証してみた！

# 概要
皆さんは``ChatGPT``についてはご存知だと思いますが、最近話題のAIベースの検索エンジン``「Bing Chat」``についてご存知でしょうか？？
どちらもすごく高性能なAIで、``ChatGPT``は``チャット bot``、``Bing Chat``は``検索エンジン``と名称や性能が若干違います。
今回は``ChatGPT``と``Bing Chat``のメリット、デメリット、得意、不得意を検証してみました！

:::note warn
私は初学者のため、間違った情報があればコメントなどで教えていただけると幸いです。
GPT-3.5に関しては~~個人的に嫌い~~なので検証しません。
:::

## Bing Chatとは？
BingはMicrosoftが作った検索エンジンです。
BingAIはChatGPT同様、対話型AIとして、雑談や質問に答えたり、創作物の執筆やプログラミングを手伝ったりなどができます。

また、画像生成AIとして、ユーザーのリクエストに応じて画像を作成したり、既存の画像を加工したりなども可能です。


## 検証1
どちらも画像を送る機能があるため、それを活かしでプログラミングコードを生成させてみた。
#### ChatGPT-4
下記が送った質問です。
個人開発の際に作成した簡易的な画面遷移図を送ってみました。
![スクリーンショット 2023-10-05 20.10.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516334/40effb93-2af8-f6ba-c0d9-6da5d284113d.png)
下記がその返答です。
![スクリーンショット 2023-10-05 20.11.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516334/bf069c24-657f-8318-7aef-91de94e39ec1.png)
そしてこのコードをコピペしてできた画面がこちらです。
よくカリキュラムであるような、簡易的な選択フィールド画面が一瞬で出来ました！すごいです。
![スクリーンショット 2023-10-05 19.41.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516334/51c0e5f0-66f8-ff25-da76-784e3c74a240.png)
#### Bing Chat
同じ質問と画像を送ってみます。
![スクリーンショット 2023-10-06 16.15.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516334/881f8237-df6e-995a-0588-e9901d1ee114.png)
下記が回答です。![スクリーンショット 2023-10-06 16.16.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516334/b7ddd045-9491-f7bf-5a6e-046fa5e92b53.png)
すでにコードが全然違いますね。
そしてこのコードで書いた画面がこちら
最低限といった感じですね！よくみるとChatgPTはBootstrap5を使ってくれていました。BingはBootstrap5の指定をすれば同じような画面ができていたかもしれませんね。![スクリーンショット 2023-10-05 19.45.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516334/7adf40e4-4d61-25d9-6325-baa81a645e3d.png)
### この検証で感じたメリット、デメリット
#### Bing Chatで感じたメリット
・無料と思えば十分な機能
・会話のスタイルを下記の3種類から選択できる
・より創造的に
・よりバランスよく
・より厳密に
#### 感じたデメリット
・流石に有料のGPT-4には性能は劣る。
・コードを提案させた際の回答時間が長すぎる(GPT-4では回答が終了するまで20秒ほどで終わったが、Bingでは1分かかった)
・会話のスタイルによって文字数制限が3000~4000と決まっていて、比較的短い文章しか送れない。
#### ChatGPT-4で感じたメリット
・コード生成スピードが速い
・コードの質が高い
・送れる文字数が多い
・回答速度が速いためやり取りしやすい
#### 感じたデメリット
・直接感じたわけではないが月3000円程かかる
## まとめ
今回のプログラミングコードを生成させるといった検証では``ChatGPT-4``の圧勝かなと感じました。
しかし、``Bing Chat``の最大の売りは画像生成機能だと思っています。
(GPTでもプラグインを使えばできるらしいですが、質は劣るらしい)
なので、目的によって使い分けるべきだと感じました。
pythonをインストールしてみました。

pythonをインストールしたのでメモとして手順を残しておきます。
※記事は2023/10時点のものです。
pythonの概要についてはこちら
https://ja.wikipedia.org/wiki/Python

１．インストールサイトに移動します。
　　以下のリンクをクリックしてください。
　　　https://www.python.org/

２．この画面の一番下までスクロールします。
　　（今回はWINDOWSを選択してます）
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/0d59b246-e119-0d75-fa85-521c89ea1640.jpeg)
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/abcecf24-88df-faf2-7613-3aab9c3bcb04.jpeg)

３．現時点の最新（3.12.0）をクリックしま.しょう.
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/4f10f342-8f41-d6e8-811d-5fb8e5e33638.jpeg)

４．この画面に遷移したら、下の方のFilesと書いてあるところまでスクロールします。
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/a788f4f6-bfe3-e41a-8598-018976d5d754.jpeg)
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/14f12664-0f8e-3178-bbc3-17a38eaebd17.jpeg)
インストーラをダウンロードします。
32-bit、64-bitの選び方は、WINDOWSボタンをクリック、設定＞詳細情報を選択、デバイスの仕様の中、システムの仕様で確認できます。


５．ダウンロードが完了したらインストーラを起動しインストールします。
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/538d7ceb-911e-52cd-f0cb-9e76c92667a7.jpeg)
↑↑↑↑　実は後から気が付いたのですが、
　　　「Add python.exe to PATH」のクリックを推奨します。
　　　チェックを入れると、コマンドプロンプトにPATHが紐づけられ、
　　　起動時に悩まなくて済みます。　　↑↑↑↑

６．無事インストール完了しました。
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571777/440bc9bd-cc6e-9d5e-3849-15f880a6081c.jpeg)

７．その他
pythonには沢山のライブラリが装備されいますが、
追加インストール分もあらかじめバンドルされているanaconda miniconda等もあります。ただ、便利な反面ライブラリのバージョン管理が手間になったり、使わないものが入っていて容量を食うこともあるかもしれません。メリデメ考えて選択すると良いかもしれませんね。


https://note.nkmk.me/python/
「標本サイズnがいくらあれば標本平均は正規分布とみなせますか？」の話　前編〜ググってみた

# 背景

　タイトルのやりとりはネット・SNS上でもときどき見かけることがあります。言葉遣いの違いで実質同じと考えられる問いをいくつか挙げると、

- 「標本サイズnがいくらあれば標本平均は正規分布とみなせますか？」（タイトルの再掲）
- （標本平均の議論で）「nが大きいってどのくらいなら十分な大きさですか？」
- 「中心極限定理を用いて近似してもいいですか？」

というようなものです。

https://twitter.com/math_ring8128/status/1697936810079654198

　前提事項として、中心極限定理が成り立つ状況、つまり母平均・母分散は有限と仮定します。この条件は明示的に言及されないことも多いですが、満たしてなければ上記の問いはナンセンスなので、そこは大丈夫としておきましょう。

　中心極限定理（central limit theorem）は、標本平均が漸近的に平均$\mu$、分散$\frac{\sigma^2}{n}$の正規分布にしたがうという定理です。母平均と母分散が存在するだけで成り立つ強力な定理ですが、n→∞での振る舞いについての定理なので、有限のnのときの標本平均の分布を教えてはくれません。

　さて、先の問いに（母集団によらず）「○○以上でOK」と答えられるでしょうか？
　前編では、巷で見受けられる「○○以上」の○○がどのくらいとされることが多いか調べてみます。

# ググってみた結果

　「一般の母集団に対して標本平均の分布が正規分布に近づくのに十分な標本サイズ」について、それが存在するのかも含めてGoogle検索してみました。

## n = 30でいい説

　「30以上」は結構な数ありました。
　例をいくつか。

https://bellcurve.jp/statistics/blog/14257.html

> 皆さんの中には、t 検定をするとき、サンプリングしたデータが正規分布に従っているか心配で仕方がないという人がいるかもしれませんが、実のところそれほど心配する必要はありません。中心極限定理によって母集団がどんな分布であっても「標本平均の分布は正規分布に従う」ことが分かっているからです。「標本平均の分布」とは、同じ母集団から何度も無作為抽出（実験の場合は無作為化）を繰り返して、その度に計算しなおした場合の標本平均のバラツキ具合です。この標本平均の分布は、母平均 μ を中心とし母標準偏差を標本の大きさ n の二乗根で割った値（母標準偏差／√n ）を標準偏差とする正規分布になります。標本の大きさ n が大きくなるほど正規分布に近づき、n が30にもなればほぼ正規分布に一致します。なお、母標準偏差／√n のことを標準誤差というのは「標準誤差」の記事で書いたとおりです。

https://kyoto-edu.sakura.ne.jp/?&year=2023&semester=none&id=R&course=statistics&content=z-test

> 一般的にサンプルサイズが30(N=30)以上の時に標本平均の分布は正規分布に従う（中心極限定理）と仮定して構わないとされている。また母集団が正規分布であれば、Nの数にかかわらず、標本平均は正規分布に近似する。

https://corvus-window.com/whats_clt/

> 母集団の分布が正規分布とかなり異なる場合は，ある程度サンプルサイズが大きくなるまで正規分布に近づきません．どの程度のサンプルサイズで標本平均が正規分布に近似するかは母集団の分布に依存します．
> 
> 一般的にはn≥30の場合に，標本平均の分布は正規分布とみなして統計解析を行うことが多いです．

　これは、標本平均の分布が正規分布に近づく速さが母集団の分布によることに触れています。

https://twitter.com/Vcampus_Kyoto/status/1698030289132654985

## n = 100〜1000でいい説

　「［100〜1000］以上」もぽつぽつ見ました。
　例を一つ。

https://atarimae.biz/archives/17470

> 厳密には n→∞ について述べた定理ではあるのですが、早いものなら n=100 程度、そうでなくても n=1000 程度あれば大抵のケースで正規分布に近似できてしまうのが中心極限定理の特徴です。

　これは、暗黙的に母集団の分布により近似が適用できる標本サイズは変わる（100、1000）と言っています。

## n = 5でいい説

　見つけた中で最小は「5以上」でした。

https://sigma-eye.com/2019/05/21/daisu-and-chuushinkyokugen/

> そして中心極限定理ですが、大体N=5以上になると元が一様分布だろうが、二項分布だろうが、非対称な分布であろうが大抵の標本分布は正規分布と区別できなくなります。

　かなり思い切った、というか思い切りがよすぎるのでは…。
　まあ、一様分布や二項分布（p ≈ 1/2）ならそう間違ってもないのですが。

## 基準はない説

　実際のところ、母集団によりけりなので、一般に基準を示すのは無理があるようです。
　一様分布などでは標本平均はすぐに正規分布に近づきます。
　歪んだ分布の場合は、歪みが標本平均に反映されてしまい、その歪みがなくなるのに必要な標本サイズが大きくなるので正規分布への漸近が遅くなります。

https://twitter.com/willyoes/status/1698053428998541372

https://twitter.com/genkuroki/status/1698004862196490460

> サイズnの標本の標本平均の分布の正規分布による近似の誤差の大きさは、母集団分布に依存します。
> 
> 母集団分布によっては、小さなn(例えば10程度)でも実用的に十分な近似になることもあるし、実践的には無理なほど非常に大きなnが必要になる場合もあります。

> 標本平均の分布の正規分布近似の誤差は、母集団分布がほぼ左右対称で裾が太くなければ小さなn (例えば10～20程度)で十分に小さくなりやすいです(例：一様分布)。
> 
> しかし、左右非対称で裾が太い母集団分布では大きめのnが要求されるようになります(例：対数正規分布)。
> 
> このように、中心極限定理による実用的な正規分布近似で必要な標本サイズnの大きさは、母集団分布に強く依存し、必要なnの見積もりには未知の母集団分布の形に関する予測が必要になります。
> 
> 母集団分布の形を無視して「nが100以上ならば大丈夫」のように言うのは誤りになります。

　分布を例示しながら注意深く説明していると思います。
　どんな場合もウソにならない言い方をするとしたらこういう風になるでしょう。

# 前編まとめ

　標本平均の分布が正規分布に近づくのに十分な標本サイズとして、「30以上」や「100以上」といった数が示されることがある。これはよくある分布の場合での経験則のようなもので、一般の母集団でいえるわけではない。

　このことを乱数実験で観察してみましょう。（後編に続く！）
【Power Automate】チームに所属するメンバーに対しての操作

# はじめに

同じチームに所属するメンバーにタスクを割り当ててplannerで管理するなど、
power automateとteamsを用いてフローを自動化している中で気がついたのですが、
「@チーム名」の全体メンションがpower automateでは使えないとのこと。。

メンバーの入れ替わりの際にその都度flowをメンテする（ユーザーの個別メンション）のが手間に思い何かいいものがないかと模索してみました。

# 前提条件
1. 所属するteamにおいて「全体連絡用」などの名でメンバー全員が含まれるタグを作成しておくこと

# 具体的な処理
例えば、以下のようにpower automateで何かの操作をトリガーチーム内に所属するメンバーに対してタスクを割り当てたいflowがあるとします。

- before
今までは「個人のメンショントークンを取得→変数に格納→タスク割り当てに使用 × 所属するメンバー人数分」のflowを実施していました。

- after
以下のように「タグのメンバーを一覧表示する」機能を使うことで「全体連絡用タグ」に追加しているメンバー全員のユニークなIDが取得できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536824/c59128bf-ba8e-2981-72de-882de7206b55.png)

おそらく、以下のドキュメントにあるような機能がpower automateのflowにも実装されている様子。

https://learn.microsoft.com/ja-jp/graph/api/teamworktagmember-list?view=graph-rest-1.0&tabs=http

ドキュメント内に応答例として以下の記載がありますが、このレスポンスにおける「"userId"」が今回使用したいパラメータとなります。

```http
HTTP/1.1 200 OK
Content-Type: application/json

{
  "value": [
    {
      "@odata.type": "#microsoft.graph.teamworkTagMember",
      "id": "MjQzMmI1N2ItMGFiZC00M2RiLWFhN2ItMTZlYWRkMTE1ZDM0IyNlYjY1M2Y5Mi04MzczLTRkZTYtYmZlYy01YjRkMjE2YjZhZGUjI2QzYjJiM2ViLWM0N2YtNDViOS05NWYyLWIyZjJlZjYyMTVjZQ==",
      "displayName": "Grady Archie",
      "tenantId": "18be64a9-c73a-4862-bccc-76c31ef09b9d",
      "userId": "92f6952f-61ca-4a94-8910-508a240bc167"
    },
    {
      "@odata.type": "#microsoft.graph.teamworkTagMember",
      "id": "MjQzMmI1N2ItMGFiZC00M2RiLWFhN2ItMTZlYWRkMTE1ZDM0IyNlYjY1M2Y5Mi04MzczLTRkZTYtYmZlYy01YjRkMjE2YjZhZGUjI2QzYjJiM2ViLMW0N2YtNDViOS05NWYyLWIyZjJlZjYyGHVjZQ==",
      "displayName": "Lee Gu",
      "tenantId": "18be64a9-c73a-4862-bccc-76c31ef09b9d",    
      "userId": "945fe02a-5dc1-4d28-bf5c-30a6147fe842"
    }
  ]
}
```

上記で取得できた値を「タスクを生成する」flowにてユーザーIDに指定してあげることで
個別にわりあてされたタスクを作成することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536824/f9a5f457-06b1-2aa2-4fb4-545ac2038397.png)



# まとめ
現状はチーム全体メンションを扱えませんが、このように全体向けのメンションを管理しておくことで、
メンバーの入れ替わりの際にタグをメンテナンスすることでflowはそのまま利用することができます。
今回例にあげたタスクを作成するだけでなく、全体に向けたアナウンスのフローにも同じタグが利用できると思うので1つ作成しておいても損はないのかなと思いました。
VScodeでAWS EC2の連携


vscodeでAWS EC2インスタンスを開くことができるように、環境構築をした。
しかし、原因不明だが、「SSHへの接続を確立できません：処理がタイムアウトになりました」と表示さされ、vscodeからAWSに接続しLinuxを開くことができなくなった。

再度連携するために行なったことを忘れないように記述しておく。


AWSにログインし、AWSのEC2インスタンスが実行中であったが停止する。

インスタンスを開始する。

接続しているインスタンスIDをクリックし、パブリック IPv4 DNS（画面右上）をコピーする。

VscodeのConfigファイルにコピーした、パブリック IPv4 DNSを貼る。（元のから書き換える）
（多分IPアドレスが変わった）

接続する。完了。
AWS CLIでの接続エラー


<h2>事象</h2>

AWS CLIを使用してEC2を表示しようとしたところ下記​エラーが発生。なおEC2接続等他のコマンドでも同様のエラーが発生。aws configure、IAM権限周り異常なし。
$ aws ec2 describe-instances
An error occurred (AuthFailure) when calling the DescribeInstances operation: AWS was not able to validate the provided access credentials

<h2>原因</h2>

接続元の端末の時刻(JSP)がずれていたことで、リクエストエラーが発生していた模様。端末の時刻設定を見直したところ解消。。

別件だが、AWS主催の研修に参加した際にラボ環境へのログインできないことがあった。手元のPCの時刻設定を見直したところ接続できた。今後とも時刻同期には気をつけたい。。
nginxのディレクトリパターンマッチ

Nginxのパターンマッチ

||プレフィックス|説明|マッチしたとき|
|:-|:-|:-|:-|
|A|なし|正規表現とのマッチありの前方一致。|ここでマッチしたとしても以降のD,Eで指定される正規表現にマッチしたらそちらが後勝ちする|
|B|^~|正規表現とのマッチなしの前方一致。|ここでマッチすれば打ち止めてアクション実行|
|C|=|正規表現とのマッチなしの完全一致。|ここでマッチすれば打ち止めてアクション実行|
|D|~|正規表現マッチ（大文字・小文字を区別する）。A,B,Cのマッチに失敗したとき、もしくはAがマッチしたときにマッチ実行される。|
|E|~*|正規表現マッチ（大文字・小文字を区別しない）。A,B,Cのマッチに失敗したとき、もしくはAがマッチにもマッチ実行される。||

ポイントは、プレフィックスなしAと正規表現マッチD,E(~,~*)をペアで考えるということである。
プレフィックスなしマッチAは、後で正規表現マッチD,Eで上書きされ得る、という相互関係がベースにある。
そしてAの上書きされないバージョンとしてのB(^~, 正規表現とのマッチなしの前方一致)がある。

たとえば、
```
location /static/ {  # Aプレフィックスなし
}
```
```
location ~ \.png$ {  # D正規表現(大文字小文字区別する)
}
```

このとき、正規表現D(~)が、先行する前方一致Aに優先する例外パターンとして機能している。つまり、プレフィックスなし/static/への設定に、正規表現D(~)での設定が優先されるのである。このように、プレフィックスなしAと正規表現パターンD,E(~,~*)との間には、「一般パターンとその例外」という基本構造がある。

さらに例外を上書きする例外として、「正規表現による例外によっても上書きされない強力な指定」としてのB(^~, 正規表現とのマッチなしの前方一致)が加わっている。この例として、先程の例にさらに以下が追加してあったとしよう。

```
location ^~ /static/js/ {   # B
}
```

これにより、「/static/js/の配下にある*.pngファイル」はAの指定にもDの指定にマッチしなくなり、Bとしての設定が適用される。
ラズパイにcmakeをインストールする

これまでWindowsやUbuntu(Linux)で使用していたcmakeをラズパイでも使用したくなり、インストールした時のメモです。

使用ラズパイ：
Raspberry Pi 3 Model B Plus Rev1.3

・まずはapt-getを更新
$sudo apt-get update

・cmakeをインストール
$sudo apt-get install cmake

早速cmake-guiを起動しようとすると、・・・***無い***。
そもそも別物か。

・改めてcmake-guiをインストール
$sudo apt-get -install cmake-gui

・起動
$cmake-gui

cmakeの最新版は3.27.6(2023年10月現在)ですが、apt-getでインストールされるcmake-guiは3.18.4で少し古いです。

でも、見慣れたcmake-guiの画面が出てきたので一安心。
nRF9160 開発ボード ２強

私の独断と偏見によると、

2023年10月現在において、
日本国内での nRF9160 開発ボードは、
以下の２つが最強だと考えている。



スイッチサイエンス nRF9160搭載 LTE-M/NB-IoT/GNSS対応 IoT開発ボード

https://www.switch-science.com/products/8999



Icarus SoM DK

https://www.actinius.com/icarus-som-dk



以下も加えたいところだが、技適がないのと外部フラッシュが4MiBしかないので外した。

SparkFun Thing Plus - nRF9160

https://www.sparkfun.com/products/17354





上記、２者の良い点は、

・nRF9160が、最新の B1 版
・技適あり
・外部spi-norが 8MiB （フルモデムアップデートをFOTAで行う際に4MiB必要になる）
・Nordic nRF9160DK のように余計なパーツが大量についていない

といったところだ。


ただし、Actinius icarus だが、
ボードファイルは som dk を使わずに som 用のボードファイルを使わないと
正常にコンパイルできないという問題があるので注意が必要。
当然、デバイスのオーヴァーレイファイルは自力で用意する必要がある。
また、日本国内での取り扱いがない。

スイッチサイエンス版は、
最近発売されたばかりだが、とくに大きな問題はないように思われる。



以上、ご参考まで。
FirebaseCrashlyticsの導入、クラッシュレポートが作成されない

## 事象
クラッシュを起こしてもクラッシュログが作成されず、FirebaseコンソールのCrashlyticsトップ画面から切り替わらない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245300/8ffe7ea7-05f3-b6c2-dc53-a1055c833b98.png)

クラッシュトリガーはドキュメントのものを利用
```HogeSwiftUIView.swift
Button("Crash") {
  fatalError("Crash was triggered")
}
```


## 結論
SPMでFirebaseを追加した時、Targetを選択していなかったため、Crashlyticsがプロジェクトに組み込めていなかった。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245300/e41352d0-c482-6eb8-ed60-ff922a2e4416.png)

TargetのGeneralのFrameworksにFirebaseCrashlyticsを追加することでクラッシュレポートが上がるようになった。


## 導入したときの手順
Firebase Crashlytics を使ってみる
https://firebase.google.com/docs/crashlytics/get-started?authuser=0&_gl=1*1jxmrmj*_ga*NTAxODA3ODUuMTY5Mzc4ODk1OA..*_ga_CW55HF8NVT*MTY5NjU1NTI5NC4xNy4xLjE2OTY1NjAwOTguNDkuMC4w&hl=ja&platform=ios

1. SPMで`https://github.com/firebase/firebase-ios-sdk`を追加
1. インポート`import Firebase`
1. FirebaseAppインスタンスを構成`FirebaseApp.configure()`
1. dSYM ファイルを自動的にアップロードするように Xcode を設定
1. 強制的にテスト クラッシュ（シミュレータをXcodeデバッガから切断してからクラッシュ→そのまま再実行・Xcodeから再実行）
1. デバッグロギングを有効化
1. 5.を再度実行

上記を実行しても駄目で、この状態だった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245300/8ffe7ea7-05f3-b6c2-dc53-a1055c833b98.png)


## 原因
Xcodeのコンソールログを確認しても`Completed report submission`のログが無かったため、そもそもCrashlyticsの導入に失敗していそうであったので、プロジェクトのFrameworksを確認するとCrashlyticsが無かったので追加したところ、ログが出るようになった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245300/e91ca22d-d363-07da-c057-cde2680d91b8.png)

Firebaseのコンソール画面もくるくるしだした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245300/e669a828-e963-6cd3-7d37-67b5dca0e6c5.png)

# おまけ
## カスタムキーがFirebaseコンソール画面のクラッシュイベントに反映されない
「FirebaseCrashlyticsのクラッシュレポートのカスタマイズ」に沿ってカスタムキーを設定したが、FirebaseCrashlyticsのコンソール画面に反映されなかった。

```
// Set int_key to 100.
Crashlytics.crashlytics().setCustomValue(100, forKey: "int_key")

// Set str_key to "hello".
Crashlytics.crashlytics().setCustomValue("hello", forKey: "str_key")
```

### 原因
`FirebaseApp.configure()`より前に`setCustomValue`していたことが原因だった。
EC2にsshで接続するときに`Permission denied (publickey)`になって困ったら

## 問題
ひさしぶりにEC2にsshで接続しようとすると、`Permission denied (publickey)`となって困る。

## 解決方法
[EC2 インスタンスにアクセスしようとすると、「Permission denied (publickey)」または「Authentication failed, permission denied」というエラーが表示されます。これを解決するにはどうすればよいですか?](https://repost.aws/ja/knowledge-center/ec2-linux-fix-permission-denied-errors)を順に確認すればたいてい解決する。

今回は`/home/ec2-user/.ssh/authorized_keys`が無くなっていたので、手順に従って追加し、sshをやり直せば成功した。
[Rails]あなたのコードを半分にできるかもしれない？？ 知って得するnil制御 ~presence編~

## 伝えたいこと
:::note info
ボッチ演算子はすごい
presenceはすごい
:::

## ~第1章~ はじまりのコード

**子供** 「ねぇねぇ父ちゃん！僕の書いたコードを見てよ！」
**父親** 「おぉ、どれどれ。見せてみろ。」

```rb
name = nil
if @account.present? && @account.name.present?
  name = @account.name
else
  name = '未設定'
end
```

**父親** 「アカウントがあったら名前を取得し、名前がなかったら[未設定]の文字を取得したいんやな」
**子供** 「さすが父ちゃん！見ただけで一瞬でわかっちゃうだ！」
**父親** 「まぁな。`present?`を活用しているのはグッドだ👍nilや空文字など柔軟に判定してくれるからな」
**子供** 「でしょ！(実はネットに載ってたのコピペしただけだけど...)」
**父親** 「ただ、もう少し簡単にかけるな。**ぼっち演算子**って知ってるか？」
**子供** 「ぼっち演算子..？」
**父親** 「その様子だとまだ知らないみたいだな。結構便利な書き方だから調べてみ」
**子供** 「わかった！」

## ~第2章~ ぼっち演算子
〜数日後〜
**子供** 「父ちゃん！ぼっち演算子ってすげぇ！」
**父親** 「おっ。調べてみたのか」
**子供** 「うん。今回のif文の部分書き換えたから見てよ！」
**父親** 「おぉ、どれどれ。見せてみろ。」

```rb
name = nil
if @account&.name.present?
  name = @account.name
else
  name = '未設定'
end
```

**父親** 「おぉ、いいじゃないか」
**子供** 「ifの部分がわざわざaccountのpresentを確認しなくても良くなってスッキリした！」
**父親** 「わかってるじゃないか👏」
**子供** 「もうこれ以上簡単に書けないよね？」
**父親** 「そうだなぁ...ちょっと考えさせてくれ」

## ~第3章~ 父親のpresence無双
〜5分後〜
**父親** 「さっきのコード考えてみたから、ちょっとこい」
**子供** 「え？もう何か思いついたの？」
**父親** 「これみてみろ」

```rb
name = @account&.name.present? ? @account&.name : '未設定'
```

**子供** 「え？他のコードはどこいったの？」
**父親** 「さらにこうだ！！！！！✍️」


```rb
name = @account&.name.presence || '未設定'
```

**子供** 「わかんない！わかんない！父ちゃんの言ってることが！！何ひとつわかんないよ！！！涙」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83409/72ba04b8-75a4-8854-d9e5-75774411423d.png)
**父親** 「すまんすまん。説明するからちょっと落ち着くんだ。まず1つ目のやつから説明するぞ」

```rb
name = @account&.name.present? ? @account&.name : '未設定'
```
**父親** 「これは**三項演算子**といってな。`@account&.name.present?`この部分が真だったら`@account&.name`が呼ばれてそうじゃない場合は`'未設定'`が呼ばれるということなんだ」
**子供** 「....へ、へぇ....(いまいちわからん涙)」

```rb
name = @account&.name.presence || '未設定'
```
**父親** 「で、だな。2個目のものはその三項演算子すらも使わない書き方で...」
**子供** 「(えっ。使わないの？？？？)」
**父親** 「`presence`というのは`present?`に似ているのだが、内容があったら内容を返して、ない場合はnilを返すというものなんだ。」
**子供** 「う、うん..」
**父親** 「そうすると、内容があった場合は左側の`@account&.name`が採用されて、ない場合は`'未設定'`が使われるということになるんだ」
**子供** 「す、すげぇ...(僕はまだまだなんだな)」

## ~最終章~ その後の話
**父親** 「まぁこの辺りは慣れもある。別にお前の最初の書き方も悪いってわけではない。少しずつこういうテクニックを覚えていけばいいさ」
**子供** 「僕、頑張るよ！」
**父親** 「よし、今日はラーメンでも食いにいくか🍜」
**子供** 「やったー！！！」

こうして親子仲良くラーメンを食べに行ったのであった。
Svelte-kit を使って Vercel にデプロイしようとした時に詰まったこと

## 概要

Svelte-kit を使って構築したウェブアプリケーションを、
Vercel にいつものようにデプロイしようとした時に詰まったので備忘録を書いておきます。


## 解決に至った理由

Svelte kit のテンプレートをVercelにデプロイすると、
エラーが起きないことに気づき、どこが違うのかをbuild のログから見つけました。


https://vercel.com/templates/svelte/sveltekit-boilerplate

上のリンクがテンプレートです。

この時はビルドがうまく行きます。
![Screenshot 2023-10-06 at 15.31.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1840635/9acd6461-b990-bc53-058e-dac71f18a5f2.png)

しかし、私がデプロイしようとしているものについては、
![Screenshot 2023-10-06 at 15.31.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1840635/c7335663-2b75-4aea-4191-a86848af2f28.png)

このようなエラーとなっていました。


## 解決策


```
npm i -D @sveltejs/adapter-vercel
```

でインストールした後、

`svelete.config.js`の

`adapter-node`  を `adapter-vercel`に修正


```svelte.config.js
svelte.config.js
import adapter from '@sveltejs/adapter-vercel';

export default {
	kit: {
		adapter: adapter({
			// see the 'Deployment configuration' section below
		})
	}
};
```

することでデプロイに成功することができました。
Tencent Cloudの主要なサービス紹介

## Tencent Cloudとは
Tencent Cloudはゲーム事業やチャット事業などを手掛けるTencent社が提供しているパブリッククラウドサービスプロバイダーです。日本市場には2019年に参入し、主にエンターテイメント分野を中心に急成長しています。
この記事ではTencent Cloudの主なサービスを紹介します。

## Tencent Cloudのサービス紹介
近年のメタバースやリアルタイムコミュニケーション、映像音声関連の技術同行で注目されるサービスについて紹介します。

**リアルタイム、メディアコミュニケーション構成概要**
![スクリーンショット 0005-10-19 9.36.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300377/5e641043-2982-4471-5918-fddf30f7f38f.png)




### MPS
ビデオコンテンツの作成や配信におけるあらゆるニーズに応えることができる、最先端のメディアプロセッシングサービスです。大規模なマルチメディアデータ向けに提供されるクラウドベースのトランスコーディングとオーディオビデオ処理を可能とします。
画質を保ったまま動画ファイルのサイズを下げ、トラフィックやストレージのコスト削減も実現できます。
詳細な解説は[こちら](https://jp.vcube.com/sdk/blog/tencentcloud_mps)に掲載されています。
類似のサービスとしてはAWSのElemental MediaConvetがあります。

### CAR
アプリケーションをクラウドに移行し、リアルタイムのレンダリングやストリーミングを実行することができます。これにより、ユーザーはアプリケーションをダウンロードせずに、非力な端末で高機能なアプリを操作できます。
クラウドレンダリングを試した記事は[こちら](https://qiita.com/v-cube/items/06b586248f8d24bb1782)
クラウドレンダリングで動作している画面をCSSと連携させてライブストリーミングをする事も可能です。
類似のサービスとしてはAWSのAppStreamやUnrealEngineのPixelStreamingがあります。
これらの比較については[こちら](https://jp.vcube.com/sdk/blog/pixel_streaming_tencent_cloud_car)に掲載があります。

### CSS
Cloud Streaming Serviceは、エンドツーエンドのライブオーディオ・ビデオブロードキャストソリューションを提供するワンストップPaaSサービスです。安定したライブプッシュ機能、トランスコーディング、配信＆再生SDKなどのストリーム処理ライブラリなどが含まれます。大量の同時アクセスに耐えうる超低遅延、超高画質、超高性能を実現します。
2種類の配信方法があり、超低遅延配信では300ms~1s、標準配信では3s~10sの遅延に抑えています。
類似のサービスとしてはAWSのIVSがあります。

### VOD
Cloud Video on Demand（VOD）は、映像ファイルのアップロード、保管・ストレージ、リソースアセット管理、トランスコーディング、配信といった一連のオーディオ・ビデオ通信アプリケーション機能を備えた、ワンストップVPaaS（サービスとしてのビデオプラットフォーム）ソリューションです。

### UGSV
ショート動画SDKはTiktokのような簡単なショート動画が作成できます。
トランスコーディング、ストレージ、オンデマンド配信などクラウドサービスとシームレス連携し、ショートビデオサービスが迅速に実装する事ができます。

### EdgeOne
Tencentが長年培ってきたセキュリティ能力を統合し、DDoS防御、Web保護、Bot保護などの主流の保護機能を提供しています。パフォーマンスが向上すると同時に、セキュリティ機能も大幅に向上します。セキュリティとアクセラレーションの2つの側面から、Webサービスの安定性をサポートします。
類似のサービスとしてはAWSのCloudFrontがあります。

### GME
ゲームに対するプレイヤーの没入感を高め、プレイヤーを魅了する、ワンストップのゲーム音声ソリューションです。
SDKがあらゆるシーンの音声インタラクションニーズをカバーし、ゲームのSNS化を手軽にサポートします。また、没入感のある空間インタラクションサウンドによって、プレイヤーは友だちとの距離や方向を音声で判断することが可能となるため、臨場感あふれるゲーム体験をプレイヤーに提供することができます。

### EffectSDK
EffectSDK（美顔エフェクトSDK）は、Tencentが自社開発したAI機能とリアルタイムエフェクト処理技術を活用し、様々なビデオ運用シーン向けに豊富な機能を提供します。バーチャル背景やフィルター処理などが実現できます。
[こちら](https://jp.vcube.com/sdk/blog/tencent_effect)に詳細な解説が掲載されています。

### Chat
Chatは、インタラクティブなライブストリーミングチャットルーム機能を提供します。チャットルームの人数に上限はなく、億単位のメッセージの同時送信をサポートします。投げ銭やリアクションなど、複数のメッセージタイプを手軽に実現できます。


## 最後に
[**Tencent Cloudに関するお問い合わせはこちらから**](https://jp.vcube.com/form-inquiry-md06-tencent.html)
AWS Proton CodeBuild ProvisioningでDelete Failedとなったときの対処方法

Proton結構いいなと思って触っています。

AWS Proton CodeBuild Provisioning で、テンプレートの作成が不味く、プロビジョニングが失敗したときの対処方法を書いておきます。

私が陥ったのは、schema.yamlのrequireにtypoで存在しないパラメータを指定してしまったことで、デプロイもアンデプロイもできなくなった状態です。
以下のファイルでは必須のパラメータとしてparamを指定していますが、実はパラメータとしてはparam1しかないという状況です。

```yaml
schema:
  format:
    openapi: "3.0.0"
  service_input_type: "ServiceInputs"
  types:
    ServiceInputs:
      type: object
      description: "Input properties for my environment"
      properties:
        param1:
          type: string
          title: "パラメータ1"
        required:
          - param
```

テンプレート登録の際に失敗すればよいのですが、登録できてしまいます。
そしてこのサービステンプレートからサービスを作成するときに不幸が訪れます。

サービスインスタンスのデプロイに失敗し、アンデプロイも失敗し、サービスインスタンスが削除できなくなります。

## 対処法

新しいテンプレートを作成し、新しいメジャーバージョンとして登録します。
その後、aws cliを用いて、サービスインスタンスのバージョンのアップデートを実施します。

```bash
aws proton update-service-instance --deployment-type MAJOR_VERSION \
  --template-major-version 2 --spec "<スペック>" \
  --name instance-1 --service-name service-1 
```

スペックは以下のように、aws proton get-service-instance コマンドで取得できますが、
`aws proton get-service-instance --name instance-1 --service-name service-1`

以下のようなyamlです。

```yaml
---
proton: "ServiceSpec"
pipeline: {}
instances:
- name: "instance-1"
  environment: "env-1"
  spec:
    param1: ""
```

これでうまくデプロイできれば、あとはコンソールから削除することができます。
削除するためには一度、デプロイに成功しないといけないのですね。

失敗したときように削除専用のテンプレートを作成しておくと便利かもしれません。

まだまだ触り始めたばかりでメジャーバージョンアップはもう少し先だなと思っていたのですが、削除できなくなるトラブルで思いのほか早く試すことになりました。

今後、もう少しProtonのこと試していきたいなと思います。
新しいリモートリポジトリを作って、git pushするまで。

# 1.リモートリポジトリを作成
Github, Backlog, Bitbuckerなどのリモートリポジトリを作成するサービスでリモートリポジトリを作成します。
Githubなんかは新しいリモートリポジトリを作ると、次に何をすればいいのか、全部表示してくれるのでそれを見れば事足りますね。


# 2.ローカルリポジトリを初期化
ローカル環境でローカルリポジトリを作る（.gitファイルを作成)したり等の作業が必要なので、一度ローカルリポジトリの初期化をします。

ターミナルを立ち上げてプロジェクトフォルダの階層にcdして、以下のコマンドを入力しましょう。

```terminal
$ git init
```

これを実行すると、ターミナルに何も出力されませんがプロジェクトフォルダの一番上の階層に.gitファイルが作成されます。
そうなると実行完了した合図です。

エラーの場合はエラーメッセージが出力されます。例えばcommand not foundなどが出た場合はそもそもgitが入っていないので、入れてください。

# 3. gitignoreを作成して、リモートリポジトリへ送りたくないファイル、フォルダを書いていく
例えばnode_modulesのようなモジュール系やpackage-lock.jsonなどは重たいですしnpm installをすればいい話なのでリモートリポジトリに持って行かない方がいいでしょう。
他にも.envのようなプロジェクトの重要な情報が入っているファイルも避けるべきです。

フレームワークを使っている場合はそもそも最初からそこら辺はやってくれていますが、自力で行う場合は以下のように書いて.gitignoreファイルをプロジェクトフォルダの一番上の階層に置きます。(.gitがあるところです)

```.gitignore
.DS_Store
package-lock.json
.htpasswd
node_modules/
```

書き方は、.gitignoreが存在している階層から書き出してしまってOKです。

例えば、プロジェクトのルートディレクトリに今回は.gitignoreがあるので、同じ階層にあるpakage-lock.jsonはファイル名だけ書けば良いことになります。
他にも、同階層にあるmode_modulesフォルダは、中身全てをgitに上げないで欲しいので、この様な書き方になります。

# 4.ローカルリポジトリの内容を一度コミット
リモートリポジトリに上げる前に、ローカルリポジトリに上げる必要があります。
以下のコマンドでステージングして、コミットします。

```terminal
$ git add .
$ git commit -m 'コミットメッセージ'
```

# 5.リモートリポジトリの追加

以下のコマンドでリモートリポジトリの追加をoriginというタグ？ニックネーム？をつけて実行します。
ここはorigin以外でもOKです。

```terminal
$ git remote add origin <リモートリポジトリのURL>
```

オレンジ色の文字がダーッと出て、最後に
`Initialized empty Git repository in ローカルリポジトリのパス/.git/`
のメッセージが出れば成功。

きちんとリモートリポジトリが追加されてるか確認するには以下のコマンドを実行するとみれます。

```terminal
$ git remote -v
```

# 6. リモートリポジトリへpush

そしたら、リモートリポジトリへpushします。

```terminal
$ git push -u origin master
```

-uをつけることで、ローカルの master ブランチがリモートの origin リポジトリの master ブランチと関連付けられます。その後、単に git push を実行すれば、ローカルの master ブランチの変更が origin リポジトリの master ブランチにプッシュされます。
公開鍵交換したのにパスワードを聞かれたときの話

# はじめに
VMからVMにsshでファイル送信をしようとしたらパスワードを聞かれるようになってました。

そこで、VMの設定を追加して解決したのでその方法について説明します。

# 環境
- VM
    - ubuntu20.04 LTS

# 原因
結論から言うと、syslogに
```
sda:add missing path
sda:failed to get udev uid: Invalid argument
sda:failed to get sysfs uid: Invalid argument
sda:failed to get sgio uid: No such file or directory
```
というエラーが出力されており、ここから原因を特定できました。


ですが、ほかにも気を付けたほうが良いことがあるので説明します。

# ほかの問題
### 1. 公開鍵交換
そもそも正しく鍵交換できているか確認してください。

正しくできていない、もしくはわからない時は新しく鍵を生成して鍵交換しなおしてもよいと思います。

### 2. 権限
秘密鍵ファイルやauthorized_keysファイル、sshディレクトリの権限には気をつけましょう。

秘密鍵、authorized_keysファイルは600、sshディレクトリは700にしておきましょう。

### 3. ssh設定
SSHサーバーの設定ファイル（通常は/etc/ssh/sshd_config）に、公開鍵認証を無効にする設定があるかもしれません。

"PasswordAuthentication"や"PubkeyAuthentication"といった設定を確認し、公開鍵認証を有効にするように設定してください。

# 解決
前述したsyslogの
```
sda:add missing path
sda:failed to get udev uid: Invalid argument
sda:failed to get sysfs uid: Invalid argument
sda:failed to get sgio uid: No such file or directory
```
このエラーは仮想化環境に依存する問題で、
[udev が /dev/disk/by-id を生成するための情報(UUID)が仮想化環境から提供されないためエラーになります。](https://cloud.freebit.com/support/faq/vdc/37234/)
とのことでした。

これを読んでもちんぷんかんぷんだったので、少し調べてみました。

[udiv](https://linuc.org/study/knowledge/416/)とは
> udevは、Linuxカーネル用のデバイス管理ツールです。
> 主な役割は、「/dev」ディレクトリにあるデバイスノードの管理を行うことです。

[UUID](https://developer.mozilla.org/ja/docs/Glossary/UUID)とは
> Universally Unique Identifier (UUID) とは、あるリソースを、同じ種類の他のすべてのリソースの中から一意に識別するために使用されるラベルです。

とのことでした。
のでストレージをうまく認識できていないために秘密鍵を取得できず、パスワードを毎回聞かれるようになったのかなと思いました。

ここからようやく解決策について書きたいと思います。
説明が長くなってすみません

まずはVMの電源を落とします。
そしたらVMwareのVMのオプションに以下を追加します。
```
disk.EnableUUID = "TRUE"
```

自分のVMの[アクション]から[設定の権限]を選択し、詳細を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747696/6657f4de-c95a-1689-6459-20d5af6a467c.png)
そこから設定の編集を開いて、パラメータの追加をします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747696/f86e12d3-5ca0-e405-cffb-c6f75467970d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747696/1fca786c-c01a-9173-b427-98a1d450b629.png)
そこで上のオプションを追加してください。

ここまで出来たらVMを起動してあとはsshするだけです。

# おわりに
今回はsshするのにパスワードが聞かれるようになった話でした。
最初は戸惑いましたが、解決できた後は自分の知識も広がってよかったと思いました。

ここまで読んでいただきありがとうございました。
非機能要件で苦戦した話


以前非機能要件を定義するためにIPAさんの資料を参考にして作成を進めました。
その中で特に困った項目を挙げここでお話ししたいと思います。

https://qiita.com/suda_imagitech/items/b805c099f10b78701964

# 1. オンラインレスポンスについて

まずオンラインレスポンスについておさらいしましょう。
>レスポンスタイムとは、システムや装置などに要求や入力が与えてから、反応を送り返すまでにかかるの時間のこと。また、その平均。この時間が短いほど、利用者や他のシステムなど外部にとっての「待ち時間」が少ないことを意味する。

出展：↓

https://e-words.jp/w/%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%A0.html

直感的に分かりますね。

非機能要件でオンラインレスポンスの時間を決める際は通常時とピーク時の二つを考えます。
今回イマジテックで開発しているサービスは要件定義内に即時レスポンスが定められています。
なので通常時は即時レスポンスを実現する、でいいのですが問題はピーク時です。

ピーク時何秒で返そっかなーってわかんないです。
少し迷っていて色々調べると以下の記事に出会いました。

https://note.com/tsukamoto/n/nde7fe5e21216

応答時間における3つの限界が書いてありました。

>・0.1秒までなら応答が瞬時に返ってきたという印象を与える。
・1秒までならユーザーの思考は途切れなく流れる。
・10秒までならユーザーの注意力は続く。
・10秒遅延してしまうと、ユーザーが即、サイトから離れてしまうことも多くなる。

なに！
いやー。勉強になりました。
この資料を踏まえピーク時は10秒以内で返答するように決めました。
せっかくサービスにアクセスしたのに10秒以上待たされて離れてしまうのはもったいないです。
とはいえ10秒以内は十分遅いので開発時はさらに早くレスポンスが返るようにしたいですね。


# 2. CPU利用率、メモリ使用率について

利用率についてはそのままですね。
最初この二つの利用率については、
「まあ、80%超えたらアカン」
と考えていました。（どこかでそうで聞いた気がする。。。）

しかしこの80%というのは私たちが普段利用してるPCのCPU,メモリについてです。
今回はサーバのCPU,メモリの利用率なので改めて考えなければいけません。

↓の画像はIPAが公開している資料になります。
CPU利用率、メモリ使用率を決めるにあたって参考で来ます。
（CPU利用率についての画像ですが、メモリ利用率も同じレベルです。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3495456/08062436-4af4-2e06-9708-5ea2ef2e0a3a.png)
出展：[IPA 『非機能要件グレード グレード表 P.9』](https://www.ipa.go.jp/archive/digital/iot-en-ci/jyouryuu/hikinou/ent03-b.html)

こちらを参考にし利用率を決める際は

80%以上
50%以上80%未満
20%以上50%未満
20%未満

このレベルで考えます。

まず80％以上はなしです。
通常時80％で急に大量のアクセスが来た場合、100%になる可能性があります。
これに合わせそもそもパフォーマンスが低下する可能性があります。

続いて20%未満ですが費用面の意味で却下です。
絶大な安心感を得ることができますが、単純な話で「良いサーバ」だからです。
弊社が開発しているサービスは大規模でなくまず小さく進めており、チャレンジの意味合いも含めています。
今後大規模なサービスになって強いサーバが必要になる可能性はありますが、現状そこまで余裕を持ったサーバの性能する必要はないです。

残りは
50%以上80%未満
20%以上50%未満
の二つです。

うーん。ムズイ。
ここにきてどちらかを選ぶ決定的な理由が見つからず困りました。
ここでIPAが選択時の条件を載せていたので見てみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3495456/1add8076-b107-b5f9-aa32-9ed6235700ca.png)
出展：[IPA 『非機能要件グレード グレード表 P.9』](https://www.ipa.go.jp/archive/digital/iot-en-ci/jyouryuu/hikinou/ent03-b.html)

にゃるほど。
低コストにこだわるなら80%以上
利用者が増える想定なら20%以上50%未満
バランスが取れているのが50%以上80%未満だと

上記の結果CPU利用率、メモリ利用率を
**50%以上80%未満**
とすることにしました。

開発中のサービスについて触れませんので多くは言及しませんがバランスが取れているこの利用率にします。

なんとか利用率を決めることができましたが、選択理由を具体的に説明をすることはできません。
なぜそう決めたのか説明をする際は「IPAがそう言ってたから」としか言えません。
具体的な説明ができるよう日々の研鑽が必要です。

# 3. 終わりに
非機能要件を決めるにあたって様々な資料を参考にしました。
今回参考にした記事、サイトさんには感謝しています。

それにしてもまだまだ修行が足りません。
開発以外の知識が（考え方によっては開発ですが）欠落しています。
自社サービス開発を続けることで得る知識は計り知れないので今後もQiitaにて発信を続けたいと思います。

# 4.予告
次の記事では「DB設計」についてまとめたいと思います。
10月20日金曜日に投稿予定です。
nRF9160 にてLTE経由での 電子ペーパーの表示制御を行った話

# 概要

ESPNowをつかった下記のシステムがボツになり、消費電力は気にしないで良いから 直接 LTEデバイス(nRF9160)のみで電子ペーパーを制御することになった。

https://qiita.com/KiKUiCHi_R1R/items/c8223577460c1c524205


流れは単純、
1. クラウド側で画像データを生成し、ZIP圧縮して、nRF9160に通知
2. ダウンロード開始（CRC16-CCITTとMD5で整合性チェック）
3. ZIP解凍（minizライブラリ）して電子ペーパーに画像を表示


もちろん FOTA（app-fw, delta-mfwm, full-mfw） にも対応している（もちろん前回のシステムでも電子ペーパー側ESP32を含む全てのデバイスでOTAに対応させている）

今回はとても単純な構成だが、メモリ管理で多少苦労した（メモリ不足で実現できないと思っていた）。


https://qiita.com/KiKUiCHi_R1R/items/e2a725924d225c8469c6


とりあえず、FOTAも含め、
nRF9160単体（外部にspi-norフラッシュ8MiB必要）にて
電子ペーパー画像の表示制御が行えることを確認できた。


# 以上。
Package xxxx is not available, but is referred to by another package. This may mean that the package is missing, has been obsoleted, or is only available from another source の対処法

# エラー文
```
$ apt-get install xxxx

Package xxxx is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source
```

# 対処法
下記のコマンドを実行してから再実行しましょう。

```
$ apt-get update
```
【Android】画像URIから拡張子を取得

# はじめに
画像URIから拡張子を取得する方法について解説。

# コード
URIには`content`スキーム`file`スキームの2種類が存在するので、それぞれの方法で拡張子を取得する。

```Kotlin
fun Uri.getExtension(contentResolver: ContentResolver): String? {
	return when (scheme) {
		ContentResolver.SCHEME_CONTENT -> MimeTypeMap.getSingleton().getExtensionFromMimeType(contentResolver.getType(this))
		ContentResolver.SCHEME_FILE -> MimeTypeMap.getFileExtensionFromUrl(Uri.fromFile(File(path ?: return null)).toString())
		else -> null
	}
}
```

# 参考
https://stackoverflow.com/questions/9758151/get-the-file-extension-from-images-picked-from-gallery-or-camera-as-string
[JavaScript] 変数と宣言

## 初めに
JavaScriptでは、「これは変数である」という宣言をするキーワードとして、
<font color="Red">var</font>、<font color="Red">let</font>、<font color="Red">const</font>の３つがあります。


```javascript
const x = 'Hello';  // constは初期値省略不可
let y = 'Hello';    // letは初期値省略可
var z = 'Hello';    // varは初期値省略可
```

このうち、varはもっとも古くからあるキーワードなのですが、作成者の意図しない挙動を取りやすいため、主にJavaScriptではconstとletの使用が推奨されます。


# const
<font color="Red">const</font>キーワードでは、**再代入不可**の変数宣言を行うことができます。
```javascript
const 変数名 = 初期値;  // 初期値省略不可
```
また、以下の**再代入不可**、**再宣言不可**、**ブロックスコープ**という特徴があります。

### 1. 再代入不可
<font color="Red">const</font>キーワードは、再代入することはできません。
```javascript
const bookTitle = "JavaScript Primer";
bookTitle = "新しいタイトル"; // => TypeError: invalid assignment to const 'bookTitle'
```
・**再代入**：一度宣言した変数に対して、値を再び代入すること
　
### 2. 再宣言不可
<font color="Red">const</font>キーワードは、再宣言することはできません。

```javascript
// "x"という変数名で変数を定義する
const x = 初期値;
// 同じ名前の変数"x"を定義するとSyntaxErrorとなる
const x = 初期値; // => SyntaxError: redeclaration of let x
```

・**再宣言**：一度宣言した変数を同じ変数名で宣言し直すこと

### 2. ブロックスコープ
<font color="Red">const</font>キーワードは、**ブロックスコープ**です。

・**ブロックスコープ**:同じ関数内であっても、{}で括られたブロックの外側から呼び出すことが**不可能**

# let
<font color="Red">let</font>キーワードでは、<font color="Red">const</font>とは異なり、**再代入可能**の変数宣言を行うことができます。
```javascript
let 変数名;
変数名 = 初期値; // letは初期値省略可
```
**再代入可能**の他は、<font color="Red">const</font>と同じく**再宣言不可**、**ブロックスコープ**という特徴があります。

### 1. 再代入可能
<font color="Red">let</font>キーワードは、再代入することができます。
```javascript
let bookTitle = "JavaScript Primer";
bookTitle = "新しいタイトル";
```
・**再代入**：一度宣言した変数に対して、値を再び代入すること
　
### 2. 再宣言不可
<font color="Red">let</font>キーワードは、再宣言することはできません。

```javascript
// "x"という変数名で変数を定義する
let x;
// 同じ名前の変数"x"を定義するとSyntaxErrorとなる
let x; // => SyntaxError: redeclaration of let x
```

・**再宣言**：一度宣言した変数を同じ変数名で宣言し直すこと

### 2. ブロックスコープ
<font color="Red">let</font>キーワードは、**ブロックスコープ**です。

・**ブロックスコープ**:同じ関数内であっても、{}で括られたブロックの外側から呼び出すことが**不可能**

# var
<font color="Red">var</font>キーワードでは、<font color="Red">let</font>とは同じく、**再代入可能**の変数宣言を行うことができます。
```javascript
var 変数名;
変数名 = 初期値; // varは初期値省略可
```
しかし、**再代入可能**の他は、<font color="Red">const</font>、<font color="Red">let</font>とは<font color="Red">異なり</font>、**再宣言可能**、**関数コープ**という特徴があります。

### 1. 再代入可能
<font color="Red">var</font>キーワードは、再代入することができます。
```javascript
var bookTitle = "JavaScript Primer";
bookTitle = "新しいタイトル";
```
・**再代入**：一度宣言した変数に対して、値を再び代入すること
　
### 2. 再宣言可能
<font color="Red">var</font>キーワードは、**再宣言可能**です。
そのため、**間違えて変数を二重に定義してしまうというミスが発生しやすくなります**。
```javascript
// "x"という変数名で変数を定義する
var x;
// 同じ名前の変数"x"を定義可
var x;
```

・**再宣言**：一度宣言した変数を同じ変数名で宣言し直すこと

### 2. 関数スコープ
<font color="Red">var</font>キーワードは、**関数スコープ**です。

・**関数スコープ**:関数内で<font color="Red">var</font>を使って宣言した変数は、関数内のどこからでも呼び出すことが**可能**


# letとvarの違い

<font color="Red">let</font>は<font color="Red">var</font>に制約を設け、バグを防ぎやすくした、
つまりは**改善したバージョン**という認識で覚えておいていいです。




# まとめ
以上をまとめると以下の表になる

|     |再代入|再宣言| スコープ|
|---  |---   |---  |---     |     
|var  |　〇  |　〇  | 　関数　　|
|let  |　〇  |　× 　| ブロック|
|const|　×   |　×   | ブロック|

・基本的には、<font color="Red">const</font>を使うのが望ましい。
　<font color="Red">const</font>は、制約が多いため意図しない実装を防ぐことができる。
・変数の中身を更新する必要がある場合は<font color="Red">let</font>を使用。
PostgreSQLでユーザを作ってDBまでつくる

# よく忘れるので自分用メモ
```
# su - postgres
$ createuser -P db_user
$ createdb -T template0 -l ja_JP.UTF8 -O db_user db_name
```

- ロケールが標準でよければ`-T`と`-l`は不要
DockerHub のリポジトリにイメージを上げる

DockerHub でリポジトリを作成し、イメージを上げる際の手順メモ

※ アカウント名は accName, リポジトリ名は sample とする

1. DockerHub でリポジトリを作成
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/801825/4b692958-e62b-913e-52eb-4754e873ea5a.png)
1. CLI 上でログイン
    ```shell
    $ docker login
    ```
1. プッシュする image の名前をリポジトリ名（Namespace 込み）と同じにする
    ```shell
    # tagname を付与しなければ latest となる
    $ docker tag [IMAGE ID] accName/sample
    # バージョン番号を付ける場合は : で区切る
    $ docker tag [IMAGE ID] accName/sample:0.0.1
    ```
1. プッシュする
    ```shell
    $ docker push accName/sample
    ```
Redis::CannotConnectError (Error connecting to Redis on 127.0.0.1:6379 (Errno::ECONNREFUSED)):の解消方法

docker環境において、`localhost:xxxx/sidekiq`へアクセス出来なかった時の対処法

```zsh:error
Redis::CannotConnectError (Error connecting to Redis on 127.0.0.1:6379 (Errno::ECONNREFUSED)):
```

## docker-compose.ymlへ追記
envを追記

```ruby:docker-compose.yml
  sidekiq:
    build: .
    environment: # ここから下
      RAILS_ENV: development
      REDIS_URL: redis://redis:6379
```

## 起動時の設定を追加する
以下を作成

```ruby:config/initializers/sidekiq.rb
redis_config = { url: 'redis://redis:6379/0' }

Sidekiq.configure_server do |config|
  config.redis = redis_config
end

Sidekiq.configure_client do |config|
  config.redis = redis_config
end
```
iPad × Codespacesで環境構築

# Codespacesとは？
GitHubが提供している開発環境です。
ブラウザ上でVSCodeを使用することができ、様々な開発をすることができます。
# iPadでの開発環境
まずはCodespacesを設定しましょう。
2coreと4coreを選択できますが、2coreだと少し余裕がないように感じます。

![IMG_1536.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729508/648e6f7d-15e3-4c44-55d0-f5940a4d97b2.jpeg)

入るとこのようにVSCodeがブラウザから使用できます。

本当に便利だと思うのがGitHubでログインすれば自分が使っている環境をほとんどそのまま使用することができます！

自分はsettings.jsonが300行を超えるほどカスタマイズしているのですが、ほとんど正常に動作しています。

また、拡張機能も動作します！
画像ではMaterial icon themeやError lens、Import costsなどが動作しているのがわかるかと思います。

![IMG_1538.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729508/b602e40d-13c1-addd-7a2a-cd5764b8f863.png)

加えてデフォルトでBash, Zsh, fishがインストールされており、快適にシェルを使用することができますある程度初期でカスタマイズされているため、そこまで不満は感じません。

OSはデフォルトでUbuntu 22.04 LTSが動作していました。

![IMG_1544.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729508/513db32b-5a77-6f8c-5163-2523da4919d3.jpeg)

試してないですが、Dockerを設定すれば好みのOSで開発できるそうです。

## 開発環境の整備

また、フロントエンド開発などでは、実際に実行画面を見る必要があると思います。

そこでサーバー上のポートを外部に出す、ポートフォワーディングが自動でされます！

![IMG_1545.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729508/61c06210-24aa-2544-3c5d-0415ec66937a.jpeg)


非常に便利です。

でも通常だと開発者ツールが使用できません。

そこで、以下のアプリケーションをインストールすることで解決しました。

* Web Inspector
![IMG_1543.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729508/04906c11-c93d-1076-11ee-f66adaff7a0a.jpeg)


単体でDOMの確認、スタイル、コンソールなど確認することができます。

![IMG_1541.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729508/fbb73d54-16e9-a9bd-2a68-3d6aaaedcf35.png)


これで不自由なく開発することが出来ました。

最後にコンパイルしながらhtopを動かしたときのスクリーンショットを貼っておきます。

![IMG_1542.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729508/8235d281-f707-1073-4da1-b611d4c47c2e.png)

余裕のあるスペックでは無いでしょうか？
かなり拡張機能等を入れているので相当動きは良いと感じました。

## デメリット
* iPadで全画面の維持ができない
どうしてもタブの切り替え時にツールバーの非表示がオフになってしまいます。

* そこそこの通信速度が必要
インターネット共有ではかなり不安定になります。じっくり読み込みを待機する必要があります。

このくらいの速度がでていれば不満はありません。

![IMG_1546.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729508/61f10c9f-e97d-999e-161b-206f9c1c6d86.jpeg)

以上です。
Seaborn heatmapのLogスケール設定時にカラーマップ範囲を設定する

# 結論
LogNormのvmin/vmax引数を与えてやればOK
```python
sns.heatmap(data, norm=matplotlib.colors.LogNorm(vmin=0, vmin=10))
```

# NGだったこと
heatmap内の引数にvmax, vminを渡しても, LogNorm()の方の範囲が優先されるっぽいので, 反応しない
```python
sns.heatmap(data, norm=matplotlib.colors.LogNorm(), vmin=0, vmin=10)
```

おわり
Channel実装時に気をつけたいこと

# はじめに
今回は`Coroutine`のひとつである`Channel`について気をつけておきたいことを紹介していきます
### 本文
まず、許容量です
`Channel`宣言時に下記のようにすることで`Channel`に対して幾つの値を詰めれるかを設定することができます
```kotlin
Channel<Hoge>(Channel.CONFLATED)
```
デフォルトだと`RENDEZVOUS`が設定されています
`RENDEZVOUS`は`send`と`recieve`各々が呼ばれるまで片方は止まり続けるのでスイッチに似た機構になっています
`CONFLATED`は上書きされ、常に最新のものが入っている状態になります
基本的には上記二種類を使うのが一般的かと思います。

次に、`close`です
これは値の更新や取り出しをこれ以上したくない場合に呼び出すのですが、意図しないタイミングで更新をしてしまった時などのために下記のようにしておくことでクラッシュしてしまうことを予防することができます
```kotlin
if (hoge.isClosedForReceive) {
    return
}
```
### 最後に
今回は自分がChannelを実装していて気をつけた方がいいなと感じた部分を紹介してみました
どなたかのお役に立てれば幸いです
WordPressのSEO設定／「All in One SEO」プラグイン

# 【STEP1】「All in One SEO」プラグイン
1\.「All in One SEO」プラグインをインストールする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592268/0e8cc9cd-5542-3fcc-d452-b643c9215f1c.png)

2.「有効化」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592268/937dd0fc-786d-1911-e4d4-f52675b9d57c.png)

以上で、WordPress管理画面にAll in One SEOの設定項目が追加されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592268/b4447af7-3f76-9aaa-2bb3-4dd6146f691c.png)

# 【STEP2】トップページタイトル・説明文・検索エンジン表示設定

1.「All in One SEO＞検索の外観」を
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592268/c89f1180-a55a-b012-e585-02862f820ee1.png)
2.検索の外観＞全体設定

    ・「検索の外観＞全体設定」タブでは、トップページのタイトルやメタ説明文の設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592268/0d7377c6-915b-bbd5-8cf8-ec92d4312fb6.png)

・必要に応じて「タグ」をクリックして、編集します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592268/0c8937a0-e1e4-c104-6c5a-101c47ca7218.png)


# 【STEP3】Google Analytics 4の設定

◾️All in One SEOを使ってGoogle Analytics 4と連携する方法

    step1 Google Analytics 4のアカウント作成・データストリームの設定を行う
https://qiita.com/taidong5588/items/7d82aa7d8b16d2fd70f8

    step2 トラッキングコードをメモしておく
１．Googleアナリティクスにて、左下の「歯車」アイコンを押下
2．「データストリーム」をクリックします。
3．作成したデータストリーム（ウェブストリーム）をクリック
4．「タグの実装手順を表示する」ボタンをクリック
5．上のタブを「手動でインストールする」に切り替えれば、GA4のトラッキングコードをコピー

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592268/7ac78898-ca9c-b8a7-314f-da37e249a5ba.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592268/2b20c174-1498-92e1-2829-e5cfdf2585d1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592268/7338a994-db8f-cf6d-e078-71b31d79b180.png)

    step3 トラッキングコードをWordPressサイトに設置する

１．WordPressの管理画面で「All in One SEO＞一般設定」をクリック
2．「ウェブマスターツール」タブを選択して、Google Analyticsのトラッキングコードを貼り付け「変更を保存」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592268/90723f1e-3b2f-2ae9-99bd-6dd2aeaee3ea.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592268/38fd872e-fd69-3b97-d2a3-f16d9ff49ea5.png)

以上で、WordPressとGoogle アナリティクス4を連携させることができました。
Google Analyticsの「レポート＞リアルタイム」に自分のアクセスがカウントされていれば正しく設定できています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592268/fa971667-0e09-0821-6ecb-21bfe92ef8fd.png)

# 【STEP4】Google Search Consoleの登録
https://qiita.com/taidong5588/items/7d82aa7d8b16d2fd70f8

# 【STEP5】XMLサイトマップの有効化と登録

Google サーチコンソールの登録が終わったら、All in One SEOのサイトマップ機能を利用して、XMLサイトマップを登録することをおすすめ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592268/25766fd5-ad1f-07a5-64f6-bcc38e0255bd.png)

「http(s)://ドメイン/sitemap.xml」にアクセス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592268/3fbe8d48-1ffc-b461-b2e6-fae69a8465b6.png)

次に、サーチコンソールにサイトマップを登録します。
サーチコンソールの管理画面で、「サイトマップ」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592268/ad5f4619-069e-92c5-9dcc-36d78c19d376.png)
「http(s)://ドメイン/sitemap.xml」と入力して送信ボタンをクリック