GnuCash - メニューバーや貸借対照表などのフォントを変更する

GnuCash、なんかメニューバーがギザギザしてる&貸借対照表などのレポートが文字化けする。環境は、Windows7 64bit + GnuCash2.4.10。

インストールフォルダ内、 ~/gnucash/etc/pango/ 内にpango.aliasesが無ければ作成する。aliasesファイルは、Windowsのデフォルトインストールだと作成されない模様。Mac環境だと初期で作成されるのかも?

さて、aliasesファイル内に例えば以下を記述します。

tahoma = "Meiryo,tahoma,browallia new,mingliu,simhei,gulimche,ms gothic,latha,mangal"
sans = "Meiryo,arial,browallia new,mingliu,simhei,gulimche,ms gothic,latha,mangal"
serif = "Meiryo,times new roman,angsana new,mingliu,simsun,gulimche,ms gothic,latha,mangal"
monospace = "Meiryo,courier new,courier monothai,mingliu,simsun,gulimche,ms gothic,latha,mangal"

フォントはお好みで。上はメイリオを指定しています。Meiryoの後ろはおまじないみたいなもんです。多分無くても動くけど……。font-familyみたいなもんですね。

tahoma,sans,serif,monospace全てをMeiryoに設定すると、ギザギザなフォントだったメニューバーも綺麗になる。もちろん、貸借対照表などの文字化けも直る。VMware等の仮想環境で例えばUbuntu等で動かせばこういった文字化け現象は解消されるのですが、なんとなくWindowsで使用したかったので。


参考リンク:

gnuplotで作成するグラフの凡例で、アクセント記号を使う方法

texコマンドの\barに相当することを、gnuplotの凡例部分で無理やり実現したい(ちなみに上付き文字や下付き文字の場合は、^や_を使用することで簡単に実現できる。要enhanced)。

以下のページが参考になりました。
TAKENO LAB home page - gnuplot-ja -11 拡張文字列処理モード (Enhanced text mode)

上記事を参考に説明します。例えばtexでいう\bar{a}を表現するには、

~a{.8-}

とします。
これは、'a' の上に '-' を、現在のフォントサイズの.8倍持ち上げた位置に重ね書きすることを意味しています。

0.8倍の部分は適宜調整します。

perlによる、多次元配列に順次代入していく方法、多次元配列の出力、特定のキーでのソート

例えば以下のように宣言すれば、多次元配列を生成することができる。

my @array = ([1,2,3],[4,5,6]);

簡単な出力方法として、例えば以下の方法があるらしい。

foreach my $ref(@array){
    print "@$ref\n";
}

出力結果

1 2 3
4 5 6


多次元配列の値を最初に宣言(代入)するのではなく、順次、多次元配列に値を追加(代入)するにはどうすればよいかというと、pushを使う方法があるらしい。

#!/usr/bin/perl
use strict;
use warnings;

my @array;

push(@array,([1,2,3]));
push(@array,([4,5,6]));

foreach my $ref(@array){
    print "@$ref\n";
}

出力結果

1 2 3
4 5 6

ソート

上に例で言えば、「1と4」だとか「2と5」という風に、特定のキーについてソートを行いたい場合がある。これも簡単にできるらしい。

#!/usr/bin/perl
use strict;
use warnings;

my @array;

push(@array,([1,2,3]));
push(@array,([4,5,2]));
push(@array,([0,0,0]));

foreach my $ref(@array){
    print "@$ref\n";
}

my @newarray = sort{$a->[1] <=> $b->[1]}@array;
print "\n";

foreach my $ref(@newarray){
    print "@$ref\n";
}

@newarray = sort{$a->[2] <=> $b->[2]}@array;
print "\n";

foreach my $ref(@newarray){
    print "@$ref\n";
}

出力

1 2 3
4 5 2
0 0 0

0 0 0
1 2 3
4 5 2

0 0 0
4 5 2
1 2 3

pasteコマンドで改行されてしまう問題

2つのファイルを行単位で結合するコマンドとして、pasteがある。Windows環境で作成されたテキストファイルは、改行コードが CRLF(キャリッジリターン+ラインフィード)となっており、LinuxにおけるLF(ラインフィード)だと思ってpasteコマンドを実行すると意図した結果にならない。例えば、

abc
def
ghi

123
456
789

という二つのファイルに対してpasteコマンドを実行したとすると、

abc 123
def 456
ghi 789

と表示されて欲しいが、実際は

abc
   123
def
   456
ghi
   789

のように表示されてしまう。

そのため、pasteコマンドを実行する前に、改行コードを変換しておく必要がある。

tr -d '\r' < 変換したいテキストファイル名  > 変換後のテキストファイル名

変換を施した後にpasteコマンドを実行すれば、意図した出力結果となる。

Ubuntu 11.04(64bit)にR言語の環境をインストールする

基本的に、R のインストール - RjpWikiに紹介されている手順で可能です。ただし公開鍵の期限切れによりIDが常に更新される恐れがありますので気を付ける必要があります(後述)。

幾つか間違いやすいポイントを解説します。

(2) 使用中の Ubuntu のバージョンに応じてつぎのような一行を付け加える。
    (筑波大学のミラーを使う)

 deb http://cran.md.tsukuba.ac.jp/bin/linux/ubuntu hardy/
 deb http://cran.md.tsukuba.ac.jp/bin/linux/ubuntu gutsy/
 deb http://cran.md.tsukuba.ac.jp/bin/linux/ubuntu feisty/
 deb http://cran.md.tsukuba.ac.jp/bin/linux/ubuntu dapper/
 deb http://cran.md.tsukuba.ac.jp/bin/linux/ubuntu natty/

Ubuntu11.04の場合、「natty/」を選択します。詳細はhttp://cran.md.tsukuba.ac.jp/bin/linux/ubuntu/READMEを参考にしてください。

As of April 28, 2011, the supported releases are Natty
Nawwhal (11.04), Maverick Meerkat (10.10), Lucid Lynx (10.04; LTS) and Hardy Heron (8.04; LTS).

http://cran.md.tsukuba.ac.jp/bin/linux/ubuntu/README
(3) Ubuntu レポジトリの公開鍵を入手

 $ gpg --keyserver subkeys.pgp.net --recv-key E2A11821
 $ gpg -a --export E2A11821 | sudo apt-key add -
(http://cran.md.tsukuba.ac.jp/bin/linux/ubuntu/READMEによると、2011年9月26日現在は以下のようなコマンドのようです。)
 $ gpg --keyserver keyserver.ubuntu.com --recv-key E084DAB9
 $ gpg -a --export E084DAB9 | sudo apt-key add -


公開鍵は、おそらく一定期間ごとに更新されると思われるのでWikiに書かれている公開鍵が常に最新とは限りません。私がWikiを見ながら作業した際は「E2A11821」になっていました(これは上のように修正しました)。
2011年9月26日現在では「E084DAB9」です。またコマンド内容も若干変化していますので、http://cran.md.tsukuba.ac.jp/bin/linux/ubuntu/READMEを参考に、最新の情報を利用するようにしてください。

Rを64bit Windowsマシンにインストールする

The Comprehensive R Archive Networkがトップページ。
そこから、Download R for Windows -> base とアクセスすると、最新版が提供されているページに行き着く。
2011年9月26日現在でバージョンはR-2.13.1。32/64bit共通のexeファイルを落とす。

実行して、適当にクリックしてインストール。私の環境ではインストール中のダイアログの日本語が一部文字化けしていました。勘で乗りきれると思います。
以上。

perlでの2乗計算とかB::Deparseとか

分散を計算しようと思い、perlでの2乗表記を調べていました。基本的には、

$i ** 2

で事足りるようですが、はたして

$i * $i

では、実行時間に差はあるのか。


Perlで累乗計算の速度計測〜二乗を計算するなら?〜 - ほんまの走り書き技術メモ


上記事によると掛け算の方が約2倍早いという。本当だろうか。

そこで以下の2つのソースコードを実行して比較しようとしました(上記事のソースコードを流用させていただいた)。

sample01

#!/usr/bin/perl
use strict;
use warnings;

for (my $i = 0; $i < 100000000; $i++){
    my $p = $i * $i;
}

sample02

#!/usr/bin/perl
use strict;
use warnings;

for (my $i = 0; $i < 100000000; $i++){
    my $p = $i ** 2;
}

しかし、どうやらもっとスマートな比較方法があるらしい。

いまさら聞けないPerlのお役立ちワザ(3) - いまさら聞けないPerlのお役立ちワザ:ITpro

上記事内のソースコードを参考に、以下のように修正。

#!/usr/bin/perl
use strict;
use warnings;
use Benchmark qw(:all);

my $i = 100;
my $results = timethese(50_000_000,
               {'Method 1' => '$i * $i',
                'Method 2' => '$i ** 2'});

cmpthese($results);

いろいろふっ飛ばしましたがお許し下さい。


数回試行したら以下のようになった。
なお実行環境は、VMware上にUbuntu11.04(64bit),Athlon II X4 630(2.8GHz),Mem=1GB,Perl 5.12.2.

Benchmark: timing 50000000 iterations of Method 1, Method 2...
  Method 1:  4 wallclock secs ( 3.95 usr +  0.00 sys =  3.95 CPU) @ 12658227.85/s (n=50000000)
  Method 2:  4 wallclock secs ( 3.92 usr +  0.00 sys =  3.92 CPU) @ 12755102.04/s (n=50000000)
               Rate Method 1 Method 2
Method 1 12658228/s       --      -1%
Method 2 12755102/s       1%       --


Benchmark: timing 50000000 iterations of Method 1, Method 2...
  Method 1:  4 wallclock secs ( 3.80 usr +  0.00 sys =  3.80 CPU) @ 13157894.74/s (n=50000000)
  Method 2:  4 wallclock secs ( 3.74 usr +  0.00 sys =  3.74 CPU) @ 13368983.96/s (n=50000000)
               Rate Method 1 Method 2
Method 1 13157895/s       --      -2%
Method 2 13368984/s       2%       --


Benchmark: timing 50000000 iterations of Method 1, Method 2...
  Method 1:  3 wallclock secs ( 3.85 usr +  0.00 sys =  3.85 CPU) @ 12987012.99/s (n=50000000)
  Method 2:  2 wallclock secs ( 3.78 usr +  0.00 sys =  3.78 CPU) @ 13227513.23/s (n=50000000)
               Rate Method 1 Method 2
Method 1 12987013/s       --      -2%
Method 2 13227513/s       2%       --

本当は10回ほど試行して誤差を見る必要があるんでしょうが計算はパス。どうも有意な差が出そうにないんだけども、根本的な間違いをしているのだろうか…。
そのうち考えることにします。

2乗の表記方法の違い

話は戻って、表記方法によってコンパイル時の最適化による違いがあるんじゃなかろうか…と思い、B::Deparseなる便利なものを用いて確認してみた。

使用するのは上で用いた以下のプログラム。

test.pl

#!/usr/bin/perl
use strict;
use warnings;
use Benchmark qw(:all);

my $i = 100;
my $results = timethese(50_000_000,
               {'Method 1' => '$i * $i',
                'Method 2' => '$i ** 2'});

cmpthese($results);
$ perl -MO=Deparse test.pl 

use Benchmark (':all');
use warnings;
use strict 'refs';
my $i = 100;
my $results = timethese(50000000, {'Method 1', '$i * $i', 'Method 2', '$i ** 2'});
cmpthese($results);

どうやらそういう問題でもないらしい。これに関しても根本的に知識が足りていないような気がするので、追々勉強しようと思います。

終わりに

というわけで何となくスッキリしたようなしなかったような。
ただ一番の問題は、単に2乗の計算をするプログラムを書こうと思っただけなのに、いつの間にか時間を消費していたことだった。


参考:
バイトコードの最適化状態を確認する - Perl Tech - Hatena::Group::Perl
Benchmark - ベンチマーク(性能比較)を行う / Perlモジュール徹底解説 - サンプルコードによるPerl入門
Perlの調べ物:Benchmark - 美味しいもの - Yahoo!ブログ