OmniAICreator/Qiita-1.07M huggingface dataset:
新卒エンジニアがコードレビューから学んだ二つの学び（Strategyパターン編）

# はじめに
こちらは「[ラクス Advent Calendar 2022](https://qiita.com/advent-calendar/2022/rakus)」の16日目の記事になります。
新卒で入社し、7月に現在の部署に配属。9月中旬ごろから徐々に開発タスクに取り組み始めました。
最近ではバグ修正に加え、既存APIの改修を担当することも増えてきました。
その中で先輩エンジニアにレビューをいただき、学んだ内容を次に活かすために整理していこうと思います。

まずは簡単に状況の確認をすると、以下の流れです。

1. あるクラスで他のクラスから値を取り処理するメソッドを書き、レビューでアドバイスを貰った
1. 実際に修正し、理解のために手元でクラス図を作成したところ、見た事のある形になっていた
1. 以前読んだ本を見返したところ、これが「Strategyパターン」と名前が付いていることを確認した

では詳しく見ていきましょう。

## レビュー内容
レビュー内容を簡単にまとめると、以下の内容でした。
最初聞いた時は改善した形をイメージできませんでしたが、今では先輩のアドバイスを理解することができます。

先輩） 「Interfaceを使って、各クラス間の依存を減らし変更し易い構造にしていこう」

### 問題点
今回実装したコードの問題点は以下の通りです。（クラス図は例です）

![スクリーンショット 2022-12-16 8.55.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314607/ca7453fd-c108-4dea-b162-fc564e7f9b74.png)


1. Aクラスは、BとCクラスの詳細（フィールドやメソッド名）を知らなければ処理ができない状態だった
1. BとCクラスに仕様変更があった際に、影響範囲がAクラスまで広がる可能性がある
1. 対象となるクラスが増えれば増えるほど、Aクラス内のメソッドやswitch文処理が増えてしまう

### 解決策
上記問題点を解決するために、以下のアドバイスを教えて貰い、修正とクラス図の作成を行いました。

1. Interfaceを用意して、使われ方と処理内容の結果を定義する
1. AクラスはInterfaceのメソッドのみを知り、他のクラスもInterfaceに合わせて具体的な処理内容を実装する

こうすることでAクラスは各クラスの詳細を知る事なく処理を行えますし、もし対象となるクラスが増えてもそのクラスがInterfaceを実装していれば変更する必要がありません。
また他クラスの仕様変更があった際も、Aクラスを見る必要が無くなり容易に修正が可能になります。

そして自分でクラス図を書いたら、以下のような形になっていました。
見覚えのある形だったので、本を読み返したら「Strategyパターン」と既に名前が付いた手法でした。
（クラス図は例です）

![スクリーンショット 2022-12-16 8.55.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314607/dfb7547b-d00e-0e2b-8498-b61aab7cf264.png)




## そもそもStrategyパターンとは
色々探してみて一番分かり易かったのが、以下の記事

> Strategyパターンは、場面によって行いたい処理を分けたい場合に、それらの処理を外部にカプセル化することで必要な場面で必要な処理を使い分けられるようにするためのデザインパターンです。
処理を行う部分とその処理を利用する部分を分けているので、より柔軟に変更を加えることができるようになります。

引用：[C\#でGoFのデザインパターン~Strategyパターン編~ \| cloud\.config Tech Blog](https://tech-blog.cloud-config.jp/2019-10-30-strategypattern/)

今回のケースに当てはめてより表現を具体的し、以下のように理解しました。
> 処理結果を利用する側は変更せずに、処理内容自体（アルゴリズム）を容易に切り替えられる手法



## 学びの整理

今回のレビューで学んだことは、主に以下の2点です。

### 1. クラス間の依存関係に注目

自分の書いたコードが、どんな影響を及ぼすのかイメージ出来ていないと今回の件で感じました。
また具体例や体験が無いと影響のイメージが出来ないと思うので、本や今まで書いたコードを元に練習していこうと思いました。

個人的にはこの本（[現場で役立つシステム設計の原則 〜変更を楽で安全にするオブジェクト指向の実践技法：書籍案内｜技術評論社](https://gihyo.jp/book/2017/978-4-7741-9087-7)）が好きなので、再度読み返そうと思います。


### 2.本の読み方

本では読んだことあるけど、それを設計や実装時に引き出せないと意味が無いと感じました。
なので、いつどのタイミングでその知識を引き出せばいいかの「きっかけ」を
自分の言葉で整理する必要があると思ったので、今後はこのポイントを意識していきたいです。

[48\. GoFデザインパターンとDI \(前編\) w/ twada • fukabori\.fm](https://open.spotify.com/episode/3WF6xxUOnHAQR0xt3gC2Rm) でt_wadaさんが仰っている「コンテキストとプロブレムとソリューション」の「コンテキストとプロブレム」の整理が近いイメージです。
また目の前の問題を認識できるように、「どんな構造に反応すべきか」といった嗅覚も養う必要があると考えているので、そういう本も今後コツコツ読んでいきたいですね。


## まとめ

ある人にとってはそんなの当たり前だと思われるかも知れませんが、その「当たり前のレベル」を上げていかないと余裕ができず、新しい事に挑戦できないので丁寧にコツコツ積み上げていきたいですね。（みんな最初は初心者）

さて、これで以上となります！
うちの先輩方も記事を投稿しているので、ぜひ他の記事もご覧になって引き続き[ラクス Advent Calendar 2022](https://qiita.com/advent-calendar/2022/rakus)をお楽しみください！！
MLOpsにおけるKPIについて

MLOps（Machine Learning Operations）とは、機械学習プロジェクトを運用するためのプラクティスやツールを指します。その一環として、KPI（Key Performance Indicator）が重要な役割を果たします。

KPIとは、運用の結果を測定するための指標のことです。MLOpsにおいては、機械学習モデルのデプロイや推論のパフォーマンス、可用性、品質、安全性など、様々な観点からKPIを設定し、運用の成果を測定することが重要です。

例えば、モデルのデプロイから推論までの全体的なスループットや推論時間、モデルの予測精度などは、KPIとして検討することができます。また、運用中のモデルが期待する挙動をしているかどうかを確認するためにも、KPIは有用です。

KPIを設定する際には、運用目的やビジネスニーズを考慮した上で、明確で達成可能な目標を設定することが重要です。KPIが適切に設定されていれば、運用の結果を把握し、改善するための参考情報として活用することができます。

一方で、KPIを適切に設定しないと、運用の結果が正しく把握できず、改善が困難になる可能性があります。また、KPIを唯一の指標として過剰に重視することも注意が必要です。運用の結果を測定するためのKPIは重要ですが、それ以外の要因も考慮することが大切です。

MLOpsにおいては、KPIを適切に設定し、適宜測定・分析することで、機械学習モデルの運用をスムーズかつ効果的に行うことができます。そのためには、運用の目的やビジネスニーズを明確にし、それに基づいたKPIを設定することが重要です。また、KPIだけでなく、運用の成果を把握するためにも、適宜ログやモニタリングなどの手法を活用することも必要です。
AWS SimSpace Weaverでシミュレーションをためしてみた

![img](https://day-journal.com/memo/images/try-097_00.gif)
![img](https://day-journal.com/memo/images/try-097_01.png)

この記事は、「[AWS Advent Calendar 2022](https://qiita.com/advent-calendar/2022/aws)」の16日目の記事です。

### AWS SimSpace Weaverでシミュレーションをためしてみました :tada:  

AWS re:Invent 2022のKeynoteを、現地で見て気になった[AWS SimSpace Weaver](https://aws.amazon.com/simspaceweaver)について試してみました！

AWS SimSpace Weaverを利用することで、AWSマネージドのインフラストラクチャで動的かつ大規模な空間シミュレーションを構築可能です。料金は1時間6ドル程度で課金に注意が必要です。2022年12月現在、日本リージョンにはまだ対応されていません。

今回はデフォルトのシミュレーションを実行しましたが、YAMLで[Schema](https://docs.aws.amazon.com/simspaceweaver/latest/userguide/schema-reference.html)を定義することでさまざまなパターンのシミュレーションが可能になるようです！

<br>

詳細として下記について説明します。

- [アプリケーションダウンロード](https://qiita.com/dayjournal/items/9dd6c2cb434c7a5c0bc2#%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89)
- [シミュレーション実行](https://qiita.com/dayjournal/items/9dd6c2cb434c7a5c0bc2#%E3%82%B7%E3%83%9F%E3%83%A5%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E5%AE%9F%E8%A1%8C)
- [シミュレーション表示](https://qiita.com/dayjournal/items/9dd6c2cb434c7a5c0bc2#%E3%82%B7%E3%83%9F%E3%83%A5%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E8%A1%A8%E7%A4%BA)

<br>

## アプリケーションダウンロード

はじめに、AWS SimSpace Weaverでアプリケーションをダウンロードする方法です。  

AWSマネジメントコンソール → AWS SimSpace Weaverをクリック。  
![img](https://day-journal.com/memo/images/try-097_02.png)

「Get started」をクリック。  
![img](https://day-journal.com/memo/images/try-097_03.png)

「Download client」をクリック。  
![img](https://day-journal.com/memo/images/try-097_04.png)

表示用のアプリケーションがダウンロードされます。  
アプリケーションはWindows専用になります。  
PCのスペックによってはうまく起動しない場合があるので注意が必要です。  
![img](https://day-journal.com/memo/images/try-097_05.png)

これでアプリケーションのダウンロードは完了です！

<br>

## シミュレーション実行

次に、AWS SimSpace Weaverでシミュレーションを実行する方法です。  

「Start simulation」をクリック。  
![img](https://day-journal.com/memo/images/try-097_07.png)

しばらくするとシミュレーションを実行されます。  
IPとポートが表示されるのでコピーします。  
![img](https://day-journal.com/memo/images/try-097_08.png)

これでシミュレーションの実行は完了です！

<br>

## シミュレーション表示

最後に、AWS SimSpace Weaverでシミュレーションを表示する方法です。  

解凍したアプリケーションの「UnrealClient.exe」を実行。
![img](https://day-journal.com/memo/images/try-097_06.png)

アプリケーション起動後に、左下のテキストボックスにコピーしたIPとポートを貼り付けると、シミュレーションが表示されます！  
![img](https://day-journal.com/memo/images/try-097_09.png)

<br>
<br>

やってみたシリーズ :grinning:
<a href="https://day-journal.com/memo/tags/Try" target="_blank">tags - Try</a>

<br>
<br>

<a href="https://dayjournal.booth.pm" target="_blank"><img src="https://day-journal.com/memo/images/etc/book.png" alt="book"></a>
MLOpsのツールの選び方について

MLOps（機械学習の全生命週期管理）は、機械学習モデルの開発、デプロイ、モニタリング、および維持を効率的かつスケーラブルに行うための手法とツールの総称です。MLOpsのツールを選ぶ際には、次のような点を検討することが重要です。

1. プロジェクトの規模や目的に適したものを選ぶ。大規模なプロジェクトであれば、スケーラブルで高性能なツールが必要ですが、小規模なプロジェクトであれば、軽量で使いやすいツールが適しているかもしれません。また、特定の用途に特化したツールもありますので、プロジェクトの目的に応じたものを選ぶことが重要です。

2. 使いやすさや信頼性に注目する。MLOpsのツールは、機械学習の専門家だけでなく、その他のチームメンバーも使用することがあります。そのため、使いやすさや信頼性が高いものを選ぶことが重要です。また、選択したツールが安定しているかどうかも確認することが重要です。

3. インテグレーションや拡張性に注目する。MLOpsのツールは、機械学習プロセスを効率的かつスケーラブルに行うために、他のツールやフレームワークとの統合が求められます。そのため、選択したツールが他のツールと簡単に統合できるかどうか、また、拡張性があるかどうかも確認することが重要です。


4. 価格やサポートに注目する。MLOpsのツールは、無料のものから有料のものまで様々なオプションがあります。無料のものは、試用や小規模なプロジェクトでの利用に適している場合がありますが、有料のものの方が一般的には機能が豊富で、高い信頼性を持っています。また、有料のものは一般的にはプロフェッショナルなサポートが付帯していることが多いため、問題が発生した際にはすぐに解決できる可能性が高くなります。価格やサポートを考慮することで、プロジェクトに適したツールを選択することができます。


いかがでしょうか？MLOpsのツールを選ぶ際には、上記のような点を検討することが重要です。また、実際に試してみることで、選択したツールがプロジェクトに適しているかどうかを確認することもできます。また、他のチームメンバーや同僚からのフィードバックを参考にすることも有効です。そのため、選択する際には、慎重に検討することが重要です。


![ml.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2242965/359bc4da-4c18-4d6f-5a40-189d051b803e.jpeg)
*ツール一覧の例*
【python】勉強メモ-その5　実務で書いたコード


### 1．はじめに
本日は、実務でのテキスト加工について書きます。

実務でログを取得し、集計を行うことになり取得したログを、集計可能な形式（CSV形式）にしなければ
ならなくなりました。

出力されたログ（r_file.log）を見ると、日時が一番上に書かれており、各メッセージの一番左にありません。
集計するためには、日時を、各メッセージの一番左に追記したCSV形式（w_file.csv）にする必要がありました。

さらに、取得したログ（r_file.log）は、200万行ある状態でした。

```r_file.log
Tue Nov 11 00:00:00 JST 2022
12 aaa bbb cc:cc:cc:cc ddd
34 eee fff gg:gg:gg:gg hhh

Tue Nov 11 00:00:05 JST 2022
78 iii jjj kk:kk:kk:kk lll
99 mmm nnn oo:oo:oo:oo ppp

Tue Nov 11 00:00:10 JST 2022
12 qqq rrr ss:ss:ss:ss ttt
34 uuu vvv ww:ww:ww:ww zzz

```

```w_file.csv
Tue,Nov,11,00:00:00,12,aaa,bbb,cc:cc:cc:cc,ddd
Tue,Nov,11,00:00:00,34,eee,fff,gg:gg:gg:gg,hhh
Tue,Nov,11,00:00:05,78,iii,jjj,kk:kk:kk:kk,lll
Tue,Nov,11,00:00:05,99,mmm,nnn,oo:oo:oo:oo,ppp
Tue,Nov,11,00:00:10,12,qqq,rrr,ss:ss:ss:ss,ttt
Tue,Nov,11,00:00:10,34,uuu,vvv,ww:ww:ww:ww,zzz
```


### 2．作成したコード

取得したログ（r_file.log）が、200万行ということもあり、一気に読み込み／出力（書き込み）は
メモリの消費が大きいと思い、1行ずつ処理を行いました。

プログラミング入門者が、実務で書いたコードを掲載します。

```sample_01.py
import csv

read_file = "r_file.log"
write_file = "w_file.csv"


with open(write_file, "w", encoding="utf_8", newline="") as w:
    writer = csv.writer(w)
    
    with open(read_file, "r", encoding="utf_8") as f:
        line = f.readline()
        
        while line:
            if line.startswith("Tue"):
                
                # JST 2022を除去
                data = line.split()[:4]
            
            # 列の開始が数字か確認
            if line[0] >= '0' and line[0] <= '9':
                elem = line.split()
                
                # 年月と時間を一番左に追記するため以下の処理を実施
                csv_data = data + elem
                
                writer.writerow(csv_data)
                
            line = f.readline()


```

### 3．コードについて
今回のコードは、まだまだ初心者レベルのため、突っ込みどころ満載だと思います。
今後、スキルアップのため、以下を取り入れて書き換えを行います。
- CSVモジュール又は、pandasを使うこと。
- 日時の抽出は、正規表現を使うこと。


### 4. 最後に
- ツッコミ歓迎致します。皆様のツッコミが、私のスキルアップにつながります！！
- お題なんかも出していただけると助かります。
- 実務では、もっと、こういう使い方もあるよ！！みたいなアドバイスもいただけると嬉しいです。
shader_minifierについてのメモ

* プリプロセッサはうまく処理できないことが多いみたいだから極力使わない方がいいかも
    * 主に#defineがなんか沼ってた 
* 使っていない変数は圧縮時に削除される
    * もしその使っていない変数の値を計算する関数の中でグローバル変数の更新などをしていたら、その更新処理が呼ばれなくておかしなことになる
    * (グローバル変数は使用しない方が安全かも)
```
// グローバル変数
float g_Val;

int s(args)
{
    // このグローバル変数の更新処理は呼ばれない
    g_Val = 10.0;    

    // 適当な処理
    return 1;
}

vec3 foo()
{
    int a = n( v1, v2, v3, ro, rd, t1 );
    // この変数bは圧縮時に削除される
	int b = s( v1, v3, v4, ro, rd, t2 );
						 
	if ( a == 1 )
	{
		vec3 p = ro + rd * t1;
		return p;
	}
}
```
GASで始めるWebAssembly

# はじめに
本記事は[QualiArts Advent Calendar 2022](https://qiita.com/advent-calendar/2022/qualiarts) 16日目の記事になります

ここでは Google Apps Script(以下GAS) を用いて WebAssembly(以下wasm) に入門するための紹介を行います
GAS や wasm, Rust などの基本的な説明は行いません

# なぜGAS?
GASの実行環境もV8ランタイムがサポートされており、wasmが使えた場合はGASやspreadsheetなどを用いる業務に活かすことができそうだと思い検証してみました

# 準備するもの
- 生成したwasmファイルをホストできる環境

# wasmファイルの生成
GASではTextEncoderなど対応されていないAPIがあるためそのままではGoなど一部の言語を用いて生成したwasmを使用することはできません
もしGoを用いて実行したい場合はwasm_exec.jsで実装してあるAPIをGAS向けに実装しなおす必要などがあります。(**未検証**)

https://github.com/golang/go/blob/master/misc/wasm/wasm_exec.js

そのため、今回はRustを用いてwasmファイルを生成します

```rust:src/lib.rs
#[no_mangle]
pub fn add(a: i32, b: i32) -> i32 {
    a + b
}
```

今回は `wasm32-unknown-unknown` をターゲットとし、ビルドします
`wasm32-wasi` でも可能ですが手順が少し変わります。(後述)

```shell
$ cargo build --target=wasm32-unknown-unknown
```

`./target/wasm32-unknown-unknown/debug` 配下にpackage名のwasmファイルが生成されているはずなのでそれをホストできる環境などにアップロードします

# GAS

まずは WebAssembly.Instance オブジェクトを生成します

```javascript
let instance;
(async () => {
  const resp = UrlFetchApp.fetch('ホストしたwasmファイルのURL')
  const obj = await WebAssembly.instantiate(new Uint8Array(resp.getContent()).buffer);
  instance = obj.instance
})();
```
GASにはfetch APIは存在しないため、UrlFetchApp.fetchを用いてファイルを取得します
取得したファイルデータをバイナリコードに変換し`WebAssembly.instantiate（）`を用いてinstanceを生成します

現在では、`WebAssembly.instantiateStreaming()`を用いることが推奨されていますがGASには存在しないため`WebAssembly.instantiate（）`を使用します
そのため、今回使用するホストサーバーが MIMEタイプ `application/wasm`で返してくれなくても問題ありません

https://developer.mozilla.org/ja/docs/WebAssembly/JavaScript_interface/instantiate

```javascript
function main(){
  console.log(instance.exports.add(5, 10))
}
```

後は生成されたinstanceからエクスポートされたwasm関数を呼び出すだけです

![スクリーンショット.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419074/ccefe2fa-f72e-07d8-ce9e-896268c7f852.png)

## wasm32-wasiの場合
wasm32-wasiをターゲットにビルドする場合は必要となるAPIを実装する必要があります。

```javascript
let instance;
(async () => {
  const resp = UrlFetchApp.fetch('ホストしたwasmファイルのURL')

  var importObject = {
    // 必要となるAPIの実装
    wasi_snapshot_preview1: {
      proc_exit: () => {...},
      fd_write: () => {...},
      fd_prestat_get: () => {...},
      fd_prestat_dir_name: () => {...},
      environ_sizes_get: () => {...},
      environ_get: () => {...}
    },
  }
  const obj = await WebAssembly.instantiate(new Uint8Array(resp.getContent()).buffer, importObject);
  instance = obj.instance
})();
```

以下記事がとても参考になります

https://fits.hatenablog.com/entry/2020/04/29/210734

https://github.com/WebAssembly/WASI/blob/main/phases/snapshot/docs.md

# おわりに

GASでもwasmを動かすことができました
今回はwasmを自作しましたが、wapm.ioなどすでにホストサービスが存在しているためもっとwasmが賑わったらGASでもwasmの恩恵を受けられるかもしれません
wasm楽しいのでこれからも色々と追っていきたいと思います！

https://wapm.io
Rustでフロントエンド開発！なんでみんなやらないの？【その１】

# はじめに
この記事は[C3 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/c3) 16日目の記事です

今回の記事では，Rustでフロントエンド開発の概要について書いたのち，ハンズオン形式でYewについて説明していきたいと思います．
# 概要
Rustでフロントエンド開発を行うことの概要についてです．手が動かしたくてたまらない人はこの章は飛ばして[ハンズオン](#ハンズオン)の章まで行ってもらって大丈夫です．
## なぜRustでフロントエンド開発を行うのか
RustはStack Overflowの「もっとも愛されているプログラミング言語」に選ばれ続けている現在最も注目されているプログラミング言語の一つです．
フロントエンドにおいてはRustからWebAssemblyを生成してそれをJavaScriptに埋め込んで実行という形で用いられます．ただし，現状ではWebAssemblyから直接DOMを操作したりすることはできないため，処理のパフォーマンスを向上させたい部分に対して部分的に使用されるのが主流です．そんな中でも，全てをRustで書いてやろうというフレームワークも存在しており今回はそれを用いてフロントエンド開発を行なっていきたいと思います．
で，**結局なぜRustでフロントエンド開発を行うのか**．はっきり言います．**ロマンです**.
だって**Rustでフロントエンドが書けたら面白いじゃないですか．**
今後，WebAssemblyがブラウザでJavaScriptと同様に動作するようになったらより優れたパフォーマンスを期待することができます．その前に技術の先取りをしちゃいましょう！

## フレームワーク-Yew-
RestにはSeedやPercyといったフロントエンドフレームワークがありますが，今回この記事で取り上げるのはYewというフレームワークです．採用理由としては，Reactっぽい書き方であることとgithubのスター数が比較的多いことです．普段，Reactを触ってる人なら結構親しみやすいと思います．

https://yew.rs/

# ハンズオン
## 環境構築
今回はRustそのものの環境構築は割愛させていただきます．以下に公式のinstallサイトを置いておきます．

https://www.rust-lang.org/tools/install

また，Yewの公式サイトに環境構築なしでブラウザ上でYewを動かせる[PlayGround](https://play.yew.rs/)もありますので，少しだけ遊んでみたいよって方はそちらをご利用ください.
### 動作環境
- cargo 1.64.0 (387270bc7 2022-09-16)
- rustc 1.64.0 (a55dd71d5 2022-09-19)
- rustup 1.25.1 (2022-07-12)
- Yew Version: 0.20

### 必要なツールのインストール
以下にYewで開発を行う上で必要なツールの軽い説明とコマンドを示します．

- RustをWebAssemblyをターゲットにコンパイルできるようにするためのコマンド．
```sh
rustup target add wasm32-unknown-unknown
```

- トランク（デプロイやパッケージ化を管理するためのツール）のインストール
```sh
cargo install --locked trunk
```

- [cargo-generate](https://github.com/cargo-generate/cargo-generate)（既存のgitリポジトリをテンプレートとしてプロジェクトを立ち上げるためのツール）のインストール
```sh
cargo install cargo-generate
```


## テンプレートプロジェクトの作成
以下のコマンドを実行することによりgithub上にあるテンプレートプロジェクトを作成することができます．コマンドを実行するとプロジェクト名を聞かれるので任意の名前をつけてあげてください．（Rustの命名規則は基本的にスネークケースであるためプロジェクト名もスネークケースにしておくことを推奨します．）
```sh
cargo generate --git https://github.com/yewstack/yew-trunk-minimal-template
```
その後作成したディレクトリに移動し，アプリケーションをローカルでビルドして実行します．
```sh
cd <プロジェクト名>
trunk serve
```
コンパイルが終わったらhttp://127.0.0.1:8080/ にアクセスすると以下のような画面が表示されると思います．これでテンプレートプロジェクトの作成は完了です．今回はとりあえずここまでです．お疲れ様でした．
![スクリーンショット 2022-12-16 7.16.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641365/a593aacc-f0f9-4b0e-e39b-4a943a06791c.png)


# 最後に
今回はYewのテンプレートプロジェクトの作成まで行いました．次回は，この続きで簡単なWebアプリケーションを作っていきたいと思います．近日中に公開予定なのでお楽しみに！

Rustはフロントエンドだけでなくバックエンドや組み込み系の開発も行える汎用性の高い言語です．（むしろその用途の方が多い）ということで，明日の[C3 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/c3)はyamato0211さんの「Rustでgraphqlサーバーを作る！」です．お楽しみに！
transform.jsonの修正

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

testbedで起動時のモデルの姿勢を変更する方法を検討しました。クロップや回転が難しくなるので起動時に正対した姿勢にしたいからです。

https://github.com/NVlabs/instant-ngp/discussions/593

> Q　unit cubeを回転させるようにすべてのカメラマトリクスを変更するヒントはありますか？
A　希望するunit cubeの回転に対応する 4x4 の回転行列を取り、すべてのカメラ行列にこれを掛けます。
(DeepLで翻訳しました　https://www.deepl.com/ja/translator)

:::note
業務外の個人的な検討活動です。
:::

:::note alert
警告
環境や入力内容によっては現在使用できている状況が壊れることがあります。
あなたの責任と判断で試してください。私は責任を取りません。
:::

#### テストデータ
sketchfabのNefertiti statueを使用させていただきました。ありがとうございます。

https://sketchfab.com/3d-models/nefertiti-statue-d148f771c3f44225b56cb7ce8d3c5ce6

#### transform.json
再掲します。カメラの位置と姿勢はtransform_matrixの名前で同次形のR|Tで保存されているようです。

![12-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/24b47ad3-abfd-e6a4-6fbf-188e2e0353da.png)

#### transformJson.py
colmap2nerf.pyを流用し、各カメラのtransform_matrixを回転させます。transformJson.pyという名前にしました。

![18-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/ba06a2f7-91eb-c4d7-fb40-5b015c797d81.png)

スニペット
```
    rot2 = R.from_euler("yzx", args.rotate, degrees=True)	

 	if ref_transforms:					
		# testbed.fov_axis = 0				
		# testbed.fov = ref_transforms["camera_angle_x"] * 180 / np.pi				
		if not args.screenshot_frames:				
        args.screenshot_frames = range(len(ref_transforms["frames"]))			
		# print(args.screenshot_frames)				
		for idx in args.screenshot_frames:				
			f = ref_transforms["frames"][int(idx)]			
			cam_matrix = f["transform_matrix"]			
			# print(cam_matrix)			
			rot1 = R.from_matrix(			
                    [[cam_matrix[0][0],cam_matrix[0][1],cam_matrix[0][2]],		
                    [cam_matrix[1][0],cam_matrix[1][1],cam_matrix[1][2]],
                    [cam_matrix[2][0],cam_matrix[2][1],cam_matrix[2][2]]])						
			rot3 = rot2 * rot1			
			camMatrix = rot3.as_matrix()			
			cam_matrix[0][0:3] = camMatrix[0][0:3]			
			cam_matrix[1][0:3] = camMatrix[1][0:3]			
			cam_matrix[2][0:3] = camMatrix[2][0:3]			
						
			t1 = [cam_matrix[0][3],cam_matrix[1][3],cam_matrix[2][3]]			
			t2 = np.dot(rot2.as_matrix(), t1)			
			t2 = t2.T			
			cam_matrix[0][3] = t2[0]			
			cam_matrix[1][3] = t2[1]			
			cam_matrix[2][3] = t2[2]			
```

#### testbed.exe
そのままのtransfrom.jsonを使うと横倒しでした。
![18-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/c0d73895-a98c-fb00-dc28-fd36dadc28c6.png)

#### transformJson.pyの実行
ここからz軸に-90deg回すと正対しそうなので、作成したtransformJson.pyに0, 0, -90を入力しました。

> (ngp) D:\git\instant-ngp\data>python transformJson.py --rotate 0 0 -90 --screenshot_transforms 221214a\json\221214.json > 221214a\221214R.json

#### testbed.exe　調整後
新たに生成したjsonファイルを使用しtestbed.exeを実行したところ狙い通り正対して再生されました。

![18-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/7c568c83-8da2-04e5-7a9a-428a76504b52.png)

:::note
使用しないtransform.jsonは拡張子を変えたり別のフォルダに移しておかないと混ざります。
:::
Next.js/React + GraphQLのコンポーネント整頓術

[Next.js + サーバーサイドTypeScript + 関数フレーバーでクリーンなアプリを作ったので実装意図とか書く Advent Calendar 2022](https://qiita.com/advent-calendar/2022/shwld)
の**16日目**。[株式会社mofmof](https://www.mof-mof.co.jp/)に生息している[shwld](https://twitter.com/shwld)です。

前日は[Turbopack](https://qiita.com/shwld/items/d48791a4f1305d8b373c)について書きました
# Next.js/React + GraphQLのコンポーネント整頓術

Next.jsはまだversion12を使っています。早く13になりたい。

コンポーネントの整理は[bulletproof-react](https://github.com/alan2207/bulletproof-react)を参考にしています。

```
┣━ components: 全体で共有するドメイン知識を持たないコンポーネント
┣━ features: 機能ごとのコンポーネント群
┗━ pages: Next.jsが管理するページ
```

この3つのディレクトリに分かれています。
`components`, `pages`にはあまりコンポーネントは増えません。

## components
全体で共有するコンポーネントはあまり多くなく、ここにコンポーネントが増える場合は注意が必要くらいに考えています。
ドメイン知識を持たないと書いてますが、layoutをここに入れてしまっています。layoutは別で切ってもいいかなとか思ったりします。

https://github.com/shwld/uzumaki/tree/advent-calendar/apps/web/src/components
## pages
基本的にはほとんどコードを書かず、features配下のコンポーネントを呼び出すのみです。
urlをファイルベースで表現するためにあるくらいの薄い層です。

https://github.com/shwld/uzumaki/tree/advent-calendar/apps/web/src/pages
## features
メインとなるディレクトリです。

機能ごとにディレクトリを切り、コンポーネントを配置しています。
コンポーネントの依存をツリーで表すことを優先して整理したいと思っていて、あるコンポーネント配下で使うコンポーネントは、そのディレクトリより下位に存在するようにします。
つまりこのディレクトリ配下は依存が深ければそれだけディレクトリも深くなります。

共通のfunctionやhookもなるべく作りたくなく、可能な限り`features`配下の依存するコンポーネントの近くに置きます。
依存が明確になると、もしコンポーネントを使わなくなっても、枝の上の方で切り落せば含まれる要素すべてをきれいに削除することができます。

https://github.com/shwld/uzumaki/tree/advent-calendar/apps/web/src/features
## GraphQLのクエリ
GraphQLは書くfeatureコンポーネントが実行します。
依存ツリーの途中で実行するべきか、ルートで実行すべきかは場合によるので適宜判断して配置します。
実行するGraphQLクエリは基本的にはそのコンポーネント以外から使わないため、同じディレクトリの中に同居させます（コロケーション）
また、命名がかぶらないよう、クエリの命名規則として `コンポーネント名_` を先頭につけるようにしています

```graphql:/apps/web/src/features/project/ProjectBoard/components/StoryCreateForm/StoryCreateForm.graphql
fragment StoryCreateForm_Item on Story {
  id
  title
}
```
[/apps/web/src/features/project/ProjectBoard/components/StoryCreateForm/StoryCreateForm.graphql](https://github.com/shwld/uzumaki/blob/advent-calendar/apps/web/src/features/project/ProjectBoard/components/StoryCreateForm/StoryCreateForm.graphql)


プレゼンテーショナル、コンテナーなコンポーネントは特に区別する必要はないと思っており、どこからでもクエリしていいと思って実装しています。
上記を意識して実装するとバケツリレーまみれになるし、データと表示を切り離したとしてカスタマイズして使うことはほぼありません、テストもモックしてしまえば問題ありません。

この方針にすることのデメリットはコンポーネントが完全にGraphQLのクライアントに依存することで、GraphQLなしでの実装は想定されていません。
自分はプレゼンテーショナルとコンテナが分離しているとファイルが増え、型定義も増え、DXが悪いと感じるので、デメリットを受け入れました。
## Next.jsを使う理由
あまりSSRを活用するというプロダクトでもないので、Next.jsを使う大きな理由はセットアップの楽さになります。
# 次回予告
次回は[NextAuth.jsとAuth0を使って認証をパッと作る](https://qiita.com/shwld/items/fe9017c1bddd93f5a211)について書きます。
Contoso について知らなかったこと

2020 年からアドベントカレンダー期に毎日何かを投稿するという奇祭に参加する習わしがあり今年もゆるゆる参加してみようと思い書くもの。Contoso なにそれ。

[コントソ - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3%E3%83%88%E3%82%BD)
> サンプル用に使う仮想上の会社またはドメインである。取締役会は業界関係者からなり、ダン・ジャンプCEOが率いている。

なんと日本語 Wikipedia に書いてある...。なんだそのストーリー設定の緻密。いや Contoso は大企業なのだ。
引用: [Contoso Corporation の概要 - Microsoft 365 Enterprise | Microsoft Learn](https://learn.microsoft.com/ja-jp/microsoft-365/enterprise/contoso-overview?view=o365-worldwide)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/73d54939-1292-7ef9-b1bb-ddf50e7f3344.png)
東京にも支店あるんかーい。

> 2011年4月1日のエイプリルフールに、Googleは「コントソはマイクロソフトの技術を諦めて、Google Appsを選んだ」というジョークを飛ばした。

というネタにまでされているらしい。
[Contosoのサンプルデータを読み込もう✨ - Qiita](https://qiita.com/akihiro_suto/items/adce363d68d76a354723) という記事もある。

[演習: Azure でドメイン ネーム サーバーの設定を構成する - Training | Microsoft Learn](https://learn.microsoft.com/ja-jp/training/modules/introduction-to-azure-virtual-networks/6-exercise-configure-domain-name-servers-configuration-azure)
[Azure Firewall とは - Training | Microsoft Learn](https://learn.microsoft.com/ja-jp/training/modules/introduction-azure-firewall/2-what-is-azure-firewall)
> この概要は、Azure Firewall と Azure Firewall Manager が、Contoso のネットワーク セキュリティ戦略に適しているかどうかを判断するのに役立つはずです。

翻訳のせいなのか何なのか Contoso の人の気分になりながら演習できる。
あと、ちょまどさんの Tweet があった。

https://twitter.com/chomado/status/1110302232652578816?s=20&t=h-5WDkvkbL0Hm1ftuv6RKA

カオスですね。今年私が知らなかったことでした。そろそろ本当に年末の足音... :christmas_tree:
最短ルートで見栄えの良いページが欲しい

# デザインは向いてない
　前に書いたように、デザインの学習は私にとってしっくりくるものではなかった。それでもWebサービスにはviewファイルを用意しないといけない。そこでデザインがしやすい仕組みをつかうことにした。フレームワークのひとつであるBootstrapを利用する。CSSを一からいじることがなく、簡単な記述でデザインが整う。

　利用するにしても、なにもわからなかったので、以下のUdemyの教材を購入した。

https://www.udemy.com/share/101Xd83@jQYoOgb399FJM1lMW0U_RfXy7qM0KONBhP74rtF4QJdHQmnkAGSAKeYUccUp73iE/

　セールの時に買ったので安かった。

　解説は英語だが、英語字幕をつけてやればわりとわかる。これを参考にしながら、トップページをつくった。navバーとかをつけた。特にGrid systemというのが非常に有用であり、PCからでもスマホからでも任意の幅で枠をデザインしてくれる。

　「Bootstrap臭がするから利用はやめたほうがいい」という意見も聞くが、それはその話。私はデザインが欲しいのではなく、サービスを作りたい。色とかそこら辺は後にして、まずは不自由なく使えるようにしたいのだ。

![スクリーンショット 2022-12-16 5.58.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104211/034aa0c4-9c10-3be2-6a08-be717114c4cd.png)

　ちょっと、かっこよくなった。

# アイコンは欲しい

　でも、アイコンは欲しいので現在依頼している。年明けにはできるかなぁ。
今日のElixirSchoolメモ10「シギル」

ElixirSchoolの勉強メモです。

https://elixirschool.com/ja/lessons/basics/sigils

## シギルの概要

Elixirには文字リテラルを表現したり取り扱うための別の構文がある。
シギルはチルダ`~`から始まり、文字が一つそれに続く。

Elixirのコアには予め組み込まれたシギルがあるが、それだけではなく言語を拡張したい場合には独自のシギルを作ることもできる。

* `~C` エスケープや埋め込みを含まない 文字のリストを生成する
* `~c` エスケープや埋め込みを含む 文字のリストを生成する
* `~R` エスケープや埋め込みを含まない　正規表現を生成する
* `~r` エスケープや埋め込みを含む　正規表現を生成する
* `~S` エスケープや埋め込みを含む　文字列を生成する
* `~s` エスケープや埋め込みを含む　文字列を生成する
* `~W` エスケープや埋め込みを含まない　単語のリストを生成する
* `~w` エスケープや埋め込みを含む　単語のリストを生成する
* `~N` `NaiveDataTime`構造体を生成する

デリミタのリストには以下のものが含まれる。

* `<...>` カギ括弧のペア
* `{...}` 中括弧のペア
* `[...]` 大括弧のペア
* `(...)` 小括弧のペア
* `[...]` パイプ記号のペア
* `/.../` スラッシュのペア
* `"..."` ダブルクォートのペア
* `''...` シングルクォートのペア

### 文字のリスト

```elixir
iex(1)> ~c/2 + 7 = #{2 + 7}/
'2 + 7 = 9'
iex(2)> ~C/2 + 7 = #{2 + 7}/
'2 + 7 = \#{2 + 7}'
```

### 正規表現

正規表現は動的にも`Regex`関数内で使うためにも生成できる。

```elixir
iex(3)> re = ~r/elixir/
~r/elixir/
iex(4)> "Elixir" =~ re
false
iex(5)> "elixir" =~ re
true
```

大文字で始まる文字列は正規表現と一致しない。
ElixirはPerl Compatible Regular Expressions（Perl互換正規表現式、PCRE）をサポートしているので、シギルの末尾に`i`を追加することで大文字・小文字の区別をしないように指定できる。

```elixir
iex(7)> re = ~r/elixir/i
~r/elixir/i
iex(8)> "Elixir" =~ re
true
iex(9)> "elixir" =~ re
true
```

さらにElixirはErlangの正規表現ライブラリを元に作られたRegex APIを提供している。

```elixir
iex(11)> string = "100_000_000"
"100_000_000"
iex(12)> Regex.split(~r/_/, string)
["100", "000", "000"]
```

`Regex.split`はリストを返す。

### 文字列

```elixir
iex(15)> ~s/welcome to elixir #{String.downcase "SCHOOL"}/
"welcome to elixir school"
iex(16)> ~S/welcome to elixir #{String.downcase "SCHOOL"}/
"welcome to elixir \#{String.downcase \"SCHOOL\"}"
```

### 単語のリスト

```elixir
iex(17)> ~w/i love #{'e'}lixir school/
["i", "love", "elixir", "school"]
iex(18)> ~W/i love #{'e'}lixir school/
["i", "love", "\#{'e'}lixir", "school"]
```

### NaiveDataTime

NaiveDataTimeはタイムゾーンがない`DateTime`を表現する構造体を手早く作るときに有用。
ほとんどの場合、NativeDateTime構造を直接作ることは避けるべきですが、パターンマッチには有用。

```elixir
NaiveDateTime.from_iso8601("2015-01-23 23:50:07") == {:ok, ~N[2015-01-23 23:50:07]}
```

### シギルを作る

Elixirのゴールの一つは拡張性のあるプログラミング言語になること。

```elixir
iex(20)> defmodule MySigils do
...(20)>   def sigil_u(string, []), do: String.upcase(string)
...(20)> end
{:module, MySigils,
 <<70, 79, 82, 49, 0, 0, 5, 132, 66, 69, 65, 77, 65, 116, 85, 56, 0, 0, 0, 195,
   0, 0, 0, 19, 15, 69, 108, 105, 120, 105, 114, 46, 77, 121, 83, 105, 103, 105,
   108, 115, 8, 95, 95, 105, 110, 102, 111, ...>>, {:sigil_u, 2}}

iex(23)> import MySigils
MySigils
iex(24)> ~u/elixir school/
"ELIXIR SCHOOL"
```

シギルの関数定義には入力とリストの2つのリストが必要。
セキュリティデータ管理サービス Amazon Security Lake について調べてみた

## はじめに
この記事は株式会社ナレッジコミュニケーションが運営する [クラウドAI by ナレコム Advent Calendar 2022](https://qiita.com/advent-calendar/2022/knowcom-cloudai) の 12日目にあたる記事になります。

今回は AWS が開催する re:Invent 2022 で発表されたセキュリティデータ管理サービス「Amazon Security Lake」についてどんなサービスなのか調べてみました。

## Amazon Security Lake とは
AWS CloudTrail や Amazon S3 など AWS サービスのログはもちろんオンプレミスやサードパーティツールのセキュリティデータを取り込んで一元管理できるサービスです。
その特徴の1つは Open Cybersecurity Schema Framework (OCSF) を採用していることで、これによりデータ正規化等の手間を減らすことができます。
![2022-12-16_03h52_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322096/e9d09644-3199-5f94-e84e-eee9d0f328ab.png)


## データ形式が統一されてないことの悩み
これはセキュリティデータに限らず分析業務に携わる方なら割と当てはまると思うのですが、スキーマやフォーマットが統一されていないことによってデータの正規化やスキーマの定義といった様々な課題があり、それらを乗り越えた上でやっと本来の分析業務に着手できる。 こんなことがざらにあるかと思います。
特にデータレイクやレイクハウスといった言葉が飛び交う昨今、部署間の垣根を飛び越え会社一丸となってデータ活用のためのシステム刷新をされている企業様も多いことでしょう。
データ形式の違いは収集するデータソースが多種多様になればなるほど大きな課題となります。

## 改めて何が便利？
Amazon Security Lake で収集できるログやイベントソースは AWS 内のサービスだけでも AWS CloudTrail、Amazon S3、Amazon VPC、AWS Security Hub を通じて AWS Config や Amazon GuardDuty... と多種多様なログやイベントソースをサポートしています。
これだけたくさんのサービスをサポートしていると、上述のような悩みが出てくると思いますが、OCSF を採用しているのでベンダーに依存しないデータ分類法によって作業者の負担を軽減してくれます。
ログ構造の分析やスキーマ、マッピングの定義といった業務から開放され、本来のセキュリティリスク等の対処や分析に専念が出来るわけですね。



## おわりに
Amazon Security Lake は2022年12月時点でプレビューのサービスです。
利用にはリクエスト申請が必要なので以下のURLから申し込みを行いましょう。
https://aws.amazon.com/jp/security-lake/
半年ほどメンターをして感じた答えやすい質問の特徴

本記事は [STECH / 愛知工業大学 システム工学研究会 共同企画 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/stech-ait-advent) の17日目の記事です
# はじめに
　僕は [Tech Select](https://techselect.careerselect.jp/) という学生向けプログラミング学習コミュニティでメンターを務めています。基本的には、学習している学生から質問が来ると答えるといったことをやっています。あーこれ僕も詰まったことあるわー的なものから、なんやこれ??  ってなる質問までたくさん回答できる機会があり、新鮮な気持ちになります。
　その質問の中でも、答えやすく感じたものと、そうでなかったものがありました。今後僕が質問する時にも役に立つと思うので、メンターやってた半年を振り返ってその違いをまとめてみようとと思います。

# 質問する前に
　自分がつまずいたときに、まずやるべきことは調べることです。質問の記事なのに最初に書かれてるのが自己解決かよと感じるかもしれませんが、何かで躓いたときはすぐに他人に頼ろうとせず、まず自分で解決しようとすることが一番大事です。では、どのタイミングで質問すべきかというと、15 分以上かけても解決できない場合です。Google が提唱している 15 分ルールというものがあり、これは 15 分より早く質問するのは相手の時間を無駄にし、15 分経っても質問しないのは自分の時間を無駄にするというものです。
　まぁメンター制度は質問するためのものだから、時間奪ってもいいじゃんって考えるかもしれませんが、エンジニアは調べる能力の成長が大事なんです。だからこそ、質問は 15 分掛けても解決しないときにするのがベストです。
　

# 質問でほしい情報
質問する際に一番もったいないやり取りは、回答者側が質問の意図や問題の原因を把握できず、質問者に質問で返してしまう時間です。質問者は再度自分が躓いている点について送信しなければならず、回答者も再度確認しなければなりません。そこで、どのような情報があれば、解決しやすかったのか、振り返ってみました
## エラー情報
　エラーで動かない場合は必須です。文字で "動作しなかった" という報告のみを頂いても、原因を特定することが難しく、再度どのようなエラーが出ていたかを尋ねることになり、お互いに時間を無駄にしてしまいます。
　ちなみに、このエラーを画像でなく、テキストで送っていただけると非常に助かるなと感じることもありました。見たことないエラーだとその分を実際に検索することが多いのでコピペで調べられるとちょっと楽でした。

## うまく動作していないとされるコード
　エラー文等からうまく動作していないコードの場所が推測できる場合は一緒に送っていただけると回答しやすかったです。コードでエラーが吐かれている場合はその情報がないと解決が難しいですもんね。追加で、どういう処理を実装しようとしていたか等の詳細もあったときにわかりやすいなと感じました。

## 解決のためにやったこと
　この情報があるととっても助かります。エラーが出た時に調べて出てくる方法を試しても解決できなかった場合があるとします。この時、試した内容を送っていなければ、質問解答者も同じ解決しなかった手法を提案する可能性があります。また、この手法で解決できないということは、このあたりに原因がありそう、と事前に推測を建てながら原因考えることもできます。

# 解決後
　解決できた方法が、自分にとって理解できる方法であれば問題はないですが、解決法の中で気になる点があれば積極的に聞くべきだと思います。質問する上で一番大事なことは、問題を解決することでなく、解決方法を理解することだと思ってます。その場しのぎで動作しても、理由がわかってなかったら次似た問題が発生しても躓いちゃうかもしれないです。

# メンターをしている感想
　学生エンジニアの方でメンターをやってみたいと感じている方向けに、自分の感想を述べさせてもらうと、趣味の開発、チーム開発とはまた違った新鮮な学びや体験が多くでき楽しいです。また、テキスト形式でのコミュニケーションの練習もできたなと感じてます。このコミュニケーションは個人開発ではもちろん体験できないものですし、あまり知らない方とのやり取りのため知り合い同士で行うチーム開発とはまた違った体験ができます。また、常に対峙する内容がエラーやバグであるというのも興味を惹かれる方がいるのではないのでしょうか。僕は特段にエラーとの格闘が好きだ！！ 　って人間ではないのですが、知らないエラーを質問者と話し合いながら解決できた時は達成感があり、今後のための学びにもなったなと感じてます。
　メンターをすることで開発とはまた違った体験ができるので、この記事で興味が啜られた方はぜひやってみることをお勧めします。


# おわりに
まとめるとこんな感じです。
- 15 分は自分での解決を試みる、無理なら質問する
- 質問は原因にたどり着くための情報を載せる
    - エラーの出力
    - ソースコード
    - 解決のために試した方法
- 解決しても納得するまで質問する

　自分もまだまだ技術者として未熟な人間なので、これからたくさん質問する機会があると思ってます。だからこそ、このようなメンターをする機会を頂き、質問される側を体験できたことは非常に貴重な機会だったと思っています。この記事の内容が参考になれば幸いです。
2022/12/16主にITとかセキュリティの記事

「iOS」の脆弱性に対する攻撃が発生 - macOSも含めてアップデートを
https://www.security-next.com/142220

Ivanti、「2023セキュリティ体制の現状」の調査レポートを発表(12/14)
https://prtimes.jp/main/html/rd/p/000000036.000065506.html

自動車サイバーセキュリティに関する最新情報をまとめ、分析したレポート「サイバーセキュリティ最新動向ガイド」「サイバーセキュリティ法規制ガイド」2022年Q3版をリリース(12/14)
https://www.dreamnews.jp/press/0000272123/

目指せ！トップガン - クラウドセキュリティ 3回目：CISOの質問にタイムリーに応えるための10の方法（前編）(12/13)
https://japan.zdnet.com/pickup/ms_topgun_202208/35196552/

ランサムウェア感染で情報流出懸念｜シャンティ国際ボランティア会(12/14)
https://cybersecurity-jp.com/news/76109

2022年のランサムウェア動向と脅威アクター(12/13)
https://japan.zdnet.com/article/35197051/

ゼロトラストセキュリティ、導入率が最も低い施策はオンプレ対象のSSO(12/14)
https://news.mynavi.jp/techplus/article/20221214-2537603/

年1000件超の診断から見たウェブアプリケーションに作り込まれやすい脆弱性--後編(12/14)
https://japan.zdnet.com/article/35196942/

1位は寿司チェーンの情報持ち出し　トレリックス、10大セキュリティー事件発表(12/14)
https://dempa-digital.com/article/381634

米、ハッカーのスパイ行為警告　シトリックス機器の脆弱性悪用(12/14)
https://jp.reuters.com/article/cyber-citrix-china-idJPKBN2SY01U

AWSなど5社のWAFの検知を回避する攻撃手法が見つかる(12/14)
https://news.mynavi.jp/techplus/article/20221214-2535254/

2022年12月マイクロソフトセキュリティ更新プログラムに関する注意喚起(12/14)
https://www.jpcert.or.jp/at/2022/at220034.html

Weekly Report 2022-12-14号
https://www.jpcert.or.jp/wr/2022/wr224901.html

Windowsハードウェア開発者プログラムの認定を受けたドライバーがマルウェアの署名に悪用されていたことが発覚 - (12/14)
https://gigazine.net/news/20221214-microsoft-malicious-windows-drivers-ransomware/

Microsoft製品に緊急の脆弱性、ただちに累積更新プログラムなどの適用を(12/14)
https://news.infoseek.co.jp/article/mynavi_2527423/?tpgnr=it

Microsoft署名のドライバがランサムウェアに悪用(12/14)
https://pc.watch.impress.co.jp/docs/news/1463559.html

Citrix ADCとGatewayに緊急の脆弱性、ただちにアップデートを(12/14)
https://news.mynavi.jp/techplus/article/20221214-2537386/

信頼関係を強化するために適切な投資を(12/14)
https://www.risktaisaku.com/articles/-/75082

盗まれたiPhone、英国から中国へ運ばれたことを追跡 - その後はどうなる？(12/14)
https://news.mynavi.jp/techplus/article/20221214-2537626/

日経電子版がRFC 9116(security.txt)に対応した話(12/14)
https://hack.nikkei.com/blog/advent20221214/

身代金を払っても復旧できず--欠陥ランサムウェアに注意喚起(12/13)
https://japan.zdnet.com/article/35197259/

AppleがiPhoneで「App Store以外のアプリストア」を初めて許可するべく準備を進めている(12/14)
https://gigazine.net/news/20221214-apple-allow-third-party-app-stores/

カナダが暗号資産事業者への規制強化へ、証拠金取引禁止など(12/14)
https://www.neweconomy.jp/posts/283038

今年最後（になるはず）の「Windows Update」が公開 ～「Windows 10 バージョン 21H1」は終了(12/14)
https://forest.watch.impress.co.jp/docs/news/1463489.html

Colt、プライベート5Gなど2023年のテクノロジー・トレンドを予測(12/14)
https://news.mynavi.jp/techplus/article/20221214-2537633/

対北朝鮮、サイバー分野で協力　日米韓高官が協議(12/13)
https://www.nikkei.com/article/DGXZQOGM138MS0T11C22A2000000/

セキュリティの責任者が退職したTwitter、これからどうなるのか(12/13)
https://kn.itmedia.co.jp/kn/articles/2212/13/news014.html

北朝鮮ミサイル資金源は「サイバー攻撃で奪った暗号資産と麻薬」…脱北した元駐英公使が見解(12/14)
https://www.yomiuri.co.jp/world/20221214-OYT1T50231/

奇妙なサイバー攻撃6選 - 宇宙飛行士救出の謎、見えない広告、猿のNFT(12/14)
https://news.mynavi.jp/techplus/article/20221214-2536919/

規模が小さいコンサルティング会社　マッチングビジネスで価値を広める(12/15)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/040200037/121200073/

デジタル化の「二周目問題」　システム部門はどうすべきか(12/15)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020900021/120800127/
関数電卓の初歩的な操作~メモリ機能，平均の求め方~

この記事は[長野高専 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/nnct)の15日目です．
プログラミングで書けることがなかったので関数電卓についてです．

私は入学時に購入して以来関数電卓をずっと持ってるんですが，
普段使うのは加減乗除と分数ぐらいで，
普通の電卓でもできそうな使い方しかしていませんでした．
しかし最近，数学や物理でちょっとだけ関数電卓に詳しくなったので，
新しく覚えた機能をぽつぽつとと書きます．
なお私の持ってる電卓はSHARPのEL-509Tなのでこの機種についての話になります．

# 電卓に名前を付ける
(「2nd F」+ 「SET UP」+「6」)

一般的な機能かはわかりませんがこの電卓には名前を付けられる機能があります．
(電卓に"デンコちゃん"とかいうニックネームを付けるという意味ではなく，
電卓に記名しておくという意味です)
名前にはアルファベット，数字，記号が使えて32文字まで記録可能です．
ではこの名前はどこに表示されるかということなんですが，
電卓の電源が切れるときSHARPのロゴの下に一瞬だけ表示されるようになっています．
でも，これだけだと落としたときとか誰にも気づいてもらえなそうですよね．
だから名前は本体にも書いといたほうがいいと思うのですが，おもしろい機能だと思います．

<img width="300" alt="名前" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2585097/5e8fd71f-859e-0588-bacb-94022b931cbd.jpeg">

# 「2nd F」，「ALPHA」
この2つのボタンはキーボードでいうシフトキーみたいなものです．
関数電卓には一つのボタンに複数の機能があるのですが，
「2nd F」キー，「ALPHA」キーを押すと使う機能が切り替えられます．
以下の写真でオレンジ色の文字で書かれているのが「2nd F」を押したときの機能，
緑色の文字で書かれているのが「ALPHA」を押したときの機能です．
たとえばe^xなどを計算するときは「2nd F」+「ln」のようにするわけです．

 <img width="300" alt="関数電卓" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2585097/eef954e6-b6ac-9dfb-1b12-9f1496e84d6c.jpeg">


# メモリ機能
(Aに値を保存:「STO」+「A」，値を呼び出し:「RCL」+「A」)
(独立メモリに値を足す，引く:「M+」，「M-」)

メモリ機能は値を保持しておく機能です．
この電卓ではなんとA ~ F，X，Y，Mの9つのメモリが使えます．
私は今まで知らなかったのですが，
メモリ機能は普通の電卓にもついている一般的な機能だそうです．
この機能を使うと入力した値や計算値を取っておいて，後の計算で使うといったことができます．
物理定数など何度も使う値を記録しておいたり，
複雑な式をいくつかの部分に分けて計算するときに便利です．
またMメモリは独立メモリという特別なメモリで値を再定義することなく，
保持した値に新たな数値を足したり引いたりできるそうです．



# 統計モードで平均や標準偏差を求める
(統計モード:「mode」+「1」+「0 ~ 7」)
(統計量の一覧を表示:「ALPHA」+「統計量」+「0」)

関数電卓にはたくさんのモードがあります．
統計モードもその一つです．
このモードでは画面に表が現れてそこにデータ，度数を入力できるようになっています．
そしてなんと，データの入力後上記の「統計量の一覧を表示」のコマンドを入れるだけで
データの平均，標準偏差，分散，総和，二乗和といった値が一気に求められてしまいます．
総和や二乗和が求められるため，物理の最小二乗法などで役に立ちそうです．

 <img width="300" alt="tabular" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2585097/bc19008e-afc5-be73-5763-fc367e74351f.jpeg">

 <img width="300" alt="tokei" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2585097/032a322f-5c66-ff48-3f3d-0ca61507f8cb.jpeg">


# エンジニアリング記号
(「MATH」+「0」+「0 ~ 8」)

この機能は「k(キロ)」，「μ(マイクロ)」といった記号を式に含めることができる機能です．
物理の実験などでμ(マイクロ)，m(ミリ)といった単位が混在しているような式があると思いますが，
それを計算するときに便利かもしれません．
ただ押すボタンの数が多いので，
単に計算するだけなら「Exp」を使ったほうがより簡単そうですが…
でも，「p(ピコ)って10何乗だっけ?」ってド忘れしちゃったときとか
式を見やすくしたいときにはすごく役に立つと思います．

 <img width="400" alt="kigou" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2585097/5df7dd8f-1fb8-839f-9434-84c525729a7e.jpeg">

# 最後に
いかがだったでしょうか．
私の知っている機能はこれぐらいのものでして，基礎中の基礎というレベルだと思います．
ほかにもいろいろな機能があって，微分積分や単位の変換(1尺とか1インチとか)
なども可能だそうです．
関数電卓の説明書を読むといろんな機能が乗っていておもしろいですよ．
(windows)マザボの名称を確認する方法

# 概要
メモ用
## やり方
コマンドプロンプトから以下を入力
wmic baseboard get product

コマンドプロンプトはwin+rで”ファイル名を指定して実行”を呼び出し、cmdを入力すると出てくる。
PowerShellでもできる。
event.preventDefault();

# アクションが途中で止まり困っていた。
送信ボタンを押しても何も起こらなかった。
考えた末```event.preventDefault();```これでこの先のアクションが動かなかったのではないかと考えた。
```html
<form id="*******" action="/******/******" method="get">
  <label for="date">日付</label>
  <input type="date" id="date" name="date">
.
.
.
<script>
  document.getElementById('post_search').onsubmit = function() {
  event.preventDefault(); //これを削除する
  document.getElementById('post_search').date.value;
  console.log(document.getElementById('post_search').date.value);
  };
</script>
```
# 結果
その通りだった。
```event.preventDefault();```を削除するとアクションが動いた。

# 感想
また勉強になった。
考えた時間が長かったので投稿した。
これで眠れそうだ。
3次元動作データをPythonで可視化してみた

モーションキャプチャで取得した3次元のマーカー座標データから膝の角度変化をPythonで可視化してみました。

# 使用データ
膝の周り7か所に貼ったマーカーから取得した座標データ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3071812/a6538c6c-5373-e615-04d4-36dc3a177983.png)

# 計算方法
```python
beta_knee_angle = []
alpha_knee_angle = []
gamma_knee_angle = []

for i in range(934):
    G_T = np.array(df_knee.loc[1+i,['X1','Y1','Z1']].astype(float).values.tolist())
    L_EC = np.array(df_knee.loc[1+i,['X2','Y2','Z2']].astype(float).values.tolist()) 
    M_EC = np.array(df_knee.loc[1+i,['X3','Y3','Z3']].astype(float).values.tolist()) 
    L_C = np.array(df_knee.loc[1+i,['X4','Y4','Z4']].astype(float).values.tolist()) 
    M_C = np.array(df_knee.loc[1+i,['X5','Y5','Z5']].astype(float).values.tolist()) 
    L_M = np.array(df_knee.loc[1+i,['X6','Y6','Z6']].astype(float).values.tolist()) 
    M_M = np.array(df_knee.loc[1+i,['X7','Y7','Z7']].astype(float).values.tolist()) 
    
    #G_T,L_EC,M_ECから太もものローカル座標をつくる
    #ローカル座標：p
    #L_ECとM_ECの中点をN_ECとする
    N_EC = (L_EC+M_EC)/2
    
    k_p = (G_T-N_EC)/np.linalg.norm(G_T-N_EC)
    i_tmp = (L_EC-N_EC)/np.linalg.norm(L_EC-N_EC)
    j_p = np.cross(k_p,i_tmp) #外積
    i_p = np.cross(j_p,k_p)
    
    
    #L_C,M_C,L_M,M_Mから太もものローカル座標をつくる
    #ローカル座標：d
    #L_CとM_Cの中点をN_Cとする
    #L_MとM_Mの中点をN_Mとする
    N_C = (L_C+M_C)/2
    N_M = (L_M+M_M)/2

    k_d = (N_C-N_M)/np.linalg.norm(N_C-N_M)
    i_tmp = (L_M-N_M)/np.linalg.norm(L_M-N_M)
    j_d = np.cross(k_d,i_tmp) #外積
    i_d = np.cross(j_d,k_d)
    
    
    # β角：外転内転
    # α角：屈曲伸展
    # γ角：内旋外旋

    # β角の結果を他の2方向の角度計算に利用する
    beta = np.arcsin(np.dot(k_d,i_p))
    beta_angle = np.rad2deg(beta) 
    beta_knee_angle.append(beta_angle)
        
    alpha = np.arccos(np.dot(k_d,k_p)/np.cos(beta))
    alpha_angle = np.rad2deg(alpha) 
    alpha_knee_angle.append(alpha_angle)
   
    gamma = np.arccos(np.dot(i_d,i_p)/np.cos(beta))
    gamma_angle = np.rad2deg(gamma) 
    gamma_knee_angle.append(gamma_angle)
```


# 各軸ごとの角度を可視化
matplotlibで3軸それぞれの時系列角度変化を可視化してみた。
`plt.plot(time, 角度を格納したリスト)`で3軸についてやってみる。

```python
# α角：屈曲伸展
fig = plt.figure()

plt.plot(time,alpha_knee_angle)
plt.xlim(time[0],time[-1])

xmin, xmax = time[0],time[-1]
plt.hlines(0, xmin, xmax,colors='gray',linestyle='dashed')

plt.title("α angle")
plt.xlabel("time(s)")
plt.ylabel("angle(deg)")
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3071812/a8e72a15-55a6-52f6-5c9c-9388aec0f7fb.png)

今回のデータでは膝が2回屈曲していたことがグラフからもよく分かる。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3071812/be096032-35ee-836f-88c5-910de57a82ce.png)

外転内転方向の動きも2つの山があり、屈曲動作と連動してるなーと分かる。ただ変化角度はα角と比べると小さい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3071812/71ce3cf9-232f-60e9-b057-a423dee94c28.png)

上2つのグラフと違って2つの大きな山があるわけではないので、この軸方向の動きは膝の屈曲動作ではあまり動かさない方向だと分かる。
変化角度も±10もないくらいなので目で見てもあまり分からない変化だろうなーと想像できる。
マイクラのサーバーを自分のIPを公開せず、かつ自分で建てる方法比較


# サービス一覧
## ngrok
TCP通信を行うサービスをngrok経由で公開できる。

### Pros
* 無料でも使える
* マイクラ以外のサービス(HTTPとか)でTCP通信が出来るものは全て使える

### Cons
* 普通にngrokのサーバーを総当たりしてマイクラサーバーを見つけるツールとかも出回っているので避けたい。
* 独自ドメインとかを設定するには有料
* クライアントのIPアドレスは全てローカル(ngrokからの通信)になる


## TCPShield
リバースプロキシ的なの

### Pros
* 無料でも使える
* 管理パネルが使いやすい
* クライアントのIPアドレスを取得できる(要プラグイン)
* Dos攻撃の対策が出来る

### Cons
* pingがちょっと高いように感じる(要検証)

## Hamachi
P2P用のVPNを構築して接続できるようにするツール。

### Pros
* 無料でも使える

### Cons
* クライアントにもHamachiが必要
* サーバーのネットワークのすべてにアクセスできるなどのセキュリティ関連の問題がある
LovyanGFXで画面描画(5):PC でも動画再生

「LED パネルキット AKBONE2022 で動画再生」
https://qiita.com/nanbuwks/items/2d71f9a12442f91e34ec

では SD カードから動画を読み込み、LEDパネルに出力しましたが、 LovyanGFX の PC エミュレータで同様に出力してみます。

# 画面出力サイズ

今回は、LEDパネルのサイズにあわせて、128x64のドットのスクリーンを仮想的に作ります。PC 画面上ではそれを縦横3倍にして、出力します。


# 準備

「LED パネルキット AKBONE2022 で動画再生」の記事のとおりにして、128x64.rgb を用意します。
ファイルを作業ディレクトリにコピーしておきます。
また、以下の内容の pc.hpp ファイルを作り、作業ディレクトリに保存しておきます。

```
#define delay(msec) SDL_Delay(msec)
#include <stdint.h>
#include <stdlib.h>
#include <string>
```

これは Arduino スケッチで使われているインクルードファイルや、delay 関数を使えるようにするためのものです。

# スケッチ

LEDパネルキット用のものを元に、以下のようにしました。
かなり簡略化できています。
冒頭に、先程作った pc.hpp を読み込ませています。

```
#include "pc.hpp"
// video info
#define FRAME_W 128
#define FRAME_H 64
#define FRAMEBUFF_SIZE FRAME_W*FRAME_H*2 
#define FILENAME "128x64.rgb"
auto buffer = (uint8_t*)malloc(FRAMEBUFF_SIZE);

//rgb565=buffer;
#define LGFX_USE_V1
#include <LovyanGFX.hpp>

// #define PANEL_64x32
#define PANEL_128x64

#include <LGFX_AUTODETECT.hpp>
LGFX gfx ( 128,64,4 );

void setup() {
  Serial.begin(115200);
    //gfx.setColorDepth(8);
  gfx.init();
  gfx.setBrightness(128);
  gfx.setColorDepth(16);
//  Serial.println("setup done");
  delay(1000);
}

void loop() {
  char filename[50];
  int size;

  while (1){
    sprintf(filename,FILENAME);
    //Serial.print(filename);
    // File fp=SD.open(filename);
    // File fp=SPIFFS.open(filename, "r");
    FILE *fp;
    fp = fopen(filename,"r");
    if (!fp){
      //Serial.println("---fail----");
      continue;
    }
    // for ( int i=1; fp.available(); i++){
    for ( int i=1; !feof(fp); i++){
      // size = fp.read(buffer,FRAMEBUFF_SIZE);     
      size = fread(buffer,1,FRAMEBUFF_SIZE,fp);
      // Serial.println(String(i)+" "+String(size) + "bytes  " + String(millis()) + "ms ");
      gfx.pushImage(0,0,FRAME_W,FRAME_H,(uint16_t *)buffer);
      delay(40);
    }
    //fp.close();
    fclose(fp);
  }
}

```



Serial 関数はコメントアウト、またファイル入出力は元々のものをコメントアウトして、Cのスタンダードファイル入出力関数のものを別に足しています。

ここらへんの詳しい説明は後日・・・

# 実行

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/b594cd2e-c77e-eb6f-ebb7-4ba250e037cd.png)

動画が表示されました。
API をブラウザで検証したい？？ Chrome拡張のTalend API Tester をどうぞ！！

# 概要

* 開発環境の REST API をブラウザでちょろっと検証したい時におすすめなのが、こちらの Talend API Tester です！
* 本記事では Talend API Tester がなんなのかとどんな感じで使うのかをまとめてみました。

https://chrome.google.com/webstore/detail/talend-api-tester-free-ed/aejoelaoggembcahagimdiliamlcdmfm/related?hl=ja

# Talend API Tester

* Talend API Tester は、Chrome 拡張機能として提供されておりブラウザ上で API をサクッと叩くことができるツールです。
* REST API における POST、GET、PUT、DELETE などのメソッドで、パラメータをつけたりしてリクエストを送れるので簡単にトライ&エラーのテストや動作確認ができます。

# 使用方法

* 使用方法は超簡単で、拡張機能を追加するだけですね。

![スクリーンショット 2022-12-16 1.57.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/499e8e50-f15d-7630-7a2a-239c34397170.png)

![スクリーンショット 2022-12-16 1.57.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/a99a54a1-21f8-fd78-f873-a7b15da3d9cd.png)

# 試してみた

* それでは試してみましょう。
* 今回もいつもお世話になっている swapi を使っていきます。

https://swapi.dev/

* 「https://swapi.dev/api/people/1」 のエンドポイントに投げてみたのですが、うんいい感じですね。
* まあ、Postman とか Curl でもよいですが、まあサクッと試せる１つの選択肢くらいの思っていただければと思います。

![スクリーンショット 2022-12-16 1.59.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/423b3ae6-ce0f-e220-1019-4b20c31aea25.png)




# 参考資料

https://chrome.google.com/webstore/detail/talend-api-tester-free-ed/aejoelaoggembcahagimdiliamlcdmfm/related?hl=ja
プリザンターのカンバンの色を変更する

# 概要

プリザンターのカンバン機能は背景色がすべて固定です。
今回はカンバンの背景色を変更し視覚的に判別したいときのカスタマイズ方法を紹介します。

# 色を判別する項目

今回は一例として
プリザンターのテンプレートにある「タスク管理」の作業内容（分類B）を使いたいと思います。
設計、開発という2つの選択項目を設定しました。
![2022-12-16_01h49_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167316/da4b37f4-5f03-edbc-8e85-de44650c6322.png)

# スクリプト

以下のサンプルコードをスクリプトに追加し、出力先はカンバンのみにチェックを入れます。
作業内容（分類B）が設計なら黄色、設計以外なら緑色という条件にしています。

![2022-12-16_02h07_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167316/bb261290-e13f-1df3-b218-8a1949247b08.png)

```javascript
$p.events.on_kamban_load= function () {
    //サイト内のレコードを取得
    $p.apiGet({
        id: $p.id(),
        data: {
            View:{
            ApiDataType: "KeyValues",
            GridColumns: ["IssueId","ClassB"]
            }
        },
        done: function (data) {
            for (let item of data.Response.Data) {
                if (item.作業内容 === '設計') {
                    //カンバンの背景を黄色に変更
                    $('div[data-id =' + item.ID + ']').css('background-color','yellow');
                } else {
                    //カンバンの背景を緑色に変更
                    $('div[data-id =' + item.ID + ']').css('background-color','green');
                }
            }
        }
    });
}
```

# 内容確認

表示をカンバンに変更して色が変わっていることを確認。
![2022-12-16_02h02_51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167316/4b788308-a613-72ea-fbbe-79b83ba876b9.png)
IDMC API Microgateway 超入門

この記事は インフォマティカ [Advent Calendar 2022](https://qiita.com/advent-calendar/2022/informatica) Day 16 の記事として書かれています。
# はじめに
Informatica Intelligent Data Management Cloud（IDMC）の機能の中には
ETLや一括取り込み処理だけではなく、APIによる連携処理を簡単に開発することができます。
APIを開発する機能をCloud Application Integration（略してCAI）と呼びますが、
CAIで開発したAPIを管理対象APIとして管理することができます。

## なぜAPIを管理するのか
APIは重要な情報を参照もしくは更新する連携処理です。
よって、誰もがアクセスしてよいわけではありません。

* APIを実行する権限があるかどうか認証を行い
* APIを実行してよい場所からアクセスしているか呼び出し元のIPアドレスの確認や
* APIを呼びすぎないように、流量制御をおこなったりする必要があります。

これらの機能をAPI Gatewayが担っており
IDMCでは、２つのタイプのAPI Gatewayを提供しております。

## ２つのAPI Gateway
IDMCでは２つの種類のAPIゲートウェイを提供しております。
CAIで開発したAPIを、どこにパブリッシュするかで、利用できるAPI Gatewayの種別が変わってきます。

CAIでは、開発したAPIを Informatica CloudのCloud Serverもしくは
任意のSecureAgent(もしくはAgentグループ)上にパブリッシュすることが可能です。
このように、API毎に選択することが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984410/87b43e71-1ad8-dbf8-c8eb-f090dd642470.png)

どこにAPIがパブリッシュされたかで利用可能なAPI Gatewayが異なります。
また、提供する機能も若干の差異がございますので、下記の表でまとめてみます。

<table>
  <caption>API Gateway一覧</caption>
  <thead>
    <tr>
      <th>名前</th> <th>APIのデプロイ場所</th><th>管理UI</th><th>認証</th><th>IPフィルタ</th><th>流量制御</th>
    </tr>
  </thead>
  <tr>
    <td> API Gateway </td> <td> Cloud Server</td> <td>あり</td>
<td>OAuth 2.0 認証<br/>JSON Webトークン</td>
<td>あり</td>
<td>あり</td>
  </tr>
  <tr>
    <td> API Microgateway  </td> <td>任意の位置(SecureAgent)</td><td>なし(REST APIで管理)</td>
<td>OAuth 2.0 認証</td>
<td>あり</td>
<td>あり</td>
  </tr>
</table>
※API Microgatewayは、プレビュー版を経て、2022年初めに正式に製品版としてリリースされました。

# API Microgatewayとは
ここまで読んでいただいた方はご存じの通り、
API Microgatewayは、SecureAgent上にAPIをデプロイした場合に
利用できる、API Gateway機能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984410/69ec7256-478d-72ed-469d-b1d19659b646.png)

SecureAgent上のOSにDockerコンテナを準備し、
コンテナ上で、API Microgatewayを稼働させる仕組みとなっております。
名前が似通っており、ややこしいですが、SecureAgent上で稼働するAPI Microgateway Serviceが提供する
API管理用のREST APIを通して、API Microgatewayの設定等を行うことができます。

わかりずらいので、API Microgateway Serviceと
API Microgatewayが異なるものだということを下記の表でまとめます。

<table>
  <caption>API Microgateway ServiceとAPI Microgateway</caption>
  <thead>
    <tr>
      <th>名前</th> <th>説明</th>
    </tr>
  </thead>
  <tr>
    <td>API Microgateway Service</td> <td> SecureAgent上で稼働するサービスの1つ、主に、Dockerコンテナ上で稼働している API Microgateway を管理するREST APIを提供し管理を行います。 </td>

  </tr>
  <tr>
    <td> API Microgateway  </td> <td>Dockerコンテナ上で稼働するAPI Gatewayそのもの。設定に従い、APIの実行をプロキシし、認証やIPチェック、流量制御を行う </td>
  </tr>
</table>

Dockerコンテナ自体は、用意していただく必要がございますが
REST API経由でAPI Microgatewayコンテナイメージの作成及び、コンテナ上への配置を自体を行うことができます。

もちろん、コンテナ上のDockerイメージを起動することで、利用可能な状態になります。
逆に、API Microgatewayを停止する場合には、Dockerイメージを停止する必要がありますので
Dockerコマンドや、コンテナを管理するGUIツールを使えるようになる必要がありますね。

## 終わりに
最後までお読みいただきありがとうございました。
今回の記事では、API Microgateway入門編として、その概念と機能の概要をお届けしました。
次回は、実践編として、API Microgatewayの構築に関して書きたいと思います。

## 参考
API Microgateway ドキュメント
https://docs.informatica.com/integration-cloud/cloud-api-manager/current-version/api-manager-guide/api-microgateway-service.html
【Unity】Editor拡張をせずに簡易ボタンを実装する方法

# 概要

今日のUnityでインスペクタ上にボタンを表示するのは何かと不便です。
Editor拡張する方法だと複数同時編集ができません。
[Odin](https://assetstore.unity.com/packages/tools/utilities/odin-inspector-and-serializer-89041?locale=ja-JP) のようなアセットは有料だったりOSSできなかったりします。
そこで、Editor拡張を利用せずコンポーネント単体でボタンを実装する方法を考えました。

# 方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307985/b13bf634-ad55-f132-6e31-4690245780b5.png)
``` [SerializeField] bool XXX ``` で出現するチェックボックス✅を [OnValidate()](https://docs.unity3d.com/ja/2018.4/ScriptReference/MonoBehaviour.OnValidate.html) で制御すると、コンポーネント単体でボタンを実現できます。

``` C#
using UnityEngine;

public class boolButton : MonoBehaviour
{
#if UNITY_EDITOR
    [SerializeField] bool _button;

    private void OnValidate()
    {
        if (_button)
        {
            _button = false;
            ButtonProcess();
        }
    }

    private void ButtonProcess()
    {
        Debug.Log("Pushed Button");
    }
#endif
}
```
【CommonLisp】マクロの再帰呼び出し

## 何これ

マクロも再帰呼び出しできるケースがあるんだよーってことを伝えるだけの記事

## ソース

```common-lisp
(defpackage :main
  (:use :cl))
(in-package :main)

(defmacro fizzbuzz (max-num &optional (num 1))
  (when (< max-num num) (return-from fizzbuzz))
  (cond
    ((zerop (mod num 15)) (format t "fizzbuzz~%"))
    ((zerop (mod num 3))  (format t "fizz~%"))
    ((zerop (mod num 5))  (format t "buzz~%"))
    (t (format t "~a~%" num)))
  `(fizzbuzz ,max-num ,(1+ num)))

(defun main ()
  (fizzbuzz 15))
```

### 出力結果

```
1
2
fizz
4
buzz
fizz
7
8
fizz
buzz
11
fizz
13
14
fizzbuzz
```

変な突っ込みが嫌なんで一応書いておきますけど、
可読性の観点などから通常のシステム開発でマクロの再帰呼び出しをすることはまずないです。
上の例だって関数でするのが普通でしょう。