カテゴリー別アーカイブ: 未分類

動画の文字起こしと、ドキュメント化

Zoom会議などで、行った内容は

文字起こしして、ドキュメントの整理をしておくとあとで便利である

そこで、文字起こしの方法としては

1,Vrewを使って文字化する

2,Youtubeにプライベートでアップローソして文字起こしする

3,無料のアプリケーションを活用する(Mac系なら whisper transcription)

4.プログラム(Python)で、文字化する

無料の範囲で、動画が短い場合(1分程度)には

1,2,4がよいようである

1時間以上のものであれば、動画を分割して行うか

4当たりになるようである

また、ドキュメント化したものは、文章が不明確なものは

ChatGPTやClaudなどに読み込んで、精査してもらうといい

この時に、内容により、見出しを付けてもらったり

Q&Aの形式にしてもらったり

質疑応答の形などに整理してもらうと後で使いやすくなる

ネタ集めにGoogleフォームを使う

思いついた、ネタや、SNSに使う画像や、SNSで参考になる画像や

広告で流れてきた、画像など、取っておきたいことがある

また、後で、どこかよかったなどは、その時でないと忘れてしまうことがあるので、ためておきたい

そんな時には、Googelフォームを活用するといい

Googelフォームには、画像をアップロードする機能もあるかてである

作成、手順などを、整理していきたいと思う

ネットで調べてみる。キーワードは Googleフォーム アップロード

ttps://form.run/media/contents/googleform/google-form-image-attachment/

ttps://blog.form-mailer.jp/useful/google_attaching_file/

参考ページを参考にして作ってみた

確認する所は、登録後の一覧が見れるか

スマホからもアップできるかなど、確認します

ためしに入力してみます

添付した画像ファイルはGoogleDriveに格納され

管理用のシートには、GoogleDriveの画像URLが格納されました

回答からフォルダー表示にすると、格納画像の一覧が見れます

スマホ(iPhone)からも、画像の登録(アップロード)が

できましたが、一度、Googleアカウントでのログインが必要なようです

2回目からは、不要でした

LazarusとMysqlを使って、銀行口座データの仕分けを行う

月単位(月次)の収支の分析を行う仕組みを作って見る

流れとしては

銀行口座(GMOあおぞらネット銀行)の情報をCSVでダウンロードし、それを、Mysqlにアップロードし

内容別に、仕分けを行い、月単位(月次)の決算を行えるようにしたい

CSVのデータをMysqlへのアップロードする処理は、前回 PHPにて作成したため、Lazarusによる、仕分け設定の画面を作る

仕分けは、最終的な決算報告書に使えるように、費目勘定費目にして、さらに、分析できるように2階層にしたいが、当面は、1階層とする

勘定費目の内容も、DBにて管理したいが、当面は、Lazarus内の属性設定のデータとする

はじめに、属性を設定できる部品を作成する

コンボボックスにて、作成できるが、Lazarusの場合、HTMLの場合

のように、値と表示内容を持つことができるが

Lazarusの場合、値だけなので、StringGridとセットで扱うことにする

Lazarusで、新しいプログラムを作る時は、はじめにからのフォルダを作って

例:sortinng (仕分け)

Lazarusを起動し>

まず、部品として、ボタン、コンボ、Editbox1,Editbox2,StringGridを配置

StringGridに、属性の名前と値を設置する

Comboboxの機能確認

ボタン1をクリックして、名称をコンボボックスにセットする

ボタン1を押すと、abc,efgがセットされ

ボタン2を押すと、opq,rstがセットされる

次は、ボタン3で、StringGridの内容を、

ComboBoxにセットしてみる

まずは、ハードコーディングにて

うまくいったので、動的に行ってみる

次は、comboBoxで選択された内容の属性を取得してみる

これで、Comboxの内容をEdit2に、それに対応する値をEdit1にできた

StringGridを追加して、データーベースから読み込む

Google Spread Sheetでデータベスを作る

GoogleSpreadSheetを元に、Mysqlのデータベースを作るプログラムを作ってみる

対応は

タイトル名 ー> データベース名

シート名 ー> テーブル名

シートの中は、

フィールド名

フィールドの型

コメント

データ

として、1列目に、上記内容を指定できる書式とする

フィールド名 ー> fieldname

フィールドの型 ー> fieldtype

テーブルのコメント ー> table comment

フィールドのコメント ー> fieldcomment

SQLのテンプレート -> template

データ ー> >

コメント ー> #

言語はPHP

データはGoogleSpreadSheet

取得方法はGoogleAPI

作成はMysql

とする

データの元となるGggleSpreadSheetを使って、閲覧許可にして置く

ID を、取得しておく

以下を参考にして

https://www.otsuka-bs.co.jp/web-creation/blog/archive/20230904-03.html

接続とタイトルの取得確認をする

シートの内容は、以下のような感じ

実データを書き込むと以下になる

fieldtypeを2行にしてみました

作成した、シートは閲覧許可にしておく

データを参照するプログラムは以下となる

では、

テーブル名と

フィールドの行を見つける

フィールドのタイプを見つける

Create文を作ってみる

フィールド名の位置はどは、ハードコーディングですが

これで、デーブルの作成と、データのインポートができました

一応数値が空の時の処理も、無事対応できているようです

あとは、一度にテーブルを読む込できるようにします

2回目で、不要なテーブルは先頭に-(マイナス)を付けておいて、スルーするようにしよう

また、テーブルをDropして、強制書き換えもできるが、必要なときには、機能を追加してみます

PHPでCSVファイルによりMysqlを更新

前回の続きで、PHPを使ってメールでアップロードしたCSVファイルでデータベースを更新する処理を作ってみます

行う内容としては

1,CSVファイルの解析

2,対象となるデータベース、テーブルの特定

3,データベースの更新(追加)

4,結果のレポート

となります

まず、CSVファイルの解析は

ファイルを開いて、データーの取得です

ファイルの大きさにもよるのですが

PHPには、CSVを読み込む関数があるので、それを使ってみる

また、1行目がフィールド名になっている事が多いので、

1行目は特別とします

データは、以下のような形式になります

ファイルを扱う場合、文字コードも意識しないと行けないのですが

文字化けに注意しながら進めてみる

ファイル名を

inp_file.csv

とすると

まずは、データベースを固定して

追加の文章を作ってみよう

insertとupdateがあるが全てinsertとしよう

ただし、以前にアップロードしたデータについては

除外することにする

1行目のヘッダーとカラムの対応表が必要になる

INSERT INTO テーブル名 (列名1, 列名2,…) VALUES (値1, 値2,…);

となるので、列名と値の対応が必要になる

列名を、ヘッダーに合わせて、順番を変更するか

あるいは、確定して、行く方法もあるが、順番は確定として

進めることにする

次に、重複を避ける方法として、レコードを特定するユニークなコードがあればいいが、必ずしもあるとは、限らないため

データの一致にて行うことにする

つまり、フィールドが全て、同じ場合は、見送りとし

カラムがわずかでも変わっていた場合には、新規に追加するものとする

INSERT INTO テーブル名 (列名1, 列名2,…) VALUES

まで、固定で、

(値1, 値2,…);

を、入力したデータにて変更するよになる

SQL文を、文字列で作成する方法もあるが、エラーチェックは、インジェクション処理などの処理を含まれた、処理を行う

データベース名
openbook

テーブル名
tp_gmo_corp

“日付”,”摘要”,”入金金額”,”出金金額”,”残高”,”メモ”

データベースへの書き込み(insert)はで行う

文字化けしたので

mb_convert_encoding($line,”utf-8″,”auto”)

を、追加した所、エラーとなった

sudo apt-get install php-mbstring

で、行ったが、やはりダメ

sudo apt install php7.4-mbstring

で、上手く行った

次は

could not find driver

のエラーになった

sudo apt-get install php7-mysql

では、読み込めなかったので

sudo apt-get install php7.4-mysql

で、解消した

これで、CSVに従って書き込んでいたら

数値カラムのInsertでエラーになった

$culum=””;

で、数値のカラムに入れるとエラーになる

””のときは、0に書き換える必要があるとると

カラムの属性情報も管理しないといけない

手抜きは、できないようである

まずは、ハードコーディングで、サンプルを書き込む所まで

行ってみる

ファイルを開けて、追加してみる

2つの処理を合体してみよう

これで、複数行の挿入ができた

次に、重複チェックを行う

既に登録済の行は登録しないようにする

行を特定する、カラムがないので、全てのカラムの一致で、除外するようにしてみる

一応できたが、データ依存性が大きいので、これをいかに、汎用化するか

まずは、ヘッダーにより、フィールドの定義を行う

これをもとに、前回のプログラムを書き換えてみます

重複検索のカラムの範囲と、挿入するカラムの範囲の処理はこれから

Stripのときには、不要なカラムが多いのと、ユニークカラムがあるので、この時に活用していく予定です

データディクショナリーは、Jsonに落として、外部にする事もできそうです

既存のデータを調べて、重複部分から、テーブルを特定する方法もあるが

当面は、この方法で

また、データディクションリーから、新規テーブルも作れるが

はじめの1回なので、後でいいかな

x-serverメールをトリガーにして、プログラムを起動

メールの活用して、情報の管理をすると、入力の場所が明確になって

わかりやすい

メールの内容を、プログラムで確認する方法として

メールの受信をトリガーにして、プログラムを起動する方法がある

以下のページを参考にして、作ってみた

・XSERVER : メール受信をトリガーにして処理を起動
https://raspi.ryo.sc/xserver-mail-trigger/

・メール受信をトリガーにして任意のプログラムを実行する
https://revolutionary.hatenablog.jp/entry/20090226/p1

・XSERVERのメールフィルタでメール転送してみよう
https://seous.info/jobs/internet/1553#google_vignette

・メール受信をトリガーにPHP発動(ネットオウル・ファイアバード)
https://ameblo.jp/tencommon/entry-11493595921.html

・メールの振り分け
https://www.xserver.ne.jp/manual/man_mail_sorting.php

まずは、簡単なプログラムとして

メール受信だけを、確認するために

PHPのプログラムで

ログファイルを書き出してみる

PHPのプログラムは

test.phpとして、logのフォルダーを作っておく

受取用のメールアカウントも作っておく

メールアカウントは

auto@xxxxxxxx.xsrv.jp

としておく

メールアカウントができたので、左のサイドメニューの「メールの振り分け」を選択

メールを送信して見るが、ログが吐き出さない

直接ブラウザから起動するとログを吐き出す

ログのパスをルートからのパスにしたら上手く行った

次は、せっかくメールで送られて来るので

メールの情報を取得してみよう

ページ
「メール本文を取得して本文を変更する」
https://revolutionary.hatenablog.jp/entry/20090312/p1

https://www.webdata.jp/tech/php02.php
【PHP】メールの受信

https://shiranuik.hatenablog.jp/entry/20100624/1277391796
メールを分解する。の解説。

http://www.aiwake.co.jp/modules/bulletin/index.php?page=article&storyid=4
PHP : 受信メールの添付ファイルを保存する

https://qiita.com/ga_ku/items/2f2640905f91aeb82d6c
受信したメールをPHPで解析してDBに格納する

などを参考に
PEARを使って、メールの内容を取得してみる

これで、メールの内容が取得できた

添付ファイルを、取得して、格納したいが、ファイル名の取得が必要

これで、取得できた

行いたいのは、csvのファイルを、複数添付したものを、取得し処理したい

(dbへの追加アップロード)

どんなないよか調べてみる

内容を確認すると

ファイル名は

でいけるはずだが、取り込めない

四苦八苦したあと

で、取り込めた

複数の添付ファイルを付けても、処理をしてくれた

後は、一連の操作の中で、DBへ書き込む処理を追加していく

ネット銀行(GMOあおぞら銀行)や、Stripeなどから、CSVをダウンロードして、メールで添付すると、自動的に、月次決算を集計するものにしていきたい

当面、自分だけで使うので、セキュリティ要件は緩めになっています

chatworkの投稿データをAPIで取得

Chatworkでのやり取りを使って

モチベーション(やる気)を出すために

案件の簡単な進捗管理を作ってみたく思った

ChatWorkのデータを取得してみよう

チャットワークでAPIで投稿内容を取得する

ttps://developer.chatwork.com/docs/getting-started

Chatwork画面右上の「利用者名」をクリックして表示されるメニューの「サービス連携」を選択してください。
サービス連携画面が開きますので、左側のメニューから「APIトークン」を選択してください。とのこと

まずは、APIトークンの取得する

APIの動作確認には、まずは、Curlがお勧めなので

ttps://qiita.com/n0bisuke/items/25813fba8120451d40da

を、参考に

curl -X GET -H “X-ChatWorkToken: 自分のAPIトークン” “https://api.chatwork.com/v1/rooms/{room_id}/messages?force=0”

ルームIDがあれば、チャンネルのルームの情報が取得できそう

{room_id}
は、
チャンネルを開いた時の
https://www.chatwork.com/#!rid36010xxxx
idのあとの数字(現在は9桁)

まずは、curlで、投げてみる

curl -X GET -H “X-ChatWorkToken: 自分のAPIトークン” “https://api.chatwork.com/v1/rooms/{room_id}/messages?force=0”

{“errors”:[“Chatwork API v1 is now obsolete. Please use the latest version.”]}

で、怒られた

ttps://developer.chatwork.com/reference/get-rooms-room_id-messages

本家で調べたら

ttps://api.chatwork.com/v2/rooms/{room_id}/messages

との事

v2でないと、行けないよう

curl -X GET -H “X-ChatWorkToken: 自分のAPIトークン” “https://api.chatwork.com/v2/rooms/{room_id}/messages?force=0”

よっしゃ!!つながった。



Jsonは、ブラウザで解析ができるので

curl -X GET -H “X-ChatWorkToken: 自分のAPIトークン” “https://api.chatwork.com/v2/rooms/{room_id}/messages?force=0″ > chatwork.json

と、jsonの拡張子で吐き出して

ChromeでなくFireFoxで表示しましょう。

見れた。


投稿の100件が取り込めている

これで行けそう

タイムスタンプが send_timeが10桁の数字
これを変換ししないと

これが、投稿時刻の年月日時分のはず


Googleで
chatwork api timestamp
で、検索

ttps://freeelover.com/2022/09/gas/gas%E6%B4%BB%E7%94%A8%E6%B3%95/1130/
ttps://www.shanaidx.com/chatwork_task/
// limit = new Date(json[i].limit_time * 1000 );   // UNIXTIMEを変換してdateにセット

こんなのがあったので、UNIXTIMEというものか?

Googleで
UNIXTIME から 日付に PHP
で、検索

ttps://onga-tec.hatenadiary.jp/entry/2016/08/19/PHP_unixtime%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E6%97%A5%E4%BB%98%E3%81%AE%E5%A4%89%E6%8F%9B%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88

にあったので、
これで、行きそう。

PHPで、直接確認するために

Googleで
コマンドラインで PHP を実行
で、検索

ttps://www.php.net/manual/ja/features.commandline.usage.php

php -r ‘print_r(get_defined_constants());’
こんなことできるんだ

php -r ‘echo time();’
1725521712

php -r ‘echo date(‘Y/m/d H:i:s’, time());’

エラーになった

’が重なったら、ダメですね

php -r “echo date(‘Y/m/d H:i:s’, time());”

表示してくれた

APIで取り込んだデータも

10桁なので、そのままいけそう

取り込んだ、データで、変換してみる

php -r “echo date(‘Y/m/d H:i:s’, 1725106055);”

上手く行った

準備ができたので、まずは

PHPを使って、結果を、GoogleSpreadSheetに貼り付けるものを、作って行こう

それから、データベース(Mysql)へ、吐き出すプログラムをPHPで作って、進捗管理に使って行こうと思う

とりあえず、吐き出したJsonを使って、CSVを書き出してみた。

これで、ExcelやGoogleSpreadSheetには、読み込める

2回目の呼び出しは

forceintegerDefaults to 0

forceはドキュメントより

強制的に最大件数まで取得するかどうか。
0を指定した場合(既定)は前回取得分からの差分のみを返しますが、1を指定した場合は強制的に最新のメッセージを最大100件まで取得します。

の引数は0だと、前回の続きなので、繰り返すと返信がなくなる

返信がない場合、1にするといい

余談ですが

Unixtime
1970年からの経過秒数
なんだ。。

php -r “echo date(‘Y/m/d H:i:s’, 9999999999);”

2286/11/21 02:46:39

260年後には、大騒ぎになるのかな?

残念ながら、そこまでは、生きて、立ち会うことは、少し難しそうですが。

Ubuntu 24.04 Lazarusでmysqlに接続する

LazarusでMysqlに接続する

1,接続
2,読み込み(Select)
3,挿入(Insert)
4,アップデート(Update)
5,削除(Delete)

ポイント
 TMySQL80Connection
 TSQLQuery
 TSQLTransaction
を、使用する。

以前の投稿を、参考にして、


procedure TForm1.Button1Click(Sender: TObject);
var
StrText:string;
begin
if not MySQL80Connection1.Connected then MySQL80Connection1.Open;
if MySQL80Connection1.Connected then begin
SQLQuery1.DataBase := MySQL80Connection1;
SQLQuery1.SQL.Text := 'select p_name from m_product where p_name="'+edit1.text+'" and p_code = "'+edit2.text+'" ';
SQLQuery1.Open;
if SQLQuery1.EOF then begin
StrText :='商品と商品コードが一致しません';
MessageDlg(StrText, mtInformation, [mbYes], 0);
end
else  begin
StrText :='商品と商品コードが一致しました';
MessageDlg(StrText, mtInformation, [mbYes], 0);
end;
SQLQuery1.Close;
end;
MySQL80Connection1.Close();
//Button1.caption:='漢字を表示';
end;

procedure TForm1.Button2Click(Sender: TObject);
var
i:integer;
s:string;
begin
if not MySQL80Connection1.Connected then MySQL80Connection1.Open;
if MySQL80Connection1.Connected then begin
SQLQuery1.DataBase := MySQL80Connection1;
SQLQuery1.SQL.Text := 'select p_name,p_code from m_product ';
SQLQuery1.Open;
SQLQuery1.Open;
i:=1;
while not SQLQuery1.EOF do
begin
if i+1>StringGrid1.RowCount then StringGrid1.RowCount:=StringGrid1.RowCount+1;
//        s:= SQLQuery1.Fields[0].AsString;
//        StringGrid1.Cells[i+1,0]:=SQLQuery1.Fields[0].AsString;
StringGrid1.Cells[1,i]:=SQLQuery1.FieldByName('p_name').AsString;
StringGrid1.Cells[2,i]:=SQLQuery1.FieldByName('p_code').AsString;
i:=i+1;
SQLQuery1.Next;
end;
StringGrid1.RowCount:=i;
 SQLQuery1.Close;
  MySQL80Connection1.Close;
end;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
i:integer;
s,sql:string;
begin
if not MySQL80Connection1.Connected then MySQL80Connection1.Open;
if MySQL80Connection1.Connected then begin
SQLQuery1.DataBase := MySQL80Connection1;

if not SQLTransaction1.Active then SQLTransaction1.StartTransaction;
sql:='INSERT into m_product (p_name,p_code,update_date,create_date) VALUES';
sql:=sql+'("'+edit3.Text+'","'+edit4.Text+'",now(),now())';

MySQL80Connection1.ExecuteDirect(sql);
SQLTransaction1.Commit;
end;
SQLQuery1.Close;
Button2Click(Sender);
MySQL80Connection1.Close;
end;

procedure TForm1.Button4Click(Sender: TObject);
var
i:integer;
s,sql:string;
begin
if not MySQL80Connection1.Connected then MySQL80Connection1.Open;
if MySQL80Connection1.Connected then begin
SQLQuery1.DataBase := MySQL80Connection1;
if not SQLTransaction1.Active then SQLTransaction1.StartTransaction;
sql:='update  m_product set p_code="'+edit6.Text+'" where p_name = "'+edit5.Text+'"';
MySQL80Connection1.ExecuteDirect(sql);
SQLTransaction1.Commit;
end;
SQLQuery1.Close;
Button2Click(Sender);
MySQL80Connection1.Close;

end;

procedure TForm1.Button5Click(Sender: TObject);

var
i:integer;
s,sql:string;
begin
if not MySQL80Connection1.Connected then MySQL80Connection1.Open;
if MySQL80Connection1.Connected then begin
SQLQuery1.DataBase := MySQL80Connection1;
if not SQLTransaction1.Active then SQLTransaction1.StartTransaction;
sql:='delete from  m_product where p_name = "'+edit7.Text+'"';
MySQL80Connection1.ExecuteDirect(sql);
SQLTransaction1.Commit;
end;
SQLQuery1.Close;
edit8.Text:=sql;
Button2Click(Sender);
MySQL80Connection1.Close;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
MySQL80Connection1:= TMySQL80Connection.Create(nil);
MySQL80Connection1.HostName := 'xxx.xxx.xxx.xxx';
MySQL80Connection1.CharSet:='utf8mb4';
MySQL80Connection1.UserName := 'xxxx';
MySQL80Connection1.Password := 'xxxx';
MySQL80Connection1.DatabaseName:='xxxx';
SQLQuery1:= TSQLQuery.Create(nil);
SQLTransaction1:= TSQLTransaction.Create(nil);
SQLTransaction1.SQLConnection:=MySQL80Connection1;
StringGrid1.RowCount:=1;
StringGrid1.ColCount:=3;
<pre><code> StringGrid1.Cells[1,0]:='商品名';
 StringGrid1.Cells[2,0]:='商品コード';</code></pre>
button1.Caption:='search';
button2.Caption:='select';
button3.Caption:='insert';
button4.Caption:='update';
button5.Caption:='detale';
button6.Caption:='maketable';

end;

MySQL57Connection1

can not load default Mysql library(“libmysqlclient.so18” or “libmysqlclient.so”).check your installation

で、エラーになり

MySQL80Connection1

で、行ったら、上手く行った

サンプルのデータベースは

CREATE TABLE m_product (
    product_id INT(11) NOT NULL AUTO_INCREMENT,
    p_name VARCHAR(20) NOT NULL,
    p_code VARCHAR(50) NOT NULL,
    create_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    update_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY ('product_id')
)
COLLATE='utf8mb4_general_ci'
ENGINE=InnoDB
;

ubuntu24.04にlazarusをインストール

公式ページより

ダウンロード

以下の4つをダウンロード
lazarus-project_3.4.0-0_amd64.deb
fpc-src_3.2.2-210709_amd64.deb
fpc-laz_3.2.2-210709_amd64.deb
README.txt

以下の3つをダウンロード
lazarus-project_3.4.0-0_amd64.deb
fpc-src_3.2.2-210709_amd64.deb
fpc-laz_3.2.2-210709_amd64.deb

cd
mkdir lazarus
cd lazarus

sudo dpkg -i lazarus-project_3.4.0-0_amd64.deb
sudo dpkg -i fpc-src_3.2.2-210709_amd64.deb
sudo dpkg -i fpc-laz_3.2.2-210709_amd64.deb

にて、インストール

startlazarus
で、起動

Could not find libgcc

のエラーがでていた。これがまずいよう

sudo apt-get install build-essential

これかな

依存でエラー

エラーメッセージに従い

apt –fix-broken install

再度

sudo apt –fix-broken install

インストールはできたよう

startlazarus
で、起動

上手くいったようです

procedure TForm1.Button1Click(Sender: TObject);
begin
Button1.caption := ‘lazarus’;
end;

ボタンをクリックすると



ボタンの名前が変わった

上手く行った

Ubuntu 24.04 WineのWineWindowsプログラムローダーを設定

Ubuntu 24.04にWineをインストールしたが、exeファイルを、右クリックしても、起動ができない。

WineWindowsプログラムローダーを
インストールしてみた

ttps://www.sejuku.net/blog/84266
を、参考にして

sudo curl -o /usr/share/applications/wine.desktop https://raw.githubusercontent.com/wine-mirror/wine/5c2d6211f6590d3856dc9188593b3d3597c8b441/loader/wine.desktop

を、行った後に、リブートしたところ

WineWindowsプログラムローダーが
表示された




これにより、起動したいファイルを右クリックで、起動できるようにりました