466

(0개의 댓글, Mac OS 글에 작성됨)

로그인 창에 표시될 경고문은 시스템의 소유자에 대한 정보를 제공하거나, 혹은 인가되지 않은 사용자한테는 모든 작업들이 감시되고 있다는 경고성 내용을 표시하고자 할 때 사용될 수 있습니다. 다음은 로그인 창에 경고문 추가하는 방법입니다:

1. 터미널에서 다음과 같은 명령으로 /Library/Preferences/com.apple.loginwindow.plist 파일의 편집을 위해 엽니다.

sudo pico  /Library/Preferences/com.apple.loginwindow.plist

2. <dict> 꼬리표 바로 밑에다가 다음과 같은 새로운 <key>와 <string> 항목을 추가합니다.

<key>LoginwindowText</key>  
<string>THIS IS A DEPARTMENT OF DEFENSE COMPUTER  SYSTEM.  
USE OF THE SYSTEM IMPLIES CONSENT TO  MONITORING.  
ANY UNAUTHORIZED USE OF THE SYSTEM WILL  BE PROSECUTED.  
</string>

여기서, <string> 꼬리표 사이에 있는 글이 로그인 창에 보여지게 될 글입니다

3. 변경 사항을 저장하고 나면, 아래와 같이 다음 로그인부터는 로그인 창에 경고문이 함께 표시되는 것을 보실 수가 있습니다.

http://appletree.or.kr/forum/files/login_window.jpg

:idea: 덤으로, 여기에 보이는 로그인 창의 화면은 어떻게 찍었을까 궁금하지 않으세요?
일반적으로, 로그인 창의 화면을 찍기 위해 필요한 서비스는 로그 인 당시에는 아직 실행되지 않은 상태이기 때문에 불가능합니다만, 터미널의 힘을 빌리면 가능하답니다.

간략하게, 터미널의 ‘screencapture’ 명령을 shell에서 빠저나간 후에도 얼마간의 시간 여유를 두어서 자동적으로 실행되게 하면 됩니다. 여기서, 로그인 시에 보여지는 Aqua 화면은 root의 소유이기 때문에 root 권한을 가지고 실행시켜야 됩니다.

방법은 터미널 창을 열고 다음과 같이 입력합니다.

sudo -s
nohup bash -c "sleep 60; screencapture ~/Pictures/login_window.pdf"

여기서, 60은 위의 명령 실행 후 screencapture 명령이 실행되기 전까지의 대기 시간이고, 로그인 후에는 로그인 화면을 담은 ‘login_window.pdf’라는 이름의 파일이 ~/Pictures/ 폴더에 생성됩니다.

iCal에서는 일정을 일, 주, 그리고 월 단위로 볼 수가 있고, 또한 각각의 창 크기도 사용했던 상태 그대로 기억이 됩니다. 그런데, 보기 방식을 전환할 때마다 창의 크기가 바뀌는 것이 약간 눈에 거슬릴 수도 있습니다. 그래서, 세 가지 보기 방식의 창 크기를 똑같이 맞추어 주기 위해서는 일일이 보기 방식을 번갈아 비교하면서 창의 크기를 엇비슷하게 조절해 줄 수도 있습니다만, 더 간편한 방법으로 iCal의 설정 파일을 수정해 주기만 하면 된답니다.

1. 우선, 세 가지의 창들과 같은 크기로 쓰이게 될 일 단위의 창을 원하는 크기로 조절한 후, iCal을 종료합니다.
2. Home/Library/Preferences/ 폴더에 있는 com.apple.iCal.plist라는 이름의 파일을 글자 편집기로 엽니다. 그러면, <dict> 꼬리표 안에 다음과 같은 코드가 보일 겁니다:

<key>1-day view window rect</key>
<string>{{0, 22}, {773, 715}}</string>

이 곳의 <string> 사이에 있는 값은 창의 크기와 위치를 나타내며, 개인마다 설정되어 있는 값이 틀릴 수도 있습니다.
3. <string>과 </string> 꼬리표 사이에 있는 값을 베껴둡니다.
4. 약간 더 밑에 있는 <key>7-day view window rect</key>라고 되어 있는 부분을 찾아서, 바로 밑의 <string> 꼬리표 사이에 있는 것을 아까 베껴둔 것으로 붙여서 대체합니다. 이렇게 해서, 주 단위 창의 크기를 일 단위 창의 것과 같게 합니다.
5. 다시, <key>monthly view window rect</key> 부분을 찾아서, 아까처럼 밑에 있는 <string> 꼬리표 사이에 있는 것을 일 단위 창의 것으로 대체합니다.
6. 이제, 수정한 것을 저장하고, 다시 iCal을 열면, 세 가지 창의 크기가 똑같아 진 것을 확인하실 수 있습니다.

따옴 - MacDevCenter

정보가 넘처나는 요즘에는, 개인의 정보를 지켜주는 암호의 관리도 중요하겠지만, 열쇠의 기능을 가지는 암호가 남이 쉽게 복제하기에 단순한 것이라면 아무 소용이 없을 것입니다.
그래서, 쉽게 풀릴 수 없는 암호를 만드는 것도 중요합니다. 그래서, 새로운 암호를 만들 때마다, 키체인 접근(Keychain Access)에 있는 "Password Assistant"가 도움이 될 수 있습니다.
사용 방법은 키체인 접근(/Applications/Utilities/)을 열고, '편집' 메뉴에 있는 "키체인에 대한 암호 변경..."을 누르면 나타나는 창에서, 왼쪽 밑에 보이는 "i" 단추를 누릅니다. 그러면 아래의 그림과 같은 "Password Assistant" 창이 보이게 됩니다.

http://appletree.or.kr/forum/files/password_assistance_window.jpg

이렇게 되면, 암호 변경 창에서 새로운 암호를 입력할 때마다, 입력된 암호의 안전성에 대한 정보를 확인하실 수 있게 됩니다.
일단, 해독이 어려운 암호로 결정을 한 후에는, "취소" 단추를 눌러서 키체인의 암호를 변경하지 않고도 빠져나올 수 있습니다.

469

(0개의 댓글, 어플리케이션 글에 작성됨)

iPhoto는 사진에 "친구들"이란 단어를 친구들과 함께 찍은 사진들과 함께 지정할 수 있는 것처럼, 키워드(Keyword)를 추가해 주는 기능이 있습니다. 그래서, 나중에 키워드를 가지고 원하는 사진들을 찾거나, 혹은 키워드에 기초한 똑똑한 사진첩(스마트 앨범 - 개인적으로 iPhoto의 한글판 번역은 정말로 마음에 안듭니다. sad 저와 같은 생각을 갖고 계신 분들은, Cocoa 어플리케이션들이 거이 다 그렇듯이, 어플리케이션의 Resources 폴더에 들어있는 한글 시스템을 위한 ko.lproj 폴더 속 Localizable.strings 파일을 글자 편집기로 열어서, 알맞게 올바로 수정해 주시면 됩니다)을 만드실 수도 있습니다.
하지만, 수 많은 사진들 중에서, 예를 들어 "집 앞의 수선화"라는 이름의 사진 한 장을 찾고자 할 경우는 어떨까요? 놀랍게도, iPhoto 4에는 아직 이런 기본적인 찾기 기능이 빠져있습니다.

다행스럽게도, 똑똑한 사진첩을 잘만 활용한다면, 기본적인 찾기 도구로 사용할 수도 있습니다. 방법은, 파일 메뉴에서 "새로운 스마트 앨범...(Command+Option+N)"을 선택합니다. 그러면 iPhoto는 똑똑한 사진첩을 만들기 위한 종이장을 보여줍니다. 그러면, 아래의 그림에서 보여지는 것처럼, 텍스트(Any Text)와 다음을 포함(contains) 항목을 선택해 주고, 필요하다면 몇 가지의 조건들을 더 추가해 줍니다. 마지막에 "승인" 단추를 눌러서 저장해 놓으면, 원할 때마다 불러내서 사진들을 쉽게 찾을 수 있습니다.

http://www.macdevcenter.com/mac/excerpt/osxph2_1004/graphics/9Smart.jpg

사진을 찾고자 할 때는, 저장해 놓았던 똑똑한 사진첩을 선택하고, Control 키와 함께 눌러서 "스마트 앨범 편집"을 선택해 줍니다. 필요하면,  찾기 조건을 수정한 후, 예를 들어, "집 앞의 수선화"라는 이름의 사진을 찾는다면, "텍스트" 입력 칸에 사진의 이름을 입력하고 "승인" 단추를 누르기만 하면 됩니다. (여기서 "텍스트(Any Text)"는 사진 이름, 롤(Roll), 날짜, 설명, 그리고 키워드 정보 모두에서 찾아줍니다.) 그리고, 여기에 추가했던 키워드 항목은 찾는 것을 더 세분화 해서, 해당 키워드를 포함하고 있는 사진들 안에서만 찾게 됩니다.

따옴 - MacDevCenter

470

(0개의 댓글, 어플리케이션 글에 작성됨)

아시다시피, iPod에 저장해 놓은 음악을 뽑아내는, 어쩌면 기본적인 기능을, Apple에서는 의도적으로 아주 어렵게 만들어 놓았습니다. 이런 이유로, iPod에서 음악을 추출하는 기능을 채워주는 많은 무료 iPod 도구들이 태어나게 되었습니다.
여러 도구들 중에, 최근에 인기를 얻게 된 것이 iPodDownload라는 이름의 iTunes plugin이 있었습니다만, Apple의 요구로 그만 배포가 중지되는 사태가 벌어지기도 했었습니다. 하지만, 이 plugin은 소리소문 없이 이미 널리 퍼진 상태였고, 많은 사용자들로부터 간단한 조작과 편리한 기능으로 여전한 인기를 누리게 됩니다.
하지만, iTunes가 4.7로 갱신되면서, iPodDownload는 그 기능이 막혀버렸고, 이로 인해 최신 iTunes 버전으로의 갱신을 주저하거나, 불만을 갖는 사용자들 늘어나기 시작했습니다.
그러나, (역시나) 현 상태에 안주하지 않고 문제를 바로잡으려는 사람들이 있었으니, 드디어 그들이 밝혀낸 해결책을 이 곳에 공개하게 됩니다.
여기에 공개된 내용을 보면, Apple이 iPod Download의 기능을 막기위해 iTunes의 소스 코드에 추가했던 부분은 (너무나 서두른 결과였는지) 무척이나 간단한 것이었습니다. iTunes 4.7은 정확히 "iPod Download"라는 이름의 단어를 찾아서 해당 plugin의 기능을 막아놓게 됩니다. 그렇다면, iTunes에 기억되어 있는 이 단어를 다른 것으로 바꾸어 주기만 하면, 역으로 막아놓은 것을 뚫을 수도 있다는 얘기가 됩니다. 그래서, 공개된 해결책으로 iTunes 4.7 소스 코드에 있는 "iPod Download" ASCII 문자를 다른 것으로 바꾸어 주는 방법이 위의 싸이트에 소개되어 있습니다.

그런데, iTunes를 수정한다는 것이 약간은 꺼림칙하고, 또한 앞으로 있을 갱신 때마다, 소스 코드를 또 다시 수정해 주어야 하는 불편함이 생길 수도 있습니다. (물론, Apple이 다른 방법으로 iPod Download Plugin의 기능을 막지 않을 것이라는 가정하에) 그렇다면, 차라리 iTunes를 수정할 것이 아니라, 이 iPod Download Plugin을 비슷한 요령으로 수정해 주는 것이 더 안전하고 간편할 것입니다.

다음은 iPod Download Plugin을 수정해서 iTunes를 속이고, 원래의 기능이 잘 작동될 수 있도록 하는 방법입니다:

1. 우선, Hex 편집기인 HexEdit를 내려받습니다
2. /Library/iTunes/iTunes Plug-ins/ 폴더에 설치되어 있는 iPod Download Plugin을 HexEdit에서 엽니다.
3. HexEdit의 "Find" 메뉴에 있는 "Find & Replace..."(Command+F)를 선택하고, 입력 창에 "iPod Download"를 입력합니다.

http://appletree.or.kr/forum/files/hexedit_find_window.jpg

4. 그러면, 아래의 그림에서와 같이 ASCII 글자를 찾아서 보여주게 됩니다.

http://appletree.or.kr/forum/files/hexedit_found.jpg

5. 찾아진 "iPod Download" 글자를 다른 글자로 바꿉니다. 여기서 주의하실 것은, 바뀐 글자의 수는 원래의 것과 똑 같아야 합니다. 아래의 보기는 간단하게 iPod의 "o"를 "a"로 바꾸어 준 것입니다. (주의: 이 곳에서 수정한 단어는 그대로 iTunes의 창에 표시되는 iPod Download Plugin의 이름이 됩니다.)

http://appletree.or.kr/forum/files/hexedit_editing.jpg

6. 이제, 수정한 것을 저장하고, iTunes를 다시 실행시키면 iPod Download가 정상적으로 작동하는 것을 보실 수 있습니다. (iPod Download Plugin을 수정하고 난 후에 생기는 원래의 "iPod Download Plugin~"라는 이름의 파일은 지우셔도 됩니다.)

http://appletree.or.kr/forum/files/itunes_window.jpg

여기를 누르시면 수정된 iPod Download Plugin 파일을 받으실 수 있습니다.

더불어서 아래는, iPod Download 이외에, iTunes에게 (혹은 독립적으로) iPod에 저장되어 있는 음악 파일을 뽑아주는 기능을 추가하는, 몇 가지의 무료 도구들입니다.

- Mac 용
[ul][uli]Senuti[/uli][uli]iPod tracks -> Desktop[/uli][uli]iPod2Mac[/uli]iPod Extractor[uli]iLinkPod[/uli][uli]iPod->Folder[/uli][/ul]
- Windows 용
[ul][uli]ephPod[/uli][uli]SharePod[/uli][/ul]

471

(10개의 댓글, Mac OS 글에 작성됨)

터미널 창의 “Welcome to Darwin!” 문장 바꾸기

터미널을 열 때마다, "Welcome to Darwin!"이라는 문장이 표시되는 것을 매번 보셨을 겁니다. 이것을 좀 더 의미있거나 혹은 재미난 것으로 바꾸고 싶으신 적이 있으셨겠죠? 방법은 생각보다 간단합니다. 그냥 /etc/motd 파일을 원하시는 것으로 수정만 해주시면 됩니다. Mac OS X 소유의 파일이기 때문에, sudo 명령과 함께 pico 편집기를 사용해서 다음과 같이 터미널에 입력합니다:

sudo pico /etc/motd

원하시는 문장으로 대치하고 저장하면, 터미널 창을 열 때나 혹은 외부에서 shell 환경으로 접속할 때마다 새로 바뀌어진 문장이 표시되는 것을 확인하실 수 있습니다.

"Save the World! You Superman.", "Cower in Fear, All Ye Who Enter Here.", "This computer system is private. Unauthorized usage is strictly prohibited, and all activity is logged. If you are here by mistake, please close your connection window now."...

472

(0개의 댓글, 어플리케이션 글에 작성됨)

개인적으로, 이 글을 읽기 전까지는 Mac OS X의 계산기에 예전 Mac OS 시절 자주 애용하던 간단한 도식 그려주는 기능이 숨어 있다는 것을 미처 몰랐었습니다. 그래서, 혹시 아직 모르시는 분들을 위해서 숨어 있는 방식을 소개해 드리겠습니다.
Mac OS X에 설치되어 있는 계산기는 두 가지의 방식("기본"과 "고급")을 제공합니다. 하지만, Finder에서 약간의 수정 작업으로, 하나도 아닌 무려 세 가지의 새로운 방식을 추가해서 사용하실 수가 있게 됩니다. 이 세 가지의 방식은 아래 그림에서 보이는 Graphing과, 다음에 Expression Sheet, 그리고 프로그램 개발자들에게 유용한 Hexadecimal이 있습니다.

http://www.macdevcenter.com/mac/excerpt/osxph2_1004/graphics/11graph.jpg

새로운 방식을 추가하는 방법은:
1. 우선, 계산기를 종료하고, 계산기 아이콘을 선택해서 "패키지 내용 보기"로 Calculator/Contents/Resources 폴더를 엽니다.
2. Resources 폴더 속에 있는 ExpressionSheet.calcview, Graphing-2D.calcview, 그리고 Hexadecimal.calcview 폴더를 위의 Contents 폴더에 있는 Plugins 폴더로 옮깁니다.
3. (선택 사항) Calculator/Contents/Resources 폴더에 있는 Calculator.icns 파일을, 글의 맨 앞에 보이는 것과 같은, 새로 얻게된 방식들과 더 잘 어울리는 새로운 Calculator.icns 파일로 덮어 씌웁니다.
4. 계산기를 다시 열면 "보기" 메뉴에서 새로 생긴 세 가지의 방식들을 선택하실 수 있습니다.


내년 초에 발표되는 Tiger에 포함될 계산기는 더욱 정교해지고 더 큰 화면의 모습으로 등장하리라 짐작해 봅니다. (아참, 더 커진 단추들도 기대해 봐야 겠군요. smile

473

(10개의 댓글, Mac OS 글에 작성됨)

마우스를 창 위로 가져가서 해당 터미널 창을 저절로 활성화 시키기

여러 개의 터미널 창들을 띄워놓고 작업할 때 편리한 기능입니다.

터미널을 열고 다음과 같이 입력합니다:

defaults write com.apple.Terminal FocusFollowsMouse -string YES

터미널 창을 닫고 다시 새로운 Shell을 열면, 마우스 위치에 따라 터미널 창이 자동 활성화 되는 효과를 보실 수 있습니다. (해당 사용자의 계정에서만 효과를 보실 수 있으며, 시스템 전체에는 적용되지 않습니다.)
다시, 원래의 상태로 돌아가려면, 위의 명령 중에서 YES 대신에 NO 값을 주고 실행하면 됩니다.

X11에서도 같은 효과를 보려면, X11 명령 창을 열고 다음과 같이 입력합니다:

defaults write com.apple.x11 wm_ffm true

474

(12개의 댓글, Mac OS 글에 작성됨)

Mac OS X의 경우는, 아시다시피 실제로 휴지통 폴더가 하나만 있는 것이 아니고, 더욱이 Finder 상에서는 보이지도 않기 때문에 정작 휴지통으로 버린 파일이 실제로는 어느 휴지통으로 들어가게 되는지는 쉽게 짐작하기가 어렵습니다. 우선, 휴지통들의 위치를 보면, 각 사용자의 home 디렉토리에는 ".Trash"라는 이름의 휴지통 폴더가 있고, 또한 시동 볼륨을 포함한 각각의 볼륨에 "Trash" 폴더가 있습니다. 그리고, 사용자가 시동 볼륨에 위치한 파일을 휴지통으로 버리면 사용자의 홈 디렉토리에 있는 ".Trash"로 옮겨지게 되고, 시동 볼륨이 아닌 곳에 있는 파일을 휴지통으로 버리면, 해당 볼륨의 "/.Trashes/UID" 폴더로 옮겨지게 됩니다.

여기서, 휴지통 속에 들어 있는 폴더의 501이라는 이름은, OS X 시스템 상에서 보통 처음으로 생성한 사용자 인식 번호(UID)를 뜻합니다. 추가로 생성된 사용자는 502, 503...등등의 형식으로 계속 UID를 지정받게 됩니다.
그래서, 모든 시스템에는 이 501이라는 폴더가 있기 마련이고, 이 폴더의 위치는 임시 파일들을 저장해 놓는 OS X 시스템이 설치되어 있는 볼륨의 /private/tmp/ 폴더 속에 있습니다. OS 9의 경우에는 각 볼륨의 최상위에 위치하는 "Temporary Items"이라는 이름의 안보이는 폴더에 여러 어플리케이션들이 사용하는 임시 자료 파일들을 저장해 놓게 됩니다.
이곳에 저장되어 있는 파일들은 일반적으로는 어플리케이션을 종료하고 나면 자동적으로 지워지는 것이 정상이지만, OS 9의 경우, 어떤 오류로 인해 지워지지 못한 것들은, 재시동 시에 Temporary Items 폴도 속에 있던 파일들을 휴지통(해당 볼륨의 "Trash") 속의 Rescued Items 폴더 속으로 옮겨놓게 됩니다. 이곳에 있는 파일들은 그냥 확인 차원에서 보시고, 필요없는 것들은 그냥 지우시면 됩니다.

이렇듯 복잡한 휴지통 비우기 과정으로 인해, 어떤 알 수 없는 이유로 쓰기 권한이 없는 파일이나 폴더가 휴지통에서 비워지지 않을 때는, 터미널을 열고 다음과 같이 입력해서 모든 휴지통들을 비워줄 수 있습니다. (아래의 명령에서 보이는 <volumename> 대신에 원래의 볼륨 이름을 입력합니다):

sudo rm -rf ~/.Trash/ 
sudo rm -rf /.Trashes/ 
sudo rm -rf /Volumes/<volumename>/.Trashes/

만약, 휴지통에 있는 파일이 잠겨있는 상태라 지울 수 없다면, 다음과 같이 잠궈진 상태를 풀어준 후에 위의 명령을 다시 실행합니다. (모든 휴지통들에 들어있는 파일들의 잠김 상태를 풀어줍니다):

chflags -R nouchg ~/.Trash/
chflags -R nouchg /.Trashes/
chflags -R nouchg /Volumes/<volumename>/.Trashes/

Apple 참고 문서:

475

(3개의 댓글, Mac OS 글에 작성됨)

가려진 어플리케이션의 Dock 아이콘을 반투명하게

TinkerTool이나 Cocktail에서 Dock에 올려져 있는 어플이케이션들 중에 가려진 것의 아이콘을 반투명하게 만들어 주는 효과는 com.apple.dock.plist의 showhidden 값을 true로 해주면 가능하다고 합니다.

그래서, 간단하게 터미널을 열고 다음과 같이 입력해 주셔도 됩니다:

defaults write com.apple.dock showhidden -bool true
killall Dock

나중에 다시, 원래의 상태로 되돌리려면 위의 true 값을 false로 대치해 주시면 되겠습니다.

476

(0개의 댓글, 어플리케이션 글에 작성됨)

fiwt(find while typing)는 Safari에 "입력과 동시에 찾는(find-as-you-type) 기능"을 추가해 주는 작지만 아주 편리한 도구입니다. 보통 "type-ahead find"로도 불리우는 이 기능은, Safari의 찾기(Command+F) 단축키를 누른 후, 찾기 대화상자를 불러내서 찾는 것과는 달리, 현재 보여지는 페이지에서 찾고자 하는 단어를 바로 입력하는 것과 동시에 맨 위에서부터 찾기 시작해서 현재까지 입력되어진 것과 같은 단어를 선택해서 보여줍니다. 뒤로 누은 슬래쉬("\") 키를 누르면 다음 단어를 다시 찾아주고, 만약 찾은 글자가 하이퍼링크라면, 리턴 키를 눌러서 연결된 곳으로 이동할 수도 있습니다. (참고로, 찾기를 취소하려면 ESC 키를 누릅니다.)

설치는, SIMBL이 미리 설치되어 있어야 하며, fiwt.bundle을 /Library/Application Support/SIMBL/Plugins 폴더에 넣어주고 Safari를 다시 켜면 됩니다.

혹, fiwt에 미리 지정되어 있는 단축키가 마음에 안드신다면, 바꾸는 방법은 다음과 같습니다:
fiwt.bundle 파일을 선택하고, 마우스 오른쪽 단추를 눌러서 "패키지 내용 보기" 메뉴를 선택해서 Contents/Resources/English.lproj/Localizable.strings를 글자 편집기로 엽니다.
그러면, 다음과 같은 코드 중, 단축키의 값을 원하시는 것으로 수정해 주시면 됩니다.

startSearchString = "";
startSearchStringMods = "0";

repeatSearchString = "\\";
repeatSearchStringMods = "0";

[ul][uli]startSearchString: 찾기를 시작하기 전에 눌러야 하는 글자 키 (기본은 없음)[/uli][uli]repeatSearchString: 다시 찾게 하는 글자 키 (기본은 "\")[/uli][uli]...Mods: 지정된 단축키와 함께 눌러야 하는 키 (0=없음, 4=ctrl, 8=opt, 12=ctrl+opt)[/uli][/ul]
이 파일을 편집 후에는, Safari를 종료하고 다시 열면 새로 지정된 키를 사용하실 수 있습니다. 한 가지 아쉬운 것은, 역시나 한글로 된 단어를 찾을 수는 없네요. hmm

477

(0개의 댓글, 맥 개발 글에 작성됨)

http://developer.apple.com/images/developer_logo.gif
Apple은 내년에 발표될 Mac OS X 10.4 Tiger를 앞두고, 개발자들에게 Tiger에 포함될 새로운 기술들을 소개하는 Tiger Developer Overview 페이지를 새로 개설했습니다.

여기에 소개된 기술들로는:
Spotlight, Dashboard, 64-bit Development, Xcode 2.0, Automator, Core Image, 그리고 Core Data가 있습니다.

이들 중, Apple의 다음 버전 개발 도구인 Xcode 2.0는 사용자 인터페이스의 개선 및 컴파일러의 갱신 등의 몇 가지 새로운 기능들이 포함될 예정입니다. 

가장 눈에 띄는 것은 역시 시각적 모델링 도구입니다. 이것은 코드 변화에 따라 실시간 갱신되는 class들의 계층적 도표를 생성해 주며, class들 간의 이동도 손쉬워집니다. 또한, 이곳에서는 Core Data에 의해 관리되고 생성되는 data 개체들의 조작도 가능합니다.

http://developer.apple.com/macosx/images/modeler.jpg

또 하나의 새로운 기능으로, 시각적인 원격 디버깅 도구는 다른 컴퓨터에서 어플리케이션을 실행시키면서 여러 디버깅 기능들을 원격적으로 접근 제어할 수 있도록 해줍니다. 이것은 화면에 꽉 차는 어플리케이션들이나 게임등을 디버깅 할 때 아주 유용할 것 같습니다.

이런, 새로워진 시각적 사용자 인터페이스 뿐만이 아니고, Xcode 2,0은 GCC 4,0과 함께 배포될 예정이며, 이 새로운 C++ Parser는 auto-vectorization을 포함한 몇 가지 코드 생성에 있어서 향상된 점들을 가지고 있습니다. GCC의 auto-vectorization을 이용해서 생성된 코드는 4 배에서 14 배에 이르는 성능 향상을 보여준다고 하는군요.

아무튼, Tiger와 함께 새로 제공될 많은 기능들로, 개발자들에게 남겨진 몫은 이런 멋진 기능들을 어플리케이션들의 적재적소에 잘 빌려와서,  최적화된 코드를 짜주기만 하면 된다는군요. (하지만, 실제로 이제 막 뛰어든 개발자들에게는, 더 깊어진 내용들과, 문제들을 파해치면서 넘어야 할 벽들이 큰 부담으로 다가올 수도 있을 것 같습니다.)

478

(1개의 댓글, Mac OS 글에 작성됨)

시동 항목이란 첫 로그인 과정이 진행되기 전에, 오래된 파일들을 지우거나 혹은 기타 유지보수 작업들을 행하는 등의 기초 서비스를 제공하는 프로그램이나 shell 스크립트들을 말합니다.
주의: daemon을 시동하기 위해 시동 항목으로 등록해 두는 것은 삼가해야 합니다. daemon을 시동하기 위해서는, “Bootstrap Daemons”에 설명되어 있는 것처럼 boostrap 환경에 daemon을 등록하셔야 합니다.

시동 항목이란

시동 항목은 SystemStarter 프로그램을 통해, 시동 단계의 마지막 과정으로 실행됩니다. 이 때는, SystemStarter가 /System/Library/StartupItems 그리고  /Library/StartupItems 디렉토리에 있는 시동 항목들을 찾게 됩니다. 그리고, 각 시동 항목들의 property list에 저장되어 있는 정보들을 모아서, 이 정보를 가지고 항목들의 실행 순서를 결정합니다. 그리고 나서, 다른 항목들 간의 내부 종속 관계에 따라 묶음 단위로 시동 항목들을 실행시킵니다.

/System/Library/StartupItems 디렉토리는 Mac OS X에 기본적으로 설치되어 있는 시동 항목들만을 위해 사용되고, 기타 다른 시동 항목들은 /Library/StartupItems 디렉토리에 저장되어야 합니다. 한 가지 주의하실 할 것은, 이 디렉토리는 처음에는 존재하지 않고, 시동 항목을 설치할 때 새로 만들어야 합니다.

새로운 시동 항목을 만들기 위해서는, 코드를 실행시킬 프로그램이나 스크립트를 만들고, 시동 항목에 관한 정보를 가지고 있게 될 property list 파일을 만들어야 합니다. 시동 항목을 만드는 과정은 다음과 같습니다.

시동 항목의 실행자 만들기

시동 항목의 실행자에는 시동 항목의 코드가 포함되어 있으며, command-line 실행자 혹은 shell 스크립트의 형태로 실행될 수 있습니다. 보통, 이 실행자는 시스템이 시동할 때에만 불려지게 됩니다. 하지만, SystemStarter는 그 후에도 실행자를 부를 수 있는 기능도 제공합니다. (참고: “Managing Startup Items”)

시동 항목을 만드는 과정은:

1. 시동 항목을 위한 디렉토리를 만듭니다. 디렉토리 이름은 시동 항목이 제공할 기능과 어울리게 지어주어야 합니다.
예: MyDBServer

2. 실행자를 디렉토리에 추가합니다. 실행자의 이름은 실행자를 포함하고 있는 디렉토리의 이름과 같아야 합니다.
예: MyDBServer/MyDBServer

3. StartupParameters.plist로 이름 지어진 property list를 만들고 해당 디렉토리에 추가합니다. 아래의 “시동 항목 속성 지정하기” 참고.
예: MyDBServer/StartupParameters.plist

만약 시동 항목 실행자가 shell 스크립트의 형태로 실행된다면, Mac OS X에는 스크립트 만드는 과정을 손쉽게 도와주는 몇 가지 코드를 제공하고 있습니다. /etc/rc.common 파일이 command-line 설정 변수들의 작업 과정들을 정의하고 시스템 설정 사항들을 모으는 기능을 합니다. 그래서, shell 스크립트의 처음에, rc.common 소스 파일을 추가하고 RunService 과정을 부르는 command-line 설정을, 아래의 예처럼 추가하십시오:

#!/bin/sh
 . /etc/rc.common

 StartService()
 {
 your start code
 }

 StopService()
 {
 your stop code
 }

 RestartService()
 {
 your restart code
 }

 RunService "$1"

이곳의 RunService 과정은 shell 스크립트 안의 StartService, StopService, 그리고 RestartService 과정들을 찾아서, 필요에 따라 서비스를 실행, 정지, 혹은 재시동 할 때 불러옵니다.

만약 시동 항목 실행자가 완료하는 데 오랜 시간이 걸리는 코드를 포함하고 있다면, 코드를 daemon이나 혹은 뒤에서 안보이는 작업으로 실행되도록 하는 것이 바람직 할 겁니다.
스크립트로 직접 오래 걸리는 시동 작업들을 실행시키는 것은 시스템 시동 시간을 늘리고 지체되게 하는 부작용이 있습니다. 그래서, 시동 항목 스크립트는 최대한 빨리 실행되고나서 작업을 마치도록 하는 것이 좋습니다.

시동 항목 속성 지정하기

시동 항목 실행자와 더불어, 모든 각각의 시동 항목들은 시동 항목 디렉토리 안에 StartupParameters.plist 이름의 property list 파일을 가지고 있어야 합니다.
아래의 표에서는 시동 항목의 StartupParameters.plist 파일에 포함되어야 하는 key-value 쌍들을 보여줍니다. 모든 array들과 dictonary들은 string 값을 가집니다. 이 property list를 만들기 위해서는, /Developer/Applications 폴더에 있는 Property List Editor 어플이케이션을 사용하시는 것도 좋습니다.

StartupParameters.plist key-value 쌍들
- Description(String) : 시동 항목에 대한 짧은 설명. 시스템 관리 도구들에 의해서 사용됨.
- Provides(Array)Array : 시동 항목에 의해 제공되는 서비스들. 비록, 시동 항목은 기능적으로 여러개의 서비스들을 제공할 수도 있겠지만, 가능한 한 하나만으로 제한하는 것이 좋습니다.
- Requires(Array) : 시동 항목이 실행되기 전에 먼저 실행되어야 하는 다른 시동 항목들에 의해서 제공되는 서비스들. 만약 필요한 서비스들이 사용될 수 없는 상태라면, 이 시동 항목은 실행되지 않습니다.
- Uses(Array) : 시동 항목이 실행되기 전에 먼저 실행되어야 하는 다른 시동 항목들에 의해서 제공되는 서비스들. 하지만, 필수 요건은 아님. 필요한 서비스들이 사용될 수 없는 상태라도 실행은 가능합니다.
- OrderPreference(String) : Requires 그리고 Uses 값에 의해 결정되는 같은 실행 순서를 가지고 있는 시동 항목들과 그것들의 상대적 실행 순서에 관한 정보. 순서 설정 값에는 다섯 가지가 있습니다: First, Early, None, Late, 그리고 Last. 기본 값은 None. 순서 선호도 값은 참고적인 성격을 가지며 무시될 수도 있습니다.

여기서, Requires와 Uses 속성에 지정한 값은 시동 항목이 의존하게 되는 서비스 이름에 해당합니다. 서비스 이름은 해당 서비스를 제공하는 시동 항목의 이름과 같지 않을 수도 있습니다. Provides 속성이 시동 항목에 의해 제공되는 서비스의 이름을 지정해 주며, 보통 이것의 이름이 시동 항목의 이름과 같겠지만, 꼭 그럴 필요는 없습니다. 예를 들어, 시동 항목이 여러 서비스들을 실행시키는 특별한 경우에는, 시동 항목의 이름과 같은 이름을 가진 최대 하나의 서비스를 가질 수 있게 됩니다.

만약, 두 개의 시동 항목이 같은 이름의 서비스를 제공한다면, SystemStarter는 그 이름을 가지고 있는 첫 번째의 시동 항목만을 실행시킵니다. 이러한 이유로, 시동 코드 안에서 절대적인 코드 의존 때문에 필요한 경우가 아니라면, 시동 항목들이 여러 개의 서비스들을 제공하는 것을 권하지는 않습니다.

위에서 사용된 Requires, Uses, 그리고 OrderPreference key들의 값은 특정한 실행 순서를 보장해 주지는 않습니다.

따옴 - Apple 문서 - Creating a Startup Item

더 자세한 시스템 시동 과정은 Apple의 시스템 시동에 관한 소개 문서를 참고하시기 바랍니다.

479

(7개의 댓글, 맥 개발 글에 작성됨)

아래의 javescript들은 Safari 책갈피 막대의 책갈피 링크 주소에 저장해 놓고, 웹 페이지를 개발하는 데 유용하게 사용될 수 있는 작은 JavaScript로 된 책갈피 도구들(bookmarklets)입니다.

JavaScript 관련
Scripts 보기 - 현재의 페이지에 있거나, 혹은 연결되어 있는 모든 JavaScript들을 포함하고 있는 창을 새로 표시함(Framesets은 지원 안함).  document.all, document.layers 등과 같은 지원되지 않는 DOM 요청들을 확인할 경우 사용하십시오.

javascript:var%20jsArray%20=%20document.getElementsByTagName(%22script%22);%20var%20theWinref;%20var%20theHTML;%20var%20scriptObj;%20var%20frameURL;%20var%20frameObj;if(jsArray.length%20%3E%200)%20%7B%20theWinref%20=%20window.open('','_blank','width=320,height=255,toolbar=no,location=no,directories=no,status=yes,menubar=no,resizeable=yes');%20theWinref.document.write('%3Chtml%3E%3Chead%3E%3Ctitle%3E'%20+%20window.location.href%20+%20'%3C/title%3E%3C/head%3E%3Cbody%3E'+%20jsArray.length+'%20Script(s)%20Found:');%20theWinref.resizeTo(600,200);theWinref.moveTo(0,0);%20%7D%20for%20(var%20i%20=%200;%20i%20%3C%20jsArray.length;%20i++)%20%7B%20scriptObj%20=%20jsArray%5Bi%5D;%20if(scriptObj.hasAttribute(%22src%22))%7B%20frameURL%20=%20scriptObj.getAttribute(%22src%22);%20theWinref.document.write(%22%3Cp%20style='background-color:%23999933;'%3EScript%20%22+eval(i+1)+%22%20via%20%22%20+%20frameURL%20+%20%22%3Cbr%3E%3Ciframe%20height='100%25'%20width='100%25'%20id='url%22+%20i%20+%20%22'%20src='%22%20+%20frameURL%20+%20%22'%3E%3C/iframe%3E%3C/p%3E%22);%20frameObj%20=%20theWinref.document.getElementById(%22url%22%20+%20i);%20%7D%20else%20%7B%20theHTML%20=%20scriptObj.innerHTML;%20theWinref.document.write(%22%3Cp%20style='background-color:%23999933;'%3EScript%20%22+eval(i+1)+%22:%3Cbr%3E%3Cpre%3E%22%20+%20theHTML%20+%20%22%3C/pre%3E%3C/p%3E%22);%20%7D%20%7D%20if(jsArray.length%20%3E%200)%20%7B%20theWinref.document.write('%3C/body%3E%3C/html%3E');%20%7D

특정 Scripts 실행 - 현재의 페이지 안에서 특정 JavaScript를 실행시킬 수 있게 하는 입력 대화상자를 표시함.

javascript:var%20c='document.location.href',r='';while(c=prompt(r+'Enter%20the%20code%20to%20be%20executed:',c)){try{r='Returned:%20'+eval(c)+'n';}catch(err){r='Error:%20'+err.message+'n';}}

배치 관련
테이블 보기 - 모든 테이블들의 열과 행의 테두리를 표시해 줌. 이것은 테이블들이 적당한 형태로 잘 자리잡고 있는지를 확인할 때 유용합니다.

javascript:var%20f=function(tt,col){var%20a=document.getElementsByTagName(tt);for(var%20b=0;b%3Ca.length;b++){a[b].style.border='1px%20solid%20%23'+col;}};f('table','00F');f('td','0F0');f('th','0FF');

DIV 테두리 보기 - 현재의 페이지에 있는 DIV 요소들 주위에 테두리를 표시해 줌.

javascript:var%20a=document.getElementsByTagName('div');for(var%20b=0;b%3Ca.length;b++){a[b].style.border='1px%20solid%20%23F00';}

DIV 테두리와 해당 ID 보기 - 현재의 페이지에 있는 DIV 요소들 주위에, 테두리와 함께 해당 ID를 표시해 줌.

javascript:var%20a=document.getElementsByTagName('div');var%20aspan;var%20txtNode;for(var%20b=0;%20b%20%3C%20a.length;b++){%09a[b].style.border='1px%20solid%20red';%09%09if(a[b].id%20!=%20''){%09%09aspan%20=%20document.createElement('span');%09%09aspan.setAttribute('id',%20't_ttp'%20+%20a[b].id);%09%09aspan.setAttribute('style',%20'position:relative;top:1px;left:1px;%20margin:10px%200px%200px%2010px;background-color:%20beige;max-width:220;padding:%202px%2010px%202px%2010px;border:%201px%20solid%20%23C0C0C0;font:%20normal%2010px/12px%20verdana;color:%20%23000;text-align:left;display:%20block;');%09%09txtNode%20=%20document.createTextNode('div:%20'%20+%20a[b].id);%09%09aspan.appendChild(txtNode);%09%09a[b].appendChild(aspan);}}

Outline 테두리 보기 - 현재의 페이지에 있는 HTML 요소들의 Outline을 표시해 줌. 여기서 보여지는 테두리(CSS Outline)는 일반 테두리(Border)와 달리 공간을 차지하지 않고 객체들의 테두리 위에 그려지게 됩니다.

javascript:(function()%7B%20function%20mark(elem)%20%7B%20if(elem.style)%20%7B%20elem.style.outline=%221px%20solid%20green%22;%20%7D%20%7D%20;%20function%20recurse(elem,p)%20%7B%20var%20i,%20k,%20cn;%20if(!elem)%20%7B%20alert(%22null%22);%20return;%20%7D%20mark(elem);%20cn%20=%20elem.childNodes;%20if(cn)%7B%20k%20=%20cn.length;%20for%20(i%20=%200;%20i%20%3C%20k;%20i++)%20%7B%20recurse(cn%5Bi%5D,%20p%20+%20%22.%22%20+%20i);%20%7D%20%7D%7D%20recurse(document,%22d%22);%20%7D)();

현재의 페이지안에 포함된 그림들을 새 창에서 보기 - 현재의 페이지안에 있는 모든 그림들을 새 창을 열어서 따로 보여 줌.

javascript:if%20(false)void('View%20images%20script%20by%20Tantek%20Celik%20-%20modified%202003.02.11');var%20n%20=%20(window.location.toString().replace(/[^a-z0-9]/gi,'_'))+'_im';var%20sn%20=%200,ud,i=0,r='/r';var%20ss%20=%20r;l=document.images.length;if%20(l==0)%20alert('No%20images%20to%20see%20here.%20Move%20along.');else%20for%20(i=0;i%3Cl;i++){var%20s%20=%20document.images[i];var%20u%20=%20s.src;if%20(u!=''%20&&%20u!=ud%20&&%20ss.indexOf(r+u+r)==-1){%20ss+=u+r;sn++;var%20w=window.open(s.src,n+sn,'height='+Math.max(s.height,32)+',width='+Math.max(s.width,32)+',status=no,location,menubar,resizable,scrollbars');w.focus();}}void(20030211);

Web 표준 확인
현재의 페이지 HTML 표준 확인 - HTML 표준 확인을 위해 현재의 URL을 W3로 보내 줌. 여기서 URL은 방화벽 밖에서도 잘 보여야 합니다.

javascript:void(document.location='http://validator.w3.org/check?uri='+document.location);

현재의 전체 웹 사이트 HTML 표준 확인 - 전체 웹 사이트의 HTML 표준을 확인함.

javascript:void(document.location='http://htmlhelp.com/cgi-bin/validate.cgi?url='+document.location+'&warnings=yes&spider=yes');

현재의 페이지 CSS 표준 확인 - CSS 표준 확인을 위해 현재의 URL을 W3로 보내 줌. 여기서 URL은 방화벽 밖에서도 잘 보여야 합니다.

javascript:void(document.location='http://jigsaw.w3.org/css-validator/validator?uri='+document.location);

현재 페이지의 Links (HREFs) 표준 확인 - Link 표준 확인을 위해 현재의 URL을 W3로 보냄. 여기서 URL은 방화벽 밖에서도 잘 보여야 합니다.

javascript:void(document.location='http://validator.w3.org/checklink?url='+document.location);

Feed(ATOM, RSS) 표준 확인 - Feed를 Feed Validator에서 표준 확인. 여기서 Feed URL은 방화벽 밖에서도 잘 보여야 합니다.

javascript:window.open('http://feedvalidator.org/');

창 크기 조절
PocketPC iPaq 240x320 - 창 크기를 230x320 pixels 크기로 조절.

javascript:void(window.resizeTo(240,320));

TV safe 544x372 - 창 크기를 544x372 pixels 크기로 조절.

javascript:void(window.resizeTo(544,372));

VGA 640x480 - 창 크기를 640x480 pixels 크기로 조절.

javascript:void(window.resizeTo(640,480));

SVGA 800x600 - 창 크기를 800x600 pixels 크기로 조절.

javascript:void(window.resizeTo(800,600));

XGA 1024x768 - 창 크기를 1024x768 pixels 크기로 조절.

javascript:void(window.resizeTo(1024,768));

SXGA 1280x1024 - 창 크기를 1280x1024 pixels 크기로 조절.

javascript:void(window.resizeTo(1280,1024));

UXGA 1600x1200 - 창 크기를 1600x1200 pixels 크기로 조절.

javascript:void(window.resizeTo(1600,1200));

이것들 외에도 Web 개발에 도움이 될 만한 Safari 관련 유용한 정보들을 아래의 곳에서 얻으실 수 있습니다.
Apple 개발 문서 - Safari에 대해 자주 묻게 되는 질문들과 답변

위와 비슷한 기능들을 Safari의 메뉴에 따로 추가해서 사용할 수 있게 하는 도구로 Safari WebDevAdditions 그리고, Safari에 표시되어 있는 현 웹 페이지를 해부해서 CSS 분석 및 편집을 용이하게 해 주는 Xyle scope를 추가하면 Safari에서 훌륭한 웹 개발 환경을 갖출 수 있을 것 같습니다.
또한, Mozilla Firefox를 사용하시는 분들은 비숫한 기능의 도구 막대를 추가해 주는 Web Developer Extension도 있네요. 이것도 CSS의 실시간 편집이 가능합니다.

480

(0개의 댓글, 어플리케이션 글에 작성됨)

OS X에서 방화벽 설정하기

OS X에서 방화벽은 시스템 환경설정의 "공유" 항목에서 설정해서 사용할 수 있지만, 여기서는 약간 설 익은 ipfw의 기능들만을 제공합니다. 또한, 여러대의 컴퓨터들에 비슷한 방화벽 환경을 구현할 경우에는, 번잡한 과정들이 필요하게 됩니다.

그래서, OS X에 내장되어 있는 방화벽 도구인 ipfw를 사용해서, 간단하고 쉽게 여러대의 컴퓨터들에 적용될 수 있는 방화벽 설정 스크립트를 만들어 보겠습니다.

방화벽 규정 생성 스크립트 만들기

먼저, 방화벽을 위한 규정 생성 스크립트를 만듭니다.
일단, 규정들을 스크립트 파일에 저장해 놓으면, 나중에 아주 손쉽게 수정하고 설치가 가능하게 됩니다.

1. 터미널을 열고 root 사용자로 들어가서 ipfw 규정 생성 스크립트 파일을 생성합니다.

$ su -
# vi ipfw.rules

2. 아래와 같은 코드를 자신의 네트워크 환경에 맞게 수정하고, 열고자 하는 포트들을 추가한 후에 규정 생성 스크립트 파일에 붙입니다.

#!/bin/sh 
# Simple Firewall rules 
# darky83@sleektech.nl 

# +----------+ 
# | settings | 
# +----------+ 
# IPFW command 
fwcmd="/sbin/ipfw" 

# DHCP server 
dhcps="192.168.0.1" 

# interface, network, netmask and ip 
if="en0"                    # Your Interface 
net="192.168.0.0"            # Your Network 
mask="255.255.255.0"        # Your Netmask 
ip="192.168.0.1"            # Your IP 

# DNS Servers 
dns1="1.1.1.1" 
dns2="2.2.2.2" 

################ 
# Start Script # 
################ 

# Flush everything first 
${fwcmd} -f flush 

# We need counting don't we? so we can get some nice stats.. 
${fwcmd} add 10 count ip from any to any via ${ip} 
${fwcmd} add 11 count ip from any to any in recv ${ip} 
${fwcmd} add 12 count ip from any to any out xmit ${ip} 

# Allow loopback 
${fwcmd} add 100 pass all from any to any via lo0 
${fwcmd} add 101 deny all from any to 127.0.0.0/8 
${fwcmd} add 102 deny ip from 127.0.0.0/8 to any 

# Stop RFC1918 nets on the outside interface 
# NOTE: IF YOU ARE ON A LAN UNCOMMENT THE IPRANGE OF YOUR LAN 
${fwcmd} add 300 deny all from any to 10.0.0.0/8 via ${if} 
${fwcmd} add 301 deny all from any to 172.16.0.0/12 via ${if} 
#${fwcmd} add 302 deny all from any to 192.168.0.0/16 via ${if} 
${fwcmd} add 303 deny all from any to 0.0.0.0/8 via ${if} 
${fwcmd} add 304 deny all from any to 169.254.0.0/16 via ${if} 
${fwcmd} add 305 deny all from any to 192.0.2.0/24 via ${if} 
${fwcmd} add 306 deny all from any to 224.0.0.0/4 via ${if} 
${fwcmd} add 307 deny all from any to 240.0.0.0/4 via ${if} 

# Allow TCP through if setup succeeded 
${fwcmd} add 410 pass tcp from any to any established 

# Allow IP fragments to pass through 
${fwcmd} add 420 pass all from any to any frag 

############################# 
# INPUT                     # 
# COMMENT OUT YOUR SERVICES # 
############################# 

# Allow setup of incomming ftp 
#${fwcmd} add 500 pass tcp from any to ${ip} 20 setup 
#${fwcmd} add 501 pass tcp from any to ${ip} 21 setup 

# Allow setup of incoming ssh 
#${fwcmd} add 502 pass tcp from any to ${ip} 22 setup 

# Allow setup of incoming www 
#${fwcmd} add 503 pass tcp from any to ${ip} 80 setup 

# Bittorrent 
${fwcmd} add 510 pass tcp from any to ${ip} 6881 
${fwcmd} add 511 pass tcp from any to ${ip} 6882 
${fwcmd} add 512 pass tcp from any to ${ip} 6883 
${fwcmd} add 513 pass tcp from any to ${ip} 6884 
${fwcmd} add 514 pass tcp from any to ${ip} 6885 
${fwcmd} add 515 pass tcp from any to ${ip} 6886 
${fwcmd} add 516 pass tcp from any to ${ip} 6887 
${fwcmd} add 517 pass tcp from any to ${ip} 6888 
${fwcmd} add 518 pass tcp from any to ${ip} 6889 

#### 
# DNS 
#### 

# Allow access to our DNS 
${fwcmd} add pass tcp from any to ${dns1} 53 setup 
${fwcmd} add pass udp from any to ${dns1} 53 
${fwcmd} add pass tcp from any to ${dns2} 53 setup 
${fwcmd} add pass udp from any to ${dns2} 53 
${fwcmd} add pass udp from any 53 to any 

# ALLOW THE DHCP REQUESTS 
${fwcmd} add 650 allow udp from any 68 to ${dhcps} 67 out via ${if} 
${fwcmd} add 651 allow udp from ${dhcps} 67 to any 68 in via ${if} 

# Reject & Log all setup of incoming connections from the outside 
${fwcmd} add 700 deny log logamount 50000000000 tcp from any to any in via ${if} setup 

# Allow setup of any other TCP connection 
${fwcmd} add 800 pass tcp from any to any setup 

##### 
# OUTPUT 
#### 

# We allow everything here (as I said its a simple fw.) 
${fwcmd} add 900 allow ip from ${ip} to any 

# ICMP 
${fwcmd} add 920 allow icmp from any to any icmptypes 0,3,8,11,12 

# Deny everything els and log it 
${fwcmd} add 60000 deny log logamount 50000000000 ip from any to any

3. 이제, 다음과 같이 터미널에서 앞에서 만든 ipfw 규정 생성 스크립트를 적용해 줍니다.

# sh ipfw.rules

4. 다음에, 아래처럼 모든 것이 정상적으로 작동하는지 확인합니다.

# ipfw show
00010  548 216938 count ip from any to any via 192.168.0.1 
00011  253 135927 count ip from any to any in recv 192.168.0.1 
00012  295  81011 count ip from any to any out xmit 192.168.0.1 
00100 8552 592520 allow ip from any to any via lo0 
00101    0      0 deny ip from any to 127.0.0.0/8 
00102    0      0 deny ip from 127.0.0.0/8 to any 
00300    0      0 deny ip from any to 10.0.0.0/8 via en0 
00301    0      0 deny ip from any to 172.16.0.0/12 via en0 
00303    0      0 deny ip from any to 0.0.0.0/8 via en0 
00304    0      0 deny ip from any to 169.254.0.0/16 via en0 
00305    0      0 deny ip from any to 192.0.2.0/24 via en0 
00306  120  14758 deny ip from any to 224.0.0.0/4 via en0 
00307    0      0 deny ip from any to 240.0.0.0/4 via en0 
00410  321 191264 allow tcp from any to any established 
00420    0      0 allow ip from any to any frag 
00510    0      0 allow tcp from any to 192.168.0.1 6881 
00511    0      0 allow tcp from any to 192.168.0.1 6882 
00512    0      0 allow tcp from any to 192.168.0.1 6883 
00513    0      0 allow tcp from any to 192.168.0.1 6884 
00514    0      0 allow tcp from any to 192.168.0.1 6885 
00515    0      0 allow tcp from any to 192.168.0.1 6886 
00516    0      0 allow tcp from any to 192.168.0.1 6887 
00517    0      0 allow tcp from any to 192.168.0.1 6888 
00518    0      0 allow tcp from any to 192.168.0.1 6889 
00618    0      0 allow tcp from any to x.x.x.x 53 setup 
00650    0      0 allow udp from any 68 to x.x.x.x 67 out xmit en0 
00651    0      0 allow udp from x.x.x.x to any 68 in recv en0 
00700    0      0 deny log logamount 2147483647 tcp from any to any in recv en0 setup 
00718    8    545 allow udp from any to 1.1.1.1 53 
00800    8    480 allow tcp from any to any setup 
00818    0      0 allow tcp from any to 2.2.2.2 53 setup 
00900   56   4362 allow ip from x.x.x.x to any 
00918    0      0 allow udp from any to x.x.x.x 53 
00920    0      0 allow icmp from any to any icmptype 0,3,8,11,12 
01018    8    686 allow udp from any 53 to any 
60000    4    948 deny log logamount 2147483647 ip from any to any 
65535 1215  80133 allow ip from any to any

위에서는, ipfw show 명령을 입력하면, 모든 규정들이 정상적으로 적용되었음을 나타내어 줍니다.

방화벽 규정 생성 스크립트의 시동 항목 파일 만들기

이렇게 해서 만들어진 방화벽 규정 생성 스크립트를 컴퓨터가 시동할 때마다 실행되게 하기 위해서는 시동 항목 파일을 만들어야 합니다.

1. 먼저, /Library/StartupItems/ 폴더에 Firewall 디렉토리를 생성하고, 방화벽 규정 생성 스크립트인 ipfw.rules를 생성한 Firewall 디렉토리에 복사합니다.

# mkdir /Library/StartupItems/Firewall
# cp /var/root/ipfw.rules /Library/StartupItems/Firewall

여기서, 저는 규정 파일을 /var/root/ 디렉토리에 생성했었습니다만, 만약 다른 곳에 저장하셨었다면, 그 곳에 있는 규정 파일을 옮기시면 됩니다.

2. 다음과 같이, 시동 스크립트 파일을 만듭니다. (여기서, 시동 스크립트의 파일 이름은 위치하고 있는 디렉토리의 이름과 같아야 합니다.)

# cd /Library/StartupItems/Firewall 
# vi Firewall

다음은 스크립트 파일의 내용입니다

#!/bin/sh
##
# Configure The Firewall
##
. /etc/rc.common
StartService () 
{ 
        sh /Library/StartupItems/Firewall/ipfw.rules 
} 
StopService () 
{ 
        return 0 
} 
RestartService () 
{ 
        return 0 
} 
RunService "$1"

이제, 다음과 같이 시동 스크립트 파일에 실행 권한을 부여합니다.

# chmod 755 Firewall

3. StartupParameters.plist 파일을 만들고 내용을 아래와 같이 입력합니다.

# vi StartupParameters.plist

StartupParameters.plist 파일 내용:

{ 
  Description     = "Firewall Rules"; 
  Provides        = ("Firewall"); 
  Requires        = ("Network Configuration"); 
  OrderPreference = "None"; 
}

마지막으로 컴퓨터를 재시동하게 되면, 방화벽 규정들이 적용되는 것을 시동 화면에서 확인하실 수 있습니다.
참고로, ipfw front-end인 BrickHouse를 사용하시면 위에서 설명된 규정들을 터미널을 사용할 필요 없이, 쉽고 간편하게 설정하실 수 있습니다. 그러고 보니, 벽돌 집은 불에 강하겠군요. wink