몇 초 멈추게 하기

프로그래밍/Android (Java)|2018. 12. 27. 02:33
반응형

try {

    Thread.sleep(1000);                 // 1초 멈춤. 그리고 아래처럼 예외처리 꼭 해줘야 에러 안남

} catch(InterruptedException ex) {

    Thread.currentThread().interrupt();

}

반응형

댓글()

사운드 SoundPool 예제

프로그래밍/Android (Java)|2018. 12. 24. 11:09
반응형

1. 사운드 파일 준비하여 res 폴더 및에 별도의 폴더 만들어서 위치 : 예제에서는 raw 폴더를 만들어서 넣습니다.  (일반적으로 폴더에 리소스 파일을 넣는 방법은  '복사' 한다음에 해당 폴더에 '붙여넣기' 하는 방법이 가장 무난 합니다.

2. SoundPool 객체 생성
3. SoundPool.load() 로 사운드 리소스 파일 id 준비
4. SoundPool.play() 로 재생시작

 

MainActivity.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class MainActivity extends ActionBarActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        Button b = (Button)findViewById(R.id.button1);
 
        final SoundPool sp = new SoundPool(1,         // 최대 음악파일의 개수
                AudioManager.STREAM_MUSIC, // 스트림 타입
                0);        // 음질 - 기본값:0
 
        // 각각의 재생하고자하는 음악을 미리 준비한다
        final int soundID = sp.load(this// 현재 화면의 제어권자
                R.raw.gun,    // 음악 파일
                1);        // 우선순위
 
        b.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sp.play(soundID, // 준비한 soundID
                        1,         // 왼쪽 볼륨 float 0.0(작은소리)~1.0(큰소리)
                        1,         // 오른쪽볼륨 float
                        0,         // 우선순위 int
                        0,     // 반복회수 int -1:무한반복, 0:반복안함
                        0.5f);    // 재생속도 float 0.5(절반속도)~2.0(2배속)
                // 음악 재생
            }
        });
    } // end of onCreate
}
cs

 

실행화면]

 [시작]버튼을 누르면 미디어 연주가 시작됩니다.



출처: http://bitsoul.tistory.com/31 [Happy Programmer~]



반응형

댓글()

히스토리에 시간 남기기

리눅스/OS 일반|2018. 12. 21. 11:01
반응형

1. /etc/profile 파일에 옵션 추가


HISTTIMEFORMAT="[%F %T] "



2. 적용


# source /etc/profile



반응형

댓글()

Ubuntu 에서 LSI Mega-Cli 설치, 기본 명령어, Telegram 알람 설정

리눅스/OS 일반|2018. 12. 18. 17:07
반응형

Ubuntu 서버를 기준으로 설명하였습니다.

 

 

1. 설치

 

# cd /usr/local/src

# apt -y install unzip alien libncurses5

# wget https://docs.broadcom.com/docs-and-downloads/raid-controllers/raid-controllers-common-files/8-07-14_MegaCLI.zip

# unzip 8-07-14_MegaCLI.zip

# cd Linux

# alien MegaCli-8.07.14-1.noarch.rpm

# dpkg -i megacli_8.07.14-2_all.deb

 

 

2. 명령어

 

디스크 상세 정보

# /opt/MegaRAID/MegaCli/MegaCli64 -PDList -aALL

 

디스크 요약 정보

# /opt/MegaRAID/MegaCli/MegaCli64 -ShowSummary -aALL

 

 

3. 알람 스크립트

 

Telegram Bot 이 있다면 알람을 주는데 활용하도록 합니다.

# vi /root/check_raid.sh

#!/bin/bash

# Telegram 설정 (텔레그램 봇 API KEY, 수신자 CHAT_ID)
API_KEY="12345678:ABFNrljuQ4nrwbChhMlx1z-tA36Ww"
CHAT_ID="00112233"

# 현재 정상 디스크 개수
list=`/opt/MegaRAID/MegaCli/MegaCli64 -PDList -aALL |grep status`
cnt=`echo "$list" |grep status |grep Active |wc -l`

# 디스크 네개 중 하나라도 정상이 아닌 경우
if [ $cnt != 4 ]; then
        # 메시지 전송
        MESSAGE="서버 디스크 에러가 감지 되었습니다.
- 서버 : 파일 서버
- 내용 : $list"
        URL="https://api.telegram.org/bot$API_KEY/sendMessage"

        curl -s -X POST $URL -d chat_id=$CHAT_ID -d text="$MESSAGE" > /dev/null 2>&1
fi

exit 0

 

# chmod 700 /root/check_raid.sh

# echo "0 9 * * * root sh /root/check_raid.sh" >> /etc/crontab

 

 

4. 쉘스크립트 암호화 (선택)

 

쉘스크립트에 Telegram Bot API KEY 와 사용자의 CHAT_ID 가 포함되어 있어 누군가 확인할 우려가 있을 경우 쉘스크립트를 바이너리 파일로 변경할 수 있습니다.

우선 필요한 패키지를 설치하고 위에서 작성했던 쉘스크립트를 암호화 합니다.

# apt -y install shc

# shc -f /root/check_raid.sh -o /root/check_raid

 

/etc/crontab 파일에서 쉘스크립트 실행 명령을 바이너리 파일 실행 명령으로 바꿉니다.

- 기존 : sh /root/check_raid.sh

- 변경 : /root/check_raid.sh
# sed -i 's/sh \/root\/check_raid.sh/\/root\/check_raid/' /etc/crontab

 

변경이 완료되었으면 테스트를 해봅니다. 이상이 없는 경우 기존 쉘스크립트는 삭제해 두는 것이 좋습니다.

# rm -f /root/check_raid.sh*

 

반응형

댓글()

MariaDB Galera Cluster 구성 (MySQL, MariaDB 지원)

리눅스/MySQL|2018. 12. 5. 11:27
반응형

Galera Cluster 는 두대 이상의 DB 서버를 '마스터 - 마스터' 형태로 운영토록 해주므로 아주 매력있는 기술이지만

실제 서비스를 가동하는데 있어 기능제한이나 오류 등이 많이 발견되고 있어 고객 서버에 적용하기에 적합하지 않습니다.

버전이 올라감에 따라 단점이 보완 될 것으로 보이므로 미리 설치, 테스트를 거쳐 고객 응대하는데 도움이 되시기 바랍니다.


본 매뉴얼은 Galera Cluster 를 CentOS 7.4 에서 MariaDB 10.2 환경에서 구성하였습니다.


[테스트 서버]

- 49.247.212.17    // 마스터 노드

- 49.247.212.46    // 슬레이브 노드

* 마스터 및 슬레이브 노드의 구분은 최초 구동 명령의 차이 밖에 없습니다. (반드시 기억해야 할 부분. 이유는 맨 하단 테스트에 나옴)



1. Galera Cluster 개요


1) 장점

- 모든 노드 읽기/쓰기가 가능하므로 Active - Active 방식의 멀티 마스터 구성 가능

- 노드간에 트랜젝션을 지원하므로 데이터의 일관성이 보장

- 노드 추가 및 제거가 간단


2) 단점

InnoDB 테이블만 지원

데이터베이스 단위가 아닌 서버 단위로 구성

한 노드에서 테이블 락이 걸리면 모든 노드에서 락이 걸림

- 한 노드에서 insert 시에 모든 노드에 데이터 insert 요청을 하게 되므로 쓰기 성능 저하

   => 이 문제로 순식간에 양 노드에 쓰기가 들어간다면 Auto Increment 충돌로 인한 장애 또는 데이터 유실이 발생할 수 있음


3) 지원 버전

MySQL 5.5, 5.6 이상 지원

MariaDB 5.5 이상 지원

* MariaDB 10.1 부터 기능이 기본 포함되어 설정이 더 간편해 졌습니다.



2. 설치


CentOS 7.4 가 설치된 상태에서 yum 명령을 통해 mariadb 를 설치하면 버전이 5.5.60 이 설치되므로

repositories 를 추가하여 더 높은 버전 (10.2.19) 의 mariadb 를 설치하도록 합니다.


1) 서버 공통 작업


[MariaDB 설치]


# vi /etc/yum.repos.d/MariaDB.repo


[MariaDB]

name = MariaDB

baseurl = http://yum.mariadb.org/10.2/centos7-amd64

gpgkey = https://yum.mariadb.org/RPM-GPG-KEY-MariaDB

gpgcheck = 1 


# yum -y install mariadb-server galera rsync

// 복제 방식은 rsync 를 사용할 것이므로 rsync 패키지도 같이 설치


# vi /etc/my.cnf.d/server.cnf


[galera]

wsrep_on=ON                                                                                                                // galera cluster 사용 여부

wsrep_provider=/usr/lib64/galera/libgalera_smm.so                                 // libgalera_smm.so 모듈 위치

wsrep_cluster_address="gcomm://49.247.212.17,49.247.212.46"         // 본 서버를 포함한 동기화될 서버 IP LIST

wsrep_cluster_name=cluster                                                                                   // 그룹명 (동기화 될 서버가 모두 동일해야 함)

wsrep_node_address="49.247.212.17"                                                               // 현재 서버 IP

wsrep_node_name="sysdocu1"                                                                             // 현재 서버의 이름 (동기화될 서버간에 중복되면 안됨)

wsrep_sst_method=rsync                                                                                         // 동기화 될 데이터 전송 방식

wsrep_sst_auth="root:12345678"                                                                         // 데이터 전송 방식에 사용할 계정

binlog_format=row                                                                                                      // 바이너리 로그 파일 형식

default_storage_engine=InnoDB                                                                          // 스토리지 엔진 타입

innodb_autoinc_lock_mode=2                                                                              // 

bind-address=0.0.0.0                                                                                                  // 모든 IP 에서 접근 허용


마스터 서버는 위와 같이 구성하고, 나머지 서버는 위 내용에서 wsrep_node_addresswsrep_node_name각 서버의 고유한 값으로 바꾸어 줍니다.


[iptables 방화벽 설정]


아래 포트 리스트를 모든 서버에 동일하게 적용해줍니다. (선진행 필수)

3306/tcp

4444/tcp

4567/tcp

4567/udp

4568/tcp


2) 마스터 노드


데이터를 최초 배포 하는 마스터 노드에서 아래와 같이 실행합니다.


# galera_new_cluster


* 주의 : (모든 노드가 다운 상태인) 최초 구동일 경우에만 사용합니다.


3) 슬레이브 노드 (마스터 노드를 제외한 모든 서버)


# service mysql start



3. 동기화 확인 및 테스트


1) 확인


# mysql -p

(mysql root 비밀번호 입력)


MariaDB [(none)]> show status like 'wsrep_cluster_size';

+--------------------+-------+

| Variable_name      | Value |

+--------------------+-------+

| wsrep_cluster_size |    |

+--------------------+-------+

1 row in set (0.01 sec)


MariaDB [(none)]> show status like 'wsrep_incoming_addresses';
+--------------------------+---------------------------------------+
| Variable_name            | Value                                 |
+--------------------------+---------------------------------------+
| wsrep_incoming_addresses | 49.247.212.46:3306,49.247.212.17:3306 |
+--------------------------+---------------------------------------+
1 row in set (0.00 sec)

2) 데이터베이스, 테이블 생성 및 데이터 입력


마스터 노드에서 아래와 같이 테이블을 생성하고 데이터를 입력합니다.


MariaDB [(none)]> use test

MariaDB [test]> create table memo (name varchar(20), email varchar(250));

MariaDB [test]> insert memo (name, email) values ('SYSDOCU', 'sysdocu@sysdocu.tistory.com');


그리고 슬레이브 노드에서 데이터 입력을 확인하면 됩니다.
이와 같이 여러대의 서버를 cluster 로 묶은 경우 반대쪽 노드에서 insert 를 해서 반영이 되었는지 양방향으로 꼭 확인을 해봅니다.


4. 장애 복구 테스트


운영중 발생한 장애에 대하여 데이터를 동기화할 필요성이 있습니다.

한 대의 노드가 중지 된 상태에서 입력된 데이터는 나중에 해당 노드가 복구되어서 DB가 가동 되었을때 자동으로 sync 가 맞추어 집니다.

(마스터, 슬레이브 구분 없음)


[테스트 - 슬레이브 노드 장애]

1) 49.247.212.46 노드 셧다운

2) 49.247.212.17 노드에 데이터 insert

3) 49.247.212.46 노드 부팅 및 mariadb 가동

     # service mysql start

4) 49.247.212.46 노드에서 17번 입력 데이터 확인

     -- DB 데이터 sync 확인 --


[테스트 - 마스터 노드 장애]

1) 49.247.212.17 노드 셧다운

2) 49.247.212.46 노드에 데이터 insert

3) 49.247.212.17 노드 부팅 및 mariadb 가동

4) 49.247.212.17 노드에서 46번 입력 데이터 확인

     -- DB 데이터 sync 확인 --


[테스트 - 마스터, 슬레이브 노드 동시 장애]

1) 49.247.212.17 노드 셧다운

2) 49.247.212.46 노드에 데이터 insert

3) 49.247.212.46 노드 셧다운

     -- DB 서비스 완전 종료 --

4) 49.247.212.46 노드 부팅 및 mariadb 가동    // Master - Master 기반의 환경이지만 두번째 서버이므로 구동이 되지 않음

     # service mysql start

5) 49.247.212.17 노드 부팅 및 mariadb 가동    // 성공. 모든 노드 다운시에는 마스터 서버 부터 가동해야 함

     # galera_new_cluster

6) 49.247.212.46 노드 부팅 및 mariadb 가동

     # service mysql start

7) 17번, 46번 노드에서 데이터 확인

     -- DB 데이터 sync 확인 --


[장애 복구 테스트 결론]

- 운영중 마스터, 슬레이브 상관없이 어느 노드 하나가 다운 되었다면, 장애 서버 부팅만으로 데이터 sync 를 맞출 수 있습니다.

- 모든 노드의 서버가 다운되었을 경우, 마스터 노드부터 부팅을 시키는게 일반적이지만

   마스터 노드 다운 후 슬레이브 노드로 insert 된 데이터가 있다면 마스터 노드부터 가동할 경우 슬레이브 노드에 추가된 데이터가 유실 됩니다.

   유실을 막는 대안으로는 (데이터가 추가로 존재하는) 슬레이브 노드에서 galera_new_cluster 명령 먼저 가동하고 나머지 노드를 service mysql start 로 가동하면 됩니다.

   (마스터, 슬레이브 노드 역할을 바꿈)



5. 노드 추가


새로운 노드 IP : 49.247.212.68


1) 새로운 노드에 MariaDB를 설치하고 환경을 위와 같이 설정합니다.

     다만 아래 항목에서는 추가된 노드 IP를 추가해 주어야 합니다.


     wsrep_cluster_address="gcomm://49.247.212.17,49.247.212.46,49.247.212.68"


2) 방화벽 설정

     위 'iptables 방화벽 설정' 내용을 참고하여 설정합니다.


3) MariaDB 가동

     # service mysql start    // 이때 데이터가 동기화 되므로 데이터 양이 많다면 그만큼 기다려야 합니다.


4) MariaDB 에 로그인 해서 데이터 sync 된 것을 확인합니다.


5) 관리 목적상 헷갈리지 않도록 17번과 46번 노드의 설정 파일도 일관성 있게 아래 옵션에 새로운 노드 IP를 추가해 줍니다. (mysql 재시작 불필요)

     추가 설정 여부와 관계없이 데이터는 이미 양방향으로 전송이 가능한 상태입니다.


     wsrep_cluster_address="gcomm://49.247.212.17,49.247.212.46,49.247.212.68"



반응형

댓글()