예전에 만들었던 인앱 콜백을 통해 예를 들겠습니다.



선언

std::function<void(std::string productID, bool success)> inappRequestCallback;


std::function<return_type(arguments,..)> 형태로 변수를 선언합니다.

위의 예제에서는 인앱의 productID와 성공여부를 넘겨받습니다.



사용


void StoreLayer::BuyTest(string productID, bool success)

{

}



inappRequestCallback = bind(&TitleLayer::BuyTest, this, "", true);

inappRequestCallback();

or

inappRequestCallback = bind(& StoreLayer::BuyTest, storeLayer, placeholders::_1, placeholders::_2);

inappRequestCallback("", true);


bind함수를 통해 delegate(callback)를 등록시킵니다.

인자에 대해 두가지 방법으로 세팅할 수 있는데

하나는 미리 넘겨줄 인자를 등록시켜놓는 것이고, 나머지 하나는 등록시키지 않는 것 입니다.

미리 넘겨줄 인자를 등록시켜놓은 경우,
함수 사용시, 어떤 값을 넘겨주어도 이전에 등록시켰던 인자가 전달됩니다.

하지만 placeholders를 이용하면 미리 인자를 등록시키지 않고 함수 사용시 인자를 전달 할 수 있습니다.

헤더파일 : StoreKit/StoreKit.h
라이브러리파일 : StoreKit.framework
딜리게이트 : SKProductsRequestDelegate

상품 요청
SKProductsRequest *preq = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:PRODUCT_ID]];
preq.delegate = self;
[preq start]; 
 - PRODUCT_ID : In app purchase에 등록한 상품 아이디를 입력하시면 됩니다.
ex)com.sadun.app.item1

상품 요청에 대한 응답
-(void)productsRequest(SKProductsRequest*)req didReceiveResponse:(SKProductsResponse*)response
{
    if([response.products count] >0)
    {
        for( SKProduct* product in response.products )
        {
            SKPayment *pPayment = [SKPayment paymentWithProduct:product];

            NSLog(@"Title:%@", product.localizedTitle);
            NSLog(@"Description:%@", product.localizedDescription);
            NSLog(@"Price:%@", product.price);

            [[SKPaymentQueue defaultQueue] addPayment:pPaymen];
        }
    }
    if([response.invalidProductIdentifiers count] > 0)
    {
        printf("find invalid product\n");
        for(NSString* invalidString in [response invalidProductIdentifiers])
        {
            NSLog(@"Invalid Identifiers:%@", invalidString);
        }
    }
    [req autorelease];
}

결제 후 처리
-(void)paymentQueue:(SKPaymentQueue*)queue updatedTransactions:(NSArray*)transactions
{
    for( SKPaymentTransaction* tran in transactions )
    {
        switch( tran.transactionState )
        {
            case SKPaymentTransactionStatePurchasing:
                /*----------------------------------------
                구매 중 처리
                ----------------------------------------*/
                break;
            case SKPaymentTransactionStatePurchased:
                /*----------------------------------------
                구매 후 처리
                ----------------------------------------*/
                break; 
            case SKPaymentTransactionStateRestored:
                /*----------------------------------------
                이미 구매 됨 처리
                ----------------------------------------*/
                break; 
            case SKPaymentTransactionStateFailed:
                /*----------------------------------------
                구매 실패 처리
                ----------------------------------------*/
                break;
            default:
                break;
        }
    }
}


아이폰은 잠겨져있는 것들이 많다.
사용자들에게는 상관없는것들은 다 접근이 힘들다.

resource폴더
 - resource폴더는 어플리케이션에 쓰일 리소스들이 있는 폴더다. 프로그래머는 이곳에 리소스들을 넣어놓고 접근을하여 사용한다.
 - 읽기만 가능.
 - 접근방법
NSString* resourceDir = [[NSBundle mainBundle] resourcePath];
const char* szResourceDir = [resourceDir UTF8String];

document폴더
 -  document폴더는 어플리케이션에 필요한 데이터들이 있는 폴더다. 프로그래머는 이곳에서 필요한 데이터를 저장하고 불러와 사용할 수 있다.
 - 읽고, 쓰는것 가능.
 - 접근방법
NSArray* pMyPathList = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES);
NSString* pMyPath = [pMyPathList objectAtIndex:0];
const char* szResourceDir = [pMyPath UTF8String];

그 다음엔 string함수들을 이용해서 알아서 쓰면된다.

GCC C++ Link problems on small embedded target

Thought someone might be interested in this...

I spent Thursday night and Friday night investigating some link errors I was getting on my robot project, which is small embedded ARM7 target compiling C++ code under GCC.

So here is the detail of the errors:

speed_control.o: In function `~Speed_Control':
source/speed_control.cpp:35: undefined reference to `operator delete(void*)'
speed_control.o: In function `~Sensing_Callback':
source/motor_sensing.h:38: undefined reference to `operator delete(void*)'
speed_control.o:(.rodata._ZTI13Speed_Control[typeinfo for Speed_Control]+0x0): undefined reference to `vtable for __cxxabiv1::__vmi_class_type_info'
speed_control.o:(.rodata._ZTI16Sensing_Callback[typeinfo for Sensing_Callback]+0x0): undefined reference to `vtable for __cxxabiv1::__class_type_info'
speed_control.o:(.rodata._ZTV16Sensing_Callback[vtable for Sensing_Callback]+0x8): undefined reference to `__cxa_pure_virtual'


All of these problems were caused by the fact that I'm not using the C++ libraries - either the compiler C++ support libraries or the standard libraries. And the very summarized version is that none of them were particularly hard to overcome - once you knew why they were happening! This post is about what they are.

Why aren't I using the standard stuff? This is because I don't have much flash or RAM. Well, actually I have 128K of Flash (which I expect I won't use up) and 60K of RAM (which I'm going use a significant fraction for a large data store ... all will be revealed in a later blog entry). It's quite common for embedded systems to roll their own nearly everything. I do link against certain libraries. But certainly nothing like heap management, cout or printf.

Undefined References to class_type_info

Starting with with the undefined references to
`vtable for __cxxabiv1::__vmi_class_type_info'
and
`vtable for __cxxabiv1::__class_type_info'
- these are related to RTTI (run-time type information) as suspected, and are functions patched into the RTTI table. There is a pointer to this from the vtable.

This is the vtable:

507 _ZTV16Sensing_Callback:
508 0000 00000000 .word 0
509 0004 00000000 .word _ZTI16Sensing_Callback
510 0008 00000000 .word __cxa_pure_virtual
511 000c 00000000 .word _ZN16Sensing_CallbackD1Ev
512 0010 00000000 .word _ZN16Sensing_CallbackD0Ev


As you can see, address 4 points at the type table.

492 _ZTI16Sensing_Callback:
493 0000 08000000 .word _ZTVN10__cxxabiv117__class_type_infoE+8
494 0004 00000000 .word _ZTS16Sensing_Callback


Obviously those are mangled names ... and I've left off a whole other block - this is the pure abstract base class, effectively an interface, part of a concrete class.

Since I'm not using rtti at all, we can get rid of this by adding "-fno-rtti" to the gcc command line options. Both errors go away.


Undefined Reference to `__cxa_pure_virtual'

This one is interesting. Effectively it's a function that is called if you actually (somehow) call apure virtual member function. Remember that you don't give them a definition (by putting =0) in the class after the member function definition. As you know - this does two things, forces you to define it in any derived classes and stop you making a concrete version of that base class.

I guess you've have to be hacking the vtable or doing some very bizarre casting to get this at all without the compiler spotting it. Either way, I think it's part of the language standard I think - I believe gcc's standard lib does an abort.

eCos has some information on it, as does the OS Dev Wiki.

http://sourceware.org/ml/ecos-patches/2003-03/msg00209.html

http://www.osdev.org/wiki/C_PlusPlus

We just sit in a loop, because I think it will never happen to us.

extern "C" void __cxa_pure_virtual(void)
{
// call to a pure virtual function happened ... wow, should never happen ... stop
while(1)
;
}



Undefined Reference to operator delete(void *)

The final ones quite good ... and Google really didn't help direct me to the information in any sort of quick way.

So, I don't use new and delete - because we haven't got a heap, and the memory on the single-chip microcontroller is not really large enough to use that type memory management (certainly not with my usage). It's all stack based and static objects for us. But that's ok.

So why is gcc generating a delete? Turns out there is more than one destructor in gcc (and there also can be two types of constructor as well - but I'll just cover destructors here). If the destructors are virtual they will appear in the vtable (there are two in the vtable one above - but another class has three). How gcc decides to generate 2 or 3, I haven't found out.

In summary, these three are:
  • in-charge deleting (the destructor also deletes the memory space) ... has D0Ev at the end of the mangled name.
  • in-charge (the destructor is allowed call other destructors) ... has D1Ev at the end of the mangled name.
  • not-in-charge (the destructor is NOT allowed to call other destructors ... and this has D2Ev at the end of the mangled name.
(v means void (i.e. no parameters) by the way).

So why the difference between in-charge and not-in-charge? Well, it's got to do with virtual inheritance (as opposed to virtual member functions). The summarised version is that these are multiple inherited classes that have a single base class at some point where we want one object copy rather than a copy for each derived path.

The rules say, to avoid trying to 'destruct' these common base classes multiple times, that only the most-derived class can sort out calling the destructors (and this is probably the simplest method, anyhow).

Also note that multiple destructors is not the only way of handling this ... earlier versions of gcc passed parameters into the destructor and generated code to select the desired operation. However, you get this speed overhead all the time. Extra entries removes this problem - because you can call the one you want directly.

The 'in-charge deleting' version is, I'm guessing, when you destroy an object by calling delete on it. Therefore gcc only needs to arrange to call the destructor. Of course this will always be "in-charge", since it's likely to be at the top of a hierarchy ("most-derived").

Some more information for this topic, mainly about virtual inheritance:

The OS Dev Wiki touches on the solution: http://www.osdev.org/wiki/C_PlusPlus

This GNU list describes the virtual inheritance stuff, what's called when:http://lists.gnu.org/archive/html/bug-gnu-utils/2004-07/msg00042.html

Notes about the implementation: http://gcc.gnu.org/ml/gcc-patches/2000-04/msg00403.html

Actual details of what's called when from the closed items of a bug tracking system. Search for C-5 and C-6 - there are quite a few more details. C-4 is interesting as well.http://www.codesourcery.com/cxx-abi/cxx-closed.html

My actual solution? Added this to my project...


void operator delete(void *)
{
// should never get here ... we don't use new
while(1)
;
}

 
페도라 리눅스를 방금 막 설치한 유저라면 아마 GUI에서 작업중이실겁니다.
하지만 VMWare를 사용하다보니 GUI환경이라 그런지 Linux가 조금 느린것 같네 싶은 사람들에게 추천하는 CUI환경으로 바꾸는 방법입니다.




아래는 보이는 사진은 터미널 프롬프트를 킨 페도라 리눅스 화면입니다. 아직 GUI환경이지요.





su - root는 관리자권한으로 로그인 하는 것입니다. password는 자신이 등록한 password입니다.





Password를 입력하면 아래와같이 [root@localhost ~]라고 나와있고, 옆에 명령어를 입력할 수 있게 되어있습니다.





그 명령어 창에 vi /etc/inittab을 입력해주세요.
vi는 파일편집기 같은 것입니다.
/etc/inittab은 디렉토리구요.





그러면 이런 신기한 글들이 마구 뜰겁니다.
거기서 키보드의 i를 누르시면...
아래 그림의 맨 아래를 보시면 -- INSERT --라고 바뀔것입니다.
파일을 수정하겠다는 뜻입니다.





아래의 그림처럼  맨 아래의 id:5:initdefault:라는 부분을 id:3:initdefault:로 바꿔주세요.그리고 ESC를 사뿐히 눌러줍니다.





--INSERT--사라진거 보이시죠?






이제 그 창에 :wq를 입력하고 Enter를 눌러주세요.
w는 write의 약자로써 저장을 하겠다는 뜻이고,
q는 quit의 약자로써 종료를 하겠다는 뜻입니다.
즉, '저장하고 종료하겠다'라는 뜻입니다.
참고로 !를 붙여주면 무조건 하겠다는 뜻으로 오류도 무시한다는 뜻입니다. :q! 무조건 종료해라.





그러면 아래처럼 깔끔하게 원래 창으로 돌아옵니다!!
거기서 reboot명령어를 써서 재부팅~!@





하면 아래 도스창같은 창이 뜹니다. 옛날의 CUI죠...
localhost login에 호스트 명을 입력해주시고,





Password는 아시겠죠? 말그대로 비밀번호입니다.





그러면 아무것도 없이 터미널 프롬프트에서만 보던 것이 뜹니다.
이렇게 해놓으면 멋은 없지만..(ㅜ;;) 하면 훨씬 빨라집니다!!




mysql은 질의어인 sql(Structured Query Langauge)을 다루는 프로그램이고,
gcc는 리눅스기반의 c컴파일러입니다.

yum명령어
 - yum이란 온라인 저장소에서 업데이트 된 패키지들을 검사하고, 다운로드하여 설치까지 처리해주는 텍스트 기반의 업데이트 명령어입니다. 다운받아 설치해주는 툴이라고 요약할수 있습니다.

사용법
패키지 찾기
 # yum list available         설치가 가능한 패키지 목폭
 # yum list installed          이미 설치된 list 패키지 목록
 # yum list extras             일반 저장소에서 설치되지 않는 패키지 목록
 # yum list *vorbis*          'vorbis'타이틀이 있는 패키지 목록
 # yum list updates          업데이트 가능한 패키지 목록
 # yum info wordpress     wordpress패키지에 대한 설명
 # yum info word*            word로 시작되는 패키지 설명
 # yum search mp3          mp3문자열을 포함한 패키지의 검색
 # yum whatprovides ??    파일 또는 다른 형태의 패키지를 검색
패키지 설치
 # yum install XFCE                XFCE 패키지 다운로드 인스톨
 # yum groundinstall XFCE      XFCE 데스크톱 패키지의 전체 세트를 다운로드 인스톨
패키지 업데이트
 # yum check-update                 업데이트가 준비된 모든 패키지를 리스트한다.
 # yum list update openoffice*     openoffice*이름으로 이용 가능한 업데이트를 찾는다.
 # yum update openoffice*          모든 openoffice 패키지를 업데이트 한다.
 # yum update                           업데이트가 준비된 모든 패키지를 업데이트한다.
 # yum groupupdate XFCE          파일명 그룹의 모든 패키지를 업데이트한다.
패키지 제거하기
 # yum remove beagle                beagle 패키지를 제거한다.
 # yum remove xscreen*             xscreen으로 시작되고 있는 패키지를 제거한다.
 # yum groupremove 파일명         XFCE 그룹에서 모든 패키지를 제거한다.
패키지 지우기
 # yum clean packages              cache에서 패키지를 지운다.
 # yum clean metadata               cach에서 metadata를 지운다.
 # yum clean headers                cach에서 header를 지운다.
 # yum clean all                        cach에서 metadata, header, package를 지운다.

mysql설치
터미널 프롬프트 창에
# yum install mysql-server
# yum install mysql
# yum install mysql-devel
이렇게 입력 하면 됩니다.

gcc설치
터미널 프롬프트 창에
$ yum install gcc
이렇게 입력하면 됩니다.

설치 도중 Is this OK?(y/N)라고 질문하는데
y라고 답해주면 인스톨이 시작됩니다.

참고
rpm명령어
 - rpm이란 로컬 시스템(하드디스크 또는 CD/DVD)으로부터 이용할 수 있는 RPM 패키지를 설치 하기 위해 사용하는 명령어 입니다.

사람들은 주로 yum을 즐겨쓴답니다.


페도라 리눅스를 실행시키면,



윈도우즈에서는 명령프롬프트와 비슷한 터미널입니다.

bash: mycommand: command not found
터미널에서 나타나는 오류들입니다.
이것들은
ㅁ 사용자가 명령어 이름을 잘못 타이핑 했을 때,
ㅁ 명령어가 여러분이 위치한 경로에 있지 않을 때,
ㅁ 명령어 실행을 위해 root 사용자 권한이 필요할 때,
ㅁ 명령어가 사용자의 컴퓨터에 설치되지 않았을 때,
로 나뉘어 집니다.


그렇다면 명령어를 알아낼 수 있는 방법 없을까요?? 리눅스는 똘똘한 녀석이다보니 명령어를 찾는 명령어도 있습니다.

$ type mount
 - PATH 경로에서 첫 번째 mount 명령을 보여준다.

$ whereis mount
 - mount에 대한 binary, source, man 페이지를 보여준다.

$ locate bash.ps
 - 파일 시스템에서 back.ps가 어디 있는지 찾는다.

$ which umount
 - PATH 경로에 지정된 위치 또는 aliases에서 umount 명령을 찾아준다.

$ rpm -qal |grep umount
 - umount 명령어를 설치된 패키지에서 찾는다.

$ yum whatprovides bzfs
 - bzfs를 bzflag패키지에서 찾는다.




 ※ 기존의 리눅스와 UNIX 문서는 일반적으로 man페이지라고 하는 메뉴얼로 제작되고 있습니다. 약간의 더 세련된 문서 작업은 나중에 info 시스템과 함계 진행되었습니다. 그리고 각 명령어는 자체적으로 help메시지를 항상 보유하고 있습니다.

도움 메시지 사용(--help)

$ls --help | less
 - 뜻    : ls명령어를 위한 도움말을 표시
 - 출력 : Usage: ls [OPTION]...[FILE]...
            List information about the FILEs(the current directory by default).
            Sort entries alphabetically if none of -cftuSUX nor --sort.
            Mandatory arguments to long options are mandatory for short options.
              -a, --all                                  do not hide entries starting with.
              -A, --almost-all                       do not list implied. and...
                   --author                             with -l, print the author of each file
                                                 .
                                                 .
                                                 .
                                                 .

  바로 앞의 출력은 ls 커맨드라인이 어떻게 사용되고, 이용 가능한 옵션에는 무엇이 있는지 리스팅해 준다.

man 페이지의 사용

man페이지란?
- 명령어 도움말 페이지
- 서버 관리시 숙달되지 않은 명령어의 사용법이나 옵션들을 알고자 할 때 사용한다.


사용자가 어떤 단어와 관계가 있는 명령어를 man페이지에서 찾기를 원한다면 man페이지 데이터베이스를 찾아보는 apropos명령어를 사용하면 됩니다. 다음 명령어는 man페이지 NAME라인에서 crontab을 가지는 페이지를 보여줍니다.

$apropos crontab
...
/etc/anacrontab [anacrontab] (5) - configuration file for anacron
crontab                    (1)    - maintain crontab files for individual
                                      users (ISC Cron V4.1)
crontab                    (5)    - tables for driving cron ( ISC Cron V4.1)
crontabs                  (4) - configuration and scripts for running periodical jobs
...

 apropos 출력은 crontab을 포함하는 각 man 페이지 NAME라인을 보여준다. 숫자는 man 페이지에 나타나는 man 페이지 섹션을 보여줍니다.
 whatis명령어는 사용자가 입력한 단어를 포함하는 NAME라인만을 보여주는 방법입니다.

$whatis cat
cat                         (1)     - concatenate files and print on the standard output

 용어로 man페이지를 찾는 가장 쉬운 방법은 man 명령어 다음에 명령어 이름을 적는 것이다. 예를 들면, 다음과 같습니다.

$man find
FIND(1)                                        FIND(1)
NAME
            find - search for files in a directory hierarchy
SYNOPSIS
            find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...][expression]
...

이상과 같이 find 명령어와 관련된 첫 번째 man페이지를 표시합니다. 사용자가 이전의 예에서 보았던 것처럼, 일부 용어는 여러 가지의 man 페이지를 가집니다. 예를 들어, crontab으로 검색을 하게 되면 crontab 명령어와 crontab과 관련된 파일들에 대한 man페이지들이 나타납니다.

Man 페이지들은 여러가지 section별로 구성되어 있습니다.

 섹션
   1          - 일반 사용자 명령어
   2          - 시스템
   3          - 프로그래밍 루틴/라이브러리 함수
   4          - special 파일
   5          - configuration 파일과 파일 형식
   6          - 게임
   7          - 미분류 명령어들
   8          - 관리 명령어와 데몬들

  다음 코드들은 man 명령어에서 유용한 몇가지 옵션을 보여줍니다.
 $man mount -a               Show all man pages related to component
 $man 5 crontab               Show section 5 man page for component
 $man mount -P more       Use more, not less to page through
 $man --path                   List locations of man directories
/user/kerberos/man:/usr/local/share/man:/usr/share/man/en:
/usr/share/man:/usr/X11R6/man:/usr/local/man
 $man -f mount                 Same as the whatis command
 $man -k mount                Same as the apropos command

오랫동안, man 페이지를 표시하고 작동하는 방법들은 발전해 왔습니다. 예를 들면, man페이지를 man2html명령어를 사용하여 웹페이지(HTML)로 전환할 수도 있습니다. 예를 들면, 다음과 같습니다.

$where -m cat
cat: /usr/share/man/man1/cat.1.gz /usr/share/man/man1p/cat.1p.gz
$cd /tmp ; cp/usr/share/man/man1/cat.1.gz .
$gunzip cat.1.gz
$links cat.1.html

 첫 번째 명령은 cat man페이지를 찾습니다. 다음 명령은 그 man페이지를 /tmp 디렉터리에 복사하고 압축을 풉니다. 다음으로 man2html 명령어는 man페이지를 HTML(cat1.html파일)로 변환합니다. 그러고 나서 link(커맨드라인 기반의 웹브라우저)는 shell에서 웹 스타일의 man 페이지를 보여줍니다(link또는 elinks 텍스트 기반의 웹브라우저를 사용하기 위해서는 elinks패키지를 설치할 필요가 있다).




알아두기
$ reboot - 다시 시작
$ poweroff - 종료
입니다.

맨날 남이 포스팅한것만 보다가 직접 포스팅 해보니까

매우... 힘드네요. 여태까지 저에게 도움을 줬던 포스트들 너무 너무 너무

고맙습니다.ㅜ;;

아무튼 본격적인 Fedora설치 시작할께요.
왼쪽 상단에 보이시는 Favorites에 보면 FedoraServer라고 보이시는 것을 클릭해주세요.



 

그러면 이런 창이 뜨는데 저기 동그라미 쳐져있는 것을 클릭하면 Fedora가 부팅됩니다.

 

그리고 오른쪽 하단에 저것 보이시죠? 저게 바로 CD롬인데 ISO파일이나 CD를 불러오는 버튼입니다.





VMWare가 부팅됩니다.






Log In해주시구요.





Install to Hard Drive보이시죠. 클릭하고 Enter눌러주세요`~






드디어 Install시작 Next~!





언어 설정 Korean으로~





Basic Storage Devices를 선택하고





자신이 설치하고 싶은 HardWare를 선택...




Error메시지입니다. Re Initialize all을 선택해 주세요.





이거 나오기 전에 에러메시지 하나 더 뜨시는 분이 계실텐데 그것도 포맷하겠다고 눌러주심 되요.
HostName적어주시고 Next





시간대 설정해주시고 Next





Password입니다. 적어주시고 Next





사전에 있는 단어라고 쓰고싶음 쓰고 말고싶음 말라는 경고문입니다. Use Anyway눌러주세요.




아.. 여기서부터 쬐끔 어려워지는데요...
Create Custom Layout을 선택하고 Next





이제 파티션입니다. Linux에서는 파티션을 나눌 때, 조금 세밀하게 나눠주어야 하는데요.





Standard Partition하시고 Create





부팅할 때, 필요한 것들을 저장할 Size를 지정해 파일에 담아주는 겁니다.
Mouse Point를 /boot으로 설정해 주시고, File System Type은 ext3, Size는 300~500MB으로 설정해주신 후, OK를 눌러주시면 됩니다.





이번에 설정할 것은 가상메모리입니다. 보통은 아까 설정한 메모리에서 2배정도 설정해주시면 됩니다.





그 후, 설정해주어야 할 것은 사용자가 실제로 쓸 Hardware의 용량입니다.
아래처럼 설정해 주시고, OK를 눌러주세요.





아래처럼 설정된 것들이 보이시죠? Next를 눌러주세요.





Format을 눌러주시구요.





아래같이 설정이 됐다면 Next를 눌러주세요.




설치가 시작됩니다.




이렇게 설치가 끝납니다.

설치 완료 후, 재부팅 해주시구요. 그 다음에 설정해야 하는 것들은 사용자 정의 설정이기 때문에

여러분들이 알아서 체크해주시면 됩니다.


 

바탕화면에서 아래의 아이콘을 찾아서 더블클릭






OK누르시고...





이제 New Virtual Machin을 클릭해줍니다.





그리고 Custom에 체크를 하고 Next






그러면 아래와 같은 창이 뜨는데 Hardware compatibility : 를 Workstation 6.5-7.0으로 다음의 그림과 같이 맞춰줍니다.





그 후 CD를 삽입하여 CD가 있는 드라이브(첫번째에 체크 )를 설정해 주면 됩니다.
iso파일인 경우에는 두번째체크박스인 Installer disc image file(iso)를 체크하고, 경로를 설정해주면 됩니다.(iso다운은 http://fedoraproject.org/get-fedora)에서 받으세요. 불법 아닙니다.)





아래의 체크박스에서 Linux를 선택한 후 Version을 Other Linux 2.6.x kernel로 바꿔줍니다.




Location은 virtual machine설치 장소이고, Virtual machine name은 사용하고 싶은 이름을 설정하여 next를 눌러줍니다.





그 후 processors와 cores per processor를 1로 맞춰주고 next





이것은 Virtual Machine에 사용할 렘입니다. 보통은 256으로 맞추는데 저는 널널하게 512로 맞췄어요. 자신의 렘 성능에 맞게 써주세요;;




2번째 체크박스 클릭하고 next





LSI Logic(Recommended)선택





Create a new virtual disk 선택





SCSI(Recommended)선택하고





이곳은 virtual machine의 harddisk를 설정하는 부분 맨위의 칸에 원하는 gb를 설정한다.





HardDisk로 쓸 vmdk확장자의 이름을 정해주는 곳. next~!





이제 거의 끝났군요;;





완료됐을 때의 화면입니다.





이제 VirtualMachine의 성능을 업그레이드 하는 법과 다운그레이드 하는 법입니다.
먼저 렘부터. 아래 사진을 보면 Memory 512MB부분에 붉은 동그라미 보이시죠.
그걸 더블클릭해주세요.





그러면 이런창이 뜰꺼에요. 그럼 아래의 그림처럼 오른쪽 부분에 동그라미 안의 숫자를 바꾸면 렘의 용량이 바뀝니다.





이번엔 HardDisk의 용량을 바꿔보겠습니다.
아래의 그림처럼 붉은 동그라미를 더블클릭.





그 후 HardDisk를 Remove시켜버려요.
(만약에 이곳에 운영체제 깔고 Remove하는거면 당장멈춰요. 다 날아가버릴지도 몰라요.)





그 후 Add해주면 됩니다.





그럼 이런게 뜨는데 첫번째 HardDisk를 클릭하고 Next





첫번째 체크박스(Create a new virtual disk를 클릭하고 next~!)





SCSI를 클릭하고 Next~!





여기서 용량을 적어주고 Next~!





그 다음에 이름을 설정 Next





드디어 완료...ㅜ;;




Fedora설치는 3에서 할께요.


next를 눌러 다음으로


typical은 기본적으로 설정되어 있는 프로그램들만 인스톨됨.
custom은 자신이 마음대로 설치할 수 있음.
잘 아시는 분은 custom쓰시면 되구요. 잘 모르시는 분들은 typical쓰시면 됩니다.


어떤 환경에서 작업을 하실것인지 설정하는 것입니다.
debuggers는 vmware가 문제가 생겼을 경우 그 시스템을 디버깅하기 위해 있는것입니다.
visual studio쓰시는 분은 첫번재 체크
eclipse로 자바프로그래밍 하시는 분은 두번재 체크
eclipse로 c나 c++쓰시는 분은 세번째것을 체크해주세요.
프로그래밍 안하시는 분은 체크안해도 됩니다.


이건 영어읽어보면 다 알겠죠?


인스톨 되네요...


시리얼 넘버 입력해주시구요.


끝났습니다. 이제 Workstation설정하면 되겠네요.