지리정보시스템(GIS)의 원시 데이터 중 CAD에 대한 시각화를 위한 색상 테이블을 정리한 표입니다.
Java로 텍스트 파일 읽기
버퍼 방식으로 사용하여 빠르게 텍스트 파일을 읽는 예제 코드입니다. 제가 Java 아재라서, 새로운 Java의 더욱 효과적인 파일 읽기 API가 분명 있을것 같은데.. 혹 있다면 추천 부탁드리겠습니다.
package tst;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
public class MainEntry {
public static void main(String[] args) {
String filePath = "D:\\__Data__\\DXF\\1_5000\\NGII_DTM_5000_울산_남구_35905\\35905090.dxf";
FileInputStream fs = null;
InputStreamReader isr = null;
BufferedReader br = null;
try {
long startTime = System.currentTimeMillis();
fs = new FileInputStream(filePath);
isr = new InputStreamReader(fs, "euc-kr");
br = new BufferedReader(isr);
String line = null;
while((line = br.readLine()) != null) {
//System.out.println(line);
}
long finishTime = System.currentTimeMillis();
System.out.println("소요시간: " + (finishTime - startTime) + " ms");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if(br != null) br.close();
if(isr != null) isr.close();
if(fs != null) fs.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
위의 코드로 7.52MB 크기의 파일을 모두 읽는데, 약 0.13초정도 소요됩니다. 사용하고 있는 개발 환경은 i7-6700HQ@2.60GHz의 RAM 16GB 노트북입니다.
Python에서 외부 데이터 파일 읽기
파이썬에서 다양한 데이터 파일을 읽어오는 코드를 정리한 글로 추후 빠르게 참조하기 위한 목적으로 작성 되었습니다.
CSV 파일 읽기
import csv
rows = []
with open('../data/fileName.csv') as csvfile:
csvreader = csv.reader(csvfile)
next(csvreader, None)
for row in csvreader:
rows.append(row)
3번의 next 함수는 csv 파일의 첫줄에 있는 필드명을 건너뛰기 위함입니다. rows에 데이터가 저장됩니다.
JSON 파일 읽기
import json
with open('../data/fileName.json') as jsonfile:
data = json.load(jsonfile)
value_plainType = data["key1"]
value_arrayType = data["key2"]
value_dictionaryType = data["key3"]
print(value_plainType)
print(value_arrayType)
print(value_dictionaryType["name"])
위의 fileName.json 파일의 내용이 다음과 같을때..
{
"key1" : "string/numeric/bool",
"key2" : [1, 2, 3, 4, 5],
"key3" : { "name":"DoWise", "age": 12 }
}
출력 결과는 다음과 같습니다.
string/numeric/bool [1, 2, 3, 4, 5] DoWise
vi 편집기 명령 정리
이 글은 콘솔 환경에서 텍스트를 편집할 수 있는 vi 편집기 사용을 위해 요약한 글로 vi를 처음 접하는 분들은 다른 글을 참조하시기 바랍니다.
vi는 총 4가지 상태를 가지며 다음과 같은 상태 전환이 이루어집니다.

EX 모드
- 변경된 내용 저장 w
- 변경된 내용 저장하고 종료 wq
- 변경된 내용 무시하고 종료 q!
- 종료 q
- 문자열 검색(예: boy) /boy
- 다음 검색 문자열 n
- 이전 검색 문자열 N
- 문자열 변경(예: boy를 guy로 변경) %s/boy/guy/ig
- 줄 번호 표시 set nu
- 줄 번호 감추기 set nonu
명령 모드
- 현재 커서 위치에서 편집 모드로 전환 i
- 현재 커서 위치 줄의 첫문자 위치에서 편집 모드로 전환 I
- 현재 커서의 바로 뒤에서 편집 모드로 전환 a
- 현재 커서 위치 줄의 마지막 위치에서 편집 모드로 전환 A
- 왼쪽으로 커서 위치 이동 h, ←
- 오른쪽으로 커서 위치 이동 l, →
- 위쪽으로 커서 위치 이동 k, ↑
- 아래쪽으로 커서 위치 이동 j, ↓
- 다음 단어 단위로 커서 이동 w
- 이전 단어 단위로 커서 이동 b
- 커서 위치 라인의 첫 문자로 이동 ^, 0
- 커서 위치 라인의 끝 문자로 이동 $
- 마지막 라인으로 이동 G
- 100번째(1부터 시작) 라인으로 이동 100G
- 편집된 내용 되돌리기 u
- 커서 위치 한글자 삭제 x
- 커서 위치를 포함해 세 글자 삭제 3x
- 커서 앞의 글자 삭제 X
- 커서 위치의 단어 단위로 삭제 dw
- 커서 위치 줄 삭제 dd
- 커서 위치의 줄을 포함해 세 줄 삭제 3dd
- 커서 앞의 글자 삭제 X
- 커서 위치에서 줄 끝 문자까지 삭제 D
- 커서 위치의 줄을 버퍼에 복사 yy
- 커서 위치의 줄을 포함해 세 줄을 버퍼에 복사 3yy
- 버퍼에 복사된 문자열을 커서 위치에 붙여넣기 p
- 버퍼에 복사된 문자열을 커서의 앞 위치에 붙여넣기 P
- 한 글자만 수정 r
- 커서 다음 위치에 빈줄 추가 o
- 커서 이전 위치에 빈줄 추가 O
- 커서 위치의 라인과 다음 라인을 한 라인으로 붙임 J
비주얼 모드
- 글자 단위로 선택(명령모드에서 전환시) v
- 라인 단위로 선택(명령모드에서 전환시) V
- 블럭 단위로 선택(명령모드에서 전환시) ^v
- 선택된 텍스트를 버퍼에 복사 y
- 선택된 텍스트를 삭제 d, x
티베로(Tibero)의 Sequence 기능
Sequence는 국어로 표현하면 연속값 정도.. 하지만 시퀀스라고 이야기한다. 시퀀스는 DBMS 차원에서 유일한 정수 값이 필요할 때 사용된다. 티베로는 오라클의 SQL 구문과 매우 유사하다. 오라클을 이미 알고 있다면 쉽게 티베로도 사용할 수 있다. 그러므로 티베로의 Sequence와 관련된 내용은 모두 오라클의 그 것과 매우 유사하거나 동일하다.
먼저 시퀀스를 생성하는 구문이다.
CREATE SEQUENCE TEST_SEQ MINVALUE 1 -- 기본값은 1 MAXVALUE 10 -- 기본값은 1E+28 NOCYCLE -- CYCLE로 지정되면 값이 최대값을 넘을 서면 다시 값은 최소값에서 시작됨, 기본값은 NOCYCLE로 값이 최대값을 넘어가면 에러 발생 NOCACHE; -- 내부 메모리에 값을 캐시하는 것에 대한 설정으로 기본값은 NOCACHE이며 캐시하지 않은다는 의미
위의 구문 중 NOCACHE 옵션에 대한 부연 설명을 하면, 만약 아래처럼 CACHE 값을 지정했다고 하자.
CREATE SEQUENCE TEST_SEQ CACHE 10;
시퀀스의 캐쉬 기능은 시퀀스 값을 더 빨리 생성하기 위해 원하는 개수만큼 미리 생성해 두게 된다. 위의 구문의 경우 미리 10개의 값을 생성해 두게 되고, NEXTVAL 함수를 통해 시퀀스 값을 생성할 때 미리 생성된 시퀀스 값을 빠르게 제공하게 된다. 문제는 미리 생성된 시퀀스 값들이 다 사용되지 못할지라도 다음의 시퀀스 값은 미리 생성된 값 다음 값이 사용된다는 점이다.
시퀀스가 생성되었다면, 시퀀스 값을 다음 구문으로 얻어올 수 있다.
SELECT TEST_SEQ.NEXTVAL FROM DUAL;
위의 구문을 통해 1이 얻어진다. 동일한 구문을 계속 실행하면 2, 3, 4, 5 등이 얻어지는 식이다. 여기서 DUAL 테이블은 임시 논리테이블로 어떤 함수의 사용법을 확인하기 위한 용도 등에 사용할 수 있다. 예를들어 함수의 사용을 확인하기 위해 테이블이 지정이 필요할때, 마땅이 지정할 테이블이 없을 경우 DAUL 테이블을 지정할 수 있다. (근데 왜 이름이 DAUL인지..)
NEXTVAL을 통해 매번 새로운 시퀀스 값을 얻는데, 새로운 값이 아닌 현재의 시퀀스 값을 확인하기 위한 구문은 다음과 같다.
SELECT TEST_SEQ.CURRVAL FROM DUAL;
시퀀스를 제거하는 구문은 다음과 같다.
DROP SEQUENCE TEST_SEQ;
마지막으로 생성된 시퀀스의 정보를 조회하는 구문은 다음과 같다.
SELECT * FROM ALL_SEQUENCES WHERE SEQUENCE_NAME = 'TEST_SEQ';
티베로에서 직접 위의 구문을 수행해 보면 다음과 같은 결과를 볼 수 있다. 환경에 따라 값이 달라질 수 있다.

