OmniAICreator/Qiita-1.07M huggingface dataset:
翻訳QAを1年間実施して感じた事

# はじめに
皆様、はじめまして。
今回、海外リリースで必要となる日本語テキストの翻訳の正常性確認（翻訳QA：Linguistic Quality Assurance）を1年間実施した結果、実際に発生した障害傾向、および対策についてお話出来ればと思います。
翻訳QAは言葉に関する品質管理作業になります。ローカライズされたテキストがその言語のネイティブプレイヤーがプレイして、意図した翻訳になっているかどうかの確認を行います。



# 翻訳QAについて
翻訳QAは「翻訳された仕向け地別の各言語（テキスト）」の品質管理業務となります。各言語に翻訳されたテキストをネイティブプレイヤーがプレイして、「誤訳が無いか」、「違和感が無いか」、「誤認されないか」の観点で翻訳されているかの確認が主になります。


直近1年間で散見された翻訳関連の障害の傾向について少し記載します。

## ＜散見された翻訳問題＞
➀ 翻訳関連
・スキル、パラメータ内容の意味合い翻訳ミス（返金リスク：高）
・日本語原文に対する誤訳（返金リスク：高）

　＜発生原因＞
・翻訳者（ネイティブスピーカー）の日本語原文の理解度不足


➁ 日付、タイムゾーン関連
・日付、時刻の記述ミス（返金リスク：中）

　＜発生原因＞
・翻訳者（ネイティブスピーカー）の人為的ミス


➂ 表示関連
・文字崩れ、改行ミス（返金リスク：低）
・画像崩れ、画像見切れ（返金リスク：低）

　＜発生原因＞
・固有端末の画面サイス起因
・固有名詞などの文字数制限


➃ 実装関連
・海外版での日本語表示（返金リスク：低）
・他海外言語の画像表示（返金リスク：低）
・お知らせ等で他海外の価格単価表示

　＜発生原因＞
・翻訳箇所の共有漏れ
・設定ミス
・デプロイ時のマージミス

![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2365226/3ef7ac07-f6f2-f352-8531-54946661b40c.jpeg)


翻訳関連の障害は翻訳者の日本語原文の内容誤認による翻訳ミスが発生しやすい箇所になります。また誤訳による「優良誤認」の可能性が発生する箇所でもあり、返金リスクの可能性がもっとも高く、翻訳QAで最も時間をかけて確認する項目です。

日付関連は比較的少ない障害です。
主にタイムゾーン未表記により、ユーザーからは日本時間か現地時間かの判断が出来なくなり、結果「イベント参加に遅れた」、「アイテムを取得できなかった」等の不利益が発生しやすい箇所となります。

表示関連は最も多く障害が発生しやすい箇所です。
改行ミス、見切れなど軽微な障害も発生しやすいですが、その他、表記ゆれが最も多く発生する可能性がある項目です。
アイテム名、ガチャ名、イベント名など、過去のリリース済みの表現、記述ルールと沿っていないなど、「表記ゆれ」の定義は多岐に渡りますが、返金リスクに繋がる事はほぼ無く、翻訳QAとしても検証時間を短くする傾向にあります。

実装関連の障害の発生件数は少ないですが、海外ユーザーへの影響範囲の高い箇所になります。
発生理由の大半は「エンジニア側のビルド作成時のデプロイミス（設定ミス）」になりますが、翻訳QAは実装後の正常性確認を担保していない事が多く、実装ミスを発見する事が難しい箇所になります。


また実装ミスの原因として以下も発生事由の一因になる可能性があります。
＜リリース直前の変更による原因＞
バランス調整による仕様変更、スキル、パラメータ変更
リリース期間変更



# 翻訳QAチームとしての改善アクション
LQAチームとしての上記問題点の解決は以下となります。

ツールによる未翻訳箇所の検知
‐翻訳QA検証者のヒューマンエラーによる検知漏れを削減することが目的
‐新フォントの対応確認ツールの導入
‐ファイル容量削減などにより過去使用していたフォントを、
「別の新フォント（全角→半角への変更）」に変更しても、該当箇所を
  検知出来るツールを導入。


開発チーム、翻訳チームとの連携強化
‐仕様変更発生時のLQA再確認時間の確保が目的
‐プロダクトによる変更発生の早期キャッチアップ実施、翻訳チームとの
翻訳問題の共有化を行い、次施策の翻訳向上、LQAチェックの
再スケジュール化が可能。
      

他部署（プロダクト側、翻訳チーム）との定期ミーティングを強化し、問題点の共有化を重視する事で過去発生の翻訳ミス等の「12％」削減を実施し、結果、翻訳確認に要する翻訳QA確認時間も「15％」削減が可能となりました。



# 今後のLQA確認方法について
現在、翻訳QAの喫緊の問題として以下の内容があり、改善を実施中です。

 翻訳QAの合格範囲の統一化
      プロダクトによって翻訳精度の許容範囲が異なり、翻訳チェック側のスタッフが困惑する事があります。この許容範囲の統一化を行う事で無駄なフィードバック、修正依頼を削減する事が出来、さらに翻訳QA側、翻訳者側でのコストを削減出来るメリットがあります。
※プロダクトへ継続的に確認粒度の統一化を打診し、問題点の改善を要求する。

　
2　LQA側での確認を「目視確認」→「自動化チェック」へ
　翻訳精度を自動化チェックする事で製品精度の向上を見込めるほか、検証時の問題点である「俗人化」の解決（誰が検証を実施しても同じ精度でチェックが出来る）も可能になると思います。
　デメリットとしては自動化用の用語集、仕様書などの資料作成が必須であり、プロダクト側のコスト増加の問題があります。


3　本番ビルドでの実装の正常性確認
　ビルド作成後の本番ビルドで各海外言語が正しく表示されているか（実装されているか）の最終確認の必要性が高いと考えていますが、「リリースまで時間が無く、確認時間が無い」、「コスト増加」、「そもそもどの部署が実装担保するのか」などの問題の解決が必須となる事案であり、実施には大きな壁があります。この問題の根本には「日本語原文のFIX遅延」、「開発遅延」などプロダクト側に起因する原因が多く、まずは「開発スケジュールの前倒し」を関係各所との協議、コミット、検証フロー化をしていくことで改善出来ると思います。
　


# 最後に
今後も翻訳QAによる「障害（バグ）」を世に出ないよう駆除する為、一層効率的な方法を見つけて実施する事を目標として尽力しようと思います。
AI-102試験対策のまとめ「カスタムニューラル音声のトレーニングデータの種類」

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

## 試験対策のまとめ
### カスタムニューラル音声のトレーニングデータの種類
#### **カスタムニューラル音声(CNV)**
* アプリケーション用に独自にカスタマイズした合成音声を作成できるようにするテキスト読み上げ機能
* 人間の発話サンプルをトレーニングデータとして提供することで、ブランドやキャラクターの音声を非常に自然な音声で作成可能
* 作成するにはSpeech Studioを使用して、下記の流れを実施
    1. 下記を一つのデータセットにしてzipファイルでアップロード
        - 録音された音声
        - 関連する文字起こしを含んだテキストファイル
    1. モデルのトレーニング
    1. 音声をカスタムエンドポイントにデプロイ

#### **トレーニングデータ型**
それぞれのデータ型がモデル作成時にどのように使用されるかは下記の通り
| データ型 | 音声 | トランスクリプト | 使用する場合 | 必要な追加処理 |
| --- | --- | --- | --- | --- |
| 個々の発話 <br>+ <br>一致するトランスクリプト | ・.wav <br>・15秒未満 | .txt | 音声が個々の発話に分かれており、一致するトランスクリプトもある場合 | トレーニングのみ |
| 長い音声 <br>+ <br>トランスクリプト | ・.wavまたは.mp3 <br>・20秒以上 <br>・最大1000個 | .txt | トランスクリプトはあるが、音声が個々の発話にセグメント化されていない場合 | ・(バッチ文字起こしによる)セグメント化 <br>・(必要に応じて)オーディオ形式の変換 |
| オーディオのみ <br>(プレビュー) | ・.wavまたは.mp3 <br>・最大1000個 | なし | トランスクリプトが無く音声のみの場合 | ・(バッチ文字起こしによる)セグメント化 <br>・トランスクリプトの生成 <br>・(必要に応じて)オーディオ形式の変換 |

* 参考
    - https://learn.microsoft.com/ja-jp/azure/ai-services/speech-service/how-to-custom-voice-training-data

## 次の試験対策のまとめ
* **AI-102試験対策のまとめ「チャットボットのデバッグ」**

https://qiita.com/fsd-jume/items/4c379bbc603a8ed5e7ea

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

https://qiita.com/fsd-jume/items/65aba5d5514e023fd66d
Azure Synapse Analytics とは

# はじめに
これからAzureを利用してデータ分析をはじめる方向けに
Azure Synapse Analyticsの概要や機能などをまとめて紹介したいと思います。

# Azure Synapse Analytics とは
Azure Synapse Analyticsは、マイクロソフトが提供する統合型分析サービスです。
大規模なデータウェアハウス(DWH)機能とビッグデータ分析を一つのプラットフォームで組み合わせています。
データの収集、処理、分析を容易にし、機械学習やBIツールとの連携も可能です。
データ分析初学者にとって、Azure Synapse Analyticsはデータの探索から洞察の獲得までのプロセスをシンプルにする強力なツールです。

![synapse-architecture.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335632/e5f4f815-d8f5-2db5-2eb6-c07342ff4b7d.png)


# Azure Synapse Analytics の特徴
1. 統合分析サービス: 大量のデータを迅速に分析・処理するための統合プラットフォーム。
2. 多様なデータソースのサポート: 様々なデータソースとの接続と統合が可能。
3. リアルタイム分析: ストリーミングデータのリアルタイム分析機能。
4. セキュリティとプライバシー: 高度なセキュリティとプライバシー機能。
5. 柔軟な分析オプション: SQL、Apache Sparkを活用した分析オプション。
6. スケーラビリティとパフォーマンス: 高いスケーラビリティとパフォーマンス。


## Synapse ワークスペース
Synapse ワークスペースは、Azureでデータの分析をするための場所です。
これを使うと、データを安全に共有して分析できます。
ワークスペースは特定のリージョンにデプロイされ、データを一時的に保存するためのストレージも備えています。
SQLとApache Sparkという２つのツールを使って、データを分析することができます。
## Synapse SQL
Synapse SQLは、Azure Synapse ワークスペース内でT-SQLを使ってデータ分析を行う機能です。
Synapse SQLには、「専用モデル」と「サーバーレスモデル」の2種類があります。専用モデルでは、専用の「SQLプール」と呼ばれるリソースを使います。
サーバーレスモデルでは、別のタイプの「サーバーレス SQLプール」を使います。
これらのプールを使って、Synapse Studioという場所でSQLスクリプトを実行し、データを操作します。
※ただし、Synapseの専用SQLプールと以前のSQL DW（データウェアハウス）は異なるので注意が必要です。

## Synapse 用の Apache Spark
Spark分析は、SynapseワークスペースでサーバーレスのApache Sparkプールを作って使います。
Sparkプールを使い始めると、ワークスペースがSparkセッションを作り、そのセッションに必要なリソースを扱います。

Sparkを使う方法は2つあります。
1. Spark Notebooksで、データサイエンスやエンジニアリングに使い、ScalaやPySparkなどの言語を使用。
2. Sparkジョブ定義で、バッチSparkジョブをjarファイルで実行します。

## SynapseML
SynapseMLは、大規模な機械学習（ML）パイプラインを作るのを簡単にするオープンソース ライブラリです。
これはApache Sparkというフレームワークを拡張するために使われます。
SynapseMLは、既存の機械学習ツールやMicrosoftの新しいアルゴリズムを組み合わせ、Python、R、Scala、.NET、Javaといった言語で使えるようにします。

## パイプライン
Azure Synapseでは、「パイプライン」という機能を使ってデータを統合します。
これは、異なるサービス間でデータを移動したり、特定の作業を調整したりすることを可能にします。
パイプラインは、1 つのタスクを連携して実行するアクティビティの論理的なグループです。
アクティビティは、データのコピー、ノートブックの実行、SQLスクリプトの実行などを定義します。
データフローは、データを変換するための特別なアクティビティで、ノーコードで使えます。
トリガーはパイプラインを開始し、手動または自動で動かせます。
 (スケジュール、タンブリング ウィンドウ、またはイベントベース)

# まとめ
学んだことの備忘録として記載しておりますので、参考程度にご覧頂ければ幸いです。
次回はSynapseの具体的な使い方などをまとめていきたいと思います。
Milk-v duo上のPythonでpinpongライブラリを使ってBMP280で気圧と気温を測定

## はじめに
秋葉原ロボット部の有志で、milk-v duoを購入し、個々人が様々な実験を行って、勉強会内で報告しています。

Milk-v duoは9ドルのrisc-vコンピュータとして知られています。
ハードウェアは以下の通りです。

1. CPUはCVITEKのCV1800B (C906@1Ghz + C906@700MHz)
1. 最高1 GHzで動作するデュアルRV64コア
1. 64 MBのラム
1. オプションのアドオンボードを接続すると10/100Mbpsの速度でイーサーネットに接続可能## はじめに
秋葉原ロボット部の有志で、milk-v duoを購入し、個々人が様々な実験を行って、勉強会内で報告しています。

12月2日の記事では「BMP280をI2C接続したmilk-v duo上でPythonを使って温度と気圧を測定する」では、pimoroniのgithubに掲載の例を利用するために、pipを使ってPyPiからbmp280用ライブラリをダウンロードしてインストールしました。
pinpongにライブラリが存在すると、新たにライブラリをインストールすることなしに、センサ類を利用可能となります。
この記事では、pinpongライブラリ用意されているセンサ利用例として、BMP280を使用する例を紹介します。

## pinpongを利用したスクリプト例
pinpongライブラリを使用する例は、milk-v duoの「/usr/lib/python3.9/site-packages/pinpong/examples/milkv-Duo」にあります。

以下にその一覧を示します。
__init__.py　adc.py　as7341.py　blink.py　bme280.py
bme680.py　bmi160_acc.py　bmi160_step.py　bmp280.py
bmp388.py　button.py　buzzer.py　ccs811_read_baseline.py
ccs811_read_data.py　dht.py　dht20.py　ds0469.py
ds1307.py　ds18b20.py　ens160.py　gp2y1010au0f.py
gravityPM2.5.py　i2c.py　i2c_scan.py　iic_to_serial.py
ir_recv.py　ir_send.py　irq.py　lcd1602.py　lis2dh.py
max30103.py　mics_enable_power.py　mics_get_adc_data.py
mics_get_gas_exist.py　mics_get_gas_ppm.py　mlx90614.py
mp3.py　neopixel.py　nfc.py　nfc_card_info.py
nfc_uart.py　nfc_uart_card.py　oled2864.py　ozone.py
paj7620.py　ph1.py　ph2.py　pwm.py　rgb_panel.py
sen0483.py　servo.py　sht31.py　speech_synthesis.py
spi.py　sr04_urm10.py　st7789-as7341.py　st7789.py
tcs34725.py　tds.py　tone.py　uart.py　urm09.py
vl53l0.py　

## bmp280.py
この中の「bmp280.py」は以下の通りです。
コメント部分は中国語でしたので、英語に翻訳してあります。
```
# -*- coding: utf-8 -*-

#Effect: Take I2C BMP280 gas sensor
#Connect: Use windows or linux to connect to an arduino main control board, and the air sensor to the I2C port SCL SDA
import time
from pinpong.board import Board
from pinpong.libs.dfrobot_bmp280 import BMP280

Board("MILKV-DUO").begin()                      #Initialization, check the board type and port number, do not enter the port number and run automatically???
#Board("uno","COM36").begin()                   #Specify port initialization under windows
#Board("uno","/dev/ttyACM0").begin()            #Specified port initialization under linux
#Board("uno","/dev/cu.usbmodem14101").begin()   #Initialize the specified port under mac

bmp = BMP280(bus_num=0)

while not bmp.begin():
  print("bmp begin failed")
  time.sleep(2)

while True:
  temp = bmp.temp_c()
  press = bmp.pressure_p()
  alti = bmp.altitude_m(press)
  print("=========== start print ==========")
  print("temperature: %.2f Celsius" % temp)
  print("pressure: %d pa" % press)
  print("altitude: %.2f meter" % alti)
  print("=========== end print ===========")
  time.sleep(1)
```
使用するピンは
```
bmp = BMP280(bus_num=0)
```
から、I2Cの端子のI2C0_SCLとI2C0_SDAであることがわかります。

実際の動作では、私はプログラムの修正が行いやすいように、作業ディレクトリにファイルをコピーしています。
```
# cp /usr/lib/python3.9/site-packages/pinpong/examples/milkv-Du
o/bmp280.py bmp280pinpong.py
```

これで、pinpongライブラリを使ってBMP280を動作可能になりました。
例えば、ソースファイルを修正して、BMP280の接続位置を変えて、気温と気圧を計測してみましょう。

参考1　https://forum.sophgo.com/t/duo-pinpong/208
参考2　https://pinpong.readthedocs.io/zh-cn/latest/#
Lightning Dashboard Builderの仕様変更？


影響を受けている　トレイルヘッド

Visualize Your Data with the Lightning Dashboard Builder

# Summer '23

画像、リッチテキスト、ダッシュボードのウィジェットを使用した視覚化の拡張

:::note
**Enhance Your Visualizations with Images, Rich Text, and Dashboard Widgets**

Explain Lightning dashboard charts, describe metrics and KPIs, and clarify tables with rich text right where users need it. Add company logos and branding, flow diagrams, and embedded images. Guide users through their data with section titles, narrative text, and even animated GIFs. Components are now called widgets in Unlimited and Performance editions. Dashboards now support up to 25 widgets, including a maximum of 20 charts and tables, 2 images, and 25 rich text widgets. The previous limit was 20 in total.

**Where**: This change applies to Lightning Experience in Unlimited and Performance editions.

**How**: When editing a dashboard, click +Widget and select the type of widget to add.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/303a2baf-8eb4-d82d-9269-b74a8793bc6a.png)

https://help.salesforce.com/s/articleView?id=release-notes.rn_rd_dashboards_enhanced_widgets.htm&release=244&type=5
:::

+ [Visualize Your Data with the Lightning Dashboard Builder](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007T61yxSAB)
+ [Visualize Your Data with the Lightning Dashboard Builder](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007UOzZQSA1)
+ [What is set wrong if my dashboard says "+Widget" instead of "+Component"?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007UOqrxSAD)


# Winter 24'

+ [Empty Dashboards while using Bindings (Winter 24' Update)](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007T4IBNSA3)
+ [Lightning ダッシュボードの所有権の移行 (ベータ)](https://help.salesforce.com/s/articleView?id=release-notes.rn_rd_dashboards_change_owner.htm&release=246&type=5)
職務が変わった場合や、ダッシュボード作成者が組織を離れた場合、ダッシュボード所有権を移行することで、Lightning ダッシュボードへの継続的な更新を可能にします。新しい所有者はダッシュボードのコンテンツを完全に制御できます。以前は、作成者が他の職務に異動した場合、ダッシュボードをコピーまたは再作成する必要がありました。
SeleniumのChromeDriverに関するエラーを解決

# はじめに
SeleniumのChromeDriverのエラーで解決に少し時間がかかったので備忘録として残します。

# 問題と解決方法
1. そもそもChromeDriverがインストールされていない
エラー：`WebDriverException: Message: 'chromedriver' executable needs to be in PATH.`
以下のURLに案内されます。Selenium 4.6を使っていれば何もしなくてもよいようなのですが、エラーが改善されなかったので、マニュアルでDriverをダウンロードして環境変数を通します。
https://www.selenium.dev/documentation/webdriver/troubleshooting/errors/driver_location/
2. Chromeのバージョンとドライバーのバージョンの互換性がない
エラー：`SessionNotCreatedException`
ドライバーをダウンロードしたと思ったら互換性エラーが発生。最新版のChromeを使っている場合は以下のURLからDriverをダウンロードしなければならなかったようです。
https://googlechromelabs.github.io/chrome-for-testing/

# おわりに
マニュアルをちゃんと読めばすぐに解決するところ、それっぽいで選んでしまい互換性エラーでさらに時間かかりました。同じように躓いた方の助けになれば幸いです。
日本語でBard使ってる人！それ古いモデルだよ。GPT-4越えの最新モデル「Gemini pro」を利用する方法。

# ついに最新モデル降臨

https://k-tai.watch.impress.co.jp/docs/news/1552603.html



# 日本語で使っているBardは最新モデルではない

Googleから生成AIの最新モデルが出されました。けれど日本語対応していないんです。言語設定を英語にしても日本語でBardを使っている人は最新モデルではありません。Bardもそう言っています

![スクリーンショット (1198).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291948/c8c141b7-8181-74bd-b3b9-17f2ef2489da.png)


# 日本語で最新モデルを利用するには？

英語で質問してから日本語に訳してもらう必要があります。Google翻訳で訳してから質問しましょう。英語の回答をBardからいただいてから、そのままコピペして末尾に「日本語に訳して」と書きましょう。

![スクリーンショット (1197).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291948/abbb384b-8c88-bb0a-7241-4a3848176425.png)

以上が最新モデルを利用する方法です。
リモートワークで新しい職場にジョインする時のコミュ術

本投稿はMIXI DEVELOPERS Advent Calendar 2023の13日目の記事です。
他の記事も面白いものが多いのでぜひ見てください！


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

# 新しい職場へ！
誰もが経験する新しい職場！入場！どんな人がいるんだろう！？とてもドキドキしますよね！！
私も12月に転職をして新天地であるMixiのみてね事業部に参画しました！

僕くらいのおじさんになると転職も何度か経験をしてますが、それも全て出社がベースの時代の話です！
リモートワークがベース？？？どうやってコミュニケーションしよう？？？みたいな戸惑いは生まれます！

そんな私が今回の転職で特に意識していたコミュニケーション方法を記載したいと思います！
これから転職する人や来年の春に入社する新卒の方々、受け入れる方々の参考になればと思います。

## 1. チャットツールで積極的にリアクションのスタンプを押してみる。
最近はだいたいどこの職場でもSlackなどのチャットツールを使用していると思います。
まずは新しく投稿されたものに対してリアクションのスタンプを押してみましょう！

スタンプを押された側は意外と見てます。
「この前入ってきた人だな」「よくリアクションしてくれる！」といったように気付いてます。投稿者目線だとリアクションつくの嬉しいですよね！

まずはスタンプをたくさん押して、接触回数を増やしましょう！


## 2. たまにでいいのでMTGではビデオをONにする。
できる時はビデオはONでMTGに臨みましょう。
第１印象は視覚情報が55％と言いますし、積極的に顔を出して覚えてもらいましょう。

毎日でなくてもいいです！顔を準備するのも大変でしょう！
たまに、気が向いたら、くらいの感覚でビデオをONでMTGやりましょう！

## 3. わからなかったらオープンに聞いてみる。
もしかしたらメンターのような方がついてくれているかもしれません。
その人に相談するのはもちろんなのですが、たまにはオープンなところで不特定多数の人に聞いてみましょう！
IT職の方は教えたがりな方が多いです！優しく教えてくれますし、これがきっかけに会話が生まれやすくなります！
先輩方も実は新しく入った人にドキドキです。会話のきっかけが欲しいはずなんです。

## 4. MTGの5分前に入って待ち構える。
リモート環境では意識しないと雑談なんてできません。
MTGが始まる少し前に参加しておきましょう。3と同じような話ですが、会話のきっかけを作っていきましょう！

できれば自分から挨拶！話しかける！
でも初対面の人にいきなり話しかけるのは無理だと思うので、居るだけでも大丈夫です！
あーこの人いつも早めに入ってるな〜と名前を覚えてもらえれば大成功です！

## 5. 週に１回くらいは出社する。
リモートワークでは偶発的なコミュニケーションが生まれにくいです。たまーにで良いので出社してみましょう。
ちょっとコンビニ行こうよとか自販機行こうよみたいなノリが生まれやすくなります。
好き嫌いはかなり分かれるので、チームの雰囲気などに合わせてやってみましょう！

# まとめ
いろいろと書きましたができることから、できそうなことからやってみましょう！
出社した方がいいとか顔出しした方がいいとかは完全に個人の考えで主観です！自分に合ったコミュニケーションでチームメイトと真の仲間になりましょう！
PHPでサポートされている文字エンコーディングについて

# 概要

PHPでサポートされている文字エンコーディングについてまとめていこうと思います。

> ※PHP8.2時点での仕様となります。

# サポートされる文字エンコーディングについて

[サポートされる文字エンコーディング](https://www.php.net/manual/ja/mbstring.supported-encodings.php) で一覧を確認できますが、エイリアスも存在するためマニュアルでは一覧で確認することができないです。

下記の関数を組み合わせると一覧を確認することができます。

- [mb_list_encodings](https://www.php.net/manual/ja/function.mb-list-encodings.php)
- [mb_encoding_aliases](https://www.php.net/manual/ja/function.mb-encoding-aliases.php)

## 非推奨となった文字エンコーディング

PHP8.2以降では「`QPrint`, `Base64`, `Uuencode`, `HTML-ENTITIES`」が 非推奨となりました。
サポートされる文字エンコーディングの一覧を返す関数である[mb_list_encodings](https://www.php.net/manual/ja/function.mb-list-encodings.php) は、PHP8.2時点では前述の非推奨となった文字エンコーディングを返すので、他の関数の引数として利用する場合は除外するなどの対応が必要となります。

非推奨となった文字エンコーディングについての詳細については下記を参考にしてください。

https://www.php.net/manual/ja/migration82.deprecated.php#migration82.deprecated.mbstring

https://qiita.com/takaram/items/79bf513694025f737d07


## 文字エンコーディングのエイリアス

PHPでは[サポートされる文字エンコーディング](https://www.php.net/manual/ja/mbstring.supported-encodings.php) で記載されている文字エンコーディングについて、エイリアスが設定されています。

各文字エンコーディングのエイリアスについては、[mb_encoding_aliases](https://www.php.net/manual/ja/function.mb-encoding-aliases.php) で確認することができ、サポートされる文字エンコーディングを渡したときにそのエイリアスとなる文字エンコーディングのリストを返します。

> 例）`sjis`の場合は、`x-sjis`と`SHIFT-JIS`がエイリアスとなる。

## サポートされる文字エンコーディング一覧

`mb_list_encodings`と`mb_encoding_aliases`を組み合わせることで利用できる文字エンコーディング一覧を作成することができます。

```php
function getSupportedEncodings() {
    return
    array_map(
        'strtolower',
        array_unique(
            array_merge(
                $enc = array_diff(mb_list_encodings(), ['BASE64', 'UUENCODE', 'HTML-ENTITIES', 'Quoted-Printable']),
                call_user_func_array(
                    'array_merge',
                    array_map(
                        "mb_encoding_aliases",
                        $enc
                    )
                )
            )
        )
    );
}
```

> 下記から抜粋

https://github.com/php-mime-mail-parser/php-mime-mail-parser/blob/main/src/Charset.php#L351

## 上記以外のサポートされている文字エンコーディング表記

前述の一覧以外に、[サポートされるエンコーディングの概要](https://www.php.net/manual/ja/mbstring.encodings.php)にあるIANA文字セット登録名が実際には利用できます。
`shift_jis`などがそれにあたり、前述の一覧には含まれないですが他のマルチバイト関数の引数として利用することができます。(※`shift_jis`は、`sjis`と完全に同じ挙動となります。)

そのため、PHPで利用できる文字エンコーディングのチェックとして利用する場合は、`mb_list_encodings`と`mb_encoding_aliases`だけでは確認できないため、別途実装する必要があります。

# まとめ

PHPでサポートされている文字エンコーディングについて、PHP内で確認する方法などを紹介しました。
メールのデータをPHPで扱う際に、mimeタイプにあるcharsetを利用して変換しようとし際にどうやったら判定できるか調べた際の内容になります。

PHPで利用できる文字エンコーディングかを判定させたいときなどに参考していただければ幸いです。
リポジトリの命名法

# リポジトリの命名について

リポジトリを建立するたびに名称をどうするかで悩む。githubリポって簡単に名称変更できないので、結構悩む。

## 関与している人のイニシャル

むかしむかし卒業研究で研究室配属されていたころ、指導教員から指示されたファイル名とかの命名規則だ。それって関与している人のイニシャルを並べるもので。たとえば、佐藤・山田・田中だとすると、`SYT`. そのあと、1，2ってかんじで序数をつけてたとおもう。いまでも気に入っていて、`git`習いたてのころは、こういう感じで命名してた。

数年してリポ名がわけわからないこととなっていることに気づく。関与している人がやめるとか、部署配置換などで関与しなくなるとか。。。の理由だ。

## ふつうにタイトルにするという選択肢

プログラム開発なら、プログラム名（_e.g._, pytorch...)とか、レポート出すんならレポートのタイトルとか。データ分析の結果格納用途なら、分析手法名 (_e.g._, ADOE....)とか。これだと長すぎることとなりがち。とくにレポートタイトルとなるとどうしても冗長となることとなりがち。その場合、適当に略記すればいいのか。

たとえば、

`くわしく→kuwashiku -> kwsk`

# さいごに

みなさんはどうしているのだろうか？コメントお待ちしております。
2023年12月現在、世界の生成AIベンチャーについて

2023年12月現在、世界の生成AIベンチャーは、以下のとおりです。

| 会社名 | 概要 | 主な事業内容 |
|---|---|---|
| OpenAI | 2015年創業 | テキスト、音声、画像、動画などの生成AIの開発・提供 |
| DeepMind | 2010年創業 | テキスト、音声、画像、動画などの生成AIの開発・提供 |
| Google AI | 2015年創業 | テキスト、音声、画像、動画などの生成AIの開発・提供 |
| Nvidia | 1999年創業 | 画像生成AIの開発・提供 |
| Amazon | 1994年創業 | テキスト、音声、画像、動画などの生成AIの開発・提供 |
| Microsoft | 1975年創業 | テキスト、音声、画像、動画などの生成AIの開発・提供 |
| Facebook | 2004年創業 | テキスト、音声、画像、動画などの生成AIの開発・提供 |
| Apple | 1976年創業 | テキスト、音声、画像、動画などの生成AIの開発・提供 |

これらのベンチャーは、いずれも世界有数のAI研究機関や企業です。開発・提供する生成AIの分野は、以下のとおりです。

* テキスト生成AI：Webサイトやアプリのコンテンツ作成、メールや手紙などの作成、クリエイティブコンテンツの作成など
* 音声合成AI：音声ガイドやナレーションの作成、音声アシスタントの開発など
* 画像生成AI：イラストや漫画の作成、3Dモデルの作成など
* 動画生成AI：動画の自動生成、動画編集の効率化など

生成AIは、さまざまな分野で活用されています。例えば、テキスト生成AIは、Webサイトやアプリのコンテンツ作成、メールや手紙などの作成、クリエイティブコンテンツの作成などに活用されています。音声合成AIは、音声ガイドやナレーションの作成、音声アシスタントの開発などに活用されています。画像生成AIは、イラストや漫画の作成、3Dモデルの作成などに活用されています。動画生成AIは、動画の自動生成、動画編集の効率化などに活用されています。

生成AIは、今後もさらなる進化が期待されています。より高度な生成AIの開発が進むことで、さらに幅広い分野で活用されるようになると考えられます。

具体的な例としては、以下のようなものが挙げられます。

* OpenAIの「DALL-E 2」は、テキストから画像を生成できるAIです。イラストや漫画の作成、3Dモデルの作成などに活用されています。
* DeepMindの「Gopher」は、テキストからコードを生成できるAIです。ソフトウェア開発やWebサイト構築などに活用されています。
* Google AIの「LaMDA」は、テキストからテキストを生成できるAIです。ニュース記事やブログ記事の作成、メールや手紙などの作成などに活用されています。
* Nvidiaの「NVIDIA Omniverse Avatar」は、3Dモデルの顔や表情を生成できるAIです。ゲームや映画の制作などに活用されています。
* Amazonの「Amazon Transcribe」は、音声からテキストを生成できるAIです。音声ガイドやナレーションの作成、音声アシスタントの開発などに活用されています。
* Microsoftの「Azure Cognitive Services」は、テキスト、音声、画像、動画の生成AIを提供するサービスです。さまざまな分野で活用されています。
* Facebookの「AI Research」は、テキスト、音声、画像、動画の生成AIの研究を進めている部門です。さまざまな分野での応用を目指しています。
* Appleの「Core ML」は、機械学習モデルをアプリで簡単に利用できるようにするフレームワークです。生成AIのアプリ開発を支援しています。

生成AIは、まだ発展途上にある技術ですが、さまざまな分野で活用されつつあります。今後もさらなる進化が期待されており、さまざまなイノベーションをもたらすと考えられます。
AzureをInstanaで可視化してみた(App Service+Redis+SQL Database)


こんにちは、Instanaユーザー会の運営をお手伝いさせていただいております、カワノです！
この記事は[Instana Observability Advent Calendar 2023](https://qiita.com/advent-calendar/2023/instana) 13日目のエントリになります。

さて、「AzureをInstanaで可視化してみた」シリーズも3回目となりました。
締めは実際のWebアプリケーション構成を想定して、AP-DB構成を可視化してみましょう。

## App Service+SQL Database+Redis Cacheの可視化
こちらを参考に、アプリをデプロイしてみます。

https://learn.microsoft.com/ja-jp/azure/app-service/tutorial-dotnetcore-sqldb-app

デプロイ方法はこのサイトで十分説明されているので、ここでの説明は省きますが、構築時の設定内容はこんな感じです。
![3-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224464/9eb243da-cb95-1f83-ab82-be5c6eb5f35d.png)

デプロイ結果はこちらです。
![3-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224464/f8aabddc-9264-f368-099a-05c660fe3b8d.png)

Azure Portal上ではこんな構成になります。ぱっとわかりにくいですが、App Service、Redisキャッシュ、SQL Database、SQL Serverが含まれています。
![3-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224464/55be5b05-36bc-2735-57ef-5e183b790593.png)



## Instana による可視化
2日目でAzure サービスのInstana可視化設定をおこないましたが、
App Service、Redisキャッシュ、SQL Database と SQL Server は、Instana のモニター対象サービスであり、すべてデフォルトで可視化が有効となっています。
そのため、Agent の設定を変更することなく、自動で可視化することができます。
![3-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224464/3b109feb-ddc7-7abd-83ca-5bb1f3a486bb.png)

### Instana 可視化状況
というわけで、記事にすることも少なく…可視化完了です。
これら可視化したサービスは、すべて　**インフラストラクチャー** 画面で状況を見ることができます。

今回、作成したサービスはすべて西日本(japanwest)リージョンに作成しました。そのため、インフラストラクチャーマップでは、`zone` = `japanwest`に今回作成したサービスを確認することができます。
![3-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224464/a7a493bd-8d5f-d76e-0e3f-146ed7d7a738.png)

それぞれはこんな感じで可視化されています。
(アプリが軽量なため、負荷をかけることができず…。グラフが微妙ですがご容赦ください)

下から順です。

:::note info
インフラストラクチャーで確認できる項目は、各サービスのドキュメントにある、`メトリック・コレクション`で説明されています。
例えば、Redisキャッシュの場合は [Monitoring Azure Redis キャッシュ#メトリック・コレクション](https://www.ibm.com/docs/ja/instana-observability/current?topic=technologies-monitoring-azure-redis-cache#metrics-collection)です。
:::

![3-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224464/9598792d-f68a-715d-58ce-220e148c7dd9.png)
![3-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224464/4869b93a-78cd-8155-c410-f7e8e8cbb8fd.png)
![3-7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224464/0f993203-fd25-5ea6-ca52-884be3410c36.png)
![3-8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224464/99db3c72-2f56-02a3-5485-f652e865f624.png)

メトリックは見えることができましたね！

### App Serviceで インスツルメント具合を確認する
ドキュメントを確認すると、Linuxでもセットアップすればトレースを監視できるようになるようです。

**Net Core および .Net 用の Linux ワークロードのセットアップ**

https://www.ibm.com/docs/ja/instana-observability/current?topic=technologies-monitoring-azure-app-services#setting-up-linux-workloads-for-net-core-and-net


**TODO**
現在検証中：ごめんなさい、間に合わなかったので、後日アップデート載せます！


## 最後に
というわけで、3日連続で実施してきました「AzureをInstanaで可視化してみた」シリーズ。いかがだったでしょうか？
本当は **障害を起こしてみた！** とかも入れたかったのですが、ぶっちゃけ時間の関係上入れることができませんでした。ごめんなさい！
Instanaは障害分析に、イベントやアラートなど、今回ご紹介できなかった機能がたくさんあります。ぜひみなさんのInstanaでお試しください！

Instana Advent Calendarは今後も続きます。みなさんお楽しみに！
BigQueryのスケジュールクエリをterraformで管理する

BigQueryのスケジュールクエリ機能を使うと定期的にクエリを実行できます。
Cloud Composerなどのワークフローツールのセットアップが不要なため、気軽にクエリを定期実行したい場合には便利です。
しかし、その手軽さゆえに「野良」のスケジュールクエリが散見されることもよくあるので、terraformを使って管理してみます。

https://cloud.google.com/bigquery/docs/scheduling-queries

クエリを格納するディレクトリ構造は以下のようにします。

```plaintext
scheduled_queries
├── 実行スケジュール1
│   │── データセット名1
│   │   ├── テーブル名1.sql
│   │   └── テーブル名2.sql
│   ├── データセット名2
│   │   └── テーブル名3.sql
│   └── データセット名3
│       └── テーブル名4.sql
└── 実行スケジュール2
    └── データセット名4
        └── テーブル名5.sql
```

実行スケジュール部分は `every_1_hours` や `every_day_0400` のようなAppEngineのスケジュール書式を指定します。
そのまま指定すると空白やコロンなどのファイルシステム的に問題のある記号も含まれているので、以下のように変換しておきます。

- 半角空白 (` `) → アンダーバー (`_`)
- コロン (`:`) → 削除

https://cloud.google.com/appengine/docs/standard/go/scheduling-jobs-with-cron-yaml?hl=ja#formatting_the_schedule

そして以下のようなterraformを書くとSQLファイルを増やすとそれに連動してスケジュールクエリが登録されるようになります。

```terraform
# ref: https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/bigquery_data_transfer_config#example-usage---bigquerydatatransfer-config-scheduled-query
resource "google_project_iam_member" "datatransfer_permission" {
  project = local.project
  role    = "roles/iam.serviceAccountShortTermTokenMinter"
  member  = "serviceAccount:service-${data.google_project.project.number}@gcp-sa-bigquerydatatransfer.iam.gserviceaccount.com"
}

resource "google_bigquery_data_transfer_config" "scheduled_queries_1hour" {
  depends_on = [google_project_iam_member.datatransfer_permission]

  for_each = fileset("${path.module}/scheduled_queries", "*/*/*.sql")

  project        = local.project
  display_name   = trimsuffix(each.value, ".sql")
  location       = "US"
  data_source_id = "scheduled_query"
  schedule       = replace(replace(split("/", each.value)[1], "_", " "), "/(\\d{2})(\\d{2})/", "$1:$2")

  destination_dataset_id = split("/", each.value)[2]

  params = {
    destination_table_name_template = trimsuffix(split("/", each.value)[3], ".sql")
    write_disposition               = "WRITE_TRUNCATE"
    query                           = file("${path.module}/scheduled_queries/${each.value}")
  }
}
```
自衛官からエンジニアへ Elixirから始める Web開発 Part13

この記事は「Elixir Advent Calendar 2023」13日目の記事です
東京にいるけどfukuokaexのYOSUKEです。

普段は 合同会社TheWaggle で教材開発・システム開発・研修講師などマルチに活動してます。

このシリーズでは、文系ですらない、体育会系でも始められるプログラミング学習　というテーマで元自衛官だった僕が
自衛官からエンジニアになってもらいたいという気持ちを込めて、普段は大人しいですが、このコラムシリーズでは、あえて、体育会系のノリで、貴様ら理屈で覚えるなら体で覚えろ！というノリで書いてみたいと思います。

なので、初学者向けですが、理論は後回し、まずは動かして体感しろってノリの第13回目です。

それでは、いくぞ！

## funの正体

よーし、貴様ら！　今日は、```Enum.map(list,& &1)```前回扱った、この関数の２つ目に入れてる値、`&`を使ったと思うが、この&を使った部分について説明しょう。

リファレンスを見ると、```fun```と書かれている場所だ。

![スクリーンショット 2023-12-13 5.38.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72962/466ac862-b176-477a-5311-03ba471c7d6e.png)

これは、functionの略だ要するに関数を入れていたんだ。関数は、便利な道具として貴様らは既にいくつか使っていたな。

例えば、```Tuple.to_list()```などだ。

```Enum.map(enumerable, fun)```の最初の```enumerable```にはリストを入れろと前回伝えた通りだが、```fun```の部分に、貴様らが既に使った```Tuple.to_list()```を入れて使って見るとどうなるか見せてやろう。

```elixir
Enum.map([{1,2}, {3,4}], &Tuple.to_list(&1))
[[1,2],[3,4]]
```

ここで前回、貴様らに教えた```&```と```&1```が出てきたな。この```&```は実は```&```の次に続く部分を関数化してくれる便利な道具だ。そして、```&1```で表記している箇所が関数に渡す```値```を入れてほしい場所を表している。

この関数とは何か？、色々な機能の総称だ。部隊に例えるなら、貴様らは自衛隊だと言ってるようなものだ、しかし、我々は部隊毎に職種が違う、例えば、陸上自衛隊では、普通科や、戦車連隊、特科連隊、高射特科連隊、偵察隊、施設大隊、通信大隊、飛行機・ヘリコプター隊、特殊武器防護・化学防護隊、後方支援連隊、対舟艦対戦車中隊など

このように最初から準備された関数はそれぞれの部隊に配属されているものがある。```Tuple.to_list()```の場合なら、```Tuple```隊にいるようなもの。この```Tuple```などの自衛隊の各部隊に当たる部分を```モジュール```という。

そして、各部隊（```モジュール```）で予め決められた、任務を果たす機能を定義されている。
貴様らが、ここまで使ったモジュールは、```Tuple```や```Enum```といったモジュールから、必要な機能を使ったが

部隊に例えると、通信に関する機能を持つ、通信隊などもあるだろうが、普通科の中でも一部、通信を担う仕事が発生したりする。また、特殊な機能を持っているわけではないが、ちょっとだけ通信に関する任務をしなければならい事も出てくるだろう。

そのようにちょっとだけ、普通科の隊員に仕事をさせるような時の命令が```&```の役割のようなものだ。

例えば、```tanaka```に 数字を渡したら、２倍にする仕事をやらせたいとする。その時にtanakへ命令する方法は以下になる

```elixir
tanaka = & &1*2
```

これで、tanakaに 2を渡すと4を返すようになる。その時の命令の仕方は以下の通りだ。

```elixir
tanaka.(2)
4
```

次にsuzukiには、 数字を渡したら、-1する仕事を命令したとする。

```elixir
suzuki = & &1-1
```

これで、suzukiに数字を渡したら-1して返ってくる
```elixir
suzuki.(4)
3
```

いいか、貴様ら ```&```の正体は、```&```より右側の仕事をさせるための命令だ。```&1```はその仕事をするために必要な値を渡してるに過ぎない。そして、ちょっとした命令は```tanaka```や```suzuki```などにやらせることができるように```変数```にパターンマッチさせて使うことができる。

何？ 理屈がわからないだと？ 貴様らに理屈はまだ早い！ これは命令だ。命令の仕方と使い方だけ覚えれば良い！
理屈は後だ！　貴様らは言わば入りたての２等兵だ、それが連隊長と同じ戦略を考えられると思うのか！

身の程をわきまえろ！　まずは、命令に従え！分かったな！

* はい！

よーし、それでは今回はここまでだ、次回は``tanaka``と``suzuki``が協力して仕事をする方法を教えよう。そして、``` &Tuple.to_list(&1)```この書き方をもう少し紐解いていく。

今日はここまで、それでは次回 Part14でまた会おう！
【SlackのWorkflow Builder】レガシーワークフローからの切り替えで気をつけること

# はじめに

こんにちは。
この記事はHRBrain Advent Calendar 2023 の 13 日目の記事です。

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

数日前に引き続きSlackの新ワークフロービルダーの記事第2弾です。
ワークフロー切り替えのに当たって特に注意しておいた方が良いことをまとめました。

# 注意点
## ① レガシーワークフロー(切り替え前に作成したワークフロー)は自動で切り替わらないものがある
:::note info
基本的に別のアプリにアクセスするものか、自社で作成したステップを含むものは作り直す必要がある。
:::
以下のワークフローは移行されません。 1, 3 は作り直す必要があります...
<ol>
  <li>アプリのステップを含むワークフロー（Google スプレッドシートの「行の追加」ステップを除く</li>
<li>非公開のワークフロー</li>
<li>プレミアムワークフロー</li>
<li>アーカイブしたチャンネルにあるワークフロー</li>
</ol>

切り替えについての詳細は[こちら](https://slack.com/intl/ja-jp/help/articles/16787711643411-%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC%E3%83%93%E3%83%AB%E3%83%80%E3%83%BC%E3%81%AE%E6%96%B0%E3%81%97%E3%81%84%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%81%B8%E3%81%AE%E3%83%AC%E3%82%AC%E3%82%B7%E3%83%BC%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC%E3%81%AE%E7%A7%BB%E8%A1%8C)を御覧ください。

## ② レガシーワークフローは使用期限がある
:::note info
2024 年 9 月 12 日から使えなくなる。
:::

来年の 9 月になってしまうと、旧来のワークフローは使えなくなってしまうのでそれまでに移行できるように頑張る必要があるみたいです...

## ③ ワークフローは有料と無料のものがある
:::note info
プランごとに定められたプレミアムワークフローの実行回数を超過した場合、超過した一回ごとに料金が発生します。
:::

:::note warn
超過実行回数に制限を設けることができます。制限を設けない場合は実行され続けてしまうので、設定したほうが良い気はします。詳細は[こちら](https://slack.com/intl/ja-jp/help/articles/22374141708307-%E8%B6%85%E9%81%8E%E5%88%86%E3%81%AE%E3%83%97%E3%83%AC%E3%83%9F%E3%82%A2%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC%E3%81%AE%E5%AE%9F%E8%A1%8C%E3%82%92%E8%A8%B1%E5%8F%AF%E3%81%97%E3%81%A6%E5%88%B6%E9%99%90%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B)。
:::
 <dl>
    <dt>スタンダードワークフロー</dt>
    <dd>Slack ステップまたは 1 つのコネクタステップを含むワークフロー。</dd>
    <dt>プレミアムワークフロー</dt>
    <dd>少なくとも 1 つのカスタムステップまたは 2 つ以上のコネクタステップを含むワークフロー。</dd>
</dl>
<dl>
    <dt>Slackステップ</dt>
    <dd>フォームの送信やメッセージの送信などができるステップです。</dd>
    <dt>カスタムステップ</dt>
    <dd>自分たちで作成したステップです。</dd>
    <dt>コネクタステップ</dt>
    <dd>サードパーティ製ステップです。スプシとの連携やJIRAのチケット発行、Zoomとの連携など様々なステップがあります。</dd>
</dl>

コネクタステップにどのようなものがあるか気になる人は[一覧](https://slack.com/intl/ja-jp/help/articles/20155812595219-Slack-%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC%E3%81%AE%E3%82%B3%E3%83%8D%E3%82%AF%E3%82%BF)をご覧ください。


# おわりに

新ワークフローはJIRAチケット自動作成ができるようになったり、ワークフローを遅らせることができたり、メッセージリンクをスプシに送れるようになったりかなり便利になっています。フォームで回答形式の指定がたくさん増えたのが個人的にポイント高いです。
移行は大変ですが以前はできなかったことができるようになっていることもあります。改善できるところは改善しながらワークフローを作り直すと少し楽しいですね。

# PR

株式会社HRBrainでは新卒の方も中途の方も新しいメンバーを募集しています！

https://www.hrbrain.co.jp/recruit
GPTチャットAPIの使い方： テクニカル＆モラルガイド


AIとNLPの現代において、ChatGPTは初期に登場した、驚異的なテクノロジーのひとつです。あなたのアプリケーションが、人間と同じようにユーザーと会話し、関わり、ユーモアを交わすことができる世界を想像してみてください。驚きでしょう？今日、私たちはChatGPT APIでその魔法の世界に飛び込みます。これは単なる技術的なガイドではありません。私たちがテクノロジーと接する方法を変えることができる何かを作成するための入り口です。

<b>ChatGPTのAPI？日本で使えるの？<b>

ChatGPT APIは、ほとんど何でもおしゃべりできる優秀な友人だと思ってください。これはOpenAIのツールボックスの一部であり、あなたのアプリケーションに人間のような会話をさせ、学習させ、反応させます。冗談を言ったり、アドバイスをしたり、物語を語ったり、このAPIはそれができる。

さて、このAPIは日本で使えるのだろうか？あなたの問題に対する短い答えは「Yes」だ。しかし、このガイドでは実用的な実装方法と道徳的な使用方法について説明します。最近、日本でChatGPTを使える素晴らしい情報源を見つけたので、ここで紹介します。
<a href="https://chatgptjapan.org/">https://chatgptjapan.org/</a>


<b>GPTチャットAPIで旅を始める<b>

基本を正しく理解する

私たちは楽しいものに飛躍する前に、あなたが持っていることを確認しましょう：

プログラミングの知識（PythonやJavaScriptが最適です。）
OpenAIのアカウント - APIワールドへのチケット。
APIの世界を探求する好奇心。
最初の会話


簡単なPythonの例で手を汚してみましょう：

![mygptonly.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3641534/56edbc41-5626-8ca3-a84e-7c821a45ea12.png)



ここでは、AIバディに機知に富んだアシスタントになってもらい、ジョークを飛ばしてもらう。エキサイティングでしょう？

自分だけのチャットボットを作る

単なるロボットではなく、本当に役に立ち、魅力的なチャットボットを作りたいと思ったことはありませんか？GPTを使えば、旅行ガイドやバーチャルショッピングアシスタントなど、どんな役割にも対応できるボットを作ることができます。

インタラクティブなストーリーテリング

ユーザーが次の展開を決めるストーリーテリングセッションを想像してみてください。GPTはそれを実現できます。

<b>AIチューター 楽しみながら学習<b>

語学レッスンから数学の問題まで、GPTは飽きることなく、忍耐力を切らすことのない家庭教師になることができます。

最高の、道徳的側面を受け入れる： 

親切であること、注意深くあること
大きな力には大きな責任が伴うことを常に忘れないでください。AIが作成するコンテンツから目を離さないでください。私たちが求めているのは楽しさであり、失敗ではありません。

制限とうまく付き合う
私たちと同じように、APIにも限界があります。レート制限やクォータを尊重し、スムーズな運営を心がけましょう。

テスト、学習、繰り返し
AIの世界は日進月歩です。最良の結果を得るために、テストと微調整を続けてください。

<b>課題と倫理的考察<b>

デジタル化が進む世界では、プライバシーやデータ・セキュリティといった倫理的配慮を後回しにすることはできません。

インターネット 見えない糸
インターネットがなければチャットもできないということを忘れないでください。アプリケーションの魅力は接続性にかかっています。

AIの夢の予算
使用量に注意してください。GPTチャットAPIは素晴らしいですが、無料で食べ放題のビュッフェではありません。

まとめ AIの冒険が待っている
あなたは今、ChatGPT APIを使って会話型AIの未来に足を踏み入れる準備ができています。アイデアを現実のものにし、あなたのアプリケーションにおしゃべりの才能を与える時が来ました。

学習と探求を続ける
OpenAIの公式ドキュメントに飛び込んで、細かい詳細を確認してください。
オンラインコースをチェックして、APIの知識を深めましょう。

コミュニティフォーラムに参加して、実際のヒントやトリックを見つけましょう。
会話型AIの世界への旅が今始まります。さあ、創造しよう！この版では、ChatGPT APIの使用に関する重要な情報を伝える一方で、より個人的なレベルで読者とつながることを目指し、技術的な内容をより会話的で魅力的なトーンで吹き込みました。
Tauriでシンプルなノートアプリを作って遊ぶ

:::note info
この記事は「mofmof Advent Calendar 2023」13日目の記事です。
:::

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

## なぜ作ろうと思ったか

- 急になにかしらの新しい技術を触ってみたいと思ったのと、デスクトップアプリを作ってみたい気持ちになりました。
- 最初はElectronを考えていたのですが、Tauriの方が新しかったのとRustも少しやってみたさがあったのでTauriでデスクトップアプリを作ろうと思いました。
- バックエンドも興味のあったものをとりあえず全部盛りしました。


## どんなアプリ？

ObsidianやNotionのようなノートアプリです。

![スクリーンショット 2023-12-10 20.39.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982087/52902058-f641-9323-7886-cc540f8b4a30.png)

### できること

- ログイン
- ノートの追加、編集、削除
- ノートの自動保存
- マークダウンで書ける

### できないけどやりたいこと

- ログイン状態の維持
- ノートのタブ切り替え

### 技術
- Tauri
- Next.js
- Nestjs
- Prisma
- Supabase
- Auth0

## 詰まったところ

### 認証の時のコールバックどうすればよいのか

下記を使ってみました。
認証サービスからauthorization codeを受け取り、その後アクセストークンを取得したらJSに渡してます。

https://crates.io/crates/tiny_http

```rust
use tiny_http::{Server, Response};

let server = Server::http("localhost:3000").unwrap();

for request in server.incoming_requests() {
    let url = request.url().to_string();

    if url.starts_with("/callback?code=") {
        let code = url.split("=").nth(1).unwrap_or_default();

        // ここでアクセストークンを取得(省略)

        match window.emit("auth-success", access_token) {
            Ok(_) => {},
            Err(error) => eprintln!("Error: {}", error),
        }

        let response = Response::from_string("認証成功。アプリに戻ってください。");
        request.respond(response).unwrap();
        break;
    }
}
```

### NestJSのJWTのところ

これは下記を参考にして進めました。

https://auth0.com/blog/developing-a-secure-api-with-nestjs-adding-authorization/

`GET /authorize`エンドポイントに`audience`を渡していなくて、NestJSのAPIを呼ぶと401になってしまって少しはまっていました。

Auth0に設定したAPIのidentifierを指定したら解決しました。

### Codemirrorのエディタのところ

ノートの内容を自動保存したかったのでdebounceを実装していたのですが、いい感じにちらつかず自然に保存させるところで悩みました。

一旦まあまあいい感じにはなっていますが、もう少し深掘りしてパフォーマンスを最適化していきたいです。

## 遊んでみた感想

- Tauriの情報があんまり出てこなかったので、RustもTauriも初挑戦の中どう実装すれば良いのか途方に暮れたこともありましたが、AIのおかげもあり一旦動くところまではいけたので、ちゃんと理解して深掘りしたい気持ちです。
- デスクトップアプリがどうやって動いているか知識0だったので、少しだけかじれて良かったです。ちゃんとできたらリリースまでしたいです。
- ノートアプリのような誰にとってもニーズがあるようなサービスを作るのは良さそうだなと感じました。何を作るかより誰が作るか的なところがある気がしていて、サービスではなく自分を売っていく戦略は良い気がしています。
Flutterアプリのテスト

[chatGPT に立ててもらったスケジュール](ceecf4a987d3f75b6d93)に準じてFlutterの状態管理を勉強。
> - Day 10: Flutterアプリのテスト
>     - ユニットテストとウィジェットテストの基本を学ぶ
>     - シンプルなテストケースの作成と実行方法を学ぶ
# 種類
## ウィジェットテスト (Widget Tests)
UIの個々のウィジェットが期待通りに動作するかを確認するテスト。
ウィジェットテストは比較的高速で、UIの特定の部分をテストするのに適している。

<details><summary>サンプルソース</summary>

``` dart
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';

void main() {
  testWidgets('MyWidget has a title and message', (WidgetTester tester) async {
    // Build our app and trigger a frame.
    await tester.pumpWidget(MyWidget());

    // Verify that our widget has a title and message.
    expect(find.text('Title'), findsOneWidget);
    expect(find.text('Hello World'), findsOneWidget);
  });
}

class MyWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Title'),
        ),
        body: Center(
          child: Text('Hello World'),
        ),
      ),
    );
  }
}

```
</details>

## 統合テスト (Integration Tests)
アプリケーションの異なる部分が互いに適切に連携して動作するかを確認するテスト。
ウィジェットテストよりも広範囲で、より実際の使用状況に近いテストができる。

<details><summary>サンプルソース</summary>

``` dart
void main() {
  testWidgets('App should work end-to-end', (WidgetTester tester) async {
    // Build our app and trigger a frame.
    await tester.pumpWidget(MyApp());

    // Interact with widgets and test app behavior.
    await tester.tap(find.byIcon(Icons.add));
    await tester.pump();

    expect(find.text('New Item'), findsOneWidget);
  });
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: TodoListPage(),
    );
  }
}
```
</details>

## ユニットテスト (Unit Tests)
個々の関数やメソッドが期待どおりに動作するかを確認できるテスト。
主にビジネスロジックやデータ処理のテストに使用される。

<details><summary>サンプルソース</summary>

``` dart
void main() {
  test('String should be reversed', () {
    expect(reverseString('Hello'), 'olleH');
  });
}

String reverseString(String str) {
  return str.split('').reversed.join();
}
```
</details>

# シンプルなテストケースの作成と実行方法
## テストファイル
``` dart
// test/my_test.dart

import 'package:flutter_test/flutter_test.dart';

void main() {
  test('Addition test', () {
    expect(add(2, 3), 5);
  });

  test('Subtraction test', () {
    expect(subtract(5, 3), 2);
  });
}

int add(int a, int b) {
  return a + b;
}

int subtract(int a, int b) {
  return a - b;
}
```
## テストの実行
ターミナルで以下のコマンドを実行すると、テストを実行できる。
```
$ flutter test
```
RalinkとAtherosのSPI

RalinkとAtherosは非常に似た会社で、どちらも台湾の会社でWiFiのチップの会社でしたがMIPS 4KでSOCを作り始め24Kでシェアーを伸ばし、74Kを作って買収されました。

似たところもありますが、Ralinkはリトルエンディアンで、Atherosはビッグエンディアンでした。またRalinkは24KでDSP命令をサポートしましたがAtherosはサポートしなかったり対照的なところもありました。それぞれ独自のポリシーがあったのだと思います。

4K以前はNECなどたくさんの会社がMIPSベースのSOCを作っていましたが、4K以降はこの二社とBroadcomだけになりました。

ちょっと前にfreebsd-mipsのMLに投げたのですが、RalinkとAtherosのSPIドライバーを最後の頃のチップ向けにチューニングしてみました。

まず、Ralinkの方なのですが、元々バイト毎の処理だったのがMT7620には16バイトのFIFOが追加されていたので、これのサポートを書いて見ました。

https://github.com/ZRouter/freebsd-src/blob/zrouter_yamori813/sys/mips/mediatek/mtk_spi_v3.c

ベンチマーク

v1

```
# dd if=/dev/flash/spi1 of=/dev/null
4096+0 records in
4096+0 records out
2097152 bytes transferred in 2.390855 secs (877156 bytes/sec)
# dd if=/dev/flash/spi1 of=/dev/null
4096+0 records in
4096+0 records out
2097152 bytes transferred in 2.389815 secs (877537 bytes/sec)
# dd if=/dev/flash/spi1 of=/dev/null
4096+0 records in
4096+0 records out
2097152 bytes transferred in 2.390076 secs (877442 bytes/sec)
```

v3

```
# dd if=/dev/flash/spi1 of=/dev/null
4096+0 records in
4096+0 records out
2097152 bytes transferred in 1.179504 secs (1777995 bytes/sec)
# dd if=/dev/flash/spi1 of=/dev/null
4096+0 records in
4096+0 records out
2097152 bytes transferred in 1.177890 secs (1780431 bytes/sec)
# dd if=/dev/flash/spi1 of=/dev/null
4096+0 records in
4096+0 records out
2097152 bytes transferred in 1.178753 secs (1779127 bytes/sec)
```

flashの読み込みの部分だけFIFOにしてありますが、そのうち他の部分もFIFOにしてみたいと思います。

MT7620はMediatekになってからのチップですが、おそらくこの機構はRalink時代のRT6855で開発されたものではないかと思われます。

FIFOといっしょにDMAのサポートも入ったようなのですが、DMAはメモリ処理が大変なので、FIFOの方が利便性が高いです。

NetBSDにこの修正の定義がヘッダーにありましたが、コードはなさそうでした。

Atherosの方はもともとビット毎の処理だったものが、AR934x以降では32Bitまとめて処理(SHIFT)できるようになっていたので、この対応を行いました。

https://github.com/ZRouter/freebsd-src/blob/zrouter_yamori813/sys/mips/atheros/ar71xx_spi.c

Original

```
# dd if=/dev/flash/spi1 of=/dev/null
8192+0 records in
8192+0 records out
4194304 bytes transferred in 11.542662 secs (363374 bytes/sec)
# dd if=/dev/flash/spi1 of=/dev/null
8192+0 records in
8192+0 records out
4194304 bytes transferred in 11.325290 secs (370348 bytes/sec)
# dd if=/dev/flash/spi1 of=/dev/null
8192+0 records in
8192+0 records out
4194304 bytes transferred in 11.441786 secs (366578 bytes/sec)
```

SHIFT Version

```
# dd if=/dev/flash/spi1 of=/dev/null
8192+0 records in
8192+0 records out
4194304 bytes transferred in 3.129013 secs (1340456 bytes/sec)
# dd if=/dev/flash/spi1 of=/dev/null
8192+0 records in
8192+0 records out
4194304 bytes transferred in 3.100061 secs (1352975 bytes/sec)
# dd if=/dev/flash/spi1 of=/dev/null
8192+0 records in
8192+0 records out
4194304 bytes transferred in 3.104706 secs (1350950 bytes/sec)
```

アプローチは違いますが、SPIを高速化する試みは同じ発想だったのかもしれません。

スピードはだいたい

Atheros旧 > Ralink旧 > Atheros新 > Ralink新

で、いとしのRalinkの勝利のようです。とはいえ、改善率はAtherosの方が大きいです。

RalinkもAtherosも昨今の頭の悪い力技の半導体ビジネスに嫌気がさして手放したのではないでしょうか。

SPIの用途はflashがよく使われていて、後は補助信号が必要なモジュールもありますLCDなどで使われています。AD変換のチップもありますが、I2Cで使ったほうが複数つなげるし、あまりメリットが無いかもしれません。
AWS X-Rayの超詳細解説

# はじめに
この記事はDevOps on AWS大全の一部です。
DevOps on AWS大全の一覧は[こちら](https://qiita.com/tech4anyone/items/b06f88035d27c6ef13b2)。

この記事ではAWS X-Rayに関連する内容を超詳細にまとめています。

具体的には以下流れで説明します。

- AWS X-Rayとは
- AWS X-Rayの活用
- AWS X-Rayのベストプラクティス

AWSの区分でいう「Level 200：トピックの入門知識を持っていることを前提に、ベストプラクティス、サービス機能を解説するレベル」の内容です。

# この記事を読んでほしい人
- AWS X-Rayがどういうサービスか説明できるようになりたい人
- AWS X-Rayを採用するときのベストプラクティスを説明できるようになりたい人
- AWS Certified DevOps Engineer Professionalを目指している人

# AWS X-Rayとは
AWS X-Rayとは、AWSで動作するアプリケーションのパフォーマンスや問題を分析するためのサービスです。
AWS X-Rayでは、アプリケーションのリクエストやレスポンスの流れをトレースし、サービス間の呼び出しやレイテンシー、エラーなどを可視化できます。
これにより、アプリケーションのボトルネックや障害の原因を特定しやすくなります。

# AWS X-Rayの活用
AWS X-Rayを活用するには、まずアプリケーションにX-Ray SDKを組み込みます。
X-Ray SDKは、Java, .NET, Node.js, Python, Ruby, Goなどの言語に対応しており、アプリケーションのコードに簡単に追加できます。

X-Ray SDKを使用すると、アプリケーションが送受信するリクエストやレスポンスにトレースIDやセグメントIDなどのメタデータを付与できます。
これらのメタデータは、X-RayデーモンやX-Rayインターセプターなどのエージェントによって収集され、X-Ray APIに送信されます。

X-Ray APIでは、受信したメタデータをもとにトレース情報を生成し、X-RayコンソールやX-Ray CLIなどで閲覧できるようにします。

なお、監視対象がEC2の場合にはX-Ray Agentのインストールが、ECSの場合にはX-Ray AgentのインストールまたはDockerコンテナが必要になります。
ElasticBeanstalkやLambda、API Gatewayの場合には明示的なインストールは必要ありません。

AWS X-Rayでは、以下のような機能を利用できます。

- サービスマップ:
アプリケーションの構成要素や依存関係をグラフィカルに表示します。各ノードやエッジには、リクエスト数やエラー率、レイテンシーなどの統計情報が表示されます。
- トレース:
個々のリクエストやレスポンスの流れを詳細に表示します。各セグメントやサブセグメントには、呼び出し元や呼び出し先、処理時間やステータスコードなどの情報が表示されます。
- アラーム:
トレース情報に基づいてアラームを設定できます。アラームは、CloudWatchと連携して、異常な状況が発生した場合に通知やアクションを実行できます。


# AWS X-Rayのベストプラクティス
AWS X-Rayを効果的に利用するためには、以下のようなベストプラクティスがあります。

| ベストプラクティス | 説明 |
| --- | --- |
| X-Ray SDKの適用範囲を広げる | アプリケーションのすべてのコンポーネントやレイヤーにX-Ray SDKを適用することで、より詳細なトレース情報を得ることができます。特に、サービス間の呼び出しやデータベースやキャッシュなどの外部リソースへのアクセスにはX-Ray SDKを適用することが重要です。 |
| X-RayデーモンやX-Rayインターセプターの配置を最適化する | X-RayデーモンやX-Rayインターセプターは、トレース情報を収集してX-Ray APIに送信する役割を担います。これらのエージェントは、アプリケーションと同じインスタンスやコンテナに配置することで、ネットワークオーバーヘッドを削減できます。また、エージェントのバージョンや設定を最新に保つことで、パフォーマンスやセキュリティを向上できます。 |
| アノテーションやメタデータを活用する | アノテーションやメタデータは、トレース情報にカスタム情報を追加できる機能です。例えば、アノテーションにユーザーIDやセッションIDなどの情報を追加することで、特定のユーザーのリクエストパターンや問題発生時の状況を分析できます。 |
| サービスマップやトレースビューを活用する | サービスマップやトレースビューは、トレース情報をグラフィカルに表示する機能です。例えば、サービスマップでは、アプリケーションの構成要素や依存関係、統計情報などを一目で確認できます。トレースビューでは、リクエストやレスポンスの流れや処理時間などを詳細に確認できます。 |
| アラームやダッシュボードを活用する | アラームやダッシュボードは、トレース情報に基づいて通知や可視化を行う機能です。例えば、アラームでは、障害やエラーなどの異常な状況が発生した場合にメールやSMSなどで通知することができます。 |

# まとめ
この記事ではAWS X-Rayに関連する内容を超詳細にまとめました。

- AWS X-Rayとは
- AWS X-Rayの活用
- AWS X-Rayのベストプラクティス


次回はAWS Distro for Open Telemetryを超詳細解説します。
CSS完全に理解したをTailwind CSSで実装

# CSS完全に理解した

かつてこんなワードをこしらえたTシャツが一世を風靡した。

筆者も最初に見た時にはお腹を抱えて6時間は笑ったし、なんなら今見ても普通に吹き出す。

それくらい多くのエンジニアを笑顔にした(?)デザインがある。

そんな素敵なデザインをプロジェクトで利用しているCSSフレームワークを用いて再現をしてみたという毒にも薬にもならないコードを書いてみた。

普段はGoでバックエンド開発を生業としている筆者が自在にデザインを構築できるのかを生暖かく見守ってほしい。

## デザインの確認

「CSS完全に理解した」で検索してもらうとわかると思うがこんなイメージだ。

https://suzuri.jp/kakedashi-engineer/4256259/t-shirt/s/white

CSSを完全に理解されていますね。

これを再現するに当たってよく見て、必要な要素を書いてみます。

- 実践のボーダーの枠
- 枠の角は丸くする
- 「CSS」と「完全に理解した」の二行の文字
- **左側の空白**
- **二行目を枠からはみ出させる**

こんな感じだろうか。

## 再現方針

まずは上で書いた要素をどうするか考えよう。

筆者ならこんな感じにする。

- divでborderをsolidにする
- border-radiusを設定する
- pタグで二行の文字を入れる
- **position: relative/absolute**で左に空白を入れる
- 改行を阻止するために**white-space: nowrap**を設定する

こんな方針でやってみる。

## 使用するCSS Framework

今回は[Tailwind CSS](https://tailwindcss.com/)を使って実装する。

Tailwind CSSは個人的に一押ししたいCSSライブラリで以下の特徴がある。

- Utility Classを使ってスタイリングを当てるためクラス名を考えなくていい
- デザインの自由度が高い
- 利用しないUtility Classは本番の環境から消すことができてファイルを軽量にできる

これらから多くのプロジェクトで利用されている

## 実装

それではTailwind CSSで方針の通りの記述をしたコードを見てみよう

```html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <script src="https://cdn.tailwindcss.com"></script>
  </head>
  <body>
    <div class="m-4">
      <div class="border-2 border-black rounded-lg p-2 w-44 h-24 relative">
        <div class="absolute left-12 top-2 whitespace-nowrap">
          <p class="text-2xl font-bold">CSS</p>
          <p class="text-2xl font-bold">完全に理解した</p>
        </div>
      </div>
    </div>
  </body>
</html>
```

これでブラウザに表示するとこんな感じになった。

![Screenshot 2023-12-13 at 6.26.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655827/dc8c4e88-641c-a7c8-fb1a-b4021ff47ee7.png)


大枠は再現できたのではないか。

ちなみにこれを構築するのに30分もかからなかった。

Tailwind CSSすごい！
麻雀の成績管理アプリを作ってみようと思う。

初投稿です。
私は現在大学院でシステム情報工学を学んでいるが、なんせ開発経験がない。プログラミングスキルがない。
そこで、私の大好きな麻雀の成績管理アプリを作ろうと思った。現状として、以下のような状態である。

・Excelにおいては、成績管理シートが完成していて、実装したい機能はほぼ実装されている。
・悩みとして、何の言語を使うべきか、Webアプリにするのか、デスクトップアプリにするのか（多分webアプリ）

といった状況である。今後皆さんに質問を投げかけていくかもしれないので、その時はよろしくお願いします。
演算子ゲーム for IchigoJam

[IchigoJam](https://ichigojam.net/) で「演算子ゲーム」を作ってみた。

※IchigoJamはjig.jpの登録商標です。

# 遊び方

```
10123    3376 = 13499
```

のような、演算子が抜けた式が表示される。
この式を成立させる (演算子を左の2個の数に適用した計算結果を、右の数にする) ための演算子を

* `+` (加算)
* `-` (減算)
* `&` (ビットAND)
* `|` (ビットOR)
* `^` (ビットXOR)

の中から選び、該当する演算子をキーボードまたはUARTから入力する。
演算子を入力すると、正誤が判定される。
正解なら右側に `O` が表示され、不正解なら右側に `X` が表示される。
正解でも不正解でも、1回答えを入力すると次の問題に進む。
20問正解するまでの時間が計測される。

# プログラム

```
10 ' ｴﾝｻﾞﾝｼ ｹﾞｰﾑ
20 C=0:T=20:O="+-&|^":CLS:CLT
30 A=RND(16384):B=RND(16384)
40 IF A<B THEN X=A:A=B:B=X
50 [0]=A+B:[1]=A-B:[2]=A&B:[3]=A|B:[4]=A^B
60 S=RND(5):K=1
70 FOR I=0 TO 4
80 IF I<>S AND [I]=[S] THEN K=0
90 NEXT
100 IF !K THEN GOTO 30
110 PRINT DEC$(A,5);"   ";DEC$(B,5);" = ";DEC$([S],5);CHR$(#12,#1D,#1D,#1D,#1D,#1D,#1D);
120 K=INKEY():I=-1
130 FOR J=0 TO 4
140 IF K=PEEK(O+J) THEN I=J
150 NEXT
160 IF I<0 THEN GOTO 120
170 PRINT CHR$(PEEK(O+I),#17);" ";CHR$(PEEK("XO"+(I=S)))
180 C=C+(I=S)
190 IF C<T THEN GOTO 30
200 PRINT CHR$(#0A);"TIME: ";TICK()
```

[OneFiveCrowd で実行する](https://onefivecrowd.mikecat.work/#text=RUN%0A&prg=CgAOJyC03bve3bwgud6w0QAAFAAaQz0wOlQ9MjA6Tz0iKy0mfF4iOkNMUzpDTFQAHgAaQT1STkQoMTYzODQpOkI9Uk5EKDE2Mzg0KQAAKAAYSUYgQTxCIFRIRU4gWD1BOkE9QjpCPVgAADIAKFswXT1BK0I6WzFdPUEtQjpbMl09QSZCOlszXT1BfEI6WzRdPUFeQgAAPAAMUz1STkQoNSk6Sz0xAEYADEZPUiBJPTAgVE8gNABQABxJRiBJPD5TIEFORCBbSV09W1NdIFRIRU4gSz0wAFoABE5FWFQAZAASSUYgIUsgVEhFTiBHT1RPIDMwAG4AVFBSSU5UIERFQyQoQSw1KTsiICAgIjtERUMkKEIsNSk7IiA9ICI7REVDJChbU10sNSk7Q0hSJCgjMTIsIzFELCMxRCwjMUQsIzFELCMxRCwjMUQpOwB4AA5LPUlOS0VZKCk6ST0tMQCCAAxGT1IgSj0wIFRPIDQAjAAYSUYgSz1QRUVLKE8rSikgVEhFTiBJPUoAAJYABE5FWFQAoAAUSUYgSTwwIFRIRU4gR09UTyAxMjAAqgA0UFJJTlQgQ0hSJChQRUVLKE8rSSksIzE3KTsiICI7Q0hSJChQRUVLKCJYTyIrKEk9UykpKQC0AApDPUMrKEk9UykAAL4AFElGIEM8VCBUSEVOIEdPVE8gMzAAAMgAIFBSSU5UIENIUiQoIzBBKTsiVElNRTogIjtUSUNLKCk)

# 実行結果例

<iframe width="640" height="480" src="https://www.youtube.com/embed/o9hbZmbRGlA?si=3A0nXr-Q_c_nTz25" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

# 解説

## 10行目：タイトル

`FILES` 対応のタイトル行。

## 20行目：初期化

現在の正解数 `C`、要求正解数 `T`、演算子リスト `O` を初期化する。
さらに、タイマーと画面をクリアする。

## 30～100行目：問題生成

* 30行目：乱数で2個の数を決定する。
* 40行目：必ず左の数が右の数以上になるように調整する。
* 50行目：2個の数に各演算子を適用した結果を計算する。
* 60行目：正解の演算子を選択する。有効フラグを立てる。
* 70～90行目：別解が見つかったら、有効フラグを折る。
* 100行目：有効フラグが折れている (別解がある) なら、生成をやり直す。

## 110行目：問題描画

2個の数、イコール、計算結果を描画する。
さらに、
[IchigoJamの特殊キーコード表（特殊キャラクターコード表） by 表かんたん作成プログラム](https://fukuno.jig.jp/1092)
を参考に、`#12` (行頭に移動) と `#1D` (1文字右に移動) を用いてカーソルを演算子を描画する位置に移動しておく。

## 120～160行目：入力受け付け

* 120行目：キー入力を読み込む。選択された演算子を無効とする。
* 130～150行目：読み込んだ入力が選択肢にある演算子と一致すれば、その情報を記録する。
* 160行目：入力が有効な演算子でないなら、入力の読み込みに戻る。

## 170行目～200行目：正誤判定・描画など

* 170行目：入力された演算子と正誤を描画する。`#17` (行末に移動) を用いる。
* 180行目：正解の場合、現在の正解数を更新する。
* 190行目：現在の正解数が要求正解数に満たない場合、次の問題に進む。
* 200行目：クリアにかかった時間を出力する。

# ライセンス

今回のプログラムは、[CC BY 4.0](https://creativecommons.org/licenses/by/4.0/deed.ja) でライセンスする。
このプログラム (改造したものを含む) を公開の場で利用する際は、出典を示していただけると嬉しい。
これは、Qiitaの利用規約に基づくプログラムの利用を禁止するものではない。
Windows Terminal, wsl2

<!--
2023/12/9
-->

## Windows Terminal のインストール
* Microsoft.WindowsTerminal_1.18.3181.0_8wekyb3d8bbwe.msixbundle をDL
ダブルクリックでインストール

https://github.com/microsoft/terminal/releases

* 縦に分割
Alt + Shift + [+]

* 横に分割
Alt + Shift + [-]

* 閉じる
Ctrl + Shift + [w]

* コマンドパレット
Ctrl + Shift + [p]

## WSLを使用するための準備
* CPUの仮想化機能の有効化
仮想マシンの場合、`仮想マシン` `設定`で変更
* WSL有効化
`appwiz.cpl`の実行
* wslでの確認コマンド
~~~powershell:
wsl.exe --list --online
~~~

## Kali Linux のインストール
~~~powershell:
wsl.exe --update
wsl.exe --install -d kali-linux
~~~
* 再起動

## GUI のインストール
* kex-winのインストール
ubuntuをインストールしてからでないと、エラーにnatta
~~~bash:
apt update
apt install -y kali-win-kex
~~~
* GUIの起動
~~~bash:
kex
~~~
* ユーザパスワードを入力
* F8で表示されるメニューから、フルスクリーンを解除
* なおプリインストールのツールは少ない

## 参考サイト
https://learn.microsoft.com/ja-jp/windows/wsl/install-manual