Skip to content
This repository has been archived by the owner on Mar 16, 2022. It is now read-only.

Unexpected token in JSON at position 892 at JSON.parse #172

Closed
SungJJinKang opened this issue May 27, 2021 · 1 comment
Closed

Unexpected token in JSON at position 892 at JSON.parse #172

SungJJinKang opened this issue May 27, 2021 · 1 comment

Comments

@SungJJinKang
Copy link

Search engine doesn't works.
I got this error from my github io home page.

SyntaxError: Unexpected token in JSON at position 892 at JSON.parse (<anonymous>) at XMLHttpRequest.<anonymous> (https://sungjjinkang.github.io/assets/js/simple-jekyll-search.min.js:6:2178)
message: "Unexpected token \t in JSON at position 892"

this error occur at here

try {
   n(null, JSON.parse(e.responseText))
} catch (t) {
   n(t, null)
}

this is e.responseText

"[\n  \n    {\n      \"title\"    : \"SFINAE와 enable_if에 대한 이해\",\n      \"title-lower\"    : \"sfinae와 enable_if에 대한 이해\",\n      \"sub-titile\" : \"\",\n      \"sub-titile-lower\" : \"\",\n      \"categories\" : \"C++\",\n      \"tags\"     : \"\",\n      \"url\"      : \"/c++/2021/05/27/SFINAE.html\",\n      \"date\"     : \"2021-05-27 00:00:00 +0000\",\n      \"content\"     : \"void foo(unsigned int i) { std::cout &amp;lt;&amp;lt; &quot;unsigned &quot; &amp;lt;&amp;lt; i &amp;lt;&amp;lt; &quot;\\n&quot;; }template &amp;lt;typename T&amp;gt;void foo(const T&amp;amp; t) {  s...\"\n    } ,\n  \n    {\n      \"title\"    : \"free된 메모리에 접근하기??\",\n      \"title-lower\"    : \"free된 메모리에 접근하기??\",\n      \"sub-titile\" : \"\",\n      \"sub-titile-lower\" : \"\",\n      \"categories\" : \"C++\",\n      \"tags\"     : \"\",\n      \"url\"      : \"/c++/2021/05/23/accessAfterFree.html\",\n      \"date\"     : \"2021-05-23 00:00:00 +0000\",\n      \"content\"     : \"int main(){\tint* a = new int;\t*a = 5;\tint* b = a;\tdelete a;\tstd::cout &amp;lt;&amp;lt; *b &amp;lt;&amp;lt; std::endl;}위의 코드는 결과는??      정확히는 “ 알 수 없다 ( Undefined Behaviour ) “이지만 대부분의 경우 5가 출력될 것이다...\"\n    } ,\n  \n    {\n      \"title\"    : \"string에서 특성 character를 다른 character로 교체하기\",\n      \"title-lower\"    : \"string에서 특성 character를 다른 character로 교체하기\",\n      \"sub-titile\" : \"\",\n      \"sub-titile-lower\" : \"\",\n      \"categories\" : \"C++\",\n      \"tags\"     : \"\",\n      \"url\"      : \"/c++/2021/05/20/replace_char.html\",\n      \"date\"     : \"2021-05-20 00:00:00 +0000\",\n      \"content\"     : \"얼마 전 코딩 테스트를 보다가 재밌는 문제를 풀었다.     string에서 하나의 character을 교체하는 문제였다.     어찌보면 매우 쉬워보이는 문제인데 나는 당연히 이렇게 쉬운 문제를 그냥 내지는 않았을꺼 같고 빠른 방법을 찾으려 노력했다.매우 매우 긴 문자열이 있다고 하였을 때 특정 character를 다른 character로 교체할 때...\"\n    } ,\n  \n    {\n      \"title\"    : \"std::function은 왜 느릴까?\",\n      \"title-lower\"    : \"std::function은 왜 느릴까?\",\n      \"sub-titile\" : \"\",\n      \"sub-titile-lower\" : \"\",\n      \"categories\" : \"C++\",\n      \"tags\"     : \"\",\n      \"url\"      : \"/c++/2021/05/20/std_function.html\",\n      \"date\"     : \"2021-05-20 00:00:00 +0000\",\n      \"content\"     : \"우선 std::function을 왜 사용하는지를 알아야한다.  이유는 바로 polymorphism을 지원하기 위함이다. 템플릿을 사용하지 않고 어떤 함수 타입을 가진 다양한 오브젝트를 저장 혹은 전달하기 위해 사용된다.  polymorphism을 지원한다는 점에서 virtual 함수를 호출할 때와 std::function을 사용할 때 내부적으로 거의 ...\"\n    } ,\n  \n    {\n      \"title\"    : \"One Writer, Multiple Reader에서 불필요한 lock을 막기 위해 shared_mutex 사용하기\",\n      \"title-lower\"    : \"one writer, multiple reader에서 불필요한 lock을 막기 위해 shared_mutex 사용하기\",\n      \"sub-titile\" : \"\",\n      \"sub-titile-lower\" : \"\",\n      \"categories\" : \"C++\",\n      \"tags\"     : \"\",\n      \"url\"      : \"/c++/2021/05/20/shared_lock.html\",\n      \"date\"     : \"2021-05-20 00:00:00 +0000\",\n      \"content\"     : \"shared_mutex는 쓰레드간 어떠한 공유되는 변수가 있을 때 어떠한 쓰레드들은 그 변수에 write를 수행하고 어떠한 쓰레드들은 read만을 수행할 때 read 쓰레드들이 불필요하게 lock을 수행하는 것을 방지하기 위해 사용된다.shared_mutex에는 lock의 두 종류가 있는데 하나는 lock(), 다른 하나는 lock_shared()이다...\"\n    } ,\n  \n    {\n      \"title\"    : \"Lock Free Queue 디자인 ( 작성 중 )\",\n      \"title-lower\"    : \"lock free queue 디자인 ( 작성 중 )\",\n      \"sub-titile\" : \"\",\n      \"sub-titile-lower\" : \"\",\n      \"categories\" : \"C++\",\n      \"tags\"     : \"\",\n      \"url\"      : \"/c++/2021/05/20/lockfreequeue.html\",\n      \"date\"     : \"2021-05-20 00:00:00 +0000\",\n      \"content\"     : \"이 글은 대표적인 Lock Free Queue 오픈소스 concurrentqueue의 디자인에 대해 설명하는 글이다.reference : https://moodycamel.com/blog/2014/detailed-design-of-a-lock-free-queue.htm, https://moodycamel.com/blog/2014/a-fast-gener...\"\n    } ,\n  \n    {\n      \"title\"    : \"condition_variable 작동 원리와 Hurry Up And Wait,  Spurious wakeups(가짜 Wake up) 문제\",\n      \"title-lower\"    : \"condition_variable 작동 원리와 hurry up and wait,  spurious wakeups(가짜 wake up) 문제\",\n      \"sub-titile\" : \"\",\n      \"sub-titile-lower\" : \"\",\n      \"categories\" : \"C++\",\n      \"tags\"     : \"\",\n      \"url\"      : \"/c++/2021/05/20/condition_variable.html\",\n      \"date\"     : \"2021-05-20 00:00:00 +0000\",\n      \"content\"     : \"이 글에서는 condition_variable의 기본적인 작동 원리와 그와 관련된 두 문제인 Hurry Up And Wait, Spurious wakeups에 대해 알아보겠다.condition_variable은 다른 쓰레드가 공유되는 변수(조건 변수)를 수정하고 condition_variable에게 알릴 때(notify) 까지, 한 쓰레드 혹은 여러 ...\"\n    } ,\n  \n    {\n      \"title\"    : \"typename을 붙여야 하는 경우\",\n      \"title-lower\"    : \"typename을 붙여야 하는 경우\",\n      \"sub-titile\" : \"\",\n      \"sub-titile-lower\" : \"\",\n      \"categories\" : \"C++\",\n      \"tags\"     : \"\",\n      \"url\"      : \"/c++/2021/05/19/typenameExplicited.html\",\n      \"date\"     : \"2021-05-19 00:00:00 +0000\",\n      \"content\"     : \"짧게 말하자면 : 다른 타입에 의존적 관계에 있는 중첩 이름에 대한 참조를 할 때 마다. 예) 알려지지 않은 템플릿 매개변수를 가진 템플릿 인스턴스에 속한 이름길게 말하자면 : C++에는 엔티티들의 3가지 등급(종류이 존재한다. 값, 타입, 템플릿이 그것이다. 이 세개 모두 이름을 가지고 있고 그 이름 자체는 너에게 그것이 어떤 티어에 속한 것인지를 ...\"\n    } ,\n  \n    {\n      \"title\"    : \"Cache Coherency와 False sharing에 대한 구체적 예시\",\n      \"title-lower\"    : \"cache coherency와 false sharing에 대한 구체적 예시\",\n      \"sub-titile\" : \"\",\n      \"sub-titile-lower\" : \"\",\n      \"categories\" : \"ComputerScience\",\n      \"tags\"     : \"\",\n      \"url\"      : \"/computerscience/2021/05/14/cachecohrencyAndFalsesharing.html\",\n      \"date\"     : \"2021-05-14 00:00:00 +0000\",\n      \"content\"     : \"CPPCON 영상을 보다 얻은 Cache Coherency, False sharing에 대한 구체적인 예시를 들어보겠다.( 이 글의 모든 벤치마크는 x64 msvc 컴파일러에서 연산된 결과이다. )  Cache Coherency -static void atomicVersion(){    std::atomic&amp;lt;int&amp;gt; a;   ...\"\n    } ,\n  \n    {\n      \"title\"    : \"Branch Prediction에 대한 아주 구체적인 예시( virtual function call )\",\n      \"title-lower\"    : \"branch prediction에 대한 아주 구체적인 예시( virtual function call )\",\n      \"sub-titile\" : \"\",\n      \"sub-titile-lower\" : \"\",\n      \"categories\" : \"ComputerScience\",\n      \"tags\"     : \"\",\n      \"url\"      : \"/computerscience/2021/05/14/branchprediction.html\",\n      \"date\"     : \"2021-05-14 00:00:00 +0000\",\n      \"content\"     : \"CPPCON 영상을 보다 Branch Prediction에 대해 알게되어 글을 적어보겠다.( 이 글의 모든 벤치마크는 x64 msvc 컴파일러에서 연산된 결과이다. )Branch Prediction은 간단히 설명하면 if 분기점에서 CPU가 하나의 결과를 예측하여 그 예측한 결과를 토대로 명령어를 실행하는 방식이다. 이는 분기의 결과를 기다리는게 느리...\"\n    } ,\n  \n    {\n      \"title\"    : \"Cache Prefetcher\",\n      \"title-lower\"    : \"cache prefetcher\",\n      \"sub-titile\" : \"\",\n      \"sub-titile-lower\" : \"\",\n      \"categories\" : \"ComputerScience\",\n      \"tags\"     : \"\",\n      \"url\"      : \"/computerscience/2021/05/14/CachePrefetcher.html\",\n      \"date\"     : \"2021-05-14 00:00:00 +0000\",\n      \"content\"     : \"CPPCON 영상을 보다 Cache Prefetcher에 대해 알게되어 글을 적어보겠다.( 이 글의 모든 벤치마크는 x64 msvc 컴파일러에서 연산된 결과이다. )프로그램의 성능을 하락시키는 주 원인은 무엇일까? 바로 메모리 Fetch이다. 그래서 CPU는 캐시와 같은 더 빠른 메모리를 도입하였는데 Cache는 사이즈가 작아 Cache에 데이터가 없...\"\n    } ,\n  \n    {\n      \"title\"    : \"메모리 Reordering에 대한 풍부한 이해를 도와주는 글들\",\n      \"title-lower\"    : \"메모리 reordering에 대한 풍부한 이해를 도와주는 글들\",\n      \"sub-titile\" : \"\",\n      \"sub-titile-lower\" : \"\",\n      \"categories\" : \"ComputerScience\",\n      \"tags\"     : \"\",\n      \"url\"      : \"/computerscience/2021/05/13/MemoryReordering.html\",\n      \"date\"     : \"2021-05-13 00:00:00 +0000\",\n      \"content\"     : \"  컴파일 타임 메모리 Reodering  Acquire, Release Semantics  Memory Barrier에 대한 이해  CPU 아키텍쳐에 따른 Memory Reordering  강한 메모리 모델 vs 약한 메모리 모델  MESI 프로토콜, Cache Coherence, Memory Reordering\"\n    } ,\n  \n    {\n      \"title\"    : \"std::map vs std::unordered_map ( MSVC STL )\",\n      \"title-lower\"    : \"std::map vs std::unordered_map ( msvc stl )\",\n      \"sub-titile\" : \"\",\n      \"sub-titile-lower\" : \"\",\n      \"categories\" : \"C++\",\n      \"tags\"     : \"\",\n      \"url\"      : \"/c++/2021/05/08/unordered_map_vs_map.html\",\n      \"date\"     : \"2021-05-08 00:00:00 +0000\",\n      \"content\"     : \"std::map은 트리 형태로 데이터를 배치하여 찾으려는 key값과 현재 위치한 node의 key값을 비교하여 그 비교 함수의 결과에 따라 트리의 왼쪽 자식 노드로 갈지 오른쪽 자식 노드로 갈지를 결정하여 이를 반복해 원하는 key값의 node를 찾는 방식이다. 시간 복잡도로는 O(n)의 시간 복잡도를 가진다.                   std:...\"\n    } ,\n  \n    {\n      \"title\"    : \"atomic변수에서 Read-Modify-Store Operation은 locking없이 atomic할까?\",\n      \"title-lower\"    : \"atomic변수에서 read-modify-store operation은 locking없이 atomic할까?\",\n      \"sub-titile\" : \"\",\n      \"sub-titile-lower\" : \"\",\n      \"categories\" : \"ComputerScience\",\n      \"tags\"     : \"\",\n      \"url\"      : \"/computerscience/2021/04/10/atomic_read_modify_store.html\",\n      \"date\"     : \"2021-04-10 00:00:00 +0000\",\n      \"content\"     : \"선행지식 :std::atomic은 여러 기능을 가지고 있다.     우선 이름대로 명령어를 atomic하게 만들어낸다. atomic이란 indivisible이란 뜻으로 여러 Cycle에 걸쳐 수행하는 게 아닌 하나의 Cycle 내로 작업을 처리한다는 것이다.        하지만 하드웨어, OS에 따라 atomic 변수가 수행하는 작업이 무조건 atom...\"\n    } ,\n  \n    {\n      \"title\"    : \"캐시 일관성에 대해 ( 번역 )\",\n      \"title-lower\"    : \"캐시 일관성에 대해 ( 번역 )\",\n      \"sub-titile\" : \"\",\n      \"sub-titile-lower\" : \"\",\n      \"categories\" : \"ComputerScience\",\n      \"tags\"     : \"\",\n      \"url\"      : \"/computerscience/2021/04/06/cachecoherency.html\",\n      \"date\"     : \"2021-04-06 00:00:00 +0000\",\n      \"content\"     : \"이 글은 Cache coherency에 대한 글의 번역본이다.   의역이나 약간의 부정확한 번역이 있을 수 있으니 양해바람.    그리고 중요한 용어 같은 것들은 번역을 하지 않고 영어 그대로 썼다.또한 이해를 돕기위해 필자 나름 추가적인 설명을 써두었다.그리고 이 글을 읽은 후 이 글들도 읽어보기 바란다  글 1    글 2그 동안 잘못 이해하고 있...\"\n    } ,\n  \n    {\n      \"title\"    : \"ViewFrustum Culling(렌더링 빨리 하기)\",\n      \"title-lower\"    : \"viewfrustum culling(렌더링 빨리 하기)\",\n      \"sub-titile\" : \"\",\n      \"sub-titile-lower\" : \"\",\n      \"categories\" : \"Doom\",\n      \"tags\"     : \"\",\n      \"url\"      : \"/doom/2021/04/02/viewfrustumculling.html\",\n      \"date\"     : \"2021-04-02 00:00:00 +0000\",\n      \"content\"     : \"어떻게 하면 렌더링을 빨리 할 수 있을 까?? 다양한 연구와 자료들을 공부하였다.  여러 방법들이 있지만 대표적으로 Culling이라는 기법이 있다.   쉽게 말해서 그릴 필요가 없는 것은 안그린다는 것이다.  렌더링이 느려지는 원인은 결국 Graphics API 콜이다.         그래서 최대한 Graphics API 콜을 줄이는 것이는 것이 렌...\"\n    } ,\n  \n    {\n      \"title\"    : \"메모리 풀링(작성 중)\",\n      \"title-lower\"    : \"메모리 풀링(작성 중)\",\n      \"sub-titile\" : \"\",\n      \"sub-titile-lower\" : \"\",\n      \"categories\" : \"ComputerScience\",\n      \"tags\"     : \"\",\n      \"url\"      : \"/computerscience/2021/04/01/memorypooling.html\",\n      \"date\"     : \"2021-04-01 00:00:00 +0000\",\n      \"content\"     : \"게임을 계속 개발하다 모니 메모리 풀링이 필요하다는 것을 많이 느꼈다.  게임이다 보니 당연히 매 프레임마다 모든 Entity, Component들을 업데이트 해주어야하는 데 이 과정에서 그렇게 큰 부하가 필요하지 않는 데도 단지 모든 Entity, Component들을 iterate하기 때문에 속도가 매우 느렸다. 원인을 생각해보니 Entity, C...\"\n    } ,\n  \n    {\n      \"title\"    : \"False Sharing\",\n      \"title-lower\"    : \"false sharing\",\n      \"sub-titile\" : \"\",\n      \"sub-titile-lower\" : \"\",\n      \"categories\" : \"ComputerScience\",\n      \"tags\"     : \"\",\n      \"url\"      : \"/computerscience/2021/04/01/falsesharing.html\",\n      \"date\"     : \"2021-04-01 00:00:00 +0000\",\n      \"content\"     : \"Fasle Sharing이란??대다수의 CPU 아키텍쳐가 채용하는 캐시 시스템은 N-Way associate로 64byte로 나뉘는 n개의 address 세트가 한 캐시 라인을 사용한다. N개의 서로 다른 64byte의 데이터가 하나의 캐시 라인을 공유한다. 그럼 한 address가 캐시에 접근하려면 기존에 cache에 있던 데이터를 main memo...\"\n    } ,\n  \n    {\n      \"title\"    : \"캐시 친화적 코드란? (번역)\",\n      \"title-lower\"    : \"캐시 친화적 코드란? (번역)\",\n      \"sub-titile\" : \"\",\n      \"sub-titile-lower\" : \"\",\n      \"categories\" : \"ComputerScience\",\n      \"tags\"     : \"\",\n      \"url\"      : \"/computerscience/2021/04/01/cachefriendly.html\",\n      \"date\"     : \"2021-04-01 00:00:00 +0000\",\n      \"content\"     : \"게임과 같은 극한의 성능이 요구되는 환경에서는 캐시 hitting률을 높이는 것이 중요하다. 그래서 data - oriented design같이 data들을 configous하게 배치해서 캐시 히트를 높이고자 한다.     그런데 이론적으로는 캐시에 대해 빠삭한 데 어떻게 이걸 코드에 접목시킬 수 있을까??  그래서 스택오버플로우를 검색하던 중 좋은 ...\"\n    } ,\n  \n    {\n      \"title\"    : \"Memory Alignment\",\n      \"title-lower\"    : \"memory alignment\",\n      \"sub-titile\" : \"\",\n      \"sub-titile-lower\" : \"\",\n      \"categories\" : \"ComputerScience\",\n      \"tags\"     : \"\",\n      \"url\"      : \"/computerscience/2021/03/28/memoryalignment.html\",\n      \"date\"     : \"2021-03-28 00:00:00 +0000\",\n      \"content\"     : \"컴퓨터가 메모리에서 데이터를 가져오는 데 한번에 워드 단위로(64비트 환경에서는 8바이트, 32비트 환경에서는 4바이트)만 가져올 수 있다.또한 컴퓨터는 메모리에서 데이터를 가져올 때 가져올 메모리 데이터의 시작 주소는 꼭 워드의 배수여야 한다. 즉 워드가 4바이트이 환경에서 3번주소부터 4바이트를 가져오는 게 불가능하다는 것이다.그렇다면 만약 데이터...\"\n    } ,\n  \n    {\n      \"title\"    : \"condition variable이 atomic임에도 불구하고 write할 때 mutex로 보호해줘야하는 이유\",\n      \"title-lower\"    : \"condition variable이 atomic임에도 불구하고 write할 때 mutex로 보호해줘야하는 이유\",\n      \"sub-titile\" : \"\",\n      \"sub-titile-lower\" : \"\",\n      \"categories\" : \"ComputerScience\",\n      \"tags\"     : \"\",\n      \"url\"      : \"/computerscience/2021/03/28/condtionvariable_atomic.html\",\n      \"date\"     : \"2021-03-28 00:00:00 +0000\",\n      \"content\"     : \"선행 지식 :  condition_variable은 무조건 mutex를 lock한 후 predicate를 체크함 (lock 못하면 lock할 때까지 wait한 후 predicate 체크).          condition_variable은 다시 waiting에 들어가는 동시에 얻었던 mutex를 다시 release함.아래와 같은 경우를 가정해보자. ...\"\n    } ,\n  \n    {\n      \"title\"    : \"레지스터 종류, 역할 정리\",\n      \"title-lower\"    : \"레지스터 종류, 역할 정리\",\n      \"sub-titile\" : \"\",\n      \"sub-titile-lower\" : \"\",\n      \"categories\" : \"C++\",\n      \"tags\"     : \"\",\n      \"url\"      : \"/c++/2021/03/23/register.html\",\n      \"date\"     : \"2021-03-23 00:00:00 +0000\",\n      \"content\"     : \"추후 작성 예정\"\n    } ,\n  \n    {\n      \"title\"    : \"memcpy vs memmove\",\n      \"title-lower\"    : \"memcpy vs memmove\",\n      \"sub-titile\" : \"\",\n      \"sub-titile-lower\" : \"\",\n      \"categories\" : \"C++\",\n      \"tags\"     : \"\",\n      \"url\"      : \"/c++/2021/03/23/memmovememcpy.html\",\n      \"date\"     : \"2021-03-23 00:00:00 +0000\",\n      \"content\"     : \"간단히 설명하면 memcpy는 데이터를 그대로 WORD단위로 복사한다.   memmove는 똑같은 곳을 참조해서 복사하지 않는 지 체크하고 방지한다.  말이 어렵다 memmove의 구현 코드를 보자.#undef\twsize#define\twsize\tsizeof(word) // 워드의 사이즈는 항상 2의 pow이다#undef\twmask#define\twmas...\"\n    } ,\n  \n    {\n      \"title\"    : \"Pointer Type cast와 Value Type cast의 차이\",\n      \"title-lower\"    : \"pointer type cast와 value type cast의 차이\",\n      \"sub-titile\" : \"\",\n      \"sub-titile-lower\" : \"\",\n      \"categories\" : \"C++\",\n      \"tags\"     : \"\",\n      \"url\"      : \"/c++/2021/03/22/pointertypecast.html\",\n      \"date\"     : \"2021-03-22 00:00:00 +0000\",\n      \"content\"     : \"class A{    ~~~~}class B{    ~~~~}A a{};(B)a*(B*)&amp;amp;a위 (B)a와 (B)&amp;amp;a의 차이는 무엇인가.    첫번째 (B)a는 a 오브젝트를 typecasting하여서 새로운 클래스B의 오브젝트를 만든 것이다. 새로운 오브젝트를 만드니 runtime cost가 생긴다.반면 (B)&amp;am...\"\n    } ,\n  \n    {\n      \"title\"    : \"c++에서 inl파일의 의미\",\n      \"title-lower\"    : \"c++에서 inl파일의 의미\",\n      \"sub-titile\" : \"\",\n      \"sub-titile-lower\" : \"\",\n      \"categories\" : \"C++\",\n      \"tags\"     : \"\",\n      \"url\"      : \"/c++/2021/03/22/inlfile.html\",\n      \"date\"     : \"2021-03-22 00:00:00 +0000\",\n      \"content\"     : \"C++ 오픈소스 프로젝트를 공부하다 보면 종종 inl파일을 자주 보는 경우가 많다. 항상 이게 무슨 특별한 기능을 하지 않나 궁금하고는 하였다. 그래서 공부해보니 정말 별 의미가 없는 것이 있다.템플릿 클래스를 작성하거나 인라인 함수를 작성하며 대개 definition을 헤더파일에 넣는다.  그런데 헤더파일안에 declaration이랑 definiti...\"\n    } ,\n  \n    {\n      \"title\"    : \"SIMD(SSE) 사용하기\",\n      \"title-lower\"    : \"simd(sse) 사용하기\",\n      \"sub-titile\" : \"\",\n      \"sub-titile-lower\" : \"\",\n      \"categories\" : \"C++\",\n      \"tags\"     : \"\",\n      \"url\"      : \"/c++/2021/03/22/SIMD.html\",\n      \"date\"     : \"2021-03-22 00:00:00 +0000\",\n      \"content\"     : \"렌더링을 하는 데 ModelMatirx나 AABB등에 ModelMatrix를 적용하는 데 너무 많은 부화가 걸린다. 그래픽 API 콜보다 더 많은 부하가 걸려서 이걸 해결해야겠다는 생각이 들었다.  당연히 필자는 SIMD(SSE)를 찾아보았고 마침내 적용해보기로 하였다. SIMD를 잘만 적용하면 엄청난 성능향상이 오는 것으로 알 고 있다. SIMD에 ...\"\n    } ,\n  \n    {\n      \"title\"    : \"Occlusion Culling 여정(작성 중)\",\n      \"title-lower\"    : \"occlusion culling 여정(작성 중)\",\n      \"sub-titile\" : \"\",\n      \"sub-titile-lower\" : \"\",\n      \"categories\" : \"Doom\",\n      \"tags\"     : \"\",\n      \"url\"      : \"/doom/2021/03/19/ViewFrustumOcclusionCulling.html\",\n      \"date\"     : \"2021-03-19 00:00:00 +0000\",\n      \"content\"     : \"Occlusion Culling : 쉽게 생각하면 어떤 오브젝트들을 그리려고 할 때 그 오브젝트의 Data를 GPU에 넘기고, State 셋팅까지 다 했는 데 결국 Depth test를 통과하지 못하였다고 생각해보자. 그럼 Depth Test를 그리는 과정까지의 수 많은 Vertex Shading, Geometry Shading, Vertex Post...\"\n    } ,\n  \n    {\n      \"title\"    : \"왜 heap영역은 stack보다 느릴까?\",\n      \"title-lower\"    : \"왜 heap영역은 stack보다 느릴까?\",\n      \"sub-titile\" : \"\",\n      \"sub-titile-lower\" : \"\",\n      \"categories\" : \"ComputerScience\",\n      \"tags\"     : \"\",\n      \"url\"      : \"/computerscience/2021/03/07/whyheapisslowerthanstack.html\",\n      \"date\"     : \"2021-03-07 00:00:00 +0000\",\n      \"content\"     : \"stack영역은 해당 프로그램에 배당된 stack 사이즈가 얼만큼 배당되어 있다.(물론 이것도 나중에 늘릴 수 있다.)그럼 어떠한 scope에 진입하는 순간 그 scope에서 사용되는 메모리 사이즈만큼 stack pointer을 미리 이동시켜둔다. ( stack의 사이즈는 변함이 없고 현재 총 사이즈 중 어디까지 할당했는 지를 stack pointer...\"\n    } ,\n  \n    {\n      \"title\"    : \"constexpr의 definition이 헤더에 있어야하는 이유\",\n      \"title-lower\"    : \"constexpr의 definition이 헤더에 있어야하는 이유\",\n      \"sub-titile\" : \"\",\n      \"sub-titile-lower\" : \"\",\n      \"categories\" : \"C++\",\n      \"tags\"     : \"\",\n      \"url\"      : \"/c++/2021/03/07/constexpr.html\",\n      \"date\"     : \"2021-03-07 00:00:00 +0000\",\n      \"content\"     : \"매우 매우 간단하다.constexpr은 컴파일 타임에 결정된다는 의미다.    그럼 만약 헤더에 구현이 안되어 있으면 그 constexpr을 보는 다른 translation unit(cpp)들은 어떻게 컴파일을 할 수 있겠나???     constexpr은 컴파일 타임에 값이 알려져 있어야 한다는 것은 링커 단계 전에 그 값을 알아야한다는 것이므로 d...\"\n    } ,\n  \n    {\n      \"title\"    : \"가상 메모리 주소, 메모리 페이징에 대한 나의 이해\",\n      \"title-lower\"    : \"가상 메모리 주소, 메모리 페이징에 대한 나의 이해\",\n      \"sub-titile\" : \"\",\n      \"sub-titile-lower\" : \"\",\n      \"categories\" : \"ComputerScience\",\n      \"tags\"     : \"\",\n      \"url\"      : \"/computerscience/2021/03/05/virtualmemoryaddress.html\",\n      \"date\"     : \"2021-03-05 00:00:00 +0000\",\n      \"content\"     : \"우선 가상 메모리 주소를 왜 사용할까?? Physical한 메모리 주소를 사용하려면 프로그램(프로세스) 단에서 일일이 관리해야하는데 이걸 OS단에서 대신 해주어서 프로그램은 자신의 virtual address space만 신경 쓰면된다. 프로그램에서는 프로그램에 배정된 virtual address만 접근할 수 있으니 다른 프로그램의 physical a...\"\n    } ,\n  \n    {\n      \"title\"    : \"프로파일링 매크로 최적화하기(literal string overlap)\",\n      \"title-lower\"    : \"프로파일링 매크로 최적화하기(literal string overlap)\",\n      \"sub-titile\" : \"\",\n      \"sub-titile-lower\" : \"\",\n      \"categories\" : \"C++\",\n      \"tags\"     : \"\",\n      \"url\"      : \"/c++/2021/03/05/profilingmacro.html\",\n      \"date\"     : \"2021-03-05 00:00:00 +0000\",\n      \"content\"     : \"현재 진행 중인 프로젝트에는 프로파일링을 도와주는 코드가 있다.#define D_START_PROFILING(name, layer) doom::profiler::StartProfiling(name, layer)#define D_END_PROFILING(name) doom::profiler::EndProfiling(name)D_START_PROFILIN...\"\n    } ,\n  \n    {\n      \"title\"    : \"class의 member variable는 선언된 순서대로 intialized 된다\",\n      \"title-lower\"    : \"class의 member variable는 선언된 순서대로 intialized 된다\",\n      \"sub-titile\" : \"\",\n      \"sub-titile-lower\" : \"\",\n      \"categories\" : \"C++\",\n      \"tags\"     : \"\",\n      \"url\"      : \"/c++/2021/03/05/memberVariableInitializationOreder.html\",\n      \"date\"     : \"2021-03-05 00:00:00 +0000\",\n      \"content\"     : \"class A{public:    A()    {        std::cout &amp;lt;&amp;lt; &quot;A constructor&quot; &amp;lt;&amp;lt; std::endl;    }};class B{public:    B()    {        std::cout &amp;lt;&amp;lt; &quot;B const...\"\n    } ,\n  \n    {\n      \"title\"    : \"C++ get function definition 팁\",\n      \"title-lower\"    : \"c++ get function definition 팁\",\n      \"sub-titile\" : \"\",\n      \"sub-titile-lower\" : \"\",\n      \"categories\" : \"C++\",\n      \"tags\"     : \"\",\n      \"url\"      : \"/c++/2021/03/05/cppget.html\",\n      \"date\"     : \"2021-03-05 00:00:00 +0000\",\n      \"content\"     : \"std::string Asset::GetName(){\treturn this-&amp;gt;mName;}const std::string&amp;amp; Asset::GetName() const{\treturn this-&amp;gt;mName;}어떻게 보면 당연한 구현이다.  object가 const인 경우 GetName을 호출했을 때 GetName() ...\"\n    } ,\n  \n    {\n      \"title\"    : \"텍스쳐 압축을 위한 힘든 여정\",\n      \"title-lower\"    : \"텍스쳐 압축을 위한 힘든 여정\",\n      \"sub-titile\" : \"\",\n      \"sub-titile-lower\" : \"\",\n      \"categories\" : \"Doom3\",\n      \"tags\"     : \"\",\n      \"url\"      : \"/doom3/2021/03/02/texturecompression.html\",\n      \"date\"     : \"2021-03-02 00:00:00 +0000\",\n      \"content\"     : \"지금까지는 텍스쳐를 압축없이 png 그대로 가져다 써왔다. 언젠가는 텍스쳐 압축을 해야겠다는 생각은 하였는 데 때가 된 것 같다.    텍스쳐 압축은 해본 적이 없어서 인터넷 검색을 통해서 대충 어떻게 할지 정하였다.      간단하게 설명하자면 에디터 단계에서 각 게임 내에 사용되는 모든 텍스쳐를 DXT 포맷으로 압축 후 dds파일로 저장한다.   ...\"\n    } ,\n  \n    {\n      \"title\"    : \"문뜻 발견한 virtual table pointer의 존재\",\n      \"title-lower\"    : \"문뜻 발견한 virtual table pointer의 존재\",\n      \"sub-titile\" : \"\",\n      \"sub-titile-lower\" : \"\",\n      \"categories\" : \"C++\",\n      \"tags\"     : \"\",\n      \"url\"      : \"/c++/2021/02/26/virtualtablepointer.html\",\n      \"date\"     : \"2021-02-26 00:00:00 +0000\",\n      \"content\"     : \"예전에 virtual 함수를 찾을 때는 각 클래스가 가지고 있는 virtual table을 look up하여 오브젝트 타입에 맞는 virtual function을 찾는 다는 것을 배웠었다. 또한 이 virtual table를 look up을 위해서는 virtual table pointer라는 것을 모든 virtual class의 오브젝트들이 가지고 있...\"\n    } ,\n  \n    {\n      \"title\"    : \"C++ 실수 줄이기 시리즈\",\n      \"title-lower\"    : \"c++ 실수 줄이기 시리즈\",\n      \"sub-titile\" : \"\",\n      \"sub-titile-lower\" : \"\",\n      \"categories\" : \"C++\",\n      \"tags\"     : \"\",\n      \"url\"      : \"/c++/2021/02/26/c++mistake.html\",\n      \"date\"     : \"2021-02-26 00:00:00 +0000\",\n      \"content\"     : \"이 글은 내가 C++ 코드를 작성하면서 실수를 줄이고 실수로 발생하는 memory leak을 막기 위해 하였던 여러 방법들과 RAII기법들을 소개하고자한다.스마트 포인터를 적극 활용하자.두말하면 입 아프다 스마트 포인터는 실수가능성을 줄여줘 무심코 생기는 memory leak을 줄여준다.new[] 대신 std::unique_ptr을 사용하자.보통 dy...\"\n    } ,\n  \n    {\n      \"title\"    : \"Open GL Coordinate 정리\",\n      \"title-lower\"    : \"open gl coordinate 정리\",\n      \"sub-titile\" : \"\",\n      \"sub-titile-lower\" : \"\",\n      \"categories\" : \"OpenGL\",\n      \"tags\"     : \"\",\n      \"url\"      : \"/opengl/2021/02/25/openglCoordinate.html\",\n      \"date\"     : \"2021-02-25 00:00:00 +0000\",\n      \"content\"     : \"Open GL은 메쉬를 그리기 위해 3D모델의 local vertex position들을 여러번 변환하여 카메라에 그려준다. 그 과정에서 다양한 Coordinate들이 발생하는 데 그 종류와 변환 방법을 알아보자.Model Position : Model Matrix * Local Vertex Position   Model Position은 흔히들 말하...\"\n    } ,\n  \n    {\n      \"title\"    : \"Moved 된 오브젝트의 primitive타입의 멤버 변수가 초기화 되지 않아 생기는 문제\",\n      \"title-lower\"    : \"moved 된 오브젝트의 primitive타입의 멤버 변수가 초기화 되지 않아 생기는 문제\",\n      \"sub-titile\" : \"\",\n      \"sub-titile-lower\" : \"\",\n      \"categories\" : \"C++\",\n      \"tags\"     : \"\",\n      \"url\"      : \"/c++/2021/02/20/problemWhenUseMoveContrucotrCompilerMade.html\",\n      \"date\"     : \"2021-02-20 00:00:00 +0000\",\n      \"content\"     : \"프로젝트를 계속 진행하다 보니 뭔가 이상한 점을 발견하였다. GPU 버퍼가 멋대로 파괴되었다가 재생성하고 이러한 과정을 반복하는 것이다. GPU 버퍼가 이렇게 불필요하게 파괴되었다 재생성 되는 것은 엄청난 오버헤드이기 때문에 빨리 원인을 찾아야 했다. 그리고 원인을 찾았다.원인은 버퍼를 관리하는 클래스 오브젝트를 std::vector에 넣어두었는 데 ...\"\n    } ,\n  \n    {\n      \"title\"    : \"2021학년도 1학기 동안 읽어보거나 공부할 것들\",\n      \"title-lower\"    : \"2021학년도 1학기 동안 읽어보거나 공부할 것들\",\n      \"sub-titile\" : \"\",\n      \"sub-titile-lower\" : \"\",\n      \"categories\" : \"ComputerScience\",\n      \"tags\"     : \"\",\n      \"url\"      : \"/computerscience/2021/02/19/until202106.html\",\n      \"date\"     : \"2021-02-19 00:00:00 +0000\",\n      \"content\"     : \"책, 텍스트 자료 :컴퓨터 구조 및 설계 ( David A. Patterson ) Operating Sytem Concepts ( ABRAHAM SILBERSCHATZ, … ) Fundamentals of Computer Graphics ( Steve Marschner, …)3D Collision    Raycast에 대한 아주 기본적인 이해   Dy...\"\n    } ,\n  \n    {\n      \"title\"    : \"enum 대신 enum class를 사용할 때 성능 저하가 있을까?\",\n      \"title-lower\"    : \"enum 대신 enum class를 사용할 때 성능 저하가 있을까?\",\n      \"sub-titile\" : \"\",\n      \"sub-titile-lower\" : \"\",\n      \"categories\" : \"C++\",\n      \"tags\"     : \"\",\n      \"url\"      : \"/c++/2021/02/18/enumclassoverhead.html\",\n      \"date\"     : \"2021-02-18 00:00:00 +0000\",\n      \"content\"     : \"과거에는 enum class가 없어 enum 변수에 ineteger 값을 넣을 수 있었는 데 이것은 명시적 타입 캐스팅이 필요 없어 어찌 보면 편리해 보이기도 하지만 사람은 항상 실수를 하는 존재이기 때문에 알 수 없는 버그들을 유발하곤 했다. 그래서 나온 게 enum class인 데 enum class를 사용하면 enum class 변수에 integ...\"\n    } ,\n  \n    {\n      \"title\"    : \"std::unique_ptr의 reset과 release 차이\",\n      \"title-lower\"    : \"std::unique_ptr의 reset과 release 차이\",\n      \"sub-titile\" : \"\",\n      \"sub-titile-lower\" : \"\",\n      \"categories\" : \"C++\",\n      \"tags\"     : \"\",\n      \"url\"      : \"/c++/2021/02/08/uniqueptr_reset_release.html\",\n      \"date\"     : \"2021-02-08 00:00:00 +0000\",\n      \"content\"     : \"std::unique_ptr가 소유중인 오브젝트를 파괴하고 싶을 때 reset을 써야할까? release를 사용해야할까?  답은 reset이다. reset() 이렇게 하면된다. reset을 호출하면 unique_ptr이 소유중인 포인터의 오브젝트를 파괴한다.  release의 경우에는 그냥 소유중인 오브젝터의 포인터를 놓아주는 것이지 그 오브젝트를 파...\"\n    } ,\n  \n    {\n      \"title\"    : \"공부해나갈 방향에 대한 고민\",\n      \"title-lower\"    : \"공부해나갈 방향에 대한 고민\",\n      \"sub-titile\" : \"\",\n      \"sub-titile-lower\" : \"\",\n      \"categories\" : \"ComputerScience\",\n      \"tags\"     : \"\",\n      \"url\"      : \"/computerscience/2021/02/04/future.html\",\n      \"date\"     : \"2021-02-04 00:00:00 +0000\",\n      \"content\"     : \"2016년 부터 작년까지 유니티 엔진을 이용해서 게임을 공부해왔지만 최근에 와서 다시 보니 실제로 배운 것은 많이 없는 것 같다.  엔진이 모든걸 하다보니 나는 코딩을 하면서 딱히 생각을 많이하지 않아도 됬었다.  그렇게 유니티 엔진을 사용해서 게임도 여러개 출시해보면서 나름 플레이 스토어 인기 게임 순위 5등 까지도 올라가보고 40만 다운로드까지 올...\"\n    } ,\n  \n    {\n      \"title\"    : \"private destructor을 가진 클래스랑 unique_ptr 사용하기\",\n      \"title-lower\"    : \"private destructor을 가진 클래스랑 unique_ptr 사용하기\",\n      \"sub-titile\" : \"\",\n      \"sub-titile-lower\" : \"\",\n      \"categories\" : \"C++\",\n      \"tags\"     : \"\",\n      \"url\"      : \"/c++/2021/01/29/unique_ptr_with_private_destructor.html\",\n      \"date\"     : \"2021-01-29 00:00:00 +0000\",\n      \"content\"     : \"private destructor을 가진 클래스를 unique_ptr에 사용하려 하면 에러가 뜬다. 이유는 간단하다 unique_ptr은 unique_ptr의 오브젝트가 파괴될때 소유중인 pointer의 오브젝트도 함께 파괴를 하는데 unique_ptr이 소유중인 오브젝트의 destructor에 접근이 불가능해서 생기는 문제이다.해결 방법은 간단하다 ...\"\n    } ,\n  \n    {\n      \"title\"    : \"vector의 중간에 있는 element 빠르게 제거하기 ( swap_erase )\",\n      \"title-lower\"    : \"vector의 중간에 있는 element 빠르게 제거하기 ( swap_erase )\",\n      \"sub-titile\" : \"\",\n      \"sub-titile-lower\" : \"\",\n      \"categories\" : \"C++\",\n      \"tags\"     : \"\",\n      \"url\"      : \"/c++/2021/01/28/tiny_optimization.html\",\n      \"date\"     : \"2021-01-28 00:00:00 +0000\",\n      \"content\"     : \"현재 Doom 프로젝트에서 기본 밑바탕을 차지하는 Entity나 Component System을 만들고 있는 데 사소하지만 게임의 규모가 커지면 성능에 많은 영향을 미치는 최적화 방법을 하나 소개하고자 한다.Entity나 Component System을 만들다보면 당연히 내부적으로 vector을 통해 현재 Scene의 스폰되어 있는 Entity나 그 ...\"\n    } ,\n  \n    {\n      \"title\"    : \"For Loop At CompileTime\",\n      \"title-lower\"    : \"for loop at compiletime\",\n      \"sub-titile\" : \"\",\n      \"sub-titile-lower\" : \"\",\n      \"categories\" : \"C++\",\n      \"tags\"     : \"\",\n      \"url\"      : \"/c++/2021/01/23/_ForLoopAtCompileTime.html\",\n      \"date\"     : \"2021-01-23 00:00:00 +0000\",\n      \"content\"     : \"순조롭게 Doom From Scratch를 개발하던 중 귀찮은일이 생겼다.Enum Type value를 template argument로 받는 템플릿 function을 Enum의 모든 Element에 대해 한번씩 호출해줘야하는 일이 생겼다.물론 아래의 방법과 같이 수동으로 내가 직접해주어도 된다.enum AssetType : unsigned int{\t...\"\n    } ,\n  \n    {\n      \"title\"    : \"C++ 파일시스템에서 파일 전체를 긁어올 때 실수하는 점 ( vector::reserve()의 중요성 )\",\n      \"title-lower\"    : \"c++ 파일시스템에서 파일 전체를 긁어올 때 실수하는 점 ( vector::reserve()의 중요성 )\",\n      \"sub-titile\" : \"\",\n      \"sub-titile-lower\" : \"\",\n      \"categories\" : \"C++\",\n      \"tags\"     : \"\",\n      \"url\"      : \"/c++/2021/01/18/ReadFromFile.html\",\n      \"date\"     : \"2021-01-18 00:00:00 +0000\",\n      \"content\"     : \"C++ filsesystem을 사용하다 보면 파일 전체를 한꺼번에 긁어와야하는 일이 생긴다.이때 흔히하는 실수가 있다. 우선 그 사례를 보여주겠다.1.std::ifstream inputFileStream{path};if (inputFileStream.is_open()){    std::string str{std::istreambuf_iterator{ ...\"\n    } ,\n  \n    {\n      \"title\"    : \"외부 라이브러리 사용에 대한 고민\",\n      \"title-lower\"    : \"외부 라이브러리 사용에 대한 고민\",\n      \"sub-titile\" : \"\",\n      \"sub-titile-lower\" : \"\",\n      \"categories\" : \"Doom3\",\n      \"tags\"     : \"\",\n      \"url\"      : \"/doom3/2021/01/10/thirdpartyLibrary.html\",\n      \"date\"     : \"2021-01-10 00:00:00 +0000\",\n      \"content\"     : \"Doom3 Clone From Scratch 프로젝트를 시작한지 3일이 되었다.개발은 순조롭게 진행되고 있다. C++을 제대로 사용한지 얼마 되지 않아 초반에 Ini파서를 만드는 부분에서 템플릿 메타 프로그래밍 떄문에 애를 좀 먹었다. 아직도 완전히 이해한 것은 아니지만 어느 정도 내부에서 어떻게 돌아가는지 이해가 되는 것 같다. C++이 컴파일 타임...\"\n    } ,\n  \n    {\n      \"title\"    : \"첫번째 글, 새로운 프로젝트 시작\",\n      \"title-lower\"    : \"첫번째 글, 새로운 프로젝트 시작\",\n      \"sub-titile\" : \"\",\n      \"sub-titile-lower\" : \"\",\n      \"categories\" : \"Doom3\",\n      \"tags\"     : \"\",\n      \"url\"      : \"/doom3/2021/01/07/FirstPost.html\",\n      \"date\"     : \"2021-01-07 00:00:00 +0000\",\n      \"content\"     : \"첫번째 글유니티로 게임을 계속 만들다보니 내부적으로 엔진이 어떻게 돌아가는지에는 관심이 멀어지고 그냥 유니티라는 간편한 툴에 적응되어서 몇년을 개발해도 게임 개발에 관한 지식이 그대로인 것 같은 느낌이 들었다.그래서 opengl도 공부하면서 언젠가는 처음부터 게임을 만들어 보아야겠다고 생각은 해왔지만 막상 실행하려니 엄두가 나지 않았는데 이제 시작해보...\"\n    } ,\n  \n    {\n      \"title\"    : \"Introduce\",\n      \"title-lower\"    : \"introduce\",\n      \"sub-titile\" : \"\",\n      \"sub-titile-lower\" : \"\",\n      \"categories\" : \"Life\",\n      \"tags\"     : \"\",\n      \"url\"      : \"/life/2021/01/05/IntroduceMySelf.html\",\n      \"date\"     : \"2021-01-05 00:00:00 +0000\",\n      \"content\"     : \"학교  2015 ~ 2016 : 한국해양대학교 행정학과  2017 ~ : 서울시립대학교 컴퓨터과학부 편입게임 개발 경력  2015년 : C#, 유니티로 처음 게임 개발에 입문  2015년 : 퇴직 후 치킨집 출시 (1인 개발, Unity)  플레이 스토어  2017년 : 킬러를 찾아라1 출시 (1인 개발, Unity)  플레이 스토어  2018년 : ...\"\n    } ,\n  \n    {\n      \"title\"    : \"구글 플레이 스토어의 앱 버전을 서버없이 검사하는 방법\",\n      \"title-lower\"    : \"구글 플레이 스토어의 앱 버전을 서버없이 검사하는 방법\",\n      \"sub-titile\" : \"\",\n      \"sub-titile-lower\" : \"\",\n      \"categories\" : \"Unity\",\n      \"tags\"     : \"\",\n      \"url\"      : \"/unity/2018/12/09/cs_dictionary_tip.html\",\n      \"date\"     : \"2018-12-09 00:00:00 +0000\",\n      \"content\"     : \"요구조건 :  앱 버전을 x.x.x 형식으로 한다.  업데이트를 강제 하고 싶지 않은 경우 맨 뒤의 숫자만 바꾸면 업데이트 요구를 하지 않는다bool IsSameVersion = false; //일단은 그냥 같은 버젼으로 취급해준다bool IsChecked = false;      private void GooglePlayVersionCheck(){ ...\"\n    } ,\n  \n    {\n      \"title\"    : \"C# Dictionary에서 key를 enum이나 struct으로 사용 시 매우 주의해야할 점\",\n      \"title-lower\"    : \"c# dictionary에서 key를 enum이나 struct으로 사용 시 매우 주의해야할 점\",\n      \"sub-titile\" : \"\",\n      \"sub-titile-lower\" : \"\",\n      \"categories\" : \"C#\",\n      \"tags\"     : \"\",\n      \"url\"      : \"/c%23/2018/03/29/unity_google_appversion_check.html\",\n      \"date\"     : \"2018-03-29 00:00:00 +0000\",\n      \"content\"     : \"Dictionary key 값으로 enum이나 struct을 사용하면 알게 모르게 사용하면서 엄청난 양의 가비지가 발생한다.그 이유는 enum이나 struct은 Equals, GethashCode가 구현되지 않았기 때문에 Dictionary의 Contain 함수를 사용할 때 비교를 위해 부모 클래스 형인 Object로 박싱하여 Object끼리 비교를 ...\"\n    } \n  \n]"

this is my search.json

---
layout: null
sitemap:
  exclude: 'yes'
---
[
  {% for post in site.posts %}
    {
      "title"    : "{{ post.title | escape }}",
      "title-lower"    : "{{ post.title | escape | downcase}}",
      "sub-titile" : "{{ post.subtitle | escape }}",
      "sub-titile-lower" : "{{ post.subtitle | escape | downcase}}",
      "categories" : "{{ post.categories }}",
      "tags"     : "{{ post.tags | join: ', ' }}",
      "url"      : "{{ site.baseurl }}{{ post.url }}",
      "date"     : "{{ post.date }}",
      "content"     : "{{ post.content | strip_html | strip_newlines | remove_chars | escape | truncate:200 }}"
    } {% unless forloop.last %},{% endunless %}
  {% endfor %}
]
@christian-fei
Copy link
Owner

try to use https://jsonlint.com/ and your search.json

https://sungjjinkang.github.io/search.json

You'll see that the issue is with your search.json, because it is invalid

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants