或曰

木曜日, 6月 28, 2007

ツインリンクもてぎ フルコース スポーツ走行

連休最終日。今日は、栃木県のツインリンクもてぎへ。

ここは地理的には僻地だけど、ファシリティとオフィシャルが充実しており、走行料金も良心的なので好きなサーキットです。コースレイアウトは長い直線とコーナーという典型的なストップ&ゴーのレイアウトなのでレースの展開は単調になりがちですが、走る分には気持ちよくアクセル開けていけるので楽しいですね。

ショートカットなしのフルコース走るのは 5/14 のスキルアップミーティング以来。前回のタイムは3本走って、ベストラップが 2'32.218 で、安定して走れるのは 2'34~35 といったところ。そろそろ 2'30 切りたい。



走行開始前のブリーフィング。特にコース状況は問題ないが、路面温度が高くなりそうなのでタイヤの熱ダレに注意して走ってほしい旨。

リアサスペンションのプリロードを調整したばかりということもあり、一本目はその様子も見つつ感覚を思い出しながら無理せず走行。プリロードをかけたのは良かったようで、これまでコーナー進入でリアが上下に動いてなかなか安定しなかったのが、すっと落ち着くようになった。

路面状況が悪い道をスローペースで走る際には、プリロードを抜いて柔らかめの設定にすると段差でリアが跳ねずに安心して乗れるけど、荷重がかかるサーキットだと動きが収束するに時間がかかりすぎるのか。なるほどねぇ。

6R のプリロード調整はちょっとちょっと面倒なので、公道・サーキットそこそこいけるセッティング見つけて妥協しておこう。それで物足りなくなるほど腕が上がったら、その時に考える方向で (当分、そんな日は来ないと思うけど)。

ダウンヒルストレートでアクセル全開にしても6速まで上がらない。どうもシフトアップインジゲータ(エンジン回転数が指定した数値に達すると点灯してシフトアップを促す)の設定値が低すぎる気がしたのでタコメータ見ながら走ったら 12,000rpm になってる。レッドゾーンが 15,500rpm から始まる高回転型エンジンで、それは低すぎだろう。特に設定変更した覚えはないんだけど、いつの間に。

2本目。シフトアップインジゲータの点灯タイミングを 13,500rpm に設定し、ラップタイマーの電源をオンにしてピットレーンに並ぶ。曇りがちで直射日光はあまり射してないけど、早くも路面温度50度突破とのこと。

シフトアップタイミングを変えたことが功を奏して、ダウンヒルストレートで5速レッドゾーン直前まではいくように。以前は 6 速まで入った気がするけど、熱くなってきてエンジンの出力落ちてるんでしょうかね。

ギアの使い方を見直して、いくつか3速で回っていた個所を2速に落とす。
  • メインストレートで5速までシフトアップして、第1コーナーで2速まで落とす。
  • 第1, 第2コーナーは一つの孤とみなして旋回し、立ち上がりで3速, 4速とシフトアップして、第3コーナーで再び2速まで。
  • 第3, 第4コーナーは一つのコーナーとして組み立てず、第3コーナーを抜けたらアウトいっぱいに孕み、第4コーナーの先をなるべく直線的に走れるようにライン取り。ここで3, 4, 5 速とシフトアップして、第5コーナーで2速に落とす。
  • 第5コーナー立ち上がりで2, 3 速とシフトアップ。130R 途中で4速になる。。
  • S字コーナー入口では速度を殺しすぎないように注意して、3速にシフトダウンしつつ軽くブレーキをかけて進入。左、右と切り返して早めにアクセルを開けられるように。ここも、右の倒し込みが難しくて、クリッピングにつき損ねることがしばしば。
  • 3速で引っ張りつつV字進入に備えて右いっぱいに寄せ、2速にシフトダウンしてV字を抜ける。ハイサイドで吹っ飛びたくないので、速度をしっかり落として早めにバイクを立てて、立ち上がりでアクセル全開にする方向で。
  • 立ち上がりで3,4 速にシフトアップして、ヘアピン手前で2速にシフトダウン。アウトいっぱいから入り、進入時点でしっかり寝かせる。ここは、毎回右爪先のスライダーがすれる。
  • ヘアピン立ち上がりからダウンヒルストレートで2,3,4,5速とシフトアップし、5即レッド直前まで引張る。150m看板を過ぎたら体を起してブレーキングしつつ、次の90度コーナー進入のための態勢作り。2速まで落とす。
  • 私の場合、90度コーナーで思ったように寝かせられると90km/h前後で抜けられるが、寝かし方が遅くて奥までブレーキを引きずると70km/hぐらいまで落ちてしまう。ただ、もっとバンクさせて速い速度で抜けられそうな気はする(ただ失敗するとコースアウト一直線なので、なかなか怖くて試せない)。コース左側目いっぱいで立ち上がり、ビクトリーコーナー進入のためにコース中央付近に戻す。
    ここはアクセルあまり開けずに2速のまま走っていたけど、3速に上げられるようにしっかりスロットル開けるべきかも。
  • ビクトリーコーナーは2速のまま入って、2速のまま立ち上がり。ここは切り返しがしっかりできれば、速度を上げる余地はかなりある。
こんな感じで、クリアに走れれば2'31~32秒台は安定して出るようになった。以前よりアクセル全開の区間が増えたので、右手に疲れが。2本目はチェッカー予定時刻と前後してコース内転倒があり、赤旗が出て終了。

昼食とって、特に何も変えずに3本目。2本目で見えたラインに沿ってしっかり走行。ベストラップ 2'30'162 が出て終了。次に向けての改善点も見えたし、ま、良いんじゃないでしょうか。

ラベル:

水曜日, 6月 27, 2007

筑波サーキット コース2000 ファミリー走行

筑波サーキットのコース2000 走行。

走りに来たのは初めてだけどパドックが狭いですね。平日なのにかなり車で埋まってる。Aパドック奥手の池の手前にスペースを見つけて駐車。

走行券の購入。走行枠はファミリー限定ライセンスで走行できるL枠。ナンバー付き車両のみ走行可能で、基準タイムは一周1分10秒~1分20秒。コースイン時に走行券を回収する方式ということで、バイクにすぐはがせる状態で片面ビニールテープで留めて貼っておく。

14:30に一本目の走行開始。まずコースを覚えないことには話にならんので、右端ベタで1周1分30秒超のペースでゆっくり走行。コースは全体にフラット、見通しも良いので、きちんと先を見てれば突っ込みすぎてコースアウトすることはない。エスケープゾーンは狭く感じる。

何となく走ることはできるけど、タイムを出そうと思うと走り方が良く分からないコースだ。だいたいコーナーがことごとく複合コーナーになってる。またコースは全体としてはフラットだけど、セクションごとに多少の高低差はあり、罠っぽい。第一コーナーは最初は上り勾配で途中からフラット、当然その切れ目で荷重が抜けるし、後半は思ったよりも速度が落ちずに外に膨らむ。

1本目の後半からレコードラインを走り、3本走って結局タイムは 1'19~20 で安定して終わり。どうにか基準タイムは満たしたって程度。次までに、走り方を考えてこないと駄目だな。

ラベル:

火曜日, 6月 26, 2007

建物賃貸借契約更新

住んでるマンションの契約更新完了。

前回は部屋+バイク1台だったけど、今回は部屋+バイク1台に自転車も1台追加。サーキットは場所によってはやたら広いので、トランポに折りたたみ自転車を積んで行ってる。この折りたたみ自転車、せっかくなので平日はマンションに置いて足として使おうかと。

ZX-6R は足というには大げさなので。フルフェイスのヘルメットと革のグローブして、近所の八百屋に西瓜買いに行くのも何だかねぇ。

ラベル:

LL魂

チケットget!

ラベル:

富士スピードウェイ レーシングコース スポーツ走行

04:30 起床。先日まで天気予報は晴れだったのだけど、雲行きが怪しい。降らないことを祈りつつバイクをトランポに積んで 06:00 過ぎに出発。

移動中に雨に降られたけど、サーキットに到着した時点ではどうにか降らずにもっている感じ。バイクに飛散防止のテーピングとタイヤ空気圧の調整をして、走行前の点検。フロントブレーキパッドの残りが 2mm 切ってる。今日の走行ぐらいは持つだろうけど、明日・明後日を考えると換えた方がいいな。

富士スピードウェイのレーシングコースを走るのは初めてなので、最初はゆっくりとインベタで走ってコースレイアウトの確認 (公式サーキットガイド:PDF)。

走ってみての印象は、怖いコース。
  • 長ーいストレート直後の第一コーナーが下りになっていて意外と外に膨らむ
  • コカコーラコーナーは全然先が見えない。クリッピングポイントも直前まで視界に入らない。
  • 100R は先に行くほどキツくなる複合コーナー
  • ダンロップコーナーから先は視界が悪く、走っていると先の様子が見えない
  • 視界が悪い13コーナーは、後半から逆バンク
しっかりレイアウトを頭に叩き込んでおかないと、曲がり切れずにコースアウト一直線。コンクリートで広いランオフエリアをとってあるので、コースアウトしてもたいていは何事もなく戻ってこられるけど。

何度かコースアウトしつつ、ようやくコースが分かってきたかなということろで一本目終了。休憩時間にコース図をじっく見て走行ラインを考える。

2本目で何周か回るうちに、アクセルを開けられるポイントがわかってくる。
  1. まずはストレート6速全開から、第1コーナー手前で2速まで落とし、気持ち早めにクリッピングポイントにつく。
  2. 立ち上がりでバイクは右に傾けたまま2,3,4とシフトアップ。
  3. 80R手間で3速に落とし、早めに向きを変えてアクセル全開
  4. 100R途中で4速に。ここは先に行くほどキツくなっているのでアウトいっぱいには膨らまず、コース真ん中を通るようにする。。
  5. ヘアピン前で2速に落とす。下りがきついので、ここも第1コーナーと同じく早めにクリッピングポイントにつく。
  6. ヘアピン立ち上がりから右にバイクを傾けたまま2, 3, 4 とシフトアップ。
  7. ダンロップコーナー(シケイン入口)手前でブレーキングから2速に落とす (1速にしても良いぐらい)。きっちりインつく。ここでライン取りを間違えると、直後の30R~13コーナーが破綻する。
  8. 2速レッドゾーンで引っ張って、アウトいっぱいに振る。次の第13コーナーは半径45Rだが90度以上曲がっているので、インに寄ってると曲がりきれなくなる。見通しが悪く、後半は逆バンクという危険なコーナー。
  9. 13コーナーを抜けてもしばらく逆バンクなので、バイクを立て気味にしてアクセルを開けていく。3速にシフトアップ。
  10. 次のネッツコーナーは上りがきつい所にあり、25Rという狭い半径で90度以上曲がり込んでいる。2速に落としてアウトいっぱいから進入して奥にクリップをとる。
  11. ここから最終コーナーにかけては、ラインがよくわからない。最終のパナソニックコーナーも奥に行くほどキツくなる複合コーナーになっているから、アウトに目一杯振って最終コーナー奥のクリップ目指して75R, 33R をつなぐ感じがいいのかな?
走っていると湿度が上がったのか、ヘルメットが曇って視界悪化。そちらに気を取られていたらストレートエンドでブレーキングが遅れ、いつもは200m手前ぐらいから余裕をもってブレーキングしているところ、フルブレーキングする羽目に。

ブレーキングの姿勢が十分にできていなかったため後輪が浮いてしまい、200km/h でジャックナイフ走行。以前、もっと遅い速度で同じ現象を経験したことがあるので、慌てずに、ブレーキを緩めると同時に体重を後ろに移動して復帰。結局、少しランオフエリアまではみ出た程度で曲がれた。フルブレーキすれば、まだまだブレーキング遅らせても大丈夫ってことか。もう少し頑張りましょう>自分

走ってて、初めてバイクにパーツをつけたくなった。ここはコースレイアウト上、右にコーナリングしながらシフトアップしていく箇所が多い。普通のバイクのシフトペダルは、つま先をペダルの下に入れてペダルを持ち上げることでシフトアップするけど、コーナリングでバイクを左足全体を使ってホールドしてる最中にその操作は厳しい。爪先も接地することが多いし、その内、逆シフト対応のバックステップ入れよう。

走行時間を5分ほど残して、雨がちらついてきたのと燃料警告灯が点灯したため、早目に走行切上げ。3本目は走らずに帰宅。

途中でバイク用品店 NAPS に寄り、フロントブレーキパッドの交換。在庫があった RK EXCELMEGA ALLOY X PAD に。ブレーキフィーリングの違いが分かるレベルではないので、温度依存性が低くて街乗りでも使えるパッドなら何でも良いんだけどさ。これまで使っていたのは Project μ の ECO SPORTS だけど、意外と寿命が短かったな。

ラベル:

月曜日, 6月 25, 2007

Seven Deadly Sins of Introductory Programming Language Design (PDF)

曰く「初心者向けプログラミング言語設計における七つの大罪」。Abstract によると
We discuss seven undesirable features common to many programming languages used to teach first-time programmers, and illustrate typical pedagogical difficulties which stem from them with examples drawn from the programming languages ABC, Ada, C, C++, Eiffel, Haskell, LISP, Modula 3, Pascal, Prolog, Scheme, and Turing. We propose seven language design (or selection) principles which may reduce the incidence of such undesirable features.

初心者向けのプログラミング言語で避けるべき7つの機能を取り上げ、逆にそれらの機能による影響を抑える 7 つの言語設計上の原則を提示する、とのこと。面白そうなので、ぱらっと目を通してみます。

ラベル:

Bogo Sort

人から教えてもらったソートアルゴリズム。

平均演算量 O(n×n!) --- 頭悪すぎる。Bogo Sort つながりで Infinite monkey theorem とか RFC2795 The Infinite Monkey Protocol Suite (IMPS) とか読んで笑い転げてました。

ラベル:

Google Developer Day Tokyo - 鵜飼 文敏

先月末に開催された Google Developer Day Tokyo 最後のセッションを記録した映像。Google 内部での開発体制について。

レベルの高い開発者が数人規模でチームを組んで動くのは、technology oriented な開発をするには理想的な環境だよね。Google の社内インフラも一度見てみたい気がする。

ラベル:

今週の予定

仕事のスケジュールに空きを作って月~木曜まで連休にした。……何だかんだで今日は早朝から 8 時間以上仕事してたので、まったく休みになってないけど、明日以降は完全にオフの予定。

久しぶりに、広めのサーキット走りに行ってきます。
  • 6/26 (火) 富士スピードウェイ本コース 30分x3本
  • 6/27 (水) 筑波サーキット コース2000 30分x3本
  • 6/28 (木) ツインリンクもてぎ ロードコース 30分x3本
待ち時間のお供は、神林長平「小指の先の天使」。

ラベル: ,

マジスパ

週末に、某社卒業組で集まってマジスパツアー開催。そういやM川さんにも声掛ければよかった。

それなりの規模のプロジェクトでリードプログラマを経験した人間から順に辞めてるな。その後は再び大手ゲームメーカーに行く人あり、ベンチャーで開発やる人あり、コンサルやってる人ありと色々。

スクリプト D&I (16) システム関数登録処理 - 3

スクリプト言語からC++側の関数 (システム関数) を呼び出す際に関係するクラスの階層図と、プログラミング時の作業フロー残り。いくつか名前の付け方がダサい部分があるので、そこを見直したら、システム関数周りのドキュメントは書けるかな。





図は MagicDraw 12.5 を使って描いてるけど、久しぶりにバージョンアップしたら UI が改善され、作成される図にグラデーションがかかって見栄えも良くなってた。ただ MagicDraw 12.5 は Vista で使うと日本語表示に一部難あり。

普段はMagicDraw をクラス図・シーケンス図・ステートチャートぐらいしか使わないから気にしてなかったけど、BPMN も描けるようになってたのね。今回はビジネスプロセスとはかけ離れた図を書いてるけど、この手のフロー図作成にも便利に使えるね。

日曜日, 6月 24, 2007

分散バージョン管理: Mercurial

分散SCMお試し月間。動作環境が一通り整ったので、リポジトリ管理を darcs から Mercurial に移してみる。リポジトリ移行には、前回もお世話になったtailorを利用。


darcs をしばらく使ってみたけど、一人で使ってる分には特に不満はなかった。rollback, unrecord などの record 取り消し関連のコマンドもよく考えられており、理解して使えば大変便利。
ただビルドが面倒なのと周辺ツールの充実がイマイチなので、少人数のチームを超えて使うのは現状だと厳しい。あとはリビジョンが蓄積したときに最初のチェックアウト処理が重くなりそうな気がする (未確認)。

mercurial は python スクリプトということで、Haskell コンパイラが必要な darcs と比べると導入は簡単で、周辺ツールとして、trac と連携するプラグインが実用的なレベルで動いている。またコマンドが比較的 subversion と類推が利く体系になっており、基礎的な概念としてを持ってきているので、いろいろな意味で斬新な darcs よりもとっつきやすい。

土曜日, 6月 23, 2007

Generics 本探索

amazon で適当な書籍がないか調査。

C++ Template Metaprogramming: Concepts, Tools, And Techniques From Boost And Beyond (C++ in Depth Series)

これ良さそうかな。amazon.co.jp には大した情報が載ってないけど、amazon.com に細かい内容&レビューあり。

ラベル:

金曜日, 6月 22, 2007

SWIG

ruby とか perl で C++/スクリプト言語間の連携処理どうしているのか調べたところ、 SWIG (Simplified Wrapper and Interface Generator) 発見。
SWIG is a software development tool that connects programs written in C and C++ with a variety of high-level programming languages.
そういえば Advanced Perl Programming で見かけたような気がする。ちょっと使ってみよう。

Generics Book


Nutshell Handbooks から、浸透しつつある新たなソフトウェア設計パラダイム「ジェネリックプログラミング」についての新刊「C++ and Haskell ``Generics''」 が登場。

ジェネリックプログラミングは、手続き型やオブジェクト指向では難しいデータ型によらない汎用的なアルゴリズム記述を可能にするとともに、ソフトウェアの構成要素であるポリシーをコンパイル時に組み合わせることで、型安全性を保ちつつ実行時ペナルティなしでの部品再利用を促進する。

この本では、ジェネリックプログラミングの背後にある基礎概念の解説とともに、Haskell, C++ template を用いてジェネリックプログラミングを行う際に必要となる各種技法、またジェネリックプログラミングの実現例として ghc 標準ライブラリならびに C++ Boost Library に含まれるいくつかのライブラリのソースコードが詳解されている。また標準化が進められている次期 C++ 規格の動向についても簡単に触れてある。

……とかあったら、読みたいんだけどな。Modern C++ Design の Update 版でも良いけど。なお、画像は O'REILLY book cover ででっち上げたもので実在しませんので悪しからず。

ラベル:

木曜日, 6月 21, 2007

スクリプト D&I (15) システム関数登録処理 - 2

スクリプト言語からC++側の関数 (システム関数) を呼び出す際のフローと、それをサポートする C++ コード自動生成ルーチンの設計/実装が一段落。

インタプリタ型のスクリプト言語から C++ 側のコードを呼び出す場合 (a) 呼び出されたシステム関数の種別によって処理を分岐し、 (b) 仮想マシン側のメモリから引数を取出し然るべき型に変換した上で、(c) 実際の処理を行い、(d) 結果を戻り値として仮想マシンに受け渡す必要がある。

実現に際しては、システム関数の識別子をどのように保持するか(文字列で関数名を持つのか、それとも整数値を振ってID管理にするのか)、また識別子から C++ 側の対応する処理を決定する(ディスパッチ処理)方法、スクリプト側のデータ型とC++側のデータ型の対応の取り方(スクリプトのコンパイル時に確定させるか仮想マシンの記憶域にデータ型情報を付加して動的に対処するか)など考慮すべきポイントが幾つかある。

今回は軽量型の組込型言語なので、次のような利用シーンを想定している。
  • システム関数の追加/変更は頻繁に発生しえる
  • システム関数の数は数十~多くても数千程度
  • 実行時の柔軟性よりも、コスト(メモリ/CPUリソース消費量)を抑えたい
そこでスクリプト言語からのシステム関数呼び出しは、スクリプトコンパイラで中間コードに翻訳すると、仮想マシンのスタックに実引数を積むコードと、 syscall 命令 (オペランド部の整数値 - システム関数番号で呼び出す C+ 側関数を区別) の組み合わせとなるようにした。

またプログラマは本質的な処理 (c) に集中できるよう、(a), (b), (d) に関しては極力 C++ コードを自動生成し、またコンパイル時に型の不整合などが検出できるようにしてある。

大まかな処理の流れは、次の通り。
  1. システム関数を定義したヘッダファイル (ファイル名 *.sch) を用意。
  2. スクリプト言語でプログラミングする場合には *.sch を #include して、スクリプトコンパイラで解析/利用。
  3. C++コード自動作成する場合には、*.sch のみを解析できるミニスクリプトコンパイラで解析/C++コード自動生成。なお自動生成されるコードには一切手を加えず、それを #include するなどして利用できる形にしてある。
図は仮想機械の内部動作に関わるシステム関数についてのコード生成フロー図。ユーザ定義のシステム関数に関しても文書化中。

p.s.

今回初めて Boost Multi-index containers library を使ったけど、これは便利。C++ プログラマなら使い方を学んでおくべき。

ラベル:

土曜日, 6月 09, 2007

分散バージョン管理

しばらくノート PC を持ち歩くのをやめていたのだけど、最近復活。

平日は仕事用の Vista Ultimate を入れた VAIO SZ90PS を持ち歩き、休日は FreeBSD 6-STABLE を入れた ThinkPad X22 を持って移動してる。サーキットで走る合間の時間や、ホテルの部屋で夕食前の時間などを使ってコード書き。

こうなると、ネットワークにつながっていない環境で作業することも増えるため、分散型のリポジトリ管理システムが欲しくなる。しばらく subversion + svk を使っていたが、ローカルで作業してミラー元に push し直すときにマージできずに止まってしまうことが何度か続いたので、subversion 捨てて最初から分散リポジトリ管理システムとして設計されたソフトに乗り換えようかと検討中。

最初にユーザ数が多そうな mercurial を使おうと FreeBSD の ports からインストールしたところ、どうもコンフリクト発生時のマージ動作がおかしい。おそらく私の環境依存の問題で、どこで問題が起きてるか突き止める自信がなかったため今回は保留。他に monotone, bazaar-ng, darcs と試してみて、まずは設計思想がシンプルな darcs を使い込んでみることにする。

既存の subversion リポジトリから darcs リポジトリへの変換は tailor を使えば OK。ただし途中でフォルダ名の変更 (svn mv) を行っている場合は、tailor の設定で svn, darcs のフォルダを一致させておく必要がある。

[DEFAULT]
verbose = True
projects = svn-to-darcs

[svn-to-darcs]
root-directory = /home/issei/tmp
source = svn:myNiftyProject
target = darcs:myNiftyProject
state-file = svn-to-darcs.state

[svn:myNiftyProject]
repository = http://svn.issei.org/gameobj/svn
module = /GameObj/trunk
subdir = sharedsubdir

[darcs:myNiftyProject]
repository = /home/issei/tmp/GameObj
subdir = sharedsubdir


tailor のサンプルにあるように [svn:...] と [darcs:...] で subdir を分けると、途中で TAILOR-HACKED-TEMP-NAME フォルダの削除に失敗したというような意味合いのメッセージが出て止まる。

darcs 本体は Haskell コンパイラ ghc version 6 を使って書いてある。コンパイル済みのバイナリが使える環境なら良いけど、そうでないと Haskell コンパイラのインストールから始める必要があって、手間がかかる。私のところには 1 台 FreeBSD 5.4-RELEASE が残っていて、これに ghc 6 を入れるのに時間を食った (ports だと FreeBSD 5 系列では動かなかった)。

darcs のインストールが終わってしまえば、あとは簡単。subversion のようにバックエンドにデータベースを使っていないため、リポジトリの同期も http と ssh を使える環境なら 5 分でセットアップできる。公開リポジトリ

まだ使い始めたばかりだけど、やはり subversion と比較すると周辺ツールの充実度合いは低い。またバージョン管理の中核的な部分から離れた便利な機能、たとえば commit 前後の hook 処理やキーワード置換、ファイル改行コードの管理なども不足している。

ただ、基本的なアイデアとしてバージョン管理をシンプルにパッチの集合とみなし、他でよく見かける「古いものから新しいものへ時系列で伸びていく枝のようなもの」と捉えていないところが、いろいろなところで物事をシンプルにするのに寄与している。あとは面倒なコンフリクトが発生したときの頑強さが気になるところだが、これは使っていればその内に嫌でも出くわすだろうから、その時のお楽しみということで。

火曜日, 6月 05, 2007

Re: [swf] polyhedra

Yusuke ENDOH さん作成の Flash版のザルガラー多面体表示プログラム。referer で見つけたのでリンク。

月曜日, 6月 04, 2007

スクリプト D&I (14) システム関数登録処理

r443

スレッド関連のシステム関数設計と、対応する仮想機械の実装を進める。技術的には自由度高めることは簡単だけど、典型的な場合にバグが出にくくかつメンテナンスしやすいとなると、どう制約付けるかが難しい。
  • スレッドには親子関係がある
  • スレッド新規生成時に、現スレッドの子とするか、ルートスレッドの子スレッドにするかを指定可能。
  • 親スレッドが終了すると、それに紐付く子スレッドも全て終了する。
このぐらいが落としどころかなぁ。kernelスレッドではなくuserスレッドとして実装してるので排他制御は不要。同期制御どうするかは検討中だけど、そこまで必要になったらスクリプトで書かない方が良いような気がする。

とりあえず最低限必要な同期制御(スレッド終了待ち)だけ入れておいて、後はサンプルスクリプトとして簡単なエフェクトでも作ってみて必要に応じて追加するか。

仮想機械の内部状態にアクセスする必要があるシステム関数(スクリプトではなく C++ 側で実装して、スクリプトに機能を提供する関数) の実装方法を見直し。仮想機械側でスタックに積んだ引数情報の取出しや (UNIX kernel だと fubyte() family 相当の処理)、システム関数番号とメンバ関数の対応を手作業で管理するのが嫌になったので、それ専用にパーサ書いて C++ コード自動生成する方向で実装中。ソースコードは sysdecl* あたり。

しかし言語処理系はまともに書こうとすると、どんどん自動生成されるコードの量と段数が増えてくる。
  1. 言語を解析するためのパーサを作成するツール (yacc, lex など) を用意
  2. その入力ファイルも手書きだと重複が多くなってくるため、入力ファイルを自動生成するツール (CScriptだと GNU m4) を用意
  3. 仮想マシンの実装に際しては、スクリプト側のコードと C++ 側のコードのグルーとなるコードを自動生成するためのツール (今回作った sysdecl) を用意
比較的シンプルな手続き型言語でこの有様だから、ruby みたいな OOPL になると大変そうだ。どうやてるのかソース読んでみるかな。

CScript に関しても放置しておくと後ワケが分からなくなりそうなので、処理の流れと関連クラスを文書化しておこう。とりあえず覚書。

cscrypt/cscript.sch, cscript/system.sch
↓ cpp + sysdecl
debug.out/vm_sys_ctx.h (ICtxSyscall), debug.out/vm_sys_d.cc (VMSyscallDispatcher::Impl)

VirtualMachine::Impl
  • implements ICtxSyscall
  • delegates to VMSyscallDispatcher
    • 仮想機械のスタック関連操作
    • システム関数番号から仮想関数へのマッピング

ラベル:

日曜日, 6月 03, 2007

富士スピードウェイ ショートサーキット スポーツ走行

今年の 4 月に走行会に参加したことがあるけど、ライセンスを取得してのスポーツ走行は初めて。土日それぞれ 25分 x 2走行の計4走行。前回のベストラップが45.148秒なので 42秒台ぐらいが目標かな。

同時走行台数は最大で30台のところ20台半ばの参加車あり。前回は腰のずらし方が足りず走行ラインが膨らみ気味だったのと、第3コーナーから B-3 ルートにおけるアクセルの開け方が全然足りなかったので、まずはその辺を意識して。

2周ほどタイヤを温めるためにスローペースで走行して、3週目のストレートから全開に。使用するギアはローとセカンドだけど、何週か走って時点でローギアのギア比が高すぎてシフトダウンで挙動が乱れがちなのと、乗車姿勢/走行ラインに意識を集中させるため、途中からセカンドオンリーに変更。

さすがに走り慣れている人が多く、ガンガン抜かれる。速い人の走行ラインを見てると、
  • 第1、第2コーナーの進入速度が高い
  • 第3コーナー(9R~15R複合コーナー)進入速度が高く、抜けた後にアウトに膨らむ
  • 14Rを抜けた後で直線的に12R(90度コーナー)のイン側に向かわず、一度アウトに振ることで曲率を緩やかにしている
といったあたりが大きく違う。最初の第1、第2コーナー進入速度を上げるのは技量が伴わないとその先でコースアウトするリスクが高いのでヤメ。多少失敗してもリカバリが利く2, 3番目を試す。

ギアをセカンド固定で走っているので、第3コーナーで減速すると速度を乗せるのに時間がかかる。ここで速度の落ち込みを最小限にして早くアクセルを開けていくと、その後のB-3ルートのタイムが大きく縮まる。またカントが大きく付いているので、かなりバンクさせてもスリップダウンしない。

第3コーナー立ち上がりでフルスロットルにしたら、そのままB-3はアウトにはらまず、コース中央付近を走って14Rのクリッピングポイントを目指す。ここは先に行くほどコーナーがタイトになり速度を落とさなければ曲がれない設定になっているため、14Rの手前で減速。当日はアクセルコントロールで速度を落としていたけど、可能な限りフルスロットルで引っ張ってブレーキング&深くバンクさせた方がタイム稼げたかも。

14Rでクリッピングポイントについた後もコース中央右寄りをキープして、次の12R(90度コーナー)に向けて切り返す。14Rから直線的に12Rに向うのと比べると直線区間が長くとれ、アクセルも早く開けていける。

日曜日に走る頃には41秒台は安定して出せるようになり、最後の一本でベストラップ39.990秒を記録。良し。

次回の課題は第1コーナー進入速度の向上と、それに伴う第2,3コーナーの向き替えをしっかり行うこと。14R手前でアクセルを緩めつつゆるやかに寝かし込むのではなく、フロントブレーキを使って原則と素早い寝かし込みを行うこと。あとは最終コーナーのラインを見直し。路面が荒れてるから、それも勘案して走りやすいラインを見つける必要がある。まだ、やること沢山ありますね。

次回は24(日)の予定。

ラベル: