2008-10-30

Debian で無線 LAN (Air Mac Express)

Panasonic Let's note CF-W2 に debian をインストールし AirMac Express につなぐ.

  • Intel® PRO/Wireless 2100 Driver Firmware から firmware を持ってくる.
  • /usr/lib/hotplug/firmware ディレクトリにコピーして reboot.
  • wpasupplicant をインストール.
    # aptitude install wpasupplicant
    
  • /etc/network/interface を変更.
    iface eth1 inet dhcp
        wpa-ssid ESSID
        wpa-psk PasSwoRd
    
  • インタフェースの起動.
    # ifup eth1
    

2008-10-12

AirMac Express のリセット

リセットボタンを10秒間押して離すとリセットされる.しかし,これでは11n+g, 11n+aの選択などはリセットされない.

完全リセットするには,コンセントを挿した直後に上記の操作を行なえばよい.

2008-09-21

MacPorts のルーチンワーク

$ sudo port -d selfupdate
$ sudo port -d sync
$ port outdated
$ sudo port -d upgrade installed

active でないものを消す

$ sudo port -uf uninstall

2008-08-27

Garage Band Jam Pack

Garage Band Jam Pack (Logic Studio 付属) はインストールすると本体のハードディスクにインストールされる.これを外部ディスクに追い出すにはどうするか?

1. 外部ディスクにディレクトリを作成

$ mkdir -p "/Volumes/LagrangeExt/Library/Audio/Apple Loops/Apple"

2. 本体にインストールされた Jam Pack を mv する.

$ mv "/Library/Audio/Apple Loops/Apple/Jam*" "/Volumes/LagrangeExt/Library/Audio/Apple Loops/Apple"

3. 本体の Apple Loops ディレクトリにシンボリックリンクを作成する.

$ cd "/Volumes/LagrangeExt/Library/Audio/Apple Loops/Apple"
$ ln -s "/Volumes/LagrangeExt/Library/Audio/Apple Loops/Apple/" LagrangeExt

4. Garage Band の Loop Index を作成し直す

  • ディレクトリ /Library/Audio/Apple Loops Index 内のファイルを消して GarageBand を起動する.

2008-06-23

SCons で一つのソースから複数のターゲットを作る

SCons で一つのソースから複数のターゲットを作るときにうまくいかないのでテストしてみる.

def XXXBuilder():
    return Builder(action = "perl xcommand $SOURCES")

def YYYBuilder():
    return Builder(action = "perl ycommand $SOURCES")

env = Environment(BUILDERS = { "XXX":  XXXBuilder(), "YYY": YYYBuilder() })

env.XXX("src.aaa.xxx", "src.aaa")
env.YYY("src.aaa.yyy", "src.aaa")

ここで,xcommand file は file から file.xxx を生成,また,ycommand file は file から file.yyy を生成.

これを実行するとうまくいった.

うまくいかないと思い込んでいたのは,

env.XXX(None, "src.aaa")
env.YYY(None, "src.aaa")

のようにしていたため.このようにしていたのは,この場合の一つのコマンドが一つのソースから複数のターゲットを生成するのに対応しようとしたため.(→そうではなく,scons -c で消去されないようにするためだった)

あらためて,一つのコマンドで一つのファイルから複数のターゲットを生成する方法を検証してみると,以下で全く問題なかった(もちろん xcommand で .xxx と .yyy を生成するようにした上で).

env.XXX(["src.aaa.xxx", "src.aaa.yyy"], "src.aaa")

2008-06-20

ssh によるポートフォワーディング(リモート→ローカル)

First Try

リモート側のポートに対するアクセスを転送するには -R オプションを用いる.

$ ssh -N -R 1234:intraserv:4321 publicserv

これによって,publicserv のポート 1234 に対するアクセスが,このコマンドを実行したマシンから見た intraserv:4231 に転送される.

ただし,デフォルトでは publicserv のループバックアドレスのみとバインドされるので publicserv 以外からのアクセスが不能である.これは /etc/ssh/sshd_config に以下の行を設定することで解決できる.

GatewayPorts yes

Second Try

しかしそれではちょっと危険なので,ローカル→リモートのポートフォワーディングと組み合わせてみる.

/etc/ssh/sshd_config を元に戻してから,先ほどと同様に

$ ssh -N -R 1234:intraserv:4321 publicserv

とする.publicserv においては localhost:1234 で intraserv:4321 にアクセスできるが,外部からは接続不能である.そこでアクセスしたいマシンで以下のようにする.

$ ssh -N -L 1234:localhost:1234 publicserv

これで万事OK.

2008-06-10

Silverlight 最初の一歩

3つのファイルが必要.

  • Silverlight.js
    SDKから持ってくるのが本道だが,面倒なので添付しておく
  • sample.html
    <html>
    <head> 
    <script src="Silverlight.js"></script>
    <body>
    <div id="iA"></div>
    <script>
    Silverlight.createObject(
        "sample.xaml",
        document.getElementById("iA"),
        "iA",
        { width: "300", height: "300", version: "1.0" });
    </script>
    
  • sample.xaml
  • <Canvas xmlns="http://schemas.microsoft.com/client/2007">
     <Ellipse Height="200" Width="200" Stroke="Black" StrokeThickness="10"/>
    </Canvas>
    

これで sample.html を読み込むと円が描画される.

参考文献

Silverlight QuickStart: Welcome to Silverlight

2008-05-23

LL(*) について

The Definitive ANTLR Reference に次のような節があった.

以下は LL(*).

decl : modifier* 'int' ID '=' INT ';'
     | modifier* 'int' ID ';'

modifier
     : 'static'
     | 'register'
     ;

以下は LL(*) でない.

decl : 'int' declarator '=' INT ';'
     | 'int' declarator ';'

declarator
     : ID
     | '*' declarator
     ;

理由として書いてあるのは,選択肢(右辺)が再帰的な規則への参照を持っているから,ということである.この理由は,プッシュダウンオートマトンではなく DFA を利用して選択肢を決定していることから帰結されるとも書いてある.

よく考えてみなくてはならない.

ちなみに上のどちらも LALR(1) で問題なく受理される.

2008-05-15

字句解析・構文解析の調査

プログラミング言語の字句解析・構文解析を調べている.

今回の調査の目的は,既に文法定義が存在する言語の字句解析・構文解析プログラムを作成する際の注意点を列挙することである.新しい言語の定義を行う際の注意点の列挙や,字句解析・構文解析プログラムの自動生成プログラムを作成する方法の調査は今回の目的ではない.

注意点の概要をまとめる.

  • 字句解析については特段に注意すべき点はない.
  • 構文解析アルゴリズムは LL(1) または LALR(1) のどちらか.
  • LL(1) は手書きに適している.
  • LALR(1) は自動生成プログラムが必要.
  • 構文解析における文法記述では,左再帰性・右再帰性に注意する必要がある.
    • LL(1) は最左導出を行うので,左再帰性があると構文解析ができない.
    • LALR(1) は最右導出を行うので,右再帰性があると効率が悪い.
  • LALR(1) についてはシフト還元構文解析の考え方を理解する必要がある.
    • 理解するには LR 状態や LR マーカ(ポインタ)の考え方を利用する.
    • 理解しなければならないわけは,構文解析プログラムの自動生成の際に発生するエラーに対処するため.
  • 文法のあいまいさを解決するには,
    • 文法を書き換える.
    • 演算子の優先度,結合性などのあいまいさ除去規則を利用する.
    という方法があるが,除去規則を用いたほうが効率がよく見通しがよい.

いつも間違えるのだが,最左導出とは,文法形式(規則の右辺)の中の非終端記号のうち,最も左のものを最初に(構文木の「上」のほうで)展開する導出である.右辺の選択肢(|による列挙)のうちの左右は関係ない.

参考文献

[1] 佐々政孝 「プログラミング言語処理系」 第4章.

[2] Levine et al. 「lex & yacc プログラミング」 第8章.

2008-05-12

OCaml 関連のパッケージ

OCaml 関連で便利そうなパッケージ.Debian の ocaml-core が依存しているパッケージをあげてみる.

ocaml-findlib
OCaml のパッケージ(関連するモジュールの集合)を扱うライブラリとコマンド.
ocaml-tools
よりよい vim 用のインデントサポート omlet.
camlidl
OCaml コードと C のグルーを IDL から生成するツール.
ocamlweb
OCaml 用の Knuth web システム.
libounit-ocaml-dev
ユニットテスト.
cameleon
グラフィカルな IDE.
cmigrep
ocamldsort
OCaml のソースファイルを依存関係によってソートして表示する.
ledit
otags
ctags for OCaml.
OCamlMakefile
OCaml 用の Makefile を書くためのヘルパー.
camlp4, camlp4-extra
OCaml 用のマクロ.

2008-05-06

Module::Starter::PBP による Perl モジュール雛形の作成

Perl のモジュールの雛形を作るには h2xs を使うのが定番だが,最近では Module::Starter を使うのがナウいということだ.さらに,Module::Starter::PBP を使うと Perl Best Practice に倣ったテンプレートでモジュールを作成できる.

まずインストール.

$ sudo aptitude install libmodule-starter-perl

説明書.

$ perldoc Module::Starter
$ perldoc Module::Starter::PBP

方法.

$ perl -MModule::Starter::PBP=setup
$ module-starter --module=Your::Module::Name
Unknown placeholder <MAIN PM FILE> in Makefile.PL

Ugh!

See TAKESAKO @ Yet another Cybozu Labs: [訂正] Webプログラミング実力アップ Part1 正しいPerl/CGIの書き方:ITpro

参考

2008-04-16

Trac で新規チケットの担当者欄をドロップダウンリストにする方法

Trac では通常,新規チケットの担当者欄(assign to:)の入力はテキストフィールドになっている.これを登録ユーザのドロップダウンリストにするには,conf/trac.ini[ticket] セクションの restrict_ownertrue にする.

2008-04-15

VMWare Fusion の不具合

VMWare Fusion でキーを入力しても受け付けなくなり,ビープが鳴るだけになることがたまにある.これを解決するには表示モードを変更する,例えばシングルウィンドウモードからフルスクリーンモードに切り替えると直る.

2008-04-13

Mac でのアプリケーション起動のカスタマイズ

Mac でアプリケーションの起動時にコマンドラインオプションを指定したい場合にはどのようにすればよいのか?Finder からアイコンクリックで通常のアプリケーションのように起動したいのである.

最初にシェルスクリプトを作成してみたところ,Terminal が実行されてその中でシェルスクリプトが実行されてしまった.これではかっこ悪い.

ネットをあさってみたところ,AppleScript でやるのがいいということがわかった.Firefox の別プロファイル起動を例にとって説明しよう.

  • アプリケーション > AppleScript > スクリプトエディタ を起動する.
  • 以下のコードを入力する.
    do shell script "/Applications/Firefox.app/Contents/MacOS/firefox-bin -P develop -no-remote > /dev/null 2>&1 &"
    
  • メニューから ファイル > 保存 を選択し,フォーマットをアプリケーション,オプションは何も指定しないで保存する.

最初試したときには AppleScript インタープリタアプリケーションが同時に起動してしまって困った.これは上のコードで /dev/null へのリダイレクトを行わなかったためで,何かが出力されてしまうとインタープリタアプリケーションは終了しないようだ.ただしこの場合でも Firefox を終了したらインタープリタアプリケーションも終了した(やや謎).

2010/1/12 追記

元のやり方では Snow Leopard になってから起動できなくなってしまった.firefox を firefox-bin にすると起動できるようになった.

2008-04-12

Mac 操作小ネタ

Command-Tab でアプリケーションを切り替えている最中、つまり Command を押したまま Tab を離した状態で Q を押すとそのアプリを終了することができる。

2008-04-02

Mac OS X で Samba マウント時のシンボリックリンク

Mac OS X で Samba サーバをマウントしたときのシンボリックリンクがクライアント側で解決されるシンボリックリンクとして見えてしまう。

これは Leopard かららしい。解決するには Samba サーバ設定で

unix extensions = No

とすればよい。SWAT でも設定可能。

2010/3/30 追記

最近もうひとつ設定のデフォルト値が変わったようで,またシンボリックリンク先が見られなくなった.以下を設定すればよい.

wide links = Yes

2008-03-24

Mac OS X で関連付けを変更

ファインダーで

ファイルを選択し,[情報を見る] を実行する.[このアプリケーションで開く] 区画でアプリケーションを選択し,[すべてを変更] ボタンを押す.

2008-03-23

Mac OS X の初期設定 (Tiger)

クリーンインストール

住所などの個人情報入力画面は Command-Q で回避できる.

USB Overdrive

システム環境設定

Dock
  • [Dock サイズ] を最大
  • [画面上の位置] を [左]
  • [Dock を自動的に隠す/表示] を on.
Spotlight
  • [Spotlight メニューのキーボードショートカット], [Spotlight ウインドウのキーボードショートカット] を off.
キーボードとマウス
  • [キーボード] タブ > [すべての F1, F2 ...] を on.
  • [キーボードショートカット] タブ > [フルキーボードアクセス] を [すべてのコントロール] に.
省エネルギー
  • [コンピュータがスリープするまでの待機時間] を [しない] に.
  • [ディスプレイがスリープするまでの待機時間] を [しない] に.

ターミナル

ターミナル>ウィンドウ設定

シェル シェルの終了時 ウィンドウを閉じる

ディスプレイ アンチエイリアス, ワイドグリフは2桁

文字セットエンコーディング EUC

フォント: Monaco 13

ウィンドウ 120x41

SKK

変換中に Return で確定しても改行しないようにする

メモ

OnyX

ターミナル→ウィンドウ

ssh

ASCII キーボード

Alt-F1 でアプリ内ウィンドウ切り替え

2008-03-19

X のフォント

X のフォント関係はややこしい.

  • 発端: Xming で接続し,GVim を起動したところ,メニューやタイトルバーのフォントがアンチエイリアスされていなかった.
  • Xming で XDMCP で接続し,KDE を起動するとアンチエイリアスされている.しかし,GTK アプリケーションを起動するとアンチエイリアスされていない.
  • Xming で XDMCP で接続し,Gnome を起動してもアンリエイリアスされていない.Gnome 設定でフォントを変更するとアンリエイリアスされた.
  • KDE に戻ると GTK アプリケーションのフォントはやはりアンチエイリアスされない.
  • 新しいテストアカウントを作り,ドットファイルなしで GTK アプリケーションを起動するとアンチエイリアスされていた.
  • 自分のアカウントの .fonts.conf を消すとアンチエイリアスされた.
  • .fonts.conf は KDE Control Center で設置され書き換えられるのでどのようにすればいいのだろうか?
  • 関係ないが,Xming の dpi の初期値が 75 なのでフォントが小さい.100 にしたい.→[Additional parameters for Xming] にて [-dpi 100] を設定すればよい.
  • XDMCP のときはどうすればいいか?

この後次のようなことが発生した.

  • XDMCP でログインできなくなった→テーマをひまわりのやつにするとログインできないことが判明(!).
  • gvim で日本語フォントを選ぶと1バイト文字がバン広に表示されるようになった.
    • ひとつの原因はプロポーショナルフォントを設定したことによる.Osaka-等幅のようなフォントを選ばなくてはならない.
    • ただ,Osaka-等幅を選んでもうまくいかない!!これは,日本語ロケールで gvim を起動し,Osaka-等幅を選ぼうとするのだが,なぜか Sans にフォールバックしてしまうのが原因.もう一度フォントの選択ダイアログを開かないとわからなかった.
    • 結論: 英語ロケールで gvim を起動すると Osaka-Mono という名前で選択できる.選択した後 :set guifont? で設定されている文字列を調べて .gvimrc に記述すればよい.
      set guifont=Osaka-Mono\ 11
      

2008-03-17

Xming はじめの一歩

  • Xming - PC X Server から Xming と Xming-fonts の public release をダウンロード.
  • PuTTY をインストールするかと聞かれるが,既にインストールしているはずなのでインストールしない.
  • フォントは全部選択する.
  • スタートメニューから XLaunch を起動する.
  • [Multiple windows], [Start a program], [kterm], [Using PuTTY (plink.exe)] を選択する.
  • [Connect to computer] に [hostname], [Login as user] に [username], [Password] に [] を入力する.
  • [Additional parameters for PuTTY or SSH] に [-i d:\etc\id_dsa.ppk] を入力する.
  • [Additional parameters for Xming] に [-dpi 100] を入力して 100dpi として起動したほうがいいと思われる(2008-0319 追記).

これで kterm が表示されるはずだが,うまくいかない(黙殺される).

問題はサーバ側で X11Forwarding を受け入れないようになっていたことであった.

$ sudo vi /etc/ssh/sshd_config
X11Forwarding yes

とする.

Debian で XDCMP を開放するにはどこをいじるんだろう?

→(2008-0319 追記) コンソールの gdm で [Configure Login Manager...] を選択する.[Remote] タブの [Style] から [Same as Local] を選択する.これらの設定は /etc/gdm/gdm.conf に保存されるので,これを直接書き換えてもよい.変更した後は sudo /etc/init.d/gdm restart が必要な模様.

Linux の inotify

Linux kernel 2.6.13 で inotify と呼ばれるファイルシステム監視機能が導入された.

試してみる.

$ sudo aptitude install inotify-tools
$ inotifywait -m /tmp &
$ touch /tmp/hoge
/tmp/ CREATE hoge
/tmp/ OPEN hoge
/tmp/ ATTRIB hoge
/tmp/ CLOSE_WRITE,CLOSE hoge
$ ls /tmp/hoge > /dev/null
/tmp/ OPEN,ISDIR
/tmp/ CLOSE_NOWRITE,CLOSE,ISDIR
$ kill %1

実地の利用には incron, inoticoming, iwatch などのツールがある.

例: blaise での www/i の監視.

$ inoticoming --logfile $HOME/var/log/inoticoming $HOME/www/i \
              --prefix 200 --chdir $HOME/www/i sh update.sh \;

2008-03-16

Firefox 2.0 の初期設定レシピ

基幹エクステンションのインストール

  • ブックマークの管理を起動し,全てのブックマークエントリとフォルダを消去する.
  • Google Browser Syncをインストール.
  • Tab Mix Plusをインストール.

オプション設定

  • 一般
    • [ホームページ]を設定.
    • [ファイルのダウンロード時にダウンロードマネージャを表示する]をoff.
    • [次のフォルダに保存する]にデスクトップ/workspaceを設定.
    • [起動時にFirefoxが既定のブラウザであるか確認する]をoff.
  • タブ
    • [同時に複数のタブを閉じるときは確認する]をoff.
    • [リンクを新しいタブで開いたとき,すぐにそのタブに切り替える]をon.
  • コンテンツ
    • [既定のフォント]の[詳細設定]で[対象言語][西欧]の[プロポーショナル]を[ゴシック体 (Sans-serif)]にし,[サイズ]を[18]にする.
    • 同じく[明朝体 (Serif)]を[Georgia]に[ゴシック体 (Sans-serif)]を[Verdana]にする.
    • 同じく[等幅 (Monospace)]の[サイズ]を[16]にする.
    • [対象言語][日本語]の[プロポーショナル]の[サイズ]を[18]にする.
    • 同じく[等幅 (Monospace)]の[サイズ]を[16]にする.
  • 詳細
    • [一般]タブの[自動スクロール機能を使用する]をoff.
    • 同じく[自動スペルチェック機能を使用する]をoff.

Tab Mix Plusのオプション

  • イベント | タブを開く
    • [新しいタブに]を[現在のページを複製して表示]に.
    • [複製したタブを元のタブの直後に開く]をoff.
  • イベント | タブを閉じる
    • [キーボードショートカットで最後のタブを閉じたとき,ウィンドウ自体は閉じない]をoff.
    • [現在のタブを閉じたとき,フォーカスを]を[直前にフォーカスしていた]に.
  • イベント | タブ機能
    • [Ctrl+Tabで最近表示した順にフォーカスを移す]をon.
  • 表示 | タブバー
    • [一段に収まらない数のタブを開いた場合,タブバーを]を[多段表示にする]に.
  • 表示 | タブ
    • [ハイライト]の[現在のタブ]をon.
    • [ハイライト]の[未読のタブ]をoff.
    • [スタイルをカスタマイズ]の[現在のタブ]を[太字][下線][文字色]赤に.
  • メニュー | タブのコンテキストメニュー
    • [新しいウィンドウに複製]をon.
    • [新しいウィンドウに移動]をon.

その他の拡張機能

  • All-in-One Gestures
  • Download Statusbar
    • [次の拡張子がつくファイルは自動除去]を[*]に.
  • Fasterfox
    • [最適化]を選択.
  • Fission
    • 色をオレンジに
  • Gmail Notifier
    • [アイコンをクリックしたときにGMailを]を[新しいタブに開く]に.
    • [アイコンをクリックしたときに未読数をリセットする]をon.
  • Greasemonkey
  • IE View
  • Image Zoom
  • InfoLister
  • Link Alert
  • More Tools Menu
  • Options Menu
  • Stylish
  • ViewSourceWith
  • Yahoo! Mail Notifier
    • [左クリック][Yahoo!メールを以下で開く]を[新しいタブ]に.

ツールバーのカスタマイズ

以下のアイコンをツールバーに追加(ドラッグアンドドロップ)

  • 新規ウィンドウ
  • 閉じたタブの復元
  • View Source With

2008-03-14

[読書] オブジェクト開発の神髄 UML 2.0 を使ったアジャイルモデル駆動開発のすべて

ストーリー

【1. 最先端のソフトウェア開発】 4つの開発技術 (オブジェクト,XML,RDB,Webサービス),4つの開発手法 (アジャイル,UML,統一プロセス,モデル駆動型アーキテクチャ) についての短評 (長所と短所の表).

【2. オブジェクト指向概念の基礎】 オブジェクト指向パラダイムの主要概念の説明.UML のクラス図,シーケンス図の基礎.関係の多重度.

【3. フルライフサイクルオブジェクト指向テスト (FLOOT)】 開発の全ての段階におけるテスト手法の羅列.

【4. アジャイルモデル駆動開発 (AMDD)】 かろうじて役に立つモデルのモデリングに関する大量のプラクティスの羅列.

【5. 利用モデリング】 ユースケースの書き方.UML のユースケース図.

2008-03-13

Subversion リポジトリのバックアップ

手順

ミラーリポジトリの作成.

# cd /usr/local/share/backup/svn
# mkdir srv-svn
# svnadmin create srv-svn

フックの設定.

# cd srv-svn/hooks
# cp pre-revprop-change.tmpl pre-revprop-change
# cp start-commit.tmpl start-commit
# chmod +x pre-revprop-change start-commit
# vi pre-revprop-change
# vi start-commit
# cd ../..

pre-revprop-change

REPOS="$1"
REV="$2"
USER="$3"
PROPNAME="$4"
ACTION="$5"

if [ "$USER" = "backup" ]; then exit 0; fi

echo "Only the user 'backup' may change revision properties" >&2
exit 1
start-commit
REPOS="$1"
USER="$2"

if [ "$USER" = "backup" ]; then exit 0; fi

echo "Only the user 'backup' may commit new revisions" >&2
exit 1

ミラーリポジトリの初期化.

# svnsync init file:///usr/local/share/backup/svn/srv-svn \
      http://www.example.com/svn/ --usrename backup --password PASSWORD

ミラーの実行.

# svnsync sync srv-svn file:///usr/local/share/backup/svn/srv-svn \
      --usrename backup --password PASSWORD

2008-02-26

Python のネストした関数での変数のスコープ

Python ではネストした関数を記述でき,その関数から外側のブロックの変数が見える.

しかし読むことはできても書くことはできない(!!).しかも,書くとエラーになるのではなく,内側のブロックにローカル変数を作成してしまい,その関数を呼ぶと「初期化する前に参照」などのわかりにくいエラーが発生する.

def f():
    def g():
        if first:
            print "first"
            first = False
        else:
            print "not first"
    first = True
    g()

は 3 行目で実行時エラー.

謎な点:

  • g()first = False を消すとエラーが出なくなる.ということは文 first = False をバイトコンパイル時に読んでレキシカルにローカル変数を作成しているわけだが,このようなことはドキュメントのどこに記述してあるのか?

Effective Python/スコープと名前空間 によると Python 3 では nonlocal なるステートメントが用意されて,外側のローカル変数も書けるようになるらしい.

2008-02-20

継承についての小考察

継承でスペースを犠牲にして利便性を向上するケースに出会った.

typedef void (*TidyItemProc)(void *item);

struct List {
    /* ... */
    void MakeEmpty(TidyItemProc proc);
};

struct XList : public List {
    void MakeEmpty() { List::MakeEmpty(this->tidy_item_proc); }
    TidyItemProc tidy_item_proc;
};

でも実はこれは継承を用いるべきではない.XList is-a List になっていない.これは本当は集約を用いるべきケース.

struct XList {
    List list;
    void MakeEmpty() { list.MakeEmpty(this->tidy_item_proc); }
    TidyItemProc tidy_item_proc;
};

しかし集約でメソッドをリダイレクトするのは面倒だ.

2008-01-25

GLib を用いた最も簡単なプログラム

GLib を用いた最も簡単なプログラムは以下のようになる.

#include <glib.h>

int
main(int argc, char *argv[])
{
    GMainLoop *loop;

    loop = g_main_loop_new(NULL, TRUE);
    g_main_loop_run(loop);
    g_main_loop_unref(loop);
}

コンパイルするための SConstruct ファイルを示す.

env = Environment()
env.MergeFlags('!pkg-config --cflags --libs glib-2.0')
Default(env.Program('aa', ['aa.c']))