RestyというScala用のREST APIフレームワークを作ってみました

GitHubリポジトリはこちら。

github.com

なぜ作ったのか?

Scala業界のフレームワークは関数型的なアプローチのものが主流になっています。これらのフレームワークはノンブロッキングI/Oや並列処理をうまく扱うことができますが、本質的な複雑さをもたらします。自分の経験では、特に企業システムなどの場合は従来の同期サーブレットでも十分というケースも多いのではないかと感じています。

また、既存のScala用のフレームワークはタイプセーフなDSLでルーティングや入出力パラメータなどを定義するものが多いのですが、この手のものはシンプルな静的解析でメタ情報を抽出することが難しいためSwaggerなどの外部ツールとの相性が悪いという欠点もあります。

Restyはこのようなケースにおいてもプログラミング言語としてのScalaのアドバンテージを活かすことのできるシンプルなフレームワークがあるといいのではということで作ってみたものです。

使ってみよう

以下のコマンドを実行することでサンプルプロジェクトを実行することができます。

$ git clone https://github.com/takezoe/resty-sample.git
$ cd resty-sample/
$ sbt ~jetty:start

Swagger UIもデフォルトで組み込まれているのでhttp://localhost:8080/swagger-ui/にアクセスすることでサンプルプロジェクトで実装されているAPIの動作を確認することができます。

それでは実際のソースコードも簡単に見ていきましょう。以下は最もシンプルなコントローラの実装例です。

class HelloController {
  @Action(method = "GET", path = "/hello/{name}")
  def hello(name: String): Message = {
    Message(s"Hello ${name}!")
  }
}

case class Message(message: String)

APIのエンドポイントになるメソッドには@Actionというアノテーションを付与する必要があります。メソッドの引数はパスやクエリ文字列、オブジェクトの場合はリクエストボディとして送信されたJSONからRestyによって自動的に渡されます。また、戻り値も型に応じて自動的にテキストやJSONとして返却されます。

コントローラをRestyに登録するために以下のようなリスナも作成しておく必要があります。

@WebListener
class InitializeListener extends ServletContextListener {
  override def contextDestroyed(e: ServletContextEvent): Unit = {
  }
  override def contextInitialized(e: ServletContextEvent): Unit = {
    Resty.register(new HelloController())
  }
}

基本的にはこれだけでWeb APIを実装することができます。

SwaggerとHystrix

Restyでは何もしなくてもSwagger、Hystrixとの連携が可能です。追加で設定を行なったり、メタデータを定義したりする必要はありません。

まずSwaggerですが、SwaggerのJSONはコントローラから自動的に生成され、http://localhost:8080/swagger.jsonで公開されます。また、前述のようにSwagger UIはhttp://localhost:8080/swagger-ui/で利用可能です。

f:id:takezoe:20161128005405p:plain

Hystrixのメトリクスはアクションごとに送信されています。ストリームのエンドポイントはhttp://localhost:8080/hystrix.streamで利用可能なのでHystrixのダッシュボードにこのURLを追加すればすぐにモニタリングを開始することができます。

f:id:takezoe:20161128005416p:plain

まとめ

RestyはScalaJSONベースのWeb APIを作成するための最短の方法を提供します。サーブレット上で動作し、関数型アプローチを採っていません。昨今のScala業界のトレンドに反してはいますが、とても簡単でシンプルで安定しており安全です。また、全自動のSwaggerとHystrix連携が標準で組み込まれています。

是非GitHubリポジトリにアクセスして試してみていただければと思います。

【改訂新版】Gitポケットリファレンス

技術評論社さんのポケットリファレンスシリーズから出ているGitポケットリファレンンスが改訂されるとのことで見本誌を送っていただきました。ありがとうございます。

【改訂新版】Gitポケットリファレンス

【改訂新版】Gitポケットリファレンス

なんと社内に設置可能なGitサーバとしてGitLabと並んでGitBucketを紹介していただいています。ありがたや…。ちなみに「GitBucketはGitLabのような細かいアクセス制御ができない」とありますが、先日リリースした4.7ではGitHubやGitLabと同等以上のアクセス制御が可能になっています。

肝心の内容ですが、単なるコマンドリファレンスに留まらず、Gitの内部構造、実践的なノウハウや最新の情報もカバーするなど、コマンドを覚えて使えるようになるためのリファレンスではなく、きちんとGitを理解して欲しいという意図を感じます。これからGitを始めてみようという初心者だけでなく、すでにGitを使っているけどいまいち使いこなせていない、きちんと理解しているか不安があるという方にもオススメできるリファレンスです。

自分は普段Gitの操作はGUIクライアントを使うことが多いのですが、せっかくなのでこれを機会にしばらくコマンドライン修行をしてみようかと思いますw

GitBucket 4.7をリリースしました

4.7にはログイン時のダッシュボードのサイドバーに表示されるリポジトリ一覧にグループリポジトリが含まれないというバグがあったため修正した4.7.1をリリース済みです。こちらをご利用いただければと思います。

https://github.com/gitbucket/gitbucket/releases/tag/4.7.1

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

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

新しい権限管理システム

これまでGitBucketではかなり大雑把な権限管理しかできなかったのですが、このバージョンでより詳細かつ柔軟性の高い新たな権限管理を行うことができるようになりました。

f:id:takezoe:20161126132805p:plain

ユーザやグループ毎にGuest、Developer、Administrationのいずれかの権限を指定できるようになったほか、グループリポジトリに対して個人ユーザやほかのグループをコラボレータとして追加したり、個人リポジトリにグループをコラボレータとして追加することもできます。

また、イシューやWikiの作成や編集をどの権限のユーザに対して許可するかも別途設定することができます。

f:id:takezoe:20161126132817p:plain

ドロップダウンにフィルターを追加

イシューのラベルや担当者を選択するドロップダウンリストに絞り込み用のテキストフィールドを追加しました。

f:id:takezoe:20161119161921p:plain

サイドバーの開閉状態の維持

ヘッダーのハンバーガーボタンでサイドバーを開閉できますが、同一セッション中は画面遷移しても開閉状態が維持されるようになりました。

f:id:takezoe:20161119233137p:plain

イシューのマイルストーンからのリンク

イシューに表示されているマイルストーンからそのマイルストーンに紐付けられているイシューの一覧にリンクするようになりました。

f:id:takezoe:20161126135727p:plain

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

ソフトウェアデザイン2016年12月号

会社の同僚であり、若者であり、エモジニアである@todokr文字コード特集の記事を執筆したとのことでゲットしてみました。

第2特集ということではありますが、文字コードの基礎からHTML、JavaRubyMySQLでの文字コードの扱いについて解説されています(RubyMySQLについてはとみたまさひろさんが執筆されています)。

最近はWeb開発に携わっていても文字化けなどに悩まされることは減ってきたような気がしますが、インターネット上にはまだまだShift_JISEUC-JPといった文字コードを使用しているサイトも多数存在しますし、一方で絵文字の扱いといった新たなトピックも出てきています。そもそもWebとテキストは切っても切れない存在ですから、文字コードの基礎を押さえておくことはWebエンジニアにとって有益なことなのではないかと思います。

また、個人的には第1特集のNoSQLもさることながら、第3特集のITむかしばなしスペシャルが面白かったです。むかしといっても80年代〜90年代という、これを読んで懐かしくなるのはおそらくアラフォー以降の世代であろうという真の昔話です。この記事を現代の若者が読んで一体どのような感想を持つのだろうかというのはかなり気になるところなので是非若者に読んで欲しいという気持ちになりました。

紙媒体の雑誌を手に取ることは最近本当に少なくなりましたが、やはりオンラインの情報だけだと自分の興味ある分野しか見に行かなくなりがちです。専門分野外の情報のインプットのためにも、バリエーション豊かな記事が掲載されており気軽に読むことのできる雑誌はいいものだと改めて感じました。

Scala 2.12に対応したScalatra 2.5がリリースされました

ここしばらく作業をしていたScalatra 2.5が先日無事リリースされました。

リリースノートは以下になります。

http://scalatra.org/2016/11/21/scalatra-2-5-released.html

今回のリリースはScala 2.12への対応とSwagger 2.0のサポートが大きなトピックになります。どちらも作業は自分がメインで進めさせていただきました。

Scala 2.12対応はScalatraが対応しないとGitBucketも上げられないという理由があったので積極的に取り組んだのですが、最終的には吉田さんや瀬良さんにいろいろ直していただきました。ありがとうございました。自分のScalatraでの活動は2014年のScala 2.11対応まで遡りますが、瀬良さんは継続的に活動されていますし、リリースのオペレーションなどでも貢献されていて凄いなぁと思います。

さて、Scalatraも気づけば2000スターを超えていますし、本も出ているのですが、その割には今いちメジャー感がないですね。なんでかわかりませんが…。

Scalatra in Action

Scalatra in Action

世間ではノンブロッキングだリアクティブだと言われていますが、実際のところServletで十分というケースも多いのではないでしょうか。また、運用のこなれたアプリケーションサーバを使いたいという要望もあるかもしれません。そういったケースであれば使い慣れたミドルウェアアーキテクチャの上で、言語としてのScalaの良さを活かすことができるScalatraは有力な選択肢になるのではないかと思います。

今後についてですが、Scalatraは開発リソースが貧弱な割にオプション的なモジュールが多くサポートやメンテナンスがきついので、Scalatra 2.6(もしくは3.0?)では重要度の低そうなモジュールの切り離しを進めていけるといいかなと思っています。

同僚が「それゆけ!ターミナル部」という連載を始めました

会社の同僚である@tanacasinoマイナビさんのギークロイドというメディアで「それゆけ!ターミナル部」という連載を始めました。

若干老害の入ったマーティン・シェルスキー先生が若干意識高めの若者タミ夫くんにターミナルのテクニックを教えていくというものです。隔週連載の予定とのことで、すでに第三回まで公開されています。

mynavi-agent.jp

mynavi-agent.jp

mynavi-agent.jp

最初は環境構築など基礎的なところからのスタートでしたが、第三回はシェルの展開など実用的な内容になってきています。自分もターミナル力低めなのでこれを読んで精進したいと思います。

続・AtomでMarkdownのアウトラインを表示する

以前こんな記事を書いたのですが…

takezoe.hatenablog.com

最近document-outlineというパッケージを発見しました。

atom.io

こちらはMarkdownの見出しをツリー状に階層化して表示してくれます。これこそ正に私の求めていたもの!!

f:id:takezoe:20161120124016p:plain

…と思ったのですが、どうやら行頭を#で開始していないと見出しだと認識してくれないようです。つまりこういうMarkdownだとダメ。

見出し1
========

見出し2
--------

まあ最初から気をつけて書いていれば問題ないかな。長文を書いているときは全体を見渡すためにアウトラインが欲しくなるのでこれを活用していきたいです。