2008年5月23日金曜日

tabular の列間の調節

今 LaTeX で論文を書いていて, ある表の横幅が長くなりすぎて困っていた. その表は列間の空白が比較的多くて, ここをうまく縮めればいいのになあと思ったので, 対処法を調べてみた.

tabular の代わりに tabular* を使って,
\begin{tabular*}{??pt}{@{\extracolsep{\fill}}c|rr}
...
\end{tabular*}

のようにしてやればよいことが分かった. \fill のところは好きなサイズを入れることも可能. 特に列間を縮めたければ, -5pt とか入れるとかなり縮まる.

参考:
http://www.comb.kokushikan.ac.jp/inlab/LaTeX/node26.html
http://www.tex.ac.uk/cgi-bin/texfaq2html?label=fixwidtab
http://www-h.eng.cam.ac.uk/help/tpl/textprocessing/teTeX/latex/latex2e-html/ltx-68.html

2008年5月21日水曜日

xvidcap のコンパイル

ここ最近 FreeBSD 7-stable で sysutils/xvidcap をコンパイルしようとすると, 最後のリンクで失敗する状況が続いていた. 特にすぐ xvidcap を使うことはなかったので, そのうち直るだろうと放っておいたが, portupgrade -a するたびにエラーが報告されるのがだんだん気になってきたので, ちょっと調べてみた.

libtheora と libx264 がリンクするファイルのリストに載っていなかったのが原因だと分かった. ports/sysutils/xvidcap/work/xvidcap-1.1.4p1/src/Makefile の PACKAGE_LIBS の部分を赤字のように変更すると無事コンパイルできるようになった.
PACKAGE_LIBS = -pthread -L/usr/local/lib -lglade-2.0 -lgtk-x11-2.0 -lxml2 -lgdk-x11-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lpangocairo-1.0 -lXext -lXrender -lXinerama -lXi -lXrandr -lXcursor -lXcomposite -lXdamage -lcairo -lpangoft2-1.0 -lpango-1.0 -lm -lfreetype -lz -lfontconfig -lX11 -lXfixes -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lglib-2.0 -liconv -ltheora -lx264

2008年5月20日火曜日

マウスの真ん中のボタンとFirefox

Firefox でマウスの真ん中のボタンをリンクの上で押すと, そのリンクを新しいタブにロードしてくれて便利に使っている. しかし, ボタンを押したときにリンクからはずれていると, そのときにコピーしていた文字列を URL にしてアクセスして少し困っていた. ただ, どうしたらその機能を停止できるかは分からなかったので, 今まで我慢して使っていた.

そして, 今日なんとなく about:config を何となく見ていたら, その解消法が分かった.
middlemouse.contentLoadURL
を false にすればいいようだ. これでますます快適になる.

そろそろ Firefox 3 も試したいなあ.

2008年5月19日月曜日

vector にはまる

STL の vector を使っていて, vector の要素へのポインタを使っていた所, そのポインタの指す先が勝手に破壊される自体に遭遇して悩んだ. 結果的には vector に push_back した際に vector が自動的に resize して, ポインタの指す先が解放されていたのが原因だと判明. とりあえずは, vector::reserve で自動的な resize を抑制することで解決した. 根本的な問題の解決のためにデザインを考え直さなければ. vector のもっとも便利な自動 resize でつまづくことになるとは...

2008年5月15日木曜日

zsh と FDclone

zsh を使うようになってから, なぜか FDclone が使えなくなった. "malloc(): Cannot allocate memory" というメッセージが出て FDclone が死んでしまったのだ. その原因を調べてみたところ, zshrc に HISTFILE と HISTSIZE というのを書いていて, ここで zsh の履歴の設定をしているのだが, この環境変数が FDclone も使っていることが原因だったと分かった.

zsh のために "export HISTSIZE = 100000" と設定していたが, これを FDclone も読み込み, しかも, FDclone 内部では HISTSIZE を short型で取っていたため, 100000 があふれて -31072 になってしまっていた. そのせいで, malloc(-31072) というのを実行して死んだのだ.

解決法としては, FD_HISTFILE と FD_HISTSIZE という環境変数を設定してやればOK.

2008年5月12日月曜日

valarrayのconstructorとresize

valarrayの各要素に同じ値を入れる方法として constructor を使う方法と resize を使う方法があるが, そのインターフェースの違いに戸惑ったのでメモ.

  • valarray(const T& v, size_t num)
  • valarray.resize(size_t num, const T v = T())
このように, 引数の順番が逆になっているのに気づいていなかった. T と size_t が異なればコンパイル時にエラーが出るが, そうでない場合はそのままバグになるので気をつけないと.

例:

01: #include<valarray>
02: #include<iostream>
03:
04: using namespace std;
05:
06: int main(void){
07: valarray<char> v('a', 5);
08: for(int i = 0; i < v.size(); ++i) cout << v[i]; cout << endl;
09:
10: v.resize(5,'b');
11: for(int i = 0; i < v.size(); ++i) cout << v[i]; cout << endl;
12:
13: return 0;
14: }

2008年5月11日日曜日

C++のテンプレートに悩む

C++のテンプレートにはまった. 下のようにテンプレートの片方のパラメータの特殊化しようとしたが, コンパイルが通らない... C++難しいなあ.


(a.cpp)
01: #include <iostream>
02:
03: using namespace std;
04:
05: template<typename T, int N>
06: struct A{
07: int val() const;
08: };
09:
10: template<>
11: template<typename T>
12: int A<T,1>::val() const{
13: return 1;
14: }
15:
16: int main(void){
17: A<int,1> a;
18: cout << a.val() << endl;
19: return 0;
20: }

環境: gcc version 4.2.1 20070719 [FreeBSD]

a.cpp:12: error: invalid use of incomplete type 'struct A'
a.cpp:6: error: declaration of 'struct A'
*** Error code 1

2008年5月10日土曜日

Windows XP SP3

Windows XP SP3 を入れようとしたが, インストールの途中でブルースクリーンが出て失敗. うーん, どうしたものか. 情報を集めないと.

追記(5/11):
PCは ThinkPad X40 なのだが, SP3 を入れる前にソフトウェア導入支援を起動してみたら, Windows のパッチが「重要」として挙がっていたので, それをまず入れてみた. すると SP3 が無事にインストールできた. 普通のWindowsのパッチは「KB???」の形式の名前がついているが, 今回のパッチはThinkPad専用とのことで「Q???」の形式の名前だった. これが効いたのだろうか?