全然わからない 私は雰囲気でレンダリングエンジンを開発している 

英語の勉強の話その1 英語の難易度って reading < speaking < listeningだよな

 英語の勉強を始めて1年くらい経つ気がする
 なんか1年って書くとすごいやってる感が出てるが、30分の英会話を月に6~7回やるのと、海外のVTuberの配信を見たり、英語のゲームをプレイする、くらいの、あまり精神的な負担にならないものを気楽にやっているだけなので、そんなに急激に英語力が上昇しているわけではない

 英会話がギリアウトプットの場となっているが、基本的に受け身の勉強はほとんどインプットばかりなので、知識が技術として定着することはほとんどなく、あまり勉強が活かされてないことを実感している。

 なので、定期的にはてなブログに英語に関する話を投稿することにした。

 

 昔どっかで見た話で、英語力ってのはすべての要素の掛け算で決まるという理論があった。つまり、reading、speaking、listeningどれかでも0だと、英語力が0になるのだ。(ここにおけるreadingには、構文理解力とかも含まれるのだろう)
 なので、「英語で会話できる」という状態を目指すには、すべての能力値を均等に上げていかないとあまり意味がなくて、エンジニアなどはreadingは得意だけど絶望的にspeakingやlisteningをする機会が少ないので、こいつ英語のドキュメント読める割に、ぜんぜん英語喋れんやんという現象が発生する。

 readingは情報のロスがゼロなので、辞書さえあればあとは文脈と気合でどうにでもなるが、listeningは本当に難しい。「知っている文」を読まれたとしても聞き取れない。なぜなら正しい発音を知らないからだ。昔英語の教員に「ゲラァウト!」ってブチギレられたことがあるが、それがGet outだと聞き取れたのはGet outがそういう発音だと知っているから。発音が前後の単語とのつながりに大きく依存する英語では、単語単体の発音を知っていても全く意味がない。ネイティブスピーカーではない以上は、とにかくありとあらゆる頻出構文の発音を耳に慣れさせるしか、英語を聞き取る手段がないのかなと思う。そういう意味では、listeningの前提として、その英文が正しいイントネーションで発音できるspeakingの技術が必要なんだよな。結局 reading < speaking < listening の順に難しい。というか、難しいというより、学習順のような感じもする。その構文を知り、話し、そして聞けるようになる。

 英語の、「次の単語の1音目と繋げてシームレスに発音したろw」みたいな思想が非常に憎い。ネイティブスピーカー以外に排他的な発音文化をやめろ! 「アロゥ」じゃねぇよ「アットオール」って言え。日本は「文字の音」が存在するから、ハキハキと喋ることができるけど、でもそれって冷静に考えると割と不思議な現象だよなぁ。言語の発達において、文字っていうのは後天的なものだから、完全に文字と音が1対1で対応付けられるのは凄いことだ。「は」と「お/を」くらいか? 揺らぎがあるのは。 

 発音の話で思い出したけど、昔好きだった帰国子女の歌い手のnanoって人が、ボカロの歌をEnglishカバーを投稿していて、そのコメントの動画に100%「XXの発音違うんだよな~」みたいな英語力マウントニキがいた。子供心ながら「帰国子女なんだから外野がどう言おうとその発音が実際に使われてて通用してたってことだろ」って思ってたけども、今思い出してもやっぱり言いがかり過ぎるんだよな。そもそも、イギリスの英語、アメリカの英語、インドの英語でも発音は全然違ったりして、「正しい発音」みたいものは厳密には存在しないと思う。oftenだって学校ではオォフンと習うと思うけど、イギリス英語では「オフトゥン」だ。だから発音の粗探しほど非生産的なものはないと思う。

 
 今やってる英会話では、英語の記事をスクリプトなしでリスニングして、その内容を説明し、そのあと記事についてディスカッションするという本格的な授業と、まったり気楽にトピックに基づいてフリートークする授業の二つをやっている。前者はマジで難しくて、毎回自分のリスニング能力の低さに打ちのめされている。

 直近のレッスンでは、2018年の、ロシア、中国、イギリス、アメリカ、フランスが、クレムリンで「核兵器は抑止力として有効だからみんな持とうね、だけど核戦争は絶対にやっちゃだめだよ」という感じの合意に関する記事を扱った。4年前の話だがすごいタイムリーな話題。


ディスカッションの備忘録

question) China, Russia, Britain, the United States, and France have agreed that a further spread of nuclear arms and a nuclear war should be avoided. How do you think a nuclear war can be avoided (ex. banning nuclear weapons altogether, educating people about their effects)?

核戦争はどうやったら回避できると思いますか?と聞かれたのでこう回答した。

riyachang) In my idea, if all countries should succeed in banning all nuclear weapons, nuclear wars will disappear.

全ての国が同時にせーので核兵器捨てたらよいと言ったが、「同時に」というニュアンスを含めることに失敗した。at the same timeと文末に言うべきだったね。

riyachang) But it is not a possible way.

 なるほど完璧な作戦っスねーッ 不可能だという点に目をつぶればよぉ~~
 
 ちなみにこのセリフの英訳は I see. That's flawless plan... if you ignore the fact that it's impossible! らしい。flawlessはより客観的なニュアンスを含むperfect。FPSのValorantではチーム全員生存して勝つことをFlawlessと言うが、日本語ローカライズではPerfectに変えられている。英語から英語へのローカライズなのに、より親しみが強い単語に置き換えられているところにローカライズの深さを感じる。

riyachang) Because countries think their benefits are more important than the world peace. For example, it is a simple reason, to have a strong influence, they should have strong military power.

 国家は世界の平和よりも自国の利益の方が大事だと考えているから。簡単な例でいえば、強い発言力を持つには、強い軍事力を持つ必要がある。と続けた。「Country」じゃなくて「国家(Nation)」の方が正確だし、語彙力がないから雑にthink are importantを使ったけどvalue ~ overを使って、 Nation values own benefits over the world peace.(国家は平和より自国の利益を重んじる)と表現した方がオシャレだったっすね。

question) The P5 group affirmed that nuclear weapons should serve defensive purposes, deter aggression, and prevent war. Do you agree that nuclear weapons can serve these purposes? Why or why not? Discuss.

核兵器が防衛や侵略の抑止力に役立つと同意しますか? と聞かれた。

riyachang) At least, some countries such as like Russia, until they discard their nuclear weapons, possessing nuclear weapons is a valid way to prevent from their attacks.

 ロシアみたいな国が核兵器を破棄するまでは、核兵器を所有することは彼らの攻撃を防ぐのに有効な手段。微妙にニュアンスを間違えていて、「彼らが核兵器を破棄するまでは」ではなく、「彼らみたいな国が存在する限りは」と言いたかった。As long as countries such as like Russia exists~かな。As long asとか、As well asとか、As much asとか、as XX asってすっと使えるだけで表現の幅がぐっと広がるんだけど、speakingだとすんなり出てこねぇ

question) Bilateral relations between the U.S. and Moscow have fallen to their lowest point since the end of the Cold War, while relations between Washington and China are also at a low. What do you think could be the effect of this on the rest of the world? How do you think these countries could repair their relations?

 アメリカとモスクワは関係が悪いし、アメリカと中国もまた悪い。これらがどんな影響を世界に与えると思いますか? また、どうすればこれらの関係を改善することができると思いますか?

 知らねえよ!って感じだったな、後者の質問とかむず過ぎるだろ、一国民が考えることではない。まあ、回答が正しいかどうかではなくて、自分の意見を英語で話せるかどうかが大事なんでまあいいんですけどね...

riyachang) The US and China's relations are not good for the world for the first and second GDP countries too.
One of the UN's goals is making countries cooperate with each other. If the two top countries are conflicting, the US can't do anything for peace.

 なんか英文として変だな... こんなこと言ったっけ? 普通に関係代名詞を使ってUnited States and China, which have first and second GDP っていうべきっすね。UNは国際連合のことで(先生に教えてもらった)、国際連合の目的は国家間の協力を実現することだが、トップ2の国が衝突していたら国際連合は何もできない。と言った。日本語なら「トップ2の国が衝突していたらお話にならない」っていうだろうけど、この「お話にならない」ってところのニュアンスがハイコンテクストで難しいな。軽く調べた感じ、absurd(不合理、ばかげている)、out of the question.(不可能、問題外)あたりがニュアンスに近い感じがする。

riyachang) If such a way exists, such wars wouldn't happen.
I think if citizens make good relationships all over the world by the Internet, I think the government or countries' leaders can't ignore their emotions or opinion because at least those countries adopt democracy.

 
 (国家間の関係の改善について)そんな方法あったら戦争は起こらないと言った。だがそれだと議論が終了してしまうので、インターネットで国境を越えて国民が仲良くなれば、国のリーダーは彼らの感情や意見を無視できないだろう、それらの国が民主主義国家である限りは。と意見をひねり出した。まあロシアは国民の感情を無視して戦争してますけどね。後から気づいたけど、「異なる国同士の国民が仲良くなる」というニュアンスが含まれてない感じがしますね。all over the worldじゃなくてacross national bordersっていうべきだった。overとacrossとbeyondの違いがよくわからんかったけども、acrossには平らな面における境界のニュアンスが含まれていて、beyondにはoverよりもよりダイナミックに「越える」ニュアンスがあるらしい。するとacross national borderって西洋的な表現やな。だって日本は島国だからそもそも国境とかないしな。over seaっすね。海を越えて仲良くする。実際、外国人ってforeignerってよく使うけど、ニュージーランドの知り合いはoverseasって言ってた。島国マインドを感じましたね。

 この辺で。一発目からボリュームがでかくなってしまった。継続的にやるためには一回の重みをもう少し減らさなくちゃ。

2021年を振り返る

 一人暮らしをしていると、年越しはいつもふと気が付いたときに終わっていて、PCの日時表示を見て年が変わったことを実感するだけ。
 今回もスカイリムをしていたら気がついたら24時20分くらいだった。

 2022年の誕生日をもって、私は26歳、つまり20代後半に突入する。
 これくらいの年齢になると、同年代の知り合いとの話題はおおむね「結婚」の話題になる。「結婚してぇ~(何も行動はしない)」みたいな管巻きを繰り返し、なんとなく周囲と同調する。
 確かに、身の回りにはぽつぽつと結婚する存在が増えてきて(私の兄もそうだ)、なんとなく幸せそうに見える。
 そういったものに漠然とした憧れをもっているのは確かだが、実際現実的な問題として、結婚には大きな痛みを伴う。可処分所得は大きく減り、生活習慣を捻じ曲げ、自分だけの時間というものが希薄になる。
 そういった現実を直視したとき、本当に結婚したいのか、と自問自答すると、意外とそうでもない気はしてくる。一人暮らしの生活は、孤独だが、豊かで、何よりも自由だ。
 絶対値的な感覚でいえば、現状でも幸福だ。だが、残念ながら幸せは相対的な価値に左右されると考えている。
 極端な例だが、今は不景気で、物価や税負担は上がり続けているのにも関わらず平均所得は変わっていない、貧しい時代とされている。不幸と感じている人間も少なくないだろう。
 とはいっても、当然今はエンターテインメントは飽和していて、金がなくても一生の時間を費やしても終わらないほどの多くの娯楽が誰にだって提供されている。
 昭和時代、大正時代と遡っていったとき、間違いなくそれらの時代に生きている人たちよりも充実な人生を人々は送れていると思う。にも拘わらず、不幸と感じる人たちが絶えないのは、自分よりも幸福な人間が多く存在するからだ。
 結婚も間違いなくその一例で、一人で生きていても特に支障はない人間であっても、周囲が結婚し、幸せそうに家内の話をするたびに、私たちは相対的に不幸になる。ルサンチマン的な思考で最悪だが、事実の一端だ。

 ちなみに2022年の結婚に関する抱負は特にない。まだ慌てるような時間じゃない(スラムダンク仙道)。
 一応友人と婚活PTに出てみるか、みたいな話題を口にしたことはあるが、ほとんどの婚活PTの前提条件に「身長170cm以上」があって、まず婚活の入口のフィルターではじかれてしまったので、すべてをあきらめた。(身長161㎝)


 ここからは、なんか2021年の出来事や思ったことを、時系列を無視して雑に書き連ねていく。

    • -

 最近目にした面白話題として、Vチューバーのぺこーらがクリスマスに配信をしなかったことで、多くのオタクが阿鼻叫喚になってたらしい。
 「チキンが冷めちゃった」「ぺこーらがクリスマスを俺らと過ごすことを選んでくれなったことが、ただ悲しい」みたいな多くの名言が排出されていた。
 わざわざケーキやチキンを用意して配信を待っていた者たちに強く同情するが、自らの人生の価値を、他人に置く生き方は大変そうだなと思った。ぺこーらが配信してくれるかどうかなんて、自分では一切関与することができないのに...
 私のTwitterのフォロワーも、投げ銭しまくっていた女性Vチューバーが、ほかの男性Vチューバーとくっついた、みたいな事件を受け非常に強いショックを受けていた。それと直接的な関係があるかどうかはしらないが、時折強い自殺願望をツイートを繰り返し、そしてある日突然アカウントを消して消滅した。彼は生きているだろうか。
 私も結構Vチューバーに限らないが配信を見るのは好きで、サブディスプレイで垂れ流し、みたいなのはよくやる。応援したいと思った時にはたまに投げ銭もするし、彼/彼女らの活動をこっそり応援している。ただ、人生は自分だけのものだ。彼/彼女らも自分の好きなように配信すればいいと思うし、好きな人ができたら付き合えばいいと思うし、つらいと思ったならやめればいいと思う。ただそれだけだ。

    • -

 一時期、VALORANTをプレイした時期があった。もともとは見る専で、その高い競技性から、ルールやキャラ性能をざっくり把握しているだけで、エアプでも非常にエキサイティングに大会を楽しめるVALORANTは、よい暇つぶしであった。
 ただ少しだけ自分でも遊んでみたくなり、ちょうど同時期に始めた知り合いを巻き込んで数か月ほどプレイしていた。
 ある日、ソロでランクマッチを遊んでいたとき、使いたいキャラがピックされてしまったため、あまり慣れていないキャラを選択してプレイした。立ち回りやエイムに避ける思考リソースが減り、そして味方に暴言を吐かれ、何もかもうまくいかず、ひどいKDで終わってしまった。
 一般に、暴言を吐かれた人間はパフォーマンスが大きく下がるという。その例に漏れず、結果的にKD0.2くらいでその試合を終えた。
 爆破系5on5のゲームでは、トキシックなプレイヤーと遭遇することは、そんなに珍しいことではないし、運が悪かったなあと感じていた。チャットではなくVCで暴言吐かれたのは初めてだったが。
 何なら、時にはVCをつないでいた知り合いが野良とゲーム内VCでガチ喧嘩を始めることもあった。

 それから少し経って、インターネットの調子が悪く、数週間まともにFPSがプレイできない時期があった。そんな中、ふと冷静になってみると、VALORANTをプレイしてきて、トータルで不快な気持ちの方が勝っていることに気が付いた。
 これは、私が普段身を置いている環境との強いギャップが原因だと思う。ソフトウェア開発の世界では、Googleが提唱したチーム開発の鉄則として以下のものがある。

Team Geek ―Googleのギークたちはいかにしてチームを作るのか | Brian W. Fitzpatrick, Ben Collins-Sussman, 及川 卓也, 角 征典 |本 | 通販 | Amazon

 謙虚(Humility) 世界の中心は君ではない。君は全知全能ではないし、絶対に正しいわけでもない。常に自分を改善していこう。
 尊敬(Respect)一緒に働く人のことを心から思いやろう。相手を1人の人間として扱い、その能力や功績を高く評価しよう。
 信頼(Trust) 自分以外の人は有能であり、正しいことをすると信じよう。そうすれば、仕事を任せることができる。

 これ、VALORANTでも全く同じことが言えると思うのだが、当然、普通の人間はまずこの「チーム開発の鉄則」という概念に触れることはないし、実践する機会もない。
 私の会社では、この原則を守れない人間はどんなに有能であろうとすべからく排除されるので、逆に言えば、このHRTの3原則が全く備わってない人間と「チームを組む」という行為があまりにも精神的な負担になっていることが分かった。
 私は、良いチームというものに慣れすぎた。この原則と対極的な思考を持つ爆破系FPSプレイヤーとは、相容れない存在なのだろう。
 私はVALORANT見る専に戻ることにした。それが、もっとも精神衛生的に良いと思うから。

    • -

 2021年2月に一戸建てを買ったが、驚くほど生活が何も変わっていない。
 部屋の数は増えたが、一つの部屋自体の大きさはさほど変わらないし、基本デスクで座って仕事をしているか、ゲームをしているかなので、家全体を活用する機会があまりない。
 なんなら、風呂やトイレのために階段を上り下りする苦労が増えただけだ。ガレージでBBQをしてる時だけ、家を買ったメリットを感じる。
 あとは猫か。まだ子猫で、なんにでも興味を持つし、なんでもやらかすので気苦労が絶えない。子育てか?
 今までヘビや魚しか飼ってこなかったから気にならなかったが、自分と同じ哺乳類であるはずの猫が、ありえんくらいアホな行動をとると、ちょっと笑ってしまう。言い方が悪いが、人間とそれ以外の生き物の知能の差を実感する。目の前のコンピューターを見て、人間のポテンシャルのヤバさを再認識するのだ。神が居たら、地球にこんな高度な文明を持つ生物が誕生することに驚いてるんじゃないか? 人間的な感覚でいえば、猫がいきなりガウス積分を解き始めるような衝撃だろ。

    • -

 最近株取引に結構ハマっている。超素人だが、一種のマネーゲームと割り切って、なんとなく取引して楽しんでいる。意外と、株価が上がったり下がったりを確認するイベントが1日に追加されるだけで、何となく日常が充実しているように感じるのだ。
 私は細かい数字はわからないので、単純移動平均のグラフをざっくりみて、長期的に上がっていて、短期的に下がっていれば買う、そして上がったら売る。それを繰り返すことしかしていないが。PERってなんやねん。
 それでも、そこそこプラスにはなった。もちろん、現在保有している株で含み損が結構あるものもあるが、基本的に大企業の株しか買ってないので、長い目で見れば、また上がる期待値や、配当金、株主優待などを考えると、含み損自体はそんなに損にはならない、はずだし。(知らんけど)
 でも会社からRSUでもらった自社株が暴落しまくっているので、そのせいでトータルではめちゃくちゃ損をしている。もともとぼたもち的な株だけども。

    • -

 FF14 6.0 暁月のフィナーレが出た。ちょうどさっきメインストーリーが終わった。内容については差し控えるけど、話のスケールがでかくなって宇宙に舞台が移る作品見るたびに「実質グレンラガンじゃん...」ってなるのやめたい。
 FF14については、4.4あたりから始めたけど、絶コンテンツ二つクリアしたのもあって、自分の中では一区切りついている。相当楽しませてくれたのもあるし、これからも応援しているから、プレイ権は買い続けると思うけど、ストーリー追っかける以外のことはもうやらないと思う。
 FF14は本当にライト向けMMOとしては完成されていると思っていて、コンテンツの規模もコミュニティのでかさも最高峰。これを超えるMMOは二度と出ないんじゃないかってくらい。
 でも、個人的には、FF14ハクスラではないので、根源的に私がMMOに求めるゲーム体験が存在しないんだよね。FF14の世界観、キャラクター達、関わってきたコミュニティすべてが好きだったけど、ゲーム性そのものについては最後まで少し不満だったかもしれない。
 高難易度レイドではヒーラーをやっていたけど、クリアまでは滅茶苦茶ヒーラーの負担でかくて、周回では速度出すためにヒーラーなのにヒールを極限まで減らして殴る回数増やすっていうゲームデザインも割と微妙だと思っていたw

 次なる国産MMOとしては、ブループロトコルに期待しているんだけど、マジであのゲームいつリリースされるの?

    • -

 仕事に関しては守秘義務に気を遣いつつ様々なコンテキストを排除して話すのが面倒くさいので何も書くことがない。
 ただお手伝いしていたプロジェクトがリリースされずポシャった事件があって、一時期気を病んでいたころがあった。

    • -

 2021年、月に6、7回英会話レッスンをやるのを何とか続けられた。
 我ながら偉いと思っているが、一向に「何となく雰囲気で英語を理解している状態」から全く脱却できる気配がない。
 英語をババーーっと聞いたとき、センテンスそのものを逐次理解しているわけではなくて、耳に入ってくる聞き取り可能な単語や言い回しをとにかくかき集めて、全体の文脈を考慮して40-60%ほどの情報量から、全体の内容を推測する、みたいなリスニングしかできない。
 もしかして私センスない? 少なくとも、もっと勉強時間を確保すべきなのは間違いないのだが、工学や数学の勉強と違って、リスニングの練習は古代MMOのレベリングみたいな辛さがあるのよな(しかも、レベルが目に見えない)。単語の意味を覚えたりするのはわかりやすくマイルストーンがおけるけど、結局日常的に使わないから1か月で忘れるっていう問題がある。。。難しいな、言語学習。
 でも、英語のドキュメントは結構すらすら読めるようになってきたから、何とかよかった。

    • -

 ソースは忘れたけど、友達いない奴の特徴として、「知り合いと友達の境界線を気にする」という主張があって、ドストレートに私の心にぶっ刺さって致命傷を受けた。
 似たような話題として、誕生日プレゼントをあげる/あげないって難しいよな、って思う。
 前提として知り合い全員に誕生日プレゼントを配っていたらキリがないけど、じゃあ誕生日をあげる/あげないの境界線を知り合いの中に引く行為ってめっちゃ嫌じゃないか?
 あるいは、別にそれほど仲良くないけど社交辞令として仕方なく誕生日プレゼントあげるか、みたいなものとか。
 私は基本的に他人が自分に何かをしてくれることを期待していないし、そういった葛藤を与えることは本意ではないので、基本的に他人に誕生日プレゼントを要求することは一切ない。
 でもそれが典型的な友達いない奴の思考回路なんだろうなとか思った。友達多いやつはそういう人間関係上のしがらみを呼吸のようにこなすんやろな。

    • -

 普段普通に配信しているVチューバーが、唐突にDLSiteにエロ同人音声を販売して荒稼ぎをしてるのを見て、バーチャル風俗じゃん...って思った。
 配信で友人のような距離感を与えつつ、音声作品で性欲を突いてくるの、ガチャ並みに人間の脆弱性をついた商売だと思った。すごいっすね、令和。


 書くことがなくなった。2022年も頑張って生きたい。

猫飼育における初期費用まとめ

知人から保護した猫を引き取った。
二十歳くらいのときに、広いマンションで猫を暮らすことが人生のゴールだなと漠然と考えていたので、ゴールを迎えたことになる。
あとはゆっくり終わりに向かっていくだけである。


ところで、猫を飼いたい人間が周りにいっぱいいるので、どの程度初期費用がかかるのか、なんとなく需要がある気がしたのでまとめる

バズってたツイートに「里親募集をしていたら老夫婦がお金がないので無料で譲ってほしいといわれたが、丁重にお断りした」というものがあった。
実際その通りで、ペットを飼うというのは非常に金がかかるので、ある程度の貯金と生涯猫を養っていく覚悟が必要だなという印象を受けた。

というか、ペットショップで純血種を買おうとするとそれだけで30万~50万かかることに衝撃を受けた。

ちなみにお金ないけどペットは飼いたいという方にはヘビをお勧めします。初期費用、維持費用ともにほとんどかかりません。

設備、消耗品リスト

Amazon | 【Amazon.co.jp限定】 デオトイレ 猫用トイレ本体 ハーフカバー本体セット AZ シルキーホワイト 猫用 | デオトイレ | トイレ本体 通販

トイレ。普通に便利で使いやすい。ちなみに、砂がすべてを吸収して砂ごと処分するタイプのトイレと、液体は通過してうんちだけ回収する、シートが必要なタイプのトイレの二種類があるらしい。これは後者。
¥ 2,607

Amazon | デオトイレ 1週間消臭・抗菌シート 10枚入り×3個 | デオトイレ | トイレシート 通販

トイレシート。尿は砂を貫通するのでそれを受け止めるシート。一週間に一度程度交換する。
¥ 2,350

https://www.amazon.co.jp/gp/product/B08T1PDTDG/ref=ppx_od_dt_b_asin_title_s01?ie=UTF8&psc=1

うんち袋。意外と大事。
¥ 2,650

https://www.amazon.co.jp/gp/product/B01FX961WI/ref=ppx_yo_dt_b_asin_title_o04_s00?ie=UTF8&psc=1

猫砂。一袋で一か月もつらしいが、うんちを回収するときに雑にスコップですくってたら2週間でなくなった。
¥ 1,497

https://www.amazon.co.jp/gp/product/B014VSFDJE/ref=ppx_od_dt_b_asin_title_s01?ie=UTF8&psc=1

ごはんの皿。ぶっちゃけなんでもいいと思う。
¥ 799

https://www.amazon.co.jp/gp/product/B08T1T9BYG/ref=ppx_od_dt_b_asin_title_s01?ie=UTF8&psc=1

ブラシ。後から聞くに、ファーミネーターというブランドが有名らしく、そっちを買っておけばよかったと少し後悔している。
これはあんまり毛がとれないけど、換毛期じゃないからなのか、このブラシが低スペックだからなのかがいまいちわからない。
¥ 1,390

https://www.amazon.co.jp/gp/product/B08FDCRJ6Y/ref=ppx_yo_dt_b_asin_title_o06_s02?ie=UTF8&psc=1

つめとぎ。正直ただの段ボールにしか見えないのだが、猫のなにかしらの本能をくすぐるようで、何もしつけなくても勝手にこれで爪を研ぎだした。
¥ 1,720

https://www.amazon.co.jp/gp/product/B095BY1PJF/ref=ppx_od_dt_b_asin_title_s01?ie=UTF8&psc=1

キャリーケース。これがなくては病院にも連れていくことができない。
¥ 2,940

https://www.amazon.co.jp/gp/product/B07Z9CRPJ8/ref=ppx_od_dt_b_asin_title_s01?ie=UTF8&psc=1

ふわふわクッション。ただしうちの猫は全く気に入らないようで、抱っこして上にのっけても速攻で脱走する。仕方なく私が昼寝するのに使っている。
¥ 2,000

https://www.amazon.co.jp/gp/product/B07GGGJHZW/ref=ppx_od_dt_b_asin_title_s01?ie=UTF8&psc=1

爪がするどいと肌を破壊されるのでこまめに切ろう。うとうとしてるときにさっと手早く行うと平穏に終わる。
¥ 1,476

https://www.amazon.co.jp/gp/product/B07W5YYGFS/ref=ppx_od_dt_b_asin_title_s01?ie=UTF8&psc=1

無駄に高性能な水飲み器。フィルターがついているので、ある程度清潔。
¥ 2,980

Amazon | チャオ (CIAO) 猫用おやつ すごい乳酸菌ちゅ~る 総合栄養食バラエティ 14g×30本 | チャオ (CIAO) | お菓子・スナック 通販

ちゅーる。悪魔のおやつ。これを与えると猫は狂ったように喜び、どんなに怒らせてしまってもすべて水に流してくれる。
¥ 1,680

https://www.amazon.co.jp/gp/product/B0936BZX4P/ref=ppx_od_dt_b_asin_title_s01?ie=UTF8&psc=1

ねこじゃらし。星形のアクセサリーがついているのだが、それが鋭利な形をしていて危ないと感じた。それだけ切り取って処分した。
猫の興味を引くようにねこじゃらしを動かすのはなかなか技術がいるようで、修行の毎日である。
¥ 1,598

https://www.amazon.co.jp/gp/product/B07XKZCJBF/ref=ppx_yo_dt_b_asin_title_o03_s00?ie=UTF8&psc=1

ごはん。恐ろしいほど安く、大丈夫なのか?と心配になるが、一応食べてくれる。ドライフードは最悪置きっぱなしにしてもいいので、日中や出かけるときなどに多めに置いておく、ということができて便利。
¥ 719

https://www.amazon.co.jp/gp/product/B08FGPPQ6B/ref=ppx_od_dt_b_asin_title_s01?ie=UTF8&psc=1

ウェットフード。少しお高いやつ。毎朝一回だけ与えるのだが、うちの猫は大層気に入っていて、起床して猫にあいさつすると激しくにゃーにゃーと鳴いて要求してくる。薬を混ぜても完食率100%。安いフードだけだとかわいそうなので、こういうお高めのごはんをあげるのも飼い主の務めかな、と思っている。
¥ 1,889

https://www.amazon.co.jp/gp/product/B07G7673HY/ref=ppx_yo_dt_b_asin_title_o06_s00?ie=UTF8&psc=1

うちの猫は噛み癖がひどく、手が穴だらけになるので、かわりに嚙んでもらうための棒。一応効果はあったが、結局最近は飼い主の手のほうが噛み応えがあるようで、結局毎日噛みつかれている。
¥ 1,099

https://www.amazon.co.jp/gp/product/B082WV5QLX/ref=ppx_yo_dt_b_asin_title_o07_s00?ie=UTF8&psc=1

コードカバー。猫はめちゃくちゃコードを噛むので、こういったケアがないと大変。
¥ 1,400

楽天ビック|ソニー SONY フルワイヤレスイヤホン WF-XB700 BZ ブラック [マイク対応 /ワイヤレス(左右分離) /Bluetooth] 通販

ワイヤレスイヤホン。いやこれは猫関係ないだろ、と言われるかもしれないが、普段使っているイヤホンで全く問題なかったのに、有線だと猫にめちゃくちゃ狙われるので仕方なく買ったのだから、これも猫のための費用の一つである。
¥ 13,132

https://www.amazon.co.jp/gp/product/B08R57BLNK/ref=ppx_od_dt_b_asin_title_s01?ie=UTF8&psc=1

ブラッシング用のドライシャンプー。猫はありえないほどシャンプーを嫌がるので、普段の手入れはこれ。
¥ 2,970

https://www.amazon.co.jp/%E3%83%9A%E3%83%83%E3%83%88%E3%82%AD%E3%83%AC%E3%82%A4-4903351004276-%E4%BD%8E%E5%88%BA%E6%BF%80%E3%82%B7%E3%83%A3%E3%83%B3%E3%83%97%E3%83%BC-%E5%AD%90%E7%8A%AC%E3%83%BB%E5%AD%90%E7%8C%AB%E7%94%A8-220ml/dp/B07B9P7FQF/ref=sr_1_7?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=%E7%8C%AB+%E3%82%B7%E3%83%A3%E3%83%B3%E3%83%97%E3%83%BC&qid=1627027239&sr=8-7

シャンプー。月に一回くらいする予定。猫は水を怖がるが、飼い主はそれ以上に猫の抵抗が怖い。
¥494


ここまでで47388円(内、ワイヤレスイヤホンが13132)。

医療費

次に病院の費用。ペットショップから購入する場合、健康が保証されていると思うので、この費用はかからないかもしれない。
うちの猫は野良出身なので、必ず最初に病院に連れて行って検査をする必要がある。案の定、寄生虫に感染していた。

(猫を保護した知人が行った診察)
診察0回目 ノミ、ダニ駆虫薬
¥3,000

診察1回目 検便、初診料、寄生虫駆虫薬
¥6,160

診察2回目 検便
¥2750

診察3回目 抗生物質寄生虫駆虫薬
¥ 5250


また、最低でも通院があと1回、ワクチン接種が4回、避妊手術が1回あるので、これの数倍はまだ医療費がかかる見込み。
最終的にはトータルで4万前後になると思われる。

また、猫ちゃんの移動にはストレスをさけるためすべてタクシーを使っているため、そちらの交通費もなかなかバカにはならない。

すべてこみこみで、仮に無料で猫を引き取っても、トータル10万円程度の初期費用がかかる。

猫を幸せにするためにも貯金はしっかり確保してから飼育しよう。

おわり。

近況、家を買った話など

 人生は爆速で過ぎて行き、気づいたら今月で20代の折り返し地点となる25歳になった。

 私は小学生の時からメイプルストーリーをはじめとするいくつかのオンラインゲームをやっていたし、社会に出たのも20歳だったので、学校以外で身の回りの人間が年上というのは自身にとっての当たり前だった。
しかしこの頃、会社には次々と年下の新入社員が入社してくるし、FF14のレイド攻略の固定メンバーは年下ばかりだ。否応がなく、自分がもう最若年齢気取りではいられないことを実感させられる。

 社会に出た当時は、2~3年おきに転職を繰り返し、やりたいことをやりまくる刹那的な人生を送るんだと漠然と考えていたが、蓋を開けてみれば大企業に根を張ってのんびり生きている。
 収入は安定しているし、仕事は忙しすぎることもなく、プライベートではゲームであったり読書であったり、好きな時間を十分に過ごすことができているので、特に現状に不満がない。向こう数年は転職することもないだろう。
 C++とかいう古の言語で仕事をしているせいで、新鮮な技術に触れる機会が少なく、20代というもっともインプットを大事にすべき時間を棒に振っているきらいはあって、多少の危機感を感じなくはないが......まあ会社員として生きてればそういうこともあるだろうを割り切って生きている。
 ある種の意識高い系の界隈からは軽蔑されるような生き方かもしれない。


 ところで、最近よくゲームプログラマーは労働量の割に給料が安いみたいなツイートをよく見かける。
 これはコンシューマーの世界の話だと思っていて、Webベンチャーの派生であるソーシャルゲーム業界では、あまりそのような傾向はない。AppStoreランキングの上位常連の企業はすべからく社員に適切な給料を払っているだろう。一般的に揶揄されるメテオフォール開発が行われている現場も滅多に見ない。忙しいところは忙しいが、プロジェクトマネジメントの努力は最低限なされていると思う。
 
 だが世間的にもソシャゲはゲームじゃねえ!という声も少なからずあり、それなら我々はゲームプログラマーの定義に当てはまらないのかもしれない。悲しいことだ。
 ガチャが非常に頻繁に批判に晒されているのを見るとやるせない気持ちになる。我々開発者だって、別に集金だけがしたいわけではなくて、価値のあるものを提供したいという思いでゲームを作っている。
 ただ、日本のゲーム業界のビジネスモデルとして、もっともガチャというシステムが優れているだけだ。感情よりもビジネスが大事にされる場面なんて、世界のいたるところに溢れているというのに。

 もちろん、コンシューマーでも大きく成功し続けている企業はある。
 ただ、現在、ユーザーがゲームに求めるクオリティは高くなりすぎて、ゲームの開発規模は際限なく肥大化していく。一本のゲームを作るために何十億の開発費やマーケティング費がかかっている。
 しかしゲームそのものの値段は今も昔も変わらず、6000~8000円程度だ。

 もはやコンシューマーのゲーム業界は巨大な資本を持つ企業しか参入することができないだろう。それを是としたのは、ソーシャルゲームを「低クオリティ」「クソゲー」と揶揄するメンタリティに他ならないと思う。

 
 もちろん、大企業ではない会社がリリースしていて、成功したコンシューマーゲームもある、最近だと、サクナヒメが挙げられるだろう。
 ただそのサクセスストーリーの裏には、代表が借金をしながら開発をしたり、パブリッシャーを外部に置き販売権を譲渡するなど、多大な苦労が見え隠れする。

 それでも尚サクナヒメは無事リリースされ、ヒットした。本当に泣ける話だ。そしてやるせなさも感じる。きっとこのような成功の陰では、開発が断念されたもの、リリースしたがヒットしなかったもの、多くのゲームクリエイターの悲鳴が多くあるのだろう。
 
 まあ、そういったリスクを背負うことが出来ず、会社員に甘んじている私がこんな話をするのは、卑怯なのだろうが......


 さて、去年の秋ごろ、リモートワークの影響で会社から徒歩圏内のマンションに高い金を払って住む理由がなくなり、引越しを決意した。
 次に住む家はペットがOKなところが良いと考えていた。家に時間がいる増え、ペット的な存在が恋しくなったからだ。ただ、都内でペットOKのマンションというのはかなり敷居が高く、絶望的だった。
 そのため、安定志向に心変わりした背景もあり、一戸建てを購入することにした。



 周りの人間は「家を買う」という字面に面を喰らっていたが、実は家を買うというのはそんなにハードルの高いものではない。
 私は不動産投資家ではないので自分の発言に一切の責任は持てないが、都内で家やマンションを買うことは、高い賃貸に住み続けるよりよっぽど建設的だ。(ギャグではない)
 ワンルームマンションみたいなところで安い家賃で暮らすことが苦にならないのであれば、家なんか買う必要は一切ないと思うが、家賃に10万円とか払うくらいなら、家を買った方がいいと思う。
 都内ないしその近辺では住宅の需要は非常に高く、築20~30年の一戸建てでも、新築一戸建てより多少安いくらいでしかなく、有事の際の売却を視野に入れることも可能だ。20年後単位になってくると日本がどうなっているかわからないけれど。
(ちなみに田舎の中古の一軒家の需要はゴミらしい。少子化が進めば尚更だろう。)

 更に、現在は低金利時代と呼ばれていて、恐ろしいほど住宅ローンの金利が安い。
 また、新築一戸建ての住宅ローンを組んだ場合、10年間税金控除が受けられる。その金額は借入残高の1%で、最大年間40万。これは固定資産税を考慮しても余りある莫大な金額だ。
 つまり最大4000万円の家まで控除を受けることができ、その場合35年ローンを組んだとしても返済額は月に10万円ほどにしかならない。そして、10年後には木造住宅の固定資産価値はほぼゼロになるので土地のみの固定資産税になっているためそれほどの負担にはならないはず。

 つまり、家を買うということは、賃貸よりも安い家賃で広い家に住むことが出来、税金控除を受け、そして最終的に資産が残るというメリットを享受できるということだ。
 賃貸のメリットとしては、天災などのリスクがない、引越しを繰り返せば常に新しい住居に住むことができる、転勤や転職などに対応できる、あるいはワンルームマンションなどで極限までコストを削減できる、固定資産税を払わなくてよい、などがあるだろうか。


 ちなみに、家の値段は3680万円で、もろもろの諸費用を合わせて3900万ほどになった。私は優良な不動産屋を選んだため、仲介手数料がかかってないが、実際には仲介手数料の相場となる「家の価格3%+6万円」である120万円がこの上に乗ることになる。
 不動産屋選びは慎重にした方がいい、たいていの大手はこの「家の価格3%+6万円」という決して少なくない金額を請求してくるためだ。
 そして、一度物件を内覧するときに仲介してもらった不動産屋を後から変えることはできない。これは暗黙の了解的な問題のようだ。すべての不動産屋は共通の物件のデータベースの閲覧権限をもっており、物件の仲介自体はどんな物件でもすべての不動産屋で可能なので、物件よりも先に不動産屋を選ぶべきだとは思う。

 自己資金は私は400万ほど用意したが、これが十分かは本人の社会的信用による。銀行は一般に自己資金が少ない顧客は信用してくれないため、スムーズに住宅ローンを借り入れるためには、ある程度の自己資金が必要だ。
 ちなみに、私は「独身」「持病もち」「勤続年数が数年」という役満が揃っていたので借入で死ぬほど苦労した。どれくらい苦労したのかというと、銀行7社くらいと交渉した。特に持病の問題が深刻で、銀行の審査が下りても、団体信用生命保険と呼ばれる保険会社の審査が通らないことが多々あった。かなり絶望的な状態であったが、不動産屋の努力の甲斐あって無事に現在は借入に成功している。


 まあ、別に私は不動産購入を布教したいわけではないのでこの辺りにしておく。各々好きな人生を生きたらよいと思う。 


 かくして、私は、持ち家を獲得し、新たな人生のスタートを切った。
 これからは積み立てNISAや、ふるさと納税個人年金保険など、非常にリスクの低い投資や、税金対策などを行いつつ、独身生活を満喫していく予定である。こういった資産運用については、またそのうち別途記事を立てたい。
 積み立てNISAはコロナウィルスパンデミックの影響で、世界的に株価が下落した影響でめっちゃリターンが増えた。なぜ株価が下落したのにリターンが増えたのかというと、毎月同じ金額投資しているため、株価が下落すると買える量が増えるからだ。そして、人類が滅びない限り、経済は発展し続けるため、インデックスファンドのような商品に対して投資している場合、かならず評価価値は上がっていくためだ。

 f:id:riyaaaaasan:20210207185830p:plain

 これは私のNISAの保有商品一覧だが、商品によっては30%増えている。適当にファンドを選んで一定金額クレカから引き落とされているだけなのに、金が増えていく様は感動すら覚える。


 あとは結婚さえすれば人生のゴールともいえるのだが、残念ながらその予定は全くない。
 タイムイズマネーの原則に従えば、恋愛は恐ろしいほどハイリスクだ。空から美少女が落ちてくることを願うしかない。
 
 
 2021年も良い年でありますように。

蛇を飼い始めて1年余りが経った

皆さん蛇を飼っていますか?
蛇は令和で今最も注目されているペットです。ソースはありません。

蛇を飼っていると話すとギョっとされることが多々あるのですが、ほ乳類よりもよっぽど扱いやすく、初心者向けのペットだと思います。
もちろん種類によって様々ですが、私の飼っているコーンスネークを例に挙げると、以下の特徴が挙げられます。

・エサ代が安い(月五百~千円程度
成体だと週一ペースでしかご飯を食べないので、月に4匹マウスを与えるだけです。マウスは冷凍のものをアマズゥーンで買うことができます。

・静か
基本的にとぐろを巻いてじっとしています。声帯もないので声を発しません。

・世話が楽
キッチンペーパーをしいたケージで飼育し、フンが生じたらキッチンペーパーを取り換えるだけです。
温度管理はコーンスネークは意外と適当でよく、全身漬かれる水場をおいておけば、冬場だけケージの半分にパネルヒーターがあたるように設置するだけで、あとは勝手に体温調整してくれます。

・かわいい
かわいいです。


たまに勘違いされるのですが

>生きてる餌しか食べないんじゃないの?
カエルやカメレオンなどは一部そういう種類が要るみたいですが、ヘビは生餌しか食べないみたいな話は聞いたことないです。

>噛みついてこない?
コーンスネークは非常に大人しい子が多いです。

>湿度・温度管理大変なんじゃないの?
一部爬虫類は厳密な管理がいるそうですが、コーンスネークは適当で大丈夫です。



購入直後のヘビ
年齢はべビー~ヤングくらいな感じです

youtu.be

f:id:riyaaaaasan:20200806184254p:plain

かわいいね


これは最初のえさやりです
かなり苦戦してますね、今ではエサを与えたら1秒で喰いつくんですけどね

youtu.be


これはヘビのあくびです
性格には「あご直し」と呼ばれるもので、ご飯のあととかにたまにやってます
一回生で見てみたいと思っていたので、撮影できたときは歓喜でしたね

youtu.be

youtu.be



これはある日家に帰ったらヘビがえらいことになってたという動画です
呑気に動画撮ってる場合か!って感じですが、シェルターの重さごときで死ぬようなヤワな体ではないです むしろ今では私がヘビを首に巻いたりして遊んでるとそのまま絞殺されそうになるくらいなんですよね

youtu.be


これは奇跡の一枚ですね ヘビが人間の手の上でこんなに大人しくなるなんてほぼないです
多分使い捨ての手袋をつけているのが大きいんでしょうね 熱をもった巨大な手というものはヘビにとっては危険因子ですから。 でもバカだから手袋つけただけで熱を感じなくなって床にいるような気持ちになっているんじゃないですかね

f:id:riyaaaaasan:20200806190037j:plain


ヘビは懐くの?ということをたまに聞かれますが、人に慣れることはあっても懐くことはないと思います。結局ヘビにとって人間というのは強大で危険な存在ですから、対等な関係になることは難しいでしょうね
「虫は人間に懐くか?」という問いにはほとんどの人がNoと答えるでしょう。多分ヘビは知能のレベルがほ乳類と虫どっち寄りかと言われれば、多分虫寄りなんですよね

とはいえ、たまにこうやって袖になかにもぐりこんで落ち着いてる姿を見たりすると、ヘビがまるで懐いているかのような気持ちになってうれしくなっちゃうわけですね

f:id:riyaaaaasan:20200806191622p:plain


これはヘビの水飲みです ヘビだってもちろん水を飲みますよ かわいいね

youtu.be


ヘビがある程度大きくなってからはファジーマウスをあげるようにしました
ファジーはまあ毛が生えたばかりの若い個体くらいな感じですかね

youtu.be



ところでうちのヘビには名前はないんですが、普通ペットには名前をつけるでしょみたいなことをよく言われます
でもヘビには耳はないんですよね 体全体で振動を感じる機能はあるのですが、それが人間の定義する「音」と同義なのはよくわかっていません
当然ヘビは自分の名前を識別することはできないので、名前をつけることに一切の合理性を見いだせないんですが、マジョリティの人々はそれでも名前をつけるみたいですね やっぱ皆お気に入りの家電とかにも名前をつけるのかな


コーンスネークは10年近く生きるので、私が30代のおっさんになっても隣にいてくれるわけです 健やかに生きろよな


おわり

0からRaspberry Pi 4でさくっとマイクラサーバーを建てるまで

知人からマイクラサーバーを建ててくれと頼まれたから仕方なく0から環境構築した話をするよ。

私はケチな上にパソコンの寿命管理にうるさいので(すぐ壊れるから)、自分のメインマシンを24時間稼働させるのは絶対嫌だし、電気代もかけたくなかった。
こういうときはやっぱり消費電力が超少ないシングルボードコンピュータRaspberry Piに限る。

昔私は2系を使っていたけど、最新のラズパイは4だそうだ。CPUも1.5GHzのクアッドで、メモリも4GBついてるらしい。
最大消費電力は6Wらしいので、24時間ずっと稼働させても電気代は月100円くらい。

というわけでこれを買った↓
LABISTS Raspberry4 4B-32GB(技適マーク入)MicroSDHCカード32G/NOOBSシステムプリインストール/カードリーダ /5.1V/3A Type-C スイッチ付電源/MicroHDMI-to-HDMIケーブルライン/三つヒートシンク/簡単に取り付けケース/日本語取扱説明書/24ヶ月保証
@amazonJPさんから

とりあえず悩んだら絶対これを買った方がいい。ファン、ヒートシンク、OSプリインストール済Micro SD、HDMIケーブルがついてくる。

OSプリインストール済みSDがあるので、起動してちゃちゃっと環境構築するだけ。普通に起動するとGUIが立ち上がるけどコンピューターリソースの無駄なのでさっさとCLIで起動しなおしたほうがいい。

とりあえずエディタはあったほうがいいので

sudo apt-get install vim

はやっておこう。(個人差アリ)

ローカルIPを固定する

多分デフォルトではDHCPを使ってると思うから、/etc/dhcpcd.confを弄る。

例えば、私のネットワーク環境はネットワークアドレスが192.168.11.0で、ルーターのアドレスが192.168.11.1で、サブネットマスクが255.255.255.0で、ローカルIPのホストの数字は(なんでもいいけど)25を割り当てたかったので、以下のようにした。

interface wlan0
static ip_address=192.168.11.25/24
static routers=192.168.11.1
static domain_name_servers=192.168.11.1

wlan0は無線のこと。無線の場合、そもそもインターネットにつなぐ必要があるので

wpa_passphrase  [SSID] [pass]

しておくこと。ちなみにケーブル管理が絶望的に不得意じゃないのなら有線にしたほうがいいです。マジで。サーバーのレイテンシ全然違うよ(無線の人間が何言ってるんだって話だが)
DNS(domain name servers)アドレスってなんやねんって思った人は、まず間違いなくルーターのアドレスいれれば動くと思う。

(03/15 追記) サーバーの遅延について抗議されたので有線接続にした。IP固定の方法はinterfaceをeth0にするだけで他は同じ

rebootすればIPが目的のものになっているはず。

公開鍵を登録してSSH接続できるようにする

ラズビアン(ラズパイのデフォルトOS)はデフォルトでSSH接続ができるから、もうすでにSSH接続できるっちゃできるけど、セキュリティ的にも公開鍵を使ったほうが良い。

公開鍵の作り方はいくらでも資料があるのでぐぐってください。

自分のSSH接続したいメインPCで公開鍵を作ったら、scpコマンドでラズパイのホームディレクトリに転送する。
ユーザーネームはpiとすると

scp ./.ssh/id_rsa.pub pi@192.168.11.25:~/

次、ラズパイのコンソールに入って

mkdir .ssh
cat id_rsa.pub >> .ssh/authorized_keys
chmod 700 .ssh
chmod 600 .ssh/authorized_keys

chmodしているのは念のため。sshはセキュリティ上この辺のファイルのパーミッションがガバガバだと弾かれるので。

これで公開鍵接続の準備は整ったので、パスワード接続を禁止する。
/etc/ssh/sshd_configを開いて、

PasswordAuthentication no
PubkeyAuthentication yes
AuthorizedKeysFile  .ssh/authorized_keys

と記載しておく。

メインPCに戻って、./ssh/configで、ラズパイのホストの名前をつけてあげる。
名前はなんでもいいけど私はpi4にした。タイプ数少ないの最高!

Host pi4
    HostName     192.168.11.25
    IdentityFile    ~/.ssh/id_rsa
    User            pi

もうこれですぐつながる。

ssh pi4

ポートを開ける

イクラサーバーのデフォルトのポートは25565。自分のルーターのマニュアル見ながら開放しよう。
ちなみに私はv6プラス接続なので、開放できるポートには制限がある。その場合もポート変換をかませば可能。
ここは各自ルーターのベンダーにお問い合わせくださいといった感じなので割愛する。

イクラサーバーのダウンロード、起動

ラズビアンには多分JDKが最初から入ってたはずなので、ダウンロードしてすぐ起動できるはず。

適当にディレクトリ作って、 Download server for Minecraft | Minecraft ここからダウンロードリンクを取得したら

mkdir minecraft
cd minecraft
sudo wget DOWNLOAD_LINK

すると、ディレクトリにサーバー関連ファイルと、利用規約の同意書(eula.txt)が展開されるので
エディタでeula.txtをtrueに書き換える。(公式ページの利用規約を読んでから)

これで準備は完了。
ラズパイ4はメモリ4GBなので2GBくらいアサインするとして

sudo java -Xms2G -Xms2G -jar server.jar nogui

で起動。これでサーバーが全世界に公開されました。

ログ公開サーバーを作る

私はニートの知人にサーバーを貸してるので、仕事中に昼間からマイクラを遊んでる様子をみて励みにしたいから、ログが見れるHTTPサーバーを建てた。

ログサーバーなんて適当でいい、nodejsでちゃちゃっと書こう。ちなみにnodejsはラズビアンに既に入ってた。すげーなおい!

適当にディレクトリ作って、適当に.js拡張子でファイルを作って

var http = require('http');
var fs = require("fs");

const port = XXXX; // 適当なポート
const server = http.createServer((req, res) => {
        if (req.method == "GET") {
                var data = fs.readFileSync(".path/to/minecraft/logs/latest.log");
                res.writeHead(200, {"Content-Type": "text/plain"});
                res.end(data);
        } else {
                res.writeHead(404, {"Content-Type": "text/plain"});
                res.end("Sushi is not found");
        }
}).listen(port);

はい終わり。これはひどい! GETされるとリクエストパス関係なく常にマイクラサーバーの最新ログを返すだけのサーバー。それ以外のメソッドは404!
いいんだよこういうので。最高に堅牢なサーバーは何もしないサーバーだからね。

ちなみに私は例によってv6プラスなのでHTTPポートが開けられないから、適当なポート番号でlistenしてるよ。

このサーバーはデーモン化させたかったのでforeverを使った。

sudo npm install -g forever 
forever start app.js  

これでどこにいてもサーバーが元気に稼働してる様子が見られる。

終わり。

結局オブジェクト指向とはいったいなんなのかとか、ゲームの設計に関して最近思うこと

2兆年ぶりにブログ記事を書いている気がする。レンダリングエンジンの開発に飽きたからこのブログはほぼ用なしになってしまった。ただ、最近プライベートでプログラムを書いてなさすぎるので、リハビリに再開するのもいいかもしれない。プログラムを書くのは好きだが、致命的に目的意識や目標となるエンジニア像が存在しないため、具体的なマイルストーンを設置しないと絶望的に怠惰になりがちだ。

しかし、最近転職してから「設計」というものを考える機会が莫大に増え、それに関しての自身のナレッジ、あるいはモヤモヤなどを文章化することで、自分の中で情報を整理しようと思い立った。

私はゲームプログラマーだ。作っているゲームはリリースされてから数年が経ち、ソースコードの量は膨大で、そしてありがたいことに収益が安定しているため、数年後もちゃんと保守できることを前提として設計しなくてはならない。

私のチームのクライアントの開発の要素として大きく上げられるものとしては、オブジェクト指向設計アジャイル開発の2つがある。巷ではどちらもある種のバズワードのような扱われ方をしている。確かにすべてが上手くいく魔法のような開発手法というわけではないことは確かだが、果たして数年続き、大人数で行われる私のチームにとっての開発スタイルとして正しいのだろうか、そういつも考えている。といっても、アジャイル開発に関してはマネジメントの領域なので、その是非については1エンジニアに過ぎない私には判断できない。

オブジェクト指向設計に話をフォーカスしよう。

で、実際のところ、「オブジェクト指向」を言語化して説明することは無理なんじゃないかと思っている。多態性とかカプセル化とかそういう言葉の定義を説明することは可能だが、いざプログラムを見せられた時に、「これはオブジェクト指向で設計されているか?」という質問に対して回答することはできない。オブジェクト指向プログラミング言語で書かれてますね、とは言えるかもしれないけれど。

この時点で、少なくともプログラムを評価したり、あるいは指導する際に「オブジェクト指向設計」という単語を使うことは不適切に感じる。定量化ができず、共通認識も取れない単語なんて地雷にしかならない。

結局、適切なケースにおいて適切なデザインパターンを適用する、適切な抽象化をする、適切なデータ隠蔽をする、そういった「ある局所的なケースにおいて常に適切な」選択を続けていく結果、再利用性や可読性が最強になる桃源郷のようなプログラムが生まれるという仮定のもと、それをオブジェクト指向設計と定義しているんだろう。だから、オブジェクト指向設計を目指すというのは見えてないゴールに向けて適当に走り出すようなもので、実際に私たちがやるべきなのは、もっと「良い設計」とやらを個々の問題に分解して、見えているゴールを目指すことだと思う。その結果、きっと私たちのプログラムはいつかオブジェクト指向設計にたどり着くんじゃないんかな。知らんけど。

設計に関する個々の問題についてなら、私もそれなりに思想がある。
以下に、私が経験則的に上手くいった設計方針の備忘録みたいなものをまとめる。もちろん個人的な思想なのでその辺は留意してほしい。


...思いついたら書き足す。

クラスは常にミニマムに設計する

モジュールは細かく要素分解されているべきだ。もちろん、一連の手続きをラップする上位的なインターフェースはあってもいいけれど、内部の構造としてはミニマムなクラスや関数の組み合わせによって実現されていてほしい。

例えば、AssetManagerというクラスを考えてみる。もうだめだ。作った時はいいけれど、担当者が変わるたびにインターフェイスが増えて、メンバ変数が増えて、そしていつか神にへと昇華するだろう。最初に設計した人はこのManagerクラスは美しいほどによくできたクラスだったのかもしれない。でも担当者が変わった瞬間に、この「Manager」という単語を都合よくとらえて、好き勝手に機能を継ぎ足ししてしまうに違いない。

「このクラスはこの仕事をします!」という設計者の意図を正しく伝えるためには、クラス名を適切にするしかない。このAssetManagerも適切な名前にすべきだ。といっても、リネームでは解決しない。クラスがミニマムではないから。

このManagerクラスがゲームで頻繁に要求される要件をすべて含んでいるとして、それらはAssetDownloder, AssetDependencyResolver, AssetCachePoolといった個々のクラスに分離できるはずだ。もちろん無理にクラスにしなくてもいい。ただの手続きであるのならば、関数でもいい。大事なのは、全ての部分問題を独立させて、適切な名前を割り当てることだ。そうすれば、後任者も機能を追加するとき、「え!? そこにコード加えるの!?」みたいなトンデモ改修をすることはなくなることが期待できる。

できるだけ副作用のないconst属性のインターフェイスを採用する

処理を記述するときは、結果を返り値で返して、内部の状態には変更を加えないようなメンバ関数を中心に定義すべきだ。
どうしてか? それは、ユニットテストが書きやすいから。これに尽きる。特に、処理に必要な情報を引数で受け取るように記述されていれば、もうテストが書くのが楽すぎて最高になる。テストの書きやすさは品質に直結する。そして、テストフレンドリーに設計されたクラスは、自然と「命名が適切で」「個々の関数の役割が明確な」クラス/関数になる。信じてもらえないかもしれないけど、経験則的にそうなると思っている。

class Hoge {
  void setData(Data data);
  void calculate();
  int getResult() const;
};

よりも、

class Hoge {
  int calculate(Data data) const;
};

のほうがいいよねって話だ。もちろん、こんな分かりやすいヘンテコなコードはめったに見ないが、本質的に同じコードはよく見かける。大事なのは「ユニットテスト」の「ユニット」とは、「一つの関数」であるべきということ。前者のコードの場合、このcalculate関数のテストを記述するためには3つの関数を実行する必要がある。それはユニットではない。

これは愚痴に近い雑談だが、テスト駆動開発はある種の理想だけど、ゲームではそれが難しいことも多い。ビューが根深く絡むし、この分野は仕様変更がかなり多い傾向にあって、仕様変更の影響で膨大な量のユニットテストを修正していると本当に虚無の感情となる。

セッター関数を減らす

セッター関数はあればあるほど設計者も使用者も混乱する。複数のプロパティの整合性、あるいは単なるデータのセットし忘れなど、落とし穴を生みがちだ。オブジェクトとして十分に振る舞うために必要なデータは全てコンストラクターや生成関数で受け取って、それ以降は変更を加えないべき。もしくは、本質的にはSetterでも、setという命名ではなく、そのデータの格納によってどのようにオブジェクトが振舞うのかを明示した関数名を定義する。簡単な例だと、setStateよりもchangeStateの方がインターフェイスとして明瞭ということ。

1つのクラスでフラグ変数を2つ以上定義しない

フラグ複数持つのは典型的なアンチパターンだ。(2^フラグの数)だけ状態が生まれるから。そして、必ずそれは設計者の想定の範疇を超えてバグを生み出す。
例を挙げてみよう。isTouchable、isVisibleのような二つのフラグを持つとする。この時、「タッチ可能で見える状態」、「タッチ可能だが見えない状態」、「タッチ不可能だが見える状態」、「タッチ不可能でかつ見えない状態」の4つの状態をこのオブジェクトは持ちうる。だが、多くの場合、この4つの状態全ての要件を満たす必要性があることはとても少ない。設計者も、暗黙的に「isVisibleがfalseの時は必ずisTouchableもfalseになるようにしよう」という思想で設計しているだろう。だが、「想定しない状態になりうる」それだけでバグを生み出すオブジェクトの脆弱性になる。見えないけどタッチできてしまうとかありそーなバグだ。設計者は完全に想定された状態を明示的に定義しよう。この場合、enumなどで Active(タッチもできるし見える), Deactive(タッチはできないが見える), Invisible(タッチもできないし見えない) のようなステートを定義するのが懸命だ。すると、件の起こりそうなバグは未然に防がれる。

if文はテスト可能な関数に集約し、ビュー側では書かない

これも突き詰めるとテストカバレッジの問題になってくるが、提言しておく。前提として、ビューのコードはテスト困難だ。というか、ビューのテストを実現できているゲームプロジェクトがあるのならばそのナレッジを共有して欲しい。まじでなんでもします。靴も舐めます。
さて、if文があるということは、その関数は毎回同じ動作をしないということだ。それは、つまりバグを生み出す。同じことばっかり言ってる気がするが、プログラマは複雑なロジックを書いた時必ずバグを出す。そしてそれを後任者が改修した時もっと顕著に現れる。それをどう防ぐか? ユニットテストだ。

幸い、ビューが絡まないロジックの場合はテストを書くことは困難ではない。if文があっても、カバレッジが100%になるようにテストを書こう。(もちろんカバレッジが100%だからといってテストケースが十分である保証は全くない)

例えばこんなコードがあるとする。

void initView() {
  /* ... */
  int64_t remainTimeSec = _model->getRemainTimeSec();
  if (remainTimeSec >= SECOND_PER_DAY) {
    _text->setString(format("残り%d日", remainTimeSec / SECOND_PER_DAY));
  } else if (remainTimeSec >= SECOND_PER_DAY) {
    _text->setString(format("残り%d時間", remainTimeSec / SECOND_PER_HOUR));
  } else {
    _text->setString(format("残り%d時間", remainTimeSec / SECOND_PER_MINUTE));
  }
 /* .. */
}

別に何が悪いというわけではない。ただ、ロジックがあるのに、この関数はビューにアクセスしているためテストできない。それは、不健全だ。

std::string formatRemainTimeText(int64_t remainTimeSec) {
  if (remainTimeSec >= SECOND_PER_DAY) {
    return format("残り%d日", remainTimeSec / SECOND_PER_DAY);
  } else if (remainTimeSec >= SECOND_PER_DAY) {
    return format("残り%d時間", remainTimeSec / SECOND_PER_HOUR);
  } else {
    return format("残り%d時間", remainTimeSec / SECOND_PER_MINUTE);
  }
}


void initView() {
  /* .. */

  int64_t remainTimeSec = _model->getRemainTimeSec();
  _test->setString(formatRemainTimeText(remainTimeSec));

 /* .. */
}


これならば、ビューの初期化コードは常に一貫性のある動作をし、そしてロジックはテスト可能なビューが絡まない関数に集約されているため、品質が保証できる。

protectedメンバー変数は邪悪

クラスというものは、インターフェイスを通じてやり取りするもの。だからこそ、オブジェクトはブラックボックスとして振舞うことができる。公開しているインターフェイスは、「想定された操作」だからだ。さて、ここで継承クラスについて考えよう。これはあんまり浸透している感じがしないのだが、継承クラスと基底クラスは 赤の他人 なのだ。もう少し具体的に言うと、基底クラスは、継承クラスが作られ、どのように拡張されるかを想定して設計することは困難ということ。たいていの場合、overrideやprotectedメンバー変数を悪用すると、基底クラスが「想定された操作」の範疇を超えて継承クラスは設計されてしまう。その状態になると、基底クラスの内部実装をリファクタリングしたりするだけで継承クラスの振る舞いが変わってしまい、不具合を引き起こす。他にも、ある基底クラスから派生したAとBという2つの継承クラスがあるときに、基底クラスはAとBの共通部分であることが期待できるが、本質的にはそうなっておらず、共通機能を実装するときに基底クラスを弄るだけで解決しないことがある。

これらを回避するために一番大事なことは、protectedメンバー変数を定義しないこと。継承先で自由にアクセスできる変数を基底クラスに置くことは、基底クラスが一切カプセル化されていないのと同義だ。たとえ継承先のクラスであっても、全てメンバー関数を通してならばある程度制御が効く。(ここで継承クラスのためだけのGetterとSetterを無理やり定義してしまうと、本質的な問題が解決しないので注意すること)

共通の要件を持つ複数のクラスを設計するとき、継承ではなく内含で設計する

これは前の項の「protectedメンバー変数は邪悪」の話の延長戦上にある。そもそも、継承で「共通の要件」を括りだすことは、保守的な面で非常に困難だ。特に、仮想関数を持ったりしている時点で、基底クラスがそれらの共通要件であり続けることはとても困難である。何度も言うが、将来的に第三者の手で改修されることを常に想定すべきだ。基底クラスで解決するという選択も、作りきりのプログラムではうまくいくかもしれないけれど、保守や改修が必ず困難になる。

内含は、共通要件である機能を完全なカプセルオブジェクトとして設計できる。設計者は、publicインターフェイスがどのように呼ばれるかだけ考慮すればよい。これは、仮想関数を持つ基底クラスを設計することよりも非常に簡単だ。

私は、動的ポリモーフィズムを用いて多態的に振舞わせたいという要件においてのみ、継承を使うべきだと思っている。