「オブジェクト指向設計実践ガイド」がすごくよかった

普段RailsでWebアプリを作っていて、いつクラスを作るべきか、どんなインターフェイスを作るべきか、そもそもよい設計やコードとは何なのかよくわからなくなっていた。

同僚に相談したらこの本を勧められて2017年に1回途中まで、年明けにもう1回全部通して読み直したのでいったんまとめる。

この本を読んでなおいろんな機能が詰まりまくったServiceクラスを作るPullRequestを出した自分に
丁寧にapp/models以下に単一責任の原則に基づいたプレーンなクラスを作って、ドメインモデルを表現するコードレビューをしてくれた同僚がいた。

ちょうどそのレビューの最中に教えてもらった記事がある。

qiita.com

この記事に出てくるダメServiceクラスみたいなものを本当に作りかけていて危機感を覚えたし、具体的な問題意識を持って本を読み直すきっかけになった。

いまその時とは違う職場で働いているが、当時のコードレビューや本、記事で言われている内容がかなり役立っている。

新しい環境でコードを読みながらキャッチアップする機会が多く再認識したことがあって
今までapp/models以下にActiveRecordを継承したモデルクラスだけが存在し、そのサービスのドメインロジックはそれっぽい名前のServiceクラスに手続き的な処理の羅列として閉じ込めるような書き方がされているコードをよく見た気がするし自分でもめっちゃ書いてた記憶がある。

こういうクラスがある場合に新しい環境でコードを読み始めてつらいと思ったのが、そのクラスがいったい何の責任を持ったクラスなのかわからなかったり、staticな呼び出しをされまくる便利クラスになっていて変更のためのコストが異常に高かったりすること。

たくさんの引数を渡してその内容によって処理の分岐をするif文の羅列、それに伴って膨らむrspecのcontextブロック
ロジックが詰め込まれていてしかもstaticに呼び出されたりすると、処理の内容を変更しようもんなら影響範囲がどこまで及ぶのか関数名でgrepして確認をしないといけない。(grepすれば調べられる分まだマシかも)

この本を読んでそういうコードを生まないためにどう対処するべきか、少しずつクリアに見えるようになり始めた。

特に役立ったと感じるのは

  • 2.2 単一の責任を持つクラスをつくる
  • 3.2 疎結合なコードを書く
  • 4.3 パブリックインターフェースを見つける -> 「どのように」を伝えるのではなく「何を」を頼む
  • 4.5 デルメルの法則
  • 5 ダックタイピングでコストを削減する

のあたり。

オブジェクトが「メッセージ」を送っている。という話がRubysendメソッドと自分の中で結びついて気持ちよかったり
単一責任の話や、ダックタイプの話が直接先述のServiceクラスをリファクタするヒントになっていたりして
「明日、あのコードをどう直すか」というスピード感で自分の指針になったことにはとても感動した。

しかもありがたいことに今の職場でもこの本がデスクに置かれている同僚がいて、設計の相談が来た時にちょうどこの本に載っているような問題に遭遇して「あのパターンが使えるね」って話しながら設計に落とし込めたりする体験もできた。

ただ単にこの本を読んだ自分の考えを押し付けるわけでもなく「なぜそう思うか」を具体的に言語化した上でレビューしたり、共通の認識を持った上でお互いに納得いく設計にできたりしているので、当初思っていたよりもかなり読む価値のある本になっていた。ラッキー。

ドメイン駆動設計あたりが自分の中でホットなので冷めないうちに次はこの本を読んでみようと思う。

2017年に買ってよかったもの

今年買ってよかったものを書きます

酔い止め薬 アネロン「ニスキャップ」

【指定第2類医薬品】アネロン「ニスキャップ」 9カプセル

【指定第2類医薬品】アネロン「ニスキャップ」 9カプセル

薬剤師の資格持ちの同僚の勧めで購入。どうやら最強酔い止めらしい。
調べてみたところ、とにかく酔い止め関連の効能がある成分が1番数多く入ってる薬らしく
昔から乗り物酔いがひどい僕が、小さいボートで東京湾に出てぐわんぐわん揺れても一切酔わなかった。ヘビロテ確定。

珪藻土バスマット

もっと吸水、さらに速乾!珪藻土バスマット(カイテキサラサラ SP 40X55) | ニトリ公式通販 家具・インテリア・生活雑貨通販のニトリネット

すごくいい。前まで布のバスマット使ってたけど
洗濯めんどいし、清潔感に欠けて嫌だったのが全部解決

劇場版 パワーレンジャー

劇場版 パワーレンジャー [Blu-ray]

劇場版 パワーレンジャー [Blu-ray]

成績は散々だったけども、個人的にベイビードライバーに並んで今年ベストに推したい作品

特撮ファンの僕は20年前の劇場版やTV版を子供の時に死ぬほど見ていて
今回のリメイクめっちゃ楽しみなくせに、期待値上げると爆死しそうだからという理由で斜に構えながら見に行ったら
もうそんな不安を吹き飛ばしてくれるほどいい感じのリメイクで、しっかり現代ティーンエイジャーの青春物語へと昇華されていて大満足

なんとか次回作で追加戦士トミーの登場を見てみたい

iPhoneで電源ON/OFFできるスマートコンセント

Wi-FiにつながってiPhoneのSiriやコントロールセンター経由でON/OFFできるコンセント
うちでは加湿器や照明で使用中
ベッドから動かずに家電をつけたり消したりできるので寝落ちする時に幸せ

この記事を書いた時に合わせて導入した

takanamito.hateblo.jp

素焼きミックスナッツ 1kg

ベッドから動かずに生活できるようになった結果太りまして
食生活を見直そうと購入

朝ごはんに毎日菓子パンを食べてたので、それをやめるべく
ヨーグルト + バナナ + ミックスナッツという
OLが食べてそうな朝食に変えたところ見事に体重減。

バナナとナッツでエネルギー摂取して、消化もいいっぽいので見事に昼前にはおなか減ってくる感じの生活になって最高

サフィールノワール ミラーグロス ワックス

痩せたということでおしゃれがしたい。
以前買った革靴の鏡面磨きに挑戦すべく、評判のよかったサフィールのワックスを購入。
鏡面磨きはやったことがなかったけど、このワックスがあればそんな僕でも初回からけっこういい感じに光らせられました。

お刺身脱水 ピチットシート

オカモト 業務用ピチット 32R(32枚ロール)

オカモト 業務用ピチット 32R(32枚ロール)

痩せたら美味しいお刺身が食べたくなりまして
同僚からオススメされたこともあり導入。

透明な半透膜シートで
マグロの柵とかに巻いて冷蔵庫で20分くらい放置するといい感じに脱水してくれる。

以前は冷凍マグロを家で解凍して食べると水っぽいことが多かったんですが
これを導入してからは美味しいお刺身のお店っぽい、身が締まった刺身を食べることができるようになりました。

おすすめレシピは
しょうゆ 2 : 料理酒 1 : みりん 1の漬けダレに
解凍してから20分ほどピチットシートで脱水したマグロを5-15分ほど漬け込んで食べるマグロ丼です。

Nintendo Switch

ベタ中のベタっぽいですが、今年はこれが1番よかった。
買ったゲームはゼルダ、マリオ、マリオカートスプラトゥーン、マイクラ、ヒューマンリソースマシンで全部めっちゃ楽しい。
かつてこんな体験をしたことがない。

特にゼルダとマリオについては自分の中のゲーム概念が覆る感じで
見えてるとこだいたいどこでも行けて、怪しいところにはだいたい何かあり、こうすりゃ何か起こりそうだな〜と思って試すと何か起こっちゃう体験がとにかく最高でした。

mackerelとSiriで室温を監視して、お部屋をいい感じの温度にキープする

前回の記事ではSiri + Raspberry Pi + IRKitで
お部屋の家電を操作するところまで作りました。

takanamito.hateblo.jp

今回は、その続編として
室温を計測し、規定の温度を外れた場合に自動でエアコンを操作して
お部屋の温度を快適に保つ方法を実践していきます。

先日、会社の勉強会で発表した際に使った資料がこちら

この発表で「エアコンの自動設定に任せられないのか」「そもそも目指す温度に設定しておけばいいんじゃないのか」という意見がありましたが

  • うちのエアコンに温度の「自動」設定がなかった
  • そもそも実家でも学校でも「自動」で快適な温度になったことがない
  • 温度上げる時はさっさと上げたい
  • なんかたまに謎判定でエアコンサボるからめっちゃ寒かったりする

みたいな理由から今回の自作温度調節機能の開発がスタートしました。

お金がある人は最新モデルの霧ヶ峰とかを買うといいかもしれません。

霧ヶ峰 MSZ-GV2216(W) ピュアホワイト(2.2kW)

霧ヶ峰 MSZ-GV2216(W) ピュアホワイト(2.2kW)

システム構成

前回までに登場した

  • Raspberry Pi
    • homebridge
    • homebridge-irkit
  • IRKit (API付き学習リモコン)
  • エアコン

に加えて、ラズパイにUSB温度計のTemperを接続します。
接続する際は、本体に直接挿すと熱伝導でUSBスティック自体が熱くなるため
延長ケーブルなどで本体の熱が伝わらないように接続するのがコツです。

USB温度計! USB thermometer-528018

USB温度計! USB thermometer-528018

また、設置する位置が高かったり低かったり、当たり前ですが熱を放つ機械のそばにあるだけで計測結果が変わります。
自分の体感値と照らし合わせながら最適な設置場所を探してみてください。

我が家ではこれを「百葉箱ポジション」と呼んでいます。

室温自動調節の仕組み

  • Temperで温度を取得
  • ラズパイで稼働中のmackerel-agent経由で温度をメトリクス化
  • Alert設定で10分継続してしきい値を上回る/下回る温度が続いた場合Alert発火
  • ラズパイから定期的にmackerelのAlert APIを叩いてCRITICAL状態の場合はエアコンの設定温度を操作

f:id:takanamito:20170212002428p:plain:w300

こんな流れです。
発表スライドにも載っているのですが、開発中はmackerelを使わずに
毎分温度を取得して、低ければ設定温度を上げるようにしていたのですが
室温はすぐに上がらないため、ラズパイが温度を上げようとして
毎分エアコンの「ピッ」という音を聞かされることになりました。

また部屋がちょうどいい温度にもかかわらず
トイレに行くために一瞬だけ廊下へのドアを開けただけで冷気が入り込み
その冷気を拾ってラズパイが過剰に反応してしまうこともありました。

そこでmackerelを使って「○○分継続して温度が規定値を外れたら」という
webの外形監視っぽい仕組みを導入することで回避しています。

温度を取得

ラズパイにTemperを接続して温度を取得します。
商品にwindows用のインストーラーがついていますが、ラズパイ用にコマンドをビルドします。

【Raspberry Pi】USB温度計を付けてみる – Happy Life Hacking

mackerelに投げる

mackerel-agentもgithubにarm版が公開されています。

Releases · mackerelio/mackerel-agent · GitHub

この中から mackerel-agent_linux_arm.tar.gzをDLし、展開して利用します。

mackerel-agentのARM版バイナリーはRaspberry PI 2でもさくっと動く - Qiita

temperから取得できる温度を整形してmackerelに渡すためのスクリプトを用意

#!/bin/bash

name="temper"
monitor_time=`date +%s`
temperature=`/opt/temper/temper | sed -e 's/.*,\(.*\)/\1/'`
echo -e "${name}\t${temperature}\t${monitor_time}"

mackerelの設定ファイルに上のスクリプトを叩くように追記してagentを再起動

[plugin.metrics.process]
command="sudo /home/pi/temper.sh"
type="metric"

Monitorを設定

ここまでの手順でmackerelにメトリクスが表示されるようになったと思います。 f:id:takanamito:20170211232917p:plain

Monitorの設定画面から

  • 温度上限
  • 温度下限

の設定をしたMonitorを作成しましょう。
我が家では 上限 23℃, 下限 21℃で、10分間既定値を外れた場合にAlertを発火するようにしています。

f:id:takanamito:20170211233807p:plain

Alertを監視するスクリプトを用意

mackerelのmonitorがalert状態になったのを取得する必要があります。
今回は手軽にやりたかったので「cronで15分おきにAlert APIを叩く」という方法で確認を行っています。

アラート - Mackerel API ドキュメント (v0)

雑スクリプトで取得して、IRKitにリクエストを送ります。

#!/bin/bash

cd `dirname $0`

check_alerts () {
  curl https://mackerel.io/api/v0/alerts -H 'X-Api-Key:xxxxx' -H 'Content-Type: application/json' | jq '.alerts[]'
}

# 自動調節モードのOn/Offを確認
if [ ! -e /tmp/check.txt ]; then
  echo 'Auto control is off'
  exit 0
fi

JSON=`check_alerts`

ID=`echo $JSON | jq '.monitorId'`
STATUS=`echo $JSON | jq '.status'`
echo $ID
echo $STATUS

if [ $STATUS = '"CRITICAL"' ]; then
  echo `date`
  echo 'Status is CRITICAL'

  if [ $ID = '"xxxxx"' ]; then # 上限アラート
    sh ./22.sh
    sleep 1
    sh ./21.sh
  elif [ $ID = '"xxxxx"' ]; then # 下限アラート
    sh ./22.sh
    sleep 1
    sh ./23.sh
  else
    echo 'Unknown Alerts'
  fi
else
  echo `date`
  echo 'Status is not CRITICAL'
fi

やっていることは単純で

  • Alert APIを叩いてjqでjsonをみる
  • ステータスがCRITICALかつ
    • 上限Monitorのidと一致すれば
    • 下限Monitorのidと一致すれば
    • ※各MonitorのidはmackerelのMonitor画面URLに付与されています
  • IRKitにHTTPリクエストを送るスクリプトを実行
    • ※今回はそれぞれ2℃ずつ変更すべくスクリプトを実行しています

また序盤で「自動調節モードのOn/Offを確認」とコメントがありますが
ファイルの有無を自動調節モードの起動フラグとして利用しているだけです。

このファイルの作成/削除はhomebridge-cmdで管理しているため
「Hey Siri エアコン調節オン」みたいに声で自動調節モードを起動できるところがちょっとかっこよくて気に入ってます。

結果

f:id:takanamito:20170211235420p:plain

ある日のグラフです

  • 20:00ごろ 帰宅
    • エアコンを起動
    • 自動調節モードもON
    • 既に21℃を下回っているためalert状態
  • 数分後
    • alert状態がわかりラズパイが自動的に設定温度をアップ
  • 20:30すぎ
    • 20℃を突破
  • 22:00前
    • 今度は上限のAlertに引っかかる
    • ラズパイが設定温度を下げる

という挙動で、その後いい感じに温度がキープできているのがわかるかと思います。
この日、ぼくは普通に暮らしており、温度に関することを一切意識していません。

このように、考えないといけないことが1つ減らせたのがとてもうれしいです。
今後はスマートコンセントを使って、加湿器も制御して湿度をコントロールできればと思っています。

今度からは、霧ヶ峰を買って解決できるようになりたいです。

「Hey Siri 電気つけて!」でRaspberry PiとIRKitを経由して電気をオンオフ

ベッドでだらだらしていると、だんだんウトウトしてくる。

あーもうこのまま意識飛んで寝そう。っていう時に、電気とテレビを消すために
わざわざテーブルに置いてあるリモコンを取りに行きたくない。


「Hey Siri 電気つけて!」で電気をつけたり消したり

続編としてエアコンの温度調整を自動化するところまでやりました。

takanamito.hateblo.jp

システム構成

この中でも今回の要はhomebridge

homebridge

github.com

github.com

homebridge-irkitをラズパイで動かします。
このサーバーはHomeKit互換なため、設定ファイルにjsonで各家電の赤外線情報を定義することで
IRKitにHTTPリクエストを飛ばして、家電製品に赤外線信号を送ることができる。

{
    "bridge": {
        "name": "Homebridge",
        "username": "CC:22:3D:ED:CE:30",
        "port": 51826,
        "pin": "000-00-000"
    },
    "description": "IRKit Control",
    "accessories": [
        {
            "accessory": "IRKit",
            "name": "電気",
            "irkit_host": "IRKit1B4D.local",
            "on_form": {"format":"raw","freq":38,"data":[19991,10047,1413,3579,1413,3579,1413,3579,1413,1111,1413,1111,1413,3579,1413,3579,1413,3579,1413,1111,1413,1111,1413,3579,1413,3579,1413,1111,1413,1111,1413,1111,1413,1111,1413,3579,1413,3579,1413,1111,1413,1111,1413,3579,1413,1111,1413,1111,1413,3579,1413,1111,1413,1111,1413,3579,1413,3579,1413,1111,1413,3579,1413,3579,1413,1111,1413]},
            "off_form": {"format":"raw","freq":38,"data":[19991,10047,1319,3704,1319,3704,1319,3704,1319,1190,1366,1190,1366,3704,1319,3704,1319,3704,1319,1190,1319,1190,1319,3704,1319,3704,1319,1190,1319,1190,1319,1190,1319,1190,1319,3704,1319,3704,1319,1190,1319,3704,1319,1190,1319,1190,1319,1190,1319,3704,1319,1190,1319,1190,1319,3704,1366,1150,1319,3704,1319,3704,1319,3704,1319,1190,1319,65535,0,24574,19991,4878,1366]}        
        }
    ]
}

またIRKitに以下のHTTPリクエストを送ることで
1番最後に受信した赤外線情報をjsonで吐き出してくれます。

$ curl -i "http://10.0.1.2/messages" -H "X-Requested-With: curl"
HTTP/1.0 200 OK
Access-Control-Allow-Origin: *
Server: IRKit/2.1.3.13.gbe33d36
Content-Type: text/plain

{"format":"raw","freq":38,"data":[18031,8755,1190,1190,1190,3341,1190,3341,1190,3341,1190,1190,1190,3341,1190,3341,1190,3341,1190,3341,1190,3341,1190,3341,1190,1190,1190,1190,1190,1190,1190,1190,1190,3341,1190,3341,1190,1190,1190,3341,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,1190,3341,1190,3341,1190,3341,1190,3341,1190,3341,1190,65535,0,9379,18031,4400,1190]}

IRKit - Open Source WiFi Connected Infrared Remote Controller

必要な家電製品の赤外線を設定ファイルに書いたら
homebridgeサーバーを起動

pi@raspberrypi:~ $ homebridge
*** WARNING *** The program 'node' uses the Apple Bonjour compatibility layer of Avahi.
*** WARNING *** Please fix your application to use the native API of Avahi!
*** WARNING *** For more information see <http://0pointer.de/avahi-compat?s=libdns_sd&e=node>
*** WARNING *** The program 'node' called 'DNSServiceRegister()' which is not supported (or only supported partially) in the Apple Bonjour compatibility layer of Avahi.
*** WARNING *** Please fix your application to use the native API of Avahi!
*** WARNING *** For more information see <http://0pointer.de/avahi-compat?s=libdns_sd&e=node&f=DNSServiceRegister>
[2017-02-08 23:42:24] Loaded plugin: homebridge-cmd
[2017-02-08 23:42:24] Registering accessory 'homebridge-cmd.CMD'
[2017-02-08 23:42:24] ---
[2017-02-08 23:42:24] Loaded plugin: homebridge-irkit
[2017-02-08 23:42:24] Registering accessory 'homebridge-irkit.IRKit'
[2017-02-08 23:42:24] ---
[2017-02-08 23:42:24] Loaded config.json with 7 accessories and 0 platforms.
[2017-02-08 23:42:24] ---
[2017-02-08 23:42:24] Loading 7 accessories...
[2017-02-08 23:42:24] [テレビ] Initializing IRKit accessory...
[2017-02-08 23:42:24] [電気] Initializing IRKit accessory...
[2017-02-08 23:42:24] [エアコン] Initializing IRKit accessory...
Scan this code with your HomeKit App on your iOS device to pair with Homebridge:

    ┌────────────┐
    │000-00-000 │
    └────────────┘

あとはiPhoneのホームアプリから接続設定をすると
HomeKit経由で各種デバイスのオンオフが可能。

Siriだけじゃなく、コントロールキットからも操作できて便利

f:id:takanamito:20170211221233p:plain:w300

参考URL

datahotel.io

ラズパイ3はけっこうメモリも豊富でよかった
常時起動の場合はヒートシンク要るとか聞いてたけど、今のとこなんとかなってる
冬だからかも?

青色LEDがちょっとまぶしいのが難点
後継機のNature Remoはちょっと値上がりして、動体センサーや湿度計もついてるらしい

AWSにVPNでつないでSteam Home StreamingでAstroneerをやりたい

前回の記事で、手元にWindowsがなくてもAWS環境にWindowsマシンを用意し
リモートデスクトップを利用してAstroneerをプレイする方法を紹介しました。

takanamito.hateblo.jp

しかし、記事の最後にも書いてあるように
ドラッグが効かなかったりと、通常プレイにも支障が出てしまう状態でした。

今回はそれをクリアし快適にプレイすることができたので、その方法を書こうと思います。

きっかけ

前回の記事を投稿したところ知人からTwitter
「Steam Home Streaming」なるものの存在を教えてもらいました。

Steam ホームストリーミング

LAN内にあるマシンでリモートプレイできる仕組みのようです。

今回はこれを利用してプレイしたいので
Mac - WindowsVPNで接続してSteam Home Streamingが使える環境をつくります。

ちなみに前回紹介した海外の先駆者が公開している動画で、実際にどれくらいサクサクにプレイできるかが確認できます。

これだけなめらかに動けばAstroneerは余裕なはずです。


EC2 Steam streaming

手順

VPN環境の構築をしていきます。試される方は自己責任でお願いします。

OpenVPNの設定

今回1番難しい作業です。Mac - Windows間のVPN環境を構築します。
基本的には前回紹介した海外の先駆者の記事に記載の8番の工程を進めます。

まずはWindows

Windows側の手順はここまで
今回、上述の記事を参考にOpenVPN設定を試みたが、記事内で公開されている設定ファイルをどこまで信用していいかわからなかったので自分で読んで、一部設定を変更した。
ただVPN設定自体が初めての経験だったので、ほんとにこれが正しい設定なのかは自信がない。危ない設定あれば指摘ください。

また拡張子表示設定をしていなかったため、編集後の server.ovpnファイルが実は server.ovpn.txtになっており、OpenVPNが設定ファイルを読み込んでくれないなど
非常にしょうもないハマり方をしたので、拡張子表示設定を先にやっとくとよさそうです。

つづいてMac

  • Windowsから ca.crt, client.crt, client.keyの3つのファイルをダウンロードし、ローカルに置いておく
  • クライアント用の設定ファイルを鍵を置いたディレクトリに配置。設定サンプルはこちら 5行目にWindowsサーバーのIPを埋める
  • TunnelblickをDL
  • 起動後、先程のcliend.ovpnファイルを読み込ませて接続

この設定でVPN接続が可能なはず。
Windows側に接続されたっぽいログが表示されていれば成功。

AWSのセキュリティグループを変更し、自宅などのIPからUDPのアクセスを通す設定をお忘れなく。

Steam Home Streamingの設定

Steamアプリからホームストリーミングの設定をします
ハードウェアエンコードに関する設定をONにしてください。

f:id:takanamito:20161224120645p:plain

この段階でMacWindows双方の「ストリーミングを有効にする」チェックボックスがONになっていれば
上の欄にリモートサーバーが表示されているはずです。

表示されない場合は、チェックボックスのON/OFFを試すと表示されることが多かったです。

Astroneerをやる

MacのSteamからAstroneerを見てみると「プレイ」ボタンがあるはずの場所に「ストリーミング」ボタンが表示されているはずです。
これをクリックすれば、、、プレイ可能かと思いきや「画面はリモートコンピュータ上からロックされています」というエラーメッセージが表示され起動できません。

これはwindowsログインができておらず、ロックされていることが原因です。手軽に突破するにはChromeリモートデスクトップなどを利用しログインした状態をつくるのがおすすめ。
またログインするためには ctrl + alt + delete を要求されますが、Macからは ctrl + option + fn + deleteあたりで突破できたはずです。

その状態で「ストリーミングを」クリックすれば、、、

f:id:takanamito:20161224122601p:plain

ちょっと画質は悪いかも。でもサクサク動く。

f:id:takanamito:20161224121723p:plain

車とか作ると原付を手に入れた高校生くらい一気に移動範囲が広がる。

f:id:takanamito:20161224121728p:plain

「おおー。できてきたできてきた。」とか思って時計を見ると深夜3時になってたりして危険。

そのうち農業要素が追加されるらしいので、砂とうんこを混ぜた畑でジャガイモを育てたいです。

AstroneerがやりたくてAWS EC2でWindowsマシンを立ててリモートデスクトップでプレイ

「Astroneer」がやりたかった。

ただ、うちには動作条件を満たすWindowsマシンがなくて困った。

ゲームはそんなに長く続かないタチなので100時間もやらないはず。
そのためにわざわざ何万も払ってWindowsマシンを買いたくもないし、大掃除でせっかく空けた家のスペースも使いたくない。

諦めきれずに同僚にslackでAstroneerやりたいと話していたら
「AWSでWindows使えばいいじゃん」と言われた。

その発想はなかった。

調べてみると、海外に同じ事をしている人がいた。

意を決して作業を始めると、1時間くらいでAstroneerがプレイできる環境が手に入った。
今回はパフォーマンスそっちのけで、とりあえず動かせるところまで。

※2016/12/24追記
より快適にプレイするためのVPN導入 takanamito.hateblo.jp

環境

手元にはMacしかない
Macbook 12インチ Early 2016 (macOS Sierra)

手順

  • EC2インスタンスの起動
  • Microsoft Remote Desktopでつなぐ
  • グラフィックボードのドライバを更新する
  • オーディオドライバをインストール
  • Steamをインストール
  • Astroneerをインストール

※破産の可能性があるので自己責任でお願いします

EC2インスタンスの起動

AWSマネジメントコンソールからEC2を起動します。
今回使うAMIは「Microsoft Windows Server 2012 R2 Base」
※最新のWindows Server 2016がありますが、あとでインストールするドライバの関係で2012じゃないと動きません

  • AMI: Microsoft Windows Server 2012 R2 Base
  • インスタンスサイズ: g2.2xlarge
  • ストレージ: EBS gp2 100GB
  • セキュリティグループ: 3389番(RDP)のみ開放(リモートデスクトップで使用

※2016/12/23追記 同僚から「Windows Server 2012 R2 with the NVIDIA Driver」のAMIを使ったほうが ドライバのインストールが楽になるとの情報を教えてもらいました。

Microsoft Remote Desktopでつなぐ

EC2インスタンスが起動しステータスチェックが通ったら、下記の手順を実行しパスワードを入手します。

docs.aws.amazon.com

次にMicrosoft Remote DesktopをDLし接続設定をします

Microsoft Remote Desktop

Microsoft Remote Desktop

  • Microsoft Corporation
  • ビジネス
  • 無料

  • Connection name: お好きに
  • PC name: EC2のIPアドレス
  • User name: Administrator
  • Password: さっき取得したやつ
  • Start session in full screenのチェックを入れる
  • Use all monitorsのチェックははずした方がいい

これで接続できるはず。
ここからは普通にWindows触るときと同じ感覚で操作可能

ただしセキュリティ設定が厳しくて、IEでいろんなサイトにアクセスするときに
「このドメインを信用しますか?」的なダイアログがひたすら出続けるのでその辺は僕はポチポチして回避しました。
もっといい方法があれば教えてください。

グラフィックボードのドライバを更新する

リモートデスクトップでログインしたら、グラフィックボード NVIDIA GRID K520用のドライバを更新します。

NVIDIA DRIVERS Quadro Desktop Driver Release 367 WHQL

※ちなみにWindows Server 2016を使っていると、ここで古いバージョンのドライバしか入らず
ゲーム起動時にエラーで強制終了されてしまいました。

デバイスマネージャからデフォルトのドライバである「Microsoft Basic Display Adapter」をオフにしたあとにアンインストール さらにドライバのファイル自体も削除しておくとよい模様。C:\Windows\System32\Drivers\BasicDisplay.sys
僕は権限を与えることができずに削除失敗しました。

オーディオドライバをインストール

オーディオドライバは入ってなかったぽいのでインストール

Razer Surround Personalized 7.1 Gaming Audio Software | Razer US Site

これで右下のタスクバー?のボーリュームアイコンのバツ印が消えて
手元のMacから音が聞けるようになるはず

必要であれば言語設定も変更して
この辺で一度再起動しておくとよさそう。

Steamをインストール

あとはいつもどおり、Steamをインストールしたのちに
Astroneerをインストールすれば、、、

f:id:takanamito:20161220130231p:plain f:id:takanamito:20161220130237p:plain

コスト

今回使ったのが

  • CPU: 8コア
  • メモリ: 15GB
  • GPU: NVIDIA GRID K520

のg2.2xlargeインスタンス

東京リージョンで動かしても$1.01 / 1 時間

このスペックのパーツを買い揃えることを考えると 100時間やったとしても1万円強で、ものすごいコスパ

低レイテンシーを求められるゲームならまだしも、今のAstroneerのように
1人でのんびりとやるぶんには全く問題ない感じ。

所感

今の環境では完全互換とはいかず、なぜかマウスのドラッグアクションが効かずに
掃除機みたいなやつで吸うアクションがうまくできない。
この辺は別のリモートデスクトップクライアントも使って検証してみる予定。

公式ForumでもMac対応するってQ&Aに書いているので、気長に待ちます。

What about Mac users?
Eventually Astroneer will be supported on Mac. Not confirmed if it will be supported at Early Access launch yet though.

(Read First) Astroneer FAQ :: ASTRONEER General Discussions

2016年お買い物ランキング

2016年によかったものを12個書きます

takanamito.hateblo.jp

12位 IPPO

IPPO 1 (ヤングジャンプコミックス)

IPPO 1 (ヤングジャンプコミックス)

会社の同僚からおすすめされて買ってみたマンガ。
若手ビスポーク革靴職人の話でとにかく職人最高という気分になれる。
インターネットのサービス作るのもいいけど、やっぱり実際に手に取れるものもつくりたいですわな。

11位ヨーグルティア

こちらも同僚のすすめで購入。
ヨーグルトを無限に食べたいので、せっせと作っている。
最近はドリンクタイプのR-1を使うと美味しくできるということを発見。
牛乳パックを直接セットするタイプよりも、温度設定やタイマー設定があるので使いやすい。
低温調理器としても活躍していて、よく鶏ハムをつくる。
生ギリギリを攻めたほうが美味しいので毎回ドキドキしながら仕上がりを見るのもまた楽しい。

10位 ガメラ 大怪獣空中決戦 4K上映(トークショー付き)

hobby.dengeki.com

豊洲であったイベント上映。
4K上映自体は去年の東京国際映画祭でも見てたけど、今回はトークショー付きということで仕事をさっさと切り上げて通った。
何より良かったのは長峰役の中山忍さんを見られたことで、自分の年だと明らかに浮くような高めの年齢層の観客みなが
中山忍登場で"息を呑む"瞬間を体感できたのがよかった。
女優すごい。別格に綺麗でした。

9位 赤めだか

赤めだか (扶桑社BOOKS文庫)

赤めだか (扶桑社BOOKS文庫)

この記事に影響されて読み始めた。 今どきの若手育成にひそむ3つの思いこみ

おかげで初めて落語の寄席にも行ったり、なかなかいいおでかけトリガーになったと思う。 スライドにも引用されている箇所はしっかり意識して実践してる。

8位 SCYE x URBANRESEARCH ダッフルコート

2016AW SCYE x URBAN RESEARCHの名作ダッフルコート - 社会人3年目の服選び

大学のときにHAREで買ったダッフルコートをずっと着てたけど
もうちょっといいやつを着たかったので後輩に譲って新しいのを買うことにした。
Scyeのダッフルコートは名作とのことで、たまたまURBANRESEARCHの別注モデルで黒があったので購入。
形は綺麗だし、肉厚で温かいのでとても気に入っている。

7位 nginx実践入門

nginx実践入門 (WEB+DB PRESS plus)

nginx実践入門 (WEB+DB PRESS plus)

普段の仕事でも使いまくってるnginx
前からちょくちょく触ることはあったけど、行きあたりばったりな設定ファイルを作ってしまうことが多いので
ここらでちゃんと知識入れとくかと購入。

今でも机に置いて、リファレンス的な使い方をしています。

6位 キャプテン・アメリカ シビルウォー

今までマーベルシリーズではキャプテンのウインターソルジャーが1番好きだったのが、さらにそれを上回ってくる感じで最高。
2016年における映画の才能を全て集めて映画撮ったらこれができました!
みたいな感覚すら覚える。
猛ダッシュバッキー追跡シーンと、スパイダーマンがAT-ATぐるぐる巻きのことしゃべり出すシーンが最強。

5位 iPhone7

Apple Pay最高。
もう財布をリュックから出さなくていい。 ただ防水が信用できないところはちょっとやだ。

takanamito.hateblo.jp

4位 星野源 Live Tour "YELLOW VOYAGE" (初回限定盤) <Blu-ray>

Live Tour “YELLOW VOYAGE" title="Live Tour “YELLOW VOYAGE" (初回限定盤) ">

Live Tour “YELLOW VOYAGE" (初回限定盤)

逃げ恥の恋ダンスもいいけど、スーダラ節の弾き語りとかニセ明さんの君は薔薇より美しいもいい。
DOWN TOWN 〜 ステップにつなぐところのドラムがババちびるくらいかっこいい。

3位 東京国際映画祭 アメイジング・スパイダーマン2 野外上映

2016.tiff-jp.net

毎年、東京に住んでてよかったと思えるイベントのひとつ。
ヒルズでアメスパ2が野外上映するとのことで行ってみると
SONYの謎巨大4Kディスプレイに、でかスピーカーが準備されてて非常に高まる。

12月の極寒の中観る、ガーフィールドとエマ・ストーンの公園再会シーンは最高だし
映像自体Ultra 4Kとかいう規格のものを流していたらしく、エレクトロの電流をかいくぐって街をぎゅんぎゅん行くシーンがとんでもないことになっていた。

どなたがチョイスしているのかわかりませんが、本当にありがとうございました。

2位 nasne

nasne 1TBモデル (CUHJ-15004)

nasne 1TBモデル (CUHJ-15004)

死ぬほどテレビを観るので、今まで買わなかったことを後悔した。
torneアプリを使ったリモート操作/視聴が神で、友達や家族に「この企画おもしろかった」って言いながらさっと録画を見せられるのが最高。
あとこの機能のおかげで会社で同僚と日本シリーズ見れたりして非常に満足度の高い買い物でした。

1位 ALDEN 990

初めて新品の高級靴を買いました。
値段が値段なのでお手入れの方法も勉強したり、リテラシーを引き上げるきっかけになった一足。10年履きたい。

合わせて買った本もすごくよかった。

靴磨きの本

靴磨きの本

この靴を履くときは、朝の段階で天気予報を死ぬほどチェックする。

この靴を買ったおかげで、あまり知り合わないような人とも仲良くなれた。 もっとこういう話ができる人たちと会ってみたい。

お金使うの気持ちいいですね。 来年もたくさん散財したい。