OmniAICreator/Qiita-1.07M huggingface dataset:
【ダッシュボードページ】"拡張された URL" オプションを使用してみる

過去の記事[【ダッシュボードページ】ダッシュボードページを作ってみる](https://qiita.com/Miki_Yokohata/items/143aebf5b22d1078ff11)で簡単なダッシュボードページの作成を紹介しました。
今回はその時使用しなかった**拡張されたURL**オプションを使用してみます。
[Sharperlight](https://sharperlight.jp/)インデックスページより、以前に作成したダッシュボードページの定義ページを開きます。
```
例) http://{あなたのサーバー名}/mdService1Rest/index
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/3fd20b2e-95c8-eb3c-c848-808f728e098e.png)
このような定義ページが開きました。２つのタイル、**売上表**と**売上チャート**がサンプルとして定義されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/b29bcacc-0747-793f-59dc-f94493c64f24.png)
売上チャートタイルの表題にカーソルをあてると、歯車アイコンが右端に表示されるので、そのアイコンをクリックして編集を開始します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/f632824a-c973-0677-ab15-363179a15fff.png)
編集ページが表示されるので、**拡張されたURL**オプションにあらかじめ作成しておいた売上詳細WebレポートのURLを記入します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/56764e93-1aff-53d2-8ffa-99fe3065ca1f.png)
保存ボタンで保存すると元の定義ページに戻ります。
マウスカーソルを売上チャートタイルの表題にあてて、右端に表示される右三角アイコンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/2258c347-b9f7-815c-2089-7790e51b3a5c.png)
先ほど**拡張されたURL**オプションに指定したWebレポートが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/0f6da513-d818-fa83-9eb4-64bc651176e7.png)

**おまけ**：ダッシュボードページを呼び出すURL、`lock=1` パラメータは編集を許可しないという働きをします。
```
http://{あなたのサーバー名}/mdService1Rest/dashpage/?query={グループ}.{コード}&lock=1
```

では、失礼します。
PyCon JP 2022 day1 Pandas卒業？大規模データを様々なパッケージで高速処理してみる

現地参加したPyCon JP 2022のセッションのまとめ3本目です。

今回は、Day1の「Pandas卒業？大規模データを様々なパッケージで高速処理してみる」です。

# 動画
<iframe width="560" height="315" src="https://www.youtube.com/embed/kK8NnAj5gJU?start=3465" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

# スライド
- https://speakerdeck.com/mhrtech/pyconjp2022-hpc

# スピーカー
- fujineさん
  - みずほリサーチ&テクノロジーズ株式会社
    - 先端技術研究部
    - データ分析、クラウド（AWS、GCP）の技術研究に従事

# 内容まとめ
- 大規模データを扱うパッケージとしてPandasが代表的ですが、他のパッケージについて解説

## 背景
- Pandasは超便利だが、大きいデータにはスケールしにくいというデメリットがある
  - シングルスレッド
    - CPUコアが何十個あっても、基本１コアしか使用しない
  - インメモリ処理
    - データ規模が大きいとファイル読込すら失敗
- そこで、以下4つのパッケージを試してみた
  - Pandas
  - dask
  - vaex
  - Spark

## Pandas
- 大規模データを扱うパッケージのdefect standard
- 小~中規模(1000万)のデータ件数なら、十分有用
- テーブル結合は、mergeよりjoinの方が高速

## Dask
- タスクグラフによる並列処理を行う
- Pandasと(ほぼ)同じAPIで、Pandasより大規模なデータを処理できる
- テーブル結合は、joinよりmergeの方が高速

## Vaex
- APIがPandasと異なる
- 処理速度が早い

## PySpqrk
- 低メモリでのデータ処理に有効
- 処理時間はPandasとあまり変わらない
- SparkやSQLに慣れてる人向け

## それでもPandasを使いたいあなたに
- evalで並列化
  - 数式に近い形で記述でき、可読性の面でも恩恵あり
  - numexprインストールを忘れずに！
- Pandas統合の並列処理パッケージを使用
  - `apply/map`の並列化に有効

# 感想
- Pandasに限らず、defect standardになっているツールにはdefect standardになっている理由があると思いますが、それだけでは対応しきれないことは往々にして起こると思います。
- その時に他のツールの特性も把握した上で選択肢を持っておくのは、大事だなと思いました。
初めての Lightning Web コンポーネント開発で OCI を操作してみる（開発内容編）

※ これから記載する事項は、私が所属する会社とは一切関係のない事柄です。

前回の[初めての Lightning Web コンポーネント開発でOCIを操作してみる（開発方法編）](https://qiita.com/syunyama/items/8c591c9fbe89731204a0)に続いて、今回は作成したUIの見た目とlwcとApexを紹介します。

## ソースコード
https://github.com/SalesforceDevelopersJapan/jp-cc-se/tree/main/OCIInventoryRegistrationComponent


## 完成したUI


選択したローケーショングループ内のSKUを検索できます。
![image (40).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/9b834e24-e44a-5240-2dd6-5a8c1f76f220.png)
各ロケーションに対して在庫数などの編集を行えます。
![image (41).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/77089489-84bb-01e4-f140-ca3db34cdcb0.png)
将来の在庫の一覧も表示します。
![image (42).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/47bc1a94-1132-3999-7fc4-6354d3e89eda.png)




## 実装の概要図
![OCIInventoryRegistrationComponent.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/99096af4-0652-f5ab-344e-b5b3fa85da9f.jpeg)




## 実装したコンポーネント

[c-oci-inv-reg-location-group](https://github.com/SalesforceDevelopersJapan/jp-cc-se/tree/main/packages/OCIInventoryRegistration/force-app/main/default/lwc/ociInvRegLocationGroup)
全てのコンポーネントを包含している最上位のコンポーネントです。
ロケーションの検索や検索結果の保持をここで行っています。
また在庫更新リクエストジョブのステータスの取得もここで行っています。

[c-oci-inv-reg-inventory-list](https://github.com/SalesforceDevelopersJapan/jp-cc-se/tree/main/packages/OCIInventoryRegistration/force-app/main/default/lwc/ociInvRegInventoryList)
このコンポーネントは在庫情報をリスト表示するシンプルなコンポーネントです。
コンポーネント内での動的な動きはないので、かなり静的なコンポーネントと言えるかと思います。

[c-oci-inv-reg-location-update-form-modal](https://github.com/SalesforceDevelopersJapan/jp-cc-se/tree/main/packages/OCIInventoryRegistration/force-app/main/default/lwc/ociInvRegLocationUpdateFormModal)
在庫更新リクエストを行うフォームを包含するモーダルです。

[c-oci-inv-reg-modal](https://github.com/SalesforceDevelopersJapan/jp-cc-se/tree/main/packages/OCIInventoryRegistration/force-app/main/default/lwc/ociInvRegModal)
将来在庫の表示や c-oci-inv-reg-location-update-form-modal 内で利用する汎用的なモーダルコンポーネントです。

[c/ociInvRegUtils](https://github.com/SalesforceDevelopersJapan/jp-cc-se/tree/main/packages/OCIInventoryRegistration/force-app/main/default/lwc/ociInvRegUtils)
このコンポーネントはUIのためのものではなく、各コンポーネントで共通で使用するユーティリティメソッド群です。



## 実装したApexクラス

[OciInvRegController](https://github.com/SalesforceDevelopersJapan/jp-cc-se/blob/main/packages/OCIInventoryRegistration/force-app/main/default/classes/OciInvRegController.cls)
PlatformとのやりとりはこのApex コントローラーのみです。

[OciInvRegUuid](https://github.com/SalesforceDevelopersJapan/jp-cc-se/blob/main/packages/OCIInventoryRegistration/force-app/main/default/classes/OciInvRegUuid.cls)
UUIDを生成する標準のツールがなさそうだったので、https://github.com/jongpie/ApexUuid から拝借させていただきました。
【Athena】行のパス・ファイルを取得する

# どのファイルにデータが入っているか知りたい

Athenaで一つのテーブルの中で、ファイルごとにデータを見たい場合などがあり、これまではテーブルを分けたり、パーティションで区切っていたのですが、クエリでファイルパスが取得できる事がわかったので記事にします。
[こちら](https://aws.amazon.com/jp/premiumsupport/knowledge-center/find-s3-source-file-athena-table-row/)の公式のドキュメントを参照しました。

# パスの取得方法

パスは `"$path"` で取得可能です。

```sql
select
    id,
    "$path"
from
    users
limit 10
```

とすると結果が

```
"id","_col1"
"1","s3://example-backet/path/to/hoge.csv"
"2","s3://example-backet/path/to/foo.csv"
"3","s3://example-backet/path/to/bar.csv"
```

となっています。

# ファイル名の取得

ファイル名は `element_at(split("$path", '/'), cardinality(split("$path", '/')))` で取得可能です。
やっていることは複雑に見えるかもですがファイル名を `/` でsplitして配列を取得。ファイル名なのでその配列を最後の要素を取得しているだけです。
例えば

```sql
select
    id,
    element_at(split("$path", '/'), cardinality(split("$path", '/')))
from
    users
limit 10
```
とすると結果が

```
"id","_col1"
"1","hoge.csv"
"2","foo.csv"
"3","bar.csv"
```

となります。

# ファイルごとにカウントを取る

```sql
select
    element_at(split("$path", '/'), cardinality(split("$path", '/'))) as "ファイル名",
    count(*) as "カウント"
from
    users
group by
    element_at(split("$path", '/'), cardinality(split("$path", '/')))
```

とすると結果が

```
"ファイル名","カウント"
"foo.csv ","12742"
"bar.csv ","134308"
"hoge.csv ","547824"
```

のようなものが取れます
Salesforce上級アドミニストレーター試験の公式サンプル問題解説してみた-03

こんにちは
本橋孝昭です

今回の内容は動画でも解説しています

https://www.youtube.com/watch?v=_cszoKZU9Lc

<iframe width="560" height="315" src="https://www.youtube.com/embed/_cszoKZU9Lc" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>



Salesforce上級アドミニストレーター試験の公式サンプル問題があるのはご存じでしょうか

こちらの受験ガイドからサンプル問題を確認することが可能です

https://quip.com/dyBMAO1z6pJ9/SALESFORCE-

https://tandc.salesforce.com/credentials

今回は
Salesforce上級アドミニストレーター試験の公式サンプル問題3問目をご紹介します

なお、
以下の問題は、Salesforce 認定上級アドミニストレーター試験のサンプル問題です。問題はあく まで出題形式に慣れていただくためのものであり、試験に合格するかどうかを判断するための問題ではありません。実際の問題の難易度は、以下のサンプル問題とは異なる場合があります。

と書いてありますのでご確認ください

問題はこちらです

3)
システム管理者は商談オブジェクトに「地域コード」という新しい項目の作成を依頼されて います。この項目は、外回り営業プロファイル、マネージャプロファイル、およびシステム 管理者プロファイルを持つユーザは参照のみ可能、システム管理者プロファイルおよびマ ネージャプロファイルを持つユーザの場合は編集もできるようにする必要があります。 

これらのユーザのみこの項目にアクセス可能にするには、システム管理者はどうすべきです か？ 

A.  これらの 3 つのプロファイルで、「地域コード」項目の項目レベルセキュリティを編集す る 
B.  これらの 3 つのプロファイル用に、商談オブジェクトの新しいレコードタイプと新しい ページレイアウトを作成する
C.  ロール階層を編集して、外回り営業ロールおよびマネージャロールをロール階層の下部に移 動する 
D.  これらの 3 つのプロファイルに、商談オブジェクトの新しいページレイアウトを作成する 


正解はAです

今回の要望として
・商談にカスタム項目がある
・外回り営業プロファイル、マネージャプロファイル　システム 管理者プロファイル　は閲覧のみ
・マネージャプロファイル　システム 管理者プロファイル　は編集もしたい

ということですね
この項目の閲覧のみ、編集のみの設定は項目レベルセキュリティで可能です

項目レベルセキュリティからならばプロファイルごとに効率よく権限の設定は可能です

Bについて
レコードタイプを作成してもプロファイルごとの項目権限の設定は変わらないです

Cについて
ロール階層はレコードの閲覧の話なので項目とは関係ないです

Dについて
ページレイアウトでは項目の参照のみの設定は可能ですが、
今回のように１つのカスタム項目のアクセスを設定するためにページレイアウトを作成することは不適切な運用設定のような気がします
攻撃手法

# Web閲覧者を騙す攻撃
### フィッシング
```Webサイトやメールなどを利用した詐欺行為```。
金融機関からのメールやWebサイトに見せかけて、クレジットカード番号などの個人情報を入力させて詐取する。

### クロスサイトスクリプティング
書き込みができるWebサイトの脆弱性を突いた攻撃。
```スクリプト（命令）を埋め込んで偽ページを表示させ、別のサイトに誘導することで```フィッシング``などを行う。
#### 関連記事
https://www.shadan-kun.com/waf/xss/

### クロスサイトリクエストフォージェリ（CSRF)
攻撃の仕組みが仕込まれたWebサイトにアクセスすることで、ログイン中の他のサイトの掲示板やネットショップで書き込みや決済をさせられる攻撃。```悪意ある要求(request)が、本人のように偽って(forgery)```実行されることから名付けられた。
#### 関連記事
https://www.ipa.go.jp/security/vuln/websecurity-HTML-1_6.html

### クリックジャッキング
ユーザを視覚的に騙して（表示が透明になるように細工すること)、```正常に見えるWebページ上のコンテンツをクリックさせ、個人情報をなどを不正に取得```する。

#### 関連記事
https://www.hitachi-solutions-create.co.jp/column/security/click-jacking.html

### ドライブバイダウンロード
```Webサイトを閲覧した際、利用者の意図に関わらず、ウイルスなどの不正プログラムをPCにダウンロードさせる行為```。

### DNSキャッシュポイズニング
DNSキャッシュポイズニング(DNS cache poisoning)は、偽のDNS応答をDNSサーバのキャッシュに記憶させ、```ユーザーを有害サイトに誘導する攻撃```。SEOポイズニング(SEO poisoning)は、Web検索の際、```自サイトに上位に来るようにする技術```を利用して、上位の検索結果に悪意あるサイトを仕込んでおく行為

# パスワードを盗み取る攻撃
ブルートフォース攻撃（総当たり攻撃）、パスワードリスト攻撃/辞書攻撃など
### 関連記事
https://qiita.com/masatom86650860/items/65c936b1be27ab8561af

# システムダウンを狙う攻撃
### バッファオーバフロー攻撃
許容量を超えるデータを送りつけることで、システムの機能停止や誤動作を狙う攻撃
### 関連記事(Dos攻撃、DDoS攻撃)
https://qiita.com/masatom86650860/items/65c936b1be27ab8561af#dos%E6%94%BB%E6%92%83denial-of-service-attack

# システムの脆弱性を狙う攻撃
### ディレクトリトラバーサル攻撃
あるファイルに対する要求を行うための文字列に```親ディレクトリへの移動指示を入れ込む```ことで、```非公開ファイルにアクセスして閲覧・取得したり書き換え```たりする手法。

### 第三者中継
メールサーバの転送機能（SMTPサーバの機能）を利用して、```全く関係のない組織のメールサーバを踏み台```にすること。```出所を隠しつつサーバに負担をかけずにスパムメールなどを大量発信```する、ウイルスメールを発信するといった攻撃に使われる。

#### スパムメールとは？
```受信者の意向を無視して一方的に送り付けられるメール```となり、```迷惑メール```とも呼ばれます。スパムメールにはさまざまな種類があり、商品の宣伝を目的とするものやフィッシングサイトへの誘導経路などを目的に使われます。適切なセキュリティ対策がされていなかった場合、お客さまが気付かずにこうしたメールを送信してしまっている可能性があります。
出典 https://support.ntt.com/cotoha-ma/faq/detail/pid2300000kjg/

# その他の攻撃
### セッションハイジャック
```通信における一連のやり取りを乗っ取り、データを盗んだり、不正操作を行う```手法。

### 標的型攻撃
標的とする企業などの社員に偽メールを送り、```添付ファイルを開かせるなどでウイルスに感染させ、企業情報を入手```する方法。
NVIDIA JETPACK5.0.2 (REV.1)の情報

今までJETPACK4.6.1を使用していましたが、プリインストールされているpythonのバージョンが3.6系で、JETPACK4.6.1に適合するNGCカタログのコンテナについてもpython3.6系だったりと、不便だった。

今回、2022/10/18時点の最新版であるNVIDIA JETPACK5.0.2 (REV.1)をインストールしたので、よく使用するOSSやライブラリなどのバージョンを記録しておこうと思う。

NVIDIA JETPACK5.0.2 (REV.1)

* OS
  Ubuntu 20.04.4 LTS

* python3 version
  3.8.10

* pipはインストールされていない。

* Docker
  Docker version 20.10.12, build 20.10.12-0ubuntu2~20.04.1

* L4T version
  R35.1.0

* CUDA version
  V11.4.239

* cuDNN version
  8.4.1.50
paizaでアセンブラ その16

# 概要
paizaでアセンブラ、やってみた。
アセンブラ、見つけたので、やってみた。


# 参考にしたページ

https://qiita.com/reika727/items/23bd5367e13114f6705c

# paiza.ioでやってみた。

動きませんでした。

```
import subprocess
import os

def gcc():
    c_file = 'test.s'
    test_c = """
.code64
.text
.globl main
main:
    mov $1, %al     ; sys_write のシステムコール番号
    mov $1, %dil    ; 標準出力のファイルディスクリプタ
    lea hello, %rsi ; 書き出すデータのアドレス
    mov $len, %dl   ; 書き出す文字数
    syscall         ; sys_write の実行
    mov $60, %al    ; sys_exit のシステムコール番号
    mov $0, %dil    ; 終了ステータス
    syscall         ; sys_exit の実行
.data
hello:
    .ascii  "hello, world"
.set    len, . - hello
"""
    with open(c_file, 'w') as f:
        f.write(test_c)
    #os.system("cat test.s")
    os.system("gcc -no-pie %s" % c_file)
    os.system("./a.out")
    #os.system("ls")
    
if __name__ == '__main__':
  gcc()

```

# 修正版

```
import subprocess
import os

def gcc():
    c_file = 'test.s'
    test_c = """
.code64
.text
.globl main
main:
    mov $1, %rax
    mov $1, %rdi
    lea hello, %rsi
    mov $12, %rdx
    syscall       
    mov $60, %rax
    mov $0, %rdi 
    syscall
.data
hello:
    .ascii  "hello, world"

"""
    with open(c_file, 'w') as f:
        f.write(test_c)
    #os.system("cat test.s")
    os.system("gcc -no-pie %s" % c_file)
    os.system("./a.out")
    #os.system("ls")
    
if __name__ == '__main__':
  gcc()
```


# 成果物

https://paiza.io/projects/gM5J6bg61rYv2iLm519cVw

以上。
バンドの一生で論理演算子の働きを覚える

## ストーリー

### 1. ユニット結成 (AND)

A「2人でバンドやろうぜ！
B「いいね！

```js
if (Aの同意 && Bの同意) {
    // 2人の同意により
    バンドの結成();    
}
```


### 2. CDデビュー (OR)

A「なんかバズっちゃったし、CD出そうぜ！
B「いいね！
～～～
レーベル「ではこちらの契約書にサインをお願いします。

```js
if (Aのサイン || Bのサイン) {
    // どちらかのサインにより
    CDの発売();    
}
```

### 3. 解散の危機 (XOR)

A「俺、こういう方向性で今後行きたいんだよね
B「やだ！

```js
if (Aの方向性 ^ Bの方向性) {
    // 方向性の不一致により
    解散();    
}
```


## 少し掘り下げ

### AND

登場する条件が、**すべて肯定的かどうか**を判定します。

|A|B|A and B|
|:-:|:-:|:-:|
|⭕|⭕|⭕|
|⭕|✖️|✖️|
|✖️|⭕|✖️|
|✖️|✖️|✖️|

### OR

登場する条件に、**1つでも肯定的なものがあるかどうか**を判定します。

|A|B|A or B|
|:-:|:-:|:-:|
|⭕|⭕|⭕|
|⭕|✖️|⭕|
|✖️|⭕|⭕|
|✖️|✖️|✖️|

### XOR

登場する条件が**揃っているかどうか**を判定します。

|A|B|A xor B|
|:-:|:-:|:-:|
|⭕|⭕|✖️|
|⭕|✖️|⭕|
|✖️|⭕|⭕|
|✖️|✖️|✖️|

> **揃っている**という意味では、結果を`NOT`で反転させた方がより直感的かもしれません。

|A|B|not(A xor B)|
|:-:|:-:|:-:|
|⭕|⭕|⭕|
|⭕|✖️|✖️|
|✖️|⭕|✖️|
|✖️|✖️|⭕|
Linux プロセス

# プロセスとは

- プロセスとはメモリ上で実行状態にあるプログラム　＝「実行中のプログラム」
- プログラムはディスク上に保存された実行ファイル
- プロセスには「PID（プロセスID）」という一意の番号が割り当て、プロセスが終了するまで変化しない。
- 一つのプログラムから複数のプロセスが生成されることも多くある。
- プロセスIDと実行ファイルは紐づけできる。
- Linuxの場合は、「psコマンド」で起動中のプロセスを見る事ができる。
- 「プロセス」＝「タスク」だと思っていい。呼び方が違うだけ。

# 参考になったページ

https://qiita.com/savaniased/items/dc18fa4fc0a3e0eccd61

**いつもありがとうございます。**
PyCon JP 2022 day1 詳解 print("Hello, world")

前回に続き、現地参加したPyCon JP 2022のセッションのまとめになります。

今回は、Day1の「詳解 print("Hello, world")」です。

# 動画
<iframe width="560" height="315" src="https://www.youtube.com/embed/D3nBkJwEUB4?start=1739" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

# スライド
- https://docs.google.com/presentation/d/19b0jIIj2-KmwXf49eWM2dgzZPeSuxABDyib_lpyTCxU/edit?usp=sharing

# スピーカー
- Rei Suyamaさん
  - 株式会社RevComm
  - バックエンドエンジニア

# 内容まとめ
- シンプルな処理`print("Hello, world")`の裏側で何が起きているかの深掘り

## Pythonとは2つの意味がある
- プログラミング言語としての言語仕様
  - 文法や挙動の定義をまとめたもの
- その言語仕様に沿った処理系
  - 実際のプログラム
  - `PyPy`や`Jython`など

## プログラミング言語とソースコード
- ソースコードは単なる文字列
- 文字列に意味を持たせるのが言語
  - コンピュータに解釈してもらうのがプログラミング言語

## 抽象構文木(Abstract Syntax Tree, AST)
- プログラミング言語は、ソースコードの文字列を解析してコンピュータが解釈しやすい形式に変換する
- この変換工程がパース、これを行うのがパーサ
- このコンピュータが解釈しやすい形式が、抽象構文木

## 標準ライブラリ`tokenize`
- Pythonソースコードをトークンに分割して出力するライブラリ
- トークンとは、意味を持つ最小単位の字句

## 標準ライブラリ`ast`
- Pythonソースコードの抽象構文木を出力するライブラリ
- 抽象構文木は、プログラムとして意味を持つ情報を木構造で表現したもの

## 標準ライブラリ`dis`
- Pythonバイトコードの逆アセンブル結果を出力するライブラリ
- Pythonバイトコードは、Python VMが解釈するマシン語

## Python VM
- Pythonバイトコードを逐次実行する仮想マシン
- `Python/ceval.c`に記述された巨大なループでバイトコードを実行する

## CPythonのビルド
- CPythonは、C言語で書かれたPythonインタプリタ
- ビルド手順は、公式の[Python Developer’s Guide](https://devguide.python.org/)に記載


# 感想
- こちらもDay1のkeynoteに続き、Pythonの処理系に関するセッションでした。
- `tokenize`・`ast`・`dis`といった標準ライブラリを使うと、抽象構文木やバイトコードの処理系を簡単に確認できるのは、初めて知りました。
- 今まで気にしたことはなかったけど、PHPやRubyの他の言語にもこういうライブラリはありそうですね。
[React Native/Web]日本語IMEでTextInput入力制限の件

# はじめに

こんにちは。久しぶりに投稿させていただきます。今回もReact Nativeの開発ノウハウです。
「この入力欄には数字のみ受け付けてほしい」
こういう要望、よくあるではないか。
React Nativeの`TextInput`では入力タイプが設定できないが、下記のように実装してたら、入力制限もできる。
```typescript
<TextInput
  onChangeText={t => setText(t.replace(/[^0-9]/g, ""))}
  value={text}
/>
```
……けれども、Windows環境で、日本語IMEで入力すると、問題が起きる。

# 問題点

問題というのは、`TextInput`にすでに何か入力していた場合、日本語IMEで何かを入力しようとすると（もちろん、日本語を受け付けないようにしている）、既存の文字が消去される。
Expo Snackで動作を見ましょう。
![Screenshot 2022-10-18 101557.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2252959/83d3ae4b-5907-5745-565d-21dd06b6fb6d.png)
上記のように`TextInput`を実装していたら、数字だけ受け付けることになる。
![Screenshot 2022-10-18 101746.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2252959/06977ff2-23f9-4a79-5697-f6af7f88e603.png)
次に日本語IMEで「あいうえお」を入力してみる。「あ」と「い」を押したら、かなが出てこないが、入力欄の「0」が消えた。
![Screenshot 2022-10-18 101805.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2252959/9e86f8a1-22a3-3e1c-22e8-0191fc75bc51.png)
つづいて「お」まで押したら、すべての数字が消えた。
この問題は、Windowsに起きるけど、Android/iOSには起きない。ちなみに、ほかの日本語IMEや中国語IMEでも問題が起きる（Google日本語IME・Microsoft中国語IMEで検証済み）。

# 解決策

なぜこうなるかわからないけど、IMEが原因だとなんとなく理解しているだろう。では解決するにも、IMEに何とかすることですね。
W3Cはたくさんのキーボード押すイベントを定義している。そのうち、IME入力も含んでいる。
https://www.w3.org/TR/uievents-key/#keys-composition
React Native `TextInput`では、上記の一部を利用していて、キーボード押すイベント（`onKeyPress`）に入っている。そして、`onKeyPress`の発火タイミングは`onChangeText`より先。そこで、`onKeyPress`でIME入力かどうかを判別し、YESの場合、IME入力自体を無視すれば、問題回避できるだろう。

ではさっそくやってみましょう。
```typescript
<TextInput
  onKeyPress={e => {
    isIme = e.key == "Process"; //IMEで入力する時、値は常に"Process"
  }}
  onChangeText={t => {
    if (!isIme) setText(t.replace(/[^0-9]/g, ""));
  }}
  value={text}
/>
```
このように実装していれば、既存の文字が消去される問題が回避できる。
![Screenshot 2022-10-18 105249.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2252959/f7df8394-f8d2-17c7-5f7d-97b209c82a58.png)
「あいうえおかきくけこ」まで押しても、数字たちが消去されていない。


# 最後に

この記事はあくまでも私個人の経験です。間違っているところ、もっと良い方法がございましたら、ぜひ教えてください。

# 参考資料

https://stackoverflow.com/questions/32946793/react-native-textinput-that-only-accepts-numeric-characters
https://www.w3.org/TR/uievents-key/#keys-composition
【React】Buttonの有効・無効状態でcssを分ける

```typescript:sample.tsx
//ボタンの状態
const [disabled, setDisabled] = useState(true);
```

```html:sample.html
<div className="testbutton">
  <Button buttonName="テスト用" disabled={disabled} />
</div>
```

```scss:sample.scss
.testbutton {
  ～
  ～
  button:disabled {
    ～
    ～
  }
  button:enabled {
    ～
    ～
  }
}
```
Pythonで REST API の data部リクエスト文のString型への変換


## 概要

REST API 経由でデータをやり取りするときに、リクエスト文等をdata部に渡したりしますが、この文をDict型で作成したのち、String型への変更が必要となります。この変更プログラムとなります（備忘録として）。

ちなみに、以下のPythonプログラムの確認対象リクエスト文は Azureの請求データを REST API で取得するためのクエリ・リクエスト文となります。

### 実行環境

macOS Monterey 12.3.1
python 3.8.12

### 実行プログラム

```python:payload_json.py
import json

# 確認対象リクエスト文
payload = {
    "type": "Usage",
    "timeframe": "MonthToDate",
    "dataset": {
        "granularity": "Daily",
        "aggregation": {
            "totalCost": {"name": "PreTaxCost", "function": "Sum"}
        },
        "grouping": [
            {"type": "Dimension", "name": "SubscriptionName"}
        ]
    }
}

# データ型の確認
print(payload)
print(type(payload), "\n")

# dict型 から string型への変更
json_payload = json.dumps(payload)

# データ型の再確認
print(json_payload)
print(type(json_payload), "\n")
```

### プログラムの実行
 
```
$ python payload_json.py                               
{'type': 'Usage', 'timeframe': 'MonthToDate', 'dataset': {'granularity': 'Daily', 'aggregation': {'totalCost': {'name': 'PreTaxCost', 'function': 'Sum'}}, 'grouping': [{'type': 'Dimension', 'name': 'SubscriptionName'}]}}
<class 'dict'> 

{"type": "Usage", "timeframe": "MonthToDate", "dataset": {"granularity": "Daily", "aggregation": {"totalCost": {"name": "PreTaxCost", "function": "Sum"}}, "grouping": [{"type": "Dimension", "name": "SubscriptionName"}]}}
<class 'str'> 
```

### まとめ

これでAzureの請求データを取得するためのクエリ・リクエスト文の変換準備の完了です。
Accessで外部キー（参照整合性）設定

# やり方

まず前提として下記2テーブルがある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/d3f3d61c-afb8-4c30-720d-e59befe4a067.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/2a296d7f-6655-0b8f-96a8-fd7d3151ec0d.png)

データベースツール ⇒ リレーションシップ 。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/0bca7b97-a1f4-3d58-460f-f7c7d8ea8730.png)

何も無いところで右クリック ⇒ テーブルの表示 。
右側にテーブルリスト出てくる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/ea486a9b-2a07-9293-7d05-8e8603e60e60.png)

『テーブルの追加』のリストからドラッグドロップ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/f87724a4-24f2-7848-1d4f-3ad3a1c31783.png)

主カラムから従カラムに向かってドラッグドロップすると、リレーションシップの小窓出る。
参照整合性にチェック入れて作成。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/6adfca60-ebe1-abdc-4240-e678768717c9.png)

↓作成終了するとこんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/4bd504ac-af26-129b-5d91-030ddcde9bef.png)

『リレーションシップの設定あるよ』の意味で+マーク付く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/70ae02a9-954f-d700-644c-a69c26dcfb43.png)

# 参照整合性設定したらどんな動きするか

## インサート

この状態で…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/cde6dee1-502b-b696-5e16-15195fc5bd2a.png)

こうインサートしようとすると…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/87255124-c241-94c6-12b0-3e56c47ecc27.png)

ダメだよって怒ってくれる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/0a749e92-f5cf-adb0-2eb9-5789ef1450e5.png)

## デリート

この状態で…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/ad1e4269-be09-3557-9308-311f091eb7c8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/07b7e4b6-e1e6-813f-97c5-0f359d94ea9f.png)

下記レコードを消そうとすると…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/e0798ec8-8211-061e-606e-619c7578bc8b.png)

ダメだよって怒ってくれる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/29ef0ae7-c5be-e827-02bf-14cfd55850d3.png)

# 蛇足

テーブル間のデータの整合性は、アプリケーション側のロジックで担保するのではなく、データベース側の参照整合性で担保した方がいい。

参照整合性を『窮屈』と捉えるのではなく、 **『ダブルチェックしてくれてる』** と考えよう！

# バージョン

Windows 10 Pro 21H2 OSビルド 19044.2130
Microsoft Access for Microsoft 365 MSO (バージョン 2209 ビルド 16.0.15629.20196) 32 ビット
メモ(ブックマーク)

# ブックマークメモ
- [ブラウザの仕組みを学ぶ](https://zenn.dev/silverbirder/articles/e10295948e17ca)
- [宣言的？ Declarative?どういうこと？](https://qiita.com/Hiroyuki_OSAKI/items/f3f88ae535550e95389d)
- [図解で解説！！　Apache、Tomcatってなんなの？](https://qiita.com/tanayasu1228/items/11e22a18dbfa796745b5)

### bash・linuxコマンド関連
- [findの結果でファイル名だけを取得する方法](https://www.greptips.com/posts/269/)
- [Bashにおけるインクリメントの方法](https://ytyaru.hatenablog.com/entry/2019/04/16/000000)

### prometheus
- [github rds_exporter](https://github.com/percona/rds_exporter)
- [yet-another-cloudwatch-exporterでCloudWatchのコストを削減する](https://qiita.com/naoaki-yzrh/items/6dc2de7627d8175f50e3)
- [cloudwatch項目](https://qiita.com/mechamogera/items/bfde31dee3700c66b45d)
- [クエリの基礎 - Prometheusドキュメント](https://it-engineer.hateblo.jp/entry/2019/01/19/150849)
- [【Prometheus】メトリクス収集方法をまとめていく](https://zenn.dev/big_tanukiudon/scraps/667260797313bb)
- [VictoriaMetrics と Grafana による Kubernetes クラスタのモニタリング](https://blog.cybozu.io/entry/2021/03/18/115743)
    -  Prometheus はストレージの構造として長期保存をあまり想定していない
    -  HA 構成できてない
- [Prom QL](https://qiita.com/tatsurou313/items/64fcaae3567f24d13dd5#%E3%83%A9%E3%83%99%E3%83%AB%E3%83%9E%E3%83%83%E3%83%81%E3%83%A3%E5%BF%9C%E7%94%A8)
- []()

### 初級編
- [ITインフラとは](https://www.softcreate.co.jp/rescue/solution_column/article/46)
【Nuxt】aタグ・nuxt-link・$router.push の使い分けメモ

## nuxt-link

アプリ内遷移の際に使用。

```vue
<nuxt-link to="/sample/">アプリ内リンク</nuxt-link>
```


`data(){}`にある`test{id:}`などを交えて、リンクとして記載する場合

```vue
<nuxt-link :to="`/sample/${test.id}`">アプリ内動的リンク</nuxt-link>
```

## aタグ

別サイトへのリンクの際に使用。

```vue
<a href="https:..."></a>
```

`data(){}`にある`test{url:}`などを用いて別サイトのリンクを記載する場合

```vue
<a  :href="test.url"></a>
```

## $router.push

メソッド内で使用

```js
methods: {
    test() {
        this.$router.push('/test')
    }
```

## vuetifyのv-btnをリンクにしたい場合

ドキュメント
https://v15.vuetifyjs.com/en/components/buttons/

nuxtプロパティはリンクがnuxt-linkであることを指定します。

> nuxt
Specifies the link is a nuxt-link



```vue
<v-btn to="/pass/to/link" nuxt>リンク</ v-btn>
```

## vuetifyのv-btnクリック時に遷移してほしい場合

```vue
<v-btn
  @click="$router.push('/messages/')"
  >一覧に戻る</v-btn
>
```
【Power Automate】DLPポリシーが設定されている環境でメール送信

会社でPower Automateからメール送信しようとしたら、DLPの壁に阻まれたので回避策のメモ。

:::note warn
注意
DLPはセキュリティ強化の機能ですので、自己責任でご利用ください。
:::

# データ損失防止（DLP）ポリシー
クラウドフローから情報を流出させないための機能です。
設定次第ですが、外部に何かを送信するようなアクション（例:Googleカレンダーに予定作成）を呼び出せなくなります。

https://learn.microsoft.com/ja-jp/power-automate/prevent-data-loss

自社テナントの設定では、外部へのメール送信も禁止されていました。
DLPでブロックされている場合、アクションそのものがポリシーに抵触しているか
中身が抵触しているかで表示が異なります。

#### アクションそのものがNGのとき
保存時に以下のエラーが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919396/673c6329-f7c9-f891-96b3-ebeea632d3b7.png)

#### アクションは許可されているが中身がNGのとき
正常に完了したように見えますが、<font color="Red">宛先には届きません。</font>
（以前はエラーが表示されていた気がしますが、今は表示されないようです）

この例では「Office 365 Outlook」コネクタの「メールの送信（V2）」アクションから
Gmail宛にメールを送ろうとしています。

<img width="500px" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919396/e1e6ea43-3d97-ad74-c7ad-8b8c64540266.png">



# 回避策
Microsoft 365のAPIであるGraph APIを使ってメールを送信します。

1\. アクションは「Office365 Groups」コネクタの「HTTP 要求を送信します」を選択します
　（V2と無印どちらでも構いません）
　<img width="500px" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919396/0a7c1608-25b7-a395-daf9-0d954cadca0b.png">

2\. 以下の通り設定します
　<img width="500px" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919396/2446f7ed-6ee4-5082-0062-538aa621937c.png">
```
URI：https://graph.microsoft.com/v1.0/me/sendMail
メソッド：POST
本文：
{
  "message": {
    "subject": "件名",
    "body": {
      "contentType": "Text",
      "content": "本文"
    },
    "toRecipients": [
      {
        "emailAddress": {
          "address": "メールアドレス"
        }
      }
    ]
  },
  "saveToSentItems": "false"
}
```

3\. フローを実行するとメールが届くことが確認できると思います。

# おわりに
DLPの穴を突くような方法ですので、いつの間にか使えなくなる可能性はありますが、
メール送信でお悩みの方のお役に立てば幸いです。
[Power BI] レポートをつくる、その先の運用を考える🤔 Power BI Report Ops (JPPC2022 で発表したスライドとリンク )

# JPPC2022

Japan Power Platform Conference 2022で登壇・発表した内容になります。

## 使用したスライド

https://speakerdeck.com/hanaseleb/repotowotukuru-sonoxian-noyun-yong-wokao-eru-power-bi-report-ops

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/c0aa0069-1007-f057-81c2-90b37244d342.png)

## 参考リンク集

https://azure.microsoft.com/ja-jp/resources/cloud-computing-dictionary/what-is-devops/

https://learn.microsoft.com/ja-jp/power-bi/guidance/powerbi-implementation-planning-usage-scenario-managed-self-service-bi

https://learn.microsoft.com/ja-jp/power-bi/guidance/powerbi-implementation-planning-usage-scenario-team-bi

https://learn.microsoft.com/ja-jp/power-bi/connect-data/refresh-desktop-file-onedrive

https://qiita.com/hanaseleb/items/a51ff75aba7b238621ec

https://learn.microsoft.com/ja-jp/power-bi/connect-data/desktop-report-lifecycle-datasets

https://powerbi.microsoft.com/ja-jp/blog/microsoft-ignite-2022-do-more-with-enterprise-self-service-business-intelligence/?fbclid=IwAR3D_2cf-U4lo0INL3vNeiGqjk8_QsL92uoIeHd4OJcFjwA_u3PiqG-f3TA

https://learn.microsoft.com/ja-jp/power-bi/create-reports/deployment-pipelines-overview

https://qiita.com/hanaseleb/items/84b7439a4b420dae24d4

https://learn.microsoft.com/ja-jp/power-bi/collaborate-share/service-roles-new-workspaces#workspace-roles

https://learn.microsoft.com/ja-jp/rest/api/power-bi/pipelines

https://docs.github.com/en/actions

https://tabulareditor.com/

https://github.com/TabularEditor/TabularEditor/releases/tag/2.17.1

https://msevents.microsoft.com/event?id=4060381977
検索のまとめ

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


# 設定
+ [Lightning環境のグローバル検索用URLのハック](https://qiita.com/Keiji_otsubo/items/b4c9c0eb89607030bbcb)
+ [Services Setup の画面から検索できない設定](https://qiita.com/Keiji_otsubo/items/c38b0b6172477a08edf0)
+ [Einstein Searchの検索結果の表示項目を変える](https://qiita.com/Keiji_otsubo/items/79feea5949819b951ec4)
+ [Experience Cloudサイトでのグローバル検索が正常に機能しない](https://qiita.com/Keiji_otsubo/items/e558021ba1d0af3b932e)
+ [Global Search](https://qiita.com/Keiji_otsubo/items/050b8bb76c6d7c74fbeb)
+ [Record Hunter](https://qiita.com/Keiji_otsubo/items/5eccb1d71b6b353438e1)


# 未解決
+ [Unusual error message "Sorry to interrupt" pop-up while searching](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000JeDLySAN)
+ [How to fix messy search results for On-Site Search in Japanese of an international online store: Potential Search Engine Query Issue?　（日本語の検索結果を正しく表示する方法は？）](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007JD1SE)

:::note
Googleで検索すると出てくるヘルプですが、何故かアクセスできません。

キャッシュとして表示すると
Search result differences in Japanese between production and sandbox

これによるとAPインスタンス（日本向け？）ではユーザー言語が日本語に設定されている場合にのみ使用される新しい日本語トークナイザーを使用するようなことが書かれています。

Customers may find search results returned by global search are different between NA, EU and CS instances compared to AP instances for Japanese characters when the language is set to Japanese.

AP Instances uses a new Japanese tokenizer which is only used when the user language is set to Japanese.
:::
Accessでテーブルの複合キー設定方法

# 概要

主キーが1カラムの場合、カラム選択 ⇒ 右クリックメニュー ⇒ 主キー で設定できる。
でも複合キーはその方法では設定できない。

# やり方

テーブル上で右クリック ⇒ デザインビュー 。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/eee0f5cf-4f8e-2f6b-bb9a-859ac614f529.png)

複合キーにしたいカラムを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/1fa26cc6-df1c-de44-dcf4-b7dce7d789d3.png)

テーブルデザイン ⇒ 主キー 。
鍵マーク付く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/d62e32e0-6795-7836-15ec-d8aa4777651d.png)

# 蛇足

どんなテーブルでも **レコードを一意に特定するキー** は設定しておいた方がいいよ！

# 複合インデックスを設定したい場合

https://qiita.com/waokitsune/items/f4509117c15eb9666781

# 参考サイトさん

https://dekiru.net/article/14889/

# バージョン

Windows 10 Pro 21H2 OSビルド 19044.2130
Microsoft Access for Microsoft 365 MSO (バージョン 2209 ビルド 16.0.15629.20196) 32 ビット
[Ranorex] Tips : How to controll smartfolder (data driven) loop by parameter

# Back Ground

RanorexはUIテスト自動化として有効なツールである。
このツールでdata drivenを簡単に使用できる。
このdata drivenはdata sourceを設定し、事前にその範囲（すべて , 1-5 といった指定行）を定義して実行させる。
ただ、業務上この指定範囲を動的に変更したい場合がある。
その実装手順をまとめたものである。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/8ea5bffc-a690-f6e1-bc64-845ddc899046.png)

上記例では、data 100 patternがあるなかで、1-10を実行する




# How

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/c04e148b-3633-6d4b-7fed-3b6677428960.png)

### smart folder 
data drivenを実行するsmart folder（上記図では、 Favorite_AddJockey_Loop）の名前をUniqueにする。
次の範囲指定を変更するプログラムでは、smart folder名をもとに処理実行させるため、unuqueでないと、処理が正しく動かないからである。

### set data range user_code

data rangeを変更するrecord moduleを作成する。（既存のrecord moduleの中に含めてもよい。）
上記図では、<B>Common_SetDataRange</B>に該当する。
そのrecord moduleの中身が下記である
<b>set_loop_parameter</b>のuser codeを呼び出し、引数として 実行したいrange (min, max)を指定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/a93288df-9334-43ba-4621-24b332ceb4f8.png)

実際の<b>set_loop_parameter</b>のコードが以下である。
動作として、data sourceのrangeのminとmaxを指定する。
尚、プログラム上ではdataの先頭が0としてあつかわれるため、 -1 を行っている。

<b>TestSuite.CurrentTestContainer</b> は、現在のtest suiteのsmart folderを指す。
<b>TestCaseName</b>でsmart folder名を取得し、そのsmart folderに対して、MinRange , MaxRange  を設定するものである。
この<b>TestCaseName</b>が先ほど指摘した通り、uniqueでないと、正しく<b>CurrentTestCase </b>が取れなくなるため、必ずuniqueにするように。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/0f644c87-0280-c10f-f96e-dbc5db1ac4b0.png)

code
```
		public void set_loop_parameter(string max, string min)
		{

			var TestCaseName = TestSuite.CurrentTestContainer.Name;
			var CurrentTestCase = TestSuite.Current.GetTestContainer(TestCaseName);      
			CurrentTestCase.DataRange.MinRange = int.Parse(min) - 1;  
			CurrentTestCase.DataRange.MaxRange = int.Parse(max) - 1;
			//setting the TestCaseName data range using items 1-10  
			CurrentTestCase.DataContext.SetRange(CurrentTestCase.DataRange.MinRange,CurrentTestCase.DataRange.MaxRange);  
			Report.Log(ReportLevel.Info, "Setting Data Range", 
			           TestCaseName + " range:" + "\nMin: " + CurrentTestCase.DataRange.MinRange.ToString() + "\nMax: " + CurrentTestCase.DataRange.MaxRange.ToString());

		}    
```

このようにして、data rangeを動的に変更することができる
Go言語入門 学習メモ 3 繰り返し、ラベルの働き

# はじめに
船井総研デジタルのoswです。業務でGo言語を使うことになったのでこれから学習していきます。その備忘録です。参考になる方がいらっしゃれば幸いです。

# 対象読者
- これからGo言語を学習する方
- 既に他の言語で基本構文を学習されている方

# 学習環境
学習環境は次のようになっています。この環境の構築メモは下記記事にまとめてあります。ご興味がある方はご参照ください。
- Windows 11 Home / 22H2
- VSCode / 1.72.2
- go version go1.19.2 windows/amd64
- git version 2.38.0.windows.1

https://qiita.com/fsd-osw/items/0e569b0b828455cdef9e

# 前回までの学習
前回は演算子、制御構文などを学習しました。

https://qiita.com/fsd-osw/items/1948d37313db220548b3

# 繰り返し
## for文
Goには繰り返し構文として用意されているのはforしかないようです。書き方にバリエーションを付けることでwhileのように使い、無限ループにすることもできます。if同様、{}は必須です。()は付けるとコンパイルエラーになってしまうようです。

```go:構文
// 条件が満たされている限り繰り返す
for 初期値; 繰り返し条件; 更新処理 {
    // 処理
}

// 省略形for文
for 繰り返し条件 {
    // 処理
}

// 無限ループ
for {
    // 処理
}
```

```go:サンプルコード
package main

import "fmt"

func main() {

	fmt.Println("通常for文")
	for i := 0; i < 5; i++ {
		fmt.Println("i:", i)
	}

	fmt.Println("\n省略形for文")
	k := 0
	for k < 5 {
		fmt.Println("k:", k)
		k++
	}

	fmt.Println("\n無限ループ")
	j := 0
	for {
		fmt.Println("j:", j)
		if j == 4 {
			break
		}
		j++
	}

	// ()をつけるとコンパイルエラー
	// for (i := 0; i < 5; i++) {
		// fmt.Println("i:", i)
	// }
}
```

```go:実行結果
通常for文
i: 0
i: 1
i: 2
i: 3
i: 4

省略形for文
k: 0
k: 1
k: 2
k: 3
k: 4

無限ループ
j: 0
j: 1
j: 2
j: 3
j: 4
```

# break / continue / goto
これらは他の言語同様の働きをします。breakは現在のループ、switch文を抜けます。continueは現在のループ処理を中断し、次のループに移行します。gotoもあります。
```go:サンプルコード
package main

import "fmt"

func main() {

	fmt.Println("breakの動作確認")
	for i := 0; i < 5; i++ {
		if i == 3 {
			break
		}
		fmt.Println("i:", i)
	}

	fmt.Println("\ncontinueの動作確認")
	for i := 0; i < 5; i++ {
		if i%2 == 0 {
			continue
		}
		fmt.Println("i:", i)
	}

	fmt.Println("\ngotoの動作確認")
	for i := 0; i < 5; i++ {
		if i == 3 {
			goto Goto
		}
		fmt.Println("i:", i)
	}

	return

Goto:
	fmt.Println("ジャンプ")
}
```

```go:実行結果
breakの動作確認
i: 0
i: 1
i: 2

continueの動作確認
i: 1
i: 3

gotoの動作確認
i: 0
i: 1
i: 2
ジャンプ
```

## ラベルの働き
Goではgoto以外にもラベル付けることができるようです。goto以外は実行した位置より外のスコープ、かつ上の行にラベルを記述します。指定した位置に飛ぶとgotoになってしまうのでそういう書き方になっているんでしょうか。

直感的に少々わかりづらいですが、ラベルはforに「紐づき」、breakなら紐づいたforを抜ける、continueなら紐づいたforから処理を再開、という動作になるようです。
```go:構文
    // ラベル1は直後の、外側のforと紐づく
ラベル1:
    for {
        for {
            break ラベル1
        }
    }
    // 「紐づいたfor」を抜けるため、break後の制御はここに移る
    
    // ラベル2は直後の、外側のforと紐づく
ラベル2:
    for i := 0; i < 5; i++ {
        // 「紐づいたfor」に戻るため、continue後の制御はここに移る
        // 外側forのカウンタを更新し、処理を再開

        for {
            continue ラベル2
        }
    }
```

```go:サンプルコード
package main

import "fmt"

func main() {

	const loopNum = 3

	fmt.Println("BreakLoop")
BreakLoop:
	// fmt.Println("ラベルとforの間にコードを書いてはいけない") コンパイルエラー
	for i := 0; i < loopNum; i++ {
		for j := 0; j < loopNum; j++ {
			if j == 1 {
				break BreakLoop
			}
			fmt.Println("i:", i, ", j:", j)
		}
	}
	
	fmt.Println("\nContinueLoop")
ContinueLoop:
	// fmt.Println("ラベルとforの間にコードを書いてはいけない") コンパイルエラー
	for i := 0; i < loopNum; i++ {
		for j := 0; j < loopNum; j++ {
			if j == 1 {
				continue ContinueLoop
			}
			fmt.Println("i:", i, ", j:", j)
		}
	}
}
```

```go:実行結果
BreakLoop
i: 0 , j: 0

ContinueLoop
i: 0 , j: 0
i: 1 , j: 0
i: 2 , j: 0
```

# おわりに
今回はここまでです。
GCP: Cloud SQL

# Introduction

https://cloud.google.com/sql/docs/introduction

![example](https://cloud.google.com/static/sql/images/intro2.png)

- Cloud SQLができること
    - バックアップ
    - 高可用性とフェイルオーバー
    - ネットワーク
    - エクスポートとインポート
    - メンテナンス
    - モニタリング
    - ログ
- VM上で動くRDBMS
- 高可用性オプションの際はスタンバイVMも作られる

# Key terms

https://cloud.google.com/sql/docs/key-terms

- インスタンス: 1VM
- DB: MySQLやPostgreSQLなどのセット
- HA: 高可用性、同期的で同一リージョン異なるゾーンのインスタンスを2つもつ
- フェイルオーバー: プライマリインスタンスからスタンバイへスイッチする
- リードレプリカ: プライマリインスタンスのコピー、リードリクエストを処理できる
- Auth proxy client: SSL/TLSコネクションやファイアウォールに使える

# Pricing

https://cloud.google.com/sql/pricing

- CPU数とメモリ量
    - 最大96CPUと624GBまで
- ストレージとネットワーク
- インスタンス
    - 共有コアインスタンスの場合
- リードレプリカも課金対象
- エクスポート時
- SQL Serverの場合はライセンス費も必要

# Quotas and limits

https://cloud.google.com/sql/docs/quotas

- 100インスタンス / プロジェクト
- クオータを増やすためにプロジェクトを跨いでインスタンスを利用できる
- 50,000テーブル / インスタンス
- 16TB / テーブル
- 64TB / ストレージ
- コネクション数はマシンタイプにもよるが50~100程度
QiitaでPower Platformの記事人気度を調べる

## はじめに

先日、Microsoftは無料なトレーニング・イベントを開催していることをみつけました。
リンク
` https://www.microsoft.com/ja-jp/events/top/training-days `

最近開催しているのは主に基礎トレーニングですが、自分は今までMicrosoftのツールを深く学んだことないですから、授業内容はとても自分向けだと思いました。

また、トレーニング・イベントを参加するも1つのメリットとしては、１回無料でMicrosoftの認定試験を参加できることです。

この前、友人とすこしMicrosoft Power BI話したことありますので、まずは
Microsoft Power Platform Virtual Training Day:基礎　から参加したいです。

あまり日本でPower Platformの人気を知らないので、今回のprotooutテーマはPower Platformについての調査を設定しました。


## 知りたいこと
１最近半年、Qiiita（プラットフォーム）でMicrosoft Power Platformに関する記事数？
２人気度を知りたいので、そのなかにlikeが10以上な記事数？


## 流れ

まずはqiita developerページを読みましたが、中身は自分にとって少し難しいでした。
リンク
` https://qiita.com/api/v2/docs#get-apiv2tagstag_id `

そのため、改めまして前の記事から情報を収集しました。

また、tagの設定はpowerplatformです


## 作業

#### 「http request」に下記条件で入力しました：
` https://qiita.com/api/v2/items?page=1&per_page=30&query=title%3Apower&sort=stocks_like+created%3A%3E2022-04-17 `

#### JSON形式
``` [{"id":"83992198831e8e46","type":"inject","z":"b1503a2d3d8902e8","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":230,"y":320,"wires":[["b13647fdbdfe47c1"]]},{"id":"b13647fdbdfe47c1","type":"http request","z":"b1503a2d3d8902e8","name":"","method":"GET","ret":"obj","paytoqs":"ignore","url":"https://qiita.com/api/v2/items?page=1&per_page=30&query=title%3Apower&sort=stocks_like+created%3A%3E2022-04-17","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"x":400,"y":320,"wires":[["ecfc3e247aa1916a"]]},{"id":"ecfc3e247aa1916a","type":"debug","z":"b1503a2d3d8902e8","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":590,"y":320,"wires":[]}] 
```

#### note-red画面
![note-red画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885175/aca1a0a5-66e5-6c00-3d7b-6b48da4837b7.png)


## わかったこと
合計30個 objectがありました。

| Title      | 記事数　      | 
|:-----------|------------:|
| Power Query     | 4       |
| Power Automate  | 9      |
| Power BI        | 9        |
| Power Pages     | 1          |
| Power Apps      | 5       |
| Power Platforms overall    | 1     | 
| PowerPoint      | 1     | 

結果的に、
Power Automate と　Power BIに関する記事は一番多かったです。
私みたいに、特に何を解決すつでもないが、Power Platformのことを学びたいひいとは、
この２つから初めていいかもしれません。


## 反省点

1. 自分がqiita developerページの中身をはっきりと理解できていないことです
2. 他人protoout記事をよみ、自分の内容足りていないと思います
WebauthnのResident Keyについて（+Passkeyについて）

WebauthnのResident Keyについて自分が調べたことをつらつら書いた記事。執筆途中にGoogleから、Resident Keyとも関係が深い、Passkeyへの対応の発表があり、今後ますます熱い分野になると思われる。

# Resident Keyという用語について

規格上はResident Keyという用語は非推奨とされており、現在はDiscoverable CredentialとかClient-side Credentialと呼ぶ。その反対はServer-side Credentialである。にもかかわらず、WebauthnのAPI上では`residentKey`等の名前を昔のまま使っており、混乱を招く状況になっている。この記事内ではAPIに使われていておそらくより伝わりやすいResident Keyとその反対のNon-Resident Keyという用語を使う。

# Resident Keyの目的
Resident Keyの目的は**ユーザーネームレス認証**を可能にすることである。Webauthnの目的はパスワードレス認証だが、そこからさらに進めてユーザーネームすら不要にするのがResident Keyである。Non-Resident Keyの場合、ログイン時に最低でもユーザーIDにあたるものをユーザーに入力させねばならないが、Resident Keyならユーザー登録をするときはスマホの指紋認証を触るだけ、ログインする時も触るだけ、他には何も入力の必要がない、という体験を実現できる。

より実装に近い話をすると以下のようになっている。新しいキーを`navigator.credentials.create()`で作成するとCredential IDが返ってくる。このときNon-Resident Keyとして作成すると次に`navigator.credentials.get()`で認証するときにそのCredential IDを引数の`allowCredentials`に入れて渡さねばならない。Resident Keyとして作成すればCredential IDを渡す必要はなく、`allowCredentials`は空で良い。

よってNon-Resident Keyとして作成する場合は`navigator.credentials.get()`を呼び出す前にCredential IDが分かってなければならないということだ。Credential IDが分かっているためにはあらかじめユーザーにユーザーID等を入力させ、それに紐づいたCredential IDをデータベース等から取ってくるという流れが必要である。ユーザーネームレスにはならない。

Resident Keyとして作成すればCredential IDが必要ないのでユーザーID等を入力させる必要がない。クライアント側で登録された使用可能なキーの中からユーザーが選んで使うキーを決めるということになる。

# なぜNon-Residentな方式が存在するのか？
入力する項目が少ないに越したことはないので、そもそもNon-Residentな方式は必要なのか？という疑問が出てくる。Resident Keyでもユーザーネームが欲しいなら追加で入力させればいいだけだし、キーはオリジンごとに格納されており他のオリジンのキーはどうやっても見れないわけだからセキュリティのレベルが下がるということもないと思われる。

ではなぜNon-Residentな方式が存在するのかというと、そちらの方が**認証器の実装が簡単だから**であリ、具体的にいうとNon-Residentな場合、**認証器は自分が生成したキーに関する情報を一切自分で記憶しないステートレスな実装にできる**。Webauthnの解説で「認証器では秘密鍵と公開鍵のペアを生成し、そのうち秘密鍵は認証器の中で保管します」という説明がされることがあるが、実はこの秘密鍵すら必ずしも認証器の中で保管されているとは限らないということだ。その場合認証器には鍵の情報を持っておくストレージが要らないので実装を相当単純にできる。ちなみにストレージが不要ということは無限に鍵を生成できるということでもある。

いやいや、認証器が自分で生成した秘密鍵を記憶しないでどうやって認証器を実装するねん...と思うかもしれないが、これはCredential IDを活用することで可能である。
Credential IDはIDという名のイメージと異なり、バイト列で表されしかも私の環境で80バイト近くあったりと結構長く取ることができる。よって生成した鍵ペアの秘密鍵やその他鍵の情報をCredential IDに含めてしまえば良いのである。そして当然それらの情報をそのままCredential IDとして返せば秘密鍵がバレてしまうので、認証器の中にある認証器しか知らないマスターキーで暗号化して含めれば良いのである。Credential IDはRelying Party側で保管されて認証時にまた与えられるので、認証器はそれをマスターキーで復号すれば秘密鍵等を取り出し認証作業ができる。

ちなみにこのようなステートレスな実装方法は規格書にも書かれていることである。

https://www.w3.org/TR/webauthn-2/#credential-id

# Resident Keyの対応状況
執筆時点(2022年10月)ではResident Keyはまだ主要なOS、ブラウザの全てで対応しているとは言えない。特にAndroidのChromeに対応していない。よって一般に公開されたウェブサイトに使うのは事実上無理である。

またResident Keyに対応していても本当に「使える」かは別問題だったりする。Resident Keyはユーザーのデバイス側に鍵の情報を持つので、鍵の情報を管理する機能がOSやブラウザ側に必要である。認証時に使える鍵が複数あった場合にユーザーに選んでもらうUIや、要らなくなった鍵を削除するUI等である。Non-Resident Keyと違い、こうした機能はOSやブラウザ側で実装してもらわなければ、我々アプリケーション開発者にはどうフォールバック実装をすることもできない（鍵はデバイスが持っていて、それにアクセスするAPIも存在しないので）。しかしこのような鍵の管理機能を一通りちゃんと実装しているOSやブラウザは現状ないと思われる。

# Passkeyについて
この記事の執筆中にGoogleからAndroidでのPasskeyの対応について発表があった。Passkeyは端末を跨いでResident Keyを共有する仕組みだが、おそらくAndroidのChromeのResident Key対応はこのPasskey対応と統合されて実装されると思われる。Android以外のOSでもPasskey対応と一緒に鍵管理機能が搭載されることになるのだと思う。AndoridのPasskeyはまだ開発者向けだが、着実にパスワードレス、ユーザーネームレスの未来は来ている。

https://android-developers.googleblog.com/2022/10/bringing-passkeys-to-android-and-chrome.html
dSYM Uploadが失敗する | dSYMが不足している

# Problem(s)
 - 最新のXcodeではビットコードが非推奨になりビットコードをアップロードしなくなったアプリはApp StoreからdSYMファイルをダウンロードできなくなりました。CIでfastlaneの`download_dsyms`を使っている場合や手動でdSYMがダウンロードできなくなるとFirebase Consoleで「dSYMが不足している」とエラーが出てクラッシュログが見にくくなります。
 - Firebase SDKに内包されているスクリプト`run`を使ってdSYMを直接Firebase Consoleにアップロードする方法がありますがこの方法には現時点でバグがありdSYMを探し出せない場合があります。

実際に多くのプロジェクトでdSYMの運用が一時的にXcodeから手動アップロードになっているのではないでしょうか？

# Solution

以下のURLが参考になります。

https://minidev.dev/blog/2022/09/30/upload-dsym-to-firebase-crashlytics-with-xcode-14/

許可をもらいましたので以下かいつまんで翻訳したものを紹介します。

 - Run Scriptに以下のスクリプトを入力

```
# Swift Package Manager を使っている場合　以下:
SPM_ROOT=$(dirname $(dirname $BUILD_ROOT))/SourcePackages/checkouts
"${SPM_ROOT}/firebase-ios-sdk/Crashlytics/upload-symbols" -gsp /PATH/GoogleService-Info.plist -p ios $TARGET_BUILD_DIR

# CocoaPods を使っている場合　以下:
"${PODS_ROOT}/FirebaseCrashlytics/upload-symbols" -gsp /PATH/GoogleService-Info.plist -p ios $TARGET_BUILD_DIR
```

**PATH** = GoogleService-Info.plistのパスを設定してください。プロジェクトごとに異なると思いますが、プロジェクト新規作成時置かれているInfo.plistと同じ場所にある場合は`$PROJECT_DIR/$PROJECT_NAME/GoolgeService-Info.plist`になるでしょう。

---

🍎 上記のスクリプトを修正するとビルド時にdSYMがアップロードされます。dSYMはアップロードしてからそれがFirebase Consoleに反映されるまで時間がかかります。私の場合1時間くらい経ってから反映されました。
Oracle Linux 8.6にOracle19cをインストールする　1/2　前準備編

# はじめに
Hyper-V上に作成したOracle Linux 8.6にOracle19cをインストールします。
まず、OSの設定等を行います。
[こちら](https://qiita.com/t_skri/items/1934d4a6fc40a9f35cad)の続きになります。

# hostsの設定
hostsに自身のIPアドレスとホスト名を追記します。
(IPアドレスはご自身の環境に合わせてください)
こちらの設定を行っておかないとインストール時、詰まります。
```:/etc/hosts
-- 編集
# vi /etc/hosts
192.168.xxx.xxx ol86 ol86.domain

--- 確認
# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.xxx.xxx ol86 ol86.domain
```

# firewallの設定
外部PCからアクセスできるようにポート開放をします。
```
-- ポート開放
# firewall-cmd --add-port=1521/tcp --add-port=5500/tcp --zone=public --permanent
-- 恒久設定の再読み込み
# firewall-cmd --reload

-- 確認
# firewall-cmd --list-all --zone=public

public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: cockpit dhcpv6-client ssh
  ports: 1521/tcp 5500/tcp
  protocols:
  forward: no
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
```
# SELinuxの無効化
oracleの自動起動行う際、SELinuxが有効になっていると上手く起動出来なかったので、無効化しておきます。
（無効化しないで出来る方法ご存知の方がいましたら教えてください。）
SELINUX=enforcing → SELINUX=disabled
```:conf
-- 編集
# vi /etc/selinux/config

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled ←ここを変更
# SELINUXTYPE= can take one of these three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

-- 再起動
# reboot

-- 確認
# getenforce
Disabled
```

# Javaのインストール
最新のJDKをインストールします。
```
# yum install java-1.8.0-openjdk

-- 省略
完了しました!

-- 確認
# java -version
openjdk version "1.8.0_345"
OpenJDK Runtime Environment (build 1.8.0_345-b01)
OpenJDK 64-Bit Server VM (build 25.345-b01, mixed mode)
```
# Oracleデータベースのダウンロード
下記のサイトから「LINUX.X64_193000_db_home.zip」をダウンロードします。
https://www.oracle.com/database/technologies/oracle19c-linux-downloads.html

ダウンロードしたZipはWinSCP等を使用してOracle Linuxの/tmpに保存しておきます。

# 日本語フォントのダウンロード
下記のサイトから「IPAexfont00401.zip」をダウンロードします。
https://moji.or.jp/ipafont/ipaex00401/

ダウンロードしたZipはWinSCP等を使用してOracle Linuxの/tmpに保存しておきます。

# X Window Systemの設定
oracleのインストールはGUIで行います。
事前にX Window Systemが使えるようにしておきます。
[こちら](https://ひとりでできるもん.com/2020/09/11/x-window-system%E3%81%A3%E3%81%A6%E3%81%AA%E3%81%81%E3%81%AB/)のサイトが参考になります。


# まとめ
以上が前準備となります。
Azure Fundamentals(AZ-900)：Azure の基礎: Azure のアーキテクチャとサービスについて説明する「Azure仮想プライベートネットワーク(VPN)」

Microsoft Learnを用いたMicrosoft Azure Fundamentals(AZ-900)の試験内容をまとめる投稿です。
この投稿ではMicrosoft Learnで学ぶ内容をできるだけ簡潔にまとめております。
Azureの勉強を一から始める方の参考になれば幸いです。

## 今回の学習内容
**◆「Azure仮想プライベートネットワーク(VPN)」**
◇対応するMicrosoft Learn ラーニングパス
[Azure の基礎: Azure のアーキテクチャとサービスについて説明する](https://learn.microsoft.com/ja-jp/training/paths/azure-fundamentals-describe-azure-architecture-services/)
◇対応するモジュール
[Azure 仮想プライベート ネットワークについて説明する](https://learn.microsoft.com/ja-jp/training/modules/describe-azure-compute-networking-services/10-virtual-private-networks)

※前回の投稿は下記から確認できます。
[Azure Fundamentals(AZ-900)：Azure の基礎: Azure のアーキテクチャとサービスについて説明する「Azure仮想ネットワーク(VNet)」](https://qiita.com/fsd-jume/items/4a0d14f1e415f7c2c165)

## Azure仮想プライベートネットワーク(VPN：Virtual Private Network)
### 仮想ネットワークゲートウェイ
・VNet内の特定のサブネット(ゲートウェイサブネット)にデプロイされる2台以上のVMで構成される
・ゲートウェイVMにはルーティングテーブルが含まれ、特定のゲートウェイサービスが実行される
・仮想ネットワークゲートウェイは「VPNゲートウェイ」と「ExpressRouteゲートウェイ」の2種類

### VPNゲートウェイ
・ゲートウェイサブネットにデプロイされたゲートウェイVM
・各VNetに1つのみデプロイ可能
・1つのゲートウェイを複数の場所に接続することは可能
・VPNゲートウェイにより、下記の接続が可能
　-個々のデバイスはポイント対サイト(P2S)接続を介してVNetに接続
　-オンプレミスデータセンターはサイト間(S2S)接続を介してVNetに接続
　-仮想ネットワークはVNet対VNet(V2V)接続を介して異なるVNetに接続
・接続要件に応じてVPNの種類を「ポリシーベース」と「ルートベース」から指定する

**◆ポリシーベース(PolicyBased)VPNゲートウェイ
⇒静的ルーティングゲートウェイ**
・各トンネル間で暗号化する必要のあるパケットのIPアドレスを静的に指定
・アドレスの組み合わせで構成された条件(ポリシー)に基づいてトンネル経由でパケットを送信

**◆ルートベース(RouteBased)VPNゲートウェイ
⇒動的ルーティングゲートウェイ**
・各トンネル間で暗号化して送信されるパケットはルーティングにより決まる( =動的に指定)
・下記のいずれかの種類の接続が必要な場合に使用
　-V2V接続
　-P2S接続
　-マルチサイト接続(VNetに2つ以上のオンプレミス環境を接続)
　-ExpressRouteゲートウェイとの併用

### 高可用性のシナリオ
**◆アクティブ/スタンバイ**
・VPNゲートウェイはデフォルトでアクティブ/スタンバイ構成の2つのインスタンスとしてデプロイされる
※1つのVPNゲートウェイリソースしか表示されない場合でもスタンバイインスタンスは構成されている
・アクティブインスタンスが使用不可になるとスタンバイインスタンスが自動的に動作を引き継ぎ(フェールオーバー)、通信が復旧する
・フェールオーバー中は通信不可
・アクティブインスタンスに対する計画メンテナンスでは10～15秒以内に通信が復旧
・アクティブインスタンスに対する計画外の中断では1分～3分以内に通信が復旧

**◆アクティブ/アクティブ**
・各インスタンスに一意のパブリックIPアドレスを割り当てることで可能
・オンプレミスデバイスから各IPアドレスに対して別のトンネルを作成
・VNet側からの通信は、どちらのトンネルも使用する(1つのTCP/UDPフローは同じトンネルを使用する)
・片方のインスタンスが使用不可になった場合、もう片方のインスタンスで通信が継続される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851723/49654127-eb2f-c511-942d-0def4d2905bf.png)

### 高可用性のシナリオ
**◆ExpressRouteのフェールオーバー**
・ExpressRoute接続用のフェールオーバーパスとしてVPNゲートウェイを構成することも可能
⇒ExpressRoute回線で障害が発生した際に、VPNゲートウェイを使用することでVNetへの接続を維持

**◆ゾーン冗長仮想ネットワークゲートウェイ**
・単一もしくは複数の可用性ゾーンに複数のゲートウェイをデプロイ可能
⇒仮想ネットワークゲートウェイに回復性、スケーラビリティ、高可用性が提供される
⇒オンプレミスとAzureの接続を可用性ゾーンレベルの障害から保護
・VPNゲートウェイとExpressRouteゲートウェイでそれぞれ冗長可能
・パブリックIPリソースの構成とゾーン指定の有無により、ゲートウェイSKUが決まる
※SKU(Stock Keeping Unit)：在庫管理の最小単位、同じ製品の様々な形状を表す
　⇒ゲートウェイSKUであれば、同じゲートウェイにおける個別のサービスを表す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851723/9139cf21-e42f-c764-ae70-7c15e8168b13.png)

## 次の学習内容
**◆Azure ExpressRoute**

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

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

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