ゼルダの伝説 ブレス オブ ザ ワイルドをクリアした

  • 固有名詞やゲームを進める上でのヒントはあるかもしれないけど、重要なネタバレはないようにしている。

良かった点

  • いい意味で死にゲーだったきがする。初見殺しがとにかく多くて死んで覚え、謎を解いていくみたいなゲームだった。

    • 特に序盤でもかなりそれが顕著に出ていた。
    • ただ、初見殺しを回避して慣れてくればそれなりに難しい操作をしなくても乗り越えられるものがほとんどのように感じられる。
  • 戦闘は回避できる選択肢があった

    • メインストーリーをすすめる上で、 必ず倒さなければ行けない敵についてはまぁそこまでいないと思うし、操作については結構かんたんな方だと思う。
    • 操作は簡単だけど、難しさみたいなのは両立していて、タイミングがシビアだったりでなかなかうまく行かないなぁみたいな感じになることもあって戦闘が単調になったりはあんまりなかった。
  • 巷では不評だったのが「謎解きの要素が少ない」「謎解きの焼き増しが結構多い」みたいな話だったのですが、個人的にはかんたんすぎず、難しすぎずちょうどよかった。

    • そもそも祠を見つけること自体が「試練」のひとつなのではないかなぁと思ったり。

良くなかった点

  • オープンワールドでは結構あるあるな気がするけど、コログだったり祠だったりはゴロゴロあるにはあるけど、それ以外に大物みたいなのはなくて、「ただ広いだけ」みたいなのになってしまっている部分があったのが残念。
  • 極端にヒントが少ない場面があったりした。徹底的に人に聞いて回らないと、料理をできることも知らなかったし、序盤はかなり苦戦してしまった。
  • 流石にコログだったり祠が多すぎて、全部回ろうという気持ちは完全になくなってしまい、エンディングをみたら大変満足してしまった。
    • これは人によっては無限に遊べてすごくいいことだとは思うんだけど、個人的にはあまり惹かれなかったなぁ…

クリアまでの時間について

  • クリアまでは大体55時間位で、達成度は20%行かない具合という感じだった。
  • 4月初旬に買って休み休みやっていたという感じでした。

雑感

  • 結構古いゲームだしさすがに今やっている人は少ないだろうなと思ったのだけど、タイムラインに数名位同時期に始めた人がいて驚いた。
  • 終盤は慣れてきたこともあって、結構急ぎ急ぎで進めてしまった感があり、じっくり世界に浸りながらやってくゲーム体験だったので、ちょっともったいなかったなぁと言うのが正直なところでした。
  • 全体的には前評判通りとても良いゲームだったので、Switchを持っている人なら絶対にやったほうがいいなぁというゲームでした。とにかく初見が一番楽しいゲームだと思う。2週目をするかといえば、うーんするかもしれないし、しないかもしれないなぁ。
  • 次回作が開発中っぽいのだけど、これは発売と同時にやっていきたいなぁ。

Dell G5 ゲーミング デスクトップを買った感想

とりあえず到着して使ってみたので記念カキコ。 Windowsのためにやった環境構築だったり、WSLについてだったりは別記事で記載することにして、 この記事ではPC自体がどうですかーみたいな感想を書いていく。

ちなみに基本的なスペックだったりは前回の記事で紹介しているんのでそちらを参照されたし。

webuilder240.hatenablog.com

一度目の納期

  • ちょっと早くて、4月17日頃に到着しました。はやい!となったのですが、どうやら配送の段階に落としたのか、全面のボディが欠けていました…フィルムを剥がしたところ、無慈悲に欠片がこぼれ落ちてしまいました。トホホ…
  • ソッコーでDellのサポートセンターに連絡してすぐに交換品を届けてもらうことにしました。ここからまた2週間くらい待つことになってしまいました。
  • 通電してあれこれ触ってなにか言われても仕方ないので、ずっと電源も入れることなく届いたPCは放置されていました。交換品が届いてからの返品手続きになるそうです。

二度目の到着、やっと通電

  • そして、5月2日に到着しました。
  • 増設用に買ったメモリがなかなか認識しない問題はあったものの、ちゃんと最後には認識されて起動しました。

所感

  • IDEの起動についてはMacBookPro 2015に比べて、起動もすごく早くなったので買ったかいがあったなぁという感じ。
  • これまでしんどかったYoutubeライブも4Kも、オンボードグラフィックではないのでかなり快適。
  • WSL2なRbenvでRubyをいくつかビルドしたりしたけど、そのあたりは流石デスクトップという感じで5分足らずで完了した。
  • Visual Studio起動してみて、念願だったC#でひとしきりチュートリアルのコードを書いたりしてみたのだけど、とくにファンが回ったりが殆どなくできた。Rubymineでちょっとしたコードを書いたりもしたけど、ファンが回ったりはなかった。
  • ライトがビカビカしているのが不満というのであったんだけど、これはBIOSでオフにできたり、輝度を低くすること*1も可能なので問題にならない。
  • 前評判通り、Macに比べてもかなりコスパはいいと思った次第です。かなり運悪く初期不良品にあたったけど、かなり良い買い物はしたと思いました。
  • ちょっと文字入力中にプチフリっぽいものがあるのだけど、これはなんだろう…

最後に

  • 結局、大は小を兼ねるだろうということでRAMは64GBにしたんだけど、64GBは多すぎた…wまぁ先行投資ということでw

*1:輝度を低くしても結構眩しい。

HerokuでPumaを使いたかったのでpuma-herokuでサクッと設定した

これまでRailsやRackのアプリケーションサーバーにはUnicornを使っていたのだけど、 Herokuのホビープランのような、前段におそらくNginxがないであろう環境で、仮想コア数も多分1つみたいな状況ではUnicornよりもPumaのほうがもしかしたらパフォーマンスが出るかもしれないかなと思って、 エイヤっとアプリケーションをサーバをPumaに変えてみることにしました。

Pumaについてはスレッドの概念もあるし、設定も難しそうだなぁと思ったのでした。 とりあえずHerokuで変えてみたいだけで、あれこれ調べるのも面倒だなぁと思ったところ、 ちょうどpuma-herokuというPluginがあったのでこれを使うことにした。

github.com

一応中身をチェックしたのだけど、ほとんど世に出回っている内容と同じだった。 まぁこの程度だったら自分で書いちゃったほうが。。。と思ったけど、ここは詳しい人たちの肩に乗ることにした。 まぁめちゃくちゃ破壊的な変更が無いとも言い切れないけど、あるとも思えないが、まぁ一応。。。

そのまま設定してシュッとDeployしてひとしきりテストしたけど問題なさそうだった。 肝心のパフォーマンスについては、度々エラーが出ているみたいなので、それが減ればいいかなぁと思っている。 コア数やスレッド数の調整についてはHerokuのホビープランだと設定するうまみもあまりなさそうなので、まだやっていないという感じです。

ゲームをやらないのに Dell G5 ゲーミング デスクトップをポチった

なお、ポチっただけでまだ届いていません。

そろそろMacにも飽きてきたし、妻にも買っていいよとなったので何を買えばいいかなぁというので、下記要件でBTOだとかを色々探し回ったりしていました。 今回、ノートPCは軒並み高すぎるのでデスクトップにしました。基本引きこもりだしなぁ。

要件定義

  • Web中心のITエンジニアで、CPU速度が生産に直結しづらい方である。
  • とはいえ、VMLinux)であれこれ環境作って触ったりしたいし、IDEも使ったりするのである程度スペックは欲しい。
    • WSLでいらないかも知れないですが…
  • VR・動画のエンコード・重たいゲームは一切やらないが、家にある4Kモニターは使いたい。
  • 5年以上は使いたいなぁというお気持ち。もし持てば本当はもっと長く使いたい。
  • そしてMacは流石に高いし、シンプルに飽きた…!
  • 予算は当初は10万円くらい。結局多少オーバーしました。(妻は許してくれた。)

結局何を買ったのか

Dell G5 ゲーミングデスクトップを買いました。 www.dell.com

ぶっちゃけ、これに影響を受けて僕も買いました。 www.hsbt.org

ただ、自作PCだとかBTOだとかかなり選択肢はたくさんあったし、一応PCにも一般の方よりは明るいほうだと自負しているのですが、 WindowsPC買うの久しぶりだし、あんまり失敗はしたくないので、構成は異なると思いますが同じものを買いました。 かといって金はかけすぎたくはないので、ある程度スペックは絞ったりしたつもりですし、後述しますが、結構お買い得だと思いました。

主な構成

とりあえずVirtualBoxではなくて、Hyper-V 使ってみたいくらいの軽い気持ちでWindows10 Proにした。 あまりWindows 10 Proに関係ないのだけど、 C#でWebアプリケーションを趣味で作ってみたり、Xamarinを本格的に触ってみたい気持ちが強いのでしばらくはWindowsで使い続けると思う。

CPUは、選べる最上位モデルがCore i7 9700Kで、それでも良かったんだけどそこまではオーバースペックかなぁと思ったのと、PCゲームやらないし、オーバクロックも興味ないので個人的に使う用途では大きな差がないと思った。 定格クロックが9700Kが3.6GHzで、9700が3.0GHzという感じで、定格クロックが低いのはちょっと気になったがそこまでのスペック厨じゃないし、無駄に金をかけないという意味でもCore i7 9700にした。1万円ケチった。

メモリは届いた段階で換装予定なので一番安いのにした。最初は32GBでやってみて足りなければ64GBに増設すると思う。VM立てたりするとやっぱ32GBだと足りないか…?

ビデオカードについては、とりあえずゲームしない環境で4Kが普通に映ればヨシということで一番安いのにした。 あまり詳しくないけど、調べたところゲームしなければコレでも全然良い感じだと思う。

Netflixを大画面で再生しているとMacBook Pro (Mid 2015)のファンが回って煩いので、もうちょっとマシになればなぁという感じです。 どうしてもゲームやりたくなったり、5Kモニター導入となったら交換すればいいかなぁくらいに楽観視しています。(交換できるかどうかはまだ確認していませんが。)

費用については常にやっているキャンペーンで、クーポンだとかでとにかく割引が効きまくって(18,000円引き + 18%OFFくらい)かなりコストを抑えることができた。 メモリは到着直前くらいに購入するとして、それ含めて13万しないくらいで収まりそう。 もちろん買う前にあれこれ調べていたんだけど、なんか他の主に国内のBTOでは、似たような構成でも軒並み2〜3万高くてうーむという感じだった。 Dellのほうがコスパはいいのは間違いないけど、おそらく納期とのトレードオフなんだろうなぁと思った。

納期

時期もアレな時期からなのか、通常納期 + 2週間ということで到着は4月超えて5月はじめになりそう…(泣) 久しぶりにPC買ってワクワクはしていて早く届いてほしい気持ちはあるけど、必要に差し迫られているわけではないので気長に待つことにします。

まとめ

というわけで、納期まで待ちきれずに買ったブログを書いてしまいました。「まだ届いていませんが」PC選びの参考になればと思います。

WindowsLinuxを使う開発者にとって結構フレンドリーなった印象を受けますし、 脳死して「WebエンジニアはMac一択である」と言っている時代は終わったと思います。正しい知識を持って買いましょう。*1

なかなかMac以外のエンジニア向けのPCレビュー(非ゲーミング)のブログってあんまりない気がしていて、届いたら使ってみてどうだったのかはちゃんと書いていきたいと思います。

*1:まだ届いてもいないお前が言うのか…

一定の制約を設けてRailsのサービスクラスに一定の秩序を設ける

Railsでのサービスクラス(またはオブジェクト)の是非はさておき、Railsでサービスクラスは導入するとルールがゆるふわになりがちだったりします。

例えば、「サービスクラスを実行するメソッドはクラスメソッドなのか、メソッド名は execute なのか、perform なのか、 call なのか… どれがいいとか悪いとかはないですが、これらに対して一定の制約を設けることで、サービスクラスに対して一定の秩序を与えていきましょう。

今回設定するサービスクラスへの制約について

  1. 必ずベースとなるmoduleをincludeすること。
  2. クラス名には必ず「Service」を含める。(含めないとエラーになるようにしています。)
  3. initialize は必ず定義して、インスタンス化させる。
  4. 必ず、クラスメソッドからperform サービスクラスを実行する。

まず、サービスクラスのベースになるServiceBaseというモジュールを実装します。

module ServiceBase
    class ServiceClassRuleError < StandardError; end

    def self.included(base)
        base.extend(ClassMethods)
        raise ServiceClassRuleError.new("#{base.name}: Please Rename Service Class") unless base.name.include?("Service")
    end

    module ClassMethods
        def perform(*args)
            self.send(:new, *args).send(:perform)
        end
    end

    private

    def initialize
        raise NotImplementedError.new("You must implement #{self.class}##{__method__}")
    end

    def perform
        raise NotImplementedError.new("You must implement #{self.class}##{__method__}")
    end
  end

このベースになるモジュールの役割としては、

  1. サービスのクラス名に Service という名称がクラス名に含まれているかをチェックします

  2. initalize メソッドを必ず定義させるために、未実装の場合にエラーになるようにしています。

  3. perform インスタンスメソッドを必ず定義させる。このインスタンスメソッドはperform クラスメソッドからのみCallされるようにするために、気休め程度ですが、プライベートメソッドにしておきます。

  4. クラスを内部的に new して、インスタンス化して、perform インスタンスメソッドをCallするための、 perform クラスメソッドを定義します。

というのが大きな役割です。

実際にServiceBase moduleを使ってサービスクラスを実装してみましょう。

class PostCreateService
  include ServiceBase

  private

  attr_reader :title, :content

  def initialize(title:, content:)
    @title = title
    @content = content
  end

  def perform
    Post.new(title: title, content: content).tap do |p|
      p.save
    end
  end
end

次はControllerでサービスクラスをCallしてみましょう。(今回の例ではちょっとサービスクラスの旨味がないですが…)

# ...

def create
  @post = PostCreateService.perform(title: post_params[:title], content: post_params[:content])
  respond_to do |format|
    if @post.valid?
      format.html { redirect_to @post, notice: 'Post was successfully created.' }
      format.json { render :show, status: :created, location: @post }
    else
      format.html { render :new }
      format.json { render json: @post.errors, status: :unprocessable_entity }
    end
  end
end

# ...

暗黙的にクラスメソッドの perform が実装されていて、意図しないクラス名が設定された場合でもエラーになるようになっています。 これでサービスクラスの実装する人も迷わなくて済みそうです。

応用例

今回、サービスクラスに対して一定の制約を設けるためにベースになるModuleを追加しましたが、 このModuleを応用してRailsRunnerだったり、Rakeタスクで処理を行うためのクラスを実装する際にも制約を設けて役に立たたせることが可能です。