Diary of a Perpetual Student

Perpetual Student: A person who remains at university far beyond the normal period

【PJCS2025 4-3 Drop😭】不利なリザードンexにもワンチャン作ったびっくりサーフゴーexデッキのふりかえり

こんにちは。Arthurです。

CL2025大阪で優先招待出場権をいただいた*1ので、念願のポケモンジャパンチャンピオンシップス2025カードゲーム部門に出場しました。

キービジュアルに合わせてミュウツーのTシャツを着ていきました

使用したのはサーフゴーexデッキです。結果はDay 1で4-3ドロップ(735位/2500人)という不甲斐ない結果に終わってしまったのですが、本エントリにて振り返っていこうと思います。

デッキリストと戦略

デッキリスト

リストはリリー(@lily_pcg)さんに頂いたものをそのまま使用しました。いつもオンラインコーチング*2でお世話になってます。私が仕事人間で常時環境を追い続けていくことが困難なので、知識を補完してもらっています。

デッキコード: FFbkbv-tPozqh-FVvvbk

採用/不採用カードの特徴は以下の通りです:

  • スボミー採用
  • マシマシラ採用
  • エースキャンセラーのゲノセクト採用
  • ロケット団のびっくりボム採用
  • ロケット団の監視塔2枚採用
  • ピクニックバスケット採用
  • フトゥー博士のシナリオ2枚採用
  • ハッサムライン不採用
  • ワザマシン:エヴォリューション不採用

サーフゴーexデッキを選択した理由

今環境では以下のデッキの存在感があると感じました:

  • タケルライコex/オーガポンみどりのめんex
  • オーロンゲex/ユキメノコ
  • ドラパルトex
  • サーナイトex/マシマシラ

特に、PJCS1週間前に開催されたEUICにて、有名プレイヤーであるTord Reklev選手がドラパルトexデッキを使用してTOP4に残った*3ことから、カーストボムを採用しないドラパルトexの使用が増えると予想しました。また、同じようにそれを見越したプレイヤーが、オーロンゲexやサーナイトexといったマシマシラを有効活用できドラパルトexに有利に立てるデッキを使用すると考えました。

以上の理由から、これらに有利な構築で臨めるサーフゴーexデッキを選択しました。タケルライコexに対しても、こちら側が1ターン目にサイド2枚のポケモンを出さないことで、先に2-2-2のサイドレースを仕掛けられることなどから五分以上はあると捉えていました。

デッキの性質上メタビートやバクフーンには基本勝てないですが、10回戦中2回当たる分には良くて、他の対面で全部勝てばDay 2に上がれるので割り切りました。リザードンもかなり厳しいですが、後述するプランにより勝てないことはないぐらいのつもりでいました。

なお、サーフゴーexデッキは手札が多くなる(取りうる選択肢が指数関数的に増える)こと、いくら途中まで順調でも最後にグッズロックにより負け確になる落とし穴が存在していることなどにより、個人的は苦手なデッキと思っていました。また、ゲノセクトex/ふうせんを採用している都合上、PTCGLで練習できないことも向かい風でした。

それでも、直前に参加した小規模な自主大会で全勝優勝できたことから、自信を持ってPJCSに持っていけると判断しました。自信を持てないままふわふわと一貫性のないプレイをし続けると良い結果も出ないしメンタルも最悪なので、ポジティブな気持ちで握れるかというのも大事な価値基準です。

タケルライコexデッキ対面について

先にサイド1枚取らせて、後攻2ターン目にこちらがサイド2枚のポケモンを取れば2-2-2で進めることができます。多くの場合先2ではスピンロトムなどの非エクポケモンが前にいるため、カウンターキャッチャーORボスの指令が必要となります。

先にサイド2枚取られると基本負けなので、後1でゲノセクトexは置きたくないです。相手がタケルライコexに手張りしていない状況(次にオーリム/アカマツ要求でボスの指令が打てない)で、かつむずむずかふんが言えるなら出してもいいでしょう。エースキャンセラーでもいいんですが、ポケモンキャッチャーで泣きを見ないといいですね。とはいえエースキャンセラーは普通に強いです。

キチキギスexはコライドンやチヲハウハネで2-1交換されてしまいこちらの要求が増えるので、最後までなるべく出さないようにしましょう。

ドラパルトexデッキ対面について

エネルギーテンポを失わせると非常に楽に勝てます。序盤のボスでエネルギーがついているドロンチを倒せると嬉しいですし、ネオアッパーエネルギーを止められるエースキャンセラーが非常に強力です。

あとはサーフゴーが倒れないようにマシマシラとピクニックバスケット、フトゥーで回復しながら倒していけばドラパルトexの強みを活かさせないまま勝つことができます。

エネルギーが足りなくてHP320のドラパルトexをワンパンできないときには、マシマシラ・びっくりボムを活用して倒したり、あるいはどうせ集めたエネルギーがナンジャモで消えてしまうならと300点だけ当てておくのもなくはないと思います。相手のフトゥー(Tordドラパには2枚採用)が裏目になりますが、そこまでにエネルギーテンポを失わせるプレイが通せていると、「ここでフトゥーを打つとファントムダイブできないけど大丈夫ですか?」という状態になることがあります。

サーフゴーは素の合計でだいたい1000点ぐらいは与えられるデッキ(ゴールドラッシュに使えるエネルギー7枚+スーエネとタンカで回収できるエネルギー17枚で計1200点分。ここからサイド落ちなど考えてざっくり1000点*4)です。仮にフトゥーで300点のダメージが無駄になったとすると、250(キチキギスex)+50(スボミー)+100(ドロンチ)+350(ドラパルトex)=750点のサイドプランならギリギリセーフって感じです。マシマシラを有効活用できたりスーエネが4枚使える場合にはなんとかなるし、後のスーエネで4枚エネを拾うために序盤に多めにトラッシュしているとその分厳しくなります。

オーロンゲexデッキ対面について

デヴォリューションでサーフゴーが全滅するのがわかりやすい負け筋です。コレクレーを全部サーフゴーに乗せすぎないことが一つの解決策になります。ただ、相手の盤面にダメカンがたくさん残っている場合、アドレナブレイン3回でコレクレーがいなくなってしまった上にデヴォされたら終了です。とはいえ、フトゥー・ピクニックバスケット・マシマシラを活用する、ユキメノコをボスで取ることを意識すれば、こうなるケースを回避できるはずです。

グッズロックでスーエネが止まるのが怖くて相手のスボミーに構いたく気持ちはわかりますが、アドレナブレインでいつでも取れるサイドと思ってしばらく放置しておくのが良いと思います。オーロンゲexデッキは意外とベンチカツカツで、スボミーを残しておくと相手のできることが減ります。

基本ですが、こちらのマシマシラのアドレナブレインでダメージを移すときには、このターンに倒す相手に乗せましょう。必要エネルギーが減りますし、相手の盤面のダメカンを増やすとマシマシラの餌になってしまいます。

ガチグマアカツキexの採用が見られるので、サイドが2-2の展開になってしまったら、監視塔+ナンジャモで勝負しましょう。

リザードンexデッキ対面について

サイド1枚のポケモンであるイーユイがこちらのサーフゴーをワンパンして1-2交換となるのがかなり厳しいです。

先にサイドを3枚取って3-6に持ち込めると、こちら側が必要なターンは2ターン/相手側が必要なターンは3ターンになり、理論上はこちらが先に勝ちます。サイド枚数が奇数なのでイーユイを挟まれても問題なく、2回連続イーユイ/リザードンが走ってきて奇数進行になってしまうときに備えて裏呼びが1回できれば良いことになります。

対して、サイド4-6から相手のイーユイにサーフゴーを取られて4-4になる展開だと、以後ナンジャモで手札干渉される中で、HPの大きな(=エネルギー要求が高い)ポケモンを裏呼び込みで倒すのを2回連続やらなければ負けてしまうので望みがかなり薄いです。もちろん、サイド4枚時のバーニングダークは240点なのでイーユイを一旦放置して準備することは1ターンだけ可能に見えます。しかし、リザードン側がまけんきハチマキ・マキシマムベルトを採用していたり、カーストボムラインを採用していたり、グッズロックされたりするとこれも通りません。サイド2枚のポケモンを置かれないプレイをされてしまった場合には必要ターン数が増えて負け確定です。また、4-4時点でイーユイに構った場合にはサイドが3-4になり、以降はリザードンがサーフゴーをワンパンしてくるので、相手の方が2-2-2で早くサイドを取り切ってしまいます。

さて、どうやって先にサイドを3枚取るかという話ですが、リザードンデッキにはピィやスボミーといったHP30のポケモンが採用されています。ここにあらかじめスボミーむずむずかふんの10点を当てておき、ロケット団のびっくりボムと、必要に応じてマシマシラのアドレナブレインを使用することで、ピィ/スボミーと前に出てきたポケモンで一気にサイド2枚取り進めるターンを作ることができます。リザードンの展開速度的にこれ以外でサイド1枚を取ることができる(典型的にはボスの指令でピジョン/リザードを取る)ので、トータル3枚というわけです。

ほかにも、こちらがサイドを取らないでいるまま、リザードンにサーフゴーをワンパンできない火力で殴ってもらい、そのダメカンを元手にアドレナブレイン込みでサイドを一気に複数枚取りすることもできるでしょう。リザードンexがHP330(50×6+30)、ピジョットexがHP280(50×5+30)なので、50の倍数でダメージが乗るゴールドラッシュでギリギリまでダメージを与えておくと、アドレナブレイン1回でちょうど倒せます。

2つ目のルートにはターンの隙があり、NAICシニア優勝のリザードンデッキ*5のようにマシマシラやピクニックバスケットが採用されている場合には容易に破綻します。前者のパターンにおいては、ピクニックバスケットがグッズロックで使えません。また、マシマシラがいて10点動かされても、動かされた先がサーフゴー(コレクレー)なら、そのポケモンを正面にしてびっくりボムチャレンジすれば30点一箇所に集まるので、問題になることは少ないでしょう。

バチュルバレットデッキ対面について

こちらは2-2-2を通し、相手の2-2-2を防ぐ攻防プレイをすることになります。相手の方がバチュチャージ分1ターン遅く動くのですが、ボスが引けない場合にサイド1のバチュルを取らされる展開になりこちらが遅れてアドが消えます。基本的には相手のサイド2枚取れる能力を持つ、エネルギーがついたポケモンを狙っていくことになります。サイド2枚取らせることを許せないターンを1ターン作れればその分猶予があるので、バチュルを取って5-6を経由しても全然大丈夫です。

サーフゴーデッキだと相手に知られると、だいたいピカチュウexにエネルギーが集まることが多いと思います。ピカチュウexに対してはびっくりボムと必要に応じてマシマシラを使うことで特性を貫通することができます。このエネを有効に使わせないまま倒せると良いですね。

びっくりボムが当たった方がお得かどうかは実は状況によります。相手がサーフゴーをワンパンし続ける展開のときにはマシマシラを用意するエネルギーテンポが間に合わないことがあり、その場合には表が出て欲しいです。裏が出た場合にはマシマシラが必要(=ごっつぁんプリファイのリスクを負う)になりますが、アドレナブレインを2回に分けて行うことでピカチュウexを2回突破する権利を得ます。

テツノカイナexにエネルギーが集まった場合にはコレクレーが残らないようにサーフゴーに乗りましょう。ハンド干渉は多くないので乗りやすいと思います。また、ごっつぁんプリファイされないポケモンで盤面を揃えられた場合には、エネルギーが集まってるからといって怖がらずにテツノカイナex以外のポケモンを取りましょう。シビビール型の場合により有益なポケモンにエネルギーがつかないようにしたり、単純につりざおで返されないようにしたりする目的です。だいたい相手はブーエナ未来を張ったり序盤の展開でラティアスを置いたりするので、テツノカイナにつけてしまったエネルギーをトラッシュに送るのは困難です。

ミライドンexにエネルギーが集まった場合には、こちらのゲノセクトex/キチキギスexが標的となっています。ミライドンexを取るか、ゲノセクトex/キチキギスexをフトゥーでどけるか、あるいはエースキャンセラーで少しでも裏呼び回答を減らすかしましょう。終盤は相手のガチグマアカツキexでも同様のことが言えます。こちらに関しては監視塔でカバーできることがあります。

バチュルを避けずに5-6から始まった場合、サイド3枚の状態からゼクロムexがサーフゴーexをワンパンすることも頭に入れておくと良いでしょう。逆にバチュルを避けた場合は、バングル+デンチュラ210点でキチキギスexが飛んでしまうので、できる限り出さないようにしましょう。

ミラー対面について

先にサイド2枚のポケモンを出して取られてしまった方が負けるゲームです。まずはスボミーとマシマシラで頑張りましょう。

ハッサム採用型と異なりエースキャンセラーに枠を割けているのがミラーでも強いです。

リグレーとの向き合い方

鋼エネルギーがちょっとずらすされて足りなくなりそうな場合には、フトゥーとスーエネ(ORタンカ)を同じタイミングで打つと良いと思います。リグレーを採用するコントロール寄りのデッキにはおそらくスボミーも採用されており、後回しにしているとグッズロックされて回収不可能になってしまいます。

エクストラでコントロール系統デッキに対してグズマを使用した瞬間に即バトルサーチャーで回収するプレイに馴染みがある方には分かっていただきやすいと思います。

戦績と対戦ログ

サマリー

Day 1 予選 4-3

  • vs リザードンex/ピジョットex 先攻 ●
  • vs ドラパルトex/ブリジュラスex 後攻 ◯
  • vs ドラパルトex/ネイティオ 先攻 ●
  • vs ヒビキのバクフーン/ピジョットex 後攻 ◯
  • vs ドラパルトex 先攻 ◯
  • vs ドラパルトex/バシャーモex 先攻 ◯
  • vs ブリジュラスex/マシマシラ 後攻 ●

対戦ログ

1回戦 vs リザードンex/ピジョットex 先攻 ●

じゃんけん負けで先攻。しかし相手は後攻でサポートなし。前イーユイ後ろピィで番が帰ってきた。このときハイパーボールでピクニックバスケットがトラッシュに行ったので相手に先に殴らせてもよかったが、この時点でヒトカゲを置けていない相手をずっと待つのもしんどいので、早期3-6ルートを目指すことにした。

サーフゴーでイーユイを取り5-6。返しにポッポ2匹ヒトカゲ2匹が準備された上にピィが前に出てきたので、ピィにむずむずかふんを打つ。

ポッポはピジョンに進化し、またもピィがにぎにぎドロー。ここでびっくりボム+マシマシラでピィを取りつつ、ボスピジョンできればかなり勝てそう!しかし、ボスは引けなかったので、ピィと前にでてきたポッポを取って3-6。大地の器がサイド落ちしていたため、悪エネルギーを持ってくるためにエネルギー転送PROを消費。このときトラッシュにエネルギーを最低限しか送らなかったのが結構なプレミとなる。あとこの番に暗号マニアが引けていたら山上を固定できたのだが引けず。

ここでハンド干渉されリザードンexが立ち、サーフゴーexを倒して3-4。ここからはサーフゴーがワンパンされるので、次の番はなんとしてもサイド1枚以上を取らなければならない。しかし、ボスも引けずエネルギーも引けずということで要求を満たせずにここで負け確定盤面に。トラッシュをエネルギーに送らなかった分山には大量のエネルギーがあったが、それでも手札に2枚しかエネルギーがなかったのでスーエネ引けてても結局リザードンワンパンは足りなかったというオチ。ボーナスコインで多くドローするために逃げ権を使ってしまい、フトゥーも引けなかったので、サイコトリップでお茶を濁すこともできず。そのまま4枚取られて負け。

結果は負けてしまったが、不利対面に対して考えていたプランをちゃんと通せてよかったと思った。

2回戦 vs ドラパルトex/ブリジュラスex 後攻 ◯

相手がまともにサポートを引けておらず、ドラメシヤ・ドロンチ・ジュラルドンを取って行ったら種切れ確定だったのか相手が投了した。

5分ぐらいで終わったので会場を探検してた。

3回戦 vs ドラパルトex/ネイティオ 先攻 ●

じゃんけん負けて先攻。むずむずで止まったものの、ボス2エネドロンチ取りで快調のスタート。

しかし、アンフェア後の手札の噛み合わせがずっと悪く、フトゥーで時間を稼ぐことしかできなかった。というか、どこかで暗号マニアの上下を間違えたのが激烈に刺さった。

残りサイド4-2で残り時間が1分半。先攻を取らされたのでおそらく自分の番はもう帰ってこず、ほぼほぼ両負けOR相手の勝ちという状態に。一応少しでも時間を残してもう1ターン作ろうと甘いプレイをしてサイド2-2にした結果、ガチグマで負け。まあオポネント関係ないし両負けで気まずくなるよりはよかったのかなあ。

4回戦 vs ヒビキのバクフーン/ピジョットex 後攻 ◯

崖の初戦でド不利デッキと当たって絶望。そういえばCL大阪でも崖でミライドン踏んでたなあ。

とりあえず後1むずむずかふんして止まるのを祈ったら、なんとサポなしで止まった。

後2でボスの指令でピジョンを取ってスタート。ここから相手がハイパーボールで動き出す。

前のヒノアラシも取ってサイド4-6に。このあと相手がたびのきずなを使うが対象なし。これはヒビキの冒険が2枚サイドに落ちているかもしれない。サーフゴー相手には2枚で打点は足りるものの、単純にポケモンとエネルギーを持って来れるのが強いので3枚目も持ってくる価値がありそうだった。バクフーンがサーフゴーを倒してサイド4-4に。

このバクフーンを倒して3-4、次にサーフゴーが倒されて3-2になる見込みなので、暗号マニアの解読でナンジャモとスーパーエネルギー回収を山上に仕込んでおく。また、アタッカーとしてマシマシラを準備しはじめる。

実際に3-2になった上にスイレンのお世話でバクフーンラインを手札に持たれ、サイドからヒビキの冒険を引いてそうという状態。監視塔(ポッポがいたのでアメ+ピジョットex対策)を貼りナンジャモで手札干渉。バクフーンを倒して2-2。要求はアメ+バクフーン+エネルギー。シークレットボックスを使われないようエースキャンセラーも準備済み。

ここで相手が殴れずにポッポを差し出してパスしてきたので、このポッポをマシマシラのサイコトリップで取って1-2。裏呼び要求を追加できた。

次のターンも相手が殴れなかったので、こちらがサイドを取り切って勝利。

5回戦 vs ドラパルトex 先攻 ◯

じゃんけん負けて先攻。相手がキチキギスex前でデッキがよく分からんという状態だったがドラパルトだった。当然グッズロックされ続ける。

これが刺さりゲノセクトexが置けず、おつかいループでエネルギーを集め続ける。しかし相手も相手でエネルギーが全然貼れない。そのうちサーフゴーexを単体で引いたのでむずむずの打点を受けないように進化しておきつつ倒す。返しでスボミーがまたやってくる。

先に相手がドラパルトexに乗ってエネルギーを1つつけ、むずむずかふんしたタイミングでようやくゲノセクトexを引きゲームスタート。おつかいで貯めたぶんと合わせてボスの指令ドラパルトexで300点与える。さすがにグッズロック下で350点は無理だし、モタモタしてるとせっかく集めたエネルギーがナンジャモされそうだったので勝負に出た。

返しでエネ手張り+ファントムダイブを受けるが、マシマシラを出してドラパルトexに30点動かしてきぜつさせサイド3-6。そこで相手がラティアスexを出してきたので、ここにまた200刻む。キチキギスがいるので刻むつもりはそんなになかったが、エネルギーが足りなかった。さらに盤面にエネルギーがなくなった状態でエースキャンセラー発動。これで次のターンはファントムダイブされない。

ふうせんを2枚見せてしまったことをいいことに相手はゲノセクトexをカウキャで呼びナンジャモで準備のターン。返しにドローを進めるも逃がせるカードを引かないのでパス。ファントムダイブをゲノセクトexとサーフゴーexに受け、サイドが3-4に。

そのあともキチキギスexまで使ったのに逃げ札を引けず、ペパーを打ったら3枚目のふうせんがサイド落ちという事実に気づく。キチキギスex置く前にネストボール使って山見ておけば気づけたけど、ナンジャモ的には山シャッフルしたくなくて我慢していた。これでは次にカウンターキャッチャーとルチャブルで負けてしまう。仕方ないのでアドレナブレインでラティアスexを取ってサイド2/3に賭けたらふうせんを引けたので、前のドラパルトexを取って勝ち。

結果は勝ちだったけど色々怪しい試合だった。

6回戦 vs ドラパルトex/バシャーモex 先攻 ◯

じゃんけん負けて先攻。相手は後攻サポートなしで事故。

そのまま先2で前のアチャモ取って、先3ボスドロンチ、先4ドラメシヤまで行って残りサイド3-6。

このあとはリバーサルエネルギーがついた非エクバシャーモがゲノセクトexを取って3-4。そのバシャーモを取って2-4。

バシャーモexがサーフゴーexを取って2-2。バシャーモexを倒して勝利。

7回戦 vs ブリジュラスex/マシマシラ 後攻 ●

初期手札はマシマシラ・キチキギスex・エネ2枚・フトゥー・ボス・ピクニックバスケット。マシマシラ置きスタート。コレクレー置けない!!

相手は先1ゼイユイキリンコでぶん回って、次確定でジュラルドンが殴れる状態。関係なかったけどスボミーケアまでされた。

後1トップは暗号マニアでギリギリセーフなのか?仕方なく種切れ負け回避のためにキチキギスexを置き、暗号マニアでペパーをセットして終了。先2で当然のようにボスでキチキギスexが飛ぶ。

マシマシラを壁にしてペパーポフィンでコレクレー2枚を並べ、ボスでエネルギーがついてないジュラルドンを呼ぶ。返しにそのジュラルドンも3エネついたブリジュラスになり、テツノツツミハイパーブロアーでコレクレーきぜつ。このまま1回もサーフゴーに乗れず種切れで終了。

有利対面だったのにあっけない最後でした。初めてエヴォリューション不採用が仇となりました。

思い出

今回はブラックボルト・ホワイトフレア発売直後だったので、そのイメージのネイルで臨みました。

1戦目終了後にポケモンカードYouTuberのじゅん(@jun_youtube_)さんに席を特定され話しかけてもらいました。いつも配信見てるので超嬉しかったです。文句なしにPJCS一番の収穫です。

www.youtube.com

他にも、CL大阪で戦ったプレイヤーや、一般観覧に来た人など数多くの人と交流できました。SNSでも多くの方に応援いただきました。全ての出会いに感謝。

反省は生大の形

まとめと謝辞

リリーさんに「後攻とれることを祈っております」と言ってもらったんですが、余裕で先攻取らされまくりましたね。とはいえ先攻でもちゃんと勝てたのでそこまで気にしてないです。

PJCSには初めて参加しましたが、おかげさまで寂しくなく過ごすことができましたし、デッキ選択に悔いもなく、結果だけが心残りというところで終わることができました。対戦ログを読んで分かる通り、まだまだプレイミスがあるので、自覚できている分伸び代があるということにします。

改めて、一緒にプレイしていただいたり、応援いただいたり、私には見えていない世界を教えてくれたりするみなさまのおかげで2025シーズン頑張れました。ありがとうございました。

自分にとって2025年シーズンは終了してしまいましたが、来シーズンもスタンダード/エクストラレギュレーション両方で諦めずに続けていくので、応援よろしくお願いします。WCS行くぞ!!!!

*1:https://blog.arthur1.dev/entry/2024/12/25/130000

*2:https://note.com/lilypcg/n/nd90c3781a723

*3:https://limitlesstcg.com/decks/list/18499

*4:という理屈をつけてますが、サーフゴーがぜんこくずかんNo. 1000であることに関連させてなくもないです

*5:https://limitlesstcg.com/decks/list/18809

Googleスライドのデフォルトページサイズは実は小さいので、解像度を上げる設定をすると良い

まとめ

  • Googleスライドやそのテンプレートを作る人は、ページ設定から解像度を上げよう
  • そうすると、Speaker Deckにアップロードするときなどに画像や文字の品質が上がる

本編

Googleスライドを新しく作成するとき、自然とアスペクト比が16:9の設定になっているかと思いますが、これが実際にどのぐらいのサイズなのかを気にしたことはありますか?

そもそも、Googleスライドの縦横サイズは、ファイルメニューの中にある「ページ設定」で確認・変更することができます。

デフォルトだと以下の通り「ワイドスクリーン(16:9)」になっているのですが、ここから「カスタム」に変えて単位も変えてみると、「ワイドスクリーン(16:9)」というのは960*540pxであることがわかります。現代でもデフォルトがFull HDになっているわけではないのです。

画面に映してスライドショーをする分にはこの設定で問題なく鮮明に描画できているはずです。しかし、PDFや画像としてエクスポートしたり、エクスポートしたPDFをSpeaker Deckなどのスライド共有サイトにアップロードしたりする際には支障が起きます。

デフォルトの設定でGoogleスライドからエクスポートしたPDFをSpeaker Deckにアップロードし、その後再び編集画面に行くと、以下のような表示がされていることがわかります。

スライドデータの解像度が足りず、変換の品質が下がってしまう可能性がある旨が書かれています。Googleスライド上の解像度である960*540pxよりもっと小さなサイズとして表示されている理屈はあまりわかりませんが、いずれにせよスライドの大きさが足りていないということです。

元のファイルの解像度が低いと、スライド内の画像の品質が落ちてしまうことがあります。また、Speaker Deckではフォント部分も画像のように変換する処理を行っているので、文字も同様に荒くなってしまったり、周囲のノイズが増えてしまったりすることがあります。

比較用のサンプルデータを用意してみました。デフォルトのサイズでPDFエクスポートしたものと、ページ設定を1920*1080pxにしてエクスポートしたものをどちらもSpeaker Deckにアップロードしました。

speakerdeck.com speakerdeck.com

遠目ではあんまり違いがわからないですが、頑張って拡大してみると、微妙〜〜に左側のデフォルト設定の方がギザギザ感が強い箇所があったり、ノイズが多い部分があったりします。もっと良いサンプルが作れたら違いが一目で分かったかもしれないです。

ページ設定を1920*1080pxにしてエクスポートしたPDFをアップロードしたときには、先ほどのようにYour deck is less than 1000px wide.と注意されていません。

技術イベントで登壇し資料を共有する人や、デザイナーとしてスライドのテンプレートを作る人は、ぜひGoogleスライドのページ設定を確認してみてください。見やすい・読みやすい資料を提供して、読者の没入感を高めましょう。

Goのソースコードを解析して、依存しているOpenTelemetry Semantic ConventionsのAttributeを洗い出すツールを作りました

モチベーション

Go言語でできたアプリケーションにOpenTelemetryの手動計装を行う際、Semantic Conventionsに定められたAttributeを付与するため、OpenTelemetry Go SDKのsemconv packageに定義されている定数や関数を参照してコードを書くことがあります。例えば、以下の例ではResourceに対してservice.name属性を付与しています。

import semconv "go.opentelemetry.io/otel/semconv/v1.31.0"

resource.New(ctx, resource.WithAttributes(semconv.ServiceName("myService")))

ここまで読んでサッパリ何のことがわからない場合には、残念ながらこのエントリを興味深く読めないかもしれないです。

さて、Semantic Conventionsで定められた慣例というのはバージョンを追うごとに変化していきます。例えば、データベースのクエリを表すdb.statementという属性は、v1.25.0からdb.query.textにリネームされました*1

自分たちの計装が古いSemantic Conventionsに定められた属性に依存していないか、依存していたら新しい名称にリネームできないかというのは興味の対象になります。

semconview-go

今回、semconview-goというCLIツールを開発しリリースしました。

github.com

Goのソースコードを静的解析することで、semconv.ServiceName("myService")semconv.ServiceNameKeyなどといった、semconv packageの呼び出しを記録し、これをattributeのkey名に変換してリストアップするものです。

将来的には、リネームされ非推奨になった属性を教えてくれるような機能を追加したり、属性だけでなくメトリック名にも対応することを目指しています。

Homebrewでのインストールができたり、コンテナイメージも配布していたりしますので、ぜひご利用ください。

実装

semconv packageの定数・関数の呼び出し

まず、Goのソースコードの各ファイルごとimport文を解析し、importしているOpenTelemetry Go SDKのsemconv packageのパスとローカル変数名との対応を取ります。

import (
    semconv127 "go.opentelemetry.io/otel/semconv/v1.27.0"
    semconv "go.opentelemetry.io/otel/semconv/v1.31.0"
)

というコードであれば、semconv127go.opentelemetry.io/otel/semconv/v1.27.0semconvgo.opentelemetry.io/otel/semconv/v1.31.0という対応表を作る、というイメージです。

internal/semconview/analyzer.go#L122-L139

semconv packageの定数・関数名をAttributeキーに変換する表の作成

次に、importしているsemconv packageの中身を解析し、定数名や関数名をAttributeキーに変換する表を作っていきます。Go packageの解析にはgolang.org/x/tools/go/packagesを使用できます。

以下のようなコードでpackageをロードします。

internal/semconview/semconvpkg.go#L82-L103

次に、attribute.Key型の定数を探します。

const (
    ServiceNameKey = attribute.Key("service.name")
)

のようなコードになっているので、attribute.Keyの型変換が右辺にあるような代入式を探し、Keyの引数を取り出すことで、定数名と属性キー名の対応表を作ることができます。

/internal/semconview/semconvpkg.go#L105-L164

最後に、attribute.KeyValue型を返却する関数を探します。

func ServiceName(val string) attribute.KeyValue {
    return ServiceNameKey.String(val)
}

のようなコードになっていて、return文の中には先ほど検出対象としたattribute.Key型の定数が含まれています。先ほど作った、定数名と属性キー名の対応表を活用することで、関数名と属性キー名の対応表も作ることができます。

internal/semconview/semconvpkg.go#L166-L206

semconv packageからの呼び出しを検出して属性キーに変換

ここまで来ればあと少しです。元のGoのソースコードを解析し、importして利用しているsemconvの定数や変数を検出します。そして、先ほど作った表を用いて属性キーに変換します。

internal/semconview/analyzer.go#L141-L197

余談

今回、目的を達成するツールを作りたいというほかに、2つのチャレンジをしていました。

  • Goのコードを静的解析する方法を身につける
  • 生成AIエージェントの支援を得てコーディングする

仕事であんまりコードを書かなくなりつつあるので、ちょっとした余暇でものづくりをする際にいろんな目論見を一回の挑戦に詰め込みがちになっています。

Mackerel開発チームサブディレクターになりました

新卒入社からもうすぐ丸3年、Mackerel開発チームのテックリードになってから3か月というタイミングになりますが、2月の人事異動で同チームのサブディレクターになりました。

といっても業務内容は1月までと大きく変わりません。テックリードは引き続き務めますし、このブログではあんまりちゃんと報告していなかったことですが、11月の途中からオブザーバビリティ関連機能のプロダクトオーナーを兼務しています。

技術・プロダクト・チームを見るということで、自分のキャパシティに追いついていかないところもあります。実現力があり自発的に行動してくれる良いメンバーに囲まれてなんとかやっています。

職種に関する相談を上司に持ちかけたのは自分からで、動機となる気になっていたことが2つありました。

一つ目に、プロダクトオーナーとしてプロダクトを掌握する上で、プロダクトに関するチーム内外の相談が自分を通らずに行われることがあったのが気になっていました。チーム内外に自分のポジションが分かりやすい状態になっていた方が、コミュニケーションパスの整理に役立つと考えました。

二つ目に、現在ほとんどコードを書かない生活をしている中、アプリケーションエンジニアとしてだけの成果・行動・専門評価を受けることが誠実でないと思っていたことです。エンジニアとしては領域を越境していると評価されることもあるのですが、チーム内での自分のロールとしてはそれが当たり前でなければならないと思っており、自己評価とのギャップに落ち着かない気持ちでいました。職種が変わることで、チーム全体としての成果そのもので評価されるようになることを自分は期待しましたし、そういう責任まで自分が明に背負っていた方が、プロジェクトの完遂とプロダクトの成長のためにも良いのではないかと提案しました。

さて、サブディレクター初仕事というわけでもないのですが、MackerelのAPM機能に関する展望やトレース機能のパブリックベータ化について、本日リリースエントリを出しております。

mackerel.io

以下の画像のデータベースパフォーマンス機能(すでにリリース済み)のように、インフラだけでなくアプリケーションの中身がわかるような機能を今後もどんどんMackerelに追加していきます。どうぞご期待ください。

Recap 2024

prev:

blog.arthur1.dev

技術

OpenTelemetryとかなり仲良くなった1年だった。

新しく触った技術はOpenFeature、PipeCDぐらいで、あんまり開拓できていない。

以下のOSSにcontributeできた:

  • open-telemetry/opentelemetry-collector PR
  • open-feature/go-sdk PR

仕事

グレードがまた1つ上がった。数字だけで見るともう折り返し地点なのだが、先は長い。

チームのテックリードになった、とほぼ同時にプロダクトオーナーにもなった。最近は安定感、あるいは、この人となら安心して仕事ができると思ってもらえるように仕事しようと心がけている。

技術イベント

登壇10件は頑張った方ではないか。ブログの執筆と合わせて、明らかにプレゼンスが上がったように感じる。イベントに出向いたときに「~~のブログ読みました!」と声を掛けられる機会も多くなった。

  • 【オンライン登壇】Hatena Engineer Seminar #28「技術習得を支え続けた私の個人開発ヒストリー」 資料
  • 【銅鑼パーソン】YAPC::Hiroshima 2024
  • 【オフライン登壇】Ya8 2024 - ヤパチー 令和六年最新版(仮) アンカンファレンス「ゲーマーじゃんけん」
  • 【オフライン登壇】Scalaわいわい勉強会 #2「見せ算をScalaで実装してみた」 資料
  • 【オフライン登壇】Pepabo Tech Conference #22 春のSREまつり「otelcol receiver 自作RTA」 資料
  • 【オフライン登壇】kamakura.go #6「slog登場に伴うloggerの取り回し手法の見直し」 資料
  • 【オフライン登壇】Mackerel Drink Up 出張版@福岡「Mackerel開発チームの障害対応演習──新卒エンジニアが障害対応指揮官を務めるに至るまでのステップ」資料
  • 【当日スタッフ】SRE NEXT 2024
  • 【オフライン登壇】Go Connect #3「go.mod、DockerfileやCI設定に分散しがちなGoのバージョンをまとめて管理する」 資料
  • 【オフライン登壇】Waroom Meetup #2「障害対応指揮の意思決定と情報共有における価値観」 資料
  • 【オフライン登壇】CloudNative Days Winter 2024 船上LT会「AWS AppConfigとOpenFeatureで手早く機能フラグを導入する[LT size]」資料
  • 【展示出展】CloudNative Days Winter 2024「OSS展示」
  • 【スタッフ&サプライズ担当】 紅白ぺぱ合戦
  • 【オフライン登壇】Scalaわいわい勉強会 #4「Scalaから始めるOpenFeature入門」資料

見てわかる通りCfP形式のイベントには一本もProposal通せてない。これはまあ普通にけっこう落ち込んでるものの、これだけが人生ではないので、評価されるところで生きていく所存。そもそもエンジニアとして手を動かす機会もぐっと減っているので、来年はあんまり登壇しない気がする。

技術イベントとは違うけど、取材されて記事が出たのも(ITエンジニアとしては)初体験だった。

codezine.jp

旅行

地元以外だと大阪、京都、広島、福岡、新潟あたりに。観光を主目的とした旅行として行ったのは大阪(ユニバ)と新潟(湯沢)だけで、ほとんど会社の出張。

Google MapのタイムラインがPCで閲覧できなくなったのが相当不便。

ファッション

ユニバで買ったマリオカートのパーカー以外まともに服買ってない。

全身黒の葬式コーデになりがちなので、だれかコーディネートしてほしい。

買い物

一番でかい買い物はRolandのV-8HD。

proav.roland.com

感想としては、これ買うならあと+12万出してVR-6HDを買えという指摘はごもっともかもしれない。単純に音声が扱える以上に機能の差がけっこうあるので。

住居

変化なし。今より良い物件になかなか出会えない。

テーブルゲーム

Slay the Spire: The Board Gameを買った。高いからボードゲームカフェで遊べば良いやと思っていたら、人気でなかなか遊べなかったので。

ポケモンカードの大会でコンスタントに入賞できるようになってきた。CL大阪ベスト8がやはり一番でかい。

blog.arthur1.dev

音楽制作

サポートで入ってるバンドの練習をしただけ。あとは高校生にドラムのこのフレーズ叩けないよ~って言われたのを少しだけ教えた気がする。

恋愛

このセクションいらなくね?相変わらず28歳独身男性。

音楽鑑賞

最近ブログを書いたのでそちらに譲る:

blog.arthur1.dev

音楽とは若干違うけど、ダンスグループであるアバンギャルディのライブをほぼ最前列で見れたのはとても良かった。

以下思い出アルバムコーナー

YAPC::Hiroshimaの銅鑼パーソン

小田原の梅丸と

母校の名前は消えてしまったけど、名前は工大祭

横浜ベイブリッジと私

CL大阪ベスト8に導いてくれたルギア