<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Practical Accumulation</title>
    <link>https://kogle.tistory.com/</link>
    <description>Only Practical Knowledge of Programming /
010-2600-8322 / heops79@naver.com /
Fluent English Speaker/
언어: Go, Scala,  Python, JavaScript, Java, 
Platform: Android, Node.js, Spring(Boot), Hibernate
Database: MySql, MongoDB, Oracle
Client 기술: React, Angular</description>
    <language>ko</language>
    <pubDate>Tue, 30 Jun 2026 13:33:53 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Korean Eagle</managingEditor>
    <image>
      <title>Practical Accumulation</title>
      <url>https://tistory1.daumcdn.net/tistory/3871215/attach/02fd0fb05cd143e796214f001d37d302</url>
      <link>https://kogle.tistory.com</link>
    </image>
    <item>
      <title>Relocatable File의 Symbol Table 조회하는 3가지 키워드</title>
      <link>https://kogle.tistory.com/477</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;윈도우에 실행 파일이 PE 포멧이듯, 리눅스에는 ELF 포멧이 기본이다. 아래는 relocatable 파일(쉽게 말하면 오브젝트 파일)의 심볼테이블 (변수나 함수)를 링커에서 사용하는데 아래의 명령어들로 화면에 출력해 볼 수 있다.&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;1. readelf -s main.o&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리눅스에서는 대부분 오브젝트 파일을 elf 포멧으로 생성하므로 아래의 readelf를 사용할 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;아래를 보면 section에 대한 정보가 나오지만 어떤 심볼이 어떤 섹센에 포함된지 이해하기 힘들다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;buf, main이 global symbol 이다.&lt;/li&gt;
&lt;li&gt;swap, printf가 external 이다. global + UND 정의되지 않는 심볼&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1732334212949&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Symbol table '.symtab' contains 8 entries:
   Num:    Value          Size Type    Bind   Vis      Ndx Name
     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     1: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS main.c
     2: 0000000000000000     0 SECTION LOCAL  DEFAULT    1 .text
     3: 0000000000000000     0 SECTION LOCAL  DEFAULT    5 .rodata
     4: 0000000000000000     8 OBJECT  GLOBAL DEFAULT    3 buf
     5: 0000000000000000    59 FUNC    GLOBAL DEFAULT    1 main
     6: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND swap
     7: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND printf&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. objdump -t main.o&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디어셈블을 위한 -d 옵션 이외에도 symbok table을 조회하는 기능을 제공한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;좀 더 이해하기 쉽게 표현되어 있다. assembly 코드와 거의 유사하기 때문이다.&lt;/li&gt;
&lt;li&gt;buf는 .data에 속한 초기화된 global symbol이다. main은 F(함수)로 .text 섹션에 포함된 실행 코드이다.&lt;/li&gt;
&lt;li&gt;swap, printf는 정의되지 않았으므로 external 심볼이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1732334293162&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;main.o:     file format elf64-x86-64

SYMBOL TABLE:
0000000000000000 l    df *ABS*  0000000000000000 main.c
0000000000000000 l    d  .text  0000000000000000 .text
0000000000000000 l    d  .rodata        0000000000000000 .rodata
0000000000000000 g     O .data  0000000000000008 buf
0000000000000000 g     F .text  000000000000003b main
0000000000000000         *UND*  0000000000000000 swap
0000000000000000         *UND*  0000000000000000 printf&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. nm main.o&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적으로 가장 많이 사용하는 nm 명령어는 elf 포멧 섹션까지 분석해 주진 않는다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;아주 간단하게만 나와 있다. buf는 정의된 심볼, T는 text section에 속한다. printf, swap은 외부 심볼(미정의)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1732334314286&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;0000000000000000 D buf
0000000000000000 T main
                 U printf
                 U swap&lt;/code&gt;&lt;/pre&gt;</description>
      <category>IT 관련 유용한 것들</category>
      <author>Korean Eagle</author>
      <guid isPermaLink="true">https://kogle.tistory.com/477</guid>
      <comments>https://kogle.tistory.com/477#entry477comment</comments>
      <pubDate>Sat, 23 Nov 2024 13:00:18 +0900</pubDate>
    </item>
    <item>
      <title>VMWare Workstation Pro 설치</title>
      <link>https://kogle.tistory.com/474</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. VMWare Workstation Pro는 개인사용자용으로 무료로 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. VirtualBox와는 다르게 Type1 가상화 도구로 하드웨어를 직접 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 2-1 속도에서 비교가 되지 않는다. VirtualBox를 사용할 이유는 전혀 없다.&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;3. 다운로드는 BoardCom 사이트에 가입해서 받을 수 있지만 까다로운 정책 때문에 그냥 인터넷 검색으로 설치파일을 받는 것을 권장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.majorgeeks.com/mg/getmirror/vmware_workstation_for_windows,1.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.majorgeeks.com/mg/getmirror/vmware_workstation_for_windows,1.html&lt;/a&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;4. 라이센스 역시 인터넷에 검색하면 쉽게 받을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/hegdepavankumar/VMware-Workstation-Pro-17-Licence-Keys&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/hegdepavankumar/VMware-Workstation-Pro-17-Licence-Keys&lt;/a&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;5. 윈도우의 경우, 설치 후 가상머신을 만들 때 오류가 생길 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 5-1 가장 까다로운 것이 아래의 내용이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AMD CPU - virtualized intel vt-x/ept is not supported on this platform. continue without virtualized vt-x/ept?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Intel CPU - virtualized amd-v/rvi is not supported on this platform. continue without virtualized amd-v/rvi?&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;&amp;nbsp; 5-2 cmd 창을 관리자 권한으로 열고 bcdedit /set hypervisorlaunchtype off 을 수행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 5-3 INTEL의 경우는 윈도우 보안의&amp;nbsp; 코어 격리에서 메모리 무결성을 추가로 꺼주어야 한다.&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>기록</category>
      <author>Korean Eagle</author>
      <guid isPermaLink="true">https://kogle.tistory.com/474</guid>
      <comments>https://kogle.tistory.com/474#entry474comment</comments>
      <pubDate>Mon, 4 Nov 2024 11:47:47 +0900</pubDate>
    </item>
    <item>
      <title>라즈베리 파이 4B 5.15y 커널 빌드 기록</title>
      <link>https://kogle.tistory.com/473</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. 24.04에서는 빌드 안됨 - 아래의 에러를 내면서 빌드되지 않는다.&lt;/p&gt;
&lt;pre id=&quot;code_1718468385863&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/home/pilseong/practice/kernel/linux/drivers/ata/libahci.c: In function &amp;lsquo;ahci_led_store&amp;rsquo;:
/home/pilseong/practice/kernel/linux/include/linux/compiler_types.h:334:45: error: call to &amp;lsquo;__compiletime_assert_358&amp;rsquo; declared with attribute error: BUILD_BUG_ON failed: sizeof(_s) &amp;gt; sizeof(long)
  334 |         _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
      |                                             ^
/home/pilseong/practice/kernel/linux/include/linux/compiler_types.h:315:25: note: in definition of macro &amp;lsquo;__compiletime_assert&amp;rsquo;
  315 |                         prefix ## suffix();                             \
      |                         ^~~~~~
/home/pilseong/practice/kernel/linux/include/linux/compiler_types.h:334:9: note: in expansion of macro &amp;lsquo;_compiletime_assert&amp;rsquo;
  334 |         _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
      |         ^~~~~~~~~~~~~~~~~~~
/home/pilseong/practice/kernel/linux/include/linux/build_bug.h:39:37: note: in expansion of macro &amp;lsquo;compiletime_assert&amp;rsquo;
   39 | #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
      |                                     ^~~~~~~~~~~~~~~~~~
/home/pilseong/practice/kernel/linux/include/linux/build_bug.h:50:9: note: in expansion of macro &amp;lsquo;BUILD_BUG_ON_MSG&amp;rsquo;
   50 |         BUILD_BUG_ON_MSG(condition, &quot;BUILD_BUG_ON failed: &quot; #condition)
      |         ^~~~~~~~~~~~~~~~
/home/pilseong/practice/kernel/linux/include/linux/nospec.h:58:9: note: in expansion of macro &amp;lsquo;BUILD_BUG_ON&amp;rsquo;
   58 |         BUILD_BUG_ON(sizeof(_s) &amp;gt; sizeof(long));                        \
      |         ^~~~~~~~~~~~
/home/pilseong/practice/kernel/linux/drivers/ata/libahci.c:1143:23: note: in expansion of macro &amp;lsquo;array_index_nospec&amp;rsquo;
 1143 |                 pmp = array_index_nospec(pmp, EM_MAX_SLOTS);
      |                       ^~~~~~~~~~~~~~~~~~
  CC [M]  drivers/w1/masters/ds1wm.o
make[3]: *** [/home/pilseong/practice/kernel/linux/scripts/Makefile.build:289: drivers/ata/libahci.o] Error 1
make[2]: *** [/home/pilseong/practice/kernel/linux/scripts/Makefile.build:552: drivers/ata] Error 2&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 20.04를 설치해서 사용해야 가능함. 빌드할 커널과 유사한 버전의 리눅스에서 빌드해야 빌드 실패를 줄일 수 있다. 라이브러리 호환성 문제로 빌드가 되지 않는 경우가 아주 많다.&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;3. 최신 x86버전을 라즈베리 4에 설치했는데, 빌드를 보니 64비트가 설치되어 있는 황당한 경우가 있었다. 빌드 시에 아키텍처 확인이 필수&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;4. 20년 5월 빌드를 설치하면 wifi 가 붙었다가 떨어지는 문제가 있다. 2020년 12월 버전의 경우 문제가 발생하지 않은다(커널 5.15)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://downloads.raspberrypi.com/raspios_armhf/images/raspios_armhf-2020-12-04/&quot;&gt;Index of /raspios_armhf/images/raspios_armhf-2020-12-04 (raspberrypi.com)&lt;/a&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;5. 커널을 install 할 때 빌드한 zImage 파일을 라즈베리 microSD에 복사해야 한다. 아래의 경우는 boot 파티션이 sda1으로 되어 있다. 커널을 빌드할 경우 zImage라는 이미지가 생성되는데 32비트의 경우 zImage, 64비트의 경우 Image를 생성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1718505952304&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pilseong@pilseong-Standard-PC-Q35-ICH9-2009:~/practice/kernel/out$ lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0    7:0    0     4K  1 loop /snap/bare/5
loop1    7:1    0  63.3M  1 loop /snap/core20/1828
loop2    7:2    0 346.3M  1 loop /snap/gnome-3-38-2004/119
loop3    7:3    0    46M  1 loop /snap/snap-store/638
loop4    7:4    0  49.9M  1 loop /snap/snapd/18357
loop5    7:5    0  91.7M  1 loop /snap/gtk-common-themes/1535
loop6    7:6    0  38.8M  1 loop /snap/snapd/21759
loop7    7:7    0    64M  1 loop /snap/core20/2318
loop8    7:8    0 349.7M  1 loop /snap/gnome-3-38-2004/143
sda      8:0    1  29.7G  0 disk 
├─sda1   8:1    1   256M  0 part /media/pilseong/boot
└─sda2   8:2    1  29.5G  0 part /media/pilseong/rootfs
sr0     11:0    1  1024M  0 rom  
vda    252:0    0   100G  0 disk 
├─vda1 252:1    0   512M  0 part /boot/efi
├─vda2 252:2    0     1K  0 part 
└─vda5 252:5    0  99.5G  0 part /&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 5-1 하고 싶은 말은 boot 파티션에는 여러 버전의 kernel.img가 있을 경우가 많다. 라즈베리 4B 같은 경우 32비트의 확장인터페이스를 지원하므로 kernel7l.img 파일이 부팅시에 사용되므로 아래처럼 zImage를 kernel7l.img 로 복사해야 정상적인 커널이 사용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1718506152344&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pilseong@pilseong-Standard-PC-Q35-ICH9-2009:~/practice/kernel/out$ sudo cp mnt/boot/kernel7l.img mnt/boot/kernel7l-backup.img
pilseong@pilseong-Standard-PC-Q35-ICH9-2009:~/practice/kernel/out$ ll arch/arm/boot/
total 22580
drwxrwxr-x  4 pilseong pilseong     4096  6월 16 10:45 ./
drwxrwxr-x 15 pilseong pilseong     4096  6월 16 10:39 ../
drwxrwxr-x  2 pilseong pilseong     4096  6월 16 10:45 compressed/
drwxrwxr-x  3 pilseong pilseong    12288  6월 16 10:37 dts/
-rwxrwxr-x  1 pilseong pilseong 22360140  6월 16 10:45 Image*
-rw-rw-r--  1 pilseong pilseong      109  6월 16 10:45 .Image.cmd
-rwxrwxr-x  1 pilseong pilseong  7070472  6월 16 10:45 zImage*
-rw-rw-r--  1 pilseong pilseong      136  6월 16 10:45 .zImage.cmd
pilseong@pilseong-Standard-PC-Q35-ICH9-2009:~/practice/kernel/out$ sudo cp arch/arm/boot/zImage mnt/boot/kernel7l.img
pilseong@pilseong-Standard-PC-Q35-ICH9-2009:~/practice/kernel/out$ sudo umount mnt/boot
pilseong@pilseong-Standard-PC-Q35-ICH9-2009:~/practice/kernel/out$ sudo umount mnt/root&lt;/code&gt;&lt;/pre&gt;</description>
      <category>기록</category>
      <author>Korean Eagle</author>
      <guid isPermaLink="true">https://kogle.tistory.com/473</guid>
      <comments>https://kogle.tistory.com/473#entry473comment</comments>
      <pubDate>Sun, 16 Jun 2024 01:23:56 +0900</pubDate>
    </item>
    <item>
      <title>리눅스 gedit 문법 하이라이트 asm-intel.lang 설정</title>
      <link>https://kogle.tistory.com/472</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. gtksourceview-4에서는 예전의 asm-intel.lang이 먹지 않는다.&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;/usr/share/gtksourceview-4/language-speces 아래에 저장한다.&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;a href=&quot;https://gist.githubusercontent.com/mrbesher/5c98da1c220d10e2aba8276554d3456c/raw/5bedeaeacfc0886c2d5de9dcd36f63cbc328a653/asm-intel.lang&quot;&gt;gist.githubusercontent.com/mrbesher/5c98da1c220d10e2aba8276554d3456c/raw/5bedeaeacfc0886c2d5de9dcd36f63cbc328a653/asm-intel.lang&lt;/a&gt;&lt;/p&gt;</description>
      <category>기록</category>
      <author>Korean Eagle</author>
      <guid isPermaLink="true">https://kogle.tistory.com/472</guid>
      <comments>https://kogle.tistory.com/472#entry472comment</comments>
      <pubDate>Sun, 9 Jun 2024 12:48:44 +0900</pubDate>
    </item>
    <item>
      <title>Old Linux : 우분투 7.04 Feisty Fawn VirtualBox7 부팅 안될 때</title>
      <link>https://kogle.tistory.com/471</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://askubuntu.com/questions/139157/booting-ubuntu-with-acpi-off-grub-parameter&quot;&gt;boot - Booting Ubuntu with &quot;acpi=off&quot; grub parameter - Ask Ubuntu&lt;/a&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;위의 내용을 참고해서 acpi 설정을 해지 하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적인 F6으로 옵션으로 가서 nolapic 를 quiet 대신에 넣어주면 된다.&lt;/p&gt;</description>
      <category>기록</category>
      <author>Korean Eagle</author>
      <guid isPermaLink="true">https://kogle.tistory.com/471</guid>
      <comments>https://kogle.tistory.com/471#entry471comment</comments>
      <pubDate>Sat, 8 Jun 2024 23:05:53 +0900</pubDate>
    </item>
    <item>
      <title>Docker Debian 기반 이미지에서 apt update가 안될 때, vim 없을 때</title>
      <link>https://kogle.tistory.com/470</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. 종종 vi가 설치 되지 않는 debian 기반 옛날 이미지를 사용할 때가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. vi나 nano를 설치하려면 apt update, apt install vim 를 사용해야 하는데 repository 주소가 너무 옛날이라 error 뜨는 경우가 많다.&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;1037&quot; data-origin-height=&quot;529&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dS3CHi/btsHe2WvYVS/jArDelKolFORSM6B1tyiGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dS3CHi/btsHe2WvYVS/jArDelKolFORSM6B1tyiGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dS3CHi/btsHe2WvYVS/jArDelKolFORSM6B1tyiGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdS3CHi%2FbtsHe2WvYVS%2FjArDelKolFORSM6B1tyiGK%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;1037&quot; height=&quot;529&quot; data-origin-width=&quot;1037&quot; data-origin-height=&quot;529&quot;/&gt;&lt;/span&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;3. 이런 경우 echo를 사용하여 경로를 바꾸어 주면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. /etc/apt/sources.list 파일을 찾아서 경로에 들어간다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. rm sources.list 해서 삭제를 하고 아래를 붙여 넣어 경로를 수정해 준다.&lt;/p&gt;
&lt;pre id=&quot;code_1715090205644&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;echo deb http://archive.debian.org/debian/ stretch main contrib non-free &amp;gt;&amp;gt; sources.list
echo deb http://archive.debian.org/debian-security/ stretch/updates main contrib non-free &amp;gt;&amp;gt; sources.list&lt;/code&gt;&lt;/pre&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;1355&quot; data-origin-height=&quot;530&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvFVvs/btsHea1zqoI/P9pWtRk98CjjkTGQwyZw8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvFVvs/btsHea1zqoI/P9pWtRk98CjjkTGQwyZw8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvFVvs/btsHea1zqoI/P9pWtRk98CjjkTGQwyZw8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvFVvs%2FbtsHea1zqoI%2FP9pWtRk98CjjkTGQwyZw8K%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;1355&quot; height=&quot;530&quot; data-origin-width=&quot;1355&quot; data-origin-height=&quot;530&quot;/&gt;&lt;/span&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;6. 아래 처럼 설치해 준다.&lt;/p&gt;
&lt;pre id=&quot;code_1715090286601&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apt install; apt install vim&lt;/code&gt;&lt;/pre&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;1274&quot; data-origin-height=&quot;1430&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SV4hc/btsHf0D87kI/smDJ8jqfuBECEFA4gZxYy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SV4hc/btsHf0D87kI/smDJ8jqfuBECEFA4gZxYy1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SV4hc/btsHf0D87kI/smDJ8jqfuBECEFA4gZxYy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSV4hc%2FbtsHf0D87kI%2FsmDJ8jqfuBECEFA4gZxYy1%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;1274&quot; height=&quot;1430&quot; data-origin-width=&quot;1274&quot; data-origin-height=&quot;1430&quot;/&gt;&lt;/span&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT 관련 유용한 것들</category>
      <author>Korean Eagle</author>
      <guid isPermaLink="true">https://kogle.tistory.com/470</guid>
      <comments>https://kogle.tistory.com/470#entry470comment</comments>
      <pubDate>Tue, 7 May 2024 23:05:55 +0900</pubDate>
    </item>
    <item>
      <title>TypeScript Record와 keyof 설명</title>
      <link>https://kogle.tistory.com/469</link>
      <description>&lt;pre id=&quot;code_1714567217120&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;export type LocaleEntry&amp;lt;TCategoryDefinition extends Record&amp;lt;string, unknown&amp;gt;&amp;gt; = {
  [P in keyof TCategoryDefinition]?: TCategoryDefinition[P] | null;
} &amp;amp; Record&amp;lt;string, unknown&amp;gt;; // Unsupported &amp;amp; custom entries&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 위의 TCategoryDefinition은 Record&amp;lt;string, unknown&amp;gt;을 상속하므로 Record 타입과 동일하게 생각하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. LocalEntry 타입은 key, value 타입의 일반 객체로 key의 경우는 Record에서 나온 key들을 P에 담고 있고 각 키에 대응하는 값의 타입을 값으로 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 키가 ?가 붙어 있어 optional이다. keyof는 해당 타입, 객체의 모든 키들을 UNION하여 가져 온다. | 로 묶은 집합이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4 마지막 &amp;amp;은 앞의 정의한 타입에 덮어쓰는 부분으로 해당 부분만 예외적으로 적용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1714567796540&quot; class=&quot;typescript&quot; style=&quot;background-color: #f6f7f8; color: #666666; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;export type ColorDefinition = LocaleEntry&amp;lt;{
  /**
   * Human-readable color names.
   */
  human: string[];

  /**
   * Color space names.
   */
  space: string[];
}&amp;gt;;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;5. 위의 블록을 사용하는 코드로 여기서는 ColorDefinition을 정의하고 있다. LocalEntry타입으로 human: string[], space: string[]이 option이 TCategoryDefinition으로 전달되어 human, space가 optional인 타입으로 정의 된다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1714567818850&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import type { ColorDefinition } from '../../..';
import space from './space';

const color: ColorDefinition = {
  space,
};

export default color;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드는 ColorDefinition 을 사용하는 부분인데 ColorDefinition 타입의 color에 기본 색상 값 space: string[]를 지정하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 위의 복잡한 코드로 부터 얻을 수 있는 것은 타입 safety 밖에 없다. over engineering 이지만 이런 코드가 오픈 소스에 너무 많고 이것이 기본 패턴처럼 사용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1714567841066&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;export default [
  'Academy Color Encoding System (ACES)',
  'Adobe RGB',
  'Adobe Wide Gamut RGB',
  'British Standard Colour (BS)',
  'CIE 1931 XYZ',
  'CIELAB',
  'CIELUV',
  'CIEUVW',
  'CMY',
  'CMYK',
  'DCI-P3',
  'Display-P3',
  'Federal Standard 595C',
  'HKS',
  'HSL',
  'HSLA',
  'HSLuv',
  'HSV',
  'HWB',
  'LCh',
  'LMS',
  'Munsell Color System',
  'Natural Color System (NSC)',
  'Pantone Matching System (PMS)',
  'ProPhoto RGB Color Space',
  'RAL',
  'RG',
  'RGBA',
  'RGK',
  'Rec. 2020',
  'Rec. 2100',
  'Rec. 601',
  'Rec. 709',
  'Uniform Color Spaces (UCSs)',
  'YDbDr',
  'YIQ',
  'YPbPr',
  'sRGB',
  'sYCC',
  'scRGB',
  'xvYCC',
];&lt;/code&gt;&lt;/pre&gt;</description>
      <category>기록</category>
      <author>Korean Eagle</author>
      <guid isPermaLink="true">https://kogle.tistory.com/469</guid>
      <comments>https://kogle.tistory.com/469#entry469comment</comments>
      <pubDate>Wed, 1 May 2024 21:44:28 +0900</pubDate>
    </item>
    <item>
      <title>Mac (맥) 윈도우식 키매핑</title>
      <link>https://kogle.tistory.com/468</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. Karabiner-Elements를 설치한다. 아래 링크에서 받으면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://karabiner-elements.pqrs.org/&quot;&gt;Karabiner-Elements (pqrs.org)&lt;/a&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;2. 설치한다. 중요한 것은 시스템 설정에서 권한을 허락해 주어야 하는 부분이 있는데, 그것은 karabinder를 실행하면 화면마다 필요한 권한이 어떤 것인지 그리고 어떻게 권한을 시스템 설정에서 주어야 하는지 설명이 나온다. 그것을 따라 하면 어렵지 않게 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 2-0 결과적으로 설치 후에 아래 2-1, 2-2가 처리가 되어야 키매핑이 제대로 동작한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 2-1 첫번째는 해당 프로그램에 시스템 권한을 주는 부분인데, 시스템 설정에서 Allow 버튼을 눌러야 하는 부분이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 2-2 두번째는 설치 시 패키지에&amp;nbsp; 함께 설치된 프로그램에게 입력 모니터링 권한을 부여하는 것인데, 설정 후 아래처럼 나오면 된다.&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;783&quot; data-origin-height=&quot;693&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QgA4t/btsG3O5GabD/TdkFeh5Glt0BkdnaA4MEN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QgA4t/btsG3O5GabD/TdkFeh5Glt0BkdnaA4MEN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QgA4t/btsG3O5GabD/TdkFeh5Glt0BkdnaA4MEN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQgA4t%2FbtsG3O5GabD%2FTdkFeh5Glt0BkdnaA4MEN0%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;783&quot; height=&quot;693&quot; data-origin-width=&quot;783&quot; data-origin-height=&quot;693&quot;/&gt;&lt;/span&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;3. 이제 매핑을 해야하는데 매핑을 하려면 지금 누르는 키가 뭔지를 알아야 한다. 이때 사용하는 것이 위의 캡처의 Karabinder-EventViewer이다. 설치시 이것도 같이 설치된다. 이것을 열어서 키를 눌러보면 어떤 키가 입력되는지 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 3-1 아래를 보면 json 형태로 되어 있는 { } 가 나오는데 key_code를 보면 어떤 키가 눌러졌는지 알 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1212&quot; data-origin-height=&quot;790&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kTeWT/btsG3eX2ucR/VEqrCJnOlSLtnCVrlNDt9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kTeWT/btsG3eX2ucR/VEqrCJnOlSLtnCVrlNDt9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kTeWT/btsG3eX2ucR/VEqrCJnOlSLtnCVrlNDt9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkTeWT%2FbtsG3eX2ucR%2FVEqrCJnOlSLtnCVrlNDt9k%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;1212&quot; height=&quot;790&quot; data-origin-width=&quot;1212&quot; data-origin-height=&quot;790&quot;/&gt;&lt;/span&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;4. 이제 키를 매핑해 보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 4-1 karabinder elements를 실행하면 아래와 같은 설정화면이 나온다. 그냥 simple modification만 설정하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 4-2 simple modification &amp;gt; for all devices에서 설정하면 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 4-3 참고로 아래 나와 있는 것 처럼 체리 mx board 3.0s 를 사용하고 있다.&amp;nbsp;&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;5 한영키 설정을 해보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 5-1 EventViewer에서 키보드의 오른쪽 alt키는 right_option으로 확인된다. 이 키를 한영전환에 쓰고 싶으니 right_option 을 사용하지 않는 f13 이후에 키로 매핑한다. 여기서는 이렇게 매핑하면 alt 키 즉 right_option은 다른 키로 동작한다.&amp;nbsp; &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;1212&quot; data-origin-height=&quot;820&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ybbvI/btsG2WiX7Fy/iEVWrDBeHzdkq4tSlsLqCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ybbvI/btsG2WiX7Fy/iEVWrDBeHzdkq4tSlsLqCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ybbvI/btsG2WiX7Fy/iEVWrDBeHzdkq4tSlsLqCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FybbvI%2FbtsG2WiX7Fy%2FiEVWrDBeHzdkq4tSlsLqCk%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;1212&quot; height=&quot;820&quot; data-origin-width=&quot;1212&quot; data-origin-height=&quot;820&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 5-2 이제 이 f13을 전환키에 매핑하기 위해 System Settings &amp;gt; Keyboard 를 선택하고 Change Input Source 부분을 수정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 5-3 이 부분은 말 그대로 입력기를 변환하는 키를 매핑하는 부분이다. Keyboard Shortcuts 버튼을 눌러서 단축기 입력부분에 진입한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;827&quot; data-origin-height=&quot;737&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/S47kA/btsG3eKucSM/WP6gZYJaoyxqwdE32fvP40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/S47kA/btsG3eKucSM/WP6gZYJaoyxqwdE32fvP40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/S47kA/btsG3eKucSM/WP6gZYJaoyxqwdE32fvP40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FS47kA%2FbtsG3eKucSM%2FWP6gZYJaoyxqwdE32fvP40%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;827&quot; height=&quot;737&quot; data-origin-width=&quot;827&quot; data-origin-height=&quot;737&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 5-4 왼쪽의 여러 구분에서 입력 소스선택하는 Input Sources를 선택하고, 오른쪽에 나오는 부분을 수정한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 5-5 두개의 체크박스 중 아무것이나 사용하면 된다.&amp;nbsp; 전의 입력소스를 선택할지 다음의 입력소스를 선택할지 고르는 부분이라 하나만 선택하면 된다. 입력기를 2개 밖에 사용하지 않기 때문에 의미가 없다. 여기서는 아래 것만 체크 했고 키값부분을 더블클릭한 후 위에서 매핑한 right option 키를 누르면 자동으로 F13이 들어간다. 이러면 한글 입력 전환 부분은 끝이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;827&quot; data-origin-height=&quot;737&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdUp41/btsG3rCQKPh/vcvqrVvGw7SCzNt0yY2T4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdUp41/btsG3rCQKPh/vcvqrVvGw7SCzNt0yY2T4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdUp41/btsG3rCQKPh/vcvqrVvGw7SCzNt0yY2T4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdUp41%2FbtsG3rCQKPh%2FvcvqrVvGw7SCzNt0yY2T4k%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;827&quot; height=&quot;737&quot; data-origin-width=&quot;827&quot; data-origin-height=&quot;737&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 이제 control키와 alt를 매핑하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 6-1 아래 캡처를 보면 두번째 세번째 키매핑이 나오는데 단순히 left_command와 left_control을 바꾸었다. 이것만으로 붙여넣기 같은 것은 리눅스 환경(윈도우)과 동일하게 사용할 수 있다.&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;1212&quot; data-origin-height=&quot;820&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ybbvI/btsG2WiX7Fy/iEVWrDBeHzdkq4tSlsLqCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ybbvI/btsG2WiX7Fy/iEVWrDBeHzdkq4tSlsLqCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ybbvI/btsG2WiX7Fy/iEVWrDBeHzdkq4tSlsLqCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FybbvI%2FbtsG2WiX7Fy%2FiEVWrDBeHzdkq4tSlsLqCk%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;1212&quot; height=&quot;820&quot; data-origin-width=&quot;1212&quot; data-origin-height=&quot;820&quot;/&gt;&lt;/span&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 내가 인터넷 쇼핑을 편하게 할려고, 지마켓, 위메프, 11번가, 티몬의 판매량 기준으로 실시간 스크래핑한 페이지다. 모두 핫딜은 아니지만 판매량 기준이라 최저가를 찾아 돌아다니지 않아도 될 정도로 괜찮은 딜이 많다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아는 거라고는 쿠팡 파트너스 밖에 없어서 수익링크는 그것만 걸어 놓았는데, 그것을 제외한 나머지는 순수한 다이렉트 링크이다. 간단한 데이터 분석과 스크롤링이지만 링크 파싱이 상당히 까다로웠다. 앞으로 11마존 이나 검색기능을 추가할 건데 홍보반, 추천반으로 걸어 놓았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;a href=&quot;https://bestprice.pilseong.net/&quot;&gt;Best Price (pilseong.net)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1714474835521&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Best Price&quot; data-og-description=&quot;할인가 999,000 1,054,910 (5% off)&quot; data-og-host=&quot;bestprice.pilseong.net&quot; data-og-source-url=&quot;https://bestprice.pilseong.net/&quot; data-og-url=&quot;https://bestprice.pilseong.net/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/e722n/hyVZiP0h6C/21wHfnlY5A9RL49ganPDC1/img.jpg?width=240&amp;amp;height=480&amp;amp;face=0_0_240_480,https://scrap.kakaocdn.net/dn/c2NQ4k/hyVVJaDjC7/URjLz2tmKCiAKOnNUN3wJk/img.jpg?width=240&amp;amp;height=480&amp;amp;face=0_0_240_480,https://scrap.kakaocdn.net/dn/tkRIK/hyVZoWZaWm/RIPSXRE1rCnWgQxS8ArEWK/img.jpg?width=240&amp;amp;height=480&amp;amp;face=0_0_240_480&quot;&gt;&lt;a href=&quot;https://bestprice.pilseong.net/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bestprice.pilseong.net/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/e722n/hyVZiP0h6C/21wHfnlY5A9RL49ganPDC1/img.jpg?width=240&amp;amp;height=480&amp;amp;face=0_0_240_480,https://scrap.kakaocdn.net/dn/c2NQ4k/hyVVJaDjC7/URjLz2tmKCiAKOnNUN3wJk/img.jpg?width=240&amp;amp;height=480&amp;amp;face=0_0_240_480,https://scrap.kakaocdn.net/dn/tkRIK/hyVZoWZaWm/RIPSXRE1rCnWgQxS8ArEWK/img.jpg?width=240&amp;amp;height=480&amp;amp;face=0_0_240_480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Best Price&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;할인가 999,000 1,054,910 (5% off)&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;bestprice.pilseong.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT 관련 유용한 것들</category>
      <author>Korean Eagle</author>
      <guid isPermaLink="true">https://kogle.tistory.com/468</guid>
      <comments>https://kogle.tistory.com/468#entry468comment</comments>
      <pubDate>Tue, 30 Apr 2024 20:06:30 +0900</pubDate>
    </item>
    <item>
      <title>nginx : 도커 이미지 기본 forwarding</title>
      <link>https://kogle.tistory.com/467</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;가장 많이 사용하는 웹서버이다.&amp;nbsp;&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;현재는 웹서버 보다는 SSL 인증서를 적용해주는 프록시로 사용하는 경우가&amp;nbsp; 더 많다. 그래서 static 데이터 처리는 신경을 안써도 될 정도다.&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;우선 기본 설정 파일인 /etc/nginx/nginx.conf 을 알 필요가 있다. 이 파일에서 대부분의 nginx 설정이 들어있는데 마지막 줄을 보면&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1712227128425&quot; class=&quot;gradle&quot; style=&quot;background-color: #f6f7f8; color: #24292f; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;include /etc/nginx/conf.d/*.conf;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부분이 있는데 모든 설정 후에 conf.d 폴더의 모든 .conf 파일 설정을 추가하라는 의미다. 기본적으로 도커 nginx 이미지의 nginx.conf 는 server 설정이 빠져있다. 그래서 conf.d에 추가해 주면 된다.&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;아래 부분이 conf.d 폴더의 default.conf 파일인데 여기서 서버 설정을 하면 된다. 아래는 웹서버를 도커로 운영하면서 클라이언트 서버에 request를 바로 전달하는 프록시의 예시이다. 가장 기본적인 부분만 들어 있다. 그리고 가장 기본적인 것만 있어도 대부분 문제가 없다. 필요한 경우 설정을 찾아서 넣으면 된다.&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;아래는 두 부분으로 나누어져 있는데 위쪽은 SSL 인증서를 적용한 부분이고, 아래는 http로 들어온 요청을 https로 redirect하는 부분이다. 나의 경우는 dns 기준으로 받은 무료 SSL을 적용하였다. add_header 은 중요한 부분은 아니다. 이것이 없으면 보안이 취약하다는 경고가 나와서 해당 헤더를 추가한 부분이다.&amp;nbsp;&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;아래의 server {} 부분은 request가 들어왔을 때 어떤 설정으로 처리해야 할지 옵션인데, 기본적으로 server_name을 기준으로 분류한다. 포트를 확인하고 그 후에 서버 이름을 확인해서 매핑한다. 따라서 http로 들어온 요청은 무조건 아래 쪽으로 붙어서 위쪽으로 변환된다. 도메인 필터링 기준 엄청 관대한 편이라서 여러개의 설정이 있지 않는 이상은 그냥 비슷한 것은 다 받아 준다.&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;한가지 더 언급하고 싶은 것은 아래 if 구문인데, too many redirect 문제가 생겨서 서버가 돌아가지 않는 경우 이를 막아주는 부분이다. scheme이 http 요청인 것만 포워딩을 시키면 쓸대 없는 루프백이 발생하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1712226572711&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# confg.d/default.conf

server {
  listen 443 ssl;
  server_name bestprice.pilseong.net;
  add_header X-Content-Type-Options &quot;nosniff&quot;;
  location / {
    proxy_pass http://192.168.50.141:3000;
  }
  ssl_certificate /opt/fullchain.cer;
  ssl_certificate_key /opt/pilseong.net.key;
}

server {
  listen 80;
  server_name bestprice.pilseong.net;
  if ($scheme = &quot;http&quot;) {
    return 301 https://$host$request_uri;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아지막으로 return 구문인데, 리턴 구문은 프로그래밍 한다고 생각하고 리턴을 제대로 처리해야 한다. 위의 경우 if 구문 내에만 있는데 물론 이 경우는 의미가 없다.&amp;nbsp; 그런데 설정을 잘 이해하지 못하고 대강 작업하는 경우 아래처럼 할 수도 있는데, 그러면 아무리 301로 https로 redirect가 되어도 결국은 404가 반환 된다. 이런 것만 조심하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1712228717178&quot; class=&quot;bash&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# 항상 404를 돌려주는 예제

server {
  listen 443 ssl;
  server_name bestprice.pilseong.net;
  add_header X-Content-Type-Options &quot;nosniff&quot;;
  location / {
    proxy_pass http://192.168.50.141:3000;
  }
  ssl_certificate /opt/fullchain.cer;
  ssl_certificate_key /opt/pilseong.net.key;
}

server {
  listen 80;
  server_name bestprice.pilseong.net;
  if ($scheme = &quot;http&quot;) {
    301 https://$host$request_uri;
  }
  return 404;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>기록</category>
      <author>Korean Eagle</author>
      <guid isPermaLink="true">https://kogle.tistory.com/467</guid>
      <comments>https://kogle.tistory.com/467#entry467comment</comments>
      <pubDate>Thu, 4 Apr 2024 20:06:42 +0900</pubDate>
    </item>
    <item>
      <title>Strapi 설치 PostgreSQL 데이터 베이스 사용하기</title>
      <link>https://kogle.tistory.com/466</link>
      <description>&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;Strapi는 콘텐츠를 쉽게 관리하는 용도로 개발된 콘텐츠 관리 시스템이다. 설치시에는 기본적으로 sqlite 데이터베이스를 사용하는데 나중에 mysql이나 postgresql로 데이터베이스를 변경하면, '자동으로 이미 만들어진 데이터까지 스키마 생성을 하면서 같이 복사한다.'&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;사실 이것이 전부이다. 개발자들이 의문이 생기는 지점이 기본 sqlite에서 mysql 이나 postgresql로 어떻게 바꿀 수 있는지에 대한 것인데, '해답은 설정을 바꾸고 접속하면 알아서 데이터 복사까지 해준다' 이것이 답이다.&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;figure id=&quot;og_1712225213698&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Database | Strapi Documentation&quot; data-og-description=&quot;Strapi offers a single entry point file to configure its databases.&quot; data-og-host=&quot;docs.strapi.io&quot; data-og-source-url=&quot;https://docs.strapi.io/dev-docs/configurations/database&quot; data-og-url=&quot;https://docs.strapi.io/dev-docs/configurations/database&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.strapi.io/dev-docs/configurations/database&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.strapi.io/dev-docs/configurations/database&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Database | Strapi Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Strapi offers a single entry point file to configure its databases.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.strapi.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;strapi가 기본 설치된 상황을 가정하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 .env 파일을 찾아서 아래 내용을 작성한다. DATABASE_URL을 넣으면 하나로 끝나긴 하다. 이 변수가 optional이고 아래 변수들이&amp;nbsp;필수이다.&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;1. 아래 설정은 몇가지를 가정하고 있다. 새로운 username strapi을 추가했다는 것과 strapi라는 database 이름을 사용하고 있다는 점이다.&lt;/p&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;DATABASE_CLIENT&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;=postgres&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;DATABASE_HOST&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;=192.168.50.141&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;DATABASE_PORT&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;=5432&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;DATABASE_NAME&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;=strapi&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;DATABASE_USERNAME&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;=strapi&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;DATABASE_PASSWORD&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;=strapi&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;DATABASE_SSL&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;=false&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 아래의 내용을 등록하면 된다. 아래 캡처에서 보이듯 PSQL Tool을 사용하여 처리하면 된다.&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;580&quot; data-origin-height=&quot;511&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dyv3Am/btsGleYU9Xr/0kcKuuNyicKqnmSDucmNVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dyv3Am/btsGleYU9Xr/0kcKuuNyicKqnmSDucmNVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dyv3Am/btsGleYU9Xr/0kcKuuNyicKqnmSDucmNVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdyv3Am%2FbtsGleYU9Xr%2F0kcKuuNyicKqnmSDucmNVk%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;580&quot; height=&quot;511&quot; data-origin-width=&quot;580&quot; data-origin-height=&quot;511&quot;/&gt;&lt;/span&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;아래 세번째 줄의 strapi는 데이터베이스 이름, postgres는 admin 계정이다. admin 계정으로 strapi 데이터베이스에 접속한다는 의미&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;$ CREATE DATABASE strapi&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$ CREATE USER strapi WITH PASSWORD 'strapi';&lt;br /&gt;$ \c strapi postgres&lt;br /&gt;$ GRANT ALL ON SCHEMA public TO strapi;&lt;/p&gt;</description>
      <category>IT 관련 유용한 것들</category>
      <author>Korean Eagle</author>
      <guid isPermaLink="true">https://kogle.tistory.com/466</guid>
      <comments>https://kogle.tistory.com/466#entry466comment</comments>
      <pubDate>Thu, 4 Apr 2024 19:18:01 +0900</pubDate>
    </item>
  </channel>
</rss>