책 리뷰 - '인문학도, 개발자되다'

책 소개

제 주변에는 학교를 졸업하고 만난 분들을 제외하면 개발자로 일하시는 분이 거의 없다시피 합니다. 그러다 보니 저에게 개발자의 업무 또는 어떻게 개발자가 될 수 있는지에 대해 물어보시는 분들이 가끔씩 계십니다. 하지만 저는 경력이 아직 5년이 되지 않았고, 말빨(?)이 약한 편이라 개발자라는 직업에 대해 섣불리 말씀드리기 조심스럽습니다.

그러던 와중에 ‘인문학도, 개발자되다(마르코 저, 영진닷컴)’ 라는 책을 접하게 되었습니다. 이 책은 저자인 마르코님이 개발자로 전직을 하게 된 계기와 과정, 개발자로 일하기 위해서 어떤 능력이 필요한지, 그리고 앞으로 어떻게 개발 능력을 키워나가야 될 지에 대해 이야기하고 있습니다. 끝으로는 여러 분야에서 일하고 계시는 개발자들을 인터뷰하면서 개발자의 삶도 개발의 분야만큼이나 다양함을 알 수 있었습니다.

S3 버킷의 객체가 1,000개를 넘을 때 객체 목록 조회하기

S3 버킷에는 여러 파일들을 저장할 수 있다. 그런데, 버킷에 저장된 파일의 목록을 보고 싶은 경우가 있을 것이다. 하지만, AWS의 Python SDK인 Boto3에서 list_objects()list_objects_v2() 함수를 이용하면 최대 1,000개까지의 object만 가져올 수 있다. [참고] (근본적으로는 AWS의 API가 최대 1,000개까지의 object만 가져오도록 구현되어 있다. - [참고])

이런 문제를 해결하기 위해, 다음과 같이 Paginator를 이용해 보자.

Paginator 이용하기

get_paginator()로 Paginator 가져오기

기본적으로 S3를 담당할 클라이언트를 생성한 뒤, get_paginator()로 Paginator를 가져온다. 여기서는 하나의 버킷에서 object들을 가져오기 위해 list_objects_v2를 이용한다. (Boto3 문서에서는 list_objects()보다 list_objects_v2()를 이용하는 것을 권장하니 이를 이용하자.)

Python으로 Step Functions 활동 만들기

AWS에는 Step Functions라는 서비스가 있다. 여러 개의 활동(activity)를 조합해서 순서대로 또는 반복적으로 원하는 작업을 실행할 수 있도록 해 주는 서비스이다.

일반적으로는 여러 개의 Lambda 함수를 연결해서 사용하는 경우가 많다. 하지만 Lambda 함수의 실행 시간이 5분을 넘어가면, 다른 방법을 고려해야 한다. 이럴 때 활동을 생성하고 이를 수행하는 코드를 작성하면, 오래 걸리는 작업도 Step Functions로 이용할 수 있다.

활동(Activity) 만들기

  1. Step Functions 콘솔의 왼쪽 메뉴에서 활동을 클릭한다.
  2. 화면이 바뀌면 우측의 활동 생성을 클릭하여 새로운 활동을 만든다.
  3. 활동 이름 입력 창에서 임의의 활동 이름을 입력한다.
  4. 여기서 나오는 ARN을 메모한다. 활동 이름은 알고 있어도 되지만 몰라도 상관은 없다.

상태 머신(State Machine) 만들기

  1. 콘솔의 왼쪽 메뉴에서 상태 머신을 클릭한다.
  2. 우측 상단의 상태 머신 생성을 클릭한다.
  3. 상태 머신의 이름을 입력하고, 필요한 경우 IAM 역할을 생성한다. (나를 위한 역할 생성에 체크, AWS Step Functions이 Lambda 함수에 대한... 옵션에 체크)
  4. 그리고 상태 머신 정의 칸에는 다음과 같이 입력한다. (여기가 앞에서 메모한 ARN이 사용되는 부분이다. ARN은 뒤에서도 이용하니 메모를 버리지 말자.)
{
  "StartAt": "TestActivity",
  "States": {
    "TestActivity": {
      "Type": "Task",
      "Resource": "앞에서 메모한 ARN 주소",
      "End": true
    }
  }
}

간단하게 설명을 하자면,

VSCode와 oh-my-zsh를 사용할 때 터미널 글꼴이 깨진다면

최근에 oh-my-zsh를 써 보기 시작했다. (써보면 편하다고는 하는데, 아직까지는 체감을 못하고 있긴 하다.)

그런데 Visual Studio Code에서 터미널을 쓸 때, 아래처럼 글꼴이 깨지는 현상이 있었다. (현재 테마는 “agnoster"이다.)

이 문제에 대해 찾아보니, 다음과 같은 이슈를 발견할 수 있었다.

https://github.com/Microsoft/vscode/issues/7116

여기서 제시하는 해결책은 다음과 같다.

  1. “SourceCodePro+Powerline+Awesome Regular” 글꼴을 받아 설치한다. 링크
  2. Visual Studio Code 설정에서 terminal.integrated.fontFamily 항목에 'SourceCodePro+Powerline+Awesome Regular'를 넣는다. (작은 따옴표를 포함해야 한다!)

그러면 아래와 같이 터미널의 글꼴이 깨지지 않게 된다.

RDS MySQL에서 일반/느린 쿼리 로그 찍기

RDS MySQL을 이용하면, 아래와 같이 CloudWatch에 일반/감사/느린 쿼리 로그를 찍도록 설정할 수 있다.

로그 찍기 설정(RDS 인스턴스 생성 시)

로그 찍기 설정(RDS 인스턴스 생성 시)

그리고 RDS 콘솔에 들어가면 로그 파일을 볼 수 있는데, 일반 로그나 느린 쿼리 로그를 찾을 수 없었다. 그래서 CloudWatch Logs를 찾아봤지만, 역시 로그가 없었다.

로그 파일이 없다(-_-…)

로그 파일이 없다(-_-…)

그 이유를 찾아 보니, 파라미터 그룹에 로그 관련 설정을 하지 않은 것이 원인이었다.

다음과 같이 설정하면 된다.

Git 원격 저장소에서 사용자 이름에 '@'이 들어가면 동작하지 않는 경우

부서에서 사용하는 CodeCommit에 Push를 하려고 하는데, 아래와 같은 오류 때문에 Push를 할 수 없었다.

fatal: UriFormatException encountered.
queryUrl

보통 이런 문제가 발생하면 오류 메시지를 먼저 찾아 보는 편인데, 이상하게 검색이 잘 안 됐었다. (컨디션이 안 좋아서 그랬던가…-_-) 그러다가 다음과 같은 내용을 발견했다.

https://github.com/Microsoft/Git-Credential-Manager-for-Windows/issues/587

내용을 요약하면 다음과 같다.

  • Git 원격 저장소의 사용자 이름이 이메일 주소인 경우 이러한 오류가 발생한다.
  • RFC3986에 따르면, URI에 이미 할당되어 있는 문자는 :/?#[]@!$&'()*+,;=이다.
  • @의 경우, %40으로 바꾸면(escaping) 문제를 해결할 수 있다.

위에 올라온 프로그램의 경우는 사용자 이름을 체크해서 변경이 필요하면 변경하고, 아니면 그대로 사용하는 식으로 처리한 것 같다.

AWS Lambda에서 별칭(alias)으로 함수 버전 구분하기

test라는 함수가 있고, dev, release라는 별칭(alias)이 존재한다고 하자. 그리고 모든 별칭은 동일한 버전을 가리킨다고 하자.

이 경우 context 객체의 invoked_function_arn은 어떻게 달라지는지 보자. 테스트를 위해, 다음과 같이 파이썬으로 함수를 작성하였다.

import json

def lambda_handler(event, context): 
    print(context.invoked_function_arn)
    return "Success"

그리고 CloudWatch에 기록된 로그를 보자.

dev인 경우

START RequestId: 2dce0b80-5fb4-11e8-b5b7-41e11422a67a Version: 1
arn:aws:lambda:ap-northeast-2:256724228018:function:test:dev
END RequestId: 2dce0b80-5fb4-11e8-b5b7-41e11422a67a
REPORT RequestId: 2dce0b80-5fb4-11e8-b5b7-41e11422a67a  Duration: 1.56 ms       Billed Duration: 100 ms         Memory Size: 128 MB     Max Memory Used: 22 MB

release인 경우

Python Datetime의 fromtimestamp() 사용 시 주의할 점

최근에 Timestamp가 있는 데이터를 다루다가, 신기한 버그를 발견하여 여기에 기록해 본다. 해당 문제가 수정된 것 같기는 한데, 아직 배포는 안 된 것 같다.

Windows에서 발생하는 버그

fromtimestamp 함수의 버그 (Windows)

fromtimestamp 함수의 버그 (Windows)

해당 이슈에 대해 설명한 부분을 확인하면, 0에서 86399 사이의 값을 입력하면 OSError가 발생한다.

Ubuntu에서는?

잘 동작한다. 심지어 Windows 10에 깔린 Ubuntu를 이용했고, 3.5.x 버전인데도 멀쩡히 잘 돌아간다.

Ubuntu에서는 정상적으로 동작한다.

Ubuntu에서는 정상적으로 동작한다.

참고자료

Python underscore 관련 naming convention

파이썬에는 PEP-8이라는 Python Code Style Guide가 있다. 모든 내용을 한 번에 정리하기 어려워서 그냥 코딩하다가 궁금한 것 위주로 정리해 보려고 한다.

이번 글에서는 ‘_’(Underscore)가 붙는 변수나 메서드에 관련한 내용을 정리하려고 한다.

Trailing underscore

  • _single_leading_underscore: 이런 경우 from M import *에서는 _로 시작하는 object를 import 하지 않는다.
  • single_trailing_underscore_: 파이썬 언어 내에서 사용되는 키워드와의 충돌을 피하기 위해 작성한다. BeautifulSoup에서 HTML의 class를 기준으로 무언가를 찾을 때 class_와 같이 속성을 지정해 줄 때가 있다.
  • __double_leading_underscore: 클래스 속성의 이름을 정할 때 name mangling을 피한다. 아래에 그 예가 있으니 참고하면 될 것 같다.
  • __double_leading_and_trailing_underscore__: 사용자가 컨트롤하는 네임스페이스에 있는 “magic” object나 속성이다. 예를 들어 __init__, __import__, __file__등이 있다. 이러한 이름을 새로 만들 일은 거의 없을 것 같다.

Package and Module Names

파이썬 모듈에서 C나 C++로 작성한 확장 모듈을 이용할 때, C나 C++ 모듈은 앞에 _를 하나 붙여준다. PEP-8 문서에서는 _socket을 예로 들고 있다.

Python `@property` 데코레이터와 getter/setter

예전에 어떤 소스를 보다가 클래스 내부에 @property 데코레이터가 붙어 있는 경우를 본 적이 있다. 어떤 경우에 사용하는지 궁금해서 한 번 정리해 보려 한다.

property() 함수

먼저 property() 함수에 대해 살펴보자.

class property(fget=None, fset=None, fdel=None, doc=None)

페이지 아래에 링크한 자료를 살펴보면, property 함수는 property 속성을 반환한다고 나와 있다. 그리고 fget 인자에는 속성 값에 대한 getter 함수, fset 인자에는 속성 값에 대한 setter 함수, fdel 인자에는 속성 값을 지우는 함수를 지정한다고 한다. 그리고 doc 인자는 속성에 대한 docstring을 넣어주면 된다.