ぺんぎんノート

momoiro_tjのノート (旧:システムオペレータの週末)

binutilsインストール

Raspberry Pi 3B+のベアメタル環境構築のために、binutilsをインストールした。 いろいろとハマったのではまったことなどをまとめておく。

最終的に、ワーニングがいくつか出たが何とかコンパイルできてインストールが完了した、という次第。

環境はubuntu 18.04.3 LTS (Bionic Beaver)

基本的に以下のページを参考にさせていただいた。
piでベアメタルプログラミング - bobuhiro11's diary

注意:以下に述べるポイントはbinutilsのインストールを100%保証するものではない。あくまで私の環境で試したことをまとめているだけである。

最終的な実行手順

最終的に次の流れでインストールができた。

※2020/02/22 configureのtarget指定をarm-non-eabiからaarch64-elfに修正
64bitで動かしたかったがarm-non-eabiではコンパイルできなかったため。

$su -

$ apt install texinfo
$ apt install bison
$ apt install flex
$ apt install gap-core
$ apt install gap-grape
$ apt install g++

$ export LDFLAGS="-L/opt/local/lib"
$ export CFLAGS="-I/usr/local/include -O2"

$ cd /usr/local
$ mkdir cross-pi

$ cd /usr/local/src
$ git clone git://sourceware.org/git/binutils-gdb.git
$ cd binutils-gdb
$ mkdir work
$ cd work
$ ./configure --target=aarch64-elf --prefix=/usr/local/cross-pi
$ make
$ make install

以降、はまったポイントを述べる。

はまりポイント1 - 古いソースコード

まずソースコードをダウンロードする。参考サイトではwgetソースコードアーカイブをダウンロードしている。

参考サイトが2014年の記事だったため、ソースコードの意図する環境が変わって(新しくなって)いると考えた。なので、gitで公開されていた最新版をダウンロードするようにした。
Binutils - GNU Project - Free Software Foundation

$git clone git://sourceware.org/git/binutils-gdb.git

はまりポイント2 - 不足ツール

makeを実行すると、ツールが足りないとエラーをはいてくる。さすがにすべてコンパイルしてインストールするわけにもいかないので、不足ツールはaptで追加インストールを行った。

すべてメモっていたわけではないので抜け、重複しているものがあるかもしれない。

$apt install texinfo
$apt install bison
$apt install flex
$apt install gap-core
$apt install gap-grape
$apt install g++

texinfotextinfoではないことに注意すること。

はまりポイント3 - ワークディレクト

これが最大のはまりポイント。

make実行時に次のエラーメッセージに非常に悩まされた。

configure: error: source directory already configured; run "make distclean" there first

これがでるともうmake distcleanし、configureからやり直すしかない。

詳しい原因は不明だが、ワークディレクトリを作りワークディレクトリでconfigure、makeを行うと解消された。

$cd binutils-gdb
$mkdir work
$cd work
$./configure
$make
$make install

この後続けてgcc、newlibのインストールも行ったがbinutilsのインストールでベースができていたので問題なく終わった。コンパイルに1時間以上かかったが。

2019の活動

2019年のプライベートは、スーパードンキーコング(ドンキー1)のRTA一色でした。仕事はやっと下積みみたいな期間が終わり、2020から本番という感じ。仕事のことは詳しく書けないので、プライベートをメインに一年間のまとめをします。

 

飛鳥文化アタックと出会う

飛鳥文化アタック、その言葉のインパクトから興味をもち調べはじめました。Twitterで(冗談のつもりで)今年の目標として飛鳥文化アタックをできるようにすることを呟いたところ、友人に言質をとられ目標にすることを決めました。あくまで目標にするのを決めたのは自分です。これが1月末のできごと。

最初は、自宅にあったミニスーファミで3-3のクレムリンで、飛鳥文化アタックができるかチャレンジしてました。何日かやっててたまたまでたときめちゃくちゃ嬉しかったのを覚えてます。

飛鳥文化アタックを調べるなかで、RTA in JAPAN3のドンキートリロジーの動画に出会い、そこでRTAを知りました。明確に覚えてないけど、解説がおもしろくてバグ技のざっくりした内容がわかりやすくて、自分もやってみたいと思ったような気がします。


RTA in Japan 3 - スーパードンキーコングシリーズ1,2,3完全クリアトリロジーリレー

そこから、ミニスーファミRTAの真似事を始めました。タイマーソフトのlivesplitなんて知るよしもなかったので、はじめはクリア後にセーブデータ選択画面に表示されるゲーム内時間(インゲームタイム)で早かったか遅かったかを確認していました。

全ステージをインゲームタイム1時間以内で通せるようになってきたあたりで、セーブデータ選択画面をスマホで撮影して結果をTwitterにあげるようになりました。ここまでがだいたい5月までのできごと。

 

ドンキー新人大会

5月、なぜ見てたか覚えてないけど、たまたまドンキー新人大会の告知にたどり着きました。おそらくGoogleで「スーパードンキーコング RTA」とかで検索してて引っ掛かったとかかな。なにげなしに新人大会出てみたいとTwitterでつぶやいたところ、主催者の方からリプを頂き真剣に考え始めました。

正直、最初はゲーム配信を自分がするなんてあり得ないと思ってたし、ニコニコの内内のイベントなんだからでてもしょうがない、みたいに思ってました。

でも、スーパーファミコンの実機を少しずつ集めたり、Twitchに登録したり、タイマーについて調べたりしてる自分がいることに気づきました。たぶん自分は新人大会出たいと思ってるんだろうなと。なので、出ないと後悔すると思い、走者募集締め切りの一週間前くらいにdiscordで申請しました。ドンキー1の走者が埋まってなかったのが良くも悪くもホントにラッキーだったと思います。これが7月中旬。

このころにはTwitchで配信もはじめていて、少なくとも週1~2回配信してたと思う。大会前には毎日一回はやってましたね。

8月、お盆休みにはいって注文していた海外版ドンキーのROMが届き、新人大会までの目標にしていた40分をなんとか切ることができました。

新人大会の前日、はじめての並走。緊張で手がえげつない震え方してたのをいまでも覚えています。でもそれなりのタイムで走れました。

新人大会当日、努力の結果スーパードンキーコング1の全ステージをまわるall stagesのカテゴリで2位になりました!これはホントに嬉しかった。自分にとって、自分で決めて努力してきたことが実を結ぶ経験ができたと感じました。ホントにいい経験ができたと思います。大会後のバーンアウトを含めて。

  

ドンキーラリー

新人大会が終わってダラダラとプレイしてたところ、1ヶ月の期間中の15回の出走ででたベストタイムを競うドンキーラリー(ゴリラリー)という企画へ申し込みました。ドンキー1 all stagesのカテゴリのみで15回を走ることはきついし、1カテゴリだけでは大会の意図に沿わない、新人大会もおわって他のドンキー1のカテゴリに挑戦してみたい、飛鳥文化アタックのような1フレーム技の練習にもなる、というような理由からプレイ時間の短いドンキー1 any%(最速でラスボスを倒すカテゴリ)の練習を始めました。

 1か月で15回走るっていうのは、結構きつくて毎週3~4回を4週やればなんとかなると思ってたけど、1週目で2回しか走れず最終週に土日で6回走るということになってしまいました。

なんとか15回はしることができ、結果的に完走王の表彰をいただくことができました。日々のプレイでもあんまりリセットしないようことを意識しているので、それが評価されたのかな、と思います。

 

自己ベスト

1年(speedrun.comにのせられる記録を計測し始めたのは6月頃からなので半年)やった結果、以下の自己ベストを出すことができました。

all stagesはドンキーラリー期間中にでた記録で、any%は年末にでた記録です。まだまだ未熟だけど、個人的には頑張った成果が出たと思います。新人大会のときにはall stagesで35分きれるなんて考えてもみなかったし。

 

まとめ

冒頭で述べた通り、仕事抜きにするとほんとにドンキーRTA一色に1年間でした。大会などでお世話になった方、ありがとうございました。

 これからもRTAは続けようと思います。ドンキー1がおもしろすぎるのでしばらくはドンキー1をもっと詰めていきます。いずれはドンキー2,3とかほかのゲームもやってみたいですね。

仕事はスキルをもっと磨いていかないといけないので、プライベートでも資格とったり自主制作とか個人での活動をやったりしていきたいですね。2020もやりたいことが多すぎて大変な一年になりそうです。

知っておくべきgccオプション

三連休で何かしないとな、とおもいgccのmanページを読んでいた。結局1日では時間が足りず中途半端な感じになってしまった。1日無駄にしたなーなんて思う。なので、とりあえず分かったことだけでもまとめとこうと思う。

今日gccのmanページを読もうと思った理由は、なんとなくgcc極めたいなーと思ったからだ。とりあえず先頭から読み始めたが、正直これ通常の開発とかで使うのだろうか・・・と思ったころにはもう夕方だった。ふとページの先頭に戻ってみたらSYNOSPSISを改めてみてみると、これだけ知ってれば十分じゃないか?と気づいたわけだ。

なので結論はタイトルの通りだと思った。

しかし、コンパイラのオプションってほんとに多い。Visual Studioを初めて触ったとき、デフォルトでいろんなオプションが設定されていて意味が分からなかった。Visual Studioコンパイルオプションは正直いまでも詳しくはわからない。半面、gccコマンドラインからソースファイルさえ指定すればそれらしくできるからとてもシンプルに見える。実際は内部でいろんなパラメータが設定されているんだろうが・・・・。

知っておくべきgccオプション

以下はman gccで表示したmanページのSYNOPSISに書かれているgccの例。gccのオプションはもっとたくさんあるがこれだけ知っていればいいのでは、というのが今日の結論だ。それぞれのオプションがどういう意味なのか簡単に残しておくことにする。

   gcc [-c|-S|-E] [-std=standard]
       [-g] [-pg] [-Olevel]
       [-Wwarn...] [-Wpedantic]
       [-Idir...] [-Ldir...]
       [-Dmacro[=defn]...] [-Umacro]
       [-foption...] [-mmachine-option...]
       [-o outfile] [@file] infile...

[ -c | -S | -E ]オプション

コンパイルの実行を制御するオプション。-cプリプロセス、コンパイルアセンブルをするがリンクはスルーする。-Sプリプロセス、コンパイルを行うがアセンブル、リンクをスルーする。-Eプリプロセスはするがコンパイルアセンブル、リンクをスルーする。

-cはオブジェクトファイルを出力し、-Sアセンブラコードを出力し、-Eプリプロセス済みのソースコードを出力する。

まとめると以下の表になる。-Eのみ、出力がファイルではなく標準出力になることに注意する。

オプション プリプロセス コンパイル アセンブル リンク 出力形式
-c × file.o(オブジェクトファイル)
-S × × file.s(アセンブラファイル)
-E × × × (プリプロセスを行ったコードを標準出力へ出力)

[ -std=standard ]オプション

C99など、C言語で準拠する規格を指定する。プロジェクトで準拠する規格があれば指定する必要がありそう。なお、C/C++のみに適用可能なオプション。

[ -g ]オプション

デバッグ情報を出力する。GDBを使う場合にこのデバッグ情報を使用する。

[ -pg ]オプション

gprofでプログラムを解析する際に使用するプロフィール情報を出力する。

[ -Olevel ]オプション

-O1-O3などでコンパイルで最適化するレベルを指定する。内部で自動的に各レベルごとに決められた最適化オプション(Optimize Options)を指定してくれているらしい。

[ -Wwarn... ]オプション

表示する警告の設定。-Wallなどがよく使われているイメージ。

[ -Wpedantic ]オプション

拡張機能に対して警告を表示する設定。

[ -Idir... ]オプション

dirに指定したディレクトリをヘッダファイルなどの検索対象に追加する。

[ -Ldir... ]オプション

dirに指定したディレクトリを、リンクしたいライブラリの検索対象に追加する。

[ -Dmacro[=defn]... ]オプション

#defineコマンドラインで設定する。

[ -Umacro ]オプション

定義済みのマクロをキャンセルする。ソースコード中のマクロまたは、このオプションの前に-Dで定義したマクロのキャンセルができる。

[ -foption... ]オプション

指定するとoptionを有効にする。いろんなオプションがある。

[ -mmachine-option... ]オプション

ハードウェア固有のオプションを有効にする。

[ -o outfile ]オプション

出力ファイル名を指定する。指定しないとa.outなどになる。

[ @file ]

コマンドラインオプションをファイルから読み取る場合に、コマンドラインオプションが記述されたファイルを指定する。

infile...

入力ファイルを指定する。必須。


このベースさえ覚えておけば、あとはmanなりhelpなりを都度参照すれば何とかなりそう。特に-foptionとか-mmachine-optionはハードやソフトに何らかの制約がある場合に指定すると思うので、その都度調べて使うような使い方になりそう。

あとはどれだけ便利に使いたいか、というくらいじゃないだろうか。掘り下げていくといくらでも掘り下げられそうだ。

南国っぽい言葉の頭に「エゾ」ってつけると一気に南国感が消える

エゾマリンバ

蝦夷海人(えぞうみんちゅ)

マリンバって南の島の金属の雪平鍋みたいな楽器のことだと思ってたけど、それはスチールパンっていう楽器だった。(マリンバは木琴)

ブログ名変更しました

とつぜんですが、ブログ名を変更しました。

旧:システムオペレータの週末

新:ぺんぎんノート

理由は、しばらく更新していない間にシステムオペレータを卒業したからです。
現状では仕事としては、ソフトエンジニア?っぽい仕事に携わっています。

以前のブログ名ではシステムオペレータという仕事に寄りすぎていたので、仕事に依存しないものにしたつもりです。

改めまして、よろしくお願いします。

Code::Blocksのデフォルトテンプレート一覧

C++IDEってVisual Studio以外にもあるらしい。全然知らなかった。

手始めにCode::Blocksをダウンロードしてみた。
画面はVisualStudioとほぼ同じ感じで良さそうだ。

デフォルトで作れるプロジェクトがわからないものばっかりだったので調べてみた。

f:id:momoiro_tj:20171221115414j:plain
Code::Blocks プロジェクト作成画面

続きを読む

ネットの海でただ酔うことはもうやめようと思う

ショウペンハウアーの『読書について』を読んでいる。読書とは何か、について深く考察されていておもしろかった。

ちなみにまだ3分の1しか読んでないが、ざっと、気になったところをピックアップしてみた。こうすると、読書なんて関係ないただの自己啓発本みたいだ。 続きが気になるが、やる気と記憶が残っている間にブログにあげておこうと思う。尚、以降の引用はすべて光文社古典新訳文庫の翻訳を引用する。

書き出しから、衝撃だった。

どんなにたくさんあっても整理されていない蔵書より、ほどよい冊数で、きちんと整理されている蔵書のほうが、ずっと役に立つ。同じことが知識についてもいえる。 以下に大量にかき集めても、自分の頭で考えずに鵜呑みにした知識より、量はずっと少なくとも、じっくり考え抜いた知識のほうが、はるかに価値がある。

要するに言いたいことは、某Chikirinと同じだ。ちなみに、光文社古典新訳文庫のこの個所のタイトルは、まさしく『自分の頭で考える』だ。 この後、自分の頭でよく考える人間思索家と、博覧強記の愛読家を比較し、どちらが良いかを論じている。

読書と同じように、単なる経験も思索の代わりにはなれない。単なる経験と思索との関係は、食べることと、消化・吸収との関係にひとしい。

この個所もよかった。学生、社会人問わず、「何事も経験だ」などとよく言うが、経験もただ何も考えずに経験するだけでは何の意味もない。 「何事も経験だ」といわれるたびモヤモヤしていたが、そういうことだったのかもしれない、と思った。

考えがいま頭の中にあるということは、恋人が目の前にいるようなものだ。

ざっくりまとめると、メモをとれよ、すぐにいなくなってしまうぞ、ということだと思っている。 仕事でメモを取っていないわけではないが、社会人になってもっと早い段階でこの文章に出会っていたかった。

読書しながらメモをとる、というのは個人的にとても難しく感じる。 ジョン・フォン・ノイマン図書館で借りてきた本に多くのメモを残したという話があるが、本は汚したくないなあ・・・。

本を読むこと、考えること

ざっと読んだだけで、西洋の古典も哲学なんかも素人だ。だが、彼の言うように、思索をしてみようと思う。

彼が言いたかったことは何か。読書はインプットである。アウトプットを多くしていないと意味がないよ、そう言いたかったのだと個人的に解釈している。 彼の言うアウトプットは思索という言葉で統一されている。頭の中で考えるだけではなく、紙にメモをとったり、文章として残したりすることも思索に含まれるのだろう。 前で引用しているが、経験と思索の関係は食べることと、消化・吸収することの関係に等しいと言っている。 単純に、本を読むことは知識を吸収すること、のように感じるが、思索をしなければ自分自身に吸収されないようだ。

本を読んだだけでは、結局何のことが書いてあったのかわからなかったり、読んだけど身についていないと感じたり、ということは往々にしてある。 自分の言葉におこしたり、実際に書いてあったことをやって習慣にしたり、思索をしなければ、自分の体の一部にはできないだろう。
(実際にやってみる(=経験する)だけでは、思索の代わりにはなれないとある。なので、実際にやってみるのであれば、習慣化するところまでしないとだめだと思う。)

そういうわけで重圧を与え続けると、バネの弾力がなくなるように、多読に走ると、精神のしなやかさが奪われる。

彼はこうも言っている。多読(=インプット)ばかりしていると、他人の考えに呑まれてしまい、考えることやひらめきができなくなっていく。 本をたくさん読むことは、いいこと、偉いこと、と親は昔からこどもにすりこませる。だがそれを鵜呑みにしてしまうと、考えられない人間になってしまう。

自分自身、これが当てはまるように思う。本にそう書いてあったから○○をする、ゲームをしていても先に進めなくなったら攻略本を読む、のように。 昔から本や、他人の意見に流され、自分の意見なんてほんの一握りしかなかったのかもしれない。

暗記

この本を読んで思ったことのひとつが、暗記は大切だということ。

学生(大学)時代は、忘れてしまっても本やネットに書いてあるから、あらゆることを覚える必要はない、と考え、暗記はしてこなかった。 というか、暗記は苦手だ。その言い訳にしていたのだと思う。

それがなぜ大事だと感じているのかというと、暗記は自分の頭で考えて、物事を自分の頭に叩き込むことだから。 化学の周期表を「すいへーりーべー・・・」と覚えるのは、与えられた覚え方をそのまま実践しているので何とも言えない。 自分の創意工夫で、これはこう、あれはそう、と覚えていく過程が思索になるのではないか。

特に数学では、暗記は必須能力の一つだと思う。たとえば、三角関数は、関数の性質、倍角・半角の公式、微積分など、覚えることがひたすら多い。 これを暗記せずに問題を解こうと思っても、難しい。自分に染み込んでいないと、三角関数の問題を解く発想は生まれてこないだろう。

どうやって覚えるか、自分の知識との関連性はあるか、など暗記の方法やヒントを考えることは有効なアウトプットのひとつだと思う。

ネットサーフィンについて

当たり前のように誰でも持っているスマートフォン。電車に乗れば、9割近くの人がスマホでネットやゲームに明け暮れている。 ネットサーフィンとでいうと、ニュースを見たり、まとめサイトを見たり、ブログを読んだり。

ネットは、どれをとっても読書・経験と同じだ。つまり、思索にはならない。 ネットは文章を読むことに他ならない。ゲームも、よっぽど考えてやらない限り、ただの経験というだけになってしまうだろう。

それこそ、ブログを書いたりtwitterに意見を投稿したりすることは思索になりえると思う。 (twitterに日常の愚痴や写真をあげるだけなのは違う) ただ、そんなことをしているのは、ネット上の何パーセントだろうか。

ほとんどの人は、ただネット上の文章を読んでただ時間を潰しているだけだろう。 いろんな人の意見を読むことは重要だと考えていたが、考えてアウトプットしないと何の意味もない。 しかも、彼が言うには読むことばかりしていると考えることが苦手になっていくそう。なので、今後はネットを控えようと思う。