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 だと、音を動かすところで技術的に満足して終わって、音楽を演奏しているのは見つからなかったです。初かも?

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

2014年7月21日月曜日

iPhone の Opera Mini と Opera Coast の違い

iPhone に Opera Coast というブラウザがリリースされたんですが、既存の Opera Mini と Opera Coast の違いは何でしょうか。 特に明確に誰も差別化を書いていないんですが、 Coast は一から作ったらしく、単純に新しい Opera と考えたらいいと思います。 使い方がちょっと変わっていて慣れないと良くわからないかもしれません。

2014年7月16日水曜日

サブウェイ WiFi

サンドウィッチの Subway で 3 時間だけ無料で WiFi が使えます。
PC からでも OK!

ところでこの WiFi 、株式会社ワイヤ・アンド・ワイヤレス(Wire and Wireless Co.,Ltd.)というところが運営していて、 スタバの WiFi も au WiFi もこの会社が運営しているようです。

2014年6月22日日曜日

賞賛の英語 Admiration Vocabulary

Here is a list of admiration words from the video game, Marvel vs. Capcom.
This doesn't explain its accurate order but you may catch the feeling to express them.

Ascending 1 to 20, the higher admiration.

1. Yes!
2. Cool!
3. Good!
4. Great!
5. Dude!
6. Sweet!
7. Awesome!
8. Wonderful!
9. Viewtiful!(This puns beautiful.)
10. Excellent!
11. Stylish!
12. Fantastic!
13. Amazing!
14. Incredible!
15. Mighty!
16. Marvelous!
17. Uncanny!
18. Crazy!
19. Galactic!
20. Unstoppable!

2014年4月28日月曜日

Hibernate Session スコープ戦略 3/3 (FMP設定編)

 Flow Managed Persistence (FMP) の設定方法の説明です。
 この戦略は Spring Web Flow (SWF)を利用します。 FMP を使う場合は、 OSIV の設定は不要です。 設定方法は、 SWF の Listener を設定している xml ファイルに、以下を記述すれば良いです。 JPA の場合は、以下のように記述を追加します。
<webflow:flow-executor id="flowExecutor" flow-registry="flowRegistry">
    <webflow:flow-execution-listeners>
        <webflow:listener ref="jpaFlowExecutionListener" />
    </webflow:flow-execution-listeners>
</webflow:flow-executor>
 
<bean id="jpaFlowExecutionListener" 
      class="org.springframework.webflow.persistence.JpaFlowExecutionListener">
    <constructor-arg ref="entityManagerFactory" />
    <constructor-arg ref="transactionManager" />
</bean>
JPA を使わず Hibernate のみの場合は、以下のように記述を追加します。
<webflow:flow-executor id="flowExecutor" flow-registry="flowRegistry">
    <webflow:flow-execution-listeners>
        <webflow:listener ref="hibernateFlowExecutionListener" />
    </webflow:flow-execution-listeners>
</webflow:flow-executor>
 
<bean id="hibernateFlowExecutionListener" 
      class="org.springframework.webflow.persistence.HibernateFlowExecutionListener">
    <constructor-arg ref="sessionFactory" />
    <constructor-arg ref="transactionManager" />
</bean>
あとは、各々のスコープを利用するフローの xml に、
<?xml version="1.0" encoding="UTF-8"?>
<flow xmlns="http://www.springframework.org/schema/webflow"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.springframework.org/schema/webflow
                          http://www.springframework.org/schema/webflow/spring-webflow-2.0.xsd">

    <persistence-context />
    
    ....
    
</flow>
のように、そのフローのスコープ内で Hibernate の Session が生きていることを設定します。 そして、スコープの終わりには、
<end-state id="bookingConfirmed" commit="true" />

のように記述することで、トランザクションのコミットと同時に Session を閉じるようにします。
 以上で、 FMP の設定は終わりです。

 まとめ
 SWF の FMP を使うことで、手動で Hibernate  と同期すること、つまり分離(detach)と付加(attach)を操作することなく、そのフロースコープを定義することで自動で同期してくれます。 References
Open Session in View by Hibernate Community https://community.jboss.org/wiki/OpenSessionInView
Spring Web Flow 2 でのフロー・マネージド・パーシスタンス by IBM
OSIV by Spring Forum
OSIVF vs OSIVI
Session Strategy by Hibernate Reference

Hibernate Session スコープ戦略 2/3 (OSIV設定編)

意外と見られていたので、放置しておいてた Hibernnate の記事を追記していきます。
別のサイトに書いて置いたものをここに持ってきただけですけどね。

OSIV と FMP の設定方法について説明していきます。 OSIV, FMP どちらも Spring の設定方法自体は簡単です。 Open Session In View (OSIV) の設定方法 まず Open Session In View (OSIV) ですが、 Spring には 2つの解決方法があります。
  1. OpenSessionInViewFilter
  2. OpenSessionInViewInterceptor
OpenSessionInViewInterceptor は Spring MVC を利用する場合に使えるクラスです。 よって、 Spring Web Flow を使うときは、 1. OpenSessionInViewFilter になります。 その設定方法ですが、 JPA を利用する場合は、以下のような設定を web.xml に記述するだけです。
<filter>
    <filter-name>oemivFilter</filter-name>
    <filter-class>
        org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter
    </filter-class>
    <init-param>
        <param-name>entityManagerFactoryBeanName</param-name>
        <param-value>reportsEntityManagerFactory</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>oemivFilter</filter-name>
    <!-- ↓このパターンは利用する画面のURLに合わせてください -->
    <url-pattern>*.jsp</url-pattern>
</filter-mapping>
<>タグ記号の変換ってめんどくさい...。 JPA なしの Hibernate だけで利用する場合は、以下のような設定を web.xml に記述します。 Filter クラスが変わるだけですね。
<filter>
    <filter-name>oemivFilter</filter-name>
    <filter-class>
        org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter
    </filter-class>
    <init-param>
        <param-name>entityManagerFactoryBeanName</param-name>
        <param-value>reportsEntityManagerFactory</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>oemivFilter</filter-name>
    <!-- ↓このパターンは利用する画面のURLに合わせてください -->
    <url-pattern>*.jsp</url-pattern>
</filter-mapping>
これらの説明はなぜか Reference には書いておらず JavaDoc にしか記述がありません。 FMP 戦略にするなら、この設定は不要です。 これで、 OSIV の設定は終わりで、自動にビューレンダリングまで Session を開いてくれます。

T.B.C.

2014年4月7日月曜日

Windows Azure の読み方、発音

Windows Azure の Azure はどう発音するのでしょうか。日本マイクロソフトは、 TV コマーシャル でも「アジュール」と呼んでいるみたいですね。
しかし英語は、
American English /ˈæʒər/
British English /ˈæʒə(r)/ or /ˈæzjʊə(r)/
と読み、「アジャ」に近いです。
Azure を連呼しているビデオを観てみましょう。


因みにそもそも azure とは
青い空 an azure sky
というように使われる、空の青さのことです。クラウドですからね。
「アジュール」のような発音するのは、フランス語ですね。
 /a.zyʁ/ m



これでも「アズール」に近いですね。
さてなぜ「アジュール」と呼ぶことにしたのか。謎ですね。

2014年4月6日日曜日

git svn コマンド 状態遷移図

 既に Subversion を使っていて、または開発者が Git を使ったことがないなどの理由で、未だ Subversion を使っていることがあると思います。
 その場合は、自分の環境だけでも Git を利用することができます。その Git 環境から Subversion repository へコミットして連携します。これにより、他の人は Subversion を使いながら自分は Git を利用できるという兎に角 better な状況を得ることができます。
 さて Git + Subversion では、Git の git svn コマンドを使うことになります。
 その使い方と状態遷移について、 Git ならあると思いますが、 git svn では中々見つからないので、作ってみました。以下の図なります。


">..."はコマンドです。
線は Subversion repository へのコミットの流れ
線は Subversion repository からの更新の流れ
です。
 Hackneyed な Subversion に苛々している方々、または現状の環境で Git に挑戦しようとする方々、お役に立てたでしょうか。

Scala on VSCode

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