11.25.2012

Scala: Find Fibonacci Numbers Using Matrix Multiplication

Scala: 行列累乗でフィボナッチ数列を解く

目的

  • いくつかの方法でフィボナッチ数列を求めるプログラムをScalaで実装してみる
  • 次の操作にかかる時間を測定し、比較する
    1. 0番目〜100番目のフィボナッチ数を列挙する
    2. 100,000番目のフィボナッチ数を求める

 

時間計測用の処理

このようなメソッドを予め用意した。
処理中に例外が発生した場合は、その概要が出力される。

import scala.util.control.Exception._

object Fibonacci {
  def timeit(description: String = "")(proc: => Unit) {
    val start = System.currentTimeMillis()
    allCatch.either(proc) match {
      case Left(e) => println(e)
      case _ =>
    }
    println(description + ": " + (System.currentTimeMillis() - start) + " msec")
  }
}

 

1. ワンライナー版

行列を使わずに、Streamで実装されたもの。
Scalaらしく、非常にエレガントなコードだ。

object FibonacciOneLiner {
  val fibs: Stream[BigInt] = BigInt(0) #:: BigInt(1) #:: fibs.zip(fibs.tail).map { n => n._1 + n._2 }
}

呼び出しは以下のようにする。

object Fibonacci {
  def main(args: Array[String]) {
    val n = 100
    val m = 100000
    timeit("[1] Enum first 100 Fibs") {
      FibonacciOneLiner.fibs.take(n + 1).zipWithIndex.foreach { x => println(x._2 + " : " + x._1) }
    }
    timeit("[1] Find 100,000th Fib") {
      println(m + ": " + FibonacciOneLiner.fibs.take(m + 1)(m))
    }
  }
}

計測結果は以下の通り。

  • 100番目までの列挙 => 390 ms
  • 100,000番目の表示 => java.lang.OutOfMemoryError 発生

 

2. 行列累乗版

行列の積によってフィボナッチ数列が求められることと、
平方行列のn乗が Θ(lg n) の計算時間で算出できることを利用して解く方法。

数学的な解説はReferencesを参照。

import annotation.tailrec

object FibonacciMatrix {
  type Matrix = Array[Array[BigInt]]

  implicit def arrayArrayInt2Matrix(m: Array[Array[Int]]): Matrix = {
    m.map {
      a: Array[Int] => a.map {
        x: Int => BigInt(x)
      }
    }
  }

  def mul(m1: Matrix, m2: Matrix) = {
    val res = Array.fill(m1.length, m2(0).length)(BigInt(0))
    for (row <- (0 until m1.length);
         col <- (0 until m2(0).length);
         i <- 0 until m1(0).length) {
      res(row)(col) += m1(row)(i) * m2(i)(col)
    }
    res
  }

  def pow(a: Matrix, n: Int) = {
    @tailrec
    def powLocal(a: Matrix, b: Matrix, n: Int): Matrix = n match {
      case 0 => b
      case x if (x & 1) == 1 => powLocal(mul(a, a), mul(a, b), x >> 1)
      case x => powLocal(mul(a, a), b, x >> 1)
    }
    val unit = Array(Array(BigInt(1), BigInt(0)), Array(BigInt(0), BigInt(1))) // 単位行列
    if (n < 0) throw new IllegalArgumentException
    powLocal(a, unit, n)
  }

  def fib(n: Int) = {
    val m = Array(Array(1, 1), Array(1, 0))
    pow(m, n)(1)(0)
  }
}

行列(Matrix)をBigIntの二次元配列で表現。
Intの二次元配列からBigIntの二次元配列への暗黙の型変換メソッドを作成。
累乗を求める部分では、内部関数として末尾再帰の最適化が行われるよう工夫した。

呼び出し部分はこちら。

object Fibonacci {
  def main(args: Array[String]) {
    val n = 100
    val m = 100000
    timeit("[2] Enum first 100 Fibs") {
      (0 to n).foreach { i => println(i + ": " + FibonacciMatrix.fib(i)) }
    }
    timeit("[2] Find 100,000th Fib") {
      println(m + ": " + FibonacciMatrix.fib(m))
    }
  }
}

計測結果は以下の通り。

  • 100番目までの列挙 => 108 ms
  • 100,000番目の表示 => 120 ms

OutOfMemoryが発生しない上に、処理時間そのものも大幅に短縮できた。

 

3. 行列累乗(並列処理)版

行列計算の mul メソッドを par を使って並列化したバージョン。

import annotation.tailrec

object FibonacciMatrix {
  type Matrix = Array[Array[BigInt]]

  implicit def arrayArrayInt2Matrix(m: Array[Array[Int]]): Matrix = {
    m.map {
      a: Array[Int] => a.map {
        x: Int => BigInt(x)
      }
    }
  }

  def mul(m1: Matrix, m2: Matrix) = {
    val res = Array.fill(m1.length, m2(0).length)(BigInt(0))
    for (row <- (0 until m1.length).par;
         col <- (0 until m2(0).length).par;
         i <- 0 until m1(0).length) {
      res(row)(col) += m1(row)(i) * m2(i)(col)
    }
    res
  }

  def pow(a: Matrix, n: Int) = {
    @tailrec
    def powLocal(a: Matrix, b: Matrix, n: Int): Matrix = n match {
      case 0 => b
      case x if (x & 1) == 1 => powLocal(mul(a, a), mul(a, b), x >> 1)
      case x => powLocal(mul(a, a), b, x >> 1)
    }
    val unit = Array(Array(BigInt(1), BigInt(0)), Array(BigInt(0), BigInt(1))) // 単位行列
    if (n < 0) throw new IllegalArgumentException
    powLocal(a, unit, n)
  }

  def fib(n: Int) = {
    val m = Array(Array(1, 1), Array(1, 0))
    pow(m, n)(1)(0)
  }
}

呼び出し方法。

object Fibonacci {
  def main(args: Array[String]) {
    val n = 100
    val m = 100000
    timeit("[3] Enum first 100 Fibs") {
      (0 to n).foreach { i => println(i + ": " + FibonacciMatrixParallel.fib(i)) }
    }
    timeit("[3] Find 100,000th Fib") {
      println(m + ": " + FibonacciMatrixParallel.fib(m))
    }
  }
}

計測結果は以下の通り。

  • 100番目までの列挙 => 498 ms
  • 100,000番目の表示 => 106 ms

100,000番目の算出はごく僅かに速くなったが、100番目までの列挙は逆に遅くなってしまった。

 

References

MIT OCW - Lecture 3: Divide-and-Conquer: Strassen, Fibonacci, Polynomial Multiplication
http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-046j-introduction-to-algorithms-sma-5503-fall-2005/video-lectures/lecture-3-divide-and-conquer-strassen-fibonacci-polynomial-multiplication/

ワンライナー・フィボナッチ
http://stackoverflow.com/questions/7388416/what-is-the-fastest-way-to-write-fibonacci-function-in-scala

行列の積の求め方
http://blog.scala4java.com/2011/12/matrix-multiplication-in-scala-single.html 

11.18.2012

IntelliJ IDEA Editor Settings

IntelliJ IDEA エディタ設定まとめ

デフォルトから変更した内容のメモ。

設定画面の入り方は
  Windows, Linux => File –> Settings –> IDE Settings
  Mac => IntelliJ IDEA –> Preferences… –> IDE Settings

エディタ

  • Editor
    • Virtual Space –> Allow placement of caret after end of line: ON => OFF
      フリーカーソル(キャレットを行末以降に移動可能)の無効化。
  • Editor –> Apperance
    • Show line numbers: OFF => ON
      エディタに行番号を表示
    • Show whitespaces: OFF => ON
      エディタにホワイトスペース(空白、タブ)を表示
  • Editor –> Editor Tabs
    • Tab Apperance –> Mark modified tabs with asterisk: OFF => ON
      変更したファイルには、タブにアスタリスクを表示する
  • Editor –> Code Completion
    • Code Completion –> Case sensitive completion: First letter => None
      コード補完を行う際、大文字・小文字を区別しない。慣れたら変えるかも。
    • Code Completion –> Autopopup documentation in (ms): OFF => ON(1000)
      コード補完中にドキュメントを自動ポップアップ(1000ms後)

 

キーマップ

  • Keymap
    • Keymaps: Default
    • Other –> Run context confitguration: F10 を追加で割り当て
      編集中のコードを「F10」で実行できるようにする。
      Mac Book Air だと不便なので、とりあえず Mac + Enter に割り当て。
    • Other –> Comment with Line Comment: Ctrl + / などを必要に応じて割り当て
      行コメントの有効化/無効化
      既に他のコマンドに割り当てられている設定は残す(Leave)。
    • Editor Actions –> Tab: Tab キーを削除
    • Editor Actions –> Emacs Tab: Tab キーを割り当て
      直前のコード位置を検知してタブ補完する。

 

テンプレート

  • Live Templates
    • scala 配下で右上の + ボタンを押下
      • テンプレート sout を作成
        • Abbreviation: sout
        • Description: Prints a string to System.out
        • Template text:
          println($END$)
        • Applicable in: Scala
        • Options –> Reformat according to style: OFF => ON

 

References

http://d.hatena.ne.jp/kaiseh/20091105/1257447866

11.13.2012

HtaMarkdownViewer

HTA版 マークダウン ビューア

マークダウン記法で書かれたテキストファイルの内容をHTA上で
レンダリングするツールを作成。

コンバートの実装は「showdown.js」をそのまま流用。

HTAにパラメータを渡せばそのファイルを開き、そうでない場合は「ファイルを開く」ダイアログを出している。

最低限の機能しか無いので、印刷などは右クリックかショートカットキーでの
代用が必要。

インターネット接続もソフトのインストールも禁止されている、レガシーなWindows環境向けに。

 

References

showdown.js - A JavaScript port of Markdown
https://github.com/coreyti/showdown 

11.12.2012

HTA Template with JavaScript

JavaScript版 HTAテンプレート

VBScript の部分を JavaScript に書き換え。

 

 

Related Posts

http://mogproject.blogspot.jp/2012/04/general-purpose-hta-template.html

GnuWin32 Error - ld.exe Entry Point Not Found

GnuWin32 エラー - ld.exe - エントリポイントが見つかりません

概要

Windows 上で実行可能なUNIX系コマンドセットの1つである GnuWin32 を導入したところ、g++ の実行で以下のようなエラーが発生した。

ld.exe - エントリ ポイントが見つかりません

プロシージャ エントリ ポイント libiconv がダイナミック リンク ライブラリ libiconv-2.dll から見つかりませんでした。

原因

これは、インストールツールである GetGnuWin32.exe [1] が古いバージョンのモジュールをダウンロードしてしまうためである。

対応

GnuWin32\bin 配下の libiconv-2.dll (Ver.1.8) を最新化 (1.14) したら直った。

ただしその他のモジュールも古いものが散見されるので、素直にMinGW/MSYS や Cygwin を使った方が良さそうだ。

 

References

[1] http://sourceforge.net/projects/getgnuwin32/files/

11.11.2012

Sharing a Personal Eclipse Project with Dropbox + Git

Dropbox + Git を使って個人用の Eclipse プロジェクト(今回はC++)を共有する方法

 

2013-01-13 手順更新
mog project: Sharing a Personal Eclipse Project with Dropbox + Git [Updated]

 

何番煎じか分からないけど、意外とハマったのでメモ。

1. 事前準備

  • Git の導入
    • Linux では $ sudo apt-get install git-core
  • Eclipse プラグイン EGit の導入
  • EGit の共通設定
    • メニューから Window -> Preferences (Mac は Eclipse -> Preferences)
    • Team -> Git
      • Default repository folder を適宜設定 (デフォルトは ~/git)
    • Team -> Git -> Configuration
      • User Settings -> Add Entry... を押下
      • Key: user.name, Value: ユーザ名 を設定
      • Key: user.email, Value: メールアドレス を設定

2. ローカルリポジトリの作成

  • まずは普通にプロジェクトを作成。今回はCDTプロジェクトとした。
  • プロジェクトのコンテキストメニューから、Team -> Share Project…
  • Share Project: Git
  • Configure Git Repository
    • 今回のプロジェクトはワークスペースの直下にあるため、
      Use or create repository in parent folder of project にはチェックを付けない
Git リポジトリの配下にプロジェクトのディレクトリが作成される。
ワークスペースと同じ場所にリポジトリを作るのは非推奨。
      • Repository -> Create を押下
        • Parent directory: ローカルマシン上のディレクトリ
        • Name: プロジェクトの集合の名前を入力し Finish
作業用レポジトリをローカルに作成することで、Dropbox の使用量および通信量を節約できる。
    • 設定例
      • Current Location: ワークスペース/プロジェクト名
      • Target Location: ~/git/eclipse/プロジェクト名
    • プロジェクトにチェックが付いていることを確認し Finish
  • この段階ではまだ NO-HEAD
  • プロジェクトディレクトリ直下にファイル .gitignore を作成
    ※ファイル末尾に改行を入れないと、Macでは最後の行が評価されなくなったので注意
.DS_Store
Release/
Debug/
.settings/
  • プロジェクトのコンテキストメニューから Team -> Commit…
    • Commit message: 適当なメッセージ
    • Files: Select All アイコン(右上のチェックマーク)を押下し全て選択
    • Push the changes to upstream のチェックを外してから Commit

3. Dropbox 上のリポジトリの設定

  • Eclipse でプロジェクトのコンテキストメニューから Team -> Show in Repositories View
  • Git リポジトリビューのアイコン Create a new Git Repository and add it to this view を選択
    • Create a New Git Repository
      • Parent directory: ここで Dropbox 配下のディレクトリを指定
      • Name: リポジトリの名前 (例: eclipse)
      • Create as bare repository: チェックを付ける
  • Git リポジトリビューでローカルリポジトリのコンテキストメニューから Push
    • Destination Git Repository
      • URI: 先ほど作成したDropbox 配下のディレクトリを指定
      • Connection -> Protocol: file
    • Push Ref Specifications
      • Source ref: master [branch] (refs/heads/master)
      • Add Spec を押下
      • Finish を押下し、Push Results を確認
  • Git リポジトリビューでローカルリポジトリ -> Remotes のコンテキストメニューから Create Remote… を選択
    • Remote name: dropbox などの適当な名前
    • Configure fetch を選択
    • Configure push for remote 'dropbox'
      • URI: Dropbox配下のリポジトリを指定
      • Ref mappings: +refs/heads/*:refs/remotes/dropbox/* であることを確認
      • Save and Fetch を押下し、everything up to date と表示されればOK
  • Git リポジトリビューでローカルリポジトリのコンテキストメニューから Properties を選択
    • Configuration -> Add Entry… を押下
    • Key: branch.master.remote, Value: dropbox (リモートに指定した名前)
    • Key: branch.master.merge, Value: refs/heads/master
    • Key: branch.master.rebase, Value: true

4. 別のPCで Dropbox と同期

  • Eclipse を起動し、Window -> Show View -> Other… -> Git -> Git Repositories
    • Git リポジトリビューのアイコン Clone a Git Repository and add the clone to this view
    • Source Git Repository
      • Location -> URI: Dropbox 配下のディレクトリを指定
      • Connection -> Protocol: file
      • Branch Selection: master
      • Local Destination
        • Destination -> Directory ローカルリポジトリの保存先
        • Initial branch: master
        • Clone submodules: チェック無し
        • Configuration -> Remote name: dropbox など
        • Projects -> Import all existing projects after clone finishes: チェック無し
        • Projects -> Add projects to working sets: チェック無し
        • Select a wizard to use for importing projects: Import existing projects
  • メニューから File -> Import…
    • Select: Git -> Projects from Git
    • Select Repository Source: Local
    • Select a Git Repository: 先ほどクローンを作成したローカルリポジトリを指定
    • Select a wizard to use for importing projects: Import existing projects
    • Import Projects: プロジェクトが選択されていることを確認し Finish
    • Source Git Repository
      • Location -> URI: Dropbox 配下のディレクトリを指定
      • Connection -> Protocol: file
    • Branch Selection: master
    • Local Destination
      • Destination -> Directory ローカルリポジトリの保存先
      • Initial branch: master
      • Clone submodules: チェック無し
      • Configuration -> Remote name: dropbox など
      • Select a wizard to use for importing projects: Import existing projects 

本来であればインポートウィザードで直接クローンを作りたかったのだが、Mac+CDTという環境が悪いのか、どうにもうまくいかなかった。

(具体的には、Dropbox上のリポジトリを選択した後でプロジェクトの一覧に何も出てこない状態に陥る)

リポジトリビューから操作を行うことで、なんとか事象を回避することができた。

 

環境
  • Ubuntu natty(11.04) 64bit: Elipse Juno(4.2) + CDT 8.1.0 + EGit 2.1.0 + Git 1.7.4.1
  • OS X Mountain Lion(10.8.1): Eclipse Juno(4.2) + CDT 8.1.0 + EGit 2.1.0 + Git 1.7.9.6 

 

References

EGit User Guide
http://wiki.eclipse.org/EGit/User_Guide 

Eclipse RCP, RAP Blog: EGit によるソースコード管理(1) ローカルリポジトリの作成:
http://brissyu.blogspot.jp/2012/02/hudson-tycho-4.html 

eclipse 4.2×EGit環境でPush/Pullのハマりどころを回避する  - mooapp 

Git チートシート
http://www.textdrop.net/doc/git-cheat-sheet-ja/ 

11.06.2012

Mac: Uninstalling IntelliJ IDEA 11 CE

Mac: IntelliJ IDEA 11 Community Edition のアンインストール

  • Applications からプログラムを削除
    $ rm -r /Applications/IntelliJ\ IDEA\ 11\ CE.app/
  • $HOME/Library配下から設定・プラグイン関連のファイルを削除
    $ rm -r ~/Library/Preferences/IdeaIC11/
    $ rm -r ~/Library/Preferences/com.jetbrains.intellij.ce.plist
    $ rm -r ~/Library/Application\ Support/IdeaIC11/
    $ rm -r ~/Library/Caches/IdeaIC11/
  • プロジェクトディレクトリを削除

 

References

はじめてのIntellij IDEA - アンインストール - Yamkazu's Blog
http://yamkazu.hatenablog.com/entry/20110609/1341328718

11.04.2012

SyntaxHighlighter: How to Set Alternate Row Colors

SyntaxHighlighter: 行の背景色を互い違いにする方法

SyntaxHighlighter 3.x では、shCoreDefault.css (※) の設定内容を変えれば奇数行と偶数行の背景色を変えることができる。

※ヘッダ部で shCoreDefault.css をインクルードしている場合。

タイトル行、奇数行、偶数行の背景色の変更

shCoreDefault.css の以下の部分を変えればよい。

タイトル行 => .syntaxhighlighter
偶数行     => .syntaxhighlighter .line.alt1
奇数行     => .syntaxhighlighter .line.alt2

.syntaxhighlighter {
  background-color: white !important;
}
.syntaxhighlighter .line.alt1 {
  background-color: white !important;
}
.syntaxhighlighter .line.alt2 {
  background-color: white !important;
}
.syntaxhighlighter {
  background-color: #c9c9c9 !important;
}
.syntaxhighlighter .line.alt1 {
  background-color: #efefef !important;
}
.syntaxhighlighter .line.alt2 {
  background-color: white !important;
}

ハイライト行の背景色の変更

さらに、ハイライト行の背景色もカスタマイズしてみた。

.syntaxhighlighter .line.highlighted.alt1, .syntaxhighlighter .line.highlighted.alt2 {
  background-color: #e0e0e0 !important;
}
.syntaxhighlighter .line.highlighted.alt1, .syntaxhighlighter .line.highlighted.alt2 {
  background-color: #a9ffa9 !important;
}

 

References

http://ateitexe.com/wordpress/syntaxhighlighter-customize/

11.03.2012

Mac: Coding Scala with IntelliJ IDEA (2)

Mac: IntelliJ IDEA で Scala コーディング (2)

前回(http://mogproject.blogspot.jp/2012/11/mac-coding-scala-with-intellij-idea-1.html)の続き。

  • 前提条件

Scala がインストールされていること
  参考 http://mogproject.blogspot.jp/2012/06/installing-scala-in-mac-os-x.html)

3. プロジェクトの作成

手順に入る前に、IDEAの用語について理解する必要がある。

Eclipse FAQ - http://wiki.jetbrains.net/intellij/Eclipse_FAQ

にあるように、Eclipse の『プロジェクト』は、IDEAでは『モジュール』と呼ぶ。
そして、Eclipse の『ワークスペース』(複数のプロジェクトをまとめた単位)に相当するのが、
IDEAの『プロジェクト』である。

それを踏まえ、まずはプロジェクト(最も大枠の単位)を作成する。

IntelliJ IDEA 11 1 4

Welcome 画面から、Quick Start -> Create New Project をクリック。
New Project 2 ウィザードが立ち上がるので、一番上の Create project from scratch (プロジェクトの新規作成)を選択、Next をクリック。
New Project

プロジェクト名(Project name)、格納先(Project files location)を適宜指定。

その下の Create Module にチェックを付けると、プロジェクトと一緒にモジュールを作成することができる。

今回はモジュールも作成するが、後から追加することも簡単にできる。
特に複数のモジュールでプロジェクトを構成するような場合には、このタイミングでモジュールを作成しなくてもよさそうだ。

モジュールの設定では、Select type にて Java Module を指定し、Next をクリック。

New Project

ソースディレクトリの作成に関する指定。

通常はデフォルトのとおり、src ディレクトリを作成しておくのが無難。

Next をクリック。

New Project

Java SDK の指定画面。

初期状態では何もないので、右上の Configure… をクリック。

New Project

JDKのインストール先を選択。

今回は
  /Library/Java/JavaVirtualMachines/
    1.7.0.jdk/Contents/Home
を選択。 

戻った画面で Next をクリック。

New Project

左側のペインで Scala を選択。

Use Scala distribution を選択してから
Scala のパス: 手元の環境なら
  /usr/local/Cellar/scala/2.9.2/libexec
を選択。 

brew でインストールした場合には、ここでlibexec まで指定しなければならないので注意。

  => 参照

しかしまだ何やら警告が出ている。
/doc/scala-devel- … が見つからないとのこと。

$ cd /usr/local/Cellar/scala/2.9.2/libexec
$ mkdir -p ./doc/scala-devel-docs
$ cd ./doc/scala-devel-docs
$ curl -O http://www.scala-lang.org/downloads/distrib/files/scala-docs-2.9.2.zip
$ unzip ./scala-docs-2.9.2.zip
$ mv -i ./scala-docs-2.9.2 ./api
$ rm -i ./scala-docs-2.9.2.zip

上記の参照先に解決方法が載っていた。

このURLからドキュメントをダウンロードし、Scala ホーム配下の doc/scala-devel-docs/api ディレクトリへ配備しないといけないようだ。

コマンド実行例は左記のとおり。 

New Project

エラーが消えたら、プロジェクトに対応する『ファセット』の設定を行う。

ファセットとは、直訳すると面、様相、一面。
フレームワークや言語のコンフィギュレーションをひとまとめにした単位のことらしい。

今回は、コンパイラおよびライブラリの名前にバージョンを付け足し、適用レベルを global に変えてみた。

Finish をクリック。

Tip of the Day

プロジェクトがロードされ、Tip of the Day がランダムに表示される。

読む必要がなければ、Show Tips on Startup のチェックを外して Close すればよい。

Hello scala   proj hello scala

プロジェクトのウィンドウはこのような感じ。

右上にメッセージが出た場合は、Event Log からもその内容を確認できる。

 

4. ソースコードの作成

「hello_scala」パッケージの「HelloScala」というオブジェクトを作成する。
内容はメッセージを1行表示するだけ。 

Pasted Image 6 src ディレクトリで右クリックし、
New -> Package を選択。 
New Package パッケージ名を入力し、OK をクリック。
Pasted Image 11 6 12 8 23 AM 作成された hello_scala パッケージを右クリックし、New -> Scala Class を選択。
Create New Scala Class

オブジェクト名を入力し、Kind に Object と指定して OK をクリック。

ちなみに、このとき hello_scala.HelloScala というように <パッケージ名>.<オブジェクト名>と指定すれば、パッケージ作成処理を省略できる。

Pasted Image

ここからは、ソースコードの編集。
Vimキーバインドが心地よい。 

オブジェクトを実行可能にする方法を2つ紹介する。

1つ目は、scala.App トレイトを継承する方法。

オブジェクトの定義に
  extends App
と追加すればよい。

このとき、実際のキー入力は
  e <タブ> Ap <タブ> 
だけでよかった。

HelloScala scala   hello scala  hello scala   proj hello scala

 2つ目は、コード補完を利用して main メソッドを定義する方法。

main と入力してタブキーを押下すると・・・

HelloScala scala   hello scala  hello scala   proj hello scala 自動的に main メソッドのテンプレートに置き換わる。 
Pasted Image 11 6 12 10 30 PM ソースコードを書き終わったら、右クリックして Run 'HelloScala.main()' を選択。
 HelloScala scala   hello scala  hello scala   proj hello scala プログラムが実行され、コンソールウィンドウに処理結果が表示された。

 

Related Posts

Mac: Coding Scala with IntelliJ IDEA (1)
http://mogproject.blogspot.jp/2012/11/mac-coding-scala-with-intellij-idea-1.html

 

References

Getting Started with IntelliJ IDEA Scala Plugin
http://confluence.jetbrains.net/display/SCA/Getting+Started+with+IntelliJ+IDEA+Scala+Plugin 

Project Configuration Explained
http://devnet.jetbrains.net/thread/290032

11.01.2012

Google Chrome: Could Not Get Temp Directory

Google Chrome 拡張機能インストールエラー

Windows XP で、ハードディスク・ドライブをダイナミック・ディスク(※)として使っている場合、
Google Chromeの拡張機能をインストールできないという不具合がある。

http://code.google.com/p/chromium/issues/detail?id=117106

パッケージをインストールできませんでした: COULD_NOT_GET_TEMP_DIRECTORY

先日正式版がリリースされた「Chrome リモート デスクトップ」を試してみようと思ったのだが、これは酷い。

別途ベーシック・ディスク(またはリムーバブル・メディア)を用意してマウントし、そこにユーザデータ領域を指定する
(--user-data-dirオプション)くらいしか回避方法がないらしい。

References

http://windows.microsoft.com/ja-JP/windows-vista/What-are-basic-and-dynamic-disks

Mac: Coding Scala with IntelliJ IDEA (1)

Mac: IntelliJ IDEA で Scala コーディング (1)

Best IDE としての呼び声も高い IntelliJ IDEA に触れてみたいと思い、インストールを行ってみた。
その手順をメモとして残しておく。

1. インストール

まずは、IntelliJ IDEA のダウンロードページを開く。
http://www.jetbrains.com/idea/download/

 Screenshot

Ultimate Edition (有償) と Community Edition (無償) の 2種類を選べるが、
今回はMac用の Community Edition を選ぶこととする。現時点の最新版は Version:11.1.4 だった。

システム要件 (System Requirements ページより)
  • Mac OS X 10.5 or higher, up to 10.7 (Lion)
  • 1 GB RAM minimum, 2 GB RAM recommended
  • 300 MB hard disk space + at least 1 GB for caches
  • 1024x768 minimum screen resolution
  • JDK 6
IntelliJ IDEA 11 CE ダウンロードした ideaIC-11.1.4.dmg を実行すると、このような画面が出る。
「IntelliJ IDEA 11 CE.app」を左上の Applications フォルダへドラッグ&ドロップする。

 

2. 初回起動とプラグインのインストール

 Launchpad などから IntelliJ IDEA を起動。

B22D9520 61B3 4147 A241 56745E2DC799 2 初回起動時には警告が出る場合は Open を選択。
(メッセージの言語は環境に依存)
Complete Installation 以前のバージョンから設定を引き継ぐ場合は上のオプションを選択。
今回は新規インストールなので下のオプションのまま OK
IntelliJ IDEA 11 1 4

無事に起動できた。

ここで、プロジェクトを作成する前にプラグインを追加する。
右上の Plugins -> Open Plugin Manager を選択。

Plugins 左下の Browse repositories… を選択。
Browse Repositories

プラグイン Scala を選択し、右クリックして Download and Install
確認に対して Yes を選択。

右上の検索窓から探すと早い。

今回はさらに、Vim キーバインドのプラグイン IdeaVIM もインストールした。

Screenshot 2

OK を押して戻っていくと、IDEAの再起動を求められる。

Restart を選択し、IDEAを再起動。

Vim Keymap settings 4

IDEA 再起動後、Vim キーマップの設定が表示される。

  • Mac OS X 10.5+
  • Mac OS X
  • Emacs
  • Visual Studio
  • Eclipse
  • Net Beans 6.5
  • JBuilder 
から選ぶことが可能。今回は「Mac OS X 10.5+」にしてみた。(※1)
 

※1 キーマップの違いはこちらを参照。
KeyMap for Windows/Linux http://www.jetbrains.com/idea/docs/IntelliJIDEA_ReferenceCard.pdf
KeyMap for Mac OS X http://www.jetbrains.com/idea/docs/IntelliJIDEA_ReferenceCard_Mac.pdf
Mac にはなぜ2種類のキーマップがあるのか ---- (KeyMap for Mac OS X より)

IntelliJ IDEA を Mac OS X のみで利用するのなら、"Mac OS X 10.5+" を推奨する。
デフォルトの "Mac OS X" のスキーマは、他のプラットフォームも使用しているユーザのために
Windows/Linux と近いキーマップになるよう用意したものである。

 

Related Posts

Mac: Coding Scala with IntelliJ IDEA (2)
http://mogproject.blogspot.jp/2012/11/mac-coding-scala-with-intellij-idea-2.html 

 

References

IntelliJ IDEA - http://www.jetbrains.com/idea/
Scala プラグイン - http://confluence.jetbrains.net/display/SCA/Scala+Plugin+for+IntelliJ+IDEA
IdeaVIM - https://github.com/JetBrains/ideavim