파이어베이스 커스텀 토큰을 이용한 데이터베이스 접근권한 설정하기


파이어베이스 데이터베이스에 조건에 따라 접근권한을 다르게 하려고 커스텀 토큰을 이용하게 되었다.
커스텀 토큰을 만들고 파이어베이스에 규칙을 적용한 다음 테스트를 해보려고 했는데 REST API에 JWT토큰을 아무리 넣어봐도 작동하지 않았다.

?auth=CUSTOM-TOKEN 파라미터로도 넣어 보았고,
Authorization: bearer CUSTOM-TOKEN 헤더로도 넣어 보았지만

"error" : "Permission denied"
"error" : "Expected an ID token, but was given a custom token." 같은 오류만 보여줄 뿐이었다.

REST에서 커스텀 토큰을 사용할 방법을 한참 찾다가 FireBase Rest with auth query param not working(http://stackoverflow.com/questions/39117237/firebase-rest-with-auth-query-param-not-working)이라는 글에서 답을 찾았다.

REST API 에서는 커스텀 토큰을 사용할 수 없다.

REST에서 커스텀 클레임을 사용하기 위해서는, auth_variable_override 파라미터를 사용해야 한다.
{"uid":"6LiF16Dm0hNB9XO61UR1KM5Jeun2"}
위의 uid를 사용한다면 아래처럼 요청해야 한다.
$ curl "https://dbname.firebaseio.com/test.json?access_token=&auth_variable_override=%7B%22uid%22%3A%226LiF16Dm0hNB9XO61UR1KM5Jeun2%22%7D" {" 1213314":{"alanisawesome":"Alan Turing"}}


결국 파이어베이스의 커스텀 토큰을 테스트하려면 파이어베이스 라이브러리를 사용해야 한다.
그래서 파이어베이스 커스텀 토큰 테스트를 위한 예제 프로젝트를 node.js로 간단히 만들었다.
아래 예제를 따라 하면 파이어베이스의 커스텀 토큰으로 데이터 베이스 접근 권한을 제어하는 흐름을 볼 수 있다.

커스텀 토큰으로 데이터 베이스 접근 권한 설정하기(https://github.com/dorajistyle/firebase-custom-token-sample/blob/master/readme-ko.md)


참고

https://firebase.google.com/docs/admin/setup
https://firebase.google.com/docs/auth/cpp/custom-auth
https://firebase.google.com/docs/auth/admin/create-custom-tokens
https://firebase.google.com/docs/reference/security/database
http://stackoverflow.com/questions/37426093/using-custom-tokens-to-make-rest-requests-to-fb-db-as-an-admin
http://stackoverflow.com/questions/39117237/firebase-rest-with-auth-query-param-not-working
https://jwt.io/



by


Tags : , , , , , , ,

  • 재미있게 읽으셨나요?
    방랑자의 이야기.
    월풍도원에선 기부를 받습니다.

joinedload를 사용한 SQLAlchemy 쿼리 최적화


SQLAlchemy는 파이썬(Python)용 Object Relational Mapper다.
ORM(Object Relational Mapper)은 객체(Object)와 관계형 데이터베이스(RDB - Relational Database)의 데이터 타입을 연결해 주는데,
이게 나오기 전엔 개발을 어떻게 했었나 싶을 정도로 아주 편리하다.

사용법도 간단해서 짧은 코드로 쿼리를 날리면 모델 하나를 딱 불러온다.
Model.get(model_id)
정말 좋다.
아무런 문제가 없었다.
적어도 외부 DB를 사용해 시험해 보기 전엔 그랬다.
외부 DB는 요청을 보내고 받는 시간이 길다.
헌데 SQLALCHEMY에서 자동으로 만들어 주는 쿼리를 쓰면, 너무 많은 요청을 보내게 된다.
그렇다면 성능을 향상하기 위해선?
요청 수를 줄이면 된다.

예제 모델-'SQLAlchemy Query Optimization. 쿼리 최적화'

예제의 product테이블은 여러 테이블과 연결되어 있는데,
쿼리를 날려 product와 관련된 테이블의 정보를 모두 불러와야 한다.
Sqlalchemy의 기본 쿼리 설정은 select로 연관된 table을 독립된 SELECT쿼리로 호출하지만,
응답시간이 느린 외부 DB를 쓴다면, 이를 join해서 쿼리 개수를 줄이면 된다.

sqlalchemy에서 join은 어떻게 하는가?

모델을 생성할 때 lazy='joined'를 써서 관련 테이블을 부를 때 join하는 방법과,
joinedload를 이용한 join 방법이 있다.
모델 생성 시 lazy를 사용해 join한 경우, 모델 호출 시마다 join이 되므로,
예제에선 필요한 상황에만 쿼리를 join하는, joinedload를 사용했다.

joinedload 간략 사용 방법

Model.query.options(db.joinedload(Model.relatedModel).all()

SQLAlchemy 쿼리 최적화 방법

  • 1..1 관계는 innerjoin한다.
    db.joinedload(Seller, innerjoin=True)
  • 1..n 관계는 innerjoin하지 않는다.
    db.joinedload(Tags)
  • 1..n 관계에서 관계가 깊다면, subqueryload를 써서 관련 테이블을 불러오고,
    그에 대해 joinedload를 해준다.
    db.subqueryload(Colors),
    db.joinedload(Colors, Inventory)
SQLAlchemy Query Optimization. 쿼리 최적화

위 방법을 써서 Call 개수를 25% 줄였다.
보통 Call이 29~30개가 나오다가, 22로 줄었으니, 약 7.5개 준 것이다.
Call당 시간이 얼마나 걸리냐에 따라 시간 단축이 가능한데,
테스트 환경에서 0.08초 정도 걸렸으므로 약 0.6초(0.08 * 7.5) 의 시간을 단축했다.
이건 데이터베이스의 응답 지연이 얼마나 되느냐에 따라 더 큰 차이를 보인다.
물론 로컬 db에서는 percall시간이 아주 짧으므로(테스트 환경에선 0.001초) 이런 최적화 차이를 체감하지 못한다.

참조

http://docs.sqlalchemy.org/en/rel09/orm/relationships.html
http://docs.sqlalchemy.org/en/rel09/orm/loading.html
http://stackoverflow.com/questions/6935809/how-to-use-joinedload-contains-eager-for-query-enabled-relationships-lazy-dyna
http://invenio-software.org/wiki/Tools/SQLAlchemy/Performance



by


Tags : , , , , , ,

  • 재미있게 읽으셨나요?
    방랑자의 이야기.
    월풍도원에선 기부를 받습니다.

데이터베이스 마이그레이션 관리를 간편하게! alembic.

alembic은 파이썬 SQLAlchemy DB Toolkit과 연동하여 마이그레이션 관리를 돕는 편리한 도구입니다.

프로젝트 폴더로 가서 alembic을 초기화 한다.
alembic init alembic

alembic.ini파일에서 데이터 베이스를 설정해 준다.
sqlalchemy.url = mysql://scott:tiger@localhost/test

마이그레이션을 자동으로 생성하기 위해 다음을 alembic/env.py에 추가한다.
import os, sys
sys.path.append(os.getcwd())
from application import db
target_metadata = db.Model.metadata

* 자동 생성에서는 테이블명이나 컬럼명을 변경한 것은 감지하지 못한다.

다음 커멘드를 이용해 자동으로 마이그레이션을 생성한다.
alembic revision --autogenerate -m "Added account table"

DB를 새 마이그레이션으로 업그레이드 하려면?
alembic upgrade head

원하는 마이그레이션으로 업그레이드 하거나 다운그레이드 하려면?
$ alembic upgrade +2
$ alembic downgrade -1

alembic 튜토리얼



by


Tags : , , , , , ,

  • 재미있게 읽으셨나요?
    방랑자의 이야기.
    월풍도원에선 기부를 받습니다.

Web application development References


ISO-639-1


Official languages of the United Nations

  • Arabic
  • Chinese (Mandarin)
  • English
  • French
  • Russian
  • Spanish

CLDR

Unicode Common Locale Data Repository

터미널 한글 설정

windows cmd - chcp 65001
linux shell - export LC_ALL=ko_KR.UTF-8


구글 맵스 지도 검색

https://maps.google.com/?q=이름@위도,경도

구글 정의 검색

define:something

Protocol SPDY

http://www.chromium.org/spdy

MongoDB

사용자추가 스키마생성 DB삭제

mongod 를 기동할 때는 --auth 옵션을 추가해야 함
mongoDB는 system영역 내에서 admin이라는 DB관리를 위한 스키마를 가짐
>use admin // admin DB 사용
>db.addUser('name','pswd') // 사용자 추가
>use newDB => 해당 디비가 없으면, 새로운 디비를 생성함
   mysql의 스키마 생성과 같음
>db.collectionName.drop() => 해당 collection을 삭제함
   mysql의 DROP TABLE과 같음

Mongodb eclipse

log path configuration

"C:\data\mongodb-xxxxxxxxx\bin\mongod" --service  --logpath  c:\data\test.log

import

mongoimport --host localhost --db myapp_development --collection my_collection --type csv --file C:\dev\data\test.csv --headerline --upsert

regex

mongodb regex = '^[work|accus*|planet]'
MongoDB can only use indexes on Regular Expression searches that are front (^) anchored.
RegEx searches that front-anchor and then use a wildcard query like .* will use the index for as much of the un-wildcarded area as it can before scanning --- i.e., ^foo.* will run a partial scan.


Mysql

mysql backup and restore


mysqldump -uUSER -pPASSWORD -hHOST DB > ./filename.sql
mysql -uUSER -pPASSWORD -hHOST DB < ./filename.sql

MySQL index

What should be indexed?
–All attributes where you JOIN
–All attributes where you filter (WHERE)
–All attributes where you ORDER or GROUP BY
–All attributes where you want to do an Index Scaninstead of a Table scan.
–NOT on attributes with an evenly distributed lowcardinality.
•How should be indexed?
–Indexes can only be used from left to right.
–Keep them short.
–Compound indexes: INDEX(a, b).
–Prefixed indexes: INDEX(a, b(10)).
–Do not function-cover indexed attributes

http://www.scribd.com/doc/80792061/MySQL-Performance-Tuning

MySQL Date and Time Functions


Mysql 동일 테이블에서 여러 필드 값의 합 쿼리

//쿼리1 보다 쿼리2가 두 배 이상 빠르다. 단, 하나의 칼럼 갯수를 구할 땐 where절과 count(*)를 쓰는 것이 더 빠르다.
//쿼리1
select sum(cnt) from (
    select count(*) as cnt from `my_table` WHERE `field_x` =1
    union all
    select count(*) as cnt from `my_table` WHERE `field_y` =1
    union all
    select count(*) as cnt from `my_table` WHERE `field_z` =1
) as cnt_all
//쿼리2
SELECT
(SUM(IF(`field_x` = 1,1,0)) +   
    SUM(IF(`field_y` = 1,1,0)) +
    SUM(IF(`field_z` = 1,1,0))) as cnt_all
FROM `my_table`
WHERE 1


firefox - keyword.url

http://www.google.co.kr/search?num=50&hl=ko&lr=&newwindow=1&tbo=1&as_qdr=all&aq=f&aqi=&aql=&oq=&gs_rfai=&ie=UTF-8&oe=UTF-8&sourceid=navclient&gfns=1&q=

리눅스 crontab

crontab -l

CSS FONT BASE-64

/* Fonts as files */
@font-face {
    font-family: 'MyFontFamily';
    src: url('myfont-webfont.eot?') format('eot'),
         url('myfont-webfont.woff') format('woff'),
         url('myfont-webfont.ttf')  format('truetype'),
         url('myfont-webfont.svg#svgFontName') format('svg');
    }
/* Fonts as data uris */
@font-face {
    font-family: 'MyFontFamily';
    src: url('myfont-webfont.eot?') format('embedded-opentype');
    }
   
@font-face {
    font-family: 'MyFontFamily';
         url(data:font/truetype;charset=utf-8;base64,BASE64_ENCODED_DATA_HERE)  format('truetype'),
         url(data:font/woff;charset=utf-8;base64,BASE64_ENCODED_DATA_HERE)  format('woff'),
         url('myfont-webfont.svg#svgFontName') format('svg');
    }


CSS Sticky windows

    .outer {
        width:200px;
        height:600px;
        background-color:red;
        margin:0 auto;
    }
    .inner {
        width:50px;
        border:1px solid white;
        position:fixed;
    }
 


Insert the word (image) into the alt text of an image that hasn’t loaded In Firefox

img:after   { content:" (image)"; }
img::after  { content:" (image)"; } /* New CSS3 standard notation */


FYI

References and Articles

빠른 웹 개발

도구


출처

  • 직접 작성
  • google 검색



by


Tags : , , , , , , , ,

  • 재미있게 읽으셨나요?
    방랑자의 이야기.
    월풍도원에선 기부를 받습니다.

몽고DB는 스키마 없이 JSON형태로 정보를 저장하는 데이타베이스 입니다.

몽고DB


저는 그동안 관계형 DB만 사용해 왔습니다.
스키마가 변경될 때 마다 손이 많이 갔죠.
이제 문서기반(Document base)의 몽고DB로 좀 편해지겠습니다.
세상은 점점 좋아지는군요.:D
윈도우에 몽고DB를 설치하는 것은 아주 간단합니다.

mongoDB Quicstart Windows

에서 운영체제에 맞는 바이너리를 다운 받고,
압축을 풀어 실행하면 되죠.
db가 저장될 폴더는 아무곳에나 만들어서 서버를 실행하면 되요.

mkdir c:\db
mongod --dbpath c:\db\

혹시 두 번째 실행 이후로 db 서버가 실행이 안된다면,
dbpath안에 mongod.lock를 삭제하시고 서버를 다시 실행하시면 됩니다.

by 月風

 



by


Tags : , , , ,

  • 재미있게 읽으셨나요?
    방랑자의 이야기.
    월풍도원에선 기부를 받습니다.

DB복구. MSSQL 2005 DB복구법 (MSSQL DB 2005 restore method)[DB복구,MSSQL,2005,복구방법,DB되살리기,데이타베이스,database]

이미지출처 : mehmet-ozdemir.com.tr

수백기가의 데이터베이스가! 갑자기 번개를 한번 맞더니 몽땅 날아가버렸다면..

정말 토나오는 일이다.-_-;



하지만 복구 할 수 있는 길은 열려있었으니..



1. 로그와 데이터 모두 살아있을 때 복구법 : sp_attach_db ‘DB명’, ‘경로\파일명.mdf’ , ‘경로\파일명_log.ldf’

2. 데이터 파일만 살아있을 때 복구법 : sp_attach_single_file_db ‘DB명’, ‘경로\파일명.mdf’

3. 데이터 파일만 남기고 삭제하고 싶을때 : sp_detach_db



이 방법들은 정상적으로 종료가 되었을때만 사용 가능하다.



번개를 맞아서 컴퓨터가 다운되었다면, 이 방법은 안통한다.



그런일이 있다면 다행히 ldf파일만 손상을 입고 mdf파일은 손상을 입지 않았다면 복구 할 수 있는 방법이 있다.



- 원래 DB와 동일 이름의 DB를 생성한다. (mdf 파일명과 크기도 같게..)

- 생성한 DB를 긴급 모드로 변경한다. : alter database dbname set emergency

- SQL 서버를 멈춘다.

- 생성한 DB의 mdf,ldf파일을 삭제하고 복구할 mdf파일들을 복사해온다.(로그파일 제외)

- SQL 서버를 재시동한다.

- 오브젝트와 데이터들이 관리자에게 접근가능하지만, 여전히 백업도 안되고 온라인상태가 되지도 않는다.

- 스크립트 생성 마법사로 모든데이터 오브젝트를 스크립트로 만든다.(스크림팅 오브젝트 권한,의존 오브젝트들,인덱스들 포함;파일로 내보낸다.)

- 새로운 두번째 DB를 생성한다.

- 새로운 DB에서 모든 오브젝트가 생성되 때까지 여러번 스크립트를 실행한다.

- 데이터 불러오기 마법사로 모든 살아있는 테이블을 새로운 DB에 넣는다.

- 새로운 DB를 백업하고 긴급모드에 들어가있는 DB에 복원한다.



끝!



----

Open english content




by


Tags : , , , , , ,

  • 재미있게 읽으셨나요?
    방랑자의 이야기.
    월풍도원에선 기부를 받습니다.