2016年8月、トレタの増井雄一郎さん(「IT芸人」「フログラマー」で検索!)はPHPからScalaへの移行を表明していたChatWork CTOの山本正喜さんに「本当にScala化できるんですか?」と直球で聞きました(「PHPからScalaに乗り換えたチャットワークさん、その後どうですか?(前編)」)。そして2017年2月。「移行できたら、ぜひもう一回来てください」との誘いを受けて、再び増井さんがチャットワークにやってきました! 増井 Scala化、おめでとうございます! 山本 ありがとうございます。 増井 前回も聞きましたが、読んでない方もいるでしょうから、もう一度聞かせてください。Scalaを入れようと思った時期はいつなんでしょうか。 山本 そのあたりはBlog(「チャットワークがScalaを採用する理由、これからのチャレンジ。」)に書いたんですが、2年半前──合宿をしてScala化
日記Scala にてディレクトリ階層を操作するメソッドを書こうとしてるんだけど、テストを書くのにファイルやディレクトリを作成していくのが非常に面倒なので、Groovy のビルダーみたいな感じでディレクトリ構造を書いて作成できないかなぁ~と思案(Groovy 自体にもビルダーでディレクトリ構造を作成するクラスとかなかったと思うけど)。 Groovy のクロージャの delegate みたいなのがないので Scala じゃ無理?とか思ってたけど、よく考えたら、ScalaTest のいくつかのテスティングスタイルではテストケースをネスト構造でカテゴリ分けできるんで Scala でもできんじゃね?と思って書いてみたら、案外簡単にできた。 以下のような DirectoryBuilder クラスを定義して import java.nio.file.{Files, Path} import scala.
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
このところ、SparkをStandalone ModeやYARNで動かしていましたが、もうちょっと機能的な感覚をつかみたいと思いまして。 で、毎度Spark Submitしてもいいのですが、テストコードで動かせないかなぁ、と…。 調べた感じ、やれないこともなさそうな雰囲気…。 Testing Spark Streaming Applications http://eng.tapjoy.com/blog-list/testing-spark-streaming-applications https://spark-summit.org/2014/wp-content/uploads/2014/06/Testing-Spark-Best-Practices-Anupama-Shetty-Neil-Marshall.pdf ちょっと、やってみましょう! 追記) ドキュメントをよーく見ると、ここに
なんか久しぶりに、技術ネタっぽい何かです。 Scalaの標準ライブラリは結構偏りがあって、scala.ioとかのIO周りは壊滅的だったりする(ので早くScala-IO入って欲しい)のですが、コレクションライブラリは結構充実してて、色々便利メソッドがあったりします。コレクション絡みで何か非常に短めのメソッド再発名発明したくなったら、APIリファレンスを読んでみると良いかもしれません。 例1: Option#toRight Optionは、Scalaでは非常に色々なところで使われており、それゆえにScalaでnullが明示的に使われる場面はあまりありません。しかし、Optionは、Some(x)かNoneの2種類しかなく、Noneの場合にどのようなエラーが発生したかという情報を持ち運ぶことができません。そのような場合、Eitherを使うことができますが、OptionからEitherに変換したい
Scalaをどうやって学ぶのがいいのか?ということはScalaを使い始めた数年前からずっと考えています。よく「Scalaは難しい」と言われますが、 どこが難しいのか? なぜ難しいのか? ということを、これまで書籍や雑誌記事、ハンズオンなど入門用のコンテンツを作ってきた経験を踏まえて整理してみました。 まず、Scalaが難しいといわれる理由のひとつに学ばなくてはならないものが多すぎるという点があげられます。Scalaはオブジェクト指向言語ですが、関数型言語の特徴的な機能を取り入れているため、きちんと理解するには両方の言語のイディオムを学ぶ必要があるためです。 ただ、Scala自体は必ずしも関数型言語の知識がなくても使えるように設計されています。最初はBetter Javaとして一般的な手続き型オブジェクト指向言語の延長として使い始めることができ、Scalaの特徴的な機能に触れていくことで少し
数字を並べるとInt型。 表現できる範囲(Math.MIN_INT~MAX_INT、32bit整数)を超えるとエラー。
I'd like to add a three-integer tuple to a ListBuffer. intuitively, my first try is the code snippet 1, which has a syntax error,according to the compiler. Then, I've tried the snippet 2 and 3, both will work. So could someone explain to me why the code in snippet 1 syntactically wrong. snippet 1 import scala.collection.mutable.ListBuffer val b : ListBuffer[(Int, Int,Int)] = ListBuffer() b += (1,1
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
お久しぶりです。かとじゅん(@j5ik2o)です。さて、僕は、ChatWorkに入社しても、相変わらず Scala や DDD を実践しているわけですが、今回は少し毛色が違う話をしたいと思います。先日、ChatWork Advent Calendar 2014 15日目の記事で、安達くんが、ID生成器の話を書いてくれたので、せっかくなので、ChatWork Advent Calendar 2014 23日目の記事として、Scala版も説明してみようかと思います。 PHPでID生成器を実装してみました | チャットワーククリエーターズブログ DBのシーケンスによるID生成ウェブサービスでは、時系列データを扱うことはよくありますが、タイムスタンプベースでユニークなIDを利用したいことがあります。方法論はいくつかありますが、お手軽なID生成といえば、DBのシーケンスを使ったものです。しかしながら
複数の値をまとめて代入(多重代入) 2014/06/11 代入文の左辺と右辺に複数の変数や式を書くことで、1つの代入文でまとめて複数の代入を実行できるものを言語によっては多重代入という。名称は言語によって違うかもしれないが、似たような仕組みがいくつかの言語にある。 Scala 2014/08/11 左辺に複数の変数名を書いて、右辺の値を1つ書くと、すべての変数に同じ値を束縛する。 val a, b, c = 10; // a => 10 // b => 10 // c => 10 val a, b, c = (10, 20, 30); // a => (10, 20, 30) // b => (10, 20, 30) // c => (10, 20, 30) 左辺の複数の変数名を () で囲めば、右辺はタプルを置く必要があり、タプルの要素ごとに変数に束縛できる。 val (a, b, c)
throw 例外(Throwable(Exception・Error))を発生させる(投げる・スローする・throw)。 throw 例外 throw new Exception("メッセージ") try~catch~finally 発生した例外をキャッチする(捕捉する・catch)。 try { 式 … } catch { case 変数:例外クラス => 式1 … } finally { 式 } try節の中で例外が発生したら(例外が投げられたら(throwされたら))、catch節でその例外を捕捉(キャッチ)する。 例外が発生してもしなくても、finally節は実行される。 catch節の形状はmatch式と似ている。 ただし、match式が“どのcaseにもマッチしなかった”場合はMatchErrorを発生させるのに対し、 catch節でどの例外にもマッチしなかった場合はtryの外
※ピリオド「.」やカンマ「,」といった文字(文法上使用されているので、通常は識別子として使用しない文字だと思われる)は、Unicodeの文字コード「$u002E」や「$002C」になるようだ。[2015-09-22] これらの変換を行うのに、NameTransformerオブジェクトが使える。 scala> import scala.reflect.NameTransformer import scala.reflect.NameTransformer scala> NameTransformer.encode("name_=") res1: String = name_$eq scala> NameTransformer.decode("name_$eq") res2: String = name_= 参考: kmizuさんのscala_tips コンパニオンオブジェクトの取得 ケースク
case classとコレクションを相互変換したいことがたまにあるので方法をまとめておきます。 もちろんやり方は一つではないので一例です。 準備 scala 2.9.2で確認 scala> case class Foo(i: Int, s: String) defined class Foo 変換方法 List Listにするのは簡単ですが、case classに戻すのはリフレクションが必須でasInstanceOfが頻発して嫌な感じですね。 productIteratorの段階で型情報が失われてしまうのが原因ではないかと思います。 ref: scala - Instantiating a case class from a list of parameters - Stack Overflow case class -> List scala> val l = f.productIter
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く