2014年12月24日水曜日

Patterns on Scala

Patterns on Scala
パターンズ・オン・スカーラ

Scala Advent Calendar 2014 の最終日の記事です。

さて theme を Scala の patterns としてみたのですが、十分な時間が確保できていないので、取り敢えず Scala に関する patterns を今集められるだけ以下に集めてみました。
重複していてもそのまま list してます。ただし GoF patterns をそのまま書いてあるものは外しておきました。

scala-lang.org 公式 Wiki

Scala Design Patterns

あんまり説明はないですね。

Structural patterns
  • Cake - Build components which are abstracted over their dependencies.
  • Dynamic scope - Make certain information available in a given context without explicitly passing it about.
  • Utility belt - Lightweight crosscutting resource sharing.
  • Reactive abstractions - Discussion of the relationship among Actors, Arrows, FRP, Pub-Sub, ....
  • Pimp my library - Extend existing classes with new methods
  • Duck typing done right - Utilise "duck typing" (structural typing) like a pro
  • Memoization - Memoize the result of a function
Behavioural patterns
  • Loan - Used primarily for resource disposal; equivalent to C++ RAII or C# 'using'.

論文
Type classes as objects and implicitsby Bruno C.d.S. Oliveira, Adriaan Moors, Martin Odersky
(2010)

http://ropas.snu.ac.kr/~bruno/papers/TypeClasses.pdf

Concept Pattern についてはこれ以外あまり出典がないです。

書籍
Scala Design Patterns: Patterns for Practical Reuse and Design
by John Hunt
(2013/12/6)


review はかなり酷評を受けていますが...。

Part II – Fundamental Patterns
  • Immutability
  • Singleton
  • Marker Trait
  • Delegation
  • Lazy Parameters
  • Partially Applied Functions
  • Trait Based Template Operation
  • Stackable Traits
  • Currying and Code Reuse
  • Cake Pattern
  • Structural Injection
  • Implicit Injection Pattern
  • Functor
  • Applicative Functor
  • Monoid Pattern
  • Monad Pattern
  • Foldable
  • Zipper
  • Lens Pattern
  • View Pattern
  • Arrow Pattern

書籍
Functional Programming Patterns in Scala and Clojure: Write Lean Programs for the JVMby Michael Bevilacqua-Linn
(2014/1/13)


まあまあの評価ですかね。

Replacing Object Oriented Patterns
  • Replacing Functional Interface
  • Replacing State Carrying Functional Interface
  • Replacing Command excerpt
  • Replacing Builder For Immutable Object
  • Replacing Iterator
  • Replacing Template Method
  • Replacing Strategy
  • Replacing Null Object
  • Replacing Decorator
  • Replacing Visitor
  • Replacing Dependency Injection

Functional Patterns
  • Tail Recursion excerpt
  • Mutual Recursion
  • Filter-Map-Reduce
  • Chain of Operations
  • Function Builder
  • Memoization
  • Lazy Sequence
  • Focused Mutability
  • Customized Control Flow
  • Domain-Specific Language

書籍
Reactive Enterprise with Actor Model: Application and Integration Patterns for Scala and Akka
by Vaughn Vernon
(2015/5/17)

これまだ売ってないですね。来年の 2015 年 5 月発売。でも reactive programing や Akka に特化しててなんか期待できそう。

Chapter 3. Performance Bent
  • Transistors Matter
  • Clock Speed Matters
  • Cores and Cache Matter
  • Scale Matters
  • Multi-Threading Is Hard
  • How Actor Model Helps
  • The Patterns
Chapter 4. Messaging with Actors
  • Message Channel
  • Message
  • Pipes and Filters
  • Message Router
  • Message Translator
  • Message Endpoint
  • Chapter 5. Messaging Channels
  • Point-to-Point Channel
  • Publish-Subscribe Channel
  • Datatype Channel
  • Invalid Message Channel
  • Dead Letter Channel
  • Guaranteed Delivery
  • Channel Adapter
  • Message Bridge
  • Message Bus
Chapter 6. Message Construction
  • Command Message
  • Document Message
  • Event Message
  • Request-Reply
  • Return Address
  • Correlation Identifier
  • Message Sequence
  • Message Expiration
  • Format Indicator
Chapter 7. Message Routing
  • Content-Based Router
  • Message Filter
  • Dynamic Router
  • Recipient List
  • Splitter
  • Aggregator
  • Resequencer
  • Composed Message Processor
  • Scatter-Gather
  • Routing Slip
  • Process Manager
  • Message Broker
Chapter 8. Message Transformation
  • Envelope Wrapper
  • Content Filter
  • Claim Check
  • Normalizer
  • Canonical Message Model (a.k.a. Canonical Data Model)
Chapter 9. Message Endpoints
  • Messaging Gateway
  • Messaging Mapper
  • Transactional Client / Actor
  • Polling Consumer
  • Event-Driven Consumer
  • Competing Consumers
  • Message Dispatcher
  • Selective Consumer
  • Durable Subscriber
  • Idempotent Receiver
  • Service Activator
Chapter 10. System Management and Infrastructure
  • Control Bus
  • Detour
  • Wire Tap
  • Message Metadata / History
  • Message Journal / Store
  • Smart Proxy
  • Test Message
  • Channel Purger

こんな感じでしょうか。
Scala に限らない一般的な patterns がちらほら。
さて全部の pattern の中身を追う時間はないので...

一番有名な pattern である Cake Pattern を改めて見てみましょう。結局?(笑) うんざりする人もいると思いますが。

歴史的には、
Odersky, Zenger (2005), "Scalable Component Abstractions" によって仕様提示され、 Scala Lounge mailing list (2007) で John Pretty によりこの名前が提案されました。

大雑把には Scala のみで dependency injection を可能とする pattern です。

ケイクパターン、ケーキパターン、どっちで読んでますか?
ケーキと読んだら、そう今日は Christmas。 Xmas cake など如何でしょうか。
それではここで Xmas cake pattern を書いた Gist をプレゼントします。例の snippet から中の名前が変わってるだけに見えるのは...その通りです (笑) これで cake に火を灯しましょう。

Loading code....

さてなんとか間に合った...のかな。

OOAD Criticism

OOAD Criticism
「オブジェクト指向」OOAD 批判

現実と computer のあいだ

OOAD とは オブジェクト指向分析設計 それで
今の状況を凝視める
現実を識別し オブジェクト と その関係 の形へ落とし込む作業 それで
何と無く有る状態を見えるようにする

しかしそれは現実だろうか
基本的に オブジェクト は 階層関係 へと落とし込まれる
その分析は人工的解剖学的眼差しで要素還元主義  それは現実だろうか
現実にはそんな static な階層構造など存在しない  しかし落とし込まれる

これはシステム
常に practical で利用者のために存在している
やるべきことは芸術ではなくシステム
ただそれだけの存在理由  行き違いはここから始まる

中途半端なことより極端な原理主義を一度経験した方が見えなかったものが見えるだろう
そして其処から何かが始まるだろう


Footnotes
二つの主題 と共に。
OOAD でさえ限界がある: その手法自体に限界と限定があるのを実感する人がいるならそろそろ再考してもいいのではないでしょうか。 Always no silver bullet
極端な諦めと極端な盲目: この二人の日本人はよく見たけれど (特に諦め) 、あいだの人は見たことがない。 OOAD に限らず設計には結局 balance が重要でそれを維持するのにも cost が要る。 balance とは 本質的目的 への accuracy

2014年12月21日日曜日

OOP Criticism

OOP Criticism
日本「オブジェクト指向」= OOP 認識批判

認識の pitfalls として


「オブジェクト指向」とは何?
そんな英語はない
そうなの?じゃあ「オブジェクト指向」とは何?
曖昧な言葉でしかない

だから解釈が勝手に行われる
プログラミング言語と解釈すれば
Java なりに落とし込まれる
考え方なら DDD などとせねば

「オブジェクト指向」と言えば OOP と思われることが殆ど
何故其処から出発するのか
意識など関心など何もない人が殆ど
言語記述の主体は何を解決するのか

始まりはいつも技術的創造であれ
L'arbre cache souvent la forêt.


Footnotes
  • OOP は Object-Oriented Programing の略。
  • オブジェクト指向とは Object-Oriented?? Object-Orientation?? 一般的に使われる英語ではないです。Wikipedia には誰かが見出語を書いてはいますが
  • DDD は Domain-Driven Design の略。
  • 最後は フランス語の諺 「木を見て森を見ず」


2014年12月19日金曜日

Japanese Agile Criticism

Japanese "Agile" Criticism
日本「アジャイル」批判


果たして日本語の「アジャイル」
とは何を示しているのか
それでは英語の agile
とは何を示すのか

今の日本人は agile practice の塊が agile だと思ってないか
それで何か変わった?
問題なく残業もせず end-users に満足されているか
政治的金銭的にも成功した?

そうならないのは天地を勘違いするせい
agile いや人間の活動は方法ではなく文化に帰す
文化からあるべき方法が生まれる必然性
文化なくして方法は無に帰す

これを問題と思えない人間もそのうち勝手に agile になり得る
それは文化だからだと言える


Footnotes

日本語で agile が /ǽdʒ(ə)l/ でなく /ǽdʒaɪl/ と読まれるのは別の問題を孕んでいるのでここで深く言及しませんが (この場合特段間違っているのではないけれど)、この無感覚性で今後いつまでこのカタカナ英語文化を続けるのかも考えた方がいいと思う。もう少し別の投稿で書きます。

2014年12月11日木曜日

Theremin on Processing

Theremin on Processing in progress?

テルミン・オン・プロセシング・イン・プログレス?
If you want English, here is English version.

これは Processing Advent Calendar 2014 の 12月13日(土) に参加している記事です。

Advent Calendar 初参加で今回自分の中で設定した objective は、
Processing を使って、 手の動きを検知し Theremin ができないか ということでした。
あとは 特別に何か用意しなくてもいい ということも考えました。

と思っているとほとんど時間が取れず、
でもその中で何ができるかを考えて実行するのも一つの勉強だと考えました (lean startup or microservice?) 。
なので温かくみてください...。

さて、しかしもうすでに同じことを誰かがやっているなら意味ないだろうと恐る恐る Theremin で調べてみると案の定ありました...。
Theremin webcam (Windows, Mac??)
http://www.openprocessing.org/sketch/29512

でもみてみると、 セキュリティのおかげで Web 上でうまく動かないし、ダウンロードしてもそのままでは動かず、なんとか起動させてみたんですが、画面が小さすぎて control できない状態でした。
これじゃあ音階が作れないということでやはり自作しようとする動機ができました(笑)

さて効率的に進めるため、 libraries とその examples を漁って関係するものを見てみました。

まず音ですが以下の二つを見てみました。

  • minim (Processing 用の sound library)
  • sound (Processing 純正)

純正 sound で十分なんで minim は却下。

Camera は、以下の三つを見てみました。

  • video (Processing 純正)
  • OpenCV
  • BoofCV (Java でできた CV library です)

初めに考えたのは  video の画像差異を検知し point を決定する方法で、 Processing 上で programing しないといけないのですが (最初に挙げた Theremin webcam でもやっていました) 、これは一から書くのも時間がかかるので却下。
そしたら CV なんですが、 OpenCV がなぜかうまく Mac OS に install できないため、原因を探って直す時間もないんで (笑) 、 BoofCV を採用。そこで使えそうな example をベースにしました。

他にも import 可能な library を見ていたんですが、うまく使えそうなものはありませんでした。

ということで今できているものがこれです。



そしてこちらが作業している repository です。
GitHub - Theremin on Processing

作ったものはこちらからダウンロードできます。
GitHub - Theremin on Processing - release page

Camera 解像度は FaceTime HD (1280x720) に合わさせてもらってます。選べればいいですけど...。

まず起動したら controller にする対象を drag して囲ってください。普通は手ですね。
横軸が pitch です。縦にすると短すぎるので...。左から右へ高くなります。
縦が 音量 です。下から上へ音量が上がります。


作っていて思ったのは、実演奏に耐えるには、精度等に問題があると感じたので、確かにinfrared camera device (e.g. Kinect, Leap Motion) を使えばより実用的になるかと思いますが、何も用意しなくてできるというところで今回はここまでにしておきます。


この記事は、技術的に特別なことをしたわけではないので、主に Processing でこういうこともできますよという紹介ですね (笑)

この記事と artifacts は、 Boulez ではないですが work in progress にさせてもらいます。
非常に時間が限られた中でも何かはできると分かりました。


さて実用的かどうか判定してもらうため...
Neko Piano さんにこれを使って演奏してもらいました。
はじめてでかなり難しそうです...。

先ず手始めに操作の確認と音階の練習。

音楽っぽく、ピノキオの「星に願いを」を歌ってもらいました。

うーん、かなり音痴な感じですが (笑)
一応、これで音楽が演奏できることは確認しました。

ちょっと他の YouTube の video も見てみましたが、こういう digital な Theremin だと、音を動かすところで技術的に満足して終わって、音楽を演奏しているのは見つからなかったです。初かも?

しかしなんとかものになって良かった...。

Scala on VSCode

Scala on VSCode ===================== Docker を利用した VSCode remote development 上で Scala 開発をする方法 Links ========== ## Scala on VSCode remote...