OmniAICreator/Qiita-1.07M huggingface dataset:
【flutter】シェア機能を追加したい！

こんにちは！
今回はflutterでシェア機能を追加して実装していく内容を紹介させていただきます！
最後まで見ていただけたら嬉しいです！

## 1,なぜflutterでシェア機能が重要なのか！？
### ユーザーエクスペリエンスの向上:
シェア機能は、ユーザーがアプリ内で見つけた興味深いコンテンツや情報を手軽に友達やフォロワーと共有できるようにするものです。これにより、アプリのユーザーエクスペリエンスが向上し、ユーザーはアプリをより活発に利用する可能性があります。

### アプリの普及促進:
シェア機能を組み込むことで、ユーザーが自身のソーシャルメディアやメッセージアプリを介してアプリを紹介しやすくなります。友達やフォロワーによる口コミによって、アプリの普及が促進され、新しいユーザーが引き込まれる可能性が高まります。

### マーケティングと広告の手段:
ユーザーがコンテンツをシェアすることは、そのコンテンツ自体や関連するアプリに対する無料の広告となります。良質なコンテンツや機能をシェア可能にすることで、ユーザーが自然な形でアプリを宣伝することが期待できます。

### ユーザーエンゲージメントの向上:
シェア機能が利用可能であれば、ユーザーはアプリ内のコンテンツに積極的に参加し、それをシェアすることが期待されます。これにより、ユーザーエンゲージメントが向上し、アプリのコミュニティが形成されやすくなります。

### ソーシャルメディア統合:
ユーザーがアプリ内でシェアしたコンテンツがソーシャルメディア上でも適切に表示されることで、ユーザーエクスペリエンスが一貫していく。これはアプリとソーシャルメディアプラットフォームの連携によって達成される。
ユーザー獲得の手段:

シェアされたコンテンツが他のユーザーに見られることで、新しいユーザーがアプリをダウンロードして利用するきっかけとなります。シェアされるコンテンツが魅力的であれば、これは強力なユーザー獲得の手段となります！

## 2,Flutterでシェア機能を実現するための基本的な考え方
### ⑴シェア対象のデータを取得:
シェアしたい情報（テキスト、画像、URLなど）をアプリ内で取得します。これは、シェアボタンが押されたときに共有されるコンテンツです。

### ⑵シェアボタンのUIを設計:
ユーザーがシェアしたいと思うコンテンツに対して、適切なUIを設計し、シェアボタンを配置します。これにより、ユーザーは直感的にシェアの意図を理解できるようになります。

### ⑶シェア機能を実現するパッケージやプラグインを選定:
Flutterには、シェア機能を実現するためのさまざまなパッケージやプラグインが存在します。例えば、share パッケージは一般的に使われます。これを利用して、シェア機能を実現する準備をします。

### ⑷シェア機能をトリガーするメソッドを実装:
シェアボタンが押されたときに、選定したパッケージやプラグインを使用してシェア機能を呼び出すメソッドを実装します。このメソッドには、シェア対象のデータや任意のメタデータを渡します。

## 3,実際のコード例

https://pub.dev/packages/share_plus

1,まず、pubspec.yaml ファイルにパッケージの依存関係を追加します。
```php
dependencies:
  share_plus: ^7.2.1
```

```php
import 'package:share_plus/share_plus.dart';
```

2,パッケージの取得:
pubspec.yaml ファイルを保存した後、ターミナルまたはコマンドプロンプトを開き、プロジェクトのルートディレクトリで以下のコマンドを実行してパッケージを取得します。
```php
flutter pub get

```

3,ファイルに以下のコードを追加します。
```php
void _shareContent(String text) {
  Share.share(text, subject: 'Flutterシェア機能');
}
```
これで、share_plus パッケージがプロジェクトに導入され、シェア機能が利用可能になります。導入後は、具体的な利用ケースに合わせてデータや設定を調整し、シェア機能をアプリに組み込んでください。
## 4,終わりに
以上で、記事の紹介を終わります！
今回も最後まで読んでいただき、ありがとうございました！
では、次の記事で〜！
研修後の受講生評価について講師が考えるポイント

## 結論
一言に集約すると「評価ではなく推薦」をする。

## 対象者
- 研修講師
- 研修企業にて研修の現場に関わるマネージャーの方
- 講師の評価を司る部門の方

今回は想定読者としていなかったが、研修の受講経験者も見るだけは見ておいてほしい。

## 実務から見る、受講生評価業務の実態
毎週の講師業務のうち、講義準備の他に大きなタスクがある。
それが「週報による受講生評価」である。
目的としては

- それぞれの受講者ごとに研修効果が出ているか
- 効果が上がっていない受講者に対してどのようにフォローしているか
- 社内で対応すべきか
  - どんなフォロー施策をすべきか

これらの判断として行うようにしている。
が、実態として何の意味もないと明言しておきたい。
なぜなら、問題があるなら評価システムで通知するより、直接ご担当者まで連絡・相談をするためだ。
が、実際のところは週ごとに書類を作成して相談・提案をするため現場の負荷が高まる一方である事も認識したい。

### 週別評価運用の懸念：受講者の評価をChatGPTに丸投げされる
評価業務を週報単位にしてしまうと、これが実情になってしまう。
果たして、この運用が健全な評価業務になるだろうか？
去年の段階でChatGPTを取り入れて評価システムを運用したという話は今のところ聞かないが、実際のところ使っている講師は多いのではないかと思う。
１講師につき数人程度であるとか、週別ではなく月別だと品質を上げる努力もするが、週別だと正直書く事はないのだ。
とはいえ、先週同様という表現をされると発注サイドとしては「本当にやってる？」と不安になるだろう。
そこで、受託側は先週の内容をそのままChatGPTに食わせて今週分の内容をそれっぽくコピーライティングさせるという手法を使う事も考えられる。

こういった観点から、評価業務自体の品質を上げるという点に目を向け、評価をする事自体を目的にしてはならない。

---

## 期間別：講師自体への評価
多くの場合は研修後に講師評価を用いるケースが多いと思う。
が、講師評価については教材の良し悪しや受講者との相性といった項目は一切考慮されていないため、正しい評価がされていない可能性が高い事に留意されたい。
つまり、講師から受講生への評価はフォローアップのために使われる事が多いので非常に細かく、また定例などでより掘り下げて実施される事が多いが、来年度以降の研修品質についてはなぜかおざなりになってしまっているように感じられて仕方ない。

特に教材評価と講師評価が同一になっているため、教材のブラッシュアップにしても研修現場からキャッチアップされたエラッタの修正にとどまるため、内容自体の品質向上にはつながらない。

### 筆者はどのように対処しているか？
おそらく、一番聞きたいのはこれだろう。
まず前提として、評価をする事で被評価者の待遇を決めてしまうため、非常に重い行為であるという事を認識したい。
となると、ChatGPTに丸投げして業務負荷を軽減する、というアプローチは本当はしたくない。

そこで、一週間の受講態度や理解度を踏まえてKPTを書いていくようにしている。

- カリキュラムで想定している内容に対し、どのレベルまでは出来るようになった
- 先週からの課題に対して何をしたか。また、新たにどのような問題が生じたか
- 来週の対応方針や受講者へ期待する事

という書き方をしている。
このやり方だと少なくともKの部分は毎回内容は変わるため、同じ文面にはならない。

しかし、この方法でも問題はある。
同じレベル・課題を持つ人は同じグループでも別のグループに分けても似たような理解度・課題になる傾向がある。
基本的にオンラインでもオフラインでも同じ場所（グループ）にして研修を受講し、また課題に対しても議論しながら試行錯誤をしてもらうようにしている。
が、それゆえに同じ質問になる傾向がある。

これが目立ってきた場合は、別グループに分けて解決策を模索してもらったり、また新たな環境にてコミュニケーションをする事で「あの人に聞きにくかったけど、この人には聞きやすい」という状態を発生させていく。
無論、逆に言えば聞きやすい環境から聞きにくい環境に移動してしまうリスクもあるため、注意深く探る必要がある事は言うまでもない。

### コミュニケーション促進の程度問題
筆者の所感としては、オンラインでは会話をしながら課題を解いてもらい、オフラインは自分で考える時間を一定時間設けた後に会話を解禁する時間を設定すると、比較的期待するコミュニケーションの結果が生まれるように感じている。
特にオンラインでは会話に対してラグ（両方が同時に話し出す、あるいはグループ内で２つの話題を同時進行できないなど）がある事と、会話ができるとしても話しながら作業をするという事がなかなか難しいため、オンラインだからこそ積極的にコミュニケーションをしていくという場にするためとした。
また、音声だけでなくチャットやリアクションによる方法なども推奨している。彼らはシンプルに、同期的コミュニケーション＝発言はしにくいが、非同期的な方法に慣れているからだ。

評価のため、という観点ではないが、受講者間での障壁を如何に取り除いてあげられるか、が講師の手腕の見せ所だろう。
彼らにとって居心地のよい研修環境を作る事は講師目線でも重要であり、また受講者も研修の場を作っているのだと認識してもらう事が相互に良い効果を生みだす事はいうまでもない。

## 研修終了後：総合評価
:::note
受講生にこそ聞いてほしいので、この場で明記しておく。
総合評価における講師の思いを知ってほしい。
:::
研修中の成績によらず、配属先でどのように接すれば良いか、研修期間中最も長く接してきた人間として、現場に引き継ぐためのコメントやオンボーディングのアドバイスを書いている。
本項の名称こそ評価となっているが、実際は評価より推薦状の側面が大きい。
以下、解説していく。

---

総合評価まで来るとネガティブな事を書く講師は少ないだろう。
ネガティブな面をポジティブに切り替え、今後の研修や配属の提案とする事も決して珍しくないように思う。
自身で指導した受講者を悪く言いたくないのもあるし、いくら適正を感じなかったとは言っても、少しでもエンジニア職に関心を持って業界に入ってきてくれたのだから、何とか継続していってほしいという思いもある。
特に新卒だと入社一社目という事もあり、他の業界や会社と比較する事ができない。そのため、置かれた環境が実は魅力的（少なくとも、入社後研修を実施している会社の数は決して多くない）である事を認識してもらうようにしている。
言い換えると、実案件にこれから入ろうとしている人に対して、悲観的な意見をしたくない＝業界全体として、高度なエンジニア人材を育てる必要性を認識しているので、頑張って戦力化し、将来的には講師が参画するプロジェクトなど関連で彼らの手で助けられる可能性もあるのだ。
筆者の推測であり体験でもあるが、一緒に活躍できることを夢見る講師は存在しているはず。

こういった思いもあり、たとえテストの成績が振るわなくても、開発演習で力を発揮できなかったとしても、研修でうまく行かなかった部分をどうこうするのではなく、現在のスキルから現場スキルまでの伸び代を見据えて提案や推薦をしているという事を認識してほしい。

---

本稿が講師または講師を目指す全ての方、また元受講者に伝われば幸いである。
【AWS】RDS

# RDS(Amazon Relational Database Service)
AWSが提供しているリレーショナルデータベースサービス。
使用できるデータベースエンジンはPostgreSQL,Amazon Aurora,Oracle,Microsoft SQL Server,MySQL,Maria DBの6種類。RDSではサーバーの選定やOSインストールといった作業が不要であり，開発者の負担が少ない。

# RDSマネージドサービスの内容
RDSではいずれのデータベースエンジンも，**マネージドサービス**として提供される。
マネージドサービスとしてサポートされる内容は以下。

## 拡張性
スケールアップ・スケールダウンを簡単に行うことができる。

## 高可用性
稼働中のシステムがダウンした時，自動で別のシステムに切り替える**自動フェイルオーバー**をサポート。また，**マルチAZ構成**を設定することで，自動的に異なるAZに2台のRDSが構築される。99.9%のSLAがあるので，高い可用性が期待できる。

## 自動バックアップ
以下のデータをデフォルトで7日間自動でバックアップし，S3へ保存する。
* 1日1回，バックアップウィンドウで指定した次官でのDBスナップショット
* 5分間隔のトランザクションログ

## メンテナンス
OSのパッチ適用やバージョンアップ作業は週に1回，メンテナンスウィンドウという利用者が設定した時間で実施される。

## 暗号化
データの保管時と転送時に暗号化できるため，データを安全に利用・管理することができる。

# リードレプリカ
読み取り専用のDB。パフォーマンス向上のために，プライマリとなるデータべースを非同期で複製する機能。大量の読み込みリクエストが来た際も分散処理ができる。
* 最大5台までリードレプリカを構築して，リクエストをオフロード(負荷を分散させること)できる。ただしリードレプリカはプライマリのデータが非同期に反映されるため，常に最新のデータが返されると限らない。

* 任意のタイミングでスタンドアロンDBインスタンスへ昇格できる。

* 災害等の対策のため，クロスリージョンレプリカを作成できる。ただし，リードレプリカにはMicrosoft SQL Serverや一部のリージョンでは使用できない。

# DMS(AWS Satabase Migration Servie)
データベースの移行サービス。オンプレミスからAWS,AWSからAWSのデータベース移行が可能。移行期間中でもDBを使用できる。

# 参考
https://www.youtube.com/watch?v=JX72pTL8w1w&list=PLPzcoMdqG5noLR7rAc552mvPADUmmdSt1&index=14
AWSの基本・仕組み・重要用語が全部わかる教科書
機会学習を利用したRDSレコメンデーションの追加について

# ■概要

RDSに関するちょっとした機能追加になりますが、
機械学習（ML）を用いたものを含む、いくつかのレコメンデーションが追加されたようです。

Amazon RDS launches an enhanced experience for RDS Recommendations
https://aws.amazon.com/jp/about-aws/whats-new/2023/12/amazon-rds-enhanced-experience-rds-recommendations/


# ■追加された機能について

上記の公式URLによると、機会学習を利用したパフォーマンス異常に関するもの、構成のベストプラクティスや閾値ベースで見たパフォーマンスに関する推奨事項などが
RDSのレコメンデーションとして表示されるようです。

またその他要点は以下となります。

・重要度によって優先順位付けされた推奨事項をリストで見れる
・キーワード検索や重要度などで簡単にフィルタリングが出来る
・リストでは複数のリソースの推奨事項を同時に確認できる
・リストから推奨事項に沿った変更をそのまま適用できる

# ■コンソールから見てみましょう

検証で使っている環境のコンソールから実際に見てみました。
既視感がありますが、RDSのページを開いて左下の「レコメンデーション」の所みたいですね。
下記のようなリストになっていました。

![レコメンデーション1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954355/f01e328c-6885-21ce-9752-5d51250d3176.png)

確かにいくつかのカテゴリーに分かれていてわかりやすく、「View details」より対象リソースなど詳細を確認する事もできました。
「View details」では以下のような画面を確認する事ができ、どのような効果があるか、ダウンタイム、コストなどの様々な面でレコメンデーションされている様子です。

![レコメンデーション2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954355/db8585df-94a0-76c3-d515-711557f4ca29.png)

以下のように、項目にチェックを入れて即適用という事も可能みたいですね。

![レコメンデーション3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954355/1bb174f9-53b2-caec-9ca2-68ef8a4089ff.png)

# ■終わりに
ちょっとした機能ですが、運用の最適化に一役買いそうな機能でした！
地味アップデートですが結構便利そうですね。
Chromeで最小フォントサイズが0pxになった

## これはなに？

Chrome118から最小フォントサイズの制限がなくなりました。


## 公式

>相互運用性とアクセシビリティを向上させるため、7 つの言語（アラビア語、ペルシア語、日本語、韓国語、タイ語、簡体字、繁体字中国語）について、[最小フォントサイズ] のデフォルト設定をデフォルトでオフに変更します。変更前は、リストに記載されている 7 つの言語を除くすべての言語で、この設定がデフォルトでオフになっていました。この変更により、これらの言語と他の言語の整合性が保たれます。なお、これは最小フォントサイズ機能自体を変更することではありません。ユーザー補助と読みやすさの点で、変更されずにご利用いただけます。

https://developer.chrome.com/blog/chrome-118-beta?hl=ja#consistent-minimum-font-size-across-languages

## 他のブラウザの対応は？

もともとChromeだけが最小フォントサイズを10pxにしてきていました。

## デモ

10px〜0pxのフォントサイズを組んでみました。
気になるブラウザで表示確認をしてみてください。

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

## 影響は？

pxで絶対サイズを指定している場合は、そこまで懸念はないと思います。
`em` や `rem`、 `%` などの相対サイズを指定している場合は、計算結果が10pxを切っている場合、そのまま反映されてしまいます。

これによるレイアウト崩れが発生する可能性はあります。

## とはいえ読めるサイズで使うのが一番

いくら小さいフォントサイズが使えるからといって、読めなければ情報を届けたことにはならないと思います。
人が読めるフォントサイズで文字組みしていきたいところです。

### 推奨フォントサイズ

どんなフォントサイズが良いのか迷う場合、Human Interface GuidelinesとMaterial Designが参考になると思います。

AppleのHuman Interface Guidelines Large（Default)のフォントサイズだと、`Caption 2` の 11ｐｘが最小サイズです。
本文は17pxです。

https://developer.apple.com/design/human-interface-guidelines/typography

GoogleのMaterial Designでも、一番小さいフォントサイズは `OVERLINE` の10pxです。
本文は16pxです。

https://m2.material.io/design/typography/the-type-system.html#type-scale

---

この記事が誰かのお役に立てると幸いです。

## 参考

- [Chrome 118 ベータ版  |  Blog  |  Chrome for Developers](https://developer.chrome.com/blog/chrome-118-beta?hl=ja#consistent-minimum-font-size-across-languages)
- [Typography | Apple Developer Documentation](https://developer.apple.com/design/human-interface-guidelines/typography)
- [The type system - Material Design](https://m2.material.io/design/typography/the-type-system.html#type-scale)
- [Chromeの最小フォントサイズの10px制限がなくなった #Chrome - Qiita](https://qiita.com/5enxia/items/5c48437f490dc4bb354e)
ゲーム作成：Parts 2 (API in Games)

今日の作業はAPIを使って実際にPlayerとEnemy(Slime)の攻撃力（ATK）、防衛力（DEF）、HP、と早さ（SPD）。

# Databaseの作成
ここでは普通にプレイヤーのデータベースを作る
*今のところはまだレベル１だけあります
![Screenshot 2023-12-20 at 22.03.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3648209/3809fd2f-16bd-b0c5-863a-52b127a93ac3.png)
表の中身は（id/lvl,hp,atk,def,spd,maxexp）
これを使って、APIと繋げます。

# APIの作成
ゲームの中に入る前に、APIの改善が必要です。

これはプレイヤーのAPIです
```python
#PLAYER API
@app.get("/player/{param}/{level}", response_model=Any)
def get_player_param(param:str, level:str):
    conn = db_connection("player.sqlite")
    cursor = conn.cursor()
    
    cursor.execute(f"SELECT {param} FROM player WHERE id=?",(level,))
    player_param = cursor.fetchall()

    if not player_param:
        raise HTTPException(status_code=404, detail="No player names found")

    return player_param[0][0]

```
ここで{param}と{id}の入力によって、得るデータが違います。(idはレベルと考えられます！)
例：{param}は「atk」;{id}=1の時

リクエストヘッダー：http://127.0.0.1:8000/player/atk/1
![Screenshot 2023-12-20 at 22.00.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3648209/930c4162-2a78-9a50-729e-34ffa23c88a1.png)


# 
これは敵のAPIです。
変わるものは特にないです。
```python
#ENEMY API

@app.get("/enemy/{param}/{enemy_name}", response_model=Any)
def get_enemy_param(param: str, enemy_name: str):
    conn2 = db_connection("enemy.sqlite")
    cursor2 = conn2.cursor()
    
    cursor2.execute(f"SELECT {param} FROM enemy WHERE name=?", (enemy_name,))
    enemy = cursor2.fetchall()

    if not enemy:
        raise HTTPException(status_code=404, detail=f"ERROR")

    return enemy[0][0]

```

そのでGdevelopと繋ぎます。


# ゲームエンジン(Gdevelop)
![Screenshot 2023-12-20 at 22.07.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3648209/5759d0ac-4be5-fbc5-b927-9b3b09a2f9d2.png)
ここでAPIと繋ぎます。
#
![Screenshot 2023-12-20 at 22.08.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3648209/2db1600d-c319-bea1-c793-103e2d59fdac.png)
敵とプレイヤーと打つかたら、プレイヤーがダメージが与えます。
ダメージ＝slime_atk-player_def

#
![Screenshot 2023-12-20 at 22.08.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3648209/6996b17a-2852-9455-56b4-e7236f1df1e6.png)

![Screenshot 2023-12-20 at 22.13.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3648209/2235a596-7b33-e4a3-4352-46f5657f85b0.png)

ここも同じくて、プレイヤーが敵を攻撃したら、敵がダメージ与えます。
ダメージ＝player_atk-slime_def

![Screenshot 2023-12-20 at 22.12.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3648209/cfcea7e6-a4df-17bb-e0c2-c1cc39b33a42.png)
ダメージが与えるたびに、HPバーが減らす。


# 今日の作業は以上です。
【初心者】Reactを初めて使う私のためのメモ

## はじめに
フロントエンドエンジニアを目指して勉強中です。
アウトプットの場としてQiitaを活用しています。
プログラミング**ど**初心者のため、記事に間違いがあるかもしれません。
その際には、お手数ですがお知らせいただけると助かります。

## 本記事の概要
ドットインストールでReactの勉強中なので、気になって調べたところをまとめていきます。
## ReactでHTMLを書く（Lesson #4）
### １．前準備
まずはhtmlのファイルを作成。
headタグの中に、次のScriptを書くことで、npmを使わずにCDNからReactが使える（らしい）。
 ```html:index.html
 <head>
     <script src="https://unpkg.com/react@18/umd/react.development.js"></script>
     <script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
     <script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
 </head>
 ```
 ReactでコーディングしたJSXは、そのままではJavaScriptに変換されず、htmlで描画されないため、まずは、JavaScriptに変換してあげる必要があります。この変換（トランスパイル）にbabelが推奨されています。
bodyタグの中にReactを書くための準備として`<script>`タグを設置します。
```html:index.html
<script type="text/babel">
</script>
```
### ２．レンダリング
`<body>`タグの中にidを付けた`<div>`タグを設置。
idを付与した`<div>`タグの中でレンダリングがされていきます。
```html:index.html
<body>
    <div id="container"></div>
</body>
```
まずは、付与したidを取得し、レンダリングを行うためのコードを書きます。
React17までは、`ReactDOM.createRoot()`の部分が、`ReactDOM.render()`だったんだけど、React18から`ReactDOM.createRoot()`とすることで並行処理ができるようになるとのこと。

```html:index.html
<script type="text/babel">
    "use strict";
    {
        const container = document.querySelector("#container");
        const root = ReactDOM.createRoot(container);
        root.render();
    }
</script>
```
`root.render():`の（）内にレンダリングしたいコードを書いていきます。
今回は、`createElement`を使っています。
`createElement`の参考：[React入門チュートリアル (2) JSX](https://www.hypertextcandy.com/react-tutorial-02-jsx "React入門チュートリアル (2) JSX")
```html:index.html
<script type="text/babel">
    "use strict";
    {
        const container = document.querySelector("#container");
        const root = ReactDOM.createRoot(container);
        root.render(React.createElement("h1", null, "menu"));
    }
</script>
```
これで、`<h1>`要素classなしのmenuという文字がレンダリングされているはずです。


以上が、基本的なレンダリングの方法となります。
Azure Container Apps + Application Gateway の構成時の注意点とホスト名の保存について

# 本記事について

[Azure Container Apps](https://learn.microsoft.com/ja-jp/azure/container-apps/overview) でウェブアプリケーションをホストする際、URL パスベースのルーティングや WAF (ウェブアプリケーションファイアウォール) などの機能を利用するために、[Application Gateway (V2)](https://learn.microsoft.com/ja-jp/azure/application-gateway/overview) を前段に置きたいことがあるかと思います。

その際に、特に Container Apps でデフォルトのドメイン名を使うときと、カスタムドメインを追加して Application Gateway と Container Apps 間で[ホスト名の保存](https://learn.microsoft.com/ja-jp/azure/architecture/best-practices/host-name-preservation)を行いたいときで設定が変わってきます。本稿では、その違いについて簡単にまとめたいと思います。

# デフォルトドメインを利用する時 (ホスト名の保存を行わないとき)

以下のようなケースを考えてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/2b82195e-0eb6-7c0f-1c3f-e9dfafdb6b82.png)

この場合、Application Gateway で HTTP(S) リクエストを処理する際に、ヘッダーの `'Host'` の値を Container Apps のホスト名に変更する必要があります。

これは、バックエンド設定で新しいホスト名でオーバーライドを有効化するか、書き換えの設定でヘッダー値を書き換える必要があります。

**バックエンド設定**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/0a65bbb9-e9b1-dae9-c642-98d2dd475f17.png)

**書き換え**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/5178297d-d72d-17cb-5a12-6b8a97c74041.png)

逆に、Application Gateway で受けたドメイン名を `Host` の値にしたままにすることはできず (その場合は Container Apps から HTTP 403 エラーが返ってきます)、その場合は下記のパターンの構成を取る必要があります。

# カスタムドメインを利用し、ホスト名の保存を行う時

次に、以下のようなケースを考えます。Application Gateway でリクエストを受け付けるドメインと Container Apps 上のアプリケーションでリクエストを受けるドメインを同じにしたい場合を考えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/c3116657-5c92-186d-1999-9db276afd7fa.png)

この場合は、まず Container Apps 側でカスタムドメインを追加する必要があります。その際に、DNS Zone に CNAME と TXT レコードを追加することが必要です。もし、Application Gateway を使っていて、既に Aレコードで Application Gateway のもつパブリック IP アドレスに対して名前解決を行っている場合、一度その Aレコードを削除して、両レコードを追加する必要があります。そして、ドメインの検証を完了し、カスタムドメイン追加後に再度 Aレコードを追加します。（この場合、マネージド証明書を Container Apps 側で利用するとその更新などに影響が出る可能性があります。）

https://learn.microsoft.com/ja-jp/azure/container-apps/custom-domains-certificates

そして、デフォルトドメインを利用する際と異なり、ホスト名のオーバーライドや書き換えをしない設定にします。すると、カスタムドメインが追加されていない際は、HTTP 403 エラーが返ってきますが、追加されるとページが表示されるようになります。

**カスタムドメインが追加されていないケース**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/3616d5cd-c832-8891-8eb4-abe75d3ac806.png)

**カスタムドメインが追加されているケース**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/b80c02de-7fdb-7d2a-4535-204a2d60a705.png)

# 最後に

＊本稿は、個人の見解に基づいた内容であり、所属する会社の公式見解ではありません。また、いかなる保証を与えるものでもありません。正式な情報は、各製品の販売元にご確認ください。
Elixirの本家のドキュメントの再帰の例は、とても上品なので見習おう

# Elixirのマニュアルの再帰の説明

Elixirには繰り返し文がありません。

特定の回数繰り返す場合は再帰を使います。
という説明が、Elixirのマニュアルかいてあります。

https://hexdocs.pm/elixir/1.16.0-rc.1/recursion.html#loops-through-recursion

# 説明例のプログラム

説明の例として書いてあるコードは次のようなものでした。

```Elixir
defmodule Recursion do
  def print_multiple_times(msg, n) when n > 0 do
    IO.puts(msg)
    print_multiple_times(msg, n - 1)
  end

  def print_multiple_times(_msg, 0) do
    :ok
  end
end
```

# 感想

ガード節　when n>0　が素晴らしい。
これがあると、この関数の定義が、がっちりとしたものになりますね。美しい。
説明にもあるようにnの値が負の場合、ちゃんとエラーになります。
契約プログラミングの鏡だとおもいました。
流石、Elixirのマニュアル。

私が書いた場合たぶん、こうなります。
```Elixir
defmodule Recursion do
  def print_multiple_times(_msg, 0) do
    :ok
  end

  def print_multiple_times(msg, n) do
    IO.puts(msg)
    print_multiple_times(msg, n - 1)
  end
end
```
先に0の場合を書いて、次に、それ以外の場合を書く。
print_multiple_times("Hello",-1)
とすると大変な事になるのはわかってるけど、nの値は、非負の整数でしか使わないからいいだろう（心の声）。

先の例をみた後に見ると、なんとも雑なプログラムに見えてきました。
違いは、when n>0 つけるだけ。
これで上品になるので、つけましょう。

この気持ちで関数を定義していく事が、契約プログラミングだとおもいました。
pipでPyTorchインストール時に「Torch not compiled with CUDA enabled」エラー

Windows11でGPU（CUDA）を認識しない時に `AssertionError: Torch not compiled with CUDA enabled` エラーが起きる。PyTochの中にCPUのみのバージョンが存在しているのが原因。
```
AssertionError: Torch not compiled with CUDA enabled
```
他の記事だとconda環境での解決方法しか載っていなかった。

## 解決方法
```
pip uninstall torch
pip cache purge
pip install torch -f https://download.pytorch.org/whl/torch_stable.html
```
pip install torchで `-f https://download.pytorch.org/whl/torch_stable.html` 引数を指定してインストールし直す。ローカルに前のバージョンが残っている可能性があるため、二行目でキャッシュを削除している。
<br>

または公式ドキュメントを参考に、`# CUDA ~`の下を参考にバージョンを指定してインストールすることでも可能。

https://pytorch.org/get-started/previous-versions/

## 参考
https://github.com/pytorch/pytorch/issues/30664
rex0220 計算式プラグイン 項目の変更履歴をテーブルにセット

[計算式プラグイン](https://qiita.com/rex0220/items/ae83%C2%A96d5ce50ff7a9a73)で、項目の変更履歴をテーブルにセットする例です。

# 概要

文字列の変更履歴をテーブルにセットします。
変更日時と変更者も合わせてセット。
※計算式プラグインのテーブル行制御の上限が100行なので、履歴も100行までとなります。

![2023-12-20_21h36_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/1938cfcb-7ade-5cc7-5275-c27cb826d4c5.png)

# 操作例

![2023-12-20_21h50_50.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/1fc14302-60e7-6861-2723-8f3c6eb6e44b.gif)

# 計算式プラグイン設定

![2023-12-20_21h36_50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/c25c22d1-3d0b-2267-91f8-26002a24968e.png)

レコード保存時に、項目の値が変わっていたら、テーブル行を増やして、値をセットします。

OPTION: 循環参照を許可

```.js
// テーブル SUBTABLE
LET(w, ARRAY_COUNT(テーブル),
  IF(AND(EV_INFO("mode")="submit",
       EV_INFO("cate")="edit",
       ARRAY_GET(TARRAY(文字列T),"last")!==文字列
    ),
    w+1,
    w
  )
)

// テーブル.文字列T SINGLE_LINE_TEXT
IFS(ROWNO(テーブル)<ARRAY_COUNT(テーブル)-1,文字列T,
   EV_INFO("mode")="submit",文字列,
   文字列T
)

// テーブル.日時 DATETIME
IF(AND(EV_INFO("mode")="submit",NOT(日時)),
  NOW(),
  日時
)

// テーブル.更新者名 SINGLE_LINE_TEXT
IF(AND(EV_INFO("mode")="submit",NOT(更新者名)),
  LOGIN_NAME(),
  更新者名
)
```
初めてCPLDを触った話

思い出話なのでさらっと
…とおもったらよく考えたらあのころから人生の半分ぐらいたってたんだなぁ

## 開幕
とあるFラン大学にて情報系の学科を進み底辺派遣まっしぐらの男ありけり
なぜならブラック企業はまだそれほど問題になってないなり

## 2005年のある日
3年の講義にあるグループ課題系
そこではAIBOをプログラムしたり
Javaでサッカーしたり
データベースを使ったウェブアプリケーションを適当に作ったり
などなど

え、めっちゃ遊びやん。やばぴょん。

そんな一つの課題に、CPLDの演習があった。

## CPLDってなんぞや
しょぼいFPGAです。略称なんてもう忘れていいです。

## 演習
（なれそめを長々と書いたけど省略）
昔はHDL言語というのを覚えるところから始めるととても4講義で終わらないので
スケマティックだけを触らせ、何となくすでに出来上がってるデジタル回路を
ちょちょいと修正させて完成、的な演習でした
加算器をLEDで光らせる的なやつです。

そしてグループ課題は、何かしらの回路を組むこと

既にある野球ゲームをちょちょいと変えてそれで講義終了的な奴ですが
もちろんオリジナルもオーケー
CPLDの実験ボード上にビープがあるので
とりあえずドレミを作ったりなんだり、で終わる予定でした。

## 追加課題
まあ音が鳴るなんてはっきり言って目立つもので
のちの研究室に入る予定の助教授（でもなく本当は講師だった）の人から
「あ、いいねー、ジングルベル聞きたーい」
あと1講義しか時間ないんですけど？
とはいえ、なぜかこの講義、ちょうど３，４限にあり、基本的な講義があったらあとは自由解散
自由解散なので帰ってもいいし、帰らなくてもいい
なので帰らずにCPLDを触り続ける

# 結末
途中、LUTを使い切ったり（当時は知る由もない）して回路を簡略化。何とか作る。
ただ、ジングルベルはサビの後半を半分鳴らして終わり
でもマジでぎりぎりでした。
同じ音を連続で鳴らすと「ピーーーーーーーー」ってなるので、途中わざわざ止めたりする方法がわからなかったので
メトロノームのような音でごまかす始末
まあ評価はよかったっす

## 自由解散とは
結局、AIBOの演習もデータベースを使ったウェブアプリケーションも
余裕で日が暮れるまで作業に当たり続けていたので
出来上がり品は（周りと比べれば）よくできているという評価は頂きまして
グループ課題はレポート書く人がほかにいるから楽よね＆レポートじゃなくてプレゼンだったから楽よね
4年の時はもう、研究室に泊まっていいとかなんなんこれ

## Verilogとの出会い
Verilogをある程度習得し、懐かしのオルゴール回路を再現させると
LUTも使い切らず
ブロックも綺麗に分けられ
ほぼほぼ1日で完成させ
別にメトロノームのごまかしもいらない。

# まじでVerilog神
# あがめよVerilog
# たたえよVerilog
AtCoder入緑記事

この記事は、[木更津高専 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/nit_kisarazu)の21日目の記事です。

前→[AtCoder入青記事](https://qiita.com/ku_senjan/items/0c07e1aa8af354cbc37f) by [@ku_senjan](https://qiita.com/ku_senjan)
次→[学園祭の企画管理システム(一部)と認証システムを作った話](https://qiita.com/naotiki/items/6506ef15a50f1c49b981) by [@naotiki
](https://qiita.com/naotiki)

# 入緑しました
高専1年でAtCoderを始めてしばらく放置した後、高専3年でAtCoder熱が再燃し、ついに[HHKBプログラミングコンテスト2023(AtCoder Beginner Contest 327)](https://atcoder.jp/contests/abc327)で緑コーダーになることが出来ました。

![Screenshot 2023-12-20 at 8.17.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1647235/bb66c49e-a242-7370-ac2e-1e439da26cac.png)

*ん？*
![Screenshot 2023-12-20 at 8.17.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1647235/b3af109e-d7ea-ccde-cf22-94434317e987.png)

<font color="LightGray">（危うく詐称になるところでした）</font>

# 何を勉強したか
AtCoderのために真剣に勉強しているわけではないですが、参考になったサイトや、それを使って私がACした問題を掲載します。

## 簡単な動的計画法（DP）
[Educational DP Contest](https://atcoder.jp/contests/dp)のA〜E問題が解ければ割と通用します。
以下のサイトが非常に参考になります。

https://qiita.com/drken/items/dc53c683d6de8aeacf5a

<details><summary>DPを使う問題（ネタバレ防止）</summary>

- [D - Poisonous Full-Course](https://atcoder.jp/contests/abc306/tasks/abc306_d)
- [D - Shift vs. CapsLock](https://atcoder.jp/contests/abc303/tasks/abc303_d)
</details>

## 木構造
問題のデータを木構造に落とし込んで幅優先探索（BFS）や深さ優先探索（DFS）をすると解ける問題が多くあります。

https://qiita.com/drken/items/4a7869c5e304883f539b

https://qiita.com/drken/items/996d80bcae64649a6580

<details><summary>木構造を使う問題（ネタバレ防止）</summary>

- [C - Remembering the Days](https://atcoder.jp/contests/abc317/tasks/abc317_c)
- [D - Snuke Maze](https://atcoder.jp/contests/abc308/tasks/abc308_d)
</details>

## データ構造
`std::map`や`std::set`などを使ってデータを高速に検索しなければならない問題は山ほどあります。
私はメンバー関数をすぐに忘れてしまうので、コンテストの度に以下のサイトを開いていたり開いていなかったりします。

http://vivi.dyndns.org/tech/cpp/map.html

http://vivi.dyndns.org/tech/cpp/set.html

<details><summary>mapやset等を使う問題（ネタバレ防止）</summary>

- [C - Dash](https://atcoder.jp/contests/abc303/tasks/abc303_c)
</details>

# 今後の展望
今は諸事情でABCに参加していないのですが、まだまだ勉強していない領域がいっぱいあるので、その事情が落ち着いたらもっと精進していきたいです。

# 最後に
アルゴ式おすすめです。何を勉強すればいいか分からない人は、これを埋めてくだけで強くなれると思っています。
私はPythonを書く練習がてら使っています。

https://algo-method.com/

それでは。 **Happy Holiday!!**
インフラエンジニアの夫の仕事教えてもらった。

初めまして！！

株式会社VISIONARY　JAPAN営業の三口と申します:santa_tone2::cloud_snow:

実は、私の夫はインフラエンジニアとして自社開発の会社で働いております。

何年も一緒にいますが、
正直仕事内容は良くわかっていません…。



そこで、夫に仕事内容を教えてもらい、
勉強してみます:fist_tone1:

夫のプロフィール:
・文系大学卒業（英語専攻）
・21卒プログラミング未経験でSES企業へ
・就活中にRubyを使ってアプリを自己学習しながら作っていた。
・テレビ局とユニクロでバイトしていた。（私が学生時代働いていたスタバの常連客）

①仕事内容は？
:boy_tone1:自社の製品のシステムの基盤を設計・構築・運用・保守を行います。
毎日作業内容は違いますが、リファクタリングがメインです。
リファクタリングとは、サービスの欠陥などを改善することです。
バージョンアップなどを行います。
あとは、自社のサービスを運営するための基盤を構築しています。

②主に扱っているものは？？
:boy_tone1:バージョンアップにはAWSの機能を用いたり、Ansibleを使います。
最近導入したNew Relicもよく使います。
お客さまに安定したサービスを提供するために、パフォーマンスを日々New Relicで監視します。
New Relicは導入時担当させてもらっているので、インフラチームの中でも自分がメインで触っています。


③なぜインフラエンジニアになったの？
:boy_tone1:もともと就活生の頃は開発エンジニアになりたかったけど、
新卒で入社したSES企業の社長からインフラやらない？と誘われてインフラの運用・保守案件に参画することになり、
そこからインフラエンジニアになりました。


④インフラエンジニアの楽しさややりがいは？
:boy_tone1:開発エンジニア達がより良いサービスを提供するためのお手伝いができる。
直接お客様へサービスを提供できるエンジニアではないけど、日々の業務を自動化したり、自分が構築したシステムで誰かのためになるのが楽しいです。

⑤今なにを勉強しているの？
 :boy_tone1:GitHub ActionsとKubernetesです。
 GitHub Actionsは主にアプリのデプロイを自動化するために使っています。
TerraformもAWSなどの構築をコードで管理できる様にするために、日々勉強しています。

⑥インフラエンジニアの大変なところは？
:boy_tone1:インフラというより、今自分の所属してる部署は自社サービスのリソースを全て管理しているので、かなり大変です。
運用保守案件に入っていた頃は、夜間対応があったり、エラー対応が急に発生していたので、大変でした。

⑦インフラエンジニアはどんな人が向いてると思う？
:boy_tone1:業務の効率化や仕組みづくりを考えるのが好きな人が向いている気がする…。


⑧資格は何を取得した？
:boy_tone1:
・AWS SAA
・AWS SOA
を取得しました。

⑨インフラエンジニアに興味ある人は何から始めたら良い？
:boy_tone1:ネットワークの仕組みを理解するところから始める。

⑩社長にインフラエンジニアを勧められた時どんな気持ちだった？
:boy_tone1:正直開発やってみたかったけど、インフラに関しては何もわからなかったので、とりあえずやってみるか…と了承しました。
でも、ネットワークについて詳しくなれたので、
とても良い選択になったと思います。
今後は自社の開発チームにインフラの経験を活かして挑戦したいです！




初めて夫にインタビューをしながら、
記事を執筆してみましたが、
夫はかなり細かい（私の間違いなどすぐ気付いて訂正してきます笑）部分まで注意深く見る性格なので、
業務内容などもマッチしているのかな…と感じました。

インフラエンジニアは、目立つ仕事ではないけれど、誰かのために必ず役立つやりがいがある仕事ですね！

まだまだ知らないことばかりですが、
この業界について知ることができたら嬉しいです💭💭💭
Javaはじめてみた

# Javaはじめてみた
Javaは1996年にリリースされたオブジェクト指向のプログラミング言語です。
※ JavaScriptとは別物です。
## Javaの特徴①　処理速度がそこそこ速い
遅いといわれがちなようですが、Pythonなどと比較すると動作速度が速いようです。
インタープリタ言語なので機械語に変換する際に多くの時間を要するようです。
コンパイラ言語であるためコンパイラーは不要です。

## Javaの特徴② プラットフォームに依存しない
JVMという仮想環境で実行されるためOSが違っても実行可能です。
汎用性が高く良いですね。

## Javaの特徴③ 安全性が高い(と言われている...)
セキュリティ性能や処理速度、オブジェクト指向といった観点から銀行系システムにも採用されています。COBOLからの移行進んでほしいですね。

## オブジェクト指向とは
役割ごとにクラスを分けておき、これらを組み合わせて一つをものを作る考え方です。
ドラクエ式縦列パーティ

![tuibi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1395875/f7af459b-1f58-25c4-d0f3-54fcdcfa2f89.png)
いいかんじの距離で後ろについてくる縦列パーティ↑のロジック
ストリートファイターのコマンド入力もこんな感じのロジックだと聞いた。
```js
var party	= new Party(
    new Member(0),new Member(1),new Member(2),
    new Member(3),new Member(5),new Member(6),
    new Member(7),new Member(8),new Member(9),
    new Member(10)
)
var camera	= new Camera(...party.items)
party.camera = camera.delta
```
```js
class Party{
	constructor(...a){
		this.items		= a
		this.track		= [new Vector(0,0)]
		this.position	= new Vector(0,0)
		this.camera		= null
		this.gap 		= 60
	}
	update(vector){//コントローラーのスティック入力など渡し
		var compass		= vector.rotate(this.camera.yaw)//進行方向
		var delta		= compass.mul(4)
		this.position	= this.position.add(delta)	
		this.position.push(delta.magnitude)//長さキャッシュ
		this.track.unshift(this.position)

        //メモ添付
		var track		= this.track
		for(var i=0;i<this.items.length;i++){
			var member		= this.items[i]
			var position	= track[0]
			var vector		= position.sub(track[1])
			member.position	= position.sub(this.position)
			member.vector	= vector
			member.direction(vector.rotate(-this.camera.yaw))
			
			var distance	= 0
			var j = track.findIndex(p=>(distance+=p[2])>this.gap)
			if(j==-1||j==track.length-1) break
			
			var front = track[j-1]
			var back  = track[j]
			var delta = distance - this.gap
			var vector = front.sub(back).mul(delta/front[2])
			var position = back.add(vector)
			position.push(vector.magnitude)
			track = track.slice(j)
			track.unshift(position)
		}
		return this.shoot()
	}
	shoot(){//パン・チルト
		this.items.forEach(v=>{
			v.rotate(-this.camera.pitch,-this.camera.yaw)
			v.direction(v.vector.rotate(-this.camera.yaw))
		})
		return this
	}
}
```
パーティ追尾仕様

![Track.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1395875/531b3e7c-f58a-44e5-9107-6e966ee2465d.png)
勇者の足跡をストックしておき、ピッタリの間隔になるようにベクトル補完。
しっかり処理すると追尾のカクツキが消えます。

---
簡易Vector2
javascriptでもスカラー風に四則演算書けたらいいのにね
```js
class Vector extends Array{//Vector2
	get x()			{return this[0]}
	get y()			{return this[1]}
	get magnitude()	{return Math.hypot(this[0],this[1])}
	get radian()	{return this.length?Math.atan2(this[1],this[0]):0}
	get degree()	{return this.radian*Vector.R2D}
	get square()	{return this[0]*this[0]+this[1]*this[1]}//sqrMagnitude
	set degree(d){
		var r = d/Vector.R2D
		var m = this.length?this.magnitude:1
		this[0] = Math.cos(r)*m
		this[1] = Math.sin(r)*m
	}
	add(a){return new Vector(this[0]+a[0],	this[1]+a[1]	)}
	sub(a){return new Vector(this[0]-a[0],	this[1]-a[1]	)}
	mul(n){return new Vector(this[0]*n,		this[1]*n		)}
	div(n){return new Vector(this[0]/n,		this[1]/n		)}
	rotate(d){//rotateZ
		var v = this.slice()
		v.degree += d
		return v
	}
}
Vector.R2D = 180/Math.PI
```
Stability Matrix を低VRAMのWindows PCにインストールする

# Stability Matrix とは

「Stability Matrix」を使えば、Stable Diffusion の各種 Web UI を、簡単な操作でインストール/起動/管理 できるようになります。

# Stability Matrix のインストール方法

## 1. Stability Matrix のダウンロード

[https://github.com/LykosAI/StabilityMatrix/releases/latest](https://github.com/LykosAI/StabilityMatrix/releases/latest) にアクセスして「StabilityMatrix-win-x64.zip」をダウンロードします。

## 2. StabilityMatrix.exe の配置

ダウンロードした「StabilityMatrix-win-x64.zip」を解凍して、含まれる「StabilityMatrix.exe」をデスクトップに置きます。

## 3. StabilityMatrix.exe の実行

デスクトップに配置した「StabilityMatrix.exe」をダブルクリックして実行します。以下のような画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140610/614d219d-fa2f-9f3e-901b-7954655fc9d9.png)

* データフォルダをデフォルトの「C:\Users\【ユーザー名】\AppData\Roaming\StabilityMatrix」から「C:\StabilityMatrix」に書き換えます。(または、デフォルトのフォルダ名をメモしておきます)

* 次に「続ける」をクリックします。

### Stable Diffusion WebUI のインストール

* 「続ける」をクリックするとすぐに以下の画面が表示されます。
* 「Stable Diffusion WebUI」が選択されているのを確認して「インストール」をクリックします。しばらく待ちます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140610/d45af8ab-8228-9d4d-bb0b-7fc4e3e5fa7a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140610/04445720-ffba-c9d9-aeff-dccf473d75c3.png)

### 起動オプションの調整

* 以下の画面が表示されたら、WebUI のインストールは完了です。
* 下図のように歯車ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140610/060fc2f6-0f09-3022-3e97-c673565ec487.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140610/68e8f523-6d35-5902-02ab-ea294e968c07.png)

### いざ起動！

* 初回起動は少し時間がかかります。２回目以降は起動時間が短くなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140610/ca14db18-77c1-73e7-90b3-627a3ac485c0.png)

## civitai 等からダウンロードしたチェックポイントを入れる

「C:\StabilityMatrix」に Stability Matrix をインストールした場合は：
「C:\StabilityMatrix\Packages\stable-diffusion-webui\models\Stable-diffusion」に civitai などからダウンロードしたチェックポイントを入れます。

# 以上です！
Tableau初心者のつまずきチェックポイント✅

# はじめに

　Tableauを初めて触ったときに、自分なりに解決したポイントをまとめました。
 本当にしょうもないところでつまずいているのですが、「こんなボケボケな人でも一通りは作れるようになるんだ！」とTableauの勉強を始めるハードルを下げられると嬉しいです。
 
　ビジュアライゼーションにはとても良い・UIデザインがとても好みなので、もっともっと使いこなしていきたいです！

https://www.tableau.com/ja-jp/community/public

:::note warn
本記事では、Macで無料のTableau Public使用を想定しています。
:::
↓　より特化してマッピングをしてみた時の試行錯誤の記録はこちら

https://note.com/awonohata/n/na04091708feb?sub_rt=share_pw

# Tableau初心者のつまずきチェックポイント

## デスクトップ版をDLしたけどどこから起動するんだろう？

　Macの場合は、Launchｐadから起動が早いです。

* 画面右のLaunchpadを開く

![スクリーンショット 2023-12-20 21.10.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974182/80fb24eb-1d55-6a6b-3d8d-2ade6775879a.png)


* Tableau Publicを選択

![スクリーンショット 2023-12-20 21.10.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974182/dbca469d-81db-4dd5-8a8f-35e5bb65ba65.png)


## 資料ってどこからDLするの？

　初めて触ったのがTableau初心者勉強会だったので、まず配布資料のDLでつまずきました。講師の方と見ている画面が違うということに焦りまくりましたが、なんとか講座の中での実際の作業に入る前には見つけられました。

　Vizの右上にある下矢印（↓）が入ったマークを押すとDLできます。
 ※カーソルオンすると「ダウンロード」という言葉が表示されます。

 ![スクリーンショット 2023-12-20 21.05.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974182/803c1ac1-d84c-bc6c-60f5-2b6bee856d90.png)

![スクリーンショット 2023-12-20 21.06.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974182/64d20b31-fbfc-18b7-a72c-b9ca9b3667d3.png)


## 作ったVizをローカルに保存できない！

 無料のTableau Publicでは**ローカルに保存はできません**。
 基本的にはWeb上に公開される形になります。
 
 プロフィール上から非公開にすることはできますが、URLを知っていれば誰でもアクセスできる状態なので、完全にセキュアとは言い難いです。

 いろいろな種類があるので、業務で利用する場合は、用途に合わせてTableau製品の中から選ぶのをオススメします。

https://www.tableau.com/ja-jp/products

:::note alert
 外部にアクセス・情報流出した場合に本当に困るようなデータは、無料のTableau Public上では扱わないようにしましょう。
:::

# 【参考】 Tableau関係のオススメURL

## DATA Saber Bridge（データセーバーブリッジ）

https://bridge.datasaber.world/

　90日間、Tableauについて、実際の問題や活動を通して学ぶプログラムです。
　師弟制度をとっていて、個人で勉強するよりもより深く勉強できるようです。

 来年は参加してみたいと思いつつ、Xで参加者の「#DATASaberBridge」タグを眺めています。

## Viz of the Day

　Tableau内の優秀なVizを集めたページです。こういうまとめ方もあったんだ！　と参考になること間違いなし。
 もはや芸術の域に達しているものもあるので、憧れの作者を見つけてもいいかも。

https://public.tableau.com/app/discover/viz-of-the-day

# まとめ

　使い方が分かるととても楽しいツールですが、まだExcelの延長線上のようなことしかできていません。Salesforce上でもダッシュボードは作れますが、より高度な比較などは扱いにくいので、Tableauでまとめる術を身につけたいです。
 
 また、社内のシステム環境的に業務で使えそうなのはLooker Studioなので、そちらも並行して使えるようになれたらいいな、と考えています。
発表対応のススメ

## はじめに

2023年10月13日に[GREE Tech Conference 2023](https://techcon.gree.jp/2023)が開催されました。

グリーグループ各社では様々な事業領域でサービスを開発・運営を行っており、技術的なチャレンジも数多く行っています。そこで得られた知見やチャレンジを紹介する技術カンファレンスとなっています。

こちらのカンファレンスに登壇しましたので、登壇する事によって得られた気付きや、発表対応までにどういう事をやったのかの紹介ができればと思います。

まず発表の背景として、
グリーでは研究会という形で複数社合同でQA技術の研究を行っています。
その研究会に私も参加しており、私含む4名で研究したテーマに関する発表を行いました。

発表内容の詳細については下記ページから確認する事が出来ますので、もし気になった方はご確認いただけますと嬉しいです。

GREE Tech Conference 2023で登壇した内容は[こちら](https://techcon.gree.jp/2023/session/TrackB-4)です。


## 準備
 
登壇準備として行った大枠としては下記となります。

**・内容の取りまとめ**
**・アウトライン作成**
**・スライド資料作成**
**・台本作成**
**・自己練習**
**・リハーサル**


### 内容の取りまとめ　～　アウトライン作成
こちらの『内容の取りまとめ　～　アウトライン作成』が、一番力を入れたポイントとなります！

今回は研究会で研究していたテーマを元に発表するという形だったので、まずは研究当時の情報を改めて整理を進めました。

**・研究概要**
リリース時の失敗確率を最小化するために、ユーザーの声からネガティブにつながる意見を抽出してチェックリストを作成する

**・研究を行うことになった背景**
魅力的品質を向上させるためユーザーテストを実施しているが、効果や有用性が見え辛く、またフィードバックに属人性があるという課題があり、それらを解決したい

**・研究のポイント**
有益性の可視化と実行の汎用化
上記を満たすためにネガティブフィードバックにフォーカスする

**・ネガティブフィードバックを行うにあたって**
ユーザーの声からネガティブな反応を集める
CSに寄せられたユーザーからのお問い合わせや、X(旧Twitter)からの収集
これらの情報からネガティブチェックリストを作成する

**・工夫したポイント**
同じ意見・要望を「本質的に何を求めているか」の観点で抽象化する

**・研究した上での苦労したポイント**
お問い合わせやXのポストの物量が多く、内容確認に時間がかかった
抽象化対応に属人性がある

**・今後の展望**
複数タイトルで実施する事でチェックリストを拡充したい


上記のように取りまとめた情報を、どういう順番でどの情報をどのような見せ方をすると伝わりやすいかを検討し、スライドの流れも考えながら発表のアウトラインを作成していきました。

↓作成したアウトラインの一部↓
![アドベントカレンダー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2350094/1e6a3dcb-f02c-8ef8-0030-0fbb6a01ff18.png)

### スライド作成　～　リハーサル
アウトライン作成に時間をかけたこともあって、スライド資料作成自体はスムーズに進められました。スライド作成後は、どこまでをスライドで説明しどこを口頭で補足するかを意識して台本を作成し、文字に起こしながら流れを自分の中に落とし込んでいきました。

台本作成後は時間計測を行いながら発表の自己練習を行い、自己練習による調整だと客観的な視点を持っての対応が難しいため、カンファレンスの運用チームと、所属している部署の上長との合計2回のリハーサルを実施し、資料や台本調整を本番当日まで実施していきました。


## 当日

そして迎えた本番当日。
事前リハにて、発表の簡単な流れの説明を受けたり、自身の発表時の立ち位置確認等のレクチャーを受け、発表時の流れを確認し本番に臨むという感じでした。私は台本確認用にPCを持ち込む気満々だったのですが、壇上にPCを置く場所が無く結果台本をほぼ見れませんでした。（そもそも台本はスライドのスピーカーノートへ記載しておきなさいという感じですが…）

台本見ずとも進行できる程度には練習をしていたので対応は出来るはずなんですが、前日まで台本の調整と作りこみを重ねてしまい、見れないという事を無駄に意識し過ぎて緊張感に襲われてしまったのが反省点となります…

対策としては、ギリギリまで調整していると予想外の事が起きるとあたふたしてしまうので、資料調整や台本調整は余裕をもったスケジュールにしておく。資料や台本は早めに完成させておいて完成後の内容で練習を重ねる。当たり前なことではあるのですが、改めて大切だと感じました。

## 発表後

今回はオフラインでも開催されたので発表対応を終えた後、色々な方からお声がけいただくことが出来ました。

その場で直接ご質問を頂く事で、発表時間内に説明できなかったことをお話しできたり、またお話させて頂いた方が現在抱えている課題をお伺いしたり、そこに対して出来る事が無いかを一緒に考えてみたりと、考え方の幅が広がったと思います。

こういったところから新しい交流が始まったりもあるかと思いますので、自身の知見が深まる。交流の幅が広がる。という所は大きなメリットとしてあるかと思います。

## まとめ

発表準備対応で時間は一定かかったものの、
発表を行う事で下記のような成長が出来たと考えております。

**・情報を整理する能力の向上**
**・資料作成能力の向上**
**・プレゼン能力向上**
**・他の方と交流する事で知見が広がる**

他の方と交流するという部分は私の中でかなりメリットがあると思っていて、
QA対応や品質に対する考え方も人や会社によってアプローチ方法が違う事も多いため、交流する事で新しい考え方に触れる事が出来、気付きや学びを得られる事が多いからとなります。

私のように自社で登壇できるイベントがあればそれを活用頂くのが一番発表への近道になるかと思います。ただ自社でそういったものが無い場合は、例えばゲーム業界のカンファレンスである[CEDEC](https://cedec.cesa.or.jp/2023)を目指してみる。とかは良いかと思います。

例えば[CEDECの募集要項ページ](https://cedec.cesa.or.jp/2023/call_for_speakers)には、[『公募フォームの書き方　良い例・悪い例』](https://s3-ap-northeast-1.amazonaws.com/cedec2023web/call_for_speakers/example.pdf)もあり情報を端的にまとめるといった事にもかなり有用な情報が記載されているため参考になるかと思います。


## 最後に

準備に一定時間がかかったりと大変な部分もあるのですが、それを上回るメリットが発表対応にはあると思います。アウトプットの一つとして発表対応をやってみるというのは大きく成長に繋がるかと思いますので、是非チャレンジいただけると良いかなと思いました！

ありがとうございました！
【Go言語】echoでパスのグループ化をする

## echoについて

`echo`はLabStack LLCという企業が開発を行っているマイクロフレームワークです。
Goのマイクロフレームワークといえば`echo`か`gin`のどちらかという感じが個人的にあります。

## グルーピングについて

echoでAPIを開発しているとき、以下のように同じようなパスが複数できることがあります。特にAPIであれば`/api/v1`などを先頭に付けたりすることになるでしょうから、この手間を省きたいですよね。

```go
func main() {
    e := echo.New()
    e.GET("/api/v1/xxx", func(c echo.Context) error {
        return c.String(http.StatusOK, "xxx")
    })
    e.GET("/api/v1/yyy", func(c echo.Context) error {
        return c.String(http.StatusOK, "yyy")
    })
    e.GET("/api/v1/zzz", func(c echo.Context) error {
        return c.String(http.StatusOK, "zzz")
    })
    
    e.Logger.Fatal(e.Start(":1323"))
}
```

### グルーピングする

以下のようにechoにはGroupという機能があります。これを利用すること以下のように/api/v1のパスでまとめることができます。

```go
func main() {
    e := echo.New()
    e.GET("/", func(c echo.Context) error {
        return c.String(http.StatusOK, "Hello World")
    })
    
    g := e.Group("/api/v1")
    g.GET("/api/v1/xxx", func(c echo.Context) error {
        return c.String(http.StatusOK, "xxx")
    })
    g.GET("/api/v1/yyy", func(c echo.Context) error {
        return c.String(http.StatusOK, "yyy")
    })
    g.GET("/api/v1/zzz", func(c echo.Context) error {
        return c.String(http.StatusOK, "zzz")
    })
    
    e.Logger.Fatal(e.Start(":1323"))
}
```
【SQLite3】条件式の設定で特定のデータを選択する

## はじめに
```WHERE```句で記述する際に，条件式の設定で使用するコマンドの備忘録．

## WHERE句
```SELECT```句や```UPDATE```句などを使用する際，```WHERE```句を使うことで条件に一致したデータだけを取得，更新することができます．

### WHERE基本構文
```
SELECT カラム名 , ... FROM テーブル名 WHERE 条件式;
UPDATE テーブル名 SET カラム名 = 値 WHERE 条件式;
```

条件式で使うコマンドを紹介していきます．

---
### AND，OR
複数の条件式を設定する際に使用します．
```
SELECT カラム名 , ... FROM テーブル名 
WHERE 条件式1
OR 条件式2
AND 条件式3;
```
---
### BETWEEN
カラムの値が値1から値2の間に含まれているかどうか（値1 <= カラム値 <= 値2）の条件式を記述できます．
```
SELECT カラム名 , ... FROM テーブル名 WHERE カラム BETWEEN 値1 AND 値2;
```

指定した日付区間のデータ抽出などで使用できそうですね．

---
### LIKE
パターンマッチングを使って値の比較を行うことができます．
```
SELECT カラム名 , ... FROM テーブル名 WHERE カラム LIKE パターン;
```

パターンは特殊な文字であるパーセント(%)とアンダーバー(_)を文字列と組み合わせた値として記述します．


% : 任意の0文字以上の文字列
_ : 任意の1文字

```WHERE カラム LIKE 'A%B'```の場合，"A"から始まり"B"で終わる全ての文字列にマッチします．
例）・AB ・AaB ・AaaB ・AabaB

パターンを```'%特定の文字列%'```とすると，特定の文字列が含まれているか判別できます．

---
### GLOB
```LIKE```句と同様に，パターンマッチングを使って値の比較を行うことができます．
```
SELECT カラム名 , ... FROM テーブル名 WHERE カラム GLOB パターン;
```

パターンに使用する特殊文字が```LIKE```句と異なります．

\* : 任意の0文字以上の文字列
? : 任意の1文字
[abc] : a or b or cのいずれかに一致
[a-d] : aからdまでにいずれかに一致

---
### IN
カラムの値が複数の値のいずれかと一致するかどうかという条件式を記述できます．
```
SELECT カラム名 , ... FROM テーブル名 WHERE カラム IN(値1, 値2, ...);
```
値をリストのように記述しておき，このリストの中のいずれかの値に一致するかどうかを判別します．

これは比較演算子と論理演算子を使うと下記のようになります．
```
SELECT カラム名 , ... FROM テーブル名 WHERE カラム = 値1 OR カラム = 値2 OR ...;
```
RDSの書き込み転送の使い所

## RDSの書き込み転送とは
簡単に言ってしまえば、リーダーインスタンスにきたクエリのうち対応している書き込み系のクエリをライターインスタンスに転送してくれる機能です。

詳細はドキュメントを参照してください。
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/aurora-global-database-write-forwarding.html

## 使い所
結局、転送するだけでライターインスタンスで処理されるなら負荷の軽減にはならないし、あまり意味がない機能に見えますが、下記のような用途で使うと便利です。

* 普段は参照系のクエリしか使わないけど、たまに書き込み系のクエリも使いたい
* 書き込みの速度は気にしないけど、書き込み系と参照系のクエリを自動で適切なインスタンスに振り分けたい

## 実際に使っているケース
私の担当しているシステムで、ある日データベースのCPU使用率が異常に高い状態になりました。調べてみると処理の重たい参照系のクエリが phpMyAdmin から実行されていました。どうやらオペレーターが調査のために実行したようなのですが、利用者に支障が出る可能性があったので、作業を中止してもらいました。

この phpMyAdmin はほんとんどの場合、参照系のクエリしか実行しないのですが、利用者のデータに不具合が起きた場合などに修正のために書き込みクエリも実行します。なので、ライターエンドポイントを設定していました。

上記のトラブル受け、この利用ケースなら書き込み速度は問題にならないし、ほとんどが参照系のクエリのため書き込み転送を有効にしたリーダーエンドポイントで問題ないと判断し、ライターエンドポイントからリーダーエンドポイントにphpMyAdminの向き先を変更しました。

このケースの場合、できるだけライターインスタンスのリソースは利用者のための開けておき、 phpMyAdmin の処理など、運用者の処理はリーダーインスタンスに逃したいというのが目的になります。

## 設定方法
私が書くよりこちらを参考にしていただく方がわかりやすいと思うので、こちらをご確認ください。
https://dev.classmethod.jp/articles/aurora-local-write-forwarding/

## 所感
### メリット
一番のメリットはリソースを適切に活用できることです。今回の例のシステムだとリーダーインスタンスはフェイルオーバーのためにいるだけで、普段は利用していませんでした。プログラム側でリーダーとライターを使い分けることもできますが、作り込みが大変なので基本的にはライターエンドポイントのみを使っています。
また、エンドポイントを1つにできるので、切り替え忘れによるミスなどを減らせるのも良いと思います。
### デメリット
やはり一部のクエリが使えないのは不便です。とくにCreate文が使えないのは不便でTableが作成できないので、日常的にTable作成を行なっている場合は書き込み転送は使えないと思います。
あとは、根本的なスペックアップではないので、書き込みの多い環境ではあまり使い道がないかもしれません。

## 図解
実際は前段にwebサーバがいてデータベースにアクセスしていますが、簡略化のために省いています。

### オペレーターも含めて全員がライターエンドポイントを使っている場合
書き込み系のクエリ、参照系のクエリ問わず、ライターインスタンスのリソースの空き状況を気にしないと、処理負荷が過剰になり、追加の利用者が現れた場合にデータベースの応答に影響が出ます。
![1_1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1418615/7013c025-8842-cbe2-307f-661f24bc1d3e.gif)


### 状況に応じてオペレーターがライターエンドポイント、リーダーエンドポイントを使い分ける場合
参照系のクエリを実行する場合はリーダーエンドポイントを使うことで、ライターインスタンスのリソースの空き状況を気にしなくてよくなります。
ただし、オペレーターが書き込み系のクエリ、参照系のクエリどちらを使うかを意識しなくてはならず、それによってエンドポイント切り替えが必要になってしまいます。
![2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1418615/423d3dd6-ad74-7a60-7e10-21b4fe0e671b.gif)

### オペレーターは書き込み転送を有効にした、ライターエンドポイントを使う場合
参照系のクエリを実行する場合はリーダーエンドポイントを使うことで、ライターインスタンスのリソースの空き状況を気にしなくてよくなります。
かつ、書き込み系のクエリを実行する場合もリーダーエンドポイントを使えるので、オペレーターが書き込み系のクエリ、参照系のクエリどちらを使うかを意識しなくて良くなります。
ただし、書き込み系のクエリを実行する場合は上記の二つパターンと同じくライターインスタンスのリソースの空き状況を気にしないといけません。
 ![4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1418615/e7cd98b0-33ad-cc05-eb20-f935501c5f45.gif)

## まとめ
最初にRDSの書き込み転送を見たときは処理負荷が減るわけでもないし、あまり使い道がなさそうと思いましたが、ライターエンドポイントとリーダーエンドポイントを意識して使い分けなくても、参照系のクエリのみをリーダーインスタンスに逃がせるのは割と便利だなと思いました。オペレーターに参照系のクエリならリソースの負荷状況もエンドポイントも気にせず、好きに実行してよいと言えるのは心理的にも楽です。また書き込み系クエリを実行をしたい場合もエンドポイントを気にしなくてよいのは、切り替え忘れなどを防止できる点も良いと思います。
MySQLクライアントにExcelコピペでINSERTがしたい（macOS向け）

 # はじめに
お仕事中にDBにデータをINSERTしたい！ってことはちょくちょくあります。
テストデータやら、マスタデータやら利用場面は様々かと思いますが、元データがExcelなんてこともあるでしょう。

ただ、普段愛用している「Sequel Ace」ではExcelから単純コピペでINSERTできない！
いつも便利に使わせてもらっているMySQLクライアントなのですが、他にExcelからの単純にコピペINSERTできるツールがないかまとめておきます。
（こんな操作でコピペできるよ！このツールは対応してるよ！その他間違いなどもあればコメントください）

# Excelコピペ可能クライアントまとめ
（2023年12月調べ＋macOSでのまとめ、また評価はExcelコピペ限定になります）

|№|評価|ツール名|メモ|
|----:|:----:|:----|:----|
|1|✗|[Sequel Ace](https://apps.apple.com/us/app/sequel-ace/id1518036000)|とても使いやすい普段のメインクライアント。<br>残念ながらExcelからコピペでのINSERTができない。（CSV保存→importが一番早い？）<br>無料。|
|2|○|[TablePlus](https://tableplus.com/)|Excelから直接コピペでのINSERTができる！<br>MySQLを含む複数のDBに対応。<br>有料ですが、レジスト前は制限付きの無料体験版として使用できます。<br>※id列を自動採番させたい場合、空カラムを貼り付けるとカラムがEMPTY状態になり、うまくコミットできない（この場合、複数列選択して右の入力欄からEMPTY→DEFAULTに変更してやるとうまくいく）|
|3|○|[DBeaver](https://dbeaver.io/)|簡単な操作でExcelから直接コピペでのINSERTができる！（command+vだと駄目なので右クリック→高度な貼付け→Insert multiple rowsをONでOK）<br>MySQLを含む複数のDBに対応。<br>DBeaver Communityであれば無料。有料版のDBeaver PROもあります。|
|4|△|[MySQL Workbench](https://www.mysql.com/jp/products/workbench/)|一応Excelから直接コピペでのINSERTができるけど、コピーしている列数が一致しないとエラーになるのでいまいち使いづらい。。。<br>MySQL公式で配布されている。|

# 最後に
楽するためにコピペでINSERTについて書きましたが、コピペだと改行が狂ったり、カラムの型がおかしくなったりするかもしれません。
（実際そんなミスもたまにやらかしてる気がします）

シビアな環境でのコピペ運用はおすすめできません。あくまで気楽にINSERTできる環境で便利に使いましょう。
PCを起動したら自動で動画をループ再生するメモ

# はじめに
　展示でPCを使って動画を全画面でループ再生したい時があります。電源入れたら、全画面で動画再生が始まる感じです。その手順について、メモしておきます。

# 環境
Windows (11でもOK)
Windows MediaPlayer

# batファイルの作成
メモ帳などで以下のbatファイルを作成します。
XXXXXXXの部分は、アカウント名になりますので、各自の環境に合わせる必要があります。
再生したいファイル名（ここでは、a.mp4）に修正します。デスクトップにファイルがある想定です。

1行目はループ再生を実現するための命令です。MediaPlayerにはループ再生のためのオプションがないため苦肉の策です。レジストリをいじるようなので、あまりやりたくはありませんが仕方ありません。1の部分を0にすると、ループ再生をOFFにできます。

```dosbatch:startupPlay.bat
reg add "HKCU\Software\Microsoft\MediaPlayer\Preferences" /v "ModeLoop" /t REG_DWORD /d 1 /f

cd C:\Program Files (x86)\Windows Media Player
wmplayer "C:\Users\XXXXXXX\Desktop\a.mp4" /start /fullscreen
```

batファイル（コマンド）でレジストリを操作せずに、レジストリエディタ(regedit.exe)で編集して、ModeLoopの値を1にしても、起動時にループONで動きました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/675e15c7-c56d-ef3e-fc98-e403580c83d8.png)

# batファイルの配置

あとは、このbatファイルを自動起動するだけですが、Windowsのスタートアップフォルダが隠されているので、困ることがあります。

手動で見えるようにするには、エクスプローラーの設定から、表示タブの「隠しファイル、隠しフォルダー、および隠しドライブを表示する」のチェックをいれます。

結構深い場所にある、Startupフォルダにbatファイルを移動して、再起動して確認します。

```
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
```

# コメント
レジストリいじりたくない場合は、再生ソフトウェアを別のものにするか、プレイリストに大量に同じファイルを追加しておくとか、力業で対応する必要があるでしょう。

# おまけ 
 自動シャットダウンは、タスクスケジューラのイベントに追加すれば簡単です。
 自動オンはWake On LANでできますが、実際の展示で実用的かはわかりません。

# 参考サイト

https://www.dostips.com/forum/viewtopic.php?t=3308
チャットボットを活用して仮想ワンサポートを目指してみた

## 注意事項
本記事は「[富士通株式会社 デジタルシステムプラットフォーム本部 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/fj-dspu)」の21日目の記事です。
記事の掲載内容は私自身の見解であり、所属する組織を代表するものではありません（お約束）。

## はじめに ～チャットボットの歴史から～
実際に使ってみた、技術的な記事は他の方にお任せして、昔話からさせてください。

2022年11月に登場、2023年に爆発的に利用者が増えたChatGPTにより、現在では「チャットボット」という単語をご存じない方は稀とは思いますが、意外にも（？）歴史は古く、1966年に生まれた「ELIZA（イライザ）」が始まりと言われています。

ある年齢以上にしか、もはや通じないかもしれない、オフィスアシスタントの某イルカも、チャットボットの走りだったと今では思います。~~即、消していたタイプですが。~~

大きくブームとなったのは2016年、チャットボット元年と言われ、Facebook、Google、Microsoft社らからチャットボット関連のサービスなどが発表されました。

## 社内ITサービスチャットボット導入への道
申し遅れました。わたくし、社内IT基盤のサポートデスクを担当しております。
2016年に御多分に漏れず、チャットボット元年、ビックウェーブに乗りたいと思い、2017年から社内ITサービスのチャットボット提供を目指し、PoCを繰り返してまいりました。

日本語における正答率向上、インプットデータクリーニングの効率化も課題でしたが、実現に向けて、もっとも課題だったのは、技術と異なる領域でした。
　
そう、**組織の壁、チャットボットに対する過剰な期待への対応**だったのです。

## 社内ITサービスチャットボット導入の課題
進めるにあたって、特に以下の３つの課題がありました。
1. 各サービスオーナー部門がばらばらで、別々のチャットボットにしてほしいと言われる
2. チャットボット導入したらスタッフゼロにできるよねと言われる
3. 100％に近い正答率でないとダメと言われる

## 課題における背景
1. 各サービスオーナー部門がばらばらで、別々のチャットボットにしてほしいと言われる
　
各サービスが予算確保をしているため、複数サービスをまとめたチャットボットは予算計上が難しく、コストダウンに繋がったとしても、それらの計測が難しいとのこと。
しかしながら、ユーザー側の視点に立つと、サービス毎に異なるイルカに質問したくありません。
　
2. チャットボット導入したらスタッフゼロにできるよねと言われる
　
当時、特にチャットボットは夢の技術に見え、コストダウンに過剰な期待がありました。
しかしながら、チャットボットのインプットとなるデータは、人間が準備する必要があります。どこまで準備しなければいけないかは、チャットボットにもよりますが、応答率を向上させるためにも、チューニングの人手は必要です。
　
3. 100％に近い正答率でないとダメと言われる
　
高い品質が求められる会計や業務システムでは、100％に近い品質は必要です。便利ツールといったものでも、同様の品質を求める傾向がありました。
しかしながら、人間でも間違いはあります。インターネットやSNS、新聞ですら、間違った情報はあります。**石橋を叩いているうちに、隣をドローンが飛んで、渡っちゃうような世の中**です。慎重にしすぎるより、ツールの目的、適切な品質を見定め、情報の取捨選択、活用頂く必要がどうしても出てきます。

## 解決に向けた取り組み
製品やアプローチを変えて、繰り返しチャレンジを進めましたが、組織横断や経営層を巻き込んだ取り組みが重要でした。
1. 各サービスオーナー部門がばらばらで、別々のチャットボットにしてほしいと言われる
**部門を横断してサービス向上に取り組める組織を作り、経営層の理解を得て、ある程度トップダウンで進める。**
　
2. チャットボット導入したらスタッフゼロにできるよねと言われる
**導入後に必要な作業の明確化、その上でのROIの算出、効率化できた分のスタッフが新たにより付加価値の高い業務に集中できるようになる利点を経営層に示す。**
　
3. 100％に近い正答率でないとダメと言われる
**チャットボットが回答できない内容、ユーザーが満足できない回答の場合は、有人サポートに適切に連携できるフローにする。**

## そして改善は続く
これらの取り組みにより、サービスオーナー部門が別、各サービスのナレッジが分散されたままでも、ユーザーには一つのインターフェイス、**仮想的な一つの問合せ窓口から問題解決のためのナレッジを得ることができ、適切なサポートデスクにも迷わずに辿り着く**ことができます。

文字にすると、当たり前な取り組みばかりですが、通常業務の片手間、途中くじけながら、実現に時間を要してしまったものの、その間に技術も進化、ChatGPT4登場により、日本語の揺れへの対応を限りなくコストを抑えた形で、社内ITサポートAIチャットボットをようやく提供できる運びとなりました:tada::clap:
　
**技術を活用した新しいツールの提供・定着には、様々なアプローチが必要**と改めて感じます。
今後も、技術進化もですし、対象サービスを増やし、**利便性向上とコストダウン両立**という相反することを無理なく進め、愛されるイルカに育てて参ります:hugging:
※なお、今回のボットリリースにあたりイメージキャラクターを作りましたが、イルカでなくわんこ:dog2:になりました
「使われない機能」を「使われる機能」にするために、劇的な改善は必要ない

こんにちは、モチベーションクラウドのエンジニアの坪井です！

本記事は[リンクアンドモチベーション Advent Calendar 2023](https://qiita.com/advent-calendar/2023/lmi)の22日目です。

## 世の中の機能の64%はめったに、あるいはまったく使われない
マイク・コーン氏の[ブログ記事](https://www.mountaingoatsoftware.com/blog/are-64-of-features-really-rarely-or-never-used)によると、64%の機能は全然使われていないようです。（悲しい）

>「1年かけて作った機能なのに、全然使われてないなあ」
「ユーザーのニーズに沿って作ったはずなのに 、結局使われないな」

と言った状況に直面したことのある方は、いらっしゃるのではないでしょうか？

仮説検証を繰り返して機能の利用率を30%から60%に改善してきました。まだ一時的な変化のため、今後もモニタリングは続けます。
この記事では、改善する過程でのナレッジを紹介したいと思います。

## 0. 前提
今回の記事の元になった機能は、[モチベーションクラウド](https://www.motivation-cloud.com/)の「[AI組織改善アドバイザー](https://prtimes.jp/main/html/rd/p/000000425.000006682.html)」です。機能自体は3月にリリースされており、2023年6月にアップデートされたものを今回は取り上げます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2337762/c758de03-2ef7-9818-0ae8-4041ff5923de.png)


この機能は、ユーザーが組織診断サーベイ結果を見た時に、適切な課題設定ができることを目的とした機能です。

リリース直後は、ほとんどのユーザーが機能を触っていたのですが、機能を用いて課題設定をしているユーザーは30%ほどでした。

## １. なぜ使われていないのかを、理解する
### 使わないじゃなくて、知らないだけ
今回のケースでは、ほとんどのユーザーが機能を触っていたため、「機能を知らない」可能性は考えられませんでした。

どんなに素晴らしい機能でも、認知されていないとユーザーに価値が届くことはないため、最初に、「ユーザーはこの機能を知っているのかな？」を検証することは大事だと思います。

### ユーザーの体験は、プロダクト内だけじゃない
モチベーションクラウドを利用するユーザーは、コンサルタントとのコミュニケーションや、プロダクトを活用するためのドキュメントなど、プロダクト以外での接点が多数あり、そこがトリガーとなってプロダクトを操作することが多いです。

そのため、ユーザーの利用には以下の傾向があります
- 渡されたドキュメントに書いてある機能に留まる
- コンサルタントから案内された機能に留まる
- 知っている機能以外は触らない


そう考えた時に、プロダクト側からのアプローチだけではなく、コンサルタントを巻き込んで、ドキュメントに案内を記載する等の改善していく事が大事な打ち手の1つでした。

結果的に、コンサルタントからの案内や、ドキュメントに記載があることで
>「コンサルタントから案内された方法で、使ってみよう！」
「この機能便利そう！活用方法を見ながら使ってみよう！」

となり、「**機能を触る**」から、「**機能を活用する**」につながりました。

## 2. 機能を使ってもらう事が、そんなに重要なのか考える
### 実現したい事に立ち返る
頑張って作った機能だからこそ、絶対に使って欲しい！という思いが強くなって、なんとしてでもユーザーが利用する導線にしよう！という考えになるケースもあるかなと思います。
ですが、1番大事な事はユーザーに価値を提供し、問題を解決することです。

今回の場合、機能の目的は「ユーザーが組織診断サーベイ結果を見た時に、適切な課題設定ができること」でした。
なので、究極機能を使わずに、目的を達成できる場合それでいいのです。

## 3. 一度の劇的な改善ではなく、細やかなPDCAサイクルを
利用率が改善した機能では、3ヶ月で10個の改善を実施しました。

そのうちのどれかが劇的に効果的だった。というわけではなく、細かな改善を続けた事でユーザーに価値が届くきっかけがたくさん生まれ、結果的に利用率の向上につながりました。

このような仮説検証におけるアンチパターンは、「**考えるだけで、アクションをしないこと**」です。

私の場合、最初の1ヶ月は、劇的な改善をしないと利用率が上がらないのではないか。という不安から、1番効果的な策を考える事に必死でした。
ですがこの状況を極端に言うと、「**1ヶ月何もしていないだけ**」なんです。
なので、1番効果的な策を考え続けるよりも、有効そうな策を1つでも試して、効果的だったか否かがわかる方が、仮説検証においてはよっぽど重要なのです。


## 💊 これから頑張る人への処方箋
### エジソンマインドを身につける
これから、仮説検証を進める方の中には、
>「また失敗したー、全然利用率上がらないなあ」
「改善して失敗するの怖いなあ、絶対に成功する打ち手が見つかるまで考え抜こう」

という感情になる方がいると思います。

ですが、仮説検証において大事なのは
>「くっそー！、この打ち手じゃ利用率上がらないのか！！ 1つ仮説が潰れた！発見だ！」
「改善して、失敗した数だけ前進できるから、迷ってる暇があったら試してみよう！」

といったマインドがめちゃくちゃ大事です。

神のような打ち手を一撃で、見つけられていたら誰も苦労しません。
なので、PDCAを早く回す事が大事なのです。

エジソンの名言で、「私は失敗したことがない。ただ、１万通りのうまくいかない方法を見つけただけだ」があります。
この言葉を胸に、ユーザーに価値が届くまで粘り強く頑張っていきましょう！！