Ubuntu 18.04 텔레그램에서 한글 사용하기

리눅스/OS 일반|2021. 2. 18. 08:42
반응형

우분투 기본 iBus 한글입력기 말고 fcitx 입력기를 사용하면 쉽게 해결이 됩니다.


1. 한글 입력 패키지 설치

# apt -y install fcitx-hangul fcitx-config-gtk


2. 설정

프로그램 표시 > 언어 지원 > '언어'탭 하단 키보드 입력기를 'fcitx' 로 변경한 후


로그오프, 로그인 을 거치면 텔레그램에서 한글 사용이 가능해집니다.



반응형

댓글()

CentOS 7 에서 모니터링 도구 Zabbix 5.2.3 설치 및 호스트 추가하기

리눅스/OS 일반|2021. 2. 17. 15:04
반응형

OS 는 CentOS 7 이고 APM 소스 설치 전제하에 진행 하였습니다.

참고로 Zabbix 5.2.3 버전은 PHP 7.2 이상을 필요로 합니다.

 

[ Zabbix 서버 ]

 

1. 다운로드

 

# cd /usr/local/src

# wget http://cdn.zabbix.com/zabbix/sources/stable/5.2/zabbix-5.2.3.tar.gz

# tar zxvf zabbix-5.2.3.tar.gz

# cd zabbix-5.2.3

# ./configure --prefix=/usr/local/zabbix/ --enable-server --enable-agent --with-mysql=/usr/local/mysql/bin/mysql_config --enable-ipv6 --with-net-snmp=/usr/bin/net-snmp-config --with-libcurl

# make

# make install

 

 

2. 데이터 베이스 설정

 

# mysql -p

(root 패스워드 입력후 엔터)

mysql> create database zabbix character set utf8 collate utf8_bin;

mysql> grant all privileges on zabbix.* to zabbix@localhost identified by '12345678'; // 계정은 알맞게 입력

mysql> flush privileges;

 

# cd /usr/local/src/zabbix-5.2.3/database/mysql

# mysql -p zabbix < schema.sql

# mysql -p zabbix < images.sql

# mysql -p zabbix < data.sql

 

 

3. 계정 생성

 

(안되어 있을 경우)

# groupadd --system zabbix

# useradd --system -g zabbix -d /usr/lib/zabbix -s /sbin/nologin -c "Zabbix Monitoring System" zabbix

 

 

4. 웹소스 복사 및 초기 구성

 

# mkdir -p /home/zabbix/public_html

# cp -arp /usr/local/src/zabbix-5.2.3/ui/* /home/zabbix/public_html

 

웹서버에 사이트를 추가로 구성 합니다.

 

# vi /usr/local/apache/conf/extra/httpd-vhost.conf

 

<VirtualHost *:80>

    DocumentRoot "/home/zabbix/public_html"

    ServerName sysdocu.tistory.com

    ErrorLog "logs/sysdocu.tistory.com-error_log"

    CustomLog "logs/sysdocu.tistory.com-access_log" combined

</VirtualHost> 

 

# /usr/local/apache/bin/apachectl restart

 

관리 UI 에서 DB 접근이 가능하도록 아래 파일을 열어 옵션을 수정 합니다.

 

# vi /usr/local/zabbix/etc/zabbix_server.conf

 

DBHost=localhost

DBName=zabbix

DBUser=zabbix

DBPassword=12345678

DBSocket=/tmp/mysql.sock

 

파일 저장 후 zabbix 를 구동합니다.

 

# /usr/local/zabbix/sbin/zabbix_server -c /usr/local/zabbix/etc/zabbix_server.conf

 

구동시 아래와 같은 에러가 출력될 경우

/usr/local/zabbix/sbin/zabbix_server: error while loading shared libraries: libmysqlclient.so.20: cannot open shared object file: No such file or directory

 

해결 방법입니다.

# echo "/usr/local/mysql/lib" >> /etc/ld.so.conf    // 구동전 /usr/local/mysql/lib 디렉토리 내에 libmysqlclient.so.20 파일을 확인합니다.

# ldconfig

# /usr/local/zabbix/sbin/zabbix_server -c /usr/local/zabbix/etc/zabbix_server.conf

 

 

웹브라우저를 통해 zabbix 관리 페이지에 접속합니다.

 

php 설정 상태에 따라 진행이 가능하며, 진행 완료 페이지에서 conf 가 적용되지 않을 경우 제공하는 설정파일을 다운로드 받아 아래 파일로 저장합니다.

 

/home/zabbix/public_html/zabbix.conf.php

 

이제 다시 사이트에 접속 하면 관리 UI 로 로그인이 가능합니다.

http://sysdocu.tistory.com

 

초기 패스워드 : Admin / zabbix

 

 

[ Host 추가 ]

 

모니터링 대상 서버를 관리 목록에 추가 합니다.

외부에서 대상 서버를 모니터링 하기 위해 서버 내에 agent 를 설치해야 합니다.

 

1. 패키지 설치

 

(모니터링 대상 서버에서)

# wget http://repo.zabbix.com/zabbix/4.0/rhel/7/x86_64/zabbix-release-4.0-2.el7.noarch.rpm

# wget http://repo.zabbix.com/zabbix/4.0/rhel/7/x86_64/zabbix-agent-4.0.28-1.el7.x86_64.rpm

# rpm -Uvh zabbix-release-4.0-2.el7.noarch.rpm

# rpm -Uvh zabbix-agent-4.0.28-1.el7.x86_64.rpm

 

 

2. 설정 및 실행

 

# vi /etc/zabbix/zabbix_agentd.conf

 

Server=10.10.10.10 // 관리자 서버 IP 입력
Hostname=20.20.20.20 // 호스트 서버 IP 입력

 

# systemctl enable zabbix-agent

# systemctl start zabbix-agent

 

브라우저를 통해 관리페이지에 접속 합니다.

 

http://sysdocu.tistory.com

 

설정 > 호스트 그룹 > '호스트 그룹 작성' 클릭

- 그룹 이름 : 'Managed Group' 입력

 

설정 > 템플릿 > '템플릿 작성' 클릭

- 템플릿 이름 : 'Managed Template' 입력

- 표시명 : 'Managed Template' 입력

- 그룹 : 'Managed Group' 선택

 

설정 > 호스트 > '호스트 작성' 클릭

- 호스트명 : 'First Server' 입력

- 표시명 : 'First Server' 입력

- 그룹 : 'Managed Group' 선택

- Interfaces : '추가' 버튼 클릭 > '에이전트' 선택 > 모니터링 대상 서버 (호스트 서버) IP 와 포트 10050) 입력

- [템플릿] 탭의 'Link new templates' 에서 'Managed Template' 선택

 

 

'추가' 버튼을 누르고 리스트로 나오면 시간이 조금 걸려서 '상태'값 [ZBX] 부분이 '녹색'으로 활성화 됩니다.

 

 

 

 

반응형

댓글()

c언어 소켓 close 할때 TIME_WAIT 상태로 남아 있는 경우

프로그래밍/C, C++|2021. 2. 16. 08:34
반응형

TIME_WAIT는 소켓 close를 호출하는 쪽에서 설정되는 소켓의 상태이다.

netstat을 사용하여 각 소켓의 상태를 확인할 수 있다.

짧은 작업을 위한 소켓인 경우, Server에서 close를 호출하는 경우가 생기는데, 이 때 부하가 많을수록 TIME_WAIT 상태인 소켓이 많아져 Client에서 Server로 접속을 못하는 경우가 생긴다.

 

다음과 같이 강제적으로 TIME_WAIT상태를 거치지 않고 소켓을 종료할 수 있다.

(기본적으로 TIME_WAIT는 소켓의 필수 상태이니 테스트 필수!!)

 

struct linger ling;

ling.l_onoff = 1;

ling.l_linger = 0;

shutdown(sockfd, SD_BOTH);

setsockopt(fd, SOL_SOCKET, SO_LINGER, &ling, sizeof(ling));

#define WIN32

sockclose(fd);

#else

close(fd);

#endif

 

apache proxy loadbalancer를 사용하는 경우, native 데몬(혹은 tomcat등의 proxy와 연결되는 daemon)과 apache proxy사이의 소켓은 즉시 종료 되나, 클라이언트와 apache간의 소켓은 apache의 KeepAlive설정에 따라 달라진다. KeepAlive를 On으로 설정하는 경우, 클라이언트의 소켓이 close를 먼저 하게 되므로 서버쪽에서는 소켓이 남지 않고, Off로 설정하는 경우, 서버에서 먼저 close를 호출하므로 서버쪽에 소켓이 남게 된다. (남게 되는 소켓은 전부 TIME_WAIT 상태의 소켓을 뜻함)

 

 

출처: https://indra17.tistory.com/entry/소켓-Close시-TIMEWAIT-대기시간-설정C언어 [피로에 살고 피로에 죽자]

 

---------------------------

[ 실제 적용 소스 ]

 

shutdown(client_fd, SHUT_RDWR);
struct linger ling;
ling.l_onoff = 1;
ling.l_linger = 0;
setsockopt(server_fd, SOL_SOCKET, SO_LINGER, &ling, sizeof(ling));
close(client_fd);

 

반응형

댓글()

c언어 서버 소켓 종료 후 바로 재사용하기 (bind 실행 에러시)

프로그래밍/C, C++|2021. 2. 16. 08:07
반응형

소켓 프로그램을 만들고 사용중 종료, 재구동이 필요한 경우 소켓이 정상 종료되지 않아 (계속 사용중) 에러가 발생할때 아래와 같은 소켓 옵션 코드를 이용해 해결이 가능합니다.

 

server_fd = socket(AF_INET,SOCK_STREAM,0);

 

// 소켓 종료 후 binding 곧바로 재사용 가능하게 하기

int reuse = 1;

setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse));

 

이름에서 알 수 있듯이 SO_REUSEADDR 옵션이 기존 바인딩 된 주소를 재사용 할 수 있게 해줍니다.

 

반응형

댓글()

c언어 문자열 개행 제거 (두가지 방법)

프로그래밍/C, C++|2021. 2. 9. 07:35
반응형

문자열 변수를 str 이라고 했을때 아래와 같은 코드를 이용해 개행을 제거할 수 있습니다.

 

첫번째

fgets(str, strlen(str), stdin);

str[strlen(str) - 1] = '\0';

 

두번째

for (int i = 0; str[i] != 0; i++) {
    if (str[i] == '\n') {
        str[i] = 0;
        break;
    }
}

 

반응형

댓글()

c언어 문자열 치환하기

프로그래밍/C, C++|2021. 2. 8. 11:12
반응형

# replace.c

#include <stdio.h>

#include <stdlib.h>
#include <string.h>
  
// Function to replace a string with another
// string
char* replaceWord(const char* s, const char* oldW,
                  const char* newW)
{
    char* result;
    int i, cnt = 0;
    int newWlen = strlen(newW);
    int oldWlen = strlen(oldW);
  
    // Counting the number of times old word
    // occur in the string
    for (i = 0; s[i] != '\0'; i++) {
        if (strstr(&s[i], oldW) == &s[i]) {
            cnt++;
  
            // Jumping to index after the old word.
            i += oldWlen - 1;
        }
    }
  
    // Making new string of enough length
    result = (char*)malloc(i + cnt * (newWlen - oldWlen) + 1);
  
    i = 0;
    while (*s) {
        // compare the substring with the result
        if (strstr(s, oldW) == s) {
            strcpy(&result[i], newW);
            i += newWlen;
            s += oldWlen;
        }
        else
            result[i++] = *s++;
    }
  
    result[i] = '\0';
    return result;
}
  
// Driver Program
int main()
{
    char str[] = "xxforxx xx for xx";
    char c[] = "xx";
    char d[] = "Geeks";
  
    char* result = NULL;
  
    // oldW string
    printf("Old string: %s\n", str);
  
    result = replaceWord(str, c, d);
    printf("New String: %s\n", result);
  
    free(result);
    return 0;
}



# gcc replace.c -o replace

# ./replace



반응형

댓글()

Ubuntu 18.04 부팅속도가 빨라 커널 선택창이 출력되지 않는경우

리눅스/OS 일반|2021. 2. 3. 14:38
반응형

Ubuntu 18.04 설치 후 커널 선택 화면을 보고 싶었는데 화면도 채 나오기 전에 부팅이 되어버린 경우가 있습니다.

이때는 아래 파일을 열고 색칠된 옵션을 주석처리하여 부팅이 바로되지 않도록 조정해주면 됩니다.

 

# vi /etc/default/grub

 

GRUB_DEFAULT=0

#GRUB_TIMEOUT_STYLE=hidden

#GRUB_TIMEOUT=0

GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"

GRUB_CMDLINE_LINUX=""

 

저장한 값은 아래 명령을 통해 적용 합니다.

 

# update-grub

 

 

반응형

댓글()

안드로이드 소켓 통신 (client 부분 : 데이터 송신, 수신)

반응형

네트워크 작업은 스레드를 통해서만 동작 합니다.

thread 를 구성한 후 그 안에 try, catch 를 이용해 작성합니다.

 

        Thread t = new Thread(new Thread() {

            public void run() {

                StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();

                StrictMode.setThreadPolicy(policy);
                StringBuffer sb = new StringBuffer();

                try {

                    InetAddress address = InetAddress.getByName("192.168.10.2"); // 서버 IP

                    Socket s = new Socket();
                    s.connect(new InetSocketAddress(address, 8888), 1000); // 서버 포트와 timeout

                    // 데이터 송신
                    PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(s.getOutputStream())), true);
                    out.println("Send msg"); // 전송 메세지

                    // 데이터 수신
                    BufferedReader reader = new BufferedReader(new InputStreamReader(s.getInputStream()));

                    String str = null;
                    while((str = reader.readLine()) != null){
                        sb.append(str);
                    }
                    System.out.println("수신 내용 : " + sb.toString()); // 데이터를 String 형으로 출력
                    reader.close();

 

                } catch (UnknownHostException e) {

                    // nothing

                } catch (IOException e) {

                    // nothing

                } catch (Exception e) {

                    // nothing

                }

            }

        });

        t.start();

 

 

thread 안에서 toast 를 이용하여 결과를 간단히 출력하고 싶은 경우 아래 포스팅을 참고합니다.

https://sysdocu.tistory.com/1608

 

 

 

반응형

댓글()

안드로이드 Date 날짜 비교하기

반응형

 

아래와 같은 형식으로 사용합니다.

Date date1, date2;

String last_checktime = "2021-02-01 10:20:30";

String checktime = "2021-02-01 10:20:35";

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 형식은 String 과 맞추면 yyyy-MM-dd 형식도 상관없음


try {

    date1 = dateFormat.parse(last_checktime);

    date2 = dateFormat.parse(checktime);

    int compare = date1.compareTo(date2);

    if (compare < 0) { 

        // date2 가 date1 보다 큰 경우 처리할 부분

    }

} catch (ParseException e) {
    e.printStackTrace();
}

 

반응형

댓글()

스레드 (thread) 가 종료되기까지 기다리기

프로그래밍/Android (Java)|2021. 1. 26. 16:33
반응형

thread 를 사용하면 작업을 백그라운드로 돌려 호출되는 페이지의 처리속도를 높일 수 있는 장점이 있습니다.

하지만 불가피하게 소스를 순차적으로 처리해야 할 경우에는 아래와 같이 thread 를 기다렸다가 완료되면 계속 진행하도록 할 수 있습니다.


Thread t = new Thread(new Runnable() {

    @Override

    public void run() {

        // 처리할 내용

    }

});

t.start(); // thread 시작


try { 

    t.join();  // thread 종료를 기다렸다가 진행

} catch (InterruptedException e) { 

    e.printStackTrace(); 



반응형

댓글()

스레드 (thread) 안에서 toast 사용하기

프로그래밍/Android (Java)|2021. 1. 26. 14:22
반응형

우선 class 내에 아래 내용을 작성 합니다.


    public void postToastMessage(final String message) {

        Handler handler = new Handler(Looper.getMainLooper());

        handler.post(new Runnable() {

            @Override

            public void run() {

                Toast.makeText(getContext(), message, Toast.LENGTH_LONG).show();

            }

        });

    }



그다음 스레드 (thread) 안에서 아래와 같은 코드로 사용하면 됩니다.

postToastMessage("test"); // 'test' 라는 문자가 toast 로 출력



[출처] https://stackoverflow.com/questions/3134683/how-do-you-display-a-toast-from-a-background-thread-on-android



반응형

댓글()