2020年上期のmruby/c記事シリーズ最終回(たぶん)です。
改行コードがLFだけ
mruby/cが出力する改行コードは、LF(\n)でした。 mrubyやCRubyがLFなので、互換性を考えたら当然ですね。
ターミナルの闇
闇って言うほどでもないのですが、Linuxで最も簡単に導入・利用できるシリアルターミナルエミュレータの cu は、改行コードにCRLF(\r\n)を期待します。 そして、なんと、これは変更できません。
screen も標準はCRLFで、LFにも変更できるのですが起動にsudoが必要(Ubuntuの場合)だったりCtrl+Hogeの入力状況が見えにくくて間違えやすい(私だけ?)。嫌い。
minicom というやつはUIのクセが強くてあんまり使いたくない。嫌い。
シリアル通信の似合うRuby => mruby/c
mruby/cはワンチップマイコン向けのRubyですので、UARTからCOMポートにつなぐなどのケースが多いのです。 このとき、ターミナル側にはいろいろな環境が使えるべきなので、LFだけではなくCRLFも必要なのです!
Linuxユーザが組み込みプログラミング
組み込みプログラマは、おそらくWindowsな人が多いですね。 Windowsはシステム本来の改行コードがCRLFなのに、ターミナルエミュレータのTeraTermなどは簡単にLFに変更できます。
他方、本来の改行コードがLFであるLinuxのシリアルターミナルでは、なぜかお気軽にLFを選べない。
Rubyは、Linux文化に寄り添ったプログラミング言語です。
「Rubyから(あるいはWeb・スマホ開発から)組み込み開発に興味を広げたプログラマが挫折することなくmruby/cを使い始めるためには、CRLFが是非とも必要なんです!」とお願いして、入れてもらいました。 (今回は自分でプルリクを書いた提案じゃないです)
HALの選択(参考:前回の記事)と同様、これもフラグで切り替えできます。
CFLAGS=-DMRBC_CONVERT_CRLF make
みたいにすれば、改行コードがCRLFになります。やったね!
補足。念のため
CRLFを期待するターミナルがLFを受信するとなにが困るのか、をいちおう説明します。
たとえば以下のようなRubyプログラムがあったとすると:
puts "Hello"
puts "Ruby"
puts "World"
期待していた動作はこうです:
Hello
Ruby
World
ところが、このように出力されてしまいます:
Hello
Ruby
World
こういうことがエラーメッセージなどを含めあらゆるところで発生するので、たいへん読みにくいっていうわけです。