2019의 게시물 표시

유용한 Github 관련 크롬 익스텐션 소개

이미지
안녕하세요! 제 이름은 taeguk 입니다~ ( 갑자기? ) 오늘은 가벼운 주제로 포스팅해보려고 합니다. 다들 github 많이 사용하실텐데요~ 오늘은 제가 사용하는 크롬 확장 프로그램들중에서 github 를 사용할 때 아주 유용한 것들을 소개해드리는 시간을 가져보려고 합니다^^ 1. Refined Github 이거는 진짜 필수입니다!! 이 확장 프로그램은 github 웹페이지 자체를 아주 화끈하게(?) 바꿔버립니다! 정말 UI 가 더 예쁘고 사용성있게 변경되는데요. 그 외에도 다양한 기능들을 추가로 제공해줍니다. 예를 들면 다음과 같습니다. 아래 사진은 익스텐션 적용 전 & 후 인데요. 적용 후에 UI 가 더 정돈되는걸 볼 수 있습니다. 뿐만아니라 OpenAll 과 같은 버튼을 추가적으로 지원하는 것을 볼 수 있습니다. 그 외에도 제공해주는 기능이 무척 많은데요! 자세한 것은 깃허브 를 참고하시기 바랍니다. 참고로 오픈소스계의 유명인사(?) Sindre Sorhus 님이 개발하셨습니다! 짱짱bb 2. Octotree 이건 github 상에서 코드베이스를 분석할 때 매우 유용한 확장 프로그램입니다. 보통 github 에서 소스파일을 왔다갔다 하면서 코드를 보기가 매우 불편한데요. Octotree 를 사용하면 마치 IDE 를 사용하는 것처럼 편하게 여러 개의 소스파일들을 드나들면서 코드 분석이 가능합니다. 위 사진에서 볼수있듯이 브라우저의 왼편에 navigator 가 생겨서 그걸 이용해서 편하게 원하는 소스파일을 찾아갈 수 있습니다. 또 추가적으로 특히나 좋은 것은 PR 의 diff 를 확인할때 유용하게 활용이 가능하다는 것입니다. 이 경우에는 변경된 파일들에 대해서만 트리가 구성되서 코드리뷰시 아주 유용하게 활용이 가능합니다 :) 근데 octotree 를 사용하시다보면 위와 같은 에러를 볼 때가 있을텐데요. 이는 octotree 가 내부적으로 사용하는 Github API 에서 API 횟수 제한을 두고 있기 때문에 ...

Akka typed 소개

안녕하세요~ 오늘은 akka 의 새로운 인터페이스 (API) 인 akka typed 에 대해서 소개시켜드리는 시간을 가져볼까 합니다! Akka 및 액터 모델에 대한 기본적인 내용은 이미 알고 있다고 가정하며 scala 를 기반으로 설명하겠습니다. 기존 akka 에서의 문제점 akka 는 훌륭한 프레임워크이지만 인터페이스 (API) 상으로 아쉬운 부분들이 있습니다. class EchoStringActor extends Actor { def receive = { case str : String => sender ( ) ! str case _ => sender ( ) ! "Unexpected message" } } 메세지의 타입이 Any 입니다. Java/scala 는 정적 타이핑 언어로서 컴파일타임에 타입시스템을 이용해 많은 오류를 사전에 차단시켜줍니다. 그러나 akka 의 인터페이스에서는 액터가 받는 메세지의 타입이 Any 입니다. 따라서 정적 타이핑의 이점을 전혀 누릴수가 없습니다. 만약에 개발자가 실수로 특정 타입의 메세지를 처리하는 것을 깜박하더라도 컴파일 에러가 나지 않습니다. 액터들이 어떤 메세지를 서로 주고받는지가 명확하게 드러나지 않아서 저는 전체 액터 시스템을 분석하고 유지보수할 때 상당히 복잡하고 머리속에 정리가 잘 안된다는 느낌을 많이 받았습니다. 함수형 스타일이 아닙니다. Actor 를 정의하기위해서는 Actor 클래스를 상속받아서 새로운 클래스를 만들어줘야 합니다. 메세지 처리 함수를 변경하기 위해서 become() 을 사용해야 하고 액터 내부의 상태를 mutable ( var ) 로서 관리해야 합니다. 저는 이로 인해 액터 코드가 상당히 복잡하고 스파게티처럼 꼬여있는 것 같다는 느낌을 많이 받았고 코드를 분석하고 유지보수하는게 까다롭다고 느꼈습니다. 그러면 akka typed 은 이러한 문제들을 어떠...

Purely Functional Business Logic In Scala

안녕하세요~ 오늘은 스칼라에서 비지니스 로직을 purely functional 하게 설계하는 방법에 대해서 소개해볼까 합니다. 함수형 프로그래밍, 스칼라, cats, DDD 에 대해서 알고 계시면 이해가 수월하시겠지만 모르시는 분들을 위해서 기본적인 설명도 같이 첨부해두었습니다. 다루는 내용 cats 의 RWST (ReaderWriterStateT) 를 활용해서 핵심 비지니스 로직을 purely functional 하게 작성하는 방법 그렇게 작성된 비지니스 로직을 DDD (Domain Driven Development) 설계에서 사용하는 방법 비지니스 로직에 대한 고찰 소프트웨어 설계와 개발에 있어서 가장 중요한 건 요구사항 분석이라고 생각합니다. 그리고 그러한 요구사항을 처리하기 위한 로직 (즉, 비지니스 로직) 을 잘 구현하고 테스트하는 것이 개발에 있어서 가장 우선순위라고 생각합니다. DDD (Domain Driven Development) 에서는 이러한 비지니스 로직들을 도메인 레이어에 위치시키고 핵심 도메인 엔티티와 규칙을 나타내는 코드는 세부 구현 (어떤 DB 를 사용하는지, 어떤 라이브러리를 사용하는지, 외부와 어떻게 통신하는지 등등) 에 의존하지 않도록 설계합니다. 자, 그렇다면 비지니스 로직을 도메인 레이어에 따로 분리시키고 세부 구현사항들과의 의존성을 제거하면 실질적으로 어떤 장점들이 있을까요? 인터넷에 검색해보시면 많은 이야기들을 보실 수 있는데요. 제가 경험한 장점들을 살짝 나열하자면 다음과 같습니다. 비지니스 로직과 요구사항들이 한눈에 들어오고 관리가 용이해집니다. 세부구현과의 의존성이 적으므로 테스트가 용이해집니다. 추후에 프레임워크나 기반 인프라를 변경하는 것이 용이해집니다. (보통 프레임워크나 인프라 위에서 비지니스 로직을 구현하는 것이 자연스럽다고 생각하실 수도 있지만 DDD 에서는 비지니스 로직이 가장 안쪽에 레이어에 위치하고 프레임워크나 인프라는 바깥 레이어에 위치하도록 하기때문에 이런...

SHA-256 구현

이미지
안녕하세요. 오늘은 SHA-256 알고리즘에 대해 간단하게 설명하려고 합니다~ 이 포스팅에서는 SHA-256 의 수학적인 원리나 구현 최적화 기법에 대해서는 다루지 않습니다. 설명을 위해 최소한으로 작성한 C++ 코드를 통해 SHA-256 의 내부 로직이 어떻게 구성되어 있는지 가볍게 알아보도록 하겠습니다. SHA-256 이란? 해시 함수중에 하나로서, 해시의 결과가 256bit 입니다. SHA 해시 함수 모음에 속하고 대중적으로 널리쓰이는 해시 함수중에 하나입니다. 특히 최근에는 비트코인을 비롯한 많은 블록체인 시스템에서 SHA-256 을 주로 활용합니다. SHA-256 알고리즘은 해시 대상 메시지를 전처리하는 단계과 전처리된 메시지를 바탕으로 해시를 계산하는 단계로 나뉩니다. 각 단계에 대해서 알아보도록 하겠습니다. 메시지 전처리 SHA-256 를 적용해야할 데이터를 메시지 라고 합니다. 이때 메시지 bit 의 길이가 512의 배수가 되도록 padding 을 추가하는 것이 전처리 단계에서 수행하는 작업입니다. 구체적인 규칙은 아래와 같습니다. 원본 메시지의 바로 뒤에 비트 ‘1’ 을 하나 추가한다. 메시지의 길이가 512의 배수가 되도록 메시지에 0을 추가한다. 메시지의 마지막 64bit에는 원본 메시지의 bit 길이를 적는다. (출처 : https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf ) 이러한 메시지 전처리 단계를 C++ 로 구현하면 아래와 같습니다. // Add padding to message. void PreProcess ( std :: vector < uint8_t > & message ) { auto L = static_cast < uint64_t > ( message . size ( ) ) ; // Append single '1' bit and seven '0'...

제주도 여행 (6/4 ~ 6/6)

이미지
퇴사 후 새로운 회사에 출근하기 전에 혼자서 2박 3일 제주도 여행을 다녀왔다.  국내선 비행기도 처음이였고 김포공항도 처음이였고 제주도도 처음이였다. 제주도 도착하자 마자 공항 밖의 모습 이국적인 모습의 나무를 보고서야 여행을 왔다는게 실감이 됐다.  여행 계획은 전무했다. 그냥 제주공항에서 남쪽으로 가는 아무 버스나 탑승했다. 버스에서 한 친구가 카톡으로 여기를 가보라고 해서 중간에 버스를 내리고 택시를 타서 981파크로 갔다. 여기는 레이싱하는 곳이였다. 신나게 레이싱을 했더니 스트레스가 풀리고 좋았다. 위는 레이싱이 끝나고 자율주행모드일 때 찍은 사진. 숙소에 도착했을 땐 이미 해가 지고 있었다. 숙소는 김포공항에서 비행기 탑승전 즉흥적으로 구했다. 근데 괜찮은 숙소를 잡은 것 같아서 기뻤다. 저녁에 흑돼지와 맥주를 먹으며 사람들과 같이 얘기를 나누었다. 밤에 이상하리만치 잠을 뒤척였다. 잠을 거의 자지 못하고 그냥 새벽에 숙소를 무작정 나와 산방산쪽으로 걸었다. 그러다보니 절이 나와서 절 구경을 했다. 삼배도 하고 소액의 불전금도 넣고 나왔다. 나는 권태국이다. 그렇게 동네를 돌아다니다가 다시 숙소로 돌아오니 숙소가 참 이뻤다.  이런 테라스도 있고 숙소는 참 잘 고른 것 같다. (그냥 카카오맵에서 아무데나 전화한거긴 하지만..) 그리고나서 아침을 먹으러 다시 숙소를 나왔다. 바로 근처에 바다가 있어서 참 좋았다.  저기 보이는 큰 덩어리는 산방산. 그리고 오른쪽에 튀어나온 곳은 용머리 해안. 아침을 먹고 숙소를 나와 마라도로 가는 여객선을 탔다. 바닷물이 일렁일렁~   마라도는 너무너무너무 예뻤다. 딱 도착한 순간 아 진짜 잘왔다 라는 생각이 들었다.  너무 멋있고, 자유롭고,  맛있었다. ...