From ba447ef67c36e5dc176f5265ede96357fc394bf1 Mon Sep 17 00:00:00 2001 From: SW Date: Sun, 23 Oct 2022 15:20:54 +0900 Subject: [PATCH] restart blog --- _drafts/video_length.py | 46 +++++++++++++ _posts/2020-12-08-NAT.markdown | 62 ----------------- .../2021-06-20-concerning-like.markdown | 0 ...21-07-27-gin-index-and-gist-index.markdown | 66 +++++++++++++++++++ 4 files changed, 112 insertions(+), 62 deletions(-) create mode 100644 _drafts/video_length.py delete mode 100644 _posts/2020-12-08-NAT.markdown rename "_posts/2021-06-20-\354\242\213\354\225\204\354\232\224\354\227\220-\352\264\200\355\225\234-\352\260\204\353\213\250\355\225\234-\352\263\240\354\260\260.markdown" => _posts/2021-06-20-concerning-like.markdown (100%) create mode 100644 _posts/2021-07-27-gin-index-and-gist-index.markdown diff --git a/_drafts/video_length.py b/_drafts/video_length.py new file mode 100644 index 0000000..0429471 --- /dev/null +++ b/_drafts/video_length.py @@ -0,0 +1,46 @@ +import glob +import subprocess +from datetime import timedelta, datetime + +lengths = [] +LOCATION = "/Users/seungwonjeong/Desktop/sparta/Week1" # '영상이 들어있는 폴더 경로' +EXTENSION = "mp4" # 확장자 + +def get_length(filename): + ffmpeg = subprocess.Popen( + ['ffmpeg', '-i', filename], + stderr=subprocess.PIPE + ) + grep = subprocess.Popen( + ['grep', 'Duration'], + stdin=ffmpeg.stderr, + stdout=subprocess.PIPE + ) + awk = subprocess.Popen( + ['awk', "{print $2}"], + stdin=grep.stdout, + stdout=subprocess.PIPE + ) + trim = subprocess.Popen( + ['tr', '-d', ','], + stdin=awk.stdout, + stdout=subprocess.PIPE + ) + for line in trim.stdout: + # 딱 첫 번째 줄만 출력. + return line.decode('utf-8') + +# root_dir needs a trailing slash (i.e. /root/dir/) +for filename in glob.iglob(LOCATION + f'**/*.{EXTENSION}', recursive=True): + lengths.append(get_length(filename)) + + +# 시간 parse +deltas = [] +for elem in lengths: + datetime = datetime.strptime(elem[:-4], '%H:%M:%S') + delta = timedelta(hours=datetime.hour, minutes=datetime.minute, seconds=datetime.second) + deltas.append(delta) + +# sum +print(sum(deltas, timedelta(0))) \ No newline at end of file diff --git a/_posts/2020-12-08-NAT.markdown b/_posts/2020-12-08-NAT.markdown deleted file mode 100644 index d8b9f26..0000000 --- a/_posts/2020-12-08-NAT.markdown +++ /dev/null @@ -1,62 +0,0 @@ ---- -layout: single -title: "기말을 준비하며" -date: 2020-12-07 11:10:03 +0900 -categories: [Python, Aws] ---- - -## 기말을 준비하며 -2학기도 거의 끝났다. 몇가지 키워드로 이번 학기를 정리해 보겠다. - - -## 학교 공부를 하지 않기로 했다. -학교 공부보다 더 중요한 공부가 있기 때문이었다. - -10~20명 규모의 작은 스타트업에서 개발자로 일했다. 한 집단의 다음 스탭을 결정하는 -중요한 프로젝트도 맡아 봤다. 막상 실무를 해 보니, 교수님들이 학교에서 "중요하다" 라고 가르쳤던 -20년 30년 묵은 수업 내용들은 전혀 중요하지 않았다. - -대부분의 학생들은 (특별히 우리학교 학생들은) 이런 내 판단을 이해하지 못할 것이라고 생각한다. -해 왔던 경험이 다르기 때문이다. 그들은 졸업 이전에 현업에 들어가 보지 못하기 때문에, -들어간다 해도 QA나, 인턴으로 비교적 가벼운 업무를 맡기 때문이다. git 을 쓸 줄 아는 학생은 -정말 어쩌다 한 두명 봤고, 디자인 패턴과 테스트의 중요성에 공감하는 친구는 더 적었다. - -나는 스스로 더 중요하다고 생각하는 것들을 공부하기로 했다. -* 명저 읽기 (개발이랑 상관 없는) -* 우아한 테크코스 지원 (떨어졌다...) -* 숨고에서 다양한 사람들 가르치기 -* 전문 용어 안 쓰고 파이썬 가르치기 - -"뭐야 개발 공부 안헀어?" 라고 물을 수 있을 것이다. 근데 일을 해보면 절대적인 개발 실력 만큼이나 -중요한 것들이 있다. 이에 대해선 조금 이따가 이야기 하겠다. - -## 두려움 - -성적을 버리고, 더 중요한 공부에 시간을 투자하는 것. -솔직히 무서웠다. 내가 무서웠던 이유는 크게 2가지 인 것 같다. - -1. 남들이 안 가는 길이라서 -2. 성적은 내게 너무나 중요했던 것이라서 - -### 1. 남들이 안 가는 길이라서 -조금 길지만 이운규 변호사님의 인터뷰 영상 (김작가튜브) 을 소개하고 싶다. -이운규 변호사님은 "인강을 전혀 듣지 않고" 9개월 만에 사법고시를 합격한 분이시다. -인터뷰를 들으면 (떨어질까봐, 스스로의 방법이 틀렸을 까봐) "불안감" 때문에 마음고생을 하셨다는 내용이 나온다. -남들 다 듣는 인강을 본인만 안 듣고 있기 때문이었다. - -사람 마음이 변수 할당하는 것 처럼 딱! 정해지는 게 아니다. 아주 짧은 순간에도 쉼 없이 요동친다. -내가 성적이 덜 중요하다고 생각해도 기업에서는 나와 다르게 생각하는 사람도 있을 게 뻔하다. -'성실하지 않아서 학점이 낮을 거야' 라고 여겨지는 것이 두려웠다. 아니 그 보다도 -'내가 옳다고 생각한 길'이 궁극적으로 틀린 길일까봐 그것이 두려웠다. - - -### 2. 성적은 내게 너무나 중요했던 것이라서 -내 1학년 평점 평균이 4.5다. 원래부터 성적이 안 좋았으면 맘 편하게 성적을 버렸을 것이다. - - - - - - - - diff --git "a/_posts/2021-06-20-\354\242\213\354\225\204\354\232\224\354\227\220-\352\264\200\355\225\234-\352\260\204\353\213\250\355\225\234-\352\263\240\354\260\260.markdown" b/_posts/2021-06-20-concerning-like.markdown similarity index 100% rename from "_posts/2021-06-20-\354\242\213\354\225\204\354\232\224\354\227\220-\352\264\200\355\225\234-\352\260\204\353\213\250\355\225\234-\352\263\240\354\260\260.markdown" rename to _posts/2021-06-20-concerning-like.markdown diff --git a/_posts/2021-07-27-gin-index-and-gist-index.markdown b/_posts/2021-07-27-gin-index-and-gist-index.markdown new file mode 100644 index 0000000..042546c --- /dev/null +++ b/_posts/2021-07-27-gin-index-and-gist-index.markdown @@ -0,0 +1,66 @@ +--- +layout: single +title: "좋아요에 관한 간단한 고찰" +date: 2021-06-20 11:10:03 +0900 +categories: [Python, Aws] +--- + +## 게시글에 '좋아요' +좋아요, 이게 간단해 보이지만 생각보다 엄청 복잡한 기능입니다. +퀄리티 있는 좋아요 기능을 구현하기 위해서는 다음과 같은 문제를 해결해야 합니다. + +* 새로운 '좋아요' 값은 기존 '좋아요' 값에 영향을 받습니다. (new_like = old_like + 1) + 그렇다면 동시성 문제를 해결하기 위해 Lock 을 걸어야 할까? 같은 고민을 하게 되죠. + +* 다양한 종류의 테이블에 좋아요를 할 수 있어야 합니다. 요즘 SNS 보면 댓글에도 좋아요, 게시글에도 좋아요 + 별의별 종류의 테이블에 좋아요를 할 수 있죠. 이건 RDBMS 에서 어떻게 모델링을 해야 하는 걸까요? + +* 좋아요는 쓰기보다 읽기가 훨씬 많은 데이터 입니다. 따라서 좋아요 수를 계산하기 위해 record 를 매 번 세는 것은 + 효율적이지 않습니다. 총 좋아요 값을 저장할 필요가 있습니다. + +* 운영 측면에서 좋아요 수를 가지고 통계를 내기에 편리해야 합니다. + + +## 좋아요를 구현하는 다양한 방법들 + + +### 좋아요 테이블이 수많은 테이블과 직접 foreign key 를 맺는 방법 +* likes 가 수많은 foreign key 중 하나만 값을 갖고 나머지는 NULL 일 것을 보장해야 합니다. mysql 만으로는 할 수 없고, + 코드 상에서 제한을 두어야겠죠? + + + +### Document 에 좋아요를 하는 방법 + +* 공통된 부모를 두고, 부모에 좋아요를 연결 +* NULL 인 foreign key 가 없습니다. +* 좋아요 수를 구하기 위해서 바로 likes 를 join 할 수 없고, documents 를 중간에 join 해야 합니다. +* documents 에 like_cnt 를 둘 수 있습니다. + + + + +## 운영 측면에서 통계 내기 + + +### 좋아요가 가장 많은 게시글은 무엇인가? + +간단한 쿼리로 알아낼 수 있습니다. +```sql +SELECT MAX(id) FROM likes group by article_id; +``` + + + + + + + +### 좋아요 수를 읽어들이지 않고, 바로 UPDATE 를 치는 방법 +Lock 을 걸지 않고 문제를 해결하는 아주 깔끔한 방법입니다. + + + + + +