アキレスと亀

一日一歩。一日一膳。光合成で生きていきたいお気持ちが強い。

Growi+PostfixをDockerで構築

背景

久々にWikiを構築する機会があったので、お気に入りのGrowiを使用して構築することにした。
手軽に使用できるSMTPサーバがないため、メールサーバ込みで構築する必要がある。
運用面を考えて全てコンテナで構築したいが、公式のdocker-composeではメールサーバまでカバーしていない。
また、最小限の認証機能付きDocker imageも見つからない。 上記の理由から自分で構築したが、意外と試行錯誤したため共有。

構築手順

growi-docker-composeのダウンロード

公式のGithubから、docker-composeをダウンロード。

$ git clone https://github.com/weseek/growi-docker-compose.git growi

Postfixの構築

Postfixコンテナ用ディレクトリの作成。

$ cd growi
$ mkdir postfix
$ mkdir postfix/conf

postfix/Dockerfileの作成。Alpine Linuxで作成する。

FROM alpine:latest

RUN apk add --update --no-cache postfix cyrus-sasl bash

ADD conf/main.cf /etc/postfix/main.cf
ADD conf/smtpd.conf /usr/lib/sasl2/smtpd.conf
ADD entrypoint.sh /entrypoint.sh

CMD /entrypoint.sh

postfix/conf/main.cfの作成。

mynetworks = 127.0.0.0/8
maillog_file = /dev/stdout
myhostname =  # This will be overwritten in entrypoint.sh
smtp_relay_restrictions = permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes

postfix/conf/smtpd.confの作成。今回は、sasldbプラグインを利用し、ファイルでパスワードを作成する。(参考サイト)
mech_listの行は、多分PLAIN LOGINだけで大丈夫。

pwcheck_method: auxprop
auxprop_plugin: sasldb
mech_list: PLAIN LOGIN CRAM-MD5 DIGEST-MD5 NTLM

postfix/entrypointの作成。

#!/bin/bash

# SASL Settings
if [ ! -f /etc/sasl2/sasldb2 ]; then
  mkdir /etc/sasl2
  echo $smtp_pw | saslpasswd2 -p -c -f /etc/sasl2/sasldb2 -u $ mail_domain $smtp_user
  chown postfix:postfix /etc/sasl2/sasldb2
fi

# Execute newaliases
postconf -e myhostname=$mail_domain
newaliases

# Start postfix
postfix start-fg

docker-compose.ymlの編集

以下の通り編集。

version: '3'

services:
  app:
    build:
      context: .
      dockerfile: ./Dockerfile
    ports:
      - 3000:3000    # localhost only by default
    links:
      - mongo:mongo
      - elasticsearch:elasticsearch
    depends_on:
      - mongo
      - elasticsearch
    environment:
      - MONGO_URI=mongodb://mongo:27017/growi
      - ELASTICSEARCH_URI=http://elasticsearch:9200/growi
      - PASSWORD_SEED=changeme
      - FILE_UPLOAD=mongodb   # activate this line if you use MongoDB GridFS rather than AWS
      - MATHJAX=1             # activate this line if you want to use MathJax
      
    entrypoint: "dockerize
                  -wait tcp://mongo:27017
                  -wait tcp://elasticsearch:9200
                  -timeout 60s
                  /docker-entrypoint.sh"
    command: ["yarn migrate && node -r dotenv-flow/config --expose_gc dist/server/app.js"]

    restart: unless-stopped
    volumes:
      - growi_data:/data

  mongo:
    image: mongo:4.4
    restart: unless-stopped
    volumes:
      - mongo_configdb:/data/configdb
      - mongo_db:/data/db

  elasticsearch:
    build:
      context: ./elasticsearch
      dockerfile: ./Dockerfile
    environment:
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms256m -Xmx256m"  # increase amount if you have enough memory
      - LOG4J_FORMAT_MSG_NO_LOOKUPS=true # CVE-2021-44228 mitigation for Elasticsearch <= 6.8.20/7.16.0
    ulimits:
      memlock:
        soft: -1
        hard: -1
    restart: unless-stopped
    volumes:
      - es_data:/usr/share/elasticsearch/data
      - ./elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml

  postfix:
    build:
      context: ./postfix
      dockerfile: ./Dockerfile
    environment:
      - mail_domain=server.example.com
      - smtp_user=test
      - smtp_pw=testpass
    ports:
      - 127.0.0.1:25:25
    restart: unless-stopped

volumes:
  growi_data:
  mongo_configdb:
  mongo_db:
  es_data:

構築・テスト

コンテナ構築

$ docker-compose build
$ docker-compose up -d

ブラウザからアクセス。http://localhost:3000
管理者アカウント作成。
設定 > アプリ設定 > メール設定から、以下を設定する。

  • Fromアドレス: 任意(ドメインは、$mail_domainのサーバ名を抜いたものにする。)
  • 送信方法: SMTP
  • ホスト: postfix
  • ポート: 25
  • ユーザ: test
  • パスワード: testpw

SASLのデバッグ方法

Growiのメールテストがうまく動かない場合は、以下のようにデバッグする。

@Postfixコンテナ
docker-compose logs -f postfixpostfixのログを監視。

@Growiコンテナ
apt update && apt install telnettelnetをインストール。
telnet postfix 25postfixコンテナに接続。
以下のような感じで、認証が通るか確認。

220 server.example.com ESMTP Postfix
EHLO client.example.com  # 入力する
250-server.example.com
250-PIPELINING
250-SIZE 10240000
250-ETRN
250-AUTH DIGEST-MD5 PLAIN CRAM-MD5
250 8BITMIME
AUTH PLAIN dGVzdAB0ZXN0AHRlc3RwYXNz  # 入力する。
235 Authentication successful

AUTH PLAINの後の文字は、"{認証ユーザ名}¥0{認証ユーザ名}¥0{認証パスワード}"をbase64エンコードした文字。
¥0はNULL文字。
test/testpassの場合は、dGVzdAB0ZXN0AHRlc3RwYXNzとなる。
認証が通らない場合には、postfixコンテナ側のlogを見ながらググる

Mac OS 11で、Vimコンパイル時にclientserver機能が有効化されない

概要

  • vim-tex利用のために、clientserver機能を有効化したVimをインストールを試みていた
  • Homebrewではclientserver機能を有効化できないため、ソースからコンパイルの必要がある
  • Mac OS 11.1でコンパイルを試みたところ、Huge versionをインストールしているにも関わらずclientserver機能が有効化されない
  • コンパイル時にX11ライブラリのヘッダを見つけられないことが原因のため、読み込めるようにコンパイルオプションを変更し解決

詳細

問題

clientserver機能を有効化したVimコンパイルを試みた。
下記のビルドスクリプトを作成し実行したところ、コンパイルは正常に完了するが、clientserver機能が有効化されなかった。

#!/bin/sh

vim_repo_dir=vim

if [ ! -e $vim_repo_dir ]; then
  git clone https://github.com/vim/vim.git
fi

cd $vim_repo_dir
git pull
make distclean
./configure \
  --with-features=huge \
  --disable-darwin \
  --enable-python3interp \
  --enable-luainterp \
  --enable-gui \
make
sudo make install

コンパイルされたVimの詳細は、以下の通り。
HugeバージョンのVimでは、clientserver機能がサポートされることになっている。(参考: https://vim-jp.org/vimdoc-ja/various.html#+feature-list)

user@host% vim --version                                           [/opt/vim]
VIM - Vi IMproved 8.2 (2019 Dec 12, compiled Jan 17 2021 16:49:41)
macOS version w/o darwin feat. - x86_64
Included patches: 1-2366
Compiled by user@host
Huge version without GUI.  Features included (+) or not (-):
+acl               -farsi             +mouse_sgr         +tag_binary
+arabic            +file_in_path      -mouse_sysmouse    -tag_old_static
+autocmd           +find_in_path      +mouse_urxvt       -tag_any_white
+autochdir         +float             +mouse_xterm       -tcl
-autoservername    +folding           +multi_byte        +termguicolors
-balloon_eval      -footer            +multi_lang        +terminal
+balloon_eval_term +fork()            -mzscheme          +terminfo
-browse            +gettext           +netbeans_intg     +termresponse
++builtin_terms    -hangul_input      +num64             +textobjects
+byte_offset       +iconv             +packages          +textprop
+channel           +insert_expand     +path_extra        +timers
+cindent           +ipv6              -perl              +title
-clientserver      +job               +persistent_undo   -toolbar
-clipboard         +jumplist          +popupwin          +user_commands
+cmdline_compl     +keymap            +postscript        +vartabs
+cmdline_hist      +lambda            +printer           +vertsplit
+cmdline_info      +langmap           +profile           +virtualedit
+comments          +libcall           -python            +visual
+conceal           +linebreak         +python3           +visualextra
+cryptv            +lispindent        +quickfix          +viminfo
-cscope            +listcmds          +reltime           +vreplace
+cursorbind        +localmap          +rightleft         +wildignore
+cursorshape       -lua               -ruby              +wildmenu
+dialog_con        +menu              +scrollbind        +windows
+diff              +mksession         +signs             +writebackup
+digraphs          +modify_fname      +smartindent       -X11
-dnd               +mouse             -sound             -xfontset
-ebcdic            -mouseshape        +spell             -xim
+emacs_tags        +mouse_dec         +startuptime       -xpm
+eval              -mouse_gpm         +statusline        -xsmp
+ex_extra          -mouse_jsbterm     -sun_workshop      -xterm_clipboard
+extra_search      +mouse_netterm     +syntax            -xterm_save
   system vimrc file: "$VIM/vimrc"
     user vimrc file: "$HOME/.vimrc"
 2nd user vimrc file: "~/.vim/vimrc"
      user exrc file: "$HOME/.exrc"
       defaults file: "$VIMRUNTIME/defaults.vim"
  fall-back for $VIM: "/usr/local/share/vim"
Compilation: gcc -c -I. -Iproto -DHAVE_CONFIG_H -DMACOS_X -g -O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1
Linking: gcc -L/usr/local/lib -o vim -lm -lncurses -liconv -lintl -L/usr/local/var/pyenv/versions/3.7.4/lib/python3.7/config-3.7m-darwin -lpython3.7m -framework CoreFoundation

デバッグ

とりあえずコンパイル時のログを確認する。
Vimコンパイルログは、vim/src/auto/config.logで確認できる。
確認していくと、怪しい行を発見した。

   646 conftest.c:32:10: fatal error: 'X11/Xlib.h' file not found
   647 #include <X11/Xlib.h>
   648          ^~~~~~~~~~~~
   649 1 error generated.

上記ログは、X11に関するヘッダーファイルが読み込めていないことを示している。
また前述のVimのバージョン情報を確認すると、X11機能が有効化されていなかった。

UnixにてVimのclientserver機能はX11によって実現されている。
したがってX11機能が有効化されていないと、clientserver機能も有効化されない。

ヘッダファイルが見つかっていないことが原因のようなので、ヘッダファイルの場所を確認する。

$ find / -name "Xlib.h" | grep Xlib.h
/opt/X11/include/X11/Xlib.h
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Tk.framework/Versions/8.5/Headers/X11/Xlib.h
/System/Volumes/Data/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Tk.framework/Versions/8.5/Headers/X11/Xlib.h
/System/Volumes/Data/opt/X11/include/X11/Xlib.h

vim/src/auto/configureを参照し、コンパイル時の設定を確認する。
X11で検索すると、ヘッダーファイル参照に使用するためのパスのリストを発見した。

   8273 # Standard set of common directories for X headers.
   8274 # Check X11 before X11Rn because it is often a symlink to the current release.
   8275 ac_x_header_dirs='
   8276 /usr/X11/include
   8277 /usr/X11R7/include
   8278 /usr/X11R6/include
   8279 /usr/X11R5/include
   8280 /usr/X11R4/include
   8281 
   8282 /usr/include/X11
   8283 /usr/include/X11R7
   8284 /usr/include/X11R6
   8285 /usr/include/X11R5
   8286 /usr/include/X11R4
   8287 
   8288 /usr/local/X11/include
   8289 /usr/local/X11R7/include
   8290 /usr/local/X11R6/include
   8291 /usr/local/X11R5/include
   8292 /usr/local/X11R4/include
   8293 
   8294 /usr/local/include/X11
   8295 /usr/local/include/X11R7
   8296 /usr/local/include/X11R6
   8297 /usr/local/include/X11R5
   8298 /usr/local/include/X11R4
   8299 
   8300 /usr/X386/include
   8301 /usr/x386/include
   8302 /usr/XFree86/include/X11
   8303 
   8304 /usr/include
   8305 /usr/local/include
   8306 /usr/unsupported/include
   8307 /usr/athena/include
   8308 /usr/local/x11r5/include
   8309 /usr/lpp/Xamples/include
   8310 
   8311 /usr/openwin/include
   8312 /usr/openwin/share/include'

先ほど確認したヘッダーファイルが存在するディレクトリのパスがリストに含まれていないことが確認できる。

解決策

コンパイル時にX11/Xlib.hが含まれるディレクトリを参照可能にすれば良い。

diff --git a/src/auto/configure b/src/auto/configure
index bbfaafcad..6cfa04138 100755
--- a/src/auto/configure
+++ b/src/auto/configure
@@ -8308,6 +8308,8 @@ ac_x_header_dirs='
 /usr/local/x11r5/include
 /usr/lpp/Xamples/include

+/opt/X11/include
+
 /usr/openwin/include
 /usr/openwin/share/include'

コンパイルしてみると、X11もclientserver機能も有効化されていることが確認できる。

user@host% vim --version                                                                                  [/opt/vim]
VIM - Vi IMproved 8.2 (2019 Dec 12, compiled Jan 17 2021 17:25:52)
macOS version w/o darwin feat. - x86_64
Included patches: 1-2366
Compiled by user@host
Huge version with X11-Athena GUI.  Features included (+) or not (-):
+acl               -farsi             +mouse_sgr         +tag_binary
+arabic            +file_in_path      -mouse_sysmouse    -tag_old_static
+autocmd           +find_in_path      +mouse_urxvt       -tag_any_white
+autochdir         +float             +mouse_xterm       -tcl
-autoservername    +folding           +multi_byte        +termguicolors
+balloon_eval      -footer            +multi_lang        +terminal
+balloon_eval_term +fork()            -mzscheme          +terminfo
+browse            +gettext           +netbeans_intg     +termresponse
++builtin_terms    -hangul_input      +num64             +textobjects
+byte_offset       +iconv             +packages          +textprop
+channel           +insert_expand     +path_extra        +timers
+cindent           +ipv6              -perl              +title
+clientserver      +job               +persistent_undo   +toolbar
+clipboard         +jumplist          +popupwin          +user_commands
+cmdline_compl     +keymap            +postscript        +vartabs
+cmdline_hist      +lambda            +printer           +vertsplit
+cmdline_info      +langmap           +profile           +virtualedit
+comments          +libcall           -python            +visual
+conceal           +linebreak         +python3           +visualextra
+cryptv            +lispindent        +quickfix          +viminfo
-cscope            +listcmds          +reltime           +vreplace
+cursorbind        +localmap          +rightleft         +wildignore
+cursorshape       -lua               -ruby              +wildmenu
+dialog_con_gui    +menu              +scrollbind        +windows
+diff              +mksession         +signs             +writebackup
+digraphs          +modify_fname      +smartindent       +X11
-dnd               +mouse             -sound             +xfontset
-ebcdic            +mouseshape        +spell             +xim
+emacs_tags        +mouse_dec         +startuptime       +xpm
+eval              -mouse_gpm         +statusline        +xsmp_interact
+ex_extra          -mouse_jsbterm     -sun_workshop      +xterm_clipboard
+extra_search      +mouse_netterm     +syntax            -xterm_save
   system vimrc file: "$VIM/vimrc"
     user vimrc file: "$HOME/.vimrc"
 2nd user vimrc file: "~/.vim/vimrc"
      user exrc file: "$HOME/.exrc"
  system gvimrc file: "$VIM/gvimrc"
    user gvimrc file: "$HOME/.gvimrc"
2nd user gvimrc file: "~/.vim/gvimrc"
       defaults file: "$VIMRUNTIME/defaults.vim"
    system menu file: "$VIMRUNTIME/menu.vim"
  fall-back for $VIM: "/usr/local/share/vim"
Compilation: gcc -c -I. -Iproto -DHAVE_CONFIG_H -DFEAT_GUI_ATHENA -DMACOS_X -g -O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1 -I/opt/X11/include
Linking: gcc -L/opt/X11/lib -L/usr/local/lib -o vim -lXaw -lXmu -lXext -lXpm -lXt -lX11 -lSM -lICE -lm -lncurses -liconv -lintl -L/usr/local/var/pyenv/versions/3.7.4/lib/python3.7/config-3.7m-darwin -lpython3.7m -framework CoreFoundation

VimでTeXを書こう! on Mac

概要

論文執筆にあたり、vimTeXを書く環境を整えたいと思った。
これまではMakefileを書いておいて、PDFを確認したくなったらmakeを実行していた。
これでも悪くはないのだが、やっぱりリアルタイムプレビューとかが欲しい。

というわけでやってみた。

www.youtube.com

環境

  • Mac OS 10.14.6
  • Skim 1.5.2
  • Vim 8.1
  • XQuartz 2.7.11
  • e-pTeX 3.14159265-p3.8.2-190131-2.6 (utf8.euc) (TeX Live 2019)
  • latexmk 4.63b

手順

1. MacTeXのインストール

MacTeXはTeXに必要な諸々のソフトウェアをまとめてインストールしてくれるもの。
以下からダウンロードしてインストール。

tug.org

2. latexmkの準備

latexmkはTeXからPDFまでの変換に必要な一連の処理を行ってくれるperlスクリプト
MacTeXをインストールすると付いてくるので、別でインストールする必要はない。
vimTeX用pluginの中でこれを使用してコンパイルを行う。
設定ファイルとして、カレントディレクトリ or ホームディレクトリに.latexmkrcという設定ファイルを作成する必要がある。
設定例を以下に示す。

#!/usr/bin/env perl

$latex = 'platex -synctex=1 -halt-on-error';
$latex_silent = 'platex -synctex=1 -halt-on-error -interaction=batchmode';
$biber = 'biber  -u -U --output_safechars';
$bibtex = 'pbibtex';
$dvipdf = 'dvipdfmx %O -o %D %S';
$makeindex = 'mendex %O -o %D %S';
$pdf_mode = 3;  # Use dvipdf
$pvc_view_file_via_temporary = 0;  # Do not create backup file
$max_repeat = 5;
$preview_continuous_mode = 1;
if ($^O eq 'darwin') {
  $pdf_previewer = 'open -ga Skim';
} elsif ($^O eq 'linux') {
  $pdf_previewer = 'evince';
}

設定内容の説明は省略するので、公式等を参照して欲しい。(URL: https://ctan.org/pkg/latexmk)

3. Vimのインストール

PDF Viewerと連携するためにclientserverという拡張をenableにする必要があるので、homebrew等のパッケージ管理ソフトではなくソースからコンパイルする。
clientserver機能付きでビルドできるようにシェルスクリプトを用意した。
以下のshellscriptを実行すると、/usr/local/binにインストールされる。

#!/bin/sh

vim_repo_dir=vim

if [ ! -e $vim_repo_dir ]; then
  git clone https://github.com/vim/vim.git
fi

cd $vim_repo_dir
git pull
make distclean
./configure \
  --with-features=huge \
  --disable-darwin \
  --enable-python3interp \
  --enable-luainterp \
  --enable-gui \
make
sudo make install

vim --versionを実行すると、有効になっている拡張機能が確認できる。
clientserverに+マークが付いていれば大丈夫。

VIM - Vi IMproved 8.1 (2018 May 18, compiled Aug  7 2019 13:37:24)
macOS version w/o darwin feat.
Included patches: 1-1824
Compiled by kkoiro@john
Huge version with X11-Athena GUI.  Features included (+) or not (-):
+acl               -farsi             -mouse_sysmouse    -tag_any_white
+arabic            +file_in_path      +mouse_urxvt       -tcl
+autocmd           +find_in_path      +mouse_xterm       +termguicolors
+autochdir         +float             +multi_byte        +terminal
-autoservername    +folding           +multi_lang        +terminfo
+balloon_eval      -footer            -mzscheme          +termresponse
+balloon_eval_term +fork()            +netbeans_intg     +textobjects
+browse            -gettext           +num64             +textprop
++builtin_terms    -hangul_input      +packages          +timers
+byte_offset       +iconv             +path_extra        +title
+channel           +insert_expand     -perl              +toolbar
+cindent           +job               +persistent_undo   +user_commands
+clientserver      +jumplist          +postscript        +vartabs
+clipboard         +keymap            +printer           +vertsplit
+cmdline_compl     +lambda            +profile           +virtualedit
+cmdline_hist      +langmap           -python            +visual
+cmdline_info      +libcall           +python3           +visualextra
+comments          +linebreak         +quickfix          +viminfo
+conceal           +lispindent        +reltime           +vreplace
+cryptv            +listcmds          +rightleft         +wildignore
-cscope            +localmap          -ruby              +wildmenu
+cursorbind        -lua               +scrollbind        +windows
+cursorshape       +menu              +signs             +writebackup
+dialog_con_gui    +mksession         +smartindent       +X11
+diff              +modify_fname      -sound             +xfontset
+digraphs          +mouse             +spell             +xim
-dnd               +mouseshape        +startuptime       +xpm
-ebcdic            +mouse_dec         +statusline        +xsmp_interact
+emacs_tags        -mouse_gpm         -sun_workshop      +xterm_clipboard
+eval              -mouse_jsbterm     +syntax            -xterm_save
+ex_extra          +mouse_netterm     +tag_binary        
+extra_search      +mouse_sgr         -tag_old_static    
   system vimrc file: "$VIM/vimrc"
     user vimrc file: "$HOME/.vimrc"
 2nd user vimrc file: "~/.vim/vimrc"
      user exrc file: "$HOME/.exrc"
  system gvimrc file: "$VIM/gvimrc"
    user gvimrc file: "$HOME/.gvimrc"
2nd user gvimrc file: "~/.vim/gvimrc"
       defaults file: "$VIMRUNTIME/defaults.vim"
    system menu file: "$VIMRUNTIME/menu.vim"
  fall-back for $VIM: "/usr/local/share/vim"
Compilation: gcc -c -I. -Iproto -DHAVE_CONFIG_H -DFEAT_GUI_ATHENA   -DMACOS_X  -g -O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1     -I/usr/X11/include   
Linking: gcc  -L/usr/X11/lib   -L/usr/local/lib -o vim -lXaw -lXmu -lXext -lXpm -lXt -lX11 -lSM -lICE -lm -lncurses  -liconv     -L/usr/local/var/pyenv/versions/3.7.4/lib/python3.7/config-3.7m-darwin -lpython3.7m -framework CoreFoundation      

4. XQuartzのインストール

vimのclientserver機能を使用するにはX Window Systemが必要らしい。
Mac OSではX Quartzというソフトウェアをインストールすることで使用できる。

www.xquartz.org

5. vimtexの導入

vimtexはvimTeXを書きやすくしてくれる素晴らしいプラグイン
以下のレポジトリからダウンロードして追加。 github.com

自分はdein.vim(URL)https://github.com/Shougo/dein.vimを利用しているので、dein_lazy.tomlに以下を追記した。

[[plugins]]
repo = 'lervag/vimtex'
on_ft = 'tex'
hook_add = '''
  let g:vimtex_compiler_latexmk_engines = {'_': '-pdfdvi'}
  let g:vimtex_view_method= 'skim'
  let g:vimtex_quickfix_latexlog = {'default': 0}
'''
hook_source = '''
  if empty(v:servername) && exists('*remote_startserver')
    call remote_startserver('VIM')
  endif
'''

以下、解説。

  • vimtex_compiler_latexmk_engines
    latexmkでPDFをコンパイルする。-pdfdviはオプション。
  • vimtex_view_method
    PDF Viewerを指定。skim(後述)を指定している。
  • vimtex_quickfix_latexlog
    latexのwarningに関する設定。'default': 0を指定すると、latexのwarningを全て無視する。
  • call remote_startserver
    vimtexを読み込むときにVIMという名前でコマンドサーバを起動する。

詳しい設定は、vim:help vimtexを参照すること。

6. Skimのインストール

MacのPDF Viewerで有名なものらしい。(知らなかった)
SyncTeX機能を搭載しており、vimサーバとやりとりをして相互に連携可能なためこれを使う。
インストールは以下のリンクから。

skim-app.sourceforge.io

インストールしたら、Preferenceを開き、SyncタブのPDF-TeX Sync support項目を以下のように設定。

  • Preset: Custom
  • Command: /usr/local/bin/vim
  • Arguments: --remote-silent +"%line" "%file"

Argumentの詳細についてはvimの公式に説明があるので参照すること。(URL: https://vim-jp.org/vimdoc-ja/remote.html)

ここまでで必要な環境構築は終了。

使い方

vimtexでは\llコンパイルモード開始、その後ファイルを編集し保存すると自動でコンパイルしてPDF Viewerに反映してくれる。
\lvを押すと、PDF Viewerでカーソル行に移動しハイライト、PDF ViewerからはCommand+Shift+クリックvimのカーソルを移動してくれる。

感想

vimとskimをマルチウインドウで並べると、作業も捗るしとてもかっこいい!

MacのApple Musicで椎名林檎がローマ字表示される

今までケチケチとYoutubeで音楽を聞いていたのだが、最近Apple Musicに加入した。 きっかけは、落ち込んでいた時に偶然見つけたサンボマスターに励まされ、色々聞きたいと思ったのだがyoutubeには一部楽曲しか登録されていなかったためだ。 音楽は本当にいい。人生を変える。こんなに手軽に様々な音楽を聞ける時代に生まれて感謝である。

それはそうと、今回のテーマは椎名林檎がローマ字表記されることである。 しばらくApple Musicを使用していると、ある問題に気がついた。それは椎名林檎をライブラリに追加する時だったのだが、椎名林檎が"Sheena Ringo"とローマ字?表記されてしまうのだ。これのみでなく、楽曲までローマ字表記になってしまう。 色々と調べてみると、一部他のアーティストでも同じような現象が起こることがあるらしい。曲名を元に歌詞検索してきて、表示してくれるアプリを使用している私にとってこれは重大である。

この問題は、Apple Musicがシステムの言語設定を参照してユーザの使用言語を認識し、それに応じて楽曲情報を提供していることに起因するらしい。 確かに私はシステムの言語設定を英語にしている。その方が、ランチャーでアプリ検索するときに便利なのだ。本当はただのカッコつけである。 それはともかく、このような問題が発生するときは、一々システムの言語設定を変え、Apple Musicを開き、iTunesにシステムの言語を認識させ、音楽をダウンロードし、また元に戻すという非常に面倒な作業が発生する。 ここでシステムの言語設定を日本語に固定すればいいのではないかと思う人がいるだろうが、そうすると洋楽がカタカナで表示されるという非常にダサい感じになっている。Appleは本当に早く何とかして欲しい。

ここから本記事の本題である。

  1. iTunesを言語指定して開く
    ターミナルからiTunesを起動すると、言語設定を引数に渡して起動可能である。日本語設定で起動するときは以下のコマンドでオープンする。
    $ open -n -a iTunes --args -AppleLanguages ‘(“ja-JP”)’ # 英語設定のときは'ja-JP'を'en-US'に変更

  2. 言語設定をiTunesに認識させる
    iTunesを開いたときに一番上のメニューバーに表示されるAccount -> View my accountとクリックする。

以上のたった2ステップでこの問題を回避することができる。 今までローマ字やカタカナで一度ダウンロードしてしまった楽曲は、一度ライブラリから削除し再度ダウンロードする必要があるため少々面倒だが、今後は任意の言語で情報を取得することができるだろう。ぜひ試して欲しい。

(2018/12/7追記) Automationというアプリケーションを使用すると、上記のコマンドをアプリケーションとして登録可能らしい。そうするとLauncherからも起動可能になる。詳細は別記事に譲る。

www.karakaram.com

tarで固めがらリモートに送信する

PCのクリーンインストール時など、大きいフォルダを一回限りリモートのサーバーに退避させたい時があります。その様な時に、tarで圧縮しながら送ると有効だと思ったので方法を書き記しておきます。コマンドは以下の通りです。

tar zcvf - directory/ | ssh user@remote_server "cat > directory.tgz"

tarでファイル名の代わりにハイフンを指定することで、出力先として標準出力を選択できます。それをパイプでリモートのサーバーに渡しています。リモートのサーバーでは、sshの第3引数にコマンドを指定することでlogin後にコマンドを実行できることを利用し、catを経由してファイルとして保存しています。