레일즈 사용자테이블 장고

박제권
레일즈에서 만들어진 고객 테이블을 장고에서도 수정없이 사용하는 코드입니다. 구현 먼저 AbstractBaseUser 기반으로 User 클래스를 만듭니다. from django.contrib.auth.models import BaseUserManager, AbstractBaseUser, PermissionsMixin from django.contrib.postgres.fields import ArrayField from django.db import models from django.utils.translation import gettext_lazy as _ class UserManager(BaseUserManager): def create_user(self, email, name, password=None): if not email: raise ValueError(_('Users must have an email address')) user = self.model(email=self.normalize_email(email), name=name) user.set_password(password) user.save(using=self._db) return user def create_superuser(self, email, nickname, last_name, first_name, password): pass # ref: createsuperuser 에 password 필드이름이 하드코딩 되어있슴.

Rails share database with django

박제권
You can share rails user table (generated by devise gem) on django. Code User class based on AbstractBaseUser. from django.contrib.auth.models import BaseUserManager, AbstractBaseUser, PermissionsMixin from django.contrib.postgres.fields import ArrayField from django.db import models from django.utils.translation import gettext_lazy as _ class UserManager(BaseUserManager): def create_user(self, email, name, password=None): if not email: raise ValueError(_('Users must have an email address')) user = self.model(email=self.normalize_email(email), name=name) user.set_password(password) user.save(using=self._db) return user def create_superuser(self, email, nickname, last_name, first_name, password): pass # ref: createsuperuser is hard coded class User(AbstractBaseUser, PermissionsMixin): email = models.

장고 채팅방

박제권
장고에서 채팅방 구현하기가 엄청 쉬워졌습니다. 장고에 통합된 기능이니까, 이런 식으로 user 객체를 사용할 수 있어서 행복합니다. class ChatConsumer(AsyncWebsocketConsumer): async def connect(self): self.user = self.scope["user"] if self.user.is_anonymous: raise Exception('go away!') 튜토리얼만 쫓아가면 구현가능합니다. https://channels.readthedocs.io/en/latest/tutorial/index.html 저는 튜토리얼 따라한 시간보다 서버 배포에서 더 오래 고생했습니다. 채널 서버로 daphne 라는 놈을 선택했는데, daphne 는 백엔드로 redis 5 이상을 요구하고, 테스트 서버에 설치된 ubuntu 18 에서 그걸 설치하는건 너무 험난했습니다. (이번 기회에 ubuntu 20 으로 올렸습니다.

블로그 이전

박제권
작년 연말에 워드프레스에서 Jekyll로 이전했었는데, 지난 주말에 다시 hugo로 이전했습니다. 둘다 정적 사이트 생성기로 분류할 수 있는 것들입니다만… 처음 블로그 시작하던 2003년의 MovableType에서부터, 지금까지 이런 저런 블로그 프로그램들을 이용했습니다. 한동안은 대강 만든 루비 스크립트로 돌리기도 했었고요. 작년에 선택했던 Jekyll은 데이터베이스 대신 마크다운 파일들을 쓰는 점이나, 깃헙에서 서비스하기 쉽다는 점이 좋았습니다. 하지만, 어디 한군데 살짝 수정하고나면 브라우저에 반영되기까지 몇십초까지도 걸리는 큰 단점이 있었습니다. 처음엔 견디면서 썼는데, 시간이 갈수록 포스팅을 안하게 될 정도였습니다.

장고에서 timestamp 구하기

박제권
인터뷰 문제로 이런게 나온다면 어떨까 장고의 설정을 TIME_ZONE = 'Asia/Seoul' USE_TZ = True 라고 했을때, 다음 코드 중 어느 것이 진짜 timestamp 를 돌려줄까. datetime.utcnow().timestamp() # 1번 timezone.now().timestamp() # 2번 일단 정답은 2번이다. 순진하거나 똘똘한 날짜-시간 객체 파이썬의 날짜-시간 객체(datetime)에는 순진한(naive) 것과 똘똘한(aware) 것이 있는데, 멍청 순진함과 똘똘함은 타임존을 알고 있는지가 기준이다. 처음에 나온 문제에서 timezone.now()는 타임존을 알고 있는 aware datetime 을 돌려주지만, datetime.utcnow()는 타임존 정보가 들어있지 않은 naive한 녀석을 돌려주도록 구현되어있다.

초보자용 웹팩 서버 설정

박제권
자바스크립트에 재미가 들려서 한발한발 나아가고 있습니다. 순서가 조금 뒤죽박죽인데, jQuery 나 jQueryUI 는 오래전부터 쓰고 있고, 회사에서 작업중인 소스에는 이미 Vue 가 들어있어서 남이 만들어놓은 소스의 수정 정도는 하고 있는 정도입니다. 공부시작 하지만, 조금 어려운 문법같은게 나오면 (this 라던가, this 라던가.) 자바스크립트 문법을 비난하며 회피하곤 했습니다. 자바스크립트라는 것은 UI 다듬을 때나 ajax 를 써야할 때만 억지로 쓰는 언어라고 단정하곤 했습니다. 아래는 자바스크립트의 또 다른 약점인 더하기 빼기입니다. 얼마전부터 온라인 스터디에 참여하고 있는데, 다행히, 이번에는 진도가 조금씩 나가고 있습니다.

Java8의 람다를 이용해서 JDBC 쿼리 간단하게 만들기

박제권
JDBC 코딩을 하다보면 전처리 후처리 코드를 매번 넣어줘야 합니다. public class NormalJDBC { public static Dict select_query(String userid) throws SQLException { Connection conn = null; PreparedStatement stmt = null; ResultSet rset = null; Dict map = null; try { conn = DataSrc.getConnection(); stmt = conn.prepareStatement("SELECT * FROM TABLE_NAME WHERE TYP in (?, ?, ?) and ID = ?"); stmt.setString(1, "1"); stmt.setString(2, "2"); stmt.setString(3, userid); rset = stmt.executeQuery(); ResultSetMetaData md = rset.

파이참에서 도커 연결

박제권
회사에 젊은 피가 수혈되었다. 며칠 전 젊은 동료께서 “도커에 파이참 연결해서 코딩하고 있어요.” 라고 하시는데, 난 이거.. 전에 시도하다 잘 안되서 중단했었는데? 그래서, 여태 virtualenv 만 쓰고 있었는데? 한밤중에 윈도우즈 시스템 폴더에 DLL들을 하나씩 까보던 아이는 어디로 갔단 말인가. 먼 옛날을 생각하며, 다시한번 시도했고 성공했다. 이제 인터프리터는 서버랑 동일하게 도커에서 실행하고, 디버깅은 파이참에서 해주고 있다. 역시 이런거 할 때가 제일 재미있다. 작업 내용을 정리해둔다. 아래에 소스들은 깃헙에 있다. 1. 장고앱을 만든다.

애자일 체험 2

박제권
나의 업무방식은 3년전 애자일 코칭을 받고나서 꽤 많이 바뀌었다. 가끔 당시 적어둔 글을 보면, 무언가 할 말이 있긴한데 정리가 덜 된 느낌이 있었다. 다행히 최근에 일을 하다가 이게 중요했구나 싶은 몇가지 기억이 떠올라 적어둔다. 1. 문제 해결 나를 코칭해준 이가 제일 처음 했던 질문은 이 프로젝트를 하면서 얻고자 하는것, 개선하고 싶은 것이 무엇입니까였다. 그때 나의 대답은 하루에 5시간만 일하고 싶습니다였다. 나는, 밤새지 않고도 고객을 만족시키기, 그걸 해보고 싶었다. 옆에서 하루 5시간이라는 나의 말을 들은 팀장은 하루 4뽀모(2시간)도 하기 힘들다면서 5시간은 길어보인다는 조언을 해주셨고, 우리는 하루 6뽀모(3시간) 작업하기를 목표로 정했었다.

장고 페어코딩 후

박제권
(문서 아래 쪽에 django annoying 관련 사항이 추가되었습니다. 2016.11.30) 어제 회사의 장고 전문가와 페어코딩을 했습니다. 어제 배운 것 중에 모델 매니저 관련 사항을 공유합니다. 장고에서 ORM 으로부터 레코드 하나를 가져오는 방법에는 get()과 filter().first()가 있습니다. 저는 아이디를 주고 레코드를 하나 가져오는 경우에는 get()을 부르는 것이 맞다고 생각해서 이런 식으로 코딩을 했습니다. class SomeView(View): def def(self, req, **kwargs): try: obj = MyObject.objects.get(key=key) except: obj = None 안타깝게도 get()은 해당키의 레코드가 없으면 exception을 올려주시네요.