ytooyamaのブログ

サーバ構築とか、仕事で発見したこととか、趣味のこととかを書いています。

macOSとPandoc、MacTeXでMarkDownをPDFに変換する

最近、ドキュメントやメモはMarkDownで書くことが多くなっています。 実はこのブログもMarkDown形式で書いていたりします。

そしてMarkDownで書いたドキュメントを配布する際にPDF出力しているのですが、現在利用しているエクスポートツールが

  • とにかく重い
  • 色々対応するには独自タグを入れなければならず、ソースが汚くなる
  • 100ページを超えるとよくフリーズする
  • 100ページを超えるとレイアウトが崩れる、書式の変換に失敗する
  • バグがとにかく多い

…という問題があり、移行先を会社のみんなで検討していました(特に4つ目が厄介で、出力後に目視して確認していました)。 とりあえず私は定番のPandocとMacTeXをmacOSにインストールして使ってみることにしました。

エクスポートするツールの選定

エクスポートするツールを選択するにあたり、いくつか必要な機能がありました。目次機能、改ページ機能、見出しのレベルから章番号(1. とか 1-1..みたいなもの)を自動で割り振ってくれる機能、コマンド実行例を示すための書式…などです。これまで使っていたツールはこの目次機能にバグがありました。

これらの中でも特に重要視していたのが「必要な箇所で改ページする機能」です。PandocとMacTeXの組み合わせだと、「\clearpage」というタグを入れるだけで改ページしてくれました。コマンド部分はPandocのオプションで「–highlight-style=」で指定すると良いようです。私はzenburnがお気に入りです。PDFに目次を含める場合はPandocのオプションで「–toc」を含めるといい感じにやってくれるようです。詳細はこちらをご覧ください。

qiita.com

Pandocがあれば色々な形式にエクスポートすることができますが、PDF出力するには例えばMacTeXなどが必要だそうです。以下、macOS SierraにPandocとMacTeXをインストールした時の試行錯誤したログです。

インストールする

次のように実行します。HomebrewとXCodeが事前に必要です。

tooyamac% brew install lua pandoc pandoc-crossref

インストール後、PDF出力に必要らしいMacTeXをダウンロードしてインストールします。

実はbrew cask install mactexでもインストールできるらしいのですが、すごい時間がかかるので公式サイトからダウンロードします。pkg形式のファイルなのでダウンロードしたものをダブルクリックしてインストールするだけです。リンク先はこちらに日本のミラーサイトが掲載されているので、その中から選びます。

初めてのPDF出力

出力しよう。おや?

tooyamac% pandoc -t beamer ./hoge.md -o ./hoge.pdf
pandoc: pdflatex not found. pdflatex is needed for pdf output.

pdflatex がないようです。さっきインストールしたけど?

ググった!

見つかった!

どうやらバイナリーのパスが旧来から変わったようです。とはいえ、参考にしたページに書かれたパスも違っていたんですけど、探したらどうやらSierraではここに展開されるようです。とりあえずシンボリックリンクを貼ればなんとかなるようです。

tooyamac% ln -s /Library/TeX/Root/bin/x86_64-darwin/pdflatex /usr/local/bin/

そしてもう一度試したら今度は別のバイナリーがないと言われました。先ほどのと同様、 /Library/TeX/Root/bin/x86_64-darwin/にバイナリーがあったため、シンボリックリンクではなく、パスを通すことにしました。bashなら.bashrc、zshなら.zshrcに書けば良いようです。macOSの場合はpandocコマンドの実行に管理権限とかsudoを実行する必要はないため、ユーザーのrcファイルに書くだけで良いようです。私はzsh大好き人間なので次のファイルに記述しました。

tooyamac% vi ~/.zshrc
...
export PATH=/Library/TeX/Root/bin/x86_64-darwin:$PATH

tooyamac% source ~/.zshrc

3度目のPDF出力

出力しよう。おや?

また、エラーが出ました。 エラーログを取り忘れたので具体的なエラーを含めることができませんが、Markdownソースに日本語が入っているとエラーになるようです。

最後の行に「–latex-engine=xelatex」オプションを使ってくれと出ているので実行してみると、エラーは出ずにコマンドが通りました。ただし、英語部分だけ出力されるという悲しい状態でした。

tooyamac% pandoc input.md -o test.pdf -V documentclass=ltjarticle
...
Try running pandoc with --latex-engine=xelatex.

4度目のPDF出力

出力されたPDFに日本語が出てこない問題はここに書かれていました。「–latex-engine=lualatex」を指定すれば良いようです。

betrue12.hateblo.jp

最終的には

最終的には次のオプションを指定して出力することで、ほぼ希望通りのものを出力することができました。

tooyamac% pandoc -D latex > mytemplate.tex

tooyamac% pandoc -F pandoc-crossref document.md -o document.pdf -V documentclass=ltjsarticle --latex-engine=lualatex --template=mytemplate.tex --highlight-style zenburn --toc -N

環境を作るのはなかなか大変でしたが、クリックするとその部分にジャンプできる「役立つ目次」や割と簡単な記述で「改ページ」が入れられるようになった点、あの重いエクスポートツールを起動しないでも良い点は非常に良いかなと思います。

残す課題は?

表紙がシンプルすぎるのでどうしようか検討中です。表紙くらいなら別のソフトウェアを使って作ったものを差し込んでしまえばいいんじゃないか?…というのもアイデアとしてはアリだと思っています。

RHEL7/CentOS 7の解像度変更

解像度を変更するにはvga=771とかvga=773をカーネルパラメーターに記述みたいな記事が多いようです。CentOS 7の解像度の変更もそれで行うみたいなブログ記事を多く見つけました。ただ、実際にその通り設定してもKernelがグラフィックドライバーを読み込むまでは指定した解像度で表示されますが、グラフィックドライバーが読み込まれると高解像度に設定されてしまいます。

この問題を調べたらRHELのナレッジベースのページが見つかりました。

RHEL 6 および RHEL 7 で VGA コンソールのテキスト解像度を 80x25 に設定する方法 - Red Hat Customer Portal

RHEL/CentOS 6まではvga=771みたいな記述が動くようですが、どちらかというとvideoを使った方が良いようです。

# vi /etc/default/grub
...
GRUB_CMDLINE_LINUX="... video=640x480"

# grub2-mkconfig -o /boot/grub2/grub.cfg
# reboot

いや、なんでこんなことを急に言ったかというと、仮想マシンマネージャーで仮想マシンのコンソールを開くとログインプロンプトが開いているだけの画面でこんなに大きくていざ使おうとするとスクロールとか面倒だなと思いまして。

Ubuntu Xenial (16.04) でLinux kernel 4.10が利用可能に

Ubuntu Xenialでlinux-generic-hwe-16.04をインストールしている場合、Linux kernel 4.10が利用可能になったようです。 アップデートしようとしたら出てきました。 今日はそれだけです。

~$ sudo apt-get dist-upgrade
Reading package lists... Done
Building dependency tree
Reading state information... Done
Calculating upgrade... Done
The following NEW packages will be installed:
  linux-headers-4.10.0-27 linux-headers-4.10.0-27-generic
  linux-image-4.10.0-27-generic linux-image-extra-4.10.0-27-generic
The following packages will be upgraded:
  linux-generic-hwe-16.04 linux-headers-generic-hwe-16.04
  linux-image-generic-hwe-16.04
3 upgraded, 4 newly installed, 0 to remove and 0 not upgraded.
Need to get 61.2 MB of archives.
After this operation, 308 MB of additional disk space will be used.
Do you want to continue? [Y/n]

ちなみにLinux kernel 4.10の変更点一覧

kernelnewbies.org

そのほか

Debian 8.9への更新

検証用のVLAN環境で色々動かしているDebian Jessieのアップデートを行った。バージョンが8.9になった。そろそろDebian 9にしようか、どうしようか。

RHEL7.4 Betaのカーネルを触ってみた

CentOS 7.3でRHEL7.4 Betaのカーネルをビルドして動かしてみた。ネットワークパフォーマンスが上がった。噂通りEL 7.4は期待できそう。ちなみにCentOS 7.3でRHEL7.4 Betaのカーネルを動かした理由ですがDPDK+OVS環境のパフォーマンスが上がるか調べたかったためです。予想通り良い結果が出てホッとしています。

MAAS 2.2が標準リポジトリーで提供されるようになった

MAAS 2.2がUbuntu Xenialのメインリポジトリーにてインストール可能になった模様(7/20頃?)。しばらく2.2系を使いたいので、PPAは-rオプションで削除した。

続・macOSでリモートサーバーに接続してLinuxの仮想マシンマネージャーを操作する

先日、こんなことを書きました。

ytooyama.hatenadiary.jp

そして、最近macOS 10.12.6のアップデートを適用したのですが、それ以降つぎのようにリモートサーバーにSSH接続するとエラーが表示され、リモートサーバー上でソフトウェアを実行してもXサーバーが起動してないよみたいなエラーになります。つまり、XアプリケーションのSSH転送ができなくなっていました。

% ssh -XC root@172.17.32.90
Warning: untrusted X11 forwarding setup failed: xauth key data not generated

エラーでWeb検索した結果、次のようなフォーラムのページを見つけました。

stackoverflow.com

ssh_configになにがしを書けとか、-Yオプションを使うといいよとか、Xquartzを再インストールすると良いよとか色々あり、再インストール以外は書かれていることは一通り試してみたのですがダメで、私の環境の場合は結局、次のように設定したらなんとかなりました。

その設定方法とは、macOS側のsshクライアントの設定にXAuthLocationを指定するというものでした。パスはOS Xのバージョンによって違うようです。とりあえずwhichコマンドやwhereisコマンドなどで探せば良いと思います。そこで出てきたパスをXAuthLocationとして指定します。ちなみにHost *のところに書いてしまいましたが、X転送するホストが決まっている場合は、ホスト名をきちんと書いても良いかもしれません。

% vi ~/.ssh/config
Host *
...
XAuthLocation /opt/X11/bin/xauth

macOSでリモートサーバーに接続してLinuxの仮想マシンマネージャーを操作する

[7/20 追記]

CentOS 7 minimalインストールでは次のパッケージをインストールする必要がありました。 インストールするフォントはなんでも構いません。フォントをインストールしないとメニューが豆腐だらけになります。

yum -y install xauth ipa-pgothic-fonts

また、sshdの以下の設定を一部変更する必要がありました。設定を反映させるためにsshdサービスの再起動が必要でした。

X11Forwarding yes
X11DisplayOffset 10

ここではCentOS 7を例にしましたが、他のOSでも最小インストールの際は上のような対応が必要かもしれません。 以上、追記終わり。


f:id:ytooyama:20170714230840p:plain:w450

昔のOS X(確かSnow Leopardまで)にはX11.appというのが標準で存在していたので簡単にできたのですが、現在はXQuartzというX11.appの改良版のX Window Systemをインストールすると、macOSX11アプリケーションを実行したり、リモートサーバー上のXアプリケーションを実行したりすることができるようです。

今回は例として、サーバーにインストールした仮想マシンマネージャーを起動してmacOSで操作するまでの手順です。

XQuartzをダウンロードしてインストー

XQuartzを公式サイトからダウンロードします。

https://www.xquartz.org/

インストールは少々時間がかかります。 インストール後は一旦macOSをログアウトする必要があります。

f:id:ytooyama:20170714233735p:plain

XQuartzを起動

XQuartzはアプリケーションフォルダーのユーティリティーフォルダの中にappファイルがあります。 ダブルクリックしてXQuartzを起動します。

接続する前に一つだけ重要な設定(OptionキーでAlt_LとAlt_Rを送信)を有効化しておきます。

f:id:ytooyama:20170714230446p:plain

リモートサーバーにSSH接続

XQuartzのターミナルを開きます。 sshコマンドを使っていつものように接続するだけですが、ポイントは-Xオプションをつけて実行するというところです。パスワード入力を要求されたらリモートサーバーの指定ユーザーのパスワードを入力します。

% ssh -X user@xserver-host

ちなみに-Xオプションについてはマニュアルに次のような記述があります。

     -X      Enables X11 forwarding.  This can also be specified on a per-host
             basis in a configuration file.

             X11 forwarding should be enabled with caution.  Users with the
             ability to bypass file permissions on the remote host (for the
             user's X authorization database) can access the local X11 display
             through the forwarded connection.  An attacker may then be able
             to perform activities such as keystroke monitoring.

             For this reason, X11 forwarding is subjected to X11 SECURITY
             extension restrictions by default.  Please refer to the ssh -Y
             option and the ForwardX11Trusted directive in ssh_config(5) for
             more information.

リモートサーバーに接続されます。見た目は-Xオプションをつけないでssh接続をした時と一緒。あとは接続したターミナル上で、virt-managerコマンドを実行するだけ。

f:id:ytooyama:20170717212444p:plain:w360

これで冒頭のように見慣れた管理画面が開かれます。仮想マシンのコンソールも表示できます。

WindowsにはXmingというものがあるようです。そのうち試そうと思います。 http://d.hatena.ne.jp/marqut/20141230/1419923430

これで仮想マシンマネージャーを開くだけのためにVMLinuxを起動しなくても済むようになりました。ちなみにVPN越しでも割と使えますね。さすがにローカル上のVMを操作するのと比べると遅くなりますけど。

macOSの移行ウィザードでユーザーを移行したらVagrantがUIDのエラーでうまく動かなくなった場合の解決方法

vagrant statusとか、とにかくコマンドを実行するとエラーになってしまいました。 大ピンチです。

current user running Vagrant. VirtualBox requires that the same user
be used to manage the VM that was created. Please re-run Vagrant with
that user. This is not a Vagrant issue.

The UID used to create the VM was: 503
Your UID is: 501

検索すると、「.vagrant/machines/default/virtualbox/creator_uid」や「.vagrant/machines/default/virtualbox/id」にIDが書かれているので「Your UID is…」と書かれているIDに書き換えろーって話らしい。

qiita.com

stackoverflow.com

ただしそんなファイル、ないんですけどと言う場合は.vagrantと言うディレクトリーを削除してしまえば良いみたいです。このディレクトリーはVagrantfileを置いているディレクトリーごとにあるので、端末でls -laと実行して出てきたディレクトリーをrm -rf .vagrantと実行して削除すればOK。vagrantコマンドを実行すると再作成されるようです。

ちなみに先ほどのパスですが、Vagrantfileに複数のVMの情報を記述している場合はdefaultの部分が変わってきます。 例えば次のような記述がある場合はcent7n0とかcent7n1のように指定したエントリーの数だけディレクトリーが作られますので、個別にidを変えたい場合はそう指定します。正直ディレクトリーを削除して再作成してもらった方が良いと思います。

...
 config.vm.define :cent7n0 do |cent7n0|
  cent7n0.vm.box = "cent/7"
  cent7n0.vm.hostname = "cent0"
  cent7n0.vm.network "private_network", ip: "192.168.57.211"
 end

 config.vm.define :cent7n1 do |cent7n1|
  cent7n1.vm.box = "cent/7"
  cent7n1.vm.hostname = "cent1"
  cent7n1.vm.network "private_network", ip: "192.168.57.212"
 end
...

新しく買ったMacBook 2017 vs 持っているMacBook

f:id:ytooyama:20170710010647j:plain

古い世代とはいえ、Core i7とCore m3の比較なのであまり参考にならないと思いますが、同じバージョンのGookBench 4でCPUのベンチマークをとってみました。

結果はシングルコアは若干速く、デュアルコアはi7に及ばないという結果でした。当たり前です。コア数もスレッド数も半分ですから。詳しくは以下の結果を見て欲しいですが、VMWindowsを使う程度なら別に遅さも感じません。一つだけ言うなら、やはりType-CのUSB一つは不便なところでしょうか。明日帰りにビックカメラでType-Cで給電しながら使えるUSBのHubを買おう。

あれ、でもそれって一緒に買ったHub USB Type-C - Type-A変換コネクターが無駄になるんじゃ…

「grub2-mkconfig -o /boot/grub2/grub.cfg」が覚えられない件について

今の仕事は割とGRUBの設定を書き換えて再起動することが多いのですが、忘れがちな表題のコマンド。Ubuntuだと「update-grub」なのでわかりやすいですし、コマンド補完が効くので多分、「update」くらいまで打ってタブ補完すればコマンドを実行できます。一方、例えばCentOS 7とかFedoraとかはgrub2-mkconfigほげほげと長い。いろいろ考えたのですが、エイリアスで逃げることにしました。

aliasの永続化はbashの場合は以下のように。zshの場合は.zsh_aliasとか.zshrcに書けば良いらしいです。

# vi ~.bashrc
alias update-grub='grub2-mkconfig -o /boot/grub2/grub.cfg'