SHのC/C++コードのロジック変更なしで性能改善できそうな方法memo

マイコン命令とコンパイラが特殊そうなSHマイコンにて、各種マニュアルを読んで、ロジック変更なしで性能改善できそうな方法memoです。まだ試していません。

対象内容
コードなんでもいいauto変数は4byteで確保する。
CPU汎用レジスタが全て4byteのため、1/2byteを使うと、
4byteからの変換コードが挿入されるため。とくにforのループ回数は効きそう。
コードなんでもいいauto変数はsignedで確保する。
cpuのデフォルトがsignedのため、unsignedを使うと変換コードが挿入されるため。
コード構造体メンバは、使用頻度の高い順で並べる。
コードなるべく「if 0 比較演算子 変数」で判定する。
0と判定だと、CPU汎用レジスタを使わないため。
コード除数は、なるべく1、2byteを用いる。
コードcaseが5個まではif文にする。
コード引数の参照渡し。C++ のみ。値渡しだと引数値がスタックに退避されるため。
これは一般的なハナシ。実際に試すと、実行コードが1ステート減る。()
コード関数の引数は4つまでとする。これは4つまでならスタックを使わず、CPU汎用レジスタに引数を載せれるため。
リンケージoptimize=register レジスタ退避・回復の最適を用いる。
これは不要なレジスタ退避・回復を削除する。
リンケージoptimize=branch 分岐命令の最適化を用いる。
call先が近い場合、call命令でなくgoto命令で飛ぶ。

効果があったら本記事を改定していきます。

法人電話番号の回線選択について

法人設立時、登記上はTEL番号は必要ありません。しかし税や社会保険など様々な書類にTEL番号欄もあり、銀行口座開設には必要だと言われています。 当方も口座開設前にTEL番号を取得しました。IP電話で構いません。昔あった「TEL加入権」なるものは不要です。このとき一つ落とし穴がありましたので、ご紹介いたします。

当初、登記した事務所のマンションで回線が設置済みの、とあるケーブルTVのインターネットを契約し、一緒にTELも申し込みました。TEL番号の地域番号は合わせてくれます。事務所は不在が多いので、個人携帯TELに転送するようにしました。

使い始めてすぐ全く知らないところからTELがどんどんかかってきます。何故か流山市の役所が多い。どうも前に同じTEL番号を使っていた方へのTELでした。どうも福祉関係の業者さんのようです。その方々がTELの変更を周知していないのか、突然廃業したのか定かではありません。業務はeメール連絡なので、業務TELがかかってくることはなく、個人携帯に転送はやめました。

結局、諸事情により事務所は移転しました。その時、ケーブルTVのインターネットは法人だと割り増し料金を取られていたため、それの無いNTTひかりのIP電話しました。TEL番号は変わってしまいますが、区も変わってしまうため仕方ないです。その時、NTTさんに質問しました。

「以前の回線では、前にTEL番号使っていた方への電話がひどかった。なんとかなりませんか?」

NTTさんは、

「未使用になった回線は、2年間空けてから割り当てるようにしています。」

流石、元役所です。

起業時のTEL番号は、未使用期間を確認しましょう。

しかし最近NNTひかりは、2025年にむけて、ファミリータイプ:3,080円 → 5,720円 と大幅値上げにするとお知らせがありました。また回線検討が必要そうです。

RL78のアセンブラ関数でSJIS特定漢字でBuildエラー

RL78にてCコード中に、アセンブラ関数を作り、日本語コメントを UFT8 から SJIS に変更すると特定の漢字でビルトエラーが発生するようになりました。コンパイラは CCRLGCC のほうではないです。

コードは、

メッセージは、

どうも「実施」の文字が引っかかっているようです。昔昔、SJISの特定コードがエスケープシーケンスと被るみことがUNIX上で起こっていましたが、イマドキまさか。ルネサスに問合せしました。コンパイラ購入者でなくとも、ルネサス評価ポードは購入していれば問合せOKでした。購入先の代理店さんをお知らせする必要があります。

ルネサス殿と問答が続きましたが、以下のコードを以下のようにしてくれとのことでした。

違いはわかりますでしょうか? アセンブラ関数でもコメントは C/C++ 形式にするということでした。確かにCCRL取説のはアセンブラ関数のコメント形式は明記されていませんが、サンプルコードは「//」になっていました。。。まさかの結果でした。

SHマイコンのSFR設定は時間がかかる???

SHマイコンの SFR:システムレジスタ も時間がかかるのでしょうか? 前回記事では、割込禁止フラグをアクセスするにはC/C++言語上では一行であっても、アセンブラ(実行コード)では専用のSTR命令を経由し、直接変更できないためステート数を食うことが分かりました。

デバッグ時に、E1エミューレータ等で確認できないタイミングを検証したい時 (もしくはエミューレータ等が使えず表示部がない機器 ) では、余っているマイコンポートに出力し、オシロで計測します。とっても気軽に。SHの場合、どのように実行コードが展開されるのでしょうか?

コンパイラはC/C++ compiler package for SuperH RISC engine family V.9.04 Release 03 (無償版)です。

よくやるデバッグポートやLED反転の場合、 C/C++ だと、

最適化ありでのアセンブラ展開は、

実行コードの展開量が多いですね。SFRをダイレクトに読書きしないのは変わらず。ビット反転なのになぜ分岐が必要なのか? PARを何故2回読むのか? 不思議です。R13 にマスク値を入れるのは、オベランドに固定値を直接指定できないのでしょうかね。

12ステートで総17clock、分岐があるとパイプラインの先読みがムダになるのでざっくり+10=27clock。大体 0.3us という計算です。 RL78や78Kシリーズなら以下のように一行で済むはず。

SHでアセンブラで書くなら以下でいいような気がしますが、、、

BIT操作命令はやや特殊、Bit指定は0~7まで。8以上は第2オペランドをアドレス指定でoffsetを要すようで汎用レジスタだけでは組めないようです。SHコンパイラ、SH CPUはなんか特殊そうですね。旧三菱系のM16C、R8Cもちょっと変でしたけど、、、 やっぱり最後にのこったNEC系に部があるのでしょうか…

XamainのIPAをXcodeでiPhoneに書込む

TestFlight IPAファイル を、App Store にUPLOADする前に、IPAの動作確認したい。Ad HocIPAファイル を作成して、iPhone に書込みたいと思います。前回ではMACの無い方にリリースするためWindows PCで行いましたがとても面倒です。自己開発用なら MAC Book から書きこめます。アプリのエンドユーザさんでも、Ad Hoc の IPAファイルを提供してもらい書込めば、TestFlight の使用期限を気にすることなく、アプリ屋さんにあまり手をかけずアプリ評価が可能です。

MAC BookPro 2015 early
Xcode 14.2
iPhoneX
iOS16.2 デベロッパーモード有効

(1) MAC Book に iPhone をUSBケーブルで接続します。

(2) Xcode をProjectを選択しないで起動し、メインメニューから、Wondow -> Deivce And Simulattors を選択します。

(3) IPhoneの画面が開いたら、画面左側下中断あたりの「」をクリック。

(4) IPAファイルを選択します。選択が完了すると直ぐ書込みが開始します。

(5) 書込みは長くで一分くらい。完了するとアプリとバージョン名が現れます。

iPhoneがデベロッパーモードになっていない場合は以下のメッセージがでます。

手順は以上です。

他のサイトでも説明はありますが図が少ないので、弊方用の手順書として書きました。

M Z-01KをカスタムROM化は可能か?

個人のお客様より問合せがあり調べてみました。

機種名M Z-01K
キャリアdocomo
メーカー/国ZTE Corporation 中国
発売2018
標準OSAndroid 7.1.2 Updateで8.1
通信4G / Wi-Fi

なるほど画面がひらくんですね。特殊な機種ならOSを新しくされたい気持ちも分かります。

ANDROID FILE HOST で調べてみます。

一件ヒットしました。z-01k_prog_ufs_firehose_8996_ddr.zip 、中身が何かわかりません。容量は152KBとOSそのものではなさそうです。解凍すると、.elf という拡張子です。Linuxのバイナリファイル(実行形式ファイル)だそうです。flash書込みのためのになかのようです。GitHubにもヒットしました。

XDA Forum では、ZTE のページがありますね。しかし Z-01K のページはないですね。一件情報あり。しかしROMの情報ではないですね。

LineageOSの公式サイトには、ZTE のページはなし。

Google の自動検索ワードで、「z-01k android10」と出てきますが、実際に検査結果はない。

Yahoo.comに切り替えると少し情報がでてきました。こちら しかしこの手のページはどの機種でもとりあえず作られていて、ROMデータの公開有無など答えが無いものも多々です。

以上の検索結果と、台湾でない中国メーカのオープン性(オリジナルOSプログラムコードの公開がなければ何もできないハズ)と、専用ハードウェアの特殊性からも推察するに、カスタムROM化は厳しそうですね。

さくらのサーバ スタンダードプランでPerl CGIからSSLメールするには? ‘24.3月版

さくらのサーバ でお問合わせWEBページなど、CGIからメール送信したい場合、簡単な方法としてはunixのsendmailコマンドで用いることができます。当方では一旦fileに生成してsendmailにリダイレクトしていました。言語は Perl です。

しかしこれでは平文で送信されてしまいます。ステータスなどの自動送信ならこれで良いですが、個人情報を扱う場合はまずいです。問合せユーザに写しを送りたい場合、gmail にも弾かれてしまいます。

そこで SSL(STARTLS) のメール送信を Perl CGIに仕込もうと記事1記事2 のサイトを参考にさせていただきました。しかし、投稿時期の違いか、契約プランの違いなのかうまくいきません。調査を開始しました。

【課題1】SMTPSパッケージが入っていない/入れられない

さくらのサーバ では、STARTLSを送信するためのパッケージ Net::SMTPS を use 文を書くと実行エラーとなります。当パッケージは入っていないようです。 さくらのサーバに Teraterm から ssh でログインして、Perlの cpan ユーティリティでインストールしてみると以下のように root権限無しでエラーになってしまいます。

しかし、sudo、su はスタンダードプランでは未対応で、VPSプランからのようです。usergrp コマンドもとおりません。そこで以下のようにしました。

  • cpanユーティリティで、Getコマンドで Net::SNTPS をdonwload。
  • Net-SMTPS-0.10.tar.gz を解凍し /Net/Lib/Net を丸ごと /hom/ドメイン/www/cgi-bin の下にコピー。
  • Net::SMTP も SMTPS の基底クラスなので同様にコピー。
  • Net::CmdNet::Config も SMTPS から引用しているので同様にコピー。
  • 対象.cgiに ローカルlibのパスを以下のように追記。
  • STMPS.pm、 STMP.pm にも ローカルlibのパスを以下のように追記。

これで Net::SMTPS を使用可能になりました。

【課題2】SMTPインスタンス生成エラー

SMTPS内の new() から SMTPの new() をcallしてるので、先に基底クラスの Net::SMTP から順当に試そうとしましたが、new時点でインスタンスが空になりました。STMP.pm もローカルに置いたのでいじりやすくなってるので、print文を入れて追ってみましたが分からず。諦めて Net::SMTPS から直接やってみると上手くいきました。 不思議です。以下コードです。

【課題3】auth()メソッドでログインエラー

SMTPSの インスタンス生成後、auth() メソッドでfalseが返ります。これもSTMPS.pm、 STMP.pm にprint文を入れて追ってみました。基底クラスのSMTP auth() メソッドにて パスワードをメールサーバに送ったところで、応答コード 535 でが返ってます。ユーザ名にドメイン名を付与すると通りました。メールサーバはユーザ名だけで通っていた記憶があったのですが、、、コードは以下のとおりです。

応答コードがSMTPS パッケージから見えにくいので状況判断しにくいです。STMP.pm の内部にて一通りチェックしてみると以下のとおりでした。

応答コード状態
220通常コマンド受付
221接続断
250通常コマンド受付
334ユーザ名受付、認証方式受付
535 ユーザ名 もしくは パスワード 不一致

あとはすんなり突破しました。以下コードです。Perlの文字連結は + は効かないんすね。

下図のようにgmailの受信もOKでした。

Xamarin FlexLayout で要素をユーザ操作で移動させるには

弊方では車、バイクの点検記録モバイルアプリを計画中です。点検選択メニューはイマドキはアイコン画像表示でありましょう。Xamarinでは、FlexLayout を採用すると、ImageButtonを流込みで、左から右、右をはみ出す場合は次の行と自動で並べてくれます、端末表示を横方向の場合にも追従してくれます。

アイコンメニューが並んでいると、その順序は変更したくなります。タップしてドラック移動くらい標準で備わっているかと思いきや、それはありません。ドラッグイベントさえありません。マジですか、、、. Xamarinの後継 NET MAUI ではドラックがサポートされるとよいのですが、、、

とりいそぎ順序変更はできるようにします。弊方では以下のように対応しました。

  1. 操作モードに「移動モード」を追加。
  2. 移動モード時に切替えると、上/下/左/右ボタンを表示する。
  3. 移動対象のメニュー項目をユーザに選択させる。選択されているメニュー項目はImageButton boderWidth で境界線を付ければよいでしょう。
  4. 上/下/左/右ボタンのそれぞれに、移動イベントを追加。
  5. FlexLayout では子GUIに対して、追加、挿入、削除のみのサポートです。よって、移動前のImageButton は Children.Removeメソッドで一度削除します。
  6. 削除した ImageButton を再生成し、Children.Insert メソッドで移動位置に追加します。
  7. 後は FlexLayout が自動で並べ替えてくれます。

以上のように一見は簡単そうですが、

  • 現実には、ImageButton だけでアイコンメニューを構築することはないでしょう。弊方でも、メニュータイトルやステータスを付与しているため、それらをまとめる Grid で配置しています。GridやLabel たちのUIインスタンスの管理の必要性が生じます。
  • 画面生成時は全メニュー項目を生成し、移動時は指定メニュー項目を生成できるように、画面クラスのメソッド構造にしておくことも必要です。後から移動を追加する場合は、画面クラス内部の組換えに手間を要すでしょう。
  • メニューの表示順は通常はデータベースに保存することになるでしょう。移動の都度、全メニュー項目の表示順を一括更新することとなります。移動操作が短時間内に素早く行われると負荷が高くくなってしまいます。Sleepでディレイ時間を設けるなど工夫が必要です。
  • 移動確定後に一回まとめDB更新を行う方法もありますが、ユーザ操作も増えてしまいますし、キャンセルや途中でエラーが発生したときのリカバリ処理が面倒です。

以下画面の実行例です。コード例は割愛します。

上下左右ボタンの矢印は、仮で文字の矢印にしてあります。Androidではややチープですが、iOSでは結構見れるクオリティでした。

以上苦肉の策でした。Xamarinの後継 NET MAUI ではドラックがサポートされているとよいのですが、、、

Xamarin ImageButton で画像が一瞬最大化する対策

Xamarin にて、ImageButton をに .cs 使から画像を .Source に設定し画面を表示すると、一瞬ちらっと何かがせ見えます。iPhone より Andoird の方が顕著です。よく凝視すると、ImageButton に載せた画像が、ボタンのサイズを超えて描画されているようです。

GUIシステムの創成期だった1990年代ならまだしも、イマドキこんなあからさまな事象があるなんて。。。HTMLだってそんなことはないでしょう。

以下のようにトライしてみましたがダメでした。

  • 昔よくやったGUI描画中隠し:isVisbile=false して表示寸前で isVisbile=true の効果もなし。
  • 通常のImageでは発生しませんが、Xamarin ではタップイベントが未サポ。
  • NuGetのFFImageLoadingライブラリの CachedImage でも同じ。
  • .cs 内で、WidthRequest で強制しても効かず。

面倒ですが、ImageButton のサイズに合わせて画像を縮小して、設定するしかないようです。しかし画像の縮小は Xamarin.Form では書けないようです。 Android 、iOS側のそれぞれのコードで書く必要があるようです。以下URLにサンプルコードがありました。

https://github.com/xamarin/xamarin-forms-samples/blob/main/XamFormsImageResize/XamFormsImageResize/ImageResizer.cs

上記コードを、Project.Android/MainActivity.cs Project.iOS/Main.cs に、サービスとして分けて実装します。 当方は、.NETのStremクラス に置き替えて実装しました。 実用には各所でnullチェックが必要です。

AndroidのMainActivity.csの場合:

iOSのmain.csの場合:

Xamarin.Form側:

ImageButton を継承して画像縮小付きの新クラスをつくるとベストですね。

XamarinでClickできるLabelを作るには

画面上の任意の文字をクリックしたとき、イベント処理を行いたい場合、素の .NET C# では Label でも MouseClickイベント が指定できますが、Xamarin では Label Clickedイベント がありません。

そこでButton にしてしまうと以下のように背景がグレーになってしまいます。

これは boderWidth = 0 、backgroundColor=page背景色 で一見回避できます。

Button単体ではよいのですが、Grid に表形式に配置した場合、文字部分でけにしかタップに反応しないという問題が発生します。ユーザ側では「反応が悪い」と思われてしまいます。そこでそこでWidthRequst で幅を指定すると、、、

しかしHorizontalOptions =Start  を指定しても文字が中央寄せになってしまいます。文字位置は Panding reight 量を増やして調整します。しかし増やしすぎると文字が見えなくなるため、文字数から計算して reight 量を求める必要があります。確認して背景色の標準に戻して試してみます。

これでタップ可能な Label ができました。後は背景色を戻せばOK。フォント幅は可変長なので厳密にはズレが生じます。文字列描画幅の今日のところ算出まではおこなっていません。厳密に行う方法はあるようですが文字種をカウントして以下の式で「換算文字数」を計算して、フォント幅に掛けてあげると大体合いいます。 各乗数は逐次調整ください。

ユーザさんは「簡単だろ?」「出来て当たり前」と思われるかもしれませんが、様々なプログラミングのフラットフォームにて意図とおり仕様が実現できないことが2回に1回は発生します。特にGUI系は。市販本にもWEB記事にも載っていない。プログラミングにも表には見えない苦労がたくさんあります。