OmniAICreator/Qiita-1.07M huggingface dataset:
これからのセキュリティプラットフォームとしてSynkがいいのでは！

この記事は「[Snykを使って開発者セキュリティにまつわる記事を投稿しよう！ by Snyk Advent Calendar 2022](https://qiita.com/advent-calendar/2022/snyk)」の12/15記事となります。

突然ですが犬派ですか？猫派ですか？

私は断然犬派です！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25184/cbe44f89-da73-bcb6-05bc-835d0046c47a.png)

という訳で、凛々しいパッチがガードしてくれるセキュリティプラットフォームのsynkに関して少しでもお伝えできればと。

Synk
https://snyk.io/

## セキュリティチェック
Snykではセキュリティチェックの対象としてソースリポジトリはもちろんのこと、コンテナレジストリなど様々なツールとの連携が可能です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25184/cdeb78af-2554-5d85-0637-eaf125e322cb.png)

VSCodeやSlackなどとも連携が可能なんですね。
最初に私が触ったのは9月頃でしたが、連携対象も増えておりより多くのプロジェクトでの活用が見込めそうです。

Snykに関して調べていく中で知ったこととしては、コンテナに対しての静的な解析・診断も行ってくれることです。
Github上で大きなプロジェクトを立ち上げているわけでもない私にとっては、各プロジェクトはその時その時のものでしかありません。
しかし、Publicに公開しているプロジェクトである以上、誰かしらの目にとまることを考えるとセキュリティ的なリスクを内包したままでは心苦しいところ。
かと言って、自分で調べて対応するというのは厳しい。。。

そこでSnykですよ

## Githubで試してみる
という訳で、過去にチュートリアルを元にした勉強用プロジェクトを対象に診断をかけてみた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25184/0ae9a522-33a3-01ce-da41-995f826edcc9.png)

Code analysis ではミディアムが6件検知されているけど、問題はpackage.json。
作ってから放置されているので、そりゃ問題があるバージョンが定義されているんだろうな。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25184/8321a420-5a1a-f7fe-7158-67e7923e8548.png)

選択すると、何が問題かを教えてくれる。そこで「Fix this vulnerability」を選択する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25184/02452405-d8c5-27e0-b731-9dd3640ba657.png)

一番下にある「Open a Fix PR」を押すと、自動でPRを作ってくれる。
ちなみに、出来ることと出来ないことはやっぱりあって、下の3つは自動では無理のようだ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25184/7acd0931-aa9d-5cf9-ac8d-d6870f9dca4c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25184/e89800de-ab2c-f404-c706-025b1361c409.png)

expressのバージョンが変わったことがわかる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25184/a60426bd-3ca2-87ef-c812-78be4d77f0e8.png)

無事に、驚異が取り除かれました！

別のプロジェクトでも試してみると、、、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25184/46b077d6-df31-49db-bd86-e404c25807a9.png)

XSSの脆弱性を数多く指摘してくれていました。

## 継続した検査が必要です！
連携に関しては設定ページから確認が可能です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25184/35e74786-404b-c1cf-c393-3c1b89e700e1.png)

XSSなどの脆弱性に関しては問題外ではあるものの、使用しているライブラリの脆弱性や、コンテナに埋め込まれた問題などを個人でキャッチアップするのは現実的ではありません。

また、それらに対して継続して確認していくのは更に難しいでしょう。

Synkであれば、継続した診断を行ってくれて、更にサマリをメールで通知してくれます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25184/3d7e31e4-f0bf-7898-c264-f8eb9987b616.png)

至れり尽くせりですね。
もちろん、レポートされたとしても対応は必要となりますが、その敷居を大きく下げてくれていると感じます。

この先、コンテナを用いたアプリケーション構築がより多くなり、ソースコード上からでは分かりづらい問題が多く発生する可能性があります。
だからこそ、この部分はしっかりとしたところに自動化して欲しい。

その有力な選択肢となると期待しています。

## 最後に

そんな私は、セキュリティだけでなく肩こりも解消したいので「ガチガチ肩こり解消したい賞」を狙っていきたいと思います。
冒頭でも言いましたが、私は犬派で飼っているのも犬なので猫トイレは困ります。
多分、パッチもなんで犬トイレじゃないのかと困惑していると思います。
これは脆弱性で修正されるべきではないでしょうか！
Azure Container Instances

●Azure Container Instances(ACI)
Dockerコンテナーを実行するためのシンプルな環境を提供するサービス。

特徴
・高速な起動
PaaSのサービスであるため、仮想マシンをプロビジョニングして管理は不要で数秒程度でコンテナーを開始できる。

・アクセス範囲を選択可能
ACIではコンテナーインスタンスの作成時に、パブリックとして使用するか、Azure内部のみ(プライベート)で使用するか選択できる。
パブリックとして使用する場合は、パブリックIPアドレスとFQDNが割り当てられインターネットに公開される。
内部で使用すｒ場合は、仮想ネットワークとサブネットを選択して作成し、仮想ネットワーク上の他のリソースやオンプレミスネットワーク上にリソースと通信できる。

※オンプレミスネットワーク上のリソースと通信するには、VPN GatewayやExpressRouteの構成も必要。

・柔軟なサイズ指定が可能
コンテナーの性能は、コンテナーが実行されるコンピューティング環境であるインスタンスのサイズい依存。

・データ保存のためにAzure Filesを利用可能
ACIでは、Azure Filesで作成されたAzureファイル共有をマウントすることで、コンテナーを停止した後でもその様なデータを保持できる

・WindowsコンテナーとLinuxコンテナーをサポート
PHP／URLの存在確認に「file_get_contents」を使って後悔した件

## はじめに
PHPでIOT機器の死活監視をするときに「file_get_contents」関数を使った時に、後で後悔することがあった・・という話です。
死活監視といっても難しいことはせず、監視対象のIOT機器がWEB設定画面を持っていたのでログイン画面のURLをたたいて応答有無で簡易的に死活監視したという程度のことですが。
## file_get_contentsでいけると思ったけど
トラブル対応の一環でIOT機器の死活監視ツールを頼まれまた時のことです。
急いでほしい言われて、簡単に書ける「file_get_contents」を使いました。
[PHP-マニュアル-file_get_contents](https://www.php.net/manual/ja/function.file-get-contents.php)
「file_get_contents」関数が遅いといわれているのは知ってましたが、ファイル全部ではなくて、先頭の10文字分だけ読み込むなどの工夫で、せいぜい30から40台程度のIOT機器を1分程度でチェックできればいいなら、タイムアウト設定も可能ですし問題ないだろうと判断しました。
その時のイメージがこんな感じです（エラー処理とか枝葉は省いてますが）。
```
$context = stream_context_create([
    'http' => [
        'timeout' => 5
     ]
]);
$ret = @file_get_contents($url, FALSE, $context, 0, 10);
//取得できたかどうかを判定
if($ret != false){
    //取得できた
}else{
    //取得できなかった
}
```
タイムアウト５秒で、「0, 10」の引数で先頭の10文字だけ読み込むように強制し、「@（エラー制御演算子）でエラーメッセージを抑制しています。
file_get_contents関数は、成功したら読み込んだデータを返し、失敗で false を返すので「false」でなければ応答があったと判定する・・という感じです。
## 問題発生：開発環境と本番でレスポンスが違う
その時の開発・テスト環境はWIndows10でした。
本番環境はUNIX系OS（FreeBSDと聞いています。バージョンは聞いていません。）です。
PHPのメジャーバージョンは、どちらも7.3です。
開発環境と本番環境でOSが異なる、いわゆるクロスプラットフォームです。
ですが、プロジェクトはずっとそれでやっていて、問題になったことはなかったのです。
ところが。
開発・テスト環境では問題なく動作したソースが、本番環境の動作確認で「NG」になりました。
確認していくと「file_get_contents」関数の戻り値が違います。
同じURLなのに、Windows環境だと文字列、本番環境ではNULLが返ってきていました。
Windows環境だと存在しないとfalseが返り、存在すると文字列データが返ってくるのに、本番環境だと存在しないとfalseが返り、存在するとNULLが返ってきます。
エラーになっているわけではありません。
単にレスポンスがNULLなだけです。
この時は、本番環境の権限を開発用に最低限しかもらってなかったので、これ以上の調査ができず、結局、原因はわからずじまいでした。
まあ、PHPのcURLを使って「file_get_contentsの代替関数」を作って、なんとかなったのですが、時短のつもりで「file_get_contents」を使って、余計な手間をかけただけになった・・と後悔しました・・・やれやれです。
## 対応：cURLを使った代替関数
その時、僕が用意した「file_get_contentsの代替関数」は、こんな感じでした。
```
public function curl_file_get_contents($url,$timeout){
   $curl = curl_init($url);
   $options = array(
       CURLOPT_RETURNTRANSFER => true,
       CURLOPT_TIMEOUT => $timeout,
       CURLOPT_SSL_VERIFYPEER => false, 
   );
   curl_setopt_array($curl, $options);
   $result = curl_exec($curl);
   //$errno = curl_errno($curl);
   //$error = curl_error($curl);
   curl_close($curl);
   if($result === FALSE){
       return false;
   }else{
       return true;
   }
}

```
実際は「curl_errno()」や「curl_error()」の情報をログに書いたり、もう少しゴチャゴチャしてますけど、枝葉の部分は割愛してます。
これを以下のように使ってURL存在チェックをするように変更しました。
```
$ret = curl_file_get_contents($url,5);
//取得できたかどうかを判定
if($ret != false){
    //取得できた
}else{
    //取得できなかった
}
```
本番環境での問題は、この方法で解決できました。
開発環境と本番環境でまったく同じ動きになります。
その後、他のLinuxディストリビューションとかで同じようなことを頼まれて流用しましたが、今のところ、この方法で問題がでたことはありません。
たぶん、僕は同じ要件の依頼がきても「file_get_contents」はもう使わないです（笑）。
ではでは。
[cri-tools]dockerとcrictl コマンドの対応表を書いてみた

# [cri-tools]dockerとcrictl コマンドの対応表を書いてみた

:::note info
この記事は[KDDI Group Developer Community Advent Calendar 2022](https://qiita.com/advent-calendar/2022/kgdc)の12日目の記事です
:::

## インストール方法

### brew install でインストール

[Homebrew Formulae](https://formulae.brew.sh/formula/cri-tools)

```bash
brew install cri-tools
```

### GiHub のリリースページからインストール

[cri-tools](https://github.com/kubernetes-sigs/cri-tools/releases)

## コマンド一覧 - dockerコマンドとの対応表

|docker|crictl|説明|
|:---|:---|:---|
|docker pull|crictl pull|コンテナイメージの取得|
|docker images|crictl images|コンテナイメージの一覧|
|docker rmi|crictl rmi|イメージの削除|
|docker image inspecti|crictl inspecti|イメージの情報を取得|
|docker create|crictl create|コンテナの作成|
|docker run|crictl run|コンテナの実行|
|docker ps|crictl ps|コンテナの一覧|
|docker inspect|crictl inspect|コンテナの詳細を表示|
|docker stats|crictl stats|コンテナのリソース消費状態を表示|
|docker attach|crictl attach|コンテナにコンソール状態をアタッチ|
|docker exec|crictl exec|コンテナでプロセスを実行|
|docker logs|crictl logs|コンテナのログを表示|
|docker rm|crictl rm|コンテナを削除|
|docker stop|crictl stop|コンテナの停止|
|docker start|crictl start|コンテナの開始|
|docker update|crictl update|コンテナの更新|
|-|crictl runp|Podの実行|
|-|crictl rmp|Podの削除|
|-|crictl inspectp|Podの情報を表示|
|-|crictl stopp|Podの停止|
|-|crictl port-forard|Podのポートフォワード|
オレオレbotアーキテクチャ

[botterアドカレ](https://qiita.com/advent-calendar/2022/botter)の記事です。

みんなbotの設計どうやってるんだろー、なんかbotのアーキテクチャの記事って少ないよなー、と思ったのでまずは自分が書いて公開することにしました。

私が見たことある設計周りの記事は、hohetoさんの[記事](https://note.com/hht/n/nabc23fa1a210)と、同じアドカレ内のとっとり（砂丘）さんの[記事](https://zenn.dev/ttrsq/articles/1280cb7ac7d1b4)があります。ご参考までに。

設計はいくらがんばっても収益には直接結びつかないですが、きちんとした設計は迅速なbot開発や安定稼働などにつながり、収益機会を逃すことが減るはず。



# オレオレbot設計の概念図
私のbot設計を書きます。おそらく一般的な設計だと思います。
このbot設計は、基本は1分足以上のロジックを想定していますが、板を見て発注するような高頻度ロジックの稼働実績もあります（1ヶ月で3000円ぐらいの雑魚高頻度botでしたが、、、）。

■実稼働クラス設計
![スクリーンショット 2022-12-11 11.21.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2414890/3c226b59-d87a-04c0-35d5-058b7377c8d1.png)
■バックテストクラス設計
![スクリーンショット 2022-12-11 11.24.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2414890/3bf01351-505e-ffe6-be98-044487f9aa42.png)

- 実稼働はbot稼働プロセスとdata fetchプロセスの2プロセスで動く。
- exchangeクラスとapiクラスで取引所ごとの差異を吸収したり、エラーハンドリングしたりする。
- botのロジック記述は実稼働とバックテストで共通。また、どの取引所なのか、どのペアなのか、実稼働orバックテストをほぼ意識しない。

# 主なクラス
- bot
- exchange
- backtest_exchange
- data_getter
- data_fetcher
- rest_api
- realtime_api
- parameters

## bot
botのロジックを記述するクラス。取引所ごとの差異やエラーハンドリング、バックテストかどうかを意識しなくても良い。

## exchange
botのロジックからの発注処理(create_limit_order,cancel_order,...)やデータ取得処理(get_ticker,get_book,get_ohlcv,...)を処理する。取引所ごとの細かい仕様の違いを処理し、botクラスでロジックに集中できるようにする。
細かい違い例：
・最小ロットの差
・pipsの差
・ほとんどの取引所でリニアBTCUSDペアで1枚=1BTCなのに、phemexは1枚=0.001BTCなど
・APIで証拠金取得した時、未確定損益が含まれている値かどうかの違い

## backtest_exchange
バックテストのためのexchangeクラス。シミュレーションでexchangeクラスのように振る舞う。

## rest_api, realtime_api
取引所のAPIに接続するクラス。取引所ごとにこれを継承したクラスを作り、クラス内で取引所ごとの差異を吸収する。エラーハンドリング、遅延発生時の再接続をこのクラス内で完結。

## data_getter, data_fetcher
処理については略。
データベースはsqlite。ちゃんとしたデータベースにするかどうか検討中。
データベースにはローソク足や約定情報のほか、手数料やpipsなどを保存。現状、データ量が増える&過去データ取れないので板情報はない。

## parameters
上の概念図には書きませんでしたが、parametersクラスで全クラスのパラメータを管理しています。
たとえば、
```.py
params.backtest=True
```
とすれば各クラスはbacktestモードで動くようになります。
```.py
params.pairs=[["binance","btcusdt"]]
```
とすれば各クラスはbinanceのBTCUSDTを参照するように動きます。

# おわり
みなさんもbot設計公開しましょう！
ゲストアカウントでアプリへの入力を少しだけ楽にできるかもしれない小技

こんばんは。
今日は12月14日だけど12月12日に書いてます。

さて今日は、結構状況が限定されそうなんですが↓こんな場合を想定した小技

「ゲストアカウントで入った環境で、とあるアプリにすばやく入力したい！」

入力したいデータは、Excelにいい感じにまとまっているとしましょう👀
Excel読み込めたらいいのに読み込ませられない！って時に使えるかんじのこわざです。

## アプリの下準備
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/e7c2f447-55c0-e823-cf23-610ce007ee08.png)

フィールドコードが、

品名：文字列(1行)
単価：数値

な感じのフィールドがあるとします。
フィールドコード分かんないのアプリの場合は
↓こちらでフィールドコードを表示させます。
https://potara.net/2020/12/02/1384

## Excelの準備
Excelにこんな感じで表を作りましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/ae91bf7d-3ee2-2b54-392a-66db9a848e28.png)

C列には関数を書きます。
```
="robj=kintone.app.record.get();rec=robj.record;rec.品名.value='" & A2 & "';rec.単価.value='" & B2& "';kintone.app.record.set(robj);"
```

そして下までコピー（Ctrl+Dがおすすめ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/469f4b37-84c3-a552-f33e-c07a1553cdd8.png)

## 楽しい入力タイム！

※エクセルのセルC2を以下にコピーします。
```
robj=kintone.app.record.get();rec=robj.record;rec.品名.value='消しゴム';rec.単価.value='300';kintone.app.record.set(robj);
```
### 新規作成画面
kintoneアプリのレコード追加画面を開いて、ディベロッパーツールのコンソールを表示させます。

C列のどれかをコピペして、コンソールに貼り付けてEnter!

![2022-12-13_00h02_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/e10286b8-96a7-2803-f34a-8496ab4c5f44.png)


### 結果！

入力される👀
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/534a098b-dd3c-6c4d-40d1-c1260da9ed44.png)


以上！！！何かの役に立つといいな～。
DirectConnectについて

# 本記事について
この記事では３回目のANS-C01を受けるにあたって勉強した内容を整理するための記事です。
詳しくは[こちら](https://qiita.com/the13-HK/items/349cdf5f38e0ce1e47b1)をご覧ください。
今回はDirectConnectの記事となります。

# Direct Connectについて
オンプレミスとAWSの環境をセキュアに接続したときに使用するサービス
VPNによる接続でも可能だが、DirectConnectは以下のパターンの時に選択されるケースが多い

- インターネット接続無しで接続を行うとき
- 安定した帯域を確保して通信を行うとき

### Direct Connectで接続を行う場合に設定すべきもの

- 接続線（DirectConnectロケーションというDirectが物理的に設置されている場所を具体的に指定して、そこで物理接続する）
    - ホスト接続（DirectConnectの接続サービスを提供しているパートナーからDirectConnectを借りる）
    - 専用接続（自分でDirectConnectを繋いじゃう）
- インターフェイス
    - ゲートウェイ
        - オンプレ側
            - カスタマーゲートウェイ（オンプレ側のDirect Connectのエンドポイント）
        - AWS側        
            - バーチャルプライベートゲートウェイ（AWS側のCirectConnectとVPCを直接つなげる際のエンドポイント）
            - Direct Connectゲートウェイ（DirectConnectの接続をハブ的に使用したいときにつなげるエンドポイント）
                - ただし上限が10個
                - DirectConnectにTransitGatewayを繋げることで拡張可能
                - グローバルサービス
    - VIF（バーチャルインターフェース）
        - プライベートVIF：プライベートIPによる接続
        - パブリックVIF：パブリックIPによる接続
        - トランジットVIF：Transit Gatewayへの接続（DirectConnect経由可）

### Direct Connectの冗長構成
- 高パフォーマンス高コスト(試験でよく出てくる)
    - 各DirectConnectロケーションに一つずつDirectConnectを接続する。
    - ロケーションごとに二つDirectConnectを接続する構成もあるが試験では出てこなかった

- ２つのDirect Connectの優先順位にについて
    - 何もしなければActive Active構成となる
    - DirectConnect間で優先度を変えたい（上げた）場合
        - オンプレ→AWSの通路はLocal Preferenceを高くする
        - AWS→オンプレの通路はAS Path番号を低くする
            - ローカルプリファレンス BGP コミュニティタグによる優先度付けも可
                - 7224:7100 プリファレンス低
                - 7224:7200 プリファレンス中
                - 7224:7300 プリファレンス高

- コスパ重視（試験で良く出てくる）
    - 一つはDirectConnect、もう一つはsite-to-site VPNの冗長構成
    - この場合、強制的にDirectConnectが優先される
    
- 障害検知時の迅速な検知方法
    - BFD（Bidirectional Forwarding Detection）を使用することでミリ秒単位での検知切り替えが可能

### その他注意点
- Direct Connectだけでは通信の暗号化はできない
    - 暗号化を行う場合はさらにIPsecVPN等が必要でその場合はパブリックVPNのみ利用可（パブリックIPが必須）
- 通信容量拡張方法
    - ジャンボフレームについて
        - 通信容量を拡張させるとき、ジャンボフレーム設定を変更するが、VIFの種類ごとに最大値が異なる。（デフォルトは1500）
            - トランジットVIFは最大8500
            - プライベートVIFは最大9001
    - LAG（Link Aggregation Group）
        - 複数のコネクションを集約して一つの論理インターフェースとして提供する
        - 複数のコネクションのスペックは同じである必要がある。
- 料金について
    - DirectConnectの料金は送信されるデータのみ発生する
    - 受信データは課金対象外


詳しい資料は[こちら](https://www.slideshare.net/AmazonWebServicesJapan/20200219-aws-black-belt-online-seminar-aws)
REST Client（Visual Studio Code プラグイン）

この記事は[ラクスAdvent Calendar 2022](https://qiita.com/advent-calendar/2022/rakus) 12日目の記事です。  
本当は別テーマを書く予定でしたが担当日を失念していたので途中まで書いていた小ネタを投稿。（もう1枠押さえたのでそちらに書くようにします）

## 前置き： Advanced REST client のサポートが切れるようです

今まで、APIのクライアントソフトには「Advanced REST client」を使用していました。

https://chrome.google.com/webstore/detail/advanced-rest-client/hgmloofddffdnphfgcellkdfbfbjeloo/related?hl=ja

少し前からアプリを開く際に以下のようなメッセージが表示され、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308848/2330d1b6-62df-af7b-b37d-b371fd07e8e9.png)

つい先日、アプリを開いたら以下のようなメッセージが表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308848/d4a92de2-d426-1419-3461-1da90fb34ac0.png)

操作自体ができないわけではないですが、サポートが切れているソフトを使い続けるのもよくないため別のソフトを探すことにします。

## VSCodeプラグイン「REST Client」を使ってみることにします

直近、環境の変化もありVSCodeが自分の中でプチブームなので、VSCodeのプラグインで頑張ってみます。  
使っている人も多いであろう「REST Client」を試します。

### インストール

拡張機能マーケットで「REST Client」を検索

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308848/d724a3be-7999-3451-2ccb-6c232673a1d0.png)

インストールボタンをポチッ!!

### APIの呼び出し方

1. `.http`ファイルを作成
1. リクエスト内容をファイル内に記載
1. 「Send Request」を押下

※ 検証にはQiitaのAPIがおすすめ

https://qiita.com/api/v2/docs

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308848/f72d095d-1bdf-b727-50b5-117e5aeabfae.png)

リクエスト結果が別タブで表示される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308848/5d7a12be-740e-49a2-f03d-5dd2a41ea50a.png)

### リクエストには変数も使える

`@~~`で宣言しておけば、変数をリクエストにしようできる。  
色々なパターンで呼び出したい時に便利

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308848/e3a1cfdf-a152-7189-a168-4e2ea7641d2a.png)

## 参考サイト

さらっと基本的な部分だけ書きましたが、詳細は先人の偉大な記事があるのでそちらをみてください。

https://zenn.dev/protoout/articles/26-vscode-rest-client

https://qiita.com/garcons/items/c4dd7231bc78e7adf0a5

https://qiita.com/toshi0607/items/c4440d3fbfa72eac840c#get

https://zenn.dev/protoout/articles/26-vscode-rest-client

https://zenn.dev/arei/scraps/8320fb64bdbaf3
技術的負債についてエンジニア組織の外から考えてみた

# 技術的負債とは

語るまでもないかもしれませんが、 Ward Cunningham （ウォード・カニンガム）が生み出したメタファーで、システムを長年運用していると開発効率が落ちていく様を言い表した言葉です。
和田卓人さんによるこちらの翻訳記事が大変分かりやすく、何度も読み返しています。
[【翻訳】技術的負債という概念の生みの親 Ward Cunningham 自身による説明](https://t-wada.hatenablog.jp/entry/ward-explains-debt-metaphor)

本記事では触れませんが、翻訳後の解説にあるこの一節が個人的には大変好きです。
> Ward の言う負債の悪影響とは、開発と共に得られていく知識や理解と目の前のシステムとの乖離が引き起こす生産性低下のことであり、自分たちが書いているコードの保守性（あるいは、雑さ）のことではありません。むしろコードを書くときには常にそのときのベストを尽くせと言っています。

# 技術的負債に向き合うエンジニアを外から見て
私は[株式会社LIFULL](https://lifull.com/)で[LIFULL HOME'S](https://www.homes.co.jp/)という不動産ポータルサイトの開発に携わっているのですが、直近の2年はエンジニアでありながらプランニング部門（サイトの企画を担当する部門）の組織長をしています。
LIFULL HOME'S自体かなり息の長いサービスとなっており、古いコードベースが利用され続けているシステムや、誰が最後にコミットしたかわからない（もっというとバージョン管理すらされていない）コードも存在します。

それらに向き合い、再度ビジネスを加速するべく、システムやプロダクト、また開発組織全体をバージョンアップするために、エンジニアとしてプランニングも含めた全体を改革していくことが私のミッションです。

そんな2年間の仕事を通して、エンジニアのプレイヤーとして技術的負債に向き合っていた頃とは違う視点を持つに至ったので、それについてまとめ、書き残そうと思います。

# 技術的負債に向き合うとは
冒頭に述べたとおり、技術的負債はビジネスを減速してしまうものです。
よく言われることですが、そのコード・システムがビジネスに貢献しているのであればそれは悪ではありません。
しかし、成長を鈍化させてしまうのはやはり避けるべきで、その避け方＝向き合い方は大別すれば2つに集約されると考えます。
1. 増やさない
1. 減らす

技術的負債を解消し、ビジネスを再加速するためには、**減らすペースが増えるペースを上回る**必要があります。
でなければ、減らすための努力は文字通り焼け石に水で、もしかしたら行わないほうがビジネスが成長していたかもしれません。

つまり、技術的負債を解消するうえで最も重要なアプローチは、技術的負債が増えるペースを落とす、ことです。

# 技術的負債を増やさない
技術的負債と一言に言ってもビジネスのフェイズ、サービスの特徴、開発組織の特性、様々なものに左右されます。
そのため、まずは自分たちが負債だと感じているモノ/コトに対して、その**発生要因はなにかを分析し、個別に対策する**必要があります。

要因として思いつくものをパラパラ書いてみると、
- 組織的な慣習
  - とりあえずリリースしたものを誰も消さない
  - 組織間での引き継ぎが行われず、ナレッジが失われる
  - ドキュメント化や自動テストの文化がない
- 技術選定の過ち
  - 新しいフレームワークを導入したが、そのフレームワーク自体が短命だった
  - マイクロサービス化を推進した結果、類似のシステムが量産されてしまって収拾がつかない
- 技術力不足
  - ハイパーエンジニアが設計・実装したが、その人が抜けた後誰もメンテできない
  - 新しい言語を導入したが、よくわからないまま初期実装を行ってしまった

弊社では上記が余さず起こっていますし、どの会社・システムでも同じだと思います。（違ったらどうしよう）
これらを完全に防ぐことは不可能ですが、繰り返さないための努力を怠ってはいけません。

組織的な慣習に向き合い、見直さなければ同種の負債が生まれ続けます。
技術選定には過去の（あるいは他社の）知見を活かさなければいけません。
技術力不足は永遠の課題なので、継続的な能力向上と、それを前提としたシステム設計、技術選定が必要です。

# 技術的負債を減らす
環境保護の世界では、3Rという考え方があります。
Reduce、Reuse、Recycleの頭文字をとった考え方ですが、まずはゴミとなるものを減らし、使ったものはなるべく再利用し、どうしようもないものは原料レベルで再利用しよう、という考え方です。

同じように、技術的負債の解消においても最優先で検討すべきはReduceだと思います。
上記のように負債自体を増やさないというのもそうですが、**必要のないシステム・コードを失くすことが最重要**です。
いきなりリファクタリングを始めるのではなく、どのシステムがどのくらい利用されていて、今後どのくらい改修される見込みなのかを検討しましょう。
それを見極めるために、プランナーを巻き込み、積極的に機能・システムの削除を提案しましょう。
一言聞いてみると、意外とあっさり消していいですよって返ってくること多いです。

また、もうどうしようもないから作り直そう、ということも往々にしてあると思います。
そういう場合にはシステムの見直しだけでなく、ビジネスの見直しを行いましょう。
カニンガムの言う通り、時間をかけたことで生じたビジネスとシステムのズレがあるはずです。

ただし、話を広げすぎて安易にシステムの作り直しを始めるのは地獄の始まりかもしません。
新旧システムが同居することになり、システムはより複雑化し、負債が増えるペースが増えかねません。
生産性が低下している要因を特定し、なるべく小さく対策、解消しましょう。
作り直す際も、機能単位、ページ単位で進めて、移行が終わったものは消す作業を同時に計画しましょう。

# まとめ
いろいろと書き散らしましたが、プランニング組織から技術的負債の解消を見て感じたことは、増やさないためにも、しっかりと減らすためにも、もっとプランナーやビジネス部門を巻き込もうよ、ということでした。
技術的負債はシステムの課題ではなく、ビジネスの課題です。
エンジニアが頑張って生産性を上げる話ではなく、会社や組織としてビジネスを再加速する話です。

技術選定の過ちはエンジニアの責務では？と思うかもしれませんが、そんなこと言ったら施策のハズレはプランニングの責務です。そうやって境界を作ってもビジネスは加速しません。
お互いにチャレンジしつつ、失敗は素直に認めて共に乗り越えていくことが大事だと思います。
【Kotlin】クラスとインターフェイスの違いと使い分け

クラスとインターフェイスの違いと使い分け

## 共通点

- 型（型名（識別子）とメンバ）を定義する。
- あるクラスのインスタンスを、  
  そのクラスが（直接/間接を問わず）継承したクラス/実装したインターフェイスのインスタンスであるとして扱える。

## 違い

- クラスはオーバーライドできないメンバを持つことができる。
  インターフェイスはオーバーライドできないメンバを持つことができない。
- クラスは継承できないようにできる。
  インターフェイスは実装できないようにはできない。
- クラスはバッキングフィールドを持てる。  
  インターフェイスはバッキングフィールドを持てない。
- 直接継承できるクラスは1つ。
  直接実装できるインターフェイスは数に制限なし。

## 使い分け

インターフェイスではなく（`open`（継承可能）な）クラスを使うべきなのは次の場合。
- サブクラスでオーバーライドできないようにしたいメンバがある（テンプレートメソッドパターンなど）

それ以外は基本的にインターフェイスを使うべき。

特に、1つの実装を複数のクラスで使いたいという理由でクラスを継承するのは避けるべき。
これをしてしまうと継承ツリーが何段にも膨れ上がっていき見通しが悪くなっていく。
（詳細は Effective Java 第3版 項目18「継承よりもコンポジションを選ぶ」などを参照されたい。）

／以上
【Alpine.js】DOMを取得する特殊なプロパティ（$el、$refs）

# DOM要素取得のためのプロパティ
## ①$el
これは$elを付けた<b>要素自身</b>を取得します。
### 使い方
```js
 <button @click="$el.innerHTML = 'Hello World!'">Replace me with "Hello World!"</button>
```
　↑ この$elはbutton要素自身を取得している。

$el.innnerHTML は「Replace me with "Hello World!"」を指していることになる。
（上記コードではボタンをクリックすることで「Replace me with "Hello World!"」を「Hello World」で上書きをする。）



## ②$refs

### 使い方
これは<b>x-ref</b>と一緒に使います。
```
x-ref="hogehoge"　←取得したい要素に付ける

$refs.hogehoge　←これで要素を取り出せる
```

::: note
取得後の扱い方<b>（el,refs共通）
<b><font color="red">JavaScriptの「getElementById」でDOM要素を取得したのと同じと考えると良いです。

<b>例1）クラス名を扱う場合</b>
    $refs.hogehoge.classList = "クラス名 クラス名 ..."

<b>例2）要素を取り除くとき</b>
    $refs.hogehoge.remove()
:::

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

# まとめ
これが使えればDOMの取得がお茶の子さいさいチョチョイのチョイってワケ。
VyOS - DNS/NTP/hostname設定

## 前提
VyOS の DNS/NTP の設定は Ubuntu とはまたちょっと違うので、別記事で残しておこうと思う。
## 環境
vRouter : VyOS 1.4.0
## 設定
### DNS 設定
DNS のアドレスは 192.168.10.250 である。
```
$ configure
# set system name-server 192.168.10.250
# commit
# save
```
ここで、`ntp.j-fortidemo.com`で ping できるか確認しておく。返ってくれば OK
```
# ping ntp.j-fortidemo.com
PING ntp.j-fortidemo.com (192.168.10.249) 56(84) bytes of data.
64 bytes from ntp.j-fortidemo.com (192.168.10.249): icmp_seq=1 ttl=64 time=0.208 ms
```
### NTP 設定
お次は、NTP
```
$ configure
# set system ntp server 'ntp.j-fortidemo.com'
# commit
# save
```
Time zone も忘れずに
```
$ configure
# set system time-zone Asia/Tokyo
# commit
# save
```
確認する
```
# date
Mon 12 Dec 2022 11:44:14 PM JST
```
### ホスト名の変更
仮想ルータを増やしそうな気がするので、ここでホスト名を変更しておく
```
$ configure
# set system host-name vyos-1
# commit
# save
# exit
$ logout
```
[UE4,5]UnrealC++からActorComponent SceneComponentを追加する

端的にUnrealC++から以下のコンポーネントを追加します。
- ActorComponent
- SceneComponent

```cpp
#include "MyActor.h"
#include "Components/StaticMeshComponent.h"
#include "GameFramework/FloatingPawnMovement.h"

// Sets default values
AMyActor::AMyActor()
{
 	// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = true;

	// Sceneコンポネントをアタッチ
	Mesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Mesh"));
	RootComponent = Cast<USceneComponent>(Mesh);

	// Actorコンポネントをアタッチ
	FloatingMovement = CreateDefaultSubobject<UFloatingPawnMovement>(TEXT("FloatingMovement"));
	AddOwnedComponent(FloatingMovement);
}
```

これが
![1_1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1918199/4b22b716-39b5-e520-b75d-6e8afe733a38.png)

こう
![1_2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1918199/2ae8f865-4936-9fb8-fd00-94580848f708.png)

是非試してみてください～
アニメーションのクオリティを上げる4つのポイント

## はじめに
色んなWebサイトを見る中で、目に留まり、ついまた見てしまいたくなるようなアニメーションに出会うことがあると思います。
Webで表現されているアニメーションのほとんどは、ちょっとした手間を加えるだけで、ぐっとアニメーションの質を上げることができます。

昔FlashでWebサイトのコンテンツを作成していた私がアニメーションの実装の中で気をつけてるポイントについて紹介します。

## 1.オブジェクト単位でアニメーション
例えばファーストビューのイメージを一枚画像で切り出して、フェードインなどのアニメーションで表示させたりしていませんか？
それでは普通すぎて何ならアニメーションするだけ、労力の無駄とさえ感じてしまいます。

元々一枚画像として切り出した画像の中から、オブジェクト単位で素材を切り出して、それぞれアニメーションさせてみましょう。
![animation01.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359978/a3908114-5b45-5af1-38ff-0c3acbfa8c95.gif)

### オブジェクトをさらにオブジェクト単位に切り分ける
一番わかりやすいのは文字です。
- 1文字ずつ・1行ずつを1つのオブジェクトとして考える
- デザインで強調された文字・そうでない文字をグルーピングする
- 文節単位をグルーピングする
![animation02.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359978/40f842ad-3d4e-e268-9b79-d29374b559b5.gif)

他にも背景色と文字や、キャラクターと装備品みたいな感じで、オブジェクトの中に動かせそうなオブジェクトを見つけて切り分けてみるといいでしょう。

## 2.タイミングをずらしてアニメーション<br>3.前のオブジェクトのアニメーション終了を待たない
それぞれのオブジェクトを切り分けたら、タイミングをずらしてアニメーションさせてみましょう。
中にはオブジェクトを切り分けたけど、同じタイミングで動かしたほうがいいオブジェクトもあったりします。

また、アニメーションで一番大切なのはテンポだと思います。
アニメーションの指示に「●●が表示され▲▲が表示される」とあっても、決して「●●が表示され（きった後に）▲▲が表示される」なんて解釈しないでください。
大抵の場合は、最初のオブジェクトが動き出したタイミングから次のオブジェクトは動く準備を始める。もしくは、前のオブジェクトが終わりそうなタイミングには、次のオブジェクトは動き出しているようなイメージです。
![animation03.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359978/7a8d237b-f9a3-be14-6269-35da7638df34.gif)

## 4.基準値を超える
例えば、アニメーションの指示で「テキストが大きくなりながら表示される」みたいな指示があった場合、FIXしたデザインのサイズを100としたら、そのサイズを一時的に超えてしまっても問題ないという意味です。

![animation04.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359978/ac7af7ec-a942-3b58-0887-53b43b81a10a.gif)

また、大きさだけでなく「テキスト上から下に降りてくる」みたいな指示の場合、着地するY座標が100pxの位置だとしたら、105pxまで移動させてしてしまって、跳ねて戻るような感じも基準値を超える表現と言えると思います。

![animation05.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359978/3315103a-ee58-f0ec-4300-0cd69345fa29.gif)
今回はわかりやすく線を引いてみました。

## まとめ
いかがでしたでしょう。
これらのポイントはどのようなジャンルにでも共通して活用できるアニメーションのテクニックですが、すべてのポイントを取り入れる＝いいアニメーションになるわけではないです。

また、今回はバナー風な素材で作ってみたので、あまりしっくりこなかった部分もあるかもしれませんが、Webサイトで細かい動きをみてみると、これらのポイントが随所に使われていることに気がつけるようになると思います。

実務を通して色んなポイントを試してみて、適材適所で使い分けをしてみてください。

## 最後に
### GoQSystemでは一緒に働いてくれる仲間を募集中です！
ご興味がある方は以下リンクよりご確認ください。

https://goqsystem.recruit.site/?qiita=3daf12dfa5b9c8866465
リモートアクセスで困った話 (1)

謎のアドベントカレンダー、第 16 話です。

話はまた 10 年ちょっと遡ります。

## アナログはアナログでも

リモートアクセスにアナログの電話回線を使っていた時代の話です。

まだ家庭用の光回線も ADSL もなく、ISDN（INS ネット 64）も田舎のほうでは引けないことがあった時代です。

その年、（中小企業にとっては）まあまあ高額な費用を掛けて、リモートアクセス用の機器（RAS:Remote Access Server）を購入しました。

が…その RAS、 **2 営業日連続で稼働し続けることができない** という虚弱体質でした。

「営業日」がミソで、何度か着信→切断を繰り返すうちに正常に通信できなくなっていました。

（「頻繁に再起動しないと死ぬ」と揶揄されていた Windows NT 3.51/4.0 でも数週間ぐらいは再起動せずに持ったんですけどね）

そのため、山間地で業務をしていた K さんから

## 毎日のように「今日も繋がらない」

との連絡が。

その度に再起動して回復させていました。

毎日のように（うんざり）。

その機器を選定・納入した業者の担当者、[ビル間通信トラブル](https://qiita.com/hmatsu47/items/f9aaa4ab25b080bf2b26#%E6%96%B0%E5%8D%92-1-%E5%B9%B4%E7%9B%AE%E3%81%AE%E5%86%AC%E5%95%8F%E9%A1%8C%E3%81%8C%E7%99%BA%E7%94%9F)のときにも新人である筆者を見下してバカにした人だったのですが、このときも

**勝手に触らないで。正常に動かなくなるから。**

と言っていました。

いや、正常に動かないから（あなたが調整できないから）調整しようとしてるんですけど。

そして、わたしはあなたなんかよりもずっと昔から（社会人になるずっと前から）通信機器を扱っているんですけど。

まあ、納入先が何かやらかしたときに責任を問われたくないのは分からなくもないのですが、それ以前に、機器選定して納入した責任を何とかして欲しいものです。

（当時は今よりはるかに情報の非対称性があって、商社や代理店が直接アクセスできる情報 >>>> エンドユーザーが直接アクセスできる情報、な時代でしたし）

結局、どう頑張っても、虚弱体質は治りませんでした。

（更新用ファームウェアなども満足に提供されなかったですし。元から中身が○ソだった疑惑）

## その後どうしたか？

1 年程度の短期間で退役したデスクトップパソコンに自分で Linux を入れ、拡張スロットに追加購入したモデムカード（合計で 1 桁万円←件の RAS の数十分の一のおねだん）を刺し、シリアルポートに（社内に転がっていた）モデムと INS ネット 64 用の TA を繋いで、自分で RAS を立てました。

諸事情（？）で工事担任者資格も持っていたので（謎の文系学生、通信工事業者の社員さんたちに紛れて受験）、モデムの信号送出レベルも調整して。

（謎の機器を発注する前に相談してくれれば良かったのに）

数ヶ月間再起動しなくても問題なく動き続けました。

（セキュリティパッチは必要なので時々止めて再起動してました）

Linux 最高。

---

17 日目の記事に続きます。

- **[リモートアクセスで困った話 (2)](https://qiita.com/hmatsu47/items/59eadeb2e143de839004)**

https://qiita.com/hmatsu47/items/59eadeb2e143de839004
自己効力感とうまく付き合っていく

# はじめに
本記事はMDC Advent Calendar 2022の12日目の記事です。

https://qiita.com/advent-calendar/2022/mdc

furoshiki.fmさんPodcastの最新話にて自己効力感の話をされており、非常に共感し、面白いなと思いましたので自分なりに整理していきたいと思います。

https://anchor.fm/-372134/episodes/ep-33-e1s4a2n

# 自己効力感とは

まずはWikipediaで調べてみました。

https://ja.wikipedia.org/wiki/%E8%87%AA%E5%B7%B1%E5%8A%B9%E5%8A%9B%E6%84%9F

> 自己効力感（じここうりょくかん）またはセルフ・エフィカシー（self-efficacy）とは、自分がある状況において必要な行動をうまく遂行できると、自分の可能性を認知していること
> 〜中略〜
> 自己効力感とは、ある結果を生み出すために適切な行動を遂行できるという確信の程度、つまり自分が効力予期をどの程度持っているかを認知することをさす

 - 図の抜粋
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113217/5a6f22b7-1ea5-c0de-9595-52eab4d838e9.png)


あんまりよくわからん、ですね。
うまく遂行できる可能性を認知している、ということなので、一言でいうと「自信」のようなものと理解しました。

自己効力感を得た結果としては、以下と書かれていました。

 > 行動の達成。自己効力感が高いほど、与えられた課題を達成する率が高くなる[2]。
 > より達成に向けた努力を行うようになる[2]。
 >  将来に類似体験をした場合に、それも達成可能と考えて同様の行動をとるようになる[2]。
 >   生理的・心理的反応の変化[2]。自己効力感が高いほど、不安、恐怖、恐れが減少し、心拍数も安定する[2]。

これは素晴らしい成果、自己効力感最高、と思えるのではないでしょうか？それと共に、それって限られた人しか得られないのでは？と不安もよぎります。


# 自己効力感を得るためには

こちらもWikipediaから抜粋します。6点書かれていました。

> 達成経験（最も重要な要因で、自分自身が何かを達成したり、成功したりした経験）[3]

成功体験大事ですね。アジャイルの文脈でも小さな成功体験を繰り返して次につなげるとよく言われているので、共通点だなと感じました。

> 代理経験（自分以外の他人が何かを達成したり成功したりすることを観察すること）[3]

最近でいうとW杯で日本頑張った、強豪国に勝てて嬉しい、自分も何かやれる気がする、、とかでしょうか？
仕事の話でいうと自分の組織が表彰された、とか、後輩がすごく育って活躍した、とかもあるかもありますね。

> 言語的説得（自分に能力があることを言語的に説明されること、言語的な励まし）[3]

フィードバック面談とか、360度評価のレポートをもらうとかでしょうか。励ましもあるということであれば、1on1も含まれるのかもしれません。確かに、1on1の後にテンションあがって仕事にもっと励もうと思うことありますよね。

> 生理的情緒的高揚（酒などの薬物やその他の要因について気分が高揚すること）[3]

酒や薬物、、、は怖いのでノーコメントです。Podcast内でも、ここをどう理解するのかは議論されて盛り上がっていました。気分が高揚するということなのでチームビルディングを実施したり、仕事の切れ目の決起会みたいなものでしょうか。忘年会、納会とかもそうですかね。情緒的高揚ってコロナ禍もあって、仕事の中では少し少なくなってきたかもしれないです。。

> 想像的体験（自己や他者の成功経験を想像すること）－O.マダックスによる[6]。

研修受講だったり、ロールプレイとかでしょうか。

> 承認（他人から認められること）

最後は承認欲求が満たされる、というものです。これが最後にくるということは如何に自分での気の持ちようとか、捉え方のほうが大事かということを示しているのかもしれません。

# 自己効力感の３つのタイプ

自己効力感のタイプとしては３種類あるようです。

>    自己統制的自己効力感：自己の行動を制御する基本的な自己効力感[4]
>    社会的自己効力感：対人関係における自己効力感[4]
>    学業的自己効力感：学校での学習などにおける自己効力感[4]

学業的というものもあるのは面白いですね。育児だったり、自己啓発にどう取り組むかなどにも応用できるかもしれません。

# まとめ

自己効力感について整理し、コメントを付記してみました。自然と意識せず自己効力感を得ていればよいのですが、うまくいかないことが続いたり、失敗を繰り返してしまったりするとなかなか難しい状況になってしまいます。

そんな場面でもこういった心理学的な話があるということを頭の片隅に入れつつ、うまく場面場面で使っていくことが大事（ある意味自分を騙していく）かなと思います。
Airtableでenebularの使いどころ: デバイス監視編

今回はenebularの[デバイス実行環境](https://docs.enebular.com/ja/executionenvironment/manageexecutionenvironment)や[エージェント実行環境](https://docs.enebular.com/ja/executionenvironmentagent/overview)を使ってデバイス監視を行いつつ、ログをAirtableに保存してリテラシーの低い人でも見やすいようにした事例です。

### センサーデバイスへのpingした結果をAirtableで確認する

最もオーソドックスな死活監視ですかね。ある施設に置かれている70個弱のセンサーデバイスに定期的にpingを送っています。今回はVPN環境に置かれたセンサーデバイスの死活監視だったので、VPN内にubuntuマシンを置いて、そのサーバにenebularの[エージェント環境](https://docs.enebular.com/ja/executionenvironmentagent/overview)を構築して稼働させました。

監視対象のデバイスはAirtableのテーブルでリスト化されていて、そのテーブルからping先のIPアドレスを取得してpingした後、そのデバイスの状態を更新するだけです。

![スクリーンショット 2022-12-12 23.04.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21109/d5165db7-1392-10c2-05b9-086d285887fa.png)

Airtableでは以下のように常に最新の状態を閲覧できるようになっています。

![スクリーンショット 2022-12-12 22.53.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21109/6d1ebf5a-824b-81fc-dac5-6bf9c7afde03.png)

### センサーデバイスからデータが送信されているか確認する

次はセンサーデバイスからちゃんとデータが送信されているか監視するフローです。センサーデバイスのデータ送信先であるMQTTブローカーのトピックを定期的にサブスクライブして、最新のデータ取得日時が過去過ぎる場合にデータが送られてきていないと判断して諸々確認作業に移る運用となっています。

![スクリーンショット 2022-12-12 23.17.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21109/2f8f6416-fca7-03bb-230f-f1d32178d7d8.png)

Airtableでは以下のように常に最新のデータ取得日時を閲覧できるようになっています。

![スクリーンショット 2022-12-12 23.19.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21109/7a81690b-0ba1-1459-c998-18821a4bf082.png)

### おまけ: Webサイトが意図した通り表示されているか確認する

最後にWebサイトが意図した通り表示されているか、1時間毎にアクセスして取得したHTMLを解析するフローです。

![スクリーンショット 2022-12-12 23.17.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21109/464e9437-533e-79a3-4922-edff2f9f731b.png)

Airtableでは以下のようにログを閲覧できるようになっています。

![スクリーンショット 2022-12-12 23.22.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21109/ae4de022-3f1d-b35b-6f42-abbecc0f91ad.png)

### まとめ

こういうメインの開発でないところってコーディングのモチベーションを高めるのに苦労しませんか？（私だけ？）メインの開発で作ったシステムを監視しないといけない、メインの開発で作ったシステムの自動E2EテストやCI/CDを構築・メンテナンスしないといけない、**こういった気が進まないプログラミングこそノーコード・ローコードでサクッと作って気楽にメンテしましょ！**
【UiPath】Google Chromeで新しいタブを開いて操作する

タブを閉じるアクティビティはあるけど、タブを開くのは無い……ということでワークフローを組みます。

Google Chromeであればショートカット「Ctrl + t」で新しいタブが開けるため、
「ホットキーを押下」アクティビティを使ってこの操作を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/ad533554-46b4-78cb-9165-0a8e634e5498.png)
ただし、これだけだと新しいタブに制御が移りません。
以下のように元のタブで動いてしまいます。
![メディア1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/06263cb4-edfb-2213-60b9-3ffa5a16361c.gif)

---
これを避けるため、「ホットキーを押下」でタブを開いた後、新しいタブを対象に改めてアタッチします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/599be716-70f6-7b55-3e82-06bd9ed7b079.png)
「ブラウザーにアタッチ」のセレクターに`title='新しいタブ'`が含まれていることを確認してください。
これで新しいタブ側に特定してアタッチしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/2105c540-6294-d106-acc0-93e00a087724.png)
以下のように無事新しいタブを開いて操作できました。
![メディア2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/57f530f5-ce32-ea13-bafc-54fe99fac05f.gif)

### まとめ
- "Ctrl + t"を「ホットキーを押下」で押して新しいタブを開く
- 新しいタブが開いたら「ブラウザーにアタッチ」で改めてアタッチする。


## 動作環境
UiPath.System.Activities 22.10.3
今更ながらHttpとは？

# はじめに
毎週1本様々な技術に関する記事を投稿しています。
もし興味のある方は下のリンクから他の記事も見ていただければ幸いです。
 [@7_inai_](https://qiixta.com/7_inai_)

# Httpとは
Http(Hypertext Transfer Protocol)とは、インターネットの代名詞であるWWW(World Wide Web)上で、`Webサーバとクライアントが、HTMLで書かれた文書等のやりとりをするときに使われるプロトコル(通信規約)`のことです。

# Httpの特徴
### ①ステートレス
Httpは原則として __ステートレス__ です。
（※ステートレスとは以前までの状態を保持しないということ）
つまり、1回でデータを送ったら1回データが返ってきて終わりです。そのデータを生かして新たに何かをする。というようなことはありません。これには __プログラムをシンプルにできる__ という利点があります。このため、買い物サイト等ログインデータが必要なサイトでは、別途cookieなどの技術を組み合わせることで、複数回のやり取りをしています。

### ②シンプルである
①のステートレスとも少し被りますが、Httpはとてもシンプルです。例えば、情報のやり取りは常に、クライアントが要求を出し、サーバーが応答を返します。また、同じ条件であれば、__ある要求に対する応答は常に同じ__ になります。

# HttpとHttps
Http：Hypertext Transfer Protocol
Https：Hytertext Transfer Protocol Secure
上記から分かるように、一言で言うならばHttpsはHttpのSecure(安全)バージョンです。
Httpsでは、通信の内容を暗号化するため、悪意のある第三者から盗み見られることがありません。
HttpsはSSL(Secure Socket Layer)というプロトコルを使うことで、安全性を高めています。

SSLは、Webページのデータを配信するサーバーに __通信を暗号化するために使用する鍵の情報__ と、__サイトの運営者__ を記した __SSLサーバ証明書__ をインストールすることで実現しています。

# 終わりに
今回は、HttpとHttpsについて書きましたが、他にもファイル転送用プロトコルのFTP、メール送受信用プロトコルのSMTP/POP等様々なプロトコルがあります。また機会があれば他のプロトコルに関する記事も書ければと思います。
最後までお付き合いくださりありがとうございました。
Power BIの2022学習状況

# 1.2021年～2022年の学習状況

■～2022年1月：1年半くらいはUdemyで勉強した気になってしまっており、Power BIの奥深さに全く気が付いていませんでした。
■2022年2月：DA-100取得
■2022年2月～：Power BI 勉強会とPower BI Weekly Newsへの参加、Power BIの奥深さを痛感。
（直近2か月は諸事情でほぼ参加できていないですが、来年は復活予定）


今年最もお世話になったのは、まぎれもなく以下の2つです。
・Power BI 勉強会　
・Power BI Weekly News



ただし、Power BI 勉強会に関しては参加者の発表が必須で、
（個人的には）他の参加者の方のレベルも高いので、理解が追い付かないことが多かったです。
※もちろん初心者大歓迎の集まりです！

以下の内容を勉強し始めてからは、少しずつ理解ができるようになってきました。
まだまだ、、、、、勉強中ですが継続していければと思います。




# 2.おすすめ勉強コンテンツ（超抜粋）

## A:SQLBIの各コンテンツ
https://www.sqlbi.com/training/

※日本語字幕あり

■FREE
・Introducing DAX Video Course
・Introduction to Data Modeling for Power BI Video Course
・DAX Tools Video Course

■有料
・Mastering DAX Video Course
・Optimizing DAX Video Course
・Mastering Tabular Video Course
・Data Modeling for Power BI Video Course
・Power BI Dashboard Design Video Course
・Power Pivot Workshop – Video Course
・SQLBI+


# B.DAX関連の書籍
https://www.amazon.co.jp/gp/product/B09S2XYDXH/ref=dbs_a_def_rwt_hsch_vapi_tkin_p1_i0

こちらは意外と知名度がなさそうに感じでいているのですが、
日本語で少しレベル高めのDAXについて詳しく書かれている唯一の書籍な気がしてます。

動画での学習や英語での学習もよいのですが、
書籍での復習にはよいかと思います。


# C.その他の王道勉強コンテンツ
王道勉強コンテンツは、たくさんあるので割愛。
例：DocsやGuy in a Cube等


# 3. 2023年の学習予定や目標

・（コミュニティ）4半期に一度のPower BI 勉強会で発表できるようなコンテンツを用意
・（会社）Power BI Premium導入や活用
・（会社）2022年に完了することができなかったPower BIレポート整備
・（自宅）PowerBIに関するSQLBIコンテンツの継続

・（その他）Power BI ではないかもしれませんが、統計や機械学習の分析
クォータニオン scipy.spatial.transformのRotation

「instantNeRFで遊ぶ Advent Calendar 2022」の16日目です。

今日はCOLMAPやBlenderの入力を検討するために必要だったクォータニオンの計算について書きます。
今回使ったのはscipy.spatial.transformのRotationです。

https://kamino.hatenablog.com/entry/scipy_rotation

https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.transform.Rotation.from_euler.html

#### from_~でRotationを入力 / as_~でRotationの変換結果を出力
> from scipy.spatial.transform import Rotation as R
r = R.from_euler('X', [10], degrees=True)
print(r.as_quat())
[[0.08715574 0.         0.         0.9961947 ]]

計算結果をBlenderと比較しました。
scipy.spatial.transformのクォータニオンの出力はX, Y, Z, Wの順番でした。
![16-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/e6f1960d-cd5c-8c4e-84ab-875155e2f37e.png)

#### as_eulerのときの注意
- 大文字と小文字で意味が違う
大文字は内因性、小文字は外因性になります。
- 出力の順番は軸設定の順番と同じ
常にXYZではなく、例えばZXYとしたら出力もZXYになりました。
 > from scipy.spatial.transform import Rotation as R
 r2 = R.from_euler("ZXY", [10, 20, 30], degrees=True)
 e2=r2.as_euler("ZXY", degrees=True)
 e2[0], e2[1], e2[2]
(9.99999999999999, 19.99999999999998, 29.999999999999964)


#### BlenderのEulerモードの順番との対応

BlenderのEulerモードの表記順番は座標を回す軸の順番と逆になっていました。

https://www.youtube.com/watch?v=T5G0wlw-bx4

> from scipy.spatial.transform import Rotation as R
r1 = R.from_euler("X", [10], degrees=True)
r2 = R.from_euler("Y", [20], degrees=True)
r3 = R.from_euler("Z", [30], degrees=True)
r4 = r1 * r2 * r3
print(r4.as_quat())
[[0.12767944 0.14487813 0.26853582 0.94371436]]

> r4a = R.from_euler("XYZ", [10, 20, 30], degrees=True)
print(r4a.as_quat())
[0.12767944 0.14487813 0.26853582 0.94371436]

![16-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/c78118c0-9772-bbaa-ea16-2b11dc704e9d.png)

https://space-denpa.jp/2021/05/04/relationship-euler-fix/

クォータニオンに限らずオイラー角や回転行列、その掛け算は順番で意味が変わるので大変です。

#### 参考
https://qiita.com/take4eng/items/0f5a9f47fd345e5fc33

https://kamino.hatenablog.com/entry/rotation_expressions

https://www.andre-gaschler.com/rotationconverter/
AWS認定クラウドプラクティショナー合格に向けて Day22

# 前回の内容
[AWS認定クラウドプラクティショナー合格に向けて Day21](https://qiita.com/Ayako_0224/private/4b8413f2056f3dce7c46)

# CloudTrail
ユーザーのアクセスログを取得・監視することができる
ルートアカウントやIAMユーザーのオペレーションとAPIコールをトラッキングしてログを取得する
ログファイルは暗号化されS3に保存される
KMSによる暗号化もサポートされる
デフォルトでは90日間ログが保存される設定になっている

# CloudWatch
AWSリソースとAWSで実行するアプリケーションのモニタリングサービス
システムの監視に特化したツールでデータを取得・表示・アクションの実行までを集中管理する
## CloudWatchアラーム
メトリクスに基づいて数式の結果を監視するメトリクスアラームを作成する
## CloudWatchメトリクス
EC2などのリソースの監視サービス
死活監視、性能監視、キャパシティ監視を実施する
## CloudWatch Logs 
CloudWatchと連動したログを収集・可視化する機能
## CloudWatch Events
AWSリソースに対するイベントをトリガーにしアクションを実行する
Amazon Event Bridgeに統合された
## X-Rayトレース
アプリケーションが処理するリクエストに関するデータを収集するサービス
X-RayトレースではX-RayのデータをCloudWatch上で可視化する
## CloudWatchアプリケーションモニタリング
CloudWatch ServiceLensやRUMを利用してアプリケーションのヘルスチェックを実施する
## CloudWatchインサイト
Insightsを使用して、Lambda関数、Logs、Container、アプリケーションなどのメトリクスとログを収集、集計、要約する
## CloudWatch ServiceLens
X-Rayと統合された
トレース、メトリクス、ログ、アラームなどのリソースヘルス情報を１箇所に統合してサービスとアプリケーションの監視を行う
## CloudWatch RUM
リアルユーザーモニタリングの略
アプリケーションの信頼性、パフォーマンス、エンドユーザー満足度を可視化する
【Excel関数】IF関数で複数のOR条件をリストで指定したい（IF/SUM/TRANSPOSE）

# 1.やりたいこと & 結論

◆やりたいこと◆
担当顧客のみの売上実績を抽出したい！

こんな売上実績一覧があります。
<img width="500" alt="（1.png）" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498057/1c501f7b-1064-0122-74ce-f5b6d2fe6ad8.png">
↓
売上実績一覧から、担当顧客「A社・B社・C社」の実績のみを抽出したいです。
G列の担当顧客リストを参照して抽出したいです。
（IF関数で複数のOR条件をリストで指定したい）

◆結論◆
こちらの数式を使います。
`{=IF(SUM((判定対象=TRANSPOSE(リスト範囲))*1)<>0,真の場合,偽の場合)}`
※両端の「{ }」は手入力で入れません。数式入力後に「Shift + Ctrl + Enter」を同時に押して「配列数式」にします。（「{}」が付く）

# 2.流れ

こちらの記事を参考にしました。

[『IF関数で複数のOR条件をリスト（範囲）で指定する方法』](https://nyanto.jimdofree.com/%EF%BD%B4%EF%BD%B8%EF%BD%BE%EF%BE%99%E9%96%A2%E6%95%B0-%E8%AA%AC%E6%98%8E/if%E9%96%A2%E6%95%B0%E3%81%A7%E6%9D%A1%E4%BB%B6%E3%81%AE%E7%9C%9F%E5%81%BD%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E8%BF%94%E3%81%99%E7%B5%90%E6%9E%9C%E3%82%92%E5%A4%89%E3%81%88%E3%82%8B%E8%89%B2%E3%80%85%E3%81%AA%E6%9D%A1%E4%BB%B6%E5%BC%8F%E3%81%AE%E6%8C%87%E5%AE%9A%E6%96%B9%E6%B3%95/if%E9%96%A2%E6%95%B0%E3%81%A7%E8%A4%87%E6%95%B0%E6%9D%A1%E4%BB%B6%E3%81%AEor%E3%82%92%E3%83%AA%E3%82%B9%E3%83%88%E3%81%A7%E6%8C%87%E5%AE%9A%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/)（病院SEにゃんとのPCトラブル解決＆Excel関数等活用術）2022/12/12閲覧
隠キャ、コミュ障、プログラマ

隠キャで、コミュ障な、プログラマです。

# 生物多様性　

## 生物は多様であるから種が保存できる。　

ある一定以上の分散があり、特定の遺伝子しか存在しないと破綻することはよく知られている。　

## 生物は論理ではなく確率と分布で把握する。

正しい、正しくないという論理科学の世界から、生物の世界に至るまでに、　
数学、物理学、化学の世界が存在する。　

科学三分類・四分類・五分類と算譜(program) 仮説(93) 統計と確率(7)

https://qiita.com/kaizen_nagoya/items/a2f2b9cc3a51b6af7603

## 生物では因果関係が成立するとは限らない　

一次元的な論理関係が成り立たないだけでなく、　
多次元の因果関係が成り立つ保証はない。

多様なものどうしの相互作用は、計算可能とは限らない。

次の概念はあまり意味をなさない。

1. 隠キャだからコミュ障なのか

2. コミュ障だから隠キャなのか　

3. 隠キャだからプログラマなのか　

4. プログラマだから隠キャなのか　

5.  コミュ障だからプログラマなのか　

6. プログラマだからコミュ障なのか。

# プログラマはプログラムを書けば生きていける。　

心理学の本を読むよりはコンパイラ書いた方がよくね。仮説（34）

https://qiita.com/kaizen_nagoya/items/fa715732cc148e48880e

プログラマの「日報、週報、月報、年報」考。仮説(73)

https://qiita.com/kaizen_nagoya/items/97ad8ac9217c12c3bb69


### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

####  Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
GCPにおける外部L4ロードバランサーをTerraformで作成してみた



本記事は [ZOZO Advent Calendar 2022](https://qiita.com/advent-calendar/2022/zozo) カレンダー Vol.1 の 13 日目の記事です。昨日の投稿は @tippy さんの「[PagerDuty CLIでscheduleをoverrideする方法](https://qiita.com/tippy/items/17bf07a2cd2fd471ad21)」でした。

# 今回作成したロードバランサー
今回はGoogle Compute Engine(GCE)で構築したSFTPサーバの前段に置くロードバランサーのため、L7(http/https)ロードバランサではなく、L4(TCP/UDP)ロードバランサを選択しました。

なお、GCPにおける実現可能なロードバランサーは以下にまとまっているため、実際に構築を行う際は要件を満たすものを選択してください。
https://cloud.google.com/load-balancing/docs/choosing-load-balancer?hl=ja#lb-summary

# 事前準備
事前準備として[Terraform](https://developer.hashicorp.com/terraform/downloads)と[gcloud CLI](https://cloud.google.com/sdk/docs/install?hl=ja)をインストールしておきます。

Terraformに関しては業務などで複数のversionのTerraformを使用するのであれば[tfenv](https://github.com/tfutils/tfenv)を使うのがおすすめです。

# Terraformによる作成
Terraformのコードが以下になります。

```tf
resource "google_compute_address" "test-nlb-ip" {
  name    = "test-nlb-ip"
  project = local.project
  region  = local.region
  address = local.sftp_server_nlb_ip
}

resource "google_compute_region_backend_service" "test-nlb-backend-service" {
  provider              = google-beta
  name                  = "test-nlb-backend-service"
  project               = local.project
  region                = local.region
  load_balancing_scheme = "EXTERNAL"
  protocol              = "TCP"

  backend {
    group = google_compute_region_instance_group_manager.test-sftp-instance-group-manager.instance_group
  }

  health_checks = [google_compute_region_health_check.test-nlb-health-check.id]
}

resource "google_compute_region_health_check" "test-nlb-health-check" {
  provider = google-beta
  name     = "test-nlb-health-check"
  project  = local.project
  region   = local.region
  tcp_health_check {
    port = "80"
  }
}

resource "google_compute_forwarding_rule" "test-nlb-forwarding-rule" {
  provider              = google-beta
  name                  = "test-forward-rule"
  project               = local.project
  region                = local.region
  load_balancing_scheme = "EXTERNAL"
  backend_service       = google_compute_region_backend_service.test-nlb-backend-service.id
  ip_address            = google_compute_address.test-nlb-ip.id
  ip_protocol           = "TCP"
  ports                 = ["22"]
}
```

TerraformのGoogle Providerにはロードバランサーというリソースは存在しておらず、複数のリソースを組み合わせてロードバランサーの機能を実現しています。

[google_compute_address](https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/compute_address)に関してはロードバランサーに紐付けるIPアドレスを固定するために使用しています。
また、[google_compute_region_backend_service](https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/compute_region_backend_service)で指定しているbackendについてはGCEで構築しているSFTPサーバのinstance-managerを指定しています。

# おわりに
GCPのL7ロードバランサーをTerraformで作成してみた記事は見かけるのですが、L4ロードバランサーの記事はあまり無かったので書いてみました。
React初学者のUdemy講座受講メモ（useStateとは編）

前回の[React初学者のUdemy講座受講メモ（Reactとは編）](https://qiita.com/yamasans12/items/b674df3431cde0cc39be)の続きです。
イベントリスナ、useStateとは編です。
# イベントリスナとは
要素をクリック・切り替えなどの操作をした際に実行する関数

```jsx
// イベントリスナ
const clickHendler = () => {
    alert("ボタンがクリックされました");
};
// クリック時にclickHendlerを呼ぶ
<button onClick={clickHendler}>クリックしてね</button>
```

### 注意点

- `onClick、onChange`のようにキャメルケースで書く！
`onclick、onchange`はHTMLの属性となってしまう
- `onClick={clickHendler()}` のように関数の実行結果を入れるのは違う

その他イベントタイプ

- onChange：input要素に入力、変更があったとき発火、コールバック関数の引数から入力値を取得できる
- onBlur：input要素からフォーカスを失うと発火
- onFocus：input要素にフォーカスすると発火
# イベントに合わせて画面表示を更新する
input要素の変更に応じて表示値をリアルタイムに変更する

下のような感じで動きそう、実行結果を変数(dispVal)に格納して表示する、みたいな
```jsx
const Example = () => {
  const clickHendler = (e) => {
    return e.target.value;
  };
  let dispVal;
  return (
    <>
      <input type="text" onChange={(dispVal = clickHendler)} /> = {dispVal}
    </>
  );
};
```

**でもこれではうごかない；；**
### →useState()を使うと動く！！！
下のような感じに書く
```jsx
import { useState } from "react";
const Example = () => {
  let [val, valFunc] = useState();
  const clickHendler = (e) => valFunc(e.target.value);
  return (
    <>
      <input type="text" onChange={clickHendler} /> = {val}
    </>
  );
};
```
**動かなかった理由**
`onChange={(dispVal = clickHendler)}`←ここしか再実行されないから
コンポーネント自体を再実行する必要がある。
ここで、再実行したら変数毎回初期化されん？？と思ったのですが、ここら辺はuseStateがうまいことやってくれるみたいです
# useStateとは
- コンポーネントの再実行をお願いする
- 値を初期化せず保持し続ける
`  const [val, setVal] = useState();`
valには**保持している値**、setValには**値を更新する関数**が代入される。
イメージ的にはコンポーネントをスコープとした変数(val)とその変数のsetter(setVal)を提供してくれる人、見たいに捉えました。
# useStateの注意点
- コンポーネントごとに独立して管理される
- コンポーネントの最上位の階層で呼ぶ必要がある（if文、for文などのブロック内で呼ぶとダメ）
- セットする関数はすぐ実行されない、予約される（**要確認**）
- 前回のstate値を参照する場合は、更新用関数に関数を渡す（**要確認**）
- **オブジェクト型を扱う時の注意点**
セットする時、オブジェクトのまま渡す際、更新時も同じ形式で渡す。また、更新時は新しいオブジェクトを渡す必要がある
- スプレッド演算子とカンマで特定の要素だけ新しくしたオブジェクトとなる
```jsx
  const orderObj = { item: "apple", count: 10 };
  const [order, setOrder] = useState(orderObj);
  const changeItem = (e) => {
    setOrder({ ...order, item: 'orange' });
  };
```
# 次回
**制御構文とフォームの制御（未）**
【PlayFab】ClowdScriptのテストでとても悩んだ点備忘録

# 何をしていたか
Unityで作成しているゲームのマスタデータ管理としてサーバーレスというものに興味があり、
オススメで紹介されていたサービスのうち「PlayFab」というものをいろいろ触っていました。
https://playfab-master.com/unity-baas

これまでGCPやローカルでMySQLによるデータ管理、FireBaseのユーザー管理など
APIでデータを取得する処理などをゴリゴリ書いていましたが、このまわりをUnityからPlayFabAPIを呼び出すことで簡単に実装できるという話は魅力的でした。（特にログインまわりやプレイヤーデータ管理…）

# 詰まったこと
なんとなくEntityの概念や考え方というものを理解しつつ、基礎的なPlayFabAPIではマスタデータ取得周りで余分なデータも取ってきてしまいそうだったので、ClowdScriptというもので細かいデータ取得などがPlayFab側で用意できないかと思った次第です。

MicroSoftのチュートリアルや、PlayFabについてさまざまなサンプルを挙げてくださっているサイトを参考にし、ローカルに環境も用意し…としていたところで、まず基礎のコードが思うように動かないという壁にぶち当たりました。

## テストしようとしたコード１

https://playfab-master.com/playfab-azure-cloudscript

いたって普通の、json型のデータを受け取ってメッセージ内に出力する処理です。
ここで何に詰まったかというと、変数context がどうあがいてもnullになるという問題です。

https://learn.microsoft.com/ja-jp/azure/azure-functions/create-first-function-vs-code-csharp?pivots=programming-language-csharp&tabs=in-process
HttpTriggerのAzure FunctionをVSCodeでテンプレ生成すると、
これとは異なるコードの同じような「変数を出力する処理」が初期生成されます。
テンプレでは、例えば「{"name":"Test"}」というパラメータを渡してデバッグしてやれば、想定通りキー「name」の値「Test」を取得して結果に反映してくれます。

ただし、上記サイトのソースコードをVSCode上でデバッグしようとすると、内部の「TaskMethodInvoker#InvokeAsync 」にある引数instanceのNullReferenceExceptionが発生しました。

渡すパラメータ構成がおかしいのか、JsonConverterで指定しているクラスが実は古いのか4時間ほど悩みました…。
【CS2AFHelperClasses】
https://github.com/PlayFab/PlayFab-Samples/blob/master/Samples/CSharp/AzureFunctions/CS2AFHelperClasses.cs

## 解決

VSCodeからデバッグするのは諦め、Azureへデプロイ、PlayFabAPIを使用してUnityからClowdScriptとして呼び出すことで正常に動くことが確認できました。
Unityだけでなく、PlayFabのClowdScriptとして設定が完了すれば、PlayFab上からもテストができます。

なぜ取得したコンテキストが上記クラスにうまく変換されなかったかというと、
VSCodeのデバックではPlayFabのタイトル情報やプレイヤー情報などが一切ないただの「{"name":"Test"}」という文字列だけだったからと理解しました。

CS2AFHelperClassesはUnity(クライアント)側で生成されるExecuteFunctionRequestの情報を前提とした構成だったようで、ただの文字列「{"name":"Test"}」からは、FunctionExecutionContextのプロパティは何も設定できず全部nullになってしまいます。

## テストしようとしたコード２
逆にAzureFunctioのテンプレ生成したものは、Unity、PlayFab上から動かすと「{"name":"Test"}」より複雑な構成のパラメータが渡されるため、キー「name」の値をうまく取れません。
（もちろんVSCodeからは動きます。）


# 今後の展望

デバック環境を作成したのでできることがデプロイのみというのは悲しいので、テストプレイヤー情報を静的に準備し、
UnityやPlayFab上でなくてもデバッグできるようにしたいです。
（ExecuteFunctionRequestの中身をそのままjson化して渡してしまえば上手くいきそうですが…）
自動車技術者が持っているといい技能、技術、道具

 
 <この項は書きかけです。順次追記します。>

# 必要な技能・資格・技術
# 1 テストドライバ
公道試験では必ずしも必要ない。
自動車試験場で必要

# 2  OEMの力
どのOEMが、どちらを強化したいか。
どのOEMが、何に注力しているか。
OEMごとの技術地図があるといいかも。

その地図全体を構造的に設計し、自動生成するといいかも。

## 3. コンパイラをかける　

Matlab, AUTOSAR コンパイラが書ければ、自同性絵師を完備できる。



# 必要な道具
# 1. 用語表


## 2 Task Table
タスク切り替えを減らし、高速処理が可能かもしれない。
OSの機能を覚えずにプログラムを書く上の機能としてあるとよい。

OSの機能を使いたければ、一つのTaskを生成すればよい。
task tableを生成する必ないと思うと、タスク切り替えの時間と空間の大きさによる。

## 3  Ready Queue
BCC1, ECC1なら同じ優先度でReadsyで待つのは一つ。Queueでなく、優先度ごとに要素一つの優先度全体の一次元配列でよいかも。

全体を一つの Ready Queueで管理する設計もあり、どちらが高速処理が可能かは試すとよい。

## 4  SoftWare Defnied vehicle
電池、電動機などソフトウェアだけで決定できない部品がまだまだある。
材料を少し変えた時の振る舞いが予測できない。
ソフトウェアでは定義はできない。

ネットワークの遅延もソフトウェアでは定義できない。　

## 5 Network Define Vehicle
ネットワークも、電池、電動機などの材料選択で性能が決まるものは定義できない。
それぞれの

Network Defined Vehicle

https://qiita.com/kaizen_nagoya/items/a696f8a8cbd141215266


 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
 
 

# 文書履歴(document history)
ver. 0.01初稿　202221224
ver. 0.02 ありがとう追記　20230701

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

####  Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.