goo blog サービス終了のお知らせ 

CyberChaos(さいばかおす)

プログラミング言語、トランスパイラ、RPA、ChatGPT、データマイニング、リバースエンジニアリングのための忘備録

【タイトル詐欺に注意www】無料で使えるAI OCR比較20選!OCRフリーソフトも紹介

2024-01-21 23:30:59 | python
※俺がタイトル詐欺をやらかしてるんじゃない!このサイトがタイトル詐欺をやらかしているだけだ!
無料で使えるAI OCR比較20選!OCRフリーソフトも紹介 | デジタル化の窓口

無料で使えるAI OCR比較20選!OCRフリーソフトも紹介 | デジタル化の窓口

この記事では、無料で利用できるOCR(光学文字認識)に焦点を当て、導入のメリット、注意点などを詳しく解説します。無料OCRツールの選び方や活用事例をご紹介します。

デジタル化の窓口

【タイトル詐欺に注意www】無料で使えるAI OCR比較20選!OCRフリーソフトも紹介

大半が有料ソフトの無料期間限定版だったりする。

施工管理の仕事で手書きの黒板で撮影をしなければならず、蔵衛門での写真管理で黒板に書かれた文字を手打ちで入力する羽目になっている。

蔵衛門のタブレットが市販されていて、黒板も手書きせずに撮影できるというのに、某住宅☓☓☓社は、改ざんできるから手書きの黒板じゃないとダメだとバカみたいなことを言ってやがる。

それに応じている現場代理人もバカだが、そういうカスハラモンクレ案件を受注するウチの会社もどうかと思う。

スマホのアプリでソコソコ使えるものはあるようだが、ただのOCRリーダーでは手打ち訂正の面倒くささがずっとついて回る。

だからAI OCR、しかも無料で使いたいと切望している。

一度ChatGPTにコーディングさせてみたいところだ。さて、どうなるだろうか?

画像サイズ一括変更アプリを作ってみたら…

2024-01-13 05:10:28 | python
昨日、蔵衛門を使って工事の写真の画像のサイズを一括で1280x960に変更する必要に迫られ、上司から紹介されたアプリを使ってみたらできなかった。上司も「あれ?おかしいな。」と言っていて他のアプリを探していたが、60個以上のリサイズをする場合、有料になるアプリを使おうとしていたので、自分で作ろうと思い、Pythonで画像サイズ一括変更アプリを作ってみた。

ChatGPTへの質問
『全ての画像の縦横サイズを任意の縦横サイズに一括で変更するプログラムをtkinterライブラリを用いてPythonで書いて。』

import os
from tkinter import Tk, filedialog, Label, Button, Entry # Entryを追加
from PIL import Image, ImageTk

class ImageResizer:
def __init__(self, root):
self.root = root
self.root.title("画像リサイズプログラム")

self.image_path = None
self.target_size = (0, 0)

self.label = Label(root, text="1. 画像を選択してください")
self.label.pack()

self.select_button = Button(root, text="画像を選択", command=self.choose_image)
self.select_button.pack()

self.label_size = Label(root, text="2. 新しいサイズを入力してください (幅 x 高さ):")
self.label_size.pack()

self.width_entry = Entry(root)
self.width_entry.pack()

self.height_entry = Entry(root)
self.height_entry.pack()

self.resize_button = Button(root, text="リサイズ", command=self.resize_images)
self.resize_button.pack()

def choose_image(self):
file_path = filedialog.askopenfilename(title="画像を選択", filetypes=[("Image files", "*.png;*.jpg;*.jpeg;*.gif")])
if file_path:
self.image_path = file_path
self.display_image()

def display_image(self):
image = Image.open(self.image_path)
image.thumbnail((300, 300)) # Resize image for display
photo = ImageTk.PhotoImage(image)

label_image = Label(self.root, image=photo)
label_image.image = photo
label_image.pack()

self.label.config(text="1. 画像を選択しました")

def resize_images(self):
if self.image_path:
try:
new_width = int(self.width_entry.get())
new_height = int(self.height_entry.get())
self.target_size = (new_width, new_height)

original_image = Image.open(self.image_path)
resized_image = original_image.resize(self.target_size, Image.ANTIALIAS)

save_path = self.save_resized_image(resized_image)
self.label.config(text=f"3. 画像をリサイズしました。 保存先: {save_path}")
except ValueError:
self.label.config(text="エラー: 正しい数値を入力してください。")
else:
self.label.config(text="エラー: 画像が選択されていません。")

def save_resized_image(self, image):
save_path = filedialog.asksaveasfilename(defaultextension=".png", filetypes=[("PNG files", "*.png")])
if save_path:
image.save(save_path)
return save_path

if __name__ == "__main__":
root = Tk()
app = ImageResizer(root)
root.mainloop()



画像があるディレクトリを選ぶ際にスマホでは変な状態になり、選択できなかった。
PCではどうなるだろうか?

※PCで試してみたら成功。1280x960に変更できた。ただし、一個ずつしかリサイズできない。

これではファイルを一個ずつ選ぶ羽目になり、一括で変更できないかもしれない。

→※昨日、フォルダごとドラッグ&ドロップしてリサイズできないかどうかソースコードを変更してみたら…

次の記事に掲載予定。

体内深部超音波画像診断AI

2023-10-20 05:47:22 | python
AIを活用した超音波診断装置のノイズ除去技術 新開発
https://www.fujifilm.com/fhc/ja/news/49

体の深い領域でもより正確な検査を支援する高画質超音波画像を実現富士フイルムヘルスケア株式会社(本社:東京都港区、代表取締役社長:山本 章雄)は、超音波診断装置の画質を大幅に向上させるノイズ除去技術を開発しました。本技術は、AI技術*1を活用してエコー信号とノイズを区別し、診断に必要な信号を選択的に抽出します。この新しいノイズ除去技術により、体内深部からの信号が弱く診断が難しかったケースでも高画質な画像を提供できる超音波診断装置を実現し、より正確な超音波検査を支援します。

CTやMRIは何億円もの導入コストがかかり、使いこなすのも大変だ。
それに対して、超音波は破格のコストでしかも使い方は容易だ。

正解率94%の膵臓癌画像診断AI

2023-10-20 05:37:54 | python

「正解率は94%」AIで膵臓がんの画像診断 久留米大など

「正解率は94%」AIで膵臓がんの画像診断 久留米大など

久留米大学(福岡県久留米市)医学部を中心にした研究グループが、全国の医療機関の病理医やベンチャー企業「メドメイン」(福岡市)と共同で、診断が難しいとされる膵(…

産経ニュース

久留米大学が超音波内視鏡を使って採取した412点の膵臓がん(膵腺がん)標本を提供。これらの標本をデジタル化した。このデジタル画像を、全国の18人の病理医に見せ、がん細胞と判定した箇所をマークしてもらった。マークは2~3万カ所に上った。

こうして作成した「教師データ」をAIにディープラーニング(深層学習)させた。学習の成果を検証するため、3人の病理専門医がチェックした120点のデジタル画像を使ってAIをテスト。結果は病理医の診断と一致した「正解」が94%だった。

5年生存率が最も低い癌は膵臓癌だ。早期発見のためには画像診断だけでなく、その他様々なサインを見逃さないことも大事。


バッテリーの劣化による膨張を防ぐスマホアプリ

2023-10-20 02:02:00 | python
SH51Aのバッテリーに寿命が来たので、以下の動作をするスマホアプリをChatGPTに作ってもらったのだが…

#スマホの電池パックの充電率を取得 #任意の充電率以下になったら充電を開始する #任意の充電率以上であれば充電アダプターからの電源を遮断する #スマホ使用中(画面のタップやボタンなどの操作を検知した場合)は充電アダプターからの電源を遮断する 以上の動作をするスマホアプリのPythonプログラムをkivyライブラリーを使って書いて

from kivy.app import App from kivy.uix.boxlayout import BoxLayout from kivy.uix.label import Label from kivy.clock import Clock from kivy.uix.button import Button from kivy.uix.switch import Switch class ChargingApp(App): def build(self): self.layout = BoxLayout(orientation='vertical') # バッテリー充電率を表示するラベル self.battery_label = Label(text="充電率: 0%", font_size='20sp') self.layout.add_widget(self.battery_label) # 充電の設定 self.charge_threshold = 30 # 任意の充電率の閾値(30%と仮定) self.is_charging = False # チャージスイッチ self.charge_switch = Switch(active=self.is_charging) self.charge_switch.bind(active=self.toggle_charge) self.layout.add_widget(self.charge_switch) # スマホ使用中かどうかを判定するフラグ self.is_in_use = False # バッテリー充電率の更新を定期的に行う Clock.schedule_interval(self.update_battery_status, 5) # 5秒ごとに更新 return self.layout def update_battery_status(self, dt): # ここで実際のバッテリー充電率を取得するロジックを追加 battery_percentage = 50 # 仮の値 self.battery_label.text = "充電率: {}%".format(battery_percentage) if self.is_in_use: # スマホ使用中は充電を停止 self.stop_charge() elif battery_percentage <= self.charge_threshold: # バッテリーが指定の閾値以下になったら充電を開始 self.start_charge() elif battery_percentage > self.charge_threshold: # バッテリーが指定の閾値以上で、充電中であれば充電を停止 self.stop_charge() def toggle_charge(self, instance, value): # スイッチの状態に応じて充電を開始または停止 if value: self.start_charge() else: self.stop_charge() def start_charge(self): # 充電を開始するロジックをここに追加 self.is_charging = True self.charge_switch.active = self.is_charging print("充電を開始しました") def stop_charge(self): # 充電を停止するロジックをここに追加 self.is_charging = False self.charge_switch.active = self.is_charging print("充電を停止しました") if __name__ == '__main__': ChargingApp().run()






battery_percentage = 50 # 仮の値
battery_percentage = 90 # 仮の値
に変更してみた。

果たして機能しているのだろうか?

※誰も手動でON-OFFするボタンを付けろとは言っとらんがな、何で要らんことするんだか?

P.S.
どうやら機能していないらしいwww
しかも目茶苦茶リソースを喰っているようだ。

スマホは充電しながら使うとバッテリー(電池パック)の劣化が急加速するようだ。

所謂妊娠という現象が起き、本体のカバーが剥離し、音が出なくなったり、ボタンを押しても反応しなくなったり、いろいろ不具合が出てきて仕舞には使えなくなる。

以前は、電池パックを買ってきて裏フタを開けて簡単に交換できたが、今は内蔵式になって一体化しているようで、いちいち修理に出して分解してもらわないと電池パックの交換すらできない有り様になってしまった。

電池パック長持ちアプリなるものも出回っているようだが、俺の求めている機能があるのだろうか?


通り芯作成プログラムの改造(通り芯の交点から中心をオフセットさせた基礎の表示)

2023-08-16 22:00:26 | python
通り芯作成プログラムをさらに改造したい。
一旦通り芯を作成したファイルを保存し、次にそのファイルを再度開き、通り芯の交点の座標を取得する。次にそれぞれの交点に一対一に対応した長方形の基礎を表示させることにする。
任意の通り芯の交点をXnYm(n,mは通り芯の番号)で表し、交点からx軸方向へa、y軸方向へb長方形の中心をオフセットさせる。基礎の橫の長さをp,縦の長さをqとする。
n,m,a,b,p,qの数値をボックスに入力させ、作成された通り芯ファイルを読み込んで上書き更新して基礎の長方形も加えて表示させることにする。






#通り芯の交点を入力してファイルに保存させるクラス
import tkinter as tk
import pickle
 
class IntersectionEditor:
def __init__(self, root):
self.root = root
self.root.title("Intersection Editor")
 
self.intersections = {}
 
self.canvas = tk.Canvas(self.root, width=400, height=400)
self.canvas.pack()
 
self.save_button = tk.Button(self.root, text="Save Intersections", command=self.save_intersections)
self.save_button.pack()
 
self.load_button = tk.Button(self.root, text="Load Intersections", command=self.load_intersections)
self.load_button.pack()
 
self.add_intersection(100, 100) # Example initial intersection
 
def add_intersection(self, x, y):
self.canvas.create_oval(x-2, y-2, x+2, y+2, fill="red")
intersection_id = f"X{x}Y{y}"
self.intersections[intersection_id] = {"x": x, "y": y}
 
def save_intersections(self):
with open("intersections.pkl", "wb") as file:
pickle.dump(self.intersections, file)
 
def load_intersections(self):
with open("intersections.pkl", "rb") as file:
self.intersections = pickle.load(file)
for intersection_id, data in self.intersections.items():
self.add_intersection(data["x"], data["y"])
 
root = tk.Tk()
app = IntersectionEditor(root)
root.mainloop()
 
#保存された通り芯ファイルを読み込み、各交点に対応する長方形の基礎を表示するクラス
import tkinter as tk
from tkinter import simpledialog
import pickle
 
class FoundationPlotter:
def __init__(self, root):
self.root = root
self.root.title("Foundation Plotter")
 
self.canvas = tk.Canvas(self.root, width=400, height=400)
self.canvas.pack()
 
self.load_button = tk.Button(self.root, text="Load Intersections", command=self.load_intersections)
self.load_button.pack()
 
self.draw_button = tk.Button(self.root, text="Draw Foundations", command=self.draw_foundations)
self.draw_button.pack()
 
self.intersections = {}
self.foundation_params = {}
 
def load_intersections(self):
with open("intersections.pkl", "rb") as file:
self.intersections = pickle.load(file)
 
def draw_foundations(self):
for intersection_id, data in self.intersections.items():
x = data["x"]
y = data["y"]
if intersection_id not in self.foundation_params:
self.ask_foundation_params(intersection_id)
 
params = self.foundation_params[intersection_id]
a, b, p, q = params["a"], params["b"], params["p"], params["q"]
 
x1 = x - a
y1 = y - b
x2 = x1 + p
y2 = y1 + q
 
self.canvas.create_rectangle(x1, y1, x2, y2, outline="blue", width=2)
 
def ask_foundation_params(self, intersection_id):
params = {}
params["a"] = simpledialog.askinteger("Foundation Parameters", f"Enter a for {intersection_id}:")
params["b"] = simpledialog.askinteger("Foundation Parameters", f"Enter b for {intersection_id}:")
params["p"] = simpledialog.askinteger("Foundation Parameters", f"Enter p for {intersection_id}:")
params["q"] = simpledialog.askinteger("Foundation Parameters", f"Enter q for {intersection_id}:")
 
self.foundation_params[intersection_id] = params
 
root = tk.Tk()
app = FoundationPlotter(root)
root.mainloop()
 
中心がオフセットされた基礎らしきものは表示したが、通り芯は表示されなかった。
 
最後にmain(本体)プログラムを示す。
 
以下が、各クラスを統合して読み込み、実行するmainプログラムの本体のコード例です。
import tkinter as tk from tkinter import simpledialog import pickle class IntersectionEditor: # ... (省略) ... class FoundationPlotter: # ... (省略) ... class MainApp: def __init__(self, root): self.root = root self.root.title("Main Application") self.intersection_editor = IntersectionEditor(self.root) self.foundation_plotter = FoundationPlotter(self.root) self.load_editor_button = tk.Button(self.root, text="Open Intersection Editor", command=self.open_editor) self.load_editor_button.pack(pady=10) self.load_plotter_button = tk.Button(self.root, text="Open Foundation Plotter", command=self.open_plotter) self.load_plotter_button.pack(pady=10) def open_editor(self): self.intersection_editor.root.deiconify() # Show the Intersection Editor window def open_plotter(self): self.foundation_plotter.root.deiconify() # Show the Foundation Plotter window root = tk.Tk() app = MainApp(root) root.mainloop()
 

このMainAppクラスは、IntersectionEditorFoundationPlotterの各クラスを統合し、それぞれのウィンドウを開くためのボタンを提供します。MainAppを実行することで、メインアプリケーションが起動し、IntersectionEditorFoundationPlotterのウィンドウを開くことができます。

各クラスのコードは、以前提供したものを利用してください。プログラムの一部は省略されているため、必要に応じて適宜追加・調整を行ってください。

ちなみにspiderでは
こんな風に出力された。
 
 
オフセットされた基礎が1種類しか表示されていない。
(※通り芯6本とそれぞれの交点に対する中心がオフセットされた任意の寸法の基礎の表示を求めたのだが・・・)
まあ、ここまでできれば上等かな?
 

通り芯作成プログラムをフローティングウィンドウ形式に改造してみた

2023-08-16 21:28:31 | python











import tkinter as tk
from tkinter import ttk
from matplotlib.figure import Figure
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import matplotlib.pyplot as plt

class BalloonAndCrosshairsApp:
def __init__(self, root):
self.root = root
self.root.title("Main Window")
self.show_input_button = tk.Button(root, text="Show Input Form", command=self.show_input_form)
self.show_input_button.pack(padx=10, pady=10)
self.input_window = None
self.x_entry = None
self.y_entry = None
self.points = []
def show_input_form(self):
self.input_window = tk.Toplevel(self.root)
self.input_window.title("Coordinate Input")
self.x_label = tk.Label(self.input_window, text="X:")
self.x_label.grid(row=0, column=0, padx=5, pady=5)
self.x_entry = tk.Entry(self.input_window)
self.x_entry.grid(row=0, column=1, padx=5, pady=5)
self.y_label = tk.Label(self.input_window, text="Y:")
self.y_label.grid(row=1, column=0, padx=5, pady=5)
self.y_entry = tk.Entry(self.input_window)
self.y_entry.grid(row=1, column=1, padx=5, pady=5)
self.add_button = tk.Button(self.input_window, text="Add Point", command=self.add_point)
self.add_button.grid(row=2, columnspan=2, padx=5, pady=5)
self.plot_button = tk.Button(self.input_window, text="Plot Points", command=self.plot_points)
self.plot_button.grid(row=3, columnspan=2, padx=5, pady=5)
def add_point(self):
x = float(self.x_entry.get())
y = float(self.y_entry.get())
self.points.append((x, y))
self.x_entry.delete(0, tk.END)
self.y_entry.delete(0, tk.END)
def plot_points(self):
if not self.points:
return
plot_window = tk.Toplevel(self.root)
plot_window.title("Plot")
x_coordinates = set()
y_coordinates = set()

for x, y in self.points:
x_coordinates.add(x)
y_coordinates.add(y)

fig = Figure(figsize=(5, 4))
ax = fig.add_subplot(111)

balloon_counter = 1
for y in y_coordinates:
for x in x_coordinates:
ax.plot(x, y, 'o', label=f'X{balloon_counter}')
balloon_counter += 1

for y in y_coordinates:
ax.axhline(y, color='red', linestyle='--')

for x in x_coordinates:
ax.axvline(x, color='blue', linestyle='--')

ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.legend()
ax.grid(True)

canvas = FigureCanvasTkAgg(fig, master=plot_window)
canvas.get_tk_widget().pack()

root = tk.Tk()
app = BalloonAndCrosshairsApp(root)
root.mainloop()

Pydroidだと表示されたウィンドウをいじれない。

長さ45mm、M12×1.25の六角頭のボルトを自動で作図するPythonプログラム

2023-08-16 09:25:26 | python
長さ45mm、M12×1.25の六角頭のボルトを自動で作図するPythonプログラムを書いて
とChatGPT に頼んだら・・・www





import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d.art3d import Poly3DCollection

def draw_3d_hex_bolt():
bolt_length = 45 # ボルトの長さ (mm)
bolt_diameter = 12 # ボルトの直径 (mm)
thread_pitch = 1.25 # ボルトのピッチ (mm)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# ボルトの六角頭部を描画
bolt_head = np.array([
[0, 0, bolt_length + bolt_diameter],
[bolt_diameter * np.sqrt(3) / 2, bolt_diameter / 2, bolt_length + bolt_diameter],
[0, bolt_diameter, bolt_length + bolt_diameter],
[-bolt_diameter * np.sqrt(3) / 2, bolt_diameter / 2, bolt_length + bolt_diameter]
])
head_poly = [[bolt_head[0], bolt_head[1], bolt_head[2], bolt_head[3]]]
ax.add_collection3d(Poly3DCollection(head_poly, color='black'))
# ボルトのスレッドを描画
thread_radius = bolt_diameter / 2
for i in range(int(bolt_length / thread_pitch)):
y = i * thread_pitch
theta = np.linspace(0, 2 * np.pi, 20)
x = thread_radius * np.cos(theta)
z = y + thread_radius * np.sin(theta)
ax.plot(x, y * np.ones_like(x), z, color='black')
# スレッドの片側の先端に六角頭を描画
thread_tip = np.array([
[0, 0, 0],
[bolt_diameter * np.sqrt(3) / 2, bolt_diameter / 2, 0],
[0, bolt_diameter, 0],
[-bolt_diameter * np.sqrt(3) / 2, bolt_diameter / 2, 0]
])
tip_poly = [[thread_tip[0], thread_tip[1], thread_tip[2], thread_tip[3]]]
ax.add_collection3d(Poly3DCollection(tip_poly, color='black'))
# グラフの設定
ax.set_xlim(-bolt_diameter, bolt_diameter)
ax.set_ylim(0, bolt_length)
ax.set_zlim(0, bolt_length + bolt_diameter)
ax.set_xlabel('Width (mm)')
ax.set_ylabel('Length (mm)')
ax.set_zlabel('Height (mm)')
ax.set_title('3D Hex Bolt Drawing')
plt.show()

draw_3d_hex_bolt()

おい、何回直せと命令しても六角形の頭は描けないし、変な所に変な形の物がついているのは直せないんだな?www


和文英訳AIの作り方を訊いてみた。

2023-08-12 13:57:03 | python

Question1.

Pythonで和文英訳AIプログラムを書いて+TKinterライブラリーを用いてGUI表示できるように書き換えて。

 

Answer1.

import tkinter as tk
from google.cloud import translate_v2 as translate

# Google Cloud Translation APIの認証情報を設定
# ここに自分のAPIキーを入力してください
api_key = 'YOUR_API_KEY'
client = translate.Client(api_key)

def translate_japanese_to_english():
    japanese_text = input_text.get("1.0", "end-1c")
    result = client.translate(japanese_text, target_language='en')
    english_translation = result['translatedText']
    output_text.delete("1.0", "end")
    output_text.insert("1.0", english_translation)

# GUIウィンドウを作成
window = tk.Tk()
window.title("和文英訳AI")

# 入力テキストボックス
input_label = tk.Label(window, text="和文を入力してください:")
input_label.pack()
input_text = tk.Text(window, height=5, width=40)
input_text.pack()

# 翻訳ボタン
translate_button = tk.Button(window, text="翻訳", command=translate_japanese_to_english)
translate_button.pack()

# 翻訳結果テキストボックス
output_label = tk.Label(window, text="英訳結果:")
output_label.pack()
output_text = tk.Text(window, height=5, width=40)
output_text.pack()

window.mainloop()

Question2.

Google Cloud Translation APIのAPIキーはどぅやって取得するの?

 

Answer2.

Google Cloud Translation APIのAPIキーを取得するには、Google Cloud Platform(GCP)のアカウントを作成し、プロジェクトを作成してAPIを有効化し、APIキーを生成する手順を以下に示します。注意深く指示に従ってください。

1. **Google Cloud Platformのアカウント作成**:
   - https://cloud.google.com/ にアクセスして新しいアカウントを作成するか、既存のアカウントでログインします。

2. **新しいプロジェクトの作成**:
   - ダッシュボードにアクセスし、新しいプロジェクトを作成します。

3. **Translation APIの有効化**:
   - プロジェクトのダッシュボードで、「APIとサービス」 > 「APIライブラリ」に移動します。
   - "Cloud Translation API"を検索し、有効にします。

4. **認証情報の作成**:
   - 「APIとサービス」 > 「認証情報」に移動します。
   - 「認証情報を作成」を選択し、「APIキー」を選択します。

5. **APIキーの設定**:
   - 生成されたAPIキーが表示されます。必要に応じて名前を設定できます。
   - キーが生成されたら、コピーして安全な場所に保管してください。

6. **プロジェクトへのAPIキーの関連付け**:
   - プロジェクトを選択し、APIキーを関連付けることで、そのプロジェクト内でAPIキーが使用されるようになります。

これでAPIキーが取得できました。APIキーをコードに直接書き込む場合、コードを公開する際にセキュリティ上のリスクがあるため注意が必要です。セキュリティを考慮して、適切な方法でAPIキーを管理してください。

金がかかるらしいからやらんw

runfile('C:/Users/User/untitled0.py', wdir='C:/Users/User')
Traceback (most recent call last):

  File "C:\Users\User\untitled0.py", line 9, in <module>
    from google.cloud import translate_v2 as translate

ModuleNotFoundError: No module named 'google.cloud'

google.cloudとtranslateライブラリをインストールしてもこの有様。

APIキーを取得してもダメっぽいw


Pydroid3でテトリスを作ってみた。

2023-05-21 08:39:53 | python
 
Python でのテトリスの作り方(サンプルスクリプト付き)

Python でのテトリスの作り方(サンプルスクリプト付き)

Python 勉強がてらに Tkinter を使ってテトリスを作成してみました! 今回はこのテトリスの Python スクリプトの紹介と、このスクリプトの解説をしていきたいと思います。 ...

だえうホームページ

上記のサイトを参考に、ソースコードをそのままコピペしてみたら・・・
import tkinter as tk
import random
 
# 定数
BLOCK_SIZE = 25 # ブロックの縦横サイズpx
FIELD_WIDTH = 10 # フィールドの幅
FIELD_HEIGHT = 20 # フィールドの高さ
 
MOVE_LEFT = 0 # 左にブロックを移動することを示す定数
MOVE_RIGHT = 1 # 右にブロックを移動することを示す定数
MOVE_DOWN = 2 # 下にブロックを移動することを示す定数
 
# ブロックを構成する正方形のクラス
class TetrisSquare():
def __init__(self, x=0, y=0, color="gray"):
'1つの正方形を作成'
self.x = x
self.y = y
self.color = color
 
def set_cord(self, x, y):
'正方形の座標を設定'
self.x = x
self.y = y
 
def get_cord(self):
'正方形の座標を取得'
return int(self.x), int(self.y)
 
def set_color(self, color):
'正方形の色を設定'
self.color = color
 
def get_color(self):
'正方形の色を取得'
return self.color
 
def get_moved_cord(self, direction):
'移動後の正方形の座標を取得'
 
# 移動前の正方形の座標を取得
x, y = self.get_cord()
 
# 移動方向を考慮して移動後の座標を計算
if direction == MOVE_LEFT:
return x - 1, y
elif direction == MOVE_RIGHT:
return x + 1, y
elif direction == MOVE_DOWN:
return x, y + 1
else:
return x, y
 
# テトリス画面を描画するキャンバスクラス
class TetrisCanvas(tk.Canvas):
def __init__(self, master, field):
'テトリスを描画するキャンバスを作成'
 
canvas_width = field.get_width() * BLOCK_SIZE
canvas_height = field.get_height() * BLOCK_SIZE
 
# tk.Canvasクラスのinit
super().__init__(master, width=canvas_width, height=canvas_height, bg="white")
 
# キャンバスを画面上に設置
self.place(x=25, y=25)
 
# 10x20個の正方形を描画することでテトリス画面を作成
for y in range(field.get_height()):
for x in range(field.get_width()):
square = field.get_square(x, y)
x1 = x * BLOCK_SIZE
x2 = (x + 1) * BLOCK_SIZE
y1 = y * BLOCK_SIZE
y2 = (y + 1) * BLOCK_SIZE
self.create_rectangle(
x1, y1, x2, y2,
outline="white", width=1,
fill=square.get_color()
)
 
# 一つ前に描画したフィールドを設定
self.before_field = field
 
def update(self, field, block):
'テトリス画面をアップデート'
 
# 描画用のフィールド(フィールド+ブロック)を作成
new_field = TetrisField()
for y in range(field.get_height()):
for x in range(field.get_width()):
square = field.get_square(x, y)
color = square.get_color()
 
new_square = new_field.get_square(x, y)
new_square.set_color(color)
 
# フィールドにブロックの正方形情報を合成
if block is not None:
block_squares = block.get_squares()
for block_square in block_squares:
# ブロックの正方形の座標と色を取得
x, y = block_square.get_cord()
color = block_square.get_color()
 
# 取得した座標のフィールド上の正方形の色を更新
new_field_square = new_field.get_square(x, y)
new_field_square.set_color(color)
 
# 描画用のフィールドを用いてキャンバスに描画
for y in range(field.get_height()):
for x in range(field.get_width()):
 
# (x,y)座標のフィールドの色を取得
new_square = new_field.get_square(x, y)
new_color = new_square.get_color()
 
# (x,y)座標が前回描画時から変化ない場合は描画しない
before_square = self.before_field.get_square(x, y)
before_color = before_square.get_color()
if(new_color == before_color):
continue
 
x1 = x * BLOCK_SIZE
x2 = (x + 1) * BLOCK_SIZE
y1 = y * BLOCK_SIZE
y2 = (y + 1) * BLOCK_SIZE
# フィールドの各位置の色で長方形描画
self.create_rectangle(
x1, y1, x2, y2,
outline="white", width=1, fill=new_color
)
 
# 前回描画したフィールドの情報を更新
self.before_field = new_field
 
# 積まれたブロックの情報を管理するフィールドクラス
class TetrisField():
def __init__(self):
self.width = FIELD_WIDTH
self.height = FIELD_HEIGHT
 
# フィールドを初期化
self.squares = []
for y in range(self.height):
for x in range(self.width):
# フィールドを正方形インスタンスのリストとして管理
self.squares.append(TetrisSquare(x, y, "gray"))
 
def get_width(self):
'フィールドの正方形の数(横方向)を取得'
 
return self.width
 
def get_height(self):
'フィールドの正方形の数(縦方向)を取得'
 
return self.height
 
def get_squares(self):
'フィールドを構成する正方形のリストを取得'
 
return self.squares
 
def get_square(self, x, y):
'指定した座標の正方形を取得'
 
return self.squares[y * self.width + x]
 
def judge_game_over(self, block):
'ゲームオーバーかどうかを判断'
 
# フィールド上で既に埋まっている座標の集合作成
no_empty_cord = set(square.get_cord() for square
in self.get_squares() if square.get_color() != "gray")
 
# ブロックがある座標の集合作成
block_cord = set(square.get_cord() for square
in block.get_squares())
 
# ブロックの座標の集合と
# フィールドの既に埋まっている座標の集合の積集合を作成
collision_set = no_empty_cord & block_cord
 
# 積集合が空であればゲームオーバーではない
if len(collision_set) == 0:
ret = False
else:
ret = True
 
return ret
 
def judge_can_move(self, block, direction):
'指定した方向にブロックを移動できるかを判断'
 
# フィールド上で既に埋まっている座標の集合作成
no_empty_cord = set(square.get_cord() for square
in self.get_squares() if square.get_color() != "gray")
 
# 移動後のブロックがある座標の集合作成
move_block_cord = set(square.get_moved_cord(direction) for square
in block.get_squares())
 
# フィールドからはみ出すかどうかを判断
for x, y in move_block_cord:
 
# はみ出す場合は移動できない
if x < 0 or x >= self.width or \
y < 0 or y >= self.height:
return False
 
# 移動後のブロックの座標の集合と
# フィールドの既に埋まっている座標の集合の積集合を作成
collision_set = no_empty_cord & move_block_cord
 
# 積集合が空なら移動可能
if len(collision_set) == 0:
ret = True
else:
ret = False
 
return ret
 
def fix_block(self, block):
'ブロックを固定してフィールドに追加'
 
for square in block.get_squares():
# ブロックに含まれる正方形の座標と色を取得
x, y = square.get_cord()
color = square.get_color()
 
# その座標と色をフィールドに反映
field_square = self.get_square(x, y)
field_square.set_color(color)
 
def delete_line(self):
'行の削除を行う'
 
# 全行に対して削除可能かどうかを調べていく
for y in range(self.height):
for x in range(self.width):
# 行内に1つでも空があると消せない
square = self.get_square(x, y)
if(square.get_color() == "gray"):
# 次の行へ
break
else:
# break されなかった場合はその行は空きがない
# この行を削除し、この行の上側にある行を1行下に移動
for down_y in range(y, 0, -1):
for x in range(self.width):
src_square = self.get_square(x, down_y - 1)
dst_square = self.get_square(x, down_y)
dst_square.set_color(src_square.get_color())
# 一番上の行は必ず全て空きになる
for x in range(self.width):
square = self.get_square(x, 0)
square.set_color("gray")
 
# テトリスのブロックのクラス
class TetrisBlock():
def __init__(self):
'テトリスのブロックを作成'
 
# ブロックを構成する正方形のリスト
self.squares = []
 
# ブロックの形をランダムに決定
block_type = random.randint(1, 4)
 
# ブロックの形に応じて4つの正方形の座標と色を決定
if block_type == 1:
color = "red"
cords = [
[FIELD_WIDTH / 2, 0],
[FIELD_WIDTH / 2, 1],
[FIELD_WIDTH / 2, 2],
[FIELD_WIDTH / 2, 3],
]
elif block_type == 2:
color = "blue"
cords = [
[FIELD_WIDTH / 2, 0],
[FIELD_WIDTH / 2, 1],
[FIELD_WIDTH / 2 - 1, 0],
[FIELD_WIDTH / 2 - 1, 1],
]
elif block_type == 3:
color = "green"
cords = [
[FIELD_WIDTH / 2 - 1, 0],
[FIELD_WIDTH / 2, 0],
[FIELD_WIDTH / 2, 1],
[FIELD_WIDTH / 2, 2],
]
elif block_type == 4:
color = "orange"
cords = [
[FIELD_WIDTH / 2, 0],
[FIELD_WIDTH / 2 - 1, 0],
[FIELD_WIDTH / 2 - 1, 1],
[FIELD_WIDTH / 2 - 1, 2],
]
 
# 決定した色と座標の正方形を作成してリストに追加
for cord in cords:
self.squares.append(TetrisSquare(cord[0], cord[1], color))
 
def get_squares(self):
'ブロックを構成する正方形を取得'
 
# return [square for square in self.squares]
return self.squares
 
def move(self, direction):
'ブロックを移動'
 
# ブロックを構成する正方形を移動
for square in self.squares:
x, y = square.get_moved_cord(direction)
square.set_cord(x, y)
 
# テトリスゲームを制御するクラス
class TetrisGame():
 
def __init__(self, master):
'テトリスのインスタンス作成'
 
# ブロック管理リストを初期化
self.field = TetrisField()
 
# 落下ブロックをセット
self.block = None
 
# テトリス画面をセット
self.canvas = TetrisCanvas(master, self.field)
 
# テトリス画面アップデート
self.canvas.update(self.field, self.block)
 
def start(self, func):
'テトリスを開始'
 
# 終了時に呼び出す関数をセット
self.end_func = func
 
# ブロック管理リストを初期化
self.field = TetrisField()
 
# 落下ブロックを新規追加
self.new_block()
 
def new_block(self):
'ブロックを新規追加'
 
# 落下中のブロックインスタンスを作成
self.block = TetrisBlock()
 
if self.field.judge_game_over(self.block):
self.end_func()
print("GAMEOVER")
 
# テトリス画面をアップデート
self.canvas.update(self.field, self.block)
 
def move_block(self, direction):
'ブロックを移動'
 
# 移動できる場合だけ移動する
if self.field.judge_can_move(self.block, direction):
 
# ブロックを移動
self.block.move(direction)
 
# 画面をアップデート
self.canvas.update(self.field, self.block)
 
else:
# ブロックが下方向に移動できなかった場合
if direction == MOVE_DOWN:
# ブロックを固定する
self.field.fix_block(self.block)
self.field.delete_line()
self.new_block()
 
# イベントを受け付けてそのイベントに応じてテトリスを制御するクラス
class EventHandller():
def __init__(self, master, game):
self.master = master
 
# 制御するゲーム
self.game = game
 
# イベントを定期的に発行するタイマー
self.timer = None
 
# ゲームスタートボタンを設置
button = tk.Button(master, text='START', command=self.start_event)
button.place(x=25 + BLOCK_SIZE * FIELD_WIDTH + 25, y=30)
 
def start_event(self):
'ゲームスタートボタンを押された時の処理'
 
# テトリス開始
self.game.start(self.end_event)
self.running = True
 
# タイマーセット
self.timer_start()
 
# キー操作入力受付開始
self.master.bind("", self.left_key_event)
self.master.bind("", self.right_key_event)
self.master.bind("", self.down_key_event)
 
def end_event(self):
'ゲーム終了時の処理'
self.running = False
 
# イベント受付を停止
self.timer_end()
self.master.unbind("")
self.master.unbind("")
self.master.unbind("")
 
def timer_end(self):
'タイマーを終了'
 
if self.timer is not None:
self.master.after_cancel(self.timer)
self.timer = None
 
def timer_start(self):
'タイマーを開始'
 
if self.timer is not None:
# タイマーを一旦キャンセル
self.master.after_cancel(self.timer)
 
# テトリス実行中の場合のみタイマー開始
if self.running:
# タイマーを開始
self.timer = self.master.after(1000, self.timer_event)
 
def left_key_event(self, event):
'左キー入力受付時の処理'
 
# ブロックを左に動かす
self.game.move_block(MOVE_LEFT)
 
def right_key_event(self, event):
'右キー入力受付時の処理'
 
# ブロックを右に動かす
self.game.move_block(MOVE_RIGHT)
 
def down_key_event(self, event):
'下キー入力受付時の処理'
 
# ブロックを下に動かす
self.game.move_block(MOVE_DOWN)
 
# 落下タイマーを再スタート
self.timer_start()
 
def timer_event(self):
'タイマー満期になった時の処理'
 
# 下キー入力受付時と同じ処理を実行
self.down_key_event(None)
 
 
class Application(tk.Tk):
def __init__(self):
super().__init__()
 
# アプリウィンドウの設定
self.geometry("400x600")
self.title("テトリス")
 
# テトリス生成
game = TetrisGame(self)
 
# イベントハンドラー生成
EventHandller(self, game)
 
 
def main():
'main関数'
 
# GUIアプリ生成
app = Application()
app.mainloop()
 
 
if __name__ == "__main__":
main()








ガーン( ̄▽ ̄;)😱
 
十字キーや回転ボタンがないやんけwww
6段積み重なって即死www
 
しかもブロックが3種類しかないらしいwww
 
ちなみにPCでやっても回転ボタンが無いからご覧の通り、死亡www
 

Autolisp専用のMicro Github Copilot擬きを作ったwww

2023-05-20 02:34:49 | python
Github Copilotのように# コメント文 を入力するだけで目的のAutolispソースコードを生成するAIチャットボットをPythonで作りたい。ソースコードの例を書いて。

ChatGPT
Autolispのソースコードを生成するAIチャットボットの例を以下に示します。この例では、コメント文から簡単
Autolispのソースコードを生成するAIチャットボットの例を以下にまとめます。


def generate_autolisp_code_from_comment(comment):
# 図形タイプの抽出
shape = ""
if "円" in comment:
shape = "円"
elif "四角形" in comment:
shape = "四角形"
else:
return "サポートされていない図形です。"

# ソースコードの生成
if shape == "円":
code = """
(setq pt (getpoint " 中心点を指定してください:"))
(setq radius (getdist " 半径を指定してください:"))

(command "circle" pt radius)
"""
elif shape == "四角形":
code = """
(setq pt1 (getpoint " 第1角の点を指定してください:"))
(setq pt2 (getpoint " 第2角の点を指定してください:"))

(command "rectang" pt1 pt2)
"""
else:
return "サポートされていない図形です。"

return code

# ユーザーのコメントを受け取る
user_comment = input("コメント文を入力してください: ")

# ソースコードの生成と出力
generated_code = generate_autolisp_code_from_comment(user_comment)
print("生成されたAutolispコード: ", generated_code)
この例では、generate_autolisp_code_from_comment関数がコメント文からAutolispの図形描画コードを生成します。関数はコメント文から図形タイプ(円または四角形)を抽出し、それに基づいて新しいソースコードを生成します。生成されたソースコードは文字列として返されます。

メインの処理では、ユーザーにコメント文を入力してもらい、それをgenerate_autolisp_code_from_comment関数に渡して生成されたAutolispコードを取得します。最後に、生成されたコードを出力します。

例えば、ユーザーが「円を描画」というコメントを入力した場合、次のようなAutolispコードが生成されます。

lisp
Copy code
(setq pt (getpoint " 中心点を指定してください:"))
(setq radius (getdist " 半径を指定してください:"))

(command "circle" pt radius)
Autolispでは、getpoint関数を使用してユーザーに点を指定させ、getdist関数を使用してユーザーに半径を指定させています。その後、command関数を使用して円を描画しています。



ChatGPTよ、でかしたぞwww
モノホンのGithub CopilotはガチのAIでトレーニングしていくのだが、こちとら手動でチマチマと機能を追加していく有り様だwww

Pythonで簡易CADチャットボットを作った

2023-05-19 17:00:40 | python

VBA版をPython版にしてみた。

ChatGPTにVBA版のソースコードをPythonに変換してくれと頼んだら一発で成功!

Bardの登場がChatGPTに大きな影響を与えているのが実感できる。

使い物にならなかったのが全く別物といってよい程の改善が行われたようだ。

import tkinter as tk
from tkinter import messagebox

def create_line():
    start_x = int(tk.simpledialog.askstring("直線", "始点のX座標を入力してください。"))
    start_y = int(tk.simpledialog.askstring("直線", "始点のY座標を入力してください。"))
    end_x = int(tk.simpledialog.askstring("直線", "終点のX座標を入力してください。"))
    end_y = int(tk.simpledialog.askstring("直線", "終点のY座標を入力してください。"))

    canvas.create_line(start_x, start_y, end_x, end_y, width=2)

def create_circle():
    center_x = int(tk.simpledialog.askstring("円", "中心のX座標を入力してください。"))
    center_y = int(tk.simpledialog.askstring("円", "中心のY座標を入力してください。"))
    radius = int(tk.simpledialog.askstring("円", "半径を入力してください。"))

    x1 = center_x - radius
    y1 = center_y - radius
    x2 = center_x + radius
    y2 = center_y + radius

    canvas.create_oval(x1, y1, x2, y2, width=2, outline="red")

def process_user_input():
    user_input = tk.simpledialog.askstring("CAD", "何をしましょうか?")
    has_line = "直線" in user_input
    has_circle = "円" in user_input

    if has_line:
        create_line()
    elif has_circle:
        create_circle()
    else:
        tk.messagebox.showerror("エラー", "そのような操作はできません。")

root = tk.Tk()
root.title("CAD")

canvas = tk.Canvas(root, width=400, height=400)
canvas.pack()

button = tk.Button(root, text="操作を入力", command=process_user_input)
button.pack()

root.mainloop()

もちろんこれは簡易プロトタイプである。

こんなもん現場では全然実用にならない。もっと複雑な操作が要求される。

次の段階はAutocadにこの機能を組み込むことが目標である。

それが成功したら、どんどんいろんな操作・機能を追加していこうと思っている。

Autolispのソースコード内でPythonを呼び出して組み込み、自動で描画できれば開発が早まるだろう。

もしそれができなければ、Autolispで全て書かなければならない。

はたしてAutolisp言語にはチャットボットを作るための機能や関数はあるのだろうか?

Lisp言語の本では人工知能について言及があったからAutolispでも可能なのではないかと考えているが・・・


任意のソースコードをQRコード化するPythonアプリ

2023-05-19 14:46:45 | python

import tkinter as tk
import qrcode

def generate_qrcode():
python_code = code_entry.get("1.0", tk.END)

qr = qrcode.QRCode(
version=1,
error_correction=qrcode.constants.ERROR_CORRECT_H,
box_size=10,
border=4,
)
qr.add_data(python_code)
qr.make(fit=True)

filename = filename_entry.get()
image = qr.make_image(fill_color="black", back_color="white")
image.save(filename)

# TKinterウィンドウの作成
window = tk.Tk()
window.title("QR Code Generator")

# テキスト入力フォーム
code_label = tk.Label(window, text="Python Code:")
code_label.pack()
code_entry = tk.Text(window, height=10, width=50)
code_entry.pack()

# ファイル名入力フォーム
filename_label = tk.Label(window, text="Filename:")
filename_label.pack()
filename_entry = tk.Entry(window)
filename_entry.pack()

# 保存ボタン
generate_button = tk.Button(window, text="Generate and Save QR Code", command=generate_qrcode)
generate_button.pack()

# TKinterウィンドウの実行
window.mainloop()

↑このQRコードを読み取るとwww




任意のソースコードをQRコード化するPythonプログラム

2023-05-18 03:11:51 | python
任意のPythonコードをQRコード化するPythonプログラムを書いて

import qrcode

def generate_qrcode(data, filename):
qr = qrcode.QRCode(
version=1,
error_correction=qrcode.constants.ERROR_CORRECT_H,
box_size=10,
border=4,
)
qr.add_data(data)
qr.make(fit=True)

image = qr.make_image(fill_color="black", back_color="white")
image.save(filename)

# QRコード化したいPythonコード
python_code = '''
import math

def calculate_area(radius):
return math.pi * radius ** 2

r = float(input("Enter the radius: "))
area = calculate_area(r)
print("The area of the circle is:", area)
'''

# QRコードを生成して保存
generate_qrcode(python_code, 'python_code_qr.png')




PDFコンバーターアプリをPythonで作ってみた

2023-05-07 10:37:08 | python
PDF Converter App

任意のファイルを読み込んでPDF化して保存するアプリをTKinterライブラリーを用いたPythonコードで書いて

以下は、Tkinterライブラリを使用して、ユーザーが選択したファイルを読み込み、PDF形式で保存するPythonアプリケーションの例です。

python
Copy code
import tkinter as tk
from tkinter import filedialog
import os
from fpdf import FPDF


class PDFConverter:
def __init__(self, master):
self.master = master
master.title("PDF Converter")

# ラベル
self.label = tk.Label(master, text="PDFに変換するファイルを選択してください。")
self.label.pack()

# ファイル選択ボタン
self.select_button = tk.Button(master, text="ファイルを選択", command=self.select_file)
self.select_button.pack()

# 変換ボタン
self.convert_button = tk.Button(master, text="変換", state=tk.DISABLED, command=self.convert_file)
self.convert_button.pack()

# メッセージラベル
self.message = tk.Label(master, text="")
self.message.pack()

def select_file(self):
# ファイル選択ダイアログを表示
file_path = filedialog.askopenfilename()

if file_path:
# 選択されたファイルがPDFでなければ変換ボタンを有効化
if os.path.splitext(file_path)[1] != ".pdf":
self.convert_button.config(state=tk.NORMAL)
else:
self.message.config(text="選択されたファイルは既にPDF形式です。")
else:
self.message.config(text="ファイルが選択されていません。")

# 選択されたファイルのパスを保存
self.file_path = file_path

def convert_file(self):
# PDFファイルの作成
pdf = FPDF()
pdf.add_page()
pdf.set_font("Arial", size=12)
with open(self.file_path, "rb") as f:
text = f.read()
pdf.cell(200, 10, txt=text.decode("utf-8"), ln=1)
pdf_path = os.path.splitext(self.file_path)[0] + ".pdf"
pdf.output(pdf_path)

self.message.config(text=f"変換が完了しました。PDFファイルを{pdf_path}に保存しました。")


root = tk.Tk()
app = PDFConverter(root)
root.mainloop()
このアプリは、ユーザーがファイルを選択した後、ファイルがPDF形式でない場合は変換ボタンを有効化します。変換ボタンをクリックすると、選択されたファイルがPDFに変換され、元のファイルと同じ場所に保存されます。






…失敗したようだ。
Pydroidでやるとダメなのかどうかは知らんが。
ファイルを選択して読み込ませるところで何にも起きなくなり、Openボタンを押しても変換ボタンを押しても反応しなかった。

PCで実行しても同じ結果となった。
ちなみにPythonのIDLEではFPDFライブラリーのインストールに失敗したので、Anacondaのプロンプトでpip install --upgrade FPDFとコマンドを入力してようやくインストールできた。スパイダーで実行しても動かなかった。

BingAlではちょっと違うソースコードを提示されたが、やはり動かなかった。