Linux SSH Server와 Windows 10 SSH Client 연동. 그리고 SCP로 파일 올리는 방법을 설명합니다.
참고) Linux는 기본적으로 SSH Server를 이용할 수 있지만, Windows는 SSH Client를 기본 제공하지 않아 Putty를 설치하여 SSH Client로 사용해 왔습니다.
그러나, Windows 10은 Putty와 같은 별도의 툴을 설치할 필요 없이 내장된 OpenSSH를 통해 SSH Client 기능을 이용할 수 있습니다.
다음의 순서로 진행하시면 Windows에서 Linux로 SSH 방식으로 파일을 업로드 할 수 있습니다
1. Linux에서 SSH 서버 실행 및 SSH 접근 계정 생성
1) Linux에서 SSH 서버 실행
가) ssh 서버 설치
- $sudo apt-get install ssh
나) root 로그인 혀용
- $sudo vi /etc/ssh/sshd_config 진입하여 아래 내용 변경 후 저장
#PermitRootLogin prohibit-password -> PermitRootLogin yes
다) SSH 서버 실행
- $sudo service ssh start
라) SSH 서버 동작 상태 확인
- $service ssh status
2) test_user 계정 추가
가) test_user 계정을 추가하며 홈 디렉토리를 test_user로 지정
- $sudo useradd test_user -d /home/test_user
나) test_user 계정에 password 설정
- $sudo passwd test_user 입력하고 엔터치면 password 입력란이 나온다.
다) 홈 디렉토리인 test_user 폴더 생성
- $sudo mkdir /home/test_user
라) 홈 디렉토리인 test_user 폴더에 대한 권한을 test_user 계정으로 지정
- $sudo chown -R test_user:test_user /home/test_user
2. Windows에서 ssh key를 생성하고 Linux 서버에 public key를 배포하는 과정
1) MS 설명 참고(키를 생성하고, 서버에 public key를 배포한다.)
PowerShell을 이용하는 방법이다.
PowerShell을 이용하는 방법이다.
- https://docs.microsoft.com/ko-kr/windows-server/administration/openssh/openssh_keymanagement
3. Windows에서 Linux로 데이터를 올리는 배치 파일 예
아래의 내용을 배치파일로 실행하면 Windows의 upload_folder 폴더 내용이 서버의 "/home/test_user/20191204/" 폴더에 업로드 된다.
set server=test_user@192.168.0.111
set destiny=/home/test_user/20191204/
set src=./upload_folder
ssh %server% mkdir -p %destiny% && scp -r %src% %server%:%destiny%
위 내용은 개인적으로 검토한 내용이므로 참고만 하시기 바랍니다.
감사합니다.
SQLite Encryption 기능에 대해 설명한다.
SQLite Library는 public license로 제한없이 무료로 사용할 수 있다.
그러나, 보안성을 만족하기 위해 DB를 암호화 하려면 어떻게 해야 할까?
다음과 같이 2가지 방법이 있을 것이다.
- 필드의 내용을 암호화 하여 DB에 저장하는 방법
이는 매번 저장할때마다 암호화를 수행하고, DB로부터 값을 읽어올때마다
매번 복호화를 해야 한다.
DB를 이용하는 어플레케이션이 많이 복잡해지는 상황이 발생한다.
또한, 모든 필드를 각각 암/복호화를 해야 하기 때문에 동작 시간이 많이 늘어나게 된다.
- DB 파일 자체를 암호화 하는 방법
DB 파일을 암호화 하는 것은 위의 방식보다는 간편하다.
그러나, DB 파일 자체가 크면 암/복호화 하는 시간이 많이 걸릴것이다.
또한, DB 파일을 암호화 하는 시점이 애매하다.
정상적인 프로그램 종료시 암호화를 하여 저장한다면, 비 정상적으로 종료되는
상황에서는 DB에 최신정보를 유지할 수가 없게 된다.
위의 2가지 암호화 방식은 상기와 같은 문제점이 있어, 그리 올바른 프로그램 방식이
아니다.
이에, SQLite에서는 암호화를 지원하기 위한 Extension 기능을 제공한다.
이를 SQLite Encryption Extension(이하에서는 SEE라고 명칭)이라고 한다.
SEE는 무료인가?
아니다, 2,000 달러를 지불해야 구매가 가능하다.
2,000 달러를 입금하면, SEE 소스를 다운받을 수 있는 id, password를 받을 수 있다.
소스를 다운받는 사이트는 아래와 같다.
https://www.sqlite.org/see/doc/release/www/index.wiki
직접 2,000 달러를 주고 구매해 보았다.
id, password를 받고 위 사이트에 로그인하니 SEE 소스를 다운받을 수 있었다.
2019.07.20일 기준으로 stable, release 버전은 다음과 같다.
stable: SQLIte 3.7.17 버전을 기준으로 만든 SEE 소스
release: SQLIte 3.29.0 버전을 기준으로 만든 SEE 소스
나는 stable 버전이 안정적이기에 이를 다운받아 사용하였다.
SEE compile 방법:
- SEE 소스를 다운받는다.
여기에는 sqlite.c, see.c 등의 파일이 있다.
- SEE 소스 compile
sqlite.c, see.c 등의 파일을 CL 명령어를 통해서 컴파일 한다.
- 컴파일된 파일을 static library로 생성
sqlite.lib로 생성한다.
SEE 기능 적용방법:
- 위에서 생성한 sqlite.lib를 응용 어플리케이션에서 import 한다.
Visual Studio 사용자라면, Link에서 종속 library로 sqlite.lib를 추가한다.
- 다음 함수를 통해서 암호화 key 설정한다.(SQLite 3.7.17 stable 버전 기준)
SQLITE_API int sqlite3_key( sqlite3 *db,
const void *pKey,
int nKey );
위의 pKey에 암호화를 위한 Key를 입력하면 된다.
aes128 암화화 하는 경우: aes128:1234567890123456
aes256 암화화 하는 경우: aes256:12345678901234561234567890123456
위에서 보는바와 같이 prefix로 "aes128:" or "aes256:"을 기입하고,
aes128인 경우는 16바이트, aes256인 경우는 32바이트 키를 넣어주면 된다.
SEE 속도 테스트 결과:
무엇보다 중요한것이 암호화하면 속도가 얼마나 느려지는가 이다.
이에 SEE 수행속도를 간략하게나마 테스트 해보았다.
시스템 조건:
cpu: Inter Core i7-8550U CPU 1.80GHz 1.99 GHz
memroy: 8GB
저장장치: SSD
저장장치: SSD
데이터 조건
table: 100개
table 당 레코드 수: 1000개
table의 column 구조: 5개 INTEGER, 4개 TEXT, 1개 BLOB
column 내용: 4개 TEXT에는 50바이트의 문자열, 1개 BLOB에는 256바이트 blob
SEE 수행 테스트 결과:
- SEE 적용버전(aes128 형식으로 암호화)
table에 1000개의 레코드 insert 소요시간: 평균 15 second
where절을 이용한 900개의 레코드 update 시간: 0 second
where절을 이용한 900개의 레코드 delete 시간: 0 second
where절을 이용한 900개의 레코드 query 시간: 0 second
- SEE 미적용 버전(암호화를 하지 않은 경우)
table에 1000개의 레코드 insert 소요시간: 평균 15 second
where절을 이용한 900개의 레코드 update 시간: 0 second
where절을 이용한 900개의 레코드 delete 시간: 0 second
where절을 이용한 900개의 레코드 query 시간: 0 second
SEE 수행결과에 따른 결론:
위 테스트 조건에서는 SEE 적용에 따른 속도 저하가 나타나지 않았다.
SEE 적용 알고리즘이 최적화 되었다고 하니, 이렇게 속도가 느려지지 않은것 같다.
앞으로는 더 대용량의 조건을 가지고 테스트 해봐야 겠다.
위 내용은 개인적으로 검토한 내용이므로 참고만 하시기 바랍니다.
감사합니다.
Visual Studio 2015에서는 Code Metrics 분석툴이 지원된다.
그러나, Code Metrics는 managed code 형식만 지원한다.
managed code는 VB .NET or C# 컴파일러가 생성한 코드를 말한다.
C++ 컴파일러는 managed code를 생성하지 않는다.
이에, Win32 Console Application으로 생성한 프로젝트에서 Code Metrics를 수행하면 아래와 같은 에러가 발생한다.
Project: TempLib
Configuration: Debug
Scope: None
Assembly: D:\work\TempLib.lib
Maintainability Index:
Depth of Inheritance:
Cyclomatic Complexity:
Class Coupling:
Message: The project target file 'D:\work\TempLib.lib' contains no managed code.
이에 별도의 Code Metrics Tools 를 이용해야 한다.
여러가지가 있는데, 무료로 사용하기 편리한 Tool이 있다.
SourceMonitor 라는 Tool이 이에 해당한다.
이는 다음과 같은 이점이 있다.
- Freeware.
- C++, C, C#, VB.NET, Java, Delphi, Visual Basic (VB6) or HTML 지원
다운로드 주소는 다음과 같다
- http://www.campwoodsw.com/sourcemonitor.html
위 내용은 개인적으로 검토한 내용이므로 참고만 하시기 바랍니다.
감사합니다.
C/C++에서 memory allocation하는 방법은 다음과 같이 3가지가 있다.
- Static, Automatic, Dynamic Memory Allocation
1. Static Allocation
- static으로 할당된 메모리는 program의 lifetime에 따라 메모리가 할당되고 해제된다.
- 사용예제
int a = 100; // 함수 외부에서 선언하는 경우
static int a = 32; // 함수 내, 외부에서 선언하는 경우
2. Automatic Memory Allocation
- 함수내 지역변수 선언시 메모리가 할당되는 방식이다.
- 순차적인 방식으로 메모리에 할당된다.
- 역순(First-In, LastOut)으로 메모리가 해제된다.
- Stack 형식으로 순차적으로 메모리가 할당되어 Heap 영역에 할당하는 Dynamic memory allocation 방식보다
속도가 빠르다.(주소를 찾는 과정이 빠르기 때문)
- 사용예제
void func() {
int i; // 단지 함수 안에서만 메모리에 할당되고, 함수 종료시 메모리에서 해제된다.
}
3. Dynamic Memory Allocation
- Heap 메모리 영역에 할당된다.
- Static 형식으로 할당되는 Automatic Memory Allocation보다 메모리 할당이 느리다.
- 메모리 해제를 직접 해주어야 한다.
- 해제를 위해 delete or delete[]를 사용한다.
- 해제하는 과정을 하지 않으면 memory leaks이 발생한다.
- memory fragmentation이 발생할 수 있다.
- compile 시점에 할당할 메모리 크기를 모를때나 함수를 빠져나와도 메모리가 유지되어야
하는 경우 등에 사용한다.
- 사용예제
int * function(int variableSize) {
int * mem = malloc(variableSize);
}
int * mem = function(1024); // 함수 외부에서도 할당된 메모리를 사용할 수 있다.
위 내용은 개인적으로 검토한 내용이므로 참고만 하시기 바랍니다.
감사합니다.
Database에서 주로 사용하는 기술에 대해서 간략히 설명한다.
1. Index
책에서 특정 내용을 찾으려고 책 전체의 내용을 봐야 한다면 시간이 오래 걸릴것이다.
이를 위해 책에는 목차가 있고, 목차를 통해 특정 내용을 빨리 찾을 수 있게 된다.
DB Index도 마찬가지이다.
DB Index는 자료구조 형태로 DB의 row 내용을 정렬해서 관리한다.
Index를 사용하면, 일반적으로 검색을 하는 것보다 빠르게 검색할 수 있다.
그러나, 단점도 있다.
Index 정보를 유지하기 위해 별도의 저장공간이 필요하고, DB 내용 변경시 Index 정보를 생성하기 위한 별도의
Operation Time이 필요하다.
이러한 관점에서 Index 사용에 대한 장단점을 살펴보자.
- Index 사용의 장점
검색 속도가 향상된다.
이는 주로 row가 많고, 검색을 많이 해야 하는 Table에 대해서 하는 것이 좋다.
Index의 필드의 값이 TRUE, FALSE 처럼 단순하지 않고 다양한 값을 가지는 경우에 유용하다.
- Index 사용의 단점
Insert, Delete, Update시에 Index 정보 관리를 위해 추가 Operation Time 필요하다.
Index 정보를 유지하기 위한 별도의 저장공간 필요하다.
2. Join
2개 이상의 테이블에 대해서 검색할때 사용하는 기능이다.
Join에는 다음과 같은 방법이 있다.(여기서는 정리차원에서 간략히 항목만 나열한다)
- Inner Join: Join 조건에서 값이 일치하는 행만 반환하는 경우 사용한다.
- Outer Join(Left or Right): Join 조건에서 한쪽 값이 없더라도 행을 반환하는 경우 사용한다.
3. Foreign Key(외래키)
Table의 한 필드가 다른 Table의 기본키(이하 PK)를 참조할때, 이를 Foreign Key(이하 FK)라고 한다.
이는 두 Table의 관계성을 연결하기 위해 사용한다.
FK를 사용하기 위해서는 2개의 Table이 존재한다.
- 종속 Table: FK를 포함하고 있는 Table
- 상위 Table: 종속 Table에서 참조하고 있는 PK를 가지고 있는 Table
이렇게 FK를 사용하는 이유는 데이터 무결성을 위한 것이다.
즉, 종속 Table에서 Record 추가시 상위 Table의 PK가 아닌값으로 FK 값을 지정하면 에러를 반환한다.
참고로, FK는 상위 Table의 PK 칼럼과 이름이 달라도 상관없다.
위 내용은 개인적으로 검토한 내용이므로 참고만 하시기 바랍니다.
감사합니다.
Muti-Thread Application에서 SQLite를 사용하는 방안에 대해서 설명한다.
SQLite 다음과 같이 3가지 thread 모드를 지원하고 있다.
1) Single-thread
모든 mutexes가 disable 된다.
하나 이상의 thread에서 정상적으로 동작하지 않을 수 있다.
2) Multi-thread
multiple thread에서 사용 가능하다.
그러나, 하나의 database connection은 동시에 2개이상의 thread에서 사용하면 안된다.
3) Serialized
multiple thread에서 제한없이 안전하게 사용할 수 있다.
thread 모드를 설정하는 방식은 아래와 같이 3가지 방식이 있다.
1) Compile-time 설정하는 방식
SQLITE_THREADSAFE 매개변수에 설정하면 된다.
Single-thread: -DSQLITE_THREADSAFE=0 로 설정
Multi-thread: -DSQLITE_THREADSAFE=2 로 설정
Serialized: -DSQLITE_THREADSAFE=1 로 설정
2) Start-time에 설정하는 방식
sqlite3_config() 함수를 이용하여 설정할수 있다.
Single-thread: SQLITE_CONFIG_SINGLETHREAD 로 설정
Multi-thread: SQLITE_CONFIG_MULTITHITREAD 로 설정
Serialized: SQLITE_CONFIG_SERIALIZED 로 설정
3) Run-time에 설정하는 방식
sqlite3_open_v2() 함수를 이용하여 설정할 수 있다.
Single-thread: flag 사용하지 않거나, sqlite3_open() 또는 sqlite3_open16() 함수를 사용하여 open 한다.
Multi-thread: SQLITE_OPEN_NOMUTEX flag 사용
Serialized: SQLITE_OPEN_FULLMUTEX flag 사용
위 내용은 개인적으로 검토한 내용이므로 참고만 하시기 바랍니다.
감사합니다.