http 接続できない環境で github から clone して neobundle を使う
http 接続できない環境で github にアクセスする方法を学んだのでメモ。 もし ssh接続が可能なら、githubからリポジトリをcloneできる。 そういう厳しい環境で neobundle を使う方法についてもメモ。
git clone できない悲しみ
$ git clone http://github.com/Shougo/neobundle.vim.git Cloning into 'neobundle.vim'... fatal: unable to access 'http://github.com/Shougo/neobundle.vim.git/' : Failed connect to github.com:443; Operation now in progress
解決法
まず github アカウントを作成して
ssh鍵 (~/.ssh/id_rsa.pub
とか) を登録する。
これで
$ git clone git@github.com:Shougo/neobundle.vim.git
が通るようになる。
次に ~/.gitconfig
に
[url "git@github.com:"] insteadOf = git://github.com/ insteadOf = https://github.com/ insteadOf = http://github.com/
と追記する。これで
$ git clone http://github.com/Shougo/neobundle.vim.git
が通るようになった。めでたしめでたし。
蛇足 neobundle を使う場
neobundle を使うだけなら
~/.gitconfig
を編集する必要は無い。
とにかく neobundle.vim さえ手に入れれば、
以下のように .vimrc
を設定することで vimプラグインがインストールされる。
要するに
NeoBundle 'thinca/vim-quickrun' ,{'type__protocol' : 'ssh' }
とすればよい。
" NeoBundle 'thinca/vim-quickrun' " " と書くと https で通信するのでエラーが出る " [neobundle/install] (10/29): |vim-quickrun| " git clone --recursive https://github.com/thinca/vim-quickrun.git " ... " Cloning into '/home/myname/.vim/neobundle/vim-quickrun'... " fatal: unable to access 'https://github.com/thinca/vim-quickrun.git/' " : Failed connect to github.com:443; Operation now in progre NeoBundle 'thinca/vim-quickrun' ,{'type__protocol' : 'ssh' } " と書けば ssh が使用される。 " [neobundle/install] (10/29): |vim-quickrun| " git clone --recursive git@github.com:thinca/vim-quickrun.git
Linux Mint で sshd コマンドが見つからず困った話
Linux Mint では何故か sshd
が ssh
なので、ややこしいという話。
sshd のインストール
$ sudo apt-get install openssh-server
設定ファイル sshd_config の場所
/etc/ssh/sshd_config
sshdの再起動
$ sudo service ssh restart
普通は
$ sudo /etc/init.d/sshd restart
とか
$ sudo service sshd restart
なのに。統一してほしい。
Linux Mint の TeX Live で画像挿入するノウハウ
Linux Mint の TeX Live 2013 で画像を挿入したいのに、 コンパイルエラーが出て困った(そして解決した)という話。
latexファイルの書き方
[改訂第6版]LaTeX2e 美文書作成入門の120ページや151ページによると、 以下のようにして画像を挿入するのが良いらしい。
\documentclass{jsarticle} \usepackage[dvipdfmx]{graphicx} \begin{document} \begin{figure}[htpd] \centering \includegraphics[width=5cm]{gazo.pdf} \caption{画像だよ} \label{fig:gazo} \end{figure} % \begin{figure}[H]にすれば、必ずその位置に画像を挿入 % \includegraphics[]{./figdir/gazo.pdf} も可能 % \includegraphics[]{../figdir/gazo.pdf} も可能 % \includegraphics[]{gazo.png} も可能。jpgも可能 % 今後は eps より pdf が推奨される % ファイル名にアンダースコア_が含まれるとエラーになる \end{document}
しかし上記ファイルのコンパイルを試みると、gazo.xbbが見つかりません 的なエラーメッセージが現れた。
$ platex hoge.latex ... いろいろ表示される ... ! LaTeX Error: File `gazo.xbb' not found. Use -shell-escape option to generate automatically.
なんで画像入れるだけで怒られなあかんのや。
解決法: texmf.cnf を編集する
TeX Live 2013 のインストール時に作成される
usr/share/texlive/texmf/web2c/texmf.cnf
というファイルを編集し、
shell_escape_commands =
に extractbb
を追加すれば、
コンパイルが通るようになった。
具体的には、texmf.cnf
の547行目あたりに
%... % shell_escape_commands = \ bibtex,bibtex8,\ kpsewhich,\ makeindex,\ mpost,\ repstopdf,\ % we'd like to allow: %...
という箇所を見つけたので、
以下のように extractbb
を追加したらうまくいった。
%... % shell_escape_commands = \ bibtex,bibtex8,\ kpsewhich,\ makeindex,\ mpost,\ repstopdf,\ extractbb,\ % we'd like to allow: %...
[追記 2014/01/10]
Windowsのw32tex環境でも同様のコンパイルエラーが発生したので、 以下のように設定して問題を解決した。
....\w32tex\share\texmf-dist\web2c\texmf.cnf
の485行目あたりの
% for being called from TeX. % shell_escape_commands = \ bibtex,pbibtex,jbibtex,repstopdf,epspdf,extractbb,\ makeindex,mendex,mpost,pmpost,upmpost,kpsewhich % we'd like to allow:
を
% for being called from TeX. % shell_escape_commands = \ bibtex,pbibtex,jbibtex,repstopdf,epspdf,extractbb,\ makeindex,mendex,mpost,pmpost,upmpost,kpsewhich,\ extractbb % we'd like to allow:
に変更すれば、コンパイルエラーが消えた。
quickrunで部分コンパイル (LaTeXが捗る)
Vim Advent Calendar 2013 の24日目の記事です。 昨日は @thincaさんの submode.vim で特定の条件の時だけ submode に入るでした。
さて今日は、昨日担当者のthincaさん作の
quickrun というVimプラグインの、
hook/eval/template
という機能を紹介します。
この機能はLaTeXで数式や表を作成する際に大変役立つのですが、
あまり使われてない様子なので布教します。
一部だけコンパイルしたい
LaTeXを書くときに間違えやすい箇所といえば、数式(あるいは表)です。 そこで何度も 「書く→コンパイル→書く→コンパイル→修正→コンパイル...」 という作業を繰り返すわけですが、 文章全体をコンパイルするのは不毛 じゃないですか? 具体的には以下の様な点でアホだと思います。
- 今書いてる数式のpdfを見たい。他の箇所はいらない(邪魔)
- 特にpdfが複数ページだと、編集箇所を見つけるのが大変面倒
- コンパイルに時間がかかる
- pdfのサイズも増える
そこで部分コンパイルの出番です。
具体的にやりたいこと
- visual-mode で選択した箇所をコンパイル
- normal-mode で align 環境にいる場合、その数式部分だけコンパイル
とりあえず以上を目標にします。 align環境だけでなく、tabular環境等に拡張するのは容易です。
quickrunのtemplate機能を使う
quickrunの使い方は去年のVACの記事 quickrun.vim について語る にまとまっているので、既知とします。
さてquickrunにtemplateという機能があることを冒頭で述べましたが、
簡単に説明すると
「予めテンプレートを作成しておき、その中の %s を元のソースファイルに置き変える」
という機能です
詳細はhelpの quickrun-module-hook/eval
という項目に載っています。
今回のテンプレートとしては
プリアンブル \begin{document} %s \end{document}
みたいなのを作っておけばよさそうです。
このtemplate機能、イイ線いってるものの、実現したい内容とは少し違います。 テンプレート内の %s が元のソースファイルの一部に置き変わって欲しいのであって、全体が置き換わっては意味がありません。
そこで使うのが quickrunの 実行モード という機能です。
要するに visual-mode から mode -v
でquickrunを起動すると、
選択領域が一時ファイルに書きだされた後、実行されます。
詳細はhelpの
quickrun-option-mode
quickrun-option-tempfile
を参照してください。
実装
現在の僕の .vim/ftplugin/tex.vim は以下の様な感じです。
visual-modeでLaTeXファイルの一部を選択し、
<Space>s
すれば、そこだけコンパイルされた tmptex.pdf が生成されます。
またalign環境内で
<Space>s
すれば、その環境内の数式が入った tmptex.pdf が生成されます。
let g:quickrun_config.tmptex = { \ 'exec': [ \ 'mv %s %a/tmptex.latex', \ 'platex -output-directory=%a %a/tmptex.latex', \ 'dvipdfmx -o %a/tmptex.pdf %a/tmptex.dvi', \ ], \ \ 'outputter' : 'quickfix', \ \ 'hook/eval/enable' : 1, \ 'hook/eval/cd' : "%s:r", \ \ 'hook/eval/template' : '\documentclass{jarticle}' \ .'\usepackage{amsthm,amssymb,amsmath}' \ .'\begin{document}' \ .'%s' \ .'\end{document}', \ \ 'hook/sweep/files' : [ \ '%a/tmptex.latex', \ '%a/tmptex.log', \ '%a/tmptex.aux', \ '%a/tmptex.dvi' \ ], \} vnoremap <silent><buffer> <Space>s <ESC>:<C-u> \let @x = expand("%:p:h:gs?\\\\?/?")<CR> \gv:<C-u>quickrun -mode v -type tmptex -args @x<CR> nnoremap <silent><buffer> <Space>s :<C-u> \let @x = expand("%:p:h:gs?\\\\?/?")<CR> \mx \?begin.*align<CR>V \/end.*align<CR> \:<C-u>quickrun -mode v -type tmptex -args @x<CR> \`x
なんかごちゃごちゃしていますが、
まず let g:quickrun_config.tmptex
の部分から見ていきます。
exec
の部分は、
要するに tmptex.pdf を得るための手続きが書かれています。
quickrunを呼び出す際に、LaTeXファイルの存在するパスを %a
の引数として受け取ります。
%s
は一時ファイル (visual-modeで選択した文字列が入っている) の名前です。
hook/eval/template
は、各自が最強のプリアンブルを容易する場所です。
hook/sweep
は、コンパイル時の副産物を自動消去する設定です。
次に vnoremap
の部分を見ます。
let @x = expand("%:p:h:gs?\\\\?/?")
の部分は、LaTeXファイルの存在するパスを
文字列として @x
変数に格納しています。
その後、quickrunを-mode v
で呼び出して、-args @x
で引数として前述したファイルパスを渡しています。
最後の nnoremap
の部分については、
vnoremap
する前に begin{align}
とend{align}
の文字列を探してvisual選択してるだけなので割愛します。
vnoremap
やnnoremap
周辺の設定がごちゃごちゃしています。
もっと簡潔に書きたいので、強い vimmer の天啓が下るよう祈ります。
他のマークアップ系言語でも、 template と mode -v のコンボは威力を発揮する気がします。
sshfsでリモートのディレクトリをマウント
リモートのデータをローカルにマウントする意義
多くの場合リモートの環境は貧弱で、そして解析すべき豊富なデータが眠っている。 一方ローカルの環境は最強だが、解析すべきデータは無い。 このミスマッチを解消するために、リモートの有用なディレクトリをローカルにマウントする作戦。筋が良い。
sshfsを使えばこの作戦が実行できる。
つまり @dokoka
という名のリモートサーバー にある /achira/
ディレクトリを、
ローカルの空ディレクトリ /kochira/
にマウントできる。
何より便利なのは、ローカルにマウントした後、リモートの /achira
を直接編集すると、ローカルの /kochira/
に即座に反映されるところ。
逆に、ローカルで /kochira/
を編集すると、リモートの /achira/
に反映される。
具体的な効能としては、たとえばローカルにしかインストールされていないリッチなソフトでリモートのファイルを解析できる。 あるいはローカルの .zshrc や .vimrc の下でリモートのファイルを編集できる。 他には、リモートで gnuplot して得た pdf ファイルをローカルで直接開けるようになった。 リモートには X-window-system が無いので、今まで毎度毎度scpしていたが、今後は scp せずに済む。 ありがたい。
sshfsのインストール
LinuxMintならaptで一撃だった。 ローカルで以下のコマンドを実行すればよい。
$ sudo apt-get install sshfs
リモートのサーバーについては何も設定しなくてよい。
sshfsの使い方
前提として、リモートの @dokoka
サーバーに ssh でアクセスできるとする。
sshfsを使うには、ローカルで以下のコマンドを実行すればよい。
/kochira
や/achira
は、適宜/home/auewe/datadir
や~/datadir
のように読み替えること。
$ mkdir /kochira $ sshfs username@dokoka:/achira /kochira ### scpでリモートのディレクトリをコピーするのと同じ構文
これで @dokoka
という名のリモートサーバー にある /achira/
ディレクトリを、
ローカルにある空のディレクトリ /kochira/
にマウントできた。
アンマウントするには、ローカルで以下のコマンドを実行。
$ fusermount -u /kochira
はてなブログにLaTeXで数式を書く (Markdown記法用)
追記 2014/05/10 この記事は古いので、 はてなブログの LaTeX 数式表示がデフォルトで MathJax 化された を参照してください。
MathJaxを導入したら、はてなブログがMarkdown+LaTeXという夢の様な環境になって便利という話。
はてな記法で数式を書く
以前は以下の方法ではてなブログに数式を書いていた。 いわゆるはてな記法を使う方法。
[tex:{ \displaystyle b_n = \sum_{m=0}^{N-1} a_m }]
この方式では数式が画像に変換されてしまい、よくない。
MathJaxで数式を書く
画像化するのではなく、javascriptでフォントの位置とサイズを整えて数式を表示するMathJaxという仕組みがある。 MathJaxはすでに有力な標準仕様で、画像化するより MathJaxを使ったほうが綺麗らしい ので乗り換えた。 LaTeXコマンドをそのままブログに書ける ので、かなり便利。
導入の詳細は はてなブログで MathJax \( \alpha^{\beta^{\gamma}} \) (←リンク名にも数式が使えるのだ) や MathJaxでの数式表示を試す を参照。 要するにはてなブログのサイドバーに
<script type="text/javascript" src="https://c328740.ssl.cf1.rackcdn.com/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML" ></script>
と書くだけ。むっちゃ簡単。
文中の数式は、以下のように\\(
と\\)
で数式部を挟む。
京都北山 \\( \alpha \\) ステーション!
京都北山 \( \alpha \) ステーション!
普通のLaTeXでは$ \alpha $
とするけれど、
MathJaxでは $
記号が推奨されない。
そのかわり、普通のMathJaxでは\( \alpha \)
とするのが推奨されている。
ただしこのブログは Markdown で書かれてるのでエスケープを2重にしなければならない。
つまり\\( \alpha \\)
とする。
エスケープ関連の問題はややこしいので追記に書いた。
別行立ての数式を書く時はalign
環境を使う。
\begin{align\*} b_n = \sum_{m=0}^{N-1} a_m \end{align\*}
\begin{align} b_n = \sum_{m=0}^{N-1} a_m \end{align}
算数のおべんきょうが捗る。
2014/02/17 追記
id:tosh1ki さんに指摘されたので追記します。
参考 :
はてなブログ(Markdown記法)+MathJaxの記入例
MathJax環境内では _,*[]()
の文字をエスケープしないと、
数式化されない場合がある。一例を上記ブログから引用する。
アンダースコアを全てエスケープした場合
\\( \mathcal{Z}[x\_{n}]=\sum\_{n=-\infty}^{\infty} x\_{n}z^{-n}\\ \\)
\( \mathcal{Z}[x_{n}]=\sum_{n=-\infty}^{\infty} x_{n}z^{-n}\ \)
↑正しく数式化された。
アンダースコアのエスケープを外した場合
\\( \mathcal{Z}[x_{n}]=\sum_{n=-\infty}^{\infty} x_{n}z^{-n}\\ \\)
\( \mathcal{Z}[x{n}]=\sum{n=-\infty}^{\infty} x_{n}z^{-n}\ \)
↑数式化されない!!
きちんとエスケープしましょう。
C言語からLAPACKを呼んで逆行列を求める(LU分解する)
数値解析の授業で逆行列は求めちゃダメって言われたけど、気にしない気にしない。
実行列の逆行列を求める
Fortranの DGETRF でLU分解した後、 DGETRI で逆行列を求める。
/* * hoge.c * SIZE*SIZE型の実行列の逆行列を計算 * 元の行列は * (2 3 ) * (1 0.5) */ #define SIZE 2 #include <stdio.h> int main(void){ int m = SIZE ; // 行のサイズ int n = SIZE ; // 列のサイズ int lda = SIZE ; // mと同じ値 double A[SIZE*SIZE] ; // m x n の行列成分。この行列の逆行列を求める。 A[0] = 2.0 ;A[2] = 3.0; A[1] = 1.0 ;A[3] = 0.5; int info ; // 計算が成功すれば0を返す int ipiv[SIZE] ; // 要素数はm,nのうち小さい方とする int lwork = SIZE ; // nと同じ値 double work[SIZE] ; // 要素数はlworkと同じ値 // LAPACKのdgetrfサブルーチンを呼んで、行列AをLU分解 // 引数は全て参照渡し dgetrf_( &m, &n, A, &lda, ipiv, &info); // LU分解後の行列から逆行列を求める // 逆行列は元の配列Aに入る dgetri_( &n, A, &lda, ipiv, work, &lwork, &info); printf("%+8.5lf %+8.5lf\n", A[0], A[2]); printf("%+8.5lf %+8.5lf\n", A[1], A[3]); }
コンパイルと実行結果
$ gcc hoge.c -llapack -lblas -lm $ a.out -0.25000 +1.50000 +0.50000 -1.00000
引数の詳細については、下手な解説を見るより dgetrf と dgetri を読むのが一番わかりやすい。
CとFortranの配列形式の違いについては、 CとFortranで行列の添字が異なる点への注意喚起 に書いた。
複素行列の逆行列を求める
Fortarnの
ZGETRF
でLU分解した後、
ZGETRI
で逆行列を求める。
実行列の場合との違いは、行列Aと配列workの型がdouble
からdouble _Complex
に変わったところ。
/* * hoge.c * SIZE*SIZE型の複素行列の逆行列を計算 * 元の行列は * (0.5+i 1.0+0.5i) * (2.0 1.0 ) */ #define SIZE 2 // 2*2型の行列 #include <stdio.h> #include <complex.h> int main(void){ int m = SIZE ; // 行のサイズ int n = SIZE ; // 列のサイズ int lda = SIZE ; // mと同じ値 double _Complex A[SIZE*SIZE] ; // m x n の行列成分。この行列の逆行列を求める。 A[0]= 0.5+I ; A[2]= 1.0+0.5*I; A[1]= 2.0 ; A[3]= 1.0; int info ; // 計算が成功すれば0を返す int ipiv[SIZE] ; // 要素数はm,nのうち小さい方とする int lwork = SIZE ; // nと同じ値 double _Complex work[SIZE] ; // 要素数はlworkと同じ値 // LAPACKのzgetrfサブルーチンを呼んで、行列AをLU分解 // 引数は全て参照渡し zgetrf_( &m, &n, A, &lda, ipiv, &info); // LU分解後の行列から逆行列を求める // 逆行列は元の配列Aに入る zgetri_( &n, A, &lda, ipiv, work, &lwork, &info); printf("%+8.5lf%+8.5lfI %+8.5lf%+8.5lfI\n", creal(A[0]), cimag(A[0]), creal(A[2]), cimag(A[2])); printf("%+8.5lf%+8.5lfI %+8.5lf%+8.5lfI\n", creal(A[1]), cimag(A[1]), creal(A[3]), cimag(A[3])); }
コンパイルと実行結果
$ gcc hoge.c -llapack -lblas -lm $ a.out -0.66667-0.00000I +0.66667+0.33333I +1.33333+0.00000I -0.33333-0.66667I
引数の詳細は zgetrf と zgetri を読むべし。 またCとFortranの配列形式の違いについては、 CとFortranで行列の添字が異なる点への注意喚起 を読むべし。