OMAKE.jpn 64 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919
  1. 2002.2 update
  2. この文書は,おまけ,ていうか,暇なときに気が向いたまま書き貯めたものです.
  3. ■■ XFireworks 開発秘話
  4. XFireworks は X 上で動作する花火プログラムである.そもそもなんで XFireworks を
  5. 作ったかというと,単なる思いつきである.nadar-b05 を作り上げ,しばらく
  6. ぼーっとしていた時期に,なにかまた作りたいなーと思っているとき,
  7. 電車の中で思いついた.
  8. XFireworks を作りはじめたのは 2000 年の7月初旬だったのだが,nadar-b05 を
  9. 作ったときの教訓で,
  10. とりあえず動くものを作って公開しちまえ
  11. というのがあったので,かなり早い段階でβ版を公開して linux-users-ML などで
  12. 広報し,あとは3日に1回ほど最新版をアップデートしながら作成していった.
  13. 結局それから1ヵ月くらいで書き上げ,8月のはじめに最終版をリリースしたので,
  14. XFireworks は
  15. まさに季節もの
  16. となり,なかなか評判がよかったようだ.雑誌にもいくつか取り上げられた.
  17. XFireworks ができたのはちょうど花火大会まっさかりの時期だったので,
  18. 忙しくて花火大会に行かなかった友人に紹介したりしたのだが,
  19. 夜に見てるとさみしい気分になる
  20. と言われてしまったのがかなしいところだ.作者自身,よく電車の中や昼休みに
  21. ぼーっと見ていたりしたのだが,はたから見たら,
  22. ちょっとノイローゼ気味なのだろうか
  23. などと心配されてしまいそうである.単に作者自身は自分で作ったものを見て,
  24. 悦に入っているだけ
  25. だったのだが.
  26. この文書はあまり技術的なことは書いてないのだけれど,たまには技術的なことでも
  27. 書こう.
  28. XFireworks はC言語でのオブジェクト指向な書き方が自分なりに身についてきた頃に
  29. 書いた作品なので,ソースはとても(不満な点もいくつか残ってはいるが,
  30. それはそれとして,他のぼくのプログラムに比べたらはるかに)すっきりしている.
  31. X でのプログラミングがだいたいわかってきたころに書いたというのも
  32. よかったのだろう.おかげで他のぼくのプログラムにはありがちな,
  33. 「これはいつか直さなきゃならんなあ」
  34. とかならまだましだが,
  35. 「これはひどい,ひどすぎる」
  36. とか,とんでもないのになると,
  37. 「ちょっとこれは正視に耐えない」
  38. といったようなところもあまりないのがお気に入りの1作である.ちなみに正視に
  39. 耐えないのは xstarroll である.次が xmangekyou かな.
  40. XFireworks は作りはじめて,1週間くらいでとりあえず動作するプロトタイプが
  41. できあがった.が,とにかく遅かった.花火が爆発するのが,
  42. しゅわしゅわしゅわ...
  43. というように見えてしまうくらい遅かったのである.そこで,考えつく限りの
  44. チューニングを行なっていくことになる.
  45. 原因は花火のカケラをひとつひとつ描画していたために X サーバに出すリクエストが
  46. ボトルネックになっていたためだった.これを解決するために,描画をまとめて行なう
  47. ようにリクエストを変更した.しかしまだ遅い.どうやら描画のたびに色を
  48. 確保していて,これもまた X サーバにリクエストを出すためにボトルネックに
  49. なっているらしい.そこで,起動時に前もって色をすべて確保するようにした.
  50. これでだいぶ速くなったのだが,今度は起動に時間がかかるようになってしまった.
  51. Libretto で起動すると,起動に1分以上かかってしまうのである.原因は起動時の
  52. 色の確保で,毎回 X サーバに色を確保しにいってしまうことにあったので,
  53. 独自の色のデータベースを作成し,一度確保した色は使いまわすようにした.これで
  54. まただいぶ速くなったがまだ遅い.データベース作成時に,すでに確保している
  55. 色かどうかのデータベースの検索に時間がかかっていたのだ.そこで検索処理に
  56. キャッシュやハッシュを使うようにした.これで多少速くなったのだが
  57. まだ遅いのである.と,一気に書いてしまったが,ここまでたどり着くのに
  58. くりかえし何度も何度も試行錯誤した.
  59. 実際のプログラミングはほとんど Libretto で行なっている.ぼくの使っている
  60. Libretto は Libretto SS1000 というやつで,片道1時間半の電車通勤中に
  61. 電車の中でプログラムを書いて過ごすために
  62. 入社直前に購入したものだ.しかし,買ったときに
  63. すでにオールドモデルだった
  64. このため,XFireworks を書いていた時点ではかなり遅いマシンだったのだが,
  65. そのような遅いマシン(ちなみにこの文章を書いている2002年1月現在で,
  66. まだ現役まる3年である)でもちゃんと動作するようにしたかったため,可能な限り
  67. 速くしたかったのだ.
  68. 調べてみると,ハッシュ関数があまり乱数的でないために1部分に集中してしまい,
  69. ぜんぜんハッシュになっていなかった
  70. という恥ずかしいバグがあったことがわかったので,ハッシュ関数を書き直した.
  71. さらに,ハッシュのチューニングを行なった.ハッシュの良いところは,サイズを
  72. 自由に調整することによって,メモリサイズと速度のトレードオフを自由に調整
  73. できるところだ.これでだいぶ速くなった.
  74. この他にも,sin(), cos() をデータベース化してしまうとか,一度使った
  75. オブジェクトを削除せずにフリーリストにつないでおいて再利用することで
  76. malloc() の回数を減らすとか,配列はまとめて確保して malloc() の回数を減らす
  77. とか,など,考えつくかぎりのチューニングを行なった.
  78. このように考えつく高速化をすべて行なった結果,XFireworks はかなり速く
  79. 動作するようになった.現在の速いマシンでは十分すぎるくらい速く動作するため,
  80. 今となってはそれほどありがたみも無いのだが,やはり
  81. 高速化は,男の夢
  82. とでもいうのだろうか.しかし,最近の速いマシンで動かすとさくさく動きすぎて,
  83. 情緒もへったくれもない
  84. といったところがかなしいところではある.
  85. ただ,まだチューニングできる部分もある.そのうちのひとつとして,
  86. 起動時の色確保で,色のデータベースはハッシュ&キャッシュ化しているために
  87. 高速なのだが,色の名前の文字列のデータベースはふつうの線形検索になっている.
  88. ハッシュ&キャッシュ用のクラスをもっと一般化して,一般的なオブジェクトを
  89. 扱えるようにして,色の名前もハッシュ&キャッシュ化すれば,起動がもうちょっと
  90. 速くなるかもしれない.でもめんどくさいのでいいや.
  91. うーん,ひさびさに技術的なことを書いてしまった.
  92. 2002/1
  93. (次回作の OMAKE.jpn に続く)
  94. ■■ WonX 開発秘話
  95. そもそもなんで WonderWitch をはじめたかというと,会社の先輩に紹介されたのだ.
  96. その先輩もどうやらモノづくりの好きな人らしく,モノづくり大好き人間どうし
  97. ということで,そのへんは,
  98. 同じ血を感じる (坂井がかってに感じてるだけ)
  99. とでも言うのだろうか,なにかおもしろいネタがあったら振ってほしいと
  100. 酒の席で冗談混じりに頼んでいたのだが,そのあとで WonderWitch を紹介された.
  101. 実際に購入したのは8月になってからだったのだが,いじってみると
  102. 昔のモノ作りの楽しさ,というか,コンピュータをいじる楽しさがぎゅうぎゅうに
  103. 詰まったようなもので,すぐにのめりこんだ.
  104. ここで知らない人のために,WonderWitch というものについて,簡単に説明しよう.
  105. バンダイから WonderSwan という携帯用ゲーム機が出ているが,この WonderSwan 上で
  106. 動作するプログラムを作るためのキットが WonderWitch である.株式会社 Qute が
  107. 開発した.
  108. プログラム作成の手順は簡単で,Windows 環境でC言語で作成・コンパイルし,
  109. WonderSwan には専用のカートリッジを装着して,専用の転送ケーブルと
  110. 転送ソフトを使って WonderSwan 側に転送すると,カートリッジに保存されて,
  111. ゲームができる,といったぐあいである.
  112. プログラム自体はゲームに限らず,アイディア次第でいろいろ書ける.
  113. シリアルポートがあるので,応用範囲はとても広い.
  114. ただ,C言語とはいっても当然C言語ができれば即プログラムが書けるという
  115. ものではない.画面まわりやキー入力用の独自のサービス関数がいっぱい用意
  116. されていて,それを使って書くことになるのだが,WonderSwan のハードウエアは
  117. さすがゲーム機,というか,スプライト機能やパレット機能を持っているので,
  118. 昔のMSXの時代は普通だったが,今となっては特殊な
  119. ハードウエアである.つまり,スプライトとかパレットとかをちゃんと理解
  120. できてないと,プログラムは書けないし,メモリの制限もあるし,
  121. プログラムサイズの制限もあるし,言語がCになったというだけで,実はその中身は,
  122. 昔の MSX とかでの BASIC プログラミングによく似てる
  123. というのが正しい表現だと思う.
  124. というわけではじめてみた WonderWitch なんだけど,ぼくの場合はもともと
  125. BASIC や MS-C のような制限された環境で書いていたこともあるので,
  126. あまり違和感無くのめり込めた.
  127. ただぼくの場合は,
  128. プログラムの9割は通勤電車の中で書く
  129. という「電車プログラマ」状態なので,コーディングの最中はいいのだが,
  130. デバッグの段階になると,
  131. シリアルカードとシリアルケーブルと WonderSwan を常備して,
  132. 電車の中でコンパイルして転送してテストする.
  133. ということになってしまう.(実話)
  134. まあ,ぼくが毎日乗っている電車は,朝は1車両に一人しか乗ってない
  135. ということもザラで,
  136. 電車の中で靴を脱いで足を伸ばしてプログラムを書く
  137. ということも可能なくらい(さすがにここまではやってないけど)なので,
  138. これでもべつにいいんだけれど,持ちものはなるべく軽くしたいと思っているので,
  139. なんとかしたいと思っていた.
  140. というわけで,WonderWitch の各種関数の互換関数を FreeBSD 用に作成して,
  141. FreeBSD 上でコンパイル・リンク・実行が行えて,最低限のデバッグを
  142. FreeBSD 上でできたらいいな,と思って作りはじめたのが WonX である.
  143. しかし,やっているうちに,
  144. いつのまにか興味が逆転してしまった
  145. で,WonX 作るのが目的になってしまった.
  146. WonX 作っていて一番困ったのはなにかというと,技術的にどうとか
  147. MS-DOS と UNIX の差がどうとかではない.ホントに一番困ったのは,
  148. WonXってどんなものなのかを
  149. 人に説明すること
  150. である.
  151. わかる人には,
  152. WonderWitch 用のプログラムを UNIX 上でコンパイル・リンクして,
  153. X 上で実行できる実行形式を作成するための互換ライブラリ
  154. といっただけで,どんなものかだいたい理解してもらえる.しかし,わからない
  155. 人には,いくら説明してもわからないものだ.
  156. 2000年末から2001年初頭にかけて開催された,WonderWitch プログラミング
  157. コンテスト(WWGP)に出品して,見事予選を通過して,本選に出場してきたのだが,
  158. 友人にそのことを説明(自慢)しようにも,
  159. 「こんど,プログラムコンテストで予選通過したので,発表してくるんよ」
  160. 「へー.なにを作ったの?」
  161. 「えーと,WonderSwan のプログラムを作るための WonderWitch っていうキットが
  162. あって,WonderWitch用のプログラムを...」(以下,必死に説明)
  163. 「???」
  164. 「うーん,つまり,プログラムを書くのを手伝うプログラム」
  165. こんな説明しかできないのは,うーん,残念である.
  166. (次回作の OMAKE.jpn に続く)
  167. ■■ N.A.D.A.R. 開発秘話
  168. N.A.D.A.R. は,そもそもは中学生のときに,「TANK」という名前で作った,
  169. 2人対戦のゲームだった.もう10年以上前の話だ.
  170. もともとぼくは戦車ゲームが好きなのだが,まわりにはあまり満足のいく
  171. 戦車ゲームが無かった.そこで昔のプログラマの鉄則,
  172. ほしければ作る
  173. にしたがって,自宅の PC-9801VX で作ったのがはじまりだった.
  174. このころ学校の理科室に PC-9801M2 があって,それでプレイしてたりしてた.
  175. しかし当時の PC-9801M2 はすでにひと昔前の機種であり,8086 の 5MHz では
  176. 名機 PC-9801VX の 80286 8MHz にはかなうはずもなく,
  177. おそすぎてゲームにならん
  178. とフトドキなことを考えていた.とくに接近戦になって,2人が同時に
  179. 砲弾とミサイルを撃つと,目に見えて速度が低下してしまう.しかしこれも,
  180. クライマックスでスローモーションになる,映画のワンシーンみたい
  181. とあるていど納得していたわけであるから,
  182. 遅延まで考慮に入れて逆に利用したゲーム
  183. という,今思うとカッコイイ仕様ではあったと思う.(本当か!?)
  184. TANK は一人プレイ用の TANK2,2人プレイ用になって,TANK3A,
  185. 改良を加えて,TANK3B, TANK3C, ... と製作していき,最終的には,
  186. TANK3E まで製作した.
  187. その後,兄の「戦車をもっと大きくしたほうがよい」という意見を採り入れて,
  188. 戦車を拡大した TANK3F,再びもとに戻した TANK3G というように,
  189. 暇をみてはバージョンアップしていく
  190. という,まさに趣味で作ってるプログラムであった.
  191. 大学3年生から4年生にかけて,
  192. マイコン BASIC MAGAZINE
  193. によく投稿していて,一時期,常連になっていたのだが,
  194. 大学4年のときに,マイコン BASIC MAGAZINE の投稿用に,プログラムを
  195. 全体的に見直して,TANK3I を作った.が,これは,
  196. あえなくボツ
  197. マイコン BASIC MAGAZINE の掲載基準は「アイディア重視」であって,
  198. やはりこういうありがちなゲームは載りにくい.しかも2人でないと
  199. プレイできないとなると,なおさら載りにくい.
  200. ピーピング形式にして,TANK3J を作ったが,
  201. これもボツ
  202. PC-9801 用の TANK は,ここまでである.
  203. しかし,研究室に入って,X を使うようになってからは,いつか TANK を
  204. X に移植したいと思っていた.そして,
  205. フリーソフトとして公開する
  206. という,Tank 復活の方法を考えていた.
  207. 実際に Tank を書きはじめたのは,就職した1999年の4月からである.
  208. 4月に就職し,5月くらいから,Tank で使用するためのネットワーク通信用
  209. ライブラリを書き出した.
  210. このころ,ちょうど,
  211. オブジェクト指向
  212. にはまってて,頭の中ではすっかりオブジェクト指向至上主義.
  213. オブジェクト指向で書いておけば,
  214. その向こうにはバラ色の世界が待っている
  215. という考えだった.
  216. しかし,通信には文字列処理がつきものなので,そのまえに文字列処理用の
  217. String クラスを作ろう,と思った.
  218. また,通信するには select() で調べることが必要になるから,select() 用の
  219. クラスも欲しい.ソケットの接続までの部分は接続部分として,別クラスにしたい.
  220. 通信は文字列の通信を行う部分と,じっさいにデータ通信を行う部分は別クラスに
  221. したい,などという感じで,オブジェクト指向をやりたてのときにありがちな,
  222. なんでもかんでもクラスにしよう
  223. というようにはまってしまい,あげくのはてには,
  224. 単なる整数までも,Integer クラスで管理しそうな勢い
  225. になって,収拾がつかなくなってしまう.
  226. また,クライアントが複数になったときには,サーバ側では fork() して通信の
  227. 接続要求だけを処理するようなプロセスを作って,クライアントごとには
  228. 通信だけを処理するプロセスを作り,サーバプロセスとはパイプで通信する...
  229. というような実装も見越した上で書きたい,などと,
  230. はてしない深みにはまっていってしまった
  231. そのうち EyeClock-2.0 の開発を始めることになってしまい,こっちに
  232. どっぷりつかってしまった.
  233. 1999年の8月から12月にかけては,EyeClock-2.0 にかかりっきりで,
  234. Tank は先送り(ていうか,ほとんど忘れ去られた状態)になってしまった.
  235. EyeClock-2.0 は1999年の年末ぎりぎり(クリスマスイブだった.
  236. とくに意味はないのだが)に公開した.しかし今思えば,
  237. クリスマスイブに,世のため人のために
  238. フリーソフトを公開しているなんて,
  239. 聖人のような生活
  240. だと思ってしまう.
  241. しかし,ただの時計なので,
  242. たいして世のためになっていない
  243. というのが悲しいところである.
  244. EyeClock-2.0 がひと段落してからは,あそびで XKeyWrap とかを書いていたのだが,
  245. 2000年の1月中旬くらいにようやく Tank を書き出した.
  246. 以前の教訓があったので,今回はあまり細部にこだわらずに,
  247. とりあえず動くもんをつくって公開しちまえ
  248. という方針で開発を進めた.
  249. 以前のネットワーク用ライブラリとか,EyeClock-2.0 での経験とかが
  250. あったので,開発はトントン拍子に進んで,わずか1ヵ月足らずで
  251. ふつうにプレイできるプロトタイプが仕上がった.
  252. よく,「N.A.D.A.R.って,なんの略なの?」と聞かれる.
  253. N.A.D.A.R. の命名には,ずいぶん悩んだ.ここで,命名の由来を書こう.
  254. もともと橋本も僕も,
  255. グロブダー
  256. というゲームが好きだった.ナムコのずいぶん古いアーケードゲームなのだが,
  257. ちょっとでも気を抜いたら(ていうか,気を抜いていなくても),あっと言うまに
  258. やられてしまうという,スリルとスピード感のあるゲームだった.
  259. やはりスリルと緊張感,一瞬の判断こそが
  260. アクションゲームの醍醐味
  261. だとぼくは思っているので,そんなゲームを作りたいと常々思っていた.
  262. N.A.D.A.R. のプロトタイプが完成して,そろそろ名前を決めてしまいたいと
  263. いうとき,橋本と焼肉屋に行った.で,焼肉屋でいろいろ話したのだが,とりあえず,
  264. 「TANK」はやめよう
  265. ということになった.また,
  266. 「エックスなんちゃら」という名前もやめよう
  267. ということになった.
  268. 戦車の重みを表現したいので,「グロブダー」のように,濁音のある名前にしたい.
  269. そう考えると,「グロブダー」は,G,B,D と,濁音のある文字が3つも入っている.
  270. そこで考えたのが,
  271. GNOMEDAR
  272. でも,GNOME は直接的にとくに関係は無いのでこれは却下.
  273. いっそのこと,日本的な名前はどうだろう?
  274. 「風林火山」
  275. なんて冗談半分でいろいろ考えていたのだが,そこでそのとき,
  276. 「灘の生一本」
  277. という日本酒のポスターが目に入った.
  278. 「灘」ってのはどうだ?
  279. このときは,あまり深く考えてなくって,けっきょくこの日には決まらなかった
  280. のだが,このときにしっかり決めなかったのがよくなかった.
  281. そのうち開発を進めるうちに,ファイル名とかドキュメントとかも整理しだして,
  282. ほんとにもういいかげん名前を決めたい
  283. と思い,けっきょく,「灘」にアクセントで r をつけて,「NADAR」にしてしまった.
  284. というように,あまり意味なく決まってしまった「NADAR」なのだが,
  285. 作者としては,いちおう,
  286. アルファベットになにか意味を持たせたい
  287. うーん,
  288. N.A.D.A.R. - Network Action ...
  289. だめだ,Dのあたりでなんにもおもいつかん.
  290. (次回作の OMAKE.jpn に続く)
  291. ■■ EyeClock 開発秘話
  292. そもそもなんで EyeClock を作り出したかってはなし.
  293. 大学の卒業研究のために研究室に配属されたのは,1996年の3月だった.
  294. この研究室では数値計算を行うため,メインの OS として UNIX が使われていた
  295. のだが,僕にとっては,これが,よかった.
  296. 研究室では主に FreeBSD を使って作業していたんだけれど,
  297. 「好きな画像を時計にしたい!」
  298. と,常々思っていた.
  299. 今思えば,よく探せばそういう時計アプリケーションもなにかしらあるんじゃ
  300. ないかと思うんだけど,そのときはよく探しもせずに,man xclock をてきとーに
  301. 読んだくらいであきらめていた.
  302. これが後々 EyeClock の開発につながったわけだ.
  303. EyeClock の開発に着手したのは,たしか,1998 年の6月ごろだったと思う.
  304. 1998年の5月というと,自分は大学院の修士2年で,就職活動のあいまを
  305. 見つけては,本業の研究をそっちのけにして,
  306. XMangekyou
  307. を書いていた.
  308. なにせこのころは,毎日毎日,一日中 X のプログラミングをしてたのだ.
  309. 毎週火曜と水曜には研究室に泊まって,大学の近くの
  310. 三河屋という酒屋(理科大の人はよく知っているハズだ)
  311. に行って,ビールとワインを買って,夜になると,
  312. 飲んで歌いながら
  313. プログラミングをしていたもんだ.(今考えると,不気味だ)
  314. 研究室にはスパゲッティとミートソースの缶詰を買い置き(これも三河屋で買ったもの)
  315. してあって,だいたい夜の12時を過ぎたころに,夜食を食べて,で,
  316. 明け方の4時頃までがんばって,眠くてどうしようもなくなったら,寝袋で寝る.
  317. 朝は10時頃に起きて,大学のトレーニングルームでシャワーを浴びて,
  318. シャンプーして,ヒゲをそって,で,またプログラミングを始める,
  319. といった生活だった.
  320. このため,研究室には,
  321. 着替えも常備してあった
  322. このころまでは,だれも使っていなかった Sun SPARC Station 5 をよく
  323. 使っていたんだけれど,XMangekyou の動作を XFree86 上でテストする
  324. 必要性が出てきたので,これまたあまりだれも使っていなかった,ロースペックの
  325. オーダーメイド AT 互換機(FreeBSD + XFree86) を使うようになった.
  326. このロースペックマシンは,研究室に数少ない,
  327. 音の出るマシン
  328. のうちのひとつだったので,けっこうお気に入りだった.ロースペックなので,
  329. だれも使わないし,計算を走らせたりもしないから,気軽に使えるということもあり,
  330. けっきょく,卒業するまで,ずっとこのマシンを使っていた.
  331. EyeClock や XStarRoll や修士論文は,すべてこのマシンを使って書いた.
  332. 5月の中旬に就職が決まって,そのあとには,たまに研究もしつつ,
  333. でも本業はプログラミングというくらいのいきおいで,プログラミングをしていた.
  334. 当時の後輩曰く,
  335. 「坂井さんはいっつも研究室にいるけど,
  336. なにをやっているのかわからんです」
  337. 研究してるわけでもないし,遊んでいるようにも見えないし,ということだった
  338. らしい.とはいっても,
  339. じつは遊んでいたんだけどね
  340. 5月の終り頃,XMangekyou をひととおり作り終えたあとは,いよいよ EyeClock の
  341. 開発にとりかかる.
  342. まず,時計「MyClock」を作った.これは,時計とはいっても,
  343. 白黒のビットマップを張りつけられるだけ
  344. という,非常におそまつなものだった.当時はまだピックスマップファイルの
  345. 読み込みかたをしらなかったので,しかたなくビットマップで作ったのだ.
  346. このあたりの作業の順番はじつはうろおぼえなので,たしかなことはよく
  347. 覚えていないのだが,次にやったのは,
  348. 「ピックスマップファイルを読み込んで,カラーで表示したい!」
  349. ということだったとおもう.
  350. しかし,X の標準では,ピックスマップファイルを読み込んでピックスマップを
  351. 作成するような関数は,提供されていない.
  352. X や Motif の書籍をいろいろ調べたのだが,ピックスマップファイルの
  353. 読み込みかたは,書いていなかった.そこで,かの有名な,
  354. EmiClock
  355. のソースを参考にすることにした.
  356. EmiClock のソースを読んで,はじめて Xpm ライブラリの存在を知り,
  357. ピックスマップファイルを読み込むことができるようになった.
  358. ちなみに EmiClock はすばらしく優れたプログラムで,ソースを見ると
  359. わかるのだが,ほんとにいたれりつくせりで,
  360. X のプログラミングをしようとしてるひとは,ぜひ読んだほうがいい
  361. という,おすすめの1本である.
  362. これで MyClock は,カラーの画像が扱えるようになった.自分としては
  363. それなりに満足して,タレントの画像を張り付けたりして使っていた.
  364. そんなある日,忘れもしない,帰宅中の
  365. 三田線水道橋~白山
  366. あたりで,ふと思った.
  367. 「あれで目を動かしたら,面白いんじゃないか?」
  368. ここから EyeClock の開発が始まったわけだ.
  369. (次回作の OMAKE.jpn に続く)
  370. ■■ 趣味のプログラム
  371. ぼくは子供のころから,なにかものを作ることが趣味だったんだけど,
  372. ある日,ぼくの兄上(こいつもなにかものを作ることが趣味なのだが)と,
  373. ぼくと,父親で,
  374. よくわからない展示会
  375. のようなところに行った.(なんの展示会だったのか,会場はどこだったのかなどは,
  376. まったく覚えていない)
  377. この展示会場には,当時はやりだった LED のゲームとかがいろいろあったように
  378. 記憶しているのだが,この会場のある一角に,
  379. マイコン
  380. が置いてあるコーナーがあった.(もともとは兄がそっちが目的だったらしいのだが)
  381. このマイコンは,RETURN キーが緑色と赤色だったので,いま思えばおそらく,
  382. 東芝のパソピア7だったのだろうとおもう.
  383. このマイコンでは,実際に BASIC のプログラムをいろいろいじる,というような
  384. デモが行われていたらしく,
  385. BASIC のプログラムリストが画面上にダンプされていて,
  386. カーソルが左上で点滅しているだけ
  387. だった.ちなみに,この「マイコン」を初めて見て,ぼくが最初に口にした言葉は,
  388. 「ねえねえ,これってどんなゲームなの?」
  389. だった.うーん,はずかしい.
  390. しばらくして,近所のひとがパソコンを持っているというので,
  391. 兄といっしょに触らせてもらいに行くことになった.
  392. このときあったのは,いま思えばたしか Sharp の MZ 系のマシンだったと思う.
  393. 当時はぼくはパソコンというものをまったく知らなかったので,ただ単に
  394. 兄についていって,兄がいじるのをとなりで見ていただけだったのだ.
  395. 兄がプログラムを打ち込み終って run すると,画面上に,
  396. 2
  397. とかの数字が出てきた.
  398. もういちど run すると,今度は,
  399. 6
  400. とかの数字が出てきた.
  401. 兄「これ,見てみ」
  402. 僕「なに,これ?」
  403. そう,このとき兄が書いていたプログラムは,忘れもしない,
  404. サイコロ
  405. であったのである.
  406. いま思えば,
  407. 10 A=INT(RND(1)*6)+1
  408. 20 PRINT A
  409. 30 END
  410. のようなプログラムを打ち込むのに,10数分かかっていたのだろう.
  411. そんな兄の要望で,ついに我が家もパソコンを買うことになった.
  412. 当時兄は小学6年生で,毎週秋葉原に行っては抵抗やコンデンサを買いこんできて,
  413. ラジオとかを作っていた(気違い小学生だ)のだが,そんなある日の日曜に,
  414. 父親,兄,僕で,いよいよ秋葉原に買いに行った.
  415. 秋葉原駅前のサトームセン(エスカレーターから外が見える建物)で選んだ
  416. パソコンは,忘れもしない,
  417. PC-8001mkII
  418. であった.たしか当時で本体価格が127,000円(だと思った)で,さらに当時はまだ
  419. 高価だったカラーディスプレイ(当時はまだ,グリーンディスプレイが主流だった)
  420. とデータレコーダーも買ったわけだから,当時の小学生にしては,
  421. けっこう高い買物だったとおもう.
  422. これのおかげで今があるわけだから,親には感謝感謝である.
  423. このときついでに,
  424. 2001年宇宙の旅
  425. というゲームと,あと,
  426. ファイヤーレスキュー
  427. というゲームも買った.このファイヤーレスキューというのは,当時,
  428. マイコンショップの店頭で,デモなどによく使われていた記憶があるのだが,
  429. 内容はというと,
  430. 消防車を左右に操作して,スペースを押すとハシゴが伸びて,
  431. ビルの火事から人を救助する
  432. という,非常に単純なゲームだった.しかも,画面構成は,
  433. キャラクタベース
  434. だったのである.
  435. ____
  436. | |
  437. /\__/
  438. /\/
  439. /\/
  440. /\/
  441. /\/
  442. _/\/__________
  443. | | | | \
  444. | | | |__\
  445. | | | |
  446. |__/ \____/ \___|
  447. \_/ \_/
  448. というような消防車を動かすわけである.
  449. どちらも BASIC で書いてあって,ゲーム中に Stop を押すと,
  450. ^C
  451. Break in 1130
  452. とかいって止まってしまって,なんと,
  453. プログラムリストを見ることができる
  454. という,いまから考えると信じられないようなものだった.
  455. ぼくが小4の6月に,ついに我が家にもパソコンが来た.このころは,
  456. パソコンが使える = BASIC でプログラムが書ける
  457. という時代だったので,ぼくもプログラムを書きはじめることになるのだが,
  458. はじめて買ったパソコンの本は,
  459. BASICプログラミング
  460. という本だった.(漫画である)
  461. どういう内容の本かというと,
  462. ロムさんとラムさん
  463. という兄弟が,
  464. マイコさんやアイコさん
  465. のために,家計簿だとか,社員の定期券の期限の計算用プログラムとかの
  466. プログラミングをしていく,という内容だった.
  467. しかし,なんというか,今思うと,
  468. すごい名前だ
  469. ちなみにアイコさんはマイコさんの妹で,アイコさんはショートカットの OL で,
  470. ロムさんはマイコさんが好きで,ラムさんはアイコさんが好き,という設定だった.
  471. ぼくは,長女系のマイコさんより,次女系のアイコさんのほうが好きだったなあ.
  472. この本で気になったのは,キーボードを叩くときの効果音が,
  473. ピッピッ
  474. なのである.キーボードを叩いたときに,ピッピッなんて音がするパソコンなんて
  475. ないよなあ,と子供ながらに思ったことを記憶している.
  476. この本は BASIC をあるていど知っていることを前提にしていて,
  477. 実際にプログラムを書いていく,という内容だったので,まったくの初心者の
  478. ぼくには,よくわからなかった.
  479. そこで次に買った本が,
  480. まんがパソコンゼミナール(きぎようへい・さとう光)
  481. この本は,なんと,いまだに自宅に保存してある.
  482. どういう本かというと,
  483. マイちゃんとコンちゃん
  484. が,名機 PC-8001 を使って,「先生」と「ネコちゃん」といっしょに,
  485. コンピュータの仕組みや,プログラムの書き方を勉強していく,という内容だった.
  486. しかし,なんというか,この本の登場人物も,
  487. コテコテの名前
  488. で,苦笑してしまう(だって「マイちゃん」と「コンちゃん」だよ).
  489. 昔はこういうのが多かったもんだ.
  490. この本はとてもわかりやすくて,
  491. データバスやアドレスバスやコントロールバスや ROM や RAM や
  492. モニタプログラムや BASIC インタプリタや入力装置や出力装置や
  493. 入出力装置や機械語
  494. といった,ハードのこともちゃんと解説されていて,とってもためになった.
  495. この本は,ボロボロになるまで,100回以上繰り返し読んでいると思う.
  496. この本の最後を飾っていたプログラムは,「センスイカンノエ」というものである.
  497. どういうものかというと,たしか,
  498. 10 REM センスイカンノエ
  499. 20 PRINT CHR$(12)
  500. 30 LOCATE 20,10
  501. 40 PRINT "センスイカンノエ"
  502. 50 FOR I=0 TO 1000
  503. 60 NEXT
  504. 70 PRINT CHR$(12)
  505. 80 LOCATE 0,10
  506. 90 PRINT " ■ "
  507. 100 PRINT "/~~~~~~~~~~~~\"
  508. 110 PRINT "\____________/"
  509. 120 END
  510. というようなものだったと思う.
  511. FOR I=0 TO 1000
  512. NEXT
  513. で,十分なウエイトになってしまうあたりが,すごいとこだ.
  514. そーいえば,このころってまだ,
  515. マイコン
  516. って言葉が使われていた時代だったなあ.
  517. ぼくがプログラミングをはじめたころは,BASIC が全盛の時期だった.
  518. 当時は BASIC のプログラムが載っている本が多くあって,
  519. なにをかくそうぼく自身,本に載っているプログラムを
  520. ゲームやりたさで
  521. ひたすら打ち込んで,プログラムをおぼえた,というクチである.
  522. プログラムを打ち込み終って,どきどきしながら run させると,
  523. 必ずといっていいほど,
  524. Syntax Error in 30 (いきなり3行目だったりする)
  525. などと言われてしまって,それから本とディスプレイを照らしあわせるという
  526. あまりやりたくない作業になるわけである.
  527. Syntax Error なら,まだいい.たいていはそこの行にミスがあるからである.
  528. やっかいなのは,
  529. Illegal function call (関数やステートメントに渡す値がおかしい)
  530. とかである.これだと,たいていは,その行ではなく,別の行に間違いがある.
  531. いちばんイヤだったのは,
  532. Subscript out of range (配列の範囲をこえたアクセス)
  533. だ.これだと,まず間違いなく,別の行にミスがあって,変数の値が
  534. おかしくなっているのである.
  535. しかしそれも,
  536. (タダで)ゲームがやりたくてたまらない小学生
  537. にとっては,それほど苦ではなかったようである.
  538. この苦労(?)のおかげで,いま思えば,フリーソフトウエアプログラマにとって
  539. もっとも重要な力である,
  540. どんな問題が起きても,自力でなんとかする気力
  541. が身についたと思う.
  542. どんな本を参考にしていたかというと,一番さいしょに読んで打ち込みはじめたのは,
  543. いまでも覚えている,知る人ぞ知る,ナツメ社の,
  544. はるみのゲームライブラリII
  545. という本だった.この本は残念ながら,どこかへいってしまった.
  546. うーん,もう一度,読んでみたいものである.
  547. 「あるけあるけゲーム」(tron のようなゲーム)とか,「スクロールジャンプ」とか,
  548. 「ビルディングクラッシュ」とか,「地底探検ゲーム」とか,ペンゴもどきとか,
  549. 月面着陸とかを打ち込んでは遊んでた.
  550. この本は当時はやりの,
  551. 1画面プログラム
  552. を集めた本(しかも,40x25)で,わりと手軽に打ち込めるプログラムが
  553. 多かったのだが,それでもパソコンを覚えたての小学生ではキーを探すのも
  554. ままならず,1本を入力するのに2時間とか3時間とかかかっていた.
  555. しかしそれでも,
  556. (タダで)ゲームをやりたいという熱意
  557. は強く,学校が終ったら急いで帰って,きのうの続きを打ち込みはじめる,
  558. という日も多かったように思う.
  559. 当然,学校でもゲームのことばかり考えているわけであるから,困ったものだ.
  560. はるみのゲームライブラリ
  561. という本のプログラムも,よく打ち込んだ.
  562. そのうち打ち込んだゲームを適当に改良したりするようになる.
  563. やがて,自分でもゲームを作り出すようになる.
  564. はじめて作った記念すべき1作目のゲームは,いまでも覚えているが,
  565. 「レーザーパックマン」
  566. というタイトルだった.
  567. どういうゲームかというと,
  568. ・まず,敵がいる.(ランダムで動いている)
  569. ・自分がいる.(テンキーの '1', '2', '3', '5' で移動できる)
  570. ・自分と敵の X 座標が一致すると,「ピッ」と音がして,レーザーが発射される.
  571. (IF X=EX THEN LINE(X,Y)-(EX,EY),"■",2 のようなことをやっているわけである)
  572. ・自分と敵の Y 座標が一致したときも,おんなじ.
  573. ・レーザーを撃つと,スコアが増える.
  574. パッと見てまず思うだろう.そう,このゲームには,
  575. ゲームオーバーがない
  576. のである.
  577. いま思えば,こんなしょーもないゲームでよく遊んでいたものだと思う.
  578. 今,思いだせる限りで,レーザーパックマンを再現してみよう.
  579. 10 X=20:Y=12:TX=10:TY=10:S=0
  580. 20 LOCATE X,Y:PRINT " "
  581. 30 LOCATE TX,TY:PRINT " "
  582. 40 I$=INKEY$
  583. 50 IF I$="1" AND X>0 THEN X=X-1
  584. 60 IF I$="3" AND X<39 THEN X=X+1
  585. 70 IF I$="5" AND Y>0 THEN Y=Y-1
  586. 80 IF I$="2" AND Y<23 THEN Y=Y+1
  587. 90 IF INT(RND(1)*2)+1=1 THEN TX=TX-1:GOTO 130
  588. 100 IF INT(RND(1)*2)+1=1 THEN TY=TY-1:GOTO 130
  589. 110 IF INT(RND(1)*2)+1=1 THEN TX=TX+1:GOTO 130
  590. 120 TY=TY+1
  591. 130 LOCATE X,Y:PRINT "○"
  592. 140 LOCATE TX,TY:PRINT "●"
  593. 150 IF X=TX AND Y=TY THEN LINE(X,Y)-(TX,TY),"■",2:S=S+100:BEEP1:BEEP0:GOTO 170
  594. 160 IF X=TX OR Y=TY THEN LINE(X,Y)-(TX,TY),"■",2:S=S+10:BEEP1:BEEP0
  595. 170 LOCATE 10,0:PRINT S
  596. 180 GOTO 20
  597. なにしろはじめて書いたプログラムなので,相当無駄な書き方がされていたはずで
  598. ある.そのへんも極力再現してみたが,こんなんだっただろうか.
  599. 確率的に,敵が左上のほうに行きやすくなってしまったというのをおぼえている.
  600. こんなんおもしろいのか?
  601. とも思ってしまうが,自分で作ったゲームというのは,
  602. それなりにおもしろいものである.(本当かなあ...)
  603. ほかにも,インベーダーゲームを作ったことがある.
  604. これは,大量のインベーダーをひとつひとつ処理することに無理があったので,
  605. GET(X,Y)-(X+9,Y+4),G% してから, PUT(X+VX,Y+VY)-(X+VX+9,Y+VY+4),G%
  606. で,インベーダーをまとめて動かしていた.
  607. このころの雑誌で忘れられないのが,
  608. マイコン BASIC マガジン
  609. である.
  610. (次回作の OMAKE.jpn に続く)
  611. ■■ 参考文献
  612. ぼくは,本が好きだ.
  613. 本棚の専門書を分類したり,整頓したりするのが,とても好きである.
  614. というわけで,参考文献紹介も兼ねて,ちょっと書評(ていうか,個人的な思い出話)
  615. でも書こうかと思う.
  616. ■ C言語関係
  617. 「はじめての C 改訂第3版 [ANSI C 対応]」
  618. ぼくが大学3年のとき,この本で C 言語に入門したので,
  619. けっこう思い入れがある本である.
  620. あとで知ったのだが,入門書としては,わりと名著で有名らしい.
  621. これを参考にして,大学の授業で,
  622. 円周率を(double 型の範囲で)計算するプログラムを作る
  623. という課題があったときに,調子にのって,
  624. 円周率を10万桁まで計算するプログラム
  625. を作って提出した記憶がある.しかも,
  626. 計算の途中経過をセーブすることができる
  627. という,なかなか気のきいたプログラムだった.
  628. 「C プログラミング診断室」
  629. 衝動買いした本.いちおうひととおり読んだ...と思う.
  630. たしか大学4年のとき,池袋のビックカメラにまだパソコン館が無いころ,
  631. ビックカメラの1階の書籍コーナーで買った.
  632. 内容はちょっと古めなので,オブジェクト指向が流行りの今としては,ちょっと
  633. 古いかもしれない,と思う.
  634. 「C プログラミング専門課程」
  635. 研究室に入ってから UNIX 上で C 言語でプログラミングをするようになって,
  636. 「C 言語をもっと勉強したい!」と思って買った本.
  637. これはためになった.この本のおかげで,コンパイラの動作とか,メモリとかが
  638. わかってきた.
  639. こんな疑問を持ったことを覚えている.
  640. 「char * s = "ABC"; などの文字列リテラルは,メモリ上に静的に確保される.
  641. ということは,
  642. while (1) {
  643. printf("ABC\n");
  644. }
  645. を実行すると,printf(); が実行されるたびに "ABC" がメモリ上に
  646. 配置されるわけだから,そのうちメモリがなくなってしまうのではないだろうか?
  647. しかも,これに対する自分の解答が,
  648. char * a = "ABC";
  649. char * b = "ABC";
  650. のように,文字列がダブっている場合には,コンパイラが判断して,
  651. 同じ領域に割り付けたりするらしい.
  652. たぶん,while () で printf() を繰り返したときにも,
  653. これと同様に,printf() の実行時には,文字列は同じ領域に
  654. 割り付けられるのだろう.
  655. うーん,すばらしくとんちんかんというか,さすが BASIC 出身者,というか,
  656. こうして書くこともはずかしいような疑問である.
  657. (インタプリタとコンパイラの動作を誤解しているわけだ)
  658. 「プログラミング言語 C」(いわゆる "K&R" である)
  659. 有名な本なので,研究室に入ってからとりあえず買ってみた.ざっと読んだだけ.
  660. 「fgetc() の戻り値が,なぜ int 型なのか?」という疑問を持ったときに,
  661. この本に解説してあったので,
  662. 「なんていい本なんだ!」
  663. と思って買ったんだけど,あんまりちゃんと読んでない.
  664. 「C プログラミング FAQ」
  665. これは,いい.最高にためになる.
  666. とりあえず1度通して読んだが,またそのうちもう一度通して読みたいと思っている.
  667. 中級者くらいになって,たいてい疑問に思うようなことは,必ず書いてあるのが
  668. すごい.
  669. この本に書いてあることが全般的に理解できてれば,C 言語はほぼ完璧なのでは,
  670. と思う.
  671. ■ X 関係
  672. 「X-Window Ver.11 プログラミング[第2版]」
  673. X のプログラムをはじめたころに,これの第1版が研究室にあったので,
  674. よく参考にしてた.
  675. そのうち,家で使う分と学校で使う分の2冊が欲しくなってきて,けっきょく,
  676. 第2版を自分で買った.
  677. X のプログラミングをする人って,この本を参考にしている人がけっこう多い
  678. みたいだね.フリーソフトのドキュメントを読んでると,参考文献とかで
  679. よく見かけたりする.
  680. 「X-Window OSF/Motif プログラミング」
  681. X のプログラムをはじめたころに,これを参考にしてプログラミングしてた.
  682. はじめのうちは,Motif (正確には,Lesstif) を使っていたのだが,
  683. やはり Motif は商品である,というのと,
  684. 「BSD を 256 倍使うための本」(いわゆる,「黒いニゴロの本」である)
  685. の,EmiClock 開発秘話で,
  686. X のプログラミングは,X ツールキットを使うのがオシャレ
  687. というふうに書いてあった,というのがあって,だんだん Motif は使わなくなった.
  688. でも X ツールキット専門の本ってなぜかすっごく少なくて,たいていは
  689. X ツールキットのプログラミングをするときでも,Motif の本を参考にしたりしてる.
  690. ちなみに,EyeClock は,
  691. 「BSD を 256 倍使うための本」
  692. に,すっごく影響を受けている.
  693. ■ プログラミング
  694. 「GNU ソフトウエアプログラミング」
  695. プログラミングに emacs, gcc, make, gdb を使うときの一連の流れが
  696. わかるので,とってもいい本だと思う.
  697. 個々のアプリケーションをひとつひとつ詳しく解説してある本はたくさん
  698. あるのだが,開発の一連の流れとして解説してある本は,なかなか少ない.
  699. ■ システム管理
  700. 「スーパーユーザの日々」
  701. 「UNIX ネットワークの日々」
  702. 「Mail & News の日々」
  703. 研究室のシステム管理者をやるようになって,この本でいろいろ勉強した.
  704. 帰宅中の有楽町線のなかでよく読んだ.
  705. 内容はちょっと古めだが,基礎的なことがしっかりと書かれているので,
  706. 基礎勉強にとてもいい本だと思う.書いてある内容も,とてもしっかりしている.
  707. 「UNIX のシステムの勉強がしたいんだけど,なにかいい本はないか?」
  708. 「ネットワークの勉強がしたいんだけど,なにかいい本はないか?」
  709. とか聞かれたときには,この本を推薦するようにしている.
  710. 「UNIX ネットワークの日々」「Mail & News の日々」は,研究室内の
  711. システム管理者育成の勉強会で教材にしていた.この勉強会では,毎回,
  712. 「K君」や「中村さん」の役を決めて,読む
  713. しかも当然,
  714. セリフ付
  715. ということをしていた.
  716. 「え,こうすればいいんじゃないんですか? 中村さん」
  717. 「それは違うよ,K君.これはこれこれこうだから,こうするんだよ」
  718. 「なーんだ,同じUNIXでも,HPとSUNではずいぶん違うんですね」
  719. というようなセリフを言い合うわけである.(実話)
  720. て,朝,研究室に入ってくる卒研生とかが,
  721. スーパーユーザーが,学芸会のセリフの練習でもしているかのような姿
  722. をまのあたりにして,ギョッとしていた.(これも実話)
  723. 「セキュリティの日々」とかも,出してほしいもんだ.
  724. 「よしだともこのルート訪問記」
  725. 最近買ったのだが,なんていうか,ここまで,
  726. システム管理者の実際
  727. が書かれているという本は,他にないのでは? とおもう.
  728. (そりゃそうだ,現役の管理者へのインタビューなのだから)
  729. ほかの大学や研究室とかではどういうふうに管理されているか,というのが,
  730. 非常に幅広く紹介されていて,とてもためになる.
  731. というのは,コンピュータやネットワークのシステムの構成など
  732. (こういったことも非常にためになるが)が書いてあるだけでなく,
  733. 「管理者の人材確保」や「管理者の育成・教育態勢」
  734. がどのようになっているかなどが書かれているからだ.
  735. やはり,「人材の確保」と「教育」がいちばん大変で重要なことであって,
  736. こういったことが,システム管理の実態だと思う.
  737. しかし,読んでいると,他の大学や研究室などの管理態勢や教育態勢が,
  738. うらやましくなってしまう
  739. ということもある.
  740. (次回作の OMAKE.jpn に続く)
  741. ■■ うまいもの
  742. 寿司がすきである.
  743. おごってもらうとしたら,
  744. 1.寿司
  745. 2.焼肉
  746. 3.なんかめずらしいたべもの
  747. の順に嬉しい.なにしろ小学生のころは,
  748. 寿司屋になりたかった
  749. というくらいである.
  750. とはいっても,寿司などそうそういっつも食べにいけるものではないから,
  751. ふだんは回転寿司にいったり,たまに寿司屋で食べるくらいである.
  752. とはいっても,魚の名前をよく知らない.寿司屋でネタを見ても,
  753. なんの魚だかわからなかったりする.
  754. そのうち,ちゃんとネタの名前をおぼえて,
  755. 「なんにいたしますか?」
  756. 「そうだなあ.白身のいいとこを握ってくれ」
  757. 「へい,おまち」
  758. 「お,これはヒラメだね」
  759. なーんて言ってみたいのだが.
  760. ちなみに,好きなネタベスト10は,
  761. 1. 中トロ
  762. 2. ビントロ
  763. 3. サーモン,ハマチ,マグロ赤身
  764. 6. 鯛,メカジキ,サンマ
  765. 9. カニ味噌,ウニ
  766. てなかんじだろうか.適当に考えただけなのだが.
  767. うーん,こうしてみると,まだまだ子供の味覚である.
  768. 池袋は,やたらと回転寿司が多いので,嬉しい.
  769. (次回作の OMAKE.jpn に続く)
  770. ■■ 携帯端末
  771. わずか 800g 程度の Libretto SS1000 に FreeBSD と X を入れて,
  772. 電車の中だろうが,待ち合わせの「いけふくろう」の前だろうが,
  773. ところかまわずプログラミングをしている.
  774. ・携帯端末(いわゆる,WindowsCEマシン)
  775. ・携帯Java端末
  776. ・携帯電話
  777. ちょっと前までは,携帯端末が今後の主流になると思っていた.
  778. しかし今では,これからは,携帯端末でなく,携帯電話が主流になって,
  779. 携帯電話でなんでもできる,というような方向に進んで行くのだろうとおもう.
  780. というのは,携帯電話はやはり「電話」という,実用的で馴染みやすい機能が
  781. メインであるからだ.
  782. 「GPS標準搭載の携帯端末」があったとしても,GPSをやるためにわざわざ
  783. 携帯端末を買って,操作をおぼえようとする人は少ないだろう.
  784. しかし,「GPSつき携帯電話」ならば,携帯電話が欲しい人で,物珍しさで
  785. 買ってしまいそうな人が出てくるような気はする.
  786. きっとそのうち,携帯電話に Java や Linux が搭載され,美術館に行ったら
  787. 自分の携帯電話に案内が自動的にインストールされて,自分の携帯電話が
  788. 案内してくれる,というようになるのだろう.
  789. 携帯電話のメモリサイズや処理能力はどんどん進化しているから,いまパソコンで
  790. できるようなことは,ぜんぶ携帯電話でできるようになってしまう.
  791. そのうち映画とかも見れるようになって,電車の中の10分くらいの中途半端な
  792. 自由時間に,ちょっと映画をみたり,ロールプレイングゲームの続きをしたり,
  793. 電子ペットにえさをあげたりするようになるのだろう.
  794. 携帯電話のいいところは,小さくて電車の中とかでいじっていても違和感は無いが,
  795. 多彩の機能を盛り込める程度には大きい,というところだ.
  796. たとえば,GPSつきのごつくてでかい腕時計が出ても,それをいつもつけようとする
  797. 人はいないだろう.
  798. また,「違和感が無い」というのはとても重要だ.
  799. ぼくのようにところかまわず人目も気にせず,いつどんなところでもプログラムを
  800. 書き出してしまうような人間はともかく,普通の人は,やはり人目は気になる
  801. (のだと思う)からだ.
  802. (次回作の OMAKE.jpn に続く)
  803. ■■ 電車で書くプログラム
  804. ぼくは通勤に片道1時間半かかるのだが,この時間は貴重なプログラミングの
  805. 時間になっている.もともと就職するときに,ずいぶん遠くにある会社だけど,
  806. まあ,混まない方向だし,ずっとプログラム書いてればいいか,とおもって就職を
  807. 決め,就職前の2月に Libretto SS1000 を購入し,ほんとに車内で書くようになった.
  808. 東急田園都市線の反対方向に乗っているので,行きも帰りも必ず座れる.天気の
  809. いい日は通勤中にもかかわらず,
  810. 玉川でついつい降りたくなってしまう
  811. 一応,降りたことはないけどね.
  812. 帰りは渋谷乗り換えなのだが,調子に乗って書いてると,ノリにノッてきて
  813. 渋谷をそのまま乗り過ごした
  814. ということが何度かある.また,あまりにノッていると,渋谷で乗り換えた後も,
  815. 続きを書きたいという欲求を抑えることができずに,
  816. 山手線の中で,立ってプログラムを書いた
  817. ということも何度かある.XFireworks の一部分のコードは,山手線で立って書かれた.
  818. EyeClock や N.A.D.A.R. や XFireworks や WonX のコードの大部分は,こうやって
  819. 電車の中で書かれた.今思えば,
  820. ずいぶん書いたものだ
  821. 田園都市線の車両は,何種類かある.その中でも旧式なのだろうか,車両の端の席に,
  822. 肘をかけられるくらいの出っぱりがある車両がある.これは,いい.出っぱりの
  823. 上に Libretto と飲物を置いて,優雅に書くことができる.出っぱりがない車両だと,
  824. 膝の上に Libretto を乗せて書くことになる.
  825. (次回作の OMAKE.jpn に続く)
  826. ■■ モバイルについて
  827. ノートパソコンやモバイルについて思うことなんだけど,もしもモバイルと
  828. いうならば,やはり,
  829. 本当に持ち歩けること
  830. というのが,絶対条件だと思う.のだが,
  831. 本当に持ち歩けるの?
  832. と疑問になってしまうような製品が多々あると思う.
  833. たとえば,いくら軽くて小さくて高性能だとしても,22万円もするようなノートPCを
  834. そのまま,
  835. 無造作にバッグにぽんと入れて
  836. 気軽に持ち歩くことができるだろうか.(ぼくはできない)
  837. だから,高価な製品は,それだけで(モバイルとしては)ダメだと思う.
  838. もっと安っちくて,落としても無くしても置き忘れても,(それほど)ショックが
  839. 少なくて,古くてぼろくて傷だらけで,
  840. だれも盗もうなどと思わないくらいのマシン
  841. が,モバイルとしては最適だと思う.
  842. 重量は,可能な限り軽いほうがいい.1kgを超えると常に持ち運ぶのが苦痛になる.
  843. また,電源アダプタも小さいほうがよい.実際に持ち歩くと,大きさよりも
  844. 重さのほうが気になるので,小さいことよりも軽いことのほうが重要た.
  845. インターフェースは,PCカードスロットが1つあれば十分である.データのやりとりを
  846. するのは,LANカードかコンパクトフラッシュが現実的である.USBはあるにこした
  847. ことはないが,それによって高価になったり重くなったりするくらいなら,
  848. 無くてよい.そもそもUSBがあったとしても,どうせつなぐのは
  849. キーボードかマウス
  850. くらいのものである.そもそもモバイルでマウスを使いたいなんて欲張っても
  851. しょうがない.
  852. もしかしたら,
  853. フロッピードライブか CD-ROM ドライブ
  854. をつなぎたいかもしれない.
  855. しかし,モバイルの場合には,このような,
  856. ふだん絶対に持ち歩かないもの
  857. のことを考えてはいけない.機能を限定して,軽く,持ち運びやすく,
  858. いつでもどこでもがモバイルのウリなのだから,あれも使いたいこれも使いたいと
  859. 言い出したら,なんのためにモバイルを使うのか,本末転倒になってしまう.
  860. だから,
  861. PCカードスロットだけで十分
  862. なのである.
  863. モバイルでいちばん気になるのは,結局のところ,
  864. 1に値段,2に重量,3にバッテリのもつ時間
  865. である.値段というのは買うときに高い安いということではなく,
  866. 前述したように,高価なものは気軽に持ち歩けないという意味である.
  867. OS に関しては,(ひいき目なしで)FreeBSD か Linux が最適だと思う.
  868. たとえば Windows だと,出先でちょっと PC カードタイプの LAN カードを
  869. 借りて使いたいというときに,ドライバが入っていないとどうしようもない
  870. ということにおちいりがちである.たぶんインターネットに接続できるパソコンを
  871. 借りて,ドライバをダウンロードして,コンパクトフラッシュ経由でモバイル側に
  872. もってってインストール,という,まあ,あまり考えたくないような,
  873. とても面倒なこと
  874. になる.
  875. インターネットにつながってるPCやコンパクトフラッシュやコンパクトフラッシュが
  876. 使えるノートパソコンがなかったときのことなど,もう,
  877. 想像もしたくない
  878. 出先で借りものの LAN カードを使うこともできないなんて,これでモバイルと
  879. 言えるのか? ぜんぜん実用的じゃないじゃん,と思う.
  880. FreeBSD や Linux なら,はじめから GENERIC なカーネルを作っておけば,
  881. たいていのPCカードは指しただけでそのまま使える.指しただけで使えなかったと
  882. しても,カーネルをコンパイルしなおせば,ほとんどのカードがまず使える.
  883. モバイルでは,出先にもっていって使うことが多いので,出先でPCカードを
  884. ちょっと借りる,ということはとても多い.逆にいえば,もしも出先で借りることが
  885. できるなら,余分な PC カードを常に持ち歩かなくてもよい,ということになる.
  886. また,FreeBSD や Linux では,X のデスクトップ環境をカスタマイズすることで,
  887. マウスをほとんど使わないようにカスタマイズすることができる.
  888. Libretto では,液晶ディスプレイのとなりについてるぐりぐりしたやつで
  889. マウスを操作することになる.しかしぼくの場合,Window Manager をカスタマイズ
  890. することによって,ほとんどマウスを使わずに作業できている.
  891. Windows で使用することなど,想像もしたくないものである.
  892. さらに,OS やアプリケーションの軽さの問題がある.前述したように,
  893. モバイルはできる限り安っちくてロースペックなマシンのほうがよい.
  894. だから,マシンは,Pentium MMX 166MHz の RAM 32MB とかでもいいし,
  895. もっとロースペックでもいい.しかし,たとえこれでも,アプリケーションは
  896. あまり問題なく動いてくれないと困る.(モバイルなので,サクサクと動けとは
  897. 言わないけど,不安定で落ちまくったりするのは困る)
  898. あるアプリケーションを動かすためだけに,高価なメモリを32MBも追加増設する
  899. なんて,非常に無駄なことである.こんなことをしていたら,けっきょくどんどん
  900. 高価になっていってしまう.とにかく高価なものは持ち歩きたくないというのが
  901. ぼくの信条だ.値段が高いものを買うのが嫌というよりも,持ち歩くのが嫌なのだ.
  902. あとは,インストールのしやすさの問題だ.モバイルだとCD-ROMドライブが無い
  903. (あっても別売り)とか,フロッピードライブが無いということが多いので,
  904. インストールが困難な場合が多い.FreeBSD や Linux ならば,ネットワーク
  905. インストールや Windows 側にファイルを置いておいてインストールなど,
  906. 多彩な方法をとることができる.
  907. 最後に意外に重要なのが安定性の問題だ.というのは,プレゼンに使用することが
  908. あるからだ.(プレゼンをやらないならばあまり関係ないけど)
  909. いざプレゼンをやろうとしたら真っ青な画面になってしまい,結局資料無しで
  910. プレゼンを進める,というのを何度か見たことがある.
  911. なんというか,悲しいというか,せっかく昨日徹夜して資料作ったのだろうに,
  912. と思う.
  913. (プレゼンに資料をまったく作って来なかったのと同じだと個人的には思っている)
  914. こんなことで10分間のプレゼン中に,再起動に(ロースペックだし,ファイルシステムの
  915. チェックもするので)3分間もかかっていてはかなわない.
  916. UNIX には満足のいくプレゼンツールが無いと言われるかもしれないが,
  917. きれいな画面でちょこまかした(たいていあまり意味の無い)アニメーションを
  918. 見せたり,プレゼン画面にきれいな背景があったりすることのほうが,
  919. いざプレゼンというときに,OSがまったく動かないことがあるということよりも
  920. 重要なのだろうか,と思う.説明したいことをテキストファイルに書いておいて,
  921. less でテキストファイル見せながらしゃべればいいんじゃないの? と思う.
  922. X を起動する必要すらあまり無いと思う.
  923. 図を見せたいならばXの仮想画面を何枚か用意しておいて,別の仮想画面に
  924. 適当な画像ビューワで画像を開いておいて,仮想画面を切替えるのがいちばん確実だ.
  925. 字が小さければ,でかいフォントを使えばいい.
  926. ブラウザの不安定さがちょっと心配だが,HTML で書いておいてブラウザで見る,
  927. という方法もある.これだと資料をそのままホームページに張り付けることも
  928. できるし,画像も使えるし,フォントのサイズも自由に選べる.
  929. ぼくの経験だと,いっしょうけんめい文字をスライドさせたりフェードインさせたり
  930. 箇条書の項目が順番に出てきたり,意味もなく凝ったアニメーションとかやっている
  931. プレゼンほど,あまり内容が無かったりするものだ.(これは,ほんとうにそうだと
  932. 思うね)
  933. シミュレーションの結果の発表とかで,ほんとに動くものを見せようとして,
  934. アニメーションをやっているのならいい(そういうアニメーションは,むしろ歓迎)
  935. のだけれど.まったく意味の無いアニメーションってホント,多い.(しかもそれを
  936. 見てプレゼンがうまいとかきれいとか,(たとえ社交辞令にしても)褒める人が
  937. いるのだから困ったものだ.内容はどうだったんじゃいと突っ込みたくなる)
  938. ほんとにプレゼンのうまい人や経験のある人は,でかい字でキーワードだけ
  939. 箇条書にして映し出させて,あとはそのキーワードを見て思い出しながら
  940. しゃべったりする.プレゼンって,自分が今までやってきた,自分が一番よくわかって
  941. いることを発表するのであるから,これがあたりまえであるとも思う.
  942. (長々とした文章が小さい字で画面いっぱいに映し出されたと思ったら,発表者は
  943. その文章を読むだけ,というプレゼンがたまにあるけど,なんというか,経験を
  944. つんでくれ,と思う)
  945. だから,プレゼンなんて,less と xv が使えれば十分である.なんかプレゼンの
  946. 話,というか,愚痴になってしまったなあ.
  947. でもせっかく書いたのを消すのももったいないし,まあいいか.
  948. (次回作の OMAKE.jpn に続く)
  949. ■■ ゼビウスについて
  950. いきなりだが,ゲームの話である.
  951. むかしむかし大昔,ゲームセンターのゲーム(いわゆるアーケードゲーム)の黎明期に,
  952. XEVIOUS
  953. というゲームがあった.「ゼビウス」と読む.
  954. 縦スクロールタイプのシューティングゲーム,というと説明は簡単なのだが,
  955. その斬新な構図と演出で,一世を風靡したゲームである.レバーで自機を操作して,
  956. 空中攻撃弾(ザッパー)と地上攻撃弾(ブラスター)で敵を攻撃しつつ,エリアをクリア
  957. していく,というゲームである.エリアは16エリアまであって,16エリアをクリア
  958. すると,7エリアに戻る.全機がやられない限りは,延々とループするわけだ.つまり,
  959. ゲームクリアというものが無い
  960. というゲームである.
  961. XEVIOUS には,カウンターストップというひとつのステータスがある.
  962. カウンターストップ,通称「カンスト」とは,
  963. 9999990点
  964. のことである.ここまでいくと,これ以上点数が上がらなくなるのだ.これが
  965. 「カンスト」である.これができるプレイヤーのことを,「カンストプレイヤー」
  966. とか,「1000万点プレイヤー」とか言ったりする.
  967. と,口で言うのは簡単だが,カウンターストッププレイヤーがどれくらいの
  968. ものかというと,
  969. ゲームをしている後ろに人だかりができてしまう
  970. というくらいのものすごい実力なのである.(ちょっと言いすぎ)
  971. XEVIOUS は標準の設定だと,60000点で1機増える.カウンターストップさせるくらいの
  972. 実力になると,画面最下に,
  973. 自機の残りがずら~~~っと並んでいる
  974. ということになる.そういえば,むかしそんな状態になっていたときに,
  975. 後ろを通り過ぎていった人が,「すげえうまいよこの人」と言ったあと,
  976. 「あんなにボムが残ってる」
  977. と言ってたことがある.ボムではなくて自機なんだけどなあ.
  978. 1000万点までいくのにどれくらい時間がかかるかというと,
  979. ぼくがはじめてカウンターストップさせたときは,午後の1時半から始めて,
  980. 7時間半かかった
  981. 夜の9時までやっていたわけである.目安としてははじめのうちは1時間で
  982. 100万点なのだが,だんだんステージを過ぎていくと,点数が上がってくる
  983. ようなので,少しずつ効率がよくなってくるのである.
  984. XEVIOUS は昔のゲームなので,当然,continue などは無いわけである.だから,
  985. 100円玉一枚で
  986. これだけ粘らなければならない.
  987. このあいだ,食事もとらず,トイレにもいかず,である.昼間のゲームセンターは
  988. 学生が多いのだが,だんだん社会人が増えてきて,
  989. 客層が移り変わっていくのがわかってしまう
  990. 1時間くらいの時間がちょっとできたとき,暇つぶしにプレイすることがたまにある.
  991. こんなときはカウンターストップさせるほどの時間は無いわけであるから,
  992. 適当な時間でわざとやられて GAME OVER にするわけであるが,このようなときは
  993. そのまま GAME OVER にしてはいけない.そこで力尽きたと思われてしまうからである.
  994. 必ず,
  995. 100万点
  996. とか,
  997. 99万9990点
  998. にそろえなければならない.これもカウンターストッププレイヤーのひとつの
  999. プライドである.このように点数をそろえることによって,ネームエントリーに,
  1000. おれはほんとはもっと先までいけたんだけど,わざとここでやめたんだぞ
  1001. というメッセージを残しておくわけだ.
  1002. このためには,トーロイドは30点,ゾルバグは100点,テラジは600点,
  1003. ギドスパリオは10点,ザガートは150点,流れザガートは100点,などというように,
  1004. 敵機や地上物の点数まで正確に把握しておいて,
  1005. 点数を調整しながらプレイする
  1006. というくらいの実力が必要である.
  1007. だから,XEVIOUS のハイスコアランキングを見たときに,
  1008. 1234560点
  1009. とかになっていたとしたら,ああ,さっきまですごいプレイヤーがプレイして
  1010. いたんだな,と理解しなければいけないのである.
  1011. 慣れてくると,1000万点いくのにかかる時間もだんだん短縮されてくる.
  1012. 機数に余裕があれば,
  1013. 得点の高いエリアでわざとなんどもやられる
  1014. (9エリアとかだ)とか,ジェミニ誘導という高等技術を使って,短時間で得点を
  1015. かせぐことができるようになるからだ.エリアの途中でやられると,エリアの先頭に
  1016. 戻るので,同じエリアをなんども繰り返せるのだ.
  1017. しかし,それでも最低4時間くらいはかかる.そこで,XEVIOUS をやるとき,
  1018. 100円玉を入れる前には,
  1019. それなりの心構えが必要になる
  1020. ここでその心構えについて書こう.
  1021. まず,重要なのは椅子だ.ゲームセンターの椅子は座りごごちがあまりよくない
  1022. ものが多いが,2種類の椅子があるゲームセンターは多い.できるだけ座りごごちの
  1023. 良い椅子を持ってきて使う.背もたれつきのものがあれば,なるべくそれを使う.
  1024. ここで,
  1025. 椅子を持ってくるのなんて恥ずかしい
  1026. とか,
  1027. 椅子なんてなんでもいいや
  1028. などと思ってはいけない.これからその椅子に何時間も座るわけであるから,
  1029. 椅子は重要な要素なのだ.
  1030. 飲物は,必ず用意したほうがよい.プレイ前にどんなに喉が渇いていなくても,
  1031. 3時間もやっていれば必ずなにか飲みたくなってくる
  1032. しかし,飲物は大量に飲んではいけない.トイレが近くなるからだ.
  1033. ちょっと唇を濡らす程度に
  1034. ちびりちびりと飲むようにする.
  1035. プレイ中には甘いものが欲しくなってくるので,オレンジジュースなど,なるべく
  1036. あまったるい飲物を選んだほうがよい.コーラなどの炭酸飲料は
  1037. 気が抜けてしまうことも考えなければならない
  1038. のである.
  1039. 食糧も準備したほうがよい.プレイ中は甘いものが欲しくなってくるので,
  1040. ひと粒チョコやキャンディーのように,簡単に口に入れられるものをポケットに
  1041. 大量に用意しておくようにする.ゲームセンターに灰皿があれば,持ってきておく.
  1042. これは,チョコレートの包み紙をまとめておくためだ.
  1043. 問題は,トイレだ.
  1044. プレイ前には,どんなにトイレに行く必要は無く感じても,必ず行くようにする.
  1045. これは行かないと,ほんとうに絶対に後悔する.
  1046. しかし,上級プレイヤーになってくると,
  1047. プレイ中にトイレに行くことができる
  1048. ようになる(実話).機数が半減してしまうのを承知の上で,ゲーム中にトイレに行って
  1049. しまうわけだ.
  1050. 7エリアは,はじめにバキュラの応酬があるので,ほっておいてもやられにくい.
  1051. 後ろに人だかりができているとき,プレイの合間に,悠々と
  1052. 缶ジュースなどをちょっと買ってこれる
  1053. ようになれば,上級プレイヤーといえるだろう.(これも実話)
  1054. だれも信じてくれないのだが,両腕を交差させてプレイしたことがある.
  1055. XEVIOUS はあまり点数をとりすぎると,それ以上プレイできなくするように,
  1056. レバーやボタンが突然入れ替わったりすることがある.(そういう設定ができるらしい)
  1057. 以前,あるゲームセンターでやっていたところ,400万点ほどのところで,
  1058. いきなり操作不能になった
  1059. これは噂のボタン入れ替わりかとおもっていろいろいじってみると,
  1060. レバーが1プレイヤーと2プレイヤーで入れ替わり,
  1061. 空中弾(ザッパー)が撃てなくなっていた
  1062. 昔のテーブルタイプの匡体だったら,プレイを続行するのは難しかっただろう.
  1063. たとえ反対側に行って2プレイヤー用のレバーで操作したとしても,
  1064. 画面は1プレイヤーのほうを向いているわけだから,動きが逆向きになるからである.
  1065. ところが,この時代の匡体は,ストリートファイター2が既にあった時代で,
  1066. 2人が並んで対戦プレイできるタイプの匡体であった.
  1067. 匡体の操作パネルは,こんなかんじだ.
  1068. 1Pレバー 1P START 2Pレバー
  1069. ● 1P地上攻撃ボタン ○ ● 2P地上攻撃ボタン
  1070. \ ○ ○ \ ○
  1071. ○ 2P START ○
  1072. 1P空中攻撃ボタン 2P空中攻撃ボタン
  1073. つまり,2プレイヤー用のレバーはすぐとなりにあるわけだ.しかし,地上攻撃
  1074. (ブラスター)の発射ボタンは1プレイヤーのままで変わっていない.
  1075. そこで,
  1076. 左右の腕を交差させて,左手で2Pレバーを操作して,右手で1P用の
  1077. 地上攻撃ボタンを押す
  1078. ということになった.しかも,ザッパーが発射できないので,
  1079. 空中の敵は,撃てない
  1080. という苛酷な状況である.
  1081. しかし,こんな状況でも,なんとか1時間くらい粘って,最終的には600万点くらい
  1082. までいった.しかしこれを後輩に話したら,
  1083. 話作んないでくださいよ
  1084. とつっこまれてしまった.実話なんだけどなあ.
  1085. うーん,マニアックなネタになってしまった.
  1086. (次回作の OMAKE.jpn に続く)
  1087. ■■ テトリスについて
  1088. テトリスにもカウンターストップがある.レベル99,ライン999,スコア999990点,
  1089. というのが,それである.ぼくは,1度だけ,テトリスをカウンターストップ
  1090. させたことがある.もちろん,
  1091. 100円玉1枚
  1092. でだ.
  1093. テトリスのカウンターストップは,だいたい1時間半くらいでできる.しかし,
  1094. XEVIOUSに比べて,はるかに難しいと思う.というのは,テトリスというのは
  1095. いちばん上まで積まれたらそれで終わりなわけであるから,プレイ中にちょっとでも
  1096. 気を抜こうものなら,
  1097. その瞬間にゲームオーバーになってしまう
  1098. つまり,1時間半という時間の間,集中力を切らさずに持続させる必要があるのだ.
  1099. XEVIOUS では,7エリアのバキュラの応酬や,9エリアのシオナイト,
  1100. 11エリアの先頭付近など,気を抜ける場所が何箇所かある.ちょっと息抜きに
  1101. なにか食べようかとも思うものである.しかし,テトリスでは,
  1102. プレイ中にキャンディーの包みをほどく,なんて暇はない
  1103. まあそこまでいうと大げさで,実際にはチョコレートの包みをほどいたり,
  1104. 飲物をちょっと飲むくらいできるが,基本的には腹が空こうが喉が渇こうが,
  1105. 1時間半我慢する
  1106. というプレイを要求されるわけである.
  1107. テトリスも,上級レベルになるといろいろな技を使えるようになってくる.
  1108. 階段状になっている一番高いところにブロックをいったん置いて,徐々に落として
  1109. 時間を稼ぐ「階段落とし」とか,一見スキマができてしまうような置きかたに
  1110. 見えるのだが,実はラインがうまく消えてくれて,スキマは無くなる「入れ消し」,
  1111. などというのがよく使われるテクニックである.しかし,これぞ上級者のテクニックと
  1112. いうならば,それはやはり「回転入れ」だ.
  1113. □□□
  1114. ■■■■ ■■■■
  1115. ■■■■ ■■■■
  1116. ■■■ ■■■■
  1117. ■ ■■■■■■■■
  1118. とか,
  1119. □□
  1120. □□
  1121. ■■■ ■■■■■
  1122. ■■■ ■■■■
  1123. ■■■ ■■■■■
  1124. ■■■■■■■ ■■
  1125. とか,
  1126. □□
  1127. ■■■■ ■■■■
  1128. ■■■■ ■■■
  1129. ■■■■ ■■■
  1130. ■■ ■■■■■■■
  1131. とかを入れてしまうテクニックだ.
  1132. レベル99でブロックがガンガン落ちてきている状態で,
  1133. □□□□
  1134. ■■■■ ■■■■
  1135. ■■■ ■■■
  1136. ■■■■ ■■■■
  1137. ■■■■■ ■■■■
  1138. ■ ■■■■■■■■
  1139. のようなのを「回転入れ」と「入れ消し」でうまく入れたりすると,
  1140. ギャラリーが寄ってくる
  1141. かもしれない.
  1142. うーん,これもマニアックなネタになってしまった.
  1143. (次回作の OMAKE.jpn に続く)
  1144. ■■ ソースコードを公開することについて
  1145. Windows のフリーソフトとかで思うことなのだが,ソースが添付されてないものが
  1146. 多い.というか,添付されてないのが普通である.これがぼくには不思議で
  1147. たまらない.なぜソースコードを添付しないのだろうか,と,ついつい理由を聞きたく
  1148. なってしまう.
  1149. もしもそれが,「どうせソースコードを添付したって,だれも見ないだろう」とか,
  1150. 「普通の人はコンパイラなんてもってないから,ソースを添付する意味は無い」
  1151. などという理由なのだとしたら,それは大きな間違いだ.
  1152. まず,ソースが添付されていた場合に,それを見るか見ないかという話であるが,
  1153. 実際のところ,見る人は少ないだろう.しかし,見る人は見る.見る人は必ずいる.
  1154. (次回作の OMAKE.jpn に続く)
  1155. ■■ FreeBSD について
  1156. ぼくのいままでのコンピュータ歴の中で一番大きかったことは,FreeBSD との出会い
  1157. だったと思う.FreeBSD のなにが素晴らしいかと言うと,一言で言うならばそれは,
  1158. 開発環境がある
  1159. ということだ.これは
  1160. 作ることができるOS
  1161. ということである.いろいろな意味で,である.
  1162. Cコンパイラは標準で(正確には GNU の成果物である)ついてくる.emacs や make,
  1163. gdb などの素晴らしい開発環境もついてくる.動作するアプリケーションは,
  1164. たいていソースコードフリー(自由,という意味のフリーである)のものである.
  1165. これはぼくのような,
  1166. まさに作ることがだいすきな人間
  1167. には,たまらない素材だ.「作る」ための材料や道具,資料がそこらじゅうに
  1168. いっぱいなのである.
  1169. いちばんうれしいのは,作るためのネタというか,「きっかけ」に満ちあふれて
  1170. いることだ.だから,目の前に FreeBSD マシンが1台あるだけで,まったく飽きない.
  1171. ネタはいくらでもあるので,1日中ずっと調べ,試して,作ることができる.
  1172. (ちょっといいすぎか?)
  1173. とはいっても,はじめからそこまでわかってて使いはじめたわけではない.
  1174. 使っているうちに,そういったことがだんだんとわかるようになり,それが自分に
  1175. マッチしていたためにさらに深く使うという好循環(悪循環?)で,どんどん深みに
  1176. はまっていったわけである.自分がモノ作りが好きだということをわからせてくれた
  1177. OS でもある.(それまでもいろいろと作っていたが,無意識で作っていたと思う)
  1178. FreeBSD が無かったら,今こんなにコードを書いてはいないだろう.カーネルや
  1179. デバイスドライバに興味を持つことも無かったかもしれない.しかし,FreeBSD なら
  1180. いくらでも自分で作ることができるわけだから,モノ作り大好き人間にとって,
  1181. こんなに興味をそそり,刺激を受ける素材はない.
  1182. 実際のところ,FreeBSD はいい OS であり,いい開発環境である.そして僕自身にも
  1183. 合っている.今後もずっと使い続けていくだろう.
  1184. しかし最近,ぼくの中ではその対抗馬が出てきている.それは NetBSD だ.
  1185. FreeBSD と比べて NetBSD は何が違うのかというと,ぼくにとっては,
  1186. おもしろいOSである
  1187. ということである.それは NetBSD のソースの sys/arch の下で ls をするとわかる.
  1188. NetBSD が移植されたマシンのディレクトリが延々と出てくるのだ.
  1189. NetBSD が面白いと思いはじめたきっかけは,カーネルを見たりいじったりするように
  1190. なってからだ.パームコンピュータやモバイルなどを見たとき,FreeBSD は
  1191. (移植すれば別であるが,今のところはまだ)動かないだろうと思う.しかし,
  1192. NetBSD は動くことが多い.たとえ動かなくても,誰かが移植するかもしれない.
  1193. たとえ誰も移植しなくとも,自分ももっと勉強して力をつければ,将来は自分で移植
  1194. できるかもしれないという夢がある.携帯電話やカーナビだってそうだ.
  1195. だから,ぼくにとって NetBSD は「夢のあるOS」だ.
  1196. そういう意味で,Linux も夢がある.ぼくが Linux をあまり使わない(カーネルの
  1197. ソースを読むことはあるが)のは,単にはじめに FreeBSD から入って,その流れで
  1198. NetBSD を読んでいるからだが,あまり使ってないのはちょっと残念な気もする.
  1199. NetBSD にも弱点はある.NetBSD の場合だと,使う人 = 作る人 という意味あいが
  1200. 強いので,ユーザ環境は FreeBSD や Linux ほどには整備されていないように感じる.
  1201. そんなわけで,使うには FreeBSD,作るには NetBSD が自分にとっては最適だと
  1202. 思っている.
  1203. ぼくがはじめて FreeBSD と出会ったのは,大学4年で研究室に配属されたときだ.
  1204. 当時研究室には HP-UX のマシンが数台と,FreeBSD の入った AT 互換機が数台,
  1205. MS-DOS の入った PC-9801 が数台あった.以前は HP-UX のマシンをメインとして,
  1206. PC-9801 から telnet して計算を走らせるみたいな使いかたをしていたようだ.
  1207. ぼくがいた部屋には FreeBSD マシンは2台しかなく,HP-UX よりも高速で軽かった
  1208. ため人気があり,ぼく自身あまり使うことはなかった.そもそも大学4年のときは,
  1209. C言語の勉強に注力していたため,UNIX というものをあまりしらなかった.login
  1210. しても,
  1211. 自分のホームディレクトリ以外の部分は見たことが無かった
  1212. というくらいである.自宅に PC-9801 があり,当時はそちらをメインで使っていた
  1213. ために,UNIX も C 言語を書くためのプラットホームとしてしか使っていなかった
  1214. のだ.
  1215. そんなわけで UNIX についてほとんど知らないまま修士1年となった4月のこと,
  1216. 当時の研究室のシステム管理者だった N さんに言われた.
  1217. 坂井君,スーパーユーザーをやってくれない?
  1218. UNIX をまったく使えない人間としては「スーパーユーザー」なんていう,
  1219. いかにも特権階級のような
  1220. 言葉の響きは魅力的であり,なにも考えずに引き受けた.そして初めての仕事が,
  1221. とりあえずこのマシン好きにしていいから,
  1222. FreeBSD を入れてみてくれない?
  1223. である.UNIX のことは login の仕方しか知らず,AT 互換機のことはほとんど知らず,
  1224. ネットワークのことは ftp と telnet と rlogin の使いかたしか知らない,という
  1225. 状態のぼくに,http://www.jp.freebsd.org のアドレスだけ教えて,
  1226. インストールからネットワークの設定まで
  1227. いきなりすべてやらせようというのであるから,今思うと,
  1228. なんて無茶な方法だ
  1229. と思ってしまう.
  1230. こうして初めての FreeBSD との取っ組み合いが始まったわけである.
  1231. 2002/1
  1232. (次回作の OMAKE.jpn に続く)
  1233. ■■ カーネルについて
  1234. カーネルのソースを読むことは楽しい.最近は PowerPC のアセンブラが(少しだけ)
  1235. わかるようになってきたので,さらに楽しくなった.
  1236. カーネルの勉強をしてみたいんだけど,
  1237. なにから手をつければ良いかわからない
  1238. という人は多いと思う.実際,ぼく自身もそういう時期があった.ここで,ぼくなりの
  1239. カーネルの読みかたを,無謀にも書いてみようと思う.とはいってもぼく自身,
  1240. それほどよく読んでいるというわけでもないし,まだまだ入門者の域を出ていない.
  1241. しかもぼくの場合,読むのはブートローダー,ブートストラップ(それも一番はじめの
  1242. ほう)とデバイスドライバが主(ていうかそれ以外はあまり読んだことが無い)で
  1243. あるので,偏った話になると思う.参考までに読んでもらえればと思う.
  1244. カーネルにしてもブートローダーにしても,まず,どこからはじまるのかを
  1245. 知りたい人は多いだろう.カーネルやブートローダーの場合には,main() 関数から
  1246. 始まるというわけではない.だから,
  1247. grep main *
  1248. とかしても無駄である.多くのばあい,アセンブラのコードのどこかに
  1249. startup: のようなラベルがあり,そこから始まるようになっているのである.
  1250. これは NetBSD だと sys/arch/[アーキ名]/[アーキ名]/locore.s にあるのだが,
  1251. これを探すにはどうするか.それは,Makefile を読むのだ.
  1252. Makefile を読むと,リンカを使ってカーネルモジュールの最終リンクを行ない,
  1253. 最終的なカーネルオブジェクトを作成する部分が必ずあるはずだ.このとき,
  1254. ELF などのオブジェクト形式で作成するためには,スタート地点の指定が必要なので,
  1255. スタート地点を指定している部分が必ず存在する.リンカは多くの場合 GNU の ld を
  1256. 使用しているであろうから,Makefile 中で,ld を使用している部分を探す.
  1257. これはふつうのまっとうな Makefile なら,LD ?= ld というように変数に置き換えて,
  1258. $(LD) のようにして使用しているはずである.そのような場所を探す.
  1259. (ひょっとしたら gcc からリンカを呼び出すことで,ld を直接使ってない場合が
  1260. あるかもしれないので注意である)
  1261. で,ld を使用している部分を見つけたら,以下のオプションに注意する.
  1262. -e [entry] スタート位置のラベルの指定
  1263. -Ttext [address] テキストセグメントのアドレスを指定
  1264. -c [commandfile] LD script ファイルを指定
  1265. -T [commandfile] -c と同じ
  1266. -e でスタート位置を指定していたら,そのラベルの位置がテキストセグメントの
  1267. 先頭にくるということなので,まさにそのラベルの位置から実行が始まる.
  1268. あとは grep でラベルを探すだけである.
  1269. -c や -T で LD script ファイルを指定している場合には,その LD script ファイルの
  1270. 中で,セグメントの分割方法を細かに指定しているはずである.その中で
  1271. テキストセグメントの先頭に配置されているラベル名を調べる.そこが,スタート地点
  1272. である.
  1273. 実際には -e オプションは使われず,LD script によってセグメントが分割されて
  1274. いることが多い.スタート位置のラベル名がわかったら,あとはおもむろに
  1275. grep で探すだけだ.たいていは *start*.s のような名前のアセンブラファイルの
  1276. 中にある.NetBSD だと locore.s だが,Linux だと start なんちゃらとかいう
  1277. ファイルにあるようである(と思ったたしか).また,スタート位置はアーキテクチャ
  1278. 依存なので,アーキテクチャごとにディレクトリがわかれているような場合には,
  1279. アーキテクチャ依存の部分に入っているはずである.
  1280. ブート部分を読む場合には,アセンブラの知識は必須である.C の知識だけでも
  1281. 読めなくはないが,何をやっているのか,プロセッサはどう動いているのかを
  1282. 知りたければ,アセンブラを読むしかない.しかし,アセンブラはアセンブラの
  1283. 文法だけ知っていれば読めるというわけではない.プロセッサに対する知識が絶対に
  1284. 必要だ.なぜなら,とくにブートストラップやデバイスドライバでは,CPU の
  1285. レジスタの設定などを行なうため,
  1286. レジスタの意味がわからなければどうしようもない
  1287. からである.
  1288. アセンブラに関する資料は,C言語に関する資料に比べれば,残念ながら最近はあまり
  1289. 多くないように思う.これは,
  1290. 本屋に通って必死に探す
  1291. 雑誌記事をひたすら探す
  1292. Web 検索でひたすら探す
  1293. などして勉強することになる.アセンブラは略語だらけなので,実際のソースだけ
  1294. 見て勉強するのは辛いと思う.ここで,ひとついい方法がある.クロスコンパイル
  1295. 環境を作成して,クロスコンパイラで -S オプションでサンプルプログラムを
  1296. コンパイルしてみるのだ.このようにすると as を呼び出す直前で中止して,
  1297. アセンブラ出力を出してくれる.これを眺めるのだ.Cでやりたいことをアセンブラで
  1298. 書くとどうなるのか教えてくれるので,実際のところこれはけっこう参考になる.
  1299. と,まあ,ここまでいろいろ書いてしまって,まるでここに書いたことが
  1300. 全部できないとカーネルは読めないみたいになってしまったが,ただ思いつくままに,
  1301. そういえば,あんなこともやったなあ
  1302. というレベルで書いただけなので,あまり気にしないでほしい.一番重要なことは,
  1303. 本人のやる気だ.アセンブラの勉強も含め,カーネルの勉強は短期間でできるものでは
  1304. なく,長期的な展望が必要だとおもう.だから,
  1305. 来年の今ごろには,読めるようになっているといいなあ
  1306. というくらいの余裕を持って,あまり負担をかけずにちまちまとやっていくことが
  1307. 大事であると思う.
  1308. 2002/2
  1309. (次回作の OMAKE.jpn に続く)
  1310. このファイルはここまで.