プログラミング初心者の教師が、ChatGPTとPythonを使ってアプリを開発するまで(中編):How a novice programming teacher developed an app using ChatGPT and Python (Part 2)
1.はじめに
この記事は、以下の実践の中編になります。前編では2回で書きますといましたが、長くなってしまったので3回に分けます。後編では、AI時代のプログラミング教育の展望と課題について書きたいと思います。
生成AIは、さまざまな分野で活用されています。例えば、
エンターテイメント:映画やゲームなどのコンテンツ制作
教育:教材や問題集などの学習資料を作成
広告:キャッチコピーやバナーなどの広告素材を作成
人間の創造性や表現力に近づく可能性がありますが、同時に倫理的な問題も抱えています。
著作権:生成AIが作ったコンテンツには誰が権利を持つのか、どうやって保護するのかなどが問題になります。
信頼性:生成AIが作ったコンテンツは本物か偽物か、どうやって判断するのかなどが問題になります。ハルシネーション(Hallucination:幻覚)
ジェイルブレイク:会話型AIや生成AIなどの人工知能に設定されたルールや制限を回避するプロンプトを入力することで、無効化して強制的に不適切な内容を出力させることが問題になります。
前編では、コードを自分で書くことなく、全てChatGPTにお願いしてアプリ開発を行なったわけですが、人間が何もしなくて良いかというと、そうでもありません。
2. 今回作成したコードの安全性とライセンスについて
一通り開発が終わった後、せっかく作ったアプリやコードをインターネット上で配布したいと思いまいた。というわけで、作成したコードを貼り付けてChatGPTに聞いてみると…、以下のような返答が。
ChatGPT:このコードは基本的に安全に見えますが、いくつかの点に注意が必要です。
外部ライブラリの自動インストール: コードはmoviepyがインストールされていない場合に自動でインストールを試みます。これ自体は悪意のある動作ではありませんが、ユーザーに対してこの動作を明示的に通知し、同意を得る方が良いでしょう。
ファイルの上書き: コードは既存のMP4ファイルを上書きするオプションを提供しています。この動作はユーザーにとって予期しない結果をもたらす可能性があるため、十分に説明と確認を行うようにしてください。
エラーハンドリング: いくつかの場所でエラーハンドリングが不足している可能性があります。例えば、無効なGIFファイルが選択された場合や、ディスクの空き容量が不足している場合など、予期しない状況に対処するためのエラーハンドリングを追加するとよいでしょう。
セキュリティの懸念: subprocess.callを使用している部分は、悪意のある第三者によって悪用される可能性があります。このコードでは特に問題になる箇所はありませんが、将来的にコードを拡張する際には注意が必要です。
ライセンスと著作権: コードを公開する際には、使用しているライブラリのライセンスを確認し、適切なライセンスをコードに付与することを検討してください。
以上の点に注意して、コードの配布を進めることができるでしょう。
ふむふむ🧐
外部ライブラリ(プログラミングで使う、便利セットみたいなもの)をインストールするようなコードは、勝手に走るようにしない方がいいのか。あとは、ファイルの上書きやセキュリティ、エラーハンドリング(プログラムの処理中に処理が妨げられる事象が発生した際、その処理をエラーとして対処する処理のこと)にも気をつけなければならないと…。ん?
無知は怖いですね、初めて知りました。プログラミングのコードにも、使用しているライブラリのライセンスを確認したり、自分でライセンスを付与したりしなければならないと。危ない、そのまま公開するところでした。というわけで続けて聞いてみます。
ライセンスと著作権: コードを公開する際には、使用しているライブラリのライセンスを確認し、適切なライセンスをコードに付与することを検討してください。 とはなんですか?具体的に教えて下さい。
ChatGPT:ライセンスと著作権に関連する問題は、コードを公開する際に非常に重要な側面です。以下、具体的な説明をします。
1. 使用しているライブラリのライセンスの確認
コード内で使用している外部ライブラリ(この場合はmoviepyなど)は、それぞれ特定のライセンスの下で配布されています。ライセンスは、そのライブラリをどのように使用してよいか、どのように再配布してよいかなどのルールを定めています。
例えば、あるライブラリがGPLライセンスの下で配布されている場合、そのライブラリを使用したコードもGPLライセンスに従わなければならない場合があります。逆に、MITライセンスなどのより寛容なライセンスであれば、商用利用や再配布にあまり制限がありません。
2. 自分のコードに適切なライセンスを付与
自分が書いたコードにもライセンスを付与することが一般的です。ライセンスを明示することで、他人がそのコードをどう使ってよいのか、どう再配布してよいのかを明確にします。
以下は、よく使用されるライセンスのいくつかです:
MITライセンス: 非常に寛容なライセンスで、コードの再利用、改変、再配布が自由に行えます。
GPLライセンス: より厳格なライセンスで、コードを改変して再配布する場合、その改変版もGPLライセンスに従わなければなりません。
Apacheライセンス: 商用利用や特許に関連する問題に対して柔軟なライセンスです。
3. ライセンスの適用方法
ライセンスを適用するには、コードのリポジトリや配布パッケージにライセンス文書を含め、ソースコード内にもライセンスに関するコメントを記述するのが一般的です。
例(MITライセンスの場合):
pythonCopy code# Copyright (c) [年] [著作権者の名前]
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# [ライセンスの全文]
まとめ
コードを公開する際には、使用しているライブラリのライセンスを確認し、自分のコードにも適切なライセンスを選ぶことが重要です。適切なライセンスを選ぶことで、コードの利用者に対して、どう使ってよいかの明確なガイドラインを提供することができます。
3.ChatGPTからの指摘を受けて
作成したコードで使用しているライブラリについて調べる必要が出てきました。というわけで、ここはBing Chatが得意そうです。早速聞いてみました。
確認が必要そうなのは、「moviepy」というライブラリですね。一応MITライセンスだそうなので、基本的には配布は自由に行えそうです。
4.今回作成したコード(ChatGPTの指摘を受けた改良版)
GIF動画をMP4にするアプリに需要があるかどうかは別として、アプリ開発でChatGPTが作成したコードを載せておきます。このコードをVScodeなどのエディタに貼り付けて実行すると、GIF動画をMP4に変換してくれるプログラムが動きます。あくまで実験的に作成したものなので、使用は自己責任でお願いします。また改良前のコードを使用していますが、今回作ったアプリケーションもGitHubにて公開しているので、そのリンクも貼り付けておきます。GitHubのページ右下の「Releases」をクリックすると良いみたいです。
# Copyright (c) [2023年] [Atari Ryuma]
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
import os
import subprocess
import tkinter as tk
from tkinter import filedialog, simpledialog, messagebox
def install_moviepy():
subprocess.call(['pip', 'install', 'moviepy'])
# moviepyがインストールされていない場合、インストールする
try:
from moviepy.editor import VideoFileClip, concatenate_videoclips
except ImportError:
print("moviepyが見つかりません。インストールを開始します。")
install_moviepy()
from moviepy.editor import VideoFileClip, concatenate_videoclips
def gif_to_mp4(gif_path, output_path, repeat_count):
clip = VideoFileClip(gif_path)
# サイズを2の倍数に調整
new_width = clip.size[0] - (clip.size[0] % 2)
new_height = clip.size[1] - (clip.size[1] % 2)
clip = clip.crop(x_center=clip.size[0]/2, y_center=clip.size[1]/2, width=new_width, height=new_height)
clips = [clip] * repeat_count
final_clip = concatenate_videoclips(clips, method="compose")
final_clip.write_videofile(output_path, codec="libx264")
def ask_input_files(root):
file_paths = filedialog.askopenfilenames(title="変換するGIFファイルを選択してください", filetypes=[("GIF files", "*.gif")])
return file_paths
def ask_repeat_count(root):
repeat_count = simpledialog.askinteger("繰り返し回数の入力", "GIF動画を何回繰り返しますか?", initialvalue=5)
return repeat_count if repeat_count else 5
def file_action_dialog(filename):
result = messagebox.askyesnocancel("保存方法の選択", f"{filename} はすでに存在します。上書きしますか?")
if result:
return "overwrite"
elif result is None:
return "cancel"
else:
return "rename"
def get_output_path(file_path, action):
base_path, ext = os.path.splitext(file_path)
if action == "overwrite":
return base_path + '.mp4'
elif action == "rename":
counter = 1
while os.path.exists(f"{base_path} ({counter}).mp4"):
counter += 1
return f"{base_path} ({counter}).mp4"
else:
return None
def main():
root = tk.Tk()
root.withdraw()
file_paths = ask_input_files(root)
if not file_paths:
print("キャンセルされました。")
return
repeat_count = ask_repeat_count(root)
apply_to_all = False
saved_action = None
for file_path in file_paths:
mp4_path = file_path.replace('.gif', '.mp4')
action = "overwrite"
if os.path.exists(mp4_path) and not apply_to_all:
action = file_action_dialog(os.path.basename(file_path))
if action == "cancel":
continue
if messagebox.askyesno("すべてに適用", "この選択をすべてのファイルに適用しますか?"):
apply_to_all = True
saved_action = action
elif apply_to_all:
action = saved_action
output_path = get_output_path(file_path, action)
if output_path:
print(f"{os.path.basename(file_path)} を MP4 に変換中...")
gif_to_mp4(file_path, output_path, repeat_count)
print(f"{os.path.basename(file_path)} の変換が完了しました。")
print("すべての変換が完了しました。")
if __name__ == "__main__":
main()
5. 中編のまとめと感想
試しにChatGPTに聞いてみたら、意外な学びがありました。コーディングができることと、アプリケーション開発に関連する”文化”を知ることは別なようです。まだまだ私の知らない文化がたくさんありそうです。AIを使うことによって、自分の能力が上がっているように感じてしまいますが、そういった文化を知らない状態では「自分の力になった」とは言い難いかもしれません。今回のライセンスのことについても、そういった文化を知らない学校の先生が書いたものです。間違いも含まれているかもしれません。勉強して何らかの形で子供たちに還元できればと思います。