OmniAICreator/Qiita-1.07M huggingface dataset:
RPAとiPaaSの違い

# はじめに

RPAとiPaaSって似ているところありますよね。
どちらも、一般的なシステムと違って独立した業務機能を提供するものではなく、システムが乱立していることによって発生している無駄な作業を削減することが主な期待となるツールです。
Workato（iPaaS）をお客様へ紹介する際に、「RPAと何が違うの？」と聞かれることがよくあるのでこの場を借りて説明したいと思います。


# RPAとiPaaSの機能比較
違いを説明、ということでこういうときは機能比較なので、ぱっと思いつく項目で比べてみます。

||iPaaS|RPA|
|:------------:|:------------:|:------------:|
|API連携|○|△<br>（製品による）|
|DBアクセス|△<br>（製品による）|△<br>（製品による）|
|UI操作<br>（Webブラウザ、オンプレシステム等）|✕|○|
|ローカルPC環境操作|△<br>（ファイル読み書き等限定的）|○|
|対話型操作|△<br>（製品による。Teams、Slack等を利用等）|△<br>（製品による。製品機能として提供等）|
|処理のトリガー|イベント起動（レコード追加、メール受信等）、時刻起動等|手動起動、時刻起動が中心|

製品によると言ってしまえば身もふたもないですが、「iPaaS」「RPA」とひとくくりに言っても、いろんなアプローチの製品があり、機能を絞って扱いやすさをアピールする製品もあれば、なんでもござれと多機能路線に進む製品もあります。

RPA、特にUiPathのような多機能な製品の場合、iPaaSでやれる機能も概ね満たしていることがあります。
機能追加に意欲的な製品はそのツールの範疇を超えて総合的なツールへと進化しています。

世の常として人気が出ることで追加投資が可能となったツールは、他のツールの良いところを取り入れて機能が充実していきます。
「このツールでしかできない」という差別化要素は（もともとあったとしても）徐々に吸収されていくことになります。

# されど餅は餅屋

そういえばですが、かつてRPAが出始めていた頃も、「Seleniumと何が違うの？」「それってVBAでもできるよね？」という問いを受けることがありました。

SeleniumはWebアプリをテストするためのツールで、ブラウザ操作を自動化することができます。

また、VBAについては一般的にはExcelやAccess内の自動化に使われていますが、やろうと思えばメールを送ったりAPIを使ったりといったことができるので、腕に覚えがある人はVBAに色んなことをさせていたりします。

しょせんはプログラムの世界の話であるので、ゴリゴリやろうと思えばやれることは広がりますし、自分の手になじんだツールにどうしても愛着がわきやすくなります。

ただし、それが最終的な最適解かというと議論の余地はあります。
たとえばVBAについて業務の現場の声としてよく言われるのが、「担当者が異動（退職）して誰もメンテできなくなった」。
コードを書く世界だと、どうしても陥りがちなパターンです。
プログラミングをやったことのない人が"Hello, world"から覚えて前任者に追いつくにはいくつもハードルを越えていく必要があります。


では、ローコードツールであるRPAやiPaaSの選択はどうなるか。

RPAは従来のプログラミングに比べたら学習が容易ですし、なんでもできるという意味でつぶしの効くツールです。
全部RPAにやらせればいいんじゃないかと思う人もいるかもしれません。

そうはいっても、RPAはAPIを使うということに特化したツールではないので、ことAPIを使って自動化するというシーンではiPaaSで開発したほうがより簡単に結果を得られます。
なにより、RPAはやれることが多すぎたり、ローカルPCを主戦場とする性格上、ブラウザの画面遷移遅延や画面デザイン変更など、いろんなことに気を配る必要があり、基本的な機能であればすぐに習得できる一方であれもこれもとやりたいことが増えてくると広範に習得コストがかかります。
うちのメンバーは専門家としてRPAエンジニアをやってますが、こういった蓄積が必要な部分に価値があるからこそかと思います。

# 全体最適の発想

また、RPAの活用が進んでいる企業では、ひとつのRPAシナリオのなかにいろんなことを詰め込んでしまうということが起きやすくなったりします。

オンプレシステムでの画面遷移を通じてデータを引っ張ってきて、APIを使ってクラウドシステムへ登録して、処理結果をExcelへ書き込んで、といった操作をRPAで実装すると、ローカルPCでエラーが発生するポイントが何ヶ所もあり、最後まで無事に正常終了する確率が大きく下がってしまいます。
99%の確率で正常終了する処理が5つ直列に並んでいると、全体が最後まで行きつく確率は95%（= 0.99 × 0.99 × 0.99 × 0.99 × 0.99）にまで落ちてしまいます。

せっかくRPAでAPIを活用して手堅いロジックを組んでも、安定性に欠ける画面操作と同居することで本領を発揮できないことが起きえます。

iPaaSにはAPIが活用できるシーンに限定して自動化を担わせて高い稼働率を確保し、RPAには安定性に課題は残りつつもRPAが強みを持つUI操作・ローカル環境の操作の自動化を担わせる。
そのような役割分担によってエラー発生時にもリカバリーの切り分けがしやすい自動化の絵が描きやすくなります。

# 業務ユーザーから見た違い
ここまで言っておいてなんですが、業務ユーザーからしてみると結局のところ、自身の業務を自動化・効率化さえしてくれればツールの違いには興味がないというのが本音ではないでしょうか。

先日、かつてRPA提供側としてお世話になったお客様とお話しした時にも、「ツールなんてなんだっていいんですよ」という声が聞こえてきました。

決定的な違いの無い機能面を比較してどっちのツールがいいという議論を業務ユーザーにぶつけるのは開発側の独りよがりかもしれません。

それよりも、RPAとiPaaSのいいとこどりをして理想的な役割分担を模索することで、業務ユーザーにとってしっくりくる自動化環境を提供することのほうが大事だと思います。


# おわりに

RPAとiPaaSの違いって何なの？って真理を求めてきた方には役に立たない記事になってしまったかもしれません。
大げさな話かもしれませんが、RPAやiPaaSといったそれ自体で完結しないツールを導入するときには、どういった世界を描きたいかという「思想」がより大事になってきます。
このツールにはこの部分を担わせて、といった考え方の軸をはっきり持って導入を進めていただければと思います。

なお、Workato(iPaaS)でどんなコンセプトが実現できるかは[他のメンバーの記事](https://qiita.com/organizations/bstylevt/items)でも紹介しているのでそちらもヒントにしてください。

※ [弊社の概要](https://qiita.com/organizations/bstylevt/profile)はこちら。
Observability Engineering 第１章を読んで

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1010970/294e2927-1278-020d-f371-10a8350eb3c1.png)


SREとしてObservabilityと向き合う機会が増えたので、体系的に学びたいと思い[この本](https://www.oreilly.co.jp/books/9784814400126/)を手に取った。


 ## Observabilityとはなにか
第１章では、「Observabilityとは何か」というテーマと、「従来のMonitoringとの違い」について主に述べられている。


以下は本文の一部を意訳したものである。

> 現代のモダンな分散システムでは、Observabilityは不可欠である。Observabilityを備えたアプリケーションは、以下の能力を備えている必要がある。
> - アプリケーションの内部挙動が分かること
> - 初見でもアプリケーションの状態が理解できること
> - 外部ツールのみを用いて内部挙動と状態を理解できること
> - 新たにコードを追加することなく内部の状態を理解できること

これだけ読んでも意味は分かりにくいかもしれないが、
要するに、**どのようなログを出すべきか、どのようなメトリクスを収集すべきかを事前に定義したり予測することなく観測できる状態こそがObservability**である、ということのようだ。


## 人間と分散システム
現代の複雑なシステムは、技術的な複雑さだけでなく**社会的な複雑さ**も内包していると述べられている。
この社会的な要素が見落とされがちなのかなと思うが、複数の人間によって構築されるものだからこそ社会的・組織的・文化的な部分にも光があたることが多そうである。大学時代社会学部にいた自分にとっては過去の学びを呼び起こすいい機会になるかもしれない。

マイクロサービスや分散システムなどのモダンで複雑なシステムを開発・運用する人であれば理解に時間をかけて損はない内容になると感じた。

[今年輪読会で読んだ](https://podcasters.spotify.com/pod/show/kenwagatsuma/episodes/Designing-Data-Intensive-Application-DDIA-e25dm51)『[Designing Data-Intensive Application](https://www.oreilly.com/library/view/designing-data-intensive-applications/9781491903063/)』とは複雑な分散システムをいかにコントロールしていくか、という点で似たような問題に向き合っているが、全く違う切り口だから飽きることはなさそうだ。

## さいごに

まだ第1章しか読んでいないが、私が「Observability」という概念は一朝一夕では理解できないものということが理解できた。

「Observabilityとは何か」という質問に答えられるエンジニア、またはSREはどれくらいいるのだろうか。自分のチームでもObservabilityという言葉を使ってシステムを監視しているが、実際はこの本で書かれてい**Monitoringの域をどの程度抜けられているだろうか**、と比べながら読んでいくと面白そうだなと思った。

また、Observabilityが達成されると従来のMonitoringは必要なくなるのか、もしくはObservabilityと併用されるべきものなのかも気になった。

Observabilityで鍵となるのは一般的に3本柱といわれるMetrics, Log, Traceではなく、**高いCardinality**、**高いDimensionality**、そして**Explorability**の三つのようだ。
とはいえこの章だけでは具体的にどうしたらいいのかはまだ分からないから、続きが楽しみだ。


## あとがき
*著者の一人のCharity MajorsがCEOの[HoneycombのWebサイト](https://info.honeycomb.io/observability-engineering-oreilly-book-2022)から英語版をダウンロードして読んでいます。日本語や読み取りがおかしいところがあったら教えてください*

English blog is [here](https://tommyasai.fly.dev/posts/observability-engineering-ch1)
Aiven for OpenSearchがGOV.UKに採用されました。

<font color="Grey">*[Aiven for OpenSearch was chosen for GOV.UK [Customer Story]](https://aiven.io/blog/aiven-for-opensearch-was-chosen-for-gov-uk-customer-story)の翻訳です。*</font>

2022年7月4日

# Aiven for OpenSearchがGOV.UKに採用されました[カスタマーストーリー

Aiven for OpenSearchは、英国政府によってGOV.UK Platform as a Serviceの検索に採用されました。

オープンソースのストリーミングとデータ管理技術をクラウドインフラと組み合わせた企業であるAivenは、2018年以来、政府デジタルサービス（GDS）との協業を誇りとしており、政府省庁、独立行政法人、地方公共団体が追加の調達や情報保証のデューデリジェンスなしにAivenのサービスを利用できるよう支援しています。


[GOV.UK Platform as a Service (PaaS)[](https://gov.uk/) 製品は、2015年のGDSの働きかけにより誕生し、現在では60以上の省庁や公共部門組織をホストしている。


GDSは英国内閣府の一部門であり、オンライン公共サービスの提供を変革することを任務としている。2011年に設立されたGDSは、政府が新しい技術プラットフォームを構築する方法を改善し、サービスの公開とデジタル化の方法を変革するために設立された。政府のデジタル戦略の金字塔として広く知られ、米国やカナダ、その他の国々でも同様の取り組みに影響を与えている。


![GOV.UK Customer Story London](https://cdn.sanity.io/images/sczeoy4w/production/92461d4f7b72f09ed7f100d4457450b04f964609-1200x640.jpg?q=80&fit=min&auto=format&dpr=1.5)


GOV.UKのPaaSは、「ガバメント・アズ・ア・プラットフォーム（Government as a Platform）」プログラムの一部であり、共有デジタル・システム、テクノロジー、プロセスからなる共通のコア・インフラを中心に据えたデジタル・ガバメントのビジョンである。


GOV.UKのPaaSにとって主要な要件は、クラウド・ホスティング・プラットフォーム上で強力な検索サービスを提供することである。GOV.UKのPaaSチームは、検索ソリューションを構築するテクノロジーとして、当時のオープンソースプロジェクトであるElasticsearchにすでに決定していました。しかし、API、セキュリティ、情報保証、パフォーマンス、価格などの要件を満たすElasticsearchプロバイダーが必要でした。


そこでGOV.UK PaaSは、商用Elasticsearchサービス・プロバイダーに対する一連の要件を提示した：


* サービスのライフサイクルを管理するためのパブリック REST API
* APIトークンのライフサイクルを管理するAPI
* プラットフォーム全般を管理するAPI
* 完全なコンプライアンスによる強固なセキュリティ
* 高いパフォーマンス
* リーズナブルな価格
* GOV.UKが提供するサービスのギャップを埋めるために、柔軟な姿勢で協力してくれるパートナーであること。


GOV.UKのPaaSチームは、可能な限りオープンソースの技術も利用したいと考えていたため、オープンソースも受け入れてくれるサービスプロバイダーを探していた。


AivenのCTOであるHeikki Nousiainen氏は次のようにコメントしている。2018年に契約が始まって以来、AivenのソリューションはGOV.UK PaaSの要件を満たすことができました。"サービスのすべての側面を管理するAPIを公開している唯一のプロバイダーとして、最終候補に残りました。



ビジネスのオープンソースを維持するためにElasticsearchから離脱していませんか？[ElasticsearchクライアントをOpenSearch®に移行する方法をご覧ください](https://aiven.io/blog/migrate-elasticsearch-client-to-opensearch) in Python, Java and Node.js.


Aivenと私たちのサービスに関する最新ニュースや、オープンソースに関するちょっとした情報を入手するには、[月刊ニュースレターを購読する](https://aiven.io/newsletter)！Aivenに関する日々のニュースは、[LinkedIn](https://www.linkedin.com/company/aiven/)と[Twitter](https://twitter.com/aiven_io)のフィードでご覧いただけます。


サービスアップデートの最新情報を知りたい方は、[変更履歴](https://aiven.io/changelog)をご覧ください。


マネージド・データ・プラットフォームをお探しですか？<https://console.aiven.io/signup>から無料トライアルにお申し込みください！


データインフラの管理にお困りですか？今すぐ<https://console.aiven.io/signup>から無料トライアルにお申し込みください！
私が習った "チーム開発の掟"

# チーム開発はとても大事

会社では必ず、チームでアプリケーションを開発する

何か大きないいサービスを作ろうと思うと、大体チームで作ることになる

## 活躍しているエンジニアの特徴

- HRT
- バリューを出そうとする姿勢
- 円滑なコミュニケーションを取れる
- 自分自身のタスク管理ができる
- プロジェクトマネジメントができる
- チームビルディング
- 開発の生産性



## チーム開発の流れ

1. 自己紹介
1. アイデア決め
1. スライド作成
1. 要件定義
1. 設計
1. タスク出し
1. 実装
1. プレゼン



## チーム開発のポイント

- デザイン大事
- フィードバックで仕上げる
- 自分の作業進捗の透明性を担保する（毎日共有する）
- 逆算思考（ゴールを設定し、逆算して進める）
- 人に依頼する際は明確に（目的、期日、何をすると完了か、リマインド）
- 振返りを毎週行う（自身・チームの進め方について良かった点・改善点・
- 次週以降のアクション）
- 完璧を求め過ぎない
- 自分で言った見積もりは死守する（期日より早くクリアしにいく）
- アラートと対策を早めの事前に上げる（事前かつ正直にできるのが大切）
factory_bot_rails を 6.4.0 にしたら Rails アプリが起動しなくなった

Rails 7.0.8 で開発中のウェブアプリで，factory_bot_rails のバージョンを 6.2.0 から 6.4.0 に上げたら Rails サーバーも Rails コンソールも動かなくなった。

`rails console` とやると以下のようなエラーが出て落ちる。

```
(略)/railties-7.0.8/lib/rails.rb:47:in `configuration': undefined method `config' for nil:NilClass (NoMethodError)

      application.config
```

そのプロジェクトでは Gemfile で factory_bot_rails のバージョンをガチガチに固定してはおらず，当初は，factory_bot_rails のバージョンが変わったことが引き金になっているとは分からなかった。

認証系 gem の [sorcery](https://rubygems.org/gems/sorcery) を使っていたが，いろいろ試しているうち，Gemfile から sorcery を外せばエラーが出なくなることが分かった。

sorcery は開発がやや低調（？）になっていて，Rails 7.0, 7.1 への対応はこれかららしい。
えっ？　もしかして Rails 7 で sorcery 動かないの？？？　と焦ったが，そういうわけではなかった。

結局，現時点（2023-11-20）では，たとえば

```rb:Gemfile
gem "factory_bot_rails", "~> 6.2", "< 6.3"
```

のようにして factory_bot_rails のバージョンを 6.3.0 未満に抑えておけばよい（この不具合は 6.3.0 以上で起こる）。

本件は factory_bot_rails の issue として立てられていた：
https://github.com/thoughtbot/factory_bot_rails/issues/426

そして，既に [修正のプルリクエスト](https://github.com/thoughtbot/factory_bot_rails/pull/432) も作られている。ああよかった。

ところで，sorcery の開発の進捗が気になる。
といっても半年ちょっと前に最新版が出ているし，そのあとも動きがあるので開発は止まっていない。
作者さん（感謝）が思うように時間が取れないようだ。現在，追加のメンテナーを募集している：
https://github.com/Sorcery/sorcery/issues/350
Node.js バージョン管理 比較表

# 比較表
| Tool | macOS | Linux (WSL) | Windows | スター数 (k) | バージョン管理 | プロジェクト切替 | 特徴 | 最終リリース日 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| [nvm](https://github.com/nvm-sh/nvm) | ◯ | ◯ | ✕ | 71.6k | .nvmrc | △ | スタンダード | 2023-08-22 |
| [asdf](https://github.com/asdf-vm/asdf) | ◯ | ◯ | ✕ | 19k | .tool-versions | ◯ | 複数言語の管理 | 2023-09-13 |
| [n](https://github.com/tj/n) | ◯ | ◯ | ✕ | 18.1k | .nvmrc<br>.node-version<br>.n-node-version | ✕ | macOSで導入しやすい | 2023-10-15 |
| [fnm](https://github.com/Schniz/fnm) | ◯ | ◯ | ◯ | 13.9k | .nvmrc<br>.node-version | ◎ | Rust製<br>処理速度が速い | 2023-08-16 |
| [Volta](https://github.com/volta-cli/volta) | ◯ | ◯ | ◯ | 9k | package.json | ◎ | Rust製<br>処理速度が速い | 2023-06-25 |
| [nodenv](https://github.com/nodenv/nodenv) | ◯ | ◯ | ✕ | 2.1k | .node-version | ◯ | anyenv + nodenvの方が多い | 2023-02-19 |
| [nodebrew](https://github.com/hokaccha/nodebrew) | ◯ | ◯ | ✕ | 1k | なし | ✕ | macOSで導入しやすい | 2022-03-19 |

# 参考にさせていただいた記事
https://qiita.com/tak8_al/items/791e8d032bdc13a135de

https://zenn.dev/kshida/articles/compared-and-reviewed-nvm-tools-for-mac

https://zenn.dev/longbridge/articles/ef1cbd17f2f64c
JavaScript DOM


# DOMって何？

```
JavaScriptから、HTMLを操作できる
```

## DOMでHTML要素を書き換えよう

dom.html
```
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>ブログ</title>
</head>
<body>
  <h1 id="dom">ブログ</h1>
  <form id="post-form">
    <label for="title">タイトル：</label><br>
    <input type="text" id="title" name="title"><br>
    <label for="content">本文：</label><br>
    <textarea id="content" name="content"></textarea><br>
    <input type="submit" value="Submit">
  </form>
  <div id="posts"></div>
  <script src="dom.js"></script>
</body>
</html>

```

dom.js
```
var dom = document.getElementById('dom');
dom.innerHTML = "シンプルブログ";
```

これは、
dom.htmlのh1(ブログ)をh1（シンプルブログ）に変更している


## イベントハンドラを設定してみよう　〜なんか凄そう〜

dom/html
```
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>ブログ</title>
</head>
<body>
  <h1 id="dom">ブログ</h1>
  <form id="post-form">
    <label for="title">タイトル：</label><br>
    <input type="text" id="title" name="title"><br>
    <label for="content">本文：</label><br>
    <textarea id="content" name="content"></textarea><br>
    <input type="submit" value="Submit" id="submit">
  </form>
  <div id="posts"></div>
  <script src="dom.js"></script>
</body>
</html>

```



dom.js
```
document.getElementById('post-form').addEventListener('submit', function() {

  // タイトルと本文を取得
  const title = document.getElementById('title').value;
  const content = document.getElementById('content').value;

  // コンソールに出力
  console.log(title);
  console.log(content);
});

```

このコードは、
送信ボタンをクリックすると、
タイトルとコンテンツの文章をコンソールに出力する
CPUについての調査メモ

# CPUとは

基板上に乗っける計算機のことです．
マイコンに乗っている処理速度が比較的遅いものがMPUって呼ばれます．

# CPUの例

## Broadcom BCM2711, quad-core Cortex-A72 (ARM v8) 64-bit SoC

`Raspberry Pi4`に乗っているCPUです．

- `型名` : `BCM2711B0`
- `メーカ` : `Broadcom`
- `コア数` : `クワッド`
- `動作周波数` : `1.5GHz`
- `コア` : `Cortex A-72`

## Broadcom BCM2837B0, Cortex-A53 （ARMv8） SoC

`Raspberry Pi3 Model B+`に乗っているCPUです．

- `型名` : `BCM2837B0`
- `メーカ` : `Broadcom`
- `コア数` : `クワッド`
- `動作周波数` : `1.4GHz`
- `コア` : `Cortex A-53`

# インテル® Core™ i5-1335U プロセッサー (Eコア 最大 3.40 GHz Pコア 最大 4.60 GHz)

`ThinkPad X1 Carbon Gen 11`のプロセッサです．

基本仕様
- `プロセッサ・ナンバー` : `i5-1335U`
- `希望カスタマー価格` : `＄340.00`

CPU仕様
- `コア数` : 10
- `最大周波数` : `4.60Hz`


https://www.intel.co.jp/content/www/jp/ja/products/sku/232153/intel-core-i51335u-processor-12m-cache-up-to-4-60-ghz/specifications.html


# 参考

- ラズパイ4性能の研究②…新型 Cortex-A72プロセッサBCM2711
https://interface.cqpub.co.jp/wp-content/uploads/IF1910_028.pdf

- インテル Core プロセッサ・ファミリー
https://www.intel.co.jp/content/www/jp/ja/products/details/processors/core.html
2023/11/21主にITとかセキュリティの記事

クレカ不正利用が急増　「データ連携」武器に対策急ぐ(11/19)
https://www.nikkei.com/article/DGXZQOCD1366D0T11C23A1000000/

マルウェア感染時、絶対にやってはいけないことは？対処法・調査方法を解説(11/17)
https://cybersecurity-jp.com/column/92008

東京海上日動、代理店システムの設定不備で情報漏えい(11/17)
https://cybersecurity-jp.com/news/91969

Appleの秘密！パリのハッカーが守るiPhoneの安全性(11/19)
https://iphone-mania.jp/news-560018/

年末商戦、クレジットカードのスキミングに警戒を(11/19)
https://news.mynavi.jp/techplus/article/20231119-2819463/

CloudFrontとWAFでIP制限をかけてみた(ハマったポイントの解説あり)(11/19)
https://www.beex-inc.com/blog/WAF_CloudFront

ルイ・ヴィトン、ロレックスなど高級ブランド偽るフィッシングに注意(11/19)
https://news.mynavi.jp/techplus/article/20231119-2821294/

〝誰も傷つかない〟がコンセプトのSNS「DYSTOPIA」は他と何が違う？(11/19)
https://dime.jp/genre/1682136/

セキュリティ評価プラットフォーム「Assured」、ふくおかフィナンシャルグループの活用事例を公開(11/18)
https://japan.cnet.com/release/30916395/?ref=rss

CSPM（Cloud Security Posture Management）(11/20)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600009/111000155/

事業モデル創出こそ生業　DXの先に「IX」を目指す
荒川 朋美 氏　双日 常務執行役員CDO 兼 CIO 兼 デジタル推進担当本部長(11/20)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600003/111000074/

ECサイトの「マイページ」に別人の情報　手軽なクラウド設定に落とし穴か
サンリオ(11/20)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600011/111000144/

3万4千人の認証・認可基盤を刷新　多様な利用者を統制し利便性向上
関西学院(11/20)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600004/110800144/

「IoT機器踏み台攻撃が増加中」、Keysightが脆弱性検査ツール
「EdgeTech+ 2023」開催(11/20)
https://xtech.nikkei.com/atcl/nxt/column/18/01537/00991/

ゼロトラストに「IDガバナンス」が不可欠である理由(11/20)
https://xtech.nikkei.com/atcl/nxt/column/18/02652/111600001/

生成AIで入札や基準読解のサポート、試験導入が進む日本工営や岩田地崎建設(11/20)
https://xtech.nikkei.com/atcl/nxt/mag/ncr/18/00201/110900002/

建設での生成AIの利用解禁が加速、大手建設会社・建コンの8割が容認(11/20)
https://xtech.nikkei.com/atcl/nxt/mag/ncr/18/00201/110900001/

「顧客選別」を進めるITベンダー　空前の技術者不足に強い危機感(11/20)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600007/110800154/
JavaScript（React）で複数ファイルアップロードの読込待ち

JavaScript (React) の複数ファイルアップロードしたときのファイル表示にちょっとはまったので備忘録でメモ
やったこととしては `FileReader` の `onload` のところを `Promise` を待つようにしてる
あとはファイルインプットの `onChange` で使う関数も `async` つけてファイル読込処理を待つようにする
`map` で処理すると待つのにもう一つ関数を作る必要があるので煩雑になりそうなので `for of` でループ処理してます

```jsx
import { useState } from 'react';

const App = () => {
  const [selectImags, setSelectFiles] = useState([]);
  
  // ファイル選択時の処理 async つける
  const change = async (e) => {
    const imags = [];
    // 選択したファイルごとに読込処理 await で待つ
    for (const file of e.target.files) imags.push(await fileRead(file));
    setSelectFiles([...selectImags, ...imags]);
  };

  // ファイル読込処理 async つける
  const fileRead = async (file) => {
    const fileReader = new FileReader();
    fileReader.readAsDataURL(file);
    // await Promise でファイル読込が終わるまで待つ
    await new Promise((resolve) => (fileReader.onload = () => resolve()));
    return fileReader.result;
  };

  return (
    <>
      <p>ファイル選択</p>
      <input type="file" multiple onChange={change} />
      <p>選択したファイル</p>
      {selectImags.map((src, i) => {
        return <img key={'image' + i} src={src} alt={'image' + i} />;
      })}
    </>
  );
};
export default App;

```
Locust　DockerチュートリアルのCould not find 'locustfile.py'を解決する

# Locustとは
LocustはWeb/API向け負荷試験ツールです。

https://locust.io/

Dockerで起動させたりpythonでシナリオを記述できるので勉強がてら触っています。
Dockerのドキュメンテーションも用意されています。

https://docs.locust.io/en/stable/running-in-docker.html

しかし公式イメージをpullしたりDockerファイルのベースイメージと使用した後に
そのままコマンドを実行すると表題のエラーになります。

```
docker pull locustio/locust
docker run -p 8089:8089 -v $PWD:/mnt/locust locustio/locust -f /mnt/locust/locustfile.py

Could not find 'locustfile.py'. See --help for available options.
```
エラーメッセージで検索してもすぐには解決策が分かりませんでした。

# 解決策
結論として **/home/locust/ディレクトリにlocustfile.pyを配置** します
```
#Dockerfileの例
FROM locustio/locust

COPY locustfile.py  /home/locust/
```

エラーメッセージからlocustfile.pyをDockerに読み込ませる必要があると考えましたが
どこのディレクトリに置けばいいか当初は分りませんでした。



locustはデフォルトではカレントディレクトリにあるlocustfile.pyを使用します。
[公式Dockerfile](https://github.com/locustio/locust/blob/3c9484e8c03afbc705dc14a3d8ca839752259dfc/Dockerfile "github.com")を確認してみると`WORKDIR /home/locust`の記述がありますので配置してみたら
無事に起動させることが出来ました。

# おわりに
locustは面白そうなので、盛り上がるきっかけになればと忘備のついでに書いてみました。
JavaScript オブジェクトの使用


# オブジェクトとは？？

結論、`データを格納する手段の1つ`です。

変数、配列、オブジェクト、、、

といった感じです。

jsのコードでよく見かけるであろう、

```
const obj = {
  gender: 'free',
  name: '山田太郎',
  age: 12
}
```

このようなコードは、オブジェクトである

## オブジェクトに関する用語を理解しよう

オブジェクトの中で、

・　「名前：値」

これは、プロパティと呼ぶ

・　「名前：関数」

これは、メソッドと呼ぶ


つまり、JavaScriptは最高である
なぜなら、オブジェクトという面白いものを自分で作れるからだ。

```
const ningen = {
    name : '山田　太郎',
    age : 99,
    getName: function() { console.log(this.name) }
}
```
これは、オブジェクトだが、

```
getName: function() { console.log(this.name) }
```

この部分は、メソッドである

自作の関数をオブジェクト内に定義できるのである。



## プロパティへのアクセスや操作

```
.
```
もしくは

```
[]
```

を使ってできる

```
//関数定義
function printBooks(books) {
  obj = { 書籍名:books[0],著者名:books[1] }//これが、オブジェクト
  console.log("『" + obj.書籍名 + "』" + obj.著者名 );
}

//関数呼び出し
books = [ 'JavaScript入門',"山田太郎" ] // オブジェクトの配列を定義する
printBooks(books)

```

こんな感じ
【供養】Datadog AWS Integration × Terraform で sts:AssumeRole の罠に詰まった

罠ではなく、ただの視野狭窄
謎に詰まったので供養として

# 前提
Terraform 1.5.4
aws provider 5.2
data dog provider 3.32

# 結論だけ
datadogのAWS`arn:aws:iam::464622532012:root`は日本では利用不可
`arn:aws:iam::417141415827:root`を指定すること


# なにがおこったか

公式のブログのようにTerraformを構成した

providerは日本なのでそのあたりだけいれて、後は環境変数に入れています

```terraform:provider.tf

terraform {
  required_version = "1.5.4"
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "5.20.0"
    }
    datadog = {
      source = "DataDog/datadog"
    }
  }
}

provider "aws" {
  region = "ap-northeast-1"
}

provider "datadog" {
  api_url = "https://ap1.datadoghq.com"
}

```

その他の部分はこれをそのままです

https://docs.datadoghq.com/ja/integrations/guide/aws-terraform-setup/

policyに関してはこれをそのまま

https://docs.datadoghq.com/ja/integrations/amazon_web_services/

## そして実行するとでる sts:AssumeRole エラー

https://docs.datadoghq.com/ja/integrations/guide/error-datadog-not-authorized-sts-assume-role/

解決できない...

右に`DATADOG SITE`の文字が...
東京なので`AP１`にすると、account idがちがう...

東京では
`417141415827`を使おう
Swagger-mergerを使ってみた

## 概要
APIのドキュメント管理でOpenAPIを採用したいが、
単純にswagger.yamlを記載する運用にすると1ファイルのサイズが肥大化して管理しにくい。
そこで、yamlファイルを分割して1ファイルのサイズを小さくし、運用しやすくする。
分割状態ではUIに表示されないので、swagger-mergerを使ってマージを行う。

### 想定
- コンテナ起動時において、利用者がOpenAPIの管理フォルダ内のファイルを編集したときに自動でマージされる
- 利用者はlocalhost:8082でRedocにアクセスでき、閲覧できる。
  
## 設定手順
#### フォルダ構成
```
├── openapi/
│   ├── Dockerfile
│   ├── dist/
│   │   └── swagger.yaml
│   └── src/
│       ├── index.yaml
│       └── paths/
│           ├── index.yaml
│           └── metadata/
│               └── index.yaml
└── docker-compose.yml
```

#### docker-compose.ymlの用意
```
version: "3"
services:
  redoc:
    image: redocly/redoc
    container_name: "redoc"
    ports:
      - "8082:80"
    volumes:
      - ./openapi/dist:/usr/share/nginx/html/api
    environment:
      SPEC_URL: api/swagger.yaml

  swagger-merger:
    build:
      context: .
      dockerfile: ./openapi/Dockerfile
    command: >
      watch 'swagger-merger -i /swagger/src/index.yaml -o /swagger/dist/swagger.yaml' /swagger/src/
    volumes:
      - ./openapi:/swagger
```
大切なのはswager-mergerのコマンド設定です。
このコマンド宣言によってOpenAPIの管理ファルダで変更があった時にマージ処理が
自動で実行されるようになります。

#### Swagger-mergerのDockerfile作成
```
FROM node:alpine

RUN npm install -g swagger-merger watch

CMD ["swagger-merger"]
```

#### OpenAPIの用意
openapi/src/index.yaml
```
openapi: 3.0.1
info:
  title: Simple User API
  description: A simple API to retrieve user information.
  version: 1.0.0
paths:
  $ref: "./paths/index.yaml"
```

openapi/src/paths/index.yaml
```
/:
  $ref: "./metadata/index.yaml"
```

openapi/src/paths/index.yaml
```
get:
  tags:
    - metadata
  operationId: list-data-sets
  summary: test api
  responses:
    '200':
      description: test description
```

#### 表示確認
コンテナが起動していれば、
http://localhost:8082
にアクセスすれば表示されます。
起動していない場合は、起動時にもマージ処理が実行されますので、
追加の修正などは必要ありません。

## 統括
ファイル分割で利便性は向上したが、
マージファイルでないとエディターのプレビュー機能での表示確認はできなかった。
一人で管理する分ではどちらでもいいかもしれないが大きいファイルは
運用が煩雑になりがちな認識なので分割して運用したい。
チームで運用する場合は、分割されていることでコンフリクトの発生が低くなるので
余計な手間が減ると考える。
次回は、どんなフォルダ構成がいいかを考える。
WSL2+devcontainer実行時のエラー(Failed to connect to the remote extension host server)対策

# エラー内容

WSLを使っているとき、`Dev Containers: Rebuild Container`をすると以下のようなエラーで失敗することがあります

```shell
Failed to connect to the remote extension host server (Error: stream is closed)
```
```
shell server failed: error: unexpected end of parent stream
```

WSLと干渉しているようです

# 解決方法

## 方法1: VSCodeのWSL接続を止める

1. 別ウィンドウでWSLが開いていたら閉じる
2. VSCodeの左下のボタン(Remote-SSH)がWSLにつながっている状態を確認
3. ボタンを押す > `Close Remote Connection`
4. File > Open Recent > 以前開いていた`DevContainer`を選択

## 方法2: WSLを止める

https://github.com/microsoft/vscode/issues/115818#issuecomment-777183206

issueに書かれている解決策

1. Linux WSLタブとVSCodeを閉じ

2. 管理者権限でコマンドプロンプトを開く

3. `wsl --shutdown`を実行する

4. Linuxタブを再度開く
    - 再度Linuxタブを開き、"code ."と入力

## 方法3: 再起動

諸々リセットされるので、再起動で直る場合もあります
モンティー・ホール問題の条件付き確率の計算方法まとめ

# 概要
モンティー・ホール問題の条件付き確率計算についてはWikipediaの[解説記事](https://ja.m.wikipedia.org/wiki/%E3%83%A2%E3%83%B3%E3%83%86%E3%82%A3%E3%83%BB%E3%83%9B%E3%83%BC%E3%83%AB%E5%95%8F%E9%A1%8C) の「数え上げ」というセクションに詳しく記述がある。この記事の解説をベースに、不要な混乱を極力減らすべく、問題の構造や議論の方針・コツなどについて整理し、分かりやすくまとめ直したものをここに記す。

モンティー・ホール問題設定そのもののついては解説記事を参照されたし。
# 内容
![IMG_0135.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1240365/bf2f28c6-51b6-a364-538f-51e01cbf526d.jpeg)
![IMG_0136.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1240365/f3c7e7b6-7b20-a6ad-eaea-261b0eabd97f.jpeg)
![IMG_0137.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1240365/df94c058-d674-45c4-b9a7-9106fc898ec1.jpeg)
Dockerについて　わかりやすく解説　｜　Dockerとは

# Dockerとは

結論、`仮想環境を動かす仕組み`のこと

ざっくりとしたイメージは、

Docker社が開発した、パソコンの中に、パソコンを作れるようなサービス

Docker ＝　仮想環境を作れるソフトウェア



## Dockerのメリット

`仮想環境を作れること`

```
仮想環境を用意できれば、アプリケーションを作る際に、仮想環境でアプリケーションを構築、開発、テスト、リリース、運用できる
すると、いいことが結構ある
```

・ チームで開発するときに、楽
・ エラーを見つけるのが、楽



## 具体的に、何を用意したら良いか

3つだけ

1. Docker
2. イメージ
3. コンテナ


## 注意点

1. Dockerを削除しても、PCに容量が残るので、```dokker system prune```で、完全に削除する必要があるぞ

2. Dockerでは、1つのOS（そのPCのOS）のみを使うことができる、別のOSを使いたい場合には、VMwarePlayerを使うと良い
【言語処理100本ノック 第5章】Google Colab上でGraphvizの日本語が文字化けした時の対処法

# はじめに
[言語処理100本ノック 第5章: 係り受け解析](https://nlp100.github.io/ja/ch05.html)にて、Graphvizを用いてデータの木構造を可視化する問題がある（44問）。

この際、普通にGoogle Colab上で日本語を可視化しようとすると文字化けが起こる。

pltの文字化けなどはググれば一瞬で出てくるが、GraphvizなおかつGoogle Colab上だと解決策がなかなかヒットしなかったのでメモ。

結論としてはPythonのコードをいじるのではなく、ランタイムが乗っているOSに直接フォントを入れることで解決した。

## 実行環境
Google Colab ランタイム（2023年10月25日時点）

## コード
まずは手を加えず生のcolabで実行。
```python:google colab
from graphviz import Digraph
from IPython.display import Image, display

!mkdir images

# 計算グラフの構造を定義
g = Digraph(f'G_test', directory='./images',format='png',)

# ノードの追加
g.node('node1', 'japanize_matplotlibだと')
g.node('node2', '文字化けが')
g.node('node3', '治らない \\\(^o^)/')

# エッジの追加
g.edge('node1', 'node2', label='')
g.edge('node2', 'node3', label='')

# 計算グラフを画像として出力
display(Image(g.render()))
```
結果：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520659/7eec8ac4-8deb-9999-29ed-113edd5d0ae6.png)

英語や記号は表示できるが、日本語がお豆腐になってしまう…。

matplotlibに慣れていると、コード内でフォントを指定しようとしたり、とりあえずjapanize_matplotlibを入れるなどしがちだが、これだと治らない。

## 解決方法

解決方法は簡単で、Colabのランタイムが乗っているUbuntuの方に日本語フォントを入れればOK。
```bash
!apt install fonts-ipafont
```

結果：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520659/94749422-51d0-04ed-0ebb-a888c682d2cd.png)


# 参考文献
- [言語処理100本ノック 第5章: 係り受け解析](https://nlp100.github.io/ja/ch05.html)
- [【Python】木構造のグラフを描画する【graphviz】](https://tt-tsukumochi.com/archives/5502)
- [graphviz](https://pypi.org/project/graphviz/)
さんぽビンゴ  その２

## お散歩にきっかけが欲しいが、同じテーマは飽きる  
という訳で、前回のさんぽビンゴにバリエーションを付け加えました！ 

https://qiita.com/mmmrym/items/393709f68b4f8a1be1b8

今回は6つビンゴを作りました。これで冬の間は飽きずに楽しめそうです。  
さらにおみくじ(ランダム)要素を付け加えて、QRでwebアプリを読み込めるようにしました。  

## 使い方

https://x.com/mmmrym112/status/1726637966511206713?s=20

1. マス目を触るとチェックを付けることができます。
※チェックされたマスをもう一度触るとチェックが外れます。
2. やり直したい場合はやり直すボタンを押すと、すべてのチェックをリセットできます。

## 作り方
### コード  
[前回の記事](https://qiita.com/mmmrym/items/393709f68b4f8a1be1b8
)から様々なテーマでビンゴを作成します。Netlifyにアップロードし、URLを入手します。  

記事が読みにくくなってしまうため、1例のみcodepenを載せてあります。  

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="JjxpqRr" data-user="mmmrym" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/mmmrym/pen/JjxpqRr">
  さんぽビンゴ 食べ物</a> by mmmrym (<a href="https://codepen.io/mmmrym">@mmmrym</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>


また、こちらの[サイト](https://codepen.io/mshita7/pen/wvNrPxQ)からURLをQRコードに変換します。 

今回は6つのQRコードを作りました！ (こちらの画像を保存して印刷して使用することもできます。)  
若干、大きさと位置が異なるのは許してください...  

![さんぽビンゴ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565590/557b94f0-a3fe-c500-53c1-852faeece009.png)

これらのビンゴを選べば、散歩のテーマが決まります！

**6テーマ**  
・ 街中にある、目に映るものを題材にしたビンゴ その１、その2  
  
  https://effortless-boba-23d32a.netlify.app/

  https://legendary-cascaron-034e2b.netlify.app/

  
・ イヤイヤ期の散歩ビンゴ ([ご意見①](https://x.com/ped_yi/status/1723888521419661328?s=20)、[ご意見②](https://x.com/swallow248/status/1724262779673034811?s=20)ありがとうございます！)
  
  https://bright-pudding-ddfcf9.netlify.app/

  https://bright-torte-98b901.netlify.app/

  
・食べ物ビンゴ 

  https://beamish-malabi-81c76a.netlify.app/

・買い物ビンゴ    

  https://gregarious-cactus-825db7.netlify.app/


## さんぽ以外のビンゴの活用法  
もはや散歩の本題からずれていますが、面倒だなあ（家事、生活必需品の買い物とか）と思っていることもビンゴにすると意外にやる気になるかもしれないと思いました。ですので、皆さんも何か面倒くさいことをビンゴにしてみてはいかがでしょうか？  
普段あまりできないセルフケアビンゴとかも良さそう。  

試しにTo Doビンゴ作ってみた、結構楽しい。

https://spiffy-pudding-610d2f.netlify.app/
【UiPath】実用的な例外処理を考えてみた

# １．はじめに
　個人的に実用的な例外処理は何かを考えてみました。その結果以下のようなポイントが挙げられると思います。
 　**＜ポイント＞**
　　①例外が発生したことが瞬時にわかる
　　②例外が発生したプロセスがわかる
　　③例外が発生した場所がわかる
　　④例外が発生した内容がわかる
　　⑤（例外が発生した時間がわかる）
  　　※即時メールを送るという側面から一旦細かい時間という部分は優先度を落として考える

# ２．課題
　上記には挙げていませんが、例外が発生した場所以外に発生したデータを知りたい場面が良くあります。データを把握しないと、リカバリポイントが明確にならないということで、以下のいずれかの方法をとっている方が多いかなと思っています。
　・処理対象データの情報をログ出力している
　・処理対象データをExcelなどに保存・マーキングしている

　これらの方法をとることは非常に重要ですが、ログを見に行ったり、保存データをみたりする必要があります。また、ログ出力する場合は処理対象データ量が膨大になると、データベースの容量を増大させたり、端末のログを増大させ、スローダウンやアプリケーション停止などを招くことがあります。

# ３．対応方法（提言）
　対応方法の1つとして、TryCatchを適切に設定するというのが挙げられます。Main.xamlにしかTryCatchがないという方もいらっしゃるかもしれませんが、以下のような構成イメージにすることでどのxamlで発生した個別のメッセージを設定することで判断しやすくすることができます。
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301393/04950c94-2f38-e6d4-39ed-3f3010c1e534.png)

　個別のメール用例外メッセージを設定する方法としては、Dataプロパティを利用します。これはSystem.Exceptionクラスにあるプロパティであり、例外発生時専用のものとなります。この内容をメール本文に載せ、例外の大まかな発生個所を人が視認しやすいメッセージにすることが可能となります。

　さらに、これを応用して、繰り返し処理に適用をしていきます。イメージ図としては以下のようになります。
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301393/db50ccda-0677-6cc2-dc37-44cd9d0a4d67.png)
　このように繰り返し処理にも個別にTryCatchを付与します。ここでポイントになるのは繰り返し処理の現在のインデックスを変数として出力し、同値をメール用例外メッセージに設定することで無駄なログを出力せず、どのデータを処理していたかを明確にすることができます。
　実際のxamlファイルの例は以下となります。
 　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301393/2e68ad83-257b-7546-00ba-c58d59bf9284.png)

# ４．最後に
　これらを応用していくと、以下のようなメール通知を受け取ることが可能になります。
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301393/31a785f2-0ad0-7b6b-99a6-3b38347aabb3.png)

　Main.xamlの例外処理部分の実装は以下の通りとなります。
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301393/b6b2b5a9-761e-1af5-8b06-65b85b4cdf94.png)

　本記事はあくまでも個人の見解を述べているものとなりますので、参考情報として頂ければと存じます。
浮動小数点の扱いは面倒。jismeshでメッシュコードが意図しないものに

# 緯度経度から地域メッシュコードを求める
https://pypi.org/project/jismesh/ 

を使っていたけど，スカラーと配列で値が違っていた。


```python
from jismesh.utils import to_meshcode

lat0 = 34.875
lon0 = 135.1875

print(to_meshcode(lat0, lon0, 3))
print(to_meshcode(np.array([lat0, lat0]), np.array([lon0, lon0]), 3))
```
を実行すると、
```
52352155
[52352154 52352154]
```

と、同じ緯度経度のはずなのにメッシュコードが違う。

$34.875$　が そのまま扱われず $34.87499999999999$ と解釈され、
切り捨てられたんだろうなと思いつつ、どうしてやろうかと。。。
【Excel】新規ルールの作り方

## はじめに

Excelで備忘録的にメモを取っている時、土曜日と日曜日の色を変えて、少しだけ視覚的に見やすくできればと思った。

ただ新規ルールを作るにあたり、少し手こずったので備忘録を残す。

## やりたいこと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3577712/b13684a0-3384-1039-b68c-c439f93af166.png)

## 手順
### ルールを適用する範囲を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3577712/c1bd3b0f-cf6e-7b7a-208e-2cc693d30ec0.png)

### 新しい書式ルール追加
タブより、「ホーム > 条件付き書式 > 新しいルール」
ルールの種類：数式を使用して、書式設定するセルを決定
ルールの内容：WEEKDAY(E2,2)=6
※B2：選択した範囲の先頭セル、6：土曜を指す。7が日曜。
書式より、文字色を変更して、OKボタンを押下する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3577712/bb3b8e71-44b8-9fdd-d847-0a9702f7b1ce.png)

:::note info
タブより、「ホーム > 条件付き書式 > ルールの管理」でルールを確認できる。
:::
[SwiftUI]Color Setで独自の色を設定する方法

# SwiftUIでColor　Setで独自の色を設定する方法

**Assets.xcassets**で左下の➕ボタンを押して、**Color Set**を押す。

![スクリーンショット 2023-11-20 23.56.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330686/9dab59c7-9057-0195-538c-457ba5113956.png)

名前をいい感じに変更します！
今回はボタンの色にしようと思うので、buttonという名前にしました！

![スクリーンショット 2023-11-20 23.58.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330686/86ad4f80-9a70-216b-a011-8e9694d91de5.png)

右のバーで色を設定します。
ダークモードの場合の色も設定します。

![スクリーンショット 2023-11-21 0.00.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330686/6906b279-dc90-60c9-a4ae-3207fd360688.png)

Color("名前")で指定することができます。 

```swift
import SwiftUI

struct ContentView: View {
    var body: some View {
        VStack {
            Button {
                print("タップされたよ")
            } label: {
                Text("ボタン")
                    .frame(width: 140,height: 140)
                    .foregroundColor(.white)
                    .background(Color("button"))
                
            }

        }
        .padding()
    }
}
```

![スクリーンショット 2023-11-21 0.05.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330686/bb3f3901-8f72-7603-92c5-3471724a1ea3.png)

指定できていますね！

## ダークモードの確かめ方

トグルのボタンを押します。
![スクリーンショット 2023-11-21 0.09.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330686/79ad0957-0f42-1815-f369-be6384b9ed88.png)

Color Schemeのトグルを押します！
すると
![スクリーンショット 2023-11-21 0.07.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330686/9116b3e8-ac2f-64d3-be73-5bfd7a30eaf3.png)

ダークモードの時も確かめることができます。
【UiPath】UiPathの例外の特徴を知ろう

# １．はじめに
　RPAを使い始めて、例外を知ったという方もいるかもしれませんが、UiPathの例外には他のプログラミング言語にはない特徴があります。
 　今回はVB.Netでのプログラミング経験のない方ある方両方から、想定通りの動作をしないということで問い合わせを頂くことがあったので、内容の紹介と対応方法についてお話をしたいと思います。

# ２．UiPath例外発生時の特徴
　UiPathのロボットで例外が発生した場合、VB.Netと同じようにSystem.Exceptionクラスのエラーが主に発生します。例外自体には変わりありませんが、xaml呼び出しした先で例外が発生すると、引数が変わらないという状況が発生します。
　実際にユースケースを見てみましょう。以下のように引数に出力を設定している場合を考えてみます。一見すると、例外発生前にxaml呼び出し先で値が変わっていれば、呼び出し元でも値が変わっていると考える方がいるかもしれません。
#### 呼び出し元（例えば、Main.xamlなど）：
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301393/a3cb34c8-4cbe-42ba-af8a-ef16a33318e4.png)
#### 呼び出し先：
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301393/eeca708a-b7fc-f846-ecd3-e99edd76c3bb.png)

　これを実行すると、呼び出し先xaml内では引数「out_処理ステータス」に値が入っていることが確認できます。
　一方で、呼び出し元xamlに例外がスローされると、呼び出し元xaml側の変数「str_処理ステータス」は ~~**Null**となります。~~ 書き換えが行われません。（「ワークフロー ファイルを呼び出し」が実行される前の値のままになります）

:::note warn
ただし、以下の条件を **すべて** 満たす場合、呼び出し側のWorkflowでの、変数への操作が適用される場合があります。

- 「ワークフロー ファイルを呼び出し」のプロパティで、「分離」が設定されていない（False）
- 呼び出し側のワークフローの引数設定で、方向（Direction）が「入力/出力」になっている
- 変数の型が **参照型** である（値型ではない）

たとえば、DataTable型の変数を「入力/出力」で渡して、呼び出し先のWorkflowで、行の追加や削除を行った後、例外が発生したようなケースで、前述の動作が発生します。この場合、DataTableへの編集内容は、呼び出し元のWorkflowにおいても、呼び出し先での例外が発生する直前の状態、すなわち「ワークフロー ファイルを呼び出し」実行前の値とは、異なる値になっています。
:::

:::note info
上記で言う値型は、「Byte, SByte, Char, Short, UShort, Int16, UInt16, Int32, UInt32, Int64, UInt64, Single, Double, Decimal, Bool」と、列挙型・構造体です。列挙型・構造体はあまりUiPathで直接扱うことはないと思います。
また、String型は、厳密な分類では参照型なのですが、 **上記の動作については値型と同じ動作をします。** つまり、本件に関する動作については、Int32等と同じ括りで、例外の発生時には、呼び出し側での操作の影響を受けることはない、という認識で問題ありません。
逆に、Int32やString等、上記に挙げた型 **以外**を使う場合、注意が必要ということになります。
:::

　現時点において、これは製品仕様ということになります。

　ここまでの記事を見て、疑問に思わない方もいらっしゃると思いますが、VB.Netの開発をしたことがある方からすると、出力＝参照渡し（Byref）メソッドと同様と考える方が多いかと思います。もちろん参照渡しであれば、例外が発生しても呼び出し元でも呼び出し先で設定した値を参照することが可能となります。ここに**落とし穴**があるわけです。

# ３．対応方法
　例外発生時にMain.xamlにメッセージ以外で情報を伝えたい場合、どのようにすることで対応可能かについてお話をしていきましょう。
　System.ExceptionクラスにはDataプロパティが存在します。DataプロパティはIDictionary型の空のコレクションオブジェクトであり、KeyとValueのペアによって任意の値を設定することが可能となります。この機能を利用することで例外発生時に「例えば、処理ステータス」を連携し、メールの情報に付加することができます。
#### 呼び出し元（例えば、Main.xamlなど）：
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301393/d32fa31b-3dc1-6c7c-a1ff-7179cb596619.png)
#### 呼び出し先：
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301393/6d9f3baf-ef7b-92af-6306-0d7cfc7b6082.png)
  
:::note warn
警告
呼び出し先では「再スロー（ReThrow）」アクティビティを利用して上位に例外を通知する必要がある点に注意ください。
:::

# ４．最後に
　例外処理関連の挙動については、他にも独自の動作をするようなので、機会があれば記事にしていきたいと思います。
　また、Dataプロパティに「FaultedDetails」というものがあり、過去例外発生元の情報が自動で設定されていましたが、今はDisplayNameのみが取得できる状況となりますので、最新の情報に注意して設計開発をして頂ければと思います。
 
　本記事はあくまでも個人の見解を述べているものとなりますので、参考情報として頂ければと存じます。
【高卒エンジニア】7年目の備忘録

## はじめに
高校卒業後、縁あってIT業界に就職し、もう7年目になる。

7年のうち、5年くらいは20年も前に開発されたシステムの保守に携わってきた、、

ある程度、信頼を得て、仕事はしやすい環境にあるのだが、エンジニアとしての技術力のなさを沸々と感じており、少しずつ勉強を始めたところである。(やっと笑)

思うことをここに残そうと思う。

よろしくどうぞ。

## どんなことをしてきたか
### 1年目
新人の頃は、よくわからない仕事(覚えていない)を3か月くらいした後に、確かVB.NETあたりで開発をしていた。

とにかく先輩にやることを聞いて、プログラムをたらたら書いていた。

11月末に、冒頭にも書いてあるシステム保守の話があり、12月13日(水)から客先常駐でのシステム保守が始まった。

:::note info
曜日まで覚えているのは、絶対覚えておこうと意識していたから。笑
:::

### 2年目～5年目
この間はずーっと保守。人生保守色というくらいに保守しかしていない。

電話対応など、コミュニケーションに対する苦手意識があったが、ピッチで問い合わせがあったり、障害報告で説明することが多々あったので、そんなこんなでその辺はある程度できるようになった。

ただシステムが古く、プログラム言語はここで働かなければ聞かないような言語のため、エンジニアとしての技術力の成長はなかったと思っている。

### 6年目
社内で仲良くしていた人が辞めてしまい、自分もそろそろ転職しようかなと思うだけ思っていたら、協力会社の人から声をかけてもらい、ありがたいことに転職することができた。

転職時期はだいたい11月頃。

そこから半年ほど、PHPやPythonでの小規模開発に携わった。
とても楽しかった、いい思い出。

### 7年目
7月頃、以前保守していた古いシステムの開発に参加する話があり、色々考えたうえで参加することにした。
※協力会社に転職していることが知られて話が来たらしい、、

結局、今は設計をしているが、スケジュールが上手く管理されておらず、自分の技術力(主にプログラミング)は成長しないまま、たらたらと仕事をしている。


## 向いている仕事とやりたい仕事との葛藤
### なぜ今のシステム開発に参加することにしたのか
+ 声をかけられた期待に応えたい自分がいる
+ 開発メンバーに有識者があまりいないため、有識者の立場で携われるのである程度、貢献できる

### 今やりたいこと
Webアプリでも、何ならまずWebデザインでもいいから、1から作るということをしたい。

そしてフロントエンドエンジニアとして、仕事ができればいいなと思っている。

:::note info
やりたいことの実現に向けて、恥ずかしながらHTMLから勉強し直している。
:::

### やりたいことをやればいいじゃないか
本当にそうである。

そして踏み出せないだけなのである。

ここまで理解している人間は、本当に踏み出すのに時間がかかるのだと、漫画やドラマを観ても思う。(あくまで個人的見解)

とりあえず、思うことを書いているだけなので、ここで向いている仕事(今の仕事)とやりたい仕事のメリデリをまとめてみる。

#### 向いている仕事(<font color="red">メリット</font>)
+ 信頼されており、それなり評価してもらえている
+ ある程度システムの仕様を知っているので、色々なことに主体性を持って取り組める
+ シンプルに給料がいい

#### 向いている仕事(<font color="blue">デメリット</font>)
+ 外部設計をしているのに、要件が固まっていないところがあり、スケジュールや課題の管理が発生して、そのせいでよくわからない残業が発生している(もう残業は常態化している)
+ プログラムをしたいのに、プログラムができるのはあと1年後とか、、

#### やりたい仕事(<font color="red">メリット</font>)
+ 言うまでもない、、

#### やりたい仕事(<font color="blue">デメリット</font>)
+ プログラムもろくにできなければ、設計ができるわけでもないので、貢献できるのに時間がかかる(給料に見合う働きができない)

:::note warn
やりたいことをするにあたり、仕事以外に個人的な事情がある、、(言い訳)
:::

## まとめ
IT企業で7年働いてきた、ろくにプログラムも設計もできない人間の備忘録ができたと思う。

自分の成長を感じられるものになってくれたらいいな。

## 余談
この記事を書くにあたり、自分の文章力のなさを痛感した。

文章の書き方の参考として、Qiitaの記事を色々見ていたのだが、「未経験から3か月でIT転職」的な記事が多々あり、勉強して転職してQiitaで記事を書いて、私の7年をあっという間に抜かれた気がして、なんかつらい、、

自分は未経験者だと思って勉強しないとな。

この記事に全部詰め込もうとしたり、逆にシリーズ化を考えたり、自己紹介記事的なもの(この記事)を最初に投稿したいと考える自分がいて、変に完璧主義な傾向にあるなと感じた。

この完璧主義は、時間を浪費するんだろうな、、(もうしてるか)

こんなことや技術的なことをぼちぼち残して、何か好転してくれたらいいよねと思う日々です。:no_mouth:

:::note warn
完璧主義が止まらなくなりそうなので、とりあえず投稿することにした。
:::

:::note info
もし同じ境遇でしたら、ぼちぼち怠惰に頑張りましょう！
:::
【TailwindCSS】カスタムバリアントの設定方法

`tailwind.config.js`に以下のように記述することでカスタムバリアントを設定できます。

```js:tailwind.config.js
const plugin = require('tailwindcss/plugin')

module.exports = {
  // ...
  plugins: [
    plugin(function({ addVariant }) {
      addVariant('optional', '&:optional')
    })
  ]
}

```

以下のように使用します。

```html
  <div class="field">
    <label for="email_input">Enter an email address:</label>
    <input type="email" id="email_input" class="optional: border-4" />
  </div>

```
日本語プログラミング言語 Mind Java C# でHello World実行時間を仲良く競う（Mindミリ秒で再計測）

# はじめに

日本語プログラミング言語 Mind とJava C# とで「Hello World」コンソール出力の反復実行時間を仲良く競い合わせてみます。前回の記事では筆者の知見不足によりMindは秒単位で計測していましたので、今回Mindだけミリ秒計測のやり直しです。

https://qiita.com/advent-calendar/2023/mind

## この記事内容の作業環境
Windows11 Pro 22H2
VSCode(Visual Studo Code)　1.78.2
java Eclipse Adoptium jdk-20.0.2.9-hotspot
C# 10 dotnet-sdk-6.0.404-win-x64
Mind Version 8.07 for Windows
CPU Intel(R) Core(TM) i3-5005U 2.00 GHz

## この記事内容の保証
※この記事の実行結果は参考情報です。実行環境に大きく依存します。

# お題のソースコード
#### Java
お手数ですが[前回記事](https://qiita.com/mylifewithviolin/items/6182b9822524dd0709db)をご参照ください。
#### C#
お手数ですが[前回記事](https://qiita.com/mylifewithviolin/items/6182b9822524dd0709db)をご参照ください。
#### Mind
```mind:main.src
    メインとは
        countMaxは　変数
        countは　変数
        合否は　変数

        startTimeは　変数
        stopTimeは　変数
        spanTimeは　変数
        
        起動引数個数が　ゼロ？
        ならば　countMaxに　0を　入れ
        つぎに
        起動引数（1）を　数値変換し　countMaxと　合否に　入れ
        合否が　偽？
        ならば　countMaxに　0を　入れ
        つぎに

        ※開始時間（ミリ秒）
        クロックを　startTimeに　入れる
        countに　0を　入れ
        ここから
        　　countが　countMax　以上　ならば　打ち切り
        　　　　　　　　つぎに
            「Hello World!」を　一行表示する
            countを　一つ増加し
        繰り返し
        
        ※終了時間（ミリ秒）
        クロックを　stopTimeに　入れる
        stopTimeから　startTimeを　引き　spanTimeに　入れる
        「処理回数: 」と　countを　文字列変換し　合成し 「回」を　合成し
        一行表示し
        「処理時間: 」と　spanTimeを　文字列変換し　合成し 「ミリ秒」を　合成し
        一行表示すること。

```

前回記事では現在の日時を秒単位の３２ビット整数に換算する「日時を値で得る」を使っていましたが、今回は@killyさんのご支援をいただき、ミリ秒単位の内部カウンタを参照する「クロック」を使っています。この処理単語はWindows版のみ有効です。
# 実行結果
#### Java
お手数ですが[前回記事](https://qiita.com/mylifewithviolin/items/6182b9822524dd0709db)をご参照ください。
#### C#
お手数ですが[前回記事](https://qiita.com/mylifewithviolin/items/6182b9822524dd0709db)をご参照ください。
#### Mind

```:
C:\pmind\sample>hello3.exe 40000
Hello World!
・・・
Hello World!
Hello World!
Hello World!
処理回数: 40000回
処理時間: 7777ミリ秒

C:\pmind\sample>
```
# 実行結果まとめ
表1　「Hello World」コンソール出力の反復実行時間（ミリ秒）
| 実行回数 | Java | C# | Mind |
|-:|-:|-:|-:|
|  40 |  8 | 16  |  15 |
| 400  | 72  | 57  | 78  |
| 4,000  | 563  | 468  | 807  |
| 40,000  | 4,565  | 4,206  | 7,777  |
| 400,000  | 42,618  | 40,075  | 73,936  |

前回の計測ではMindの1秒未満の世界が不明でしたが、今回計測してみると400回くらいまでの反復では各言語有意差がない感じですね。

# おわりに
いかがでしたでしょうか？コンソール出力を単純にループさせているだけですので、各言語、実装によってはいろいろな差異がでるものと思われますので、この件はあくまで参考情報です。
メール本文のハイパーリンクとドメインの難しい関係

1日目は hmatsu47 さんでした
- [Gmailメール送信者のガイドライン変更に備える話](https://qiita.com/hmatsu47/items/04e78fcb331239690911)


# はじめに

システムからメールを送信する際、「送信したメールが迷惑メールボックスに入ってしまった」という問題はよく発生します。
迷惑メールの判断基準は日進月歩で進化していますが、重要なポイントは大きく変わっていない印象です。
「送信ドメイン認証（[SPF](https://ja.wikipedia.org/wiki/Sender_Policy_Framework), [DKIM](https://ja.wikipedia.org/wiki/DKIM), [DMARC](https://ja.wikipedia.org/wiki/DMARC)）」「レピュテーション」「コンテンツ内容」は、必須要件として語り尽くされ、インターネット上に情報も豊富に存在します。
この記事では、「メール本文とドメイン」の関係に焦点を当ててみます。

## 前提条件
- 送信ドメイン認証が適切に設定されている
    - これは、ドメイン所有者側の責任の範疇ですので、[適切に設定](https://blastengine.jp/blog_content/dkim_basic/)しましょう
- 送信元のレピュテーションは悪くない
    - 例えば、blastengineを利用している場合は、この辺りの事を[よしなにやってくれている](https://qiita.com/advent-calendar/2023/blastengine#pr)ようですので、懸案にはならないですね
- コンテンツは不適切（違法、暴力的、ポルノなど）ではない

#### HTMLメールの例
```html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <body>
    <table align="center" border="0" cellpadding="0" cellspacing="0" height="100%" width="100%">
      <tr>
        <td align="center" valign="top">
          <table border="0" cellpadding="0" cellspacing="0" width="600">
            <tr>
              <td valign="top">
                ◯◯◯◯様<br>
                <br>
              </td>
            </tr>
            <tr>
              <td valign="top">
                登録ありがとうございました。<br>
                ＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊<br>
                姉妹サービス<a href="https://blacklisted.example.edu/">hoge</a>も、ぜひ御覧ください。<br>
                ＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊<br>
                ＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊<br>
                ＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊<br>
                ＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊<br>
                <br>
              </td>
            </tr>
            <tr>
              <td valign="top">
                <hr>
                株式会社△△△△<br>
                <a href="https://subsidiary-company.example.org/">https://parent-company.example.com/</a><br>
              </td>
            </tr>
          </table>
        </td>
      </tr>
    </table>
  </body>
</html>
```
（メーラーによってはHTML5に対応していないケースが多いので、まだまだHTMLメールは古典的な書き方になりがちですよね………）
閑話休題

# 注意すべきポイント

### 外部URLのブラックリストの確認

**本文に含まれる外部URLのドメインはブラックリストに入っていないか？**
メール本文にブラックリストに含まれているドメインがあると、そのメールの送信者（送信元ドメイン）も悪い評価を受ける可能性があります。
例示のHTMLでは、 `https://blacklisted.example.edu/` が悪質なドメインであれば、迷惑メールと見なされる可能性があります。自身のドメインだけでなく、掲載する外部ドメインもチェックすることが重要です。

### ハイパーテキストリンクの一貫性

**ハイパーテキストリンクに表示するURLのドメインとリンク先URLのドメインが異なっていないか？**
ハイパーテキストリンクのhref属性に記載したURLと、要素として表示しているURLが異なる場合、迷惑メールと見なされる可能性があります。表示しているURLと遷移先のURLが一致していないと、騙し行為とみなされかねません。
例示のHTMLでは、会社のURLが `https://subsidiary-company.example.org/` であれば、素直に `<a href="https://subsidiary-company.example.org/">株式会社△△△△</a>` としておくべきです。

# まとめ

迷惑メール判断の基準において、メール本文については、以下の点に特に留意しましょう。

- 外部URLのブラックリストの確認
- ハイパーテキストリンクの一貫性

# おわりに

:::note warn
記載した情報の正確性について万全を期しておりますが、その内容について保証するものではありません
:::

---

3日目は kitazaki さんです
- [JPドメインのDMARCレコードの普及状況について](https://note.com/kitazaki/n/n50dc6c2eb3ae)
Apple Silicon MacでDocker Hubのイメージレジストリ使ってIBM Cloud Code Engineにデプロイする時の注意点

M1 Macでデプロイするときにハマった（前にもハマった気がする・・・）ので、同じようなことを試す方向けに情報共有。

## Docker Hub
Docker Hub使う時はこんな感じ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/54896330-b778-c7b3-41b9-ad0e447eb430.png)

参考：

> Enter a server name for your registry. For Container Registry, the server name is <region>.icr.io. For example, us.icr.io. For Docker Hub, the server name is https://index.docker.io/v1/.

https://cloud.ibm.com/docs/codeengine?topic=codeengine-add-registry

https://egashira.dev/blog/sample-app-deploys-to-code-engine

## Apple Silicon

シンプルにdocker buildしてpushしたら、こんなエラーが出た。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/60954de3-172c-1a98-299e-42e377c144d9.png)

buildするとき、以下のコマンドのように`--platform linux/amd64`を追加するとうまくいく。
```
docker build -t optimisuke/hello-gradio:latest . --platform linux/amd64
```

参考：
https://zenn.dev/hyodoblog/articles/4e866b7eff16ca
rbenvでRuby 3.2.2をinstall するとBUILD FAILEDになる

## 環境
- macOS Monterey 12.6.2
- rbenv 1.2.0
- Homebrew 3.4.7
## rbenv を使ってRubyをinstallすると失敗する。
Ruby3.2.2をインストールしようとすると、以下のようにエラーが発生してビルドが失敗してしまうので、解決のために実施したことのメモになります。

```
$ rbenv install 3.2.2
BUILD FAILED (macOS 12.6.2 using ruby-build 20230717)
```

## 対応
最初に環境構築をしてから、しばらくソフトウェアのアップデートなどしてこなかったので、今回関係ありそうなツールのアップデートから始めました。
- Homebrew, ruby-buildの更新
```
$ brew update
$ brew upgrade ruby-build
$ brew upgrade rbenv
```
上記コマンド実行後、再びインストールを試しましたが、解決しませんでしたので続きます。
- opensslのアップデート [参照](https://github.com/rbenv/ruby-build/wiki#suggested-build-environment)
```
$ brew install openssl@3 readline libyaml gmp  
```
opensslのアップデートをする必要があるとの記事を見つけたので、上記コマンドを実行しました。
また同記事に環境変数を設定しなくても良くなったと書いてあったので、上記コマンド実行後に再度Rubyインストールを試しましたが解決しませんでしたので、続きます。

- xcodeコマンドラインツールのアップデート　[参照](https://ama-tech.hatenablog.com/build-failed-when-rbenv-install-ruby-3-1-1)
```
$ xcode-select --install
xcode-select: error: command line tools are already installed, use "Software Update" to install updates
```
上記コマンドを実行すると既に、インストールされているとエラーが出ました。
下記コマンドを実施してxcodeのインストールをしなおしました。
```
$ sudo rm -rf /Library/Developer/CommandLineTools
$ xcode-select --install
```

再度rbenv installコマンドを実行したら成功しました。
Unityの無料アセットの「Runtime Monitoring」についてのまとめ

今回はUnityでのデバックに便利そうだったので分かったことをまとめました。
まだ分からないことも多いので分かったらまた追加していく予定です。

# １．アセットをMyAssetに追加

以下のリンクからアセットを追加

https://assetstore.unity.com/packages/tools/integration/runtime-monitoring-222328

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432250/b5ff9b9d-6972-d5c3-326c-888daca98318.png)

# ２．Unityにアセットをインポート

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432250/ec77bcea-1895-ae02-f118-f61d438add35.png)


①Asset Storeを開く
②Open Pacage Managerを開く
③Runtime Monitoringを選択
④アセットをダウンロード
⑤アセットをインポート

# ３．monitoringの設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432250/74ffbc04-28e2-1df5-8a83-b54b8361c36e.png)

①Toolを選択
②Runtime Monitoringを選択
③Settingを選択（monitoring画面が出てくる
④Visible On Loadにチェックを入れる

# ４．コードを書いてアタッチ
①右クリックからC#スクリプトを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432250/6bb5bda6-8212-b1c5-7f02-fc1a10a10bcb.png)


```Monitoring.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Baracuda.Monitoring;

public sealed class Monitor : MonoBehaviour
{
    // モニタリングしたい変数に [Monitor] 属性を付ける
    [Monitor] private int _test;

    private void Awake()
    {
        // このオブジェクトをモニタリング対象とする
        this.RegisterMonitor();
    }

    private void Update()
    {
        _test++;
    }

    private void OnDestroy()
    {
        // このオブジェクトをモニタリング対象から外す
        this.UnregisterMonitor();
    }
}
```
②Main Cameraにアタッチする

# ４．実行
再生ボタンを押すとこのようになる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432250/e5e3fe7c-0749-8f79-f862-2daab28e9e1d.png)


# 参考記事

https://light11.hatenadiary.com/entry/2023/01/30/194500