WebKit에 포함된 WebView를 이용하여 초 간단한 웹브라우저를 만들어 보겠습니다.
(프로젝트 생성과 인터페이스 빌더에서 작업은 이전에 많이 다루었기 때문에 여기서는 자세한 설명은 생략하였습니다. 'Cocoa 따라해보기' 분류의 초기 포스트에 관련된 설명이 있습니다.)

0. WebKit
WebKit은 애플의 대표적인 오픈소스 프로젝트 중에 하나 입니다. 대표적인 사파리뿐만 아니라 아도비 에어, 아이폰, 노키아의 폰부라우져, 구글 안드로이드 플랫폼등 여러 프로젝트에서 사용되었습니다. (출처:WikiPedia/WebKit)

Webkit은 KDE의 웹브라우져 퀀커러의 엔진인 KHTML과 KJS에서 시작한 발전해 왔습니다. 주개발자는 Dave Hyatt로 넷스케이프에서 모질라를 개발하다 2002년에 애플에 합류해 현재 사파리, Webkit팀의 책임자로 있는 것으로 보입니다. 초기 파이어폭스, Camino와 탭브라우징, XBL/XUL을 만들고 W3C에도 많은 영향력이 있는 것 같습니다.

Webkit에 대한 상세한 정보는 WebKit 홈페이지에서 확인하실 수 있습니다.

1. WebKit 프레임워크 추가
Xcode의 New Project에서 Cocoa Application으로 프로젝트를 하나 만듭니다. WebKit 프레임워크를 추가하기 위하여 Groups & Files에서 우클릭하여 Add > Existing Frameworks를 선택합니다.

사용자 삽입 이미지

사용자 삽입 이미지
선택창에서 /System/Library/FrameWorks에 있는 WebKit.framework를 선택합니다. 좌측과 같이 WebKit.framework가 포함되어 있는 것을 확인할 수 있습니다.


2. 소스코드 편집

AppController이란 이름으로 Objective-C 클래스를 생성합니다. 아래와 같이 입력합니다.

1) AppController.h
#import <Cocoa/Cocoa.h>

@class WebView;

@interface AppController : NSObject {
    IBOutlet WebView *webView;
    IBOutlet NSTextField *inputUrl;
}

- (IBAction)goURL:(id)sender;

@end

2) AppController.m
#import "AppController.h"
#import <WebKit/WebKit.h>

@implementation AppController

-(void)awakeFromNib
{
    /* 기본 주소 설정 */
     NSURL *url = [NSURL URLWithString:@"http://www.cocoadev.co.kr"];
    [[webView mainFrame] loadRequest:[NSURLRequest requestWithURL:url]];
}

- (IBAction)goURL:(id)sender
{
    /* 사용자 입력 주소 Load */
    [[webView mainFrame] loadRequest:[NSURLRequest requestWithURL:
        [NSURL URLWithString:[sender stringValue]]]];
}
@end

3. 인터페이스 빌더
Xcode의 AppController.h를 MainMenu.nib로 드래그 해서 가져다 놓습니다. Classes 항목의 AppController를 우클릭하여 Instantiate AppController를 선택하여 인스턴스를 생성합니다.

팔레트에서 NSTextField와 CustomView를 드래그해서 아래와 같이 윈도우에 배치합니다.
사용자 삽입 이미지

1) NSTextField 속성 변경
사용자 삽입 이미지
NSTextFiled는 윈도우 크기가 변경되더라도 위치를 유지하면서 가로 크기만 변하도록 설정하겠습니다.

NSTextField의 속성창중 Size메뉴(단축키: Command+3)에서 AutoSizing 속성을 좌측과 같이 변경합니다.


2) CutomView 속성 변경
사용자 삽입 이미지
웹컨텐츠를 보여주는 View는 윈도우의 크기에 맞춰 변환되도록 AutoSizing을 좌측과 같이 설정합니다.

그리고 Custom Class 항목(단축키: Command+5)에서 WebView를 선택합니다.


3) AppController와 연결
이제 AppController의 inputUrl을 NSTextField로 webView를 webView로 연결합니다.  그리고 Action에서 NSTextField는 goURL로 연결합니다.

사용자 삽입 이미지

4. 테스트 or More..
빌드 후에 실행하면 아래와 같습니다. 입력창에 URL을 입력하면 다른 사이트로 연결됩니다.
사용자 삽입 이미지

More...
Developer/Examples/WebKit/MiniBrowser에 히스토리가 저장되고 앞으로, 뒤로 가기, 리로드, 정지, 폰트 확대/축소 등의 기능이 추가된 예제가 있습니다. 그외 ADC의 WebKit과 관련된 아래의 문서들이 도움이 되실 것입니다.
AND

NSFileManager로 파일과 디텍토리를 복사/이동/삭제하는 간단한 예제 소스입니다. 각 단계는 enter를 로그창에 입력하면 진행되면 아래와 같은 순서로 작업을 합니다.

  1. test 디렉토리 생성
  2. test 디렉토리를 test2로 변경
  3. test.txt 파일을 test2 디렉토리 아래에 new_test.txt로 복사
  4. test2 디렉토리로 이동
  5. new_test.txt를 re_test.txt로 변경
  6. re_test.txt 삭제
  7. 상위 디렉토리로 이동
  8. test2 디렉토리 삭제
테스트 전에 실행파일이 있는 디렉토리에 test.txt란 파일을 vi나 편집기를 이용해 만들어 놓으셔야 합니다.

아래 이미지의 좌측은 Log창에서의 진행화면이며 우측은 터미널에서 진행화면입니다. 터미널에서 확인 후에 로그 창에서 [enter]를 입력하면서 한단계씩 진행합니다.

사용자 삽입 이미지

아래는 소스파일입니다. 별다른 내용이 없으므로 간단한 주석으로 설명을 대치하였습니다.

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    NSFileManager *FileManager;
    FileManager = [NSFileManager defaultManager];

    /** 현재 디렉토리에서 test란 디렉토리를 생성 */
    if ([FileManager createDirectoryAtPath:@"test" attributes:nil] == NO ) {
        NSLog(@"Fail to create directory");
        return 0;
    }
    NSLog(@"create directory [press return]");
    getchar();
   
    /** 현재 디렉토리에 test.txt 파일이 있는지 검사 */
    if ([FileManager fileExistsAtPath:@"test.txt"] == NO) {
        NSLog(@"test.txt file not exist");
        return 0;
    }
   
    /** 생성된 test 디렉토리를 test2로 변경 */
    [FileManager movePath: @"test" toPath: @"test2" handler:nil];
    NSLog(@"move directory [press return]");
    getchar();
   
    /** test.txt 파일을 test2 밑에 new_test.txt로 복사 */
    [FileManager copyPath: @"test.txt" toPath: @"./test2/new_test.txt"
        handler:nil];
    NSLog(@"copy file [press return]");
    getchar();
   
    /** 현재 디렉토리를 test2로 이동 후에 new_test.txt를 re_test.txt로 변경 */
    [FileManager changeCurrentDirectoryPath: @"test2"];
    [FileManager movePath: @"new_test.txt" toPath: @"re_test.txt"
        handler:nil];
    NSLog(@"move file [press return]");
    getchar();
   
    /** re_test.txt 파일 삭제 */
    [FileManager removeFileAtPath: @"re_test.txt" handler:nil];
    NSLog(@"delete file [press return]");
    getchar();
   
    /** 현재 디렉토리를 이전 디렉토리로 이동후에 test2 디렉토리 삭제 */
    [FileManager changeCurrentDirectoryPath: @".."];
    [FileManager removeFileAtPath: @"test2" handler:nil];
    NSLog(@"delete directory");
   
    [pool release];

    return 0;
}
AND

이번에 열린 PWN 2 OWN 컨테스트의 결과로 ZDnetMacBook Air falls in two minutes at PWN 2 OWN란 기사가 났습니다. 짧은 영어로 번역하면 "맥북 에어 PWN 2 OWN에서 2분만에 나가 떨어지다" 인 것 같습니다.

맥북대신 OS X나 레퍼드가 와야 할 것 같은데 애꿎은 에어가 비난을 받게 되었네요. 다소 친 MS적인 성향을 보이는 ZDnet 뿐만 아니라 많은 기사에서 OS X가 아닌 MacBook Air로 나와있습니다. 맥북 에어엔 당연히 OS X가 깔려 있으니 억지는 아니지만 의도가 궁금하네요.
 
사용자 삽입 이미지
관련 사이트를 가보니 이 아저씨(보기엔 아저씨로 보이지만 얼굴만 보면 아닐지도 모른다는 생각도 듭니다)의 팀에 의해서 성공한 것 같은데 재밌게도 사용한 컴퓨터가 맥북으로 보입니다.

제로데이 어쩌고 하는 것으로 보아 아직 패치가 되지 않은 비교적 최근에 알려진 사파리의 취약점을 공격한 것으로 생각됩니다.

(사진출처: TippingPoint)

관련 사이트들에 달린 댓글들을 보니 이런 우리나라와 비슷하게
'OS X가 해킹당한게 아니고 아무 문제없다'
'결과가 이런데도 mac fanboy들은 역시 수긍을 안한다'
고 역시 치열하게 싸우고 있습니다.

이번 결과로만 놓고 OS의 보안성을 논의 한다는 것은 그다지 의미가 없다고 생각됩니다. 다만 해외 사이트들의 글들을 보아도 저도 중년의 맥 fanboy고 맥과 OS X를 좋아하고 취향에 맞지만, OS X를 완벽한 OS 또는 타 OS 보다 월등하다고 여기는 글들은 사실도 아니고 악플을 달아 달라고 고사를 지내는 것과 같다고 여겨집니다.

저는 회사 다닐 때 부터 지금까지 제 PC를 잘 안 끄는 습성이 있습니다. 이유는 물론 귀찮아서고요. 이런 면에선 지금까지 제 경험으론 Win 200X, OS X, Vista가 가장 안정적이었던 것 같습니다. (데스크탑으로서 Linux는 그리 많이 사용해 보지 않아 잘 모르겠지만 역시 안정적일 것으로 생각됩니다)

지금 쓰고 있는 OS X와 Vista에 새로운 소프트웨어를 무지막지 하게 깔았다 지워보고 합니다. 전혀 증명되지 않은 제 체감에 의한 것이지만 확실히 XP에 비해서는 Vista가 리소스나 이런 부분에서 관리를 잘 하는 것 같습니다. XP와는 달리 수많은 소프트웨어를 설치해도 속도와 안정성을 처음 같이 잘 유지하고 있는 것 같습니다.

개인적으로 IDC에서 리눅스 서버를 운영하고 있습니다. 관리할 사람이 없어 제가 관리하는 데요. 그럴리야 없겠지만 저처럼 덜 떨어진 관리자가 운영하는 서버에 저런 전문가들이 죽자 살자 달려들면 2분은 커녕 2초 안에 root 패스워드가 변경되어 있을 것 같습니다. ^^;
AND