엑셀 데이터를 컬럼에 매칭되게 하나씩 넣어 저장한다.


big_data.xls

이재희      178    80    NO0001

윤김         155    60    NO0002

이재희      175    75    NO0003




다른이름으로 저장 CSV (쉼표로 분리)


big_data.csv

이재희, 178, 80, NO0001

윤김, 155, 60, NO0002

성새힘, 175, 75, NO0003




메모장에 아래와 같이 작성 후, 확장자를 .ctl로 저장합니다.


load data

infile 'E:\01. PROJECT\02. G6\06. 개발\13. 테스트\COKR_APPLY.csv'

append

into table table_apply

fields terminated by ','

(seq, model_category, event_seq, user_id)


위작성 파일 이름 : apply.ctl



E:\> sqlldr userid=scott/tiger@localhost control='C:\ctl_folder\test_apply.ctl'



userid= 계정명/계정비밀번호 @ 접속할 도메인명

ex) admin/admin01@TEST.DOMAIN.NET


주의: 

sql*plus 에서 명령어 치면 안됨. os명령창으로 나와서 써야됨





유닉스 환경이라면


SQL> !sqlldr userid ... ...... 하면 됨






참고 URL : http://yadw.tistory.com/123

var fromHistoryBack = false;
var myHistory;
try {
    myHistory = JSON.parse(sessionStorage.getItem('myHistory'));
} catch (e) {};
if (myHistory) {
    if (myHistory[myHistory.length-1].href == window.location.href
            && myHistory[myHistory.length-1].referrer == document.referrer) {
        alert('새로고침 되었습니다.');
    } else {
        if (myHistory.length > 1) {
            if (myHistory[myHistory.length-2].href == window.location.href
                    && myHistory[myHistory.length-2].referrer == document.referrer) {
                fromHistoryBack = true;
                myHistory.pop();
                sessionStorage.setItem('myHistory', JSON.stringify(myHistory));
            }
        }
        if (myHistory.length > 10 && !fromHistoryBack) {
            myHistory.shift();
            sessionStorage.setItem('myHistory', JSON.stringify(myHistory));
        }
        if (!fromHistoryBack) {
            myHistory.push({
                href: window.location.href,
                referrer: document.referrer
            });
            sessionStorage.setItem('myHistory', JSON.stringify(myHistory));
        }
    }
} else {
    var newHistory = [{
        href: window.location.href,
        referrer: document.referrer
    }];
    sessionStorage.setItem('myHistory', JSON.stringify(newHistory));
}
console.debug('fromHistoryBack:', fromHistoryBack);


history를 쿠키나 브라우저 스토리지에 별도로 축적하고 이를 비교해가며 뒤로가기 기능으로 랜딩된 페이지인지를 판단하는 소스. 단, 반드시 뒤로가기만 걸러내는것은 아니고 이전 페이지의 주소를 직접 호출하는 방식에도 반응하는 한계가 있다.

XFF 는 HTTP Header 중 하나로 HTTP Server 에 요청한 clinet 의 IP 를 식별하기 위한 사실상의 표준이다.

 

웹 서버나 WAS 앞에 L4 같은 Load balancers 나 Proxy server(HAProxy), caching server(Varnish), HTTP 서버용 WAS Connector(웹로직 커넥터 - mod_wl, 톰캣 커넥터 - mod_jk 등) 등이 있을 경우

이런 제품들은 웹서버/WAS 에 HTTP 나 전용 프로토콜(AJP)로 요청을 보낸후에 받은 결과를 가공하여 클라이언트에 재전송하게 된다.

이로 인해 처리한 웹 서버나 WAS에서 request.getRemoteAddr(); 등으로 클라이언트 IP를 얻을 경우 L4 나 Proxy 의 IP 를 얻게 되는데 이는 원하는 결과가 아니다.

 

X-Forwarded-For는 이 문제를 해결하기 위해 사용하는 http header 로 squid caching server 에서 처음 사용되었다.

다음과 같이 콤마를 구분자로 client 와 proxy IP 가 들어가게 되므로 첫번째 IP 를 가져오면 클라이언트를 식별할 수 있다.

X-Forwarded-For: client, proxy1, proxy2

 

WAS 에서 사용

여기까지 읽고 웹 어플리케이션을 개발할 경우 client ip 를 식별할 필요가 있다면 먼저 저 헤더가 있는지 확인한 후에 없으면 getRemoteAddr() 로 IP 를 얻으면 되겠지라고 생각할 수도 있겠지만 이게 끝은 아니다.

XFF 는 사실상의 표준이지 정식 RFC 에 포함된게 아니므로 대개는 착실하게 저 헤더를 사용하지만 엉뚱한 헤더를 사용하는 제품들이 있다.

그중에 하나인 WebLogic Connector(mod_wl) 는 저 헤더를 사용하지 않고 WL-Proxy-Client-IP 나 Proxy-Client-IP  같은 전혀 엉뚱한 헤더를 사용하므로 만약 만드는 웹 어플리케이션이 

WebServer, WAS, L4, proxy 종류에 상관없이 client IP 를 잘 가져오기를 바란다면 다음과 같은 순서로 IP 를 얻어내야 한다.

 

 String ip = request.getHeader("X-Forwarded-For");
 if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
     ip = request.getHeader("Proxy-Client-IP"); 
 
 if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
     ip = request.getHeader("WL-Proxy-Client-IP"); 
 
 if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
     ip = request.getHeader("HTTP_CLIENT_IP"); 
 
 if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
     ip = request.getHeader("HTTP_X_FORWARDED_FOR"); 
 
 if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
     ip = request.getRemoteAddr(); 
 }

이외에도 X-Real-IP 나 X-RealIP 라는 헤더를 사용하는 제품도 있다고 한다.

 

Apache httpd Web Server 에서 사용

아파치 웹 서버에서는 LogFormat 지시자나 접근 권한 체크시 Remote Address 를  사용하는데 앞에 Reverse Proxy가 있다면 의도한 대로 동작하지 않으므로 XFF 헤더를 사용하도록 수정해야 한다.

 

로그포맷

기본 로그포맷은 %h 로 리모트 Address 를 사용하므로 다음과 같이 %{X-Forwarded-For}i 를 사용하도록 수정한다.

## 수정전
## LogFormat "%h %l %u %t \"%r\" %>s %b" common
  
## 수정후
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b" common

접근 제어(ACL)

ACL이 필요할 경우 다음과 같이 전역 변수를 설정하고 ACL 이 필요한 곳에서 이 변수를 사용하는게 편리하다.

SetEnvIf X-Forwarded-For ^192\.168\.1\. admin_1
SetEnvIf X-Forwarded-For ^192\.168\.2\. admin_2
  
<Files wp-config.php>
    order Deny,Allow
    deny from all
</Files>
 
## 워드프레스 로그인은 내부 IP 에서만 허용
<Files ~ "^wp-login.php">
    Order Deny,Allow
    Deny from all
## 내부 IP 만 관리자 로그인 허용
    Allow From env=admin_1
    Allow From env=admin_2
</Files>

 

nginx

nginx 는 --with-http_realip_module 옵션을 주고 컴파일해야 실제 ip 를 얻어올 수 있다. 배포판에 포함된 nginx 는 기본 컴파일 옵션일것이라고 생각되며 다음 명령어로 지원 여부를 확인할 수 있다.

nginx -V

 

nginx 가 지원한다면 다음 설정을 nginx.conf 에 넣어주면 실제 ip 가 로그 파일에 기록된다.

http {
set_real_ip_from   127.0.0.1; # proxy/L4 서버 IP
real_ip_header      X-Forwarded-For; #proxy/L4 가 실제 IP 를 설정하는 HTTP Header


'Server Enterprise > Java' 카테고리의 다른 글

[Split] | 자르기  (0) 2018.04.26
[Java] Json 파싱  (0) 2018.03.05
[알고리즘] 문제 출제 및 유용한 사이트  (0) 2016.08.08
[Java] Design Pattern  (0) 2016.07.07
[Book] 알고리즘 관련 서적 for java  (0) 2016.07.05

Toad for Oracle , SQL Developer for Oracle



해당 DBMS 모두 Procedure/Method 을 호출하기 위해서는 

IN parameter와 OUT parameter, INOUT paramter가 변수와 Bind 되어야 excute (실행)이 된다.



execute mgr.memberproc_delete('34622',:resultInt,:resultCode);


허나, 토드에서는 


call mgr.memberproc_delete('34622',:resultInt,:resultCode);


call문도 실행이 된다. 

하지만 SQL Developer에서는 call이 실행되지 않고 excute 로만 실행이된다.




데이터 분석을 가르치는 미국 어떤 교수님이 써놓은 글을 참고해서 써 놓은 글이다.




아래 링크에서 중요하다고 생각하는 부분을 번역 했다.

http://www.dataschool.io/python-or-r-for-data-science/




Python을 할 것인가 R을 할 것인가


프로그래밍을 해본 경험이 있는가?

프로그래밍을 해본 경험이 있다면 파이썬을 하는게 좋은 것 같다. 왜냐하면 파이썬 문법은 다른 프로그래밍 문법하고 비슷하므로 적응하기가 더 좋다. 프로그래밍을 해본 경험이 없으면 둘 다 비슷한 것 같다.


연구를 할 용도인지 실무를 할 용도인지?

기준이 좀 애매하긴 하다. 연구인지 실무인지를 떠나서 통계적인 분석을 하려면 R이 좋고 뭘 만들어 내야 하는 경우라면 Python이 좋다.



R이 매력적인가 Python이 매력적인가?

R의 사이트 디자인은 별로다. 아니 뭐가 없다. 반면에 Python은 R에 비해서 사이트도 예쁘게 잘 해놓았고 문서도 깔끔하게 정리 해놓았다. 접근성은 Python이 더 좋은 것 같다.



데이터 클리닝(data cleaning)할 때 좋은 언어는?

데이터 클리닝은 raw data(가공 하지 않은 널려 있는 데이터들)를 정리해서 사용할 수 있을 정도로 가공하는 작업을 말한다. 이거 할 때는 Python이 좋다. 왜냐하면 Python은 데이터 타입이 여러가지 이고(R은 숫자랑 문자 정도만 있는 듯) 정규식(문자에서 패턴 찾아내는 것)을 지운 하기 때문이다.



데이터 탐색(data exploration) 할 때 좋은 언어는?

데이터 탐색이란 데이터를 읽어와서 시각화 하는 작업이라고 볼 수 있다.

이 작업을 하는데에는 파이썬이 좀 더 좋은 것 같다. python의 pandas라는 패키지가 있는데 이 패키지가 참 좋기 때문이다. R에도 dplyr이라는 패키지가 있는데 panada에 비해서는 할 수 있는게 적다. 대신 dplyr은 배우기 쉬운 장점이 있지만 그만큼 단순해서 불편한 것도 있다.


빅데이터 환경의 특징

〈표 1〉 빅데이터 환경의 특징
구분기존빅데이터 환경

데이터

- 정형화된 수치자료 중심

- 비정형의 다양한 데이터
- 문자 데이터(SMS, 검색어)
- 영상 데이터(CCTV, 동영상)
- 위치 데이터

하드웨어

- 고가의 저장장치
- 데이터베이스
- 데이터웨어하우스(Data-warehouse)

- 클라우드 컴퓨팅 등 비용효율적인 장비 활용 가능

소프트웨어/분석 방법

- 관계형 데이터베이스(RDBMS)
- 통계패키지(SAS, SPSS)
- 데이터 마이닝(data mining)
- machine learning, knowledgediscovery

- 오픈소스 형태의 무료 소프트웨어
- Hadoop, NoSQL
- 오픈 소스 통계솔루션(R)
- 텍스트 마이닝(text mining)
- 온라인 버즈 분석(opinion mining)
- 감성 분석(sentiment analysis)



자연어 처리는


인간이 발화하는 언어 현상을 기계적으로 분석하여, 컴퓨터가 이해할수 있는 형태로 만드는 자연 언어 이해 

혹은 그러한 형태를 다시 인간이 이해할 수 있는 언어로 표현하는 제반 기술을 의미



컴퓨터가 이해할 수 있는 형태로 표현하고자 한다는 점에서 인공지능과 대단히 밀접한 관련이 있으며,

전산언어학과 거의 구별없이 비슷한 의미로 사용된다.

정의


기존 DBMS Tool(데이터베이스 관리도구) 의 능력을 넘어서는 

수십 TB 의 정형 또는 심지어 데이터베이스 형태가아닌 비정형 데이터의 집합 조차 포함한 데이터로부터 가치를 추출하고 결과를 분석하는 기술



2012년 가트너는 빅데이터 기존의 정의를 다음과 같이 개정하였다: 

“빅 데이터는 큰 용량(volume), 빠른 속도(velocity), 그리고(또는) 높은 다양성(veriety)을 갖는 정보 자산으로서 이를 통해 의사 결정 및 통찰 발견, 프로세스 최적화를 향상시키기 위해서는 새로운 형태의 처리 방식이 필요하다.”



분석기법


빅 데이터의 분석, 활용을 위한 빅 데이터 처리 기법은 크게 분석 기술, 표현 기술로 나뉜다.


분석 기술


  • 텍스트 마이닝: 비/반정형 텍스트 데이터에서 자연 언어 처리 기술에 기반하여 유용한 정보를 추출, 가공
  • 오피니언 마이닝: 소셜미디어 등의 정형/비정형 텍스트의 긍정, 부정, 중립의 선호도를 판별
  • 소셜 네트워크 분석: 소셜 네트워크의 연결 구조 및 강도 등을 바탕으로 사용자의 명성 및 영향력을 측정
  • 군집 분석: 비슷한 특성을 가진 개체를 합쳐가면서 최종적으로 유사 특성의 군집을 발굴


대규모의 정형/비정형 데이터를 처리하는 데 있어 가장 기본적인 분석 인프라로 하둡이 있으며, 데이터를 유연하고 더욱 빠르게 처리하기 위해 NoSQL 기술이 활용되기도 한다.


CharSet이 EUC-KR인 서버가 있습니다. 

클라이언트에서는 jQuery를 이용하여 Form을 다루려고 합니다.


myForm이라는 데이터를 전송하는 폼이 있습니다.

그 폼의 input 벨류들을 모두 jQuery의 .serialize()를 통해서 

직렬화하고(문자열로 만들고) 보내면 좋을것 같습니다.


그래서 아래처럼 함수를 작성했습니다.


var myForm = jQuery('#myForm');

jQuery.ajax({
type : myForm.attr('method'),
url : '/reimaginer/FormManager.ym',
data : myForm.serialize(),
success : function (res) {
if(res === 'SUCCESS') {
alert('등록되었습니다.');
} else {
alert('등록이 실패하였습니다.')
}
}
});



영어로 테스트 해봤는데 잘 됩니다. 오 좋다~ 하고 있는데, 한국어로도 테스트해봅니다.
그런데 깨집니다...


문제의 원인에 대해서 고민해보니, jQuery는 기본적으로 charSet이 UTF-8이라는게 기억납니다.
그럼이제 UTF-8로 인코딩된 언어를 어떻게 안 깨뜨리고 잘 가져올지 고민해봅니다.

예전에 모바일 프로젝트할때, 모바일 클라이언트는 charSet이 UTF-8이었습니다. 
그래서 UTF-8로 두번 인코딩하고, 서버에서 한번 자동으로 디코딩 된 후,
다시 한번, decodeUri를 통해서 한글을 가져온 것이 생각이 납니다.

인터넷을 뒤적거리다보니 비슷한 방법이 나옵니다.
.serialize() 하면 UTF-8로 한번 인코딩된 문자열이 나옵니다.
만약 폼에서 전송하려는 데이터가 '사과' 라는 문자열이라면,

'%EC%82%AC%EA%B3%BC' 

이런 놈이 반환되죠. 여기서 우리는 한번 더 인코딩합니다.
% 문자를 인코딩된 문자인 '%25'로 한번 더 바꿔주는 겁니다.
(= % 를 %25로 바꿔주기만 해도 한글이 깨지지 않고 넘어갑니다. )

"%25EC%2582%25AC%25EA%25B3%25BC" 이렇게요.

코드는 다음과 같습니다.


var myForm = jQuery('#myForm');

jQuery.ajax({
type : myForm.attr('method'),
url : '/reimaginer/FormManager.ym',
data : myForm.serialize().replace(/%/g, '%25'),
//data : encodeURI(myForm.serialize()), 위, 아래 두가지 방법 모두 같은 결과를 반환한다.
success : function (res) {
if(res === 'SUCCESS') {
alert('등록되었습니다.');
} else {
alert('등록이 실패하였습니다.')
}
}
})
;


그럼 서버 측에서는 어떻게 받아야 할까요.


String decodedData = URLDecoder.decode(encodedData, "UTF-8");


한번은 자동으로 decode되니까 '%EC%82%AC%EA%B3%BC' 이 문자열을 받았겠죠.

한번만 더 디코드 해줍니다.

'사과'

이제 이 한글을 잘 사용하면 됩니다!


상황:
CallableStatement에서 사용하는 프로시져가 없는 경우, 오타 등으로 못찾는 경우

해결:
1. 'PROC_INPUT_DATA' Procedure를 만들어준다.
2. 컴파일이 안된경우 생긴다.



Tip 

Toad for Oracle : F9  프로시저 컴파일 단축키

Toad for Oracle : F5  프로시저 저장


+ Recent posts