読者です 読者をやめる 読者になる 読者になる

Minecraftとタートルと僕

PCゲームMinecraftのMOD「ComputerCraft」の情報を集めたニッチなブログです。

ニトリのコードを見てニヨニヨする会(そして最後にニヨニヨできなくなった話)

雑記 情報リンク集

改題のお知らせ(2015.06.24 8:00)

内容と題名を合わせる為に、題名に()内の追記を入れました。 最後まで読んでいただければ幸いです。

このお話は、プログラマあるあるを探す(ニヨニヨする)ためにHTMLソースコードを読み始めた筆者が、 発見し、調べていくうちに、その背景にある事情を慮り、だんだん笑えなくなってくる流れをご紹介しています。

はじめに

ニトリのECサイトであるニトリネットがリニューアルに失敗して6日も経ってから復旧したということで、 (一部の)プログラマクラスタで話題になっています。

僕の率直な感想は次のようなもの。

閉鎖状態の「ニトリネット」が6/23にサイト運営を再開、不具合の主因はCPU不足 | ネットショップ担当者フォーラム

ともあれ関係者の皆さまお疲れ様でした。個人の責任問題などと短絡化することなく、粛々と原因解明と、できればぜひ知見の共有公開をお願いしたい。

2015/06/23 13:40

プレスリリースでは、原因としてCPU不足を挙げています。

珍しい原因ですよね。あまり聞いたこと無いのでぜひその知見を知りたいものです。

しかし次のようなつぶやきが

こんなツイートをみたら興味がわくじゃないですか! 

サイトトップページの(HTML)ソースコードを読んでみました。

プログラマあるある探しをする

流し読みなので適当なこともつぶやいていますが、当初はこんな感じ。

コメント行にニヨニヨ

authentication という単語は長すぎるのでこんなコメントはあるあるネタですよね。

/*NINSHO*/

/*PANKUZU(¥取る)*/

ネーミングセンスにニヨニヨ

ふと、気になる箇所が目に付く

  • なぜか数百行の空改行が何箇所もある。全部削れば1000行くらい圧縮できそう
  • 謎の空<li>が大量に(下図参照)

f:id:hevohevo:20150624003043p:plain:w400

コードを少し読み込んでみると、どうやらトップページにあるプルダウンメニュー(下図参照)のコードらしい。

本来は、このメニュー項目のサブ項目が設定してあったようです。

たとえば、下の図のプルダウンメニュー「ベッド」にマウスポインタを合わせると、その下位カテゴリのメニューが右にポップアップしてという動きでしょうか。たぶん。

でも、なぜかその項目文字列だけ削除されており、タグだけが残ったままです。

f:id:hevohevo:20150624003246p:plain:w400

もしかして各項目のサブ項目の要件定義が間に合わずに空欄にしてあるのかなと思ったのですが、このプルダウンメニューをクリックして飛んだページにはそれらサブ項目らしきものが見つかるわけで。

もう一つ気になる箇所

つまり、HTMLのBODYのど真ん中にCSSインクルードしているのです。しかも、h1やpなどの基本的なタグのスタイルを全てリセットするreset.cssなるものを。

CSSはHEADにというのが原則だと思っていたので不思議に思い、尋ねてみました。

たまたま上記ツイートを読んでくださった方から、次のようなコメントがいただけました。

また、次のようなコメントも。

そのようなやり方があるのですね。大規模サイトを構築したことがないので勉強になります。

最後はしみじみ

おそらく、コードを突貫工事で全面的に書き直したために、空白行などが含まれる荒さの目立つコードが出てきてしまったのだろうなと予想しています。

しばらくしたら、綺麗に整理されてこのような荒い部分はなくなるだろうなとも。

中の人、本当にお疲れ様です。

最初はニヨニヨと言いつつ、最後は自分に当てはめて落ち込みたくなりました。

ニヨニヨなんてできないよ・・・。

補足1

補足2(2015.06.24 1:50)

改めて読み直してみると、たしかにこの記事、茶化しすぎな気もしますね。

あまりに不快に思われる方が多いようでしたら削除しましょうか。

この件について、感想などコメントをください。

補足3(2015.06.25 01:15)

一時は記事そのものを削除することも考えましたが、 ふざけて書いた補足1の文章を削り、本文中の明らかに茶化すような表現を修正することで記事自体は残すことにします。

タイトルにある「ニヨニヨ」という言葉も大変不評なので削るべきかとは思いますが、すでにこれだけの方が読んでいる記事でタイトルを大幅に改編することは混乱を招くと思い、軽率な私自身への自戒の意味も込めて現在のままにしておきます。

書いたコードを他人に見てもらおう(マサカリのすすめ)

ComputerCraft Minecraft プログラミング教育

はじめに

全国で5000人くらい*1はいると思われるComputerCraftユーザーの皆様こんにちは。

今日はまず、こちらの動画を紹介します(ニコ動です)。

職業プログラマーならばさほど問題ないのですが、僕を含む趣味プログラマは、日々、独自の作法でCCプログラミングをしています。

しかし、そのコードが他人からみて見やすいのか、変な癖がついていないか、そしてよりよいコードにするために何を心がければ良いか。

一人孤独にCCプログラミングしていると不安になりますよね。

「誰かに見てもらえないかなー。チラッチラッ。でも恥ずかしいしなぁ・・・。悩ましい悩ましい」

そこで、この動画です!

なんと、マサカリを投げてくれるCCプログラムのコードレビューをしていただけるとのこと。

すばらしい! この機会を逃す手はありませんよね。

動画でコードレビューの説明を聞き、コードレビューを受けるときの心構えを理解したら、mesさんにTwitterなどでお願いしてみましょう。

コードレビューをお願いする方法

説明されているコード提供方法は2つ。

  1. Gistに自分のコードを貼って、Twitterでmesさんにコードレビュー依頼する。
  2. GitHubにアカウントを持っていてGitを使い慣れているならば、プルリクエストでコード提供。

見やすさと言う点では2.ですし動画ページのコメント欄でも推奨されていますが、Gitわからんという人は1.でも良いのではないかと。なお、Gistというのは、Gitサイトがpastebinを真似したサービスと説明するとおおよそのイメージがつかめるのではないでしょうか。

どちらかの方法でコードを提供する準備ができたら、Twitterでmesさん(twitter: @mes_mc)にお願いしましょう。

マサカリ投げていただきました

僕もコードレビューをお願いしました。

お願いしたコードは以下のとおり。(長いですしあまり良いコードではありませんが><)

そしてプルリク経由でコードレビューお願いして、いただいたコメントは以下のとおり。

たくさんレビューコメントをいただいたのですが、簡単にまとめると、以下の4つが中心になります。

  1. 誤解をまねく関数名がある
  2. loadAPI()を使ったほうがよい
  3. 改行を入れてもっと見やすく
  4. 植林部分のコードについて改善案

1.の関数名については、つい手を抜きがちなところなので、今後も気をつけたいところです。

2.のloadAPIは、できるだけファイル1つだけのプログラムにしようと手持ちのAPIから関数を無理やりコピペしたのですが、そのコピペという手抜きバレバレだったようです。申し訳ないw

3.の改行について。これは僕の悪い癖です。おそらく今回のレビューで一番気をつけないといけない部分。

空行を入れないというのは、ブログにコードを掲載することを前提とした悪癖なんですよね。レビューをお願いしたコードは210行程度ですが、改行入れて見やすくすることを考えるとおそらく250行近く行くはずです。

250行のコードをブログに掲載しても大丈夫かな? ドン引きしません? むしろ見やすくするために空行入れたほうがいい? このあたりぜひ皆さんのご意見を聞きたいところ。

とはいえ、コードレビューしていただくなら、ブログ掲載用にコードを密集させたものではなくより見やすく改行をいれたコードを送るべきでした。このあたり、一般的な常識と外れていたんだなと反省しきり。

4.の植林部分のコードついては、松の巨木の生長パターンと関連していろいろ試行錯誤した結果なのですが、改善案をいただいて、より工夫ができそうなことに気づきました。

これらコメントにより自分の癖を自覚でき、また色々な発見もあり大変有意義な機会でした。

つまり、mesさんの投げたマサカリが僕の頭に綺麗に刺さって、いろいろと目が覚めたわけですね*2

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

僕ももっと勉強して、成長して、色々な方と互いにマサカリを投げ合えるくらいにまでなりたいものです。

もう一つ重要なコメント

上記の4つのコメント以外にも、重要なコメントがありました。

[IMO] Turtleの仕様上の問題などもありますが、関数名の方向だけが違うものが結構多いので、メタプログラミングとかで重複部分をまとめてあげたいですね。 実際にやろうとするとかなり面倒ではありますが...

これね・・・。本当にそう思います。新しい関数を定義するときに、正面/上/下と必ず三方向の関数を作らないといけないのは面倒ですよね。なんとかうまい方法ないものか。

やるとしたらTurtleAPI自体を拡張しないといけないでしょうね・・・。今後の課題です。

おわりに

まとめ。

  • 自分ひとりでCCプログラミングしている人はぜひ他人に見てもらいましょう。
  • 他人に見せることを意識したコードを書くというのはとても良い経験になります。
  • 実際に見ていただくことで、自分だけの視点では気づかない発見があるかも。
  • 自分の悪癖にも気づくかも。無くて七癖と言いますよねw
  • 今なら、mesさんがレビューしてくれるそうですよ!ぜひお願いしてみよう。
  • mesさん素敵。抱いて!

*1:てきとー

*2:変な性癖に目覚めたわけではありませんw

クリエイティブモードを強烈にクリエイティブにするComputerCraft1.7 がリリースされました

ComputerCraft Minecraft CC1.7

はじめに

2月16日にComputerCraft1.7がリリースされました。

さあ、ダウンロードしてインストールしましょう。

なお、Minecraft1.7.10用ですのでご注意を!

ComputerCraft | Programmable Computers for Minecraft f:id:hevohevo:20150221201311j:plain:w400

なにが新しいの?

念のためWhat's Newを適当和訳しておきますね。「」内は僕のコメントです。

  • コマンドコンピュータ(Command Computer)を追加
    • 「使えるのはクリエイティブモードだけです」
  • 新しいAPIを追加: commands
    • 「コマンドコンピュータだけが使えるAPIです」
  • 新しいプログラムを追加: commands, exec
    • 「commandsプログラムは、使えるコマンド一覧を表示します」
    • 「execプログラムは、引数でコマンドを与えたら実行します」
      • 「例)コンソール画面で> exec time set 700
  • textutils.seriaizeJSON( Table )関数を追加
    • 「JSON!JSON! テーブル→JSON形式に変換の模様。コマンドでJSON使うよね」
    • 「マイクラのオプションとして認識されるには、シリアライズ化したJSON文字列から「"」を削らないといけないかもしれません。string.gsub(json_str, "\"", "")のように」(こちらについては現在試行錯誤中)
  • ILuaContext.executeMainThreadTask() 周辺機器開発者向けに追加
    • 「CCの周辺機器を開発しているmodder向け」
  • 金床でディスクドライブとプリンターの名前変更をできるように
  • HD texture packsの問題を解決
    • 「高解像度のテクスチャで不具合起こしていたのかな?」
  • いろんなバグを修正
  • ゲーム内ヘルプシステムに全ての新しい機能をドキュメント化した
    • 「コンソール画面でhelpコマンドを使ってみよう」

Command Computer !!

1.6系統から1.7系統へとメジャーバージョンアップしたわけですが、その目玉は、クリエイティブモードのときだけ作成できるCommand Computerです。

クリエイティブモードでは、(チート的に便利な)様々なコマンドを使うことができますが、Command ComputerはそのコマンドをLuaプログラムを使って実行できます。

どんなことができるのかは、この動画を見たほうが早いかも。雰囲気はつかめるはずです。

Command Computer: Command Blocks ComputerCraft Style - YouTube

動画中で紹介されたSummon(サモン、召喚)プログラムは面白いですね。

モニターを右クリックしたら、コマンドを使って鉄柵を四方に設置し、ゾンビを召還しています。

もう一度右クリックしたら、柵だけ消し去っているようですね。ギャー!ゾンビーキター!

Commands API

Command Computerでは、用意されたcommands APIを使って、各種コマンドを実行することができます。

たとえば、以下のようなバニラのコマンドに対応するのは、

/time set 700

以下のような関数です。

-- Lua Program
commands.time("set", 700)

commands APIにtime()関数が用意されているので、引数"set"700を与えて実行しているわけですね。

え? 引数が文字列か数字かをいちいち区別するのが面倒だって?  これまで培ってきた、溜め込んできた「コマンド群」資産をできるだけそのまま利用したいだって?

もう仕方ないなぁのび太くんは。

次のように手抜きしてプログラム書いてもいいのよ?

-- Lua Program
commands.exec("time set 700")

commands.exec()関数は与えた引数文字列をそのままコマンドとして解釈してくれるみたいですね。すばらしい。これだけあれば他の関数いらないんじゃないかな。引数はstring.format()で連結すればいいし。

こんなプログラム組んでみた

想像が広がりんぐ

これまで、マインクラフトのコマンドはシンプルすぎてそれを組み合わせるのに非常に苦労していました。

コマンドブロックを使うにしても、覚えさせておくことができるコマンドは1ブロックあたり1つだけなので、複雑な作業をさせるために、複数のコマンドブロックを用意し複雑なレッドストーン回路を組んでロジックを組み立てていました。

今回のCommand Computerの実装によって、1台のCommand Computerと1つのLuaプログラムだけでそれらが代替できるようになります。

便利すぎて味気ない? ええ、その気持ちは良くわかります。でもクリエイティブモード限定ですし! 住み分け、住み分けw

このように、今回のバージョンアップはメジャー番号を上げるにふさわしい意義深いバージョンアップだったと思います。

クリエイティブモードをより創造的にできるCC1.7を、僕は歓迎します!