프로그래밍/C, C++, Java, Python 18

삼성 SW 역량테스트 B형/Pro 대비 - 최적화 기법

삼성 SW 역량테스트 B형/Pro 대비 - 최적화 기법 1. 들어가기 앞서 C, CPP 기준으로 -O 옵션이 없는 상태에서 기준으로 한다. Java 혹은 언어에 따라 다른 결과가 나올 수 있다. 2. 함수 인라이닝 빈번하게 호출 되는 경우, 함수를 인라인화 하는 것이 좋다. 이때 inline 키워드를 통한 컴파일 타임의 인라이닝은 최적화 옵션에 따라서 동작하게 되므로, macro를 통한 인라이닝을 하는 것을 의미한다. // inline 키워드 inline void MAX(int a, int b){ return a > b ? a : b }; // 전처리문 #define MAX(a, b) ((a) > (b) ? (a) : (b)) 문제에 따라서 TC당 한 두차례 호출되는 경우에는 인라이닝의 큰 효과를 보지 ..

Modbus TCP 통신을 위한 프로토콜 파헤치기 & 예제 코드

Modbus TCP 통신을 위한 프로토콜 파헤치기 & 예제코드 링크 : Modbus TCP/IP 프로토콜 가이드 문서 1. Modbus 프로토콜 Modbus 프로토콜은 프로세스 자동화와 SCADA(Supervsory Control and Data Acquisition)에 사용되는 통신 프로토콜으로, 원하는 장치에 정보를 가져오거나 전달할 수 있다. 크게는 Modbus TCP/IP, Modbus RTU가 있고, 그외 Modbus ASCII나 PLUS같은 것이 존재한다. Modbus는 open protocol이라, 제품에서 지원하게 된다면 서로 다른 제품이라도 하나의 프로토콜을 이용하여 데이터 통신을 수행할 수 있다. 또한 우리가 주로 사용하는 TCP/IP 프로토콜을 지원하기 때문에 네트워크 망을 이용하여 ..

[Python] 파이썬 Socket.IO 오류 unexpected response code 400

0. 선 요약 - python-socket.io와 node.js socket.io간 버전 의존성이 있음. - python-socket.io v5, node.js socket.io v2로 낮춰서 통신 수행 - python과 node간 socket 통신은 가능하다. 1. 상황 (1) 서로 떨어진 Node.js와 Python간의 통신을 Socket.Io로 수행. (2) Node.js (서버) socket.io와 Python (client) socket.io 통신시 unexpected respnse code 400 또는 요청이 씹히는 경우가 발생. (3) Connection Refused-연결 거부(서버가 꺼져있는 등의 이유로)가 아님 (4) 기존 프로토타입 테스트때 Python-Node간 통신이 가능함을 확인..

삼성 SW 역량테스트 B형/Pro 대비 - 체이닝 Hash 테이블 만들기

1. Hash란? Hash 함수는 어떤 값의 범위를 다시금 0~X까지로 매핑하는 역할을 수행한다. 이러한 Hash 함수의 역할을 통해서 범위에 비하여 값이 너무 sparse했던 애들을 압축할 수 있다. 혹은 전체 범위 중 특정 값에 몰려 있던 것을 퍼트리는 역할도 수행하 수 있다. 예를 들면 어떤 값은 알파뉴메릭 최대 30자 문자열이 10만개 있다고 하자. 그러면 이 값의 범위는 a-zA-Z0-9이므로 62^30승 ~= (2^6)^30 ..... 그렇다고 이 값을 full scan하기에는 최악의 경우에는 10만 * 30자 총 300만번의 search cost가 발생한다. 그러나 해당 문자열 값을 hash 함수를 이용하여 5000개로 나누어 담을 수 있다면, 한 해쉬 값당 20개씩 문자열이 저장된다. 그렇..

삼성 SW 역량테스트 B형/Pro 대비 - 단방향 Linked list 만들기

1. 단방향 Linked list Linked list는 하나의 단위로 구성된 Node에 다음 혹은 이전의 Node에 대한 주소 값을 저장하여 연결하는 list를 뜻한다. 배열과 달리 서로 인접하지 않은 메모리 영역에 노드를 저장할 수 있다. 또한 다음 값을 저장하고 있기 때문에 추가나 삭제시에 해당 값만 변경하면 되는 잇점이 있다. 물론 장점만 있는 것은 아니다. 만약 정렬된 상태일 때 배열의 경우 binary search와 같은 기법으로 O(n)의 탐색 시간을 O(logn)까지 떨어트릴 수 있지만, linked list의 경우 full scan을 해야 한다. 물론 여기서도 역량테스트 (Certi) B형(Pro) 기준으로, malloc과 같은 동적 할당 없이 구현한다. (free도 없다.) 2. 기본 ..

삼성 SW 역량테스트 B형/Pro 대비 - C, C++ 큐 만들기

삼성 SW 역량테스트 B형/Pro 대비 - C, C++ 큐 만들기 1. 큐 큐는 First In, First Out 자료 구조로, 입력된 순서대로 출력되는 자료구조이다. 역량테스트 (Certi) B형(Pro)에서는 STL 사용이 불가능하고 최적화하는 단계가 필요하기 때문에 동적 할당 없이 전역으로 처리해야한다. 2. 기본 구조 함수 동작 Push 큐에 넣기(push back) Pop 큐에서 빼기 (pop front) Size 크기 반환 Empty 비어있는지 여부 반환 일반적으로 Pro(B형)에서는 속도에 따른 제한을 많이 두기 때문에 활용할 수 있는 최대한의 크기를 잡고, 큐가 오버플로우 되지 않음을 가정하고 작성한다. 3. 소스코드 #include #define Q_SIZE 5 int st, en; t..

[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..

[데이터베이스] 그래프 데이터베이스 neo4j 설치 및 Java 연동

1. 그래프 데이터 베이스 neo4j 요즘 너무 다양한 데이터 베이스가 많다. 가장 많이 들어봤을 법한 데이터베이스는 mySQL일 것이다. neo4j와 달리 mySQL은 관계형 데이터 베이스이다. neo4j는 그래프형태로 소셜 네트워크와 같이 그래프 (노드와 링크)를 표현하는데 매우 효율적이다. 만약 관계형 데이터 베이스를 이용하여, 그래프를 표현하려면 계속해서 join을 실행해야 하는데, 관계형 데이터 베이스를 사용해본 사람이라면 얼마나 비효율적인지 알 수 있을 것이다. 비록 간단한 프로그램이지만, neo4j를 사용한다는 생각으로 간단하게 설치와 java 연동을 해보자. 2. neo4j 설치 방법 neo4j의 사이트는 아래의 링크와 같다. https://neo4j.com/ 다운로드 위치는 처음 홈페이지..

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