2017年04月27日

Daruma BASIC で対数らせん

 Daruma BASIC で対数らせんを描いてみました。ラズパイ3、ベアメタルです。

 プログラムはこちら。GitHub のレポジトリにも入ってます。

w=screensize(0)/2
h=screensize(1)/2
dim col(4)
col={rgb(1,0,0),rgb(0,1,0),rgb(0,0,1),rgb(1,1,0)}
p=0
b#=6.0
do
 redraw 0
 gcls
 for i=0 to 3
  gcolor col(i)
  for r=0 to w*2
   t#=b#*log(1+r*0.1)+3.1416*(i*0.5-p/20.0)
   x#=w+r*cos(t#)
   y#=h+r*sin(t#)
   if r=0 then
	pset x#,y#
   else
	lineto x#,y#
   endif
  next
 next
 p=(p+1)%40
 redraw -1
loop

 昔の BASIC に慣れた人だと、FOR 以外のループ構文が DO...LOOP で統一されているのに違和感があるかも知れませんね。これは JIS Full BASIC (X3003-1993) を参考にした仕様です。といっても、その他のところは全然 Full BASIC には準拠してないので、ここだけ準拠しても実は意味がない。素直に REPEAT...UNTILWHILE...WEND にした方がよかった気もする。

posted by toshinagata at 22:54| 日記

2017年04月25日

Daruma BASIC 1.0pre6 公開

 Daruma BASIC 1.0pre6 を公開しました。Raspberry Pi 1/2/3/Zero で、ベアメタル (OS なし) で BASIC が走ります。タイニー版じゃないよ。ちゃんと実数計算もできますからね。

 ベアメタル版はファイル入出力が遅いので、今まで起動時にフォントデータの読み込みのため10秒近くかかっていた。今回から、フォントデータをバイナリに埋め込むことにした。動画で見てわかる通り、立ち上がりは5秒程度に短縮された。これなら、ほぼ「電源 ON で即 BASIC」と言っても差し支えないでしょう。

 やっと「とりあえず動く」レベルには達したと思うので、サンプルやドキュメントをもう少し整備していきたい。周辺装置 (GPIO/SPI/I2C) のサポートも必要だろうけど、もう少しあとかな。

posted by toshinagata at 23:11| 日記

2017年04月23日

ラズパイのベアメタル開発:circle と newlib を併用する

 ラズパイのベアメタル開発。先日も書いたけど、ラズパイ3で動かすのに手こずっていた。何とかできたみたいなので、手順を書いておきます。

 まず、ラズパイ1の開発に使っていた Maccasoft さんのカーネルは、ラズパイ2以上を使うことは想定されていない。ペリフェラルのアドレスを書き換えて、スタートアップも書き換えれば何とかなるんだと思うけど,ちょっと自分の力では無理だったので、別のカーネルを探すことにした。

 採用したのは circle。ラズパイ1・2・3・Zero で動作確認されている。ただし、標準ライブラリを一切使わない想定で書かれているので、少し込み入ったプログラムを書こうとすると不自由を感じる。そこで、newlib と併用することを検討した。

 今回は、ツールチェインとして ARMDeveloper サイトで提供されているものを使った。"6-2017-q1-update" というもので、GCC のバージョンは 6.3.1。インストールして、実行パスを通しておく。

 Circle の Makefile を参考にして、リンクフェーズのコマンドを下のようにしてみた。リンカを ld から gcc にして、-nostartfiles を指定し、circle の startup.o をリンクする。

$ arm-eabi-none-gcc -o kernel7.elf -nostartfiles -Wl,-Map,kernel7.map \
-T $(CIRCLEHOME)/circle.ld $(CIRCLEHOME)/lib/startup.o $(OBJS) $(LIBS) -lm

 いろいろつまづきました。最初に引っかかったのは、「__aeabi_idiv が二重定義」というエラー。これは libgcc.a にあるのだが、circle/lib/libstub.S でも定義されている。無視してくれないんだ。さらに調べてみると、libgcc.a では同じオブジェクトファイルに __aeabi_idiv__aeabi_idivmod が定義されていて、後者が circle では定義されていないため、このオブジェクトファイルをリンクしようとして、定義済みの __aeabi_idiv とぶつかっていることが判明した。Circle の __aeabi_idiv を削るのはいろいろ問題を起こしそうだったので、libstub.S に以下の記述を書き加えて、Daruma BASIC のプロジェクトに追加することにした。

  .globl  __aeabi_idivmod
__aeabi_idivmod:
  push {r0, r1, lr}
  bl __aeabi_idiv
  pop {r1, r2, lr}
  mul r3, r2, r0
  sub r1, r1, r3
  bx lr

 ARM のアセンブラなんて使うの初めてだよ。なんかどきどきする。剰余の計算としてはあまり効率良くない感じだけど、とりあえずは動かすことが優先だ。

 次に遭遇したのが、uint8_t などが二重定義になっている、というエラー。これは、circle の stdint.h と newlib の stdint.h がぶつかっていることが原因。よく見ると、circle の stdint.h は全く使われていないので、_stdint.h などとリネームすれば良かった。

 次は、このエラー。

error: kernel7.elf uses VFP register arguments, /usr/local/(...中略...)
/lib/libm.a(lib_a-s_ceil.o) does not

 どうも、circle のビルドの時に指定している -mfloat-abi=hard があかんらしい。いろいろ検討したが、結局 -mfloat-abi=softfp に切り替えることにした。速度が少し落ちるのかも知れないけど、ここも動かすことを優先。

 次に、malloc() 系の処理。Newlib では _sbrk() をユーザーに提供させて、それを使って malloc() 系の関数を実装しているのだが、circle は自前でメモリ管理を行っているので、そちらを使うようにする。_sbrk() は 0 を返すようにして、circle の malloc()/free() をリンクすればよい。calloc(), realloc() は circle では実装されていないので、malloc() を使って書いておく。また、newlib は内部で _malloc_r(), _free_r(), _calloc_r(), _realloc_r() というリエントラント対応の関数を持っていて、これらも上書きしておかないと、circle の実装と newlib の実装を混用することになり、問題が起きる。(参考:https://sourceware.org/ml/newlib/2000/msg00143.html "user-defined malloc"

 そういうわけで、こんな感じで実装。

void *calloc(size_t count, size_t size)
{
  void *p = malloc(count * size);
  if (p != NULL)
    memset(p, 0, count * size);
  return p;
}

void *realloc(void *ptr, size_t size)
{
  void *p = malloc(size);
  if (p != NULL) {
    memmove(p, ptr, size);
    free(ptr);
  }
  return p;
}

struct _reent;
void *_malloc_r(struct _reent *r, size_t size)
{  return malloc(size); }

void _free_r(struct _reent *r, void *ptr)
{  free(ptr); }

void *_calloc_r(struct _reent *r, size_t count, size_t size)
{  return calloc(count, size); }

void *_realloc_r(struct _reent *r, void *ptr, size_t size)
{  return realloc(ptr, size); }

 また、strtoul() も二重定義になることがわかった。これも、_strtoul_r() というリエントラント可能なバージョンがあって、こちらをリンクしようとしてこけるらしい。そこで、_strtoul_r() もダミー実装を追加した。

unsigned long _strtoul_r(struct _reent *r, const char *s, char **ptr, int base)
{  return strtoul(s, ptr, base); }

 これで、単純なプログラムは動作することを確認したのだが、実際に Daruma BASIC をビルドしてみると、動作しない。しかも、途中で止まるとかそういうのではなくて、最初から立ち上がりもしない。いろいろコードを変更して調べていたとき、標準ライブラリの strcmp() をリンクすると立ち上がらなくなることがわかった。kernel7.map を調べて、原因が判明。strcmp() 由来の .eh_frame セクションがあるのだが、__init_start ラベルがその前にある。__init_start は、静的オブジェクトのコンストラクタを呼ぶのに使われているので、.eh_frame セクションの中身をコンストラクタのアドレスだと思って呼び出していることになる。そりゃ暴走するわな。というわけで、リンカスクリプトを修正して、.init_array の先頭が __init_start になるようにした。

--- circle/circle.ld	2017-04-23 19:12:35.000000000 +0900
+++ DarumaBasic/build_raspi_bm/circle.ld	2017-04-23 22:00:45.000000000 +0900
@@ -18,9 +18,9 @@
 
-	__init_start = .;
 
 	.init_array : {
+	__init_start = .;
 		*(.init_array*)
+	__init_end = .;
 	}
 
-	__init_end = .;
 

 一応これで、circle と newlib は共存できるようになったのかな。細かい不具合のあぶり出しはこれからだけど。

タグ:Raspberry Pi
posted by toshinagata at 22:28| 日記

2017年04月19日

踏切事故:人助けはいいけど、まず自分の安全を確保しよう

 京急で、踏切に進入した人を救助しようとして、2人とも亡くなられた件。最初の男性がそのような行動を選んだ事情や、助けようとして力及ばなかった方の無念を思うと、切ないというほかない。心からお悔やみを申し上げます。

 その上で、以前も書いたことだけど、人命救助を目指して自分も事故に巻き込まれることは、絶対に避けないといけない。犠牲者が増えてしまう確率が格段に上がるわけじゃないですか。ここは、まず停止ボタンを押して、あとは遮断機の外から大声で呼びかけるのが、唯一の解だったと思う。仮に、踏切に進入したのが自分の家族だったら、衝動的に助けに走ってしまうだろうけど、そうでないのなら、一旦冷静になって、自分の安全を確保することが大事。

 こんなツイートを見かけました。現役の車掌さんだそうです。

タグ:社会
posted by toshinagata at 22:47| 日記

2017年04月17日

Daruma BASIC ラズパイ3で動いた

 ラズパイ3のベアメタルで、Daruma BASIC が動きました。

20170417-1.jpg

 いやもう、めちゃくちゃ大変だった。まず、ラズパイ1の開発に使っていた Maccasoft さんのカーネルは、ペリフェラルのアドレスが 0x20000000 に固定されていて、ラズパイ2以上を使うことは想定されていない。ペリフェラルのアドレスを変更しただけでは動かなかった。他にもいろいろ変えないといけないところがあるらしい。

 自力で解決するのは無理な感じだったので、代わりになるものを探して、circle というのを試してみた。これはラズパイ1・2・3・Zero のすべてで動作確認されている。サンプルをビルドしてみたところ、ラズパイ3であっさりと動作した。

 しかし、ここから先が長かった。Circle は、標準ライブラリを一切使っていない。Daruma BASIC は newlib に依存しているので、circle で newlib を使う方法を模索した。これがえらい大変だった。一応サンプルプログラムが動くところまでこぎつけたけど、まだときどき変なエラーを circle が出すので、おかしいところが残っているみたい。もう少し安定させてから公開します。

 なお、IchigoJam for RPi がいよいよ動き出すようで、興味をそそられます。だけど、私はやっぱりタイニー系じゃない BASIC が使いたいので、Daruma BASIC の開発は細々と続けて行きます。まあ、趣味だからね。

posted by toshinagata at 01:10| 日記

2017年04月12日

「きゅうべえ」でアニメ作成

 しばらくラズパイネタを書いておりませんでした。坊が誕生日プレゼントにラズパイ3を所望し、無事入手した。マインクラフト+Scratch をやる、と自己申告していたのに、気がつくとマインクラフト専用機になっていたため、一度ダメ出し。まあ、Scratch2MCPI は、空間座標の知識などが必要なので、よほど数学に強い子でないと、実際上無理なんだよな。Scratch の「一見とっつきやすそうな」見かけにだまされてはいかんよ、という話。

 で、代わりに「きゅうべえ」で動くスタンプとか作ってみたら、と勧めてみた。「きゅうべえ」は、「2015年『みんなのラズパイコンテスト』で優良賞をもらったフリーのアニメーション作成ソフト」だそうです。Mac 版もあるじゃん。ちょっと試してみた。絵心は問わないというのはお約束として、動く絵がすぐに作れるのは、けっこう面白い。

20170412-1.gif

 操作画面はこんな感じ。手書き風のゆるい画面が楽しい。ちょっと操作がわかりにくいところもあるけど。

20170412-1.jpg

 「きゅうべえ」を「プログラミング学習環境」として利用するワークショップなんかもあるんですよね。動く LINE スタンプとか、作りたい人は多いだろうから、プログラミング学習の入口としては、目のつけどころがいいと思う。

タグ:Raspberry Pi
posted by toshinagata at 22:44| 日記

2017年04月08日

日本の「謙虚」海外アピール

 経済産業省の「世界が驚くニッポン!」。こんなのを国の機関が大々的に進めるなんて、何の冗談だと思ってたら、2年も前に虚構新聞で報道済みだったとのこと。

 もちろん、日本の素晴らしいところをアピールするのはいいことだと思うんですよ。でも、やり方を考えないとね。「短時間で手っ取り早く目立とう」というガツガツした戦略とは正反対のところに、日本のいいところがあるんじゃないんですか。じっくり時間をかけて、じわじわ浸透させるような戦略でいかないと、本当の良さは発見してもらえないと思う。

 経産省の担当者が「自分の担当期間の間に目に見える成果を出したい」と焦ってるんじゃないですか。また、目に見える成果がないと金を出さない財務省にも問題があるんでしょう。官僚がスタンドプレイに走ってどうするんだよ。きっちり黒子に徹して、粛々と業務を進めるのがアンタたちの仕事なんだから、勘違いしないでほしい。

 最近クローズアップされている、いわゆる「天下り」の問題って、こういう問題と裏表のような気がする。短期間に結果を出しておかないと、昇進が遅れて、その結果途中で退職するハメになるわけじゃないですか。「天下り」をあまり熱心に叩いていると、途中で退職する人が非常に惨めな思いをすることになるかもしれない。中堅どころの現役官僚の人は、自分がそうなることを避けようとして、スタンドプレイに走って目の前の「成果」を追い求めてしまうことになる。官僚の人たちだって、自分たちの生活を持った生身の人間なんだから、もっと長期的な視点で落ち着いて仕事ができるように、制度改革を進めた方がいいように思う。一方的に叩けばいいってもんじゃない。

posted by toshinagata at 12:09| 日記

2017年04月06日

NHK 基礎英語

 4月から NHK ラジオの「基礎英語」が新シーズン。今年度の講座は、相変わらず「これが言えるようになろう」みたいな中途半端な会話指向は強いのだが、一週間に一度は「文法事項」も学ぶようになっている。そうこなくっちゃ。外国語として学んでいるんだから、文法は必須ですよ。

20170406-1.jpg

NHKゴガク」のウェブサイト。

 うちの子たちの「基礎英語」歴は、上の子が3年、下の子が1年。昔の「基礎英語」と比べて、会話表現が極端に重視されて、ほとんど文法事項を取り扱っていないのが、非常に気になっていた。「基礎英語」がターゲットにしている中学生は、英語を「これから教養を身につけるための手段」として学んでいかないといけないのだから、「会話ができれば OK」みたいな中途半端な学びじゃいけない。少なくとも、NHK の講座がそこを目指してはいけない。そういう意味では、少しまともな方向に動いているのかな、と思う。

タグ:教育
posted by toshinagata at 23:24| 日記

2017年04月04日

宇治市の例の動画

 宇治市の PR 動画。なんだか「再生数がすごい」ことばかり注目されているけど、どうも違和感があった。もちろん、宇治市のイメージとかけ離れている、というのは当然あるんだけど(私は宇治市はしばしば訪れているので、雰囲気はだいたい知っている)、それとは別の違和感があったんです。この記事を読んで、やっと少しわかったような気がした。

 大事なことは、結局この一文に集約されるのかな。

宇治市の今回の動画の目的は、人口減少対策として市の好感度アップということでしたが、外注した動画で移住や定住につながるほど好感度が上がるとは正直思えません。

 ネットで飯を食っている人は、「目立てば勝ち」というような価値観で動きがちだけど、サービスを利用する側としては、あんまりそういうのに振り回されないようにしたいですね。あと、税金の使い道はよく考えて欲しいなと思います。私は別に宇治市には税金払ってませんけど。

タグ:社会
posted by toshinagata at 00:54| 日記

2017年04月01日

「クラシックの真実は大作曲家の『自筆譜』にあり!」(中村洋子/DU BOOKS)

 楽譜を読むのが好きなもので、書名に大いに興味を惹かれて読んでみました。自筆譜の話は確かに面白い。でも、楽譜の話は半分ぐらいなんだよね。現代の商業音楽とアカデミックな音楽界を批判することに相当のページが割かれている。商業音楽批判については共感できるところが多いのだけど、音楽界批判については、なんか「自分を相手にしてくれない音楽界」への怨念みたいなものが立ち昇って来て、息苦しさを感じる。あんまりバランスの良い本ではないですね。

 「平均律」の解説について、市田儀一郎氏の分析本や矢代秋雄・小林仁氏の対談本を「読む価値無し」と切り捨てているのも、ちょっとやり過ぎじゃないかと思った。これらの本を読んだら余計にバッハの理解から遠ざかる、なんてことはないと思いますよ。市田氏は音楽学者、矢代氏と中村氏(本書著者)は作曲家、小林氏はピアニストなので、それぞれ視点が違っていて、相補的に理解を深めることができる、という見方でいいんじゃないのでしょうか。

 とはいえ、興味深い内容も多い。たとえば、ショパンの自筆譜についての考察。ショパンの作品の実用譜には、意味のわかりにくい記述がときどきあるので、「本当はどう書いてあるんだろう?」と知りたくなることはよくある。ちなみに、ショパンの練習曲 Op.10-1 の自筆譜に見られる「視覚的なパターン」をコンピュータ組版で再現する試みを、ダグラス・ホフスタッター氏が 1982 年に紹介している(「メタマジック・ゲーム」ホフスタッター著、竹内ほか訳、白揚社、第9章)。みんなが自筆譜を見られるようになるのが一番いいのだが、それが難しいのであれば、「特徴をとらえたコンピュータ組版」というのは面白い試みかもしれないね。

(バッハの作品の自筆譜は、IMSLP にかなりの数が公開されています。平均律なんて、いろんな写本を見比べることすらできる。ベートーヴェンの自筆譜もあります。ショパンのエチュードの自筆譜は[まだ?]ありません。)

タグ:音楽 読書 楽譜
posted by toshinagata at 23:27| 日記