본문 바로가기

World Wide Web

(21)
[위키 엔진 개발기] 1. 렌더러 개발 - 시작과 redirect 사실 다른 기능부터 먼저 만들긴 했는데, 나무마크 렌더러에 대해서 먼저 써 보려고 한다. 사실 이걸 내 손으로 다시 만들게 된 이유는 시중에 돌아다니는 렌더러 코드 중 제대로 작동하는 게 없어서 그렇다. 그래서 앞으로 하게 된 삽질들이 여기 기록될 예정이다. 목표는 나무위키;문법 도움말을 넣고 돌렸을 때 문제없이 출력되는 것. 참고로 PHP다. 시작 일단 여느 렌더러처럼 클래스를 활용하기로 했다. 대략 NamuMark라는 상위 클래스 속에 필요한 함수들이 들어 있는 방식이다. public function __construct($txt){ $this->wikitext = $txt; $this->heading_tags = [ '/^====== (.*) ======$/' => ['level' => 6, 'fo..
[SQL] CIDR 목록 검색 예제(IPv4) 위키 엔진을 만들던 중 CIDR 차단 기능을 구현해야 하는데, 이걸 어찌할지 몰라 한참 고민하고 있었다. PHP 상에서 처리를 해야 하나 고민했지만 해답은 SQL에서 찾을 수 있었다. 문제 상황 나는 MariaDB를 운용하고 있었고, 테이블의 각 행에는 차단 대상으로 지정된 CIDR들이 등록되어 있었다. | id | target_ip | |—-|——————| | 1 | 1.2.3.4/32 | | 2 | 123.45.67.0/24 | | 3 | 123.45.0.0/16 | | 4 | 0.0.0.0/1 | 그리고 쿼리를 통해 접속한 IP가 차단 대상에 해당하는지 확인해야 한다. 그래서 특정 IP 주소를 포함하는 CIDR이 테이블 안에 있는지를 살펴야 한다. 검색 끝에 아래와 같은 쿼리를 찾았다. 원래는 CI..
[the seed] 오류 목록 더시드엔진에서 표출되는 각종 오류를 모아보았다. CSRF 방지 토큰이 일치하지 않습니다.: 세션에 남아있는 CSRF 토큰 값과 편집 페이지의 form에 입력된 CSRF 토큰 값이 차이가 있는 경우 문서 내용이 같습니다.: 저장하려는 문서 내용이 편집 전과 동일한 경우 ~의 값은 필수입니다: 필수 입력값을 채우지 않은 경우 expire의 값은 0 이상이여야 합니다.: ACL/aclgroup 적용 기간을 0 이상의 수로 입력하지 않은 경우 aclgroup_group_not_found: 없는 ACL그룹에 추가하려 시도할 때 acl_already_exists: 이미 존재하는 조건의 ACL 규칙을 추가하려는 경우 invalid_aclgroup: 없는 ACL그룹 이름을 ACL 규칙에 추가하려는 경우 invalid_..
[the seed] ACL the seed 엔진을 자체 분석해보고 쓰는 첫 글이 ACL이라는 것은, ACL에 관해서 쓸게 좀 있다는 소리..일 것이다. 이 ACL에 대해서 알아보도록 하자. ACL이란? Access Control List의 줄임말이다. 정보 이용 주체가 정보에 대해 가지는 권한을 정해 놓은 목록이다. the seed에 이런 기능이 있는 것은 아무래도 모니위키를 쓰던 리그베다 위키 시절의 잔재가 아닐까 싶다. the seed의 ACL 구조 더시드엔진에서 ACL은 문서 ACL과 이름공간 ACL로 이루어져 있다. 문서 ACL은 해당 문서 하나에만 적용되지만, 이름공간 ACL은 해당 namespace 안에 있는 모든 문서의 기본값으로 적용된다. 개별 문서 ACL은 이름공간 ACL보다 우선 적용되며, ‘허용’ 규칙이 없으면..
[the seed] 분석을 시작하며... 요즘 나무위키, 알파위키, 더시드위키 세 곳에서만 쓴다는 이 비공개 위키 엔진에 대해 관심이 커졌다. 그리고 나는 지금 그것을 PHP로 유사하게 구현하는 작업을 진행 중이다. 위키 엔진 제작 과정에서 얻게 된 정보들을 여기에 차근차근 남기고자 한다. 아마 기능적인 부분에 관한 내용이 많이 포함될 것이다.
[PHP] mbstring 없이 한글 문자열 다루기 보통 PHP에서 한글 글자수를 센다던가, substr을 통해 자른다던가, 한글자씩 분리한다던가 할 때 php-mbstring 확장을 사용한다. 만약 자신이 만들고 있는 PHP 앱이 빠른 속도를 요구한다면, mbstring 확장을 떨쳐 내는 것은 이를 위한 좋은 방법이 될 수 있다. 실제로 해외의 여러 커뮤니티에서도 mb_strlen() 등은 매우 느리다고 이야기하고 있고, 그래서 구글링 끝에 얻은 대안 두 개를 소개한다. 1. iconv_ php-iconv 모듈에 속해 있는데 대부분 내장이라 뭘 따로 설치할 필요는 없다.
[PHP 8] 시작과 끝 문자열 찾기 - str_starts_with(), str_ends_with() javascript에는 .startsWith()와 .endsWith() 라는 함수가 각각 시작과 끝 문자열을 반환해주는 기능을 한다. 그런데 PHP에는 이게 없어서 직접 기능을 구현해야 했다. 이 함수는 PHP 8에서 새롭게 추가된 기능인데, 문자열이 특정 문자로 시작하거나 끝나는지의 여부를 bool 형태로 반환한다. str_starts_with( string $haystack, string $needle ) str_ends_with( string $haystack, string $needle ) // 예제 $a = 'abcdefghi'; if(str_starts_with($a, 'a')){ echo 'Starts with a.'; }else{ echo 'NOT Starts with a.'; } if(s..
위키 엔진 개발기 - 0. 시작하기 전에 최근 위키에 관심을 가지면서 openNAMU, 미디어위키, 리버티엔진 등을 사용해 보았는데, 자유도 자체는 미디어위키가 가장 높았던 것 같다. 이 참에 나도 위키 엔진 하나쯤 만들어 보면 어떨까 싶었다. 그냥 만들어 보고 싶은거다. 미디어위키와 동일한 PHP로 제작할 예정이며, 나무위키 문법을 기본값으로 지원할 생각이다. 잘 되면 깃헙에 올리고 아니면 뭐... 개발환경은 PHP8.0이고 권장사양은 PHP7.3 이상으로 잡으려 한다. 나름 커스텀 스킨도 지원하고 확장 기능이나 미디어위키, 리버티엔진 등에서 데이터 이식하는 것까지도 지원해 볼 생각이다. 결국 목표는 이거다. PHP로 만든 나무위키같은 미디어위키. 이 시리즈가 위키 엔진을 개발하고자 하는 많은 이에게 도움이 되길 바란다.