한 번에 잘하자.

Today I Learned 날짜 2024년 4월 17일 수요일 내용 건강 이슈로 오전 반차. 이메일 템플릿3 나름 열심히 만드는데 여기저기 구멍이 숭숭 뚫려있다. 엑박이 뜬다던가, 버튼 크기가 개판이던가, 임의로 줄바꿈을 집어넣어서 모양이 개판이던가… 테스트를 안하는 것도 아니고, 분명 휴대폰으로도 확인하고 큰 모니터로도 확인하는데 왜 내 눈엔 안보일까. 철두철미한 자체 QA 가 필요하다. 한번에 OK 받도록 만들 것. 회고 그래도 끝이 보임.

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

이메일 장인 되는 중

Today I Learned 날짜 2024년 4월 16일 화요일 내용 건강 이슈로 오후 반차. 리스트 디자이너 개선 지난 스프린트(정확히는 그 이전)였던 리스트 디자이너 개선작업을 진행했다. 백엔드 쪽에선 크게 변경될 부분은 없었다. 기존에 위젯을 설정하는 화면에서 미리보기 기능이 백엔드에게 지속적으로 요청을 보내도록 구현해놨었는데, 이 부분을 프론트에서 처리하도록 수정해서 사용성이 훨씬 개선됐다(물론 내가 안함). 미리보기를 위해 구현해놓은 코드를 다 지웠다. 시-원 이메일 템플릿2 이메일 CSS를 계속 작업하면서, 우선 발송 로직을 구현했다. 웰컴 메일은 계정 생성시에 추가해두었고 각 서비스 개시 메일은 고객 정보를 업데이트 하는 부분에 가져다뒀다. 서비스에 가입했지만 세 가지 서비스(리뷰, AI, 리스트 디자이너) 모두 활성화하지 않은 유저에게는 1일 후 메일을 보내도록 구현했다. 몇달 전에 처음 태스크를 맡을 때 메일 보내는 함수를 설정했었다. 이때 스토어의 현지 시간을 변환하고 발송 시간대(오전 8시30분~ 9시 30분 사이)인지 체크하는 함수를 따로 만들어두었는데, 두고두고 요긴하게 쓰이니 나름 뿌듯하다. ...

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

파이썬 알고리즘 : 큰 수 만들기

2024년 4월 16일 알고리즘 문제풀이 문제 큰 수 만들기 난이도 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 26 def solution(number, k): stk = [] for num in number: # stk가 비었으면 넣음 if not stk: stk.append(num) continue if k > 0: # 지금 주목하는 수가 방금 넣은 수보다 크다면 뺸다. while stk[-1] < num: stk.pop() k -= 1 # 더이상 뺄 것이 없거나 더이상 빼면 안되면 반복문 종료 if not stk or k <= 0: break stk.append(num) # 모두 순회했는데 아직 뺄것이 남았다면 가장 뒤에것만뺀다. if k: stk = stk[:-k] answer = ''.join(stk) else: answer = ''.join(stk) return answer

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

나는야 이메일 템플릿 머신

Today I Learned 날짜 2024년 4월 15일 월요일 내용 나는 이메일 템플릿 만드는 기계다. 오늘 하루에만 무려 4개의 템플릿을 만들었다. 이정도면 스스로를 템플릿 공장이라고 불러도 될까? 물론 택도 없다. 개선해야 할 부분이 있기 때문이다. 공통 footer를 따로 처리하지 않았다. 모든 이메일 템플릿이 동일한 footer를 적용하는데 다 복붙했다. 별도의 html로 만들고 include 했어야 했는데.. 그러지 못한 이유는 footer를 포함하여 템플릿 전체를 하나의 table로 처리했기 때문이다. 시간이 허락한다면 분리 작업을 해야겠다. padding을 사용하지 않았다. 그동안 나름 터득한 방법은 여백이나 줄 간격, padding을 테이블의 한 요소(행 또는 열)로 처리하는 것이었다. 이에 대한 설명은 2월 16일 TIL을 참고하자. 어쩄든, 기존에 작성된 이메일 템플릿은 이 경우를 테이블의 열을 나타내는 td 에 style로 padding-left, padding-top등을 먹이는 방식이었다. 시간이 허락한다면 고쳐야겠다. 회고 하지만 시간은 쉽게 허락해주지 않음. ...

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

파이썬 알고리즘 : 의상

2024년 4월 15일 알고리즘 문제풀이 문제 의상 난이도 Lv. 2 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 def solution(clothes): answer = 0 arr = dict() for x in clothes: [n,t] = x if t in arr: arr[t] += 1 else: arr[t] = 1 cnt = 1 for a,b in arr.items(): cnt *= (b+1) answer = cnt-1 return answer

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

또메일~

Today I Learned 날짜 2024년 4월 12일 금요일 내용 고객의 서비스 활성화 확인을 끝마치고, 사용자 이메일 개선작업을 시작했다. 이 Task 자체는 이메일 템플릿을 만드는 거라 난이도 자체가 어렵진 않다. 상당하 귀찮고 성가실 뿐.. 대신 이 작업이 끝나고 전반적인 이메일 관련 레거시 코드를 처리해야 하는 부분이 꽤 클 듯하다. 회고 라라스윗 팥모나카 맛을 먹었다. 팥으로 만든 하모니카 모양이라 팥모니카 인 줄 알았는데 모나카였다. 디저트 이름이라고 한다. 잘 배웠습니다!

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

파이썬 알고리즘 : 실패율

2024년 4월 12일 알고리즘 문제풀이 문제 실패율 난이도 Lv. 1 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 def solution(N, stages): answer = [] arr = [0 for _ in range(N+2)] arr_f = [0 for _ in range(N+2)] for i in range(len(stages)): now = stages[i] for j in range(1,now+1): arr[j] += 1 arr_f[now] += 1 tmp = [] for i in range(1,N+1): if arr[i] == 0: tmp.append([0,i]) else: tmp.append([(arr_f[i]/arr[i]),i]) tmp.sort(reverse=True, key=lambda x : (x[0],-x[1])) for i in range(N): answer.append(tmp[i][1]) return answer

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

파이썬 알고리즘 : 나누어 떨어지는 숫자 배열

2024년 4월 11일 알고리즘 문제풀이 문제 나누어 떨어지는 숫자 배열 난이도 Lv. 1 코드 1 2 3 4 5 6 7 8 9 10 def solution(arr, divisor): answer = [] for i in arr: if not i%divisor: answer.append(i) answer.sort() if answer: return answer else: return [-1]

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

Shopify app block

Today I Learned 날짜 2024년 4월 9일 화요일 내용 고객들의 기능 활성화 여부를 체크하는 기능을 만들었다. 코어스크립트 고객이 위젯을 스토어에 설치하기 위해선, “코어 스크립트”를 활성화 해야한다. 위젯이 정상적으로 작동하도로록 해준다. 우리 서비스에서 위젯은 핵심적인 부분이기 떄문에 코어스크립트가 활성화되어 있지 않다는 의미는 우리 서비스를 제대로 활용하지 못하는 뜻이다. 각 서비스(알파리뷰, 리스트 디자이너)는 제각각 코어스크립트를 가지는데 이를 활성화했는지를 알아봐야한다. 스토어가 사용하고 있는 메인 테마를 찾아야 한다. Shopify로 요청을 보내면 된다. 이렇게 목록들이 나타나니 원하는 값을 찾으면 된다. 한번도 활성화한 적이 없는 항목은 나타나지 않는다. 따라서 없거나, “disabled”가 true일 떄가 비활성화인 상태다. ...

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

파이썬 알고리즘 : 소수 찾기

2024년 4월 9일 알고리즘 문제풀이 문제 소수 찾기 난이도 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 26 27 28 29 30 31 32 33 34 35 36 37 from itertools import permutations def check_prime(n): if n < 2: return False elif n<4: return True if not n%2: return False for i in range(2,int(n**(0.5))+1): if not n%i: return False else: return True def make_arr(arr): result = [] n = len(arr) tmp = [] for i in range(1,n+1): tmp += list(permutations(arr,i)) for a in tmp: result.append(int("".join(a))) return result def solution(numbers): answer = 0 result = set() arr = list(numbers) arr = make_arr(arr) arr = set(arr) for i in arr: if check_prime(int(i)): result.add(int(i)) return len(result)

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