역행자

역행자 지은이: 자청 출판사: 웅진지식하우 감상 나는 원래 자기계발서를 좋아하지 않는다. 사람은 누구나 자신만의 이유와 상황이 있다고 생각하기 때문이다. 책을 써낼만큼 노력해서 성공을 일궈낸 사람을 깎아내리거나 질투할 생각은 없다. 대단하다고 생각하고 존경하며, 오히려 나 또한 그렇게 무언가에 쏟아부어 성과를 얻어내고 싶은 마음이 크다. 하지만 그 책을 읽음으로서 얻을 것이 없다고 생각한다. 하지만 수필은 좋아한다. 누군가의 솔직한 생각을 읽는 것은 작가의 의도와 다르게 많은 가르침을 줄 수 있다고 생각한다. 어떤 구절에선 나와 별반 다를바 없는 사람이라고 느끼기도 하지만, 한 번도 생각해본 적 없는 관점과 태도로 스스로를 되돌아 보게 해주기도 한다. 자연스레 다른 사람의 입장이 되어볼 수 있다는 것만으로도 수필을 읽는 것은 큰 자산이 된다. ...

2024년 1월 8일 · 2 분 · 배준수

월요일 월요일은 힘들

Today I Learned 날짜 2024년 1월 8일 월요일 내용 이것 저것 중구난방으로 처리하느라 이도저도 아닌 하루가 된 느낌이다. Weekly Review Report Email 지난주에 Task로 등록해두었지만, 메일이 발송되지 않았다. Log를 확인해보니 Invalid HTTP request received. 라고 뜬다. 정확히 내가 설정한 Task로 인한 것인지 아직 확실히 확인하지 못했다. 내일 조금 더 본격적으로 확인해서 무엇이 문제인지 찾아볼 예정. Localization 이전에도 느꼈지만 우리 서비스의 Widget 렌더링 로직은 참 어렵다. 우리 서비스는 리뷰 작성 페이지와 위젯의 언어를 바꿀 수 있는데, 이를 Localization이라 부른다. 이번에 포르투갈어, 독일어, 중국어를 추가해줘야 했다. ...

2024년 1월 8일 · 2 분 · 배준수

1/52

Today I Learned 날짜 2024년 1월 5일 금요일 내용 한 주간 있었던 리뷰 현황에 대한 변화를 ECS 예약된 Task로 설정했다. 아마 다음주 월요일 오전에 발송될테니, 테스트 샵의 계정으로 들어가 월요일에 출근해서 확인해보면 될 듯. 곧 시작될 스프린트의 공수에 대해 견적을 열심히 냈는데 아직 내가 개발해야될 것에 대해 감이 잘 안 온다. 하룻강아지 범 무서운 줄 모른다고 온보딩때 까불다 그렇게 망해놓고 아직 멀었나보다. 회고 올 해 첫 주가 끝났다. 아직 갈 길 이 참 멀었으니 올해도 화이팅 ...

2024년 1월 5일 · 1 분 · 배준수

머리가 나빠 몸을 고생시킴

Today I Learned 날짜 2024년 1월 4일 목요일 내용 목표 없는 노력만큼 바보 같은 것도 없다. 그럼 나는 꽤 바보다. 매일 노션에서 Todo 작성하고, 업데이트하면서 볼 수 있는 문구다. 근데 내가 그렇다. 조금 더 정확히 말하자면 목표가 있었는데 잘못된 목표였다. 그래서 아예 바보까진 그렇고 약간 바보라고 하겠다. 그래도 얻은 것은 있으니까… index.html만 화면이 안나타나서 어제부터 머리를 쥐어뜯었다. 문득 어떤 화면이 떠야 정상일까 궁금해서 로컬에서 index.html을 크롬으로 열어봤는데 아무 것도 안뜬다. 안 뜨는게 문제가 아니였다. 로컬에서 확인해보니 루트 경로로 들어가서 index.html로 가도 결국 메인 랜딩페이지(home/main)이 뜨게 된다. ...

2024년 1월 4일 · 3 분 · 배준수

아마존엔 없는 것 빼고 다 있다.

Today I Learned 날짜 2024년 1월 3일 수요일 내용 SQLAlchemy 매주 새로 생성된 리뷰들에 관한 정보를 담은 메일을 보내는 Task를 얼추 완성했다. CSS에 대해 추가적인 피드백이 필요하긴 하지만 우선 로직과 코드 자체에 대해 확인이 필요했다. 명명 이번엔, 변수나 함수 이름, 엔드포인트에 대해서 조금 더 신경썼다. 맨 처음 코드를 작성할 떈 아무래도 머릿속에 생각나는대로 적거나 GPT가 써준대로 적게 된다. Task를 진행하다보면 어느새 이 이름에 익숙해져 그대로 PR을 올리는 경우가 많았다. 다른사람이 내 코드를 볼 때, 이름의 의미를 쉽게 파악할 수 있다면 코드를 읽기 훨씬 수월해지기 떄문에 PR올리기 전 코드를 정리하는 시간을 따로 가졌다. 요청을 주고 받을 때 양쪽의 변수 이름을 동일하게 해서 함수의 흐름을 따라가는 사람이 헷갈리지 않도록 했다. 함수가 결국 반환하는 데이터가 무엇인지를 이름을 통해 알 수 있게 했다. 예를 들어, 내 Task가 결국 email을 보내야 하는 거지만 내가 구현할 함수 중에는 그저 Email을 위해 필요한 데이터만 조회하는 함수도 존재한다. 이 함수의 이름에는 email이 들어갈 필요가 전혀 없다. 나야 Task를 진행하면서 자연스레 넘어가게 되지만, 배경을 모르는 사람이 보면 코드를 볼 때 존재하지도 않는 메일 전송과 관련된 로직을 신경써야 하니까. ...

2024년 1월 3일 · 4 분 · 배준수

Email HTML에서 margin 적용하기

Today I learned 날짜 2024년 1월 2일 요일 내용 올해 첫 업무 시작. Email CSS 고객에게 발송할 이메일 양식 HTML 의 CSS를 계속 진행하고 있다. 위아래에 margin이 적용되지 않았다. 구글링 결과, 플랫폼이나 브라우저 마다 Email Template 렌더링이 제각각이라는 말이 많았고 특히 부모의position 을 relative 로 두고 자식을 absolute 로 두었을 때 위치가 적용되는지에 대해 너무 의견이 분분했다. 나는 템플릿을 table로 구성해두었는데, table의 위치에 margin 을 적용하지 않고 빈 셀 하나를 추가해주는 방식으로 구현했다. ...

2024년 1월 2일 · 1 분 · 배준수

파이썬 알고리즘 : N-Queen

2024년 1월 2일 알고리즘 문제풀이 문제 N-Queen 난이도 Lv.2 코드 그 어렵다고 소문난 N-Queen 문제. 정글 때 공부했던 문제였는데 그새 까먹었나보다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 def solution(n): answer = 0 def check_width_row(p,q,arr): for i in range(n): if arr[i][q] == '0': arr[i][q] = False if arr[p][i] == '0': arr[p][i] = False def check_right_down(p,q,arr): i = 0 while p+i >= 0 and p+i < n and q+i >= 0 and q+i < n: if arr[p+i][q+i] == '0': arr[p+i][q+i] = False i += 1 def check_left_up(p,q,arr): i = 0 while p+i >= 0 and p+i < n and q+i >= 0 and q+i < n: if arr[p+i][q+i] == '0': arr[p+i][q+i] = False i -= 1 def check_right_up(p,q,arr): i = 0 while p-i >= 0 and p-i < n and q+i >= 0 and q+i < n: if arr[p-i][q+i] == '0': arr[p-i][q+i] = False i += 1 def check_left_down(p,q,arr): i = 0 while p+i >= 0 and p+i < n and q-i >= 0 and q-i < n: if arr[p+i][q-i] == '0': arr[p+i][q-i] = False i += 1 def check(p,q,arr): check_width_row(p,q,arr) check_right_down(p,q,arr) check_right_up(p,q,arr) check_left_up(p,q,arr) check_left_down(p,q,arr) arr[p][q] = True def search(x,arr): for i in range(n): if arr[x][i] == '0': check(x,i,arr) flag = True break else: flag = False return flag for i in range(n): w = [['0' for _ in range(n)] for _ in range(n)] w[0][i] = True check(0,i,w) k = 1 while k < n: tmp = search(k,w) if tmp: k += 1 else: break if k == n: print(w) answer += 1 return answer 보드판을 string ‘0’을 배치시켜 만들었다. 원래 숫자로 넣었는데 False일 떄와 0일때가 같이 취급되어서 따로 만들었다. 아무 선택되지 않은 좌표는 ‘0’, 공격당할 수 있기 때문에 놓을 수 없는 곳은 False, 퀸이 위치한 곳은 True로 설정하였다. 우선 임의의 좌표 (p,q)에 퀸을 놓았을 때 퀸이 공격할 수 있는 곳을 False 처리하는 코드를 작성했다. 임의의 좌표의 좌 우 대각선을 바꿔주는 함수를 각각 만들고 하나의 함수로 합쳤다(check). search는 특정 행에서 퀸을 놓을 수 있는 열을 찾아 존재하면 boolean값을 반환해주는 함수이다. ...

2024년 1월 2일 · 9 분 · 배준수

파이썬 알고리즘 : 최솟값 만들기

2024년 1월 1일 알고리즘 문제풀이 문제 최솟값 만들기 난이도 Lv.2 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 from heapq import heappop, heappush def solution(A,B): n = len(A) arr_A = [False for _ in range(n)] arr_B = [False for _ in range(n)] arr = [] def dfs(tmp,arr_A,arr_B): if arr and tmp > arr[0]: return if not arr_A.count(False) and not arr_B.count(False): if not arr or tmp < arr[0]: heappush(arr,tmp) for i in range(n): if arr_A[i]: continue for j in range(n): if arr_B[j]: continue arr_A[i] = True arr_B[j] = True dfs(tmp+(A[i]*B[j]),arr_A,arr_B) arr_A[i] = False arr_B[j] = False dfs(0,arr_A,arr_B) return arr[0] 처음엔 DFS로 시도했다. 여러 case가 규칙성 없이 나타날 수 있다고 생각했기 때문이다. 하지만 시간초과가 발생했다. 불필요한 탐색을 줄이기 위해, 값을 최소힙에 저장하도록 했다. DFS 과정 상 재귀 중에 이미 최소힙에 존재하는 최솟값을 넘어선 경우 탐색을 중단하도록 했다. 하지만 시간초과가 계속 발생했다. ...

2024년 1월 1일 · 2 분 · 배준수

우리가 빛의 속도로 갈 수 없다면

우리가 빛의 속도로 갈 수 없다면 지은이: 김초엽 출판사: 허블 감상 여러 단편소설들이 엮여있는 책으로, 책의 제목은 그 중 하나이다. 가장 처음에는 <순례자들은 왜 돌아오지 않는가>가 나오는데, 내용 중 분량도 가장 긴 느낌이고, 전체적인 세계관을 파악하는 데도 시간이 필요한 작품이였다. 그 외는 모두 물 흐르듯 자연스럽게 읽을 수 있었다. 내용이 쉽고 단순하기 보다는, 불필요한 세계관에 대한 서술없이 등장인물의 말에 깊이 빠져들게 된 덕이다. SF 소설이긴 하지만, 과학적인 느낌보다는 미래를 배경으로 한 소설을 읽는 느낌이 물씬 들어 너무 재밌게 읽은 책이었다. 가볍게, 짧으면 하루만에도 읽어버릴 수 있는 책. 독서에 에너지를 쏟고 싶지 않지만 몰입하고 싶다면 꼭 추천하는 소설이다. ...

2023년 12월 31일 · 1 분 · 배준수

CSS로 메일 양식 만들기

Today I learned 날짜 2023년 12월 29일 금요일 내용 어제 막힌 난점은 해결했다. 도커 컨테이너 내에서 스크립트를 실행하니 메일은 발송되었다. 딱히 추가로 건드려야 할 설정이나 변수는 없었다. 기존에는 안되었는데, 로직상 가져온 데이터가 없었기 떄문에 발송되지 않았던 모양이다. 로컬 DB에는 테스트를 위한 적절한 리뷰 데이터가 없기 떄문에, 메일에 담을 데이터들을 임의의 값으로 지정해주었더니 헤결됐다. 수신자를 내 이메일로 설정해서, 어떤 화면이 고객이 보게 되는지 확실히 볼 수 있었다. HTML에 데이터를 담는 것도 금방 해결되었는데, 이미 우리 서비스에 Jinja2 템플릿을 사용하고 있었기 때문이다. 그냥 양식에 맞춰 변수를 집어넣기만 해주었다. 생각지도 못한 부분에서 하루종일 고생했는데, 이메일에 담길 HTML을 로컬에서 열어보았을 떄와 메일로 받아보았을 떄가 다르다. local에선 적용된 padding이 안되있는 경우라던가, 예상 외의 상황이 많다. 이러한 특징은 각 메일 플랫폼별로 모두 다르다고 한다. 고객이 네이버, 구글, 아웃룩 등 받을 곳은 무궁무진한데 출력되는 형식이 매번 달라지니 이메일 만드는게 쉽지 않은 것 같다. 난 그냥 CSS도 못하는데… ...

2023년 12월 29일 · 1 분 · 배준수