이 프로젝트는 블로그를 자동화 하는 시스템을 구축하여, 콘텐츠 관리에 드는 시간과 노력을 줄이는 것을 목표로 합니다. 특히 파일 경로를 자동으로 관리하고 문서에 반영되게 하거나, 컨텐츠 생성을 자동화 합니다. 이를 통해 보다 중요한 문제에 집중할 수 있게 합니다.
목차 생성 자동화를 위한 GithubAction
SharedBlock에 있는 내용을 Post로 옮기는 과정에서 파일의 경로를 가져오는데 번거롭고 어려움을 느꼈습니다. 특히 문서가 업데이트 될 때마다 경로를 직접 수정해야 하는 부분에서 일일이 찾아 수정하는 것이 힘들었습니다. 따라서 Github Action을 이용해 이 과정을 단순하게 했습니다.
SharedBlock 아래에 있는 분류에 따라 디렉토리를 만들며 각 파일은 파일명에 해당하는 범위에 대한 설명이 내용으로 들어가있습니다. 이를 분류하거나 어떤 내용들을 담고 있는지 보기 위해 파일의 디렉토리 명들을 모아 json형태의 파일로 또한 파일을 블로그 포스트에 쉽게 첩부하기 위해 Url과 태그에 대한 정보를 json형태의 파일로 만듭니다. 그리고 이를 이용하여 분류를 제목으로 하여 해당 목차로 바로 이동할 수 있습니다.
사용방법
- Github Repository에서 SharedBlock 폴더 아래에 문서를 작성하여 추가합니다.
- Github Action이 Data를 업데이트 할 때까지 기다립니다.
- 변경된 내용을 적용합니다.
설명
만들고자 하는 json파일은 다음과 같은 형태를 가집니다:
[
{
"Type": "Content",
"Name": "AlgorithmAndDataStruct",
"Path": "https://github.com/kbmhansungb/kbmhansungb.github.io/blob/master/_includes/_shared_block/AlgorithmAndDataStruct/AlgorithmAndDataStruct.md"
},
{
"Type": "Title",
"Header": "#",
"Name": "DataStruct"
},
{
"Type": "Content",
"Name": "AVLTree",
"Path": "https://github.com/kbmhansungb/kbmhansungb.github.io/blob/master/_includes/_shared_block/AlgorithmAndDataStruct/DataStruct/AVLTree.md"
},
원하는 json 형태를 생성하는 action과 이를 보여주는 post는 다음과 같이 작성합니다:
---
layout: post
title: Algorithm and data struct
---
{% assign datas = site.data.AlgorithmAndDataStruct %}
{% for data in datas %}
<!-- 목차 생성 -->
{{ data.Content }} {{ data.Name }}
<!-- 내용 추가 -->
{% if data.Path %}
{% include {{data.Path}} %}
{% endif %}
{% endfor %}
const fs = require('fs');
const folderPath = '_includes/_shared_block/AlgorithmAndDataStruct'; // 업데이트하려는 폴더의 경로
const outputPath = '_data/AlgorithmAndDataStruct.json'; // 결과를 저장할 Markdown 파일 경로
// 결과를 저장할 배열
dataList = []; // 결과를 저장할 배열
/**
* 디렉토리를 순환하며 dataList를 만듭니다.
* 폴더일 경우 Title을 만들고, 파일일 경우 Content를 만듭니다.
*/
function circuitDirectory(dirDepth, curruntPath) {
fs.readdirSync(curruntPath).forEach((name) => {
const filePath = `${curruntPath}/${name}`;
const stat = fs.statSync(filePath);
if (stat.isDirectory()) {
makeTitleData(dirDepth + 1, name, filePath);
circuitDirectory(dirDepth + 1, filePath);
} else {
makeContentData(dirDepth + 1, name, filePath);
}
});
}
/**
* 타이틀 데이터를 만듭니다.
*
* depth만큼 #을 header로 추가합니다. 예를 들어 depth가 2이면 ##을 추가합니다.
*/
function makeTitleData(depth, name, Path)
{
header = "";
for (let i = 0; i < depth; i++) {
header += "#";
}
dataList.push({
Type: "Title",
Header: header,
Name: name,
});
}
/**
* 컨텐츠 데이터를 만듭니다.
*/
function makeContentData(depth, name, path)
{
githubPath = "https://github.com/kbmhansungb/kbmhansungb.github.io/blob/master/" + path;
// name에서 .md를 제거합니다.
name = name.replace(".md", "");
dataList.push({
Type: "Content",
Name: name,
Path: githubPath,
});
}
/**
* 폴더 목록을 업데이트하고 결과를 출력하는 함수
*/
try {
console.log('updateSharedBlockBlock: Start \n');
circuitDirectory(0, folderPath);
const json = JSON.stringify(dataList, null, 2);
fs.writeFileSync(outputPath, json);
console.log('updateSharedBlockBlock: End \n');
} catch (err) {
console.error(err);
process.exit(1);
}
결론
SharedBlock에 문서를 추가하면 json 형태의 데이터에 추가되고 목차가 업데이트 됩니다. 이는 새로운 문서를 작성할 때 마다 해야하는 바복잡업을 줄여 문서를 작성하는데 더욱 집중할 수 있게 합니다.
참고
설명문 작성을 위한 GPT 커스터마이징
이전에 찾아놓고 정리하지 않은 지식들을 빠르고 편하게 정리하고자 하기 위해 GPT를 커스터마이징 하기로 했습니다. llama2 모델을 이용해 로컬에서 정리하는 방법과 ChatGPT를 이용할지 고민했습니다. llama2는 오픈되어 있고 또한 이를 이용한 확장 프로그램을 만들 수 있습니다. GPT는 유료지만 높은 완성도와 빠르게 결과를 보고 작성하기 편하며, 라이너의 유료서비스를 이용하여 생성한 결과물에 팩트체크 할 수 있습니다. 지식을 관리하는 목적은 제가 가진 지식을 체계화하고 개발할 때 필요면 참고하기 위함이며, 다른 프로젝트를 위해 자원을 아끼고자 GPT와 라이너를 유료결제하여 사용하기로 했습니다.
사용방법
- GPT에게 요구하는 설명문을 작성해 달라합니다.
- 라이너로 팩트 체크를 하고 설명문을 수정합니다.
- 원하는 결과가 나올 때 까지 반복하고, 안될 경우 직접 수정합니다.
설명
원하는 대답을 하기 위한 GPT Configuration의 설정은 다음과 같습니다.
Name:
설명문 작성
Description:
설명문 작성
Instructions:
Message를 정리하고 Markdown형식의 설명문으로 답변함
설명문의 끝에 정리한 내용의 출처와 링크를 [출처](링크)의 형태로 반드시 표시함
# 설명문
어떤 대상에 대한 정보, 사실, 지식, 원리, 개념 등에 관하여 글쓴이가 알고 있는 바를 독자가 쉽게 이해할 수 있도록 작성한 글입니다.
## 설명문의 특성
설명문은 다음과 같은 특성을 가집니다:
* 사실성: 정확한 정보나 지식을 사실에 근거하여 전달함
* 객관성: 글쓴이의 개인적인 생각이나 느낌을 배제하고 객관적으로 지식을 전달함
* 평이성: 읽는이의 이해를 돕기 위해 쉬운 어휘와 간결한 문장으로 씀
* 명료성: 뜻이 분명하게 전달되도록 정확하게 씀
* 체계성: 일정한 원리에 따라 체계적으로 정리함
## 설명문의 구성
설명문은 다음과 같은 구성을 따릅니다:
* 개요: 설명할 대상이나 동기, 목적, 방법 등을 밝힘
* 본문: 설명할 대상을 구체적으로 알기 쉽게 설명함
* 결론: 본문에서 설명한 내용을 요약, 정리하여 마무리함
* 참고: 출처를 [출처](링크)의 형태로 표시함.
## 예시
...
결론
커스터마이징된 GPT 설정을 통해, 일정한 양식의 정리된 설명문을 작성할 수 있습니다. 설명문을 작성하기 위한 부담을 줄임으로 다른 보다 중요한 문제에 더욱 집중할 수 있습니다.