Mac OS X

gsdjvuをビルドしてdjvudigitalを使う

[備忘録]Ubuntu上でgsdjvuを自前ビルド&インストールしたのでメモ。

使いたいのは djvudigital というプログラム。djvudigital hoge.pdf とすれば,hoge.djvu が出来上がるというもの。そのためには,DjvuLibre というものを入れる必要がある。

DjvuLibre自体はSynapticパッケージマネージャーから簡単にインストール出来るのだが,これだけではダメ。djvudigitalを使おうとすると,これこれが必要なので,別途インストールしてね,的なメッセージが出てしまう。どうやらライセンス(GPLとかCPLとか)の関係で,GSDjvuというものが同梱できないらしい。その辺の事情はGSDjvuのページに書いてある。そこでGSDjvuのページをざっと読んで,自前でのビルドを試みた。

まずはGSDjvuをダンロードする。現時点での最新版は gsdjvu-1.6.tar.gz で,これを解凍した gsdjvu-1.6 というフォルダーを適当な場所に移動させる。今回は,/home/foo/gsdjvu-1.6 とした。ちなみに foo の箇所は自分のアカウント名に置き換え。そして,その中に BUILD という名前のフォルダーを作る。/home/foo/gsdjvu-1.6/BUILD となる。他の名前でも良いと思うが,BUILDがビルド用スクリプトでのデフォルト名になっているので,あとで名前を入力する手間が省ける。

次に,READMEに従って ghostscriptとフォント関係をダウンロード。ghostscript-8.64.tar.bz2 と ghostscript-fonts-std-8.11.tar.gz を指定のサイトからダウンロードして,/home/foo/gsdjvu-1.6/BUILD/ に置く。これ以外にオプションで,解凍ツールとかJPEG, PNG関係のライブラリーがダウンロードリストに載っているが,システムにある場合は,そちらが最新版だろうから,それを使った方が良いだろうというような事が書いてある。実際,これらはすでにシステムに入れてあるので,今回はパスした。

では,ビルド開始。シェルから /home/foo/gsdjvu-1.6/build-gsdjvu なるスクリプトを起動させる。途中でいくつか質問されるが,YESとかYを選択すれば良い。警告(Warning)がたくさん出るので一瞬あせるのだが,無事にビルド出来たようだ。

最後に,インストール。Makefile とか無いので,手動にて移動ならびにシンボリック・リンクを張る。READMEにはrootでインストールする方法が書いてあるが,UbuntuとかMacってルートが居ないんじゃなかったんだっけ? ということで,sudo を付けて次のように。

# sudo cp -r /home/foo/gsdjvu-1.6/BUILD/INST/gsdjvu /usr/local/lib
# cd /usr/local/bin
# sudo ln -s ../lib/gsdjvu/gsdjvu gsdjvu

これで終了。試しに,大鏡の文庫本を変換したら,15MBあったのが,5MBくらいになった。

今回は,Ubuntu上でビルドしたが,Macでもやってみたいと思う。djvulibreはhomebrewで入れてあるので。

OpenCVで自炊本をモノクロ2値に変換してみた

自炊代行業者さん(Bookscan)に依頼した本のPDFがたくさんあるのだが,読みやすく美白化して白黒2値に変換したい。それを実現するためのプログラム。まだ試作段階だが,とりあえず動作している。以前,GIMP用のスクリプトやImageMagick用のPerlスクリプトで行っていたことを,OpenCVでやってみた。以前のバージョンに比べて,明らかにスピードが速い。OpenCVはもちろんC++でプログラム書いたことないので,無事にコンパイル出来たときは,ちょっと嬉しかったな。

参考にしたのは,次のページ。参考というよりは,ほとんどそのまま頂いている。有難きは先達なり。

橋本商会 scansnapで自炊した本をkindleで読めるように補正する(2)

このページに書かれているプログラムをひな形として,自分の目的に合うように処理内容をあちこち変えた。実は,boost::filesystemのバージョンが上記ページが書かれた頃から変わっていたため,そのままではコンパイル出来なかった。また,OpenCVのバージョンも上がっていて,ライブラリーの名前などが以前とは変わっているようなので,それに応じてMakefileも少し修正を必要とした。ちなみに,OpenCVもboostもHomebrewでインストールした。バージョンは brew info によれば,それぞれ opencv: stable 2.4.5, boost: stable 1.54.0 (bottled) となっている。

やっていることは,次の通り。

  • 赤チャンネルだけを抽出することでグレースケールに変換
  • 上下左右の余白を白で塗りつぶす
  • Lanczos法により2倍に拡大
  • ルックアップテーブルを作成することにより,レベル補正,ガンマ補正
  • 2値化
  • PNGで保存

レベル補正,ガンマ補正の式が多分正しくない。gamma=1のときは直線補間だから正しいと思うが,それ以外のときの式がわからない。ImageMagickの level high low gamma と同じにしたいのだが。これは今後の課題。

PNGで保存しているが,可能であれば,CCITT G4圧縮のTIFFで保存したい。これも今後の課題。

#include "cv.h"
#include "highgui.h"
#include <boost /program_options.hpp>
#include </boost><boost /filesystem/operations.hpp>
#include </boost><boost /filesystem/path.hpp>
#include </boost><boost /filesystem/fstream.hpp>
#include <iostream>
using namespace boost;
using namespace std;
namespace fs = boost::filesystem;

//---------------------------------------------------------------
// my_Level
// レベル補正・ガンマ補正 
// (ImageMagickの convert -level white_point black_point gamma と同じにしたいのだが)
// src    = 入力画像
// dst    = 出力画像
// high   = ホワイトポイント (0..255)
// low    = ブラックポイント (0..255)
// gamma  = ガンマ補正値
// 注意:暫定版。ガンマ補正の式はこれで正しいのか不明。
// 0<x &lt;1 と正規化したとき,f(x)={(x-low)/(high-low)}^{1/gamma} としてみた。
//---------------------------------------------------------------

// グローバル変数
uchar g_LUT&#91;256&#93;; // Lookup table用の配列
CvMat g_lut_mat;  // それをopencvの行列とみなしたもの

void make_lut(int high, int low, double gamma){
    int i;
    double x;
    const double p = 1.0 / gamma ;
    const double a = (double) low;
    const double b = (double) high;
  
    //補正用のルックアップテーブルの作成
    for (i=0; i<low; i++) { g_LUT&#91;i&#93; = 0; }
    for (i=high; i&lt;256; i++) { g_LUT&#91;i&#93; = 255; }
    for (i=low; i<high; i++) 
    {
      x = (double) i;
      // 16階調にする場合 16x16=256
      //g_LUT&#91;i&#93; = cvCeil( ((x-a)/(b-a)) * 15 ) * 16;
      g_LUT&#91;i&#93; = cvCeil( 255.0 * pow((x-a)/(b-a), p) );
    }
 
    //CvMatへ変換
    g_lut_mat = cvMat(1, 256, CV_8UC1, g_LUT);
}

void my_Level(IplImage* src, IplImage* dst) {
  //ルックアップテーブル変換
  cvLUT(src, dst, &g_lut_mat);
}

IplImage *adjust_image(IplImage *img, program_options::variables_map argmap){
  int cleft = argmap&#91;"cleft"&#93;.as<int>();
  int cright = argmap["cright"].as<int>();
  int ctop = argmap["ctop"].as</int><int>();
  int cbottom = argmap["cbottom"].as</int><int>();
  int threshold = argmap["threshold"].as</int><int>();

  const int w = img->width;
  const int h = img->height;
  const int w1 = 2*w;
  const int h1 = 2*h;
  const int x1 = cleft;
  const int x2 = w-cright;
  const int y1 = ctop;
  const int y2 = h-cbottom;

  IplImage *img_gray;

  //赤チャンネルを抽出してグレースケールの画像を得る
  //チャンネル毎に分割して,赤チャンネル以外は捨てる
  // IplImageはB,G,Rの順に格納されている
  // アルファチャンネルは用いないので,5番目の引数はNULLにしておく
  // cvSplit(img,channelB,channelG,channelR,NULL);
  img_gray = cvCreateImage(cvSize(w,h),IPL_DEPTH_8U,1);
  //cvCvtColor(img, img_gray, CV_BGR2GRAY);
  cvSplit(img,NULL,NULL,img_gray,NULL);

  //周囲を白で塗る
  cvRectangle(img_gray, cvPoint (0,0), cvPoint (x1,h), cvScalar (255), CV_FILLED, 8, 0);
  cvRectangle(img_gray, cvPoint (x2,0), cvPoint (w,h), cvScalar (255), CV_FILLED, 8, 0);
  cvRectangle(img_gray, cvPoint (0,0), cvPoint (w,y1), cvScalar (255), CV_FILLED, 8, 0);
  cvRectangle(img_gray, cvPoint (0,y2), cvPoint (w,h), cvScalar (255), CV_FILLED, 8, 0);

  //2倍に拡大
  IplImage *img_resize = cvCreateImage(cvSize(w1,h1), IPL_DEPTH_8U, 1);
  cvResize(img_gray, img_resize, CV_INTER_LANCZOS4);

  //レベル補正
  IplImage *img_level = cvCreateImage(cvSize(w1,h1), IPL_DEPTH_8U, 1);
  my_Level(img_resize, img_level);

  if (threshold > 0) {
    // 2値化する場合
    IplImage *img_bin = cvCreateImage(cvSize(w1,h1), IPL_DEPTH_8U, 1);
    // ガウシアンフィルタで平滑化を行う
    // cvSmooth (img_level, img_level, CV_GAUSSIAN, 5);
    // 2値化
    cvThreshold(img_level, img_bin, threshold, 255, CV_THRESH_BINARY);
    //cvThreshold(img_level, img_bin, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU); // 大津の手法
    // メモリー開放
    cvReleaseImage(&img_gray);
    cvReleaseImage(&img_resize);
    cvReleaseImage(&img_level);
    // 2値化した画像へのポインターを返す
    return img_bin;
  } else {
    // グレースケールで出力する場合
    // メモリー開放
    cvReleaseImage(&img_gray);
    cvReleaseImage(&img_resize);
    // レベル補正したグレースケール画像へのポインターを返す
    return img_level;
  }
}

int main(int argc, char* argv[]) {
  program_options::options_description opts("options");
  opts.add_options()
    ("help", "ヘルプを表示")
    ("high", program_options::value</int><int>()->default_value(255), "level high")
    ("low", program_options::value</int><int>()->default_value(0), "level low")
    ("gamma", program_options::value<double>()->default_value(1.0), "level gamma")
    ("threshold,t", program_options::value<int>()->default_value(-1), "binarize threshold")
    ("input,i", program_options::value<string>(), "input directory name")
    ("output,o", program_options::value</string><string>(), "output directory name")
    ("cleft", program_options::value<int>()->default_value(0), "crop left (pixel)")
    ("cright", program_options::value</int><int>()->default_value(0), "crop right (pixel)")
    ("ctop", program_options::value</int><int>()->default_value(0), "crop top (pixel)")
    ("cbottom", program_options::value</int><int>()->default_value(0), "crop bottom (pixel)");
  program_options::variables_map argmap;
  program_options::store(parse_command_line(argc, argv, opts), argmap);
  program_options::notify(argmap);
  if (argmap.count("help") || !argmap.count("input") || !argmap.count("output") ||
      !argmap.count("high") || !argmap.count("low")) {
    cerr < < "&#91;input, output, high, low&#93; required" << endl;
    cerr << opts << endl;
    return 1;
  }

  int high = argmap&#91;"high"&#93;.as<int>();
  int low  = argmap["low"].as</int><int>();
  double gamma  = argmap["gamma"].as<double>();

  // ルックアップテーブルを作成する。ルックアップテーブルはグローバル変数 g_lut_mat である。
  make_lut(high,low,gamma);

  string in_dir = argmap["input"].as<string>();
  fs::path path = complete(fs::path(in_dir));
  fs::directory_iterator end;
  for (fs::directory_iterator i(path); i!=end; i++){
    string img_fullname = in_dir + i->path().filename().string();
    cout < < img_fullname << endl;
    IplImage *img, *img_result;
    img = cvLoadImage(img_fullname.c_str());
    if(!img){
      cerr << "image file load error" << endl;
    }
    else{
      img_result = adjust_image(img, argmap);
      // string out_filename = argmap&#91;"output"&#93;.as<string>() + "/" + i->path().filename().string();
      string out_filename = argmap["output"].as</string><string>() + "/" + i->path().stem().string() + ".png";
      cvSaveImage(out_filename.c_str(), img_result);
      cvReleaseImage(&img);
      cvReleaseImage(&img_result);
    }    
  }
}

HomebrewのImageMagickをupgradeしたのだが

久しぶりに ImageMagick をターミナルから使おうとしたら,

dyld: Library not loaded: /usr/local/lib/libtiff.3.dylib

というメッセージが出て,起動しなかった。いろいろ入れているうちに,シンボリック・リンクが壊れているのかも。というか,そもそも ImageMagick をどれで入れたのか記憶がない。Homebrewだった気もするが,自信なし。ということで,brew upgrate imagimagick として最新のにした。そのときのコンソール出力が以下。

rdguru:~ aqua$ brew upgrade imagemagick
==> Upgrading 1 outdated package, with result:
imagemagick 6.8.6-3
==> Upgrading imagemagick
==> Installing imagemagick dependency: libtool
==> Downloading http://ftpmirror.gnu.org/libtool/libtool-2.4.2.tar.gz
######################################################################## 100.0%
==> ./configure --prefix=/usr/local/Cellar/libtool/2.4.2 --program-prefix=g --enable-ltdl-install
==> make install
==> Caveats
In order to prevent conflicts with Apple's own libtool we have prepended a "g"
so, you have instead: glibtool and glibtoolize.

This formula is keg-only: so it was not symlinked into /usr/local.

Xcode 4.2 and below provide glibtool.

Generally there are no consequences of this for you. If you build your
own software and it requires this formula, you'll need to add to your
build variables:

    LDFLAGS:  -L/usr/local/opt/libtool/lib
    CPPFLAGS: -I/usr/local/opt/libtool/include

==> Summary
 /usr/local/Cellar/libtool/2.4.2: 66 files, 2.2M, built in 22 seconds
==> Installing imagemagick
==> Downloading http://downloads.sf.net/project/machomebrew/mirror/ImageMagick-6.8.6-3.tar.bz2
######################################################################## 100.0%
==> ./configure --disable-osx-universal-binary --without-perl --prefix=/usr/local/Cellar/imagemagick/6.8.6-3 --enable-sh
==> make install
  /usr/local/Cellar/imagemagick/6.8.6-3: 1435 files, 21M, built in 2.2 minutes

よく分からないのだが,Apple標準のlibtoolと衝突してるから,インストールはしたけど,/usr/local にシンボリック・リンクを作ってないよ,ということだろうか。

ScanSnapの白黒2値読み取りについて

文字主体の本はできれば白黒2値,それが読みにくいなら16階調グレースケールにすることを念頭において,白黒2値化について実験中なのだが,とりあえず,ScanSnap IX500 の白黒2値読み取りについてのメモ。

300dpi カラー読み取りの画像を,赤チャンネル抽出によるグレースケール化,レベル補正,白黒2値化したものと比較すると,直接ScanSnapから300dpi 白黒でスキャンした画像の方が,品質が高そうに思える。

これが,300dpi カラーで読み取ったままの画像。

300dpiカラー圧縮度1

全体的に紙焼けがあるものの,文字は読みやすく,ファイルサイズを気にしなければ,実用上は問題ない。これを1つ前の日記に書いたように,画像梱包,Ralpha, XnView を用いて白黒2値にしたものが,次の画像。

300dpiカラー圧縮度1から白黒2値に変換

紙焼けも除去されていて,まずまずだと思う。ところが,ScanSnapから直接300dpi 白黒で読み込んだ次の画像と較べてみると,明らかに後者の方が品質がよさそうなのである。

300dpi白黒

紙の左端の方に紙焼けの影響が残ってはいるが,それ以外は手動で白黒化したものよりも綺麗というのが,納得の行かないところ。そんなに素晴らしいアルゴリズムなのか?

ところが,画像のサイズを見ると,この白黒画像は縦横ともに300dpiカラーの2倍あるのだ!これはどういうことだろうか。想像だが,300dpiで読み取ったものを2倍に拡大して,それから白黒2値化しているのではないだろうか。そう言えば,スーパーファインについては 300dpi (白黒は600dpi相当) と不思議な事が書いてあった。600dpi相当というのは,そういうことなのかもしれない。

そこで,実験。300dpiカラーで読み取った画像に対して,2倍に拡大(アルゴリズムはLanczos)した後に,白黒2値化を手続きを施してみた。それが次の画像。

300dpiカラー圧縮度1を600dpiに拡大したのち白黒2値に変換

紙焼け除去のためのレベル補正とかの影響を除けば,ScanSnapの300dpi白黒とほぼ同じ品質だと思う。ファイルサイズも,CCITT FAX G4圧縮のTIFFファイル同士で,ほぼ同じであった。

というような訳で,断言は出来ないが,ScanSnapが生成する白黒画像は,おそらくは2倍にリサンプリングしたのちに2値化しているのだろうと思う。だから,白黒とカラーのどちらか一方を選ぶとすれば,フルカラーの方が良いかも。白黒2値化はあとでソフトウェア的に行えるのだから。まあ,それが面倒なら白黒でも悪くはないのだが。

自炊事始め2

裁断の要領や注意点(紙がくっついてないかを、くどいくらいにチェックすること)も分かってきたので、いよいよハードカバーの書籍の解体・裁断・スキャンをやってみた。

少々ためらったが、シュヴァルツの解析学(全7巻)を遡上に。まずは、第7巻から。魚をさばくのに比べればずっと楽。(というか、やったことないから、想像だが。) 本体と表紙をくっつけているガーゼ(?)のような部分があるので、カッターで真っ直ぐに切ると、繋ぎ目がきれいに外れるようだ。上手くやると背表紙に傷をつけることなく、ハードカバーだけがパカっと取れる。まあ、どのみち廃棄するのではあるが、中には裁断後も残す本もあるだろうから。

裁断機Durodex 200DX, OFLAカッターハイパーH型, PLUS カッティングマット, アルミ直尺アル助

道具は、カッター、カッティングマット、定規、そして裁断機。

ハードカバーを解体・裁断 (シュヴァルツ 解析学7)

上で書いたように、脇の部分(?)というか、繋ぎ目を切断してハードバウンドを外す。読み取りはまだ試行錯誤中だが、網掛けの挿絵のない数学書の場合、白黒が一番読みやすいと思う。ScanSnapではPDFかJPEGしか選べないのだが、白黒だとJPEGも選べずにPDFの一択になってしまう。内部フォーマットはJPEGなのか、それともTIFFなのか、それも分からない。まあ、でも、これでまずまず満足の画質ではある。

白黒で読み取ったページ

念のため、カラーのJPEGでも読み取っておくことにした。圧縮もレベル2と少なめにした。ホントはRAWというかTIFFかPNGで読み取ったものを原本にしたいところだが、まあ、その代わりといったところ。

カラーで読み取ったページ

白黒での読み込みも、実はカラーで読み取ってから、画像処理用のCPUか何かでソフトウェア的に白黒にしているのだと思う。だとすれば、カラーで読み取ってから、ImageMagickなどで変換するのと、(手間を除けば)変わらないのはず。

しかし、本を解体するのは、心理的な抵抗感があるなあ。そのうち慣れちゃうのかもだけど。

asymptoteで日本語TrueTypeフォントを使う

asymptoteでセプテンバーフォントを使おうとしたら,フォントが見つからないというエラーに遭遇した。あれこれ調べて,とりあえず解決したので,忘れないうちにメモ。

ログを見ると,latexはちゃんとdviファイルを生成している。これをdvipsが処理するのだが,ここで引っかかっていた。自分の環境では,問題点は2つあった。1つはdvipsが使うmapファイルで,もう1つはdvipsから呼び出されたGhostscriptがフォントを認識できないということ。

1つ目は,これは多分,自分だけの問題。TeX Live とかのパッケージじゃなくて,自分でちまちまビルドしてきたので,あちこち整合性が取れてなかったりしている可能性がある。特に,updmapあたりは以前にも問題生じたことあったし。今回,そこいらを一掃すべく,updmap (-sys) で生成された既存のmapファイルをすべて消去し,あらたに updmap-sys の方でmapを生成。それから,upTeX用のセプテンバーフォントの設定を,

r_up-sept-m-jis  UniJIS-UTF16-H  SeptM.ttf

とした。今まで

r_up-sept-m-jis  UniJIS-UTF16-H  :0:SeptM.ttf

としていたのだが,どうも :0: のせいで,dvips用Mapが生成されていなかった模様。

2つ目は,Ghostscriptがフォントを見つけられないという問題。使っているgsのバージョンは7.07.1なのであるが,どういう経緯でインストールしたものなのか記憶がない(汗)という状態。とりあえず,/usr/local/bin/ にgsはあり,設定ファイルなどは,/usr/local/share/ghostscript/7.07/lib/ 以下にあるようだった。ここに,CIDFnmapなるファイルがあって,ここに記載されているCIDフォントをgsは認識できる仕組みらしかった。

CIDFnmapをエディターで開いてみると,

(CIDFnmap.OSX) .runlibfile 

というような記述があり,ここから更に CIDFnmap.OSX を読んでいた。そこで,この CIDFnmap.OSX を開いてみると,次のような感じでフォントを読み込む設定が書かれている。

% Adobe-Japan1
%
%/MS-Gothic              (/usr/local/share/ghostscript/Resource/CIDFont/msgothic.ttf)        ;
%/MS-PGothic             (/usr/local/share/ghostscript/Resource/CIDFont/mspgothic.ttf)       ;
%/MS-Mincho              (/usr/local/share/ghostscript/Resource/CIDFont/msmincho.ttf)        ;
%/MS-PMincho             (/usr/local/share/ghostscript/Resource/CIDFont/mspmincho.ttf)       ;
/HiraKakuPro-W3         (/usr/local/share/ghostscript/Resource/CIDFont/HiraKakuPro-W3.otf)  ;
/HiraKakuPro-W6         (/usr/local/share/ghostscript/Resource/CIDFont/HiraKakuPro-W6.otf)  ;
/HiraKakuStd-W8         (/usr/local/share/ghostscript/Resource/CIDFont/HiraKakuStd-W8.otf)  ;
/HiraMaruPro-W4         (/usr/local/share/ghostscript/Resource/CIDFont/HiraMaruPro-W4.otf)  ;
/HiraMinPro-W3          (/usr/local/share/ghostscript/Resource/CIDFont/HiraMinPro-W3.otf)   ;
/HiraMinPro-W6          (/usr/local/share/ghostscript/Resource/CIDFont/HiraMinPro-W6.otf)   ;

ここで,行の先頭が%のものは,TeXと同様にコメントアウトされている。そのフォントを使いたい場合はコメントアウトをはずせばよいということだろう。そこで,ここにセプテンバーフォントの実体ファイルへの絶対パスを書き込んでみた。

/SeptM            (/Users/hoge/mytexhome/texmf/fonts/truetype/tashotai/SeptM.ttf)     ;

以上で設定は終了。これで,ちゃんとasymptoteからも,というかghostscriptでセプテンバーフォントが使えるようになった。分かってみると実は簡単なことであったが,なんだかんだで数時間を費やしてしまった。

MAMP上でWordPressをインストール

MAMPを入れたあとは,WordPressをMAMP上にインストール。これで,ローカルであれこれ実験できる環境が出来た。まずは,MathJaxとmathjax-latexプラグインを入れて,数式が表示できるようにした。そのままだとダラーで囲んだ部分が変換されないので,default.jsを編集して,ダラーを有効に,また,amsmathを有効にした。

実験というのは,WordPressを簡易データベースの代わりにできないかということ。カテゴリーやタグなどの機能があるから,十分可能性はあると思うのだが。

MAMP2.2.1

仕事で,ちょっと実験したいことがあるので,ローカルにWordPressをインストールすることにした。ということで,準備として MAMP をインストール。最新版のバージョンは,2.2.1 であるが,以前と違って,解凍すると pkg ファイルになっていた。インストールの場所は,/Applications/MAMP になっていたが,MAMPの名前を変えないようにという注意が表示された。一緒に MAMP PRO の体験版もインストールされるのだが,こちらは使う予定がないので,起動時のオプションをOFFにした。

「続きを読む」

Macのファインダーでパスを表示させる

いま,どの階層に居るのかが,ウィンドウのタイトルバーに表示されていれば便利なのになあ・・・と検索したら,そのものずばりを実現できることがわかった。ターミナルを起動して,

defaults write com.apple.finder _FXShowPosixPathInTitle -bool YES

として,ファインダーを再起動する。ほら,ウィンドウ上部のタイトル部分に /usr/local/ … とパスが表示されている。

タイトルバーにパス表示

最初からこうしてあれば良いのに〜。

Wineskin使ってWinアプリのChessBase11をMacで動かす

BootCampとかParallelsなどの仮想化環境でWindowsを動かすのとはちょっと違って、WindowsのAPIをMac上でサポートすることでWinアプリを動作させようというのが、Wineというもの。以前、Mikuinstallerというので一度Wineを入れたことはあるが、今回は、Wineskin Winery というものを使ってみた。参考にしたのは次のサイト。

Safx: WindowsアプリをMac上で簡単に動かせるようにするツールWineskin

Monoというものをインストールすることで、dotNet Frameworkにも (一応) 対応しているらしい。ダメ元で ChessBase11 を試してみた。

上記のサイトに従って、まずはWineskinをインストール。Wineskin Wineryを起動して、新規のWindowsアプリ用のラッパーを作成する。名前をChessBase11とし、ChessBase11/Setup/Setup.msi を起動させる。すると、インストーラーの画面が現れて、あとは指示に従うだけ。とりあえず初期設定終わって、なんとかインストール出来たみたいだ。

あとは、アイコンをWin用のCBase11.icoからMacのCBase11.icnsに変換すれば、ChessBase11.appというマック用のアプリが出来上がる。

Chessbase11 on Wineskin Winery

さっそく、ゲームを検索。スクリーンショットを撮ってみた。ちなみにこれは、1974年のKarpov-Kortchnoiの第2戦、シシリアン・ドラゴンのゲーム。メニューのフォントがちょっと読みにくいので、ここを何とかしたいのであるが、まあ、それはそのうちってことで。