Friday, December 2, 2011

허해구선사 글들

박재현이 올린 글의 펌입니다


-현대불교 비판-


깨달음을 얻으면 마음이 사라지는 것이 아니라
망상이 사라지고 의식이 명경같이 총총해져
눈앞에 있는 모든 것이 있는 그대로 비치는 것이다.

이러한 실상을 모르기 때문에 거짓된 깨달은 자들은
깨달음은 절대 청정해야 한다는 관념에 얽매여
모든 것을 버리고 마음도 버려야 한다고 하면서
모든 인연을 끊고 멍하게 앉아 밥이나 축내면서
관념적인 소리나 하고 사는 것이다.

깨달은 자는 모든 욕망과 거짓과 아상을 버리고
오직 진실과 사랑만이 남아
세상을 위해 자신을 바치는 공덕행에 생명을 바친다.

명경처럼 맑은 마음에 세상의 잘되고 잘못되는 일들이 그대로 비치고
마음 속에 세상에 대한 사랑과 자비가 가득하기에
잘못되고 불행한 일들을 그냥 넘어갈 수가 없는 것이다.

따라서 세상을 보지 못하고 공덕을 실천하지 않는 자는 깨달은 자가 아니다.

그러므로 깨달았다고, 절대 자유를 얻었다고
이치와 인간의 도리를 버리고 짐승처럼 행동하는 자는
저 혼자 깨달았다는 착각에 빠져 정신을 놓아버린 미친 자이지
깨달은 자가 아닌 것이다.

그들이 참된 깨달음을 얻었는지는
눈앞에 있는 세상 일을 물어보면 된다.

깨달은 자는 망상이 없어
눈앞에 비친 일들과 이치를
비치는 대로 쉬운 말로 표현할 뿐이지
태극이나 무극과 같은 보이지 않는 우주적 움직임이나 관념적인 논리를 쓰지 않는다.

따라서 눈앞에 있는 정치, 경제, 사회, 문화, 생명, 인간의 모든 문제에 대해
이치에 맞게 한치의 의문없이 대답을 해야 진정한 깨달음을 얻은 것이다.

깨달았다고 하는 자가
실상 속에 있는 일에 대한 인과법을 설하지 않고
산속에 앉아 깨달음에 대한 관념적인 이야기만 한다면
그는 아직 세상을 보는 눈을 얻지 못한 상태이고
세상을 위해 일할 양심과 용기가 없음을 스스로 나타내는 것이다.

산속에 혼자 앉아 가만히 생각만으로 깨달음을 얻는 길은 없으며
보이지 않는 눈이 한순간에 보이는 이치는 절대 없다.

모든 것은 원인을 지어야 변화가 생기는 것이니
마음에 업이 있는 자가 완전한 반야심을 얻고자 한다면
길을 배우고 깨우쳐 마음을 닦는 공덕행을 실천해야 하는 것이다.

부처의 제자라면 부처님이 설한 실상의 법을 배우고 세상의 이치를 깨달아
세상을 축복하는 공덕행을 통하여 자기 속에 있는 모든 업장을 다 태워버릴 때
비로소 업이 사라진 반야지경에서 세상을 있는 그대로 보게 되는 것이다.

공덕행을 통해 원인을 지어 자신의 마음을 변화시키려 하지 않고
가만히 앉아 화두만 잡고 깨달음을 얻으려고 하는 것은
원인을 짓지 않고서도 결실을 얻을 수 있다는 인과법에 반하는 논리로서
가만히 앉아서도 쉽게 깨달을 수 있다는 요행수로
현실에서 살아가기 힘든 근기가 허약하고 게으른 자들에게
가장 편하고 마음에 드는 수행법인 것이다.

산자에게 마음을 버리라는 것은
현실에 부딪히며 일어나는 마음을 버리라는 말과 같으니
결국 현실을 버리고 아무 일도 하지 않고 멍하게 살라는 말과 같다.

현실을 버린 상태에서 현실에서 들려오는 모든 감각의 원천을 차단하면
마음의 변화가 없어 평안하기야 하겠지만
그 마음은 생동하는 생명체의 살아 움직이는 마음이 아니라
죽은 자의 무감각한 마음과 같이 것이니
더 이상 자신을 좋게 만드는 원인을 짓지 못하는 말법이 되는 것이다.
그러니 마음을 버리라는 말은 깨달음의 실상과 어긋난 말로서
주체적인 삶과 인간농사를 포기하는 거짓된 깨달음의 전형적인 허위관념인 것이다.

산자가 생명의 근본인 의식과 의식이 환경과 부딪혀 일으키는 마음을 버리면
주인 없는 자리에는 귀신 밖에 들어올게 없다.
자기의 마음과 의식을 버리고 멍한 상태에 빠지면
주인없는 몸에 유혼이 들어와 그 자리를 차지하여
그 사람은 귀신의 노예가 되어 살게 되는 것이다.

오늘날 마음을 버리라는 잘못된 가르침에 의해
수많은 명상하는 자들이 마음을 놓고 함부로 신을 받아들인 관계로
갑자기 한소식하여 깨달았다고 신놀음하는 자가 많은 것이다.

마음을 버리라는 말의 진정한 뜻은
욕망이 난무하는 어두운 세상에서
헛된 탐욕과 집착, 망상에서 벗어나 나쁜 업과 한을 짓지 말라는 뜻이다.

즉 칠불통계와 같은 이치로
좋은 마음은 기르고 나쁜 마음은 버리라는 것이다.

이처럼 말법은 깨달음의 실상을 모르니 전하는 과정에서
부처의 가르침과 반대되는 가르침을 전하여 세상을 오도하고 있는 것이다.

부처님의 가르침은 실상에 대한 가르침이며 완전한 인과법의 설파인데
지금 불법은 공사상에 빠져 사실을 멀리하고
관념적인 깨달음의 논리가 한창이다.

그 대표적인 사례가 참선법이다.

선법은 부처님의 정법이 아니다.
선법은 불가의 선정이 중국에 와서 도가의 좌선법의 영향을 받아 나타난 것이니
어찌 천년 이후에 나타난 참선법을 부처님의 정법이라 하겠는가?

화두는 이치에 닿지 않은 끝없는 수수께끼이니
그 속에 빠지면 그 길없는 환상에 빠져 헤어나올 수가 없다.
길이 없으니 더 엄청난 것이 있겠지 하는 착각에 빠져 끝없이 헤매게 되고
근기가 허약한 자들은 그 속을 헤매다 지치고 허약해져 갈망에 환상을 보게 되고
그것을 보고 진짜 자기가 깨달은 줄 알고 헛된 관념적인 소리나 귀신놀음을 하며
자신과 세상을 속이게 되는 것이다.

그러니 과거 깨달았다는 조사들의 가르침 속에는
세상을 보는 깨달음의 지혜가 없고
세상을 밝히는 사실적인 인과법을 설한 사례가 없는 것이다.

그래도 성철 스님이 양심적인 것은 임종시에
“일생 동안 남녀의 무리를 속여서
하늘을 넘치는 죄업은 수미산을 넘친다.”고 고백한 것이다.
그 말을 해야 그는 마음이 조금이나마 편안하게 죽을 수 있었던 것이다.
성철스님이 이러할진데
어찌 증거도 없는 과거 조사들이 깨달았다고 할 것인가?

깨달은 자가 나왔다면
모든 일은 사실 속에서 증명되어야 하는데
그 증거가 나타나지 않는다면
아무리 깨달았다고 주장해도
그것은 허공 속에서 땅따먹기 하는 것에 지나지 않는 것이다.

따라서 부처님의 직접 가르치신 초기의 실상의 가르침을 따르지 않고
선법을 제일이라고 따르며 환상적인 공만 이야기하는 자들은
부처의 제자가 아니라 조사의 제자일 뿐이니
잘못된 인연에 빠져 자신의 인간농사를 망친 어리석은 자들인 것이다.




-라즈니쉬에 대하여-



라즈니시의 글은 그럴듯한데 그 속에 진실이 없다.
명상에 대한 글은 있는데 삶에 대한 글은 없다.
그러므로 그는 정견을 얻어 실상과 인과법을 본 자가 아니다.

그는 깨달음이란 본래부터 텅 비어있음을 깨닫는 것이며
행복이란 아무 것도 하지 않고 텅 비어있음을 즐기는 것이라고 한다.

그래서 불행이란 인간이 비어있음을 즐기지 않고
인위적으로 무엇이 되고 억지로 채워 넣으려 하기 때문에 오는 생트집이라고 본다.

아니다. 마음이 텅 비어 있음을 느낀다고 해서 깨달음이 오는 것이 아니다.
아무리 생각으로 마음을 비워버려도 내면 속에 깊숙이 박혀있는 업이 스멀스멀 피어나는데
어찌 더 이상 갈증없는 맑은 마음을 얻을 수 있겠는가?

이러한 주장은 실상을 무시하고 모든 것을 환상으로 보는 관념적 사고 때문에 생겨난 오류이다.
생각만으로는 안된다.
깨달음은 마음을 비워 깨치는 것이 아니라 공덕의 실천으로 업을 태워 이루는 것이다.

라즈니쉬는 세상은 환상이며 본래 아무 것도 없는 것이니
본래부터 텅비어 있음을 깨달으면 해탈에 이르며 지복을 얻는다고 주장한다.
그래서 그는 현실과 생생한 삶을 경시하고 삶을 명상으로 대체하라고 한다.
그가 이렇게 세상을 부정하는 이유는 세상의 존재이유를 무명(마야)으로 보아
이 세상을 실재로 존재하지 않는 환상으로 보기 때문이다.

그래서 그는 세상에 일어나는 모든 것은 신의 실체를 둘러싼 환영에 불과하므로
어느 것 하나 부정할 것도 긍정할 것도 없으니 모든 구별과 판단을 놓아버리고
모든 것을 신의 몸짓으로 받아들여 신과의 일체감 속에서 자유를 얻어야 하는데
이를 위한 수단이 바로 명상이라는 것이다.

그러나 세상은 관념이 아니라 생생히 살아 움직이는 실체이다.
그는 모든 것이 존재하지 않는다는 낙공(도무론, 허무주의)에 빠져
완전한 법계 속에 존재하는 실상과 생생한 삶을 한갖 꿈으로 관념화시켜 버리는 오류를 범한 것이다.

그 결과 그의 추종자들은 현실속에서 공덕을 쌓는 생생한 생명과 진리의 길을 무시하고
인생을 단순히 즐기고 명상하는 꿈으로 생각하고 살아감으로써
그들의 집단인 아쉬람은 성적 타락과 마약의 소굴이 되어 인도사회의 큰 비난대상이 되고 있는 것이다.

아무 것도 바라지 않고 모든 욕망에서 자유로운 상태가 되는 것! 맑게 개인 완전한 의식을 얻는 것은
바른 이치를 깨닫고 진실을 끝없이 추구할 때 다가오는 삶의 열매인 것이지
현실과 유리된 명상이나 마음의 자각만으로 얻는 경지는 절대 아닌 것이다.

따라서 명상으로 텅빈 마음을 깨닫기만 하면 해탈과 지복이 온다는 이러한 시각은
진리를 배우고 깨우쳐 공덕을 쌓아야만 이룰 수 있다는 부처님의 정견과 정면으로 배치되는 것이다..

부처님은 신에 의지한다던가 명상이나 고행으로 깨달음을 얻는다는 것은
존재하지 않는 거짓이며 이치에 맞지 않은 비진리로서 이런 주장을 외도라 하셨다.

그럼에도 불구하고 수천년이 지난 오늘까지 이런 말법들이 아직도 남아 힘을 쓰는 것은
어두운 세상 속에는 업이 두터운 자들이 많아 바른 인과법보다 허황함을 좋아하게 되고
이런 자들을 이용해 자신의 이익과 권위를 유지하려는 탐욕스럽고 위선된 자들이 많았기 때문이다.

그들은 인과의 이치에 따라 꾸준히 공덕을 쌓는 것이 너무 힘들고 지루하기 때문에
신에 의지해 쉽게 구원을 얻거나 한소식하여 빨리 깨달음을 얻는 명상비법에 더욱 끌리는 것이다.

모든 것이 인과의 이치에 의해 이루어지는 완전한 법계 속에서
바르고 좋은 원인을 짓지 않고 완전함에 이룰 수가 없다.
따라서 노력하지 않고 쉽게 얻으려고 하거나 삶을 무시하고 생각으로 깨달으려고 하는 것은
모두 외도이며 사법인 것이다.

따라서 완전한 법계와 인과법을 부정하고 세상에 허무와 혼돈을 전하는 라즈니시는
정각을 얻은 자가 아니라 관념 속에서 말법을 전하는 어둠의 사도인 것이다.

그는 행복에 대해 말하기를 모든 것을 놓아버리고 텅빔을 알면 지복을 누린다고 했다.
그러나 세상의 모든 일은 사실로 존재하는 것이니 행복도 마음만으로는 안되며 현실적 조건을 갖추어야 한다.
모든 것을 마음으로만 생각하는 것은 인간이 육신을 갖고 살아간다는 사실을 외면하는 것이다.

그러므로 살아 움직이는 생명체인 인간이 행복을 느끼기 위해서는
정신과 함께 육신도 만족할 수 있어야 하는 것이다.

사람들은 삶이 힘들고 불안하니까 행복을 원한다고 말한다.
그러나 현실 속에 행복이 실현된 적이 없는지라 사람들은
행복을 손에 잡을 수 없는 신기루로만 생각하지 스스로의 노력에 의해서 얻을 수 있다는 사실을 알지 못한다.

하지만 세상은 완전한 법계이니 그 이치를 알고 원인을 찾아 실천하면 이루지 못할 일이 없는 것이다.
농사일도 때를 가려 지킬 것을 지키고 행할 것을 행해야 풍년이 오듯이
삶의 행복도 인간의 길을 지키고 가꾸면 반드시 다가오는 것이다.

그렇다면 행복이란 과연 무엇이며 행복의 법칙은 무엇인가?
인간세상에서 행복이란 배고프지 않고 외롭지 않고 밝은 마음을 가지고 사는 것을 말한다.

그러기 위해서는 단순히 마음만 비워서는 안되며 그러한 조건을 스스로 만들어야 하는 것이다.
그렇다면 어떻게 해야 하는가?

먼저, 배고프지 않기 위해서는 열심히 일하고, 검소한 생활을 해서 저축을 해야 한다.
부지런히 노력하고 철저한 계획을 세워 수입범위 내에서 지출하다보면
점차 삶의 고단함에서 벗어나 풍족해지는 것이다.
그러므로 습이 많아 사치스럽고 허영이 많으며 게으르고 일확천금을 노리는 자들은
안정된 삶을 얻기 어려운 것이다.

둘째, 외롭지 않기 위해서는 양심과 사랑이 있어야 한다.
밝고 좋은 마음이 있어 바르고 성실하게 일하면 신임을 얻어 좋은 이웃을 만나게 된다.
서로 위해주는 좋은 사람들을 만나 서로 의지하고 축복을 나눈다면
나쁜 일을 이겨내며 외롭지 않는 삶을 살 수 있는 것이다.

셋째, 마음이 밝기 위해서는 정직해야 한다.
거짓말을 하지 않으면 마음에 어둠이 없고 항상 맑고 당당하게 살 수 있다.
아무리 부귀와 권력을 누린다한들 그 마음이 불안하고 죄스러우면 아무 의미가 없는 것이다.

그러므로 근면, 검소, 양심, 사랑, 정직이 행복을 얻는 지름길인 것이다.

그러나 이것만으로는 부족하다.
세상과 더불어 함께 흘러가는 인생이다 보니 좋은 세상을 만나야 한다.
어둡고 위험한 사회에서 개인이 아무리 모든 조건을 갖춘다 해도 행복을 누릴 수 없는 것이다.

사람은 불행한 일이 자기에게 없을 때, 자기에게 불행한 일이 일어나지 않는다는 보장이 있을 때
행복을 느낄 수 있고 또 항상 그 행복을 유지할 수 있다.
따라서 맑고 공정하고 평안한 환경을 만나는 것이 행복의 외부적 조건인 것이다.

더러운 탁류 속에서는 아무리 고고하게 산다한 들 구정물이 묻지 않을 수 없듯이
바른 이치가 사라지고 정의가 무시되는 사회에서는
아무리 올바르게 열심히 살아도 좋은 결과를 얻기 어려운 것이다.

캄캄한 세상에서는 아무리 좋은 시력을 가지고 있더라도 장님의 시각과 별로 다를 바 없다.
그런 세상에서는 눈을 감고 장님처럼 살아가는 게 오히려 편한 것이다.

오늘날 바른 정신을 가지고 참된 가치를 추구하는 자가 살아가기 힘든 이유는
오늘날 세상이 진리가 뒤집어지고 정의와 양심이 숨을 죽인 어두운 세상이기 때문이다.

따라서 행복하기 위해서는 나만 좋아져서는 안되며 이 세상도 함께 좋아져야 한다.
그 길이 바로 바른 이치를 세상에 전하고 축복하는 공덕행인 것이다.
그래야만 상상 속에 존재하는 행복이 아니라
인간 세상 속에 실제로 존재하는 지상천국이 다가오는 것이다.

이일을 누가 해야 하는가?
인간 스스로가 해야 하며 귀한 진리의 인연을 만난 우리가 해야 하는 것이다.
행하지 않으면 아무도 행복을 가져다주지 않으며 어디에도 행복은 존재하지 않는다.

그러나 실상에 대한 진실과 바른 이치에 눈뜨지 않으면
행복이 어디에 있는지 모르며 어떻게 해야 행복한 세상이 오는지 알지 못한다.

그러므로 그동안 세상에 나타난 수많은 유토피아들은 행복해지는 길을 모른 채 이상으로 그린 세상이었기에
모두 실천할 길이 없는 존재하지 않은 환상이었던 것이다.

따라서 정법의 인연을 만나 세상의 진실과 이치를 배워야 한다.
법계 속에 존재하는 모든 일은 인과법으로 이루어지고 있기 때문에
이치 속에 있는 일들을 알면 사람은 자기 스스로 자기가 원하는 삶을 만들 수 있는 것이다.

자아를 비우고 아무 것도 아닌 사람으로 욕망없이 살다 사라져가는 것이 가능한가 물었다.

욕망없이 산다는 것과 소망없이 산다는 것은 구분해야 한다.
이치에 맞지 않은 욕망은 부려서는 안되지만 인간이 가야할 소망을 찾는 것은 바람직한 일인 것이다.
진리가 사라진 세상에서는 이 구분이 잘 되지 않아 사람들이 혼돈 속에 방황했던 것이다.

소망은 모든 것이 순리에 맞기 때문에 일할수록 삶이 건전해지고 무르익지만
욕망은 이치에 맞지 않으므로 집착할수록 거짓이 생기고 마음이 병들어 자신을 망치게 된다.
따라서 좋은 뜻을 품고 열심히 노력할 때 인간의 뜻과 소망이 완성되며 인간완성에 이르게 되는 것이며
함부로 허황된 욕심을 부리게 되면 파멸에 이르게 되는 것이다.

그리고 부모, 형제, 처자, 친구들이 바라는 사람이 되는 것을 포기하는 것이 꼭 나쁜 일은 아니다.
그들이 원하는 일이 인간이 가야 할 참된 소망이 아니라 세속의 굴레에서 바라보는 탐욕이라면
그러한 요구에서 벗어나 참다운 보람과 가치를 이루는 것은
자신에게서나 부모, 처자, 형제, 친구 모두에게 축복되는 일인 것이다.

Wednesday, November 30, 2011

CodeIgniter + WebHosting

These are a few difficulties that can be met when installing or migrating to CogeIgniter (CI) in a webhoting server.

1. pconnect (DataBase)

    It should be checked by phpinfo.
    If it is disabled, then change the value in application/config/database.php

        $db['default']['pconnect'] = FALSE;


2. index.php and .htaccess (Apache)

    If the CodeIgniter directory is not in the root but under a direcotory,
    then there might be a small change in .htaccess

        /A DIRECTORY/CodeIgniter Directory/.htaccess
            RewriteBase /CodeIgniter Directory/

3. base_url()

    If it is not in the root directory, then base_url() should be prefixed in every links.


  $cjspath = base_url() . $this->config->item('cjs');
  $module_path = $cjspath . "/$module";
  $common_path = $cjspath . "/common";


        echo "<script type='text/javascript'>\n//<![CDATA\nBASE_URL='" . base_url() . "'\nLOGGEDIN=$loggin;\n//]]></script>";

    There are two exceptions that the base_url() is not necessary!
    (using base_url() produces the same effect, though)
    1. the src in <a> tag as in <iframe src='dafk'>
    2. when using link_tag('adkf') like echo link_tag($cssfile);


Sunday, November 27, 2011

Lisp IDE: Emacs + Slime + Clozure CL

1. Install Emacs in C:\Lisp\Emacs (http://ourcomments.org/Emacs/EmacsW32.html)
2. Copy Slime into C:\Lisp\Slime (http://common-lisp.net/project/slime/)
3. Copy Clozure into C:\Lisp\Clozure (http://ccl.clozure.com/)
4. Edit .emacs by ~/.emacs in Emacs

    (set-language-environment "utf-8")
    (add-to-list 'load-path "C:/Lisp/Slime/") 
    (setq inferior-lisp-program "C:/Lisp/Clozure/wx86cl.exe")
    (require 'slime)
    (setq slime-net-coding-system 'utf-8-unix)
    (slime-setup '(slime-fancy))

5. M-x slime in Emacs


Thursday, November 24, 2011

jQuery Event

jQuery를 잘 설명한 글이 있어서 펌한다 (2011-11-25)

http://taeyo.net/Columns/View.aspx?SEQ=377&PSEQ=29


드디어, 이벤트를 다루는 강좌까지 왔습니다. 이러다가 jQuery 전체 내용을 강좌로 다 쓰겠네요. 흠! 뭐 그것도 나쁘지는 않겠죠!
일단, 여기서 말하는 이벤트라는 것은 여친과의 100일 기념 이벤트라던가, 결혼 기념일 이벤트라던가, 생일빵 이벤트라던가 하는 이벤트가 아니라는 사실은 다들 알고 계실 것이기에 “이벤트”라는 단어를 가지고 괜한 개그를 시도한다거나 하지는 않도록 하겠습니다(역시, 난 소심해 유유).
그렇습니다. 웹 프로그래밍에서의 이벤트란 사용자의 어떤 액션(개체를 클릭하거나, 마우스를 움직이는 행동)에 의해서 야기되는 사건을 의미하며, 그러한 이벤트에는 클릭, 마우스 오버, 키 입력 등이 있습니다. 그리고, 일반적으로 그러한 이벤트가 발생하는 경우 특정 로직을 수행하기 위해서 해당 이벤트와 특정 메서드를 연결해 놓곤 하는데요. 이러한 연결을 이벤트 처리기 매핑(event hanlder mapping)이라고 이야기하며, 매핑에 의해서 연결된 메서드들을 이벤트 처리기라고 합니다. Click, MouseOver, KeyPress 등등을 알고 계시죠? 그렇습니다. 이들이 이벤트 처리기들입니다.
예를 들면, 여러분은 자바스크립트를 사용해서 다음과 같이 이벤트 처리기를 매핑할 수 있습니다.
Window.onload = pageLoad;
이 코드에서 이벤트는 onload 이고요(관례적으로, 이벤트명 앞에는 on을 써서 표기하곤 합니다). 이벤트 처리기는 pageLoad 입니다. 그리고, 그 둘을 연결하는 위의 코드를 이벤트 처리기 매핑 코드라고 부릅니다. 즉, load 이벤트가 발생하는 경우에는 pageLoad라는 이벤트 처리기를 실행하라는 의미이죠. 코딩 좀 하는 분들은 이벤트 처리기(event handler)를 이벤트 핸들뤄~라고 원어 그대로 부르기도 합니다만, 어떻게 부르던 이해할 수만 있으면 됩니다(이렇게 말하고나니, 왠지 이벤트 핸들러라고 더 많이 부르는 듯한 느낌이…).
뭐. 다 아시는 이야기를 했는데요. 사실 이벤트라는 놈을 사용하는 것 자체는 하나도 복잡할 것이 없으며, 어려움없이 쉽게 사용할 수 있지만, 이벤트의 내부 동작방식을 이해하는 것은 살짝 어렵게 느껴질 수 있습니다. 만일, 여러분이 기존에 VB나 C#으로 사용자 정의 이벤트 작성을 해봤다면 델리게이트 및 이벤트와 관련하여 다소 헛갈리는 피곤함을 느껴보신 경험들이 있으실 겁니다(책을 막 찾아보면서 어떻게든 이해하려고 애를 쓰곤 하죠). 여러분이 머리가 나빠서 이해가 잘 안되는게 아니고요. 첨에는 누구나 다 난해하게 느낍니다(아! 여러분은 한 개도 안 난해했다고요? 조나단 쉬웠다고요? 그럼, 저만 어려웠었나보네요!!! 흥!!).
여하튼, 이벤트란 놈은 그런 놈인데요. 지금부터 이야기할 jQuery의 이벤트 관련 기능들은 대부분 이벤트 매핑을 쉽게 하는 방법에 대한 이야기입니다. 뭐 원래도 이벤트 매핑은 쉬운 편인데, jQuery가 뭐 대단한 기능을 제공해 줄만한 게 있나?라고 생각했다가는 올 겨울에 썰매 좀 끌게 되실 겁니다(큰 코가 다쳐서 루돌프 코가 된다는 말 개그입니다).
기본적인 자바스크립트 이벤트 매핑 방식(위에서 보여드린 Window.onload = pageLoad;과 같은 것)도 나름대로 깔끔한 편이라 사용하기에 그리 큰 불편함은 없습니다만, 페이지의 구성이 복잡해지게 되면 사용상의 제약이나 코딩 상의 불편함이 생겨나곤 합니다. 예를 들어, 버튼 개체에 동일한 이벤트를 여러 번 추가해야 하는 경우를 생각해 봅시다. 즉, 페이지에 상단에서 button.onclick = button_click;와 같이 이벤트 매핑을 해 두었는데, 페이지의 하단에서 button.onclick = btn_click;와 같이 동일 이벤트에 대해 또 다른 이벤트 처리기를 덧붙여야 한다면 어떻게 해야 할까요?
그럴 일이 왜 있어! 말두 안돼! 그리고, 그런 일이 생기면 설계가 잘못된거야! 걍 코드를 전부 button_click() 함수 안에 다 넣었어야지! 라고 말씀하실 수 있습니다. 네네~ 물론, 일반적인 경우라면 그렇게 하면 됩니다. 하지만, 동적으로 페이지를 꾸미는 경우에는 그렇게 하기가 어려운 경우도 있습니다. 예를 들면, 마스터 페이지에서 클릭 이벤트를 매핑하고, 콘텐트 페이지에서도 이벤트 처리기를 다시금 매핑해야 하는 경우도 생각보다 자주 있을 수 있기 때문입니다(Load 이벤트의 경우는 꽤 자주 이러한 처리가 필요합니다).
또한, 어떤 개체에 동적으로 이벤트 처리기를 매핑해야 하는 경우도 있을 수 있습니다. 다만, 동적으로 이벤트를 매핑한다고 해서 기존 매핑을 뒤집어 써서는 안되겠죠.
이러한 다중 처리기 매핑의 경우는 기본 자바스크립트 매핑만으로는 설정하기가 다소 까다롭습니다. 심지어는 동일 이벤트에 대한 다중 매핑이 아예 불가능하다고 아시는 분들도 계시는데, 사실 불가능하진 않습니다. 이에 대해서는 유경상 수석의  " 스크립트 가지고 놀기 (Java Script Tip : Interception)" 강좌를 한번 참고해 보시기 바랍니다. 하단의 예제에서 이러한 부분을 다루고 있습니다(호오~ 유물탱~ 역시 박식하심!).
그리고, 자바스크립트 기본 매핑 방식으로 설정하기가 좀 짜증이 나는 또 다른 예로는 “일회성 이벤트 매핑”을 들 수 있습니다. 일회성 이벤트 매핑이란 것은 특정 이벤트가 한번만 동작하고 그 이후로는 동작되지 않는 것을 말합니다. 예를 들면, 버튼이 처음 클릭되는 경우에는 처리기 메서드가 호출되지만 그 이후로는 클릭해도 메서드가 동작하지 않게 처리하는 것이죠. 기본 스크립트로 이러한 처리를 하려면, 버튼 클릭 이벤트 처리기 내부에서 이벤트 매핑을 제거하는 코드를 넣어야 하는데요. 사실, 이런 식으로 코딩하는 것은 뭔가 깔끔하지 않은 프로그래밍처럼 느껴지곤 합니다. 이벤트 매핑의 주체가 이벤트 처리기 자신이다보니 일종의 무한반복 호출 코드처럼 비춰질 수 있기 때문이죠.
이 외에도, 자바스크립트 기본 매핑을 사용할 경우 작업하기가 약간 복잡한 다양한 사례들이 존재합니다. 비록 작업이 불가능하지는 않지만, 뭔가 개발이 복잡해지고, 지저분해지며, 관리하기에도 난해해지게 된다는 것이죠. 그렇기에, jQuery는 이벤트와 관련한 코드를 간결하게 작성할 수 있도록 돕는 다양한 기능 또한 제공하고 있습니다.
그리고, 그것이 이번 강좌의 주제이지요! (기승전결의 기를 너무 오래 끌었네요. 아~ 기가 빠지네요). 그렇다면, 봅시다. jQuery의 이벤트 지원 메서드들을!!!!!
jQuery가 제공하는 이벤트 관련 메서드들
bind( type, data, fn )매치된 요소에 이벤트 처리기를 바인딩한다. type에는 이벤트 명칭을, data에는 부가적으로 전달할 데이터 개체(Json)를, fn 에는 이벤트 처리기 함수를 작성하면 된다.
unbind( type, fn )매치된 요소에서 지정된 이벤트와 매핑된 모든 처리기들을 제거한다. bind 메서드와 상반되는 메서드이다
one( type, data, fn )매치된 요소에 오직 한번만 실행되는 이벤트 처리기를 바인딩한다
trigger( event, data )매치된 요소의 특정 이벤트를 트리거한다.
일관성을 중요시하는 jQuery 답게 역시나 메서드도 일관성이 있습니다. 사용하는 방법은 매우 간단합니다. 특정 개체에게 이벤트 매핑이 필요하다면 bind 메서드를 사용해서 해당 이벤트와 처리기를 등록하면 되고요. 이벤트 매핑을 제거하고 싶다면, unbind를 사용해서 매핑을 제거할 이벤트를 지정하면 됩니다.
예를 들면, 다음의 코드는 MyBtn 이라는 아이디를 갖는 버튼에게 클릭 이벤트 처리기를 매핑하는 예입니다.
$("#MyBtn").bind("click"function() {
   
alert("누가 내 버튼을 클릭한 것이냐?");});
아! 물론, 이벤트 처리기를 익명 함수 대신 별도의 함수로 떼어내서 작성하는 것도 가능합니다만, 일반적으로 jQuery에서는 익명 함수를 사용하곤 하죠. 사실, 실제로도 별도 함수로 분리하여 사용할 일은 적은 편입니다. 별도 함수로 작성하는 것은 대부분 재사용을 위해서인데, 이벤트 처리기는 재사용할 일이 거의 없기 때문이죠.
자. 이쯤 되면 물어오는 질문이 있습니다. 그렇습니다. 바로 첫 번째 인자로 사용하는 이벤트 명에는 어떤 것들이 있느냐는 것이 그것입니다. 하하하. 왜 안 물어보시나 했네요~ 그러면, 그러한 이벤트들을 정리해서 보여드리겠습니다. 짜잔!
사용 가능한 이벤트 명 : blur, focus, load, resize, scroll, unload, beforeunload, click, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, error
그렇습니다. 여러분이 알고 있는 거의 모든 이벤트 명칭이 다 포함되어 있습니다.
반면, 이미 특정 이벤트에 매핑되어 있는 처리기를 제거하기 위해서는 unbind 메서드를 사용합니다. 사용 예는 다음과 같습니다.
$("#MyBtn").unbind("click");
이 코드를 사용하면, 이제 click 이벤트에 연결되어 있는 모든 처리기가 삭제되기에, 더 이상 클릭을 해도 아무런 동작도 하지 않게 됩니다. 간단하죠?
또한, jQuery는 앞서 제가 언급했던 일회성 이벤트 처리를 지원하기 위한 one 이라는 메서드도 제공해 줍니다. 개인적으로 제가 참으로 좋아라하는 메서드입니다. 이는 이벤트 처리기를 딱 한번만 실행시키고 그 이상으로는 실행시키지 않는 일회성 매핑입니다. 다음 코드를 한번 보시졈.
$("#MyBtn").one("click"function() {
    
alert("누가 내 버튼을 클릭한 것이냐?");");});
이제, 클릭 이벤트는 처음 클릭하는 경우에만 메시지박스를 보여주고, 그 이후의 클릭은 아무런 반응도 하지 않을 것입니다. 멋지죠? 이 메서드는 생각보다 자주 사용되며, 꽤나 유용합니다. 꼭 기억해 두세요~
마지막으로, trigger()라는 메서드도 존재하는데요. 이는 특정 이벤트를 코드를 사용해서 일으키기 위한 메서드입니다. 즉, 실제로 사용자가 클릭 액션을 하지 않았음에도, 클릭을 한 것처럼 이벤트를 일으키는 코드라는 것입니다. 예를 들면, 다음과 같이 코드를 작성할 수 있는데요.
$("#MyBtn").trigger("click");
이 코드는 사용자가 버튼을 클릭한 것처럼 클릭 이벤트를 일으키게 합니다. 코드를 사용해서 강제로 이벤트를 발생시키는 방법이라는 것이죠. ^^
이로써, 4가지 기본 이벤트 처리 메서드들을 알아보았는데요. 한가지 언급하지 않은 것은 각 메서드들이 두 번째 인자로 가지고 있는 data라는 인자입니다. 혹시 그것이 무엇을 위한 것인지 궁금하시지는 않았나요? 아? 그런게 있는지도 몰랐다고요? 아… 그..렇.. 군.. 요…
해서, 다시 한번 살펴보자면 bind 메서드의 기본적인 시그너처는 다음과 같았습니다.
bind( type, data, fn)
시그너처만 보면, bind 메서드에는 총 3개의 인자가 제공되어야 하는데, 위에서 우리는 인자를 2개만 작성했었죠? type과 fn을 말입니다. 허엇. 글고보니 인자를 2개밖에 제공을 안했는데 어떻게 이것이 올바르게 동작되었던 것일까? 두번째 인자는 data이지 fn이 아닌데 말이죠.
두 번째 인자인 data는 사실 선택적인 인자입니다. 즉, bind 메서드는 총 인자가 2개가 들어오면 내부적으로 첫 번째 인자를 type으로 인식하고, 두 번째 인자는 fn 으로 인식하게 됩니다. 그리고, 총 3개의 인자가 지정되는 경우에만 첫 번째 인자를 type으로, 두 번째 인자를 data로, 그리고 세 번째 인자를 fn으로 인식하는 것이죠. 해서, 앞의 예제에서는 인자를 2개만 전달해도 잘 동작했던 것입니다. 하하. 이해가 되시죠?
사실, 두 번째 인자는 그다지 자주 사용되지 않는 편인데요. 이는 이벤트 처리기에 “부가적으로” 전달할 데이터 개체(Json 등)를 지정하기 위한 인자입니다. 그리고, 이 데이터 개체는 처리기 함수 안에서 [event.data.속성명] 과 같은 코드를 통해서 그 값을 읽어올 수가 있습니다. 말로는 설명이 좀 거시기 하네요. 예를 한번 볼까요? 그럽시다.
$("#MyBtn").bind("click",
                 { name: 
"Taeyo", gender: "남" },
                 
function(e) {
                     
alert(e.data.name + " / " + e.data.gender);
           
});
보이다시피, 두 번째 인자로 { name: "Taeyo", gender: "남" } 라는 JSON 개체를 넘겨주고 있습니다. 이렇게 부가적인 데이터를 넘기면, 그 데이터를 이벤트 처리기 안에서 사용할 수가 있게 되는데요. 단, 그 데이터에 접근하려면 처리기 함수는 이벤트 데이터를 가져오기 위한 인자(예제의 경우, e)를 지정해 주어야 합니다. 그러면, e.data 라는 개체를 통해서 우리가 지정한 개체에 접근할 수가 있게 되는 것이죠. 예제에서 보이듯이 e.data.name, e.data.gender 와 같이 우리가 지정한 JSON 개체 속성에 접근하는 것을 볼 수 있습니다. 호옹~~ 뭔가 그럴싸하죠~ 그럴싸 하지만, 그다지 자주 사용하지는 않는다는 거~~ 그냥 기억만 해 두세요~
자자~~ 이로써 jQuery의 기본 이벤트 지원에 대해서 알아보았습니다. 그러니 이 내용을 종합적으로 다루는 예제를 하나 해봐야 하겠죠? 안 그럼 뭔가 좀 서운하잖아요. 날도 추워지는데!
EventEx1.htm
<html>
<head runat
="server">
    <title></title>
    <script src
="jquery-1.3.2.min.js" type="text/javascript"></script>
      <script type
="text/javascript">
          $(
function() {

              $(
"#MyBtn").bind("click",
                               { name: 
"Taeyo", gender: "남" },
                               
function(e) {
                                  
alert(e.data.name + " / " + e.data.gender);
                          
});


              
$("#MtSnow").one("click"function() {
                  
alert("이미지는 클릭하지 마세요. 두 번 말하지 않습니다");
              
});
          
});         
    
</script>
</head>
<body>
  
  <div id
="Mt">
    <img id
="MtSnow" src="resource/snowMt.png" />
  </div>
  <input type
="button" id="MyBtn" value="내 버튼" />
 
</body>
</html>
소스에서는 앞서 설명했던 메서드들 중 bind 메서드를 사용하고 있으며, 제가 아끼는 애메서드(홋! 명칭이 므흣하네)인 one을 실습해 보고 있습니다. 버튼의 클릭 이벤트는 앞서 설명했던 코드와 동일하기에 굳이 재설명할 필요가 없어보이고요. 이미지의 클릭 이벤트는 나름 개그로 한껏 멋을 부려 보았습니다. 개그 포인트는 “두번 말하지 않습니다” 이죠!!! 저 클릭 이벤트는 오직 한번만 실행될테니까요. 우핫핫!! 소스가 어떻게 동작할 것인지는 충분히 예상될 것 같은데요. 그 예상을 머리속에 그리시면서 결과 화면을 보시죠!!!
각각의 결과 화면은 이미지를 클릭했을 때와 버튼을 클릭했을 때의 결과입니다. 차이가 있다면, 버튼은 클릭할 때마다 메시지박스가 뜨는 반면, 이미지는 처음 클릭한 경우에만 메시지박스가 뜨고 그 이후에는 이미지를 아무리 클릭해도 반응이 없다는 것입니다. 바로 one의 위대함입니다. The One!!!(은근히, 드원 테크놀로지 광고까지 해주는군요!) 여러분도 몸소 체험학습을 해보시기 바랍니다.
이제 이렇게 이벤트를 바인드할 수 있다는 사실은 확실히 이해하셨을 겁니다.
하지만!!
분명히 속으로 이렇게 생각하고 계시죠? 불편해!!!! 라고!!
그렇습니다. bind가 뭡니까! bind가! 뭔가 좀 직관적이지 않다는 생각이 들 겁니다. 딴 언어에서는 클릭 이벤트는 click이라고 쓰면 되는데, jQuery는 뭔 bind("click"..) 이딴 식이야!! 이건 좀 별론데! 불편해!! 라고 생각하고 계시죠? 솔직히 말씀해 보세요~
그렇습니다. 불편합니다. jQuery 개발자들도 그것을 설마 모르겠습니까? 해서, jQuery는 여러분이 좀 더 직관적으로 이벤트 매핑을 할 수 있도록, 자주 사용하는 이벤트들에 대해 각각 특별한 이벤트 도우미를 제공하고 있습니다. 전체 목록은 http://docs.jquery.com/Events의 하단에서 확인하시기 바랍니다. 확인하기가 귀찮다면, 그냥 여러분이 애용하는 대부분의 이벤트에 대해 도우미가 제공된다고 생각하셔도 됩니다. 예를 들면, click, mouseover, focus 등등 여러분이 익히 알고 있는 이벤트 명칭과 동일한 메서드가 제공된다는 것입니다. 다만, 특이하게 dblclick 이벤트라는 것도 추가적으로 제공된다는 것은 기억할 필요가 있습니다. 그렇기에, 예를 들어보자면 앞선 예제의 이미지 클릭 이벤트는 다음과 같이 작성하실 수도 있습니다.
$("#MtSnow").click(function() {
   
alert("...");});
그리고, 이벤트를 트리거 하려면 trigger() 메서드를 사용할 필요없이 $("#MtSnow").click(); 이라고 호출하면 됩니다. 인자 없이 메서드를 호출하면 이것은 트리거의 역할을 하는 것이죠.
호오. 그렇습니다. 이런게 바로 우리가 원하는 방식입니다. 사실, 실무에서도 bind 메서드를 사용해서 이벤트 매핑을 지정하기 보다는 이러한 이벤트 도우미 메서드를 사용해서 매핑을 하는 편입니다. bind 메서드를 사용하는 것은 실제 코드에서는 거의 찾아보기가 힘들 정도입니다(잘 사용하지도 않는 것을 앞에서 왜 그리 열내서 설명한거야! 라고 불평하실 수도 있겠지만, 기초는 중요한겁니다!!!)
오홋홋! 다만, 이렇게 이벤트 도우미 메서드를 사용하는 경우에는 추가 데이터를 지정할 수가 없습니다. 즉, bind 메서드의 두번째 인자였던 data 인자(이벤트 메서드에게 추가적으로 전달할 데이터)를 사용할 수 없다는 것이죠. 하지만, 그렇다해도 큰 문제는 없습니다. 클로저(Closure)를 사용하면 이벤트 메서드 내부에서 바깥 쪽의 지역 변수에 접근할 수가 있으니까요.
클로저가 무엇인지를 지금 설명드리기에는 적절하지 않아 보이기에, 이에 대해서는 나중에 따로 설명을 드리도록 하겠습니다.
자. 그럼 몇몇 이벤트 도우미를 사용해보는 예제를 한번 다루어보도록 합시다.
<html>
<head runat
="server">
    <title></title>
    <script src
="jquery-1.3.2.min.js" type="text/javascript"></script>
      <script type
="text/javascript">
          $(
function() {
              $("#Photo img").attr("src1", function() {
                  return this.src;
                
})
                .mouseout(
function() {
                    
this.src = this.src1;
                
})
                .mouseover(
function() {
                    
this.src = this.src2;
                
})
                .dblclick(
function() {
                    $(
this).hide();
                
});
          
});
    
</script>
</head>
<body>
  
  <div id
="Photo">
    
<img id="img1" src="resource/SEA12.png" src2="resource/SEA13.png" />
    <img id="Img2" src="resource/SEA13.png" src2="resource/SEA14.png" />
    <img id
="Img3" src="resource/SEA14.png" src2="resource/SEA15.png" />
  </div> 
</body>
</html>
어려운 소스는 아닙니다만, 약간의 기교가 들어가있는 코드임을 눈치채실 수 있으시죠? 이게 뭐가 '기교'라는 거얏! 이라고 성질 부리지는 마십시오. 이 문장에서 중요한 단어는 “기교”가 아니라 고 앞에 있는 “약간의” 입니다. '약간의 기교' 우핫핫~~~
일단, 이 페이지는 여러 개의 이미지를 가지고 있는데요. 각 이미지에는 src2라는 사용자 정의 어트리튜트가 지정되어 있는 것을 볼 수 있습니다. 사실 어트리뷰트의 명명 센스는 좀 구리긴 하지만, 어쨌든 그 어트리뷰트의 용도는 마우스가 이미지 위로 올라올 경우에 바꿔 보여지게 할 이미지 경로를 위한 것입니다.
자. 이제 jQuery 소스를 보도록 합시다. 소스에서는 이전 강좌에서 배운 attr 메서드를 사용해서 셀렉트된 각각의 이미지 요소에 대해 사용자 정의 어트리뷰트인 src1을 지정하고 있습니다. 이는 원본 이미지의 경로를 저장해놓기 위한 것인데요. 만일, 이 코드를 사용하지 않는다면, 각각의 이미지 태그들은 원본 이미지 경로를 위해서 다음과 같이 작성되었어야 할 것입니다.
<img id="img1" src="resource/SEA12.png"
     src1
="resource/SEA12.png" src2="resource/SEA13.png" />

강조하지만, 저는 사용자 정의 어트리뷰트의 사용을 권장하지는 않습니다. 이것은 어디까지나 예일 뿐이니까요.
설명이 빠르고 간결하면서도 친절하니깐 이해가 쉽고 확실하게 되시죠? 그러면, 계속해서 코드를 볼까요? 이어지는 코드는 3 가지의 이벤트 처리기를 지정하고 있습니다. mouseout, mouseover, dblclick 이 그것이죠. 또한, 이들을 멋지게도 메서드 체인을 사용해서 한방에 주욱 걸어주고 있습니다. 각각의 이벤트 처리기의 역할은 코드만 봐도 쉽게 이해가 될 정도로 간단합니다. mouseout인 경우에는 해당 이미지가 원래의 이미지를 보여주도록 설정하고, mouseover인 경우에는 대체 이미지(src2)를 보여주도록 설정하고 있습니다. 즉, 마우스가 이미지 위로 올라오고 나감에 따라 이미지가 바뀌어 보인다는 것입니다. 그리고, 따블클릭 시에는 해당 이미지를 눈에 보이지 않게 숨겨버리고 있죠. hide() 메서드는 일종의 애니메이션 메서드인데 이름만으로도 뭐하는 메서드인지 화끈하게 감이 오시겠지만 구체적인 설명은 추후 "애니메이션" 강좌에서 드리도록 하겠습니다. 지금은 대상 개체를 숨겨버리는 역할(즉, display:none)을 한다고만 알아두시면 되겠습니다.
이 얼마나 적절한 조화를 이루는 예제입니까? 이전 강좌를 복습까지 시켜주는 센스란!! 아아~
자. 그렇다면 결과 화면을 확인해 보도록 해요.
위의 결과 화면은 3 개의 이미지 중 하나를 더블클릭을 해서 사라지게 한 상태이고요. 오른쪽 이미지에 마우스를 올려서 원래의 이미지가 아닌 대체 이미지가 나오고 있는 상황입니다. 얼핏 보기엔 그냥 이미지 2개를 올려둔 것처럼 보이시겠지만 그렇지 않아욧!
여러분도 직접 예제를 작성하고 해보시길 권해봅니다. 그러면, 예상대로 동작하는 것을 확인하실 수 있을 것입니다. 괜찮다~~~
여기까지의 설명으로 jQuery 이벤트에 관한 70% 이상의 이야기를 드린 것 같네요. 아직 약간의 재미난 이벤트가 남아있긴 하지만 말이죠. 남아있는 이벤트는 hover, toggle, live 등인데요. 원래는 이번 강좌에서 이벤트에 대한 모든 이야기를 다 하려고 했었습니다만, 예상했던 것보다 강좌가 너무 길어져 버렸어요. 해서, 한번 끊어가도록 하겠습니다. 이해해 주실거죠?? 잇힝~

authored by Taeyo

Tuesday, November 22, 2011

yii gii

1. First, modify main.php in protected/config
    Uncomment the gii part

1-1. urlManager
    Uncomment the urlManager part in main.php
    That will enable the url to be user-friendly as shown below

2. Browse to gii
    http://localhost/yii/index.php/gii


3. Select Model Generator
    And enter a table name (like Employee), and preview and generate it
    Do the work for as many DB Tables as there should be
    New files will be created in protected/models
    (like protected/models/Employee.php, protected/models/Department.php)


4. CRUD Generator
   (CRUD stands for Create, Retrieve, Update, Delete)

    Do the same for Employee and Department as in the Model Generator
    New controllers will be created in protected/controllers
    (like protected/controllers/EmployeeController.php, protected/controllers/DepartmentController.php)
    And new view directories will be created in protected/views
    (like protected/views/employee/, protected/views/department)



5. See how the webapp changed
    Log out of the gii, and select webap in the menu on the top
    Web-browse to http://localhost/yii/index.php/employee
    Nothing can be done without using password (default is admin/admin)









yii

Site: http://www.yiiframework.com/

Tutorial for starters: http://www.larryullman.com/series/learning-the-yii-framework/

1. Download and test

    Make a directory (like yii) under the web root directory (like j:\vhosts\yii)
    Copy the directories of framework and reqirements into it (like j:\vhosts\yii\framework, j:\vhosts\yii\requirements)

    For testing, Web-browse to the requirements directory like http://localhost/yii/requirements

2. Install

    Make a directory (like yii) outside the web root directory (like j:\yii)
    and Copy all under the framework directory into it (like j:\yii\base\, j:\yii\caching, j:\yii\yiic.bat ...)

3. First webapp

    Go into the yii directory and run the batch script

    c:\wamp\bin\php\php5.3.5\php yiic webapp ..\vhosts\yii


    Web-broswse to the newly created webapp like http://localhost/yii

4. Configuration of main.php


<?php
// uncomment the following to define a path alias
// Yii::setPathOfAlias('local','path/to/local-folder');
// This is the main Web application configuration. Any writable
// CWebApplication properties can be configured here.
return array(
'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..',
'defaultController' => 'login',
'name'=>'My Web Application',
// preloading 'log' component
'preload'=>array('log'),
// autoloading model and component classes
'import'=>array(
'application.models.*',
'application.components.*',
),
'modules'=>array(
// uncomment the following to enable the Gii tool
// /*
'gii'=>array(
'class'=>'system.gii.GiiModule',
'password'=>'Enter Your Password Here',
// If removed, Gii defaults to localhost only. Edit carefully to taste.
'ipFilters'=>array('127.0.0.1','::1'),
),
// */
),
// application components
'components'=>array(
'user'=>array(
// enable cookie-based authentication
'allowAutoLogin'=>true,
),
// uncomment the following to enable URLs in path-format
// /*
'urlManager'=>array(
'urlFormat'=>'path',
'rules'=>array(
'<controller:\w+>/<id:\d+>'=>'<controller>/view',
'<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
'<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
),
),
// */
/*
'db'=>array(
'connectionString' => 'sqlite:'.dirname(__FILE__).'/../data/testdrive.db',
),
*/
// uncomment the following to use a MySQL database
// /*
'db'=>array(
'connectionString' => 'mysql:host=localhost;dbname=tzang',
'emulatePrepare' => true,
'username' => 'abcdefghij',
'password' => 'abcdefghij',
'charset' => 'utf8',
),
// */
'errorHandler'=>array(
// use 'site/error' action to display errors
           'errorAction'=>'site/error',
       ),
'log'=>array(
'class'=>'CLogRouter',
'routes'=>array(
array(
'class'=>'CFileLogRoute',
'levels'=>'error, warning',
),
// uncomment the following to show log messages on web pages
// /*
array(
'class'=>'CWebLogRoute',
),
// */
),
),
),
// application-level parameters that can be accessed
// using Yii::app()->params['paramName']
'params'=>array(
// this is used in contact page
'adminEmail'=>'arbago@gmail.com',
),
);

CodeIgniter + Chrome

http://www.chromephp.com/

1. Download the Chrome Extension
    https://chrome.google.com/webstore/detail/noaneddfkdjfnfdakjjmocngnfkfehhd

    Visit the site and just click Add to Chrome button to get it installed

2. Download the Class
    https://github.com/ccampbell/chromephp

    Download the the class "ChromePhp.php" and copy it into applicaiton/libraries

3. Usage

include 'ChromePhp.php';
ChromePhp::log('hello world');
ChromePhp::log($_SERVER);

// using labels
foreach ($_SERVER as $key => $value)
{
ChromePhp::log($key, $value)
}

// warnings and errors
ChromePhp::warn('this is a warning');
ChromePhp::error('this is an error');


Monday, November 7, 2011

배엽 derms

출처 copied and modified from http://www.bodymania.co.kr/detail.php?number=2594&thread=22r04

현재, 배엽을 잘못 인식하고 계신분들이 너무나 많습니다.
마치, 특정배엽을 타고나서 그에맞는 운동방법이 있다고 착각 하시는 분들이 거의 대부분 이지만 사실은 그렇지 않습니다.
먼저 배엽이란게 무엇인지를 알아보겠습니다.
배엽이란것은, 정자와 난자가 만나서 수정을 하여 수정란이 되면, 그때부터 여러단계를 거쳐서 세포분열을 거듭한결과 나타나는 3 개의 세포층을 말하는 것입니다.
이런 3 개의 세포층을 내배엽, 외배엽, 중배엽 이라고 하고, 각각의 배엽에서 일정한 기관이 만들어지는 것입니다.
사람같은 다세포  동물은 발생초기에 3 배엽이 형성된다고 배우셨 을 것입니다.
이것을 바탕으로 하여,미국의 셀든이라는 학자는 배엽 기원설을 주장했습니다.
사람의 체질구조는 출생전에 어느정도 결정이 되어, 체형은 6 세때 결정된다 라고 하였고, 내배엽을 내장긴장형 이라고 칭하여, 내장이 발달하여 복부가 흉부 보다 크고 사지가 짧고 끝이 뽀족하여 어깨는 수평이 되며 얼굴은 넓다 라고 했습니다.
중배엽은, 신체긴장형 이라고하여, 근육의 발달을 의미했구요, 외배엽은, 두뇌긴장형 이라고 하여, 신체표면에 있는 감각기관, 즉, 신경계통이 발달하여, 홀쭉하고 허약한 체질로 구분을 했습니다.
즉, 외배엽 이라는, 가장 바깥쪽의 세포층에서는, 피부나, 뇌, 유방, 땀샘이 만들어 지고, 내배엽 이라는 가장 안쪽의 세포층에서는, 소화기관 등의 내장기관이 만들어 지며, 중간에 위치한 세포층인 중배엽 에서는, 섬유조직, 연골, 뼈, 근육, 지방 등이 분화되어 만들어 지는 것입니다.
이러한 각부분의 배엽을 강조한것이, 체형의 분류라 할수있습니다 여기서 중요한것은, 각각의 배엽에 있어서 특정한 운동방법을 말한것이 아니라는 점입니다.
이것을 이용하여 현대에 와서 누군가가 배엽에 맞게 운동법이 있다고 하지만, 그것은 잘못된 거고, 몸의 발달정도에 따라서 자신에게 맞는 트레이닝법이 있다는것으로 해석을 해야할거 같 군요.
외배엽의 운동법을 소개한것을 보면, 고중량 저반복이 대부분인데, 이제 갓 운동을 시작한 초심자가 고중량 저반복을 하게되면 부상의 위험만 있을뿐이지, 운동은 제대로 되지를 않는것입니다.
웨이트도 기술이 있어야 합니다.
이런 기술의 부단히 연습한 결과로 인해서 보디빌더가 탄생을 하는것이고, 몸짱이 만들어 집니다.
자신의 체형이 어떻다는것은, 운동전에는 절대로 알지를 못합니다 운동도 안해보고 내가 무슨 배엽인지를 어떻게 알수 있을까요? 배엽 이란것은 타고나긴 하지만 살아가는 동안에 온갖 습관에 의해서 덮혀버리고 베일에 가져지게 되는 겁니다.
어떤 영업맨이 자동차 한대를 팔기 위해서 본래는 성질 더러웠지만 팔기 위해서 나긋나긋 바뀌게되고 이게 생활화 되니 내가 언제 승질 더러벘냐는것을 까맣게 잊게 되는 겁니다.
이 인간이 정말 성질 더러웠다는것을 알기 위해선 옆에서 계속 약을 올려봐야만 아는 것입니다.
이미 오랜세월 나긋나긋함이 몸에 배였기 때문에 대충 약을 올려선 그 잘난 성질 안나옵니 다.
지속적으로 계속 꾸준히 열받을때 까지 약을 올려야 진정 디립다 더러번 승질을 볼수가 있는 거예요..
이런 원리가 바로 운동에 있어서 체형 이라는 것입니다.
운동 이라는 약올리기가 없으면 내 체형을 미리 알수는 없는 거예요..
이게 한두달에 되는게 아니라 적어도 1년 이상은 해봐야 알게되는 것이고..
운동을 1 ~ 2 년 해보았을때, 자신의 근육이 발달되는 상황에 따라서 알게됩니다.
그때, 고중량 저반복, 저중량 고반복 등을 참고만 하시면 되는 것입니다.
미리부터 체형을 알고 체형에 맞게 운동하는 모순적인 행동을 해서는 안되겠습니다.
따라서, 위의 설명들을 고려할때, "나는 외배엽 이다" 라는 말은, "나는 세포층 중에 가장 바깥쪽에 위치한 세포층 이다" 라는 말과 다를게 없는것이고, 운동방법과는 전혀 무관함을 아셔야 하겠습니다.
단지, 몸의 발달정도에 따라서, 트레이닝 방법만 변할뿐입니다.
무겁게 몇개만 해도 된다는 경험을, 오랜기간 운동을 하면서 터득을 하였다면, 굳이 많은갯수로 운동을 할 필요는 없을것입니다 이럴때, 나의 체형이 근육발달형인 중배엽 이구나 라고 생각을 하셔야 합니다.
이렇더라도, 각각의 트레이닝의 방법을 모두 대입 시켜야만 좋은 몸이 탄생하는 진리는 변하지 않습니다.
근육은 타성에 잘 젖습니다.
따라서, 변화를 주는 트레이닝이 없으면 근육은 길들어져서 더 이 상 발달하지 않는 단계에 이릅니다.
이것을 정체기라 하죠? 이런 정체기는, 외배엽, 중배엽, 내배엽 할거없이 모든 사람에게 다 오게 마련입니다.
즉, 변화없는 트레이닝은 근육의 발달을 더디게 하므로, 항상 변화를 추구해야 할것이니, 이럴때 체형의 구분은 아무런 의미가 없다는것입니다.
외배엽이 운동을 해서 중배엽으로 변하는 일은 없습니다.
단지, 외배엽이 운동을 열심히 하면, 몸이 좋아지는것뿐 입니다.
이미 세포층이 그렇게 분화가 끝나서 각각의 기관으로 변했는데 운동을 한다고 어떻게 바뀌겠습니까? 자신이 가장 발달된 세포층을 알기위해서는, 운동에 익숙할만큼 운동을 해봐야만 판단이 내려집니다.
잘못된 식생활로 인해서 뚱뚱하기만 한 어떤사람을, 뚱뚱하다고 내배엽 이라고 한다면, 너무 경솔한 판단을 내리게 되는 것입니다.
이 뚱뚱한 사람을, 운동을 시켜보면, 지방이 빠지고 원래의 자신의 모습이 나타나게 되는 것입니다.
외배엽이 될수도 있고 중배엽일수도 있는것입니다.
운동에 익숙하기 전에는 자신이 타고난 배엽을 알길이 없습니다.
또, 알게된다 하더라도, 트레이닝의 기본이 변해서 대입이 되어서는, 효과를 보지 못합니다 트레이닝의 기본인 점진적과부하 라는것은, 내배엽, 중배엽, 외배엽을 막론하고 모든 운동하는 사람들이 항상 추구해야할 운동의 변화이기 때문에, 외배엽 이라고 해서 고중량 저반복이 항상 점진적과부하는 될수가 없는것이고, 저중량 고반복이 외배엽 에게 점진적과부하가 될때도 많은것입니다 이러한 트레이닝의 기본원칙은 어떤 배엽에서도 항상 존재가치가 충분한것입니다.
끝으로 운동초심자 분들께 당부드리고 싶은말은, 자신의 배엽을, 운동도 시작하기전에 결정해 버리는 분들이 많은데, 이는 매우 어리석은 행동을 하는것임을 말씀드리구요, 초심자에게는 기본이 되는 운동법 만이 존재할뿐, 배엽이란것은 생각할 필요도 없는것임을 알려드립니다.
운동을 시작하기도 전에, 자신에게 맞는 트레이닝법을 정하고 보충제를 주문하는것은, 복권에 당첨되기를 바라며 복권을 사서, 돈을빌려 집사고, 자동차사고, 땅사고 등등........마구사고....
빌린돈은, "당첨금으로 갚아야지" 하는 계획과도 같습니다.
체형별 운동법이 따로 있다기 보다는, 단계별 운동법이 따로있다고 이해를 하셔야 하고, 그 단계에서 근육발달이 남보다 더 잘된다고 인지가 되면, 나는 중배엽형 인간이구나 라고 참고만 하시면 되겠습니다.
타고난 배엽은 변하지 않습니다.
------------------------------------------------------------------
체형의 구분은, 미국의 셀든 이라는 사람이 배엽기원설을 주장 하면서 생겨 났습니다 .
그러나, 배엽기원설에는 운동을 체형에 맞게 해야 한다는 말은 없어요 .
단지, 수정란이 분화하면서, 3 개의 세포층이 생겨는데, 이것을 배엽 이라 고 하고, 이름을, 내배엽, 중배엽, 외배엽, 이라고 하며, 각각의 배엽에서, 우리몸의 기관을, 서로 다르게 만들기 때문에 내배엽 에서 하는일은, 소화기관 등을 만들어서, 뚱뚱한 체형 중배엽 에서 하는일은, 근육등을 만들기 때문에, 근육형 체형 외배엽에서 하는일은, 피부등을 만들기 때문에, 마른체형 이라고 분류해 놓은것 뿐입니다 .
즉, 운동을 시작하는 사람이, 자신의 몸이 뚱뚱해서 뚱뚱한 사람이 해야할 운동이 따로 있다는 것이 아니라, 내배엽이 만들어내는 것이 소화기관 등이기 때문에 뚱뚱한 체형으로 분류만 한것입니다 .
따라서, 운동은 이 세배엽을 가진 모든 사람은, 첨 초심자 때는, 모두 같은 방식에 의해서 운동이 시행되어야 하겠 습니다 .
그것은, 기본이 되는 운동은, 체형이 아무리 달라도, 틀려져서는 안되기 때문 이랍니다 .
기본은 모두에게 똑같이 적용되어야 하는, 가장 기초적인 것들을 말하는 것입니다 .
또래보다 머리가 좋아서 일찍부터 영재교육을 받는 학생들이 있습니다 .
그렇다고 이런 영재들이 덧셈과 뻴셈 곱하기 나누기 등의 기초적인 산수공부를 하지 않고, 영재반에 있는것이 아니죠 ? 단지, 익히는 속도가 빨라서, 진도를 빨리 나가는것 뿐입니다, 달리말하면, 배워야 할것을 배우지 않고 건너뛰는것이 아니라, 빨리 배우니, 초등학교 과정 6 년, 중학교 3 년, 고등학교 3 년 등의 햇수가 줄어드는 것이겠죠 ? 보디빌딩 에서도 마찬가지 입니다 .
초심자는 초심자일뿐,  달리 특별하게 배워야할 어떤부분도 없습니다 .
기본이 되는 운동을 열심히 반복훈련만 하는것이 초심자에게 남아있는 과제가 됩니다 .
그렇게 기본적인 훈련을 실시하다보면, 영재가 나옵니다 .
그 체형이 바로 중배엽 이죠 ? 이런 중배엽은, 말씀드렸듯이 따로 중배엽 만의 운동법이 존재하 는것이 아니라, 일찍 모든과정을 빨리 마치기 때문에, 딴 체형 보다 더 많은 운동동작등을 숙지해 놓음으로 인해서, 자연히, 딴 체형보다 몸이 더 좋아져 있는 것입니다 .
이런 체형의 구분은, 자신의 몸에서 근육이 생겨나고 적어도, 경력 2 년 ~ 3 년 정도가 되었을때 자신의 근육발달 속도에 따라서 미리 앞지르는 학습을 할수도 있을것이고, 잘되지 않아서 복습을 많이하는 경우가 생길테니, 이때 구분을 해볼필요가 있습니다.
지금은 아무것도 생겨나지 않았고, 아무것도 하지 않은 초심자때 입니다 .
이때는, 기본기에 충실한 많은 반복횟수와 많은 세트를 함으로써 자신의 운동신경을 발달시키는데 노력을 해야만 하겠습니다 .
이런 의미에서 본다면, 초심자에게 체형을 알려주고 그 체형에 맞게 운동을 시킨다는 자체는 완전히 모순이라고 할수 있습니다 .
외배엽의 운동방법에 있어서,고중량 저반복을 권하지만, 외배엽도 초보자 입니다, 중배엽도 초보자 입니다, 모두가 다 초보일때, 고중량은 할래야 할수가 없는 것이고, 저반복은, 스윙연습은 하지 않으면서 홈런만 칠려고 하는 시건방 진 야구선수가 하는 하루 스윙연습 10 번에 그치는 운동방법이 되 겠군요, 외배엽, 중배엽, 내배엽 모두 초심자때는 고반복이 기본 입니다 .
시간이 감에 따라서, 여전히 고반복을 해야할 부류가 있고, 고반복이 필요없는 부류가 생겨 납니다 .
10 살짜리 영재가 중학교 과정을 공부하는, 당연한 상황이죠 ? 이때, 고반복을 하지 않아도 근육발달이 남보다 잘된다고 확연히 느껴지고, 몸의 발달도 같이 시작한 딴 체형보다 많이 발달되어 있다면, 그때 비로소, "아하 ! 나의 체형은 중배엽 이구나 ! " 라고 하는것입니다 .
미리 정해놓고 시작하라고 한것이 체형의 구분이 아니란것을 말씀드렸습니다 .
모름지기 초심자는, 선택의 권한이 없고, 기본기를 익혀야만 하는 의무만 있답니다 .
-----------------------------------------------------------------

[재미 있는 사상 체질]

한의학, 그 중에서도 사상의학은 참으로 인간 개개인의 특성에 맞게, 약재를 비롯하여 각종 음식들의 처방을 손쉽게 해 준다.
이러한 사상의학의 사상체질은, 4 가지로 분류가되며, 각 체질의 특성을, 장기의 허와실 을 가림으로써, 병에 걸렸을때 적극 치료에 이용되는것이다.
먼저, 음과 양이 구분되는데, 음은 땅이고 물이며 차갑고 습하고 내성적인 성격을 말하며, 양은, 하늘이고, 불이며, 뜨겁고 건조하며, 외향적인 성격을 말한다.
알로에가 사막으로 간 이유는 ? 무슨 영하제목 같지만, 그  이유에 바로 사상의학이 들어있다.
모든것들이 다 사막에 살지는 않는다.
만약 자신이 차갑고, 물이 많아서 허구한날 축축하다면, 사막같은곳에 가고싶을것이다.
바로, 알로에 자신의 본성을 알수있는것이 알로에가 자라는곳을 보고 알수있는것이다.
이말은 듣고 알로에는 우리집에도 잘 커고 있는데 라고 한다면, 당신은 소음인일 가능성 이 매우 높다.
소음인의 특성이, 까탈스럽고 그냥 넘어가지 않으며 반드시 따져야만 하는 성격이기때문이다.
그래서 경리업무나 회계업무를 맡겨놓으면 잘한다.
아무튼, 이러한 자신의 특성이 어떤가에 따라서 자라는곳이 다 틀린다.
알로에는 차갑기때문에 뜨거운곳에서 자란다는것이 한의학이자 사상의학의 기본이 되는 것이다.
즉, 알로에는, 음적기질을 가진 음식이라 할수있다.
그렇다면, 알로에는 누가 먹어야 하는가? 만약 당신이 항상 몸에 열이많고 성격이 급하고, 방방뜨는 성격이라면, 알로에는 당신에게만 보약이 될것이다.
또, 당신 동생이 매사에 침착하며, 내성적이고 겨울을 싫어하는 음적인 체질이라면, 알로에는 독이될수도 있는것이다.
말했지만, 사상의학은 장기의 허와실을 보완하는 학문이다.
약한것은 강하게 만들고, 강한것은 약하게 만드는것이 아니라, 강해서 문제가 생기고, 약해서 문제가 생기므로, 약한것이나, 강한것을 모두 끌어올리거나, 끌어내려서, 정상궤도에 가져다 놓는것이 사상의학이다.
알로에와는 반대로, 응달이고, 습한데 자라는것이 인삼이다.
즉, 인삼 자신은 너무나도 뜨겁고 건조하기 때문에 본능적으로 차갑고 습한곳을 찾게 된다.
아까 당신의 동생이 먹어야하는것은 바로 이런 인삼이 되는 것이다.
돼지고기는 냉한음식이라고 한다, 돼지는 평생을 살아도 하늘을 쳐다보는법이 없을정도로 매일 땅만보고 살며, 급한법이 없다, 죽을때 멱따는 소리내며 급해하는것 외에는 항상 느긋하다.
사람으로 치자면 내성적인 음인이라 할수있다.
냉한음식이기때문에, 육식중에는 돼지고기가 제일 소화가 잘 되지를 않는다.
이런 돼지고기의 최상의 궁합을 찾는다면, 아마도 양적기질을 가진 무언가가 될것이다 이러한 이유로 인해서, 돼지고기를 먹을때 새우가 등장하게 되는것이다.
새우야 말로 그 움직임이 째빠르기 때문에 양적인 음식임에는 틀림이 없다.
냉한음식인 돼지고기와 열을내는 음식인 새우의 만남이, 환상적인 음식궁합이 되는것도 한의학이라 할수있다.
어떤 소양인의 체질을 가진 수유부가, 시어머니께서 해주신 가물치를 먹고 젖이 나오질 않았다.
이럴때 사상의학에서는, 이렇게 판단한다.
양적인 기질을 가진 수유부가, 가물치처럼 양적인 음식을 먹으니, 그렇지않아도 열이 많은데, 거기에다가 열이많은 가물치를 먹어니, 열에다가 또열을 가해서 이상이 생겼다.
라고 말이다.
그 처방은 돼지족발 이었다.
돼지자체가 냉하고 기운이 내려가는 음식이고, 그 중에서도 가장낮은위치에 있는 족발을 먹게함으로써, 열을 내리고 정상적인 수유가 가능하게 했다는 내용이다.
우유는 소젖이다.
소는 전진만을 할수있다.
이런 소는 양적기질을 가지고 있기 때문에, 우유가 제일 잘 맞는 사람은, 음인이라 할수있겠다.
태양인은 간이 약하고 폐가 강하다.
따라서, 태양인의 평생보약은 모과가 된다.
태음인은 폐가 약하고 간이 강하다.
따라서, 태음인의 평생보약은 매실이 된다.
소양인은, 비장이 강하고, 신장이 약하다 따라서, 소양인의 평생보약은 구기자가 된다 소음인은, 신장이 강하고 위장이 약하다.
따라서, 소음인의 평생보약은 홍삼이 된다.
어떤 음식의 그자체의 음양을 알고, 자신의 체질을 잘 알아서 대입을 하면, 건강하게 살수있는데 많은 도움이될것이다.

Sunday, October 9, 2011

[MySQL] Data Type: int(5)


Numeric Type Attributes

MySQL supports an extension for optionally specifying the display width of integer data types in parentheses following the base keyword for the type. For example, INT(4) specifies an INT with a display width of four digits. This optional display width may be used by applications to display integer values having a width less than the width specified for the column by left-padding them with spaces. (That is, this width is present in the metadata returned with result sets. Whether it is used or not is up to the application.)

The display width does not constrain the range of values that can be stored in the column. Nor does it prevent values wider than the column display width from being displayed correctly. For example, a column specified asSMALLINT(3) has the usual SMALLINT range of -32768 to 32767, and values outside the range permitted by three digits are displayed in full using more than three digits.

When used in conjunction with the optional (nonstandard) attribute ZEROFILL, the default padding of spaces is replaced with zeros. For example, for a column declared as INT(4) ZEROFILL, a value of 5 is retrieved as 0005.

Note

The ZEROFILL attribute is ignored when a column is involved in expressions or UNION queries.

If you store values larger than the display width in an integer column that has the ZEROFILL attribute, you may experience problems when MySQL generates temporary tables for some complicated joins. In these cases, MySQL assumes that the data values fit within the column display width.

All integer types can have an optional (nonstandard) attribute UNSIGNED. Unsigned type can be used to permit only nonnegative numbers in a column or when you need a larger upper numeric range for the column. For example, if an INT column is UNSIGNED, the size of the column's range is the same but its endpoints shift from -2147483648 and 2147483647 up to 0 and 4294967295.

Floating-point and fixed-point types also can be UNSIGNED. As with integer types, this attribute prevents negative values from being stored in the column. Unlike the integer types, the upper range of column values remains the same.

If you specify ZEROFILL for a numeric column, MySQL automatically adds the UNSIGNED attribute to the column.

Integer or floating-point data types can have the additional attribute AUTO_INCREMENT. When you insert a value ofNULL (recommended) or 0 into an indexed AUTO_INCREMENT column, the column is set to the next sequence value. Typically this is value+1, where value is the largest value for the column currently in the table.AUTO_INCREMENT sequences begin with 1.