jump to navigation

스노우 레오파드에 오신 것을 환영합니다: Mac OS X 10.6 와 VMware Workstation 7 12월 31, 2009

Posted by yesjun in Apple Mac.
Tags: , , , ,
2 comments

사용하던 맥북프로가 고장을 일으켜 잠시동안 PC에서 Mac을 사용하는 방법을 찾던 중 해외 블로거의 좋은 글이 있어 간단히 번역해 봤습니다.

원문 : Welcome to Snow Leopard: Mac OS X 10.6 and VMware Workstation 7

훈련을 통해 뭔가를 쉽게 할 수 있는 것은 알고 계시죠? 하지만 많은 훈련이 필요 없는 것도 있습니다. 바로: VMware Workstation 7 가상 머신에 맥 OS X 10.6 (일명 스노우 레오파드)를 설치 하는 것. Workstation 7 가상 머신에 스노우 레오파드를 설치 하는 것은 VMware 6.5.2 에 Mac OS X 10.5.6 설치(영문)하는 것 보다 훨씬 쉽게 Mac OS를 설치하도록 지원이 크게 향상되었습니다. 사실 이 버전에서 (저는 7.0.0 빌드 203739), VM웨어 도구를 직접 설치할 수 있고 사운드도 사용 가능 합니다!

정보의 출처

사실 저도 매우 적은 시간의 사용/경험을 가지고 있습니다. 따라서 대부분 내용은 여러 곳(특히 Insanely Mac 포럼)에서 주워들은 것 입니다. 그 포럼에서 Talyn의 게시글은 나에게 DMG 대신, ISO 이미지를 사용하는 것과 Ensoniq 오디오 드라이버 링크에 대한 정보를 제공해 주었습니다.

1 부 : 피자 굽기

시작하기 전에…

파일과 설정에 대해 수정하기 전에, 본 지침을 적어도 한번은 죽 읽어 보시기 바랍니다. 이렇게 하면 모든 단계를 명확하게 하고 놓치는 부분이 없어질 것 입니다.

그럼 시작해 봅시다:

  1. 첫째로, Mac OS X 10.6 (스노우 레오파드)의 정품 버전을 준비합니다. 이번에 소개하는 방법은 오직 정품 버전의 DMG와 함께 작동합니다. 즐겨찾는 검색 사이트를 이용 DMG 찾을 수있습니다. 또한 이번 방법은 DMG 파일을 ISO로 변환해 사용하기 때문에 ISO 버전을 구할 수 있다면, 다음 단계는 건너 뛸 수도 있습니다.
  2. 다음은 DMG파일을 ISO로 변환합니다. 제가 사용하는 dmg2iso를 통해 DMG를 ISO 파일로 변환합니다. 만약 제가 사용하는 변환 애플리케이션 이외의 것을 사용한다면, 변환 후 ISO 파일이 원본 DMG 파일보다 작지 않은 지 주의하세요. 만일 원본 파일보다 작다면 아마도 해당 ISO 파일은 작동하지 않을 것 입니다.
  3. 다운로드 darwin-wks7.zip 그리고 압축을 풀면 “darwin.iso” 파일 하나가 나옵니다. 이후에 본 파일을 사용하기 때문에 압축을 푼 위치를 잘 기억해 두시기 바랍니다.
  4. 다운로드 vmware-darwin-200.zip, 그리고 압축을 풀면 “vmware-darwin-200/”란 이름의 폴더에 모든 파일이 들어 있습니다. 이 파일들은 후에 VMware Workstation 7 설치된 폴더에 복사될 것입니다. 비록 이 압축파일에 설치 방법이 포함되어 있지만, 단순히 압축을 푼 폴더 내에서 “setup.cmd install“란 명령을 치면 자동으로 복사가 완료 됩니다. 그리고 이전에 압축을 풀어논 “darwin.iso” 복사해 “vmware-darwin-200/”로 덮어 씁니다. “darwin.iso” 파일의 덮어쓰기가 끝나면 설치를 진행할 수 있습니다.
  5. VMware Workstation 7에서 새로운 가상 머신(VM)을 만드십시오. 설정은 VMware 6.5.2 에 Mac OS X 10.5.6 설치(영문)에 있는 것과 동일하게 합니다. 인터페이스나 몇 가지 스크린 샷은 VMware Workstation 7에서 약간 변경되었기 때문에 정확히는 일치하지 않을 것입니다. 그러나 본 내용에서 VMX 파일 전체를 변경할 것이기 때문에, 정확히 일치할 필요는 없을 것 입니다.
    (역주:한국과는 맞지 않는 내용이 좀 있어 전체 VMX 파일 교체보다는 라인별 수정을 권장합니다.)
  6. 이제 Workstation 7을 종료 합니다. 새로 새로만든 VM 폴더에서 VMX 파일을 찾습니다; 예를 들어, VM 이름을 “Mac OS X 10.6″로 정했다면, “Mac OS X 10.6.vmx”라는 파일이 있을 겁니다. 텍스트 편집기(워드 프로세서가 아니라 텍스트 편집기 입니다!)로 해당 파일을 엽니다. 전체 파일의 내용을 다음과 같은 내용으로 교체(역주:전에 말씀드린 것 처럼 전체 교체 보다는 라인별 수정을 권장하며 해당 라인은 추후 말씀 드리겠습니다.) 합니다:
    .encoding = "windows-1252"
    config.version = "8"
    virtualHW.version = "7"
    maxvcpus = "4"
    scsi0.present = "TRUE"
    scsi0.virtualDev = "lsilogic"
    memsize = "1024"
    scsi0:0.present = "TRUE"
    scsi0:0.fileName = "Mac OS X 10.6.vmdk"
    ide1:0.present = "TRUE"
    ide1:0.fileName = "M:\SL.iso"
    ide1:0.deviceType = "cdrom-image"
    floppy0.startConnected = "FALSE"
    floppy0.fileName = ""
    floppy0.autodetect = "TRUE"
    ethernet0.present = "TRUE"
    ethernet0.connectionType = "bridged"
    ethernet0.virtualDev = "e1000"
    ethernet0.wakeOnPcktRcv = "FALSE"
    ethernet0.addressType = "generated"
    usb.present = "TRUE"
    ehci.present = "TRUE"
    sound.present = "TRUE"
    sound.fileName = "-1"
    sound.autodetect = "TRUE"
    pciBridge0.present = "TRUE"
    pciBridge4.present = "TRUE"
    pciBridge4.virtualDev = "pcieRootPort"
    pciBridge4.functions = "8"
    pciBridge5.present = "TRUE"
    pciBridge5.virtualDev = "pcieRootPort"
    pciBridge5.functions = "8"
    pciBridge6.present = "TRUE"
    pciBridge6.virtualDev = "pcieRootPort"
    pciBridge6.functions = "8"
    pciBridge7.present = "TRUE"
    pciBridge7.virtualDev = "pcieRootPort"
    pciBridge7.functions = "8"
    vmci0.present = "TRUE"
    roamingVM.exitBehavior = "go"
    displayName = "Mac OS X 10.6"
    guestOS = "darwin10-64"
    nvram = "FreeBSD 64-bit.nvram"
    virtualHW.productCompatibility = "hosted"
    extendedConfigFile = "FreeBSD 64-bit.vmxf"
    ethernet0.generatedAddress = "00:0c:29:bd:20:0f"
    tools.syncTime = "FALSE"
    uuid.location = "56 4d 88 b8 b2 24 d5 cc-10 76 a6 69 9f cb f9 46"
    uuid.bios = "56 4d 7d f0 84 2d 67 43-25 a6 19 4f 14 bd 20 0f"
    cleanShutdown = "FALSE"
    replay.supported = "TRUE"
    replay.filename = ""
    scsi0:0.redo = ""
    pciBridge0.pciSlotNumber = "17"
    pciBridge4.pciSlotNumber = "21"
    pciBridge5.pciSlotNumber = "22"
    pciBridge6.pciSlotNumber = "23"
    pciBridge7.pciSlotNumber = "24"
    scsi0.pciSlotNumber = "16"
    usb.pciSlotNumber = "32"
    ethernet0.pciSlotNumber = "33"
    sound.pciSlotNumber = "34"
    ehci.pciSlotNumber = "35"
    vmci0.pciSlotNumber = "36"
    vmotion.checkpointFBSize = "16777216"
    ethernet0.generatedAddressOffset = "0"
    vmci0.id = "347938831"
    tools.remindInstall = "FALSE"

    ich7m.present = "TRUE"
    keyboard.vusb.enable = "TRUE"
    mouse.vusb.enable = "TRUE"
    usb:0.present = "TRUE"
    usb:1.present = "TRUE"
    usb:1.deviceType = "hub"
    usb:0.deviceType = "mouse"
    monitor.virtual_exec = "hardware"
    monitor.virtual_mmu = "software"
    ide1:0.startConnected = "TRUE"
    disable_acceleration = "FALSE"
    checkpoint.vmState = ""
    ide1:0.autodetect = "TRUE"
    vmi.present = "FALSE"
    smc.present = "FALSE"

    VM의 이름과 일치하도록 위 내용중 이탤릭체로된 라인을 변경 합니다. 본 예제에서는 이름으로 “Mac OS X 10.6″를 사용했습니다.
    (역주: 자신의 VMX 파일에서 guestOS = “FreeBSD”로 된 부분을 위에서 처럼 guestOS = “darwin10-64″로 수정 합니다. 이것만 수정하면 다른 라인은 그대로 두어도 됩니다.)

  7. Workstation 7를 다시 시작하고 방금 수정한 VMX파일을 선택합니다. 변환한 ISO 파일(DMG 에서 변환한)을 VM 설정의 “Use ISO image file” 항목을 사용하여 가상 드라이브에 삽입합니다. (현재 예제에서는 M:\SL.iso로 설정되어 있습니다.) 주의 할 점은 VMware 6.5.2 에 Mac OS X 10.5.6 설치(영문)에서 설명한 레오파드 설정과 다르게, 논리 드라이브로 iDeneb ISO에 마운트하여 사용하지 않는 다는 점 입니다.
    (역주: 자신이 만든 VM의 ‘Settings > Hardware > CD/DVD’에서 “Use ISO image file”을 선택하고 변환된 ISO 파일을 선택하면 간단합니다.)
  8. VM의 설정을 확인하고 원하는 것들을 조정합니다. 예를 들어, RAM의 할당을 높이거나, 프로세서의 수를 변경할 수 있는데, 대부분의 경우 그냥 두어도 상관 없습니다.
  9. VM의 전원을 켭니다. 정상적인 경우 부팅 옵션에 들어가기 위해 “F8″키를 입력하라는 메시지가 나타납니다. 절대 VMware 6.5.2 에 Mac OS X 10.5.6 설치(영문)에서 소개한 것 처럼 “그래픽 모드”에 들어가기 위한 편법을 사용하지 말고. 지금은 가능한 해상도를 VM이 자동적으로 설정하게 그대로 둡니다. 이는 추후 VM에 VM웨어 도구를 설치할 것이며, 명시적인 그래픽 모드 설정(부팅 프롬프트나 /Library/Preferences/SystemConfiguration/com.apple.Boot.plist 파일을 수정)은 VM웨어 도구가 활성화되면 어짜피 사용할 수 없게 됩니다. 원한다면(저는 항상 이 플래그를 습니다.) 프롬프트에서 “- v”를 플래그를 입력할 수 있습니다.
    (역주: 저의 경우에는 VM의 전원을 켯을 때 아무 문제없이 자동으로 OS 설치화면으로 진행 되었습니다.)
  10. 일단 OS 설치화면이 표시되면, VMware 6.5.2 에 Mac OS X 10.5.6 설치(영문)에서 처럼 동일한 방법으로 파티션을 설정해 설치하는데, 중요한 차이점은: 스노우 레오파드의 경우에는 “Master Boot Record”포맷이 반드시 “GUID Partition Table”이어야 작동한다는 점 입니다.
  11. 하드드라이브 파티션을 포맷하고 설치를 진행합니다.

제 2 부 : 토핑 추가

이제 스노우 레오파드가 설치되었을 겁니다. (설치된거 맞죠?) 여기서 마지막 손질이 필요합니다. 이제 변환된 ISO 파일을 마운트한 상태로 둔채, 다시한번 VM을 리부팅 합니다. 이때 아무 문제가 없어야 합니다.

마지막으로 할 몇가지 작업:

  1. 스노우 레오파드의 애플 소프트웨어 업데이트를 수행합니다; 예를 들어, 저의 변환 ISO 파일의 Mac OS 버전은 10.6 이었지만 업데이트 후 10.6.2 가 되었습니다. 재부팅 후에 업데이트가 적용됩니다.
  2. 다운로드 및 설치 Ensoniq Audio Driver for Snow Leopard. 이 패키지는 스노우 레오파드에서 VM의 오디오를 사용 가능하게 합니다. (오예!)
  3. 마지막으로, VM웨어의 배포 도구를 설치합니다. 이 패키지를 설치하면, Mac OS X 시스템 환경 설정을 통해 VM의 화면 해상도를 변경할 수 있습니다.
    1. 스노우 레오파드에서 “Mac OS X 설치 CD – ROM”을 꺼냅니다. 이것은 변환된 ISO 파일을 언마운트 합니다.
    2. VM이 실행된 상태에서 Workstation 7 하단에 CD – ROM 모양의 아이콘을 마우스 오른 클릭 하여 팝업 메뉴를 엽니다:

    3. “Settings…”를 클릭하여 나오는 화면에서, 이전에 변환된 ISO 파일을 마운트 했던 것처럼 “Use ISO image file”를 선택하고 “vmware-darwin-200\darwin.iso” (기억 나시죠?)을 마운트 시킨 후 “OK”를 누릅니다.
    4. 다시한번 Workstation 7 하단에 CD – ROM 모양의 아이콘을 마우스 오른 클릭 하여 팝업 메뉴를 열어 “Connect” 항목을 클릭하여 VM에 장치를 연결 합니다. 이것은 “darwin.iso” 이미지를 실행되고 있는 스노우 레오파드 VM에 마운트 시킵니다:

    5. 마운트된 이미지를 열고 스노우 레오파드 바탕 화면에 “Install VWware Tools” 패키지를 복사합니다:

    6. 스노우 레오파드에서 “darwin.iso” 이미지를 언마운트 합니다. 그리고 이전에 소개한 방법으로 변환된 ISO 파일을 다시 마운트 시킵니다.
    7. VMware Tools 패키지를 설치하고 스노우 레오파드의 VM을 리부팅 하십시오.

제 3 부 : 조각으로 나누어 먹기

제가 생각하기에 이전의 VMware에서 실행되는 레오파드의 번거로움에 비해, 새로운 VMware에서 실행되는 스노우 레오파드는 막힘없고 고통없이 설치 가능하다고 생각합니다. 이제야 말로 여러 잔들 가운데 “성배”라 부를 만한 방법이 나타나 진열장을 차지하게 되었습니다. Mac OS X를 가상 머신에서 실행시키는 것은 더 이상 “새로운 도전”이 아닙니다. 이제 설치 대신에, Mac OS 사용 자체에 초점을 맞출 수 있을 것 입니다.

즐기세요!

역주1) 2006년 당시에는 별의별 꼼수를 써서 설치했는데 정말 감회가 새롭습니다. 진정 “성배”라 부를만 하군요.

역주2) 애플이 이렇게 편해진 설치를 반가워 할까요? 불편해 할까요?
만약 이러한 쉬운 설치가 애플이 원하는게 아니라면 설치를 제한하기 전에, 저같은 사용자(맥이 고장나서 사용 못하는)를 위해 임대 맥이라도 제공했으면 합니다. 사실 맥은 윈도우와 다르게 고장 났을 때 대응할 수 있는 방법이 별로 없습니다.

역주3) 보시는 것처럼 번역이 매끄럽지 못합니다. 궁금하신 사항이 있으시면 덧글로 질문해 주세요. 다만 정품 스노우 레오파드 요청과 구하는 방법과 같은 사항은 답변이 절대 불가능 합니다.

개발 언어의 최면 효과. 1월 1, 2007

Posted by yesjun in Thinking.
add a comment

먼저 나는 개발 언어라는게 변수를 설정하고, 흐름을 제어하고, 데이터 구조를 만들고, 알고리즘을 구현하는 등의 기능적인 측면만을 가지고 있을 뿐만 아니라 개발 언어로 인해 프로그래밍 행동에도 큰 영향을 미친다고 생각한다.
예를 들어 Perl로 개발하는 사람은 절차적인 방법으로 프로그래밍 할 것이고 Java로 개발하는 사람은 객체지향적인 방법으로 개발할 것이다.
물론 Java만 쓰면 누구나 다 객체지향적으로 개발 했다고 보긴 어렵지만, Java에서는 객체지향적으로 개발하는 것이 여러모로 유리하기 때문에 개발자가 객체지향 적인 방향으로 개발하도록 행동이 유도된다.
이는 PHP의 경우를 보면 더 확실해 지는데, PHP는 초장기 절차적인 언어에서 객체지향 언어 기능을 추가하여 발표 되었다. 그러나 이러한 객체지향적 기능에도 불구하고 PHP를 이용한 프로그래밍은 객체지향적으로 흘러가지 않았다. 오히려 객제지향적인 PHP로 잘 만든 코드 혹은 라이브러리를 활용하는 과정에서 점차 절차지향적인 코드가 흘러드러와 섞이는 걸 목격했다. 이것은 PHP에서는 절차적인 언어로 개발하는 것이 불리하지 않으므로 절차지향적 개발 행동이 방해받지 않기 때문이다.

메소드 시그너쳐도 마찬 가지이다. ‘Ruby 양, 우아한 드레스에 운동화 신다.’ 글에서도 썼듯이 Named Parameter 는 단순히 인자에 이름을 붙이는 기능만을 하는 것이 아니라, 이로 인해 Named Prameter 적인 메소드를 개발하도록 행동이 유도된다는 것이다. ‘Ruby 양, 우아한 드레스에 운동화 신다.’ 덧글에서 마임님이 말씀해 주셨듯이 Ruby에서도 Named Parameter 를 쓰는 방법이 있다. 하지만 이 방법은 Hash 형 이름 없는 인자를 쓰는 것이지 시그너쳐 자체가 Named Parameter 를 지원 하는 것은 아니다. 때문에 같은 기능은 하지만 (PHP 경우에서처럼) Named Prameter 적인 메소드를 개발하도록 행동이 유도되지는 않을 것이다.

이러한 행동 유도적인 특성이 개발자가 개발언어를 바꾸기 힘들게 하는 것인지도 모르겠다.
또한 같은 이유로 새로운 개발언어를 배우는 것이 새로운 기능을 익히는 것 이상의 가치를 가지는 것 같다.
여러분이 개발언어로 프로그래밍 하는 동안 자신도 모르게 특정한 개발 행동을 하도록 유도 될지 모른다.
마치 조금식 최면에 걸리는 것처럼…

P.S. Named Parameter 방법이 좋은지 아닌지는 아직 확실치 않다. 무었보다 Named Parameter는 은닉을 깨버리는 원인이 된다. 즉 func(a, b, c)로 하던 func(arg1, arg2, arg3)로 하던 인자 순서와 타입만 지키면 됐지만 Named Parameter는 func(titile:, width:, height:) 처럼 메소드 내부에서 사용하는 인자의 이름까지도 노출하게 된다.

Java 6의 Scripting Language Support를 좀더 보자. 12월 20, 2006

Posted by yesjun in Open Source, Telling.
add a comment

스크립트가 실행되는 방식은,
해당 스크립트 엔진을 생성하는 Factory를 ScriptEngineManager 객체에게 요청하고,
Factory에서 해당 스크립트 엔진을 넘겨 받아 사용하는 방식이다.

ScriptEngineManager mgr = new ScriptEngineManager();
engine = mgr.getEngineByName("javascript");

현재 스크립트 매니져가 가지고 있는 엔진전체의 팩토리를 가져올 수도 있다.
List factories = mgr.getEngineFactories();

현재는 Mozilla Rhino 자바스크립트 엔진 밖에 없지만 추후 여러 언어로 추가 될것 같다.
ScriptEngineFactory Info
Script Engine: Mozilla Rhino (1.6 release 2)
Engine Alias: js
Engine Alias: rhino
Engine Alias: JavaScript
Engine Alias: javascript
Engine Alias: ECMAScript
Engine Alias: ecmascript
Language: ECMAScript (1.6)

사용은 마치 JavaScript나 PHP의 eval() 처럼 사용한다.
try {
jsEngine.eval("print('Hello, world!')");
} catch (ScriptException ex) {
ex.printStackTrace();
}

스크립트의 print() 함수는 Rhino 엔진에서 구현된 콘솔 출력 함수이다.
(JavaScript도 PHP나 Ruby 처럼 html에서 뿐만 아니라 다용도로 사용 가능하다)

java.io.Reader 를 사용한 예이다.

ScriptEngineManager engineMgr = new ScriptEngineManager();
ScriptEngine engine = engineMgr.getEngineByName("JavaScript");
InputStream is =
this.getClass().getResourceAsStream("/scripts/F1.js");
try {
Reader reader = new InputStreamReader(is);
engine.eval(reader);
} catch (ScriptException ex) {
ex.printStackTrace();
}

스크립트의 특정 함수를 호출할 수 있다.
jsEngine.eval("function sayHello() {" +
" print('Hello, world!');" +
"}");
Invocable invocableEngine = (Invocable) jsEngine;
invocableEngine.invokeFunction("sayHello");

자바 객체를 스크립트에서 쓸 수 있다.
List namesList = new ArrayList();
namesList.add("Jill");
namesList.add("Bob");
namesList.add("Laureen");
namesList.add("Ed");

jsEngine.put("namesListKey", namesList);
System.out.println("Executing in script environment...");
try {
jsEngine.eval("var x;" +
"var names = namesListKey.toArray();" +
"for(x in names) {" +
" println(names[x]);" +
"}" +
"namesListKey.add(\"Dana\");");
} catch (ScriptException ex) {
ex.printStackTrace();
}
System.out.println("Executing in Java environment...");
for (String name: namesList) {
System.out.println(name);
}

위의 코드 실행 결과는
Executing in script environment...
Jill
Bob
Laureen
Ed
Executing in Java environment...
Jill
Bob
Laureen
Ed
Dana

이상 간단한 소개는 마치고,
Invocable 인터페이스로 객체넘기는 방법과 스크립트에서 Java 패키지 import 하는 방법 등
자세한 내용은 아래 사이트에서 참고하면 된다.
Scripting for the Java Platform

자바에서 다른 스크립트 언어를 지원하다니…
이래서 Open Source (Sun이 완전한 Open Source 계열은 아니지만) 진영이 좋다.

MS도 VBscript가 있으니 한번 해볼만 할텐데…
다만 VBscript는 만든사람과, 예제코드 따라할 때만 사용한다는 소문이 있다.

Java SE 6 정식 릴리즈 되었다. 12월 20, 2006

Posted by yesjun in Open Source, Telling.
add a comment

Java 5의 기능도 제대로 사용 안한것 같은데, 벌써 6가 릴리즈 되다니…
이번에는 2년만의 버전업인데 개발이 상당히 빨랐던 것 같다.

기존 5가 오토박싱과 제네릭과 같은 언어적인 추가가 많이 이루어 졌다면,
이번 6는 성능향상과 웹개발을 위한 추가가 많이 이루어 진것 같다.

추가되는 기능을 간단히 정리하면,

  • New Security Features and Enhancements
  • Integrated Web Services
  • Scripting Language Support (JSR 223)
  • Enhanced Management and Serviceability
  • Increased Developer Productivity
  • Improved User Experience

특히 주목할 내용은 New Security Features and Enhancements 와 Scripting Language Support 인것 같다.

New Security Features and Enhancements를 보면,
GSS/Kerberos 등을 포함한 보안/인증 기능이 기본으로 포함된다.
더이상 보안 라이브러리 가져다 쓸필요도 없고 성능도 최적화 됐다.

Scripting Language Support를 보면,
JavaScript, PHP, Ruby, Phython 등을 자바에서 String 형식이나 java.io.Reader 를 통한 방법으로 사용할 수 있다.
물론 자바객체도 스크립트로 넘겨 직접 사용할 수 있게 해준다.

MS가 내년 Vista를 등에 업고 .NET 3.0 을 보급시키기려는 활발한 움직임에,
Sun도 급하긴 급했나보다.
Sun이 이렇게 빠른 움직임을 보이는 건 처음 봤다.

조립 PC에 Mac OS X 설치하다!!! 12월 15, 2006

Posted by yesjun in Apple Mac, Doing, Feeling.
add a comment

용산에서 Asus 보드 등등으로 조립한, PC에 Mac OS X 10.4.7 Tiger 를 설치했다.
Mac OS X 가 출현 했을 때부터 사용하고 싶어 안달했던 OS 였는데,
금년 부터 Mac 이 Intel CPU를 쓰면서 부터 점점 쉽게 설치할 수 있는 가능성이 보이더니…
Mac OS X Desktep Capture
결국……

특히 근래 Keynote 프리젠테이션을 보고 감명받아 설치 욕구가 상승하던 중,
Keynote 3

몇일 전 Apple 개발자 사이트의 경악할 만한 문구를 보고 참지 못하고 냅다 설치했다.
Xcode 3.0

Xcode 3.0은 여러분이 계속 추구해왔던 성능을 갖추었을 뿐만 아니라 새로운 기술도 적용되었습니다. 따라서 놀라울 정도로 멋지며 더 많은 기능을 갖춘 Mac 응용 프로그램을 더 빨리 만들 수 있습니다. 기능에 촛점이 맞추어진 그래픽 통합개발환경(IDE)을 즐겨보십시오. 디버거(debugger)는 어떻게 작동하는 지 보고 싶어서 일부러(?!@ 덜덜) 에러를 낼 정도로 뛰어납니다. 여기에 여러분의 마무리만 추가하면 고객이 벌린 입을 다물지 못할 만큼 멋진 프로그램이 될 것입니다. 이 모든 것은 여러분과 Xcode 3.0이 이루어 낸 일입니다.

더구나 프로그래밍 시각화 툴이라는 Xray 도 지원한다.
Xray

디버깅을 하면서 추가 도움이 필요한 경우에는 Xcode 3.0에 새롭게 포함된 Xray를 사용하십시오. Xray는 GarageBand(?!@ 이건 음악 작곡 프로그램 아닌가) 같은 타임라인 편집기에서 인터페이스 큐를 제공하므로 응용 프로그램의 성능을 시각화할 수 있습니다. 이전에는 그 누구도 생각하지 못했던 기능입니다. 여러분의 응용 프로그램에 다른 기능을 추가하면 해당 코드의 분석 결과를 즉시 확인할 수 있습니다. 읽기/쓰기 액션, UI 이벤트, CPU 점유율을 동시에 추적할 수 있으므로 이들의 관계도 쉽게 결정할 수 있습니다.

하지만, 이런건 Mac OS X 다음 버전인 Leopard에서 지원한다는 거(쳇)

요즘 많은 회사(MS나 Apple과 같은 OS 제작 회사는 물론이고)들이 개발의 효율성을 높이기위해 다양한 툴을 출시 하는것 같다.
과연 2007년에 어떤 툴이 이슈가 될지 사뭇 기되된다.

예전에 Mac 이라하면 디자이너 용이라는 느낌이 강했는데, 왜 요즘 개발자들이 Mac을 선호하는 지 약간이나마 알것도 같다.
근데 나는(한국도???) Windows에 심하게 Coupling 되어 있다는 거~

非 MS 개발자가 본 WPF 12월 11, 2006

Posted by yesjun in MS .NET, Thinking.
add a comment

아래 ‘MS WPF 세미나를 다녀와서 느낀점.’ 글에 이어 WPF에 대해 좀더 이야기를 하고자 한다.
WPF 및 .NET Framework 3.0 에대한 내용은 아래 ‘특집기사 Microsoft WPF’를 참조하기 바란다.
일단 WPF 애플리케이션 데모 동영상 (봤어도 다시한번)을 보자.

물론 화면에 나오는 애플리케이션들을 말그대로 MS Expression 제품군에서 드래그&드롭으로 쉽게 만들 수 있는 건 아니다.
디자이너가 필요한건 물론이고, 전문 Presentation Layer(UI라고 할 수도 있으나 WPF는 기존 UI 뿐만 아니라 좀더 깊이 관여해 화면에서 보여지는 모든 부분을 책임지기 때문에 Java Framework에서 주로 사용되는 Presentation Layer 라는 용어를 사용하겠다) 프로그래머(C#이나 VB .NET 을 사용)가 이벤트와 동작을 프로그래밍 해야 한다.

그런데 이러한 판타스틱한 사용자 화면은 이미 오래전 부터 Apple의 Mac OS X 에서 사용되고 있다.
특히 그래픽카드의 3D 성능을 게임 이외의 곳에서 사용한다는 기술은
Mac OS X의 Quartz Extreme 으로 또한 예전에 사용되고 있다.

그러면, WPF는 그냥 MS의 홍보전략으로 치부하고 무시해 버릴 것인가,
혹은 나는 Presentation Layer 와는 관계없으니 그러려니 하고 넘어갈 것인가.

WPF는 .NET의 Server-Client 통신 및 연결을 담당하고 있는 WCF와 밀접하게 관계되어 있다.
물론 다른 전송 프로토콜인 Soap나 REST와 같은 방식을 이용할 수 있으나,
WPF는 WCF를 써야만 제성능을 발휘할 수 있고 쉽게 연동된다.

더구나 MS의 판매 전략 특성상 WPF를 사용하면(MS Expression 제품을 써서) WCF를 비롯한 .NET Framework 전체를 사용해야 편하고,
이러다 보변 대부분의 개발은 VS 2005로 하게되고 버전 및 형상관리는 VS Team Sytem을 쓸 것이고,
DB도 지금 쓰는 Oracle이나 MySQL 보다는 MS SQL을 사용하기 쉽다.

결국 WPF는 Presentation Layer 라고 따로 떨어뜨려 생각하기 보다,
.NET Framework 및 MS 개발 솔루션을 전파시키는 선봉장이라 할 수 있다.

(옮김) 특집기사 Microsoft WPF 12월 11, 2006

Posted by yesjun in MS .NET.
1 comment so far

Windows Vista and WinFX™
차세대 운영체제 이런 예기는 이미 충분히 들었을 줄로 안다.
Windows Vista에 대한 예기들을 하면서 깔끔한 UI, 강화된 보안기능등에 대한
예기를 하면서도 정작 엄청나게 바뀐 내부적인 변화에 대해서는 섵불리
예기 하기가 쉽지 않은것은 그 변화 폭과 내용이 너무 엄청나서 일 것이다.

누가 그랬던가 Windows 3.x에서 Windows 95가 나올때 이상의 변화이다 라고
물론 그때도 UI적인 측면이 충격적으로 바뀠지만 그 보다 더 중요한 변화라고 하면
Win16 API에서 Win32 API로의 환경적인 변화가 실상 더 큰 변화 였다.

이번의 Windows Vista의 변화 역시 Win32 API와 .NET Framework가
WinFX라는 환경으로의 충격적인 진화와 확장이 된 버전으로 그 내부적인 환경의
변화를 설명할 수 있다.
 Windows API V.Next

WinFX는 아래와 같이 세 부분으로 크게 구성되어 있다.
-WPF -Presentation Foundation
-WCF -Communication Foundation
-WWF -Workflow Foundation

UI의 혁명적 변화를 이끌어 낼 WPF와 SOA를 단일환경으로 통합시릴 수 있는 WCF
그리고 Workflow로 비지니스 프로세스를 구조화 할 수 있는 WWF와 같은 요소들은
바로 WinFX를 구성하고 있는 주요 구성 요소이다.

이 중에서도 설명해 드릴 내용은 WPF라고 하는 UI의 혁명이다.
제가 백마디 하는 것 보다 데모 동영상을 보고나서 계속 이어가겠다.

동영상 URL:http://www.microsoft.com/products/expression/en/demos.mspx

일단은 보기에는 멋있다. 멋있는 정도가 아니라 무슨 방송용 화면이나 광고같기도 하다.
심지어는 마이널리티 리포터의 한 장면이 떠오를라 하려고 까지 한다.
문제는 저런 화면을 실제로 구현할 수 있는가 하는 것이다.
KBS 개그맨 중에서 백수들의 애환을 다루고 있는 누구는
“안돼는게 어딧니~” 라는 대사로 항상 코너를 마무리 지었다.
말 그대로 안되는 건 사실상 거의 없다. 하지만 그 정도의 혁신적인 UI와 환경을
구축하는데 얼마 만큼의 시간과 비용이 소비되는가 하는게 문제 일 것이다.

WPF는 이런 완성된 그리고 엄청난 UI를 비교적 쉽게 구현할 수 있는 환경을 예기하고
있다. WPF는 아래와 같은 구성 요소를 가지고 있다.

WPF 구성

WPF는 위의 그림에서 볼 수 있듯이 XAML(Extensible Application Markup Language)
와 C#과 같은 언어로 구성되어 있다.
XAML은 UI를 구성하는 XML의 일종으로 WPF에서 UI의 모든 부분을 담당하고 있다.
UI를 XAML로 구성하면서 UI에 대한 관리가 좀더 직관적으로 변하였고 융통성 있게
관리할 수 있는 장점이 생겼다.

Markup tag로 애플리케이션 구축 할 수 있게 되였고 단순한 명시적 선언구조에
어떤 CLR 객체 구조 표현 가능해 졌다. 또 코드와 내용의 효과적 분리가 되었고
설계자와 개발자 사이의 협업과 동시작업이 가능하다.

XAML로 구성된 UI의 실제 기능은 C#, VB.NET, Java Script등으로 구성할 수 있다.

WPF의 핵심 구성요소로 다음과 같은 내용들을 제공해 준다.
-탐색, 윈도우, 대화상자에 대한 지원
-UI Data binding, 확장 layout 및 풍부한 control objects,
-2D와 3D 그래픽, Animation, Media, Document

엄청나지 않은가 기본적인 폼 이외에도 각종 Media와 2D, 3D 그래픽까지 모두 다룰
수 있게 되었기 때문에 위의 데모 동영상에서 본 것과 같은 화려한 화면을 구상할
수 있게 된 것이다.

또 WPF는 기본적으로 아래와 같이 OS를 지원할 예정이다.

-Windows의 다음 버전인 Vista에 포함예정
-Windows XP SP2와 Windows Server 2003 SP1에는 WinFX 런타임의 일부로 제공될 예정
-Windows Presentation Foundation Everywhere(WPF/e)
  XAML과 Javascript에 기반을 둔 WPF의 mobile version
  3D 기능은 제공되지 않음, 그러나, XPS, vector-based drawing,
  hardware acceleration은 제공

위의 내용을 정리해 보면 WPF는 Vista 부터 본격적으로 지원이 되지만
Windows XP나 Windows 2003에서도 그 기능을 사용할 수 있다. 또한 Web Application과
Windows Application을 공통적으로 개발할 수 있는 기반이 된다.

이 비슷한 기술들이 이미 RIA(Rich Internet Application)라는 이름으로 나와 있는
제품들도 많이 있다. 가장 대표적인 재품은 Adobe사의 Flex가 그 예이다.
하지만 Flex은 현재 몇가지 치명적인 문제점들이 보이는데
디자이너와 개발자의 협업과 성능, 보안 문제들이 존재한다.

디자이너와 개발자의 협업은 보통 일정 규모 이상의 프로젝트에서 사용하는 형상관리
툴인 CVS나 Visual Source safe, Team System 중에서 CVS만 지원하고 있으며 이는
규모 있는 Project의 운영에 치명적인 약점으로 작용한다.

둘째 성능상의 문제는 Flex는 모든 화면 처리를 CPU가 직접 계산하고 있기 때문에
화면 해상도가 높아지고 Control수와 Effect가 많아지면 화면이 끊기고
CPU점유율이 100%를 상위하는 경우를 쉽게 볼 수 있다.
처리 결과를 보여주어야 할 화면이 처리를 못하게 CPU를 점유하는 아이러니가 남게
되는 것이다.
또 아직은 성능과 보안적인 이슈를 않고 있기 때문에 비교적 데이터양이 적은
영화 예약과 같은 곳에 한정적으로 활용되고 있다.
그럼 WPF의 경우는 어떠한가 WPF는 형상관리 툴을 적극적으로 활용할 수 있으며
Microsoft에 제공하는 개발도구들은 모두 Team System과 Visual Source Safe를 활용 할
수 있게 되어 있다. 또한 WPF는 일반적으로 우리가 3D 가속 칩으로 알고 있는 GPU를
활용할 수 있게 되어 있다. 이는 CPU의 부하를 획기적으로 줄여주면서 더 매끄럽고
화려한 효과를 줄 수 있다. (Nvidia 혹은 ATI의 제품들이 소위 말하는 GPU)이다.

아직 보안과 성능에 관련한 이슈에 대한 답은 아직 WPF라도 처리 방법을 지금은 테스트
해보지는 않았으나 나름 방법은 있을 것이라 기대하고 있다.

WPF를 이용하기 위한 개발환경을 구성하기 위해서는 무엇이 필요한가?
WPF는 WinFX의 한 부분이며 따라서 WPF를 설치하고 테스트 해보기 위해서는 WinFX 개발환경을
구성해야 한다. WinFX의 개발환경을 구성하기 위해서는 설치할 것도 많다.
하지만 WinFX가 정식 발표 되었을 때는 개발도구에 모두 통합되어서 간단히 설치 할 수도
있을 것 같다. WinFX를 사용하기 위해서 설치해야 되는 목록과 순서는 아래와 같다.

이 순서는 친절한 성철씨가 3일간 삽질한 결과로 올려 놓은 것이라 한다.
이 자리를 빌어서 감사의 말씀을 드립니다.
http://lovewiz.pe.kr/31

1. Windows XP SP2 or Windows Server 2003 SP1 설치된 깨끗한 컴퓨터
(Windows Vista도 가능)

2. WinFX Runtime Components 다운로드 및 설치
http://msdn.microsoft.com/windowsvista/downloads/getthebetaaspx?FamilyId=AD0CE56E-D
7B6-44BC-910D-E91F3E370477&displaylang=en

3. Visual Studio 2005 설치

4. Windows SDK 다운로드 및 설치
http://www.microsoft.com/downloads/details.aspx?FamilyId=9BE1FC7F-0542-47F1-88DD-61E3EF88C402&displaylang=en

5. Visual Studio Extensions for WinFX 다운로드 및 설치
http://www.microsoft.com/downloads/details.aspx?FamilyId=AD0CE56E-D7B6-44BC-910D-E91F3E370477&displaylang=en

6. Interactive Designer 다운로드 및 설치(Option)
http://www.microsoft.com/downloads/details.aspx?familyid=D0161985-AE53-4794-9860-61A4906587F0&displaylang=en

Windows SDK를 설치하고 나면 C:\Program files\Windows SDKs\ 하위에 Sample code가 있으며
Sample code를 통해서 전체적인 모습을 보실 수 있다.

 

김영욱 Microsoft MVP
blog: blog.naver.com/microsoftMVP

Web: www.winkey.pe.kr

email: iwinkey@Hotmail.com

MS WPF 세미나를 다녀와서… 12월 10, 2006

Posted by yesjun in Feeling, MS .NET, Watching.
1 comment so far

MS WPF 세미나를 다녀와서 느낀점.

  1. MS 세미나는 세미나라기 보다, 교육(선생-학생 관계)의 느낌이 강하다
  2. 개념보다 도구 사용법을 알려준다
  3. 프리젠테이션 화면이 너무나 무척 (정신없을 정도로) 화려하다 (특히 Keynote로 하는 PT에 비하면 더욱)
  4. 경쟁 솔루션(이번엔 Flex)의 나쁜점만을 교묘하게 들춰내어 깐다 (Open Source 진영이 MS를 깔때는 확실히 ‘MS 솔루션이 좋을지도 모르지만, 나는 싫다고 하면서 깐다)
  5. 경쟁 솔루션과 비교할때 동등한 조건이 아니라 MS에게 유리한 조건으로 해놓고 비교한다 (이번엔 WPF 애플리케이션과 Flex를 비교, WPF/E 와 Flex 를 비교해야 맞다)
  6. 예제 소스코드를 보면 냄새 (if 문의 과다한 사용-strategy 패턴으로 바꿀 수 있을 텐데)가 난다 (Java 세미나에서는 쪽팔려서라도 리팩토링을 해준다)
  7. A 솔루션을 쓰면 B 솔루션도 있어야 한다 (MS Expression Blend를 쓰면 VS 2005가 있어야 한다)
  8. MS는 돈되는 프로젝트에서 많이 쓴다고 강조한다 (즉 Open Source는 돈 안된다는 말이다)
  9. 돈쓴 느낌이 팍팍 난다 (의자와 프로젝터와 음향 시스템과 세미나실 모두)
  10. 접수 받는 분이나 도우미들이 모델급이다

하지만 세미나 끝나고 돌아오면 상품소개 받은 느낌만 남는다.

blogger.com과 블로그 서비스. 12월 2, 2006

Posted by yesjun in Doing, Google.
add a comment

그동안 정들었던(1달정도 썼나…) blogger.com에서 이곳 wordpress.com으로 블로그 서비스를 바꿨다.
다행이 blgger.com의 글을 임포트하는 기능(LiveJournal도 지원한다)이 있어서, 손쉽게 옮길수 있었다.
이럴 땐 정말 사람들이 많이 쓰는걸 선택하길 잘했다는 생각이 든다.

blogger.com은 쉽고 편리한 사용법으로 초기 블로그 서비스를 선도했던 사이트다.
더구나 구글에 인수되면서 블로그 시장을 주도할 것으로 예상했다.
그런데 여기에는 몇가지 문제가 있다.

  • 처음에는 쉽고 편리한게 좋지만, 사용자들은 점점더 어렵지만 강력한 기능을 원한다
    - 자유로운 페이지 레이아웃 변경 및 플러그인 기능
  • 블로그 표준 기술의 발전속도에 비해 blogger.com에서는 신기술을 더디게 적용한다
    - trackback 이나 RSS 등
  • 구글과의 연동이 미약하여 큰 시너지 효과는 얻지 못했다
    - 구글 계정과 blogger.com의 계정을 통합하지 못했고, 기타 특별한 연동기능도 없다
  • 현재 서비스가 불안정 하다
    - 서버가 갑자기 느려지거나 세션이 이유 없이 끊기는 등 시스템이 아직도 불안정 하다
  • blogger.com 다음 버전으로의 서비스 업그레이드가 원활하게 진행되지 않는다
    - 다음 버전으로 업그레이드를 하려고 업그레이드 링크를 클릭하면, 페이지가 없거나 서버가 반응하지 않는다

blogger.com이 다음 버전에 총력을 기울이고 있는 건 알겠지만, 패키지 프로그램 판매가 아닌 서비스를 제공하는 회사라면
제공하는 서비스의 질을 일정수준 유지시켜야 한다.
아무리 “조금만 참고 기다려 주세요, 곧 최고의 블로그 애플리케이션을 보여 드리겠습니다.” 라고 애원한들
기쁨마음으로 참고 기달려줄 고객은 드믈다.

Ruby 양, 우아한 드레스에 운동화 신다. 12월 1, 2006

Posted by yesjun in Ruby, Thinking.
6 comments

Ruby는 우아한(Elegant) 코드 작성을 자랑하는 언어다.
블록, 영어식 코딩, 괄호 제거 규칙, 덕 타이핑 등등.
그런데 루비는 인자의 위치로 메소드의 시그니쳐를 구분한다.
루비에서도 당연히 될 줄 알았는데 이름은 같고 인자갯수가 다른 메소드를 만들면, 나중에 만든 메소드가 처음 만든 메소드를 덮어 씌여 버린다.

def sameMethodName(one)
puts "One!"
end

def sameMethodName(one, two)
puts "two!"
end

sameMethodName(1, 2)

two!

sameMethodName(1)

ArgumentError: wrong number of arguments (1 for 2)

운동화가 아니라 쓰레빠 였나…

예를 들어 다음은 일반적인 루비 자바 메소드 호출 방법이다.

window.addNewControl("Title", 20, 50, 100, 50, true)

뭔가 컨트롤을 만드는 거 같은데 무슨 인자가 들어가는지는 API 문서나 메소드 선언부를 봐야 한다.

아래와 같은 인자 갯수가 다른 하지만 동일한 기능을 하는 메소드를 한개 더 보자.

window.addNewControl("Title", 100, 50, true)

2개의 인자가 기본값을 취하는 것 같은데 이 또한 API 문서나 메소드 선언부를 봐야 좀 알거 같다.

다음은 Objective C 에서 메소드를 호출하는 모습이다.

[window addNewControl WithTitle:@"Title"
xPosition:20
yPosition:50
width:100
height:50
drawingNow:YES];

그렇다, “Title”이란 이름으로 (x, y) 위치가 (20, 50)으로 너비가 100, 높이가 50 인걸 지금 그리란 이야기다.

[window addNewControl WithTitle:@"Title"
width:100
height:50
drawingNow:YES];

이건 아까 호출한 메소드랑 똑같은데, 위치가 기본값으로 들어가는 군.

이렇게 인자의 이름(키값)으로 메소드 시그니쳐를 구별하는게 Named parameter 방식이다.
그리고 이름만 같으면 순서는 상관없다.

[window addNewControl WithTitle:@"Title"
height:50
width:100
drawingNow:YES];

이런 우아한 방식을 왜 Ruby에서 안쓸까?
마침 이러한 Ruby에서의 Named parameter에 대한 토론을 볼 수 있었다.

Matz와 Tsela의 덧글을 중심으로 정리해 보면 Named parameter 방식은 인자조차 public 하게 공개된다는 것이다.

음… 그렇군 하이힐을 신으면 우아하기는 하지만 디스크와 발 형태 변화를 일으킬 수 있군.
미안해 Java군 그동안 우아하지 못한 운동화에 츄리닝 입었다고 뭐라고 해서.
사실 구두에 화려한 턱시도 입고 뛰기는 힘들겠지.
그리고 Ruby양, 운동화 신었지만 충분히 이뻐.
운동화는 어느정도 괜찮겠는데 쓰레빠는 쫌…

그런데 Ruby양은 좀더 우아해 지기 위해 구두를 구입하려고 생각 중이다.

팔로우

Get every new post delivered to your Inbox.