群像シミュレーター開発記 その2 水分

充分に複雑な個体としての人間を考えていくのに、まずは基本的な生命維持の仕組みから取り掛かろう。

※書き忘れた便と出血について追加

水分の重要性

水分の摂取は人間にとって、他の栄養素より優先度が高い。 他の栄養素と違ってその貯蓄機構が貧弱であり、ラクダ等のように血液や細胞中への蓄えが利かない。 にも関わらず、人体は充分な水分の存在を前提としており、意外な程小さな不足が大きく機構を乱す。 通常時からたった5%の不足で、意識に強く影響する症状を示し、20%で死ぬ。

水分は体内で非常に多くの役割を担う。 消化吸収の主であり、細胞を支え、化学反応の場となり、熱を循環し、栄養素を運び、老廃物を溶かし込む。 充分な水分があることで、これら全てが円滑に動き、不足はすぐに異常を生む。

水分の供給

経口摂取と吸収

最も大きな供給は、もちろん経口摂取である。 飲み物と呼ばれる多くは水分を主としており、人間の摂食器官は飲むという行為に適している。 口、口腔、気道、食道などの構造により、一度に大量の水分を摂取することも可能で、この点は他の動物に勝る。

飲み物でなくとも、多くの食品には水分が含まれる。 野菜や果物は水分に富み、90%を超える水分量のものもある。 肉や魚であっても調理前には大抵60%を超えており、人によっては、飲むよりも食べることで多くの水分を摂取している。

但し食べる水分は食品中に隠れており、分解しなければ吸収できない。 一方飲む水分は、直接吸収可能であり、より素早い水分の供給が可能である。

飲むまたは食べて経口摂取した水分は、消化吸収用に分泌された多量の水分と一緒に、大半が小腸で吸収される。 小腸での吸収は浸透圧を用いた受動的なものであり、吸収される水分の濃度によって影響を受ける。 大腸では残渣が吸収されるが、多くはない。

小腸からの吸収にかかる時間は液体の濃度で変わってくるが、早ければ30分以内に始まる。 濃度が高ければ多くの時間がかかるが、薄すぎれば体液調整のための排尿につながる場合もある。

呼吸による水分の生産

呼吸によって得た酸素は、細胞での燃焼に使用される。 燃焼の酸化過程では水分が生じ、この水分は代謝水などと呼ばれている。

代謝水は1日で200ml前後あり、個々の細胞では微量だが、重要な水分供給源となっている。

水分の排出

人体にとって水分は、小さな不足の影響を受けるほど重要でありながら、生命の維持にその排出が不可欠である。

尿

人体という機構で発生する有害な物質の内、血液を介するものは、主に尿として排出される。 腎障害等で正常な尿への廃棄が行われない場合、排出されるべき物質は血液その他に残り尿毒症を起こす。

尿という形での有害物質の廃棄は生命の維持に欠かせず、多少の水分不足では、尿の量は大きく減らない。 発生する廃棄物を問題なく排出するには、1日に最低でも400mlの尿が必要となる。

便

小腸で水分の大半を吸収され、大腸で残りも吸収された飲食物の残渣は、大便として直腸に送られる。 それでも最終的に排出される大便に水分は残っており、平均すれば1日に100ml程度は排出されるようである。

なお、小腸・大腸での水分吸収になんらかの以上があると、大便は多くの水分を残したまま、下痢として排出される。 下痢の水分には消化吸収用に分泌されたものも含むため、経口摂取した直接の水分よりも多くの水分が失われる可能性がある。

ここでいう汗は、後述の不感蒸泄とは区別し、有感蒸泄を指す。

発汗は、体温の上昇及び精神性の刺激によって引き起こされる。 皮膚の汗腺を通じて、血液中から水分を抽出した液体が分泌される。 ただし多量の発汗時など、他の成分の除去が間に合わない場合、汗には塩化ナトリウムなどを含まれる。

体温上昇による発汗は、体温が低下するまで続くため、気温が高いなど外的要因によっては長時間続く。 気温だけでなく湿度が高ければ、汗の蒸発が抑えられ蒸発熱が減るため、体温の低下につながらず発汗が続く。 この発汗は全身の皮膚で起こる。

精神性の刺激による発汗は、主に興奮や緊張によって引き起こされ、手や足、脇などの部位に集中する。 刺激の原因が取り除かれれば速やかに発汗は停止するが、長時間刺激が続けば、発汗量もかなりの量になる。

発汗量は人体の置かれた状況や刺激にかなり左右されるが、多ければ数千mlを超えるため、必要な水分に大きな影響を与える。

不感蒸泄

呼気、また皮膚からの意識されない水分の排出。

これらは有感蒸泄と違って制御しにくく、生きている限り続く。 呼吸を穏やかにするなどの調整は不可能ではないが、蒸泄量の大きな低下は難しい。

呼気の水分は粘膜を保護する。 また呼吸器から侵入する微細な異物を防ぐ役割もある。

体表面の皮膚は不感蒸泄をもたらす発汗によって、常に湿っている。 これにより皮膚はしなやかさを保ち、鋭敏な感覚も維持される。

これら不感蒸泄によって、平均的には1日900mlの水分が失われる。

出血

血液は90%前後が水分であり、出血はそのまま水分の排出としても考えられる。 出血では血液そのものの減少が最大の問題だが、水分量の低下の一因として認識する必要がある。

女性の場合、経血としての出血もあるが、半量が血液で残りが内膜等の残渣と浸出液、としか分からない。 いずれにせよ経血の量や内容は個人差も大きいため、モデル化にはより調査が必要。

Google Cloud Platform 各サービスのロゴを非公式にファイル化

※「ロゴの再配布や加工は禁止されていたはず」との指摘があったので、一旦ファイルとその加工物を削除してます。※

Google Cloud Platform とロゴ

Googleは散らばっていた自社のクラウド各種サービスをまとめ直し、Google Cloud PlatformGCP)というブランドで再構成しています。

GCPには、AppEngineやComputeEngine、BigQueryなどが含まれていますが、従来それぞれのサービスが持っていたロゴは基本的に廃止となり、GCPでのロゴが新たに設定されました。

新しいロゴは、六角形のベースに、各サービスを表現したシンプルな図形が乗ったもので、プラットフォームとして構成してほしい意図を感じます。 ところがこのロゴのまともなファイルが配布されていないようなので、提案資料などで困っていました。 そこで非公式にロゴをトレースしてSVG及びPNGファイルとしました。幸いロゴはシンプルだったため短時間で終わりました。

SVGは、Inkscapeで再編集可能で、Cacooなどのサービスでも使えます。但しSVGの書き出しに慣れていないので、何か問題もあるかも知れません。 PNGは、私が普段使っているdraw.ioで直接ステンシルとして扱いやすいよう、128px*128pxで出力しています。

ファイルはGoogleドライブにアップしています。 下記の注意を必ず読んだ上で、ご利用ください。

※現在ファイルとその加工物は削除してます。※

利用上の注意

第一に、このロゴデータは非公式に個人がトレースしたものです。利用することで発生する問題のサポートはできませんので、自らの責任の範囲でご利用ください。また、Googleから指摘を受けたり、公式のロゴが扱いやすい形で提供されれば、公開を停止するかも知れません。

次に、結構乱暴にトレースしているので、本来のロゴと多少異なる部分もあります。完全に正確なロゴが必要な場合、利用を避けてください。

最後に、GCPのロゴはまだ不安定で、公式のドキュメントで、すでにTranslate APIとPrediction APIのロゴが変わっています。 かと思えば、他の箇所ではロゴの使い回しや、明らかに間違ってる表示があったりと、Google自体がまだまだ固まっていないようです。

ここで公開するロゴは、飽くまで過渡期のつなぎとして、とりあえず高解像度のロゴが必要な場合にのみ、利用してください。

なお、本来であれば明確に再利用可能なライセンスを当てたい所ですが、そもそもが勝手にトレースしたものであり、余計な混乱を避けるため、敢えて使用条件は明示しません。但し少なくとも、私自身はあらゆる再利用に対して何の権利も行使しません。

群像シミュレーター開発記 その1

大きな仕事がやっと落ち着いて、少し余裕が出てきた。

相変わらずGoを学んでいるけれど、ちまちまと作っているサービスでは、言語として踏み込んだ使い方が中々出てこない。 そこで、ずっと作りたかったものを題材として、Goの学習を進めることにした。

群像シミュレーター

中学生の頃、『フランケンシュタインの末裔たち』という佐倉統の著作で、人工生命の概念に出会った。 そこでライフゲームを知り、トマス・レイのTierraを知り、手書きでリンデンマイヤーのL-Systemの真似事をしたりした。 あれ以来人工生命という試みはずっと頭を離れない。 でも生命の探求としては、本質に迫っているように見えても、結局事例集に感じた。

少し後になって、高校生の頃 Memetics に出会った。 元々神話や文化史が興味の中心だったので、概念自体はとても魅力的だったけれど、ミームという単位がしっくりこなかった。 模倣や伝播は重要だけれど、模倣子として落とし込むことに無理を感じた。

こういう経験をしながら、もしも、生きたり殖えたり繋がったり創ったりする人間らしい個体が、寄り集まって蠢く様を眺められたら、それを自分で作り上げられたらと考えるようになっていった。

自分ではライフゲームboidの変種を書く程度で、群像シミュレーターは概念を弄くってばかりだった。 時々小さな小さな単位で試作してみたこともあるけれど、続かなかった。

少しずつだけれどGoを学んでいて、この言語が随分気に入ってきた。Gopherくんもかわいい。 ずっと作りたかったものと、やっとまともに学ぶ言語と、それぞれまともに取り組む気長な課題として、群像シミュレーターはちょうどいいなと考えた。

目指さないもの

多分、自分の作りたいものは既存しない。 けれど表面的に似ているものは沢山あってややこしいので、まずは目指さないものを洗い出す。

問題解決のためのシミュレーター

社会や集団で起こる問題の解決に、人間的個体を用いた群体を使ったシミュレーションは、色々と使われている。 例えばこの、歩きスマホシミュレーション。

全員歩きスマホin渋谷スクランブル交差点

何かの問題を取り扱いたいわけではなく、充分に複雑な個体が集まって起きる、訳の分からない創発が見たい。 削ぎ落とされたパラメーターとしての個体群では、面白くない。

自殺したり、寝ぼけたり、笑い転げたり、一日ぼけっとしたりする、そんなことも可能な個体を扱いたい。

よって、個体を可能な限り複雑に、実際の人間に近づけていく。

ロールプレイ

コンピューターゲーム、特にオープンワールドのものでは、知能を持って見える個体が多数登場するのが一般的になってきた。

例えばBethesdaのSkyrimでは、「Radiant A.I.」と呼ばれるAIシステムによって、リアリティある世界の住人たちを生み出しているという。

Radiant A.I. - The Elder Scrolls Wiki 日本語版 - ウィキア

しかしこうしたゲームに登場する人物たちは、魅力的な物語を演じる演者に過ぎない。 一見複雑に見えても、ロールは固定され、その範囲での複雑さがゲームプレイに揺らぎを与えているだけである。 勝手に新たな集団を形成して戦争をふっかけたり、鍛冶屋のおやじが食い物屋のねーちゃんと不倫したり、見知らぬ英雄がいつの間にか世界を救っていて手持ち無沙汰になったりしない。

これはその世界が、プレイヤーに一定の範囲のロールプレイを楽しんでもらうための舞台装置なのだから、当然の仕様である。 勝手に動かれて統制できない舞台では、用意された物語を語り進められない。 語っている間に勝手に魔王が倒されたのでは、語り部は黙るしかなくなる。 しかし作りたいものは、壮大な物語の舞台装置ではなく、勝手に物語を生む群体である。

よって、個体にロールを与えない。 個体は等しく群の一個体であり続ける。

あるべき社会

コンピューターゲームの中では、Simsというシリーズが最も自分の作りたいものに近いのかもしれない。

ザ・シムズ - ホーム - 公式サイト

複雑で、欲求と計画を持ち、交流し生きてゆく個体たちは、集団となって一定の創発を見せる。 しかし、そこに現れる社会とは、統制され固定されたものになっている。

Simsは、アバターたちに楽しく複雑な人生を歩ませるシミュレーションゲームである。 その社会は、より大きな社会を背景に置き、シビアな生存とは無縁の理想化されたものである。 Simsたちは、生きるために隣人を殺したりしない。ヤク中のポン引きに殴られながら街角に立ったり、安全な水を求めてさまよった挙句に行き倒れたりしない。 安全で、明るく、楽しい社会をどう生きるか、それを楽しむゲームだからだ。 しかし、用意された社会での群像を見たいわけじゃない。

よって、社会を規定しない。 社会は個体が作り出す。

仮まとめ

目指さないものを幾つか考えて、目指すものが少し見えた。

  • 人間を模した充分に複雑な個体
  • その個体群による自律的な社会の創出
  • 個体群が生きる世界

もう少し、具体例を考えてみる。

  • 将来に悲嘆し、残された者を思いつつ、自殺する個体
  • 取得可能な可食物がもたらす食文化の創出
  • 愛、関心、妬み、激情、虚脱、狂気
  • 生きるための絶え間ない営み

ほんの一部なのに、とてつもなく壮大だ。 これまで何度も考えてきたことではあるけれど、改めて書き出すと、やっぱり作りたいものが大きすぎると感じる。 それでも、これを目指すことそのものが愉しみであり、ついでにGoの学習も進むなら言うこと無い。

どこから始めるか

やはり、まずは個体を少しでもGoで取り扱う術を学ぼう。

試しに人間を少しだけ定義してみよう。

type Human struct {
  name string  //個体名
    age    int   //年齢
    water  int32 //水分量
  weight int32 //体重
}
func (h *Human) intake(f Food) {
  h.water += f.water
}

生涯かけても終わらないようなものに取り組むのだから、100回や200回、一から書き直すつもりでいたほうが良い。 拙くても少しずつ進めよう。

Golang の中国での盛り上がりと『Go Webプログラミング』

Goへの注目は国によって偏りがありますが、Google Trends で見る限り、圧倒的に中国が高いです。

もちろん人口の影響は大きいでしょうし、同じ10億人超えのインドに比べて、プログラミングに関心のある層が分厚いのも関係していると思います。 しかし他の国と見比べると、やはり中国の関心は相対的にも高そうに見えます。

例えば都市単位で見ても、上位3つは中国。 トップが深圳市なのは、何か専門教育期間やIT企業でも密集してるんでしょか。

こういう中国の盛り上がりと直接関連があるかは分かりませんが、『Go Web プログラミング』astaxie/build-web-application-with-golangというドキュメントの影響も気になります。

これは、上海のastaxie (astaxie)が中心となって、Github上でオープンに作成されたもので、書籍としても販売されています。 原文は中国語で書かれていますが、英語、日本語への翻訳も行われています。 私もWebプログラミングに限らず、Goの基本的な事柄含め、しばしばお世話になってます。

こういう勢いのあるユーザーがいることで、中国でのGo事情は盛り上がってるんでしょうか。 あるいは、新しい言語だから先行優位が少なくてチャンスを感じているとか、何か中国事情に合った理由があるんでしょうか。

Windowsでの Go 1.3 & Google App Engine SDK for GO 1.9.6 のセットアップ

これまで手元の環境では、結構前になんとなく入れてみた1.2系のものを使っていました。 しかし先日 1.3 がリリースされ、速度の向上や色々な変更も加わっているようです。

Playground は最新のビルドを使っているようですし、せっかくなのでツアーを終えたこの段階で、ローカルの Windows の環境を作り直してみます。 また、ついでに Google App Engine の Go 用 SDK も、最新のものをインストールしておきます。

Go 1.3 のインストール

Go のインストールは、基本的に以下の公式ガイドに従います。

旧バージョンのアンインストール

私の環境には Go 1.2 がすでにインストールされていますが、こういった場合 1.3へのアップグレード前に、旧バージョンのアンインストールが必要です。 インストールガイドには次の注意があります。

If you are upgrading from an older version of Go you must first remove the existing version.

過去のインストールをどのように行ったかで、アンインストールの方法は異なります。

インストーラを使用した場合

コントロールパネルの「プログラムと機能」等から、アンインストールを行います。

zip ファイル等から主導インストールした場合

アンインストールには2つの作業が必要です。

  1. インストールしたディレクトリの削除
  2. 環境変数の削除

Windows なので、私の場合インストール先は C:\Go でした。 まずこのディレクトリを削除します。

次に環境変数の削除。 これは後でもう一度同じ設定をする筈ですが、将来的に環境変数の追加や変更が行われる可能性もあるので、一応クリーンにしてからアップグレードします。 削除はマイコンピューターのプロパティ、システムの詳細設定等から「環境変数」設定ダイアログを表示して、Go関連のパスをそれぞれ削除しました。

これで旧バージョンのアンインストールは完了です。

ダウンロード

Go のセットアップは、Windows の場合通常はインストーラを使用するのが手軽で確実です。

f:id:belbo:20140707181958j:plain

Downloads - The Go Programming Language

インストーラは32bit・64bit用に分かれていて、今回は自分の環境が Windows8.1 の64bit版だったので「go1.3.windows-amd64.msi」をダウンロードしました。

インストール

ダウンロードしたインストーラを起動すると、インストールウィザードが始まります。

f:id:belbo:20140707181959j:plain

この時点で、より低いバージョンの Go が、インストーラからインストールし、且つまだアンインストールされていない場合、アンインストールするよう警告が表示され、インストールが続行できません。

f:id:belbo:20140707182002j:plain

f:id:belbo:20140707182003j:plain

f:id:belbo:20140707182005j:plain

ウィザードでは、インストール先のパスを選ぶぐらいしかオプションはありません。 Windows の場合、" C:\Go\ " が標準のインストール先になります。 後々細かなトラブルの原因になったり、トラブルシュートを面倒にする可能性もあるので、積極的な理由がない限り、標準のものを使用した方が安全です。

f:id:belbo:20140707182007j:plain

f:id:belbo:20140707182009j:plain

インストールが完了すると、システムの環境変数に、それぞれ次の値が追加されます。

  • GOROOT : C:\Go\
  • Path : C:\Go\bin

これにより、go, gofmt, godoc のコマンドが使用可能になります。 コマンドライン(すでに開いていた場合は開き直しが必要)で go を実行し、go コマンドの Usage が表示されれば、インストールが成功しています。

f:id:belbo:20140707182012j:plain

なお、GOROOT 環境変数については、どのように Go を導入したかによって、その要不要や扱いが変わってくるようです。

これが最も問題になるのは、複数の Go が導入されている場合です。 後述の appengine SDK がそれに当たりますが、SDK 側で独自の GOROOT を設定してくれるようになっているため、現時点では気にしないことにします。

go get のための環境変数 GOPATH とツールの設定

Go にはとてもシンプルなパッケージ管理機能が付属しています。 "go get パッケージのパス" とするだけで、インターネットなどからパッケージを取得し、ローカルの環境にインストールまで行ってくれます。 この go get を使えるようにするには、事前に幾つか準備が必要ですが、現在のインストーラはそこまで面倒を見てくれません。

環境変数 GOPATH の設定

これは go get をして取得したパッケージのダウンロード先であり、import を解決する際の参照先でもあります。

このパスを設定せず go get を実行しても、

package *******: cannot download, $GOPATH not set. For more details see: go help gopath

と怒られ、パッケージのセットアップが行えません。

GOPATH に設定するパスは、自由に決めて構いません。 但し Go のインストール先同様、長すぎるものや、空白や非ASCIIの文字は避けた方が無難です。 また、Go をインストールした先も、パーミッションやバージョンアップの問題が起きます。

Windows では、ユーザーディレクトリの直下などが分かりやすいと思いますが、日本語を含んでいる場合は避けるべきかも知れません。 渡しの場合は "C:\Users\name\go" を設定しました。

ライブラリの開発などでは、

ソースコード管理ツールの導入

"go get" は任意のリソースからパッケージを取得しますが、取得にはその環境にインストール済のソースコード管理ツールを使用します。

例えば参照先が Github であれば、git コマンドを使用して、パッケージのファイルを取得します。 そのため、参照先のリポジトリが使用しているツールが使用できる状態でないと、"go get"としても、パッケージの取得に失敗します。

現在 "go get" が対応しているのは、以下の4つのサービスにあるリポジトリであり、それぞれが対応している管理ツールに違いがあります。

これら全てを Windows環境で導入するのは、ちょっと面倒です。 ざっと見る限りでは、多くのプロジェクトが Github を使用しており、次いで bitbucket か Google Code という印象です。 ひとまず git コマンドが使えればかなり幅広く対応できますし、残りは必要なパッケージが要求した時点で導入しても、充分間に合います。

go のインストールはこれで完了です。

Google App Engine SDK for Go のインストール

引き続き、Google App Engine SDK for Go のインストールを行います。

といっても SDK は必要な Go や、gofmt 等のツールを含んでいるため、前述の手順で Go をインストールしていなくても、appengine 用の開発が可能です。 しかし、ローカル用の Go で学習やライブラリの開発を行えた方が都合が良いので、両方のインストールをおすすめします。

GAE で Go を使う価値

Go の魅力のひとつは、Google App Engine で使えることです。 まだ Experimental ですが、それでも充分使い物になる状態です。

appengine では Java, Python, Go と3つの言語が標準(Managed VM 等を使わずに)でサポートされています。 しかし、無数のインスタンスが負荷等に応じて随時起動・終了される appengine では、Java のようにスピンアップの重たい環境は、起動の都度長い待ち時間を生じさせます。 Python は比較的軽量ですが、Go に比べると重く、演算処理も時間がかかります。

Google の想定とは違って、appengine はフルスタックのアプリケーションプラットフォームというより、Compute Engine や Cloud Strage などへのフロントエンドとしての活用が目立ちます。 そういう用途では、更に Go のメリットが目立ちます。 瞬間的に凄まじいアクセスが集中しても、超軽量な Go のインスタンスであれば、必要な分だけ迅速に立ち上がり、とにかくリクエストを捌いて行けます。

ということで、Go を新しくセットアップしたついでに、Google App Engine の Go 用 SDK もセットアップしなおしておきます。

ダウンロード

Google App Engine SDK for Go は、zip ファイルのみが、appengine の公式サイトから提供されています。

f:id:belbo:20140707182013j:plain

Download the Google App Engine SDK - Google App Engine — Google Developers

Windows なので、"Google App Engine SDK for Go" から "go_appengine_sdk_windows_amd64-1.9.6.zip" を選択しました。

Python 2.7系 の確認

Go の appengie SDK を利用するには python の 2.7.x が必要です。 2.6以前や、3には対応していません。

ここでは python のインストール手順には触れませんが、下記の情報などを参考に、インストールを完了させます。

python をインストールし、パスも設定されていれば、下記のコマンドで python のバージョン番号が表示されます。

python -V

ここで 2.7.x が表示されていれば、python の準備は完了です。

zip の展開

ダウンロードした SDK の zip ファイルは、任意の場所に展開します。 展開先は特に定められていませんが、極端に長かったり、空白文字を含んだりするパスは避けた方が無難です。 私は SDK 用の標準のパスとして " C:\SDK\ " を使用しているため、ここに展開しました。

パスの設定

SDK そのものは展開した時点で使用可能ですが、パスを通しておくと、例えば開発環境用の Go をラップしたコマンドが " goapp " のみで可能になり便利です。 しかし、SDK には gofmt, godoc という、Go が持つコマンドとの重複したものが含まれています。 もちろん、gofmt や godoc は、Go 側でも SDK 側でも、そう大きな違いは無いはずですが、問題となる可能性も残ります。

パスを設定しないのも手ですし、ユーザー変数に設定してユーザーの切り替えなどで対応する方法もあります。 今回の場合は、Go 側のものを優先して使えるよう、パスを設定しました。

先に記述されているものが優先されるので、システム環境変数にある Path を、"...;C:\Go\bin;C:\sdk\go_appengine" の順で設定しました。

もうひとつ競合しうるのが GOPATH ですが、これは SDK に含まれる gofmt.bat などで、設定済みの GOPATH がある場合はそちらを使用するようになっているため、問題なさそうです。


以上で Google App Engine SDK for Go のセットアップは完了です。