読者です 読者をやめる 読者になる 読者になる

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

Java Drill

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アプリケーションを開発していると避けられないセキュリティ関連の話でもいろいろと思うところがあるので、そういった話もまたどこかでできるといいなと思います。

みんなのGo言語[現場で使える実践テクニック]

書籍

簡単なコマンドラインツールはNode.jsやPython*1で書くことが多いのですが、ちょっと大きめのものだったり、他の人にも使ってもらうようなものはGoで作るのがいいのかなということでGoを触り始めました。インターネット上のドキュメントなどを参考に適当にコードを書いてみているのですが、なんとなく書けるようになってきたので以前から面白そうだなと思っていたこの本を読んでみました。*2

みんなのGo言語[現場で使える実践テクニック]

みんなのGo言語[現場で使える実践テクニック]

ちょっと勘違いしていたのですが、作りとしては書籍というよりはムックですね。冒頭に環境構築など初心者向けの記事もありますが、全体としてはすでにある程度Goに触っている人向けかなという感じです。ただ、「現場で使える実践テクニック」というサブタイトル通り、入門書などには載っていないツールやライブラリ、ベストプラクティスなど実践的なノウハウが満載されています。

個人的には第1章の環境周りとGoらしいコードの書き方、第2章のマルチプラットフォーム対応、第4章のコマンドラインツールあたりはすぐに参考になりそうですし、本格的にコードを書き始めたら第6章のテストに関する内容も役立ちそうです。3章の実践テクニックや5章のリフレクションについては実際に役立つのはもう少し上級者になってからかもしれませんが、興味深い内容で楽しく読むことができました。

完全な初心者には難しいかもしれませんが、Goを活用するためには目を通しておいて損はない一冊だと思います。

*1:AWSをいじる系はAWS SDKの都合とサーバ上で編集・実行しやすいという理由でPythonを使うことが多いです

*2:技評さんの直販サイトでPDF版を購入しました。

giter8テンプレートの作り方

Scala

giter8の復活

その昔、Scala世界にはgiter8というツールがありました。GitHub上のテンプレートプロジェクトをベースにプロジェクトを作成できるというなかなか便利なものでしたが、初期の頃はWindowsでの利用に問題があったり、Typesafe Activatorという用途がモロ被りするツールが登場したりするなどしたため、ここ数年はあまり積極的に利用されていませんでした。

時は流れて2016年、Scalaの標準的なビルドツールsbtの最新版である0.13.13でgiter8テンプレートのサポートが追加されました。sbtさえインストールしておけば、

$ sbt new scalatra/scatara-sbt.g8

のようにnewサブコマンドでgiter8テンプレートを使用してプロジェクトを作成できるようになったのです。これまでactivatorを使用してプロジェクトを作成することになっていたPlay Frameworkも今ではsbt newを使用するようになっています。

なお、現在はgiter8はオリジナルの開発者であるn8han氏からfoundweekendsというorganizationに引き継がれ開発が継続されています。オープンソースって本当に素晴らしいですね!

github.com

giter8テンプレートの作り方

ドキュメントを読めばだいたい分かると思いますので、ここでは要点だけ。

まずはgiter8テンプレートのためのテンプレートが用意されているので以下のようにしてプロジェクトを作成します。なお、giter8テンプレートのリポジトリ名は末尾が.g8になっている必要があるので注意しましょう。

$ sbt new foundweekends/giter8.g8

src/main/g8ディレクトリ以下にプロジェクトのテンプレートを配置していきます。重要なのがdefault.propertiesというファイルです。デフォルトでは以下のような内容になっています。

name=My Something Project
description=Say something about this template.

ここに定義したプロパティは各ファイルに以下のようにして埋め込むことができます。default.propertiesでデフォルト値を定義しますが、プロジェクトの作成時にユーザからの入力を受け付けることができ、入力された値で上書きされます。

organization := "$organization$"
name := "$name$"
version := "$version$"
scalaVersion := "$scala_version$"

いくつか特殊なプロパティがあります。これらはファイルに変数として埋め込むだけでなく、以下のように特殊な用途にも利用されます。

  • name: 作成されるプロジェクトのディレクトリ名としても使われます。
  • package: $package$という名前のディレクトリがあるとパッケージのディレクトリ構造に展開されます。

なお、テンプレートをsrc/main/g8ディレクトリに配置する方法とは別にルートディレクトリに直接配置するrootレイアウトという方法もあるのですが、まだ実験的な機能のようです。scalatra-scalajs.g8は試しにこのrootレイアウトで作ってみました。

テンプレートのエスケープとか

テンプレートプロジェクトを作成していると、ファイル中に含まれる$をエスケープしたいとか、ファイルごとテンプレートの対象外にしたいという場合があるかもしれません。$をエスケープというかそのまま出力するには以下のようにするのが簡単です。

$var -> $"$"$var

ファイルごとテンプレートの対象外にするにはdefault.propertiesにverbatimというプロパティを追加します。半角スペース区切りで対象外にするファイルのパターンを指定することができます。

verbatim=*.html *.js

他にもテンプレートに変数を埋め込む際に便利なフォーマッタなども用意されていますので細かい話についてはgiter8のドキュメントを見るのがよいです。

テンプレートのテスト

sbt newでは以下のようにローカルファイルのテンプレートを指定してプロジェクトを作成することができるのでこれでテンプレートが実際に動作するかをテストすることができます。

$ sbt new file:///path/to/dir/my-template.g8

また、Giter8Pluginの機能を使用して、プロジェクトの作成及びscriptted testを使ったテストができるようなので、可能であれば自動テストを作っておくとよさそうです。

まとめ

sbtで使えるようになったのでgiter8テンプレートを活用していきましょう。

GitHubでGitLFSを使ってみる

Git GitHub

実際にGitLFSを使ってみようということでGitHubで試してみました。

まずはgit-lfsのインストールから。gitはインストール済みとします。MacならHomebrewで簡単に入れられます。

$ brew install git-lfs

適当なGitリポジトリを作成し、GitLFSを有効にします。

$ mkdir git-lfs-test
$ cd git-lfs-test/
$ git init
$ git lfs install

GitLFSで管理するファイルを指定します。

$ git lfs track *.jpg

あとは普通にファイルをコミットしてpushすれば該当のファイルが自動的にGitLFSに保存されますし、git-lfsがインストールされている環境であればcloneしたりpullしたりすると自動的にローカルにもファイルの実体がダウンロードされてくるので普通にリポジトリにコミットしてるのと同じように使うことができます。

GitHub上では普通にファイルを表示することができますが、「Stored with Git LFS」と表示されるので区別が付きます。

f:id:takezoe:20170101015857p:plain

思ったより簡単に使うことができます。大きなファイルがある場合のリポジトリの肥大化は抑えることができそうですが、実際cloneやpullするときはLFSサーバからファイルを落としてくるのでクライアント側から見るとあまり変わらないような気も…。

2016年の振り返り

Life

2016年もそろそろ終わりということで、毎年恒例の振り返りです。

f:id:takezoe:20161112132609j:plain

仕事関係

自分の担当しているパートはだいぶ安定してきたこともあり、機能改善や効率化がメインでした。時間的な余裕もだいぶ出てきたのでイベント活動やOSS活動などにも時間を割けるようになってきました。

また、Scalaでサービスの開発を始めてから2年以上が経過し、チームも拡大していく中で新たな課題も見えてきました。来年はそういった部分にも取り組んでいくことになりそうですが、純粋に技術的な面以外の課題も多々感じており、いろいろと考えさせられるものがあります。

社内で毎週開催している勉強会も今年もどうにか1年間継続することができました。去年は外部のゲストの方に度々お越しいただいたのですが、今年は様々な事情によりゲスト講師のお越しいただく機会が少なかったのは残念なところです。

takezoe.hatenablog.com

takezoe.hatenablog.com

ただ、社内のメンバーにお願いして、フロントエンド周りやサーバレスアーキテクチャ、Firebaseといったキャッチーな話題、Shenandoah(Javaの新しいGC)といったマニアックな話題、さらには若者によるEmojicon(サンフランシスコで開催された絵文字に関するカンファレンス)の参加レポートなど様々な発表をしていただきました。

この週次の社内勉強会はなんだかんだで3年近く継続しているのですが、毎週企画を用意するのがかなりしんどかったり、社員の増加に伴って部署毎の事情や技術領域の分散が顕著になってきているため、フォーマットの見直しを考えています。

イベント関係

今年はたくさんのイベントに参加・登壇させていただきました。

まず、2月にはデブサミ2016にピクシブ川田さんのモデレートでメルカリ久保さん、DeNA(当時)古川さんとパネルディスカッションをさせていただきました。古川会長とは前年のCROSS 2015に続いてのパネルディスカッションでしたので不思議なご縁を感じます。

takezoe.hatenablog.com

2月にはScalaMatsuriとその直後にTISさんで開催された第二回Reactive System Meetup in 西新宿に参加しました。特にReactive System MeetupではSlick3について発表させていただきました。Akka開発者のKonradさんともお話させていただきScalaパズルをプレゼントさせていただきました。

takezoe.hatenablog.com

takezoe.hatenablog.com

5月にはニューヨークで開催されたScala Daysに今年も参加してきました(CFPも応募していたのですが残念ながら落選してしまいました)。海外のGitBucketユーザの方にお会いできたり、コップ本第三版の原著に小田好先生とビルさんのサインをいただいたりなど、楽しい一時を過ごすことができました。

takezoe.hatenablog.com

takezoe.hatenablog.com

takezoe.hatenablog.com

また、今年はScala関西Summitを会社としてスポンサーさせていただき、10月に大阪に行ってきました。翌日は京都のはてなさんを訪問しScala勉強会を開催させていただきました。

takezoe.hatenablog.com

takezoe.hatenablog.com

同じく10月には弊社の主催でULTRA Beer Bashというビアバッシュ形式の大型イベントを開催しました。私自身は登壇はしなかったのですが、テクニカルセッションのアレンジを担当させていただきました。急なお願いにも関わらずご協力いただいたスピーカーの皆様本当にありがとうございました。

takezoe.hatenablog.com

最後にいつもスポンサーさせていただいているJJUG CCCですが、12月に開催された2016 Fallでは個人としても登壇させていただき、GitBucketの紹介をさせていただきました。実は今回のJJUG CCC 2016 Fallではスポンサーセッションを含めると自分含め5人も弊社の社員が登壇していました。

takezoe.hatenablog.com

この他にもTokyo Apache Drill Meetupや市ヶ谷Geek★Night、渋谷javaでも何度か発表させていただいたりなど、振り返ってみると今年はかなりアクティブにイベントに参加していたのだなと自分でも驚くばかりです。

執筆活動

昨年から翻訳していたScalaパズルが今年の2月に発売になりましたが、それ以外はあまり書きませんでした。自分で書くよりも同僚に執筆してもらう企画屋みたいなことをやっていまして、若者たちに新卒研修の記事を書いてもらったり、vimmerの同僚にターミナルテクニックの連載を書いてもらったりしました。

codezine.jp

codezine.jp

mynavi-agent.jp

また、新しく書いている本があります。こちらは来年の前半には発売になるかと思います。ちなみにScalaの本ではありません。Scalaの本はアイデアはあるのですが、いろいろ厳しくて出すのはなかなか大変です…。

Akka in Actionの翻訳の話もあったりなかったりしたんですが、やりたかったなぁ…。

OSS活動

今年もGitBucketの月1回のリリースを継続することができましが、なんといっても大きかったのはユーザインターフェースの類似性についてGitHub社とのやり取りがあったことでした。

takezoe.hatenablog.com

GitBucketはプラグインでの拡張性がそこそこ実用レベルになってきましたし、最近は海外も含めそこそこ大規模かつ実務で使っているというユーザさんが増えてきたので、来年は兼ねてよりの課題であったスケーラビリティにも注力していきたいと思っています。

また、昨年から同僚と共同で構想を練っていたScala Warriorをようやく公開することができました。これはRuby Warriorにインスパイアされて開発したScala学習用のゲームで、Scala.jsを活用して作られています。正直プログラミングよりアニメーションを作るのが大変でした。

takezoe.hatenablog.com

年末にはふと思いついてRestyというScala用のREST APIフレームワークを作り始めてみました。Scalaはモナモナしたフレームワークやライブラリが多いですが、関数型プログラミングを覚えなくても便利に使えるScala用のWebフレームワークがあったらいいんじゃないか、ついでにマイクロサービスの開発・運用時の便利機能も標準搭載してできるだけ面倒な手間をかけずに使えるようにしよう、というものです。実験的なものなので趣味としてコツコツを手を入れていきたいと思います。

takezoe.hatenablog.com

外部のプロジェクトではScalatraのScala 2.12対応、Swagger 2.0対応をしました。これはGitBucketのScala 2.12対応に必要だったので積極的に取り組んだのですが、最終的には瀬良さんや吉田さんにもいろいろと面倒見ていただきました。ありがとうございました。

takezoe.hatenablog.com

また、GitBucketはいまだにSlick2を使っているのですが、これをScala 2.12に対応させるにはSlick3に移行せざるを得ないという状況になり、苦肉の策としてblocking-slickというライブラリを作りました。一瞬Slickのorganizationでメンテしてはどうかという話も出たのですが、Slickの唯一神ことZeigerさんに瞬殺されてしまいました。まあ、Slickはいろいろ問題が多すぎるし改善の気配もないので将来的には捨てざるを得ないですね…。

takezoe.hatenablog.com

総じて昨年と比べて多くのアウトプットを出せたのではないかと思いますが、今後は自分で作っているものだけでなく、外部のプロジェクトへのコントリビュートももっと増やしていけるといいなと考えています。

英語の勉強

今年は英語力を強化したいということで、OSS活動で読み書きをすることが多いのでまずは文法を基礎からやり直そうと思い、英文法の教科書として名高い「English Grammar in Use Book」を進めていました。

English Grammar in Use Book with Answers and Interactive eBook: Self-Study Reference and Practice Book for Intermediate Learners of English

English Grammar in Use Book with Answers and Interactive eBook: Self-Study Reference and Practice Book for Intermediate Learners of English

英語で書かれているのですが、読んでいてわかりやすいですし、実用的な単語や表現が自然に身につくように考えられており、評判の良い理由もわかります。ただ、自分の場合、復習する時間をあまり取れていないのできちんと身についているかどうかというと疑問ではあります。もう少し学習のための時間を確保したいところです。

また、並行して通勤時間を利用してEnglish as Second Language Podcastを聴くというのをずっとやっていました。リスニング教材としてだけでなく、内容としても面白いエピソードが多いので楽しいです。ただ、疲れてるときに聴くとマッハで眠くなるのが難点です。海外の方と話すときに一番困るのは相手が何を言ってるのかわからんということなので、リスニング力も鍛えなければと思います。

自分の感覚としても、日本で働いていても英語話者の方との接点は増えてきており、コミュニケーション手段としての英語の重要性をますます感じます。とりあえず今のところは明確な目標はないのですが、まずは学習を継続することを第一に頑張っていきたいと思います。

まとめ

今年は仕事が落ち着いてきたこともあり、比較的アクティブにいろんなことに時間を使うことができたのではないかと思います。ただ、社内勉強会や外部での発表が多く、スライド作成などの準備にかなり時間を使っていた感があるので来年はよりコードに向き合う時間を増やせるよう活動内容を調整していきたいと思っています。