Profile img

제이미

@theeluwin@hackers.pub · 79 following · 70 followers

스콜라아이돌교수버튜버

CV
theeluwin.github.io
9

오늘 모임 전까지는 만들어서 공개하고 싶었는데ㅠㅠ 수업 준비가 바빠서 진도를 못내고 있네요... 사실 PF까지는 다 만들었는데 문서 쓰는게 일입니다... 각종 튜토리얼에, 차근차근 진행할 수 있는 가이드라인에 등등.... 그래도,,,, 많이 기대해주세요,,, 년 단위 프로젝트가 되겠지만...

8

성공적...인지는 모르겠지만 나름 안착해서 매주 실습, 그리고 매달 과제를 github classroom 통해서 자동채점 하고 있답니다. 출제 과정이 너무 복잡한게 큰 단점인데, Kaggle에서 수업용 competition을 만들 수 있는것처럼, 온라인저지 사이트에서 수업용 문제 그룹을 관리 할 수 있게되면 좋을것 같아요. 비슷한건 있다고 알고 있긴 하지만... Stepik이 이걸 참 잘해줬는데, 채점 결과는 유료고, 러시아인이 아니면 결제가 무척 힘들더라구요.

3

GitHub Classroom을 사용해서 온라인 저지 시스템을 구축해본 후기입니다.

https://theeluwin.github.io/article/online-judge-with-github-classroom/

실제로 사용하고 싶었으나, 제 결론은... 안쓰는쪽으로 났습니다. 이유는 결국, 문제 출제하는 UI/UX가 좋지 않다는 것입니다. 제가 고생을 덜 해야만 하니까요(,,,,) 암튼 GitHub Classroom이 문서도 제대로 안되어있기도 하고, 기능이 아직 좀 오락가락 합니다. 없는 기능도 너무 많구요. 제 검토를 참고해주십시오, , ,

2

CV 겸 개인 홈페이지였던 사이트를 아예 커스텀 블로그로 바꾸면서... 어제 슬쩍 홍보를 올렸는데요

https://theeluwin.github.io/

Pelican으로 만들고 GitHub Pages로 배포를 했는데, 급하게 수정할게 있어서 추가 commit을 했더니 갑자기 README를 기반으로 한 디폴트 페이지로 바뀌었습니다;;;

그러니까 기존 배포 A, 리뉴얼 배포 B, hot-fix 배포 C 이렇게 세개가 있으면, C를 했는데 실패해서 (실패 원인: GitHub Action이 새벽에 일시적으로 불안정했음) 당연히 B가 나올줄 알았는데, A도 B도 아닌 README 기반의 만든적도 없는 배포 X가 나왔습니다... 왜였을까요...? Action 사용하기 이전 시절의 (Jekyll 등을 지원하던) GitHub Pages 빌드 방식이 남아있어서 뭔가 꼬였는지...

암튼 블로그 많이 놀러와주세요,,, 게임 추천으로 시작합니다 (포스트도 아니고 인덱스 페이지에서)

9

Python 기반의 교육용 DBMS인 BlueBase라는걸 만들고 있습니다. 언젠가... 언젠가 공개하겠습니다. 제 과목 수강생이 아니더라도 누구나 해볼 수 있게, GitHub Classroom 기능을 이용해볼 예정입니다.

Python 기반의 교육용 DBMS인 BlueBase 프로젝트 기본 설명에 대한 스크린샷.BlueBase 프로젝트 중 paged file 모듈의 buffer manager에 대한 설명이 있는 스크린샷.
8

좋은 질문 감사합니다. 실험 결과 4096의 배수인게 유의미한것 같습니다.

페이지 사이즈별 페이지 단위 파일 관리 비교 실험 추가 결과에 대한 스크린샷. 4096의 배수가 확실히 빠르다.
5

DBMS 같은 데에서 파일을 관리 할 때엔 항상 4096 바이트 단위의 페이지 형태로 관리합니다. 왜그럴까요? 여러가지 이유가 있는데, 보통은 OS도 4096 바이트 단위로 파일 시스템을 관리하기 때문입니다. 그래서 캐시 같은 OS의 여러 가속 장치들의 도움을 받을 수 있죠.

근데 정말로 그럴까요?

그게 궁금해서 직접 한번 페이지 파일 매니저를 구현해서 실험해봤습니다. 통계적으로 유의하게 빠르네요.

페이지 파일 시스템을 사용 할 때, 페이지 크기가 4096인게 가장 빠르다는 실험 결과에 대한 스크린샷.
9

TIL: 빈 파일을 만들어서 열고, seek로 적당히 건너뛴 다음 거기서부터 write를 하면, 건너 뛴 부분은 전부 0으로 알아서 채워주고 파일 크기도 자연스럽게 늘어난다.

이걸 왜 제가 몰랐는지 설명해주실분

2

RedBase라고 혹시 아시나요. Stanford에서 교육용으로 학생들이 직접 만들게끔 하는 DBMS인데요, 이걸 Python 버전으로 만들어보고 있습니다. 이름하야 BlueBase. 완성되면 과제용 구현부만 비워둔채로 공유할게요. 많은 기대 바람(?)

5
3

지난 한달간 열심히 개발한 실시간 퀴즈 사이트입니다. django, django drf, jwt 기반 인증, websocket, ticket으로 받아오는 jwt websocket 인증, celery, 등을 모두 사용한 예시이기도 합니다. 구경와주세요~

https://github.com/theeluwin/Qlickr

6

django에서 test를 할 때, async/await 처리를 성공적(?)으로 하려면 TransactionTestCase를 사용해야하는데 이러면 classmethod인 setUpTestData를 사용하지 못합니다. 그래서 매 테스트 함수마다 데이터를 넣어주는 setUp으로 도로 바꿔야했고... 2분 걸리던 테스트를 최적화해서 10초로 줄여놨다가 다시 30초로 늘어났네요 뭔가... 하루종일 뭐한거지 싶지만,,, 꼭 한번 알고 갔어야하는 느낌이기도 합니다. 요컨대, 추상화/최적화는 정말 해봐야만 보이는 문제점이라는게 있고 제가 아직 경험이 부족해서 예측이 잘 안되네요(

2

서비스 A를 개발하기 위해 boilerplate B를 만들기 위한 boilerplate C를 만들고 시작했더니 A에서 뭐 하나 바꾸면 B, C까지 전부 다 바꾸고 있는 상황... 이게 실제로 운영을 해봐야만 발견할수 있는게 너무 많네요 하 당연한 얘기긴 한데ㅠ

1
2

서버에서 도커 빌드가 안됨 (메모리 부족)

로컬과 서버 CPU 아키텍처가 다름 (호환 안됨)

쉬운 해결책: 메모리를 돈 주고 늘린다

귀찮은 해결책: 빌드용 서버를 잠시 빌려서... 하ㅠ...

2

무겁고 큰 메인 기능 구현 착수하기가 겁나서 가볍고 작은 서브 기능부터 구현하면서 차일피일 미루다가 더이상 서브 기능 남은게 없어서 드디어 메인 기능 구현을 했는데, 소요된 노력이 서브와 유사한 수준이라 뭔가... 알 수 없는 불안감이 느껴지는 이 기분... 아시나요... 중요한걸 미루지 맙시다(?

4

요즘 웹을 많이 하고 있는데 정말 단순한 기능 하나도 뭐 이리 구현할게 많은지요...

  1. 버튼 하나 누르면 어떠한 상태 변경이 전파 되는 기능임
  2. 버튼을 누르는 유저는 그걸 누를 수 있는 권한이 있는지 체크
  3. 모든 유저가 websocket으로 전파 받을 수 있도록 해야함
  4. 로그에 JWT가 남으면 싫으니까 ticket을 발행해서 연결
  5. 해주는 API를 짜고 ticket에서 user 알아내서 컨텍스트에 붙여주는 미들웨어 구현
  6. 을 하기 위해 이제 redis로 캐시를 붙이고
  7. 백엔드 다 했으면 프론트에서 이제 어떤 component가 websocket에 연결 되어 있을지
  8. 이걸 받아서 또 다른 component한테 어떻게 뿌리지 (event emit으로...
  9. 등등등...
  10. 따라서 일단 야크 털을 깎아야한다 라는
5
1

아마 다들 비슷한 경험이 있으실겁니다. 태어나서 처음으로 쌍방향 연결에 성공해서 두 클라이언트가 대화할 수 있게 했을때의 기쁨... 저는 딱 15년만에 하는거라(...) 처음 해본것처럼 기쁘네요

8
2
3

(이미 저 멀리 와버린 야크 털 깎기 - 어디서 출발했는지도 이젠 잊어버림)

django에서 django rest framework에서 jwt로 authentication을 하기 위해 simple jwt를 쓸 때 (아이고 길다) access, refresh token을 cookie에 두고 사용하고 싶다면 약간의 수제(?) 코드가 필요합니다. 누군가 구현 해놨을까 싶었는데 있네요!

https://velog.io/@kimjihong/simple-jwt-login

https://velog.io/@kimjihong/issue-drf-jwt-header#solution---custom-middleware

하... 하려던건 이게 아닌데 이걸 적용 할지말지 또 고민... (결국 하겠죠

1
1

구체적으로 내가 원하는 스펙이 따로 있어서 직접 구현하기로 했습니다... 근데 이거를 다시 오픈소스로 만들면 또 관리 안되는 오픈소스C가 탄생하는 것일까요?

3

django channels에서 jwt authentication을 쓰고 싶은데

  1. 직접 만들긴 뭔가 싫다
  2. 오픈소스A는 5년 전에 마지막 커밋이 있다...
  3. 오픈소스B는 2년 전이 마지막이긴 한데 .DS_Store가 같이 커밋 되어있어서 불안하다...

어카지

1

야크 털 깎기 안하기가 쉽지 않습니다.

  • 지금 필요한것: 일정 시간 동안만 설문을 수집하여 결과 확인하기
  • 올바른 구현: 구글 폼
  • 실제로 하고 있는것: 일정 시간만 공개되는 설문을 실시간 퀴즈 풀기 사이트와 유사하므로 웹소켓으로 퀴즈 내용을 알려주는 풀스택 웹서비스를 구현하기 위한 boilerplate에 혹시 모를 task 관리를 위해 redis 붙이고 celery 붙이고 모니터링 붙일지 말지 고민하기
6
1

Pelican을 기준으로,

  1. docker 개발(hot-reload), 프로덕션(nginx) 환경 구축
  2. jinja2 tag, filter, macro 사용하기 (+ context)
  3. GitHub Action으로 build 테스트 + PR merge시 GitHub Pages로 deploy하기

하는 내용이 동봉되어있습니다. 약간 튜토리얼을 겸한달까요...

이왕 이렇게 된거 후기 글도 쓰고 정말로 튜토리얼도 만들고 할까 싶었지만... 코딩 하느라 좀 지쳐버린ㅠ

1

대학원 연구실 홈페이지 생성기를 만들었습니다. Jekyll은 Ruby니까, 이번엔 Python을 좀 써보자 싶어서 Pelican으로 구현했습니다. Article을 일종의 DB처럼 사용해서 멤버나 논문, 뉴스, 강의 등의 데이터를 관리하는 방식입니다.

솔직히는 하루이틀이면 끝날줄 알았는데 만드는데 거의 full-time으로 일주일이 걸렸네요. macro에서 왜 context가 전달이 안되는지, filter에서는 왜 안되는지, GitHub Action은 왜 맨날 뻑이 나는지... branch 규칙도 여러번 수정하고 github pages로 내보낼때만 fork me 리본 달아주고 등등... 왤케 자잘하게 할게 많은지ㅠ

Pelican 자체는 쓸만하더라구요. 필요한 기능이 거의 다 있습니다. 근데 없는것처럼 보여요. 근데 다 있긴 합니다.

암튼... 구경와주세요

https://github.com/theeluwin/pelican-labsite

Pelican 기반 대학원 연구실 홈페이지 생성기로 만든 사이트 예시 스크린샷.
7
3

웹코딩 왤케 재밌는지, 약간 게임에 빠져있는것과 같은 경험임

  1. 현재 내게 중요하지 않은 작업 (즉, 딴짓)
  2. 책임을 지지 않아도 되는 서비스 (상업용이 아님)
  3. 오랜만에 함
  4. 원래 좀 재밌긴 함

이렇게 네가지가 겹침.

방금은 최적화도 좀 했다. 대충 O(n^3)쯤 되는 코드를 O(n)으로 바꿈. 근데 n은 대충 10쯤 되고, 기존 0.01초 걸리던게 이제는 0.01초 걸림.

4

연구실 홈페이지를 쉽게 만들고 관리 할 수 있는 pelican 기반 bolierplate를 만들고 있습니다...만, 이건 말이 bolierplate지 사실상 theme도 포함인거라 디자인이 좀 들어가있어야하는데... 여기서 막혔습니다,,, 다른 부분은 완전 완성인데ㅜㅜ

1

테스트 작성 할 때 마다 약간 테스트 자체를 자꾸 디버깅 하고 있느라 시간을 다 쓴다는 느낌이었는데... 오늘은 그래도 Cursor의 도움으로 94개나 되는 테스트를 순식간에 작성했고 (엄청난 디버깅이 있었지만) 그래도 딱 한개, 정말로 테스트에 의해서만 잡을 수 있는 문제를 발견해서 올바르게 수정 할 수 있었다.

3
4
1

오픈소스에서 아쉬운 점 발견 → 내가 기여해야지! → 혹시 모르니 issue, PR 확인해서 중복이 아닌지 체크 → 이미 해결된 문제였고 내가 사용법을 몰랐을 뿐 (그럼 접근성이 부족하니 문서라도 업데이트 할까? → 문서에도 적혀있었고 그저 내가 게을렀을 뿐)

9

jekyll 대신 pelican을 써보고 있습니다. Cursor에게 알아서 좀 짜라고 맡겨놨더니 링크가 모조리 깨지고 화면 템플릿도 제대로 안보이고 난리더라구요. 4시간동안 잡도리를 한 결과, 그냥 제가 처음부터 다시 다 짰습니다. 젠장... 암튼 pelican 쓸만 하네요. 어차피 대부분의 기능은 직접 구현해야해서, 최소한의 세팅만을 원했는데 충분히 제공하는것 같습니다. 공개할 수 있게되면 use case로써 공유해볼게요.

1
1

퀴즈엔 여러개의 보기가 있습니다. 사용자는 퀴즈당 한개의 보기만 고를 수 있습니다. 이를 어떻게 강제 할 수 있을까요? Django ORM에서 말이죠.

답은, ‘쉽지 않다’ 입니다.

(user, quiz, option)을 response의 필드로 두고 (user, quiz)에 unique constraint를 걸면, option이 quiz 소속인지를 보장 할 수 없는데, 이거까지 보장하는건 쉽지 않습니다.

(user, option)만 필드로 둘 경우엔 (user, option__quiz)를 unique로 둬야하는데 이런 기능은 존재하지 않죠.

복합키, trigger 등을 사용하기엔 너무 복잡하고, 결국 어플리케이션 로직이 필요합니다.

그래서, 어떡하지 이제

1

새롭게 다시 태어난, 또 만들어버린 boilerplate. 이제는 진짜 monolithic 하고 Pocket Galaxy라는 이름에 걸맞는 boilerplate입니다.

Django + Vue(Vuetify) 조합이구요, nginx가 이것저것을 다 처리합니다.

백엔드는 /api에서 서빙하고, 기타 기본적인 static 캐싱이나 로깅 등 전부 기초적인건 제공합니다.

간단한 웹사이트 하나 만들겠다는게 어쩌다 여기까지 왔는지.... 암튼 이제는 진짜 최소한의 웹사이트 만들때 뚝딱 하면 만들수 있을것 같습니다 제발...

내부용 툴 만들때 애용해보세요.

https://github.com/theeluwin/pocket-galaxy

2

아 9월부터 강의를 합니다 (교수가 되었습니다). 무슨 과목을 맡게될지는 모르겠지만 꿈에 그리던 기깔난... 마치 IoT로 도배된 집과도 같은 강의를 해보겠습니다 기대해주세요. 그리고 언젠가 이 경험들이 쌓여서 파이콘에서라도 발표하면 좋겠네요.

14

그동안 웹 백엔드 따로, 프론트엔드 따로 만들어서 인스턴스 2개에 올리는 느낌으로 작업했는데... 지금 목표는 뿅 하면 웹사이트가 생기는거라서 compose도 빼버리고, 도커 이미지 하나에 전부 때려박아서 정말 딱 이 이미지 하나만 ECS 같은데에라도 올리면 짠 하고 곧바로 돌아가게끔 하고 있는 중. 앞으로 이걸로 온갖 강의 보조도구(퀴즈 사이트 등)를 만들 예정.

3
1

4년만에 하는 웹개발... 난 그저 간단한 퀴즈 푸는 사이트를 만들려고 했던것 뿐인데... 살면서 boilerplate만 한 10번쯤 만드는것 같음. 만들어두면 또 한동안 웹개발 할 일 없어서 방치되고, 그 사이에 온갖 라이브러리가 사라지면서 못쓰는 코드가 되어버림. 프레임워크들도 엄청나게 많이 바뀌어있고.

이번에 작업한거: 4년전에 만들어둔 boilerplate인데 좀 최신화를 했습니다. Django + Vue 조합. 기능이라고는 겨우 로그인해서 'Home' 문구 하나 볼 수 있는 웹페이지인데 어쩌다가 이렇게까지 복잡해졌을까요...

https://github.com/theeluwin/pocket-galaxy

7

여전히 web front frustration을 겪는중. 웹개발 할 일이 3년에 한번 꼴로 있다보니, 예전 코드로 돌리면 다 먹통임. 그래서 새로 (가령 Vue) init 시켜보면 뭔가 또 알수없는 각종 기본 설정 파일이 273개쯤 추가되어있음. 하루종일 ‘얘는 또 뭐여...’ 하면서.

2
2
1

지난번 read papers with me에 이어서... 이번에도 어차피 논문 읽을겸, 세미나 발표 준비하듯 피피티도 만들고, 영상도 촬영해봤는데요,

결국 촬영 + 편집에 오버헤드가 너무 많이 걸려서 이것도 그다지 좋은 방법이 아니었네요. 혹시라도 비슷한 생각 하신 분들은 참고하시길(...)

https://www.youtube.com/watch?v=X6yWfjBgHsg

4