2015年のまとめ

2015年のまとめ的な記事が流れてきたので, その流れに便乗して今年のまとめ記事書いてみます.

続きを読む...

Java に独自の型検査処理を追加する方法

これは 言語実装 Advent Calendar 2015 の 14 日目の記事です.

Pluggable Annotation Processing API (JSR 269) による Functor の型検査 という以前に書いた記事を, Advent Calendar 用に再構成, 要約したものです.

Note

この記事では主に型情報にアクセスする方法について書きます. それ以外の部分は上記の元記事を参照してください.

Java で函手を書いてみたかった

そもそもは「Java で函手を書く」という無茶をしてみたかっただけです. 無茶は承知の上で, 書こうとする過程でどんな障害があって, どうやって回避できるかを探りたかったのです.

函手について解説するのはこの記事の目的ではないので, 厳密な定義などについては触れません. 函手 (関手, Functor) の定義は 独習 Scalaz — 圏の例 あたりを読んでください.

何をしたかったかをソースコードで表せば,

import java.util.function.Function;

public class MyFunctor<A> {

    public <B> MyFunctor<B> map(Function<A, B> morphism) {
        // ...
    }

}

こんなメソッド map を持ったクラスを実装するのがゴールです.

続きを読む...

Pluggable Annotation Processing API (JSR 269) による Functor の型検査

https://bitbucket.org/cocoatomo/categorical/ で開発している, 注釈による型クラスの実現手法の解説です.

発端

うらがみさんが Scala による Functor の実装をしていて,

trait Functor[A, F[_]] { self: F[A] =>
  def map[B](f: A => B): F[B]
}

(https://github.com/backpaper0/sandbox/blob/134a658c42eb14354ce53fa95931d5a32672fc74/functor-applicative-study/src/main/scala/functor-applicative-study.scala#L5-L7 より引用)

興味深かったので Java でもなんとかならないかと試していました.

続きを読む...

applicative 函手は strong lax monoical 函手

前回 (圏論における applicative functor) の続きです.

タイトルから想像できる通り, 調べる対象が applicative 函手から strong lax monoidal 函手に変わっただけで, まだ完全には理解してません.

読んだ論文

酒井さんからご紹介いただいた “Applicative Programming with Effects” [Conor_and_Ross_2008] という論文を読んでみます.

Abstract に “In this paper, we introduce Applicative functors” とあるので, この論文で applicative functor が初登場したのかな??

論文の構成

節の内容を要約するとこんな感じになります.

  1. Introduction

    applicative が隠れているところをいくつか紹介

  2. The Applicative class

    Haskell の Applicative 型クラスの定義

  3. Traversing data structures

    Traversable 型クラスは Applicative 型クラスから作れる

  4. Monoids are phantom Applicative functors

    Monoid 函手はファントム (亡霊?) Applicative 函手

  5. Applicative versus Monad?

    ApplicativeMonad の関係

  6. Applicative functors and Arrows

    Applicative 函手と Arrows の関係

  7. Applicative functors, categorically

    Applicative を圏論の視点で見る

    一番知りたかった内容

  8. Conclusion

    まとめ

    Applicative は色んなものの抽象化

    モナドとかコモナドとかアローとかアプリカティブとか圏論の構造の種類がめっちゃ増えてるけど, それで怖がらせるとか不安にさせるのはよくないよね. 表記法がそれぞれ違っててごちゃごちゃしてるのが良くないから, なんとか再利用できるようにしよう. この論文では [| f u_1 ... u_n |] という表記で書いてみたよ.

    みたいなことも書いてあって面白い.

    (ここで使われている mathbb っぽい括弧は, \(\LaTeX\) では stmaryrd パッケージ [stmaryrd]\usepackage{stmaryrd} と読み込むと \llbracket, \rrbracket と使えるそうです.)

続きを読む...

発端

という がくぞさん の疑問があって

平日夜にすごいH本をちょびちょび読む会 (通称: ちょびよみ) での話題にしよう, という流れになりました.

解説準備用のメモとして, この記事を書いておきます.

続きを読む...

圏論における applicative functor

applicative functor って何だ??

平日夜にすごいH本をちょびちょび読む会 17回目 いのちをだいじにしながら「すごいHaskellたのしく学ぼう!」を少しずつ読んでいく という読書会 (?) をやっていて, applicative functor というものが登場してきました.

使い方は分かるのですが, 数学を専攻してた人なので圏論での意味付けが気になって仕方ありません.

そこでこんなふうにつぶやいたところ, 予想以上に多くの反応をもらえました. せっかくなので記録のためにメモっておきます.

続きを読む...

Spark Casual Talk #1 に行ってきました

最近データ解析や機械学習で色々と話題な Apache Spark ですが, その勉強会があるというので行ってきました. 一般枠が 123 人のところに 150 人の申し込みがあり, Spark が注目されているのが分かります.

勉強会の構成は, 発表が 2 つと LT が 6 本で 2 時間というものでした. 名前に casual とある通り, これから Spark に触れようという人でも気軽に参加できる内容だったと思います. (一部の LT は除く^-^;)

イベントページ: http://connpass.com/event/15575/ Togetter: http://togetter.com/li/838406

気になった話題

個人的に気になった話題について書いていきます. 個々の内容については, イベントページにアップロードされている資料や Togetter のつぶやきを参照してください.

DataFrame

メキメキ開発の進む Apache Sparkのいまとこれから: http://www.slideshare.net/hadoopxnttdata/nttdata-spark-casual-talk-1

2 つ目の発表「メキメキ開発の進む Apache Sparkのいまとこれから」で, Spark SQL が使っている DataFrame が紹介されていました. DataFrame は Spark SQL のためだけのものかと思っていましたが, DataFrame API も用意されていて Scala や Python など他の言語からも操作ができるようです. DataFrame には最適化の機能もあり, どの言語で書かれていても最適化の恩恵を等しく受けられるそうです.

Project Tungsten

Spark Summit 2015 参加報告: http://www.slideshare.net/potix2_jp/spark-summit-2015

1 つ目の発表「Spark Summit 2015 参加報告」で, Project Tungsten というパフォーマンス改善の取り組みが紹介されていました. このプロジェクトは, DataFrame で記述された論理計画を実行する部分を高速化しようというものです. 現在のハードウェアの流れを見ているとストレージやネットワークに比べて CPU の高速化が遅れているので, そこを補う方向を目指しているようです.

From DataFrames to Tungsten: A Peek into Spark’s Future: http://www.slideshare.net/databricks/2015-0616-spark-summit

JIRA にプロジェクトの親 issue があり (SPARK-7075 https://issues.apache.org/jira/browse/SPARK-7075) 関連 issue はその下にぶら下がっています.

Notebook

「メキメキ開発の進む Apache Sparkのいまとこれから」で Apache Zeppelin, 「Hueで実現する、SparkとSQLのためのノートブック」で CDH の Hue と複数の発表で notebook の話題が出てきていてかなり気になりました. notebook というのは私が勝手に呼んでいるツールの種類の名前で, だいたい次の機能を備えているものを notebook に分類しています.

  • データの対話的操作
  • コマントの結果やデータをグラフなどの画像で表現

昔からあるもので言えば, Mathematica, Maple, Sage (これは比較的最近) などの数式処理ソフト, 2 つ目の機能を実現するもので言えば Excel などの表計算ソフト, gnuplot などのグラフ化ツールなどがあります.

Spark にはデフォルトで pyspark から IPython notebook が利用できます. IPython は元々は Python の便利な REPL だったのですが, バージョン 0.12 からブラウザを UI とした notebook 機能が追加され, バージョン 4.0 からはそこを Jupyter という別プロジェクトとして発展させていくそうです.

上の機能に加え notebook ツールにあると便利な機能はこんなところです.

  • 実行したコマンドの記録, 再現可能な形式での保存, 再実行

    gnuplot の save, load コマンド相当のもの: http://lowrank.net/gnuplot/intro/basic.html#exit

  • 複数人での画面の共有

    複数人でチャットしつつ, それぞれがコマンドを入力し, その結果を共有できたり.

    Google Wave がイメージに近かったのですが, なんで死んでしもうたんや……

なぜ私が notebook ツールに注目するかと言えば, それが分析とレポーティングに役立つツールだからです. くだけた言い方をすれば, notebook ツールはあるデータを自分や他の人に分かりやすく見せ, 対象について理解を深め, 何らかの行動につなげるために役立つ重要なツールだと思っています.

色んなことを知ることができた勉強会だったので Spark Casual #2 にも参加してみようと思います.

ではでは.

Asakusa Gradle Plugin に触れてみよう

この記事は Asakusa Framework Advent Calendar 2014 の 12/10 の記事です.

Asakusa Framework のことは名前と用途くらいは知ってるものとして, Asakusa Gradle Plugin について書いていきます.

基本的に Asakusa Gradle Plugin利用ガイド の抜粋みたいな文章なので, そちらも参考に読んでみてください.

Asakusa Gradle Plugin とは

コンパイルが必要な言語でのソフトウェアの開発の流れは、

  1. ファイルにプログラムを記述
  2. コンパイル
  3. テスト
  4. リリース用にビルド

となると思います.

Asakusa バッチアプリケーションを開発する上で, このリストの 2, 3, 4 番の項目に 1 つ加えた

  • 開発環境の準備
  • コンパイル
  • テスト
  • リリース用にビルド

の 4 つの作業をサポートするのが Asakusa Gradle Plugin (以下 Gradle Plugin) です.

そこで使っているビルドツール (正確にはビルドツールのための汎用フレームワーク?) は Gradle です. ここでは Gradle には深入りしないので, ユーザガイド や書籍に当たってみてください.

先程の 4 つの作業をどうサポートするかについて, これから (おそらく数記事に分けて) 解説していきます. CLI 編と GUI 編の解説が必要なのですが, まずは CLI 編から入っていきます.

まずは実行しよう

何はともあれ Gradle Plugin を触ってみましょう.

Asakusa を使ったサンプルプロジェクト asakusa-example-project-0.7.1.tar.gz が公開されているので, これに対して Gradle Plugin を使っていきます.

## java はインストールされてるものとします
$ java -version
java version "1.7.0_21"
Java(TM) SE Runtime Environment (build 1.7.0_21-b12)
Java HotSpot(TM) 64-Bit Server VM (build 23.21-b01, mixed mode)

## 環境変数 JAVA_HOME も設定しておいてください
$ echo $JAVA_HOME
/Library/Java/JavaVirtualMachines/jdk1.7.0_21.jdk/Contents/Home

## 開発用ディレクトリに移動
$ cd どこか適当なディレクトリ

## サンプルプロジェクトをダウンロード. 手動でも可.
$ wget http://www.asakusafw.com/download/gradle-plugin/asakusa-example-project-0.7.1.tar.gz
## もしくは
$ curl -O http://www.asakusafw.com/download/gradle-plugin/asakusa-example-project-0.7.1.tar.gz

## ファイルを展開
$ tar xvf asakusa-example-project-0.7.1.tar.gz

## プロジェクトディレクトリに移動
$ cd asakusa-example-project/

ここまで上手く行けば, Gradle Plugin を使う環境が整いました. さっそく次のコマンドを打って Gradle Plugin でできることを見ていきましょう.

$ ./gradlew tasks
Downloading http://services.gradle.org/distributions/gradle-2.1-bin.zip
..........................(中略)
:tasks

------------------------------------------------------------
All tasks runnable from root project
------------------------------------------------------------

Asakusa Framework Build tasks
-----------------------------
compileBatchapp - Compiles the Asakusa DSL java source with Asakusa DSL Compiler.
compileDMDL - Compiles the DMDL scripts with DMDL Compiler.
generateHiveDDL - Generates Hive DDL file from Data Models [Experimental].
generateTestbook - Generates the template Excel books for TestDriver.
generateThunderGateDataModel - Executes DDLs and generates ThunderGate data models.
jarBatchapp - Assembles a jar archive containing compiled batch applications.
summarizeYaessJob - Analyzes YAESS job execution from log file [Experimental].
testRunBatchapp - Executes Asakusa Batch Application [Experimental].

Asakusa Framework Organizer tasks
---------------------------------
assembleAsakusafw - Assembles a tarball containing framework files for deployment.
attachBatchapps - Attaches batch applications to assemblies.
attachComponentCore - Attaches framework core components to assemblies.
attachComponentDevelopment - Attaches development tools to assemblies.
attachComponentDirectIo - Attaches Direct I/O components to assemblies.
attachComponentExtension - Attaches framework extension components to assemblies.
attachComponentOperation - Attaches operation tools to assemblies.
attachComponentTesting - Attaches testing tools to assemblies.
attachComponentThunderGate - Attaches ThunderGate components to assemblies.
attachComponentWindGate - Attaches WindGate components to assemblies.
attachComponentWindGateSsh - Attaches WindGate SSH components to assemblies.
attachComponentYaess - Attaches YAESS components to assemblies.
attachComponentYaessHadoop - Attaches Yaess Hadoop bridge components to assemblies.
attachExtensionDirectIoHive - Attaches Direct I/O Hive extensions to assemblies.
attachExtensionWindGateRetryable - Attaches WindGate retryable extensions to assemblies.
attachExtensionYaessJobQueue - Attaches YAESS JobQueue client extensions to assemblies.
attachExtensionYaessTools - Attaches YAESS extra tools to assemblies.
cleanAssembleAsakusafw - Deletes the assembly files and directories.
installAsakusafw - Installs Asakusa Framework to $ASAKUSA_HOME using 'dev' profile.
updateAsakusafw - Updates Asakusa Framework on $ASAKUSA_HOME using 'dev' profile.

Build tasks
-----------
assemble - Assembles the outputs of this project.
build - Assembles and tests this project.
buildDependents - Assembles and tests this project and all projects that depend on it.
buildNeeded - Assembles and tests this project and all projects it depends on.
classes - Assembles classes 'main'.
clean - Deletes the build directory.
jar - Assembles a jar archive containing the main classes.
testClasses - Assembles classes 'test'.

Build Setup tasks
-----------------
init - Initializes a new Gradle build. [incubating]

Documentation tasks
-------------------
javadoc - Generates Javadoc API documentation for the main source code.

Help tasks
----------
components - Displays the components produced by root project 'asakusa-example-project'.
dependencies - Displays all dependencies declared in root project 'asakusa-example-project'.
dependencyInsight - Displays the insight into a specific dependency in root project 'asakusa-example-project'.
help - Displays a help message
projects - Displays the sub-projects of root project 'asakusa-example-project'.
properties - Displays the properties of root project 'asakusa-example-project'.
tasks - Displays the tasks runnable from root project 'asakusa-example-project'.

IDE tasks
---------
cleanEclipse - Cleans all Eclipse files.
eclipse - Generates all Eclipse files.

Verification tasks
------------------
check - Runs all checks.
test - Runs the unit tests.

Other tasks
-----------
wrapper

Rules
-----
Pattern: clean<TaskName>: Cleans the output files of a task.
Pattern: build<ConfigurationName>: Assembles the artifacts of a configuration.
Pattern: upload<ConfigurationName>: Assembles and uploads the artifacts belonging to a configuration.
Pattern: attachConf<Target>: Attaches asakusafw custom distribution files to assembly.

To see all tasks and more detail, run with --all.

BUILD SUCCESSFUL

Total time: 49.6 secs

こんな出力が出ていたら Gradle Plugin は無事動いています! 初めての Gradle Plugin の実行成功おめでとう!!

どうも上手く動いていないようなら, 環境変数 JAVA_HOME の設定や各コマンドが異常終了していないか echo $? で 1 つ 1 つ確かめてみてください.

出力の解説

如何せん出力が多いので, 必要なところから解説していきます.

この ./gradlew tasks というコマンドで出力したのはタスクの一覧です. タスクとはその名の通り「何らかの作業」です. ./gradlew タスク名 という形式で Gradle に何らかの作業を指示します. 先程のコマンドを例に出せば, tasks という名前のタスクはタスク一覧を出す処理を行うものでした.

Asakusa Framework Build tasks
-----------------------------

とある下に並んでいるのは Gradle Plugin が提供する Asakusa プロジェクト用のタスクです. これらのタスクは, 最初のリストで上げた作業のうち主に

  • コンパイル
  • テスト

に関わる作業をサポートします.

Asakusa Framework Organizer tasks
---------------------------------

とある下に並んでいるのも, 同じく Gradle Plugin が提供する Asakusa プロジェクト用のタスクです. こちらのタスクは主に

  • 開発環境の準備
  • リリース用にビルド

のサポートを受け持ちます.

他にもタスクはありますが, いっぺんに説明しても混乱すると思うので, まずはこのくらいにしておきます.

では

  • Asakusa Gradle Plugin とは何ぞや? 何のためにあるの?
  • Gradle Plugin の実行方法
  • Gradle には「タスク」というものがあり, Asakusa 用のタスクを使って Asakusa バッチアプリケーションを開発していく

あたりを伝えられたと思うので, 今日はこのくらいで.

Syobochim and Kotlin Advent Calendar 12/09

この記事は しょぼちむ Advent Calendar 2014Kotlin Advent Calendar 2014 の 12/09 分です.

昨日のしょぼちむ Advent Calendar 2014 の記事は @skrb さんの 追うしょぼちむ です.

昨日の Kotlin Advent Calendar 2014 の記事は @yy_yank さんの 別のプログラミング言語を使うということ #ktac2014 です.

しょぼちむさんをフォローした日

普段 Java を使ってお仕事しているのもあり, JVM 言語には興味がありました. 数カ月前のある日,「Kotlin アイドルという方が Twitter にいるようだ. 何か Kotlin について分かるかな」と思いフォローした結果,

あれ?(′・ω・`)

えっえっ??

それから月日が経ち, ちょうど Advent Calendar の時期になったので, 「無いなら仕方無い, 自分で情報を集めよう! それを Advent Calendar の記事にしよう!」と思いこのブログ記事を書いています.

Java から Kotlin へ

とは言え, どこから始めていいのやら, 情報はどこにまとまっているのか分かってないです… そして, 自分としては Java に慣れているので, Java と比べてどういう言語なのかをまず知りたいのです…… 「じゃあ, Java を知ってる人が Kotlin を始めるのにちょうどいい情報を集めよう」というのが出発点であり, 目的でもあります.

さて肝心の記事は?

今回の記事はちょっと変わったところに書きました.

続きを読む...