第十八回 #渋谷java を開催しました

1月28日(土)に弊社オフィスで第十八回 #渋谷javaを開催しました。

f:id:takezoe:20170128224509j:plain

おや、なにか様子がおかしいですね…。謎のマークが…。

今回は以下の皆さんに発表していただきました。

  • セッション枠(20分)
    • ayato_p 「筋肉でテストを救う」
    • Ikuru K 「サムネイルを作る話」
  • 通常枠(10分)
    • lagénorhynque 「JavaからClojureへ」
    • Naoki Takezoe 「ZipkinとBraveでマイクロサービスの呼び出しを可視化してみよう」
    • Shunsuke Tadokoro 「Clojureに入門してHTTPサーバーを作ってみた」
    • shimamoto 「doobie0.4.0のdynamic SQLを試してみる」
    • ayato_p 「alter-var-rootをいつ使うべきか」

当日の様子や皆さんの発表内容については以下のtogetterまとめをご覧いただければと思います。

togetter.com

特に狙ったわけではないのですが、なんと7本のLTのうち5本がClojureのトーク、気づけば真面目にJavaの発表をしたのは自分だけという驚愕の事態でした。*1

ayato_pさんには毎回Clojureの実用的なお話をしていただいていますが、今回はlagénorhynqueさんのLisp / Clojureの入門的な発表や若者であるShunsuke TadokoroさんのClojureでHTTPサーバーを作ってみたという発表もあり、大変教育的な勉強会になったのではないかと思います。

これはScala勢としては次回はScalaの発表をしたいところですが、うっかり油断すると #渋谷java なのにJavaの発表が1つもない勉強会になってしまうので、次回に備えてJavaネタを温めておきたいと思います。

*1:最後のayato_pさんはLT枠に空きがあったので急遽発表していただけることになりました。

GitBucket 4.9をリリースしました

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

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

GitLFSサポート

GitLFSの実験的サポートを追加しました。この機能を使用するためにはGitBucketの設定画面でBase URLを適切に設定しておく必要があります。

f:id:takezoe:20170128105158p:plain

これだけでGitLFSが利用可能になります。GitLFSで管理されているファイルは GITBUCKET_HOME/repositories/<user>/<repository>/lfs 配下に格納され、リポジトリビューアでは以下のようにファイルの詳細画面にLFSラベルが表示されるようになります。

f:id:takezoe:20170128105206p:plain

将来的にはラージファイルの保存先としてローカルファイルシステムだけでなくクラウドストレージや分散ファイルシステムなどにも対応したいと考えています。

イシューとプルリクエストのテンプレート

リポジトリのルートディレクトリもしくは.gitbucketディレクトリにISSUE_TEMPLATEISSUE_TEMPLATE.mdISSUE_TEMPLATE.markdownなどの名前でファイルを作成しておくとイシューやプルリクエストの新規登録フォームの初期値として表示されるようになりました。

f:id:takezoe:20170129122639p:plain

イシューやプルリクエストの雛型や、注意事項などを記述しておくのに利用できるのではないかと思います。

ラベルの色をカラーコードで指定可能に

イシューやプルリクエストのラベルの色はこれまでカラーピッカーで選択することができましたが、カラーコードを直接入力することもできるようになりました。

f:id:takezoe:20170128105230p:plain

アカウントの説明を入力可能に

アカウントの説明を入力できるようになりました(個人アカウントの場合はBio、グループアカウントの場合はDescriptionというフィールドに入力できます)。入力した内容はアカウントの詳細画面に表示されます。

f:id:takezoe:20170128105239p:plain

スタンドアロンモードに–temp_dirオプションを追加

組み込みJettyでのスタンドアロンモードでの起動時に指定可能なオプションとして--temp_dirを追加しました。

これは組み込みJettyがgitbucket.warを展開するディレクトリを指定するためのものです。デフォルトでは GITBUCKET_HOME/tmp に展開されますが、都合が悪い場合はこのオプションで任意のディレクトリに展開するよう指定することができます。

イシュー関連のWeb APIの追加

新しく以下のWeb APIが追加されました。

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

第十八回 #渋谷java でZipkinとBraveの紹介をしました

最近RestyにBraveを組み込んだり、仕事でもZipkinを触っていたりするのでZipkinとBraveの概要について発表させていただきました。発表資料はこちらです。

www.slideshare.net

ZipkinはTwitter社が開発した分散トレーシングシステムで、特に多階層のマイクロサービスのボトルネックの解析に有用なツールです。BraveはJavaベースのWebアプリケーションからZipkinサーバにトレース情報を送信するためのライブラリです。

github.com

github.com

Braveは前のサービスからHTTPヘッダで渡されたトレース情報をServletFilterでThreadLocalに突っ込み、それをHTTPクライアントライブラリのInterceptorで次のサービス呼び出しのHTTPヘッダに付け加えるという感じの仕組みになっています。そのため次のサービスの呼び出しが別スレッドで行われているとトレース情報の紐付けができないという点に注意が必要です(以前Hystrixと組み合わせた時に少しハマりました)。

また、標準のZipkinサーバの代わりにGoogleオープンソースとして公開しているstackdriver-zipkinを使うとGoogle Cloud PlatformのStackdriver Traceというモニタリングサービスにトレース情報を送信することができます。実際に運用で試したことはないのですが、これを使うと自前でZipkinサーバを運用する必要がなくなりますし、一定量であれば無料で利用することができるので便利かもしれません。

github.com

Zipkinは各種言語向けのクライアントライブラリも揃っていますし、このように外部のモニタリングサービスでもZipkinがサポートされることで、Zipkinが独自のツールとしてだけでなく、仕様としてもある種標準的な位置付けになっていく可能性があるのではないでしょうか。

今回の発表にあたり、JavaサーブレットにBraveを組み込んでZipkinでトレース情報を参照するためのミニマムなサンプルプロジェクトを以下のGitHubリポジトリで公開していますので興味のある方は是非実際に動かしてみていただければと思います。

github.com

pac4jでGitHubのOAuth認証を使ってみる

GitHubアカウントでログインできるWebアプリケーションを作りたいなーと思っていたのですが、Javaだとpac4jというライブラリを使うとGitHubを始め、TwitterFacebookなど様々なサービスのOAuth認証を扱うことができるようです。

github.com

SpringMVCやJAX-RSなどのフレームワークとの連携機能も提供されているようですが、今回は基本的な使い方を把握するためにpac4j-oauthというモジュールを使ってサーブレットベースで試してみました。

まずはGitHub上でアプリケーションの登録を行う必要があります。

f:id:takezoe:20170128020846p:plain

続いてプログラムの実装に移ります。pom.xmlに以下の依存関係を追加します。

<dependency>
    <groupId>org.pac4j</groupId>
    <artifactId>pac4j-oauth</artifactId>
    <version>1.9.5</version>
</dependency>

プログラムでは以下のようにしてGitHubClientを生成します。シングルトンなインスタンスとして生成しておくとよいと思います。コンストラクタの引数にはGitHubへのアプリケーション登録時に発行されたクライアントIDとクライアントシークレットを指定します。

GitHubClient client = new GitHubClient(clientId, secret);
client.setCallbackUrl("http://localhost:8080/callback");
client.setScope("repo, user");

コールバックURLは認証後にリダイレクトされるURL、スコープはアプリケーションが必要とする権限を指定します。GitHubで指定可能なスコープについてはこちらを参照してください(デフォルトはuserです)。

認証を要求するには以下のようにします。redirect()メソッドでGitHubの認証ページにリダイレクトされます。J2EContextというのはJavaEEサーブレット)用のアダプタみたいなものです。このクラスを差し替えることで別のフレームワークにも対応できる作りになっています。

J2EContext context = new J2EContext(request, response);
client.redirect(context);

f:id:takezoe:20170128021422p:plain

ユーザがこの画面でアプリケーションの認証要求を許可すると指定したコールバックURLにリダイレクトされるので、該当のURLを処理するサーブレットで以下のようなコードで認証情報を取得します。

J2EContext context = new J2EContext(request, response);
OAuthCredentials credentials = client.getCredentials(context);
GitHubProfile profile = client.getUserProfile(credentials, context);

profileからユーザ情報やAPI呼び出し用のアクセストークンなどを取得することができます。

String userName = profile.getUsername();
String email = profile.getEmail();
String accessToken = profile.getAccessToken();

こんな感じでpac4jを使うと簡単にGitHubOAuth認証を利用することができます。他のサービスの場合もGitHubClientの代わりにTwitterClientFacebookClientなどのクラスを使用するだけで同じような感じで実装することができます。また、OAuth以外にも様々な認証方式に対応したモジュールが提供されています。

特定のフレームワーク用のアドオンとしてだけではなく単独のライブラリとしても使えるようになっているのでJavaで外部サービスのアカウントを使用した認証機能が必要な場合は覚えておくといいんじゃないかと思います。

Apache DrillでExcelを検索するプラグインを作った

ExcelをDBに入っているデータとジョインできたら便利なのでは?ということで作ってみました。

github.com

GitHubリリースページからダウンロードしたjarファイルをDRILL_HOME/jars/3rdpartyにコピーし、ストレージ設定でdfsに以下のフォーマットの設定を追加します。

  "formats": {
    "excel": {
      "type": "excel",
      "extensions": [
        "xlsx"
      ]
    },
    ...
  }

するとDrillで*.xlsxファイルをSQLで検索できる様になります。もちろんDrillでアクセス可能な他のデータソース上のテーブルとジョインすることもできます。

0: jdbc:drill:zk=local> SELECT id, name FROM dfs.`/tmp/emp.xlsx` where age > 35.0;
+----------+----------------+
|    id    |      name      |
+----------+----------------+
| takezoe  | Naoki Takezoe  |
+----------+----------------+
1 row selected (3.118 seconds)

本当はシートをテーブルとして扱うようにしたかったのですが、Drillのdfsは1ファイルを1テーブルとして扱うためこのプラグインでは1シート目のデータしか使うことができません。また、カラム名として使用するためヘッダ行を入れておく必要があるという制約があります。まあネタで作ったようなものなのでこれらの点については目を瞑っていただけると幸いですw

以前LTSV用のプラグインも作ったのですが、Drillはこの手のプラグインは本当に簡単に実装することができますね。

takezoe.hatenablog.com

スターティングGo言語

先日紹介したみんなのGo言語電子書籍で購入したのですが、こちらはリファレンス用にペーパー版を購入しました。

スターティングGo言語

スターティングGo言語

言語仕様はきっちり押さえられていますし、言語機能を実際にどのような用途に使うべきかという説明や、落とし穴などについても触れられています。ツールや標準ライブラリの紹介もあるのでGo初心者は一度目を通しておくとよさそうです。

一方で実戦でどういうコードを書けばよいのかがわからない部分がありました。たとえばエラー処理の仕方は書いてあるのですが、実際にどのようなエラー処理を行うべきかわからない、みたいな感じです。もちろん適切なエラー処理はアプリケーションによって異なるので一概に言えないとは思いますが、たとえばCLIを題材にエラー処理の実例が紹介されていたりするとよかったのではないかと思いました。

ただ、こういう部分は「みんなのGo言語」に実践的な内容が書かれているので両方読むと良い補完関係になると言えるかもしれません。とりあえずこの2冊とネット上の情報があればGoでコードを書いていく上で困ることはそんなになさそうな気配です。

JaSST'16 Tokyoでのパネルディスカッションを記事にしていただきました

だいぶ前の話になってしまうのですが、昨年JaSST'16 Tokyoで参加させていただいたOSSの品質管理に関するパネルディスカッションの内容をPublickeyさんで記事にしていただきました。

www.publickey1.jp

power-assertの@t_wadaさんのモデレートで、Twitter4Jの@yusukeさん、Asakusa Frameworkの@apirakunさんと私の4名でお話しさせていただいたのですが、リソースが不足しがちな小規模OSSで品質を担保するには多くのユーザに使ってもらう必要があるという点は共通していたように思います。会場からの質問も含め、自分自身も参考になることが多く非常に楽しいディスカッションでした。

今回はGitBucketの立場でお話しさせていただいたのですが、Apache Software Foundationでの活動や、Webアプリケーションを開発していると避けられないセキュリティ関連の話でもいろいろと思うところがあるので、そういった話もまたどこかでできるといいなと思います。