Objective C의 Hello world 를 우분투에서도 한번 돌려 봤습니다.

 

음....

우분투에서는

$ sudo apt-get install gobjc

를 해야 제대로 컴파일이 됩니다.

 

 

 

음... Objective C를 컴파일 하려고 봤더니 죄다 OSX에서 아이폰 개발에 대한 글 밖에 없네요 ㅠㅠ..

주말 내내 찾다가 겨우 몇몇 방법을 터득해서 포스팅합니다.

 

굳이 왜 OSX가 아니고 솔라리스에서 그짓을 하실분이 몇 되실진 잘 모르겠습니다만... ㅠㅠ

 

 

1. 우선 전 그놈인터페이스를 철저히 이용하는 위주라.... Package Manager에 Objective C 항목을 모두 설치해 줍니다.

 

 

2.  네이버/구글링으로 검색되는 수많은 Objective-C의 Hello World 예제에 사용되는

//솔라리스에서는 바로 안되는 Hello world 

#import <Foundation/Foundation.h>

void main(){

NSLog(@"Hello World");

}

   

위 소스....

저건  Next에서 초장기 제공되는 몇몇 라이브러리.. cocoa 였던거 같습니다만. 뭐 그런게 붙어야 하는데.

솔라리스 기본 응용프로그램 패키지에서는 설치되지 않는거 같습니다.

 

여튼.. 적당한 디렉토리 만들고 거기에 vi main.m 을 한뒤 다음과 같은 소스를 넣습니다

처음에는 그냥 C/C++ 의 hello world 랑 뭐가 달라 했지만, #include 가 #import로 바뀌었습니다.. ;;; (헐...)

그 이외에... printf를 사용해서 문자열 처리... 헐..... 그냥 C네...   

 

이후 컴파일은

gcc -x objective-c -Wno-import <파일이름> -lobjc -o <출력파일>

로 하면 됩니다만...

맨날 뭐좀 하려 할때마다 저거 치면 빡치니... makefile를 만들어 줍니다.

 

 

이 모든것을 했을때 결과...

 

아..... 겨우 Hello world가 나왔습니다 ㅠㅠ

 

참고 : http://b4you.net/blog/198

 

추가 !!

 

음.. 그래도 저거 가지고는 좀 아닌거 같다 해서 이번엔 좀더 확실한 Objective-C의 Hello World 예제를 구해 컴파일 해보았습니다.

 

 

이것에 대한 출처는 : http://gnustep.made-it.com/BG-objc/index.html#AEN73

 

2003년 버젼이니 지금의 cocoa에 휘둘리지 않아도 될꺼 같습니다. 

 

 

솔라리스라고... 유닉스 종류중 하나입니다.

보통 서버계열에서 많이 쓰고, 서버 프로그래머로서 그 원천을 모르면 안되겠다 싶어 설치해 보았습니다.

우선 필요한건 같은 회사에서 제작한 버츄얼 박스에 가상PC를 돌릴생각입니다.

 

솔라리스를 받는곳은

영화 메트릭스의 오라클씨에게.........

 

http://www.oracle.com/us/products/servers-storage/solaris/solaris11/overview/index.html?origref=http://www.oracle.com/us/products/servers-storage/solaris/index.html

 

여기서 얻을 수 있습니다. 간단한 ID무료 가입후 이미지 롬 파일을 다운 받습니다.

 

 

설치하는 방법입니다. 저는 그냥.... 같은 회사꺼인 버츄얼 박스를 사용했고요..

1. 새로 만들기를 눌러 새 가상 PC를 만듭니다.

 

 

2. 이름은 그냥... 현재(2012.12.08) 최신 버젼인 솔라리스 11을 선택합니다.

 

 

3. 램과 하드 디스크 만들기는 적당히 조절해 줍니다.

 

 

4. 가상  PC가 만들어 졌습니다. 이제 이걸로 부팅합니다.

 

 

5. 처음에 아무것도 없으니, 시동디스크를 넣어달라는 박스가 뜹니다. 거기서 오라클씨에게 다운받은 이미지를 선택합니다.

 

 

 

6. 음....부팅화면이 뜨네요... 그냥 맨 처음꺼로 선택합니다. 

 

 

7. 키보드랑. 언어를 선택하라고 합니다. 음... 자신있는 언어를 선택해 줍니다ㅋ

 

 

8. 이것은... gnome인터페이스!!!

 저는 솔직히 여기서 이게 끝인줄 알았습니다. 유분투나, 센토스(CentOS).. 리눅스 몇번 만져본 저로선 그놈이 뜨니... orz

 하지만 이건 그냥.... 설치화면의 일부분입니다. 바탕화면에 오라클 솔라리스 설치를 살포시 눌러줍시다.

 

 

 

9. 음.... 이 무슨 시츄레이션인지 몰라도 어쨋든 우리가 보고싶은 화면이 떳습니다...

초보자는 접근도 하지 말라는 간접 경고라 생각하고 다음을 누릅니다.

 

 

10. 설치화면에 대해선... 그냥 읽어보시면 될꺼 같아 자세한 언급은 안하겠습니다 (;;;;;;;)

 

 

 11. 설치를 다한 뒤 재부팅을 하는데 아까와 같은 화면이 나왔다면, 메인메뉴 장치-> CD/DVD장치에서 아까 선택한 설치 이미지롬의 마운트를 해제해 주고 다시 재부팅 시킵니다.

 

 

12. 음... 이제 원하던 화면이 떳습니다. 그냥 엔터!

 

 

 13. 아까 설치중 설정한 계정과 패스워드를 입력해 줍니다.

밑에 인터페이스가 있는데, 전 조금 편하게 그놈을 선택했습니다.

xterm 환경도 선택이 가능합니다.

 

 

14. 그럼 텅텅빈 유닉스가 맞아 줍니다... (아까랑 화면이 똑같은 그놈..)

여기서 바탕화면에 소프트웨어 추가로 원하던거 선택해서 설치를 해줍니다.

... 예를들어 gcc나.. make나... lib나....gedit,  vi 같은것을.... 

 

 

15. 음.... 여기서 받는 시간은 좀 오래 걸리는거 같더군요..

 여튼 400여 메가를 1시간 반정도에 다운받아 설치가 완료 되었습니다.

터미널을 열어서 gcc랑 vi가 있는지 확인했습니다.

 

이제 남은것은... vi!!!!!!!

음..... 해피해킹 키보드 단종됬는데.... 일본아마존 들어가서 해외구매로 구입해야 할꺼 같습니다. ㅠㅠ

 

음. ActiveX를 안써도 되겠거니 했지만, 테스트 해보니 클라이언트쪽 레지스트리를 가져오는게 아니고

서버 쪽의 레지스트리 값을 가져오네요.. (뭐... 당연한거지만....)

 

출처 : http://support.microsoft.com/kb/316151/ko

 

Imports System.Diagnostics
Imports Microsoft.Win32

 

    Sub WriteRegistry(ByVal ParentKey As RegistryKey, ByVal SubKey As String, _
    ByVal ValueName As String, ByVal Value As Object)

        Dim Key As RegistryKey

        Try
            'Open the registry key.
            Key = ParentKey.OpenSubKey(SubKey, True)
            If Key Is Nothing Then 'if the key doesn't exist.
                Key = ParentKey.CreateSubKey(SubKey)
            End If

            'Set the value.
            Key.SetValue(ValueName, Value)

            Console.WriteLine("Value:{0} for {1} is successfully written.", Value, ValueName)
        Catch e As Exception
            Console.WriteLine("Error occurs in WriteRegistry" & e.Message)
        End Try
    End Sub

 

    Sub ReadRegistry(ByVal ParentKey As RegistryKey, ByVal SubKey As String, _
        ByVal ValueName As String, ByRef Value As String)

        Dim Key As RegistryKey

        Try
            'Open the registry key.
            Key = ParentKey.OpenSubKey(SubKey, True)
            If Key Is Nothing Then 'if the key doesn't exist
                Throw New Exception("The registry key doesn't exist")
            End If

            'Get the value.
            Value = Key.GetValue(ValueName)

            'Console.WriteLine("Value:{0} for {1} is successfully retrieved.", Value, ValueName)
        Catch e As Exception
            'Console.WriteLine("Error occurs in ReadRegistry" & e.Message)
        End Try
    End Sub

 

 

Sub Main()
    WriteRegistry(Registry.CurrentUser, "Software\MySoftware", "Count", 123)

    Dim Value As Object
    ReadRegistry(Registry.CurrentUser, "Software\MySoftware", "Count", Value)

    Console.ReadLine()
End Sub

 

설명은 생략...

해외에서는 IE점유율이 없어서...

즉, ActiveX를 싫어해서, Asp.net 을 이용해서 레지스트리 값을 얻어온뒤 게임을 실행하는 방법을 연구중...

 

이전에 구글링해서 얻은 자료는 2001년꺼라... 작동도 안되고 ㅠㅠ..

 

어쨋든... 이후 프로그램 실행은..

Dim gamePath As String
gamePath = ""
ReadRegistry(Registry.CurrentUser, "Software\OceanFishing", "Path", gamePath)
Shell(gamePath + " " + GameLauncherIncode(id, 12345678), AppWinStyle.NormalFocus)

 

이런식으로 실행시키면 ok.....

 

게임서버와 웹, 빌링쪽에 연동하려할때 상대쪽에선 자바나 펄위주라 md5에 대한 암호 방식을 선호하던군요.

문제는 이걸 게임서버 (C++)에서 이용하려 할때 마땅한 정보가 없더군요.. ㅠㅠ

그러더중 msdn을 훝어보던중 적당한 예제소스를 발견했습니다.

 

참고 : MD5 ? http://ko.wikipedia.org/wiki/MD5

그리고 전체 알고리즘 : http://www.zedwood.com/article/121/cpp-md5-function

출처 : http://msdn.microsoft.com/ko-kr/library/windows/desktop/aa382380(v=vs.85).aspx

 

.. 좀더 핵심만, MD5 압축데이터를 얻고 오고 싶을때는...

#include <iostream>

#include <windows.h>

#include <wincrypt.h>

 

/*!==========================================================================================

 * @brief     MD5 해쉬 데이터를 얻어오기

 * @return    bool                                           성공/실패

 * @param     char * buffer                                  입력 버퍼

 * @param     DWORD dwBufferSize                             입력 문자열 사이즈 "\0"제외

 * @param     BYTE * byteFinalHash                           결과 해쉬 버퍼

 * @param     DWORD * dwFinalHashSize                        결과 해쉬 버퍼의 크기

 * @author    Kim Dong-Sung (galaxy_wiz@naver.com)

 * @date      2012-11-30

 ==========================================================================================*/

bool GetMD5Hash(char *buffer, DWORD dwBufferSize, BYTE *byteFinalHash, DWORD *dwFinalHashSize)

{

        DWORD          dwStatus       = 0;

        BOOL           bResult        = FALSE;

        HCRYPTPROV     hProv          = 0;

        HCRYPTHASH     hHash          = 0;

        DWORD          cbHashSize     = 0;

 

        try{

               //프로바이더 압축핸들 얻어오기

               if(0 == CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT))

                       throw "CryptAcquireContext";

 

               //압축알고리즘 선택, 여기서는 MD5

               if(0 == CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash))

                       throw "CryptCreateHash";

 

               //입력된 버퍼를 기반으로 헤쉬 데이터 생성

               if(0 == CryptHashData(hHash, (const BYTE*) buffer, dwBufferSize, 0))

                       throw "CryptHashData";

 

               // 해쉬 사이즈얻어오기

               DWORD dwCount = sizeof(DWORD);

               if(0 == CryptGetHashParam(hHash, HP_HASHSIZE, (BYTE*)&cbHashSize, &dwCount, 0))

                       throw "CryptGetHashParam";

 

               //출력버퍼에 헤쉬데이터를 충분히 담을 있는지 확인

               if(*dwFinalHashSize < cbHashSize){

                       printf("\n Output buffer %d, is not sufficient, Required size = %d", *dwFinalHashSize, cbHashSize);

                       bResult = TRUE;

                       throw "Memory problem";

               }

 

               //이제 해쉬를 계산해서 얻기

               if(CryptGetHashParam(hHash, HP_HASHVAL, byteFinalHash, dwFinalHashSize, 0)){

                       bResult = TRUE;

               }

               else{

                       throw "CryptGetHashParam";

               }

              

        }

        catch(char *errMsg){

               printf("%s failed, Error=0x%.8x\n", errMsg, GetLastError());

        }

 

        if(hHash)      CryptDestroyHash(hHash);

        if(hProv)      CryptReleaseContext(hProv, 0);

 

        return bResult;

}

 

int main(int argc,char *argv[])

{ 

        BYTE byteHashbuffer[256];

        DWORD dwFinalHashSize= 256;

        CHAR str[] = "password";

 

        //_count_of(str)-1을 해서 맨 뒤의 '\0'을 뺀 버퍼 사이즈를 넣음.배열검사 생략했음

        GetMD5Hash(str, _countof(str)-1, byteHashbuffer, &dwFinalHashSize);

 

        printf("%s\n", byteHashbuffer);

        return 0;

} 

 

대충 감을 잡으실수 있을꺼 같습니다.

위의 예제 단어 "password"의 경우 메모리 디버거에서는

 

 

 

같은 결과 값이 나왔습니다.

+ Recent posts