Post

반응형
구글 프로토콜 버퍼 C++ Window 예제 (Google Protocol buffer)
 
구글 프로토콜 버퍼 프로젝트 다운로드 url : https://github.com/google/protobuf/releases/tag/v2.6.1
c++ 튜토리얼 url : https://developers.google.com/protocol-buffers/docs/cpptutorial
 
이 글은 아래 구글 프로토콜 버퍼 유튜브 강의를 정리한 내용입니다. 
 
구글 프로토콜 버퍼 : 구글에서 만든 데이터 직렬화 라이브러리.
 
1. Window용 구글 프로토콜 버퍼 프로젝트 다운로드
아래 사이트에서 Protocol Buffers v2.6.1 Source code(zip) 다운로드 후 압축풀기
 
 
2. protoc.exe 파일 만들기
protobuf-2.6.1\vsprojects\protobuf.sln 을 실행한다.
(이 때 gtest, gtest_main은 컨버터 실패로 사용할 수 없음 떠도 안쓰니까 괜찮다)
libprotobuf, libprotoc 프로젝트 속성 - C/C++ - 전처리기 정의
_SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS 를 추가한다
libprotobuf, libprotoc, protoc 프로젝트를 빌드한다.(빌드성공)
 
빌드 후 프로젝트 Debug 폴더에 들어가면 protoc.exe 실행파일이 생성되어있다.
이제 폴더를 새로 만들고 새폴더 안에 넣는다.
(D드라이브에 만들었고 폴더 이름은 protobufapply이다.
위치는 D:\protobufapply)
 
3. proto 파일 만들고 h, cc 파일 생성
텍스트 파일을 생성한다. 이름은 addressbook.proto
그리고 proto 파일에 아래와 같이 입력한다.
반응형
syntax = "proto2";
 
package tutorial;
 
message Person {
  required string name = 1;
  required int32 id = 2;
  optional string email = 3;
 
  enum PhoneType {
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
  }
 
  message PhoneNumber {
    required string number = 1;
    optional PhoneType type = 2 [default = HOME];
  }
 
  repeated PhoneNumber phones = 4;
}
 
message AddressBook {
  repeated Person people = 1;
}
 
 
그리고 cmd 창을 열고 다음 명령어 실행한다.
그러면 addressbook.pb.h, addressbook.pb.cc 파일이 생성되어있다.
protoc -I=. --cpp_out=. addressbook.proto
( 다음과 같이 사용하라고 적혀있다 protoc -I=$SRC_DIR --cpp_out=$DST_DIR $SRC_DIR/addressbook.proto )
 
4. 직렬화 샘플 프로젝트 생성
protobufapply 폴더안에 ProjectProto 폴더 생성한다.
그리고 ProjectProto 안에 새 vs 프로젝트를 생성한다.
(콘솔응용프로그램이고 EmptyProject, Precompiled header, Security Development 전부 체크 해제)
vs 프로젝트 폴더안에 addressbook.pb.cc , addressbook.pb.h 파일을 넣어준다.
프로젝트 소스파일에서도 넣어준다.
 
protobuf-2.6.1\vsprojects\protobuf.sln 솔루션 폴더에서 Debug 폴더 안에 있는 libprotobuf.lib 라이브러리를 복사해서
프로젝트 솔루션창에 붙여넣는다.
( 내 솔루션 폴더 위치 : D:\protobuf-2.6.1\protobuf-2.6.1\vsprojects\Debug )
 
그리고 
D:\protobuf-2.6.1\protobuf-2.6.1\src 위치를 복사 한 다음 
프로젝트 속성 - 구성속성 - VC++ 디렉터리 - 포함디렉터리에 
src 위치를 붙여넣는다.
그리고 빌드.
 
성공이라면 아무것도 없는 Main 함수 대신 
듀토리얼 페이지에 있는 샘플코드 Writing A Message 를 붙여넣는다.
빌드 성공이라면
프로젝트 속성 - 구성속성 - 디버깅 - 명령인수에 D:\protobufapply\myPhonebook.bin 입력.
 

프로젝트 실행 후 알맞은 데이터를 입력한다.

그리고 모든 입력을 마쳤다면 leave blank to finish 메시지가 보일 때 엔터를 눌러 빠져나온다.
그리고 D:\protobufapply 폴더로 가면 myPhonebook.bin 파일이 생성되어있다.
 
 
 
 
반응형

Post

반응형

구글 프로토콜 버퍼를 Window에서 사용하려고 이것저것 검색하다보니

윈도우에서 리눅스 프로그램을 사용할 수 있는 Cygwin 을 알게되었다.

설치는 어렵지 않았지만 몇가지 삽질했던 것을 적어본다.


1. select Packages 선택 시 Default 만 깔지 말자

 Default 선택 설치했는데 bin 폴더에 bash가 없었다..

 그래서 그냥 ALL 설치를 했는데 그래도 없는 패키지가 있었다..

 

2. Choose a Download Site에서 사이트 선택 

http://mirror.kakao.com 

(다음에서 카카오로 바뀌었다..)


3. 

1번과 연속적인 상황인데 정말 중요한 wget이 없었다.

난 분명 all 설치해서 다 선택하고 설치된줄 알았다..

알고보니 아래 그림처럼 wget 검색 시 Web의 1.19.1-2 의 Bin? 을 한번 선택해줘야

네모박스 안이 x표시가 되고 선택이 되는거였다ㅠㅠ....


4. Cygwin Path 설정

제어판 - 시스템 - 시스템 속성 - 고급 - 환경변수 - 시스템 변수 - Path

D:\cygwin64\bin;

라고 입력

cygwin64 은 설치폴더이므로 환경마다 이름이 다를 수 있다





반응형

Post

반응형

티스토리 에드센스에 좋은 스킨으로 바꾸는 법

feat. 오른쪽 메뉴 너비 늘리는법, 포스트 크기 늘리는 법


(사족이 깁니다^^;; 바쁘신 분들은 바로 아래로 가시면 됩니다)


직장일 때문에 일주일간 티스토리에 한번도 들어가질 못했다.

정신없는 평일을 보낸 후 일요일이 되어서야 티스토리에 들어왔는데

전에 신청해놓은 애드센스가 승인이 되어있었다!

(애드센스 광고 승인이 어렵다고 들었는데 쉬운것인지??

아무튼 1000자 넘는 50개의 포스팅을 안써도 되니 다행이다^^)


그리고 애드센스 승인 후에야 왜 사람들이 오른쪽메뉴바를 선호하는지 깨닫게 되었다.

마우스커서가 오른쪽에 있어야 편해서 광고 클릭을 잘하니까..


그걸 깨닫고 부랴부랴 애드센스에 알맞는 광고를 찾았다.

최소 조건은 반응형, 2단, 오른쪽이 너비가 넓을 것 3가지 조건이었다.

그런데 메뉴 넓이가 넓은건 단 한개도 없었다..


다행히 HTML, CSS는 대략 알았다.

그래서 HTML CSS 스킨 편집으로 가서 그럴듯한 이름?을 가진 스타일에 weith = 1000px; 를 넣으며

한땀한땀 노가다했다^^;;;


그리고 드디어 광고가 잘 보이기 위해

오른쪽 메뉴 너비를 크게 수정하는 법을 알았다!


수정 결과는 이렇다.


아래는 바꾸기 전




바꾸고 난 후



프로필 사진의 크기로 메뉴바 너비가 확실히 넓어진 것을 알 수 있다.



오른쪽 메뉴 너비 늘리는법

블로그 관리 - 꾸미기 - 스킨편집 - 사용중인 스킨 편집 - html 편집을 누른다.

아래와 같은 화면에 들어왔을 것이다.

여기서 HTML을 누르지말고 CSS를 누른다.



왠 이상한 영어들이 보일 것이다.

이 모든 영어를 복사해서 메모장에 붙여넣는다.


**잠시 알아야 할 것**

이제부터 영어 단어로 메뉴와 콘텐츠를 유추해야한다.

(내가 사용하는 스킨은 만든사람이 포스트 스타일을 .contentArea 라고 썻지만 당신이 사용하는  스킨의 포스트이름은 다를 수 있다)

이걸 만든것도 사람이 만든것이다. 그렇기 때문에 스타일(글자특징. 핑크색, 크기... 특징의 집합)이란것에 이름을 부칠 때

사람들은 비슷한 생각을 한다.

예를들어 티스토리 블로그 이름 크기 스타일을 만들고싶다... 만든사람은 스타일 이름을 뭘로 지을까?

아마 HeadName 이나 Ttitle 로 이름을 짓지 않을까??

그런식으로 메뉴와 포스트의 스타일 이름이 무엇일까 유추를 해야한다

그리고 유추된 스타일 이름에 width을 하나씩 바꿔본다!!

만약 메뉴 너비가 바뀌면? 그 스타일이 내가 수정하고 싶던 메뉴 너비에 관한 스타일이다!

내가 찾은 포스트 스타일은 contentArea 이다.

.contentArea 와 width: 가 같이있는 문장을 찾는다.


.contentArea {float:left; width:60%; margin:20px 0; padding:0 20px 20px 10px; font-size:12px; font-size:1.2rem; box-sizing:border-box; border-right:1px solid #dfdfdf;}

.sidebarArea {float:right; width:40%; margin-top:20px; padding:0 10px 20px 20px; font-size:12px; font-size:1.2rem; box-sizing:border-box;}


여기서 contentArea는 포스트 너비 sidebarArea는 메뉴 너비이다.

반응형이라서 그런지 퍼센트로 되어있다.

둘을 합쳐서 100%가 되게하고, 광고가 잘 나올것 같은 알맞은 비율을 주면된다.

(나는 위와 같이 했다)


포스트 너비 늘리는 법

근데 메뉴가 엄청 넓어져서 그런지 콘텐츠 영역은 쪼그라들어 보인다.

그럼 포스트 너비를 늘려야한다. 

포스트 너비를 늘리는 법은 간단하다.

.containerArea 를 찾는데 width 와 같이 있는 문장을 찾으면 된다.

나는 아래처럼 1000px로 변경했다. 훨씬 넓어보인다.


/* LAYOUT */

.menuS {position:absolute; top:0; list-style-type:none; width:430px; margin:0; padding:0 10px;}

.menuS li {display:inline; margin:0; padding:0; font-size:12px; font-size:1.2rem; color:#000;}

.menuS a {position:absolute; top:-200px; left:0; display:block; padding:5px 10px 7px; background-color:#dfdfdf;}

.menuS a:focus {top:0; left:0;}


.containerArea {width:100%; max-width:1000px; margin:40px auto 15px;}




그런데 아직 최상단광고(게*이미지*크 광고 영역)를 늘리기 위해 무엇을 수정해야하는지는 잘 모르겠다.
혹시 알게되면 이 블로그에 기록해두어야겠다.




반응형

Post

반응형


네이버에서 검색되도록 하는 법


네이버에서 내 티스토리가 검색되게 하고 싶다면

네이버 웹마스터도구를 사용합니다.

링크는 아래와 같습니다.


https://webmastertool.naver.com/board/main.naver



현재 가지고 있는 네이버 아이디로 로그인을 누르면 됩니다.

그리고 나서 사이트 추가 버튼을 누르면

사이트 소유 확인 절차 창이 뜹니다.





티스토리에서

관리자설정 - 꾸미기 - 스킨변경 - 스킨편집 - html 을 눌러서

head 쪽에 위 메타태그를 붙여넣습니다.

그리고 위 설정을 저장합니다.




위 메타태그를 넣었다면 정상적으로 확인완료 될 것이다.




사이트 등록 후 이제 사이트의 페이지를 수집해가라고 해야한다.

웹 페이지 수집을 게시물의 웹페이지 주소를 등록한다.

수집은 조금만 기다리면 금방 완료된다.

네이버에서 검색되도록 하는 법은 여기서 끝이다.




반응형

Post

반응형

티스토리 스킨 변경하는 법


https://www.tistory.com/skin

여기서 자신이 원하는 티스토리 스킨을 다운 받습니다.

그리고 다운 받은 압축파일을 풉니다.




그리고 나서 블로그 설정 페이지에 들어가서

꾸미기 - 스킨 변경 - 스킨 등록을 클릭합니다.

그러면 스킨 등록창이 나오는데,

아까 압축풀었던 파일안의 파일들을 모조리 등록해주면 됩니다.

등록 완료 후 스킨 보관함에 들어가시면




이렇게 등록된 스킨이 보입니다.

등록된 스킨를 클릭해서 적용하면 끝입니다.


처음에 네이버블로그와 달리 티스토리 스킨 변경하는 법이 하질 않았는데 이렇게 쉽다니^^;;

진작에 할 걸 그랬어요 ㅎㅎ

티스토리 스킨 변경하는 법 포스팅이 많은 도움이 되었길 바랍니다.






반응형

Post

반응형

아래의 기본 서버 예제는 문제점이 있다.

클라이언트가 많아지면 접속을 제 때 받지 못한다.

또 처리하는 부분(send)도 시간이 많이 걸리면 클라이언트 접속 대기 시간이 생긴다.

둘 다 분리되어있지 않고, 원스레드에서 해결하기 때문이다.

아래는 원스레드 서버의 처리시간이 길어지면 어떤문제점이 있는지 보여주는 예제이다.


상황설정

서버는 원스레드로, 클라이언트 접속 후에 1초걸리는 일을 처리하고 패킷을 전달한다.

클라이언트는 배치 파일을 만들어서 7개가 동시에 Connect를 요청하고 서버의 응답을 기다린다.


bat 파일은 아래와 같이 작성했다.

( ConsoleApplication2.exe 가 클라이언트다.. .;; )

 start /d "C:\Users\MyDirectory\Documents\Visual Studio 2017\ConsoleApplication2\Debug\" ConsoleApplication2.exe

 start /d "C:\Users\MyDirectory\Documents\Visual Studio 2017\ConsoleApplication2\Debug\" ConsoleApplication2.exe

 start /d "C:\Users\MyDirectory\Documents\Visual Studio 2017\ConsoleApplication2\Debug\" ConsoleApplication2.exe

 start /d "C:\Users\MyDirectory\Documents\Visual Studio 2017\ConsoleApplication2\Debug\" ConsoleApplication2.exe

 start /d "C:\Users\MyDirectory\Documents\Visual Studio 2017\ConsoleApplication2\Debug\" ConsoleApplication2.exe

 start /d "C:\Users\MyDirectory\Documents\Visual Studio 2017\ConsoleApplication2\Debug\" ConsoleApplication2.exe

 start /d "C:\Users\MyDirectory\Documents\Visual Studio 2017\ConsoleApplication2\Debug\" ConsoleApplication2.exe

<server> 

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
 
#define BUF_SIZE 30
 
void ErrorHandling(const char* message);
 
int main()
{
    WSADATA wsaData;
    SOCKET hServSock, hClntSock;
    SOCKADDR_IN servAddr, clntAddr;
    int strLen = 0;
 
    int szClntAddr;
    char message[] = "Hello World!";
    
    if (0 != WSAStartup(MAKEWORD(22), &wsaData))
    {
        ErrorHandling("WSAStartup() error!");
    }
 
    hServSock = socket(PF_INET, SOCK_STREAM, 0);
    if (INVALID_SOCKET == hServSock)
        ErrorHandling("socket() error");
 
    memset(&servAddr, 0sizeof(servAddr));
    servAddr.sin_family = AF_INET;
    servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servAddr.sin_port = htons(atoi("8888"));
 
    if (SOCKET_ERROR == bind(hServSock, (SOCKADDR*)&servAddr, sizeof(servAddr)))
    {
        ErrorHandling("bind error \n");
    }
 
    if(SOCKET_ERROR == listen(hServSock, 5))
    {
        ErrorHandling("listen error \n");
    }
 
    szClntAddr = sizeof(clntAddr);
    int i = 0;
    while(true)
    {
        hClntSock = accept(hServSock, (SOCKADDR*)&clntAddr, &szClntAddr);
        if (-1 == hClntSock)
        {
            ErrorHandling("accept() error \n");
        }
        else
        {
            printf("Connected clinet : %d \n", i + 1);
        }
        ++i;
        Sleep(1000);
 
        send(hClntSock, message, BUF_SIZE, 0);
 
        closesocket(hClntSock);
    }
    
    closesocket(hServSock);
    WSACleanup();
 
    return 0;
}
 
void ErrorHandling(const char* message)
{
    fputs(message, stderr);
    fputc('\n', stderr);
    exit(1);
}
cs


<Client>

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <ws2tcpip.h>
#include <windows.h>
 
#define BUF_SIZE 30
void ErrorHandling(const char* message);
 
int main()
{
    WSADATA wsaData;
    SOCKET hSocket;
    SOCKADDR_IN servAddr;
    char message[30];
    int strLen;
 
    if (0 != WSAStartup(MAKEWORD(22), &wsaData))
    {
        ErrorHandling("WSAStartup() error!");
    }
 
    hSocket = socket(PF_INET, SOCK_STREAM, 0);
    if (INVALID_SOCKET == hSocket)
    {
        ErrorHandling("WSAStartup() error!");
    }
    
    memset(&servAddr, 0sizeof(servAddr));
    servAddr.sin_family = AF_INET;
    //servAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
    inet_pton(AF_INET, "127.0.0.1"&servAddr.sin_addr);
    servAddr.sin_port = htons(atoi("8888"));
 
    if(SOCKET_ERROR == connect(hSocket, (SOCKADDR*)&servAddr, sizeof(servAddr)))
    {
        printf("error:%d \n", WSAGetLastError());
        ErrorHandling("connect() error");
    }
    else
    {
        puts("Connected......");
    }
    
    int beginTime = GetTickCount();        
    strLen = recv(hSocket, message, BUF_SIZE - 10);
    int endTime = GetTickCount();
    int passTime = endTime - beginTime;
    message[strLen] = 0;
    printf("Message from server ms:%d second:%f message:%s \n", passTime, (passTime * 0.001), message);
 
    closesocket(hSocket);
    WSACleanup();        
 
    system("pause");
    return 0;
}
 
void ErrorHandling(const char* message)
{
    fputs(message, stderr);
    fputc('\n', stderr);
    exit(1);
}
cs


<결과>

서버는 1초짜리 일을 했지만 접속순서대로 차례대로 일을 처리했기 때문에,

후순위로 Connect한 클라이언트는 5~6초나 지나서 결과를 받았다.

멀티스레드 서버를 사용해야하는 이유다.

 


반응형
▲ top