[글쓴이:] changwoo

  • 백업할 때 기억할 것 노트

    마운트할 디스크가 NTFS 파티션을 썼어요!

    sudo mount -t ntfs /dev/sdc /mnt/ext-hdd

    파일이 겁나 많아서 파일 목록을 텍스트 파일로 뽑아서 편집한 다음, 그 목록에서 읽어오고 싶어요!

    ls -1 /path/to/src > ~/list.txt
    # ~/list.txt 파일을 열어 목록을 검토한다.
    xargs -a ~/list.txt cp -v -t /path/to/dstCode language: PHP (php)

    아, 참고로 내 현재 디바이스의 전면 USB는 제대로 동작하지 않는다. USB 케이블 연결은 케이스 후면으로 해야 한다.

  • Swapfile 조정하기

    메모리를 많이 먹는 작업을 하다 보니 메모리 부족 현상이 발생한다. 이럴 때 swap 크기를 조정하여 문제를 해결해 보자.

    우선, swap 크기를 확인한다.

    $ swapon -s
    Filename				Type		Size		Used		Priority
    /swapfile                               file		2097148		0		-2

    2097148 / 1024 = 2048 해서 2GiB 정도가 할당된 것을 확인할 수 있다. 우선 swap을 내려놓자.

    sudo wapoff -a

    그리고 16GiB 정도로 사이즈를 늘려 보자.

    sudo dd if=/dev/zero of=/swapfile bs=1G count=16

    16이 16GiB 할당한다는의미로 보면 된다. 이제 swap을 위한 파일로 만든다.

    sudo mkswap /swapfile

    그리고 swap을 다시 올려놓자.

    sudo swapon /swapfile

    이제 확인해 보자.

    grep SwapTotal /proc/meminfo
    SwapTotal:      16777212 kB

    좋아!

    출처: How to increase the size of your swapfile

  • WP REST API, fetch(), 그리고 CORS 허용하기

    WP API를 불러다 사용할 때, 도메인이 다르면 CORS 제한에 걸리게 된다. 물론 서버에서 직접 부르면 이 제한은 없지만, 브라우저에서 직접 호출할 때는 성가신 문제가 생긴다.

    그래서 보통은 서버에서 직접 Access-Control-Allow-Origin 헤더를 추가하도록 하는 팁을 발견할 수 있다. 하지만 워드프레스 WP REST API 사용할 때 굳이 이렇게까지 할 필요는 없다.

    간단하다. 요청할 때 Origin 헤더를 추가하고, 거기에 브라우저에서 접속한 URL을 입력하면 된다.

    원리는 이렇다. 아래는 WP REST API 응답 메시지 출력 중, CORS 헤더를 만드는 함수 구현이다.

    function rest_send_cors_headers( $value ) {
    	$origin = get_http_origin();
    
    	if ( $origin ) {
    		// Requests from file:// and data: URLs send "Origin: null".
    		if ( 'null' !== $origin ) {
    			$origin = sanitize_url( $origin );
    		}
    		header( 'Access-Control-Allow-Origin: ' . $origin );
    		header( 'Access-Control-Allow-Methods: OPTIONS, GET, POST, PUT, PATCH, DELETE' );
    		header( 'Access-Control-Allow-Credentials: true' );
    		header( 'Vary: Origin', false );
    	} elseif ( ! headers_sent() && 'GET' === $_SERVER['REQUEST_METHOD'] && ! is_user_logged_in() ) {
    		header( 'Vary: Origin', false );
    	}
    
    	return $value;
    }Code language: PHP (php)

    코드에 get_http_origin() 함수에서 $origin 을 발견하면 알아서 Access-Control-Allow-Origin 헤더를 추가해 주는 흐름을 볼 수 있다.

    그리고 get_http_origin() 함수 구현은 아래와 같은데,

    function get_http_origin() {
    	$origin = '';
    	if ( ! empty( $_SERVER['HTTP_ORIGIN'] ) ) {
    		$origin = $_SERVER['HTTP_ORIGIN'];
    	}
    
    	/**
    	 * Change the origin of an HTTP request.
    	 *
    	 * @since 3.4.0
    	 *
    	 * @param string $origin The original origin for the request.
    	 */
    	return apply_filters( 'http_origin', $origin );
    }Code language: PHP (php)

    요청 헤더에서 Origin 헤더 값을 발견하면 그 값을 리턴하도록 되어 있다. 그러면 js/ts 코드에서 fetch()를 호출할 때 아래처럼 하면 된다.

    const url = 'https://...' // 요청할 URL.
    
    fetch(url, {
      mode: 'cors',
      headers: {
        'Content-Type': '...',
        'Origin': 'https://....', // 브라우저의 URL.
      }
    })Code language: JavaScript (javascript)

    이렇게 하면 워드프레스가 알아서 CORS 허용 헤더를 추가해준다. 끝!

  • Diodon 아이콘 중복 해결법 노트

    Diodon은 내 리눅스 데스크탑 환경에서 사용하는 클립보드 매니저이다. 클립보드의 내용을 관리할 수 있어 종종 활용되는 유용한 툴이다.

    그런데 이게 요즘 태스크바에 아이콘이 두 번 보이는 현상이 있어 고민하던 중 찾아본 것들을 여기에 노트해 둔다.

    가능성 #1: hidden=true

    이 방법은 정확하지 않다. 하지만 기록으로는 남겨둔다.

    우선 /usr/share/applications 디렉토리에 diodon.desktop 파일이 있는지 확인해 보자. [참고한 사이트]

    그리고 ~/.config/autostart 디렉토리에서 diodon-autostart.desktop 파일이 있는지도 확인해 보자.

    [Desktop Entry]
    Type=Application
    Version=1.0
    Name=Diodon
    GenericName[bg]=Мениджър на системния буфер
        ...번역...
    GenericName=Clipboard Manager
    Comment[ca]=Gestor del porta-retalls GTK+
    Comment[cs]=GTK+ Správce schránky
        ...번역...
    Comment=GTK+ Clipboard Manager
    Icon=diodon
    NotShowIn=KDE;
    Exec=diodon
    Terminal=false
    Categories=GTK;GNOME;Utility;
    StartupNotify=false
    MimeType=x-scheme-handler/clipboard;
    X-GNOME-Autostart-enabled=true
    Hidden=false

    위 내용처럼 나와 있을 것이다.

    이중 Hidden=true 가 된 부분이 있는지 확인해 보자. 아마 중복 실행되는 이유는 위와 같은 diodon 자동 실행 파일이 2개 있어서이고, 그 중 하나는 설정 > 시작 애플리케이션에서는 보이지 않게 Hidden=true 로 처리되어 있을 수 있다. 적절히 중복된 2개를 해결하면 diodon은 한 개만 실행될 것이다.

    해결법 #2: 설정 변경

    랩탑 PC에서 우연히 해결한 방법이다.

    먼저 Diodon의 PPC를 따로 설정하고 최신 버전으로 업데이트한다.

    sudo add-apt-repository ppa:diodon-team/stable
    sudo apt-get update
    sudo apt-get install -y diodon

    그다음 설정 > 시작 애플리케이션으로 가서 Diodon의 실행시간을 0초에서 5초로 변경한 다음 저장한다.

    Diodon의 시작 애플리케이션에서 시작 지연시간을 5초로 설정
    시작 지연 시간을 설정

    참가로 아이콘이 2개가 보이는 거지 프로세스가 2번 실행되는 것은 아닌 것 같다. ps ax | grep diodon 하면 프로세스의 갯수는 1개이다.

  • 메타 테이블 체계 확장하기

    그러니까, 워드프레스에서 메타 테이블 체계는 상당히 매력적이다. 물론 단점도 많긴 하다. 그러나 간단하게 확장 가능한 유연한 저장 장소가 필요할 때 메타 키 – 메타 값 식으로 테이블을 구성해서 쓰고 싶은 생각이 들 때가 한두번이 아니다.

    다행히 워드프레스 코어 또한 메타데이터 코드는 한 벌만 만들고 포스트, 텀, 유저 등에서 확장하여 재활용하고 있다. 플러그인에서도 동일하게 확장하여 메타데이터 스타일의 테이블을 사용할 수 있다. 한 번 해 보자.

    (더 보기…)
  • 테마 style.css 파일의 대안 위치가 있었군

    보통 테마는 테마의 루트에 style.css 를 둔다. 그러면 코어는 style.css 파일에서 테마의 정보를 추출한다. 이게 정석이다.

    그러나 오늘 sage라는 테마를 보다 보니, sage/resources 디렉토리에 functions.php 파일과 style.css 파일이 발견되었다. 이게 어떻게 가능한 가 싶어 뜯어 보니, wp-includes/themes.php 파일에 정의된 search_theme_directories() 함수에서 이런 동작을 지원하는 것이었다.

    1. wp-content/themes 의 디렉토리를 찾아, 해당 디렉토리에 있는 style.css 파일을 발견하면 메타데이터를 읽는다.
    2. style.css 파일이 발견되지 않는다면 해당 디렉토리의 하위 디렉토리에서 style.css를 검색한다. 파일이 빌견되면 그렇다면 테마의 루트는 해당 디렉토리가 된다.

    예를 들어 wp-content/themes/foo 라는 테마 루트 디렉토리에 bar라는 하위 디렉토리를 두고 거기에 style.css를 둔다. 그러면 wp-content/themes/foo/bar/style.css로 경로가 만들어질 것이다. 이 때 코어는 wp-content/themes/foo/bar를 테마 루트로 인식하게 된다.

    최근 테마 루트에 composer.json, package.json등 여러 설정 파일들이 존재하게 되고 이것들은 이 디렉토리를 포기할 수 없다. 그런데 이런 설정 파일과 테마의 템플릿이 서로 뒤섞이면 매우 지저분하다. 이것을 의식한 건 아닌가 모르겠다. 아무튼 이렇게 하면 템플릿 코드와 여러 설정 파일을 깔끔히 분리할 수 있어 좋은 방법이라고 생각한다.