Text::MicroTemplate(Perlのテンプレートエンジン)のシンタックスハイライトを作った話

はじめに

この記事はTech KAYAC Advent Calendar 2020の16日目の記事になります。

こんにちは。技術部の中山といいます。普段はぼくらの甲子園!ポケットチームでUnityとかGAS(Google Apps Script)を触ったりしています。

自分は使っていないのですが、チーム内でText::MicroTemplateというPerlのテンプレートエンジンが使われていて、「シンタックスハイライトがなくて書きにくい」みたいなことを言っている人がいたのでVSCodeのシンタックスハイライトを作りました。

VSCodeの拡張機能を検索する画面で「ext:mt」とか「MicroTemplate」とかで検索するか、 https://marketplace.visualstudio.com/items?itemName=quarter.vscode-microtemplate-syntax-highlight を開いて「Install」を押すとインストールできます。

f:id:nakayama-daisuke:20201215100926p:plain
こんな感じでハイライトされます。

コードはGitHubで公開しています。

techblog.kayac.com

以前こういう記事を書いたのですが、ここには書いていないことをいくつかやったので、この記事で紹介しようと思います。

作り方

次のような手順で作りました。

  1. ファイル全体にHTMLのハイライトの規則が適用されるようにする
  2. MicroTemplateの記法を見つけたらそこにPerlのハイライトの規則を適用する

以下で順番に説明していきます。

ファイル全体にHTMLのハイライトの規則が適用されるようにする

ターミナルで

npm i -g yo
npm i -g vsce
yo code

と入力して質問に答えるといろいろファイルが作られるのですが、その中の syntaxes/xxx.tmLanguage.json みたいな名前のファイルを開いて、 repository というキーを消して、 patterns

{
    "$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json",
    "name": "MicroTemplate",
    "patterns": [{
        "include": "text.html.derivative"
    }],
    "scopeName": "source.microtemplate"
}

のようにすると、ファイル全体がHTMLとしてハイライトされるようになります。 text.html.derivative はHTMLファイルを開いたときに使われる規則の名前です。

↑の場合は scopeName というキーに source.microtemplate と書いてあるので、 source.microtemplate という規則が text.html.derivative という規則と同じ挙動をするようにしているということになります。

MicroTemplateの記法を見つけたらそこにPerlのハイライトの規則を適用する

プロジェクトを生成すると package.jsoncontributes.grammars は以下のようになっていると思うのですが、

[{
    "language": "microtemplate",
    "scopeName": "source.microtemplate",
    "path": "./syntaxes/microtemplate.tmLanguage.json"
}]

この配列に要素を足して次のようにします。

[{
    "language": "microtemplate",
    "scopeName": "source.microtemplate",
    "path": "./syntaxes/microtemplate.tmLanguage.json"
}, {
    "injectTo": ["source.microtemplate"],
    "scopeName": "source.microtemplate.embedded",
    "path": "./syntaxes/microtemplate.embedded.tmLanguage.json"
}]

直前の章で source.microtemplate という規則がHTMLファイルに適用される規則と同じになるように設定しましたが、そこに injectTo というキーを使って別の規則を注入するということをしています。

あとは、 path で指定したファイルに scopeName で指定した名前の規則を書けば完成です。

ファイルの中身は100行くらいありますが、↓のような規則が何個か書いてあるだけです1

f:id:nakayama-daisuke:20201215101039p:plain

ファイル全体が見たい方はここをご覧ください。

さいごに

ここではPerlのシンタックスハイライトの規則をVSCodeに初めから入ってるものを利用してて、たまたまそれっぽくハイライトされてるんですが、本当は ? とか <? ~ ?> とかで分断されてるコードをハイライトしてくれる保証はないはずなので自分で書いたものを使わないといけないと思います。

が、Perlの文法何も知らないのでとりあえずこのままにしておこうと思います。


  1. begin/endの動作はおそらく前に書いた記事のような感じになるので、ここで貼った画像の説明は正確じゃないと思うんですが、このくらいの小さいものを作るだけならこういう雑な理解で別にいいんじゃないかなと思ってます。

新卒研修の5日間で雑談専用のビデオチャットツールを作った話

カヤックアドベントカレンダーの15日目を担当します、今年の4月からフロントエンドエンジニアとしてカヤックに入社したbobです!

www.kayac.com

昨日は、原宿系エンジニアこと hsm_hx による めざせ!ゆめかわ原宿系エンジニア:入門編 でした!!新卒同期なのですが、まだ5さいなのでちょっとおじさんには何を言っているかわからなかったです笑


今年はコロナで本当に大変でしたね汗

新卒の私たちは、新人研修がほぼフルリモートでスタートということもあり、例年とはイレギュラーな研修内容となりました!

そんな中で同期とフルリモートで作成したビデオチャットツールのお話を書かせていただきます!

👇👇👇👇👇 つくったビデオチャットツールはこちらです 👇👇👇👇👇

👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆👆


目次


2020年のカヤックの新卒研修

コロナで世の中が大変になっていた4月、カヤックでも感染のリスクを考慮し大部分はリモートで研修が行われました👀

エンジニアの研修は、オフラインを想定して考えられたカリキュラムも一部含まれていたため、大きな変更がありました。

そのため終盤は 「5年後も仕事で使いたくなるようなツールを作成する」 というハッカソン的な内容になりました。

しかもチームでの作成が基本ということで、まだ実際にしっかりとしたコミュニケーションをとったことがない同期と作成するなど、今考えるとだいぶハードルの高いことをしています笑

つくるものを決めるまで

上のtwitterの動画をチェックしていただければおおよその概要が伝わるかと思いますが、作成したビデオチャットの使い方は下のような感じです👇

f:id:truly-bob:20201207132352p:plain
つくったアプリの説明

あっ、お伝えし忘れていましたが、今回作成したアプリ名は「combomb」と言います💣

こんな感じで、サクッと雑談するためのビデオチャットツールを作りました!

今回の記事では、どうやってアイデアが出てきたのか、技術的にどのような仕組みだったのかについて書いていきます。

アイデア決定

まずはアイデア出し。どんなものが良さそうかなということで、とにかくいろいろなアイデアを出してみました!🙌

いろいろなアイデアがある中で「リモートワークによるコミュニケーション不足」という部分に着目しました。

研修などである程度コミュニケーションは取れるけれども、ちょっとした雑談レベルでのコミュニケーションはないよね 🤔 というところから、気軽にコミュニケーションを取るためのアプリを作ろうとなりました。

リーンスタートアップ的なやつ

完成系をみてしまうと「最初からビデオチャットをつくりだした」ように見えてしまいますが、実際にはその前に「ビデオチャットかSlack内でのチャットベース」のどちらにするべきかという命題が実はありました。

実際にどっちも作ってみて「さぁどっちがいいか!」なんて試してたら時間が足りません😇

そこで俗にいうリーンスタートアップという手法を参考に、ビデオチャットかテキストチャットのどっちがいいか試してみました。

ja.wikipedia.org

リーンスタートアップとは、起業マネジメント理論の一つで平たく言えば「実際にユーザーが使って価値があるものか無駄なく調べる」という方法です。

実際にはGoogle Meetを使って5分雑談とテキストベースで5分雑談をやってみるという方法で実験してみました。やってみた結果、「コミュニケーションは非同期でサクサク進まないとかなりしんどい」ということがわかりました!!

この時のコツは、手をいきなり動かすのではなく、代替できるものでサクッと作ろうとしているものが効果的かをチェックしてみることです👀

これをしたおかげで、どんなUXで何を作ろうかという部分であまり迷いがなくなりました🙌

チームのコミュニケーション

ということでつくるものが決まりました!

今回は、同期の一人が一緒に参加してくれて二人での開発になりました!

しかし、実際にオフラインでは会ったことがないという状況、、、

どのようにコミュニケーションを取るか、どのように進捗を管理するのかについても今回の課題の中で問われていたと思います👀

僕たちは「1日の始まりと終わりに10分は話す」ということと「進捗はGoogle Sheetsで管理する」という風にしました。

f:id:truly-bob:20201207142820p:plain
Spread Sheetによるタスク管理表

タスク管理表はこんな感じです👆

GitHubとかではなく、spread sheetを採用した理由は、二人ともあまり触ったことのない技術を使うため、どんなリスクや見えていなかった実装に臨機応変に対応するためです!

TrelloやGitHubのissueだと、新しくタスクを追加する重さがあるので、もっとカジュアルに使えるスプレッドシートを使用しましたがこれはかなり良い判断だったと思います🙌

技術的な話

ここからやっと技術的な話に入ります!!だいぶ前にやったのでかなり記憶はあやふやですが頑張ります😇

  • ビデオチャット部分の技術

今回の実装を行うにあたって一番の肝になるのはもちろんどうやってビデオチャットを成立させるか。

自分で1からこの仕組み作ってたら 😇 なので、今回はNTT Communications様が提供している「SkyWay」を使用しました。今年はP2Pに関する技術が大盛り上がりでしたね!!

webrtc.ecl.ntt.com

SkyWayのビデオチャット部分の複雑な実装はほとんどなくなり、集中したい作業に時間をさけました!!

  • フロント側の実装

生のJSを書くのはかなりしんどかったので、普段使い慣れているVueを使用しました!フロントは私bobが担当です!

ちなみに、SPA構成にしてFirebase Hostingを使用したかったので、Nuxtではなくvue-cliを今回は使用しました。Nuxtでもいけるとは思いますが、フレームワーク自体には今回はそんなに拘っていません🙇‍♂️

SkyWayの実装自体もフロント側でハンドリングできるので、かなり楽でした!!

  • サーバー側の実装

チャットルームのIDや何人がそのルームに入ろうとしているか監視する必要があるので、サーバー側の仕組みが必要です!(一部屋の上限が4人だったりなど)

サーバー側の実装は同期にお願いしました🙌

環境構築の手間などを省きたかったので、今回はFirebaseのReal Time DatabaseとCloud Functionsを使用しています。いやほんとにFirebase便利ですね🔥


以上の3つの要素を組み合わせて、実装しました!そのシステム図は下のようになります!

f:id:truly-bob:20201207151314p:plain

f:id:truly-bob:20201207151330p:plain

これより細かい話は長すぎるので省略します🙏 (書くの疲れた

まとめ

振り返るとめっちゃ長文になってしまいましたが、以上が雑談専用ビデオチャットツールを作った経緯とその実装方法でした!

実際に使ってみると、5分という程よい長さと最後に徐々に消えていくという体験が好評でした😋

明日は @nakayama-daisuke さんによるシンタックスハイライトを自作するお話です!!自分でシンタックスハイライトを作ろうという発想がなかったのでとても楽しみです👀

それでは良い年末を!!