Shopify Session 설치

Today I Learned 날짜 2024년 5월 8일 수요일 내용 Shopify session 새로 추가될 앱을 같은 서버에 만들었다. 앱이 설치되는 방식은 대략 다음과 같다. 쇼피파이에 설정해둔 우리 서버의 엔드포인트로 요청이 들어오면(/shopify) 우리 서버는 shopify_session을 이용해 허용 URL을 만들고 redirect시킨다. 앱을 설치하는 고객은 앱이 요청하는 권한(고객 데이터 접근, 주문 데이터 접근 등등)에 대해 확인하고 허가하는 창으로 안내되고, 허용하면 다시 우리 서버로 요청이 넘어온다. 이후로 온보딩 플로우로 넘어가든, 로그인으로 넘어가든 우리 코드대로 처리된다. ...

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

데이터베이스 개선작업 시작

Today I Learned 날짜 2024년 5월 7일 화요일 내용 데이터베이스 개선 지난주에 이어 데이터베이스를 개선하고 있는데, 예상치 못한 부분에서 신경쓸 거리가 많다. 예를 들어, 서비스에 가입할 때 항상 Shop테이블을 기준으로 구현되어 있다. 이 부분의 로직도 다른 예외처리를 두어야 한다. 그리고 리뷰서버에선 Redis를 이용해 샵의 정보를 불러오는데 새로 만든 앱의 샵은 Redis에서 정보를 찾을 수 없다. 우선은 Shop_id로 Shop 서버에서 정보를 가져오는 함수를 만들어 처리하고 있다. 점차 두번째 앱에서 처리해야할 정보나 범위가 많아진다면 Redis에 두번째 앱의 shop들에 대한 정보를 추가해주야 한다. ...

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

파이썬 알고리즘 : 괄호 변환

2024년 5월 7일 알고리즘 문제풀이 문제 괄호 변환 난이도 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 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 from collections import Counter # 균형잡힌 괄후 문자열인지 확인하는 함수 def check_balance(k): arr = Counter(k) if arr['('] == arr[')']: return True return False # 올바른 괄호 문자열인지 확인하는 함수 def check_right(k): while '()' in k: arr = list(k) for i in range(len(k)-1): if arr[i] == '(' and arr[i+1] == ')': arr[i] = arr[i+1] = '' k = ''.join(arr) if not len(k): return True return False # 변환과정을 나타내는 함수 def process(x): # 1단계 if not x: return x # 2단계 for i in range(1,len(x)+1): tmp = x[:i] if check_balance(tmp): break u = tmp v = x[i:] # 3단계 if check_right(u): # 3-1단계 return u + process(v) # 4단계 else: # 4-1, 4-2, 4-3단계 new = '(' + process(v) + ')' arr = [] # 4-4단계 for i in range(1,len(u)-1): if u[i] == '(': arr.append(')') else: arr.append('(') new += ''.join(arr) # 4-5단계 return new def solution(p): answer = '' u = '' answer = process(p) return answer 카카오는 시키는대로 하면 된다. ...

2024년 5월 7일 · 2 분 · 배준수

파이썬 알고리즘 : 별 찍기 - 10

2024년 5월 6일 알고리즘 문제풀이 문제 별 찍기 - 10 난이도 골드 5 코드 길이가 3인 정사각형에서 가운데만 비어있는 형태로 반복하여 쌓이게 된다. 정사각형을 9등분하여 가운데에만 제외하고 8개를 복사해준다고 생각했다. 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 import sys n = int(sys.stdin.readline()) board = [[' ' for _ in range(n)] for _ in range(n)] # 재귀함수 정의 def main(num:int): # 사각형이 최소크기면 if num == 3: for i in range(3): for j in range(3): # 가운데(좌표 1,1)를 제외하고 *을 그려준다. if i != 1 or j != 1: board[i][j] = '*' return # 3등분하여 재귀를 반복 p = num//3 main(p) for i in range(0, num, p): for j in range(0, num, p): # 가운데가 아닐 때를 제외하곤 똑같은 모양을 넣어준다. if i != p or j != p: for x in range(p): board[i+x][j:j+p] = board[x][:p] # 함수 실행 main(n) # 결과 출력 for i in range(n): for j in range(n): print(board[i][j], end='') print() 출처 : TaxFree ...

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

데이터베이스 테이블 계층 변경하기

Today I Learned 날짜 2024년 5월 3일 금요일 내용 DB구조에 대해 열심히 고민했다. 우리 서비스는 애초에 앱을 여러개 낼 계획이 없었기 떄문에 Shopify에서 받은 스토어 정보를 Shop 테이블에 저장하고 이 테이블을 중심으로 모든 로직이 이루어진다. 가장 최상위 테이블 역할을 한다. 알파리뷰 서비스에 가입한 계정에 관한 테이블인 ShopAdminAccount가 같은 계층에 있어 서로 참조할 수 있는 테이블이긴 하지만, 그외의 모든 데이터는 결국 Shop을 기준으로 정규화가 이루어져 있다. 따라서 서비스 삭제도 이 Shop을 삭제하면 이와 연관된 모든 테이블이 삭제된다(일부 남는 테이블과 리뷰서버 쪽도 처리하긴 해야 하지만…). ...

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

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

2024년 5월 3일 알고리즘 문제풀이 문제 소수 만들기 난이도 Lv.1 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 from itertools import combinations def solution(nums): answer = 0 board = [False for _ in range(3001)] board[2] = board[3] = True for num in range(4,3001): for i in range(2,num): if not num%i: break else: board[num] = True nCr = list(combinations(nums,3)) for i in nCr: if board[sum(i)]: answer += 1 return answer 나올 수 있는 모든 범위의 소수 여부를 판단한 후 문제를 풀었다. 이걸 에라토스테네스의 체라고 한단다. ...

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

이메일 템플릿 렌더링

Today I Learned 날짜 2024년 5월 2일 목요일 내용 실수 처리 몇가지 실수를 뿌려놓은게 있어서 열심히 메꾸었다. 가장 먼저, 코어스크립트와 앱블록을 활성화한 유저들을 탐색하는 기능을 고쳤다. 당연히 Dict 일거라 생각하고 처리한 부분에서, 뜬금없이 문자열이 튀어나와 오류가 나고있었다. if not isinstance(settings_data, dict): 를 추가해서 해결했다. 스프레드시트에 데이터가 올바르게 들어가지 않고 있었다. 각 유저들이 앱을 사용하는 상황을 저장하는 방식을 바꾸었는데 이 로직의 코드는 변경하지 않아 작동하지 않는 문제였다. 지난주 이메일 레거시 코드를 개선하고 테스트 하는 과정에서 수신 주소를 내 개인 메일로 바꾸어놨는데, 이 부분을 복구하지 않고 실서버 까지 올라가버렸다.. VOC가 나한테 와서 상당히 당황스러웠다. 메일 주소 바꾸는건 어렵지 않았지만 문제는 템플릿이 렌더링되지 않는 것이었다. ...

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

파이썬 알고리즘 : Build Array from Permutation

2024년 5월 2일 알고리즘 문제풀이 문제 Build Array from Permutation 난이도 Easy 코드 1 2 3 4 5 6 class Solution: def buildArray(self, nums: List[int]) -> List[int]: ans = [0 for _ in range(len(nums))] for i in range(len(nums)): ans[i] = nums[nums[i]] return ans

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

Microsoft AI Tour in Seoul 참여기

Today I Learned 날짜 2024년 4월 30일 화요일 내용 너그러운 샐러드랩의 관용덕에 양재에서 열린 마이크로소프트 AI 투어에 다녀왔습니다. 아침 8시 30분에 양재 aT센터에 도착했습니다. 회사 이름을 넣을줄은 몰랐어요. 아침을 주길래 먹었습니다. 가자마자 뭔가 주길래 봤더니 코파일럿 잘 쓰는 법입니다. 참고하세용 9시 30분부터 키노트세션이 열렸습니다. 한 4~5천명 온 것 같아요. 저 Scott Hanselman님은 마이크로소프트 개발자 커뮤니티의 부사장이십니다. 다행히 각 자리마다 동시통역 오디오가 제공되서 알아듣는데는 성공했습니다. 이 날(4월 30일)부터 코파일럿에 공식적으로 한국어가 지원된다면서 시연을 해주었지만, AI가 100% 헛소리를 해버리는 바람에 대환장파티긴 했습니다. Copilot in Microsoft 365가 공식적으로 한국어 지원을 한다고 하니 엑셀이나 워드, 파포 작업하실 때 쓰시면 좋겠습니다. ...

2024년 4월 30일 · 4 분 · 배준수

파이썬 알고리즘 : 코코넛 그 두 번째 이야기

2024년 4월 30일 알고리즘 문제풀이 문제 코코넛 그 두 번째 이야기 난이도 실버 5 코드 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 import sys def check(num: int): cnt = 1 for i in range(2,num): tmp = num for _ in range(i): tmp -= 1 tmp *= (i-1) if not tmp%i: tmp //= i else: break else: cnt = i return cnt while True: n = int(sys.stdin.readline()) if n == -1: break tmp = check(n) if tmp < 2: print(f"{n} coconuts, no solution") else: print(f"{n} coconuts, {tmp} people and 1 monkey") 문제에서 처리하는 순서대로 그대로 구현했다. 약간 헷갈렸던건, 예시에선 5명이였는데 인원수대로 처리하면 된다는 걸 생각못하고 무조건 5명이라 생각했다.. ...

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