Bingチャットに聞きながらdenoで簡単なアプリを作ってみようとした

# はじめに

このエントリは「Bingチャット使ってみたいな。はやってるし」というのと「ロゴがかわいいからdeno使ってみたいな」というのがたまたま同時に発生したので、ちょうどいいから「Bingチャットに聞きながらdeno使ってなんか作ろう」というものです。

## トライする人のスペック

Bing先生に聞きながらつくるにあたって、聞く方のスペックはこんな感じです
+ Deno未経験
+ TypeScript未経験
+ Reactでシンプルなフロントエンドアプリは作ったことがある
+ Create React APPはチュートリアルのみ（Hello Worldレベル）
+ Next.js未経験
+ node.js上でnpmでいろいろ持ってくる開発スタイルには慣れている

## denoでやってみたいこと

denoは、JavaScriptの実行環境です。

https://deno.land/

なんとなく以下はやってみたいような気がしていますが、どこまで、どの順番でやれるかはわかりません。Bing先生に相談しながら進めたいと思います。

+ ビルド（ファイルバンドル）が必要なフロントエンドアプリケーションをつくる
+ ローカルのHTTPサーバを使う
+ テストコードを書く
+ タスクランナーを使う

## Bingチャットの回数制限

本エントリ執筆時点、Bingチャットは1セッション6ターンまで。1日60ターンまでという制限があります。さっき、うっかりどうでもいいことに使ってしまった気がしますが、残りのターン数でどこまでいけるかドキドキしながら行きたいと思います。

https://blogs.bing.com/search/february-2023/The-new-Bing-and-Edge-Increasing-Limits-on-Chat-Sessions

## 何を作るのか

「使ってみたい」がモチベーションではあるものの、Hello Worldだといくら何でも味気ないので、日付ピッカーとかデートピッカーとかカレンダーピッカーとか呼ばれるUI部品でで指定した日付を、いろいろなフォーマットで表示するやつ作っていたいと思います。

メジャーな部品なのに一度も使ったことがないから、チャットで教えてもらうのにちょうどよさそうというのが理由です。



# 最初の一歩を聞いてみる

> denoを使ってフロントエンドアプリケーションを作りたいです。denoを使うのは初めてなのですがどうしたらよいでしょうか

![screenshot.1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308852/b2bb2c14-0052-d0ca-7906-043024959b15.jpeg)

とりあえずAleph.jsについてもっと聞いてみました。

![screenshot.2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308852/1ee3c9ef-b2d2-dfd1-a80c-4924184b62fa.jpeg)

難しいことを言っているので、とりあえず最初のチャットの回答のリンク先に行ってみることにしました。
![screenshot.4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308852/b10085d3-002b-4fe5-3460-ef7a27fa697b.jpeg)

https://www.ey-office.com/blog_archive/2021/02/11/i-tried-aleph-a-react-framework-for-deno/

ふむふむ。実はNext.jsに触ったことがないので、よくわからないのですが、まあ、やってみます。

# Bing先生の指示に従ってみる

この手順でできるようなのでトライしてみます。

1. denoのインストール
2. alephコマンドのインストール
3. プロジェクトの作成
4. 開発サーバーの起動

## denoのインストール

少し前に瞬間的にモチベーションが上がった時に、インストールまでは実施済みです。 それも、なぜか久しぶりのWindows PCに。久しぶりすぎてVSCodeが数年前のバージョンになっていました。
  
https://deno.land/manual@v1.31.1/getting_started/installation

バージョン確認結果。
```
C:\work\deno-work>deno --version
deno 1.30.3 (release, x86_64-pc-windows-msvc)
v8 10.9.194.5
typescript 4.9.4
```
VSCodeの拡張機能もインストール済です。

https://marketplace.visualstudio.com/items?itemName=denoland.vscode-deno

## Aleph.jsのインストール

ご覧くださいと言われたので見てみます。
![screenshot.5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308852/b408e800-f6e1-2827-97b6-f41f15b5c0e2.jpeg)

Aleph.jsの[ドキュメントページ](https://alephjs.org/docs/)に飛ばされました。
よくわからないので「[Get Started](https://alephjs.org/docs/get-started)」に行ってみます。

Create a new app:の最初に書いてあるコマンドをコピペしてみました。
?のところは、聞かれたので勘で答えてみました。

```
C:\work\deno-work>deno run -A -r https://alephjs.org/init.ts
? Project Name: date-format   
? Select a framework:
  1. React
  2. React with MDX
  3. Vue
  4. Yew
  5. Leptos
  6. Solid
  7. REST API
[1-7] 1
? Generate `_export.ts` file for runtime that doesn't support dynamic import (deploy to Deno Deploy)? [y/N] y
? Using Unocss(TailwindCSS)? [y/N] N
? Initialize VS Code workspace configuration? [y/N] y
↓ Downloading template(react), this might take a moment...

$ cd date-format
$ deno task dev    # Start the server in `development` mode
$ deno task start  # Start the server in `production` mode
$ deno task build  # Build & Optimize the app (bundling, SSG, etc.)

Docs: https://alephjs.org/docs
Bugs: https://github.com/alephjs/aleph.js/issues
```

GetStartのページに書いてある通りに、プロジェクトフォルダに移動して`deno task dev`と打ってみました。
```
C:\work\deno-work\date-format>deno task dev
Task dev deno run -A dev.ts
A new release of Deno is available: 1.30.3 → 1.31.1 Run `deno upgrade` to install it.       
Release notes: https://github.com/denoland/deno/releases/tag/v1.31.1
Blog post: https://deno.com/blog/v1.31
INFO [dev] Watching for file changes...
INFO Server ready on http://localhost:8000
```
Denoのバージョンアップしろと言われているような気がしますが、とりあえず無視します。ローカルサーバはちゃんと起動した模様です。

![screenshot.6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308852/70d8dc66-c71a-29cd-59ff-f9110d6c57cd.jpeg)

## Bing先生の指示を思い出す

1. denoのインストール　<-- Done
2. alephコマンドのインストール <-- たぶんDone。よくみると「alephコマンド」になっているな・・・。
3. プロジェクトの作成 <-- いつのまにかDone
4. 開発サーバーの起動 <-- いつのまにかDone

## ここからどうすれば？

Bing先生に聞いてみます

> Aleph.jsで、Reactフレームワークを使ったプロジェクトを作り、開発サーバを起動しました。日付をカレンダーから選択すると、さまざまなフォーマットで表示するアプリケーションを作りたいです。どうすればよいでしょうか？

Bing先生の回答です。
![screenshot.7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308852/9485fdc9-e79c-8a99-a284-f95ea0921af5.jpeg)

まさかの具体的コードが出てきて驚きました。

``` javascript
import React, { useState } from "react";
import DatePicker from "react-datepicker";
import "react-datepicker/dist/react-datepicker.css";

function App() {
  // 選択された日付をstateに保存
  const [selectedDate, setSelectedDate] = useState(null);

  // 日付のフォーマット関数
  const formatDate = (date) => {
    // JSON形式
    const jsonFormat = date.toJSON();
    // 年月日形式
    const ymdFormat = `${date.getFullYear()}/${date.getMonth() + 1}/${date.getDate()}`;
    // 時分秒形式
    const hmsFormat = `${date.getHours()}:${date.getMinutes()}:${date.getSeconds()}`;
    return { jsonFormat, ymdFormat, hmsFormat };
  };

  return (
    <div className="App">
      <h1>React Datepicker Demo</h1>
      <DatePicker
        selected={selectedDate}
        onChange={(date) => setSelectedDate(date)}
        dateFormat="yyyy/MM/dd"
      />
      {selectedDate && (
        <div>
          <p>JSON形式: {formatDate(selectedDate).jsonFormat}</p>
          <p>年月日形式: {formatDate(selectedDate).ymdFormat}</p>
          <p>時分秒形式: {formatDate(selectedDate).hmsFormat}</p>
        </div>
      )}
    </div>
  );
}

export default App;
```

しかし、このソース、どこに貼り付ければいいのでしょうか？Bing先生、初心者がつまづくポイントをわかっていません。と文句を言っても仕方ないので聞いてみます。

> ありがとうございます。このコードはalephで作ったプロジェクトの、どのファイルに貼り付ければよいですか？

![screenshot.8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308852/4c08aed6-dfba-f512-7805-884b9e8bc684.jpeg)

ふむふむ。全くみていなかったディレクトリ構造を見てみます。ないですね。:anguished:

![screenshot.9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308852/81c366e6-4ebb-a108-c994-8fde18a36c95.jpeg)

とりあえず聞いてみました。よくわかりませんが、ツールで提供されているコマンドでプロジェクトを作成したので、いまいちな回答な気はします。
![screenshot.10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308852/de0ca6ad-82ca-aaac-f302-6de958c11f9b.jpeg)

## 自力で少し頑張ってみる

作成されたプロジェクトとAleph.jsのドキュメントをチラチラ眺めてみます。

``` javascript:server.js
import { serve } from "aleph/react-server";
import routes from "./routes/_export.ts";

serve({
  router: { routes },
  ssr: true,
});
```

``` javascript:./routes/_export.ts
import * as $0 from "./_404.tsx";
import * as $1 from "./_app.tsx";
import * as $2 from "./index.tsx";
import * as $3 from "./todos.tsx";

export default {
  "/_404": $0,
  "/_app": $1,
  "/": $2,
  "/todos": $3,
};
```
サンプルアプリのtodos.tsxの横並びに作ればいいのかな？という勘を信じて、todos.tsxをコピーして、date.tsxというファイル名にしてみました。その結果・・・./route/_export.tsは勝手に書き換わり、http://localhost:8000/date/ で、TODOアプリが表示されるようになりました。

date.tsxに上のコードを貼り付ければよいのかな？とBing先生が作ってくれたコードをあらためて眺めてみると、TypeScriptじゃないのですが大丈夫なんでしょうか。あとreact-datepickerをしれっとimportしてますが大丈夫なんでしょうか。

だめもとで、そのままdate.tsxに貼り付けてみました。いかにもだめそうなにょろにょろがついています。
![screenshot.12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308852/965d4bf5-1894-90f6-1f4f-f42264a0e2c7.jpeg)

ブラウザからみるとこんな感じのエラーに。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308852/b730d1b4-9a01-7f61-c40e-a5d190964d67.png)

そりゃそうですよね。「コピー」ボタンついているの何気にありがたい気がします。Aleph.jsの機能なんでしょうか。

## Bing先生に聞いてみる

![screenshot.14.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308852/a26a36e0-7124-89b0-f9ae-81ab5fd298da.jpeg)

具体的な方法を聞いてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308852/45ba0411-47e7-7d38-97f0-1064cb1d1090.png)

おや。day.jsのインストールも必要なんでしょうか。聞いてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308852/05370c14-8a9c-f3ef-e444-bd95707f867c.png)

> denoでreact-datepickerとday.jsをnpmインストールするにはどうしたらいいですか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308852/52014bbd-a46b-1dc9-8610-ffa1a1695a39.png)

おや。何か勘違いしてたかな。。Bing先生が教えてくれた1番のリンク先によるとnpmは使えるようですが・・・:thinking:

https://qiita.com/rana_kualu/items/7eb1acff8f66948b04eb


あ、npm installはしないんですね！なるほど！

> Aleph でreact-datepickerとday.jsを使うにはどうしたらよいですか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308852/5d2e640d-b5de-863c-b710-dca1e1902e32.png)

ふむ。ツールで生成された中にdependencies.tsはないですね。代わりにimport_map.jsonがあるので、そっちに足してみたいと思います。とりあえずreact-datepickerだけ。

```import_map.json
{
  "imports": {
    <中略>
    "react-datepicker": "https://esm.sh/react-datepicker",
  },
  "scopes": {}
}
```

先ほどブラウザに表示されていたエラーメッセージはcssファイルが読み込めない系だったので、聞いてみます。

>react-datepickerのCSSファイルはどこからダウンロードすればよいですか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308852/5eb21dd7-cbeb-a3e0-5038-24fbb946dab0.png)


これだと別のどこかでnpm installしてファイルDLしてみないといけない？と思いつつ、とりあえずCSS部分はコメントアウトして、開発サーバ再起動してみます。

```javascript:date.tsx(Bing先生のコード）
import React, { useState } from "react";
import DatePicker from "react-datepicker";
// import "react-datepicker/dist/react-datepicker.css";
```

エラーが変わりました
```
TypeError: Import 'https://esm.sh/v108/date-fns@2.29.3/deno/setMinutes.js' failed: 500 Internal Server Error
    at https://esm.sh/v108/react-datepicker@4.10.0/deno/react-datepicker.js:2:1717
    at async importRouteModule (https://deno.land/x/aleph@1.0.0-beta.23/server/routing.ts:28:10)
    at async fetchRouteData (https://deno.land/x/aleph@1.0.0-beta.23/server/routing.ts:67:19)
    at async handler (https://deno.land/x/aleph@1.0.0-beta.23/server/handler.ts:212:22)
    at async Server.#respond (https://deno.land/std@0.175.0/http/server.ts:299:18)
```

雑に聞いてみたら回数制限にひっかかりました。残念！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308852/41cb20a6-892f-2f8c-d097-ada3e42c361c.png)

あらためて新しいチャットで聞いてみた結果。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308852/c7f67af4-a105-90c5-88cf-c539fa22010c.png)

なるほど。わからない。上の方のQiitaの記事で紹介されているnpm:XXXの書き方に変えてみます。
```import_map.json
{
  "imports": {
    <中略>
    "react-datepicker": "npm:react-datepicker",
  },
  "scopes": {}
}
```

エラーが変わりました
```
TypeError: importing npm specifiers in remote modules requires the --unstable flag (referrer: http://localhost:8000/routes/date.tsx?ssr&v=lekvxygj)
    at async importRouteModule (https://deno.land/x/aleph@1.0.0-beta.23/server/routing.ts:28:10)
    at async fetchRouteData (https://deno.land/x/aleph@1.0.0-beta.23/server/routing.ts:67:19)
    at async handler (https://deno.land/x/aleph@1.0.0-beta.23/server/handler.ts:212:22)
    at async Server.#respond (https://deno.land/std@0.175.0/http/server.ts:299:18)
```

エラーをそのまま投げてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308852/d5cbedf1-e6e9-e4f4-1ef1-6728af354c48.png)

なるほど、とりあえず--unstableをつけてみればいいんだな？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308852/82abc5d7-3274-c1c7-e891-438b45285c29.png)


ということでつけてみたけどエラーは大して変わらない。
```
TypeError: importing npm specifiers in remote modules requires the --unstable flag (referrer: http://localhost:8000/routes/date.tsx?ssr&v=lekw56gf)
    at async importRouteModule (https://deno.land/x/aleph@1.0.0-beta.23/server/routing.ts:28:10)
    at async fetchRouteData (https://deno.land/x/aleph@1.0.0-beta.23/server/routing.ts:67:19)
    at async handler (https://deno.land/x/aleph@1.0.0-beta.23/server/handler.ts:212:22)
    at async Server.#respond (https://deno.land/std@0.175.0/http/server.ts:299:18)
```

そろそろ疲れてきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308852/8ccd6691-c845-1b55-e2e0-eafb3caf265b.png)

公式ドキュメントみたりしたほうがいいか・・という気持ちになってきました。

## やめようかなと思った後にチャットを投げつける

Bing先生やさしい・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308852/8464802a-3ff1-aa01-3519-13e004552d18.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308852/d87bf022-6222-ac10-93da-5441aac693ee.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308852/e2c63198-1046-60cf-cb12-654871a33568.png)

最後がちょっと残念・・・


# Bing先生に聞いてみて

+ 慣れていないこと、初めてのことをチャットだけで教えてもらうのは、無理がありそう。検索結果として使おう。
+ チャット回答の中に複数のページへのリンクを埋め込んでくれているのはわかりやすい。検索結果として使おう。
+ 普通にキーワード検索して自分でURL探すより適切に広げた範囲の情報をもらえている気はする。
+ ちょっと楽しい