2016년 11월 19일 토요일

톰캣 튜닝 팁

- Listener 설정
 <Listener className="org.apache.catalina.security.SecurityListener" checkedOsUsers="root" /> 

root 계정 실행을 방지하는 기능입니다.


- Connector 튜닝
acceptCount="10" 
enableLookups="false" 
compression="false" 
maxConnection="8192" 
maxThread="100" 
minSpareThreads="25" 
disableUploadTimeout="true"
URIEncoding="UTF-8"
sendReasonPhrase="true"

Connector 속성을 추가하면 톰캣 성능이 개선됩니다.
항목별 세부사항은 별도 검색해서 확인해보시길 바랍니다.
* sendReasonPharse 옵션은 톰캣9 버전부터는 지원되지 않습니다.


- 인스턴스 명칭 부여
<Engine name="Catalina" defaultHost="localhost" jvmRoute="instance1">

jvmRoute를 설정하면 workers.properties를 통해 로드밸런싱을 구성할 수 있습니다.



- 세션 클러스터링
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
channelSendOptions="8">

  <Manager className="org.apache.catalina.ha.session.DeltaManager"
  expireSessionsOnShutdown="false"
  notifyListenersOnReplication="true"/>

  <Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Membership className="org.apache.catalina.tribes.membership.McastService"
address="228.0.0.4"
port="45564"
frequency="500"
dropTime="3000"/>
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
 address="auto"
 port="4000"
 autoBind="100"
 selectorTimeout="5000"
 maxThreads="6"/>

<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
 <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
  </Channel>

  <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
filter=""/>
  <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>

  <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>

  <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>


세션 클러스터링 기본코드 입니다.
자료 출처 : 출처 : https://tomcat.apache.org/tomcat-8.0-doc/cluster-howto.html#Cluster_Architecture


라즈베리파이 - 아파치 톰캣 연동

1. libapache2-mod-jk 설치
- 사전 준비사항
아파치, 톰캣 모두 설치가 된 상태에서 진행해야 합니다.


- 설치
root@raspberrypi:~# apt-get install libapache2-mod-jk



2. 아파치 설정
- apache2.conf 수정
/usr/lib/apache2/modules/mod_jk.so 파일이 있는지 확인 한 후 
/etc/apache2/apache2.conf 파일 맨 아래 다음과 같이 수정합니다.

root@raspberrypi:~# vi /etc/apache2/apache2.conf

추가 내용
#JK_MODULE
LoadModule jk_module /usr/lib/apache2/modules/mod_jk.so


- 000-default.conf 설정
/etc/apache2/sites-enabled/000-default.conf  파일 <VirtualHost *:80> 다음 행에 다음 내용을 추가합니다.

root@raspberrypi:~# vi /etc/apache2/sites-enabled/000-default.conf

추가내용
JkMount /*      loadbalancer


- workers.properties 파일 생성
root@raspberrypi:~# vi /etc/apache2/workers.properties

추가내용
vi /etc/apache2/workers.properties

workers.java_home=/usr/lib/jvm/java-8-openjdk-armhf

worker.list=loadbalancer
 
worker.loadbalancer.type=lb
worker.loadbalancer.balanced_workers=instance1
worker.loadbalancer.sticky_session=1

worker.instance1.type=ajp13
worker.instance1.host=localhost
worker.instance1.port=8009
worker.instance1.lbfactor=1


- 톰캣 설정 확인
worker.loadbalancer.balanced_workers=instance1 라인 내용 중 instance1이 톰캣과 동일해야 합니다.

톰캣 설정 파일 server.xml을 수정합니다.

root@raspberrypi:~# vi /opt/tomcat/instance1/conf/server.xml

문서 중간 쯤
<Engine name="Catalina" defaultHost="localhost">
라인에 jvmRoute가 있는지 확인하고 수정합니다.

확인 및 수정
<Engine name="Catalina" defaultHost="localhost" jvmRoute="instance1">


- httpd-jk.conf 설정
root@raspberrypi:~# vi /etc/libapache2-mod-jk/httpd-jk.conf

JkWorkersFile /etc/libapache2-mod-jk/workers.properties 내용을 다음과 같이 수정합니다.

#JkWorkersFile /etc/libapache2-mod-jk/workers.properties
JkWorkersFile /etc/apache2/workers.properties



3. 서비스 재시작
- 톰캣 실행
root@raspberrypi:~# sh /opt/tomcat/instance1/bin/startup.sh

톰캣이 이미 실행중이라면 
root@raspberrypi:~# sh /opt/tomcat/instance1/bin/shutdown.sh
root@raspberrypi:~# sh /opt/tomcat/instance1/bin/startup.sh


- 아파치 재실행
root@raspberrypi:~# service apache2 restart


- 접속 확인

80포트로 접속을 했을 때 톰캣으로 이동합니다.






2016년 11월 17일 목요일

라즈베리파이 - 아파치2와 톰캣 설치

1. 안내사항
2016-09-23 이미지 기준으로 작성했습니다.
라즈베리파이3 B+ 모델 기준입니다.
apt-get로 설치하는 패키지는 apache2, openjdk-8-jdk 입니다.
톰캣은 apache-tomcat-8.5.8을 수동으로 설치했습니다.



2. 아파치2 설치
- 설치
root@raspberrypi:~# apt-get install apache2

- 접속 확인
root@raspberrypi:~# ifconfig
IP 주소 확인 후 브라우저에서 확인 하시면 됩니다.

html 경로 : /var/www/html/index.html



3. 자바 설치
- 설치 확인
root@raspberrypi:~# java -version
openjdk version "1.8.0_40-internal"
OpenJDK Runtime Environment (build 1.8.0_40-internal-b04)
OpenJDK Zero VM (build 25.40-b08, interpreted mode)

- 설치(설치가 안된 경우 설치)
root@raspberrypi:~# apt-get install openjdk-8-jdk



4. 톰캣 설치
- 설치
아파치 톰캣 사이트 : http://tomcat.apache.org/

/opt 디렉토리에 tomcat 디렉토리를 생성 후 톰캣을 다운로드합니다.
다운로드한 압축파일은 압축을 풀고 디렉토리 이름을 instance1 로 수정합니다.

root@raspberrypi:/opt# mkdir tomcat
root@raspberrypi:/opt# cd tomcat/
root@raspberrypi:/opt/tomcat# wget http://mirror.apache-kr.org/tomcat/tomcat-8/v8.5.8/bin/apache-tomcat-8.5.8.tar.gz
root@raspberrypi:/opt/tomcat# tar -zxvf apache-tomcat-8.5.8.tar.gz
root@raspberrypi:/opt/tomcat# mv apache-tomcat-8.5.8 instance1


- 파일수정
root@raspberrypi:/opt/tomcat# which java
/usr/bin/java
root@raspberrypi:/opt/tomcat# readlink /usr/bin/java
/etc/alternatives/java
root@raspberrypi:/opt/tomcat# readlink /etc/alternatives/java
/usr/lib/jvm/java-8-openjdk-armhf/jre/bin/java

readlink로 경로를 확인한 후 startup.sh, shutdown.sh 파일을 수정합니다.

root@raspberrypi:/opt/tomcat# cd instance1/bin/
root@raspberrypi:/opt/tomcat/instance1/bin# vi startup.sh
root@raspberrypi:/opt/tomcat/instance1/bin# vi shutdown.sh


#!/bin/sh에 아래 내용 추가

export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-armhf
export CATALINA_HOME=/opt/tomcat/instance1
export CATALINA_BASE=/opt/tomcat/instance1



- 실행 확인
실행
root@raspberrypi:/opt/tomcat/instance1/bin# sh startup.sh
종료
root@raspberrypi:/opt/tomcat/instance1/bin# sh shutdown.sh

root@raspberrypi:~# ifconfig
IP 주소 확인 후 브라우저에서 포트번호 8080을 추가해서 확인 하시면 됩니다.





마치며..
아파치와 톰캣을 연동하려면 mod-jk를 사용해야 합니다.




2016년 11월 12일 토요일

자바 String 기본 예제 - 문자열 다루기

1. 문자열 포함 - contains
System.out.println("ABCD123".contains("CD"));



2. 시작문자열 - startsWith
System.out.println("https://www.google.com".startsWith("https://"));



3. 끝 문자열 - endsWith
System.out.println("image.jpg".endsWith(".jpg"));



4. 비교 - equals, equalsIgnoreCase
- 대소문자 구분
System.out.println("image.jpg".equals("image.jpg"));

- 대소문자 무시
System.out.println("image.jpg".equalsIgnoreCase("IMAGE.jpg"));



5. 문자열 자르기 - substring
- index 부터 자르기
System.out.println("www.google.com".substring(3));
> 결과 : google.com

- 구간 자르기
System.out.println("www.google.com".substring(4, 10));
> 결과 : google



6. 문자열 위치 찾기 - indexOf, lastIndexOf
- 왼쪽 기준에서 위치 찾기
System.out.println("www.google.com".indexOf("google"));

- 오른쪽 기준에서 위치 찾기
System.out.println("www.google.com".lastIndexOf(".com"));


예) 구간 자르기와 함께 쓰기
String value = "www.google.com";
int beginIndex = value.indexOf(".") + 1;
int endIndex = value.lastIndexOf(".");
System.out.println(value.substring(beginIndex, endIndex));

> 결과 : google
> +1을 하는 이유 : 10 11 12 13 m



7. 정규식 - matches
- 특정 문자가 포함되는 여부 판단
System.out.println("Qwer123".matches(".*[a-z][A-Z].*"));
> 대소문자 포함 여부 확인



8. 문자열 분리(배열) - split
System.out.println(Arrays.asList("www.google.com".split("\\.")));
> 결과 : [www, google, com]



9. 문자열 바꾸기 - replace, replaceAll
- 바꾸기
System.out.println("www.google.com".replace("www", "https://www"));

- 모두 바꾸기
System.out.println("w w w . g o o g l e . c o m".replaceAll(" ", ""));
> 공백 모두 제거



10. 대소문자 변경 - toLowerCase, toUpperCase
- 모두 소문자
System.out.println("www.google.com".toLowerCase());

- 모두 대문자
System.out.println("www.google.com".toUpperCase());

소수 구하기 예제 - 素數, prime number

- 소수
1과 그수 자신 이외의 자연수로는 나눌 수 없는, 1보다 큰 자연수


1. 소스코드
public class PrimeNumber {

public static void main(String[] args) {
for (long i = 1; i < Long.MAX_VALUE; i++) {
check(i);
}
}

public static void check(long value) {
for (long i = 2; i < value; i++) {
if (value % i == 0)
return;
}
System.out.println(value);
}
}

2. 결과
1
2
3
5
7
11
13
17
19
23
29
31
...

소스코드 - 구구단

- 심심해서 짜보는 구구단 소스


1. for문 2개로 출력하기
public static void step1() {
for (int i = 2; i <= 9; i++) {
for (int j = 1; j <= 9; j++) {
System.out.println(i + " * " + j + " = " + (i * j));
}
System.out.println();
}
}



2. for문 1개로 출력하기
public static void step2() {
for (int i = 2, j = 1; i <= 9; j++) {
System.out.println(i + " * " + j + " = " + (i * j));

if (j == 9) {
j = 1;
i++;
System.out.println();
}
}
}



3. 재귀호출을 이용한 방법 - for문 없음.
public static void step3(int i, int j) {
if (i > 9)
return;

System.out.println(i + " * " + j + " = " + (i * j));
if (j < 9) {
j++;
step3(i, j);
} else {
System.out.println();

j = 1;
i++;
step3(i, j);
}
}

아두이노 개발 시작하기

1. 아두이노 선택 
아두이노 보드는 UNO(우노) 버전을 추천합니다.
아두이노 우노는 정품은 3만원 이내, 정품호환 버전은 5천원 전후로 구매가 가능합니다.

정품과 정품호환버전은 동일한 성능입니다.
차이점은 제품의 퀄리티 입니다.


- 아두이노 우노 정품

이미지 출처 - https://store.arduino.cc/


- 아두이노 우노 호환보드





2. 아두이노 IDE설치
- 아두이노 IDE 설치
다운로드 경로1(추천)
https://www.arduino.cc/en/Main/Software

다운로드 경로2
http://www.arduino.org/downloads

윈도우 환경이나 맥 환경 어디서든 쉽게 설치가 가능합니다.



3. 기본코드 구조
- 코드 구조 설명
void setup() {
  // 가장 먼저 실행되는 메소드

}

void loop() {
  // 반복적으로 호출 되는 메소드
}

아두이노는 setup과 loop 두 메소드로 기본 구성을 이룹니다.
아두이노가 실행되면 setup 메소드를 호출한 뒤 loop 메소드를 반복적으로 호출합니다.

setup < 어떤 형태로 동작할 것인지 정의(초기화)
loop < 주기적으로 기능 실행



4.  기능 구현 및 실행
- 구현 기능
2초 마다 LED 다이오드(전구)의 불을 깜박거리는 기능 구현

setup - LED 다이오드 사용을 지정
loop - 2초 간격으로 LED 다이오드에 전원을 공급/차단


- 코드 작성
void setup() {
  pinMode(13, OUTPUT);  // LED 다이오드 사용 설정
}

void loop() {
  digitalWrite(13, HIGH); // LED ON
  delay(2000);            // 2초간 휴식
  digitalWrite(13, LOW); // LED OFF
  delay(2000);            // 2초간 휴식
}

- 컴파일 및 실행
저장 후 업로드를 실행하시면 코드가 컴파일되고 아두이노 보드에 업로드 됩니다.
USB 연결상태 확인해 주세요.

보드종류 선택



연결된 보드 선택



컴파일 및 업로드



- 실행결과


업로드 후 LED가 깜박이는 것을 확인하시면 됩니다.



LED 다이오드 연결방법(LED 다이오가 있는 경우)



LED 다이오드가 있는 경우 극성을 맞춰서 13번 핀에 연결해주시면 됩니다.
주황색 불빛이 13번 핀에 연결된 LED 입니다.

LED 다이오드 다리가 긴쪽이 +/짧은 쪽이 - 입니다.
다리가 긴쪽을 13번핀에 연결하고 짧은쪽을 GND에 연결합니다.

연결된 모습





- 코드설명
pinMode : 아두이노 pin을 통해 입출력을 결정, 입력은 INPUT/출력은 OUTPUT
digitalWrite : 디지털 출력을 설정, HIGH(디지털 출력 ON)/LOW(디지털 출력 OFF)
delay : 딜레이, 1초는 1000, 0.5초는 500

레퍼런스 문서 링크
https://www.arduino.cc/en/Reference/HomePage