Monix v3.0.0-RC2からTask.applyの挙動が変わっている

最近、Monix というScalaの非同期プログラミング用ライブラリを使い始めました。

monix.io

最初は、最新安定版である v2.3.3 で色々触ってみて「これは使える!楽しい!」となって、v3.x 系の方はどんな感じかなと思いバージョンを上げてみると、メソッド名をはじめ、色々変わりまくっていることに焦りました。その中で Task.apply の挙動の変更には注意が必要だなと思ったので書いておきます。

v3.x系でのTask.applyの変更

v2.x 系では、以下のコードは非同期処理になっていたと思います。

val task = Task { // Task.apply
  1 + 2
}

ところが、v3.x 系ではこの挙動が同期処理に変わるようです。つまり、Task.applyTask.eval は同じ挙動になる。

Task.applyのコードを比較してみる

それでは、v2.x 系と v3.x 系の Task のコードを比較してみましょう。以下は抜粋です。

Monix v2.3.3

object Task extends TaskInstances {
  /** Returns a new task that, when executed, will emit the result of
    * the given function, executed asynchronously.
    *
    * @param f is the callback to execute asynchronously
    */
  def apply[A](f: => A): Task[A] =
    fork(eval(f))

https://github.com/monix/monix/blob/v2.3.3/monix-eval/shared/src/main/scala/monix/eval/Task.scala#L662-L669

Monix v3.0.0-RC2

object Task extends TaskInstancesLevel1 {
  /** Lifts the given thunk in the `Task` context, processing it synchronously
    * when the task gets evaluated.
    *
    * This is an alias for:
    *
    * {{{
    *   val thunk = () => 42
    *   Task.eval(thunk())
    * }}}
    *
    * WARN: behavior of `Task.apply` has changed since 3.0.0-RC2.
    * Before the change (during Monix 2.x series), this operation was forcing
    * a fork, being equivalent to the new [[Task.evalAsync]].
    *
    * Switch to [[Task.evalAsync]] if you wish the old behavior, or combine
    * [[Task.eval]] with [[Task.executeAsync]].
    */
  def apply[A](@deprecatedName('f) a: => A): Task[A] =
    eval(a)

https://github.com/monix/monix/blob/v3.0.0-RC2/monix-eval/shared/src/main/scala/monix/eval/Task.scala#L2376-L2395

v3.x 系のコメントにこのような記述があります。

WARN: behavior of Task.apply has changed since 3.0.0-RC2. Before the change (during Monix 2.x series), this operation was forcing a fork, being equivalent to the new Task.evalAsync.

以下は機械翻訳

警告:Task.applyの動作が3.0.0-RC2以降に変更されました。変更前(Monix 2.xシリーズ中)、この操作は新しいTask.evalAsyncと同等のフォークを強制していました。

つまり、v3.x 系で非同期な Task を使いたかったら Task.apply ではなく Task.evalAsync を使ってねということみたいです。

終わりに

今回の変更を受けて、 今後は Task.apply ではなく、Task.evalAsync で非同期なのか Task.eval で同期なのかを明示的に書いた方が良いのかなと思いました。v3.x 系では他にも Callback が任意のエラー型を設定できるようになってたりと大きな変更があるみたいですね。

セールを利用してMartin FowlerのRefactoringとMichael NygardのRelease It!を少しお安く購入した話

前回は海外の出版社のセールについて書きました。

shinharad.hateblo.jp

私は早速このセールを利用して、以下の2冊を購入しました。いずれもeBookです。

今回の買い物でどのくらい安くなったかというと、

  • Refactoring: Improving the Design of Existing Code, 2nd Edition
    • List Price: $47.99
    • Discount: -$16.80 (BLACK FRIDAY SALE Buy 1, Save 35%)
    • Subtotal: $31.19
  • Release It! Second Edition
    • List Price: $25.95
    • Discount: -$10.38 (Annual Black Friday Sale 40%OFF)
    • Subtotal: $15.57

合計で $46.76 でした。定価で買うと $73.94 なのでお得な買い物でした!

この時期は洋書の技術書をお得に買おう!

毎年恒例ですが、11月下旬から12月末にかけてのこの時期は、海外の出版社が相次いで年間最大規模のセールへ突入するので、洋書の技術書がお得に買えますよ、という話。

普段Safari Books Onlineなどのサブスクリプションサービスを利用していない人にとっては、この時期のセールを狙ってまとめ買いをしている人も多いのではないでしょうか。

今回は、Manning Publications、Packt Publishing、Apress、The Pragmatic Bookshelf、InformITのセールについて書きたいと思います。

Manning Publications

まずは、安心と信頼 *1 のManningです。 Manningは、毎年12月になると年末のカウントダウンセールとして、日替わりで何かしら安くなります。何が安くなるかは、特設サイトで毎日発表しています。今回であればここですね。

www.manning.com

ちなみに、日によっては電子書籍が全て半額とか、Videoが全て半額とかやるので、私の場合はその日を狙って購入しています。

Packt Publishing

Packtは、11/22現在Black Fridayで全品$10セールをやってますが、例年だと12月に更にお得な$5セールを開催しています。確実に開催されるかどうかは分からないですが、今回の$10セールは見送って$5セールを待ってみるというのも手ですね。ちなみにここ数年は毎年開催されていたと思います。

www.packtpub.com

Apress

Apressも現在Cyber Monday Saleで、eBookが全品$7と今ならお得に買えるようです。

www.apress.com

Apressの場合、Practical NATSみたいなニッチな書籍 *2 も扱っているので、ラインナップを見ているだけでも楽しいかもしれません。

www.apress.com

The Pragmatic Bookshelf

The Pragmatic Bookshelfは、現在Annual Black Friday Saleとして全品40%OFFとなってます。

Annual Black Friday Sale | The Pragmatic Bookshelf

Programming Clojure, Third Edition を安く買えるチャンスですね!

InformIT

InformITは、現在Black Friday Saleとして1冊購入で35%OFF、2冊以上購入で55%OFFとなってます。

www.informit.com

終わりに

海外の出版社の面白いところは、豊富なコンテンツだけでなく、これから出版予定の本も併せてセール対象になるところだと思います。 是非このセールを利用してお得にまとめ買いしちゃいましょう!

*1:個人の感想です

*2:NATSを扱った唯一の書籍?

Scala関西Summit 2018のスライドのリンク集(WIP)

Scala関西Summit 2018 で公開されたスライドを集めてみました。順不同です。随時更新していきます。

「Complete React Tutorial (with Redux)」はReactの基礎を学ぶのに良いかもしれない

フロントエンドの技術を学ぶのに私がよく利用している The Net Ninja (動画学習サイト)ですが、知りたいことはまず動画で学び、深掘りしたくなったら書籍などで学ぶというスタイルが効率的な学習方法なのかなと最近感じています。

さて、今回はそんな The Net Ninjaの「Complete React Tutorial (with Redux)」でReactを学んでみました。

Complete React Tutorial (with Redux)

こちらはYouTubeで公開されている学習コースになります。

www.youtube.com

動画の総数は44本で、1本あたりの長さは短いもので3、4分程度、長いものだと10分程度なので、空いた時間に少しずつ進められます。

学習コースの内容

本学習コースは大きく5つに分かれていて、以降はそれぞれでどんな内容を学べるのかを書いていきたいと思います。 (ちなみに「基本編」「応用編」とかは便宜上私が付けました。)

基本編1

スライドを見たりコードを書いたりしながら以下の内容を学びます。

  • Reactの概要とセットアップ
  • Component、State、Event、JSX

(動画の#1から#9に相当)

基本編2

シンプルな画面を作りながら次のような内容を学びます。

  • create-react-appでReactアプリを作成
  • React Dev Toolのインストールと使い方
  • Virtual DOM
  • Nested Component、Props
  • Container Component vs UI Component
  • Conditional Output
  • cssファイルの扱い方
  • Componentのライフサイクル
    • componentDidMount、componentDidUpdate

(動画の#10から#22に相当)

応用編

これまでの応用編としてTODOアプリを作ります。

f:id:shinharad:20181110225957p:plain

(動画の#23、#24に相当)

React Router

Poke'Timesというシングルページアプリケーションを作りながら次のような内容を学びます。

  • React Routerのインストールと使い方
    • Links & NavLinks
    • Route Parameters
    • Redirect
    • Switch Tag
  • Higher Order Components
  • Axiosを使用し外部APIより取得したデータを画面に出力

f:id:shinharad:20181110225753p:plain

(動画の#25から#33に相当)

Redux

Reduxの解説から始まり、Poke'TimesにReduxを組み込んでいきます。

(動画の#34から#43に相当。#44は総まとめの回)

終わりに

Reactは前々から気になっていたのでこの学習コースを通じて理解を深めることができました。Vue.jsと比較するとフレームワークが隠蔽している部分がReactの方が少ないので、個人的にはReactの方が好きだったりします。今後は更に深掘りしつつ趣味のやつを作っていきたいと思います!

毎週末持って帰るのがつらいので自宅用のHHKBを購入した

今までHHKBは一台しか持っていなくて、平日は職場で、週末は自宅へ持って帰るという生活が続いていました。

一応、ハードケースDX というHHKB専用のケースで持ち運んでいたのですが、これだと電車で片手が塞がってしまい、本を読むのに邪魔だったんですよね。

それなので、思い切って自宅用のHHKBを購入してみました。中古ですが状態はとても良いです。

f:id:shinharad:20181029235545j:plain

自宅でしか使わないのでType-Sじゃない方を購入しましたが、やはりType-Sと打鍵感が全然違いますね。この辺は割り切りが必要なのかなと思ってます。

今後は吸振マットとキーボードブリッジを装備させてより快適な環境にしていきたいと思ってます。

(二刀流をやってみたので記念にパチリ)

f:id:shinharad:20181029235738j:plain

「Mastering Functional Programming」を読んだ

Packt PublishingMastering Functional Programming を読みました。今回はこの本について書きたいと思います。

www.packtpub.com

どんな本か

この本はざっと次のような内容が書かれています。ちなみに言語はScalaです。

  • 関数型、命令型プログラミング双方のアプローチの違いについての比較
  • 副作用を抽象化し参照透過性を維持させる方法
  • 型クラスでWriterやIOなどのEffect Typeに対してビヘイビアを注入する方法
  • Cats の構成と利用頻度の高い型クラスについて
  • Cats Effect を使用した並行プログラミング
  • Typelevel.scala の各種ライブラリを使用したWebAPIの実装
  • Monad TransformerやTagless Final、HListなど、FP特有のパターン
  • アクターモデルとそのユースケース

内容的には、Scala with Cats の前に読むと良さそうかなと思いました。

理解度に応じた読み方

目次はこんな感じになっています。

  • Chapter 1 The Declarative Programming Style
  • Chapter 2 Functions and Lambdas
  • Chapter 3 Functional Data Structures
  • Chapter 4 The Problem of Side Effects
  • Chapter 5 Effect Types: Abstracting Away Side Effects
  • Chapter 6 Effect Types in Practice
  • Chapter 7 The Idea of the Type Classes
  • Chapter 8 Basic Type Classes and Their Usage
  • Chapter 9 Libraries for Pure Functional Programming
  • Chapter 10 Patterns of Advanced Functional Programming
  • Chapter 11 Introduction to the Actor Model
  • Chapter 12 Actor Model in Practice
  • Chapter 13 Use Case: A Parallel Web Crawler

この内、ScalaのコレクションフレームワークやOption、Either、Future、Tryが分かっている人はChapter 6まで読み飛ばして良さそうです。それと、型クラスを理解しているのならChapter 7は読まなくても良さそう。あと、Akka実践バイブル などでAkkaをある程度理解している人であればChapter 11以降は読まなくても良さそう。

つまり、Cats をはじめとする Typelevel.scala の各種ライブラリに触れるだけの目的であれば、Chapter 8 〜 10 だけ読めば十分だと思います。

それでは、そのChapter 8 〜 10についてもう少し詳しく書きたいと思います。

Chapter 8 Basic Type Classes and Their Usage

Cats の構成を俯瞰的に解説していて、全体を把握するのに良いですね。instances、data、syntaxそれぞれのパッケージがどのような役割を持っているのかとか。型クラスのHierarchyとか。Monad、Applicative、Fuctor、Monoid、MonoidK、Traverseについての解説など、参考になりました。

Chapter 9 Libraries for Pure Functional Programming

Cats Effect を使用した並行プログラミングについて解説しています。その中で、FiberはMonadicフローにおいてIOの非同期処理の開始(start)、待ち合わせ(join)、キャンセル(cancel)を明示的に宣言するものであるとか、Bracketはリソースの開放をするものだとか。そして、Typelevel.scala の以下のライブラリを使用したWebAPIの実装例を紹介しています。

個々はそれほど深い内容ではないので、気になったら各ライブラリの公式サイトなどで学ぶと良さそう。

Chapter 10 Patterns of Advanced Functional Programming

関数型プログラミングをより便利に書くためのパターンとして、Monad TransformerやTagless Final、Heterogeneous List(HList)を解説しています。この内、Tagless Finalについて名前は知っていたものの、どのようなものなのか知らなかったので、学ぶ良い機会だったなと思います。

終わりに

Mastering Functional Programmingは、それほど濃い内容では無いものの、Catsを俯瞰して見ることができたり、doobieやhttp4sなど今まで触ったことの無いライブラリと出会えて良い刺激になりました。