OmniAICreator/Qiita-1.07M huggingface dataset:
USB端子や指の高さなど分割キーボードの豆知識

# TL;DR
- マグネットケーブルで端子もげを防ぐと良い。

https://amzn.asia/d/aHnNr7f

- 互換性には注意しつつ、親指用に背の低いキースイッチを購入すると良い。

https://shop.yushakobo.jp/products/7044?_pos=9&_sid=bfa0c3763&_ss=r

- はんだなしで使える自作キーボードはあるが，故障した場合に備えてはんだこてを買うべきである。

https://amzn.asia/d/1sVqjqc

# はじめに
キーボードにこだわりを持つ人が増えています。僕も長期インターンを始めた当初，メンターさんがHHKBをコトコト打ってるのをみて「自分のキーボードほしい！！」となりました。そして去年の冬ごろにChrone Cherry V3を購入して組み立て，その後ずっと使い倒しています。

今回は分割キーボードを使ってきて感じたことのうち「最初に知っておくと良いのではないかな」と思ったことをざっくばらんに共有します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2864472/4e95ed10-56fd-d5ff-5fe0-21b251dc59a3.png)


# その1: USB端子はもげるので対策が必要です
多くの先人がこの点について警告していました。僕は以下のケーブルを使っています。磁石でケーブルを脱着できるようになってます。

https://amzn.asia/d/aHnNr7f

なお，購入の際にはレビューを確認することをおすすめします。(念のため)

このケーブルではなくてもいろいろあるかと思いますので，こんな感じでとにかくUSB端子もげを防ぐことができるようなケーブルを準備すると良いです。
![IMG_1974.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2864472/42078dea-1dd0-d2e2-8b4f-f80325dd177b.jpeg)

# その2: 手の形的に親指とその他の指でキーの高さを変える（といいんじゃないでしょうか）
分割キーボードをこのような感じでテンティングせずに使う場合指は全て下向きとなります。

このときに親指のキーが他のキーと比べて同じ高さにあると親指の付け根のあたりが疲れますので，親指の部分だけロープロの軸を使うと良いと思います。

その際に注意してもらいたいのが互換性です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2864472/12ae84ac-b3ee-e792-b27a-3e4743388ed6.png)
上の表は以下のページから拝借してます。

https://shop.yushakobo.jp/products/7044?_pos=9&_sid=27b77765a&_ss=r

大体の方がCheeryMX互換のキーボードを持ってらっしゃると思うので簡潔に行ってしまえば上記リンク先の軸を購入されることをおすすめします。（僕はこのタクタイル版を使ってます。）Kailhの方はKailhのスイッチを買うようにしなければなりません。

「厳密に言うとロープロファイルではない」とのことですが段差をしっかり感じられ親指の痛みもなくなりましたので，少なくとも今回のようなユースケースにおいてはこの軸おすすめです。

# その3: はんだこては買っとくといい
これは組み立てたあとに気がついたのですが，最近ははんだ不要で軸とキーキャップを用意するだけで分割キーボードが使えるようになるみたいです。（組み立て済みとか，サービスとか）


分割キーボードのとっかかりとしては最も手軽ですが，僕はあえて「はんだこてで組み立てるべき」と主張します。

なぜならば，故障したときの心理的負荷が全然違うからです。なんかおかしい挙動をしたらとりあえずはんだづけをやり直すorパーツを変えるで大体直ります。（詳しい方に怒られそう）もしも最初に組み立てていれば構造がわかっており簡単に修理できます。

もしそうではなかった場合，まず「修理しようか買い直そうか」でまず悩み，次に「どうやって修理しよう/次は何を買おう」と悩みがどんどん増えていきます。これは良くないです。（ですよね？）

また，僕のような学生にとっては，故障するたびに買い直すよりも故障した部品だけ買い替えて修理する方が経済的に優しいです。


# 最後に
今回は自作キーボードについてのあれこれを雑に書きました。自作キーボード始めたい人がこの記事に辿り着くのか甚だ疑問ではありますが，もしもこの記事をここまで読んでくださった方には感謝を申し上げたいと思います。ありがとうございました。
スクラムにおけるDatadogを用いたObservability実践：システムの健全性とビジネス価値の両立

この記事は[Datadog Advent Calendar 2023](https://adventar.org/calendars/8602) の21日目の記事です。

私たちのチームでやっているDatadogの活用について、ChatGPTに伝えてベースを作り、画像や資料、リンクなどを加筆して作成しました。なので、私がいつも書いている文章よりは、少し丁寧な言い回しになっています。笑

## はじめに

こんにちは、私はMaaSアプリの開発チームのスクラムマスターです。
この記事では、私たちのMaaSアプリのシステムのObservabilityと健全性を強化するために、Datadogとアジャイル開発の一つの手法であるスクラムをどのように組み合わせているかを紹介します。私たちのチームでは、チームメンバーが運用も行っており、このブログは、スクラムチームが遭遇する一般的な課題と、これらを克服するための私たちの取り組みに焦点を当てます。

## Datadogの基本とAWSとの連携

Datadogは、複雑なクラウド環境の監視に最適なツールです。ログ、トレース、メトリクスの統合監視により、システムのパフォーマンスとサービスの安定性をリアルタイムで追跡できます。私たちは、AWS環境からのデータをDatadogに連携させ、AWSの各サービスのインテグレーションを活用したり、AWS Lambdaのエラーログ、X-Rayのトレース情報、Synthtics等を利用しています。これにより、システムの異常を素早く検知し、問題解決に迅速に取り組むことができます。

## システム構成とマルチオーガニゼーション活用

システム構成については、[AWS Dev Day 2022](https://speakerdeck.com/curanosuke/awsdevday-japan-2022-amazon-neptune-and-serverless) の資料も参照ください。

[![thumbnail](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447180/593f185e-b8e0-6d6d-3ca2-662ed7f761fb.png)](https://speakerdeck.com/curanosuke/awsdevday-japan-2022-amazon-neptune-and-serverless)

対象システムは、バス予約の方に、タクシー配車、レンタカー予約のシステムもあり、全てDatadogを利用しています。

各システムのダッシュボードやログをDatadogで表示する場合、Organizationを切り替える必要があります。
システムごとに切り替える手間が煩わしいため、[マルチオーガニゼーションのカスタムサブドメイン](https://docs.datadoghq.com/ja/account_management/multi_organization/)を使用することで、URLをシステムごとに分けることができるため、ブラウザのブックマーク等で切り替えることができます。

## アラートとSlack通知、Logs Patterns活用

Datadogでメトリクスモニタを設定し、閾値を超えた際にはSlackを通じて即座に通知を受け取れるようにしています。運用を担当するメンバーだけでなく、開発チームにも共有し、Slackで協力して問題を解決できるようにしています。また、LogsのPatterns機能を使用して、エラーログを効果的にグループ化し、問題のあるエリアを特定しています。

サービス開始当初は、アラートもエラーログも大量に発生することもあり、原因調査、不具合改修と併せて、必要な閾値の調整を行なっていきます。エラーログの発生傾向を掴むことで、頻発するエラーにフォーカスして、調査、対処を行なっていくことができ、Patterns機能はとても重宝しています。

## ダッシュボードの活用

私たちのダッシュボードは、日々の運用と監視の中心です。ここでは、API Gatewayのエラー率や、外部システムとのAPIエラー率など、SLO（Service Level Objectives）に関連する重要なメトリクスや、Patternsのエラーログや、Lambda、API Gatewayでの実行回数/エラー数などを表示しています。これらのデータは、システムの全体的な健全性を評価し、潜在的な問題を早期に発見するのに役立ちます。

![Datadog_dashboard.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447180/2729396d-8693-7a13-65c9-7f81b977abe6.png)

## スクラムでのDatadogの活用

スクラムでは、毎日実施するDaily Scrumというイベントがあります。
[スクラムガイド](https://scrumguides.org/docs/scrumguide/v2020/2020-Scrum-Guide-Japanese.pdf)には、スクラムの概念、要素、やり方の手引きが書かれていて、Daily Scrumは、スプリントゴールに対する進捗を検査し、これからの1日の作業の計画を作成する場とされています。

私たちのチームでは、それに加えて、前日からのアラートやエラーログのパターン、リクエスト数の変化などをDatadogのダッシュボードを通じて共有しています。これにより、チームはシステムの最新の状態について迅速に理解し、調査が必要な事象があれば、即座にPO（Product Owner）に対し、スプリントでのバックログタスクとの優先順位を相談することができます。

![スクリーンショット 2023-12-19 21.07.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447180/c0860ae1-9cd1-fa7b-fb98-81db49938ebf.png)


## まとめ

スクラムでDatadogを活用することで、私たちのチームはシステムの問題に迅速に対応し、ビジネス価値とシステム品質を維持しながら、開発プロセスをスムーズに進めることができています。このアプローチは、POにビジネス価値のバックログだけを優先的に進めるだけでなく、システムの状況を日々共有することで、システムの健全性を高めるためのバックログの必要性を認識してもらうことにも貢献しています。

私たちの経験が、類似の課題に直面する他の開発チームにとって有用な洞察と実践的なガイダンスを提供することを願っています。
自動テストを充実させるためにやったこと

:::note warn
[こちら](https://zenn.dev/atamaplus/articles/e1477fe17dc162)にも載せています
:::

:::note info
[atama plus Advent Calendar 2023](https://qiita.com/advent-calendar/2023/atamaplus) 23日目です。
:::

こんにちは。
パンダ好きエンジニアの [@pandineer](https://twitter.com/pandineer) です。

本記事では、自動テストを社内で広げていくために行ったいくつかの取り組みを紹介します。

# 自動テストを充実させたい、その背景
atama plusでは「教育に、人に、社会に、次の可能性を。」というMissionの実現のために、不確実性に向き合いながら事業やプロダクトを成長させています。
これからも、不確実性に向き合いながら事業やプロダクトを成長させていくためには、変化に強くなる必要があります。
開発者目線でも変化に強くなるための打ち手はいくつもあります。その中の一つとして、変更容易性を高く保つために自動テストを充実させたい、という想いがありました。

# 自動テストを充実させるために取り組んだこと
自動テストを充実させるために、色々な取り組みを行ってきました。今回は、その中でも特に私自身が深く関わった「テストギルド・パーティの設立」と「lumberjack day（社内ハッカソン）」の取り組みについて紹介します。

## テストギルド・パーティの設立
atama plusでは、フィーチャーチームとは別に、特定技術領域の横断組織体として「ギルド」、その分科会的位置づけとして「パーティ」という制度があります。
現在、テストコードに関連するものとして、「自動テスト推進ギルド」と、各テストフレームワーク/ライブラリごとに、「Jestパーティ」「pytestパーティ」「Playwrightパーティ」が活動しています。
ギルド・パーティについては、Advent Calendar20日目の[igawyさんの記事](https://qiita.com/igawy/items/d75c0a4dd6af9e4554de)でも詳しく説明されています。

自動テスト推進ギルド、および各パーティでは、テストコードを拡充することそのものよりも、みんなが拡充しやすくするための活動をすることが多いです。使い方を紹介したり、テストコード実装方針を考えたり、みんなのお困りごとの相談に乗ったり、という活動をしています。

例えば、Jestパーティでは、以下の目次を持つようなドキュメントを作成して、テストコード実装の一歩目が踏み出しやすくなるようにしています。

![スクリーンショット 2023-12-21 11.10.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322696/52c24e81-3949-a25d-0999-937d48448105.png)

テストコードを書く目的に関しては、柴田 芳樹さんがJaSST'18 Tokyoで講演された際の資料「私が経験したソフトウェアテストの変遷」を一部抜粋して利用させていただきました。
https://www.jasst.jp/symposium/jasst18tokyo/report.html

基本的な使い方をまとめるだけではなく、社内のお困りごととその解決策や、細かいテクニック、参考になりそうなPRなど、テストコード実装の応用編と言えるようなナレッジも貯めるようにしています。それにより、各開発メンバーが迷いなく、自発的にテストコードを充実させていけるような仕組みづくりに取り組んでいます。

Jestパーティでは、他にもflakyなテストを見つけて修正したり、テストの実行速度の改善に取り組んだりしており、テストコードのさらなる拡充へ向けて着実に貢献できていると思います。

## lumberjack day（社内ハッカソン）
atama plusでは、社内ハッカソンとして「lumberjack day」を開催しています。
ハッカソンについては、詳しくは[こちらの記事](https://note.com/atamaplus_dev/n/nebdb0e84a920)を御覧ください。


先日のハッカソンが開催された際、ちょうど世の中を沸かしていたGitHub Copilotが社内でも使えるようになったタイミングだったため、私と上述のigawyさんが、「GitHub CopilotやGitHub Copilot Chatを活用してテストコードを効率的に書くプラクティスを探る」というテーマで参加しました。

ハッカソンでは、ツールを利用するまでの流れを確認した後、どうしたら良いテストコードを生成できるかについて試行錯誤しました。

成果発表では、他のエンジニアにもハードル低く利用してもらいたかったので、
* インストール〜利用するまでの流れ
* おすすめのプロンプトと合わせて、実際にテストコードを生成する様子
* テストコードを生成してからマージできるようにするまでのプラクティス

を、スクショ付きで丁寧に紹介しました。

ハッカソンで実際にやってみて、以下の感触を得ました。
* シンプルなコンポーネントだったらそのままpassするテストをつくれそう
* 複雑なコンポーネントの場合は、プロンプトを色々試したり、プロンプトはそのままで再生成を何度か試すことで良いテストコードが得られそう

いずれにせよ、テストコードを書くためのとっかかりを作るには十分良さそうで、書き始めるための心理的ハードルは下げられそうです。

以下は、実際にCopilotを利用したエンジニアの社内のつぶやきです

![スクリーンショット 2023-12-20 21.57.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322696/e7aaa81d-1fe1-ed2e-18cc-082c50ab6b9c.png)

# これまでとこれから
本記事では、自動テストを充実させるために取り組んだことの内、ギルド・パーティの取り組みと、社内ハッカソンの事例を紹介しました。
これらの取り組みも実を結び、テストコードは着実に増えてきていますし、お困りごとのレベル（難易度）も上がってきていると思います。

一方で、Advent Calendar16日目の[sekkenさんの記事](https://zenn.dev/atamaplus/articles/b25d0a62ee0108)や、Advent Calendar20日目の[igawyさんの記事](https://qiita.com/igawy/items/d75c0a4dd6af9e4554de)でも触れられている通り、（高ければ良いというものでもありませんが）カバレッジもまだまだ上げていきたいですし、今はまだテストコードをどんどん書いていこうというフェーズのためテスト戦略を考える段階には至っていません。

これからも、新しいナレッジやツールを適宜取り入れながら、着実に前に進んでいきたいです。

明日は@seigai_tk24さんによる「第三者検証からatama plusのQAエンジニアに転職してみて」です。
ぜひ御覧ください！
Google Formsの質問説明を動的に変化させたい（開発中）

## 仕組みのイメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476751/b482aa96-89a4-5cf6-856e-f36de00f9d52.png)


在庫管理システムを作っていますが、過去に入力した同一の製品の個数や登録日などをフォームに反映させられることが理想

私の考えをかなり言語化できているサイトは参考サイトの上から２番目

## 参考サイト

https://support.google.com/docs/thread/48344518/solved-auto-update-auto-populate-the-form-with-realtime-data-from-sheet-after-response-is-submitted?hl=en

https://support.google.com/docs/thread/14515804/how-do-i-pull-in-data-from-google-spreadsheets-into-forms-so-that-it-is-referenced-in-a-question?hl=en

https://stackoverflow.com/questions/72707903/how-do-i-populate-google-form-questions-using-column-a-data-from-different-googl

https://jeffreyeverhart.com/2020/09/29/auto-fill-a-google-doc-template-from-google-sheet-data/
Excel利用者がわかるINNER JOINとLEFT JOINの違い / 使い分けについて

この投稿はアイスタイル Advent Calendar 2023 の23日目の記事です。



対象者：
SQLをこれから書きたい方、書こうとしている方

-----

# 始めに

初めまして、istyleのすぎたです。
昨期、事業部門から分析支援・推進を行うデータ戦略推進室というところに異動しまして、日々SQLを書く日々を過ごしています。

その中でも、SQLを書く上で大切なことは色々あるかと思いますが、
まず、SQL触り始めの最初の壁は、間違いなくJOINかなと思います。

また、その中でも、JOINでよく見かけるのはINNER JOINとLEFT JOINの２つだと思います。
なので、今日はその二つの結合についてと使い分けについてお話したいと思います。


# そもそもJOIN(結合)とは？

JOINとは、別々のテーブルをくっつける処理のことです。
例えば、顧客情報を持つテーブルと顧客がなんの注文をしたかの情報を持つ注文テーブルがあったとします。
それらを結合（JOIN）することで、関連する情報を組み合わせることができます。
Excelやスプレッドシートでいうvlookup関数に該当する処理がSQLだとJOINで実行することが可能です。


# テーブル結合の種類について

一般的に使用されるテーブル結合は全部で５種類あります。（以下、記載）

・INNER JOIN（内部結合）

・LEFT JOIN（左外部結合）

・RIGHT JOIN（右外部結合）

・FULL OUTER JOIN（完全外部結合）

・CROSS JOIN（クロス結合）

しかし、今回は冒頭でも説明した通り、以下のよく見かけるINNER JOINとLEFT JOINの２種類についてお話します。

今回は、この二つのテーブルを結合することを例に進めたいと思います。


□顧客テーブル

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3656761/8886efd9-7f27-d3ed-c3da-319c01d00968.png)


□注文テーブル

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3656761/69fd7ec1-b39b-35d2-3d03-0e479d611d18.png)


# LEFT JOINとは？--実際に結合してみよう

このJOINを使用すると、左側のテーブルの全ての行を保持しつつ、右側のテーブルの該当する行が存在する場合に結合します。

SELECT *
FROM 顧客テーブル
LEFT JOIN 顧客テーブル
             ON 顧客テーブル.customer_id = 注文テーブル.customer_id


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3656761/93ab3e2c-7a79-637b-21c9-81436d427194.png)


こんな感じで、左側のテーブル（顧客テーブル）の内容を全て保持しつつ、customer_idが一致するものを全てくっつけてくれます。そして左側テーブルには存在するけど、くっつけたテーブルに存在しないcustomer_idについてはnullという形で登場させてくれます。なので、まさにこちらがvlookup関数と似たような使い方が可能です。




# INNER JOINとは？--実際に結合してみよう

このJOINを使用すると、両方のテーブルに共通して存在する行のみを結合して取得することができます。

SELECT *
FROM 顧客テーブル
INNER JOIN 注文テーブル
               ON 顧客テーブル.customer_id = 注文テーブル.customer_id


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3656761/08f805fe-5669-fb26-87a5-02e6ae28a903.png)


こちらだと、こんな感じで、出力されます。LEFT JOINとの違いにお気づきでしょうか？
そうなんです。こっちだと、null表示されていた木梨さんが消えてしまいます。


# 二つの結合方法の使い分けについて

最後に使い分けについてです。
全ユーザーを見たい場合は、LEFT JOIN、重複するユーザーだけ見たいときはINNER JOINを使ってみてください。
phaser3のエフェクトためしてみよう

# はじめに

本記事はプロもくチャット Adevent Calendar2023の21日目です

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

# phaser3のエフェクトためしてみよう

https://rexrainbow.github.io/phaser3-rex-notes/docs/site/shader-builtin/

こちらの方が詳しく説明してくれていました
https://qiita.com/laineus/items/1b3aeda72ef5f7b38402#%E3%83%93%E3%83%AB%E3%83%88%E3%82%A4%E3%83%B3fx

いろいろありますね

自分の手元で試してみよう

ってことでサンタさんとニコニコくんにエフェクトかけます

![CPT2312202140-665x358.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329559/508c9295-7ffb-8926-8dd2-de12fd32d0bd.gif)

URL
https://babu-ch.github.io/phaser_fx_test/

ソース
https://github.com/babu-ch/phaser_fx_test/

使った画像素材はスイカゲームのときのニコニコとサンタさんです

https://qiita.com/babu-ch/items/b5ac12d59b0be19d5e61

https://qiita.com/babu-ch/items/6cd8dbea8e54aec41210

このeffectsのargsを変えれば、それぞれのエフェクトの引数を変えられます（これもUIで変えれたら便利そうですよね？めんどい）
https://github.com/babu-ch/phaser_fx_test/blob/a2e9274ebb6ae64ec6a5f4c2c84ed4127c5f3f61/src/scenes/MyScene.ts#L6-L23
```js
const effects:TEffect[] = [
    { name: "Barrel", args: [2] },
    { name: "Bloom", args: [0x00bfa5] },
    { name: "Blur", args: [1] },
    { name: "Bokeh", args: [0.5, 1, 0.2] },
    { name: "TiltShift", args: [] },
    { name: "Circle", args: [] },
    { name: "ColorMatrix", args: [] },
    { name: "Displacement", args: ['distort', 0.5, 0.5] },
    { name: "Glow", args: [0x00bfa5] },
    { name: "Gradient", args: [] },
    { name: "Pixelate", args: [] },
    { name: "Shadow", args: [] },
    { name: "Shine", args: [1, 1] },
    { name: "Vignette", args: [] },
    { name: "Wipe", args: [] },
    { name: "Reveal", args: [] }
]
```

使い方悪いのかうまく動いてないやつもあります　どんまい

# じつは

phaserのexample見たほうがいい

https://phaser.io/examples/v3/category/fx
pyinstallerでpythonスクリプトをexeファイル化

## はじめに
Python周りの環境とPythonスクリプトを1つにパッケージ化する "pyinstaller" について，紹介します．

## pyinstallerのメリット・デメリット
### メリット
Python環境を構築していないPCでもプログラムを実行することができるため，プログラム配布のハードルがかなり低くなります．

### デメリット
作成したexeファイルのサイズが大きくなる場合があります．また，exeファイルを修正することができないため，スクリプトの修正を行う度にexe化する必要があります．

## 動作環境
- pyinstaller 6.2.0

pyinstallerはpipを使用してインストールできます．
```
pip install pyinstaller
```

## コマンド紹介
### 基本構文
pyinstallerでスクリプトをパッケージングする基本構文は下記の通りです．
```
pyinstaller xxx.py
```

### オプション
パッケージングの際に，いくつかのオプションを設定することができます．使用頻度が高めなものを紹介します．

#### ```--onedir``` or ```-D```
-> 出力を1ディレクトリにまとめます．

#### ```--onefile``` or ```-F```
-> 出力を1ファイルにまとめます．

#### ```--noconsole``` or ```-w```
-> コンソールを表示しません．

#### ```--clean```
-> ビルド前にPyInstallerのキャッシュをクリーンアップし、一時ファイルを削除します．

#### ```--distpath DIR```
バンドルされたアプリ（exファイル）を配置する場所を指定します．デフォルトは ./dist

#### ```--exclude 除外するライブラリ名```
パッケージングの際に特定のライブラリを除外します．このコマンドは複数回使用できます．

```pandas```と```numpy```がexeファイルの肥大化に貢献しているので，スクリプトで使用していなければ積極的に除外したいところ．

#### ```-n NAME``` or ```--name NAME```
バンドルされたアプリと仕様ファイルに名前を割り当てます．デフォルトはPythonスクリプトのベースネーム．

## サンプルコード
```
pyinstaller test.py --onefile --noconsole --clean --exclude pandas --exclude --numpy --dispatch C:/Work --name test
```
Golang： 並行処理で何百万ものデータを簡単にフェッチする

## Golang： 並行処理で何百万ものデータを簡単にフェッチする

### 紹介
ソフトウェア・エンジニアとして、私たちはより少ない労力とメンテナンスで非常に強力なシステムを提供することを求められている。バックエンドの皆さんは、docやCSV、APIから何百万ものデータをフェッチするタスクがあるかもしれません。

巨大なデータをフェッチする際の問題は以下の通りです：

1. パフォーマンス
2. リソースの利用
3. データのフィルタリングとソート

### ケーススタディ
例えば、商品データを取得するためにパートナーのAPIと統合する必要があり、10分ごとに新鮮なデータを取得し、データが変更された場合はDBにアップサートする必要があるとします。

データのフェッチにいくつかの同時実行を使用することをお勧めします。データの異なるバッチで5つの同時実行があるとします。そうすると
1. スレッド1は1-100000のデータを取得するために実行されます。
2. スレッド2が100001-200000のデータをフェッチする。
3. 別のスレッドで続行

#### 並行処理とは
並行処理とは、ハードウェアとソフトウェアに応じて、コンピュータが複数のタスクを同時に実行する能力のことである。

### 実装
Golangでは、sync.WaitGroupを使って複数のプロセス（goroutine）を実行し、データの取得を処理することができます。

sync.WaitGroupはgoroutineの待機に使われる。実装はとても簡単で、Add()を使って実行したいゴルーチンの数を設定できる。

```
package main

import "sync"
import "runtime"
import "fmt"

var LIST_PRODUCT_TYPE = [3]string{"food", "electronics", "clothing"}

type GetListProductResponse struct {
    Data []ProductListResponse `json:"data"`
}

type ProductListResponse struct {
    Code         string `json:"code"`
    Name         string `json:"name"`
    Price        string `json:"price"`
    Status       bool   `json:"status"`
}

func getProducts(ctx context.Context, req *GetProductListRequest) (*GetListProductResponse, error) {
    // calling endpoint 3rd party
    // parse to response
    // and return the data
    return &productList, nil
}

func main() {
    wg := sync.WaitGroup{}
    doneChan := make(chan interface{}, 1) //シグナル待ち用
    productsChan := make(chan *GetListProductResponse) //実行するすべてのゴルーチンからのプロダクト・データを共有するためのチャンネルです。
    errChan := make(chan error)  //各ゴルーチンのデータ取得時のエラーを共有するためのチャンネル

//このループは商品データを同時に取得する
    for key := range LIST_PRODUCT_TYPE {
        wg.Add(1)
        req := &GetProductListRequest{
            ProductType: LIST_PRODUCT_TYPE[key],
        }
        go func() {
            defer wg.Done()
            products, err := getProductList(ctx, req)
            if err != nil {
                errChan <- err
                return
            }
            productsChan <- products
        }()
     }

     
//このコードは、sync.WaitGroup (wg)が完了するのを待ち、
//nil値をチャネル(doneChan)に送信してタスクが完了した
//ことを知らせる新しいgoroutineを開始している。

     go func() {
         wg.Wait()

         doneChan <- nil
     }()

     var (
         catalogues GetListProductResponse
         data       []ProductListResponse
     )

 // このforループは無限に実行され、その中にselect文があり、これは複数のチャンネルを同時に処理するために使われる。
     for {
         select {
         case <-ctx.Done():
             return nil, ctx.Err()
         case err := <-errChan:
             return nil, err
         case products := <-productsChan:
             data = append(data, products.Data...)
             catalogues.Data = data
         case <-doneChan:
         return &catalogues, nil
     }
   }
}

````

これがGolangでデータを同時に取得する例です。
【seleniumクラスシリーズ】Alertクラス



## はじめに
【seleniumクラスシリーズ】Alertクラスに関しての備忘録です。
初心者です😅
間違えてる部分が多々あると思います。
もし見つけた場合、ツッコミいただけると助かります🙇
<br>
## 🦁<INS>**結論**</INS>🦁
Alertクラスは自動化させる中でのポップアップの処理を実行するためにクラス。

:::note info
押さえておくべき点
* Alertクラスはブラウザのポップアップやアラートを扱うクラス。
* 主にJavaScriptで生成されたアラートに使用される。
* 警告、確認、プロンプトなどの種類のポップアップを扱う。
*  Alertクラスを利用する際にはポップアップがブロックされないようにseleniumのオプションを利用する必要がある（これによりユーザー操作が可能になる）
* ポップアップはなるべくログを残しておくとデバッグがやりやすくなる。
:::  
***


:::note warn
利用シーン
* ブラウザのポップアップやアラートが出た際の操作を自動化したい。
:::  
***

:::note alert
注意点
* ポップアップが出現する前にスクリプトが進行してしまわないように注意する。
* ブラウザ設定でポップアップがブロックされていないか確認する。
* 待機時間の設定が短いとポップアップが表示される前にタイムアウト指定しまう可能性がある（長めの待機時間の設定が必要）
* JavaScriptポップアップは、メインのページ処理とは別のタイミングで発生することがある（対処は待機時間を儲けるなど）
* 全てのブラウザで同じように機能しないことがある。
* 一部のポップアップはセキュリティ上の理由で制御できないことがある。
* ポップアップが出た際には必ず、ポップアップにフォーカスをスイッチする必要がある。
* ポップアップのテキストを読み込む時に、処理や表示がされてないなどがあった場合はエラーになってしまう（対処は表示されるまで待機時間や条件を設ける必要がある）
:::  

***


## メソッド一覧
### <INS>**import**
```
from selenium.webdriver.common.alert import Alert
```

### <INS>**accept()**
アラートのOKボタンをクリックし、アラートを承認。

```
# アラートにスイッチ 
alert = Alert(driver) 

# アラートを承認 
alert.accept()
```
***

### <INS>**dismiss()**
アラートのキャンセルボタンをクリックし、アラートを閉じる。
```
# アラートにスイッチ 
alert = Alert(driver) 

# アラートを拒否 
alert.dismiss()
```
***

### <INS>**getText()**
アラートのテキスト内容を取得。
```
# アラートにスイッチ 
alert = Alert(driver) 

# アラートのテキストを取得 
alert_text = alert.text print("Alert says:", alert_text)
```
***

### <INS>**sendKeys()**
プロンプトタイプのアラートにテキストを入力。
```
# アラートにスイッチ 
alert = Alert(driver) 

# アラートにテキストを入力 
alert.send_keys("Hello World")
```
***

### <INS>**switchTo()**
WebDriverからアラートにフォーカスを切り替える。Alertクラスを直接使用する際にはこのメソッドは必要ないが、driver.switch_to.alertを使って同じ効果がある。
```
alert = driver.switch_to.alert
```
***  


## まとめ😺
ポップアップを適切に処理する場合にAlertクラスを利用する。
フォーカスを切り替えたり、待機時間を適切に加えることが大事。
***
apex:outputTextだとインデントが効かなかった事と、一応の解決策

## はじめに
Salesforceのリッチテキスト項目では、インデントの設定ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603116/36dfff7e-1bf2-aee1-5e52-dba1325411a5.png)
当然保存した後レコードの詳細ページを見ても、インデントが反映されたままになっています。

そして、これらの値をVFページに出力する場合は「[apex:outputText](https://developer.salesforce.com/docs/atlas.ja-jp.pages.meta/pages/pages_compref_outputText.htm)」を利用することになるのですが・・。  

その際に、インデントが効かずに出力されます。  
なんでじゃい。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603116/e451e7a0-40ba-796a-09e6-0240f5485756.png)


## 解決策
### q1-indent-xをcssにて指定する
レコード詳細ページのインデントをどうやって指定しているか確認したところ、下記のセレクタにて余白が指定されていました。  
`.slds-rich-text-editor__output .ql-indent-1:not(.ql-direction-rtl)` 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603116/699a295f-b05a-449a-31c9-a56f3b65a609.png)


この`q1-indent-x`というクラス、実は`apex:outputText`にて出力した際にもきちんと反映されているのですが、親のクラスが設定されていないためインデントがついてないようです。  

~~そのため、親要素に`.slds-rich-text-editor__output`をつければインデントが反映される！はず！~~
と思ったのですが、反映されませんでした。  
どうやらVFページ側だとこちらを反映するcssが読み込まれていない模様・・？

なので、下記のようにちまちまclassを設定してあげることで、インデントを反映させるしかなさそうです。  
これ不具合では・・？

```css:style.css
.q1-indent-1 {
    padding-left: 3em;
}

.q1-indent-2 {
    padding-left: 6em;
}

.q1-indent-3 {
    padding-left: 9em;
}
```
MagicPodのテストステップ作成で、気をつけていること

# 概要
MagicPodのテストステップを記述するときに気をつけていることをメモします。
# 以下のMagicPod機能に関することです
- 共通ステップのネスト
- コメント機能
- 一時無効化機能
- 失敗時の動作
- 共有変数
- ラベル
# 共通ステップのネスト
これは最近、解禁になった機能です。それまでは共通ステップの入れ子はできませんでした。ただ、調子に乗って入れ子にし過ぎると、可読性が悪くなって、メンテナンスで苦労することになります。解禁になったと言っても、3階層までなので、気をつけているのは、基本、2階層までにとどめておく。一言で言えば、そんな感じです。<br>
テストが増えそうなところに、1階層使います。メインのテストステップに直接追加してしまうと、ステップ数が増えてしまうため、増えそうなテストを丸っと共有ステップにして、増えたテストは、2階層目の共有ステップに単独で追加し、1階層目の共有ステップから呼び出すようにしておくと、メインのテストステップは、影響をほぼ受けずに済みます。
# コメント機能
テスト条件を書いたり、テスト概要を書いたり、テスト管理ツールのテストスィート名を書いたり、テスト設計のアウトプットと、テストステップが紐付いているかをアピールする感じです。<br>
次の一時無効化機能とも連携させて使う場合もあります。
# 一時無効化機能
仕様変更により、一部のテストステップがスキップされるような場合に、削除はしないで、無効化しておく。後で、気が変わって、やっぱり、そのテストステップも必要だ　となった時に、復活できるように、コメント機能で「以下は、***では、廃止」と書いておき、無効化します。
# 失敗時の動作
デフォルトでは、テスト停止ですが、継続を選べることもできるようになっていますので、特にテストステップ作成したばかりの頃は、安定しないことも多いので、最後までテストを走らせる目的で、継続を選んでおきます。<br>
生SeleniumをJavaでゴリゴリテストコード書いていたときの、try{}catch{}みたいのが、これでできてしまう。
# 共有変数
開発環境、ステージング環境など、自動テストを走らせる環境のドメイン名を${baseURL}でテストステップ内に記述できるようにしておくと、テスト設定別にbaseURLを変えておけば、簡単に自動テストを走らせる環境を切替えることができます。
# ラベル
こちらも、ゴミ箱機能が最近リリースされたので、有効性は薄れた感ありますが、「仕掛り中」「動作確認済み」「非現用」の3種類はラベル付けてテストケース一覧で判るようにしています。非現用が無いのが理想ですが、中には捨てがたいのもあったり。
# 総括
紹介したことは、既に、導入されている方も多いかと、また、MagicPodの[ヘルプ](https://support.magic-pod.com/hc/ja?_gl=1*hz4fve*_ga*MTMwODMyNTEzMS4xNjc0ODI0NTgy*_ga_4W0MHF6GXK*MTY3NTc1NTQyNC45LjEuMTY3NTc1NTQ1Ny4yNy4wLjA.)でもとりあげていたかもしれません。<br>
MagicPodも進化の途上ですので、また何か有効な機能がリリースされたら、使ってみたいと思います。
行×列の入力を列単位でグループ化する

# はじめに

二次元配列的な入力を縦に処理する必要があるコーディング問題によく遭遇します。
毎回頭を悩ませるので解決方法を整理してみました。

# 問題
```
100 100 50
200 150 100
130 200 30
```
みたいな入力が与えられて、列を1グループとして扱わないといけないケースについて。
上の例だと
	グループ１：100 200 130
	グループ２：100 150 200 
	グループ３：50 100 30
みたいなイメージ。

標準入力やファイルからのインプットを処理するときは行ごとに処理していくのでこれを列単位にまとめるのに苦労していました。

# 解決方法

試行錯誤した結果、今のところ一番スマートだと思うやり方。

```java
String[] inputs = {
	"100 100 50",
	"200 150 100",
	"130 200 30"
};

// 取り組んでいるコーディング問題では行×列の個数はだいたい先に与えられる
int columnNum = inputs[0].split(" ").length;
 
Map<Integer, List<Integer>> map = new HashMap<>();
for (int i = 0; i < columnNum; i++) {
    List<Integer> elements = new ArrayList<>();
    for (String s : inputs) {
        elements.add(Integer.parseInt(s.split(" ")[i]));  // この例では数値として扱いたいのでparseInt
    }
    map.put(i, elements);
}

System.out.println(map);  // {0=[100, 200, 130], 1=[100, 150, 200], 2=[50, 100, 30]}
```
# おわりに

行×列の入力を列単位に処理する方法でした。
ちなみに、実業務でこういう処理が必要な場面は今のところ遭遇してません。

他にもこんなやり方あるよ、などあったら是非教えてください。
[備忘録]画像の劣化を最小限にしてWordファイルをPDF化する方法

# はじめに
wordファイルをpdf化した際に画像が劣化する問題を軽減したので備忘録として残します。
# 問題
wordファイルに貼り付けた画像を綺麗にpdf化するために以下の3つの処理をしました。

 1. [オプション]-[詳細設定]-[イメージのサイズと画質]　にて「ファイル内のイメージを圧縮しない」をチェックし、「規定の解像度」を高品質に変更。
![スクリーンショット 2023-12-21 095256.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2956203/08a1e780-51e6-d245-3bb6-b4d9bdd9ac0b.png)
2. [ファイル]-[名前を付けて保存]　より拡張子を"PDF"に変更後、[オプション]を選択して「アクセシビリティ用のドキュメント構造タグ」と「PDF/A 準拠」のチェックを外す。
![スクリーンショット 2023-12-21 095425.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2956203/cac48e8b-8f08-708d-156d-3d2e1c2b4121.png)
3. PDFで保存するときに[保存(S)]の左側にある[ツール]より[画像の圧縮]を高品質に変更
![スクリーンショット 2023-12-21 095436.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2956203/395a5252-e8cf-7869-b56d-65e355a217c5.png)

- しかし、これだけでは画像の解像度は不十分でした
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2956203/0544f8f5-80ff-bd22-f91d-3683028a8222.png)


# 解決方法
### CubePDFを使います。
- CubePDFはフォントの埋め込みにも対応する仮想プリンタです
https://www.cube-soft.jp/cubepdf/   
<br>

- インストール後、wordから[ファイル]-[印刷]から[cubePDF]を選択して印刷します。
- 3秒くらいすると以下の画面が表示されます。[その他]タブよりを選択すると、
![スクリーンショット 2023-12-21 101144.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2956203/18356402-d453-bf31-88d4-5b9dd7b28e1b.png)
- この画面が表示委され、「PDFファイル中の画像をJPEG形式で圧縮する」のチェックを外して「変換」で完了です
![スクリーンショット 2023-12-21 101155.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2956203/57d2355c-bdf1-d495-b490-502e10415d0e.png)

### 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2956203/52eb474d-c729-a670-ec8d-b8f6706945b5.png)

# おわりに
本記事では、CubePDFを利用してwordファイルから画像の劣化を抑えつつPDF化する方法を紹介しました。

もし他に良い方法があれば、ご教授いただければ幸いです
# 参考
360度評価をやってみた！

## 何故360度評価を実施したのか？

一人ひとりが自己成長することがチーム全体の成長につながると考えています。360度評価を通じて他者の視点を得ることで新たな気づきを得られ、単なる成績評価を超えて個人の成長を促すきっかけとなることを目的に実施しました。

![title.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3633090/b1d2e8eb-a12f-4421-328f-ffcb8fb24526.jpeg)

## 評価方法やツールについて

360度評価を実施にオンラインアンケートツールのgoogleフォームを用いました。

https://www.google.com/intl/ja/forms/about/

無料で利用できるだけでなく評価結果をスプレッドシートに出力することも可能で、単独でも評価結果をグラフ表示で分析が行えます。

![form.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3633090/f9748a23-3585-d2d4-e8fa-fd50770dea4d.jpeg)

様々なサイトを参考にして成長に焦点を当てた質問を考慮し、業務遂行能力、コミュニケーション能力、顧客との関係性、技術知識などの評価軸を設定し、合計20問ほどの評価設問を5段階評価で行いました。

## やってみた成果

期待していた効果が明確に見られました。評価を受けた者は業務実績を評価されたことで喜びと自信が付き、モチベーションが向上しました。また評価フィードバックにより改善すべき点が明確になりそれに基づいた行動を促すことができました。
![yorokobi.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3633090/15d33069-0aaf-7fc5-b6f1-61a8e0badc9c.jpeg)

## 課題と注意点

特定の評価者からの偏った攻撃的な評価が混在することがあります。そのような評価に直接会話して確認できるように記名方式で行いました。しかしながら評価に対して興味が薄い人や、談合して実際とは異なる評価が存在すると評価自体の意味を薄れてしまいます。また集まった評価を被評価者へフィードバックする際、メンターの手腕に依存しており、適切なフィードバックは困難を伴うことがあります。
![nayami.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3633090/a6934355-3264-ad80-7708-4e5cb73108ff.jpeg)

## 今後の展望

360度評価をより効果的なものにするために評価設問の検討や被評価者へフィードバックにおける運営者の負担軽減が必要です。今後はAIの活用などを検討し公平性を高める取り組みや運営者の負担軽減などを行い、被評価者へのフィードバックがもたらす効果を監視しながら360度評価の有用性を高めていきたいと思います。
![mirai.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3633090/26559b2e-bed4-049e-b764-2493a325ca0e.jpeg)

最後まで読んでいただきありがとうございました。この記事から少しでも新たな気づきや価値を見つけ、自身やチームの成長に役立てていただけたら幸いです。
React Contextでグローバルなstate管理

# 目的
Reactを自己学習しています。自分の備忘録として書きます。誤りがあればご指摘をお願いします。

# グローバルなState管理とは
複数のコンポーネントで共有される状態（state）を一箇所で管理するための仕組み。Reactにおいて、状態（state）は、そのコンポーネント内で管理されるが、複数のコンポーネントで共有する必要がある場合に、グローバルな状態としてどこらでも参照できるように管理する必要がある。

# Context　APIを使ったグローバルなstate管理の方法
①createContextメソッドの使用
②Providerコンポーネントで参照先に渡す値を指定
③useContextフックを使ってオブジェクトにアクセス

# ①createContextメソッドの使用
createContextメソッドを使って、状態共有のための新しいContextオブジェクトを作成する。
```React:UserProvider.jsx
export const UserContext = createContext({});

//UserContextは、状態の共有に使用されるコンテキスト
//デフォルトでは空のオブジェクトであるが、UserProviderを使用して任意の値を設定できる
```

# ②Providerコンポーネントで参照先に渡す値を指定
```React
return (
        < 作成したContextオブジェクト.Provider value={{ 渡したい値(グローバルなstate)}}>
            <参照先 />
        </作成したContextオブジェクト.Provider>
    );
```
作成されたContextオブジェクトが持っているProviderコンポーネントで参照先のコンポーネントもしくはchildrenをラップする。
```React:UserProvider.jsx
export const UserProvider = (props) => {//UserContextはProviderとConsumerコンポーネントを所持している
    const { children } = props;
    const [userInfo, setUserInfo] = useState(null);
    return (
        <UserContext.Provider value={{ userInfo, setUserInfo }}>
            {children}
        </UserContext.Provider>
    );
};
    
    //childrenプロパティでラップされていない場合、UserContextにuserInfoとsetUserInfoを設定することができない
    //つまり子要素のコンポーネントに渡すことができなくなる
```

# ③useContextフックを使ってオブジェクトにアクセス
useContextフックを使って、作成Contextオブジェクトにアクセスする。
```React:UserIcon.jsx
const { グローバルなstate  } = useContext(作成したContextオブジェクト);
```


```React:UserIcon.jsx
export const UserIconWithName = memo((props) => { //ユーザーのアイコンと名前のセット
    console.log(`UserIconWithName`);
    const { image, name } = props;
    const { userInfo } = useContext(UserContext);
    console.log(userInfo);//isAdminプロパティを確認
    const isAdmin = userInfo ? userInfo.isAdmin : false;
    return (
        <SContainer>
            <SImg height={160} width={160}
            src={image}
            alt={name}/>
            <SName>{name}</SName> 
            {isAdmin && <SEdit>編集</SEdit>}{/*//isAdminがtrueなら編集リンク表示 */}
        </SContainer>
    );
});
```

これでUserProvider.jsxからUserIcon.jsxへ直接グローバルなstateを渡すことができました。グローバルなstate管理の方法として他にもRedux、Recoilなどもあるので後程まとめていこうと思います。

参考記事
[【React】グローバルなstate管理について学ぶ Context
](https://asapoon.com/javascript/react/7474/react-global-state-context/)

Udemy Reactに入門した人のためのもっとReactが楽しくなるステップアップコース完全版
【配列への副作用を伴う操作】条件を満たす要素のみの配列作成 (paizaランク D 相当)

https://paiza.jp/works/mondai/array_utilization_primer/array_utilization_primer__filter

そんなには難しくなかった。

```py
N,K = map(int,input().split())
A = [int(input()) for _ in range(N)]
B =[]
for i in A:
    if i >= K:
        B.append(i)
print(*B,sep ="\n")

```
C#で作る。組み込み用GUIアプリ通信方法について

こんにちは
やましょうです。

# 1.組込み用 Guiアプリとは
組み込み用とは簡単に言えば、ターゲット機器（マイコン）と、PCを接続し、PC側でマイコンのデータ、コードなどを設定するPC側のGui アプリことを示します

# 2.マイコンとの通信方法
1.RS232C(UART 5V OR 3.3V等マイコンの電圧レベル）
2.USB
3.BLUETOOHE
4.LAN
などなどありますが、今回は主にRS232についてです。

# 3.通信内容
シリアルコンポーネントやWINUSBを使用しますが、
ここで受信イベントを使用すると大変なことになるので、使用しないことおすすめします。
理由は、組み込み系アプリの場合基本的にPCから
①今の状態を取得要求をします。
②マイコン側から現在の状況を取得します。

上記を行う場合を考えた時に、
**非同期で①の処理を行い、その後②の処理を行う方が、簡単だからです。**
非同期でなくてもよいと思いますが、ともかく受信イベントは使用しないことです。

#  4.受信イベントを使用しない理由
UARTの場合、Windowsが数KBYTE(設定次第ですが）まで、
受信データをバッファリングしてくれます。
そのため、急いで受信をする必要はないのです。


# 5.私の活動
技術書典などY-LABとして、C#や組み込みの書籍などを頒布しています。
お会いした際には、どうぞお気軽にお声掛けください。
おいおいウソだろ・・・oViceのデスクトップアプリリリースしたぞ！！！

どうもoViceジャンキーです。
弊社ではコミュニケーション活性化のためにoViceを導入してフル活用しています。

本日oViceにログインしたところ、神アップデートがされていたので急遽ブログを書いています！

# 公式サイトの情報

https://help.ovice.com/hc/ja/articles/26341118057369-2023%E5%B9%B412%E6%9C%8820%E6%97%A5-ovice%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F

■デスクトップアプリの主なメリット
ウェブプラウザ版と比較し、デスクトップアプリには以下のメリットが挙げられます。

・よりスムーズな起動
・より高解像度の画面共有
・より安定した動作環境

最高だぜぇぇぇええええ！！！

# デスクトップアプリリリース
ログインしたところ、以下ポップアップが表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3521211/df1afe88-6a5e-840e-2ff9-3dd95e4d008b.png)

『デスクトップアプリをダウンロード』をクリックして、ぜひ利用してみてください！

# 早速ダウンロードして使ってみた
快適ですね～♪
いままで、Webブラウザで使用していた時はぷつぷつ切れたり、google MAPを開いたりするとoViceがフリーズしたりで困っていましたが、デスクトップアプリに切り替えたことで、快適なoViceライフが送れています！
↑ まだ1時間くらいしか使ってませんがｗｗ

# 気を付けないといけないこと
デスクトップアプリに切り替えることで、Webブラウザで設定していた情報が消えてしまうので再設定が必要です。

『ノイズキャンセリングを使う』『ジェスチャーでリアクションを表示』はとてもいい機能なのでチェックを入れて快適なoViceライフを皆様過ごしましょう♪
配列のサイズの変更・重複要素の削除 Python3編

https://paiza.jp/works/mondai/array_utilization_primer/array_utilization_primer__resize

```py
N,n = map(int,input().split())
A = [int(input()) for _ in range(N)]
B = [0] * n
for i in range(n):
    if i < N:
        B[i] = A[i]
        
print(*B, sep='\n')

```
指示のとおりにやっていれば難しくはなかった。
if文はちょっと不等号に気をつけないとだめだね。。。

次！

https://paiza.jp/works/mondai/array_utilization_primer/array_utilization_primer__unique


こいつはちょっと難しかった。
スマートな書き方ではないが
フラグを使い、Aの要素がBの配列にあるかループで調べ、
なければ追加する形。

```py
N = int(input())
A = [int(input()) for _ in range(N)]
B = []
for i in range(len(A)):
    if i == 0:
        B.append(A[i])
    else:
        flag = False
        for j in range(len(B)):
            if B[j] == A[i]:
                flag = True
                break

        if flag == False:
           B.append(A[i])
           
print(*B,sep="\n")
```

答えを見るともっと簡単な書き方があり
Bの配列にAの要素がなければの部分は
not in で探すことが可能

```py
for i in range(len(A)):
    if A[i] not in B:
        B.append(A[i])
```
Genesys Cloud CXのWFMについてさわってみる

## はじめに　
こんにちは、NTTテクノクロスの中村です。
ただでさえ機能豊富なGenesys Cloud CXだが、シフト自動作成機能もあるみたいなので、今回は勉強がてらに使ってみます。
あくまで「使ってみる」レベルになるため、簡単な操作感のイメージをつかむことの役に立て頂ければと思います。

## やってみること　
OPは3名。1時間の着信平均は20件程度。多くても30件。
業務は1種類の、小規模なコールセンターを想定して、シフトを作成してみる。

## 最低限必要と思われる作業
■事前準備
1.ビジネス単位の作成
2.管理単位の作成
3.サービスゴールテンプレートの作成
4.計画グループの作成
5.作業計画の作成

上記事前準備が完了したら、
1.呼量予測データを作成
2.1のデータを元にシフト作成

## ビジネス単位の作成
とりあえず適当な名前だけ付けて作成。
今のところどこで使っているかは不明。
※Genesys Cloud CXの説明によると、次に説明する管理単位を束ねるものらしい。

![ビジネス単位.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3657952/d3267b85-58ea-2fc4-272b-80697411a044.png)

## 管理単位の作成
とりあえず適当な名前だけ付けて作成。
こちらも、今のところ、どこで使っているかは不明。
※シフトを部署単位で作成するときに選ぶらしいが、シフト作成のときに管理単位選択する項目なかったような・・。

![管理単位.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3657952/31fdfb5a-7f44-2a29-fb62-53f3c44da6f5.png)
　
## サービスゴールテンプレートの作成
ここでシフトを作成するにあたっての、コールセンターとして目標を定義する。(割と重要な気がする)

基本的な考え方は以下のはず。
・サービスレベルを厳しくすると、シフトに割り当てられる人数が増える。
・サービスレベルを緩くすると、シフトに割り当てられる人数が減る。

サービスレベル以外にも、平均応答時間、放棄率による目標値の設定も可能のよう。

![サービスコールテンプレート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3657952/0f3c58dd-3d51-4a83-28fe-6e052b6c38f3.png)


## 計画グループの作成
コールセンターによっては、1つのセンターで様々な業務を実施している。
シフト作成対象の業務（キュー、ACDスキル）、エージェントをここで選択する。
今回は以下条件で選択している。
業務：テスト業務１
ユーザー：3名

![計画グループ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3657952/62c1fec0-bf00-4c9f-747a-b82569cb4c5e.png)

## 作業計画を作成
シフト作成にあたって、作成するシフトのパターンを定義しておく。

・休憩時間はずらして取得するから、1回目の人は11時～、2回目の人は12時～、みたいな感じ。
　⇒休憩時間を段ずれさせた3パターンを作成
・ポジションによっては、受電対応業務から離れて、内部で会議に参加する人もいるはず。
　⇒1パターンだけ夕方に「会議中」を設定

![シフトパターン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3657952/e645297f-c8a7-cb85-2050-06991a73a0f8.png)

事前の設定的なものは、ここまで！
 
## 予測データの作成
シフトを作成するためには、曜日、時間帯によってどれくらい着信数があるかという過去の実績データが必要になる。
その「予測データ」作成のために、Genesys Cloud CXには複数やり方が用意されている。

大きく分けると、2種類。
①Genesys Cloud CX内にたまった過去の通話実績を予測データとして利用する。(これ便利)
②別システムから取得したデータをCSV形式でインポートする。(インポートできる形式に変換必要)
　⇒手元の環境が検証環境であり、参考になるデータがないため今回は②の方法で実施する。

今回作成したデータは、こんなイメージで作成してみた。

・時間帯ごとの着信数：朝一と昼休み、夕方以降に増えて、それ以外は落ち着く。
・曜日ごとの着信数：月～木はほとんど変わらない。金だけ気持ち増える。

👆のイメージで作成したCSVを読み込ませた結果がこれ。
![着信数.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3657952/3d9e1c7f-66d0-4b0e-e3b2-7644d65f4011.png)


## シフトの作成
これでシフト作成の事前準備は本当に完了！
あとはシフトを作るだけ。

作成できたシフトがこちら。

![スケジュール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3657952/026039b9-c33e-daac-562a-4ef8bdffd5a4.png)

日次単位だとこちら。
画面下半分の表では、予測着信数と、エージェント待機数と、その差異が表示される。（これ見やすい）
![スケジュール日時.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3657952/eb7084ac-9d09-8ebd-3404-68e196d348ca.png)

## まとめ
デモレベルではあるが、とにかく簡単にシフト作成が可能。
事前準備からシフト作成までかかった時間は1時間程度。
一番かかったのは、多分予測データを手動で作成したところ。

作成されたシフトをみてみると、
・呼量予測で着信数が少ない火曜と木曜で、一人ずつ勤務時間が短縮している。
　⇒呼量実績からシフトに反映されてそう。
・休憩時間は毎日ずれるかと思いきや、月、水、金は3名同時に休憩時間とってる。。
　⇒人数に対して、呼量が少なすぎた可能性もあるため継続して検証していきたい。

 今回触ったのはほんの一部であることと、 かなり小規模なセンターを想定して設定していたため、実際のコールセンター向けに適応させるためには、まだまだ検証を続けていきたいと思います。
効率的に成長する：ペアプロで適応する新卒エンジニアの戦略

この記事は カオナビ Advent Calendar 2023 シリーズ2 22日目の記事です。

https://qiita.com/advent-calendar/2023/kaonavi
## はじめに
はじめまして、株式会社カオナビの新卒1年目エンジニア、菊川です。
チームでのコーディングにときどき悪戦苦闘しながらも、何とか立ち向かってきました。特にペアプロは、正直言って手強かったです。
本当に学べているのかな？とか、自分は本当に理解してるのかな？といった自問自答が頭をよぎることもありました。でも、そんな中で何点か大切なことを学んできたんです。
そこで今回は、私が陥った失敗や気づきについて皆さんに共有できればと思います。

## 陥っていた失敗
小さい頃『すごい人に教わると自分もすごい人になれる』と信じていたのではないでしょうか。少なくとも自分は社会人になった最近までこの考えを抱いていました。その結果、ペアプロでタスクを進める際に以下のような事態が発生しました。
### 言われた通りにしか実装しない
この状態は「すごい」人や「憧れ」の存在に対するレッテルから、全てが正しいと聞こえてしまい、自分の考えより、その人のアイデアを実装する方が正しいという思い込みが生じてしまいました。この考え方に囚われ、私は指示待ちとなってしまいました。指示通りに実装を終えた後、次に何をすべきなのかを待つ、まるで餌を待つ金魚のような状態になってしまいました。この結果、本来ペアプロの目的である相互の成長が達成できず、指示を出す人とそれに従う人の役割分担が固定化し、私は指示待ちの状態に留まり続け、一人立ちする機会を逸しました。
### 完全に理解した（つもりになっている）状態
この状態は「すごい人とペアプロしているから自分もすごい」という先入観から生まれる状態です。
私がこの状態に気付けたのは、隣のソースコードをただコピペし、該当部分を修正しただけのMRをレビュー対応したときでした。コピペしたコードはレビューが通っているから今回のMRもすぐに通ると考えていたのですが、「なぜこのロジックで実装したの？」と問われたとき、答えることができませんでした。コピペしただけの私にはわかるはずがありません。ここで私はただ機械のように言われたことをしていただけで何も理解していなかったのだと気付きました。
では、なぜこの状況に陥ってしまったのでしょうか。それは、わからないことをそのまま放置していたからです。
すごい人には多くの知識や経験があります。彼らは、その経験や知識をもとに、「why」を説明してくれます。そして、それを聞いた私は、自分が知っている単語が出てくると、「自分は理解している」と錯覚してしまっていました。本来、理解するためには「why」が大切なはず。しかし、私はすごい人が言ったことは正しいのだと思い込み、「why」の部分をしっかりと理解せず、「完全に理解した！」という気持ちになっていました。その結果、その実装部分についての理解だけで、同様の処理を再現する力がなく、一から調査をしなければならない状況を繰り返していました。
## 意識したこと
### 思ったことを声に出す
自分が何に困っているのかを相手に伝え、また、理解できない部分について素直に質問することで、解説する側も理解していないことが明確になります。また、伝える側はどういう過程でその考えに至ったかなど、頭で考えていることを声に出すことで相手にもその過程が共有され、理解が深まります。このように、思ったことを声に出すことでわからない状態を減らすことを意識しました。
### 仮説を持って質問する
「もし〇〇の状況だと△△になるという認識で合っていますか？」「〇〇の問題対策として△△のような実装が採用されているのですか？」と言うように、自分なりの仮説を持って相手に提案し、どの部分が異なり、どこまで理解しているのかを確認するように意識しました。
## どんな効果を得たのか
### プロセスを知る機会が増えた
以前は、「〇〇を書いて」と毎回指示をしてもらう状態でしたが、「〇〇どうしたらできるやろー」と声に出すと「△△に似た実装があるから、一緒に読んでみよう」と共に考え、理解を深める機会が増えました。また、実装以外でも「この操作めんどくさいなー」と声に出したときに、こういったショートカットキーを使うと便利だよ」といった形で、普段は手元が見えないため気づかなかった点についても学べるようになりました。
### 主体的にすべきことを考えるようになった
仮説を立てるためにはデータが必要です。そのため、ソースコードを読むことや公式ドキュメントを読む機会が増え、次に何をすべきかを考えて行動するようになりました。（考えているアピールにもなるらしい）
## 最後に
この経験を通じて、私はペアプログラミングの重要な側面を理解しました。それは、単に学ぶだけでなく、能動的な姿勢を保つこと、自己の理解度を常に確認し、わからないことは積極的に質問すること、そして思考を声に出して共有することです。
また、ペアプログラミングは一方的なものではなく、互いの成長を促す機会であるべきだと理解しました。指示を待つだけでなく、自分で考え、アクションを起こすことが大切です。そして、効果的に学び、それを適用することで、私はエンジニアとしてのスキルを確実に向上できているはず。
このような認識の変化は、私のキャリア初期の重要な成長点であり、この貴重な経験を共有することで誰かのお役に立てればと思います。

https://corp.kaonavi.jp/recruit/recruitment/
【seleniumクラスシリーズ】Actionクラス



## はじめに
【seleniumクラスシリーズ】Actionクラスに関しての備忘録です。
初心者です😅
間違えてる部分が多々あると思います。
もし見つけた場合、ツッコミいただけると助かります🙇
<br>
## 🦁<INS>**結論**</INS>🦁
様々なアクション（クリック、ドラッグ&ドロップなど）を一連の操作として自動化して実行できるクラス。


:::note info
押さえておくべき点
* 複数のアクション（クリック、ドラッグアンドドロップなど）を組み合わせて一連の操作できる。
* マウスやキーボードの操作を模倣し、ブラウザでのユーザーの行動を再現できる。
* 複数のアクションを連鎖させることができ、コードの可読性を高められる。
* スクロール、ドラッグアンドドロップ、マウスオーバーなどの複雑な操作ができる。
* さまざまなブラウザとOSで一貫した操作が可能。
* 独自のアクションを定義し、組み込むことが可能。
* フレームやアラート内の要素に対する操作が可能。
* 複数のアクションを一度に実行することで、テストの実行時間を短縮できる。
:::  
***

:::note warn
利用シーン
* ユーザーがフォームにデータを入力する操作のシミュレーションする操作を自動化させたい。
* 要素をドラッグして他の位置にドロップする操作を自動化させたい。
* 右クリックメニューの操作を自動化させたい。
* マウスを特定の要素の上に移動させる操作を自動化させたい。
* ページ内のスクロールや要素へのスクロールを自動化させたい。
* ShiftやCtrlキーを使用した複数要素の選択操作を自動化させたい。
* テキストを選択してコピーする操作を自動化させたい。
* ファイル選択ダイアログを使用したアップロード操作を自動化させたい。
* Ajaxなどで動的に変更される要素への操作をさせたい。
:::  
***

:::note alert
注意点
* 特定のブラウザ、特定のバージョンによっては使えないこともある。
* Ajaxなどの動的要素に対応するため、適切な待機時間の設定は必要。
* 複合アクションはデバッグが困難な場合があるため可能な限り単純で明確なステップに分けて実装し、各ステップを個別にテストすることが重要。
* 使用するブラウザのドライバが最新か確認する必要（なるべく多くの機能、バグなどを減らせられる）
* ブラウザのセキュリティ制限によっては、一部のアクションが制限される場合がある。
* 
:::  
***

## メソッド一覧
### **<INS>import**
```
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
```  
***

### **<INS>click(on_element=None)**
指定した要素をクリック。
```
actions.click(element).perform()
```
***

### **<INS>doubleClick(on_element=None)**
指定した要素をダブルクリックします。
```
actions.double_click(element).perform()
```
***

### **<INS>contextClick(on_element=None)**
指定した要素で右クリックします。
```
actions.context_click(element).perform()
```
***

### **<INS>clickAndHold(on_element=None)**
指定した要素上でマウスボタンを押下し続けます。
```
actions.click_and_hold(element).perform()
```
***

### **<INS>dragAndDrop(source, target)**
一つの要素を別の要素にドラッグアンドドロップします。
```
actions.drag_and_drop(source_element, target_element).perform()
```
***

### **<INS>moveToElement(to_element)**
マウスカーソルを指定した要素に移動させます。
```
actions.move_to_element(element).perform()
```
***

### **<INS>keyDown(value, element=None)**
指定したキーを押下します。
```
actions.key_down(Keys.SHIFT, element).perform()
```
***

### **<INS>keyUp(value, element=None)**
押下したキーを離します。
```
actions.key_up(Keys.SHIFT, element).perform()
```
***

### **<INS>sendKeys(*keys_to_send)**
指定した文字列を入力します。
```
actions.send_keys("Hello").perform()
```
***

### **<INS>release(on_element=None)**
マウスボタンの押下を解除します。
```
actions.release().perform()
```
***  


## まとめ😸
ユーザーがアクションをするものを細かく模倣することができ、テストとしてもスクレイピングにしても自動化して操作することができるクラス。
***
【Vue.js + HTML】ファイルアップロードの「ファイルが選択されていません」を非表示にする方法

HTMLのファイルアップロードで「ファイルが選択されていません」の解決方法を記載しました。

Vue.jsを利用してコンポーネント化も併せて行っております。
ご参考になりましたら幸いです。
<br>

■事前知識

・HTML/CSSの知識
・Vue.jsの基本知識
・コンポーネント・emitの知識
<br>

https://taikis-blog.vercel.app/blog/Vue.js
mindの研究 その47

# 概要
mindが、謎なので調べてみた。
練習問題、やってみた。

# 練習問題
mindでドレミを鳴らせ。

# サンプルコード

```


メインとは
　文字列1は　文字列
　単語1は　文字列
　結果は　変数
　「ド ド ソ ソ ラ ラ ソ ソ ファ ファ ミ ミ レ レ ド ド ソ ソ ファ ファ ミ ミ レ レ ソ ソ ファ ファ ミ ミ レ レ ド ド ソ ソ ラ ラ ソ ソ ファ ファ ミ ミ レ レ ド」を　文字列1に　入れ

　ここから
　　文字列1から　単語切り出し　単語1に　入れ
　　もし　単語1が　「」に　等しい文字列
　　ならば
　　　「終り」と　表示し　終り
　　つぎに
　　もし　単語1が　「ド」に　等しい文字列
　　ならば
　　　「ド」と　表示し
　　　262をつみ
　　つぎに

　　もし　単語1が　「レ」に　等しい文字列
　　ならば
　　　「レ」と　表示し
　　　294をつみ
　　つぎに

　　もし　単語1が　「ミ」に　等しい文字列
　　ならば
　　　「ミ」と　表示し
　　　330をつみ
　　つぎに

　　もし　単語1が　「ファ」に　等しい文字列
　　ならば
　　　「ファ」と　表示し
　　　349をつみ
　　つぎに


　　もし　単語1が　「ソ」に　等しい文字列
　　ならば
　　　「ソ」と　表示し
　　　392をつみ
　　つぎに

　　もし　単語1が　「ラ」に　等しい文字列
　　ならば
　　　「ラ」と　表示し
　　　440をつみ
　　つぎに

　　　500をつみ
　　　"Kernel32"と　"Beep"で　ＡＰＩ呼出し２　結果に　入れ
　　　エラー？
　　　ならば
　　　　エラー文字列を　一行表示し　終り
　　　つぎに
　0.1秒待つ
　繰り返す
。




```

# 実行結果

```
>doremi1
ドドソソララソソファファミミレレドドソソファファミミレレソソファファミミレレドドソソララソソファファミミレレド終り

```

以上。
Vim – OSとクリップボードを共有する ( set clipboard+=unnamed ) ( vimでヤンクした時にOSのクリップボードに内容を追加する )

`~/.vimrc` に以下を設定

```
set clipboard+=unnamed
```

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ



# Twitter

https://twitter.com/YumaInaura
Androidの権限周りの再整理 ~色々むず過ぎる~

## はじめに
権限周りがTargetSDKや端末のAPIレベルやらが入り混じって毎回調べるたびに混乱していた。備忘録として残してみる。

## 通知の権限
#### TargetSDKが33以上の場合
| 内容 \ 端末のAPIレベル | ~ APIレベル32 | APIレベル33 ~ |
|------|--------------------------------|----------------------------------|
| 新規インストール | デフォルトでアプリからの通知が可能 | POST_NOTIFICATIONSの許諾が必要 |
| APILevel33へのアップデート | 以前の通知権限が引き継がれる | - |

#### TargetSDKが32以下の場合
| 内容 \ 端末のAPIレベル | ~ APIレベル32 | APIレベル33 ~ |
|------|--------------------------------|----------------------------------|
| 新規インストール | デフォルトでアプリからの通知が可能 | デフォルトではアプリからの通知が不可<br>手動で設定画面で許諾をする |
| APILevel33へのアップデート | 以前の通知権限が引き継がれる | - |


## 位置情報の権限

| 内容 \ TargetSDK | ~ APIレベル28 | APIレベル29 ~ |
|------|--------------------------------|----------------------------------|
| おおよその位置情報を提供。<br>（精度は約 3 平方キロメートル以内） | ACCESS_COARSE_LOCATIONの許諾をする必要がある | 同左 |
| 正確な位置情報を提供。<br>（精度は通常約 50 メートル以内） | ACCESS_FINE_LOCATIONの許諾をする必要がある | 同左 |
| バックグラウンドでの位置情報利用 | フォアグラウンドの位置情報権限があればバックグラウンドからのアクセスも可能 | ACCESS_BACKGROUND_LOCATIONの許諾をする必要がある |

## ボディセンサーの権限
#### TargetSDKが33以上の場合
| 内容 | 必要な処理 |
|------|--------------------------------|
| ボディセンサーへのアクセス | BODY_SENSORSの許諾が必要 |
| バックグラウンドでのボディーセンサーへのアクセス | BODY_SENSORS_BACKGROUNDの許諾が必要 |

#### TargetSDKが32以下の場合
| 内容 | 必要な処理 |
|------|--------------------------------|
| ボディセンサーへのアクセス | BODY_SENSORSの許諾が必要 |
| バックグラウンドでのボディーセンサーへのアクセス | 手動で設定画面で許諾をする |

## 最後に
OS後方互換を考えようとした時に複雑になりがち。他にもまとめる必要のある権限ありそうなので、気づいたら追記します。

## 参考文献
https://developer.android.com/develop/ui/views/notifications/notification-permission

https://developer.android.com/develop/sensors-and-location/location/permissions

https://developer.android.com/health-and-fitness/guides/health-services/background-body-sensors

https://developer.android.com/develop/sensors-and-location/location/background
AI-102試験対策のまとめ「Azure AI Bot Serviceにおけるメッセージのリッチカードの種類」

## はじめに
Azure AI Engineer Associate(AI-102)取得に向けた勉強でまとめた内容を本記事では投稿しています。
試験範囲の内容を私が勉強していく中で、
・忘れてしまっていた内容
・他の知識と絡めて理解した方が良い内容
・Microsoft Learnの読解に苦戦した内容
などをできるだけ分かりやすく簡潔にまとめることを意識しています。
Azureの勉強を一から始め、AI-102取得を目指している方の参考になれば幸いです。
※本記事の内容が必ず試験に出るわけではないこと、ご注意ください
※勉強しながら投稿しているため、追加で学んだことがあれば随時投稿内容を更新します。

## 試験対策のまとめ
### Azure AI Bot Serviceにおけるメッセージのリッチカードの種類
* リッチカード：下記などの対話型要素を含む添付ファイル
    - ボタン
    - テキスト
    - 画像
    - オーディオ
    - ビデオ
* リッチカードは下記から構成
    - タイトル
    - 説明
    - リンク
    - イメージ
* 一部のチャネルでは、ボットがリッチカードをユーザーに送信可能
* メッセージには下記の形式で表示される複数のリッチカードを含めることが可能
    - リスト形式
    - カルーセル形式

#### **リッチカードの種類**
* Bot Flameworkでは、現在8種類のリッチカードをサポート

| カードの種類 | カードの説明 |
| --- | --- |
| AdaptiveCard | 下記の任意の組み合わせを含められるカスタマイズ可能なカード <br>・テキスト <br>・音声 <br>・画像 <br>・ボタン <br>・入力フィールド |
| AnimationCard | アニメーションGIF/短い動画を再生できるカード |
| AudioCard | オーディオファイルを再生できるカード |
| HeroCard | 通常、下記が含まれるカード <br>・1つの大きなイメージ <br>・1つ/複数のボタン <br>・テキスト |
| ThumbnailCard | 通常、下記が含まれるカード <br>・1つのサムネイルイメージ <br>・1つ/複数のボタン <br>・テキスト |
| ReceiptCard | ボットからユーザーに領収書を提供できるようにするカード <br>通常は下記が含まれる <br>・領収書に含める項目の一覧 <br>・税金と合計の情報 <br>・その他のテキスト |
| SignInCard | ボットでユーザーのサインインを要求できるようにするカード <br>通常は下記が含まれる <br>・テキスト <br>・ユーザーがクリックしてサインインプロセスを開始できる1つ以上のボタン |
| VideoCard | 動画を再生できるカード |

* 参考
    - https://learn.microsoft.com/ja-jp/azure/bot-service/rest-api/bot-framework-rest-connector-add-rich-cards?view=azure-bot-service-4.0

## 次の試験対策のまとめ
* **AI-102試験対策のまとめ「Bot Framework Composerで利用可能なボットテンプレート」**

https://qiita.com/fsd-jume/items/c08e07405537f82f8596

## 学習内容をまとめたページの一覧

https://qiita.com/fsd-jume/items/65aba5d5514e023fd66d
There is 1 other session using the database. の修正方法

# 概要
テストを行う為、`rspec`コマンドを入力した際、下記のエラーが表示されました。今回は、このエラーの修正方法について説明します。

# エラーの内容
エラーの内容に、`データベースを使用している他のセッションが1つあります`と記載されています
```sh
# 入力コマンド
rspec

# エラーの出力内容
rails aborted!
ActiveRecord::StatementInvalid: PG::ObjectInUse: ERROR:  database "***************" is being accessed by other users (ActiveRecord::StatementInvalid)
DETAIL:  There is 1 other session using the database.


Caused by:
PG::ObjectInUse: ERROR:  database "***************" is being accessed by other users (PG::ObjectInUse)
DETAIL:  There is 1 other session using the database.

Tasks: TOP => db:test:load => db:test:purge
(See full trace by running task with --trace)
Migrations are pending. To resolve this issue, run:

        bin/rails db:migrate RAILS_ENV=test

You have 100000 pending migrations:

# 以下省略
```

# エラーの原因
　何らかの原因で、`DB`に接続するユーザーのセッション情報が残っています。この状況でデータベースにアクセスすると、セッションの影響で他のユーザーが既にアクセスしていると`DB`が誤認します。この問題を解決するには、セッションに残っているユーザーを消去する必要があります。
 その方法は、2種類ある為、下記に記載します。

# 修正方法1
- 凄く簡単な方法ですが、PCを再起動します。これにより、開いているすべてのセッションが終了する為、正常に動作すると思われます。

# 修正方法2
- `SQL`を使用して、データベースの接続をリセットし、セッションの情報を消去する


## 修正手順
- `PostgreSQL`にログインする
```sh
# ログインコマンド
# ユーザーが異なる場合、そのユーザーでログインして下さい
 psql -U postgres
```
- 下記のSQL文を実行します。これにより、`DB`のプロセスを消去する事ができる為、セッションの情報が消去されて、正常に`DB`に接続できる様になります。
```sql
SELECT
    pg_terminate_backend(pg_stat_activity.pid)
FROM
    pg_stat_activity
WHERE
    pg_stat_activity.datname = 'TARGET_DB' /* ← DB名を記載する */
AND pid <> pg_backend_pid();
```
(`TARGET_DB`の部分に対象のデータベース名に入力して下さい)

# 感想
地味にハマってしまい、この問題を解決するのに、膨大な時間を要してしまいました。
同じ問題で悩んでる人が居ましたら、この記事が何かの役に立って頂ければと思います。
AWSの社内研修を作る(検討編)

## はじめに
社内でAWS初学者を作ることになりました。
どのように作っていくかを記事にしていきます。
## 経緯
研修費用削減とAWS教育コンテンツ拡充をすることが目的です。

昨年度、私たちのチームでは「インターンシップ(ワンデー仕事体験)」プログラムの改善をテーマとしてオンプレ環境からAWS環境への移行を行いました。
(昨年度の活動内容はこちら)https://qiita.com/kei_diver/items/8c65bfce7826a4f2e2c0

上記のようにAWSの社内活用を進めていく中で**外部のAWS研修に代わる社内研修プログラムを構築できないか**という話があり、まずは検討から進めていくことになりました。
## 資料作成
下記２つの内容を基に研修資料の作成を進めました。
* 新卒研修で実施しているAWS研修
* 外部研修

研修内容は下記の章立てで構成しています。
(一部抜粋して資料添付しています)
* 「クラウド」概要
  * クラウドとは
  * クラウドのサービスモデル
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481691/23888d0e-7dc8-a291-0dfc-3adf89daac86.png)

* Amazon Web Service(AWS)
  * Amazon Web Service(AWS)
  * リージョン
  * アベイラビリティゾーン
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481691/22a86601-6a83-e8b1-e24b-a47b3233bf40.png)
  * VPC
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481691/e8c045f8-4d93-c528-3140-a5ef39f1446a.png)
  * EC2
  * EBS
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481691/83dc5f2e-6a8b-c111-8524-2114243090ca.png)
* 実習
  * マネジメントコンソールログイン
  * VPC作成 
  * SG作成
  * EC2インスタンス作成
  * Webページの表示
  * Webサーバ作成
  * Webページの表示

## 今後の取り組み
今後は実施編として下記の取り組みを予定しています。
1. 費用見積もり
  研修で使用するAWSサービスを洗い出して、研修実施時に掛かるコストを見積もります。
1. 研修環境構築
  見積もり結果をもとに研修環境を構築していきます。
1. リハーサル実施
  リハーサル実施にて課題や改善点を洗い出しブラッシュアップしていきます。
1. 研修内容の拡充
  作成中の研修はAWS初学者向けの研修となります。
  今後、アーキテクト向け・デベロッパー向けの研修について検討を進めて、
  より高度な教育ができる体制作りを目指します。
ホーム画面のまとめ

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)


+ [ホーム画面にカスタムオブジェクトの新規作成ボタンを載せたい](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007UpOiO)

:::note
新規作成ボタンを配置したカスタムコンポーネントを作成すれば簡単に表示できると思います。

後は、画面フローならホーム画面に配置できますね。
:::