도움받은 사이트 : https://github.com/scrooloose/nerdtree/issues/85

 

NerdTree 사용할 때 오브젝트 파일과 같이 볼일 없는 파일은

.vimrc 파일에 아래와 같이 설정한다.

 

let NERDTreeIgnore=['.o$','.d$','.lo$']

 

그런데 위와 같이 하면 etc/init.d 와 같은 디렉토리까지 안보인다.

이에 아래와 같이 [[file]] 을 붙여주면 file 만 적용되게 된다.

let NERDTreeIgnore=['.o$','.d$[[file]]','.lo$']

 

만약 디렉토리만 ignore 에 추가하려면 [[dir]] 을 붙여준다.

초딩 1학년인 딸아이가 학교에선 뺄셈 들어가는데 아직 덧셈도 잘하지 못해

안되겠다 싶어 여러 문제를 만들어 봄.

 

 - A+B 가 10보다 작은 경우만 수집함. -> 총 55가지인가 나옴.

 - 결과를 랜덤으로 섞음.

 - 몇장 만들 것인지 설정할 수 있음.

 

 - 추가로 빼기 경우도 만들어봄.

 - 결과가 음수인 경우는 배제. 큰 수의 최대값은 9임.

 

Ubuntu 14.04 에서 컴파일 함.

 

결과물 txt 파일을 MS-Word 로 복사해 출력하여 교재로 활용함.

 

 

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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
#include <cstdio>
#include <cstdlib>
 
#include <algorithm>
#include <vector>
 
#define SEED_FILE "seedValue.dat"
 
#define PAGE_NUMBER     20    // 생성할 페이지 수
 
#define ADD            // 덧셈 예제를 생성함.
//#define SUB         // 뺄셈 예제를 생성함.
 
// ADD, SUB 둘 다 define 되어있거나, 
// 아무것도 define 되어있지 않은지 체크함.
#if defined(ADD) && defined(SUB)
#error "defined both ADD and SUB."
#endif
 
#if !defined(ADD) && !defined(SUB)
#error "NOT Defined anything."
#endif
 
// srand() 함수에 사용될 seed 값을 증가함.
// 이전값을 기억하여 랜덤 결과가 겹치지 않도록 함.
unsigned int getSeed()
{
        FILE* fp = fopen(SEED_FILE, "rt") ;
        if(!fp)
        {
                FILE* fp = fopen(SEED_FILE, "wt") ;
                fprintf(fp, "1") ;
                fclose(fp) ;
                return 1 ;
        }
 
        unsigned int seed ;
        char szText[128] ;
 
        fgets(szText, sizeof(szText), fp) ;
        seed = atoi(szText) ;
 
        fclose(fp) ;
 
        return seed + 1 ;
}
 
// 예제에 사용될 샘플을 수집하여 vector에 저장함.
int makeList(std::vector<int>* pVecInt)
{
        int result ;
        for(int ii = 0; ii <= 9; ii++)
        {
                for(int jj = 0; jj <= 9; jj++)
                {
#ifdef ADD
                        result = ii + jj ;
 
                        if(result >= 10)
                                continue ;
#elif defined SUB
                        result = ii - jj ;
 
                        if(result < 0)
                                continue ;
#endif
 
                        result  = (ii * 10) + jj ;
                        pVecInt->push_back(result) ;
                }
        }
 
        return 1 ;
}
 
// 수집한 샘플을 파일로 저장함.
int makeFile(std::vector<int>* pVecInt, int seed, FILE* fp)
{
 
        int a, b ;
        int cnt = 0 ;
        const int ROW = 4 ;
        std::vector<int>::iterator      vecIntIter ;
 
 
        fprintf(fp, "Seed Index : %d\r\n", seed - 1 ) ;
 
        vecIntIter = pVecInt->begin() ;
        for(; vecIntIter != pVecInt->end(); vecIntIter++)
        {
                a = *vecIntIter / 10 ;
                b = *vecIntIter % 10 ;
 
 
                if(cnt % ROW != 0)
                        fprintf(fp, "      ") ;
 
#ifdef ADD
                fprintf(fp, "%d + %0d = ", a, b) ;
#elif defined SUB
                fprintf(fp, "%d - %0d = ", a, b) ;
#endif
 
                if(cnt % ROW == ROW - 1)
                        fprintf(fp, "\r\n") ;
 
                cnt++ ;
        }
 
        return 1 ;
}
 
int main()
{
        std::vector<int>                        vecInt ;
        static char szName[128] ;
 
        unsigned int seed = getSeed() ;
        srand(seed) ;
 
#ifdef ADD
        printf("ADD mode : %d\n", seed) ;
        sprintf(szName, "addTest_%d-%d.txt", seed, seed - 1 + PAGE_NUMBER) ;
#elif defined SUB
        printf("SUB mode : %d\n", seed) ;
        sprintf(szName, "subTest_%d-%d.txt", seed, seed - 1 + PAGE_NUMBER) ;
#endif
 
        FILE* fp = fopen(szName, "wt") ;
 
        for(int ii = 1; ii < PAGE_NUMBER; ii++)
        {
                seed++ ;
 
                if(seed == 0x8fffffff)
                        seed = 1  ;
 
                FILE* fpSeed = fopen(SEED_FILE, "wt") ;
                fprintf(fpSeed, "%d", seed) ;
                fclose(fpSeed) ;
 
                vecInt.clear() ;
 
                makeList(&vecInt) ;
 
                // 수집한 샘플을 섞음.
                random_shuffle(vecInt.begin(), vecInt.end()) ;
 
                makeFile(&vecInt, seed, fp) ;
 
                fprintf(fp, "\r\n") ;
                fprintf(fp, "\r\n") ;
 
        }
 
        fclose(fp) ;
 
        return 1 ;
}
 

tcpTest_C_170616.zip

tcpTest_CPP_170616.zip

 

**** 수정 이력

* 2017-06-16 : 종료 시, pipe() 함수에서 얻어진 File Descriptor로 처리하도록 함.

********************

 

 

첨부파일 압축을 풀면 server, client 두개의 디렉토리가 생성된다.

각각 디렉토리에서 컴파일 후 실행하여 TCP Server, Client 간 연결을 확인한다.

 

정보문화사의 Beginning Linux Programming 3판에서

15장 소켓, 다중 클라이언트 부분을 크게 참고하였고 적당히 수정하였다.

 

's' + [enter] 를 누르면 상대방에 데이터를 보내고,

'q' + [enter] 를 누르면 프로그램을 종료한다.

(이 부분은 main.cpp 참조)

 

- 종료 시, recv() 함수에서의 행업 이슈가 없다.

- 각 단의 시작 순서에 상관 없이 잘 동작한다. (client 를 먼저 실행해도 상관없다.)

- 연결 후, 서버단을 죽이고 다시 시작해도 재연결이 잘 이루어진다.

- 연결 후, 클라이언트단을 죽이고 다시 시작해도 재연결이 잘 이루어진다.

 

 

개인 보관용 목적의 글이므로,

 

 

이글은 예전 제 싸이월드 블로그에 작성한 글을 티스토리로 옮긴 것입니다.
원문 : http://cy.cyworld.com/home/21147242/post/54A21ECBD6D5739A07C68401
원문 작성일 : 2015.3.12

============================================================

제 PC엔 windows8 이 깔려있습니다.
여기에 VirtualBox를 설치하였고,
VirtualBox 에 리눅스(Fedora)를 설치하였습니다.
한줄요약 : 윈도우에서 VirtualBox를 이용해 리눅스를 돌리고 있음.
위와같이 리눅스를 설치하고 윈도우에서 putty 를 이용해 리눅스에 ssh로 접속하여 작업합니다.
쉬운 브리지 어댑터 먼저 썰을 풉니다~

 


1. 브리지 어댑터 (Bridge Adapter)


Virtualbox 에서 Fedora를 실행하기 전에 아래와 같이 네트워크에서 브리지 어댑터를 선택합니다.
(아래 이미지는 리눅스를 실행한 후에 캡쳐를 한 것인데 실행 전에 선택해야합니다.)

 

 

이 경우, PC가 공유기로부터 IP를 받는 경우,
리눅스 또한 공유기로부터 IP를 받습니다.
윈도우의 IP가 192.168.10.xx 라면, 리눅스의 IP 또한 192.168.10.xx 가 됩니다.
브리지 어댑터로 설정하면 아래와 같은 구조라고 생각하면 됩니다.

 


위에 언급했듯이 전 윈도우에서 putty 를 이용해 리눅스에 접속하는 걸 선호합니다.
브리지 네트워크로 설정할 경우, 공유기가 없다면? 리눅스가 IP를 할당받지 못해
윈도우에서 리눅스로 접속할 방법이 없더군요.
공유기를 함께 챙기면 되겠지만 그러지 못한 상황이라면...
NAT 설정을 통해 이를 극복할 수 있습니다.


 

2. NAT


NAT의 개념은 저도 정확히 이거다 말하기가 애매한데요. 그냥, 경험을 통해 아~ 이렇구나 했습니다.
아니면 댓글로 알려주세요~
NAT 설정은 저 위에 Virtualbox 네트워크 설정에서 브리지 어댑터 대신 NAT를 선택하면 됩니다.
Virtualbox 를 설치하면 dos 에서 VirtualBox Host-Only Network 를 확인할 수 있습니다.
C:\>ipconfig

 

 

결론부터 얘기하면,
윈도우에서 리눅스로 접속하고 싶을 때,
위 주소 192.168.56.1 로 접속하여 리눅스로 접속할 수 있습니다.


(이 개념 찾는게 제일 힘들었네요. 전 계속 리눅스의 10.0.2.15로 접속하려고 시도했거든요.
그런데 막상 검색해도 쉽게 안나오던 정보였습니다.)

이에 몇가지 설정이 필요합니다.
VirtualBox 에서 NAT 로 설정한 후, 리눅스를 설치하고 ifconfig 하면
아래와 같이 10.0.x.15 주소를 확인할 수 있습니다.

 

 

이 주소는 NAT 설정 후 나타나는 주소입니다.
저 위에 윈도우에서 리눅스로 접속하기 위해 192.168.56.1 IP 를 사용한다고 했는데요.
이 192.168.56.1 이 리눅스의 10.0.2.15 IP와 연결되게 됩니다.
그러므로 윈도우에서 192.168.56.1 로 접속을 시도하면 리눅스로 연결 되게 됩니다.

이제 NAT 설정 시, 그림을 다시 그려보면 아래와 같이 됩니다.
(이 개념은 지극히 개인적인... 고로 틀렸을지도 모릅니다. ㅜ.ㅠ )

 

브리지 어댑터의 경우, linux 가 바로 공유기에 연결된 개념이었는데
NAT의 경우, 위와 같은 구조이기에 공유기랑 상관없는 구조입니다.
공유기가 없는 환경에서 리눅스에 접속할 필요가 있을 경우, NAT를 사용하면 되겠지요~
이제 마지막 과정입니다.
192.168.56.1 과 10.0.2.15 사이에 포트포워딩을 해 주어야 합니다.
아래와 같이 포트포워딩을 선택합니다.


 

 

그러면 아래와 같은 그림이 나옵니다.
아래 제가 설정한 경우입니다.
이미지 오른쪽의 + 버튼을 클릭하여 규칙을 추가하시면 됩니다.

 

 

전 putty 를 이용해 리눅스에 접속하여 작업하기에 22번 포트를 포워딩했습니다.
그리고 리눅스에서 인터넷을 사용하기 위해 80번 포트를 포워딩했습니다.
기타 환경에 맞게 추가하여 주시면 됩니다.
위와 같이 설정한 후에 putty에서 192.168.56.1 로 접속시도하면 리눅스로 연결됩니다.

 

이글은 예전 제 싸이월드 블로그에 작성한 글을 티스토리로 옮긴 것입니다.
원문 : http://cy.cyworld.com/home/21147242/post/55078597BC95739A07C68401
원문 작성일 : 2015.3.12

============================================================

 

임베디드 보드에서 유니코드를 처리할 일이 있어
일단 리눅스에서 테스트를 하였습니다.
별 탈 없이 문자열(ex) 한글) 잘 뿌리는 거 확인하고
테스트 보드로 포팅하여 테스트했더니 엇~ 문자열이 안나오는겁니다.
테스트보드에선 유니코드를 지원 안하나봅니다.
그래서 아래와 같이 테스트를 해 보았습니다.
1. 윈도우에서 메모장을 열고 한글을 입력합니다.
2. "다른이름으로 저장" 하게 되면 하단에 아래 그림과 같이 4가지 타입으로 저장할 수 있습니다.
3. 4개의 파일로 따로 저장합니다.
ex) test_ANSI.txt, test_Unicode.txt, test_Unicode_BE.txt, test_UTF-8.txt

 

 

그리고 생성한 4개의 txt 파일을 보드에 복사하여 열어봤습니다.
했더니 UTF-8 만 정상으로 나오고 나머지는 다 깨지네요.
아하~ 테스트보드는 UTF-8만 지원하나봅니다.
그럼 Unicode를 UTF-8 로 변환하여 출력하면 되겠군요.
Unicode ->UTF-8 로의 변환을 그림으로 표시하면 아래와 같습니다.
(도움받은 사이트 : http://en.wikipedia.org/wiki/UTF-8 )

 

위 사이트에 들어가보면 unicode 값이 0xffff 값보다 더 큰 경우에도 설명이 되어있는데
일단 그 범위까지 쓸일이 없기에 위 범위만 처리하였습니다.
이에 아래와 같이 변환하는 함수를 만들어 보았습니다.

 

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
void UnicodetoUTF8( const wchar_t * pUnicode, char * szText)
{
        int uniLen = wcslen(pUnicode) ;
 
        for ( int ii = 0; ii<uniLen; ii++)
        {
                if ( 0<= pUnicode[ii]&&pUnicode[ii]<= 0x7f)
                {
                        szText[0] = pUnicode[ii]&0xff ;
                        szText++ ;
                }
                else if ( 0x80<= pUnicode[ii]&&pUnicode[ii]<= 0x7ff)
                {
                        szText[0] = ((pUnicode[ii]>>6)&0x1f) | 0xc0 ;
                        szText[1] = (pUnicode[ii]&0x3f) | 0x80 ;
                        szText += 2 ;
                }
                else if ( 0x800<= pUnicode[ii]&&pUnicode[ii]<= 0xffff)
                {
                        szText[0] = ((pUnicode[ii]>>12)&0x0f) | 0xe0 ;
                        szText[1] = ((pUnicode[ii]>>6)&0x3f) | 0x80 ;
                        szText[2] = (pUnicode[ii]&0x3f) | 0x80 ;
                        szText += 3 ;
                }
                else
                {
                        printf( "ERROR~!! pUnicode>0xffff, 0x%x\n" , pUnicode[ii]) ;
                }
        }
        szText[0] = '\0' ;
 
        return ;
}
 

그럼, 즐프하세요~ ^^

 

 

 

 

 

 

 

 

 

 

 

 

 

 

이글은 예전 제 싸이월드 블로그에 작성한 글을 티스토리로 옮긴 것입니다.
원문 : http://cy.cyworld.com/home/21147242/post/5500EDA6EA95739A07C68401
원문 작성일 : 2015.3.12

============================================================

 

list 컨테이너에서 조건에 맞는 값을 찾고자 할 때 find_if() 함수를 쓴다.
조건값이 특정값이라면 함수객체(펑크터)를 사용해 쉽게 구현이 되지만
조건값을 변수 형태로 취하려면 어댑터 개념을 적용해야 한다.

C++ 기초 플러스, C++ Standard Library 책을 눈알 빠지게 봐도 뭔소린지 모르겠다.
결국 SOEN(http://www.soen.kr) 에서 도움을 받았다.
(SOEN ->C/C++ 강좌 ->4부.C++고급 ->38장 함수객체 ->바인더)
한국인이 쓴 책이 문장도 좋고 이해가 잘 될 때가 분명히 있다.

아래 코드는 보관용 수준으로 작성한 예제이다.
- list 에 4개의 값을 저장하였다.
- 이 중 나는 number 값이 1003인 이터레이터를 가져오고 싶다.
- 1003이 아닌 다른 값을 가져오고 싶다면, filter 변수값을 변경하면 된다.

아래 예제는 number가 1003인 구조체값을 가져와 그 구조체의 major 값을 찍었다.
원하는대로 값을 가져오고 있다.

 

 

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
#include <cstdio>
#include <list>
#include <algorithm>
#include <functional>
 
using namespace std ;
 
 
struct Program
{
        int major ;
        int number ;
        int pid ;
} ;
 
class FindProgram : public binary_function<Program, int , bool >
{
public :
        bool operator() ( const Program& p, int b) const
        {
                return (p.number == b) ;
        }
} ;
 
int main()
{
        list<Program> listProgram ;
        list<Program> ::iterator listProgramIter ;
 
        Program program ;
 
        program.major = 7 ;
        program.number = 1001 ;
        program.pid = 0x20 ;
        listProgram.push_back(program) ;
 
        program.major = 7 ;
        program.number = 1002 ;
        program.pid = 0x21 ;
        listProgram.push_back(program) ;
 
        program.major = 9 ;
        program.number = 1003 ;
        program.pid = 0x22 ;
        listProgram.push_back(program) ;
 
        program.major = 11 ;
        program.number = 1004 ;
        program.pid = 0x23 ;
        listProgram.push_back(program) ;
 
        int filter = 1003 ;
 
        listProgramIter = find_if(listProgram.begin(), listProgram.end(), bind2nd(FindProgram(), filter)) ;
 
        if(listProgramIter != listProgram.end())
        {
                printf("val : %d\n", listProgramIter->major) ;
        }
 
        return 1;
}
 


 

이글은 예전 제 싸이월드 블로그에 작성한 글을 티스토리로 옮긴 것입니다.
원문 : http://cy.cyworld.com/home/21147242/post/5440C0C849D5739A07C68401
원문 작성일 : 2014.10.17

============================================================

 

github : https://github.com/hahaite/Big_Integer

 

File : bigInt_170713.zip

 

오일러 프로젝트 (http://euler.synap.co.kr/) 를 풀다가
엄청나게 큰 수를 계산해야 하는 상황이 발생했다.
이에 제목과 같은 걸 함 짜보자싶어 구현하게 되었다. (첨부파일 참조)
덕분에 자릿수 제약이 없는 정수 계산이 가능하였다. ex) 1000!
큰 수의 계산에 촛점을 두었기에 많은 횟수의 연산은 속도가 느릴 수 있다.

간단한 사용법은 아래와 같다.

CBigInt A, B, C ;
A = 12345 ; // int 형 입력 가능.
B = "111234574734892783" // 매우 큰 수는 string 형으로 입력함.
C = A + B ;
printf("sum : %s\n", C.c_str()) ;

 

기타 사칙연산 증가,감소연산, 크기 비교 등이 가능하다.

 

추가로 Euler Project를 풀면서 몇몇 필요한 아래 기능이 추가되었다.
 - n! (Factorial) 계산.
 - string 뒤집기
 - palindrome 인지 체크
 - string 정렬
 - 조합(combinations) 계산.
 - 분수 계산.
 - 제곱 (pow) 계산.

 

====================================================
기타 예제는 첨부파일의 main.cpp 에 있다.
테스트하고 싶은 부분을 #if 0 ->#if 1 로 바꾸고 컴파일 한 후 결과를 확인할 수 있다.
표준 함수를 사용하였으므로 개발환경의 영향을 받지 않으리라 본다.
테스트는 Fedora13, GCC 4.4.5 기반에서 테스트를 진행하였다.
================================

뭐 누가 사용할까 싶긴 한데요.
혹시나 사용하다 버그 발견이나 수정사항 있으면 댓글로 알려주세요.
참, 이 코드는 FREE~!! 입니다.

이글은 예전 제 싸이월드 블로그에 작성한 글을 티스토리로 옮긴 것입니다.
원문 : http://cy.cyworld.com/home/21147242/post/539669D72CD5739A07C68401
원문 작성일 : 2014.6.10

============================================================

 

이전에 파일값을 이용한 bisection search 란 글을 작성하였다.
http://hahaite.tistory.com/277

 

이 코드를 클래스화해서 구현해 보았다. (첨부파일 참조)
테스트를 위한 파일이 들어있으며

main.cpp 를 통해 클래스 멤버함수의 사용 예제를 맛볼 수 있다.
자세한 설명은 생략한다.

fileBisection_class.zip

 

이글은 예전 제 싸이월드 블로그에 작성한 글을 티스토리로 옮긴 것입니다.
원문 : http://cy.cyworld.com/home/21147242/post/536C959E2BD5739A07C68401
원문 작성일 : 2014.5.9

============================================================


예전에 만들어 본 기억이 있는데 다시 만드니 삽질...
예방차원에서 올려놓는다.

1. test.dat 파일엔 2 ~ 97 사이의 임의의 숫자 34개가 개행문자 없이 저장되어 있다.
->2 bytes 단위로 읽어들이면 저장된 값을 가져올 수 있음.

 

2. 주어진 값(int target ) 이 test.dat 에 존재하는지 찾는 것을 목적으로 한다.

 

* int getCount() : test.dat 파일에 몇개의 값이 있는지 계산하여 반환한다.

* 첨부파일 : main.cpp, Makefile, test.dat

 

fileBisection.zip

 

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
77
#include <cstdio>
#include <cstdlib>
 
#define FILE_NAME "./test.dat"
 
static FILE* fp ;
 
int getCount(int width)
{
        fp = fopen(FILE_NAME, "rt") ;
        fseek(fp, 0, SEEK_END) ;
        return (ftell(fp) / width ) ;
}
 
int main()
{
        int width = 2 ;
 
        int count ;
        static char szText[128] ;
 
        count = getCount(width) ;
 
        int fileVal, target ;
        int leftPos, midPos, rightPos ;
 
        fp = fopen(FILE_NAME, "rt") ;
 
        for(int ii = 2; ii <= 97; ii++)
        {
                leftPos = 0 ;
                rightPos = count - 1 ;
 
                target = ii ;
 
                // bisection.
                while(1)
                {
                        midPos = (leftPos + rightPos) / 2 ;
 
                        fseek(fp, midPos * width, SEEK_SET) ;
                        fread(szText, width, 1, fp) ;
                        szText[width] = '\0' ;
 
                        fileVal = atoi(szText) ;
 
                        if(fileVal == target)   // find
                                break ;
 
                        if(leftPos == rightPos) // cannot found
                                break ;
 
                        if(rightPos - leftPos == 1)
                        {
                                if(midPos == leftPos)
                                        leftPos++ ;
                                else
                                        rightPos-- ;
                                continue ;
                        }
 
                        leftPos = (target > fileVal) ? midPos : leftPos ;
                        rightPos = (target <= fileVal) ? midPos : rightPos ;
                }
 
                if(fileVal == target)
                        printf("find ; %d\n", target) ;
                else
                        printf("Cannot find ; %d\n", target) ;
 
        }
 
        fclose(fp) ;
 
        return 1 ;
}
 

 

이글은 예전 제 싸이월드 블로그에 작성한 글을 티스토리로 옮긴 것입니다.
원문 : http://cy.cyworld.com/home/21147242/post/536C601315D5739A07C68401
원문 작성일 : 2014.5.9

============================================================

printf("%4d", a) ;
와 같은 꼴이 있는데 어떨 땐 위와 같이, 어떨땐

printf("%5d", a) ;

와 같이 사용할 일이 생겼다.

이게 되나? 찾아보니 검색이 잘 안되어 KLDP 에 물어보았다.

http://kldp.org/node/142774

그랬더니 두개의 답변이 올라왔다.
헐~ 이런게 가능했구나... @_@


1. sprintf() 를 이용한 방법.

char buf[100];
sprintf(buf,"%%%dd",4);
printf(buf,a) ;

 

2. printf() 를 이용한 방법.

width = 4;
printf("%*d", width, a);
width = 5;
printf("%*d", width, a);

이글은 예전 제 싸이월드 블로그에 작성한 글을 티스토리로 옮긴 것입니다.
원문 : http://cy.cyworld.com/home/21147242/post/52DE09ED7395739A07C68401
원문 작성일 : 2014.1.21

============================================================

STL set 컨테이너에 2차원 배열 삽입하기.
set 항목으로 2차원 배열을 넣어보려 했으나 일단 안되는 것 같다. (아래 링크 참조)
http://kuaaan.tistory.com/167 : ( STL의 원소로 배열(Array)을 사용할 수 없는 이유 )
결국 배열을 구조체 변수로 선언함.
배열의 크기를 설정하기 위해 구조체에 static 변수를 두개 선언함.
memcmp() 로 깔끔이 되는 듯 했으나 배열값이 음수일 때
음수값이 더 크다고 판단하므로 memcmp() 를 쓰면 안되었다.
싸이월드 블로그에 코드 깔끔히 올리는 방법 없나... 찾아봐야겠다.

 

 

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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include <cstdio>
#include <set>
 
using namespace std ;
 
#define ARRAY_ROW 2
#define ARRAY_COL 3
 
typedef int (Array)[ARRAY_ROW][ARRAY_COL] ;
 
struct Data
{
        static int row ;
        static int col ;
 
        Array array ;
};
 
int Data::row = ARRAY_ROW ;
int Data::col = ARRAY_COL ;
 
struct DataCompare
{
        bool operator() ( const Data& lhs, const Data& rhs) const
        {
                // Don't use memcmp(). It cannot compare between negative number.
                // int ret = memcmp(&lhs.array,&rhs.array, sizeof(lhs.array)) ;
 
                for ( int ii = 0; ii < lhs.row; ii++ )
                {
                        for ( int jj = 0; jj < lhs.col; jj++ )
                        {
                                if(lhs.array[ii][jj] < rhs.array[ii][jj])
                                        return 1 ;
                                else if (lhs.array[ii][jj] > rhs.array[ii][jj] )
                                        return 0 ;
                        }
                }
                return 0 ;
        }
};
 
int main()
{
        set<Data, DataCompare> setData ;
        set<Data, DataCompare> ::const_iterator setDataIter ;
 
        Data data1 = {{{8,7,0}, {8,1,3}}};
        setData.insert(data1) ;
 
        Data data2 = {{{2,3,4}, {4,5,7}}};
        setData.insert(data2) ;
 
        Data data3 = {{{2,3,4} , {4,5,6}}} ;
        setData.insert(data3) ;
 
        Data data4 = {{{ -1,3,4} , {4, -1,6}}} ;
        setData.insert(data4) ;
 
        Data data5 = {{{2,3,4} , {4,5,6}}} ;
        setData.insert(data5) ;
 
        Data data6 = {{{ -1,3,4} , {4,1,6}}} ;
        setData.insert(data6) ;
 
        setDataIter = setData.begin() ;
 
        for ( ; setDataIter != setData.end() ; setDataIter++ )
        {
                printf( "================\n" ) ;
 
                for ( int ii = 0; ii < 2; ii++ )
                {
                        for ( int jj = 0; jj < 3; jj++ )
                                printf( "%d " , setDataIter->array[ii][jj] ) ;
                        printf( "\n" ) ;
                }
        }
 
        Data data7 = {{{ -1,3,4} , {4, -1,6}}} ;
        setDataIter = setData.find(data7) ;
 
        if (setDataIter != setData.end() )
        {
                printf( "find~!!\n" ) ;
        }
 
 
        Data data8 = {{{0,0,4} , {4, -1,6}}} ;
        setDataIter = setData.find(data8) ;
 
        if (setDataIter == setData.end() )
        {
                printf( "cannot Find~!!\n" ) ;
        }
 
        return 1 ;
 
}
 

이글은 예전 제 싸이월드 블로그에 작성한 글을 티스토리로 옮긴 것입니다.
원문 : http://cy.cyworld.com/home/21147242/post/52DD0F44F455739A07C68401
원문 작성일 : 2014.1.20

============================================================

 

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
77
78
79
80
81
82
83
84
85
#include <cstdio>
#include <set>
 
using namespace std ;
 
struct Data
{
        int a ;
        int b ;
} ;
 
struct DataCompare
{
        bool operator() ( const Data& lhs, const Data& rhs) const
        {
#if 0
                if (lhs.a < rhs.a)
                        return 1 ;
                else if (lhs.a > rhs.a)
                        return ;
 
                if (lhs.b < rhs.b)
                        return 1 ;
 
                return ;
#endif
                return ( (lhs.a < rhs.a) || ( (lhs.a == rhs.a) && (lhs.b < rhs.b) )) ;
        }
};
 
int main()
{
        set<Data, DataCompare> setData ;
        set<Data, DataCompare>::const_iterator setDataIter ;
 
        Data data;
 
        data.a = 3 ;
        data.b = 5 ;
        setData.insert(data) ;
 
        data.a = 2 ;
        data.b = 5 ;
        setData.insert(data) ;
 
        data.a = 2 ;
        data.b = 2 ;
        setData.insert(data) ;
 
        data.a = 6 ;
        data.b = 8 ;
        setData.insert(data) ;
 
        data.a = 6 ;
        data.b = 7 ;
        setData.insert(data) ;
 
        data.a = 2 ;
        data.b = 2 ;
        setData.insert(data) ;
 
        setDataIter = setData.begin() ;
 
        for ( ; setDataIter != setData.end() ; setDataIter++)
                printf("[%d.%d]\n", setDataIter->a, setDataIter->b) ;
 
        data.a = 6 ;
        data.b = 7 ;
        setDataIter = setData.find(data) ;
 
 
        if (setDataIter != setData.end() )
                printf( "Find~!! - [%d.%d]\n", setDataIter->a, setDataIter->b) ;
 
        data.a = 8 ;
        data.b = 9 ;
        setDataIter = setData.find(data) ;
 
        if (setDataIter == setData.end() )
                printf("No Data~!! - [%d.%d]\n", data.a, data.b) ;
 
 
        return 1;
}
 

 

이글은 예전 제 싸이월드 블로그에 작성한 글을 티스토리로 옮긴 것입니다.
원문 : http://cy.cyworld.com/home/21147242/post/52D66A5BB355739A07C68401
원문 작성일 : 2014.1.15

============================================================

최초 작성일 : 2014년 1월 15일.

 

github : https://github.com/hahaite/unblockme_solution


(안풀리는 레벨 댓글에 적어주심 해답 적어드림. ㅋ~~ )
unblockme 몇판 해보다 이걸 내가 왜 풀고 있지? 하는 생각이 들어
풀어주는 코드를 작성함.
코드를 두번 엎은 끝에 그럭저럭 만족스러운 결과를 얻었다.
expert 난이도도 2초 안에 해결.
트리구조 만만히 봤다가 큰코 다침.
linux 환경과 Visual C++ 2010 Express 에서 돌아가는 것 확인함.

1. main.cpp 의 block 6x6 행렬에 벽돌에 맞게 숫자를 넣어주고,
2. 빨간벽돌에 해당하는 번호를 define MASTER_BLOCK 에 설정해 줌.
3. 컴파일 후 실행하면 끝.

(0 값은 빈공간으로 해야 함.)
경험 상 벽돌이 오른쪽이나 아래로 갈수록 큰 수로,
세로 벽돌은 홀수, 가로 벽돌은 짝수로 두는 게 덜 피곤했음.
마음같아선 Visual C++ 로 GUI 까지 만들어보고 싶으나 윈도우 프로그래밍 손놓은지 어언...
게다가, 일해야한다.
행여 프로그램으로 만들어 배포했다가 unblockme 만든 회사에 고소 같은 거 먹을지도 모르겠고~
짜놓은게 아까워 블로그에 올려 봄.
뭐, 누가 볼까 싶긴하지만 맘대로 갖다 쓰시고 댓글이나 써주심 땡큐임.

########## 수정사항.
** 2014년 1월 21일.
block 의 중복비교를 펑크터 형식으로 교체함.

unblockme_20140121.tar

 

이글은 예전 제 싸이월드 블로그에 작성한 글을 티스토리로 옮긴 것입니다.
원문 : http://cy.cyworld.com/home/21147242/post/52BBD4582CD5739A07C68401
원문 작성일 : 2013.12.26

============================================================

(아래 Makefile의 CFLAGS 부분은 인터넷 검색을 통해서 구한 정보이나  출처를 남기지 못햇다. )

양산 프로그램을 만들 때이다.

"이선임님, 이거 안되는데요?"
"프로그램 교체하셨나요?"
"네, 교체했어요. 버전 불러드릴까요?"

버전을 알아도 소용이 없었다. 깜빡잊고 버전을 변경하지 않은 탓이다.
버전이 자동으로 생성되게 하면 위와 같은 실수를 피할 수 있다.


내가 선택한 것은 컴파일한 시간이 버전이 되도록 하였다.

Makefile 에 아래와 같이 옵션을 추가하였다.

 

*** Makefile
CFLAGS += -DCOMPILE_DATE=\"`date +'%y.%m.%d'`\"

 

main : main.cpp
        g++ -o $@ $^ $(CFLAGS)


기호에 주의해야 한다. 큰따옴표에 그레이브(Grave, 키보드 숫자 1 왼쪽에 있는 따옴표 비슷한...)에
 어퍼스트로피(Apostrophe, 엔터키 왼쪽에 있는 따옴표...) 까지 쓰였다.

이렇게 Makefile 을 설정하고 아래와 같이 출력하면 컴파일 했을 때의 시간을 출력할 수 있다.
(한마디로 실행파일이 만들어진 시간임.)


*** main.cpp

 

1
2
3
4
5
6
7
8
9
#include <cstdio>
 
int main( )
{
        printf( "Date : %s\n" , COMPILE_DATE) ;
        printf( "__TIME__: %s\n" , __TIME__) ;
 
        return 1 ;
}

 

 

위 값을 적절히 버전처럼 변형하여 화면에 뿌려주면 언제 만들어진 실행파일인지 확인할 수 있다.

나는 아래와 같이 사용하였다.
생성한 시간을 10분단위로 쪼개어 카운트하여 나타내었다. (말 어렵다. ;;;; )
아무튼, 아래와 같이 버전을 생성하여 년월일 + 몇시 몇분(10분단위)에
생성되었는지 작성하였다.

프로그램을 릴리즈했는데 잘 안된다라는 말이 나오는 경우,
제일 먼저 이 버전부터 체크하여 최신 프로그램을 사용하고 있는지 확인하였다.

 

 

*** main.cpp


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
#include <cstdlib>
#include <cstring>
 
int main( )
{
        char szVer[256] ;
        char * pTime ;
        int hour, min ;
 
        printf( "Date : %s\n" , COMPILE_DATE) ;
        printf( "__TIME__: %s\n" , __TIME__) ;
 
        strcpy(szVer, __TIME__) ;
 
        pTime = strtok(szVer, ":" ) ;
        hour = atoi(pTime) ;
 
        pTime = strtok(NULL, ":" ) ;
        min = atoi(pTime) / 10 ;
 
        sprintf(szVer, "%s-%02X" , COMPILE_DATE, (hour * 10) + min) ;
 
 
        printf( "szVer : %s\n" , szVer) ;
        return 1 ;
}
 

 

'삽질미학 > C,C++' 카테고리의 다른 글

STL set 컨테이너에 구조체 삽입하기  (0) 2017.01.09
Unblock me 게임 풀어주는 코드  (0) 2017.01.09
TDES-ECB 암호화 코드  (0) 2016.10.24
리눅스 getch() 모듈화하기  (0) 2016.10.20
C++ 코드를 C에서 사용하기  (0) 2016.10.14

이글은 예전 제 싸이월드 블로그에 작성한 글을 티스토리로 옮긴 것입니다.
원문 : http://cy.cyworld.com/home/21147242/post/503F6ECDDD55739A07C68401
원문 작성일 : 2012.08.30

----------------------------------------------------------------------------------------

 

첨부파일 : des.zip

 

 

일하다가 스펙 요구사항으로 Triple DES - ECB 방식으로 암호화하기를 요구함.
그러면서 예시를 들었다.

key : 10918C6845AB98EF894C6B57BC6776DC [MSB... LSB]

DATA : 00000000000000000000000012345678 [MSB...LSB]

암호화 결과 :

TDES_ECB(Data) : E904F93AD9C2C3848474DB2740AD6162 [MSB...LSB]

열심히 구글링~~

 

ms-word 파일인데
3DES Source Code.doc

 

인데... 링크를 못가져오겠네... ㅡㅡa

깔끔하게 des.h, des.c 로 되어있음.
아래와 같이 key 값과 Data 값을 넣으니 깔끔하게 결과를 얻을 수 있었다. 오홍~

 

des.h, des.c 코드는 첨부파일을 보세요~

첨부파일의 3DES Source Code.doc 파일을 보면 그냥 des 코드도 확인할 수 있습니다.

 

 

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
#include <stdio.h>
#include "des.h"
 
int main()
{
        des3_context ctx3 ;
 
        unsigned char key1[8] = {0x10, 0x91, 0x8C, 0x68, 0x45, 0xAB, 0x98, 0xEF};
        unsigned char key2[8] = {0x89, 0x4C, 0x6B, 0x57, 0xBC, 0x67, 0x76, 0xDC};
 
        unsigned char plaintext[2][8] = {{0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00},
                                        {0x00, 0x00,0x00,0x00,0x12,0x34,0x56,0x78}};
 
        unsigned char enc[8] ;
 
        int ii, jj ;
        des3_set_2keys(&ctx3, key1, key2) ;
 
        for (ii = 0; ii<2; ii++)
        {
                des3_encrypt(&ctx3, plaintext[ii], enc) ;
 
                for (jj = 0; jj<8; jj++)
                        printf("%02x ", enc[jj]&0xff) ;
        }
        printf("\n") ;
 
        return 1 ;
}

 

+ Recent posts