분류 전체보기 441

[Redis] Redis 기초 개념 정리(1)

Redis 를 쓸일이 생겼다. 이전에 한번도 써본적이 없었다. 실력있는 친구에게 물어보니 요즘 서버에서는 그냥 기본으로 쓴다고 들었다. hiredis 를 통해서 C++ 서버에서 작업하기 전에 기본적인 개념에 대해서는 어느정도 알고 진행해보고자 한다. Redis = Remote Dictionary Server In-memory 기반의 key - value 구조 데이터 관리 서버 시스템이다. key - value 구조는 비 관계형 구조로써 데이터를 그냥 키-값으로 가지고 있다고 보면 된다. 그래서 이 구조가 관계형 데이터가 아니기에 쿼리 연산이 지원되지 않는다. 다만 데이터의 고속 읽기와 쓰기에 최적화되있다. 그래서 Redis 가 일종의 NoSQL 로 분류되는 것이다. Redis 는 인 메모리 솔루션으로 D..

Database/Redis 2022.11.11

[BOJ] 백준 16939 - 2×2×2 큐브 - Java solution

백준 16939 문제이다. Java로 풀이했다. 참고로 이 문제는 굉장히 좋은 문제이다. 문제 자체의 퀄리티가 굉장히 좋다. 문제가 깔끔하고 실력 향상에도 많은 도움이 된다. 예전에 한번 풀려고 시도했지만 당시에 답안에 거의 근접했는데 사소한 로직에서 실수를 해서 풀지 못했다. 대략적인 풀이방법은 알고있었지만 오늘에서야 해당 로직을 수정하게 되었다. 구현 문제이고 정말 흥미로운 문제이다. 개인적으로 이런 문제를 좋아한다. 어째서인지 복잡한 구현 문제가 가장 재미있다. 그리고 참고로 이 문제는 도전 정신을 자극했다. 풀릴것같으면서도 풀리지 않아서 오히려 그렇게 느낀 것 같다. 28일전에 풀려고 했다가 다시 2주전에 시도했다가 오늘에서야 완벽하게 풀었다. 아래에서 솔루션을 설명하도록 하겠다. 코드가 꽤 길기..

[C++] C++ RapidJSON 라이브러리 사용법

사용법은 간단하게 아래와 같다. 아래 블로그에 tutorial 에 굉장히 친절하게 설명되어있다. 감사합니다. https://rapidjson.org/md_doc_tutorial.html RapidJSON: Tutorial This tutorial introduces the basics of the Document Object Model(DOM) API. As shown in Usage at a glance, JSON can be parsed into a DOM, and then the DOM can be queried and modified easily, and finally be converted back to JSON. Value & Document Each JSON rapidjson.org

C & C++/C++ 2022.11.10

[C++] C++ select api와 inet_ntop api 정리

c++ socket programming 을 하던 중 select api 가 어떻게 동작하는지 알지 못해서 코드를 읽는 도중에 흐름이 끊겼다. 알아보고 지나가자. 또한 inet_ntop api 에 대해서도 간략하게 알아보자. select api 를 설명하기 전에 멀티플렉싱 서버에 대해 설명해야한다. 멀티플렉싱 서버란 하나의 프로세스로 여러 클라이어트에 서비스를 하는 서버이다. 멀티플렉싱 서버에서는 하나의 프로세스가 서버 소켓 + 여러 클라이언트 소켓을 관리한다. 관리할때 fd_set 이라는 구조체를 사용한다고 보면 된다. 이 fd_set 은 배열 형태인데 인텍스로 매핑하기 위해 쓴다고 보면 된다. 그냥 bit array 에 특정 index 에 체크해준다고 생각하면 된다. 아래와 같은 함수가 있다. FD_..

C & C++/C++ 2022.11.10

[C++] C++ listen api 의 parameter 중 backlog.

C++ 을 사용해서 소켓 프로그래밍을 하던 중 listen api 에서 두번째 인자로 넘겨주는 backlog 라는 파라미터에 대해 정확하게 알고 있지 못했다. 우선 리눅스 메뉴얼에 들어가서 listen api 의 backlog 파라미터의 설명을 보면 다음과 같이 적혀있다. 즉 간단하게 보자면 큐 사이즈를 지정한다는 내용이다. 그런데 어떤 큐 사이즈를 지정하는것일까? 이제 아래 그림을 보자. 왼쪽이 서버에서 동시에 응답할 수 있는 최대 갯수라고 가정한다면 (현재로썬 3개) backlog 값이 5라고 했을때 아래와 같은 상황이 연출되는 것이다. 가운데 있는 listen backlog queue의 사이즈가 5로 잡혀있는 것이다. 그러니 10개의 요청이 들어왔을때 1, 2, 3 은 서버쪽에서 처리하고 있고 아직..

C & C++/C++ 2022.11.10

[C++] C++ 헷갈리는 개념 간단 정리 (2)

1. #include 순서 include 하는 헤더파일에도 순서가 있다. 1) 시스템 라이브러리의 헤더파일 2) 다른 라이브러리의 헤더파일 3) 현재 프로젝트의 헤더파일 이 순서로 나열하면 가독성을 높일 수 있고 종속성도 피할 수 있다고 한다. (참고로 이 문제는 오늘 아침에 직접 겪었는데 redis 와 winsock2 헤더는 서로 충돌한다. winsock2를 아래로 내려주니 작동하는 것을 확인할 수 있었다. ) 2) ZeroMemory() 구조체를 초기화할때 쓰인다. ZeroMemory랑 memset은 그냥 같다고 보면 된다. 다만 memset 의 경우에 메모리를 인자로 받은 char형 변수(1byte)로 채워주고 ZeroMemory는 메모리를 0으로 채워준다는 점이 다르다고 한다. 오버헤드 차이도 별..

C & C++/C++ 2022.11.09

[C++] Visual Studio 2022 에서 C++ rapidjson 사용하기

c++ 프로젝트에서 json 으로 서버와 주고받을 일이 생겨 관련 라이브러리를 사용해보고자 한다. c++ 에서 json 을 주고 받기 위해서는 rapidjson 을 주로 사용한다고 한다. 사실상 쓰는 방법은 굉장히 간단한데 세팅하는 방법이 조금 투박하다. 아래처럼 잘 따라하면 rapidjson을 사용할 수 있는 환경을 갖출 수 있을 것이다. 우선 아래 github에 접속하자. https://github.com/Tencent/rapidjson 접속하면 아래와 같이 직접 zip 파일을 받던 clone을 하던 어떻게든 소스코드를 받는다. 받고나면 include 라는 폴더가 보일텐데 다른 파일들은 사실상 필요없고 include/rapidjson 만 필요하다. 위와 같이 include/rapidjson 이 있는데..

C & C++/C++ 2022.11.08

[Git] Git commit 컨벤션

아래와 같이 조금 더 디테일하게 적어줄 수 있을 것 같다. 이전에는 feat, docs, style, chore 등은 쓴 적이 없고 Delete, Add, Fix, Test와 같은 type만 적어줬는데 아래 처럼 feat, docs, refactor 등을 활용할 수 있을 것 같다. 이모지로 표현하는건 개인적으론 별로 좋지 않은것 같다. 근데 이건 그냥 개인 취향이라 하고 싶은 사람은 팀에서 잘 논의해서 결정하면 될 것 같다. 아래 양식 정도만 따르면 큰 문제는 없을 것 같다. feat : 새로운 기능 추가 fix : 버그 수정 docs : 문서 수정 style : 코드 포맷팅, 세미콜론 누락, 코드 변경이 없는 경우 refactor : 코드 리펙토링 test : 테스트 코드, 리펙토링 테스트 코드 추가 ..

인프라/Git 2022.11.08

[C++] C++ 헷갈리는 개념 간단 정리 (1)

1. C++ member initializer lists (멤버 초기화 리스트) -> 생성자 괄호 뒤에 콜론으로 표시해서 초기화할 멤버 변수들을 명시해줌. -> 간단하게 : 뒤에 쓰는건데 괄호 안에 어떻게 초기화할건지 값 명시해준다고 보면 됨. 2. tcp::acceptor -> socket에서 사용하는 acceptor와 동일한 존재이다. -> 말 그대로 accept 를 시작하는 녀석이다. -> 여기서 생성한 acceptor를 가지고 async_accept를 호출해서 비동기 accept를 시작하는 셈이다. 3. tcp::socket -> stream-oriented socket 기능을 제공한다. 그냥 socket 통신할때 필요한 변수라고 보면 된다. 4. 스마트 포인터 스마트 포인터에는 세가지 종류가 있..

C & C++/C++ 2022.11.07

[Blockchain] The Convergence of Blockchain

분산된 장부이다. 블록체인은 해킹이 불가능하다. (글쎄... 어떤 의미의 공격이냐에 따라 다르지 않을까? 불가능하지 않다. 다만 하기가 어려워서 공격을 시도하는 것보다 그냥 채굴하는 게 더 이득일 뿐 이다. 매번 언급되지만 Impossible와 Infeasible은 명백히 다른 의미이다. 블록체인은 그런 의미에서 Infeasible하다.) 머스크라는 회사에서 블록체인을 사용했다. 스마트 컨트랙트를 사용했다. 이로 인해 비용을 감소시켰다. 오픈이라는 회사도 있다. 블록체인에는 투명성을 제공한다. (개인적으로 투명성을 제공하지 않는 블록체인이 미래라고 생각한다. 내 은행 기록을 아무나 볼 순 없으니까.) 수백의 중개인도 있다. 이로 인해 중간비용도 발생한다. 그중의 25퍼센트는 필요없는 비용이다. 이 비용을..

Blockchain 2022.11.05

[Go] Go 실행환경 - VScode 에서 Go를 사용해보자.

최근에 블록체인을 공부하던 중 Go 로 작성된 샘플 소스코드가 굉장히 많다는 것을 알게 되었다. 원래 Java 에 익숙해서 예제들도 전부 Java 쪽으로 찾아봤는데 오히려 go 쪽에서 간단하게 구현된 Blockchain 이나 P2P network 예제가 많았다. (Python3로 작성된 자료들도 많아서 신기했다.) Go를 개인적으로 공부한지 오랜 시간이 지났고 제대로 사용해본 적도 없어서 이번에 학교에서 진행하는 프로젝트가 끝나자마자 바로 보관해두었던 오픈소스를 읽어볼 생각이라 그전에 미리 환경을 세팅해두고자 한다. 아래와 같은 과정을 따르면 된다. 아래 링크에서 본인 OS에 맞는 Go를 다운받자. https://go.dev/dl/ Downloads - The Go Programming Language ..

Go 2022.11.05

[Blockchain] 라인 블록체인 영상 (The Future of Blockchain with LINE)

LINK? BITMAX Wallet에서는 8600만의 라인 유저가 블록체인에 참여할 기회를 제공한다. 블록체인의 미래? privacy 이슈가 해결되야 한다. explorer에 존재하는 visualization이 privacy에 이슈가 될 수 있다. 계층화된 wallet으로 해결할 수 있다. tree 구조를 가지고 있다. 블록체인의 방향성에 대해 이야기해보자. 왜 킬러앱이 없을까? 블록체인 개발이 어렵다. 유저 접근성이 좋지 않다. 이런 문제를 극복하려면 가장 기본적인 툴셋이 제공되야한다. 라인 블록체인에서 뭔가를 개발할 수 있도록 제공되어야한다. 유저들은 블록체인이 쓰이는지도 모른채 쓸 수 있다. 블록체인에는 흥미로운 점들이 있다. 분산화, private, 퍼블릭 블록체인 등등 해시 구조, DLT기술 등..

Blockchain 2022.11.04

[Blockchain] 라인 블록체인 영상 (P2P 네트워크에서 블록체인의 일관성에 도전)

2000년대 P2P 네트워크가 사회 윤리와 대립하면서 사그라들었다. 블록체인은 화폐에 관련된 부분 말고 시스템 적인 부분 그러니까 분산 시스템에 대한 부분이 조금은 부족했다. 하지만 이제는 분산 시스템에 대해 진지하게 고찰해볼 필요가 있다. 분산 시스템에서 일관성을 유지하기 위해 여러 기법을 쓴다. 일관성에 있어서 클라우드에 없는 P2P 만의 어려운 점이 있다. 비잔틴 문제가 있다. 악의적인 행동을 취하는 노드가 있다는 점이다. 합의와 관련된 노드가 시스템 전체의 합의를 얻지 않고 언제든 나갈 수 있다는 거다. P2P 네트워크에 비결정론적 성질이 생긴다. 블록체인 네트워크 전체를 유한 상태의 기계로 간주하는게 어려워지게 되는 것이다. 과반수가 몇명인지 어느 시점에 알게 되는게 굉장히 어렵다. https:..

Blockchain 2022.11.03

[Blockchain] 라인 블록체인 영상 (LINE Blockchain에서도 프로그램을 실행)

스마트 컨트랙트를 통해 다양한 기능을 블록체인에 기록 가능하다. 그런데 이게 쉽진 않다. 요건이 세가지 지켜져야 한다. 1. 안전성 2. executable and deterministic -> 모든 머신이 실행할 수 있는 코드여야 한다는 뜻. 3. effective -> 실행이 느려선 안된다. 효율적이어야 한다는 뜻. 그런데 웹어셈블리가 이 세 가지 성질을 충족시킬 수 있다는 전망이 있다. 웹어셈블리는 3D 게임도 가능할 정도로 성능이 좋다. 왜 웹어셈블리가 스마트 컨트랙트에 적합할까? 위에서 언급했던 요건을 충족시킨다. 웹어셈블리는 portable 하다. 또한 deterministic 하다. 늘 같은 결과를 돌려줌. efficient and fast 도 가능하다. 웹어셈블리는 jit과 aot를 사용가..

Blockchain 2022.11.03

[Blockchain] 블록체인 확장성 이슈 관련 영상 요약

아래 링크의 영상에서 블록체인의 확장성과 문제점에 대해 이야기한다. 긴 영상이 아니라서 가볍게 볼 수 있다. https://www.youtube.com/watch?v=8uF7RVF2osk https://www.youtube.com/watch?v=4CdO0olVfAA 첫번째 영상 간략한 요약: 블록 사이즈에 제한이 있다. 사이즈에 대한 공격을 피하기 위해 그 제한이 모든 블록에 적용되었다. 1MB을 넘길 수 없다. 그렇다고 해서 또 블록 사이즈를 늘리면 storage에 저장하게 될 체인의 사이즈가 상당히 커진다. 사이즈를 늘리려면 하드포크해야한다. 그리고 작은 커피값 계산까지 모두 블록에 넣어야하는지에 대한 논의도 있다. 라이트닝 네트워크에서는 이 문제를 해결한다. 두번째 영상의 간략한 요약: 투명성으로 ..

Blockchain 2022.10.31

[Blockchain] Base64 인코딩과 디코딩

블록체인 관련 예제 혹은 암복호화 예제를 살펴보면 Base64인코딩과 디코딩을 진행하는 예제가 상당히 많다. Base64 인코딩과 디코딩이 어떤 개념인지에 대해서 살펴보도록 하자. 인코딩은 주로 정보의 형태, 형식을 표준화하거나, 보안, 속도, 저장 공간 절약을 위해서 다른 형태로 바꾸는 처리 방식을 말한다고 보면 된다. 아주 간단하게 말하자면 Base64 인코딩이란 Binary Data를 Text로 바꿔주는 인코딩 방식이다. Binary Data를 Character set 에 영향을 받지 않는 공통 ASCII 영역의 문자로만 이루어진 하나의 문자열로 바꿔준다. 방식은 꽤나 간단한데 Binary Data 를 6비트씩 자른 뒤에 6비트에 해당하는 문자를 Base64 전용 색인표에서 찾아서 그것으로 바꾸어준..

Blockchain 2022.10.31

[Git] git local default branch 변경과 remote default branch 변경

아래와 같은 명령어를 입력한다. git config --global init.defaultBranch 이후에 아래 명령어를 통해 바뀐 default branch name을 확인할 수 있다. git config --global init.defaultBranch 아래와 같이 보여질 것이다. 참고로 원격에 있는 github 에서도 default branch 를 변경할 수 있다. 굳이 하지 않긴 하는데 방법은 아래와 같다. settings -> 좌측 메뉴에서 branchs 선택 -> Default branch 에서 switch to another branch 선택 -> 변경

인프라/Git 2022.10.31

[Redis] Windows에서 wsl2에 Docker와 Redis를 설치해보자.

최근에 Windows 에서 Docker와 Redis 를 설치해서 실습할 일이 생겼는데 Windows에서 특히나 Docker도 지원이 안되고 Redis도 지원이 안되서 굳이 wsl2를 설치해주고 이것 저것 설정할 일이 많았다. 아래 블로그에서 많은 도움을 받았고 에러없고 천천히 따라하기만 하면 된다. windows 에서 wsl2 세팅하기 https://www.44bits.io/ko/post/wsl2-install-and-basic-usage windows 에서 docker 설치 https://www.lainyzine.com/ko/article/a-complete-guide-to-how-to-install-docker-desktop-on-windows-10/ wsl위에 redis 설치하기 https://de..

Database/Redis 2022.10.30

[Blockchain] [작성 중...] Bitcoin: A Peer-to-Peer Electronic Cash System - by Satoshi Nakamoto 의 번역 및 정리

비트코인 백서를 읽고 간단한 번역을 해보려고 한다. 블록체인의 워낙 근본적인 내용을 담고 있기 때문에 꼭 한번은 읽어봐야하는 논문이다. Bitcoin: A Peer-to-Peer Electronic Cash System Satochi Nakamoto satoshi@gmx.com www.bitcoin.org Abstract. 진정 순수한 의미에서의 peer 2 peer 형태의 전자 화폐는 금융 기관의 개입없이 타인에게 전송될 수 있다. 전자서명이 그 해결법 중 일부를 제시한다. 그러나 이중지불을 막기 위해서 제 3자의 개입이 필요하게 된다면 이 또한 우리가 원했던 주요한 이점이 사라지게 된다. 그래서 우리는 peer 2 peer network를 활용하여 이중지불의 해결방법을 제시하고자 한다. 네트워크는 해..

Blockchain 2022.10.29

[Blockchain] 블록체인과 P2P네트워크 그리고 분산 시스템

오늘 여유가 생겨서 블록체인 관련 글을 몇 가지 읽어봤는데 굉장히 잘 설명된 글이 있어서 블로그에 소개하고자 한다. 간단하게 알아볼 수 있는 좋은 내용으로 블록체인에서의 P2P 네트워크에 대해서 간략하게 알아보도록 하겠다. 참고로 영문을 읽으면서 옮겨 적어서 조금은 문맥이 딱딱하게 느껴질 수도 있다. 우선 P2P 의 개념에 대해서 알아보자. (첫번째 링크 참고) 최근의 client-server의 구조는 웹사이트의 페이지와 데이터베이스, 미디어 등을 저장하는 서버가 있는 구성이다. 그리고 클라이언트는 이에 대한 access 를 요청하는 형태로 이루어진다. 분산화된 P2P 시스템은 좀 더 커뮤니티 중심적인 면이 크다. 이 모델에서는 서버는 없고 모든 요소가 하나의 작은 서버라고 볼 수 있다. 모든 노드들이 ..

Blockchain 2022.10.29

[Java] Method Reference 사용법

Method reference 라는 기능이 있다. 알고보면 원래 눈에 익은 기능인데 그 이름이 Method Reference 라고 불리는지 몰랐을 뿐이다. 아래와 같이 표현할 수 있는 것을 Method Reference 라고 한다. 메소드 레퍼런스는 아래의 세가지 종류가 있다고 한다. 1. static 메소드 레퍼런스 2. instance 메소드 레퍼런스 3. Constructor 메소드 레퍼런스 메소드 레퍼런스는 ClassName::MethodName 형식으로 입력하면 된다. 메소드를 호출하는 것이지만 괄호가 생략되는 것이다. 그래서 사용하기 전에 메소드의 인자와 리턴 타입을 알고 있어야 한다고 한다. 또한 주로 람다실을 작성할때 많이 사용한다고 한다. static 메소드 레퍼런스는 역시 static ..

Java 2022.10.28

[Java] JIT 컴파일러란? (Just in time compiler)

Java에서 JIT 컴파일러라는 단어를 들어보았을 것이다. 들어보긴 했는데 시간이 지나면서 기억하고 있던 개념이 맞는지 희미해져서 이참에 내용 정리를 해보려고 한다. 기존 컴퓨터 프로그램을 만드는 방법은 두 가지가 있는데 그게 바로 인터프리트 방식과 정적 컴파일 방식이다. 인터프리트 방식은 실행 중에 언어를 읽으면서 대응되는 기계어 코드를 실행하는 것이고 정적 컴파일은 실행하기 전에 이미 프로그램 코드를 기계어로 번역을 마쳐놓는 방식이다. 우선 Just in time Compiler 라는 뜻이고 위에서 언급한 두 가지 방식을 혼합한 방식이라고 생각하면 된다. 실행 시점에 인터프리트 방식으로 기계어 코드를 생성하는데 그 코드를 캐싱해서 같은 함수가 여러 번 불릴 때 매번 기계어 코드를 생성하는 것을 방지한..

Java 2022.10.28
반응형