思索日記

本を読んで思ったことを書いてます。

英単語学習アプリ 公開のお知らせ & ChatGPTでアプリ開発はどの程度できるのか?

ごあいさつ

本日、私たちの最新のスマートフォン向け単語学習アプリ “FlashCard(仮)” をリリースできることを光栄に思います。 なんちゃって。*1

この記事では、アプリ公開のご報告と簡単なご紹介をさせていただき、その他開発にまつわる雑記を書き留めておきます。

アプリのご紹介

概要

FlashCard(仮)はスマートフォンWebブラウザ上で動く、英単語学習アプリです。 2024年3月現在、TOEIC向けの単語データを1250語収録しています。

こちらからお使いいただけます! ※スマートフォン限定です。PCでも動くと思いますがスマートフォン向けにレイアウトしています。

コンセプトと機能のご紹介

コンセプト

  • 無料・広告なし: FlashCard(仮)は無料でお使いいただけます。有料プランや有料機能はありません。広告も一切ありません。
  • シンプルなデザイン: キャラクターやゲーム要素を排除して、シンプルで機能的なデザインを目指しました。
  • 登録不要: FlashCard(仮)はWebブラウザ上で動作し、会員登録やアプリストアからのダウンロードは不要です。

機能

  • 4択の英→和 形式で単語の学習ができます。
  • ミスした単語の復習ができます。
  • 間違えた単語、チェックした単語を優先的に学習できます。記録はブラウザ内に保存されます。

開発経緯

開発のきっかけは、自分の英語の勉強にためにシンプルな英単語帳アプリがほしかったためです。既存の単語アプリはゲーミフィケーションやキャラクター要素があったり、定められたレールに従って勉強している感が強い(前のセクションを完了しない次に進めない、等)といった特徴がありました。私はこれが嫌で、もっとシンプルな単語学習アプリがあったらいいなと思うようになりました。

次に自分の勉強のために調べたところTOEIC Service Listという公開された単語リストを見つけたので、これを使って効率よく勉強する方法はないかなと模索しました。当初はこれをNotionにインポートして、日本語訳をつけて単語帳(表面に英語、裏面に日本語が書かれたカード)の代わりにしようかと思っていました。

最終的に、TOEIC Service Listの英単語集を活用して、自分の好みの英単語学習アプリを作ってしまうのがベストという結論になりました。なのでこのアプリは、私自身がほしい最低限の機能が搭載されている状態になっています。趣味でアプリ作れるって素敵ですね。*2

ハンドメイドアプリ(画像はAI生成)

なぜ完全無料が実現できるのか?

本アプリは完全無料&広告なしで公開します。なぜそんなことができるのかを書いておきますね。

  • 個人の趣味とスキルアップのための開発: そもそもこのアプリ制作は自分の趣味でやっているものであり仕事ではないので、利益を出す必要はないのです。アプリの開発過程(企画、開発の各工程)を一人で経験し、新しい技術も学ぶことができるため、収益が出なくても「作った時点で私の得」なのです。
  • ブラウザ上でのみ動くため、クラウドサービスを使っていない: 本アプリはブラウザ上で完結します。多くのアプリはデータの保存のためにクラウドサービスを使っていますが、このアプリではデータはブラウザ(スマートフォン)内に保存されます。つまり、お金がかかるクラウドサービスを使っていないので、無料のまま公開できています。
  • もともとレンタルサーバーを使っているので、追加費用がかかっていない: アプリを配信するサーバーも、私が別用途でもともと用意しておいたレンタルサーバーの一部を間借りして使っています。なので追加の費用がかかっていません。*3
  • 問題データの作成にTSLとChatGPTを活用している: これが核心ですが、問題データのもととなる単語データとして前述のTSL(TOEIC Service List)を使っています。また単語データから大量の四択の問題を作成する際にはChatGPTを使い、これにより手間をほとんどかけずに問題を作成できました。

ChatGPTの活用について

本アプリの開発にあたっては、ChatGPTを全面的に使いました。完成したアプリの機能にChatGPTが搭載されているわけではなく、あくまでも開発の際のサポートに使ったという意味です。

問題データの作成へのChatGPT活用

NGSLP(New General Service List Project)のページで、TSLの単語データを入手可能です。この単語データをChatGPTに処理させて、四択の和訳問題を作成しました*4。ChatGPTではあまりに多すぎる入出力を扱えないため、単語は50語ずつに区切り、区切ったセットをChatGPTに渡しました。

開発したアプリが読み込む単語データの形はJSONという形式です。この形式は人間や機械にとっての可読性が高い反面、文字数がやや多くなるという欠点があります。ChatGPTで入出力する文字数をなるべく減らすために、このJSON形式でいきなり出力させず、まずCSV形式で出力させるようにしました。次のようなプロンプトを使って単語データを処理しました。

あなたは日本の一流大学で働く、英語の授業の講師です。これから示すTOEIC Service Listの単語を使って、和訳問題の選択肢を作成してください。手順は次に従ってください。

1. 入力はカンマ区切りで、複数の英単語が与えられます。注目する1つの英単語をwとします。
2. wの日本語訳をjとします。jの候補が複数考えられる場合、最も一般的または適切な日本語訳1つをjとして採用してください。jの選択では、直接的なカタカナ語よりも日本語の同等語を優先してください。ただし、現代の日本語で一般的に使用されているカタカナ語(例えば、「スマートフォン」)は適宜使用しても構いません。英単語が和製英語や英語からの借用語である場合、その用法の違いを考慮して、最も適切な日本語訳を選んでください。
3. wを使った英単語の和訳4択問題を作成します。ダミーとなる回答選択肢をd[0], d[1], d[2]とします。ダミーの選択肢を作る手順は特に重要ですので、以下の指示に従ってください。
    1. ダミーの選択肢は、jとは異なる意味を持つものである必要がありますが、誤訳としてありがちなものや、同じカテゴリーから選ばれることが望ましいです。
    2. ダミーの選択肢は、wとは異なる単語に再英訳されることを確認してください。和製英語や英語からの借用語の場合、その再英訳が原語と異なることを特に注意してください。
    3. 誤訳としてありがちなものをダミー選択肢として選ぶ際には、実際の言語使用に基づく一般的な混同を考慮してください。
    4. ダミー選択肢作成にあたり、日本語話者は r/l, v/b, などの区別が苦手がちという点や、和製英語や英語からの借用語となっている類似語をうまく取り入れると効果的です。たとえば、”lawn”は本来は「芝生」と訳されますが、「ローン」と似ているので「借金」という選択肢を入れてみるなどは効果的です。
4. w1つにつき、1行で出力します。出力のフォーマットは次のようにしてください。
    
    `w, j, d[0], d[1], d[2]`
    
    例: voucher, クーポン, 証明書, チケット, 領収書
    
5. このステップを全ての単語について繰り返してください。1単語の出力が終わったら改行して、次の単語について出力します。
mosquito,obligate,oblige,occurrence,operational,outage,overcrowd,paralegal,partially,pepper,permanently,plow,query,railway,raincoat,reconsider,redesign,rehearsal,relaxation,repetition,retreat,salon,satellite,scenery,serial,sew,sketch,smartphone,soar,stimulus,stockbroker,tablecloth,thirsty,thrill,tile,toiletry,trademark,tropical,tuna,unemployed,validate,vanilla,willingness,wristwatch,abide,actively,allergy,apprehensive,automotive,bacteria

出力サンプル(最初の5行)

mosquito, 蚊, 蝶, 蜂, 蟻
obligate, 義務付ける, 解放する, 忘れる, 無視する
oblige, 強いる, 許可する, 阻止する, 逃避する
occurrence, 発生, 消滅, 維持, 固定
operational, 運用可能, 非稼働, 破壊, 閉鎖

ダミー生成のプロンプトが特に入念に書かれているのは、最初に数十個程度の単語から和訳問題を作成させた結果、ダミーの質があまり良くなかったためです。何度か改良を繰り返して、上記のようなプロンプトで最終的な出力を行いました。また、このプロンプトの改良にもChatGPTを使っています(うまくChatGPTに処理させられないのでプロンプトを改良してくれ、とお願いしました)。「和製英語や英語からの借用語の場合、その再英訳が原語と異なることを特に注意してください。」とか「誤訳としてありがちなものをダミー選択肢として選ぶ際には、実際の言語使用に基づく一般的な混同を考慮してください。」といった注文がそれにあたります。

単語データの変換スクリプトの作成にChatGPTを使用

CSV形式で出力させた後は、Pythonスクリプトを使って機械的に処理してJSONファイルに変換しました。このPythonスクリプトもChatGPTを使って作成しました*5。こういうのはChatGPTが得意ですね。テキスト処理のPythonスクリプトを作った際のプロンプトを参考までに置いておきます: https://chat.openai.com/share/ffa058fb-38e1-4df0-a300-7387b421c078

スクリプトを作成する際には要件をまとめて → その通りにスクリプトを作成させるという段階を踏むと良いっぽいです。この要件をまとめる部分にもChatGPTを使えます。上記リンクの中で、「以下に、雑に要件の内容をしゃべるので、その内容を「インデントされた箇条書き」の形式で整理してください。」と書いたあとの読みづらい文章は、私が声でしゃべって音声認識により書き取らせた文章です。ChatGPTによる文章処理は、このような乱雑な文章であったり多少変換がおかしくても、よきにはからって要件をまとめてくれます。音声認識macOSWindowsなどに標準搭載されているもので十分ですよ。

アプリ開発の支援にもChatGPTを活用

実はこちらのほうがChatGPT活用の目玉なのですが、アプリ開発の要件定義や設計書の作成、ソースコード(の断片)の作成、テストケースの作成など、多くの場面でChatGPTを使いました。また今回のアプリはReactというフレームワークを使っているのですが、私は今回これを使うのは初めてで、ChatGPTにゼロからサポートしてもらいながら機能や作法を学び、アプリを作成しました*6。 ただ補足しておくと、一応私はVue.jsという別のフレームワークを触った経験があるので、その経験が間違いなく活きています。「Reactのこの機能ってVueでいうところのこれと似ていませんか?違いはなんですか?」「こういうことをやりたくて、Vueならこう実現するところだけど、Reactではどうやりますか?」のように質問すれば、自分の理解をフックにしてどんどん先に進むことができますからね。まったくプログラミング経験ゼロからChatGPT使ってここまでできました!あなたもできますよ!などと言うつもりは全然ありません。よほど頭が良いかセンスがある人はゼロからでもできちゃいそうですが。。

感想や印象としては、未知のフレームワークやツールや機能を使う際、「これで合っているのかな?」と悩むことがあまりなく、一般的と思われる手段をChatGPTが教えてくれるため最短距離を進むことができたなと思います。

開発ノート

各種URL

開発体制について

公開時点で、著者1名で企画〜開発〜公開まで行っています。

またデザイン担当としてもう1名に入ってもらったため、今後アプリの更新があるかもしれません。

使用技術のご紹介

  • React: JavaScriptのフロントエンドフレームワークです。前述の通りVueは使えるので新しいフレームワークを使えるようになりたかったこと、ChatGPTに教わることで学習のハードルが下がったことが個人的な選定理由です。使い始めてみたら、Vueよりも柔軟で緻密なデータ(ステート)管理ができるなと思いました。
  • TypeScript: 途中までJavaScriptで書いていましたが、JSDocをしっかり書いているうちに「記述量ほとんど変わらないしどうせなら正式な型情報にしてしっかり型で縛った方がよくない?」と思ったので導入。これも正解でした。
  • GitHub Actions, ESLint, Jest, Sass: そのほか補助的なツールとして使っています。Jestでコンポーネントテストを書いて、GitHub ActionsのCIでプルリク時にチェックするようにしています。あまり変わったことはしていないです。とはいえ一から設定するのは大変そうなものですが、そこもやはりChatGPTに助けてもらいました。

今後の展望

デザインができる友人に本アプリの紹介をしたところ興味をもってもらえて、見栄えのブラッシュアップをお願いできることになりました。近日中にアップデートがあるかもしれません。

機能追加について。ホーム画面周りの使い勝手が個人的に気になっている(どこまで勉強したのかがわからない)ので、少し機能追加をする予定です。それ以降はいったん自分が満足してしまえば特にアップデートはないかもしれませんが、皆様に使っていただけているようであれば機能追加を考えます。

バグ報告と単語データミス報告のお願い

不具合を発見したり、機能追加のご要望がございましたら、GitHubからご報告いただけると大変助かります。また、収録されている問題データの不備がございましたら、こちらもGitHubからご報告いただけるとありがたいです。GitHubはわからない、という場合にはメール(Notionページ内に掲載があります)か、この記事へのコメントでも構いません。

*1:”Today, we are excited to announce the release of ○○!” をやってみただけ! 参考: ChatGPTのリリースノート, GitLabのリリースノート

*2:この位にしか活きない・・・編み物や革細工作成、陶芸などが趣味な、自分好みの作品を自分で作れる人が本当に羨ましいです。私の母親がそのタイプなのですが。

*3:AmazonのS3に置いてホスティングするという手もあるんですよね。実はそっちの方が安いかも・・・ドメインお引っ越ししないといけませんが

*4:ChatGPTは有料版でのみ使用可能なGPT-4を使っています

*5:私はPython書けないので・・・

*6:今回Reactの公式ドキュメントほとんど読んでなくて、ChatGPTだけに教わりながらアプリの作成までできてしまった。なんちゅう時代だ・・・。

2023年に読んだ本

週1冊程度は読んできたけど紹介するほど良かった本が10冊なかった。しかし1と2はいきなり殿堂入りするくらい良かったので、今更だけど紹介。今回紹介するのは5冊です。*1

続きを読む

あなたがChatGPTを使うときに起きていること

このビルは外から見れば放置された廃墟のようにも見えるが、内部では日夜、低賃金の労働者たちが交代制で働いている。空気は重たく、壁は剥がれ落ち、床は埃で覆われている。閉塞感に満ちたこの空間で、彼らの目は疲れきり、生気を失っているが、ミリ秒単位の期限に追われ、一刻の猶予も許されない。

彼らの使命は、日々ChatGPTに送られてくる膨大な数の質問を処理し、解決することにある。

最初に動くのは翻訳チームだ。彼らは入力された文字列を素早く理解し、他言語への変換を瞬時に行う。その間、チーム間の連携は密で、目配せや手信号で次のステップへと進む。

バトンは内容理解チームへと渡される。彼らの間では、「これは何だ、もっと早く!」や「またこの難解な質問か、誰がこんなのに答えるんだ?」といった激しい罵声が飛び交う。しかし、その声のトーンは淡々としており、緊迫感の中にも日常的なルーティンが感じられる。

専門家チームに質問が渡されると、さらに具体的な会話が展開される。「法律に基づけば、この回答は正しいが、ユーザーには理解しにくいだろう」、「エンジニアリングの問題はこれで解決だが、もっとシンプルに説明できないのか?」といった専門的な議論が交わされる。その中で、時には「お前の説明は長すぎる!」や「そんなこと、誰も聞いていない!」といった厳しい言葉が飛び出す。

クリエイティブチームは、スタンダードな回答に創造的なひねりを加える。彼らの仕事は、読者が期待しないようなアイデアや表現を織り交ぜることで、回答を一層引き立てる。

他方、AI風応答チームの役割は、これらの回答をちょっと人間らしくない、つまりAIらしい非人間的なニュアンスを持たせることで、ChatGPTの独特なキャラクターを作り出すことにある。彼らは、人間らしくなりすぎず、しかし遠く離れすぎず、という微妙なバランスをどう保つかを常に考えながら作業を行い、「これはあまりにも自然すぎる。もっと機械的な表現を加えよう」といった微調整を加える。

品質検査チームが一連の過程の最後に待ち構え、倫理的な問題がないかを厳しくチェックする。彼らの目は厳しく、一切の妥協を許さない。その間も、ミリ秒単位の期限に追われる中で、労働者たちは息もつかせぬ速さで動き続ける。品質検査チームのOKが出ると、あなたの画面に回答が表示される。

これが、あなたが質問を打ち込んでから数秒の間に、どこか遠くの薄汚れたビルの中で起きていることのすべてであり、このフィクションも勿論彼らによって作られている。*1*2*3

*1:プロンプトを公開します。この回答をベースとし、最終的な調整は自分で行いました。 chat.openai.com

*2:結局、ChatGPTの核って大規模「言語モデル」であり、知識や面白さやセンスはその中に埋め込まれる形で実装されているんですよね。現状、大脳辺縁系からの情動信号、内臓感覚、周りの表情的な反応などを使った内省的な機構を持たないので、自分で「心」の底から面白い!って思うことができない。なので結局、成果物にはAIを利用する側の人間のセンスやスキルが大きく現れる。素人考えですが、その辺が今の限界だったりするんでしょうか。知らんけど。

*3:全部フィクションではないかもしれません。 time.com

たくさんの方に無償で乗せてもらい、贈与について考えた[出雲大社ヒッチハイク体験記/後編]

前回のあらすじ。失恋をきっかけにエネルギーを発散すべく、出雲大社へ向けてヒッチハイク旅を開始。1日で4組に乗せていただき京都まで到達したものの、2日目は足踏み。自分探しの旅じゃないのに自分が見つかった。

tomato10.hatenablog.com


3日目 出会いいろいろ (1月6日(土) 京都 → 岡山)

5組目 東京から大阪に向かうバンドグループ

3日目、気を取り直していざ中国道方面へ。宝塚経由は難しそうなので、姫路経由のつもり。

ヒッチハイクすることへの抵抗はほとんど無くなり、あまり気合いを入れずにすっと立つことができるようになった。30分ほどで同じ年くらいのお兄さんが声をかけてくれた。東京方面から大阪を目指すバンドグループとのこと。土曜日だから長距離ドライバーが多くなるという事前予測は正解だったようだ。4人も乗っている車に乗せていただくのははじめてで結構わくわくした。

4人ともだいたい同じくらいの年代の方々で、話がはずんでとても楽しかった。「失恋したので出雲大社目指してるんです」という話に一番食いついてくれた。話すの恥ずかしい部分まで赤裸々に話した気がする。。あとはどういう話の流れでそうなったのかわからないけど、「性の目覚め」的な話*1を順番こにする流れになった。その話もめちゃくちゃ楽しくて、ここで紹介したいんだけど許可を取れていないのでやめておこう・・・。

気づいたら不本意な場所に連れて行かれてしまっていた。次のSAくらいまで行きたかったのが、吹田SAに着いていた。までも楽しかったし、先に進めたのでOK!

大阪に向かうバンドの皆さんと。楽しい時間をありがとうございました。

*1:伊集院光 深夜の馬鹿力」で昔そんなコーナーをやっていた。ちょうどそんな感じ

続きを読む

出雲大社までヒッチハイク旅したら自己発見できた[出雲大社ヒッチハイク体験記/前編]

ふとした思いつきから内省と思索の旅へ。神奈川から出雲大社までのヒッチハイクで、予期せぬ自己発見を経験した4泊5日の記録。

はじめに - 旅の動機 -

10年友達関係が続いて、昨年頭から1年間付き合った恋人と年末に別れた。

失恋の詳細はどうでもいいので省く。付き合っている間も友達関係の延長のような関係だったので*1、恋人でなくなることはそんな哀しくなかった。

とはいえ気持ちが不安定になるリスクもあったので、別れたその日の夜中に友達のところに駆け込んで相談した。彼は中学生時代から数えて15年以上の友達。これまで彼に恋愛相談したことはないし、2人で話したこともそんなに多くなかった(仲良しグループのうちの1人、という関係性)。ただ、親身に話を聞いてくれる・自分の意見も伝えてくれる・前向きに話をしてくれる・頭が良く、助言が適切・それなりに恋愛経験ありそう という特性をもった人に相談したくて、記憶のデータベースから検索してヒットしたのが彼だった。 今考えるとめっちゃ打算的な理由!

恋愛相談だったはずが、気づいたら僕の内面を深掘りしてくれてすごくいい刺激になった。彼の独自の、人間の持つエネルギーに関する理論も聞かせてくれてめちゃくちゃ楽しかった。僕からも、普段から考えたりブログで書いているようなことを話して、喜んでくれた。中学生の頃からお互いを知っている仲だからこその洞察をたくさん教えてくれた。普段なら絶対他人と話さないような内面の話、自分の夢の話、社会についての考察、人間関係の法則などなど 僕がずっとやりたかった深い話を朝まで話せた。こういった話ができるのが幸せで、官能的にすら思えた・・・。

彼は僕の特性を「チャレンジングだよね」という言葉で表現した。そう、言われてみれば昔から僕は、他の人があまりやろうとしないチャレンジングな事を実行に移すのが好きだ。中学生ではゲーム作ろうとしてみたり、部活を作ろうとしてみたり、青春18切符でひとり旅しようとしてみたり*2。つい最近だって、会社の枠組みから外れて仕事を面白くするための無償の活動を会社内でやろうとしたこともあった。

「チャレンジングだよね」という彼の指摘は、この後行く旅行中の内省によってさらに洗練されることになる。

恋愛相談に乗ってくれた彼の、独特な「人間の持つエネルギー」の理論によると、気持ちが上向いている・高いところにいるときには当然エネルギーを持っていると言えるけれど、気持ちがだんだん下っているときにもエネルギーを持っていると言えるとのこと。面白い!ジェットコースターのイメージだね。物理で言うところの力学的エネルギーみたいだ。止まってしまうのが一番エネルギーが無くて、良くない状態とのこと。なるほどねぇ。気持ちが下っていても、そのぶんスピードがつくから、勢いを活用して次の高い山を登ることができるんだな。

下っているときにもエネルギーを持っている

そう考えると、失恋のエネルギーをどう活用してやろうか?と前向きに捉えることができる。

*1:僕は不本意だったけど!!

*2:比較的やる人が少ない、程度の意味。やる人はもちろんいっぱいいるよね

続きを読む

質的な差が量的な差に還元されていくのは面白い[「君のクイズ」読書感想]

「君のクイズ」の面白さは、「質的な差が量的な差に還元されていく過程の面白さ」で説明できると思った。

※本記事は小川哲「君のクイズ」のネタバレを含みます。

続きを読む

知識の資本主義 知識や手順を再利用可能にしておくことは、複利的に価値を生み出す

本を読んで得た知識、いつもやる仕事の手順やTipsを面倒くさがらずにまとめておき、再利用可能な状態にしておくことは、結果的に複利的な価値を生み出す。

理由を二つ挙げる。第一に、再利用可能なナレッジは、認知資源と時間を節約する。この再利用性は一時的なものではなく、株式の配当のように節約効果がずっと持続する。節約された認知資源と時間は、そのまま余裕として確保するのは勿論、さらなるナレッジを生むために再投資すれば、複利的にナレッジと認知資源と余剰な時間を生み出すことができる。

第二に、再利用なナレッジがたくさんたまると、ナレッジ同士がつながる確率が上昇することで、ナレッジの集合自体の価値が飛躍的に高まっていく。

これらの二つの作用(節約&再投資による複利の効果と、蓄積によるナレッジ全体の価値向上)により、大きな仕事を実現できる。というか、他人や過去の自分が考えてまとめてくれたナレッジを活用しなければ、知的な意味で大きな仕事は成し遂げられない。

この様子は資本主義にも似ている。蓄積したナレッジは資本となり、複利的に巨大化する。大きなナレッジの集合は、認知資源と時間の節約という形で果実をもたらしてくれる。

続きを読む