2017년 7월 6일 목요일

StringUtils의 isEmpty, isBlank 분석.

자바에서 Null 포함 빈값을 체크 할 때, StringUtils의 isEmpty 나 isBlank를 사용한다.
isEmpty는 "", null 일 경우 true를 리턴한다.
isBlank는 "", null, " " 일 경우 true를 리턴한다.

해당 메소드가 어떻게 동작하는 지 알아 봤다.

소스
isEmpty가 동작하는 방식은 간단하다.
        public static boolean isEmpty(String str) {
return str == null || str.length() == 0;
}

null 이거나, length 가 0 일경우를 체크 한다.

 

 

isBlank는 조금 더 복잡하다.
        public static boolean isBlank(String str) {
int strLen;
if (str == null || (strLen = str.length()) == 0) {
return true;
}
for (int i = 0; i < strLen; i++) {
if ((Character.isWhitespace(str.charAt(i)) == false)) {
return false;
}
}
return true;
}

첫번째는 isEmpty와 같지만 스페이스를 체크하기 위해 for문을 돈다.

 

 

간혹 StringUtils 라이브러리가 없고, 추가 할 수 없는 경우 참고 하면 좋을 것 같다.

2017년 6월 30일 금요일

오라클 EXCEPTION 진행 문제.

CREATE OR REPLACE PROCEDURE PROCEDURE1
AS

V_CNTR_NO VARCHAR2(13) ;
V_ITEM_CD VARCHAR2(13) ;

BEGIN

DBMS_OUTPUT.PUT_LINE('시작.') ;

BEGIN
SELECT CNTR_NO INTO V_CNTR_NO FROM TB_OD_CNSGN_FEE;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('계약번호가 없습니다.') ;
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('계약번호가 두건 이상입니다.') ;
END;

DBMS_OUTPUT.PUT_LINE('중간.') ;

BEGIN
SELECT ITEM_CD INTO V_ITEM_CD FROM TB_OD_CNSGN_FEE;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('아이템코드가 없습니다.') ;
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('아이템코드가 두건 이상입니다.') ;
END;


DBMS_OUTPUT.PUT_LINE('끝.') ;

EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('TOP EXCEPTION.') ;
END PROCEDURE1;

-------실행결과----------------------------
계약번호가 두건 이상입니다.
아이템코드가 두건 이상입니다.
끝.
프로세스가 종료되었습니다.

보통 EXCEPTION 처리를 위와 같이 중첩 블록을 사용하였다.
문제는 EXCEPTION이 발생하여도 해당 블록만 멈추고 다음으로 계속 진행을 한다.
자바와는 다르다.
그래서 각 블록마다 RAISE_APPLICATION_ERROR를 발생시키거나, 메인 블록만 남기는 방법을 선택해야 한다.

2017년 6월 1일 목요일

우클릭시 text 복사

우클릭시 '복사' DIV 나타나서 클릭시 우클릭 위의 TEXT를 복사하는 스크립트이다.

원했던 건 우클릭하면 바로 복사 하려고 하였으나,
왜 그런지 document.execCommand("copy"); 가 동작하지 않는다.
그래서 click 이벤트로 발생하기 위해 '복사'div 를 생성하였다.
	function copyToClipboard(value, showNotification, notificationText) {
var $temp = $("<input>");
$("body").append($temp);
$temp.val(value).select();
document.execCommand("copy");
$temp.remove();

if (typeof showNotification === 'undefined') {
showNotification = true;
}
if (typeof notificationText === 'undefined') {
notificationText = "Copied to clipboard";
}

var notificationTag = $("div.copy-notification");
if (showNotification && notificationTag.length == 0) {
notificationTag = $("<div/>", { "class": "copy-notification", text: notificationText });
$("body").append(notificationTag);

notificationTag.fadeIn("slow", function () {
setTimeout(function () {
notificationTag.fadeOut("slow", function () {
notificationTag.remove();
});
}, 10);
});
}
}

var copyData = "";
//$(".context-menu-one").on("contextmenu", function(event) {
$("table").on("contextmenu", function(event) {
event.preventDefault();
$("div.custom-menu").remove();
copyData = $.trim(event.target.textContent);

$("<div class='custom-menu'>복사</div>")
.appendTo("body")
.css({top: event.pageY + "px", left: event.pageX + "px"})
.on("click", function(event) {
event.preventDefault();
copyToClipboard(copyData);
copyData = "";
$("div.custom-menu").remove();
});

$("body").click(function (){
$("div.custom-menu").remove();
});
});


 
/* 우측 클릭 '복사' */
.custom-menu {
z-index:1000;
position: absolute;
background-color:#C0C0C0;
border: 1px solid black;
padding: 2px;
border-radius: 5px;
}

.copy-notification {
color: #ffffff;
background-color: rgba(0,0,0,0.8);
padding: 20px;
border-radius: 30px;
position: fixed;
top: 50%;
left: 50%;
width: 150px;
margin-top: -30px;
margin-left: -85px;
display: none;
text-align:center;
}

참조

2017년 5월 29일 월요일

datepicker 버튼 추가(당일, 1주일, 1개월, 3개월)



 

 

 

 

 

 

 

 

 

from 절과 to절이 있는 부분을 datepicker로는 만들수가 없다.

datepicker 달력 하단에 당일, 1주일, 1개월, 3개월 버튼을 넣어서

from절과 to절에 넣도록 했다.

 
function fnDatepickerFromToDateRangeSet(startId, endId, searchFnName){

$("#"+startId).datepicker( "option", "beforeShow",
function (input) {
fnDatepickerRangeSet(input,startId,endId,1,searchFnName);
}
);

$("#"+endId).datepicker( "option", "beforeShow",
function (input) {
fnDatepickerRangeSet(input,startId,endId,2,searchFnName);
}
);
//버튼 위치 input 안으로 넣도록 함.
$(".ui-datepicker-trigger").css({"vertical-align": "middle", "cursor": "pointer", "padding-left": "2px"}).addClass("box_date_btn");

}


//하단 당월,1주일,1개월,3개월 버튼 추가 - 함수.
//이 함수 자체는 달력이 보여질때 실행되고 하단 버튼 클릭시는 'click: function' 부분에서 실행됨을 주의!
function fnDatepickerRangeSet(input, startId, endId, startEndChk, searchFnName) {
setTimeout(function () {

var dateText = ["당일", "1주일", "1개월", "3개월"];
var dateRange = ["0d", "-7d", "-1m", "-3m"];
var buttonPane = $(input).datepicker("widget").find(".ui-datepicker-buttonpane");

for(i=0;dateText.length > i; i++ ){
$("<button>", { text: dateText[i], value:dateRange[i], executeFn:searchFnName,
//하단 버튼을 클릭시에는 여기 'click: function'이 실행된다.
click: function (eventData) {
$("#"+startId).datepicker('setDate', eventData.currentTarget.value);
$("#"+endId).datepicker('setDate', '0d');
jQuery(input).datepicker('hide');
var execFn = eventData.currentTarget.getAttribute('executeFn');
if(execFn){
eval(execFn);
}

}
}).appendTo(buttonPane).addClass("ui-datepicker-clear ui-state-default ui-priority-primary ui-corner-all");
}

//오늘 버튼 숨김
$(input).datepicker("widget").find(".ui-datepicker-current").hide();



}, 1)
}

 

2017년 2월 15일 수요일

오픈소스 IPS 테스트 후기

오픈소스 IPS 를 사용하기 위해 테스트 해봤다.

 

테스트 환경

1.xenserver의 가상화로 테스트

2. 1G 메모리, 20 하드 부여, 1core

중점으로 체크 한 사항은 IPS 기능, 라이센스,  웹GUI, 업데이트 날짜이다.

3. 간단한 소감.

security onion : v12,v14 두 버젼 모두 알수 없는 프로그램 충돌
smoothwell : 하드 인식 안됨.
clearOs : 로그가 부실함. 되는 지도 잘 모르겠음.로그가 안나옴.
untangle : 무려 한글지원(간단한 영어라 별 의미는 없음) 로그 검색기능이 좋음.
여러가지 기능을 모두 쓰려면 라이센스 구매해야 하지만, 내가 필요한 IPS 기능은 무료임.
DD-WRT : 가정용, 중소기업
제로쉘 : 가정용, 중소기업
Endian (EFC) : 쉘모드 접속시 명령어가 스위치처럼 되어 있음. login 으로 쉘 진입가능. IPS 로그가 안나옴. 되는 건지...firewall 로그는 나옴
pfsense : IDS or IPS 기능이 없음. (snort 추가하면 가능).
opnSense : pfsense랑 비슷한듯...
ipfire : 로그에 나라 표기됨. 로그 검색 기능이 없음
selks : IPS 없음. 데이터 안나옴. Out Of Memory 로 뻗음. 별로임.

최종적으로는 untangle과 ipfire.

처음에는 ipfire를 이용하려고 하였으나,  로그 검색기능 없다.

최종적으로 untangle 설치함.

2017년 2월 13일 월요일

포트스캔시 메일포트가 무조건 나오는 이유

포트 스캔을 실행하면 아래의 포트가 사용하는 걸로 나온다.

25smtp
110pop3
119nntp
143imap
465urd
563nntps
587submission
993imaps
995pop3s
타겟 서버에서는 실행되는 프로세스가 없다.

백도어가 있나 살펴보고, arp spoofing 인가도 살펴 봐도 아니였다.

조금 더 살펴보니 타겟 서버외에 포트스캔을 하는 모든 서버가 위의 포트가 오픈 되어있다고 나온다.

이상해서 다른 pc에서 같은 서버로 포트스캔을 해보니 정상적으로 나온다.

문제는 avast 백신이였다.

avast 백신 기능 중에는 메일 감시 기능이란게 있는데, 이게 원인이였다.

자체적으로 외부로 나가는 해당 포트를 감시하고 있다가 검사하고 내보내는 것 같다.

2017년 1월 10일 화요일

윈도우 수동 재부팅 확인 이벤트 로그

확인 서버
OS 이름 Microsoft® Windows Server® 2008 Standard
OS 이름 Microsoft Windows Server 2008 R2 Standard

 

수동으로 서버를 재시작시 아래와 같은 이벤트 로그가 발생한다.

 

Administrator 계정으로 수동 재시작

수동 재시작 테스트(기타 계획됨.) 부분은 내가 직접 써넣은 내용.
-----
이벤트 ID 1074
다음 이유 때문에 Explorer.EXE 프로세스에서 MYSERVER\Administrator사용자를 대신하여 MYSERVER 컴퓨터에서 다시 시작을(를) 시작했습니다: 기타(계획됨)
이유 코드: 0x85000000
종료 유형: 다시 시작
설명: 수동 재시작 테스트(기타 계획됨.)
-----
이벤트 ID 26
응용 프로그램 팝업: Windows : 다른 사용자가 이 컴퓨터에 로그온되어 있습니다. Windows를 다시 시작하면 다른 사용자의 데이터가 손실될 수 있습니다.

다시 시작하시겠습니까?
-----
이벤트 ID 1074
다음 이유 때문에 C:\Windows\system32\winlogon.exe (MYSERVER) 프로세스에서 MYSERVER\Administrator사용자를 대신하여 MYSERVER 컴퓨터에서 다시 시작을(를) 시작했습니다: 이 원인에 대한 제목 찾지 못함
이유 코드: 0x500ff
종료 유형: 다시 시작
설명:
---------------------

 

시스템이 재부팅을 했을 경우 아래와 같은 로그 발생. - 계정이 SYSTEM으로 표기.

다음 이유 때문에 C:\Windows\system32\svchost.exe (MYSERVER) 프로세스에서 NT AUTHORITY\SYSTEM 사용자를 대신하여 MYSERVER컴퓨터에서 다시 시작을(를) 시작했습니다: 이 원인에 대한 제목 찾지 못함
이유 코드: 0x80020002
종료 유형: 다시 시작
설명: