5 Whys - 문제의 근본 원인을 파악하는 방법

## 5 Whys - 문제의 근본 원인을 파악하는 방법 --- ### ✅ 5 Whys 필요성 우리는 **고객의 문제**를 **해결**해야합니다. 문제의 근본 원인을 파악해 해결하지 않으면 고객의 문제는 해결되지 않습니다. 따라서 **문제의 근본 원인을 파악**하는 것이 중요합니다. **5 whys** 는 **문제의 근본 원인을 파악**하는 방법입니다. **눔(Noom) 사례: 비만 문제를 해결하자** - 비만 문제 → 칼로리 조절 → 칼로리 계산을 도와주는 앱 → 비만 해결 안됨 - 비만 문제를 해결하자 → 먹는 칼로리를 줄이면 된다 - 얼만큼 먹었는지(칼로리 섭취량 계산)를 어떻게 알려주지? → 칼로리 트래커 앱 개발 - 결과 → **비만 문제 해결 안 됨**. 비만의 근본 원인이 칼로리 계산에 있는 것이 아니기 때문 - 근본 원인은 비만의 습관, 행동 패턴을 개선하는 것 ⇒ 현재의 눔 코치 서비스 --- ### 🤔 5 Whys 란? 5 Whys는 문제 발생 시 “왜?“를 5번 반복해 근본 원인을 찾는 간단한 기법입니다. 1930년대 Toyota 창업자 Sakichi Toyoda가 개발했으며, 생산성 향상을 위해 사용됐습니다. - 도요타 사례 - 문제: 용접 로봇에 고장이 나서 생산에 차질이 생기는 문제 1. 용접 로봇이 왜 멈추었나? → 회로에 과부하가 걸려 퓨즈가 나갔다. 2. 회로에 왜 과부하가 걸렸나? → 기계작동을 담당하는 축의 베어링이 충분히 미끄럽지 않았다. 3. 베어링이 왜 충분히 미끄럽지 않았나? → 용접 로봇의 오일펌프가 충분한 오일을 순환시키지 못했다. 4. 오일펌프가 왜 오일을 순환시키지 못했나? → 펌프의 흡입구가 금속 부스러기로 막혔다. 5. 흡입구에 왜 금속 부스러기가 막혔나? → 펌프에 필터가 장착되어 있지 않았다. - 해결 방법: 노후된 오일펌프와 필터를 교체 - 토머스 제퍼슨 기념관 사례 ...

어드민 유저 권한 시스템 설계(Admin user authority system design)

이미지
## 어드민 유저 권한 시스템 설계 ### 문제 상황 - 현재 어드민 페이지 권한 종류가 [전체 읽기/쓰기], [전체 읽기] 밖에 없음 - 전체 읽기 - 다 읽을 수 있음 - 전체 읽기/쓰기 - 다 수정, 삭제할 수 있음 - 어드민 페이지를 이용해야하는 사람은 많음 - 어드민 페이지를 이용하려면 admin 권한을 줄 수 밖에 없는 상황. 그런데 admin 권한이 너무 큼 ### 요구사항 - 기존 권한 시스템을 최대한 가지고 가면서, 필요한 권한만 부여할 수 있는 권한 시스템을 도입해야 함 ### 설계 - 구성 - 유저, 스코프, 메소드로 구성되어있음 - 유저(사용자) - 스코프(기능 또는 페이지 단위) - 어드민 특정 기능 또는 페이지 단위 - 메소드(API 주소) - EX) api::route::get::/api/product/string:oid - 유저는 스코프를 갖고, 스코프는 메소드를 갖고 있음 - 유저는 스코프 리스트, 스코프는 메소드(요청 가능한 API)의 리스트를 가지고 있음 - 유저에게 스코프 할당을 보다 편하게 하기 위해 자주 사용되는 스코프를 preset 으로 묶음

koyeb(heroku 대체제) 으로 flask 배포하기

이미지
## koyeb 선택 이유 2015년부터 잘 쓰던 heroku(무료 플랜)가 곧 무료 플랜을 종료한다고 해서 대체제를 찾아봤다. fly.io, render.com 등을 확인해봤는데 fly.io 는 카드를 등록해야해서 탈락. render.com 는 괜찮은 것 같았는데 가격 대비 서비스가 미세하게나마 koyeb이 좋아서 선택. CPU 1 / RAM 512 / SSD 5G 가 무료라고 되어 있다. 정확히는 5달러를 주고 저 플랜을 5.4달러에 제공해서 0.4달러를 내야하는 것 같은데... 아래 이미지처럼 되어 있어서 일단 한 달 써보려고 한다. 0.4달러를 내야하면 render.com 로 가면 되니. 배포하는 방법은 별 것 없어서 쓸데없는 말이 길어졌다. ## 배포 방법 아래 이미지대로 쭉 따라하면 된다. 먼저 create app 을 누르고, gunicorn 을 사용하기 때문에 **run command** 에 `gunicorn app:app` 을 작성했다. 만약 python version 을 고정하고 싶다면 추가 작업이 필요하다. `root` directory 에 `runtime.txt` 파일을 추가하고 `python-3.9.15` 라고 명시하면 된다. 해당 작업을 하지 않으면 koyeb이 알아서 파이썬 버전을 정해서 빌드한다. 배포는 이렇게하면 끝이다. 적고 나니까 render.com 도 올려 봐야겠다는 생각이 든다. 뭐가 더 간단하려나.

Git GUI client 사용 후 비교(Feat. Fork)

- **개인적으로 써 본 Git GUI client** - SourceTree([https://www.sourcetreeapp.com/](https://www.sourcetreeapp.com/)) - Github Desktop([https://desktop.github.com/](https://desktop.github.com/)) - **Fork**([https://git-fork.com/](https://git-fork.com/)) - **Fork 를 쓰게 된 이유** - SourceTree 단점 - 단점 - Crash 가 너무 심함. 저번 주에 혹시나 해서 한 번 깔아봤는데 또 Crash. 안고쳐줌. - 간혹 가다 알 수 없는 버그, 버벅임. - Github Desktop - 상대적으로 단순한 기능 - GitKraken - 상대적으로 높은 가격([https://www.gitkraken.com/pricing](https://www.gitkraken.com/pricing)) - **Fork 장점** - Crash 난 적 없음(기억 속에 없음) - 훌륭한 UX/UI - 필요한 기능은 다 있음 - 가격 - 개인적으로 사용 시 무료 - 영구 라이센스 구매 $49.99 - 상업적으로 사용 가능 - **Git GUI client 비교 시 참고 자료** - [https://stackshare.io/stackups/fork-vs-sourcetree](https://stackshare.io/stackups/fork-vs-sourcetree) - [https://open-support.tistory.com/entry/git-guiclient-는-어떤툴을-사용하시나요](https://open-...

2020 카카오 인턴 코딩테스트 - 키패드 누르기 (python3)

파이썬 문법 중 `if i in 리스트` 로 포함되어있는지 아닌지를 다른 사람 풀이 보고 알게 되었음. ``` def solution(numbers, hand): left_hand = [3, 0] right_hand = [3, 2] left_hand_distance = 0 right_hand_distance = 0 keypad_locations = [[3, 1]] left_hand_numbers = [1, 4, 7] right_hand_numbers = [3, 6, 9] center_numbers = [2, 5, 8, 0] current_hand = "" answer = "" for x in range(0, 3): for y in range(0, 3): keypad_locations.append([x, y]) for number in numbers: if number in left_hand_numbers: current_hand = "L" if number in right_hand_numbers: current_hand = "R" if number in center_numbers: left_hand_distance = abs(left_hand[0] - keypad_locations[number][0]) + abs(left_hand[1] - keypad_locations[number][1]) right_hand_distance = abs(right_hand[0] - keypad_locations[number][0]) + abs(right_hand[1] - keypad_locations[number][1]) if l...

프로그래머스 타겟 넘버 파이썬 python3

처음에 그림은 그렸는데 못 풀었음. 풀이 참고해서 풀게 됨. ``` answer = 0 def dfs(i, numbers, target, result): global answer if (i == len(numbers)): if result == target: answer += 1 return dfs(i+1, numbers, target, result + numbers[i]) dfs(i+1, numbers, target, result - numbers[i]) def solution(numbers, target): global answer dfs(0, numbers, target, 0) return answer ```

자바스크립트 spread 문법(JavaScript spread syntax)

## 자바스크립트 spread 문법(JavaScript spread syntax) 자바스크립트 spread 문법은 다음과 같다. ``` let request = { a: "1", b: "2"} console.log(request) // { a: '1', b: '2' } console.log({request}) // { request: { a: '1', b: '2' } } console.log({...request}) // { a: '1', b: '2' } console.log({c: "3", ...request}) { c: '3', a: '1', b: '2' } console.log({...request, c: "3"}) { a: '1', b: '2', c: '3' } ```

AWS CloudWatch와 AWS Lambda를 활용해 AWS EC2 실행, 중지 될 때마다 Slack 메세지 받기(How to receive Slack message using AWS CloudWatch and AWS Lambda when AWS EC2 state is changed)

## AWS CloudWatch와 AWS Lambda를 활용해 AWS EC2 실행, 중지 될 때마다 Slack 메세지 받기(How to receive Slack message using AWS CloudWatch and AWS Lambda when AWS EC2 state is changed) [이 글](https://ghkdgh2365.blogspot.com/2020/12/aws-lambda-aws-cloudwatch-aws-rds-how.html)을 쓴 김에 쓰는 글입니다. AWS EC2 상태가 변경(실행 또는 중지 등)할 때마다 슬랙으로 메세지를 받는 방법에 대해서 작성합니다. 순서는 아래와 같습니다. 1. Slack 설정 2. AWS Lambda 설정 3. AWS CloudWatch 설정 ### 1. Slack 설정 [해당 페이지](http://ghkdgh2365.blogspot.com/2020/12/aws-lambda-aws-cloudwatch-aws-rds-how.html) 1. Slack 설정과 같습니다. ### 2. AWS Lambda 설정 AWS Lambda 에 가서 **함수 생성** 버튼을 클릭하고 **함수 이름**을 적은 뒤 함수를 생성합니다. 저의 경우 **런타임**(사용할 프로그래밍 언어)은 **Python 2.7**로 했습니다. 생성한 뒤 **함수 코드**는 아래와 같이 작성합니다. `'YOUR SLACK URL'` 자리에 Slack 설정 시 확인했던 **Webhook URL** 을 복사해서 붙여넣어주면 됩니다. ``` # -*- coding: utf-8 -*- import json, random import httplib from botocore.vendored import requests def lambda_handler(event, context): slack_url = 'https://hooks.slack.com/services/TBF4TQCQ4/B01GABAKDSP/i...

Amazon RDS 이벤트 알림 규칙(Feat. AWS CloudWatch, Amazon EventBridge)(Amazon RDS event notification rules)

## Amazon RDS 이벤트 알림 규칙(Feat. AWS CloudWatch, Amazon EventBridge)(Amazon RDS event notification rules) AWS Lambda 와 함께 AWS CloudWatch, Amazon EventBridge의 RDS 상태 변경과 관련된 규칙을 사용하고 싶을 때 아래와 같이 설정하면 됩니다. [해당 페이지](https://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/USER_Events.html)에서 더 자세히 확인하실 수 있습니다. #### RDS Cluster가 중지됐을 때 ``` { "source": [ "aws.rds" ], "detail-type": [ "RDS DB Cluster Event" ], "detail": { "EventID": [ "RDS-EVENT-0150" ], "EventCategories": [ "notification" ], "SourceType": [ "CLUSTER" ], "SourceArn": [ "arn:aws:rds:ap-northeast-2:xxxxxxxxxxx" # 해당 RDS cluster 의 arn ], "SourceIdentifier": [ "xxxxxxxx" # 해당 RDS cluster 의 DB 식별자 ] } } ``` #### RDS Cluster가 시작됐을 때 ``` { "source": [ "aws.rds...

AWS Lambda와 AWS CloudWatch 이용해서 AWS RDS가 시작 또는 중지되었을 때, 슬랙으로 메시지 받기(How to receive slack message using AWS Lambda and AWS CloudWatch when AWS RDS is started or stopped)

이미지
## AWS Lambda와 AWS CloudWatch 이용해서 AWS RDS가 시작 또는 중지되었을 때, 슬랙으로 메시지 받기(How to receive slack message using AWS Lambda and AWS CloudWatch when AWS RDS is started or stopped) AWS Lambda와 CloudWatchAWS 이용해서 AWS RDS가 시작 또는 중지되었을 때, 슬랙으로 메시지 받는 방법을 소개하려고 합니다. ~~(AWS RDS는 비싸니깐요?)~~ 여기서 가장 중요한 부분은 **AWS CloudWatch 이벤트 생성 규칙**입니다. 따라서 가장 마지막에 적겠습니다. ~~(왜..?)~~ 순서는 다음과 같습니다. 1. Slack 설정 2. AWS Lambda 설정 3. AWS CloudWatch 설정 ### 1. Slack 설정 slack에 들어가 Apps 옆에 있는 **+** 버튼을 클릭합니다. 그 다음 검색창에 **incoming-webhook** 을 검색해 들어간 후 **Add**를 누르고, 새 창이 열리면 **Add to slack** 이라는 버튼을 클릭합니다. 그 다음 메시지를 받기 원하는 채널을 선택한 후 **Add Incoming WebHooks integration** 버튼을 선택하면 끝납니다. 새 페이지에서 **Webhook URL**에 적혀져 있는 링크만 복사해서 보관하고 있으면 끝. 혹시 메시지 알려주는 봇? 의 이름을 바꿔주고 싶다면 조금 더 아래로 내려가서 **Customize Name**을 바꿔주면 됩니다. 그 아래 **Icon** 도 바꾸실 수 있습니다. ### 2. AWS Lambda 설정 AWS Lambda 에 가서 **함수 생성** 버튼을 클릭하고 **함수 이름**을 적은 뒤 함수를 생성합니다. 저의 경우 **런타임**(사용할 프로그래밍 언어)은 **Python 2.7**로 했습니다. 생성한 뒤 **함수 코드**는 아래와 같이 작성합니다. `'YOU...