가이드: https://www.openssl.org/docs/HOWTO/certificates.txt

이 문서에서 2, 3번 항목 참조


Terminal 에서 다음순서로 생성

2. Relationship with keys: $openssl genrsa -out privkey.pem 2048 (default는 1024)
3. Creating a certificate request: $openssl req -new -key privkey.pem -out csr.pem

Country Name (2 letter code) [AU]:KR

State or Province Name (full name) [Some-State]:Seoul

Locality Name (eg, city) []:Seoul

Organization Name (eg, company) [Internet Widgits Pty Ltd]:Makamoye

Organizational Unit Name (eg, section) []:Mytoon

Common Name (e.g. server FQDN or YOUR name) []:contents.mytoon.com

Email Address []:ytkang86@gmail.com


Please enter the following 'extra' attributes

to be sent with your certificate request

A challenge password []:

An optional company name []:


이렇게 csr.pem을 생성해서 CA기관에 인증 요청을 한다.

가비아에 요청해서 codomo인증을 받았는데 아래와 같은 파일들을 보내줬다.

1. RootCA_ChainCAs_Basic.zip

2. Seal_sample.zip

3. contents_mytoon_com_csr.pem

4. contents_mytoon_com_cert.pem

여기서 2번은 인증마크 홈페이지에 붙이는샘플이고, 1번은 chain파일과 rootCA파일이 있다. 본인은 처음에 rootCA인증서는 뭐지? 했는데 이건 선택한 CA기관이 이 rootCA에 의해서 믿을만 한것이란 의미라고 한다. 아무튼 우리는 4번을 signed certificate으로 이용하면되고. 필요에 따라서 chainCA를 같이 쓰면되겠다.


  • self signed certificate 생성 명령어

$openssl x509 -req -days 365 -in csr.pem -signkey privkey.pem -out self-cert.pem

'서버 교양' 카테고리의 다른 글

[펌] 인증 암호화와 해쉬  (0) 2016.10.29
Docker overview  (0) 2015.06.13
글로벌 푸시 시스템 구성하기  (0) 2015.01.16
글로벌 푸시 보내기  (0) 2014.11.27
mongodb만 쓰면 mysql을 과연 안써도 될까?  (0) 2014.04.23
블로그 이미지

시간을 거스르는자

ytkang86@gmail.com

,

비동기처리를 쓰는 서버에서 1개의 connection을 공유해서 쓴다고 했을때 그냥 모르고 쓰다보면 일단 2가지 문제가 생길 수 있는데..

문제1. select 요청

2개 의 커서를 쓴다고 해보자.

이때 1번 커서가 select를 해놓고 fetchall을 안한 상태에서 

2번 커서가 select를 요청하면 unread query가 있다고 exception이 발생한다. (insert 는 가능)

그리고 select의 결과는 connection에 있기 때문에 1번 커서가 select하고 2번 커서에서 fetchall을 해도 결과가 전달 된다.


문제 2. transaction

mysql transaction을 걸어놓고 비동기에 빠져 있다면,

다른 핸들러가 새로운 transaction을 시작할 수 있다. 이렇게 되면 exception 발생!

따라서 connection pool을 만들어 놓고 쓰는 것이 아닌이상 transaction을 걸고 비동기로 들어가면 안된다!


'mysql' 카테고리의 다른 글

Making scheduler for expiry  (0) 2018.01.19
블로그 이미지

시간을 거스르는자

ytkang86@gmail.com

,

LITE IDE setup

Go 2015. 1. 28. 12:58

https://github.com/visualfc/liteide/blob/master/liteidex/deploy/welcome/en/install.md

* MAC OS X 사용


1. ./update_pkg.sh

./update_pkg.sh 하는순간

../liteide-master/liteidex/src/golang.org/x/tools/astutil (from $GOPATH)

이런 에러를 경험한다.

일단 $GOPATH를 ~~~/liteide-master/liteidex 로 잡아준뒤

go get golang.org/x/tools/go/ast/astutil

로 패키지 설치해줌

그런뒤 실행해보면 똑같은 에러를 경험할 것이다. 자세히 보면

../liteide-master/liteidex/src/golang.org/x/tools/go/ast/astutil

설치는 여기 되어있는데 이상한데서 찾고있음

소스코드가 업데이트 중이라는데 아직 반영안됬나봄 짱나서 그냥 심링크 걸어줌

ln -s /Users/ytkang/liteide-master/liteidex/src/golang.org/x/tools/go/ast/astutil /Users/ytkang/liteide-master/liteidex/src/golang.org/x/tools/astutil


그리고 실행하면 이런 에러를 맞본다

liteidex/src/golang.org/x/tools/astutil expects import "golang.org/x/tools/go/ast/astutil"

코드 다 찾아가서 import "golang.org/x/tools/go/ast/astutil" 로 바꿔줌 (파일 2개밖에 안됨)

이제 ./update_pkg.sh 통과.


2. ./build_osx.sh

이거 할려면 QT SDK를 깔아야되는데 망할 다운로드 페이지가 열리지 않는다. QT Creator를 깔았는데 폴더 구조가 맞지 않음 ==;;

그래서 아직 진행중.. 데밋! IDE까는게 왜케 힘들어!


'Go' 카테고리의 다른 글

How to install Golang on centos  (0) 2018.04.12
How to run go app in heroku by your own project (with github)  (0) 2017.02.24
cannot download, $GOPATH not set  (0) 2015.01.28
블로그 이미지

시간을 거스르는자

ytkang86@gmail.com

,

http://golang.org/doc/code.html

이걸 따라하고나면 GOPATH는 잡혀있을 것이다.

근데 자꾸 없다고 난리리. 문제는 sudo로 실행해서 그런것!

permission 문제는 아래 명령어로 해결해준다.

sudo chown -R "$USER:" "$GOPATH"


References

1. http://stackoverflow.com/questions/24778565/go-go-get-gopath-error-when-gopath-is-set

2. http://stackoverflow.com/questions/21463261/package-download-fails-gopath-not-set-why

'Go' 카테고리의 다른 글

How to install Golang on centos  (0) 2018.04.12
How to run go app in heroku by your own project (with github)  (0) 2017.02.24
LITE IDE setup  (0) 2015.01.28
블로그 이미지

시간을 거스르는자

ytkang86@gmail.com

,

import pytz

import datetime

import calendar


s = '2012/01/10 23:00'

def get_timezone_offset_ms(timezone_name):

    try:

        tz = pytz.timezone(timezone_name)

    except Exception as e:

        return 0

    timezone_offset = datetime.datetime.now(tz).strftime('%z')

    offset_sign = timezone_offset[0:1]

    offset_hour = int(offset_sign+timezone_offset[1:3])

    offset_min = int(offset_sign+timezone_offset[3:])

    offset_ms = offset_hour*60*60*1000 + offset_min*60*1000

    return offset_ms


def get_pst_timestamp_from_time_string(time_string, time_format):

    pst_timezone_name = "America/Los_Angeles"

    tz_offset_ms = get_timezone_offset_ms(pst_timezone_name)

    t = datetime.datetime.strptime(time_string, time_format)

    return long(calendar.timegm(t.timetuple())*1000) - tz_offset_ms


get_pst_timestamp_from_time_string(s, '%Y/%m/%d %H:%M')

'python' 카테고리의 다른 글

gunicorn vs uwsgi  (0) 2017.01.20
flask async response  (0) 2017.01.04
functools.wraps에 대해  (0) 2015.04.15
Apple Push Notification Service(APNs) python modules  (0) 2015.04.07
Shallow copy VS Deep copy  (0) 2014.08.27
블로그 이미지

시간을 거스르는자

ytkang86@gmail.com

,

그놈의 timezone 그리고 망할 DST때문에 한동안 머리가 아팠다.

하지만 결국 답을 얻었다. 컴퓨터는 항상 답이 있다. 정말 좋다. I love it!

아무튼. 방법이 뭐냐면

일단 뭐 frequency를 어떻게 하냐는 자기 맘이겠지만, 일단 하루로 하고

1. 하루에 한번씩 모든 timezone name(예를 들어 Asia/Seoul)을 쭉 가져와서 각각의 offset을 테이블로 저장해서 redis나 memory 변수에 들고 있는다.

뭐 대강 이런 느낌일 것이다.

{

"+0900": ['Asia/Seoul', 'Asia/..', '...']

"+0830": [....],

....

}

이렇게 해보면 약 40개정도의 offset키에 모든 타임존 리스트가 정리되어진다.


2. 이제 우리에게 필요한 것은 푸시 예약이다.

푸시 예약은 두가지 방법으로 할 수 있다. 첫번째는 UTC기준 두번째는 각 지역기준.

만약 UTC기준이라면 전체 타임존에 동일한 시점에 일괄 발송하겠다는 것이다. 이때는 위에서 만든 타임존 오프셋 테이블을 쓸 필요없이 그냥 그 UTC시간이 되었을떄 일괄 발송하면된다.

두번째가 관건이다. 이것을 위해 이짓을 하는거니까. 바로 지역시간 기준.

자 지역시간 기준 12:00. 각 지역이 12:00가 되었을때 푸시를 보내는 것이다.

일단 12시를 UTC로 저장해 놓고 매 분 도는 스케줄러가 저 오프셋 테이블의 키값을 가져와서 UTC 시간에 오프셋을 더해서 그게 현재 시간이면 그에 해당하는 타임존 녀석들에게 푸시를 보내는 것이다. (물론 이것을 위해서는 유저정보에 타임존 네임이 있어야 할것이다)


자 나는 이렇게 구현할거고 서비스 할것이다. 으하하하 

'서버 교양' 카테고리의 다른 글

Docker overview  (0) 2015.06.13
SSL 인증서 발급  (0) 2015.03.04
글로벌 푸시 보내기  (0) 2014.11.27
mongodb만 쓰면 mysql을 과연 안써도 될까?  (0) 2014.04.23
쿠키런 서버사이드 이야기  (0) 2014.04.04
블로그 이미지

시간을 거스르는자

ytkang86@gmail.com

,

[Redis] HSET vs SET

redis 2015. 1. 9. 11:53

멀까 뭘써야할까?

SET은 그냥 키 벨류

HSET은 키 하나에 여러개를 쪼개서 넣을 수 있다.

예를 들어 유저 id를 Hash키로 잡고 {nickname: 'John', age:35}  이렇게 id에 국한된 데이터를 한데 저장할 수 있다.

검색을 해보면 계산시간에 대해 다음과 같은 말도 있다.

SET은 키 문자열 그대로 저장하고 써서 찾아내는 CPU 계산 시간이 빠르다.
HSET은 키 문자열을 한번 짧은 길이로 바꿔서 저장하기 때문에 요고 맵핑하는 계산이 한번 더 들어간다. 그러나 이 시간은 최대 ziplist(키 encode/decode할때 쓰는 code리스트 인듯) 크기만큼 든다. 

키를 겁네 많이 저장해놓고 쓰는 경우가 많아서 메모리를 효율적으로 쓰기위해선 HSET을 쓰는게 좋다. 라고 생각할 수도 있겠지만 결국은 "어떤 자료구조를 쓸 것인가"가 중요하다고 한다.

그냥 키 벨류한쌍이 필요한 거면 SET을 쓰고, 위와같이 ID에 묶여있는 정보들을 쓸거면 HSET을 쓰고.


Reference

1. http://stackoverflow.com/questions/12779372/hset-vs-set-memory-usage

2. http://grokbase.com/t/gg/redis-db/12a89re9n7/hset-vs-set-memory-usage

'redis' 카테고리의 다른 글

zscore list copy  (0) 2016.10.12
redis sentinel  (0) 2015.11.30
블로그 이미지

시간을 거스르는자

ytkang86@gmail.com

,

아직 구현된건 아니고 생각일뿐.

문제) 모든 유저에게 오후 1시에 푸시 메시지를 보내고 싶다. 그런데 세계의 각 지역은 당연히 시간이 다르거니와 같은 국가라도 시간이 다르며 또한 섬머타임으로 인해 같은 지역이라 해도 시간이 변동된다.


방법)

1. 유저는 회원가입할때 아래 정보를 서버에게 알려준다.

 - utc_offset(dst time적용되지 않았을때 offset), dst_offset(dst 적용되었을때 offset), dst_starttime, dst_endtime


2. 서버에서 푸시 예약 등록을 할때 13시 정보에 대해서 모든가능한 offset에 대해서 schedule 예약을 해둔다.

예) -12 ~ +14 까지.

이중에서 offset +2 가 보내질 시간이 되면 디비에서 다음에 해당하는 그룹을 가져와서 푸시를 보낸다.

그룹 1) utc_offset 이 2 이고 start, end time이 없는 유저 그룹

그룹 2) dst_offset 이 2 이고 now가 start, end time에 포함되는 그룹


근데 start end time 필드를 넣어놓고 쿼리 때리는게 넘 느려보인다.. 


블로그 이미지

시간을 거스르는자

ytkang86@gmail.com

,

Revoking task

celery 2014. 11. 24. 18:50

task revoke를 한다음에 다시 scheduled task를 가져오면 이전에 revoke된것들이 포함되어있다. 알고보니 revoked가 따로 있음 -_-

아직 revoke된거를 제외한 나머지 task만 가져오는건 못찾음.. 일단 revoke 안된것만 가져오는건 두 배열을 비교하는 수 밖에..


from celery.task.control import inspect

from celery.task.control import revoke


i = inspect()

queues = i.scheduled()

queues_revoked = i.revoked()

keys = queues.keys()

all_tasks = []

revoked_tasks = []

tasks = []


if len(keys) > 0:

    all_tasks = queues[keys[0]]

    revoked_tasks = queues_revoked[keys[0]]


for task in all_tasks:

    if task['request']['id'] not in revoked_tasks:

        revoke(task['request']['id'], terminate=True) 


블로그 이미지

시간을 거스르는자

ytkang86@gmail.com

,

예약 푸시

celery 2014. 11. 20. 15:58

Schduled push

http://docs.celeryproject.org/en/latest/reference/celery.app.task.html?highlight=apply_async#celery.app.task.Task.apply_async

apply_async eta 파라미터로 datetime object를 넘겨주면됨.

블로그 이미지

시간을 거스르는자

ytkang86@gmail.com

,