Minecraftとタートルと僕

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

こちらのページは更新が滞っており、情報が古くなりつつあります。新しいCC情報サイトをはじめましたので、もしよければご参照ください。今後ともよろしくお願い申し上げます。

「百億のマインクラフトと千億のタートル」(https://hevo2.hatenablog.com/)

「なぜ人を殺してはいけないのか」真摯に考えてみた

はじめに

先日、国立大学の学生が殺人容疑で逮捕されました。 高校時代のエピソードなども話題にのぼっており、その異様な内容に顔をしかめている人も多いと思います。

日常的に人を殺したいという精神状態を僕は理解できないのですが、 そもそも、なぜ人を殺してはいけないのでしょうか。

法律が罰している? ダメだからダメ? 倫理的でない? 性善説? 

誰もが考え込んでしまうであろうこの問いに、僕なりに真摯に答えてみようというのが今回の内容です。

長文ですがお付き合いください。

まず結論から

人を殺してはいけない理由は、 「人を殺した人は社会から迫害され、排除され、場合によっては命を失うから」からです。

もっと端的に言うと、 「人を殺した人は、社会に生きる上であらゆる意味での不利益を被るから」です。

これが人を殺してはいけない理由の中で、もっとも直接的で簡潔な理由です。

なぜ僕がこのような結論に至ったかをできるだけわかりやすく説明しましょう。

人間は社会的な動物

まず、人間は社会的な動物であるという「事実」があります。

人は自分以外の人とモノをやり取りすることで生活を豊かにしてきました。 ここで言うモノは、食べ物や生活必需品だけでなく情報かもしれません。あるいは、信愛のような感情的なモノかもしれません。

人は自分に足りないモノを他人とやり取りすることで生活していますが、このように人と人が互いに何かをやり取りする関係のことを「社会」と呼びます。

人間という動物は、地球上の他の動物と比べて格別強いわけでも丈夫なわけでもありませんが、このような「社会」を作ることで頭数を増やし、発展し、地球上でもっとも繁栄している動物となりました。

少し大きなお話になってしまいましたので、もっと身近な話に落とし込みましょう。

あなたが豊かな生活を送ることができるのは、あなた以外の人の力を借りているからです。

たとえばあなたの目の前にあるパソコンやスマホ。これらはあなた以外の人間の手によって設計され、作られ、運送されました。あなたはその商品をお金を払って入手したはずです。

もしも人を殺しても良い社会があるならば

仮に、「人を殺してもよい社会」を想定してみましょう。 目の前にいる人をいつ殺しても問題ないという、もしもの世界です。

この世界では、対面でモノを売るお店が成り立ちません。例えばコンビニでお弁当を買うときに、お客さんが突然命を狙ってくるようでは安心して店員として働くことはできませんよね。

逆にお弁当を買ったとしても、店員があなたを殺すために毒を仕込んでいるかもしれず、そのような危険な代物を食べるわけにはいきません。

このような疑心暗鬼に陥ってしまう相手と何らかのやり取りをすることができますか? 無理ですよね。万全の防御策をとった上で注意深くやれば大丈夫? 一回一回のやり取りにそんなコストをかけた社会なんてあっという間に破綻しますよ。

つまり、理由もなく突然他人の命を狙ったりしないし危害を加えたりもしないという人間どうしでなくては「社会」を作ることはできないわけです。

これは言い換えると、相互に最低限の信頼ができる相手でないと社会を作ることができないということでもあります。

社会的動物は、社会的でない動物と相いれることができません。だってそもそも前提となる信頼関係を共有できないのですから、危険すぎて一緒に生きていくことはできません。

ですから殺人者は、社会を構成する全ての人から憎悪され、社会そのものから隔離(刑務所)され排除(追放、死刑)されます。

身近な人を殺されて復讐心を持つことはあるでしょう。しかし、一度も会ったこともない今まで名前も知らなかった人が殺されて怒りを覚えるのはなぜ? それは自らと同じ社会に属する同胞を殺されたからでしょう。自らの社会を崩壊させるような因子を排除したくなるのは当然です。

その裏返しとして、自らが同胞を殺すことをできるだけ忌避しようとします。だって自分が社会に排除されたら生きていけないですから。

でも殺人はなくならない

とはいえニュースで見るように、平和な日本であっても殺人事件は発生します。

なぜ人を殺すのか。

その大部分は人を殺すことで利益があるからです。あるいは圧倒的に不利益な状態を覆すために殺人が必要だからです。少なくとも、意図的に殺人を犯した人は計画的に/瞬間的にそう思いこみ殺人を犯しています。

一般的な日本人は、殺人を忌避する感情と殺人による利益を両天秤にかけたときに、圧倒的に忌避する方に傾きます。それこそ比較にもなりません。

しかし絶対ではありません。たとえば衰弱して判断力が鈍っていたり、自分の命に危険にせまっているなど精神的・肉体的に追い詰められたときに、一瞬だけあるいは一定期間だけその天秤が逆方向に傾いてしまう可能性があります。

でも戦争でたくさん殺したら英雄だよ?

それに対する答えは簡単です。

殺した相手が自分の属する社会と異なる社会だからです。

異なる社会間の決定的な利害対立が戦争の原因となっているならば、相手の社会の構成員を殺すことで自分の社会に利をもたらすわけですから、自分の社会から称賛されるのは当然ですよね。

逆にもし、属する社会など気にせず敵味方区別なく人を殺したら、ただの無差別殺人者として、恐れられ嫌悪され、排除されるでしょう。

ただし気を付けなくてはならないのは、人によって「自分が属する社会」の認識が異なるという点です。

大昔の例で言うならば、十字軍の時代、キリスト教圏が自分の属する社会であり異教徒圏は違う社会であるという認識が残虐な行為に走らせる理由の一つでした。

しかし情報化社会となった現代では自分の属している社会が多様化しています。日本という社会、東アジアという社会、世界という社会、地球という社会。あなたはどこに属していますか? たとえ国が違っても、世界という同じ社会に属している相手を大量に殺すことをあなたは無条件で称賛できますか? 情報が少なく個々人が認識する社会が小さかった大昔の時代とは違うのです。

そのため現代において、万人にとっての「絶対的に異なる人間社会」が存在しない以上、誰もが称賛する人殺しの英雄はありえないのです。

遠い未来に人間と全く異なる生態を持つような宇宙人と遭遇し、全ての人間が異社会とみなすような社会と戦争したならばそのような英雄が生まれるかもしれませんね。

たとえばゴキブリを虐殺しても特に非難はされないのは、ゴキブリの社会を自分の属する社会とはみなさないためですし。

相手を自分と同じ社会の構成員だと認識すること

テレビで実際に起きている戦争の一場面、たとえば攻撃ヘリが対地ミサイルを発射してトーチカを吹き飛ばすシーンを見たとしましょう。

最初はまるでゲームの一シーンのようで現実感はなく、特に感情は動かないかもしれません。

しかし、映像のスローモーションで吹き飛ぶ手足の破片らしきものが写ったら? あるいはその犠牲となった兵士たちの日常のインタビューシーンが写ったら? 彼らもまた自分と同じ家族を持ち社会を構成している事実を認識することで、相手もまた自分と同じ人間という社会に属する仲間であると認識したときに、先ほどの映像を同じ心境で見ることができるでしょうか。

これは、あなたの属する社会が広がった(多様化した)ことを意味しているのではないでしょうか。

現代社会は昔に比べて倫理的になった? いえ、とんでもない。倫理なんてごまかしやめましょう。相手についての情報を手に入れることで、あなたの社会が広がっただけなのです。

逆に言うと、たとえ現代社会であっても認識している「社会」が異様に狭い人たちがいるならば・・・。そういうことです。

例外という名の言い訳

物語の例でしか知りませんが、自分の属する社会構成員だからこそ身近で愛している人だからこそ殺したいという、社会的な動物として完全に壊れてしまった(矛盾してしまった)人は本当に存在するのでしょうか。

Fate/stay night の言峰綺礼とか。あるいは、羊たちの沈黙のレクター博士とか。

まとめ

  • 人を殺してはいけない理由は「人を殺した人は社会に生きる上であらゆる意味での不利益を被るから」
    • 人間は社会的な動物だから、社会を壊す要因は異分子として排除しようとするのが当然
  • 意図的に殺人を犯してしまった人
    • 追い詰められて、殺人による利益と不利益の天秤のはかりが普段とは反対方向に振れてしまった人
  • 殺人のハードルが一気に下がる特殊ケース。
    • 自分の社会と異なる社会を壊す(殺す)行為。自称「正義」
  • 現代において最も恐れるべきは、「社会」が狭い人かもしれない。

なお、これが絶対だとは思いません。この記事を読んだすべての人によるすべての異論を認めます。

なぜプログラミングを学ぶことが必要なのか

はじめに

中学生たちに「なぜプログラミングが必要なのか」を教えてみた - WirelessWire News(ワイヤレスワイヤーニュース)

この記事を読んでの感想になります。

将来的に3Dプリンタが家庭内で普通に使われる時代には、きっとプログラミングの必要ないUIができているはずです。 テレビがリモコン一つで操作できるように、電子レンジが前面のパネルボタンだけで操作できるように、炊飯器がボタン一発でおいしいご飯を炊くように。逆にそうでないと、家電として家庭内に3Dプリンタが普及するわけがありません。

しかし、テレビのリモコンボタンの数が増え操作が複雑になる一方であることからわかるように、シンプルなUIで家電の機能の全てを引き出すというのは無理があります。

紹介記事中にある、

プログラミングをできるようになるということは、人類の叡智を利用できるようになるということ

は至言です。

プログラミングの必要ない便利なUIは、しょせん叡智の上澄みでしかなくて、より深い、最先端に近いところに触れるにはプログラミングができることが重要です。

言い方を変えると、プログラミングを学ぶことは、出来合いのモノをただ使うだけでなく、より深く使いこなすことに通じます。場合によっては、開発者の想定すら超えて新しいモノを作り出すことにつながるかもしれません。

つまり、プログラミングを学ぶことは、与えられたモノを使う側から、モノを作る側になれることが重要なのです。

全ての人間が「モノを作る側」になる必要性

ここまで考えたときに問題になるのが、全ての人間がクリエイターになる必要があるのかという問いです。

ここでは反感を買うことを恐れず、あえて断言しましょう。

必要があります。

そうでなければ、将来は悲観的なビジョンしか見えません。 クリエイターという言葉に抵抗があるならこう言い換えましょう。

創造性のある仕事ができない人は、これからの世の中ではきつくなる一方である。

最近、人工知能が話題になっているのはご存知でしょう。狭義の人工知能(人と同等の知)はまだ遠い未来ですが、広義の知(これまでできなかったような、かしこい便利な機能)はすでに様々な分野で実現し利用されつつあります。

クリエイティブでない、簡単な人工知能で代替できることしかできない人は、将来的にその位置を失うことになるでしょう。これは断言します。

とはいえ、このことはみんなうすうす気づいていますよね。

我が国が目指す教育目標に「創造性」という項目が昔からありますが、「モノづくり日本」という言葉に真っ向から反対する人なんていないでしょう?

知的不均等構造を持つデストピア

僕の大好きな、小島アジコ氏はこう言ってます*1

いまから20年後、有能な1%の人間がモノとシステムを作り、4%のコミュニケーション強者がその上前を撥ね、残りの95%がそのおこぼれで生活する時代がやってくる。

なんというデストピア。なんて狂った社会構造。でも、こんな将来が来ることを否定できない自分もいます(すでにそうなっているという説もある)。

でもこのデストピア、何が不満で何が不幸なのでしょう。

僕は知的不均等構造に注目します。

個人の意思と知についての尊厳、つまりはお釈迦様の手の上で踊る自分を許容できるかというプライドの問題です。

もちろん、これを何とも思わない人は少なからずいると思います。あるいは目をそむけ、あきらめている人も。逆に、すでに搾取する側いるので、ライバルを増やしエサが減るのを嫌がる人もいるかもしれませんね:P

プログラミング教育でモノとシステムを深く使いこなす人材を増やすことで、この偏りが少しでも均(なら)された社会を目指しましょう。

デストピアがリトルデストピアくらいになり、少しはましになるのではないでしょうか*2

基礎教養としてのプログラミング

プログラミング教育は、創造性教育の一環でもあります。創造的なプロダクトを生成する技術の習得といってもかまいません。

とはいえ、プログラム言語を駆使して一から完成品を作り出すまでの能力を育てることは難しいかもしれません*3。与えられたモノを使いこなし、ときには複数のモノを結び付けたり、たまに開発者の想定から飛び出すくらいが現実的な落としどころでしょう。

しかし、小さいころからプログラミングを駆使してモノを使いこなす人たちを増やすことで、将来的にモノを作り出す人たちが数多く生まれてくるはずです。

そのためには、子どものころからプログラミングに慣れ親しむ機会を増やしましょう。プログラミングでモノを使いこなすことを覚えさせましょう。 そしてできるならば、全ての子どもに、プログラミングで創造的なモノを生み出す喜びを体験させましょう。

プログラミングを駆使する「モノ使いこなし層」を厚くし、「モノづくり予備軍」を育てることが、これからの日本には必要となります。

つまり、プログラミングが基礎教養となる時代がすでにやってきているのです。

なお、創造性教育という点で、プログラミングだけを押す必要はないと思っています。教科「芸術」は履修時間数を増やすべきだし、他の一般教科においても「創造的なモノを生み出す」教養を意識すべきだと思います。

しかしこれらの教養の中でも、プログラミングはこれからの日本で生きる上で特に重要な基礎教養だと僕は確信しています。

*1:この言葉は半分ネタであり、釣りタイトルであることは理解しております。みなさんもご了承ください。我ながらネタにマジレスかっこわるいw

*2:つまり、このデストピアの到来自体は否定しない、できない。

*3:つまりここでは、義務教育期間において職業プログラマーを養成することを謳っているわけではない。

【公式】タートルにinspect関数【チート】

はじめに

ひさしぶりの更新です。

今回は、最新のComputerCraft1.65で追加されたタートル関数をご紹介します。

このバージョンのCCは、Minecraft1.7.10でしか動かないのでご注意ください。

新しく追加された強力な関数

記事タイトルが過激ですが、そのくらい新しく追加された関数が強力であるとご理解ください。

一言でいうと、「目の前のブロックの名前がわかる」関数、「インベントリ内のアイテムの名前がわかる」関数です。

CC初心者の方でしたら、「え、いままでそんな基本的な関数がなかったの?」と思うかもしれませんが、CCのプログラムをいくつか書いたことがある方、本Webサイトを普段から閲覧されている方であるならば、ある種の衝撃を受けることでしょう。

「今までの苦労っていったい・・・。この機能、強力すぎない?」と。

turtle.inspect() の紹介

気を取り直して、新しく追加された関数の使い方を紹介しましょう。

まずは、目の前にあるブロックの名前(とメタデータ)を調べるturtle.inspect()関数です。

下画像のように、タートルの目の前にブロックを設置しましょう。ここでは土ブロックを置いています。

f:id:hevohevo:20150125023414p:plain

次にタートルを右クリックしてターミナルを開き、luaと打ち込みエンターキーを押すことで、Luaインタラクティブモードに入ります。

そして表示されるプロンプト(促し)に、turtle.inspect()と打ち込みましょう。

f:id:hevohevo:20150125023639p:plain

エンターキーを押して、turtle.inspect()を実行すると以下のような表示になります。

f:id:hevohevo:20150125023644p:plain

つまり、目の前にブロックがあり、その名前がminecraft:dirtでありメタデータが0であることを示しています。

前回の記事で紹介したように、マインクラフトのブロックは、ユニーク(一意な)名前を持っています。

Modの設定ファイルに他Modのアイテム・ブロック名を追加する方法 - Minecraftとタートルと僕

バニラの(素の)マインクラフトのブロックは、minecraft:XXXX(XXXXはブロック名)という名前を持っていることが特徴ですね。

また、土ブロックはメタデータを使っていないので0と表示されていますが、たとえば羊毛ブロックなどはメタデータで色の違いを示しています。

これまでのCCでは、目の前にブロックがあるかないかくらいしか判別できなかったので、これは大きな進歩と言えるでしょう。

turtle.inspect()関数の仕様

turtle.inspect()関数の仕様は以下の通りです。

  • turtle.inspect()
    • 目の前にブロックがあるかどうか、そしてその名前など詳細を調べる。
    • 返値は2つ
      • 返値1: ブロックがあるならばtrue、なければfalse
      • 返値2: ブロックがあるならばその詳細情報をテーブルで返す。ないならば、エラー文字列「No block to inspect」を返す

ブロック詳細情報テーブルの例

{
    name = "minecraft:dirt",
    metadata = 0,
}

なお、類似関数として、turtle.inspectUp()turtle.inspectDown()もあります。これらは、タートルの真上や真下のブロックを調べる関数になります。

サンプルコード

turtle.inspect()関数を使ったサンプルコード

-- 5秒おきに目の前のブロックの情報を調べ、表示する。
while true do
  local status, value = turtle.inspect() -- 2つの返値をそれぞれの変数に代入

  if status then -- ブロックありを1番目の返値で判別
    -- valueがテーブルなのでその情報を表示
    print("name: ",value["name"])
    print("meta: ",value["metadata"])
  else -- ブロックなし
    print("error: ",value) -- エラー文字列表示
  end

  os.sleep(5) -- 5秒スリープ
end

実行結果(最初はブロックを置かず、しばらくしてから土ブロック設置)

f:id:hevohevo:20150125030545p:plain

おわりに

目の前にあるブロックの名前がわかるようになることで、これまで作ってきたプログラムが一気に古臭くなってしまいました。

たとえばこの関数を使うことで、以下のようなプログラムが組めるかもしれません。

  • 目の前のブロックが丸石ブロックならばインベントリに入れずにそのまま放棄
  • 物理的に採掘できないブロックに突き当たったので名前を調べたら岩盤(minecraft:bedrock)だったので、採掘を進める方向を変えた。
  • 目の前のブロックを調べたら水ブロック(minecraft:water)だったので、持っているバケツを使って汲み上げた。

夢が広がりますね!

次回は、もう一つの強力な関数turtle.getItemDetail(スロット番号)を紹介しましょう。

この関数もまた、今回紹介したinspect関数に負けないくらいチートな性能なんですよ!

お楽しみに。