サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
衆院選
xerial.org
長い文字列を作成する。 方法 短い文字列の場合。 val s = "Hello" + " World!!" 文字列をたくさん連結していく場合は、StringBuilderを使用する。 Good val b = new StringBuilder for(i <- 0 until 10) { if(i > 0) b.append(", ") b.append(i) } val s = b.result // s = "0, 1, 2, 3, 4, 5, 6, 7, 8, 9" Bad var s = "" for(i <- 0 until 10) { if(i > 0) s += ", " // 文字列のコピーを作成 s += i // 文字列のコピーを作成 } // s = "0, 1, 2, 3, 4, 5, 6, 7, 8, 9" +=でStringに対して文字列を連結していくと、文字
I have recently joined Treasure Data, and found many java projects that are built with Maven. Maven is the de facto standard for building Java projects. I agree Maven is useful for managing library dependencies, but as the project is becoming more and more complex, managing pom.xml turns to a headache for many developers; For example, one of the projects uses a script-generated pom.xml in order to
Scala2.10より、String Interpolationの機能が追加され、文字列中に式を埋め込むのが容易になりました。 使い方 s String double quotationの前にsを付けると、文字列中にある$(変数名)が置き換わる。 val w = "World" val message = s"Hello $w!" println(message) // Hello World! と表示される {}で囲むと、任意の式を含めることもできる。 println(s"2 * 3 = ${2 * 3}") // 2 * 3 = 6 と表示される f String 文字列にfをつけるとprintfの構文が使えるようになる。$(変数名)%(フォーマット指定)を文字列に埋め込むと変数の内容を表示するときのフォーマットが指定できる。 val dollarToYenRate = 80.0 va
プログラミングでは、「リソースを取得したら解放する」パターンが頻出します。例えば、 ファイルを開いたら閉じる dbへのコネクションを開いたら閉じる ロックを取得したら、リリースする などがあります。コード中でこの「借りたら返す」を確実に行うのがLoan Patternです。 例外安全でない例 def query(sql:String) = { val connection = db.getConnection val result = connection.query(sql) // もしクエリの実行中に例外が発生したら? connection.close // このコードが確実に呼ばれる保障がない result } 例外安全だがコードの再利用がしにくい書き方 try ... finallyで囲むと例外(exception)に強いコードが書ける。 def query(sql:String)
エラー処理によるコードの分岐を減らしたい場合、Eitherを使うとよい。 Eitherの使い方 Either[A, B] は、AまたはBを返す型である。 Eitherは通常Either[(エラー情報), (結果)]の形で使われる。例えばデータ処理が成功した場合はその結果を用いて引き続きの処理を行いたいが、エラーの場合は何もせず次のコードにエラーだけを伝えたい場合がある。 Eitherから値を取り出すには、left, rightの値に対してmap, flatMapなどを用いる。例えば、Either.right map { ... }とすると、値の内容がRight型の場合はmap内の関数を適用し、Leftの型の場合はmapの処理を無視してLeftの内容(この場合はエラー情報を)をそのまま返す。 具体例 # 文字列がIntに変換できるならIntを、失敗した場合はExceptionを返す関数 sc
Type Class(型クラス) とは型の性質を表現するためのクラスで、Haskellなどの関数型言語では古くから使われています。型クラスは、アルゴリズムとアルゴリズム中で使うデータ型の結合を緩やかにする、あるいは、アルゴリズム中で使うデータと実際のデータ型の型合わせをするために使われます。 例題 例えば、区間データ(start, end)を保持するためのIntervalHolderを考えてみます。区間を保持するという意味では汎用的に書けそうなので、区間をAとしてGenericなクラスとして表現します。 class IntervalHolder[A] { private var holder = Map[Int, A]() def +=(e:A) { holder += e.start -> e // コンパイルエラー。Aはstartを持つ型ではない } } Aにはstartというパラメー
ScalaではReflectionを使うとより詳細な型情報を取得することができます。 クラス情報を取得 (Scala2.10以前) Scala2.10以前では、以下のように型情報を取得できます。 case class Person(id:Int, name:String, age:Option[Int]) val c = classOf[Person] // Class[Person]を取得 c.getSimpleName // Person c.getName // Personクラスのパッケージ名を含むfull path しかし、Personクラスにどのような型の変数が定義されているを知りたい場合、 javaのReflection機能を使う。Class.getDeclaredFields/Methodsなど javapやASMなどでコンパイル後のバイトコードを直接参照 ScalaSig
これはScalaを使った開発の雰囲気を感じてもらうための文章です。 ここでできるようになること Scalaプロジェクトの作成 簡単なScalaコードの作成 テストコードの実行 ログの表示 コードの実行時間の計測 システムにインストールできる形のパッケージを作成 準備 UNIX環境(Linux、 Mac OS X、あるいは Cygwin をWindowsでセットアップする) javaコマンドが使えること (環境変数PATHの設定など) その他、curl, GNU makeなどのコマンド インターネット接続 (ここから15分です) Scalaプロジェクトの作成 Scalaプロジェクトの必要最低限のひな形をGitHub上にscala-minとして作成してあります。以下のようにダウンロードしながら展開します。 $ mkdir myproject $ cd myproject $ curl -L h
コードの取得 $ git clone git://github.com/xerial/scala-cookbook.git $ cd scala-cookbook $ git fetch $ git checkout lesson1 IntelliJプロジェクトの更新 # bin/sbt gen-ideaを実行 $ make idea テストコードの実行 # bin/sbt -Dloglevel=debug "~test-only *Lesson1Test" のコマンドを実行 $ make debug test="Lesson1Test" Windows (DOS) プロンプトで実行する場合 scala-cookbook>bin\sbt -Dloglevel=debug "~test-only *Lesson1Test" 上記のコマンドで、ソースコードに変更を加えるたびに、コンパイル、テス
Scalaの良いところ 現代的なプログラミングについて学べる 実用的なアプリケーションが作成できる 関数型言語、オブジェクト指向言語(C++, Java)などの良いところを吸収している 関数定義のための簡潔な構文 オブジェクトを使ってデータ構造、コンテキストを定義 Syntaxが簡潔(コードを短く書けるのは武器) そのため、言語の不備と戦うための技術から解放される テンプレートによるHack (Modern C++ Design) 言語の不備を乗り越えるためのデザインパターン JavaでのVisitorパターンなどはScalaでは不要。パターンマッチを使えば良い ただし、Scala特有のデザインパターンはある (Loan, concept, cake pattern, monadなどなど) Rubyもprimitive型を捨て、オブジェクト指向に徹することで良いデザインの言語になっている
Scalaのコンパイル、テストの実行にはsbt (Simple Build Tool) (全然simpleではないが!) を使うのが2012年現在でのbest practice. IDEではあまりコンパイルしない。 SBT Getting Started Guilde sbtでできること Scalaのコンパイル ライブラリの自動ダウンロード コードライブラリの作成 Scala, Javaで動くものはすべて使える 作成したライブラリを公開サーバーにアップロードする テストの実行 sbtを使ったおすすめの最小構成 GitHub https://github.com/xerial/scala-cookbook/tree/min-project にすぐScalaの開発を始めるためのコードサンプルが置いてあります。 # min-projectブランチをmyprojectフォルダ内に取得 $ git
Option を使いこなすと、関数型言語やScalaらしいプログラミングができるようになります。 どんなときに使うのか? nullの代わりに使う 関数の結果が得られない場合など (例:Map[K,V]#get(key)の返り値は Option[V]) モナド(monad)として使い、コードの流れを妨げないようにする for-comprehensionと共に使う モナドと聞いて怖じ気付く必要はありません。これらの使い方についてこれから詳しく説明していきます。 パターンマッチでOptionの値を取得 Option[A]は値が存在するか、しないかを表すクラスで、Some(a)とNoneの二種類の値があります。パターンマッチでこの二種類の値を処理するのが基本です。 val m = Map("A" -> "Apple", "B" -> "Banana") def lookup(symbol:Stri
Scala Quick Start IntelliJのセットアップとコードの実行 setup Published 27 June 2012 サンプルコードの取得 Gitの設定 $ git config --global core.eol lf # Windowsで改行文字がCRLFに変換されるのを防ぐ $ git config --global core.autocrlf false サンプルコードの取得 $ git clone git://github.com/xerial/scala-cookbook.git $ cd scala-cookbook # lesson0 branchのコードを取り出す $ git checkout lesson0 # scalaコードの実行に必要なライブラリをダウンロードし、 # target/distにプログラム全体を作成後、$HOME/local以
xsbt-gpg-pluginを使うと、sbtで生成されたプロジェクトのjarファイルにGnuPG(gpg)による署名をつけることができる。Sonatypeのリポジトリにプロジェクトをdeployする際にgpgによる署名が必須。作成したプログラムをSonatypeのリポジトリに登録して、Maven Central Repositoryに同期してもらうと、自分で作ったプログラムを世界中の人に手軽にダウンロードできる状態(つまりsbtのlibraryDependenciesの設定に追加するだけで使える状態)で公開できる。 Deplying to Sonatype Scala+SBTでpgpによる署名を施してSonatypeのリポジトリにプロジェクトをアップロードする方法 必要なツール gpg, gpg-agent, keychain 設定 project/plugin.sbtに以下の設定を追
WIGファイルを構文解析する parser combinatorの使い方。 Eitherによるエラー処理 bioinformatics Published 18 July 2012 解説 WIGフォーマットは、ゲノム座標上に数値データを載せるときに使われる。このデータは一次元の大きな配列を表現しているのだが、その他のアノテーション(データを説明するメタデータ、グラフデータの幅、ステップの量など)も適切に処理する必要がある。 WIGフォーマットのサンプル http://genome.ucsc.edu/goldenPath/help/wiggle.htmlより。 browser position chr19:49304200-49310700 browser hide all # 150 base wide bar graph at arbitrarily spaced positions,
文字列中から正規表現にマッチした箇所を取り出したい。 解法 Regexを使う。 val s = "GGACGATATAATTTATAATACCGT" val r = "TATAA".r // Stringは.rで正規表現に変換できる for(m <- r.findAllIn(s).matchData) println("Found a match in [%s, %s)".format(m.start, m.end)) 実行結果 Found a match in [6, 11) Found a match in [13, 18) findAllInではマッチした文字列を切り出すMatchIterator(Iterator[String]を継承)が返るが、matchDataを呼び出すことで、Iterator[Match]に変換でき、こちらでは、マッチの位置(start, end)や、マッチし
Scala Cheet Sheets (Licensed by Brendan O'Connor under a CC-BY-SA 3.0 license)の和訳。
Mapは key -> valueの索引のためのデータ構造。keyの値には重複を許さない。 Mapの作成 scala> val m = Map(1 -> "Apple", 2 -> "Banana", 3 -> "Chocolate") m: scala.collection.immutable.Map[Int,java.lang.String] = Map(1 -> Apple, 2 -> Banana, 3 -> Chocolate) 1 -> "Apple"の部分では、(1, "Apple")のTupleが生成され、最終的にMap.apply(elems:(A, B)*)が呼ばれている。 Builderを使ってMapを作成 val m = { val b = Map.newBuilder[Int, String] b += 1 -> "Apple" b += 2 -> "Banana
ScalaのEnumerationは使うな Scalaで列挙型を定義するには AntiPattern Published 29 June 2012 ScalaのEnumerationは使いにくい Scalaには列挙型としてEnumerationが用意されているが、以下の理由で使いにくい。 値にメソッドを定義できない DNAというEnumerationを定義しても、個々の値は、DNA.Value型として扱わなければならないため、コードが不自然になる。 Enumerationを使ったコード例 object DNA extends Enumeration { val A, C, G, T, N = Value } val base : DNA.Value = DNA.A また、DNA.Value型を拡張することが許されていないので、ラベルとしての機能しか持たせることができない。 解決策 Sca
コーディングのスタイル コードを逐次実行しながら副作用(変数の内容の書き換え)を起こす命令型 (imperative programming)のコードをなるべく排除する 副作用を避けるために immutable(変更不可能)なデータを中心に使う 値の変化は、関数に「immutableなデータを入力 -> 新しいデータを出力」という形で行う 関数そのものも、関数の引数として渡す 関数がfirst-class citizenという言い方をよくする C++、Javaでも関数に関数へのポインタ(リファレンス)などを渡せるが、関数が定義されたコンテキストの情報(変数の値など)までも含めて他の関数に渡すのは大変。 Q. 副作用を避けるのは何故か? A. プログラミングを簡単にするため。 例えば、文字列型 String のデータが変更可能だったとする。 val key1 = "Apple" val ke
Scalaの利点 関数型言語として。オブジェクト指向言語として introduction Published 02 July 2012 バイオインフォマティクスの分野では、現場で動くコードを書けるプログラミング言語でないと使えません。 Scalaが本当に現場で使えるかどうかわかるまで、実際にコードを書いてみたり、開発環境、ライブラリを調べるなど調査に費やした時間も膨大でした。 そのときの自分に教えてあげるつもりでScalaの利点をここにまとめていきます。 関数型言語であるが、関数型言語でない Scalaでは関数型言語のスタイルに固執する必要がない。命令型、副作用のあるコードも書けるので、慣れるに従い関数型のスタイルに近づければ良い。 C++, Java、Perlなど命令型のコードが多い言語に慣れていると、最初のうちは関数型のコードをどう書けば良いかわからないことが多いと思うが、 Scal
プログラミング 文法、コンパイル方法などに不自由なく使える言語を最低一つ身につける C++, Java(今ならScalaでも良い)など、コードの動作が速い、静的型付け言語から最低1つ Perl, Ruby, Python, シェルスクリプトの書き方も知っていて損はない 開発環境 C++ : Visual Studio (Windows), X Code (Mac)など Java/Scala: Eclipse, IntelliJ (Win/Mac/Linux) 使い方に慣れるまで時間がかかるので、普段から使えるようにしておく テストコードの作成 テスト作成ー動作の確認−コーディング、というスタイルで開発サイクルの短縮 Unit testing, TDD, BDD, extreme programmingなど タイプ速度 (上げておく方が何かと良い) コードライブラリの作成、リンク gccの-
Scala Cookbook http://xerial.org/scala-cookbook では、Scalaでのプログラミングについて紹介していきます。 Scalaをこれから使い始める方にはこちらがおすすめ。15分で始めるScala Scala勉強会の予定 - 日程、今後紹介する内容など Scala Cookbookに寄稿、改善に協力する レシピの追加、修正等を歓迎します。 今後追加したい・すべき内容 New Recipes
Silk: A Framework for Building Data Processing Workflows Silk is an open-source workflow description and execution framework, written in Scala. With Silk you can create a workflow consisting of SQL, Unix commands, Scala programs. Example def appleStock = nasdaq.filter(_.symbol is "APPL") .select(_.time, _.close) .orderBy(_.time) // show the latest 10 stock price information appleStock.limit(10).pr
http://www.xerial.org/ It’s a kind of tragedy… 2 I DECIDED TO START A NEW XML PROJECT MASTERING XML IS CRUCIAL TO OUR COMPANY BECAUSE IT IS COMPLETELY A NEW DATA MODEL. EVERYBODY MUST START LEARNING SAX, DOM, XPATH, XQUERY, DTD, XML SCHEMA, RELAX NG… Benefits of using XML: › XML is a portable text-data format › Tree-structured XML can reduce redundancy of relational data. Company Employee Offi
このページを最初にブックマークしてみませんか?
『Top Page | xerial.org』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く