2010年12月30日木曜日

Meadow で Scala - 空白を含むパスはトラブルの元

Notepad++ で Scala を書く場合、起動は軽いけれどコードの補完をしてくれない。 Eclipse では 補完はしてくれるけれど起動が遅く、メモリの消費が大きい。補完も今一な気が。。 (+_+) やっぱ Meadow を使うのがいいのかな?

上記を参考に Meadow で Scala を利用できるようにした。

 

Scala のインストールされているディレクトリへのパスが空白を含まないように変更

しかし、当初 scala-mode を使えるように設定した後、 REPL を起動しようと M-x scala-run-scala を実行したら、

'c:\Program' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

とエラーが表示された。

これは、scala を c:\Program Files\scala にインストールしていたのがダメだったようだ。 c:\scala に再インストールしたら scala-run-scala で起動できるようになった。

 

elisp のあるディレクトリへのパスが空白を含まないように変更

次に ENSIME を利用するための設定をした後、M-x ensime を実行。しかし、

Failed to connect to Swank: server process exited.

とエラーが表示される。

The Swank Protocol について調べても判然とせず。

The Emacs ENSIME client communicates with the server using the Swank protocol.

と説明があるので、server を起動していそうなバッチファイルを、ENSIME をインストールしたディレクトリにおいて適当な引数を与えて実行。(cf. scala - How to make ensime work in windows? - Stack Overflow)

bin/server.bat 12345

結果はコマンドラインに、

server listening on XXXXX

と表示される。これに対して telnet で

telnet 127.0.0.1 XXXXX

と試みると接続がされる。Meadow において、M-x ensime-connect をしても同様に接続可。

ところで、複数の PC で Meadow の設定を共有するために設定ファイル・elisp は Dropox へ置いている。エラーの原因はまたもこのパスだった。

Dropbox へのパスは以下の通り、空白が含まれていた。

C:\Users\ユーザ名\Documents\My Dropbox

これを Dropbox の Preferences > Advanced の ‘Dropbox location’ にて、空白を含まない場所へ変更。

C:\Users\ユーザ名\Documents\Dropbox

これにより、M-x ensime で ENSIME を実行すると、正常に動作してくれるようになった。

 

関連記事

2010年12月29日水曜日

Eclipse で Scala

Scala IDE のインストール

Scala IDE for Eclipse によると、必要なものは

Eclipse は Release Build: 3.5.2 よりダウンロード。

Scala を書くためのプラグインをインストールするには、Eclipse を起動し、メニューより

  • Help > Install New Software…

を選択。

Install ダイアログの work with: には、Scala IDE for Eclipse – Downloads にお勧めとして記載されている以下の URL を入力して、

http://download.scala-ide.org/nightly-update-master-2.8.1.final

必要なものをチェックしてインストールを進める。

CropperCapture[8]

 

Scala のコンパイルと実行

流れとしては、

  1. Perspective を Scala に変更
  2. Scala の Project を作成
  3. Scala Object を作成するときに、main メソッドを自動で作ってもらう。
  4. コードを書いて、コンパイルして実行

CropperCapture[9]

下図は Test オブジェクトに main メソッドを自動的に作成してもらっているところ。

CropperCapture[10][4]

REPL を利用するには、Cosole を選択し、Open Console ボタンで Scala Console を選ぶ。

CropperCapture[11]

 

関連記事

参考サイト

2010年12月28日火曜日

Python のパッケージを pip でインストール

1. EasyInstall を使い、Python Package Index よりパッケージをインストール

PyPI とは、

The Python Package Index is a repository of software for the Python programming language.

Python のパッケージが管理されているリポジトリ。

 

easy_install

CheeseShopTutorial - PythonInfo Wiki によると、お手軽に Python のパッケージをインストールするには、EasyIntall を使うとのこと。

EasyInstall (easy_install) gives you a quick and painless way to install packages remotely by connecting to the Package Index or even other websites via HTTP.

EasyInstall を利用するには setuptools 0.6c11 を予め入れておく。

OS と Python のバージョンに合わせ、Using Setuptools and EasyInstall にある

をダウンロードしてインストール。

Windows Notes によると、

If typing easy_install at the command prompt doesn't work, check to make sure your PATH includes the appropriate C:\\Python2X\\Scripts directory.

コマンドラインから easy_install を実行するために、

  • C:\Python25\Scripts

を環境変数の PATH に追加した。

 

2. pip でパッケージをインストール

ところで、easy_install 以外にもパッケージをインストールするツールは存在する。

pip 0. 8.2 は、

pip is a replacement for easy_install. It uses mostly the same techniques for finding packages, so packages that were made easy_installable should be pip-installable as well.

上記には easy_install と比べて以下の利点が挙げられている。

  • All packages are downloaded before installation. Partially-completed installation doesn't occur as a result.
  • Care is taken to present useful output on the console.
  • The reasons for actions are kept track of. For instance, if a package is being installed, pip keeps track of why that package was required.
  • Error messages should be useful.
  • The code is relatively concise and cohesive, making it easier to use programmatically.
  • Packages don't have to be installed as egg archives, they can be installed flat (while keeping the egg metadata).
  • Native support for other version control systems (Git, Mercurial and Bazaar)
  • Uninstallation of packages.
  • Simple to define fixed sets of requirements and reliably reproduce a set of packages.

例えば、上記「パッケージをアンインストールすることができる」に関して easy_install は、

easy_install never actually deletes packages (unless you're installing a package with the same name and version number as an existing package), so if you want to get rid of older versions of a package, please see Uninstalling Packages, below.

(Upgrading a Package より)

 

pip のインストール

まずは、easy_install を利用して pip をインストール。

easy_install pip

 

pip でパッケージのインストールとアンインストール

pip でパッケージをインストールするには、

pip install パッケージ名

アンインストールするには、

pip uninstall パッケージ名

2010年12月23日木曜日

Notepad++ の NppExecプラグインで Scala のコンパイルと実行

1. ちょっとコードを試したいときは REPL

Scala で、ちょっとコードを試したいときは、コマンドラインから

scala

と入力し REPL を起動。

特別なコマンドを入力しなくても、複数行の入力に対応しているので便利。

CropperCapture[7]

 

2. エディタを使うなら Notepad++

少し長いコードを試したいときは、Notepad++ EUC-JP 対応版 を利用する。このエディタは起動が早いので、さっと書きたいときに重宝している。

上記のリンクより Notepad++ をダウンロードし、解凍したものを管理者権限が必要のないフォルダへ配置。C:\Program Files (x86) へ入れなかったのは、後述するプラグインが動作しなかったため。

 

キーワードの色付け

Scala のコードを色付けしたい場合は、

Dependent on your installation configuration, it's either in \Documents and Settings{your profile name}\Application Data\Notepad++\userDefineLang.xml or Notepad++ installation folder\userDefineLang.xml

(Notepad++ custom syntax highlighting setting - where to look for it? - Super User より)

CropperCapture[9]2Scala をインストールしたフォルダ内にある

  • scala\misc\scala-tool-support\notepad-plus\userDefineLang.xml

を Notepad.exe のあるフォルダに置いて Notepad++ を再起動。

これによりメニューの「言語」に `Scala’ が追加される。

(%APPDATA% の方に置いたら表示されなかった。)

 

「実行...」ダイアログ で コンパイル と実行

CropperCapture[8]Notepad++ でコードを実行するには、メニューより「実行 > ファイル名を指定して実行」を選択。(ショートカットキーでは F5)

「実行...」ダイアログに以下のように入力して実行ボタンを押してコンパイル。

scalac "$(FULL_CURRENT_PATH)"

( Notepad++ で用意されている特別な引数については、Help > Commands を参照。)

コンパイルされたクラスファイルを実行するには、もう一度「実行...」ダイアログを表示させ、

scala 起動クラス名 && pause

を実行して結果を確認する。

 

3. NppExec プラグインでコンパイルと実行

上記の方法ではコンパイルと実行をそれぞれ行う必要があるので面倒。そこで、NppExec プラグインを利用して複数のコマンドを実行できるようにする。

 

インストール
  1. メニューより「プラグイン > Plugin Manager > Show Plugin Manager」を選択。
  2. NppExec を選択してインストール。

Notepad++ を再起動すると、メニューの「プラグイン」に `NppExec’ が表示される。

 

コンパイルと実行を一度に行わせる方法

Scala のコードをコンパイルしてエラーがなかった場合に、続けて実行するためのバッチファイルを用意。 NppExec プラグインより呼び出すようにする。

Notepad++.exe と同じ階層に以下のバッチファイル scalaCompileAndRun.bat  を作成。

call fsc "%1"
if ERRORLEVEL 1 exit
call scala "%2"

Notepad++ のメニューより「プラグイン > NppExec > Execute…」を選択。(ショートカットキーは F6)

ダイアログに以下を入力。

INPUTBOX "起動するクラスを指定してください" : $(SYS.MAINCLASS)
ENV_SET  MAINCLASS = $(INPUT)
NPP_SAVE
cmd /c "$(NPP_DIRECTORY)\scalaCompileAndRun.bat"  $(FULL_CURRENT_PATH)  $(SYS.MAINCLASS)

Save… ボタンを押して適当な名前で保存する。

上記を利用するには、

  1. 実行したいコードを入力
  2. F6 キーを押し NppExec のExecute… ダイアログを表示
  3. 先ほど保存したスクリプトをセレクトボックスで選択してOK ボタンを押す

起動するクラスを指定するダイアログが表示されるので入力して OK ボタンを押すと、コンパイルして実行される。

5283697369_e77c92178d_z

一度実行したら、Ctrl + F6 により再実行できる。

 

NppExec のドキュメント

ところで、NppExec のドキュメントは以下の場所にある。

  • npp.5.8.5-6.1.bin\unicode\plugins\doc\NppExec

参考にしたヘルプは、

  • Help > 3.7 NppExec's script
  • Help > 4.2 Environment
上記スクリプトに対応したメニューとショートカットを作成したい場合は以下を参考に。

 

関連記事

参考サイト

NppExec プラグイン

バッチ処理

2010年12月8日水曜日

Tutorial D で外部キーの定義 - 整合性制約で記述

Tutorial D の拡張と要約 - 値の計算と集約」のつづき

Tutorial D で関係変数の定義と代入」 では、以下のモデルに基いた関係変数を定義した。

5093301582_c738e3bb96

ソースコードはこちら。

上記 「割当て」 に対応した関係変数の定義は以下の通り。

var assignments base
  relation { id integer
           , p_id integer
           , g_id integer
           , date character }
    key {id};

「外部キー」を設定するのを忘れていたので、以下のように修正。

var assignments base
  relation { id integer
           , p_id integer
           , g_id integer
           , date character }
    key {id}
    foreign key {rename(p_id as id)} references persons
    foreign key {rename(g_id as id)} references groups;

しかし、Rel ではエラーが出て定義できない。 (+_+)

 

外部キーを整合性制約として記述する

Rel for M359 students によると「外部キー」は、

not defined in Tutorial D (use constraint instead,

Tutorial D では外部キーに対して特別な構文があるわけではなく、 「制約」 で記述するとのこと。

4873112753これに関して データベース実践講義 (p71) では次のように述べられている。

ここまで外部キーについて説明してきたのは、それらが実際に非常に重要であり、当初定義されたモデルの一部であるからだ。だが筆者が思うに、それらが実際には基本原理ではなく、現実に必要になることが多い特定の整合性制約の省略表記にすぎないことを強調しておくべきだろう。

 

制約の書き方

先ほどの "Rel for M359 students" には外部キーの制約を、

  • 半結合 
  • 関係が空であることを調べる IS_EMPTY 演算子

の二つを利用した方法が書かれている。

constraint 制約の識別子
  IS_EMPTY(参照元の関係変数 not matching 参照先の関係変数);

これを参考にして、上記の 「割当て」 に整合性制約を設定してみる。

 

「割当て」 の整合性制約

設定したい制約は、「割当て」 における 「人」 を指し示す属性 p_id に、「人」 として存在しないタプルのキーが入力されないようにすること。

大雑把に次のように言い換えることができる。

  • 「割当て」 から見て、「人」 へとリンクしない「割当て」のタプルがあってはならない。

これを制約として書くなら、

constraint AssignmentsFKPersons 
  IS_EMPTY(assignments not matching persons rename(id as p_id));

ただし、IS_EMPTY は大文字で記述する必要がある。

もう一つ、「割当て」における 「グループ」 を指し示す属性 g_id に、「グループ」 として存在しないタプルのキーが入力されないように制約を設定。

constraint AssignmentsFKGroups 
  IS_EMPTY(assignments not matching groups rename(id as g_id));

 

演算子は大文字・小文字を区別する

ところで、演算子 IS_EMPTY を is_empty と小文字で書くとエラーとなる。 Rel / Tutorial D Grammar を見ると is_empty がなかったので、最初 Rel では関係が空であることを確認する演算子が用意されていないのかと思った。

Language Enhancements によると、

Case sensitivity: Rel language keywords are not case sensitive. By convention, keywords are shown here in upper case to visually distinguish them, but the parser recognises them in lower case as well. Rel identifiers and string comparisons are case sensitive.

キーワードは大文字・小文字の区別をしないけれど、識別子は区別される。 よって、演算子の名前は大文字・小文字が区別される。 ( cf. op_def )

これに対して、Rel / Tutorial D Grammarsummary に定義されている COUNT 等は、キーワードなので小文字で書いても問題ないようだ。