Pythonは、楽しいなー

新しいことを始めるのは、いつだって楽しい。小さなチャレンジを設定して、少しずつ前進すると、ワクワクする

toiee Lab 亀田
毎日が学びと発見
14 min readJul 11, 2024

--

Photo by Arnold Francisca on Unsplash

最近、Pythonを学び始めました。

いやはや、めっちゃ楽しいです。今は、AIも使えるので、新しいことを学ぶのには、とても良いです。ただし、注意点もあります。

そのことについて、あれこれ、徒然なるままに書いてみようと思います。

私のプログラミング歴

私は、中学生の頃、コンピューターに興味を持ちました。1985年ごろです。まだ、Windows98も出ていません。MS-DOSという黒い画面に、`dir` という文字を打ってファイル一覧を表示する時代でした。

家にあったBasicプログラミングの本にあるコードを、意味もわからないまま、ひたすら打ち込んで(何時間かかかりました)完成させたら、モグラ叩きゲーム(シンプルな線と、文字だけのものです。モグラの絵なんて出てきません)が動き出し、感動しました。

中身はわからないけど、ワクワクしました。

それからは、アメリカンフットボールにハマって、勉強なんてせず、毎日、馬鹿みたいに走り回っていました。学校まで30分自転車に乗ってトレーニング。筋トレ、練習、帰宅してからジョギングなど。頭よりも、筋肉を使っていたのは自覚しています。

そんな筋肉生活を終え、情報学部のある大学に入りました。1、2回生は、落第ギリギリで切り抜け、研究室に入って、「人工知能」に出会いました。

最近話題で、キラキラした「大規模言語モデル(LLM、ChatGPTなど)」ではなく、遺伝的アルゴリズム、ファジー理論、ニューラルネットワーク(階層型)、カオス理論、人工生命シミュレーションなどです。

これらにハマって、プログラミングを学び、土木工学の世界での課題を解決するアルゴリズムを作るために、たくさんのプログラムを作りました。

その時に触ったのは、C、C++、Visual Basic。そして、最終的に一番使ったのが Java でした。Javaでは、オブジェクト指向にワクワクして、無駄にデザインパターンを覚え、再利用性の高い研究用のライブラリを作ったりして楽しんでいました。

他にも、Tcl/Tk などのマニアックなものも触りました。

その後、博士課程に進み、無事、博士号を取得しましたが、大学を辞め、ソフトウェアの会社を起業しました。

起業後は、主に PHP言語を使う日々。その後、WordPressを触ることもあり、PHPをあれこれ触るようになりました。

高級言語への憧れ

確か私が大学生の頃は、C言語は「高級言語」だった気がします(いつの話だ?)。ところが、プログラミング言語が発達する中で、Cなんて「プリミティブ(原始的)」に思えるようになりました。

Cの文法を参考にした、C++、Java、PHP は、20年前のプログラミングの感覚で扱えます。これは、慣れ親しんだものです。

一方で、Ruby を使った時の衝撃が今でも忘れられません。

PHPなどなら、何行も書くものを「英語で、指示を書くような感覚(メソッドチェーンなど)」で、さらっと一行で書けてしまう。しかも、何をやっているかは、慣れればよくわかる。タイプミスが入る余地もない。

楽しい!と思った記憶があります。

でも、Rubyを頻繁に使う予定はなかったので、ちょっとした遊び、調査で終わりました。

しかし、Ruby みたいに、エレガント(私からは、そう見えます)に書くのは、憧れるなーと思っていました。プログラマーでもないのですが、素人ながらに憧れていました。

もちろん、最近は、PHPも「エレガントっぽく」書けるのですが、ルールが統一されていない感じがあって、混乱します。

学ぶきっかけを掴めずにいたが、ついに時が来た

人様に提供するプログラムは作りませんが、自分の作業を楽にするためにプログラムを組むことがあります。例えば、知り合いの企業が、展示販売をすることになりました。この企業は、Shopifyで商品を販売していたのですが、展示会場で注文してもらうために、QRコードを発行したいとのこと。

QRコードを手動で作るなんて、馬鹿らしいですよね。しかも、150個ぐらいありました。そこで、ShopifyのAPIを叩いて、QRコード画像を生成するプログラムを作りました。

この時、急いでいたし、急なことだったので、「Rubyを学ぶチャンス」にできませんでした。よく知っているPHP言語を使いました。composerというコマンドを使って、あれやこれやしました。

こんな感じで、使う用事ができては、毎回「PHP言語」で乗り切っていました。

しかし、転機が訪れました。それは、ChatGPT、Claude などの生成AIです。これらのおかげで、

Pythonを使うぞ!

と決心がつきました。

Pythonを使う理由

実は、作りたいものが「いつも行う面倒な作業のほぼ全自動化」するスクリプトです。具体的には、以下のとおりです。

  1. 講義を撮影し、20分程度に分割
  2. スクリプトを実行( ← Pythonで作った)
  3. しばらく待つ
  4. 成果物が、どさっと得られる

Pythonによって得るものは、以下のとおりです。すごい数ですよね。

  • 動画に対応する音声ファイル
  • 音声ファイルを1つにしたオーディオブック(チャプター入り)
  • 音声ファイルの文字起こし(動画の字幕に設定するので、srt方式)*
  • 動画の要約(動画の下に貼り付ける予定)*
  • 全文文字起こし(適度に見出し、改行を入れる)*
  • アクションリスト(なんとなくでOK)*
  • ランディングページ(雛形を参考に、叩き台でOK)*
  • フォロアップメール(5通ほど)*

上記の中で、* がついたものは、ChatGPTなどの生成AIにさせる仕事です。この手の作業については、Pythonの実例が豊富です。ライブラリも揃っています。GoogleのAIを使うにも、Pythonの例がたくさんあります。

ということで、「よし、Pythonを学ぼう」と決意しました。

Python は、今までにない(僕の中では)書き方があり、それが面白い

例えば、PHP言語では、ファイル読み込みは、以下のようになります。

<?php

$file = fopen("example.txt", "r");
if ($file) {
while (($line = fgets($file)) !== false) {
echo $line;
}
fclose($file);
}

まあ、こんなものです。fopenしたから、fcloseを忘れずにするというのは基本です。ところが、Pythonなら、こんな感じでした。

with open("example.txt", "r") as file:
for line in file:
print(line)

慣れたら、見やすそーと感じました。他にも、ラムダ関数(無名関数)がかっこいいなーと持ったり。{}がたくさんあると、やぼったいと感じるぐらい、簡潔です。

ライブラリが使いやすすぎる

PHPは、標準でたくさんのライブラリが組み込まれていますが、これだけでは、足りません。無駄に、色々コードを書きたくないので、ライブラリを積極的に使いたいところですが、いかんせん、めんどくさい。

それが、Pythonなら、`pip` で簡単インストール。

OpenAIや、動画編集系のライブラリもバッチリ揃っていて、サクッとインストールできます。PDFや、Keynoteや、Excelなどのためのものもたくさん。

AIがすごい進化している

極め付けは、AIです。すごく進化しているので、

  • Cloude.ai を開く
  • プロジェクト作成
  • プロジェクトに、特定 API ドキュメントを登録する

すると、APIドキュメントを解釈して、コードを書いてくれます。これには、腰を抜かしました(嘘です、できるらしいとは聞いていたので)。

なんて、便利な!!と思いました。

また、わからないこと、曖昧な理解は、サンプルをたくさん生成してもらって、実行しながら、「メンタルモデル」を作って、学べるので、ほんとうに良い時代になりました。

でも、平気で「ミス」しますので注意が必要です

例えば、SpeechFlow というサービス(文字起こし)のAPIドキュメントを読み込ませて、コードを生成したら、以下のようになりました。

【プロンプト】
SpeechFlow に、対してリクエストをするサンプルコードを書いてください。
import requests

# API キーの設定
key_id = "your_api_key_id"
key_secret = "your_api_secret"

# ステップ1: 文字起こしタスクの作成
create_url = "https://api.speechflow.io/asr/file/v1/create"
headers = {
"Content-Type": "multipart/form-data",
"keyId": key_id,
"keySecret": key_secret
}
payload = {
"lang": "ja", # 音声の言語コードを指定 (例: 日本語の場合 "ja")
"file": open("path/to/your/audio_file.wav", "rb") # 音声ファイルのパスを指定
}
response = requests.post(create_url, headers=headers, files=payload)
task_id = response.json()["taskId"]

# ステップ2: 文字起こし結果の取得
query_url = "https://api.speechflow.io/asr/file/v1/query"
headers = {
"keyId": key_id,
"keySecret": key_secret
}
params = {
"taskId": task_id,
"resultType": 1 # 文字起こし結果のフォーマットを指定 (1: JSON形式)
}
while True:
response = requests.get(query_url, headers=headers, params=params)
result = response.json()
if result["code"] == 11000: # 文字起こし完了
print(result["result"])
break
elif result["code"] == 11001: # 文字起こし処理中
continue
else: # エラー処理
print(f"Error: {result['msg']}")
break

素晴らしい!の一言なんですが、最後の while がいただけません。文字起こしは、いわゆるバッチ処理になっているので

  1. リクエストする
  2. しばらく待つ
  3. 結果が出ていたら取得

となります。2, 3は、ループ(while)で実現します。このループが、ひたすら問い合わせるようなコードになっています。これでは、DDoS攻撃です。適度なインターバルを開けて問い合わせるべきですね。

このように、あっさりとミスをしてくれます。

ですので、「全く知識がなくても、コードが書ける」は、誇大宣伝だと思います。ちゃんと、何がどう動いているか?をイメージできる程度は、プログラムを理解しておく必要があると思います。

とはいえ、それさえわかれば、書き直すのも、AIにしてもらえます。

このコードでは、whileループが何回も実行されてしまいますよね?
大量のリクエストを送ってしまうのは、問題になりませんか?

わざと、嫌味な言い方をしてみました(笑)

すると、丁寧な返事が返ってきました。謙虚だわ〜。

ご指摘ありがとうございます。確かに、現在のコードでは、文字起こしの処理が完了するまで
無限ループでリクエストを送信し続けるため、大量のリクエストを送信してしまう可能性があります。
この問題を解決するために、リクエストを送信する間隔を設けることをお勧めします。
time.sleep() 関数を使用して、一定の時間待機してからリクエストを送信するようにコードを修正しましょう。

修正後のコードは以下のようになります。

import time

# API キーの設定
key_id = "your_api_key_id"
key_secret = "your_api_secret"

# ステップ1: 文字起こしタスクの作成
create_url = "https://api.speechflow.io/asr/file/v1/create"
headers = {
"Content-Type": "multipart/form-data",
"keyId": key_id,
"keySecret": key_secret
}
payload = {
"lang": "ja", # 音声の言語コードを指定 (例: 日本語の場合 "ja")
"file": open("path/to/your/audio_file.wav", "rb") # 音声ファイルのパスを指定
}
response = requests.post(create_url, headers=headers, files=payload)
task_id = response.json()["taskId"]

# ステップ2: 文字起こし結果の取得
query_url = "https://api.speechflow.io/asr/file/v1/query"
headers = {
"keyId": key_id,
"keySecret": key_secret
}
params = {
"taskId": task_id,
"resultType": 1 # 文字起こし結果のフォーマットを指定 (1: JSON形式)
}
while True:
response = requests.get(query_url, headers=headers, params=params)
result = response.json()
if result["code"] == 11000: # 文字起こし完了
print(result["result"])
break
elif result["code"] == 11001: # 文字起こし処理中
time.sleep(5) # 5秒待機してからリクエストを送信
continue
else: # エラー処理
print(f"Error: {result['msg']}")
break

修正したコードでは、time.sleep(5) を追加しました。これにより、文字起こしの処理が完了していない場合、
5秒待機してからリクエストを送信するようになります。

待機時間は、文字起こしを行う音声ファイルの長さや、APIの利用制限などを考慮して適切に設定してください。
大量のリクエストを送信することは、APIの利用制限に抵触する可能性があるだけでなく、
サーバーに負荷をかけることにもつながります。適切な待機時間を設けることで、
これらの問題を回避することができます。

まとめ

プログラミングに興味がある、自動化するのは楽しい、同じような仕事をなん度もしたくないという事務職や、ソロプレーヤーは、Pythonを学ぶ価値はあると思います。

Google Colabo ではなく、ローカル環境で動かせば、自分のパソコンにあるファイルを編集して、仕事を楽にするスクリプトを作ることができます。

是非、チャレンジしてみてください。

そのうち「どんな言語でも関係ない、プログラミングの基本」を学べる講座を作りたいなと思っています。

追伸:

毎日の小さな学び、発見をMediumに、徒然なるままに書くことにしよう。誰が見るでもなく、単に書く。

--

--

toiee Lab 亀田
毎日が学びと発見

toiee Lab CEO。ティール組織運営中。情報学の博士号(人工知能研究)取得後、ソフトウェア会社を起業後、人間本来の学習について研究し、toiee Lab設立。人類の学習能力のアップグレードする(に貢献)という夢を生きてます。