画面遷移の仕方

こんにちは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サービスを立ち上げたり
それこそ何かのソフトを作ったりまあまああります。

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

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

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

Microsoft IMEの不具合によるSendKeysの動作不良

1. はじめに
つい先日、Windows10の特定モデルのPCにて、
プログラムからキー送信を行うのAPIであるSendKeysを使用した機能が動作しない、
という不具合が報告されてきました。
その原因及び回避方法が特定できましたので、その共有となります。

2. 原因
原因はタイトルに記載していますが、おそらくMicrosoft IMEの不具合で、
IMEが半角の場合にSendKeysが動作しないことがあるようです。
(IMEが全角の場合は動作することに気付き、原因に辿り着けました)
Windows 10 version 2004 以降の新しいIMEにはどうも不具合があり、
PCによっては入力時などに問題が発生することがあるそうです。

3. 回避方法
問題を回避するには、
IMEの設定にて「以前のバージョンの Microsoft IME を使う」をオンにすることで回避可能となります。
これによりIMEが半角時でもSendKeysが動作しました。

このIMEの設定は以下のレジストリを変更することでも設定可能です。
> レジストリキー:HKCU¥SOFTWARE¥Microsoft¥Input¥TSF¥Tsf3Override¥{03b5835f-f03c-411b-9ce2-aa23e1171e36}
> 名前:NoTsf3Override2
> 種別:DWORD値
> 値:1
次の記事から引用させていただいております。ありがとうございます。
「以前のバージョンのMicrosoft IMEを使う」をコマンドで変更する方法を検証してみた : ITインフラに悩まされてる日常

上記設定のレジストリ値は、
・管理者権限なしでプログラムから編集可能
・PCの再起動なしで反映可能(IMEのプロセスの再起動により反映)
のため、プログラムからも容易に設定変更可能です。
なのでこの回避方法は、人手による設定変更なしでプログラムだけで完結できます。

4. おわりに
最初は全く見当が付かなかったのですが無事解決して良かったです。
調べている過程で知ったのですが、
どうもSendKeysはWindows10以降まともにサポートされていないようです。
PCによっては動作しないことがまれにあり使用は非推奨である旨の書き込みをちらほら見かけました。
そのため、今回の件もMicrosoft IMEだけが原因でなくSendKeys側にも問題があるのかもしれません。
今後はSendKeysの使用には慎重になろうと思います。

参考:
「以前のバージョンの Microsoft IME のご使用について | Microsoft Japan Windows Technology Support Blog
Windows10の「Microsoft IME」を以前のバージョンに戻したら、ソフトの挙動が安定した話。 | メモノローグ

アライメントの画像処理

ウェハなどの対象ワークの検査を行う前に、位置や傾きのアライメント(位置合わせ)を行うことが良くあります。
アライメントを画像処理で行う場合、調整する4点を求めて射影変換を行うことが多いです。

今回行った案件では、2点だけ求めて簡易なアライメントを行うため、アフィン変換を使用しました。

社内ライブラリで内部的にアフィン変換を使用することはありましたが、ライブラリのAPIとして外部から実行出来るようになっていなかったので、今回APIに追加を行いました。1点から3点の任意点数でアフィン変換が行えるようになっています。

失敗から学ぶこと

こんにちは mtjです。

失敗から学ぶということで ソフトは基本失敗から学ぶ事が多いです
なので自分は成功事例も失敗事例も色々な物を見ています、開発秘話等の難しかった所等を見るのはかなり好きです。

そういった事例を蓄えておくことで事前に収集しなければいけない情報もわかるようになります
その情報を元に発生するかもしれない動作以外の問題について対策していきます

よくある話だとサーバーのログイン関連でしょうか
同時にログインされる想定人数等を元にソフト、サーバーの規模等を決めていきます。
同時に約10人しかログインしないサーバーに1万人規模のログインサーバーを建てる必要はないので

それ以外にもサーバーであれば今後のスケール等を元にそういった実装も加えていくのもいいかもしれません

というように設計は経験、知識で要求機能以外の問題点を確認していくと思います。
自分は同じ業界の友達とニュースになったような不具合等で雑談する時もあります
いろんな業界の人がいるので勉強になることも多いです。