ChatGPTでTodoアプリをコーディングなしで作る（NCMB JavaScript SDK編）

ChatGPTは自然言語による質問に対して、それっぽい答えを返してくれるAIです。自然言語同士の質問と回答の場合、合っていないことも多々あるのですが、ことプログラミングコードについては割と精度が高いように思います。

今回はこのChatGPTを使って、NCMBのデモアプリを作ってみました。コーディングは一切行っていません。

## 1回目

1回目のメッセージは以下の通りです。

```
NCMBのJavaScript SDKを使ってTodoアプリを作るサンプルコードを書いてください
```

できあがったコードは以下の通りです。requireを使っているので、Node.jsなどで動くものになるようです。

```jsx
// Import the SDK
var NCMB = require("ncmb");

// Initialize the SDK with your application key and client key
var ncmb = new NCMB("YOUR_APPLICATION_KEY", "YOUR_CLIENT_KEY");

// Define the Todo class
var Todo = ncmb.DataStore("Todo");

// Add a new to-do item
var todo = new Todo({
  title: "Buy milk",
  completed: false
});
todo.save()
  .then(function(todo) {
    console.log("To-do item added successfully:", todo);
  })
  .catch(function(error) {
    console.error("Error adding to-do item:", error);
  });

// Get all to-do items
Todo.fetchAll()
  .then(function(todos) {
    console.log("All to-do items:", todos);
  })
  .catch(function(error) {
    console.error("Error fetching to-do items:", error);
  });

// Update a to-do item
todo.set("completed", true)
  .update()
  .then(function(todo) {
    console.log("To-do item updated successfully:", todo);
  })
  .catch(function(error) {
    console.error("Error updating to-do item:", error);
  });

// Delete a to-do item
todo.delete()
  .then(function() {
    console.log("To-do item deleted successfully");
  })
  .catch(function(error) {
    console.error("Error deleting to-do item:", error);
  });
```

## 2回目

上記のコードはUIがないので、ちょっとサンプルとしては使いづらいです。そこでWeb UIを作ってもらいます。

メッセージは以下を入力します。

```
HTMLのUIも作成してください
```

このように書くと、以下のコードが書かれました。かなりそれっぽいです。

```jsx
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Todo App</title>
  <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/ncmb@2.13.0/ncmb.min.js"></script>
</head>
<body>
  <h1>Todo App</h1>
  <input type="text" id="todo-title">
  <button id="add-button">Add</button>
  <ul id="todo-list"></ul>
  <script>
    // Initialize the SDK with your application key and client key
    var ncmb = new NCMB("YOUR_APPLICATION_KEY", "YOUR_CLIENT_KEY");

    // Define the Todo class
    var Todo = ncmb.DataStore("Todo");

    // Get all to-do items and render them in the UI
    Todo.fetchAll()
      .then(function(todos) {
        todos.forEach(function(todo) {
          $("#todo-list").append(`
            <li id="todo-${todo.objectId}">
              ${todo.get("title")}
              <button class="delete-button">Delete</button>
            </li>
          `);
        });
      })
      .catch(function(error) {
        console.error("Error fetching to-do items:", error);
      });

    // Add a new to-do item
    $("#add-button").click(function() {
      var todo = new Todo({
        title: $("#todo-title").val(),
        completed: false
      });
      todo.save()
        .then(function(todo) {
          $("#todo-list").append(`
            <li id="todo-${todo.objectId}">
              ${todo.get("title")}
              <button class="delete-button">Delete</button>
            </li>
          `);
          $("#todo-title").val("");
        })
        .catch(function(error) {
          console.error("Error adding to-do item:", error);
        });
    });

    // Delete a to-do item
    $("#todo-list").on("click", ".delete-button", function() {
      var todoId = $(this).closest("li").attr("id").split("-")[1];
      var todo = new Todo({objectId: todoId});
      todo.delete()
        .then(function() {
          $(`#todo-${todoId}`).remove();
        })
        .catch(function(error) {
          console.error("Error deleting to-do item:", error);
        });
    });
  </script>
</body>
</html>
```

## 3回目

ここで気になったのはNCMB JavaScript SDKのバージョンが2.13.0ということです。これは参考にしたコードが2.13.0だったのか、学習元データが2.13.0が最終版だった時代だったのかは不明です。

いずれにしても古いバージョンなので変更してもらいます。また、then/catchよりもasync/awaitの方が見やすいので変更してもらいます。

```
NCMBのライブラリバージョンを3.1.5にしてください。また、Promiseをasync/awaitに変更してください。
```

その結果が以下のようなコードです。NCMB JavaScript SDKのバージョンが変わっています。また、各関数がasync/awaitに書き換わっています。

```jsx
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Todo App</title>
  <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/ncmb@3.1.5/ncmb.min.js"></script>
</head>
<body>
  <h1>Todo App</h1>
  <input type="text" id="todo-title">
  <button id="add-button">Add</button>
  <ul id="todo-list"></ul>
  <script>
    // Initialize the SDK with your application key and client key
    var ncmb = new NCMB("YOUR_APPLICATION_KEY", "YOUR_CLIENT_KEY");

    // Define the Todo class
    var Todo = ncmb.DataStore("Todo");

    // Get all to-do items and render them in the UI
    async function fetchTodos() {
      try {
        var todos = await Todo.fetchAll();
        todos.forEach(function(todo) {
          $("#todo-list").append(`
            <li id="todo-${todo.objectId}">
              ${todo.get("title")}
              <button class="delete-button">Delete</button>
            </li>
          `);
        });
      } catch (error) {
        console.error("Error fetching to-do items:", error);
      }
    }

    fetchTodos();

    // Add a new to-do item
    $("#add-button").click(async function() {
      try {
        var todo = new Todo({
          title: $("#todo-title").val(),
          completed: false
        });
        await todo.save();
        $("#todo-list").append(`
          <li id="todo-${todo.objectId}">
            ${todo.get("title")}
            <button class="delete-button">Delete</button>
          </li>
        `);
        $("#todo-title").val("");
      } catch (error) {
        console.error("Error adding to-do item:", error);
      }
    });

    // Delete a to-do item
    $("#todo-list").on("click", ".delete-button", async function() {
      try {
        var todoId = $(this).closest("li").attr("id").split("-")[1];
        var todo = new Todo({objectId: todoId});
        await todo.delete();
        $(`#todo-${todoId}`).remove();
      } catch (error) {
        console.error("Error deleting to-do item:", error);
      }
    });
  </script>
</body>
</html>
```

他にもvarをconstに変えたり、jQueryを取り除くことも可能です。

## デプロイしてみる

このコードをJSFiddleにデプロイしてみます。 `YOUR_APPLICATION_KEY` と `YOUR_CLIENT_KEY` は自分のアプリのものと書き換えます。

https://jsfiddle.net/154emnw2/2/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/e0d3e215-8c81-7774-3cbf-920fa49c8364.png)


リンク先で動作を確認できますが、ちゃんと動いているのが分かります。

## まとめ

ChatGPTを使うことで、ちょっとしたデモアプリであればノーコーディングで作成できます。学習元になるコードが十分にないと難しいでしょうが、試してみる価値はあるでしょう。

SDKなどの使い方をGoogleで検索するのも良いですが、ChatGPTはいきなり動くコードが得られるのが便利です。

[mBaaSでサーバー開発不要！ | ニフクラ mobile backend](https://mbaas.nifcloud.com/)