真骨彫アンク セルメダル100枚塗装

S.H.Figuarts 真骨彫アンクにセルメダルが100枚ついてくるということで
意気揚々と買ったはいいものの、まさかの成型色無塗装だったので色を塗ってみました。

f:id:takanamito:20200202151123j:plain

Before

塗装前の状態です。
普通に灰色のプラスチックであまりかっこよくないです。

f:id:takanamito:20200202151617j:plain

商品紹介ページではバッチリ塗装済みの写真が掲載されているのでけっこうショックでした。

S.H.Figuarts ~真骨彫製法~ 仮面ライダーシリーズ スペシャルページ|魂ウェブ

シルバー塗装

ゲート部分も塗りたかったので、2箇所あるうち上の部分はニッパーで切り離してから塗装しました。

f:id:takanamito:20200202152141j:plain

持ち手の割り箸とランナーをテープでとめる

f:id:takanamito:20200202151903j:plain

エアブラシは持っていないのでスプレーを購入。459円。
サーフェイサーの下地も検討しましたが、めんどくさいのでやめ。

湿度の少ない晴れた日に薄塗りします。
スプレーとランナーを20~30cmほど離し、片面2~3吹き程度に留めました。

数時間乾かした後、裏面も同様に塗装してその日は終了。

スミ入れ

下地のシルバーを溶かさないようにエナメル塗料を使います。

タミヤ スミ入れ塗料 (ブラック)

タミヤ スミ入れ塗料 (ブラック)

  • メディア: おもちゃ&ホビー

雑にペタペタ塗っていく。
タジャドル系のメダルはキレイに塗れるが、ウナギ・トラあたりは面が多くて難しい。

f:id:takanamito:20200202153158j:plain

1日乾かした後に、綿棒にエナメル溶剤をつけて表面をこすっていく。どれくらい墨を残すかはお好みで。
今回のセルメダルはあまり強くこすると墨が取れすぎてしまったので、軽めにして多めに墨を残しました。

タミヤ カラー エナメル エナメル溶剤特大 (X-20 250ml) 80040

タミヤ カラー エナメル エナメル溶剤特大 (X-20 250ml) 80040

  • 発売日: 1985/06/27
  • メディア: おもちゃ&ホビー

After

f:id:takanamito:20200202153326j:plain

のっぺりした印象がなくなって、重厚感が増した感じ。

f:id:takanamito:20200202155302j:plain

f:id:takanamito:20200202155346j:plain

真骨彫オーズの出来が良すぎて単体でも十分かっこよかったけども、アンクが横にいるだけでポーズのバリエーションも増えるのでだいぶうれしい。

f:id:takanamito:20200202155615j:plain

いつか真骨彫バースとこのセルメダルを組み合わせて飾りたいんだけども、めちゃくちゃ無くしそうで心配。

2019年買ってよかったもの。デスストとか仙骨枕とかオーズの真骨彫とか

去年に引き続き、買ってよかったもの

takanamito.hateblo.jp

ゲーム

デス・ストランディング

おもしろすぎた。
荷物を運ぶだけでプレイのほとんどが移動なのになぜか楽しい。(SwitchのゼルダPS4スパイダーマン以来3度目)
どこか Astroneer 的な楽しさを思い出す感じで、ほどよく戦闘も散りばめられていて、それでいて飽きないように新しい要素を小出しにしてくれるので満腹感がすごい。

メタルギアシリーズは難しいのとドキドキしすぎるのでできなかった自分でも最後まで楽しめてプレイできた。

これを独立一発目で作り切るコジマプロダクションは本当にすごい。

【PS4】DEATH STRANDING

【PS4】DEATH STRANDING

エースコンバット7

最後にプレイしたのが高校時代のエースコンバット6なので、おそらく10年ぶり。
特に好きだったのが突風や雷、雲などの環境要素が自機に影響を及ぼしてくる演出で(機体流されたり、落雷食らったり、視界なくなったり)
この要素でよりギャーギャー言いながら楽しめたのでよかった。(どうやら巷ではあまりそうは思われていないらしい)

反面ストーリーのボリューム不足感は否めず
「もしかして初期構想ではストーリー分岐があった?」みたいなムービーカットインなど若干の違和感が残ったのは確か。

とはいえPS4のグラフィックでまた空中戦できたり、過去作からあの兵器やあの人出してきたりと、激アツシーンではやっぱり燃えたので楽しかった。

あとVRはやばい。試したけどフレームレート上がってもうちょい高品質になったらおしっこ出そう。

【PS4】ACE COMBAT™ 7: SKIES UNKNOWN

【PS4】ACE COMBAT™ 7: SKIES UNKNOWN

本とマンガ

新装版 機獣新世紀ZOIDS 13.5話 港町の嵐

ブレードライガーに進化してジェノザウラーを倒した直後から始まる特別編がズルい。
「そうそう。漫画はブレードじゃなくてシールド推しやったよね」と思い出させてくれるいい回
単行本に載るかわからなかったので、わざわざコロコロアニキも買いました。
今は電子版で3巻とも出版されているので、アラサー世代は全員買うといいです。

新装版 機獣新世紀 ZOIDS(ゾイド)(3) (小学館クリエイティブ単行本)

新装版 機獣新世紀 ZOIDS(ゾイド)(3) (小学館クリエイティブ単行本)

べしゃり暮らし 20巻

最終回の続き。買うに決まってる。

べしゃり暮らし 20 (ヤングジャンプコミックス)

べしゃり暮らし 20 (ヤングジャンプコミックス)

二軍監督の仕事~育てるためなら負けてもいい~

元ヤクルトの高津選手の監督論
二軍監督という特殊な役割を求められる立ち位置で、どう監督をこなしていくかが現代っぽい視点で書かれている。

数年前に真中監督の選手育成論を読んでからヤクルトの育成方針には興味があって
特に「選手たちに自分で考えさせる」という方針はこの本にも書かれており、普段のお仕事でマネジメントに活かしたくなる内容だった。

二軍監督の仕事 育てるためなら負けてもいい (光文社新書)

二軍監督の仕事 育てるためなら負けてもいい (光文社新書)

  • 作者:高津臣吾
  • 出版社/メーカー: 光文社
  • 発売日: 2018/11/14
  • メディア: 新書

言い訳 関東芸人はなぜM-1で勝てないのか

お笑い論をプロが公に話す時代になってきてすごく楽しい。

言い訳 関東芸人はなぜM-1で勝てないのか (集英社新書)

言い訳 関東芸人はなぜM-1で勝てないのか (集英社新書)

Rubyのしくみ Ruby Under a Microscope

CRubyのソースコードを読む機会があって購入

GitHub - ko1/rubyhackchallengeruby/extension.ja.rdoc at master · ruby/ruby · GitHub を読んでもわからない部分について、この本では解説されてることがあってとても助かった。

Rubyのしくみ Ruby Under a Microscope

Rubyのしくみ Ruby Under a Microscope

映画

ゴジラ キングオブモンスターズ

人生の映画ランキング1位の座をインデペンデンス・デイから奪った。
南極でゴジラが倒れた拍子に熱線の流れ弾で建物が大爆発するところと
ラドンとの鬼ごっこシーンが怪獣にしかできない戦闘の連続ですばらしい。

ゴジラ キング・オブ・モンスターズ(字幕版)

ゴジラ キング・オブ・モンスターズ(字幕版)

  • 発売日: 2019/11/18
  • メディア: Prime Video

アクアマン

とにかく爆発を起こしてストーリーを進めてくるので油断ならない。
シチリアの戦闘シーンが何回観てもどうやって撮ってるのかわからん。CG?

アクアマン(字幕版)

アクアマン(字幕版)

  • 発売日: 2019/05/08
  • メディア: Prime Video

機動戦士ガンダム 逆襲のシャア 4DX

お台場で期間限定4DX上映されてた。
ガンダムシリーズコクピット視点がちょいちょいあるので、4DXとの相性がとっても良い。
アムロとシャアが鉢合わせするシーンで、シャアの馬の振動がパカラッパカラッて伝わってきたのが楽しかった。

機動戦士ガンダム 逆襲のシャア

機動戦士ガンダム 逆襲のシャア

  • 発売日: 2016/08/15
  • メディア: Prime Video

その他

RAVPower 61W USB-C 急速充電器

MacBook Proの充電器を持ち歩きたくなかったので購入。
小さすぎてびっくりする。

仙骨

ダルビッシュ選手が使ってたトレーニング用アイテム。
腰痛と背中の貼りの調子がよくなかったので試してみたところけっこう良くなった。

動画と本でストレッチの形を勉強して1日5分くらいで良い感じになるので同じように悩んでる人は試してみると良さそう。
リングフィットアドベンチャーより楽なはず。


シーズン中、キャッチボール前に欠かさずやっていたルーティーン。

一生痛みのないカラダをつくる 背骨コンディショニング

一生痛みのないカラダをつくる 背骨コンディショニング

仙骨と言えば、滝丸が栓抜きショットで美食會のやつから抜き取った骨

S.H.フィギュアーツ 真骨彫シリーズ

最近のフィギュアの精度がすごすぎる。
特にオーズは膝下に左右ロールの関節が入ってたりしてポーズが自由自在。あのプロポーションでコンボチェンジギミックが入ってたりと異次元。
勢いでガタキリバも予約してしまった。

そしてうれしいのがオプション小物。
オーズはオーメダルが米粒以下のサイズなのにきちんと刻印が目で見えるし、ディエンドのライダーカードもちゃんとカードの種類が識別できる。
どうやったらあの精度で整形、プリントできるのか謎。

1月にはアンクの腕が発売されて、セルメダルが100枚ついてくるらしいのでこれまた楽しみ。

teyuに届いたPullRequestで使われているRubyの高速化手法

この記事は ZOZOテクノロジーズ #1 Advent Calendar 2019 21日目の記事です。
昨日の記事は @awsmgsさんによる「Classic ASPによるRESTful APIのルーティング実装例」でした。

この記事では、会社の開発合宿でつくったgem teyu に届いたPullRequestで使われていた高速化手法の紹介と、なぜ速くなるのか?の考察をします。

techblog.zozo.com

届いたPullRequest

sonots さんから2件の高速化PullRequestが届きました。

前者では each ではなく while でループをさせる手法が
後者ではメソッド定義に define_method ではなく class_eval を使う手法が使われており、なぜその変更を加えることで速くなるのか気になったため調べてみました。

まずはそれぞれの手法を比較するため、ベンチマークスクリプトを書いてみました。
実行環境は以下の通りです。

高速化その1 eachwhile

こちらは while の方が 1.9倍 速い結果となりました。

require 'benchmark_driver'

Benchmark.driver do |x|
  x.prelude <<~RUBY
    def loop_with_each
      i = 0
      100.times.each { i += 1 }
    end

    def loop_with_while
      i = 0
      while i < 100 do
        i += 1
      end
    end
  RUBY

  x.report 'each', %{ loop_with_each }
  x.report 'while', %{ loop_with_while }
end

# 結果

Warming up --------------------------------------
                each   240.338k i/s -    259.188k times in 1.078431s (4.16μs/i)
               while   695.778k i/s -    720.603k times in 1.035680s (1.44μs/i)
Calculating -------------------------------------
                each   242.415k i/s -    721.014k times in 2.974293s (4.13μs/i)
               while   702.913k i/s -      2.087M times in 2.969545s (1.42μs/i)

Comparison:
               while:    702913.1 i/s
                each:    242415.3 i/s - 2.90x  slower

なぜ while の方が高速なのでしょうか?
Rubyのしくみ Ruby Under a Microscope
『実験8-1: while ループと each にブロックを渡すのとどちらが速いか』という章で、この疑問について触れていました。

each を使用すると遅くなる理由は、 Range#each メソッドはループの繰り返しごとにそのつどブロックを呼び出すか yield する必要があるからだ。 ブロックの呼び出しにはかなりの量の仕事が含まれる。ブロックをyield するために、Ruby はまずそのブロック用に新しい rb_block_t 構造体を作成する必要がある。 続いて、新しい rb_block_t構造体の EP に参照元の環境を設定し、ブロックを each 呼び出しへと引き渡す。それから、ループを繰り返すごとに RubyYARV の内部スタックに新しいスタックフレームを作成し、ブロックのコードを呼び出す。 そして、最後にブロックの EP を新しいスタックフレームにコピーする必要がある。それに比べて、単純な while ループの実行は、ループの繰り返しごとに PC(プログラムカウンタ)をリセットするだけでよいため、速い。 while ループの実行はメソッドも呼び出さないし、新しいスタックフレームも新しい rb_block_t 構造体も作成しない。 PatShaughnessy. Rubyのしくみ Ruby Under a Microscope (p.225). Kindle 版.

Rubyのしくみ -Ruby Under a Microscope-

Rubyのしくみ -Ruby Under a Microscope-

eachを使ったループはブロックの実行を伴う。
ブロックの実行には rb_block_t 構造体の作成と、ブロックの呼び出し元の情報にアクセスするためのスタックフレームの位置情報(EP)をコピーする作業が必要なため、whileループと比較して高コストであるという説明が書かれています。

実際に CRuby のソースコードを見てみると、eachメソッドの内部で rb_yieldメソッドが呼ばれ、Cでブロックが実行されていることがわかります。

高速化その2 define_methodclass_eval

こちらも class_eval の方が速い結果となりました。

require 'benchmark_driver'

Benchmark.driver do |x|
  x.prelude <<~RUBY
    class NormalInitialize
      def initialize; end
    end

    class DefineMethod
      define_method(:initialize) { }
    end

    class ClassEval
      class_eval "def initialize; end"
    end
  RUBY

  x.report 'Normal', %{ NormalInitialize.new }
  x.report 'define_method', %{ DefineMethod.new }
  x.report 'ClassEval', %{ ClassEval.new }
end

# 結果

Warming up --------------------------------------
              Normal     9.398M i/s -      9.592M times in 1.020589s (106.40ns/i)
       define_method     8.562M i/s -      8.690M times in 1.014931s (116.79ns/i)
           ClassEval     9.376M i/s -      9.529M times in 1.016375s (106.66ns/i)
Calculating -------------------------------------
              Normal    11.058M i/s -     28.194M times in 2.549770s (90.44ns/i)
       define_method     9.689M i/s -     25.686M times in 2.651137s (103.21ns/i)
           ClassEval    10.825M i/s -     28.128M times in 2.598282s (92.37ns/i)

Comparison:
              Normal:  11057643.6 i/s
           ClassEval:  10825450.8 i/s - 1.02x  slower
       define_method:   9688723.0 i/s - 1.14x  slower

るりまを見てみると両者の挙動の差がわかります。

class_evalは以下のようにドキュメントが書かれており、上記のベンチマークコードで考えると
ClassEvalクラスのコンテキストで文字列 def initialize; end が評価されてメソッド定義がされます。

モジュールのコンテキストで文字列 expr またはモジュール自身をブロックパラメータとするブロックを評価してその結果を返します。 モジュールのコンテキストで評価するとは、実行中そのモジュールが self になるということです。つまり、そのモジュールの定義式の中にあるかのように実行されます。

対して define_method のドキュメントを読むと、定義された DefineMethod#initialize メソッドは new するたびに DefineMethod クラスのインスタンス上で instance_eval されることがわかります。

ブロックを与えた場合、定義したメソッドの実行時にブロックがレシーバクラスのインスタンスの上で BasicObject#instance_eval されます。

メソッド実行のたびに instance_eval される時点で class_eval 経由で定義されたメソッドと比較して遅くなりそうなものですが
加えて instance_eval は、そのオブジェクトのコンテキストで「ブロックを評価」するため
eachwhile の項目で書いたように、ブロック実行に伴うスタックフレーム作成などの処理が発生しこのようなベンチマーク結果の差に繋がるようです。

最後に

普段Webアプリケーションを書く上ではなかなか使う機会がなさそうな高速化手法をgem開発を通じて知ることができました。
このPullRequestを取り込んだバージョンは v0.2.0 としてリリース済みで、似たような機能を持つ attr_extras gemより高速に動作するベンチマーク結果が出ています。
※こちらのPullRequestをご参照ください Fastest version #3

初期化時に引数を大量に受け取るクラスを書いている方はぜひteyuの導入をご検討ください。

明日の記事は @inductor さんによる「GKE完全に理解した」です。

openapi2ruby v0.2.0をリリースしました

github.com

変更点

変更の経緯

OpenAPI 3.0で導入されている oneOf記法に対応するPull Requestが届いたので取り込んでリリースしました。
Pull Requestを送ってくださった gami-meryさん ありがとうございました。

itamae-plugin-recipe-datadog v0.2.0をリリースしました

github.com

変更点

変更の経緯

前職時代にOSSとして公開したgemでしたが、退職に伴ってメンテナを引き継げておらず放置状態になっていました。
そこにPull Requestをいただいたことで再び同僚を通じてcollaborator権限をもらう段取りになり、今回のリリースに至りました。
Pull Requestを送ってくださった id:Pocket7878_dev さん ありがとうございました。

2018年買ってよかったもの

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

続きを読む

ActiveModel::Serializersでリソースに応じて動的にSerializerを切り替える

この記事は ZOZOテクノロジーズその2 Advent Calendar 2018 - Qiita 13日目の記事です。

今回はActiveModel::Serializers(AMS)の便利メソッドを紹介します。 github.com

AMSを使ってjsonシリアライズ実装をしていたのですが、以下のような非ActiveRecordオブジェクトのシリアライズ
動的にSerializerを切り替えたい場面で困った事がありました。

続きを読む