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