<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>메모하는습관</title>
    <link>https://xshine.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Tue, 14 Apr 2026 19:48:37 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>메모하는습관</managingEditor>
    <item>
      <title>[pg_cron] PostgreSQL 스케줄러</title>
      <link>https://xshine.tistory.com/346</link>
      <description>&lt;div class=&quot;tt_article_useless_p_margin&quot;&gt;
  &lt;p&gt;&lt;code class=&quot;literal&quot;&gt;pg_cron&lt;/code&gt;은 데이터베이스 내부에서 확장으로 실행되는 PostgreSQL(10이상)용 cron 기반의 스케줄러이다.&lt;/p&gt;
  &lt;p&gt;linux의 crontab과 동일한 구문을 사용하며 데이터베이스에서 직접 query 실행을 예약할 수 있다.&lt;/p&gt;
  &lt;br/&gt;
  &lt;p&gt;설치&lt;/p&gt;
  &lt;pre class=&quot;code-highlight&quot;&gt;&lt;code class=&quot;hljs bash&quot;&gt;# 사용하고 있는 postgresql 버전에 맞게 설치하자.
# 아래는 postgresql13 용 pg_cron을 설치하는 예시이다.

# Red Hat, CentOS, Fedora, Amazon Linux
$ sudo yum install -y pg_cron_13

# Debian, Ubuntu
$ sudo apt-get -y install postgresql-13-cron&lt;/code&gt;&lt;/pre&gt;
  &lt;br/&gt;
  &lt;p&gt;postgresql.conf 설정&lt;/p&gt;  
  &lt;pre class=&quot;code-highlight&quot;&gt;&lt;code class=&quot;hljs bash&quot;&gt;#postgresql.conf 파일에 아래의 설정을 추가 하자.

# postgresql 시작 시 pg_cron background worker를 로드한다.
shared_preload_libraries = 'pg_cron'

# pg_cron background worker가 실행되어야 하는 데이터베이스를 지정한다. (기본값: postgres)
cron.database_name = 'postgres'

# ----------------------------------------------------------------------------------------

# 아래 설정은 필수 요소는 아닌 듯 하니 필요에 따라 설정 한다.

# localhost 연결 대신 background worker를 통해 작업 예약
cron.use_background_workers = on

# 실행 가능한 background worker 수를 환경에 맞게 늘려준다. (기본값: 8)
max_worker_processes = 20

# 설정을 적용하기 위해서는 postgresql 재시작이 필요하다.&lt;/code&gt;&lt;/pre&gt;
  &lt;br/&gt;
  &lt;p&gt;pg_cron 함수 및 메타데이터 테이블 생성&lt;/p&gt;
  &lt;pre class=&quot;code-highlight&quot;&gt;&lt;code class=&quot;hljs sql&quot;&gt;-- superuser로 실행
CREATE EXTENSION pg_cron;

-- 일반 사용자 사용 권한 부여 (선택사항)
GRANT USAGE ON SCHEMA cron TO marco;&lt;/code&gt;&lt;/pre&gt;
  &lt;p&gt;자세한 설치 방법 및 사용 방법은 &lt;a href=&quot;https://github.com/citusdata/pg_cron&quot; target=&quot;_blank&quot;&gt;여기&lt;/a&gt;에서 확인할 수 있다.&lt;/p&gt;</description>
      <category>데이터베이스/PostgreSQL</category>
      <category>cron</category>
      <category>postgres</category>
      <category>스케줄러</category>
      <author>메모하는습관</author>
      <guid isPermaLink="true">https://xshine.tistory.com/346</guid>
      <comments>https://xshine.tistory.com/346#entry346comment</comments>
      <pubDate>Fri, 21 Oct 2022 14:57:18 +0900</pubDate>
    </item>
    <item>
      <title>[electron] vue-router가 동작하지 않을때...</title>
      <link>https://xshine.tistory.com/345</link>
      <description>&lt;div class=&quot;tt_article_useless_p_margin&quot;&gt;
  &lt;p&gt;&lt;code class=&quot;literal&quot;&gt;electron&lt;/code&gt;에서 &lt;code class=&quot;literal&quot;&gt;vue-router&lt;/code&gt; 를 사용할때 동작을 하지 않는 경우가 있다.&lt;/p&gt;
  &lt;p&gt;&lt;code class=&quot;literal&quot;&gt;router&lt;/code&gt; 를 생성할때 &lt;code class=&quot;literal&quot;&gt;history&lt;/code&gt; 모드가 아닌 &lt;code class=&quot;literal&quot;&gt;hash&lt;/code&gt; 모드를 사용하면 잘 동작 한다.&lt;/p&gt;
  &lt;p&gt;※ 아래의 코드는 &lt;code class=&quot;literal&quot;&gt;vue 3.x&lt;/code&gt; 와 &lt;code class=&quot;literal&quot;&gt;vue-router 4.x&lt;/code&gt;의 예제 코드 이다.&lt;/p&gt;
  &lt;pre class=&quot;code-highlight&quot;&gt;&lt;code class=&quot;hljs ts&quot;&gt;// router.ts
import { createRouter, createWebHashHistory } from 'vue-router'

const routes = [
  { path: '/page1', component: () =&gt; import('./Page1.vue') },
  { path: '/page2', component: () =&gt; import('./Page2.vue') }
]

export default createRouter({
  history: createWebHashHistory(),
  routes
})&lt;/code&gt;&lt;/pre&gt;
  &lt;pre class=&quot;code-highlight&quot;&gt;&lt;code class=&quot;hljs ts&quot;&gt;// main.ts
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'

const app = createApp(App)
app.use(router)
app.mount('#app')&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;</description>
      <category>프로그래밍/Node.js</category>
      <category>electron</category>
      <category>VUE</category>
      <category>Vue-Router</category>
      <author>메모하는습관</author>
      <guid isPermaLink="true">https://xshine.tistory.com/345</guid>
      <comments>https://xshine.tistory.com/345#entry345comment</comments>
      <pubDate>Sun, 7 Aug 2022 13:11:28 +0900</pubDate>
    </item>
    <item>
      <title>[Electron] better-sqlite3 NODE_MODULE_VERSION 문제</title>
      <link>https://xshine.tistory.com/344</link>
      <description>&lt;div class=&quot;tt_article_useless_p_margin&quot;&gt;
  &lt;p&gt;&lt;code class=&quot;literal&quot;&gt;electron&lt;/code&gt;에서 &lt;code class=&quot;literal&quot;&gt;better-sqlite3&lt;/code&gt; 모듈을 사용할 경우 아래와 같은 문제가 발생하는 경우가 있다.&lt;/p&gt;
  &lt;pre class=&quot;code-highlight&quot;&gt;&lt;code class=&quot;hljs shell nonum&quot;&gt;node_modules\sqlite3\lib\binding\electron-v4.0-win32-x64\node_sqlite3.node' was compiled against a different Node.js version using NODE_MODULE_VERSION 64. This version of Node.js requires NODE_MODULE_VERSION 69. Please try re-compiling or re-installing the module (for instance, using npm rebuildornpm install).&lt;/code&gt;&lt;/pre&gt;
  &lt;p&gt;위와 같은 문제가 발생했다면 아래와 같이 시도해 보자.&lt;/p&gt;
  &lt;pre class=&quot;code-highlight&quot;&gt;&lt;code class=&quot;hljs bash nonum&quot;&gt;# 1. electron-rebuild 설치
$ npm i --save-dev electron-rebuild
# 또는
$ yarn add -D electron-rebuild

# electron-rebuild를 이요해서 rebuild
$ npx electron-rebuild -f -w better-sqlite3&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;</description>
      <category>프로그래밍/Node.js</category>
      <category>better-sqlite3</category>
      <category>electron</category>
      <category>NODE_MODULE_VERSION</category>
      <author>메모하는습관</author>
      <guid isPermaLink="true">https://xshine.tistory.com/344</guid>
      <comments>https://xshine.tistory.com/344#entry344comment</comments>
      <pubDate>Thu, 28 Jul 2022 17:42:49 +0900</pubDate>
    </item>
    <item>
      <title>[세이브 에디터] 수호전 천명의 맹세 (한글판)</title>
      <link>https://xshine.tistory.com/343</link>
      <description>&lt;div class=&quot;tt_article_useless_p_margin&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터넷을 찾아봐도 이 게임의 마땅한 에디터가 없어 직접 만들어 보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마침 &lt;a href=&quot;https://www.electronjs.org&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code class=&quot;literal&quot;&gt;electron&lt;/code&gt;&lt;/a&gt; 공부하고 있던 차에 개인 프로젝트로 하기에 좋겠다는 생각이 들어 개발을 시작했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발은 &lt;a href=&quot;https://nodejs.org&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code class=&quot;literal&quot;&gt;node.js&lt;/code&gt;&lt;/a&gt; + &lt;a href=&quot;https://www.electronjs.org&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code class=&quot;literal&quot;&gt;electron&lt;/code&gt;&lt;/a&gt; + &lt;a href=&quot;https://vuejs.org&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code class=&quot;literal&quot;&gt;vue3&lt;/code&gt;&lt;/a&gt;를 이용하여 개발하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 수호전 - 천명의 맹세 한글판 전용 에디터입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;업데이트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;v1.0.1 (2023.08.10) - 연도 수정 기능 추가 (범위: 1100 ~ 1126년 수정 가능)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;850&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kzAxW/btrBdbraEUg/Z8CEOtyf5KxjpDH13WgBxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kzAxW/btrBdbraEUg/Z8CEOtyf5KxjpDH13WgBxK/img.png&quot; data-alt=&quot;세이브 파일 선택&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kzAxW/btrBdbraEUg/Z8CEOtyf5KxjpDH13WgBxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkzAxW%2FbtrBdbraEUg%2FZ8CEOtyf5KxjpDH13WgBxK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1440&quot; height=&quot;850&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;850&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;세이브 파일 선택&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;850&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYpKmr/btrA9jY0mWa/PkVmMRWVV7gwK0kVKxjUX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYpKmr/btrA9jY0mWa/PkVmMRWVV7gwK0kVKxjUX1/img.png&quot; data-alt=&quot;데이터 번호 선택&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYpKmr/btrA9jY0mWa/PkVmMRWVV7gwK0kVKxjUX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYpKmr%2FbtrA9jY0mWa%2FPkVmMRWVV7gwK0kVKxjUX1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1440&quot; height=&quot;850&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;850&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;데이터 번호 선택&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;850&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dS453C/btrBdbSet2Y/5bNXQiID81jA2kMmB2Klok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dS453C/btrBdbSet2Y/5bNXQiID81jA2kMmB2Klok/img.png&quot; data-alt=&quot;호한 목록&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dS453C/btrBdbSet2Y/5bNXQiID81jA2kMmB2Klok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdS453C%2FbtrBdbSet2Y%2F5bNXQiID81jA2kMmB2Klok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1440&quot; height=&quot;850&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;850&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;호한 목록&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;850&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blnrAZ/btrA9jY0gmT/NDMYkRZgQ2F5MZQhi497tK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blnrAZ/btrA9jY0gmT/NDMYkRZgQ2F5MZQhi497tK/img.png&quot; data-alt=&quot;호걸 정보&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blnrAZ/btrA9jY0gmT/NDMYkRZgQ2F5MZQhi497tK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblnrAZ%2FbtrA9jY0gmT%2FNDMYkRZgQ2F5MZQhi497tK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1440&quot; height=&quot;850&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;850&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;호걸 정보&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;850&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bknmLl/btrBcr8KTvn/k8P2KlAqvlW5GTcIXgTM40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bknmLl/btrBcr8KTvn/k8P2KlAqvlW5GTcIXgTM40/img.png&quot; data-alt=&quot;지역 정보&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bknmLl/btrBcr8KTvn/k8P2KlAqvlW5GTcIXgTM40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbknmLl%2FbtrBcr8KTvn%2Fk8P2KlAqvlW5GTcIXgTM40%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1440&quot; height=&quot;850&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;850&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;지역 정보&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;850&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyC1zK/btrBdTRmloO/cFvKKfRUIatqDE25YOYfZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyC1zK/btrBdTRmloO/cFvKKfRUIatqDE25YOYfZk/img.png&quot; data-alt=&quot;지역의 호걸 목록&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyC1zK/btrBdTRmloO/cFvKKfRUIatqDE25YOYfZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcyC1zK%2FbtrBdTRmloO%2FcFvKKfRUIatqDE25YOYfZk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1440&quot; height=&quot;850&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;850&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;지역의 호걸 목록&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;850&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cm640s/btrBcI3QQNi/dsaTWyWKMFKQRjyk3AbkQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cm640s/btrBcI3QQNi/dsaTWyWKMFKQRjyk3AbkQ1/img.png&quot; data-alt=&quot;지역의 인물 목록&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cm640s/btrBcI3QQNi/dsaTWyWKMFKQRjyk3AbkQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcm640s%2FbtrBcI3QQNi%2FdsaTWyWKMFKQRjyk3AbkQ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1440&quot; height=&quot;850&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;850&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;지역의 인물 목록&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;용량 약 60MB (v1.0.1)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/cFjldG/btsrCSuiBoH/OM8ADpkFCGCCHGxqYUXHW1/%EC%88%98%ED%98%B8%EC%A0%84-%EC%B2%9C%EB%AA%85%EC%9D%98%EB%A7%B9%EC%84%B8-%EC%97%90%EB%94%94%ED%84%B0.zip.001?attach=1&amp;amp;knm=tfile.001&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;수호전-천명의맹세-에디터.zip.001&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;15.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/FDHoQ/btsrwXqljvK/lqQqbKjQcPzE1hgOO4kGfK/%EC%88%98%ED%98%B8%EC%A0%84-%EC%B2%9C%EB%AA%85%EC%9D%98%EB%A7%B9%EC%84%B8-%EC%97%90%EB%94%94%ED%84%B0.zip.002?attach=1&amp;amp;knm=tfile.002&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;수호전-천명의맹세-에디터.zip.002&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;15.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/tuHfK/btsrBqkZJHd/OKcYEZKNyMpi8g5dCJgNH0/%EC%88%98%ED%98%B8%EC%A0%84-%EC%B2%9C%EB%AA%85%EC%9D%98%EB%A7%B9%EC%84%B8-%EC%97%90%EB%94%94%ED%84%B0.zip.003?attach=1&amp;amp;knm=tfile.003&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;수호전-천명의맹세-에디터.zip.003&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;15.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/nAn3C/btsrDKitAZO/5JY2XSA66CYZFs3zYGKHNk/%EC%88%98%ED%98%B8%EC%A0%84-%EC%B2%9C%EB%AA%85%EC%9D%98%EB%A7%B9%EC%84%B8-%EC%97%90%EB%94%94%ED%84%B0.zip.004?attach=1&amp;amp;knm=tfile.004&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;수호전-천명의맹세-에디터.zip.004&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;11.27MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>게임/에디터</category>
      <category>DOS</category>
      <category>세이브 에디터</category>
      <category>수호전</category>
      <category>수호전 천명의 맹세</category>
      <category>에디터</category>
      <category>천명의 맹세</category>
      <author>메모하는습관</author>
      <guid isPermaLink="true">https://xshine.tistory.com/343</guid>
      <comments>https://xshine.tistory.com/343#entry343comment</comments>
      <pubDate>Wed, 4 May 2022 02:05:30 +0900</pubDate>
    </item>
    <item>
      <title>[Rocky Linux 8] yum을 이용하여 docker 설치</title>
      <link>https://xshine.tistory.com/342</link>
      <description>&lt;div class=&quot;tt_article_useless_p_margin&quot;&gt;
  &lt;p&gt;&lt;code class=&quot;literal&quot;&gt;yum&lt;/code&gt; repository 관리에 필요한 &lt;code class=&quot;literal&quot;&gt;yum-utils&lt;/code&gt; 를 설치한다. (설치가 안되어있을 경우)&lt;/p&gt;
  &lt;pre class=&quot;code-highlight&quot;&gt;&lt;code class=&quot;hljs shell nonum&quot;&gt;$ sudo yum install -y yum-utils&lt;/code&gt;&lt;/pre&gt;
  &lt;br /&gt;
  &lt;p&gt;Docker repository 추가&lt;/p&gt;
  &lt;pre class=&quot;code-highlight&quot;&gt;&lt;code class=&quot;hljs shell nonum&quot;&gt;$ sudo yum-config-manager \
	--add-repo \
	https://download.docker.com/linux/centos/docker-ce.repo&lt;/code&gt;&lt;/pre&gt;
  &lt;br /&gt;
  &lt;p&gt;Docker Engine 설치&lt;/p&gt;
  &lt;pre class=&quot;code-highlight&quot;&gt;&lt;code class=&quot;hljs shell nonum&quot;&gt;$ sudo yum install docker-ce docker-ce-cli containerd.io&lt;/code&gt;&lt;/pre&gt;
  &lt;br /&gt;
  &lt;p&gt;Docker 실행 &lt;/p&gt;
  &lt;pre class=&quot;code-highlight&quot;&gt;&lt;code class=&quot;hljs shell nonum&quot;&gt;$ sudo systemctl start docker&lt;/code&gt;&lt;/pre&gt;
  &lt;br /&gt;
  &lt;p&gt;&lt;code class=&quot;literal&quot;&gt;hellow-world&lt;/code&gt; 이미지로 Docker가 잘 설치 되었는지 확인&lt;/p&gt;
  &lt;pre class=&quot;code-highlight&quot;&gt;&lt;code class=&quot;hljs shell nonum&quot;&gt;$ sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete 
Digest: sha256:975f4b14f326b05db86e16de00144f9c12257553bba9484fed41f9b6f2257800
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the &quot;hello-world&quot; image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/&lt;/code&gt;&lt;/pre&gt;  
  &lt;div class=&quot;divider&quot;&gt;&lt;/div&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  &lt;div style=&quot;border: none; border-bottom: 1px solid rgba(255, 255, 255, 0.12);&quot;&gt;&lt;/div&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  &lt;p&gt;&lt;code class=&quot;literal&quot;&gt;dnf&lt;/code&gt; 를 이용하여 설치할 때도 &lt;code class=&quot;literal&quot;&gt;yum&lt;/code&gt; 을 이용할때와 거의 동일하다.&lt;/p&gt;
  &lt;pre class=&quot;code-highlight&quot;&gt;&lt;code class=&quot;hljs shell nonum&quot;&gt;$ sudo dnf -y install dnf-plugins-core&lt;/code&gt;&lt;/pre&gt;
  &lt;pre class=&quot;code-highlight&quot;&gt;&lt;code class=&quot;hljs shell nonum&quot;&gt;$ sudo dnf config-manager \
	--add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo&lt;/code&gt;&lt;/pre&gt;  
  &lt;pre class=&quot;code-highlight&quot;&gt;&lt;code class=&quot;hljs shell nonum&quot;&gt;$ sudo dnf install docker-ce docker-ce-cli containerd.io&lt;/code&gt;&lt;/pre&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  &lt;p&gt;참고&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://docs.docker.com/engine/install/centos/&quot; target=&quot;_blank&quot;&gt;https://docs.docker.com/engine/install/centos/&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://docs.docker.com/engine/install/fedora/&quot; target=&quot;_blank&quot;&gt;https://docs.docker.com/engine/install/fedora/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;</description>
      <category>운영체제/리눅스</category>
      <category>DNF</category>
      <category>docker</category>
      <category>Linux</category>
      <category>rocky</category>
      <category>yum</category>
      <author>메모하는습관</author>
      <guid isPermaLink="true">https://xshine.tistory.com/342</guid>
      <comments>https://xshine.tistory.com/342#entry342comment</comments>
      <pubDate>Wed, 19 Jan 2022 22:33:15 +0900</pubDate>
    </item>
    <item>
      <title>psql 명령어 몇가지...</title>
      <link>https://xshine.tistory.com/341</link>
      <description>&lt;div class=&quot;tt_article_useless_p_margin&quot;&gt;
  &lt;p&gt;먼저 &lt;code class=&quot;literal&quot;&gt;psql&lt;/code&gt;을 명령어를 사용하여 PostgreSQL에 접속 한다.&lt;/p&gt;
  &lt;pre class=&quot;code-highlight&quot;&gt;&lt;code class=&quot;hljs shell nonum&quot;&gt;$ psql -U postgres -W
postgres 사용자의 암호: 
psql (10.17)
도움말을 보려면 &quot;help&quot;를 입력하십시오.

postgres=#&lt;/code&gt;&lt;/pre&gt;
  &lt;p&gt;&lt;code class=&quot;literal&quot;&gt;-U&lt;/code&gt; 옵션은 사용자이고 &lt;code class=&quot;literal&quot;&gt;-W&lt;/code&gt; 옵션은 비번을 입력하겠다는 의미이다.&lt;/p&gt;
  &lt;p&gt;&amp;nbsp;&lt;/p&gt;
  &lt;p&gt;이제 psql에서 자주 사용하는 명령어 몇가지를 알아보자&lt;/p&gt;
  &lt;p&gt;&amp;nbsp;&lt;/p&gt;
  &lt;p&gt;데이터베이스 목록 조회 &lt;code class=&quot;literal&quot;&gt;\l&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;좀더 자세한 내용을 원한다면 뒤에 &lt;code class=&quot;literal&quot;&gt;+&lt;/code&gt; 만 더 붙이면 된다. &lt;code class=&quot;literal&quot;&gt;\l+&lt;/code&gt;&lt;/p&gt;
  &lt;pre class=&quot;code-highlight&quot;&gt;&lt;code class=&quot;hljs shell nonum nowrap&quot;&gt;postgres=# \l
                                 데이터베이스 목록
   이름    |  소유주   | 인코딩 |   Collate   |    Ctype    |      액세스 권한      
-----------+-----------+--------+-------------+-------------+-----------------------
 postgres  | postgres  | UTF8   | ko_KR.UTF-8 | ko_KR.UTF-8 | 
 template0 | postgres  | UTF8   | ko_KR.UTF-8 | ko_KR.UTF-8 | =c/postgres          +
           |           |        |             |             | postgres=CTc/postgres
 template1 | postgres  | UTF8   | ko_KR.UTF-8 | ko_KR.UTF-8 | =c/postgres          +
           |           |        |             |             | postgres=CTc/postgres           
(3개 행)

postgres=# \l+
                                                                     데이터베이스 목록
   이름    |  소유주   | 인코딩 |   Collate   |    Ctype    |      액세스 권한      |  크기   | 테이블스페이스 |                    설명                    
-----------+-----------+--------+-------------+-------------+-----------------------+---------+----------------+--------------------------------------------
  postgres | postgres  | UTF8   | ko_KR.UTF-8 | ko_KR.UTF-8 |                       | 7863 kB | pg_default     | default administrative connection database
 template0 | postgres  | UTF8   | ko_KR.UTF-8 | ko_KR.UTF-8 | =c/postgres          +| 7729 kB | pg_default     | unmodifiable empty database
           |           |        |             |             | postgres=CTc/postgres |         |                | 
 template1 | postgres  | UTF8   | ko_KR.UTF-8 | ko_KR.UTF-8 | =c/postgres          +| 7729 kB | pg_default     | default template for new databases
           |           |        |             |             | postgres=CTc/postgres |         |                | 
(3개 행)&lt;/code&gt;&lt;/pre&gt;
  &lt;p&gt;&amp;nbsp;&lt;/p&gt;
  &lt;p&gt;데이터베이스 연결 &lt;code class=&quot;literal&quot;&gt;\c 데이터베이스명&lt;/code&gt;&lt;/p&gt;
  &lt;pre class=&quot;code-highlight&quot;&gt;&lt;code class=&quot;hljs shell nonum nowrap&quot;&gt;postgres=# \c postgres
암호: 
접속정보: 데이터베이스=&quot;postgres&quot;, 사용자=&quot;postgres&quot;.&lt;/code&gt;&lt;/pre&gt;  
  &lt;p&gt;&amp;nbsp;&lt;/p&gt;
  &lt;p&gt;테이블 목록 조회 &lt;code class=&quot;literal&quot;&gt;\dt&lt;/code&gt;&lt;/p&gt;
  &lt;p&gt;좀더 자세한 내용을 원한다면 뒤에 &lt;code class=&quot;literal&quot;&gt;+&lt;/code&gt; 만 더 붙이면 된다. &lt;code class=&quot;literal&quot;&gt;\dt+&lt;/code&gt;&lt;/p&gt;
  &lt;pre class=&quot;code-highlight&quot;&gt;&lt;code class=&quot;hljs shell nonum nowrap&quot;&gt;postgres=# \dt
         릴레이션(relation) 목록
 스키마 |   이름   |  종류  |  소유주   
--------+----------+--------+-----------
 public | table_01 | 테이블 | postgres
 public | table_02 | 테이블 | postgres
(2개 행)

postgres=# \dt+
                 릴레이션(relation) 목록
 스키마 |   이름    |  종류  |  소유주   |    크기    | 설명 
--------+---------- +--------+-----------+------------+------
 public | table_01  | 테이블 | postgres  | 8192 bytes | 
 public | table_02  | 테이블 | postgres  | 40 kB      | 
(2개 행)
&lt;/code&gt;&lt;/pre&gt;  
&lt;/div&gt;</description>
      <category>데이터베이스/PostgreSQL</category>
      <category>postgres</category>
      <category>psql</category>
      <category>show database</category>
      <category>show table</category>
      <author>메모하는습관</author>
      <guid isPermaLink="true">https://xshine.tistory.com/341</guid>
      <comments>https://xshine.tistory.com/341#entry341comment</comments>
      <pubDate>Wed, 19 Jan 2022 01:20:50 +0900</pubDate>
    </item>
    <item>
      <title>Electron + Vite + Vue3 + Typescript 을 이용한 데스크탑 앱 개발 환경</title>
      <link>https://xshine.tistory.com/340</link>
      <description>&lt;div class=&quot;tt_article_useless_p_margin&quot;&gt;
  &lt;p&gt;
    &lt;a target=&quot;_blank&quot; href=&quot;https://www.electronjs.org&quot;&gt;Electron&lt;/a&gt; +
    &lt;a target=&quot;_blank&quot; href=&quot;https://vitejs.dev&quot;&gt;Vite&lt;/a&gt; +
    &lt;a target=&quot;_blank&quot; href=&quot;https://v3.vuejs.org&quot;&gt;Vue3&lt;/a&gt; +
    &lt;a target=&quot;_blank&quot; href=&quot;https://www.typescriptlang.org&quot;&gt;Typescript&lt;/a&gt;를 이용하여 데스크탑 앱 개발 환경을 설정해보자.
  &lt;/p&gt;



  &lt;h2&gt;1. Vite 프로젝트 생성&lt;/h2&gt;
  &lt;pre class=&quot;code-highlight&quot;&gt;&lt;code class=&quot;hljs bash nonum nowrap&quot;&gt;$ yarn create vite
yarn create v1.22.15
[1/4] Resolving packages...
[2/4] Fetching packages...
[3/4] Linking dependencies...
[4/4] Building fresh packages...

success Installed &quot;create-vite@2.7.2&quot; with binaries:
      - create-vite
      - cva
√ Project name: ... sample-project
√ Select a framework: » vue
√ Select a variant: » vue-ts

Scaffolding project in D:\_xshine\work\nodejs\electron\vue3\sam2edit...

Done. Now run:

  cd sample-project
  yarn
  yarn dev

Done in 723.60s.&lt;/code&gt;&lt;/pre&gt;
  &lt;p&gt;&lt;code class=&quot;literal&quot;&gt;yarn create vite&lt;/code&gt; 를 실행하면 프로젝트를 설정하는 프롬프트가 나온다.&lt;/p&gt;
  &lt;p&gt;프로젝트명을 &lt;code class=&quot;literal&quot;&gt;sample-project&lt;/code&gt;로 입력하고 &lt;code class=&quot;literal&quot;&gt;vue&lt;/code&gt; 프레임워크를 사용한다고 선택하고 Typescript( &lt;code class=&quot;literal&quot;&gt;vue-ts&lt;/code&gt; )를 사용한다고 선택했다.&lt;/p&gt;



  &lt;h2&gt;2. Electron 모듈 및 종속성 모듈 설치&lt;/h2&gt;
  &lt;pre class=&quot;code-highlight&quot;&gt;&lt;code class=&quot;hljs bash nonum nowrap&quot;&gt;# electron 모듈 설치
$ yarn add -D concurrently cross-env electron electron-builder wait-on

# 프로젝트 종속성 모듈 설치
$ yarn&lt;/code&gt;&lt;/pre&gt;



  &lt;h2&gt;3. package.json 파일 수정&lt;/h2&gt;
  &lt;p&gt;&lt;code class=&quot;literal&quot;&gt;build&lt;/code&gt; 속성 추가 (&lt;a target=&quot;_blank&quot; href=&quot;https://www.electron.build/configuration/configuration&quot;&gt;electron build&lt;/a&gt;에서 자세한 내용 확인할 수 있다.)&lt;/p&gt;
  &lt;pre class=&quot;code-highlight&quot;&gt;&lt;code class=&quot;hljs json&quot;&gt;&quot;build&quot;: {
  &quot;appId&quot;: &quot;com.my-website.my-app&quot;,
  &quot;productName&quot;: &quot;MyApp&quot;,
  &quot;copyright&quot;: &quot;Copyright © 2019 ${author}&quot;,
  &quot;mac&quot;: {
    &quot;category&quot;: &quot;public.app-category.utilities&quot;
  },
  &quot;nsis&quot;: {
    &quot;oneClick&quot;: false,
    &quot;allowToChangeInstallationDirectory&quot;: true
  },
  &quot;files&quot;: [
    &quot;dist/**/*&quot;,
    &quot;electron/**/*&quot;
  ],
  &quot;directories&quot;: {
    &quot;buildResources&quot;: &quot;assets&quot;,
    &quot;output&quot;: &quot;dist_electron&quot;
  }
}&lt;/code&gt;&lt;/pre&gt;
  &lt;p&gt;&amp;nbsp;&lt;/p&gt;
  &lt;p&gt;&lt;code class=&quot;literal&quot;&gt;scripts&lt;/code&gt; 속성에 script 추가&lt;/p&gt;
  &lt;pre class=&quot;code-highlight&quot;&gt;&lt;code class=&quot;hljs json&quot;&gt;&quot;scripts&quot;: {
  &quot;dev&quot;: &quot;vite&quot;,
  &quot;build&quot;: &quot;vue-tsc --noEmit &amp;&amp; vite build&quot;,
  &quot;serve&quot;: &quot;vite preview&quot;,
  &quot;electron&quot;: &quot;wait-on tcp:3000 &amp;&amp; cross-env IS_DEV=true electron .&quot;,
  &quot;electron:pack&quot;: &quot;electron-builder --dir&quot;,
  &quot;electron:dev&quot;: &quot;concurrently -k \&quot;cross-env BROWSER=none yarn dev\&quot; \&quot;yarn electron\&quot;&quot;,
  &quot;electron:builder&quot;: &quot;electron-builder&quot;,
  &quot;build:for:electron&quot;: &quot;vue-tsc --noEmit &amp;&amp; cross-env ELECTRON=true vite build&quot;,
  &quot;app:build&quot;: &quot;yarn build:for:electron &amp;&amp; yarn electron:builder&quot;
},&lt;/code&gt;&lt;/pre&gt;
  &lt;p&gt;&amp;nbsp;&lt;/p&gt;
  &lt;p&gt;&lt;code class=&quot;literal&quot;&gt;main&lt;/code&gt; 속성 추가&lt;/p&gt;
  &lt;pre class=&quot;code-highlight&quot;&gt;&lt;code class=&quot;hljs json&quot;&gt;{
    &quot;name&quot;: &quot;sample-project&quot;,
    &quot;version&quot;: &quot;0.0.0&quot;,
    &quot;license&quot;: &quot;MIT&quot;,
    &quot;main&quot;: &quot;electron/electron.js&quot;
    ...
  }&lt;/code&gt;&lt;/pre&gt;



  &lt;h2&gt;4. vite.config.ts 파일 수정&lt;/h2&gt;
  &lt;pre class=&quot;code-highlight&quot;&gt;&lt;code class=&quot;hljs typescript&quot;&gt;import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'

// https://vitejs.dev/config/
export default defineConfig({
  base: process.env.ELECTRON==&quot;true&quot; ? './' : &quot;.&quot;,
  plugins: [vue()]
})&lt;/code&gt;&lt;/pre&gt;



  &lt;h2&gt;5. electron/electron.js 파일 생성&lt;/h2&gt;
  &lt;pre class=&quot;code-highlight&quot;&gt;&lt;code class=&quot;hljs js&quot;&gt;const path = require('path');
const { app, BrowserWindow } = require('electron');

const isDev = process.env.IS_DEV == &quot;true&quot; ? true : false;

function createWindow() {
  // Create the browser window.
  const mainWindow = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      preload: path.join(__dirname, 'preload.js'),
      nodeIntegration: true,
    },
  });

  // and load the index.html of the app.
  // win.loadFile(&quot;index.html&quot;);
  mainWindow.loadURL(
    isDev
      ? 'http://localhost:3000'
      : `file://${path.join(__dirname, '../dist/index.html')}`
  );
  // Open the DevTools.
  if (isDev) {
    mainWindow.webContents.openDevTools();
  }
}

// This method will be called when Electron has finished
// initialization and is ready to create browser windows.
// Some APIs can only be used after this event occurs.
app.whenReady().then(() =&gt; {
  createWindow()
  app.on('activate', function () {
    // On macOS it's common to re-create a window in the app when the
    // dock icon is clicked and there are no other windows open.
    if (BrowserWindow.getAllWindows().length === 0) createWindow()
  })
});

// Quit when all windows are closed, except on macOS. There, it's common
// for applications and their menu bar to stay active until the user quits
// explicitly with Cmd + Q.
app.on('window-all-closed', () =&gt; {
  if (process.platform !== 'darwin') {
    app.quit();
  }
});&lt;/code&gt;&lt;/pre&gt;



  &lt;h2&gt;6. electron/preload.js 파일 생성&lt;/h2&gt;
  &lt;pre class=&quot;code-highlight&quot;&gt;&lt;code class=&quot;hljs js&quot;&gt;// All of the Node.js APIs are available in the preload process.
// It has the same sandbox as a Chrome extension.
window.addEventListener('DOMContentLoaded', () =&gt; {
  const replaceText = (selector, text) =&gt; {
    const element = document.getElementById(selector)
    if (element) element.innerText = text
  }

  for (const dependency of ['chrome', 'node', 'electron']) {
    replaceText(`${dependency}-version`, process.versions[dependency])
  }
})&lt;/code&gt;&lt;/pre&gt;

  &lt;h2&gt;7. 프로젝트 실행 및 빌드&lt;/h2&gt;
  &lt;pre class=&quot;code-highlight&quot;&gt;&lt;code class=&quot;hljs bash nonum&quot;&gt;# 개발 모드로 Electron 실행
$ yarn electron:dev

# Electron 앱 빌드
$ yarn app:build
&lt;/code&gt;&lt;/pre&gt;
  &lt;p&gt;&amp;nbsp;&lt;/p&gt;
  &lt;p&gt;참고 : &lt;a target=&quot;_blank&quot; href=&quot;https://dev.to/brojenuel/vite-vue-3-electron-5h4o&quot;&gt;https://dev.to/brojenuel/vite-vue-3-electron-5h4o&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;</description>
      <category>프로그래밍/Node.js</category>
      <category>electron</category>
      <category>node</category>
      <category>TypeScript</category>
      <category>vite</category>
      <category>Vue3</category>
      <author>메모하는습관</author>
      <guid isPermaLink="true">https://xshine.tistory.com/340</guid>
      <comments>https://xshine.tistory.com/340#entry340comment</comments>
      <pubDate>Thu, 6 Jan 2022 16:31:33 +0900</pubDate>
    </item>
    <item>
      <title>[svelte] 시작하기 (with typescript)</title>
      <link>https://xshine.tistory.com/339</link>
      <description>&lt;div class=&quot;tt_article_useless_p_margin&quot;&gt;
  &lt;p&gt;※ 이 글은 node.js 개발 환경이 구성되어 있다는 전제하에 쓰여진 글 이다.&lt;/p&gt;
  &lt;p&gt;※ vscode를 사용하고 있다면 &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=svelte.svelte-vscode&quot;&gt;Svelte for VS Code&lt;/a&gt; plugin 사용을 추천한다.&lt;/p&gt;

  &lt;p&gt;&amp;nbsp;&lt;/p&gt;
  &lt;p&gt;&lt;a href=&quot;https://github.com/sveltejs/template&quot;&gt;https://github.com/sveltejs/template&lt;/a&gt; 에서 프로젝트 템플릿을 제공하고 있다.&lt;/p&gt;
  &lt;p&gt;위의 프로젝트 템플릿을 기반으로 새 프로젝트를 시작해 보자&lt;/p&gt;
  &lt;pre class=&quot;code-highlight&quot;&gt;&lt;code class=&quot;hljs bash nonum&quot;&gt;# npx degit sveltejs/template [프로젝트명]
$ npx degit sveltejs/template svelte-app
&gt; cloned sveltejs/template#HEAD to svelte-app

# 프로젝트 폴더로 이동한다.
$ cd svelte-app&lt;/code&gt;&lt;/pre&gt;
  &lt;p&gt;&amp;nbsp;&lt;/p&gt;
  &lt;p&gt;아래와 같이 프로젝트 폴더와 파일이 생성된다.&lt;p&gt;
&lt;pre class=&quot;code-highlight&quot;&gt;&lt;code class=&quot;hljs text nonum&quot;&gt;svelte-app
├── .gitignore
├── package.json
├── public
│   ├── favicon.png
│   ├── global.css
│   └── index.html
├── README.md
├── rollup.config.js
├── scripts
│   └── setupTypeScript.js
└── src
    ├── App.svelte
    └── main.js&lt;/code&gt;&lt;/pre&gt;
  &lt;p&gt;&amp;nbsp;&lt;/p&gt;
  &lt;p&gt;아래의 명령을 실행하면 typescript를 사용할 수 있는 환경이 설정된다.&lt;p&gt;
  &lt;pre class=&quot;code-highlight&quot;&gt;&lt;code class=&quot;hljs bash nonum&quot;&gt;$ node scripts/setupTypeScript.js
Converted to TypeScript.&lt;/code&gt;&lt;/pre&gt;

  &lt;p&gt;&amp;nbsp;&lt;/p&gt;
  &lt;p&gt;typescript를 사용할 수 있는 환경이 설정 되면 아래와 같이 파일들이 변경된다.&lt;p&gt;
  &lt;pre class=&quot;code-highlight&quot;&gt;&lt;code class=&quot;hljs text nonum&quot;&gt;svelte-app
├── .gitignore
├── .vscode
│   └── extensions.json
├── package.json       
├── public
│   ├── favicon.png    
│   ├── global.css     
│   └── index.html     
├── README.md
├── rollup.config.js   
├── src
│   ├── App.svelte     
│   ├── global.d.ts    
│   └── main.ts        
└── tsconfig.json&lt;/code&gt;&lt;/pre&gt;

  &lt;p&gt;&amp;nbsp;&lt;/p&gt;
  &lt;p&gt;프로젝트에 필요한 모듈들을 설치 한다.&lt;/p&gt;
  &lt;pre class=&quot;code-highlight&quot;&gt;&lt;code class=&quot;hljs text nonum&quot;&gt;$ npm install&lt;/code&gt;&lt;/pre&gt;
  
  &lt;p&gt;&amp;nbsp;&lt;/p&gt;
  &lt;p&gt;프로젝트를 실행할 수 있는 모든 환경이 갖춰졌다. 바로 실행해 보자.&lt;/p&gt;
  &lt;pre class=&quot;code-highlight&quot;&gt;&lt;code class=&quot;hljs text nonum&quot;&gt;$ npm run dev
&gt; svelte-app@1.0.0 dev
&gt; rollup -c -w        

rollup v2.63.0
bundles src/main.ts → public\build\bundle.js...
LiveReload enabled
created public\build\bundle.js in 1.3s

[2022-01-06 01:44:23] waiting for changes...

&gt; svelte-app@1.0.0 start
&gt; sirv public --no-clear &quot;--dev&quot;


  Your application is ready~!  

  - Local:      http://localhost:5000
  - Network:    Add `--host` to expose

────────────────── LOGS ──────────────────&lt;/code&gt;&lt;/pre&gt;
  &lt;p&gt;&amp;nbsp;&lt;/p&gt;
  &lt;p&gt;웹 브라우저에서 http://localhost:5000을 보면 아래와 같이 Hello World를 볼수 있다.&lt;/p&gt;
  &lt;p&gt;&lt;img width=&quot;100%&quot; src=&quot;data:image/png;base64,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&quot;/&gt;&lt;/p&gt;


&lt;/div&gt;</description>
      <category>프로그래밍/Node.js</category>
      <category>nodejs</category>
      <category>svelte</category>
      <category>TypeScript</category>
      <author>메모하는습관</author>
      <guid isPermaLink="true">https://xshine.tistory.com/339</guid>
      <comments>https://xshine.tistory.com/339#entry339comment</comments>
      <pubDate>Thu, 6 Jan 2022 02:09:19 +0900</pubDate>
    </item>
    <item>
      <title>[Windows10] pipenv 설정</title>
      <link>https://xshine.tistory.com/338</link>
      <description>&lt;div class=&quot;tt_article_useless_p_margin&quot;&gt;
  &lt;p&gt;1. pipenv 설치&lt;/p&gt;
  &lt;pre class=&quot;code-highlight&quot;&gt;&lt;code class=&quot;hljs bash nonum nowrap&quot;&gt;$ pip install pipenv
Collecting pipenv
  Downloading pipenv-2021.11.23-py2.py3-none-any.whl (3.6 MB)
     |████████████████████████████████| 3.6 MB 6.4 MB/s
Requirement already satisfied: pip&gt;=18.0 in c:\users\사용자\appdata\local\programs\python\python39\lib\site-packages (from pipenv) (21.1.1)
Requirement already satisfied: setuptools&gt;=36.2.1 in c:\users\사용자\appdata\local\programs\python\python39\lib\site-packages (from pipenv) (56.0.0)
Collecting certifi
  Downloading certifi-2021.10.8-py2.py3-none-any.whl (149 kB)
     |████████████████████████████████| 149 kB ...
Collecting virtualenv-clone&gt;=0.2.5
  Downloading virtualenv_clone-0.5.7-py3-none-any.whl (6.6 kB)
Collecting virtualenv
  Downloading virtualenv-20.13.0-py2.py3-none-any.whl (6.5 MB)
     |████████████████████████████████| 6.5 MB ...
Collecting distlib&lt;1,&gt;=0.3.1
  Downloading distlib-0.3.4-py2.py3-none-any.whl (461 kB)
     |████████████████████████████████| 461 kB ...
Collecting six&lt;2,&gt;=1.9.0
  Downloading six-1.16.0-py2.py3-none-any.whl (11 kB)
Collecting platformdirs&lt;3,&gt;=2
  Downloading platformdirs-2.4.1-py3-none-any.whl (14 kB)
Collecting filelock&lt;4,&gt;=3.2
  Downloading filelock-3.4.2-py3-none-any.whl (9.9 kB)
Installing collected packages: six, platformdirs, filelock, distlib, virtualenv-clone, virtualenv, certifi, pipenv
Successfully installed certifi-2021.10.8 distlib-0.3.4 filelock-3.4.2 pipenv-2021.11.23 platformdirs-2.4.1 six-1.16.0 virtualenv-20.13.0 virtualenv-clone-0.5.7&lt;/code&gt;&lt;/pre&gt;
  &lt;p&gt;&amp;nbsp;&lt;/p&gt;
  &lt;p&gt;2. 가상 환경 생성&lt;/p&gt;
  &lt;pre class=&quot;code-highlight&quot;&gt;&lt;code class=&quot;hljs bash nonum nowrap&quot;&gt;$ pipenv --python 3.9
Creating a virtualenv for this project...
Pipfile: c:\workspace\python\Pipfile
Using C:/Users/사용자/AppData/Local/Programs/Python/Python39/python.exe (3.9.5) to create virtualenv...
[  ==] Creating virtual environment...created virtual environment CPython3.9.5.final.0-64 in 1748ms
  creator CPython3Windows(dest=C:\Users\사용자\.virtualenvs\python-79q45Mac, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=C:\Users\사용자\AppData\Local\pypa\virtualenv)
    added seed packages: pip==21.3.1, setuptools==60.2.0, wheel==0.37.1
  activators BashActivator,BatchActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator

Successfully created virtual environment!
Virtualenv location: C:\Users\사용자\.virtualenvs\python-79q45Mac
Creating a Pipfile for this project...&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;</description>
      <category>프로그래밍/Python</category>
      <category>pipenv</category>
      <category>Python</category>
      <category>가상환경</category>
      <author>메모하는습관</author>
      <guid isPermaLink="true">https://xshine.tistory.com/338</guid>
      <comments>https://xshine.tistory.com/338#entry338comment</comments>
      <pubDate>Thu, 6 Jan 2022 01:25:11 +0900</pubDate>
    </item>
    <item>
      <title>[python3] postgresql 예제</title>
      <link>https://xshine.tistory.com/337</link>
      <description>&lt;div class=&quot;tt_article_useless_p_margin&quot;&gt;
&lt;p&gt;먼저 &lt;a href=&quot;https://pypi.org/project/psycopg2/&quot;&gt;psycopg2&lt;/a&gt;을 설치 한다.&lt;/p&gt;
&lt;p&gt;※ 혹시 CentOS 7 에서 psycopg2를 설치할 때 오류가 발생한 다면 아래의 방법을 시도해 보자&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1641279110936&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;CentOS7에서 psycopg2 설치 오류 해결&quot; data-og-description=&quot;sudo yum groupinstall &amp;quot;Development Tools&amp;quot; sudo yum install python3-devel sudo yum install postgresql-libs sudo yum install postgresql-devel pip3 install psycopg2 출처 : https://stackoverflow.com/a/5..&quot; data-og-host=&quot;xshine.tistory.com&quot; data-og-source-url=&quot;https://xshine.tistory.com/330&quot; data-og-url=&quot;https://xshine.tistory.com/330&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bzDMoY/hyMXI5R3OG/7xwpcFDfCTAh9YAAjAExv0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/Mpq7t/hyMYNRZz0e/GhHFU2xEDzFo4dtL4bRUyK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://xshine.tistory.com/330&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://xshine.tistory.com/330&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bzDMoY/hyMXI5R3OG/7xwpcFDfCTAh9YAAjAExv0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/Mpq7t/hyMYNRZz0e/GhHFU2xEDzFo4dtL4bRUyK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;CentOS7에서 psycopg2 설치 오류 해결&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;sudo yum groupinstall &quot;Development Tools&quot; sudo yum install python3-devel sudo yum install postgresql-libs sudo yum install postgresql-devel pip3 install psycopg2 출처 : https://stackoverflow.com/a/5..&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;xshine.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;pre class=&quot;code-highlight&quot;&gt;&lt;code class=&quot;hljs bash nonum&quot;&gt;$ pip install psycopg2
Collecting psycopg2
  Downloading psycopg2-2.9.3.tar.gz (380 kB)
     |████████████████████████████████| 380 kB 20.7 MB/s            
  Preparing metadata (setup.py) ... done
Building wheels for collected packages: psycopg2
  Building wheel for psycopg2 (setup.py) ... done
  Created wheel for psycopg2: filename=psycopg2-2.9.3-cp36-cp36m-linux_x86_64.whl size=403086 sha256=1650e6aa9fae31d2b8e45624ef481491f2901ab0101b53bcbae0a8228bc7ce11
  Stored in directory: /root/.cache/pip/wheels/25/89/7b/ebfb85abf80609378825b3bb975007b41fa51f31c98377914c
Successfully built psycopg2
Installing collected packages: psycopg2
Successfully installed psycopg2-2.9.3&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;아래는 &lt;a href=&quot;https://pypi.org/project/psycopg2/&quot;&gt;psycopg2&lt;/a&gt;를 사용하여 postgresql DB에 데이터를 추가하고 조회하는 예제이다.&lt;/p&gt;
&lt;pre class=&quot;code-highlight&quot;&gt;&lt;code class=&quot;hljs python&quot;&gt;import psycopg2
  
try:
	conn = pymysql.connect(
		host='127.0.0.1',
		user='user',
		password='passwd',
		dbname='dbname',
		port='5432')
	cursor = conn.cursor()
    
	# 데이터 추가
	cursor.execute(&quot;&quot;&quot;
		INSERT INTO users (id, name)
		VALUES (%s, %s)
	&quot;&quot;&quot;, ('gdhong', '홍길동'))
	conn.commit()
    
	# 데이터 조회
	cursor.execute(&quot;&quot;&quot;
		SELECT	id, name
		FROM		users
		WHERE		id = %s
	&quot;&quot;&quot;, ('gdhong'))
	result = cur.fetchall()
	
finally:
	cursor.close()
	conn.close()
  &lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;</description>
      <category>프로그래밍/Python</category>
      <category>postgres</category>
      <category>Python</category>
      <author>메모하는습관</author>
      <guid isPermaLink="true">https://xshine.tistory.com/337</guid>
      <comments>https://xshine.tistory.com/337#entry337comment</comments>
      <pubDate>Tue, 4 Jan 2022 15:46:05 +0900</pubDate>
    </item>
  </channel>
</rss>