[OSX] Defaults 명령 사용법

OSX의 시스템 환경 설정이나 기타 앱의 환경 설정은 사실 허무하리만치 간단해서 설정을 바꿀 수 있는 부분이 제한되어 있다. 이는 애플의 UI 정책도 한 몫하고 있지만 사실 OSX와 여러 맥용 앱은 그보다 더 많은 기능들을 내장하고 있는 것이 사실이다. 이런 설정은 defaults라는 터미널 명령을 사용하여 변경할 수 있는데, 아무래도 터미널 자체가 좀 무서운(?) 물건이다보니 초보자들이 다가가기에는 쉽지 않은 것이 사실이다.

이 글에서는 OSX의 각종 환경 설정을 손 볼 수 있는 defaults 명령에 대해서 알아보도록 한다.

defaults 사용법

문법

defaults 명령의 주요 패턴은 다음과 같다. ( 대괄호로 둘러싸인 부분은 넣어도되고 빼도 되는 부분이다)

defaults [호스트] 액션 [도메인] [-타입] [값]

호스트는 시스템을 의미하는데 원격 시스템에 대한 설정을 이 명령으로 바꿀 수 있다. 기본적으로는 현재 로그인한 currentHost의 설정을 바꾼다고 보면 된다.

액션

환경설정 내용에 대해 어떤 동작을 취할 것인지를 결정한다.read, read-type, write, delete로 읽고 쓰고 지울 수 있으며, find 액션으로 전체 환경 설정 내용 중에서 특정한 키나 값을 찾는 것도 가능하다.

  • read 도메인 [키] : 지정한 도메인 혹은 도메인 내의 키의 값을 출력한다.
  • read-type 도메인 키 : 지정한 키의 값의 유형을 알아낸다.
  • write 도메인 키 [타입] 값 : 지정한 키를 지정한 값으로 쓴다.
  • rename 도메인 예전이름 새이름 : 지정한 도메인 내의 예전이름의 키를 새 이름으로 이름을 바꾼다.
  • delete 도메인 [키] : 특정한 도메인 내의 키 혹은 도메인 전체의 설정 내용을 삭제한다. (주의 : 도메인 이름까지만 입력하고 엔터치면 전체 설정이 홀랑 날아간다. 단, 이렇게 내용을 날려버리면 해당 앱을 실행하면 초기 값으로 복원되니 참고할 것)
  • domins : 전체 도메인 목록을 출력한다.
  • find [찾을 단어] :  환경 설정 내용에서 특정 단어를 검색한다.

도메인

도메인은 어떤 것과 관련된 환경 설정인지에 대한 범위를 지정한다. 인터넷 도메인주소와 반대방향으로 com.회사이름.앱이름 의 순으로 연결된다. 파인더의 환경 설정에 접근하고자 한다면 com.apple.finder 라고 도메인을 지정하면 된다. 또한 -g  옵션을 쓸 수 있는데 이는 NSGlobalDomain과 같은 뜻으로 전체 앱에 공통으로 적용되는 설정을 의미한다.

키는 환경 설정 데이터 내에서 특정한 기능과 관련되는 데이터를 가리키는 이름이다. 예를 들어 파인더에서 숨김 파일을 표시할 것인지의 여부를 결정하는 부분이 있는데, 이 부분을 가리키는 키가 바로 AppleShowAllFiles 이다. 키는 대소문자를 구분한다.

키는 응용 프로그램에서 어떤 동작을 어떻게 처리할 것인지를 결정할 때 참고하는 값이고, 따라서 이미 응용 프로그램을 만들 때 정의되어 있는 내용이다. 사용자가 임의의 키를 만드는 것은 가능하지만 그것이 응용 프로그램 동작에는 당연히 반응하지 않을 수 있다.

타입

도메인 내에 각 키는 값의 타입을 가진다. 예를 들어 2라는 숫자가 있을 때 이 것이 2라는 정수값을 의미할 수도 있고, 그냥 “2″라는 글자로서의 숫자를 의미할 수도 있다. 이는 완전히 다른 개념이고, 특정한 키는 그에 상응하는 타입을 가지고 있다.

타입을 지정할 때에는 타입명 앞에 – (하이픈/ 빼기기호)을 넣는다. 또한 타입이 생략되면 defaults는 이 값의 유형이 ‘문자열’이라고 인식한다.

타입에는 다음과 같은 것들이 있다.

  • -int : 정수
  • -float : 소수점이 있는 실수
  • -bool : YES or NO
  • -string : 문자열
  • -array : 여러 값이 집합으로 구성된 배열. ‘{ 값1 값2 값3 …;}’ 과 같은 식으로 쓴다.
  • -array-add : 배열을 값으로 갖는 키에 기존 배열에 추가하여 값을 더 넣을 때 사용하는 타입
  • -dict : 키-값 쌍으로 이루어진 사전 데이터.’{ 키1 값1 키2 값2 ;}’ 와 같은 식으로 쓴다.
  • -dict-add : -array-add 와 비슷하게 동작함

값은 키에 대응되는 값 자체를 말한다.

변경의 적용

앱이 실행 중인 상태에서 환경 설정 값을 변경하는 것은 보통 바로 적용되지 않는다. (보통은 앱이 처음 실행될 때 환경 설정을 한 번만 읽어들이도록 만들어지기 때문이다.) 따라서 Dock이나 Finder와 같이 항상 실행되는 앱은 터미널에서 강제 종료하여 재시작하면 변경 사항을 적용시킬 수 있다. 그외 특정 환경 설정은 로그온 시에 읽어들이므로 그런 경우에는 로그오프 후 다시 로그온 하거나 재부팅하면 적용된다.

예제

파인더에서 숨김 파일을 보기 위해서는 숨김 파일 표시와 관련된 키 값을 설정해주면 된다. 이 키는 AppleShowAllFiles 이며 타입은 -bool 타입이다. 따라서 다음과 같이 변경할 수 있다.

1
$ defaults write com.apple.finder AppleShowAllFiles -bool YES

이 변경 사항을 적용하려면 파인더를 강제로 재시작한다.

1
$ killall Finder

위 두 명령은 세미콜론으로 붙여 한 줄에 쓸 수도 있다.

1
$ defaults write com.apple.finder AppleShowAllFiles -bool YES; killall Finder

환경 설정 파일

이런 앱들의 환경설정은 주로 ~/Library/Preferences 폴더에 각 도메인 별로 파일로 저장된다. 예를들어, 파인더의 사용자별 환경 설정은 사용자의 ~/Library/Preferences/com.apple.finder.plist 라는 파일로 기록된다. 이 파일을 보기 위해서는 파인더에서 메뉴 > 이동 > 폴더로 이동… 을 선택한 다음  ~/Library 라고 입력하고 Preferences 폴더 속을 뒤져보면 된다.

실제로 파인더의 환경 설정 패널을 열고 값을 바꾸면 해당 내용이 이 파일에 기록된다. defaults 명령은 이 plist 파일을 직접 수정하도록 하는 명령이다.

 

 

유니코드 한글의 각 음소를 분리하기

유니코드에서 한글은 0xAC00에서 0xD7A3 사이의 코드 값을 갖는다. 각 16진수값은 10진수로 표시하면 44032와 55203으로 총 11,172개이다. 유니코드 내 한글은 초/중/종성의 각 음소의 조합으로 표현된다. 즉 초성 19개, 중성 21개, 종성 28개를 조합하여 하나의 글자가 되는 것이다. 따라서 각 초,중,종성의 위치값을 계산하여 최종적으로 만들어지는 글자의 코드가 생성된다. 이 때 들어가는 값은 위치 값으로 0~해당 음소의 개수-1 만큼의 인덱스를 의미한다.

((초성 * 21) + 중성) * 28 + 종성 + 0xAC00

이를 역산하면 어떤 문자의 코드값으로부터 각 음소의 인덱스를 구할 수 있다.  즉 각 음소 중에서 몇 번 째 글자인지를 알 수 있게 된다.

초성 = ((문자코드 – 0xAC00) / 28) / 21
중성 = ((문자코드 – 0xAC00) / 28) % 21
종성 = (문자코드 – 0xAC00) % 28

이 때 계산된 값은 각 음소가 음소 문자 중에서 몇 번째 문자인지를 나타내는 위치값이다.
초성의 자모 코드 시작값은 0×1100, 중성은 0×1161, 종성은 0x11A8 이므로 이를 각각 더한다. 특히 종성이 없는 경우가 있기 때문에 종성에는 1을 뺀다.

초성의 자모코드 = 초성인덱스 + 0×1100
중성의 자모코드 = 중성인덱스 + 0×1161
종성의 자모코드 = 종성인덱스 + 0x11A8 – 1

구현

NSString에서 문자열 내 특정 글자를 뽑아오는 일은 characterAtIndex: 메소드를 사용하고 이 때 반환되는 값은 unichar 포맷이 된다. (unichar 는 unsigned short 타입의 변수형이다.)

1
unichar oneCode = [hangul characterAtIndex:i];

이를 위 과정을 통해 계산해서 초성 (및 중/종성)을 추출한 다음, 이를 다시 NSString으로 만들기 위해서는 stringWithFormat: 메소드를 사용한다. 이 때 포맷팅 파라미터는 %C (대문자)를 사용한다. 소문자 %c를 쓰는 것은 char 타입일 때 이다. (바꿔써도 무리는 없는 것 같더라)

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
-(NSString *)getFirstCodeWithString:(NSString *)hangul
{
NSString *result = @"";
for ( int i=0; i<[hangul length];i++) {
unichar oneCode = [hangul characterAtIndex:i];
// 한글일 때만 처리한다.
if ( oneCode >= 0xAC00 && oneCode <= 0xD7A3 ) {
unichar firstCode = ((oneCode -0xAC00) / 28)/21;
firstCode += 0x1100;
result = [result stringAppendingString:[NSString stringWithFormat:@"%C",firstCode]];
}
}
return result;
}

20120117 :: OSX의 메모리 상태 보는 법

맥은 얼마 쓰지도 않아서 메모리를 다쓴다?

윈도에서 맥으로 넘어와서 버리기 힘든 나쁜 습관 중 하나는 메모리의 상태를 걱정하는 일이다. 무슨 소린고 하니 마치 메모리 먹는 괴물처럼 맥은 시스템에 달린 램을 거의 대부분 써버린다. 시스템의 메모리는 활성상태보기(activity)라는 앱을 실행해서 확인할 수 있는데, 여기서 보면 “여유 메모리”에 진짜 여유가 있는 경우가 좀처럼 없기가 십상이다.

그래서 메모리의 여유 공간을 확보해주는 앱들도 유/무료로 많이 팔리고 있는 중인데, 꼭 이런 앱을 돌릴 필요가 있을까 싶은 생각이 든다. 물론 윈도에서의 메모리 확보 프로그램과는 달리, 이 앱들은 시스템에 해악을 끼친다고는 생각되진 않는다. 아무튼 이러한 일종의 ‘오해’는 맥의 메모리 관리 방법에 대한 무지에서 비롯된다고 생각되는데, 이런 메모리 정보를 어떻게 이해해야 할까?

먼저 활성상태보기 앱을 실행해보면 시스템 메모리가 현재 어떻게 사용되고 있는지를 보여준다. 각각의 내용은 다음과 같다.

  • 여유공간 : 말 그래도 여유공간이다. 시스템 메모리 중 사용되지 않고 있으며, 언제든 사용할 수 있는 공간이다.
  • 와이어드 : Wired 상태의 메모리는 특히 앱의 실행 코드가 올라가 있는 공간이다. 따라서 하드디스크 위의 가상메모리 공간으로 스와핑이 불가능하다.
  • 활성 : 활성 메모리 영역은 앱들이 정보를 올려두고 사용하는 공간이다. 메모리가 부족한 상황이 된다면 시스템은 이 영역의 데이터 중 당장 사용되지 않는 내용들을 가상 메모리로 옮겨주게 된다.
  • 비활성 : 아마 시스템을 사용하다보면 가장 많은 분량을 차지하게 되는 메모리 공간이다. 비활성 메모리는 최근에 종료한 앱이 사용했던 공간이다. 이 부분을 바로 해제해서 여유 공간으로 확보할 수 있지만, 실제로는 일반적인 사용자는 동일한 앱을 빈번히 종료/재시작하므로, 비활성 메모리에 이전 앱이 사용하던 정보를 남겨두면, 그 앱을 재실행할 때 빠르게 구동할 수 있다는 장점이 있다. 물론 메모리가 부족한 상황에서는 이 공간을 free 하여 필요한 메모리를 즉시 확보할 수 있다. 현재 시중에 나도는 메모리 확보용 앱은 이 비활성 메모리 영역을 해제해주는 것외에 하는 내용은 없다.

따라서 시스템에서 사용 가능한 메모리 공간은 “여유공간 + 비활성”의 크기 만큼이 되겠다. 그리고 이 두 영역을 합해도 필요한 메모리보다 부족하다면 시스템은 활성 메모리 중의 일부를 디스크로 옮겨서 필요한 메모리 영역을 확보하게 된다. 이 때 사용하는 가상 메모리의 크기가 VM이며, VM에 대해 얼마나 액세스했는가 하는 정보가 페이지출력/입력에 표시된다.

이 페이지 입력/출력의 양이 많으면 많을수록 더 많은 양의 메모리가 필요해서 그 만큼 페이징을 했다는 이야기이며, 하드디스크는 램에 비해 훨씬 더 속도가 느리므로 시스템의 전체적인 체감 성능이 떨어진 것처럼 느껴질 수 있다. 하지만 대부분의 경우에는 그 정도까지로 메모리를 사용하는 케이스는 좀 드물다.

맥이 메모리를 99%, 100%까지 쓰는 것은 메모리를 잘 못 관리하기 때문이 아니라, 그만큼 메모리를 잘 활용하고 있는 (그것도 극대화하여 사용) 증거이므로 굳이 메모리 관리 앱을 사용하여 여유 공간을 수동을 매번 잡아줄 필요는 없다.

덧 : 이는 몇 번 지적한 내용인데, 윈도용 메모리 확보 프로그램은 맥으로 치면 현재의 활성상태 메모리 영역에 있는 데이터를 디스크의 스왑공간으로 강제로 옮기는 기능을 수행한다. 따라서 일시적으로 여유공간이 증가하는 것처럼 보이지만, 필요이상의 하드디스크 액세스를 발생시키므로 오히려 앱을 사용하는 속도는 느려진다. 윈도에서의 메모리 관리도 시스템이 관리하는 것이 가장 낫다고 생각된다. 단, 윈도는 메모리 여유 공간이 제법 남아 있는 상황에서도 가상메모리로 페이징하는 일이 빈번하여 되려 같은 체감성능을 제공하는데 있어 더 많은 램 크기를 요구하는 경우가 많다.

참고자료 : http://support.apple.com/kb/HT1342?viewlocale=ko_KR&locale=ko_KR

20120109 :: [팁] 맥의 모니터만 잠자기

맥북 계열의 경우에는 화면 밝기를 최소로하면 거의 화면이 꺼진 것에 가까울만큼 어둡게 되지만 (이것도 꺼진 것은 아니고 아주 어둡게 켜지는 것임) 아이맥의 경우에는 화면 밝기를 최소로하더라도 어느 정도 밝기가 유지된다.

전력 소모를 줄이기 위해서 잠자기로 들어가게 해 두면, 무선 네트워크 연결이 해제되거나 돌아가던 작업이 중단되는 문제가 있어서 모니터만 재우는 기능이 꽤나 쏠쏠한데, 의외로 많은 커뮤니티에서는 이것을 터미널에서 셸 스크립트를 돌려서 구현하거나 하는 분들도 있더라.

그냥 Control + Shift + Eject를 누르면 화면만 잠자기 모드로 들어간다.

20120104 :: 애플스크립트로 주소록 일괄 수정하기

연락처에 많은 항목이 있더라도 사실 애플 스크립트를 써서 “성(Last Name)” 필드에 공백을 넣는 건 간단하다. 애플 스크립트 편집기를 열고 다음 코드를 입력한 후 실행해주면 모든 주소록에 등록된 성이 공백으로 바뀐다.

 

1
2
3
4
5
6
tell application "Address Book"
repeat with anItem in every person
set anItem's last name to " "
end repeat
save
end tell

 

관련글 : 20111018 :: [OSX] Mail 앱에서 이름이 중복으로 들어가는 경우