OmniAICreator/Qiita-1.07M huggingface dataset:
【LINE WORKS】IFTTTを経由してカレンダーを連携してみる

# はじめに
LINE WORKSのカレンダー機能はAPIも提供されており、それを使うことでカレンダー上で何かの実行スケジュールを管理することも可能。

今回は、IFTTTを経由してカレンダーの予定と連携する仕組みを作った。

![calendar_batch-概略図.drawio (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/26214d0a-57ad-d2b7-e64b-d9fdfe512e3c.png)

# ソースコード
https://github.com/mmclsntr/lineworks-calendar-ifttt-integration

## 利用した言語・フレームワーク等
- 言語 : Python 3.9
- デプロイ : [Serverless Framework](https://www.serverless.com/framework/docs)
- 開発フレームワーク : [AWS Lambda Powertools for Python](https://awslabs.github.io/aws-lambda-powertools-python/latest/)

# 構成図
![calendar_batch-構成図.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/94fc4be6-4af7-f4f7-4e85-d1bab970e3c8.png)

- バックエンドはAWSのサーバーレスアーキテクチャで構成。
    - Lambda : 初期設定やカレンダー予定のポーリング、Webhookへの送信、Botへの通知。
    - DynamoDB : 設定値の管理。
- 初期設定画面への動線は、Botのリッチメニューからアクセスするようにした。
- Botとのトークは、サーバーからのメッセージ受信のみ。

# 連携の流れ
## 事前準備
Webhook連携のために、IFTTTであらかじめAppletを作っておく。
https://ifttt.com/create
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/32d6eb43-87b2-80c6-fa93-ea8391ac3946.png)

「IF」には [Webhooks](https://ifttt.com/maker_webhooks) の「Receive a web request」を指定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/84184887-ba3e-1301-e1b9-d0e30e381216.png)

「THEN」には任意のアクションを設定する。「Event Name」には任意のイベント名を入力。
今回は[Webhook.site](https://webhook.site)で確認したため、Webhooksの「Make a web request」を指定。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/36c8184d-eaad-bfa9-3a30-1a338545b0a8.png)


## 初期設定
![ifttt_calendar_setting.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/21f284e2-9adf-dfe4-840b-65b40e23ec03.gif)

1. まず、IFTTTのWebhook情報を設定する。
    1. ログイン
        - ユーザーIDの取得、カレンダーの作成、予定の定期取得のために、[User Account認証](https://developers.worksmobile.com/jp/reference/authorization-auth?lang=ja)を行いアクセストークンを取得・格納する。
    1. IFTTTの設定値入力・送信
        - IFTTT integration key : IFTTTアカウントごとに持っているKey。[Webhooks](https://ifttt.com/maker_webhooks)ページの「Documentation」から確認可能。
        - IFTTT Event ID : IFTTTのIFの設定で入力した「Event Name」
        - Description : メモ
1. 設定すると、専用カレンダーが自動作成される。

## 連携実行
![ifttt_calendar.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/a84b1c77-dea3-f026-8ba8-76981cd045ea.gif)

1. 初期設定にて自動作成されたカレンダーに予定を追加する。
1. サーバー側にて5分毎にカレンダーの予定一覧が取得され、開始時刻となった予定を検知すると、IFTTTのWebhookへイベントが送信される。
1. Webhookイベントをトリガーに、あらかじめ設定したIFTTTのアクションが実行される。
    - 今回はWebhook.siteのエンドポイントへリクエストが飛ばされる。
1. 同時に、トークへBotから実行通知が送られる。

# 利用したLINE WORKS API
- [カレンダーの登録](https://developers.worksmobile.com/jp/reference/calendar-create?lang=ja)
- [指定カレンダーの予定リストの取得](https://developers.worksmobile.com/jp/reference/calendar-event-user-list?lang=ja)
- [メッセージの送信 - ユーザー指定](https://developers.worksmobile.com/jp/reference/bot-user-message-send?lang=ja)


# まとめ
何かスケジュール実行したいものをLINE WORKSのカレンダーで管理する仕組みを作った。
今回は汎用性を高くするため、連携プラットフォームであるIFTTTを利用した。Webhookイベントを送るだけなので、カレンダーだけでなく他のサービスにも応用できそう。
【GitLab】CICDのymlファイルの書き方①

# はじめ
　　gitlabのCICDを勉強しています。
　　.gitlab-ci.ymlの書き方と注意点をメモしました。
　　例を参考しながら、job、script、stages、variables、before_script、after_scriptの書き方をまとめてみました。

# 例文
```yml
before_script:
  - echo "before-script!!"

variables:
  DOMAIN: example.com

stages:
  - build
  - test
  - deploy

build:
  before_script:
    - echo "before-script in job"
  stage: build
  script:
    - echo "mun clean"
    - echo "mvn install"
    - echo "$DOMAIN"
  after_script:
    - echo "after-script in job"

unittest1:
  stage: test
  script:
    - echo "run test"

deploy:
  stage: deploy
  script:
    - echo "hello deploy"
    - sleep 2;

unittest2:
  stage: test
  script:
    - echo "run test"

after_script:
  - echo "after-script!!"

```
# 書き方と注意
- .gitlab-ci.ymlを書いた後は、「CI Lint」で構文の文法を確認する。
- 一つymlファイルに一つ以上のjobを設定できる。jobの名前は唯一で、予約語(scriptなど)を使えない。よく見られるjobの名前：build、unittest、deploy、codescanなど。
- 一つjobには、一つ以上scriptを設定する。
- scriptには１つ以上のshellコマンドを記入する。
- stageはjobのstage名を命名する。
- stagesはjobのstageの順番を設定することによって、jobの実行順番を決める。
- before_scriptは毎回jobを実行する前に実行する操作（コマンド）を設定する。リスト型で書く。before_scriptが失敗したら、scriptの実行に影響を与える。ymlファイルのbefore_scriptを代わりに実行する。
- after_scriptは毎回jobを実行した後で実行する操作（コマンド）を設定する。リスト型で書く。after_scriptが失敗したら、結果に影響を与えない。ymlファイルのafter_scriptを代わりに実行する。
- ymlファイルに対して、before_scriptとafter_scriptを設定することもできる。before_scriptとafter_scriptを設定しないjobが実行された時に、ymlファイルに設定されたbefore_scriptとafter_scriptが実行される。
- 同じstageの名前をもつふたつjobは並列実行する。
- 「.pre」をstageの名前に設定する場合は、該当のjobは一番最初実行する。
- 「.post」をstageの名前に設定する場合は、該当のjobは一番最後実行する。
- Piplineに「.pre」jobあるいは「.post」jobしか存在しない場合は、Piplineは生成されない。
- variablesにパラメーター(DOMAIN)を定義する。
AWS CodeGuruについてざっくりまとめてみた

今日、アマゾン ウェブ サービス ジャパン、シニアエバンジェリスト 亀田さんの[AWSの基礎を学ぼう 第九十七回](https://awsbasics.connpass.com/event/257614/)に参加してAWS CodeGuruについて学んだのでをこちらでざっくりまとめてみました。
AWS CodeGuruというワードを見て、何だこれ？と思われている方に最初のざっくりの把握するのに役立てれば幸いです。
(今回の記事はKoki_jpさんの[質問思考：自分にとっての新しい技術を効率的に学ぶ方法](https://qiita.com/Koki_jp/items/ee613e9a8f05d335a456)を参考に記載させていただいています)

## AWS CodeGuruとは？
AWS CodeGuruとは２つのプロダクトの総称のことである。
その２つのプロダクトは下記のふたつのことです。
- Amazon CodeGuru Reviewer
- Amazon CodeGuru Profiler

それぞれ役割が違い、それぞれ単体での使用も可能です。

## Amazon CodeGuru Reviewerの役割とは？
Amazon CodeGuru Reviewerとは、機械学習を駆使して、ソースコード内のクリティカルな問題や発見が困難なバグを特定するサービスのことです。

下記のような事例を特定できます。
- AWSのベストプラクティスに沿っていない箇所の特定
- 一般的なコーディングベストプラクティスに沿っていない箇所の特定
- 同期漏れによる意図しないデータの不整合
- 機密データの漏洩リスク
- 冗長なコード(同じロジックのコードが複数箇所で使用されているなど)の特定

現状では、JavaとPythonに対応しています。

## Amazon CodeGuru Reviewerはいつ起動するのか？
Pull Requestをするタイミングで、Amazon CodeGuru Reviewerが起動するようになっています。
そのためにAmazon CodeGuru Reviewerと、レポジトリサービスとの連携が必要です。
いま、連携できるレポジトリサービスは GitHub/Bitbucket/AWS CodeCommitの3種類です。

## Amazon CodeGuru Reviewerが解決できる課題とは？
十分なコードレビューができる人材はなかなか世の中にいないのが現状です。そのコードレビューを代わりにしてくれる、またコードレビューアーの負担を下げることができるのがAmazon CodeGuru Reviewerが解決できる課題となっています。

## Amazon CodeGuru Profilerの役割とは？
アプリケーションのパフォーマンス状況を可視化し、また最も実行コストが高い(=処理に時間がかかっている)関数を特定することができます。
また、特定するだけではなく、CodeReviewerと同様に、より良いパフォーマンスとなるための改善方法を含む推奨事項を教えてくれたり、異常検出の機能も備えています。

JVM(=Java Virtual Machine)専門のエージェントになっており、対応する言語はJVM上で動く言語のみになっています。
JVM上で動く言語は、Java, Scala, Kotolinの3種類になります。


## Amazon CodeGuru Profilerはいつ起動するのか？
Amazon CodeGuru CodeReviewerと違い、自分の手で実行することで起動します。
起動後に、AWSマネジメントコンソールのCodeGuruダッシュボードで結果が表示されます。

起動方法に関しては、下記の記事に丁寧にまとめてあったので、共有します。
https://dev.classmethod.jp/articles/amazon-codeguru-profiler-1/

## Amazon CodeGuru Profilerはいつ起動するべきか？
主に2点で起動することが推奨されています。
1. デプロイ前のビルド+テストのとき
2. デプロイ後の本番環境の状態を計測するとき

## Amazon CodeGuru Profilerが解決できる課題とは？
Amazon CodeGuru Reviewerと似ていますが、パフォーマンスについてレビューができる人材もなかなか世の中にいません。
パフォーマンスのレビューを代わりにしてくれる、またそういうレビューアーの負担を下げることができるのがAmazon CodeGuru Profilerが解決できる課題となっています。


## 感想
今回のAmazon CodeGuruの技術は機械学習の自然言語処理の技術の発展によってもたらされた技術だと思われます。
Kaggleをやっていても、Googleがコードとコードの関連性を見つけるKaggleを出していたのは知っていたのですが、こういうふうに理由されていることは知らなかったので勉強会に参加してよかったです。
このように自然言語処理の技術が発展していくと、Codeだけではなくてわれわれが日常に書く文章に対してもreviewができる世界になっていくのが予想できます。
いま自分が書いているブログでも、社内のchatのやりとりでも、よりいいねをもらうにはこう書いたほうがいいだったり、この表現はパワハラになります、という指摘ができるサービスがこれから広がっていきそうですね。
今後もいろいろな先端なサービスに触れながら、将来がどうなっていくかを考えるのは面白いなと感じました。
gensimで類似単語を取得する

# はじめに
データ分析をする際に，とある単語に対する類似単語を取得したかった。

# 概要
Pythonの自然言語処理ライブラリであるgensimと学習済み単語ベクトル表現を用いて，とある単語に対する類似単語を取得する。

# 準備
pipでgensimをインストールする。
```bash
$ pip install gensim
```

学習済み単語ベクトル表現をダウンロードする。今回はFacebookが公開しているfastTextを使う。結構サイズが大きいのでダウンロードには少し時間がかかる。

```bash
$ wget https://dl.fbaipublicfiles.com/fasttext/vectors-crawl/cc.ja.300.vec.gz
```

# プログラムの作成

ダウンロードした学習済み単語ベクトル表現と同じ階層にプログラムを作成する。
```
directory
    ├── ruizi.py
    └── cc.ja.300.vec.gz
```

```Python:ruizi.py
import gensim

model = gensim.models.KeyedVectors.load_word2vec_format(
    "cc.ja.300.vec.gz", binary=False
)

results = model.most_similar(positive=["ゲーム"]) #ここで元の単語を指定する
for result in results:
    print(result)
```

モデルのロードには時間がかかるので，実行すると10分くらい待たされる。いろいろ試したい場合はjupyter notebookなどの対話型実行環境で動かしたほうが良い。実行結果は次のようになる。

```
$ python ruizi.py
('ミニゲーム', 0.62871915102005)
('RPG', 0.6233924627304077)
('ゲームプレイ', 0.6169121265411377)
('コンシューマーゲーム', 0.6154342293739319)
('プレイ', 0.6067700982093811)
('コンシューマ', 0.6023121476173401)
('スマホゲーム', 0.5920637845993042)
('アニメ', 0.5835986733436584)
('ソーシャルゲーム', 0.5811622738838196)
('マルチプレイゲーム', 0.5735786557197571)
```

"ゲーム"に関係していそうな単語がいい感じにとれている。

他にも，２つの単語の類似度を取得することもできる。
```Python
print(model.similarity("サッカー", "スポーツ"))
# 0.5706692

print(model.similarity("サッカー", "テナガザル"))
# 0.21133302
```

詳しくは，[gensimのドキュメント](https://radimrehurek.com/gensim/models/keyedvectors.html)で。
【スマートホーム】たった”1つ"のアイテムで洗濯が完了したらスマホに通知を送るスマート洗濯機をつくる！

# はじめに
洗濯機をまわしたまま、１日経ってしまった...なんてことありませんか？
そうなると、もう一度洗濯してコインランドリーの乾燥機で乾かすことになり、電気代も時間も無駄に使うことになります。


あるアイテムを一つ使うだけで、アナログな洗濯機でさえ、洗濯が完了したらスマホに通知がくるようにできます。
![図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1114592/be232bc4-ef78-8f4f-e570-6ae26381cf06.png)



# できること

- 洗濯が完了したらスマホに洗濯完了通知を自動送信する

# 必要なもの

- スイッチボット　プラグミニ

https://www.amazon.co.jp/SwitchBot-%E3%83%97%E3%83%A9%E3%82%B0%E3%83%9F%E3%83%8B-%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88%E3%83%97%E3%83%A9%E3%82%B0-Alexa-%E3%82%BF%E3%82%A4%E3%83%9E%E3%83%BC%E4%BB%98%E3%81%8D/dp/B09PYLWNGV/ref=sr_1_1_sspa?keywords=%E3%82%B9%E3%82%A4%E3%83%83%E3%83%81%E3%83%9C%E3%83%83%E3%83%88+%E3%83%97%E3%83%A9%E3%82%B0%E3%83%9F%E3%83%8B&qid=1662209531&s=home&sprefix=%E3%82%B9%E3%82%A4%E3%83%83%E3%83%81%E3%83%9C%E3%83%83%E3%83%88+%E3%81%B7%E3%82%89%2Ckitchen%2C245&sr=1-1-spons&psc=1&spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUEyTjhVNTYyUlJSNjVZJmVuY3J5cHRlZElkPUEwMTM1MDU2RVlNOEVKTzRJNk5EJmVuY3J5cHRlZEFkSWQ9QTVOVEpDTDAxWlpOTiZ3aWRnZXROYW1lPXNwX2F0ZiZhY3Rpb249Y2xpY2tSZWRpcmVjdCZkb05vdExvZ0NsaWNrPXRydWU=

お値段なんと、**1,980円**です！

# 設定

## 「スイッチボット プラグミニ」の設定
コンセントにプラグミニを差し込み、プラグミニに洗濯機のコンセントを差し込みます。
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1114592/165edb90-4a57-f1c6-cfe6-aa615c9cf9aa.png)


## スマホの設定

- スイッチボットアプリからプラグミニを検索
- 使用するWi-Fiを設定
- プラグミニの名称を設定

![スクリーンショット 2022-09-04 13.48.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1114592/131cf440-2865-3d96-2651-5d22f99ef27d.png)
※既にスイッチボットでWi-Fi設定が完了している場合、スキップできます。

## シーンの設定
シーンとは、ユーザが設定した一連の流れをもとにスイッチボット製品や登録した家電を自動で実行してくれる機能で、スイッチボットアプリから設定できます。シーンを設定するには、下記の項目を登録します。

- 条件
- アクション

条件：プラグミニ>電力>より低い 0W
アクション：アクションを追加>プッシュ通知>通知内容

つまり、洗濯が完了し洗濯機の電圧が0Wになった状態を、洗濯完了とみなし、これをトリガーとしてスマホに洗濯完了通知を送るという作戦です。
![IMG_7206.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1114592/d4a456d2-b39e-65e1-581b-bb4c2a8f3a0f.jpeg)


# まとめ

![スクリーンショット 2022-09-04 13.52.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1114592/78f72b11-f069-bbb5-bd51-4e2a4010117c.png)

洗濯が始まると電力が「7.2W」となり、洗濯が完了すると「0.0W」になりました。それとほぼ同時に、シーン設定した内容でスマホに通知が（ほぼリアルタイム...！！）できれば、アレクサに音声通知してほしいですが、アレクサアプリでは電力状態を確認できないため難しそうです。

しかしこれで、洗濯物の干し忘れるリスクは低くなり、余分な洗濯がなくなることで、時間と電気代も節約につながることでしょう。今回は洗濯機でしたが、コンセントを使用する家電であれば似たようなことができると思います。
「初心者が LINEBot を作ってみた！」



こんにちは。

一般企業の情報システム部門で、社内業務システムの開発を担当しています。
といっても、他部署からの依頼や要望を受けて要件をとりまとめ、これから構築する
システムの概要は考えるものの、その後のプログラム開発は、契約している
コンピュータ会社の技術者に任せっきりで、自分ではプログラムを組むことはありません。

というか組めません :sob::sob::sob:
<br>

他部署からは、業務を改善したいから、困っているから、といろんな要望が
舞い込んでくるのですが、コンピュータ会社の技術者に開発を任せても、
開発にかかる工数の割に、得られるメリットがさほどでもないレベルのものが、
実は一番対応に困っていました :anguished:
<br>
そんなとき、ノーコードでアプリが作れる「MAKE」というツールの存在を知ったので
今回、自分でツールが作れるかチャレンジしてみることにしました！
小規模なアプリの開発なら、自分でMAKEを使ってチャチャっとできるレベルまで
使いこなせるようになれれば、ということで早速作ってみようと思います。

<br>
<br>
<br>

#### 今回のチャレンジ
<dt>「LINEでキーワードを入力・送信したら犬の画像が表示されるLINEBotを作ってみる」</dt>
<br>

#### 企画目的
　日々の仕事で疲れ切った自分を癒したい。
<br>
　そんな方に愛くるしいワンちゃんの画像をお届けしたいと思い、作ってみました。
<br>
<br>

#### 今回使うツール
・MAKE<br>
・LINE Developers<br>
・犬の画像をAPI公開しているサイト「Dog API」
<br>
<br>
<br>

#### 作り方

 <dt>１．LINE Developersで新しいチャネルを作る（図の「Dog」がそれです） </dt>

![LINE Developers.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2802665/6a1e603b-5a22-f949-47bb-43bddaa72b90.png)

　このチャネルをお友達登録しないとスマホのLINEに表示されないなど、
　うっかり忘れてしまいそうな設定がいくつもあったので備忘録として作業手順を
　すべて残したかったのに、キャプチャを撮るのを忘れてしまった(^^;

　今回MAKEでツールを作る上で、APIのサービスと連携させることができるという
　ことを知り、ネットであれこれ検索してみましたが、初心者にはAPIのサイトの
　見方がやたら難しくて、上の図のようにいくつも試しては失敗し、無駄にチャネル
　だけが増えてしまいました。
　結局、割と簡単な犬の画像を検索するAPIを選ぶことにしました。

<br>
 <dt>２．MAKE </dt>

　今回は、MAKEとAPIの基本的な使い方を理解する必要があったので、
　「LINEでキーワードを入力・送信し、犬の画像を表示させるLINEBotを作ってみる」
　にチャレンジしてみました。
![MAKE画像.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2802665/6f9e9e44-6abb-5815-043c-90660823ba67.jpeg)
　図のような流れで、
　➊LINEで入力したコマンドが
　❷APIのサイトに飛んで
　❸事前にJSONの構文を分解したとおりにパラメータを渡して
　➍犬の画像が返ってくる
　
　みたいな流れになることはなんとなく理解できるのですが、APIサイトで
　JSONファイルがどこにあるかわからず何時間もかけて探し回ったり、
　パラメータが複数になったら途端にうまくいかなくなったり･･･
<br>
　とにかく自分は応用が利かないんだな、ということも思い知らされました😞
<br>
　四苦八苦しつつも最終的には、LINEでキーワードを入力したら、DogAPIで
　取得した犬の画像が表示される、というごくシンプルなものですが、
　コーディングしなくてもLINEBotが作れて感動しました！
　というのは半分本当ですが、もう半分は「疲れた😫」というのが本音です。
<br>
<br>

#### 苦労したこと
　犬画像を取得するツールを仕上げるまでに、実はAPIをいくつか試していました。<br>
　NHKニュース、ウィキペディアの記事、地図の情報など、世の中には実に多く<br>
　のAPIが公開されていて、これを使いこなせれば、できることが増えるかもと<br>
　期待してしまいますが、なにせほとんどのサイトが英語で書かれていて、<br>
　翻訳ツールを使ってみても、翻訳された日本語が難しくて余計わからなく<br>
　なるという悪循環に･･･

　もしかすると技術以前に、英語がわからないと話にならない気がしてきた:tired_face:

![DogAPI.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2802665/86b911c0-9988-7a5b-9f8a-041b8c92e457.png)
　こちらはDog APIのサイト。
　比較的文字が少ないサイトですが、それでもようわからん😅

　最終的にDogAPIで犬の画像を取得するサービスを選び、ようやく出来上がったのが
　こちら↓

https://twitter.com/ishibas46779970/status/1567035533976829953

　ワンちゃん、出てきてくれてありがとう！ :joy::joy::joy::joy::joy:
　久しぶりにいっぱい頭使ったから、もっと癒して！! :pray_tone2::pray_tone2::pray_tone2:
<br>
<br>

#### これから
　今回はLINEでしたが、MAKEではMicrosoft365やGoogleなどいろんなアプリに<br>
　応用できるみたいだし、ネット上に公開されているAPIもたくさんあるので、<br>
　組み合わせ次第でできることが無限に拡がる気がします。<br><br>
　ですが、今回はMAKEもAPIも今ひとつ理解しきれないまま終わった感じです。<br>
　本当の意味で使いこなせるようになるには、さらなる勉強が必要と感じたので、<br>
　しばらくの間チャレンジ投稿を続けてみて、自らの成長記録として残そうと思います。
UiPath Orchestrator テナント内のフォルダの選択について 


Tenant package feed 
Create a new package feed for this folder 


どっち選べばよいの？について

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2826228/b3dde43d-8de4-f4eb-4962-3c627f9d4ecf.png)


テナントに対して登録されたパッケージをフォルダ内で使う場合は
Tenant package feed 


フォルダ内のパッケージを他のフォルダと独立させたい場合は
Create a new package feed for this folder 

を選択しましょう。



Create a new package feed for this folder 
はテスト環境ように作成して、テストプログラムと本番運用のものを切り分けるのに使ったら良さそうですね
UiPath ユーザーモードでのAttended Unattended Robotの設定方法

何度やってもどこかの手順を忘れてしまうので自分用メモ

Unattendedはユーザーモードでもインストールできるけど、
Windowsログアウトした状態では使えなくなるので
サービスモードで入れるのが吉なのですが
とりあえず使ってみたい人はユーザーモードで十分と思います。

ーーー
◆補足
サービスモード：Unattended利用想定
インストールにWindowsサービスを利用してログインするため管理者権限が必要
インストーラー.msi　>> プロ向けインストール>>Unattended インストールで自動でサービスモードでインストールされます。

ユーザーモード：Attended利用想定
管理者権限不要
インストーラー.msi >> 簡単インストール >> StudioとAssistantがインストールされればOK
ーーー


〇Attended の登録方法


Orchestrator >> Admin >> Account&Groups >> Users　でユーザーを招待

Edit Lisence Allocation からライセンスを設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2826228/54a0746c-924e-054a-bb98-ad2349ea106b.png)

画像の場合は
アドミングループに、Attendedを付与しているので
そのグループに沿ってAttendedが付与される。

Assistant　 > 接続の設定からログイン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2826228/8aa74157-af67-27bb-73c6-b93cf85f3736.png)

これにより Orhcestrator > Tenant > Machines　に自分のマシンがマシンテンプレートを利用して登録される

ーーー
◆補足
マシンテンプレート：
マシンキーを複数で共有する場合に利用する。
ユーザーIDや利用する端末が頻繁に変わる場合（VDI）を想定
CommunityEditionはこちらで良いと思っている（マシンキー発行されないため）

Standard Machine (標準マシン)：
ユーザーIDとパスワードとマシンキーを利用した接続方法
マシンキーは一人1つ利用する。
ーーー

Tenant > 利用したいフォルダ選択 > ユーザー > Edit を開く

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2826228/dc07dc6f-66f9-74a6-403e-8e06572396bd.png)

2つ目のページの
Enable User to run automations を有効にするとAttendedが利用できる。

Personal Spaceはテスト実行用のスペースなのでついでに有効にすると良い
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2826228/90166c61-b2f1-079b-0f09-957e39d50fc5.png)


〇Unattended の登録方法

Orchestrator >> Admin >> Account&Groups >> Users　でユーザーを招待

Edit Lisence Allocation からAutomation Developerライセンスを設定


Orchestrator > Tenant > MAchine から　Runtime Licenseを設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2826228/32f2eae8-6802-46c2-6fbf-15f60a2ef991.png)

ーーー
◆補足
Unattended ランタイム - 運用環境で無人プロセスを実行するために使用できます。
NonProduction ランタイム - 無人プロセスを運用環境にデプロイする前に、プロセスが期待どおりに実行されることを確かめるためのドライランを行うために確保されているランタイムです。
Testing ランタイム - ロボットでテスト セットとテスト ケースを実行できます。
テストケース：https://docs.uipath.com/orchestrator/lang-ja/v0/docs/test-sets

Unattended と　NonProduction は利用方法としては同じです。NonProductionはテスト用のおまけのようなものだと理解してます。
※CE版ではありません

テストケースの利用を考えるときのみTestingを利用すると良いみたいです。
ーーー


enant > 利用したいフォルダ選択 > ユーザー > Edit を開く

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2826228/dc07dc6f-66f9-74a6-403e-8e06572396bd.png)

3つ目のページの
Allow unattended robots to run automations .... を有効にして
Domain/ Username /Passwordを設定する。

ドメインパスワードはcmd で　whoami と打つと出てくるよ！


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2826228/a8763455-6e5a-eeb0-06e3-4bce30d069ae.png)
私の開発環境 *env系まとめ

# 私の開発環境 *env系まとめ

## この記事のモチベーション
自分の開発環境を上手に構築管理出来る事は、大事な事だと思います。

プログラミング言語のバージョン管理をpyenvやrbenv、ndenvなどで管理しているが
以前は、それぞれインストールしてごちゃごちゃしていました。

チームのメンバーともこの様な環境構築の方法を統一していると
サポートもしやすいです。

そこで・・・
・それぞれのバージョン管理ツールのインストール方法を統一する
・どのバージョンに設定しているのか、どのバージョンが入っているのかを確認しやすくする

と言う事で、*env系をまとめて確認できる「anyenv」を使っています。

# anyenvのインストール
```
$ git clone https://github.com/riywo/anyenv ~/.anyenv
$ echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.zshrc
$ echo 'eval "$(anyenv init -)"' >> ~/.zshrc
$ exec $SHELL -l
```

# anyenvで、*env系をインストールするので、インストール方法も統一され簡単
```
$ anyenv install rbenv
$ anyenv install pyenv
$ anyenv install ndenv
```

# あとはいつもの様に、*envから使いたいバージョンをインストール
```
$ ndenv install v7.10.0
$ pyenv install 3.6.0
$ rbenv install 2.4.1
```

# PJ毎のバージョン指定は、「.xxx-version」ファイルで
```project/.node-version
16.16.0
```
```project/.python-version
3.9.13
```

# 他にも、phpenvなど多数あります。
```
$ anyenv install -l
  Renv
  crenv
  denv
  erlenv
  exenv
  goenv
  hsenv
  jenv
  jlenv
  kubectlenv
  luaenv
  nodenv
  phpenv
  plenv
  pyenv
  rbenv
  sbtenv
  scalaenv
  swiftenv
  tfenv
```

# Azure Functions Core Tool の複数バージョンを切り替えるツールには、「funcvm」を使う
このツールは　当時 Azure Functions の開発チームの中の人だった人が作ったものだそうです。
Node.js で動くので、環境に Node.js がインストールされていない場合は先に Node.js のインストールが必要です。
anyenv＋nodenvで準備すれば簡単ですね！

## funcvmをインストール
```
$ npm install -g @anthonychu/funcvm
```

## Azure Functions Core Tool インストール
```
$ funcvm install 4
```

# PJ毎のバージョン指定は、「.func-version」ファイルで
```project/.func-version
4.0.4736
```

# おしまい
特に環境トラブルは大きな時間を取られる事が多いので
自分だけでなくチームで整理した方が幸せになれるかと思います。
他人の Outlook に Adaprive Cards （Actionable Email）を送信する方法

# はじめに

Power Automate からアダプティブカードをTeamsに送信し、かつユーザーの応答を受信する機能を利用されている方は多いかと思います。

**アダプティブカードは Outlook へメール送信し応答を受けることが可能です。**
※ Microsoft の Docs には **「Actionable Email」**  という名称で記載されています

方法は以下の [Hiroさん](https://twitter.com/mofumofu_dance) のブログを参照ください。

https://mofumofupower.hatenablog.com/entry/2020/04/20/140000

また、以前、私の登壇でも解説しておりますので、スライドを参考ください。

https://speakerdeck.com/miyakemito/power-automatedefalseadaptive-cards-ji-ben-bian?slide=89




# Actionable Email の仕様

**ただし上記の方法では、Actionable Email の送信先は、フロー実行者のメールボックスに限られてしまうという仕様です。**
（フロー実行者以外のメールボックスに送信したアダプティブカードは表示されない）

今回は、この Actionable Email を、フロー実行者以外に送信し応答する方法を紹介します。


# Actionable Email の送信

今回この記事を記載するきっかけとなったのは、以下の Power Automate BLOG です。
設定方法はこちらを参照ください。ブログ内で分かりにくい部分を説明します。

https://powerautomate.microsoft.com/ja-jp/blog/how-to-use-actionable-messages-in-outlook-with-power-automate/

Docsこちら。

https://docs.microsoft.com/en-us/outlook/actionable-messages/email-dev-dashboard#scope-of-your-submission


## Actionable Email Developer Dashboard にプロバイダー登録する理由と方法

他人へアダプティブカードをメールで送信し、応答するには、[Actionable Email Developer Dashboard](https://outlook.office.com/connectors/oam/publish/) へプロバイダー登録する必要があります。


理由は上記の通り、フロー実行者以外のメールボックスに送信した　Actionable Email は、空白のメールとなるためです。




Actionable Email Developer Dashboard　の各項目の抜粋です

![{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/ddd51415-ec7f-889e-a661-7279fa67d750.png)

① Provider Id (originator)
　　この値を、アダプティブカード のペイロードに、

```
"originator": "{Provider Id の値}"
```
　　と記載してください。
　　階層は、トップレベルです。（Adaprive Cards version などが記載されている階層）　


② Sender email address from which actionable emails will originate
　　メール送信フロー実行者のメールアドレス

③ Target URLs
　　アダプティブカードからの応答（Actio.HTTP）を受け取らない場合は不要なのですが、必須入力かつバリエーション有のため、
　　Power Automate の「HTTP 要求の受信時」で生成されるエンドポイントをダミーで取得し、張り付けてください。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/f38e65ab-7b7d-063e-3503-108231127dde.png)


④ 2. Scope of submission

　　> Organization 
　　　　Actionable Email の送信先が同一テナントの場合、組織の Exchange 管理者に申請します。
　　　　（Exchange 管理者は受信する申請メールから承認します）

　　> Global
　　　　Actionable Email を テナント外を含む Office 365 任意のユーザーに送信する場合に選択します。
　　　　（Microsoft の承認が必要で、2週間かかるとのことです）

# まとめ

Adaprive Cards は Teams メインの機能の感はありますが、メールで利用するケースも存在するかと思います。
ご活用ください。
『システム運用アンチパターン』輪読会 1章「DevOpsを構成するもの」

* ある日の夜10時、バッチ処理でエラーが発生！
* 開発者はバッチを止める権限を持っておらず、社内ドキュメントを探して運用マネージャーに電話し、口頭でコマンドを教えて対処
* リリース前テストも不十分だったが、開発環境に十分なハードウェアが無く、本番とのデータの違いもあった

---

* いろいろな疑問は出るが、あまりに日常的な問題で検討されていない
* 開発チームと運用チームの役割の違いとして受け入れてしまうから
* よく「俊敏性を犠牲に安全性を手に入れる」と承認プロセスを増やしてしまうが、実際はほとんど役に立っていない


---

## 1.1 DevOps

* この本では「ソフトウェア開発の考え方をほかの役割に適用するようなソフトウェア開発手法」のこと
* 多くの人は導入するツールから考え始めるが、まず①人②プロセス、最後に③ツールを考えるべき
* そうしないと揉めるし、使うべきでないところにまで使ってしまうから

---

## 1.2 CAMS

* CAMSという4つの柱がある
* ①文化(culture)、②自動化（automation）、③メトリクス（metrics）、④共有(sharing)
* （「頻繁・小規模にソフトウェアアップデートする」というリーン(lean)を加えて「CALMS」という人もいるが、それが現実的でない分野でも有効なのでCAMSでいく）


---

### 補足: CAMSの中で印象的だったコメント

* **文化**は「チームが活動する上での基準を変えること」。どう変えるかは文化の実態によるので、具体例だけでなく「問題を特定する方法」も紹介する。ほとんどの問題はテクノロジではなく人の問題
* **共有**は「知識は自由であるべき」という考え方がある。人は誰かに教えるときによく学ぶ

---

## 1.3 また別のDevOps本？

* **なぜ**自分の会社の文化が悪いのかを理解するのが重要で、ほとんどの本は悪い点を指摘しているだけで役に立たない
* 文化は組織のトップから生まれることも多いが、個人やチームリーダーが推し進められる変化も多い
* あなたが組織の中で実行し、調整し、繰り返すことのできる具体的なアクションをまとめた


---

## 本章のまとめ

* DevOpsの本質は、仕事に対する見方や、異なるチームにまたがるタスクを再定義すること
* そのためにこの本では、組織内の問題を検証し、生産性を低下させる要因に対処する方法を紹介する
* 特に本書の前半では、具体的な行動にも着目し、組織文化がそれに与えている影響も紹介する（例: 運用マネージャーに連絡が必要だったパターナリスト症候群のためだ）
外資系テクニカルサポートエンジニアがよくつかう英文例

## 前書きという名の言い訳
英語慣れしていない中でなんとか英語圏のエンジニアに対応してもらいたい。
エンジニアとのコミュニケーションの心理的負荷をできるだけ下げたい。

## ミーティング頻出語
**Could you say that again?**
もう一度言ってください。

**Could you explain the part about~~?**
~~の点について説明してください。

**I believe we have to do~~**
我々は～～すべきと思います。

## チャット頻出語
**Hello, How are you? One question/I need one help, 疑問文・依頼分**
チャットからいきなり質問する。

**To be frank ~~.**
実のところ

**for what it's worth**
役に立つかどうかわかりませんが

**What Do you mean?**
どういう意味ですか？

**What do we know so far?**
今のところ何がわかっていますか？

## 問い合わせメール
**It would be great if you could ~~.**
~してくれとうれしいです

**He is already looking into it.**
彼がその件についてもうすでに調査しています。

**Is there any update on this?**
進捗確認：なにかアップデートはありますか？

**This is Kindly reminder. Please let me know if you need more information concerning this matter.**
進捗確認：親切なリマインダ（放置されたときのリマインダ）

**Please give me your best guess.**
推測できる範囲で教えて下さい。

**This case is our foremost priority.**
この件は最重要事項です。

**Can you send the result today? We need the data as soon as possible.**
結果を今日送ってくれますか？データが最速で必要です。

**???**
お客様にxxxxの影響があります

## メールの挨拶
**How are you doing? Hope everything is okay for you and for your family.**
挨拶：コロナの影響で健康を確認する書き出しが増えたように思います。

**my name is xxxx and I'm a software engineer in the xxxx team.**
自己紹介：自分の名前と仕事を紹介

**Let me give you a brief description about the problem and our solution.**
問題点と解決策について簡単に説明します。

## メールの締め
**Thank you in advance for your support!**
謝辞：回答をおねがいするときに in Advance を使うことが多め

**For other questions don´t hesitate to contact me.**
定型文：何か質問あれば教えてください



## 参考文献・サイト


https://zenn.dev/boarwell/articles/english-examples

https://zenn.dev/magurotuna/articles/7234eed992db34

https://www.hitachi-systems.com/report/specialist/business-english/05/index.html

https://www.amazon.co.jp/%E3%82%82%E3%81%86%E3%81%93%E3%82%8C%E3%81%A7%E8%8B%B1%E8%AA%9E%E3%81%AB%E6%8C%AB%E6%8A%98%E3%81%97%E3%81%AA%E3%81%84-%E8%B5%A4%E7%BE%BD%E9%9B%84%E4%BA%8C-ebook/dp/B01E6OG6WG/ref=sr_1_2?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=2LDBT3H5D63HM&keywords=%E3%82%82%E3%81%86%E8%8B%B1%E8%AA%9E%E3%81%AB%E6%8C%AB%E6%8A%98&qid=1662350450&sprefix=%E3%82%82%E3%81%86%E8%8B%B1%E8%AA%9E%E3%81%AB%E3%81%96%E3%81%9B%E3%81%A4%2Caps%2C221&sr=8-2
Spring Boot + RemoteContainer

## はじめに

こんにちは、まだしばらくは新人エンジニアだと思っている者です。
java触ってみたいなぁと思ったので(javaの資格が欲しくてw)ついでにフレームワークもやろう！
くらいのノリでとりあえず環境構築していきます。Spring Frameworkよりはシンプルと見たのでそれを信じております。
勉強するならフレームワーク触る前にやった方がいいやろ！というご意見は確実にあるかと思いますが(僕はそう思った。。)フレームワークいじる方が楽しそうなので流されてきました。

## containerで構築

javaコンテナの作成をこちらの記事を参考に進めてみる。
[Docker × Spring Boot環境構築](https://qiita.com/A-Kira/items/beaf79a0d39d9839e61e)

上記の記事に沿って進めるとGradleのビルドが上手く行きませんでした。

```
# javaコンテナにインスペクション
$ docker-compose exec java bash

# gradleビルド
$ sh gradlew build
xargs is not available
```
docker-compose exec java bashのコマンドでjavaのコンテナの中に入り
ビルドすると、xargs is not availableが出力されビルドができません。

[xargs is not availableが表示される件](https://serverfault.com/questions/1094942/how-to-install-xargs-in-container-running-openjdk17-oracle)

### 方針の変更

ここまで来てそのままやっても上手くいかないので方針を変更しました。
インストールとかあんまりしたくないな。。という気持ちも強くなってきたのでRemote Container(.devcontainer)で作成するように方針を変えていきます。

## RemoteContainerでの構築

一度まっさらにする。

ありがたいことに同じようなことをしてる方がいたので参考にしました。
結局dockerを完璧に理解してないから時間もかかるし良くないんでしょうね。
しかしそっちに手を回す余裕がない、、

container部分は[参考コード](https://github.com/rltnm7/devboot)を参照しました。
build後はほぼ[Spring BootをVSCodeで「Hello World」を表示させてみた](https://tech-lab.sios.jp/archives/19941)の通りに進めております。


## Configure Runtime for Language Server
なんだろう。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1628058/8af16da4-ed17-60b5-a372-061fddaa409a.png)

devcontainer.jsonの設定がよろしくなかったので一旦localに起因するものはコメントアウトしておく。

HelloContorllerの作成。
/boot/demo/src/main/java/com/example/demo/controller/HelloController.java
```java
package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloController {
    @RequestMapping("/hello")
	public String index() {
		return "hello";
	}
}
```

hello.htmlの作成。
/boot/demo/src/main/resources/templates/hello.html
```
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Hello!!!</title>
</head>
<body>
    <h1>HelloWorld</h1>
</body>
</html>
```

javaファイルを実行するとportが開くので8080/helloを開く。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1628058/d010cdd5-d481-908c-5c77-05c04bc2d65d.png)

HelloWorldが表示されました！

## 終わりに

HelloWorldの表示はなんとか出来ましたが、完璧な環境構築とは言い難いものでした。
更に修正を加えまたqiitaに出します。
何か良い情報などありましたらコメント頂けると幸いです。

## 参考にさせて頂いた記事一覧

[参考コード](https://github.com/rltnm7/devboot)
[Spring BootをVSCodeで「Hello World」を表示させてみた](https://tech-lab.sios.jp/archives/19941)
[Spring Boot + Docker の Java 開発環境構築](https://qiita.com/Tomoyuki_Mikami/items/92f63e4e2b2241959f1e)
Figma上でAIによる画像生成ができるプラグイン、Andoが出たので試してみた

## この記事の概要

Figma上でAIが画像生成をしてくれるプラグインが出たので、導入の仕方について記事にしました。

https://ando.studio/

## Andoとは

参考画像とプロンプトを指定するだけで、Figma上で画像を自動で生成してくれます。
プロンプトだけでも生成はしてくれますが、参考画像を指定した方が希望の見た目に近づけやすいです。

Stable Diffusionを用いているようです。

https://twitter.com/RemitNotPaucity/status/1562319004563173376

## 導入

Figmaのコミュニティ上で`Ando - AI Copilot for Designers`と検索すると出てきます。[^1]

[^1]: 2022年9月5日現在、なぜかURLを共有すると404で閲覧できないのですが、直接Figmaから調べるとアクセスできます。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/5a99c445-12c3-fa77-f505-4e64f46b9976.png)

プラグインを起動するとこのようなウィンドウが立ち上がるので、`Sign in`しましょう。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/51466c08-d321-5767-a82f-5e5dcc7058df.png" alt="" width="340">

クリックすると、Andoのサイトに飛ぶので、`Get Started`をクリックしてログイン画面に移ります。

https://ando.studio/

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/d319ee3c-32d4-5280-266a-8114bcc26341.png)

普通のGoogleログインです。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/c51fb1bc-7577-7c43-b910-121ccd600631.png)

ログインが完了するとプランを選ぶ画面に切り替わります。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/bd2e89d9-a5da-1053-b75e-59c23440fae0.png)

スクリーンショットに書いてある通りですが、プランの違いは以下です。
Proには`All latest features.`と記載がありますから、今後プランによる機能の違いが出てくるのかもしれません。
現時点（バージョン0.0.3)では枚数の違い以外は無さそうです。

プラン名 | Free | Pro
--- | --- | ---
料金 | $0 | $18 / 月
生成可能な画像の枚数 | 42枚 / 月 | 無制限

ログインが完了した上でFigmaに戻ると、プラグインのウィンドウが変化しています。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/57e81beb-1a44-b46d-1701-a9fb3204ef5d.png" alt="" width="340">

これで導入は完了です。

## 使い方

サイトトップで見本として使われている`futuristic sneaker with translucent material, studio lighting, product photography`というプロンプトを拝借します。

`Prompt`のテキストエリアに文章を入力するのみでOKです。

参考画像無しで生成したところ、このようになりました。
スクリーンショットには2つの画像を表示していますが、1度に生成されるのは1枚だけです。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/fa1009ca-981b-392f-3baf-12ee8067ad1f.png)

次に、参考画像を指定します。
と言っても特にやることは無く、任意のFrameを選択すると自動で`Reference`に指定されます。
指定する対象はパスでも画像でもなんでも大丈夫です。
強いて気を付けることと言えば、deep selectして間違った対象を参考画像に指定しないこと、くらいでしょうか。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/fbd074c2-34a4-6651-6b3a-f659e4cd95dd.png)

黒い絵を指定しているのに白いスニーカーが出現したものですから、驚いて4回も試してしまいました。
テイストも割とバラバラですし、制御するのはなかなか難しいのかもしれません。
プロンプトも公式のものを拝借しているので、そこまでおかしな内容では無いはず......。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/150c506d-f127-f1d6-9832-b689706dafd1.png)

参考画像を指定した場合、`Prompt Weight`から画像とプロンプトどちらに重みをつけるか指定できます。
範囲は0から100で、デフォルトは80です。

ただ、上で記載している通り、参考画像を参考にしている感が薄く、かなりImageに寄せてもこういった出力でした。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/e5c257a2-8b18-6e82-a8c2-8ca71d8f8b79.png)

## まとめ

- Googleログインだけで導入できる
- 無料で生成できる枚数が42枚/月と多い
- 狙ったテイストを生成するのは大変そうな印象
- まだバージョンが0.0.3なので、今後機能が増えていきそう？

---

最後まで読んでくださってありがとうございます！
Twitterでも情報を発信しているので、良かったらフォローお願いします！

https://twitter.com/xrxoxcxox
AtCoder Beginner Contest 266

## [A - Middle Letter](https://atcoder.jp/contests/abc266/tasks/abc266_a)

O(1)

```C++:C++
#include <bits/stdc++.h>
 
#define rep(i,n) for(int i=0; i<(n); ++i)
#define repx(i,x,n) for(int i=x; i<(n); ++i)
#define fixed_setprecision(n) fixed << setprecision((n))
#define execution_time(ti) printf("Execution Time: %.4lf sec\n", 1.0 * (clock() - ti) / CLOCKS_PER_SEC);
#define pai 3.1415926535897932384
#define NUM_MAX 2e18
#define NUM_MIN -1e9
 
using namespace std;
using ll = long long;
using P = pair<int,int>;
template<class T> inline bool chmax(T& a, T b){ if(a<b){ a=b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b){ if(a>b){ a=b; return 1; } return 0; }
 
int main() {
    string S;
    cin >> S;
 
    cout << S[S.size() / 2] << endl;
 
    return 0;
} 
```

## [B - Modulo Number](https://atcoder.jp/contests/abc266/tasks/abc266_b)

O(1)
文章の意味が分からなくて詰みました。
モジュロ演算とは割り算の余りを求める計算のことです。

```C++:C++
#include <bits/stdc++.h>
 
#define rep(i,n) for(int i=0; i<(n); ++i)
#define repx(i,x,n) for(int i=x; i<(n); ++i)
#define fixed_setprecision(n) fixed << setprecision((n))
#define execution_time(ti) printf("Execution Time: %.4lf sec\n", 1.0 * (clock() - ti) / CLOCKS_PER_SEC);
#define pai 3.1415926535897932384
#define NUM_MAX 2e18
#define NUM_MIN -1e9
 
using namespace std;
using ll = long long;
using P = pair<int,int>;
template<class T> inline bool chmax(T& a, T b){ if(a<b){ a=b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b){ if(a>b){ a=b; return 1; } return 0; }

int main() {
    ll N, MAD = 998244353;
    cin >> N;
    
    ll ans = N % MAD;
    if(ans < 0) ans += MAD;
    cout << ans << endl;

    return 0;
} 
```
新人エンジニアが感じたあんなことやこんなこと

## はじめに

みなさんこんにちは。
プログラミング歴4ヶ月の新米エンジニアです。
入ったばかりの頃は「おぶじぇくとしこう？^_^」みたいな感じでしたが、最近ようやく慣れてきました。

うちの会社のエンジニア部門は、5人ほどのチームに分かれて開発を進めています。
新人だった私もチームに配属されて3ヶ月が経ったので、実際に働いてみて感じてきたことをエンジニア・新社会人それぞれの視点でまとめていこうと思います。

## 〜エンジニア編〜

### その動詞どういう意味？

初期の初期に感じていたことはこれです。
「走る」「叩く」「吐く」「食わせる」など、その動詞自体は知っているけどどういう意味で使っているのかが分からないという言葉がゴッロゴロありました。
話の流れ的に多分こういう意味なんだろうな〜となんとなくは推察していましたが、慣れるまではエンジニア特有の言い回しに戸惑いまくってました。

### RubyMine、便利すぎ

本当にすごいですよね、RubyMine。
それまでプログラミング用のコードエディターを使ったことがなかった私にとって、RubyMineの機能は衝撃的なものばかりでした。
補完機能をはじめとして、リファクタ機能、検索機能、行の複製、マルチカーソル機能などなど。
コピーアンドペーストのショートカットキーだけで満足していた私には到底考えられないようなものばかりです。

いまだに、「えっそんなことできるの？」と思うことが次から次へと出てきます。
あまりにも便利過ぎて、当分使いこなせる気がしません。

### Railsのブラックボックス感

Railsも本当に便利ですよね。
「Rails （やりたい処理）」で調べたらだいたい出てくるので、あったらいいなと思うメソッドほぼ全部あるんじゃないかなという気になってきます。

ただ、なんでもやってくれちゃうが故に実際どんな処理が走っているのかが見えづらいのも事実です。
最初のうちはそんな細かいことにはお構い無しで、使えるものは使え精神でコードを書いていましたが、少しでも慣れてくるとそういう裏側が気になってきちゃうんですよね。

聞くところによると、rubyも大元を辿ればC言語で書かれているのだとか、、
 Rubyすら習得できていないうちはとりあえずそっとしておくことにします。

### 他言語に出会した時の絶望感

私にとっての母国語はRubyです。
なので、それ以外の言語で書かれたコードを見たときは基本的に絶望していました。
私の場合はそれが主にjsだったので、jsをいじらなければならないときは文字通り頭を抱えながら泣く泣くコードを書いていました。
また初めの頃はほぼ全ての処理をあらゆるサイトからコピペして書いていたので、Rubyを例に解説しているサイトが1つもないときは「終わった」と感じていました。

最近はようやくjsにも愛着が湧いてきたので絶望することはなくなりましたが、慣れ親しんでいない言語を扱う場面に遭遇したらまた辛い思いをすることになりそうです。

## 〜新社会人編〜

### わ、若い

まずはこれです。
うちの会社は全体で見ても平均年齢29歳と若い方ではありますが、私たちのチームの平均年齢はなんと24歳。若すぎる。
ほぼ全員入社してから2年も経ってません。
ちなみにその内3人は経験0スタートのプログラミング初心者。
なのにみんなゴリゴリにコード書いてます。怖いです、もう。

### タスクに関して放任主義

新人といえど、タスクはちゃんと任せてもらえます。
私の想像だと、慣れるまでの数ヶ月間は教育係がついて手取り足取り〜みたいな感じだったんですが、全くそんなことはなくほぼ放置プレイ。

とはいっても何も教えてくれないわけではありません。
こちらが質問すればちゃんと丁寧に教えてくれます。
~~つまり、こちらがなんのアクションも起こさない限り永遠に放置プレイが続きます（多分）。~~

なので、質問することに抵抗や苦手意識がある人には厳しい職場かもしれません。
逆にそれさえできれば非常に働きやすいところだと思います。

### 会議が会議っぽくない

会社といえばの、会議。
ドラマや映画でよく目にする、あの会議。
あれが会議だと思って生きてきたので、初めて会議に参加した時は拍子抜けました。
というか、そもそも自分が参加しているものが会議だということにしばらく気づきませんでした。

私たちの職場ではスクラムという開発手法を導入しており、その一環としてデイリースクラムという短時間の会議を毎日行なっています。
このデイリースクラム自体が会議っぽくないというのは一因としてあるかもしれませんが、全員がリラックスして談笑しているさまは私がこれまで想像していた会議とは全くかけ離れたものでした。

### 上司への忖度、皆無

結構ズバズバ言います。笑
ズバズバといっても、相手の気持ちを考えず乱暴に発言するとかデリカシーがないとかそういうことではなく、
「自分はこう思います」「それは違うと思います」みたいに、意見をバシバシいう感じ。
最近はもうなんとも思いませんが、初めの頃はそういう現場に遭遇するたびに私の方がハラハラしていました。

年齢とか全く関係ないです。
最も、年下からの指摘を素直に受け取ることができる人ばかりだからこれが成立しているわけですが、、
そう考えるとなんだかすごいですね。

## 終わりに

最後まで読んでいただき、ありがとうございました。
お仕事の息抜きになったなら幸いです。
maya python change render cam

```Python
import maya.cmds as cmds

cmds.setAttr("frontShape.renderable", False)
cmds.setAttr("perspShape.renderable", False)
cmds.setAttr("sideShape.renderable", False)
cmds.setAttr("topShape.renderable", False)

# turning on the camera which I want to set in maya render settings. You need  camera shape node.

cmds.setAttr('light_cameraShape.renderable', True)
```
Utilにシンプルな名前をつけると発見があると思った話

日時書式の変換にSimpleDateFormatをnewするのはもうやめよう・・・
parseするたびにtry～chatchは面倒だし。
DRYの観点から、いままで以上に、積極的に、Utilsクラスを作る。


「SimpleDateFormat」・・・抽象化すれば「DateFormat」。
ならば、シンプルに、「DateFormatUtils」とするべきだろう。


早速、空のクラスを作成する。
テストファースト。
具体的な実装は後回し。まずは、呼出し側から実装。

するとどうだろう。コードアシストで、既存のクラスがヒットするではないか。

「org.apache.commons.lang3.time.DateFormatUtils」

ちょっと中を覗いてみる。

・・・まさにやろうとしていたことが実装済みではないか。
しかも、構想の何千倍も気が利いた配慮が実装済み。

そんなわけで、オレオレDateFormatUtilsを実装することは中断し、

「org.apache.commons.lang3.time.DateFormatUtils」

を使うことになりました。

費用対効果 GOOD.
```java
String strDate = DateFormatUtils.format(date, "yyyy/MM/dd");
bioawk: Multiple fasta の sequence length を表示

# conda で簡単インストール  

[condaのサイト](https://anaconda.org/bioconda/bioawk)
  ```
   conda create -n bioawk_v1.0
   conda activate bioawk_v1.0
   conda install -c bioconda bioawk=1.0
  ```

# ヘルプ 
  ```
bioawk 
usage: bioawk [-F fs] [-v var=value] [-c fmt] [-tH] [-f progfile | 'prog'] [file ...]
  ```
  ```
bioawk -c help
bed:
	1:chrom 2:start 3:end 4:name 5:score 6:strand 7:thickstart 8:thickend 9:rgb 10:blockcount 11:blocksizes 12:blockstarts 
sam:
	1:qname 2:flag 3:rname 4:pos 5:mapq 6:cigar 7:rnext 8:pnext 9:tlen 10:seq 11:qual 
vcf:
	1:chrom 2:pos 3:id 4:ref 5:alt 6:qual 7:filter 8:info 
gff:
	1:seqname 2:source 3:feature 4:start 5:end 6:score 7:filter 8:strand 9:group 10:attribute 
fastx:
	1:name 2:seq 3:qual 4:comment 

  ```


# 実行
  
  ```
   bioawk -c fastx '{ print $name, length($seq) }' < sequences.fa
  ```
Hyper-V仮想Windows11の中でAndroidアプリ実行チャレンジ(AMD環境)

[ついに日本でもAndroidアプリがWindows上で動作 ～「Amazon アプリストア」プレビュー版が一般提供 - 窓の杜](https://forest.watch.impress.co.jp/docs/news/1434767.html)
↑の記事でも紹介されているように、MS公式のAndroidアプリエミュレータ機能が提供されたので、これをHyper-V上で動いている仮想Windows11で実行できるか試してみました。

# 結論
親機がWindows10の場合、AMDプロセッサマシンではHyper-V仮想マシン内でAndroidエミュレートはできません。
理由は以下です。Windows11以降でないとダメでした。

> 前提条件
> AMD EPYC/Ryzen プロセッサ以降
> * Hyper-V ホストは、Windows Server 2022 または Windows 11 以降である必要があります

参照：[入れ子になった仮想化による仮想マシンでの Hyper-V の実行](https://docs.microsoft.com/ja-jp/virtualization/hyper-v-on-windows/user-guide/nested-virtualization#prerequisites)
とはいえ、これに気づくまでに幾つか必要な設定を行ったので参考に記載します。


# 設定作業
## メモリ設定
Microsoft StoreからAmazon アプリストアをインストールしようとしたところ、"このアプリはお使いのデバイスでは動作しません"のメッセージが。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1024229/6320ac01-5fca-9258-b6cb-3cbd0cdb688a.png)
[インストール要件](https://support.microsoft.com/en-us/windows/install-mobile-apps-and-the-amazon-appstore-on-windows-f8d0abb5-44ad-47d8-b9fb-ad6b1459ff6c)は満たしているはずでしたが、よく見ると動的に割り当てられてるメモリが6GBと、8GB以上の条件を満たしていませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1024229/3aeda7e0-5ddc-33b0-05ff-a8b284f7e6d0.png)
動的メモリの最小値を8GB以上にすることで初めから必要量が割り当てられ、インストール可能になりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1024229/98c44c1d-6534-7173-24ff-82eb4012a409.png)


## 入れ子になった仮想化の有効化
Amazon アプリストアのインストールを進めると、"Android用Windowsサブシステムを起動できません"のエラーが。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1024229/41fa3a66-c8ef-aa6c-e993-1fb74bafda15.png)
調べると[仮想マシンの中で仮想マシンを実行させるための設定](https://docs.microsoft.com/ja-jp/virtualization/hyper-v-on-windows/user-guide/nested-virtualization)が必要であることが分かったので、仮想マシンシャットダウン後、以下のコマンドで有効化しました。
```PowerShell:PowerShell(管理者)
# マシン名が"Win11_1"の場合
Set-VMProcessor -VMName "Win11_1" -ExposeVirtualizationExtensions $true
# Win10/AMD環境であろうとコマンドは正常に終了し、何のメッセージも表示されませんでした。
```
設定後、仮想マシンの起動を行うと"このプラットフォームでは入れ子になった仮想化がサポートされていないため、仮想マシンを起動できませんでした。"のエラーが表示され、結論に書いたAMD非対応に気づきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1024229/7db3bda2-f0d7-cecd-47a9-d6f8cc45e069.png)

# おわりに
親機をWindows11に上げる気にはならなかったので私はここで挫折しましたが、環境満たしているのなら仮想マシン上でもAndroidアプリエミュレートができそうな気配を感じました。
ボタンを押すとランダム関数が走り、画像が遷移する方法

こんにちは、ブヒブヒです。
自分が学んだ内容をメモのつもりで書いていきます。


現在絶賛javascriptを勉強中です。
課題でjavascriptをルーレットを作ったので共有します。
ルーレットを作るには「HTML」「CSS」「javascript」「DOM」使います。

```javascript
HTML
画像
      <div id="target"></div>
      <div id="main">
        <img src="lunch/main.jpg" alt="おれのランチ" class="img_size">
      </div>
      <div id="slot">
        <img src="lunch/sushi.jpg" alt="寿司" class="hidden img_size">
      </div>


ボタン
      <button class="btn-blue" id="start_btn">start</button>  
      <button class="btn-red" id="stop_btn">stop</button>


CSS
      .hidden {
      display: none;
      }


javascript
配列を作成
      const lunch_lists = [
    {
        title: "久兵衛",
        image: "lunch/sushi.jpg"
    },
    {
        title: "叙々苑",
        image: "lunch/jojoen.jpg"
    },
    {
        title: "オレ！！",
        image: "lunch/ore.jpg"
    }

   ];


DOM 
    const target = document.getElementById('target'); 
    const start_btn = document.getElementById('start_btn'); 
    const main = document.getElementById('main');
    const slot = document.getElementById('slot').firstElementChild;
    
    
    let timer_id = 0; 
    

ランダム関数
    function randomImg(lunch_lists) {
        const rand = Math.floor(Math.random() * lunch_lists.length);
        slot.setAttribute('src', lunch_lists[rand].image); 
    };
    

スタートボタン
    start_btn.addEventListener( 'click', function(e) {
    
        main.classList.add('hidden');
        slot.classList.remove('hidden');
        timer_id = setInterval(() => {
          randomImg(lunch_lists);  
        }, 1000);
    });

```

クリックすると、ランダムで画像が遷移します。

1.スタートボタンを押すと
2.domでidのmain,slotを取得
3.main.classList.add('hidden');　の画像を隠す
4.slot.classList.remove('hidden');　で隠れていた画像を見せる。
　　　（CSSで当初から画像を隠している）
5.timer_id = setInterval(() => {randomImg(lunch_lists); }, 1000); });
　　　　で1秒ずつ、ランダムに遷移するように関数を作成



※
①firstElementChild  　「slot」の子要素を取得する　つまり下記を取得する
```
　　　　　<img src=".....jpg" alt="寿司" class="hidden img_size">
```
②識別の番号
```
let timer_id = 0; 
```

③setAttribute
```
setAttribute(name(属性の名前を文字列）, value（属性に設定したい値）);
```


次は、stop方法の記事
グラフ

ひと目見ただけで直感的にわかる、価値のある情報に生まれ変せることができる。
それが```グラフ```

代表的なものは、棒グラフ、折れ線グラフ、円グラフ

# レーダチャート
描かれる```形状の面積と凸凹具合で、特徴を把握```することができる。

### 凸凹
読み方 でこぼこ
出典　https://classy-online.jp/lifestyle/19025/#:~:text=%E3%80%8C-,%E5%87%B8%E5%87%B9%EF%BC%88%E3%81%A7%E3%81%93%E3%81%BC%E3%81%93%EF%BC%89,-%E3%80%8D%E3%81%A8%E3%80%8C%E5%87%B9%E5%87%B8%EF%BC%88%E3%81%8A%E3%81%86%E3%81%A8
### 凹凸
読み方  おうとつ
出典　https://classy-online.jp/lifestyle/19025/#:~:text=%E5%87%B8%E5%87%B9%EF%BC%88%E3%81%A7%E3%81%93%E3%81%BC%E3%81%93%EF%BC%89%E3%80%8D%E3%81%A8%E3%80%8C-,%E5%87%B9%E5%87%B8%EF%BC%88%E3%81%8A%E3%81%86%E3%81%A8%E3%81%A4%EF%BC%89,-%E3%80%8D%E3%81%AF%E8%A8%80%E8%91%89%E3%81%AE
#### 気づき
"でこぼこ"と読むことは知らなかった。

# ポートフォリオ図
```どの位置にどんな大きさで分布```しているのかを見ることができる。
例えば業界内における自社の位置付けや製品ごとのマーケット分布図などを表す。

### 図

https://wa3.i-3-i.info/word15630.html

# 問題を解いた時の気づき
### Zグラフとは？
```折れ線グラフの1つ```で、```数値の推移と累積、移動合計の3つの線を1つのグラフに表したもの```である。3つの線がZの形に似ていることからZグラフと呼ばれる。
出典 https://www.weblio.jp/content/Z%E3%82%B0%E3%83%A9%E3%83%95

### 特性要因図（フィッシュボーン図）とは？
```特性とは現在見えている結果```のことを指し、```要因とはその結果をもたらすのに影響を与えた要素```のことです。特性要因図は、結果である```特性がどのようにしてもたらされたかを図式化```して、そこに潜んでいる問題点をあぶり出すのに用いられる手法のことです。
...
実際の特性要因図を見ると分かるのですが、```魚の骨にとてもよく似た形```をしているため、フィッシュボーン（魚の骨）図、フィッシュボーンチャートなどと呼ばれることもあります。
出典 https://navi.dropbox.jp/fishbone-diagram

### ガントチャートとは？
スケジュール管理や作業管理など、```さまざまな業務の進捗状況を管理する表```を指し、企業においてプロジェクト管理に用いられています。一目見ただけで、```進捗状況を俯瞰的に把握```できるのが特長です。
...
今ではタスクの可視化やメンバー間の```情報共有の効率化```を目的に、多くの業界で使用されています。
出典 https://it-trend.jp/project_management/article/33-0008

### パレート図
* 「```発生している問題の中で大きな割合を占めているモノは何かを明確に特定```するための手法」
...
パレート図を使用すべきシーンとして「重点的に```取り組むべき問題を特定```したい」「問題の影響がどの程度か把握したい」「```改善前と後の効果を確認```したい」ときが挙げられます。
...
```重要な品質問題の項目と数量、影響度が一目でわかる```という点がメリットです。問題が視覚化することによって「どの問題解決に重点をおくか」「どの問題解決を優先すべきか」を論理的に判断することができます。
出典 https://backlog.com/ja/blog/how-to-create-the-pareto-chart-and-view-in-excel/

* 「パレート図」って単語が出てきたら「```棒が長い順に並んだ棒グラフと累積比率を表現する折れ線グラフで構成```されたグラフなんだな～」と、お考えください。
    出典 https://wa3.i-3-i.info/word15629.html
[IoT] esp32 + SIM7600 + TinyGSMでhttps通信

# 問題

TinyGSM v0.11.5 時点ではSIM7600でHTTPS通信はできない

![Screen_Shot_2022-09-05_at_10_55_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16757/ce2e18d2-a1e2-53b1-1de6-e61af1d69e54.png)

# 解決

ATコマンドで直接やる

[製造元][1]のページよりユーザー登録してログインして、PDFをダウンロードする

- SIM7500_SIM7600_Series_HTTP(S)_Application Note_V3.00


```cpp
// 通常通りここまででIPアドレスを振られてネットに繋がる状態にしておく

// まず初期化
modem.sendAT(GF("+HTTPINIT"));
modem.waitResponse();

// URL設定（PDFにはないが、256byte分しか設定できないので注意）
modem.sendAT(GF("+HTTPPARA=\"URL\","), "\"", url, "\"");
modem.waitResponse();
// get (=0) 送信
modem.sendAT(GF("+HTTPACTION=0"));
//////////////////////////////////
// +HTTPACTION=0からの期待する返答
//////////////////////////////////
// OK
//                        <- modem.stream.available()がすぐに来ないので注意
// +HTTPACTION: 0,200,9999 // 9999はページのbyteサイズ

// response待ち
if (modem.waitResponse() != 1) { // 「OK」のパート
  // ダメなら終了
  modem.sendAT(GF("+HTTPTERM"));
  modem.waitResponse();
}

// 「modem.stream.available()がすぐに来ないので注意」パート
for (auto c = 0; c < 5000; c++) {
  if (modem.stream.available()) {
    break;
  }
  delay(1);
}

// 「+HTTPACTION: 0,200,9999」のパート
// lineを加工するなりしてステータスコードを読んだり、bodyを読み込むためのbyte lengthを確保
std::string line = "";
line.reserve(50);
while (modem.stream.available()) {
  line += (char)modem.stream.read();
}

// length は上の結果から抽出したとして
modem.sendAT(GF("+HTTPREAD=0"), ",", length);
//////////////////////////////////
// +HTTPREAD=0からの期待する返答
//////////////////////////////////
// OK
//                <- modem.stream.available()がすぐに来ないので注意
// +HTTPREAD: 9999
// GETした内容...
// +HTTPREAD: 0

// 「OK」のパート
modem.waitResponse();

// 「modem.stream.available()がすぐに来ないので注意」パート
for (auto c = 0; c < 5000; c++) {
  if (modem.stream.available()) {
    break;
  }
  delay(1);
}

// 上下を +HTTPREAD: に挟まれた形になるのでどうにか加工して中身だけ取る
std::string body = "";
body.reserve(length);
while (modem.stream.available()) {
  body += (char)modem.stream.read();
}
```

[1]: https://www.simcom.com/product/SIM7600X-PCIE.html
79.プロトタイプ



# prototypeとは
オブジェクトに存在する特別なプロパティ
コンストラクタ関数と合わせて使う
# prototypeのフロー
1.コンストラクタ関数を作成する
2.1.のコンストラクタからprototypeを呼び出す
3.コンストラクタ関数の手順通り、呼び出すところまでやる
# prototypeのメリット
1.簡単に処理を追加することができる
2.メモリの節約ができる
# 書き方
#### 1.コンストラクタ関数を作成
```javascript
function Person(name,age){
	this.name = name;
  　　　　this.age = age;
  　　　　this.intro = function(){
  	console.log(`私は${this.name}です${this.age}`)
  }
}
```
#### 2.1.のコンストラクタからprototypeオブジェクトに処理を格納する
```javascript
Person.prototype.sayHello = function(){
	console.log(`${this.name}を今後ともよろしくお願いします`)
}
```
#### 3コンストラクタ関数の手順通り、呼び出すところまでやる
```javascript
Person.prototype.sayHello = function(){
	console.log(`${this.name}を今後ともよろしくお願いします`)
}

const tani = new Person("taniyan",34);
tani.sayHello()
→
//2.で書いた処理される
```
![スクリーンショット 2022-09-05 11.02.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/714631/b68a4055-c371-210e-e59b-5999b9d36a2d.png)

# プロトタイプがメモリの節約ができるわけ
前提としてインスタンスを生成すると
一旦全てのプロパティとメソッドが準備されることになる
＜プロトタイプなし＞
<tani> 
1.name
2.age
3.function よろしくー 
<sato> 
4.name
5.age
3.function よろしくー
例えば3と6は別の関数だけど、インスタンスは別々に生成される
＜プロトタイプあり＞
<tani> 
4.name
5.age
3.function よろしくー 
↑上記の3.function よろしくーという処理は_proto_というオブジェクトに参照がコピーされる
→taniもsatoも同じ_proto_を見に行くだけなので、
使わない時には生成する必要がない
→メモリーの節約になる
CakePHPでコレクションをログに出したら要素が欠けてた

# 事象
ORMでクエリ作ってそれを評価し、中身を確認したら要素が欠けていた。
同じクエリを実行すると２件取得できるが、取得結果をtoArray()して確認すると要素が一つになっていた。

# 公式の言い分
> 異なるソースから追加するときは、両方のコレクションのいくつかのキーが同じこともありえます。 例えば、2つの単純な配列を付加します。これは、 toArray() を使用してコレクションを 配列に変換するときに問題を示すことができます。あるコレクションの値で、キーを基にして 以前のコレクションの値を上書きしたくないなら、キーを削除して、すべての値を保持するために toList() を呼び出すことを確認してください。

日本語がおかしいがtoList()使えとのこと
# 対応
toList()でキーを振り直そう
個人メモ　余裕があれば、今度内部実装もみてみること
JetPack5.0.1DPでROS2 FOXYインストール

# 1.今回の環境

* 本体 AGX Xavier
    * Orin が手に入れば良かったのですが…JetPack5.0.1DPがインストール可能というとで
    * JetPackはNVMeにインストール
    * 今回は普通にUbuntu上のSDKmanagerよりインストール
    
![SSD.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2155177/18ef08bb-9f24-7d6b-1044-59bb166a5429.jpeg)

* 写真左がAGX Xavierのボード（ヒートシンクつき）で、右側がキャリアボードになります。
    * NVMe SSDは500GBを使用。
    * eMMCは使いませんでした。
   
:::note warn
注意
無線LAN使用の場合はPCIeのものかUSB WiFiドングルになると思いますが、予め有線でセットアップした方いいです。
:::

* 素のOSだけでいきなりWiFi ドングルを接続しても通信できません。
    * 今回TP Linkのrtl8812auドングルでしたので情報が豊富でドライバも準備していました。
    * 一般的にはDKMSでインストールになるのでその時にネットにつなげていないと使えないという…
    * 今回はDKMSにせずに普通にビルドしてインストール。なんとかなりました。

![slot.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2155177/3dafecad-1fd5-d644-bc87-5ae0d57682fd.jpeg)


* 参考リンク（その他紹介されている方のサイトでご自分にあうものを参照下さい）

https://tech.nosuz.jp/post/2021-09/ubuntu_wifi/#rtl8812au-and-rtl8821au


# 2. ROS, ROS2セットアップ

* 手抜きですいませんが、拙作のROS, ROS2セットアップのページを挙げておきます。
    * こちらにはOmniverseはインストールしません。
    * ROSの設定後、ROS2の設定後のbashrcの編集は気を付けてください。


https://qiita.com/Manyan3/items/dfa7617b3bc462c6bf9c


:::note info
インフォメーション
* ROSはnoetic
* ROS2はFoxyをインストールできます。
:::


* セットアップが正常にできているか2つターミナルを立ち上げて応答をみます。

```ROS2:terminal_1(送る側）

ros2 run demo_nodes_py talker

```



```ROS2:terminal_2(受ける側）

ros2 run demo_nodes_py listener

```

* 正常に応答すれば画面の様に受け側が応えます。

![Screenshot from 2022-09-02 16-22-22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2155177/d1103cce-e6ea-735b-2ad0-aee075eb0632.png)