728x90
반응형

TeraTerm을 설치 후 SSH or UART 시리얼 연결을 통해 

명령어등등을 사용 할 때가 있는데, backspace 대신에 delete를 사용 해서 사용 하는 경우가 있다.

이 때 우리가 기본적으로 아는 Delete key동작을 안하고 backspace 동작을 하는 경우가 있다.

초기 설정 값 문제로.

TERATERM.ini 파일을 수정 하면 해결 할 수가 있다.

 

방법 소개.

1. Open TERATERM.ini

2. DeleteKey = on - > off 변경.

3. TERATERM 재시작.

 

끝.

 

728x90

'프로그래밍 > ETC' 카테고리의 다른 글

온라인 코딩 테스트 사이트  (0) 2021.04.11
[FFMPEG] ffmpeg option cmd정리  (0) 2020.12.17
Wowza cloud Streaming 설정 및 재생 방법  (0) 2020.12.17
728x90
반응형

github에서 branch를 가져 오려고 할 때

"Are you sure you want to continue connecting (yes/no)? 가 발생 할 때

자동으로 동작 되도록 하기 위하여 ssh-keygen을 하여 key값을 생성 한다.

 

이럴때 정상적으로 동작이 안될 때 해결 방법.

 

git config --global user.email "example@example.com"

git config --global user.name "example"

을 입력 후 재 시도 하면 정상적으로 동작 되는 것을 확인.

728x90
728x90
반응형

간혹 간단한 socket 테스트 할 경우 문자열을 snprint가 아닌 직접 입력하여 보낼 때 공백이 들어가면 해당 공백은 포함 안되고 전체 문자열이 붙혀서 넘어 가는 경우가 발생 할 수 있다.

 

C++를 공부 하면서  C++기준으로. 우리가 입력을 할 때는 cin으로 처리를 하는 cin은 space가 들어가면 해당 문자열을 종료 시킨다고 판단하여 공백이 제거 되버린다.

 

그럴 때 cin.getline(a,10);으로 해주면 공백이 포함 된다.

 

간단한 예제

 

1. cin을 할 경우 

char sbuf[1024];

cin >> sbuf; 했을 경우. 위에 처럼 보내고. 받는 곳에서는 다음과 같은 결과가 나온다.

위의 처럼 결과가 나오는데 입력시 my test라고 공백이 포함되게 보냈지만, 이미 공백이 들어가서 해당 첫 라인은 끝난다고 가정하여 mytest라고 보내게 된 경우다.

 

2. cin.getline() 을 할경우

 

char sbuf[1024];

cin.getline(sbuf, 1024);

 

위 코드로 처리 할 경우 위의 결과 값으로 나온다.

공백도 문자열로 처리가 된다.

728x90
728x90
반응형

정말 오랜만에 DB를 만져본다. 그동안 업무가 DB는 거의 사용을 안하는 업무여서 정말 기본쿼리문만 사용하게 되었다.

이번에 서버쪽 사이드 프로젝트를 해볼려고 하는데 DB는 필수이다 보니. 블로그에 정리를 하면서 천천히 기록을 하기로 한다.

 

나는 간단한 채팅 프로그램을 C++로 개발을 해보려한다. 서버쪽을 해보고 싶어서 간단하게 C++도 공부 할겸 시도 한다.

 

먼저. 

1. 데이터베이스 생성 하기.

데이터베이스를 먼저 조회 한다. 

이제 새로운 데이터 베이스를 생성 한다.

새롭게 만들 데이터베이스 명은 chat_db;

 

쿼리문 : create database chat_db;

정상적으로 생성되는 것 확인.

 

2. 테이블 생성하기.

생성한 데이터베이스에 table를 생성 한다.

먼저 기록에 남길 테이블은 간단하게 회원정보 테이블을 생성 해볼 예정이다.

정상적으로 테이블 생성을 확인

 

 

728x90
728x90
반응형

사이드 프로젝트를 하기 위해서 DB를 설치 하기로 하였다. 

우분투 14.04이고, 우분투 14.04에서는 mariadb가 지원이 되지 않는다.

 

오랜만에 소스를 다운받아 설치를 해보기로 하였다.

 

1. MariaDB 다운로드 폴더

 - mariadb.org/download/

 

Download MariaDB Server - MariaDB.org

REST API MariaDB Repositories Release Schedule Reporting Bugs […]

mariadb.org

소스를 다운받으려면 Operating System에서 Source를 선택해서 Download버튼을 누르면 된다.

 

2. mariadb 계정 생성.

 

 

mariadb 와 mysql은 서로 호환이 된다.  mariadb의 탄생 배경을 보면 알 수 있다.

 

3. cmake 설치.

cmake가 없는 경우 sudo apt-get install cmake

 

4. 다운로드 받은 source 압축 해제.

다운받는 버전에 따라 다름.

 

 

5. cmake 

압축 해제 후 

해당 폴더로 이동하여 cmake 한다.

 

sudo cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mariadb103 \
-DMYSQL_DATADIR=/usr/local/mariadb103/data \
-DMYSQL_UNIX_ADDR=/usr/local/mariadb103/mysql.sock \
-DSYSCONFDIR=/usr/local/mariadb103 \
-DMYSQL_TCP_PORT=3306 \
-DMYSQL_USER=mysql \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DDOWNLOAD_BOOST=0 -DWITH_BOOST=./boost

 

6. make & make install

 

 

 

 

 

 

 

 

 

 

 

7. mariaDB설정.

sudo vi /usr/local/mariadb103/my.cnf

8. 권한설정.

 

 

 

 

9. mariadb 데이터베이스 초기화.

sudo scripts/mysql_install_db --no-defaults --user=mysql --datadir=/usr/local/mariadb103/data --basedir=/usr/local/mariadb103 -v

 

 

10. 계정초기화.

cd /usr/local/mariadb103

bin/mysql -u root -p 

 

 

위와 같은 에러 발생 시

(해결 사이트 링크 할 것.)

 

 

728x90
728x90
반응형

mysql 덤프 및 복원 하는 방법.

 

오늘 mysql 덤프와 그에 관련된 복원 명령어를 실행 해볼려고 합니다.

 

그냥 일상적으로 쓰는 방법만 게시 하겠습니다..

 

덤프 뜨기!

 

mysqldump -u[계정명] -p[패스워드] [DB명] [테이블명] > [테이블명.sql]

이런형태로 하면됩니다.

 

그러면 예제를 ~

예) mysqldump -utest -ptest d_test test > test.sql

 

그러면 복원을 할경우는?

 

mysql -utest -ptest d_test < test.sql

하면 됩니다~!~!

 간단하게! 적어봤습니다!

728x90
728x90
반응형

대학생때 이후로는 C++를 접할 일이 없었습니다.

그래서 공부를 해볼 겸 간단한 로또 프로그램을 만들어 보았습니다.

목표는. 간단한 class 및 STL를 사용 하는 거고 추 후에 서버 프로그램을 c++로 제작 해볼 예정입니다.

 

 

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
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
#include <iostream>
#include <vector>
#include <random>
 
#define LOTTO_MAX 7
 
using namespace std;
 
class Lottery {
private:
    int lotto_num;
    int lotto_idx;
    int* check_list;
    vector<int> user_vec;
    vector<int> machine_vec;
 
public:
    Lottery() {
        lotto_num = 0;
        lotto_idx = 0;
 
        check_list = new int[LOTTO_MAX];
        for (int i = 0; i < LOTTO_MAX; i++) {
            check_list[i] = 0;
        }
 
        user_vec.reserve(LOTTO_MAX - 1);
        machine_vec.reserve(LOTTO_MAX);
    }
 
    bool duplicate_check(int num, vector<int>& user_vec);
    void printLottoNumber(vector<int>& user_vec);
    void Lotto_Input(vector<int>& user_vec);
    void UserInterFace_Init();
 
    //로또 번호 생성, 본번호 + 보너스 번호
    void CreateLotteryNumber(/*vector<int>& machine*/);
    int BonusLotteryNumber(vector<int>& machine);
 
    //입력한 번호와 생성된 번호를 비교하여 순위를 매긴다.
    int ret_ranking(vector<int>& machine, vector<int>& user_vec);
 
    ~Lottery() {
        if (check_list)
            delete[] check_list;
    }
};
 
int Lottery::ret_ranking(vector<int>& machine, vector<int>& user_vec) {
    int rank = 0;
    int match = 0;
    int bonus = 0;
 
    for (int i = 0; i < machine.size(); i++) {
        for (int j = 0; j < user_vec.size(); j++) {
            if (machine[i] == user_vec[j]) {
                if (i == (machine.size() - 1)) {
                    bonus = 1;
                }
                match++;            
            }                
        }        
    }
 
    cout << "math = " << match << endl;
    cout << "bonus = " << bonus << endl;
 
    switch (match) {
    case 3: rank = 5break;
    case 4: rank = 4break;
    case 5: rank = 3break;
    case 6
        if (bonus == 0)    rank = 1;         
        else rank = 2
        
        break;
    default: rank = 0break;
    }
 
    return rank;
}
 
int Lottery::BonusLotteryNumber(vector<int>& vec)
{
    int rand_number;
    int chk_flg = 0;
 
    random_device rand;        //시드 값을 얻기 위한 random_device 생성.
    mt19937_64 gen(rand());    //random_device를 통해 난수 생성 엔진을 초기화.    (메르센 트위스터 알고리즘 사용)
 
    uniform_int_distribution<int> dis(145); //1 ~ 45까지 균등하게 나타나는 난수열을 생성하기 위해 균등 분포 정의 
 
    rand_number = dis(gen);
 
    //새롭게 발생된 보너스번호를 생성된 1등 번호와 충첩되는지 체크 한다.
    //1등번호와 충첩되면 다시 보너스 번호를 생성 한다.
    for (int i = 0; i < vec.size(); i++) {
        if (rand_number == vec[i])
            BonusLotteryNumber(vec);    
    }
 
    return rand_number; // 생성된 보너스번호 리턴.
}
 
void Lottery::CreateLotteryNumber(/*vector<int>& vec*/)
{
    //랜덤으로 1 ~ 45의 중복되지 않는 숫자를 생성 한다.
    //보너스 번호는 별도로 생성. 1 ~ 45에서 중복되지 않는 값으로 생성 한다. 
 
    int bonus_number = 0;
    int create_lottery_num = 0;
    random_device rand;        //시드 값을 얻기 위한 random_device 생성.
    mt19937_64 gen(rand());    //random_device를 통해 난수 생성 엔진을 초기화.    (메르센 트위스터 알고리즘 사용)
    
    uniform_int_distribution<int> dis(145); //1 ~ 45까지 균등하게 나타나는 난수열을 생성하기 위해 균등 분포 정의 
    
    for (int i = 0; i < LOTTO_MAX - 1; i++) {
        create_lottery_num = dis(gen);
        
        //중복 검사.
        for (int j = 0; j < machine_vec.size(); j++) {
            if (create_lottery_num == machine_vec[j])
                CreateLotteryNumber();
        }
        machine_vec.push_back(create_lottery_num);
    }
 
    bonus_number = BonusLotteryNumber(machine_vec);
 
    machine_vec.push_back(bonus_number);
 
    cout << "생성된 1등번호 + 보너스번호 : ";
    for (int i = 0; i < machine_vec.size(); i++) {
        cout << "[" << machine_vec[i] << "] ";
    }
 
    cout << endl;
 
    int rank;
    rank = ret_ranking(machine_vec, user_vec);
 
    cout << "당신은 " << rank << "입니다." << endl;
}
 
bool check_number(int num)
{
    if (num > 45 || num < 1) {
        cout << "잘못된 숫자를 입력 하셨습니다. 다시 입력 하세요." << endl;
 
        return false;
    }
    else
        return true;
}
 
//중복 체크. 처음에 체크되는 부분은 true 이후 중복이 발견되면 fail
bool Lottery::duplicate_check(int input, vector<int>& vec)
{
    int check_cnt = 0;
 
    cout << "input : " << input << endl;
    cout << "vector size : " << vec.size() << endl;
 
    for (int i = 0; i < vec.size(); i++){
        cout << "vec : " << vec[i] << endl;
        if (input == vec[i]) {            
            cout << "데이터 중복." << endl;
            return false;            
        }
    }
 
    return true;
}
 
void Lottery::Lotto_Input(vector<int>& vec)
{
    cout << "번호를 입력하세요." << endl;    
 
    while (1) {        
        cout << lotto_idx +1 << "번째 번호 입력 : ";
        cin >> lotto_num;
 
        if (check_number(lotto_num)){
            if (duplicate_check(lotto_num, vec)) {
                check_list[lotto_idx] = 1;
                vec.push_back(lotto_num);
                lotto_idx++;
            }
        }
        else Lotto_Input(vec);        
        
        if (lotto_idx > 5break;
    }
}
 
void Lottery::UserInterFace_Init()
{
    cout << "안녕하세요. 로또 테스트 프로그램에 오신 것을 환영 합니다." << endl;
    cout << "총 6개의 번호를 입력하세요 1 ~ 45 입니다." << endl;
    cout << "총 6개를 맞추면 1등입니다." << endl;
    cout << "총 5개를 맞추고 보너스번호 1개를 맞추면 2등입니다. ( 억울 하겠네요... ㅎㅎ ) " << endl;
    cout << "총 5개를 맞추면 3등 입니다. " << endl;
    cout << "총 4개를 맞추면 4등 입니다. " << endl;
    cout << "총 3개를 맞추면 3등 입니다. " << endl;
    cout << endl;
 
    Lotto_Input(user_vec);
 
    printLottoNumber(user_vec);
 
    CreateLotteryNumber();
}
 
void Lottery::printLottoNumber(vector<int>& vec)
{
    cout << "Lotto Number :";
 
    for (int i = 0; i < vec.size(); i++) {
        cout <<  "[" << vec[i] << "] ";
    }    
    
    cout << endl;
}
 
int main(int agrc, char** argv)
{
    Lottery lot;
 
    lot.UserInterFace_Init();
    
    return 0;
}
cs
728x90
728x90
반응형

안녕하세요.

 

리눅스 환경에서의 OPENSSL 크로스 컴파일 방법 입니다.

필요에 따라서 ./configure --help하여 필요한 옵션만 추가 해서 하면됩니다.

리눅스 환경은 ubuntu 14.04에서 하였고 동작은 임베디드 환경에서 동작 테스트 완료 하였습니다.

arm기반의 브로드컴칩에서 동작됩니다.

 

* 소스컴파일

./Configure linux-generic32 shared -DL_ENDIAN --prefix=/home/shlee/openssl-arm --openssldir=/home/shlee/2_nanogrid/openssl

make;make install 

 

make install을 하면 configure의 prefix로 지정된 경로로 파일을 복사 합니다.

 

또 다른 방법.

  • toolchain source해줄것.
  • configure
    ./Configure linux-generic32 shared -DL_ENDIAN --prefix=/home/shlee/xml_rpc/openssl-arm --openssldir=/home/shlee/xml_rpc/openssl
  • make 
    make install CC=arm-linux-gcc RANLIB=arm-linux-gnueabihf-gcc-ranlib LD=arm-linux-gnueabihf-ld MAKEDEPPROG=arm-linux-gnueabihf-gcc PROCESSOR=ARM
  • 참고 사이트
  • 빌드 완료 된 openssl 파일을 타겟에서 실행 하면
    symbol lookup error: ./openssl: undefined symbol: i2d_DHxparams
    위에 같은 에러가 발생 하는 경우 컴파일 하면서 생성 된 lib파일을 타겟의 libs/lib 에 복사 해 주면된다.
  • ps) libssl이나 lib crypto는 현재 타겟 이미지를 만들면서 만들어지는 라이브러리 인데 openssl 컴파일 하면서 생성된 라이브러리로 교체 해주었을 때 타겟 이미지가 정상 적인 동작을 하는지 확인이 필요하다.
  • openssl.cnf path 설정.
  • openssl 실행 후 WARNING: can't open config file: /home/shlee/xml_rpc/openssl/openssl.cnf 발생 할 경우
    export OPENSSL_CONF=/mnt/hd/openssl.cnf
    위 처럼 설정 해주면 해당 warning메세지 발생 안함. libpath 파일에 등록 하고 소싱 해주면 됨.
  • 최종 실행 방법
    1. openssl
    2. version
    이후에 본인이 설정한 버전이 맞는지 확인 하면 일단 설치는 완료.

 

 

728x90

+ Recent posts