SlideShare uma empresa Scribd logo
1 de 197
Baixar para ler offline
실시간 웹 협업도구 만들기

홍영택

Sunday, October 13, 13
실시간 웹 협업도구 만들기

홍영택

Sunday, October 13, 13
실시간 웹 협업도구 만들기

홍영택

Sunday, October 13, 13
About Me

Sunday, October 13, 13
About Me
Javascript

Sunday, October 13, 13
Sunday, October 13, 13
Sunday, October 13, 13
Sunday, October 13, 13
Sunday, October 13, 13
Sunday, October 13, 13
Sunday, October 13, 13
https://github.com/HackerWins/summernote

Sunday, October 13, 13
https://github.com/HackerWins/summernote

Sunday, October 13, 13
Sunday, October 13, 13
Sunday, October 13, 13
실시간 웹 협업도구 만들기

Sunday, October 13, 13
Collaboration
is everything

Sunday, October 13, 13
Sunday, October 13, 13
팀원 B: “아인슈타인은 내친구”
조장A: “제길 내가 조장 ㅠ”

팀원 C: “대학은 술먹는 곳”

Sunday, October 13, 13
Email based Collaboration

Sunday, October 13, 13
조장A: 템플릿 받으셈

Sunday, October 13, 13
팀원 B: “E=mc^2”

조장A:나도 내부분
작성

팀원 C: “지식인에서 C & P”

Sunday, October 13, 13
팀원 C: “난 한글 없어서 HWP 파일 편
집 못해”

Sunday, October 13, 13
조장 A: “다했으면 보내주셈”

Sunday, October 13, 13
조장A: 취합 취합

Sunday, October 13, 13
조장 A: “이거 다시보내 주셈”

Sunday, October 13, 13
팀원 C: “지식인에서 C & P”

Sunday, October 13, 13
조장 A: “제대로 고쳤나?”

Sunday, October 13, 13
조장A: “취합 취합 (파일이
많아졌어...)”

Sunday, October 13, 13
조장A: “취합 취합
(죽겠네...)”

Sunday, October 13, 13
첨부파일을 이용한 이메일 기반 협업
로컬 컴퓨터에 편집기가 설치되어 있어야함
리비전 관리가 어려움

Sunday, October 13, 13
조장A: “문서 링크
받으셈”

http://wiki.ooo.com

Sunday, October 13, 13
Sunday, October 13, 13
Sunday, October 13, 13
http://wiki.ooo.com

Sunday, October 13, 13
Lock, Save

Sunday, October 13, 13
Lock & Save

Sunday, October 13, 13
사용자 C: “Blah Blah”

Sunday, October 13, 13
사용자 B: “문서에 락걸렸네”

Sunday, October 13, 13
사용자 C: “저장!”

Sunday, October 13, 13
사용자 B: “이제 편집된다.”

Sunday, October 13, 13
사용자 B: “몽창 날라갔다.ㅠ”

Sunday, October 13, 13
Lock & Save 협업 도구
페이지 락을 기다리는 불편함이 있음
네트워크가 끊어질 경우 데이터 손실의 위험이 있음

Sunday, October 13, 13
real-time collaboration

Sunday, October 13, 13
Sunday, October 13, 13
Sunday, October 13, 13
Sunday, October 13, 13
사용자 B: “Blah Blah”

조장A: “취합이 필요없군”

사용자 C: “Blah Blah”

Sunday, October 13, 13
웹 협업
첨부파일을 이용한 이메일 기반 협업
Lock & Save 협업 도구
실시간 협업 도구

Sunday, October 13, 13
웹 협업
첨부파일을 이용한 이메일 기반 협업
Lock & Save 협업 도구
실시간 협업 도구

Sunday, October 13, 13
편집기 만들기

Sunday, October 13, 13
입력

출력

Sunday, October 13, 13
이벤트 핸들러

Sunday, October 13, 13
이벤트 핸들러

Sunday, October 13, 13
이벤트 핸들러

도큐먼트 모델

Sunday, October 13, 13
이벤트 핸들러

도큐먼트 모델

렌더러

Sunday, October 13, 13
이벤트 핸들러

도큐먼트 모델

렌더러

Sunday, October 13, 13

코드가 많아
‘가’
이벤트 핸들러

도큐먼트 모델

렌더러

Sunday, October 13, 13
‘가’

doc.addText(‘가’)
이벤트 핸들러

도큐먼트 모델

렌더러

Sunday, October 13, 13
‘가’

doc.addText(‘가’)
이벤트 핸들러

도큐먼트 모델

렌더러

Sunday, October 13, 13

renderer.paint(para)
‘가’

doc.addText(‘가’)
이벤트 핸들러

도큐먼트 모델

<P>가</P>
{HTML}

렌더러

Sunday, October 13, 13

renderer.paint(para)
학기말 과제 작성중...

‘node cookbook’
번역중...

난 그냥 들어와 봤어...

Sunday, October 13, 13
‘node cookbook’
번역중...

나도 껴줘~!!!

Sunday, October 13, 13
Sunday, October 13, 13
‘가’

Sunday, October 13, 13
‘가’

Sunday, October 13, 13

doc.addText(‘가’)
‘가’

doc.addText(‘가’)

update(doc)

Sunday, October 13, 13
‘가’

doc.addText(‘가’)

update(doc)

change(doc)

Sunday, October 13, 13
‘가’

doc.addText(‘가’)

update(doc)

renderer.paint(para)

change(doc)

renderer.paint(doc)

Sunday, October 13, 13
‘가’

doc.addText(‘가’)

update(doc)

<P>가</P>

renderer.paint(para)

{HTML}

change(doc)

<P>가</P>
{HTML}

Sunday, October 13, 13

renderer.paint(doc)
‘가’

doc.addText(‘가’)

update(doc)

<P>가</P>

renderer.paint(para)

{HTML}

동일한 결과~!!!
<P>가</P>
{HTML}

Sunday, October 13, 13

renderer.paint(doc)

change(doc)
‘가’

doc.addText(‘가’)

update(doc)

<P>가</P>

renderer.paint(para)

{HTML}

하지만 문서를 전송해서
느리다~!!!

change(doc)

<P>가</P>
{HTML}

Sunday, October 13, 13

renderer.paint(doc)
‘가’

‘나’

Sunday, October 13, 13
‘가’

‘나’

Sunday, October 13, 13

doc.addText(‘가’)

doc.addText(‘나’)
‘가’

doc.addText(‘가’)

update(doc)

‘나’

doc.addText(‘나’)

update(doc)

Sunday, October 13, 13
‘가’

doc.addText(‘가’)

update(doc)

‘나’

doc.addText(‘나’)

update(doc)

Conflict!
동시편집은 무리
Sunday, October 13, 13
실시간 협업 에디터 만들기
문서 전체 전송으로 Network 사용량이 많음
동시 편집시 충돌 발생

Sunday, October 13, 13
실시간 협업 에디터 만들기
문서 전체 전송으로 Network 사용량이 많음
동시 편집시 충돌 발생

Sunday, October 13, 13
실시간 협업 에디터 만들기
문서 전체 전송으로 Network 사용량이 많음
동시 편집시 충돌 발생

Sunday, October 13, 13
실시간 협업 에디터 만들기
문서 전체 전송으로 Network 사용량이 많음
동시 편집시 충돌 발생

Sunday, October 13, 13
실시간 협업 에디터 만들기
문서 전체 전송으로 Network 사용량이 많음
동시 편집시 충돌 발생
스타크래프트 마린부대는
이동중 모든 좌표를 전송할까?

Sunday, October 13, 13
OT

(Operational
 Transformation)

Sunday, October 13, 13
OT
 (wikipedia)

• Operational transformation(OT) is a

technology for supporting a range of
collaboration functionalities in advanced
collaborative software systems.

Sunday, October 13, 13
OT
 (wikipedia)

• Operational transformation(OT) is a

technology for supporting a range of
collaboration functionalities in advanced
collaborative software systems.

Sunday, October 13, 13
“OT is like
real-time Git”
- Joseph Gentle(ShareJS, ex google wave...)

Sunday, October 13, 13
OT
 (basic)

• Data Model
• Operation Model
• OT Function

Sunday, October 13, 13
OT
 (basic)

• Data Model
• Operation Model
• OT Function

Sunday, October 13, 13
OT
 (basic)

• Data Model
• Operation Model
• OT Function

Sunday, October 13, 13
OT
 (basic)

• Data Model
• Operation Model
• OT Function

Sunday, October 13, 13
기억하세요?
‘가’

doc.addText(‘가’)
이벤트 핸들러

도큐먼트 모델

P가/P
{HTML}

렌더러

Sunday, October 13, 13

renderer.paint(para)
replicated
 architecture
 for
 shared
 documents

Sunday, October 13, 13
replicated
 architecture
 for
 shared
 documents

Operation 실행

Sunday, October 13, 13
replicated
 architecture
 for
 shared
 documents

Operation 전송

Sunday, October 13, 13
replicated
 architecture
 for
 shared
 documents

Operation 변환

Sunday, October 13, 13
OT Function
replicated
 architecture
 for
 shared
 documents

Operation 변환

Sunday, October 13, 13
replicated
 architecture
 for
 shared
 documents

Operation 실행

Sunday, October 13, 13
OT(Function)
Client 1
“APL”

Time

Sunday, October 13, 13

Client 2
“APL”
OT(Function)
Client 1
“APL”

O1 = INS(1, ‘P’)

“APPL”
Time

Sunday, October 13, 13

Client 2
“APL”
O1 = INS(1, ‘P’)

Sunday, October 13, 13
INSERT : 삽입

O1 = INS(1, ‘P’)

Sunday, October 13, 13
글자의 삽입 위치

O1 = INS(1, ‘P’)
삽입 문자

Sunday, October 13, 13
O1 = INS(1, ‘P’)
“APL”

Sunday, October 13, 13

?
O1 = INS(1, ‘P’)
“APL”

Sunday, October 13, 13

“APPL”
OT(Function)
Client 1
“APL”

O1 = INS(1, ‘P’)

“APPL”
Time

Sunday, October 13, 13

Client 2
“APL”
OT(Function)
Client 1

Client 2

“APL”

O1 = INS(1, ‘P’)

Sunday, October 13, 13

O2 = INS(3, ‘E’)

“APPL”
Time

“APL”

“APLE”
OT(Function)
Client 1

Client 2

“APL”

“APL”

O1 = INS(1, ‘P’)

O2 = INS(3, ‘E’)

“APPL”

“APLE”

Time

O1 = INS(1, ‘P’)

“APPLE”

Sunday, October 13, 13
OT(Function)
Client 1

Client 2

“APL”

“APL”

O1 = INS(1, ‘P’)

O2 = INS(3, ‘E’)

“APPL”

“APLE”

Time

O2 = INS(3, ‘E’)

“APPEL”

Sunday, October 13, 13

O1 = INS(1, ‘P’)

“APPLE”
OT(Function)
Client 1

Client 2

“APL”

“APL”

O1 = INS(1, ‘P’)

O2 = INS(3, ‘E’)

“APPL”

“APLE”

Time

O2 = INS(3, ‘E’)

“APPEL”

Sunday, October 13, 13

O1 = INS(1, ‘P’)

APPEL ≠ APPLE

“APPLE”
OT(Function)
Client 1
“APL”

Time

Sunday, October 13, 13

Client 2
“APL”
OT(Function)
Client 1
“APL”

O1 = INS(1, ‘P’)

“APPL”
Time

Sunday, October 13, 13

Client 2
“APL”
OT(Function)
Client 1

Client 2

“APL”

O1 = INS(1, ‘P’)

Sunday, October 13, 13

O2 = INS(3, ‘E’)

“APPL”
Time

“APL”

“APLE”
OT(Function)
Client 1

Client 2

“APL”

“APL”

O1 = INS(1, ‘P’)

O2 = INS(3, ‘E’)

“APPL”

“APLE”

Time

O1’ = INS(1, ‘P’)

“APPLE”

Sunday, October 13, 13
OT(Function)
Client 1

Client 2

“APL”

“APL”

O1 = INS(1, ‘P’)

O2 = INS(3, ‘E’)

“APPL”

“APLE”

Time

O2’ = INS(4, ‘E’)

“APPLE”

Sunday, October 13, 13

O1’ = INS(1, ‘P’)

“APPLE”
OT(Function)
Client 1

Client 2

“APL”

“APL”

O1 = INS(1, ‘P’)

O2 = INS(3, ‘E’)

“APPL”

“APLE”

Time

O2’ : index++
O2’ = INS(4, ‘E’)

“APPLE”

Sunday, October 13, 13

O1’ = INS(1, ‘P’)

“APPLE”
OT(Function)
Client 1

Client 2

“APL”

“APL”

O1 = INS(1, ‘P’)

O2 = INS(3, ‘E’)

“APPL”

“APLE”

Time

O2’ = INS(4, ‘E’)

“APPLE”

Sunday, October 13, 13

O1’ = INS(1, ‘P’)

APPLE = APPLE

“APPLE”
OT(Function)
Client 1

Client 2

“APL”

“APL”

O1 = INS(1, ‘P’)

O2 = INS(3, ‘E’)

“APPL”

“APLE”

Time

O2’ = INS(4, ‘E’)

“APPLE”

Sunday, October 13, 13

O1’ = INS(1, ‘P’)

APPLE = APPLE

“APPLE”
OT(Function)
O1'⋅O2 = O2'⋅O1
where
(O1', O2') = transform(O1, O2)

Sunday, October 13, 13
Visualization of OT with a central server

http://localhost:8080/visualization.html

Sunday, October 13, 13
‘가’

doc.addText(‘가’)

update(doc)

‘나’

doc.addText(‘나’)

update(doc)

Conflict!
동시편집은 무리
Sunday, October 13, 13
실시간 협업 에디터 만들기
문서 전체 전송으로 Network 사용량이 많음
동시 편집시 충돌 발생

Sunday, October 13, 13
실시간 협업 에디터 만들기
Operation 전송으로 Network 사용량이 적음
동시 편집시 충돌 발생

Sunday, October 13, 13
실시간 협업 에디터 만들기
Operation 전송으로 Network 사용량이 적음
OT Function으로 동일한 문서 유지

Sunday, October 13, 13
Sunday, October 13, 13
Sunday, October 13, 13
Sunday, October 13, 13
Sunday, October 13, 13
Sunday, October 13, 13
Sunday, October 13, 13
OT
Client

Sunday, October 13, 13

OT
Server
Operation만 전송

OT
Client

Sunday, October 13, 13

OT
Server
문제
 없나요?

Sunday, October 13, 13
OT
Client

Sunday, October 13, 13

OT
Server
OT
Client

Sunday, October 13, 13

OT
Server
비슷하게 생겼는데
쉽게 포팅 가능?

var document = {
	 insertText : function(){
...
},
	 deleteText : function(){
...
},
	 updateStyle : function(){
...
},
...
};
Sunday, October 13, 13

class Document {
	 public Document(){
...
}
	 public void insertText(){
...
}
	 public void deleteText(){
...
}
	 public void updateStyle(){
...
}	
...
};
Javascript는 Java와
완전히 달라
- 더글라스 크락포드

Sunday, October 13, 13
클로
져

자바스크립트
“C 언어의 옷을 입은 LISP”

함수

Sunday, October 13, 13

객체
일급
=

- 더글라스 크락포드
이벤트 핸들러

도큐먼트 모델

렌더러

Sunday, October 13, 13

코드가 많아
문제의 본질은 중복

Sunday, October 13, 13
실시간 협업 에디터 만들기
Operation 전송으로 Network 사용량이 적음
OT Function으로 동일한 문서 유지
Document Model 중복

Sunday, October 13, 13
한편...

Sunday, October 13, 13
이벤트 기반의 논 블러킹 I/O
작은 서버
- 라이언 달(Node.js)

Sunday, October 13, 13
C? 루아? 하스켈?

Sunday, October 13, 13
Javascript !!!

Sunday, October 13, 13
Sunday, October 13, 13
Javascript가
서버에서
돌아간다 ㅠㅠ

Sunday, October 13, 13
var document = {
	 insertText : function(){
...
},
	 deleteText : function(){
...
},
	 updateStyle : function(){
...
},
...
};

Sunday, October 13, 13

class Document {
	 public Document(){
...
}
	 public void insertText(){
...
}
	 public void deleteText(){
...
}
	 public void updateStyle(){
...
}	
...
};
OT
Client

OT
Server

같은 코드

Sunday, October 13, 13
실시간 협업 에디터 만들기
Operation 전송으로 Network 사용량이 적음
OT Function으로 동일한 문서 유지
서버/클라이언트 Document Model 중복

Sunday, October 13, 13
실시간 협업 에디터 만들기
Operation 전송으로 Network 사용량이 적음
OT Function으로 동일한 문서 유지
서버/클라이언트 Document Model 재사용

Sunday, October 13, 13
One
 more
 thing...

R.I.P.
 Jobs
Sunday, October 13, 13
JSON to POJO
POJO to JSON

JSON

Browser

Sunday, October 13, 13

OR-MAPPING

POJO

Server

Table

RDB
우린 왜? 이유없이 데이터 형변환을 하고 있을까?
문서에 무결성이 왠말이냐!!

Sunday, October 13, 13
실시간 협업 에디터 만들기
Operation 전송으로 Network 사용량이 적음
OT Function으로 동일한 문서 유지
서버/클라이언트 Document Model 재사용
불필요한 형변환

Sunday, October 13, 13
JSON to POJO
POJO to JSON

JSON

Browser

Sunday, October 13, 13

OR-MAPPING

JSON

Server

Document

NoSQL
Interfacing with Databases

nano
가벼운
API

Sunday, October 13, 13

cradle
강력함
API

mongoskin
깨끗한
API
실시간 협업 에디터 만들기
Operation 전송으로 Network 사용량이 적음
OT Function으로 동일한 문서 유지
서버/클라이언트 Document Model 재사용
형변환 최소화

Sunday, October 13, 13
Real-time(OT)
 server
 vs
 Web
 server

Sunday, October 13, 13
Long

Mais conteúdo relacionado

Mais procurados

がっつりMongoDB事例紹介
がっつりMongoDB事例紹介がっつりMongoDB事例紹介
がっつりMongoDB事例紹介Tetsutaro Watanabe
 
ジョブ管理でcronは限界があったので”Rundeck”を使ってハッピーになりました
ジョブ管理でcronは限界があったので”Rundeck”を使ってハッピーになりましたジョブ管理でcronは限界があったので”Rundeck”を使ってハッピーになりました
ジョブ管理でcronは限界があったので”Rundeck”を使ってハッピーになりましたYukiya Hayashi
 
webエンジニアのためのはじめてのredis
webエンジニアのためのはじめてのrediswebエンジニアのためのはじめてのredis
webエンジニアのためのはじめてのredisnasa9084
 
少しずつ手厚くして不具合や仕様漏れを防ぐために
少しずつ手厚くして不具合や仕様漏れを防ぐために少しずつ手厚くして不具合や仕様漏れを防ぐために
少しずつ手厚くして不具合や仕様漏れを防ぐためにFumiya Sakai
 
Application development with c#, .net 6, blazor web assembly, asp.net web api...
Application development with c#, .net 6, blazor web assembly, asp.net web api...Application development with c#, .net 6, blazor web assembly, asp.net web api...
Application development with c#, .net 6, blazor web assembly, asp.net web api...Shotaro Suzuki
 
【OpenStackDaysTokyo】4-B1-3 自動化を支えるCICDパイプラインの世界
【OpenStackDaysTokyo】4-B1-3 自動化を支えるCICDパイプラインの世界【OpenStackDaysTokyo】4-B1-3 自動化を支えるCICDパイプラインの世界
【OpenStackDaysTokyo】4-B1-3 自動化を支えるCICDパイプラインの世界Shingo Kitayama
 
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?kwatch
 
Json型の使い方
Json型の使い方Json型の使い方
Json型の使い方tsudaa
 
WebAssemblyのWeb以外のことぜんぶ話す
WebAssemblyのWeb以外のことぜんぶ話すWebAssemblyのWeb以外のことぜんぶ話す
WebAssemblyのWeb以外のことぜんぶ話すTakaya Saeki
 
君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?Teppei Sato
 
社内ドキュメント検索システム構築のノウハウ
社内ドキュメント検索システム構築のノウハウ社内ドキュメント検索システム構築のノウハウ
社内ドキュメント検索システム構築のノウハウShinsuke Sugaya
 
決済サービスのSpring Bootのバージョンを2系に上げた話
決済サービスのSpring Bootのバージョンを2系に上げた話決済サービスのSpring Bootのバージョンを2系に上げた話
決済サービスのSpring Bootのバージョンを2系に上げた話Ryosuke Uchitate
 
스타트업에서 기술책임자로 살아가기
스타트업에서 기술책임자로 살아가기스타트업에서 기술책임자로 살아가기
스타트업에서 기술책임자로 살아가기Hyun-woo Park
 
JSRとJEPとJBSの見方や調べ方について
JSRとJEPとJBSの見方や調べ方についてJSRとJEPとJBSの見方や調べ方について
JSRとJEPとJBSの見方や調べ方についてAya Ebata
 
はじめてのCF buildpack
はじめてのCF buildpackはじめてのCF buildpack
はじめてのCF buildpackKazuto Kusama
 
Intro to Node.js (v1)
Intro to Node.js (v1)Intro to Node.js (v1)
Intro to Node.js (v1)Chris Cowan
 
Haskell Day2012 - 参照透過性とは何だったのか
Haskell Day2012 - 参照透過性とは何だったのかHaskell Day2012 - 参照透過性とは何だったのか
Haskell Day2012 - 参照透過性とは何だったのかKousuke Ruichi
 
Official "push" and real-time capabilities for Symfony and API Platform (Merc...
Official "push" and real-time capabilities for Symfony and API Platform (Merc...Official "push" and real-time capabilities for Symfony and API Platform (Merc...
Official "push" and real-time capabilities for Symfony and API Platform (Merc...Les-Tilleuls.coop
 
UI 開発をアジャイルに行うための Atomic Design
UI 開発をアジャイルに行うための Atomic DesignUI 開発をアジャイルに行うための Atomic Design
UI 開発をアジャイルに行うための Atomic DesignYusuke Goto
 

Mais procurados (20)

がっつりMongoDB事例紹介
がっつりMongoDB事例紹介がっつりMongoDB事例紹介
がっつりMongoDB事例紹介
 
ジョブ管理でcronは限界があったので”Rundeck”を使ってハッピーになりました
ジョブ管理でcronは限界があったので”Rundeck”を使ってハッピーになりましたジョブ管理でcronは限界があったので”Rundeck”を使ってハッピーになりました
ジョブ管理でcronは限界があったので”Rundeck”を使ってハッピーになりました
 
webエンジニアのためのはじめてのredis
webエンジニアのためのはじめてのrediswebエンジニアのためのはじめてのredis
webエンジニアのためのはじめてのredis
 
少しずつ手厚くして不具合や仕様漏れを防ぐために
少しずつ手厚くして不具合や仕様漏れを防ぐために少しずつ手厚くして不具合や仕様漏れを防ぐために
少しずつ手厚くして不具合や仕様漏れを防ぐために
 
Application development with c#, .net 6, blazor web assembly, asp.net web api...
Application development with c#, .net 6, blazor web assembly, asp.net web api...Application development with c#, .net 6, blazor web assembly, asp.net web api...
Application development with c#, .net 6, blazor web assembly, asp.net web api...
 
【OpenStackDaysTokyo】4-B1-3 自動化を支えるCICDパイプラインの世界
【OpenStackDaysTokyo】4-B1-3 自動化を支えるCICDパイプラインの世界【OpenStackDaysTokyo】4-B1-3 自動化を支えるCICDパイプラインの世界
【OpenStackDaysTokyo】4-B1-3 自動化を支えるCICDパイプラインの世界
 
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
 
Json型の使い方
Json型の使い方Json型の使い方
Json型の使い方
 
WebAssemblyのWeb以外のことぜんぶ話す
WebAssemblyのWeb以外のことぜんぶ話すWebAssemblyのWeb以外のことぜんぶ話す
WebAssemblyのWeb以外のことぜんぶ話す
 
君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?
 
社内ドキュメント検索システム構築のノウハウ
社内ドキュメント検索システム構築のノウハウ社内ドキュメント検索システム構築のノウハウ
社内ドキュメント検索システム構築のノウハウ
 
決済サービスのSpring Bootのバージョンを2系に上げた話
決済サービスのSpring Bootのバージョンを2系に上げた話決済サービスのSpring Bootのバージョンを2系に上げた話
決済サービスのSpring Bootのバージョンを2系に上げた話
 
스타트업에서 기술책임자로 살아가기
스타트업에서 기술책임자로 살아가기스타트업에서 기술책임자로 살아가기
스타트업에서 기술책임자로 살아가기
 
JSRとJEPとJBSの見方や調べ方について
JSRとJEPとJBSの見方や調べ方についてJSRとJEPとJBSの見方や調べ方について
JSRとJEPとJBSの見方や調べ方について
 
はじめてのCF buildpack
はじめてのCF buildpackはじめてのCF buildpack
はじめてのCF buildpack
 
Intro to Node.js (v1)
Intro to Node.js (v1)Intro to Node.js (v1)
Intro to Node.js (v1)
 
Haskell Day2012 - 参照透過性とは何だったのか
Haskell Day2012 - 参照透過性とは何だったのかHaskell Day2012 - 参照透過性とは何だったのか
Haskell Day2012 - 参照透過性とは何だったのか
 
Official "push" and real-time capabilities for Symfony and API Platform (Merc...
Official "push" and real-time capabilities for Symfony and API Platform (Merc...Official "push" and real-time capabilities for Symfony and API Platform (Merc...
Official "push" and real-time capabilities for Symfony and API Platform (Merc...
 
Node.js Basics
Node.js Basics Node.js Basics
Node.js Basics
 
UI 開発をアジャイルに行うための Atomic Design
UI 開発をアジャイルに行うための Atomic DesignUI 開発をアジャイルに行うための Atomic Design
UI 開発をアジャイルに行うための Atomic Design
 

Semelhante a 실시간 웹 협업도구 만들기 V0.3

FUTURESTACK13: Mobile Apps, A DevOps Way from Jonathan Karon, Engineering Man...
FUTURESTACK13: Mobile Apps, A DevOps Way from Jonathan Karon, Engineering Man...FUTURESTACK13: Mobile Apps, A DevOps Way from Jonathan Karon, Engineering Man...
FUTURESTACK13: Mobile Apps, A DevOps Way from Jonathan Karon, Engineering Man...New Relic
 
Workers of the web - BrazilJS 2013
Workers of the web - BrazilJS 2013Workers of the web - BrazilJS 2013
Workers of the web - BrazilJS 2013Thibault Imbert
 
Hotcode 2013: Javascript in a database (Part 2)
Hotcode 2013: Javascript in a database (Part 2)Hotcode 2013: Javascript in a database (Part 2)
Hotcode 2013: Javascript in a database (Part 2)ArangoDB Database
 
Troubleshooting Live Java Web Applications
Troubleshooting Live Java Web ApplicationsTroubleshooting Live Java Web Applications
Troubleshooting Live Java Web Applicationsashleypuls
 
DIY Synthetic: Private WebPagetest Magic
DIY Synthetic: Private WebPagetest MagicDIY Synthetic: Private WebPagetest Magic
DIY Synthetic: Private WebPagetest MagicJonathan Klein
 
Taming Pythons with ZooKeeper
Taming Pythons with ZooKeeperTaming Pythons with ZooKeeper
Taming Pythons with ZooKeeperJyrki Pulliainen
 
Telco: Voice-Command Personal Agent Service with AWS Cloud (MBL202) | AWS re:...
Telco: Voice-Command Personal Agent Service with AWS Cloud (MBL202) | AWS re:...Telco: Voice-Command Personal Agent Service with AWS Cloud (MBL202) | AWS re:...
Telco: Voice-Command Personal Agent Service with AWS Cloud (MBL202) | AWS re:...Amazon Web Services
 
5 Ways Thinking Content-first Will Save Your Butt
5 Ways Thinking Content-first Will Save Your Butt5 Ways Thinking Content-first Will Save Your Butt
5 Ways Thinking Content-first Will Save Your ButtZURB
 
Vital.AI Creating Intelligent Apps
Vital.AI Creating Intelligent AppsVital.AI Creating Intelligent Apps
Vital.AI Creating Intelligent AppsVital.AI
 
Hadoop webinar-130808141030-phpapp01
Hadoop webinar-130808141030-phpapp01Hadoop webinar-130808141030-phpapp01
Hadoop webinar-130808141030-phpapp01Kaushik Dey
 
Engineering culture
Engineering cultureEngineering culture
Engineering culturePamela Fox
 
MongoTalk/Voyage
MongoTalk/VoyageMongoTalk/Voyage
MongoTalk/VoyageESUG
 
Vinted life embetterment
Vinted life embettermentVinted life embetterment
Vinted life embettermentAgile Lietuva
 
Introduction to Vaadin 7
Introduction to Vaadin 7Introduction to Vaadin 7
Introduction to Vaadin 7lastrand
 
Impactos no design com programação funcional
Impactos no design com programação funcionalImpactos no design com programação funcional
Impactos no design com programação funcionalLuiz Costa
 
Bring the Noise
Bring the NoiseBring the Noise
Bring the NoiseJon Cowie
 

Semelhante a 실시간 웹 협업도구 만들기 V0.3 (20)

FUTURESTACK13: Mobile Apps, A DevOps Way from Jonathan Karon, Engineering Man...
FUTURESTACK13: Mobile Apps, A DevOps Way from Jonathan Karon, Engineering Man...FUTURESTACK13: Mobile Apps, A DevOps Way from Jonathan Karon, Engineering Man...
FUTURESTACK13: Mobile Apps, A DevOps Way from Jonathan Karon, Engineering Man...
 
Workers of the web - BrazilJS 2013
Workers of the web - BrazilJS 2013Workers of the web - BrazilJS 2013
Workers of the web - BrazilJS 2013
 
Hotcode 2013: Javascript in a database (Part 2)
Hotcode 2013: Javascript in a database (Part 2)Hotcode 2013: Javascript in a database (Part 2)
Hotcode 2013: Javascript in a database (Part 2)
 
Paranoid Android
Paranoid AndroidParanoid Android
Paranoid Android
 
Troubleshooting Live Java Web Applications
Troubleshooting Live Java Web ApplicationsTroubleshooting Live Java Web Applications
Troubleshooting Live Java Web Applications
 
DIY Synthetic: Private WebPagetest Magic
DIY Synthetic: Private WebPagetest MagicDIY Synthetic: Private WebPagetest Magic
DIY Synthetic: Private WebPagetest Magic
 
Taming Pythons with ZooKeeper
Taming Pythons with ZooKeeperTaming Pythons with ZooKeeper
Taming Pythons with ZooKeeper
 
Telco: Voice-Command Personal Agent Service with AWS Cloud (MBL202) | AWS re:...
Telco: Voice-Command Personal Agent Service with AWS Cloud (MBL202) | AWS re:...Telco: Voice-Command Personal Agent Service with AWS Cloud (MBL202) | AWS re:...
Telco: Voice-Command Personal Agent Service with AWS Cloud (MBL202) | AWS re:...
 
Moscow 2013 10
Moscow 2013 10Moscow 2013 10
Moscow 2013 10
 
5 Ways Thinking Content-first Will Save Your Butt
5 Ways Thinking Content-first Will Save Your Butt5 Ways Thinking Content-first Will Save Your Butt
5 Ways Thinking Content-first Will Save Your Butt
 
Vital.AI Creating Intelligent Apps
Vital.AI Creating Intelligent AppsVital.AI Creating Intelligent Apps
Vital.AI Creating Intelligent Apps
 
Hadoop webinar-130808141030-phpapp01
Hadoop webinar-130808141030-phpapp01Hadoop webinar-130808141030-phpapp01
Hadoop webinar-130808141030-phpapp01
 
Engineering culture
Engineering cultureEngineering culture
Engineering culture
 
MongoTalk/Voyage
MongoTalk/VoyageMongoTalk/Voyage
MongoTalk/Voyage
 
Vinted life embetterment
Vinted life embettermentVinted life embetterment
Vinted life embetterment
 
Vaadin 7
Vaadin 7Vaadin 7
Vaadin 7
 
Introduction to Vaadin 7
Introduction to Vaadin 7Introduction to Vaadin 7
Introduction to Vaadin 7
 
Smartgears
SmartgearsSmartgears
Smartgears
 
Impactos no design com programação funcional
Impactos no design com programação funcionalImpactos no design com programação funcional
Impactos no design com programação funcional
 
Bring the Noise
Bring the NoiseBring the Noise
Bring the Noise
 

Mais de NAVER D2

[211] 인공지능이 인공지능 챗봇을 만든다
[211] 인공지능이 인공지능 챗봇을 만든다[211] 인공지능이 인공지능 챗봇을 만든다
[211] 인공지능이 인공지능 챗봇을 만든다NAVER D2
 
[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...
[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...
[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...NAVER D2
 
[215] Druid로 쉽고 빠르게 데이터 분석하기
[215] Druid로 쉽고 빠르게 데이터 분석하기[215] Druid로 쉽고 빠르게 데이터 분석하기
[215] Druid로 쉽고 빠르게 데이터 분석하기NAVER D2
 
[245]Papago Internals: 모델분석과 응용기술 개발
[245]Papago Internals: 모델분석과 응용기술 개발[245]Papago Internals: 모델분석과 응용기술 개발
[245]Papago Internals: 모델분석과 응용기술 개발NAVER D2
 
[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈
[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈
[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈NAVER D2
 
[235]Wikipedia-scale Q&A
[235]Wikipedia-scale Q&A[235]Wikipedia-scale Q&A
[235]Wikipedia-scale Q&ANAVER D2
 
[244]로봇이 현실 세계에 대해 학습하도록 만들기
[244]로봇이 현실 세계에 대해 학습하도록 만들기[244]로봇이 현실 세계에 대해 학습하도록 만들기
[244]로봇이 현실 세계에 대해 학습하도록 만들기NAVER D2
 
[243] Deep Learning to help student’s Deep Learning
[243] Deep Learning to help student’s Deep Learning[243] Deep Learning to help student’s Deep Learning
[243] Deep Learning to help student’s Deep LearningNAVER D2
 
[234]Fast & Accurate Data Annotation Pipeline for AI applications
[234]Fast & Accurate Data Annotation Pipeline for AI applications[234]Fast & Accurate Data Annotation Pipeline for AI applications
[234]Fast & Accurate Data Annotation Pipeline for AI applicationsNAVER D2
 
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load BalancingOld version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load BalancingNAVER D2
 
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지NAVER D2
 
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기NAVER D2
 
[224]네이버 검색과 개인화
[224]네이버 검색과 개인화[224]네이버 검색과 개인화
[224]네이버 검색과 개인화NAVER D2
 
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)NAVER D2
 
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기NAVER D2
 
[213] Fashion Visual Search
[213] Fashion Visual Search[213] Fashion Visual Search
[213] Fashion Visual SearchNAVER D2
 
[232] TensorRT를 활용한 딥러닝 Inference 최적화
[232] TensorRT를 활용한 딥러닝 Inference 최적화[232] TensorRT를 활용한 딥러닝 Inference 최적화
[232] TensorRT를 활용한 딥러닝 Inference 최적화NAVER D2
 
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지NAVER D2
 
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터NAVER D2
 
[223]기계독해 QA: 검색인가, NLP인가?
[223]기계독해 QA: 검색인가, NLP인가?[223]기계독해 QA: 검색인가, NLP인가?
[223]기계독해 QA: 검색인가, NLP인가?NAVER D2
 

Mais de NAVER D2 (20)

[211] 인공지능이 인공지능 챗봇을 만든다
[211] 인공지능이 인공지능 챗봇을 만든다[211] 인공지능이 인공지능 챗봇을 만든다
[211] 인공지능이 인공지능 챗봇을 만든다
 
[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...
[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...
[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...
 
[215] Druid로 쉽고 빠르게 데이터 분석하기
[215] Druid로 쉽고 빠르게 데이터 분석하기[215] Druid로 쉽고 빠르게 데이터 분석하기
[215] Druid로 쉽고 빠르게 데이터 분석하기
 
[245]Papago Internals: 모델분석과 응용기술 개발
[245]Papago Internals: 모델분석과 응용기술 개발[245]Papago Internals: 모델분석과 응용기술 개발
[245]Papago Internals: 모델분석과 응용기술 개발
 
[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈
[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈
[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈
 
[235]Wikipedia-scale Q&A
[235]Wikipedia-scale Q&A[235]Wikipedia-scale Q&A
[235]Wikipedia-scale Q&A
 
[244]로봇이 현실 세계에 대해 학습하도록 만들기
[244]로봇이 현실 세계에 대해 학습하도록 만들기[244]로봇이 현실 세계에 대해 학습하도록 만들기
[244]로봇이 현실 세계에 대해 학습하도록 만들기
 
[243] Deep Learning to help student’s Deep Learning
[243] Deep Learning to help student’s Deep Learning[243] Deep Learning to help student’s Deep Learning
[243] Deep Learning to help student’s Deep Learning
 
[234]Fast & Accurate Data Annotation Pipeline for AI applications
[234]Fast & Accurate Data Annotation Pipeline for AI applications[234]Fast & Accurate Data Annotation Pipeline for AI applications
[234]Fast & Accurate Data Annotation Pipeline for AI applications
 
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load BalancingOld version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing
 
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지
 
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
 
[224]네이버 검색과 개인화
[224]네이버 검색과 개인화[224]네이버 검색과 개인화
[224]네이버 검색과 개인화
 
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)
 
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
 
[213] Fashion Visual Search
[213] Fashion Visual Search[213] Fashion Visual Search
[213] Fashion Visual Search
 
[232] TensorRT를 활용한 딥러닝 Inference 최적화
[232] TensorRT를 활용한 딥러닝 Inference 최적화[232] TensorRT를 활용한 딥러닝 Inference 최적화
[232] TensorRT를 활용한 딥러닝 Inference 최적화
 
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지
 
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터
 
[223]기계독해 QA: 검색인가, NLP인가?
[223]기계독해 QA: 검색인가, NLP인가?[223]기계독해 QA: 검색인가, NLP인가?
[223]기계독해 QA: 검색인가, NLP인가?
 

실시간 웹 협업도구 만들기 V0.3