C/C++로 짜여진걸 안드로이드로 포팅하려면 우선 기본 프로그램을 so라이브러리 형태로 바꾼뒤 안드로이드의 JNI로 해당 라이브러리를 호출하는 방식으로 만들어집니다.

대신 생각해야하는게 몇 가지 있습니다.

1. 리눅스나 유닉스의 지원이 되는가
2. Xorg등 GUI툴킷에 종속되어있는가

1의 경우는 당연하게도 Windows/Dos만 되는건 애초에 ELF(*.so)형식으로 만들수가 없기 때문입니다. 이건 리눅스나 유닉스용 포팅이 우선되어야합니다.

2는 안드로이드에서는 Xorg나 Wayland가 안 돌아가기 때문입니다. GUI툴킷도 여러종류가 있지만 GTK에 종속된경우 포팅이 까다롭습니다. 그냥 새로짜는게 더 빠른편입니다. Qt의 경우 그나마 낫지만 역시 OS에서 제공하는 기능을 쓸 경우 그것도 대체할 궁리를 해야합니다.

그래서 생각해보다가 주로 CLI와 단일파일로 구성된 서버프로그램을 한번 포팅해보려고 합니다. 서버프로그램은 대부분 백그라운드 대몬형태로 돌아가며 추가입력을 받거나 하는 경우가 거의 없습니다. 한번 실행하면 계속 돌아가기 때문에 그 부분만 신경쓰면 될겁니다.

그래서 결정한게 vlmcsd라 불리는 KMS(MS의 정품인증서버)구현체를 포팅하고자 합니다.
https://github.com/kkkgo/vlmcsd

GitHub - kkkgo/vlmcsd: 🔑Portable open-source KMS Emulator in C

🔑Portable open-source KMS Emulator in C. Contribute to kkkgo/vlmcsd development by creating an account on GitHub.

github.com

순수 C로 짜여져있고 빌드후에 단일파일로 나오게 되는 구조입니다. 그리고 vlmcs라는 클라이언트를 따로 제공하고 있어서 서버의 포팅이 정상적으로 되었는지 확인이 가능합니다.

무엇보다 안드로이드 지원이 이미 고려되어있어서 좀 더 수월 할것 같은것도 한 몫했습니다.
다만 여기서 기본적인 안드로이드 지원은 Termux같은 별도의 안드로이드 내부 터미널에서 쓰는걸 전제로 되어있어서 이래저래 삽질이 필요하긴합니다.

실제로 저장소에서 제공하는 바이너리를 adb shell로 실행하면(실행권한 문제로 /data/local/tmp로 밀어넣어야 합니다.) 실행이 되는걸 볼 수있긴한데 우린 이 방법대신 일반 안드로이드 앱형태로 포팅하는걸 목적으로 하겠습니다.

방법은 아마 이렇게 되겠지요.
1. 기본 프로그램의 main함수를 찾는다.
2. main함수의 이름을 바꾸고 JNI가 지원되도록 형태를 바꾼다.(JNIEXPORT로 시작하는 함수로)
3. 프로그램의 make를 고쳐서 so형태로 나오게 바꾼다.
4. 안드로이드 스튜디오에서 so를 NDK기반 프로젝트에 밀어넣고 위에서 바꾼 main함수를 native로 만든다.
5. 몇몇 부분은 필요에 따라 C구현을 일부고친다.

자바스레드와 이것저것 구현할게 많지만 전체적인 방식은 이와 비슷할겁니다.

,

전 디자이너가 아닙니다.
그리고 심미성은 잘 모르죠.

그런데 한가지는 알고있습니다.
글꼴이란건 언어 관계없이 크게 두가지로 나옵니다.

끝부분 장식이 있느냐(세리프, 부리, 명조 기타등등-이하 세리프)
끝부분 장식이 없느냐(산세리프, 민부리, 고딕 기타등등 - 이하 산세리프)

이건 로마자도 아랍어도 그렇고 심지어 한자도 그렇습니다.

끝에 장식이 있는건 사실 예쁘라고 만든게 아니지요. 묽은 잉크 펜이나 붓으로 글씨를 쓰면 필연적으로 끝부분에 덩어리?가 생기기 마련입니다. 세리프체는 인간이 글을 쓰다보니 자연스럽게 생긴 모양입니다. 그런데 이 장식이 획의 끝을 확실하게 나타내다보니 상대적으로 작은 글씨일때 효과적이라고 합니다. (어디까지나 종이에 표시할때 이야기지만요)

동양에서는 조금 다른데 목판인쇄술이 발전하면서 목판 특유의 결대로 찣어지는 현상을 줄이기위해 끝부분 장식을 새기게 되었습니다. 목판가로줄이 가늘면 목판이 결국 결대로 쭉 부러질수있으니까요. 이를 명나라 시대에 주로 쓰였다해서 명조라고 부르는 계기가 되었습니다. 그래서 요즘 명조라고 부르는 서체는 실제랑 결이 좀 다르긴합니다.

산세리프체는 장식을 최대한 줄이고 멀리서도 잘보이게 만드는것이 특징입니다. 그래서 큰 글씨에 잘 어울린다고 합니다. 표지판이나 알림, 제목등에서 그 특징이 보입니다. 사실 글씨가 크다보니 붓이나 펜으로 쓸때 깔끔하게 마무리가 가능했던것도 있겠지요.

한국에선 판본체라고 부르는게 얼추비슷한데 글씨가 직선과 원 위주인 한글에 잘 어울리는 구조입니다.

그런데 세상이 변하고 펜도 발전했으며 붓은 상대적으로 덜 쓰이게 되었습니다. 그리고 연필도 발전해서 펜보다 더 동글동글한 필기구도 많아졌습니다. 심지어 이러한 필기도구로 효율적으로 글씨를 쓰기위한 필기체도 개발되었지요.

그래서인지 최근에는 작은글씨에도 산세리프(민부리)를 쓰거나 책의 제목같이 큰글씨에 세리프(부리)를 쓰는 경우도 크게 늘었습니다.
그리고 모바일기기가 늘어나며 상대적으로 간단명료한 산세리프의 사용량이 늘어났습니다.

그래서인지 예전보다 폰트의 종류는 많아졌는데 어쩐지 쓰이는 폰트는 비슷하다는 느낌입니다. 왠지 그냥 그렇다고요.

,

2025년 현재 Docker를 빌드하려고 하면 BuildKit을 사용하게 됩니다. 상당히 효율적이고 좋은 방식이지만 기존 방식으로 만들어진 Dockerfile 사용을 하려면 오류가 발생합니다.
 
ERROR: failed to receive status: rpc error: code = Unavailable desc = error reading from server: EOF
 
바로 위 메시지를 뿜으면서 말이지요.
 
cache를 비우거나 각종 코어를 줄이거나 네트워크 부하를 줄이거나 하지만 그냥 옛날에 만들어진 스크립트는 옛날 방식대로 쓱싹하면 됩니다.
 
export DOCKER_BUILDKIT=0
export COMPOSE_DOCKER_CLI_BUILD=0
 
우선 위 명령을 주고 이전에 하던대로
 
docker build ./
이렇게 해주시면 됩니다. 그러면 아무 문제없이 다시 잘 실행 될겁니다.
 
물론 언젠가는 사라질 방식이니 Buildkit용으로 다시 작성할 필요는 있겠지요.

,