1. 번들이란?
번들은 일반 사용자에게는 일반적으로 하나의 파일로 보이지만, 내부적으로 많은 서브디렉토리와 파일을 가지고 있는 특정한 목적에 사용되는 디렉토리 입니다. 번들은 OS X에서 어플리케이션, 동적라이브러리, 플러그인등 실행 가능한 용도외에도 키노트나 페이지의 복잡한 문서구조에도 사용됩니다.

이런 구조는 복잡한 환경과 옵션을 각각의 서브 디렉토리로 저장하고, 내부에서 사용하는 파일들을 번들 내부에 감춤으로써 보다 쉽고 편리하게 관리할 수 있습니다. 

1) 번들의 종류
대표적인 어플리케이션 번들을 포함하여 번들에는 다양한 종류가 있습니다. 번들의 이름은 확장자로 구별이 되기도 하는데 아래는 흔히 볼수 있는 번들의 확장자입니다.

  • .app - 일반적인 어플리케이션 번들입니다.
  • .wgdt - 데쉬보드에서 실행되는 위젯입니다.
  • .framework - 동적 라이브러리와 관련된 *.h, *.dylib와 이미지나 사운드의 리소스와 관련 문서들을 포함한 프레임워크 번들 입니다.
  • .bundle - 필요로 하는 어플리케이션 실행시에 동적으로 로드되고 링크되어 필요한 모듈을 제공하는 번들입니다.
  • .pkg - PackageMaker를 사용하여 시스템에 인스톨되는 패키지 번들입니다.

이외에 다양한 목적들로 사용되는 많은 번들이 있습니다. 번들은 종류에 따라 내부구조가 다르게 구성되어 있습니다.

2) info.plist
실행가능한 대부분의 번들들은 내부에 자신의 정보를 가지고 있는 info.plist란 XML 형식의 파일을 가지고 있습니다. (plist 파일은 /Developer/Applications/Utilities/Property List Editor를 이용하면 편리하게 관리할 수 있습니다) info.plist의 내용들은 시스템들이 관리할 수 있는 정보에 대해서 알려 줍니다. 아래는 Ruby.framework의 info.plist의 내용입니다.

사용자 삽입 이미지

info.plist에는 아이콘, 번들의 종류, 실행파일, 버젼등의 다양한 정보를 가지고 있습니다. 위는 Bundle OS Type code가 FMWK로 이 번들은 프레임워크임을 나타냅니다. (어플리케이션은 APPL입니다)

또한 info.plist에는 실행파일이 처리 가능한 문서들의 타입에 관한 정보도 포함되어 있습니다. 아래는 iTunes의 info.plist의 Document types중 9번째 아이템인 MP3 파일에 관한 정보입니다.

사용자 삽입 이미지

문서의 타입명과 아이콘, 해당 파일의 역활이 설정되어 있습니다. 해당 파일에 대한 어플리케이션의 역활을 Editor, Viewer, Shell등으로 지정할 수 있습니다.


2. 번들의 내부구조
1) FrameWork
아래는 /System/Library/Frameworks/ 아래 있는 Ruby.Framework의 내부구조입니다. inpo.plist 파일은 Versions/1.8/Resources 디렉토리 아래 있습니다.

사용자 삽입 이미지

Headers/
Versions/1.8/Headers의 심볼릭 링크입니다.
Resources/
Versions/1.8/Resources의 심볼릭 링크입니다.
Ruby
Versions/1.8/usr/lib/libruby.1.dylib 파일의 심볼릭 링크입니다.
Versions/
현재 시스템에서 루비 1.8만있기 때문에 1.8 디렉토리만 있으며, Versions 밑에는 여러 버젼의 디렉토리를 포함할 수 있습니다.
1.8/
각 서브 디렉토리에는 헤더파일, 동적 라이브러리, 실행파일과 필요한 리소스등, 프레임워크에서 실제 사용되는 파일들로 구성되어 있습니다.
current/
1.8 디렉토리가 심볼릭 링크가 되어 있으며 현재버젼을 의미합니다.
 
사용자 삽입 이미지

터미널에서 확인해 보면 ruby의 실행파일은 위 루비 프레임워크의 Current에 링크된 버젼을 사용하고 있음을 알 수 있습니다.

2) Application
사용자 삽입 이미지
어플리케이션의 번들은 좌측과 같이 해당 어플리케이션을 우클릭한 후에 '패키지 내용보기'를 클릭하면 확인할 수 있습니다.


아래는 이전에 소개했던 ClassDump라는 어플리케이션의 번들 구조입니다.

사용자 삽입 이미지

Application은 기본적으로 Contents 디렉토리 밑에 info.plist 파일, 실행파일이 위치하는 /MacOS 폴더와 함께 다양한 리소스를 포함하고 있는 /Resource 디렉토리로 구성되어 있습니다. /Resource 디렉토리에는 nib 파일들과 이미지, 사운드, 동영상등의 리소스 파일들이 위치합니다.

또한 /Resource 디렉토리 밑에는 각 언어별로 로컬라이징된 리소스들이 *.lpoj (localized project folder) 확장자를 가진 서브디렉토리들이 위치하고 있습니다. English.lpoj에는 이름과 같이 영문으로된 문자, 이미지, nib등의 리소스가 포함되어 있습니다. English.lpoj만 있기 때문에 이 어플리케이션은 영어외에는 지원하지 않는 것을 알 수 있습니다.

어플리케이션 번들에는 생성툴에서 만들어진 디렉토리, 파일 외에 사용자가 용도에 따라 서브디렉토리를 만들거나 데이터 파일을 저장할 수 있습니다. 위의 Resources/ 디렉토리에는 class-dump란 커멘드라인 유틸리티가 포함되어 있습니다. (아마 GUI 뒷단에서 시스템에 관련된 실질적인 처리를 하고 파이프로 GUI 어플리케이션과 통신을 하는 핵심 유틸리티 같습니다)

이외에 어플리케이션, 프래임워크등의 또 다른 번들도 내부에 포함할 수 있으며, 파이어폭스의 경우에는 윈도우즈 파이어폭스의 폴더내의 파일들이 /MacOS 디렉토리내에 실행파일과 같이 위치하고 있습니다.

사용자 삽입 이미지
좌측은 페이지에서 작성된 번들파일의 내용입니다. 페이지는 데이터를 xml 형식으로 gz으로 압축하여 보관하는 것으로 짐작할 수 있습니다.

파인더의 퀵룩에서 빠른 처리를 위해 QuickLook 디렉토리에 썸브네일 이미지를 따로 보관하고 있습니다.

일부만 소개했지만 번들은 이와 같이 OS X에서 다양하게 사용되고, 중요한 부분을 차지하고 있습니다.

코코아에서는 NSBundle을 이용하여 번들에 접근하고 관리할 수 있습니다. 번들 프로그래밍에 대한 자세한 내용은 ADCBundle Programming Guide 문서를 참고하시기 바랍니다.

'기타' 카테고리의 다른 글

OS X 루트계정 활성화  (6) 2008.10.08
nib 파일 둘러보기  (7) 2008.09.01
맥 OS X에서 CHM 파일 보기  (4) 2008.08.19
ClassDumper - 응용프로그램 Class Viewer  (0) 2008.08.07
레밍스와 유사한 게임 - Pingus  (6) 2008.07.23
AND

간혹 euc-kr로된 파일들을 utf-8로 변경할 경우가 있어 파이썬으로 아래와 같이 iconv를 이용하는 간단한 스크립트를 만들어 사용했습니다.

#!/usr/bin/python

import os, sys

for arg in sys.argv[1:]:
    if os.path.isfile(arg):
        os.rename(arg, arg + '.chg')
        command = 'iconv -f euc-kr  -t utf-8 ' + arg + '.chg' + ' > ' + arg
        os.system(command)

파이썬 인자관리의 편리한 기능으로 위와 같이 단순한 코드로도 '*.txt'나 '*'와 같은 와일드카드도 자동으로 처리되어 별다른 불편함 없었습니다.

그런데 이번에는 반대로 utf-8을 euc-kr로 변경할 경우가 생겨 스크립트를 변경하면서 옵션을 추가하여 보았습니다. 몇 번 사용해 보았는데 별 문제가 없어 올려 봅니다. (오류나 잘못된 부분이 있으면 알려주시면 감사하겠습니다. ^^;;) 기본 사용법은 아래와 같습니다.

사용자 삽입 이미지

1) 옵션
  • -h: 위와 같은 사용법을 출력합니다.
  • -r: 서브디렉토리의 파일들도 변환합니다.
  • -f: 디렉토리가 아닌 인자로 넘어 온 파일들을 변경합니다.
  • -x: 이전 파일의 백업파일을 남기지 않습니다.
  • -d: 작업 디렉토리를 지정합니다.
  • -s: 이전 파일을 백업할 파일 확장자를 지정합니다.
  • -e: 변경할 파일의 확장자를 지정합니다.
  • -o: 변경될 파일의 현재 문자셋을 지정합니다.
  • -n: 변경될 문자셋을 지정합니다.

-f는 파일 단위로 -d는 디렉토리 단위로 변환하며, 두 옵션을 같이 사용할 수 없습니다. 현재 파일의 문자셋은 euc-kr로 변경될 문자셋은 utf-8이 기본으로 설정되어 있습니다. -d 옵션에선 사고(?)를 방지하기 위해 변경될 파일의 확장자가 'txt'가 기본으로 설정되어 있으며, 이는 -e[확장자] 옵션으로 변경할 수 있습니다.

이전 파일은 [파일명].chg로 동일 디렉토리에 저장되며, 이 확장자는 -s[확장자] 옵션으로 변경할 수 있습니다. -x 옵션을 사용하면 이전 파일을 저장하지 않습니다.

2) 사용예
* 현재 디렉토리의 data.txt 파일 변경 (euc-kr -> utf-8)
$ chgchar -f data.txt

* 현재 디렉토리의 data.txt 파일 변경 (utf-8 -> euc-kr)
$ chgchar -outf-8 -neuc-kr -f data.txt

* 현재 디렉토리의 *.txt 파일 변경
$ chgchar -f *.txt

* test 디렉토리 내의 모든 txt 파일 확장자를 가진 모든 파일 변경
$ chgchar -d./test -etxt

* 현재 디렉토리 내의 모든 파일과 서브 디렉토리의 파일도 변경
$ chgchar -r -e* -d./

3) 주의사항
파일을 변경하는 위험한(?) 작업인데 테스트와 사용횟수가 부족하기 때문에, 아래의 사항에 유의하시면서 사용하셔야 합니다.
  • 백업파일을 저장하지 않는 '-x' 옵션 사용하지 않는 것이 좋습니다.
  • 와일드카드(*)는 가능한 사용하지 않는 것이 좋습니다.
  • 대상 디렉토리와 파일을 확인하고 실행해 주세요.

4) 다운로드
아래의 압축파일을 다운로드 받아서 압축을 푸시고 'chmod +x ./chgchar'로 파일의 실행권한을 추가하시고 사용하시면 됩니다.

* 2008.10.21 추가
"nakada님으로 부터 파일 접근권한을 설정하지 않은 문제가 있는 것을 알게되었습니다. 자세한 내용은 nakada님의 포스팅을 참조하시기 바랍니다. nakada님이 작업하신 내용은 이곳에서도 변경해 놓았습니다. nakada님께 감사 드립니다. ^^"



* 아래의 'more..'를 클릭하시면 스크립트의 내용을 확인하실 수 있습니다.

'기타 > 자잘한 Tip' 카테고리의 다른 글

sqlite3에서 csv import/export  (0) 2009.08.26
Python에서 sqlite3 사용하기  (1) 2009.08.26
Xcode에서의 Ruby on Rails  (8) 2008.08.20
Dashcode로 올블로그 RSS 위젯 만들기  (2) 2008.05.22
자주 사용하는 MySQL 명령어  (4) 2008.02.28
AND

사용자 삽입 이미지
OS X 10.5에는 Ruby(1.8.6), Rails(1.2.6), SQLite3(3.4.0)가 기본으로 설치되어 있습니다. 그렇기 때문에 추가적인 설치나 설정 없이 편리하게 RoR 환경에서 손쉽게 웹사이트를 만들 수 있습니다.

오늘 오전에 Ruby에 관련된 포스팅을 해서 그런지 문득 Xcode에서도 RoR 환경을 지원하는지 궁금하여 자료를 찾아 보았습니다. ADCDeveloping Rails Applications on Mac OS X Leopard 에서 관련된 내용을 찾을 수 있었습니다. 이 문서를 참조하여 간단히 설명해 보겠습니다.


1. Rails 업그레이드
Xcode에서 사용하기 위해서는 Rails 2.*로 업그레이드를 해야 합니다. (주의: 조금 지난 서적들과 예제들은 Rails 1.*로 설명이 되어 있습니다. 업그레이드를 하시면 변경된 부분 때문에 따라하기 어려울 수 있습니다.)

터미널에서 아래와 같이 명령어를 실행하여 최신버젼으로 업그레이드를 합니다.
$ sudo gem update --system
$ sudo gem install rails
$ sudo gem update rake
$ sudo gem update sqlite3-ruby

설치가 완료된 후에 'rails -v'로 버젼을 보면 현재 '2.1.0'으로 업그레이드 되어 있는 것을 확인할 수 있습니다.


2. 프로젝트 생성
터미널에서 아래의 명령어를 실행하여 프로젝트를 생성합니다. 결과가 출력되면서 해당 디렉토리 밑에 WishList란 디렉토리가 생성되어 있습니다.

$ rails WishList
$ cd WishList

WishList 디렉토리에서 아래와 같이 명령어를 입력하여 MyWish의 scaffold를 생성합니다.

$ script/generate scaffold MyWish name:string price:integer url:string memo:text


3. Xcode Organizer
1) WishList 등록
Xcode를 실행하고 메뉴에서 Window/Organizer를 클릭합니다.   
사용자 삽입 이미지

위와 같이 Organizer가 실행되되면 finder에서 위에서 만든 WishList 디렉토리를 좌측의 PROJECTS & SOURCES가 있는 영역으로 드래그하여 가져다 놓습니다. 아래와 같이 PROEJCTS & SOURCES 아래에 WishList가 등록된 것을 확인합니다.
사용자 삽입 이미지
목록에서 소스파일을 선택하면 좌측 편집창에서 수정할 수 있습니다.
사용자 삽입 이미지

2) migration
추가된 WishList를 클릭한 후에 툴바의 Action을 클릭한 채로 있으면 아래와 같이 실행 메뉴가 나옵니다. db:migrate를 선택합니다.

사용자 삽입 이미지

아래와 같이 성공적으로 실행되었다는 메시지창이 출력됩니다.
사용자 삽입 이미지

3) 웹서버 실행
사용자 삽입 이미지
툴바에서 Run을 실행하면 초기 설정창이 오픈됩니다. 좌측의 하단에 [+] 버튼을 클릭하고 좌측과 같이 'New Shell Script'를 선택합니다.





아래와 같이 제목을 'run server'로 변경하고 Directory를 'Top Level Organizer Item'으로 선택합니다. 그리고 Command에 'script/server'를 입력한 후 OK 버튼을 클릭하여 저장합니다.

사용자 삽입 이미지

실행되면 아래와 같이 서버가 3000 포트에서 실행되고 있다는 것을 확인할 수 있습니다.
WEBrick으로 실행될줄 알았는데 친절하게 Mongrel도 이미 설치되어 있는 것 같습니다.
사용자 삽입 이미지

4. 테스트

사파리나 파이어폭스의 주소창에서 'http://localhost:3000/'을 입력하면 아래와 같이 Ruby on Rails의 기본페이지를 확인할 수 있습니다.
사용자 삽입 이미지

이제 다시 주소창에서 http://localhost:3000/my_wishes 를 입력합니다. 목록 하단의 'New my wish'를 클릭하여 아래와 같은 입력폼이 나오면 각 필드를 입력 후에 하단의 'Create' 버튼을 클릭합니다.

사용자 삽입 이미지

목록으로 돌아 오면 아래와 같이 입력한 내용이 등록되어 있음을 확인할 수 있습니다.

사용자 삽입 이미지

터미널에서도 SQLite을 실행하여 테이블과 레코드를 확인할 수 있습니다.

사용자 삽입 이미지

혹시나 RoR을 Xcode를 이용할 수 있는지 알아 보았는데, 제가 아직 방법을 잘 몰라서 그런지 오히려 그냥 터미널에서 개발하는 것 보다 더 불편한 것 같습니다.

짧은 생각으로는 Ruby on Rails + (Prototype + script.aculo.us)가 최상의 웹 개발환경인 것 같은데, 생각 처럼 그렇게 많은 곳에서 사용하지는 않는 것 같습니다. 제가 모르는 어떤 이유가 있는 것 같습니다.
AND