また,これはある程度予想できたことだが,やはり本作は“操縦型”に軸足を置いている印象だ。それはチュートリアルにも現れており,シナリオモードではまず“操縦型”,つまりプレイヤーがリアルタイムでOKEを操作するタイプの解説が行われる。

また,これはある程度予想できたことだが,やはり本作は“操縦型”に軸足を置いている印象だ。それはチュートリアルにも現れており,シナリオモードではまず“操縦型”,つまりプレイヤーがリアルタイムでOKEを操作するタイプの解説が行われる。

とりあえず昨日・今日と遊んだざっくりとした感想。ちなみに俺は初代とZEUSの途中までしかやってないので操作性の進化など「前作からあったよ」という点にもイチイチびっくりしたことは言っておきたい。

まず、チュートリアルが凄まじい。殆ど新しいプログラミング環境を覚えるのと同じ量の学習が必要なこのシリーズはまともにチュートリアルを作るとハンパない量になってしまう。(初代の投げっぱなし振りを見よ)

ところが、ストーリーに「家庭教師にロボットのプログラムを習う」というのが含まれてるのでストーリーを進めながら異常な程親切なチュートリアルが進む。これは見習いたい。ソーシャルアプリはかなり遊びながら覚えられるような作りになっているが、流石にここまで徹底的に超長いチュートリアルを飽きさせず作っている本作にはかなわない。

初代から裏技など、何らかの形でユーザーが直接ロボットを操作する方法が提供されていたが、今作は実にカルネージハートらしい方法でユーザー操作を取り入れている。

プログラミング的に言えば、「キーイベントが取れるようになった」と言えばわかりやすいと思う。(アナログパッドのX軸Y軸の値も取れるなどかなり本格的)

「十字キー右を押すと右に移動する」

という動作を実現するには、

  1. キー入力を受け付けるポイントを設定する。
  2. キーの状態(平たく言えばkeydown, keyup, keypressなど)によってif条件が設定できる。
  3. 上記条件を満たした場合だけ右に移動するチップを置く。

もちろん、上下左右、左右旋回、武装選択、攻撃などが予めよくあるキーに割り振られたプログラムもプリセットで存在する。しかしそれも単に自分でも作れる物の模範解答でしかなく、それを元に細かくカスタマイズをすることができる。

チュートリアルで関心したのが、まず上記のような"操縦型"のプログラミングを習い、プログラミングに慣れ、課題で敵を倒す爽快感を味合わせた上で、「じゃあ今度は今やったのを全自動で処理するロボットを作ってみましょう」という流れになるところだ。

例えば、敵と自機の間に障害物がある場合、操縦型なら単に目視して回りこめばいいだけだが、自律型の場合は"敵の追跡"と"障害物の回避"という部分を完全自動化する必要がある。

しかも面白いのが、基本的にロボットは3対3で戦うのだが、プレイヤーは一人しかいないのだからもちろん操縦型は1機しか操縦することができない。残りの2機は必ず自律型をプログラミングする必要があるというところだ。

操縦型もカルネージハートは可能な操作があまりに多いので(武装が5種類、オプションが3種類、移動方法も通常移動、旋回、緊急移動にジャンプ。更に機体ごとの特殊動作が2種類などある)人間の操作で全てをコントロールするのはウメハラじゃないと無理がある。そこで「◯ボタンを押したら、前方90度の範囲で一番近い的に武装1を4発発射する」などマクロの様に操作を補う形でプログラムすることができる。まだやったことは無いが、後ろ方向の50m以内に格闘体制に入っている敵がいたら全ての処理を中段して自動的に前にジャンプするなどといったプログラムも可能だろう。

また、初代ではやはりある程度後半で手に入る機体や武装の方が強いという感じだったのが最新作では機体だけでも37種類もあるのに、それぞれが一長一短(オールラウンダーもそれ固有の弱点がある)で、スペックだけでは分からない使い勝手などもあり、面白い。

まだプログラマーになってもいなかった初代発売時(1995年)と比べると確かに、「無制限の環境でプログラミングしたい」と思わないでもないが、制限があるからこその固有の面白さがある。

PSPがあれば簡単にダウンロード購入できるのでプログラマーの人もそうでない人も是非やってみて欲しいと思う。

Publickeyにスポンサー広告の依頼があったそうです。別に僕は知り合いでも何でもないんですが、好きなサイトだったので何か嬉しい・・・と思ったら、

感謝! Publickeyに初めてスポンサー広告が入りました - Publickey

しかし今年の夏、7月にはサイバーエージェント様から、イベントの集客のためにと広告の依頼があり、そのときに初めて2週間のバナー広告とタイアップ記事広告を掲載させていただきました。

サイバーエージェントのStartups2010が初めてのバナー広告だったのか。これはびっくり。何故ならPublickeyにStartups2010の広告が載ったのは一部、僕のせいであるかもしれないからです。

Publickeyがオススメ

今年の7月中旬頃、スペイシーズ@ebiharahideyukiさんが、

@ebiharahideyuki「来月頭のイベント、かなり大きい会場借りちゃったのに申し込みまだ全然少ないですよ。ヤバイっすよ。」

@ebiharahideyuki「広告とか出したいんですが、エンジニアの人達って普段どういうサイトを見てるんですか?」

僕と@dandasoはそれぞれ「Publickey」「Agile Cat」をオススメしておきました。

僕「Agile Catって何?」

@dandaso「Hadoopとかのブログでよく見てます。」

Agile Cat — Azure & Hadoop — Talking Book

僕「(手元で検索して)、へーって、ちょwww、この猫wwww、これがAgile Cat?www 適当に自分ちの猫とってGIMPで切り抜いたんじゃないの?www」

(これをきっかけに購読するようになりました。3ヶ月前までは存在も知らなかったなんて今では考えられません・・・)

@ebiharahideyuki「へー、こういうサイトがあるんですねー」

という単なる軽い雑談だったんですが、数日後には両方のサイト共に広告のってるし、Publickeyにはタイアップ記事まで上がっててびっくりしました。はやっ。

一応、僕も自分なりの支援エントリーを書いてみたんですが、そんな必要もなくイベント当日は盛況だったみたいです。

ITベンチャー起業支援 - komagata [p0t]

Publickeyをオススメした理由ときっかけ

丁度その時期、Publickeyってすげーいいサイトがある!って自分の中でブームだったんです。今ははてブ常連ですが、その時は「マイナーだけど密かにスゲー良いサイトじゃね?」「Publickeyの良さが分かるのはわしだけで十分じゃ」などと思っていたのです。(振り返ってみれば結構みんな知ってたわけですが・・・)

きっかけは確かPerl5と6の開発におけるコミュニティの内部事情のエントリだったと思います。

Perl 5は生き返った! 新たな前進を再開したPerl - Publickey

ビジネスな視点と開発者の視点のバランスが丁度良く(開発者に寄り過ぎぐらいが丁度良い)、"TechCrunchとInfoQの中間ぐらいの塩梅のメディア"が欲しいと思ってた自分にハマりました。

@ebiharahideyukiさんが集客したいイベント、Starups2010の対象は"起業志向のあるエンジニア"とのことだったのでPublickeyなんてぴったりじゃね?って思った次第です。

Java 4-everのエントリも面白かったなあ。

マイクロソフトに厳格な一家を襲う悲劇。Javaよ永遠なれ - Publickey

少年は青年となり、禁じられた技術をこっそり友人と試すようになる。「こいつはスゲー、ロバストで、セキュアで、ポータブルで、スケーラブルじゃんか!」

糞ギーク達を喜ばせることは無駄じゃない

要するに何が言いたいのかというと、「僕の様な仕事でも趣味でもコードばっかり書いてる様な糞プログラマーが喜ぶサイトを作ることも、こういう経路でお金を持った企業とつながることがある」ということです。

そういった背景にはソーシャルアプリのヒットなどによりエンジニアの需要(社会的価値)が上がっている(のか?)ことも関係してると思います。

Publickeyのような(僕にとって)良質な記事を書くサイトがちゃんと運営してるくらい儲かるような状況になっていくのは喜ばしいことです。実際にちゃんと集客できたという実績もあることだし、どんどんそういった広告が入るといいですね!

典型的な一日のスケジュール

  • 8:30 - 起床。
  • 9:00 - 渋谷区スポーツセンターのジム。(火・木だけ)
  • 11:00 - 出社。
  • 13:00 - 昼飯。
  • 14:00 - 仕事のコードを書く。
  • 19:00 - 退社。
  • 19:30 - 夕食。
  • 20:00 - 趣味のコードを書く。
  • 24:00 - 就寝。

要はコードを書いてるんですが、一応、就業時間内は仕事のコード、それ以外は趣味のコードと必ず分けるようにしています。

仕事ではLispパーカーのサイトやHelp me, hackers!等を書き、趣味ではLokkaを書いています。帰ってから毎日4時間はLokkaを書いているんですが、なかなか進みません。自分で書きつつ、他のRubyプログラマーの方に興味を持ってもらえるようにしないといけないなと思っています。

ネットのお陰で暇の潰し方などいくらでもある昨今、他人の興味やコミットメントは貴重な資源だとつくづく感じています。(ニコ動見てたら楽しく一日を終わらせることなど容易)

そんな中、ruby1.9.2対応などで沢山コミットしていただいた@tyabeさんがLokkaのコミッタになってくれました。(要はgithubリポジトリのcollaboratorsに追加)

あざーす!

Lokkaのプラグインの機能を修正しました。

komagata's lokka at master - GitHub

修正点

  • プラグインのフォルダ名規則を変更(foo -> lokka-foo)
  • プラグインフォルダを移動(/plugin -> /public/plugin)

フォルダ名はそもそもlokka/foo.rbだったのでオートロードの命名に従えばlokka-fooのハズ、というのと、プラグインをgemにするときのためです。(sinatra-logger, rack-flashみたいに。)

プラグイン命名規則は要は下記。

Dir["public/plugin/lokka-*/lib/lokka/*.rb"]

フォルダ移動はプラグイン内にcssや画像を置けるようにです。WordPress的に。

RbConfig Plugin - Lokka

これはrbconfigというプラグインを試しに作ってみて、問題が出たところを修正した感じです。rbconfigプラグインは単にrubyインタプリタの情報を表示するrbconfigを出すだけのプラグインです。

# lokka-rbconfig/lib/lokka/rbconfig.rb
require 'rbconfig'

module Lokka
module Rbconfig
def self.registered(app)
app.get '/admin/plugins/rbconfig' do
haml :"plugin/lokka-rbconfig/views/index", :layout => :"admin/layout"
end
end
end
end
# lokka-rbconfig/views/index.haml
- content_for :head_last do
%link{:rel => 'stylesheet', :href => '/plugin/lokka-rbconfig/views/style.css', :type => 'text/css'}
%h2 RbConfig
%dl.rbconfigs
- Config::CONFIG.each do |key, value|
%dt= key
%dd= value

中身はこんな感じです。

問題点

作ってみてプラグイン機能の課題がいくつかできました。

  • テンプレートの指定が冗長
  • 管理画面や他のテーマのlayoutを利用する場合はテンプレート言語が同じである必要がある。(管理画面の場合はhaml限定になる)
  • プラグインがページを持ってない場合もあるのでプラグイン一覧からリンクを貼っていいのか悪いのか、どこに貼ればいいのかわからない。(lokka本体にプラグインのページを知らせる方法が無い)

もしインストールしてみた方で自分用に修正した箇所とかあれば是非、気軽にpatchやpull requestしていただけるとありがたいです!

ローカルのMacでは動いてるんだけど、Debian lenny(5.0.6)だと、

$ wget http://beta.quicklisp.org/quicklisp.lisp
$ sbcl --load quicklisp.lisp
* (quicklisp-quickstart:install)
* (ql:add-to-init-file)

した後に再度立ち上げると下記のエラーが。

$ sbcl
This is SBCL 1.0.18.debian, an implementation of ANSI Common Lisp.
More information about SBCL is available at .

SBCL is free software, provided as is, with absolutely no warranty.
It is mostly in the public domain; some portions are provided under
BSD-style licenses. See the CREDITS and COPYING files in the
distribution for more information.
WARNING:
Error while scanning system definitions under directory #P"/usr/lib/sbcl/":
unknown &KEY argument: :RESOLVE-SYMLINKS
WARNING:
Error while scanning system definitions under directory #P"/usr/share/common-lisp/source/":
unknown &KEY argument: :RESOLVE-SYMLINKS

debugger invoked on a SIMPLE-ERROR in thread #<THREAD "initial thread" RUNNING {a8345c9}>:
Error during processing of initialization file /home/deployer/.sbclrc:

The name "SB-BSD-SOCKETS" does not designate any package.

Type HELP for debugger help, or (SB-EXT:QUIT) to exit from SBCL.

restarts (invokable by number or by possibly-abbreviated name):
0: [TRY-RECOMPILING] Recompile impl and try loading it again
1: [RETRY ] Retry loading component ("quicklisp" "impl").
2: [ACCEPT ] Continue, treating
loading component ("quicklisp" "impl") as having been
successful.
3: [CONTINUE ] Ignore and continue processing.
4: [ABORT ] Skip this initialization file.
5: Skip to toplevel READ/EVAL/PRINT loop.
6: [QUIT ] Quit SBCL (calling #'QUIT, killing the process).

((FLET #:LAMBDA69) #<SB-KERNEL:SIMPLE=PACKAGE-ERROR {b30ee31}>)
0]

20080618211322.gif

ざんねん!!
わたしの ぼうけんは これで おわってしまった!!

(SBCLを最新版にしたら動きました!Thank! Zach Beane and ルシフェルw)

An interview with Paul Graham : The Setup

And what software?

I use surprisingly little client software. All I really use on my Mac is Firefox and Terminal. I use the usual Unix utilities (vi for editing). I use Arc for programming, which in turn runs on top of MzScheme.

Paul Grahamもvi使ってるってことでShibuya.lisp Hackathon #1でArcの@mgikenさんもvimを使ってることに納得。VimShellを使ってるとお聞きしたので僕もSBCLでやってみた。

% vi
Error detected while processing /Users/komagata/code/dotfile/vim/.vim/plugin/vimshell.vim:
line 48:
g:VimShell_EnableInteractive option does not work this version of vimshell.

普通にvimshellをgithubから落としてきてインストール。(※最近のバージョンではg:VimShell_EnableInteractive optionが使えないのがちょっとしたハマりポイント)

" vimshell
nmap :scl :VimShellInteractive sbcl<cr>
nmap :sirb :VimShellInteractive irb<cr>
vmap <silent> ,s :VimShellSendString

.vimrcにこんな感じでsbclとirbをVimShellInteractiveで起動するキーマップを設定して、コードの選択範囲をVimShellに送る設定をしてみた。

SBCLの場合

VImShell + SBCL

irbの場合

VimShell + irb

ホント単にREPLに文字送るだけなんだけどとても便利。vimユーザーにとってはコレぐらいシンプルなのが使い易いかも。後はカレントバッファの内容を全部REPLに送りたいんだけど普通のvim設定の書き方が分からない・・・。

会社でさくらのVPS借りたら既に時代はCentOS 5.5。ヒャッハー。

$ cat /etc/redhat-release 
CentOS release 5.5 (Final)

さくらのVPSでは既にDebianがコンパネから選べるようになってるけど典型的なLokkaインストール先として手順作りたかったのでCentOS。というか会社のサーバーとして使う場合、大した事しないので「もうどっちでもええわ!」という感じになってきてヤバイ。自分がデスクトップで使う場合は絶対Debianじゃないと嫌だけど。

git

$ wget http://dag.wieers.com/packages/rpmforge-release/rpmforge-release-0.3.6-1.el5.rf.i386.rpm
$ wget http://dag.wieers.com/packages/RPM-GPG-KEY.dag.txt
$ sudo rpm -ivh rpmforge-release-0.3.6-1.el5.rf.i386.rpm

rpmforgeをリポジトリに追加して入れる。

$ sudo vim /etc/yum.repos.d/rpmforge.repo
#enabled = 1
enabled = 0

rpmforgeはあんまり信用ならない感じがするのでデフォルトオフにする。

$ sudo yum -y --enablerepo=rpmforge install git

ruby

$ sudo yum install curl-devel openssl-devel zlib-devel readline-devel ncurses-devel

zlib-develはrubyをソースからいれた時にrubygemsに必要。curl-devel, openssl-develはpassengerに必要。readline-devel, ncurses-develはirbに必要。

$ cd /tmp/ruby-1.8.7-p302/ext/openssl
$ ruby extconf.rb
$ make
$ sudo make install

passengerインストール前にopenssl-develを入れた上でrubyソースの中のopenssl拡張を入れる必要あり。

$ cd /tmp/ruby-1.8.7-p302/ext/readline
$ ruby extconf.rb
$ make
$ sudo make install

irbはreadline拡張を入れる必要あり。

運営に携わった方々は大変だったとおもいます。お疲れ様です。ありがとうございました!

自分の内容的には予想以上に僕がヘボくて進まなかった感じ。

やりたい事は単に"hunchentootで1ページ作りたい(CSSとか画像も)"ってだけ。

今回はasdfではなく、quicklispを使ってみました。hunchentootのコードで古いページを参考にしてたので該当の関数が無かったりしてモタモタ。結局は@g000001さんに@quekさんのこのエントリーをコピペして動かしてもらった感じ。

LispパーカーのページはLispで動いてなきゃイカンだろうということで勉強始めてるんですが、setqとsetfの違いもよく分かってないような状態。とにかくgithubに公開しつつやっていきたいと思います。

komagata's alien-fjord-jp at master - GitHub

改善したいところ

  • PATH的なものが設定されてれば(ql:quickload "hunchentoot")じゃなくて普通に(require "hunchentoot")できるのではないか。そのやり方が知りたい。
  • 元はexecutableなイメージを作るためのコードなのでエントリポイントとなるmain関数は要らないハズ。
  • *posix-argv*に再代入してるのは強引過ぎるので普通に指定したい。
  • "/"で"/index.html"にアクセスしたい。
  • *invoke-debugger-hook*は何だろう?エラーが発生してdebuggerが動いたらexit(1)するってことかな?
  • どうせ1ページだったら静的htmlを読み込まずにcl-whoで書きたい。

ツッコミいただけるとありがたいです。(+勉強になります)

@machidaさんのLispパーカー(ラフ)

パーカーdemo

素敵!僕的にはもうちょっとあの異常なエイリアン君のボディが見えたら楽しいかなと思いました。ギークTシャツはいっぱいあるけど、Lispパーカー集団でHackathonしたらヤバイ感じでオモロイと思いました。

元ネタは下記ですね。

トカゲのアイコンを使わないのはとても良いと思います。Lispは古くからのAlien Technologyってのがキャッチーで楽しいですね!

HaskellやLispやFORTHなどの素敵な言語はそれ自体が完結した綺麗な世界を構築しているので汚い外界(UNIXとか)といやいやストリームを絆いでる感じがします。(妄想)

なので、僕らが新しい言語で動かしてまずホッとするところのHello, Worldが入門に出てきません。REPLやEmacsでリスト操作とかそういうのばっかり。そんな僕がホッとするHello, Worldのやり方を教えてもらいました。

#!/usr/bin/env sbcl --script
(format t "Hello, World~%")
$ ./hello.lisp 
Hello, World

どうこれ。僕らの様なIT土方にとってはこういうのがホッとします・・・。

インストール

$ brew install gnupg

portはgpg2とかmysql5とか切ないコマンド名になるが、brewはならないので嬉しい。

$ gpg --gen-key
gpg (GnuPG) 1.4.10; Copyright (C) 2008 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
ご希望の鍵の種類を選択してください:
(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (署名のみ)
(4) RSA (署名のみ)
選択は?
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048)
要求された鍵長は2048ビット
鍵の有効期限を指定してください。
0 = 鍵は無期限
<n> = 鍵は n 日間で満了
<n>w = 鍵は n 週間で満了
<n>m = 鍵は n か月間で満了
<n>y = 鍵は n 年間で満了
鍵の有効期間は? (0)
Key does not expire at all
これで正しいですか? (y/N) y

あなたの鍵を同定するためにユーザーIDが必要です。
このソフトは本名、コメント、電子メール・アドレスから
次の書式でユーザーIDを構成します:
"Heinrich Heine (Der Dichter) "

本名: Masaki Komagata
電子メール・アドレス: komagata@gmail.com
コメント:
次のユーザーIDを選択しました:
“Masaki Komagata

名前(N)、コメント(C)、電子メール(E)の変更、またはOK(O)か終了(Q)? O

秘密鍵を保護するためにパスフレーズがいります。

今から長い乱数を生成します。キーボードを打つとか、マウスを動かす
とか、ディスクにアクセスするとかの他のことをすると、乱数生成子で
乱雑さの大きないい乱数を生成しやすくなるので、お勧めいたします。
+++++
.+++++
今から長い乱数を生成します。キーボードを打つとか、マウスを動かす
とか、ディスクにアクセスするとかの他のことをすると、乱数生成子で
乱雑さの大きないい乱数を生成しやすくなるので、お勧めいたします。
+++++
....+++++
gpg: /Users/komagata/.gnupg/trustdb.gpg: 信用データベースができました
gpg: 鍵C138E9C6を絶対的に信用するよう記録しました
公開鍵と秘密鍵を作成し、署名しました。

gpg: 信用データベースの検査
gpg: 最小の「ある程度の信用」3、最小の「全面的信用」1、PGP信用モデル
gpg: 深さ: 0 有効性: 1 署名: 0 信用: 0-, 0q, 0n, 0m, 0f, 1u
pub 2048R/C138E9C6 2010-10-24
指紋 = 7561 4664 1FE1 22EC A050 B4CF 9397 D6B9 C138 E9C6
uid Masaki Komagata
sub 2048R/7A1DDA53 2010-10-24

~/.gnupg以下に色々出来てる。