前回、m2eclipse-scalaを使って、Scala プロジェクトの pom.xml を Eclipse にインポートした。
インポートの結果作成された .project ファイルと、.classpath ファイルの中身を確認しておく。
ページ
▼
2012年9月30日日曜日
2012年9月28日金曜日
[Scala] Eclipse に Scala の Maven プロジェクトを インポート
Eclipse に Scala の Maven プロジェクトを m2e を使ってインポートする。
m2eclipse-scala を使う。
これをインストールしておかないと、pom.xml を import するときに、 maven-scala-plugin:2.15.2:compile と testCompile の resolve ができずにエラーになってしまう。
m2eclipse-scala を使う。
これをインストールしておかないと、pom.xml を import するときに、 maven-scala-plugin:2.15.2:compile と testCompile の resolve ができずにエラーになってしまう。
2012年9月26日水曜日
[Scala] REPLを使う
これまで Scala は Eclipse IDE で使ってきた。
Eclipse IDE で使う分には Scala SDK のインストールは必要ないのでインストールしていなかったのだが、 ちょっとしたことを確認するのに REPL があると便利なので入れてみる。
Scala の本家 から最新の stable release である Scala 2.9.2 をダウンロード。
Windows 版は zip 版と msi 版があるが msi 版は何がどう設置されるのかわからないので zip 版をダウンロード。 展開して bin ディレクトリにパスを通す。
これだけで準備は完了。REPL を使ってみる。
Eclipse IDE で使う分には Scala SDK のインストールは必要ないのでインストールしていなかったのだが、 ちょっとしたことを確認するのに REPL があると便利なので入れてみる。
Scala の本家 から最新の stable release である Scala 2.9.2 をダウンロード。
Windows 版は zip 版と msi 版があるが msi 版は何がどう設置されるのかわからないので zip 版をダウンロード。 展開して bin ディレクトリにパスを通す。
これだけで準備は完了。REPL を使ってみる。
2012年9月24日月曜日
Sakura エディタ で HTML エンコードマクロを作る。
Blogger で XML ソースを書く際には 特殊文字をエンコードする必要があるのだが、面倒なのでエディタで一括で処理できるようにしよう。普段はサクラエディタ (Sakura Editor) を使っているので、サクラエディタのマクロとして作ることにする。
2012年9月23日日曜日
[Scala] match 文の仕組み
このブログを見て match 文 の仕組みが分かった気がするのでメモしておく。
-
パターンマッチをもっと便利に - extractor(抽出子)による拡張
- ゆるよろ日記 -
2012年9月21日金曜日
[Scala] 正規表現によるマッチ
正規表現を使った match ... case 文を使ってみる。
val p : Regex = ".*no=([0-9]+),name=(.*)".r; val values = List( "no=10,name=ten", "no=11,name=eleven", "no=20,name=twelve" ); for (value <- values ) { value match { case p("10", v) => println("name for 10: " + v) case p("11", v) => println("name for 11: " + v) case p(n, v) => println("name, value= " + (n,v)) } }
name for 10: ten name for 11: eleven name, value= (20,twelve)
2012年9月20日木曜日
[Scala] 一般クラスのマッチ
List や Tuple ではない一般のクラスの場合、unapply、unapplySeq いわゆる抽出子(extractor)を定義しておくことで match ... case 文で使えるようになる。
... val a = new MatchSampleClass; a match { case MatchSampleClass(x, y) => println("x: " + x + " y: " + y); case _ => println("OTHER: " + a); } .... class MatchSampleClass object MatchSampleClass { def unapply(obj : MatchSampleClass) : Option[(String, String)] = { return Option(("ONE", "TWO")); } }
x: ONE y: TWO
2012年9月18日火曜日
[Scala] Eclipse の Java プロジェクトで Scala を使えるようにする。
目標: 既存の Java プロジェクトで Scala も使えるようにすること。
基本的には、.project ファイルと .classpath ファイルに手を入れればできるはず。
やってみよう。
前提条件は、Eclipse に Scala IDE が導入されていること。
環境は、Eclipse Juno + Scala IDE nightly build 版( Juno 対応版)。
.project や .classpath ファイルを直接編集するので、Eclipse は終了しておくか編集対象プロジェクトを Close しておく。
基本的には、.project ファイルと .classpath ファイルに手を入れればできるはず。
やってみよう。
前提条件は、Eclipse に Scala IDE が導入されていること。
環境は、Eclipse Juno + Scala IDE nightly build 版( Juno 対応版)。
.project や .classpath ファイルを直接編集するので、Eclipse は終了しておくか編集対象プロジェクトを Close しておく。
2012年9月17日月曜日
[Scala] Maven2 で Scala を使う。
Mavan2 を使って Scala をビルドできるようにしておこう。
Maven-scala-Plugin を使う。
主な情報源は以下の2つ。
Maven-scala-Plugin の 最新版は 2.14.2-SNAPSHOT、最終更新は 2010-08-04 15:42 と記載されているが、 実際にリポジトリ上には現時点で 2.15.2(Sun Feb 06 08:52:23 CST 2011) がアップロードされている。
Maven-scala-Plugin を使う。
主な情報源は以下の2つ。
- Maven For Beginners
Scala での Maven の使い方 - Maven-scala-Plugin の ホームページ
Maven-scala-Plugin の使い方
Maven-scala-Plugin の 最新版は 2.14.2-SNAPSHOT、最終更新は 2010-08-04 15:42 と記載されているが、 実際にリポジトリ上には現時点で 2.15.2(Sun Feb 06 08:52:23 CST 2011) がアップロードされている。
2012年9月16日日曜日
m2e で Eclipse + Maven 環境を作る時に J2SE を指定する
これまで、
の両記事で m2e での import の動作についてみてきた。
m2e で pom.xml をインポートする際に、
という警告が出ていたのだが、これは pom.xml に maven-compiler-plugin の configuration を書くことで抑止できる。
やってみる。
m2e で pom.xml をインポートする際に、
Build path specifies execution environment J2SE-1.5. There are no JREs installed in the workspace that are strictly compatible with this environment.
という警告が出ていたのだが、これは pom.xml に maven-compiler-plugin の configuration を書くことで抑止できる。
やってみる。
2012年9月15日土曜日
2012年9月14日金曜日
m2e で Eclipse + Maven 環境を作る。
以前は、Eclipse + maven といえば、 m2eclipse プラグインMだったが、
最近は Eclipse プロジェクトに統合されて m2e となっている。
m2e で maven プロジェクトを Eclipse に取り込んでみる。
2012年9月11日火曜日
[Scala] シーケンスのマッチ
List などシーケンス(Seq)のマッチを見てみよう。
Tuple と同様に型や出現位置によってマッチングを行い、変数への値の設定が行われる。
Tuple と違って List は可変長なので各 case 句の要素数の違いによるマッチもできる。
Tuple と同様に型や出現位置によってマッチングを行い、変数への値の設定が行われる。
Tuple と違って List は可変長なので各 case 句の要素数の違いによるマッチもできる。
2012年9月9日日曜日
[Scala] 後のオブジェクトのメソッドが実行される演算子
Scala では 「:(コロン)で終わる演算子」 を中置記法で使うと 「後のオブジェクトのメソッド」 が実行される。代表的な例が、List#:: 。
「 aList.::("x") 」では普通のメソッドと同様に aList の :: メソッドが実行される。
「"x" :: aList 」と中置記法で書くと、通常は演算子の前のオブジェクトがレシーバーになるのと違い、 演算子の後にある aList がレシーバーになる。
val aList = List("A"); println (aList.::("x")); println ("x" :: aList);
List(x, A) List(x, A)
「 aList.::("x") 」では普通のメソッドと同様に aList の :: メソッドが実行される。
「"x" :: aList 」と中置記法で書くと、通常は演算子の前のオブジェクトがレシーバーになるのと違い、 演算子の後にある aList がレシーバーになる。
2012年9月7日金曜日
[Scala] match (Tuple編)
Tuple に対する match...case のパターンマッチを見てみる。これがかなりに強力。
引数の型や数によってマッチする case 節を判定し、マッチした case 節の変数に値を割り当ててくれる。
引数の型や数によってマッチする case 節を判定し、マッチした case 節の変数に値を割り当ててくれる。
val list1 : List[Any] = List( ("one", 1), (2, 2), ("three", "tri", 3) ); for (elem <- list1) { elem match { case (v1: String, v2:Int) => println("[String, Int]: " + v1 + ", " + v2); case (v1: Int, v2:Int) => println("[Int, Int]: " + v1 + ", " + v2); case (v1, v2, v3) => println("[Triple]: " + v1 + ", " + v2 + ", " + v3); case _ => println("OTHER"); } }
[String, Int]: one, 1 [Int, Int]: 2, 2 [Triple]: three, tri, 3
2012年9月6日木曜日
[Scala] match (基本編)
多彩な機能を持つ Scala のMatch 文を見ていくことにする。
まずは基本形。
いずれの条件にもマッチしなかった場合、Java でいうところの default は 「case _ 」で書く。
まずは基本形。
val a : Int = 2; a match { case 1 => println("ONE"); case 2 => println("TWO"); case _ => println("OTHER: " + a); }
いずれの条件にもマッチしなかった場合、Java でいうところの default は 「case _ 」で書く。
2012年9月5日水曜日
[AppEngine] ログ出力
Google App Engine ではファイル出力ができないので、
何か記録を残そうとしたらデータベースに書くかログに出力することになる。
App Engine ではデフォルトでは java.util.logging を使用する設定になっている。
管理ツールのLogsで見るとこんな感じに出力されている。
管理ツールのLogs画面で Timezone を選択できる。ログの時刻はここで選択した Timezone を使って表示される。
App Engine ではデフォルトでは java.util.logging を使用する設定になっている。
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException { Logger logger = Logger.getLogger("SampleLogger"); logger.info("INFOログです。"); logger.warning("WARNINGログです。"); resp.setContentType("text/plain; charset=utf-8"); resp.getWriter().println("ログ出力テスト"); }
管理ツールのLogsで見るとこんな感じに出力されている。
管理ツールのLogs画面で Timezone を選択できる。ログの時刻はここで選択した Timezone を使って表示される。
2012年9月4日火曜日
[AppEngine] JDO の Cross-Group-Transaction
AppEngine のデータストアでは、デフォルトではトランザクションの中で複数のエンティティグループにまたがる変更を行うことはできない。
複数のエンティティグループにまたがるトランザクションを実行するには、クロス グループ トランザクションが必要になる。今回はこのクロス グループ トランザクションを試してみる。
複数のエンティティグループにまたがるトランザクションを実行するには、クロス グループ トランザクションが必要になる。今回はこのクロス グループ トランザクションを試してみる。
2012年9月3日月曜日
[AppEngine] JDO のトランザクション
JDOでのトランザクションの基本。
PersistenceManager pm = PMF.get().getPersistenceManager(); Transaction tx = null; try { tx = pm.currentTransaction(); tx.begin(); MyData data = new MyData(); data.setName("one"); pm.makePersistent(data); tx.commit(); } finally { if ( tx != null && tx.isActive() ) { tx.rollback(); } if ( pm !=null && ! pm.isClosed()) { pm.close(); }; }
2012年9月2日日曜日
2012年9月1日土曜日
[AppEngine] Eventual ということ。
前回の記事で、データの追加、削除、更新、取得をやってみた。
一応動くのだが、たまに表示される結果にデータの変更内容が反映されていないことがある。
Google App Engine のデータストアの形式には以前は、「Master/Slave」形式と「High Replication」形式があったのだが、「Master/Slave」形式は廃止されて、現在はアプリケーションを作成する際には「High Replication」しか選択できないようになっている。
「High Replication」ではデータの取得が eventual である、すなわり取得したデータが最新ではない可能性があるとのこと。どうやらそのせいのようだ。
一応動くのだが、たまに表示される結果にデータの変更内容が反映されていないことがある。
Google App Engine のデータストアの形式には以前は、「Master/Slave」形式と「High Replication」形式があったのだが、「Master/Slave」形式は廃止されて、現在はアプリケーションを作成する際には「High Replication」しか選択できないようになっている。
「High Replication」ではデータの取得が eventual である、すなわり取得したデータが最新ではない可能性があるとのこと。どうやらそのせいのようだ。