言語サーバを応用した細粒度編集履歴
収集プラットフォームの構想
石田 直人1

神田 哲也1,a)

嶋利 一真1,b)

井上 克郎1,c)

概要：ファイルの保存，版管理システムへのコミットといった単位よりも細かい，エディタの操作履歴のような細粒度編集履歴は，プログラムの理解支援や変更支援，プロセス改善などに活用されている．本稿では，様々なエディタが用いられるような状況でも細粒度編集履歴を収集できるようにするために，細粒度編集履歴の収集部分を言語サーバを応用したモジュールに分離し，多様な開発環境での情報収集と利活用を可能にするためのプラットフォームを提案する．

1. はじめにファイルの保存，版管理システムへのコミットといった単位よりも細かい，エディタの操作履歴のような細粒度編集履歴を記録し，活用する研究がなされている．細粒度編集履歴は，プログラムの理解支援や変更支援，プロセス改善などに活用されている [1]．教育機関でのプログラミング演習においても，学生の進捗や理解度，行き詰まりを把握するためにこのような履歴を収集分析することが提案されている．
細粒度編集履歴の収集のためには，開発環境においてそれを取得する機構を組み込む必要がある．これは，もし複図 1 細粒度編集履歴収集プラットフォームの構成数の開発環境に対して細粒度履歴収集を行いたい場合，それぞれにおいてログ取得の機構を準備する必要があるというサーバを応用したモジュールに分離することで，種類の異ことでもある．StackOverﬂow Developer Survey 2019 [2]なるエディタでも容易に情報収集が行えるようにする．まの「Most Popular Development Environments」によると，

た，分析部はサーバ上に構築することで，開発環境によら使用率が 10%を超えるエディタが 10 あることから，開発ない細粒度編集履歴の利活用を可能にする．

者が使用するエディタは多岐にわたり，また一人の開発者が複数のエディタを使い分けることも珍しくないことが読み取れる．教育現場でも，卒業までに複数の言語にふれる

2. 細粒度編集履歴収集プラットフォーム
今回，細粒度編集履歴収集のプラットフォームを提案すようなカリキュラムの場合，複数種類の開発環境を使うこるにあたり，以下の 2 つの要件を定めた．とが想定される．

( 1 ) 開発者が好みのエディタを使用できる (特定のエディ

そこで本稿では，多様な開発環境での情報収集と利活用を可能にするために細粒度編集履歴の収集部と分析部を分離したプラットフォームを提案する．具体的には，細粒度編集履歴の収集部分を多くのエディタで利用可能な言語
1a)b)c)

大阪大学
Osaka University, Suita, Osaka 565–0871, Japant-kanda@ist.osaka-u.ac.jp
k-simari@ist.osaka-u.ac.jp
inoue@ist.osaka-u.ac.jp

タに依存しない)( 2 ) 細粒度編集履歴の分析ツールや，CI ツールなどの開発者向けツールと容易に連携することができる
これらの要件を満たすために，エディタ側では Language

Server Protocol [3] (以後 LSP とする) を利用し細粒度編集履歴の収集を行う．また，収集した情報を保存，分析するための基盤はサーバとして実装し，サーバがデータ取得用の API を提供することで他のツールとの連携を容易にを保存して解析する役割を担う．データの保存形式と分析{" type ": " edit " ," time ": "2020 -08 -04 T08 :11:10.608 Z " ," payload ": {" textDocument ": {" uri ": " file :/// e %3 A / gprac / src /components / header . js " ," version ": 15}," conte ntChanges ": [{" range ": {" start ": {" line ": 3 ," character ": 11},
" end ": {" line ": 3 ," character ": 15}}," rangeLength ": 4 ," text ": " ABCD "}]}},ツールを疎結合にするために，保存のための仕組みと解析のための仕組みを分割する．エディタが収集した細粒度編集履歴は，HTTP 通信を通じて API サーバに送信される．

API サーバは，受信したデータを DB サーバに格納し，またデータ分析のために取り出すことのできる API を提供する．細粒度編集履歴の分析は，この API が提供するデータを用いて行う．
現在の実装では，DB サーバには収集した細粒度編集履歴のサマリだけを保管し，内容はローカルストレージもし
くは NextCloud 等のオンラインストレージ上で圧縮ファイルとして保持している．
分析ツールとして，ブラウザ上で細粒度編集履歴を再生するためのツールと，ある期間において終了時のコードを100%としたときの進捗可視化ツールを試作した．現状はAPI 経由ではなく手作業で履歴ファイルを指定している．

図 2

収集部から送信される細粒度編集履歴の例

3. おわりにすることを考える．図 1 に提案手法の構成図を示す．収集

本稿では，特定のエディタに依存せず，他のツールと容部である開発環境と分析部であるデータの保存，解析はそ易に連携することができる細粒度編集履歴収集プラット

れぞれ独立しており，API サーバによって連携される．

フォームを提案し，その構成について説明した．

2.1 細粒度編集履歴の収集部のものが実装済みであり，今後他のエディタ用のプラグイ

現在は開発環境側のプラグインは Visual Studio Code 用
種々の開発環境における細粒度編集履歴の収集を実現すンの開発を行う予定である．また，細粒度編集履歴に対するため，LSP を応用する．LSP とは，エディタと言語サーる既存の分析手法を本プラットフォーム上で実装し，エバ間のやり取りを行うためのプロトコルであり，「コードディタや言語が異なる環境での実験を行うことも考えて補完」や「定義へ移動」といった機能を言語サーバがサーいる．

ビスとして提供し，LSP を通じエディタ側からサービスにAPI の仕様や具体的な細粒度編集履歴の内容についてアクセスすることで機能を実現するものである．もともとは，今後詳細な検討が必要があると考えている．例えば現は Visual Studio Code のために開発されたものであるが，在の実装では通信量と煩雑な情報の削減のために言語サー現在では多くのエディタがサポートしているため，提案手バ側での要約処理を行っているため，1 文字単位の編集履

法を複数の開発環境に対して低コストで展開することが期

歴は開発者側から送信される段階ですでに残っておらず取待できる．

得できない．また，エディタの操作についても記録を行っ

LSP では通知頻度を設定することができる．ここでは，ていないため，開発者の行動に基づくフィードバックをしファイルが編集されるたびにイベントを発生させることたい場合など，どのような情報を記録するかについて検討

で，言語サーバは一文字単位でインクリメンタルに編集し，API を設計する必要があると考えている．

内容を受け取る．受け取った編集履歴は，桑原らの関連研
究 [4] で提案されている手法を参考に隣接する編集操作を謝辞 本研究は JSPS 科研費 JP18H04094，JP19K20239の助成を受けたものです．

統合する．統合したデータはエディタからの指示によってAPI サーバに送信される．
図 2 は送信される履歴の一部である．イベント発生時刻

参考文献
[1]

やファイル名，編集内容が記載された JSON フォーマットのデータとなっている．この図に示したデータのほか，[2]ファイルの編集開始前の状態もあわせて送信することで，編集内容を再現できるようになっている．

[3]
[4]

2.2 細粒度編集履歴の分析部
分析部では，開発環境とは独立して，受け取ったデータ

大森隆行，林 晋平，丸山勝久： 統合開発環境における細粒度な操作履歴の収集および応用に関する調査，コンピュー
タソフトウェア， Vol. 32, No. 1, pp. 60–80 (2015).
: StackOverﬂow Developer Survey 2019, https://insights.stackoverflow.com/survey/2019.
:
Language Server Protocol, https://microsoft.
github.io/language-server-protocol/.
桑原寛明，大森隆行： 編集操作履歴の再生における粗粒度な再生単位，コンピュータソフトウェア， Vol. 30, No. 4,pp. 61–66 (2013).