irohiroki's blog 2

Web apps and Geekies

Minecraft(CraftBukkit)プラグイン作り方動画

Minecraftプラグインを書いて動かすまでで紹介した手順のうち、分かりにくいところをgifアニメにしました。

1-2.のCraftBukkit起動

Windows 7で、run.batという起動用バッチファイルを作るところ。

run.bat作成

run.batでCraftBukkitを起動するところ。途中でセキュリティに関する確認があります。

CraftBukkit起動

1-3.のCraftBukkit接続

CraftBukkitは本物のMinecraftよりバージョンが低いので、Minecraftクライアントのバージョンを合わせる必要があります。その手順。

Minecraftのバージョン変更

サーバを追加して接続するところ。

CraftBukkitサーバに接続

2.のJDKのセットアップ

最大の難関、WindowsでJavaのbinをPATHに追加する手順。

JavaのbinフォルダをPATH環境変数に追加

3.のプラグイン作成

ソースコードを入れるsrcフォルダを作るところ。デスクトップにserver¥ChickenLauncher¥srcという階層で作ります。

srcフォルダを作る

なお、Windowsでは下のスクリプトをserver¥ChickenLauncher¥build.batとして作っておくと捗りそうです。

set NAME=ChickenLauncher
set SERVER_DIR=%USERPROFILE%\Desktop\server

mkdir bin
mkdir dist
javac src\*.java -d bin -classpath %SERVER_DIR%\craftbukkit.jar -sourcepath src
jar -cf dist\%NAME%.jar *.yml -C bin .
copy dist\%NAME%.jar %SERVER_DIR%\plugins
pause

Minecraftプラグインを書いて動かすまで

世界中で大人気のMinecraftにはCraftBukkitというクローンがあります。CraftBukkitはオープンソースで、プラグイン向けのAPIも用意されているので、MinecraftそのものをクラックするいわゆるMODより安心して拡張できます。このエントリではCraftBukkitをセットアップし、自分で書いたプラグインをインストールして動かす流れを紹介します。

なお、PC版のMinecraftが動作していることを前提としています。

1. CraftBukkit

Minecraftのシステムはサーバとクライアントに分かれていますが、CraftBukkitはサーバのクローンです。まずはプラグインなしでそのまま動かしてみましょう。手順はSetting up a server – BukkitWikiに書かれています。手順といっても、ダウンロードして実行するだけです。

1-1. ダウンロード

一般的なオープンソースのソフトウェアと同様に安定版と開発版がありますが、安定版はCraftBukkit | Bukkitからダウンロードできます。バージョン番号はMinecraftのものと対応します。つまり、1.6.2のCraftBukkitを使うときは、Minecraft(クライアント)も1.6.2で起動しなければなりません(後述)。

1-2. 起動

ダウンロードしたらSetting up a server – BukkitWikiに書かれてるjavaコマンドで起動しましょう。ここではダウンロードしたファイルを~/Desktop/server/craftbukkit.jarに改名したと仮定します。

java -Xmx1024M -jar ~/Desktop/server/craftbukkit.jar -o true

数十行のメッセージの後にコマンドプロンプトが表示されて入力待ちになります。これでMinecraftクライアントから接続できるはずです。

1-3. 接続

MinecraftはProfileを編集することで起動するバージョンを選択できますが、CraftBukkitと同じバージョンを選ぶのを忘れないでください。MinecraftLauncherの画面で「Edit Profile」ボタンを押して、「Use version」ドロップダウンリストの中から選べます。

Minecraftが起動したら「マルチプレイ」を選択し、「サーバー追加」を押します。「サーバーアドレス」にlocalhostと書いて「完了」を押せば、サーバ一覧にCraftBukkitサーバが現れるはずです。それを選択して「サーバーに接続」しましょう。

本物のMinecraftと同じようにゲームを始められれば大丈夫です。切断し、CraftBukkitのコマンドプロンプトでstopを実行して終了してください。

2. JDK

プラグインをコンパイルするためにJava SE Development Kitが必要です。Java SE – Downloadsからダウンロード、インストールしてください。以下のようにjavacが実行できれば大丈夫です(実行結果は違うかもしれません)。

$ javac -version
javac 1.6.0_65

3. プラグインのコンパイルとインストール

いよいよプラグインをインストールします。ここでは私が実験的に作ったChickenLauncherを使って説明します。

3-1. ダウンロード

zipファイルをダウンロードできます。GitHubをご存知の方は、もちろん好きな方法でダウンロードして構いません。

3-2. コンパイル

コンパイル方法はREADMEに書いてある通りです。つまり、下のようなjavacコマンドを実行します:

javac src/*.java -d bin -classpath ~/Desktop/server/craftbukkit.jar -sourcepath src

bin/chickenlauncher/ChickenLauncher.classが生成されるはずです。プラグインとしてはこれをjarファイルにする必要があります。コマンドは下の通りです。

jar -cf dist/ChickenLauncher.jar *.yml -C bin .

dist/ChickenLauncher.jarが生成されます。

3-3. インストール

CraftBukkitにはプラグイン用のディレクトリがあり、そこにjarファイルを入れれば完了です。プラグイン用のディレクトリはCraftBukkitを起動したときにcraftbukkit.jarと同じディレクトリにpluginsという名前で生成されているはずです。前出の例だと、次のようになります。

cp dist/ChickenLauncher.jar ~/Desktop/server/plugins

これで完了です。最初と同じようにCraftBukkitを起動し、羊毛を手に持って空中を左クリックしてみてください。羊毛からニワトリが飛び出すはずです。

なお、ゲームをクリエイティブモードにするには、CraftBukkitのコンソールで下のコマンドを実行します。

gamemode creative ユーザ名

クライアントを改造したい?

以上のように、CraftBukkitを使うとMODに比べて安心してMinecraftを拡張できるのですが、変えられるのはサーバ側だけになります。つまり、新しいキーバインディングを設定したりアイテムの見た目を変更したりはできません。

でも落胆しないでください。CraftBukkitと対になるクライアント側のソフトとして、SpoutCraftがあります。これはクライアントを拡張するMODですが、特徴的なのは拡張モジュールをサーバ側のCraftBukkitからロードすることです。つまり、サーバにプラグインを置くと、自動的にクライアントに配信・インストールされるのです。これでクライアント側を改造できるだけでなく、仲間内でサーバを立てて遊ぶときにとても便利になるでしょう。今後、SpoutCraftについても検証して紹介したいと思います。

『パターン・ランゲージ』刊行記念トークイベントで聞いた「部分と全体」

1月23日に代官山の蔦屋で開催された『パターン・ランゲージ』刊行記念トークイベントに行ってきた。地元のTSUTAYAとは全く違うおしゃれな書店の一角にスクリーンとソファーベンチが並べられ、著者の井庭崇先生と中埜博さんを囲むようにしてお話を聞いた。

僕は小さな会社でソフトウェア開発をしていて、キャリア的に開発チームをリードする立場にある。今までと同じように同じようなものを作る事業がいつまでも続くはずはなく、常に今までより良いやり方はないかと、延々と模索している。

そんな中でお二人の話を聞いたところ、重要な単語、表現、アイデアなどが衝撃となって立て続けに自分を襲い、内容を咀嚼するどころか、ただ呆然と打たれることしかできなかった。マンガでよくある「ガーン!」という表現は、本当にあるんだと実感した。だからまだお二人の話は全然消化できておらず、よってこのエントリもかなり粗いものになりそう。言い訳。

そういうわけで本当にまだよく分かっていないのだが、確か最初に「創造的なコミュニティを作るのは難しい」という話から始まった。一人ひとりの個性を活かしながら、全員が協調して一つのものを創りあげるようなコミュニティはどうしたらできるのか。個性と協調という、一見相反するような要件をどうやって満たすのか。そこには目指すヴィジョンについて語り合うための言語が必要である。つまり、共通の語彙や価値観である。パターン・ランゲージはそういう場面で利用できる「創造の言語」だということだった。

言語といっても日本語のような自然言語ではなく、パターン、つまりよく見られる状況と解決策の集合である。一つのパターンは名前、コンテキスト、問題、解決方法などから成っている。ではなぜその集合をパターン・ランゲージと呼ぶかというと、パターン一つひとつが単語であったり、文法であったりするからだ。単語を組み合わせて文章を作り、文章を繋げて一つの物語を作るように、パターンを組み合わせることで新しいヴィジョンを作ることができる。

井庭先生がそんなパターン・ランゲージの基礎を説明してくださった後、中埜さんが「部分と全体」の話を始めて、それは本当に印象深かった。「部分と全体」は理解するのも説明するのも難しく、パターン・ランゲージの生みの親であるクリストファー・アレグザンダーも自署の中でこの話に多くのページを割いている。

我々が作りたいものや実現したいことは、多くの要素を含んでいる。例えば「売上◯億」という単純な数字でさえ、それを実現するとき、その実現を支えるものの数は一つではない。分かりやすく「要素」と言ったが、要素は「部分」とは限らない。「部分」は、ある視点で「全体」を分けたもの、と言えるかもしれない。例えば輪郭という視点で見ると、輪郭の内側と外側が別の部分になり得る。視点は様々ある。よって一つの「全体」には様々な「部分」が含まれており、それらが重なりあうところも多い。

しかし、一つ重要なのは、その「部分」が無ければ「全体」はなく、「全体」がなければ「部分」もないということである(たぶん)。わかりやすくするため、あえて卑近な例を出してみる。好きな料理を思い浮かべてみて欲しい。何でできているだろうか。その材料の一つが、似たような別のもので置き換えられたら、元のものと同じようにあなたを楽しませ、満足させることができるだろうか?別に粗悪なもので置き換える必要はない。同じような価値のものでも、合う、合わないという傾向があるはずだ。おそらくその材料は、別の料理ではきっと欠かすことのできない重要な部分なのだ。つまり、材料が換わることで全体がその質を失うだけでなく、料理次第で材料もその価値が変わることになる。これは「部分」が無ければ「全体」がなく、「全体」がなければ「部分」もない例ではないだろうか?

自然界にあるものは、「部分と全体」を自ら知っているものが多いらしい。例えば、生物は一つの卵細胞が分裂しながら様々な細胞に変化し、「全体」である個体を生み出す。その一瞬一瞬において、全体は「全体」であり、部分は「部分」であり続ける。足の方の細胞が脳みそになることはない。木の種も同じ。種から大きな葉っぱを一枚出して終わり、ということはない。成長の過程に合わせて適切な根と芽を伸ばす。その原則は再生においてさえ維持される。皮膚を失えば皮膚が補われ、根を切れば新しい根が伸びる。

この世の全てのものは「部分」であり、「全体」でありうる。街もコミュニティも人も、全体であると同時に、何らかの部分でありうる。自分の生活が「全体」だとすると、その「部分」にはどんなものがあるだろうか。コミュニティのヴィジョンがあったとき、それはどんな「部分」から成るだろう。自分の仕事は、何らかの「部分」になっているだろうか。個人でもコミュニティでも、「全体」を作ろうとするとき、何が「部分」で何が「部分」でないか、考え、表現する方法があれば捗るはずだ。

パターン・ランゲージによって、ヴィジョンを「部分」にブレイクダウンすることができる。価値のある概念ややり方に名前をつけ、コミュニケーションの中で使うことができる。パターン・ランゲージは固有名詞ではなく普通名詞であり(アレグザンダーの著書のタイトルは「A Pattern Language」である)、分野や案件毎にパターン・ランゲージがあってよい。それどころか、一つの対象に対して複数のパターン・ランゲージがあってもよい。ヴィジョンを実現しようとするコミュニティは、そのためのパターン・ランゲージを作り、パターンを編み上げることで創造を実現できるのである。

その他、パターン・ランゲージはボトムアップであるとか、小説を書くのとパターン・ランゲージを作るのは似ているとか、南紀白浜のまちづくりだとか、興味深い話ばかりだった。参加する前に本は全部読んだが、書かれていないこと、文字だけでは分からないことが殆どだった。文字というメディアの限界なのだろうか。直接話を聞くことは本当に重要だった。このトークイベントで聞いたことは、この先自分の仕事やものの見方に影響を与えると思う。そういう転機をくれたことに、登壇者のお二人には感謝したい。ありがとうございました。

追記: スクリーンに映しだされてた資料が公開されました。

中埜博さんと井庭崇先生のサイン

おれとさぶらいむてきすとの複数選択

このエントリはおれのさぶらいむてきすと Advent Calendar 2013の13日目です。昨日は@jugyo さんのおれのさぶらいむてきすとのスニペット作成 – SnippetMaker プラグインでした。

今日は置換の話の続きとして、複数選択のやり方について書いてみます。

^⌘G

このショートカットはFindメニューの中にある Quick Find All というもので、カーソルが乗ってる単語をファイル内で全て見つけて選択します。WindowsとLinuxの人は⌘の代わりにWindowsキーです。実際の動作は前回アニメGIFで紹介してますので、よかったら参考にしてください。

Quick Find Allは単純に単語を選択するときは最強ですが、単語と記号が混じってる範囲を選択するとか、ファイル全体ではなく一部から選択するといった時には向いていません。

⇧⌘L

これはSelectionメニューの中にある Split into Lines というショーカットで、複数行を1つの範囲として選択しているとき、それを行毎に別の選択範囲にしてくれます。例えば

複数行単一選択

Split into lines

にしれくれます。どういう時に使うかというと、僕はとりあえず選択範囲の全ての行にカーソルが欲しいときに使ってます。その後に選択範囲を直したり、カーソルを移動したり、実際に変化を見ながら操作してます。

⌘D / ⌘K, ⌘D / ⌘U

⌘DはSelectionメニューの Expand Selection to Word ですが、何か選択してる時としてない時では動作が違います。何か選択してる時は、その選択範囲と同じ文字列を探して2つ目の選択範囲にします。何も選択してないときは、カーソルの乗ってる単語を選択します。

よって、英数字だろうが日本語だろうが記号が混ざってようが、何か複数選択したいときはとりあえず1つ目を手作業で選択し、あとは ⌘Dで増やしていける ことになります。

⌘K, ⌘Dは、⌘Kの後に⌘Dを押すという意味で、⌘Dで増やした選択を解除して、次の一致する文字列を選択します。つまり 1つ飛ばして次を選択できる ということです。

⌘Dは、複数選択に限らず、カーソルや選択範囲の状態を 1つ前に戻す(Undo) ショーカットです。

これらを組み合わせるとかなり自由に選択範囲を増やしていけます。例を見てみましょう。

super + d

  1. 最初の「”」を選択
  2. 次の「”」は飛ばす
  3. 3個目の「”」を選択
  4. 4個目の「”」はUndo

という操作で最終的に2個の選択範囲を作っています。この選択方法では一つ一つ選択するか否か選べますが、その半面時間がかかりますね。

まとめ

Sublime Textの特長である複数選択を作り出す方法はいくつもあります。状況に合わせて使い分けられれば効率的でしょう。

最後にお願いです。 正規表現でファイル全体から選択する方法 を知ってる人は教えてください!!!

コーディングにおける「深いレベルの『創造』」について

12月8日、渋谷で開催されたAgile Samurai Boot Campにサポーターとして参加した。本編の中でも参加者の質問などを通じて学ぶことがあったのだが、今回はその話ではないので割愛する。ただ、そのような経験をできたのは主催の西村直人さん/永和システムマネジメントや会場提供のサイバーエージェント様、スポンサーのCodeIQ様、それから参加者とスタッフの皆さんのおかげなので、この場を借りて感謝致します。ありがとうございます。

さて、事件(私にとってはちょっとした事件だった)は打ち上げ会場の土佐料理店「祢保希(ねぼけ)」で起こった。私の斜向かいには@t_wadaがいらっしゃって、宴会の終盤まではイベントの内容をふりかえったり言語処理系やライブラリの話を聞かせてもらったりしていた。話が途切れたときに思い出したことがあったので、聞いてみた。

最近僕はパターン・ランゲージに強い興味を持っていて、その道の権威である井庭崇先生をウォッチしているのだが、井庭先生が先週公開した資料つくること = 生きること : パターン・ランゲージによる創造の支援には特に惹きつけられた。そこには映画監督や作家、作曲家たちが創作活動の中で体験する、ある共通した感覚について語られていた。詳しくは直接資料を参照して欲しいが、まとめとして以下の3つが挙げられていた。

  • 「自分が“決めて”つくっているのではない」という感覚
  • 「収まるべきところに収まるように」という意識
  • 「つくることは探求すること、変わること」という考え方

偉大な創作活動をしている著名人たちが口をそろえて、自分が作っているのではない、作品が作品になろうとするのに従って、そのあるべき姿を探求しているのだという体験を表明していた。

この資料を見て、これはコーディングにも当てはまると感じ、その確証を得るための資料や証言を探していた。そこで和田さんにも思い当たることがないか聞いてみたのだ。

するとその答えは驚くべきものだった。

「私が今日言いたくて上手く言えなかったのは、これです」

和田さんは質疑応答の中で、設計とTDDの関係について答えようとしていた(この辺は僕の解釈で書いているので多少の誤解・語弊があるかもしれません)。設計がないとTDDのサイクルは回せないのではないかという命題に対する回答である。そこで参加者に伝えたかったが、伝えきれたか自信が持てない内容が、当の資料に書かれているということだった。

これは願ってもない回答だった。僕はコーディングをするものとして“深いレベル”に到達したい。また、コーディングをする誰もが“深いレベル”に到達するためのサポートをしたい。そのためには、“深いレベル”が何なのかを把握しなければならない。和田さんの回答によって、求めるもののヒントが得られた。具体性には欠けるが、目指す方向は間違ってないと確信できた。

また、類似した記述のある図書としてケント・ベックのSmalltalkベストプラクティス・パターンを挙げていただいた。実は僕は同日イベント会場で@kakutaniにも同じ質問をしており、そのときの回答もこれだったので、間違いないのだと思う。これは未読なので(問題のピアソンだが)入手して目を通すつもりだ。

そういうわけで、Agile Samurai Boot Campのサポーターというだけで、和田さんと角谷さんをとっ捕まえて貴重なヒントを頂くことができた。しかも、かなり確度の高い証言を得られたように思う。顔見知りというだけでこのような話をしていただけるのは感謝に尽きない。ありがとうございます。

このコーディングにおける「深いレベルの『創造』」の話は、興味を持ってくれる人との対話や資料を通して、もう少し探求していけたらと思う。

おれとさぶらいむてきすとの置換

このエントリはおれのさぶらいむてきすと Advent Calendar 2013の9日目です。昨日は@jugyoさんのおれのさぶらいむてきすとのカラースキーマでした。

今日はSublime Textにおける置換について考えてみます。

普通の置換

ご存知の通り、置換というのはドキュメントの中の特定の文字列を全て一度に新しい文字列で置き換える編集操作です。これができないテキストエディタというのは聞いたことがなくて、もちろんSublime Textでも opt + cmd + f で置換フォームが表示されます。

replace form

さらにSublime Textでは、検索する文字列を正規表現で書いたり、大文字と小文字を区別するか選べたりします。ですが、Sublime Textの真価はそこではありません。

複数カーソル

Sublime Textと言えばこれです。カーソルが分身して、それぞれの場所で同一の編集をしてくれる機能です。つまり、2箇所に書かれてる「regist」にそれぞれカーソルを置いて、「register」に書き換えたりできるわけです。

一度これを人に説明したら、「それ置換でいいよね?」と言われました。確かに簡単な例だと置換でいいんですが、もっと複雑なこともあります。

惚れさせ517 「君たち」 若いね 若いね 若いねー

置換より複数カーソルが優れているのは 編集の過程を見ながら入力できる ところです。例えば、

1
2
foo(a + b);
foo(c + d);

1
2
bar(a, b);
bar(c, d);

に直すとしたら、どうしますか?置換したいところと残したいところが混ざってて、考えるのが面倒な例です。

2行ぐらいだったら素朴に1つずつ手作業で編集する人が多いかもしれません。でも、20行だったらどうですか?200行だったら?

Vimなら :%s/foo.\(.\)...\(.\)/bar(\1, \2/ と打てば実現できますが、これを打つのも考えるのも面倒です。たぶん1度ぐらい間違えてやり直すのではないでしょうか。Emacsは使い込んだことがないので分かりません。

Sublime Textならこんな感じ。

multiple selection demo

最初に ctrl + cmd + g という、カーソル下の単語を全て選択するショーカットを使っています。その後は「bar」に書き換えてカーソル移動して「 +」を「,」に直してるだけですね。

このようにSublime Textでは複数のカーソルを使うことでインタラクティブに置換操作をできます。2回に分けて置換したり、正規表現を考えたりする必要がないわけです。便利ですね!!!

複数の選択範囲を作る方法は ctrl + cmd + g 以外にもあるので、また別の日に紹介したいと思います。明日は@s12btさんです。よろしくお願いします!

おれのさぶらいむてきすとのRuby小技

このエントリはおれのさぶらいむてきすと Advent Calendar 2013の5日目です。昨日は@s12btさんのおれのさぶらいむてきすとは日本語検索がうまくできないでした。

今日はいろがRubyで使える小技を紹介します。

ご存知の通り、Rubyではブロックを以下の2つの形で書くことができます。

do end
1
2
3
foo do
  bar
end
ブレース
1
2
3
foo {
  bar
}

ブレースの中が1行の時は、下のように書くことも多いと思います。

1
foo { bar }

仕様上はdo endの方が{}より評価の優先順位が低いだけですが、読んだ時の印象が違うため、使い分けてるRubyistも多いはずです。

そして、最初はdo endで書いたけどやっぱり{}にしたいとか、{}で書いたけどdo endにしたいことって意外とあるんですよね。

でも、実際にやるとちょっと面倒です。doまで行って{に直して、endまで行って}に直して。{}にしてみたら1行にしたくなって、改行も消したり。それなのに、後でやっぱりdo endがよかった、なんてことになると本当に最悪です。

そこでおすすめしたいのが、Ruby Block Converterというプラグイン。Package Controlでインストールしたら、変換したいdoendの間にカーソルを移動しましょう。

1
2
3
foo do
  bar # このへんにカーソルを。
end

そして ctrl + shift + [ すると!!!

1
foo { bar }

こうなります!! すごい!!! 一瞬!!!!

もちろん逆もできます。それどころか、ブロック引数があってもできます。例えば

1
array.each{|e| some_method(e) }

だったら、{}の間にカーソルを移動して ctrl + shift + ] !!!

1
2
3
array.each do |e|
  some_method(e)
end

おおー!! 便利!!! インデントもちゃんと自分の設定に合わせてくれるんですね!!!

なお、do endから{}にしたとき1行になるのは、元が3行のときだけです。つまり、

1
2
3
4
foo do
  bar
  baz
end

のように4行以上のときは

1
2
3
4
foo {
  bar
  baz
}

になります。なんて頭がいいんでしょう……

もちろんSublime Textですから、カーソルが複数あっても大丈夫です!! 全てのカーソルの場所でブロックを変換してくれます!!!

Rubyを使う人は是非Ruby Block Converterをインストールして、この気持ちよさを味わってくださいね!!!

明日は@kei_qさんです。よろしくお願いします!