Etherpad-lite: ํฌ์ฐฉ๋˜์ง€ ์•Š์€ ์˜ค๋ฅ˜ : ์–ด์„ค ์…˜ ์‹คํŒจ : ์ž˜๋ชป๋œ ๋ณ€๊ฒฝ ์ง‘ํ•ฉ (checkRep ์‹คํŒจ)

์— ๋งŒ๋“  2014๋…„ 03์›” 14์ผ  ยท  94์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: ether/etherpad-lite

์–˜๋“ค ์•„. ์šฐ๋ฆฌ๋Š” 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๋กœ ๋‚ด๋ณด๋‚ด๊ธฐ + ๊ฐ€์ ธ ์˜ค๊ธฐ (๋ชจ๋“  ๋ณ€๊ฒฝ ์„ธํŠธ๋ฅผ ์žƒ์Œ)ํ•˜์—ฌ ์ˆ˜๋™์œผ๋กœ ํŒจ๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ญ๊ฐ€ ์ž˜๋ชป๋œ ๊ฑด์ง€ ์•„์„ธ์š”?

Serious Bug Waiting on Testing

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์•ผ, ๋กœ๊ทธ์— ์˜ค๋ฅ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค!

[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

์ฐธ์กฐ : https://github.com/ether/etherpad-lite/issues/3959

๋ชจ๋“  94 ๋Œ“๊ธ€

์ตœ์‹  ๊ฐœ๋ฐœ ๋ธŒ๋žœ์น˜๋ฅผ ์‚ฌ์šฉํ•ด๋ณด๊ณ  ์—ฌ์ „ํžˆ ๋ฐœ์ƒํ•˜๋Š”์ง€ ์•Œ๋ ค์ฃผ์„ธ์š”.

์ด๊ฒƒ์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋งŽ์€ 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'.

๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์‹ค์ œ๋กœ ํŒŒ์ผ ์‹œ์Šคํ…œ์— ์žˆ์Œ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. (์ฃผ์„๊ณผ ์ค„ ๋ฐ”๊ฟˆ์ด ์žˆ์Œ) ์˜ค๋ฅ˜๋Š” ์—ฌ์ „ํžˆ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

asd

@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' }

์„œ๋ฒ„๋ฅผ ์ข…๋ฃŒํ•˜๋ฉด ๋ฉ”์‹œ์ง€๊ฐ€ ํด๋ผ์ด์–ธํŠธ์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

asd

์†์ƒ๋œ ํŒจ๋“œ์˜ 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

์ฐธ์กฐ : https://github.com/ether/etherpad-lite/issues/3959

๋ฟก๋ฟก
์šฐ๋ฆฌ 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 ๋˜๋Š” ๋ฌด์–ธ๊ฐ€์— ํŒจ์น˜๋ฅผ ์ œ์ถœํ•ด ์ฃผ์‹œ๋ฉด ๊ธฐ๊บผ์ด ๋ณ‘ํ•ฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค :)

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰