AtomのGit / GitHub連携機能を試してみた

Atom 1.18がリリースされ、以前アナウンスされていたGit / GitHub連携機能が標準で使えるようになったので試してみました。

blog.atom.io

「Packages」メニューの「GitHub」サブメニューからエディタの右側にGit / GitHubタブを表示できます。キーボードショートカットでは^ + (でGitタブ、^ + *GitHubタブをトグルすることができます。

Gitタブでは変更したファイルの差分を確認したり、ステージ、コミットが可能です。また、画面下のステータスバーからブランチの作成・切り替え、プッシュ、プル、フェッチを行うことができます。あとログを見たりマージやリベース操作ができれば最低限必要な日常操作はできそう。

f:id:takezoe:20170619115537p:plain

GitHubタブはアクセストークンを登録する必要があります。今のところはoriginに現在のブランチに対応するプルリクエストがあるとその内容を表示することしかできないようです。差分も見たり何か操作ができるわけでもありませんし、プルリクエストに変更があっても反映されないようです。タブにもpreviewと書いてありますが、まだほとんど何もできないに等しいです。

f:id:takezoe:20170619115805p:plain

Git連携に関しては基本的な操作は可能なものの日常的に利用するにはもう一息、GitHub連携に関してはまだまだこれからといったところでしょうか。git-plusやgit-controlなどのパッケージもありますが、正直どちらもあまり使いやすいとは言えませんので、Atom標準のGit連携機能が強化されることを期待したいところです。

Idris + Atomによる型駆動開発入門

4月から社内でType-Driven Development with Idrisの読書会をやっています。

takezoe.hatenablog.com

最近ようやくChapter 3まで進み、実際に自分でコードを書くエクササイズなども出てきました。この本ではAtomを使うことが推奨されているのですが、Atom用のIdrisパッケージが非常に強力で、型駆動開発の魅力を存分に感じることができます。そこで、今回は実際にAtomでのIdrisプログラミングがどのようなものかについて紹介したいと思います。

github.com

たとえば以下のようなシグネチャを持つVect(要素数を型情報に持つリスト)用のマップ関数を実装するとします。Vect n aの各要素に(a -> b)という関数を適用してVect n bを返すというものです。

my_vect_map : (a -> b) -> Vect n a -> Vect n b

まずmy_vect_map関数の型を定義し、関数定義部分でCTRL+ALT+Aを押します。 すると関数の実装の雛形が生成されます。

f:id:takezoe:20170615134138p:plain

続いてxsのところでCTRL+ALT+Cを押します。すると引数のパターンマッチに分解されます。

f:id:takezoe:20170615134149p:plain

?my_vect_map_rhs_1などとなっている部分は「ホール」と呼ばれるもので、Scalaでいうと???に近いものです。ひとまずこれで型チェックを通し、あとから実装を当てはめていくことができます。ホールの部分でCTRL+ALT+Sを押すと型情報から推測が可能な実装が生成されます。

f:id:takezoe:20170615134206p:plain

残ったホールでもう一度CTRL+ALT+Sを押します。

f:id:takezoe:20170615134219p:plain

なんということでしょう!関数の型を定義したあとは、ショートカットを押していくだけでmy_vect_map関数が完成してしまいました!

f:id:takezoe:20170615134237p:plain

もちろんこれは非常に簡単な例ですが、型駆動開発の片鱗は感じ取ることができるのではないでしょうか。静的な型付けのプログラミング言語コンパイル時の型チェックなど安全性が強調されることが多いですが、型駆動開発は型の力をよりアグレッシブに活用する開発スタイルといえるでしょう。

読書会の完走まではまだまだ長い道のりですが、型駆動開発の奥義を会得するべく日々修業を続けていきたいと思います。

Scalatra 2.5.1をリリースしました

Scala用のSinatraライクなWebフレームワークScalatraの最新バージョン2.5.1をリリースしました。

github.com

今回は主に2.5.0で入ったSwagger 2.0サポートの改善やバグ修正がメインとなっています。特に@jb08氏には多くのフィードバックをいただきました。ありがとうございます。修正内容の一覧は以下になります。

http://scalatra.org/2017/06/01/2017-06-01-scalatra-2-5-1-released.html

ScalatraはGitBucketで使っている関係上、メンテをしていかざるを得ないのですが、次は2.6.0で機能の整理・統廃合を行い、3.0.0で足回りのモジュール化(Servlet / http4sなどを選択可能に)をやりたいと思っています。

アクティブなコミッタが死滅してしまったのでここ半年ほど1人で細々とメンテしていたのですが、最近新コミッタとして@magnolia-kさんのリクルーティングに成功したので頑張っていきたいと思います。

GitBucket 4.13をリリースしました

Scalaで実装されたオープンソースのGitサーバ、GitBucket 4.13をリリースしました。

https://github.com/takezoe/gitbucket/releases/tag/4.13

ローカルファイルのリポジトリへのアップロード

ローカルのファイルをリポジトリにドラッグ&ドロップでアップロードできるようになりました。

f:id:takezoe:20170527033557p:plain

f:id:takezoe:20170527033611p:plain

Markdown中にHTMLを記述可能に

GitBucketが使用しているJavaベースのMarkdownパーサ、markedjが最新版でホワイトリスト形式でHTMLタグのレンダリングをサポートしました。そのためGitBucketでも一部のHTMLタグのレンダリングが可能になりました。

f:id:takezoe:20170527033628p:plain

f:id:takezoe:20170527033638p:plain

ドロップダウンメニューのフィルタ

これまでは一部のドロップダウンメニューで利用可能だったフィルタボックスがほとんどのドロップダウンメニューで利用できるようになりました。

f:id:takezoe:20170527033652p:plain

今回のバージョンではこの他にも様々な改善やバグフィックスを行っています。詳細についてはIssueの一覧をご覧ください。

Scala福岡 2017に参加します

f:id:takezoe:20170527103119p:plain

7月29日(土)に福岡のヌーラボさん本社オフィスで開催されるScala福岡 2017に参加させていただくことになりました。

scala.connpass.com

セッションでは最近コミッタになったApache PredictionIOについてお話しさせていただきたいと思います。概要は以下の通りですが、この他にもApache Software Foundationでの開発の様子なども紹介できればと思っています。

Apache PredictionIOはSparkやMLlib、HDFS、Elasticsearchなど、注目を集めるオープンソースをベースとした機械学習サーバで、機械学習を活用したアプリケーションの開発・運用を統合的にサポートするプラットフォームを提供します。開発者は様々な機械学習の手法をテンプレートに記述するだけでSparkをベースにした学習タスクの分散処理が可能になります。本セッションでは機械学習のインフラデザインとしても参考になるPredictionIOのアーキテクチャや実践導入のなかでのノウハウ、さらには今後の開発計画について紹介したいと思います。

セッションでは私の他にも@kmizuさんや@daiksyさんもお話しされるようですし、Akka Streamsのハンズオンなどもあるようです。まだまだ参加枠余っているようなので、当日お時間のある方は是非参加登録いただければと思います!!

Type-Driven Development with Idrisの読書会をやっています

社内で4月から週一でType-Driven Development with Idrisの読書会をやっています。

Type-Driven Development with Idris

Type-Driven Development with Idris

今年のScalaMatsuriで@cbirchallさんにオススメされたのがキッカケなのですが、依存型(Dependent Type)を使って変態的なことがいろいろできるという話を聞いて面白そうということで有志(いまのところ6人くらい)で集まって緩く読み進めています。

ようやく2章の中盤に差し掛かったところなのでまだ先は長そうですが、1章でIdrisの概要をウォークスルーしたのでIdrisの思想やIdrisでのプログラミングのお作法のようなものが大体わかってきました。いまのところ言語として特徴的な機能だなと感じたのは以下の2点です。

  • 依存型では型に値を持たせることができ、型同士の演算が可能
    • たとえばString型の要素を2つ持つVec 2 StringとString型の要素を3つ持つVec 3 Stringを結合するとVec 5 Stringになる
  • ホール(hole)というScala???に似た機能があり、型だけ書いて実装を省略した状態でコンパイルを通すことができる
    • コンパイラが残っているホールを検出してくれるので、先に型だけ書いて後からホールを埋めていくというプログラミングが可能

数値型にもIntIntegerBigDecimal的なもの)に加えて正の整数を表すNatがあり、配列の添え字などにはNatを使うというあたりもなるほどと思いました。

このような強力な型の表現力を活かしてより最適な型にリファインを繰り返しながらプログラミングしていくのがType-Driven Developmentのスタイルのようです。まだ、コードを見てもなかなかしっくり来ませんが、後半の章はATMをモデリングしてみるというケーススタディ的な内容になっているようなのでなんとかそこまでたどり着きたいと思います。

ちなみに社内では入門OCamlの読書会も行われているようです。

入門OCaml ~プログラミング基礎と実践理解~

入門OCaml ~プログラミング基礎と実践理解~

さて、どちらが先に完走できるでしょうか。

PredictionIOで使用するSpark等のバージョンを変更する

PredictionIOはデフォルトでは以下のバージョンを使用します。

  • Scala 2.10.6
  • Spark 1.6.3
  • Hadoop 2.6.5
  • Elasticsearch 1.7.6

Scalaのバージョンはともかく、Spark(ストレージにElasticsearchを使用する場合はElasticsearchも)のバージョンがかなり古いのが気になるところですが、ソースからのインストール時に以下のようにオプションで使用するバージョンを指定できるようになっています。

$ ./make-distribution.sh -Dscala.version=2.11.8 -Dspark.version=2.1.0 -Delasticsearch.version=5.3.0

指定できるのは以下のプロパティです。

  • scala.version
  • akka.version
  • spark.version
  • hadoop.version
  • elasticsearch.version

サポートしているバージョンはドキュメントには以下のように書かれているのですが、厳密にどのバージョンをサポートしているかは明記されていません。

  • Scala 2.10.x, 2.11.x
  • Spark 1.6.x, 2.x
  • Hadoop 2.4.x to 2.7.x
  • Elasticsearch 1.x, 5.x

参考までに、現在Travisでの自動テストは以下のパターンで実行されています。

Scala Spark Akka Hadoop Elasticsearch
2.10.6 1.6.3 2.3.15 2.6.5 1.7.3
2.10.6 1.6.3 2.3.15 2.6.5 5.2.2
2.11.8 2.1.0 2.4.17 2.7.3 1.7.3
2.11.8 2.1.0 2.4.17 2.7.3 5.2.2

PredictionIOは後方互換性を非常に重視しているためこのような感じになっていますが、さすがにデフォルトはScala 2.11.x、Spark 2.x、Elasticsearch 5.xでよいのではという気がしますね…。