macOS의 Dock, 모니터간의 이동

짧은 글.

그간 맥의 Dock이 다른모니터로 멋대로 이동하는 현상때문에 매번 고생고생하다가 명확하게 옮기는 방법을 터득(?)하였다. 트랙패드를 위에서 아래로 쓸어내리듯 제스쳐를 하면된다는 글을 보고 아무리해도 잘 안되어서 그냥 아무생각없이 느리게 위에서 아래로 포인터를 움직였더니 한번에 잘 이동되었다(…).

짧게 요약하자면 화면의 최하단 포인터가 완전하게 바닥으로 내려가도록 마우스 포인터를 이동. 그 이후 트랙패드 상단에 손가락 하나로 터치하여 트랙패드 바닥부분까지 약 2~3초정도 걸릴정도로 느리게 일정한 속도로 스윽~ 손가락을 내리면 바로 옮겨졌다. 이런 방식으로 몇번씩 해보면서 그 속도가 익으니까 트랙패드 공간의 절반만 활용해도 너무나도 편하게 Dock을 윈하는 모니터로 이동이 가능하게되었다(…).

MariaDB 10버전 설치안될 때

딸랑 윈도 10만 설치된 환경에서 마리아DB를 설치하니 뜬금없이 롤백이 되어버렸다. msi로 만들어진 패키지 대부분은 공통같지만 오류가났으면 로그를 보여주던지 해야할텐데 로그를 참조할 수 있도록 하이퍼링크로 로그파일을 볼 수 있게 보여주는건 그다지 못본거같다. msi의 문제라고 해야할지 패키지를 만드는 사람의 문제라고 해야할지 모르겠지만.

본론으로 들어가면 로그를 보기위해 구글링해보니 msiexec /i “MSI 파일이름” /l*v install.log 이렇게 실행하면 로그파일을 원하는 위치에 생성가능하다. 그렇게 롤백이라는 문구를 검색해보니 아래와같은 로그가 남아있었다.

CAQuietExec: Running bootstrap
CAQuietExec: Executing “”C:\Program Files\MariaDB 10.4\bin\mysqld.exe” –no-defaults –console –innodb-page-size=16384 –bootstrap “–lc-messages-dir=C:/Program Files/MariaDB 10.4/share” –basedir=. –datadir=. –default-storage-engine=myisam –max_allowed_packet=9M –net-buffer-length=16k”
CAQuietExec: ERROR: Can’t write to mysqld’s stdin
CAQuietExec: FATAL ERROR: database creation failed
CAQuietExec: https://mariadb.com/kb/en/installation-issues-on-windows contains some help
CAQuietExec: for solving the most common problems. If this doesn’t help you, please
CAQuietExec: leave a comment in the Knowledge Base or file a bug report at
CAQuietExec: Error 0x80070001: Command line returned an error.
CAQuietExec: Error 0x80070001: QuietExec Failed
CAQuietExec: Error 0x80070001: Failed in ExecCommon method
CustomAction CreateDatabase returned actual error code 1603 (note this may not be 100% accurate if translation happened inside sandbox)

은근슬적 들어간 https://mariadb.com/kb/en/installation-issues-on-windows 링크로 들어가고 아무것도 깔리지않은 윈도에서 심심치않게 겪어본 재배포 패키지 문제때문에 딴건 신경안쓰고 https://aka.ms/vs/16/release/vc_redist.x64.exe 이 링크로 재배포 패키지를 설치하고 MariaDB를 설치하니 잘 설치되었다(…)

사실 installer라고하면 이런 필요한 패키지를 검사하거나 필수로 깔아야하는게있을경우 설치 실패시 저 페이지의 링크로 방문하라고 메시지가 뜨거나 다운 받아서 설치하도록 둘 중 한가지로 해야할텐데 뜬금없이 롤백되고 하이퍼링크같이 명확하게 보여주지도않고 Finish 버튼이 딱 뜨는건 음… 납득불가다. 덕분에 한시간가량 손해봤지만 그래도 한가지 경험을 하게되었다(…).

쓰르라미 울 적에 실행 안될 때

원격 데스크톱으로 PC 연결 중 스팀 원격 플레이 실행하다 얼떨결에 전체화면 설정 후 종료하였더니 이후부터 실행되지않아 약 두시간(밥먹으면서 즐기려했던 계획이 사라졌다)의 시간을 날려먹고 해결하여 글로 남긴다.

처음엔 설정파일의 문제일것이라 생각하여 생성된 날짜를 설치한 날짜인 오늘로 탐색기 검색을 하여 세이브 파일을 찾아(%AppData\Mangagamer) 삭제하여도 실행 실패. MS에서 제공하는 Process Monitor로 검색을 해보니 아래와같은 레지스트리 항목이 나왔다.

레지스트리 편집기는 실행(Win+R을 누른 후 팝업창에서 regedit 입력 후 실행.
경로는 “컴퓨터\HKEY_CURRENT_USER\Software\MangaGamer “에 각 시리즈 별로 분류.

각각의 값이 무슨 규칙을 가지고있는지 확인하긴 귀찮고 그냥 (기본값)만 남기고 삭제 후 실행한 결과 정상 실행되었다.

ENGLISH를 선택해야 한패 후 한글로 표시된다.

그리고 한글패치까지 해주고 실행하여 편-안하게 한글로 플레이 가능하게 되었다. 좀 어처구니없는 문제. 그렇다고 버그 리포팅을 할수도없고 해결법 알았으니 그냥 또 문제 발생하면 알아서 해결해야겠다(…).

mariadb 빌드 시 외부 라이브러리 링크

원래부터 그랬는지 기억이 나지않지만 cmake기반의 빌드 시스템이 필수가 되었다. 기본 옵션으로는 TokuDB를 위해 jemalloc가 필요한데… TokuDB를 사용하지않으려면 “cmake -DWITH_JEMALLOC=no” 이렇게 실행하여 Makefile을 생성하면 되지만 임시로 이것저것 굴리기위한 일반 사용자 계정으로 돌릴 로컬 디비를 구측하는 중이라 사용해보고싶었다.

소스코드 및 빌드 경로: /opt/mariadb-local/src
PREFIX 경로: /opt/mariadb-local/usr

jemalloc는 /opt/mariadb-local/src에 다운로드하여 빌드 및 설치(./configure --prefix=/opt/mariadb-local/usr && make && make install)

mariadb는
cmake -DBUILD_CONFIG=mysql_release -DWITH_JEMALLOC=yes -DCMAKE_INSTALL_PREFIX=/opt/mariadb-local/usr -DCMAKE_REQUIRED_FLAGS="-I/opt/mariadb-local/usr/include" -DCMAKE_REQUIRED_LIBRARIES="-L/opt/mariadb-local/usr/lib"
명령으로 Makefile 생성. 환경변수는 이곳에서 참조하였다. 이제 빌드하면 DokuDB를 사용가능한 mariadb로 빌드가된다. 아마 더 필요한 라이브러리가 있다면 /opt/mariadb-local/usr에 필요한 라이브러리를 더 빌드하여 설치하면 될것으로 보인다.

추가

모듈을 링크할 때 jemalloc를 링크할 수 없는 오류가 발생하므로 –DCMAKE_MODULE_LINKER_FLAGS="-L/opt/mariadb-local/usr/lib" 옵션을 추가해야함.

기본테이블 생성을 위한 mysql_install_db 스크립트 실행은 아래와같이 실행 (소스코드는 mariadb-10.4.11 폴더이지만 mariadb-10.4.11-build 에서 빌드하였다.)
/opt/mariadb-local/usr $ ./scripts/mysql_install_db --builddir=/opt/mariadb-local/src/mariadb-10.4.11-build --basedir=/opt/mariadb-local/usr --datadir=/opt/mariadb-local/usr/data --defaults-file=/opt/mariadb-local/usr/my.cnf --user=$LOGNAME

첫 실행시엔 비밀번호가 설정되어있지않으므로 root 계정으로 mysql -h 127.0.0.1 -P 3307 -u root와같이 실행하여 암호를 바꿔야한다. (localhost로 hostname을 넘기면 포트번호가 무시되는것같다.) 만약 root권한을 가질 수 없다면 mysql_install_db에 --auth-root-authentication-method=normal 옵션을 추가하여 실행해야한다. (이미 설치되었다면 data 폴더의 내용을 지우고 실행해야된다.)

my.cnf 파일의 내용
[client]
port=3307
socket=/opt/mariadb-local/usr/mariadb.sock

[mysqld]
port=3307
socket=/opt/mariadb-local/usr/mariadb.sock
datadir=/opt/mariadb-local/usr/data
language=/opt/mariadb-local/usr/share/korean

로컬용 실행 스크립트
#!/bin/sh
./bin/mariadbd --defaults-file=/opt/mariadb-local/usr/my.cnf

로컬용 중지 스크립트
#!/bin/sh
./bin/mariadb-admin --defaults-file=/opt/mariadb-local/usr/my.cnf shutdown

실행결과
iruis@tun /opt/mariadb-local/usr $ ./run-mariadb.sh
2019-12-22  5:52:20 0 [Note] ./bin/mariadbd (mysqld 10.4.11-MariaDB) starting as process 14794 …
2019-12-22  5:52:20 0 [Note] InnoDB: Using Linux native AIO
2019-12-22  5:52:20 0 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
2019-12-22  5:52:20 0 [Note] InnoDB: Uses event mutexes
2019-12-22  5:52:20 0 [Note] InnoDB: Compressed tables use zlib 1.2.11
2019-12-22  5:52:20 0 [Note] InnoDB: Number of pools: 1
2019-12-22  5:52:20 0 [Note] InnoDB: Using SSE2 crc32 instructions
2019-12-22  5:52:20 0 [Note] mariadbd: O_TMPFILE is not supported on /tmp (disabling future attempts)
2019-12-22  5:52:20 0 [Note] InnoDB: Initializing buffer pool, total size = 128M, instances = 1, chunk size = 128M
2019-12-22  5:52:20 0 [Note] InnoDB: Completed initialization of buffer pool
2019-12-22  5:52:20 0 [Note] InnoDB: If the mysqld execution user is authorized, page cleaner thread priority can be changed. See the man page of setpriority().
2019-12-22  5:52:20 0 [Note] InnoDB: 128 out of 128 rollback segments are active.
2019-12-22  5:52:20 0 [Note] InnoDB: Creating shared tablespace for temporary tables
2019-12-22  5:52:20 0 [Note] InnoDB: Setting file ‘./ibtmp1’ size to 12 MB. Physically writing the file full; Please wait …
2019-12-22  5:52:20 0 [Note] InnoDB: File ‘./ibtmp1’ size is now 12 MB.
2019-12-22  5:52:20 0 [Note] InnoDB: Waiting for purge to start
2019-12-22  5:52:20 0 [Note] InnoDB: 10.4.11 started; log sequence number 60736; transaction id 23
2019-12-22  5:52:20 0 [Note] InnoDB: Loading buffer pool(s) from /opt/mariadb-local/usr/data/ib_buffer_pool
2019-12-22  5:52:20 0 [Note] Plugin ‘FEEDBACK’ is disabled.
2019-12-22  5:52:20 0 [Note] InnoDB: Buffer pool(s) load completed at 191222  5:52:20
2019-12-22  5:52:20 0 [Note] Server socket created on IP: ‘::’.
2019-12-22  5:52:20 0 [Note] Reading of all Master_info entries succeeded
2019-12-22  5:52:20 0 [Note] Added new Master_info ” to hash table
2019-12-22  5:52:20 0 [Note] ./bin/mariadbd: ready for connections.
Version: ‘10.4.11-MariaDB’  socket: ‘/opt/mariadb-local/usr/mariadb.sock’  port: 3307  MariaDB Server

최근 버전에서는 user 테이블의 암호를 update 쿼리로 변경이 불가능하게 되었다. 무조건 root 쉘에서 /opt/mariadb-local/usr/bin/mariadb-secure-installation --defaults-file=my.cnf 와같이 실행하여 별도의 설치가 필요한데… root권한을 가지지 못한다면 datadir에 해당되는 폴더를 제거한 후 mysql_install_db 스크립트에 --auth-root-authentication-method=normal 옵션을 붙여서 설치해야 됨.

맥에서 동적 라이브러리 참조문제 (Reason: image not found)

ffmpeg를 사용해볼 겸 테스트용 프로젝트를 생성하여 아래와같이 구성.

빌드까지 문제가 없었으나 실행시키면 “Reason: image not found“라는 에러가 발생.

뜬금없이 libswresample.3.dylib를 찾을 수 없다는 에러가 발생한다. 구글링 해본 결과 otool과 install_name_tool을 사용하여 해결해야하는것으로 결론.

실행파일과 dylib파일을 otool -L 명령으로 확인해보면 라이브러리 위치를 ffmpeg를 빌드할 때 prefix 대상 위치로 참조하도록 되어있다. libswresample.3.5.100.dylib 파일을 확인하면 나타나는 항목 중 첫번째 항목은 LC_ID_DYLIB, 두번째 부터 나타나는 항목은 LC_LOAD_DYLIB으로 차이가 있다. (직접 확인하려면 otool -L 대신 otool -l 옵션으로 실행하면 확인가능) 이중 LC_ID_DYLIB는 바이너리가 생성될 때 라이브러리가 참조되는 경로로 링크가되는것으로 보인다. 이 경로는 install_name_tool -id “라이브러리 경로” “라이브러리 파일”로 지정 가능하고 LC_LOAD_DYLIB는 바이너리에서 의존하는 라이브러리며 install_name_tool -change “기존경로” “새로운경로” “라이브러리 파일” 명령으로 변경 가능하다. (경로는 상대경로를 위한 예약어 비슷한 키워드가 있다. @executable_path, @loader_path, @rpath이다. 각각 의미는 구글링으로 패스.)

install_name_tool -id @executable_path/../Frameworks/libavcodec.58.54.100.dylib libavcodec.58.54.100.dylib
install_name_tool -change /Users/iruis/OpenSource/ffmpeg-4.2.1-lgpl/output/lib/libswresample.3.dylib @executable_path/../Frameworks/libswresample.3.5.100.dylib libavcodec.58.54.100.dylib

위와같은 명령으로 라이브러리 경로를 하나하나 바꾸고나면 맥의 패키지 내 복사되는 라이브러리가 참조되어 정상 로딩되어 실행된다. 덕분에 거의 반나절을 삽질한건 안비밀.