無職は金がかかる

無職は金がかかる。いや、そもそも生活には金がかかる。それは当たり前の話だ。 しかし、企業に属して働いてるときは隠蔽されているいくつかの消費が無職になるとあらわになってくる。

これから無職になりたい連中に、無職でかかる金について伝えておきたい。 無職と言っても退職後有給消化期間に入っていて、消化が終わったら次の会社に入社するあなたのためではないので念の為。

何に金がかかるのか 

はっきり言って次の3点である。

  • 住民税
  • 健康保険料
  • 国民年金保険料(税)

これらは就業中、給与から自動で天引きされていたわけだが、退職したということはこれらを自分で払う必要がある。

住民税

正規雇用で働いている場合、住民税は毎月徴収される。 これは住民税の特別徴収という仕組みが使われている。 名前に特別とつくくらいなので、普通の徴収方法ではない。

無職になると住民税は特別徴収から普通徴収に切り替わる。 普通徴収の住民税の場合、決まった期日までに住民税を払い込むことで支払いを行う。

そしてここからが重要だが、この時払い込む住民税は1月分ではない

カレンダーを見ながら住民税の払い込みスケジュールについて確認しよう。

まず住民税は前年の所得を元に決定される。というわけで、前年稼いでいた人間は結構な額が取られるので覚悟しておこう。

次に住民税を普通徴収で払う場合、1年分の住民税を一括で払い込む方法と数回に分けて払い込む方法を選ぶことができる。 ちなみに、期の途中で無職になった場合、数回に分けて払い込む方法しか使えない。

健康保険料

日本は国民皆保険を採用しているので、国民は皆何らかの健康保険に加入する。 正規雇用されている間は企業の契約する健康保険組合が提供する健康保険(社会保険)を利用していただろうが、無職になると次の二つの選択肢からどちらかを選ぶことになる。

  • 健康保険組合の任意継続
  • 国民健康保険への加入

たいていの場合、健康保険組合を継続するよりも国民健康保険に入るほうが安くつく。

保険料は前年の収入に応じて決まるため、前年稼いでいて無職になった人はそこそこの金額になることを覚悟しておくと良い。 もしあなたが東京都墨田区に住む39歳以下の一人暮らしで、前年の収入が500万円だった場合、1年間で38万9500円の保険料を支払う。

ちなみに国民健康保険は6月から翌年3月までの間に10回に分けて支払うというやや不思議な仕組みになっている。 また、滞納すると差し押さえの危険性もあるのでなるべく早く払わないといけない。滞納すると電話が鳴ったり、家のポストに督促状が来たりする。

国民年金

日本には国民皆年金制度が整備されているため、20歳以上の人間は年金に加入することになる。 年金制度として、全国民が加入する国民年金(老齢基礎年金ともいう)があり、会社員や公務員なら厚生年金や企業年金、自営業なら国民年金基金など追加の年金制度も利用できる。

無職になった場合、厚生年金の加入は続けられないので国民年金に切り替わる。 国民年金の保険料は年齢や収入にかかわらず全国民一律の額を支払うしくみになっており、令和7年(2025年)の場合1ヶ月17,510円を支払う。 つまり1年間で21万120円の支払いが必要になる。

支払いには払込書による振込か、銀行口座振替のどちらかが利用できる。

ちなみに毎月の保険料はその翌月の月末までに払うことがルールとなっており、滞納すると1週間に1回のペースで電話が鳴り、家のポストに督促状が投函される。 そして滞納が続くと最終的には差し押さえを受けるので、なるべく早期に支払おう。

まとめ

無職になったらあらゆる支払いから解放される!と思うかもしれないが、そんなことはまるでない。 まるでないことを把握してないと思わぬことで金を使いすぎて払い込みに困りかねないし、無職生活の計画が狂うので、どれくらいの金が必要になるのか無職になる前に把握しておこう。

そもそもいきなり無職になるやつは計画性がない?それはその通り……

2025年の振り返り

1年の終わりには振り返るのが定めらしい。というわけで今年を振り返る。 とはいえ、振り返るというのは個人的にはかなり苦手なことの部類に入る。なにせ一昨日やったことすらろくに覚えていないのに、一年の記憶が脳に残ってるわけがないからだ。 まあ、なんとか思い返すことができるだろうか。

なんとなくの振り返り

今年やったことで一番大きかったのは退職して無職になったことだった。 新卒から勤めていた会社を退職したという話はここにも書いている。

akahana-1.hatenablog.jp

他になんかやったことあったっけな……と思い出すと本当に何もでてこない。夏はおるみん党でコミケに出ましたが新刊を久しぶりに落としたし、冬は抽選漏れとなったので、次の夏はなんとかという思いがあります。とはいえ、始めたときとは人々の忙しさが変わっていたりするので出せるかどうかは未知数という。

あとは本当に記憶がない。最近はmastodonにずっといるが、私のいるサーバーの初期設定は1ヶ月するとトゥートが消えるという仕様なので遡りようもない。ということで、本当に何をしたのか思い出せない。

実は無職になったので個人サイトを作ろう!と思ってCloudflare Pagesに諸々を用意してみるなどをやったのはいいものの、Gitリポジトリで画像をついでに管理したくない!という気持ちが高まった結果、更新を止めてしまった。 ヘッドレスな記事管理でも記事を書ける人は本当にすごい。

無職になったということで年金なり税金なり保険なりの支払いが天引きでなく自分の口座からでていくようになり、その額のデカさにビビっているくらい。 あとはひたすらdepressiveな暮らしをしている。そしてひたすら同じゲームをやり続けていた。これが今年のSteamの履歴である。

10年以上前のゲームをひたすらプレイし続ける人間となってしまった。 無職になったら家にある本を読んだり、機器のセットアップをすると思っていたのに現実は朝から晩までぼんやりインターネットを眺めるだけになっている。おしまいだー!!

まあ本当ににっちもさっちも行かなくなる前に医者に行くなりをするべきではあります。問題は本当に国民健康保険の情報がマイナンバーカードに付与されてるのか??というところではあるわけですが。

買ったものの振り返り

俺は何も買ってないぞと勝手に思っていたが、いくつかでかい買い物をしていた。

その1、ソニーのミラーレス一眼α7IV。 3月くらいにキタムラの中古を24万円くらいで買った気がする。年末には後継機のα7Vが出たので買う時期として正しかったのか……?と思ってしまうが、欲しい時に買ったので良し! 買ったときの理由は35mmフィルムをデジタル化するためだったが、結局あんまりデジタイズはしていない。 フィルムに埃がつかないようにするのが面倒で……。 この時ついでにシグマの70mm F2.8 DG MACROを買ったが、これもあんまり使えていない。マクロレンズって使うの難しくね? あと、AマウントからEマウントへの純正マウントアダプタであるLA-EA5も買った。これはα7IVを楽天で買ったことで楽天ポイントが大量に手に入ったので実質タダだった。お陰で古い望遠レンズを持ち出して競馬場に向かったりもした。

その2、ソニーのミラーレス用レンズFE 24-70mm F2.8 II。 9月に買ったソニーの高級ズームレンズ。だいたい30万円。30万もするだけあってとにかく写りが良い。α7IVと組み合わせるととりあえず適当に気になったものにカメラを向けてパシャパシャ撮るというのが気軽にできる。最高のレンズ。 問題はちょっとデカくて重いことなので、これを持ち出すのにちょうどよいカバンが欲しい。

いまのところエレコムのofftocoを使っているが、これを褒める人の気がしれないという気持ちになるほど自分には合っていないカバンなので、ちょうどよいカバンを探す旅に出ている。 https://www.elecom.co.jp/products/DGB-S043BK.html

ただオタクはA4サイズの書類が入り、ついでにカメラも入り、なんかめんどくさい小物が入ってなお使いやすく、バックパックは合ってないとか言い始めるのでそんなカバンが見当たらず難儀している。その昔manfrottoが出していたNXスリングバッグは本当に良かった……。

その3、SHARPの冷蔵庫(179L) 大学入学時に買った110Lサイズの冷蔵庫を使っていたが、さすがに無職になることだし自炊で金を浮かせましょうという気持ちになったので新しい冷蔵庫を買った。 住んでいる家の形状が悪く冷蔵庫スペースが狭いので、なんとか収められる最大サイズの冷蔵庫を探した結果これになった。 ドアの方向が左右付替できるのは極めて便利で、容量も増えたので気に入っている。 ところで冷蔵室の最下段にある野菜ケースに野菜を入れておくと気づいたら野菜が凍っているという設計だけはなんとかならんのかと文句を言いたい。 それ以外は、冷凍庫の容量もデカくなっているし、年始の準備のためにおせちを作って収めるのも余裕でできて最高である。 冷蔵庫の余裕は心の余裕。覚えておきたいです。

最後は買っていないけどデカかった支出として、運転免許のために自動車学校に通い始めた。 南関東の自動車学校は高く、35万円くらい払った。周りのオタクがみんなMT免許を持ってるので調子に乗って旧課程のMT免許を申し込んでみたが、かなり厳しく「本当に人間はこんなものを日頃運転してるのか……?」と思っている。 微速調整も難しければ、ブレーキを合わせに行くのも難しく、60km/h近い速度で走るのは自分で制御できると思えなくて怖い。 こんなので運転免許は本当に取れるんだろうか……?

終わりに

人生で初めて無職で年を越すということになるわけで、来年はどういう年になるのやらと思っています。 とりあえず雇用保険に加入していたのでハローワークに向かい、基本手当をもらいながら運転免許を取りに行くために頑張るぞ!という感じではあるんですが、基本手当をもらうためには求職活動をせねばならずどうすんのこれではあります。

あと、なんだかんだ金は足りそうと思っていたんですが、そういえば賃貸の更新時期がそろそろだったり、調子に乗って高いレンズを買ったりしたことで貯金額がさみしい形になってきており、本当に俺は暮らしていけるのか?という疑問も出てきました。 とはいえ、何かやりたいことが何もできていないという感覚もあるのでなるべく自由な時間を欲しつつ、一方で人と話さずに家にこもって朝から晩までやる気が出ないとかやっていると1年なんてあっという間に過ぎ去ってしまうことがわかったので、できる範囲でもう少し活動的になりたいねというのが来年の目標といえば目標なのかもしれません。 来年末には月給を得られるようになっていると良いですが、果たして?

無職になりました

最終出社日を終えて無職になりました。 正確に言えば有給休暇の消化があるのでまだ1ヶ月くらいは会社に籍が残っていますが。 数えてみると5年半ほど勤務していた格好になり、長かったような短かったようなと感じています。

在籍中には開発環境の構築や支援活動や、クラウドインフラの構築支援みたいなことをやっていました。 一言でまとめるとDevOpsエンジニアと呼ばれるような仕事をしていた形です。 たとえば、

  • Self-hosted CI Runnerの構築と運用
  • 既存プロジェクトのIaC化の支援
  • ソースコードリポジトリの移設作業
  • E2E自動テストツールの導入支援

などを実現するためにAWSGoogle Cloudに対してCloudFormationやTerraformを使ってインスタンスやIAMまわりのリソースを生やしたり、YAMLを書いてKubernetesクラスタでサービスを動かしたり、CIパイプラインの定義を行ったりしていました。

このあとやることは特に決めていないんですが、昨今どこの会社でも行われているであろうハイブリッドワークに対応しようとした結果睡眠がめちゃくちゃになってしまい、まともに寝ていても日中薄ら眠いという状態が続いているのでそれをなんとかする予定です。 学生時代の体力測定で下から数えたほうが早いような体力の人間に通勤は早かったのかもしれません。 とはいえ蓄えにも限りがあり、キャッシュアウトすると死という感じなので、新しい労働を探す活動もぼちぼちやりつつ当面はゆっくりします。 それはそうとして、面白そうな話には興味があるので、なんかDevOpsやっていく人がほしいみたいあんことがあれば声をかけてもらえると嬉しいです。

SamasungのU.2 SSDで遊ぶ

年末から年始にかけて、一部界隈では『例のSSD』という名前でSamsungエンタープライズ向けU.2 SSDが話題になりました。 なんとこのSSD、新品にも関わらず大変安価(2TBで1万円と少し)にもかかわらず、PCIe3.0x4接続によりそこそこの性能が出るというわけでオタクが大挙して購入したわけです。 私も例に漏れず購入し、さすがに家のマシンにU.2コネクタは付いていないのでPCIeに指すための変換アダプタも買いました。噂ではこの変換アダプタもAmazonで在庫切れになったとか。

というわけで、遊びがてらbtrfsでの性能を見てみたいと思います。

検証環境

今回の検証環境はこんな感じ

  • CPU: AMD Ryzen 3 PRO 4350G
  • Mem: DDR-2666 64GB
  • M/B: MSI A520M PRO-C DASH
  • Disk1: 例のSSD with PCIe3.0 x4
  • Disk2: WD Black SN750
  • Linux: 5.4.0-59

今回の計測ではM/BののPEGスロットに対してPCIe->U.2変換ボードを設置して実験しました。PCIe3.0x16の帯域幅を持っているのでU.2デバイスの実験も大丈夫でしょう。

ベンチマークツールとしてはfio 3.16を使います。ベンチマーク用の設定は次のブログ記事を参照しました。

LinuxでもCrystalDiskMarkぽいディスクベンチマークしたい - 動かざることバグの如し

計測結果の単位はすべてMB/sです。

計測の下準備

今回はbtrfsを使うので、デバイスそのものをbtrfsでフォーマットしておきます。

$ fdisk /dev/nvme0n1
# パーティション1を作成
$ mkfs.btrfs /dev/nvme0n1p1

今回の測定ではマウントオプションを

  • -o defaults, ssd
  • -o defaults, ssd, compress=lzo
  • -o defaults, ssd, compress=zstd

の3つで試しました。

計測結果

実際に計測した結果です。それぞれ計測回数は1回だけなので参考程度の数値ということで。

-o defaults, ssd -o defaults, ssd, compress=lzo -o defaults, ssd, compress=zstd
Seq Read [MB/s] 999.595 956.729 903.166
Seq Write [MB/s] 1085.48 1084.36 1082.12
Rand Read(bs=512k) [MB/s] 846.991 809.711 737.395
Rand Write(bs=512k) [MB/s] 1031.05 1059.17 1044.4
Rand Read(bs=4k) [MB/s] 40.267 40.405 37.637
Rand Write(bs=4k) [MB/s] 126.746 126.961 98.034
Rand Read(bs=4k,qd=32) [MB/s] 684.896 680.01 255.812
Rand Write(bs=4k, qd=32) [MB/s] 227.21 219.367 213.515

まあまあだいたいいい感じという気がしますが、公称値ほどの読み込み速度が出ていないのが気になるところ。 それにzstdでのランダム読み込み性能がかなり落ちているのが気になるところです。特にランダム読み込みqd=32での悪化は気になるところですが、他は大差なさそうですね。 zstd:3を選択している影響もあるかもしれません。圧縮率を犠牲にしてzstd:1あたりを指定するともう少し改善しそうな予感がします。*1

参考としてWesternDigital Black SN750のベンチマーク結果を貼っておきます。マウントオプションはdefault, ssd, compress=lzoです。

[2020-01-10 23:55更新]

WD Black SN750
Seq Read [MB/s] 862.315
Seq Write [MB/s] 1521.88
Rand Read(bs=512k) [MB/s] 712.832
Rand Write(bs=512k) [MB/s] 1383.35
Rand Read(bs=4k) [MB/s] 39.253
Rand Write(bs=4k) [MB/s] 116.586
Rand Read(bs=4k,qd=32) [MB/s] 694.881
Rand Write(bs=4k, qd=32) [MB/s] 223.291

書き込み性能に関しても例のSSDとcomparableかちょっとこちらのほうが良いように見えますね。そしてこちらでもシーケンシャル読み込みが1000MB/sを超えていないので、このあたりに何かしらの壁があるように見えます。 手元の環境起因だとは思いますが、この状態だと見当がつかない感じですね。 こうして見ると例のSSDの素性の良さが見えてきます。さすがに書き込みでは公称性能が低いので太刀打ちできませんが読み込み性能はほぼほぼ同等と言えるんじゃないでしょうか。

とりあえずは今のメインディスクと入れ替えて使っていこうと思います。なにせ容量が4倍なので。

YAMAHA RTX1200を使ってJPNEに接続するプロバイダでIPv4 over IPv6を実現する検証[draft]

TL; DR

  • フレッツ契約情報を見つけ出す
  • ZOOT NATIVEの契約をする
  • DS-Liteの設定をする

はじめに

新型コロナウイルス感染症の流行で在宅勤務が一般的になったためかPPPoE接続の速度が終わってきて何のために回線契約しているのかわからなくなってきた今日このごろ、 家にちょっといいルーターがあればIPv4 over IPv6によってプロバイダの網終端装置をバイパスして多少速度を稼ぎたくなるところです。 ところで我が家で契約しているSo-net光は、ある日を境にIPv6のVNEをインターネットマルチフィード(mfeed)から日本ネットワークイネイブラー(JPNE)に変更してしまいました。 これによってIPv4 over IPv6を実現するために利用するトンネリング技術がDS-LiteからMAP-Eに変わったことを意味します。 一方、我が家に存在するYAMAHA RTX1200はMAP-Eに対応していません。 *1

ということで、設備投資をしなければMAP-EによるIPv4 over IPv6が使えないということになりますが、 mfeedを経由するIPv6 IPoEサービスを提供するプロバイダを別途契約することでDS-LiteによるIPv4 over IPv6を実現できないものでしょうか。 そこで今回はインターリンクが提供しているZOOT NATIVEとSo-net光を同時に契約できないか試してみます

予備調査

ZOOT NATIVEがコラボ光との併用をユースケースとして想定しているのか調べてみると、次のヘルプページがヒットします。 光コラボレーション(ドコモ光など)でZOOT NATIVEは利用できますか?

ということで大手を振ってプロバイダを切り替えられることがわかりました。正確に言えば切り替えるわけではなく複数プロバイダと契約する状態になっているわけですが。

事前準備

ZOOT NATIVE申込みのためにはフレッツのお客様IDとアクセスキーが必要です。 so-netの場合は[接続サービスご利用状況]->[ご契約情報の詳細]とたどったページで確認することができます。 この2つの値をメモしておきましょう。 f:id:akahana_1:20200606224745p:plain 次に、v6プラスオプションに加入していないか確認します。もし確認していた場合はその場で解約しておきます。 解約してから実際にVNEからの払い戻しが停止されるまでは1日程度必要なため、もしプロバイダでv6プラス契約をしていた場合はここで少し待つ必要があります。 私の場合は、解約申込みをしてから1日後になぜか再度v6プラスが有効になり、その後すぐにv6プラスが解約されるという謎の現象が発生しました。 v6プラスを有効化していた場合はある程度ゆとりを持ったスケジュールにするのが良いと思われます。

これでso-netとの契約情報から必要なものを抜き出し、事前準備が整いました。

ZOOT NATIVEへの申込みと開通

ZOOT NATIVEに申し込むフォームで先程メモしたフレッツのお客様IDとアクセスキーを利用します。 また、ZOOT NATIVEの申込ではフレッツ光の回線契約タイプの記入が求められます。

契約タイプの特定には回線の最大速度、貸与機器の種別などを見ながらフレッツ光の公式HPのプラント見比べるのが良いでしょう。 私はONUのみの貸与で、GE-PON-ONUが貸与されていたことと集合住宅に居住しているのでフレッツ光ネクストマンション・ギガラインタイプとしました。 あとはフォームに従って手続きを進めていけばZOOT NATIVEの申し込み作業は完了です。

次に、DS-Liteの設定をしますが、これについてはYAMAHAページの記載のとおりに行えば、良いでしょう。 http://www.rtpro.yamaha.co.jp/RT/docs/ipip/index.html#setting9

設定を終えたあとにhttp://ipv6-test.comにアクセスすれば、IPv4アドレスがMF-native6-eとなっているはずです。 これでDS-Lite開通が終了しました。おめでとうございます。

ハマりどころ

DS-Liteの設定をしたあとは一度WANにつながってるインターフェイスを再起動してあげましょう。 再起動しない状態だと、フレッツ網から外に抜けられないIPv6アドレスがルーターに割り当てられたままになっている可能性があります。 下の画像は、so-netのv6プラスオプションを解約して、その後にZOOT NATIVEの契約が通った状態ので私のRTX 1200に広告されていたrouter-prefixのリストです。

f:id:akahana_1:20200606234433p:plain

かなり分かりづらいですが2408:~から始まるアドレスと2409:~から始まるアドレスと240b:~から始まるアドレスの3種類のアドレスが広告されていることがわかります。 この内、2409:から始まるものがmfeedによって広告されているrouter-prefixです。残りのふたつのプレフィックスはなにか。 まず、2408:~から始まるrouter-prefixはフレッツ網内で有効なIPv6アドレスを示します。よって、このアドレスを使ってインターネットに出ていくことはできません。 もう一つの、240b:から始まるrouter-prefixはJPNEから広告されているrouter-prefixですのでJPNEの終端に対して接続することはできますが、mfeedの終端に対して接続することができません。 この状態でIPIPトンネルをmfeedが管理するAFTRに向けて張ろうとすると、張ることはできるものの通信が行えないといった状況が発生します。 おそらく、2409:~以外のアドレスを使ってAFTRと通信しようとしているからです。 これは、v6プラスの割当を受けた後、それを解約してv6契約がない状態からmfeedの割当を受けた時に、それまでにもらっていたrouter-prefixが削除できていないと起こる事象です。 こうなれば、ルーター再起動なりLANインターフェースの再起動を行うことが求められるでしょう。

*1:正確に言えばMAP-Eによるトンネル接続は可能ですが、あっという間にIPマスカレード(NAT)のポートを使い切ってしまうため使えたものではありません

LuaLaTeXで簡単日中混植

この記事はTUT Advent Calendar 2019 13日目の記事です。 Advent Calendarがスカスカだと適当な日付を指定して記事を投げ込めるというのはとてもいいことですね。 よくはないが。 ちなみに 2015年から投稿しているので5年連続です。控えろ控えろ

皆さんはLaTeXを使っていますか? もちろん、理工系の大学に通っているみなさんは、レポートに論文にとLaTeXが大活躍していることと思います。

そんなLaTeX処理系の一つであるLuaLaTeXでは、従来のLaTeX処理系と異なって、フォントファイルの実態を取り扱えるようになっています *1

この事によって、従来のLaTeX文書では考えられなかった、複数のフォントファイルを用いた文章を極めて簡単に作成することができるようになっているので、 今回はその紹介として日本語フォントと中国語(簡体字)フォントの混植を実現する方法を取り上げます。 とても簡単ですよ!

(2019.12.17 追記) 具体的には、日本語文書内で簡体字が必要となった時に、適切な簡体字を出すための方法についてです。 書いているときは、この意味で十分伝わると思いこんでいましたが、あらゆるフォントが簡体字字形になったり、 あるいは簡体字であることが文中で明記されていない場合にも簡体字になるかのような曖昧性を抱えていたので、注記しておきます。

ちなみにこの記事は私も参加しているサークル『おるみん党』の冬のコミックマーケット宣伝のために執筆されています。 ここで言及したテクニックも登場する、おるみん党の機関誌『測点』Vol.2は冬のコミックマーケット(C97)4日目に南リー31bで頒布されます。 読書好きの皆さんに向けた叢書管理ツールEnju Leafを使った書誌情報管理や、Web Assemblyの紹介、中国メーカーから販売されているRISC-Vプロセッサ採用ボードの調査記録などの記事を取り揃えてお待ちしています。 頒布価格は500円。お誕生日席に配置されたので、かなりわかりやすいと思います。皆さん、冬の有明南展示場で会いましょう。

用意するもの

まずTeX Liveなどを使って、LuaTeXをインストールしてください。 今回のテストではTeX Live 2019にバンドルされているLuaTeX v1.11.2を使っています。

LuaTeX上でCJKフォントを扱う手法として、luatexjaチームが開発しているパッケージ群が利用できます。

とりあえず次のようなファイルを用意して、LuaTeXで正しくコンパイルできることを確認しましょう

\documentclass{ltjsarticle}
\usepackage{luatex85, lautexja}
\usepackage{bxjalipsum}

\begin{document}
\jalipsum{kusamakura}
\end{document}

正しくコンパイルできれば草枕の冒頭が書かれたPDFが生成されるはずです。 LuaTeXのコンパイルを初めて行うときは、フォントデータベース生成のためにコンパイルに時間がかかる点に気をつけてください。

フォントを取り扱う

次にシステムにインストールされているフォントを明示的に取り扱ってみます。 TeX Liveをインストールすると日本語標準フォントとしてIPAexフォントがバンドルされているので、 これを指定してPDFファイルを生成してみます。

\documentclass{ltjsarticle}
\usepackage{luatex85, lautexja}
\usepackage[ipaex]{luatexja-preset} % この行を追加
\usepackage{bxjalipsum}

\begin{document}
\jalipsum{kusamakura}
\end{document}

luatexja-presetパッケージによって、一般的なフォントであれば簡単にPDFに埋め込むことができます。

再度文書をコンパイルすれば、IPAexフォントが埋め込まれたPDFが生成されることでしょう。

簡単日中混植

それでは本題の日本語+中国語(簡体字)混植を試してみましょう。 luatexjaパッケージはluatexja-fontspecというパッケージを提供しています。 これはfontspecパッケージ(())をCJK向けに拡張したパッケージで、CJK向けに便利な機能がいくつか追加されています。 中でも便利なのがAltFontと呼ばれるフォント機能で、これを利用することで簡単に複数のフォントを切り替えて使うことができます。 例えば、公式ドキュメントからサンプルを引っ張ってくると

\jfontspec[
    AltFont={
       {Range="4E00-"67EF, Font=KozGoPr6N-Medium} ,
       {Range="6800-"9EFF, FakeBold=4},
       {Range="3040-"306F, Font=KozGoPr6N-Regular}
    }
][KozMinPr6N-Regular]

などとすれば、簡単に混植が実現できます。 この例だと、基本的には小塚明朝 Pr6Nを使いますが、Unicodeの文字範囲U+3040~U+306fでは小塚ゴシック Pr6N Regularを U+4E00からU+67EFの文字範囲では小塚ゴシック Pr6N MediumをU+6800からU+9EFFの文字範囲では小塚明朝を擬似ボールド体にして利用しています。

というわけで、これを真似すれば簡単に日本語と簡体字の混植ができそうです。 詳細について話すまでもなかったですね。というわけにはいかないのが現実です。

CJK統合漢字の罠

では次のようなTeXソースを用意してコンパイルしてみましょう。 ここでは、Windows環境を想定して、簡体字フォントにSimSunを使う例です。 お手持ちの環境に合わせて簡体字フォント部分を入れ替えてください。

\documentclass{ltjsarticle}
\usepackage{luatex85, luatexja}
\usepackage[ipaex]{luatexja-preset}

\begin{document}
{
\jfontspec[
    AltFont={
       {Range="4E00-"9FEF, Font=SimSun}, % Unicode CJK 統合漢字面をすべて簡体字に置き換える
    }
]{IPAexMincho}
简体字とは、中国およびシンガポールにおいて现在正字として采用している。从来よりも简略化した汉字。简化字とも呼ばれる。\footnote{\url{https://dic.nicovideo.jp/a/簡体字}
}
\end{document}

ここでは「简」「现」「采」「从」「汉」の5字が、簡体字字形として表示されることが期待される文字です。 他の文字は、和文字形として表示されていて、この部分だけ簡体字になってくれていれば、目的を達したと言えます。

コンパイルに成功するとブラウザ表示で簡体字になっている部分が、豆腐にならずに正しく簡体字字体で表示されていることがわかるでしょう。 例えばこんな感じです。

f:id:akahana_1:20191215185553j:plain

ところで問題は、簡体字で書かれていない箇所においても、字形が簡体字相当になっている問題です。 これはCJK統合漢字面全体を簡体字字形を利用したフォントに置き換えているからです。 では、簡体字部分だけに置き換え範囲を限定してすればよいというのが直感的ですが、ここに一つ問題があります。 というのも、簡体字が割り当てられているコードポイントは、UnicodeのCJK統合漢字面の上に広くまたがっており、特定の範囲を指定することで解決する問題ではないからです。 このあたりは明らかにUnicodeの不具合では?という気持ちになるのですが、規格として制定されているのであれば仕方がないので、なんとかしてこれを解決しなければなりません。

文字種を限定した解決策

CJK統合漢字面全体にまたがって、簡体字字形のものと和文字形のものが存在しているということは、文字範囲の指定という統一的な枠組みで二つの字形を混植することは難しく、都度都度アノテーションを行っていくしかないという結論になります。 というわけで解決策として取りうる方法の一つは AltFontのRangeキーに対応する値として字形を変更したい対象を列挙する となります。

先ほどの文書であれば

\documentclass{ltjsarticle}
\usepackage{luatex85, luatexja}
\usepackage[ipaex]{luatexja-preset}

\begin{document}
{
\jfontspec[
    AltFont={
       {Range={`简, `现, `从, `汉}, Font=SimSun}, % 簡体字で表示したい字形を列挙する
    }
]{IPAexMincho}
简体字とは、中国およびシンガポールにおいて现在正字として采用している。从来よりも简略化した汉字。简化字とも呼ばれる。\footnote{\url{https://dic.nicovideo.jp/a/簡体字}
}
\end{document}

f:id:akahana_1:20191215185728j:plain

これで簡体字で表示したい漢字のみが簡体字字形で、その他の漢字は和文字形で表示されるようになりました。 このように、和文字形と簡体字あるいは繁体字字形をLuaTeX上で混植させるには、多少気にしなればならないことがあるという紹介でした。

おまけ

ところでSource Han Sans CJKみたいにCJK多言語対応しているフォントを使えばいいのでは?と思われた人はいないでしょうか。 おそらく一番正しい解決法はそれです。 確認するためにluatexja-presetsourcehanオプションを指定して、コンパイルしてみましょう。

\documentclass{ltjsarticle}
\usepackage{luatex85, luatexja}
\usepackage[sourcehan]{luatexja-preset}

\begin{document}
简体字とは、中国およびシンガポールにおいて现在正字として采用している。从来よりも简略化した汉字。简化字とも呼ばれる。\footnote{\url{https://dic.nicovideo.jp/a/簡体字}
\end{document}

思った通りの出力になりましたね。というわけで、和文簡体字で異なるフォントを使いたいという希望がなければ、これが最も簡単な解決法です。

f:id:akahana_1:20191215185808j:plain

というわけで、このように和文中において特定の文字において簡体字を指定せざるを得ない状況が発生したときは

  1. Source Han CJKのような基本字形として和文字形を採用し、その他に簡体字のみの文字コードに対して正しく字形が存在してるフォントを使う
  2. luatexja-fontspecが提供するAltFontオプションを利用して、簡体字文字コード部分を対応する適切なフォントに置き換える

の選択肢を取ることが出来ます。

*1:今までのLaTeXはフォントファイルをそのまま取り扱っていませんでした

卒研を倒すための装備の整え方

タイトルはoverclaimなので話半分に読みましょう。

TL;DR

TeXを使って論文を書いているときに gitを使って管理したり、自動校正を導入したりする方法についてなんとなく話します。 具体的には

  • latexmkを使った自動ビルド
  • 自動校正ツールの使い方
  • gitにとりあえずファイルを放り込む

みたいな話です。

だいたい、このリポジトリの説明。

github.com

まえがき

皆さん!楽しい研究ライフを送っていますか? まあ、楽しいことも楽しくないこともあると思います。 私は死んでます。

さて、研究をしていてもそれで終わりでなくて最終的には何かしらの記録を残す必要があります。 そう、論文です。 論文を書くのは大変ですね。 ところでWordで論文を書いていて体裁がひどいことになったりしていませんか? あるいは、突然論文がすっ飛んでしまったり?

どうせなら、論文を書く環境をあらかじめ整えておきたいですよね。 ここではTeXにターゲットを絞って論文を倒すために考えられることを列挙します。 君も論文をやっていけ。

論文を書き始める前に

論文を書き始める前の設定が論文がうまく書けるかを決めると言っても過言ではないので、先にその話をします。 論文を書くときに予めフォーマットが定まっているのならそのフォーマットを使いましょう。 私が卒論を書いたときはTeXフォーマットが用意されていなかった記憶があり、キレながら適当なフォーマットをでっち上げた記憶があります。 フォーマットをでっち上げる必要がある人はフォントサイズとフォント指定、余白に気をつけましょう。 フォントサイズについては私が過去に書いた記事を読むといろいろわかります

装備を整える

論文を倒すために装備を整えましょう。戦いに出るために武器を持たぬ人間はいない。 同じように我々もこれから論文と戦うのだから、装備をと整えずして他に何をするのかという話になります。

環境設定

倒すも何も、その前にまずは環境設定をする必要があります。 私はLinuxWindowsが動くマシンしか持っておらず、Macではどのように設定するのかよくわかりません。 もしもTeXの環境をインストールしていない人がいる場合はTeX Liveをインストールしておくといいと思います。具体的にはTeX Live - TeX Wikiを参照してください。

ついでに使うエディタも決めてしまいましょう。 いっとき前ならばTeXWorksなりTeXShopなりの統合環境を使うのがデフォルトという感じでしたが、今はElectronベースのエディタを使ってプラグインで環境を整えるのがイケてるんじゃないでしょうか。 この記事ではElectronベースイケイケエディタとしてVisual Studio Codeを前提にします。 他のElectronベースイケイケエディタを使っている人は適宜読み替えてください。 具体的な設定はVisual Studio Code - TeX Wikiを参考にしてください。 LaTeX Workshopはイケてる拡張機能だと思います。普段Visual Studio Codeをあんまり使わないのでイケてる具合があんまり説明できないので、そこは他の人の記事を見てください。

あと、この記事では環境の前提条件をupLaTeXとします。LuaLaTeXとかだといくつか楽になるのかもしれませんが、あんまり詳しくないのでここでは説明しません。

ビルドを自動化する

ちまちまとファイルを書いてからコマンドを叩いて結果を確認したいか? そんなわけはないですね。

Visual Studio Code + LaTeX Workshopを使っていればファイル保存時に自動でビルドが走って嬉しい!!ですね。 LaTeX Workshopだと標準でlatexmkというlatexビルドのための便利ツールキットが使えるので、これを実際に動作するようにすれば、保存時にいい感じにビルドしてくれるはずです。 武器は装備しないと意味がないぜ!

upLaTeX用の一番簡単な設定はこれです。

あとは論文用ディレクトリ直下にlatexmkrcとして突っ込んでおけば、LaTeX Workshopがlatexmkを使ってコンパイルするときに自動参照してくれます。

gitを使って版を管理する

論文を書いているときにどこを書いているかわからなくなったり、あるいはいきなりファイルが失われたりする可能性があるので、事前にバックアップを十分取っておきたいですよね。 セーブスロットを用意して保存できると良い。 とりあえずDropboxみたいなオンラインストレージを使っているなら、Dropboxが管理するディレクトリの中に論文を用意して管理しましょう。

それとミスったときに後戻りできると嬉しいのでgitを使って管理しましょう。 Visual Studio Codeだとgitを直接叩く拡張機能がすでに同梱されているので、あとはgitの実行ファイルが存在していれば楽に使えます。 Visual Studio CodeでGitを利用する (1/3):特集:Visual Studio Code早分かりガイド - @ITなどを読むと具体的にどうすればいいかがわかります。

とりあえず手が一旦止まったらgitメニューを開いて、こんな感じで表示されている[+]マークをクリックしてファイルを登録して適当にメッセージを入力し[✔]をクリックしてセーブするといいです。

あとは適当なオンラインリポジトリサービスにPrivateでリポジトリを用意しておくと、もしものときにネットの向こうにファイルがあって便利です。

gitを使う時はこんな感じのファイルを作って.gitignoreという名前で論文と同じディレクトリに置いておくと、余計なファイルが表示されなくて心が落ち着きます。

怪しげな場所を潰す

文章をガリガリ書いているとなんだか文章がぐんにゃりしてくることがあります。 例えば今のこの文章もだいぶぐんにゃりしています。 こういうことになるのは防ぎたいところですが、それなりに難しいのである程度機械になんとかしてもらいましょう。

世の中には自動校正ツールと呼ばれるものがいくつかあってこれらを使うといい感じに文章の確認ができます。 代表的な自動校正ツールは

  • textlint
  • RedPen

のふたつがあります。 textlintはnodejs製でVisual Studio Code向けにプラグインも用意されていて便利でいいですね。 RedPenはJava製のアプリで別途サーバーを用意して実行するケースで強い気がします。

普段はRedPenを使うようにしています。多人数で原稿を書いてgitリポジトリと連携するときなんかはCIを使ってRedPenを回すほうが楽ちんな気がします。 nodejsと向き合っていける人は、textlintを使うのもいいでしょう。

RedPenだとXMLで設定を書くことができて次のような形でいくつか簡単なルールを設定できます。

<redpen-conf lang="ja" variant="zenkaku2">
  <validators>
    <validator name="SentenceLength">
      <property name="max_len" value="100" />
    </validator>
    <validator name="HankakuKana" />
    <validator name="JapaneseStyle" />
    <validator name="DoubleNegative" />
    <validator name="SectionLevel">
      <property name="max_num" value="3" />
    </validator>
    <validator name="KatakanaEndHyphen" />
    <validator name="GappedSection" />
    <validator name="ListLevel" />
  </validators>
</redpen-conf>

この設定だと

  • 句読点を,.にする
  • 文長を100文字に制限する
  • 半角カナを使わない
  • 文末のスタイルを統一する
  • 二重否定を禁止する
  • 節の最大深さを3までにする(chapter->section->subsectionまで)
  • カタカナ終わりの長音を抑止する
  • 空のセクションを作らない
  • 入れ子の箇条書きの深さ制限をする

といったことが実現できます。

具体的に何が設定できるかはRedPen 1.10 ドキュメントなどを見ると良いでしょう。 実際のエラーメッセージはこんな感じで表示されます。

autobuild-latex.tex:11: ValidationError[JapaneseStyle], 不正な日本語のスタイルを発見しました "あった" at line: それに加えて,各執筆者による原稿をいざ結合してひとつの冊子として組版しようとした時に,誤字・脱字があったり内容にいくらかの誤りが含まれているということになると大変です.
autobuild-latex.tex:15: ValidationError[JapaneseStyle], 不正な日本語のスタイルを発見しました "である" at line: そこで今回は,継続的インテグレーション(CI)サービスであるwerckerを用いてRedPenによる自動校正とupによる自動タイプセットに挑戦しました.
autobuild-latex.tex:77: ValidationError[JapaneseStyle], 不正な日本語のスタイルを発見しました "である" at line: 今回のタイプセットではディストリビューションのひとつであるTeXLiveに同梱されている,upを用います.
autobuild-latex.tex:81: ValidationError[JapaneseStyle], 不正な日本語のスタイルを発見しました "である" at line: ところで,DockerイメージのリポジトリであるDocker Hubを見るとどうやらTexLive2017に対応したDockerイメージは無いようです.
autobuild-latex.tex:138: ValidationError[JapaneseStyle], 不正な日本語のスタイルを発見しました "である" at line: ただし,バージョンによってはSource Han SerifおよびSource Han Sansが使えない可能性があるため,下記のコマンドによってバージョンが1.0以降であることを確認しておきます.

こうやって見るといくつかのエラーは本当にそうなってるのかわからないところがありますが、 最低限ヤバそうな部分を潰すのにこういうのは使えます。 真面目に怪しげな箇所を潰すときは指導教官に相談してください。

終わりに

本当はこれをAdCalの記事にする予定だったんですが、なんとなく記録がてら別の日に投稿することにしました。 実際このワークフローでうまくいったんですか?と聞かれるとなんとも言えないところですが、備えあれば憂いなしということで一つお願いします。 ちなみにDockerHubには私の作ったredpen-cliのDockerイメージとTeXLive + SourceHanFontsのDockerイメージが転がっているので大抵のことをやるときには便利だと思います。