term タグ別の記事一覧

オープンソースなデバッガのニューカマー「lldb」、LLVMのサブプロジェクトとして登場

 ここ数年注目されているコンパイラ環境「LLVM」が、サブプロジェクトとして「LLDB」なるデバッガを開発するよとアナウンスしている(LLVM Project Blog)。

 LLVMは「コンパイラインフラストラクチャ」という形で開発が進められているのだが、このLLDBは現代的な「デバッガインフラストラクチャ」とのことで、モジュラー化構造や再利用しやすいライブラリが特徴らしい。LLDBはLLVMの技術やAPI、パーサー、コードジェネレータ、JITコンパイラなどを利用して構築されているとのこと。

 現在は開発中の段階で、Mac OS Xでのコマンドラインでのデバッグのみに対応しているとのことだが、scriptableだったり、マルチスレッド対応など面白い話もある。さらに現状ではGDBよりも高速だそうで、特にC++プログラマにとっては使いやすいものになっているらしい。

MSys&MinGWをインストール

  MinGW でのビルドを前提とされたツールをCygwin上でビルドするのが面倒だったので全力で MSys とMinGWをインストールした。MSysGitも入っているので環境汚れまくり。

  SourceForge.JP のミラーからMinGW 5.1.4.exeとMSYS-1.0.11-rc-1.exeをダウンロードしてそれぞれインストール。MSYSは結構下の方(MSYS Base Systemの中)にあるので探す。

 それぞれインストール後、「C:\msys\1.0\etc\fstab.sample」を同じディレクトリに「fstab」という名前にコピー、下記のようにMinGWとActivePerlをインストールしているディレクトリに対応付ける。

c:/MinGW		/mingw
c:/Perl	/perl

 あとはスタートメニューの「MinGW」?「MSYS」?「MSYS」などからシェルを起動。gccがエラーを日本語で吐いてくれるのだがWindowsのコマンドプロンプトだと化けるのでexport LANG=Cを適宜設定。

GCC 4.4系を使う

 GCC 4.4系を使うには別途インストールが必要。「gcc-4.4.0-mingw32-notes.txt」に解説があるが、下記をMinGWのインストールディレクトリで展開すればよい。

GMP Runtime [REQUIRED]
gmp-4.2.4-mingw32-dll.tar.gz
MPFR Runtime [REQUIRED]
mpfr-2.4.1-mingw32-dll.tar.gz
POSIX Threads for Win32 Runtime [REQUIRED]
pthreads-w32-2.8.0-mingw32-dll.tar.gz
Core (C) [REQUIRED]
gcc-core-4.4.0-mingw32-bin.tar.gz、gcc-core-4.4.0-mingw32-dll.tar.gz
C++ [OPTIONAL]
gcc-c++-4.4.0-mingw32-bin.tar.gz、gcc-c++-4.4.0-mingw32-dll.tar.gz

 なお、ドキュメントにはgcc-full-4.4.0-mingw32-bin.tar.lzmaに全部入っていると書いてあるが、GMPとMPFRとPOSIX Threadは入っていなかった……(汗)。

Pythonのクラスの挙動を調べる:class構文の外でクラスにメンバ関数を追加(2)

 今度は、別のモジュールで定義したクラスにメンバ関数を追加してみる。

[Macintosh:~]$ python
Python 2.5.1 (r251:54863, Feb  6 2009, 19:02:12)
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.

   # importすることで定義されたクラスは、その名前空間内に閉じこめられる 

>>> import foobar
>>> print foobar.FooBar
<class 'foobar.FooBar'>

   # 名前空間が異なっていても、名前空間さえ指定すればメンバ関数を追加できる 

>>> f = foobar.FooBar()
>>> f.show_name()
I'm FooBar.
>>> def rename(self,new_name):
...     self.name = new_name
...
>>> foobar.FooBar.rename = rename
>>> f.rename("john")
>>> f.show_name()
I'm john.

 大体予想通りの結果ですな。

新プロジェクト「BlueGriffon日本語版」始めました

 突発的に新プロジェクトBlueGriffon日本語版」を始めました( プロジェクトのトップページ )。

 BlueGriffonは古くはNetscape Navigator Goldに端を発したMozilla系のHTMLエディタで、Nvu、KompoZerなどの後継ソフトだそうです。本家は bluegriffon.org

 BrueGriffonはXULベースで作成されており、レンダリングエンジンはもちろんGecko。XULベースなのでFirefoxなどと同じ感じで日本語化できるので、ちょっと日本語化してみました。まだ本家も開発版という位置付けで、基本的なHTML編集くらいしかできないんですがざっとテキストリソースを見る限り良さげな感じです。

 ということで期待しつつ、様子をみる感じで日本語化。しかし本家の開発リソースは少なそうなので開発の進捗はちょっと遅めの模様。まぁ請うご期待、ということで。

cl.exeの主要コマンドラインオプションメモ

 最近、Visual C++をいじっているのでメモ。昔はVisual StudioでGUIでビルド設定してましたが、最近はもうmakeを使う方になれちゃったんだよね……。

  <th>
    意味
  </th>
</tr>

<tr>
  <th colspan="2">
    最適化
  </th>
</tr>

<tr>
  <td>
    /O1
  </td>
  
  <td>
    コードを最小化
  </td>
</tr>

<tr>
  <td>
    /O2
  </td>
  
  <td>
    コードを最速化
  </td>
</tr>

<tr>
  <td>
    /Ob{0|1|2}
  </td>
  
  <td>
    インライン展開方法を指定
  </td>
</tr>

<tr>
  <td>
    /Od
  </td>
  
  <td>
    最適化を禁止
  </td>
</tr>

<tr>
  <td>
    /Oi
  </td>
  
  <td>
    組み込み関数を使用
  </td>
</tr>

<tr>
  <td>
    /Ox
  </td>
  
  <td>
    最大限の最適化
  </td>
</tr>

<tr>
  <td>
    /GL
  </td>
  
  <td>
    プログラム全体の最適化を使用
  </td>
</tr>

<tr>
  <td>
    /arch:{SSE|SSE2}
  </td>
  
  <td>
    SSE/SSE2を使用
  </td>
</tr>

<tr>
  <th colspan="2">
    作成するコード
  </th>
</tr>

<tr>
  <td>
    /MD
  </td>
  
  <td>
    DLL版ランタイムライブラリを使用。/MDdとするとデバッグバージョンを作成
  </td>
</tr>

<tr>
  <td>
    /MT
  </td>
  
  <td>
    スタティック版ランタイムライブラリを使用。/MTdとするとデバッグバージョンを作成
  </td>
</tr>

<tr>
  <td>
    /LD
  </td>
  
  <td>
    DLLを作成。/LDdとするとデバッグバージョンを作成
  </td>
</tr>

<tr>
  <td>
    /Fe<ファイル名>
  </td>
  
  <td>
    出力するEXEファイル名を指定
  </td>
</tr>

<tr>
  <td>
    /Fo<ファイル名>
  </td>
  
  <td>
    objファイルを出力する
  </td>
</tr>

<tr>
  <td>
    /Zi
  </td>
  
  <td>
    デバッグ情報を生成
  </td>
</tr>

<tr>
  <th colspan="2">
    そのほか
  </th>
</tr>

<tr>
  <td>
    /D<シンボル>
  </td>
  
  <td>
    シンボルを定義(#defineと同等)。値を指定する場合は/D<シンボル>=<値>とする
  </td>
</tr>

<tr>
  <td>
    /I<パス>
  </td>
  
  <td>
    追加インクルードディレクトリを指定
  </td>
</tr>

<tr>
  <td>
    /X
  </td>
  
  <td>
    標準インクルードパスを無視
  </td>
</tr>

<tr>
  <td>
    /w
  </td>
  
  <td>
    ワーニング出力を無効にする
  </td>
</tr>

<tr>
  <td>
    /Wall
  </td>
  
  <td>
    すべてのワーニング出力を有効にする
  </td>
</tr>

<tr>
  <td>
    /link
  </td>
  
  <td>
    リンカにオプションを渡す
  </td>
</tr>
cl.exeのコマンドラインスイッチ
スイッチ
  <th>
    意味
  </th>
</tr>

<tr>
  <td>
    /DEBUG
  </td>
  
  <td>
    デバッグ情報(PDBファイル)を作成
  </td>
</tr>

<tr>
  <td>
    /DEF:<ファイル名>
  </td>
  
  <td>
    モジュール定義ファイルを指定
  </td>
</tr>

<tr>
  <td>
    /DLL
  </td>
  
  <td>
    DLLを作成
  </td>
</tr>

<tr>
  <td>
    /EXPORT:entryname[&#44;@ordinal[&#44;NONAME]][&#44;DATA]
  </td>
  
  <td>
    エクスポートする関数を指定
  </td>
</tr>

<tr>
  <td>
    /LIBPATH:<パス>
  </td>
  
  <td>
    追加のライブラリパスを指定
  </td>
</tr>

<tr>
  <td>
    /LTCG
  </td>
  
  <td>
    リンク時のコード生成を有効化。/GLを指定してコンパイルしたオブジェクトファイルのリンクに必要
  </td>
</tr>
link.exeのコマンドラインスイッチ
スイッチ

Gitでローカルファイルのバックアップ

 Gitでローカルファイルの差分バックアップをやってみるテスト。

前提:

  • ミラーリングされているファイルサーバーがある
  • いままでは作業用PCがクラッシュしても大丈夫なように、作業後にいちいちファイルをファイルサーバー中のディレクトリに上書きコピーしていた
  • ファイル数が多くなる/容量が大きくなると面倒
  • これだと履歴管理ができない(Emacsの~.1のようなバックアップファイルに頼ることに)

 ということで、下記の手順でGitで差分バックアップをやってみる。

  1. 作業ディレクトリをgitリポジトリ化する。

    $ git init
    $ git add <対象ファイル>
    $ git commit -m “<コメント>”
    

  2. ファイルサーバーにgitのbareリポジトリを作る

    $ cd <バックアップディレクトリ>
    $ mkdir <適当なディレクトリ名>.git
    $ cd <ディレクトリ名>.git
    $ git init –bare
    

  3. ファイルサーバー内のbareリポジトリにコミット

    $ cd <作業ディレクトリ>
    $ git remote add origin <ファイルサーバー上のbareリポジトリのパス>
    $ git push master:master
    

 あとは作業が一段落したタイミングごとにコミット+pushをしていけばいいだけのはず。しかしこういう目的で使い出すとWindows上で動く、使いやすいGUIフロントエンドがほしくなるところではある。

開発メモ:ソースコード中文字列のローカライズ

 OS Xでは、ソースコード中の文字列をローカライズする仕組みとして「Stringsファイル」というものが用意されている。これは、ソースコード中で使用する文字列データをリソースフォルダ中のStringsファイル(拡張子は.string)からロードする仕組みで、言語環境に会わせて使用するStringsファイルを切り替えることで、それぞれの言語に合わせた文字列を選択できるようにするものだ。

 なお、詳細なドキュメントとしてはADCの Internationalization Programming Topics: Strings Files があるので、こちらも参照すべし。

Stringsファイルの構造

 Stringsファイルの構造は次のようになっている。

/* Insert Element menu item */
"Insert Element" = "Insert Element";
/* Error string used for unknown error types. */
"ErrorString_1" = "An unknown error occurred.";

 「/*」〜「*/」ガコメントで、続いて「”キー” = “文字列”」というデータが並ぶ構造となっている。Stringsファイルはアプリケーションバンドルの「<言語名>.lproj」ディレクトリ以下に収納されている。ちなみにデフォルトのStringsファイル名は「Localizable.strings」だが、任意の名前を付けることが可能。

Stringsファイルから文字列をロードする

 Strginsファイルから文字列を取り出すには、下記の関数を利用できる、

  • Core Foundation macros:

  • CFCopyLocalizedString

  • CFCopyLocalizedStringFromTable

  • CFCopyLocalizedStringFromTableInBundle

  • CFCopyLocalizedStringWithDefaultValue

  • Foundation macros:

  • NSLocalizedString

  • NSLocalizedStringFromTable

  • NSLocalizedStringFromTableInBundle

  • NSLocalizedStringWithDefaultValue

 たとえばデフォルトStringsファイル(Localizable.strings)中に下記のような記述があったとする。

/* A comment */
"Yes" = "はい";

 この場合、下記のようにしてローカライズ文字列を読み出せる。

NSString* theString;
theString = NSLocalizedString (@"Yes", @"A comment");

 なお、NSLocalizedStringの第2引数は省略可能。また、Localizable.strings以外のStringsファイルからテキストをロードしたい場合はNSLocalizedStringFromTableを利用する。

Stringsファイルを作成するツール

 ローカライズする文字列を抜き出すためのツールとして、「genstrings」というものがある。たとえば、下記のように実行すると、カレントディレクトリ以下の*.mファイルからローカライズすべきテキストを抜き出し、Japanese.lprojディレクトリ以下のLocalizable.stringsファイルに書き出すとともに、*.mファイル中のテキスト文字列を「NSLocalizedString(@”文字列”, @”)に置き換えてくれる。

genstrings -o Japanese.lproj *.m