外部プログラムからアニメーションをコントロールできるフリーソフト9VAeきゅうべえのラズベリーパイ版を公開した。ダウンロードはこちら そのフランス語版の動作がおかしかったので、原因追及した顛末を紹介している。なお、今、公開されているバージョンは正しく動作します。(0.6.13dで修正しました。)
最初につくったバージョンは、日本語、英語では正しく動作するのに、フランス語ではアニメの顔がでかくなるという現象が発生。以下のような感じ。
- 言語設定をフランス語にすると、オーバーレイの上に描いたアニメキャストの顔が、ばかでかくなってる。不思議なのは、日本語、英語、中国語は問題なくて、フランス語だけ顔がでかい。
- 9VAeきゅうべえ本体は正常に動いているので、CSV命令を読み込んで、座標値や倍率を取得する部分がおかしいのか。
- CSVテキストから数値を読み込むには、 sscanf 関数を使ってるのだが、フランス語と英語で数字のコードが違うのか?、そういえば、フランス語で、数字の9をうつと、へんな文字がはいる(これは単にキーボード配列の違いと思うが)フランス語版 9VAeきゅうべえは、フランスの方(こちら) の翻訳のおかげである。なぜフランス語だけおかしくなるのだろうか。
対応方針、どうデバッグするか
- どんな細かいことでも、原因を追究すると、大きなバグを発見することがある。 というのは今まで何回も正しかった。これを見過ごしてはいけない。
- 開発環境をいれてデバッガーで値をみるのがてっとり早い。ただフランス語でデバッガが使えるのか・・・
ラズベリーパイ Buster で、Geanyのデバッガーが動作しない
- ラズパイの最新版OS、Buster で、Geany のデバッガープラグインが動かなかった。こういうことはよくあるので、あわてず前のOS Stretch に変更すると、ちゃんとデバッガーが動いて顔がでかくなった。早速デバッガでみる。ラズパイの設定は何回もやるのでここに書いている。
フランス語の小数点はなんと「,」らしい
- 問題の部分はマウスカーソルにアニメキャストを割り当てる「setM」命令で「setM,1,2,15,"face"」と書いてある。1は設定、2は倍率、15が角度。このパラメータを「sscanf ",%f,%f,%f」で3つの変数に読み込んでいる。sscanf はC言語の文字、数値入力関数。
- デバッガでみると sscanf の結果、最初の数字が「1.2」、2番目の倍率が「15」、3番目が0になっていた。倍率2が15になったので顔(face)が7倍でかくなった。「1,2」が「1.2」になってるのが問題。
- ネットで検索すると、なんとフランス語の小数点は「,」らしい。
- そうすると、CSVファイルのコンマ区切りはどうするのか?と思って検索すると、以下の記事を発見
- ヨーロッパでCSVファイルが開けない
イタリア、ドイツ、フランスなどでは、小数は「,」、CSVの区切りは「;」らしい
- とすると、サンプルのCSVデータをフランスのエクセルで開くと、正しく開くことができないのでは?と思って LibreOffice Calc で開いてみると、最初に区切りを指定する画面が表示された。単純テキストと解釈されたもようである。
- さらに、LibreOffice Calc フランス語で、CSV保存すると「,」区切りで保存された。「;」にはしてないみたい。たしかにそんなものが出回ると迷惑だ。
- ということで、小数点は「.」CSV区切りは「,」で決定とし、それをフランス語でも正しく動くようにしたい。
- 対策として、フランス語、イタリア語、ドイツ語の場合、「.」と「,」、「,」と「;」を入れ替えてから、sscanf を使うようにするのが考えられる。しかし sscanf の動作は、Windows / Mac / Android / iOS もみな同じ動作なのか。また、フランスの sscanf がコンマを小数点と解釈するのなら、もっと問題が出るのでは・・・
フランスの sscanf が「,」を小数点にするなら、SVGの解釈に失敗するのでは?
- ベクトル形式で図形SVGファイルの座標値はピリオドの小数点で、コンマで区切られている。SVG読み込みが全滅しているのではないか?さらに、9VAeの保存をバイナリからSVGに変更しているのだが、大丈夫なのか。
- フランス語9VAeでSVGファイルを開いてみると、ちゃんと動作しているみたいだ。ソースを調べてみると「,」の分割は自力でやっていて、小数入力だけ sscanf %f を使っていた。フランスでは整数部分だけ正しくよんでいて、小数以下が無視されている可能性がある。うーむ。9VAeのSVG保存については、独自情報も保存しているので大丈夫だった。
- 英国と米国は、小数の位の表示にピリオドを使用する、世界でも数少ない国という記事を発見。小数点が点なのはマイナーだったのか! -ロケールの設定という記事を発見。これで、sscanf の動作を切り替えられるか、と思ってプログラムでロケールを切り替えてみたが、動作は変わらなかった。
- 結局、「.」と「,」、「,」と「;」の入れ替え前と後の2通りを行って、正しそうな方を選ぶことにした。言語によって処理を切り替えるということはしない。結果で判断する。例えば、Windows版9VAeきゅうべえは、フランス語でも正常に動作しており、sscanfの小数点はピリオドみたいだ。ただ日本で入手できるWindowsをフランス語設定にしたということなので、フランスでどうなっているかわからん。
言語によって sscanf %f の動作がかわるのは、ラズパイだけだった
あらためて、Windows / Macintosh / Raspberry Pi / Ubuntu の動作を調べてみると、フランス語にして顔が大きくなるのはラズベリーパイだけだった。言語設定によって、sscanf %f の動作がかわるライブラリはあまり採用されていないのかも。SVG入力、データ保存に問題ないということなのでひと安心である。
- 9VAeきゅうべえの外部コントロールについて、フランス語の問題もふくめて、いろいろバグ修正したバージョンを公開した。使い方はこちらをみてほしい。
9VAeきゅうべえに関する問い合わせ
- 9VAeについて、Yahoo知恵袋で質問すれば答えが得られます。
- 本記事の文章、図、アニメは複製自由です。教材、解説記事にご利用ください。