2013年9月6日金曜日

【Java】cannot be resolved to a type エラーと CLASSPATH の順序

Java の クラスパス の設定でちょっと躓いたので記録。

javac や java コマンドの実行時にクラスパスを指定するには2通りのやり方がある。 -classpath オプションを使う方法と CLASSPATH 環境変数を使う方法だ。今回検証したのは環境変数による設定のみである。

発生した問題を説明する。依存ライブラリの jar ファイルを全て CLASSPATH に含めて java コマンドを実行しても、コンパイルした bin ディレクトリ外では以下の様なエラーが発生した。

Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
 Options cannot be resolved to a type
 Options cannot be resolved to a type
 CommandLineParser cannot be resolved to a type
 PosixParser cannot be resolved to a type
 CommandLine cannot be resolved to a type
 Option cannot be resolved to a type
 ParseException cannot be resolved to a type

 at com.github.uchan_nos.c_helper.Launcher.main(Launcher.java:32)

コンパイル時はエラーがなく、さらに bin ディレクトリで java コマンドを実行すれば正常に実行されるのに、 java コマンドを実行するときのカレントディレクトリが異なるとダメになる。

この時のクラスパスの設定は次。
export CLASSPATH=`python ~/gitrepos/c-helper/tools/classpath.py /Applications/eclipse/plugins`:~/java/lib/commons-cli-1.2/commons-cli-1.2.jar:~/gitrepos/c-helper/bin

`と`で囲まれた python コマンドは、依存している jar ファイルの名前をコロン区切りにするためのもの。その後ろに追加で依存する commons-cli-1.2.jar ファイルを指定した。

このようなときは、クラスパスの順序を変えれば解決するかもしれない。今回の場合は以下のように修正したら解決した。
export CLASSPATH=~/java/lib/commons-cli-1.2/commons-cli-1.2.jar:~/gitrepos/c-helper/bin:`python ~/gitrepos/c-helper/tools/classpath.py /Applications/eclipse/plugins`

私自身クラスパスの仕組みをはっきりと把握できていないため、今回の対処法が全ての場合で有効かは分からないが、今回の場合はこれが特効薬だった。

2013年8月16日金曜日

OS X Mountain Lion + Python 3 + Beautiful Soup 4

OS X Mountain Lion 上で動く Python 3 に Beautiful Soup 4 をインストールしようとしたら嵌ったのでメモ。

Python 3.3.2 (HomeBrew でインストールしたもの)
Beautiful Soup 4.3.0

上手く行ったインストール方法


$ sudo pip3 install beautifulsoup4
$ cd /usr/local/lib/python3.3/site-packages/
$ sudo 2to3-3.3 -w bs4

問題

pip3 でインストールするだけだと Beautiful Soup をインポートするときに SyntaxError 例外が発生する。

uchan@uchan-mba:site-packages$ python3
Python 3.3.2 (default, Jul 11 2013, 15:15:27) 
[GCC 4.2.1 Compatible Apple LLVM 4.2 (clang-425.0.28)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from bs4 import BeautifulSoup4
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "./bs4/__init__.py", line 392
    print soup.prettify()
             ^
SyntaxError: invalid syntax

2to3-3.3 コマンドを手動で実行することで、ライブラリのソースコードを Python 3.3 向けに修正することができる。(インストーラが自動実行しないのはライブラリのバグかもしれない)

2013年7月29日月曜日

Qt Creator で Qt Quick アプリケーションを作ると QML ファイルが読み込めない

OS X Mountain Lion + Qt 5.1.0 + Qt Creator 2.8.0 という環境で開発しています。

Qt Creator で ファイル > ファイル/プロジェクトの新規作成 > Qt Quick 2 Application (Built-in Types) からプロジェクトを作ると main.qml, main.cpp, qtquick2applicationviewer.cpp が含まれたプロジェクトが生成されます。各ファイルに関する説明は QtQuick での C++ × QML バインディングについてまとめてみた を読むといいです。僕もこれを参考に勉強しています。

しかし、初期状態で作成したプロジェクトを実行しようとしても main.qml ファイルの読込エラーが発生してしまいます。原因を調査したところ、どうやらビルド成果物のパスに日本語が含まれると QML ファイルのコピーに失敗してしまうようです。

プロジェクトを作るときのウィザードで日本語を含むパスを指定する(画像参照)と QML ファイルのコピーに失敗しますので、設定を変えて(「デスクトップ」を「Desktop」にでも変更しましょう)再度プロジェクトを生成すると上手く行きます。エラーに悩まされている人は参考にしてください。

成果物へのパスに日本語が含まれている 
「デスクトップ」を「Desktop」に変えた
プロジェクトを再度作成したら英語になった!

ちなみに、元々コピー対象ではないリソースなどをバンドル(hoge.appのこと)に含めるには How to add resource files to an OS X application bundle という方法があるようです。この方法を使っても main.qml が見つからないエラーを解決できます。ただ、この方法は上手くやらないとプロジェクトファイルが OS X 専用になってしまうと思います。なるべく先述の設定変更で対処するのがいいでしょう。

2013年7月23日火曜日

Qt 5.1 + QML + qmlscene

QML でプログラミングを始めよう を参考に QML の勉強を始めました。
ボタンの表示からテキストエディタの作成、C++との連携など一連の内容が書いてあって参考になりそうな感じです。

Qt 5から QML ファイルのプレビュー方法が変わったらしく、ちょっとはまったのでメモしておきます。

上記サイトでは QMLViewer を用いてプレビューを行なっていますが、どうやら Qt 5 からは qmlscene コマンドを使うようです。BeagleBoard 向け Qt 5

公式の First Steps with QML | QtDoc 5.1 を見たら qmlscene を使うんだよとちゃんと書いてありました。お恥ずかしい (^^;

ということで、以下の様な QML ファイルを作って qmlscene しましょう。

-- win.qml --
import QtQuick 2.0

Rectangle {
  id: simplebutton
  color: "gray"
  width: 150
  height: 75

  Text {
    id: buttonlabel
    anchors.centerIn: parent
    text: "hello!!"
  }
}

$ qmlscene win.qml

2013年7月22日月曜日

Qt 5.1 on Mac OS X Mountain Lion

GUIアプリを作ることになりまして、久しぶりに Qt を使おうかなと思ったのでした。
調べたら Qt 5.1 がリリースされていましたので Mountain Lion への入れ方などメモします。

インストール

既に Homebrew で Qt 4.8.4 を入れていたので干渉を避けるため、ソースからビルドすることにしました。
Qt Project から qt-everywhere-opensource-src-5.1.0.tar.gz をダウンロードしビルドします。
ビルド方法は Installation | QtDoc 5.1 が参考になります。

$ tar xzvf qt-everywhere-opensource-src-5.1.0.tar.gz
$ cd qt-everywhere-opensource-src-5.1.0
$ ./configure
$ make
$ sudo make -j1 install

途中でライセンスの選択を聞かれたので LPGL 版を選択しました。最後に PATH の調整をして終わりです。~/.bashrc に次を書き加えればいいでしょう。

export PATH=/usr/local/Qt-5.1.0/bin:$PATH

最後に希望のバージョンが入っていることを確認します。

$ qmake -v

QMake version 3.0
Using Qt version 5.1.0 in /usr/local/Qt-5.1.0/lib

Hello, World

Qt で画像をフルスクリーン表示する を参考にテストプログラムを作りました。

-- main.cpp --
#include <QApplication>
#include <QPixmap>
#include <QLabel>

int main(int argc, char **argv)
{
    QApplication app(argc, argv);
    QPixmap pixmap("/path/to/picture.jpg");
    QLabel screen;
    screen.setPixmap(pixmap);
    screen.show();

    return app.exec();
}
-- main.cpp --

ソースコードを準備したらプロジェクトファイルを生成します。そのプロジェクトのビルドに必要なライブラリや追加のインクルードパス、使用する Qt のモジュールなどを記述するためのファイルです。

$ qmake -project

Qt 5.1 から、どうやら GUI アプリを作る(QApplication クラスなどを使う)にはプロジェクトファイルの修正が必要なようです。生成されたプロジェクトファイルに次の1行を書き加えます。
この修正をしないとヘッダファイルが見つからないと言われたり、なんとか解決しても Mac: Undefined symbols for architecture x86_64: “QApplication::palette()”, referenced from: という感じのエラーが出てリンクできません。

QT += widgets

そうしたら Makefile を生成してビルドします。

$ qmake
$ make

アプリの起動は .app ファイルを起動しましょう。

$ open hoge.app

指定した画像が表示されたら成功です。

2013年6月19日水曜日

The project description file (.project) for ‘c-helper’ is missing

古い Mac から workspace をコピーしてきて、それを新しい Mac にインストールした Eclipse のワークスペースとして指定しました。
そうしたら、あるプロジェクトで "The project description file (.project) for ‘c-helper’ is missing" というエラーが出てしまいました。

同じようなエラーで悩んでいる人は結構居るみたいでした。
The project description file (.project) for my project is missing
Relocating Eclipse Projects: The project description file (.project) for XXX is missing
The project description file (.project) for ‘MyFlexProject’ is missing

プロジェクトをインポートし直すと治るよ(1つめの記事)とか、 .location ファイルを削除したら治るよ(2つめの記事)、という情報がありましたが、僕のケースではどちらもダメでした。

で、3つめの記事に書いてあった情報が役立ちました。
この記事は Flex Builder 3 についての記事ですが、 Eclipse にも当てはまるでしょう。

古いパソコンからワークスペースをコピーしてきて、 Eclipse がそのワークスペースを指すようにするのは間違った方法で、正しくはコピーしてきたワークスペースとは別のワークスペースを作って、プロジェクトをインポートするという方法だそうです。

とうことで、ワークスペースを新しく作って問題のプロジェクトをインポートしたら解決しました!

Xcode で gitk がインストールされない OS X Mountain Lion

新しい MacBook Air (2013 mid version)を買ったので、早速 Xcode 4.6.3 をインストールし、 Preferences > Download から Command Line Tools をインストールした。

しかし、どうやら gitk がインストールされていない。 git コマンドはインストールされたが、もしかしたら最新版の Xcode には gitk が含まれないのかもしれない。

ということで GitX http://gitx.frim.nl なるアプリをダウンロードしてみた。
最初に起動するとフォルダ選択画面になる。そこで .git が置いてあるフォルダ(または .git フォルダそのもの)を選択すれば、きれいなコミットグラフが表示される。

ターミナルから gitk と同じように呼び出して使いたいときは、 GitX を起動した状態で GitX > Enable Terminal Usage... を選択しよう。 /usr/bin/gitx がインストールされる。