サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
今年の「#文学」
modegramming.blogspot.com
Scalaプログラミングのはまりポイントとして頻出頻度が高く影響も甚大なのは、==メソッドとcontainsメソッドの型チェックだと思います。 この2つのメソッドは(多分Javaとの互換性の問題で)、引数に定義されている型がAnyであるため事実上型チェックが効かない仕様になっています。 具体的には以下のような処理がコンパイルエラーにならず通ってしまうという問題です。 scala> "1" == 1 "1" == 1 res112: Boolean = false scala> List(1, 2, 3).contains("1") List(1, 2, 3).contains("1") res113: Boolean = falseいずれの場合も、常に判定結果はfalseになり、意図した処理でないことは明らかですがScalaコンパイラはエラーとして弾いてくれません。 Scalaは型チェック
『圏論の歩き方』を読んで少し理解が進んだので、関数型プログラミング技術マップを更新しました。「関数型プログラミング技術マップ2014」の2015年版です。 以下の点を改良しています。 Curry-Howard対応をCurry-Howard-Lambek対応に拡張直観主義述語論理を追加して直観主義命題論理を包含カルテジア閉圏とトポス(圏)を追加直観主義命題論理⇔カルテジアン閉圏、単純型付ラムダ計算⇔カルテジアン閉圏間の関係を追加この図は関数型プログラミング(FP: Functional Programming)を取り巻く理論を整理することを目的としています。 誤解があるといけないので補足しておきますがFPを行うために必須の理論という意図ではありません。 業務アプリケーションをFPで開発するという目的には、圏論も論理学も抽象代数も必須知識ではなく、MonoidやMonadのプログラム上での使い
先日の「Reactive System Meetup in 西新宿」で「Scalaz-StreamによるFunctional Reactive Programming」のスライドを作るにあたってscalazのTaskについて調べなおしてみたのですが、Taskの実用性について再確認することができました。 色々と切り口がありますが、その中で並列性能が今回のテーマです。 準備準備として以下のものを用意します。 implicit val scheduler = new java.util.concurrent.ForkJoinPool(1000) def go[T](msg: String)(body: => T): Unit = { System.gc val ts = System.currentTimeMillis val r = body println(s"$msg(${System.c
8月7日に「匠の夏まつり ~モデリングの彼方に未来を見た~」のイベントが行われましたが、この中でパネルディスカッションに参加させていただきました。パネルディスカッションでご一緒させていただいた萩本さん、平鍋さん、高崎さん、会場の皆さん、どうもありがとうございました。 パネルディスカッションがよいきっかけとなって、クラウドアプリケーション開発におけるモデリングについての方向性について腰を落として考えることができました。このところFunctional Reactive Programmingを追いかけていましたが、ちょうどモデリングとの接続を考えられる材料が揃ってきているタイミングでした。 パネルディスカッションの前後に考えたことをこれまでの活動の振り返りも含めてまとめてみました。 基本アプローチ2008年頃からクラウドアプリケーション開発の手法について以下の3点を軸に検討を進めています。 ク
懸案だったMonadic Programming、Functional Reactive Programmingもある程度目処がついてきたこともあり、要件定義で作成されたモデルを実装に落とし込むという流れの中での総合的なScalaプログラミングの方法論をScala Design Noteという切り口で考察していこうと思います。 大昔にJava World誌で「Java Design Note」という連載を書いていましたが、そのScala版をイメージしています。 Scalaを実務に使う場合に注意が必要なのがListの性能問題です。 Scalaでは関数型言語の伝統を踏襲してLispのList由来のListを基本データ構造としています。システムの各種デフォルトもListを使う方向になっていますし、文法を説明する場合にもListを使用するケースが多いと思います。 Listは関数型プログラミングとの
例題勉強会で出たプログラム例をまとめて例題を作りました。 テキストファイル内の欧文単語を単語の長さで以下の三種類に分類してオブジェクトに設定する短 : 3文字以下中 : 7文字以下長 : 8文字以上以下ではこの例題にそって説明していきます。 準備分類した単語を設定するオブジェクトとしてcase classのWordsを中心としたクラスとコンパニオンオブジェクトを用意しました。 例題はテキストファイルを解析して、case class Wordsに解析結果を設定する処理になります。 package sample case class Words( smalls: Vector[String], middles: Vector[String], larges: Vector[String] ) { def +(word: String): Words = { if (word.length <=
関数型プログラミングとは何か? この問は深遠すぎてとてもボクの手には負えませんが、実務的なプラクティスとしてはパイプライン・プログラミングとして考えると分かりやすいのではないかと思います。 そこでScalaでのパイプライン・プログラミングの選択肢を整理してみました。 関数呼び出し関数型プログラミングにおける普通の関数呼び出しもパイプラインと考えることができます。 純粋関数型では副作用は発生しないので、表に見えている関数の引数と復帰値のみで関数の挙動のすべてが表現されているためです。 たとえば以下のプログラムは: h(g(f(1)))以下のようなパイプラインと考えることができます。 Functor文脈を持ったパイプラインはFunctorを使って構成できます。関数呼び出しとの違いは「文脈」を持った計算になるという点です。 ここでいう「文脈」とはパイプラインの裏側で暗黙的に共有、引継ぎされる状態
製品の評価や、開発時のテストなどDBをカジュアルに作成して消したいシチュエーションは多々あります。 開発マシンにDBを入れてデータ投入する運用だと、開発マシン環境が汚れてきたり、復数の設定が共存して収集がつかなくなったり、DBやライブラリのバージョンに依存する場合の切り替えに困ったりということになりがちです。 そこで以前だとVMを使ったり、AWSのようなクラウド上にDBを立てたりしていたわけですが、設定はそのものが難しくはないものの、毎回環境を構築する作業が必要になったりと、まだまだ手間のかかる作業でした。 言うまでもなく、このような問題がDockerで一気に解決したのは大変画期的なことです。 今回はDockerを使ってDBをカジュアルに構築する方法について考えてみます。 SoS JobScheduler今回はジョブ管理製品のSoS JobSchedulerを使ってみました。 http:/
Spark SQL 1.3の登場を機にバッチ処理基盤の刷新を考えています。この流れの中でJobSchedulerやSpark SQLをDockerで動かす試み(Docker ComposeでMySQLを使う,DockerでSpark SQL)などを行ってきました。 バッチをSpark SQLで記述し、データや計算量の規模に応じてDocker Cluster(e.g. ECS)またはSpark Cluster(e.g. EMR)を選択してバッチ処理を実行するという枠組みが見えてきました。 次に考えておきたいのはバッチ処理で使用する要素技術の選択です。今回はJSONライブラリについて性能の観点から味見してみました。 なお、あくまでも味見レベルの測定なので、条件を変えると違った結果になる可能性も高いです。また、ありがちですが性能測定プログラムにバグがあって結果が逆にでるようなことがあるかもしれま
build.sbtbuild.sbtは特に難しい所はありません。必要なライブラリを登録しているだけです。 scalaVersion := "2.11.6" val scalazVersion = "7.1.0" libraryDependencies ++= Seq( "org.scalaz" %% "scalaz-core" % scalazVersion, "io.argonaut" %% "argonaut" % "6.1-M4", "org.scalatest" %% "scalatest" % "2.2.4" % "test", "org.scalacheck" %% "scalacheck" % "1.12.2" % "test", "junit" % "junit" % "4.12" % "test" ) Average.scalaMonoid化とArgonaut化したcas
Scalaにおける状態機械の実装戦略について検討しています。 「Scala的状態機械/OOP編」で状態+状態遷移を表現するトレイトであるParseStateを作成しました。ParseStateの具象クラスはcase classまたはcase objectとして実現しています。これらのトレイト、case class、case objectがワンセットでFPで使用できる代数的データ構造となっています。 「OOP編」ではこのParseStateを使用して、オブジェクト版の状態機械とアクター版の状態機械を作成しました。代数的データ構造でもあるParseStateがOOP的に問題なく使用できることが確認できました。 「FP編」では、ParseStateの代数的データ構造の性質を活かしてMonadic Programming(以下MP)版の状態機械を考えてみます。 Stateモナド版状態機械MPで状態
オブジェクト・モデリングにおける動的モデルは状態機械で記述するのが基本です。つまり状態機械はオブジェクト・モデリングの重要な構成要素の一つということです。 ScalaでObject-Functional Programming(OFP)を行う場合でも、要求・分析・設計の各アクティビティを経て作成されたオブジェクト・モデル内の状態機械をどのように実装していくのかという実装方式が論点になります。 普通のOOP流の実装はすでに議論しつくされていると思いますが、OFPにおけるFPでの実装方式については、これから整備されていくことになると思います。 注意が必要なのはクラウド・アプリケーション開発をターゲットにする場合、伝統的なFPというよりMonadic Programming(以下MP)を経てFunctional Reactive Programming(以下FRP)がゴールになるということです。
Scalazでmonadic programmingする上で困っているのがTryモナドの問題です。 scala.util.TryはScalaで例外処理をmonadicに処理するためにScala 2.10で導入されたScalaの基本機能です。Scalaのモナドとしての要件(flatMapメソッドが定義されている等)は満たしているのでfor式で使用することができます。 しかし、ScalazのMonadではないのでScalazの提供する各種機能の恩恵を得ることができません。このことがScalazを軸としたmonadic programmingの阻害要因になっています。 例外をハンドリングするためにはTryを使うのが自然ですが、Tryを使うとScalazのmonadic programmingがやりづらくなる、という構図です。 TryがScalaz Monadとなっていない理由は、Tryがモナド則
プロダクトの開発中にわりと難しい処理がscalaz-streamでうまくさばけたのでメモ。 近い将来Buzzwordになってきそうな「Functional Reactive Programming」ですが、monadicなstreaming系のアプローチが筋がよさそうということで、scalaz-streamを実プロダクト開発に導入して試行錯誤しているところです。大規模データ系のいろいろな処理に適用していますが、かなりいい感触を得ています。 そのような応用の一つである大規模メール配信処理で出てきた要件が以下のものです。 大規模なデータ列を一つの固まりとしてストリーム上に流したい 事前にデータ列の総量は分からない データ規模が大きいので復数パケットに分割する必要がある 性能向上のため、可能な範囲で1パケットに復数データ列を格納したい ネットワーク系のプログラムではわりとよく出てくる処理だと思い
APPAREL CLOUDはアパレルウェブが提供しているアパレル向けのクラウドサービスです。ボクが所属するEverforthの提供するEverforthプラットフォーム上に構築されています。 Everforthプラットフォームは、O2Oやオムニチャネル向けのクラウド・プラットフォームです。Everforthプラットフォームでは、サービスを実行するクラウド実行基盤と同時にO2Oやオムニチャネル・ビジネスをサービスに結び付けるための業務分析、システム分析を包含したサービス開発体系の提供も予定しています。 「サービス開発体系」は、オブジェクト指向ビジネス・モデリング、オブジェクト指向分析設計の技術をベースに、Everforthプラットフォームをターゲットとしたアプリケーション開発の方法論として整備していく予定です。 一般的なオブジェクト指向分析設計方法論が複雑で分かりづらいものになっているのは、
純粋関数型言語の性質 純粋関数型言語の性質として以下のものを参考に補足しました。 不変 (immutable) 副作用なし (no side effect) 参照透過性 (referential transparency) 置換モデル (substitution model) モナドと圏論の位置付け 圏論の入門書を幾つかチェックしましたが、モナドについてはほとんど記載がなく、モナドは圏論の基本概念ではないらしいということが分かりました。 また、"圏論の中に(基本構成要素として?)モナドがあるのは違和感がある"というコメントもいただき、技術マップの中で圏論やモナドをどのように位置付けるかが懸案事項になっていました。 その後、色々と調べてみて分かったのですが、圏論については、種々存在する数学や情報科学の各分野を統一的に記述するための「普遍言語」と考えるのが適切のようです。 代数的構造だけでなく
一昨年からEverforthに参画してScalaを使ってとあるシステム開発を行いつつ、クラウドアプリケーションの開発技法について整備してきましたが、ある程度方向性が見えてきたので、札幌の開発部隊に情報展開するための勉強会を企画しました。 クラウドアプリケーションの開発は、ちょうど業務アプリケーション開発にオブジェクト指向技術が導入された時と同じようなパラダイムシフトが起きることになると予想されます。 新しいパラダイムには、難解な理論的な支柱が背景に控えているわけですが、難解な理論を正確に理解することが業務アプリケーション開発を行う必要条件というわけではないのは今も昔も同じです。 難しい部分はフレームワークで吸収したり、イディオム(公式)として覚えてしまう、という方法で多くのケースは対応できるでしょう。 実際のビジネスを展開する上では、新しいパラダイムの上で実案件をこなすことができるエンジニ
どのようなプログラミング言語を使っても、本格的な応用では基本ライブラリだけでニーズが満たせるということはなく、用途に応じて外部ライブラリを併用することになります。 Scalaプログラミングをする上で、ボク的に常に使用するライブラリというのがだいたい固まって来たのでまとめてみました。 scalaz以下の理由で手放せないライブラリになっています。 「かんたんScalaz」としてご紹介している各種の便利機能型クラスMonoidの存在純粋関数型データ構造Treeまた使用頻度は落ちますが、以下の機能も魅力的です。 型クラスTraverse/Foldable純粋関数型データ構造EphemeralStreamTask/Future最近scalaz-steramを使っていて、どうもTaskが便利らしい、ということが分かってきました。これから使用頻度が高くなるかもしれません。ScalaのFuture/Pro
Scalaz 7を本格的に使い始めたので、Scalaz 7を包含したコーディング・イディオムの棚卸しをしています。Scala 2.10の基本機能とScalaz 7を併用する前提で、コーディングの局面毎に使用するイディオムを事前に準備しておくわけです。イディオムを事前準備しておくことで、プログラミングの局面局面で即断即決ができるので効率よくプログラミングを進めることができます。またイディオムは利便性や実行速度などの要因を考慮に入れて使い所を絞り込んでおくので、プログラムの品質や性能などの向上も期待できます。 Scalazは、MonadやMonoidといった代数系の概念を軸にした型クラスやや純粋関数型データ構造を提供するライブラリですが、小回りの効いた便利機能も数多く提供しています。これらの便利機能は特にMonadやMonoidといった概念を抜きにして、便利につかえるので「かんたんScalaz
つい先日Scala 2.11がリリースされたばかりですが、タイトルの「Scala 2.10」は間違いではありません。 一昨年の後半からとあるシステム開発に注力していたため時間が取れずブログ更新を中断していましたが、ようやく一段落してきたので、自分向けに技術情報の棚卸しをしていくという意味でもぼちぼち書いていきたいと思います。 最近うれしかったことの一つはようやく製品開発にScala 2.10+Scalaz 7を使えるようになったことです。システムは一度動き始めると、なかなか使用しているコンパイラ、ライブラリ、ミドルウェアのバージョンを上げることはできません。特にバージョン間での互換性が高くないことで有名(?)なScalaの場合はなおさらですが、Akkaを本格的に使おうとするとさすがにそうもいっておられず、大量のコンパイルエラーと警告を克服してやっとScala 2.10+Scalaz 7に上
► 2024 (6) ► 6月 (1) ► 5月 (1) ► 4月 (1) ► 3月 (1) ► 2月 (1) ► 1月 (1) ► 2023 (12) ► 12月 (1) ► 11月 (1) ► 10月 (1) ► 9月 (1) ► 8月 (1) ► 7月 (1) ► 6月 (1) ► 5月 (1) ► 4月 (1) ► 3月 (1) ► 2月 (1) ► 1月 (1) ► 2022 (12) ► 12月 (1) ► 11月 (1) ► 10月 (1) ► 9月 (1) ► 8月 (1) ► 7月 (1) ► 6月 (1) ► 5月 (1) ► 4月 (1) ► 3月 (1) ► 2月 (1) ► 1月 (1) ► 2021 (12) ► 12月 (1) ► 11月 (1) ► 10月 (1) ► 9月 (1) ► 8月 (1) ► 7月 (1) ► 6月 (1) ► 5月 (1) ►
Scala 2.10で導入されたFutureはscala.concurrent.Futureです。 一方Scala 2.9段階ですでに2つのFuture、scala.actors.Futureとscala.paralell.Futureが導入されています。 scala.actors.FutureはActor用のFutureです。Scalaが元々提供していたActorは、Akkaに置き換わっていく予定なのでそれに伴いフェードアウトしていくと予想されます。 Scala 2.10のFutureはAkka(Scala Actorの後継)のFutureを包含した機能を提供し、Akkaと併用することを想定していると考えられます。 scala.paralell.FutureはScala 2.9で導入されたのですが、2.10では早くもdeprecatedになっており、scala.concurrent.Fu
► 2024 (7) ► 7月 (1) ► 6月 (1) ► 5月 (1) ► 4月 (1) ► 3月 (1) ► 2月 (1) ► 1月 (1) ► 2023 (12) ► 12月 (1) ► 11月 (1) ► 10月 (1) ► 9月 (1) ► 8月 (1) ► 7月 (1) ► 6月 (1) ► 5月 (1) ► 4月 (1) ► 3月 (1) ► 2月 (1) ► 1月 (1) ► 2022 (12) ► 12月 (1) ► 11月 (1) ► 10月 (1) ► 9月 (1) ► 8月 (1) ► 7月 (1) ► 6月 (1) ► 5月 (1) ► 4月 (1) ► 3月 (1) ► 2月 (1) ► 1月 (1) ► 2021 (12) ► 12月 (1) ► 11月 (1) ► 10月 (1) ► 9月 (1) ► 8月 (1) ► 7月 (1) ► 6月 (1) ►
ScalaTips / Map, Function1, PartialFunction, Option クライアントから受け取ったリクエストや定義ファイルの情報などをMapに格納して、プログラム内で持ちまわることはよくあります。 このような場合、以下のように関数の引数にMapを渡します。 def f(config: Map[String, String]) { println(config("name")) println(config("url")) } 以下のようなMapがある場合: scala> val map = Map("name" -> "Taro", "url" -> "http://www.example.com") map: scala.collection.immutable.Map[java.lang.String,java.lang.String] = Map(na
関数型プログラミングでは、遅延評価を用いて大量データを処理するのが定番のテクニックになっています。パズルを解く問題のアルゴリズムによく出てきますね。 ただ、業務アプリケーションではパズルを解くようなロジックを書くことは稀なので、こういったテクニックの存在は知っていても、なかなか使う機会はないのではないでしょうか。 とはいえ、この手のテクニックの引き出しはできるだけ多いにこしたことはありませんし、来るべきメニーコア時代の並列プログラミングでは必須のテクニックになりそうな予感もあります。このため、機会があれば使って慣れておくのが得策ですが、これに適した普段使いできるテクニックが欲しいところです。 問題関数fは引数のIntをそのまま返す関数です。実行の確認をするためにprintln関数で、受け取ったIntをコンソールに表示します。 val f = (x: Int) => { println(x)
ScalaのflatMapメソッドは、モナドのbindに対応するメソッドとして認識されています。つまり、基本的にはScalazの>>=メソッドと同じ動作をするわけですが、微妙な機能差があります。 以下はListに対してflatMapメソッドを用いてモナドのbind処理を行ったものです。 scala> List(1, 2, 3).flatMap(x => if (x % 2 == 0) List(x, x) else Nil) res16: List[Int] = List(2, 2)これはScalazの>>=メソッドも全く同じ動作をします。 scala> List(1, 2, 3) >>= (x => if (x % 2 == 0) List(x, x) else Nil) res17: List[Int] = List(2, 2) 次の例さて、今度の例はListのコンテナに対してOpti
先日行われたScala基礎勉強会はどの発表もとても刺激的でしたが、特に僕が触発されたのは: Deprecating the Observer PatternJavaScript as an Embedded DSLの2つです。 どちらも関数型言語のテクニックというより、トレイトの活用テクニックで、つまりオブジェクト指向プログラミングの最新技法ということができるでしょう。論文を見ていただければ分かりますが、その効果は驚異的です。 以前OFP(Object-Functional Programming)の三種の神器としてトレイトを取り上げましたが、恐らくScalaプログラミングという文脈では、その威力はモナドや型クラス以上でしょう。 つまり、Scalaをオブジェクトと関数のハイブリッドとしてのみの認識で見ているとScalaの実力を見誤ってしまいます。(これだけでもすごいのですが) トレイトの導
今月の22日にとある名古屋の学際的な集まりで、マインドマップモデリングやモデル駆動開発についてお話させていただくことになりました。タイトルは「文書をプログラムにする技術」となりました。このセッションのネタ整理を「Object-Functional Analysis and Design: 次世代モデリングパラダイムへの道標」や「クラウド温泉3.0@小樽」といった感じで、ブログの上で行なっていっています。 前回はオブジェクト・モデルにおける関係(relationship)がマインドマップモデリングでどのように扱われているのかについて説明しました。 関係(relationship)の中で汎化(generalization)と集約(aggregation)を特別扱いするのがオブジェクト指向の基本的な考え方です。 関係(relationship)の一種に関連(association)があり、関連(
► 2024 (11) ► 11月 (1) ► 10月 (1) ► 9月 (1) ► 8月 (1) ► 7月 (1) ► 6月 (1) ► 5月 (1) ► 4月 (1) ► 3月 (1) ► 2月 (1) ► 1月 (1) ► 2023 (12) ► 12月 (1) ► 11月 (1) ► 10月 (1) ► 9月 (1) ► 8月 (1) ► 7月 (1) ► 6月 (1) ► 5月 (1) ► 4月 (1) ► 3月 (1) ► 2月 (1) ► 1月 (1) ► 2022 (12) ► 12月 (1) ► 11月 (1) ► 10月 (1) ► 9月 (1) ► 8月 (1) ► 7月 (1) ► 6月 (1) ► 5月 (1) ► 4月 (1) ► 3月 (1) ► 2月 (1) ► 1月 (1) ► 2021 (12) ► 12月 (1) ► 11月 (1) ► 10月 (1)
次のページ
このページを最初にブックマークしてみませんか?
『Modegramming Style』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く