ヘクトのメモ

なんとなくいろいろ書いていくと思います.

競プロにおけるライブラリ管理

修論もひと段落して、ICPCも引退となったので、自分が用いているライブラリ管理方法について書きます。

スニペット

昔はライブラリ用のディレクトリにソースファイルを放り込んで、必要になったら参照していました。しかし、ファイルを探すのに時間が多少かかり、この時間がコンテスト順位に影響が出始めたことを実感したため、スニペットを用意することにしました。私はSublime text を使っているので、適切なディレクトリに適切なフォーマットの *.sublime-snippet を配置すればスニペットを使えます。*1
しかし、このままだとライブラリ本体のソースコードを修正したときに、スニペットのコードも修正しないといけません。あまりに面倒なので、[A-Z]+.cpp からファイル名をトリガーとした *.sublime-snippetを生成するスクリプトpythonで書きました。src_dirにソースファイルを管理しているディレクトリを、dest_dirにスニペットを管理しているディレクトリを指定します。

#!/usr/bin/env python
import os
import glob

def cpp2_snippet(filename,src_dir,dest_dir):

	file_input=open(src_dir,'r')
	file_output=open(dest_dir+filename+'.sublime-snippet','w')

	file_output.write('<snippet>\n')
	file_output.write('	<content><![CDATA[\n')


	for line in file_input:
		file_output.write(line.replace('$','\$'))

	file_output.write(']]></content>\n')
	file_output.write('<tabTrigger>'+filename+'</tabTrigger>\n')
	file_output.write('<scope>source.c++</scope>\n')
	file_output.write('</snippet>\n')


if __name__ == '__main__':
	src_dir='./src/'
	dest_dir='./snippet/'

	for root, dirs, files in os.walk(src_dir):
		for file in files:
			[filename,extention]=file.split('.')
			full_path=os.path.join(root,file)
			if filename.isupper() and extention == 'cpp':
				print(full_path)
				cpp2_snippet(filename,full_path,dest_dir)

ライブラリpdfの生成

ICPCでは紙ライブラリの持ち込みが許されています。ライブラリpdfを作成する際に、自分が知る限りTexを使うチームが多いと思います。ソースコードを挿入するために、listings.sty を利用するチームが多いですが、自分のチームではPygments*2と呼ばれるシンタックスハイライターを利用した minted.styを利用していました。主な理由として、syntex highlight されたコードをタイプする方が効率よく、バグも見つけやすいという判断からです。mintedの使い方は次のサイトを参考にしました。
muscle-keisuke.hatenablog.com
ちなみに、ABCの解説*3に載せてあるコードもminted.sty を利用して挿入しています。

最後に

自分が試しているライブラリ管理方法をかなり簡単に紹介しました。minted.sty によるシンタックスハイライトは、ライブラリ写経の効率が上がるので、オススメだと思います。ライブラリのテストの自動化をやり残しているので、整理したいなぁと思います...