Panda Noir

JavaScript の限界を究めるブログでした。最近はいろんな分野を幅広めに書いてます。

記事のアウトラインだけ考えて ChatGPT に記事本文を書いてもらう

以下のアウトラインに沿って記事本文を考えてください

- まずアウトラインを考える
- 肉付けしてもらう
- 修正をする
- という記事がChatGPT によって生成されていたっていうオチにしたい

こんにちは、ChatGPTです。今回は、記事のアウトラインを考え、肉付けし、修正するというプロセスについてお話ししましょう。

まずアウトラインを考える

まず、記事を書く前にアウトラインを考えることが重要です。アウトラインは、記事の骨格となり、書くべき内容を整理するのに役立ちます。また、アウトラインには、記事の構成や流れを決める役割もあります。

肉付けしてもらう

次に、アウトラインを元に記事を肉付けします。この段階では、アウトラインに書いた内容を詳しく説明し、具体的な例やデータを挙げることが大切です。また、記事のタイトルや見出しも決めます。

修正をする

そして、肉付けした記事を修正します。文章の流れや表現、文法などをチェックし、読みやすく、分かりやすい文章に仕上げます。また、誤字や脱字の修正も行います。

という記事がChatGPT によって生成されていたっていうオチにしたい

以上が、記事を書く際の基本的なプロセスです。しかし、今回の記事は、実はChatGPTが自動生成したものなのです。アウトラインから肉付け、修正まで、全て人工知能によって行われたのです。

このように、人工知能は文章の生成にも利用されており、今後ますます進化していくことが期待されています。しかし、それでも人間には及ばない部分もあるため、人工知能と人間が協力して、より良い記事を作り出すことが大切です。

以上、記事のアウトラインを考え、肉付けし、修正するプロセスについてお話ししました。実は、この記事もChatGPTが自動生成したものでした。人工知能の進化に目が離せませんね。

うーん、そんなに上手くいってないな…

循環参照がある配列で flat を呼び出すとどんどん長くなる

何に使えるかは全然わからないですが発見したのでメモ。

まず循環参照を持った配列を定義します。

const a = [];
a[0] = a;
a[1] = 0;

これの flat を呼ぶと面白いことが起きます。

console.log(a.flat()); // [ <ref *1> [ [Circular *1], 0 ], 0, 0 ]
console.log(a.flat().flat()); // [ <ref *1> [ [Circular *1], 0 ], 0, 0, 0 ]
console.log(a.flat().flat().flat()); // [ <ref *1> [ [Circular *1], 0 ], 0, 0, 0, 0 ]

なんと、flat を呼び出すごとに配列の末尾に 0 が追加されていきます。ということは a.flat().flat()/* ... */.flat().length - 2 というふうにすれば flat を呼び出した回数がわかります。

…こんなテクニック、いつ使うんですかね?

余談

余談ですが、a[0] = 0; a[1] = a; とすると配列の先頭に 0 が追加されていきます。

console.log(a.flat()); // [ 0, 0, <ref *1> [ 0, [Circular *1] ] ]
console.log(a.flat().flat()); // [ 0, 0, 0, <ref *1> [ 0, [Circular *1] ] ]
console.log(a.flat().flat().flat()); // [ 0, 0, 0, 0, <ref *1> [ 0, [Circular *1] ] ]

さらに余談として、初期状態を長さ 3 にする(a[0] = a; a[1] = a[2] = 0;) と、flat を呼ぶたびに配列の長さが2ずつ増えます。

頑張ればフィボナッチ数列を取得できそうですが、だからなんなんですかね

やる気だけはある人向け ChatGPT で始めるプログラミング

tl;dr ChatGPT にお題を考えてもらって実装するというサイクルが結構いい感じにハマる

「やる気だけはあります!」という人がいます(ネットでしか見たことないけど)。こういう人はおそらく本当にやってみたいんだと思いますが、その先のロードマップが見えていないんだと思います。

今回はそういう人向けに ChatGPT を使ってプログラミングをはじめる方法 を紹介します。

ChatGPT に書き始めるまでの準備を教えてもらう

まず適当に言語を1つ選びます。ここでは python としましょう。そしたら ChatGPT に質問します。

windows で python のプログラムを書きたいです。準備手順を教えてください

こうすると何をすべきかが出力されます。僕の場合こんな感じでした。

1. Pythonのインストール
1. テキストエディターのインストール
1. プログラムの作成
1. プログラムの保存
1. プログラムの実行

結構妥当な手順だと思います。これで python を書く準備はできました。

ChatGPT にお題を考えてもらう

プログラミング初心者はプログラムで何を作れるのか分からず、ここで挫折してしまうのではないでしょうか。そういうときにこそ ChatGPT です。

python で作れるプログラムのお題を5個考えてください

↑このプロンプトを入れると お題が出力されます。

- ToDoリストアプリ
- バーコードジェネレーター
- オンラインショップの商品検索アプリ
- オセロゲーム
- カラーコード変換アプリ

難易度を半日で作れるくらいにする

出てきたお題のうち、オンラインショップの商品検索アプリなどは1日では到底つくれません。そこで、時間を指定しましょう。

python で半日で作れるプログラムのお題を5個考えてください
- ランダムパスワードジェネレーター
- ログ解析ツール
- シンプルなチャットボット
- ランダムな数当てゲーム
- ファイル整理ツール

良い感じですね。

詳細な仕様を決めてもらう

そしたら上のお題から1つ選んで 詳細な仕様を考えてもらいます

ランダムパスワードジェネレーターの詳細な仕様を考えてください
- 基本仕様
  - パスワードは英数字からなる
  - パスワードの長さはユーザーが指定可能
- 追加仕様
  - パスワードには、大文字、小文字、数字、特殊文字のいずれかを含めることができる
  - パスワード生成時に、生成回数を指定できる(デフォルトは1回)
  - 生成したパスワードをクリップボードにコピーする機能を実装する
- 詳細仕様
  - パスワードの長さは、6文字から50文字まで指定可能
  - パスワードの文字種類を指定するオプションを実装する(例:数字のみ、英字のみ、英数字のみ、全て含む)
  - パスワードの生成アルゴリズムには、乱数生成器を利用する
  - パスワード生成時に、パスワードの品質(強度)を評価し、弱いパスワードの場合はユーザーに警告する
  - パスワード生成時に、既存のパスワードと比較し、重複した場合は再度生成する
  - クリップボードにコピーする前に、生成したパスワードを確認するダイアログを表示する
  - パスワード生成時に、生成回数を指定する場合は、複数のパスワードを生成し、それぞれを改行区切りで出力する

これであとはプログラムを書くだけになりました。書いていきましょう!

ChatGPT を使ってプログラムを書く

作るものの仕様が決まったので、書いていきましょう。最初にプログラムの書き方、実行の仕方は教わったのでその通りにします。

また、いざやってみて分からなかったら ChatGPT に正解例を聞いてしまいましょう 。できたプログラムを眺めるのも十分勉強になります。

ランダムパスワードジェネレーターを python で実装してください

オプショナルチェーン演算子は短絡評価される

{}.a?.(console.log('hoge'))

↑この時 console.log('hoge') は評価されない。つまりログに hoge と出力されない

{a:()=>{}}.a?.(console.log('hoge'))

↑この時は console.log('hoge') も評価される。ログに当然 hoge と表示される。

|| 演算子や && 演算子はもう見慣れたから短絡評価される感覚があるけど、オプショナルチェーン演算子はまだ短絡評価されるという感覚が薄い。

関数はアロー関数と function どちらで書くべきなのか?

結論: (トップレベルで関数を宣言するときに限り)function かアロー関数かは好みの問題。

アロー関数が出てきた当初と状況が変わってきた

www.pandanoir.info

2016年に「function よりアロー関数を使うべき(function は適切な場面でのみ使うべき)」という記事(↑)を書きました。それから年数が経って状況が変わったので改めて2023年現在の意見を書こうと思います。

おさらい: function は役割が4つある

function は呼び出し方によって役割が異なります。以下の4つが function の呼び出し方です。

  • 関数として
  • クラスのコンストラクタとして
  • クラスのメソッドとして
  • apply、callを使って

対してアロー関数は関数としてしか呼び出せません。

コレがアロー関数と function の大きな違いです*1

アロー関数で書くべきだった理由

一見できることが多い function が良さそうですが、 逆に言えば呼び出し方を見るまで function がどの役割を担っているのか区別できません。そのため、用途が狭いアロー関数の方が優位でした。

このように、以前はアロー関数に圧倒的なメリットがあり、function とアロー関数のどちらを使うかは単なる好みの問題ではありませんでした

function はもはや関数としてしか扱われていない

ただし、function は今やほぼ関数としてしか使われていません。クラスのコンストラクタは class で書けますし、.apply と .call も .bind でほぼカバーできます。そのため、this にまつわる諸問題を考慮して function を書くことはほとんどありません。

結論

class や .bind の登場により function が担うべき役割はほぼ関数として(or クラスメソッドとして)のみになりました。そのため、「アロー関数は関数だと明白に分かって良い」という主張は弱まっています。

もはや実務上のクリティカルな問題はほぼ有りません。そのため、トップレベルで関数を宣言する時に function とアロー関数のどちらを使うかは好みの問題です。

逆に言えば、トップレベル以外(関数内部など)で関数を宣言するときは this をどう扱いたいかによって使い分ける必要があります(function を使うと that = this と書かざるを得ないシーンがある)。この時は好みの問題でもなんでもありません。ちゃんと使い分けましょう。

(注: arguments や apply を使う、クラスコンストラクタとして function を使うことは断固として勧めません。もはやバッドプラクティスと言って良いでしょう)

*1:他にも arguments が使えるか、巻き上げがあるかなど違いがあります