VS Codeを使った私のTeX執筆環境
卒論、修論、レポートに追われている皆さん、こんにちは。
初めてTeXを使っている人もそうでない方も、TeXの執筆環境の構築は迷うところではないでしょうか。
私は7,8年ほどTeXを使用しており執筆環境は毎年試行錯誤してきましたが、 昨年から採用したVS Codeを中心とした執筆環境が中々良さげなのでまとめようと思います。
私の必要要件
- 複数環境で同じように使える
- 強力な使い慣れたエディタで書ける
- 元々開発、執筆エディタを統一するようにしていた。数年前からVS Codeをメインで使うようになり、移行したかった
- TeXworksちょっとつらい
- 自前スタイルファイルを使わない
一言で言うと
VS Codeのスニペットと二つの拡張機能をごりごり使います
VSCodeとは
VS Code(Visual Studio Code)とはMicrosoftが開発したフリーの高機能エディタで、Windows、macOS、Linux上で動作します。
この手のエディタとしては後発(Sublime TextとかAtomとかが先)ですが、 高機能、比較的軽量、本体も拡張機能も開発が活発とあり、かなり使用者が増えている印象です。
環境構築
TeX インストール
TeXLiveを入れましょう。TeX Wikiに全て書いてあります。 texwiki.texjp.org
使用するOSに合わせたページを見ながらインストールしてください。
VS Code インストール
インストーラを落としてから入れましょう。従うだけです。簡単。
拡張機能 インストール
VS Codeを起動し、拡張機能を入れていきます。 Extensionタブに拡張機能名を入れると出てきます。
Settings Sync
GithubのGistを介して、異なるPC間で設定を全て同期する拡張機能です。 設定ファイルから、スニペット、キーバインド、インストール済みの拡張機能などおおよそ同期できます。 複数の環境でVS Codeを使用する場合は必須とも言えるのではないでしょうか。 使用する環境が一つしかない場合は必要ありません。
READMEの記述通りにセットアップするとすぐ使用できます。 詳しい使用方法は別記事に譲ります。
LaTeX Workshop
かなり強力なLaTeX用拡張機能です。 頻繁にアップデートを重ねており、有名所ではSublime TextのLaTeXToolsにも匹敵する機能を持ちつつあります。 例えば
といった基本的なところから、
- bibファイルの文献タグ、labelなどの補完
- 数式部分をホバーするとプレビュー表示
などといった機能も搭載しています。
こちらは拡張機能タブから検索、インストールすることですぐに使用できます。
VS Code 設定
LaTeX Workshop
この拡張機能で設定可能な項目は大量にあるのですが、ここではビルドコマンドの設定をしてきます。
LaTeX Workshopではビルドの設定を「tools」と「recipes」に分けて行います。 役割は以下のように分けられます。
- tools:ターミナルに打ち込むものと同じコマンドと引数を書く
- recipes:toolsに書いたコマンドを組み合わせて、実行するビルドセットを構築する
これらはそれぞれ複数記入可能です。 つまり、例えばtoolsにplatexのコマンドとdvipdfmxのコマンドを書いておき、recipedでこれらを組み合わせたセットを作ればplatexでビルドができます。
とありますが皆さんはもちろんlatexmk使いますよね? というわけで私の使っているLaTeX Workshopの設定はこんな感じです。
"latex-workshop.latex.recipes": [{ "name": "latexmk", "tools": ["latexmk"] }], "latex-workshop.latex.tools": [{ "name": "latexmk", "command": "latexmk", "args": [ "-e", "$latex=q/platex -synctex=1 -halt-on-error/", "-e", "$bibtex=q/pbibtex/", "-e", "$biber=q/biber --bblencoding=utf8 -u -U --output_safechars/", "-e", "$dvipdf=q/dvipdfmx %O -o %D %S/", "-e", "$makeindex=q/mendex %O -o %D %S/", "%DOC%" ] }],
こんなコマンドなってねえよっていう方は適宜変えてください。 あと教えてください。
スニペット
LaTeX Workshopにもスニペットはある程度用意されているのですが、 さらによく使うものを登録しています。 例えば表は
"Table": { "prefix": "table", "body": [ "\\begin{table}[${1:t}]", "\\centering\\caption{$2}\\label{tabl:$3}", "\\begin{tabular}{$4}\\hline", "$5", "\\end{tabular}\\end{table}" ], "description": "set table" }
横並びの図は、まず"mfigure"と名付けたスニペットを展開して
"Multi fig": { "prefix": "mfigure", "body": [ "\\begin{figure}[${1:tbp}]", "${4:figureitem}", "\\caption{$2}\\label{fig:$3}\\end{figure}" ], "description": "set multi fig. Please use 'mfigitem'" }
figureitemのところに"figureitem"を展開するようにしました。
"Multi fig item": { "prefix": "figureitem", "body": [ "\\begin{minipage}[t]{${1:size}\\hsize}\\centering", "\\includegraphics[${2:width=\\linewidth}]{$3}", "\\subcaption{$4}\\end{minipage}" ], "description": "set multi fig item" }
また、よく使う書き出し部分も登録しています。
"TeX templete": { "prefix": "templete", "body": [ "\\documentclass[a4j, dvipdfmx]{jsarticle}\n", "\\usepackage[dvipdfmx]{graphicx}", "% \\usepackage[dvipdfmx, draft]{graphicx} % Output only frame of figure", "\\usepackage{amsmath, amssymb} % Extend math", "\\usepackage{float} % Improved interface for floating objects", "\\usepackage{multirow} % Create complex table", "\\usepackage{url} % Display URL", "\\usepackage{subcaption} % Use subcaption", "\\usepackage{tabularx} % Newline in table cell\n", "\\begin{document}", "$1", "\\end{document}" ], "description": "documentclass and packages" }
まとめ
以上、いかがでしたでしょうか。
簡単ではありますが、それなりに強力、高速、便利な執筆環境が出来たのではないかと思います。 この記事をご覧になった皆さんの参考になりましたら嬉しいです。
付録
今私が使っているVS Codeのlatexスニペットを公開します。
スニペットから\refを参照すると補完が効かないのが今唯一上手く行ってない部分です。
2018年12月 iPhone SEをバッテリー交換に出したらえらい目にあった
2018年末までiPhoneのバッテリー交換費用が安かったので交換に出したのですが、なかなかの長期戦になりました。
ここまでになると思わなかったのでスクショとか全然撮ってないのですが、経緯などをまとめようと思います。
経緯
2018.11.26
バッテリー交換に出そうと思い立つ。 交換手段は、近くの交換可能な場所を予約して持ち込み交換してもらうか、宅配業者経由でiPhoneを送る(通常5〜9営業日)かのどちらからしい。 Appleのサイトから近くの交換可能な場所で交換出来るか調べるも、表示される三日分の予定は全て埋まってる。
2018.11.29
何日か粘ってみたが予定が空く気配がない。 サポートに電話してみると、サポートの方で見れる一週間分の予定も全て埋まってるらしい。 Apple サポートのアプリを入れると一週間前から予約出来るとのこと。 とりあえずアプリを入れる。
2018.12.6
何日か使って予定が更新される時間を把握し、さらに何日か粘る。 どう考えても更新された瞬間に埋まってる。 これは不可能だと悟り、宅配での交換を決意。
2018.12.16
ちょっとドタバタしていたので10日経過。配送修理を予約し、バックアップ等を済ます。クロネコヤマトにiPhoneを引き取ってもらう。
〜半月経過〜
2019.1.1
あけましておめでとうございます。 iPhoneは一向に受理されず、サポートページで進捗を確認しても「宅配業者が引き取りに向かっています」から変化せず。 すでに工場に着いていることはクロネコヤマトの追跡番号から確認済み。 駆け込みバッテリー交換勢で工場が大変なことになってることを察する。
〜半月経過〜
2019.1.18
Appleから工場に到着したとのメールが届く。 送ってから一ヶ月と二日が経過。お疲れ様です。
2019.1.20
「修理情報の更新をお願いします」というメールが届く。 なんだなんだと思ってリンクを開くと
水没のあとが見つかりました。3万払って修理するかそのまま返送するか選んでください
とのこと。 確かに一度水没させてジップロック+乾燥剤+米で直したが、まさかここで言われるとは。 バッテリーだけ交換するという選択肢はない。 すでに3年弱使ったiPhone SEに3万を払う気にはなれず、返送を選択。
2019.1.25
クロネコヤマトでiPhoneが戻ってくる。送ってからちょうど40日経過。
意外と大丈夫だったことと困ったこと
40日手元にiPhoneがなかった上に何も変化なしという結果になりました。マジか。 ですがこの40日間は意外となんとか過ごせました。
前提
iPad mini 4 (Cellularモデル)を持っていたので、これをメインに使っていました。
意外と大丈夫だったこと
- SNS
- iPad mini、PCで代用。持ち運び、LINEの確認は(特に出先では)ちょっとめんどくさかったが、まあ問題なし。
- 通話
- 元々電話が来ないので問題なし。一応LINE等の通話はPCでも使える。
困ったこと
- タブレット、PCだとLINEがトーク以外使えない
- LINE Payやスケジュール機能、アンケート機能、スタンプ購入など、スマホでしか使えない機能が結構あった。事情により特にスケジュール機能使えないのが大打撃。
- 二段階認証が使えない
- これは場合によっては危なかった……iPad miniにデータを引き継いだわけではなかったので、SMSや認証アプリが使えず。
まとめ
いかがでしたでしょうか。 40日間の長期戦でしたが、タブレット端末のみでなんとかなるもんですね。
今後こういうことがあれば早めに行動しましょう。
作ったPython製パッケージをPyPIに登録する手順(2018年1月版)
以前の記事で作成したスクリプトをPyPIに登録したのですがちょっと詰まったので、2018年1月時点でのPyPI登録手順をまとめました。
まず
testpypi でPyPI登録を試すことが出来ますが、ここでは行いません。
フォルダ構成
前回記事で紹介したフォルダ構成はこんな感じです。
plotlog/ plotlog/ __init__.py main.py datacut.py .... test/ example/ README setup.py
最初main.pyをplotlog.pyとしていたのですが、他のクラスのimport時にエラーが出て詰まっていました。
登録手順
PyPIに登録
次のページから登録します。
User Registration : Python Package Index
~/.pypirc記述
これをすることでPyPIにアップする際パスワードを毎回打ち込む必要がなくなります。
[distutils] index-servers = pypi [pypi] username: "Your user name" password: "Your password"
PCに平文で保存されるので注意してください。
setup.pyの作成
他記事に色々上がっているので省略します。
sdist作成
PyPIにアップするための圧縮ファイルを作成します。
python setup.py sdist
確認
次のコマンドで先程作成した圧縮ファイルからインストールが出来ます。 ここで挙動を確認してください。
また、新しく仮想環境を作ってから確認することをおすすめします。 Python3.3以降で公式にvenvが追加されたので、ここではこれを使います。
python -m venv check source check/bin/activate pip install dist/.....tar.gz
wheel作成
あったほうがいいらしいのでwheelを作成します。
pip install wheel python setup.py bdist_wheel
アップロード
PyPIにアップロードします。 現在はregistarを行う必要はないそうです。
pip install twine twine upload dist/*
まとめ
以上です。
他記事も色々あるのですが、ありすぎて混乱したので一旦まとめてみました。 参考になったら嬉しいです。
まとめてグラフを描画するPythonスクリプトplotlogを作った
以前の記事で「テスト駆動開発」を読んだ記事を書きました。
実際に使ってみようと思い、前から作ろうと思っていた(というよりは以前作っていたけど色々拡張したいと思っていた)グラフ描画スクリプトを作りました。 この記事では、前半に作ったスクリプトの説明を、後半にTDDを使ってみた感想を書きたいと思います。
plotlogとは
概要
csv形式等で保存されたログファイルから、yamlファイルに記述した設定に従ってグラフを出力するスクリプトです。 単一のログファイルからはもちろん、ログファイル名を日時で管理している場合は、オプションを指定することで簡単に描画対象ログファイルを複数指定できます。 また、subplotにも対応しています。 大量に同一フォーマットのログファイルを持ち、同じ見た目のグラフを複数作成したい場合に便利なスクリプトです。
リポジトリ
Githubで公開しています。
動作環境,インストール
Python3.6.3で動作確認しました。 3.4以上なら動くんじゃないかと思いますが確認していません。
PyPIに登録してみたので、pipを使ってインストール出来ます。
pip3 install plotlog
ローカルでビルドする場合は
git clone https://github.com/s-naoya/plotlog.git
cd plotlog
python3 setup.py install
で出来ると思います。
次のパッケージに依存しています。
- matplotlib(グラフ描画)
- pandas(ログファイル読み込み、読み込みデータ整形)
- PyYAML(設定ファイル読み込み)
使い方
まず、次のコマンドでカレントディレクトリにuser.ymlが生成されます。
plotlog --copy
生成されたuser.ymlを編集して作成したいグラフなどを指定します。 最初に生成されたuser.ymlの内容は毎回読み込まれるので、指定したい内容が最初のuser.ymlと同じ場合、その項目を削除しても大丈夫です。 変更された設定項目のみ上書きされます。
設定が終了したら、グラフを描画します。
plotlog
と指定すると、まだ描画されていないログファイル(=graph_save_dir
内に、対応するフォルダがないログファイル)について、user.ymlの設定に従ってグラフを描画し、ファイルを保存します。
例えば2018年1月1日以降のグラフを描画したい場合は
plotlog --after 180101000000
2018年1月3日14時00分30秒と2018年1月3日14時10分25秒のグラフをuser-1.ymlに従って描画したい場合は
plotlog --select 180103140030 180103141025 --setting user-1.yml
みたいな感じです。何も指定しなかったら--new
とした時と同じ動作をします。
graph_save_dir
内のフォルダ構成は下のようになります。
graph_save_dir/ 日付/ 日時/ グラフファイル 日時/ グラフファイル 日付/ 日時/ グラフファイル other/ 日時以外のログファイル名/ グラフファイル
正しくフォルダ分けするためにはlog_date_type
の適切な設定が必要です。
ログファイルの方はput_log_dir
内にそのまま入れれば大丈夫です。
描画オプションは--slice
と--noshift
の二つを用意しています。
--slice BEGIN END
では、X軸の値の始めと終わりを指定すると、その部分のみ切り出されたグラフが描画されます。
設定ファイルのxlim
でも同じことが出来ますが、これを使うと--slice
を使わなかったグラフと別ファイルとして保存されます。
BEGIN
とEND
の値を変えるとさらに別ファイルとして保存されます。
--noshift
は、グラフの描画始めのシフトをしない、というオプションです。
plotlogでは、グラフの描画始めを指定した列(shift_trig_col
)の値が指定した値の範囲(shift_trig_val
)を超えた時を0とする、という機能がデフォルトでついています。
つまり、これ(--noshift付き)が trigグラフをトリガーとした場合、こうなります。
とはいっても、shift_trig_col
のデフォルトは0、つまり殆どの場合グラフのX軸となる列なので作動することはありません。
使いたい場合のみ設定を記述してください。
今後の予定
グラフ種類の追加
現在折れ線グラフ(matplotlib で言うplot)しか対応していません。 棒グラフや散布図なども指定できるようにする予定です。
設定項目の整理
ちょっと無駄があるかなと思うので、少しいじる予定です。 ここまで出来たら正式版として更新します。
フットプリント描画機能の追加
フットプリントの描画機能を作成する予定です。 この場合のフットプリントとは足跡、並びに足の支持領域を指します。 私が行っているヒューマノイドロボットの研究に使用します。 つまりはただの自分用機能です。 使わない人のほうが多いと思うので、独自機能実装の例として見てくれると嬉しいです。
TDDでやってみた感想
良かった点
やはりテストが通ったまま実装に取り掛かれるのは非常に安心感がありました。 他人への引き継ぎ、仕様変更等に強いと感じました。
悪かった点
ロジックに関わる部分には強いですが、描画に関わる部分に対するテストの書き方がわかりませんでした。 plotlog で言うところの PlotGraph クラスです。 これらのテストが通ればちゃんと描画されてるはず、というのをテストに書けばいいんでしょうか。 出たグラフを目で確認した方が確実だと判断したので、ここに関してはほとんどテストを書きませんでした。
反省
私は今までテストを書いたことがなく(すいません……)、テストの書き方に全く慣れないままやったのが悪かったのか、実装スピードがかなり低下してしまいました。
単純な実力不足で重複を放置したままの箇所も……
まだまだ勉強が足りないですね。
まとめ
グラフ描画スクリプトとしては中々便利なものが出来たんじゃないでしょうか。 ロジック部分に関してはTDDの強力な面を体感できました。
ただプログラムとしては「きれいなコード」とは言い切れないものになってしまったので、これから慣れていこうと思います。
コメント、指摘等ありましたら是非どうぞ。
Eigen::Quaternionの挙動を整理する
Quaternionの理解・調査を兼ねて、Eigen::Quaternionの挙動を整理しました。
Eigenとは
Eigenとは、C++用の行列計算ライブラリです。 ヘッダファイルのみで構成されているためインストールが簡単、 軽量、高速といった利点があります。
大まかな使い方については以下の記事が詳しいです。
Robotics/Eigen - NAIST::OnlineText
でらうま倶楽部 : Eigen - C++で使える線形代数ライブラリ
Quaternionとは
Quaternion(四元数)とは、1つの実数と3つの虚数から構成されたものです。 直感的には扱いにくいですが、 回転行列やEuler角と同様に3次元の回転を表すことができます。 特異点がないこと、合成や補間が容易で高速なこと等からよく用いられています。
Eigen::Quaternion
注意
以下のコード例は独自関数等を略しています。 一番下に検証用プログラムを載せているので、気になる方はそちらもお願いします。
定義方法
#include <Eigen/Geometry> typedef Eigen::Vector3d Vector3; typedef Eigen::Matrix3d Matrix3; typedef Eigen::Quaterniond Quat; typedef Eigen::AngleAxisd AngleAxisd; // 直接指定 Quat q1(1.0, 0.0, 0.25, 0.5); // 角度(ラジアン)とベクトルを渡す = Euler角 Quat q2(AngleAxisd(1, Vector3::UnitX()) // roll * AngleAxisd(0, Vector3::UnitY()) // pitch * AngleAxisd(0, Vector3::UnitZ())); // yaw // 2つのベクトルの間の角度を求める Quat q3 = Quat::FromTwoVectors(Vector3::UnitX(), Vector3::UnitZ()); // 単位クオータニオン(実数が1で虚数が0) Quat q4 = Quat::Identity(); // 回転行列から変換 Quat q5(Matrix3::Identity());
回転角の合成
クォータニオンによる回転角を合成するためには、 クォータニオンの外積を求めればよい。
// これ以降Quaternionの初期値はEuler角を用いて指定 Quat q1 = rpy2q(deg2rad(30.0, 0.0, 0.0)); Quat q2 = rpy2q(deg2rad(20.0, 0.0, 0.0)); Quat q3 = q1 * q2; // (50, 0, 0) [deg]
逆クォータニオンと共役クォータニオン
Quat q1 = rpy2q(deg2rad(10.0, 30.0, -50.0)); Quat q1_inv = q1.inverse(); // (17.2967, -26.7137, 51.4507) [deg] Quat q1q = q1 * q1_inv; // zero
共役クォータニオン
Quat q2 = rpy2q(deg2rad(10.0, 30.0, -50.0)); Quat q2_inv = q1.conjugate(); // (17.2967, -26.7137, 51.4507) [deg] Quat q2q = q2 * q2_inv; // zero
クォータニオンが正規化されている時、 逆クォータニオンと共役クォータニオンは等しい。
// 正規化
q1.normalize()
Quat q3 = q2.normalized()
三次元ベクトルの回転
ベクトルを原点を中心に回転させる時
Vector3 v1(1, 0, 0); Quat q1 = rpy2q(deg2rad(0.0, 90.0, 0.0)); Vector3 v2 = q1 * v1;
ベクトルを原点を中心に回転させる時
Vector3 v3(1, 0, 0); Quat q2 = rpy2q(deg2rad(0.0, 90.0, 0.0)); Vector3 v4 = q2.conjugate() * v3;
検証プログラム
動作するきれいなコード 新訳版「テスト駆動開発」
和田卓人さんによる新訳版の「テスト駆動開発」が出たらしいです。 t-wada.hatenablog.jp
旧訳版は読んでいないのですが、 テスト駆動開発(TDD)に興味はあったので、この機会に読んでみました。
- 作者: KentBeck
- 出版社/メーカー: オーム社
- 発売日: 2017/11/13
- メディア: Kindle版
- この商品を含むブログを見る
テスト駆動開発って何?って方は、まずこの動画がとっつきやすいかと思います。 channel9.msdn.com
この本は三部構成になっています。 第1部では「多国通貨」システムについて、 第2部では「xUnit」システムについて、 それぞれJavaとPythonでのTDDによる開発例が書かれています。 第3部では「テスト駆動開発のパターン」として、こういう場合にはどうすればいいか、 というパターンが実例を交えながら書かれています。
実際に第1部と第2部を読むと、 「プログラムが動作する」ことを維持しながら、設計がきれいになっていくところを見ることが出来ます。 この2つのシステムが構築されていく中に、TDDのキモがいくつも詰まっているようです。
また付録にも有用な情報が掲載されていました。 フィボナッチ数列に関するTDDの例は、数ページで終わるような内容ではありますが、 TDDを知らない周りの人たちに示すための簡単な例として使えそうです。 また、訳者によるTDDの現在とこれからは、 現在におけるTDDの立ち位置などがまとめられており、非常に良かったと思います。
これからこの書籍を読みTDDに入門しようと思っている方は、まず第1部を写経して感覚を掴んだ後、 何か小〜中規模なプログラムを自分で組みながらTDDに慣れていくことをおすすめします。 実際に手を動かすことでようやく、ここではこういうことを言っていたんだ、と分かることがあります(ありました)。
実際に初めてTDDで開発してみたグラフ描画用スクリプトを今後紹介する予定です。
DFDで料理のレシピを書いてみる
みなさんこんにちは。くっくです。
今回は料理の話です。今までの記事ジャンル全部まとまりないとか言わない。
さて、事の発端はこの記事。
結構昔から言われてる話らしいですが。1984年初版の本がレシピをフローチャートで表してて分かりやすいそうな。 ですが、これを見た時
「分岐とかごちゃごちゃしてるしそんなにわかりやすいかなこれ……」
と思ったのは僕だけではないはずです。 まあ、確かに下手な文章のレシピよりはわかりやすいしやってみようかな、と思った矢先にこのツイートが。
料理はデータフローのほうが向いている→ http://t.co/i9uBnQeDl0 RT @hatebu: 料理は理系だ!フローチャートで解説した料理本が「分かり易い」と評判に! http://t.co/MZn9iieTi6
— Jun Rekimoto : 暦本純一 (@rkmt) 2015, 6月 20
東大の暦本先生、めっちゃすごい人です。「データフローがわかりやすい」とな。データフロー図とかデータフローダイアグラム(DFD)とか呼ばれてるやつですね。
データフローダイアグラム(以降DFD)とは、「データの発生源」「データの流れ」「プロセス(処理)」を元に、データの流れを書いていく図のことです。フローチャートは処理の流れを中心に書いていく図なので、似てはいますが目的が違います。
なんかすごい人がこっちのほうがいいって言ってるし、やってみましょう。 というわけで、このリンク先では豚汁を作ってるみたいなので、僕は豚丼を作ってみようと思います。
文章で
材料
豚バラ肉 300g
玉ねぎ 1/2個
砂糖 大さじ1
料理酒 大さじ2
醤油 大さじ3
手順
玉ねぎをみじん切りにする。
フライパンにサラダ油を入れ、豚肉を炒める。
豚肉に火が通ったら一度取り出し、そのまま玉ねぎを炒める。
玉ねぎがきつね色になったら、火を止め、砂糖・料理酒・醤油を入れる。
一度出した豚肉を入れ、中火でタレをからめる。
丼にご飯を入れ、その上に肉とタレをのせる。
完成!
茶色い。
普通ですね。いつも見てる感じのやつです。
フローチャートで
完成!!
こうなりました。一度豚バラ肉を取り出す処理が特殊すぎてやりにくかったです。なんでこのレシピにしたんだ俺。
DFDで
完成!!!
もういい?
食材をデータとして、取り置き皿をデータベースとして、調理をプロセスとして記述しました。 結構わかりやすくないですかこれ。 取り置きの処理も、データベースを使うことで(なんとか)上手くかけてると思います。
まとめ
レシピをDFDで書いてみました。どうでしたでしょうか。 興味を持った方は、これからDFDで書いてみると面白いと思います。
それでは。