오랜만에 면접을 봤서 정리글.

실제 면접 질문들

 

- callback hell을 어떻게 처리 하면 좋은가?

- 비동기  

- libuv 

- node.js  

- 이벤트 루프

- package_lock.json 

- cors

- xxs

- typescript

- 클로져

- http, https

- orm

- index

- 트랜잭션

 

이정도? 30분 정도 했다... -_- 10분 정도  한다며!!

 

'TIL' 카테고리의 다른 글

면접질문 ( node.js + 백엔드 )  (0) 2019.10.17
Google Next Extended Seoul 2018  (0) 2018.10.15
프로세스와 쓰레드  (0) 2018.07.30
mysql replication  (0) 2018.07.09
mysql fulltext  (0) 2018.07.09
ubuntu 14.04 mysql install  (0) 2018.07.05

WRITTEN BY
No.190
세계정복의 시작점

트랙백  0 , 댓글  0개가 달렸습니다.
secret
# -*- coding: utf-8 -*-
class Heap:
    def __init__(self):
        self.arr = []

    def reheap_down(self, idx):

        if (idx*2) + 1 < len(self.arr):
            right = 0
            left = self.arr[idx*2+1]

            if idx * 2 + 2 < len(self.arr) - 1:
                right = self.arr[idx * 2 + 2]
            if left > right:
                large = idx * 2 + 1
            else:
                large = idx * 2 + 2

            if self.arr[idx] < self.arr[large]:
                self.arr[idx], self.arr[large] = self.arr[large], self.arr[idx]
                self.reheap_down(large)

    def reheap_up(self, idx):
        if idx:
            parent = (idx - 1) // 2
            if self.arr[idx] > self.arr[parent]:
                self.arr[idx], self.arr[parent] = self.arr[parent], self.arr[idx]
                self.reheap_up(parent)

    def insert(self, number):
        self.arr.append(number)
        self.reheap_up(len(self.arr)-1)
        return True

    def delete(self):
        if len(self.arr) <= 0:
            return False

        del_number = self.arr.pop(0)
        self.reheap_down(0)
        return del_number

    def sort(self):
        return [self.delete() for x in range(len(self.arr))]





h = Heap()
h.insert(1)
h.insert(3)
h.insert(2)

print(h.arr)

print(h.sort())

h.insert(1)
h.insert(3)
h.insert(2)

print(h.delete())
print(h.delete())
print(h.delete())

 

참조 : https://www.zerocho.com/category/Algorithm/post/582de223d4416a001860e763

'app > python' 카테고리의 다른 글

python heap 구현 소스  (0) 2019.10.14
python zen (계속 갱신중)  (0) 2019.08.12
python datetime  (0) 2019.06.04
pycharm 프로젝트 시작시 venv 셋팅  (0) 2019.01.22
python 시작시 작업들  (0) 2018.12.31
ubuntu pycharm에서 ImportError: No module named pip에러가 난다면  (0) 2016.07.18

WRITTEN BY
No.190
세계정복의 시작점

트랙백  0 , 댓글  0개가 달렸습니다.
secret

도저히 django-cors-headers 가 설치 되지 않아서 미들웨어로 처리 했다. (이유는 아직도 모른다.)

 

from django import http

try:
    import settings
    XS_SHARING_ALLOWED_ORIGINS = settings.XS_SHARING_ALLOWED_ORIGINS
    XS_SHARING_ALLOWED_METHODS = settings.XS_SHARING_ALLOWED_METHODS
    XS_SHARING_ALLOWED_HEADERS = settings.XS_SHARING_ALLOWED_HEADERS
except:
    XS_SHARING_ALLOWED_ORIGINS = ''
    XS_SHARING_ALLOWED_METHODS = ['POST', 'GET', 'OPTIONS', 'PUT', 'DELETE']
    XS_SHARING_ALLOWED_HEADERS = []


class XsSharing(object):
    def __init__(self, get_response=None) -> None:
        self.get_response = get_response

    def __call__(self, request):
        response = self.get_response(request)
        return response

    def process_request(self, request):

        if 'HTTP_ACCESS_CONTROL_REQUEST_METHOD' in request.META:
            response = http.HttpResponse()
            response['Access-Control-Allow-Origin'] = XS_SHARING_ALLOWED_ORIGINS
            response['Access-Control-Allow-Methods'] = ",".join(XS_SHARING_ALLOWED_METHODS)
            response['Access-Control-Allow-Headers'] = ",".join(XS_SHARING_ALLOWED_HEADERS)
            return response

        return None

    def process_response(self, request, response):
        if response.has_header('Access-Control-Allow-Origin'):
            return response

        response['Access-Control-Allow-Origin'] = XS_SHARING_ALLOWED_ORIGINS
        response['Access-Control-Allow-Methods'] = ",".join(XS_SHARING_ALLOWED_METHODS)

        return response

 

settings.py에 위의 미들웨어를 선언해준다. 

MIDDLEWARE = [
    'middlewares.middleware.django-crossdomainxhr-middleware.XsSharing',
    ....
]

 

디폴트로 모두 허용이므로 settings.py에 파라미터를 추가해준다.

XS_SHARING_ALLOWED_ORIGINS = '*' # 허용하는 도메인 콤마(,)로 구분 ex: www.google.com, *.naver.com
XS_SHARING_ALLOWED_METHODS = "POST, GET, OPTIONS, PUT, DELETE"

 

 

참고: https://gist.github.com/jessykate/2941258


WRITTEN BY
No.190
세계정복의 시작점

트랙백  0 , 댓글  0개가 달렸습니다.
secret

회사에 람다신봉자가 있다. 

 

ec2에 서버를 올리면 관리는 어떻게 하며, 트래픽과 확장까지 람다가 다 관리해주지 않느냐며, 서버 아키텍쳐를 람다로 만들어놨다. 

 

결국 람다신봉자는 서버를 하지 않는다. (...그럼 왜..이렇게 하고 갔나요??)

 

람다를 프로젝트에 사용하면서 문제점을 몇가지 써 보려 한다. 

 

1. 람다의 용량이 간당간당하다.

현재 서버 프레임워크는 django이며, 서비스의 특성상 많은 통계 패키지를 사용한다. (numpy, scipy, scikit-learn 등등...)

패키지 배포에 50MB라는 한도가 있지만 /tmp 꼼수와 람다의 다른 계층의 용량을 포함하면 250MB까지 올릴수 있다. 

 

"250MB이면 많은거 아냐? "라고  생각하시는 분은....위의 패키지를 로컬에 설치해 보시길 바란다. 

정말 용량이 간단간당하다. 또한 연구팀에서 배포한 모듈이 너무 커서 직접 배포 버전(다이어트 버전)을 만들기 까지 했다. 

용량이 큰 서비스는 그냥 서버(ec2, 혹은 fargate)를 통해서 하시길. 

 

- 위의 람다신봉자는 자신의 코드가 람다에 못올라간다고 fargate쓴다. 

 

2.  DB connection 문제

람다는 하나의 요청에 하나의 람다가 응답하는 구조이다. 

그러면 해당 요청에 RDS를 써야 한다면, 람다 하나당 커넥션 하나를 물고 있는게 된다. 

aws RDS에서 커넥션풀 == 돈이다. RDS 비싼거 쓸수록 커넥션풀이 늘어난다. 

해결!! 이면 좋겠지만, 돈이 없는걸? RDS도 가장 싼걸 쓰고 있다.

람다에서 바깥계층에 커넥션 풀을 둬서 커넥션을 계속 이용하는 방법도 있지만,  ( https://www.slideshare.net/awskorea/aws-lambda-aws-aws-summit-seoul-2019 )

서비스가 django에 zappa로 람다로 올리는 형식이다.  ==  바깥 계층을 사용을 못한다.

결국 람다 요청이 동시에 많은 요청이 오면 람다가 실행하다가 django에서 커넥션 에러를 뱉고 죽는다.

( 테스트 결과 200개 정도 동시 요청하면 사망 )

디비를 사용하면서 요청이 많은 서비스라면 람다를 쓰는것은 재고해보자

 

 

3. 스레딩 문제

메일을 보내는 로직이 필요했다. 문제는 메일을 보내는데 대략 8초 정도의 딜레이가 생긴다. (메일서버연동시)

사용자가 10초 동안이나 멈춘 화면을 볼수는 없기에 리턴값을 바로 주기 위해서 비동기식이 필요했고 

비동기식으로 처리하기 위해서 스레딩을 사용했었다. 

 

(왜 async를 사용하지 안했나고 물어보신다면, async를 사용하려면 내부까지 모두 비동기함수로 채워져야 한다. 

만일 block I/O 함수를 사용하면 비동기를 사용하나 마나 동기식으로 작동한다. django send_mail은 동기 함수이다.)

 

로컬에서 잘 돌아가길래 문제 없겠지~~~했는데 역시나...

메일이 갔다, 안갔다를 반복하면서도 에러가 없어서 이상하다 했는데

람다에서의 리턴은  람다가 cold 상태가 되므로 스레딩도 사라진다!!!!!!!!!!!!!

람다에서 스레딩을 사용할 경우 잘 생각해보자, 리턴하면 스레딩도 사라진다

 

 

 

aws lambda는 서버를 대신하지 않아

 

람다에 서버리스라는 말이 붙어서 많은 사람들이 기존의 서버를 대신하는 서비스 정도로 생각하고 있다. 

(ex : 함수 하나만 만들면 서버를 대신한다고?! 좋은데?!)

 

하지만 정확하게는 서비스간의 api 통신을 위해서 만들어 진게 lambda 이다. ( aws에서 서비스간의 통신을 위해서 만든 서비스라고 했다. )

 

단지 api 통신이 가능하기 때문에 서버로 사용가능 한 것일 뿐 본질은 아니다.

 

람다의 많은 예제들이 이미지 리사이즈, cron에 따른 배치 잡, 간단한 백그라운드 처리 인 이유는 위의 상황들을 겪어 보면 알게 된다. 

 

"아!! 서버로 사용하면 큰일나는구나.."

 

람다는 좋은 물건이다. 의도에 맞게 잘  사용한다면, 

 

 

추가

2019.08.22.  드디어 람다 신봉자도 람다는 api 서버와는 맞지 않다고 말했다!! 만세!!!

 

'aws' 카테고리의 다른 글

aws lambda는 서버를 대신하지 않아  (0) 2019.08.14
route53 s3 no targets available  (0) 2018.08.11
aws s3 권한 설정  (0) 2018.08.10
aws cloudWatch 알림 설정  (0) 2018.08.09

WRITTEN BY
No.190
세계정복의 시작점

트랙백  0 , 댓글  0개가 달렸습니다.
secret

1.  get list element in a list of tuples

a = [(1, u'abc'), (2, u'def')]

# 기존 방법
def _seperate(l_wstnid_and_weight):
	l_wstnid, l_weight = [], []
	for k, w in l_wstnid_and_weight:
		l_wstnid.append(k)
		l_weight.append(w)

	return l_wstnid, l_weight

print(_seperate(a))

# 간략하고 쉽게 
unzip = list(zip(*a))

print((unzip[0], unzip[1]))

 

2. zip

a = dict(one=1, two=2, three=3)
b = {'one': 1, 'two': 2, 'three': 3}
c = dict(zip(['one', 'two', 'three'], [1, 2, 3]))
d = dict([('two', 2), ('one', 1), ('three', 3)])
e = dict({'three': 3, 'one': 1, 'two': 2})
a == b == c == d == e

3. zip index

for i, (a, b) in enumerate(zip(genres, plays)):
	print(i, a, b)

 

4. list in list sort (1번째 항을 기준으로 정렬)

from operator import itemgetter
list = sorted(list, key=itemgetter(1), reverse=True)

 

5. dict key sort

sort_dict = sorted(dict, key=lambda k: dict[k], reverse=True)

 

6. list to dict(갯수를 value로 )

from collections import Counter

c = Counter(clothes)

 

7. list in list to dict(이중 배열의 1번째 인자를 key, 갯수를 value로)

from collections import Counter

clothes = [["yellow_hat", "headgear"], ["blue_sunglasses", "eyewear"], ["green_turban", "headgear"]]
c = Counter([x[1] for x in clothes])

 

8. list minus list 1 (두개의 리스트에서 중복 되지 않는 원소 찾기 - 같은 단어는 무조건 제거)

set(["leo", "kiki", "eden"]) - set(["eden", "kiki"])
# {'leo'}
set(["mislav", "stanko", "mislav", "ana"]) - set(["stanko", "ana", "mislav"])
# {}

 

9. list minus list 1 (두개의 리스트에서 중복 되지 않는 원소 찾기 - 한번만 삭제하기)

collections.Counter(["mislav", "stanko", "mislav", "ana"]) - collections.Counter(["stanko", "ana", "mislav"])
# {"mislav": 1}

 

10. sorted()시 람다로 두개의 키를 받고 싶을때 

def compare(a, b):
    t1 = a + b
    t2 = b + a
    return (int(t1) > int(t2)) - (int(t1) < int(t2))


def solution1(numbers):
    if set(numbers) == {0}:
        return "0"

    nums = [str(num) for num in numbers]
    nums = sorted(nums, key=cmp_to_key(compare), reverse=True)
    return "".join(nums)

11. int list to str list 

numbers = list(map(str, numbers))

numbers = list(map(lambda i: str(i), numbers))

12. run function name

str_temp = 'test_solution'
getattr(str_temp, 'lower')()
getattr(str_temp, 'upper')()

 

13 decorator memoization

import functools

@functools.lru_cache()
def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n-2) + fibonacci(n-1)

fibonacci(6)

'app > python' 카테고리의 다른 글

python heap 구현 소스  (0) 2019.10.14
python zen (계속 갱신중)  (0) 2019.08.12
python datetime  (0) 2019.06.04
pycharm 프로젝트 시작시 venv 셋팅  (0) 2019.01.22
python 시작시 작업들  (0) 2018.12.31
ubuntu pycharm에서 ImportError: No module named pip에러가 난다면  (0) 2016.07.18

WRITTEN BY
No.190
세계정복의 시작점

트랙백  0 , 댓글  0개가 달렸습니다.
secret

로컬과 실서버의 디비의  migrate가 꼬여서 개발한 컬럼이 반영이 안될때!!

컬럼은 처음부터 소스에 반영이 아닌 8번에서 반영되어야 합니다!! (git으로 잠시 stash로 넣어놨다가 8번에서 꺼내세요)

 

  1. 해당 디비의 django_migrations 테이블 데이터 삭제 (truncate)

  2. python3 manage.py makemigrations

  3. python3 manage.py showmigrations

  4. python3 manage.py migrate --fake components ( "django_content_type" 에 name 이 없다고 에러가 나면 하단을 참조하세요.)

  5. 마이그레이션 파일 삭제

    1. find . -path "*/migrations/*.py" -not -name "__init__.py" -delete

    2. find . -path "*/migrations/*.pyc" -delete

  6. python manage.py makemigrations

  7. python manage.py migrate --fake-initial

  8. 변경할 칼럼 반영 

  9. python manage.py makemigrations

  10. python manage.py migrate --fake-initial

 

Good Luck !!

 

 

 

만일!! django_content_type의 name이 없다고 에러가 발생 한다면!!

django.db.utils.ProgrammingError: column "name" of relation "django_content_type" does not exist

 

아래의 sql을 해당 디비에서 실행시켜 칼럼을 추가 해 줍니다. 

ALTER TABLE django_content_type ADD COLUMN name character varying(50) NOT NULL DEFAULT 'someName';

WRITTEN BY
No.190
세계정복의 시작점

트랙백  0 , 댓글  0개가 달렸습니다.
secret

EFK의 설치는 아래의 포스팅을 참조했습니다. 

https://lng1982.tistory.com/281

 

EFK Stack 구축 using Docker compose

Elasticsearch + Fluentd + Kibana 조합을 EFK Stack이라 부른다. 참고로 Elasticsearch + logstash + Kibana 조합은 ELK Stack 이다. Fluentd : 오픈소스 log collector Elasticsearch : Lucene 기반 분산 검색..

lng1982.tistory.com

위의 포스팅을 잘 따라 했다면 kibana에서 로그를 볼수 있는 화면이 나온다. 

그러면 실제 django의 logger를 전송해보자.

 

1. django-fluentd 패키지 설치 

$ pip install django-fluentd

or

git clone https://github.com/jayfk/django-fluentd.git
cd django-fluentd
python setup.py install

2. settings에 logger 설정 추가 

LOGGING = {
    'version': 1,
    'disable_existing_loggers': True,
    'formatters': {
        'fluent_formatter': {
            '()': 'fluent.handler.FluentRecordFormatter',
            'format': {
                'level': '%(levelname)s',
                'module': '%(name)s',
                'message': '%(message)s',
                'time': '%(asctime)s',
                'file': '%(filename)s',
                'line': '%(lineno)d',
            },
            'datefmt': '%Y-%m-%d %H:%M:%S',
        }
    },
    'handlers': {
        'fluent': {
            'level': 'INFO',
            'class': 'fluent_support.DjangoFluentHandler',
            'tag': 'app.log',
            'host': 'localhost',
            'port': 24224,
            'formatter': 'fluent_formatter'
        },
    },
    'loggers': {
        'django': {
            'handlers': ['fluent'],
            'propagate': False,
            'level': 'INFO',
        },
    }
}

formatters은 로그의 포멧을 지정합니다. 

handlers은 사용할 로그 패키지와, 어떠한 포멧으로 할지 지정합니다. 

loggers은 지정한 app / 프로젝트를 지정하며('', django로 설정하면 프로젝트 전체가 됩니다. ),

           사용할 handler, 로그의 레벨을 지정합니다. 

즉  loggers에서 INFO로그로 핸들러를 'fluent'로 지정했으며, 핸들러에서는  fluent에서 포멧을 'fluent_formatter'로 지정했으며, fluent_support로 설정했습니다. 

 

 

3. fluent_support.py 파일 추가 (프로젝트 최상위에 추가 해주세요.)

# coding: utf-8
import json
import logging
import socket

from fluent import sender


class DjangoFluentHandler(logging.Handler):
    def __init__(
            self, tag, host='localhost', port=24224, timeout=3.0,
            verbose=True):
        logging.Handler.__init__(self)
        self.tag = tag
        self.sender = sender.FluentSender(tag,
                                          host=host, port=port,
                                          timeout=timeout, verbose=verbose)
        self.hostname = socket.gethostname()

    def emit(self, record):
        if record.levelno < self.level:
            return
        msg = self.format(record)
        data = {
            'host': self.hostname,
            'name': record.name,
            'levelname': record.levelname,
            'process': record.process,
            'message': json.dumps(msg),
        }
        self.sender.emit(None, data)

    def _close(self):
        self.sender._close()

django logger는 emit의 함수가 호출되는데 결국 data를 fluentd로 전송하게 됩니다. 이제 data에 필요한 부분만 넣어주시면 마음껏 커스텀이 됩니다. 

 

서버를 실행하고, 페이지를 출력 해보면 kibana에서 로그를 확인을 할 수 있습니다!!

 

 

 

참조

https://tokibito.hatenablog.com/entry/20131203/1386006672

 

Djangoのログ出力をFluentdで集める - 偏った言語信者の垂れ流し

Djangoのログ出力をFluentdで集める方法について。 ログレベルがERRORやWARNINGのものはSentryを使うのが便利だと思うけど、それ以外のINFOやDEBUGはSentryに入れるには数が多すぎるのでどうするか考えてて、最初はローカルのファイルに書き出していた。 けどまあ複数のサーバーにログファイルがあるとやっぱり不便だったので、Fluentdを使って一箇所に集めることにした。 簡単にできるかなーと思ってたんだけど、fluent-logger-pythonのlogging用のハンドラのイ

tokibito.hatenablog.com


WRITTEN BY
No.190
세계정복의 시작점

트랙백  0 , 댓글  0개가 달렸습니다.
secret

- 직원을 프로페셔널 파트너로 보지 않고 시키는 일을 잘하는 일꾼이라고 생각하는 회사는 안전 욕구를 위협하여 일을 시키려는 경향이 있다. "너 아니어도 일할 사람 많아!", "잘리고싶어?" 같은 메시지로 안전 욕구를 끊임없이 위협한다. 이런 회사에선 행복할 수 있는 사람은 없다. 

 

- 매니저는 내가 하는 일이 회사에 얼마나 중요한지, 내가 있는것이 팀에 얼마나 도움이 되는지를 구체적으로 이야기해주었다. 다른 사람과 비교하여 내가 우위에 있다는 뜻이 아니였다. 사람마다 장단점이 있고 내게도 분명 단점도 있지만, 내 장점이 팀과 회사에 어떻게 기여하고 있는지, 내가 더 많이 기여할려면 뭘 보완하면 좋을지를 정확히 피드백해주었다. 

 

- 행복한 직장인을 만드는 욕구 단계

  • 생리 욕구 : 잘 먹고 잘 쉰다. 
  • 안전 욕구 : 협박이나 괴롭힘을 당하지 않는다.
  • 애정 소속 욕구 : 팀원들과 원만한 관계를 갖는다.
  • 존경 욕구 : 회사로부터 가치를 인정받고 기대받는다.
  • 자아실현 욕구 : 자신의 장점과 전문성을 살려 자발적으로 기여한다. 

- 불행한 직장인을 만드는 욕구 단계

  • 생리 욕구 : 늘 피곤하고 힘들다.
  • 안전 욕구 : 일 못하면 잘린다고 협박당하거나 폭언을 듣는다. 
  • 애정 소속 욕구 : 팀원들끼리 경쟁한다. 
  • 존경 욕구 : 다른 사람들과 늘 비교당하고 가치를 인정받지 못한다. 
  • 자아실현 욕구 : 싫어하는 일을 해야만 한다. 

 

대기업과 실리콘 벨리의 차이 : https://brunch.co.kr/@svillustrated/12

 

11. 대기업 Aaron과 실리콘밸리 Bryan

성실하고 눈치 빠른 인재 vs. 창의적이고 소통하는 인재 | [“갑”이 없는 조직]에서 살펴본 바와 같이 구글 이후 만들어진 페이스북, 트위터, 넷플릭스 등이 지향하는 실리콘밸리의 조직은 직원 한 사람 한 사람이 결정권을 갖고 각자의 역할에서 전문성을 발휘하여 목표를 이루어 나간다. 이를 Role-driven 조직이라고 이름 붙였다. 반면 지도자가 모든 결정권을 갖고 아랫사람들이 시키는 일을 일사불란하게 해 내는 조

brunch.co.kr

 

- 면접 중 받는 질문들

  • 당신이 생각하는 회사의 향후 10년간의 비전은 무엇인가?
  • 그 비전을 위하여 지금 회사에서 가장 필요한 일은 무엇인가?
  • 내가 가장 잘 기여할 수 있는 부분이 무엇이라고 생각하는가?
  • 이 회사를 선택한 이유, 이 회사의 좋은점은 무엇인가?

소프트웨어 엔지니어 레벨에 따른 상세 역활

https://www.mobiinside.com/kr/2018/01/31/silliconvalley-role-rank/

 

[실리콘밸리를 그리다] (15) 과장도 팀장도 아닌 엔지니어입니다

실리콘밸리를 그리다 팀이 

www.mobiinside.com

 

- 혁신 기업에서 중요한 것은 얼마나 빨리 만드느냐가 아니라 '미션을 이루기 위하여 무엇을 만드느냐'다. 따라서 전문성과 창의성에 기반한 길고 긴 의사 결정 과정을 거쳐 나아갈 방향을 정한다. 

 

- 일대일 미팅에서 가장 중요한 것은 내 행복에 대한 이야기다. 매니저의 가장 중요한 역할은 내가 최고의 업무 효율을 낼 수 있도록 돕는 것이다. 최대한 내 행복을 위해 조언해 주고 업무조정, 다른 팀과 대화 등 회사에서 발생하는 문제를 해결해 주기도 한다.

  • 행복하니?
  • 혹시 문제가 되는 일이 있니?
  • 무슨 생각하고 있니?

 

https://brunch.co.kr/@svillustrated/13

 

12. 사고를 쳐도 혼나지 않는 회사

너의 실수를 부검한다 - 포스트모템(Postmortem) | 우리는 모두 크고 작은 실수를 경험한다. 기업의 활동이 사람들의 크고 작은 결정들로 이루어지다 보니 작은 실수로 인해 큰 손실이 발생하는 일을 막을 수 없다. 어느 증권회사에서 $1,000짜리 1주를 팔아야 하는 상황에서 실수로 $1에 1,000주를 팔았다면 말 그대로 밀리언 달러의 손실을 입게 된다 (그런데 그것이 실제로 일어났습니다). 내가 다니던 회

brunch.co.kr

 

 

https://brunch.co.kr/@svillustrated/23

 

21. 나는 회사에 있는 것이 행복하다.

회사 생활이 행복하지 않은 것은 사실 이상한 일이다 | 처음 실리콘밸리에 와서 매니저와 1:1 미팅을 할 때 매니저는 나에게 다음 질문으로 대화를 시작하곤 했다.Are you happy?처음에는 이 말이 어색했다. 회사 생활은 늘 힘들고 바쁘고 정신없는 것이고 그렇지 않으면 죄책감을 느껴야 한다고 생각했던 나에게는 정말 이상한 질문이었다. 뭐 “How are you?” 정도의 형식적인 질문인가 보다 하고 형식적

brunch.co.kr

 

 

- 꼭 읽어볼 가치가 있는책. 특히 관리자를 꿈꾸거나 시니어 개발자를 향하는 사람이라면 새겨볼만한 내용들이 가득한 책이다. 

- 회사에서 일을 잘하는게 중요한게 아니다. 사람들과 행복하게 지내는게 중요하다 

'뇌세포덩어리"" > ' 카테고리의 다른 글

실리콘 벨리를 그리다  (0) 2019.07.09
소프트웨어 객체의 생애주기  (0) 2015.06.21
까칠하게 힐링  (0) 2015.06.08
나무를 심은 사람  (0) 2014.09.12
죽음이란 무엇인가  (0) 2014.09.12
읽기 좋은 코드가 좋은 코드다  (0) 2014.09.11

WRITTEN BY
No.190
세계정복의 시작점

트랙백  0 , 댓글  0개가 달렸습니다.
secret

다른 프레임워크를 하다가 다시  django를 하다가 당혹스러운 경험입니다. 

 

django의 models.OneToOneField는 데이터가 default시 (데이터 변경이 없다면) 해당 row가 생성되지 않습니다. 

 

해당 이미지는 예제 입니다. (django의 user는 위와 같지 않습니다.)

위와 같은 관계를 가질때  보통 user를 생성하면 user_profile도 디폴트로 생성됩니다. (보통의 orm에선 말이죠..)

하지만 django에서는 디폴트로 생성되지 않습니다!!!!!! 생성시 profile의 데이터를 변경하면 그때 생성됩니다. 

만일 디폴트로 생성후 profile이 없는 상태에서 profile에 참조하게 된다면?? 에러가 터지죠. (저와 같이 말이죠.. 머리도 터집니다.)

 

넵 방법은 있습니다. 

 

@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)

 

위의 방법처럼  @receiver로 user가 생성할 때 마다 하는 참조하는 방법은 절대 쓰지 마세요!!!!

나중에 더 터집니다.

 

 

django-annoying 패지키의 AutoOneToOneField으로 필드 속성을 바꿔주세요.

from annoying.fields import AutoOneToOneField

class MyProfile(models.Model):
    user = AutoOneToOneField(User, primary_key=True)
    home_page = models.URLField(max_length=255)
    icq = models.CharField(max_length=255)

https://stackoverflow.com/questions/1652550/can-django-automatically-create-a-related-one-to-one-model

 

Can Django automatically create a related one-to-one model?

I have two models in different apps: modelA and modelB. They have a one-to-one relationship. Is there a way django can automatically create and save ModelB when modelA is saved? class ModelA(mod...

stackoverflow.com

 

기존 필드라면 마이그레이션도 해주셔야합니다.

 

그러면 마찬가지로 default상태일때는 똑같이 생성이 되지 않지만, 참조시 자동으로 생성됩니다.!!( 그래서 에러가 나지 않습니다.)

 

혹시나 필수값을 받지 않는 상태의 row이며,  oneTooneField일 경우엔 annoying를 쓰세요.

 

그래야 미래의 내가 편해집니다.


WRITTEN BY
No.190
세계정복의 시작점

트랙백  0 , 댓글  0개가 달렸습니다.
secret

 

이제서야 안 사실.

 

월세는 대부분 후불입니다. "후불"

 

사용한 만큼 내야 합니다. 

 

만일 월세로 이사를 해서 1일에 들어가시면 계약서에 쓰신대로 월말에 월세를 냅니다. 

 

하지만 10일에 들어갔다면???

 

10일치를 제외한 나머지를 월세로 내야 합니다. 10일치는 안내도 되는겁니다!!

 

이 사실을 왜!! 부동산도!! 돈을 더 처받아 쳐먹은 집주인도 말을 안하는거지??!!

 

혹시나 더 내신 분들은 집주인에게 말하세요. 

 

월세는 후불입니다!! 사용한 만큼만 내는 겁니다. 

'쓰레기장""' 카테고리의 다른 글

월세로 집을 구한다면 꼭 첫달 월세를 확인하세요!!  (0) 2019.07.03
jenkins 설치 및 연동  (0) 2019.05.14
우주라이크  (0) 2018.12.28
왜 윈도우의 파일이 맥에서 오면 한글이 깨지는가?  (0) 2018.12.09
jetbrains day  (0) 2018.11.23
dev day seoul  (0) 2018.11.07

WRITTEN BY
No.190
세계정복의 시작점

트랙백  0 , 댓글  0개가 달렸습니다.
secret