SDL2でC++でテトリスを作る練習してみた

 久しぶりにプログラミングしてみた。
 YouTubeを見てると、「テトリスを作ってみた」というのが沢山あって、なんか、燃えてくるわけだ。

 が

 

● 小一時間どころか

 6時間ぐらいかかった。

 

● しかも

 「次に降ってくるやつ」が表示されてないし、GAME OVERもない。恥と外聞もない。

● で、

 今回色々引っかかったので、メモしておく。

 

● 引っかかったのは下記
  (1)SDL_CreateWindow()でウインドウが表示されない
     前はCreateした後にSDL_Delay(3000);とかで表示されてたのに・・・

  (2)memcpy()ではsizeof()×カウント数を使う
     int配列を1バイトずつ数えないために

  (3)g++でSDL2リンク時「undefined reference to ‘SDL_Init’」になる
     linuxで動かそうとしたら、リンクエラーになり詰まった。ライブラリ指定位置をコマンドラインで変えたら、動く。

  (4)矩形領域のコピー処理
     そりゃそうだ、というバグ。結局、力技でなんとかする。

 

(1)SDL_CreateWindow()でウインドウが表示されない

 昔(4年前:「macでSDL2.0とC++でゲーム画面を表示」)は、

  SDL_CreateWindow(..., SDL_WINDOW_SHOWN);
   :
  SDL_Delay(5000);

 みたくやれば、ウインドウが表示されて、5秒待ってプログラムが終了って動いたはず。

 

● 結論

 stack over flowによると、

  SDL_PollEvent();

 しないと表示されないよ。とのこと。ウハー

 確かに表示された。
 めちゃビビった。

 

● 教えてくれたのは

やはりstack over flowだった。


>ステムにイベントループ処理を走らせる処理を入れる必要がある
>簡単なのは、ループで待つ代わりに、イベントをpoolする処理を書いとくやり方:

 とのこと。
 Toadさんありがとう。

 

● (2)memcpy()ではsizeof()×カウント数を使う

  int myshape[4][16] = {
    // テトリミノの形の定義ズ
    :
    :
  };
  memcpy(this->shape, myshape, 4*16); // bug!

 これでテトリス表示させたら、テトリミノの形がバグるバグる。
 正しくは

  memcpy(this->shape, myshape, sizeof(int)*4*16); // correct

 初心者でした。

 

● どこかのサイトか本かで

 「Cのポインタ演算は、必ずしもアセンブリでのアドレスと対応しない」というような話を聞いたのを思い出した。

  char a[10];
  int  i[10];
  
  char *pa = a;
  int  *pi = i;
  
  pa++;   // アドレスは1ずつ増加する
  pi++;   // アドレスは2ずつとか4ずつとか、分からんけど1ずつは増加しない

 ということだった。

 

● とにかく

 memcpy()のときは、sizeof()の存在を思い出すようにしようと思った。
 初心者でした。

 

(3)g++でSDL2リンク時「undefined reference to ‘SDL_Init’」になる

 linuxでコンパイルし直そうとしてハマった。
 下記だとエラーになる。

g++ -o executable -lSDL2 aaa.cpp bbb.cpp

 例えば

undefined reference to `SDL_Init'`

 みたいな。
 正しくは

g++ -o executable aaa.cpp bbb.cpp -lSDL2

 みたいに「-lSDL2」を行末に持ってくる。

 

● どこで知ったかってぇ?

 これもまたstack over flow
 世界の殆どの答えがここにある。

>inputのパラメータの順番を変えてみて
>これ前に自分もつまづいた(linuxで)
>これだとエラーが出る

g++ --libs sdl2 sdltest.cpp

>これだと大丈夫

g++ sdltest.cpp --libs sdl2

>inputの引数の順序を変えたらうまくいった。SDL2main(.cpp)をSDL(ライブラリ)より前に置いた

 みたい。4年前の方々ありがとうございます。

 

● (4)矩形領域のコピー処理

 25年ぶり3度めの出場だ。
 学生の頃「?」ってなった話。

 こういうのを、ちょい右下に重なる位置に矩形コピーする処理を書いたときの話。
 → 

 もとの矩形の左上から、1段ずつ赤い囲みの中にコピーしていくと、
 すでに1番上の行が、コピー元の情報を壊してる。

 で、こうなって

 なぞのコピー結果に。

 

● 解決策

 たぶん、どう重なるかで左上→右下のコピーする向きを変えるとうまくいきそう(4種類?)。
 なんだけど、

 

● バグりそうなので

 同サイズのバッファを使って、2回コピー。
 25年前には考えられない富豪的プログラミングでいくことにした。

 →  →  → 

 こんな感じ。

Xcodeでflexつかうとエラーになる時のメモ

半日潰したのでメモ。

● 出てたのは

2つ。
Xcode付属のflex,bisonで下記。

  • (1) flex ver 2.5.: C++11仕様でコンパイルでワーニング
  • (2) bison ver2.x:「%define parser_class_name { Parser }」が通じない

(1)(2)ともにXcode付属のflex/bisonが古いぜ。

● 結論

(1)(2)ともに,flex&bisonをverUpしたがXcodeがそれをガン無視。
 ↓
Scanner.cpp, Parser.hpp, Parser.cppを予めコマンドラインで生成して,Xcodeのプロジェクトに追加することに。
 ↓
今度は,Xcodeの環境で読み込む「#include 」が古いファイルを参照するので,/Application/Xcode.app/〜以下のFlexLexer.hをXcodeに内緒で差し替える
 ↓
ビルド成功(ちょっぴりwarningまだ出るけどね)

ここまで半日格闘。

● (1)flex 2.5.x だと c++11 コンパイルでワーニング

flex 2.5.xは,変数宣言だかにregisterキーワードが使われる。
registerはc++11でdeprecatedに。だから Xcode でコンパイル時にワーニングだらけになる。

こちとら趣味だしワーニングなんで放っとこうかと思ったが,何しろ多量だし気味が悪い。

● 調べると

flex 2.6.xは,registerキーワード吐かなくなったらしい。おお。
早速brewでインストール。

$ brew install flex
$ brew link flex --force

これでScanner.lをコンパイルする。

$ flex -o Scanner.cpp Scanner.l

中身からキレイにregisterが消えた。

● このファイルをXcode

に追加すると,register絡みのワーニングは消えた。

● が

今度はエラーが大量に出るように。

Xcode曰く
Too many errors emitted, stopping now

て。ええ!?

● みると Semantic Issue だそうで

「Member reference type ‘std::istream *’ (aka ‘basic_istream *’) is a pointer; did you mean to use ‘->’?」

みると確かに「yyin」がポインターとして宣言されて,「.」演算子が付されてる。
「yyin.rdbuf(std::cin.rdbuf())」みたくなってて妙だ。
「yyin->rdbuf(std::cin.rdbuf())」では,ってコンパイラが言うのも確かに。

しっかしsemanticエラーたって,flexが吐いたコードだしなあ。
webによっては「もう,自分で.を->に編集しちゃおうか」的な話もあり。

● だが救世主はやはり

webの中に。

● stack overflowというサイト

国内に情報が少ない場合に大体googleでヒットするstack overflowだ。

もう。stack overflowyahoo知恵袋に世界の大半は記録されてるんじゃないか。

上記リンク先のAlex H.さん(stack overflowの方ね)曰く

you might be able to just use a newer “FlexLexer.h” (for example the one from here: https://github.com/westes/flex/blob/master/src/FlexLexer.h)
(新しいほうの”FlexLexer.h”が使える。(例えばこことか))

FlexLexer.hが古いんで,新しいやつダウンロードして使えば?という。

理由はAlex H.さんの予想だと

I believe the issue is an out of sync “FlexLexer.h”. Flex 2.6.0 changed the storage definition of yyin storage for C++ scanners for both the header and the generated source. However I suppose the mac port package is including an out-of-date FlexLexer.h, even though flex itself has been updated. This leads to the mismatch you are seeing as compilation errors.

ということのよう。って英語だらけ。だいたい

  • flex 2.6.0で,yyinの定義が変更になってる
  • flex自体は更新されても,古いまんまの”FlexLexer.h”が読み込まれてるんじゃないか

ということか。

● そこで

仰せの通りここへ行って,FlexLexer.hをダウンロード。
いや実際にはここでcloneをダウンロード。
どこに入れればいいかというと

~$ find /Applications/Xcode.app/ -name "FlexLexer.h"
/Applications/Xcode.app//Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/FlexLexer.h

発見。

これで(1)が解決。
Xcodeにはコマンドラインで作ったScanner.h

$ flex -o Scanner.cpp Scanner.l

を後から読み込ませれば世はすべて事もなし。

● (2) bison ver2.x:「%define parser_class_name { Parser }」が通じない

$ brew install bison
$ brew link bison --force

そして

$ bison -o Parser.cpp Parser.y

を後からXcodeに読み込ませる。

● なんとかおしまい

上記でビルド成功(ちょっぴりwarningまだ出るけどね)。

次は

● 今まで作ってた

SDL2.0のプログラムとマージしてみる。

Apple Watchを買ったら自分の腕のほうが大きかった話

というわけで

買っちゃった。apple watchだ。そしてAirPodsだ。

● 苦節3年

 ずっと欲しい欲しい言ってきたわけだ。apple watch。
 癇症の疲れたお嫁いわく

−もうな,

 欲しい?買えばええやん。もう。

● という

 『ハッピーウエディング前ソング』ヤバイTシャツ屋さん

 だ。

● で

● 勢いで38mm買ったら付属のバンドが小さすぎて手首に巻けませんでした

 という一連の流れを,だいたい

● 56,000円ぐらい掛けてお送りするわけだ

 まずは5月13日。

 届いた。
 前日14時までのネット発注で,翌日午前中に届くというこのサイバーシティ。

● まずは

 AirPodsだ。

 ダンボールを開けるとこんにちはする。

● こんな感じで

 収まってるわけだが,手に持つと

 小さい・・。
 すげえ。

● 開けてく

 いつものカードがこんにちは。

 の下に真珠のように

 ケース&本体。

 の下がライトニングケーブル。

 丸いぜ。

● 続いて,いよいよ本命

 開け口はこんな

 ここを持って剥ぐパターンのやつ。

 なるほどキレイに剥がせるって
 わ
  け

    か

 キャー既にアップルウォッチみたーい♥

● という

 ことを言ってると,いよいよ御大が

 こんにちはする。

 これの

 両端の発泡スチロールは後に,子どもたちのメガネに。

 こんな感じのキャラのあれだ。

 apple watchの中敷きの発泡スチロールまでがアミューズメント。

● 更に開ける

 いつものカード・・。

 

 そのカードをどけると・・

 ・・・・!?

● 高まる鼓動

 これ・・・・・

 俺の腕より短いやん・・。

● 以下,

 動揺しすぎて,撮影できず。
 身体中の毛穴が閉じたり開いたり揺らめいたりする中口元は半笑いで

 もう,ね・・

● 僕の記憶の中では

 こんな

 もうね。

 「おれ うで おおきい。
  あっぽうぉっち おれ ちっちゃい くやしい。」

 て感じだ。だった。巨人かよ。

 しかし,あんなに

● 口の中って乾くんだ

 で,結局。

● 最後の袋だ

 この中には。

● 何となしに

 amazonで発注してた

 これが入ってるはず。
 シルバーリンクブレスレットで2,499円。

 本家だと45,800円。
 その差は43,301円。

 差額が,ほぼ本家の値段だ。

 

● ふとメールを

 チェックすると

 送られてるのは・・・

 ・・・・。

● ゴールドッ

● エクスペリエンスッ

● レクイエムッ!

 最強の香りが漂う。

 うそ,これ送ってんの!?

 俺,シルバーっつったよね!?

 え?ゴールド?!

● この 俺の エクスペンシブ シルバー

 がッ!

● 恐る恐る

 開ける・・・。

● あ,ケースね

 あけるぞ あけるぞ

 あけろ あけろ

 う・・・

● !?

 シルバーでした。
 こっちは。

 で,つけてみる。

 おー。

● というか

 こっちは腕にハマるのか。恐る恐る

● 巻くと

 無調整でぴったり。

 レビューには「調整できない」とか「部品壊れた」とか書かれてたんで,調整なしなのはありがたく。

 あの38mmのフォグ色のバンドはどうしようか思案。

 ま,何しろ,3年間悩んでる間,一度も試着もせず,腕周りを測りもせずだったのがいけない。
 これを着けて,これから盛岡へいく。

映画『ダイバージェント』をみる

午前2時に,見始めるHulu

● なんか

2時間20分ぐらい掛かるらしい。
吹き替えでもいいけど,そのまんまを聞けるし,英語の勉強になるかなと

● 字幕版

で見て

● フーフー!

言ってたら,4時20分じゃねえか。

● ッアー

そういやそう言ってたな。2時間20分だって。
正確だ。

● キャッチフレーズは

『たった1回の性格診断で未来は決まる』
だ。

すげー気になるじゃん。しかも近未来。

● 100年前の「最終戦争」で

教訓を得た人類は,性格診断で人種を分けたんだそうだ。
分けるから争うだろうに。。

おまえらもう一遍ジョンレノンの『イマジン』でも聴いてろって

● 江戸前のてやんでえで

言ってやりたいですよ。ええ。僕なんかになるとね。(なんだ)

● その人種は


  1. 博識
  2. 無欲
  3. 勇敢
  4. ???
  5. ???

あとなんだっけ。
あと2つぐらいあったぜ。

・・・。
出てこないんで分かんないや。えーと(「平和」「高潔」だって)。

あと,どれにも属さない「ダイバージェント=「異端者」」がいる。
劇中では,もう,日本史の穢多非人的な役どころ。

「派閥」内で脱落したりタブーを犯したりしたらなるっぽい。

さすが契約社会だ。

欧米だ。

● そしたら

政治は「無欲」が司ることになってたけど,そのうちに

● 「博識」が

例のごとく

「永遠の平和を実現するのは,あてくし共ですわっ」みたく

やってくる。
あのヒール役の女優さんは何て人だろう。あんまりにも憎らしすぎてリスペクトする。

● 結局

分類するから軋轢が生ずるのか。
どうあがいても,人間の性でしようがないのか。

支配する側と,される側になるという構図を描いてて吐き気が止めどもない。

次に生まれるときは神様になりてえなあ。

● 「無欲」出身の

主人公は,なんだかのセレモニー(儀式)で「勇敢(治安部隊)」に
兄貴は,同じ日のセレモニー(生年関係ないのかな)で「博識(研究職,で,そのトップはクーデタラー)」に

それぞれ手のひらにナイフを入れて,誓いを立ててしまう。

痛そう。

ナイフで「グサ」って。ケッパンみたいなもんか。
にしても痛そう。

なんで,本気度示すときって,洋の東西血ぃを出すのか。
小学生がついおっぱい見て鼻血出すのはやっぱ本気度なのかも知れないなと思って映画を見る。

● あ

これネタバレサイトかも知れないです。

● つまり

出生はどうあれ,手のひらさえ切れれば,

● 商人の子が

侍に。

● 侍でござるが

やっぱ農民になるだよ。

● とか,一応ありだけど

家柄と異なると,両親ともう

● 会えないという。

なかなかの縛り。

● 「無欲」出身の

兄妹はそれぞれ

兄:「俺ってインテリジェンスだから博愛ってか,「博識」だよな。」
妹:「なんか,性格診断で「ヤバめ」って出ちゃった。直感で「勇敢」かな」

てなった。
文章理解能力希薄。

● なんか

フォーっていう男がイケメンすぎてため息が止まらないうちに

娘をかばって母(実は「勇敢」出身)が凶弾に倒れ,
敵の中枢進入時に,かなり勇敢で憤慨しきった父(格好いい)が,でもやはり凶弾に倒れ

主人公は

● 両親を失う

イヤー!!

これも幻覚であって欲しかった。

● アクションや

その他諸々。例えば

● 幻覚剤を

打たれて,幻覚世界を彷徨い歩くとか。
起きたと思ったらまだ幻覚世界だったーーとか。

● で起きたら

やっぱまだ幻覚世界やないかーい

● とか

どれがホントか分かんなーい♡

みたいな

● ヤバめの

トリックが2重3重なのかと思いきや,意外とガチだったり。チュー
ここでエロか?!と思ったら,主人公の女の子が

● まだだめー♥

とか。
エロやサイコや,かなり格好いいアクションシーンで僕を揺さぶりながら,

しかし

● 「無欲」の人々を押さえつけ

芝生に泣き崩れる「無欲」の人々に銃口を突きつける,
「博識」がつくっったヤクで操られた「勇敢」の黒尽くめの人々(中には主人公の親友の女の子も銃口構えてたり)を見たり。

● ホロコーストって

こんな絵面だったのかとか。
先の大戦で,日本人はどんなことまではしたのかなとか。

ばーちゃんは
「アメリカさんは,女にひどいことをしてくると聴いてたけど,アメリカさんは,結局紳士だっただよなあ」とか。

まあ近隣のアジア諸国をよく言わなかった祖母の言は
僕からすればあれはあれだけど

● もう一度

人が人を殺すことに
何ら正当な理由なんかない。

戦争なんていうのは

● やっちゃいけないことで

大抵,そこにwin-loseのえげつない図式があり
僕ら善良な市民は,そのことを子々孫々伝えるのが
文化を持った良心なんだろうと

● 思うにとどめつつ

設定や,「博識」が「勇敢」を操り,「無欲」を駆逐しようと,
先の戦争からわずか100年で
そういう構図が生まれるということを暗示した設定に

● 考えさせられた

わけだ。

いつか書いたけど
僕の愛する子どもたちが,やがて大人になる頃に
世の中がもう少しでもよくなれば
いいのになあと思ったわけだ。

コログ

最近のこと。

これは生きたログだから,最近のことをかき殴ろうというわけだ。

● プログラム紀

始まる。
久しぶりに,プログラムを趣味でカタカタやる。

もっぱら

● flex & bison in C++

というやつだ。
flexとbisonを使って,簡単すぎるインタプリタぐらいまでは作れそうな感じに。

bison -> flex へのヘッダファイル提供。
実際には,bisonで言語ルールまで書いて%tokenや%typeで宣言した部分を,
後に flex で#includeして使うということのよう。

これには,

● これに

めっぽうお世話になりました。
動物の柄のこの本,学生時代から憧れの象徴。

実際には,2年前ぐらいか。秋ぐらいから寝床で読んでは
単語がわからずiphoneとかで調べる。

  • precedence:優先順位(計算機演算ではpriorityて言わないのかな)
  • arbitrary:任意の
  • adequate:十分な
  • punctuation:句読点(句読法か)
  • glue to:接着する
  • simultaneously:同時に
  • albeit:〜であるが。
    (p12. “This is a hack, albeit a very useful one, since most of the time it does the right thing.”)

いくつかは入試レベルな気もし。
albeitって,そういう意味で使うんだ。など。

● 下記は,去年の夏に書いてボツにしたブログから

−−−−−−
● 学生のとき(1994〜2000年ぐらい)

大学の授業でBNF記法というのを学んだわけだが、まあ

→ 学べてなかった

単位はもらえたんだっけ。という。
bisonでは、言語仕様をBNF風に書かねばならなかったはず。

● 戸塚時代(2002年〜2007年ぐらい)

よーしいっちょう、flexでも勉強して、新種のプログラミング言語でも発明してやりますかぁ〜
と意気込み、再三挫折。

ギリflexまでは分かる。
けどbisonで何度やってもどうやっても僕の書いたBNFの言語仕様が

● ambiguous grammar

ていうエラーになる。
訳すと「曖昧な文法」。何が曖昧じゃい。曖昧な日本の私のプログラム言語の仕様。

僕にはもう、bisonを使う才能とか、生きている価値とか、死なない権利とか、笑う勇気とか、

● 何にもないに違いない

と咆哮したり呻いたりして畳の目に逆らって爪を立てたり、足の裏で敷居をゴシゴシしたりしては、とにかく、諦めていた訳だ。
−−−−−−

● という

存外に元気な感じでやってたわけだ。
やがて分かりかける。

● 飯も自炊し

再び去年の盆に書いてボツにしたブログから引用する。

−−−−−−
● で

何に感動したかというと、この『flex&bison』の「計算式を入力すると、加減乗除を優先順位を守って計算する」という
サンプルプログラムをつくる中での p.14 だ。

またしばらくすると、仕事で頭が一杯になって、何を理解したのか忘れると思うので、備忘録として残す。

Ambiguous Grammars: Not Quite
The reader may be wondering at this point whether the grammar in Example 1-5 is needlessly complicated. Why not just write this?
(読者はExample 1-5が不必要に複雑だと思っているかも知れない。こう書いてはだめかと。)

exp: exp ADD exp
   | exp SUB exp
   | exp MUL exp
   | exp DIV exp
   | ABS exp
   | NUMBER

そうそう、まさにそう。↑みたく書いちゃなんでダメなんだって十年来わからなかった。
この辺、わくわくしながら読んだ。

ちなみに「Example 1-5」というのは、bisonへ渡す言語仕様を書いたもので p.11 にはこうある。

Bison’s Rule Input Language
Bison rules are basically BNF, with the punctuation simplified a little to make them easier to type. Example 1-5 shows the bison code, including the BNF, for the first version of our calculator.
(bisonに渡すコードは基本的にBNFだが、容易に書けるよう記法を少し簡単にしている。Example 1-5 に計算機の一番最初のバージョンのためのbison用のコード(BNFを含む)を示す。)
Example 1-5 Simple calculator fb1-5.y

 <前略>

calclist: /* nothing */
  | calclist exp EOL { printf("= %d\n", $1); }
  ;

exp: factor
  | exp ADD factor { && = $1 + $3; }
  | exp SUB factor { && = $1 - $3; }
  ;

factor: term
  | factor MUL term { $$ = $1 * $3; }
  | factor DIV term { $$ = $1 / $3; }
  ;

term: NUMBER
  | ABS term { $$ = $2 >= 0? $2 : -$2; }
 ;

<後略>

そうコレなのだ。僕が戸塚時代にメロメロになったやつ。
よく入門書なんかに書いてあるやつだ。

何でこんなに分けて、わざわざ複雑に書かねばならんのだと。謎だった。

p.14でLevine先生が言う「The reader wondering at the point」こそ僕だ。

そしたらそのp.14にはこう続く。

There are two answers: precedence and ambiguity. The separate symbols for term, factor, and exp tell bison to handle ABS, then MUL and DIV, and then ADD and SUB.
(答えは2つある。優先順位と曖昧さだ。termとfactorとexpを分けて書くことで、bisonにまずABSを、その次にMULとDIVを、そしてその次にADDとSUBを処理するよう指示している。)

興奮して音読していた。
そういうことだったんだ。今までこの世のどこにもなかった答えが初めて身に染み入る。ッアー!
−−−−−−

● 何やら

感動している。
スピッツのメドレーをyoutubeで流しながら,暑い日,来る日も来る日も

● 新築の

家の中で猫と僕だけ住んでる状況。
その中で,ずっとプログラム三昧。何度かラム肉食って赤ワイン飲みまくって吐く。

● 分かったことは

C++でflex, bisonを利用することは可能ということと,
ヘッダファイルで

#undef YY_DECL
#define YY_DECL \
yy::Parser::token_type \
Scanner::scan(yy::Parser::semantic_type* yylval, \
			  yy::Parser::location_type* yylloc, \
			  ParseDriver& driver)

とかやったり,かなりトリッキーだということと。

Parser.y内で,


%{
#include "ParseDriver.hpp"

//yylex()のオーバーロード
yy::Parser::token_type
yylex(
yy::Parser::semantic_type* yylval,
yy::Parser::location_type* yylloc,
ParseDriver& driver) {
	return driver.scanner->scan(yylval, yylloc, driver);
}

// parser's error routine <- it's need to be implemented by us
void
yy::Parser::error(
const yy::Parser::location_type& l,
const std::string& m) {
	driver.error(l, m);
}
%}

なんていう,なかなか香ばしいことを書く必要。

● なんか

もともと flex, bison が広域変数使いまくったり,
#ifndefや#defineつかって,凄いことになってたりする中,

● flex, bison in C++も

C++のクラスを使う上で,かなり凄いことになってる。ということのよう。
勉強したのは下記。

  • Blog Alpha Networkingめっちゃお世話になりました。GW前〜GW中@ハトヤ。ずっと解読してました。言ったら実際に手で打って写してました。
  • bison-test@GitHub日本人の方のソース。めっっっっっちゃ分かりやすかったっす。ありがたい。
  • flatB-Compiler-and-Interpreter@GitHubAST(Abstract Syntax Tree:抽象構文木)をC++で作ろうという場合の,B-flatというC言語ぽい言語の,(1)文法チェック(2)インタプリタ(3)コンパイラの例示。すげえ。
  • 10.1.4 C++ Parser InterfaceGNUか何かの,てほどき。bison側の。
  • Generating C++ scannersGNUか何か。flex側の。

やっと,コンパイルフリーなBison/Flexのtinyセットを作成できた。
コレを元に,ASTつくって逐次実行するサンプルができたら,

● やっと

1年以上ぶりにyoutubeのサイトを更新できそうだ。
今日はプログラム紀について。

● 次回は音楽編

そんで次は,最近の人生観について。
順次追記していく。

flex&bisonの勉強

をしてる。

IMG_9153

これ。
今わかった所までの覚え書き。

● 近況

 youtubeへは下記をアップロード。

 ゲームのメインループをクラスに切り出してみたという話。

● で、いよいよ次は

 スクリプトの解析をする処理。アドベンチャーゲームだから。
 シナリオを書いたテキストファイルを読み込んで、ゲームを動かしてみたい。

 で現状下記がボツに。

  1. logo.gif lua :スクリプト言語。いろいろ目処立たず。
  2. kirikiri_inside_small吉里吉里:windows版のよう。なのと、すごい存在感。手を出すとここまで撮った動画が無為になるため見て見ぬふり。

 というわけで自分でつくることにした。

● スクリプトファイルを

 単語単位に分けるのがflex

fade 0           画面の輝度を0に
load "awesome.jpg"    背景画像をロード
fade 0 to 100 in 500   画面の輝度を0から100%まで500ミリ秒で

wait            ユーザ入力を待つ

 こういうのを。

fade
0
load
awesome.jpg
fade
0
to
100
in
500
wait

 こういう風に直してくれるのがflex
 ありがとうflex

● これやるためのflexコードが

 こんな感じ。

%{
#include "myparser.tab.h"
%}

%%

<INITIAL>"fade"		{ return FADE; }
<INITIAL>"load"		{ return LOAD; }
<INITIAL>"to"			{ return TO; }
<INITIAL>"in"			{ return IN; }
<INITIAL>"wait"		{ return WAIT; }
<INITIAL>[0-9]+		{ yylval.integer_value = atoi(yytext); return INT_VALUE; }
<INITIAL>[ \t]		{ }
<INITIAL>"\""			{ yylval.string_literal[0] = '\0'; BEGIN _LITERAL; }
<_LITERAL>"\""		{ BEGIN INITIAL; return STR_LITERAL; }
<_LITERAL>.			{ strcat(yylval.string_literal, yytext); }

%%

 flexにお願いするとこれを元に、C言語のコードを生成してくれる。
 そのC言語のコードの冒頭あたりに

#include "myparser.tab.h"

 が挿入される。

 また、

<INITIAL>"fade"		{ return FADE; }

 と書いておくと、
 入力されたファイルの中に「fade」という単語が見つかったら、「return FADE;」を実行するようなC言語のコードが生成される感じだ。

 このときFADEは記号定数だが、宣言部分を生成してくれるのはbison

● bisonの方のコードが

 これで

%{
#include "stdio.h"
extern int yylex();
extern int yyerror(char *);
%}

%union {
	int integer_value;
	char string_literal[2048];
}

%token FADE LOAD TO IN WAIT
%token <integer_value> INT_VALUE
%token <string_literal> STR_LITERAL

%%

program			: /* empty or.. */
				| program command
				;

command			: FADE INT_VALUE { printf("fade to %d\n", $2); }
				| LOAD STR_LITERAL { printf("load the file named: '%s'\n", $2); }
				| FADE INT_VALUE TO INT_VALUE IN INT_VALUE { printf("fade from %d to %d in %d milli second\n", $2, $4, $6); }
				| WAIT { printf("ordered to wait.\n"); }
				;

 これの

%token FADE LOAD TO IN WAIT

 ここで指定したやつが”myparser.tab.h”に

#define FADE 258
#define LOAD 259
#define TO 260
#define IN 261
#define WAIT 262
 :

 みたく展開される。これをさっきflexのほうで

#include "myparser.tab.h"

 として読み込んでいる。
 だからflexが読み込むファイルの中に

<INITIAL>"fade"		{ return FADE; }

 とあっても、FADEがdefineされているので通る。

● あとは

mylange.c

#include <stdio.h>
#include "myparser.tab.h"

int yyerror(char *s) {
	printf("yyerror(): %s", s);
	return -1;
}

int yywrap(void) {
	return 1;
}

extern int yyparse(void);

int main() {
	yyparse();
	return 0;
}

 これでmain()からyyparse()を呼び出す。
 yyparse()が、bisonが生成したコード(構文解析器)の処理呼び出しになっている。
 yyparse()の中では、flexが生成したコード(字句解析器)の処理(単語単位で取り出す処理)を使うという寸法。

 yyerror()とyywrap()はこんな感じで定義しておくらしい(いい加減)。

● 実行結果

 こんな感じ。

$ ./mylang < sample.txt
fade to 0
load the file named: 'awesome.jpg'
fade from 0 to 100 in 500 milli second
ordered to wait.
$

 なんか元のスクリプトと同じような出力にしてしまった・・。
 けど正真正銘、字句解析器→構文解析器を通した結果出力。

● はじめ

 特に理解がいかなかったのがflex生成コードと、
 bisonが生成したコードの結びつき具合。

● 現在は

 flexとbisonが出してくれたCコードを、
 ゲームメインのC++から呼び出すときの齟齬が出ないか恐る恐るリンク中。

父の日208*9

 という訳で

IMG_8864

 父の日だ2017。
 いろいろ秘密だ。

 僕の,実の父との話は,本当に

● 秘密だ

 という

● わけで

 数日前から

● あった

 らしい。置き手紙を6月17日の朝,とうとう見つける。
 仕事では,新たに,色々なクレームを抱える。

IMG_8851

● なんねなんね

 これの裏は,

IMG_8852

 こうなってる。
 「おくれないでね」?

● ?

 だと?
 というわけもあり,本日6月18日午前0時数分,

● 開けてみたよマイサン

 すると

IMG_8855

 ようするにチャレンジだ。ベネッセだ!!
 親の感動するツボを心得ているだ!

● そんな

 出来すぎた状況に涙なんか

● する

● もんか

 というわけで,

● 20歳にして始めて

 近所の飲み屋で平日の7時台に,スズメの丸焼きが出てきて

● 部活へ向かう南西中の

 僕らのはるか下の後輩のジャージ姿を
 頭頂に,竹串の穴が空いた

● スズメを

 タレで食いながら眺めてた22歳ぐらいの僕が言う。

● 違和感しか

 ないっすよ。これ。
 うまいけどね。

 スズメの丸焼きは。タレでも塩でも。

● ああ

 というわけで

  1. サントリー ウーロンハイ350×2
  2. 白角水割り×2
  3. タカラ缶酎ハイ×1

 を飲みきり,家でボールペンを持ってA4に書くには。

IMG_8861

 というわけだ。

● 全文,という名の生きたログ

___くん お母さん __ちゃん

 父の日のプレゼントありがとう。
 ほんとうにありがとう。

 お父さんはみんなに
 会えて ほんとうに
 良かったと 思っています。

 たった一回の人の人生で
 みんなに 会うことが できて。

 みんなを 生んでくれた お母さん。
 生まれてきてくれたみんな みんな 大好きですよ。

 ありがとう。

 この家と この家の窓から見える 青空が好きで
 しばし 泡沫と見ずに 楽しくいきていこうね

 さーーーーーー肉,喰うぞーー!ウホー!

● ここまで

 色々あったからこそ
 深く,深まる感謝があるんだろう。

自分でもう一度読もうと思うタイトル

本当は、自分の生きてきたことをテキストエディタでどこかで書かねばなあ。

IMG_8423moz

と思いながら、昔の書き込みを見てたら。

あ、ちなみに写真は気持ち悪い。
ある日、仕事から帰ると、左足になぜかハンコ(2色)が押されてたという写真。なんだこれ。

そういえば2日前ほどに、とうとうUFOを見た(気がした)。
すると息子が言う。

僕は7歳になって2回見たんだ、UFO。

  1. 西行のうた 2014年4月7日, 15時52分
    2014年の話。
    相武台前の駅前で仕事をしてた頃。
    相陽中の桜だろう。
    綺麗に散っていた。その時、入学を祝った生徒はもう
    高校を卒業しようとしている。

    いろいろなことがあった。
    その2年後の2月、大きなクレームを母親から頂いて、
    すげー投げやりなため息とともに、当時4,5歳の息子と、雪そぼ降る中、箱根の温泉につかったのはまだ記憶に鮮明に残る。

    いや。

    西行のうたである。
    この花は、一体、何十垓人の心と生と死を彩ってきたのだろう。

    wikipediaで「辞世」を調べるとこの花を詠んだ句は無数にある。

    友を得て なほぞうれしき 桜花 昨日にかはる 今日のいろ香は  毛利元就

    ちりぬべき 時知りてこそ 世の中の 花も花なれ 人も人なれ    細川ガラシャ

    限りあれば 吹かねど花は 散るものを 心短き 春の山風    蒲生氏郷

    散るをいとふ 世にも人にも さきがけて 散るこそ花と 吹く小夜嵐  三島由紀夫

  2. ダルマ掃除 2005年12月31日, 01時53分

    今、7歳の息子と2歳の娘が家にいる。
    41歳の僕と、41歳のお嫁もだ。

    息子に<<今も>>必ず僕はこういうことにしている。

    極めてシンクロニシティな私的なこと 2013年8月17日, 00時01分
    の中で書いた。

    言うのは下記点である。

    (1)◎◎くん、大好きだよ
    (2)お父さんとお母さんの子供に生まれてきてくれてありがとう
    (3)お父さんも、お母さんも、本当に嬉しかったんだよ

    今では息子は7歳で、
    足は長いし、身体はでかいし、寝返りは信じられないほど信じられない方向にうつし

    しかし、(1)を言うと「うんうん、わかってるって」というふうに、寝顔で笑顔で、小さく頷いてくれるんだ。

    そうそう娘には最近ことあるごとに「かわいいねー」と言い続ける。
    やがて頷き始める娘。

    お嫁曰く、だんなさんはおじいちゃんに会えて本当によかったね。

    僕に底の知れない人の優しさと、いわゆる「人の良さ」の存在をこの世に高らかに
    赤らんだ頬と鼻と、
    青空の向こうに巨大な雲のあること、
    足元に黒いオタマジャクシの気味の悪い世界があること、
    人はこんなに人にやさしく、ひとの性や業を許し赦し生きることができるのだと
    おしりのポッケに片方をしまいこんだ白い手ぬぐいで汗を拭い拭い
    僕に示し続けてくれた、そしていまも示し続けてくれている
    底なしに優しく、短気で、そこそこ酒飲みで、ばあちゃんのイビキを買ったばかりのカセットテープレコーダーで録音してみたりした
    子供のような
    僕のだいすきなおじいちゃんの話だ。

  3. 夜歩く 2013年4月26日, 03時19分

    同名の本があるとかないとか。
    主にミスチルの『ランニングハイ』を想い。

    少し前(2004年ぐらい)に、前の会社のSさんという方の説法を聞くうちに、

    気が狂いそうになり、今で言うパワハラというやつで
    心療内科で、中学生以来の謎の白い錠剤をたくさんもらい、しかも中学生以来
    一度も「うつ病ですよ」と言われることなく、気がついたら、錠剤を飲み忘れるようになっていた頃。

    戸塚から1号線を、原宿方面へ車を走らせると、曲がりにくい右折を通り越した先にそのクリニックはある。

    行き帰りに、よせばいいのに、大音量で聞いてたのがこの曲だ。
    ランニングハイ

    亡霊が出るというお屋敷を
    キャタピラが踏みつぶして
    来春ごろにマンションに変わると代理人が告げる
    また僕を育ててくれた景色が呆気なく金になった
    少しだけ感傷に浸った後「まぁ それもそうだなぁ」

    たまらなかった。
    今でも、この曲を聞くと、当時の情景が浮かぶ。

  4. ばあちゃん他界

    僕の嫌いだったばあちゃんがなくなった。
    家のことは、おって書こう。

    テキストエディタで書こうとしたが止まった。

    直接wwwにつながるこのエディタ(ブラウザ上)で書き綴るのが向いている話。

    とにかくばあちゃんが亡くなる。

    お嫁への感謝、父親が意外と泣いてた話、母はよくあんだけ献身的になれたもんだ、
    ばあちゃんの甥にあたる、僕の叔父が

    普段の冷静沈着な印象に反し、ここまで僕の祖母を想ってくださっていたんだという
    気持ちを書いている。

xcodeでsdlのヘッダに出てくる謎のワーニングを回避するメモ

 というわけで、今までつくりためたsdl関係のC++クラスを使って、

wwwthumbnail.php

 アクションゲームを作りたくなってきている。(画面は2008年に作りかけてたときのやつ)
 んだが。

● ふと気づくと

 sdl2.0のヘッダファイルをインクルードすると

● ワーニングが

スクリーンショット 2017-06-02 13.49.17

 表示されるようになってた。
 息子が横で見てて、

ー何それー?ねえ、全部消してね、全部ちゃんと消して〜

 と言う。
 んん。まあ、動くからいいじゃん、とも思いつつ気になるので調べてみた。

● どうも

 よく見ると

スクリーンショット 2017-06-02 13.49.28

 「Documentation Issue」とのことで、なんでも

– ‘\return’ command used in a comment that is attached to a function returning void

 だそう。意訳すると

ー戻り値の型がvoidの関数に付随するコメント内で、戻り値があるかのようにreturnコマンドについて書かてるからおかしいよ。

● 見ると

 SDL_assert.hとか、ヘッダファイル内を指してるぽい。

 で、見てみると

スクリーンショット 2017-06-02 13.50.16

 コメントがワーニング・・だと。

● んなアホなと。

● 思いつつ

 どうも

● コメント内に関数とかそういうのの

 仕様を記述しておくものらしい。

 ツールを通して、自動で仕様書?みたいな「ドキュメント」を作るような支援機能用なのか、
 後からそこを追いかけて、IDEのエディタがカーソル付近に情報を表示してくれるのか。

● これは

 絶対、オフにするオプションがあるハズ、と思ってネットを当たってみたが
 日本語のページを探し当てられず、
 出てくるのは

ー Hi im having a big trouble in ほにゃらかほにゃらか

 みたいな英文ばかり。

 なので、メモしとく。

● 下記

スクリーンショット 2017-06-02 13.50.40

 だ。
 これをNoに設定すればワーニングは消える。

 じゃ次は、いま上げてるyoutubeのプログラム動画の次のテーマを
 アクションゲームづくりにできそうかどうか実験してみる。

今回のゴールデンウィーク

振り返る。

IMG_8470

まずは伊東から。

● ずっと

前から,どこかの長期休暇では息子と行こうと思ってた。

伊東だ。

もっと言うと,

● ハトヤ

だ。

● やったぜ伊東

IMG_8465 IMG_8471

エレベータがいい味出してる。

IMG_8480

伊東駅でふと振り仰げば

IMG_8469

● そして

楽しみなのは

IMG_8483

息子IMG_8484

うまいこといくとハトヤは

● 晩飯が

ブッフェだ。
言い換えると,取りたい放題。だ。

● 翌朝も

IMG_8486

だぜ。
食べまくったぜ。

俺はまだ 3 0 代〜〜〜
荒野を〜〜〜

コブラ〜〜

● などと

言ってられるのはこの頃まででだいたい今年41だし

● その後

本格的にゴールデンウィークを

● 堪能しようと

横浜銀行大和支店の皆様に内緒で

● 住宅ローンの

返済もせずに向かった先は

● 沖

● ウソ

ちゃんと繰り上げ返済してますよ。
ええ。

もう,ね。

● 昨年末に

確定申告で,住宅ローンの控除だか何だかで
戻ってきたお金をすべて沖縄に投入するのだ。

● ウホー

という

IMG_8686!?

わけで。(画像は沖縄から帰ってきた日の娘)。

● 行ってきましたわ

IMG_8580

沖縄。

入り口からどちらへ

IMG_8604

行けばいいか分からず。

● 2日目(5月5日)は

曇りのち雨。

と気象庁が言ってるにも関わらず。

● わが嫁が

え〜〜〜〜〜〜〜〜〜
海行きたかったのにーーーーーーーーーーーーーーーーーーーー

● 言ったが最後

IMG_8580

IMG_8576

晴れわたる空。
どうなってんだ。

● 丸山家の最強の晴れ女によって

沖縄一帯,間もなく梅雨入りだというのに。

晴れました。
ありがとうございます。

宿舎近くの「かねひで」で

IMG_8561

お刺し身と,海ぶどうと,醤油を購入。
この辺,昔と変わらない。

昔2013
昔2011

● で

2日目の夜。
国際通りへ。

IMG_8650

泡盛を,近年まれに見る腹痛た+下痢の中,

● ロックで

飲み干した所,その後,未明から

● やばい

腹痛に。
思えばこのGW,ずっとブッフェで,食べまくる。この食生活。

ここ最近のホテル食(朝も夜もブッフェで調子こいてました)。

IMG_8569

IMG_8563

IMG_8652

● 5月6日(土)の

朝飯。忘れもしない。

IMG_8651

まさかの感じ満載。

ああああ。

もう,無理んすよ。。。

● その日

お嫁の優しさに痛み入る。

● 5月6日(土)くもり

ぼくは一日じゅう,寝てました。おなかが痛くて痛くて。

新ビオフェルミンと,
胃腸風邪にきく薬を飲んで,
フロントのお姉さんにかりた,体温計ではかったら,37.9度でした。

ごめんなさいごめんなさいごめんなさいごめんなさいごめんなさい。

● 家族

息子:NHKのスクラッチを一日中堪能。後日談。沖縄は楽しかったねー。特にスクラッチを一日中できた日〜
娘:一日中,mac book airで,(音出るかも)アンマンパンの素人さん動画を視聴。
お嫁:看病。薬を買ってきたり,ポカリを買い足したり・・・。

僕:いつまで経っても冷たい腹を,両手で温めながら,母鳥のようにうんうん言い続け,時々起きたと思えば,下痢。

もうね。
torsion

● 娘(2歳)は

IMG_8518

ご立腹ですわ。
Siriもなげやりですわ。

● 5月7日(日)

なんとか立ち直られた僕らが向かったのは,公設市場

すごい昔,息子もまだ生まれてない頃,
お嫁と行って,1階で買った魚を,料理してもらって2階で頂いた記憶。

● 最近では

物騒な世の中を反映して

IMG_8669

殺害予告までされる緊張感。たまらん。

● 気がつけば

IMG_8674

IMG_8675

こんな感じで

● 悪い

IMG_8668

大人も国際通りで見かけ。

腹が痛いまま,今日も仕事してきましたよ。ええ。クレーム対応とか。しながら。
クロアチゼパム5mg,飲んで寝る。

とにかく忘れないうちに,人生の記録を残す。
ありがとう,息子,娘。そしてお嫁。

youtubeでのプログラム系のんとかは,また今度。