운영 변환 라이브러리?


102

여러 사용자 (Google Docs)간에 실시간으로 텍스트를 동기화 할 수있는 라이브러리를 찾고 있습니다.

나는 내 요구에 맞는 것처럼 보이는 Operational Transformation을 우연히 발견했습니다. 그렇게 말하면서 나는 OT의 요지를 이해하지만 OT의 수학이나 구현은 이해하지 못합니다.

따라서 텍스트 영역에 연결하여 변환을 생성 한 다음 해당 변환을 다른 클라이언트에 적용 할 수있는 드래그 앤 드롭 Javascript 라이브러리가 있는지 궁금합니다.

(저는 Etherpad 소스를 얻었지만 머리와 꼬리를 만들 수 없습니다. 누군가 Etherpad의 OT 구현을 활용하는 방법을 지적 할 수 있다면 그것도 좋을 것입니다!)


- 중포 기지에 의해 구동 공동 텍스트 편집기 Firepad라고 firepad.io 영감 얻기 위해 코드를 확인 github.com/FirebaseExtended/firepad
Tharanga Hewavithana

답변:


57

저는 Google Wave의 OT 구현의 일부가 오픈 소스라고 생각합니다 (더 많은 부분이 제공 될 예정입니다).

이것이 당신이 찾고있는 것인지 확실하지 않지만 OT의 대안은 차동 동기화입니다 .


6
Neil Frasier ( neil.fraser.name/writing/sync ) 의 Differential Synchronization 논문과 결합 된 Diff-Match-Patch 가 트릭을 수행했습니다! 저를 올바른 방향으로 안내해 주셔서 감사합니다.
gamers2000

내가 이해하는 바에 따르면, Diff-Match-Patch, 그리고 확장으로 MobWrite는 (후자가 전자를 사용하기 때문에) 바이너리 변경이 아닌 텍스트 만 지원합니다. 그러나 HTML 양식 요소와의 공동 작업 데모가 있는데 이는 일반 텍스트 만 지원하지 않음을 나타냅니다.
gamers2000 2011

이 답변 이후 "및 더 많은 부품이 올 것"에 대한 좋은 소식이 있습니까?
bertie 2011

3
실제로 Google-Diff-Match-Patch는 DS의 Neil Fraser 문서를 읽을 수있는 차이점을 이해하기 위해 차등 동기화 인 Operational Transformations에 대한 대체 방법을 구현하는 것을 목표로합니다 : neil.fraser.name/writing/sync (OT 이 문서에서는 이벤트 전달이라고합니다.) 그들은 매우 다른 두 가지 방법입니다.
Benja 2012

5
이것은 오래되었지만 마음에 드는 경우에는 github.com/benjamine/JsonDiffPatch를 오픈 소스 했습니다. 긴 문자열에는 Neil의 Diff-Match-Patch를 사용하지만 arbritrary js 객체 그래프에서는 작동합니다
Benja

44

전 웨이브 엔지니어 중 하나는 지금은 이름의 공동 편집 알고리즘이라는 ShareJS의 커피 스크립트 구현, 발표했다 ShareDB을 .


1
ShareJS는 아마도 MobWrite가 Google의 Diff 및 Patch로 수행하는 것보다 더 간단하고 더 잘 문서화되고 재사용 가능합니다.
Luke Stanley

33

내가 찾은 해결책을 요약하겠습니다.

  • 운영 변환 : 예

    • Google Wave OT. 접근 방식은 소위 목성 접근 방식을 기반으로합니다.
    • ShareJs. Google Wave OT와 동일한 OT 알고리즘을 기반으로합니다.
    • 거미줄 -jsoe. COT 기반-p2p 메시지 전파도 지원하는 매우 정교한 OT 접근 방식입니다.
    • OpenCoweb. 그것은 많은 유사한 문제에 대해 완전한 프레임 워크를 제공하기 위해 OpenCoweb-jsoe를 활용합니다.
    • OT.js는 ShareJ의 작업 유형을 기반으로합니다.
    • DriveSDK. 많은 일을 할 수있는 매우 흥미로운 API (예 : 그래프 협업).
    • SwellRT는 Apache Wave의 포크입니다. 페더레이션되고 서식있는 텍스트를 지원합니다.
  • 차동 동기화 :

    • Neil Fraser의 Diff-Match-Patch.
    • MobWrite는 Diff-Match-Patch 알고리즘을 활용합니다.
  • CRDT ( 교류 복제 데이터 유형) :

    • 공유 유형의 구현을 허용하는 다양한 CRDT 알고리즘이 있습니다. 일부 CRDT는 P2P 메시지 전파와 함께 작동하고 일부는 클라이언트-서버 모델에 의존합니다.
    • Yjs를 사용하면 임의의 데이터 유형 (RichText, Array, Hash Maps, .. 확장 가능)을 공유 할 수 있습니다. P2P 통신 프로토콜에 대한 오프라인 지원 및 지원 (XMPP, Websockets 및 WebRTC 용 모듈이 있음)
    • 오프라인을 지원하는 SwarmJS 클라이언트 서버 공유 데이터베이스. React와 잘 작동합니다.
    • Woot Woot CRDT의 구현
    • CRDT 또 다른 CRDT 구현
    • 자동 병합

Google Drive API는 DS가 아닌 OT를 사용합니다. developers.google.com/drive/realtime/conflict-resolution
Mathias Bak




4

이 문제에 대한 턴키 또는 "드래그 앤 드롭"솔루션은 공유 가변 상태를 안정적으로 동기화하는 복잡성으로 인해 실제로 존재하지 않았습니다. dmonad의 응답은 괜찮은 편이고 여기에 사용 가능한 솔루션에 대한 최신 개요를 게시했습니다 .

이 질문은 꽤 오래되었지만 Convergence (면책 조항 : 저는 창립자입니다)는 데이터 동기화뿐만 아니라 협업 UX 구축에 유용한 다른 API 호스트를 제공하는 가장 턴키 솔루션을 제공합니다. 다음은 요청한 내용을 정확히 보여주는 입니다. 여러 클라이언트에서 텍스트 필드 동기화.

그렇지 않으면 ShareDB 는 많은 사람들의 요구에 맞는 훌륭한 오픈 소스 솔루션입니다.



2

js 클라이언트 라이브러리 (Strophe.js)를 사용하면 무료 XMPP 서버 (예 : jabber.org)와 함께 클라이언트 측 OT 라이브러리 (JSOTTEST)를 사용하여 완전한 클라이언트-서버 시스템을 구축 할 수 있습니다.

코드를 수정할 시간이있을 때 데모 클라이언트-서버 채팅 시스템의 src를 제출하겠습니다.


1
거의 2 년 전에 "나는 데모의 src를 제출하겠습니다 ..."라고 썼습니다. 데모를 마쳤습니까?
Bryan Oakley 2013 년

죄송하지만 공개 데모를 공개 할 시간이 없었습니다! 그러나 Bosh lib for php를 사용하는 것은 매우 간단합니다 !! 안녕
user981836 2014-05-05

2

Npm에는 node.js에 대한 멋진 ot 라이브러리가 있습니다.

  • https://npmjs.org/package/ot- 클라이언트 및 서버 구현뿐만 아니라 내장 된 codemirror 및 ace 용 어댑터
  • https://npmjs.org/package/changesets- 노드 및 브라우저에서 사용 가능한 일반 ot 라이브러리 전송하고 서로에 대해 변형하고 문서에 적용 할 수있는 '변경 집합'(본질적으로 diff)을 만들 수 있습니다.

1

Cedanet 에있는 사람들과 이야기 할 수 있습니다. Ceda는 비공개 소스이며 웹 사이트에서 무료 평가판을 사용할 수 없습니다. 저는 Ceda의 개발에 참여했으며 상업 프로젝트에서 계속해서 작업하고 있습니다. 따라서이 길로 가면 피드백 / 조언을 제공 할 수있을 것입니다.


1

나는 etherpad lite를 사용하는 etherpad.org가 다른 솔루션보다 우수합니다.


1
이더 패드의 우월성을 몇 가지 예를 통해 입증 할 수 있습니까?
DL Narasimhan


1

OT 제어 계층을 구현하는 작은 unixy (한 가지를 수행하고 잘 수행) 라이브러리를 작성하여 다양한 OT 유형을 연결할 수 있습니다 (모든 shareJS 호환 유형 지원). shareJS와 비슷하지만 덜 독단적이고 추상적입니다.

https://github.com/marcelklehr/gulf

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.