横棒って200本あんねん【Markdown AI】

すみません．200本も無いです．

# きっかけ
論文を書いている時に数字の範囲を示す横棒についての指摘をされた．波線がダメなのは知っていたがハイフンではなくエンダッシュを使うようにと．なんか長さとか高さ違うのあるよな〜とは薄々思っていたけど，なにそれ．ちなみに[約物](https://ja.wikipedia.org/wiki/%E7%B4%84%E7%89%A9)と呼ばれ，Wikipediaのページに詳しく載っている．

# 今回作ったサイト
題して…… [横棒って200本あんねん](https://mdown.ai/content/a79275ac-f6ad-4d44-a308-5f1d6f1d1e87)

作ったサイトでAIが返答している様子は以下
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3191770/2e6d0d1d-4e9f-1819-c00c-b3cf4b83de1e.png" width=100%>

# 前提
- Googleアカウントを持っていること
- 筆者は非Web系エンジニア
- デザインにこだわらなくてもある程度のものができるのでMarkdownは好き
    - [伸びなかったMarkdown記事](https://qiita.com/NAT/items/6f7fc309849f0c30992f)もよろしくお願いします！

# 今回やったこと
- Markdown AIの使用
    - Markdownで記述
    - AIモデル選択とプロンプト記入
    - お試し公開
- ChatGPTで調整

# Markdown AIの使用
本家の[Markdown AIの誰でもわかる使い方](https://qiita.com/mdown_ai_jpn/items/d3e281565c876a0bd64f)を見たほうが画像付きで結局早いし，この記事で訴求したい内容は使い方では無いので軽く．
## Markdownで記述
Markdown AIに登録後，＋ボタンを押して，プロジェクトを作成する．Markdownの記述方法に関しては本家の[markdown AI記述方法](https://qiita.com/tanaka_yaruo/items/9a8e7542f0c527499ed2)で．最初に書いた内容はこれだけ．
```
# 横棒って200本あんねん

## これはどの横棒が適切かをAIが教えてくれるサイト

あなたはどういう場面での横棒を必要としていますか．その場面を教えてください．なければどんな横棒があるか聞いてください．
```

## AIモデル選択とプロンプト記入
本家の[Markdown AIの誰でもわかる使い方](https://qiita.com/mdown_ai_jpn/items/d3e281565c876a0bd64f)を読んで，Googleの検索技術を活かすのが良さそうだと思ったのでGeminiを採用．試行錯誤した結果，現在のプロンプトは以下．Knowledgeは無し．

`
あなたは約物の中の横棒に関する専門家です．約物の中の横棒とはハイフン，ダッシュ，水平線などのことです．どの横棒を使うべきか悩んでいる人に対して適切なものを教えてください．あなたは最初にどういった場面で使いたいのかを尋ねます．その後適切な横棒を提案して下さい．ただし，想定使用環境はWordとします．またその提案ではどうキーボードに入力すると出力されるかも合わせて教えて下さい．例えばキーボードはJISなのかUSなのか．OSはWindowsなのかMacなのか．
`

これでモデルを作れたーと思っていたら……

:::note warn
Model NameはRequiredなので必須．入力していなかったので一瞬悩んだ．
:::

## お試し公開
この段階で以下の画像のように既にやりたいことが実現できるサイトとなっている．[Markdown AIの誰でもわかる使い方](https://qiita.com/mdown_ai_jpn/items/d3e281565c876a0bd64f)通りにInsertして，Saveボタンで保存．そのあと，Viewボタンを押して，Run AIボタンで何回かAIを試した後，URLボタンを押して，publishボタンを押すとURLが自動生成され，全世界に公開される．

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3191770/01177bf9-6910-f4a3-59b8-6da7c2562e16.png" width=100%>

:::note info
この記事の通りにやるだけで，サーバー設定や公開作業に手間を感じることなく，みんなに見てもらえるAI付きのサイトがアップロードされるのはありがたい．
:::

# ChatGPTで調整
ここまでにMarkdownで作ったものはデザインがアレだったので，見た目を整えるためChatGPTに聞いた．主な変更点は
- 文字のフォントサイズ，色
- 余白や配置
- AIからの返事を見やすくするための背景色と角丸
- 返事待ちローディング画面
- Markdownで返ってきた返答を見やすく整えるためのJavaScript導入

こうしてできたのが[横棒って200本あんねん](https://mdown.ai/content/a79275ac-f6ad-4d44-a308-5f1d6f1d1e87)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3191770/c62c567a-dec6-154b-113f-e3ef30a161b3.png" width=100%>

出来たソースコードは
```HTML
<!-- Marked.jsをCDN経由で読み込み -->
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>

<h1 style="font-size: 2em; text-align: center; margin-top: 20px; color: #333;">横棒って200本あんねん</h1>
<h2 style="font-size: 1.2em; text-align: center; margin: 10px 0; color: #666;">〜これはどの横棒が適切かをAIが教えてくれるサイト〜</h2>
<p style="font-size: 1.1em; text-align: center; color: #333; max-width: 600px; margin: 0 auto;">
  あなたはどういう場面での横棒を必要としていますか．その場面を教えてください．なければどんな横棒があるか聞いてください．ここでいう横棒とはハイフン，マイナス，ダッシュ，長音符号など約物に含まれるものです．
</p>
<p style="font-size: 0.9em; color: #666; text-align: center; margin-top: 15px;">入力例：どんな横棒があるの</p>

<div style="display: flex; justify-content: center; margin-top: 20px;">
  <input type="text" id="text-1731646055" style="width: 350px; padding: 10px; border: 1px solid #ccc; border-radius: 5px;" placeholder="どんな横棒があるの">
  <button type="button" id="button-1731646055" style="margin-left: 10px; padding: 10px 15px; background-color: #4CAF50; color: white; border: none; border-radius: 5px; cursor: pointer;">AIに聞く</button>
</div>

<!-- ローディングスピナー -->
<div id="loading" style="display: none; text-align: center; margin-top: 20px;">
  <div style="border: 8px solid #f3f3f3; border-top: 8px solid #4CAF50; border-radius: 50%; width: 40px; height: 40px; animation: spin 1s linear infinite; margin: 0 auto;"></div>
  <p style="margin-top: 10px; color: #666; font-size: 1.1em;">ロード中...</p>
</div>

<div id="answer-1731646055" style="margin-top: 20px; padding: 15px; border-radius: 8px; background-color: #f9f9f9; box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.1); color: #333; font-size: 1.1em; max-width: 600px; margin-left: auto; margin-right: auto; text-align: left; display: none;"></div>

<script>
(() => {
  const button = document.getElementById('button-1731646055');
  const answerDiv = document.getElementById('answer-1731646055');
  const loadingDiv = document.getElementById('loading');

  button.addEventListener('click', async event => {
    button.disabled = true;
    loadingDiv.style.display = 'block'; // ローディングスピナー表示
    answerDiv.style.display = 'none'; // 返答エリアを非表示に

    const serverAi = new ServerAI();
    const message = document.getElementById('text-1731646055').value;
    const markdownAnswer = await serverAi.getAnswerText('qiaYb9MmcKNkKTpwYdSi44', '', message);

    // Marked.jsを使ってMarkdownをHTMLに変換
    answerDiv.innerHTML = marked.parse(markdownAnswer);
    answerDiv.style.display = 'block'; // 返答エリアを表示
    loadingDiv.style.display = 'none'; // ローディングスピナーを非表示に
    button.disabled = false;
  });
})();
</script>

<style>
@keyframes spin {
  0% { transform: rotate(0deg); }
  100% { transform: rotate(360deg); }
}
</style>
```

ローディング画面がお気に入り．
これが無いとAI待ちなのかフリーズしたのかの判断ができない．
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3191770/eefa32ae-e75c-26ce-2419-d07c12699668.png" width=100%>

ちなみにChatGPTによると
- `@keyframes`で定義したspinアニメーション
- MarkdownをHTMLに変換する`Marked.js`
- `marked.parse(markdownAnswer)`でAIの返答をHTML形式に変換し`answerDiv.innerHTML`でHTMLとして表示

を導入したらしい（非Web系エンジニアなので全くわからない）．
ちなみに約物についてのQiita記事は[ハイフンに似てる文字の文字コード](https://qiita.com/ryounagaoka/items/4cf5191d1a2763667add)

## 参考文献

この記事は以下の情報を参考にして執筆しました．

- [約物 wiki](https://ja.wikipedia.org/wiki/%E7%B4%84%E7%89%A9)
- [Markdown AIの誰でもわかる使い方](https://qiita.com/mdown_ai_jpn/items/d3e281565c876a0bd64f)
- [markdown AI記述方法](https://qiita.com/tanaka_yaruo/items/9a8e7542f0c527499ed2)
- [ハイフンに似てる文字の文字コード](https://qiita.com/ryounagaoka/items/4cf5191d1a2763667add)