반응형

https://doc.akka.io/docs/akka/current/typed/cluster-membership.html


https://getakka.net/articles/clustering/cluster-overview.html

 

Akka.Cluster Overview | Akka.NET Documentation

Akka.Cluster Overview What Is a "Cluster"? A cluster represents a fault-tolerant, elastic, decentralized peer-to-peer network of Akka.NET applications with no single point of failure or bottleneck. Akka.Cluster is the module that gives you the ability to c

getakka.net

 


Akka 클러스터 형성 과정은 클러스터가 올바르게 초기화되고 유지되도록 보장하기 위해 여러 주요 구성 요소와 단계를 포함한다. 다음은 클러스터가 형성되는 방법, 노드의 다양한 유형의 역할, 그리고 노드 상태 및 클러스터 무결성 관리 메커니즘에 대한 설명이다.

1. 시드 노드와 비시드 노드

  • 시드 노드(Seed Nodes): 잘 알려진 IP 주소/포트 조합을 가진 노드로, 클러스터 구성에서 미리 정의된다. 다른 노드가 클러스터에 가입할 때 초기 연락 점 역할을 한다.
  • 비시드 노드(Non-seed Nodes): 초기에는 주소가 알려지지 않은 노드로, 클러스터를 형성하기 위해 시드 노드에 연락해야 한다.

2. 초기 클러스터 형성

  • 클러스터는 시드 노드가 서로를 알고 있는 상태에서 시작한다. 예를 들어, A와 B 두 시드 노드가 있으면, 이 노드들은 서로의 존재를 인식하고 설정된다.
  • 비시드 노드(C, D, E와 같은)는 적어도 하나의 시드 노드에 연락할 수 있도록 구성된다.
  • 구성에서 첫 번째로 나열된 시드 노드는 반드시 작동 중이어야 한다.. 그렇지 않으면 클러스터가 형성되지 않는다. 이는 초기 시작 시 분산 브레인(scenarios) 같은 문제를 방지하기 위한 것이다.

3. 연결 설정

  • 비시드 노드는 지정된 시드 노드에 연결을 시도한다. 예를 들어, C와 D 노드는 A에, E 노드는 B에 연결하도록 설정될 수 있다.
  • 모든 노드는 클러스터 형성 과정을 시작하기 위해 시드 노드에 연결을 시도한다.

4. 리더 선출

  • 노드가 클러스터에 합류함에 따라 리더가 선출된다.. 리더는 일반적으로 시드 노드 중 하나이며, 클러스터 상태를 관리하는 책임이 있다.
  • 리더는 직접 통신할 수 있는 노드부터 시작하여 알고 있는 노드들을 활성 상태로 표시하기 시작한다.

5. 가십 프로토콜

  • 클러스터 멤버십에 대한 가십(gossip) 정보가 모든 노드에 퍼지기 시작한다. 이 정보에는 어떤 노드들이 활성화되어 있고 그들의 연결 상태가 포함된다.
  • 노드들은 지속적으로 통신을 하며, 각 노드가 다른 모든 노드와 연결된 메시 네트워크를 형성한다.

6. 클러스터 무결성 및 관리

  • 클러스터가 운영되는 동안, 노드들은 서로에게 지속적으로 하트비트를 보내 가용성을 확인한다. 하트비트를 충분히 보내지 못하면 노드는 동료들에 의해 접근 불가능하다고 표시된다.
  • 리더는 접근 불가능한 노드가 다시 접근 가능해지거나 공식적으로 클러스터에서 제거될 때까지 클러스터 결정을 중단한다. 클러스터의 상태가 일관되지 않은 경우 리더는 자신의 업무를 수행할 수 없다고 표시한다.

7. 노드 고장 및 퇴출 처리

  • 노드가 접근 불가능해지면 설정된 타임아웃(auto-down-unreachable-after)을 사용하여 노드를 영구적으로 제거(다운)하기로 결정할 수 있다.
  • 노드는 클러스터에서 우아하게 퇴출될 수도 있으며, 이는 노드가 접근 불가능하게 표시되는 것을 방지한다.

8. 조정된 종료

  • 노드가 클러스터에서 우아하게 종료할 수 있도록 조정된 종료 프로세스를 제공한다.

 

 

 

반응형

'개발관련 > ETC..' 카테고리의 다른 글

Git 커밋된 계정 기록 변경하기  (0) 2024.04.28
MMF(Memory Mapping File)  (0) 2024.03.18
Https 적용하기  (0) 2024.03.11
aws ec2 프리티어 메모리 부족  (0) 2023.09.22
Linux에 서비스 등록  (0) 2023.01.10
반응형

daemon.json 등록

sudo vi /etc/docker/daemon.json

 

호스트 입력

{
 "hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"]
}

 

서비스를 확인한다.

sudo vi /lib/systemd/system/docker.service

 

서비스에 -H 플래그가 있다면 Daemon.json의 호스트와 충돌이 발생할 수 있다.

ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

 

아래와 같이 제거를 한다.

ExecStart=/usr/bin/dockerd --containerd=/run/containerd/containerd.sock
반응형

'개발관련 > Docker' 카테고리의 다른 글

jenkins에서 도커 명령어 사용하기  (0) 2024.03.10
도커에 GitLab 설치 및 실행  (2) 2023.09.21
Docker 설치  (0) 2023.01.08
반응형
git filter-branch -f --env-filter '

UPDATE_NAME="username"
UPDATE_EMAIL="user@mailadress"

if [ "$GIT_COMMITTER_EMAIL" = "old@mail.com" ]
then
    export GIT_AUTHOR_NAME="$UPDATE_NAME"
    export GIT_COMMITTER_NAME="$UPDATE_NAME"
    export GIT_COMMITTER_EMAIL="$UPDATE_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "old@mail.com" ]
then
    export GIT_AUTHOR_NAME="$UPDATE_NAME"
    export GIT_COMMITTER_NAME="$UPDATE_NAME"
    export GIT_COMMITTER_EMAIL="$UPDATE_EMAIL"
fi
if [ "$GIT_COMMITTER_NAME" = "oldusername" ]
then
    export GIT_AUTHOR_NAME="$UPDATE_NAME"
    export GIT_COMMITTER_NAME="$UPDATE_NAME"
    export GIT_COMMITTER_EMAIL="$UPDATE_EMAIL"
fi
if [ "$GIT_AUTHOR_NAME" = "oldusername" ]
then
    export GIT_AUTHOR_NAME="$UPDATE_NAME"
    export GIT_COMMITTER_NAME="$UPDATE_NAME"
    export GIT_COMMITTER_EMAIL="$UPDATE_EMAIL"
fi

' --tag-name-filter cat -- --branches --tags

 

rebase를 통해서 하는 것보다 훨씬 더 수월하게 잘못 커밋된 계정을 변경할 수 있다.

 

git push -f

 

 

쌓인 커밋들을 다시 푸시하면 된다.

반응형

'개발관련 > ETC..' 카테고리의 다른 글

Akka 클러스터  (0) 2024.05.14
MMF(Memory Mapping File)  (0) 2024.03.18
Https 적용하기  (0) 2024.03.11
aws ec2 프리티어 메모리 부족  (0) 2023.09.22
Linux에 서비스 등록  (0) 2023.01.10
반응형

메모리 매핑 파일(Memory-Mapped File)은 파일이나 장치의 내용을 메모리 주소 공간에 매핑하는 기술이다. 이 방법을 사용하면 파일이나 장치의 데이터에 대한 접근을 마치 메모리에 직접 있는 데이터에 접근하는 것처럼 수행할 수 있다. 이는 데이터의 읽기와 쓰기 속도를 향상시킬 수 있으며, 대용량 파일 처리에 특히 유용하다.

메모리 매핑 파일을 이용한 프로세스 간 공유는 고성능의 IPC 메커니즘을 제공하며, 파일 입출력보다 훨씬 빠른 데이터 접근 속도를 가능하게 한다. 그러나 공유 데이터에 대한 동시 접근을 관리하는 것이 중요하며, 적절한 동기화 방법을 선택하여 데이터의 일관성과 무결성을 보장해야 한다.

 

작동 원리

  1. 매핑 생성: 운영 체제는 파일의 내용을 프로세스의 가상 메모리 주소 공간에 매핑한다. 이 과정에서 실제 물리 메모리의 할당은 필요한 부분이 실제로 접근될 때까지 지연된다.
  2. 데이터 접근: 프로그램은 메모리 주소를 통해 파일 데이터에 접근할 수 있게 된다. 이 때, 파일 내용은 메모리에 있는 것처럼 읽기, 쓰기, 수정이 가능하다.
  3. 변경 사항 반영: 메모리에 있는 데이터에 대한 변경 사항은 시스템에 의해 자동으로 파일에 반영된다. 이는 주기적으로 또는 메모리 매핑이 해제될 때 수행될 수 있다.

장점

  • 성능 향상: 메모리 매핑을 사용하면 파일 입출력(I/O) 연산이 메모리 접근 연산으로 대체된다. 이는 입출력 연산의 오버헤드를 줄이고 성능을 향상시킨다.
  • 간편한 데이터 접근: 배열이나 포인터를 사용해 직접 메모리에 접근하는 것처럼 파일 데이터에 접근할 수 있어, 복잡한 파일 입출력 코드를 단순화할 수 있다.
  • 대용량 파일 처리: 메모리 매핑은 파일 전체를 메모리에 로드하지 않고 필요한 부분만 로드하기 때문에, 사용 가능한 물리 메모리보다 큰 파일도 효율적으로 처리할 수 있다.

 

반응형

'개발관련 > ETC..' 카테고리의 다른 글

Akka 클러스터  (0) 2024.05.14
Git 커밋된 계정 기록 변경하기  (0) 2024.04.28
Https 적용하기  (0) 2024.03.11
aws ec2 프리티어 메모리 부족  (0) 2023.09.22
Linux에 서비스 등록  (0) 2023.01.10
반응형

https://www.acmicpc.net/problem/14503

 

로봇 청소기와 방의 상태가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오.

로봇 청소기가 있는 방은 N X M 크기의 직사각형으로 나타낼 수 있으며, 1 X 1 크기의 정사각형 칸으로 나누어져 있다.
각각의 칸은 벽 또는 빈 칸이다. 청소기는 바라보는 방향이 있으며, 이 방향은 동, 서, 남, 북 중 하나이다. 방의 각 칸은 좌표 로 나타낼 수 있고, 가장 북쪽 줄의 가장 서쪽 칸의 좌표가 (0,0) 가장 남쪽 줄의 가장 동쪽 칸의 좌표가 (N-1, M-1)이다. 즉, 좌표 (r,c) 는 북쪽에서 (r + 1)번째에 있는 줄의 서쪽에서 (c + 1)번째 칸을 가리킨다.

처음에 빈 칸은 전부 청소되지 않은 상태이다. 로봇 청소기는 다음과 같이 작동한다.

  1. 현재 칸이 아직 청소되지 않은 경우, 현재 칸을 청소한다.
  2. 현재 칸의 주변 4칸 중 청소되지 않은 빈 칸이 없는 경우,
    1. 바라보는 방향을 유지한 채로 한 칸 후진할 수 있다면 한 칸 후진하고 1번으로 돌아간다.
    2. 바라보는 방향의 뒤쪽 칸이 벽이라 후진할 수 없다면 작동을 멈춘다.
  3. 현재 칸의 주변 4칸 중 청소되지 않은 빈 칸이 있는 경우,
    1. 반시계 방향으로 90도 회전한다.
    2. 바라보는 방향을 기준으로 앞쪽 칸이 청소되지 않은 빈 칸인 경우 한 칸 전진한다.
    3. 1번으로 돌아간다.

 

#include <iostream>
#include<memory.h>

int N, M;
int r[50][50];
int v[50][50];

//d = 0 북
//d = 1 동
//d = 2 남
//d = 3 서

int dx[4] = { 0,1,0,-1 };
int dy[4] = { -1,0,1,0 };
int count = 0;
bool DFS(int x, int y, int d)
{
    //std::cout << y << "," << x  << std::endl;
    if (v[y][x] == 0)
    {
        v[y][x] = 1;
        count++;
    }
    for (int i = 0; i < 4; ++i)
    {
        int nd = (d + 3 - i) % 4;
        int nx = x + dx[nd];
        int ny = y + dy[nd];

        if (r[ny][nx] == 0 && v[ny][nx] == 0)
        {
            v[ny][nx] = 1;
            count++;
            if (DFS(nx, ny, nd) == false)
                return false;
        }
    }
    int bd = (d + 2) % 4;
    int bx = x + dx[bd];
    int by = y + dy[bd];
    if (r[by][bx] == 0)
    {
        if (DFS(bx, by, d) == false)
            return false;
    }
    else if(r[by][bx] == 1)
        return false;
    return true;
}
int main()
{
    std::ios::ios_base::sync_with_stdio(false);
    memset(r, -1, sizeof(r));

    std::cin >> N >> M;

    int x, y, d;

    std::cin >> y >> x >> d;

    for (int i = 0; i < N; ++i)
    {
        for (int ii = 0; ii < M; ++ii)
        {
            std::cin>> r[i][ii];
        }
    }
    DFS(x, y, d);
    std::cout << count;
}

 

이동하는 모습을 디버깅해보면서 풀면 된다.

반응형
반응형

SSL FOR FREE 사이트에 도메인을 입력하고 차례 차례 순서대로 입력한다.

90일 짜리 공짜

CName 입력
Name:
_95D1090C735AB2C3856848066F6C96C0 도메인을 제외하고 입력

별칭 :  824C3264FAF387913C281A2F7F799281.AA6016E7E6E327734C6A1CE3FA469BDF.bb884888ef31b52.comodoca.com 값을 그대로 입력한다.

 

 

Install Certificate 단계에서 해당 파일을 다운로드 받는다.

3개의 파일을 서버에 올린 후 합쳐준다.

cat certificate.crt ca_bundle.crt > combined.pem

 

docker compose 설정에 볼륨 경로를 연결한다.

  - type: bind
    source: ./certificate
    target: /etc/nginx/ssl

 

Nginx 설정파일(nginx.conf)

    # XXXXX.com을 위한 서버 블록
    server {
        listen 443 ssl;
        server_name XXXXX.com www.XXXXX.com;

        ssl_certificate /etc/nginx/ssl/combined.pem;
        ssl_certificate_key /etc/nginx/ssl/private.key;

        ssl_protocols TLSv1.2 TLSv1.3;

        location / {
            proxy_pass http://127.0.0.1:9100;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }

    # XXXXX.com을 위한 서버 블록
    server {
        listen 80;
        server_name XXXXX.com www.XXXXX.com;
        # HTTP 요청을 HTTPS로 리다이렉트
        return 301 https://$host$request_uri;
    }

 

반응형

'개발관련 > ETC..' 카테고리의 다른 글

Git 커밋된 계정 기록 변경하기  (0) 2024.04.28
MMF(Memory Mapping File)  (0) 2024.03.18
aws ec2 프리티어 메모리 부족  (0) 2023.09.22
Linux에 서비스 등록  (0) 2023.01.10
Non clustered Index, clustered Index  (0) 2022.12.20
반응형

보안상 좋지 않고 추천한다고는 하진 않지만 jenkins는 보통은 믿을 수 있는 사람들 접근할 수 있도록 하기에 문제는 없어보인다.

볼륨으로 Docker 명령어를 실행할 수 있도록 연결한다.

 

docker-compose.yml

version: '3.3'
services:
  jenkins:
    image: jenkins/jenkins:latest
    volumes:
      - type: bind
        source: ./home
        target: /var/jenkins_home
      - type: bind
        source: /var/run/docker.sock
        target: /var/run/docker.sock
      - type: bind
        source: /usr/bin/docker
        target: /usr/bin/docker
    ports:
      - "8080:8080"
      - "50000:50000"
    restart: always

 

 

반응형

'개발관련 > Docker' 카테고리의 다른 글

Daemon.json 호스트 설정시 트러블 슈팅  (0) 2024.05.12
도커에 GitLab 설치 및 실행  (2) 2023.09.21
Docker 설치  (0) 2023.01.08
반응형

https://www.acmicpc.net/problem/15235

During the Olympiad finals we usually serve pizza for the contestants. When the food arrives, the contestants to queue to get some pizza. Each student will be given a single slice of pizza when his/her turn arrives. The problem is that some people need more than one slice of pizza to be well fed so they need to queue again for more pizza after they get the first one.
Given a list of slices needed to fed each of the contestants, compute how long it will take to fed all of them. We can give a slice of pizza every second and when a contestant is well fed he does not return to the queue.

code >>

#include <iostream>
#include<queue>
#include<vector>
int main()
{
    std::ios::ios_base::sync_with_stdio(false);
    int N = 0;
    std::cin >> N;
    std::vector<int> count(N);
    std::queue<int> q;
    for (int i= 0; i < N; ++i)
    {
        std::cin >> count[i];
        q.push(i);
    }
    std::vector<int> answer(N, 0);
    int time = 0;
    while (!q.empty())
    {
        int value = q.front();
        q.pop();
        time++;
        answer[value] = time;
        count[value]--;
        if (count[value] > 0)
        {
            q.push(value);
        }
    }
    for (int i = 0; i < N; i++)
    {
        std::cout << answer[i] << " ";
    }
    std::cout << "\n";
}

반응형

'알고리즘 > 백준' 카테고리의 다른 글

1766>문제집  (0) 2019.03.12
1654>랜선 자르기  (0) 2019.02.18
1010>다리놓기  (0) 2018.12.17
11657>타임머신  (0) 2018.12.04
1786>찾기  (0) 2018.11.26
반응형

헬퍼즐

 

인디 팀으로 개발한 3 매치 퍼즐 게임.

 

제작 : 23.07 - 23.11(출시)

AOS : https://play.google.com/store/apps/details?id=com.SuperClan.SC_A

IOS : https://apps.apple.com/us/app/hell-puzzle-3match/id6470315216

반응형
반응형

Unity-iPhone

  • Build Settings
    • Build Options
      • Always Embed Swift Standard libraries = yes

UnityFramework

  • Build Settings
    • Build Options
      • Always Embed Swift Standard libraries = no

공통

  • BuildSetting
    • Build Options
      • Enable Bitcode = no

로 설정해준다.

 

 

 

반응형

'개발관련 > Unity' 카테고리의 다른 글

앱 이름 다국어 설정  (0) 2023.11.06
해상도 고정  (0) 2023.09.02
TextMeshPro 폰트 생성  (0) 2023.07.31
클리커 게임 단위 구하기  (0) 2023.03.15
Addressables 동기 사용법 및 주의점  (0) 2022.09.12

+ Recent posts