AI出力のプログラム

こんにちはmtjです。

最近といっても数年前からですがAIでプログラム出力が盛んになってきました。
AIのプログラムはしっかり読んで覚えるべきかどうかが度々議論になっている気がします。

自分は自分の価値を高めたいのなら見るべきだし、作業としてさっさと終わらせるだけなら見なくていいという意見です。
自分の場合は基本読んで理解します、読まずにAI作成プログラムを導入するのはリスクが高いです
見ない人の気持ちも上に書いた通り さっさと終わらせたいならそうすればいいという感じです

上のような話はプログラムをコピペで作るだけという話にも似ているような気がします
読んで理解して書くより 動いている動作をコピペして目的通り動けばいいという考えですが
早いといえば早いけど コードで見たら酷い物になっていると思います、酷いものと理解できるのであればそもそもそういうレベルでコピペなんてしないと思いますが

AIを読まない人の話も コピペでプログラムを作る人の話も システム制作の話を深堀りしていった時にからっぽになってしまうのではないかと思います
自分が面接をしていたら そんな怪しい人は取れない気がします

よく言われていますが 今後はシステム開発はAIを使っている人 使われている人を見極めるスキルが必要になるのかなと感じます
使われている人の場合はシステムがうまく行っている場合は問題ないように見え、速度も早いですが 爆弾を含んでいるような人材になると思います
AIで上手くいかない場合の対処が難しくなり 復旧等も時間がかかり最悪復旧不可のような自体もあるかもしれません。

システムを完成できない人よりも見極めが難しくなるかもしれませんね

OpenVino2021にてモデルをIR形式に変換すると推論精度が低下

もう一月も半ばですが、皆様明けましておめでとうございます。
本年もどうぞよろしくお願いいたします。

内容としては題の通りなのですが、詳細には、
OpenVINO2021にてONNX形式のモデルをOpenVINOの中間表現IR形式(.xml, .bin)に変換し推論を行うと、
ONNXでの推論結果よりもIRでの推論結果は推論精度が目視で10-20%ほど低下することがわかった、
という話となります。

経緯としましては、案件にてPyTorchの学習済みのモデルファイル(.pth)をOpenVINOを使用して推論することとなったのですが、
既存システムで使用しているOpenVINOは2021と少し古いためPyTorch形式の推論に対応しておらず、
対応している別の形式に変換する必要がありました。
既存システムではIR形式にて推論しているため、ひとまずIR形式への変換と推論を試してみたのですが、
その推論結果はPyTorchでの結果よりも精度が低下しました。
そこでONNXへの変換と推論も試してみたところ、ONNXでは精度の低下は見られず、
IRの場合に低下することがわかったという次第になります。

調査したところIR形式はONNX形式よりも若干高速とのこと(※)なので、
推測ですがONNXから変換時にその分ネットワークがそぎ落とされてしまうことがあるのかもしれません。
速度を限界まで最適化したい場合でなければOpenVINOではONNXで推論するのが良さそうですね。


目視では推論速度に大して差があるように見受けられなかったのですが、
以下の記事によると、Yolov5でONNXとIRで推論処理時間に10msほど差があるようです。

【やってみた】ONNX・OpenVinoでYOLOv5の高速化! – 神戸のデータ活用塾!KDL Data Blog

以上です。

帳票印刷ツール

先日行いました案件で、ユーザ様からのご要望で帳票印刷ツール「シーオーリポーツ」を使用しました。

あらかじめ印刷レイアウトを付属ソフトで作成しておき、印刷するアプリからは各印刷要素の文字設定・画像設定・表示有無などをコード上から行って印刷が可能です。

印刷レイアウトをコード上で作成・保守する手間が省けるため大幅な工数削減になります。
とくに、あとから頻繁に印刷レイアウトが変更になるような案件では重宝しそうです。

工場向けの案件では印刷することは減ってきておりますが、検査結果をPDFファイルで残しておきたいなどのご要望はありますので、そのような場合に使用できそうです。

画面遷移の仕方

こんにちはmtjです。

.Netの画面遷移について
デスクトッププログラムを作る上でWebのような画面遷移は悩んだことがある人が多いのではないでしょうか
WPF UWP等を扱わずに初期状態のWinForm等でできる動作としては以下のような作りになると思われます。

1.新しいFormを作る
 画面毎に切り離せるので作りが綺麗にしやすいのと作りやすいです
 移動時に画面が新たに開くのでWebのように見せるためには少し工夫が必要

2.コントロールの表示を切り替える事での動作。
 見た目は1つの画面で遷移ぽく見えるので綺麗です。
 欠点としてはForm側での管理もあるので気をつけないとコードが汚くなってしまう事です。

自分は新しいFormを作り 現在の表示用の画面に中身のコントロールを配置するようにしました
1のForm別の作りやすさはそのままに遷移のように作れるので割とうまくできました。
懸念点としては別Formの物を移動しているので予想外の挙動をするのではないかというぐらいです。

利点としては置く場所さえあればよいので本当の画面遷移のように表示したいFormさえ何かで受取表示さえ行えば上位はほぼ気にすることなく動作を行える点です。
コントロールの時のようにコントロールの表示の切り替え等を作ったりする必要がなく それぞれのやり取りも必要最低限のデータで行えます。
1つのFormで完結していればデータの受け渡しも必要ありません。

結構WinFormでも工夫することで面白い表示が行えるので色々試したいと思いました。
以上です。

ジョークアルゴリズムのスターリンソートについて

皆様寒くなって参りましたが如何お過ごしでしょうか?
自分は先日、自宅にて天井から食卓にゴキブリが降ってくるという恐怖体験に遭遇し、
大の大人が悲鳴を上げました。

それはさておき今回はジョークアルゴリズムのスターリンソートについてです。
ちまちま勉強しているデザインパターンの練習問題でStrategyパターンで
ソートアルゴリズムを実装してくださいと言われ、
数年前に話題になったアルゴリズムがあったなあ、、、と存在を思い出したため記事にしました。

スターリンソート(別名、粛清ソート)と呼ばれるこのアルゴリズムは、
ソ連のスターリンの大粛清になぞらえたもので、
O(N)で動作するソート(?)アルゴリズムです。

配列の要素が先頭から正しく順序通りに並んでいるかを確認し、
順序に反している要素は取り除く(粛清する)ことによって、
配列を順序付けます。
例えば次のような要素を持った配列を昇順でスターリンソートすると、
1, 2, 4, 3, 6, 8, 0, 8, 9, 5, 7

1, 2, 4, 8, 8, 9
となります。

Gitリポジトリにもなっていて有志により各種言語で実装されているようです。
(海外発祥だったんですね)
GitHub – gustavo-depaula/stalin-sort

試しに自分でもC#で実装してみました。


/// <summary> スターリンソートを行います。 </summary>
public static IEnumerable<T> StalinSort<T>(IEnumerable<T> items, bool descending = false) where T : IComparable<T> {
    var prev = items.FirstOrDefault();
    var order = descending ? -1 : 1;
    return items.Where(x => order * x.CompareTo(prev) >= 0).Select(x => prev = x);
}

一時変数とLinqの併用により、すっきり書けました。

ジョークアルゴリズムですが実務で使えるタイミングを捻り出すとするなら、
例えば、正常なら右肩上がりとなる時系列データにおいて
外れ値として直前の値よりも減少したデータが記録されてしまうことがあり、
その外れ値を除去したい、などと言ったケースでしょうか。
純粋なソートとして使うことはないですが、データの正規化では使う機会があるかもしれませんね。

以上です。
皆様お身体にお気を付けてお過ごしください。

温湿度計

弊社で作成する検査ソフトや計測ソフトなどは、結果情報として室温も一緒に測定して残しておくような場合が良くあります。

この場合の室温は厳密な測定値ではなく、一般的な温度計で測定した結果で良いのですが、なかなかベストな機器がなくいつも悩んでいました。
工業用などではあるのですが、高機能で高価な製品ばかりです。
安価なものになると基板剥き出しでRS232Cの結線を行うものばかりになり、このままお客様に収めるには見た目がいまいちです。

そんな中、switchbotの温湿度計を見つけました。安価(2000円くらい)で見た目も良いです。

通信は「Bluetooth LE」を使用します。
まだ案件で使用したことはないのですが、今後のために1台購入して試してみたところ、温度と湿度が測定でき問題なさそうです。
以前にも他のswitchbot製品と通信したことはあるので、実装は簡単に行えました。

今後の温湿度計の部材選定では一番使用することになりそうです。

展示会の大事さ

こんにちはmtjです

仕事上あまり外に出る機会はありませんが いざ展示会等含めて他のシステム、物を見る事は大事だなと感じます。
主にソフトの話にはなりますがやはり別業界のソフト、システムを見ると勉強になることが多々あります。

細かくはその業界での知識になるかもしれませんがデザイン、システム全般はソフトであれば使える、応用できることが多いです。

良いデザインがあればそのデザインを学び、面白い動作であればそれを覚えたり等システムの挙動として覚えることが多かったりします。
コードは見えないので真似する事はできませんがそれ以外ではかなり勉強になる事は多いです。

特にお客さんに提案したりできる事が増えるためやはりそういった外部からの刺激は大事だなと感じます。

URLからhtmlのリンクタグを作成するpythonスクリプト

11月になりようやく肌寒くなってまいりましたね。
個人的にはもう少し暖かい気候が続いてほしかったです。
暑くも寒くもない方が過ごしやすいので。
(先週末記事を書いたのですが、今週は暖かそうですね)

それはさておき今回は題の通り、
URLを与えてhtmlのリンクタグを作成するプログラムを作成した話となります。
ただそれだけのプログラムなのですが、
毎度参考のリンクのタグを手作業で作るのが面倒だったのと、
検索してみたところurlのタイトルを自動で取得してリンクタグを作成してくれるサービスは
特に見当たらなかったため、自前で作成した次第です。

今回は実行のしやすさを考えてpythonのスクリプトで作成しました。

必要なpip

pip install requests beautifulsoup4 pyperclip

作成したコード

import requests
from bs4 import BeautifulSoup
import pyperclip
import sys

# URLからhtmlのタイトルを取得
def get_html_title_from_url(url: str) -> str:
    try:
        response = requests.get(url)
        response.raise_for_status()  # HTTPエラーが発生した場合は例外を発生させる
        # バイナリのcontentを渡してエンコードをよしなにしてもらう
        soup = BeautifulSoup(response.content, 'html.parser') 
        # ページのタイトルを取得
        title = soup.title.string if soup.title else 'No Title' 
        return title
    except requests.RequestException as e:
        print(f"HTTPリクエスト中にエラーが発生しました: {e}")
        return ""

# URLとタイトルからhtmlのリンクタグを作成
def create_html_link(url: str, title: str) -> str:
    return f'<a href="{url}" title="{title}">{title}</a>'

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print("使用法: python create_link_tag.py URL")
    else:
        url = sys.argv[1]
        title = get_html_title_from_url(url)
        html_link = create_html_link(url, title)
        print(html_link)
        pyperclip.copy(html_link) # クリップボードにコピー
        print("リンクがクリップボードにコピーされました。")

urlをコマンドライン引数で与えることでリンクタグが出力されます。
無精のためクリップボードにコピーまで行われます。

試しに前回の私の記事のURLを与えてみると、、、

Microsoft IMEの不具合によるSendKeysの動作不良 | 計測制御ソフト受託開発 インフォテック ブログ

<a href="https://www.infortec.co.jp/blog/archives/Item_3080" title="Microsoft IMEの不具合によるSendKeysの動作不良 | 計測制御ソフト受託開発 インフォテック ブログ">Microsoft IMEの不具合によるSendKeysの動作不良 | 計測制御ソフト受託開発 インフォテック ブログ</a>

と出力され、問題なく動作します。
これでチョット楽できます✌

ちなみに今回のコードはほとんどMicrosoft Copilotくんに指示を与えて書いてもらいました。
普段使っておらず不慣れな言語の小規模なコードを作成してもらうのに、
チャットAIは本当に便利ですね。

おかげで、面倒なちょっとした手作業をpythonやbatで自動化するのも楽に行えます。
便利な時代になりました。もっと便利になって欲しいですね!以上です。

かんたん見積

ご希望の依頼内容を入力頂くと、最短1時間以内に「かんたん見積金額」をご連絡する「かんたん見積」サービスを開始致しました。
無料で見積をさせて頂きますので、初めてのシステム開発でも気兼ね無く安心してご依頼頂けると考えております。

「工場の生産ラインで使用する検査ソフトを作成したい」、「研究に使用する画像処理ソフトを作成したい」、「既存設備のソフトに機能追加を行いたい」など、ご要望がございましたら、まずは「かんたん見積」で見積のご依頼をお願い致します。

趣味と仕事

こんにちは mtjです。

プログラマーをやっている人であればわかると思いますが結構趣味と仕事の内容が被ってきたりします

家でサーバーを立ち上げて何か趣味のWEBサービスを立ち上げたり
それこそ何かのソフトを作ったりまあまああります。

使う知識も仕事で知ったことだったり、趣味で得た知識を仕事でも使ったりします。

そういう意味ではプログラマーという仕事は結構境界が曖昧で使える知識も多岐に渡っているんだと感じます。
ゲームのコントローラー等を自作したりハード関係に波及できたりもします。

覚えて知識を本当に色々なとこで活用できるのでなかなか楽しいですね