<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title>나무러닝 &amp;gt; 블로그 &amp;gt; Coding</title>
<link>https://www.namulearning.com/programming</link>
<language>ko</language>
<description>Coding (2026-02-15 12:58:14)</description>

<item>
<title>오라클 클라우드 Autonomous AI Database에서 TLS(지갑 없는 연결, walletless) 방식으로 전환</title>
<link>https://www.namulearning.com/programming/%EC%98%A4%EB%9D%BC%ED%81%B4-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-autonomous-ai-database%EC%97%90%EC%84%9C-tls%EC%A7%80%EA%B0%91-%EC%97%86%EB%8A%94-%EC%97%B0%EA%B2%B0/</link>
<description><![CDATA[1. 오라클 클라우드 콘솔에서 왼쪽 메뉴의 Oracle AI Database → Autonomous AI Databases로 가서 데이터베이스를 선택하고 상세 페이지로 들어간다.
<p> </p>
<p>2. 상세 페이지를 아래로 스크롤 해서 오른쪽의 Network 항목에서 Mutual TLS (mTLS) authentication의 Edit 버튼을 클릭,</p>
<p>mutual TLS authentication 해제를 선택하고 저장한다.</p>
<p> </p>
<p>3. 상세 페이지 상단 버튼에서 Database connection을 클릭하면 하단의 Code examples에서 TLS authentication에서 TLS, Language / Tool에서 사용하는 언어를 선택하고 TLS 접속 예시 코드를 볼 수 있다. </p>
<p> </p>
<p>4. Network 항목의 Access control list의 Edit 버튼을 클릭, </p>
<p>IP notation type에서 여러 설정을 시도해 본다. CIDR block을 선택하고 value에 0.0.0.0/0를 넣고(모든 IP 허용) 테스트하면 성공 여부를 알 수 있다.<br />도커를 사용하는 경우 IP notation type에 IP address를 선택하고 오라클 클라우드 인스턴스의 Public IP 주소를 넣고, Add access control rule를 클릭하여 IP notation type에 Virtual cloud network를 선택하고 해당 인스턴스와 연결된 Virtual cloud network를 추가하니 DB 연결에 성공했다.</p>
<p> </p>]]></description>
<dc:creator>EnglishCode</dc:creator>
<dc:date>2026-02-15T12:58:14+09:00</dc:date>
</item>


<item>
<title>오라클 클라우드 프리티어 인스턴스 새로 만들지 않고 부트볼륨 백업과 복구하기</title>
<link>https://www.namulearning.com/programming/%EC%98%A4%EB%9D%BC%ED%81%B4-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%ED%94%84%EB%A6%AC%ED%8B%B0%EC%96%B4-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4-%EC%83%88%EB%A1%9C-%EB%A7%8C%EB%93%A4%EC%A7%80-%EC%95%8A%EA%B3%A0-%EB%B6%80%ED%8A%B8%EB%B3%BC%EB%A5%A8/</link>
<description><![CDATA[<p>오라클 클라우드를 만지다가 뭔가 꼬이면 인스턴스를 새로 만들고 싶은 생각이 들 때가 있다. 하지만 인스턴스를 새로 만들고 설정을 처음부터 다시할 엄두가 나지는 않는다. </p>
<p>그런데 오라클 클라우드의 부트 볼륨을 백업해 두었다면 인스턴스를 새로 만들지 않고 복원할 수 있는 생각보다 간단한 방법이 있다. </p>
<p> </p>
<p>1. 부트 볼륨 백업 (작업 전)</p>
<p>오라클 클라우드에 로그인 해서 왼쪽 메뉴 스토리지 &gt; 블록 스토리지 &gt; 부트 볼륨에 들어간다.</p>
<p>인스턴스에 연결된 부트 볼륨을 찾아서 왼쪽 점 세개 메뉴에서 "수동 백업 생성"에 들어간다.</p>
<p>이름을 입력하고, 백업 유형은 전체 백업을 선택하고 "부트 볼륨 백업 생성"을 누른다.</p>
<p>왼쪽 부트 볼륨 백업 메뉴에 백업된 부트 볼륨이 생성된다.</p>
<p> </p>
<p>2. 인스턴스 정지</p>
<p>인스턴스와 부트 볼륨을 분리하기 위해 먼저 인스턴스를 정지시킨다. </p>
<p>인스턴스 세부정보에 들어가서 오른쪽 위 "작업"에 "정지"가 있다. 종료가 아니라 정지다. </p>
<p>인스턴스 세부정보 위쪽 메뉴의 "스토리지"에 들어가면 연결된 부트 볼륨이 나온다.</p>
<p>연결된 부트 볼륨의 왼쪽 세 점 메뉴에서  "부트 볼륨 분리"를 선택한다.</p>
<p> </p>
<p>3. 분리한 부트 볼륨 종료</p>
<p>분리한 부트 볼륨을 클릭하고 세부정보에 들어가서 "작업"에서 종료를 선택한다.</p>
<p>부트 볼륨을 종료해도 백업본은 살아있다.</p>
<p> </p>
<p>4. 백업본 부트 볼륨 복원</p>
<p>부트 볼륨이 종료되면 세부정보 페이지 위 메뉴에서 "백업"을 선택한다.</p>
<p>백업본 부트 볼륨의 오른쪽 점 세개 메뉴에서 "부트 볼륨 복원"을 선택한다.</p>
<p>이름과 컴파트먼트, 가용성 도메인(연결할 인스턴스와 가용성 도메인이 일치해야 함)을 선택하고 "부트 볼륨 복원"을 클릭한다.</p>
<p> </p>
<p>5. Cloud Shell에서 인스턴스와 복원된 부트 볼륨 연결</p>
<p>클라우드 페이지 오른쪽 상단에 모니터 아이콘을 클릭하면 Cloud Shell이 나온다. 이것을 선택하고 나타나는 화면에 다음을 입력한다. 인스턴스와 부트 볼륨 OCID는 각각 상세정보 페이지에서 복사한다.</p>
<p><span>[code=bash] </span></p>
<p><span style="background-color:#ffffff;color:#333333;font-size:15px;">$ oci compute boot-volume-attachment attach --instance-id [정지한 인스턴스 OCID] --boot-volume-id [복원한 부트 볼륨 OCID]</span></p>
<p><span style="background-color:#ffffff;color:#333333;font-size:15px;"> [/code]</span></p>
<p><span style="background-color:#ffffff;color:#333333;font-family:'apple sd gothic neo', 'Noto Sans CJK KR', NanumGothic, 'Malgun Gothic', sans-serif;font-size:15px;"> </span><span style="background-color:#ffffff;color:#333333;font-family:'apple sd gothic neo', 'Noto Sans CJK KR', NanumGothic, 'Malgun Gothic', sans-serif;font-size:15px;"> </span></p>
<p> 정상적으로 실행되면 json 형식의 응답이 나온다. Cloud Shell 창을 닫고 종료한다.</p>
<p> 연결한 인스턴스 세부정보 페이지에 들어가서 상단의 "스토리지" 항목에 들어가면 복원된 부트 볼륨이 연결되어 있다.</p>
<p> </p>
<p>6. 정지했던 인스턴스 시작</p>
<p>클라우드 페이지 왼쪽 "인스턴스" 메뉴로 들어가서 정지된 인스턴스의 오른쪽 점 세개 메뉴에서 "시작"을 선택한다. </p>
<p>그러면 인스턴스가 복구된 상태로 시작된다.</p>
<p> </p>
<p> </p>]]></description>
<dc:creator>EnglishCode</dc:creator>
<dc:date>2025-12-07T11:10:30+09:00</dc:date>
</item>


<item>
<title>아이피타임 공유기 브리지 설정하기</title>
<link>https://www.namulearning.com/programming/%EC%95%84%EC%9D%B4%ED%94%BC%ED%83%80%EC%9E%84-%EA%B3%B5%EC%9C%A0%EA%B8%B0-%EB%B8%8C%EB%A6%AC%EC%A7%80-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0/</link>
<description><![CDATA[<p>1. 공유기에 전원을 연결한다. 공유기의 CPU 램프가 깜빡이는지 확인한다. 깜빡이지 않으면 공유기 고장.</p>
<p> </p>
<p>2. PC나 모바일 와이파이 연결 설정에서 iptime을 선택한다.</p>
<p> </p>
<p>3. 브라우저에 ip 주소192.168.0.1을 입력하고, 공유기 관리자에 로그인 한다. 초기 관리자 로그인 이름과 비밀번호는 모두 admin.</p>
<p> </p>
<p>4. "관리도구"를 선택한다.</p>
<p> </p>
<p>5. 우측 메뉴에서 "시스템 관리" - "관리자 설정"으로 들어가서 관리자 계정과 암호를 설정한다.</p>
<p> </p>
<p>5. 우측 메뉴에서 "네트워크 관리" - "내부 네트워크 설정"에 들어간다. "내부 ip주소"를 192.168.0.1 대신 192.168.0.xxx(예 192.168.0.100)으로 바꿔준다.</p>
<p> </p>
<p>6. 우측 메뉴에서 "네트워크 관리" - "DHCP 서버 설정"으로 들어간다. "게이트웨이 주소"에서 "수동입력"을 체크하고 ip 주소를 192.168.0.1(메인 공유기 ip 주소)로 변경한다. "DHCP 서버 설정" 상단의 토글 버튼을 "중단"으로 변경하고 아래 "적용"을 누른다.</p>
<p> </p>
<p>7. 공유기 관리자에 다시 접속하고, 우측 메뉴에서 "무선랜 관리" - "무선 확장 설정"에 들어간다.</p>
<p> 5GHz, 2.4GHz 둘 중에 하나만 선택해서 "중단"을 "브리지"로 변경한다. "확장하여 연결할 WiFi 검색"을 클릭하고 연결할 메인 공유기를 선택한다. 메인 공유기의 와이파이 비밀번호를 입력하고 "적용"을 누른다.</p>
<p> </p>
<p>8. 우측 메뉴에서 "무선랜 관리" - "WiFi 기본 설정"에 들어간다. 5GHz와 2.4GHz 각각 와이파이 이름과 비밀번호를 설정하고 "적용"을 누른다.</p>
<p> </p>
<p> </p>]]></description>
<dc:creator>EnglishCode</dc:creator>
<dc:date>2025-11-06T21:25:42+09:00</dc:date>
</item>


<item>
<title>아이피타임 iptime 공유기를 브리지로 사용할 때 DHCP 서버 설정</title>
<link>https://www.namulearning.com/programming/%EC%95%84%EC%9D%B4%ED%94%BC%ED%83%80%EC%9E%84-iptime-%EA%B3%B5%EC%9C%A0%EA%B8%B0%EB%A5%BC-%EB%B8%8C%EB%A6%AC%EC%A7%80%EB%A1%9C-%EC%82%AC%EC%9A%A9%ED%95%A0-%EB%95%8C-dhcp-%EC%84%9C%EB%B2%84/</link>
<description><![CDATA[<p>아이피타임 공유기를 브리지(리피터)로 사용할 경우가 있습니다.</p>
<p>이 경우 아이피타임 홈페이지 설명을 보면 서브 공유기의 DHCP 서버 사용을 중단해야 한다고 되어 있습니다.</p>
<p>그런데 그렇게 하면 공유기에 접속이 안 되는 현상이 있습니다.</p>
<p> </p>
<p>이 경우 서브 공유기 관리자에 접속해서 DHCP 서버 설정에 "게이트웨이 주소"가 서브 공유기의 ip 주소 192.168.0.xxx로 되어 있으면 메인 공유기의 ip 주소 192.168.0.1로 바꿔줍니다.</p>
<p> </p>
<p>그러면 정상적으로 접속할 수 있습니다.</p>]]></description>
<dc:creator>EnglishCode</dc:creator>
<dc:date>2025-11-03T20:21:05+09:00</dc:date>
</item>


<item>
<title>안드로이드 앱이 상태표시줄과 겹칠 때</title>
<link>https://www.namulearning.com/programming/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%95%B1%EC%9D%B4-%EC%83%81%ED%83%9C%ED%91%9C%EC%8B%9C%EC%A4%84%EA%B3%BC-%EA%B2%B9%EC%B9%A0-%EB%95%8C/</link>
<description><![CDATA[<p>Material Component를 사용할 때, Main Activity 레이아웃 xml에 다음 코드를 넣어준다.</p>
<p> </p>
<p>[code]</p>
<p>android:fitsSystemWindows="true"</p>
<p>[/code]</p>]]></description>
<dc:creator>EnglishCode</dc:creator>
<dc:date>2025-08-09T19:39:02+09:00</dc:date>
</item>


<item>
<title>그누보드 이전하기: tar로 압축해서 이전</title>
<link>https://www.namulearning.com/programming/%EA%B7%B8%EB%88%84%EB%B3%B4%EB%93%9C-%EC%9D%B4%EC%A0%84%ED%95%98%EA%B8%B0-tar%EB%A1%9C-%EC%95%95%EC%B6%95%ED%95%B4%EC%84%9C-%EC%9D%B4%EC%A0%84/</link>
<description><![CDATA[<p>웹사이트를 이전할 때 파일들을 압축하지 않고 다운로드 받고, 다시 새 서버에 올리면 시간이 많이 걸립니다.</p>
<p> </p>
<p>tar로 압축하면 빠르게 이전할 수 있습니다.</p>
<p> </p>
<h2>1. 웹사이트 파일 압축하기</h2>
<p>[code=bash]</p>
<p>tar -czvf website_backup.tar.gz /var/www/html</p>
<p>[/code]</p>
<p> </p>
<p>html 폴더가 website_backup.tar.gz라는 파일로 압축됩니다.</p>
<p>-c(압축 생성), -z(gzip 사용), -v(압축 대상 파일 화면에 출력), -f(압축 결과 파일 이름 지정)</p>
<p> </p>
<h2>2. 압축 결과 파일을 새 서버로 전송</h2>
<p>[code=bash]</p>
<p>scp website_backup.tar.gz root@100.100.100.100:/var/www/</p>
<p>[/code]</p>
<p> </p>
<p># SSH 포트가 22가 아닌 다른 포트(예: 2222를 사용)일 때,</p>
<p>[code=bash]</p>
<p>scp -P 2222 website_backup.tar.gz db_backup.tar.gz root@100.100.100.100:/root/</p>
<p>[/code]</p>
<p>scp:<span style="white-space:pre;"></span>Secure Copy Protocol (SSH를 이용한 안전한 파일 전송)</p>
<p>website_backup.tar.gz:<span style="white-space:pre;"></span>로컬에서 전송할 파일</p>
<p>root@100.100.100.100: 원격 서버의 로그인 계정 및 IP 주소</p>
<p>/var/www/: 원격 서버에서 파일을 저장할 위치 </p>
<p> </p>
<p>그러나 새 서버에서 접속이 거부되어 website_backup.tar.gz 파일을 다운로드하고, 새 서버에 업로드.</p>
<p> </p>
<h2>3. 새 서버에서 압축 해제</h2>
<p>website_backup.com.tar.gz 파일(/home/my_web/public_html/ 구조)을 /var/www/html에 압축 해제</p>
<p>[code=bash]</p>
<p>tar -xzvf website_backup.com.tar.gz -C /var/www/html --strip-components=3</p>
<p>[/code]</p>
<p>--strip-components=3:</p>
<p>tar.gz 파일이 /home/my_web/public_html/ 구조를 포함하는 경우,</p>
<p>/home/ (1번째)</p>
<p>my_web/ (2번째)</p>
<p>public_html/ (3번째)</p>
<p>이 3개 계층을 제거하고 public_html/ 내부 파일만 압축 해제.</p>
<p> </p>
<h2>4. 데이터베이스 이전하기</h2>
<p>먼저 기존 서버에서 phpMyAdmin을 사용해서 그누보드 데이터베이스를 '내보내기'합니다.</p>
<p> </p>
<h3>새 서버에서 MySQ<span style="white-space:pre;"></span>L 로그인 </h3>
<p>[code=bash]</p>
<p>sudo mysql -u root -p</p>
<p>[/code]</p>
<h3>데이터베이스 생성</h3>
<p>[code=bash]</p>
<p>CREATE DATABASE db_gnuboard DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;</p>
<p>[/code]</p>
<h3>데이터베이스 user 생성</h3>
<p>[code=bash]</p>
<p>CREATE USER 'user_db_gnuboard'@'localhost' IDENTIFIED BY '사용할 데이터베이스 암호';</p>
<p>[/code]</p>
<h3>데이터베이스 사용자 권한 부여</h3>
<p>[code=bash]</p>
<p>GRANT ALL PRIVILEGES ON user_db_gnuboard.* TO 'user_db_gnuboard'@'localhost';</p>
<p>[/code]</p>
<h3>마치고 Mysql 나가기</h3>
<p>[code=bash]</p>
<p>FLUSH PRIVILEGES;</p>
<p>EXIT;</p>
<p>[/code]</p>
<p><br /></p>
<p>새 서버의 phpMyAdmin에 위에서 생성한 사용자 user_db_gnuboard로 로그인합니다.</p>
<p>그리고 위에서 새 데이터베이스를 만듭니다.</p>
<p>그 데이터베이스를 선택하고, '불러오기'를 통해 기존 서버에서 내보내기한 데이터베이스를 업로드합니다.</p>
<p> </p>
<h2>5. 도메인 연결</h2>
<p> <a href="https://www.namulearning.com/programming/%EC%9A%B0%EB%B6%84%ED%88%AC-24041-lts%EC%97%90%EC%84%9C-apache2%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC-%EC%83%88-%EB%8F%84%EB%A9%94%EC%9D%B8%EC%9D%84-%EC%84%A4%EC%A0%95%ED%95%98%EB%8A%94/" target="_blank" title="우분투 24041 lts에서 apache2를 사용하여 새 도메인을 설정하는 방법" rel="nofollow noreferrer noopener">https://www.namulearning.com/programming/우분투-24041-lts에서-apache2를-사용하여-새-도메인을-설정하는/</a></p>
<p> </p>
<h2>6. 그누보드 이전하고 게시판에 새글이 보이지 않을 때</h2>
<p>소유자 변경: 그누보드가 /var/www/html에 설치된 경우(user가 www-data 그룹에 속해 있는 경우)</p>
<p>[code=bash]</p>
<p>sudo chown -R www-data:www-data /var/www/html</p>
<p>[/code]</p>
<p><br /></p>
<p>data 폴더 dbconfig.php에서 다음을 false에서 true로 수정</p>
<p>[code=bash]</p>
<p>define('G5_MYSQL_SET_MODE', true);</p>
<p>[/code]</p>
<p> </p>
<p>어떤 문제가 발생할 때, 폴더 권한 설정</p>
<p>[code=bash]</p>
<p>sudo find /var/www/example.com -type d -exec chmod 775 {} \;</p>
<p>sudo find /var/www/example.com -type f -exec chmod 644 {} \;</p>
<p>sudo chmod -R 757 /var/www/example.com/data</p>
<p>sudo chmod -R 757 /var/www/example.com/theme</p>
<p>[/code]</p>
<p><br /></p>
<p> </p>
<p> </p>]]></description>
<dc:creator>EnglishCode</dc:creator>
<dc:date>2025-04-01T00:29:24+09:00</dc:date>
</item>


<item>
<title>리눅스(Linux), 우분투에서 폴더에 대한 권한</title>
<link>https://www.namulearning.com/programming/%EB%A6%AC%EB%88%85%EC%8A%A4linux-%EC%9A%B0%EB%B6%84%ED%88%AC%EC%97%90%EC%84%9C-%ED%8F%B4%EB%8D%94%EC%97%90-%EB%8C%80%ED%95%9C-%EA%B6%8C%ED%95%9C/</link>
<description><![CDATA[<p>리눅스에서 파일에 대한 읽기(r), 쓰기(w), 실행(x) 권한은 따로 설명이 없어도 이해가 되는데, <br />폴더에 대한 권한은 직관적으로 이해가 안 됩니다.</p>
<p> </p>
<p>워드프레스의 경우 폴더는 755(775), 파일은 664, <br />그누보드의 경우는 data 폴더는 707(또는 757, 777), 파일은 644라고 합니다.</p>
<p> </p>
<p>가만 보면 폴더에 더 많은 권한이 주어집니다. 특히 실행(x) 권한이 추가됩니다.</p>
<p> </p>
<p>폴더에 대해서 읽기(r) 권한은 폴더 내의 파일들의 목록을 읽는 것을 의미합니다. <br />즉, ls 명령을 할 수 있는 권한입니다.</p>
<p> </p>
<p>폴더에 대한 쓰기(w) 권한은 폴더 내의 파일에 대한 이동, 삭제, 생성, 복사를 할 수 있는 권한입니다.</p>
<p> </p>
<p>폴더에 대한 실행(x) 권한은 폴더 내로 들어가거나(cd) 하위 폴더로 이동, <br />폴더 내의 파일들의 속성 정보를 보는(ls -l) 권한을 의미합니다.</p>
<p> </p>
<p>그래서 폴더에 대해서는 보통 실행 권한이 포함된 755 권한을 사용합니다.</p>
<p> </p>
<p>하위 모든 폴더에 757 권한 설정하기</p>
<p>[code=bash]</p>
<p>find /var/www/gnuboard/data -type d -exec chmod 757 {} \\;</p>
<p>[/code]</p>
<p> </p>
<p>하위 모든 파일에 644 권한 설정하기</p>
<p>[code=bash]</p>
<p>find /var/www/gnuboard/data -type f -exec chmod 644 {} \\;</p>
<p>[/code]</p>]]></description>
<dc:creator>EnglishCode</dc:creator>
<dc:date>2025-03-31T04:09:52+09:00</dc:date>
</item>


<item>
<title>워드프레스(Wordpress) 데이터베이스 생성하기</title>
<link>https://www.namulearning.com/programming/%EC%9B%8C%EB%93%9C%ED%94%84%EB%A0%88%EC%8A%A4wordpress-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EC%83%9D%EC%84%B1%ED%95%98%EA%B8%B0/</link>
<description><![CDATA[<h3> MySQL에 로그인</h3>
<p>[code=bash]</p>
<p>sudo mysql -u root -p</p>
<p>[/code]</p>
<p> </p>
<h3> WordPress 데이터베이스 및 사용자 생성</h3>
<p>[code=bash]</p>
<p>CREATE DATABASE wordpress_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;</p>
<p>CREATE USER 'wp_user'@'localhost' IDENTIFIED BY 'your_secure_password';</p>
<p>GRANT ALL PRIVILEGES ON wordpress_db.* TO 'wp_user'@'localhost';</p>
<p>FLUSH PRIVILEGES;</p>
<p>EXIT;</p>
<p>[/code]</p>
<p> </p>
<h3> MySQL에 다시 로그인하고, 데이터베이스 확인</h3>
<p>[code=bash]</p>
<p>SHOW DATABASES;</p>
<p>[/code]</p>
<p> </p>
<h3>데이터베이스 사용자 확인</h3>
<p>[code=bash]</p>
<p>SELECT user, host FROM mysql.user;</p>
<p>[/code] </p>
<p> </p>]]></description>
<dc:creator>EnglishCode</dc:creator>
<dc:date>2025-03-31T00:32:48+09:00</dc:date>
</item>


<item>
<title>php 버전 확인, 변경, 삭제하기</title>
<link>https://www.namulearning.com/programming/php-%EB%B2%84%EC%A0%84-%ED%99%95%EC%9D%B8-%EB%B3%80%EA%B2%BD-%EC%82%AD%EC%A0%9C%ED%95%98%EA%B8%B0/</link>
<description><![CDATA[<h2>1. 우분투에서 php.ini 위치 찾기</h2>
<p>[code=bash]</p>
<p>cd /etc/ &amp;&amp; find . -name php.ini</p>
<p>[/code]</p>
<p> </p>
<p>다음과 같이 두 개 버전의 php가 설치되어 있는 경우 </p>
<p>[code=bash]</p>
<p>./php/8.1/apache2/php.ini</p>
<p>./php/8.1/cli/php.ini</p>
<p>./php/8.3/apache2/php.ini</p>
<p>./php/8.3/cli/php.ini</p>
<p>[/code]</p>
<p> </p>
<h2> 2. 현재 사용 중인 PHP 버전 확인</h2>
<p>[code=bash]</p>
<p>php -v</p>
<p>[/code]</p>
<p> </p>
<p>출력 결과</p>
<p>[code=bash]</p>
<p>PHP 8.3.6 (cli) (built: Dec  2 2024 12:36:18) (NTS)</p>
<p>[/code]</p>
<p> </p>
<p>만약 PHP 8.1.x가 표시된다면, 먼저 기본 버전을 변경</p>
<p>아래 명령을 실행한 후 PHP 8.3을 선택한다.</p>
<p>[code=bash]</p>
<p>sudo update-alternatives --config php</p>
<p>[/code]</p>
<p> </p>
<h2>3. Apache가 사용하는 PHP 버전 확인</h2>
<p>Apache는 CLI에서 사용하는 PHP 버전과 다를 수 있다.</p>
<p>현재 Apache에서 활성화된 PHP 버전을 확인.</p>
<p>[code=bash]</p>
<p>sudo a2query -m | grep php</p>
<p>[/code]</p>
<p> </p>
<p>Apache의 PHP 버전을 8.3으로 변경하는 경우,</p>
<p>[code=bash]</p>
<p>sudo a2dismod php8.1</p>
<p>sudo a2enmod php8.3</p>
<p>sudo systemctl restart apache2</p>
<p>[/code]</p>
<p> </p>
<h2>4. PHP 8.1 제거</h2>
<p>[code=bash]</p>
<p>sudo apt remove --purge php8.1 php8.1-cli php8.1-common php8.1-mysql php8.1-fpm php8.1-curl php8.1-xml php8.1-mbstring -y</p>
<p>sudo apt autoremove -y</p>
<p>[/code]</p>
<p> </p>
<p>다음과 같이 php8.1 패키지를 찾을 수 없다고 나올 경우,</p>
<p>[code=bash]</p>
<p>E: Unable to locate package php8.1</p>
<p>E: Couldn't find any package by glob 'php8.1'</p>
<p>E: Unable to locate package php8.1-fpm</p>
<p>E: Couldn't find any package by glob 'php8.1-fpm'</p>
<p>E: Unable to locate package php8.1-xml</p>
<p>E: Couldn't find any package by glob 'php8.1-xml'</p>
<p>E: Unable to locate package php8.1-mbstring</p>
<p>E: Couldn't find any package by glob 'php8.1-mbstring'</p>
<p>[/code]</p>
<p> </p>
<p>설치된 PHP 패키지 목록을 확인 </p>
<p>[code=bash]</p>
<p>dpkg --list | grep php</p>
<p>[/code] </p>
<p> </p>
<p>PHP 8.1 패키지가 남아 있다면 강제 제거</p>
<p>[code=bash]</p>
<p>sudo apt remove --purge php8.1* -y</p>
<p>sudo apt autoremove -y</p>
<p>[/code]</p>
<p> </p>
<p>패키지 목록 업데이트 후 재확인</p>
<p>[code=bash]</p>
<p>sudo apt update</p>
<p>sudo apt upgrade -y</p>
<p>[/code]</p>
<h2>5. PHP 제거 후 확인</h2>
<p>[code=bash]</p>
<p>php -v</p>
<p>sudo a2query -m | grep php</p>
<p>dpkg --list | grep php</p>
<p>[/code]</p>]]></description>
<dc:creator>EnglishCode</dc:creator>
<dc:date>2025-03-30T22:09:05+09:00</dc:date>
</item>


<item>
<title>서브 도메인 만들기: Ubuntu 24.04.1 LTS, Apache/2.4.58 (Ubuntu) 환경에서</title>
<link>https://www.namulearning.com/programming/%EC%84%9C%EB%B8%8C-%EB%8F%84%EB%A9%94%EC%9D%B8-%EB%A7%8C%EB%93%A4%EA%B8%B0-ubuntu-24041-lts-apache2458-ubuntu/</link>
<description><![CDATA[<p> 서브 도메인 5분만에 만들기</p>
<p> </p>
<p>이렇게 간단한 걸 호스팅 업체에서는 기본으로 해주질 않네요.</p>
<p> </p>
<h2>1. 서브 도메인 DNS 설정</h2>
<p>먼저, 사용 중인 도메인의 DNS에서 서브 도메인을 설정합니다.</p>
<p>도메인 호스팅 제공업체의 DNS 설정 페이지에서 다음과 같이 A 레코드 또는 CNAME 레코드를 추가합니다.</p>
<p><br /></p>
<p>www.example.com의 서브 도메인 sub.example.com을 만드는 경우</p>
<p>네임칩에서</p>
<p> </p>
<blockquote style="border:1px solid rgb(222,223,223);background-color:#f7f7f7;padding:5px 10px;">
   <p>Type: A Record</p>
   <p>Host: sub</p>
   <p>Value: 서버 IP 주소</p>
   <p><br /></p>
   <p>또는</p>
   <p>Type: CNAME Record</p>
   <p>Host: sub</p>
   <p>Value: example.com</p>
   </blockquote>
<p> </p>
<p> </p>
<h2>2. Apache 가상 호스트(Virtual Host) 설정</h2>
<p>서브 도메인에 대한 가상 호스트를 설정합니다.</p>
<p> </p>
<h3>설정 파일 생성</h3>
<p>새로운 가상 호스트 파일을 /etc/apache2/sites-available/ 디렉토리에 생성합니다.</p>
<p>[code=bash]</p>
<p>sudo nano /etc/apache2/sites-available/sub.example.com.conf</p>
<p>[/code]</p>
<p> </p>
<h3>가상 호스트 설정 추가</h3>
<p>[code=bash]</p>
<p>&lt;VirtualHost *:80&gt;</p>
<p>    ServerName sub.example.com</p>
<p>    DocumentRoot /var/www/sub.example.com</p>
<p><br /></p>
<p>    &lt;Directory /var/www/sub.example.com&gt;</p>
<p>        AllowOverride All</p>
<p>        Require all granted</p>
<p>    &lt;/Directory&gt;</p>
<p><br /></p>
<p>    ErrorLog ${APACHE_LOG_DIR}/sub.example.com_error.log</p>
<p>    CustomLog ${APACHE_LOG_DIR}/sub.example.com_access.log combined</p>
<p>&lt;/VirtualHost&gt;</p>
<p>[/code]</p>
<p> </p>
<h3>문서 루트 디렉토리 생성 및 권한 설정</h3>
<p>[code=bash]</p>
<p>sudo mkdir -p /var/www/sub.example.com</p>
<p>sudo chown -R www-data:www-data /var/www/sub.example.com</p>
<p>sudo chmod -R 755 /var/www/sub.example.com</p>
<p>[/code]</p>
<p> </p>
<h3>테스트용 인덱스 파일 생성</h3>
<p>[code=bash]</p>
<p>echo "&lt;h1&gt;Welcome to sub.example.com&lt;/h1&gt;" | sudo tee /var/www/sub.example.com/index.html</p>
<p>[/code]</p>
<p> </p>
<p> </p>
<h2>3. 설정 활성화 및 Apache 재시작</h2>
<h3>가상 호스트 활성화 </h3>
<p>[code=bash]</p>
<p>sudo a2ensite sub.example.com.conf</p>
<p>[/code]</p>
<p> </p>
<h3>Apache 설정 확인</h3>
<p>만약 Syntax OK가 표시되지 않으면 오류 메시지를 확인합니다.</p>
<p>[code=bash]</p>
<p>sudo apachectl configtest</p>
<p>[/code] </p>
<p>  </p>
<h3>Apache 재시작</h3>
<p>[code=bash]</p>
<p></p>
<p>sudo systemctl restart apache2</p>
<p>[/code]</p>
<p> </p>
<h2>4. Let's Encrypt SSL 인증서 추가 (HTTPS 설정)</h2>
<p>[code=bash]</p>
<p>sudo certbot --apache -d sub.example.com</p>
<p>[/code]</p>
<p> </p>
<p>이제 웹 브라우저에서 http://sub.example.com을 열어 정상적으로 접속되는지 확인합니다.</p>
<p> </p>]]></description>
<dc:creator>EnglishCode</dc:creator>
<dc:date>2025-03-30T05:21:23+09:00</dc:date>
</item>


<item>
<title>구글 클라우드 콘솔에서 구글 드라이브 API를 활성화하고 OAuth 2.0 클라이언트 ID를 생성하는 방법</title>
<link>https://www.namulearning.com/programming/%EA%B5%AC%EA%B8%80-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EC%BD%98%EC%86%94%EC%97%90%EC%84%9C-%EA%B5%AC%EA%B8%80-%EB%93%9C%EB%9D%BC%EC%9D%B4%EB%B8%8C-api%EB%A5%BC-%ED%99%9C%EC%84%B1%ED%99%94%ED%95%98%EA%B3%A0-oauth/</link>
<description><![CDATA[<p>구글 클라우드 콘솔(Google Cloud Console)에서 구글 드라이브 API(Google Drive API)를 활성화하고 OAuth 2.0 클라이언트 ID를 생성하는 방법</p>
<p><br /></p>
<h2>1. Google Cloud Console에 접속</h2>
<p><br /></p>
<p>Google Cloud Console(구글 클라우드 콘솔) 링크로 이동합니다.</p>
<p><br /></p>
<p>Google 계정으로 로그인합니다.</p>
<p><br /></p>
<h2>2. 새로운 프로젝트 생성 (또는 기존 프로젝트 선택)</h2>
<p><br /></p>
<p>좌측 상단 메뉴(햄버거 아이콘) → "IAM 및 관리자" → "프로젝트 만들기" 클릭</p>
<p><br /></p>
<p>프로젝트 이름을 입력 (예: Drive API Project)</p>
<p><br /></p>
<p>"만들기" 버튼 클릭</p>
<p><br /></p>
<p>상단 프로젝트 선택 창에서 방금 만든 프로젝트를 선택</p>
<p><br /></p>
<h2>3. Google Drive API 활성화</h2>
<p><br /></p>
<p>좌측 메뉴에서 "API 및 서비스" → "라이브러리" 클릭</p>
<p><br /></p>
<p>검색창에 "Google Drive API" 입력하고 검색</p>
<p><br /></p>
<p>"Google Drive API" 선택 후 "사용 설정" 버튼 클릭</p>
<p><br /></p>
<p>API 사용이 활성화됨</p>
<p><br /></p>
<h2>4. OAuth 2.0 동의 화면 설정</h2>
<p><br /></p>
<p>좌측 메뉴에서 "API 및 서비스" → "사용자 인증 정보" 클릭</p>
<p><br /></p>
<p>"사용자 인증 정보 만들기" 버튼 클릭 → "OAuth 동의 화면" 선택</p>
<p><br /></p>
<p>앱 정보 입력</p>
<p><br /></p>
<p>사용자 유형: "외부" 선택 (외부 앱을 사용할 경우)</p>
<p><br /></p>
<p>앱 이름: 원하는 이름 입력 (예: My Drive App)</p>
<p><br /></p>
<p>사용자 지원 이메일: 본인 이메일 선택</p>
<p><br /></p>
<p>"데이터 액세스" → "범위 추가 및 삭제" 클릭</p>
<p><br /></p>
<p>+ "범위 추가" 클릭</p>
<p><br /></p>
<p>"Google Drive API" 관련 범위 선택 (예: https://www.googleapis.com/auth/drive)</p>
<p><br /></p>
<p>"업데이트" 클릭</p>
<p><br /></p>
<p>"저장 후 계속" 버튼 클릭</p>
<p> </p>
<p>"대상" 클릭  → "게시 상태": "앱 게시" 클릭</p>
<p> </p>
<h2>5. OAuth 2.0 클라이언트 ID 생성</h2>
<p><br /></p>
<p>좌측 메뉴에서 "API 및 서비스" → "사용자 인증 정보" 클릭</p>
<p><br /></p>
<p>"사용자 인증 정보 만들기" → "OAuth 클라이언트 ID" 선택</p>
<p><br /></p>
<p>앱 유형 선택</p>
<p><br /></p>
<p>웹 애플리케이션 선택 (Colab, Jupyter, Python 스크립트 등에서 사용 시)</p>
<p><br /></p>
<p>OAuth 클라이언트 ID 정보 입력</p>
<p><br /></p>
<p>이름: 원하는 이름 입력 (예: Drive API Client)</p>
<p><br /></p>
<p>승인된 리디렉션 URI 추가 (예: http://localhost:8080/)</p>
<p><br /></p>
<p>"만들기" 버튼 클릭</p>
<p><br /></p>
<h2>6. OAuth 2.0 클라이언트 ID 및 비밀번호 다운로드</h2>
<p><br /></p>
<p>생성된 클라이언트 ID가 화면에 표시됨</p>
<p><br /></p>
<p>"JSON 다운로드" 버튼 클릭 (클라이언트 ID 및 비밀번호 포함된 client_secret.json 파일 저장)</p>
<p> </p>
<p> </p>]]></description>
<dc:creator>EnglishCode</dc:creator>
<dc:date>2025-03-16T22:20:43+09:00</dc:date>
</item>


<item>
<title>정규 표현식 백트래킹(backtracking)</title>
<link>https://www.namulearning.com/programming/%EC%A0%95%EA%B7%9C-%ED%91%9C%ED%98%84%EC%8B%9D-%EB%B0%B1%ED%8A%B8%EB%9E%98%ED%82%B9backtracking/</link>
<description><![CDATA[<h2>백트래킹(backtracking)이란</h2>
<p>정규 표현식이 매칭될 가능성이 있는 모든 조합을 시도하면서, <span style="background-color:#ffff00;">실패하면 이전 단계로 돌아가 다른 조합을 시도</span>하는 방식.</p>
<p> </p>
<p>백트래킹에 대해서 나오는 표현 </p>
<p></p>
<blockquote style="border:1px solid rgb(222,223,223);background-color:#f7f7f7;padding:5px 10px;">back out (of something)<br />(하기로 했던 일에서) 빠지다</blockquote>
<p>여기서 back은 동사로 "뒤로 물러서다; 뒤로 가게 하다"라는 뜻으로 사용됩니다.</p>
<p>back 대신 backtrack이 사용되기도 합니다.</p>
<p> </p>
<p></p>
<blockquote style="border:1px solid rgb(222,223,223);background-color:#f7f7f7;padding:5px 10px;">
   <p>The subpattern is never <span style="background-color:#ffff00;">backed out of</span> once matched. <br />(서브패턴은 한 번 매칭된 것으로부터 다시 되돌아갈 수 없다) </p>
   <p><span style="background-color:#ffff00;">backtrack out of</span> each one. <br />(각 경우에서 백트래킹을 하다)</p>
   </blockquote>
<p></p>
<p> </p>
<p>정규 표현식은 매칭될 가능성이 있는 모든 조합을 시도하지만, <br />PHP에서 (?&gt;subpattern)을 사용하면 <span style="background-color:#ffff00;">한 번 매칭된 부분을 변경해서 다시 시도하지 않습니다</span>.<br />즉, 한 번 (?&gt;...) 내부에서 매칭되면 확정되고, 실패하면 전체 정규식이 실패합니다.</p>
<p> </p>
<p> </p>]]></description>
<dc:creator>EnglishCode</dc:creator>
<dc:date>2025-03-14T21:06:40+09:00</dc:date>
</item>


<item>
<title>나리야 테마 설정 시 "/theme 디렉토리의 퍼미션을 755 또는 777 또는 707로 변경 후 다시 시도해 주세요"라고 뜰 때</title>
<link>https://www.namulearning.com/programming/%EB%82%98%EB%A6%AC%EC%95%BC-%ED%85%8C%EB%A7%88-%EC%84%A4%EC%A0%95-%EC%8B%9C-theme-%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC%EC%9D%98-%ED%8D%BC%EB%AF%B8%EC%85%98%EC%9D%84-755/</link>
<description><![CDATA[<p>설정 변경 후 저장하면 </p>
<p>site_update 페이지에서 500 에러가 발생할 수도 있다.</p>
<p> </p>
<p>SSH 터미널에서 다음과 같이 theme 폴더의 퍼미션을 변경해야 한다.</p>
<p> </p>
<p>[code=bash]</p>
<p>sudo chmod -R 757 /var/www/example.com/theme</p>
<p>[/code]</p>
<p><br /></p>
<p> </p>]]></description>
<dc:creator>EnglishCode</dc:creator>
<dc:date>2025-03-11T07:04:01+09:00</dc:date>
</item>


<item>
<title>data 폴더에 쓰기 권한이 없거나 또는 웹하드 용량이 없는 경우 로그인을 못 할 수도 있으니, 용량 체크 및 쓰기 권한을 확인해 주세요.</title>
<link>https://www.namulearning.com/programming/data-%ED%8F%B4%EB%8D%94%EC%97%90-%EC%93%B0%EA%B8%B0-%EA%B6%8C%ED%95%9C%EC%9D%B4-%EC%97%86%EA%B1%B0%EB%82%98-%EB%98%90%EB%8A%94-%EC%9B%B9%ED%95%98%EB%93%9C-%EC%9A%A9%EB%9F%89%EC%9D%B4/</link>
<description><![CDATA[<p> 그누보드를 다른 서버로 이전하고 /data 폴더의 권한을 0707로 해주어야 한다고 한다.</p>
<p> </p>
<p>그런데 로그인을 하면,</p>
<p> </p>
<p> </p>
<blockquote style="border:1px solid rgb(222,223,223);background-color:#f7f7f7;padding:5px 10px;">"data 폴더에 쓰기 권한이 없거나 또는 웹하드 용량이 없는 경우 로그인을 못 할수도 있으니, 용량 체크 및 쓰기 권한을 확인해 주세요."</blockquote>
<p><br /></p>
<p>라는 메시지가 뜰 수 있다. 이런 경우,</p>
<p> </p>
<p>/data/session 또는 /data/tmp 폴더의 권한을 0707로 바꿔주어야 한다고 한다.</p>
<p> </p>
<p>나의 경우에는  /data/tmp 폴더의 권한을 0707로 바꿔주니 해결되었다.</p>]]></description>
<dc:creator>EnglishCode</dc:creator>
<dc:date>2025-03-10T05:53:16+09:00</dc:date>
</item>


<item>
<title>우분투 24.04.1 LTS에서 Apache2를 사용하여 새 도메인을 설정하는 방법</title>
<link>https://www.namulearning.com/programming/%EC%9A%B0%EB%B6%84%ED%88%AC-24041-lts%EC%97%90%EC%84%9C-apache2%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC-%EC%83%88-%EB%8F%84%EB%A9%94%EC%9D%B8%EC%9D%84-%EC%84%A4%EC%A0%95%ED%95%98%EB%8A%94/</link>
<description><![CDATA[<p>오라클 클라우드 프리티어에 워드프레스 웹사이트를 하나 설치해서 운영 중입니다.<br />우분투에 아파치를 설치한 서버에서<br />도메인을 더 연결한 과정을 설명합니다. </p>
<p> </p>
<p>네임칩에서 구매한 도메인을 연결해서 쓰고 있습니다.<br />오라클 클라우드에서 DNS를 설정했더니 소액이 과금되는 것을 보고,<br />네임칩에서 DNS를 설정해서 쓰고 있습니다.</p>
<p>  </p>
<h2>DNS 설정</h2>
<p> 새로 추가할 도메인의 DNS 설정을 다음과 같이 바꿉니다.</p>
<p> </p>
<p> </p>
<blockquote style="border:1px solid rgb(222,223,223);background-color:#f7f7f7;padding:5px 10px;">
   <p>네임칩 Domain List에서<br />Domain 탭, NAMESERVERS 항목:<br /><span style="background-color:#ffff00;">Namecheap BasicDNS</span></p>
   <p> </p>
   <p>Advanced DNS 탭, Host Records 항목에 다음을 추가:<br /><span style="background-color:#ffff00;">Type: A Record</span></p>
   <p>Host: @</p>
   <p>Value: 서버 ip 주소</p>
   <p>TTL: Automatic</p>
   <p> </p>
   <p><span style="background-color:#ffff00;">Type: CNAME Record</span></p>
   <p>Host: www</p>
   <p>Value: 도메인 이름(example.com)</p>
   <p>TTL: Automatic</p>
   </blockquote>
<p>  </p>
<p>  </p>
<h2>Apache 가상 호스트(Virtual Host) 설정</h2>
<h3> 1. 새 사이트 설정 파일 생성</h3>
<p>Apache의 가상 호스트 설정 파일을 생성합니다.</p>
<p> </p>
<p>[code=bash]</p>
<p> sudo nano /etc/apache2/sites-available/<span style="background-color:#ffff00;">example.com</span>.conf</p>
<p>[/code]</p>
<p> </p>
<p>그리고 example.com.conf 파일에 아래와 같이 기본 설정을 추가합니다.</p>
<p> </p>
<p>[code=bash]</p>
<p>&lt;VirtualHost *:80&gt;</p>
<p>    ServerName <span style="background-color:#ffff00;">example.com<span style="background-color:#ffffff;">  #주 도메인 이름  </span></span></p>
<p>    ServerAlias <span style="background-color:#ffff00;">www.example.com<span style="background-color:#ffffff;">  #</span></span><span style="background-color:#ffffff;">서브도메인(예: www 포함)</span></p>
<p>    DocumentRoot <span style="background-color:#ffff00;">/var/www/example.com<span style="background-color:#ffffff;">  #</span></span><span style="background-color:#ffffff;">웹사이트</span>의 파일이 위치할 디렉터리</p>
<p> </p>
<p>    &lt;Directory <span style="background-color:#ffff00;">/var/www/example.com</span>&gt;</p>
<p>        AllowOverride All</p>
<p>        Require all granted</p>
<p>    &lt;/Directory&gt;</p>
<p><br /></p>
<p>    ErrorLog ${APACHE_LOG_DIR}/error.log</p>
<p>    CustomLog ${APACHE_LOG_DIR}/access.log combined</p>
<p>&lt;/VirtualHost&gt;</p>
<p>[/code]</p>
<p> </p>
<h3> 2. 웹사이트 파일 디렉터리 생성 </h3>
<p> [code=bash]</p>
<p>sudo mkdir -p /var/www/example.com</p>
<p>sudo chown -R www-data:www-data /var/www/example.com</p>
<p>sudo chmod -R 755 /var/www/example.com</p>
<p>[/code]</p>
<p> </p>
<p>example.com 디렉토리에 간단한 index.html 파일을 추가합니다.</p>
<p> </p>
<p>[code=bash]</p>
<p> echo "&lt;h1&gt;Welcome to example.com&lt;/h1&gt;" | sudo tee /var/www/example.com/index.html </p>
<p>[/code]</p>
<p> </p>
<h3>3. 설정 활성화 및 Apache 재시작</h3>
<p>[code=bash]</p>
<p>sudo a2ensite example.com.conf</p>
<p>sudo systemctl restart apache2</p>
<p>[/code]</p>
<p> </p>
<h3>4. Let’s Encrypt SSL 인증서 발급 </h3>
<p>Certbot을 사용하여 새 도메인에 대해 무료 SSL 인증서를 설치하여 HTTPS를 활성화할 수 있습니다.</p>
<p> </p>
<p>[code=bash]</p>
<p> </p>
<p> </p>
<p>sudo certbot --apache -d example.com -d www.example.com</p>
<p>[/code]</p>
<p> </p>
<p>인증서가 자동 갱신되도록 다음 명령어를 실행합니다.</p>
<p>[code=bash]</p>
<p> sudo certbot renew --dry-run</p>
<p>[/code]</p>
<p> </p>
<h3>5. 확인</h3>
<p>이제 http://example.com 또는 https://example.com에서 사이트가 정상적으로 동작하는지 확인합니다.</p>
<p> </p>
<p> </p>]]></description>
<dc:creator>EnglishCode</dc:creator>
<dc:date>2025-03-06T18:37:49+09:00</dc:date>
</item>

</channel>
</rss>
