- 코드
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
}
}
윈도우 플래그 값을 FLAG_SECURE로 설정하면 화면을 캡쳐하거나 녹화할 수 없습니다.
adb 명령어를 통한 화면캡쳐와 화면녹화도 함께 적용 받습니다.
2018년 11월 30일 금요일
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>
<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
라벨:
세션 클러스터링,
톰캣,
Connector 튜닝,
jvmRoute,
root 계정 실행 방지,
tomcat
위치:
대한민국
라즈베리파이 - 아파치 톰캣 연동
1. libapache2-mod-jk 설치
- 사전 준비사항
아파치, 톰캣 모두 설치가 된 상태에서 진행해야 합니다.
- 설치
root@raspberrypi:~# apt-get install libapache2-mod-jk
- 000-default.conf 설정
/etc/apache2/sites-enabled/000-default.conf 파일 <VirtualHost *:80> 다음 행에 다음 내용을 추가합니다.
root@raspberrypi:~# vi /etc/apache2/sites-enabled/000-default.conf
- workers.properties 파일 생성
root@raspberrypi:~# vi /etc/apache2/workers.properties
- 사전 준비사항
아파치, 톰캣 모두 설치가 된 상태에서 진행해야 합니다.
- 설치
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
/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을 하는 이유 : 0 w 1 w 2 w 3 . 4 g 5 o 6 o 7 g 8 l 9 e 10 . 11 c 12 o 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());
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을 하는 이유 : 0 w 1 w 2 w 3 . 4 g 5 o 6 o 7 g 8 l 9 e 10 . 11 c 12 o 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과 그수 자신 이외의 자연수로는 나눌 수 없는, 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
...
라벨:
소수,
素數,
자바,
prime number
위치:
대한민국
소스코드 - 구구단
- 심심해서 짜보는 구구단 소스
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. 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);
}
}
피드 구독하기:
글 (Atom)