virtualbox에 ubuntu16.04설치 후 oracle11g(64bit)설치 완료

공부목적으로 컴퓨터에 오라클을 깔아야되는데, 경험상 윈도우에 오라클을 깔아버리면 나중에 지울때는 그냥 포맷해야하는 이유로 가상머신을 찾아봄
가상머신은 wmware 와 virtualbox, hyper-v 3가지가 있음
wmware는 써봤지만 무료(개인사용자무료도 있긴함,기능제한버전)가 아니라서 패스, hyper-v는 윈도우프로에서만 가능하므로 패스(https://answers.microsoft.com/ko-kr/windows/forum/windows_10-power/window-101-home-edition-hyper-v-%EC%84%A4%EC%B9%98/8ccf0232-b9ff-41a5-990c-0a9f1e3a93ee)
virtualbox는 사용안해봤지만 일단 무료에다가 사용이 간편해보여서 공부목적으로 선택함
virtualbox는 오라클에서 무료로 배포하는 제품임, 버전은 VirtualBox-5.2.20 윈도우용
ssd에다가 virtualbox 저장소를 설정하니깐 일단 굉장히 빠르다. 무조건 ssd에다가 저장소를 설정하자.

설치할 리눅스는 회사에서 사용하는 red hat enterprise linux(통칭 RHEL)를 설치하려고 생각했는데, 그냥 예전에 사용해봤던 우분투를 설치하기로 함
우분투는 desktop(gui)과 server(cli) 제품으로 나누어지는데, server로 사용할 목적으로 server 64bit(amd64)로 선택함, 버전은 16.04버전 굳이 신버전을 사용할 필요가 없어서 구버전중에 안정화된 버전으로 선택함.
우분투는 오라클을 공식적으로 지원해주지 않는 리눅스이므로 설정할게 많다.
우분투에 오라클설치해서 성공하면 redhat으로 시도해봐야겠음.

(중요)오라클 설치하려면 gui가 무조건 필요하다고 함, 그래서 gnome을 설치함(https://idchowto.com/?p=43024)
gnome 일반설치는 2.5G, 최소설치하면 800M이므로 최소설치만 함(옵션 –no-install-recommends)

우분투 설치 후에 계정환경설정,오라클 설치준비에 시간이 많이 들어감.
오라클은 설치하기 전에 환경설정을 잡아야하는게 좀 많다.
virtualbox 콘솔에서는 불편한 점(클립보드)이 많아서 ssh서버설정(http://blog.elmitash.com/78)하고 ssh접속해서 작업함
ssh접속할 때는 Xhell5을 사용함, 개인사용자는 무료인데, ui가 깔끔하고 putty보다는 확실히 좋다.

첫번째 오라클 설치는 실패함, 설치는 완료됬지만 sqlplus실행하면 Segmentation Fault (core dumped) 에러 발생하고 실행이 안됨
구글링을 열심히 했지만, 결국 버전문제로 보임(우분투는 64bit인데 오라클은 32bit를 설치했음)
설치한 오라클을 삭제(http://euless.tistory.com/75)하려고 $ORACLE_HOME/deinstall/deinstall을 했지만 삭제가 안됨
그냥 우분투부터 다시 설치하기로 함(오라클홈페이지에서 oracle11g 64bit버전을 다운받음)

두번째 우분투 설치는 일사천리로 설치후 환경설정까지 30분정도밖에 안걸림.
만반의 준비를 하고서 오라클을 실행했는데, 그냥 바로 설치되서 놀랐음.

설치해서 sqlplus를 실행하니깐 잘된다.

아래는 작업요약
=======================
1. virtualbox 설치
=======================
cpu 2, ram 4G, 디스크 30G 설정(동적할당, 그래도 SSD라서 빠르다)
virtualbox설치 후에 Oracle_VM_VirtualBox_Extension_Pack-5.2.20 확장팩설치

=======================
2. ubuntu16.04 설치
=======================
무조건 영어로만 설정함, 한글로 설정하면 한글도 깨지고 귀찮아진다.
우분투 설치 후 작업
virtualbox 게스트확장설치 (https://kldp.org/node/156898)
게스트 확장 이미지CD삽입으로 실패하면 aptget으로 직접설치한다.
sudo apt-get update
sudo apt-get disk-upgrade
sudo apt-get install virtualbox-guest-x11

history명령어에 날짜/표시 (http://faq.hostway.co.kr/?mid=Linux_ETC&page=8&document_srl=1424)
# vi /etc/profile
HISTTIMEFORMAT=”%F %T — ”
export HISTTIMEFORMAT
# source /etc/profile

ssh 접속설정 (http://blog.elmitash.com/78)

=======================
3. 오라클 설치
=======================
공유폴더설정 후 오라클압축파일 해제 작업
mkdir -p /download/oracle11g
cp /media/sf_oracle11g/linux.x64_11gR2_database*.zip /download/oracle11g
upzip linux*.zip

oracle 계정생성 (다른곳은 oinstall을 oracle계정의 기본그룹으로 두지만, 나는 dba를 기본그룹으로 지정함)
sudo groupadd oinstall
sudo groupadd dba
sudo mkdir -p /home/oracle
sudo useradd -g dba -G oinstall -d /home/oracle -s /bin/bash oracle
sudo passwd oracle
sudo chown -R oracle:dba /home/oracle

오라클 설치하려면 gnome을 설치해야한다. (https://idchowto.com/?p=43024)
# apt-get update
# apt-get install –no-install-recommends ubuntu-gnome-desktop (최소설치 800M)
# apt-get install ubuntu-gnome-desktop (일반설치 2.5G)

설치하기전에 설정해야될거 (http://dimpl.tistory.com/8)

# vi oraerr.sh
sed -i ‘s/^\(\s*\$(MK_EMAGENT_NMECTL)\)\s*$/\1 -lnnz11/g’ $ORACLE_HOME/sysman/lib/ins_emagent.mk
sed -i ‘s/^\(TNSLSNR_LINKLINE.*\$(TNSLSNR_OFILES)\) \(\$(LINKTTLIBS)\)/\1 -Wl,–no-as-needed \2/g’ $ORACLE_HOME/network/lib/env_network.mk
sed -i ‘s/^\(ORACLE_LINKLINE.*\$(ORACLE_LINKER)\) \(\$(PL_FLAGS)\)/\1 -Wl,–no-as-needed \2/g’ $ORACLE_HOME/rdbms/lib/env_rdbms.mk
sed -i ‘s/^\(\$LD \$LD_RUNTIME\) \(\$LD_OPT\)/\1 -Wl,–no-as-needed \2/g’ $ORACLE_HOME/bin/genorasdksh
sed -i ‘s/^\(\s*\)\(\$(OCRLIBS_DEFAULT)\)/\1 -Wl,–no-as-needed \2/g’ $ORACLE_HOME/srvm/lib/ins_srvm.mk

# setting up oracle environment variables
export ORACLE_BASE=/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.2/dbhome
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
export PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_SID=testdb

오라클 설치하기전에 무조건 따라하기
https://makina-corpus.com/blog/metier/archives/howto-install-oracle-11g-ubuntu-linux-1204-precise-pangolin-64bits

오라클 설치하는방법2(gui설정)
https://ttend.tistory.com/158

우분투에 오라클11g 설치하기
https://sarc.io/index.php/oracledatabase/529-ubuntu-oracle-11gr2

리눅스 파일지우는 명령어

서버에 디렉토리 안에 파일이 너무 많으면  시스템이 느려지므로 파일을 지워야할 경우가 생긴다. 그래서 파일을 지우려고 rm *.* 명령을 날리면 파일이 너무많아서 지울 수 없다는 에러가 나오는 경우가 있다.

그런 경우 파일을 일정부분씩 지우면 되는데, 나는 아래와 같은 방법을 사용했다.

ll | grep 파일부분이름 | grep _201601 | awk ‘{print $9}’ | xargs rm

find ./ -type f -name BM*_2015*.xml | grep /DbRecv/ | awk ‘{print $1}’ | xargs rm

참고로 디렉토리별 용량보는 명령어

du -sh *

 

window.open 변수넘길때, post방식으로 하기

 

1) GET방식

/* get */
window.open(URL + "&" + encodeURI($.param(params, true)), "popup_id", 'height=' + 650  + ',width=' + 1024 + 'fullscreen=yes');

 

2) POST방식

/* post */
var form = document.createElement("form");
form.setAttribute("method", "post");
form.setAttribute("action", url);
form.setAttribute("target", "popup_id");

var input = document.createElement('input');
input.type = 'hidden';
input.name = "변수1";
input.value = "변수값1";
form.appendChild(input);

input = document.createElement('input');
input.type = 'hidden';
input.name = "변수2";
input.value = "변수값2";
form.appendChild(input);

input = document.createElement('input');
input.type = 'hidden';
input.name = "변수3";
input.value = "변수값3";
form.appendChild(input);

document.body.appendChild(form);

if( /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor) ){
	window.open(url, "popup_id");
}else{
	window.open(url, "popup_id", "resizable=yes,toolbar=yes,menubar=yes,location=yes");
}

form.submit();

document.body.removeChild(form);

 

실수연산 문제

자바스크립트로 실수연산할 때, 괴상망측한 값이 나오는 경우를 확인함

707.4+226.2 = 933.5999999999999

보통의 경우는 값 * 100 / 100.0 을 하면 해결되지만, 확실한 건 아니므로

값 * E / E 를 사용하도록 하자.

var E = Number('1e' + 1);
var sum =  (parseFloat(707.4) + parseFloat(226.2))*E/E

**참고블로그
영이블로그 – 실수연산문제 (http://sunychoi.github.io/javascript/2015/04/05/javascript-float-type-error.html)

 

 

mysql recusive query

[ppas query]

WITH RECURSIVE help_page(help_id, help_name, help_page, help_tag, help_main_key, help_sub_key, help_location, parent_id, show_type, depth_level, menu_seq) AS (
SELECT
hm.help_id, hm.help_name, hm.help_page, hm.help_tag, hm.help_main_key, hm.help_sub_key, concat(hm.help_name) as help_location, hm.parent_id, hm.show_type, 0 as depth_level, lpad(concat(hm.menu_seq),3,'0') as menu_seq
FROM tb_m00s22_help_meta hm
WHERE hm.parent_id is null or hm.parent_id = '' 
UNION ALL
SELECT
hm.help_id, hm.help_name, hm.help_page, hm.help_tag, hm.help_main_key, hm.help_sub_key, hp.help_location || ' > ' || concat(hm.help_name) as help_location, hm.parent_id, hm.show_type, depth_level + 1 as depth_level, hp.menu_seq || '-' || lpad(concat(hm.menu_seq),3,'0') as menu_seq
FROM tb_m00s22_help_meta hm
INNER JOIN help_page AS hp ON hm.parent_id = hp.help_id
)
SELECT *
FROM help_page
ORDER BY menu_seq

 

[mysql query]

select original_value as help_id, help_location, depth_level, menu_seq
from (
	select @ov as original_value, help_id, help_location, depth_level, menu_seq
	from (
		select t.help_id as help_id, @pv:=t.parent_id as parent_id, t.help_name
			   , @pv2:=(case when @pv2 = '' then concat(t.help_name,@pv2) else concat(t.help_name,' > ',@pv2) end) as help_location
			   , (@rownum := @rownum+1) as depth_level
			   , @menu_seq:=(case when @menu_seq = '' then concat(t.menu_seq,@menu_seq) else concat(t.menu_seq,'-',@menu_seq) end) as menu_seq
		from (select help_id, parent_id, help_name, lpad(concat(menu_seq),3,'0') as menu_seq from tb_m00s22_help_meta order by help_id desc LIMIT 100000) t
			 join (select @ov:='H300020006', @pv:='H300020006', @pv2:='', @rownum:=-1, @menu_seq:='' ) tmp
		where t.help_id = @pv
	) tt
	order by help_id asc
	limit 1
) ttt

** mysql은 subquery에서 orderby를 했는데, 외부로 나오면 다시 orderby가 원복된다.
limit를 사용하면 정렬이 유지된다.
https://mariadb.com/kb/en/library/why-is-order-by-in-a-from-subquery-ignored/

[select query]

select
	help_id, help_name, help_page, help_tag, help_main_key, help_sub_key, FN_SPLIT(help_data,'|',1) as help_location, parent_id, show_type, FN_SPLIT(help_data,'|',2) as depth_level, FN_SPLIT(help_data,'|',3) as menu_seq
from (
select help_id, help_name, help_page, help_tag, help_main_key, help_sub_key, parent_id, show_type,FN_GET_HELP_DATA(help_id) as help_data from tb_m00s22_help_meta
) t

[mysql function]

DELIMITER $$
CREATE DEFINER=`poswork`@`%` FUNCTION `FN_GET_HELP_DATA`(pv_help_id varchar(50)) RETURNS varchar(1000) CHARSET utf8
    DETERMINISTIC
BEGIN
        DECLA RE v_pv_help_id      varchar(50);
	DECLA RE v_ori_help_id     varchar(500);
        DECLA RE v_help_location   varchar(500);
        DECLA RE v_depth_level     varchar(500);
        DECLA RE v_menu_seq        varchar(500);
        DECLA RE v_rtn_value       varchar(1000);
	DECLA RE EXIT HANDLER FOR NOT FOUND RETURN null;
        
        SET v_pv_help_id = pv_help_id;
		
        IF v_pv_help_id IS NULL OR v_pv_help_id = '' THEN
                RETURN null;
        END IF;

		select original_value as help_id, help_location, depth_level, menu_seq
        INTO v_ori_help_id,v_help_location,v_depth_level,v_menu_seq
		from (
			select @ov as original_value, help_id, help_location, depth_level, menu_seq
			from (
				select t.help_id as help_id, @pv:=t.parent_id as parent_id, t.help_name
					   , @pv2:=(case when @pv2 = '' then concat(t.help_name,@pv2) else concat(t.help_name,' > ',@pv2) end) as help_location
					   , (@rownum := @rownum+1) as depth_level
					   , @menu_seq:=(case when @menu_seq = '' then concat(t.menu_seq,@menu_seq) else concat(t.menu_seq,'-',@menu_seq) end) as menu_seq
				from (select help_id, parent_id, help_name, lpad(concat(menu_seq),3,'0') as menu_seq from tb_m00s22_help_meta order by help_id desc LIMIT 100000) t
					 join (select @ov:=v_pv_help_id, @pv:=v_pv_help_id, @pv2:='', @rownum:=-1, @menu_seq:='') tmp
				where t.help_id = @pv
			) tt
			order by help_id asc
			limit 1
		) ttt;
		
		SET v_rtn_value = concat(v_help_location,'|',v_depth_level,'|',v_menu_seq);

	RETURN v_rtn_value;
    
END$$
DELIMITER ;

 

[split function]

DELIMITER $$
CREATE DEFINER=`poswork`@`%` FUNCTION `FN_SPLIT`(srcvalue varchar(500), split_char varchar(50), split_index int) RETURNS varchar(500) CHARSET utf8
    DETERMINISTIC
return if(srcvalue is null or srcvalue = '',null,substring_index(substring_index(srcvalue,split_char,split_index),split_char,-1))$$
DELIMITER ;

 

 

ajax post 실행시 content length가 2Mb 이상일 때, 서비스실패(파라미터가 null)

문제점 : Ajax로 post요청을 was로 날렸는데 서비스실패가 일어남
Was로그에서 확인해보니, controller에서 서비스는 인식하는데, 파라미터값을 null로 인식함

해결방법 : Ajax로 실행할 때, 컨텐츠데이터가 2Mb가 넘어가면 서비스가 실패함을 확인

https://docs.jboss.org/jbossweb/2.1.x/config/http.html
JBOSS에서 webservice post요청일 때, 용량을 제한하는 설정이 있으며, 디폴트로 2MB(2097152)로 되어 있음

웹서버에서 maxPostSize설정을 추가함
<connector name=”ajp” protocol=”AJP/1.3″ scheme=”http” socket-binding=”ajp” max-post-size=”5000000″/>

javascript underscore library _.defer() sample

function gogogo(arg,scope) {
document.write(scope + arg + ‘<br />’);
}

var ori = “AAA”;
var dest = “BBB”;
gogogo(“first”,ori);

setTimeout(function() {
gogogo(“setTimeout”,ori);
},1);

_.defer(function() {
gogogo(“defer”,ori);
setTimeout(function() {
gogogo(“setTimeout2”,ori);
},1);
ori = dest;
});

gogogo(“last”,ori);

결과 :

AAAfirst
AAAlast
AAAsetTimeout
AAAdefer
BBBsetTimeout2

 

테스트:
https://jsfiddle.net/7t2bV/59/

Dexie.js(indexedDB) IE에서 속도느림현상

크롬(version57)과 익스11에서 dexie 성능테스트

익스11에서는 너무 느리다.

Dexie.js 정보
http://dexie.org/docs/Dexie.js.html

jsfiddle.net에서 소스 시뮬레이션
https://jsfiddle.net/xf2zrL4p/77/

소스실행시에 익스에서는 Promise is undefine에러가 발생하므로, bluebird.js 를 넣는다.

<script src=”https://cdnjs.cloudflare.com/ajax/libs/bluebird/3.3.5/bluebird.min.js”></script>

 

참고 웹사이트

https://developers.google.com/web/fundamentals/instant-and-offline/web-storage/offline-for-pwa?hl=no

http://programmingsummaries.tistory.com/325