HonKit のデフォルトテーマの箇条書きのスタイルを微調整した

HonKit とは Markdown からドキュメントページや書籍を作成するツールです。 GitBook という Deprecated になった OSS をフォークして作られたものみたいです。

honkit.netlify.app

Markdown を書くだけでドキュメントページを作れるので便利なんですが、箇条書きのスタイルが個人的に気になっていました。

上の図だと listing 1-1 の上下にスペースがあってやたら孤立していることや、 listing 2 と listing 2-2 より listing 2-2 と listing 3 の方が近接していて listing 2-2 が listing 3 と関連しているように見えることが気になるポイントでした。

幸いなことに HonKit は色々とカスタマイズできるので、箇条書きのスタイルをちょっといじってみました。

zenn.dev

やり方としてはだいたい上に貼ったリンクの通りなんですが、まず book.jsonstyles/website.css を用意します。 用意したら book.jsonstyles/website.css を読み込ませるような設定を書いて、 styles/website.css で書きたい CSS を書くだけです。

book.json

{
    "styles": {
        "website": "styles/website.css"
    }
}

styles/website.css

.markdown-section > ul > li {
    margin-bottom: 0.85em;
}

.markdown-section ul > li > p {
    margin-bottom: 0;
}

結果は以下の通り。

やったね。

ちなみに

この問題、この記事を書いた時点での最新バージョンである v3.6.19 では直っていて、僕が使っていたのは v3.4.1 でした。 説明にイマイチやる気がないのはこのせいです。

Agones Controller がダウンした状態で GameServer を落としたらどうなるか確認する

世の中には Kubernetes 上でゲームの状態を管理するステートフルなサーバ(以下 GameServer)をいい感じに管理する Agones という OSS が存在します。 GameServer を管理するために Agones は Controller というコンポーネントを必要とするのですが、今回はこの Controller がダウンした状態で GameServer を削除してみたらどうなるかというのを検証してみました。

Agones とは何か、雑に説明する

Agones とは UbisoftGoogle が共同で開発している、 Kubernetes 上で GameServer を管理するためのライブラリです。 オンラインでのマルチプレイを実現する方式として、ユーザの機器同士を直接 P2P で繋げる方式とサーバ(GameServer)を経由する方式が考えられます。

Agones はこのうち後者の方式で使用される GameServer のためのライブラリです。 このような GameServer は生存期間が比較的短い(ゲームの1プレイと対応することが多いため、数分〜数時間)ためにコンテナや Kubernetes との相性がいいと考えられます。 そのため、 GameServer の管理に Kubernetes を使いたいという欲求が発生しますが、そのまま Kubernetes を用いると問題があります。 たとえば、 Kubernetes は GameServer がマルチプレイを実行中か判別することができないので、マルチプレイ中の GameServer(が動く Pod)を唐突に落とす可能性があります。 この場合、プレイ中のゲームセッションが唐突に終了してしまうので大変困ったことになっていまいます。 Agones はマルチプレイ中の GameServer が落とされるのを防いでくれるなどの機能を持っています。

Agones 自体については↓の記事などが詳しく解説してくれているので、気になったら読んで頂くといいと思います。

medium.com

本題: Agones の Controller が落ちたときってどうなるの?

GameServer などを管理するため、 Agones は Controller というコンポーネントKubernetes 上に立てます。 Controller のおかげで GameServer が管理されているのですが、実際に Agones を使用するとなると Controller が落ちたときに GameServer はどんな挙動をするのだろうというのが気になってきます。 気になってきたので Controller を落とした状態で GameServer を操作しようとしたらどうなるかというのを検証していました。 その過程で GameServer を削除しようとしてみたときに面白い挙動が見えたので、この記事ではそれを解説しようと思います。

さっそくですが、検証方法と結果は GitHub に上げてあります。 やり方とかはこっちに書いてあるので、具体的な操作やソースコードが気になる人は見てください。 なんなら結果も書いてあります。

github.com

検証内容

どのような検証をしたかというと、

  • 検証環境は minikube で作成
  • 削除する方法は以下の2通りが考えられたので2つを検証
    • kubectl delete gs などの Delete API を呼ぶことで直接削除する
    • kubectl edit gs などで GameServer の STATE を Shutdown にすることで Controller に削除してもらう
  • GameServer の操作は kubectl と Go によるプログラムの2通りを試す
    • 削除する方法2通り × 操作方法2通り = 4通りの操作を検証

といった感じです。

検証結果

検証結果はこんな感じになりました。

シェル経由で直接削除した場合

Controller が動いているときは当然 GameServer は削除されるんですが、削除される GameServer の STATE は直前まで Ready のままでした。 消される GameServer に割り当てが発生したりしないか不安です。

Controller がダウンしているときは kubectl のプロンプトが返ってきません。 しょうがないので Controller を立ち上げ直すと削除されてプロンプトが返ってきました。

プログラム経由で直接削除した場合

Controller が動いているときは当然 GameServer は削除されて、シェル経由の場合と同様 STATE は Ready のままでした。

Controller がダウンしているときはシェル経由の場合と異なりプログラムがブロックされることはなく、何も起きずにプログラムが終了しました。 その後 Controller を立ち上げ直すとそのうち削除されました。

シェル経由で STATE を Shutdown にした場合

Controller が動いているときは GameServer が削除されます。 削除される前に STATE が Shutdown になるので(STATE を書き換えているのでそれはそう)、割り当てが発生しなさそうな雰囲気があります。

Controller がダウンしているときは STATE が Shutdown になるだけで、 GameServer が削除されたり下の Pod が落ちたりはしません。 Controller を立ち上げ直すとそのうち削除されます。

プログラム経由で STATE を Shutdown にした場合

シェル経由と同じ挙動でした。

感想・考察

どうにせよ Controller がダウンしてたら GameServer が落ちないのは変わらないんですが、削除する方法によって STATE が更新される・されないといった違いが生まれました。 STATE が更新された方が事故が起きにくそうで良さそうな気がします。 本当に事故が起きるか起きないかは検証したほうが良さそうな気がします。 そのうちやるかも。

また、シェル経由で削除するかプログラム経由で削除するかでも微妙な違いが生まれたり生まれなかったりしました。 ここらへんは作りの違いって感じがするのでふ〜んって感じですね。

まとめ

Agones の Controller を落としたときに GameServer を削除しようとしたらどうなるかを検証しました。 直接削除するか STATE を書き換えるかの2択があるんですが、後者のほうが治安が良さそうな気がします。 本当に治安がいいかは要検証ですが。

エアコンのフィルターを掃除した(えらい)

3月に引っ越して以来やり方を調べるのを含めて面倒で半年以上放置していたんだけど、流石に良くない気がしたので掃除した。 いかにも年末にやりそうなことだけど、年が明けるまで気が向かなかったので、実際に手を動かしたのも年が明けてからになった。 年末の大掃除という習慣は、この手の普段面倒だったりやり方が分からなかったりで放置しがちな場所に目を向けるという意味で、いい習慣なんだと思う。 年末にはやらなかったけど。

やり方はテキトーにググった。 SEO 対策のしっかりしていそうなサイトがたくさん引っかかってげんなりしてしまったけど、少なくとも家事においては正しく情報弱者なのでしょうがない。

結局やったこととしては、

  • フィルターを外してフィルターの裏側からシャワーをかけてホコリを落とす
  • フィルターの周りのホコリを乾いた布で拭き取る

くらい。 思ったより簡単だった。 写真とかがあるとブログっぽくなるんだろうけど、面倒なので写真は撮ってない。

Go 標準の flag パッケージでも Usage をカスタマイズできる

はじめに

Go で CLI ツールを作るときに Go 標準の flag パッケージ を使うとコマンドライン引数でのフラグ(オプション引数)をいい感じにパースして変数に格納できるので大変便利である。

また、 flag パッケージを使うとデフォルトで -h オプションで Usage(使い方)を表示してくれるようになり、これまた大変便利である。

$ ./my-awesome-command -h
Usage of ./my-awesome-command:
  -option1 string
        help message for option1
  -option2 float
        help message for option2

しかし、作成するツールがフラグとは別に通常の(典型的には必須の)引数を要求する場合、 Usage の文字列をカスタマイズしたほうが親切である。 たとえば、以下のようなメッセージを表示したくなる。

Usage: ./my-awesome-command [options...] arg1 arg2
  -option1 string
        help message for option1
  -option2 float
        help message for option2

このような要求を満たす場合、より柔軟な設定ができるサードパーティのパッケージを導入する必要があると思っていたのだが、タイトルの通り標準の flag パッケージでも Usage をカスタマイズできることが分かった。

本題

やり方は、func() 型の flag.Usage 変数に func() を再代入するだけ。 上記の例の Usage を表示したい場合は、以下のようにすればいい。

flag.Usage = func() {
    fmt.Fprintf(os.Stderr, "Usage: %s [options...] arg1 arg2\n", os.Args[0])
    flag.PrintDefaults()
}

flag.PrintDefaults() で各オプションと説明の文章の表示ができる。

また、flag.Usage() を呼ぶことで Usage を出力できるので、エラー終了時などに呼んでおけば手間の割にコマンドのユーザに親切だろう。

元ネタ

stackoverflow.com

Markdown + VSCode で数式込みの PDF をなるべく楽に作る

TL;DR

  • Markdown は Word とか LaTeX とかよりも楽にカジュアルな文書を作れるよ
  • VSCode を使うと Markdown から HTML を生成できるよ
  • HTML をブラウザで開いて印刷メニューから PDF を作れるよ
  • ただし数式を扱うにはちょっと工夫(拡張機能の追加)が必要だよ

はじめに

数式の混じった PDF を作ろうというとき,Microsoft Word や LaTeX などいくつかのツールが使える.

Wordは文字の大きさや色,フォントなんかを直感的に変えられるし,保存メニューから PDF にすることも比較的簡単にできるので,PDF や印刷する資料を作るときには一般的によく使われるソフトだ.
ただし,Word の数式入力はかなり重くて使いづらいから,数式を含んだドキュメントを作るときにはあんまり使いたくない(少なくとも僕は).

LaTeX は数式を含む論文なんかをいい感じに作成できるツールである. Word のように直接ドキュメントを編集するのではなく,文章とそれに付随する章や節などの構造を独自の言語(TeX 言語)で記述し,記述したファイル(TeXファイル)を専用のソフトに食わせることによって PDF が生成される.
TeX 言語は章や節といった文書構造だけでなく,数式や表なども扱うことができるため,数式混じりの PDF を作成するにはかなり使い勝手が良い.
しかし, TeX 言語は書くのがかなり面倒だったり,TeX ファイルを PDF に変換してくれるソフトが高機能すぎるが故に期待通りに動かない場合などが多く,カジュアルに文章を書いて PDF で誰かに渡す程度の用途だとオーバースペックで便利さより面倒さが勝ってしまう.

そこで今回は MarkdownVSCode を用いて,LaTeX より楽に数式混じりの PDF を作る方法を紹介したいと思う.

MarkdownVSCode

まず,MarkdownVSCode について説明しようと思う.

Markdown

Markdown とは,TeX 言語のように文章とその構造を記述するための言語である.1
TeX 言語に比べて機能は大きく落ちるが,その分簡素な記法で書くことができるので,書くのがめちゃくちゃ楽だったり TeX や HTML など様々なフォーマットに変換できるという特徴がある. 拡張子は .md が主に用いられている.

Markdown の記法は以下の記事などに解説されている.

qiita.com

TeX と同様に Markdown を読み込んできれいに整形された文書を出力するサービスがオンライン・オフライン問わずいくつか存在するため,合わせて利用すると良い.2
ただし,使用するサービスによって使える機能や使えない機能,微妙に動作が異なる機能があったりするため,Markdown を使うときにはそこら辺を諦めるおおらかさを持つことがコツである.

VSCode

VSCodeVisual Studio Code)とは,Microsoft が開発する高機能なフリーエディタである. エディタとは,めちゃくちゃ雑に言うとメモ帳がめちゃくちゃすごくなったやつのこと.
以下から入手できる.

azure.microsoft.com

VSCode は数多くの機能を有し,その一つに Markdown への対応がある. VSCode を使うと,Markdown を書きながらリアルタイムに整形されたドキュメントを見ることができたりするので, LaTeX のように「コンパイルしてみたらエラーめっちゃ吐くじゃねえか!」といったことが起きづらい.
また,VSCode は有志により拡張機能が開発されており,拡張機能を導入することによって Markdown に数式を記述する機能や HTML ファイルを出力する機能を追加することができる.

以降では,拡張機能を導入することで数式混じりの Markdown を HTML ファイルに出力し, PDF を得る方法を解説する.

Markdown + VSCode で数式混じりの PDF を作る

VSCode拡張機能を導入する

VSCode で数式混じりの PDF を作るためには以下の機能が必要となる.

  • 数式を記述する
  • HTML ファイルを出力する

これらは全て Markdown All in One という拡張機能で入れることができる.

marketplace.visualstudio.com

リンク先の「Install」をクリックすることで VSCode拡張機能を追加することができる.

数式混じりの Markdown を記述する

この拡張機能が追加された状態で Markdown に数式を記述するには以下のように書けば良い.

文章中に数式を記述するには $ y = x^2 と $ 一つで囲めば良い.

独立した行に数式を記述するには $ 二つで囲めば良い.

$$
y = x^2 + 2x + 1
  = (x+1)^2
$$

数式混じりの Markdown から PDF を作る

PDF を作るには以下の2ステップを踏む.

  1. Markdown から HTML ファイルを生成する
  2. 生成された HTML ファイルを Google Chrome などのブラウザで開き,印刷メニューから PDF を生成する

1. Markdown から HTML ファイルを生成する

まず VSCodeMarkdown ファイルを開く.
この状態で Ctrl + Shift + PMac だと Cmd + Shift + P)を押すと,(恐らく)画面上部にコマンドパレットが表示される.
コマンドパレットに Markdown All in One などと入力し, Markdown All in One: Print current document to HTML を選択する.3
そうすると, Markdown ファイルと同じフォルダに HTML ファイルが生成される.

2. PDF を生成する

まず上の手順で生成した HTML ファイルをダブルクリックする.
恐らく普段使っているブラウザ(ウェブサイトなどを見るソフト)で開かれると思うので, Ctrl+PMac だと Cmd + P)などで印刷メニューを開く.
メニューのどこかに印刷するプリンタを選ぶところがあると思うので,「PDF を保存する」といったような選択肢を選ぶ.(ここらへんは使用するブラウザなどにかなり左右されるので,あいまいな説明になってしまう)
「保存する」「印刷する」あたりのメニューを選ぶ,もしくはエンターキーを押すなどして PDF ファイルを保存する.

以上の手順で数式混じりの PDF ファイルを保存することができた.

おわりに

TeX を書くよりマシってだけで,そんなに簡単じゃないかもしれない.


  1. ちなみに,TeX 言語や Markdown のような文書構造を記述するための言語をマークアップ言語という.TeX 言語や Markdown の他には HTML などが有名.

  2. 例えばはてなブログMarkdown によって記事を執筆できる.

  3. Markdown All in One: Print current document to HTML を検索できればいいので, HTML などを入力してもよい.

Mendeley Web Importer でダウンロードしたファイルの名前をいい感じにする

Mendeley Web Importer を使うと Web 上に転がっている論文を引用情報つきでお手軽にダウンロードできる. このときファイル名はもとのファイル名と同じなので, Mendeley を経由して PDF を取得し直すと "full_text.pdf" がローカルストレージに量産される. ファイル名から内容を推測できないだけでなく "full_text.pdf(n)" (n は整数)が量産される事態にもなってしまいかなり嫌なのでファイル名をいい感じにしたい.

ファイルのリネームは Mendeley Desktop がサポートしているため, Mendeley Desktop を利用してファイルをリネームすればよい.

www.slideshare.net

"Organize my files" ,"Rename document files","Watch Folder" あたりを設定しておけばローカルに今まで溜め込んだ PDF がダウンロードされてリネームも完了する. リネームできてなかったら "File" -> "Rename document files" で.

しかしこの作業でリネームされるのはローカルのコピーだけで,Mendeley のクラウドにアップロードしたファイルはリネームされない. これでは他のデバイスで "full_text.pdf" 地獄がまた展開されてしまうので,クラウドのファイルもリネームしておきたい.

この作業は割と力技でできる. まず Mendeley 上から PDF を登録している全ての論文情報を削除する. (不安なら ローカルに保存された PDF のコピーを別のディレクトリにバックアップしておこう.ただ,論文情報を削除して同期をかけてもこのコピーは削除されなかった.) 次に Mendeley Desktop に先程作成された PDF のコピーを D&D する. どうやら PDF に Mendeley へ追加した時刻などの情報も埋め込まれているようで,そこらへんも含めて(おそらく)復元される. 復元されたことを確認したあと Mendeley Desktop とクラウドを同期すればよい.

Mendeley に登録された情報が PDF から復元できる上にファイル名もあらかじめ Mendeley Desktop でリネームされたものを追加しているので,Mendeley の情報を損なわずにクラウド上のファイルをリネームすることが実質的に達成できている. 多分これでうまくいくと思います.

最速崖奪いの感覚を掴む

はじめに

大乱闘スマッシュブラザーズスペシャル(以下SSBU)では,相手が崖を掴んでいるときに自分が掛けを掴みに行くと相手が崖から手を離して自分が崖を掴めるという仕様が存在する.

崖を奪われた相手が一定時間無防備になることを利用して,空中後攻撃(以下空後)や一部の設置技などを当てることができる(対策としては先行入力による崖上がりや崖を奪われた際の横方向へのずらしなどが挙げられる).

空後は強力な技が多いので,崖を意図的に奪うことができれば崖攻めにおける撃墜択を増やすことができる.

実際に崖を意図的に奪うテクニックがいくつか知られており,最速崖奪いはその一つである. 本記事では最速崖奪いの練習方法を説明する.

最速崖奪いの基本

入力自体は非常にシンプルである. 概念的にはダッシュで降りてすぐに崖を掴む行動といえる.

  1. ダッシュで崖から降りる(崖方向への弾き入力)
  2. 急降下する(下方向への入力)
  3. 崖を掴む(崖方向への入力)

最速崖奪いにおける課題は2. の急降下を入れるタイミングである. 速すぎる場合は崖から降りることができず,遅すぎる場合は崖を掴めずに落下してしまう.

つまり, 最速崖奪いのポイントは崖を降りる瞬間を捉えること であり, 崖奪いの間隔を掴むこと=崖を降りる瞬間を捉えること と言える.

崖を降りる瞬間を捉える

前述の通り,最速崖奪いにおけるポイントは崖を降りる瞬間を捉えることである. そこで,まずは崖を降りる瞬間を捉えることのみに着目して練習するとよい.

具体的には,以下のようなことができるようになることを目標とすればよい.

  • 崖を降りる直前で左スティックの入力をやめる
    • 成功すれば地上に残り,失敗すれば崖から降りる
  • 崖を降りる瞬間に左スティックの入力をやめる
    • 成功すれば崖から降り,失敗すれば地上に残る

この両者のフレーム差を一定以下にできれば,崖を降り急降下を入れるタイミングを把握できる.

崖降りのタイミングを把握した後に崖奪い入力の練習をすることで,効果的に最速崖奪いを習得できると考えられる.