アライメントの画像処理

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

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

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

失敗から学ぶこと

こんにちは mtjです。

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

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

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

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

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

C#のインタフェースでテンプレートメソッドパターン

9月ももう末ですね。
ようやく涼しくなって来てありがたいです。今夏は暑すぎました。。。

最近今更のように少しずつデザインパターンを学習(再学習含む)しています。
学習中にJavaのコードをC#で書き換える写経をしています。

そんな中でAbstractクラスで実装されがちなテンプレートメソッドパターンを
C#の場合はインタフェースのみで実現できることに気が付きました。
(Javaはおそらく完全な実現は無理そうです、
 インタフェースでfinal defaultなメソッドは宣言できないみたいなので)

実現方法は
「C#8.0でインタフェースにデフォルト実装メソッドを定義し、sealedで修飾」
です。

実現例:

/// <summary> 表示インタフェース </summary>
public interface IDisplay {
    /// <summary> オープンします。 </summary>
    void Open();
    /// <summary> プリントします。 </summary>
    void Print();
    /// <summary> クローズします。 </summary>
    void Close();

    /// <summary> 表示します。 </summary>
    sealed void Display() {
        Open();
        Print();
        Close();
    }
}

「C#8.0以降なら似たようなことをできるものの
 C#にはfinal修飾子がないため実現できない」と思っていたのですが、
デフォルト実装したメソッドをsealedで修飾可能なことに今更気付きました。
(というかそもそもメソッドにsealed修飾できることを知りませんでした)

これならデフォルト実装したテンプレートメソッドを
継承先のクラスにより上書きされてしまうことを防げますね。

実際にテンプレートメソッドパターンを実装することはあまりないかもしれませんが、
インタフェースにsealedなデフォルト実装メソッドを宣言可能なことは
知っているといずれ役立ちそうな気がします。

※調べてみると2019年に既に気付いていた方がおりますね。
 もしかして皆さん知っておられるのでしょうか。

Template Method Pattern C# 8.0風味 #デザインパターン – Qiita

以上です。

工場の検査設備PCソフトのリプレイス

先週末にお客様工場のPCソフト更新に行ってきました。

以前に別会社さんが作成されたPCソフトの出来が良くないため、インフォテックで全てリプレイスを行った案件です。

同じような設備が4台あり、元々は設備ごとに微妙に異なるPCソフトを使用していましたが、インフォテックが作成したソフトでは、1種類のソフトで全ての設備が動作するようにしました。バラバラのソフトにすると保守に無駄に時間とコストがかかり、お客様の不利益になるので良くないです。

今回は最後の4台目の設備のPCソフト更新でした。
さすがに4台目になると慣れたもので、旧部材の撤去・新PCの設置・ADとI/Oの配線変更・動作検証などスムーズに進みました。

プログラマーの知識

こんにちはmtjです。

プログラマーという職業はおそらくですがプログラムに詳しいと思われるでしょう
しかし、プログラムに詳しいという事は大体がPC自体の動作に詳しい人達です。

そしてソフトの使用される分野に対しても詳しい人が多いです。
画像処理であれば画像処理の動き、カメラ等の知識
3Dプログラムであれば3D空間の演算等それらの処理
ゲームプログラミングであればゲームの知識

その分野の知識がなければ言われたコードは書けるもののその先に踏み込む事は不可能だと思っています。
なので自分たちは新しい分野のソフトを作る時にその分野の知識も同時に仕入れています。

そういった知識を入れる事を忘れずに 取り残されないようにしていきたいです

VSとMacのペアリング時のメモリ不足をキャッシュ削除により解消

MAUIでiPhoneアプリを開発する場合、ビルドのためにVisualStudioとMacをペアリングする必要があります。
アプリ開発の終盤、そのペアリング時やビルド時にMacのメモリが不足している旨の警告が出るないしエラーが出て失敗することが頻発しました。
その解決方法の共有となります。

タイトルの通り、キャッシュの削除により解決できました。
Windows・Macそれぞれで削除が必要です。

・Windowsでは以下の2フォルダがキャッシュなので削除
%localappdata%\Temp\Xamarin\XMA
%localappdata%\Xamarin\MonoTouch(←こちらはMacの接続先情報なので不要かもですが念のため)

・Macでは以下のフォルダがキャッシュなので削除
$HOME/Library/Caches/Xamarin/XMA

これで警告やエラー出ずにペアリング・ビルドできるようになりました。

以下はキャッシュが溜まる要因の予想です。
・ペアリング時にVisualStudioのバージョンないしMAUIのバージョンごとにキャッシュが溜まる
・異なるPCや異なるプロジェクトでペアリングを行うと、バージョンが異なりがちでその度にキャッシュが溜まる
くらいにふんわり考えています。

若干面倒なのであまりキャッシュ溜まらないことを願っています。
今後は1プロジェクトを改造・保守するのが主なので、上記予想が正しければ大丈夫なのではないかと思うのですが。。。

以上です。

[参考]
Clearing the Broker, IDB, Build, and Designer Agents on the Mac – Microsoft Learn
c# – Can't connect VS2022 .Net Maui Project with Mac – Stack Overflow
macos – I can't connect to Mac with Xamarin Mac Agent from Visual Studio 2015 – Stack Overflow

モバイルアプリ開発完了

長らく行っていましたモバイルアプリ開発が無事に完了しました。

工場向けの生産監視アプリで、設備の稼働状況などを表示したり、設備の設定を行えたりします。
以前にiOS用にXamarinで作成したアプリを、Xamarinサポート終了に合わせて全て作り変えました。
今回はiOSとAndroidの両対応で、フレームワークにMAUIを使用しています。

MAUIがまだ成熟していないので、出来ないことが多かったり、ネット上の情報が足りていなかったりと、想定以上に大変ではありましたが、無事に出来上がりました。

この開発のお陰で、.net6以降用の社内ライブラリと、MAUI用の社内ライブラリが出来上がり、今後の開発の基盤がだいぶ出来上がりました。

システムを検討する難易度と金額

こんにちはmtjです。

自分たちの仕事ではお客さんの要望によってシステムを検討することが多々あります。
そして同時に金額も伝えるのですが その時の精度はそのシステムにどんな機能を付けるか、何が必要かを正確に把握できるかだと思います。

例えばレジの無いお店に 在庫、売上管理システムを入れたい場合にどういうシステムを入れるか
PSOシステムの知識があればまずPOSシステムをイメージすると思います。
そしてPOSシステムにどのような物が必要かをイメージできればそれを最初から作る工数をイメージすればある程度金額の予想はつくと思います。

上記のようにPOSシステムを知っていればそれらのパッケージ等を提案する事もできるでしょう
しかし知らない場合は回りくどい方法で作って無駄に金額が上がるかもしれません。
機能の把握が十分でなく 十分なシステムを提案できないかもしれません。

そういったシステムを提案できるようにするためにも日々IT系のシステム、技術を取り入れる事は大事だなと感じます。

GooglePlayストアページからアプリのバージョンを取得する方法【令和最新版】

はじめに
Mauiのアプリ開発が完了しました。

開発終盤に開発した機能に、
Androidアプリにて現在のアプリのバージョンがストアのバージョンよりも古い場合、
古いバージョンは使用して欲しくないのでアプリを終了し、ユーザに更新を促す処理があります。

処理は以下のような流れで、
0. アプリを起動
1. ストアのアプリバージョンを取得
2. 現在のバージョンと比較
3. 現在のバージョンが古ければ、ストアページに遷移してアプリを終了

この内の1の工程におけるGooglePlayストアからアプリのバージョンを取得する処理についての共有記事となります。
重要なことなので先に言っておきますと、
デバイスによりバージョンが異なるアプリ(大手のアプリの多く、YouTubeやGoogleChromeなどなど)の場合は取得できません。

先行事例
iPhoneのAppStoreアプリの場合、iTunesAPIによりバージョンが取得できるので、
GooglePlayストアにも該当するAPIがないか調べてみたのですが見つからず、
代わりにストアページのhtmlを取得してパースする方法が見つかりました。
Google Playにあるアプリのバージョンを取得したい – すなばいじり

これで解決かと思い、ストアページのhtmlを覗いてみたところ、
どうも記事の投稿時点(6年前)と今とでは形式が異なるようで、
パースする正規表現に関しては考え直す必要がありました。

手法
考え直してC#にて実装した方法が以下のやりかたです。

    /// <summary> ストア上のアプリバージョンを取得します。 </summary>
    public async Task GetStoreAppVersion(string appPackageId) {
        // 毎回HttpClientのインスタンスを作り直すのは良くないそうですがサンプルコードなので
        using var httpClient = new HttpClient(); 

        // ストアページのhtmlをhttpで取得してバージョンをパースする
        var playStoreUrl = $"https://play.google.com/store/apps/details?id={appPackageId}";

        // Getリクエストを投げて、結果のContentをstringで取得する処理(実装省略
        var content = await GetContent(httpClient, playStoreUrl);

        // バージョン部 (?\d+\.\d[\d\.]*): 数字1個以上 ドット1個 数字ないしドット0個以上
        // 一致例:<script class="ds:0" nonce="EssQcMMS9rrE4BPTbLD7PA">AF_initDataCallback( ...... ],[[[1.0.0]],[ ...... );</script>
        var match = Regex.Match(content, @"<script class=""ds:\d+"" nonce=""[^""]+"">AF_initDataCallback\(.+?\[\[\[""(?\d+\.\d[\d\.]*)""\]\].+?\);</script>");

        if (match.Success.Not()) return null;

        var ver = match.Groups["ver"].Value;
        return new Version(ver);
    }

この実装により、数字とドットからなる一般的な記法のバージョンをパース可能です。
※バージョンが特殊な記法の場合はバージョン部の正規表現を変える必要があります。
 また、バージョンがデバイスにより異なる場合も取得できません。
 一般向けの大手のアプリはデバイスにより異なる場合が多く取得できないので、
 残念ながら汎用性はないです。
※正規表現文字列は変数化しようかと思ったのですが、
 VSがいい感じに見やすく色分けしてくれたのでそのままにしました

取得例
例として先行事例での対象アプリ、Nintendo Switch Onlineから取得してみます。
引数appPackageIdに”com.nintendo.znca”を与えてGetStoreAppVersionを呼ぶと、
html内の以下の記述にマッチし、バージョン2.10.1が取得できます。

<script class=”ds:0″ nonce=”EssQcMMS9rrE4BPTbLD7PA”>AF_initDataCallback( …… ],[[["2.10.1"]],[ …… );</script>

ストアのページでバージョンを確認してみると実際に2.10.1と表示されているので、
正しくバージョンを取得できていることがわかります。
(この表示から取得するので、ここに”デバイスにより異なります”と記載されている場合は取得できません。)

おわりに
アプリの更新を促す処理の実装のために、
GooglePlayストアページのhtmlからアプリのバージョンをパースして取得する方法の
令和最新版(24/8/16現在)についての共有でした。

この方法はデバイスによりバージョンの異なるアプリは取得できませんが、
自社で開発するアプリならバージョンを統一できるので問題なく使用できます。

今後は工場向けのモバイルアプリも増えていくかと思いますので、
その開発の際にも役に立つ機能です。

ちなみに更新を促す機能を実装する手段としては他に、
Google Play CoreライブラリのIn-app updates機能を使用して
バージョンチェックから更新処理までの一連の流れを
ライブラリの機能で実装する方法もあるようでした。
おそらくそちらが主流だと思われたのですが、
以下の理由などにより泣く泣く不採用(バージョン取得の方を採用)としました。

・ライブラリの調査にかかる時間が不透明
・デバッグしながらの開発ができず開発コストが増える
(GooglePlayConsoleにリリースビルドしてアップロードしないとおそらくテストできないため)
・iPhoneアプリにて既にitunesAPIでバージョン取得・自前で比較・ストアに遷移まで行っており、
 バージョン取得の方法であれば実装の共通化が可能でその分開発コストが下がる

今の方法だとストアのhtmlの形式が変更される度に
バージョンをパースする部分をメンテしないといけないので、
あまり変更されないと、、、良いな、、、とGoogle本社の方角に向けてお祈りしております。

以上です。

KOM-MICSの紹介動画

インフォテックがコマツ様と協力して作成している「工場見える化システム KOM-MICS」に関する、ものづくり太郎さんの紹介動画がアップされました。
https://www.youtube.com/watch?v=PSxVDmUP5hw

インフォテックの作成するソフトは普段はあまり表に出ないため、このような紹介動画が作られるのは初めてです。

KOM-MICSは、工作機械や溶接機などから稼働データや加工データなどの各種データを収集し、分析することで工場の稼働状況を可視化し、最適化に向けた施策立案を支援します。
生産プロセスの見える化と最適化により、コマツグループの生産性向上に大きく貢献しています。もし工場の見える化や改善活動に興味がある方は、ぜひ動画をご覧いただければと思います。

また、インフォテックのKOM-MICSサイトにも情報を記載しております。
https://www.infortec.co.jp/lp_kom-mics.php