전체 글 462

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

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

블록체인 2022.10.29

[Java] Method Reference 사용법

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

Java lang 2022.10.28

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

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

Java lang 2022.10.28

[2022 하반기 근황] 평화로움 속의 꾸준함

최근 만들고 싶은걸 만드는 중이라 행복 코딩중이다. 진짜 원하는 걸 만드는게 개발의 재미라는 걸 새삼 느낀다. 개발은 뚝딱거리는게 가장 재밌다. 공부하고 싶었던 내용도 자유롭게 공부하고 있어서 좋다. 나름대로 재미를 느낀 분야가 생겼는데 전적인 시간을 쏟아붓진 못해도 나름 시간을 내서 공부하려 애쓰고 있다. 책도 꾸준히 읽어볼까 한다. 코딩하는 시간이 많다보니 문제를 풀던 개인 프로젝트를 만들던 하루종일 코드만 짜는 느낌이 들었다. 그래서 블로그도 서치해보고 커뮤니티에 계신 다른 개발자들은 뭘 이야기하고 개발 유튜버들은 무슨 이야기를 하고 있는지 여유를 갖고 찾아보고 있다. 최근 개인 프로젝트를 좀 더 발전시키기 위해 리차드 리스의 을 읽고 있는데 시간 가는줄 모르고 읽고 있다. 매일 코딩만 하지말고 책..

생각들 2022.10.27

[Blockchain] MerkleTree 코드 분석 및 구현 with Java

최근 개인 프로젝트를 진행하면서 Merkle Tree를 직접 구현해서 사용할 일이 생겼다. 파일 공유 서비스를 만들고 있는데 기존에 있었던 Merkle Tree 의 개념은 대용량 파일을 전송할때 응용해볼까 생각하고 있고 그 외에 개인적으로 MerkleTree 개념 자체를 새롭게 응용해서 FileTree라는걸 만들어볼까 생각하고 있다. 우선 개념부터 살펴보자. Merkle Tree는 일종의 해쉬 트리라고도 말할 수 있는데 개념이 워낙 간단해서 그냥 각 트리의 노드에 Hash값을 저장하는데 left와 right 자식의 Hash값을 더하여 Hash한 값을 그 부모가 다시 갖고 있는 구조이다. 즉 이렇게 거슬러 올라가면 root에 가서는 한개의 Hash 값이 나올 것이고 이 값은 leaf부터 hashing을 하..

블록체인 2022.10.27

[Java] 함수형 인터페이스

함수형 인터페이스는 오직 1개의 추상 메소드를 갖는 인터페이스를 말한다. Java8 부터 인터페이스가 구현체는 물론 Default Method 까지 포함할 수 있다고 한다. 그런데 이러한 요소들이 얼마나 있는지와는 관계없이 추상 메서드가 딱 하나 있다면 그걸 함수형 인터페이스라고 부른다고 한다. @FunctionalInterface 어노테이션을 사용해서 조건에 맞는지 검사할 수 있다. 또한 Java에서 기본적으로 제공하는 Functional Interface가 있다고 한다. 사실 실제로 Functional Interface 를 직접 만들어서 사용하는 경우는 드물고 이미 만들어져있는걸 주로 사용한다고 한다. 어디선가 한번쯤은 들어밨을 법한 Functional Interface들은 아래와 같다. 1. Pre..

Java lang 2022.10.24

대용량 파일 전송에 UDP가 적합하지 않은 이유

최근에 파일 공유 서비스를 만들고 있는데 클라이언트 단에서 파일을 암호화한 뒤 그 CipherText를 다른 Client에게 전송하는 기능을 구현할 일이 생겼다. 물론 CipherText자체가 꽤나 짧은 String이라서 전송하는 Data의 사이즈가 문제되진 않을 것이라고 생각했다. 하지만 추후에 대용량 파일 전송도 염두에 두고 있었기 때문에 TCP와 UDP 중 어느 것을 쓸지 고민하고 있었다. (물론 TCP를 당연히 써야겠다고 생각했지만 UDP를 쓸 순 없을까 고민하고 있었다.) 물론 File 전송은 비디오나 오디오가 아니기 때문에 전송에 있어서 확실한 보장이 필요하다. 그래서 대충은 결국은 TCP를 써야겠다고 생각하고 있었다. 실제로 TCP의 예로써 File전송이 언급되곤 한다. 하지만 개인적인 취향..

개발 정보 2022.10.24

개발자의 성장

최근 개발자의 성장에 대한 이야기가 많이 나오는 것 같다. 개발 유튜버들의 주제에서도 언급되고 트위터에서도 많은 의견이 오고 갔다. 개인적인 생각을 이야기하자면, 개발자의 성장이 업무 시간 외의 투자를 의미한다면 동의할 수 없다는 쪽이다. 일을 끝내고 퇴근한 뒤 해결하지 못했던 문제에 대해 고민하고 몰랐던 내용에 대해 공부하는 것은 좋지만 그것을 의무로 느껴서 반드시 해야한다고 스스로를 몰아붙일 이유는 없다고 생각한다. 종종 주변에서 일하고 계신 현직자분이나 아직 학생인 친구들의 이야기를 들어보면 개발자라는 직업과 본인의 정체성을 동일시하는 경우가 있는 것 같다. 인생에 있어서 직업이 큰 비중을 차지하는 것도 맞는 말이고 개인의 정체성 형성에 큰 영향을 끼치는 것 또한 마찬가지이지만 그것을 자신의 정체성..

생각들 2022.10.20

[Python3] python3의 itertools.groupby 사용

문제가 풀리지 않아서 솔루션을 찾아보던 중 처음보는 function을 사용하는 솔루션을 보게 되었다. groupby 라는 function 인데 이런걸 본적이 있나 싶었다. 검색을 해보니 pandas 에서 사용하는 groupby 가 가장 먼저 나왔다. 하지만 좀 더 찾아보니 pandas 의 groupby가 아니라 itertools 의 groupby 였다. pasdas groupy는 같은 값을 하나로 묶어 통계 또는 집계를 위해 사용한다고 한다. 만약 도시 별로 가격 평균을 구한다고 가정하면 아래와 같은 코드가 나올 수 있겠다. object.groupby('city').mean() 자세한 내용은 다음 링크에서 찾아볼 수 있다. https://ponyozzang.tistory.com/291 itertools의..

[C++] 임시 객체란 무엇인가? Temporary Object?

최근에 공부를 하던 중 교수님게서 C++ lock guard의 특정 동작에서 발생하는 버그를 말씀해주시면서 임시 객체라는 표현이 등장했다. 임시 객체라는 표현이 들어본 것 같으면서도 정확히 뭔지는 모르고 있다는 생각이 들었다. 예상하기론 다른 동작을 위해 생성되어 잠시 동안만 존재하고 희생적으로 사용되는 객체일 수 있겠다는 추측을 했다. 추측을 하고 났으니 이제 정확한 개념에 대해서 알아보자. 임시 객체는 실행 도중에 잠깐만 사용되는 객체이다. 소스 코드에도 없는 힙 이외의 공간에 생성된다고 한다. 그런데 임시 객체는 성능 저하를 유발하는 원인이 되기 때문에 Call by reference를 해서 임시 객체를 만들어주지 않는 것이 좋다고 한다. 참고로 이 예제는 C++을 예시로 들어 설명하고 있는 예제를..

C & C++/C++ 2022.10.19

[BOJ] 백준 2529 부등호 - Java 풀이

최근에 백준을 풀던 중 꽤 흥미로운 문제를 발견했다. 시간이 오래걸리기도 했는데 과정에서 꽤 재미를 느꼈다. 또한 배울점이 많은 코드라는 생각이 들어서 첨부했다. 조금 어렵다는 생각이 들기도 했는데 문제 자체가 굉장히 흥미로워서 그냥 붙잡고 불었다. 원래 좀 어려운 문제를 만나면 약간의 스트레스가 생기기 마련인데 이 문제는 그냥 재밌는 문제다. 다른 분들도 이 문제는 꼭 답지 보지 말고 풀어봤으면 한다. 백트래킹 문제인데 부루트포스도 같이 사용해서 풀 수 있는 문제이다. 문제는 아래와 같다. 문제 링크: https://www.acmicpc.net/problem/2529 자 간단하게 dfs 순회하면서 모든 가능한 경우의 대해서 돌아보면 된다. 물론 백트래킹 특성에 따라서 특정 조건에 따라서 가지치기하는 조..

[GDSC] GDSC 1기 합격 후기 (Google Developer Student Clubs)

우리 학교에서 진행하는 GDSC 1기에 합격했다. 면접을 보고 나서 떨어졌다고 생각했는데 며칠 뒤 Lead 님으로부터 온 메시지를 받고나서야 붙었다는걸 실감했다. GDSC에서는 스터디, 프로젝트 진행과 솔루션 챌린지를 하게 된다고 한다. 솔루션 챌린지에 대한 정보가 없었는데 찾아보니 지정된 몇가지 이슈에 대한 프로젝트를 진행한다고 한다. 환경, 에너지 등등 다양한 이슈가 주제로 나올 수 있다고 한다. 무엇보다 좋았던 것은 기술에 대해 자유롭게 말할 수 있는 공간이 생긴 점이다. 의견을 말하고 피드백을 받을 수 있는 공간이 필요했었는데 GDSC가 그 역할을 해줄 수 있다는 생각이 들었다. 다른 개발자들은 어떤 것을 공부하고 있고 기술에 대해 어떻게 생각하는지 항상 궁금했었다. 평소 기술에 대한 최신 정보를..

[Gradle] 일반 Java 프로젝트 진행 중 Gradle 로 프로젝트 변환하기

아래 블로그에서 도움을 받았다. 감사합니다. 는 아니고 임의로 gradle 파일들 설정하다가 완전 꼬여버렸다. 그냥 Gradle 프로젝트 새로 파서 거기로 옮겨주자. https://pmandocom.tistory.com/102 [JAVA] IntelliJ - 일반 JAVA 프로젝트를 Gradle 프로젝트로 변환하기 & Java file out of source root 오류 해결 공식 홈페이지를 참고했다. 1. 프로젝트 폴더에 build.gradle을 생성한다. 2. build.gradle에 다음의 내용을 넣는다. plugins{ id 'java' } group 'org.example' version '1.0-SNAPSHOT' repositories { mavenCen.. pmandocom.tistory..

Java lang 2022.09.29

[GDSC] GDSC 1기 면접 후기 (Google Developer Student Clubs)

GDSC 1기에 서류 통과했다는 소식을 주말에 전해들었다. (참고로 GDSC는 Google Developer Student Clubs의 약자로 구글에서 진행하는 프로그램이다. 구글 기술에 관심있는 전세계 대학생들을 대상으로 진행하는 프로그램이고 자유로운 스터디와 기술 세션 등이 진행되는 프로그램이다.) 이후 면접을 진행하게 되었는데 선착순으로 면접 시간을 정할 수 있어서 오늘 오전 9시와 10시 사이로 잡게 되었다. 면접은 Lead 님께서 직접 참여하셔서 일대일로 진행했다. 분위기를 편하게 만들어주시려고 배려해주시는 점이 감사했다. 최근 근황, 관심있는 분야 등에 대해 가볍게 물어보셨다. 특히 말하는 내용을 모두 경청해주시면서 최대한 내 이야기를 할 수 있도록 이끌어주신 점이 감사했다. 평소에 말하고 싶..

[Git] Hyper-v 설정 적용 이후 Git push 에러

최근 실습때문에 Hyper-v 를 on으로 바꿀 일이 있었는데 이후에 코딩을 하던 중 git push origin main이 먹히질 않는 문제를 발견했다. 보기에는 단순히 로그인 access가 만료되었다고 떠서 다시 로그인하면 될 것 같은데 사실 문제는 그게 아니다. Hyper-v를 켜둬서 문제가 생긴거다. 왜 Hyper-v가 영향을 준건진 모르겠지만 방금 확실하게 테스트해본 결과 Hyper-v를 켜두면 git push 가 안먹히고 Hyper-v를 꺼두니 이제서야 git push 가 잘 먹힌다. 어떤 연관관계가 있을까. 지금은 모르겠다. 확실한건 도커든 뭐든 간에 뭘쓰다가 이상하다 싶으면 혹시 며칠전에 Hyper-v 관련해서 작업해본 적이 있었는지 떠올려보면 될 것 같다.

인프라/Git 2022.09.21

[SW] SOLID 원칙이란 무엇인가?

SOLID 원칙이란 무엇인가? SRP (Single responsibility principle): 단일 책임 원칙이다. 즉 클래스는 하나의 책임만 가져야 한다는 뜻이다. OCP (Open/closed principle): 개방-폐쇄 원칙이다. 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다는 뜻이다. LSP (Liskov substitution principle): 리스코프 치환 원칙으로 프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다는 뜻이다. ISP (Interface segregation principle): 인터페이스 분리 원칙이다. 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다는 뜻이다. DIP ..

개발 정보 2022.09.18

특출난 재능을 이길 수 있는 것은 꾸준함뿐이다.

말그대로다. 천재를 이기려면 꾸준히 시간을 갈아넣는 방법 말고는 없다. 천재를 이기기위한 지름길 같은건 없다. 아무리 멀어도 빙빙 돌고 돌아서 시간과 피땀을 갈아넣으면 어쩌면 언젠가는 넘을 수 도 있다. 그외의 방법은 없다. 일반적인 사람은 천재가 아니니까. 특출난 재능을 이길 수 있는 것은 꾸준함뿐이다. 꾸준히 길을 찾다보면 답이 보일거라 생각한다. 지금은 어두워서 한치 앞도 못볼 수도 있다. 아직 많이 부족해서라고 생각한다. 자신이 맞는 길이라고 확신한 길을 계속 걷다보면 언젠가 기회는 찾아온다. 확신이 흔들릴때는 가능성과 판단의 합리성을 의심해야지 나를 의심하면 안된다. 기회를 잡고 성취하면 다시 또 나아가면 된다. 그렇게 아주 조금씩 걸어가면 된다. 천재성, 꾸준함, 노력, 열정, 행운 중에서 가..

생각들 2022.09.17

개인 프로젝트 준비

최근 그동안 해온것들을 돌아봤는데 프로젝트가 너무 빈약하다는 생각이 들었다. 미완성으로 끝난 프로젝트도 있었고 뭔가 제대로 완성된 결과물이 빈약하다는게 아쉬웠다. SpringBoot를 사용해서 여러 프로젝트에 참여했지만 스스로 너무 부족하다는 생각이 들었다. 어떤 기술을 쓰던 원하는 결과물을 만들어내는게 중요하다고 생각해서 이번에 개인 프로젝트를 제대로 만들어볼까 생각중이다. 생각해보니 개인 프로젝트를 제대로 진행해본 적이 없는 것 같다. 진짜 만들어보고 싶은게 뭔지도 진지하게 생각해본 적이 없던 것 같다. 지금 상태에선 Django와 SpringBoot 를 사용할 수 있는데 Flask 를 사용해서 만들어보고 싶은 것도 구상중이다. 이후에 좀 더 퀄리티를 높여서 SpringBoot를 사용해서 뭐든 결과물..

생각들 2022.09.15

[LeetCode] LeetCode 1576. Replace All ?'s to Avoid Consecutive Repeating Characters - python3

간만에 재밌는 문제를 만났다. 1576. Replace All ?'s to Avoid Consecutive Repeating Characters 문제인데 문제 자체도 재밌고 풀이 방식을 보던 중 꽤나 기발한 접근법을 보게 되어서 인상깊어서 기록해둔다. 우선 문제 링크는 아래와 같다. https://leetcode.com/problems/replace-all-s-to-avoid-consecutive-repeating-characters/ Replace All ?'s to Avoid Consecutive Repeating Characters - LeetCode Level up your coding skills and quickly land a job. This is the best place to expan..

[LeetCode] LeetCode 1572 - matrix-diagonal-sum - Python3

최근 심심해서 리트코드 문제를 몇개 풀었는데 그 중 재밌는 문제가 몇개 있어서 정리해본다. 1572번 문제이다. EASY인데 첫번째 솔루션에 비해서 코드를 꽤나 효율적으로 개선해서 정리해볼 필요가 있다고 생각해서 적어둔다. 일단 아래는 첫번째 제출한 솔루션이다. 꽤나 비효율적이라는걸 알 수 있다. 일단 for loop 이 두개 있다는것부터 비효율적이다. ''' Runtime: 207 ms, faster than 24.29% of Python3 online submissions for Matrix Diagonal Sum. Memory Usage: 14.1 MB, less than 57.39% of Python3 online submissions for Matrix Diagonal Sum. ''' class..

[스타트업 인턴] 하계 인턴 계약 만료. 다시 학교로 돌아가다.

두 달간의 인턴 기간이 오늘부로 끝났다. 오늘까지 두 달간의 기간 동안 많은 일들을 해보았다. 처음에 자바 안드로이드 라이브러리 개발로 지원했는데 면접 당시 옆에 계신 분께서 파이썬과 장고를 활용한 백엔드 개발 포지션을 추천해주셔서 응하게 된 것이 계기였다. 솔직히 말해서 오히려 좋았다. 원했던 포지션이 아니었음에도 뭐가 되었든 백엔드 개발을 할 수 있다는 점이 마음에 들었다. 이곳에서 일하면서 가장 좋았던 점은 만났던 사람들이라는 생각이 든다. 밥도 같이 먹고 오후 근무 시작전까지 많이 떠들었다. 물론 당연히 기술적으로도 많은 걸 배우고 경험할 수 있었다. 실수를 해서 다행이라는 생각이 들었다. 그 부분에서 문제가 나타나지 않았더라면 언젠가 더 큰 장애로 이어졌을 수도 있었겠다는 생각이 들었고 동시에 ..

[Django] Django 에서 테스트 코드 부분 실행하기

만약 테스트 코드를 일부 실행하고 싶다면 아래와 같이 진행하면 된다. app 명 + 테스트 코드 디렉토리명 + 테스트 코드 .py파일명 + 테스트 코드 클래스 + 테스트 클래스 메서드 명 순으로 적어주면 된다. # Run the specified module python3 manage.py test catalog.tests # Run the specified module python3 manage.py test catalog.tests.test_models # Run the specified class python3 manage.py test catalog.tests.test_models.YourTestClass # Run the specified method python3 manage.py test c..

Python3/Django 2022.08.18

[Django] CommandError: You must set settings.ALLOWED_HOSTS if DEBUG is False.

Django 를 production 상에서 운용할때는 반드시 DEBUG = False 로 두고 실행해야 한다. 그 이유는 DEBUG = True 로 두고 운용을 하게 되면 서버 운용 중 발생한 오류가 사용자에게 보이기 때문이다. 이 때문에 해커가 프로젝트의 구조를 파악할 수도 있게 된다. 그래서 반드시 DEBUG=False 로 두고 운용해야 하는데 막상 DEBUG = False 로 두고 runserver 를 돌리니 다음과 같은 에러가 발생했다. CommandError: You must set settings.ALLOWED_HOSTS if DEBUG is False. 어떻게 해결할 수 있을까? 해결법은 간단하다. 에러 로그가 하는 말 그대로 진행하면 된다 . settings.py 에 있는 ALLOWED_H..

Python3/Django 2022.08.18

[Django] drf-yasg가 적용되지 않을때 + ImportError: cannot import name 'url' from 'django.conf.urls' + frozen importlib

Django 를 사용해서 api 개발을 하던 중 api 스펙을 자동으로 생성해주는 drf-yasg 를 사용하려고 했다. 그런데 계속 frozen importlib 에러가 지속적으로 발생했고 django.conf.urls 에서 url 을 import 할 수 없다는 에러가 발생했다. 근데 당시에는 너무 바쁘고 일이 많아서 api 자동 생성을 후순위로 밀어두고 기능 개발을 빠르게 진행했었다. 그러다가 다시 api 를 살펴볼 일이 생겼는데 아예 오늘 drf-yasg 오류를 잡고 api generation을 끝내자고 생각해서 문제를 해결하게 되었다. 우선 ImportError: cannot import name 'url' from 'django.conf.urls' 는 버전 이슈다. 스택오버플로우를 참고한 결과 아..

Python3/Django 2022.08.18

[Github] private repository 에 push하기 + ssh-keygen

private repository 에서 작업하면서 인증키를 등록해놓은 상태여서 push 하는데 문제가 없었다. 다만 문제는 근 몇주간 클라우드 세팅때문에 코드 작업을 거의 진행하지 못했는데 갑작스레 인증키가 invalid 하다는 에러가 떠서 push 가 되지 않았다. 우선 아래와 같은 명령어를 입력해주자. $ ssh-keygen 이후 passphare 등을 묻지만 그냥 엔터로 입력하고 지나가도 무방하다. 그리고 나서 키가 생성되는 위치와 함께 키 생성이 완료됬음을 알 수 있다. 그리고 cat 명령어를 통해 id_rsa.pub 키를 알아낸다. 자 이제 이 pub 키를 github 에 가서 등록해줘야지만 private repository 에 push 를 할 수 있다. 그리고 이후 아래와 같은 과정을 거쳐서 ..

인프라/Git 2022.08.18
반응형