요사이 벌여 온 텍스트큐브 2.0 베타판 수정 작업

  텍스트큐브의 정규 배포판은 1.10.10까지 나왔고, 시험판은 2.0 베타3이 마지막으로 나왔다.

  현재까지 배포된 텍스트큐브는 어느 판이나 PHP 7.3 이상에서 큰 문제가 생긴다. PHP 7.3부터는 인증 오류가 생기고, PHP 8.0부터는 PHP 오류로 블로그 화면이 뜨지 않는다. 이 문제 때문에 텍스트큐브는 PHP 7.2 이하의 옛 PHP 환경에서 돌릴 수 있고, 새 PHP 환경에서는 그대로 쓸 수 없다.

  글쓴이는 제로보드(zerobaord) 위에서 돌아가는 '조그(zog)'라는 블로그 도구로 쓰다가 2000년대 후반에 텍스트큐브로 옮겼던 적이 있다. 제로보드나 조그는 시대 흐름을 따라가지 못한 낡은 틀이었지만, 텍스트큐브는 군데군데 아쉬운 데는 있더라도 시대에 뒤떨어지지는 않은 도구이다. 다른 대안과 저울질해 볼 수는 있더라도, 텍스트큐브를 아예 버리기에는 기능이나 짜임새가 너무 아깝다. 잘 꾸리고 있던 블로그를 다시 옮기는 일이 달갑지 않기도 하다.

  그래서 글쓴이는 지난해까지 텍스트큐브를 1.10.10을 PHP 8.0 이상에서도 쓸 수 있게 고쳐 쓰고 있었다. 그러다가 지난해 초부터는 텍스트큐브 2.0 베타3을 PHP 8.0 이상에 맞추는 작업에 뛰어들었다.

  새로 프로그램을 만드는 것에 비할 바는 아니지만, 텍스트큐브 2.0 베타판을 쓸 수 있게 고치는 일은 용기와 끈기가 한가득 필요했다. 텍스트큐브 2.0 베타판이 고칠 곳이 너무나 많은 시험판이기 때문인데, 글쓴이의 지식과 능력이 형편 없어서 마주하는 문제들의 답을 얻는 데에 많은 시간이 걸렸다.

  결과물을 공개하려는 뜻이나 계획은 아직 없지만, 근황을 알리는 뜻에서 텍스트큐브 2.0 베타판에서 대체로 어떤 곳들을 고쳤는지를 간략하게 이야기해 본다. 고친 곳이 너무 많아서 다 적지는 못했다.

(1) PHP 세션 인증(로그인)에 얽힌 문제들

  현재까지 공개된 텍스트큐브 배포판들은 PHP 7.3부터 세션 인증 처리가 잘 되지 않는다. 로그인 화면에서 아이디와 암호를 넣으면 내부에서는 인증 처리가 되기는 되지만, 중간에 세션 아이디를 대조하는 일이 잘못되어 로그인한 웹 누비개에서는 블로그 관리 화면에 들어가지 못한다. 그 상태에서 같은 공인 아이피를 쓰는 다른 웹 누비개에서는 아이디와 암호를 넣지 않아도 관리 화면에 그냥 들어갈 수 있는 황당한 일이 벌어질 수 있다..

  이 문제를 인터넷 공유기로 공인 아이피 하나를 여럿이 함께 쓰는 곳에서 들키면 블로그 보안에 큰 구멍이 뚫릴 수 있으므로, 텍스트큐브를 쓰는 웹 서버에서는 PHP 판을 7.3 이상으로 올리는 일을 신중하게 할 필요가 있다.

  이 문제는 아래의 일들과 얽혀 있다.

  • PHP에서 기본으로 설정되는 세션 아이디(session id)의 길이가 32에서 26으로 바뀜
  • 텍스트큐브가 세션 아이디의 길이가 32이 아닌 때에 대비되어 있지 않음
  • PHP 7.3 이상에서 텍스트큐브 배포판의 세션 기능이 시작되지 않아서 난수로 만든 손님(guest) 세션 아이디를 session_id 함수로 지정할 수 없음 (session_start 함수가 작동하지 않음)

  PHP 7.2까지는 기본 세션 아이디(session id)의 길이가 32이었지만, PHP 7.3부터 26으로 바뀌었다. 텍스트큐브는 16진수 난수로 32자리 세션 아이디를 만들어 왔다. 이 때문에 세션 아이디의 길이를 32로 두지 않는 웹 서버에서 오류가 날 수 있다.

  php.ini에서 세션 아이디 길이는 session.sid_length 변수로 바꿀 수 있다. php.ini에 적힌 주석문에는 session.sid_length의 기본값(default value)이 32이라고 나오지만, PHP 7.3 이후에 적용되고 있는 기본값은 26이다. (굵은 글씨)

; Set session ID character length. This value could be between 22 to 256.
; Shorter length than default is supported only for compatibility reason.
; Users should use 32 or more chars.
; http://php.net/session.sid-length
; Default Value: 32
; Development Value: 26
; Production Value: 26
session.sid_length = 26

  글쓴이는 [텍스트큐브] PHP 7.3 이상에서 관리자 인증이 잘못되는 문제 깁기 (TC 1.10.10)에서도 PHP 7.3 이상에서 일어나는 텍스트큐브 1.10.10의 세션 인증 문제를 푸는 Textcube.Control.Session.php 파일을 공개한 적이 있다. 잘잘한 문제가 더 있어서 그 뒤에도 공개한 파일에 더 고쳐 쓰고 있었는데, 텍스트큐브 2.0 베타3에서도 세션 인증 처리 문제를 풀려고 Textcube.Control.Session.php 파일을 아래와 같은 줄거리로 고쳤다.

  • 텍스트큐브에서 세션 아이디 길이가 32이 아닌 때에도 세션을 처리할 수 있게 함
  • 손님 세션은 PHP 함수를 통하는 세션으로 다루지 않음
    (손님의 세션 아이디는 예전처럼 16진수 난수 문자열로 만들어 DB의 세션 테이블에 기록함)
  • 인증(로그인)한 사용자의 세션은 PHP 함수를 통하여 실제 세션으로 다룸
  • 인증(로그인)한 사용자의 세션 아이디는 session_regenerate_id 함수로 바꿈
    (session_id 함수도 쓰지만 인증한 사용자의 세션 아이디를 바꾸는 데에는 쓰지 않음)
  • 로그인한 때에는 PHP의 세션 함수를 통하여 세션 아이디를 지정함
    (세션 아이디를 session_id 함수로 바꾸지 않고 session_regenerate_id 함수로 바꾸게 함)
  • IP 주소는 기기를 움직여 쓰면 바뀔 수 있으므로 세션이 같은지를 따지는 기준으로 삼지 않음

(2) PHP 8 대응

  PHP 7.3이나 PHP 7.4에서는 앞에서 이야기한 세션 인증 문제가 일어나지만, 그래도 PHP 7에서는 텍스트큐브를 깔면 블로그 화면이나 로그인 화면은 볼 수 있다. 하지만 PHP 8에서는 먼저 일어나는 내부 오류 때문에 블로그 화면도 뜨지 않는다.

  PHP는 프로그램 부호글(코드)을 한 줄씩 읽어 실행하는 인터프리터(해석기) 방식인 것이 특징이다. 하지만 요즈음의 PHP는 JIT 컴파일러도 쓰며 기계어 번역을 통하여 실행 속도를 높이는 길을 꾀하고 있다. 이 때문에 PHP의 함수 표현 및 이용 방법이 기계어 번역로 번역하기 간편한 쪽으로 바뀌고 있고, 사람들에게 편했던 방법이 하나둘씩 점점 막히고 있다.

  이를테면 예전에는 substr, strpos, preg_match와 같은 문자열을 다루는 함수들에서 문자열이 들어가는 매개변수 자리에 null 값이나 값이 지정되지 않은 변수도 넣을 수 있었지만, 요즈음에 바뀐 PHP 환경에서 그렇게 하면 비권장 경고문(Deprecated)이 나오거나 오류(Fatal Error)가 뜰 수 있다.

  이는 텍스트큐브에서만 겪는 문제가 아니다. PHP 함수를 쓰는 방법에서 융통성이 조금씩 줄어들다 보니, 워드프레스나 라이믹스 같은 PHP 프로그램들도 PHP의 판이 올라갈 때마다 거듭 홍역을 치르고 있다. 그런 PHP 프로그램들이 새로운 PHP에서 잘 돌 수 있는 것은 새 PHP 환경에 맞추어 고치는 작업을 꾸준히 벌인 덕분이다.

  아래는 PHP 8.0 이상에서 텍스트큐브 2.0 베타3을 돌릴 때에 보일 수 있는 PHP 디버그 로그 일부이다.

Deprecated: Non-static method Filter::isFiltered() should not be called statically in /.../interface/owner/communication/comment/index.php on line 354

Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP; Filter has a deprecated constructor in /.../framework/legacy/Textcube.Data.Filter.php on line 5

Deprecated:  Array and string offset access syntax with curly braces is deprecated in /.../library/model/reader.common.php on line 5

  PHP를 판올림하고 살피면 어느 PHP 프로그램에서나 이와 비슷한 경고문들이 나올 수 있다. Deprecated 경고문이 뜨는 함수는 아직은 그대로 쓸 수 있지만, 다음 PHP 판에서는 함수를 그 방식으로 쓰지 못하거나 함수를 아예 쓰지 못할 수 있다. 당장은 잘 된다고 내버려 두다가 비권장 경고문(Deprecated)이 오류문(Fatal Error)으로 바뀌는 때가 닥치면, 새 PHP 판으로 바꾸었을 때에 PHP 프로그램이 빈 화면이 뜨며 멎을 수 있다.

  요즈음의 새 PHP 판에서는 아래와 같은 변수 또는 함수 표현/이용 방법들을 바꾸어 줄 필요가 있다.

  • $a{$b} → $a[$b]
  • non static 함수와 static 함수의 요소 접근 ( :: -> )
  • strtime 함수 → date 함수
  • while(list(...) = each)) → foreach(... as ... => ...)
  • 선언하지 않고 쓰는 클래스 내부 변수

  이 가운데는 PHP 8로 올라가면서 바뀐 것도 있고, PHP 8.0에서 PHP 8.1 또는 PHP 8.2로 올라가면서  바뀐 것도 있다. PHP 판이 올라갈 때마다 PHP 프로그램을 고칠 일이 생겨서 버겁지만, 고쳐야 할 폭은 점점 줄어들고 있다.

  새 PHP 판을 따라가지 않고 옛 PHP 환경에 머물러서 새 PHP 판에서 나오는 경고문이나 오류문을 보지 않을 수도 있다. 하지만 그렇게 하면 텍스트큐브를 다른 웹 프로그램과 함께 쓰지 못하고 따로 관리해야 할 수 있다. 옛 PHP 환경의 보안 문제에도 신경 써야 할 수 있다.

  2000년대에 쓰이던 제로보드(zeroboard)는 틀이 너무 낡아서 오늘날의 웹 환경에서 쓰려는 일은 보람을 찾기 어렵다. 하지만 텍스트큐브는 오늘날에 보아도 알찬 기능들을 담고 있고, 그냥 버리기에는 짜임새와 기능이 훌륭하다. 새 PHP 환경 때문에 막히는 곳을 잘 뚫어 나갈 수 있다면, 그 동안 텍스트큐브를 만족하며 쓰던 사람들이 다른 대안을 찾아나서는 것에 따르는 걱정을 덜 수 있을 것이다.

(3) 텍스트큐브의 주요 기능 복구

  정식으로 공개된 텍스트큐브 배포판들은 앞에서도 이야기한 PHP 8에서 일어나는 오류들 때문에 블로그 화면도 뜨지 않는다. 글쓴이의 지식과 실력이 좋지 않지만, 텍스트큐브 1.10.10 판에서까지 나오는 경고문과 오류문을 조금씩 없애는 작업을 해 본 덕분에 텍스트큐브 2.0 베타판에서 생기는 문제들도 몇 차례 실패한 끝에 조금씩 풀 수 있었다. 고쳐야 할 세부 기능이 너무 많아서 고난의 행군이 되고 말았지만, 텍스트큐브 2.0 베타판이 미완성판이어도 짜임새가 잘 잡혀 있어서 그 안에서 필요한 실마리를 많이 찾을 수 있었다.

  아래는 텍스트큐브 2.0 베타3에서 쓸 수 있게 복구하거나 고친 기능이나 해결한 문제 가운데 굵직한 것들을 추린 것이다. 글쓴이가 기억하지 못하는 내용도 있으므로, 고치거나 건드린 기능이 이보다 많을 수 있다.

  • 복구한 관리 기능
    • 블로그, 사용자, 서버 설정
      • 블로그 추가/수정/삭제 기능
      • 사용자 추가/수정/삭제 기능
    • 마우스 딸깍(클릭)을 글 권한/상태 설정
    • 1차/2차 블로그 주소 설정
    • 백업 기능
      • 블로그 데이터 백업/복원 (TTXML 형식)
      • 플러그인 설정 데이터 백업/복원 (TTXML 형식)
    • 덧글 기능
      • 덧글 알리미 기능
        • PHP의 allow_url_fopen을 막으면 file_get_contents 함수를 쓰는 외부 접속이 막히므로, curl 함수로 바꿈
      • 휴지통 자동 삭제가 안 되는 것을 고침
  • 위젯 관리
    • 텍스트큐브 2.0.0 베타1에서 제거된 사이드바에서 미리보기 모드를 다시 살림주1
  • 덧글 휴지통 기능 정상화
    • 데이터베이스에 덧글 휴지통 테이블이 따로 생겼으나, 베타3에서 그에 맞게 데이터베이스 처리 작업을 고치는 일은 마무리되지 않았음
    • cron 예약이 잘 되지 않아서 휴지통에 들어간 덧글이 15날이 지나도 지워지지 않는 문제를 고침
  • 관리자 제어판
    • 폴리머 기반 관리자 제어판을 없애고 1.10.×의 관리자 제어판으로 되돌림
    • 주로 쓰는 디자인을 amino에서 canon으로 되돌림

  PHP 오류 때문에 백업 기능을 비롯한 많은 기능들이 막힌 상태였다. 구조 개편이 덜 되었거나 오탈자가 끼었거나 SQL 등에 논리적으로 틀린 데가 있어서 실행 결과가 잘못 나오는 경우도 있었다.

  고친 내역은 모두 떠올리기 어렵고 여기에 다 적을 수 없을 만큼 많다. 많은 수가 1.10.×판까지 잘 되다가 안 되는 기능들이다. 자주 쓰이거나 꼭 필요한 기능부터 차근차근 복구했지만, 자세히 찾아보면 고쳐야 할 기능들이 더 있을 수 있다.

  전역 변수를 Context 객체로 바꾸는 작업이 덜 된 것에 따른 오류를 고치는 것이 흔히 했던 일 가운데 하나였다. 자바스크립트를 이용하는 비동기 처리가 잘 작동하지 않는 것 때문에 블로그/사용자/서버 설정을 비롯한 많은 기초 관리 기능들이 되지 않는 문제도 있었다.

  텍스트큐브 개발진의 뜻을 따르지 못하고 옛 방식으로 되돌린 기능도 있다. 텍스트큐브 2.0에 새로 들어갔던 폴리머 기반 관리자 스킨을 쓰면 tinyMCE 편집기에 글 내용이 젼혀 나오지 않았는데, 이를 풀 방법을 찾을 수 없었다. 그래서 1.× 판에서 쓰던 관리자 스킨(canon)을 쓰는 쪽으로 되돌렸다.

(4) 벌레 잡기

  아직 완성판이 아닌 텍스트큐브 2.0 베타판은 오류가 매우 많은 상태이다. 텍스트큐브 2.0 베타3만의 오류도 있지만, 캐시 갱신 쪽에서 1.×판에서도 알게 모르게 괴로움을 안긴 오류들이 있다. 텍스트큐브 2.0에 새로 들어갔지만 수정 작업이 마무리되지 않아서 작동하지 않거나 오류를 일으키는 기능도 있다. 글쓴이가 잡은 벌레도 여기에 적은 것이 다는 아니다.

  • 보안 문제
    • 글갈래(글 분류)의 글 목록에 공개하지 않았거나 임시 저장된 글의 제목이 뜨지 않게 함
    • POST 방식으로 요청받을 때 max_input_vars 한계에 걸리는 오류가 뜨지 않게 함 (preprocessor.php)주2
  • 캐시 기능
    • 상대/절대 주소 설정에 맞게 글이 갱신되지 못하는 문제를 고침
    • 페이지 캐시 기능을 쓸 때 글을 고쳐도 옛 글이 보이는 문제를 고침
      (페이지 캐시 로그 테이블과 페이지 캐시 파일이 갱신되지 않아서 생김)
    • 플러그인 설정을 바꾸었을 때에 위젯 내용 등이 갱신되지 않는 문제 고침
      (텍스트큐브의 쿼리 캐시가 갱신되지 않아서 생김)
    • memcached 기능 일부를 복구힘
      (세션을 memcached로 다루는 기능은 복구하지 못함)
      • memcached 기능을 켜면 "Allowed memory size of ~ bytes exhausted" 오류가 뜨는 것을 고침
      • 플러그인 설정을 바꾸었을 때에 위젯 내용 등이 갱신되지 않는 문제 고침
        (memcached의 쿼리 캐시와 DB의 페이지 캐시 로그 테이블 값이 갱신되지 않는 문제)
      • memcached 만료 시간을 무제한(0)에서 900초(15분)로 바꿈
      • memcached 주소로 아이피 주소 및 포트가 아닌 소켓 파일을 지정해서 쓸 수 있게 함
  • DBModel 클래스 보완
    • where 절에서 같은 변수를 AND 또는 OR 연산자로 거듭 다룰 수 있게 함
    • regexp 연산자를 쓸 수 있게 함
    • 값에 들어간 따옴표를 어떻게 처리할지를 더 세분함
  • 글 목록에서 한꺼번에 글 속성 바꾸기
    • 여러 글의 권한을 한꺼번에 바꿀 때 DDOS 공격 방어 설정에 좀 더 걸리지 않도록 지연 시간을 둠
  • 스킨 미리보기
    • 디렉토리 이름에 들어가는 문자 때문에 미리보기가 안 되는 문제 고침주3
  • 덧글 휴지통 기능
    • 새로 생긴 덧글 휴지통 기능에 얽힌 부호글을 고치는 일을 마무리함
    • cron 예약이 잘 되지 않아서 휴지통에 들어간 덧글이 15날이 지나도 지워지지 않는 문제를 고침
  • '2주 동안 로그인 상태 유지' 기능이 되게 고침

1) 공개하지 않은 글이 글 목록에 뜨는 문제

  텍스트큐브 2.0 베타3은 글갈래(카테고리) 고리로 들어간 때에 공개하지 않은 글이 목록에 뜨는 문제가 있다. 공개한 글만 목록에 뜨도록 고쳤다.

  더러는 끼우개(플러그인) 쪽에서도 임시 저장된 글이 독립된 글로 뜨기도 했다. 자세히는 기억하지 못하지만 함수에 들어간 DB 물음글을 고쳐야 하는 일이었다.

2) POST 방식 요청으로 생기는 오류

  웹 서버의 접속 로그를 살피면, 워드프레스처럼 널리 쓰이는 웹 도구들의 보안 취약점을 노리는 접속 시도를 심심하지 않게 볼 수 있다. 대개는 이미 보안 취약점을 막은 판이 쓰여서 공격하는 쪽의 뜻대로 되기 어렵지만, 언젠가 하나는 걸리겠지 기대하며 일단 찔러 보는 공격이 거듭될 수 있다.

  그런 접속 시도에 텍스트큐브가 직접 피해를 입지는 않지만, 다른 도구를 겨냥한 POST 요청이 텍스트큐브에 엉뚱한 결과를 만드는 때는 있다. 텍스트큐브는 덧글 알리미 기능이 POST 방식 요청을 통하여 작동하는데, 다른 도구를 겨냥한 POST 요청이 텍스트큐브에서 바라지 않는 형식(JSON, XML, HTML 형식 등)으로 들어와서 max_input_vars 값에 얽히는 오류가 뜰 수 있다. 공격하는 쪽에서는 거부 응답(404)이 나오지 않아서 효과가 있다고 여기고 비슷한 요청을 거듭 보낼 수 있다.

  이 문제는 file_get_contents 함수를 써서 POST 요청 내용을 살피고 텍스트큐브에서 다루는 형식이 아니면 POST 요청에 응답을 거부하게 하여 풀 수 있다. (/library/preprocessor.php)

3) 쿼리 캐시 갱신 문제

  텍스트큐브 1.×에서도 캐시 갱신이 드물게 안 되는 때가 드물게 있었던 것 같다. 2.0 베타판에서는 글을 이미 고쳤는데도 캐시에 남은 옛 글이 뜨거나 끼우개(플러그인) 설정이 갱신되지 않는 때가 있다. 글이나 설정을 새로 올리거나 바꾼 때에 캐시 항목들(글, 덧글, 걸린글, 글갈래, DB 등)을 더 철저히 비우게 하여 그런 문제들을 고쳐 나갔다.

  MySQL에도 쿼리 캐시(query cache) 기능이 있지만,주4 텍스트큐브에도 자체 쿼리 캐시가 있다. 텍스트큐브의 쿼리 캐시는 MySQL DB 테이블에 기록되고, memcached를 쓴다면 memcached 값으로도 기록된다. 끼우개 설정이나 덧글이 바뀔 때에 DB와 memcached의 쿼리 캐시가 갱신되지 않아서 옛 정보가 보이는 일이 생겼는데, 쿼리 캐시가 잘 갱신되게 하여 옛 정보가 보이지 않게 고쳤다.

4) memcached 기능 일부 복구

  텍스트큐브 2.0 베타3에서 memcached 기능을 켜면 "Allowed memory size of ~ bytes exhausted..." 오류가 뜬다. 관련 클래스들과 변수들의 이름과 사용 형식을 점검해서 오류를 없애고 memcached를 쓰는 쿼리 캐시 기능을 복구했다.

  DB를 쓰는 쿼리 캐시와 마찬가지로, memcached를 쓰는 쿼리 캐시 기능에도 글 정보나 끼우개 설정이 바뀐 뒤에 쿼리 캐시가 잘 갱신되지 않는 때가 있는 것을 고쳤다.

  캐시 만료 시간이 무한대여서 캐시가 차지하는 메모리 크기가 끝없이 느는 문제가 생겼다. 캐시 적중률을 살펴 가장 적당해 보이는 900초(15분)를 memcached 캐시 만료 시간으로 잡았다.

  memcached 호스트는 아이피 주소 및 포트 번호만이 아니라 유닉스 소켓 파일로도 지정할 수 있는데, 소켓 파일을 쓰는 때에 TCP 포트 번호에 0이 아닌 양수값을 넣으면 memcahced 서버에 접근할 수 없다. 그래서 memcached 주소에 소켓 파일 경로가 들어가면 포트 번호에 알아서 0이 들어가게 하였다.

  memcached를 쓰는 세션 기능은 복구하지 못했다.

  글쓴이는 텍스트큐브 1.× 판에서 memcached를 쓰는 일에 성공하지 못했는데, 텍스트큐브 2.0 베타3을 고치는 작업을 통하여 텍스트큐브에서 memcached를 처음 써 보았다. 캐시 적중률이 96%쯤 나오는데 딱히 빨라진 느낌은 들지 않았다. 접속량이 그리 많지 않고 다른 캐시 기능과 이미 빠른 디스크 속도에 덕을 보고 있기 때문인 것 같다.

5) DBModel 클래스 보완

  텍스트큐브에서는 queryAll 함수 등으로 SQL 문장을 그대로 MySQL 물음글(쿼리)로 보낼 수도 있고, DBModel 클래스 객체를 통하여 MySQL 물음글을 보낼 수도 있다.

  DBModel 클래스 객체를 통하여 데이터베이스 물음글을 보내는 방식은 텍스트큐브 1.8부터 끼우개/살갗(플러그인/스킨) 개발자들에게 권장한 방식이다. 텍스트큐브 2.0에서는 핵심부(코어) 부호글에서 블로그 주요 기능들의 DB 물음글을 DBModel 객체를 통하여 다루도록 바꾸는 작업이 더 급격히 이루어졌다.

  그런데 아직 베타판인 텍스트큐브 2.0은 DBModel 객체를 더 이용하는 수정 작업이 마무리되지 않았다. PHP 부호글에 오탈자도 끼어 있고 DBModel 객체에 더 넣어야 할 기능도 있었다. 이를테면 같은 변수를 AND나 OR 연산자로 이어붙인 WHERE 조건문이 들어간 DBModel 객체는 결과를 낼 때에 오류가 난다. 이 문제는 같은 변수를 거듭 다룰 수 있게 DBModel 클래스를 고쳐서 풀 수 있었다. 더불어서 정규 표현식을 쓸 수 있는 regexp 연산자를 쓸 수 있게 하는 기능도 넣었다.

6) 글 목록에서 한꺼번에 글 속성 바꾸기

  요즈음에는 DDOS 공격에 대비하여 웹 서버에서 시간당 PHP 요청 수를 제한할 수 있는데, 그런 때에 글 목록에 뜨는 여러 글들의 상태 속성을 한꺼번에 바꾸면 접속 제한에 걸릴 수 있다. 그런 때를 막고자 여러 글의 속성을 한꺼번에 바꿀 때에 지연 시간을 조금 두었다.

7) 이름에 '-' 가 붙은 살갗의 미리보기가 되지 않는 문제

  앞에 올린 글 [텍스트큐브] 몇몇 스킨들이 미리보기가 안 되는 까닭에서도 이야기한 적이 있는데, 살갗(스킨)의 자료방(디렉토리, 폴더) 이름에 '-'가 붙으면 살갗(스킨)이 미리보기가 안 되는 문제가 있다. 앞의 글에서는 미리보기를 할 때에 Validator 클래스에서 파일 이름을 검사하는 과정을 건너뛰게 해서 넘어갔는데, 이 수정 작업에서는 Validator 클래스의 함수에서 자료방 이름처럼 파일 이름에도 '-'가 붙는 것을 허용하게 했다.

 8) 덧글 휴지통 기능

  텍스트큐브 1.×에서는 덧글 휴지통 구실을 하는 DB 테이블이 따로 없었고, Comments 테이블에서 isfiltered 값을 바꾸어서 덧글을 휴지통에 넣는 기능을 구현했었다.

  텍스트큐브 2.0 베타판에서는 TrashComments라는 이름으로 지운 덧글을 담는 DB 테이블이 따로 생겼다. 하지만 덧글 휴지통 테이블이 새로 생긴 것에 맞추어 PHP 부호글이 다 고쳐지지 않아서 잘 작동하도록 마무리지었다.

  cron 예약에서 막히는 데가 있어서 휴지통에 들어간 덧글이 15날이 지나도 지워지지 않는 것도 고쳤다.

9) '2주 동안 로그인 상태 유지' 기능 고침

  텍스트큐브 2.0 베타판에는 '2주 동안 로그인 상태 유지' 기능이 새로 들어갔지만, 이 기능을 제대로 쓸 수 있게 PHP 부호글이 다 정비되지 않아서 관련 파일(Textcube.Control.Session.php)을 더 고쳤다.

2) tinyMCE 편집기 개선

  글쓴이는 텍스트큐브 편집기에서 HTML 태그를 다루는 때가 잦은 편이다. 글 편집 화면과 HTML 부호글 화면을 오가며 글을 고치는 때가 잦은데, 두 화면을 오가면서 커서 자리가 사라지거나 커서가 글의 맨 처음으로 가는 것 때문에 긴 글을 다룰 때의 스트레스가 이만저만하지 않았다.

  더구나 텍스트큐브 2.0 베타판은 앞에서도 이야기한 것처럼 폴리머 기반 관리자 화면 스킨을 도입했지만 글을 편집할 수 있게 구성이 마무리되지 않았다. 글쓴이는 폴리머 기반 관리 스킨으로는 tinyMCE 편집기에 글 내용이 뜨게 할 방법을 찾을 수 없어서, 관리자 화면 스킨을 1.10.×판에서 쓰던 것과 같게 되돌려서 tinyMCE 편집기가 제대로 작동하게 하는 작업을 벌였다. 텍스트큐브 개발진의 뜻을 잇지 못하고 퇴행한 셈이지만, 그렇지 않고서는 블로그 글을 편집하는 기능을 살릴 뾰족한 수를 찾을 수 없었다.

  1.10.10 이하 판에서도 텍스트큐브의 글 편집 기능들에는 불편한 점도 있고 벌레(버그)도 있었다. 글쓴이는 1.10.× 판에서도 비공개로 글 편집 기능을 개선하는 작업을 벌였던 적이 있는데, 이를 2.0 베타판으로 옮기고 더욱 많은 기능들을 손질했다.

  • tinyMCE 편집기
    • 텍스트큐브에 들어간 tinyMCE 편집기를 4.9.11로 판올림함
    • 글에 들어가는 표 또는 표의 낱칸에 너비가 따로 들어가지 않게 함
      (화면에서는 마우스 딸깍으로 표의 너비가 바뀌지만, 실제 반영은 되지 않게 함)주5
    • 화면 폭에 어울리지 않게 나오는 항목들을 조절함
    • 편집 화면에서 HTML 태그 구조와 낱말 수가 나타나는 곳을 화면 맨 아래에 고정시킴
      (그 아래에 나오던 도구 상자는 그 위로 올림)
    • 편집 화면에서도 실제 블로그에 보이는 것과 같은 너비와 글꼴로 글을 볼 수 있게 함
      (CSS 파일 이름을 맞추는 것과 같은 조건들을 지킬 때에)
    • '포맷'에 글쓴이가 더러 쓰는 블록 요소를 더 넣음
    • 치환자에 메타 문자로 쓰이는 위아랫금(|)처럼 메타 문자로 쓰이거나 HTML 부호글에 HTML 참조형으로 들어가는 기호들이 잘못 나오는 것을 고침
  • 커서 자리
    • 글 편집 화면과 HTML 부호글 화면을 오갈 때에 커서 자리를 지키게 함
      (tinyMCE 편집기 끼우개와 거기에 들어간 codeMirror를 고침)
    • HTML 부호글 화면(codeMirror)에서 글 편집 화면으로 돌아올 때에 HTML 태그에 놓인 커서의 자리를 잘 가리게 함
    • 화살 글쇠로 글의 위 · 아래나 그림을 비롯한 객체를 오갈 때에 커서의 자리에 따라 화면이 위 · 아래로 움직이는 기능을 더 세밀하게 고침 (특수 글쇠를 함께 누르는 때는 완벽하지 않음)
  • 파일 올리기
    • zvcu 님의 플래시를 쓰지 않는 HTML5 멀티 업로더 기능을 붙임
      (텍스트큐브 1.10.10에 맞추어진 것을 2.0 베타3에 맞춤)
    • 여러 파일을 올릴 때에 DDOS 방어 설정에 걸리지 않게 지연 시간을 둠
    • 파일 목록에서 파일을 고르는 기능의 잘잘한 벌레들을 없앰
      • 파일 올리기/지우기 작업이 일단락되었을 때에 파일 목록의 초점이 별다른 목적 없이 맨 앞으로 이동하지 않게 함
      • 그림 파일의 미리보기 화면이 답답하지 않게 나오도록 비율을 고침
  • 갤러리 기능
    • 플래시로 구현하던 것(iMazing)을 자바스크립트로 구현함

1) tinyMCE 편집기 판올림

  텍스트큐브 배포판에 들어간 tinyMCE는 4.1.10판인데, 이를 4.9.11으로 올렸다.

  tinyMCE 편집기는 6.3.2판까지 나와 있는데, 판 번호가 높을수록 당연히 이 기능이 더 좋고 섬세하게 작동한다. 하지만 5.0판부터는 따로 등록해서 써야 하는 제약이 있다. 워드프레스에 아직도 tinyMCE 4.9.11가 쓰이고 있는 것도 이 때문일 것이다.

  tinyMCE 편집기에는 커서가 놓인 자리의 HTML 태그 구성이나 글에 들어간 낱말 수를 보여 주는 기능이 자체 끼우개 기능으로 들어 있다. 낱말 수를 세는 기능은 tinyMCE 4.1.10에서 정확하지 않았지만, 4.9.11으로 올린 뒤에 정확한 값이 나타난다. tinyMCE 판을 올려서 개선되는 점이 있었지만, 텍스트큐브에 맞게 고치는 작업도 함께 해 주어야 했다.

2) tinyMCE 편집기의 화면 구성 고치기

  텍스트큐브의 tinyMCE 편집기 아래에 붙는 끼우개 도구 상자(주석 추가, 지도 삽입하기 등)나 정보 표시줄(태그 구성, 낱말 수)은 차례가 어울리지 않아서 자리를 바꾸었는데, HTML 태그의 차례를 직접 바꾸지 못하고 자바스크립트로 차례를 바꾸었다. tinyMCE의 객체 요소들을 다 이해할 수 없기도 하고, 어떻게 하는 것이 가장 좋을지 아직도 판단이 서지 않는다.

  텍스트큐브에서 편집기에서 보는 화면과 손님이 보는 화면은 글꼴, 본문 너비 등에서 어딘가 다르게 나온다. 이리저리 시도해 보니 두 화면에서 같은 모습으로 글을 볼 수 있는 길은 있었다. 그렇게 하려면 손님이 보는 화면의 CSS 파일을 편집기에서 불러올 수 있게 파일 이름을 맞추는 조건을 따라야 한다.

3) 커서 자리

  텍스트큐브의 글 편집 화면과 HTML 부호글 화면을 오갈 때에 커서 자리가 멀리 달라나지 않게 하는 것이 글쓴이의 오랜 소원이었다. 텍스트큐브에 tinyMCE 편집기와 함께 들어간 코드미러(CodeMirror)도 새 판으로 올리고 더 고쳐서 바라던 바를 꽤 이룰 수 있었다. HTML 부호글에서 글 편집 화면으로 돌아올 때에 HTML 태그에 놓인 커서의 자리를 다루는 것도 보완했다.주6 워드프레스도 참고했는데, 워드프레스도 커서 자리를 맞추는 기능에서 tinyMCE 4.9.11를 쓰는 것에 따르는 한계를 안고 있다.주7

텍스트큐브 tinyMCE 편집기에서 글 편집 화면과 HTML 부호글 화면을 오갈 때의 커서 자리
텍스트큐브 tinyMCE 편집기에서 글 편집 화면과 HTML 부호글 화면을 오갈 때의 커서 자리

  위아래 화살 글쇠(↓, ↑)로 글 편집 화면에서 오갈 때에는 커서 자리에 따라 화면이 알맞게 위아래로 움직이게 하여 마우스 휠을 꼭 써야 하는 때를 줄였다. 크기가 큰 그림이나 객체와 얽히는 때에도 커서 자리와 화면이 적절히 움직이게 했다. 그러나 Ctrl+V 같은 조합 글쇠를 쓸 때의 커서 처리는 아직도 미흡한 데가 있다.

텍스트큐브 tinyMCE 편집기에서 위/아래 화살 글쇠를 누를 때 화면 밀어올리기/밀어내리기
텍스트큐브 tinyMCE 편집기에서 위/아래 화살 글쇠를 누를 때 화면 밀어올리기/밀어내리기

4) 치환자에 메타 문자로 쓰이는 기호가 들어갈 때의 문제

  HTML에서는 img 태그로 넣는 그림에 alt 속성으로 갈음글(대체 텍스트)를 넣을 수 있고, 블로그 도구들에는 그림 밑에 자막을 붙여 주는 기능이 들어가곤 한다. HTML에서 메타 문자로 쓰이는 < > " ' 같은 기호들은 태그의 속성값으로 그대로 넣으면 HTML 문서의 구조가 망가지므로, 그런 기호들은 &gt; 같은 HTML 참조형으로 바꾸어서 속성값에 넣는다.

  텍스트큐브는 그림이나 갤러리를 나타내는 [ ##_ | ... | ... | _## ] 꼴 치환자에 위아랫금(|)(수직선)을 메타 문자로 쓴다. 그림/갤러리 자막 내용의 위아랫금(|)은 치환자 안에 HTML 참조형인 &vert; 같은 꼴로 넣고, 편집 화면에서는 속성값에 HTML 참조형으로 들어간 기호를 본디꼴로 보여 줄 수 있어야 한다.

  텍스트큐브는 1.10.10판에서도 위아랫금만이 아니라 가운뎃점(·)이나 말줄임표(…) 비롯한 HTML 참조형이 있는 여러 기호들이 치환자와 편집 화면에서 때에 맞지 않게 바뀌는 문제가 있었다. 그래서 편집 화면과 HTML 부호글을 오가기가 꺼려지기도 했다. 지지난해에 이 문제를 텍스트큐브 1.10.10에서 풀려는 작업을 했었는데, 지난해에 그림이나 갤러리를 나타내지 않는 치환자까지 더 많은 경우를 따져 2.0 베타3에 접목했다. (/plugins/ED_tinyMCE/tinymce/plugins/TTMLsupport/plugin.js)

5) 파일 올리기 기능

  오랜 동안 텍스트큐브에서는 플래시 업로더가 여러 파일을 한꺼번에 올리는 구실을 해 주었지만, 이제 플래시가 보안 문제로 웹에서 퇴출되어 플래시 업로더는 쓸 수 없게 되었다. 다행히 zvcu 님이 플래시를 쓰지 않는 HTML5 멀티 업로더를 공개해 주셨는데, 텍스트큐브 1.10.×판에 맞춘 것을 텍스트큐브 2.0 베타3에서도 작동하도록 수정 작업을 벌였다.

  이밖에도 파일 목록에서 나타나는 잘잘한 오류나 불편한 점을 줄여 나갔다. 여러 파일을 올리거나 파일을 더하고 지울 때에 파일 목록의 초점이 자연스럽지 않게 옮겨 가는 것을 고쳤고, 미리보기 화면에 그림이 될 수 있으면 잘 보이도록 미리보기 그림의 비율을 조절했다.

텍스트큐브의 파일 업로드 기능 (파일 올리기)

6) 갤러리 기능

  텍스트큐브에서는 플래시 갤러리 기능이 쓰였지만, 플래시(Flash)가 보안 문제로 웹 누비개들에서 퇴출된 뒤에는 플래시를 쓰는 기능을 쓸 수 없다. 그래서 플래시가 아닌 자바스크립트를 쓰는 방법으로 갤러리 기능을 되살렸다.

텍스트큐브 글 편집 화면 - 갤러리 기능 설정
텍스트큐브 글 편집 화면 - 갤러리 기능 치환자 (HTML 부호글)

  여기에 보기로 든 네덜란드 나막신 모형은 처음에 플래시 갤러리(iMazing)로 돌렸던 것인데, gallery.js 파일을 고쳐서 비슷한 전환 효과를 내는 갤러리를 만들었다.

(6) 그 밖에 더하거나 개선한 기능

1) UTF8MB4 (에모지 지원)

  MySQL에서 UTF8MB3을 기본 UTF-8 문자 집합으로 써 온 써 온 텍스트큐브는 요즈음에 유니코드에 새로 들어간 에모지(emoji, 이모지)나 고대 문자들을 다루지 못할 수 있다. 텍스트큐브에서 에모지(emoji)를 쓸 수 있게 하는 MySQL / MariaDB 설정에서 이야기한 대로 MySQL에서 쓰는 기본 UTF-8 문자 집합을 UTF8MB4을 쓰게 하여 유니코드에 들어가는 모든 문자들을 다루게 하였다.

2) confit.php에 $service['useSSL']이 들어가지 않는 것 보완

  텍스트큐브 1.10.10까지는 HTTPS를 쓰는 때에 config.php에서 $service['useSSL']에 참값을 넣었지만, 텍스트큐브 2.0 베타부터는 config.php에 $service['useSSL']이 들어가지 않는다. 이 점을 반영하여 /framework/model/URIHandler.php 파일을 조금 더 간결하게 고쳤다.

3) $serviceURL 값

  $serviceURL에 해당하는 값에 기본값으로 빈 값이 들어가게 하였다. (/interface/control/server/config/index.php)

        'serviceurl'             => array('string')
        'serviceurl'             => array('string', 'mandatory' => false, 'default' => ''),

4) 스킨 치환자에 [##_article_rep_url_##] 치환자 더함

  스킨 치환자 가운데 블로그 글 주소를 나타내는 [##_article_rep_link_##]가 있지만, http:// 또는 https://가 빠진 경로를 나타낸다. http:// 또는 https://까지 나오는 주소도 필요할 수 있는데, 스킨에서 HTTPS를 쓰는지 안 쓰는지를 판단해서 처리하려면 번거롭다. 그래서 /interface/common/blog/entries.php에 [##_article_rep_url_##]를 더했다.

dress('article_rep_link', $permalink, $protectedEntryView);
dress('article_rep_url', $defaultURL.$permalink, $entryView);

5) 줄글(라인) 기능 보완

  줄글(라인)의 내용에 웹 주소가 들어가면 고리(링크)가 저절로 걸리게 하였다.

6) 그물누리집 지도 (사이트맵)

  http://블로그 주소/sitemap에서 그물누리집 지도(사이트맵)을 나타내는 기능을 넣었다. 블로그의 대문(cover), 글, 방명록 주소가 목록으로 나오게 하였다.

  검색기에서 그물누리집 지도에 들어가는 웹 주소의 수를 제한할 수 있는데, 이에 대비하여 목록을 나누는 기능은 아직 넣지 못했다.

7) 보람말 목록과 보람말 구름(태그 클라우드) 위젯에 캐시 적용

  http://블로그 주소/tag에 뜨는 보람말 목록은 손님과 관리자가 다르게 보일 수 있다. 어떤 경우인지를 가려서 보람말 목록 내용을 페이지 캐시에 담게 하였다. (https://pat.im/1241)

  블로그에 보람말이 많고 접속량도 많으면, 보람말 구름(태그 클라우드, tag cloud) 위젯 기능을 쓰면서 보람말을 무작위로 보여 주도록 했을 때에 DB에 큰 부하가 걸릴 수 있다. '스킨 상세 설정'에서 시간을 정하여 보람말 구름의 내용을 캐시에서 꺼낼 수도 있게 하였다.

8) HSTS 지원 기능 끔

  텍스트큐브 2.0 베타판에는 HTTPS를 쓸 때에 HSTS(HTTP Strict Transport Security)를 쓸 수 있게 헤더를 넣는 기능이 들어 있다.

// Enabling HSTS when SSL is enabled.
if ($context->getProperty('service.useSSL',false) == true) {
header("strict-transport-security: max-age=".$context->getProperty("service.timeout",3600));
}

  HSTS 헤더는 웹 서버 쪽에서 지정하는 때가 많은데, 텍스트큐브에서 지정하면 웹 서버 쪽의 설정이 적용되지 않는 문제가 생긴다. 유효 시간(max-age)의 값도 텍스트큐브에서 쓰이는 세션 유효 시간과 꼭 같아야 할 까닭도 없다. 그래서 텍스트큐브에서 HSTS 헤더를 넣는 기능을 일단 막았다.

  HSTS 지원 기능을 텍스트큐브에서 다룬다면, 설정 화면이나 환경 설정 파일에서 켜고 끌 수 있게 항목을 따로 만드는 것이 좋을 것 같다.

(7) 복구하지 못한 기능, 손대지 못하거나 풀지 못한 문제

  방법을 찾지 못하거나 손댈 엄두가 나지 않아서 복구하지 못한 기능들도 많이 있다.

1) MySQL이 아닌 데이터베이스 엔진

  본래 텍스트큐브는 CUBRID, PostgreSQL, SQLite도 지원한다. 하지만 글쓴이는 MySQL 또는 MariaDB에서만 시험했고 다른 데이터베이스 엔진을 쓰는 때는 전혀 살피지 않았다.

2) memcached를 쓰는 세션 기능

  세션 기능은 DB를 쓰는 때만 복구했고, memcached를 쓰는 세션 기능(Textcube.Control.Session.Memcached.php)은 복구하지 못했다.

  서버 관리자 및 서비스 운영자를 위한 텍스트큐브 1.8 안내에서는 아래처럼 memcached를 쓰는 세션 기능의 대안으로 세션 테이블을 메모리(MEMORY) 방식으로 바꾸는 방법도 소개하고 있다.

세션 관리 변경

 텍스트큐브 1.8의 세션 관리는 기본적으로는 텍스트큐브 1.7과 같이 데이터베이스를 사용하는 방법입니다. 그렇지만 PHP 5의 특성을 이용하여 세션 객체를 효율적으로 사용하여 단위 시간당 처리 가능한 세션의 수는 텍스트큐브 1.7에 비하여 두 배 가까이 증가하였습니다. 만약 memcached 를 사용할 수 있는 경우, 세션 처리를 memcached를 사용하여 처리할 수 있습니다. 이 경우 세션 처리의 병목 현상이 획기적으로 줄어들게 됩니다.

만약 memcached를 사용할 수 없는 경우, 비슷한 효과를 얻기 위하여 Sessions 테이블을 MEMORY 타입으로 변경할 수 있습니다. 이 때 data 필드에 블로그 관련 권한 및 로그인 관련 데이터가 serialize되어 저장되므로, data 필드의 크기를 varchar(2048) 이상으로 잡아주시기 바랍니다. (초기값은 text이지만, MEMORY 타입에서는 모든 필드의 크기가 정확하게 지정되어 있어야 합니다.) 하지만 이 방법은 데이터베이스 데몬을 이용하는 방법이므로, 가능한 경우에는 꼭 memcached를 사용하시기 바랍니다.

서버 관리자 및 서비스 운영자를 위한 텍스트큐브 1.8 안내

3) setup.php를 통하는 설치 기능

  일부 오류를 잡는 작업은 했으나, 아직까지 setup.php 파일을 써서 텍스트큐브 2.0을 새로 설치하는 일에 성공한 적은 없다.

4) 3단계 이상 글갈래 나누기

  텍스트크뷰에서 글갈래(카테고리)는 2단계까지만 둘 수 있다. 이 점이 텍스트큐브 블로그의 쓰임새를 넓히는 것에 제약이 되는 면이 있다. 워드프레스처럼 글갈래를 3단계 이상 둘 수 있으면 좋겠지만, 아직 글쓴이의 희망 사항일 뿐이다.

5) 블로그 통계

  텍스트큐브의 관리 기능 가운데 블로그 통계를 그래프로 보여 주는 기능이 있다. 이 그래프 기능이 플래시로 돌아가는데, 오늘날의 웹 환경에서 플래시가 퇴출되어 블로그 통계 그래프를 볼 수 없다. 플래시가 아닌 오픈 소스 도표 기능을 끌어 오면 될 것 같지만, 블로그 통계의 그래프 기능은 복구하지 못했다.

6) 웹 누비개마다 다르게 작동하는 기능

  tinyMCE 편집기에서 그림을 딸깍하면 크롬, 엣지, 오페라에서는 그림이 곧바로 블록으로 싸인다. 하지만 파이어폭스에서는 두 번 딸깍해야 블록으로 싸인다.

  tinyMCE 편집기에서는 글을 편집하는 화면을 띄우고 글을 한 번이라도 고치면 그 뒤에 로그인이 풀리지 않는데, 다른 웹 누비개에서는 글을 고치는 작업을 멈추면 글을 편집 화면이 그대로 떠 있어도 로그인이 풀린다.

7) 본문 영역 밖의 치환자

  여러 블로그에서 같은 살갗(스킨)을 쓴다면, 블로그마다 어느 자리에 서로 다른 차림표(메뉴)를 붙이는 기능이 필요할 수 있다. 텍스트큐브에서는 본문 영역 밖에 치환자를 붙이는 일을 사용자가 직접 하기 어렵다. 살갗에서 본문 영역 밖에 붙일 수 있는 치환자를 미리 지정하여 끼우개 또는 살갗 설정을 통하여 넣고 싶은 내용을 따로 넣을 수 있게 하면 좋겠다는 생각이 들지만, 아직 이런 기능을 만들지 못했다.

(8) 당장 공개하지 못하는 까닭

  글쓴이는 텍스트큐브 같은 프로그램을 새로 만들 능력이 없다. 다른 쪽으로라도 글쓴이의 능력이 좋았다면, 텍스트큐브를 고치는 일에 절박하게 매달리지 않았을지도 모른다.

  능력도 좋지 않고 경험도 많지 않은 글쓴이가 용기를 내서 텍스트큐브 2.0 베타판을 고치는 일을 시작할 수 있었던 것은 1.×판부터 오류가 나는 데를 조금씩 고쳐 본 적이 있었기 때문이다. 이미 잘 짜인 텍스트큐브의 부호글(코드)과 텍스트큐브 그물집 및 GitHub 저장소에 쌓인 정보들을 참고할 수 있었고, 잘 작동하는 옛 판과 대조할 수 있고 워드프레스를 비롯한 다른 도구들을 참고할 수 있는 것도 도움이 되었다.

  그럼에도 텍스트큐브 2.0 베타판을 고치는 일은 산 넘어 또 산을 넘는 일이었다. 고쳐야 할 데가 너무 많았고, 다 고쳤다고 생각한 데에서 오류가 자꾸 보이는 일이 거듭되었다. 될 것 같은데 좀처럼 안 되는 일로 작업 시간이 늘어져 밤을 새는 때가 많았다. 실력 있는 전문가라면 금방 뚝딱 해치웠을 수 있을 일들을 하나하나 어렵게 풀다 보니 몸과 마음이 녹초가 되곤 했다. 앞뒤 안 가리고 고친 끝에 일단 텍스트큐브 2.0을 적어도 글쓴이는 잘 쓸 수 있게 고쳐 놓았지만, 고친 내역을 GitHub에 잘 정리해서 올리는 일은 쉽지 않게 되었다.

  혼자 쓰는 프로그램을 만들 때에는 만드는 사람의 요령과 편의만 따져 간편하게 만들 수도 있다. 여기저기에서 얻은 프로그램들을 조합해서 변칙 운용도 할 수 있다. 하지만 누구나 쓰기 좋게 만드는 것을 목표로 하는 때에는 프로그램을 만드는 편의만 앞세울 수 없다. 요령을 부리기 어려운 초보자가 쓴다고 생각하고 설정 항목들을 더욱 잘잘히 나누고 배려해야 할 수 있다. 사용자 의견을 들으며 미리 내다보지 못한 상황을 보완해 나가는 작업도 필요하다.

  글쓴이가 고친 텍스트큐브 2.0 베타 미공개 수정판도 이 문제에서 자유롭지 않다. 자동 설치에 성공하지 못했고, MySQL 계열이 아닌 다른 데이터베이스 엔진으로 쓰는 때는 아예 검토하지도 않았다. 잘 되는 기능만 내세우면 '텍스트큐브 2.1'라고 일컫고 싶은 불손한 생각도 들지만, 새로 설치하는 일에 성공하지 못한 사실만으로도 배포판이 될 자격이 없다. 글쓴이가 평소에 쓰지 않고 있는 기능들에도 적지 않은 오류들이 도사리고 있을 것이 뻔하다.

  글쓴이는 텍스트큐브와 그 부속 요소들의 부호글(코드)이 공개된 덕을 크게 보아 왔으므로, 그에 보답하는 뜻에서는 글쓴이가 고친 결과물도 공개하는 것이 옳을 것이다. 하지만 텍스트큐브 핵심부를 보수하는 일은 여러 환경에서 호환 문제나 보안 문제까지 헤아려야 할 수 있어서 전문가들의 분업과 협업이 필요할 수 있다. 전문성이 떨어지는 개인이 복잡한 일들을 다 짊어지기에는 너무 벅차다. 배포판답게 만드는 일을 더 벌이기에는 능력과 체력과 시간이 따라주지 않는다.

  그런 점에서 그 동안 텍스트큐브 또는 그 부속 도구를 개발하는 데에 이바지한 분들이 겪었을 고충이 조금은 와닿는다. PHP 웹 프로그램은 처음에 아무리 잘 만들어졌어도 오래도록 잘 쓰이려면 자꾸 바뀌는 웹 개발 환경에 맞추어 보수 작업을 거쳐야 하는 것이 어쩔 수 없는 현실이다. 처음 만들 때 들어가는 시간과 노력이 가장 크더라도, 보수 작업에 들어가는 시간과 노력도 오래 쌓이면 만만하지 않다. 그런데도 글쓴이조차 텍스트큐브에 대한 보수 작업이 저절로 잘 되기를 바라고 있었으니, 욕심이 지나쳤던 것 같다.

  텍스트큐브에 불리하게 기울어진 대세는 돌이키기에 너무 늦었다. 설치형 블로그를 바라는 이들은 워드프레스로 많이 옮겨 갔고, 텍스트큐브의 자유도와 익숙함을 누리고 싶은 이들은 티스토리로 많이 넘어갔다. 텍스트큐브가 거의 망한 상태가 되어서 글쓴이가 텍스트큐브 2.0 베타판을 고치는 일에 더 마음 놓고 뛰어들 수 있었지만, 어쩌다 크게 벌이는 작업으로 텍스트큐브 생태계를 확 살릴 수는 없다. 아쉽고 안타깝지만 마땅한 길이 없는 것 같다.

※ 더 작업한 내용

  • HTTP/3을 쓸 때에 $_SERVER['HTTP_HOST']가 비는 것에 따르는 문제 고침 (2022.11)
    (00-UnifiedEnvironment.php)
  • PHP 8.2부터 비권장 경고문이 나오는 '선언하지 않고 쓰는 클래스 동적 요소' 문제 고침 (~2023.9)
    (Deprecated: Creation of dynamic property ... is deprecated)
  • 보람말 이름을 바꾸면 보람말이 지워지는 것을 막음 (2023.11) (https://pat.im/1408)
  • 링크 분류를 고치면 오류가 나는 것을 고침 (2023.11)
    (/library/model/blog/link.php)
  • 갤러리에 들어간 그림들을 처음에 한꺼번에 읽지 않고 한 장씩 나타날 때마다 읽게 함 (2013.12)
  • 움직그림에 미리보기와 재생 단추 넣기 (Play 유형 새로 넣음) (2023.12)
    (/interface/owner/entry/edit/index.php 등)
    • 갤러리 기능의 틀을 활용함
  • svg, webp, avif 파일 지원 (2023.12)
    • 프레임워크 파일 고침 (Image.php)
    • '파일 업로드 및 삽입'에서 파일 올리기, 미리보기를 할 수 있게 함 (svg는 미리보기 못함)
      (/interface/owner/entry/edit/index.php)
    • 표지 및 SNS 끼우개 및 도구에서 webp, avif를 그림 형식으로 받아들이게 함
  • 제목 주소에서 마침표(.)와 함께 쉼표(,) 가운뎃점(·)주8, 그침표(:), 머무름표(;), 물결표(~) 들도 -로 바꾸게 함 (getSlogan 함수) (/interface/owner/entry/edit/index.php) (/library/model/blog/entry.php) (2023.12)
  • RSS 주소에 https가 들어가면 RSS로 링크 정보를 채우는 기능이 되지 않는 문제를 고침 (2023.12.12)
    • 외부 주소가 https로 시작하면 fsockopen 함수에 넣는 호스트 정보에 ssl://을 붙이고 포트 번호가 지정되지 않은 경우까지 확인함 (/library/funcion/xml.php의 get_remotefile 함수)
    • RSS로 자기 서버에 있는 블로그 정보를 불러오는 기능은 되지 않음
  • HTML5 재생기를 쓰는 Video 유형 새로 넣음 (2023.12.20)
〈주석〉
  1. https://github.com/Needlworks/Textcube/issues/1270에는 "관련해서 부르는 모듈이 너무 많고, 실제로 효용성도 그다지 좋지 않습니다. (D&D를 위한 공간이 너무 많이 필요합니다.)"라는 설명이 있다. 이에 얽힌 기술 문제는 잘 모르지만, 없으면 너무 답답할 만큼 편리하고 만족도가 매우 높은 기능이어서 다시 살렸다. back
  2. 주로 워드프레스를 겨냥한 POST 방식 공격 때문 back
  3. 디렉토리(자료방)이나 파일 이름이 바른지 검사하는 쪽에서 걸리는 문제이다. back
  4. MySQL의 쿼리 캐시는 테이블 단위로 자료가 하나라도 바뀌면 캐시를 비워서 효율이 낮은 것 때문에 쓰는 것을 권장하지 않는다. back
  5. 쓰는 사람에 따라 마우스로 표 일부의 너비를 조절하는 기능을 바랄 수 있지만, 글쓴이는 마우스를 잘못 다루어서 뜻하지 않게 표의 너비가 바뀌는 것이 불편해서 표의 너비를 넣는 기능을 막았다. back
  6. 커서가 표 안에 들어가거나 HTML 태그의 경계에 있다든지 하는 경우를 다루는 것도 보완했으나 완벽하게 다루는 것은 어려움이 있다. back
  7. 이를테면 워드프레스의 tinyMCE 편집기에서 PageUP/PageDown 글쇠로 오가는 때의 커서 처리는 tinyMCE 최신판을 쓰는 때보다 못하다. back
  8. PHP에서는 가운뎃점을 다루는 정규 표현식이 제대로 작동하지 않아서 str_replace 함수를 씀 back
글 걸기 주소 : 이 글에는 글을 걸 수 없습니다.

덧글을 달아 주세요

  1. 참빛바다 2023/07/12 14:53 고유주소 고치기 답하기

    오랜만에 텍스트큐브가 기억나서 검색하다 보니 개발이 중단되어서 아쉬운 기분이 들었는데 흥미로운 글을 발견했네요. 재미있게 읽고 갑니다 :)

    • 팥알 2023/08/17 21:40 고유주소 고치기 답하기

      덧글 달아 주신 걸 보았는데도 다른 덧글부터 답글 달면서 깜빡했습니다.

      손을 놓고 나서 시간이 좀 흘렀는지 이제는 뭘 고쳤는지도 기억이 가물가물합니다.
      능력과 체력에 한계가 있다 보니, 공식 개발이 쭉 이어지는 워드프레스나 라이믹스가 부럽기도 합니다.