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. の急降下を入れるタイミングである. 速すぎる場合は崖から降りることができず,遅すぎる場合は崖を掴めずに落下してしまう.

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

崖を降りる瞬間を捉える

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

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

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

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

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

いろいろあっていろいろ考えたんだけど結局どうしようもないねってなっちゃった

先日、友人とプロスポーツの試合を見に行った。 友人は幼い頃からこのスポーツ、ひいては観戦するゲームに出場するチームのファンであり、僕は年に1〜2度観戦に誘ってもらっている。 その日は友人の希望もあり試合開始の2時間弱ほど前から会場入りしていたのだが、僕は特にそのスポーツに思い入れがあるわけでもないため、若干時間を余らせた気持ちでいた(よくない)。

そうした事情もあり友人とはどうでもよい雑談を延々としていたのだが、その中で大乱闘スマッシュブラザーズSpecial(以下スマブラ)の話題が上がった。 僕も友人も一定以上にスマブラをプレイしているため、話は細かいテクニックなどの話にも及んだ。 ただ、友人はスマブラのテクニックなどの知識が薄いために用語やプレイヤー名などを知らないことも多く、時折話が噛み合わない。

このときも僕が会話の中でとあるテクニックについて言及した。 友人はそれを知らないと言った。 僕は話を広げる程度のつもりで、「○○さんがこの前解説の動画上げてたよ」といった趣旨の返答をした。 友人は(おそらく冗談ではあろうが)強い口調でだいたい次のようなことを言った。

曰く、

そんなオタクしか知らないようなことは俺は知らない。

そもそもそんな人間のこと俺は知らないし、eスポーツなどという下らないものにも興味がない。

だいたいeスポーツなどというしょうもないものに何の価値があるのか。

僕はまるで記憶力がないために、細かい内容やニュアンスに食い違いはあると思う。 ただ、友人はだいたい上のような趣旨の発言でeスポーツやそれを好む人間のことを侮辱する内容の発言をしたことは間違いないと思う。 少なくとも僕はそう解釈して、少なからず不愉快感を抱いた。

その場ではそのまま不愉快感を露わにして友人の発言を止めたのだが、日頃から僕の理屈っぽさにうんざりしている友人はこのときも「またかよ」といったうんざりした表情を浮かべていた(僕が何かを主張するときはだいたい無駄に理屈っぽく話す)ので、それ以上は何も言わなかった。 しかしこの件は思った以上に僕にとって不愉快だったようで、数日経った今でも時折思い出しては不愉快な気持ちになるので、考えを整理して文章に残すことでこのループを終わりにしたいと思う。


まず、不愉快感の主な原因はスマブラやeスポーツというものを侮辱していたこと自体にはないと考えている。 不愉快感を形作る一要素として全くないとは言えないけど、少なくとも主な原因ではない。はず。

前提として、ゲームを楽しむ過程で様々な情報に触れて強くなろうとするのも、自分の外にある情報を気にせず独自に強くなろうとするのも、個々人の自由に任されたプレイスタイルの違いに過ぎない。 また、いくら自分がプレイしているタイトルであろうと所詮ゲームに過ぎないので、そのタイトルにおいて強いとされるプレイヤーについての知識があろうとなかろうと、どうでもよい。 昨今eスポーツだなんだと騒がれているもののゲームとは所詮ゲームであり、それに向き合う姿勢などというものは個々人に強く依存する。 以上により、それに対して友人がどのような態度を取りどのような発言をしようと、それ自体がモラルに反することではないし、発言自体の攻撃性が持つ以上の不愉快さもないと考えられる。

ではどうしてわざわざこのような形に残すまで不愉快だと感じたのか。

それは「友人が」「あのときあの場所で」eスポーツなどを侮辱したことにあると思う。 最初に説明した通り、これは友人に誘われたスポーツの試合観戦に赴いた球場でのできごとである。 友人はあのとき球場においてスポーツのファンであり、チームのファンであったはずだ。 普段は別のアイデンティティを持つ友人も、そのときその場所においては「スポーツファン」であるし「特定のチームのファン」である、と捉えることはかなり自然なことだと思う。 抽象度を上げれば、友人は「何か」が好きな人間であり、「その何かを高いレベルで遂行する人間のファン」であった。

その、「何か」が好きで、「その何かを高いレベルで遂行する人間」が好きな人間が、他の「何か」が好きで「その何かを高いレベルで遂行する人間」のことを侮辱したのである。 この矛盾、論理的破綻が僕に強い嫌悪感を抱かせたのだと考えられる。 だって、おかしいじゃん。こんなの絶対おかしいよ。間違ってる。あんなに何かを好きな人がこんな間違いしちゃいけない。

更に、「eスポーツなどという下らないもの」といった趣旨の主張には「(友人の好きな)スポーツはeスポーツなどという下らないものより優れている」といった思想が見える。 ここで問題なのはそのような発言をしたことにあり、実際に友人が考えているかにはない(というか、友人はそこまで考えていないと思う。彼はそもそも冗談で上のようなことを言ったわけだし、そもそも彼はものを深く考える性格ではない)。

この発言の問題点はむしろ、自覚的にせよ無自覚的にせよ友人がスポーツとeスポーツを比較の俎上に載せてしまったことにある。 このことによって、「球技など所詮ただのボール遊びで、いい大人にもなっていつまでもボール遊びをしているような人間はとんだ間抜けのバカ野郎でどうしようもない社会不適合者だし、もっといえばそれを見て喜んでいるような人間は底がどうしようもなく浅いしそのような社会不適合者を見て嘲笑っているどうしようもない差別主義者」といった無茶苦茶な主張がカウンターで返ってきてしまう可能性を作ってしまったのだ。 そのようなカウンターを想定せず軽率に放言してしまう、思慮の浅さ。 これも僕を不愉快にさせた一因だろう。

それ、君が言っちゃダメでしょ、ってことだ。

思い当たる節はまだある。 すっかり言い忘れていたが、僕も友人も中学生の時分からずっとアニメのオタクなのである。 僕と友人は大学も卒業して随分経つというのに未だにアニメだのゲームだのといった幼稚で下らないものに熱を上げている、どうしようもない社会不適合者だ。 アニメが市民権を得たと言われて久しいが、それでも僕や友人には「アニメだのゲームだのにいい年した大人が熱中しているのは全くもって適当ではない」といった意識が残っているし、他の人々もそう考えていると思っている。 それでも。それでも、僕達はそうした「下らない」アニメやゲームを未だに手放さず大事に両手に抱え続けている。 よく言われることではあるが、アニメやらゲームやらといったものは、下らない「から」、しょうもない「から」、面白いのであり、惹かれてしまうのである。

僕達はこうした下らなさ、しょうもなさの中にある価値を認めて、信じ続けてきたはずだ。 これは僕が友人に抱いた身勝手でおよそ現実とはかけ離れた願望なのかもしれないけど、友人もこうしたことを分かっていると思っていた。 だからこそ、「下らない」と何かを侮辱したことがたまらなく不愉快だったんだと思う。 許せないと思った、と言ってもいいかもしれない。

だって、僕達みたいなどうしようもない人間が「どうしようもない」って言っちゃあ、おしまいじゃないか。そんなの悲しすぎる。それは流石に嫌だ。


まとめると、友人は「何か」を、しかも下らない「何か」を含めて、しかもかなりの度合いで、好きだったはずなのに、他の「何か」を下らないと侮辱してしまったことを僕は耐えられなかったんだと思う。

ただ、途中にも書いたけど友人はものごとを深く考える性格をしていないし、僕はやたらと理屈っぽくて無駄にものごとを考えてしまう。 こうしたミスマッチを僕はすっかり忘れてしまっていて、僕は勝手に友人に期待して、勝手に失望してしまった。

言ってしまえば、それだけの話だった。

僕はたぶん、できるなら考えたことを共有したいし、一緒にものごとを考えていきたいんだけど、そんなことまるでしたくないよって人にこんな面倒くさいことを強制はできない。 考えたこと、感じたことを伝えることができないのは悲しいことだし苦しいことだけど、求められてもないのに伝えるのはただの押しつけだから、なんとかして自分の中で処理するしかない。 こうしたディスコミュニケーションはとても悲しいことだと僕は思うけど、どうしようもないのでどうしようもないね。

ITerm2の設定をGitHubで共有……できんやんけ!って思ってたけどそうでもなかった

macOS用のシェルアプリの1つとして有名なiTerm2ではシェルのカラースキームや透過率などの設定ができて,この設定を追い込むことでCLI作業のモチベーションが30%くらい上がってくる. 今回MacBook Proクリーンインストールすることにしたので,この設定の共有を複数の端末間でやってみることにした.

やりかたは簡単で,書き込み元のマシンでiTerm2の環境設定を開いて「general」→「Load preferences from a custom folder or URL」で好きなディレクトリを指定するだけ. 例えばdotfilesをgit管理している場合, dotfiles/iterm2 みたいなディレクトリを掘ってそこを指定すればいいし,Google Driveでローカルのディレクトリとクラウドストレージを同期している場合は GoogleDrive/iterm2 みたいなディレクトリを掘ってそこを指定すればいい. 指定後,同じ画面の「Save Current Settings to Folder」をクリックすれば現在の設定が保存される. 設定ファイルは「com.google.iterm2.plist」って名前のファイル(中身はXML)なので,これをそのままgit管理するなりクラウドストレージに上げるなりすればいい.

読み込む先では↑と同じ設定項目で同じ様にディレクトリを指定すればいい. これだけで設定は完了.

ただしここから先に罠がある

ここで読み込んだ設定はいくらiTerm2を再起動しても読み込まれず, OS自体を再起動しないと読み込まれないGUIアプリの設定ファイルを読み込む理由は知らないので原因などは分からないんだけど,なんかそうなってるっぽい.


追記.

macOSの設定ではplistファイルを変更した場合, cfprefsd を叩くと良いらしい.

qiita.com

でも今回は(僕だけかもだけど)効かなかった.

後輩のkn1cht氏に指摘をいただいて思い出せたので書き足しておく. kn1cht氏に感謝したい.


以上.

YAMAHA AG-06を買った

Steinberg CI 2+のヘッドホン端子が壊れて音が聴けなくなってしまったので,新しいオーディオインターフェースが必要になった. 10分くらい調べた結果,なんとなく評判が良さそうだったので表題通りYAMAHA AG-06を買うことにした. 小型版のAG-03でも良かったんだけど,大は小を兼ねる的な頭の悪い発想と到着日がこっちの方が早いという経済性ゼロの理由によりAG-06を選んだ.

レビューできるほどヘビーに使えてないし使う予定もないからレビューはしないけど,使用時に引っかかった点がいくつかあるので残しておく.

1つめ.AG-06は電源ボタンがあり,電源を入れないと機能を発揮しない. それはそうといった感じなんだけど,CI 2+は電源ボタンがなかった(USBケーブルを挿せばすぐに電源が入った)ので個人的に混乱してしまった.

2つめ.PCからの入力もAG-06側で音量調整ができるため,ツマミを回さないと音が出ない. これもそれはそう案件なんだけど,CI 2+はPCの音とラインその他からの入力の音のバランスを取る機能くらいしかなかったので,これも個人的に混乱してしまった. 確かにあると便利で,楽器の練習時やゲームをするときの通話,僕はやらないけど動画の配信時にも良い機能だと思う. というかオーディオインターフェース兼ミキサーみたいな製品だし,音量調節は当然できるんだよなと後から気付いた.

こんな感じで,入門 / 中級者クラス用のオーディオインターフェースとして,軽く使うには文句の付け所がほとんどない良い製品なんじゃないかと思う. 知らんけど.

あとひとつわがままを言うとすると,初音ミクモデルも再生産してほしいなぁ.ボカロは通ってないけど.