Swift Windows版は役にも立つのか?

前回記事では、SwiftアプリをWindows上で開発することはできませんでした。

しかしWindows用のSwiftがリリースされていました。ビルド確認、単体テスト(UD)がある程度できるのかもしれません。

ここからインストーラー.exe をダウンロードして実行します。まずまずのサイズですね。

インストールするとプログラムメニューにはなにも現れず、プログラム一覧のみに現れます。

コマンドラインでたたいてみると、反応がありました。

どうもIDEはなく、言語エンジンだけのようです。インストール先をみると結構いろいろ入ってます。UNIXライクなProduct構造のようです。

とりあえず説明はなにも見ず、MACからコピーしたXcodeプロジェクトに行って、Buildしてみます。

Xcodeの.project は対応していないようです。Swift.pakage という定義ファイルが必要なようです。コマンドラインの応答から、推測でコマンド swift package init を打ってみます。

専用のパッケージ構造のスケルトンができるようです。つまりXcodeとはなにも関係がない。Swift.pakage は自動生成されます。中身は、

ソースもスケルトン生成されているので、Xcode と同様にSwiftコードを書いて、build見ますしてみます。

Appleの基本的なオブジェクトは無い?? import Swift-UI を書くと、no sudh module になります。ちなみな実行時は、swift run です。スクリプトっぼく print(“Hellow Swift”) も、fatalError となります。

公式ページに「 we were able to use macOS as a development platform with Xcode as IDE, and then use the agility of CMake to build the same code on Windows.」 とありますので、Xcodeと互換性をもち、cmake をつかってWindows上でもつかえるとのことなので、何か設定があるのでありましょう。

今回、直ぐにも使えるものではないと分かったので、諦めてMAC上の開発で集中します。

SwiftサードパーティライブラリをXamarinに取込む’24.5月Xcode14.1+vs2019Mac編

前回は、Xcode 15.1 と visual stduio 2022 for MAC で試し失敗しました。

一世代古い Xcode14.2 と Visual Stdio 20192 For MAC での組合せを確認します。

手順は同じですが、結果は変わりました。

いずれも Visual Stduio 側でダメです。NuGet で何か他にないか探すと少しでできましたが、いずれも古くて使えなさそうです。

以上、SwiftサードパーティライブラリをXamarin に取り込むのは、簡単にはいかないようです。Flutter はどうでしょうか? しかし調査時間がありません。しかたなくXcode + Swift で進めます。

iOSサードパーティライブラリをXamarinに取込む’24.5月Xcode15.1+vs2022Mac編

使いにくく品質の不安定な MAC / Xcode / Swift を避け、安定したWindow / Visual Stduio (Xamarin もしくは MAUI) で開発できれば効率向上します。appleの基本APIクラスライブラリは、Xamarinソリューション下の project名_iOS の中で、C#インターフェイスで呼び出せるようになっています。(apple一辺倒の方はこれをあまり知らないようです)

しかし、Swiftサードパーティライブラリ はこれに含まれていませんこれを解決する方法は Microsoftサイト 「iOS Swift ライブラリのバインド」 で説明されています。これを試してみました。結論としては、調査時間制限もあり上手くいきませんでした。どこまで何を確認したかの記録、ぜひ試したい方へのヒントになればと思います。海外含め「iOS Swift ライブラリのバインド」は情報がほとんどないのが実情でした。

記事は2、3年前に作られた記事のようですが、たまに更新されていたりします。現時点は ‘24.4月更新です。自動翻訳のせいで、Xcode の画面語句が日本語になってしまっていて難解さを増しています。Xamarinの後継MAUIについては取り立て説明はありませんでした。

Xcode15.2、Visual Stdiuo 2019 For Mac

iOSバインド記事メインページからリンクされている 「チュートリアル: iOS Swift ライブラリをバインドする」に従い進めます。ザックリとした手順は以下の通りです。

(1) Xcode にて サードパーティライブラリのframeworkプロジェクトを作成する。ここでTerm名noneにしないと後々ビルドでエラーがでます。

(2) 上記プロジェクトに、サードパーティライブラリを追加する。

(3) Geberal -> Framework and Liblaries にてサードパーティライブラリを”Do Not Embed” にします。

(4) BuildSetting -> All -> Build Options -> Allways Embed Swift Standard が no であることを確認。MS記事の bitcode は古い記述の模様。

(5) BuildSetting -> All -> Swift Compiler General -> General Header nameproject名-swift.h であることを確認します。

(6)公開したいクラスとメソッド定義を新規Swiftコードfileで作成します。引数型はSwitfとc#の型の互換性を確認し記述します。

( 7) メニュー Product -> Schema -> Edit Schema からダイアログを開き、Run > Build Configration でを release に変更します。

(8) MAC で、xodebuild コマンドを使ってビルドします。iOSシュミレータと実機用をビルドしxcframeworkに統合します。弊方は以下shスクリプトにまとめました。

以下の folder ができました。

(9) 古いMS記事では、lipo コマンドを使う記述がありました。同コマンドは実行バイナリコードの統合を行うものだそうです。 この統合は xcodebuild でも行えるようです。

(10) MACで、Objective Sharpie ツール をダウンロードし、MACにインストールします。これはMicrosoftがMAC用に作ったもののようです。これでC#とのリンク情報を作成する模様です。

(11) Objective Sharpie ツール を実行します。弊方は以下shスクリプトにまとめました。

以下の folder 下に .cs が生成されるようです。

(12) Visual Stduio 側でXamarinソリューションを作成し、iOSバインドライブラリのprojectを作成します。これ以降の操作はWindows版でも出来たと思います。

(13)上記(11)で生成された2つのfileを、ネイティブ参照にインポートします。コピー先はバインドライブラリの直下だったかもしれません。

(14)上記(1) のXcodeプロジェクトをネイティブ参照に設定します。

(15)Xcodeプロジェクトの設定を変更します。リンカーフラグの設定もしましたが最新情報ではないかもしれません。

(16)Xcodeプロジェクトの以下file設定を変更します。

(17)バインドライブラリを、アプリ本体側で参照設定します。

いちおうこれでMS記事の手順はできました。C#用インターフェイスを定義して、サードパーティライブラリを紐づけすればよいという感じのようです。バインドしたライブラリに対して、VS2022側でメソッド自動表示か応答するようになりました。

XamarinのiOSプロジェクトをビルドすると「Microsoft.iOS が無いというエラー」が発生します。下記CCLocationはiOSの位置情報クラスですので、Microsoft.iOS とはiOSライブラリのラッパーか何かのようです。

以下のようなエラーも出ます。

Microsoft.iOS を探してきて無理くり参照させると、

Apple側でなにか支障が生じるのではと予想していましたが、Visual Studio側で色々な矛盾が生じているようです。おそらくMAC OS、Xcode、Visual StudioとXamarinと周辺ライブラリのバージョンの組合せを一致させる必要があるのかなと思います。しかしその組み合わせはどこにも記載がありません。

次記事では別の組合せをためします。

Swift-UIでタイマで画面遷移する ‘24.5月編

Swift-UI にて、一定時間を待ち別画面に自動遷移する方法が、他記事に見つからなかったのでその覚え書きです。Xcode 14.2 です。

スプラッシュ(起動画面)中に特に時間がかかる初期化処理もなく、一瞬しかスプラッシュが見せれない。スプラッシュにはお客さんが作成したロゴとキャラクタを表示するのでこのままではまずい。しかしSwiftの画面遷移は自由度がないといったシチュエーションです。

更にスプラッシュにBackされては困ります。iOSではBackボタンがなくても、スワイプ操作でBackできてしまいます。

ます view の画面定義内でif文で分岐するという他言語では異常すぎるコードを書きます( 下図中※1 )。if文には任意のstate変数を定義して参照します。( 下図中※2 )

import SwiftUI
import Foundation
	
struct カレントtView: View {
    @State private var isActiveNextView = false     // 次画面遷移有無 ※2

    var body: some View {
         /* 次画面へ遷移する場合 ※1 */
         if isActiveNextView == true {
	            次のView() 	//  Memo: 次Viewを直callするとBack無効にできる ※1
         }
         /* カレント画面の場合 */
         else {
              VStack {
                     :
   	         カレント画面の定義
                     :

あとはvew表示イベントに待ち時間でTimerを仕掛けて( 下図中※3 )、その時間経過後、state変数値を変更します。( 下図中※4 )

   private var splashTimer: Timer!                 // 起動待ちtimer ※3
                     :
                   中略
                     :

             VStack {
                     :
   	           カレント画面の定義
                     :
             }
             .onAppear {
                  Timer.scheduledTimer(withTimeInterval:5.0, repeats: false){ _ in  // ※3
                      isActiveNextView = true    // 次画面に遷移 ※4
             }
         }
     }
}

違和感ありありですが仕方ないです。

なおコード表示には、Code Block Pro を使用させていただいたいてます。

Execlセル内でハッシュする

外部に提出しないExeclは効率UPのため2003を使用しています。最新のExeclでは、base64 エンコードくらいあるかと思っていましたがないんですね。win32APIを動的callできますが、Visual Studio 6 でインストールされる VB6用Declare 宣言をまとめた winapi32.txt に入ってない。手打ちは面倒なので検索すると、https://gist.github.com/rmdavy/db7cb6d81cc487172a86430f68633a21 に公開されていました。セル内使用に特化させ、コードが見にくい、エラー処理不足、32bit対応を直したので、ここで公開いたします。

しかし CryptAcquireContext 系は現在非奨励で、新しいのを使えとMicrosoft公開情報に掲載されています。いずれ調べたいと思います。

Execlセル内でbase64エンコードする

外部に提出しないExeclは効率UPのため2003を使用しています。最新のExeclでは、base64 エンコードくらいあるかと思っていましたが、ないんですね。「Execl base64」で検索してもあまり出てこなかったので、マクロExecl .xlm で作成しました。

Win32 APIの暗号化ライブラリで、API:CryptBinaryToStringA があったのでそちらの .dll を動的参照います。使用します。1コールでいけます。コードは以下の通りです。2003や32bit版offsice ビルドスイッチで切り分けています。URLセーフ(URLで使えない記号を置き替え、%xxのURLエンコードとはだいぶちがう) は、APIないので作りました。VBAエディタで「標準モジュール」に挿入します。

ちゃんとAPIエラー、引数エラー、VBエラー検出も組込みましょう。ネット上のサンプルはそれがあまりできていないようで実用上問題です。Execlの記述は、

Google Testとは? その1

複数のプラットフォームで稼働するといわれている Google Test とはとんなものでしょうか? 単体テストツールということは存じています。

昔昔、PCはおもちゃで、高価なUNIXワークステーションでソフト開発をしていました。当然一人一台はありません。マシンでの作業の手戻りを少なくするため、単体テストは重要度が高かったです。しかし近年PCは一人2台以上、クロスプラットフォーム、OSシュミレータ等々あり、(新人さん以外は)どんどん作って動かした方が効率的ともいえます。

しかし組込みソフトは、基板が未だできていない場合、基板が全員分無い、実行時間と人の時間の差が大きく、実機リソースも小さいため、実全てのパスを通しそれを確認することが難しい。そこで自動車業界では、WinAMS がよく使われます。PC上でマイコンレスでコードレベルの検証を行うものです。GUI上で引数を指定して関数単位で実行しカバレッジを収集します。テスト項目の自動生成もある程度できていたかと思います。しかしとても高価です。

もちろんUNIX系でGUI無し以外では、このような場合 Google Test (以降 gtest と呼びます)の出番なのかと。GUI無しぱっと試した感じ以下のようでした。

テスト項目や条件、実行は人が行う必要があります。

いわゆるドライバ、スタブ(モック)の標準機構といえそうです。デバック用に関数の呼出しと結果判定、スタブの呼出しと切替えのための各種機構と部品がそろっているプラットフォームと言えます。ですから覚えることは色々あるようです。

C++ は gtest に合わせて少し直しが必要そうです。

基本は git-hub から落としてビルドする必要があります。テスト対象との結合方式は ライブラリ( XXXX.a もしくは XXXX.lib )。うまくできてたか心配になります。

基本結果はコンソール出力です。GUIアプリにマージできなくもないとは思いますが、イベントドリブン的な感じではなさそうです。

Visual Stdio 2019でも含まれていました。この場合はWindows上から直接実行できます。しかし2018くらいのバージョンの模様です。

Visual Stdio 2019でということで以下試した結果です。いつものプロジェクト作成から選べました。

スタテックリンクするかdllか聞いてきます。

しかしスタブ(モック)機構が Visual Stdio 2019 は入っていないので、NuGetからパッケージを入れます。mockとのネーミングとなっていますが、gtest 本体も含まれています。

インクルードとlibパスは手動で追加します。gtestのみのパッケージ、プロジェクトフォルダ\packages\Microsoft.googletest.v140.windesktop.msvcstl.static.rt-dyn.1.8.1.4 は参照しないようrenameしておく。

実際のコードです。Performance クラス の Acceleration メソッドのテストにて、Acceleration 内て呼び出している Parameter クラスの Speedメソッド と Weightメソッドを、テスト用に固定値を返すようにしたものです。クラス図を以下に示します。

コードは以下に示します。説明はコメントをみてください。

test_main.cpp:

test_class.h:

test_class.cpp:

Mock_class.h:

以下、実行結果です。

なるほど。UNIXサーバ上でtターミナルでログインして開発していたころを思い出します。


その他 gtest に付随して、カバレッジの取得と、カバレッジのhtmlでのビジュアル表示なども可能です。Mockについては、クラス化が前提となってるのが難点ですが、必ずしも使わなくてもよいです。何分、高価な単体テストツールを投資せずカバレッジがとれるので、組込みソフトの机上デバッグに最適かと。もしも急いで動かしたい方は、ぜひこちらよりご相談ください。

Xperia Z3 tablet Compact Wi-Fi版をAndroid11当にupdateする2 ‘24.4月編

前記事では基本的なセットアップを行いました。ここでは動作確認した結果の問題点を報告します。

LTE版のSGP621、後継10inch版の Z4 Tablet でも少し危うい感がありましたが、Wi-Fi版 SGP612 では完全にGPSが動作しません。うんともすんともです。以下、GPSTestアプリの実行です。

以下のROMを試しましたが全てダメでした。

  • lineage-18.1-20230301-4microg-CUSTOM-WiFi-z3tcw.zip
  • lineage-18.1-20230428-UNOFFICIAL-z3tcw.zip
  • lineage-18.1-20231011-4microg-UNOFFICIAL-z3tcw.zip
  • lineage-18.1-20240321-microG-UNOFFICIAL-z3tcw.zip

iode-2.15-20230927-z3tcw.zip は試さずですが、祖先は同じでしょうから無理でしょうね。

一度純正ROMに戻して、ダイアル #*#*7378423*#*# によるfactorytestモードで確認してみます。衛星は見つかってますね。ハードウェアの問題ではないといえます。

海外の情報を調べてみます。有名な XDA に SGP621 – GPS can not found any statlites custom ROM というスレッドがありました。このスレッドは、2016年から始まっており、2023年10月21日の記事でも “does not woek” と投稿があります。最終的には改善したという投稿はなかったです。かなり潜在的で長期的な問題であるようです。

ストレージ容量の違うSGP611では動作したという投稿もありました。推測ですが、Wi-Fi版とLTE版でGPS制御方法が違うのではないでしょうか? それを合わせこもうとすると、調査とプログラミングで数日でできるようなハナシでは無くなります。費用体効果からみても誰もやらないのでしょう。SGP612ではGPSは諦めましょう。Z3 tablet Compact でGPSをどうしても使いたい方は、SGP621を手に入れるのが賢いでしょう。

FMラジオの周波数が表示されないです。どのみち周波数バンドが海外になっているので追及しても仕方ない感じです。とおもいましたが起動2回目で表示されるようになるようです。


カスタムROMは有志の方が作られたもので、メーカのような開発体制はありません。制約があって当然です。少し都合が悪くてもそれ理解しありがたく利用しましょう。

Xperia Z3 tablet Compact Wi-Fi版をAndroid11相当にupdateする1 ‘24.4月版

前回 Xperia Z3 tablet Compact LET版(SGP621) をAndroid11相当にupdateしました。Wi-Fi版もほぼ同じであろうと依頼を受付けた結果をレポートいたします。


  • 対象機種:SGP612、Wi-Fi版、ストレージ32GB。
  • GPSは使えなくなります。詳細は後術。
  • ラジオは使えなくなります。詳細は後術。
  • *#*#7378423*#*#から呼出す端末専用のサービスメニューは使用できなくなります。

各種用意するツールやROMデータは公開状況が日々変化します。当方は以下の構成で行いました。当方から配布はできないため、くぐって入手してください。https://androidfilehost.com/が主な入手先です。

Bootload unlockとリカバリ書換用アプリflashtool-0.9.36.0-windows.exeWindows用書込みソフトのインストーラです。GUIアプリ、Xperia用USBドライバ、CUIコマンドを含んでいます。
root化イメージ不要xperiaはroot化不要です。
Bootloader Unlock禁止の解除不要Wi-Fi版は出荷状態で「Bootloader Unlock Allowed: Yse 」です。
bootイメージboot.imgOSイメージを解凍し取り出す。
カスタムリカバリpbrp_9.0_z3tcw.imgPitchBlack Recovery 。twrpはOSインストールでエラーが発生した。
OSイメージLineage-18.1-20240321-microG-UNOFFICIAL-z3tcw.zipいつものLineageOS。Android11互換。
OpenGappopen_gapps-arm-11.0-mini-20220215.zipArm32 bit用。パッケージはLTE版16GBでは「stock」 まででしたが、こちらは「mini」 までupできます。’24.9月ではGoogle Playが動作しない可能性あります。詳しくは SGP771の記事を見てください。

他のサイトでも多数説明されているため、分かりにくい部分、異なった部分を説明したします。

① サービスメニューの呼出し

LTE版は電話アプリがあるため、サービスメニューの呼出し番号「*#*#7378423#*#*を迷わず入力できますが、電話アプリの無いWi-Fi版ではどうするのでしょう。以下の手順でした。番号は同じです。

上記から、Services -> Configuration を開くと、「Bootloader Unlock Allowed: Yse 」が確認できます。LTE版と異なり、IDID IMEI で同じ意味を示すようです。メモっておきます。

尚、この端末情報には、「ETC Software version」という項目があり、「1287_1605_4」と「1287_1605_5」のものが見受けられました。セッティングには影響はない模様です。

② Bootloaderロック解除コードの取得

Sonyサイトにて機種とIMEIを入力し、Bootloader unlockの解除コードを発行します。機種の選択は、Wi-Fi版とLTE版は共通でした。

この後、2つの「🔲I acknowledge … 」にチェックを入れて、submit ボタンを押します。この後、ボット判定のためのダイアログが表示されます。LTE版のときは無かったような、、、 足し算の結果を入れますがNGで弾かれます。間違いようのない計算ですが何度やってもダメ。内部的に当ページが閉鎖したのでしょうか?

Stack Overflow に同様のお悩みが記載されいましたが、解決方法は未記載。カンどころで、ブラウザを Firefox から Edge に変えると、機種画像が表示されるように改善されましたがコード生成の同じ。 Chorme に変更すると、なんとボット判定がスキップされ、解除コード生成が成功しました。サーバ仕様が変わったようです。【これは’24.9月まで】 ‘24.10月以降では、Sony Developer に登録が必要なようです。登録はどなたでも可能なようです。登録時間は5分程度です。

③ Bootloaderロック解除

この操作は今までと同じでした。 解除の後、USBケーブルを抜いて電源ON、SONYロゴの後、Androidのロボット画面がしばらく表示されます。その後、再びSONYロゴが表示、初期化処理が行われ、OSが起動します。サービスメニュー -> Services -> Configuration を開くと「Bootloader Unlocked : Yes」の表示を確認します。(下図)

尚、Bootloaderロック解除後、純正ROMに戻すと「Bootloader Unlock Allowed: Yse 」に戻ってしまいます。そこでもう一度Bootloaderロック解除すると fastboot GUI版 はどこかからロック解除コードを取得しロック解除します。端末のどこかに記憶されているのかもしれません。

④リカバリの書換

fastbootでリカバリを書換えは成功しますが、Volume Down + 電源 ボタン でリカバリーが起動しません。一度純正ROMに戻してみても Volume Down + 電源 ボタン で純正リカバリーがも起動しません。 SONYロゴ横のLEDが黄色に点灯するだけ。他のWEB記事を拝見させていただくと、どうも boot.img の書換が必要みたいです。boot.img は、OSの.zip の中から取出し、電源offから VolumeUP + USB接続し、SONYロゴ左のLEDが青に点灯した状態で、以下のように fastbootのでbootを書換ます。

このあとリカバリPitchBlack Recovery を書きます。この操作は今までと同じでした。 失敗するとリカバリが起動せず、SONYロゴ画面が繰り返し状態になりました。一度 twrp-3.0.2-0-scorpion_windy.img を書いてみてそちらの起動を確認した上で、PitchBlack Recovery をもう一度書くと起動するようになりました。リカバリを認識すると SONYロゴ横のLEDが緑点灯青点灯します。このタイミングでボタンから指を離します。

⑤ OSの書換

これでVolume Down + 電源 ボタン でリカバリーが起動するようになりました。リカバリは当初TWRP公式サイトに置いてあった twrp-3.0.2-0-scorpion_windy.img を使いましたが、OS書込みで下図エラーが出てしまいました。

古いVersionもNG。ちなみに scorpion_windy とは Z3 Tabblet Compact Wi-Fi版のコードネームらしいです。z3tcw w は Wi-Fi版の意なのでデバイスの認識は合ってそうですが、、、代わりにPitch Black Recovery: pbrp_9.0_z3tcw.img を見つけて書込みし解消しました。Pitch Black Recovery の使用方法は、TWRPその他とほぼ同じです。左下がOS書込み成功時の画面です。ここで一旦OSを起動して確認します。初回起動は5分程度かかります。問題ないようです。(右下図)

⑥ OpenGappのインストール

Open Google Appは、これまでZipにてリカバリからインストールしていましたが、アプリ版ができたようです。試してみましたがうまくいかず。

これまでどおりZipにてリカバリからインストールします。Wi-Fi版は32GBと容量が大きいのですか、miniパッケージまでしか入りませんでした。(左下図) アプリのイントール状態は右下図のとおりです。


これで一旦セットアップが完了しました。予想よりLTE版との違い、環境の変化もあり、冷や汗ものでした。

以上、Z3 Tablet Compact Wi-FiをAndoroid11相当にUpdateできました。しかしながら自分でやるのはメンドクサイ、忙しい、自身が無い方は、弊方でセットアップをお受けいたします。Xperia Z3 tablet Compact Wi-Fi版は難易度低、約1.0時間の個人様向け工数+事務費で税込3,500円~ 。ご相談、依頼はこちらから。

動作確認編パート2につづきます。

ライディングパンツのウエストを紐化する

趣味や得意なことを事業化できれば効率的です。簡単な自動車用品を加工をできないか模索しています。


ライディングパンツのウエストサイズは、インチの1つ飛びが多いです。例えば、28インチ、30インチ、32インチと。。。よって無いサイズは一つ大きいのを選ぶことになります。しかしライディングで前傾が強いとベルトは邪魔です。ベルト自体を使わない方もいらっしゃるでしょう。

プロテクターパンツを中に履く場合は、丁度よくなりますますが、街乗りではプロテクターパンツまでは履かない。プロテクターパンツを履く場合がある方は、ウエストを縫って詰めるのは避けたい

ベルトでなく、状況に応じて調整しやすくするには、、、ヒモ縛りに加工すればよい。

以下は、RSタイチ 30インチの加工例です。ヒモが外側に見えないよう内側出しとしています。

ベルト部の内側が、後ろセンターで縫合されていないタイプならヒモを通せます。スラックスなどは後ろセンターで縫合されていますが、ライディングパンツなどチノパン的なものは大抵縫合されていないです。ボタンの受け側と同じように、ヒモ入口は手縫いで外周を覆ってほつれないようにします。

ヒモは細すぎると役にたちません。ある程度丈夫で柔軟がありヒモは中々ないです。パンツと色も併せたいです。北陸に編み模様と太さを指定して作ってくれるヒモ屋さんがあり、パンツ柄に合わせて迷彩、太さ8mmでお願いしました。ただし5mからなのでどうしても余ってしまいます。

RSタイチ以外に、HYODOマックスフリッツなども、ヒモ仕様の加工を施しています。

ご興味のある方で自作は面倒な方はこちらまで。