2016년 5월 21일 토요일

Talend Open Studio(TOS) 암호화, 복호화.

TOS를 사용해서 DB 데이터를 contexts로 저장 하였다. contexts로 exprot 하면 해당 내용들이 파일로 저장되기 때문에, 몇몇개의 값 때문에 다시 빌드 하지 않아도 된다.

일종의 설정파일이다.

문제는 type을 password로 지정하면 암호화가 되는 데, 파일의 내용을 수정할 수가 없다.

이렇게 되면 패스워드 때문에 다시 빌드를 실행해야 되기 때문에 contexts로 만든 의미가 없어진다.

물론 String으로 바꿔서 저장하면 되지만 clear text로 저장되는 건 조금 꺼림칙하다.

db 접속을 위해서는 복호화가 가능 해야 하지 않을 까 생각했더니, 역시나 복호화가 가능하다.

TOS 소스 자체는 오픈되어 있고, github에서 볼 수 있다.

PasswordEncryptUtil.java 부분에 encryptPassword, decryptPassword가 있는데,

이 부분을 가져다 사용해서 간단한 프로그램으로 만들어 놓으면, 다시 빌드해야 하는 번거로움은 덜 수 있다.

2016년 5월 11일 수요일

qmailanalog 설치 및 사용 시 에러

qmailanalog를 설치 하려고 다운 받았다.

make 했더니 오류가 난다.
/usr/bin/ld: errno: TLS definition in /lib/libc.so.6 section .tbss mismatches non-TLS reference in strerr.a(strerr_sys.o)
/lib/libc.so.6: could not read symbols: Bad value
collect2: ld returned 1 exit status

위와같은 오류발생시 error.h파일에 extern int errno; 이줄 삭제 #include <errno.h> 그위치에 이줄 추가한다.
출처
cat /var/log/maillog | awk '{$1="";$2="";$3="";$4="";$5="";print}' > /tmp/qmailLogTmp
cat /tmp/qmailLogTmp | /usr/local/qmailanalog/bin/matchup | /usr/local/qmailanalog/bin/zoverall > /tmp/qmailLog

위와 같이 했더니, 오류 발생.
matchup: fatal: unable to write fd 5: file descriptor not open

나눠져 있는 로그 파일을 합치라고 하면서 아래와 같이 코드를 적어 놨음.
(무려 중국 블로그)
<log.1 matchup >out.1 5>pending.2
cat pending.2 log.2 | matchup >out.2 5>pending.3
cat pending.3 log.3 | matchup >out.3 5>pending.4

왜 이렇게 하는 지 모르겠음.

그냥 이렇게 하니까 된다.
cat /var/log/maillog* | awk '{$1="";$2="";$3="";$4="";$5="";print}' > /tmp/qmailLogTmp
cat /tmp/qmailLogTmp | /usr/local/qmailanalog/bin/matchup | /usr/local/qmailanalog/bin/zoverall > /tmp/qmailLog

/tmp/qmailLog 내용을 보면

[root@mail qmailanalog-0.70]# cat /tmp/qmailLog
Basic statistics

qtime is the time spent by a message in the queue.

ddelay is the latency for a successful delivery to one recipient---the
end of successful delivery, minus the time when the message was queued.

xdelay is the latency for a delivery attempt---the time when the attempt
finished, minus the time when it started. The average concurrency is the
total xdelay for all deliveries divided by the time span; this is a good
measure of how busy the mailer is.

Completed messages: 18684
Recipients for completed messages: 24230
Total delivery attempts for completed messages: 24458
Average delivery attempts per completed message: 1.30903
Bytes in completed messages: 5.20127e+09
Bytes weighted by success: 1.00912e+10
Average message qtime (s): 15.4838

Total delivery attempts: 24458
success: 24060
failure: 170
deferral: 228
Total ddelay (s): 158313.276733
Average ddelay per success (s): 6.579937
Total xdelay (s): 169514.560113
Average xdelay per delivery attempt (s): 6.930843
Time span (days): 7.42548
Average concurrency: 0.264222

잘 나온다.

근데 내가 원하는 내용이 아니다. ㅠㅠ

2016년 5월 10일 화요일

bulk insert 시 에러.

아래와 같은 에러 메시지 발생
메시지 4866, 수준 16, 상태 8, 줄 1
대량 로드하지 못했습니다. 데이터 파일의 행 1, 열 24에서 열이 너무 깁니다. 필드 종결자와 행 종결자를 제대로 지정했는지 확인하십시오.
메시지 7301, 수준 16, 상태 2, 줄 1
연결된 서버 "(null)"의 OLE DB 공급자 "BULK"에서 필수 인터페이스("IID_IColumnsInfo")를 가져올 수 없습니다.

필드 종결자를 바꿈.
\r\n 이 아님.
\n 으로 바꾸고 잘됨.

mssql 우편번호 쉽게 넣기, 업데이트

관리하는 사이트 중에 우편번호를 DB 에 저장해서 사용하는 곳이 있다.
DB에 저장해서 사용하다 보니 주기적으로 계속 업데이트를 해 줘야 한다.
sql server management studio 프로그램의 데이터 가져오기를 이용해서 넣어 줬다.

우체국 사이트에서 제공하는 데이터가 각 도별 txt 파일이다.
우리나라의 전체 도가 17개인데, ssms 프로그램으로 넣으려면 무려 반복 노가다를 17번을 해야 한다.

bulk insert를 이용해서 한번에 insert 시키도록 하였다.
bulk insert를 하려면 양식(formatfile)이 필요하다.
cmd 창을 열고 아래와 같이 입력해서 뽑아 내자.
C:\Users\Administrator>bcp mydb.dbo.T_ZIPCODE format nul -c -x -f crmZipcode.a.xml -t"|" -T

해당 파일을 바로 사용 하면 좋은데, 우체국 제공 컬럼과 실제 컬럼이 일치 하지 않는 다. 수정이 필요하다.
관리 사이트와 우체국 우편번호 데이터 컬럼의 다른 점은 다음과 같다.
1. 20번 컬럼인 '행정동' 컬럼이 없다.
2. 25번 컬럼인 '구우편번호' 컬럼이 없다.
3. 26번 컬럼인 '우편번호일련번호' 컬럼이 1번째에 있다.

변경하면 다음과 같다.
<?xml version="1.0"?>
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<RECORD>
<!--파일의 필드 -->
<FIELD ID="1" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="14" COLLATION="Korean_Wansung_CI_AS"/>
<FIELD ID="2" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="40" COLLATION="Korean_Wansung_CI_AS"/>
<FIELD ID="3" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="60" COLLATION="Korean_Wansung_CI_AS"/>
<FIELD ID="4" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="60" COLLATION="Korean_Wansung_CI_AS"/>
<FIELD ID="5" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="60" COLLATION="Korean_Wansung_CI_AS"/>
<FIELD ID="6" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="40" COLLATION="Korean_Wansung_CI_AS"/>
<FIELD ID="7" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="100" COLLATION="Korean_Wansung_CI_AS"/>
<FIELD ID="8" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="100" COLLATION="Korean_Wansung_CI_AS"/>
<FIELD ID="9" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="160" COLLATION="Korean_Wansung_CI_AS"/>
<FIELD ID="10" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="500" COLLATION="Korean_Wansung_CI_AS"/>
<FIELD ID="11" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="4" COLLATION="Korean_Wansung_CI_AS"/>
<FIELD ID="12" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="40" COLLATION="Korean_Wansung_CI_AS"/>
<FIELD ID="13" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="40" COLLATION="Korean_Wansung_CI_AS"/>
<FIELD ID="14" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="50" COLLATION="Korean_Wansung_CI_AS"/>
<FIELD ID="15" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="400" COLLATION="Korean_Wansung_CI_AS"/>
<FIELD ID="16" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="500" COLLATION="Korean_Wansung_CI_AS"/>
<FIELD ID="17" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="60" COLLATION="Korean_Wansung_CI_AS"/>
<FIELD ID="18" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="40" COLLATION="Korean_Wansung_CI_AS"/>
<FIELD ID="19" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="40" COLLATION="Korean_Wansung_CI_AS"/>
<FIELD ID="20" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="100" COLLATION="Korean_Wansung_CI_AS"/> <!-- 행정동 -->
<FIELD ID="21" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="100" COLLATION="Korean_Wansung_CI_AS"/> <!--산여부 -->
<FIELD ID="22" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="4" COLLATION="Korean_Wansung_CI_AS"/>
<FIELD ID="23" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="40" COLLATION="Korean_Wansung_CI_AS"/>
<FIELD ID="24" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="40" COLLATION="Korean_Wansung_CI_AS"/>
<FIELD ID="25" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="40" COLLATION="Korean_Wansung_CI_AS"/>
<FIELD ID="26" xsi:type="CharTerm" TERMINATOR="\n" MAX_LENGTH="12"/>
</RECORD>
<!--서버의 필드 -->
<ROW>
<COLUMN SOURCE="26" NAME="SEQ" xsi:type="SQLINT"/>
<COLUMN SOURCE="1" NAME="ZIPCODE" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="2" NAME="SIDO" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="3" NAME="ESIDO" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="4" NAME="SIGUNGU" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="5" NAME="ESIGUNGU" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="6" NAME="EUPMRN" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="7" NAME="EEUPMRN" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="8" NAME="ROADCODE" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="9" NAME="ROADNAME" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="10" NAME="EROADNAME" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="11" NAME="ZIYN" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="12" NAME="GUNBON" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="13" NAME="GUNBU" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="14" NAME="GUNSEQ" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="15" NAME="DABE" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="16" NAME="GUNNAME" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="17" NAME="BUBCODE" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="18" NAME="BUBDONG" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="19" NAME="RI" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="21" NAME="SANYN" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="22" NAME="ZIBON" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="23" NAME="EUPSEQ" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="24" NAME="ZIBU" xsi:type="SQLNVARCHAR"/>
</ROW>
</BCPFORMAT>
<!-- 서버의 필드에 없는 것은 컬럼을 넣지 않음. -->
<!-- 파일의 필드는 쓰던 쓰지 않던 모두 넣음 -->
<!-- 베이스가 되는 파일 생성 명령어 : C:\Users\Administrator>bcp mydb.dbo.T_ZIPCODE format nul -c -x -f crmZipcode.a.xml -t"|" -T -->

이 양식을 이해 하는 데, 조금 오래 걸렸다.
간단히 설명하면,
1. 상단 RECORD 는 파일의 컬럼이다. 전부 있어야 된다.
2. 하단 ROW는 테이블의 컬럼이다. 수정해서 써야 한다.
내껄 보면 26번이 처음 있고, 20번과 25번이 없는 걸 알 수 있다.
bulk insert 쿼리는 다음과 같다.
BULK INSERT mydb.[dbo].[T_ZIPCODE] FROM 'C:\Users\Administrator\Downloads\zipcode_DB\지역별전체 DB\20160504_우편번호_지역별주소\강원도.txt'            WITH ( FIRSTROW = 2, formatfile='C:\Users\Administrator\crmZipcod.xml' )
BULK INSERT mydb.[dbo].[T_ZIPCODE] FROM 'C:\Users\Administrator\Downloads\zipcode_DB\지역별전체 DB\20160504_우편번호_지역별주소\경기도.txt' WITH ( FIRSTROW = 2, formatfile='C:\Users\Administrator\crmZipcod.xml' )
BULK INSERT mydb.[dbo].[T_ZIPCODE] FROM 'C:\Users\Administrator\Downloads\zipcode_DB\지역별전체 DB\20160504_우편번호_지역별주소\경상남도.txt' WITH ( FIRSTROW = 2, formatfile='C:\Users\Administrator\crmZipcod.xml' )
BULK INSERT mydb.[dbo].[T_ZIPCODE] FROM 'C:\Users\Administrator\Downloads\zipcode_DB\지역별전체 DB\20160504_우편번호_지역별주소\경상북도.txt' WITH ( FIRSTROW = 2, formatfile='C:\Users\Administrator\crmZipcod.xml' )
BULK INSERT mydb.[dbo].[T_ZIPCODE] FROM 'C:\Users\Administrator\Downloads\zipcode_DB\지역별전체 DB\20160504_우편번호_지역별주소\광주광역시.txt' WITH ( FIRSTROW = 2, formatfile='C:\Users\Administrator\crmZipcod.xml' )
BULK INSERT mydb.[dbo].[T_ZIPCODE] FROM 'C:\Users\Administrator\Downloads\zipcode_DB\지역별전체 DB\20160504_우편번호_지역별주소\대구광역시.txt' WITH ( FIRSTROW = 2, formatfile='C:\Users\Administrator\crmZipcod.xml' )
BULK INSERT mydb.[dbo].[T_ZIPCODE] FROM 'C:\Users\Administrator\Downloads\zipcode_DB\지역별전체 DB\20160504_우편번호_지역별주소\대전광역시.txt' WITH ( FIRSTROW = 2, formatfile='C:\Users\Administrator\crmZipcod.xml' )
BULK INSERT mydb.[dbo].[T_ZIPCODE] FROM 'C:\Users\Administrator\Downloads\zipcode_DB\지역별전체 DB\20160504_우편번호_지역별주소\부산광역시.txt' WITH ( FIRSTROW = 2, formatfile='C:\Users\Administrator\crmZipcod.xml' )
BULK INSERT mydb.[dbo].[T_ZIPCODE] FROM 'C:\Users\Administrator\Downloads\zipcode_DB\지역별전체 DB\20160504_우편번호_지역별주소\서울특별시.txt' WITH ( FIRSTROW = 2, formatfile='C:\Users\Administrator\crmZipcod.xml' )
BULK INSERT mydb.[dbo].[T_ZIPCODE] FROM 'C:\Users\Administrator\Downloads\zipcode_DB\지역별전체 DB\20160504_우편번호_지역별주소\세종특별자치시.txt' WITH ( FIRSTROW = 2, formatfile='C:\Users\Administrator\crmZipcod.xml' )
BULK INSERT mydb.[dbo].[T_ZIPCODE] FROM 'C:\Users\Administrator\Downloads\zipcode_DB\지역별전체 DB\20160504_우편번호_지역별주소\울산광역시.txt' WITH ( FIRSTROW = 2, formatfile='C:\Users\Administrator\crmZipcod.xml' )
BULK INSERT mydb.[dbo].[T_ZIPCODE] FROM 'C:\Users\Administrator\Downloads\zipcode_DB\지역별전체 DB\20160504_우편번호_지역별주소\인천광역시.txt' WITH ( FIRSTROW = 2, formatfile='C:\Users\Administrator\crmZipcod.xml' )
BULK INSERT mydb.[dbo].[T_ZIPCODE] FROM 'C:\Users\Administrator\Downloads\zipcode_DB\지역별전체 DB\20160504_우편번호_지역별주소\전라남도.txt' WITH ( FIRSTROW = 2, formatfile='C:\Users\Administrator\crmZipcod.xml' )
BULK INSERT mydb.[dbo].[T_ZIPCODE] FROM 'C:\Users\Administrator\Downloads\zipcode_DB\지역별전체 DB\20160504_우편번호_지역별주소\전라북도.txt' WITH ( FIRSTROW = 2, formatfile='C:\Users\Administrator\crmZipcod.xml' )
BULK INSERT mydb.[dbo].[T_ZIPCODE] FROM 'C:\Users\Administrator\Downloads\zipcode_DB\지역별전체 DB\20160504_우편번호_지역별주소\제주특별자치도.txt' WITH ( FIRSTROW = 2, formatfile='C:\Users\Administrator\crmZipcod.xml' )
BULK INSERT mydb.[dbo].[T_ZIPCODE] FROM 'C:\Users\Administrator\Downloads\zipcode_DB\지역별전체 DB\20160504_우편번호_지역별주소\충청남도.txt' WITH ( FIRSTROW = 2, formatfile='C:\Users\Administrator\crmZipcod.xml' )
BULK INSERT mydb.[dbo].[T_ZIPCODE] FROM 'C:\Users\Administrator\Downloads\zipcode_DB\지역별전체 DB\20160504_우편번호_지역별주소\충청북도.txt' WITH ( FIRSTROW = 2, formatfile='C:\Users\Administrator\crmZipcod.xml' )


FROM 절과 formatfile 의 위치를 수정해서 사용하면 된다.
path를 변수로 만들고 싶었으나, 기본적으로 지원하지 않고, 동적 sql을 사용해야 한다길래 그냥 뒀다.

 

대략 30분가량의 노가다를 없앴다.  :)

2016년 5월 4일 수요일

MSSQL bak 파일을 이용하여 복원

백업된 bak 파일을 복원
1. 복구할 DB 선택, 우클릭 속성 , 옵션 -> 엑세스 제한을 RESTRICTED_USER 로 변경.

(
RESTRICTED_USER
RESTRICTED_USER를 사용하면 db_owner 고정 데이터베이스 역할과 dbcreator 및 sysadmin 고정 서버 역할의 멤버만 데이터베이스에 연결할 수 있습니다. 연결할 수 있는 멤버의 수에는 제한이 없습니다.데이터베이스에 대한 모든 연결은 ALTER DATABASE 문의 termination 절에 지정된 시간대에 끊어집니다.데이터베이스가 RESTRICTED_USER 상태로 바뀐 후 자격이 없는 사용자의 연결 시도는 거부됩니다.
)


2. 복구할 DB 선택, 태스크 -> 복원 -> 파일 및 파일 그룹 선택
3. 복원에 사용할 원본을 장치 -> bak 파일 선택
5. 옵션에서 기존 데이터베이스 덮어쓰기 체크
6. 실행.
검색하다 보면 블로그에 mssql DB 복원 관련 글에서 엑세스 제한을 single user로 변경하고 복원하라는 글이 있는데,
이렇게 하면 기존 웹프로그램이나, 기타 DB 접속 프로그램이 먼저 선점하면 아주 골치 아픈 일이 발생한다.

2016년 4월 8일 금요일

Device eth0 does not seem to be present, delaying initialization 에러

서버 파워가 나갔다. 완전 같은 기종으로 유휴 장비가 있어서
하드디스크만 교체하여 올리니 바로 올라갔다.

네트워크가 안된다.
Device eth0 does not seem to be present, delaying initialization 에러 발생.

여기 참조해서 처리.

networking interface rules이란게 있는 것도 처음 알았다.

방법은 간단했다.
# rm /etc/udev/rules.d/70-persistent-net.rules
# reboot

이렇게 하면 해당 파일을 os가 다시 만든다.

그리고
/etc/sysconfig/network-scripts/ifcfg-eth0
파일에서

새로 생성된 rules 파일에 있는 HWADDR 로 바꾸고,
UUID 부분은 삭제한다.

그리고 service network restart.

네트워크가 올라간다.

2016년 3월 8일 화요일

LG HBS900 사용후기

3달간 사용후 느낀점

기존 HBS700를 사용했었음.

1. 고질적인 통화 불량 여전함. 주변 소리를 차단하는 기능이 없어서 상대방이 무척 시끄럽게 들린다고 함. 이게 제일 불만.
2. 음질적인 부분도 하마카돈가 제휴 했다고 하지만 별로 못 느낌.
3. 줄 자동으로 감는 부분은 좋음.
4. 충전은 출퇴근만 2시간 정도만 사용하는 거라, 부족하지 않았음. 배터리 확인시 '보통입니다.' 라고 확인 했을 때 4시간 정도 사용가능 했음.
5. HBS700 보다는 약간 뼈대(?)가 약간 더 뻣뻣한 느낌이 있음.

6. 왼쪽 스틱(?)을 아래쪽으로 계속 누르면 현재 배터리 상태를 알려주는 데, 음악 재생시에는 볼륨을 줄여버린다. 완전 끝까지 내리고 난 후 배터리 상태를 알려준다.