fc2ブログ

金木犀を剪定する

 自宅の庭の金木犀の発育が旺盛で年々巨大化しています。昨年、剪定をしていなかったせいか、形もいびつになりました。金木犀を自宅に植えたのは、今の家を建てた時(2003年)なので、20年の歴史があります。植えた時は私の身長よりも低い、70cmぐらいでしたが、年々大きくなりました。8年前に大胆な剪定をして骨組みだけになった時期もありましたが、その後すくすくと成長しました。その生命力はあやかりたいですね。

 枝葉が半端ない程広がっていたので、高枝切り鋏で剪定するのも日が暮れるので、枝をのこぎりでバッサリ切断し、残りを仕上げました。枝を大胆に切ってしまったのもあり、またもや「いびつな形」になりました(さらにひどくなっている?)。ただ、春になるとまた成長が始まりますので、形の修正は可能でしょう。

 写真の左はBefore、右はAfterです。かなりスッキリしたと思います。kinmokusei_sentei1_231103.pngkinmokusei_sentei2_231103.png 重労働だったので、すでに筋肉痛が始まっています。今日は早く休もうと思います。

ChatGPT4を使う(5)

 前回の続きです。前回お話しした通り、$20の有償のChatGPT4が開通しました。ChatGPT4_initial_231029.png
 まず、設定を確認しておきます。
 ロケール(アルファ)を「ja-JP」に変更すると、デフォルトの英語表記から日本語表記に変わりました。ChatGPT4_setting1_231029.png ベータ機能を確認すると、「プラグイン」と「高度なデータ分析」ができるようですね。どんなことができるかは、次回以降、味見をしようと思います。ChatGPT4_setting2_231029.png データ制御を確認すると、チャット履歴の保存と、入力の文言がモデルの学習に使われる旨が書かれてあります。個人が自宅で使う分は、学習されても問題ない内容しか話さないので、ONにしておきました。ChatGPT4_setting3_231029.png
 さて、今回は流行に乗るわけではありませんが、DALL-E 3を使ってみました。DALL-E 3は2023年9月21日にOpenAI社が公開したばかりの最新の画像生成AIで、テキストプロンプトからその内容を反映した画像を生成するDALL-Eシリーズの最新版です。

 ChatGPTのWebページの「GPT-4」をクリックして、「DALL・E 3」を選択しました。DALL-E3_setting_231029.png まず初めに「居眠りをしている豆柴犬」です。以前のブログで「豆柴」をAI側が理解できていなかったので「豆柴犬」としました。今回はバッチリですね。Qualityも高い。DALL-E 3の実力なのでしょうか??mame_shiba_231029.png
 次に「自律神経が落ち着く景色」を出してもらいました。今年は今もそうですが、公私共にいろんなことがあり、自律神経のバランスが非常に良くないです。ゆっくり休めていない感じでしょうか・・?。ChatGPTに労わってもらいましょう。landscape_231029.pngこれは「なかなかいい感じ」ですね。絵心のない私が言うのも変ですが、AIが書いた感じは避けられませんが、どこに出しても問題ないようなQualityです。

 この風景画を用いて、遊んでみようと思います。まずは、ルノアール風にアレンジしてもらいました。少しぼやけた感じ(語彙力がなくうまく表現できません・・)が出たように思いました。Renoir_231029.png次はゴッホ風です。これはタッチが素人にも分かりやすいですね。Gogh_231029.png最後に個人的に興味がある、東山魁夷風にしてもらいました。すごくいい感じですね。HigashiyamaKaii_1_231029.pngGPT4がどのタッチが好きかを聞いてきたので「東山魁夷だ」と答えると、サービスの画像を出力してくれました。これも味わいがあって良いです。HigashiyamaKaii_2_231029.png
 今回はDALL-E 3で楽しませてもらいました。次回は、ChatGPT4のプラグイン機能を使ってみようと思います。

ChatGPT4を使う(4)

 今年の4月のブログでChatGPT4を有償で利用した内容のお話をしました。当時、画像とテキストの両方の入力を受け入れる「マルチモーダルモデル」が利用できるという触れ込みがあったので・・。ただし、機能実装がまだだったので、1か月で有償サービスを止めました。その後、BingやGoogle Bardに画像入力が導入されたのでそちらを利用していました。

 4月に初めてChatGPT4を試して半年が経ち、もう一度使ってみたいなと思い立ち、まず、①OpenAIのAPIか、②先日開通させたAzure OpenAIのAPIを利用しようと考えました。毎月$20払い続けるよりも、利用した分だけ請求される方が納得できますので。平日の日中は仕事で利用できず、土日が利用のメインなので、月3,000円(150円/ドル:直近円安進む・・)は正直な所、割高に感じます。

 まず、①のOpenAIのAPIについてですが、情報によると、GPT-4のAPIアクセスについて、以下の2点が記載されていました。ともに当てはまらずで断念しました。
 1. 2023年7月6日、1ドル以上の支払いを成功させたすべてのAPI ユーザーにGPT-4 API (8k) へのアクセスを許可しました。間もなくすべての開発者にアクセスを開放し、その後はコンピューティングの可用性に応じてレート制限の引き上げを開始する予定です。現在 GPT-4-32K API へのアクセスは許可されていませんが、後日利用可能になる予定です。
 2. 2023年8月18日以降に作成された API アカウントの場合、0.50 ドル相当以上のプリペイドクレジットを購入すると、すぐに GPT-4 にアクセスできるようになります。

 1.において、月1ドル以上利用すれば開放されるのかもしれませんが、試していないのでよく分かりません。また、「間もなくすべての開発者にアクセスを開放」と書かれていますが、一向に気配なしですね・・。2.については、8/18以前にAPIアカウントを作成していたので「NG」でした。中途半端な立場でがっかり。

 ②のAzure OpenAIのAPIですが、これもスムーズに行きませんでした。利用希望者が多く制限されている感ありです。そもそもGPT4を利用する際にはWait Listに申請が必要でしたが、直近は不要になっているはずで、GPT4_1_231029.pngJapan East(日本東部)にもモデルがあるとのことで、確認してみたのですが、GPT4_2_231029.pnggpt-4、gpt-4-32kはありませんでした。注意事項に書かれていた「入手可能性は限られています」に引っかかっているのでしょうね・・。Azure_East_Japan231029.png
 ネットを彷徨っていると、「GPT-4モデルの作成に利用できるカナダ東部、スウェーデン中部、スイス北部などの別の地域を使用することをお勧めします。」との情報を得ましたので、カナダ東部とスイス北部の2拠点で確認しました。結果は「GPT-4の環境をデプロイできましたが、実際動いているのはGPT4ではない。」でした。原因はよく分かりません。GPT_chat_231029.pngまだ、GPT4のAPI登録関係が流動的なのでしょうね。

 結局、最終的にはあきらめて、$20を出費することにしました。半年ぶりの課金です・・。楽に、Free Planから切り替え完了。ChatGPTPlusに変身!です。GPT4_Web_1_231029.pngエンジンも確かにGPT4ですね。これは本物ですね(ハルシネーション(嘘)がなければ・・)。GPT4_Web_2_231029.png有償利用期間中、じっくり使い込んで行こうと思います。

Webページの自動保存・送信システムを作る(2)

 前回の続きです。今回はRaspberry Piの中で実施している処理(Pythonプログラム)の詳細をお話しします。

Pythonプログラムのキーとなる部分は以下の2点です。
 1. Webページをpdfファイルにする技術
 2. メールを送受信する技術

1.については、pdfkitライブラリを用いました。このライブラリを利用する上で、同時にwkhtmltopdfライブラリもRaspberry Piにインストールしました。
pip3 install pdfkit
sudo apt-get install wkhtmltopdf
2.については、当初Gmailを使う方法を検討していましたが、最終的にoutlook(hotmail)を使うことにしました。以前はGoogleアカウント設定で「安全性の低いアプリ」として設定することでGmailのメールサーバーを外部アプリから利用することができましたが、2022/5/30にこの方法が廃止されたためです。安全性の低いアプリ_231022最近、ネット情報でGmailでも2段階認証を有効にしたら、アプリパスワードを使って、外部アプリからも利用できることを知りました。

以下、作成したPythonプログラムです。まとまりがないプログラムですが、エラーなく動作しています。
# ssmail.py
# Mail sender of the pdf file converted from the web page
import os
import sys
import pdfkit
import email, imaplib
import base64
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
from pathlib import Path
import logging

# Mail registration information
username= os.environ['USERNAME'] # Outlook Mail
password= os.environ['PASSWORD'] # Outlook Mail
to_email= os.environ['TO_EMAIL']
cc_email= os.environ['CC_EMAIL']

# Log file setting
logging.basicConfig(
filename="MailSenderLog.txt",
level=logging.INFO,
format="%(asctime)s:%(levelname)s:%(message)s",
)

# Mail receive
# IMAP4 protocol setting and login
mail= imaplib.IMAP4_SSL("outlook.office365.com")
res = mail.login(username, password)
print(res)
logging.info(res)

# Target folder dxds set
resp_code, mail_count = mail.select(mailbox="dxds", readonly=False)
mail_count_int = int(mail_count[0])
print('Mail: '+ str(mail_count_int))
logging.info('Mail: '+ str(mail_count_int ))

if mail_count_int == 0: # No target mail
mail.logout()
sys.exit()

# Mail check
resp_code, mail_ids = mail.search(None, "ALL")
logging.info("Mail IDs : {}\n".format(mail_ids[0].decode().split()))

mail_id = '1'
logging.info("================== Start of Mail [{}] ====================".format(mail_id))
resp_code, mail_data = mail.fetch(mail_id, '(RFC822)') ## Fetch mail data.
message = email.message_from_bytes(mail_data[0][1]) ## Construct Message from mail data
logging.info("From : {}".format(message.get("From")))
logging.info("To : {}".format(message.get("To")))
logging.info("Bcc : {}".format(message.get("Bcc")))
logging.info("Date : {}".format(message.get("Date")))
logging.info("Subject : {}".format(message.get("Subject")))
logging.info("Body : ")
for part in message.walk():
if part.get_content_type() == "text/plain":
body_lines = part.as_string().split("\n")
logging.info("\n".join(body_lines[:12])) ### Print first 12 lines of message
logging.info("\n")
data_b64_dec = base64.b64decode(''.join(body_lines[3:]))
data_dec = data_b64_dec.decode('utf-8')
logging.info(data_dec.splitlines()[0]) # Target WebPage URL
logging.info("================== End of Mail [{}] ====================\n".format(mail_id))


# WebPage to PDF file
url = data_dec.splitlines()[0]
pdf_file = '/home/pi/prog/output.pdf'
try:
pdfkit.from_url(url, pdf_file)
logging.info(f'PDF file "{pdf_file}" is created.')
except Exception as e:
logging.info(f'Error occurred.: {str(e)}')

# Delete Message
mail.store(mail_id, '+FLAGS', r'\Deleted')
mail.expunge()
# IMAP4 close
mail.logout()

# mail sender
mail_title = 'DX paper'
message = '''
DX paper will be sent.
'''

# Create mail with MIME multipart
msg = MIMEMultipart()
msg['Subject'] = mail_title
msg['To'] = to_email
msg['From'] = username
msg['cc'] = cc_email
msg.attach(MIMEText(message))

# Load attachments
filepath =Path( '/home/pi/prog/output.pdf')
filename = filepath.name #filepath.stem
with open(filepath, 'rb') as f:
attach = MIMEApplication(f.read())
attach.add_header('Content-Disposition', 'attachment', filename=filename)
msg.attach(attach)

# Send a mail
smtp_host = 'smtp.office365.com'
smtp_port = 587
smtp_password = password

server = smtplib.SMTP(smtp_host, smtp_port)
server.starttls()
server.login(username, smtp_password)
server.send_message(msg)
server.quit()
まとまりのないプログラムの中身をChatGPTに解説してもらうと以下の通りです。

--- ChatGPT Comments From Here ---
このプログラムは、WebページからPDFファイルを生成し、生成されたPDFファイルをメールで送信するPythonスクリプトです。以下はプログラムの主要な部分の説明です。

1. モジュールのインポート:
- `os`, `sys`: システム操作と環境変数へのアクセスを提供するモジュール。
- `pdfkit`: WebページからPDFファイルを生成するためのライブラリ。
- `email`, `imaplib`: 電子メールの操作(受信)に関するライブラリ。
- `base64`: ベース64エンコードとデコードを行うライブラリ。
- `smtplib`: SMTPプロトコルを使用してメールを送信するためのライブラリ。
- `email.mime.text`, `email.mime.multipart`, `email.mime.application`: メールの構築に使用されるMIME(Multipurpose Internet Mail Extensions)関連のモジュール。
- `pathlib`: ファイルパス操作のためのユーティリティ。

2. メールの設定情報:
- `username`, `password`, `to_email`, `cc_email`: メールの認証情報と送信先、CC(カーボンコピー)のアドレスを環境変数から取得します。

3. ログファイル設定:
- `MailSenderLog.txt` ファイルにログ情報を書き込むための設定。

4. メール受信:
- IMAP4プロトコルを使用してOutlookメールに接続し、ログインします。
- 受信対象のメールを`dxds`フォルダから取得し、メールの数を取得します。

5. メールの取得:
- 受信対象のメールが存在する場合、最初のメール(メールID 1)を取得し、その内容を解析します。
- メールの送信元、送信先、日付、件名、本文などの情報をログに記録します。
- メールの本文からWebページのURLを抽出します。

6. WebページからPDFファイル生成:
- 抽出したWebページのURLを使用して、`pdfkit`を使ってPDFファイルを生成します。
- 生成されたPDFファイルは`/home/pi/prog/output.pdf`に保存され、ログに生成の成功またはエラーが記録されます。

7. メッセージの削除:
- メールの処理が完了したら、受信したメールを削除し、IMAP4接続を閉じます。

8. メール送信:
- PDFファイルを添付して、指定された送信先とCCアドレスにメールを送信します。
- SMTPプロトコルを使用してOutlookのSMTPサーバーに接続し、メールを送信します。

このプログラムは、Outlookメールアカウントを使用して特定のフォルダからメールを受信し、WebページをPDFファイルに変換して指定の受信者に送信するためのスクリプトです。プログラム内でログも記録され、エラーが発生した場合に問題のトラッキングが可能です。
--- ChatGPT Comments To Here ---

完璧な解説ですね! 以下、補足です。

2. メールの設定情報: プログラム16〜19行目
 前回お話しした通り、Raspberry Piでは、crontabで1日あたり、6:30、6:35、6:40の3回、このPythonプログラム(シェルプログラム)を実行しています。各種ファイルはRaspberry Piの「/home/pi/prog」フォルダに置きました。

DXpapersender.shの中でプログラム16〜19行目の変数を指定しています。中身は以下の通り。
#!bin/bash
cd /home/pi/prog/
export USERNAME="my_mail@hotmail.co.jp"
export PASSWORD="my_mail_password"
export TO_EMAIL="to_email@xxx.co.jp"
export CC_EMAIL="my_mail@hotmail.co.jp"
python3 ssmail.py
3. ログファイル設定: プログラム22〜26行目
メールサービスとPythonプログラムとのやりとりのログを記録するためのものです。以下、4. メール受信から6. WebページからPDFファイル生成までのログを取っています。
2023-10-12 06:30:02,671:INFO:('OK', [b'LOGIN completed.'])
2023-10-12 06:30:02,715:INFO:Mail: 4
2023-10-12 06:30:02,736:INFO:Mail IDs : ['1', '2', '3', '4']

2023-10-12 06:30:02,737:INFO:================== Start of Mail [1] ====================
2023-10-12 06:30:03,022:INFO:From : xxxx
2023-10-12 06:30:03,024:INFO:To : xxxx
2023-10-12 06:30:03,025:INFO:Bcc : None
2023-10-12 06:30:03,025:INFO:Date : Tue, 10 Oct 2023 20:14:38 +0000
2023-10-12 06:30:03,026:INFO:Subject : dxdx
2023-10-12 06:30:03,026:INFO:Body :
2023-10-12 06:30:03,030:INFO:Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64

aHR0cHM6Ly9ub3RlLmNvbS9rb3VzZWluZW5fbm90ZS9uL25kNGRjYWVhOTNjY2Q/bWFnYXppbmVf
(中略)
LmNvbS9hcHAvZ29vZ2xlL2lkMjg0ODE1OTQyPuOBp+WFseacieOBl+OBvuOBl+OBnw0KDQoNCuW4
uOWyoQ0K

2023-10-12 06:30:03,031:INFO:

2023-10-12 06:30:03,032:INFO:https://note.com/xxxxxx

2023-10-12 06:30:03,033:INFO:================== End of Mail [1] ====================

2023-10-12 06:30:20,240:INFO:PDF file "/home/pi/prog/output.pdf" is created.
以後の流れは、ChatGPTの解説通りです。

 今回はRaspberry Piの中で実施している処理(Pythonプログラム)の詳細をお話しました。ChatGPTにプログラムの中身を解説してもらいましたが、うまく説明できていて驚きでした。ChatGPTにプログラムを書いてもらうのも良いですが、こういう書かれたプログラムの解説のような使い方も良いですね。

Webページの自動保存・送信システムを作る(1)

 どこの会社でもSNSや個人ブログ等のWebページ閲覧が、不適切な内容が含まれている等の理由で、規制されていることがあると思います。その中で、最近のAI技術(LLM関連)を会社で調べていて、その技術が記載されているWebページ(ブログ)を見つけ、閲覧したかったのですが、ブロックされて結局タイムリーに閲覧できずじまい・・。
 業務に必要な場合は会社の情シス部門に事情を話して、内容によっては開放してくれるのですが、ドメイン単位でしか開放できないとのこと・・。今回の私の求めている内容は適切な内容ですが、同一ドメインの中に私が全く興味のない不適切な内容も含まれており、切り分けができないのでNGとのこと。万事休す・・。

 ただ、内心馬鹿馬鹿しくて納得が行かず、会社の業務で調べているのに本末転倒だなと強く考える中で、結局、自宅でそのWebページをpdfファイルにして、自宅のPCから自分の会社メールアドレス宛に添付メール送信するしかないなと考えました。
 会社の対応は、不真面目な社員が業務中に不適切なWebサイトを閲覧するのを避けたいのが目的なのでしょうが、私自身、毎日分刻みで仕事をしているので、そんな不適切なWebサイトを見に行く(現実は見れないですが・・)余裕もありません。
 いつもの長〜い前置き(愚痴)はその程度にして、成り立つ方法を以下の通り考えました。

設計思想は以下の通りです。
 1. 自宅(会社でない環境)で「端末A」を用いて、気になるWebページを確認する。
    ↓
 2. そのWebページのURLを「端末A」から「システムB」に知らせる。
    ↓
 3. その「システムB」のプログラムで、目的のWebページをpdfファイルにして「端末C」に知らせる。

今回の場合、実際の使用形態を想定して
 端末A: iPad
 システムB: Raspberry Pi + Pythonプログラム
 端末C: 会社のPC
で、知らせる手段は「メール」です。端末AとシステムBが一つにできればシンプルになるのですが、自分の使用形態を優先します・・。

実施例はこんな感じです。
1. 気になるWebページをiPadの「Googleアプリ」で確認し、右上の共有ボタン(四角形に上矢印のボタン)からメールを選択し、WebPageCheck_231022.png2. 目的のURLを、自動pdfファイル化処理を行うシステムB(端末はRaspberry Pi)にメール送信しました。この際、メールサービス側でこの自動処理用メールを識別するために件名を「dxdx」(仮)と固定件名としました。sendMail_231022.png送信されたメールは、Outlook(hotmail)で自分のメールとしてRaspberry Piで受信し、フォルダ仕分け(今回は「dxds」フォルダ)された状態で確認できます。recievedMail_231022.png3. Raspberry Piでは、crontabで1日あたり、6:30、6:35、6:40の3回Pythonプログラム(シェルプログラム)を実行するように仕込みました。crontab_sh_run_231022.png Raspberry Pi内のPythonプログラムでpdfファイルを作成した後に、会社PCに送付したメールは以下の通りです。画面はCcで自宅の個人メールアドレス宛に同時送信されたものです。output.pdfという形でWebページの内容が添付されます。finalRecievedMail_231022.png
  一連の実施した内容は以上の通りです。2.のRaspberry Piの中で実施している処理の詳細は次回お話しします。

ご訪問者数

(Since 24 July, 2016)

タグクラウド


プロフィール

Dr.BobT

Author: Dr.BobT
興味のおもむくままに生涯考え続けるエンジニアでありたい。

月別アーカイブ

メールフォーム

名前:
メール:
件名:
本文: