乙Py先生のプログラミング教室
初学者のためのプログラミング学習サイト

Python

プログラミング未経験の方のための
プログラミング学習講座を作成しました

その名も
「1時間で学べるPythonプログラミング」


講義動画はこちら




この講座は初学者の方が
短時間でPython言語を学ぶことのできる
プログラミング学習用の講座です

プログラミングが分からないない方は
Python言語を通じて
プログラミングの基礎を学習できます

講座は動画に加えてGoogle Colabを用いて
手元でコードを動かすことのできます
コードがどう動くのかを確認をしながら
進めていってください

資料はここ:
Google Colabの資料


00:00 1.はじめに
02:13 2.導入方法
02:55 3.GoogleColaboratoryの操作方法
06:19 4.Pythonの計算の基礎
27:27 5.Pythonの制御文
42:14 6.Pythonのクラス
49:11 7.Pythonのその他構文
64:30 8.まとめ

なおPythonチートシートを作成しています。

コーディングに迷った際に役に立ち

WEB検索する時間を無くして

作業時間を効率化できます。

note
Pythonチートシート


 

今回は今話題の
AI搭載エディター
Cursorについてです。


解説動画はこちら



Cursorとは

CursorはChatGPTの機能を搭載した
エディター(IDE)です。

VSCodeを模して作られているので
VSCodeと同等の機能を有しています。

それに加えてChatGPTの持つ
コード編集やデバッグ
コード生成の機能が加わったエディターになっています。


Cursorの料金

ダウンロード自体は無料です。

chat-gpt4の機能制限が存在し
無料版では月に50回までになっているようです。

有償版は
PRO:20ドル
BUSINESS:月40ドル

PRO版でもchat-gpt4の低速は制限なし
高速版の制限があるため
この辺りを気にする方は
普通にchat-gptの契約をした方が
良いのかもしれません。


Cursorのインストール

インストールはCursorのサイトから
「download」をクリックして
ファイルを実行するだけです。



Cursorの使い方

全体像はこんな感じです。
cursor1

VSCodeの画面とほぼ同じで、機能なども
ほぼ同等です。
画面の右側に標準でチャットフォームが付きます。

日本語化のやり方もVSCodeと同じようです。

主な使い方は
コード上で「cmd + k」で
生成フォームを呼び出せます。

aihen

ここに、日本語でプロンプトを入力してあげると
コード生成を行う事ができます。


画面の右側には普通にチャットのフォームが有るので
そこからchat-gptにプロンプトを投げる事ができます。
aichat

チャットフォームからの質問では
Cursorの操作方法などの一般的な質問も対応しているので
操作方法が分からない場合はチャットで聞くのが良いでしょう。


VSCode同様にターミナルが有り
コード実行でエラーが出た際は
「Debug with AI」をクリックすると
デバッグしてくれます。

aidebug

ただし、この回答部分はまだ英語のみで
日本語対応はされていないかもしれません。

動画ではコード生成などを試していますので
そちらを参考にしてみて下さい。


本日はChatGPTの機能を搭載して
AIエディター Cursorについてでした。

興味がある方は是非ダウンロードしてみて下さい。
それでは

今回はGoogleColabの
うれしいアップデート情報です

解説動画はこちら


 
Google Colabのアップデート


Google Colabに
うれしいアップデートが発表されました
それが「シークレット機能」の追加です

Google ColabでSecretsが
管理できるようになりました

シークレット(Secrets)というのは
API キーやパスワードなど機密情報の断片のことで
外部に公開するとまずいことになる
環境変数などで指定する文字列のことです


今までは外部にコード共有する際などは
これらの文字列を気にする必要が有ったのですが
これからはColabの機能で管理できるので
コード側を書き換える必要が無くなります

ということで
早速使い方を見ていきましょう



Secrets機能の使い方

画面左側の「鍵」マークから
「Secrets」管理画面に移行できます
aaa1




画面上で新しい情報として
追加していく事ができます

スクリーンショット 2023-11-04 16.08.39


「目」のマークをクリックすると
値が見れる様になります



コード側でこの値を使用する際は
「google.colab」の「userdata」を用いて
読み込みしたい環境変数の文字列を指定します

from google.colab import userdata

api_key = userdata.get('API_KEY')

openaiのAPIキーなど
コード上で指定していたものは
シークレット機能側に入力しておけば
コード側はそれを読み取るだけで良いので
安全かつ楽になりました!!!


ますます便利になる「Google Colab」
生成AI系のコード試しが捗りますね


今回はここまでです
それでは

今回はPythonの使いやすさと
C言語のパフォーマンスを併せ持つ
新プログラミング言語「Mojo」が
Colabで使える様になったので試してみました

解説動画はこちら


 
Mojoについて

MojoはPythonのスーパーセットとなる
新しい言語で、Pythonに比べて
パフォーマンスとメモリの安全性が向上しています

コンパイル言語になるので
少しだけやることは増えますが
Pythonの構文はサポートされていて
慣れればPython言語と同じように
コードを書き進める事が
出来るんじゃないかと思います



MojoのSDKライセンス取得

Mojoを始めるにはライセンスが必要です

と言っても、メアドを登録するくらいです

「Get Started」から
Mojoのサイトからメールアドレス等で
登録を行います

Mojo



Mojoのインストール

ライセンス登録すると
インストールコマンドが記載された
ページに飛ばされます

WindowsやMacなど、環境ごとの
コマンドが記載されていますので
Google Colabで動かす場合は
「Linux」を選びましょう

次のコマンドがライブラリ取得のコマンドです
!curl https://get.modular.com | \
  MODULAR_AUTH= <自分のMODULAR_ID> \
  sh -

実行の際には各個人事にIDが変わるので
自身のコマンドを手に入れて実行して下さい


ライブラリ取得できたら
次はインストールコマンドです
!modular install mojo

普通に実行すれば
問題なくインストール出来るかと思います

インストールが終わったかどうかは
確認コマンドで確認できます
!export MODULAR_HOME="/root/.modular" && \
export PATH="/root/.modular/pkg/packages.modular.com_mojo/bin:$PATH" && \
mojo --version
mojo 0.3.1 (a3eed7c8)


MojoとPythonの速度比較


さて、それではPythonとMojoで
同じコードでの速度を比較検証してみましょう

3重ループでカウントするだけの
すごくシンプルな関数を実行して
時間を測るというコードになっています

・Pythonのコード
# サンプルコード
import time

def test_def(n):
    count = 0.0
    for i in range(n):
        for j in range(n):
            for k in range(n):
                count += 1.0
    return count


# Pythonでの実行時間
start_time = time.time()
n=500
print(test_def(n))
elapsed_time = time.time() - start_time
print(f"{elapsed_time}s")
125000000.0
7.398502826690674s


1億2千5百万回計算して
7-8秒ほど掛かる様です


・Mojoのコード

Mojoの場合は一度ファイルとして
作成しないといけません

ソースコードをそのままファイル化します

Mojoファイルの作成コマンド
%%writefile main.mojo

from time import now

def sample_def(n):
    var count: Float64 = 0.0
    for i in range(n):
        for j in range(n):
            for k in range(n):
                count += 1.0
    return count

def main():
    let start_time = now()

    let n: Int64 = 500
    count = sample_def(n)
    print(count)

    let end_time = now()
    let execution_time = Float64(end_time - start_time) / 1000_000_000
    print(execution_time)

これを実行するとGoogle Colabのファイル置き場に
main.mojoが作成されるハズです

このファイルをコマンドで動かします
mojoファイルを実行するコマンドはこれです
# Mojoの実行
!export MODULAR_HOME="/root/.modular" && \
export PATH="/root/.modular/pkg/packages.modular.com_mojo/bin:$PATH" && \
mojo main.mojo
125000000.0
0.18964049799999999


先ほどのPython実行は7-8秒ほどになるので
単純計算で40倍くらいは速くなっているようです

単純だけども、時間の掛かる計算をやらなければ
いけない場合に、一部をmojoに書き換えておけば
その分格段に速くなりそうですね

複雑なものだとコードの差異が大きいので
大変そうですが、簡単なアルゴリズムの
書き換え程度なら、実用出来かなと思いました

今後は機械学習系の実装も
徐々にMojoに置き換わって行くのかなと
推測します

速くなる分には
何のデメリットも無いですもんね
今後の動きを期待したいです

今回はMojoをGoogle Colabで試してみました
それでは

たまには真面目に
数学の問題を解いてみましょう

2023年度の東大の数学の問題です


解説動画はこちら



今回は数学の問題です

手で解いたら解法が分からず
すごく時間が掛かってしまう問題も
プログラミングの力を使えば
近似解を簡単に求める事ができます

という訳で
東大の数学の問題を解いてみましょう





2023年度東大数学文系第3問

問題:
黒玉3個、赤玉4個、白玉5個が入っている袋から
玉を1個ずつ取り出し、取り出した玉を順に1列に12個並べる
ただし、袋から個々の玉が取り出される確率は等しいものとする

(1) どの赤玉も隣り合わない確率 p を求めよ
(2) どの赤玉も隣り合わないとき
どの黒玉も隣り合わない条件付確率 q を求めよ


12個の順列の問題ですね
プログラミングの力を使えば
こういうのもシミュレーション出来ます


考え方

まずは石を用意しましょう
次にその石の並びで隣同士なのかどうかを
チェックする方法を考えてみましょう

次のようなやり方で
石のデータと判定方法を
考える事ができます
# 12個の玉を作って試してみる
import numpy as np

data = ["b"]*3 + ["r"]*4 + ["w"]*5
np.random.shuffle(data)

# リストを結合して文字列にする
st = "".join(data)

# 赤玉が隣り合わないかどうか
res1 = "rr" not in st
# 上記のに加えて黒玉が隣り合わないかどうか
res2 = res1 & ("bb" not in st)

print(st)
print(res1)
print(res2)
rwrwwbbrbwwr
True
False

データは文字列やリスト型で定義しておくと
後で計算しやすいです

これを元にして
計算を行ってみましょう



順列を生成してチェックする方法



今回は12個の中から12個を取り出してつくる
順列になるので、その総個数は
import math

math.factorial(12)
479001600


順列は itertools ライブラリの
permutations で作る事ができます

チェック機構では判定式を返し
Trueを1、Falseを0として
条件にあった個数を返していきます

最終的に条件にあった個数と
元の順列の個数を組み合わせれば
確率が求められます
import itertools

def num_check(data):
    st = "".join(data)
    res1 = "rr" not in st
    res2 = res1 & ("bb" not in st)
    return res1, res2

data = ["b"]*3 + ["r"]*4 + ["w"]*5

ans1, ans2 = 0, 0
for t in itertools.permutations(data):
    t1,t2 = num_check(t)
    ans1+=t1
    ans2+=t2

# 総当たりの個数(順列の個数)
permutations_num = math.factorial(12)

print("1の答え : {0}".format(ans1/permutations_num))
print("2の答え : {0}".format(ans2/ans1))
1の答え : 0.2545454545454545
2の答え : 0.6130952380952381




シミュレーションしてみる


総当たりの方法が思いつかなくても
シミュレーションで近似解を求める事ができます

先ほどは順列を作って繰り返しを行っていましたが
単純に回数を指定して、ランダムに並び替えた後に
チェックを行えば、順列の際の近似が求められます

チェック関数は先ほどのを用いるとして
次のような計算でシミュレーションできます

import numpy as np

N = 100000000

ans2_1, ans2_2 = 0, 0
for i in range(N):
    data = ["b"]*3 + ["r"]*4 + ["w"]*5
    np.random.shuffle(data)
    t1,t2 = num_check(data)
    ans2_1+=t1
    ans2_2+=t2

print("1の答え : {0}".format(ans2_1/N))
print("2の答え : {0}".format(ans2_2/ans2_1))
1の答え : 0.25452006
2の答え : 0.613167347202417


小数点第3位くらいまでは
同じ数字になりますね

近似解だと点数は貰えないかもしれませんが
点数関係ない、仕事上の計算であれば
こういったシミュレーションが行えるのが
プログラミングの役に立つポイントです

確率が分からなくても
それっぽい確率を算出する事ができるので
いろいろ便利ですねえ

色々なシミュレーションを行えるので
仕事がめちゃくちゃ捗ります

プログラミング出来ない方は
是非、この機会に覚えてみて下さい


今回は数学の問題を解く
プログラミングでのシミュレーションでした
それでは
 

このページのトップヘ