์๋ค ์. ์ฐ๋ฆฌ๋ stable์ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ ์ผ๋ถ ํจ๋๊ฐ ๋ฌด์์๋ก ์๋์ ๋ฉ์ถ๊ณ ์ฝ์์์ ์กํ์ง ์์ ์ค๋ฅ๋ฅผ ๋์ง๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
Uncaught Error: Failed assertion: Invalid changeset (checkRep failed)
์:
https://etherpad.tugraz.at/p/l3tsbet
์ด ๊ฒฝ์ฐ "๋ก๋ ์ค"์ค๋ฒ๋ ์ด๊ฐ ๋ชจ๋ ์์ ์ ์ฐจ๋จํฉ๋๋ค. ๋๋๋ก ์์ ํ ์์ผ๋ก ์ด ํจ๋์์ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ๋ณต์ฌ ๋ฐ ๋ถ์ฌ ๋ฃ๊ธฐ ๋ฌธ์ ๊ฐ ์๋ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
ํฅ๋ฏธ๋ก์ด ์ ์ ํ์ ์ฌ๋ผ์ด๋ (URL์ / timeslider๋ฅผ ์ถ๊ฐํ์ฌ ์ด๋ฆผ)๊ฐ ํญ์ ๋ฌธ์ ์์ด ์๋ํ๋ค๋ ๊ฒ์ ๋๋ค.
https://etherpad.tugraz.at/p/l3tsbet/timeslider
์ง๊ธ ์ฐ๋ฆฌ๋ HTML๋ก ๋ด๋ณด๋ด๊ธฐ + ๊ฐ์ ธ ์ค๊ธฐ (๋ชจ๋ ๋ณ๊ฒฝ ์ธํธ๋ฅผ ์์)ํ์ฌ ์๋์ผ๋ก ํจ๋๋ฅผ ์์ ํ๊ณ ์์ต๋๋ค. ๋ญ๊ฐ ์๋ชป๋ ๊ฑด์ง ์์ธ์?
์ต์ ๊ฐ๋ฐ ๋ธ๋์น๋ฅผ ์ฌ์ฉํด๋ณด๊ณ ์ฌ์ ํ ๋ฐ์ํ๋์ง ์๋ ค์ฃผ์ธ์.
์ด๊ฒ์ ์ฌ์ฉ์๊ฐ ๋ง์ prod ์๋ฒ์์ ์ฐ์ฐํ ๋ฐ์ํ์ฌ ์ฌํ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฌ์ํ ์ผ์ด ์๋๋๋ค.
๋๋ ๊ทธ๊ฒ์ด ๋์์ด๋๋ค๋ฉด, ๊นจ์ง ํจ๋๊ฐ ๊ฐ๋ฐ ์ค์ ๊นจ์ง ์ํ๋ก ์ ์ง๋๋์ง ํ
์คํธ ํ ์ ์์ต๋๋ค.
์, ๋ถํํฉ๋๋ค
๋ค์ ์ฃผ์ db๋ฅผ dev์ ๋ณต์ฌํ๊ฒ ์ต๋๋ค. ๊ฐ๋ฅํ ํ ๋นจ๋ฆฌ๋ณด๊ณ ํ๊ฒ ์ต๋๋ค. ๋น ๋ฅธ ์๋ต์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
๋ถํํ๋ ๊ฐ๋ฐ ๋จ๊ณ๋ก ์ฎ๊ฒจ๊ฐ๋ ๊ฒ์ ์์๋ ํจ๋๋ฅผ ์๋ฆฌํ์ง ๋ชปํ์ต๋๋ค. ํฅ๋ฏธ๋กญ๊ฒ๋ ์๋ฒ ์ด๋ (๊ฐ๋จํ SQL ๋ด๋ณด๋ด๊ธฐ / ๊ฐ์ ธ ์ค๊ธฐ)์ ํจ๋ ์ค ํ๋๋ฅผ "๋ณต๊ตฌ"ํ์ต๋๋ค. ์ ์๋ฒ (1.3.0์์๋)์์ ์๋ํ์ง๋ง ๋ค๋ฅธ ์์ ํจ๋๋ ์๋ํ์ง ์์ต๋๋ค. ์ฌ์ ํ ๊ฐ์ ์ค๋ฅ์ ๋๋ค.
์ด๊ฒ์ ์ ๋ง ์ด์ํ ๋ฒ๊ทธ์ด๋ฉฐ ํจ๋๋ ๋๋๋ก PROD์์๋ "์๊ฐ ์๋ฆฌ"ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ฉฐ ๋ณ๊ฒฝ ์ฌํญ์ ์์ต๋๋ค.
์ด๋ก ์์ด ๋ฌธ์ ๋ ์ ํ ๋ฐ์ํ์ง ์์์ผํฉ๋๋ค. ์๋ชป๋ ๋ฐ์ดํฐ๊ฐ ์ง๊ธ์ ๊ธธ์ ์ฐพ์ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค ..
๋๋ ์ด๊ฒ์ ์ด์ด๋๊ณ ์๋ก์ด ๋ฐ์ดํฐ์์ ๋ฐ์ํ๋ฉด ๊ทธ๊ฒ์ ํด๊ฒฐํ ์ ์์ต๋๋ค ..
"์๋ก์ด ๋ฐ์ดํฐ"๋ ๋ฌด์์ ์๋ฏธํฉ๋๊น? PROD๋ฅผ ๊ฐ๋ฐ์ ์ ์ฉํ๊ณ ์ ์์๋ ํจ๋๋ฅผ ๊ตฌํด์ผํฉ๋๊น?
ํ , ๊ทธ๊ฒ์ ์ ์ฌ์ ์ผ๋ก ๊ณ ํต ์ค๋ฌ์ธ ๊ฒ์ ๋๋ค. ์๋ง๋ ์ต๋ ๋ช ์ฃผ ์์ ๋์ฌ 1.4๋ฅผ ๊ธฐ๋ค๋ฆด ๊ฒ์ ๋๋ค.
์ฐ๋ฆฌ๋ ๊ทธ๋ ๊ฒ ํ ์ ์์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค.
๋๋ ๋ํ ๋์ผํ ์ด์ํ ๋ฌด์์์ฑ์ ๊ฐ์ง ๊ทธ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. etherpad-lite 1.4๋ก ์ ๋ฐ์ดํธํ๋๋ฐ ์ฌ์ ํ ์์ต๋๋ค. ํจ๋ ์ค ํ๋์ URL http://etherpad.usabilidoido.com.br : 8080 / p / 07318a9b2b5666637d870fc50656323620af4df4
๋๋ ์ง๊ธ 1.4๋ก ์ ๊ทธ๋ ์ด๋ํ๋ ๊ณผ์ ์ ์์ผ๋ฉฐ ์ ๋ฒ์ ์ผ๋ก ์คํ๋๊ธฐ๋ฅผ ํฌ๋งํ๋ฏ๋ก ์ ๋ฒ์ ์์ ์คํ ํ ํ ์ ํจ๋์ ์ ๊ฒฐํจ์ด ์๋์ง ํ์ธํ ์ ์์ต๋๋ค.
@usabilidoido ๋ ์ฌ์ฉ์์๊ฒ ํจ๋๋ฅผ ๋ด๋ณด๋ด๊ณ ๊ฐ์ ธ ์ค๋๋ก http://etherpad.usabilidoido.com.br : 8080 / p / 07318a9b2b5666637d870fc50656323620af4df4 / timeslider
html๋ก ๋ด ๋ณด๋ธ ๋ค์ ์ ํจ๋๋ก ๊ฐ์ ธ์ต๋๋ค.
1.4์์์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ์์๋ ํจ๋์์ ๋ธ๋ผ์ฐ์ ์ Failed assertion
์ค๋ฅ๊ฐ ํ์๋๋ฉด ๋ช
๋ น ์ค์ [WARN] client - Uncaught TypeError: Cannot read property 'length' of undefined
Failed assertion
๊ฐ ํ์๋ฉ๋๋ค.
/ timeslider ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ํด @ Ra1d3n์ ๋ํ ๋ชจ์ ํ. ๊ฑฐ๊ธฐ์์ ํจ๋ ์ฝํ ์ธ ์ ์ฌ์ ํ ์ก์ธ์ค ํ ์ ์๋ค๋ ์ฌ์ค์ ๊ธฐ์๊ฒ ์๊ฐํฉ๋๋ค.
์ด๊ฒ์ ์ง๊ฐ์ด์ง๋ง ์ํ๋ ๊ฒฝ์ฐ ๋ฐฉ๊ธ ๋ง๋ ์คํ์ ์ธ try/client-init-remove-checkRep
๋ธ๋์น๋ฅผ ์ฌ์ฉํด๋ณด์ญ์์ค. (์ด๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก ์ํํ ์ผ์ด์ง๋ง ์๋ํด ๋ณผ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.)
๋ชจ๋ ๊ฒ์ 1.4๋ก ์ ๊ทธ๋ ์ด๋ํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด์ ์ฐ๋ฆฌ๋ ๋ค์ ๋ถ๋ฌ์ง ํจ๋๋ฅผ ๊ฐ์ก์ต๋๋ค. ์ฌ์ ํ ์ ๋ฐ์ดํธ ์ ์ ๊ณ ์ฅ๋ ๊ฒ์ผ ์ ์์ง๋ง ํ์คํ์ง ์์ต๋๋ค. ๊ณ์ ์ฐพ์ ๋ณผ๊ฒ์.
@marcelklehr ๋ถํํ๋ ํ๋ก๋์ ์๋ฒ๋ฅผ _dangerous_ ๋ฒ์ ์ผ๋ก ์ด๋ํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฆฌ์์ค๊ฐ ์๊ธฐ ๋๋ฌธ์ ์์ฒญ์ ๋ณด์กฐ ์๋ฒ๋ก ๋ฏธ๋ฌ๋ง ํ ์ ์์ต๋๋ค. :-/
์ฃ์กํฉ๋๋ค. ๋ช
ํํ์ง ์์์ต๋๋ค. ํ๋ก๋์
์์ try/client-init-remove-checkRep
๋ฅผ ์คํํ์ง ๋ง๊ณ ํด๋น ๋ธ๋์น์์ ์คํ์ค์ธ etherpad๋ก ์์๋ ํจ๋์ ์ก์ธ์ค ํด๋ณด์ญ์์ค.
๊ฒฝ์ฐ์ ๋ฐ๋ผ ์ ๊ทํ๊ฐ ์ ๋๋ก ์๋ํ์ง ์์ ์ ์๋ค๊ณ ์์ฌ๋๊ธฐ ๋๋ฌธ์ ํด๋น ๋ถ๊ธฐ์์ checkRep
์ ์ ๊ฑฐํ์ต๋๋ค. ๋ฐ๋ผ์ ๊ณ ์ฅ๋ ํจ๋๊ฐ ์๋ฌด ๋ฌธ์ ์์ด ํด๋น ๋ถ๊ธฐ์์ ์๋ํ๋ฉด์ด ๋ฐฉ๋ฒ์ ๋ค์ ๊ฒํ ํด์ผํฉ๋๋ค.
@marcelklehr ๋ฐฉ๊ธํ๋๋ฐ ์ํ๊น๊ฒ๋ ๋์์ด๋์ง ์์์ต๋๋ค.
๋ฐฉ๋ฒ:
git fetch
git checkout try/client-init-remove-checkRep
git status
On branch try/client-init-remove-checkRep
Your branch is up-to-date with 'origin/try/client-init-remove-checkRep'.
๋ณ๊ฒฝ ์ฌํญ์ด ์ค์ ๋ก ํ์ผ ์์คํ ์ ์์์ ํ์ธํ์ต๋๋ค. (์ฃผ์๊ณผ ์ค ๋ฐ๊ฟ์ด ์์) ์ค๋ฅ๋ ์ฌ์ ํ ๋์ผํฉ๋๋ค.
@ericpedia๊ฐ ์ธ๊ธ ํ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ผ๋ฉฐ ์์๋ ํจ๋ ์ด์ธ์ ํจ๋์์๋ ๋ฐ์ํ์ง ์์์ต๋๋ค.
์๋ฒ์ ์ฝ์ :
[2014-05-09 16:55:39.152] [WARN] client - Uncaught TypeError: Cannot read property 'length' of undefined -- { errorId: 'dTtndCRA5gonLZyvMlqw',
msg: 'Uncaught TypeError: Cannot read property \'length\' of undefined',
url: 'http://localhost:9001/p/OkTJWMYVNs',
linenumber: 15,
userAgent: 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.131 Safari/537.36' }
์๋ฒ๋ฅผ ์ข ๋ฃํ๋ฉด ๋ฉ์์ง๊ฐ ํด๋ผ์ด์ธํธ์ ํ์๋ฉ๋๋ค.
์์๋ ํจ๋์ SQL ๊ฐ์ ธ ์ค๊ธฐ๋ฅผ ์ ๊ณต ํ ์๋ ์์ง๋ง ๋จผ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ ํํ ๋ฌด์์ ์ถ์ถํด์ผํ๋์ง ์๋ ค ์ฃผ์ ์ผํฉ๋๋ค. :-)
์ค์ ํจ๋ ๋ด์ฉ์ ๋งค์ฐ ์ ์ฉ ํ ๊ฒ์ด๋ฏ๋ก db ํค pad:<PADID>
(http://etherpad.org/doc/v1.4.0/#index_pad_padid) ๋ฐ ์๋ง๋ ๋ช ๊ฐ์ง ๋ง์ง๋ง ๊ฐ์ ํ ์ผ ๊ฒ์
๋๋ค.
์ ์ ๊ฐ๊น์์ง๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
checkPad ๋งํ๋ค :
$ bin/checkPad <padID>
[WARN] console - DirtyDB is used. This is fine for testing but not recommended for production.
[ERROR] console - Bad changeset at revision 4901 - Failed assertion: mismatched apply: 11636 / 11635
[ERROR] console - Bad changeset at revision 11401 - Failed assertion: mismatched apply: 42094 / 42093
[ERROR] console - Bad changeset at revision 12301 - Failed assertion: mismatched apply: 48875 / 48874
[ERROR] console - Bad changeset at revision 13601 - Failed assertion: mismatched apply: 60227 / 60226
[INFO] console - finished
๋ชจ๋ ๊ฒฝ์ฐ์ ๋ถ์ผ์น ์ ์ฉ์ ํด๋น ๋ณ๊ฒฝ ์งํฉ์ด ์ค์ ์กด์ฌํ๋ ๊ฒ๋ณด๋ค ํ ๋ฌธ์ ๋ ์ ์ ๊ฒ์ผ๋ก ์์ํ์์ ์๋ฏธํฉ๋๋ค (์ : ์๊ธฐ์น ์์ ๋ฌธ์ ํ๋). db ๋คํ๋ฅผ ์กฐ์ฌํ ํ ์ด๋ฌํ ๋ชจ๋ ๋ณ๊ฒฝ ์ธํธ๊ฐ atext๊ฐ ์ฒจ๋ถ ๋ ๊ฐ์ ํ์ ๋ฐ๋ฅธ๋ค๋ ๊ฒ์ ์์์ต๋๋ค (๋ชจ๋ ๊ฐ์ ํ์ ์ ์ฒด ํจ๋ ๋ด์ฉ์ด ํฌํจ๋์ง๋ ์์ง๋ง ๋์ ๋ธํ ๋ง ํฌํจ๋์ง๋ง ์ฑ๋ฅ์์ ์ด์ ๋ก ์ ์ฒด ๋ด์ฉ์ด ์์ฃผ ํฌํจ๋จ). ์ฒจ๋ถ).
์๋ง๋ ๊ฐ์ ์ ์ ์ฅํ๊ฑฐ๋ ์ ํจ๋ ํด๋ผ์ด์ธํธ์ ๋ํ ํ์ฌ ํ ์คํธ๋ฅผ ๋ง๋ค ๋์ด ๋ฉํ ์์ฑ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ ๊ฒ์ ๋๋ค.
์บ์ ๋ ํ ์คํธ ๋์ ๊ณ์ฐ ๋ ํ ์คํธ๋ฅผ ์ฌ์ฉํ๋๋ก checkPad๋ฅผ ๋ค์ ์์ฑํ๊ณ ํจ๋๋ฅผ ํต๊ณผํ์ต๋๋ค. ์บ์ ๋ atext๋ ์ ํํฉ๋๋ค! ์ด๋ก ์ธํด client_vars์ ๋ํ ์ ์ฒด ํ ์คํธ๋ฅผ ๊ณ์ฐํ๋ ์ผ๋ถ ์๊ณ ๋ฆฌ์ฆ์ ๋ฒ๊ทธ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค!
์ง๊ธ๊น์ง ์๊ณ ํ์ จ์ต๋๋ค. Marcel. ์ด ๋ฌธ์ ๋ฅผ ๊ฑฐ์ ํด๊ฒฐ ํ ๊ฒ ๊ฐ์ต๋๋ค.
์, client_vars ์์ฑ๊ธฐ๊ฐ ์๋๋๋ค. ์บ์ ๋ ํ ์คํธ๋ฅผ ์์ฑํ๋ ์๊ณ ๋ฆฌ์ฆ์ด ์์๋์์ต๋๋ค.
@ Ra1d3n ๋น ๋ฅธ ์์ ์ผ๋ก ๋ชจ๋ ํค ๊ฐ์ ( revNo % 100 == 0
)์์ atext ๋ฉํ ์์ฑ์ ์ญ์ ํ์ฌ ์์๋ ํจ๋๋ฅผ ๋ ์ด๋ฆด ์ ์์ต๋๋ค. ๊นจ์ง ํจ๋์ ๊ด๋ จ๋ ๋ชจ๋ ๋ ์ฝ๋๋ฅผ "์ฌ ์ฝ์
"ํ๋ ๊ฒ์ ์ค๋ ์ ์ ์ ์ฌํ ๋ฌธ์ ์ ๋ํ ์์ ์ผ๋ก๋ณด๊ณ ๋์์ต๋๋ค. ์ด์ ์๋ ์ด์ ๋ฅผ ์ ์ ์์ต๋๋ค. :)
@marcelklehr ๊ทธ๋ฌ๋ฉด EP
checkPad ์คํฌ๋ฆฝํธ๋ฅผ ์ฝ๊ฐ ๋ณ๊ฒฝํ์ต๋๋ค. ์ฌ๊ธฐ ์ฐธ์กฐ : # 1653
๊ทธ๋ฌ๋ ์ด๊ฒ์ ๋ ๋๋ฌ์ด ํดํน์
๋๋ค. ๋ด ์คํฌ๋ฆฝํธ๋ก์ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๋ฉด ํจ๋๋ฅผ ์์ ํ๋ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํฉ๋๋ค.
๋ฉ์ ธ์, ๊ธฐ๋ํฉ๋๋ค. ํ์ฌ ์ฐ๋ฆฌ๋ ์ผ์ฃผ์ผ์ ํ ๊ฐ ์ ๋์ ๋ถ๋ฌ์ง ํจ๋๋ฅผ ์ป์ผ๋ฏ๋ก ์ ์ ํ ์์ ์ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค. :-) ๊ฐ์ฌ.
๋ค, ๋๋ณธ์ ์๊ฐํ๊ณ ์์์ด์.
๋ฐ๋ผ์ ๊ณ์ฐ ๋ ํ ์คํธ์ ์บ์ ๋ ํ ์คํธ ์ฌ์ด์ ์ฐจ์ด๋ "ะบะพะฝัะตััะพะฒ"๊ฐ ์ด๋ป๊ฒ ๋ "ะบะพ ัะตััะพะฒ"๋ก ๋ฐ๋ ์์์ ๋ณด์ฌ์ค๋๋ค. ๋ค๋ฅธ ๋ฒ์ ์์๋ "ะท"๋ " "๋ก ๋ฐ๋ ์์ต๋๋ค.
๋ฌด์จ ์ผ์ธ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ด ๋ฌธ์๋ Unicode BMP, afaik์ ์์ผ๋ฏ๋ก ์ด๋ป๊ฒ๋์๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
@ Ra1d3n ํจ๋์ ๋ณํ์ ํค ๊ฐ์ 4900, 11400, 12300 ๋ฐ 13600์์ ๋ฐ์ํฉ๋๋ค (๋ชจ๋ 100 ๋ฒ์งธ ๊ฐ์ ์ ํค ๊ฐ์ ์ด๋ฏ๋ก ์ ์ฒด ํจ๋ ๋ด์ฉ์ ์บ์ ํจ์ ์๋ฏธํฉ๋๋ค). ๋ํ ํจ๋ ๋ ์ฝ๋์ ์ ์ฅ๋ AttributedText๋ ์์๋์์ต๋๋ค. ๋ค๋ฅธ ๋ชจ๋ ํค ์์ ์ ๊ด์ฐฎ์ต๋๋ค. ( ์ด ์คํฌ๋ฆฝํธ๋ก ๋ถ์ ๋จ)
๋ฌธ์๊ฐ ๋ฌด์์๋ก ๋ณด์ ๋๋ค. ์ ๋ง ํ์ด ๋์จ ๊ฒ์ ์์ต๋๋ค. ํจํด์ด ๋ณด์ด์ง ์์ต๋๋ค.
AttributedText๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ ๋ ๋ญ๊ฐ ์๋ชป๋์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๋๋ก ํจ๋๊ฐ ๊นจ์ง ํค ์์ ์ฌ์ด์ ๋ณต๊ตฌ๋๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋ ํ
์คํธ๊ฐ ์ข์ ๊ฒ ๊ฐ์ต๋๋ค. ๋๋ก๋ db์ ์ ์ฅ๋๋ฉด ์ด๋ป๊ฒ ๋ ์์๋ฉ๋๋ค. ์์ฑ์๊ฐ ๋ค์ ํค ๊ฐ์ ํ์ด ๋ง๋ค์ด์ง๊ณ ํด๋น ๊ฐ์ ํ์ด ์์๋์ง ์์ ๋๊น์ง ๋ฌธ์๋ฅผ ๊ณ์ ํธ์งํ๋ฉด ์๋ฌด๋ ๋์น ์ฑ์ง ๋ชปํ ๊ฒ์
๋๋ค.
๊ทธ๋ฌ๋ ๋ฉ๋ชจ๋ฆฌ์์๋ ์ ํจํ AText๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฑ๊ณต์ ์ผ๋ก ์ ์ฅํ๊ธฐ ์ํด ์๋ฒ๊ฐ _before_ ๊ด๋ฆฌ๋ฅผ ์ข
๋ฃํ๋ฉด ๋ค์ ์๋ฒ ์์์ ํจ๋๊ฐ ์์๋ฉ๋๋ค.
@marcelklehr ์ ์ฝ๋ฉ๋์ง ์์ ํ๋ฌ๊ทธ์ธ์ผ๋ก ์ธํด etherpad ์ถฉ๋์ด ๋ฐ์ํ๊ณ ๋ช ๋ฒ ๋ณต๊ตฌ๋์์ต๋๋ค. ์ด๊ฒ์ด ์์ธ ์ผ ์ ์์ต๋๊น? ๋งค๋ฒ ์์๋๋ ๋ฌธ์๊ฐ ํ๋๋ผ๋ ๊ฒ์ด ์ด์ํฉ๋๋ค.
ํจ๋์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ ๋ค์ ์ฝ์
ํ๋ ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋ค์์ต๋๋ค. ๋ด ๊นจ์ง ํจ๋์์ ์คํฌ๋ฆฝํธ๊ฐ ์๋ํ์ง ์์์ต๋๋ค.
@ Ra1d3n ์ฌ๊ธฐ์์ ์คํฌ๋ฆฝํธ๋ฅผ ๋ค์ด๋ก๋ ํ ์ ์์ต๋๋ค : https://github.com/Gared/etherpad-lite/blob/pad-repair-script/bin/repairPad.js
์ด ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๋ ๋์ etherpad ์ธ์คํด์ค๊ฐ ์คํ๋๊ณ ์์ง ์์์ง ํ์ธํ์ญ์์ค.
@Gared ์คํฌ๋ฆฝํธ์์ ๊ฐ ์ ์ด๋์์ ์ป์ต๋๊น? ๋ด checkPad ํฌํฌ์์ ์์ ํ๊ณ ๋ค์ ๊ณ์ฐ ๋ AttributedText ๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฝ์ ํ๋๋ก ์กฐ์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
@ Ra1d3n Etherpad ์ถฉ๋์ ๋ฐ์ดํฐ ์์์ ์ผ์ผํฌ ๊ฐ๋ฅ์ฑ์ด ๋ฎ์ต๋๋ค.
@marcelklehr ์ด๋ฌํ ๊ฒฝ์ฐ ์ฌ๋ฐ๋ฅธ ๋ฉ๋ชจ๋ฆฌ ๊ฐ์ด ์์ค ๋์๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๋ฅผ ๋ ์ ๋ณด์ด๊ฒ ๋ง๋ค์์ ๊ฒ์ ๋๋ค.
@marcelklehr ์ด ์คํฌ๋ฆฝํธ๋ extractPadData ์คํฌ๋ฆฝํธ์ ํฌํฌ์ ๋๋ค. ๊ฐ๊ณผ ํค๋ ์์ ๊ธฐ๋ฅ์๋ก๋๋ฉ๋๋ค. ์ด๊ฒ๋ค์ ๋ชจ๋ ํจ๋์ ํค์ ๋๋ค.
@Gared์์ repairPad.js ์คํฌ๋ฆฝํธ๋ ๋ด ๊ณ ์ฅ ํจ๋๋ฅผ ๊ณ ์ ํ๋ค. ์ด ์์ ์ฌํญ์ด ๋ค์ etherpad-lite ๋ฒ์ ์ ํฌํจ๋ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๊น?
๋ฌผ๋ก ํ ์์ฒญ์ ๋ณด๋ด๊ฑฐ๋ @Gared ์๊ฒ ์์ฒญ
์ด๋ฆฐ pull request # 2210
๋ด etherpad๋ 1.4.1์์ ์คํ ์ค์ด๋ฉฐ ์์์ ์ค๋ช
ํ ๊ฒ๊ณผ ๋์ผํ ๋ฌธ์ ๊ฐ 3 ๋ฐฐ ๋ฐ์ํ์ต๋๋ค. ํจ๋๋ฅผ๋ก๋ ํ ์ ์์ง๋ง / timeslider๊ฐ ์ ์๋ํฉ๋๋ค.
๊ทธ๋ค ์ค 2 ๋ช
์ ์ด์ ์๋ฌด๊ฒ๋ํ์ง ์๊ณ ์ฌ์คํ๋ฉ๋๋ค.
์ธ ๋ฒ์งธ ํจ๋์์ repairPad.js ์๋์ ์คํจํ์ต๋๋ค. URL์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. +1 : http://portail.univ-lille1.fr/etherpad/link.jsp?groupID=g.jfobkKVrkydeTwLY&padID=SES_Grp8_Macroeconomie("utilisez le pad avec l' invitexy "๋ฅผ ํด๋ฆญํ์ฌ paditself.
repairPad์ ์ํด ๊ณ ๋ ค๋์ง ์๋ ๋น์ ์์ ์ธ ๊ฐ์ ๊ฐ์ง ๋ณ๊ฒฝ ์งํฉ์ด ์๊ฑฐ๋ git์์ ๋ณด์ง ๋ชปํ reparPad.js์ ์ ๋ฆด๋ฆฌ์ค๊ฐ ์์ต๋๊น?
์ฐ๋ฆฌ๋ ์ง๊ธ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ฐ๋ฐํ๊ณ ํ ์คํธํ์ญ์์ค :) ๊ฐ์ฌํฉ๋๋ค!
์๋ ํ์ธ์, ๋ฐฉ๊ธ ์ด๋ฐ ์ผ์ด ๋ฐ์ํ์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋ง์ง๋ง ๋ฆด๋ฆฌ์ค ๋ฒ์ ์ธ 1.5.7์ ์คํํฉ๋๋ค. ๋ฐฑ์๋๋ MySQL ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ์ผ์ผ์ผฐ์ ์์๋ ์ฌ์ฉ์ ์์ ์ ๋ํ ์งํ๊ฐ ์์ต๋๋ค.
๋ฌธ์ ์ ํจ๋ : https://etherpad.wikimedia.org/p/iOS-iteration-planning
ํ์ ์ฌ๋ผ์ด๋ ํธ๋ฆญ์ ํตํด ํจ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ ์ค๋ ๊ฒ์ ์ ์๋ํฉ๋๋ค. ๊ทธ๋ฌ๋ ํจ๋๋๋ก๋๋์ง ์์ต๋๋ค.
๋์์ด๋๋ ๊ฒฝ์ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ชจ๋ ํญ๋ชฉ์ ๋คํํ๊ณ ๋๋ฒ๊น ์ ์ํด ์ ๊ณต ํ ์ ์์ต๋๋ค.
์๋
ํ์ธ์, ์์นจ์์ด ํ ๋ก ์ํ์ต๋๋ค.
08:47 <webzwo0i> mutante : ํจ๋๋ฅผ ๋๋ฒ๊น
ํ์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก์ด ์์
์ ์ํํด์๋ ์๋์ง๋ง ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐฑ์
์ด์๋ ๊ฒฝ์ฐ (๊ทธ๋ฆฌ๊ณ ๋ด๋ณด๋ด๊ธฐ / ์ด๋ ํจ๋๋ฅผ ๋ง๋ ํ
ํจ๋) ์ธ ๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํญ๋ชฉ์ ๋ณ๊ฒฝํ ์ ์์ผ๋ฉฐ ํจ๋๊ฐ ๋ค์ ์ ๋๋ก ์๋ํด์ผํฉ๋๋ค. ์ธ ๊ฐ์ mysql ๋ช
๋ น์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
mysql> update `store` set `value` = replace(`value`,'????','??') where `key` like "pad:iOS-iteration-planning";
mysql> update `store` set `value` = replace(`value`,'????','??') where `key` like "pad:iOS-iteration-planning:revs:7200";
mysql> update `store` set `value` = replace(`value`,'????','??') where `key` like "pad:iOS-iteration-planning:revs:7300";
08:49 <webzwo0i> ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ utf8mb4 charset ๋๋ utf8์ ์คํ ์ค์ธ์ง ํ์ธํ ์ ์์ต๋๊น?
08:51 <webzwo0i> oha ups mysql-commands๋ฅผ ์ ์ฉํ์ง ๋ง์ธ์. ์ด์ฉ๋ฉด ๋ด๊ฐ ์กฐ๊ธ ๋นจ ๋์ ์๋ ์์ต๋๋ค :-) ๋จผ์ ๋ฌด์ธ๊ฐ๋ฅผ ํ์ธํด์ผํฉ๋๋ค
09:08 <webzwo0i> mh nope ๊ด์ฐฎ์ ๊ฒ์
๋๋ค. ํ
์คํธํ์ญ์์ค ... ์ต์ ๋ฆด๋ฆฌ์ค ๋๋ ๋ค๋ฅธ ๊ฒ์ ์คํํ๋์ง, ์ด๋ค ํ๋ฌ๊ทธ์ธ์ ํ์ฑํํ๋์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
09:47 <webzwo0i> wikimedia์ ppl์ด ์๋ก๋ฅผ ์๋์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง "Brian"์ด๋ผ๋ ์ฌ์ฉ์๊ฐ ๋๊ตฐ์ง ์ ์ ์๋ค๋ฉด ๊ทธ๊ฐ ์ฌ์ฉํ๋ ๋ธ๋ผ์ฐ์ ๋ฅผ ๋ฌผ์ด๋ณผ ์ ์์ต๋๊น? ๊ทธ๋งํผ
์ด์ ๋ ๋ฒ๊ทธ๊ฐ ๋ฌด์์ธ์ง ๋ณผ ์ ์์ง๋ง ๋ด ๋ธ๋ผ์ฐ์ ์์ ํธ๋ฆฌ๊ฑฐ ํ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค (์๋์ผ๋ก ๋ง ํธ๋ฆฌ๊ฑฐ ํ ์ ์์ง๋ง ppl์ด ์ ๋์ ์ด์ง ์๊ธฐ ๋๋ฌธ์
๋ชฉ์ )
09:49 <webzwo0i> (๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ์๋ง๋ ์๋ฒ ์ธก๊ณผ ํด๋ผ์ด์ธํธ ์ธก์ ๋ ๊ฐ์ง ๋ฒ๊ทธ๊ฐ์์ ๊ฒ์
๋๋ค)
ํ์ํ ์ ๋ณด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ utf8 ๋๋ utf8mb4 ์ธ ๊ฒฝ์ฐ์
๋๋ค.
๋ฌธ์ ๊ฐ๋๋ ๋ณ๊ฒฝ ์งํฉ์ ์ถ์ถํ์ต๋๋ค. ์ ์ฉํ์ง ์์ผ๋ฉด ํ์ ์ฌ๋ผ์ด๋๊ฐ ์ด๋ฌํ ์์ ์ฌํญ์ ํด๊ฒฐํ์ง ๋ชปํฉ๋๋ค.
mysql> update `store` set `value` = replace(`value`,'????','??') where `key` like "pad:iOS-iteration-planning:revs:7105";
์์ ์ ๋ฐ์ดํธ์ ํจ๊ป ํจ๋๋ฅผ ๋ค์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ฟก ๋นต๋จ
๊ทธ๋, ๋ฎค ํํ ๊ฐ ๋์๊ฒ ๋งํ ๊ฑธ ์์ ์ฑ์ด. ๋๋ github ๋ฌธ์ ์ ๋ํด์๋ ํ์ ์กฐ์น๋ฅผ ์ทจํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. "Brian"์ด ๋๊ตฌ์ด๋ฉฐ ์ด๋ค ๋ธ๋ผ์ฐ์ ๋ฅผ ์ฌ์ฉํ๋์ง ์ถ์ ํ๊ฒ ์ต๋๋ค.
๋ฐ๋ผ์ ์คํ ์ด ํ ์ด๋ธ์ ๊ฝค ์ค๋ซ๋์ utf8mb4์ ๋๋ค. utf8 ์ด์์ง๋ง 6 ์์ ๋ค๋ฅธ ๋ฌธ์ ๋ก ์ธํด utf8mb4๋ก ๋ณํํ์ต๋๋ค. ํนํ 2015 ๋ 6 ์ 23 ์ผ์
https://github.com/ether/etherpad-lite/issues/2522#issuecomment-114441189 ;-)
์ฌ์ฉ์ / ๋ธ๋ผ์ฐ์ ๋ฅผ ์ฐพ์ ํ์๊ฐ ์์ต๋๋ค. ์ด์ ๋ฒ๊ทธ๋ฅผ ์ฌํ ํ ์ ์์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค!
์ต์ ๋ฆด๋ฆฌ์ค๋ฅผ ์ฌ์ฉ ์ค์ด๋ฏ๋ก dbSettings ๋ด์ settings.json์ "charset": "utf8mb4"๋ฅผ ์ฝ์ ํด์ผํฉ๋๋ค. ์ด์ settings.json.template์ ์์ต๋๋ค. ์ด๊ฒ์ด ํ์ํ์ง ํ์ธํ ์ ์์ต๋๋ค.
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';
ํด๋ผ์ด์ธํธ (๋๋ ์ฐ๊ฒฐ?)๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ
์ด๋ธ ์์ฒด๊ฐ 4 ๋ฐ์ดํธ utf8์ ์ ์ฅํ ์ ์์ง๋ง ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ ์ฐ๊ฒฐ์ 4 ๋ฐ์ดํธ utf8์ ๊ธฐ๋ํ์ง ์๋ ๊ฒฝ์ฐ utf8mb4๋ฅผ ํ์ํด์ผํฉ๋๋ค.
์ด๊ฒ์ ์ด์ ํจ๋๋ฅผ ์๋ฆฌํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ชจ๋ ํจ๋๋ฅผ ๋ฐ๋ณตํ๊ณ bin / checkPad.js๋ฅผ ์ฌ์ฉํ์ฌ ๋น์ทํ ๋ฌธ์ ๊ฐ์์ ์์๋ ํจ๋ ์์ ํจ๋๋ฅผ ํ์
ํ ์ ์์ต๋๋ค. ์ํฉ์ ๋ฐ๋ผ ์์ ๊ฒฝ์ฐ์ ๊ฐ์ด ์๋ฆฌ๊ฐ ๋งค์ฐ ์ฌ์ธ ์ ์์ต๋๋ค (์ผ๋ถ ๋ฌธ์๊ฐ ๊นจ์ง ์ ์์). ์์๋ ํจ๋๊ฐ ๋ง์ด ์์ผ๋ฉด์ด๋ฅผ ์๋ํํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ฌ๋๋ค์ด ์ค์ ๋ก ๊ธ์ ์ธ ๋ ์ด๋ฌํ ๋ฌธ์ ๊ฐ ๋ํ๋์ง ์๋ ์ด์ ๋ ๋๋ถ๋ถ์ ์ฌ์ดํธ๊ฐ ์ฑ๋ฅ์ ์ํด ueberDB์ ๋ด๋ถ ์บ์๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด ์์ ์๋ฐ ์คํฌ๋ฆฝํธ ์บ์๋ ์ ๋ ์ฝ๋๋ฅผ ์์ ํ ์ธ์ํฉ๋๋ค. ์บ์๊ฐ ํ๋ฌ์๋๊ฑฐ๋ etherpad๊ฐ ๋ค์ ์์ ๋ ์๋ง์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ํญ๋ชฉ์ ๊ฐ์ ธ์์ผํฉ๋๋ค.
๋น์ ์ด ์ง์ ํ๋๋ก ํจ๋๋ฅผ ์๋ฆฌํ์ต๋๋ค. ์ฐ์ ๋ 4 ๊ฐ์ ๋ฌผ์ํ๊ฐ ์ด๋ฐ ์์ผ๋ก PAD๋ฅผ ์์์ํฌ ์ ์๋ค๋ ์ฌ์ค์ ์์๋ด๋ ๊ฒ์ด ํฅ๋ฏธ ๋กญ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ถํจํ ์ฒด์ธ์ง ์ ์ ํจ๋์ ๋์ ๋นํด ๋๋ฌด ์ค๋๋์์ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ๊ทํ์ ์ค๋ช ์ ์๋ฏธ๊ฐ ์์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค.
"charset": "utf8mb4"๋ก ๊ตฌ์ฑ์ ์ ๋ฐ์ดํธํ์ต๋๋ค.
wikimedia์์ phabricator ํฐ์ผ์ ํ๋ก์ฐํ๊ณ ์์ง๋ง ๊ฑฐ๊ธฐ์ ๊ณ์ ์ด ์์ผ๋ฏ๋ก ์ฌ๊ธฐ์ ๊ฒ์ํฉ๋๋ค.
๋ ๋ฒ์งธ ํ์ ๋ ํจ๋๋ ๋ค์์ ์ฌ์ฉํ์ฌ ์๋ฆฌ ํ ์๋ ์์ต๋๋ค.
update `store` set `value` = replace(`value`,'????','??') where `key` like "pad:iOS_Retrospectives:revs:1120";
update `store` set `value` = replace(`value`,'????','??') where `key` like "pad:iOS_Retrospectives:revs:1254";
update `store` set `value` = replace(`value`,'????','??') where `key` like "pad:iOS_Retrospectives:revs:1216";
update `store` set `value` = replace(`value`,'????','??') where `key` like "pad:iOS_Retrospectives:revs:1108";
update `store` set `value` = replace(`value`,'????','??') where `key` like "pad:iOS_Retrospectives:revs:1106";
update `store` set `value` = replace(`value`,'????','??') where `key` like "pad:iOS_Retrospectives:revs:1200";
update `store` set `value` = replace(`value`,'????','??') where `key` like "pad:iOS_Retrospectives:revs:1300";
update `store` set `value` = replace(`value`,'????','??') where `key` like "pad:iOS_Retrospectives:revs:1400";
update `store` set `value` = replace(`value`,'????','??') where `key` like "pad:iOS_Retrospectives:revs:1500";
update `store` set `value` = replace(`value`,'????','??') where `key` like "pad:iOS_Retrospectives:revs:1600";
update `store` set `value` = replace(`value`,'????','??') where `key` like "pad:iOS_Retrospectives:revs:1700";
update `store` set `value` = replace(`value`,'????','??') where `key` like "pad:iOS_Retrospectives:revs:1800";
update `store` set `value` = replace(`value`,'????','??') where `key` like "pad:iOS_Retrospectives:revs:1900";
update `store` set `value` = replace(`value`,'????','??') where `key` like "pad:iOS_Retrospectives:revs:2000";
update `store` set `value` = replace(`value`,'????','??') where `key` like "pad:iOS_Retrospectives:revs:2100";
update `store` set `value` = replace(`value`,'????','??') where `key` like "pad:iOS_Retrospectives:revs:2200";
update `store` set `value` = replace(`value`,'????','??') where `key` like "pad:iOS_Retrospectives:revs:2300";
update `store` set `value` = replace(`value`,'????','??') where `key` like "pad:iOS_Retrospectives:revs:2400";
update `store` set `value` = replace(`value`,'????','??') where `key` like "pad:iOS_Retrospectives";
4 ๋ฐ์ดํธ UTF8์ ๋จ์ผ ๋ฐ์ดํธ๊ฐ ์ ํจํ UTF8์ด ์๋๊ธฐ ๋๋ฌธ์ 4 ๊ฐ์ ๋ฌผ์ํ๊ฐ ์ฆ์์ ๋๋ค. (UTF8์์๋ ์ฒ์ 127 ๊ฐ์ ๋ฌธ์ ๋ง ๋จ์ผ ๋ฐ์ดํธ๋ก ํ์๋๊ณ ๋ฉํฐ ๋ฐ์ดํธ UTF8์ ์๋ง๋ 0x7f ์ด์์ ๋ฐ์ดํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค). ๋ฐ๋ผ์ 4 ๊ฐ์ ๋ฌผ์ํ๋ ์ค์ ๋ก ํ๋์ 4 ๋ฐ์ดํธ ์ธ์ฝ๋ฉ UTF8 ๋ฌธ์์ด์ ๋ํ๋ด๋ฉฐ, ์ด๋ ๊ธฐ๋ณธ ๋ค๊ตญ์ด ํ๋ฉด ์ธ๋ถ์ ์ฝ๋ ํฌ์ธํธ๋ฅผ ๋ํ๋ ๋๋ค (๋๋ถ๋ถ ์ด๋ชจ ์ง :-D). ์๋ฐ ์คํฌ๋ฆฝํธ์์ ์ด๋ฌํ ์ฝ๋ ํฌ์ธํธ๋ 2 ๊ฐ์ 16 ๋นํธ ๊ฐ์ธ UTF16์ ์๋ก ๊ฒ์ดํธ ์์ ์ฌ์ฉํ์ฌ ์ธ์ฝ๋ฉ๋ฉ๋๋ค.
checkRep ๋ฌธ์ ๋ ๋ณ๊ฒฝ ์งํฉ์์ ๋ฌธ์๋ฟ๋ง ์๋๋ผ ๋ณ๊ฒฝ ๊ธธ์ด๋ ์ ์ฅํ๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ Javascript์ length () ํจ์๋ ์๋ก ๊ฒ์ดํธ ์์ 2๋ก ๊ณ์ฐํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ด๋ชจ ์ง์ ๊ธธ์ด๋ 2์ ๋๋ค. mysql์ด ๋ณ๊ฒฝ ์งํฉ์ ๋ฌธ์์ด์ ๋ฌผ์ํ๋ก ๋์ฝ๋ฉ ํ ๋ ๋ณ๊ฒฝ ์งํฉ์ ํํ์ด ๋ ์ด์ ์ ํจํ์ง ์์ต๋๋ค.
๋ ๊ฐ์ ๋ฌผ์ํ๋ก ๋ฐ๊พธ๋ ๊ฒ์ ์ฌ์ฉ์๊ฐ ์ฒ์์ ์ ๋ ฅ ํ ์ฝ๋ ํฌ์ธํธ๋ฅผ ์์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ์ค์ ํด๊ฒฐ์ฑ ์ด ์๋ ํดํน์ ๋๋ค (ํ์ง๋ง ๊ฐ์ด ueberDB์ ์บ์์์๋ ํ ๊ฑฐ๊ธฐ์์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค).
๋๊ตฐ๊ฐ๊ฐ ์ค์ ๋ก 4 ๊ฐ์ ๋ฌผ์ํ๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ชป๋ ๊ฒฐ๊ณผ๊ฐ ์์ฑ๋ฉ๋๋ค (์ฐ๋ฆฌ์ ๊ธธ์ด ๊ฐ์ 4๋ฅผ ๋ํ๋ด๋ฉฐ 2 ๊ฐ์ ๋ฌผ์ํ๋ก ๋ฐ๊พธ๋ฉด ๊ทธ ๋๊ฐ๋ก checkRep ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค). ๋ฐ๋ผ์ ์๋ฆฌ ์คํฌ๋ฆฝํธ๋ฅผ ์๋ํ ํ ๊ฒฝ์ฐ ํ์ธํด์ผํฉ๋๋ค. ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฉํ ํ์ ๋ฌธ์์ด ๊ธธ์ด๊ฐ ๋ณ๊ฒฝ ์งํฉ์ "์ถ๊ฐ ๋ ๋ฌธ์ ์"-๊ฐ๊ณผ ์ผ์นํ๋ ๊ฒฝ์ฐ.
๋๊ตฐ๊ฐ๊ฐ ์ค์ ๋ก 4 ๊ฐ์ ๋ฌผ์ํ๋ฅผ ์ฌ์ฉํ๊ณ ์ด๋ชจ ์ง์ ๊ฐ์ ์ฝ๋ ํฌ์ธํธ๋ฅผ ์ถ๊ฐ๋ก ์ฌ์ฉํ ๊ฒฝ์ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ๋ฌผ์ํ๋ฅผ ๋์ฒดํ๋ ๋ฌธ์ ๋ด ์์น๋ ์ถ์ ํด์ผํฉ๋๋ค.
๋ํ ๋ชจ๋ checkRep-error๊ฐ ์๋ชป๋ ์ธ์ฝ๋ฉ์ผ๋ก ์ธํด ๋ฐ์ํ๋ ๊ฒ์ ์๋๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฌผ๋ก ์์ ๋ด์ฉ์ด ์๋ํ์ต๋๋ค. ๋๋ฐ! ์ถฉ๋ถํ ๊ฐ์ฌ ํ ์ ์์ต๋๋ค. ๊ตฌ์ฑ ์์ ์ ํตํด ์ด๊ฒ์ด ๋ค์ ๋ฐ์ํ์ง ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๋น์ ์ดํ๊ณ ์๋ ๋๋ฒ๊น ์ด ์๋์ผ๋ก btw์ธ์ง ๊ถ๊ธํฉ๋๋ค. ๋ณ๊ฒฝ ์ธํธ์ ๊ธธ์ด๋ฅผ ํ๋์ฉ ์๋์ผ๋ก ๊ฐ์ ธ์ค๊ณ ๋น๊ตํ๊ฑฐ๋ ๋ ์๋ํ ๋ ๋ฐฉ๋ฒ์ด์๋ ๊ฒฝ์ฐ. ์ด์ฐจํผ ๋๋ง์ ๊ฒ์ ๋ง๋ค ์์์ ๊ฒ ๊ฐ์ ๊ถ๊ธํด์
<3 @ webzwo0i ๊ฐ์ฌํฉ๋๋ค.
@ webzwo0i ์ต๊ทผ์ ์์์ X
๋จ์ผ ์ด๋ชจ ์ง (์ : ๐ผ)๋ก ์ ํจ๋๋ฅผ ๋ง๋ค๊ณ etherpad๋ฅผ ๋ค์ ์์ํ๋ฉด ์ค๋ฅ๊ฐ ์ฝ๊ฒ ์ฌํ ๋ ์ ์์ต๋๋ค (# 3340 ์ฐธ์กฐ).
์ ๋ฐ์ดํธ : 2019 ๋ 4 ์๋ถํฐ์ด ๋จ์ผ ์ด๋ชจํฐ์ฝ ์์ฒด๋ โโ๋ค์ ์์ํด๋ ํจ๋๊ฐ ๊นจ์ง์ง ์์ต๋๋ค.
๋ชจ๋ ํจ๋๋ฅผ ํ์ธํ๊ณ ์ถ์ ๊ธฐ ๋๋ฌธ์ checkAllPads
๋๊ตฌ๋ฅผ ์ถ๊ฐํ์ต๋๋ค (PR # 3342 ์ฐธ์กฐ).
์ด ์ค๋ฅ๋ ๋จ์ผ ์ด๋ชจ ์ง (์ : panda_face)๋ก ์ ํจ๋๋ฅผ ๋ง๋ค๊ณ etherpad๋ฅผ ๋ค์ ์์ํ์ฌ ์ฝ๊ฒ ์ฌํ ํ ์ ์์ต๋๋ค. # 3340๋ ์ฐธ์กฐํ์ญ์์ค.
์์์ ์ค๋ช ํ๋๋ก ์ ํํ๊ฒ ์ฌํ ํ ์ ์์ต๋๋ค. ์์ ๋ https://etherpad.wikimedia.org/p/ohmy ๋ฅผ ์ฐธ์กฐ
์ด ์ค๋ฅ๋ก ์ธํด ํจ๋๊ฐ ๋์ด์ก์ต๋๋ค. ์ ๊ธฐํ๊ฒ๋ checkPad,js
๋ ๋ฌธ์ ๋ฅผ ์ฐพ์ง ๋ชปํ๊ณ repairPad.js
๋ ์์ ํ์ง ์๊ณ ์๋ฃ๋ฉ๋๋ค. ์ด๋ค ๊ฐ์ ํ์ด ์๋ชป๋์๋์ง ํ์ธํ ์์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
ํธ์ง : ์, ๋๋ ์ฌ๋ฐ๋ฅธ ๊ธธ์ ๊ฐ๋ฆฌํค๋ https://gist.github.com/marcelklehr/a78d293571e7f06e3cf9 ๋ฅผ ์ฐพ์์ต๋๋ค. ์ด๊ฒ์ด etherpad ์์ฒด์ ํฌํจ๋ ์ ์์ต๋๊น? ์ง๊ธ ๋น์ฅ ๋ง์ ๋์์ด๋์์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค! (๊ทธ๋ฌ๋ ์์ ๋ฒํธ๋ฅผ๋ณด๊ธฐ ์ํด console.log
๋ฅผ console.error
๋ก ๋ฐ๊ฟ์ผํ์ต๋๋ค. nodeJS ๊ฒฝํ์ด ์ ํ ์์ง๋ง ์ค์ ๋ก ๋ชจ๋ ๋ก๊น
์ ๋ณผ ์์๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ฐพ์ ์ ์์์ต๋๋ค. )
์ค์ ๋ก " ????
๋ฅผ ??
๋์ฒด"ํ๋ ๊ฒ๋ ์ฌ๊ธฐ์์ ๋์์ด๋์์ต๋๋ค. :) ๋ง์ง๋ง ๋ณ๊ฒฝ ์ธํธ๋ ๋๊ตฐ๊ฐ ์ด๋ชจ์ง๋ฅผ ์ฝ์
ํ ๊ฒ ๊ฐ์ต๋๋ค ( $????
๋๋ฌ์ต๋๋ค).
๊ทธ๋ฌ๋ ์ด๊ฒ์ด "์ฌ์ํ ๋ฒ๊ทธ"๋ก ๋ถ๋ฅ๋๋ ์ด์ ๋ฅผ ์ดํดํ์ง ๋ชปํฉ๋๋ค. ์ด ๋ฒ๊ทธ๋ก ์ธํด ํจ๋๊ฐ ์์ ํ ์์ค๋ฉ๋๋ค (๋๊ตฐ๊ฐ๊ฐ /timeslider
์์ ์ฐจ๋ฆด ๋๊น์ง, ์ฐ๋ฆฌ์ ๊ฒฝ์ฐ ์ผ์ฃผ์ผ์ด ๊ฑธ๋ ธ๊ณ ์ฌ์ง์ด ๊ธฐ๋ก์ด ์์ค ๋ ๋๊น์ง).
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๊ฐ๋ฅ์ฑ์ด ๋ฎ๊ธฐ ๋๋ฌธ์ ํ ๋น๋์ง ์์์ต๋๋ค. FWIW,์ด ๋ฒ๊ทธ๋ easysync ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ํ์ผ๋ก ์ธํ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค. ์ด๊ฒ์ด ๋ชจ๋ utf-8์ ์ง์ํ์ง๋ ์์ต๋๋ค. (UTF-8์ ํ๋์ ๋ฌธ์๋ฅผ ์ฌ๋ฌ ๋ฐ์ดํธ๋ก ์ธ์ฝ๋ฉ ํ ์ ์์ผ๋ฉฐ, ์ด๋ ๊ฐ๊ฐ ํ๋์ ๋ฌธ์์ด์ง๋ง ์๋ฐ ์คํฌ๋ฆฝํธ์ ๋ฌธ์์ด ๊ธธ์ด์ ์ถ๊ฐ๋ฉ๋๋ค.)
-์ ๊ฒฝ ์ฐ์ง ๋ง์ธ์-: D
FWIW,์ด ๋ฒ๊ทธ๋ easysync ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ํ์ผ๋ก ์ธํ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค. ์ด๊ฒ์ด ๋ชจ๋ utf-8์ ์ง์ํ์ง๋ ์์ต๋๋ค. (UTF-8์ ํ๋์ ๋ฌธ์๋ฅผ ์ฌ๋ฌ ๋ฐ์ดํธ๋ก ์ธ์ฝ๋ฉ ํ ์ ์์ผ๋ฉฐ, ์ด๋ ๊ฐ๊ฐ ํ๋์ ๋ฌธ์์ด์ง๋ง ์๋ฐ ์คํฌ๋ฆฝํธ์ ๋ฌธ์์ด ๊ธธ์ด์ ์ถ๊ฐ๋ฉ๋๋ค.)
์ฌ์ค ์ฐ๋ฆฌ๋ ํญ์ ์ฐ๋ฆฌ์ ํจ๋์ ์๋ผ์ฐํธ (รครถรผ)๋ฅผ ๊ฐ์ง๊ณ ์๋๋ฐ, ์ด๋ UTF-8์ ๋ฉํฐ ๋ฐ์ดํธ์ด๊ธฐ๋ํฉ๋๋ค. ์์์ ๋งํ ๋ด์ฉ์ ๋ฐํ์ผ๋ก, ๋ฌธ์ ๋ ์ค์ ๋ก UTF-16์ ๊ดํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์๋ ์ค๊ณ๋์์ ๋ ๋ฌธ์ ๋น ์ ํํ 2 ๋ฐ์ดํธ (์ค์ ๋ก ์ฝ๋ ํฌ์ธํธ)๋ฅผ ๊ฐ๋๋ก ์๋๋์์ง๋ง ์ด์ ๋ 2 ^ ์ด์์
๋๋ค. ์ด๋ชจ ์ง์ฒ๋ผ 4 ๋ฐ์ดํธ๊ฐ ํ์ํ 16 ๊ฐ์ ์ฝ๋ ํฌ์ธํธ๊ฐ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด์ length()
๋ ๋ ์ด์ ์ฝ๋ ํฌ์ธํธ ์์ ์ผ์นํ์ง ์์ผ๋ฉฐ ๋ชจ๋ ๊ฒ์ด ํผ๋์ค๋ฌ์์ง๋๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ ๋์ ํด๊ฒฐ์ฑ ์ ๋๋ฆฌ ์ (4 ๋ฐ์ดํธ ์ฝ๋ ํฌ์ธํธ)์ ์์ ํ ๊ฑฐ๋ถํ๋ ๊ฒ์ ๋๊น? ๊ทธ๊ฒ์ ๋ณด์กฐ ํ๋ฉด์ ๋ฌธ์์ ํจ๊ป etherpad๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๊ฒ ๋ง๋ค์ง ๋ง ์ด์จ๋ ๊นจ์ง ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ DB๋ฅผ ๋ณดํธํด์ผํฉ๋๋ค. JS์์ ์๋ก ๊ฒ์ดํธ ์ ์ ํ ์คํธ ํ๋
์ ์ด๊ฒ์ด ๋ซํ์ต๋๊น? ๋ด๊ฐ ์๋ ํ Etherpad๋ ์ฌ์ ํ BMP ์ธ๋ถ์ ์บ๋ฆญํฐ๋ฅผ ์ง์์ํต๋๋ค. ์ต๊ทผ์ ์ด๋ฐ ์์ผ๋ก ๋ถ๋ฌ์ง ํจ๋๋ฅผ ์๋์ผ๋ก ์๋ฆฌํด์ผํ์ต๋๋ค.
๋๋ 2014 ํธ๋ฅผ ์ด์๊ณ ๋ ์ด์ ๊ด์ฌ์ด ์์ด์ ๋ซ์์ต๋๋ค.
๊ธ์์, ๋ค๋ฅธ ์ฌ๋๋ค์๊ฒ๋ ์ฌ์ ํ ์ด๋ฆฐ ๋ฌธ์ ์ด๋ฏ๋ก ๋ค์ ์ด ์ ์์ผ๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
๊ฐ์ฌ! :)
๋๊ตฌ๋ ์ง ํจ๋๋ฅผ ์์ ์ ์ผ๋ก ๋ถ์๋ ์บ๋ฆญํฐ (์ํ์ค)์ ๋ํ ์๊ฐ ์์ต๋๊น? ์ด๊ฒ์ ๋๋ฒ๊น ์ ์ฉ์ดํ๊ฒ ํ ๊ฒ์ ๋๋ค.
Easysync ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ "๋ฌธ์"์ธก๋ฉด์์ ํ ์คํธ (๋ฐ ๊ทธ ๋ ๊ทธ)๋ฅผ ์ค๋ช ํ์ง๋ง 10 ๋ ์ ๋ถํฐ๋ ์ต์ํ์ ์คํ ๊ฐ๋ฅํ ์ ํ์ด์์ต๋๋ค. ์์ฆ ์ฐ๋ฆฌ๋ ์๋ง๋ NFC ์ ๊ทํ ๋ UTF-8 ์ฝ๋ ํฌ์ธํธ๋ฅผ ์๊ฐํด์ผ ํ ๊ฒ์ ๋๋ค.
ueberdb ๊ฐ์ ๋์กฐ ๋ ํ ์คํธ ์ด์ด ์๋ ๋ฐ์ด๋๋ฆฌ blob์ผ๋ก ์ ์ฅํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์๊น์?
ํ์ฌ ์ ํจํ utf8mb4 (๋ฉํฐ ๋ฐ์ดํธ ๋ฌธ์์ ์ผ๋ถ๋ฅผ ํฌํจํ๋ ๋ณ๊ฒฝ ์งํฉ)๊ฐ ์๋ ๋ฐ์ดํธ ์ํ์ค๋ฅผ utf8mb4
์ด์ ๋ฃ์ผ๋ ค๊ณ ํ๋ฉด ๊ฐ๋ฅํ ๊ฒฐ๊ณผ๋ ๋ ๊ฐ์ง๋ฟ์
๋๋ค. ์
๋ ฅ ๋๋ ํด๋ผ์ด์ธํธ (๋๋ ์๋ฒ)๋ ์ด์ ์ ์๋ชป๋ "๋ฌธ์"๋๋ ๋ฐ์ดํธ๋ฅผ ์ ๊ฑฐ ( "?"๋ก ๋์ฒด)ํด์ผํฉ๋๋ค.
์ด์ง blob ์ด์ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋ ์ด์ ๋ฐ์ดํธ ์ํ์ค๊ฐ โโ์๋ชป๋ utf8mb4 ์ธ ๊ฒ์ ๋ํด ์ ๊ฒฝ ์ฐ์ง ์์ผ๋ฏ๋ก ๋ฌธ์ ๊ต์ฒด๋ฅผ ํผํ ์ ์์ต๋๋ค. easysync๊ฐ ๋ด๊ฐ ์ดํดํ๋ ๊ฒ์ฒ๋ผ ์ธ์ฝ๋ฉ์ ๊ตฌ์ ๋ฐ์ง ์๋๋ค๋ฉด ์๋ ํ ์ ์์ต๋๋ค (๋ ๋ช ์ ์ฌ์ฉ์๊ฐ ๋ฉํฐ ๋ฐ์ดํธ ๋ฌธ์ AB์ CD๋ฅผ ๋์์ ๊ฐ์ ์์น์ ์ฝ์ ํ์ง ์๊ณ ๊ฐ๋ณ ๋ณ๊ฒฝ ์ธํธ A, C, B, D๋ก ๋๋๋ ๊ฒฝ์ฐ). ์์-๋ณํฉ ๋ ๊ฒฐ๊ณผ๋ฅผ ์๋ชป๋ utf8mb4 ๋ ๋๋ง).
์ถ์ : ๋ฐฉ๊ธ ๐ฐ์ ๊ฐ์ 4 ๋ฐ์ดํธ UTF8 ๋ฌธ์๋ฅผ ์ฝ์ ํ๋ ๊ฒ์ด ๋ฌธ์ ๊ฐ ์๋๋ผ๋ ๊ฒ์ ํ ์คํธํ์ต๋๋ค (์์ง ๋ค์ ์์ํ์ง ์์์ผ๋ฏ๋ก ์ค๋ช ์ผ ์ ์์). ๋ฐ๋ผ์ ๋ฒ๊ทธ์ ๋์์ฑ์ด ํ์ํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค (๋ฌธ์๊ฐ ์์ฒด์ ์ผ๋ก ์ ํจํ์ง ์์ ๋ ๊ฐ ์ด์์ ๋ณ๊ฒฝ ์ธํธ๋ก ๋ถํ ) ๋๋ ๊ทธ๋ฌํ ๋ฌธ์์ ์ผ๋ถ๋ฅผ ์ ๊ฑฐํ๋ ๋ณ๊ฒฝ ์ธํธ๋ฅผ ๋ด๋ณด๋ด๋ ํด๋ผ์ด์ธํธ๊ฐ ํ์ํฉ๋๋ค.
์๋ ํ์ธ์, ์ฐ๋ฆฌ๋ ๋ํ ๋ง์ ํจ๋ ์์์ด ๋ฌธ์ ๋ฅผ ๊ฒฝํํ๊ณ ์์ต๋๋ค.
๋๋ ๋ชจ๋ ๊ฒ์ ์๋ํ๊ณ ์์ผ๋ฉฐ ์ด๊ฒ์ ๐ฐ๋ก ๋ฐ๊ฟ ์ ์์ต๋๋ค. ๋ค์ ์์, ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐฑ์๋ (์ ๋๋ก ๊ตฌ์ฑ๋) ..
๋๊ตฌ๋ ์ง ์ฐ๋ฆฌ์ ์ต์ ์ฝ๋ ๊ธฐ๋ฐ์ผ๋ก ๋ณต์ ํ๋ ๋จ๊ณ๋ฅผ ์ ๊ณต ํ ์ ์์ต๋๊น?
๐ฐ์์ ๋ฐฑ ์คํ์ด์ค๋ฅผ ๋๋ฅด๋ฉด ํญ๋ชฉ์ด``๋ก ๋์ฒด๋ฉ๋๋ค.
์ ์๊ฒ replace(
value ,'????','??')
๋ ์ง๊ธ๊น์ง ํญ์ ํจ๊ณผ๊ฐ์์์ต๋๋ค. ๊ทธ๋๋ ๋ช ๋ฌ ๋์ ์ผ์ด๋์ง ์์์ต๋๋ค.
๋๋ ์๋ํ๋ Check Pad Deltas์ ์ ๋ฐ์ดํธ ๋ ๋ฒ์ ์ ํฌํจ ์์ผฐ์ต๋๋ค. ์ฌ๋๋ค์ด์ด ๋ฌธ์ ๋ฅผ ๊ฒฝํํ ๋ ๋์์ด๋๋์ง ํ์ธํด ๋ณผ ์ ์๋ค๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
์ฌ์ ํ ๊ธฐ๋ณธ์ ์ธ ๋ฌธ์ ๋ Etherpad ๋ฐ์ดํฐ ๋ชจ๋ธ์ด ์ ๊ทํ ๋ UTF-8 ์ฝ๋ ํฌ์ธํธ๊ฐ ์๋ "๋ฌธ์"๋ก ์๊ฐํ๋ค๋ ๊ฒ์ ๋๋ค.
ํต์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ค์ ์์ ํ์ง ์๋ ํ์ด ๋ฌธ์ ๋ ์ค์ ๋ก ํด๊ฒฐ๋์ง ์์ต๋๋ค. ๋ถ๋ช ํ ๋ชจ๋ ์ํ๊ฐ ์ ์ฉํฉ๋๋ค. ์ ์๊ฒฌ์ผ๋ก๋ 100 % ์ ํํ๋ค๊ณ ๋ณด์ฅ๋๋ _easy_ ์๋ฃจ์ ์ด ์๋ค๊ณ ๋งํ๋ ๊ฒ๋ฟ์ ๋๋ค.
์ผ๋ง๋ ๋ง์ ํธ์ง์๋ค (๊ทธ๋ฆฌ๊ณ ๊ฐ๋ฐ์๋ค์๊ฒ ๋งค์ฐ ์ธ๊ธฐ์๋ ํธ์ง์๋ค)์ด Etherpad tho์ ์ ์ฌํ ๊ฒฝํ์ ๊ฐ์ง๊ณ ์๋์ง ๋๋ผ์ค ๊ฒ์ ๋๋ค. ์ค๋ ๋๋ฉด์ ๋ฏธ์น ๊ฒฝํ์ํ์ต๋๋ค.
๋๋ ์๋ํ๋ Check Pad Deltas์ ์ ๋ฐ์ดํธ ๋ ๋ฒ์ ์ ํฌํจ ์์ผฐ์ต๋๋ค. ์ฌ๋๋ค์ด์ด ๋ฌธ์ ๋ฅผ ๊ฒฝํํ ๋ ๋์์ด๋๋์ง ํ์ธํด ๋ณผ ์ ์๋ค๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
# 3717 (14ae2ee95094)์ ์ฌ์ฉํ์ฌ ๋ง์คํฐ ๋ธ๋์น์์ ๊ฐ์ ธ ์์ต๋๋ค.
์๋
ํ์ธ์, ์ฐ๋ฆฌ ํจ๋ ์ค ํ๋์ ๋น์ทํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
@JohnMcLear ๋ถํํ๋ ์ต์ ๋ฒ์ ์ checkPadDeltas๋ ๋์์ด๋์ง ์์์ต๋๋ค.
@gnd ๊ณต์ฉ ์ธ์คํด์ค๊ฐ ์์ต๋๊น?
padId / export / etherpad URL์ ๋๋ฅด๊ณ .etherpad ํ์ผ์ ์ป์ ์ ์์ต๋๊น?
์ต์ ๊ฐ๋ฐ์ ์คํํ๊ณ ์์ต๋๊น?
๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐฑ์๋๋ ๋ฌด์์ ๋๊น?
์ง๋ฌธ์ด ๋๋ฌด ๋ง์ต๋๋ค. ๊ฐ๋ฅํ ํ ์์ธํ ์ ๋ณด๋ฅผ ์ ๊ณตํด์ฃผ์ธ์.
๋ฟก๋ฟก
์, ๊ณต๊ฐ ์ธ์คํด์ค์
๋๋ค : https://pad.xpub.nl/p/CareCircle
๋ถํํ๋ .etherpad ํ์ผ์ ์ป์ผ๋ ค๊ณ ์๋ํ๋ฉด 502 Bad Gateway ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ฐ๋ฆฌ๋ nodejs 12.16.3-1nodesource1์์ ์ต์ ๊ฐ๋ฐ (git pull origin)์ ์คํํ๊ณ ์์ผ๋ฉฐ db ๋ฐฑ์๋๋ 10.3.22-MariaDB-0 + deb10u1์
๋๋ค.
๋๋ ์ค๋ ๋น์ ์ด ์ํ๋ ๋ชจ๋ ์ข ๋ฅ์ ๋๋ฒ๊น ์ ๋์์ ์ค ์ ์์ต๋๋ค. ์ด๋ฏธ ๋ง์ง๋ง ๋ฒ์ ์ checkPadDeltas๋ฅผ ์ฌ์ฉํด ๋ณด์์ง๋ง ์์ ํ ๋ช ์๊ฐ ๋์ ๋ฉ ์ถฅ๋ ๋ค. ์ด๊ฒ์ด ์ ๊ณตํ๋ ์ ์ผํ ์ถ๋ ฅ์ ๋๋ค.
๋ชจ๋ ์๋ ๊ฒฝ๋ก๋ ์๋ณ ๋ Etherpad ๊ธฐ๋ณธ ๋๋ ํ ๋ฆฌ : / opt / etherpad๋ฅผ ๊ธฐ์ค์ผ๋ก ํด์๋ฉ๋๋ค.
[2020-05-05 00 : 04 : 12.330] [DEBUG] AbsolutePaths-์๋ ๊ฒฝ๋ก "settings.json"์ "/opt/etherpad/settings.json"์ผ๋ก ๋ค์ ์์ฑํ ์ ์์ต๋๋ค.
[2020-05-05 00 : 04 : 12.346] [DEBUG] AbsolutePaths-์๋ ๊ฒฝ๋ก 'credentials.json'์ '/opt/etherpad/credentials.json'์ผ๋ก ๋ค์ ์์ฑํ ์ ์์ต๋๋ค.
๋ก๋ ๋ ์ค์ : /opt/etherpad/settings.json
/opt/etherpad/credentials.json์ ์๊ฒฉ ์ฆ๋ช ํ์ผ์ด ์์ต๋๋ค. ๋ฌต์ด.
[2020-05-05 00 : 04 : 12.369] [์ ๋ณด] ์ฝ์-๋๋ ํ ๋ฆฌ์ "no-skin"์คํจ ์ฌ์ฉ : / opt / etherpad / src / static / skins / no-skin
[2020-05-05 00 : 04 : 12.371] [์ ๋ณด] ์ฝ์-์ธ์ ํค๋ก๋ ์์น : /opt/etherpad/SESSIONKEY.txt
[2020-05-05 00 : 04 : 12.541] [์ค๋ฅ] ์ฝ์-ํ ์ด๋ธ์ด charset utf8๋ก ๊ตฌ์ฑ๋์ง ์์-ํน์ ๋ฌธ์๋ฅผ ํจ๋์ ๋ถ์ฌ ๋ฃ์ ๋ ์ถฉ๋์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
[2020-05-05 00 : 04 : 12.543] [์ ๋ณด] ์ฝ์-RowDataPacket {character_set_name : 'utf8mb4'} utf8
์ผ, ๋ก๊ทธ์ ์ค๋ฅ๊ฐ ์์ต๋๋ค!
[2020-05-05 00:04:12.541] [ERROR] console - table is not configured with charset utf8 -- This may lead to crashes when certain characters are pasted in pads
[2020-05-05 00:04:12.543] [INFO] console - RowDataPacket { character_set_name: 'utf8mb4' } utf8
๋ฟก๋ฟก
์ฐ๋ฆฌ db๋
+ ---------------------------- + -------------------- ---- +
| DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME |
+ ---------------------------- + -------------------- ---- +
| utf8 | utf8_general_ci |
+ ---------------------------- + -------------------- ---- +
์์ ํ ์ด๋ธ์๋
+ -------------------- +
| character_set_name |
+ -------------------- +
| utf8mb4 |
+ -------------------- +
๊ทธ๋์ ๋๋ ์ฌ์ฉํ์ฌ ๋ณํํด์ผ
ALTER DATABASE
etherpad_lite_db CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
?
๋ฟก๋ฟก
์๋ชป๋ ๊ตฌ์ฑ์ ๋ ๊ฐ์ง์์ผ๋ฉฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ utf8 ๋ฐ utf8_general_ci๋ฅผ ์ฌ์ฉํ์ง๋ง settings.json์์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฌธ์ ์งํฉ์ด "utf8"๋ก ์ค์ ๋์์ต๋๋ค. utf8mb4์ ๋ํ ๋ชจ๋ ๊ฒ์ด ์ฌ์ ํ ๋์์ด๋์ง ์๊ณ ๋ฌธ์ ์ ํจ๋๊ฐ๋ก๋๋์ง ์๊ณ checkPadDeltas๊ฐ ์ฌ์ ํ ๋ฉ ์ถฅ๋ ๋ค.
๋ชจ๋ ์๋ ๊ฒฝ๋ก๋ ์๋ณ ๋ Etherpad ๊ธฐ๋ณธ ๋๋ ํ ๋ฆฌ : / opt / etherpad๋ฅผ ๊ธฐ์ค์ผ๋ก ํด์๋ฉ๋๋ค.
[2020-05-05 13 : 17 : 43.443] [DEBUG] AbsolutePaths-์๋ ๊ฒฝ๋ก "settings.json"์ "/opt/etherpad/settings.json"์ผ๋ก ๋ค์ ์์ฑํ ์ ์์ต๋๋ค.
[2020-05-05 13 : 17 : 43.444] [DEBUG] AbsolutePaths-์๋ ๊ฒฝ๋ก "credentials.json"์ "/opt/etherpad/credentials.json"์ผ๋ก ๋ค์ ์์ฑํ ์ ์์ต๋๋ค.
๋ก๋ ๋ ์ค์ : /opt/etherpad/settings.json
/opt/etherpad/credentials.json์ ์๊ฒฉ ์ฆ๋ช ํ์ผ์ด ์์ต๋๋ค. ๋ฌต์ด.
[2020-05-05 13 : 17 : 43.463] [์ ๋ณด] ์ฝ์-๋๋ ํ ๋ฆฌ์ "no-skin"์คํจ ์ฌ์ฉ : / opt / etherpad / src / static / skins / no-skin
[2020-05-05 13 : 17 : 43.464] [์ ๋ณด] ์ฝ์-์ธ์ ํค๋ก๋ ์์น : /opt/etherpad/SESSIONKEY.txt
@gnd GiGo ๋ฌธ์ ์ ๋๋ค. ์ผ๋จ ์ฐ๋ ๊ธฐ๋ฅผ ๋ฃ์ผ๋ฉด ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ์ด์ ๋น์ ์ด ์๋ ๊ฒ์ ๋ฌธ์ ๊ฐ ๋ฏธ๋์ ๋ํ๋์ง ์์ ๊ฒ์ด๋ผ๋ ๊ฒ์ ๋๋ค!
@gnd GiGo ๋ฌธ์ ์ ๋๋ค. ์ผ๋จ ์ฐ๋ ๊ธฐ๋ฅผ ๋ฃ์ผ๋ฉด ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ์ด์ ๋น์ ์ด ์๋ ๊ฒ์ ๋ฌธ์ ๊ฐ ๋ฏธ๋์ ๋ํ๋์ง ์์ ๊ฒ์ด๋ผ๋ ๊ฒ์ ๋๋ค!
repairPad.js
๊ฐ)์ด ๊นจ์ง ํจ๋๋ฅผ ๊ณ ์น ์ ์์๊น์?
์ค ์๋ @caugner- ์ฌํ๊ฒ๋, repairPad.js๋ ์ผ๋ฐ์ ์ผ๋ก ์ง์ฆ๋๊ณ ์ค์ ๋ก ์๋ํ์ง ์์ต๋๋ค. https://github.com/ether/etherpad-lite/blob/develop/bin/repairPad.js#L48
๋ด๊ฐ ์ ์ ํ ์์๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ํ ์คํธ / ํ ์คํธ๋ฅผ ํจ๋์์ ๊บผ๋ด ์ ํจ๋๋ก ๊ฐ์ ธ ์ค๋ ๊ฒ์ ๋๋ค.
@gnd ์ํ๋ ๊ฒฝ์ฐ ํ ์คํธ๋ฅผ ์ป์ผ๋ ค๊ณ ํ ์คํธํ๋ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ ์ ์์ต๋๊น?
bin/extractPadData.js
stdout์ผ๋ก ์ถ๋ ฅ์ ๋ณ๊ฒฝํ๋ฉด ์ถฉ๋ถํ ์ ์์ต๋๋ค .. 2 ๋ถ extractPadText.js๋ฅผ ์์ฑํฉ๋๋ค.
@JohnMcLear ์ ๋ง ๋์์ด ๋ ๊ฒ์ ๋๋ค)
node bin/extractPadData.js $padid
๊ทธ๋ฐ ๋ค์ cat $padid.db | grep \"text\" | grep revNum | tail -1
ํ
์คํธ๋ val.atext.text
ํญ๋ชฉ์
๋๋ค. cli์์ json ํ์ฑ ํ ์ ์์ต๋๋ค. ํ์ํ ๊ฒฝ์ฐ ๋ค์์ ์ํํฉ๋๋ค .. ์ง๊ธ์์ด ๋ช
๋ น์ ์ํํ์ฌ $ padid๋ฅผ PadID๋ก ๋ฐ๊พธ์ญ์์ค.
sudo apt-get install jq
๋ก jq๋ฅผ ์ค์น ํ ๋ค์ cat $padid.db | grep \"text\" | grep revNum | tail -1 | jq .val.atext.text
๋ก ํ
์คํธ ๋ง ํ์ธํฉ๋๋ค.
ํจ๋ ํ
์คํธ๋ฅผ ํ
์คํธ ํ์ผ cat $padid.db | grep \"text\" | grep revNum | tail -1 | jq .val.atext.text > $padid.txt
์ฐ๋ ค๋ฉด
์ด์ ํจ๋ ํ ์คํธ๊ฐ ์์ผ๋ฏ๋ก ํ ์คํธ ํ์ผ์ ๋ฃ๊ณ ๊ฐ์ ธ ์ค๊ฑฐ๋ setText API ๋ฑ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Lemme๋ ์ถ์ถ์ด ์คํจํ๋์ง ์๊ณ ์์ผ๋ฉฐ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ ๊ณ ๋ คํ ๊ฒ์ ๋๋ค.
์ถ์ถ์ด ์คํ ์ค์ด์ง๋ง ๋งค์ฐ ๋๋ฆฝ๋๋ค. CareCicle.db ํ์ผ์์ revs : 80 ์ ์ต์ ๋ผ์ธ์ ๋ณผ
์ค ์ด๋ฐ, ๊ทธ๊ฑฐ ์๋ผ .. 80 ๋ฒ์ ์์ ํ์ pad
๊ฐ์ฒด๋ฅผ ๋น๋ ํ ์์๋ ๊ฒ ๊ฐ์์. ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋๋ ๋ฐ 30 ์ด ์ ๋ ๋ฐ์ ๊ฑธ๋ฆฌ์ง ์์ต๋๋ค.
๋ง์ง๋ง ์ ์์ ์ ์ฒด db๋ฅผ ๋คํํ๊ณ ๋์๊ฒ ์ ์กํ๋ ํฐ ์ ์์ด ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ฉด ํ์ํ ๊ฒ์ ๊ตฌ๋ฌธ ๋ถ์ํ๋ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ๋๋ ์ฌ๊ธฐ์ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ๋ ค๊ณ ์๋ ํ ์ ์์ง๋ง ์ด๋ฌํ ๋ฐฉ์์ผ๋ก ์๋ํ๋๋ก ์๋ค๋ก ์ฝ๊ฐ์ ์์ ์ด์์ ์ ์์ต๋๋ค.
@JohnMcLear ์๋ ํ์ธ์, ์คํฌ๋ฆฝํธ๊ฐ ๋ง์นจ๋ด ์๋ฃ๋์์ต๋๋ค. ์ ๊ทธ๋ ๊ฒ ์ค๋ ๊ฑธ ๋ ธ๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค (๊ฑฐ์ 40 ์๊ฐ). ์ด์จ๋ ๊ทธ๊ฒ์ ๋ค์ฌ๋ค ๋ณด๋ฉด ์์ ํ ์ด๋ธ์์ 100์ผ๋ก ๋๋ ์์๋ ๊ฐ์ฅ ๋์ ๊ฐ์ ํ์ ์ ํํ๊ณ ํ ์คํธ๋ฅผ ์ถ์ถํ์ฌ ์ ์ฒด ์ฐ์ต์ ํ ์์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์์ผ๋ก ๋์๊ฒ ์์ผ๋กํ์ธ์ :) ๋์ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค
์ ํํ์ง๋ง, ์ฌ์ฉ์๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ๋ฅผ ์ํ ํ ์ ์๋ค๋ ๊ฐ์ ์ ํ ๋ ์ข ์ข ์ฌ์ฉ์๋ก๋ถํฐ ๋ง์ ๋ฃ๊ฒ๋๋ฏ๋ก ํผํ๋ ค๊ณ ํฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ์ ๊ทธ๋ ๊ฒ ์ค๋ ๊ฑธ๋ฆฐ ์ง ์๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค .MySQL @ Etherpad 1.8.3์ ์ฌ์ฉํ๊ณ ์์ต๋๊น?
git์ ์ต์ ๋ง์คํฐ๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค (์ด๋ค ๋ฒ์ ์ธ์ง ํ์คํ์ง ์์)
MySQL์ ๊ฐ์ ํ๋ฉด ์ค๋ ํจ์น๊ฐ ์ ์ฉ๋๋ ์๋ ค์ง ๋ฒ๊ทธ์ ๋๋ค.
์, ์ต์ MariaDB-10.3.22-MariaDB
@JohnMcLear ์ด ํฐ์ผ์ ์คํธ์ผ๋ก
์๋์,ํ์ง๋ง npm์ [email protected] ๋ฅผ ์ค์นํ์ฌ ์์ ํฉ๋๋ค.
Btw ์ถ๊ฐ ํ ์คํธ๋ฅผ ์ ์ฅํ๋ ์๋ก์ด ๋ก์ง์ด ์์ผ๋ฏ๋ก ์ด๊ฑด ๋ซํ ์ผํ์ง๋ง ์ฌ๋๋ค์ด ๋ฌธ์ ๋ฅผ ๊ฒฝํํ๋ค๋ฉด ์ ๋ฌธ์ ๋ฅผ ๋ง๋ค๊ณ ์ด ๋ฌธ์ ๋ฅผ ์ฐธ์กฐํ์ธ์. ๋๋ ์ค์๊ฐ์ผ๋ก ๊ฐ์ง ๋ ์์์ ๋ํด ํจ๋๋ฅผ ๋ณต์ํ๋ ์๋ํ ๋ ๋ ผ๋ฆฌ๋ฅผ ๋ง๋๋ ์ฃผ์ ๋ชฉํ๋ก ๋ฌธ์ ์ ๊ฐ๋ณ ์์ธ์ ๊ฐ๋ณ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ณ ์ถ์ต๋๋ค. ๊ทธ๊ฒ์ ๋ถํจ๊ฐ ๋ถ๊ฐํผํ ๊ฟ์ ๋๋ค.
์ด๊ฒ์ ์ต๊ทผ์ (์ด๋ ํจ๋์ ์ด์ ๋ฒ์ ์์ ์ ๊ทธ๋ ์ด๋ ํ ๋) ์ด์ ๋ํ ์ฌ๋๋ค์์ํ ๋ฉ์์ง์ ๋๋ค.
์ค๋ ์ ๋ etherpad ์๋น์ค๋ฅผ 1.6.3
์์ 1.8.6
์
๊ทธ๋ ์ด๋ํ์ต๋๋ค (๋๋จํ ๋ณํ์
๋๋ค !!!!! ๋ชจ๋ ๊ฐ๋ฐ์์๊ฒ ์ถํ๋๋ฆฝ๋๋ค).
ํ๋์ ํจ๋์ ๋ฌธ์ ๊ฐ ์์๊ณ ์ฒด์ปค (checkPad, checkAllPads ๋ฑ)๊ฐ ๊ฐ์งํ์ง ๋ชปํ์ต๋๋ค (๋๋ ๋ ธ๋๋ฅผ ์ ์คํํ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค).
๋๋ ๊ฒ์ฆ charset
์๋ค utf8mb4
(์ง๋ ๋ฒ์ ํฑ ๋ด settings.json์์ settings.json.template
).
"dbType" : "mysql",
"dbSettings" : {
"user": "etherpaduser",
"host": "localhost",
"port": 3306,
"password": "PASSWORD",
"database": "etherpad_lite_db",
"charset": "utf8mb4"
},
์ผ์ด์ค https://pad.example.com/p/my-broken-pad์ ๊ฒฝ์ฐ :
update `store` set `value` = replace(`value`,'????','??') where `key` like "pad:my-broken-pad"
๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ๋ค์ ์๋ํ์ต๋๋ค : tada : : unicorn : : sparkles :
์ด ์๋ฃจ์ ์ ์์ ์์์ง๋ง (์ฐพ๋ ๋ฐ ๋์์ด๋๋ ์๋ฃจ์ ๊ณผ ํจ๊ป ์ด์ ๋ฉ์ผ์ +1์ ๋ฃ์์ต๋๋ค) ๋ ๋ช ํํ๊ฒํ๊ณ ์ถ์์ต๋๋ค.
์ฌ๊ธฐ์ ํ ์์๋ ํ ๊ฐ์ง๋ ???? ํจ๋ ๋ด์ฉ๋ฌผ์์ ์ ์ ๋ ํด๊ฒฐ์ฑ ์ด ํฌํจ ๋ ๊ฒฝ๊ณ ๋ฅผ ์ ๊ณตํ์ญ์์ค. @ pedro-nonfree checkPad.js ๋๋ ๋ฌด์ธ๊ฐ์ ํจ์น๋ฅผ ์ ์ถํด ์ฃผ์๋ฉด ๊ธฐ๊บผ์ด ๋ณํฉํ๊ฒ ์ต๋๋ค :)
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ผ, ๋ก๊ทธ์ ์ค๋ฅ๊ฐ ์์ต๋๋ค!
์ฐธ์กฐ : https://github.com/ether/etherpad-lite/issues/3959