DJBツールのIPv6化

以下のテキストは、執筆時当時の情報を元に書いたものであり、 現在の情勢にそぐわないことを含む場合があるので注意されたい。 また、テキストは最終提出原稿で校正を経る前のものなので、実際にUNIXUSER 本誌に記載されたものとは異なる。誤字脱字等そのままである。

致命的な誤り以外は加筆修正等は行なわないので情報の鮮度に気をつけつつ 利用して欲しい。

目次

註1: 元記事では末尾に、DJBツールのIPv6化の未来と言う題材の文章を 載せたが、これはまったく現状に即していないので削除した。現状 DJBはIPv6に対しては憂慮の見解を持っている。筆者自身も最近では 「IPv6は流行らないんではないか…」と懐疑的になっている。 しかし、IPv6を消滅させるだけのものがすぐに登場するとも思えない点、 djbツール自体の寿命がおそろしく長い点を考慮すると「djbツール+IPv6パッチ」 の組み合わせでIPv6を使うのが最も低コストであるのは疑いの余地がない。

註2: テキスト中IPv6アドレスの逆引きの例があるが、最近の hostコマンドではIPv6アドレスのPTRレコードを、IPv6アドレス表記のまま 求められるようになっている。試してみると良い。


【Part 6 IPv6時代もDJBツールで】

いよいよIPv6時代が見えて来ている。そんなときサーバ管理者として一番気にな
るのが、自分が管理しているものがIPv6に対応できるか、という点だろう。気に
なってIPv6対応情報を探しても、メジャーなBINDやSendmailのものがほとんどで
不安になったDJBツールユーザも多いのではないだろうか。ここでは、DJBツール
のIPv6対応方法を解説しよう。

●はじめに

Part6では、DJBツールのIPv6化に関して解説するが、IPv6そのものの導入方法に
ついては触れない。既にIPv6アドレスを取得しアクセス可能になった後の作業の
みについて解説する。

■
■DJBツールとIPv6化
■

qmailなどは既に十分に認知されたものとなっているが、今回の特集を読んで改
めて導入を考える場合もあるだろう。そんなときに「今さら乗り換えてもこれか
ら先ずっと使えるのかなあ」といった不安感を感じることもある。特に、これか
ら普及するであろうIPv6対応状況について調べても、なかなかqmailに関したも
のは得られず悲観的に感じてしまうかもしれない。しかし心配は不要だ。既に色々
な方の努力でIPv6対応が進んでいて、実際にIPv6環境で使われている。とくに
DJBツールは、もともとモジュールの独立性が高い設計になっていて、ネットワー
クとのインタフェース部分を ucspi-tcp パッケージに集約させているものが多
い。それゆえ ucspi-tcp をIPv6化するだけで多くのネットワークツールがIPv6
で利用できるようになるのもアドバンテージの一つといえよう。

ここでは、Part2〜Part4で紹介した、ucspi-tcp(tcpserver), djbdns, qmail に
ついて、それぞれIPv6化する方法について解説したい。また、ucspi-tcp をIPv6 
化することでそれを利用するpublicfileや、その他tcpserver経由で起動してい
るネットワークデーモンが自動的にIPv6ネットワークでアクセス可能になること
も理解しておくと良いだろう。

■
■ucspi-tcpのIPv6化
■

tcpserverは、それ単体で利用するというよりもむしろ、他のネットワークデー
モンを起動するために利用する。つまり、ucspi-tcpそのものをIPv6化すること
が目的ではなく、それを利用して起動するデーモンをIPv6から利用できることが
目的である。そうした意味では ucspi-tcp 以外のネットワーク待ち受けプログ
ラムのIPv6版を使うという選択肢もある。参考のため他の選択肢として考えられ
るものを挙げておこう。

	* IPv6 対応 inetd(or xinetd)
	* courier-tcpd

BSD系のOSではシステム標準のinetdとそれに組み込まれている
tcp_wrappers(libwrap) がIPv6対応となっているので、それをそのまま利用する
のが作業量的には一番少なくて楽だろう。ただし、inetd経由ではdaemontoolsに
よる、システムの違いを越えた統一的な管理というメリットが得られなくなって
しまう。いっぽうcourier-tcpdは ucspi-tcp に似たシステム【註 い】でネット
ワークデーモン一つにたいし、一つの couriertcpd プログラムを張りつける起
動形態で利用するものである。
---[註 い]------------------------------------------------------------
http://www.courier-mta.org/
http://www.courier-mta.org/couriertcpd.html
----------------------------------------------------------------------
最初からIPv6対応となっている点がありがたい。ただし、起動の書式など
ucspi-tcp とはかなり異なっているので、移行するためには覚えなければいけな
いことがあるだろう。

今回はIPv4での利用環境を大きく変えること無くスムーズに移行できることを主
眼に置いて ucspi-tcp のIPv6パッチを紹介する。

●ucspi-tcp IPv6化パッチ

Felix von Leitner 氏による IPv6 対応パッチが
http://www.fefe.de/ucspi/ にあるのでこれを利用させて頂こう。パッチは
http://www.fefe.de/ucspi/ucspi-tcp-0.88-ipv6.diff10.bz2 または、今月号付
録CD-ROMから入手する。このパッチでは、IPv6対応だけでなく、ucspi-tcp付属
の各コマンドに対するnroff形式のマニュアルも用意されているので、特にIPv6
対応を急がない場合でも、本パッチを当てておいて損は無いだろう。もちろん本
パッチを当ててもIPv4のみの環境下で利用することは可能である。

●ucspi-tcp IPv6化パッチの導入

ucspi-tcp のIPv6対応作業は

	* IPv6パッチの導入
	* アクセス制御ルールファイルのIPv6対応修正
	* tcpserver起動スクリプト(run)の修正

の2段階になる。

・IPv6パッチの導入

Part2で ucspi-tcp をコンパイルした、そのディレクトリでパッチを当てよう。

	# cd ucspi-tcp-0.88
	# bzcat パッチのある場所/ucspi-tcp-0.88-ipv6.diff10.bz2 | patch -p1

もし、ucspi-tcp-0.88 のインストール先をデフォルトから変えたいような場合
は、ucspi-tcp-0.88.tar.gz を展開し、パッチを当ててから conf-* ファイルを
修正しよう。パッチ適用後、

	# make clean
	# make

にて、コンパイルが完了する。

	# make setup check
	# mkdir -p /usr/local/man/man1
	# cp *.1 /usr/local/man/man1
	# mkdir -p /usr/local/man/man5
	# cp *.5 /usr/local/man/man5

で、インストールも完了するが、このとき既に tcpserver を起動している場合
はあらかじめ走行中のバイナリを上書きされないようにしておく必要がある。そ
の場合は

	# cd /usr/local/bin
	# mv tcpserver tcpserver.orig

などとするか、インストール前に走行中のtcpserverを止めておく。
tcpserver が動作中に install した場合

	# make setup check
	./install
	install: fatal: unable to write .../bin/tcpserver: text busy
	*** Error code 111

となるので、このようなエラーが出たら注意すること。なお、この点については、
以下で説明する djbdns, qmail における作業でも同様である。

・アクセス制御ルールファイルのIPv6化

新しく作りなおした tcpserver をIPv6対応ホストで起動する場合にはIPv6用のルー
ルも追加する必要がある。ルール記述の文法はIPv4のときと同じで、

	3ffe:8088:b::1:allow

のようにIPv6アドレスを先頭から書いて、末尾に「 :アクション」 を書くだけ
で良い。もし、アドレスプリフィクスでパターンマッチさせたいときは、

	3ffe:8088:b::allow

と16ビットワード境界をコロン(:)で打ち切ってから、さらに「:アクション」を
記述すれば良い。残念ながら「3ffe:8088:b::/48」のようなプリフィクス長を指
定した表記は利用できない。もっとも、IPv6アドレスの場合もともと広大な空間
を割り当てられるので、ちまちまと複数のサブネットに切って利用する必要性は
ほとんどないと言え、当面これを不便と感ずることは無いだろう。

またIPv6の使い始めでに注意すべき点として、 IPv6 のlocalhostを示す ::1 に
対する許可を与えておくのも忘れないようにしよう。これは、

	::1:allow,RELAYCLIENT=""

などのように書くことになる。

・IPv4-mapped IPv6アドレスについて

IPv6化した tcpserver に -6 オプションを付けて起動すると "Force IPv6
mode" となる。この場合クライアント IPv4 で接続して来たときにセットする環
境変数をすべてIPv6のときと同様にし、クライアントアドレスを "IPv4-mapped
IPv6" アドレス(IPv4射影アドレス)に設定する。IPv4射影アドレスとは IPv6 ホ
ストが、IPv4アドレスしか持たないホストと通信するときに、相手のIPv4アドレ
スを IPv6 アドレスに(内部的に)射影するアドレスで、80ビット連続する0と16
ビット連続する1のあとに続けてIPv4アドレスを記述する。この場合ルールファ
イルのIPv4アドレスは

	::ffff:x.y.z.w (x.y.z.wはIPv4アドレス)

という形式で記述する。たとえば、もともと

	127.0.0.:allow,RELAYCLIENT=""

というエントリであれば、これをIPv4射影アドレス表記に変えて、

	::ffff:127.0.0.:allow,RELAYCLIENT=""

とする。つまり先頭に "::ffff" を付け加えるだけで良い。tcpserver 起動時に
-6 オプションを付けない場合は、これまでと同じ記述のままで良い。

・ルールの更新処理

ルールファイルを書き換えたら、tcprules コマンドを利用してcdb形式に書き換
えよう。これはPart2で解説したものと全く同じ作業となる。


--[コラム IPv4射影アドレス]-------------------------------------------
OSによっては、IPv6のIPv4射影アドレスがデフォルトで使用不可になっているも
のもある。そのような場合は使用許可に変更する必要がある。たとえば現在の
NetBSDではカーネル変数 net.inet6.ip6.bindv6only で挙動を決定する。この値
が1の場合はIPv4射影アドレスは使えない。デフォルトでこれを許可(0)にするに
は、/etc/sysctl.conf に以下の行を追加する。

	net.inet6.ip6.bindv6only=0

コマンドラインからこの値を変更するには、

	# sysctl -w net.inet6.ip6.bindv6only=0

とする。別の方法として、IPv4でListenする tcpserver をもう一つ起動してし
まうという手もある。そうすれば、IPv4で利用していたルールファイルはそのま
までIPv4クライアントを引き受け、もうひとつ別のディレクトリにサービスディ
レクトリをコピーしそちらではIPv6専用のルールを書いて管理することができる。
----------------------------------------------------------------------

・tcpserverの再起動

IPv6パッチを当てた tcpserver を再起動することにより実際にIPv6対応でプロ
グラムが起動する。daemontoolsによってサービス起動管理をしている場合は、
svcで現在動いているサービスを停止してすぐ上げ直せばよい

	# svc -d サービス
	# svc -u サービス

tcp6でサービス利用できるかは ::1 に対して接続してみれば分かるだろう。
たとえば、qmail-smtpdを起動しているのであれば、

	% telnet ::1 25
	  ~~~~~~~~~~~~~
	Trying ::1...
	Connected to ::1.
	Escape character is '^]'.
	220 venus.foo.ymzk.org ESMTP

のような結果が得られるはずである。

●設定のデバッグのTips

慣れないうちは IPv6 アドレスの制御ルールの書き方に苦労するかもしれない。
そのような場合は、tcpserver がデーモン起動する時点の環境変数を観察すると
よい。たとえば、run スクリプト内で

	tcpserver -c40 -xfoo.cdb 0 1234 food

となっていたら、その部分をシェルスクリプトで置き換える。そのシェルスクリ
プトでは、本来のデーモンプログラムを起動する前にそのときの環境変数をファ
イルに保存する。たとえば上記の例、food の代わりに foo.sh を呼ぶように変
更する。

	tcpserver -c40 -xfoo.cdb 0 1234 ./foo.sh

いっぽう、./foo.shでは環境変数をファイルに保存してからfoodaemonを呼ぶよ
うにする。

	--[ ./foo.sh ]---------------------------
	#!/bin/sh
	env > /tmp/foo.env
	exec food "$@"
	-----------------------------------------

これで外部からアクセスしてみて /tmp/foo.env ファイルに保存されている内容
を見れば tcpserver がクライアントをどのように情報化しているかが刻銘にに理
解できるだろう。また、設定のデバッグが終わったら書き換えた run スクリプ
トを元に戻しておくのを忘れずに。

■
■djbdnsのIPv6化
■

IPv4のアドレス空間が32ビットだったのにたいしIPv6は128ビットとなる。DNS管
理でこれが最も影響を及ぼすのが逆引き(PTR)レコードだろうか。IPv4ではひと
つのサイト(サブネット)が割り当てられるアドレス空間は大きいものでも /24
程度なので、ホスト番号 1番〜254番 のアドレスを定義するだけで良い。つまり、
逆引きレコードはに各IPアドレスの最下位の1桁から3桁の数字だけ、

	1	IN	PTR	hoge.foo.ymzk.org.
	2	IN	PTR	buha.foo.ymzk.org.
	   :
	254	IN	PTR	baz.foo.ymzk.org.

のように書けば良い。ところが、IPv6では特に事情が無ければ、128ビットのう
ち下位64ビットをホスト部として利用するので、どんなネットワークでも64ビッ
トの桁幅をもつ番号を登録しなければならない。なおかつ、4ビットごとに区切
る必要があるのでかなりの桁数になる。具体的には、BINDの逆引きゾーンファイ
ルのエントリでは

	1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 IN   PTR  trx.ymzk.org.

のように書かなければならない。慣れて来れば問題ないかもしれないが、最初に
IPv6のネームサーバを立ち上げるときには逆引きゾーンの作成で目がチカチカす
ることになる。このエントリの入力は人間向きでないので、これを解消するツー
ルなどが用意される(あるいは自作する)ことは容易に想像できるが、そもそも逆
引きレコードを順引きレコードから自動生成してくれるdjbdnsを利用すれば、無
駄に眼精疲労を起こさずに済むというものである。

具体例を示すと、trx.ymzk.org ←→ 3ffe:8088:b::1 という双方向のレコード
を登録したければ、

	# ./add-host6 trx.ymzk.org 3ffe:8088:b::1
	# make

とするだけで良い。これで、順引き(AAAA)レコードと、逆引き(PTR)レコードが
両方追加される。BINDのように、二つのゾーンファイルを開く必要もなければ、
目を近づけてゼロとピリオドの個数を数える必要もなく、シリアル番号を変える
必要もなく、苦痛無くIPv6ホストの登録が行なえる。IPv6のホスト管理こそ
djbdnsの良さが実感できるのだ。


●djbdns-1.05 IPv6化パッチ

ucspi-tcpのIPv6パッチと同様 Felix von Leitner 氏による djbdns IPv6パッチ
が公開されている。http://www.fefe.de/dns/ から入手できる。原稿執筆時の最
新パッチは djbdns-1.05-test16 である。これより新しいものが出ていたらそれ
を利用すると良いだろう。

●djbdns-1.05 IPv6化パッチの導入

Part3のときに djbdns-1.05.tar.gz をコピーした作業ディレクトリに移動し、
djbdns-1.05-test16.diff.bz2 のパッチを適用しよう。

	# cd djbdns-1.05
	# bzcat パッチのある場所/djbdns-1.05-test16.diff.bz2 \
		| patch -p1

続いて、コンパイル&インストールしよう。

	# make clean
	# make
	# make setup check

これもdjbdnsが稼動状態にある場合はインストール前に svc -d でサービスを落
としておく必要がある。

●ネームサーバのIPv6化

DNSのIPv6化には、二つの意味がある。ひとつは、IPv6アドレスに関するレコー
ド問合せに答えられるという意味(コンテンツの対応)。もうひとつは、問合せを
IPv6通信で処理できるという意味(トランスポートの対応)である。今回のパッチ
はコンテンツ対応は完全にできており、トランスポート対応は "experimental" 
扱いとなっている。ただし、本記事作成時までに筆者の環境でIPv6のみの環境下
でのトランスポート対応の検証ができなかったので、今回はコンテンツ対応の方
法のみ紹介する。IPv4がまだ主流の現状では、ほとんどのネームサーバの実装が
コンテンツ対応のみであり、将来的にIPv6だけのネットワークになるまでは 
IPv4 トランスポートで運用されていく時期がしばらく続くだろう。

・AAAAレコード と IN6.INT.

djbdns+IPv6パッチでは、RFC1886 にもとづくIPv6 DNS体系に従い、ホスト名に
対するIPv6アドレスを示すためのリソースレコードとしてAAAAを利用し、IPv6ア
ドレスの逆引きレコードが属するドメインとして IP6.INT. を利用する。
RFC2874ではそれに置き換わるものとして、それぞれA6レコード、INT6.ARPA.ド
メインが提示されているが、現状ではそれに即した実装も少なく、INT6.ARPAド
メインを登録しているISPも少ない。将来的に移行が必要になった時点で、
djbdnsも対応して行くだろう。現在は、djbdns+IPv6パッチで実用上全く問題な
い。

・AAAAレコードの登録

ここでは、Part3で紹介した作業が済み、既にIPv4のドメインをtinydnsで運用し
ている段階を想定する。たとえば、DNS管理したいIPv6ネットワークが以下のも
のだと仮定しよう。

	IPv6ネットワークアドレス	3ffe:8088:b:5555::/64
	ドメイン名			foo.ymzk.org
	ネームサーバ			ns.foo.ymzk.org (10.0.2.53)
	サービスディレクトリ		/service/tinydns

すでにこのネームサーバは運用中で、/service/tinydns/root にdataファイルが
存在するものとしよう。この場合、IPv6ホストを追加するには add-host6 コマ
ンドを利用する。

	# cd /service/tinydns/root
	# ./add-host6 v6gate.foo.ymzk.org 3ffe:8088:b:5555::1

これにより、dataファイルに以下のレコードが追加される。

	6v6gate.foo.ymzk.org:3ffe8088000b55550000000000000001:86400

add-host6 コマンドは以下の書式で利用する。

    ./add-host6  

これにより、data ファイルに実際に追加されるエントリは

	6::86400

となるは、上記の例で出てきたように、IPv6アドレスを16進表
記で全ての桁を省略せずに32桁で書いたものである。「6」で始まるエントリは
厳密には

  	6::::
  
という形式で、のAAAAレコードとしてに対応するIPv6ア
ドレスを生成し、またそのIPv6アドレスの逆引きレコードとしてを生成す
る。

また、djbdns+IPv6パッチでは add-alias6 コマンドも用意されている。これは、
add-aliasコマンドのIPv6版で、逆引きレコードを生成しないエントリを追加す
る。

	./add-alias6  

とするとdataファイルには

	3::86400

が追加される。「3」で始まるエントリは逆引きレコードを生成しない点を除い
て「6」と同じである。

・逆引きゾーンの設定

IPv6アドレスを上位ネットワークから配給され、そのDNS逆引きドメインの委譲
を受けた場合の設定をdjbdnsで行なう場合は以下の手順による。まず、委譲を受
けるドメインのネームサーバエントリを追加する。今回の例の場合委譲を受ける
のは 3ffe:8088:b:5555::/64 なので、この逆引きゾーンは

	5.5.5.5.b.0.0.0.8.8.0.8.e.f.f.3.ip6.int

となる。ネームサーバとして ns.foo.ymzk.org(10.0.2.53)を追加する場合は次
のようにする。

	# ./add-ns 5.5.5.5.b.0.0.0.8.8.0.8.e.f.f.3.ip6.int \
		10.0.2.53

これによりdataファイルに追加されるエントリは

	.5.5.5.5.b.0.0.0.8.8.0.8.e.f.f.3.ip6.int:10.0.2.53:a:259200

である。ネームサーバの名前を a 以外にしたい場合は次のように修正すると良
いだろう。

	.5.5.5.5.b.0.0.0.8.8.0.8.e.f.f.3.ip6.int::ns.foo.ymzk.org:259200

ちなみにここで追加されるピリオド(.)のレコードは、IPv6非対応時のものと全
く同じ意味合いであるので、詳細はPart3を参照して欲しい。

逆引きのネームサーバレコード追加後、tinydns-data でcdb形式に変換すると、
逆引きの問合せが利用できるようになる。

・IPv6アドレス逆引きの確認

既に上位ネットワークからの逆引きゾーン権限委譲が完了していれば、すぐに
IPv6アドレスの逆引きが可能となるはずである。この確認作業の例を示そう。今
回の例では、権限委譲を受ける逆引きゾーンが 

	5.5.5.5.b.0.0.0.8.8.0.8.e.f.f.3.ip6.int

なので、まずこのゾーンのNSレコードを確認する。

	% host -t ns 5.5.5.5.b.0.0.0.8.8.0.8.e.f.f.3.ip6.int.
	  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	5.5.5.5.b.0.0.0.8.8.0.8.e.f.f.3.ip6.int name server ns.foo.ymzk.org

のように引ければ権限委譲ができている。続いてIPv6ホストの逆引きを試みる。
今回の作業例で登録した v6gate.foo.ymzk.org 3ffe:8088:b:5555::1 の逆引き
は、次のようなコマンドラインで行なう。

% host -t ptr 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.5.5.5.5.b.0.0.0.8.8.0.8.e.f.f.3.ip6.int

(改行まーくで折り返している)

domain name pointer レコードが表示されれば、このネームサーバでのIPv6ホス
ト逆引きレコードの登録も正しく行なえていることが分かる。上記のコマンドラ
イン例でも分かるように、IPv6ホストの逆引きのための名前を指定するのは非常
に長くて入力が大変である。筆者はこの労力を軽減するためIPv6のアドレス表記
から逆引き用の ip6.int ゾーン内の名前に変換するスクリプトを作成して利用
している。興味のある場合は http://www.gentei.org/~yuuji/software/rev6 を
利用してみて頂きたい。


■
■qmailのIPv6化
■

インターネットを代表する花形サービスと言えば、やはりWebとMailだろう。
IPv6時代を迎えるにあたってqmailもIPv6化しておこう。とはいっても、実のと
ころIPv6トランスポートでメイル配送できるメイルサーバは現状ではほとんど無
い。外部からメイルを送ってもらうことを考えるとIPv6対応する意義は(DNSサー
ビスなどに比べると)薄いかもしれないが、「IPv6対応しています!」というアピー
ルのためにはMTAのIPv6化が有効だろう。qmailのIPv6対応は特に簡単で、IPv6対
応化パッチを適用するだけでよいので、今すぐにでもやっておこう。

●qmail-1.03 IPv6化パッチ

qmailのIPv6化については、Felix von Leitner 氏によるパッチも存在するが、
IPv6化以外にもあまりに多くの修正点が含まれる【註 ろ】のと、筆者自身が利
用しておらず稼動実績を検証していないことにより、
---[註 ろ]------------------------------------------------------------
qmailを含むDJBツールは必要以上のパッチを当てる(機能を盛り込む)べきではな
いというのが個人的見解でもある。
----------------------------------------------------------------------
今回は Fujiwara, Kazunori 氏【註 は】によるIPv6パッチを紹介しよう。
---[註 は]------------------------------------------------------------
http://pyon.org/fujiwara/
----------------------------------------------------------------------

●qmail-1.03 IPv6化パッチの導入

Fujiwara氏によるqmail IPv6パッチは
http://pyon.org/fujiwara/qmail-1.03-v6-20001010.diff で入手できる。これ
を qmail-1.03 のソースディレクトリで適用しよう。

	# cd qmail-1.03
	# patch -p1 < パッチの場所/qmail-1.03-v6-20001010.diff

パッチ適用が成功したら、念のためオブジェクトファイルを消去してからmakeする。

	# make clean
	# make
	# make setup check

これもインストール前には動作中のqmailを止めておく方が良いだろう。

●qmail-1.03+IPv6化パッチでの運用

実はこのパッチ適用後、IPv6に関することを特に意識する必要は無いと言っても
過言ではない。強いて挙げれば IPv6 アドレスを持つクライアントからのSMTP接
続を受けるために qmail-smptd を起動する部分だけは意識する必要があるが、
それはIPv6化した tcpserver の導入作業によりほぼ全て完了していると言って
良い。IPv6化したqmailでは、管理者の目に見えないところで立派にIPv6ネット
ワークへのSMTP接続をしてくれる。「IPv6オンリー」のメイルドメインにメイル
送信する日が来るのを首を長くして待つのみである。


【謝辞】
今回の特集記事執筆にあたり多大な協力を頂いた馬渡亮太氏に感謝致します。


yuuji@gentei.org
Fingerprint16 = FF F9 FF CC E0 FE 5C F7 19 97 28 24 EC 5D 39 BA
HIROSE Yuuji - ASTROLOGY / BIKE / EPO / GUEST BOOK / YaTeX [Tweet]