안녕하세요.
현재 vb3에서 Discourse로 대규모 커뮤니티를 이전하는 작업을 진행 중입니다.
약 1,200개의 사용자 이름에 느낌표(„!“)가 포함되어 있는데, 이를 다시 활성화할 수 있는 옵션을 찾을 수 없습니다.
이미 „유니코드 사용자 이름“을 활성화해 두었지만 효과가 없었습니다.
이 문제에 대해 이미 준비된 해결책이 있을까요?
감사합니다!
안녕하세요.
현재 vb3에서 Discourse로 대규모 커뮤니티를 이전하는 작업을 진행 중입니다.
약 1,200개의 사용자 이름에 느낌표(„!“)가 포함되어 있는데, 이를 다시 활성화할 수 있는 옵션을 찾을 수 없습니다.
이미 „유니코드 사용자 이름“을 활성화해 두었지만 효과가 없었습니다.
이 문제에 대해 이미 준비된 해결책이 있을까요?
감사합니다!
아니요. 사용자 이름에서 법적 문제를 일으키는 문자를 변경하는 것은 실제로 선택지가 아닙니다. 더 덜 흥미로운 사용자 이름을 사용해야 할 것 같습니다.
와, 꽤 큰 실수인 것 같은데요… 이에 대한 기술적인 설명이 있을까요? 플러그인이나 포크로 해결할 수 있을까요?
결정을 내린 사람은 아니지만, !가 사용자 이름에서 유효한 문자가 아닌 시스템은 꽤 많습니다. 플러그인(또는 포크)에서 !를 허용하려고 시도한다면, 나중에 Discourse를 다시 업그레이드하고 싶을 때 매우, 매우 나쁜 아이디어가 될 수 있으므로, 그것이 쉽지 않을 것이라는 것이 좋은 추측입니다.
!는 여러 컨텍스트에서 특별한 의미를 가지며, 사용자 이름 검증기만 변경하면 다른 여러 부분이 깨질 것이라고 의심합니다.
알겠습니다. 하지만 이 문제는 해결해야 합니다. 다른 모든 BB 솔루션은 사용자 이름에 해당 문자를 허용하며, 게임 커뮤니티에서는 흔히 사용됩니다. 이러한 제한이 없도록 사용자 이름과 사용자 ID를 별개의 항목으로 유지해야 합니다. 우리에게는 약 95,000명의 회원이 있으며, 그중 1,200명에게 사용자 이름을 변경하도록 연락하는 것은 정말 귀찮은 일이 될 것입니다. 그럼에도 불구하고 도움을 주셔서 감사합니다!
수백 건, 어쩌면 100건 이상의 가져오기를 수행했습니다. 여기서 가져오기에 대해 묻는 사용자들의 질문에 매우 주의를 기울이고 있습니다. 누군가가 이에 대해 불만을 제기한 것은 제가 기억하는限り 처음입니다.
모든 사용자에게 사용자명과 이메일 주소 양쪽을 시도해 보라고 안내할 수 있습니다(그중 상당수는 이메일 주소도 모를 것입니다). 다른 사용자명들이 변경되었을 가능성이 높습니다.
다음은 변경된 모든 사용자명을 가져오는 방법입니다:
UserCustomField.where(name: 'import_username').pluck(:value)
몇 가지 관련 주제를 찾았습니다:
https://meta.discourse.org/t/username-restrictions/126664
아마도 느낌표(!)뿐 아니라 더 많은 제한 사항이 있을 것입니다. 다른 곳에서는 이 문자들을 자유롭게 사용할 수 있는데, 이런 제한은 다소 이상해 보입니다.
어쨌든 도움을 주셔서 감사합니다.
이름과 사용자 이름은 동일한 개념이 아니라는 점을 짚어둘 필요가 있습니다. 사용자 이름은 URL 경로에 사용됩니다. 예를 들어:
https://meta.discourse.org/u/pfaffman/summary
느낌표는 URL에서 유효한 문자가 아니므로 사용할 수 없습니다. 또한 ?와 &와 같은 문자는 URL 구조에서 특수한 용도로 사용되므로 사용자 이름에도 포함할 수 없습니다. 이는 Discourse에 국한된 문제가 아니라, URL 구조에 사용자 이름을 사용하는 모든 시스템이 준수해야 할 규칙입니다.
사용자 이름에는 느낌표를 사용할 수 없지만, 이름에는 사용할 수 있습니다. UI에서 이름을 우선순위로 표시할 수 있습니다.
@Stephen, 완전히 말이 되네요. 설명해 주셔서 감사합니다.
import script를 다음과 같이 수정하면 될 것 같습니다:
username_original = username
username = @htmlentities.decode(user["username"]).strip
{
id: user["userid"],
name: username_original,
username: username,
password: password,
[...]
그리고 Discourse 설정에서 "name"이 존재하는 경우 username보다 우선순위를 갖도록 활성화하면 됩니다.
이 외에도 사용자 이름은 @언급에 사용되도록 설계되었기 때문에, 사용자 이름은 직관적이고 쉽게 입력할 수 있어야 한다는 기대가 있습니다. 이것이 기본 설정에서 ASCII 문자만 허용하는 이유입니다(다만 unicode_usernames 설정을 통해 유니코드로 확장할 수는 있지만, 여전히 구두점은 허용되지 않습니다).
참고로 해당 마이그레이션 스크립트는 비벌크(non-bulk) 마이그레이션 스크립트 기반 클래스를 사용하며, 이는 링크하신 메서드에 의해 생성된 각 사용자 레코드에 대해 다음을 수행합니다:
이 코드는 사용자 이름에서 무효한 문자를 제거합니다.
코드에는 사용자 이름에 대해 특정 사항을 가정하는 곳이 많습니다(@언급 파싱, 사용자 이름 변경 등). 이것이 이러한 제한을 강제하는 이유입니다.
Stephen이 말했듯이, 사용자 이름은 사용자 개성을 표현할 자리가 아닙니다. 이름과 플레어(flair) 필드가 그 역할을 합니다 ![]()
이러한 방식으로 유지되면 관리하기 어려운 특수한 사례가 여전히 꽤 많습니다.
이름은 고유하지 않으므로, 레이아웃에서 이름에 우선순위를 준다면, 그 결과가 어떻게 될지 상상해 볼 수 있습니다. 성숙하지 않은 십대들이 하루 종일 장난치고 트롤링하는 게시판이라면 말이죠. ![]()
이것이 낮은 우선순위 문제라고 말하는 것은 전혀 문제가 되지 않습니다. 하지만 분명히 더 많은 고민과 노력이 필요한 부분이며, 다른 모든 bb 소프트웨어처럼 강력한 제한 없이 고유한 이름을 선택할 수 있는 것보다 이점이 되는 "기능"이 절대 아닙니다.
사용자가 pfaffman!인 경우, URL은 일반적으로 다음과 같습니다:
https://meta.discourse.org/u/pfaffman!/summary
적어도 제가 사용해 본 다른 CMS들은 모두 이렇게 동작했습니다.
오, 좋네요! 선례가 있군요. ![]()
사용해본 오픈소스 CMS 프로젝트 중 몇 가지를 공유해 주실 수 있을까요? 그들을 살펴서 영구 링크(permalinks)와 사용자 참조를 어떻게 처리하는지, 그들의 노력에서 배워볼 수 있을 것 같습니다. ![]()
다만… 콘텐츠 관리 시스템(CMS)과 커뮤니티 포럼이 정확히 같은 범주에 속하는지 궁금하네요. ![]()
"vb3"는 vBulletin을 의미하나요?
네, 맞습니다.
또한, 특수 문자가 인코딩된다는 언급은 CMS에 고유한 것이 아니라 단순히 표준 인코딩 방식입니다: Percent-encoding - Glossary | MDN
그렇다면 @Crius를 어떻게 언급할 수 있을까요?!
![]()
But then how would we mention folks, @Crius?!
maiki!이라는 사용자명을 가진 사람을 언급하려면 @maiki!이라고 입력해야 하는 건가요?
vBulletin에서는 어떻게 작동하나요?
vBulletin 3에는 해당 기능이 없으며, vBulletin 5의 경우에도 최신 기능 측면에서 명백히 뒤처진 소프트웨어이기 때문에 해당 기능이 있는지조차 알 수 없습니다.
Discourse에서 누군가를 멘션(ping)하면 자동 제안(auto-suggest)이 나타납니다. 전체 닉네임을 직접 입력할 필요가 없습니다.
수정: 정말로 원한다면, 제안하기 전에 사용자 목록을 디코딩하여 제안하거나, 사용자가 입력한 부분 문자열을 인코딩하여 사용자 이름을 적절히 검색할 수 있도록 할 수도 있습니다.
솔직히 말해, 이를 구현하는 데 얼마나 많은 노력과 공력이 드는지에 대해서는 논쟁할 수 있지만, 그것이 가능한지 여부에 대해서는 논쟁할 수 없습니다.
어쨌든, 미디어가 분위기를 잘 전달하지 못하는 것일 수도 있지만, 최근의 답변들이 다소 "적대적"으로 느껴졌습니다. 사람들은 meta.discourse에 와서 도움을 요청하고 개선 사항을 제안합니다. 동의하지 않는다면 그냥 해당 스레드를 무시하고 넘어가면 됩니다.
또한, 잊고 있던 점을 추가하겠습니다. Discourse에 PR이 열려 있다면, 포크에서 작업한 후 PR을 열어볼 수 있습니다. 물론 저는 Ruby 개발자는 아니지만, 소프트웨어 엔지니어/플랫폼 엔지니어로 여러 년간 일해 온 경험이 있습니다. 기여를 해보고 싶습니다 ![]()
역사를 위해 업데이트를 남깁니다. 위에서 언급했듯이 !은 URL에서 금지된 문자가 아닙니다. 이 인식이 어디서 유래했는지 모르겠습니다.
하지만 Ruby는 함수에서 ?와 !를 사용하고 있는데, 솔직히 좀 이상한 것 같습니다 (적어도 제가 소프트웨어 엔지니어링을 20년 넘게 해본 경험에 비추어 보면요). 다만 각 언어마다 자기만의 관례가 있는 법입니다 ![]()
이는 !이 금지된 이유를 시사할 수도 있습니다. 이것이 해결할 수 없었던 특정 문제였는지, 아니면 사용자 이름과 Ruby 간에 엣지 케이스에서 발생할 수 있는 잠재적 문제를 피하기 위해 과도하게 금지한 것인지를 이해하기 위해 Discourse 소스 코드를 더 깊이 파고들어야 할 것 같습니다.
오래된 스레드를 다시 살려서 죄송합니다. 저도 같은 문제를 겪고 있는데, 제 추측으로는 |, [ 및 ]도 사용자 이름에서 허용되지 않는 문자이며, 어떤 방식으로든 활성화할 수 없는 것 같습니다.
phpBB3에서 Discourse로 오래된 게이밍 포럼을 마이그레이션하려고 하는데, 사용자 이름 중 많은 부분이 Clan|Nickname 또는 [Clan]Nickname과 같은 형식입니다.
스크립트를 수정해서 그런 문자를 찾아서 _나 - 같은 합법적인 문자로 대체하겠습니다. 그냥 제거될 것 같아요. 제안된 사용자 이름의 코드를 확인해 보실 수 있습니다.
처음으로 포럼을 Discourse로 마이그레이션했을 때, 공백으로 시작하는 문자를 포함한 불법 문자가 _로 대체되는 것을 알게 되었습니다. 하지만 이 포럼에서는 불법 문자가 공백인 경우가 가장 흔했으며, 그 빈도가 높지 않아 지금은 문제가 될 수 있지만 당시에는 큰 문제가 되지 않았습니다. 어쨌든 이것은 서비스 중단의 원인이 될 수 없습니다. 아마도 이름 필드에 기존 사용자명을 입력할 수도 있겠네요. 내 이머포트 컨테이너가 빌드되지 않는 다른 문제를 해결해 볼 때 알게 되겠지만요…