OmniAICreator/Qiita-1.07M huggingface dataset:
Power Automate Desktop Tips - MySQLからデータを取得する -

#概要
現在、当社で開発している製造業向けの作業進捗記録ツール「PIYOT」は、
作業者が入力した作業情報をMySQLに保存しています。
この情報を、Power Automate Desktop（以下、PADと表記）を使用して、
他のシステム（生産管理システム）等に自動的に入力させる必要があり、
PADでMySQLからデータを取得する方法を調べた際の備忘録です。

#環境
Windows 10
Power Automate Desktop（Version 2.15.00573.21354）
MySQL（この記事では、Azure Database for MySQLを使用）

#準備
以下のサイトからMySQL Connector/ODBCをダウンロードしてインストールします。
[https://dev.mysql.com/downloads/connector/odbc/](https://dev.mysql.com/downloads/connector/odbc/)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/4450d054-b9d1-339e-c20f-ff1fb4598934.png)

インストールが完了したら、スタートメニューの「Windows 管理ツール」内にある、
「ODBC データソース（64ビット）」をクリックして起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/e782ca8f-132d-0519-fffa-188b8365f972.png)

以下のような画面が起動するので、「追加」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/3db2dd96-cf5a-8450-b69c-808f598da2b3.png)

「MySQL ODBC 8.0 Unicode Driver」を選択して、「完了」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/d9fe3388-a835-babc-49f0-6a54968e89c5.png)

以下のような画面が表示されるので、必要な情報を入力します。
Data Source Name：データソースに名前を付けます。ここの文字に括弧が使えないので注意。
Description：データソースの詳細を記入します（任意）。
TCP/IP Server：接続先URLまたはIPアドレス
User：MySQLへデータベースログインするためのユーザー名
Password：MySQLへデータベースログインするためのパスワード
Database：データベース名を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/f0f2fb6a-2095-467f-d9a5-11f07098c8bd.png)


「Test」ボタンを押して、接続できるか確認しましょう。
以下のような画面が表示されたらOK。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/559a76e0-1adb-a1a7-ecb0-bd1bfa91b900.png)

#PADでの手順
1. アクションから、「SQL接続を開く」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/faba735e-ab85-b562-3ea7-313700e15e87.png)

1. 接続文字列を入力します。DSN=【先に設定したData Source Name】と入力し、最後にセミコロンを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/f7451785-87f7-e249-b8b2-776e6a017a8b.png)

1. 次に、アクションから「SQL ステートメントの実行」を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/f7f36fa9-6f40-3028-da63-3bc61a909c2c.png)

1. 以下のような画面が表示されるので、「SQL ステートメント」欄に実行したいSQLを記載して、保存をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/7791d93e-54d1-7028-08c9-49b3a5cd0594.png)

1. 次に、アクションから「SQL接続を閉じる」を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/d63dc3c9-a8f5-a057-99cd-4697ea51fbc8.png)

1. 以下のような画面が表示されるので、保存をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/09fcba38-b970-fba2-d8b2-a47d0d901a48.png)

1. これでMySQLからデータを取得するフローができたので、実行してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/bc1b6c6e-ea2a-81c8-cf40-6b102573b9d1.png)

1. 実行結果はQueryResult変数に入りますので、ダブルクリックして取得されたデータを確認してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/5cccfccb-e60e-ea01-ee29-e1eecfe04114.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/0abfea24-5b42-b425-63c0-18dd46da2f84.png)
Unity2021でScriptableObjectのデータが空になってしまう

CSVからScriptableObjectを自動生成していた処理が、
Unity2021.2.10f1 にアップデート後に動作しなくなってしまった。

色々試したところ、どうやら毎回ScriptableObjectを生成するのではなく、
既存のScriptableObjectが存在していたら、
それを読み込むような処理にしないと、上手くデータが反映されない挙動になっていた。

```C#:変更前
		// インスタンス生成
		object scriptableObjectInstance = Activator.CreateInstance(t);

		// ScriptableObjectを新規生成
		AssetDatabase.CreateAsset((ScriptableObject)scriptableObjectInstance, outputPath);
```

```C#:変更後
		// ScriptableObject読み込み
		UnityEngine.Object scriptableObjectInstance = AssetDatabase.LoadAssetAtPath(outputPath, t);
		if (scriptableObjectInstance == null) {
			// インスタンス生成
			scriptableObjectInstance = ScriptableObject.CreateInstance(t);
			// ScriptableObjectを新規生成
			AssetDatabase.CreateAsset((ScriptableObject)scriptableObjectInstance, outputPath);
		}
```
![sample.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88968/1b2cf2a6-03d7-b8b4-18f5-4e7b2543f228.jpeg)
Python Wheelタスクを用いてプロダクションパイプラインを簡単にデプロイする

[How to Deploy ML Production Pipelines Even Easier With Python Wheel Tasks \- The Databricks Blog](https://databricks.com/blog/2022/02/14/deploy-production-pipelines-even-easier-with-python-wheel-tasks.html)の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

豊富なオープンソースエコシステムと、とっつき易い文法によってPythonは、データエンジニアリングと機械学習における主要なプログラミング言語となりました。データエンジニア、MLエンジニアはすでにPythonノートブック、Pythonスクリプトを用いてパイプラインをおーけストレートするためにDatabricksを活用しています。本日、より複雑なPythonのデータパイプライン、MLパイプラインのコードをより簡単に開発、パッケージ、デプロイできるようにDatabricksでPythonのWheelを実行できるようになったことを発表できることを嬉しく思います。

Python wheelタスクはインタラクティブクラスターあるいは[マルチタスクのジョブ](https://qiita.com/taka_yayoi/items/bc77fbcf1dc30d8ff742)の一部としてジョブクラスター上で実行することができます。

Wheelパッケージフォーマットを用いることで、Python開発者は別のシステムに簡単かつ信頼性を持ってコンポーネントをインストールできるように、プロジェクトのコンポーネントをパッケージングすることができます。JVMの世界におけるJARフォーマットのように、Wheelは通常CI/CDシステムのアウトプットとなっており、圧縮された単一のビルドアーティファクトです。JARと同様に、Wheelにはソースコードだけではなく、全ての依存関係への参照も含まれています。

Wheelを用いたジョブを実行するためには、ローカルあるいはCI/CDパイプラインでPython Wheelを構築します。タスクでWheelのパスを指定し、エントリーポイントとして実行されるべきメソッドを指定します。タスクのパラメーターは、`*args`あるいは`**kwargs`を通じてお使いのメインメソッドに引き渡されます。
![](https://databricks.com/wp-content/uploads/2022/02/deploy-production-pipelines-even-easier-with-python-blog-image-1.jpg)

DatabricksジョブにおけるPython WheelタスクはGA(Generally Available)です。是非本機能を試していただき、我々がどのようにPythonデータエンジニアをサポートできるのかについて[フィードバック](https://ideas.databricks.com/)いただければと思います。

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
Webサイトのドメインを抽出する数式

[Answersで回答する時に使う情報のまとめ](https://qiita.com/Keiji_otsubo/items/9e6e0e946826133eddc7)


たまに、同じような質問があるので、いい回答があったらまとめておきたいと思います。

```
IF(CONTAINS(Website,"www."),
LEFT(SUBSTITUTE(Website, LEFT(Website, FIND(".", Website)), NULL),
IF(CONTAINS(
SUBSTITUTE(Website, LEFT(Website, FIND(".", Website)), NULL),"/"),
FIND("/",SUBSTITUTE(Website, LEFT(Website, FIND(".", Website)), NULL))-1,255)),
IF(AND(NOT(CONTAINS(Website,"www.")),BEGINS(Website,"http")),
MID(Website,FIND(":", Website)+3, FIND("/", SUBSTITUTE(Website,"//","$$"))-FIND(":", Website)-3),

LEFT(Website,
IF(CONTAINS(Website,"/"),FIND("/",Website)-1,255))))
```

[Formula to Extract domain from Website](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000FW0PJ)



# アドレスに特定のドメインが含まれているかの確認

ポイントはCONTAINSで比較する時には完全一致でしか判定してない。
そのため、フォーマットを変換する必要あある。

```
IF(CONTAINS("@gmail:@yahoo:@aol:@hotmail:@msn:@wanadoo:@comcast:@live:@outlook", SUBSTITUTE( SUBSTITUTE( email, left(email ,FIND('@', email )-1) , ""),".com","") ),"Personal","Corporate")
```

@gamil　などを切り出す処理は以下

```
SUBSTITUTE( SUBSTITUTE( email, left(email ,FIND('@', email )-1) , ""),".com","")
```

[Contains formula help](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000BuNrpSAF)
HTML・CSS超入門[心構え編]

こんにちは。
こちらの記事はこれからHTML・CSSのお勉強を始めるズブズブの初心者です！！という方や、なんとなく習ったことはあるけれどもう一回基礎から勉強し直そうかなという方向けです。
このポイントを抑えていれば、それなりのフレームは作れるようになれるくらいになる。と筆者の思うポイントを書いていきたいと思います。
言うなれば「心構え編」です。具体的な内容を知りたい方は後日UP予定の具体的編（仮）をご覧ください。
（※この記事ではあくまでポイントの紹介になります。）
あーなるほど、自分に足りなかったのはここだったのかも。とお勉強の背中を少しでも押せることができたら幸いです。

#【まずは心構えが大事。】
立派なWEBデザイナーになりたい！かっこいいプログラマーになりたい！など、目標はそれぞれかと思います。
ある程度の言語やスキルを身に付けて、とりあえずいい感じに成果物が完成できればいいんでしょ？と思ってるそこのあなた！
現場に出たら痛い目見ますよ！！

お医者さんや看護師さん・学校の先生など、どんな職業でも言えることかと思いますが、どれだけ一流のWEBデザイナーやプログラマーでも日々勉強し続けています。
年収●千万円稼ぐ凄腕敏腕エンジニアだって日々勉強してるんです。

基礎と応用を学んで、就職して、エンジニアとしてデビューできた！
そこがゴールではないのですよ。（・ω・)ノ”(・o・)エッ！
プログラミングもデザインも日々どんどん新しいことが生まれては廃れてを繰り返しています。
そんな業界で活躍し続けられるエンジニアになるためには、どんなにベテランでも勉強し続けるということはとても自然なことだと思いませんか？

#【「自分で調べる」力を身につけよう】
今やどんなことでもインターネットで調べればわかる時代です。とは言っても、自分が本当に必要な情報にたどり着くには、「調べる力」が必要です。
コードを書いていて、「あれ、この画像を横並びにするのはどうしたら良いんだ…」とつまづきます。でもそのCSSプロパティの名前は知らないから、その言葉を使って調べるのはもちろん不可能ですよね。
そんな時はまず、「画像を横並びにする」っと自分がやりたいことをそのまま調べてみましょう。大体はこれでも目的の答えには近づけるかもしれないですね。ここではもう少し目的を簡略にして、そこにスペース「 」＋何を使って？の「〇〇」を追加してみましょう。
今回はCSSプロパティが知りたいので、「〇〇」＝「CSS」ですね。検索バーに入力するのは「画像横並び　CSS」いかがでしょうか？必要な情報により早くたどり着けますよね。
前章でもお伝えしましたが、エンジニアというものはお勉強し続けるもの、「調べる力」が身についているかどうかで、時間短縮にもなり、より多くの勉強をできるようにもなるというわけです。
「検索方法」についてもインターネット上にたくさん情報があると思いますので、ぜひご自身で調べてみてください。

#【HTML・CSSを学ぶにあたって】
では、ここからは実践的なお話に。
（具体的な内容を知りたい方は後日UP予定の具体的編（仮）をご覧ください。）

###ポイント①：コードは誰が見ても分かりやすく書きましょう。
まず、これからHTML文をいやと言うほど書くであろうあなたへ言いたいこと、ソースは誰が見ても分かりやすく書いてください！！！！
多くの場合、あなたの書いたHTML文は後に第３者がメンテナンスを行います。チームPJTであるならば100％そうですよね。
０からリリースまで100％あなたが作ったWebページだったとしても、お客様からお金を受け取って納品したのであればそれはもうお客様のもの。
受け取ったお客様はリリース後そのページの内容に変更を加えたり、新しい要素を追加したり運用を行なっていきます。その時、コードがものすごく複雑で解読困難なものだとしたら…。
きっとまたあなたに依頼が来る可能性は低い…ですよね。運用のしやすさも考えて、分かりやすく簡潔なコーディングを学び始める今からでも心がけて癖をつけていくことをお勧めします。

###ポイント②：パスの使い方
パスとは、htmlファイルや、cssファイル、画像などの住所を表すようなものです。「相対パス」「絶対パス」「ルート相対パス」など数種類の記法があります。
パスを制するものがプログラミングを制す！！！と言うのは言い過ぎですが、ここが理解できていな今まいると…「あれ、画像表示されないやんけ」とか「おい、リンクつながってないぞ」っと、いろんな場面で躓くこと間違い無しです。

###ポイント③：idとclassの使い分け
こちらは勉強し始めは誰しも混乱するところかなと思います。
classは何回も何回も使うスタイルを、グルーピングした場所に指定することで、そのclass名を指定した場所には同じことを何度も書かなくても使えるようになりますよね。
それに対して、idはそのページに一つだけしか存在できません。そのため、アンカーリンクであったり、その要素のみに何かを指定したい時などに使います。ですのでページを跨いで使用しているような共通のスタイルシートに書かれたスタイルを、打ち消す時にも役立ちます。

このようにそれぞれの特性を活かした使い方が肝になってきます。

###ポイント④：タグの親子関係
タグの親子関係を理解することは、後にJavaScriptを使うときにと〜〜〜っても重要になってきますが。もちろんHTML・CSSだけでページを構成する場面でも大事なポイントです。
どんなときに必要かと言うと、CSSプロパティでは親要素にこのプロパティをつけて子要素にはこのプロパティをつけるよ。とか言う決まりがあるわけなのです。
ですから親子関係が分かりやすいようにクラス名をつけておくとか、きちんとインデントをつけてソースを見やすく保つなどの工夫も大切です。
例えば…

    <div class=“main_wrap”><!--親-->
    	<div class=“main”><!--子-->
    		<div class=“main_v”></div><!--孫-->
    	</div>
    </div>

###ポイント⑤：インライン要素・ブロック要素（タグの種類）
これは初心者泣かせと言いますか…、フレーム作りが上手くいかない原因No.1と言っても過言でないくらいに重要なポイントです。
bodyタグないで使うタグは様々なタグがありますが、とってもざっくり言うと（連続して書く場合）横並びになる「インライン要素」と縦積みになる「ブロック要素」、この二種類に分類されます。
この二つのタグの特性を理解しているのといないのでは、画面作りを行うエンジニアスキルとしてはとっても大きな差になります。本当に学び初めにはそんなものがあるんだなくらいの理解でも良いかもしれません（逆にここから始めると分からなさすぎて嫌になってしまうかも）が、ある程度組めるようになってきたなというときにこのポイントをもう一度振り返ってみると理解が深まって良いと思いますよ！

*****
あれ〜なんかうまくいかないよ〜とお悩みの方、以上のポイントの理解を深めてもう一度チャレンジしてみてください。
きっとあなたのスキルはグググっ！っとUPしているのではないでしょうか！
Gatsby.js+レンタルサーバーの構成でページリロードすると403が出る時の対処法

`gatsby build　`したページをレンタルサーバーにホストした時にページリロードで４０３エラーになってしまいハマったのでメモ。

手っ取り早く解決するには`.htaccess`で403をアプリで処理するようにすれば解決。

```:.htaccess
ErrorDocument 403 http://%{HTTP_HOST}%{REQUEST_URI}
```

自由度の少ないレンタルサーバーを利用しなければならない時、Gatsby.js等のSGGフレームワークは便利ですね。
2022/2/15主にITとかセキュリティの記事

2021年のサイバー犯罪検挙数は1万2275件 - 前年比25％増
https://www.security-next.com/134090

「macOS」や「iOS」にゼロデイ脆弱性 - ウェブ閲覧でコード実行のおそれ
https://www.security-next.com/134101

PCR検査のデータ管理システムがランサム被害 - 愛知県
https://www.security-next.com/134098

アフィリエイト広告への懸念
奔流eビジネス（アジャイルメディア・ネットワークアンバサダー　徳力基彦氏）(2/11)
https://www.nikkei.com/article/DGXZQOUC01D0J0R00C22A2000000/

日本の対応“後手後手”　北京五輪のスマホ情報セキュリティー　パラでは使い捨てスマホ配布も(2/12)
https://www.zakzak.co.jp/article/20220212-K36GAYVED5P25MSHB6JQ2FRLA4/

【重要ニュースまとめ（2/5~2/11）】国内財閥グループ2社が暗号資産業界に本格参入、ロシア政府は暗号資産を通貨と認定へ(2/12)
https://hedge.guide/feature/blockchain-weekly-report-0212-bc202202.html

中国とメタバース： 他国と大きく異なる進化を遂げる可能性 コンテンツ面では課題も(2/13)
https://jp.cointelegraph.com/news/china-s-metaverse-plans-decentralization-not-required

悪質ユーザーの減少傾向みられず―『VALORANT』プレイヤー監視レポートを発表(2/11)
https://www.gamespark.jp/article/2022/02/11/115930.html

身代金攻撃を受けた企業の半数が「要求額の全額」を支払い(2/12)
https://forbesjapan.com/articles/detail/45740

無料の「Windows 10トラブルシューティングツール」を使う簡単な方法(2/13)
https://techtarget.itmedia.co.jp/tt/spv/2202/13/news02.html

北朝鮮のインターネットを停止させた「一匹狼のハッカー」(2/12)
https://forbesjapan.com/articles/detail/45735

1月マルウェアランキング、Emotetが首位に返り咲き(2/13)
https://gunosy.com/articles/empxa

イーサリアムL2ソリューションOptimism、重大バグの修正を報告(2/11)
https://coinpost.jp/?p=319681

それぞれ異なったデジタル通貨の未来像デジタル人民元vs.デジタルドルを展望する(2/11)
https://premium.toyokeizai.net/articles/-/29735

2月Webサーバシェア、Cloudflare ServerとLiteSpeedが増加(2/11)
https://news.mynavi.jp/techplus/article/20220211-2267706/

Google、脆弱性を発見した研究者達に計10億円を支払ったと発表(2/13)
https://iphone-mania.jp/news-437585/

IoT製品のAmazon攻略　安値だけじゃない対抗策(2/13)
https://www.nikkei.com/article/DGXZQOUC014EJ0R00C22A2000000/

1月モバイルブラウザシェア、Safari増加続く(2/12)
https://news.mynavi.jp/techplus/article/20220212-2270055/

税金475億円投入したのに…マイナンバー関連システムの自治体利用が低迷　運用開始から3年で想定の41%止まり(2/13)
https://www.tokyo-np.co.jp/article/159936?rct=economics

ニュースの深層 マネロン対策システム共同化が進む「人との融合」が高度化のカギ(2/13)
https://zuuonline.com/archives/236286

DXの課題は人材・スキル不足が5割　外部人材雇用もジョブ型導入進まず(2/14)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600010/020200107/

Windows標準IMEから乗り換えるべきか、無料で使える「Google日本語入力」の実力(2/14)
https://xtech.nikkei.com/atcl/nxt/column/18/01942/021000005/

Firefoxのハングアップ障害、悪いのはグーグル？それとも「例の問題」か(2/14)
https://xtech.nikkei.com/atcl/nxt/column/18/00682/020800070/

コロナ下で増える強制出社　離職や採用難に拍車の恐れ(2/14)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/092400133/020700069/

オブザーバビリティー（Observability）(2/14)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600009/020900108/
【Swift】撮影した動画からサムネイル画像を取得

#はじめに
今回のタイトルは撮影した動画からサムネイル画像を取得としていますが、
私がこの記事で伝えたいのは取得方法よりも注意点についてです。
こちらを実装される方は知っておいた方が良いです。
又、こちらは動画の一番最初のフレームをサムネイルにする場合の実装です。

#実装

```swift

private func setThumbnail() {
    
    guard let url = URL(string: videoUrl ) else { return }
    let asset = AVAsset(url: url)
    let generator = AVAssetImageGenerator(asset: asset)
    generator.appliesPreferredTrackTransform = true
    
    do {
        let thumbnailCGImage = try generator.copyCGImage(at: asset.duration, actualTime: nil)
        thumbnailImageView.image = UIImage(cgImage: thumbnailCGImage)
    } catch {
    }
}
```

#注意点

私は最初こちらの実装をした際にサムネイルの画質が悪くなってしまったのですが、
その原因が下記のコードにて実際に表示するViewのサイズを指定してしまっていたからでした。
画質が落ちるよって方は下記コードが原因の可能性がありますので一度消して試してみてください。

```swift
generator.maximumSize = self.thumbnailImageView.frame.size
```
GithubActionsで冗長になってしまったstepをcomposiseで共通化する


## 共通化
- `Composise Action`というものらしい
- `uses`から呼ぶことができるGithubActions用のモジュール？的なものとは違い、単純にyamlファイルの共通部分を切り出すことができる
- 運用してくると各環境ごとにとかで同じようなコードが増えてしまってメンテしにくくなるので、そういう場合に使うと便利

## サンプル
- `main.yml`が本体のWorkflow
- `action.yml`が共通化されたWorkflowというかAction
- 利用するに当たりいくつか決められたルールがあるので、それに従って作る必要がある
    - `action.yml` というファイル名で共通ファイルは作成する必要がある
        - そのため、ディレクトリ名に役割がわかるものを指定しておく
    - `runs.using: Composise`の定義が必要
    - 実行部分を`run |`とし、複数行にコマンドを並べるときは、`shell:bash`の定義が必要
- 共通化部分の引数は`inputs`で用意しておき、メイン部分からは`with`で渡してあげる

```.github/workflows/main.yml
name: "Main"
on:
  push:
    branches:
      - master

env:
  AWS_ENVIRONMENT: prod

jobs:
  composite_test:
    runs-on: ubuntu-latest
    steps:
      - name: "Checkout"
        uses: actions/checkout@v2

      - name: "call composite"
        uses: ./.github/actions/test
        with:
          AWS_ENVIRONMENT: ${{ env.AWS_ENVIRONMENT }}
```



```.github/actions/test/action.yml
name: "Composite Action"
description: "Composite Action"
inputs:
  AWS_ENVIRONMENT:
    description: "AWS_ENVIRONMENT"
    required: true

runs:
  using: "composite"
  steps:
    - name: "Checkout"
      uses: actions/checkout@v2

    - name: "ENVIRONMENT"
      shell: bash
      run: echo ${{ inputs.AWS_ENVIRONMENT }}
```

## 実行
このような感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/3eeac250-ce11-535d-9a45-3a491d421625.png)

引数も渡っている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/233bd3b7-5716-a3ec-5c1f-20032233c0e4.png)


## 参考
https://zenn.dev/stafes/articles/ikkitang-a694b8afeb66f5
Pyhton3の標準入出力まとめ+応用

# 標準入力

## 一つの行から、一つの数字を変数に

```py:入力値
100
```

```py:取得方法
N = int(input())
print(N) => 100
```

## 一つの行から、複数の文字列を変数に

※左辺が1変数の場合、配列になる

```py:入力値
m n
```

```py:取得方法
M, N = input().split()
print(M, N) => m n
```

## 一つの行から、複数の数値を変数に

```py:入力値
3 200
```

```py:取得方法~変数ver
M, N = map(int, input().split())
print(M, N) => 3 200
```


```py:取得方法~配列ver
M = list(map(int, input().split())
print(M) => [3,200]
```

## 入力行数を利用し、行分の数値入力を1次元配列に

```py:入力値
3
200
300
400
```

```py:取得方法
N = int(input())
S = [int(input()) for i in range(N)]
print(S) => [200,300,400]
```

## 入力行数を利用し、各行複数の数値入力を2次元配列に

```py:入力
3
100 200 20
100 20 20
500 20 20
```

```py:取得方法
N = int(input())

# リスト内包表記
W = [list(map(int, input().split())) for i in range(N)] 
# 間に半角スペースが無い場合、split()を除けばOK

print(W) => [[100,200,20],[100,20,20],[500,20,20]]
```

## 入力行数を利用し、各行複数のつながった文字入力を2次元配列に

```py:入力
3
abc
def
ghi
```

```py:取得方法
N = int(input())

# リスト内包表記
W = [list(input()) for i in range(N)] 
# 間に半角スペースがある場合、split()をつければOK
print(W) => [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']]
```

## 縦方向に並んだ数値列を、指定行分区切って2次元配列に

```py:入力
3
10
20
30
40
50
60
70
80
90
```

```py:取得方法
N = int(input())

# リスト内包表記
S = [[int(input()) for i in range(N)] for i in range(N)]
print(S) => [[10,20,30],[40,50,60],[70,80,90]]
```

# 出力方法

## 一つの行に半角スペースで複数の回答を出す

※`end=""`は末尾にも半角スペースが入るので注意

```py:出力
1 2 3
```

```py:方法
# 回答配列を作成する
ans = [1,2,3] 

# 末尾か否かで分岐
for i in range(len(ans)):
    if i+1 == len(ans):
        print(ans[i])
    else:
        print(ans[i], end=" ")
```

# その他の便利技

## 2次元配列を転置

```
W = [[1,2,3],[4,5,6],[7,8,9]]
W_T = [list(x) for x in zip(*W)]

print(W_T) => [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
```

## 2次元配列各要素早見表

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614347/06dc15cd-badb-5db9-3124-48fc607f5596.png)
【備忘録】Hugoで作ったサイト上でHTMLファイルをいい感じに表示するためにやったこと

# これはなに

TRPGのログを公開するためにHugoで静的サイトを作ることにしたのですが、HTMLファイルをいい感じに表示する方法がググってもなかなか見付からなかったので備忘録がわりにこの記事を残しておきます。

結論としては[埋め込んでみる](#埋め込んでみる)に書いたHTMLファイルを埋め込むやり方が一番良さそうでした。

# 環境

- **Hugo**: v0.92.0
- **theme**: hugo-book(https://github.com/alex-shpak/hugo-book)
- **OS**: Windows11

config.tomlは`hugo new site`したときのままいじっていない。

# contentディレクトリ内にHTMLファイルを置いてみる

`content`ディレクトリ内の適当な位置にhtmlファイルを置いたら読み込んでくれた。（今回は`content/logs`ディレクトリ内に配置）
![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2521499/74c32c30-fe78-c951-a630-714e760339c6.png)

……とりあえず表示するだけならばこれで良いのだが、やっぱりテーマが適用されてないのは統一感に欠けるしなんか寂しい。

# 埋め込んでみる

HugoのShortcodesを利用してHTMLファイルをmarkdownファイルに埋め込んでみる。

`layouts/shortcodes/embedLOG.html`に以下の記述をした。

```html:embedLOG.html
{{ $baseurl:= .Page.Site.BaseURL }}
<iframe {{with .Get "src"}}src="{{ $baseurl }}/logs/{{ . }}"{{ end }} width="100%" height="300em" frameborder="0">
</iframe>
```
（base urlの取得はhttp://staff.feedtailor.jp/2016/06/15/hugo_09/ を参考にした）

そして`hugo new logs/logembedtest`でmarkdownファイルを作成。以下のようにする。

```markdown:logembedtest.md
---
title: "Logembedtest"
date: 2022-02-14T22:43:58+09:00
draft: false
---

test

{{<embedLOG src="testlog.html">}}
```

testlog.htmlファイルの位置：
```
content/
　└ logs/
　 　└ logembedtest.md
　 　└ testlog.html
```


実行結果はこんなかんじ（実際の卓のログ使って確認したのでモザイクをかけてます）。

![test4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2521499/a84a6015-8752-fedd-11cf-ce7341db0957.png)

## 課題

見てくれがよろしくない。

iframe使って埋め込んでるので仕方ないのだがページ中にもう一つ別のページがあるというのは想像以上に見てくれが悪い。iframe要素の高さを埋め込み対象の高さに合わせたい。

## 課題の解決

https://webllica.com/set-iframe-height-dynamic/

このサイト（↑）を参考に`embedLOG.html`を変更したら、うまくいった。埋め込み対象のファイルに手を加える必要がないのがとてもありがたい。

実行結果はこんなかんじ：
![test5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2521499/1ee0010d-6559-2f38-4bde-5959f56ab547.png)

スクリプトは上記サイトのものをほぼコピペ（とくに理由はないがidを`myframe`に変更している）。それに合わせてHTML部分を若干変更。`width`属性の値は`<style>`タグの内部で指定した（`width`の値は先程と変わらず`100%`）。

```html
{{ $baseurl:= .Page.Site.BaseURL }}
<iframe id="myframe" {{with .Get "src"}}src="{{ $baseurl }}/logs/{{ . }}"{{ end }} frameborder="0" scrolling="no">
</iframe>
```

ちなみに、コピペそのままだと子ページの一番下の部分が見切れる（`scrolling="no"`が原因と思われる）ので、子ページの高さにぴったり合わせるのではなく100px余分に表示されるよう指定している。

:::note warn
**注意**
`scrolling`属性および`frameborder`属性はHTML5で廃止されています。
CSSでの代用が推奨されています。
:::

# 参考

- [静的サイトジェネレータHugoを使ったサイト構築（コンテンツ編３） ](http://staff.feedtailor.jp/2016/06/15/hugo_09/)
- [iframe の高さが動的に変わっても親画面でスクロールバーを表示させない方法](https://webllica.com/set-iframe-height-dynamic/)
- [Create Your Own Shortcodes](https://gohugo.io/templates/shortcode-templates/)
バレンタインチョコの個数を線形回帰で予測してみました。

```Python
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression

chocolates = np.array([0, 1]).reshape(1, -1).T
year = np.array([2021, 2022]).reshape(1, -1).T
model = LinearRegression()
model.fit(year, chocolates)
future = np.linspace(2021, 2050, 30).reshape(1, -1).T
plt.scatter(year, chocolates, label="Observed")
plt.plot(future, model.predict(future), label="Predicted")
plt.title("Linear Regression")
plt.xlabel("Year")
plt.ylabel("Chocolates")
plt.grid()
plt.legend()
plt.show()

```

![chocolates.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/37f14f39-4e6e-592a-02b4-d51a0e17bfd9.png)
NeurIPS2021の枝刈り論文 (3)

# 概要

この記事では、NeurIPS2021の枝刈り論文をまとめます。 [^1]
[その1](https://qiita.com/kyad/items/a998011894d8d9013dfc) [その2](https://qiita.com/kyad/items/c37209de0993fef73a63)

[^1]: 画像や数式は論文から引用しています。

# Adversarial Neuron Pruning Purifies Backdoored Deep Models

https://arxiv.org/abs/2110.14430

概要：ANP。DNNのバックドアのトリガの入力に対して敏感なニューロンを刈ることで、DNNを安全にする。
新規性：DNNのバックドア対策の枝刈り方法で、経験的な方法ではなくデータドリブンな方法で、fine-tuningを用いない方法。
キモ：敵対的例を入れた時のロスの変化を最大化する問題に定式化する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/1f8fcc74-6e7b-7100-ac7a-325ed3cf2644.png)
マスク$\mathbf{m}$を入れて、連続に緩和した問題を解く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/f29686ed-2bb2-d258-62ea-c9fdfc23accf.png)
評価：ResNet, CIFAR10に対するSOTAの攻撃例に適用して実験した。

# NxMTransformer: Semi-Structured Sparsification for Natural Language Understanding via ADMM

https://arxiv.org/abs/2110.15766

概要：NxMTransformer. Transformerに[NxM sparsity (連続するN個のデータのうちM個を使いそれ以外を0にするスパース化)](https://qiita.com/kyad/items/35b4fb8e550db32d6bd5)を適用した。
研究機関：Microsoft
新規性：密行列計算で学習したモデルを活用して、NxM sparsityのTransformerモデルを作る方法を提案した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/c9f3dfea-b16b-1086-77ee-b7c1fa812a20.png)
キモ：密行列からのfine-tuningに、非ゼロが多い重みに対するペネルティを加えながら[ADMM](https://en.wikipedia.org/wiki/Augmented_Lagrangian_method#Alternating_direction_method_of_multipliers)で最適化する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/3dc5d051-717b-a2c3-8397-3af58d6c01da.png)
評価：HuggingFaceのBERTをGLUE benchmarkにfine-tuningしてASPと比較した。


# Accelerated Sparse Neural Training: A Provable and Efficient Method to Find N:M Transposable Masks

https://arxiv.org/abs/2102.08124

概要：[NxM sparsity](https://qiita.com/kyad/items/35b4fb8e550db32d6bd5)の置換マスクを構成する方法。
研究機関：Intel
新規性：
(1) 置換を最小費用流問題として解く方法を提案した。
(2) Adaprune. Unstructured sparsityをN:Mにしたり、N:Mをより小さく変えるのを、学習せずやる方法を提案した。
キモ：
(1) 置換を最小費用流問題にして近似度2の近似解法で解く。
(2) Adapruneは(5)式を最適化するシンプルな方法。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/1e41826f-2018-863e-77c4-a22807974589.png)
評価：ResNetやBERTで実験した。


# Deep Learning on a Data Diet: Finding Important Examples Early in Training

https://arxiv.org/abs/2107.07075

概要：学習データを減らす方法
研究機関：Facebook
新規性：学習の最初の数EPOCHで不要なデータを選べる。
キモ：GraNd, EL2N Scoreの大きいデータが重要であるとする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/b84c37b6-93ff-2fb7-65cf-d03b1fc56cd8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/92761d78-8d58-80e2-c3dc-d8711d75e7f3.png)
評価：CIFAR, ResNetで実験した。
Sphinxの拡張機能

https://qiita.com/plumfield56/items/53cb238af0940d3a129f

この記事に続き、拡張機能で色々と書きたくなって試した内容を記録していきます。


# Markdown

## install

```bash
pip install recommonmark
```

## conf.pyへの追加

```py
# .rst に加え、.md も扱えるようにする
source_suffix = ['.rst', '.md']

# 拡張子 .md のファイルは recommonmark で処理する
source_parsers = {
 '.md': 'recommonmark.parser.CommonMarkParser'
}
```


# mermaid

参考サイト
https://pypi.org/project/sphinxcontrib-mermaid/

## install

```bash
pip install sphinxcontrib-mermaid
```

## jsファイルのダウロードと格納

https://pypi.org/project/sphinxcontrib-mermaid/
このサイトからmermaid.jsをダウロードしてjsフォルダに格納

## conf.pyへの追加

```py
extensions = [
    'sphinxcontrib.mermaid'
]

html_js_files = [
   'js/mermaid.js',
]
mermaid_params = ['--theme', 'forest', '--width', '600', '--backgroundColor', 'transparent']
```

## ファイル例

ファイルは.rst、.mdの拡張子で作成すればOKです。

```markdown:sequence.md

sequence
========

.. mermaid::

   sequenceDiagram
      participant Alice
      participant Bob
      Alice->John: Hello John, how are you?
      loop Healthcheck
          John->John: Fight against hypochondria
      end
      Note right of John: Rational thoughts <br/>prevail...
      John-->Alice: Great!
      John->Bob: How about you?
      Bob-->John: Jolly good!
```

# todo機能


## conf.pyの設定

```py
extensions = [
    'sphinx.ext.todo',
]

todo_include_todos = True
```

## 使用方法

`.. todo::`で今後やるタスクを記載
`.. todolist::`でtodoの一覧を表示させることが可能

```markdown:example.rst
.. todo:: 〇〇をあとで書く
.. todo:: ××をあとで書く

.. todolist::
```
[JS]JavaScriptにおけるオブジェクトの概念

学習したことのアウトプット

JavaScriptを学習してると「オブジェクト」やら「メソッド」という言葉がガンガン出てきます。その度に、そもそもなんぞや？と思ってしまっていたので、少しでも情報を整理するために記事にしてみたいと思いまして。

#JavaScriptにおけるオブジェクトの概念
JavaScriptにおけるオブジェクトとは、`データや処理といった情報を1つにまとめた集合体`です。
例えば、以下のような情報があるとして

|データ|処理|
|-----|---|
|名前：ヤマダ|歩く|
|性別：男性|食べる|
|年齢：25歳|話す|

これらの情報を「human」等として1つにまとめると、オブジェクトが出来上がります。

[![Image from Gyazo](https://i.gyazo.com/ad2fda2bfb4fd28cfacf8ef366167e1f.png)](https://gyazo.com/ad2fda2bfb4fd28cfacf8ef366167e1f)
##プロパティ
上のイメージ図の`「データ」`にあたる部分。
`ハッシュ形式（キーとバリューの組み合わせ）で書かれる値のこと`で、オブジェクトの要素（中身）を決める役割をします。つまり、「オブジェクトは、プロパティの集合体から成り立っている」と言うことができます。

```javascript:プロパティの書き方
変数名 = {キー: バリュー} 
         //ハッシュ部分がプロパティ
```

```javascript:【例】オブジェクトとプロパティ
let human = { 
  name: "yamada",
  gender: "man",
  age: 25,
 }
```

###プロパティの値を取得する
`オブジェクト名.プロパティ名`のように記述することで、オブジェクトのプロパティの値を取得することができます。

```javascript:例
let human = { name: 'yamada' }

console.log(human.name) // => yamada
```

###プロパティを追加する
方法は以下の2つ
①`オブジェクト.プロパティ`に値を代入する
②`オブジェクト['プロパティ']`に値を代入する

```javascript:例
let human = { name: 'yamada' }
console.log(human)

human.age = 25 //①
human['address'] = 'Tokyo' //②

console.log(human) // => { name: 'yamada', age: 25, address: 'Tokyo' }
```

###プロパティの値を変更する
追加の時と同じく
①`オブジェクト.プロパティ`に値を代入する
②`オブジェクト['プロパティ']`に値を代入する
で変更ができます。

```javascript:例
let human = {
  name: "yamada",
  age: 25,
  address: 'Tokyo'
}

console.log(human.name) // => yamada
console.log(human.age)  // => 25

//以下で変更している
human.name = "yabe"
human['age'] = 30

console.log(human.name) // => yabe(変更されている)
console.log(human.age) // => 30(変更されている)
```

##(JavaScriptにおける) メソッド
最初のイメージ図における`「処理」`にあたる部分で、`プロパティに紐づけられた処理のこと`を指します。プロパティには、「〇〇をしてほしい」という処理を`関数`を用いることで代入できます。

```javascript:メソッドの書き方
変数名 = {
  //ここにプロパティが記述されている状態
  メソッド名: function(){...}
}
```

```javascript:【例】オブジェクトのメソッド
let human = {
  name: "yamada",
  age: 25,
  address: 'Tokyo',

  talk: function(){
    console.log(`私の名前は${human.name}、${human.age}歳です。住所は${human.address}です`)
  }
}

// talkメソッドを実行

human.talk()  //=> 私の名前はyamada、25歳です。住所はTokyoです
```
humanオブジェクトの中にtalkというメソッドを定義しました。このメソッドの役割はconsole.logを用いて、記述した文字列をコンソール上に表示することです。`human.talk()`という記述でメソッドが実行され、talkメソッドの処理が実行されます。

#まとめ
・JavaScriptにおけるオブジェクトとは、データや処理といった情報を1つにまとめた集合体。
・JavaScriptにおけるプロパティとはオブジェクトのデータにあたるもので、ハッシュを用いて記述することができる。
・JavaScriptにおけるメソッドとはオブジェクトのプロパティに紐づけられた処理のこと、関数を用いて記述することができる。

　

※補足等ありましたらコメントいただけると幸いです。
Javaでリストをソートをする方法【Comparator】

##目的
Javaのリストをソートしたい。

※データベースからとってくる結果であれば、order byでソートが普通。
画面の項目をソートなど、やむを得ずにJava側でソートしたいときをイメージ。

##やりたいこと
配列なりエンティティクラスといった複雑なオブジェクトのリストをソートしたい。
筆者はエンティティクラスをあれこれする機会が多いため、それを例に説明。

###イメージ

####①画面

例えば、祝日を入力するこんな画面があったとする。
![イメージ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2527642/c37f8e1b-c8f4-4918-d2e3-fd92dd850285.png)

「この日は例外的に仕事あるから休みじゃない」
「逆にこの日は[モンハン休み](https://nlab.itmedia.co.jp/nl/articles/2103/24/news092.html)だから休みにする」
みたいな感じで独自の祝日を追加したり減らしたあとに
ソートボタンで、ソートできるようにしたい。

####②祝日エンティティクラス

	public class Holiday {
		// 祝日の日付
    	private String holidayDate;
		// 祝日の名前
    	private String holidayName;
		
		public setHolidayDate(String holidayDate){
			this.holidayDate = holidayDate;
		}
	
		public setHolidayName(String holidayName){
			this.holidayName = holiName;
		}
	
		public String getHolidayDate(){
			return this.holidayDate;
		}
		
		public String getHolidayName(){
			return this.HolidayName;
		}
	}

####③祝日フォームクラス

	public class SortForm {
        //  エンティティクラスのリスト
        private List<Holiday> holiday = null;
		
		public setHoliday(List<Holiday> holiday){
			this.holiday = holiday;
		}
		
		public String getHoliday(){
			return this.holiday;
		}
	}

##結論

Comparatorのメソッドを作ってあげればよし。

###処理クラス

    /**
     * ソートボタンを押したときの記述をSpringっぽくしてみた
     * @param   form ソートする画面のフォームクラス
     * @return  遷移先   
     **/
	@RequestMapping(value = "sortTabel")
	private String sortTabel(SortForm form) {
	
		List<Holiday> holidayList = form.getHoliday();
		
		// ソートする
	    Collections.sort(holidayList, new HolidayListComparator());

		// 画面に移動
	    return "jsp/hoge/hoge.jsp";
	}
	
    /**
     * 任意のソートキーを設定
     * @return  比較結果
     **/
	public class HolidayListComparator implements Comparator<Holiday> {
	
		@Override
		public int HolidayComparator(Holiday h1, Holiday h2) {
			return h1.holidayDate < h2.holidayDate ? -1 : 1;
		}
	}

結果
![イメージ2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2527642/74aca446-2719-1c03-ffa9-bdc7d475e1aa.png)

##あとがき

基本的には、参考記事にあるArrayListのソートと同じことをしている。
テスト画面をサクッと作る必要があって、インナークラスを使いつつ実装。
コーディングのきれいさとやらはガン無視。

3年目くらいのときにふとつまづいたのを思い出したので、コピペと言われればそれまでだが、フェイクを混ぜつつ備忘録として。

##参考記事

「ArrayList 要素のソートと Comparator」
https://java.keicode.com/lib/collections-sort.php

「【Java】getter・setterのメモ」
https://qiita.com/takahirocook/items/27828bc8477735612021

「内部クラスの使いどころ」
http://blogs.wankuma.com/nagise/archive/2007/08/01/88273.aspx
LinuxでのTCP通信の処理(SYN_SENT)

# TCPプロトコルについて
```C
struct proto tcp_prot = {
	.name			= "TCP",
	.owner			= THIS_MODULE,
	.close			= tcp_close,
	.pre_connect	= tcp_v4_pre_connect,
	.connect		= tcp_v4_connect,
	.disconnect		= tcp_disconnect,
	.accept			= inet_csk_accept,
	.ioctl			= tcp_ioctl,
	.init			= tcp_v4_init_sock,
    ...
}
```
TCPプロトコルのconnectは「tcp_v4_connect」関数から始まっているのが分かる
## tcp_v4_connect関数

```C
int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
{
    ...
	tcp_set_state(sk, TCP_SYN_SENT);
	...
	err = tcp_connect(sk);
    ...
	return 0;
    ...
}
EXPORT_SYMBOL(tcp_v4_connect);
```

送信ポートや宛先IPなどの処理は端折っていますが、「TCP_SYN_SENT」状態にした上でtcp_connectを行っている。

## tcp_connect関数

SYNのパケットの作成、(IPレイヤへ)送信を行うため様々な関数を呼んでいます。

```c
int tcp_connect(struct sock *sk)
{
    tcp_connect_init(sk);

	buff = tcp_stream_alloc_skb(sk, 0, sk->sk_allocation, true);
    tcp_init_nondata_skb(buff, tp->write_seq++, TCPHDR_SYN);
	tcp_connect_queue_skb(sk, buff);
	tcp_ecn_send_syn(sk, buff);
	tcp_rbtree_insert(&sk->tcp_rtx_queue, buff);

	/* Send off SYN; include data in Fast Open. */
	err = tp->fastopen_req ? tcp_send_syn_data(sk, buff) :
	      tcp_transmit_skb(sk, buff, 1, sk->sk_allocation);
	if (err == -ECONNREFUSED)
		return err;

	/* Timer for repeating the SYN until an answer. */
	inet_csk_reset_xmit_timer(sk, ICSK_TIME_RETRANS,
				  inet_csk(sk)->icsk_rto, TCP_RTO_MAX);
	return 0;
}
EXPORT_SYMBOL(tcp_connect);
```
# 参考文献
https://wiki.bit-hive.com/linuxkernelmemo/pg/IPv4%20%E9%80%81%E4%BF%A1%E5%87%A6%E7%90%86
https://elixir.bootlin.com/linux/latest/source/net/ipv4/tcp_output.c#L3807
https://elixir.bootlin.com/linux/latest/source/include/net/tcp.h#L458
【Unity】VContainerを使用して最短で依存コンポーネント注入

# はじめに
Extenject,Zenjectの更新が2020年から止まっているようですので、代替候補のDIパッケージ「VContainer」を試してみました。
毎回公式から手順を探すのは辛いので最短で実現できる手順のメモを残します。

# VContainerとは

以下公式サイトです。

https://vcontainer.hadashikick.jp/ja/

# 試したこと
使用例としてButtonゲームオブジェクトに依存しないようにGameMangerコンポーネント内でButtonイベントを登録してみました。

# 利用手順
* "root/Packages/manifest.json"ファイルの"dependencies"に以下を追記する。

```root/Packages/manifest.json
"jp.hadashikick.vcontainer": "https://github.com/hadashiA/VContainer.git?path=VContainer/Assets/VContainer#1.10.0",
```
※バージョン部分はその時の最新versionに書き換えること。

* シーンに適当にボタンを配置する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/30c63000-194d-226c-0615-d5d7337ac3ea.png)
* 配置したボタンゲームオブジェクトに"MainButton"スクリプトをアタッチする。<br>
スクリプトは編集不要。

```cs:GameManager.cs
using UnityEngine;

public class MainButton : MonoBehaviour
{

}
```
* GameManagerオブジェクトを作成し、GameManagerスクリプトをアタッチする。<br>

```cs:GameManager.cs
using UnityEngine;
using UnityEngine.UI;
using VContainer;
public class GameManager : MonoBehaviour
{
    Button _mainButton;

    private void Awake()
    {
        _mainButton.onClick.AddListener(OnButtonClicked);
    }

    private void OnButtonClicked()
    {
        Debug.Log("ボタンが押されました");
    }

    [Inject]
    public void Constructor(MainButton injectMainButton)
    {
        // Awakeより先に呼ばれてコンポーネントを注入する
        _mainButton = injectMainButton.GetComponent<Button>();
    }
}
```
ちなみにこの状態でゲームを起動してもConstructorは動作しない。

* GameLifetimeScopeスクリプトをGameManagerにアタッチする。
このスクリプトに注入させたいコンポーネントを記述する。
注入するコンポーネントのインスタンスはゲーム開始時に自動で検索するので明示は不要である。

```cs:GameLifetimeScope.cs
using VContainer;
using VContainer.Unity;

public class GameLifetimeScope : LifetimeScope // LifetimeScopeを継承
{
    protected override void Configure(IContainerBuilder builder)
    {
        builder.RegisterComponentInHierarchy<MainButton>();
    }
}
```
* InspectorからGameLifetimeScopeコンポーネントのAutoInjectionGameObjectsにGameManagerオブジェクトをアタッチする。<br>これによりGameMangerスクリプト内の[inject]アトリビュートが付与されたConstractorメソッドが動作するようになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/ba968492-e773-761d-1527-5eb21286f471.png)

* ゲームを起動してボタンをクリックする。
GameManagerからはButtonゲームオブジェクトを参照していませんが、イベントの発火に成功しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/f40ac03e-3c63-457d-0005-a782c3ecd310.png)
Oracle アーキテクチャ

# SGA（システムグローバル領域）
インスタンス起動時に割り当てられるメモリー領域。
プロセス間で共有されるデータが保管される。

### SGA内にあるコンポーネント
- データベースバッファキャッシュ
    - データファイルから読み込んだブロックをキャッシュする
    - 変更されたブロックをデータファイルに書き出す前に一時的に保管する（バッファ機能）
- REDOログバッファ
    - REDOログファイルに書き込む前のREDOデータ（変更履歴）を一時的に保管する
- 共有プール
    - 解析済みのSQLやデータディクショナリの情報などをキャッシュする
- Javaプール
    - Java言語で記述されたストアドプログラムの実行に使用される
- ラージプール
    - バックアップや並列処理などの作業領域として使用される

# プロセス
## バックグラウンドプロセス
### Oracleの主なバックグラウンドプロセス
- データベースライター(DBWn)
    - データベースバッファキャッシュ内の変更済みのブロックをデータファイルに書き込む
- ログライター(LGWR)
    - REDOログバッファのREDOデータ(変更履歴情報)をREDOログファイルに書き出す
- チェックポイント(CKPT)
    - データベースライター(DBWn)に対して、データベースバッファキャッシュ内の変更済のブロックをデータファイルに書き込む指示を出す
    - 制御ファイルにチェックポイントの情報を書き込む
- システムモニター(SMON)
    - インスタンスが異常終了した場合、次回インスタンス起動時にデータベースファイルの整合性を復旧する処理を実行する
    - 未使用の一時セグメントを解放する
- プロセスモニター(PMON)
    - プロセスが異常終了した場合、そのプロセスが使用していた様々なデータやリソース後処理（クリーンアップ）を実行する
    - アイドル時間を超えたセッションを検知し、強制終了などの対処を指示する
- 管理モニター(MMON)
    - AWRスナップショットなど、性能分析で使用される様々な統計情報を定期収集する
- アーカイバ(ARCn)
    - ログスイッチの発生後、REDOログファイルのREDOデータをアーカイブログとしてコピーする
- リスナー登録プロセス(LREG)
    - インスタンスに関する情報をリスナーに登録する 

## PGA(プログラムグローバル領域）
- 特定のOracleプロセス専用のメモリー領域
- そのプロセス専用であるため、プロセス間で共有されることはない

　　　　※SGA内のデータはすべてのOracleプロセスで共有される

## サーバープロセス
- データファイルからデータブロックを読み込み、バッファキャッシュに配置する
- データベースバッファキャッシュに配置されたデータブロックの変更


### RAC構成(Real Application Clusters)
- 通常、１つのデータベースに対して、２つ以上のインスタンスを割り当てる
- 複数のインスタンスを起動する事により、可用性を高める。(クラスター構成)


### セッション
- ユーザがインスタンスにログインしている状態
- ユーザプロセスとサーバプロセスの間に確立


# 記憶域構造
オブジェクト　１対0or1　セグメント
表領域　１対複数　データファイル　
表領域　対複数　セグメント（テーブルやインデックス）
セグメント　対複数　エクステント　対複数　データブロック（2KB〜32KBの固定サイズ）
[React] Component を再レンダリングさせない！

# Reactにおける再レンダリング
Reactで各compnentが再レンダリングされてしまう条件は以下の3つです。
1. stateの更新
2. propsの更新
3. 親component の更新

1,2はいいでしょう。定義したstateやpropsが変化すれば当然componentは変化してほしいわけです。
（stateやpropsがバケツリレーされていないのが前提。もしその場合はグローバルな値にするとか別の方法探してください。）

問題は3です。
親componentを更新したいだけなのに、その中に含まれる子component（以下孫、ひ孫....）まで更新されちゃたまったもんじゃないですよね。
折角Reactで書いてるんだから、そんないかにも重くなりそうなことしたくない。。。

#そんな時には！
そんな問題を解決するためにはメモ化！

##memo
```javascript:memoの使用
export const ExComponent = memo((props) => { return (hogehoge) })
```
memo()で括ってやれば、親componentの更新影響を受けなくなります。

# いや待ってくれ！memo化しても更新されたぞ？？嘘つきか？
例えばこんなcomponent。


```javascript:App.jsx
export default function App() {
  const [exText, setExText] = useState("");

  const changeExText = (e) => {
    setExText(e.target.value);
  };

  return (
    <>
      <Child changeText={changeText} />
    </>
  );
}
```

```javascript:Child.jsx
const Child = memo((props) => {
  const { changeExText } = props;
  return (
    <>
      <input type="text" onChange={changeExText} />
    </>
  );
});
```

親Componentで設定した関数を子Componentに受け渡して処理。
でも必要なステートは親の中だけだし、更新されるのは親だけと思っていたら、この場合、親子どちらも更新される。
memo化はしたのだが。。。

## 関数のメモ化はuseCallbackを使え
上記の原因はズバリpropsで受け渡した関数。
親コンポーネントのpropsで子コンポーネントに関数を渡すと、関数の内容が同じでも子コンポーネントでは「毎回新しい関数が渡されている」と判断されてしまうらしい。まあ確かにそう見える。。。

そんな時にuseCallbackの出番。

```javascript:App.jsx
const changeExText = useCallback(
    (e) => {
      setExText(e.target.value);
    },
    [setExText]
  );
```

useCallbackを使えば上記のような再レンダリングは起こらない。
使い方はuseEffectと同様なので、簡単だ。


# まとめ
できるだけ重くないreactを書きたい時にはmemo/useCallbackを駆使して再レンダリングをできるだけ抑えるべし。
Microsoft Loop(Loopコンポーネント)を触ってみた感想

# はじめに
## Microsoft Loopとは
https://www.microsoft.com/ja-jp/microsoft-loop?ms.url=microsoftcommicrosoft-loop

感想を一言で表現すると、「Notionっぽい何か」。

※現時点では、「Loopコンポーネント」のみが利用可能である。
したがって、本記事ではLoopコンポーネントに焦点をあてる。

## Loopコンポーネントはどこから使えるのか
Teamsチャットから利用できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684495/6f36cf36-62d7-9a6e-087b-239bffbd379d.png)


# 良いところ
## マークダウン記法に対応している
OneNoteと比較してとても良いと感じた点。
`//`でコメントを記入したり、`@`でメンションを入れられたりと、何かとモダンな書き心地がGood。

## 汚くなりにくい
OneNoteと比較して、良い意味で自由度が低い。(例：横に無限に拡張できない)
これにより、チームでなるべく綺麗な状態のファイル保持が可能になると思った。

## 同時編集でコンフリクトしにくい
これもOneNoteと比較して良いと感じた点。


# 改善してほしいところ
## (チャネル会議で利用しても)保存先は作成者のOnedriveになる
「チャネル会議で作成したらSharepointでは？」と思ったら違った。(いずれ改善されるであろう。。)
※保存先を手作業でSharepointに移すことは可能なので、気になる方には毎回手作業で移すことを推奨する。

## タスクリストがPlannerやMicrosoft To Doと連動しない
タスクをPlanner・Microsoft To DOで一元管理したいので、連動しないと使う気になれない。
(これもいずれ改善されるような気がする)

## メンション→メール通知という仕様
メールではなくTeamsで通知が受け取れるようになると良い。
また、メンションがついた場所を明示してくれると良い。

## 余白設定が微妙
Notionでは、「見出し1」の上部にちょうどいい感じの余白が発生するのに対して、
Loopコンポーネントではこれがない。

### Notionの場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684495/f00b8b48-e4fd-bed6-295f-27876a36056e.png)

### Loopコンポーネントの場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684495/4f3f106e-3c81-7ae0-f380-10ae4e347681.png)


# まとめ
今後の本格展開がとても楽しみなツール。

現状のLoopコンポーネントの機能だけでも、十分に活用の余地はある。
しかしながら、 「OneNoteから今すぐ全部Loopに移行しよう！」というレベルにはまだ達していない。
今後リリースされるLoopワークスペースの利便性によって判断するのが良いと考えられる。

Notionのような「細かいところにしっかり手が行き届いている」感は特に感じられなかったので、今後の機能追加に期待。


# 関連ページ
https://prius.cc/itya/20211202_please-microsoft-loop
Elixir Phoenix （小ネタ） プライマリキー名を変えたりあれこれ

# やりたいこと
主キー名をidから変えたい。intじゃなくてbigintにしたい。複合キーもできたらやってみたい。

# なぜやりたい？
業務で使いたいなーと思ってるけど、
主キーにテーブル名をつけたい　（例えば`customer`テーブルの主キーを`customer_id`とか`cst_id`とかにしたい） 人がいたりするんで
この辺解決しないと抵抗されると思ったから。

# ということでやってみます
`customer`テーブルのキー名を`id`から`cst_id`に変更してみます

## まずは`phx.gen.html`でテンプレートもろもろ作成
※phoenixのプロジェクトは作成済みの想定です

```bash
$ mix phx.gen.html People Customer customers cst_name:string cst_email:string
```
## migrationファイルの編集
`priv/repo/migrations/<日付+タイムスタンプ>_create_customers.exs`を開いて、以下のように設定

```elixir
  def change do
    create table(:customers, primary_key: false) do
      add :cst_id, :integer, primary_key: true
      add :cst_name, :string
      add :cst_email, :string
      timestamps()
    end
  end
```

`create table(:customers, primary_key: false)`と
`add :cst_id, :integer, primary_key: true`がポイントのようです。
デフォルトをOFFにして、かわりに任意のカラムをONにしているような感じでしょうか？

## migrationの実行

`mix ecto.migrate`

## schmeに設定追加

モジュール`defmodule <アプリ名>.<コンテキスト名>.Customer`を開いて編集します

<変更前>

```elixir
  schema "customers" do
    field :cst_email, :string
    field :cst_name, :string

    timestamps()
  end
```

<変更後>

```elixir
  @primary_key {:cst_id, :id, autogenerate: true}
  @derive {Phoenix.Param, key: :cst_id}
  schema "customers" do
    field :cst_email, :string
    field :cst_name, :string

    timestamps()
  end
```

`@primary_key`と`@derive`を追加しています。
`@primary_key`は主キーフィールド名、タイプ、オプションとなっていて、デフォルトだと
`{:id, :id, autogenerate: true}`となってるそうです。
https://hexdocs.pm/ecto/Ecto.Schema.html#module-schema-attributes

なんかこれだけでいけそうな雰囲気はしますが実際には
`@derive`が必要みたいです。
https://hexdocs.pm/phoenix/Phoenix.Param.html

##　ルーティングの追加

idがデフォルトの時と同じように

`routes.ex`の`scope "/",<アプリ名> do`
の中に
```elixir
resources "/customers", CustomerController
```
を追加するだけでOKです。

## 確認１

サーバーを立ち上げて

```
iex -S mix phx.server
```

http://localhost:4000/customers

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2245296/a5cc87e7-663e-4965-2f5b-8fa7a689ef35.png)

にアクセスして追加、更新、表示、削除など、普通に出来ました。

## 確認２
本当にidが変わってるかテーブルを見てみます。
※SQLite3を使用しています。
使い方（手前味噌ですが）：https://qiita.com/ko-tk/items/ab5e585d01bbf197c569

idが`cst_id`になっており、インクリメントされていることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2245296/e9070581-3d53-f993-a03e-e51bc2939c28.png)




以上。

じゃない。複合キーもやってみたいとか言いながら忘れてた。追記。

以下試してないけど、こんな感じで行けるんじゃなかろうか。
見つけてきたのが結構古いバージョンだから確かなことは言えませんが。。
参考：https://phoenixframework.readme.io/docs/ecto-custom-primary-keys

migrationファイル

```elixir
  def change do
    create table(:customer, primary_key: false) do
      add :cst_no, :string, primary_key: true
      add :cst_type, :string, primary_key: true
      add :name, :string
      add :age, :integer
  . . .
```

スキーマ

```elixir
  @primary_key false
  schema "customer" do
    field :cst_no, :string, primary_key: true
    field :cst_type, :string, primary_key: true
    field :name, :string
    field :age, :integer
  . . .
```
gcloudコマンド一覧

# GCPのgcloudコマンド備忘録
初めて自分で記事を書くため、見づらいかもしれませんがお許しを、、
現在も勉強中のため随時更新します！！

##GCE
###instanceに対する操作

- start：起動
- stop： 停止
- create：インスタンス作成
- set-[設定項目]：インスタンスの設定変更
    - 例.set-machine-type：マシンタイプを変更
- attach-[対象]：対象をインスタンスに割り当てる
    - 例.set-machine-type：マシンタイプを変更
- delete-[対象]：対象を削除
        - 例.delete-access-gonfig：ComputeEngine仮想マシンのネットワークインターフェイスのアクセス構成を削除 
- add-[対象]：対象を追加
    - 例.add-access-config：ComputeEngine仮想マシンのネットワークインターフェイスのアクセス構成を追加

###diskに対する操作


- snapshot：スナップショット作成
- create：ディスク作成
- resize：サイズ変更

###addressに対する操作
- create：静的外部IPアドレスを予約
CloudWatchアラームで設定した請求金額を超えたらメール通知する


# はじめに

個人開発でAWSを利用している方やサーバー周りの経費を削減したい会社さんは少なからずいらっしゃると思います。
あらかじめアラートを受けることができたらサーバーをサイズダウンするなどして対策が取れるかと思います。
請求金額を超えたらメールでアラート通知がほしいといった方のためにぜひ参考にしていただけたらです。

## 目次

- AWS SNSでトピックを作成する（通知を受け取るメールアドレスの登録）
- AWS SNSでサブスクリプションを作成する
- 請求設定の請求アラートを有効化する
- CloudWatchアラーム設定をする

## AWS SNSでトピックを作成する（通知を受け取るメールアドレスの登録）

- Amazon SNS＞左のメニュー トピック＞トピックの作成を押下
- タイプはスタンダードを選択
- 名前を入
- トピックの作成を押下 


![スクリーンショット 2022-02-14 23.26.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1138611/c06f48de-9b3d-4365-1f9d-2f4121c796c1.png)

## AWS SNSでサブスクリプションを作成する

Amazon SNS＞左のメニュー トピック＞サブスクリプション＞サブスクリプションの作成を押下
![I9cDrsV5FpdYBfG1644850388_1644850540.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1138611/51ac1e55-683e-7080-c096-bbfe91215cde.png)


- プロトコルは今回「Eメール」を選択します。
- エンドポイントにアラートを受け取るメールアドレスを記入します。
- サブスクリプションの作成を押下します。

![hxtxIFasBr0aHNn1644850611_1644850747.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1138611/fed0e5b7-09b0-78fe-4885-6c7a638f21bf.png)


トピック＞サブスクリプション
に先程追加したメールアドレスが表示されています。このメールアドレスにAWSから認証確認のメールが届くので、開いたら「confirm subscription」をします。

するとステータスが「保留中の確認」から「確認済み」となるはずです。





## 請求設定の請求アラートを有効化する

右上のアカウント＞アカウント＞左メニューの請求設定から以下のチェックボックスにチェックします。
<img width="100%" alt="請求設定" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1138611/f8696d83-201c-85d5-81af-c9dfa7a6e332.png">


## CloudWatchアラーム設定をする

cloudwatchのコンソールに移動し、**リージョンは「米国東部バージニア北部」**にします。

ちなみに、リージョンをバージニアにするのは
>請求メトリクスデータは米国東部 (バージニア北部) リージョンに保存され、世界全体の請求額として表されます。

↑東京リージョンもその他リージョンも請求はバージニアで管理しているかららしいです。


左メニューのアラーム＞すべてのアラーム＞アラームの作成と進みます。


<img width="100%" alt="アラームの作成" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1138611/2c950e77-0e8b-8e7c-ca34-09f3dd06abdb.png">

メトリクスの選択を押下します。

<img width="100%" alt="アラームの作成" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1138611/0dd8a52a-145e-25ab-60f5-203038a27eb4.png">

請求＞概算合計請求額＞EstimatedChargesをチェック＞メトリクスの選択を押下します。
<img width="100%" alt="アラームの作成" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1138611/9d86e79b-f6fd-3915-aa4e-55c0feecd454.png">

請求アラートの金額を設定＞次へを押下
今回はテストとしてしきい値に **1 USD**と設定しました。

![スクリーンショット 2022-02-14 23.22.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1138611/15805cca-7fc6-d9b4-14d7-65f0c9e3efa7.png)

・SNSのトピックの選択
→既存のSNSトピックを選択
・通知の送信先
→先程作成した「billing-alarm-topic」を選択


![スクリーンショット 2022-02-14 23.39.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1138611/60533846-0130-3f44-3c9d-ca24beb728ef.png)

次へを押下

・アラーム名を入力＞次へ＞アラームの作成

![スクリーンショット 2022-02-14 23.41.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1138611/517f4ecd-2ce9-b428-d35e-99002658c515.png)


## 確認
今回は$1を設定したので予想請求金額が$1を超えたらメールが届くことを確認できると思います。

## 最後に
アラーム作成時点で設定したしきい値が現在の予想請求金額より低い場合は、アラームを作成したら即時にメールが配信されます。




## 参考
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/monitor_estimated_charges_with_cloudwatch.html
【Rails】rack-corsの設定方法

## はじめに
　本記事は、プログラミング初学者が、学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。
　そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。
　間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。

## rack-corsの設定方法

```config/initializers/cors.rb 
# Be sure to restart your server when you modify this file.

# Avoid CORS issues when API is called from the frontend app.
# Handle Cross-Origin Resource Sharing (CORS) in order to accept cross-origin AJAX requests.

# Read more: https://github.com/cyu/rack-cors

Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    # 許可するオリジンを記述（APIを叩く側のドメインを記述）。
    origins 'localhost:3000'

    # 許可するリソースファイルを記述
    resource '*',
      headers: :any,
      # 許可するHTTPヘッダーを記述
      # ヘッダー情報を外部に公開
      expose: ["access-token", "expiry", "token-type", "uid", "client"],
      # 許可するメソッドを記述
      methods: [:get, :post, :put, :patch, :delete, :options, :head]
  end
end
```
Power Automate Desktopをタスクスケジューラーを使って自動化

こんにちは。私は小売業の本社スタッフとして勤務しています。
最近デジタルの勉強を始め、定型作業の自動化が出来ないか考えています。
自動化するにあたって使用するツールとしてPower Automate Desktopで考えましたが、
有償版を使用してスケジュール管理機能を使用しないと完全な自動化出来ないとわかりました。
会社の環境上有償版を入れる事が難しく他の方法を調べたところ、PC機能のタスクスケジューラと実行用ファイルを作成する事で、毎日の定期実行が実現出来そうとわかりました。
初心者でも簡単に試せますので気になる方は参考にして下さい。

#処理イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2476728/3f41b86d-a2de-2881-956a-293679bb40aa.png)
#1.処理に必要なファイル作成用スクリプトの作成
今回作成したのは「trigger.vbs」というスクリプトを作成しました。
といってもやった事はデスクトップのメモ帳を開き下記内容を入力して保存。
名称を「trigger.vbs」にしただけです。（メモ帳の中身）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2476728/a0ba24ce-be6a-45c3-fd31-79fe9a028617.png)
コードは以下のコピーで出来ます。

```
Dim fs
Dim fn
 
'ファイル作成、パスは半角だけを推奨
Set fs = WScript.CreateObject("Scripting.FileSystemObject")
Set fn = fs.CreateTextFile("C:\wk\trigger.txt")
 
'後処理
fn.close
Set fs = Nothing

```
Set fn = fs.CreateTextFile("C:\wk\trigger.txt")は実行した時の格納先です。
私の場合はCドライブのwkに格納する設定にしたのですが、格納先は自由に変えて下さい。
#2.タスクスケジューラに登録
基本タスクの設定からタスクを作成します。名称や説明は適当に入力。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2476728/05b1891e-d6cb-94d3-13d2-a3c1ab7c4dd6.png)
起動するタイミングを設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2476728/9caea62a-43d2-391d-21a8-db6dff4ff300.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2476728/2176f4fb-deb9-975e-c4f5-0dfd349efc8e.png)
操作はプログラム開始を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2476728/a9b17e0e-de08-4dbb-68e1-ce73868df7d4.png)
先ほど作成した「trigger.vbs」を指定して完了すれば終わりです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2476728/8f1be336-88c0-3f59-c747-c09cce66ac40.png)
ここまでで自動的にファイルが作成される処理が完成しました。
#3.Power Automate Desktopの設定
ファイルが存在するかどうかの処理を作成します。完成イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2476728/f20331a4-daaa-f9f4-4653-b55ebefa3ecf.png)
##1行目　無限ループ作成
ループ条件を選択して最初のオペランドと2番目のオベランドに「1」を入れます。
これにより実行するとエラーが無い限り動き続けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2476728/095da1c2-b957-90c0-fe7a-9a3ef6393575.png)
##2行目　アクションの中のファイル→ファイルが存在する場合を選択します。
ファイルが次の場合は「存在する」ファイルパスは先ほどトリガーで指定したファイルを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2476728/697bfacf-ef5d-cfda-4110-fe0821df711e.png)
私の場合はC:\wk\trigger.txtを指定したのでこのように指定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2476728/0e6c137b-d0a2-b2a3-23e0-734242a737c4.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2476728/0381ca02-af76-d1dd-59d1-2f517008ce91.png)
##3行目　自動実行したい処理を追加
ここではOutlookの起動にしていますが、Excel起動やEdge起動など可能なので、
毎日の定型作業は自動化出来ると思います。
##4行目　ファイル削除
ファイル削除を入れないと永遠にループするので、処理起動後にファイルの削除アクションを選び
先ほどのファイルを削除した方が良いです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2476728/45760598-631e-b36c-75b3-b1a369497407.png)
#最後に
自動実行出来る様になり幅が広がりました。1時間ごと等の等間隔の場合はメール送信をトリガーにするのも良いかと思います。あと、Power Automate Desktopをずっと起動しっぱなしになるので、
負荷を考慮するとwaitなどを使って10分間隔を空けるなど入れた方が良さそうです。