Friday, January 27, 2012

Radio Me la Sudas

Quite a bunch of not-so-easy-to-get classical (sometimes non-classical) music albums are allowed to be downloaded free

http://radiomelasudas-beaumarchais.blogspot.com/

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',
),
);