데이터베이스 마이그레이션 관리를 간편하게! 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 : , , , , , ,

  • 재미있게 읽으셨나요?
    광고를 클릭해주시면,
    블로그 운영에 큰 도움이 됩니다!

참치 맛집. 선릉 참치그라.

입구-'선릉 참치그라'

친구의 오랜 단골 참치 집 참치그라.
그동안 위치가 여러 번 바뀌었다고 해요.
조그만 지하에서 시작해서 이번에 3층으로 이전을 했답니다.
저는 이번이 처음 방문이었어요.
테이블이 방으로 나뉜 구조로, 벗과 조용히 담소를 나누기 좋습니다.

참치-'선릉 참치그라'

참치 집이니 참치 맛을 보아야겠지요?
아주 만족스럽습니다.
맛있는 부위를 많이 주시네요.
다른 건 거의 집어 먹지도 않고,
참치 단백질로 배를 채웠습니다.
먹성이 좋던 때 갔다면 아마 식도까지 참치로 채웠을 거에요.
맛도 좋고 사장님도 친절한 참치그라.
참치 맛집입니다!


크게 보기



by


Tags : , , , , ,

  • 재미있게 읽으셨나요?
    광고를 클릭해주시면,
    블로그 운영에 큰 도움이 됩니다!

한의학 고전. 황제내경.

뭔가 신비로움이 감도는 황제내경.
제목만 수백 번 들었지, 어떤 내용인지 한번 훑어보지도 않았습니다.
‘황제내경. 언제 한번 읽어보고 싶은데…’
황제내경을 간략하게 추려놓은 이 책을 발견하면서 그 기회가 생겼습니다.
책이 얇아 금방 읽을 줄 알았는데, 책장이 어렵사리 넘어가네요.
특히 경락에 관한 이야기는 너무 어려웠습니다.
하긴 황제내경 한번 읽고 경락을 이해하면 한의사 해야죠.
그래도 경락과 음양오행, 사계절 건강법까지 폭넓게 다루고 있어,
인체를 이해하는 데 큰 도움이 됩니다.
황제내경을 읽으며 이런 생각이 들었습니다.
‘손가락 하나 확실히 알기도 어려운데,
자신을 온전히 알아가기는 또 얼마나 어려울 것인가?’
그래서 가장 알고 싶은 것을 먼저 공부하고, 가장 하고 싶은 것을 먼저 해야만 합니다.
세상 모든 것을 알기 어렵고, 모든 일을 다 하지도 못하기 때문입니다.

황제내경 - 책갈피

오행표

방위동방남방중앙서방북방
하늘바람열기습기건조함찬 기운
나무(木)불(火)흙(土)쇠(金)물(水)
신맛쓴맛단맛매운맛짠맛
냄새누린내탄내향내비린내썩은내
장기심장비장신장
힘줄피부와 털
증세힘줄의 경련근심딸꾹질기침전율
얼굴
소리외침웃음소리노랫소리곡소리신음소리
푸른색붉은색노란색흰색검은색
감정노여움기쁨사려걱정두려움
각(角)치(徵)궁(宮)상(商)우(羽)
행성목성화성토성금성수성
가축돼지
곡식보리기장
숫자87596

경락

수태음폐경은 왼쪽 가슴부터 왼손 엄지까지 이어지며, 중부에서 소상까지 아래로 흐른다.
수양명대장경은 오른손 검지부터 오른팔 바깥쪽을 따라 왼쪽 뺨까지 이어지며,
상양에서 영향까지 위로 흐른다.
족양명위경은 오른쪽 얼굴부터 오른발 검지까지 이어지며, 승읍에서 여태까지 아래로 흐른다.
(눈에서 이마까지 턱을 따라 완만한 곡선으로 올라갔다가 내려간다.)
족태음비경은 왼발 엄지에서 왼쪽 겨드랑이까지 이어져 있으며,
은백에서 대포까지 위로 흐른다.
수소음심경은 오른팔의 겨드랑이 부근에서 오른손 소지까지 이어지며,
극천에서 소충까지 아래로 흐른다.
수태양소장경은 왼손 소지에서 왼쪽 귀까지 이어지며,
소택에서 청궁까지 위로 흐른다.
족태양방광경은 인중에서 왼손 소지까지 이어지며,
정명에서 지음까지 아래로 흐른다.
(오금에 위치한 위중에서 등의 오른쪽인 부분으로 올라갔다가 다시 지음으로 내려온다.)
족소음신경은 왼발바닥부터 목가지 이어지며, 용천부터 유부까지 위로 흐른다.
수궐음심포경은 오른쪽 겨드랑이부터 오른손 중지까지 이어지며, 천지에서 중충까지 아래로 흐른다.
수소양삼초경은 왼손 약지부터 왼쪽 눈 부근까지 이어지며, 관충에서 사죽공까지 위로 흐른다.
족소양담경은 왼쪽 눈 부근부터 왼발 약지까지 이어지며, 동자료부터 족규음까지 아래로 흐른다.
족궐음간경은 오른발 엄지부터 오른쪽 가슴까지 이어지며, 대돈부터 기문까지 위로 흐른다.
독맥은 몸 뒷쪽의 항문 뒤쪽부터 이마까지 이어지며, 장강에서 은교까지 위로 흐른다.
임맥은 몸 앞쪽의 항문 앞쪽부터 입술 아래까지 이어지며, 회음에서 승장까지 위로 흐른다.

사계절 기운에 감응하는 삶

봄철 석 달은 발진(發陳: 생겨남과 펼쳐짐)
밤에 잠자리에 들고 아침에 일어난다.
머리를 풀고 옷 매무시를 편히 해서 몸을 속박치 않게 한다.
의지에 생기가 돋게 한다.
살리되 죽이지 않는다.
주되 빼앗지 않는다.
상을 주되 벌은 주지 않게 한다.

여름철 석 달은 번수(蕃秀: 번성과 성취)
밤에 잠자리에 들고 일찍 일어난다.
여름날 낮이 길어 무더운 것을 싫어하지 않는다.
의지가 격노하지 않게 한다.
정신을 풍성하게 한다.
몸 속의 기운이 마치 밖을 즐기듯 밖으로 뻗어나가게 한다.

가을철 석 달은 용평(容平: 수용과 평안)
일찍 잠자리에 들어 일찍 일어난다.
마음의 움직임을 편안하게 한다.
만물이 조락하는 엄숙한 기운을 피한다.
정신의 기운을 거두어 들이고 가을의 기운을 화평하게 한다.
의지가 밖으로 향하지 않도록 하여 폐장의 기운을 맑게 한다.

겨울철 석 달은 폐장(閉藏)
일찍 잠자리에 들고 늦게 일어나되 반드시 해가 떠오르는 것을 기다려야 한다.
의지를 엎드려 숨어 있는 것같이 하여 밖으로 나가지 못하게 한다.
유유자적한다.
기운이 몸 속에 머무르게 한다.
추위를 멀리하고 따뜻하게 한다.
땀을 흘려 피부로 양기가 너무 많이 빠져나가지 않게 한다.

하루를 사계절로 나누면 아침은 봄이고 낮은 여름이며 저녁은 가을이고 한밤중은 겨울입니다.
아침이 되면 인체의 정기가 생겨나고 병기(病氣)는 쇠퇴하기 때문에 아침에는 아픔이 덜합니다.
낮에는 인체의 정기가 자라서 사기를 이기므로 안정됩니다. 저녁에는 인체의 정기가 쇠퇴하고 사기가 발생하기 시작하므로 병이 좀 심해집니다. 한밤중에는 인체의 정기가 장부로 들어가 숨어버리고 사기만 홀로 몸에 머물기 때문에 병이 심해지는 것입니다.

뇌·수·골·맥·담·여자포(女子胞: 자궁을 말한다)
땅의 기운에서 생겨난 것으로 모두 음을 저장하고 땅을 본받았기 때문에 감춰두고 내버리지 않는다.
위·대장·소장·삼초·방광
하늘에서 생겨난 것으로 하늘의 기를 본받았기 때문에 내보내지만 검춰두지는 않는다.

일반 맥진법

촌구(寸口) : 손목관절에서 팔꿈치의 관절 쪽으로 약 2~3센티미터 되는 곳에 위치한다.
관상(關上) : 촌구맥에서 1촌정도 되는 곳이다.
척중(尺中) : 관상에서 1촌 정도 되는 곳이다.
둘째·셋째·넷째 손가락을 붙여서 이곳에 가만히 대고 맥을 가늠한다.

맥이라는 것은 혈이 모이는 곳입니다. 맥이 길면 기가 화평한 것이고, 맥이 짧으면 병이 난 것이며, 맥이 빨리 뛰면 가슴이 답답한 것이고, 맥이 크면 병이 계속 발전하는 것입니다. 촌구의 맥이 크면 사기가 위에서 막힌 것으로 호흡이 가빠지고, 척(尺)부위의 맥이 크면 사기가 아래에 체한 것이므로 배가 부풀어 오르며, 대맥(大脈)이면 오장의 기가 쇠약해진 것이고, 맥이 가느다랗게 느껴지면 정기가 줄어든 거이며, 맥이 뻑뻑하면 심장에 통증이 있는 것이고, 맥의 흐름이 마치 샘물이 솟아오르는 듯하면 병이 나쁘게 진행되어 기색이 나빠진 것이며, 맥이 미세하고 힘이 없어 마치 활시위가 갑자기 끊어지는 것과 같으면 죽게 됩니다.

머리는 정기와 신명이 있는 곳인데, 만일 머리를 아래로 숙인 채 위로 들지 못하고 눈이 푹 꺼져 있으면 장차 정신이 탈진하려는 것입니다. 등은 흉중(胸中)이 있는 곳인데, 등이 굽거나 어깨가 아래로 처지면 장차 심장과 폐에 이상이 생기려는 것입니다. 허리는 신장이 있는 곳인데, 허리를 돌리지 못하면 신장이 장차 못쓰게 되려는 것입니다. 그리고 무릎은 힘줄이 있는 곳인데, 무릎을 굽혔다 폈다 하지 못하고 걸을 때 지팡이에 의지한다면 힘줄이 장차 못쓰게 되려는 것입니다. 뼈는 골수가 있는 곳인데, 오래 서 있지 못하고 걸을 때 몸을 휘청거리면 뼈가 장차 못쓰게 되려는 것입니다. 오장의 기가 강건하면 살고 그렇지 못하면 죽습니다.

봄에는 맥이 원을 그리는 컴퍼스처럼 원활하고, 여름에는 맥이 직각을 그리는 굽은 자처럼 크고 넓으며, 가을에는 맥이 물 위에 떠 있는 머리카락처럼 가볍고 깔깔한 것이 양팔 저울기 균형을 맞추는 듯하며, 겨울에는 맥이 가라앉고 무거워 저울추가 처지듯 아래로 잠깁니다.

사람이 숨을 한 번 내쉴 때 맥이 두 번 뛰고, 숨을 한 번 들이마실 때 맥이 두 번 뛰며, 호흡하고 나서 멈춘 사이에 다섯 번 뛰고, 호흡을 정지했을 때 남은 것을 다 하지 못해 한 번 더 뛰는데 이러하면 건강한 사람[平人]입니다.

낙맥에 침을 놓을 때는 반드시 그 혈이 모인 곳에 놓아야 하며, 혈이 모이지 않았다면 급히 침을 놓아 그 사기를 빼내어서 혈이 따라나오게 해야 합니다. 사기가 속에 머물러 있으면 비증(痺症: 뼈마디가 저리고 부어서 매우 아픈 증상. 류머티즘)이 나타납니다.
낙맥을 살필 때 그 색이 푸르면 한증이고 통증이 있는 것이며, 색이 붉으면 열증입니다. 위장 속에 한이 있으면 수어(手魚: 엄지손가락의 본 마디 사이에 있는 풍만한 살)의 낙맥이 대부분 청색이고 위장 속에 열이 있으면 어제락(魚際絡: 엄지손가락 밑 부분에 있는 살이 통통한 부위의 혈관과 신경을 총칭)이 붉은 색입니다. 그 낙맥이 시커멓게 나타내는 것은 사기가 오랫동안 머물러 비증이 된 것이고, 낙맥에 붉은색, 검은색, 푸른색이 함께 나타나는 것은 한열이 왕래하기 때문이며, 색이 푸르고 호흡이 가쁜 것은 원기가 부족하기 때문입니다.

다섯 가지 실함도 죽음에 이르고, 다섯 가지 허함도 죽음에 이릅니다.
맥이 성대하고, 피부에 열이 나며, 배가 부어오르고, 대소변이 통하지 않으며, 가슴이 답답하면서 눈에 불꽃이 튀는 것을 다섯가지 실함이라고 합니다.
맥이 미세하고, 피부가 차며, 원기가 허약하고, 대소변이 새어 나가며, 음식을 먹지 못하는 것을 다섯 가지 허함이라고 합니다.
다섯가지 허함에 속하는 사람이 국이나 죽이 위장에 들어가 설사를 멎으면 회복되어 살 수 있고, 다섯 가지 실함에 속하는 사람이 땀이 나고 대소변을 보면 살아날 수 있습니다.

푸른색과 검은색은 통증을 나타내고, 노란색과 붉은색은 열증을 나타내며, 흰색은 한증을 나타냅니다.

한병(寒病)은 열약(熱藥)으로 치료하고, 열병(熱病)은 한약(寒藥)으로 치료하며, 병이 경미하면 역치(逆治){차가움에 뜨거운 약을, 뜨거움에 차가운 약을 쓰는 방법.}법을 쓰고, 병이 심하면 종치(從治){뜨거움에 뜨거움을, 차가움에 차가운 약을 쓰는 방법.}법을 씁니다.

병에는 표(標: 가지)와 본(本: 뿌리)이 있다.

사람이 술을 마시면 술도 위에 들어가는데 음식물은 아직 소화되지 않았는데도 술이 먼저 소변으로 배출되는 까닭은 무엇입니까?
술은 곡식을 발효시켜 만든 액이며 그 기는 맑습니다. 그러므로 음식물보다 나중에 들어가나 먼저 소변으로 나오는 것입니다.

사람을 나무와 비교하여 말한다면 어떻습니까?
나무가 상했다고 할 때는 모두 그 가지가 상한 것을 뜻합니다. 가지가 강하거나 무르거나 간에 단단하기만 하다면 덜 상할 것입니다. 마찬가지로 사람 또한 뼈와 관절, 피부, 주리가 단단하지 않으면 사기가 들어와 항시 병에 걸리는 것입니다.

기쁨이나 노여움을 절제하지 못하면 오장이 손상되는데, 오장이 상하는 것은 병이 음에서 생기기 때문이다.
한사가 몸이 허약해진 틈을 타서 침범하면 병은 몸의 아랫부분에서 생긴다.
풍사나 우사가 몸이 허약해진 틈을 타서 침범하면 병은 몸의 윗부분에서 생긴다.

더 읽을 거리

가노우 요시미츠, <<중국 의학과 철학>>, 한국 철학사상연구회 기철학분과 옮김(여강, 1992)
김용옥, <기철학이란 무엇인가>,<<도올논문집>>(통나무, 1992)
마르크스 칼덴마르크,<<노자와 도교>>,장원철 옮김(까치, 1993)
소광섭, <오행의 수리물리학적 모형>, <<과학과 철학>> 제 4집, 과학사상연구회 엮음(통나무, 1993)
앵거스 C.그레이엄, <<음양과 상관적 사유>>, 이창일 옮김(청계, 2001)
양계초·풍우란 외, <<음양오행설의 연구>>, 김홍경 엮고 옮김(신지서원, 1993)
유아사 야수오, <현대과학의 도양적 심신론>, <<기술과학고 졍신세계>>, 박희준 옮김(범양사, 1988)
이시다 히데미,<<기 흐르는 신체>>, 이동철 옮김(열린책들, 1996)
전창선·어윤형,<<음양이 뭐지>>(세기, 1994)
하야시 하지메, <<동양의학은 서양과학을 뒤엎을 것인가>>, 한국철학사상연구회 기철학분과 동의과학연구소 옮김(보광재, 1996)
한형조, <<왜 동양철학인가>>(문학동네, 2000)
<<황제내경강의>>, 김창민 외 옮김(정담, 1999)
<<황제내경소문·영추>>,홍원식 옮김(전통문화연구회, 1992·1994)
<<과학사상>>(범양사)

전통의학정보포털



by


Tags : , , , , , , , ,

  • 재미있게 읽으셨나요?
    광고를 클릭해주시면,
    블로그 운영에 큰 도움이 됩니다!

인천 신포동 오래된 대폿집. 다복집.

입구-'신포동 다복집'

입구-'신포동 다복집'

자주 지나다니는 거리에 있는 오래된 대폿집입니다.
저보다 나이가 많은 가게에요.
편안한 분위기에 가격도 착해서 가볍게 막걸리 한잔 걸치기 좋은 곳이죠.
단 밤 열 시 좀 넘으면 문을 닫기 때문에 너무 늦게 가면 안 돼요.

막걸리-'신포동 다복집'

새우 튀김-'신포동 다복집'

뭘 먹을까 고민하다 막걸리와 새우 튀김을 주문했어요.
일식집 튀김 방식이 아닌 분식집 방식 튀김인데 맛은 썩 괜찮습니다.
그리고 기본으로 나오는 김치와 동치미가 제대로 맛있어요.
앞으로도 한잔 걸치러 종종 찾아야겠습니다.
이런 대폿집이 집 가까이 있어서 참 좋네요. :D



크게 보기



by


Tags : , , , , , ,

  • 재미있게 읽으셨나요?
    광고를 클릭해주시면,
    블로그 운영에 큰 도움이 됩니다!

로드리게스. 멋진 가수 아저씨 이야기.

이 영화를 보기 전까진 로드리게스가 누군지도 몰랐습니다.
이 아저씨 노래 좋아요.
미국 디트로이트 출신 로드리게스는 2집 앨범까지 냈지만 흥행하지 못했답니다.
그런데 바다 건너편 남아프리카 공화국에선 엄청나게 인기가 좋았다네요.
20세기 말까지 인종차별이 심했던 꽉 막힌 남아프리카 공화국.
솔직한 로드리게스의 가사가 남아공 국민들 심금을 울렸나 봅니다.

난 궁금해 네가 얼마나 오랜 시간을 살았는지.
난 궁금해 또 얼마나 많은 계획을 망쳤는지.
난 궁금해 넌 얼마나 많은 섹스를 해 봤는지.
난 궁금해 다음 차례는 누군지.
난 궁금해 궁금해 완전 궁금해.

이런 가사였죠.
로드리게스 노래는 남아공 검열에 걸려서 앨범 속 거의 모든 곡이 방송 불가 판정을 받았었다고 해요.

아무튼, 남아공에서 인기 좋은 가수.
로드리게스 아저씨는 막노동하며 생계를 이어갑니다.
“남아공에서 인기 있다는 걸 미리 알았다면 삶이 달라졌을 텐데 아쉽지 않으세요?”
“음. 글쎄요. 어쩜 달라졌을 수도 있겠네요.”
로드리게스라는 아저씨 멋집니다.
지난 일에 아쉬움 없는 그 말투엔 초연함이 어나더군요.

American Zero, South African Hero
미국에선 꽝, 남아공에선 영웅.

이 문구를 보고 이런 생각이 들었습니다.
이 세상엔 엉뚱한 자리에서 꽝이나 마이너스 삶을 사는 사람이 얼마나 많을까요?
에너지를 쏟을 곳을 찾지 못해 헛된 곳에 힘쓰는 사람들 말이에요.
누구든 가슴 뛰는 곳에 열정을 쏟을 기회가 많아지면 좋겠습니다.

무언가를 거머쥘 능력을 갖춘 사람은 대단한 사람입니다.
세상에 몇 안 되는 사람만이 자기 분야에서 위업을 이루지요.
그리고 손에 무엇이 쥐어지든 연연하지 않는 사람은 위대한 사람입니다.

로드리게스 아저씨는 위대한 예술가 같아요.


슈가맨(Sugar man)

난 궁금해(I wonder)



by


Tags : , , , ,

  • 재미있게 읽으셨나요?
    광고를 클릭해주시면,
    블로그 운영에 큰 도움이 됩니다!

국립중앙박물관. 이슬람의 보물 - 알 사바 왕실 컬렉션.

인도 왕궁 정원-'이슬람의 보물 - 알 사바 왕실 컬렉션전'

무슨 전시가 있는지도 모르고, 계획 없이 국립 중앙박물관에 갔습니다.
주말이고 날씨도 화창한 게 기분이 좋더라고요.
‘요즘엔 무슨 전시를 하나~?’
매표소에 가니 ‘이슬람의 보물 - 알 사바 왕실 컬렉션’이 기획전이 열리고 있네요.
그릇, 의복, 카펫, 장신구, 관, 건축물, 책 등 다양한 수집품들이 전시되어 있어요.

메카 방향과 거리를 알려주는 지도.-'이슬람의 보물 - 알 사바 왕실 컬렉션전'
메카까지 방향과 거리를 정확하게 알려준다는 지도.

이런 신기한 물건이 가득해요.

그 중 가장 눈길을 잡아끄는 건 보석으로 화려하게 장식된 각종 장신구였습니다.
반지, 귀고리, 팔찌 등등 많았는데요.
손잡이가 화려한 단검이 멋지더군요.
사진은 찍지 못했지만, 앞면과 뒷면을 다른 방식으로 장식한 게 인상적이었어요.

궁수용 반지 -'이슬람의 보물 - 알 사바 왕실 컬렉션전'

궁수용 반지는 한국에서 활 쏠 때 쓰는 깍지랑 비슷하게 생겼어요.
다만 보석으로 장식되어 화려했습니다.

카타르-'이슬람의 보물 - 알 사바 왕실 컬렉션전'

아! 그리고 게임에서나 보던 카타르라는 무기도 실제로 봤네요.
태어나서 지금까지 박물관 다니면서 카타르는 처음 봤습니다.
이렇게 전시품이 다양하니 와볼 만하다 싶어요.

또 이 전시회에서 마음에 든 건 아랍어 글씨체에 대한 설명이었어요.
사실 아랍어는 봐도 이게 글씬지 그림인지도 분간이 잘 안 가는 판에,
글씨체까지 알아차리는 건 쉽지 않지요.
근데 설명을 잘해놨더라고요.
꼭 한국어 돋움체, 바탕체, 필기체 같아요.
아무튼, 즐거운 관람이었습니다.

이슬람의 보물 -알 사바 왕실 컬렉션은,
이촌역 국립중앙박물관에서 2013.10.20.까지 전시합니다.

아라베스크-'이슬람의 보물 - 알 사바 왕실 컬렉션전'

이슬람의 보물 - 알 사바 왕실 컬렉션 전시에서 재미있게 본 것.


아랍 글씨체 세 가지 기본 유형

  • 무디와르체 : 원형
  • 무살라스체 : 삼각형
  • 티임체 : 원형과 삼각형의 복합형태

자주 쓰이는 글씨체

  • 쿠파체 : 직선적이고 모난 형태.
  • 나스흐체 : 전반적으로 둥글고 우아한 필기체.
  • 솔루스체 : 초기 쿠파체를 보완한 곡선과 경사진 선 모양의 서체로 1/3을 뜻하며 모스크 장식 등 건축에 널리 사용된다. 세로획이 가로획보다 세 배가 긴 것이 특징.

그 밖에 재미있게 본 것

  • 모스크 기도실 바닥을 덮는 카펫을 사프(saff)라고 한다.
  • 인도 여름 카펫은 면에 비단으로 수놓았다.
  • 타구는 가래나 침을 뱉는 용도로 쓰는 그릇이다.
  • 아라베스크는 양식화된 식물 모티브와 줄기 등을 뜻하는 르네상스 시대 이탈리아어 아라베스코(a rabesco)에서 유래하였다. (아랍에서 유래 한 것이 아님.)

이슬람의 보물 - 알 사바 왕실 컬렉션 웹사이트



by


Tags : , , , , , ,

  • 재미있게 읽으셨나요?
    광고를 클릭해주시면,
    블로그 운영에 큰 도움이 됩니다!

Canjs와 Flask를 이용한 웹개발 예제

클라이언트 사이드 자바스크립트 프레임워크인 Canjs와
파이썬 마이크로 프레임워크인 Flask를 이용한 웹 어플리케이션 예제입니다.
이 Canjs + Flask 예제가 프레임워크 이해에 도움이 되길 바랍니다.


Canjs + Flask 예제 소스


예제에 사용된 라이브러리

  • Canjs, 클라이언트 사이드 자바스크립트 프레임워크.
  • RequireJS, 자바스크립트 파일•모듈 로더.
  • Initializr, HTML5 템플릿.
  • Bootstrap, 프론트엔드 프레임워크.
  • JSDoc, 자바스크립트 문서화 도구.
  • BusterJS, 자바스크립트 테스팅 도구.
  • mustache, 템플릿 엔진.
  • i18next, 자바스크립트 다국어 도구.
  • Flask, 가벼운 파이썬 프레임워크.
  • Flask-SQLAlchemy, SQLAlchemy의 플라스크 플러그인.
  • Jade(pyjade), 파이썬용 Jade 템플릿 엔진 플러그인.
  • Flask-Babel, 플라스크용 다국어 플러그인.

예제의 이해를 돕는 글



by


Tags : , , , , , ,

  • 재미있게 읽으셨나요?
    광고를 클릭해주시면,
    블로그 운영에 큰 도움이 됩니다!

잘 짜여진 자바스크립트 MVC 프레임워크. Canjs

Backbone, AngularJS, Spine….
그동안 나왔던 자바스크립트 프레임워크를 조금씩 건드려는 보았지만,
항상 아쉬움이 남았습니다.
이번에 Canjs를 써보니, 정말 잘 만들어진 프레임워크라는 생각이 들어요.
자바스크립트MVC 프레임워크를 써 볼까 생각 중이시라면, Canjs 한번 고려해 보세요.

can.Control

컨트롤러에서 이벤트 처리

"li .destroy {Event.destroy}": function( el, event) {
var todo = el.closet('li').data('todo);
todo.destroy();
event.stopPropagation();}
});
Events = {destroy : "click"};

css Selector, html.getElementBy, $(selector)가 Control의 셀렉터로 사용된다.

When the element your Control is bound to is removed from the DOM,
the Control destroys itself, cleaning up any bound event handlers.

can.Control 이 아는 이벤트.
* change
* click
* contextmenu
* dblclick
* focusin
* focusout
* keydown
* keyup
* keypress
* mousedown
* mouseenter
* mouseleave
* mousemove
* mouseout
* mouseover
* mouseup
* reset
* resize
* scroll
* select
* submit

링크 처리 방법(How can I make a link in Canjs?)

레이어(layer)
<a id="id" href="javascript://">href</a>

페이지(page)
<a id="id" href="#!id">href</a>

무스타치에서 콜백 받기(Mustache Element Callback)

{{data 'model'}}

경로 설정(RequireJS Paths)

requireJS can require is /can
requireJS에서 canJS를 쓸 땐 can.js를 패스로 잡고 사용해야 한다.
registerHelper이용을 위해서는 can/view/mustache가 필요하다.

404루트 잡기(How to define a catch all route to handle 404 in can js?)

http://stackoverflow.com/questions/13824665/how-to-define-a-catch-all-route-to-handle-404-in-can-js

can.route.bind('change', function(ev, newVal) {
if (newVal === 'route') {
var valid = false;
$.each(can.route.routes, function(k,v) {
if (new RegExp(v.test).test(window.location.hash)){
valid = true;
return; //exit loop
}
})
if (!valid) {
//handle the false route here
}
}
});

다국어 지원(Localization)

Localization is a good example of a custom helper you might implement in your application. The below example takes a given key and returns the localized value using jQuery Globalize.

1. Mustache.registerHelper('l10n', function(str, options){
2. return Globalize != undefined
3. ? Globalize.localize(str)
4. : str;
5. });

can.route에서 i18next 데이터를 받아오지 못할 때

can.when을 이용하여 초기화가 된 후 can라우팅 처리를 해 준다.


var lang =utils.getParam('lang');
var i18noption = {debug: true};
lang != undefined
? i18n
option.lng = lang
: i18n_option.lng = "en";
can.when(i18n.init(i18n_option)).then(function (){});

모델 관계(model associations)

https://forum.javascriptmvc.com/topic/questions-about-model-associations

<div class="header">
<h1>Association</h1>
</div>
<!-- YOUR CODE HERE -->
<div id="contacts"></div>

can.fixture("/contacts.json", function(){
return [{
'id': 1,
'name' : 'Justin Meyer',
'birthday': '1982-10-20',
tasks : [{
id: 1,
title: "write up model layer",
due: "2010-10-5"
}]},{
'id': 2,
'name' : 'Brian Moschel',
'birthday': '1983-11-10',
tasks : [{
id: 2,
title: "write up funcunit",
due: "2009-5-1"
},{
id: 3,
title: "test funcunit",
due: "2010-3-15"}]
},{
'id': 3,
'name' : 'Bobby Joe',
'birthday': '1980-2-10'
}];
})

can.Model.convert.date = function(raw){
if(typeof raw == 'string'){
var matches = raw.match(/(\d+)-(\d+)-(\d+)/);
return new Date( +matches[1],
(+matches[2])-1,
+matches[3] );
}else if(raw instanceof Date){
return raw;
}
};

// A task model that has a date
can.Model("Task",{
attributes : {
due : 'date',
}
},{
weeksPastDue : function(){
return Math.round( (new Date() - this.due) /
(1000*60*60*24*7 ) );
}
});

// A contact model that has many tasks
can.Model("Contact",{
attributes : {
birthday : 'date',
tasks: "Task.models"
},
findAll : "/contacts.json"
},{
ageThisYear : function(){
return new Date().getFullYear() -
this.birthday.getFullYear()
},
getBirthday : function(){
return ""+this.birthday.getFullYear()+
"-"+(this.birthday.getMonth()+1)+
"-"+this.birthday.getDate();
}
});

// Get all contacts and put them on the page
Contact.findAll({},function(contacts){
var contactsEl = can.$('#contacts');

can.each(contacts, function(contact){
var li = can.$('<li>')
.html(contact.name + " "+ contact.ageThisYear())
.appendTo(contactsEl);

var ul = can.$("<ul>");
var tasks = contact.attr('tasks')

if(tasks){
tasks.each(function(){
this.attr('contact', contact);
ul.append('<li>'+this.title+" "
+this.weeksPastDue()+' contact: '+ this.attr('contact.name') +'</li>')
});
}

ul.appendTo(li)
});
});

 

Canjs 웹사이트



by


Tags : , , , , , ,

  • 재미있게 읽으셨나요?
    광고를 클릭해주시면,
    블로그 운영에 큰 도움이 됩니다!

Javascript 모듈 관리엔 RequireJS

자바스크립트 모듈이 많아 관리가 어렵다면, RequireJS를 사용 해 보세요.

설정(Configuration)


require.config({
"baseUrl": "/static/js/vendor",
"paths": {
"app": "../app",
"bootstrap": [
'//netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min',
"bootstrap"
],
"jquery": [
"//ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min",
"jquery-1.9.1.min"
],
"can": "can",
shim: {
"bootstrap": {
deps: ["jquery"],
exports: "$.fn.popover"
},
enforceDefine: true
}
}
});

모듈 정의(define function)


define(["jquery"],function($){
return {
getParam: function(paramname){
var value = new RegExp('[\?&]' + param
name + '=([^&#]*)').exec(window.location.href);
return value[1];
},
test: function(text){
console.log("test : "+text);
}
};
});

두 모듈을 한 파일에 넣는 방법(requirejs, two classes in one file)

http://stackoverflow.com/questions/9806940/requirejs-two-classes-in-one-file

define('test', ['jquery'], function() {
var exports = {};
exports.test1 = {
method1 : function () {
console.log("test1 - method 1");
},
method2 : function () {
console.log("test1 - method 2");
}
};
exports.test2 = {
method1 : function () {
console.log("test2 - method 1");
},
method2 : function () {
console.log("test2 - method 2");
}
};

return exports;
});

그리고 아래처럼 사용하면 된다.
require(['test'], function (test) {
var test1 = test.test1;
});

두 모듈을 한 파일에 넣는 다른 방법
http://blog.credera.com/topic/technology-solutions/java/modular-javascript-with-requirejs


define(['json!data/customers'], function(customers){
var getRow = function(id) {
return customers[id];
};

var getAll = function() {
return customers;
};

var update = function(data) {
// do something cool with the data
};
return {
get: getRow,
list: getAll,
update: update
};
});


오류 해결

  • Jquery CDN경로가 올바르지 못할 경우 Bootstrap로딩에 오류가 난다.
  • 같은 모듈(예: bootstrap)이 중복 로드될 경우 충돌이 일어난다.

RequireJS 홈페이지



by


Tags : , , , , , ,

  • 재미있게 읽으셨나요?
    광고를 클릭해주시면,
    블로그 운영에 큰 도움이 됩니다!

유용한 javascript 예제와 팁

URL 파라메터 받아오기(get PARAM)

http://www.codetreat.com/get-url-parameters-values-with-javascript

$.params = function(paramname){
var value = new RegExp('[\?&]' + param
name + '=([^&#]*)').exec(window.location.href);
return value[1];
}

Jquery 셀렉터 성능(JQUERY SELECTOR Performance)

http://jsperf.com/selectors-perf/6
cssSelector는 id 나 element와 함께 쓰지 않고 단독으로 사용한다.


var obj = document.getElementById("childDiv");
xxx = obj.getElementsByClassName("txtClass");

 

이벤트 처리

preventDefault() : 이벤트의 기본 행동을 막는다.
If this method is called, the default action of the event will not be triggered.
stopPropagation() : 상위 핸들러로 이벤트를 넘기지 않도록 막는다.
Prevents the event from bubbling up the DOM tree,
preventing any parent handlers from being notified of the event.

prepend() - 앞쪽에 내용을 붙인다.(to attach content as a prefix.)
append() - 뒷쪽에 내용을 붙인다. (to attach content as a suffix.)

배열 요소에서 데이터를 받고 싶을 땐 $()로 한번 더 감싼다.
$($(array_selector)[0]).data(something);


두번 submit되는 문제(prevent submit twice)
onclick이벤트 보다는 onsubmit 이벤트를 사용한다.
http://stackoverflow.com/questions/2830542/prevent-double-submission-of-forms-in-jquery

this.element.find('.save').attr('disabled','disabled');

// jQuery plugin to prevent double submission of forms
jQuery.fn.preventDoubleSubmission = function() {
$(this).bind('submit',function(e){
var $form = $(this);
if ($form.data('submitted') === true) {
// Previously submitted - don't submit again
e.preventDefault();
} else {
// Mark it so that the next submit can be ignored
$form.data('submitted', true);
}
// Keep chainability
return this;
};


JSON

Object to String
JSON.stringify(obj);
Parse JSON response
JSON.parse(obj);

JSON.parse()사용시 오류 : Uncaught SyntaxError: Unexpected token o
http://stackoverflow.com/questions/8081701/i-keep-getting-uncaught-syntaxerror-unexpected-token-o
데이터형이 올바르지 않아서 나는 오류이다.
Looks like jQuery takes a guess about the datatype.
It does the JSON parsing even though you're not calling getJSON()--
then when you try to call JSON.parse() on an object, you're getting the error.


loglevel

https://github.com/pimterry/loglevel
원하는 레벨의 로그를 콘솔 메시지로 보낸다.
켜고 끄는 것이 편리하다.
log.enableAll() and log.disableAll() methods.
* log.trace(msg)
* log.debug(msg)
* log.info(msg)
* log.warn(msg)
* log.error(msg)


JavaScript 디버깅

chrome dev tool -> Settings -> General -> Disable cache
Timeline을 이용하면 어떤 코드가 어플리케이션에 부하를 주는지 찾아준다.
메모리 누수가 발생한다면 찾아 개선한다.
Profiles도구에서 Heap Snapshot을 두 개 만들어 comparison view로 비교하면 성능 저하 원인을 찾기 편하다.



by


Tags : , , , , ,

  • 재미있게 읽으셨나요?
    광고를 클릭해주시면,
    블로그 운영에 큰 도움이 됩니다!