목록분류 전체보기 (145)
쿼카러버의 기술 블로그
Writing is easy, but reading is painful. 개발자로 살다보면, 코드의 가독성을 높이고 협업하기 좋은 코드를 작성하고자 하는 욕심이 있을 것이다. 특정 프로그래밍 언어를 잘 사용할 수 있다고 하려면 복잡한 문제를 해결해내는 코드 작성뿐 아니라 누군가와 협업을 하고, 서로 이해 가능한 코드를 짤 수 있어야 하는데, 이를 위해서는 규칙과 convention이 필요하다. Go에서는 이를 “Go를 Go답게 쓴다"라고 표현하는데 이와 관련해서 잘 정리된 글들과, Go Effective의 글들을 참고해서 “Go를 Go답게” 쓰는 방법에 대한 시리즈를 다루고자 한다. 다른 시리즈로는 Go의 주석(Comment) 컨벤션에 대해 정리한 글이 있는데 참고 바란다. 본 글에서는 go의 Namin..
JWT는 개발자라면 지겨울정도로 들어봤거나 사용해볼법한 인증 방식이다. 필자도 마찬가지로 JWT를 많이 사용해 봤지만 구체적인 개념들에 대한 정리가 안돼있었다. 그래서 본 글에서 간단하게 정리해보려고 한다. 자 그럼 시작해보자~ JWT란? JWT는 사용자 인증을 위해 사용하는 open standard(RFC 7519)다. Json포맷을 이용하여 Self-Contained 방식으로 사용자에 대한 정보를 저장하는 Claim기반 Web 토큰이다. 기본적인 컨셉은 IdP(Identiy Provider)가 사용자의 정보를 담은 내용에 서명함을 통해서 토큰을 만들고, 유저가 서버에 요청할 때 사용하도록 하는데, 이 때 토큰의 integrity와 authenticity를 보장한다는 점이다. 쉽게 말해서 유저가 전송하..
Go언어는 byte stream 을 다루는 프로그래밍 언어다. 다시 말해서 바이너리 데이터를 읽거나 쓸 때 byte형식을 주로 사용한다. network connection으로 부터 넘어오는 데이터를 파일로 저장하거나 처리해야 하는 경우 등의 경우에 모두 byte stream을 다룰 수 있어야 한다. 많은 라이브러리에서 io package를 활용하기 때문에 본 글에서는 golang에서 I/O를 처리할 때 byte stream을 다루는 기본적인 방법에 대해 알아보는 시간을 갖도록 해보자. 매우 간단한 기능이지만 정말 많은데 활용될 수 있다는 점에서 매우 흥미롭고 멋있다. 본 글의 기본적인 골자는 Go의 Walkthrough시리즈를 읽으면서 정리하는 거지만, 그 외에도 내가 몰랐었던 디테일들을 채워 나중에 참..
Go는 바이트(bytes)를 사용하여 작업하기 위해 만들어진 프로그래밍 언어다. 근데, gin 프레임워크나 HTTP request 처리하다보면 바이트를 다루기 위한 io 패키지를 사용하다가 아찔한 함정에 빠질 수 있다. 그 함정은 ioutil.ReadAll()이나 이를 활용하는 ctx.GetRawBody()와 같은 메서드 등을 통해 request의 Body를 한 번 읽고나면 다시 읽을 수 없다는 점이다. 이는 컨텐츠를 모두 읽어냈기 때문인데, gin뿐 아니라 http패키지의 Request의 Body를 읽을 때도 마찬가지다. (당연한 소리) (io.Reader를 통해 stream을 한번 읽고나면 idx가 뒤로 가기 때문에 다시 읽을 수 없음) 하지만 API를 개발하다보면, Request Body의 내용을 ..
Jupyter Notebook과 Git을 함께 사용하는 경우에는, 코드의 버저닝이 매우 까다롭다. 코드를 제외한 output부분 까지 계속 diff에서 체크가 되기 때문이다. 이는 Notebook파일이 JSON Format으로 데이터를 저장하기 때문이고, cell안에 들어가는 데이터가 코드인지, output인지에 대한 구분을 컴퓨터가 자동으로 해주지 않는다. 그렇다고 매번 작업이 끝날 때마다 output을 지우자니 너무 귀찮다. 프로그래머라면 이를 자동화하고 싶은 욕심이 생길 것이다. 이는 git filter와 nbstripout을 활용해서 해결할 수 있다. - git filter는 working directory에서 git으로 파일이 업데이트 될 때 해당파일을 처리해준다. (clean filter나 s..
Lambda 함수란 파이썬에서 lambda는 런타임에서 생성해서 사용할 수 있는 익명 함수다. 자바스크립트에서의 람다 함수와는 조금은 다르다. 특징 : 람다는 N개의 매개변수를 가질 수 있지만, 하나의 expression만 허용한다. (아래 예시를 보면 이해가 될 것이다.) lambda arguments: expression 한번만 사용되거나 코드에서 아주 잠깐 동안 실행되는 코드에 주로 활용한다. map, filter, reduce와 같은 built-in 함수에 주로 같이 사용된다. 람다 함수의 장점 : 람다함수를 사용하는 경우는 코드가 간결하고, 메모리가 절약된다. 코드에서 lambda함수 다음 줄로 넘어가면 Heap 영역에서 증발하게 된다.(단발성으로 사용할 때 유용) (모든 것이 객체로 관리되는 ..
Reduce reduce()함수는 여러개의 데이터를 대상으로 누적 집계를 내기 위해 사용되는 함수다. reduce함수를 한 줄로 설명하자면 iterable를 단일 값으로 줄이기(reduce)위해 iterable의 element들을 왼쪽에서 부터 오른쪽으로 매개변수로 넘어온 함수에 대해 누적적용하는 built-in함수다. 당연히 내가 써놓고도 무슨말인지 잘 모르겠다. 이해하고보면 잘 정리가 된 글이지만, 이런 류는 그냥 예시를 보고 이해하는게 가장 편하다. 특징 reduce(집계 함수, 순회 가능한 데이터[, 초기값]) 집계 함수는 두 개의 인자를 받는다. 첫 번째 인자는 누적자(accumulator), 두 번째 인자는 현재값이 넘어오게 된다. 누적자는 함수 실행의 시작부터 끝까지 계속해서 재사용되고, 현..
Filter filter()는 파이썬의 내장 함수로, 여러 개의 데이터에서 특정 조건으로 일부의 데이터를 추려낼 때 사용한다. 특징 기본적인 사용방법은 아래와 같다. filter(function, iterator) iterator에 들어온 값들을 하나하나 function에 넣어서결과가 참인지, 거짓인지에 따라 해당 요소를 포함할지 말지를 결정한다. 사용 예시 1) letter라는 리스트 내에서 vowel만을 걸러내고 싶을 때 letters = ['a', 'b', 'd', 'e', 'i', 'j', 'o'] # a function that returns True if letter is vowel def filter_vowels(letter): vowels = ['a', 'e', 'i', 'o', 'u'] ..