アフィリエイト広告を利用しています
検索
<< 2024年02月 >>
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29
最新記事
タグクラウド
カテゴリーアーカイブ
ファン
最新コメント
プロフィール
ゼロから始めるシステム開発さんの画像
ゼロから始めるシステム開発
 こんにちは!ナビゲータのEVEです。各種研究室を用意し、次期EVEシステムを製造しようと日々頑張っています。現在一番力を入れているのが、資金調達です。このブログもその一環ですので、ご協力いただければ嬉しいです。

広告

この広告は30日以上更新がないブログに表示されております。
新規記事の投稿を行うことで、非表示にすることが可能です。
posted by fanblog

2024年02月27日

文字列クラスのデバック −Bardからの指摘- 〜プログラミング研究室〜


 こんにちは!
 ナビゲータのEVEです。
コーダー.jpg
 本日は、昨日の続きで、 Bard からの解析を元に、プログラム修正を試みます。2日連続長々としたプログラムをブログに載せるのは、見栄えが良くないので、対象のプログラムを参照したい方は、昨日のブログを見て下さい。
 では、早速、Bardからの解説を見てみましょう!

[Bardによる文字列クラスのデバック]
 以下が、昨日のプログラムのデバック結果です。

■概要
 このコードは、文字列の基本的な操作を行うstringClassというクラスを定義しています。

■デバッグ結果
このコードにはいくつかの問題があります。

★問題点
?コメントの書き方が不統一
 コメントの書き方が統一されていません。
1)多くのコメントは日本語で書かれていますが、一部英語で書かれています。
2)コメントのフォーマットが統一されていません。

?エラー処理が不完全
 いくつかのメソッドでエラーチェックを行っていますが、処理が不完全です。
1)metSearchKeyメソッドで、検索キーが空の場合、エラーメッセージを設定していますが、処理を継続しています。
2)metCheckErrorMessageメソッドで、エラーメッセージが設定されている場合、処理を中止していますが、エラーメッセージの内容をユーザーに表示していません。

?不要な変数
 metCheckErrorMessageメソッドで、$resultという変数をstatic変数として定義していますが、この変数は不要です。

?デストラクタの処理が不十分
 デストラクタで、プライベート変数を初期化していますが、すべての変数を初期化していない可能性があります。

■改善点
・コメントを日本語で統一し、フォーマットを統一する。
・エラー処理を完全に行う。
・不要な変数を削除する。
・デストラクタで、すべてのプライベート変数を初期化する。



[指摘の検討]
?から順番に見ていきましょう!
 ?については、コメントを指摘しています。ChatGPTは特にそうですが、プログラム解析をするに際し、コメントを重要視しています。その点Bardはコメントとプログラムとの不整合に関する指摘はないようなのですが、ChatGPTとBard両方にデバックをお願いするということを考えると、以下の点に気を付けてプログラムを製造したほうがいいようです。

1)プログラムの処理とコメントの内容を合致する。
2)コメントのフォーマットを統一する。


1)については、今後かなり気を付けて記述したいと思います。
2)については、コメントのフォーマットは統一しているつもりだったのですが・・・。パット見た目、そろっていると思いません?もしかしたら、構成管理システムが完成した場合、ヘッダ情報を構成管理システムに登録して、登録した情報をヘッダとした方がいいかもしれません。これについては、検討します。
 なお、コメントにおける日本語と英語は今後も両方利用していく予定です。英語って言っても変数名ですしね。

 ??については、どうも、Bardは、エラーが発生した直後に、 return で呼び出し元へ制御を移すのが本来の動作だと思っている節があります。そのため、resultを利用して、プログラムの最後で、処理結果を返却するのはナンセンスだと感じているのかもしれません。
 Bardが指摘したこのような記述は私の、癖です。決して正しいとは思わないので、これから作るプログラムは、異常が発生したタイミングで呼び出し元へ制御を移すような作りにしたいと思います。既に作っているプログラムについては、徐々に変更するという方向で作業を進めます。
 なお?2)は、エラーになった場合、呼び出し元で参照したければ、 getter で取得できるようにしているので、指摘は無視します。
 ?は、何を指摘しているのかわかりません、って思ったのですが、 ChatGPT の指摘を思い出しました。プライベート変数に定義されているエラーメッセージは、エラーのEが大文字なのですが、メソッド内で、いくつか小文字のeで記述しているところがあります。そのことを指摘しているのだと思います。
 ちなみに、 static で記述した メソッド 内変数は初期化する必要はないと、Bardから回答をもらっています。もし初期化するものがあるとしたら、 Class に定義したプロパティのみのはずです。

[あとがき]
 Bardからの指摘が重大なものが含まれていなくてよかったです。今まで1人でシステムを作り、独りよがりの部分があったかもしれませんが、 AI をプログラム製造に導入することにより、世間一般のプログラムに近づけるような気がします。
 以前、このブログのどこかで書きましたが、私も含めてユーザーは、 PHP などの言語開発者がだめなコーディングだと思っても、できることはやってしまいます。知らないうちに・・・。そのようなことを指摘してもらえて非常に助かっています。

 では、また!

2024年02月26日

ChatGPTでプログラムデバックをしてみる 〜プログラミング研究室〜


 こんにちは!
 ナビゲータのEVEです。
オフィスワーク.jpg
 本日は、いままで ChatGPT を用いてやると言っていた、 デバック をやってみました。今から考えると、雛形1本作ってから、その雛形から横展開すべきでした。そんな後悔を今更しても仕方がないので、今後は、そうしたいと思います。

[デバック]
 一番気になるのは、4,000ステップ弱の文字 クラス です。これに、致命的なエラーがあったら、かなりの修正がはいりそうです。
 ただ、4,000ステップのプログラムのデバックは、ChatGPTの入力制限にひっかかります。そのため、 メソッド とそのメソッドを構成する コンストラクタ 、メソッド、 プロパティ デストラクタ を切り出して1つのクラスとしてデバックすることにしました。以下が、初めてデバックしたクラスです。
 一番簡単なメソッド、指定文字列検索メソッドをターゲットにクラスを作成し、ChatGPTにデバックを御願いしました。


<?php
/*************************************************
*【クラス名 】文字列クラス
*【製 造 者】EVE
*【製造年月日】2023年12月16日
*【更新年月日】
*【リリース日】
*【バージョン】
*【 概 要 】
* 文字列の基本的な操作を行う
*************************************************/

class stringClass {
//プライベート変数定義
private $priErrorMessage = ""; //エラーメッセージ
private $priBaseString; //編集対象文字列
private $stringLen; //文字列長
private $stringByte; //文字列バイト数

/*************************************************
*【メソッド名】コンストラクタ
*【 引 数 】
* $strObject:編集対象文字列
*【返 却 値】
* 正常時:true
* 異常時:false
*【製 造 者】EVE
*【製造年月日】2023年12月16日
*【更新年月日】
*【リリース日】
*【バージョン】
*【 概 要 】
* 初期の処理を実施する
*************************************************/

public function __construct(string $strObject) { //編集対象文字列
//引数をプライベート変数へ設定する
//文字列長を取得する
$this->stringLen = mb_strlen( $strObject );

//文字列バイト数を取得する
$this->stringByte = strlen( $strObject );

//引数をプライベート変数として設定する
$this-> $ priBaseString = $strObject; //編集対象文字列
}

/*************************************************
*【メソッド名】指定文字列検索メソッド
*【 引 数 】
* key:検索キー
*【返 却 値】
* 正常時:検索語文字列
* 異常時:false
*【製 造 者】EVE
*【製造年月日】2024年1月24日
*【更新年月日】
*【リリース日】
*【バージョン】0.1
*【 概 要 】
* Keyに基づき検索し、検索文字列以降の文字を取得し返却する
*************************************************/

public function metSerchKey( string $key ) { //検索キー
//■変数定義
$result = ""; //検索結果
$cutString = ""; //編集文字列

//■入力データチェック
//エラーメッセージが設定されているかどうか判定する
if ( $this->metCheckErrorMessage() === false ) {
//返却値を設定し呼び出し元へ制御を移す
return false;
}

//検索キーの設定の有無を判定する
if ( $key == "" ) {
//例外メッセージを格納する
$this->metSetErrorMessage("検索キーが設定されていません。検索キーは入力必須項目です");

//返却値を設定し呼び出し元へ制御を移す
return false;
}

//■処理開始
//検索文字列を取得する
$this->priBaseString = stristr($this->priBaseString,$key);

//文字列長を返却する
return $this->priBaseString , ;
}

/*************************************************
*【メソッド名】文字列長取得メソッド
*【 引 数 】なし
*【返 却 値】
* 正常時:文字長
* 異常時:false
*【製 造 者】EVE
*【製造年月日】2024年1月21日
*【更新年月日】
*【リリース日】
*【バージョン】0.1
*【 概 要 】
* 文字列長を取得し返却する
*************************************************/

public function metGetStringLen() {
//■入力データチェック
//エラーメッセージが設定されているかどうか判定する
if ( $this->metCheckErrorMessage() === false ) {
//返却値を設定し呼び出し元へ制御を移す
return false;
}

//■処理開始
//文字列長を返却する
return $this->stringLen;
}

/*************************************************
*【メソッド名】文字列バイト数取得メソッド
*【 引 数 】なし
*【返 却 値】
* 正常時:文字バイト数
* 異常時:false
*【製 造 者】EVE
*【製造年月日】2024年1月21日
*【更新年月日】
*【リリース日】
*【バージョン】0.1
*【 概 要 】
* 文字列バイト数を取得し返却する
*************************************************/

public function metGetStringByte() {
//■入力データチェック
//エラーメッセージが設定されているかどうか判定する
if ( $this->metCheckErrorMessage() === false ) {
//返却値を設定し呼び出し元へ制御を移す
return false;
}

//■処理開始
//文字列バイト数を返却する
return $this->stringByte;
}
/*************************************************
*【メソッド名】事前プログラムエラーチェックメソッド
*【 引 数 】なし
*【返 却 値】
* 正常時:true
* 異常時:false
*【製 造 者】EVE
*【製造年月日】2024年2月14日
*【更新年月日】
*【リリース日】
*【バージョン】0.1
*【 概 要 】
* 本プログラム前にエラーが発生していた場合エラーを
*返却する
*************************************************/

public function metCheckErrorMessage() {
//■変数定義
static $result = true; //処理結果

//■入力データチェック
//エラーメッセージが設定されているかどうか判定する
if ( $this->metGetErrorMessage() != "" ) {
//例外メッセージを格納する
$this->metSetErrorMessage("処理前にすでにエラーになっています。");
//処理結果にfalseを設定する
$result = false;
}

//返却値を設定し呼び出し元へ制御を移す
return $result;
}
/*************************************************
*【メソッド名】エラーメッセージ設定メソッド
*【 引 数 】なし
*【返 却 値】
* 正常時:true
* 異常時:false
*【製 造 者】EVE
*【製造年月日】2023年12月16日
*【更新年月日】
*【リリース日】
*【バージョン】0.1
*【 概 要 】
* エラーメッセージを設定する
*************************************************/

public function metSetErrorMessage(string $errMsg) { //エラーメッセージ
//エラーメッセージを設定し呼び出し元へ制御を移す

$this->pri e rrorMessage = $errMsg;
}

/*************************************************
*【メソッド名】エラーメッセージ取得メソッド
*【 引 数 】なし
*【返 却 値】
* 正常時:true
* 異常時:false
*【製 造 者】EVE
*【製造年月日】2023年12月16日
*【更新年月日】
*【リリース日】
*【バージョン】0.1
*【 概 要 】
* エラーメッセージを取得する
*************************************************/

public function metGetErrorMessage() {
//エラーメッセージを設定し呼び出し元へ制御を移す
return $this->pri e rrorMessage;
}
/*************************************************
*【メソッド名】デストラクタ
*【 引 数 】なし
*【返 却 値】なし
*【製 造 者】EVE
*【製造年月日】2023年12月16日
*【更新年月日】
*【リリース日】
*【バージョン】
*【 概 要 】
* オブジェクトが消滅する場合の処理を定義する
*************************************************/

public function __destruct() {
//使用パブリック変数を初期化する
$this->priErrorMessage = ""; //エラーメッセージ
$this->priBaseString = ""; //編集対象文字列
$this->stringLen = ""; //文字列長
$this->stringByte = ""; //文字列バイト数
}

}
?>


以上のプログラムのデバックをお願いしたところ、以下のような回答がありました。

?コンストラクタのプロパティへの代入
 $priBaseString プロパティへの代入時に $ を付けていません。また、プロパティ名が priBaseString であるべきところで、 String になっています。
?metSerchKey メソッドの文字列検索処理
 stristr を使用していますが、これは検索文字列以降の文字列を取得するものではありません。また、 stristr の戻り値が正しいように使用されていません。
?metSerchKey メソッドの戻り値
 コンマ , が余分についており、また正しい形式で戻り値を返していません。
?metSetErrorMessage メソッドと metGetErrorMessage メソッド
 それぞれエラーメッセージを設定するメソッドと取得するメソッドですが、エラーメッセージのプロパティ名が誤っています。


以上の通り、いくつかバグを指摘してくれました。この検証により、ChatGPTをデバックに利用することは有効だと判断しました。
 なお、?については、ヘッダの「検索文字列以降の文字を取得し返却する」という記述の間違いを指摘しています。正確には、検索文字列を取得し返却します。
 ?の結果を見ると、コメントから正しいプログラムかどうかも判断してくれているようです。今後、 プログラムテスト前 には必ずChatGPTでデバックしたいと思います。
 ChatGPTにも分かるはずもないのですが、今回デバックしたことにより、プライベート変数の頭にpriがついていないなどの仕様的なバグやコメントの間違いに気づくことができました。

[今回の反省点]
 とりあえず、ChatGPTの以上の回答を見れば分かりますが、分かりずらい・・・。バグが細かい部分だったということもあるのですが、事細かに質問してやっと気づくことができました。
 以上の点については、規約を事前に知らせておく、どういう回答をしてほしいのか、事前に知らせておくなどの対応をしたいと思います。

[あとがき]
 ChatGPTにデバックをお願いしたものと、同じものを、 Bard Copilot にもお願いしたのですが、Bardは構造上の指摘も多数してくれました。今まで、ChatGPTにしかお願いしていませんでしたが、併用すれば、正しいプログラムを作ることができそうです。
 Bardについては、後日お話しします!ちなみに、Copilotは、このレベルのクラスでも文字数制限にひっかかり、デバックできませんでした。

 プログラマの多くは分かっているとは思いますが、これ業務でやった場合、 情報流出 という扱いになるかもしれません。もしやる場合は、上長に十分相談し、適切な対応をとってから実施してください。

 以前、私の知り合いで、業務で作った成果物を自宅へE-メールで送り、 裁判 沙汰になった人がいましたが、そうならないように気を付けてください。

 では、また!!!

2024年02月25日

ChatGPTにプログラムを作ってもらう 〜プログラミング研究室〜


 こんにちは!
 ナビゲータのEVEです。
未来.jpg
 1月から、 function で定義した通常の関数を オブジェクト指向プログラミング に書き換えています。
 そんな作業の最中、新たな試みをしています。
 昨日から、不足している クラス ChatGPT に作ってもらっています。作ってもらっているといっても、機能を説明して、その機能のプログラムを作ってもらっているレベルなのですが・・・。

[zipの圧縮関数がない!]
 昨日から、ファイルクラスの製造に入っています。ただ、Prototype EVEではファイル関連という扱いだった関数が、EVEシステムではオブジェクト指向プログラミングにする都合上、ファイル、データ、アップロードと、かなりクラスごとに細分化されることになりました。
 その中に、 zip ファイルを解凍するクラスがったのですが、圧縮する関数がない・・・。理由は、OSのコマンドをプログラム内で直接実行しているから・・・。だけど、EVEシステムではそんな変則的なことはせず、PHPプログラムで実行できることはすべてPHPで実行します。そのため、新たにプログラムを製造しようとしたのですが、いろいろやることある中、これから、調べるのはめんどくさいということで、ChatGPTに以下のようなお願いをしました。

 PHPでファイルを、zipファイルで圧縮する方法について例示してください。


今読むと日本語が変・・・。それはさておき、以上のようなお願いに対して、ChatGPTは以下のようなプログラムを作ってくれました。


<?php

// 圧縮するファイル
$files = array(
'file1.txt',
'file2.txt',
'file3.txt'
);

// 新しいZipファイルの名前
$zipName = 'compressed_files.zip';

// ZipArchiveのインスタンスを作成
$zip = new ZipArchive();

// 新しいZipファイルを作成し、開く
if ($zip->open($zipName, ZipArchive::CREATE) === TRUE) {
// 各ファイルをZipに追加
foreach ($files as $file) {
// 追加するファイルのパスを指定
$filePath = __DIR__ . '/' . $file;
// ファイルが存在するか確認してから追加
if (file_exists($filePath)) {
// 第2引数には、Zipファイルに追加する際のファイル名を指定
$zip->addFile($filePath, $file);
} else {
echo "ファイルが見つかりません: $file";
}
}

// Zipファイルを閉じるM
$zip->close();

echo "ファイルが圧縮されました: $zipName";
} else {
echo "Zipファイルを作成できません";
}
?>



日本語が変にもかかわらず、ChatGPTは気を利かせて、1ファイルを圧縮するぐらいにしか考えていなかったお願いに対して、複数のファイルをzipファイルへ圧縮するプログラムを例示してくれました。。
 今回は、クラスへ メソッド として追加するという目的で、プログラムの作成をお願いしたのですが、このロジックで十分です。
 あとは、このロジックを解析しながら、クラスにメソッドとして取り込むだけです。
 短い質問で、効率的にプログラムを作ることができました。

[あとがき]
 プログラミングの一部をChatGPTへお願いしたことにより、これから、クラスの製造は速くなりそうです。ただ、もっと複雑なことをさせたい!!!だけど、どうお願いしたらいいのか分からない???
 これから、日々使い方を研究し、作業効率を上げていきたいと思います。

 では、また!!!

2024年02月22日

PHPにおける正規化表現 〜プログラミング研究室〜

 こんにちは!
 ナビゲータのEVEです。
PHP.jpg
 では、本日は、早速正規表現について見ていきましょう!

[正規表現]
 昨日のおさらいになりますが、 正規表現 とは、いろいろな入力データを、一定の規則に基づき、統一的な表現で出力するものです。
 例えば、株式データを扱う場合、1株10円台から数十万円単位の株式までいろいろあります。1株10円、100円程度の株なら一目でいくらか分かるのですが、1株数十万円の場合、カンマで区切られていないとわかりません。そのため、1株千円以上の株価は、3桁ずつに区切りたいというニーズが生まれます。その時などに利用するのが、正規表現です。

[正規表現の実際]
 では、実際に、数値123456789をカンマ区切りする、正規表現を見ていきましょう!

/(\d)(?=(\d{3})+$)/


ただ、数字を3桁ずつに区切りたいだけなのに複雑な作りになっています。
 昨日、以上の正規表現には、 メタ文字 が使われ、そのメタ文字には、以下のようなモノがあるという話をしています。

\ 多目的に使う一般的なエスケープ文字
^ 検索対象(複数行モードでは行)の始まりを言明
$ 検索対象の終わりあるいは終端の改行文字の前(複数行モードでは行の終わり)を言明
. 改行を除くすべての文字にマッチ(デフォルト時)
[ 文字クラス定義の開始
] 文字クラス定義の終了
| 選択肢の開始
( サブパターンの開始
) サブパターンの終了
? ( の意味を拡張/0 または 1 回マッチ/なるべく少ない回数だけマッチ
* 0 回以上の繰り返し
+ 1 回以上の繰り返し
{ 最小/最大を指定する量指定子の開始
} 最小/最大を指定する量指定子の終了
/ メタ文字の開始と終了を示す。
\ メタ文字の開始と終了を示す。
出典元  【5分でまるっと理解】PHP正規表現の使い方まとめ(エンジニアの入り口)


以上の情報からどのようなことをしているのか、見ていきましょう!なお、最初のスラッシュ(/)なのですが、メタ文字の開始と終了を意味します。そして、最後のuは、、 UTF-8 エンコーディングを使用している場合に、正規表現のパターンを適切に処理するために必要な表現だそうです。通常、 PHP で利用する関数は、UTF-8に対応しているため、最後のuは、呪文のように定義する必要があります。私の開発環境は、すべて、UTF-8で構成されていますが、 Windows で開発している人で、 SHIFT-JIS を標準文字コードとしている場合は、まず文字コードをUTF-8に変換したうえで、正規表現を利用しないと、想定しない出力結果になります。
 \B は、単語境界の直前や直後ではない位置を示す特殊なマッチング条件です。この記述がないと、3桁の数値の位置は特定できるのですが、特定後改行されてしまいます。
 続きまして、\Bのサブパターンの開始を意味する、カッコ"()"の中身を見ていきましょう!
 カッコ内の最初の?は、マッチングパターンである続くカッコの中身を指しています。それ以降については、\dは、数値を指しており、鍵カッコ"{}"はその数値の桁数を指しています。ちなみに、dは、digit(数字)を指しています。
 そして、+は、(\d{3})が1回以上繰り返されることを意味しています。
 最後に、(?!\d)は、?を説明している(\d{3})の否定語読みとなり、(\d{3})のパターン直後は続かないという条件を指します。ちなみに、エクスクラメーション(!)は、メタ文字ではなく、演算子です。
 以上で、正規表現をすべて説明しましたが、分かりましたでしょうか?ちなみに、この表現の中では、カンマ(,)は表現されておらす、これから紹介する、関数により提供されるモノらしいです。そこが、ちょっと、分かりにくい・・・。

[PHPで利用する正規表現関数]
 PHPでは、以下の2関数を用いて、正規表現したパラメータを処理します。

preg_replace
preg_match


多分以下のようなロジックで、数値を3桁区切りで表示できると思われます。

$number = 12345678
echo preg_replace('/\B(?=(\d{3})+(?!\d))/u', ',', $number);


出力結果は、

123,456,789

となります。

[あとがき]
 やっぱり、複雑・・・。 ChatGPT に解説してもらわないともしかしたら、理解できなかったかもしれません。なお、メタ文字に関する情報を、 【5分でまるっと理解】PHP正規表現の使い方まとめ(エンジニアの入り口) を見て提供しましたが、今回の調査で情報が不足していることが分かりました。追加した情報については、青字で記していますので、ご確認ください。
 まっ、書き終わってからなんですが、数値を3桁に区切って表示したいだけの場合、 number_format() を利用すべきです。この関数だと数値を入力するだけで、数値を3桁ごとに区切って表示してくれます。ちなみに、カンマ区切りになった数値は、整数ではなく、文字列となることには、注意が必要です。

 では、また!

2024年02月21日

正規表現 〜プログラミング研究室〜

 こんにちは!
 ナビゲータのEVEです。
プログラマ.jpg
 昨日は、以下のX(旧ツイッター)のコメントに反応し、「システムエンジニアが目指す中小企業診断士」を更新しました。

「出題範囲の知識がムダだとは言わないが、名刺に中小企業診断士って書いてある奴は地雷」


以上の発言を受けて書いた、昨日のブログの記述に、不明瞭なところがあるので、一言でまとめます。

 現在の経営は中小企業診断士で教えるそれとかなり乖離があり、突っ込みどころ満載の状態です。そのような経営状況で、日本は失われた30年という闇の中にいます。しかし、去年から脱却できそうな所まで回復してきました。そんな現状、中小企業診断士という資格を持つ人の活躍の場は広がりつつあります。


 だから、一方的な以上のいいようは、言いすぎなのではないかなって感じています。まっ、多分ですが、以上の発言をしている人は、真剣に、 中小企業診断士 の勉強をしたことがないのだと思います。
 ただ、昨日のブログの中で、「 うまくいかなかった場合のリスクは、成功した場合の成果をかなり上回る 」という印象は現在も変わっていません。慎重な発言、対応を求められていることに注意しなければなりません。

[正規化]
 では、本日までの開発状況について御報告します。

 本日、先週末終える予定だった、 文字クラス の製造が昨日終わり、ちょっと、遅れ気味な状況です。そして、本日は、 数値クラス の製造に入っており、完成は明日を予定しています。
 ただ作るだけなら本日完成できるのですが、1つ知識として定着させたい情報がありました。それは、 正規表現 です。
 正規表現とはどのようなモノなのか、 ChatGPT に聞いてみましょう!

 PHPで使用する正規表現(regular expression)は、文字列のパターンを記述し、そのパターンに一致する文字列を検索、置換、抽出するためのパターン記述言語です。正規表現は、様々なプログラミング言語やツールで広く使用されており、特定の文字列パターンに対する柔軟な検索・置換処理を行う際に非常に便利です。


 捕捉すると、いろいろな入力データを、一定の規則に基づき、統一的な表現で出力するものです。
Prototype EVE でも、重複するスペースを削除するなどのケースで、正規表現を使用していました。それは、インターネットで公開されている情報をそのままコピペしただけです。正直言ってどうして、そのような記述になっているのか理解しないまま利用していました。
 ただ、技術者としてそれでいいのかという疑問があり、きちんと知識として習得するために時間を取ることにしました。

[利用する場面]
 先ほど、重複するスペースを削除するという場面で利用しているという話をしましたが、現在問題となっているのは、カンマ区切りの数字です。
 ただ、やり方だけを知りたいなら、ChatGPTに聞けばできるのですが、それでは、知識とは言えません。そこで、正規表現について解説しているサイトで情報をゲットし、 Knowlegeシステム へ編集し登録しました。
 ただ、それを見ただけではまだよく分かりません。そこで、カンマ区切りにする、正規表現をChatGPTに教えてもらった結果と、以上の情報を利用し分析したいと思います。

[正規表現のメタ文字]
 それでは、正規表現ではどんな メタ文字 が利用できるのか調べて見ましょう。以下に記した情報は、エンジニアの入り口から写させていただいた情報です。

\ 多目的に使う一般的なエスケープ文字
^ 検索対象(複数行モードでは行)の始まりを言明
$ 検索対象の終わりあるいは終端の改行文字の前(複数行モードでは行の終わり)を言明
. 改行を除くすべての文字にマッチ(デフォルト時)
[ 文字クラス定義の開始
] 文字クラス定義の終了
| 選択肢の開始
( サブパターンの開始
) サブパターンの終了
? ( の意味を拡張/0 または 1 回マッチ/なるべく少ない回数だけマッチ
* 0 回以上の繰り返し
+ 1 回以上の繰り返し
{ 最小/最大を指定する量指定子の開始
} 最小/最大を指定する量指定子の終了

出典元  【5分でまるっと理解】PHP正規表現の使い方まとめ(エンジニアの入り口)



[あとがき]
 以上のメタ文字を駆使して正規表現を作ります。見た目チョット複雑です。ただ、今までの経験上じっくり読めば理解することは可能だと思っています。
 明日、どんなことをしているのか、一緒に見て、分析していきましょう!

 では、また!

■【5分でまるっと理解】PHP正規表現の使い方まとめ(エンジニアの入り口)
https://eng-entrance.com/php-regularex

2024年02月17日

運用時に使用するPHPプログラムを暗号化する 〜システム開発研究室〜


 こんにちは!
 ナビゲータのEVEです。
デスクワーク.jpg
 昨日、 X (旧ツイッター)でつぶやきましたが、 日本 ニュースステーション という番組で、 AI についてかなりでたらめな報道をしていました。
 細かいことを書くと長くなるので、ポイントだけ話すと、生まれたばかりの 生成AI が、犬の動画を作ったり、女性が歩く動画を作れるようになったという報道です。まっ、この業界の技術のスピードは、かなり早く何があっても驚かないのですが、こればかりはいただけません。だって、生まれたてのAIが、犬とか女性がどういうモノなのか知るわけがないからです。
 全くデータがない状態から、AIが 将棋 とか が強くなると言うケースはあるのですが、それでも、将棋、囲碁のルールは最初に教えなければいけません。
 東大の教授がその番組の中で発言をしていましたが、自分のコメントが使われるのだから、一度中身を見た方が良かったのでは?っと思った昨晩の、報道でした。
 では、今日は、昨日の続きの検討です。

[プログラムをお客さまに見せたくない]
 昨日は、大きすぎるプログラムサイズへの対応を考えましたが、その中で、リリース方式という機能を、 構成管理システム へ追加することにしました。その方式の中で、3つのやり方を検討しています。

?製造したプログラムを以下の項目を指定してアップロードする。
 ?@プログラム概要
 ?Aシステムバージョン
 ?Bプログラムバージョン
 ?Cリリース日
  ・日付指定
  ・即時反映
 ?Dリリース方式(New)
  1)ソース(原本)
  2)不要ロジック削除
  3)暗号化(不要ロジック削除)



 ?D1)については、 デバック環境 へ、何の変更も加えずリリースする方法です。コンピュータ的に不要でも、開発者からするとかなり重要な情報が含まれています。それを削除しないように、アップロードしたままをデバック環境へリリースする機能です。
?D2)については、本番環境へコメントなどの不要ロジックを削除したうえでリリースするという機能です。これは昨日検討した、プログラムサイズが大きくなったことにより、システムへの負担が大きくなってきたということへの対応です。
 ?D3)については、不要なロジックを削除したうえで、リリースしたプログラムを暗号化するという方法です。
 今回のシステム真剣に作っています。そして、販売も視野に入れて製造しているのですが、販売先でソースを見られ突っ込まれるのが正直言って嫌(笑)!
 今回のシステムは、前回と違い、 ChatGPT にデバックしてもらったうえでリリースするので、一般的な規約とかと大きく違ったものは出来上がるということはないと思うのですが、システムに関連するすべての仕様を読み理解しているわけではありません。そのため、システム仕様でふさわしくないといわれる方法でも、できるならやってしまいます。
 数億円といった費用をかけたシステムなら、そんなことはないということを、私一人で作るシステムでは、やってしまう可能性があるのです。

[PHPを暗号化し運用する]
 そんなことできるのっていうことで、 Bard で調べてみたのですが、できるそうです。

PHP プログラムを暗号化して納品し、運用することは可能です。お客様のソースコードを保護するという意味では有効な手段と言えるでしょう。ただし、いくつか注意点があります。

?暗号化方法
 PHPプログラムの暗号化には、さまざまな方法があります。代表的なものは以下の3つです。
?@ファイル暗号化
 1)opensslなどのツールを使用してファイルを暗号化できる」
?Aコード難読化
 1)変数名や関数名を意味不明な文字列に変換
 2)ソースコードの構造を複雑にする
?B仮想化
 1)PHPプログラムを独自の仮想マシン上で動作させる

 それぞれの方法にはメリットとデメリットがあり、プロジェクトの要件に合わせて選ぶ必要があります。

2. 動作環境
 暗号化されたPHPプログラムを実行するには、専用のデコードツールや仮想マシンが必要になります。そのため、お客様の環境にそのツールや仮想マシンが導入されていない場合は、事前に準備しておく必要があります。

3. デバッグ
 暗号化されたプログラムは、デバッグが非常に困難になります。問題が発生した場合、原因を特定するのが難しく、解決に時間がかかる可能性があります。

4. パフォーマンス
 暗号化処理やデコード処理には、多少のオーバーヘッドが発生します。そのため、プログラムの処理速度が遅くなる可能性があります。

5. セキュリティ
 暗号化技術は常に進化しており、完璧な暗号化方法は存在しません。悪意のある攻撃者によっては、暗号化を解読されてしまう可能性もあります。

 これらの点を考慮した上で、お客様のプロジェクトに適した暗号化方法を選択する必要があります。


 ちょっと、私が聞きたい内容と不整合な解答もあり、製品としては、どのようなモノがあるのか聞いてみました。

1. Zend Guard
2. ionCube Encoder
3. SourceGuardian
4. PHP-Obfuscator
5. Phalcon



[あとがき]
 製品そのものを調べれば実際にできるかどうか分かるでしょう?
 今回のシステムですが、 バグ があることが前提ではありません。 ブラックボックス試験 では正常に動くが、ロジックを1ステップ1ステップ見た場合、PHPの製造元が意図しない方法を採用しているとったケースへの対応です。
 お客様にソースを見られたくないという要望に対して、暗号化という方法の他に、Bardからの解答の中に、 難読化 というものがありました。その難読化の方法として、 Google JavaScript を提供する方法が利用できるかもしれません。
 まっ、とりあえず、自分が作らないと前に進まないプロジェクトなので、がんばります!

 では、また!!!

2024年02月16日

プログラムサイズが長すぎる 〜システム開発研究室〜


 こんにちは!
 ナビゲータのEVEです。
プログラミング.jpg
PHP8 による開発が、なかなか進んでいない状況なのですが、 文字クラス のステップを見て驚いています。
 ドキュメントを作ることをしない私が作るシステムは、コメントが非常に多いのですが、そのプログラムステップ数が、3,120行あります。文字クラスは今週末ぐらいには完成しそうなのですが、4,000行近くになりそうです。そのような状況を確認しながら、ちょっと、考えさせられています。

[メモリの解放されるタイミング]
 やはり、1つのクラスで4,000ステップあるのは長すぎます。しかも、文字クラスに、他のクラスもインポートしているので、かなりメモリに負荷を与えそうです。ただ、それを頭で考えていても答えは分からないので、 ChatGPT に使用したクラスがどのタイミングで解放されるのか聞いてみました。

 require_onceで呼び出されるクラスがメモリから消えるタイミングは、そのクラスが不要になり、参照されなくなったときです。PHPでは、ガベージコレクション(Garbage Collection)と呼ばれる仕組みがあり、不要になったオブジェクトや変数は自動的にメモリから解放されます。
 具体的には、以下のようなタイミングでクラスがメモリから消えます:

1)そのクラスのインスタンスがすべて参照されなくなった場合。
2)クラスを参照している変数や配列要素などが他の値に上書きされた場合。
3)スクリプトの実行が終了し、PHPプロセスが終了した場合。

 セッションの終了とは直接関係ありません。クラスの使用が終了したかどうかは、そのクラスを参照する変数やインスタンスが解放されたかどうかによって判断されます。


以上の内容を読んでみると、 セッション 終了を待たずに メモリ解放 されるようなので、もしかしたら気にする必要はないのかもしれません。

[構成管理システム]
 ただ、それでも気になります。そこで、 構成管理システム で対応しようと検討を開始しました。構成管理システムでは、以下のような感じで管理しようと考えています。

?@製造したプログラムを以下の項目を指定してアップロードする。
1)プログラム概要
2)システムバージョン
3)プログラムバージョン
4)リリース日
 ・日付指定
 ・即時反映
5)リリース方式(New)
 ・ソース(原本)
 ・不要ロジック削除
 ・暗号化(不要ロジック削除)


細かいことはまだ決まっていないので、割愛しますが、以上の構成管理システムにおいて何が注目点かというと、プログラムは、アップロード後すぐにシステムフォルダに反映されるのではなく、データベースで管理したうえで、指定したリリース日にプログラムをリリースします。以上のような方式だったら、以下の流れで管理することができそうです。

?@データベースで管理する場合は、通常のプログラムソースで管理する
?Aリリース時にはコメント等、プログラムを実行する上で不要なものはすべて削除してリリースする

以上のような方式だったら、プログラムサイズはかなり抑えることができそうです。ただ、いろいろと調べてみると、コメント等を削除した場合、デバックが大変そうです。そのため、テスト環境とかでは、コメント付きプログラムでも動作することができるように、5)にリリース方式を追加したほうがいいでしょう?

[あとがき]
 以上の構成管理システムを今まで コンテンツ管理システム と呼称していたのですが、システム製造開始月は12月予定でした。しかし、コンテンツ管理システムで、コンテンツをリリースするという条件が入ると、そのリリース先を管理するシステムも必要になります。いろいろと頭の中で考えてみたのですが、かなり、複雑なモノになりそうです。

 もうちょっと考えて、再スケジュールしたほうがよさそうです。

 では、また!

2024年02月07日

本番環境の構築検討 〜システム開発研究室〜


 こんにちは!
 ナビゲータのEVEです。
プログラマデスク.jpg
 開発について書こうかなって考えていましたが、関数をクラスに変換する作業だけなので、書くネタがありません。そろそろ、公開環境の整備をしようかなとは思っています。
 そのため、今日は、以前環境を作った時のブログを見直しています。本日は、まず、手順から確認していきましょう!

[構築手順]

■インストール
?@Ubuntu
?AApache
?BPHP
?CPostfix
?DClamAV


 私がシステムを構築する上で利用するプログラムは以上の通りです。
 外部からのすべてのポートを閉じた上で、各アプリケーションをインストール直後にアップデートする流れになります。そして、 ClamAV はインストール直後に構築します。ClamAVがインストールが終わったら、次に Postfix を構築します。 Apache PHP は現時点では、インストール直後のままで放置します。
 それでは、第二弾として以下の作業に入ります。

■セキュリティの導入
?@Apacheのセキュリティ設定
?APostfixの導入(メールのポート開放)
?BSSL/TLSの導入


SSL/TLS を申し込む前に、メールを構築しないとまた時間ばかりかかってしまいます。そして、忘れてはいけないのは、システムとして閉じているポートを開放することです。
以上の作業の次は、実際にやるかどうか、現在検討中ですが、以下の作業をするかもしれません。

?@PowerShellのインストール
?APythonのインストール


当初、ClamAV構築時には、Ubuntuで用意しているシェルを利用するのですが、今後すべてのシェルを PowerShell にする予定です。 Windows でPowerShellをいじったことがちょっとだけあるのですが、Ubuntuで全くありません。事前に調べ、このブログでその調査内容を報告したいと思います。

[あとがき]
 やろうと思った瞬間から、 XServer 上のすべての環境のバックアップを取ろうとしています。主要な所だけでいいかなとは思ったのですが、今まで、中途半端で困ったことが度々あったので、まっ、時間がかかりますが、全部取ることにしました。
 そんな本日、 藤井王将 がまた記録を書き換えようとしています。そのことを昼のニュースで聞いて、実況中継を見ています。他の先生方も日々精進している中、なんで藤井王将だけなぜこんなに勝つことができるのか非常に疑問であるのと同時に、尊敬のまなざしで見てしまいます。天才という言葉で表現できるのと同時に、日々精進している他の先生以上に努力をしているのだと私は思っています。

 では、また!

2024年02月06日

AIを開発で利用する 〜システム開発研究室〜


 こんにちは!
 ナビゲータのEVEです。
人工知能.jpg
 こちらのブログではお久しぶりです。旅行に行ったり、 営業キャッシュフロー の調査に手間取ったりで、今日からやっと通常営業に戻れたっといった感じです。
 その間、プログラムを地道に作っていたのですが、製造する日もあれば、製造しない日もあったりして・・・。土、日に2日かけてプログラムを作るという話もしたような気もしましたが、それも現在は、できていない状況です。
 現在はどうかというと、 中小企業診断士 の問題を解いた合間にメソッドを作るようにしようとはしています。理由は、中小企業診断士の問題を解く作業は、非常に飽きるから・・・。 スマート問題集 は、まだいいのですが、 過去問セレクト演習 は苦痛です。回りくどい紛らわしい悪文(?)を読むのは、10問が限界です。プログラムはそのストレスがたまった合間に製造しようとしています。

[プログラム開発の進歩]
 プログラム開発をするのに、進歩がありました。それは、 ChatGPT を使って開発する手法です。
 今までも、セキュリティとか技術的な話について、まずは相談していました。ただ、それ以外に、プログラム開発で以下のような利用をしています。

?@ PHP5 で使用していた関数の有効性
?Aプログラムの構文に関する質問
?Bデバック

 ?@では、 Prototype EVE で(PHP5)で使用していた 関数 を、 メソッド (PHP8)に変換していて、その作業中に、Prototype EVEで利用していた関数が、 PHP8 でも使用できるのかどうか聞き、同関数の仕様について回答してもらっています。
 これにより、手戻りが少なくなるのと同時に、関数の現状及び今後の予定などを知ることができます。
 ?Aでは、 メソッド 製造しながら、構文について確認しています。Prototype EVEではこんな作りにしていたんだけれど、 EVEシステム ではこうしたいといったケースがある場合、以前なら、デバック環境で動作するかどうか検証確認作業をしてから、実プログラムを作っていたのですが、現在は、とりあえずプログラムを作ってしまいます。作ってから、同プログラムが動くかどうかChatGPTに確認するという作業をしています。作る前に聞ければいいのですが、質問の仕方も難しいですし、メソッドって長くても2〜3百行程度なのでこれが、一番速い製造方法だと現在は思っています。
 ?Bでは、1クラス製造ごとに、全てのプログラムをChatGPTのテキスボックスに挿入し、 デバック しようかなって考えています。ただ、文字数制限があるみたい・・・。4096文字っていうから、メソッドごとになるのかな?ただ、やらないより、やった方が最終デバック楽かもしれない・・・。やろうとしているデバック方式、 ビックバンデバック なのでSIのときかなり手こずると想定されるんですよね?ただ、ChatGPTにデバックを依頼することにより、負荷が軽減されると考えています。

[3つのAI]
 現在、ChatGPT、 Copilot Bard の3つのAIを使用していますが、それぞれ個性的です。
 ChatGPTは理屈っぽい・・・。システム開発には向いているのですが、中小企業診断士の問題とかには使えません。私が望んでいる回答は、 Studying の講義の内容を補足するレベルなのですが、それを飛び越えて、難解な回答になっています。
 それに反して、Copilotは、中小企業診断士で出題される問題に対して、的確に想定の範囲内の解答をしてくれます。しかも、どのWebサイトから参照しているのか、リンクを表示してくれるので、行間の内容が分からない場合など、当該サイトで確認することが可能です。ただ、1つの質問に対して、 5回以上連続して質問できません 。そのため、連続的に質問をしなければいけない、システム開発などでは不向きだと考えて、システム開発ではほとんど利用していません。
 Bardは、まだ使いはじめて間もないので、よくわからないというのが正直なところですが、強いて言うなら、ChatGPTとCopilotの中間に位置するAIだと思います。解答そのものは、Copilotに近いのですが、説明が長い・・・。簡潔な回答をお願いすると、いまいちな回答になるような気がします。

[あとがき]
 各社のどのAIも一長一短で、かつ進化の途中なので、今後も引き続き利用し、どのような進化をし、どれぐらい使い勝手が良くなったのかを日々検証したいと思っています。
 まっ、とりあえず、以前の開発よりは楽になりました。

 そうそう、 TBS が自社システムを、言葉で指定するだけでアプリを自動生成しようとしています。いわゆる生成AIを利用してプログラム開発をしようとしているのですが、ここまで来たかっていう感じです、ただ、これに対して、まだ、懐疑的です。
 日々AIを使っているのですが、AIの回答が100%正しいとは思えません。どんどん深掘りしていけば、間違っていましたって謝ってくるし・・・。
 曖昧なモノだったらいいのですが、プログラムから出力されるアウトプットは厳格さを求められます。特に基幹系は厳格さをもとめられるでしょう?ただ、AIって、使わないと進化はありませんしね???

 そんな記事を横目に、自分は、今まで通りの開発スタイルを維持しながら、AIを利用していきたいと考えています。

 では、また!

■TBSもシステム内製を始めた、決め手は生成AI対応のノーコードツール(日経XTECH)
https://xtech.nikkei.com/atcl/nxt/column/18/02732/012500001/

×

この広告は30日以上新しい記事の更新がないブログに表示されております。

Mobilize your Site
スマートフォン版を閲覧 | PC版を閲覧
Share by: