프로그래밍 92

[서버] 개인 도메인 구매 및 서버 DNS 레코드 설정하기

개인 도메인 구매 및 서버 DNS 레코드 설정하기 1. 도메인 검색하기 원하는 도메인이 있는지 확인하기 위해서, 도메인 구매 대행사이트에서 검색해본다. 아래는 가비아(gabia.com)이고, 개인적으로 가격도 저렴하고, 설정하기에 UI가 편리하여 여기를 주로 이용한다. 가비아 링크 웹을 넘어 클라우드로. 가비아 그룹웨어부터 멀티클라우드까지 하나의 클라우드 허브 www.gabia.com 2. 도메인 골라보기 도메인은 영어로 되어있기 때문에 최대한 간결하고, 읽기 편리한 것이 좋다. (한글 도메인도 있지만 잘 안쓰이니까) 우리에게 익숙하고 짧은 단어로 구성된 도메인은 이미 다 소유자가 있기 때문에, 적당하게 타협을 보는 선에서 골랐다. 한번 구매한 도메인은 사실 바꾸기 어렵기 때문에 com, org, net..

Bash 2차원 배열 정의 및 Loop 탐색

Bash 2차원 배열 정의 및 Loop 탐색 Bash에서는 1차원 배열만 공식적으로 지원하기 때문에 2차원 배열을 사용해야 하는 경우에는 배열을 선언하고 그 배열을 다시 배열에 넣는 과정을 거쳐야한다. 1. Bash 코드 row1=("1" "2" "3" "4" "5") row2=("6" "7" "8" "9" "10") records=(row1 row2) for record in ${records[*]} do row="$record[*]" echo "Row --- " $record for col in ${!row} do echo $record $col done done 2. 실행 결과 Row --- row1 row1 1 row1 2 row1 3 row1 4 row1 5 Row --- row2 row2 6 ..

[Python] IEEE754 부동 소수점 <-> 비트 변환 예제

1. 서론 현재 태양광 모니터링 프로젝트 진행하고 있다. 특히 RTU와 인버터간의 데이터 통신을 통해서 값을 얻어야 하는데, 인버터 제작 회사마다 통신 프로토콜이 다르다. 게다가 일반적으로 소수점을 표현할 때 고정 소숫점을 주로 사용하는 것과 달리 ABB사의 TRIO-50-TL-OUTD 인버터는 부동 소수점을 사용한다. 따라서 IEEE754 32비트 단정도를 헥사로 받아서 이를 변환하여야 한다. C나 C++ 같은 경우 직관적으로 memcpy로 처리하면 될것 같은데 파이썬은 사실 이번 프로젝트에서 처음 사용하는 것이라 구글링이 필요했다. 2. ABB 사의 IEEE754 32비트 부동소수점 표현 방식 ABB사에서 제공하는 TRIO-50-TL-OUTD 인버터 통신 프로토콜 문서 9 페이지를 를 보면 Word ..

[Python3] Python과 Node.js 사이의 JSON 통신

[Client / python] [node / Server]와 같이 Python이 클라이언트, Node.js가 서버일 때 두 프로그램간 HTTP 통신을 한다. (1) Python 측에서는 "requests" 모듈을 이용해서 HTTP 요청을 송신하고 응답을 수신한다. (2) 두 프로그램간 JSON으로 데이터를 교환한다. - Client import requests, json data = {} headers = {} requests.post(url, data=json.dumps(data), headers=headers) - Node app.post('/abc',function(req,res,next){ return res.json({success:true, msg:"good"}); }); 사실 매우 간단한 ..

[Python3] Multi-threading 및 thread 관리

Python는 thread를 지원한다. C/C++과 Java처럼 함수 단위의 스레딩을 지원한다. 내 경우에는 기능을 완전히 분리하여 동작하기 때문에, Main thread와 별개로 특정 작업을 반복 수행한다. 더불어 각 스레드는 변수로 데이터를 공유하지 않고 DB를 이용한다. # coding=utf-8 import sched import threading # 스케줄러 생성 readSchedule = sched.scheduler(time.time, time.sleep) sendSchedule = sched.scheduler(time.time, time.sleep) # 반복 처리 함수 def read(): data = do_read() insert_data(data) readSchedule.enter(tim..

[리눅스] Shell script와 Make 파일 이용하여 설치 간소화하기

1. 서론 개인적인 개발 요청이 들어와 리눅스 기반으로 프로그램을 개발했고 전원이 인가되면 항상 자동으로 프로그램이 동작해야했기 때문에, 이전 글([라즈베리파이 / 리눅스] init.d 서비스 스크립트 작성을 통한 시작 프로그램 만들기)에서와 같이 init.d에 등록해서 시스템 시작시에 동작하도록 최초 1회 설정해야 한다. 처음에는 install.sh와 같이 쉘 스크립트를 작성해서 전달해주었는데, 알고보니 프로그램을 압축해제한 다음 실행 권한을 주어야 동작한다. 당연하게도 이 경우를 대비해서 실행 권한을 주는 명령어를 전달해주었지만, 제대로 사용하지 못할게 불 보듯 뻔하니 코드를 조금 수정해서 간단하게 프로그램을 설치할 수 있도록 했다. 2.install.sh에 실행 권한 부여하기 쉘 스크립트에 실행 권..

[리눅스] 인터넷 NTP 이용한 시간 동기화와 강제 설정 방법

1. 서론 리눅스기반으로 프로젝트를 진행하면서, 시간 동기화 이슈가 발생했다. 특히 라즈비안 기반의 라즈베리파이에서 RJ45를 이용한 인터넷 사용시 자동으로 동기화가 되지 않는 문제가 있었다. (라즈베리파이에는 RTC가 없기 때문에 전원을 재인가하면 시간이 안맞다.) 일반적인 상황이라면, 인터넷에 연결되었을 때 자동으로 시간을 동기화되지만 그렇지 않은 경우도 발생하여, 코드로 강제 동기화 하는 코드를 작성했다. 2. 현재 시스템 시간 확인하기 리눅스에서 현재 시스템 시간을 확인하기 위해서는 timedatectl을 이용하면 된다. timedatectl의 자세한 사용 방법은 제타 위키를 확인해보자. 링크 3. NTP를 이용한 시간 동기화 NTP는 Network Time Protocol으로 네트워크상에 시간 ..

[알고리즘] 최단경로 계산을 위한 Dijkstra 알고리즘과 구현

그래프가 주어졌을 때 시작 노드에서부터 종료 시점까지 최단 경로를 구할때 다익스트라 알고리즘을 사용한다. 다익스트라 알고리즘은 반드시 음수 사이클이 존재하지 않아야 한다. 만약 음수 사이클이 발생할 수 있다만 벨만 포드 알고리즘을 이용해야 한다. 다익스트라는 시작점으로부터 cost에 대한 min heap을 이용하여 가장 cost가 적은 순서대로 계속해서 길을 찾아보며 만약 도착 노드를 발견하는 순간 종료된다. 코드를 보자. 이 소스코드는 백준 최단 경로를 기반으로 하고 있다. #include #include #include #include using namespace std; typedef pair pii; #define ff first #define ss second #define mp(x, y) ma..

[알고리즘] 가장 기본적인 DFS와 BFS

알고리즘에서 가장 기본이 되는 탐색 알고리즘인 DFS와 BFS에 대하여 정리한다. DFS는 깊이 우선 탐색으로 그래프가 주어졌을 때 함수 스택을 이용하여 현재 노드와 연결된 노드로 탐색하며, BFS는 너비 우선 탐색으로 큐를 이용하여 현재 노드와 연결된 노드들을 탐색한 다음 연결된 노드들에 연결된 노드들을 차례로 탐색한다. 그래프 V와 E가 주어졌을 때 배열으로 노드를 방문하였는 여부를 저장하여, 다시금 방문하지 않도록 강제한다. 그래프가 아래와 같이 주어졌다고 하자. A - B1 - C1 - B2 - C2 - B3 - C3 DFS는 A에 연결된 B1노드, 그리고 B1노드에 연결된 C1노드를 바로 탐색하기 때문에 트리의 순회에 자주 이용된다. 반면 BFS는 A노드에 연결된 모든 노드 B1, B2, B3를..

[알고리즘] 구간합을 위한 세그먼트 트리와 펜윅 트리의 구현

구간합을 반복적으로 빠르게 계산하기 위해서 세그먼트 트리와 펜윅 트리를 이용한다. 세그먼트 트리와 펜윅 트리는 원래의 데이터 값을 저장하는 방법이 아니라, 이름에서 알 수 있듯 데이터를 구간별로 저장하는 형식을 가진다. 간단하게 말하여 부분합을 위하여 i번째까지의 데이터를 모두 합한 값을 유지하고 있다고 보면 된다. 세그먼트 트리는 리프노드에는 원래의 데이터를 그리고 그 부모 노드는 아래의 리프 노드들의 합을 저장하고 있다고 보면된다. 이러한 특징을 바탕으로 특정 구간의 값을 찾는 행위는 O(logN) 그리고 값을 변경 하는 행위 또한 O(lgN)만에 수행할 수 있다. 세그먼트 트리의 경우 필요 메모리량이 복잡하게 계산된다. Full binary tree의 경우 N이 2의 제곱꼴이면 2*N-1개의 노드가..

페이스북으로 공유카카오톡으로 공유카카오스토리로 공유트위터로 공유URL 복사