はてなキーワード: オブジェクトとは
量子力学における観測者問題についてはよく知られるように、人間の主観性が量子実験の結果に重要な役割を果たしている。
ドイツの物理学者ヴェルナー・ハイゼンベルクによる有名な引用がある。
「私たちが観察するのは現実そのものではなく、私たちの質問の方法にさらされた現実です。」
例えば有名なダブルスリット実験では、スリットの後ろに検出器を置かなければ電子は波として現れるが、検出器を置くと粒子として表示される。
したがって実験プロトコルの選択は、観察する行動パターンに影響する。これにより、一人称視点が物理学の不可欠な部分になる。
さて、数学にも一人称視点の余地はあるか。一見すると、答えは「いいえ」のように見える。
ヒルベルトが言ったように、数学は「信頼性と真実の模範」のようである。
それはすべての科学の中で最も客観的であり、数学者は数学的真理の確実性と時代を超越した性質に誇りを持っている。
ピタゴラスが生きていなかったら、他の誰かが同じ定理を発見しただろう。
さらに定理は、発見時と同じように、今日の誰にとっても同じことを意味し、文化、育成、宗教、性別、肌の色に関係なく、今から2,500年後にすべての人に同じ意味があると言える。
さて、ピタゴラスの定理は、平面上のユークリッド幾何学の枠組みに保持される直角三角形に関する数学的声明である。しかし、ピタゴラスの定理は、非ユークリッド幾何学の枠組みでは真実ではない。
何が起こっているのか?
この質問に答えるには、数学的定理を証明することの意味をより詳しく調べる必要がある。
定理は真空中には存在しない。数学者が正式なシステムと呼ぶものに存在する。正式なシステムには、独自の正式な言語が付属している。
つまり、アルファベットと単語、文法は、意味があると考えられる文章を構築することを可能にする。
その言語には、「点」や「線」などの単語と、「点pは線Lに属する」などの文章が含まれる。
次に正式なシステムのすべての文のうち、有効または真実であると規定した文を区別する。これらは定理である。
それらは2つのステップで構築されれる。まず、最初の定理、証明なしで有効であると宣言する定理を選択する必要がある。これらは公理と呼ばれる。
公理からの演繹は、すべての数学がコンピュータで実行可能な印象を生む。しかし、その印象は間違っている。
公理が選択されると、正式なシステムで定理を構成するものに曖昧さがないのは事実である。
これは実際にコンピュータでプログラムできる客観的な部分である。
例えば平面のユークリッド幾何学と球の非ユークリッド幾何学は、5つの公理のうちの1つだけで異なる。他の4つは同じである。
しかしこの1つの公理(有名な「ユークリッドの5番目の仮定」)はすべてを変える。
ユークリッド幾何学の定理は、非ユークリッド幾何学の定理ではなく、その逆も同様。
ユークリッド幾何学と非ユークリッド幾何学の場合、答えは明確である。これは、単に説明したいものに対応している。
数学は広大であり、どのように公理を選択するかという問題は、数学の基礎に深く行くと、はるかに感動的になる。
すべての数学的オブジェクトは、いくつかの追加構造を備えたセットと呼ばれるものであるということだ。
たとえば自然数のセット1,2,3,4,...は加算と乗算の演算を備えている。
集合論は特定の正式なシステムによって記述される。Ernst ZermeloとAbraham Fraenkelと、選択の公理と呼ばれる公理の1つに敬意を表して、ZFCと呼ばれる。
今日の数学者は、すべての数学を支える集合論の正式なシステムとしてZFCを受け入れている。
彼らは、無限の公理と呼ばれるZFCの公理の1つを含めることを拒否する。
言い換えれば、有限主義者の正式なシステムは、無限の公理のないZFCである。
無限大の公理は、自然数の集合1,2,3,4,...が存在すると述べている。すべての自然数に対してより大きな数があるという声明(「ポテンシャル無限大」と呼ばれる)よりもはるかに強い声明である。
有限主義者は、自然数のリストは決して終わらないことに同意するが、いつでも自然数の集合の有限の部分集合のみを考慮することに限定する。
彼らは一度にまとめたすべての自然数の合計が実在することを受け入れることを拒否する。
この公理を取り除くと、有限主義者が証明できる定理はかなり少なくなる。
正式なシステムを判断し、どちらを選択するかを決定することができるいくつかの客観的な基準...なんてものはない。
「時間と空間を超越した何かを象徴しているので無限大が大好きだ」と言えば無限大の公理を受け入れることができる。
ゲーデルの第二不完全性定理は、十分に洗練された正式なシステム(ZFC等)は、自身の一貫性を証明することができないと述べている。
数学者は、今日のすべての数学の基礎であるZFCが確固たる基盤にあるかどうかを実際に知らない。
そしておそらく、決して知ることはない。
なぜなら、ゲーデルの第二の不完全性定理によって、より多くの公理を追加することによってZFCから得られた「より大きな」正式なシステムにおけるZFCの一貫性を証明することしかできなかったから。
一貫性を証明する唯一の方法は、さらに大きな正式なシステムを作成することだけだ。
数学を行うためにどの公理を選択すべきかについて、実際には客観的な基準がないことを示唆している。
要するに、数学者が主観的に選んでいるというわけである。自由意志に任せて。
公理のための主観的な基準というのは、より豊かで、より多様で、より実りある数学に導くものを選ぶという人は多い。
これは自然主義と呼ぶ哲学者ペネロペ・マディが提唱する立場に近い。
特定の公理のセットを選択する行為は、量子物理学の特定の実験を設定する行為に似ている。
それには固有の選択肢があり、観察者を絵に導く。
コードを簡潔に保つにはモジュール化が必須である。しかし同じモジュールに関係のない機能が含まれていたりすると混乱の元になる。
一方で、関数というのは引数の細かな仕様に依存せずに、汎用的に呼び出せた方が何かと好都合だ。引数になんらかのオブジェクトを渡し、そのオブジェクトしか持ち得ないような特殊な情報で処理を行なったりすると、関数とオブジェクトが互いに依存しあってしまう。
これはモジュールの結合度と呼ぶ。
高い凝集度、低い結合度によってモジュールを作れば、保守性は上がる。
さらにモジュール内では、公開する必要のない関数はprotectedまたはprivateにするべきだ。
そのためにはモジュールが公開すべき関数についてインターフェイスを作り、公開関数に対するユニットテストを書いておくのが良いだろう。
意外なほど反応ついてたけど読まず返事せず続ける。というか言いたいことの1割も書いてないので返事してたら続けられない。
読み返しててアズレンとブルアカが混ざっててどっちの話だかわからなくなってるが、すまん。
神バハだって当時すごい盛り上がって楽しかっただろというのは自分もそうですはい。
三目並べだって楽しめれば別にゲームとして欠陥あっても関係ないというのもその通り。
この場合、ゲームデザインとして実際のゲーム内容とゲームのルックが嚙み合ってないのが、よろしくないと感じる理由になる。
つまり、なんか雰囲気がドルフロに似てるなあという類似が、ゲームの性質からくるのではないと考えるからだ。
ゲームジャンルが同じだと見た目が同じになるのはむしろ当たり前。ファイアーエムブレムとラングリッサーが見た目が似てると言って怒るのは…譬えが悪かった。
艦これとアズールレーンでいうと、艦これはジャンル分けが難しいオリジナルジャンルだがああいうゲームで、アーケード艦これは3Dのアクション?ゲーム。アズールレーンは2Dシューティング。アズレンがアーケード艦これのルックにあえて似せる必要は特にない。が、実際、なんかそれっぽくなってしまってる。
パクリではない。キャラクターは独自の2Dに落とし込んであるし、ゲームシステムも違う。別物である。
ただ、軍艦モチーフのヒット作の後追いで出た軍艦モチーフゲームのゲーム画面の全体のルックが、ゲームシステム上の要請によるものでなく、なんとなく似てる。
おそらくは、参考にしました、ということだろう。
アズレンの場合、一番近いのは二次創作同人ゲーだと思う。キャプテン翼のやおい同人誌を商業向けに絶愛にしました、みたいな…譬えが悪いか。
気にする奴は気にするが、気にしないやつは気にしない、ただネタ元へのリスペクトは本当にあるんか? と思いたくなるような微妙な感じだ。
この場合、似てるから悪いのではなく、似てないことが気持ち悪さの原因になっている。別にネタ元のニュアンスをあえて残す必要がないのに残ってしまってるのが、単なる素材として雑に扱ってるんだろうなと感じるのである。自分は。
ブルアカでも、同様の、パクリではないけど…を感じ取ってしまう。
基本的にゲームシステムは生煮えである。2Dキャラがちょこまかと動きまわり、いろんなアクションを取るところが一番のセールスポイントであるのは間違いないが、それを使ってゲームシステムとしてうまくできてるかというと、見た目がちょっと豪華になっただけというのが正直なとこだろう。
プレイヤーが操作可能な範囲とゲーム画面のルックがうまく繋がってない。範囲攻撃の範囲指定ぐらいだろうか。回避指示はごく少数の特定キャラしか使えないし。AIオートにすると本当に頭が悪すぎるのでスキル使用はプレイヤー操作するしかないのだが、正直、ここまでオートが使い物にならない理由がわからないぐらい使えなさすぎる。なんとかゲームっぽさを演出しようとして、プレイヤーのやることを無理やり残すためにオートをあえて役立たずにしたのではないかと疑っている。
美少女が実銃で銃撃する動作を頑張って作ろうという熱意は凄くある。あるが、ゲームにはならなかった。
銃と美少女という組み合わせだけが先行してて、後が続かなかった。
さて2D銃撃部分ではグラフィックが先行してゲームデザインが追い付かなかったという話なのだが、そうなると気になるのが「もう一方のゲーム画面」であるフロアマップ。
メインと銘打ったステージで見れるのだが、これは完全に、まったく、寸分の違いもなくドルフロそのまま。ユニットの動かしかたまで同じだし、マップ上のオブジェクトも似てる。
ドルフロでは、マップはゲームの中心部分として機能していた。最初に見ると艦これの海域マップみたいに見えるが上手くアレンジしてあって、要は戦術シミュレーションのマップの簡略化した形だ。ゲームデザインとしての中心部分なので先に進むほどマップが大きくなり難易度が上がり、そのうちスマホだとマップを見ることすら不可能みたいなことになり(ゲーム公式がPCエミュでのプレイを推奨してたぐらい)、ライトユーザーが引くぐらいなことになるのだが、そのぐらいゲームとしての意味がちゃんとあった。
ブルアカでのマップは、ドルフロの凶悪マップを反面教師としたのだろう、基本的に戦術シムみたいなことは一切ない。というかやらせてくれない。代わりにボタン押しギミックがやたら増えた。
結果、マップはあっても、実際のユニットの移動ルートは実質1つだけ、というのが現在のブルアカのマップである。この部分はトライアンドエラーで運営の用意した正解を引くパズルみたいなもので、プレイヤーのやれることはほぼない。こうなってくると、マップ攻略はほぼ作業でしかなく、こんなことやらせず戦闘だけ抜き出して置いておけばいいだろ、という気分になってくる。
書いてみて思ったが、自分がドルフロとブルアカを対比してしまうのは、かなりの部分ここだと思った。ドルフロは艦これフォロワーとして作られたがゲーム部分は独自性が強く、艦これから受け継いだように見える部分でも自作品に合わせるように作り変えてあり、ゲームのルックとゲームデザインの間に乖離がない。ブルアカはドルフロから全く変えずに完コピしたが、(おそらくソシャゲとして楽に遊べるようにするためにという思惑もあって)その完コピした部分はゲームとしての機能を失い煩雑なだけの盲腸となってしまってる(かといってマップをなくすのも微妙かもしれない。先述したように2Dキャラ銃撃部分はプレイヤーがやることがあるように見えて少ない、基本的にキャラを愛でるためのパートだ。形骸化してるとはいえマップをなくしてしまうと、ただでも少ないゲームっぽさがさらに失われてしまうことになる)
ドルフロと同じなことについて「真似した」以外の理由が思い浮かばなくなってしまっている。このへんの真似っぽさは「銃と美少女」というセールス部分からは外れたとこなので雑にやっつけちゃったんだろうが、ここがあるからこそ、「銃と美少女の組み合わせなんて過去にいくらでも前例がある、別にドルフロは関係ない」と言いづらくなっている。ゲームシステムとしての合理性がありプレイヤーのゲーム体験としてうまく昇華させていれば、同じジャンルだから似てるだけと言えてたはずだ。
自分がブルアカのゲームデザインが雑なのが、単に雑であるよりあかんとこだと思う理由は、上記となる。
まだまだ続きます。
見た通り基本お気持ち表明なのでそのように。
これだから3Dオブジェクトのコピペゲーをなんとも思わず消費するSteamユーザーは嫌いなんだ
ゲームってのはパン作りのように粉からこねて自分で作ってこそクリエイターの思想が反映されるってもんだ
それすらこだわる気がないのに、見栄えのするゲームを手抜きで量産していくことに、意味はあるのか!
それは最終的に、人がゲームから受けるセンス・オブ・ワンダーを損ね、薄味なゲーム文化体験を推進してしまうことになる
ゲームにおけるQoLが下がればゲームという産業それ自体がパチンコのようなものに成り下がってしまうおそれがある!
事実、買い切りだからという紛い物の安心感のために、クリエイターたちの血と汗が数百円で安売りセールされる地獄がそこにあるだろ!
そういう環境を作ってるのはあんたらだ! そうなれば作り手もいかに手抜きしつつ一発当てるかしか考えなくなる! ソシャゲと同じだろ!!
同じ2Dスプライトやドットキャラ、聞いたことあるBGMを使いまわすようなRPGツクールゲーばかりになった世の中を想像してみろ!
それはDLsiteでは現実になってるが、同人だからこそ許されてるもんだろ
module_name.pyみたいなモジュールごとにファイル分割して、インターフェイスだけ公開してその他はdef _funcみたいにprotected(or private)にしとく。
でも「共通性がありそうだから共通関数にする」はアンチパターンだな。たまたま共通してただけの場合は分岐コードが増えて共通関数の保守コストが上がる。
あとありがちなのは、php開発者が関数分割しないですべてメインコードにべた書きするケース。こういうのはやめないと保守が大変。
とっておきのクズがやりがちなのは、神オブジェクトを作るとかだな。Userクラスのフィールドに関係する機能が多いからといって、コンポジションなどによるクラス分割をせずにユーザークラスにあらゆるフィールドとメソッドを追加して、さらに進むとユーザーとは無関係な機能も含めすべてをユーザークラスに定義するアフォ。こうなってしまったら、後から修正するのが難しくなる。
先に手を打つことが、プログラマーの素質「怠惰」につながるのであり、面倒臭いといって後回しにするのは美徳でもなんでもない。
ingressを離れた諸氏は知らないだろうが、最近のingressには、OVER CLOCK HACKなるものがある。簡単にいえば3D版グリフハックだ。
お馴染みのグリフが3DのARオブジェクト上に表示されるので、それを解読・記憶して2Dのグリフを入力する。
そうすると、正解率に応じてとんでもない量のアイテムがもらえるというミニゲームだ。
私は元々ingressのグリフハックが好きで、グリフとそれらを組み合わせた頻出熟語(例:human + civilization)や、LV8のグリフハックのパターン(例:create + pure + future + human + civilization)も結構覚えてる。
しかし、そんなグリフハック好きな私でも、OC HACKだけは無理だ。
難易度が高いからこそリソースが沢山もらえるってことなんだろうが、ミニゲームとしての完成度が低過ぎて、やっててストレスしか溜まらない。本当につまらん。
石川の能登は冷やかしどころかボランティアすら断るほどインフラが壊滅していて、現地入りした人が色々と叩かれてるけど、ぶっちゃけSNSにあげるかどうかは別として震災直後の現地を観光してみたいって気持ちはある
311のときの東北は津波で街が流されていて壊滅した瓦礫ばかりである意味圧巻だったようだが、残念なことにそれを見ることなく終わってしまった
なお、そこから1年後に現地入りしてもまだ瓦礫が残っていて被災地としての風情があった(意訳)と知人が言っていたけどね
例の奇跡の一本松とかは今は立派な観光名所になってるがあれはただのレプリカで、本物は震災直後の数週間でしか見れなかった(塩害で死んだので)
岩手の大槌町では建物上に乗り上げた船とか風光明媚なオブジェクトもあったがあえなく解体されたんだが、むしろああいうの残しておけば観光地として生きながらえて過疎地にならずすんだはず
まだ産まれてないが阪神・淡路大震災の崩壊した高速道路とかああいうのもさっさと解体撤去されたけど、ああいう非現実的なものを見れた人が羨ましい
石川の被災地は風情のある古民家が多いしプチ京都みたいな町並みだったが、それが倒壊しまくってる姿は、まさに東京大空襲や関東大震災のときの東京を彷彿とさせてくれるのではないか
これは見たい・・・是非とも見てみたい・・・そういう思いがムクムクと元旦からこみあげてくる
というので連休はまだまだ続くので、被災地入りしてみようかなと思っている
今は関西の某所に住んでいるが、石川の首都である金沢はほとんど無傷でインフラは生きているので、そこまで車や公共交通機関で行ったあとあとは自転車あたりで能登半島まで行ってみたい
例の倒壊した輪島塗の五島屋とか特に立ち入り制限されてないらしいから真っ先に見て写真とってこようと思う
でも炎上はしないだろうね
僕はプログラミング歴2週間の初心者です。キーと値を入力できるデータベースを作っています。
以下のコードを実行してデータを追加し続けると、一定のサイズを超えるとエラーが出てしまうみたいです。
理想は、データが追加された後にサイズが足りなくなったら動的に自動拡大されることです。
もし詳しい人がいたらご教示お願い致します。
import sys import os import mmap import hashlib def h(x): return int(hashlib.sha512(x.encode()).hexdigest(), 16) def create_db(filename): with open(filename, 'wb') as f: f.write(b'\0' * 1024 * 1024) # 1MBの空ファイルを作成 def set_key(filename, key, value): with open(filename, 'r+b') as f: mm = mmap.mmap(f.fileno(), 0) pos = h(key) % mm.size() while mm[pos:pos+1] != b'\0': pos = (pos + 1) % mm.size() if pos == h(key) % mm.size(): f.seek(0, os.SEEK_END) f.write(b'\0' * mm.size()) # ファイルサイズを2倍にする mm = mmap.mmap(f.fileno(), f.tell()) # ファイルサイズを反映させる pos = h(key) % mm.size() # ハッシュ値を再計算する data = key + '\0' + value + '\0' data = data.encode() mm[pos:pos+len(data)] = data mm.close() # mmapオブジェクトを閉じる def get_key(filename, key): with open(filename, 'r+b') as f: mm = mmap.mmap(f.fileno(), 0) pos = h(key) % mm.size() while mm[pos:pos+1] != b'\0': end = mm.find(b'\0', pos, mm.size()) # 第2引数と第3引数を指定する if end == -1: end = mm.size() if mm[pos:end].decode() == key: pos = end + 1 end = mm.find(b'\0', pos, mm.size()) # 第2引数と第3引数を指定する if end == -1: end = mm.size() value = mm[pos:end].decode() mm.close() # mmapオブジェクトを閉じる return value pos = (pos + 1) % mm.size() if pos == h(key) % mm.size(): break mm.close() # mmapオブジェクトを閉じる return None def main(): cmd = sys.argv[1] if cmd == 'create': create_db(sys.argv[2]) elif cmd == 'set': set_key(sys.argv[2], sys.argv[3], sys.argv[4]) elif cmd == 'get': print(get_key(sys.argv[2], sys.argv[3])) if __name__ == '__main__': main()
コードを書く上で重要なことは?という質問に対して、アスペならば「実行できること」と答えるだろう。
当たり前なことしか言っていない。「実行できること」という文からは全く有益な知見を得られない。
実行できることは重要性ではなく、必要性である。重要性とは、必要なことをすべてやった上でなおやる価値のあることを意味する。
そう考えた時に私がよく思うのは「最短時間で理解可能」であることが重要であると思うわけである。
しかしここに宗教がある。そもそも、人間が物事を理解するプロセスは人それぞれである。
私は一度、関数やモジュールで適切に分離するためのリファクタリングというものを行ったことがある。
というのも、一つの関数に万を超える行が書かれていたため、上司がリファクタリングを命令したためである。
具体的詳細はprivateメソッドに、公開する必要のあるものはpublicメソッドに移した。
そして当初働いていた職場での反応はどうだったかというと、「スパゲッティコード」だというのだ。
スパゲッティコード?一つの関数に万を超える行があるほうがスパゲッティだと普通は思うだろう。
ところが、彼らの脳内では、「常にコードの詳細が見えていなければ気がすまない」という、カプセル化を無視する思想で動いていたため、関数化すると関数の最下層まで辿らないと気がすまないらしかったのである。
このようにして、教育の無い人間はコードの読み方もカプセル化も知らないので、非生産的な方法が最短の方法になってしまうのである。
コードを最短で理解するためにはどうするのか。基礎知識を教育された集団の中に身を置くのがまず先決である。
例えばcalc_monthly_salary_yen(Person p)という行が存在した時、いちいちcalc_monthly_salary_yenの中身を常に見に行くような人たちはダメだ。
「人間のデータを入力すれば円単位で月の給料を計算してくれるんだろう」とざっくりと自然言語的に読み進められる人たちでなければ「最短理解」は難しい。
開発手法でしっくり来てるのがAndy HuntさんのTracer Bullet Developmentで、開発の方向性を示すのに試作を作る方法。
1. 主要なシステム オブジェクトを定義。UI、サーバー、ロジックビット、データベース抽象化レイヤー等。
3. データフローを実現するために API とその戻り値をコーディング。
4. 単体テストを使用して API の予想される使用法を文書化。
5. 各 API に必要な量の既定のデータ (別名、ダミー データ、偽のデータ、ハードコーディングされたデータ) を追加して、API が「実行」されるようにする。
6. あらかじめ用意されたデータを実際の機能に段階的に置き換える。
お前のいう通り書いたったわ(C#だが)。
//宇宙 namespace Universe { //あらゆる神の根底に存在する唯一神とその司る運(スーパークラス) public class GodLuck { public string Name { get; } //神の名前 public string Power { get; } //神の力 public string Plan { get; } //神の計画 public string Factor { get; } //運の要因 public GodLuck(string name, string power, string plan, string factor) { Name = name; //神の名前 Power = power; //神の力 Plan = plan; //神の計画 Factor = factor; //運の要因 } //神が何かを創造するメソッド public void Create(string thing) { Console.WriteLine($"{Name} created {thing}."); } //神が何かに対して支配や介入をするメソッド public void Control(string thing, string action) { Console.WriteLine($"{Name} {action} {thing}."); } //運が何かに対して影響を与えるメソッド public void Affect(string thing, string outcome) { Console.WriteLine($"{Name} affected {thing} and the outcome was {outcome}."); } } //恵比須様 public class EbisuSama : GodLuck { public EbisuSama() : base("恵比須様", "商売繁盛や五穀豊穣の力", "人々に幸せを与える計画", "商売繁盛や五穀豊穣の要因") { } //作物を守る public void Save(string crops) { Control(crops, "守る"); } //人間を成功させる public void MakeSuccessful(string person) { Affect(person, "成功"); } } }
(大いなる力を別のクラスに移譲したくなったが、神と大いなる力は同一のオブジェクトという要件があるからやめた)
//宇宙 namespace Universe { //神の振る舞いを定義したインターフェイス public interface IGodLuck { public string Name { get; } public string Power { get; } public string Plan { get; } public string Factor { get; } //神が何かを創造するメソッド public void Create(string thing); //神が何かに対して支配や介入をするメソッド public void Control(string thing, string action); //運が何かに対して影響を与えるメソッド public void Affect(string thing, string outcome); } //恵比須様 public class EbisuSama : IGodLuck { public string Name { get; } //神の名前 public string Power { get; } //神の力 public string Plan { get; } //神の計画 public string Factor { get; } //運の要因 public EbisuSama() { Name = "恵比須様"; //神の名前 Power = "商売繁盛や五穀豊穣の力"; //神の力 Plan = "人々に幸せを与える計画"; //神の計画 Factor = "商売繁盛や五穀豊穣の要因"; //運の要因 } //神が何かを創造するメソッド public void Create(string thing) { Console.WriteLine($"{Name} created {thing}."); } //神が何かに対して支配や介入をするメソッド public void Control(string thing, string action) { Console.WriteLine($"{Name} {action} {thing}."); } //運が何かに対して影響を与えるメソッド public void Affect(string thing, string outcome) { Console.WriteLine($"{Name} affected {thing} and the outcome was {outcome}."); } //物を守る public void Save(string thing) { Control(thing, "守る"); } //人間を成功させる public void MakeSuccessful(string person) { Affect(person, "成功"); } } }