プログラミングの最近のブログ記事

IAR printf via SWO

| コメント(0) | トラックバック(0)
STマイクロのとあるMCUで開発をしているのですが、IARのEmbedded WorkbenchにてSWO経由printfが全く出力されないという状況に困っていました。

STM32CubeIDEだと問題ないことに気付いたのですが、何かregister設定値に違いがあるのかと思えばそうでもなさそう。

stdioの実装に問題があるのかと思い、とりあえずSEGGERのサンプルを試したところ、SWO_PrintChar()とSWO_PrintString()は出力できると判明。

これはいよいよライブラリの改造かと思って__write()かなと調べていくと、ライブラリオプションの「バッファターミナル出力」だけが原因だったという結論に辿り着きました。

まさか文字化けどころか全く表示されない原因がバッファ処理だったとは思いませんでした。

IAR Embeeded Workbench library option "buffered terminal output" might fix the issue of no printf terminal output via SWO.
ちょうど困っていた時に行き当たったネタです。report descriptorのサイズとか、mapファイルだとアライメントされますので。
https://okwave.jp/qa/q1823289.html

__LINE__を入れることで複数箇所からも使えますとのことだったのですが、実際に使うともう一段階深める必要がありました。でも目的は達成できましたので感謝!

#define PRINT_SIZEOF(type)    PRINT_SIZEOF_(type, __LINE__)
#define PRINT_SIZEOF_(type, line)    PRINT_SIZEOF__(type, line)
#define PRINT_SIZEOF__(type, line) \
  void print_sizeof_##line() { asm volatile ("size of " #type " is %0" :: "g"(sizeof(type))); }

Visual StudioとLLVM

| コメント(0) | トラックバック(0)
MicrosoftのCEOが変わってからVisual C++も頑張るようになりましたが、それでも未対応のものがあり、噂に聞いていたLLVM/ClangをVisual Studioから使おうとして翻弄されたのでメモしておきます。

まず、Clang with Microsoft CodeGenとかClang/C2とかは既に過去のものでした。Visual Studio 2017の個別コンポーネントにまだありますが、更新されないそうです。

LLVM公式からダウンロードすればVisual Studio 2015以降にツールチェインが入る...というのもまた過去のものになるようで、7.0.0以降はLLVM本体と別にマーケットプレイスから入手することになるそうな。

ちなみに試そうと思ったきっかけは、C言語のC99にある指示付きの初期化(Designated Initialization)で、C++の方はC++20からなのでした。Clangは対応済みとかで。

それについてあちこち調べていて、structがclassとほぼ同じであるという意味を今さら理解したのでした。unionでさえもclassの仲間なので、C99の追随がすぐできるわけではなかったのですね。
我がDDNS更新サービスですが、0.2で中期運用の結果、首尾良くバグが発見できたのですが、その最中に例外が。

AutoResizeColumnsが設定されたDataGridViewを含むFormをShowした際、マウスポインタが真上にあるとInvalidOperationExceptionが出るというもので、MSDNのフォーラムでも「バグだよねえ」と指摘されています。

指摘されたのは2006年ですか...。

回避法は簡単で、設定を全てFormのLoad時にすればいいだけでした。つまりデザイナで中に何か入ってるとか、うっかりコンストラクタでデータバインディングを設定しちゃうとか、そういうことをしなければ良いのでした。

Certum審査厳格化?

| コメント(0) | トラックバック(0)
Certumのオープンソース向け無償コード証明書ですが、どうも審査が厳格になったようで、rejectされてしまいました。

widely availableでないとダメとのことで、個人webでアーカイブの中にソースが入ってる、程度ではダメと思われます。project pageにも英語表記を要求されました(ので少し用意しました)。もちろん、年間1万円はするものを無償で提供しようというのですから、相応のものに限るのは自然な話ではあります。

瞬間的にすごーく残念でしたので、どんなにショボくともこれが自己表現になっているのだと改めて認識した次第。さりとてGitHubだとかSourceForgeだとかいったところに置くつもりもありませんで。パソコン通信時代と変わらないやり方こそ時代錯誤だろうとは薄々は認識していますが。

そんなわけでMedusaが既に署名なしの他、AntiDeviceとかDeltaEndとかローカルには更新版があるのですが、これらも署名なしにするか、別の所を探すか決めないといけません。

Medusa Ver.0.3公開

| コメント(0) | トラックバック(0)
medusa_64.pngダイナミックDNS更新ツールMedusa Ver.0.3を公開しました。

私も長年使っていたDiCEがエラー時のリトライをしないため、必要最小限ながら代わりにできるものとして開発しました。また自前でサービスとして動作できます。

なんとなく頭字語でMedusaというのを思い付いてしまい、アイコンに苦労したという(ぉ 最終的にRPGドット様のものを中心に使わせていただいています。

ホームページ側のWin32コーナーにて。
複雑な経緯で今に至るプロジェクトをビルドしたら、Visual Studio 2013及び2010でダイアログ編集後に、表題を筆頭とするエラーが.rcでたくさん出ました。

#include <windows.h>
の追加でビルドできるので一件落着と思いきや、再度編集後にresource.hが完膚なきまでに破壊されました。恐らくwindows.hから辿られるリソース関係の定義が全て混ざり込んだのだろうと思います。

Visual Studioで直接.rc(破壊前のresource.hと編集前の.rc)を開いて新規の.rcに中身をコピーしたところ、正常に作り直すことができましたが、原因は後ろの方にあったようです。

2 TEXTINCLUDE
のブロックが空っぽになっていたためらしく、ここに

"#include ""winres.h""\r\n"
のような行(これは新規プロジェクトなど正常なものを参照のこと)を追加するだけでも修復できました。

設定の暗号化

| コメント(0) | トラックバック(0)
ダイナミックDNS更新ツールDiCEですが、失敗時のリトライがない(しかもなぜか一度失敗すると二度と成功しないような...)ことから、代わりを作ることにしました。

ちょっとC++よりも新しい言語を真面目に使ってみようとC#/.NET Frameworkで、大体の機能はできたところです。GUI上の設定はDataGridViewとBindingListで、データバインディングというものを初めて使ってみたりとか。

関係ありませんが「データバインディング」って必殺技みたいで格好良いですね。最初に耳にしたのはCocoaでだったでしょうか。

さてそれで、この種のツールはパスワード等を保存せねばなりません。以前PowerSiestaを作った頃は単純にData Protection APIでユーザー限定にしておいたはずですが、今回はサービスとしても動作することから、設定したのと別ユーザーでの動作を考慮する必要があります。

またサービスということは起動時にユーザーの入力を要求できませんから、鍵を任意に指定できるようにしたとしても、起動時の引数など第三者がアクセスできる場所にそれを記述しなければならず、Gumblerのように特別に狙われればどうにもなりません。そもそもオープンソースですし。

ちなみにLinux等で定番となっているinadynにはそんな配慮はないようですが、それというのもファイルのアクセス権限の変更が常識の世界だからでしょうか。

そこで結局、一応は暗号化(Data Protection APIでそのPC限定)し、動作中は設定ファイルを排他で開いたままにしておくことにしました。これならば、サービス稼働中は別プロセスから読めませんし、全文検索をしてそれっぽい文字列(例えばメールアドレス)を盗む程度のワームになら、読み出されても素通りするでしょう。

破るには管理者権限を取得してサービスを停止し、そのままPCの中で読み出し復号するぐらいになるはずです。管理者権限が陥落したような状態での防備は素人にはちょっと想像できません。

難点は、PCの鍵を使う方法だと暗号化が時代遅れのトリプルDESで行なわれることです。AESに対応させたCryptProtectData2みたいなのがあればいいのですが。

まあIP更新にhttpsが使えないDDNSサービスが多いのに、そんなローカルでのセキュリティだけ気にしても意味がない、という問題があったりしますが。

Microsoft OS 2.0 Descriptor

| コメント(0) | トラックバック(0)
いつの間にか一般公開されていました。

Microsoft OS 2.0 Descriptors Specification

いきなりindex=0EEhのString Descriptorを読みに来るため、死ぬ製品があったMicrosoft OS Descriptorですが、そういった問題を起こさない新版として作られたのが2.0で、Windows 8.1からサポートされています。

公開日が9/16ということは、Windows 8.1 RTMがMSDN等で公開されたより少し後ですね。ちなみに日本語ページはデザインにバグがあってダウンロードできないため、英語ページへのリンクです。

詳しくは仕様書を読んでもらえばわかりますが、Certified Wireless USBから追加されたBOS Descriptorを拡張する形で実装されています。でもCapability Codeが標準BOSのすぐ後ろ(5)なのですが、BOSへの機能追加があったら大丈夫なのかと思ったり。

元のBOSがそうなのですが、柔軟な仕様になっています。平たく言えば、バイト列を手作業で作るのがとても面倒くさい。イメージとしてはConfiguration Descriptorの親玉で、サイズ情報を含むヘッダーで区切られた入れ子構造になっています。

bcdUSBを210hとすればOSがBOS Descriptorを読みに来ますが、少なくともWindowsではUSB 2.0 EXTENSIOSが必須となります。bmAttiributesに0(NO LPM)でも入れておけば大丈夫です。

P.S.
でもよく考えてみると、既存製品のことも考えれば1.0がなくなることはあり得ず、行儀正しい仕様に作り直しました、という以上の意味はないような気がします。そもそもWin8.1以降に限定しない限り2.0のみにはできませんし。

どちらかというとWindows Embedded向けなのでしょうか。あの世界なら1.0を止めるカスタマイズも可能でしょうから。

ADT-Bundleの話ですが要するにEclipse。

Package Explorerでコピーペーストして、パッケージ名をgrepして変更、さらにパッケージ名になっているフォルダ名(srcの下とgenの下)も変更、開いてリフレッシュ...というのがお馴染みですが、先日、全くできなくて困りました。

Cannot paste the clipboard contents into the selected elements.

コピー対象であろうがなかろうが、適当なプロジェクトを開いていないとペーストできないようでした。意図がわからない挙動です。コピーしようというのなら、閉じるのが当然でしょう。
12345678

アーカイブ

ウェブページ

Powered by Movable Type 5.2.13

ホームページ