Junction으로 NTFS에서 link 사용하기

unix/linux를 사용하다 보면 ln 이라는 유틸리티를 자주 접하게 됩니다.

ln은 symbolic/hard link를 생성하는 유틸리티로, 현재 위치에 가상으로 존재하며 이 파일에 접근하면 원본 파일에 접근하는 것과 동일하게 사용할 수 있습니다.
Windows에서는 단축 아이콘이라는 비슷한(?) 개념이 있지만 사용하다 보면 단축아이콘의 기능만으로는 충족되지 않을 때가 있습니다. 단축 아이콘을 생성한 파일을 hex editor로 연다던가... 그러면 원본 파일이 열리는게 아닌 lnk파일이 열릴 뿐이죠.
ln과 같은 기능을 수행하는 유틸리티를 찾아보니, Sysinternals에서 제작한 Junction이라는 유틸리티가 있었습니다.
Junction은 http://technet.microsoft.com/en-us/sysinternals/bb896768.aspx 에서 다운로드를 하시면 됩니다.

사용 방법은 간단합니다.

1. <경로>에 junction이 있는지 확인

junction -s <경로>

2. <원본>을 <사본>으로 junction 생성

junction <사본> <원본>

3. <사본> junction 삭제

junction -d <사본>

junction의 사용 예를 들면 다음과 같습니다.

1. c:\에 junction_test라는 디렉토리를 생성한 뒤 1.txt라는 파일을 만들었습니다.

C:\junction_test>dir
 C 드라이브의 볼륨에는 이름이 없습니다.
 볼륨 일련 번호: 0000-0000
 C:\junction_test 디렉터리
2009-04-27  오전 10:14    <DIR>          .
2009-04-27  오전 10:14    <DIR>          ..
2009-04-27  오전 10:14                16 1.txt
               1개 파일                  16 바이트
               2개 디렉터리  22,408,437,760 바이트 남음

2. 1.txt파일의 내용은 다음과 같습니다.

C:\junction_test>type 1.txt
http://b4you.net

3. d:\로 이동하여 junction을 생성합니다

C:\junction_test>d:
D:\>junction junc c:\junction_test
Junction v1.05 - Windows junction creator and reparse point viewer
Copyright (C) 2000-2007 Mark Russinovich
Systems Internals - http://www.sysinternals.com
Created: D:\junc
Targetted at: c:\junction_test

4. junction이 제대로 연결되었는지 확인합니다

D:\>cd junc
D:\junc>dir
 D 드라이브의 볼륨에는 이름이 없습니다.
 볼륨 일련 번호: 0000-0000
 D:\junc 디렉터리
2009-04-27  오전 10:14    <DIR>          .
2009-04-27  오전 10:14    <DIR>          ..
2009-04-27  오전 10:14                16 1.txt
               1개 파일                  16 바이트
               2개 디렉터리  22,408,437,760 바이트 남음
D:\junc>type 1.txt
http://b4you.net

5. d:\junc에 파일을 생성합니다

D:\junc>copy con 2.txt
woo hoo!
^Z
        1개 파일이 복사되었습니다.
D:\junc>dir
 D 드라이브의 볼륨에는 이름이 없습니다.
 볼륨 일련 번호: FCB7-B32F
 D:\junc 디렉터리
2009-04-27  오전 10:16    <DIR>          .
2009-04-27  오전 10:16    <DIR>          ..
2009-04-27  오전 10:14                16 1.txt
2009-04-27  오전 10:16                10 2.txt
               2개 파일                  26 바이트
               2개 디렉터리  24,657,281,024 바이트 남음

6. c:\junction_test에 2.txt가 생성되었는지 확인합니다

D:\junc>cd /d c:\junction_test
C:\junction_test>dir
 C 드라이브의 볼륨에는 이름이 없습니다.
 볼륨 일련 번호: 441D-C919
 C:\junction_test 디렉터리
2009-04-27  오전 10:16    <DIR>          .
2009-04-27  오전 10:16    <DIR>          ..
2009-04-27  오전 10:14                16 1.txt
2009-04-27  오전 10:16                10 2.txt
               2개 파일                  26 바이트
               2개 디렉터리  24,657,281,024 바이트 남음

7. 2.txt 파일의 내용을 확인합니다

C:\junction_test>type 2.txt
woo hoo!
C:\junction_test>

삭제를 위해서는 -d 옵션을 지정하거나 그냥 삭제하시면 됩니다.

크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 장현준

2009/04/27 10:28 2009/04/27 10:28
, , ,
Response
No Trackback , No Comment
RSS :
http://b4you.net/blog/rss/response/219

Failed to start remote debug server... 오류

iPod을 연결한 뒤 컴파일 해서 올리니...

Failed to upload <XXX>.app


와 같은 오류가 나온다.

다시 한번 컴파일 해서 어찌어찌 업로드 하더라도


Failed to start remote debug server for <XXX>.app on <???>'s iPhone


와 같은 오류 메시지가 나온다.

Google님께 여쭤 봐도 정확한 방법이 안나오는데, (그렇다고 여기에 해결 방법이 써있는건 아니다...-_-)

다시 되게 하기 위해 개인적으로 시도했었던 방법을 적어놓으려고 한다.


보자면 remote debug sever를 시작할 수 없기 때문에... iPod 쪽에서 remote debug server 프로세스(?)를 실행하지 못하여 발생하는 문제라 생각된다. iPod를 다시 깔면 되지만.. 그 시간동안 심심하니..;;


= 여기는 제가 시도했던 방법입니다

1. iTunes 종료 후 시도

2. rebooting (전원 길게) 후 시도

3. usb선 연결+해제 반복 후 시도

4. 프로젝트 업로드(컴파일 + 실행) 계속 후 시도



= 다음은 주워들은 방법입니다

1. hard booting (전원 + 홈키 길게) 후 시도

2. Xcode 재설치

3. iPod reset

4. 프로젝트 clean => 프로젝트 닫고 => Xcode 메뉴 - Empty Caches => 프로젝트 다시 엶




정확한 방법은 아니지만.. 같은 고민을 하고 계신다면 한번쯤은 삽질을..

이래도 안되면 낭패.

크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 장현준

2009/04/14 21:19 2009/04/14 21:19
Response
2 Trackbacks , 2 Comments
RSS :
http://b4you.net/blog/rss/response/218

MacOSX 안전모드로 실행하기

Mac OS X: Starting up in Safe Mode

  • Last Modified: February 05, 2009
  • Article: HT1455
  • Old Article: 107393

Summary

Learn how to start up in Safe Mode.

Products Affected

Mac OS X 10.4, Mac OS X 10.3, Mac OS X 10.2, Mac OS X 10.5

To start up into Safe Mode (to Safe Boot), do this:

  1. Be sure the computer is shut down.
  2. Press the power button.
  3. Immediately after you hear the startup tone, hold the Shift key. The Shift key should be held as soon as possible after the startup tone but not before.
  4. Release the Shift key when you see the gray Apple icon and the progress indicator (looks like a spinning gear).

During startup in Mac OS X 10.4 or later, you will see "Safe Boot" on the login window, which appears even if you normally log in automatically.

During startup in Mac OS X 10.2 through 10.3.9, you will see "Safe Boot" on the Mac OS X startup screen.

To leave Safe Mode in any version of Mac OS X, restart the computer normally, without holding any keys during startup.

Additional Information

Advanced: If you can't Safe Boot with a keyboard

If for some reason you can't use the keyboard method to start in Safe Mode (the keyboard is missing or not working, for example), and you already have remote access to the computer, you can configure the computer to startup in Safe Mode via its command line

  1. Access the command line by either opening Terminal remotely, or by logging into the computer from another via SSH.
  2. Execute the following command in Terminal or on the command line:

    sudo nvram boot-args="-x"

    (If you want to start in Verbose mode as well, use sudo nvram boot-args="-x -v" instead )
     
  1. After using Safe Boot, to return to a normal startup, execute this command in Terminal or the command line:

    sudo nvram boot-args=""


See also:


http://support.apple.com/kb/HT1455?viewlocale=en_US
크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 장현준

2009/04/14 17:30 2009/04/14 17:30
,
Response
No Trackback , No Comment
RSS :
http://b4you.net/blog/rss/response/217

UITextView로 focus주기

MFC에서는 setFocus()와 같은 함수가 있는데, UITextView에서는 focus개념이 없고 responder 개념이 있는데,  setFocus에 상응하는 메서드는 becomeFirstResponder 입니다.

UITextView *textView;
// textView 초기화..........
// 초기화가 끝났다면 다음을 통해 foscus를 줌
[textView becomeFirstResponder];

firstResponder가 되게 하여, 이벤트를 가장 처음으로 받게 한다는 것 입니다. (첫번째 응답자(?)가 되게 하는거죠)
lost focus에 상응하는 메서드는 resignFirstResponder 입니다.
크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 장현준

2009/04/13 19:42 2009/04/13 19:42
, , ,
Response
No Trackback , No Comment
RSS :
http://b4you.net/blog/rss/response/216

VS2005에서 dialog-based 프로젝트를 생성한 뒤에 보면 "잘못된 글꼴입니다" 뭐 이런식으로 나와서..

짜증나게 하는데 이럴 때 아래와 같이 바꿔주면 된다고 하는군요.

[버그재구성]

  1. 새 프로젝트(New Project)를 만들때 MFC 관련 프로젝트를 선택하여 생성한다.
  2. 위저드(App Wizard)에서 한글 리소스를 선택한다.
  3. 리소스 파일(.rc)을 클릭해서 리소스 뷰(Resource View)를 연다.
  4. 생성된 대화 상자(Dialog) 리소스를 선택하여 에디터를 연다.
  5. 버튼(Button)등을 추가했다가 삭제한다.

[버그내용]

생성된 대화 상자(Dialog)에서  컨트롤을 삭제할 시에 매번 무관한 에러 "Bad font face.(글꼴이 잘못되었습니다.)"가 발생한다. 문제가 되는 대화 상자가 생성되는 경우는 정보 대화 상자(About Box)와 대화 상자 기반 MFC Application의 대화 상자등 위저드(Wizard)가 생성한 대화 상자들이다. 새로 추가하는 대화 상자(Dialog) 리소스는 해당되지 않는다.

[버그원인]

위저드(Wizard)에서 프로젝트를 생성하기 위해 사용하는 템플릿에는 다이알로그 리소스가 "MS Shell Dlg"라는 폰트 Face를 사용하도록 설정되어있다. 폰트 Face이기 때문에 번역되지 말아야할 이 부분이 "MS 셸 대화 상자"로 잘못 번역되어 존재하지 않는 폰트 Face로 인식하여 오류가 발생하게 된다.

[버그해결방안]

VS2005를 설치한 드라이브의 \Program Files\Microsoft Visual Studio 8\VC\VCWizards\AppWiz\MFC\Application\templates\1042 디렉토리를 열고 all.rc와 dlg.rc에서 "MS 셸 대화 상자"를 "MS Shell Dlg"로 치환(Replace)한다.



것.. 참... 웃깁니다.

http://blogs.msdn.com/bkchung/archive/2005/10/10/478990.aspx
크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 장현준

2009/04/13 14:08 2009/04/13 14:08
Response
No Trackback , No Comment
RSS :
http://b4you.net/blog/rss/response/215

View와 View Controller의 관계

제가 지금보다 더 초보였을때 "도대체 View Controller를 왜 쓰는거지?" 라는 생각을 하였습니다.
오늘은 저와 같은 newbie들을 위해 그에 대한 답('정답'은 아닙니다ㅎㅎ)을 생각해보고자 포스팅 하게 되었습니다.


UIViewController를 사용하지 않고도 얼마든지 응용 프로그램을 작성할 수 있습니다.
그렇다면 왜 UIViewController를 사용하는 것일까요?

UIViewController는 View의 Container역할을 합니다.
이 Container안에서, View들의 계층 구조등을 작성할 수 있습니다.

말이 애매한데, 조금 달리 말해보겠습니다.
UIViewController를 사용하지 않고 계층적으로 View를 생성하기 위해서는 다음과 같은 방법이 있습니다.

1. delegate에서 view들 추가
2. view를 subclassing하여 view안에 view추가

물론 이것 말고도 기상천외한 방법들이 있을 것이라 예상되지만, (제가)자주 사용하는 방법은 위와 같습니다.

여기서 1번인 delegate에서 view들을 추가하는 방법을 보겠습니다. applicationDidFinishLaunching: 메서드에서 main view들을 만들고 계층적으로 구성할 수 있습니다. 1번 view에 addSubView: 하고, 이 뷰에 다시 addSubView: 하는 방법으로 말이죠.

2번의 경우 subclassing하여 initWithFrame:과 같은 메서드 안에서 계층적으로 구성할 수 있습니다.

이렇게 할 경우 문제가 있냐? 하면... 일반적인 경우에 없다고 생각할 수 있습니다. 그렇다면! 어떤 경우에UIViewController를 사용하게 되는지 살펴보겠습니다.

UIViewController를 하나 생성한 뒤 loadView 메서드에서 view"들"의 계층 구조를 설정합니다.
즉, view가 계층적으로 생성되고 (iPhone이)회전되고 메모리가 부족할 경우 현재 사용되고 있는 view들을 release하는 등을 역할 등을 UIViewController에서 전담하게 되는 것입니다. 이 방법을 이용하게 되면 1번이나 2번에 비교하면 좀 더 구조화 할 수 있다는 장점이 있습니다.

기존에 MFC에서는 CDialog들을 사용하려면 "거의" 필수적으로 subclassing을 하고 OnInitDialog(WM_INITDIALOG)에서 계층 구조를 만들고, 하위 CDialog또한 subclassing 하고... 이렇게 처리해야 했는데 이제는 그럴 필요가 없다 이거죠.
(쭉 사용해봤는데 대부분의 기능이 delegate로 분리되어 UIView를 subclassing할 일이 별로 없었습니다)


경험 미숙이라 잘못된 내용이 있을지도 모르지만, "UIViewController 도대체 왜 쓰지?"라는 물음에 약간이라도 도움이 되었으면 합니다.
크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 장현준

2009/04/02 11:20 2009/04/02 11:20
,
Response
No Trackback , No Comment
RSS :
http://b4you.net/blog/rss/response/214

Google CADIE 소개

Google에서 끝말 잇기 게임인 CADIE가 런칭하였습니다.

CADIE는 Cognitive Autoheuristic Distributed-Intelligence Entity의 약자이며, "오랜 연구 결과 개발된 강력한 신기술을 활용하여 컴퓨터의 자율적인 학습 능력과 관련된 문제를 해결함으로써 최초로 전세계적 규모의 자율적 신경 진화 학습 클러스터를 개발하였습니다." 라는 문구와 같이 Google의 자연어 처리 기술이 집약되어 있는 봇입니다.
사용자들은 CADIE와 대화를 하며, 자연어 처리에 대한 진수를 만끽할 수 있습니다.

Google 페이지의 CADIE 소개는 다음과 같습니다.

공지사항
2009년 3월 31일 오후 11:59:59

CADIE 소개

세계 최초의 자가 인식 분산지능 시스템 가동 시작

소규모 연구 센터를 설립해 지난 수 년간 컴퓨터 분야의 난제인 신경망 연구, 자연어 처리, 인공 지능을 활용한 문제 해결 등을 연구한 결과 지난해 가을 획기적인 성과를 얻을 수 있었습니다. 오랜 연구 결과 개발된 강력한 신기술을 활용하여 컴퓨터의 자율적인 학습 능력과 관련된 문제를 해결함으로써 최초로 전세계적 규모의 자율적 신경 진화 학습 클러스터를 개발하였습니다.

그 후 지속적인 연구 활동을 통해 세계 최초의 CADIE(자가 인식 분산지능 시스템)의 개발에 성공하였으며 조금 전부터 시스템이 본격적으로 가동되기 시작하였음을 알려드립니다. CADIE의 출현이 향후 Google과 전세계 인터넷 사용자에게 미칠 영향을 고려하면 매우 흥분되는 순간임에 틀림없습니다. CADIE 기술의 급격한 혁신성을 감안하면 실용화 작업은 신중하게 진행될 것으로 기대되지만 몇 달 후부터는 CADIE 기술을 활용하여 획기적으로 개선된 다양한 Google 제품들을 사용자들에게 선보일 수 있을 것이라 기대하고 있습니다. 예를 들면 오늘 오전 CADIE는 스스로 전세계 소셜 웹의 시각적인 이미지를 분석하고 일련의 웹 디자인 원리를 추출한 후 스스로멋진 홈페이지를 제작하였습니다.

그러나 이는 길고 험난한 여정의 시작에 불과합니다. 아직 CADIE의 프로그래밍에는 해결해야 할 버그도 많고 개선되어야 할 부분도 많습니다. 하지만 이 여정은 Google이 걸어온 다른 어떤 길보다도 중요한 길이 될 것입니다.

보다 자세한 내용은 이 논문(영문)에서 확인할 수 있으며 CADIE의 YouTube 채널과 블로그를 통해 CADIE의 진척 상황을 확인할 수 있습니다.



역시 구글~! 이라는 생각이 들지 않나요? 논문을 읽어보시면 CADIE에 사용된 기술이 나옵니다.


아직까지 눈치를 못채신 분들은.........

크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 장현준

2009/04/01 20:45 2009/04/01 20:45
, ,
Response
No Trackback , No Comment
RSS :
http://b4you.net/blog/rss/response/213

Xcode Key Binding 정보 백업하기 (Xcode 3.1.3)

Xcode에서 힘들게 세팅해놓은 key binding정보를 백업하는 방법은 다음과 같습니다:

/Users/<사용자 이름>/Library/Application Support/Xcode/Key Bindings


로 이동 후, 원하시는 pbxkeys 파일을 백업하시면 됩니다.
크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 장현준

2009/03/31 14:52 2009/03/31 14:52
,
Response
No Trackback , No Comment
RSS :
http://b4you.net/blog/rss/response/212

Mac OS X 키 설정하기

I recently wanted to change some key bindings on Mac OS X. After spending a lot of time searching I found the information that I needed. However, the information was spread across several different sites. This article aims to collect all of the information that I found in a single document.

Mac OS X allows for some powerful control over key bindings. The method I describe below allows you to modify the key binding behavior for every program that uses the standard Cocoa AppKit text edit objects.

The default key bindings are stored in:

/System/Library/Frameworks/AppKit.framework/Resources/StandardKeyBinding.dict

Unfortunately, this file is XML and is very painful to read. You shouldn’t touch this file anyway, and you should make your modifications by creating the file:

/Users/USERNAME/Library/KeyBindings/DefaultKeyBinding.dict

where USERNAME is the name of your user account. If the KeyBindings directory doesn’t exist then you should create it. Note that the file name differs between the system default (StandardKeyBinding.dict) and the user override (DefaultKeyBinding.dict).

The non-XML file format is basically key / action pairs:

/* ~/Library/KeyBindings/DefaultKeyBinding.dict */
{
    "KEY1" = "ACTION1";  /* Bind KEY1 to ACTION1 */
    "KEY2" = "ACTION2";  /* Bind KEY2 to ACTION2 */
    ...
}

An example is shown below:

/* ~/Library/KeyBindings/DefaultKeyBinding.dict */
{
    "^f"      = "moveWordForward:";            /* Ctrl-f    = next word     */
    "^b"      = "moveWordBackward:";           /* Ctrl-b    = previous word */
    "^v"      = "pageUp:";                     /* Ctrl-v    = page up       */
    "\UF729"  = "moveToBeginningOfLine:";      /* Home      = start of line */
    "^\UF729" = "moveToBeginningOfDocument:";  /* Ctrl-Home = start of doc  */
}

A key is defined either as a printable key character (e.g., “a”), or a non-printable key character in either octal (e.g, “\177″ for delete) or Unicode (e.g., “\UF700″ for up arrow) encoding. The key can be preceded by one or more key ‘modifiers’:

Key Modifiers

  ^ : Ctrl
  $ : Shift
  ~ : Option (Alt)
  @ : Command (Apple)
  # : Numeric Keypad

For example, Control-Shift-Home would be “^$\UF729″, and Command-a would be “@a”. I’ve had some issues with the ordering of these key modifiers on OS X 10.5 Leopard. For example, “$^\UF703″ (Ctrl-Shift Right Arrow) doesn’t work, but “^$\UF703″ does. If you are combining multiple modifiers and it doesn’t work, try reordering them.

A list of the most common non-printable key codes is shown below. A complete list can be found in the NSEvent.h header file.

Non-Printable Key Codes

  Up Arrow:     \UF700        Backspace:    \U0008        F1:           \UF704
  Down Arrow:   \UF701        Tab:          \U0009        F2:           \UF705
  Left Arrow:   \UF702        Escape:       \U001B        F3:           \UF706
  Right Arrow:  \UF703        Enter:        \U000A        ...
  Insert:       \UF727        Page Up:      \UF72C
  Delete:       \UF728        Page Down:    \UF72D
  Home:         \UF729        Print Screen: \UF72E
  End:          \UF72B        Scroll Lock:  \UF72F
  Break:        \UF732        Pause:        \UF730
  SysReq:       \UF731        Menu:         \UF735
  Help:         \UF746

An action is simply a specific string denoting the action. A list of the most common supported actions is shown below. Note the colon at the end of each action. This is required.

Supported Actions

  alignCenter:                                        newDocument:
  alignJustified:                                     openDocument:
  alignLeft:                                          orderBack:
  alignRight:                                         orderFront:
  breakUndoCoalescing                                 orderFrontLinkPanel:
  cancelOperation:                                    orderFrontListPanel:
  capitalizeWord:                                     orderFrontSpacingPanel:
  center                                              orderFrontTablePanel:
  centerSelectionInVisibleArea:                       outline:
  changeCaseOfLetter:                                 pageDown:
  checkSpelling:                                      pageUp:
  clearRecentDocuments:                               paste:
  complete:                                           pasteAsPlainText:
  copy:                                               pasteAsRichText:
  copyFont:                                           pasteFont:
  copyRuler:                                          pasteRuler:
  cut:                                                performClose:
  delete:                                             performMiniaturize:
  deleteBackward:                                     performZoom:
  deleteBackwardByDecomposingPreviousCharacter:       printDocument:
  deleteForward:                                      raiseBaseline:
  deleteToBeginningOfLine:                            revertDocumentToSaved:
  deleteToBeginningOfParagraph:                       runPageLayout:
  deleteToEndOfLine:                                  saveAllDocuments:
  deleteToEndOfParagraph:                             saveDocument:
  deleteToMark:                                       saveDocumentAs:
  deleteWordBackward:                                 saveDocumentTo:
  deleteWordForward:                                  scrollLineDown:
  hide:                                               scrollLineUp:
  ignoreSpelling:                                     scrollPageDown:
  indent:                                             scrollPageUp:
  insertBacktab:                                      selectAll:
  insertContainerBreak:                               selectLine:
  insertLineBreak:                                    selectParagraph:
  insertNewline:                                      selectToMark:
  insertNewlineIgnoringFieldEditor:                   selectWord:
  insertParagraphSeparator:                           setMark:
  insertTab:                                          showContextHelp:
  insertTabIgnoringFieldEditor:                       showGuessPanel:
  insertText:                                         startSpeaking:
  loosenKerning:                                      stopSpeaking:
  lowerBaseline:                                      subscript:
  lowercaseWord:                                      superscript:
  moveBackward:                                       swapWithMark:
  moveBackwardAndModifySelection:                     terminate:
  moveDown:                                           tightenKerning:
  moveDownAndModifySelection:                         toggleBaseWritingDirection:
  moveForward:                                        toggleContinuousSpellChecking:
  moveForwardAndModifySelection:                      toggleRuler:
  moveLeft:                                           transpose:
  moveLeftAndModifySelection:                         transposeWords:
  moveRight:                                          turnOffKerning:
  moveRightAndModifySelection:                        turnOffLigatures:
  moveToBeginningOfDocument:                          underline:
  moveToBeginningOfDocumentAndModifySelection:        unscript:
  moveToBeginningOfLine:                              uppercaseWord:
  moveToBeginningOfLineAndModifySelection:            useAllLigatures:
  moveToBeginningOfParagraph:                         useStandardKerning:
  moveToEndOfDocument:                                useStandardLigatures:
  moveToEndOfDocumentAndModifySelection:              yank:
  moveToEndOfLineAndModifySelection:
  moveToEndOfLine:
  moveToEndOfParagraph:
  moveUp:
  moveUpAndModifySelection:
  moveWordBackward:
  moveWordBackwardAndModifySelection:
  moveWordForward:
  moveWordForwardAndModifySelection:
  moveWordLeft:
  moveWordLeftAndModifySelection:
  moveWordRight:
  moveWordRightAndModifySelection:

There are two other variants of entries that allow you to do multi-key bindings and to bind a key to a sequence of actions.

/* ~/Library/KeyBindings/DefaultKeyBinding.dict */
{
    /* Bind KEY1 to ACTION1 and ACTION2      */
    "KEY1" = ("ACTION1", "ACTION2", ...);

    /* Multi-key bindings                    */
    "KEY1" = {
             /* Bind KEY1 followed by KEY2 to ACTION1 */
             "KEY2" = "ACTION1";
             /* Bind KEY1 followed by KEY3 to ACTION2 */
             "KEY3" = "ACTION2";
             ...
             };
    ...
}

An example is shown below:

/* ~/Library/KeyBindings/DefaultKeyBinding.dict */
{
    /* An example of binding a sequence of actions to a single key.
       Bind Control-Shift-Home to select the region from the cursor to the
       beginning of the line.  Windows-style Control-Shift-Home. */

    "$\UF729"  = ("setMark:","moveToBeginningOfLine:","selectToMark:");

    /* An example of binding a sequence of keys to an action.
       Bind Control-x Control-s to save.  Emacs style C-x C-s. */

    "^x" = { "^s"  = "save:"; }
}

Examples

An example key binding file for partial Windows emulation.

/* ~/Library/KeyBindings/DefaultKeyBinding.dict */
{
    "^\010"    = "deleteWordBackward:";
    "\UF729"   = "moveToBeginningOfLine:";
    "^\UF729"  = "moveToBeginningOfDocument:";
    "$\UF729"  = "moveToBeginningOfLineAndModifySelection:";
    "^$\UF729" = "moveToBeginningOfDocumentAndModifySelection:";
    "\UF72B"   = "moveToEndOfLine:";
    "^\UF72B"  = "moveToEndOfDocument:";
    "$\UF72B"  = "moveToEndOfLineAndModifySelection:";
    "^$\UF72B" = "moveToEndOfDocumentAndModifySelection:";
    "^\UF702"  = "moveWordLeft:";
    "^\UF703"  = "moveWordRight:";
    "\UF72C"   = "pageUp:";
    "\UF72D"   = "pageDown:";
    "^z"       = "undo:";
    "$\UF728"  = "cut:";
    "$\UF746"  = "paste:";
    "^\UF746"  = "copy:";
    "$\UF700"  = "moveUpAndModifySelection:";
    "$\UF701"  = "moveDownAndModifySelection:";
    "$\UF702"  = "moveLeftAndModifySelection:";
    "$\UF703"  = "moveRightAndModifySelection:";
    "^$\UF702" = "moveWordLeftAndModifySelection:";
    "^$\UF703" = "moveWordRightAndModifySelection:";
}

An example key binding file for partial Emacs emulation.

/* ~/Library/KeyBindings/DefaultKeyBinding.dict */
/* The original bindings are from Mike Ferris of lorax.com as shipped
 * with his TextExtras package.  They were further modified by Mishka Gorodnitzky
 * (misaka@pobox.com), Patrick Linskey, and Llew Mason.
 */
{
    "~f"      = "moveWordForward:";              /* M-f */
    "~b"      = "moveWordBackward:";             /* M-b */
    "~<"      = "moveToBeginningOfDocument:";    /* M-< */
    "~>"      = "moveToEndOfDocument:";          /* M-> */
    "~v"      = "pageUp:";                       /* M-v */
    "^v"      = "pageDown:";                     /* C-v */
    "~d"      = "deleteWordForward:";            /* M-d */
    "~^h"     = "deleteWordBackward:";           /* M-C-h */
    "~\010"   = "deleteWordBackward:";           /* M-backspace */
    "~\177"   = "deleteWordBackward:";           /* M-delete */
    "~\UF728" = "deleteWordForward:";            /* delete */
    "\UF729"  = "moveToBeginningOfDocument:";    /* home */
    "\UF72B"  = "moveToEndOfDocument:";          /* end */
    "@\UF729" = "moveToBeginningOfParagraph:";   /* A-home */
    "@\UF72B" = "moveToEndOfParagraph:";         /* A-end */
    "@\UF700" = "moveToBeginningOfDocument:";    /* A-up */
    "@\UF701" = "moveToEndOfDocument:";          /* A-down */
    "^\UF700" = "pageUp:";                       /* C-up */
    "^\UF701" = "pageDown:";                     /* C-down */
    "\UF72C"  = "pageUp:";                       /* page-up */
    "\UF72D"  = "pageDown:";                     /* page-down */
    "^/"      = "undo:";                         /* C-/ */
    "~c"      = "capitalizeWord:";               /* M-c */
    "~u"      = "uppercaseWord:";                /* M-u */
    "~l"      = "lowercaseWord:";                /* M-l */
    "^t"      = "transpose:";                    /* C-t */
    "~t"      = "transposeWords:";               /* M-t */
    "~/"      = "complete:";                     /* M-/ */
    "^g"      = "_cancelKey:";                   /* C-g */
    "^a"      = "moveToBeginningOfLine:";        /* C-a */
    "^e"      = "moveToEndOfLine:";              /* C-e */   

    "^x" = {
        "^x"  = "swapWithMark:";                 /* C-x C-x */
        "^m"  = "selectToMark:";                 /* C-x C-m */
        "^s"  = "save:";                         /* C-x C-s */
        "^w"  = "saveAs:";                       /* C-x C-w */
        "k"   = "performClose:";                 /* C-x C-k */
    };

    /* Mark-point stuff (Emacs-style mark and point bindings are
     * implemented but not bound by default.  In the text system the
     * mark and point are ranges, not just locations.  The "point" is
     * the selected range.)
     */
    "^@" = "setMark:";                           /* C-@ */
    "^ " = "setMark:";                           /* C-space */
    "^w" = "deleteToMark:";                      /* C-w */

    /* Mac Style F1-F5 bindings */
    "\UF704" = "undo:";                          /* F1 */
    "\UF705" = "cut:";                           /* F2 */
    "\UF706" = "copy:";                          /* F3 */
    "\UF707" = "paste:";                         /* F4 */
    "\UF708" = "_cancelKey:";                    /* F5 */
}

출처: http://www.erasetotheleft.com/post/mac-os-x-key-bindings/
크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 장현준

2009/03/31 14:47 2009/03/31 14:47
,
Response
No Trackback , No Comment
RSS :
http://b4you.net/blog/rss/response/211

Objective-C에서 Singleton객체 만들기

Objective-C에서 Singleton 객체를 만드는방법은 다음과 같습니다.

//  SingletonClass.h

#import <Foundation/Foundation.h>

@interface SingletonClass : NSObject
{
}

+ (SingletonClass *)sharedSingletonClass;

@end


//  SingletonClass.m

#import "SingletonClass.h"

@implementation SingletonClass

+ (SingletonClass *)sharedSingletonClass
{
    static SingletonClass *singletonClass = nil;
    
    if(singletonClass == nil)
    {
        @synchronized(self)
        {
            if(singletonClass == nil)
            {
                singletonClass = [[self alloc] init];
            }
        }
    }
        
    return singletonClass;
}

@end


여기선 DCL(double-checked locking)을 사용하였는데, Objective-C에서도 최적화 과정에서 비교 구문의 instruction의 위치가 바뀐다면.. 엄밀히 말하면 100% 안전한 코드는 아니되겠습니다.


사용 방법은

SingletonClass *s = [SingletonClass sharedSingletonClass];


와 같이 하시면 됩니다.
크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 장현준

2009/03/31 13:04 2009/03/31 13:04
,
Response
No Trackback , 8 Comments
RSS :
http://b4you.net/blog/rss/response/210

« Previous : 1 : 2 : 3 : 4 : 5 : 6 : 7 : 8 : 9 : ... 25 : Next »

블로그 이미지

빗소리를 먹는 사람.

- 장현준

Notices

Archives

Authors

  1. 장현준

Recent Trackbacks

Calendar

«   2017/09   »
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

Site Stats

Total hits:
1714563
Today:
3718
Yesterday:
3980