GNU Smalltalk 3.2.91 のインストールメモ (Chromebook Flip(ARM Cortex-A17)/crouton/Ubuntu 14.04)

GNU Smalltalk 3.2.91 が去年の11月にリリースされていたのですが、年末年始がいそがしかったので今頃インストールしてみます。その前が2013年の4月でしたから、随分久しぶりのリリースです。

今回は、今のモバイルメインマシンである Chromebook Flip にインストールしてみるのですが、Ubunt 14.04 とはいえ、ARM マシンですし、本当にビルドできるのかな?と半信半疑。あんまりうまくイカないかもしれないね、とおもいつつ、とりあえずトライしてみましょうくらいの気持ちでやってみました。

ちなみに過去のインストールメモはこれら↓です。

いつもどおり、ftp://alpha.gnu.org/gnu/smalltalk/smalltalk-3.2.91.tar.gz から、tarball をダウンロードしてきて解凍します。

ビルドに必要なライブラリーをインストールします。

$ sudo aptitude install gawk libgtk2.0-dev libglib2.0-dev tcl8.4-dev tk8.4-dev texinfo libsigsegv-dev libltdl-dev libffi-dev

で、configure。

$ ./configure --with-tcl=/usr/lib/tcl8.4 --with-tk=/usr/lib/tk8.4 2>&1 | tee ../gst3.2.91config.log 

configure は、一応 tcl/tk のパスを通してビルド。blox/Tk を使うことも無いと思うけれども。(そして、ちゃんと動くかは微妙だけれども)

$ make 2>&1 | tee ../gst3.2.91make.log
$ make check 2>&1 | tee ../gst3.2.91makecheck.log
## -------------------------------- ##
## GNU Smalltalk 3.2.91 test suite. ##
## -------------------------------- ##

Regression tests.

  1: arrays.st                                       ok
  2: classes.st                                      ok
  3: blocks.st                                       ok
・
・
 14: geometry.st                                     ok
 15: cobjects.st                                     FAILED (testsuite.at:45)
 16: compiler.st                                     ok
・
・
129: Seaside-Core                                    ok
130: Sockets                                         expected failure (testsuite.at:168)
131: Sport                                           ok
・
・
ERROR: 130 tests were run,
2 failed (1 expected failure).
5 tests were skipped.

およ、cobjects と Sockets のテストがコケます。気になるのですけれども、もう時間も時間ですし、調べるのめんどいなーと思い、とりあえず怠惰に make install。うまく動かなかったらちゃんと考えましょう、うん。

$ sudo make install 2>&1 | tee ../gst3.2.91makeinst.log

gst も gst-browser も起動するし、自前アプリもいちおうそれっぽく動いたのでまぁよしとします。Sockets はともかく cobjects は大丈夫なんじゃないかな(希望的観測)

で、動かしてみたけれども、gst-browser は重いなぁ。Ubuntu のデスクトップをChromeのタブ内に表示する Chrome拡張「Crouton Integration」が結構重いので、これをやめれば軽くなりそうではあるのですが、試していません。

このままではちょっと厳しいかもと思ったり。

未来を生きている感

「漫画家体制(手塚モデル)」のデメリットについて、考えるきっかけがあって

従来のソフトウェア工学が決定的に間違っている点 - kなんとかの日記

さんを読んでいたのですが、

別にソフトウェア開発に限らず、どの分野でも高度な仕事は個人に大きく依存する。経営だってそうだろ? Steve Jobs がいなくなれば Apple は緩やかに衰退していくだろう。実際、井深氏と盛田氏が亡くなったあとのソニーは緩やかに衰退していき、今の惨状はみなさんご存知の通りだ。今は絶好調の任天堂だって、もし宮本茂氏や岩田聡社長がいなくなることになればどうなるかわからない。個人に強く依存するリスクを嫌うなら、属人性を排除するのではなく別の方法、たとえば同じような個人を育てたり見つけ出すことを考えるべきであるが、それは長くなるのでまた別の機会にしたい。

従来のソフトウェア工学が決定的に間違っている点 - kなんとかの日記

に、ああ、わたし未来を生きているんだ感が半端ないと思いました。

ガウディ本が買えない?

ちょっと前までしばらく メイヤー先生のオブジェクト指向入門が買えない状態になっていて(今は買えます/なんか原著の版元との契約更新の関係らしいと風の噂に)、他の本はどうかな〜と眺めてみたら、今度はガウディ本が買えなくなってますね。たまたまこの2つが目についただけなのですが、翔泳社さんはいい本というか定番の本が揃ってる感が半端ないので、できれば安定して供給して欲しいなーとか思ったり。

コンピュータプログラミングの概念・技法・モデル (IT Architects' Archiveクラシックモダン・コンピューティング)

コンピュータプログラミングの概念・技法・モデル (IT Architects' Archiveクラシックモダン・コンピューティング)

話は変わって、オブジェクト指向入門とかガウディ本とタイガーブックは電書版も欲しいなー、と思います。

というか、 IT Archtects' Archive シリーズ はみんな電書にして欲しいです。いい本多いし凶器みたいな本も多いしw.Object Oriented SELECTION シリーズもほしいなぁ。

電書になってたり、なってなかったりするので、いろいろ難しいのだろうなーとは思いますが、お願い、出してくださいましー。

技術書 Kindle で買うのやめるってよ

最近、技術書を Kindle から 達人出版会とか オーム社eBook Store とかの DRM フリーなところから買うように変えました。理由は Kindle Cloud Reader で日本語の(画像取り込みでない)書籍は、ほぼほぼ読めないからです。英語書籍なら読めるので、しばらくは泣く泣く原著版もかってみたりとかしてたのですが、これはなんか違う...。

これまでは、DRMフリーが望ましいのはもちろんなのですが、普通の本でそれは当分見込めないかなーというのがあって、ならば Kindle に一極集中するのが書庫的にもいろいろリーダーを開発してくれそうな体力的にも望ましいという感じで運用してたのですが、メインマシンが Chromebook になって、出先でちょいちょい技術書を読みたいなー、なんて思うときに買ったのに読めないという結構理不尽な状況に追い込まれる度、こりはちょっと再考だなぁと。

Paperwhite だとサイズ的に技術書は辛いことが多いですし、でも 10インチノートとタブレットの二台持ちはちょっと嫌なだな、となると、この道しか無いと思うのです。漠然と不便を感じていたオライリーレス*1も解消されます。

そもそも Kindle DX 相当の eペーパーの大きなリーダーが途絶えてますし、あまり Amazon を当てにするのも危険かなって思います。わたしとしてはいつの日か EU あたりが「独占だめー」とか騒いで、書庫抱え込み禁止とか、サードパーティリーダーの道が開けたら...なあんて妄想もしてたのですが、まぁ、現実的ではないですね。

技術書は DRMフリーのものが多いのでこういう選択肢がありますが、普通の本では無理なので、いずれ世の中が 書店・書庫・リーダー の分離がされることを願ってます。


さて、話を本自体に戻して、DRMフリーはいいのですがちょっとアレなのは PDFばっかりなのですよね。Chromebook Flip の解像度だと、原著がB5大だとちょっと文字小さいな、と感じることが多いので、EPUB で出して欲しいのですが...。意味不明なのは 「すごいErlang..」とかオーム社で買うとPDFしかないのに、達人出版会で買うと EPUBもサポートしてるのですよ。どうなってるの?

Chromebook はあまり良い 読書用PDFリーダがないので余計不満に感じます*2

ところで、Amazon縛りも解消したので、ePaper の 大きなリーダーがあればいろいろ最高とか思い始めています。

とか、魅力的ですね。

*1:オライリージャパンKindle で本ださないです

*2:ChromeのPDFリーダーは縦スクロールベースなので、書籍風の見開きやページめくりが厳しいのです。今のところわたしは Kami(Formarly Notable PDF) というアプリを使ってますが、これはスクロールを矢印キーでうまいこと制御してページめくりしてるように見せかけてます

私信だよ

昨日無事退院いたしました。ご存知だった方⇒ご心配かけました。

体のちょっとした部分が壊れただけで、なんというか全体的にまるで使い物にならなくなる様は、マリみて黄薔薇革命」の

しかし、人間というのは体の一部に気がかりを抱えてるだけで、こうも使い物にならなくなるものか――。
所詮、人体なんてねじ一つが壊れて動かなくなる機械のようなものかもしれない。いつもは比較的性能のいい彼女は、絶望的なため息をついた。

をしみじみ実感しました。

なんとか治って、ほんとよかったです。

オライリーの Erlangプログラミングの wxErlang のチュートリアルを動かしてみたり

やぁっと環境ができましたので、ちょっと作ってみようかと。お手軽なチュートリアルとして手元にあった

Erlangプログラミング

Erlangプログラミング

の 14章をちょちょいと実装。

%% -*- coding: utf-8 -*-
%% オライリーの Erlang プログラミングの 14.4 章のプログラム
%%
%% microblog (14.3) に以下の機能が追加されます
%%
%% |New         | 新しく空のミニブログを生成します
%% |Open        | BLOGファイルに保存されたブログを開きます
%% |Save        | 現状のブログをBLOGファイルに保存します。コンテンツがすでに存在する場合、上書きします
%% |Add entry   | ブログの末尾にエントリを追加します。 エントリには自動で日付が付与されます
%% |Undo latest | 最新のAdd entry を取り消します。この操作は再帰的に行うことができます

-module(miniblog).
-compile(export_all).

-include_lib("/usr/local/lib/erlang/lib/wx-1.6/include/wx.hrl").
% code:lib_dir(wx) ++ "/include/wx.hrl" になります

-define(APPEND, 131).
-define(UNDO  , 132).
-define(OPEN  , 133).
-define(SAVE  , 134).
-define(NEW   , 135).
-define(ABOUT , ?wxID_ABOUT).
-define(EXIT  , ?wxID_EXIT).

start() ->
    wx:new(),
    Frame = wxFrame:new(wx:null(), ?wxID_ANY, "MiniBlog"),
    Text  = wxTextCtrl:new(Frame, ?wxID_ANY,
                           [{value, "MiniBlog"},
                            {style, ?wxTE_MULTILINE}]),
    setup(Frame, Text),
    wxFrame:show(Frame),
    loop(Frame, Text),
    wx:destroy().
    
setup(Frame, Text) ->
    %% elaborate menu bar
    MenuBar = wxMenuBar:new(),
    File    = wxMenu:new(),
    Edit    = wxMenu:new(),
    Help    = wxMenu:new(),

    wxMenu:append(File, ?NEW   , "New\tCtrl-N"),
    wxMenu:append(File, ?OPEN  , "Open saved\tCtrl-O"),
    wxMenu:appendSeparator(File),
    wxMenu:append(File, ?SAVE  , "Save\tCtrl-S"),
    wxMenu:append(File, ?EXIT  , "Quit"),

    wxMenu:append(Edit, ?APPEND, "Add en&try\tCtrl-T"),
    wxMenu:append(Edit, ?UNDO  , "Undo latest\tCtrl-U"),

    wxMenu:append(Help, ?ABOUT , "About MicroBlog"),

    wxMenuBar:append(MenuBar, File, "&File"),
    wxMenuBar:append(MenuBar, Edit, "&Edit"),
    wxMenuBar:append(MenuBar, Help, "&Help"),

    wxFrame:setMenuBar(Frame,MenuBar),

    %% elaborate TextEdit
    wxTextCtrl:setEditable(Text, false),

    %% elaborate status bar
    wxFrame:createStatusBar(Frame),
    wxFrame:setStatusText(Frame, "Welcome to wxErlang"),

    wxFrame:connect(Frame, command_menu_selected),
    wxFrame:connect(Frame, close_window).

loop(Frame, Text) ->
    receive
        #wx{id=?APPEND, event=#wxCommand{type=command_menu_selected}} ->
            Prompt = "Please enter text here.",
            MsgDlg = wxTextEntryDialog:new(Frame, Prompt,
                                           [{caption, "New blog entry"}]),
            case wxTextEntryDialog:showModal(MsgDlg) of
                ?wxID_OK ->
                    Str = wxTextEntryDialog:getValue(MsgDlg),
                    wxTextCtrl:appendText(Text, [10] ++ dateNow() ++ " " ++ Str); %10 as LF(0x0a)
                _ -> ok
            end,
            wxDialog:destroy(MsgDlg),
            loop(Frame, Text);

        #wx{id=?UNDO  , event=#wxCommand{type=command_menu_selected}} ->
            {StartPos, EndPos} = lastLineRange(Text),
            wxTextCtrl:remove(Text, StartPos-2, EndPos+1),
            loop(Frame, Text);

        #wx{id=?OPEN  , event=#wxCommand{type=command_menu_selected}} ->
            wxTextCtrl:loadFile(Text, "BLOG"),
            loop(Frame, Text);

        #wx{id=?SAVE  , event=#wxCommand{type=command_menu_selected}} ->
            wxTextCtrl:saveFile(Text, [{file,"BLOG"}]),
            loop(Frame, Text);

        #wx{id=?NEW   , event=#wxCommand{type=command_menu_selected}} ->
            {_, EndPos} = lastLineRange(Text),
            StartPos    = wxTextCtrl:xYToPosition(Text, 0, 0),
            wxTextCtrl:replace(Text, StartPos, EndPos, "MiniBlog"),
            loop(Frame, Text);

        #wx{id=?ABOUT , event=#wxCommand{}} ->
            Str = "MiniBlog is minimal WxErlang example.",
            MsgDlg = wxMessageDialog:new(Frame, Str,
                                         [{style, ?wxOK bor ?wxICON_INFORMATION},
                                          {caption, "About MiniBlog"}]),
            wxDialog:showModal(MsgDlg),
            wxDialog:destroy(MsgDlg),
            loop(Frame, Text);

        #wx{id=?EXIT  , event=#wxCommand{type=command_menu_selected}} ->
            wxWindow:close(Frame,[])
    end.

dateNow() ->
    {{Yea,Mon,Day},{Hou,Min,Sec}} = erlang:localtime(),
    io_lib:format("~4..0B-~2..0B-~2..0B ~2..0B:~2..0B:~2..0B", [Yea,Mon,Day,Hou,Min,Sec]).

lastLineRange(Text) ->
    EndPos = wxTextCtrl:getLastPosition(Text),
    LastLineNum = wxTextCtrl:getNumberOfLines(Text) -1,
    StartPos = EndPos - wxTextCtrl:getLineLength(Text, LastLineNum) +1,
    {StartPos, EndPos}.
1> c(miniblog).     
{ok,miniblog}
2> miniblog:start().

まぁ、こんな感じかな。

wxErlang で面白いのは、wxWidgets のイベントを Erlang のメッセージとして プロセスのメールボックスから取得できるところですね。wx:new/0 で wxサーバーを立てて、そのままのプロセスでloopでメッセージを待ち、抜けたらwx:destroy/0 wxサーバーにお亡くなりいただく..というのが大まかな構成になるわけです。

ここらへんは、普通のGUIフレームワークがUIスレッド上での処理は簡単だけれども、UIが固まるのが嫌だからと、ちょっと非同期にしようとすると途端にプログラミングが面倒になるのとは逆をいっているのかな?と思います。多分。

この14章のチュートリアル自信は about とquitしかできない microblog からスタートして、ここに載せた miniblog の作成までと成長させるという、学びやすい構成になっています。一部関数がしれっと定義しないまま使っていて、それぐらい自分で作れるだろう?的なところも、学習にはいい感じでした。


* * *


そんなこんなで、まずはお手つきと思ったのですが、環境の構築のほうに労力を取られてしまいました。wxErlang にもうすこし慣れれば日常のGUIツールをErlangでさくっとつくる、なんてできるかな、とか思わなくもないです。

が、激しく目的外使用というか、手段のために目的を選んでいるような...(^^;

wxErlang が動きませんよ?

(要約) Chromebook Flip (ARM cortex-A17 環境) 上の crouton Ubuntu 14.04 LTS で wxErlang を動かそうとしたら、最終的にソースコードからのビルドになった、という話。 


* * *


今年の豊富ついでに早速 wxErlang でもやってみようと思いました。幸い Chromebook Flip に構築した Ubuntu 環境でも apt-get で erlang はすんなり入ったので、さくっと始められますよ。

というわけで、まずは試し。いちばん小さそうなサンプルをざざっとググって見つけた1章 「wxErlang」 - INAの日記 さんを参考にサンプルを書いて動かそうとしたところ、

-module(guitest).
-compile(export_all).

start() ->
    Wx = wx:new(),
    Frame = wxFrame:new(Wx, -1, "this is the title", [{size, {600, 800}}]),
    wxFrame:show(Frame),
    loop(Frame),
    wx:destroy().

loop(Frame) ->
    receive
        _ -> loop(Frame)
    end.
2> c(guitest).
{ok,guitest}
3> guitest:start().
** exception error: undefined function wx:new/0
     in function  guitest:start/0 (guitest.erl, line 5)

むっふぅ...。wx:new/0 がございませんか...。

Stack Overflow を見ると include 足りてねぇんじゃね、的な指摘があったので

6> code:lib_dir(wx).
"/usr/lib/erlang/lib/wx-1.1.1"

で、パスを調べて

-include_lib("/usr/lib/erlang/lib/wx-1.1.1/include/wx.hrl").

を追加*1

で、実行すると

14> guitest:start().
** exception error: undefined function wx:new/0
     in function  guitest:start/0 (guitest.erl, line 6)

・・・むっふぅ、変わらにゅ。なにがおかしいのかしら。

Erlang のライブラリインポートの仕組みをイマイチ理解していないのだけれど、とりあえず解決すればいいや、的に、たとえば Getting Started with wxWidgets in Erlang を参考に、erlang-shell 側でincludeしてみるものの、

4> My_wx_dir = code:lib_dir(wx).
"/usr/lib/erlang/lib/wx-1.1.1"
5> rr(My_wx_dir ++ "/include/wx.hrl").
[wx,wxAuiManager,wxAuiNotebook,wxCalendar,wxChildFocus,
 wxClipboardText,wxClose,wxColourPicker,wxCommand,
 wxContextMenu,wxDate,wxDisplayChanged,wxErase,
 wxFileDirPicker,wxFocus,wxFontPicker,wxGrid,wxHelp,
 wxHtmlLink,wxHtmlLinkInfo,wxIconize,wxIdle,wxJoystick,wxKey,
 wxList,wxMaximize,wxMenu,wxMouse,wxMouseCaptureChanged|...]
6> rr(My_wx_dir ++ "/src/wxe.hrl").
[wx_env,wx_mem,wx_ref]

しかし、やはりうまくいきません。

おかしいなー、

$ cd /usr/lib/erlang/lib/wx-1.1.1/src
$ ll
合計 100
drwxr-xr-x 3 root root  4096 105 00:46 ./
drwxr-xr-x 5 root root  4096 105 00:46 ../
drwxr-xr-x 2 root root 16384 105 00:46 gen/
-rw-r--r-- 1 root root 12091  820  2014 wx.erl
-rw-r--r-- 1 root root 21525  820  2014 wx_object.erl
-rw-r--r-- 1 root root  2180  820  2014 wxe.hrl
-rw-r--r-- 1 root root  8661  820  2014 wxe_master.erl
-rw-r--r-- 1 root root 14153  820  2014 wxe_server.erl
-rw-r--r-- 1 root root  6972  820  2014 wxe_util.erl

をすると wx.erl といるし、その中にちゃんと

-module(wx).

-export([parent_class/1, new/0, new/1, destroy/0,
	 get_env/0,set_env/1, debug/1,
	 batch/1,foreach/2,map/2,foldl/3,foldr/3,
	 getObjectType/1, typeCast/2,
	 null/0, is_null/1]).
  ・
  ・
  ・

とかあるのだけれどなぁ...と、調べつつ、ふと「あれ、これコンパイルされてるのかしら」とErlang クエックブック Beam ファイルのパスを取得する を参考に code:which/1 で探索すると

11> code:which(wx).                
non_existing

いないじゃーーーーん ...orz

なんかここらへんが原因っぽいなぁ。

自前ビルドする

これを後から何とかする自信が全然なかったので、やっぱり何もかも綺麗な環境からやり直したほうが良いでしょう、ということで、

$sudo aptitude purge erlang

して、http://erlang-users.jp/ の「GitHub レポジトリからビルドする」や
Erlang/OTP 18.1 をソースコードからインストールする | Qiitaを参考に自前ビルド。

現状のさいしんは 18.2.1 なので

$ git clone git://github.com/erlang/otp --bare erlang.otp.upstream
$ git clone erlang.otp.upstream opt.18.2
$ cd opt.18.2/
$ git checkout -b 18.2.1  OTP-18.2.1Switched to a new branch '18.2.1'

とソースと作業ディレクトリを確保。

で、ビルドに必要なライブラリをインストール

$ sudo aptitude install build-essential libncurses5-dev libssl-dev systemtap-sdt-dev autoconf

あとは、こちらも*2

$ sudo aptitude install libwxgtk3.0-dev libwxgtk3.0-0 libwxgtk3.0-0-dbg wx3.0-i18n libwxgtk-media3.0-dev libwxgtk-media3.0-0 libwxgtk-media3.0-0-dbg

で、wx関連も入れる(入れたつもり)。その後いつものconfigure

$ ./otp_build autoconf 2>&1 | tee ../erl_autoconf.log
$ ./configure --disable-hipe --enable-dtrace --without-javac 2>&1 | tee ../erl_configure.log

で、メッセージを見てみると

   ・
   ・
   ・
*********************************************************************
**********************  APPLICATIONS DISABLED  **********************
*********************************************************************

jinterface     : Java compiler disabled by user
odbc           : ODBC library - link check failed

*********************************************************************
*********************************************************************
**********************  APPLICATIONS INFORMATION  *******************
*********************************************************************

wx             : Can not link the wx driver, wx will NOT be useable

*********************************************************************
*********************************************************************
**********************  DOCUMENTATION INFORMATION  ******************
*********************************************************************

documentation  : 
                 xsltproc is missing.
                 fop is missing.
                 xmllint is missing.
                 The documentation can not be built.

*********************************************************************

あうち。Java や ODBC は置いといて、問題は wx と documentation ね。特にwxはこれが使いたくって自前ビルドに走ったのですから。で、メッセージをみると、

configure: Checking for OpenGL headers in /usr/local
checking GL/gl.h usability... no
checking GL/gl.h presence... no
checking for GL/gl.h... no
configure: WARNING: No OpenGL headers found, wx will NOT be usable

と言っています。OpenGL が必要なんかー。というわけで、

$ sudo aptitude install freeglut3-dev libglew1.5-dev

も追加。したら、これで wx周りは解決しました。

あとはdocumentation の部分を解決するため

$ sudo aptitude install xsltproc fop libxml2-utils

*3。なんか、やたらたくさん java 関連のパッケージが入ってストレージに乏しいChromebook ではヒヤヒヤ。MicroUSB上にchroot環境作っておけばよかったなぁ、とプチ後悔。

そして再び confiure して、

$ make 2>&1 | tee ../erl_make.log
$ make install 2>&1 | tee ../erl_install.log

ちなみに make にかなーーーり時間がかかります。特に、wxWidgetsのビルドが長い(configureのときstatic library が見つからなかったので自前ビルドになる)です。

終わったら、早速 起動してみます。

$ erl
Erlang/OTP 18 [erts-7.2.1] [source] [smp:4:4] [async-threads:10] [kernel-poll:false]

Eshell V7.2.1  (abort with ^G)
1> 

ちなみに、apt-get でいれた ときはこんな感じでした。

$ erl
Erlang R16B03 (erts-5.10.4) [source] [smp:4:4] [async-threads:10] [kernel-poll:false]

Eshell V5.10.4  (abort with ^G)

では、成果の程を見てみましょう。どきどき..

2> code:which(wx).
"/usr/local/lib/erlang/lib/wx-1.6/ebin/wx.beam"

はふんっ、長かった!

で、サンプルを動かしてみれば、

はふー、やったよーー。(長かった....)

まぁ、タイトルバーのバッテンボタンを拾えてなかったりあやしいところもあるのですが*4、そこはおいおい。

それにしても、ARM というマイノリティ環境だと、自前ビルドは本当にうまく行くのかドキドキしますね*5。configure のオプションとかおっかなびっくりでした。

おまけ: Emacserlang-mode 設定

ErlangEmacs びいきなので、普通にインストールするだけで、erlang-modeが追加されてます。なので、.emacs などに 記述を追加すれば OK です。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; erlang-mode
(setq load-path (cons "/usr/local/lib/erlang/lib/tools-2.8.2/emacs"
      load-path))
(setq erlang-root-dir "/usr/local/otp")
(setq exec-path (cons "/usr/local/otp/bin" exec-path))

(require 'erlang-start)

ちなみに、load-path のところの tools-x.x.x の部分は環境に合わせて変更してくださいまし。

*1:これはすごくダサいとおもうのですが、どうすればいいのでしょうかね...。せめて -include_lib(code:dir(wx) ++ "/include/wx.hrl") とか書けるとよいのですが

*2:実は最初は入れ忘れてて、configure のメッセージを見てから追加しました

*3:libxml2-util は xmllint のためですね

*4:追記: wxFrame:connect(Frame, close_window) し忘れてるだけですね(^^;

*5:そんなとき勇気をくれるのがArch Linux のページだったり。このページがあるというだけで、大丈夫という気がしてきます