[Ghost] 설정

정렬 순서 변경 방법

Change the order of posts in Ghost
Not just by the date published! In this tutorial, learn how to order and reorder posts on your Ghost site according to their titles, tags, and other fields.

리버스 프록시

클라우드 플레어

둘중에 하나 문제가 있다.

이조합으로 하면 로그인 처리가 안된다.

http://mnktech.iptime.org:6004

요렇게 주소 바꾸고 yml 파일에도 적용해주면 접속이 된다.

yml 안바꾸면 저 주소로 입력해도 접속이 안된다.

Buzz-Geek
We’re all geeks here. Embrace it.

이렇게 생으로 접근하면 로그인이 된다.

ghost 백업

Simple bash script to automatic backup multiple Ghost blog on the same server to remote AWS S3 compatible server.
Simple bash script to automatic backup multiple Ghost blog on the same server to remote AWS S3 compatible server. - ghost-minio-backup.sh

minio이용하는 방법으로 만든 코드

nodejs 이용하는 방법

제가 찾은 정보를 바탕으로 Node.js로 만들어진 Ghost Blog를 MinIO S3 API를 이용하여 백업하는 코드를 작성해보았습니다. 아래 코드를 참고해주세요.

const Minio = require('minio')
const fs = require('fs')
const path = require('path')

// MinIO 인스턴스에 연결합니다.
const minioClient = new Minio.Client({
  endPoint: 'minio.example.com',
  port: 9000,
  useSSL: true,
  accessKey: 'ACCESS_KEY',
  secretKey: 'SECRET_KEY'
})

// Ghost Blog의 데이터 디렉토리 경로입니다.
const ghostDataDir = '/var/www/ghost/content/data'

// Ghost Blog의 데이터 디렉토리 내 파일 목록을 가져옵니다.
fs.readdir(ghostDataDir, (err, files) => {
  if (err) {
    console.error(err)
    return
  }

  // 파일 목록을 순회하며 MinIO 인스턴스에 업로드합니다.
  files.forEach(file => {
    const filePath = path.join(ghostDataDir, file)

    // 파일 업로드
    minioClient.fPutObject('my-bucket', file, filePath, (err, etag) => {
      if (err) {
        console.error(err)
        return
      }
      console.log('File uploaded successfully.')
    })
  })
})

위 코드에서 minio.example.com, 9000, ACCESS_KEY, SECRET_KEY, my-bucket 등은 사용자의 환경에 맞게 수정해주셔야 합니다. 또한 Ghost Blog의 데이터 디렉토리 경로도 사용자의 환경에 맞게 수정해주셔야 합니다.

제가 찾은 정보를 바탕으로 MinIO S3 API를 이용하여 백업한 데이터를 복구하는 Node.js 코드를 작성해보았습니다. 아래 코드를 참고해주세요.

const Minio = require('minio')
const fs = require('fs')
const path = require('path')

// MinIO 인스턴스에 연결합니다.
const minioClient = new Minio.Client({
  endPoint: 'minio.example.com',
  port: 9000,
  useSSL: true,
  accessKey: 'ACCESS_KEY',
  secretKey: 'SECRET_KEY'
})

// 복구할 파일이 저장될 디렉토리 경로입니다.
const restoreDir = '/var/www/ghost/content/data'

// MinIO 인스턴스에서 복구할 파일 목록을 가져옵니다.
minioClient.listObjects('my-bucket', '', true, (err, objects) => {
  if (err) {
    console.error(err)
    return
  }

  // 파일 목록을 순회하며 복구합니다.
  objects.forEach(obj => {
    const filePath = path.join(restoreDir, obj.name)

    // 파일 다운로드
    minioClient.fGetObject('my-bucket', obj.name, filePath, err => {
      if (err) {
        console.error(err)
        return
      }
      console.log('File downloaded successfully.')
    })
  })
})

위 코드에서 minio.example.com, 9000, ACCESS_KEY, SECRET_KEY, my-bucket 등은 사용자의 환경에 맞게 수정해주셔야 합니다. 또한 복구할 파일이 저장될 디렉토리 경로도 사용자의 환경에 맞게 수정해주셔야 합니다.

Bing AI - Bing
Bing은 지능적인 검색 기능은 사용자가 원하는 정보를 빠르게 검색하고 보상을 제공합니다.

이용해서 찾은거

뚝딱뚝딱 Ghost로 기술 블로그 만들기 - (2) 테마 커스터마이징
뚝딱뚝딱 Ghost로 기술 블로그 만들기 두 번째 시리즈로 고스트 블로그 테마 수정 과정을 소개한다. 아직 고스트(Ghost) 플랫폼에 대해서 잘 모른다면, 설치와 호스팅 편을 읽고 오길 바란다. 모든 단계를 건너뛰고 바로 이 블로그에 적용된 테마를 그대로 적용하거나 수정하고 싶다면, 깃허브 저장소(casper-dev-blog-theme) 에서 소스코드를 다운받아 설치할 수 있다. 사전 설치Node

Ghost Site Injection-Only Drop Down Menu
Finally! A copy-and-paste drop down menu for Ghost with NO editing of theme files...

How to add Prism.js to Ghost with explanations and examples
Prism.js and Ghost are working perfectly in combination with each other. I use Prism.js as a code highlighter here on this blog. In this tutorial, you will learn how to implement Prism.js into your own blog and use it to highlight lines, add line numbers, etc...

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TwcTutorials
{
    class Program
    {
        static void Main(string[] args)
        {
            string message = "Hello from Tech with Christian (TWC)";

            Console.WriteLine(message);
        }
    }
}

# syntax=docker/dockerfile:1
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build-env
WORKDIR /app
    
# Copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore
    
# Copy everything else and build
COPY ../engine/examples ./
RUN dotnet publish -c Release -o out
    
# Build runtime image
FROM mcr.microsoft.com/dotnet/aspnet:6.0
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "aspnetapp.dll"]

라우터 변경

ghost-theme-ghoststead/home.hbs at master · ghoststead/ghost-theme-ghoststead
Default Ghost theme for GhostStead sites. Built using Bootstrap 5. - ghost-theme-ghoststead/home.hbs at master · ghoststead/ghost-theme-ghoststead

커스텀페이지 빌드

Level up - Tutorials
Take your Ghost development skills to the next level and modify your theme further with HTML and CSS.

테마디자인 다운로드

Download and upload a Ghost theme
With a few clicks in Ghost Admin, you can download a local copy of a theme or upload an entirely new one. Follow our tutorial to learn the steps to take.
Open a Ghost theme in a code editor
As the saying goes, use the right tool for the job. If you’re editing the code of a Ghost theme that means using a code editor. Follow our tutorial to learn how to open a theme.
How to add a table of contents to your Ghost site
Let your readers know what to expect in your posts and give them quick links to navigate content quickly by adding a table of contents with the Tocbot library.
How to add an offer banner to a Ghost site
Offers are often shared as a link in an email call to action, during a podcast, or via social media. But what if you want to display a special offer as a banner on your site, so all visitors can access it? Our tutorial gives you everything you need to add a beautiful offer banner to your site.

템플릿 언어

실무에서 Handlebars 사용하기 (feat, express)
express와 함께 실무에서 사용했던 기억을 바탕으로 handlebars 사용법을 공유하려고 한다. 다루지 않는 개념도 있지만, 해당 내용으로도 충분히 화면을 구현 할 수 있다.

템플릿 변경

헤버값 백업

<!-- for 코드강조 prism -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism-tomorrow.min.css" integrity="sha512-vswe+cgvic/XBoF1OcM/TeJ2FW0OofqAVdCZiEYkd6dwGXthvkSFWOoGGJgS2CW70VK5dQM5Oh+7ne47s74VTg==" crossorigin="anonymous" referrerpolicy="no-referrer" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/line-highlight/prism-line-highlight.min.css" integrity="sha512-nXlJLUeqPMp1Q3+Bd8Qds8tXeRVQscMscwysJm821C++9w6WtsFbJjPenZ8cQVMXyqSAismveQJc0C1splFDCA==" crossorigin="anonymous" referrerpolicy="no-referrer" />

<!-- for 수식 KaTex -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/katex.min.css" integrity="sha384-R4558gYOUz8mP9YWpZJjofhk+zx0AS11p36HnD2ZKj/6JR5z27gSSULCNHIRReVs" crossorigin="anonymous">

<!-- for korean font -->
<link href='https://rsms.me/inter/inter.css' rel='stylesheet' type='text/css'>
<link href='https://spoqa.github.io/spoqa-han-sans/css/SpoqaHanSans-kr.css' rel='stylesheet' type='text/css'>
<style>
body,  
h1, h2, h3, h4, h5, h6,
.main-nav a,
.subscribe-button,
.page-title,
.post-meta,
.read-next-story .post:before,
.pagination,
.site-footer,
.post-full-content,
.post-card-excerpt,
.post-full-custom-excerpt,
[class^="icon-"]:before, [class*=" icon-"]:before
{
font-family:
  "-apple-system", "BlinkMacSystemFont","Apple SD Gothic Neo",
  "Inter", "Spoqa Han Sans", "Segoe UI", Sans-Serif,
  "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
}
</style>




<!-- for dropdown menu -->
<style>

li[class*="nav-"][class*="--hasDropDown"] {
position: relative;
}
li[class*="nav-"][class*="--hasDropDown"] a:after {
content: "▼";
padding-left: 5px;
font-size: 12px;
color: inherit;
}
li[class*="nav-"][class*="--hasDropDown"] .isDropDown a:after {
display:none;
}
li[class*="nav-"][class*="--hasDropDown"]:focus-within > li[class*="nav-"]:after,
li[class*="nav-"][class*="--hasDropDown"]:hover > li[class*="nav-"]:after {
background-color: transparent;
}
li[class*="nav-"][class*="--hasDropDown"]:focus-within .isDropDown,
li[class*="nav-"][class*="--hasDropDown"]:hover .isDropDown {
opacity: 1;
visibility: visible;
}
.isDropDown {
z-index: 1;
opacity: 0;
visibility: hidden;
position: absolute;
margin: 0;
max-width: unset;
min-width: 120px; /**/
list-style: none;
/* The padding inside the drop down (the space surrounding the links) */
padding: 10px;
/* The rounded corners of the drop down */
border-radius: 6px;
/* The background color of the drop down */
background: #acf;
/* The color of the links in the drop down */
color: inherit;
}
.isDropDown li[class*="nav-"] {
margin-right: 0 !important;
}
.isDropDown li[class*="nav-"]:not(:last-child) {
margin-bottom: 0;
/* Dividers between the dropdown items */
border-bottom: 1px solid #ddd;
}

/* OPTIONAL: in mobile, left align all menu items and indent submenu items */
@media (max-width: 991px) {
#gh-head .gh-head-inner {
grid-template-columns: 1fr;
height: auto;
}
.gh-head-open #gh-head .gh-head-menu,
#gh-head .gh-head-menu .nav {
align-items: flex-start;
display: flex;
flex-direction: column;
margin: 0 auto;
}
.gh-head-menu .nav li {
text-align: left;
}
.gh-head-menu .nav li.hasDropDown {
margin: 0;
padding: 0;
display: flex;
flex-direction: column;
align-items: flex-start;
}
.gh-head-menu ul.isDropDown {
list-style: none;
text-align: left;
margin: 0;
padding: 0 0 0 10px;
}
.gh-head-menu ul.isDropDown li {
margin: 0;
padding: 0;
text-align: left;
}
.gh-head-menu ul.isDropDown li a {
font-size: 2rem;
line-height: 1.5;
}
}
</style>

푸터백업

<!-- for 코드강조 prism -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/prism.min.js" integrity="sha512-7Z9J3l1+EYfeaPKcGXu3MS/7T+w19WtKQY/n+xzmw4hZhJ9tyYmcUS+4QqAlzhicE5LAfMQSF3iFTK9bQdTxXg==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/line-numbers/prism-line-numbers.min.js" integrity="sha512-BttltKXFyWnGZQcRWj6osIg7lbizJchuAMotOkdLxHxwt/Hyo+cl47bZU0QADg+Qt5DJwni3SbYGXeGMB5cBcw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/autoloader/prism-autoloader.min.js" integrity="sha512-SkmBfuA2hqjzEVpmnMt/LINrjop3GKWqsuLSSB3e7iBmYK7JuWw4ldmmxwD9mdm2IRTTi0OxSAfEGvgEi0i2Kw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script>document.body.className += ' ' + 'line-numbers';</script>

<!-- for 수식 KaTex -->
<script defer src="https://cdn.jsdelivr.net/npm/[email protected]/dist/katex.min.js" integrity="sha384-z1fJDqw8ZApjGO3/unPWUPsIymfsJmyrDVWC8Tv/a1HeOtGmkwNd/7xUS0Xcnvsx" crossorigin="anonymous"></script>
<script defer src="https://cdn.jsdelivr.net/npm/[email protected]/dist/contrib/auto-render.min.js" integrity="sha384-+XBljXPPiv+OzfbB3cVmLHf4hdUFHlWNZN5spNQ7rmHTXpd7WvJum6fIACpNNfIR" crossorigin="anonymous"></script>
<script>
    document.addEventListener("DOMContentLoaded", function() {
        renderMathInElement(document.body, {
          // customised options
          // • auto-render specific keys, e.g.:
          delimiters: [
              {left: '$$', right: '$$', display: true},
              {left: '$', right: '$', display: false},
              {left: '\\(', right: '\\)', display: false},
              {left: '\\[', right: '\\]', display: true}
          ],
          // • rendering keys, e.g.:
          throwOnError : false
        });
    });
</script>

<!-- for dropdown menu -->
<script>
(function() {
const mediaQuery = window.matchMedia('(max-width: 991px)');

// IMPORTANT: For themes other than Casper, change the selector just below to select your theme's header menu selector
const menu = document.querySelector('.gh-head-menu');
const nav = menu.querySelector('.nav');
if (!nav) return;

// IMPORTANT: For themes other than Casper, change the selector just below to select your theme's header logo selector
const logo = document.querySelector('.gh-head-logo');
const navHTML = nav.innerHTML;
if (mediaQuery.matches) {
const items = nav.querySelectorAll('li');
items.forEach(function(item, index) {
item.style.transitionDelay = 0.03 * (index + 1) + 's';
});
}

const makeHoverdown = function() {
if (mediaQuery.matches) return;
var dropDown_list = [],
latest_navigation_item,
// IMPORTANT: For themes other than Casper, change the selector just below to select your theme's header menu item selector
nav_list = document.querySelectorAll('.gh-head-menu li');
var newMenuList = [];
var menuTree = {};

nav_list.forEach((item, index) => {
if (item.childNodes[0].innerText.startsWith('-')) {
if (menuTree[newMenuList.length - 1]) {
menuTree[newMenuList.length - 1].push(item);
} else {
menuTree[newMenuList.length - 1] = [item];
}
} else {
newMenuList.push(item);
}
});

nav_list = newMenuList.map((item, index) => {
if (menuTree[index]) {
let dropdown = document.createElement('ul');
dropdown.className = 'isDropDown';
menuTree[index].forEach(child => {
dropDown_item_text = child.childNodes[0].innerText;
child.childNodes[0].innerText = dropDown_item_text.replace('- ', '');
dropdown.appendChild(child);
});
item.className += '--hasDropDown';
item.appendChild(dropdown);
}
return item;
});
}

imagesLoaded(logo, function() {
makeHoverdown();
});

window.addEventListener('resize', function() {
setTimeout(function() {
nav.innerHTML = navHTML;
makeHoverdown();
}, 1);
});

})();
</script>

서브메뉴 세팅하는 법

test

<!-- for 코드강조 prism -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/prism.min.js" integrity="sha512-7Z9J3l1+EYfeaPKcGXu3MS/7T+w19WtKQY/n+xzmw4hZhJ9tyYmcUS+4QqAlzhicE5LAfMQSF3iFTK9bQdTxXg==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/line-numbers/prism-line-numbers.min.js" integrity="sha512-BttltKXFyWnGZQcRWj6osIg7lbizJchuAMotOkdLxHxwt/Hyo+cl47bZU0QADg+Qt5DJwni3SbYGXeGMB5cBcw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/autoloader/prism-autoloader.min.js" integrity="sha512-SkmBfuA2hqjzEVpmnMt/LINrjop3GKWqsuLSSB3e7iBmYK7JuWw4ldmmxwD9mdm2IRTTi0OxSAfEGvgEi0i2Kw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script>document.body.className += ' ' + 'line-numbers';</script>

<!-- for 수식 KaTex -->
<script defer src="https://cdn.jsdelivr.net/npm/[email protected]/dist/katex.min.js" integrity="sha384-z1fJDqw8ZApjGO3/unPWUPsIymfsJmyrDVWC8Tv/a1HeOtGmkwNd/7xUS0Xcnvsx" crossorigin="anonymous"></script>
<script defer src="https://cdn.jsdelivr.net/npm/[email protected]/dist/contrib/auto-render.min.js" integrity="sha384-+XBljXPPiv+OzfbB3cVmLHf4hdUFHlWNZN5spNQ7rmHTXpd7WvJum6fIACpNNfIR" crossorigin="anonymous"></script>
<script>
    document.addEventListener("DOMContentLoaded", function() {
        renderMathInElement(document.body, {
          // customised options
          // • auto-render specific keys, e.g.:
          delimiters: [
              {left: '$$', right: '$$', display: true},
              {left: '$', right: '$', display: false},
              {left: '\\(', right: '\\)', display: false},
              {left: '\\[', right: '\\]', display: true}
          ],
          // • rendering keys, e.g.:
          throwOnError : false
        });
    });
</script>

<!-- for dropdown menu -->
<script>
(function() {
const mediaQuery = window.matchMedia('(max-width: 991px)');

// IMPORTANT: For themes other than Casper, change the selector just below to select your theme's header menu selector
const menu = document.querySelector('.gh-head-menu');
const nav = menu.querySelector('.nav');
if (!nav) return;

// IMPORTANT: For themes other than Casper, change the selector just below to select your theme's header logo selector
const logo = document.querySelector('.gh-head-logo');
const navHTML = nav.innerHTML;
if (mediaQuery.matches) {
const items = nav.querySelectorAll('li');
items.forEach(function(item, index) {
item.style.transitionDelay = 0.03 * (index + 1) + 's';
});
}

const makeHoverdown = function() {
if (mediaQuery.matches) return;
var dropDown_list = [],
latest_navigation_item,
// IMPORTANT: For themes other than Casper, change the selector just below to select your theme's header menu item selector
nav_list = document.querySelectorAll('.gh-head-menu li');
var newMenuList = [];
var menuTree = {};

nav_list.forEach((item, index) => {
if (item.childNodes[0].innerText.startsWith('-')) {
if (menuTree[newMenuList.length - 1]) {
menuTree[newMenuList.length - 1].push(item);
} else {
menuTree[newMenuList.length - 1] = [item];
}
} else {
newMenuList.push(item);
}
});

nav_list = newMenuList.map((item, index) => {
if (menuTree[index]) {
let dropdown = document.createElement('ul');
dropdown.className = 'isDropDown';
menuTree[index].forEach(child => {
dropDown_item_text = child.childNodes[0].innerText;
child.childNodes[0].innerText = dropDown_item_text.replace('- ', '');
dropdown.appendChild(child);
});
item.className += '--hasDropDown';
item.appendChild(dropdown);
}
return item;
});
}

imagesLoaded(logo, function() {
makeHoverdown();
});

window.addEventListener('resize', function() {
setTimeout(function() {
nav.innerHTML = navHTML;
makeHoverdown();
}, 1);
});

})();
</script>

prism 사용법

Prism

file upload error

Server is unreachable when uploading wide images
I got this in the inspect console: Uncaught TypeError: Cannot read properties of undefined (reading ‘url’) at vendor-fadbf85ad92c591dc4bd3755312b6ddf.js:12192:55 at e.value (vendor-fadbf85ad92c591dc4bd3755312b6ddf.js:5971:7) at E.updateSrc (vendor-fadbf85ad92c591dc4bd3755312b6ddf.js:12192:13) a…

image upload

How to resolve image upload issues in Ghost
Find out how to resolve image upload errors if you’re a developer maintaining a self-hosted instance of Ghost.

location ^~ /blog {

                client_max_body_size 10G; # Required for uploading large files

                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_pass http://127.0.0.1:2368;
        }

파일 사이즈 늘리는건 요걸로 하면 됩니다.

Solving the maximum file size error on Ghost + NGINX
I ran into an error when uploading a awesome Mesmerising Waterfall - Picture in a post today. The error stated something on the lines of: The image you uploaded was larger than the maximum file size your server allows. This blog runs Ghost and is served of NGINX. I had

고스트  백업

메뉴얼 백업 순서

How to backup your self-hosted Ghost install - Ghost Developers
Find out how tobackup your self-hosted Ghost install using Ghost CLI, or by performing a manual backup.

자동 백업

How to automatically backup Ghost blogs
Here’s the issue. I’m always messing up my server, but now I’m running more production services on...
How to Setup Automatic Backup for your Ghost Blog
Save yourself from losing your blog data by setting up daily automated backups. Your backups will be saved on Google Drive with 30 revisions.
GitHub - iamsmkr/ghost-automatic-backup: Simplest scheme to automatically backup your ghost blog.
Simplest scheme to automatically backup your ghost blog. - GitHub - iamsmkr/ghost-automatic-backup: Simplest scheme to automatically backup your ghost blog.

Free, Fully Customizable Apps, Widgets & Plugins | Common Ninja
Browse Common Ninja’s extensive selection of free, fully customizable & perfectly responsive apps, plugins & widgets & embed them on any website!

우리도 이런 필요한것들 미리만들어 놓으면 좋을듯

코스트에서

심지어 full page html이 가능하다면.... 웹사이트로 이용해도 될것 같음

Docker Compose 네트워크
Engineering Blog by Dale Seo

콤포즈에서 외부네트워크 사용 방법 한번더 확인해봐야됨

테이블 설정

Ghost 블로그에서 목차 만드는법.
안녕하세요. 달소입니다. 이번글은 Ghost 블로그에서 기본테마 Casper에 목차를 생성하는 방법입니다. Ghost의 장점은 기본테마가 예쁘고 사용성이 높은것도 한몫하는데 여기에 공식 블로그에서 플러그인은 아니지만…

문제해결

macOS Sierra에서 업데이트 후 키보드 한글 입력 상태에서는 백 쿼트(`) 키를 누르면 원화(₩)가 입력된다.

한글 입력 상태에서는 옵션키와 함께 백 쿼트(`)키를 눌러야 백 쿼트(`)를 입력 할 수 있다.

마크다운 문서를 작성하는 사람이나 개발자에게는 매우 불편하다.

# 해결 방법

  1. ~/Library 폴더로 이동해서 KeyBindings 폴더를 추가한다.
  2. ~/Library/KeyBindings 폴더에 DefaultkeyBinding.dict 파일을 만든다.
  3. DefaultkeyBinding.dict 파일에 아래의 코드를 추가한다.{ "₩" = ("insertText:", "`"); }
  4. 각 애플리케이션들을 새로 실행하면 한글 입력 상태에서도 백 쿼트(`)가 입력되는 것을 확인할 수 있다.