발생일: 2016.05.23 키워드: Grand Central Dispatch, GCD, 디스패치 큐, Dispatch Queue, 문제: GCD를 처음 알게 되었을 때 정리해둔 기초 수준의 질문과 답변이다. 해결책: # 튜토리얼 GCD 기본 https://www.raywenderlich.com/4295/multithreading-and-grand-central-dispatch-on-ios-for-beginners-tutorial GCD 상세 https://www.raywenderlich.com/60749/grand-central-dispatch-in-depth-part-1 https://www.raywenderlich.com/63338/grand-central-dispatch-in-depth-part-..
발생일: 2017.02.24 키워드: 착시, 버튼, 테두리 문제: 같은 크기의 버튼 두 개를 연달아 배치했다. 그런데 어두운 배경의 버튼이 더 작게 보인다. 왜 그런 걸까? 해결책: 대표적인 착시의 문제였다. 두 버튼의 테두리 색깔은 동일했지만, 착시로 인해 어두운 배경의 버튼의 테두리가 원래 색깔보다 더 밝게 보였기 때문이다. 아래 이미지를 보면 쉽게 이해할 수 있다. 비율과 가격 버튼의 테두리는 모두 밝은 회색이지만, 비율 버튼의 배경이 더 어두워서 실제 테두리의 색깔보다 더 밝게 보인다. 밝은 회색이었던 테두리 색깔이 흰색 배경과 가까워져 배경처럼 인식되었기 때문에, 상대적으로 버튼이 더 작게 보이는 것이다. 여기서는 두 버튼이 같은 크기로 보이도록 하기 위해서, 인위적으로 어두운 배경의 버튼의 테..
발생일: 2017.02.16 키워드: css, color, 변수, css color variable naming 문제: 프로젝트에서 사용하는 컬러를 관리하고 있지 않았더니, 같은 색인데도 컬러 코드가 조금씩 다르다. 컬러를 코드로 직접 쓰는 것보단 대표할 수 있는 이름을 지어 변수를 사용하면 효과적이다. 코드에 일관성을 줄 수 있을 뿐 아니라, 나중에 컬러를 한꺼번에 변경할 때에도 편하다. 이 참에 컬러 코드를 정리해볼까 한다. 기존 방식에 불편한 점이 있기도 했었는데, 더 효율적으로 이름 지어 관리할 수 있는 방법이 있을까? 해결책: 기존 몇몇 프로젝트에서는, 컬러에 이름을 지을 때 용도에 따라 이름 짓거나 접두사/접미사를 붙여 사용했었다. 예를 들어 아래와 같은 식이다. - 특정 패턴으로 이름을 짓는..
발생일: 2016.04.14 키워드: python Temporary file, 파이썬 임시파일, tempfile.TemporaryFile, unicode, utf8, 유니코드, Create temporary file with unicode encoding, unicode object, 유니코드 객체 문제: 파일 내의 특정 패턴의 단어를 다른 단어로 치환하려고 한다. 다음 순서대로 실행하려고 했다. 1. 원본 파일을 라인 단위로 읽어 특정 단어를 치환한 후에, 2. 치환한 라인을 순서대로 임시 파일에 쓴다. 3. 전체 파일을 다 읽었다면, 임시 파일의 내용을 원본 파일에 복사한다. 임시 파일은 tempfile 모듈을 이용해 생성했는데, 임시 파일을 쓰려고 하니 아래와 같은 에러가 발생했다. UnicodeE..
발생일: 2016.04.19 키워드: file seek, python file search, 파이썬 파일 검색, file position, file pointer, 파일 포인터, 파일 커서, file cursor position 문제: 전체 파일에서 특정 단어를 찾는 코드를 작성했다. 첫 번째 검색할 땐 잘 찾아지는데, 두 번째부턴 검색되지 않는다. 왜일까? 해결책: 첫 번째 검색을 수행하면서 파일 포인터의 위치가 파일의 맨 끝으로 이동했기 때문이다. 두 번째 검색을 위해, 파일 포인터를 다시 파일의 시작 위치로 옮겨주는 방법으로 해결할 수 있다. 파일 포인터의 위치는 seek 메서드로 옮길 수 있다. file.seek(offset, from_what) - offset: 얼마나 옮길 것인지 - from_..
발생일: 2016.04.12 키워드: python, 파이썬, 커맨드라인 옵션, argument parser, argparse, command parser, 파이썬 인자 받기, 파이썬 명령행 인자 받기, verbose options, logging level, 로깅 레벨, 파이썬 로깅 문제: 파이썬 모듈을 실행할 때, -v 또는 --verbose 옵션을 인자로 전달해서 로깅 레벨을 설정하고 싶다. 해결책: 역시 스택오버플로우에 해답이 있다.ㅎㅎ 커맨드라인 옵션을 파싱하는 목적의 argparse 모듈이 있고, 아래처럼 사용하면 간단히 구현할 수 있다. import argparse import logging parser = argparse.ArgumentParser( description='A test scr..
발생일: 2016.04.25 키워드: content hugging, compression resistance priority 문제: iOS의 뷰 처리를 하면서 헷갈렸던 개념이 Content hugging 과 Compression Resistance 였다. 해결책: 현재 뷰를 기준으로, 뷰의 영역이 늘어나거자 줄어드는 경우에 대한 기준을 설정하는 값이다. Content Hugging Priority 늘어나는 경우에 대한 우선순위 - 화면이 커지는 경우, 우선순위가 낮은 뷰가 화면에 따라 더 늘어난다. - 어떤 뷰가 늘어나서 화면을 채울 것인가? (우선순위가 낮은 뷰가 늘어난다) 어떤 뷰의 컨텐트 허깅 프라이어리티를 높인다는 것 - 화면이 커져도 이 뷰는 크기를 유지하겠다 어떤 뷰의 컨텐트 허깅 프라이어리티..
발생일: 2017.02.24 키워드: RFM, RFM Customer segmentation, RFC scoring, RFM 사용자 분류, RFM 고객 세분화 모형, RFM 모형 문제: 얼마 전 마이크로소프트와 핵페스트 행사를 진행했다. D사에서 오신 분이 추천 서비스를 구현했던 사례에 대해 이야기해주셨다. 유통 서비스의 사례였는데, 가장 먼저 한 일이 RFM을 사용해서 고객을 1에서 10등급으로 나눈 것이란다. RFM은 처음 들어봤다. 뭘까? 해결책: RFM은 고객의 가치를 점수화해서, 이를 기준으로 고객을 분류할 수 있는 간단하면서도 유용한 방법이라고 한다. 마케팅에서 가장 많이 사용하고 있는 사용자 분류법이라고 한다. RFM은 Recency, Frequency, Monetary의 약자로 고객의 가치..
발생일: 2016.12.14 키워드: mysql, in multiple column 문제: WHERE 절의 IN, NOT IN 쿼리 구문에 여러 컬럼을 사용하고 싶다. 해결책: IN, NOT IN 구문으로 비교할 컬럼을 괄호로 묶어 처리하면 된다. SELECT * FROM task WHERE (user_id, task_id) NOT IN ( SELECT user_id, task_id FROM task_queue ); 논의:IN 구문에서 사용하는 컬럼 중에 인덱스가 적용되지 않은 컬럼이 있었는데, 해당 컬럼 때문에 쿼리 성능이 급격히 떨어졌다.실제론 위 방법 대신, 쿼리를 두 번 나눠 호출하는 방식으로 우회했다. 참고: http://stackoverflow.com/questions/8435107/mysql..
발생일: 2016.12.13 키워드: React, setState, 리액트, setState not working 문제: setState()로 상태를 변경하려는데, 변경한 상태 값이 적용되지 않는다. 대략 아래와 같은 코드의 컴포넌트이고, { ... getInitialState() { return { foo: 'foo', bar: 'bar' }; }, makeFooUppercase() { var state = this.state; state.foo = 'FOO'; this.setState(state); }, makeBarUppercase() { var state = this.state; state.bar = 'BAR'; this.setState(state); }, makeUppercase() { this..