---
# System prepended metadata

title: suigyoza 進捗報告

---

# suigyoza 進捗報告

作業環境：Ubuntu18.04 二人，Ubuntu20.04 一人

## 10/11
* チーム名を決めた
> suigyo __u__ zaではなくsuigyozaなのに注意
* GitLab上にプロジェクト作った (https://doss-gitlab.eidos.ic.i.u-tokyo.ac.jp/suigyoza/vscode)
* 以下のコマンドでvscodeリポジトリのmainブランチを自分たちのプロジェクトに持ってくることができる
```
git clone https://github.com/microsoft/vscode.git
cd vscode
git remote rename origin upstream
git remote add origin git@doss-gitlab.eidos.ic.i.u-tokyo.ac.jp:suigyoza/vscode.git
git push -u origin main
```

* node.js入れた
* typescriptコンパイル確認&Hello World
* VSCodeをビルドした
    * node.jsのバージョンに指定があり，詰まった．
    > node v14-17でないといけない
* VSCodeでのデバッグはChrome拡張を使うらしいが，まだよく使い方がわからない．(10/12にて解決)






↓コレの通りにやれば基本は大丈夫
https://github.com/microsoft/vscode/wiki/How-to-Contribute

２つうまく行かなかった箇所があり、
１つめは、

```
On Debian-based Linux: sudo apt-get install build-essential g++ libx11-dev libxkbfile-dev libsecret-1-dev python-is-python3
```
これの`python-is-python3`の部分で詰まってしまった。よくみると、Ubuntuのversionが20これだけをとばしたらうまくいきました。つまり、実行したコードは以下。
```
sudo apt-get install build-essential g++ libx11-dev libxkbfile-dev libsecret-1-dev
```


> python-is-python3はUbuntu20.04以降で，Python2，3の衝突を避けるために実装された機能らしく(?)，それ以前の人は無視していい．（というかつけるとエラーが起きる）
> https://askubuntu.com/questions/1296790/python-is-python3-package-in-ubuntu-20-04-what-is-it-and-what-does-it-actually

２つめは、
最後の`./scripts/code.sh`はvscode内のターミナルで打ち込んだらcrbug:638180にあたったので、外部の端末から実行した結果、無事にOSS Devが立ち上がりました。めでたしめでたし




----

## 10/12日


### undoのソースの発見

__undoRedo.ts及びundoRedoService.tsを発見__
vscode/src/vs/platform/undoRedo/common

public undoの定義が
vscode/src/vs/platform/undoRedo/common/undoRedoService.tsのl.1057にある
> console.log("aiueo");をundoに追加し，デバッグログに表示できた


l.1072は，stackに一度も何も入っていないときだけ呼び出される．
```typescript=
// l.1072
private _undo(strResource: string, sourceId: number = 0, undoConfirmed: boolean): Promise<void> | void {
	if (!this._editStacks.has(strResource)) {
		return;
	}
```
> おそらくstackが生成されていないとき？
> 新規ファイル作成時に押すundoと，立ち上げで過去ログがないときだけ呼ばれる
> 一文字でも書いてundoするともう呼ばれない


### undoの実装について

undoRedoService.ts l.197にclass ResourceEditStackの定義


### VSCodeのデバッグについて

1. [the Debugger for Chrome extension](https://marketplace.visualstudio.com/items?itemName=msjsdiag.debugger-for-chrome)をインストール
2. vscodeディレクトリ直下で`code .`とする
3. TSファイル内に適宜ブレイクポイントを設定
4. 実行とデバッグを押し，「Launch VS Code」を選択し，実行(F5)
5. Ctrl+Shift+I or Ctrl+Shift+Pからの
6. F10,F11等で実行

### ビルドについて

先輩の進捗記録
https://docs.google.com/document/d/19RT8dViW3_agluddDCAxVNEd0xylnLeheMKteVrTtew/edit
の10/13あたりが参考になる．
> yarn watchでやるといい


file をwatchできませんというエラーが出るので以下に従って上限を解放しました
参考：
https://code.visualstudio.com/docs/setup/linux#_visual-studio-code-is-unable-to-watch-for-file-changes-in-this-large-workspace-error-enospc


気づき
* pushElement(undoRedoServics.ts)にbp置くと，どこでundo，redoが切れているか，（stackにpushしているかがわかる）
> Enter，Spaceで切ってる
> Enterは強制
> Spaceは，文字との切り替えで切る
    > Space→Spaceは止まらない（→文字入れて止まる）
    > 文字→文字求まらない（→Spaceで止まる）

---

## 10/14

### vscodeデバッグ

src/vs/editor/common/model/textModel.tsがredo時にundoRedoService.tsより先に呼び出されている


undoRedoService284pushElement内，`this._future = [];`でfuture配列を初期化しているので，ここをコメントアウトすると，すべてのログが残る．
```typescript=
public pushElement(element: StackElement): void {
		// remove the future
	for (const futureElement of this._future) {
		if (futureElement.type === UndoRedoElementType.Workspace) {
			futureElement.removeResource(this.resourceLabel, this.strResource, RemovedResourceReason.NoParallelUniverses);
		}
	}
	// this._future = [];
	this._past.push(element);
	this.versionId++;
}
```

past,futureという２つのJSarrayをもちいて、redo-undoが行われていることがわかった。

具体的には、
undo時：pastからpop, futureにpush
redo時：futureからpop, pastにpush
その他の編集をするときは、pastにpopされ、そのたびに、futureは空配列となる。

これらをdeque構造を用いることで、実現したいundo-redo機能を実装できそうである。

undo時：pastからpopした上で、popしたものをleftpop, futureにpush???
redo時：futureからpopした上で、popしたものをleftpop, pastにpush???
その他：pastにpop(futureはから配列にしない)

TypeScriptにはdequeがないので[stack2本でdequeを作る](https://www.slideshare.net/catupper/amortize-analysis-of-deque-with-2-stack)

## 10/18
ResourceEditStack ファイルごとの編集履歴　pastとfuture
ResourceEditStackSnapshot 時系列順に編集履歴が入っている　木構造との相性悪そう　まず何に使うねん
ResourceEditStack.createSnapshot スナップショットを作る
ResourceEditStack.restoreSnapshot　スナップショットの状態を復元する……？いつ呼ばれるん　遡ったけどよくわからん笑

pushElementでfutureを空配列にするのをやめてみると、undo以降の入力が全部単体で処理されてしまう
getLastElementの
if (editStack.hasFutureElements()) {... を消すとこの問題は解決する　もともとなんであったのかがよくわからないので怖い。。。

StackElementにbooleanを持たせ、_resourceUndo内の処理を書き換えると一応それっぽく動いた　めでたい

![](https://i.imgur.com/m9oBQJh.jpg)



---

## 10/19

### 念の為，Pastスタックの上限を調べた．

* 実装を見る限りなさそうだが，（というか上限を設けて削除するほうが大変なので空間計算量を犠牲にしていると予想される．）一応調査
* Enter15000回は最初まで戻れた．


## 10/25
編集→保存→閉じる→開く→undo でエラーが出た
getElementsの内容をコメントアウトしていたことが原因
