Create TOC

2020년 11월 29일

KDE/일출, 일몰에 따라 자동으로 테마 변경하기

KDE에는 일출, 일몰에 따라 자동으로 테마를 변경하는 설정이 없어서 따로 스크립트를 만들어서 변경한다.

일몰, 일출 시간을 얻기 위해서 python3-astral 패키지를 설치한다.

$ sudo apt install python3-astral

아래 python 스크립트를 ~/.local/bin/lookandfeel_change.py 으로 저장한다.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# vim:set expandtab fenc=utf-8 ff=unix:

import os
import logging
import datetime
import subprocess
import argparse
from astral import Astral  # type:ignore


logging.basicConfig(format='[%(asctime)s]{%(name)s}(%(levelname)s) %(message)s', level=logging.INFO)
logger = logging.getLogger(os.path.basename(__file__))
KST = datetime.timezone(datetime.timedelta(hours=9))

DARK_THEME = 'org.kde.breezedark.desktop'
LIGHT_THEME = 'org.kde.breeze.desktop'


def kreadconfig(group: str, key: str) -> str:
    p = subprocess.run(['/usr/bin/kreadconfig5', '--group', group, '--key', key],
                       capture_output=True)
    return p.stdout.decode('utf-8').strip()


def kwriteconfig(group: str, key: str, value: str):
    p = subprocess.run(['/usr/bin/kwriteconfig5', '--group', group, '--key', key, value],
                       capture_output=True)
    logger.debug(p.stdout.decode('utf-8').strip())
    logger.debug(p.stderr.decode('utf-8').strip())


def apply_theme(theme: str):
    p = subprocess.run(['/usr/bin/lookandfeeltool', '-a', theme], capture_output=True)
    logger.debug(p.stdout.decode('utf-8').strip())
    logger.debug(p.stderr.decode('utf-8').strip())
    kwriteconfig('KDE', 'LookAndFeelPackage', theme)


def main():
    ast = Astral()
    city = ast['Seoul']
    now = datetime.datetime.now(tz=KST)
    today = city.sun(date=now, local=True)
    logger.debug(f'{today["sunrise"]} <= {now} < {today["sunset"]}')

    new_theme = DARK_THEME
    if (today['sunrise'] <= now < today['sunset']):
        new_theme = LIGHT_THEME

    cur_theme = kreadconfig('KDE', 'LookAndFeelPackage')

    if cur_theme != new_theme:
        apply_theme(new_theme)
        logger.debug(f'apply {new_theme}')
    else:
        logger.debug(f'already applied {cur_theme}')


if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='일출/일몰시간을 기준으로 Plasma 테마를 변경')

    parser.add_argument('--debug', '-d', action='store_true')

    options = parser.parse_args()

    if options.debug:
        logger.setLevel(logging.DEBUG)

    main()

저장 후 실행 속성을 준다.

$ chmod +x ~/.local/bin/lookandfeel_change.py

이대로 cron에 등록하면 제대로 동작하지 않는다. cron으로 실행하는 경우 login 했을 때와 환경 변수 구성이 다르기 때문이다. 아래 script를 ~/.local/bin/lookandfeel_change.sh으로 저장한다.

#!/bin/bash

export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/계정id/bus
export DESKTOP_SESSION=plasma
export DISPLAY=:0
export PATH=/home/계정명/.local/bin:/usr/local/bin/:/usr/local/bin:/usr/bin:/bin:/usr/games
export SHELL=/bin/bash
export XDG_CURRENT_DESKTOP=KDE
export XDG_RUNTIME_DIR=/run/user/계정id
export XDG_DATA_DIRS=/var/lib/flatpak/exports/share:/usr/local/share:/usr/share

/home/계정명/.local/bin/lookandfeel_change.py

계정id는 id 명령으로 확인할 수 있다. Debian 계열인 경우 첫번째로 추가한 사용자 id는 보통 1000 이다.

$ id

저장 후 실행 속성을 준다.

$ chmod +x ~/.local/bin/lookandfeel_change.sh

이제 10분마다 실행할 수 있게 crontab에 등록한다.

*/10 * * * * /home/계정명/.local/bin/lookandfeel_change.sh

Debian/anbox

Debian Sid에 anbox를 설치하고 playstore 설치하는 방법을 기술한다.

anbox설치

$ sudo apt install anbox

android 이미지 설치

anbox 패키지에는 android 이미지를 가지고 있지 않다. 아래와 같이 파일을 받아서 /var/lib/anbox에 넣어줘야 한다.

$ wget https://build.anbox.io/android-images/2018/07/19/android_amd64.img
$ sudo mv android_amd64.img /var/lib/anbox/android.img

PlayStore 설치

install-playstore.sh스크립트를 받아서 설치한다.

$ sudo apt install lzip squashfs-tools
$ wget https://raw.githubusercontent.com/geeks-r-us/anbox-playstore-installer/master/install-playstore.sh
$ sudo mkdir /etc/systemd/system/anbox-container-manager.service.d/
$ sudo bash install-playstore.sh
$ sudo apt purge lzip squashfs-tools

설치가 끝나면 아래와 같이 실행하고

$ anbox launch --package=org.anbox.appmgr --component=org.anbox.appmgr.AppViewActivity

Settings를 실행하고 Apps > Google Play Services > Permissions 에서 모든 권한을 주면 된다.

실행 예

설치해보면 실행 안되는 앱이 꽤 많다.

ESCline

네이버 카페

2020년 11월 18일

Debian/rclone + autofs

rclone mount을 autofs에 적용하는 방법을 기술한다.

rclone 으로 myremote remote 설정을 추가했다고 가정한다.

설치

$ sudo apt install autofs fuse3

rclonefs

rclone mount helper 스크립트는 한글 locale 에서 제대로 동작하지 않는다. 아래와 같이 수정해서 /usr/local/bin/rclonefs로 저장한다.

#!/bin/bash
remote=$1
mountpoint=$2
shift 2

# Process -o parameters
while getopts :o: opts; do
	case $opts in
		o)
			params=${OPTARG//,/ }
			for param in $params; do
				if [ "$param" == "rw"   ]; then continue; fi
				if [ "$param" == "ro"   ]; then continue; fi
				if [ "$param" == "dev"  ]; then continue; fi
				if [ "$param" == "suid" ]; then continue; fi
				if [ "$param" == "exec" ]; then continue; fi
				if [ "$param" == "auto" ]; then continue; fi
				if [ "$param" == "nodev" ]; then continue; fi
				if [ "$param" == "nosuid" ]; then continue; fi
				if [ "$param" == "noexec" ]; then continue; fi
				if [ "$param" == "noauto" ]; then continue; fi
				if [[ $param == x-systemd.* ]]; then continue; fi
				trans="$trans --$param"
			done
			;;
		\?)
			echo "Invalid option: -$OPTARG"
			;;
	esac
done

# exec rclone
trans="$trans $remote $mountpoint"
# NOTE: do not try "mount --daemon" here, it does not play well with systemd automount, use '&'!
# NOTE: mount is suid and ignores pre-set PATHs -> specify explicitely
PATH=$PATH rclone mount $trans /dev/null 2>/dev/null &

# WARNING: this will loop forever if remote is actually empty!
until [ "`LANG=C \ls -l $mountpoint`" != 'total 0' ]; do
	sleep 1
done

저장 후 실행 권한을 준다.

$ sudo chmod +x /usr/local/bin/rclonefs

autofs 설정

cloud.autofs

아래 내용으로 /etc/auto.master.d/cloud.autofs파일을 만든다.

/cloud	/etc/auto.master.d/auto.rclone

auto.rclone

아래 내용을 참고로 /etc/auto.master.d/auto.rclone 파일을 만든다.

myremotedrive	-fstype=fuse.rclonefs,config=/home/$USER/.config/rclone/rclone.conf,allow-other,uid=$UID	:myremote:

설정 적용

autofs를 다시 시작한다.

$ sudo systemctl restart autofs.service

테스트

아래 명령으로 myremote 내용이 잘보이는지 확인해본다.

$ ls /cloud/myremotedrive

Debian/ZSwap 설정

initramfs 설정

z3fold를 추가한다.

$ sudo -s
# echo z3fold >> /etc/initramfs-tools/modules
# update-initramfs -u

grub 설정

/etc/default/grub 파일을 편집한다.

$ sudo vi /etc/default/grub

GRUB_CMDLINE_LINUX_DEFAULTzswap.enabled=1zswap.zpool=z3fold를 추가한다.

GRUB_CMDLINE_LINUX_DEFAULT="quiet zswap.enabled=1 zswap.zpool=z3fold"

grub 설정을 반영한다.

$ sudo update-grub

2020년 11월 8일

Debian/VirtualBox의 VRDE 설정

VNC 비밀 번호 설정

Debian에서 VirtualBox 패키지만 설치한 경우 원격디스플레이를 VNC를 사용할 수 있다. 단, 이때 VNC 비밀번호를 설정해줘야 한다.

$ VBoxManage modifyvm "가상머신 이름" --vrdeproperty VNCPassword=비밀번호

가상머신 이름은 아래와 같이 찾을 수 있다.

$ VBoxManage list vms

RDP 사용

우선 virtualbox-ext-pack을 설치한다.

$ sudo apt install virtualbox-ext-pack

VNC 대신 RDP를 사용하고 싶은 가상머신에 대해서 아래와 같이 설정한다.

$ VBoxManage modifyvm "가상머신 이름" --vrdeextpack "Oracle VM VirtualBox Extension Pack"

기본값으로 되돌리고 싶으면 아래와 같이 입력한다

$ VBoxManage modifyvm "가상머신 이름" --vrdeextpack default