1.Tmaxsoft 홈페이지에서 파일과 데모라이선스를 신청한다.

  다운로드 경로 : https://technet.tmaxsoft.com/ko/front/download/findDownloadList.do?cmProductCode=0301



2. 사전 패키지 설치 확인 및 설치

* 아래의 해당 버전 이상의 패키지가 설치되어 있어야 한다.

[Packages]
gcc-3.4.6.-11
gcc-c++-3.4.6.-11
libgcc-3.4.6.-11
libstdc++-3.4.6-11
libstdc++-devel-3.4.6-11
compat-libstdc++-33-3.2.3-47.3
libaio-0.3.105-2
libaio-devel-0.3.105-2


3. 환경설정 관련 사항

- 설정파일  /etc/sysctl.conf  제일 하단에 다음 값을 추가한다.

kernel.shmmni = 4096
kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.sem = 10000 32000 10000 10000

fs.file-max = 6815744

net.ipv4.ip_local_port_range = 1024 65500

shell Limit 파라미터 설정을 위해 /etc/security/limits.conf 파일 제일 하단에 다음 값을 추가한다.

tibero           soft    nproc           2047
tibero           hard    nproc           16384
tibero           soft    nofile          1024
tibero           hard    nofile          65536

 /etc/sysyemd/logind.conf 파일의 RemoveIPC=no 의 주석을 풀어 준다.


4. Tibero를 설치한다.

Tmaxsoft에 다운받은 파일과 라이센스 파일을 서버로 옮긴다.

- 설치하고자 하는 위치에 다운로드 파일 압축을 해제한다.

tar -zxvf tibero6-bin-FS07_CS_1902-linux64-166256-opt.tar.gz


- 환경변수 설정

export TB_HOME=/home/tibero/Tibero/tibero6
export TB_SID=tibero
export LD_LIBRARY_PATH=$TB_HOME/lib:$TB_HOME/client/lib
export PATH=$PATH:$TB_HOME/bin:$TB_HOME/client/bin


5. $TB_HOME/config/gen_tip.sh 파일 실행


6. Tibero 서버를 NOMOUNT 모드로 시작

# tbboot nomount

Change core dump dir to /home/tibero6/tibero6/bin/prof.
Listener port = 8629

Tibero6

TmaxData Corporation Copyright (c) 2008-. All rights reserved.
Tibero instance started up (NOMOUNT mode).


7. tbsql 을 통해 데이터베이스 접속

최초 sys 계정의 비밀번호는 tibero로 설정되어 있다.

# tbsql sys/tibero

tbSQL 6

TmaxData Corporation Copyright (c) 2008-. All rights reserved.

Connected to Tibero.

SQL>


8. 데이터베이스 생성.

원할 시 다른 명칭으로 생성해도 된다. 다음 예제는 tibero로 생성했다.

SQL> create database "tibero" 
  user sys identified by tibero 
  maxinstances 8 
  maxdatafiles 100 
  character set MSWIN949 
  national character set UTF16 
  logfile 
    group 1 'log001.log' size 100M, 
    group 2 'log002.log' size 100M, 
    group 3 'log003.log' size 100M 
  maxloggroups 255 
  maxlogmembers 8 
  noarchivelog 
    datafile 'system001.dtf' size 100M autoextend on next 100M maxsize unlimited 
    default temporary tablespace TEMP 
      tempfile 'temp001.dtf' size 100M autoextend on next 100M maxsize unlimited 
      extent management local autoallocate 
    undo tablespace UNDO 
      datafile 'undo001.dtf' size 100M autoextend on next 100M maxsize unlimited 
      extent management local autoallocate;
Database created.

SQL> quit
Disconnected.


9. 데이터베이스 생성 후 tbboot 명령어로 NORMAL 모드로 재기동한다.

# tbboot
Change core dump dir to /home/tibero6/tibero6/bin/prof.
Listener port = 25010

Tibero 6  

TmaxData Corporation Copyright (c) 2008-. All rights reserved.
Tibero instance started up (NORMAL mode).


10. $TB_HOME/scripts 디렉토리의 system.sh 를 실행한다. 

해당 파일은 현재 디렉토리에 있는 SQL파일을 수행하여 role, system user, view, package 등을 생성한다. 실행 시 sys 및 syscat 계정에 대한 비밀번호를 물어 보는데 sys는 tibero, syscat는 syscat로 기본 설정되어 있다.

# ./system.sh 
Enter SYS password:

Enter SYSCAT password:

Creating the role DBA...
create default system users & roles?(Y/N):

Creating system users & roles...
Creating virtual tables(1)...
Creating virtual tables(2)...
Granting public access to _VT_DUAL...
Creating the system generated sequences...
Creating internal dynamic performance views...
Creating outline table...
Creating system package specifications:
    Running /home/tibero/Tibero/tibero6/scripts/pkg/pkg_standard.sql...
    Running /home/tibero/Tibero/tibero6/scripts/pkg/pkg_dbms_output.sql...
    Running /home/tibero/Tibero/tibero6/scripts/pkg/pkg_dbms_lob.sql...
    Running /home/tibero/Tibero/tibero6/scripts/pkg/pkg_dbms_utility.sql...
    ......중간 생략......

Creating spatial meta tables and views ...
Creating internal system jobs...
Creating internal system notice queue ...
Done.
For details, check /home/tibero6/tibero6/instance/tibero/log/system_init.log.


11. Tibero 정상 동작 여부 확인

# ps -ef | grep tbsvr
tibero   19981     1  0 21:12 pts/2    00:00:00 tbsvr         ... 
tibero   19983 19981  0 21:12 pts/2    00:00:00 tbsvr_TBMP    ...
tibero   19984 19981  0 21:12 pts/2    00:00:00 tbsvr_WP000   ...
tibero   19985 19981  3 21:12 pts/2    00:00:00 tbsvr_WP001   ...
tibero   19986 19981  1 21:12 pts/2    00:00:12 tbsvr_WP002   ...
tibero   19987 19981  2 21:12 pts/2    00:00:12 tbsvr_PEP000   ...
tibero   19988 19981  0 21:12 pts/2    00:00:00 tbsvr_AGNT    ...
tibero   19989 19981  1 21:12 pts/2    00:00:00 tbsvr_DBWR    ...
tibero   19999 19981  0 21:12 pts/2    00:00:00 tbsvr_RECO    ...  


참조 : 따뜻한 커피한잔: [CentOS 7] Tibero6 설치 방법

이거 검색하는게 왜케 힘든지..ㅡㅡ;;

그래서 등록...ㅋ


public static Map<String, Object> loadFile(String path) throws IOException {

    ByteArrayOutputStream baos = new ByteArrayOutputStream();

    HttpURLConnection conn = null;

    byte[] fileBuffer = null;

    Integer width = null;

    Integer height = null;


    try {

    File fnew=new File(path);


    String extension = getFileExtension(fnew);


    BufferedImage originalImage = ImageIO.read(fnew);


    width = originalImage.getWidth();

    height = originalImage.getHeight();


    if( "png".equals(extension) ) {


    BufferedImage resultImage = imageToBufferedImageTransparency(originalImage, originalImage.getWidth(), originalImage.getHeight());


    ImageIO.write(resultImage, extension, baos);


    } else {

    ImageIO.write(originalImage, extension, baos);

    }

     }catch (IOException e) {

    throw new IOException("Can't read input file! - " + path);

} finally {

if( conn != null )

conn.disconnect();

}

}


private static BufferedImage imageToBufferedImageTransparency(Image image, int width, int height) {

BufferedImage dest = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);

Graphics2D g2 = dest.createGraphics();


g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

                g2.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE);

                g2.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);

                g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);


g2.drawImage(image, 0, 0, null);

g2.dispose();

return dest;

}


'JAVA' 카테고리의 다른 글

[JAVA] LIST형 Remove 하기  (1) 2019.04.16
[JAVA] URLConnection HTTPS 처리  (1) 2019.03.14
[JAVA] 자동리소스 닫기  (2) 2018.08.02
JSON 사용하기  (0) 2013.06.21

SVN을 사용하다보면 알 수 없는 오류로 lock이 걸려 

update, commit 등 아무것도 할 수 없는 매우 짜증나는 현상이 생길 때가 있다. (급할 때 이러면 진심 짜증난다)


왜 이런현상이 생기는 지는 모르겠지만 필자의 경우 업데이트를 받는도중 취소 버튼을 누르고 다른작업을 했더니 발생했다. 


이 부분을 해결하기 위해서 구글링 시작... 

검색결과 1차로는 team - cleanup을 하고, 그래도 에러가나면 lock이 걸린 위치로 가서 .svn 폴더(숨김폴더이다.) 안에 lock파일을 삭제하라는데 찾아보니 나는 lock 이라는 파일이없다...

그것도 안되면 프로젝트를 새로받으라는.... 멋진 해결책이 적혀있었다-_- 


에러가 날 때마다 프로젝트를 새로 받을 수는 없으니.. 계속 구글링하다 찾아낸 해법!


.svn폴더 안에 wc.db 파일이 존재한다. 


이 파일을 sqlite로 열어보자


Sqlite Browser 링크 -> http://sqlitebrowser.org/


설치하고 데이터베이스 열기를 한 후 파일을 오픈해보면 내부에 

WC_LOCK 테이블이 있다.


SVN에 이상이 없다면 이 테이블에는 아무데이터도 존재하지 않는다. 


select 해보면 아마 데이터가 들어있을 것이다. (lock이 걸린 위치가 적혀있다.)

SELECT * FROM WC_LOCK;


과감하게 해당 테이블의 데이터를 모조리 지워버리자.

DELETE FROM WC_LOCK;


또한, MERGE 작업중 작업 큐에 값이 잘 못 들어가 있을 때도 문제가 되기 때문에 

DELETE FROM WORK_QUEUE; 

실행하여 모두 삭제 처리 해준다.


완료 후 변경사항을 저장하고 해당 LOCK이 걸린 곳에서 cleanup 해주고 작업을 하면 

정상적으로 동작하는 것을 볼 수 있다.




출처: https://piterjige.tistory.com/22 [뭐라도 해야 뭐가되지]



function b64toBlob(b64Data, contentType, sliceSize) {

if( b64Data == "" || b64Data == undefined ) return null;


contentType = contentType || '';

sliceSize = sliceSize || 512;


var byteCharacters = atob(b64Data);

var byteArrays = [];

for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) {

var slice = byteCharacters.slice(offset, offset + sliceSize);

var byteNumbers = new Array(slice.length);

for (var i = 0; i < slice.length; i++) {

    byteNumbers[i] = slice.charCodeAt(i);

}

var byteArray = new Uint8Array(byteNumbers);

byteArrays.push(byteArray);

}

var blob = new Blob(byteArrays, {type: contentType});

return blob;

}

 위의 함수를 사용하여 Base64 형태의 이미지를 Blob 형태로 다시 변경해 준다.


var form = document.getElementById("testForm");


var ImageURL = "data:image/gif;base64,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";

// Split the base64 string in data and contentType

var block = ImageURL.split(";");

// Get the content type of the image

var contentType = block[0].split(":")[1];     // In this case "image/gif"

// get the real base64 content of the file

var realData = block[1].split(",")[1];     // In this case "R0lGODlhPQBEAPeoAJosM...."


// Convert it to a blob to upload

var blob = b64toBlob(realData, contentType);


// Create a FormData and append the file with "image" as parameter name

var formDataToUpload = new FormData(form);

formDataToUpload.append("image", blob);


$.ajax({

    url:"insert.do",

    data: formDataToUpload,    // Add as Data the Previously create formData

    type:"POST",

    contentType:false,

    processData:false,

    cache:false,

    dataType:"json", // Change this according to your response from the server.

    error:function(err){

        console.error(err);

    },

    success:function(data){

        console.log(data);

    },

    complete:function(){

        console.log("Request finished.");

    }

});


출처 : https://ourcodeworld.com/articles/read/322/how-to-convert-a-base64-image-into-a-image-file-and-upload-it-with-an-asynchronous-form-using-jquery

기본적으로 gradle 설치가 되어 있어야 한다.


바꾸는 명령어는 간단하다.


pom.xml이 있는 경로로 가서 


gradle init --type pom


이렇게 명령어를 실행하면 된다.


테스트 결과 완벽하게 모든 dependencies 옮겨지지 않는다.


일부 손이 가야 하지만 그래도 Maven보다 빠르고 쓰기 편하니 그걸로 족하다.

List 를 삭제 할 경우 아래와 같이 작성을 할 경우 오류가 발생합니다.

for(int i = 0; i < list.size(); i++ ) {
    list.remove(i);
}


List 를 삭제 하고자 할 경우에는 아래와 같이 iterator을 활용하여 삭제 하도록 합니다.

list.add(“A”);
list.add(“B”);
list.add(“C”);
for(Iterator<String> it = list.iterator() ; it.hasNext() ; ) {
    it.next();
    it.remove();
}


'JAVA' 카테고리의 다른 글

PNG 이미지 배경 투명하게 처리  (0) 2020.02.03
[JAVA] URLConnection HTTPS 처리  (1) 2019.03.14
[JAVA] 자동리소스 닫기  (2) 2018.08.02
JSON 사용하기  (0) 2013.06.21

나 같은 경우 서브업무로 업무가 분리되어 있는 경우 업무를 처리하고 특정 Interface를 구현한 Class를 찾아서 후처리하는 기능 때문에 필요한 기능이었습니다.

추가적으로 찾은 Class에서 특정 Annotaion을 사용한 Method를 찾아서 실행하도록 하였습니다.


ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false); 
provider.addIncludeFilter(new AssignableTypeFilter(Interface명.class));

Set components = provider.findCandidateComponents("Package명");  // co/kr/test형식

for (BeanDefinition component : components) {
    Class<?> clazz = Class.forName(component.getBeanClassName());
    logger.debug("Class Name : " + clazz.getName() );

    Method[] methods = clazz.getMethods();
    for (Method method : methods) {
        if( method.isAnnotationPresent(PostApprove.class) ) {
            logger.debug("Method Name : " + method.getName() );
            PostApprove annotation = method.getAnnotation(Annotation명.class);
            logger.debug("Annotation CODE : " + code + ", KEY : " + key );

            if( Arrays.asList(annotation.code()).contains(code) ) {
                String serviceValue = method.getDeclaringClass().getAnnotationsByType(Service.class)[0].value();
                ApproveHelper helper = (ApproveHelper) context.getBean(serviceValue);
         helper.postApprove(code, key);
           }
        }

    }
}


JAVA에서 SSL 적용된 사이트에 접근하기 위해 HttpsURLConnection을 사용하게 됩니다.

하지만 결과 적으로 HttpsURLConnection만 사용한다 하여 접근이 되지 않는 현상이 발생합니다.


String htmlUrl = "https://test.domain.co.kr";

HttpURLConnection conn  = (HttpURLConnection) new URL(htmlUrl).openConnection();

conn.setRequestMethod("GET");

conn.setRequestProperty("User-Agent", "Mozilla/5.0");


StringBuffer sb = new StringBuffer();

BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));

String inputLine;


while ((inputLine = in.readLine()) != null) {

sb.append(inputLine);

}


in.close();


단순이 이렇게 HttpURLConnection를 사용할 경우 아래와 같은 오류를 발생 시킨다.

Exception in thread "main" javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

위의 오류는 해당 사이트에 SSL 인증서가 신뢰하는 기관 인증서가 없거나 SSL/TLS암호화 버전이 맞지 않는 경우 발생한다고 한다.

인터넷을 찾아 보면 Client에도 KeyStore를 만들어 주어 해결하는 방법이 있다고는 하나 모든 Client 에 설치하는건 좀 무리가 있다고 본다.


하지만 프로그램을 하다 보면 반드시 접근해야 하는 경우가 생긴다.

그래서 유효하지 않은 SSL 인증서를 사용하는 서버에 접근하도록 HttpURLConnection 를 설정을 해야 한다.

BufferedReader br = null;

StringBuilder sb = new StringBuilder();

String line = null;


try {

String htmlUrl = "https://test.domain.co.kr";

TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {

public X509Certificate[] getAcceptedIssuers() {

return null;

}

public void checkClientTrusted(X509Certificate[] certs, String authType) {

}

public void checkServerTrusted(X509Certificate[] certs, String authType) {

}

} };


SSLContext sc = SSLContext.getInstance("SSL");

sc.init(null, trustAllCerts, new SecureRandom());

HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());


HttpsURLConnection conn = (HttpsURLConnection) new URL(htmlUrl).openConnection();


InputStream is = conn.getInputStream();

br = new BufferedReader(new InputStreamReader(is, "UTF-8"));

while ((line = br.readLine()) != null) {

sb.append(line);

}


} catch (NoSuchAlgorithmException | IOException | KeyManagementException e) {

e.printStackTrace();

}

System.out.println(sb.toString());



'JAVA' 카테고리의 다른 글

PNG 이미지 배경 투명하게 처리  (0) 2020.02.03
[JAVA] LIST형 Remove 하기  (1) 2019.04.16
[JAVA] 자동리소스 닫기  (2) 2018.08.02
JSON 사용하기  (0) 2013.06.21

<div class="table-wrap form-table" id="jqueryHtmlTest">

<table class="table table-horizon">

<colgroup>

<col style="width:245px" />

</colgroup>

<tbody>

<tr>

<th>TAB</th>

<td>

jQuer .html<br /><br />테스트

</td>

</tr>

<tr>

<th>버튼</th>

<td>

<button type="button" class="btn" onclick="jqueryTest()">테스트</button>

</td>

</tr>

</tbody>

</table>

</div>

위와 같은 HTML 소스를 jQurery의 .html() 또는 DOM의 InnerHTML로  가져 올경우에 문제점이 있습니다.

<script>

function jqueryTest() {

console.log( $("#jqueryHtmlTest").html() );

}

</script>

이렇게 출력할 경우 결과는

<table class="table table-horizon">

<colgroup>

<col style="width:245px">

</colgroup>

<tbody>

<tr>

<th>TAB</th>

<td>

jQuer .html<br><br>테스트

</td>

</tr>

<tr>

<th>버튼</th>

<td>

<button type="button" class="btn" onclick="jqueryTest()">테스트</button>

</td>

</tr>

</tbody>

</table>

위와 같이 col 이나 br 또는 input 등의 닫힘이 없어 지는 현항이 있습니다.

이 소스를 가지고 PDFWriter을 이용하여 PDF를 만들고자 할 때 오류가 발생합니다.

Invalid nested tag head found, expected closing tag col.

이러한 오류가 발생합니다.


그래서 처리 방법은 new XMLSerializer() 이넘을 이용하는 방법이 있습니다.

<script>

function jqueryTest() {

var oSerializer = new XMLSerializer();

xmlString = oSerializer.serializeToString($("#jqueryHtmlTest")[0]);

console.log( xmlString );

}

</script>

위 소스의 결과는 

<div xmlns="http://www.w3.org/1999/xhtml" class="table-wrap form-table" id="jqueryHtmlTest">

<table class="table table-horizon">

<colgroup>

<col style="width:245px" />

</colgroup>

<tbody>

<tr>

<th>TAB</th>

<td>

jQuer .html<br /><br />테스트

</td>

</tr>

<tr>

<th>버튼</th>

<td>

<button type="button" class="btn" onclick="jqueryTest()">테스트</button>

</td>

</tr>

</tbody>

</table>

</div>

이렇게 출력됩니다.

결과 물을 보면 xmlns="http://www.w3.org/1999/xhtml" 항목이 붙어서 나오게 됩니다.

PDFWriter에서 저 항목이 있으면 생성은 되나 생성된 PDF 파일이 열리지 않는 문제가 있어 저 부분을 삭제 하고 생성하면 정상적으로 생성됩니다.



Tablespace 용량 확인

select   substr(a.tablespace_name,1,30) tablespace,

         round(sum(a.total1)/1024/1024,1) "TotalMB",

         round(sum(a.total1)/1024/1024,1)-round(sum(a.sum1)/1024/1024,1) "UsedMB",

         round(sum(a.sum1)/1024/1024,1) "FreeMB",

         round((round(sum(a.total1)/1024/1024,1)-round(sum(a.sum1)/1024/1024,1))/round(sum(a.total1)/1024/1024,1)*100,2) "Used%"

from

         (select   tablespace_name,0 total1,sum(bytes) sum1,max(bytes) MAXB,count(bytes) cnt

          from     dba_free_space

          group by tablespace_name

          union

          select   tablespace_name,sum(bytes) total1,0,0,0

          from     dba_data_files

          group by tablespace_name) a

group by a.tablespace_name

order by tablespace;


Tablespace 용량 늘리기

alter DATABASE datafile '<경로>/<파일명>.dbf' resize 1024M;



SELECT *

FROM 

    DEPT_INFO

WHERE  

    CONNECT_BY_ISLEAF  = 1

    AND CONNECT_BY_ISCYCLE = 0

START WITH PARNTS_DEPT_CD = '00000000'

CONNECT BY NOCYCLE PRIOR DEPT_CD = PARNTS_DEPT_CD;

UPDATE TABLE1 T1 

SET (NAME, DESC) = ( SELECT T2.NAME, T2.DESC FROM TABLE2 T2 WHERE T1.ID = T2.ID )

WHERE EXISTS ( SELECT 1 FROM TABLE2 T2 WHERE T1.ID = T2.ID );

foreign Key 걸려 있는 테이블 비우기 처리 하기


SET FOREIGN_KEY_CHECKS = 0; 

TRUNCATE table $table_name; 

SET FOREIGN_KEY_CHECKS = 1;

'Database > MySQL' 카테고리의 다른 글

트리구조 쿼리문  (0) 2015.04.23

JAVA 7 버전이후 부터 추가된 항목으로

java.lang.AutoCloseable 사용한 객체들은 close() 없이 자동을 안전하게 리소스를 닫아 준다.


예를 들어 poi의 XSSFWorkbook 의 경우

JAVA 6에서는 


XSSFWorkbook workbook = null;

try {

workbook = XSSFWorkbook(upFileStream);

...

} finally {

workbook.close();

}


이렇게 객체를 해제해 줘야 했으나 JAVA 7부터는


XSSFWorkbook workbook = null;

try {

workbook = XSSFWorkbook(upFileStream);

...

} finally {

}


Close 없이 자동 해제됩니다.


XSSFWorkbook API를 보면


org.apache.poi.xssf.usermodel

Class XSSFWorkbook

  • All Implemented Interfaces:
    java.io.Closeable, java.lang.AutoCloseable, java.lang.Iterable<Sheet>, Workbook

저 부분이 보일겁니다~


'JAVA' 카테고리의 다른 글

PNG 이미지 배경 투명하게 처리  (0) 2020.02.03
[JAVA] LIST형 Remove 하기  (1) 2019.04.16
[JAVA] URLConnection HTTPS 처리  (1) 2019.03.14
JSON 사용하기  (0) 2013.06.21

Java Configuration을 사용할 경우

public class WebMvcConfig extends WebMvcConfigurerAdapter {

@Override

public void addResourceHandlers(ResourceHandlerRegistry registry) {

registry

.addResourceHandler("/resources/**")

.addResourceLocations(

"/resources/",

"classpath:/META-INF/resources/resources"

);

}

}


xml 설정을 사용할 경우


<resources mapping="/resources/**" location="classpath:/META-INF/resources/resources/" />

+ Recent posts