VMWare Fusion 6를 설치 하고 Guest에 고정아이피(Static IP) 를 부여 하는 방법입니다.

Guest를 추가하고, 각 Guest간에 통신을 하기 위해선 고정IP로 할당 되어야 하는데 설정에서는 지원을 하지 않습니다.


네트웍 세팅 

VMWare Fusion >> Preferences >> Network

vmnet2를 추가했습니다. 외부와 통신이 필요하기에 아래 옵션을 전부 활성화 합니다. 
그리고 내부 아이피를 192.168.3.0 으로 설정합니다. 이건 원하는 내부 아이피를 넣으면 됩니다.

DHCP 설정 파일 편집

sudo vim /Library/Preferences/VMware\ Fusion/vmnet2/dhcpd.conf

아래 내용을 맨 하단에 넣습니다.

host vm101{ hardware ethernet 00:50:56:00:00:01; fixed-address  192.168.3.101; }
host vm102{ hardware ethernet 00:50:56:00:00:02; fixed-address  192.168.3.102; }
host vm103{ hardware ethernet 00:50:56:00:00:03; fixed-address  192.168.3.103; }
host vm104{ hardware ethernet 00:50:56:00:00:04; fixed-address  192.168.3.104; }
host vm105{ hardware ethernet 00:50:56:00:00:05; fixed-address  192.168.3.105; }
host vm106{ hardware ethernet 00:50:56:00:00:06; fixed-address  192.168.3.106; }
host vm107{ hardware ethernet 00:50:56:00:00:07; fixed-address  192.168.3.107; }
host vm108{ hardware ethernet 00:50:56:00:00:08; fixed-address  192.168.3.108; }
host vm109{ hardware ethernet 00:50:56:00:00:09; fixed-address  192.168.3.109; }
host vm110{ hardware ethernet 00:50:56:00:00:10; fixed-address  192.168.3.110; }

위 내용은 Mac Address 별로 고정된 IP를 부여하도록 설정 하는 것인데, "00:50:56:00:00:XX"와 같이 VM Guest의 NIC에 등록 하면 해당 NIC가 고정 IP를 할당 받게 됩니다.


Guest NIC에 MAC 수정 하기

Guest의 Setting >> Removable Device >> Network Adapter

맨하단 "vmnet2"가 선택되어있으며, "Advanced options"에서 원하는 Mac을 입력 하면 끝

Guest VM에서 확인하면 끝



저작자 표시 비영리 변경 금지
신고

'컴퓨팅' 카테고리의 다른 글

[MAC] VMWare Fusion 6에서 Static IP 설정하기  (200) 2014.09.16
Java Log4j Custom PatternLayout  (0) 2013.06.14
모든 것을 문서화 하라  (0) 2012.02.15
Posted by 지누스

댓글을 달아 주세요

  1. 이전 댓글 더보기
  2. 부산울산 2016.05.28 17:48 신고  댓글주소  수정/삭제  댓글쓰기

    분실폰 매입 부산 울산 대구 대전 광주 직거래 카톡 su77333

  3. 2016.05.28 23:31 신고  댓글주소  수정/삭제  댓글쓰기

    분실폰 직거래 서울경기 매입카톡 su77333 텔레그램아이디 @sun7744 위쳇 mamsu 2580주운폰 습득폰

    중고폰 최고 대우분실폰 매입카톡 su77333 주운폰 습득폰 중고폰 최고 대우

    와이파이 부품폰 매입 중고폰 최고 대우 텔레그램아이디 @sun7744

    카톡 su77333 위쳇 mamsu 2580 직거래 가능

  4. 2016.05.30 14:44 신고  댓글주소  수정/삭제  댓글쓰기

    분실폰 직거래 서울경기 매입카톡 su77333 텔레그램아이디 @sun7744 위쳇 mamsu 2580주운폰 습득폰

    중고폰 최고 대우분실폰 매입카톡 su77333 주운폰 습득폰 중고폰 최고 대우

    와이파이 부품폰 매입 중고폰 최고 대우 텔레그램아이디 @sun7744

    카톡 su77333 위쳇 mamsu 2580 직거래 가능

  5. 2016.05.30 20:35 신고  댓글주소  수정/삭제  댓글쓰기

    분실폰 직거래 서울경기 매입카톡 su77888 텔레그램아이디 @sun7744 위쳇 mamsu 2580주운폰 습득폰

    중고폰 최고 대우분실폰 매입카톡 su77888 주운폰 습득폰 중고폰 최고 대우

    와이파이 부품폰 매입 중고폰 최고 대우 텔레그램아이디 @sun7744

    카톡 su77888 위쳇 mamsu 2580 직거래 가능

  6. 부산울산 2016.05.31 00:21 신고  댓글주소  수정/삭제  댓글쓰기

    분실폰 매입 부산 울산 대구 대전 광주 직거래 카톡 sss2555

  7. 부산울산 2016.05.31 16:03 신고  댓글주소  수정/삭제  댓글쓰기

    분실폰 매입 부산 울산 대구 대전 광주 직거래 카톡 sss2555

  8. 부산울산 2016.06.01 22:48 신고  댓글주소  수정/삭제  댓글쓰기

    분실폰 매입 부산 울산 대구 대전 광주 직거래 카톡 sss2555

  9. 부산울산 2016.06.09 00:09 신고  댓글주소  수정/삭제  댓글쓰기

    분실폰 매입 부산 울산 대구 대전 광주 직거래 카톡 sss2555

  10. 부산울산 2016.06.09 17:06 신고  댓글주소  수정/삭제  댓글쓰기

    분실폰 매입 부산 울산 대구 대전 광주 직거래 카톡 sss2555

  11. 부산울산 2016.06.11 16:23 신고  댓글주소  수정/삭제  댓글쓰기

    분실폰 매입 부산 울산 대구 대전 광주 직거래 카톡 sss2555

  12. 부산울산 2016.06.12 01:57 신고  댓글주소  수정/삭제  댓글쓰기

    분실폰 매입 부산 울산 대구 대전 광주 직거래 카톡 sss2555

  13. 부산울산 2016.06.14 11:43 신고  댓글주소  수정/삭제  댓글쓰기

    분실폰 매입 부산 울산 대구 대전 광주 직거래 카톡 sss2555

  14. 부산울산 2016.06.15 01:00 신고  댓글주소  수정/삭제  댓글쓰기

    분실폰 매입 부산 울산 대구 대전 광주 직거래 카톡 sss2555

  15. 부산울산 2016.06.15 23:07 신고  댓글주소  수정/삭제  댓글쓰기

    분실폰 매입 부산 울산 대구 대전 광주 직거래 카톡 sss2555

  16. 부산울산 2016.06.16 15:49 신고  댓글주소  수정/삭제  댓글쓰기

    분실폰 매입 부산 울산 대구 대전 광주 직거래 카톡 sss2555

  17. 김대리 2016.06.17 23:28 신고  댓글주소  수정/삭제  댓글쓰기

    이쁜여자들과
    꽁자10만들임니다.
    후회없는선택 2016인생역전

    na336.com

  18. 김대리 2016.06.19 09:37 신고  댓글주소  수정/삭제  댓글쓰기

    이쁜여자들과
    꽁자10만들임니다.
    후회없는선택 2016인생역전

    na336.com

  19. 부산울산 2016.06.22 01:38 신고  댓글주소  수정/삭제  댓글쓰기

    분실폰 매입 부산 울산 대구 대전 광주 직거래 카톡 sss2555

  20. 부산울산 2016.06.23 14:26 신고  댓글주소  수정/삭제  댓글쓰기

    분실폰 매입 부산 울산 대구 대전 광주 직거래 카톡 sss2555

  21. 부산울산 2016.06.26 00:44 신고  댓글주소  수정/삭제  댓글쓰기

    분실폰 매입 부산 울산 대구 대전 광주 직거래 카톡 sss2555

Switch

  • LACP - mac address for IP
  • 802.3ad must be supported

Machine

  • Bonding mode 0 - balanced-rr

구성했을때 최대 Bandwidth는 380~390MByte

저작자 표시 비영리 변경 금지
신고
Posted by 지누스

댓글을 달아 주세요

Message (Data) Serialization 방법들은 여러가지가 있다. 특히 이기종 간에 객체 전달을 보장 하기 위해서 각각이 여러가지 제약 조건들이 있다..

그중에 최근 많이 쓰이고 있는 것들은

비교 자료 들은 여러 곳에서 찾을 수 있다.

http://www.slideshare.net/IgorAnishchenko/pb-vs-thrift-vs-avro

정리하면, Avro는 동적 전환이 가능 하며 C를 지원 하고, Thrift 와 Protocol Buffer는 명확한 데이터 형을 코드상에 Define 해두어야 한다. 그리고 다양한 형(Type)을 지원하기 위해 지원되는 언어들이 객체지향 언어가 많다. Official 하게는 C를 지원하지 않는다.

Message Pack(msgpack)은 Avro와 비슷한 특성을 지니고 있지만 조금 다른면이 있다. 기본적으로 Schema 등과 같은 데이터 Type Definition이 필요 없고, Serialized 된 데이터 크기도 상당히 작은 장점이 있다.

https://github.com/eishay/jvm-serializers/wiki

또한 Message Pack은 기본적으로 Protocol 을 공개하고 다양한 OpenSource Contributers에 의해 구현된 구현체 들이 존재 한다. 가장 맘에 드는 부분은 C(C++)로 된 구현체가 메인격에 속하고, Serialization 속도도 빠르고 결과 데이터도 다른 것들 보다 상당히 작은 편에 속한다.( 첫번째 링크 참고)

Avro역시 C 버전이 존재하지만, Documentation이 너무 약하고 심지어 API 주석 조차 없어, 개발 하는데 정말 안습한 상황이다. 그나마 Java는 지원이 괜찮아 많은 User가 존재한다. 자바를 보고 C버전을 이해할 수도 있자나? 라는 말은 하지말자. 이미 우리에게 MessagePack이 있다.

부차적인 얘기지만 개인적으로 구현해서 쓰던 허접한 Protocol과도 상당히 유사해서 애정이 간다고나 할까?ㅋ 기존 코드에 해당 영역만 바꾸면 돼서 일꺼리도 크게 줄었다.

C 라이브러리는 아래 Github url에서 가져오자.

https://github.com/msgpack/msgpack-c

C로 MessagePack을 사용할때 주로 맞닥들이는 상황은, 데이터를 Pack(Serialized) 했지만, Unpack 정보가 부족 하다는 것이다.

아래는 Pack하는 예제이다.

    char *buf = NULL;
    msgpack_sbuffer sbuf;
    msgpack_sbuffer_init(&sbuf);
    msgpack_packer pck;
    msgpack_packer_init(&pck, &sbuf, msgpack_sbuffer_write);
    /* The array will store `num` contiguous blocks made of a, b, c attributes */
    msgpack_pack_array(&pck, 3 * num);
    for (int i = 0; i < num; ++i) {
        msgpack_pack_uint32(&pck, s[i].a);
        msgpack_pack_uint32(&pck, s[i].b);
        msgpack_pack_float(&pck, s[i].c);
    }

위와같이 Pack을 할때는 Type별로 Pack을 하고 있는데, Uppack 할 함수를 찾아 보면 Type별 Unpack 함수가 없다. msgpack_unpack_next() 함수가 거의 전부인 상황이다. 이것은 Library의 특성인데, 기본적인 데이터 타입인 msgpack_object 내부를 보면 해답을 찾을 수 있다.

typedef struct msgpack_object {
    msgpack_object_type type;
    msgpack_object_union via;
} msgpack_object;

typedef union {
    bool boolean;
    uint64_t u64;
    int64_t  i64;
    double   dec;
    msgpack_object_array array;
    msgpack_object_map map;
    msgpack_object_raw raw;
} msgpack_object_union;

msgpack_object는 type과 via msgpack_object_union을 가지고 있다. 각 데이터 타입별로(전체는 아니지만) 데이터 형을 Union 으로 가지고 있으면서, type을 기준으로 적절히 데이터를 끄집어 내야 한다. 아래 예제중 끄집어 내는 부분을 보자.

    some_struct *s = NULL;
    msgpack_unpacked msg;
    msgpack_unpacked_init(&msg);
    if (msgpack_unpack_next(&msg, ptr, size, NULL)) {
        msgpack_object root = msg.data;
        if (root.type == MSGPACK_OBJECT_ARRAY) {
            assert(root.via.array.size % 3 == 0);
            *num = root.via.array.size / 3;
            s = malloc(root.via.array.size*sizeof(*s));
            for (int i = 0, j = 0; i < root.via.array.size; i += 3, j++) {
                s[j].a = root.via.array.ptr[i].via.u64;
                s[j].b = root.via.array.ptr[i + 1].via.u64;
                s[j].c = root.via.array.ptr[i + 2].via.dec;
            }
        }
    }

위처럼 root .type을 기준으로 해당 데이터를 적절히 처리 하거나(!), 또는 전체 type를 확인해 가면서 데이터를 General 하게 parsing 하도록 해야 한다. 하지만 이건 C에서 불가능 하자나. PHP 라이브러리가 이런 구조로 되어있다.

전체 소스

Soure Reference : http://stackoverflow.com/questions/15393838/how-do-i-unpack-and-extract-data-properly-using-msgpack-c

#include 
#include 
#include 

typedef struct some_struct {
    uint32_t a;
    uint32_t b;
    float c;
} some_struct;

static char *pack(const some_struct *s, int num, int *size);
static some_struct *unpack(const void *ptr, int size, int *num);

/* Fixtures */
some_struct ary[] = {
    { 1234, 5678, 3.14f },
    { 4321, 8765, 4.13f },
    { 2143, 6587, 1.34f }
};

int main(void) {
    /** PACK */
    int size;
    char *buf = pack(ary, sizeof(ary)/sizeof(ary[0]), &size);
    printf("pack %zd struct(s): %d byte(s)\n", sizeof(ary)/sizeof(ary[0]), size);

    /** UNPACK */
    int num;
    some_struct *s = unpack(buf, size, &num);
    printf("unpack: %d struct(s)\n", num);

    /** CHECK */
    assert(num == (int) sizeof(ary)/sizeof(ary[0]));
    for (int i = 0; i < num; i++) {
        assert(s[i].a == ary[i].a);
        assert(s[i].b == ary[i].b);
        assert(s[i].c == ary[i].c);
    }
    printf("check ok. Exiting...\n");

    free(buf);
    free(s);

    return 0;
}

static char *pack(const some_struct *s, int num, int *size) {
    assert(num > 0);
    char *buf = NULL;
    msgpack_sbuffer sbuf;
    msgpack_sbuffer_init(&sbuf);
    msgpack_packer pck;
    msgpack_packer_init(&pck, &sbuf, msgpack_sbuffer_write);
    /* The array will store `num` contiguous blocks made of a, b, c attributes */
    msgpack_pack_array(&pck, 3 * num);
    for (int i = 0; i < num; ++i) {
        msgpack_pack_uint32(&pck, s[i].a);
        msgpack_pack_uint32(&pck, s[i].b);
        msgpack_pack_float(&pck, s[i].c);
    }
    *size = sbuf.size;
    buf = malloc(sbuf.size);
    memcpy(buf, sbuf.data, sbuf.size);
    msgpack_sbuffer_destroy(&sbuf);
    return buf;
}

static some_struct *unpack(const void *ptr, int size, int *num) {
    some_struct *s = NULL;
    msgpack_unpacked msg;
    msgpack_unpacked_init(&msg);
    if (msgpack_unpack_next(&msg, ptr, size, NULL)) {
        msgpack_object root = msg.data;
        if (root.type == MSGPACK_OBJECT_ARRAY) {
            assert(root.via.array.size % 3 == 0);
            *num = root.via.array.size / 3;
            s = malloc(root.via.array.size*sizeof(*s));
            for (int i = 0, j = 0; i < root.via.array.size; i += 3, j++) {
                s[j].a = root.via.array.ptr[i].via.u64;
                s[j].b = root.via.array.ptr[i + 1].via.u64;
                s[j].c = root.via.array.ptr[i + 2].via.dec;
            }
        }
    }
    msgpack_unpacked_destroy(&msg);
    return s;
}




저작자 표시 비영리 변경 금지
신고
Posted by 지누스

댓글을 달아 주세요

Slashdot 에 올라온 Linus Torvalds Answers Your Questions 에서 Linus가 언급한 Pointer관련 내용을 알아보기 쉽게 정리한 글(Linus on Understanding Pointers)에서 중요한 포인터 활용을 배웠다.

요는 이중포인터,(**)는 포인터의 주소를 가리킨다는 것. 단순하지만 중요하고 명확하다.

예를 들어 아래와 같은 struct가 있다.

typedef struct list_entry {
    int val;
    struct list_entry *next;
} list_entry;

위의 Struct로 구성된 LinkedList를 순환하면서 val 의 값을 비교하여 삭제 하는 기능을 구현 할때 일반적으로 아래처럼 작성될 것 이다.

list_entry *entry = head; /* assuming head exists and is the first entry of the list */
list_entry *prev = NULL;

while (entry) {
    if (entry->val == to_remove)     /* this is the one to remove */
        if (prev)
           prev->next = entry->next; /* remove the entry */
        else
            head = entry->next;      /* special case - first entry */

    /* move on to the next entry */
    prev = entry;
    entry = entry->next;
}

하지만 토발츠는 위와같이 작업한 코드를 보면 '이 사람은 포인터를 제대로 이해하지 못한 사람이구나' 라고 생각한다고 합니다.

아래는 토발츠가 제시한 방법을 위 블로그에서 풀어놓은 코드입니다.

list_entry **pp = &head; /* pointer to a pointer */
list_entry *entry = head;

while (entry) {
    if (entry->val == to_remove)
        *pp = entry->next;

    pp = &entry->next;
    entry = entry->next;
}

위 코드가 원자적으로 동작하고 변수 if 조건절을 사용하지 않고... 등의 내용보다 실제 어떨때 이중 포인터(**)를 사용하는 지를 이해하는데 도움을 주는 코드이자 방법을 알려준 것 같습니다. 아주 간단하게 이중포인터를 이용해서 Atomic 연산을 보장 하도록 한 것이 중요하지만요..

저작자 표시 비영리 변경 금지
신고
Posted by 지누스

댓글을 달아 주세요

MongoDB Java API를 이용해서 Index를 생성하는 것은 ensureIndex() API를 이용합니다.

사용방법

BasicDBObject dbObj = new BasicDBObject();
dbObj.put("COLUMN_NAME1", 1);
dbObj.put("COLUMN_NAME2", -1); // 결합 Index도 이와같이 처리 가능함

DBCollection col = db.getCollection(COLLECTION_NAME);

// ensureIndex 명령어 하나로 index한개씩 생성 가능
col.ensureIndex(dbObj);

출처 : http://stackoverflow.com/questions/11488669/how-to-create-a-compound-index-in-mongodb-through-java-driver

저작자 표시 비영리 변경 금지
신고
Posted by 지누스

댓글을 달아 주세요



티스토리 툴바