OmniAICreator/Qiita-1.07M huggingface dataset:
Power Apps でデータを登録した後に通知や承認処理をしたい場合の TIPS


# はじめに

Power Apps でデータソースにデータを登録した後、通知や承認処理を行うことが良くあり、以下の二つの方法が考えられます。

① Power Apps から Power Automate を呼んで、データを登録した上で、通知や承認処理もする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/09f3450c-9760-aed3-bf9c-48483b58b33a.png)

② Power Apps でデータ ソースにデータを登録し、データが登録されたことをトリガーに Power Automate が動作して通知や承認処理をする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/512206d6-96df-6483-9f23-0acb1aa72610.png)

個人的には、慣れない方にとっては、② の方が簡単な気がします。
しかし、② を利用した場合、__メールや Teams での送信元が全てフローを作成したユーザーになってしまいます。__

例えば、以下のようなフローで休暇の連絡通知をチームの Teams のチャネルに投稿する場合、投稿者が全てフローの作成者になり、紛らわしいため、送信元をアプリ利用者自身にしたいという場合があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/859ee08e-0545-75a2-e66b-1c237fb9c34f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/ff7840d8-2213-bffb-0899-0a6f9a5e9c3e.png)

※フローの作成者が testuser002 で、休暇の連絡者が testuser001 です

この場合は ① の方法を利用するのですが、今回は、出来るだけ簡単に実現したい場合に私が良く利用する方法について説明します。　

# 実装方法

まず、今回は、以下のような SharePoint リストを利用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/df908364-ea90-2b81-2e1d-5c2be84ee0bc.png)
Power Apps でアプリを作成し、フォーム コントロールを利用し、ボタンを押した際 (`OnSelect` プロパティを利用)、`SubmitForm` を利用してデータの登録をします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/fc8fc9a7-95bb-ae38-3f14-8a859d59933b.png)
そして、フォームの `OnSuccess` プロパティにて以下のような処理を書きます。

```
'休暇申請フロー-2'.Run(FormNewRequest.LastSubmit.ID);
Notify(
    "新規申請処理が成功しました。承認されるまでしばらくお待ちください",
    NotificationType.Success
);
Navigate(ScreenTop);
ResetForm(FormNewRequest)
```

ポイントは以下の箇所です。
こちらは、該当のフォームで直前に登録したアイテムの情報を意味します。 
※SharePoint リストの場合、ID が一意な情報となるため、今回は、ID だけを Power Automate に渡します (渡す情報が少ないのは楽ですね)

```
FormNewRequest.LastSubmit.ID
```
:::note warn
フォームをリセットする前に Power Automate フローを呼びます。LastSubmit.ID の情報もリセットされてしまい、フローが正しく動作しなくなるためです。
:::

こちらの LastSubmit、以下のブログなどでも紹介されており、何かと便利です。(よく見ると私が Power Apps を触り始めるよりはるかに前の記事ですね。ありがとうございます。)

https://qiita.com/yamad365/items/e572e471a3dd2ca4d69c

Power Automate 側の実装は以下のような感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/48b80793-9cb0-66e8-793d-4d6c86ef3e25.png)
Power Apps から受け取る情報は ID だけでいいのでとても楽です。
この ID の情報を元に、SharePoint リストから直前に登録したデータを取得して動的なコンテンツとして利用できます。(上記では、ステータスを更新するため、[項目の更新] アクションを動的なコンテンツとして再利用しています)

正しく動作したようです。(タイトルのユーザー名はいらなくなりますね)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/3009f526-d336-94a2-c2fa-fb3dca0ef27e.png)
CTOになってから2年、自分もだいぶ変革したなという振り返り

こんにちは、ディップ株式会社で執行役員CTOをやっている豊濱です。

日本CTO協会では、コミュニティワーキンググループでコントリビューターをやっており、CTO協会内外にどういったレポートを発信すると魅力や楽しさが伝わるのか、を考えていく領域を担当しています。

## 自己紹介

2020年の11月にディップに入社し、そのタイミングからCTOとしてお仕事をしています。


## Qiita x 日本CTO協会共催！あなたの自己変革について語ろう！

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

### 4つのバリュー
```
- Give First / あなたの当たり前は誰かの学び
- Think Big, Start Small / 大きく考え、小さく一歩目を踏み出す
- Fail Fast, Learn Fast / 早く失敗し、早く学ぶ
- Always Day One / 常に初日の気持ちでいる
```

今回はこの4つのバリューをなぞって、自分が伝えられる・伝えたいことを書いてみようと思います！

## わたしの自己変革

###  Give First / あなたの当たり前は誰かの学び

もうなんというか、いきなり胸をザクッと刺された気持ちになりました(笑)
「こんなこと言っても当たり前すぎるよな」「そんなレベルのこと言っても恥ずかしいだけだ」って思いは正直今でもあるんですが、周りからみれば、いまや2世代ぐらい前からエンジニアやってるベテランでかつCTOなわけで、「同じ目線でそういってくれると嬉しい」「同じ気持ちだったのがわかって安心した」みたいなことも多々あるわけですよね。

CTOになってから2年経って、当然ですが相談や判断を求められる機会が飛躍的に増えました。
一方で現状維持バイアスが強かったり、セクショナリズムを感じるような提案が見えることも増えましたが、だからこそ「自分の当たり前」をしっかりと伝えて、メンバも同意してくれたなら、目的に達する登り方やスピードを一緒に考えられるようにしていきたい、と心がけています。


### Think Big, Start Small / 大きく考え、小さく一歩目を踏み出す

「やってみなはれ」の精神、とても共感します。やってみなきゃ可能性はゼロやんっていつも思います。
大きく掲げた目標に対して全然登り方なんて見えてないけど、少し踏み出したら「あれ、意外と登れるんじゃね？」ってこともありますし、想定通り急坂だったなら「このアプローチは失敗だな」とわかりますし。

自分で自分が一番変わったなーと思うのは、「やってみよう」じゃなく「やってみなはれ」になったところですね。率先して自分がやるのではなく、メンバにやってもらう。「大きく考えてもらって、小さく一歩目を踏み出してもらう」組織や環境づくりってほうにかなりシフトした印象が自分でもあります。

たまに自分がやる、ってお話すときもありますが、初手どうしたらいいか全然わからない、誰にも道筋や規模感が見えてないときみたいなときだけにしています。
これまでやってきた「自分の当たり前」を伝える手段として最適だと判断したとき、って感じですね。

自分ごとですが、振り返ると2年でここが一番成長したポイントかもなって思います。

### Fail Fast, Learn Fast / 早く失敗し、早く学ぶ

ディップはこれまで、パートナー会社に開発の協力を大きくお願いしていた経緯もあり、ウォーターフォール的な進め方が主になることが多かったんですが、社内でも内製化が進みスクラムやアジャイルという考え方を導入できる環境が揃いつつあります。

スクラムやスプリントという考え方は「早く失敗し、早く学ぶ」のに適したものですが、あくまでも「手段」であって、

- 導入すれば効率があがる・工期が減るもんではない
- 短期で振り返りながら作るからスケジュールは伸びるかもしれない
- ただその結果「顧客が本当に求めていたもの」に近づけられるなら価値はある

というものだと捉えています。
という「当たり前」のことを直接自分が伝えるのではなく、例えばスクラムマスターとして「一歩を踏み出す」人を育成する計画や環境を用意したりしてます。時間はかかりますがきっと2年後を見据えるといい結果がうまれると考えています。


### Always Day One / 常に初日の気持ちでいる

人間はだれしも目の前のこと、いま取り組んでいることに意識を持っていかれる仕様になっているので、常に初日の気持ちでいる、というのはわかっていても簡単なことじゃないなと感じています。

気をつけていること……になるのかわかりませんが、自分が意識していることは「これまでの成果や経験にすがらない」になるでしょうか。

自分は「一生エンジニアとして生きていきたい」と常々思っていますが、とはいえ、一言で「エンジニア」と言っても20年前と今じゃやってることは全然違います。
より巨大になり、スピードが早くなって、複雑で細分化されたインターネット/Webのなかで「エンジニア」と呼ばれ続けるように活動する、あるいはインターネットの次の世界がきたときにもエンジニアと定義され続けるためには、常に学び、経験し、進化しなきゃいけないなと思っています。

これまでの経験を「活かす」のはとても大事ですが、「すがる」といい結果を産まないし、今後の自分のためにもならないなと思うようにしてます。


## まとめ

一通り書いてみて、この4つのバリューはCTOだけじゃなく、仕事をする上でとても大事な要素が表されているな、と感じています。それだけに至らない自分というものも見えてきてちょっと胸が痛いところもありますが、でもそれこそが `Fail Fast, Learn Fast` だったりするよな、とも思ったり。

どういう立場だろうが、みなさんと同じように日々悩んで試行錯誤しているのが伝わればいいなーと思っています。

ありがとうございました！良いお年をお迎えください！
【VS Code】よく使うショートカット+覚えたいショートカットでチートシートを作った

## これは何

私がVS Codeでよく使うショートカットキーとこれから覚えたいショートカットキーを集めてチートシートを作成してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577501/82caccca-a4db-26e0-dfe5-40fd168068fe.png)

### 基本操作

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577501/07ee8078-137c-3458-a984-75f045b507a8.png" />


### 編集

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577501/5a4bd4ec-a269-2e19-a67f-2a920ed46a37.png" />

### 移動

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577501/2a073b75-ada7-dd20-2009-e6da08a78674.png" />

### 選択

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577501/cd146ccd-83a7-6471-72fb-96dd5cac9f77.png" />

### 表示

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577501/159ab329-6741-79ac-ccef-660c5025761c.png" />

### 検索

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577501/147f6b33-a570-a97d-f397-3fd7fdd690b3.png" />

### 設定（そのほか）

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577501/b9c40dc0-f5cc-330f-b87b-ed4d93d8623b.png" />


## チートシートをカスタマイズする

このチートシートはFigmaで作成しているので、ご自由にFileをDowlnloadしてカスタマイズしていただけます！
ぜひ自分だけのチートシートを作成してご活用ください。

https://www.figma.com/community/file/1186615910107884023

こんな感じでキーをVariantsにして作ってます。
もちろんVS Code以外のショートカットチートシートにも使えます :)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577501/b171e87a-195d-019e-37d5-2ee815bead41.png)


## 参照

https://code.visualstudio.com/docs/getstarted/keybindings
STM32G071でSPIで遊ぶ


x 74hc164応用の表示装置　説明省略


目的
SPIのテスト
74hc164にクロックとデータを送る

![o_cop258.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/68a82183-5e3b-54b9-3570-2bae75e36a69.jpeg)



```c++



#include <SPI.h>


#define DW    digitalWrite

//#define s60() for(ii=0;ii<60;ii++)delay(1000);
#define s60() delay(1000);

void setup() {
  
  int ii; //ループカウンター
  
  // SPIの初期化
  SPI.begin(); // 11 12 13
  DW(SS, LOW); // 10
  SPI.setDataMode(SPI_MODE0);
  SPI.setBitOrder(MSBFIRST);
  SPI.setClockDivider(SPI_CLOCK_DIV8);  // 2Mhz
  
  //0
  SPI.transfer(0x00);DW(SS,HIGH);DW(SS,LOW);
  s60();
  
  //1
  SPI.transfer(0x55);DW(SS,HIGH);DW(SS,LOW);
  s60();
  
  //2
  SPI.transfer(0xaa);DW(SS,HIGH);DW(SS,LOW);
  s60();
  
  //3
  SPI.transfer(0xff);DW(SS,HIGH);DW(SS,LOW);
  
} //setup

void loop() {
} //loop




```
必見！AIの自動生成はここまで来た！Creative Reality Studio！！

```
イスラエルのスタートアップ企業D-IDは現地時間12月13日、AIによって顔や文章を自動生成し、
その顔をアニメーションとして動かしながら119言語でテキストを読み上げるコンテンツを含む、
ビデオプラットフォーム「Creative Reality Studio」を発表した。
```

#  登録してみる
https://ledge.ai/did-ai/
早速チェックしてみました。

https://www.d-id.com/creative-reality-studio/
![スクリーンショット 2022-12-21 7.29.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/2b7ad399-ecb6-8d18-950e-01f68edc376e.png)

登録すると、
![スクリーンショット 2022-12-21 7.29.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/f08d435d-0ac2-d4ab-47e8-54c4386df059.png)

声の種類を選択できる
![スクリーンショット 2022-12-21 7.29.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/890bee58-c5c6-9ceb-5836-453d01ead7f0.png)
![スクリーンショット 2022-12-21 7.30.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/08cb0d79-7b51-d376-cb4c-e4d1ca1e5423.png)

言語を日本語にして、アジア人っぽい人を選択
![スクリーンショット 2022-12-21 7.31.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/4e24dd51-8c4b-62c1-2b5a-ad8d05895190.png)

![スクリーンショット 2022-12-21 7.32.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/b60bafbc-4eba-727a-619e-554151a319ac.png)

# 動画確認
出来上がった動画がこちら

https://studio.d-id.com/share?id=ec01202f5ba0637e9d0c12fbb335f031&utm_source=copy

凄すぎますね。

# youtubeへ
動画をダウンロードして、youtubeにもアップできました。

https://youtube.com/shorts/M87m6utEaxA?feature=share

これなら今後タレント、司会者等の仕事はなくなってしまう可能性もあります。

# テクノロジー
```
D-ID独自のジェネレーティブAI技術とOpen AIの「GPT-3」、Stability AIIの「Stable Diffusion」を統合した
```
との事です。「GPT-3」、「Stable Diffusion」の衝撃は止まりません
ひき続き記事を書いていきますので、フォロー、イイねお願いします！
mutable immutableとはなんぞや

## 補足
内容が間違っていれば教えていただけると嬉しいです(書き直しました)🙇‍♂️

## immutable とは
オブジェクトが生成された後は状態を変更できないオブジェクト
文字列や数値が当てはまる

```javascript=
var str = 'string'
str = str + 'string'
```
1行目のstrと2行目のstrは指しているメモリブロックが違う
2行目のstrが1行目のstrのメモリブロックを指すことはできない(=状態を変更できない?)

## mutable とは
オベジェクトが生成された後に状態を変更することができるオブジェクト
配列やオブジェクトが当てはまる

```javascript=
var array = [8, 8, 8]
var array_copy = array
array_copy.push(0)
// array -> [8, 8, 8, 0]
// array_copy -> [8, 8, 8, 0]
```

arrayとarray_copyは同じメモリブロックを指している(=状態を変更できる?)
arrayに破壊的なメソッド(pushなど)を実行するとarray_copyも変わってしまう

array(array_copy)だけを変更したいときは新しい配列をスプレッド構文や`concat`を使って生成する

## 余談
```javascript=
var foo = [8, 8, 8]
var bar = foo.push(0)
console.log(Object.is(foo, bar)) // true
```
ReactのuseStateが`Object.is`を利用して変更を検出しているため、
上記(push)のように配列を変えると再描画が走らない
→fooとbarは同じメモリブロックを参照しているので値は同じ

## 参考文献
https://developer.mozilla.org/ja/docs/Glossary/Mutable
Power Apps で Patch 関数を利用した際の成功やエラーメッセージ表示

# はじめに

Power Apps でデータソースにデータの登録を行う際、データの登録処理が成功したか失敗したかによってメッセージを変えたり後続処理を書きたい場合があると思います。

フォーム コントロールを利用する場合は、フォームの `OnSuccess`、`OnFailure` プロパティに処理を記述するのが一般的と思いますが、今回は、Patch 関数を利用する場合における方法を紹介します。

# 実装方法

今回は、こちらのイベントで紹介したアプリカタログのソースを元に説明します。

https://msevents.microsoft.com/event?id=1370628291

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/05fff7e8-930e-f452-acc1-5323cf78030a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/87951871-a33b-98e6-6840-a304b630a142.png)

:::note
本筋とは異なりますが、こんな感じで、Power Apps で作成されたアプリやそのソースをカタログ化しておくと、アプリが見つけやすくなる、アプリへの到達が容易になる、同じようなアプリを一から作成しなくて済むなどのメリットがあります
:::

こちらのアプリのデータ登録処理では、以下のような感じでデータ登録をしています。

```
Patch(
        アプリカタログ,
        Defaults(アプリカタログ),
        {
            new_environmentid: cmbEnvironment_1.Selected.name,
            new_appid: txtAppId.Text,
            new_appname: txtAppName.Text,
            new_ismanualregister: true,
            new_applink: txtAppLink.Text,
            new_appdescription: txtAppDescription.Text,
            new_creatername: txtAppCreater.Text,
            new_createrdepartment: txtAppCreaterDepartment.Text,
            new_createrupn: txtAppCreaterUPN.Text,
            new_createdate: dteAppCreatedDate.SelectedDate,
            new_appsource: txtAppSourceLink_1.Text,
            new_isshareonlyappsource: tglIsShareOnlyAppSource.Value,
            new_addteamscount: 0,
            new_downloadcount: 0
        }
    );

If(
     // エラー判定
    !IsEmpty(Errors(アプリカタログ)),
     // エラーメッセージ
    Notify(
        Concat(
            Errors(アプリカタログ),
            Column & ": " & Message
        ),
        NotificationType.Error
    ),
     // 成功メッセージ
    Notify(
        "アプリカタログへの登録処理が成功しました",
        NotificationType.Success
    );
);
```

ポイントは、Errors 関数を利用するところです。Errors 関数についてはこちらを参考になさってください。

https://learn.microsoft.com/en-us/power-platform/power-fx/reference/function-errors
CTO興味ある人へ：CTOの業務についてその１０　アジリティチェック

CTOを長年やってるとよく聞かれる質問です。
```
CTOの仕事ってどんな仕事があるんですか？
```
から始まった**CTOの業務について**のその10です。

# アジリティチェック
VUCA時代に向けて、組織のアジリティについてCTOが定期的なチェックを行い、必要であれば見直しを行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/99c34229-fde0-e22e-92c6-a3550f1573e4.png)

## １．バイモーダルIT整理
IT調査会社のガートナーが2015年に提唱した考え方です。

「モード1」：コスト削減や効率化を重視するSystem of Record（SoR）
「モード2」：柔軟性や俊敏性が求められるSystem of Engagement（SoE）
の認識あわせ

モード１を守り、モード２を攻めと定義して、社内のプロジェクトをどちらかに整理する
アジリティのためにはモード１を減らし、モード２を増やす

## ２．アジャイル開発プロセス導入
アジャイル開発と言いながら、中身がウォーターフォール型の開発プロセスのままのプロジェクトも多い。アジャイル開発のためのプロセスが導入されているかをチェックし、機能しているか確認する。
＊イテレーション開発,カンバン,scrum,OKR,ウィンセッション等

## ３．Time and Cost の固定化
開発における指標としてScope, Time and Costがあるが、アジャイル開発ではTimeとCostを固定する事でAgilityが向上します。
TimeとCostを固定するには、工数見積もり型でなく、予算を決めて開発人数を確定し、固定人員の中で出来る範囲を検討します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/e53e52fb-bdf3-524c-4901-1dcdba69b5d9.png)
## ４．Agilityの高い人材登用
一人で自立できる人材でないとAgilityの高い組織になりません。
・ソースコード（言語）
・フロント、バックエンド開発
・インフラ（ミドル、OS、ネットワーク、DB)
・クラウド（AWS、GCP，Azure）
幅広い知識をもって一人でシステム構築を完結できる人材を増やすために評価、育成、採用を行う。


# まとめ
組織のアジリティについては、あまり気にしてない方が多そうに思いますが、人間は気がついたら保守的になる生き物でもあるし、長い期間サービス運用を行っていると、アジリティが落ちている可能性があります。
CTOが定期的なチェックを行い、必要であれば見直しを行います。

ひき続き記事を書いていきますので、フォロー、イイねお願いします！

# シリーズ記事まとめ
CTO興味ある人へ：CTOの業務についてその１　会社組織内での話
https://qiita.com/k1morikawa@github/items/5e9022a99a51d9a57576
CTO興味ある人へ：CTOの業務についてその２　チームビルディング/採用
https://qiita.com/k1morikawa@github/items/b2b3fb2246bd0984bab1
CTO興味ある人へ：CTOの業務についてその３　チームビルディング/評価制度
https://qiita.com/k1morikawa@github/items/edb2e3c20ce02a201eec
CTO興味ある人へ：CTOの業務についてその４　チームビルディング/キャリア戦略
https://qiita.com/k1morikawa@github/items/9a6573dbba510c699362
CTO興味ある人へ：CTOの業務についてその５　チームビルディングまとめ
https://qiita.com/k1morikawa@github/items/7a4c9163a69cd9303e90
CTO興味ある人へ：CTOの業務についてその６　組織設計
https://qiita.com/k1morikawa@github/items/0b59893da6ecbb886a64
CTO興味ある人へ：CTOの業務についてその７　技術力アップ
https://qiita.com/k1morikawa@github/items/fa50105d0e6af34a9961
CTO興味ある人へ：CTOの業務についてその８　セキュリティ管理
https://qiita.com/k1morikawa@github/items/a4d773ac12b4c4c745a5
CTO興味ある人へ：CTOの業務についてその９　システムチェック
https://qiita.com/k1morikawa@github/items/e2c1b5d3e16c88d2f250
フォント について知らなかったこと

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


「游」、知らないフォントだったのだが何かと主張してきていたのでこれを使ってる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/902423a7-d977-8d03-b592-b6407228df40.png)
引用: http://www.jiyu-kobo.co.jp/os-installed-y/


[游書体 - Wikipedia](https://ja.wikipedia.org/wiki/%E6%B8%B8%E6%9B%B8%E4%BD%93)
[游ゴシック体 B | 書体見本 | モリサワのフォント | 株式会社モリサワ](https://www.morisawa.co.jp/fonts/specimen/5186)

> 游ゴシック体の特徴
「游ゴシック体」は、長文でも読みやすいスタンダードなゴシック体ファミリーです。 字面を小さめに設計し文字間にゆとりを持たせることで、小サイズで組んでも文字同士が干渉せず、一字一字の識別性に優れた、読みやすい組版を実現します。「游ゴシック体」は7つのウエイトで構成され、キャプション・本文から小見出し・大見出しまで幅広い用途に対応します。

[Office 2016の既定のフォントは、なぜ游明朝や游ゴシックなのですか - Microsoft コミュニティ](https://answers.microsoft.com/ja-jp/msoffice/forum/all/office/950bffba-4bc5-45a6-ae14-f6909b7099fd)

> 游明朝、游ゴシックは Windows 8.1 から追加され、Office 2016 では既定のフォントとして採用されました。
> 理由は分かりませんが、高解像の PC 環境を入手しやすくなったことや、Mac で採用されているフォント比べ Windows の従来のフォントは見劣りすることなどが関係して、標準フォントを変更したのではないかと思います。
> フォントに関しては、人によって好みが分れるので何とも言えませんが、フォントによって改行するポイント数が変わることや、長年慣れ親しんだフォントの変更に抵抗を感じる人も少なくないようですね。

[ふざけたブログのフォントに「游ゴシック」は合わないので「メイリオ」に変更したら、ギャグセンスが高まった | oh!nigiri](https://ohnigiri.com/meiryo/)
色々あるようだ...。

https://coliss.com/articles/freebies/japanese-free-fonts-dec-2022.html

既定のフォントを変更する方法はこちら
 [Office の既定のフォントを変更する方法 | Japan Office Client Support Blog](https://officesupportjp.github.io/blog/cl0m75alf001rmcvses4a67bp/)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/f2d80e3d-a64f-bacb-08e3-f88c68cc6cc0.png) 
:santa:
体調管理と個人開発

# 0. 
　個人開発のリソースは自分しかいない。自分がくだばれば、プロジェクトのあれやこれやがすべてダメになってしまう。個人の活動のため、社会にそれほど影響は与えない。それでも、自分の人生とか理念とかを突き詰めていくと、個人開発はやっぱり重要なのではと思ってしまう。

　30代に突入してから体調に気を使うようになった。無理がきなかくなってきたのだ。いままではゲージの0-100のうち、20-80を狙えば問題ないレベルだった。これは意識しなくてもできる。しかし最近はその狙えばいい部分がすり減ってきてて、40-60とかそのあたりになってきている。意識しないといけない。

　酒はいつの間にか飲まなくなった。飲んだら楽しいが、日常の一コマとしての飲酒が消えた。年末年始とかイベントの時は飲む。代わりにコーヒーがあるので、楽しくやっている。

　睡眠は意識してとらないといけない。睡眠不足気味なので、昼休みに少し昼寝をする。効果的な睡眠を取れるようにしたい。

　残業も意識する。「おれは残業をしているんだ」という意識。定時後はどうしてもパフォーマンスが落ちるので、持ち越しても問題ないのは明日やる。ほんとうにやばかったら他人に頼る。私は夜勤の人に対応を依頼していたりする。

　そしてなによりヤクルト1000だ。これはすごい。まじで効果ある。飲めば健康になるというものではないが、体を持ち堪えさせる能力がある。いつだったか、一週間ほどヤクルト1000を飲まなかったら風邪をひいた。毎日摂取する必要はないが、週2くらいはやっている。コンビニにあるタイミングで買っている。

# 1.

　一回体調を崩したら、元に戻すまで一週間くらいかかる。本当に人生の損をしている気分になるので体調は早めにケアするのをこころがけたい。

　皆は体調管理で気をつけることはあるだろうか。
DeepComposer使ってみる 2

DeepComposerは以前触ってみたんですが、新たにCNN（畳み込みニューラルネットワーク）を利用した学習モデルを選択できるようになったとの事ですので、改めてさわってみようと思います。

前回記事
DeepComposer触ってみる
https://qiita.com/zenden/items/5e010152664521627c72

### ■CNN（畳み込みニューラルネットワーク）とは

>畳み込みニューラルネットワーク (Convolutional Neural Network) とは、周辺のニューロンの特徴をまとめて抽出するニューラルネットワークです。

なるほど（？）

### ■とにかく実際に使ってみる
時期的にちょうど良いので、曲のサンプルは「we wish you a merry christmas」を選択しました。

デフォルトの状態ではこんな感じ。

https://twitter.com/ABC47696092/status/1605306593851342848?s=20&t=xStKEzY2aPi2k-nN4DJRWA

今回新要素のCNNを触る画面がこちらです。

![NEW_Screenshot 2022-12-21_03-00-15-679.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954355/8cacd305-f557-35c6-18cf-b149f6cf9148.png)

画面下部に表示されていますが、項目は以下四つを調整する事ができます。

##### ・調整できる項目
Maximum input notes to remove
Maximum notes to add
Sampling iterations
Creative risk

##### ・それぞれ項目の意味ですが、以下と理解しました。
Maximum input notes to remove
→最大でどれくらい音符を削るか
Maximum notes to add
→最大どれくらい音符を増やすか
Sampling iterations
→反復の回数
Creative risk
→よりクリエイティブなアレンジにする

### ■CNNを試す
まずはデフォルトのALL100でやってみます

https://twitter.com/ABC47696092/status/1605308645050572800?s=20&t=xStKEzY2aPi2k-nN4DJRWA

伴奏っぽくなりましたが、綺麗にアレンジされてますね。
前回は不協和音だらけだったイメージがあったので驚きでした。

次にremoveとaddの数字を50に変更してみました…が、結果をみてみた所、ほとんど変化がなかったので割愛します。
（このサンプルだからでしょうか…？）

最後にCreative riskを6に変更してみました。

https://twitter.com/ABC47696092/status/1605308930758152192?s=20&t=xStKEzY2aPi2k-nN4DJRWA

これが一番面白い変化をしました！
リズムのアレンジが多いので、変化がわかりやすいです。

### ■伴奏いれてみる

せっかくなのでこれら生成したmidiを分解してそれっぽくしてみました。
和音がかなり多かったので低い帯域はベースに任せる等ですね。

https://twitter.com/ABC47696092/status/1605309236959121408?s=20&t=xStKEzY2aPi2k-nN4DJRWA

### ■最後に
とても進化を感じる内容でした！
今後もアップデートが楽しみです。また数年後にやります！
Pythonでクリップボードにファイルをコピーする方法 (Windows)

:::note warn
**Windowsのみで動作します
PythonからC# .NETを呼び出しているだけなので速度が若干遅いです**
:::


## 筆者の環境
**OS: Windows 11 Pro 22H2 22621.963
Python: 3.10.6**


## 事前準備
**PythonからC# .NETを呼び出すためにpythonnetをインストールします**
```
pip3 install pythonnet
```


## 実際に書いていく
**pythonnetのclrをインポートします**
```python:main.py
import clr
```

**.NETから必要なクラスを呼び出すための準備をします**
> .NETのクラスをインポートするには先にclr.AddReference()でネームスペースを参照に追加しておく必要があります
```python:main.py
clr.AddReference('System.Collections.Specialized')
clr.AddReference('System.Windows.Forms')
from System.Collections.Specialized import StringCollection
from System.Windows.Forms import Clipboard
```

**ファイルパスを格納していくためのStringCollectionを作成します**
```python:main.py
files = StringCollection()
```

**StringCollectionにコピーしたいファイルのパスを追加します**
StringCollectionはPythonで言うところのリスト(文字列専用)みたいな物なので複数個追加することもできます
```python:main.py
file_path = 'C:\\Users\\Rilm2525\\Desktop\\test.exe'
files.Add(file_path)
```

**Clipboard.SetFileDropList()にfilesを入れ実行するとWindowsのクリップボードにファイルがコピーされます**
```python:main.py
Clipboard.SetFileDropList(files)
```

## まとめ
```python:main.py
#インポート、参照
import clr
clr.AddReference('System.Collections.Specialized')
clr.AddReference('System.Windows.Forms')
from System.Collections.Specialized import StringCollection
from System.Windows.Forms import Clipboard

#コピーするファイルパスを設定
file_path = 'C:\\Users\\Rilm2525\\Desktop\\test.exe'

#.NETのStringCollectionを作成し、file_pathを追加する(Addを繰り返すことによって複数個追加できる)
files = StringCollection()
files.Add(file_path)

#先程作成したファイルのリストをクリップボードにセットする
Clipboard.SetFileDropList(files)
```


初めての投稿してみた!!
~~ Detection って紛らわしくない？

1.はじめに
---

英語で「異常検知（Anomaly Detection）」に関する論文を探していると，「外れ値検知（Outlier Detection）」，「新規性検知(Novelty Detection）」，「分布外検知（Out-of Disbution）」，「1クラス分類（One-class Classification）」などのワードが出てくる．これらのワードは意味が似ていてニュアンスが紛らわしくなりがちである．
今回はこれらのワードの紛らわしさを解消するためにそれぞれの意味を簡単にまとめる．

2.異常検知（Anomaly Detection）
---
正常なサンプルの分布以外の分布から抽出されたサンプルを検知する．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633178/027f8088-f5c9-db54-8cbd-1338563117e1.png)
何を正常として何を異常とするかによってさまざまな問題設定が考えられる．
以下の3~6で説明する項目も，捉え方によっては異常検知であるといえる．
（なんなら上の図は新規性検出，分布外検出，1クラス分類のどの言葉でも表現できる）


3.外れ値検知（Outlier Detection）
---
正常なサンプルの分布から低確率で抽出されるサンプルを検知する．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633178/c2e014ce-2107-f23e-5359-d09202a4e678.png)


4.新規性検知（Novelty Detection）
---
訓練データに含まれるサンプルの分布以外の分布から抽出されたサンプルを検知する．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633178/fab6824e-8285-5dca-618a-8323c2fd8dda.png)


5.分布外検知（Out-of Distribution Detection）
---
訓練データのどのクラスにも属さないサンプルを検知する．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633178/6fbfccf2-8981-6e82-6518-6578e558e564.png)


6.1クラス分類（One-class Classification）
---
分布外検出における訓練データを，1つのクラスとした場合．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633178/9eba6603-5e09-b735-c643-d3f4e8e16f0c.png)


7.まとめ
---
それぞれの言葉の意味を考えてみると，実はやっていることは同じで言葉の使い方が違うだけというケースが多そうだということが言える．
また，この中のワードでは異常検知が一番大雑把な意味合いで使われ，その他のワード（外れ値検知，新規性検知，分布外検知，1クラス分類）を包含しているともとらえられるだろう．
論文を探すとき，読むときにこれらのワードを見つけたら，著者がどのような設定を示そうとしているのか意識しながら読もう．



※本記事の内容に誤りや不適切な点がありましたら，お知らせいただけると幸いです．
2022/12/21主にITとかセキュリティの記事

日野市立図書館、一部機器でランサム感染 - 通常どおり開館
https://www.security-next.com/142367

海外子会社がランサム被害、休日返上100人体制で復旧 - 加賀電子
https://www.security-next.com/142181

年末年始に向けてセキュリティ体制のチェックを
https://www.security-next.com/142349

Fortinet、EOLの「FortiOS 6.0」系にもアップデートを用意
https://www.security-next.com/142354

登録セキスぺ試験、午後試験を見直して60分短縮
https://www.security-next.com/142369

サイト侵害、異常なアクセス数きっかけに発覚 - フルノシステムズ
https://www.security-next.com/142365

AIを使ったサイバー攻撃やクラウド環境への攻撃が増加する--ウィズセキュア2023年予測(12/19)
https://japan.zdnet.com/article/35197518/

3つのセキュリティ課題を抱える国内製造業、「OTゼロトラスト」が解決の道に(12/19)
https://monoist.itmedia.co.jp/mn/articles/2212/19/news008.html

パスワードの使い回しに注意！！安全な条件を満たした設定の徹底を(12/19)
https://www.risktaisaku.com/articles/-/75018

サイバー攻撃の脅威深刻化(12/19)
https://jp.reuters.com/article/idJP2022121901001051

デジタル時代に向けて、セキュアなネットワークアーキテクチャーに移行せよ(12/19)
https://active.nikkeibp.co.jp/atcl/act/19/00317/121200014/

日本の個人データの保護の意識は？タレスが消費者デジタル信頼指数を発表(12/19)
https://paymentnavi.com/paymentnews/125844.html

ロジスティック回帰分析とは？特徴や活用シーンを解説(12/19)
https://aismiley.co.jp/ai_news/logistic-regression/

「Microsoft Edge」にセキュリティアップデート ～解放後メモリ利用の欠陥5件に対処(12/19)
https://forest.watch.impress.co.jp/docs/news/1464652.html

「Log4j」脆弱性発見から1年　OSSセキュリティの努力は続く(12/19)
https://cloud.watch.impress.co.jp/docs/column/infostand/1464698.html

SVG画像を悪用したHTMLスマグリング攻撃が発見される(12/18)
https://news.mynavi.jp/techplus/article/20221218-2539543/

14万の悪意のあるパッケージがNuGet・NPM・PyPiに、開発者はリストの確認を(12/18)
https://news.mynavi.jp/techplus/article/20221218-2539545/

Googleの無料オープンソース脆弱性スキャンツール「OSV-Scanner」の実力とは？(12/19)
https://atmarkit.itmedia.co.jp/ait/articles/2212/19/news036.html

カード型コールドウォレットのパイオニアである CoolBitX、Web3 と繋ぐホットウォレット「CoolWallet HOT」を公開(12/19)
https://prtimes.jp/main/html/rd/p/000000002.000093385.html

macOS 13.0.1 Ventura以下でroot権限を取得できるPoC「macOS Dirty Cow」が公開される。(12/19)
https://applech2.com/archives/20221219-macos-dirty-cow-for-macos-13-ventura.html

カスペルスキー　TOP対談　「透明性」の取り組みに注力し　サイバー犯罪撲滅でリーダーシップを発揮(12/19)
https://www.weeklybcn.com/journal/issue/detail/20221219_195634.html

1人1台端末で学ぶ情報通信ネットワークの仕組み(12/19)
https://www.kyoiku-press.com/post-251941/

日本生命が基幹システムをハイブリッドクラウドに移行、IBM Cloud採用(12/20)
https://xtech.nikkei.com/atcl/nxt/news/18/14347/

デジタル土台に日韓のシナジー発揮へ　たこつぼ組織打破へ摩擦もいとわず(12/20)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600001/121200126/

世界で進む量子インターネット開発、日本はメルカリ主導のQITFで産学連携(12/20)
https://xtech.nikkei.com/atcl/nxt/column/18/00001/07488/

子会社でランサムウエア被害の加賀電子、拠点データを使って10日ほどでほぼ復旧(12/20)
https://xtech.nikkei.com/atcl/nxt/column/18/00598/070100195/

エンドユーザー視点がDXの価値を生む(12/20)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/121200331/121200001/

経営層・上司はITに好奇心を抱け(12/20)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/121200331/121200002/

社長から社員までみんなで学ぼう(12/20)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/121200331/121200003/

百貨店らしいOMOを模索　ITパスポートを全社員に(12/20)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600003/120900063/

「AI科学者」がデタラメなリポート執筆　SNSで炎上、2日でデモ公開を中断(12/20)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600011/121200122/
欠測データのメカニズムとモデル

# はじめに
欠測メカニズムと欠測データ解析のモデルについてのメモ書き。

# 欠測メカニズム
データの欠測の生じ方は
- 記入漏れや無回答
- 打ち切りや切断
- 脱落や摩耗
- 数値の丸め込み
- 連続値の離散値化

などがある。これらの欠測が生じたメカニズムを、一般的に次の3通りに分けて考える。

### 1. 完全にランダムな欠測(MCAR: Missing Completely At Random)
欠測するかどうかはモデリングに用いる変数には依存しない。
欠測しているデータがある行を除去して分析しても偏りは発生しない。

### 2. ランダムな欠測(MAR: Missing At Random)
欠測するかどうかは、欠測値には依存せずに観測値に依存する
欠測しているデータがある行を除去して分析すると偏りは生じるが、多重代入法を用いることで偏りのない推定が可能。

### 3. ランダムでない欠測(NMAR: Not Missing At Random)
欠測するかどうかは欠測値そのものの値や観測していない他の変数にも依存する
偏りのない推定を行うには特殊なモデリングが必要。


# 欠測データの解析モデル
関心のある変数を$y$とする。

欠測データを解析するにあたって、次の2つ
- 完全データ（観測データと欠測データを合わせたデータ）のベクトル$\boldsymbol{y}$
- 欠損するかしないかを表す変数$m$のベクトル$\boldsymbol{m}$
 
の同時分布$p(\boldsymbol{y}, \boldsymbol{m})$を下記で紹介するモデルを仮定して考える。

### 1. 選択モデル(selection model)
同時分布$p(\boldsymbol{y}, \boldsymbol{m})$が「$\boldsymbol{y}$の周辺分布」と「$\boldsymbol{y}$を条件付けた欠測するかしないかを表す変数のベクトル$\boldsymbol{m}$」の積で表されるモデル。
```math
p(\boldsymbol{y}, \boldsymbol{m}|\boldsymbol{\theta}, \boldsymbol{\phi}) = p(\boldsymbol{y}|\boldsymbol{\theta})p(\boldsymbol{m}|\boldsymbol{y}, \boldsymbol{\phi})
```
$\boldsymbol{\theta}$と$\boldsymbol{\phi}$はパラメータのベクトル。

### 2. パターン混合モデル(pattern mixture model)
同時分布$p(\boldsymbol{y}, \boldsymbol{m})$が「欠測を表す変数のベクトル$\boldsymbol{m}$で条件付けた$\boldsymbol{y}$の分布」と「欠測の比率」の積で表されるモデル。
```math
p(\boldsymbol{y}, \boldsymbol{m}|\boldsymbol{\xi}, \boldsymbol{\omega}) = p(\boldsymbol{y}|\boldsymbol{m}, \boldsymbol{\xi})p(\boldsymbol{m}|\boldsymbol{\omega})
```
$\boldsymbol{\xi}$と$\boldsymbol{\omega}$はパラメータのベクトル。

### 3. 共有パラメータモデル(shared parameter model)
パターン混合モデルについて、対象ごとに値の異なる変量効果$\boldsymbol{\beta}$を与えたときに$\boldsymbol{y}$と$\boldsymbol{m}$が条件付き独立となるモデル。
```math
p(\boldsymbol{y}, \boldsymbol{m}|\boldsymbol{\xi}, \boldsymbol{\omega}, \boldsymbol{\beta}) = p(\boldsymbol{y}|\boldsymbol{\beta}, \boldsymbol{\xi})p(\boldsymbol{m}|\boldsymbol{\beta}, \boldsymbol{\omega})
```
$\boldsymbol{\beta}$はパラメータのベクトル。


# おわりに
最後まで読んでいただきありがとうございました。

zennにて「Python×データ分析」をメインテーマに記事を執筆しているので、ご一読いただけますと幸いです。

https://zenn.dev/s1ok69oo 

また、過去にLTや勉強会で発表した資料が下記リンクにてまとめてありますので、こちらもぜひご一読くださいませ。

https://speakerdeck.com/s1ok69oo


# 参考文献
- 高橋(2022)「統計的因果推論の理論と実装」共立出版
- 星野(2009)「調査観察データの統計科学」岩波書店
Cocos Creator 3.6.1のXRでマルチバースに近づく

![rectangle_large_type_2_abc0bcfb77ea32f0ceac0780a348036e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852397/3ae29500-e3b1-0a78-7385-f41937e992cd.png)
[Cocos Creator 3.6.1をCocos Dashboardからダウンロード](https://www.cocos.com/en/creator/download)

3.6をリリースして、たくさんの素晴らしい反響をいただいたのが昨日のことのように感じます。それ以来、このエンジンからたくさんの素晴らしい新プロジェクトが生まれましたが、その喜びが、私たちが前進していく上での原動力の一つとなっています。

過去のマイナーアップデートでは、小規模なものやバグのアップデートがいくつかありました。しかし今回、開発者の皆さんには単純なアップデート以上のものを見ていただけるのではないかと思います。**Cocos Creator XR**というエンジンが追加されたのです。

[開発者向けノートについて詳しくは、フォーラムへの投稿をご覧ください。](https://discuss.cocos2d-x.org/t/cocos-creator-3-6-1-released/57226)
# Cocos Creator XR
メタバースという概念の台頭により、XRは現実と仮想の架け橋と見なされ、再び広く注目と議論を集めています。IDCが発表した最新データによると、2021年のXR機器の世界出荷台数は、歴史的に見ても1,000万台を突破しています。同時に、Tencent、ByteDance、Meta、Microsoftなどの企業が参入してXR産業は発展してきましたが、今後のさらなる展開が期待されます。

今回のCocos creatorでは、XRコンテンツの効率的な開発を支援するCocos Creator XRを追加し、開発者がメタバースを開発する際に便利なテンプレートやツールを複数提供します。

**XRとは、新世代のハードウェアデバイスを中核とし、新しいインタラクション手法をメディアとした、没入感の高いリアルとバーチャルの融合したデジタル環境を指します。AR、VR、MRなどの技術の総称です。** ネットワーク環境、ハードウェア性能の継続的な向上、ユーザーへの認知向上により、コンシューマー側、産業側のXR技術の商用化の道筋が明らかになりつつあります。

Cocos Creator XRはまだベータ版ですが、Cocos Creator 3.6.1でテストが可能になります。これに関する問題は、フォーラムやDiscordで共有し、作業の改善に役立てることをお勧めします。

# その他の主要項目
- iOSプラットフォームでテキストシャドウ、イタリックをサポート

- Windows で *.wav オーディオが正しく再生可能に

- tif、tiff形式の画像に対応

- ネイティブ・プラットフォームで画像データを保存する機能を追加

[Cocos Creator 3.6.1をCocos Dashboardからダウンロード](https://www.cocos.com/en/creator/download)

[引用元](https://www.cocos.com/en/we-get-closer-to-the-multiverse-with-xr-in-cocos-creator-3-6-1)
CloudflareのWorkersについて

# はじめに

DomainのDNSレコードを管理とCDNサービスとしてCloudflareを使い始めました。便利、早いそして無料プランがあるのはCloudflareに関して印象です。今回に新規サービス：CloudflareWorkersを紹介します。

> Document: https://workers.cloudflare.com/

# CloudflareWorkersとは

CloudflareWorkersではServerlessな実行環境でJavaScriptのコードを実行することができます。デプロイしたコードはある特定の場所にあるデータセンターのサーバに保存されるのではなく世界中に分散するCDNのエッジにデプロイされるため世界中のどこからアクセスしても高速に応答することができます

# CloudWorkerの無料プラン

![Screenshot 2022-12-20 230527.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2991082/ea533387-2f1d-4a9a-de95-17f303f6bd24.png)

無料プランを見ると小さいサービスについては十分です。

# CloudflareWorkersで出来ること

- JavaScriptのコードをデプロイするだけで、サーバーサイド機能が構築できる
- 負荷に応じて自動的にスケーリングされ、常に安定して処理される
- 常時起動されているわけではなく、呼び出しに応じて起動される
- 使用量に応じた従量課金ではあるが、ある程度までは無料で使える

活用の仕方次第で色々出来ることでしょう。\
CloudflareWorkersの活用方法は、公式サイトにてexamplesがあるので紹介します。\

> Example: https://developers.cloudflare.com/workers/examples/

## Return JSON

```
addEventListener('fetch', event => {
  const data = {
    name: 'クイ・ホアン',
    company: 'リンクバル'
  };

  const json = JSON.stringify(data, null, 2);

  return event.respondWith(
    new Response(json, {
      headers: {
        'content-type': 'application/json;charset=UTF-8',
      },
    })
  );
});
```

![Screenshot 2022-12-20 232120.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2991082/350866f3-ac6a-d539-694c-79c9acc048f0.png)

JSONを返すできるのでAPIを構築することができます。

## Return HTML

```
const html = `<!DOCTYPE html>
<body>
  <h1>おはようございます。</h1>
  <p>私はクイです。</p>
  <p>よろしくお願いいたします。</p>
</body>`;

async function handleRequest(request) {
  return new Response(html, {
    headers: {
      'content-type': 'text/html;charset=UTF-8',
    },
  });
}

addEventListener('fetch', event => {
  return event.respondWith(handleRequest(event.request));
});
```

![Screenshot 2022-12-20 232534.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2991082/4e9adeea-1bd9-3967-61ab-4407ea9c51da.png)

JSONだけではなくHTML版も返すことができるのでStaticWebとして利用できる。

## Redirect request to other domain

```
const base = 'https://machicon.jp';
const statusCode = 301;

async function handleRequest(request) {
  const url = new URL(request.url);
  const { pathname, search } = url;

  const destinationURL = base + pathname + search;

  return Response.redirect(destinationURL, statusCode);
}

addEventListener('fetch', async event => {
  event.respondWith(handleRequest(event.request));
});
```
..........

上記はCloudflareWorkersのサンプル利用できりケースです。


# 終わりに

CloudflareWorkersはServerlessサービスです、利用する際サーバーに関して心配しない、コードだけ集中するのみです。そして「十分」無料プランがあります。コードがCDNのエッジにデプロイされるたので世界中のどこでもアクセススピードが遅くになりません。
OptimisticOfflineLock vs PessimisticOfflineLock

![20.OptimisticOfflineLock vs PessimisticOfflineLock.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11525/a7e4df8d-4c43-24bb-fa2f-ee058704d3a9.png)

https://bliki-ja.github.io/pofeaa/OptimisticOfflineLock/

https://bliki-ja.github.io/pofeaa/PessimisticOfflineLock/

オフラインシステムと異なり、Web に集約されたシステムは、非同期的に起きる複数の人の操作をリアルタイムに反映しなければならないため、同一データの書き換えの排他制御が重要になってきます。

データベーストランザクションには ACID (Atomicity / Consistency / Isolation / Durability) の特性があります。Isolation (独立性) は、各トランザクションが、途中で他のトランザクションによるデータ操作の影響を受けておかしくならないことを保証する特性です。この特性のおかげで、トランザクション内でのロジックが自己矛盾するような事態は避けられますが、システム全体として見ると不十分です。トランザクションにデッドロックが起きなくても、データに意図しない上書きが置きることはあります。

Optimistic Offline Lock (楽観的ロック) は、同時期に行われた複数のユーザー操作が同じレコード書き換えを起こす問題に対する、現実的な解決策です。

A さんと B さんが同時に、同じデータを編集するための Web フォームにアクセスしました。A さんの方が先に編集結果を送信しました。このあと少し遅れて B さんの編集結果を受け付けます。すると、A さんの操作が失われてしまいます。両者がそれぞれ「在庫 1 つ増えた」を行ったとき、正しい結果は +2 ですが、排他制御がなければ +1 になってしまうわけです。

「少しでも早く編集を開始した方が、他人の編集を禁止できる」という戦略を取ると、複数の人が同時にシステムを使えるメリットが減ってしまいます。操作を開始した人が長期間ロックを握りっぱなしになるおそれもあります。編集しようと思ったけど最終的にやっぱり元通りでいい、なんて場合もよくあります。

楽観的ロックは、この事前のロックを行いません。実際に書き込みが起きるまでは、誰でも何も考えず好きなときに操作を開始できるようにしておきます。代わりに、操作対象のデータにはバージョン番号かハッシュ値のようなものを持たせ、それを「前提とした直前状態」とします。後で書き込もうとした操作が、直前バージョンだと思っていたものと、実際の現在バージョンとに食い違いを見つけると、意図しない上書きとみなして処理を中断させます。これは Git のブランチマージがコンフリクトを起こしたのと同じです。あとになった人には、新しい前提でやり直し (rebase) をしてもらうのが適当です。

Pessimistic Offline Lock (悲観的ロック) は、それでも起きるレベルの同時更新に対する現実解です。まったく同時に押された送信ボタンのうち、たまたま先に操作を開始したプロセスが、他のプロセスを完全にブロックします。そうしなければ、反復可能読み取り排他レベル (Repeatable Read) のトランザクションであっても、それぞれが正しい前提として直前バージョンを読み取り、パラレルワールドを作ってしまうからです。同時に開始されたトランザクションは、他にトランザクションはない、自分は正しいと思い込んで処理を進めてしまい、コミットに行き着いてしまいます。

パフォーマンスよりも絶対的なロックが重要なときは、トランザクションの排他レベルを直列化 (Serializable) することも選択肢のひとつです。が、全体をロックするよりも、テーブルだけ、行だけをロック単位にできるならその方が、他の無関係なプロセスのレスポンスが良くなります。SELECT FOR UPDATE という特殊な SQL で、行をロックキーにできるデータベースが多くあります。

とはいえもちろん、もっと時間のかかる人の操作で、特定のデータを特権ユーザー以外読み取り専用にする、というのも、仕組みとしては悲観的ロックのひとつです。楽観的か悲観的かは、現実的な応用方法よりも、どちらかといえばメカニズムの違いを意味するための語彙です。

インターネットに公開されたシステムでは、排他的な処理が追いつかないほど書き込み操作が多い場合も増えてきました。タイムラグなしの即時反映が求められない場合は、全ての更新処理をやりきってしまわず、CQRS のコマンドとして積んでおき、イベントソーシングで処理する考え方もあります。PoEAA 執筆当時は言われていませんでしたが、イベントソーシングは悲観的ロックの代わりに検討する価値のあるパターンです。

**追記**:複数の人が同時に更新するようなデータをあまり持たず、データを各持ち主ユーザーに分散させたり、操作権限を明確にしたり、あるいは追記のみのデータベースに記録を付けるなどして、アプリケーション設計でコンフリクトを起こしにくくしたり、被害をおさえるように考えてあることは、そもそも論ですがすごく大事です。
OpenWrt を自宅検証環境用に便利に使う(1)

# OpenWrt を自宅検証環境用に便利に使う(1)

## はじめに
vPro対応PCにVMware vSphere Hyperisor(ESXi) をインストールして、[自宅の検証用環境にする話](https://qiita.com/JUNKER_TOMATO/items/edcbb93cf0b458a7e865)を書きましたが、ガシガシと仮想マシンを作って遊んでいると、IPアドレスを手動で割り振るのがだんだん面倒になってきます。

仕事でもないのにIPアドレス表で管理なんかしたくないですよね？

検証環境用のインターネットゲートウェイとしてOpenWrtを使うと、DHCPでIPアドレスを割り振りつつも、OS上で設定したホスト名で名前解決できるようになり、利便性が高まります。

## OpenWrt とは
[OpenWrt Project]() で開発が進められている、組み込み機器向けのLinuxディストリビューションです。
Wrt の名が示すように、無線LANルータ(Wave RouTer)を主なターゲットとしたOSSです。
世界中の各社無線LANルータやAPに対応しています。[対応機種](https://openwrt.org/toh/views/toh_fwdownload?dataflt%5B0%5D=supported%20current%20rel_%3D22.03.2)

組み込み機器の8Mbyte〜32MByte程度のとても小さな容量のフラッシュメモリ上でも動作し、独自のパッケージ管理ソフトウェアを持っています。Fedoraやdebianなどの一般のLinuxディストリビューションなどと同様にインターネット上のリポジトリから任意のソフトウェアを追加インストールできるようになっています。

家庭用の無線LANルータなどのファームウェアを置き換える形でインストールします。メーカー非公式のカスタムファームウェアとも言えます。**インストールに失敗すれば復旧できず、使えなくなる恐れ**があります。(「文鎮化」、「brick」などと俗称されます)
OpenWrtインストールのために新規にルーターを購入するのは私はお勧めしません。私の場合は対応機種をリサイクルショップなどで探して入手するなどして使っています。

[GL.iNet社のルーター](https://docs.gl-inet.com/jp/3/)は素のOpenWrtと並列で自社WebUIを持つ製品として知られており、こちらを使うのも良いでしょう。

## OpenWrt利用上の注意
OpenWrtは無線LANルータ用の代替OSのため、機能としてはIEEE 802.11n/ac などの無線LANを扱うことはできます。しかし
**日本国内では電波法に抵触する恐れがあるためOpenWrtをインストールした機器で無線LANを有効にして電波を出すことはお勧めしません。** 有線LAN用NATルーターとして利用することをお勧めします。

## 私の自宅環境
私の自宅の環境では以下のような構成になっています。
![OpenWrt-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114505/a41b711a-d91e-a776-0acc-49cf47be3572.jpeg)<br>
ドコモ光のプロバイダルーターの直下にOpenWrtをインストールした [Buffalo WZR-600DHP2](https://www.buffalo.jp/product/detail/wzr-600dhp2.html) を入れています。前述した法律上の理由と、技術的な理由でOpenWrtルーターは有線LANルーターとして利用しています。いわゆる二重NAT状態にはなっていますが利便性をとって割り切っています。

無線LAN機能は別に [Buffalo WSR-1800AX4](https://www.buffalo.jp/product/detail/wsr-1800ax4s-bk.html)を無線LANアクセスポイントとして入れています。


## まとめ
OpenWrt を自宅検証環境用に使う方法として、ひとまず私の環境をご紹介しました。

## 次回
具体的にどのように便利に使えるかをご紹介する予定です。
WEBセキュリティ

# この記事について

- 「PHP Conference Japan 2021: SPAセキュリティ入門 / 徳丸 浩」のYouTubeを見たまとめ。
- リンク：https://www.youtube.com/watch?v=pc57hw6haXk&ab_channel=PHPConferenceJapan

# 備忘録

- CORSについて
    - Cookieがない場合（＝認証がない）は、設定が甘くても大丈夫。
    - Cookieを使う場合（＝認証がある）は、厳しめの設定が必要。
    - `Access-Control-Allow-Credentials: true`, `Access-Control-Allow-Origin: <origin>`は必須の設定
    - デフォルトで`何でもあり`の設定になっている場合があるので注意
    - CORSの設定不備で、XSS脆弱性がなくてもなりすましができてしまう。※ただし、ローカルストレージを使用してリクエストヘッダーにトークンを付けている場合（ビアラー認証等）はなりすましはできない。

- JWTについて
    - `401 Missing or Invalid Authentication`
    - Firebaseのセッション管理を参考に
        - https://firebase.google.com/docs/auth/admin/manage-sessions
        - アクセストークンは取り消せません。
        - リフレッシュトークンは以下のいずれかの条件で無効化します。
            - ユーザ削除
            - ユーザ無効化
            - アカウント情報の変更があった（パスワード等）
            - ※リフレッシュトークンが無効化されれば、再ログインが必要になります
    - ログアウトどうするの？
        - 一般的には、トークンをクライアントから削除するだけ。⇨見かけのログアウト。
    - サーバー側でログアウトするには？
        - 有効期限を短くする　５分など　⇨ステートレス性が低下
        - ブラックリスト⇨ステートになってしまう
        - APIゲートウェイで管理する

- ステートフルトークンは？
    - トークンをデータベースで管理

- JWTを選ぶ理由
    - サーバでトークンのストレージ管理コストをなくすため
    - マイクロサービスが増えた場合、リソースサーバ単体での認可を実装しやすい

# JWTトークンの無効化テクニック
まずJWTペイロードに以下を用意する
- `sub` ユーザ識別子
- `iat` 発行日時
- `nbf` 開始日時（発行日時と同じ）
- `exp` 期限日時

ユーザのテーブルには以下の情報を用意する。
- `update_at` 更新日時

有効性の検証では毎回以下を確認する。
- `update_at` <= `iat` = `nbf` <= `exp` <= `現在日時`

※もしも、パスワード変更等で`更新日時:update_at`が更新された場合、その日時以前に作成されていたアクセストークンおよびリフレッシュトークンは無効となり、再ログインを要求されることになります。めでたしめでたし。
2022年xRサークルはまりあ活動まとめ

本記事は[全国学生VRサークル活動報告大会 #1 Advent Calendar 2022](https://adventar.org/calendars/8488)の一部となります。

## はじめに
活動を紹介する前に少しxRサークルはまりあのことを伝えたいと思います。
「静岡大学xRサークルはまりあ（旧：静岡大学xR同好会はまりあ）」は、xR（VR・AR・MRなどの総称）について、学内の認知度と技術力の向上を目指して活動するサークルです。
活動は主にオンラインで開催しますが、対面で開催するイベントなどもあります。連絡ツールはDiscordを使用します（元々Slackを使用しましたが、最近はDiscordに移行しました）。
詳しくは https://xr-hamaria.github.io/ を参照ください！

## 6月：XCUBEで遊ぶ
新歓イベントとしては[XCUBE](https://xcube.jp/)という浜松駅の近くにあるVR体験できる施設で集合して遊びました。これはメンバーにとって初対面で合う機会になりますね。多くのメンバーはVR機器を持っていないので、集まって遊んでいて楽しかったです。VR機器を持っている人も遊んだことないゲームやソフトを体験できる機会になりました。

## 9月：TGS VRに参加
![20220918_203736.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/883709/c08724e3-8c00-a6f9-7104-44714f0a7321.jpeg)
TGS VRの最終日でイベントを気づいたので、都合の良いメンバーだけ集まって回りました。写真の通り3人だけですが、色々見て楽しかったです。アチーブメントは揃っていませんが、みんな最終のシーンまで進みました。

## 11月：静大祭展示「VR体験ブース」
![IMG_2635.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/883709/0511c3dc-efc4-b8e9-df61-e40c6096b26e.jpeg)
[第23回静大祭in浜松](https://www.hama-shizudaisai.com/)の一部として、「VR体験ブース」を開きました。当日想像以上のお客様が来て嬉しかったです！（約100人）展示したものとしては、VR音ゲームのBeat Saberと、サークルの作品：[VRゲーム「黄昏の赤ずきん」](https://game.creators-guild.com/gck2021/4786/)と[バーチャル浜松キャンパス](https://xr-hamaria.github.io/virtual-inf/)でした。いっぱいの人に作品を紹介できる良い機会でした。

## 12月：VKet参加したかった...
![20221215_211124.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/883709/cd79c4b0-c67f-3a72-6cd3-460e964a1dbf.png)
多くのメンバーはゲーミングパソコンとVR機器を所有していないため、VKet Cloudを使ってみてVKetに参加しようとしましたが、トラブルが発生して4人だけ部屋に入れた状態になりました。上の写真はBeta版でしたのでVRMのアバターアップロード可能です。残念ながら部員は揃っていなかったですね。今度はVRChatで参加しようかなと思います。

## 終わりに
最後まで読んでくれてありがとうございます。今年の活動を振り返ってみるといろんなことをやっていましたね。サークルでそろそろ新しい作品を作りたいので、次のVRゲーム開発を企画しています。2023年も新しい作品を作ることといろんな活動できれば嬉しいです！
[NeoVim] Fern環境で、ディレクトリでの起動時に自動cdしたい!

## 環境

macOS Ventura 13.0
NeoVim v0.8.1
`lambdalisue/fern.vim`, `lambdalisue/fern-hijack.vim`導入済み

## なにがしたいの

いつも通り日本語が崩壊してるのでタイトルの意味がわからないと思います。これ読んでください。

```console
(そうだ、コンフィグでもいじるか)
$ nvim ~/.config/nvim/

(nvim内)
(Fern画面が開く)
:pwd
-> /Users/zoi/Desktop
(デフォルトディレクトリやん...)
(~/.config/nvim 開いといてほしいなあ)
```

## やってみる

ワイ「せや、`autocmd`で起動時にいい感じのところにcdすればいいのでは?」
ワイ「引数で指定したパスどうやって取るんやろ」
ワイ「よし、起動時に開いてるFern画面からもらうか」
ネット記事「`%`でファイルパス取れるらしいで」
ワイ「なるほどやってみるか」

```
:echo expand("%")
-> fern://275f276e/file:///Users/zoi/.config/nvim$
```

ワイ「Fernの自己主張強すぎやろ!」
ワイ「で、でも、このままでもcdできたりは...?」

```
:execute "cd ".expand("%")
-> E472: コマンドが失敗しました
```

ワイ「ダメそうですねありがとうございました」

ワイ「せや、`file://`以前を全部抹消すればどうや?!」
ネット記事「`substitute()`で正規表現置換できるで」
ワイ「これやろ」

```
:echo substitute(expand("%"), ".*file:\\\/\\\/", "", "g")
-> /Users/zoi/.config/nvim$
```

ワイ「エスケープめんど...」
ワイ「よくみたら最後に`$`あるやん なにこれ?」
ワイ「なんかよくわからんけど消しとくか」

```
:echo substitute(expand("%"), ".*file:\\\/\\\/\\|\\$$", "", "g")
-> /Users/zoi/.config/nvim
```

ワイ「いい感じやな」
ワイ「これ今はフォルダ開いてるけど、ファイル開いた時おかしくなったりする?」

```console
$ nvim ~/.config/nvim/init.lua

(nvim内)
:echo substitute(expand("%"), ".*file:\\\/\\\/\\|\\$$", "", "g")
-> /Users/zoi/.config/nvim/init.lua
```

ワイ「これcd先ちゃう、ファイルパスや」
ワイ「これの親ディレクトリ欲しいなあ」
ワイ「でも、ただ単に/以下切り捨てだとディレクトリを開いた時に親に行ってしまうなあ」
ネット記事「`fnamemodify()`便利やで」
ワイ「なるほど」

```console
$ nvim ~/.config/nvim

(nvim内)
:echo fnamemodify(substitute(expand("%"), ".*file:\\\/\\\/\\|\\$$", "", "g"), ":p:h")
-> /Users/zoi/.config/nvim
```

ワイ「よし、完璧や」

ワイ「あとはこれを`autocmd VimEnter *`すれば...」

```lua
vim.cmd('augroup cd-on-start')
vim.cmd('autocmd!')
vim.cmd([[autocmd VimEnter * execute ":cd ".fnamemodify(substitute(expand("%"), ".*file:\\\/\\\/\\|\\$$", "", "g"), ":p:h")]])
vim.cmd('augroup END')
```

ワイ「できたで〜〜」

## 結論

Luaで書いてますが、中身は完全にVim scriptなので安心してください。Vimでも動くはずです。知らんけど。
(`autocmd`をLuaで書く方法をご存知の方がいらっしゃれば教えてください)
```lua
vim.cmd('augroup cd-on-start')
vim.cmd('autocmd!')
vim.cmd([[autocmd VimEnter * execute ":cd ".fnamemodify(substitute(expand("%"), ".*file:\\\/\\\/\\|\\$$", "", "g"), ":p:h")]])
vim.cmd('augroup END')
```

## 余談?

このままだと以下のような場合にバグりそうな気もします(未確認です)
...めんどくさいので治しません()

```console
$ pwd
/path/to/hoge/
$ ls
huga/ ←ディレクトリ
huga$ ←ファイル
$ nvim hoge$
:pwd
-> /path/to/hoge/huga
```

正規表現で、ORじゃなくANDにするとか...?
【21日目】discord.jsで5000兆円画像を生成するコマンドを作る

# はじめに
こんにちは、なりかくんです。
今回は、discord.jsで5000兆円画像を生成するコマンドを作ってみようと思います。

# 5000兆円画像とは
5000兆円画像って何？となる方も多いと思います。
「5000兆円欲しい!」という画像を見たことはありませんか？まあ、詳しくは以下の記事を見てください（笑）

https://dic.pixiv.net/a/5000%E5%85%86%E5%86%86%E6%AC%B2%E3%81%97%E3%81%84%21

これを生成するAPIを有志の方が作成されています。今回はこれを利用したいと思います。

https://github.com/CyberRex0/5000choyen-api

# プログラムを作る
では、プログラムを作ります。といっても、非常にシンプルで手抜きな感じになりました。
```js:1000choyen.js
const { SlashCommandBuilder, ModalBuilder, TextInputBuilder, ActionRowBuilder, TextInputStyle } = require('discord.js');

module.exports = {
	data: new SlashCommandBuilder()
		.setName('1000choyen')
		.setDescription('1000兆円画像生成'),
	async execute(interaction) {
		const modal = new ModalBuilder()
			.setCustomId('1000choyen')
			.setTitle('1000兆円画像生成');

		const topInput = new TextInputBuilder()
			.setCustomId('topInput')
			.setLabel("上部文字列")
			.setStyle(TextInputStyle.Short);

		const bottomInput = new TextInputBuilder()
			.setCustomId('bottomInput')
			.setLabel("下部文字列")
			.setStyle(TextInputStyle.Short);

		modal.addComponents(new ActionRowBuilder().addComponents(topInput), new ActionRowBuilder().addComponents(bottomInput));

		await interaction.showModal(modal);
		const filter = (mInteraction) => mInteraction.customId === '1000choyen';
		interaction.awaitModalSubmit({ filter, time: 360000 })
			.then(async mInteraction => {
				const top = mInteraction.fields.getTextInputValue('topInput');
				const bottom = mInteraction.fields.getTextInputValue('bottomInput');
				mInteraction.reply({
					embeds: [{
						image: {
							url: `https://gsapi.cbrx.io/image?top=${encodeURIComponent(top)}&bottom=${encodeURIComponent(bottom)}&type=png`
						}
					}]
				})
			})
			.catch(console.error);
	},
};
```

# 実際に動かしてみる
実際に使ってみます。このようにモーダルウィンドウに入力して送信してみると...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549951/24082a18-debe-11ea-ed2b-8816b61e1a0c.png)

このように画像が表示されます。これで完成です！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549951/9e10538d-14e5-b0af-76fd-26f92ddea6b4.png)

以上です、最後までお読みいただきありがとうございました。
UnityからS3にファイルをアップロードするメモ

# UnityからS3にファイルをアップロードするメモ
UnityでAWSにスクリプトからファイルアップロードする部分で詰まったので備忘録も兼ねえて投稿します。
#### 1.アクセスキーとシークレットキーの取得。
https://tech-blog.s-yoshiki.com/entry/135

こちらの記事を参考にアクセスキーとシークレットキー取得。
シークレットキーは閉じてしまうと入手することが出来ないため気を付けてください。

### 2.AWS SDK for .NETをダウンロード
https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/net-dg-obtain-assemblies.html

こちらのサイトからaws-sdk-netstandard2.0.zipをダウンロードし、展開後Assets/Pluginsの中に必要なファイルをコピーします。
今回はS3を使用するため、AWSSDK.Core.dllとAWSSDK.S3.dllをコピーしました。

### 3.依存関係のdllをダウンロードする。
https://edom18.hateblo.jp/entry/2021/01/13/153612#AWS-SDK-for-NET%E3%82%92%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88%E3%81%99%E3%82%8B

こちらの記事の依存しているDLLもコピー（依存関係の解決)タブを参考にNuGetのパッケージ提供ページからPluginsにdllをインストールします。

### 4.C#スクリプトの作成

C#スクリプトをいかに示します。

```
using System.Collections;
using UnityEngine;
using Amazon.S3;
using Amazon.S3.Model;
using Amazon;

public class AWS_Update : MonoBehaviour
{

    public void Update_text()
    {
        AmazonS3Client s3Client = new AmazonS3Client("AccessKey", "SecretKey", RegionEndpoint.APNortheast1);

        s3Client.PutObjectAsync(new PutObjectRequest
        {
            BucketName = "BucketName",
            Key = "Filename",
            FilePath = "Filepath"
        }).Wait();
    }
}
```

このスクリプトではPutObjectAsync メソッドの同期版を使用していますが、非同期で行うこともできます。
その場合は以下のようになります。
```
await s3Client.PutObjectAsync(new PutObjectRequest
{
    BucketName = "my-bucket",
    Key = "file.txt",
    FilePath = "C:\\path\\to\\file.txt"
});
```

### 5.終了
以上でS3にファイルアップロードするスクリプトができたかと思います。
何か質問があればお気軽にどうぞ。
Unityのバージョンは2022.3.12を使用しています。
IBM Cloud Code Engineの料金見積方法をわかりやすく説明します

# はじめに
IBM Cloud Code Engineの料金見積方法について説明します。
IBM Cloudの料金見積は、殆どのサービスが[コスト見積ツール](https://www.ibm.com/jp-ja/cloud/cloud-calculator)を使って計算できますが、IBM Cloud Code Engineは[料金体系](https://www.ibm.com/jp-ja/cloud/code-engine/pricing)と[Code Engineの料金](https://cloud.ibm.com/docs/codeengine?topic=codeengine-pricing)のページを参照して手動で計算する必要があります。課金要素と計算例を元に説明したいと思います。

＊IBM Cloud Code Engineの詳しい説明については、[資料](https://cloud.ibm.com/docs/codeengine?topic=codeengine-getting-started)をご参照ください。
＊紹介記事もぜひご参照ください。
　https://qiita.com/satokota/items/b3cecd591e244fed391f

# 1. IBM Cloud Code Engine の 課金要素
課金要素として、下記の（A）ビルド時にかかる費用，（B）ランタイム時にかかる費用，（C）HTTPリクエスト数 があります。
![CodeEngine1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864295/beaecab4-88e3-c7df-1f4f-f2c007c6ddc5.png)
（注意事項）
+ ビルドが必要な場合のみ（A）を見積ってください。アプリのソースコードをもとに自動ビルドする場合は必要ですが、事前にビルド済みのコンテナイメージを指定してデプロイする場合は不要です。
+ 従量課金なのでリソースと実行時間（秒数）に応じて使った分だけ課金されます。
+ 無料枠を考慮して計算する場合は、1アカウントあたりの無料枠ですので、複数アプリをデプロイする場合やビルドとアプリでそれぞれ無料枠があるわけではないのでご留意ください。
+ 余裕をもって見積っておきたい場合は、無料枠を考慮しないで計算してもよいかと思います。

# 2. 見積方法と計算例
+ 計算例では無料枠を考慮しておりません。
 （無料枠を考慮する場合）
    + リソース（vCPU/メモリ）×実行時間（秒）から下記の無料枠分を差し引いて料金計算します。
    + HTTPリクエスト数から下記の無料枠分を差し引いて料金計算します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864295/a1628853-be2b-3a65-db30-06aea1a83dcb.png)

＊金額は少数点第3位で四捨五入しています

###### （A）ビルド
サポートされるCPUとメモリの組合せが決まっていますので、下記の中から選択します。
https://cloud.ibm.com/docs/codeengine?topic=codeengine-plan-build#build-size

（計算例）
リソース ： medium (1 vCPU x 4 GB) を選択
実行時間（秒）： ビルドを1日あたり10分 x 10 回を20 日間 と仮定  ∴実行時間は120,000 秒
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864295/9928b6c0-1342-15b9-ceba-54bad199a700.png)

###### （B）アプリケーション（ジョブ）
サポートされるCPUとメモリの組合せが決まっていますので、下記の中から選択します。
https://cloud.ibm.com/docs/codeengine?topic=codeengine-mem-cpu-combo

（計算例）
リソース ： 1 vCPU x 2 GB を選択
実行時間（秒）： アプリを1日あたり5時間で31日と仮定  ∴実行時間は558,000 秒
台数（Scale数）：2台
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864295/bc27677e-c492-db73-e109-211c9dc48f04.png)

###### （C）HTTPリクエスト数
ひと月あたりのHTTPリクエスト回数に応じて課金されます。単価は、100万リクエスト毎に$0.5です。

（計算例）
HTTPリクエスト回数 ： 1日あたり1万リクエストで31日と仮定  ∴リクエスト数は310,000
（計算式では、310,000/100万=0.31なので小数点第1位で切上げて"1”で計算しています。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864295/1a81719e-678d-7e67-1e63-e3cf904d8223.png)


（A）＋（B）＋（C）= ＄49.00  　 __月額 $49__