myGengoハッカソンに行って来た

Node日本ユーザグループのMLにて、myGengoさん主催のハッカソンがある、と@さんから紹介いただいたので行って来た。
Gengo - Professional Translation Services by Gengo
全然知らない人だらけのアウェー感満載の状態ながら、キレイでオープンなオフィスで楽しくハッカソンできました。
午前中は参加者の自己紹介とmyGengo, そのAPIやライブラリの説明。そしてこれを使ってどんなサービスを作るのが良さそうか?とブレインストーミング
立食ランチした後、グループ分けて夕方の発表まで開発タイム。最後に成果発表会をして 懇親会して解散、という一日。
社員の多くは外国人の開発者で、日本語喋れる人もいればほぼ英語だけの人もいたりで、英語と日本語飛び交う面白い空間でした。
自分も拙い英語で頑張ってコミュニケーションしましたよ…!

myGengo

myGengoは人力翻訳サービスで、依頼者は基本的にお金を払って翻訳を依頼し テストをパスしているプロの翻訳者がそれを翻訳して返す、という仕組み。そういった依頼と翻訳を仲介するサービスで そのためのAPIも提供されている。
Gengo - Professional Translation Services by Gengo
各アカウントで使用できるポイントの管理や、翻訳の依頼申し込み、依頼した翻訳案件の状態確認やプレビュー、結果の取得など、web上で行う手続きのほぼすべてを網羅している。
ライブラリも豊富に用意されていて、各プログラミング言語から簡単にAPIを利用することができるようになっている。
Gengo - Professional Translation Services by Gengo

作ったもの

翻訳されてると便利なの何かないかなー?と考えてて思いついたのが、How people build software · GitHubの各プロダクトのReadme。大抵はそんなに難しくなく読めるものの、やっぱり理解するのに時間かかってしまっていたりしたので、メジャーなもの(皆が訳ほしいと思うもの)は日本語や各国言語に訳して 閲覧出来るようになっていればなぁ、と。ちょうどGithubのAPIもあるのは知っていてもほとんど使ったことなくて触ってみたかったので。

というイメージで作ってみることに。ハッカソン用にsandbox環境とテストアカウントなどは用意していただいていたので、有料のポイントなどをどう用意するか、などといったことはとりあえず考えず。

@さんに賛同していただいたのでデザインを主にお願いし、自分がサーバ側のアプリケーションを書くことに。他のメンバーの2人は一緒に確認してもらいながら仕様の相談などアドバイザとしてついていただく形に。
machidaさんはRubyをメインで使っていて僕はPerlかNodeくらいしか出来なくて、どうしましょうか、という感じだったけど、Node興味あるということだったのでNodeでやってみることに。nvm, npmで環境構築するところから始めたけどすんなりインストールして動かせるようになっていた。gitが分かっている人だとすごく話が早い。Express - Node.js web application frameworkで雛形を作ってJadeのテンプレートファイルを弄っていただく形に。hamlと近い形で書きやすかったらしい。どちらも使ったことないから分からないけど…。
即席でGithubリポジトリ作って共同作業を進めた。
https://github.com/sugyan/myGengohub


まずはgithub API。npmにそれ用のライブラリがあったので使ってみた。

var GitHubApi = require('github').GitHubApi;
var github = new GitHubApi(true);

(function (user, repo, callback) {
    github.getCommitApi().getBranchCommits(user, repo, 'master', function (err, data) {
        if (err) {
            throw err;
        }
        if (data.length > 0) {
            var sha = data[0].tree;
            github.getObjectApi().showTree(user, repo, sha, function (err, data) {
                if (err) {
                    throw err;
                }
                var i;
                for (i = data.length; i--;) {
                    if (data[i].name.match(/README/i)) {
                        github.getObjectApi().getRawData(user, repo, data[i].sha, callback);
                    }
                }
            });
        }
    });
}('sugyan', 'live-coder', function (err, data) {
    if (err) {
        throw err;
    }
    console.log(data);
}));

こんな感じで書くと、指定したユーザ名、リポジトリ名のところからReadmeっぽいファイルの中身を取り出すことができる。

$ node github_api.js
get:  post
send GET request: /api/v2/json/commits/list/sugyan/live-coder/master
get:  post
send GET request: /api/v2/json/tree/show/sugyan/live-coder/e4f5681aa19e1399d55d911758e56036ec1bcc22
This is web-based "live coding" application using node.js.
...

実際には

  1. まず指定レポジトリのmasterのcommit Objectを取得して
  2. その時点でのtree Objectを取得
  3. その中を舐めていってファイル名がReadmeにマッチするものを抽出

と、3回APIを叩くことになる。若干アレですね。


で、myGengo APIの方にはmyGengoの方で用意されているmygengo_nodeを使用。
GitHub - gengo/mygengo_node: A wrapper for the myGengo API written in node.js

var mygengo = require('./deps/mygengo_node');
var config = require('./config');
mygengo.init(config.public, config.private);

のような形で公開鍵、秘密鍵を引数にinitしてやれば

var data = {
    job: {
        type: "text",
        slug: user + '/' + repo,
        body_src: readme,
        lc_src: 'en',
        lc_tgt: 'ja',
        tier: 'machine'
    },
    as_group: 0
};
mygengo.postJob(data, function (err, data) { ... });

のような形でAPIを叩いて翻訳依頼を出せるようになる。


…と、こんなところまで調べつつ出来るようになって、案件idと翻訳結果などを結びつけるためにmongodbにデータを保存して、翻訳済みのものを表示するように、、というところで時間切れ。「こんな感じになります」という説明だけでデモらしいデモも出来なかった orz

感想など

その日に作るもののテーマ決めていきなり初めての人と一緒に何か作る、ってのはやっぱり難しいですねw
でも普段なかなかそんなことする機会ないのでとても新鮮で刺激的でした。 英語のコミュニケーションもそれなりに楽しめたし。
どちらかというと自由なテーマで作りたいもの作る、というSmiley Hackathon的なスタイルが好きだけど、たまにはこういうのも良いな、と思います。


myGengoさん、とても楽しいハッカソンに参加させていただきありがとうございました!