<<gradient horiz #bbbbbb #eeeeee #ffffff>>The new GradientMacro allows simple horizontal and vertical coloured gradients. They are constructed from coloured HTML elements, and don't require any images to work.>>\nThe GradientMacro is an ExtendedMacro that processes the text after it up until the next '>>' sequence. It looks like this:\n{{{\n<<gradient vert #ffffff #ffdddd #ff8888>>gradient fill>>\n}}}\nThe first parameter can be ''vert'' or ''horiz'' to indicate the direction of the gradient. The following parameters are two or more colours (CSS RGB(r,g,b) format is also acceptable). The GradientMacro constructs a smooth linear gradient between each of the colours in turn.\n\n| <<gradient vert #ffffff #ffdddd #ff8888>>No images were harmed in the making of this gradient fill>> | <<gradient vert #ffffff #ddffdd #88ff88>>No images were harmed in the making of this gradient fill>> | <<gradient vert #ffffff #ddddff #8888ff>>No images were harmed in the making of this gradient fill>> |\n\nInline CSS definitions can be added to gradient fills like this:\n\n<<gradient vert #000000 #660000 #aa2222>>color:#ffffff;font-size:12pt;Darkness>>\n{{{\n<<gradient vert #000000 #660000 #aa2222>>color:#ffffff;font-size:12pt;Darkness>>\n}}}\n\nYou can make an abrupt transition in the gradient by using the "snap" prefix, like this:\n\n{{{\n<<gradient vert #000000 #999999 snap:#aa2222 #ff444>>color:#ffffff;font-size:24pt;padding:4pt;More darkness>>\n}}}\n<<gradient vert #000000 #999999 snap:#aa2222 #ff444>>color:#ffffff;font-size:24pt;padding:4pt;More darkness>>
@@color(#04f): PPU @@(물리연산 프로세스 유닛) ; CPU가 담당하는 이미지 재생과 관련된 물리 연산을 전담하는 주변기기\n\n아수스코리아와 이엠텍은 2006.05 말 물리연산카드를 국내에 출시하며 2∼3곳의 업체가 판매를 준비중이다. 아수스가 출시할 ‘PhysX P1 고스트리콘’은 에이지아(AGEIA) 칩세트를 장착한 제품으로 기존 ‘CPU+GPU’ 게임프로세싱 처리 개념을 ‘CPU+GPU+PPU’로 확대한 카드. 이엠텍은 기존 PCI슬롯에 장착, 애드온 방식으로 3D게임을 현실감 있게 즐길 수 있는 BFG 물리 엔진 가속카드를 판매한다.\n\n이와 함께 ‘언리얼 토너먼트 2007’ ‘셀팩터’ ‘고스트리콘’ 등 국내외 유명 게임도 물리연산을 지원할 예정이어서, PPU가 그래픽카드에 이은 새 주변기기로 떠오른 상황이다. 아수스에 따르면 연내 물리연산카드를 지원하기로 한 PC용 게임은 5월 현재 10여 종에 달한다.
@@color(#04f): protected와 private의 차이 @@\npublic으로 선언된 멤버 변수와 함수는 클래서 내부와 외부에서 사용할 수 있지만, \n클래스에서 선언된 protected로 선언된 것은 파생 클래스의 내부에서 사용할 수 있다. 기반 클래스에서 private로 선언된 멤버는 파생 클래스에서 내부적으로 사용할 수 없으며, 기반 클래스에서 private으로 선언된 멤버는 파생 클래스로 상속은 되지만 파생 클래스에서 참조만 할 수 없다는 것이다.\n\n@@color(#04f): singleton @@; C++ 클래스 단일체(singleton)는 주어진 임의의 시점에서 시스템 내에 단 하나의 인스턴스만 존재하는 객체를 가리키며, 전역 객체로써 취급된다.\n\n@@color(#04f): traits @@(문자특성)\n특정 타입의 정보 혹은 그 타입의 연산에 대한 정보를 캡슐화한 일종의 객체로서, \n구체적인 이름 대신에 타입에 구애받지 않고 쓸 수 있는 대표 정보를 모아 둔 집합으로 생각하면 무난하다. \n예로, iterator_traits<T>::difference_type는 특정 타입의 객체에 대한 두 반복자의 차이를 나타내는 타입이다.\n
@@color(#04f): smart pointer@@; 세이프 포인터라고도 하는데 \n* 스마트포인터는 메모리 해제에 대한 프로그래머의 부담을 줄일수있는 일종의 한 방법으로, 스마트포인터 클래스는 객체에대한 포인터를 멤버로 갖고있으며 지역변수는 해당영역을 벗어나면 자동으로 소멸된다는 기초를 토대로 하고 있다.\n** 포인터를 선언하면 NULL로 초기화 하는 번거로움을 제어할 수 있다.\n** 포인터가 생성, 소멸, 복사, 대입, 역참조 등의 동작을 제어할 수 있다.\n** 블록을 빠져 나올때 지역변수처럼 자동으로 해제를 하게 해 준다.\n등의 장점이 있으나, 구현방식에 따라 제한사항이 있을 수 있어 주의해야한다.\n
@@color(#04f): ▣ Waterfall(폭포) 모델 @@; 다음 단계의 코딩을 시작하기 전에 그 전의 모든 단계의 코드를 확정지어버리는 방식\n\n@@color(#04f): ▣ Wi-Fi(와이파이) @@ ; Wireless Fidelity\n홈 네트워킹, 휴대전화, 비디오 게임 등에 쓰이는 유명한 무선 기술의 상표 이름\n\n@@color(#04f): ▣ Wii MotionPlus @@;\nMotionPlus는 가속기와 센서 바가 결합된 Wii용 무선 컨트롤러의 최종 버전으로, 게이머의 팔 위치와 방향에 따른 궤도를 인식해 보다 현실감을 높여줄 것으로 기대를 모으고 있음\n -. 2009년 06월 현재 사용되고 있는 Wii 컨트롤러는 게이머의 움직임이 게임 내 캐릭터와 일치하지 않는 문제점이 있는데, MotionPlus를 통해 정확도가 대폭 개선될 것이라 기대됨\n -. MotionPlus 지원 타이틀은 SEGA의 'Virtua Tennis 2009'(5월 19일 발매), EA의 'Tiger Woods PGA Tour 10' (6월 16일 발매 예정), Nintendo의 'Wii Sports Resort' (6월 18일 발매 예정), EA의 'GrandSlam Tennis' (6월 18일 발매예정) 등으로 알려짐\n\n@@color(#04f): ▣ WPF @@; (Windows Presentation Foundation) @ 2010-01-06 @\n이전 코드네임 Avalon, 이전의 WinFx라 불리던 .Net Framework 3.0이상의 환경에서 동작하는 MS의 차세대 그래픽 표현 기술(Subsystem)\n\n@@color(#04f): ▣ w.r.t @@; the world (reference) coordinate \n\n@@color(#04f): ▣ WYSIWYG @@(위지윅, 보는 것이 얻는 것이다.); What you see is What you get.\n\n
@@color(#04f): VPN @@(Virtual Private Networking)\n
@@color(#04f): UML @@이란 무슨 언어인가요? - 텀즈 펌...(출처) http://www.terms.co.kr/ \n\nUML이란 소프트웨어 개발 과정에서 산출되는 산출물들을 명시, 개발, 문서화하기 위한 모델링 언어이다. UML은 Rational 사의 Grady Booch, James Rumbaugh에 의해 1994년 10월에 처음 개발에 착수되었다. 이후 1995년 10월에 Unified Method 0.8의 명칭으로 OOPSLA '95에서 발표되었으며, 이후 Ivar Jacobson이 UML 개발에 함께 협력하면서 1996년에 버전 0.9를 발표하였고, 1997년 11월에는 UML 1.1 이 OMG에 의해 표준으로 채택되었다. \n\nUML은 모델링 언어일뿐 메쏘드(또는 방법론)는 아니다. 메쏘드는 프로세스에 대한 정의와 각각의 업무들에 대한 지침과, 업무들 간의 순서들을 명시해야 하는 반면, 모델링 언어는 표기법(또는 다이어그램)들만을 제시하는 것이다. 따라서 UML은 소프트웨어 개발에 사용하기 위한 여러 다이어그램들을 정의하고 있으며, 또 다이어그램들의 의미들에 대해 정의하고 있다. \n\nUML은 여러가지 다이어그램들을 제시함으로써 소프트웨어 개발과정의 산출물들을 비주얼하게 제공하고, 개발자들과 고객 또는 개발자들 간의 의사소통을 원활하게 할 수 있도록 하고 있다. UML은 시스템을 모델링 할 수 있는 다양한 도구들을 제공하기 때문에, 도메인을 모델링하기가 훨씬 용이할 뿐만 아니라 모델링한 결과를 쉽게 파악할 수 있게 된다. 또한 산업계 표준으로 채택되었기 때문에 UML을 적용한 시스템은 신뢰성 있는 시스템으로 평가받을 수 있다. \n
@@color(#04f): ▣ Technical Director @@ 테크니컬 디렉터는 \n영화나 3D 애니메이션의 제작 과정에서 컴퓨터 그래픽스와 관련된 기술적 문제를 찾고 해결하는 전문가를 말한다. 기존에는 뚜렷한 구분되는 직종인 아티스트와 프로그래머의 역할을 동시에 하는 특징이 있는 새로운 직종 분야이다. 이 직종은 현재까지는 명확한 정의를 갖추어 나가는 상태이고 회사와 프로젝트 상황에 따라 직무가 다양한 경향이 있다.\n\n비슷한 직종인 그래픽 사이언티스트는 본인이 기술의 생산자로서 소프트웨어와 알고리즘을 통해 제작 과정의 문제를 해결하는 역할을 한다면 TD는 이미 주어진 기술에 대한 분석적 소비자로서 그것의 작동/적용 원리를 파악하여 이를 창조적으로 활용해서 문제를 해결하는 역할을 하고 나아가서 프로젝트의 성공을 이끈다. 따라서 테크니컬 디렉터는 세부 분야와 관련된 소프트웨어에 대한 해박한 지식과 경험이 필수적이다.\n\n@@color(#04f): ▣ TFT @@; Task Force Team\n회사에서 중요한 일, 새로운 일(프로젝트)을 추진할 때 각 부서 및 해당 부서에서 선발된 TASK에 관련된 인재들이 임시 팀을 만들어 활동하는 것을 말한다. 대기업은 TFT에 발탁되면 본인의 새로운 사무실에서 새로운 사람들과 그 일만 집중하다가 나중에 다시 본연의 임무로 돌아가던가 TFT을 정식 팀으로 승격시켜 전보 발령을 내는 경우도 있는데 중소기업은 일반 업무에 TFT업무가 부가되는 것이 보통이다.\n\n즉 task 목적을 가지고 그 목적을 추진하기 위해 임시로 모인 집단을 이야기할 때 쓰인다. 그 임무가 완수되면 곧바로 해체되는 집단으로 회사 등에서 많이 쓰이는 용어이다.\n\n@@color(#04f): ▣ TPND @@ (Theft, Pilferage and Non-Delivery) ; 도난, 발하, 불착손 위험 담보 @ 2015-12-24 @\n\n@@color(#04f): ▣ Texture Splatting @@\n\n@@color(#04f): ▣ Traitsingleton @@ @ 2022-06-01 @\n특정 타입의 정보 혹은 그 타입의 연산에 대한 정보를 캡슐화한 일종의 객체로서,\n구체적인 이름 대신에 타입에 구애받지 않고 쓸 수 있는 대표 정보를 모아 둔 집합으로 생각하면 무난하다.\n예로, iterator_traits<T>::difference_type는 특정 타입의 객체에 대한 두 반복자의 차이를 나타내는 타입이다.\n\n@@color(#04f): ▣ Traversal @@; 운행법 - ex. 이진 트리의 운행법(Traversal)\n\n@@color(#04f): ▣ Traversal behavior @@; 순회동작\n\n@@color(#04f): ▣ TSCC @@(TechSmith Screen Capture Codec Installation) - http://www.techsmith.com/\n TechSmith사에서 개발한 스크린 캡쳐용 코덱입니다.\n\n\n
/***\nTo use, add {{{[[TagglyTaggingStyles]]}}} to your StyleSheet tiddler, or you can just paste the CSS in directly. See also ViewTemplate, EditTemplate and TagglyTagging.\n***/\n/*{{{*/\n.tagglyTagged li.listTitle { display:none;}\n.tagglyTagged li { display: inline; font-size:90%; }\n.tagglyTagged ul { margin:0px; padding:0px; }\n.tagglyTagging { padding-top:0.5em; }\n.tagglyTagging li.listTitle { display:none;}\n.tagglyTagging ul { margin-top:0px; padding-top:0.5em; padding-left:2em; margin-bottom:0px; padding-bottom:0px; }\n\n/* .tagglyTagging .tghide { display:inline; } */\n\n.tagglyTagging { vertical-align: top; margin:0px; padding:0px; }\n.tagglyTagging table { margin:0px; padding:0px; }\n\n\n.tagglyTagging .button { display:none; margin-left:3px; margin-right:3px; }\n.tagglyTagging .button, .tagglyTagging .hidebutton { color:#aaa; font-size:90%; border:0px; padding-left:0.3em;padding-right:0.3em;}\n.tagglyTagging .button:hover, .hidebutton:hover { background:#eee; color:#888; }\n.selected .tagglyTagging .button { display:inline; }\n\n.tagglyTagging .hidebutton { color:white; } /* has to be there so it takes up space. tweak if you're not using a white tiddler bg */\n.selected .tagglyTagging .hidebutton { color:#aaa }\n\n.tagglyLabel { color:#aaa; font-size:90%; }\n\n.tagglyTagging ul {padding-top:0px; padding-bottom:0.5em; margin-left:1em; }\n.tagglyTagging ul ul {list-style-type:disc; margin-left:-1em;}\n.tagglyTagging ul ul li {margin-left:0.5em; }\n\n.editLabel { font-size:90%; padding-top:0.5em; }\n/*}}}*/\n
<!---\n| Name:|UpsideDownViewTemplate |\n| Purpose:|Stand on your head|\n--->\n<!--{{{-->\n<div class="tagglyTagging" macro="tagging"></div>\n<div style="background-image:url(../images/up.jpg);background-repeat:no-repeat;background-position:bottom right;" class='viewer' macro='view text wikified'></div>\n<div><span class='title' macro='view title'></span><span class="miniTag" macro="miniTag"></span></div>\n<div class="tagglyTagged" macro="tags"></div>\n<div class="toolbar">\n<span style="padding-right:0.75em;" class='fakeButton' macro="runMacroIfTagged Groceries toggleTag Buy"></span>\n<span style="padding-right:0.75em;" class='fakeButton' macro="runMacroIfTagged Flippable toggleTag UpsideDown"></span>\n<span style="padding-right:0.75em;" class='fakeButton' macro="runMacroIfTagged Plugins toggleTag systemConfig"></span>\n<span macro='toolbar -closeTiddler closeOthers +editTiddler permalink references jump newHere'></span></div>\n<br/>\n\n<!--}}}-->\n
@@color(#04f): 가치주 @@ = 현재 소외된 주식\n\ncf.성장주, "현명한 투자자" 벤저민 그레이엄 저\n• 시장 전망은 할 수 없다 -> 기업가치에 촛점\n• 단기 등락을 예측하는 것은 바보들의 짓이다.\n• 주식은 싸게 사서, 보유하는 것이다.\n
Tag popup:\n{{{\n<<tag features>>\n}}}\nwill result in <<tag features>>\n\nSlider:\n{{{\n<<slider chkTestSlider OptionsPanel options "Change TiddlyWiki advanced options">>\n}}}\nResults in this button <<slider chkTestSlider OptionsPanel options "Change TiddlyWiki advanced options">>\nThe parameters are:\n* cookie name to be used to save the state of the slider\n* name of the tiddler to include in the slider\n* title text of the slider\n* tooltip text of the slider\n\n----\nExtendedFormatting\n\nLike most wikis, TiddlyWiki supports a range of simplified character formatting:\n| !To get | !Type this |h\n| ''Bold'' | {{{''Bold''}}} |\n| --Strikethrough-- | {{{--Strikethrough--}}} |\n| __Underline__ | {{{__Underline__}}} (that's two underline characters) |\n| //Italic// | {{{//Italic//}}} |\n| Superscript: 2^^3^^=8 | {{{2^^3^^=8}}} |\n| Subscript: a~~ij~~ = -a~~ji~~ | {{{a~~ij~~ = -a~~ji~~}}} |\n| """plain//text""" | {{{"""plain//text"""}}} |\n| <nowiki>not__wikified</nowiki> | {{{<nowiki>not__wikified</nowiki>}}} |\n| @@highlight@@ | {{{@@highlight@@}}} |\n| ɸ™ | {{{ɸ™}}} |\n| This is hidden: | {{{This is hidden: /% secret comment %/}}} |\n|<html><blockquote>blockquote<blockquote>level two<blockquote>level three</blockquote></blockquote></blockquote></html> |{{{>blockquote}}}<br />{{{>>level two}}}<br />{{{>>>level three}}} |\n|<html><blockquote>multi-line<br/>blockquote</blockquote></html>|{{{<<<}}}<br />{{{multi-line}}}<br />{{{blockquote}}}<br />{{{<<<}}}|\n|<html><blockquote>foo<br><blockquote>inner foo, level 1<br><blockquote>inner foo, level 2<br></blockquote></blockquote>more foo<br></blockquote></html>|{{{<<<}}}<br />{{{foo}}}<br />{{{> inner foo, level 1}}}<br />{{{>> inner foo, level 2}}}<br />{{{more foo}}}<br />{{{<<<}}}|\n\n<<<\nThe highlight can also accept CSS syntax to directly style the text:\n@@color:green;green coloured@@\n@@background-color:#ff0000;color:#ffffff;red coloured@@\n@@text-shadow:black 3px 3px 8px;font-size:18pt;display:block;margin:1em 1em 1em 1em;border:1px solid black;Access any CSS style@@\n<<<\n\n//For backwards compatibility, the following highlight syntax is also accepted://\n{{{\n@@bgcolor(#ff0000):color(#ffffff):red coloured@@\n}}}\n@@bgcolor(#ff0000):color(#ffffff):red coloured@@
@@color(#04f): 객체는 @@ 데이터와 데이터를 처리하는 포로시저를 함께 묶은 단위이다. \n 프로시저를 일반적으로 메소드 또는 오퍼레이션이라고 부른다. 객체는 요청 또는 메시지를 클라이언트로부터 받으면 오퍼레이션을 수해한다.\n
/***\n!Sections in this Tiddler:\n*Generic rules\n**Links styles\n**Link Exceptions\n*Header\n*Main menu\n*Sidebar\n**Sidebar options\n**Sidebar tabs\n*Message area\n*Popup\n*Tabs\n*Tiddler display\n**Viewer\n**Editor\n*Misc. rules\n!Generic Rules /%==============================================%/\n***/\n/*{{{*/\nbody {\n font-size: .75em;\n font-family: arial,helvetica;\n position: relative;\n margin: 0;\n padding: 0;\n}\n\nh1,h2,h3,h4,h5 {\n font-weight: bold;\n text-decoration: none;\n padding-left: 0.4em;\n}\n\nh1 {font-size: 1.35em;}\nh2 {font-size: 1.25em;}\nh3 {font-size: 1.1em;}\nh4 {font-size: 1em;}\nh5 {font-size: .9em;}\n\nhr {\n height: 1px;\n}\n\na{\n text-decoration: none;\n}\n\nol { list-style-type: decimal }\nol ol { list-style-type: lower-alpha }\nol ol ol { list-style-type: lower-roman }\nol ol ol ol { list-style-type: decimal }\nol ol ol ol ol { list-style-type: lower-alpha }\nol ol ol ol ol ol { list-style-type: lower-roman }\nol ol ol ol ol ol ol { list-style-type: decimal }\n/*}}}*/\n/***\n''General Link Styles'' /%-----------------------------------------------------------------------------%/\n***/\n/*{{{*/\n.externalLink {\n text-decoration: underline;\n}\n\n.tiddlyLinkExisting {\n font-weight: bold;\n}\n\n.tiddlyLinkNonExisting {\n font-style: italic;\n}\n\n/* the 'a' is required for IE, otherwise it renders the whole tiddler a bold */\na.tiddlyLinkNonExisting.shadow {\n font-weight: bold;\n}\n/*}}}*/\n/***\n''Exceptions to common link styles'' /%------------------------------------------------------------------%/\n***/\n/*{{{*/\n\n#mainMenu .tiddlyLinkExisting, \n#mainMenu .tiddlyLinkNonExisting,\n#sidebarTabs .tiddlyLinkExisting,\n#sidebarTabs .tiddlyLinkNonExisting{\n font-weight: normal;\n font-style: normal;\n}\n\n/*}}}*/\n/***\n!Header /%==================================================%/\n***/\n/*{{{*/\n\n.header {\n position: relative;\n}\n\n.header a:hover {\n background: transparent;\n}\n\n.headerShadow {\n position: relative;\n padding: 4.5em 0em 1em 1em;\n left: -1px;\n top: -1px;\n}\n\n.headerForeground {\n position: absolute;\n padding: 4.5em 0em 1em 1em;\n left: 0px;\n top: 0px;\n}\n\n.siteTitle {\n font-size: 3em;\n}\n\n.siteSubtitle {\n font-size: 1.2em;\n}\n\n/*}}}*/\n/***\n!Main menu /%==================================================%/\n***/\n/*{{{*/\n#mainMenu {\n position: absolute;\n left: 0;\n width: 10em;\n text-align: right;\n line-height: 1.6em;\n padding: 1.5em 0.5em 0.5em 0.5em;\n font-size: 1.1em;\n}\n\n/*}}}*/\n/***\n!Sidebar rules /%==================================================%/\n***/\n/*{{{*/\n#sidebar {\n position: absolute;\n right: 3px;\n width: 16em;\n font-size: .9em;\n}\n/*}}}*/\n/***\n''Sidebar options'' /%----------------------------------------------------------------------------------%/\n***/\n/*{{{*/\n#sidebarOptions {\n padding-top: 0.3em;\n}\n\n#sidebarOptions a {\n margin: 0em 0.2em;\n padding: 0.2em 0.3em;\n display: block;\n}\n\n#sidebarOptions input {\n margin: 0.4em 0.5em;\n}\n\n#sidebarOptions .sliderPanel {\n margin-left: 1em;\n padding: 0.5em;\n font-size: .85em;\n}\n\n#sidebarOptions .sliderPanel a {\n font-weight: bold;\n display: inline;\n padding: 0;\n}\n\n#sidebarOptions .sliderPanel input {\n margin: 0 0 .3em 0;\n}\n/*}}}*/\n/***\n''Sidebar tabs'' /%-------------------------------------------------------------------------------------%/\n***/\n/*{{{*/\n\n#sidebarTabs .tabContents {\n width: 15em;\n overflow: hidden;\n}\n\n/*}}}*/\n/***\n!Message area /%==================================================%/\n***/\n/*{{{*/\n#messageArea {\nposition:absolute; top:0; right:0; margin: 0.5em; padding: 0.5em;\n}\n\n*[id='messageArea'] {\nposition:fixed !important; z-index:99;}\n\n.messageToolbar {\ndisplay: block;\ntext-align: right;\n}\n\n#messageArea a{\n text-decoration: underline;\n}\n/*}}}*/\n/***\n!Popup /%==================================================%/\n***/\n/*{{{*/\n.popup {\n font-size: .9em;\n padding: 0.2em;\n list-style: none;\n margin: 0;\n}\n\n.popup hr {\n display: block;\n height: 1px;\n width: auto;\n padding: 0;\n margin: 0.2em 0em;\n}\n\n.popup li.disabled {\n padding: 0.2em;\n}\n\n.popup li a{\n display: block;\n padding: 0.2em;\n}\n/*}}}*/\n/***\n!Tabs /%==================================================%/\n***/\n/*{{{*/\n.tabset {\n padding: 1em 0em 0em 0.5em;\n}\n\n.tab {\n margin: 0em 0em 0em 0.25em;\n padding: 2px;\n}\n\n.tabContents {\n padding: 0.5em;\n}\n\n.tabContents ul, .tabContents ol {\n margin: 0;\n padding: 0;\n}\n\n.txtMainTab .tabContents li {\n list-style: none;\n}\n\n.tabContents li.listLink {\n margin-left: .75em;\n}\n/*}}}*/\n/***\n!Tiddler display rules /%==================================================%/\n***/\n/*{{{*/\n#displayArea {\n margin: 1em 17em 0em 14em;\n}\n\n\n.toolbar {\n text-align: right;\n font-size: .9em;\n visibility: hidden;\n}\n\n.selected .toolbar {\n visibility: visible;\n}\n\n.tiddler {\n padding: 1em 1em 0em 1em;\n}\n\n.missing .viewer,.missing .title {\n font-style: italic;\n}\n\n.title {\n font-size: 1.6em;\n font-weight: bold;\n}\n\n.missing .subtitle {\n display: none;\n}\n\n.subtitle {\n font-size: 1.1em;\n}\n\n/* I'm not a fan of how button looks in tiddlers... */\n.tiddler .button {\n padding: 0.2em 0.4em;\n}\n\n.tagging {\nmargin: 0.5em 0.5em 0.5em 0;\nfloat: left;\ndisplay: none;\n}\n\n.isTag .tagging {\ndisplay: block;\n}\n\n.tagged {\nmargin: 0.5em;\nfloat: right;\n}\n\n.tagging, .tagged {\nfont-size: 0.9em;\npadding: 0.25em;\n}\n\n.tagging ul, .tagged ul {\nlist-style: none;margin: 0.25em;\npadding: 0;\n}\n\n.tagClear {\nclear: both;\n}\n\n.footer {\n font-size: .9em;\n}\n\n.footer li {\ndisplay: inline;\n}\n/***\n''The viewer is where the tiddler content is displayed'' /%------------------------------------------------%/\n***/\n/*{{{*/\n* html .viewer pre {\n width: 99%;\n padding: 0 0 1em 0;\n}\n\n.viewer {\n line-height: 1.4em;\n padding-top: 0.5em;\n}\n\n.viewer .button {\n margin: 0em 0.25em;\n padding: 0em 0.25em;\n}\n\n.viewer blockquote {\n line-height: 1.5em;\n padding-left: 0.8em;\n margin-left: 2.5em;\n}\n\n.viewer ul, .viewer ol{\n margin-left: 0.5em;\n padding-left: 1.5em;\n}\n\n.viewer table {\n border-collapse: collapse;\n margin: 0.8em 1.0em;\n}\n\n.viewer th, .viewer td, .viewer tr,.viewer caption{\n padding: 3px;\n}\n\n.viewer pre {\n padding: 0.5em;\n margin-left: 0.5em;\n font-size: 1.2em;\n line-height: 1.4em;\n overflow: auto;\n}\n\n.viewer code {\n font-size: 1.2em;\n line-height: 1.4em;\n}\n/*}}}*/\n/***\n''The editor replaces the viewer in the tiddler'' /%------------------------------------------------%/\n***/\n/*{{{*/\n.editor {\nfont-size: 1.1em;\n}\n\n.editor input, .editor textarea {\n display: block;\n width: 100%;\n font: inherit;\n}\n\n.editorFooter {\n padding: 0.25em 0em;\n font-size: .9em;\n}\n\n.editorFooter .button {\npadding-top: 0px; padding-bottom: 0px;}\n\n.fieldsetFix {border: 0;\npadding: 0;\nmargin: 1px 0px 1px 0px;\n}\n/*}}}*/\n/***\n!Misc rules /%==================================================%/\n***/\n/*{{{*/\n.sparkline {\n line-height: 1em;\n}\n\n.sparktick {\n outline: 0;\n}\n\n.zoomer {\n font-size: 1.1em;\n position: absolute;\n padding: 1em;\n}\n\n.cascade {\n font-size: 1.1em;\n position: absolute;\n overflow: hidden;\n}\n/*}}}*/
/***\n!Colors Used\n*@@bgcolor(#8cf): #8cf - Background blue@@\n*@@bgcolor(#18f): #18f - Top blue@@\n*@@bgcolor(#04b): #04b - Mid blue@@\n*@@bgcolor(#014):color(#fff): #014 - Bottom blue@@\n*@@bgcolor(#ffc): #ffc - Bright yellow@@\n*@@bgcolor(#fe8): #fe8 - Highlight yellow@@\n*@@bgcolor(#db4): #db4 - Background yellow@@\n*@@bgcolor(#841): #841 - Border yellow@@\n*@@bgcolor(#703):color(#fff): #703 - Title red@@\n*@@bgcolor(#866): #866 - Subtitle grey@@\n!Generic Rules /%==============================================%/\n***/\n/*{{{*/\nbody {\n background: #fff;\n color: #000;\n}\n\na{\n color: #04b;\n}\n\na:hover{\n background: #04b;\n color: #fff;\n}\n\na img{\n border: 0;\n}\n\nh1,h2,h3,h4,h5 {\n color: #703;\n background: #8cf;\n}\n\n.button {\n color: #014;\n border: 1px solid #fff;\n}\n\n.button:hover {\n color: #014;\n background: #fe8;\n border-color: #db4;\n}\n\n.button:active {\n color: #fff;\n background: #db4;\n border: 1px solid #841;\n}\n\n/*}}}*/\n/***\n!Header /%==================================================%/\n***/\n/*{{{*/\n.header {\n background: #04b;\n}\n\n.headerShadow {\n color: #000;\n}\n\n.headerShadow a {\n font-weight: normal;\n color: #000;\n}\n\n.headerForeground {\n color: #fff;\n}\n\n.headerForeground a {\n font-weight: normal;\n color: #8cf;\n}\n\n/*}}}*/\n/***\n!General tabs /%=================================================%/\n***/\n/*{{{*/\n\n.tabSelected{\n color: #014;\n background: #eee;\n border-left: 1px solid #ccc;\n border-top: 1px solid #ccc;\n border-right: 1px solid #ccc;\n}\n\n.tabUnselected {\n color: #fff;\n background: #999;\n}\n\n.tabContents {\n color: #014;\n background: #eee;\n border: 1px solid #ccc;\n}\n\n.tabContents .button {\n border: 0;}\n\n/*}}}*/\n/***\n!Sidebar options /%=================================================%/\n~TiddlyLinks and buttons are treated identically in the sidebar and slider panel\n***/\n/*{{{*/\n#sidebar {\n}\n\n#sidebarOptions input {\n border: 1px solid #04b;\n}\n\n#sidebarOptions .sliderPanel {\n background: #8cf;\n}\n\n#sidebarOptions .sliderPanel a {\n border: none;\n color: #04b;\n}\n\n#sidebarOptions .sliderPanel a:hover {\n color: #fff;\n background: #04b;\n}\n\n#sidebarOptions .sliderPanel a:active {\n color: #04b;\n background: #fff;\n}\n/*}}}*/\n/***\n!Message Area /%=================================================%/\n***/\n/*{{{*/\n#messageArea {\n border: 1px solid #841;\n background: #db4;\n color: #014;\n}\n\n#messageArea .button {\n padding: 0.2em 0.2em 0.2em 0.2em;\n color: #014;\n background: #fff;\n}\n\n/*}}}*/\n/***\n!Popup /%=================================================%/\n***/\n/*{{{*/\n.popup {\n background: #18f;\n border: 1px solid #04b;\n}\n\n.popup hr {\n color: #014;\n background: #014;\n border-bottom: 1px;\n}\n\n.popup li.disabled {\n color: #04b;\n}\n\n.popup li a, .popup li a:visited {\n color: #eee;\n border: none;\n}\n\n.popup li a:hover {\n background: #014;\n color: #fff;\n border: none;\n}\n/*}}}*/\n/***\n!Tiddler Display /%=================================================%/\n***/\n/*{{{*/\n.tiddler .defaultCommand {\n font-weight: bold;\n}\n\n.shadow .title {\n color: #866;\n}\n\n.title {\n color: #703;\n}\n\n.subtitle {\n color: #866;\n}\n\n.toolbar {\n color: #04b;\n}\n\n.tagging, .tagged {\n border: 1px solid #eee;\n background-color: #eee;\n}\n\n.selected .tagging, .selected .tagged {\n background-color: #ddd;\n border: 1px solid #bbb;\n}\n\n.tagging .listTitle, .tagged .listTitle {\n color: #014;\n}\n\n.tagging .button, .tagged .button {\n border: none;\n}\n\n.footer {\n color: #ddd;\n}\n\n.selected .footer {\n color: #888;\n}\n\n.sparkline {\n background: #8cf;\n border: 0;\n}\n\n.sparktick {\n background: #014;\n}\n\n.errorButton {\n color: #ff0;\n background: #f00;\n}\n\n.cascade {\n background: #eef;\n color: #aac;\n border: 1px solid #aac;\n}\n\n.imageLink, #displayArea .imageLink {\n background: transparent;\n}\n\n/*}}}*/\n/***\n''The viewer is where the tiddler content is displayed'' /%------------------------------------------------%/\n***/\n/*{{{*/\n\n.viewer .listTitle {list-style-type: none; margin-left: -2em;}\n\n.viewer .button {\n border: 1px solid #db4;\n}\n\n.viewer blockquote {\n border-left: 3px solid #666;\n}\n\n.viewer table {\n border: 2px solid #333;\n}\n\n.viewer th, thead td {\n background: #db4;\n border: 1px solid #666;\n color: #fff;\n}\n\n.viewer td, .viewer tr {\n border: 1px solid #666;\n}\n\n.viewer pre {\n border: 1px solid #fe8;\n background: #ffc;\n}\n\n.viewer code {\n color: #703;\n}\n\n.viewer hr {\n border: 0;\n border-top: dashed 1px #666;\n color: #666;\n}\n\n.highlight, .marked {\n background: #fe8;\n}\n/*}}}*/\n/***\n''The editor replaces the viewer in the tiddler'' /%------------------------------------------------%/\n***/\n/*{{{*/\n.editor input {\n border: 1px solid #04b;\n}\n\n.editor textarea {\n border: 1px solid #04b;\n width: 100%;\n}\n\n.editorFooter {\n color: #aaa;\n}\n\n/*}}}*/
@@color(#04f): 교차판정 @@방식(충돌체크)\n-1. Axis Aligned Bounding Box ; 삼각형, 구, 축에 나란한 경계 박스\n-2. Oriented Bounding Box ; 방향을 가지는 경계 박스\n-3. Discrete Oriented Polytopes ; 유한한 방향을 가지는 다각형
@@color(#04f): 디더링 @@(dithering)은\n*서로 다른 색의 픽셀들의 연달아 놓아서 합성된 색이 나타나게 하는 것으로, \n**하드웨어에서 실제로 제공되는 것보다 더 많은 색들이 존재하는 것처럼 보이게 하기 위한 것이다.\n***컴퓨터 그래픽스(CG)에서 표시 장치나 인쇄기의 능력(해상도)을 초과하는 다계조(多階調)의 색의 화상을 근사하게 생성하기 위하여 사용되는 기술로,\n***예로 컬러 표시 장치나 인쇄기에서는 적색 도트와 백색 도트의 비율을 어떻게 하느냐에 따라 다양한 계조의 분홍색으로 보이게 한다.\n*디더링은 하프톤 화상(halftone image)과 비슷한 화상을 생성하며,\n**디더링은 저해상도에서 컴퓨터 도형 처리의 사실감을 높이고 매끄럽지 못하고 계단 모양으로 울퉁불퉁한 윤곽선이나 대각선을 눈에 띄지 않게 하기 위하여 사용된다.흔히 디더법이라고 도 한다. \n**화면에 어떤 색상을 표시할 수 없는 경우, \n***표시할 수 있는 색상들의 화소를 모아 되도록 비슷한 색상을 만들어 내는 것을 말한다. 예를 들어 회색은 회색의 화소를 사용하는 것이 아니라 검은색과 흰색 화소를 섞는 비율을 조절하여 보여주는 것으로 대체할 수 있다. \n**웹 그래픽의 경우 파일의 크기를 줄이기 위해 256 가지 색깔만 사용하도록 제한을 두면서 \n***그 외의 색은 디더링으로 나타내는 경우가 많다. 화면이나 프린터에서 모든 색을 표현할 수 있는 것이 아니기 때문에 있는 색을 혼합하여 사용하는 편법을 쓰는 것이라고 생각해도 틀리지 않다. \n cf.Dither Strength : 수치가 클수록 렌더링 입자가 커집니다
@@color(#04f): 래스터라이제이션 @@(rasterization)이란\n그래픽 (삼각형과 같은) 프리미티브를 가지고 실제로 스크린에 한 픽셀씩 그리는 것이다.\n
Part/ Chapter/ Section\n!!! 대분류-한글\n|<<siteMap Chapter_가 . openSliders>><<siteMap Chapter_나 . openSliders>><<siteMap Chapter_다 . openSliders>><<siteMap Chapter_라 . openSliders>><<siteMap Chapter_마 . openSliders>>|<<siteMap Chapter_바 . openSliders>><<siteMap Chapter_사 . openSliders>><<siteMap Chapter_아 . openSliders>><<siteMap Chapter_자 . openSliders>><<siteMap Chapter_차 . openSliders>>|<<siteMap Chapter_카 . openSliders>><<siteMap Chapter_타 . openSliders>><<siteMap Chapter_파 . openSliders>><<siteMap Chapter_하 . openSliders>>|\n|noBorder threeCol|k\n\n!!! 대분류-영어\n|<<siteMap Chapter_A . sliders>><<siteMap Chapter_B . sliders>><<siteMap Chapter_C . sliders>><<siteMap Chapter_D . sliders>><<siteMap Chapter_E . sliders>><<siteMap Chapter_F . sliders>><<siteMap Chapter_G . sliders>><<siteMap Chapter_H . sliders>><<siteMap Chapter_I . sliders>>|<<siteMap Chapter_J . sliders>><<siteMap Chapter_K . sliders>><<siteMap Chapter_L . sliders>><<siteMap Chapter_M . sliders>><<siteMap Chapter_N . sliders>><<siteMap Chapter_0 . sliders>><<siteMap Chapter_P . sliders>><<siteMap Chapter_Q . sliders>><<siteMap Chapter_R . sliders>>|<<siteMap Chapter_S . sliders>><<siteMap Chapter_T . sliders>><<siteMap Chapter_U . sliders>><<siteMap Chapter_V . sliders>><<siteMap Chapter_W . sliders>><<siteMap Chapter_X . sliders>><<siteMap Chapter_Y . sliders>><<siteMap Chapter_Z . sliders>>|\n|noBorder threeCol|k\n
TiddlyWiki lets you write ordinary HTML by enclosing it in {{{<html>}}} and {{{</html>}}}:\n\n<html>\n<a href="javascript:;" onclick="onClickTiddlerLink(event);" tiddlyLink="TiddlyWiki" style="background-color: yellow;">Link to wikiwords from HTML</a>\n</html>\n\nThe source for the above is:\n\n{{{\n<html>\n<div style="background-color: yellow;">\n<a href="javascript:;" onclick="onClickTiddlerLink(event);" tiddlyLink="Macros">Link to wikiwords from HTML</a>\n</div>\n</html>\n}}}\n\nHTML can enable some exotic new features (like [[embedding GMail and Outlook|http://groups.google.com/group/TiddlyWiki/browse_thread/thread/d363303aff5868d0/056269d8409d121f?lnk=st&q=embedding+gmail&rnum=1#056269d8409d121f]] in a TiddlyWiki). However it doesn't work for some JavaScript code libraries; see CustomMarkup for another way to include custom HTML in your TiddlyWiki.\n\n----\nHere's one way to get a Flickr badge in TiddlyWiki:\n\n<html>\n<a href="http://www.flickr.com" style="text-align:center;">www.<strong style="color:#3993ff">flick<span style="color:#ff1c92">r</span></strong>.com</a><br>\n<iframe style="background-color:#ffffff; border-color:#ffffff; border:none;" width="113" height="151" frameborder="0" scrolling="no" src="http://www.flickr.com/apps/badge/badge_iframe.gne?zg_bg_color=ffffff&zg_person_id=35468148136@N01" title="Flickr Badge"></iframe>\n</html>\n\nHere's the HTML code to insert in a tiddler:\n{{{\n<html>\n<a href="http://www.flickr.com" style="text-align:center;">www.<strong style="color:#3993ff">flick<span style="color:#ff1c92">r</span></strong>.com</a><br>\n<iframe style="background-color:#ffffff; border-color:#ffffff; border:none;" width="113" height="151" frameborder="0" scrolling="no" src="http://www.flickr.com/apps/badge/badge_iframe.gne?zg_bg_color=ffffff&zg_person_id=35468148136@N01" title="Flickr Badge"></iframe>\n</html>\n}}}\n\nYou'll need to know your Flickr person ID, which should replace the value "35468148136@N01" in the HTML. There's a useful [[Flickr idGettr|http://eightface.com/code/idgettr/]] to help with this.
Entities in HTML documents allow characters to be entered that can't easily be typed on an ordinary keyboard. They take the form of an ampersand (&), an identifying string, and a terminating semi-colon (;). There's a complete reference [[here|http://www.htmlhelp.com/reference/html40/entities/]]; some of the more common and useful ones are shown below. Also see [[Paul's Notepad|http://thepettersons.org/PaulsNotepad.html#GreekHtmlEntities HtmlEntitiesList LatinHtmlEntities MathHtmlEntities]] for a more complete list.\n\n|>|>|>|>|>|>| !HTML Entities |\n| &nbsp; | | no-break space | | &apos; | ' | single quote, apostrophe |\n| &ndash; | – | en dash |~| &quot; | " | quotation mark |\n| &mdash; | — | em dash |~| &prime; | ′ | prime; minutes; feet |\n| &hellip; | … | horizontal ellipsis |~| &Prime; | ″ | double prime; seconds; inches |\n| &copy; | © | Copyright symbol |~| &lsquo; | ‘ | left single quote |\n| &reg; | ® | Registered symbol |~| &rsquo; | ’ | right single quote |\n| &trade; | ™ | Trademark symbol |~| &ldquo; | “ | left double quote |\n| &dagger; | † | dagger |~| &rdquo; | ” | right double quote |\n| &Dagger; | ‡ | double dagger |~| &laquo; | « | left angle quote |\n| &para; | ¶ | paragraph sign |~| &raquo; | » | right angle quote |\n| &sect; | § | section sign |~| &times; | × | multiplication symbol |\n| &uarr; | ↑ | up arrow |~| &darr; | ↓ | down arrow |\n| &larr; | ← | left arrow |~| &rarr; | → | right arrow |\n| &lArr; | ⇐ | double left arrow |~| &rArr; | ⇒ | double right arrow |\n| &harr; | ↔ | left right arrow |~| &hArr; | ⇔ | double left right arrow |\n\nThe table below shows how accented characters can be built up by subsituting a base character into the various accent entities in place of the underscore ('_'):\n\n|>|>|>|>|>|>|>|>|>|>|>|>|>|>|>|>|>| !Accented Characters |\n| grave accent | &_grave; | À | à | È | è | Ì | ì | Ò | ò | Ù | ù | | | | | | |\n| acute accent | &_acute; | Á | á | É | é | Í | í | Ó | ó | Ú | ú | | | Ý | ý | | |\n| circumflex accent | &_circ; | Â | â | Ê | ê | Î | î | Ô | ô | Û | û | | | | | | |\n| umlaut mark | &_uml; | Ä | ä | Ë | ë | Ï | ï | Ö | ö | Ü | ü | | | Ÿ | ÿ | | |\n| tilde | &_tilde; | Ã | ã | | | | | Õ | õ | | | Ñ | ñ | | | | |\n| ring | &_ring; | Å | å | | | | | | | | | | | | | | |\n| slash | &_slash; | | | | | | | Ø | ø | | | | | | | | |\n| cedilla | &_cedil; | | | | | | | | | | | | | | | Ç | ç |
Several [[Macros]] including the TodayMacro take a DateFormatString as an optional argument. This string can be a combination of ordinary text, with some special characters that get substituted by parts of the date:\n* {{{DDD}}} - day of week in full (eg, "Monday")\n* {{{ddd}}} - short day of week (eg, "Mon")\n* {{{DD}}} - day of month\n* {{{0DD}}} - adds a leading zero\n* {{{DDth}}} - adds a suffix\n* {{{WW}}} - ISO-8601 week number of year\n* {{{0WW}}} - adds a leading zero\n* {{{MMM}}} - month in full (eg, "July")\n* {{{mmm}}} - short month (eg, "Jul")\n* {{{MM}}} - month number\n* {{{0MM}}} - adds leading zero\n* {{{YYYY}}} - full year\n* {{{YY}}} - two digit year\n* {{{wYYYY}}} - full year with respect to week number\n* {{{wYY}}} two digit year with respect to week number\n* {{{hh}}} - hours\n* {{{0hh}}} - adds a leading zero\n* {{{hh12}}} - hours in 12 hour clock\n* {{{0hh12}}} - hours in 12 hour clock with leading zero\n* {{{mm}}} - minutes\n* {{{0mm}}} - minutes with leading zero\n* {{{ss}}} - seconds\n* {{{0ss}}} - seconds with leading zero\n* {{{am}}} or {{{pm}}} - lower case AM/PM indicator\n* {{{AM}}} or {{{PM}}} - upper case AM/PM indicator
@@color(#04f): 목표관리 @@(MBO:Management By Objective through self-control)\n참고; [[핵심성공요인(CSF)]]\n\n기업의 인간적 측면에 바탕을 두고 효율적 경영관리체제를 실현하려고 하는 경영관리의 수법 및 경영이념이다.이것은 조직목표와 개인목표를 명확하게 설정함으로써 각자의 능력을 개발하고 의욕을 높이며 또한 각자의 힘을조직력으로 집중 발휘시킴으로써 효율적인 경영활동을 가능하게 하려고 하는 것이다.\n*목표관리의 개념 \n**목표관리란 조직의 목표설정에서부터 책임의 확정, 실적의 평가, 조직단위 또는 개인의 활동에 이르기까지 조직의 상·하 구성원과 함께 참여하여 공동으로 조직의 제반문제에 대해 결정하는 것이다. 이 때의 목표는 단기간의 구체적 목표를 말한다. 즉, 목표관리는 상·하 간의 참여적 관리라고 볼 수 있다. \n*관리 방법\n**목표관리는 조직목표와 개인목표를 어떻게 연계시킬 것인가가 중요하다. 그러기 위해서는 앞에서 학습한 방법(Tree, Budget, Probability, Task, Cycle)을 잘 활용해야 한다. 그리고 시스템을 중시하는 조직문화 창조가 목표관리의 효율적인 운영방법이 되기 때문에 현장을 실질적으로 통솔하는 중간관리자들의 역할이 매우 중요하다.\n목표관리에서는 정량목표, 정성목표, 스킬 매트릭스의 3개 기본축이 있다. 이 중 스킬 매트릭스는 더 높은 성과를 올리기 위해서는 어떠한 능력 요건이 필요한지 규정하는 것이다. \n * 직무에 필요한 요건은 보통 능력(업무수행능력, 문제해결 능력, 의사소통)과 의사(지도/육성, 향상심, 책임감, 협조성)의 두 가지 분야로 나뉜다. 명확한 전략의 공통점은 핵심역량이 명확해서 그것을 무기로 삼고 있다는 점이다. \n\n그리고 회사의 독자적인 핵심역량에 비추어 개인이 갖추어야 할 역량도 독자적인 것이어야 한다. \n * 역량의 기본 관점은 인재에 대한 벤치마킹이다. 높은 실적을 올리는 뛰어난 사원의 특성을 모델화하여 평가, 보상, 능력개발, 채용, 배치 등 인사관리 시스템 전반에 활용해야 한다.\n\n인사평가의 3가지 기능은 조직이 지향하는 방향으로 사원의 행동을 이끌어,\n * 인재를 육성하고, 조직을 강화하며, 처우를 결정하기 위한 기초 정보를 얻는 것이다. 평가하는 것은 정량목표, 정성목표, 스킬 매트릭스 3가지이며 능력주의, 성과주의 중 어느 쪽을 지향하는가에 따라 비중이 달라진다.\n\n평가는 ‘달성도 x 비중 x 난이도 x 노력도’라는 공식으로 산출한다. \n * 달성도는 연간 매출목표가 1억 5,000만 엔이었는데 실적이 1억 2,000만 엔이라면 80%가 된다. \n * 비중은 목표의 수가 3개라면 전체를 100으로 했을 때 각각의 목표에 몇 %의 비중을 부여하는가이다. \n * 난이도란 조정항목이며 노력도는 시장과 환경이 순풍인가 역풍인가를 참작하기 위한 항목으로 이 두 가지 항목은 잘 사용하지 않는다. \n\n목표관리는 보통 6개월 주기로 실시하는데 가능한 한 사업연도(상반기, 하반기)에 맞추는 것이 좋으며 \n * 주기 말에 성과를 평가하여 다음 기의 목표를 잡는 것이 좋다.\n
@@color(#04f): 속력과 속도 @@ \n개체가 주어진 시간 동안 주어진 거리를 이동한다면, \n 물리적인 관점에서 이것은 개체의 속력이고,\n 만일 방향을 정의한다면 이것은 개체의 속도이다.[ 참고; "DirectX 실시간 렌더링 실전테크닉 ]
@@color(#04f): 스키마 @@(Schema)\n* 사람들은 어떠한 사실에 대해서 아무런 순서없이 알고 있다기 보다는 특별한 주제에 대해서 보통 체계화된 지식을 가지고 있게 된다.\n** 이렇게 하나의 주제에 대해 체계화된 지식 구조를 스키마(schema, 복수는 schemata)라 한다. 예를 들어, 빨래를 하고, 생일파티를 하고, 식당에서 식사를 하는 등과 같은 익숙하고도 고정된 상황에 대해 체계적으로 알고 있는 지식을 말한다.\n* 여러종류의 개념들에 대해 이렇듯 고정화되고 체계화된 스키마가 존재합니다. \n** 이러한 모든 스키마는 복잡한 아이디어들을 체계화하는 하나의 틀을 제공하기 때문에, 언어를 이해하고 처리하는데 중요한 역할을 하게 된다.
@@color(#04f): 스프라이트 @@(Sprite)\n* 일정 사이즈의 그래픽 데이터를 화면 상에서 자유자재로 배치하거나 고속으로 움직일 수 있는데, 이 그래픽 데이터를 '스프라이트' 라고 한다. \n** 컴퓨터에서는 화면 전체가 한 장의 그래픽 데이터로 구성되어 있기 때문에 액션 게임의 캐릭터 등을 움직이기 위해서는 캐릭터의 위치가 변화된 그림을 계속해서 만들어 표시해야 한다. \n* 이것을 소프트웨어적로 행하게 되면 컴퓨터가 처리해야 하는 분량이 상당하게 되는데, \n** 하드웨어적인 스프라이트 기능을 가지고 있는 게임기에서는 배경의 그림 위에 독립해서 캐릭터의 그림을 배치하고 자유자재로 위치를 변경할 수 있다.\n\n@@color(#04f): 스프라이트 에디터 @@\n* 스프라이트 Editor란, 보통 게임에서 맵에 찍히는 타일이외의 그림 데이터를 만들어주는 Editor이다. \n** 게임의 주인공이나 그 외의 캐릭터와 날아다니는 새, 예쁜 나비나 강아지 등도 만들어 주기도 하고, 여러 개의 그림들을 묶어, 방향에 따른 모습이나 동작 등을 만들어 하나의 새로운 캐릭터를 만들어 준다.
@@color(#04f): ▣ 아젠다 @@영어 사전상으로는,...\n agenda (agenda의 단수 취급이 확립되어 왔으므로 복수형은 ~s가 일반적임_보통 단수 취급)\n의사 일정, 협의 사항; 비망록 the first item on the ~ 의사 일정의 제1항목,......\n아젠다(agenda)란 '토의할 일련의 과제들', '해야할 일련의 일들'이란 뜻을 가진 단어로, 라틴어의 'agere(하다)'에서 유래한 영어\n
@@color(#04f): 오픈 소스 - 라이센스 @@\n# GNU: General Public License (GPL) \n## 파생물도 GPL을 따라야 함 \n## 소스를 반드시 구할 수 있어야 함(변경 포함) \n## Richard M. Stallman이 주창함 \n## LGPL과 LGPL2\n# BSD License \n## 파생물은 별도의 라이센스 부여 가능 \n## 그럴 필요 없음. 상업적 사용 가능 \n## BSD UNIX의 라이센스 조항 \n## 여러가지 변종 존재(FreeBSD, X, Artistic etc..)\n# Artistic License, Mozilla Public License(MPL), FreeBSD License, XFree86 License 등 \n
@@color(#04f): 이모티콘 @@(Emoticon)\n
@@color(#04f): 인덱스버퍼 @@(Index Buffer)는 정점의 인덱스를 보관하기 위한 전용 버퍼\n# 정점을 여러 번 나열하는 것보다 메모리 소모량이 적다.\n# 자주 사용되는 정점을 캐쉬(cache)에 저장해서 더 높은 효율을 낼 수 있다.\n** 실제로는 캐시 적중 알고리즘에 따라서 정점을 최적화 해야만 한다.\n# 구형 그래픽카드(TNT급)들이 16비트 인덱스만(WORD형)을 지원한다.\n** 그릴 수 있는 폴리곤의 숫자는 2에 16승 = 64k가 되며, D3DFMT_INDEX16을 사용한다.\n\n▶ 관련사항; [[버텍스버퍼]]\n
@@color(#04f): 인스턴스 @@(instance)는\n추상화 개념 또는 클래스 객체, 컴퓨터 프로세스 등과 같은 템플릿이 실제 구현된 것이다.\n(출처; http://www.terms.co.kr/)
@@color(#04f): 인자 기반 탐색 @@(argument-dependent lookup) \n'''쾨니그 탐색(Koenig lookup)''' - 어떤 함수에 어떤 타입의 인자가 있으면, 그 함수의 이름을 찾기 위해 해당 타입의 인자가 위치한 네임스페이스 내부의 이름을 탐색해 들어간다는 간단한 규칙이다. \nADL(Argument Dependent Lookup)이란 약자로 많이 불린다. '쾨니그'의 Koenig는 C++ 표준화 위원회 임원이자 이 규칙을 창안한 앤드류 쾨니그(Andrew Koenig)의 이름에서 따온 것이다.
@@color(#04f): 영속성 @@(Persistence)이란\n객체의 상태를 저장한 후 나중에 그 상태를 복원시키는 동작이다. 영속성은 MFC에서는 Serialization이란 용어로 불린다. 만약 개발자가 영속성을 사용하게 된다면, 개발자는 file 형식(format)에 대한 아무런 걱정 없이 read/write할 수 있다. 단지 객체를 read/write하는 순서만 맞추어 주면 된다.\n
@@color(#04f): 버텍스버퍼 @@(vertex buffer)란\n정점을 모아두는 일종의 메모리로 비디오 메모리와 시스템 메모리 두 가지의 메모리를 사용한다.\n* 비디오 메모리; 비디오카드의 GPU(Graphic Processing Unit)에 의해서 정점 셰이더, T&L 등의 강력한 하드웨어 가속을 사용할 수 있지만, 자체의 메모리 용량을 벗어날 수 없으며, 게다가 텍스처와 함께 사용해야 하기 때문에 사용 가능한 메모리는 더욱 적을 수밖에 없다.\n* 시스템 메모리; T&L등의 강력한 하드웨어 가속은 사용할 수 없지만, 풍부한 용량으로 상대적으로 많은 정점 버퍼를 관리할 수 있다.\n\n▶ 관련사항; [[인덱스버퍼]]
@@color(#04f): 추상화 @@(abstraction)\n주어진 문제나 시스템 중에서 중요하고 관계있는 부분만을 분리하여 간결하고 이해하기 쉽게 만드는 작업. 이러한 과정은 원래 문제에서 구체적인 사항은 되도록 생략하고 핵심이 되는 원리만을 따진다.\n
@ 2011-03-28 @\n클라우드 게이밍은 오직 고속 네트워크망과 디스플레이만으로 모든 수치 연산과 파일 저장을 대신하는 원격 시스템을 통해 게임을 플레이한다.\n\n▷ 장점 ; \n -.클라이언트를 다운받을 필요가 없으며 고사양 게임을 즐기기 위해 매번 PC를 업그레이드 하지 않아도 된다.\n -.굳이 고정돼있는 PC가 아니더라도 스마트TV나 태블릿 PC등 다양한 유무선 기기들을 활용(미래의 게임 플랫폼으로 각광)\n -.게임 그래픽의 발전은 CPU가 PC에서 차지하는 비중만큼 GPU의 위상을 급격하게 끌어올린 가장 큰 이유라고 할 수 있다. 하지만 클라우드 게이밍 기반에서는 PC용 CPU와 GPU에게 더 이상 높은 스펙을 요구하지 않는다. (PC용 하드웨어 제조업체에게도 큰 타격)\n\n▷ 단점 ; \n -.제대로 된 클라우드 게이밍을 구현하기 위해 엄청난 양의 데이터를 처리할 수 있는 서버가 필요\n -.고사양을 요구하는 하이엔드급 온라인 게임을 원활하게 클라우드 게이밍 기반으로 서비스하기 위해서는 기가 단위의 인터넷 회선이 필요\n -.단순히 화면전달이 아닌 유저의 컨트롤 지연 문제를 해결하는 것도 과제 \n\n클라우드 게이밍 서비스가 갖고 있는 장점이 오히려 발목을 잡을 수도 있다는 의견도 있다. 고사양 게임을 유저가 보유한 기기의 스펙에 구애받지 않고 즐길 수 있다는 장점이 점차 가벼운 게임을 선호하고 있는 지금의 기호와 맞아 떨어지지 않을 수도 있다는 것이다. 결국 클라우드 게이밍은 고사양을 요구하는 게임에 적합한 플랫폼이지만 SNG나 스마트폰 자체에서 운용되는 가벼운 게임들이 더 각광받으면서 마니아들만 즐기는 플랫폼으로 남을 수도 있다는 의견이다.
@@color(#04f): 타이밍 @@\n* 애니메이션이 시스템 프레임에 의존할 때 문제점\n** 개체에게 프레임당 주어진 거리만큼 이동하라고 지시할 경우, \n*** 프레임 속도가 빨라질수록 개체 속도도 빨라져 시스템에 독립된 일정한 속도를 유지할 수 없다.\n*** 대안으로 프레임 속도를 잠그는 방법도 있지만 바람직하지 못하며 애니메이션을 프로그램의 시간에 의존하도록 해야하며 어떠한 애니메이션 기법도 프레임이 아닌 시간에 근거해야만 한다.\n* 저속 타이머는 애니메이션에 더 적합하면\n** 고속 타이머는 프레임 속도와 같은 통계량에 더 좋다.\n* 높은 정밀도 값을 질의하는 것이 훨씬 더 시간이 오래 걸리기 때문에,\n** 실제로 매우 짧은 시간 간격을 측정하기 위해 고속 타이머를 사용할 수 없다.\n** 이것은 더 긴 시간 간격 동안에 작은 변화를 보기 위해 사용할 수 있다.\n* 이전 프레임을 기준으로 하지 않고 시작 시간을 기준으로 하여 경과된 시간을 계산함으로써\n** 프레임 간에 반올림 오차를 피할 수 있다.\n[ 참고; "DirectX 실시간 렌더링 실전테크닉 "제 38장 완벽한 타이밍" ]\n
@@color(#04f): 트리거 @@(trigger)\n* 트리거의 예를 들면, \n** 데이터베이스 내에서 참조의 무결성을 유지하기 위해 어떤 프로시저를 자동으로 호출하는 것과 같은 행동이다. 트리거는 사용자가 데이터를 삽입하거나 삭제하는 등과 같은, 데이터 변경에 관한 시도를 했을 때 효력을 나타낸다. \n* 트리거는 지정된 어떤 변경이 시도되면, 일련의 행동들을 취하도록 시스템에게 알릴 수 있다. \n** 트리거는 부정확하고, 허가 받지 않았으며, 일관성이 없는 데이터 변경을 방지함으로써, 데이터베이스의 무결성을 유지하는데 도움을 준다. \n
@@color(#04f): 파일 확장자 @@(filename extension)\n\n''3D 게임을 위한 파일 포맷''\n.3DS => 3DStuido R4 (또는 MAX)에서 출력\n.ASE => 3DStudioMax에서 작업한 것을 아스키코드형태로 출력\n.X => DirectX3D에서 기본으로 지원\n / 3DS-> X파일(변환)로 만들어주는 컨버터가 있다. 다이렉트 SDK를 깔고 나셔서 Util 폴더 안에 X파일로 컨버팅 해주는 프로그램이 있고 다이렉트X의 유틸리티 클래스에서 기술제공\n.MD2 => Quake(1 아니면 2)의 캐릭터 포맷\n.MDL( 또는 SMD ) => Haf-Life의 캐릭터 포맷\n\n@@color(#04f): .fxo @@\n• Microsoft DirectX pre-compiled pixel/vertex shader.(from www.file-extensions.org)\n• Gamebryo can load either text-based FX shaders, or binary FX shaders that have been compiled with fxc.exe. Compiled FX shaders should be use the extension ".FXO" to distinguish them from uncompiled FX shaders.(from Gamebryo 2.5 documentation )\n\n@@color(#04f): TTF와 OTF의 차이점 @@\n| 파일타입 | TTF ( True Type Font ) | OTF ( Open Type Font ) |\n| 포맷방식 |True Type Format |Compact Font Format(CFF) |\n|~|1980년대에, 마이크로소프트와 애플이 어도비에 대항하기 위해 만든 글꼴 저장 형식으로 <br> 외곽선(Outline) 글꼴의 표준방식으로 가장 일반적인 글꼴 저장형식 |1996년, 마이크로소프트와 어도비가 합작하여 발표한 글꼴 저장 형식으로 <br> 국제표준화기구인 ISO의 표준화 승인을 받은 트루타입 서체 |\n| 특징 |모든 응용 소프트웨어에서 사용가능하며, OTF보다는 속도가 빠른편 <br> 가족체(라이트/볼드/이탤릭)를 다른 파일로 취급 <br> 2차원 베지어 곡선(Quadratic Bezie)을 사용 |모든 OS에서 사용이 가능하고, TTF 보다 내부 계산과정이 복잡해서 속도가 느리지만, TTF보다 섬세한 작업이 가능 <br> (인쇄물에 비해 DPI가 낮은 모니터 화면에서는 곡선이 매끄럽지 않게 보일 수 있음) <br> 가족체(라이트/볼드/이탤릭)를 파일 하나로 취급 <br> 3차원 베지어 곡선(Cubic Bezier)을 사용 |\n| 용도 |그래픽 작업보다는 대량 출력 및 일반 문서 작업에 주로 사용 |일반 문서 작업보다는 그래픽 디자인 출력에 주로 사용(고해상도 출력) |\n\n\n
@@color(#04f): 패딩 @@(padding)이란? \n패딩은 데이타를 일정 단위의 크기를 맞추기 위하여 추가되는 더미 데이타를 말한다. 예를 들어 데이터의 단위를 40바이트로 정했다면 실제 데이타가 36바이트라도 나머지 4바이트를 쓰레기 값으로 채워서 40바이트를 맞추게 된다. \n이런 데이터는 컴퓨터나 네트웍의 처리 단위와 관련이 있다... Visual C++ 프로그래머라면 #pragma pack을 사용하여 이러한 구조체 얼라인먼트 문제를 해결하는 방법을 알고 있을 것이다. 하지만 네트웍 패킷을 설계하는데 있어서는 패딩을 사용하여 특정 환경에 종속적이지 않은 방법을 선택하는 것이 좋다.
@@color(#04f): 포트폴리오 @@(portfolio) - 출처; 야후백과사전\n사진가나 아티스트·표현자(表現者)·크리에이터 등이 자신들의 작품을 정리하여 정리한 파일. 패션사진가·그래픽디자이너들 사이에서는 북(book)으로 통용되는 경우도 있다. 일반적인 출판물·사진집 등과는 차이가 있어 어디까지나 교사·갤러리직원·미술관직원·편집자와 같은 제3자에게 자신의 작품세계에 대한 이해를 구하는 기능으로 활용되는데, 작품은 몇몇 시리즈 가운데 대표작을 골라 전체를 간단히 이해할 수 있도록 편성된다. 작가의 연락처·경력·작품의도와 같은 문자정보도 포함된다. 작자는 이 포트폴리오를 일상적으로 만들면서 테마를 보다 명확히 축약해나가고, 편집을 더하고, 다음 작품의 힌트도 얻을 수 있는 장점이 있다.\n\n@@color(#04f): 포트폴리오 @@(portfolio) - 출처; 야후백과사전\n주식투자에서 위험을 줄이고 투자수익을 극대화하기 위해 여러 종목에 분산투자하는 방법. 본래 간단한 서류가방이나 자료수집철을 뜻하는 말로, 주식투자에서는 투자자산의 집합이라는 의미로 사용된다. 자산 운용에는 공격형(투기형) 투자와 방어형 투자의 두 방향이 있다.
1.@@color(#04f): 프레이밍 @@(framing)이란? - 출처; Network Programming For Microsoft Windows 2, 15장\n낮은 레벨의 통신 프로토콜에서 데이터의 전송 단위를 프레임(frame)이라고 하고 이런 프레임에 데이터를 담거나 추출하는 과정을 프레이밍(framing)이라고 한다. 예를 들면 이더넷 프레임(Ethernet frame)은 IP 패킷을 담고 있다. 또한 IP가 이더넷이 아닌 시리얼 통신을 통해 구현될 때는 시리얼 통신용 프레임에 패킷이 담기게 된다. 일반적으로 프레임은 프로그래밍 가능한 가장 낮은 수준의 데이터다.\n 신호 -> 프레임 -> IP패킷 -> UDP패킷\n이런 식으로 이해하면 될 것이다.\n\n========================================\n2.@@color(#04f): 프레이밍 @@(framing)이란?\n해당 시점에서 장면의 주제, 여백 등을 고려해 구도를 잡는 것. 여기서는 섀도 맵 해상도가 차지하는 시스템 자원의 낭비를 막기 위해 그림자를 고려한 라이트의 담당 영역을 결정하는 걸 말한다.\n출처; 디지털 라이팅 & 렌더링 2nd Edition\n\n========================================\n3.@@color(#04f): 사진에서 프레이밍, 크롭핑, 트리밍의 구별 @@\n사진에서 이미지를 잘라내는 것은 세 가지로 구분한다.\n1) 프레이밍(Framing)이란\n카메라의 파인더를 통해 촬영할 대상의 범위를 결정하여 촬영하기 전에 필요 없는 것을 잘라내는 것을 말한다. 촬영단계에서 완벽한 앵글과 Composition, Construction, Lighting, 셔터찬스 등을 결정하고 최종적으로 자신이 촬영할 범위를 결정하는 행위이다.\n\n2) 크로핑(Cropping)이란\n필름으로 확대 인화할 때 필름의 일부분에 원치 않는 대상이 찍혔다면\n이것을 인화하면서 확대기로 이미지의 크기를 조절하여 인화지 위에 그 이미지가 나타나지 않도록 하는 것을 말한다. 필름을 잘라내는 것은 아니지만, 필름의 이미지 중 필요한 부분만 인화지 위에 나오게 하는 방법이다.\n특히 갓 사진을 시작한 사람들이 많이 활용하는 방법이다.\n\n3) 트리밍(Trimming)이란\n최종 인화한 인화지에서 필요 없는 부분을 잘라내는 것을 말한다.\n
@@color(#04f): 휴리스틱 의사결정이론 @@ - 출처; KASPA 김중규 행정학 아카데미\n(1)의의 : 뉴엘과 사이먼에 의하면, 문제 해결은 다양한 문제 상태로 된 ‘문제 공간’의 검색이다. 문제의 적정 공간에 관한 인간의 내적 결정은 직무환경의 해석을 통해서 이루어진다. 문제 해결자는 휴리스틱 규칙을 사용하여 선택적으로 문제를 개념화시킨다(Newell & Simon, 1972: 48-85). 이 때 사람마다 문제 공간이 갖는 구조상의 차이는 실제 문제 해결 과정에 지대한 영향을 미친다. 문제 공간은 지식 상태를 나타내는 노드(node)의 연결망 형태로 생각할 수 있는데, 각 노드는 특정 시점에서 문제해결자가 알고 있는 것을 말한다. 각 지식의 상태는 수많은 기호들로 구성된다. 뉴웰과 사이먼에 위하면, 문제풀이란 문제풀이자가 원하는 지식 상태에 도달하는 경로(path)를 찾는 과정이 된다. 문제 해결을 문제 공간의 탐색이라고 할 때 중요한 것은 탐색을 지배하는 원리를 찾는 것이다. 전체 문제의 대안과 결과를 모두 탐색할 수 없을 때 우리는 흔히 문제를 쪼개어 하위 목표의 선택 방법에 몰두하게 된다. \n\n(2)특징 : 목표의 선택 방법은 알고리즘과 휴리스틱으로 나뉜다. 알고리즘 방법은 문제 해결이 보장되는 절차이다. 덧셈, 곱셈은 여기에 해당한다. 알고리즘 방법을 사용하면 항상 정확한 답이 나온다. 휴리스틱은 최선의 답 (best answer) 보다 그럴 듯한 답 (nice and good answer)에 이르게 하는 주먹구구식 탐색 규칙 (rule of thumb) 이다. 휴리스틱은 탐색의 완벽은 기하지 못하지만 가능한 탐색 고하정의 효율성은 높일 수 있다. 휴리스틱의 기본 원리는 항상 현재 최선의 값을 가진 하위 목표로부터 출발하여 나름대로의 특정 형태의 평가 함수(의사결정 규칙)에 의거하여 탐색이 유도될 수 있다는 것이다 (Kowalski, 1979:82). 알고리즘은 완전한 합리성을 추구한다면 휴리스틱은 제한된 합리성에 의한 문제해결과정이다. \n\n(3)알고리즘과의 비교 : 휴리스틱에 입각한 문제 해결 과정은 다음과 같은 특징을 가진다.\n 1)알고리즘에 비해 현실적이다. 곱셈의 경우는 해결의 정확성은 보장받아도, 그러한 해결 과정의 자원과 가중치의 배분이 형평에 맞게 이루어졌는지에 관한 해답을 주지 못한다. \n 2)알고리즘에 비해 문제 해결 수단의 탐색에 유연하다. 여기서 ‘유연하다’란 말은 문제 해결 수단의 탐색에 동원되는 지식이 덜 구조화되어 있다는 뜻이다. \n 3)알고리즘에 비해 효율적이다. 알고리즘은 문제 해결의 규범성을 강조하는 반면, 휴리스틱은 인간이 수행할 수 있는 계산 능력의 범위 안에서 채택 가능한 해답을 찾고자 하는 문제 풀이 방법의 발견에 몰두하기 때문에 현실적으로 효율적인 방법이 된다. 따라서 의사결정자는 채택 가능한 해결책에 가장 빨리 도달하게 하는 몇 개의 단순한 의사결정규칙을 사용하는 휴리스틱 탐색에 의존하게 된다. \n\n(4)한계 : 인간 의사결정의 휴리스틱적 해결은 현실 세계에서 목표-수단의 연쇄고리를 찾아내기 힘들다는 데 한계가 있다. 사람들이 보통 자신들의 행동의 목표를 잘 인식하지 못하는 것과 같다. 반대로 의식하지 않는 행동은 과연 목표가 없는가 하는 문제 제기도 가능하다. 아울러 휴리스틱에 입각한 의사결정이 효율적이라 해도 반드시 타당하지 못하다는 데 또 다른 한계가 있다. 비교적 간단하고 반복적인 영역에서의 의사결정에는 휴리스틱이 효용을 발휘하겠지만 복잡한 영역에서의 휴리스틱적 의사결정에는 종종 위험이 따르기도 한다. \n
@@color(#04f): ▣ A2/AD 전략 @@ @ 2022-12-15 @\n반접근/지역거부(Anti-Access/Area Denial: A2/AD) 전략은 2000년경부터 미국이 중국의 서태평양 영역지배 전략을 부르는 명칭이다. 이 전략은 중국이 새롭게 만들어낸 것이 아니라 매우 전통적인 전략이라고 할 수 있다. 즉 해양력이 열세한 세력이 강한 세력을 상대로 펼치는 해전을 거부하는 형태라고 할 수 있다. 이를 ''해상 거부'', 혹은 ''접근 거부 전략''이라 한다.\n\n간단한 예로 임진왜란 당시, 이순신이 이끄는 조선 수군과의 해전을 벌이면 질 게 뻔하니 해전을 피하고 육지에서 화포공격 등을 가하는 방식으로 대처하던 일본군의 전략과 동일한 것이라고 할 수 있다. 즉 함선 이외의 다른 무력수단을 동원하여 해양에서의 우위를 점한 세력의 접근 및 팽창을 저지하겠다는 전략이라 할 수 있다. 그리고 메이지 유신후 근대적인 군사 제도를 만들었던 야마가타 아리토모는 주권선과 이익선이라는 개념을 도입했는데. 이는 중국의 도련선의 원조라고 부를 정도로 상당히 유사했다.\n\n@@color(#04f): ▣ ABV @@(Alternate Bounding Volume)\n\n@@color(#04f): ▣ ACL @@(Access Control List) ; 접근 조절 목록\n\n@@color(#04f): ▣ Atlas @@ @ 2016-05-10 @\n사전적 의미는 지도책, texture 관점에서는 하나의 Sheet에 여러가지 이미지들을 넣어 놓고 쓰는 방법을 의미한다.\n\n@@color(#04f): ▣ Architecture @@; 아키텍처\n하드웨어·소프트웨어를 포함한 컴퓨터시스템 전체의 설계 사상, 즉 구성상의 사고 방식이나 구성 방법.\n\n@@color(#04f): ▣ argument @@; 인수\n테이블에서 구하는 항목이나 함수를 발견하는 데 필요한 이미 알고 있는 관련 요소(함수값을 결정하는 변수)\n\n@@color(#04f): ▣ ARPU @@; (≒아르푸) Average Revenue Per User의 준말로 한 사용자당 올리는 평균 수익을 의미
@@color(#04f): Occluder @@; 언리얼에서는 컬링이라고도 한다는데 \n게임상에서 눈앞에 벽이 있어 보이지 않더라도 벽뒤 시선의 일직선 상의 모든것을 랜더링건다. 게임을 좀더 가볍게 돌릴수 있게 하기 위해서 맵을 적절하게 등분하여 Occluder를 배치하고 일정 영역에서는 원하는 부분을 랜더링 걸지 않게 해준다.\n
@@color(#04f): Bezier Curve @@; 불규칙한 곡선을 표현하기 위해 수학적으로 만든 선.\n프랑스의 수학자 베지어에 의해 만들어진 다항식 공선의 하나로 아웃라인 문자, 스플라인 곡선, 포스트 스크립트 등 문자 데이터와 도형을 그릴 때의 자유 곡선은 이 베지어 곡선이 사용되고 있다.\n베지어 곡선은 제어점이라고 하는 몇 개의 점으로 만들어 지는데, 곡선은 최초의 제어점인 기점에서 시작하여 최후의 제어점인 종점에서 끝난다.\n기점과 종점 사이에 찍힌 제어점이 곡선 모양을 결정하며, 곡선은 제어점 위를 통과하는 것은 아니다. 기점에서 시작한 곡선은 인접한 제어점 방향으로 진행하는데, 그 옆에 있는 제어점의 영향을 받아 최초의 제어점 위를 지나가지 않고 다음의 제어점 방향에 곡선이 그려지게 된다. 결국 하중 평균이 채용되는 것이다.\n이와 같이 하여 매끄러운 곡선을 그릴 수 있고, 기점과 종점을 포함한 제어점의 갯수가 많을 수록 복잡한 곡선을 만들 수 있는데, 계산에 시간이 걸리므로 많은 것은 사용할 수 없다. 포스트스크립트는 제어점이 4개의 3차 베지어 곡선이 사용되며, 트루타입은 2차 베지어 곡선이 사용된다.\n• 상세정보 ; [[베지어 곡선|http://www.gingaminga.com/wiki/pds/ziny/Bezier.mht]] ▶ 출처; 3map.snu.ac.kr/
@@color(#04f): ▣ BitBlt @@(Bit Block Transfer)\n\n@@color(#04f): ▣ BSC @@(Base Station Controller) : 기지국 제어기\n - 여러 기지국 등을 제어하는 기능 수행 (핸드오프 등)\n@@color(#04f): ▣ BTS @@(Base Transceiver Subsystem) : 기지국 송수신기\n - 이동국과의 음성, 데이터의 실제 전송기능 수행\n - 안테나 및 탑 구조물 등\n\n@@color(#04f): ▣ BOP @@(Bottom of the paramid) 비즈니스란 @ 2011-03-12 @\n경제라는 피라미드의 하단을 뜻하는데, 주로 개도국 이하의 경제적 빈곤계층을 의미하는 말로 통용된다. 즉 BOP란 빈곤층을 대상으로 한 사업모델이다. 일단 BOP의 양적 시장규모는 합격점이다. 국제금융공사(IFC)는 소득별 인구구성에서 연간소득 3,000달러 이하의 세대를 BOP층으로 규정하는데, 그 규모는 세계인구의 약 72%(40억명)를 차지한다. 잠재적인 시장규모란 약 5조달러로 일본의 실질국내총생산에 해당하는 거액이다. 지역별로는 중동을 포함한 아시아가 최대 BOP 시장이다. 이런 점에서 BOP 시장은 포스트 신흥시장으로 불리기도 한다.\n\n@@color(#04f): ▣ BTS @@(Bug Tracking System)란 \nQA와 개발자가 발견된 소프트웨어의 버그를 추적하는 것을 돕기 위한 소프트웨어\n\n
@@color(#04f): ▣ CCW @@ (2022-06-01) \n Counter-Clockwise; 반시계 방향, 오른손좌표계 - OpenGL, 3dsMax\n@@color(#04f): ▣ CW @@ (Clockwise;시계 방향) ; 왼쪽좌표계 - Direct3D\n\n@@color(#04f): ▣ Circular Dependencies @@; 순환참조\n\n@@color(#04f): ▣ CDN @@ (Contents Delivery Network) \n원활한 다운로드를 위해서 콘텐츠 제공업자 (CP)의 웹 서버에 집중돼 있는 콘텐츠 중 용량이 크거나 사용자의 요구가 잦은 콘텐츠를 ISP측에 설치한 CDN 서버에 미리 저장, CDN 서버로부터 최적의 경로로 사용자에게 콘텐츠를 전달하는 기술. (한마디로 IDC 여러 개 두고 한쪽으로 트레픽이 너무 많이 밀릴 때 알아서 가장 속도가 빠른곳에서 다운로드를 선택 실행\n\n@@color(#04f): ▣ coat of arms @@; (가문・도시 등의 상징인) 문장\n\n@@color(#04f): ▣ color scheme @@ (컬러 스킴) ; (실내 장식•의상 따위의) 색채 설계; (일반적으로) 배색 계획\n\n@@color(#04f): ▣ customize @@; 사용자정의\n\n@@color(#04f): ▣ Context Sensitive 도움말 @@\n이용자가 처한 상황을 시스템이 판별해서 이용자에게 알맞은 도움말을 제공하는 형태를 말한다.\n\n@@color(#04f): ▣ CSS @@ (Cascading Style Sheets)는 (2014-08-25) \ndocuments가 사용자에게 어떻게 보여질가를 기술하는 언어이다.\n\n@@color(#04f): ▣ C# @@ (2014-06-25) \n__''C# Generics'' __\nC# Generics는 C++의 템플릿과 비슷한(내부 아키텍쳐는 상당한 차이점이 있다) 개념으로서 \n클래스, 인터페이스, 메서드 등에 <T> 같은 Generic 파라미터를 붙여 구현한다. 사용시에는 이 Generic 파라미터에 특정 타입을 지정하게 되는데, 실행(Runtime)시에 Generic으로부터 지정된 타입의 객체(object)를 구체적으로 생성해 사용하게 된다.\n\n__''Generic 타입 제약''__\nC# Generics를 선언할 때, 타입 파라미터가 Value Type인지, Reference 타입인지, 또는 어떤 특정 클래스로부터 파생된 타입인지 등을 지정할 수 있는데, 이는 <b>where T : 제약조건</b>과 같은 식으로 where 뒤에 제약 조건을 붙이면 가능하다.\n\n<br>\n\n
@@color(#04f): CPU @@(중앙처리장치) \n레지스터는 CPU 연산을 위한 일시적인 기억장소로서, 레지스터에 \n-.Accumulator - 데이타를 저장\n A←A+B와 같이 레지스터간의 연산으로 인한 결과값이 다시 범용 레지스터에 누적된다는 개념\n-.Pointer - 데이터의 주소를 저장\n-.Counter - 데이터의 갯수를 저장
@@color(#04f): ▣ managed C++ @@; @ 2008-03-07 @\nmanaged C++은 .NET 플랫폼에서 사용하는 C++로 기본적인 문법은 비슷하지만,\n추가된 문법 들과(박싱, 언박싱).NET 프레임워크의 사용, MSIL, 가비지 컬렉션 등이 특징이다.\nnative C++은 .NET 플랫폼을 사용하지 않는 기존의 C++을 말한다.\n\n@@color(#04f): ▣ Message box warning @@; 경고 메시지 박스\n\n@@color(#04f): ▣ MI @@; 매크로 명령어(Macro instruction)의 줄임말 @ 2020-09-10 @\n\n@@color(#04f): ▣ MMPOG @@ (Massively Multiplayer Persistent Online Games) @ 2010-03-25 @ \n수천명의 플레이어가 하나의 가상 세계를 공유하는 멀티 플레이어 게임. 이 때 캐릭터의 정보가 끊임없이 기록되며 시간에 따라 변화한다.
@@color(#04f): ▣ DAG @@(directed acyclic graph) ; 방향성 비순환 그래프 \n\n@@color(#04f): ▣ DBA @@(Database Administrator)\n\n@@color(#04f): ▣ DCC tools @@(Digital Content Creation Tools)\n\n@@color(#04f): ▣ DDA @@ 동적 난이도 조절(Dynamic Difficulty Adjustment) @ 2010-03-25 @\n플레이어의 능력에 따라 게임의 난이도를 증가 혹은 감소시키는 능력.\n\n@@color(#04f): ▣ dereferencing @@; 간접지정\n\n@@color(#04f): ▣ DLC @@ (DownLoadable Contents) @ 2017-09-06 @\n순수한 의미에서 현재 온라인상에서 내려받아서 사용하는 프로그램 모두가 DLC의 범주에 들어간다. 패키지/온라인 게임을 하면서 받는 패치도 DLC이고, 스팀에서 구매하고 내려받는 게임도 DLC이며, 아마존닷컴에서 내려받아 사용하는 소프트웨어도 DLC의 개념에 포함된다.\n\n패키지 게임에서 일반적으로 DLC는 해당 콘텐츠의 제공자에게서 인증을 직접 받아야 하기 때문에, RPG 계열과 같이 추가적으로 붙일 것이 많은 장르의 게임에게 있어서는 특히 환영받는 편이다.\n하지만 DLC는 결과적으로 본편 게임의 데이터가 파편화된 형식이기 때문에 해킹에 취약하다. 불법복제품이 모든 DLC를 포함하여 편하게 모든 콘텐츠를 이용할 수 있게 하고, 정당하게 대가를 지불한 정품구매자는 DLC의 추가구매없이는 조각빠진 게임을 할 수 밖에 없어 정품보유자임에도 불법복제품을 쓰는 부작용이 발생한다.\n\n@@color(#04f): ▣ down-casting @@; 파생, 혹은 형제 클래스의 타입으로 변환\n\n@@color(#04f): ▣ DPI @@; (dot per inch) @ 2015-05-21 @\n인치당 점의 수로 DPI는 인쇄와 관계된 설정으로, 모니터와는 전혀 상관없다.\n / 모니터상에서는 화소로 표시되기 때문에 1픽셀은 1 화소로 표시\n / 100dpi의 사진과 300dpi의 사진은 해상도가 3배 차이지만 가로 세로 점의 수가 10,000개와 90,000의 차이로 9배 차이가 난다.\n 해상도가 낮은 100dpi의 사진을 인쇄할 때 1개의 점을 찍을자리에 300dpi의 사진(해상도 3배 차이)은 9개의 점을 찍게된다. 그만큼 선명하다.\n\n픽셀이 같은 사진을 인터넷에 올려서 모니터화면으로 보면 같은 크기로 표시\n / 같은 픽셀의 사진을 인쇄할 때, 해상도가 높으면 1인치당 점의 수가 많기 때문에 더욱 촘촘히, 선명한 사진을 인쇄하지만 사진은 작게 인쇄된다.\n\n<br>
@@color(#04f): ▣ Filename extension @@; 파일 확장자\n\n@@color(#04f): ▣ Functionality @@; 기능성\n\n\n<html>\n<span style="background:#E2E2ff ; font-size: 16px;"> <b> FDB (Fixed Data Base) </b> </span>\n</html>\n출처 ; https://gamedevforever.com/160 (요약)\n\nFDB(Fixed Data Base) ; 캐릭터 파라미터, 몬스터 파라미터, 퀘스트 파라미터 등 DB에 저장할 필요 없고, 값이 고정적인 파라미터(일시적으로 변동 되긴 하지만 DB에 저장 될 필요 없는) 정보\n이런 FDB를 게임에 적용하는 방법은 기획에서 엑셀로 데이터를 작성하고, 규약 된 XML로 추출하여 파싱하거나, CSV 파일 형태로 사용하며, 보통 FDB의 작성과 관리는 리드 프로그래머의 취향에 따라 결정된다.\n\nConfig 라고 부르는 형태의 파서의 예\n\n''1.Config의 기본 형태''\n힘 : 50 / 민첩 : 25 / 지능 : 15 / 체력 : 80 / 마력 : 40 의 파라미터를 가진 인덱스 1번의 몬스터\n\nXML로 표현\n<mob>\n <index>1</index> \n <str>50</str>\n <dex>25</dex>\n <int>15</int>\n <hea>80</hea>\n <mana>40</mana>\n</mob>\n\n이를 Config 형식으로 표현 ; (필드명 필드값)을 기본 구조로, 괄호는 시작과 끝을 알려주는 중요한 구분\n@@color(#FF0000): ( inxdex 1 (str 50) (dex 25) (int 15) (hea 80) (mana : 40) ) @@\n\n하나의 몬스터의 파라미터임을 정의해주기 위해 ( index 값 (필드명 필드값) ... ) 이렇게 대괄호로 묶어주고\n괄호 열기와 괄호 닫기는 파싱의 기준이 되므로 꼭 쌍이 맞아야 한다.\n\n''2.Config의 응용 형태''\n예를 들어 최소공격력 40, 최대공격력 50 인 몬스터를 표현하면\n\n(minattack 40) (maxattack 50) 이렇게 할 수도 있지만,\n(attack 40 50) 또는 (attack (min 40) (max 50)) 등으로도 작성할 수 있다.\n\n규약의 기준은 어떤 방법으로 작성하는 것이 개발하기 편리하고 추후 가독성이 높은지를 고려하여 결정한다.\n\n''3.Config 작성 및 추출 방법''\na.엑셀에서 데이터를 입력 \n@@color(#3058D2): b.액셀에서 수식을 이용 Config 형태로 변환 @@\nc.txt 파일로 저장\n\n''4.Config 제작에 사용 된 엑셀 함수''\nConfig에는 엑셀의 IF 함수와 ISBLANK 함수를 동시에 사용하며,\n\n보통 =IF(ISBLANK(Parameter!A2), "", "("&Parameter$A$1&" "&ParameterA2&")" ) 형태의 함수인데 ISBLANK는 괄호 안에 지정 된 셀이 공백인지 확인하는 함수 입니다. 만약 공백이라면 IF에서 참으로 "", 즉 공백을 현재 셀에 반환할 것이고 지정 된 셀에 값이 있다면 거짓으로 (필드명 필드값) 형태로 값을 반환하여 현재 셀에 입력하라는 내용이다.\n\nParameter 시트에서는 한글 혹은 영문으로 표기해야 하고 Config에서는 숫자로 출력해야 하는 경우가 있습니다. 예를 들어 NPC의 종족 구분 같은 경우인데 Parameter 에서는 기획자들이 확인하기 쉽게 사람, 동물, 귀신 등으로 작성하고 싶지만 Config에서는 (species 1), (species 2) 등으로 규약 된 경우데, 이 때는 vlookup 을 이용해 간단히 해결할 수 있다.\n\n
@@color(#04f): Effect @@\nDirectX9 용어로 이펙트 effect란 정면의 출력 방법을 기술하는 스트링이다. \n 이 이펙트에서는 텍스처와 이름, 위치 및 기타 매개변수를 지정한다.\n ▷ 출처; 초보개발자를 위한 DircetX 게임 데모 프로그래밍(에이콘 발행)(p.168 5장 3D 이펙트/ 5.5 이펙트)\n\n• Bloom Effect\n• Glow Effect\n
@@color(#04f): ▣ GDC @@ 게임 개발자 회의(Game Developers Conference) @ 2010-03-25 @ \n게임 개발자들이 모여서 게임 제작과 관련된 자신들의 경험에 관해 전달하고 토론하는 연례 회의.\n\n@@color(#04f): ▣ Global Variable @@; 전역변수\n\n@@color(#04f): ▣ Glyph (glíf) @@ n.그림(도안) 표지/【건축】장식용, 세로홈/【고고학】그림 문자, 상형 문자/ ~ic a. \n\n@@color(#04f): ▣ GUI @@( Graphic user interface )\n\n
@@color(#04f): instance, instantiate @@; 인스턴스, 인스턴스화\n인스턴스는 추상화 개념 또는 클래스 객체, 컴퓨터 프로세스 등과 같은 템플릿이 실제 구현된 것이다. 인스턴스화는 클래스 내의 객체에 대해 특정한 변형을 정의하고, 이름을 붙인 다음, 그것을 물리적인 어떤 장소에 위치시키는 등의 작업을 통해, 인스턴스를 만드는 것을 의미한다.
@@color(#04f): ▣ IDC @@ (Internet Data Center)\n항온, 항습, 보안시설 등을 갖추고 인터넷 업체들에 서버를 빌려주거나 이들의 서버를 대신 관리해 주는 곳. 한마디로 서버관리 대행업체.\n\n@@color(#04f): ▣ If you are curious @@; 참고로\n\n@@color(#04f): ▣ IIS @@; @ 란? 2014-12-22 @ >> [[IIS 상태코드정리]]\n(인터넷 정보 서비스) ''Internet Information Sevices''의 약자로 MS Windows Server에서 사용하는 웹서버 Apache 웹서버에 이어 가장 많이 알려진 웹서버이며, 웹서버 이외에도 FTP/SMTP/NNTP 등을 지원 그냥 쉽게 생각해서 HTTP 프로토콜을 이용하여 웹문서를 제공하는 서버이다.\n\n다음 오류 메시지는 오류가 반환된 시점에 웹 사이트를 호스팅하는 웹 서버에 문제가 발생했음을 나타낸다.\n / HTTP 500 - 내부 서버 오류\n / Response.Status = "500 Internal Server Error"\n\n@@color(#04f): ▣ implementation @@; 구현\n\n@@color(#04f): ▣ infinite loop @@; 무한루프\n\n@@color(#04f): ▣ interpolator @@; 간단한 애니메이션 계산을 위하여 미리 만들어진 스크립트\n\n@@color(#04f): ▣ interpolator node @@; 보간자 노드, 보간 노드\n\n@@color(#04f): ▣ ISBN @@ (International Standard Book Number)국제표준 도서번호\n서적을 분류, 숫자로 표시한 세계공통의 코드. 국명, 출판사, 도서코드 등의 숫자로 표시.\n\n1. 2007년 1월 1일 부터 ISBN 자리수를 10자리 -> 13자리로 변경한 이유는\n 1970년대 ISBN시스템이 도입된 시점에 예상했던 것보다 인쇄출판물 및 전자출판물 등 출판량의 급증으로 현 ISBN시스템에서 사용할 수 있는 도서번호수가 한계에 도달하여 2007년 1월 1일 부터 전 세계적으로 ISBN 13자리를 사용한다.\n10자리 ISBN을 다 소진한 국가들은 먼저 13자리 ISBN을 사용할 수 있어서 <미국><캐나다>등의 나라들은 ISBN 13자리를 미리 시행할 예정이나, 우리나라는 전 세계 적용시점에 맞추어 2007년 1월 1일 부터 시행한다. \n\n2. ISBN 13자리 변경 내역\n• 2007년 1월 1일 부터 ISBN은 10자리에서 13자리로 변경하여 사용 \n• 기존 10자리 번호는 앞에 978을 덧붙임 \n• ISBN 13자리 숫자는 ISBN 10자리 바코드로 변환한 EAN-13 숫자와 동일\n• 기존번호에 978을 덧붙여 사용하고, 2007년부터 한국문헌번호센터에서는 979배정을 시작\n\n
@@color(#04f): 게임의 분류 @@\n* MUD(머드) ; Multiple User Dialogue / Dungeon \n** 멀티플레이가 지원되고, 그 기반에 채팅이 있으면 머드게임으로 텍스트를 기반으로 해서 오로지 텍스트를 이용해서 명령을 하고 텍스트를 통해서 모든 게임 정보를 얻고 진행\n* MUG(머그) ; Multi User Graphic \n** 기존의 텍스트형 멀티게임인 머드게임에서 발전한 형태로 멀티미디어를 포함한 머드게임을 말하고, 사이버공간내의 자신의 분신(캐릭터)의 성장을 주요 목적으로 하며, 그래픽을 통해서 자신의 캐릭터의 성장을 볼 수 있다. 수많은 타인과의 반목, 대결, 타협, 조화를 통해서 게임을 진행해 나가는 방식\n** 국내의 대표적인 머그게임으로는 ncsoft의 <리니지>, 넥슨의 <바람의 나라>, 태울의 <영웅문>, 팬택넷의 <마제스티> 등이 있다.\n* MOG ; Multiplayer Online Game (멀티플레이어 온라인 게임)\n** MOG게임의 충성도와 사용자의 소비율이 낮기때문에 이 유형의 게임은 생존압력이 매우 크며, 사용자들이 제품의 퀠러티에 대한 요구가 향상됨에 따라 MOG는 반드시 끊임없이 새로운 게임요소를 추가해야만 사용자들의 수요를 만족시킬 수 있다.\n* MMOG(엠모그) ; Massively Multiplayer Online Game (다중 멀티플레이어 온라인 게임)\n* MMORPG ; Massively Multi-user Online Role Playing Game (다중접속 온라인 롤 플레잉 게임)\n** 수백명 이상이 하나의 세계에서 게임을 즐기는 게임\n* MORPG ; Multi-user Online Role Playing Game\n** 8명 안팎의 소수 유저들이 각기 독립된 월드에 접속해서 플레이하는 ‘파티 플레이 방식’의 게임으로 대전도 하고 소수의 인원들로서 던전탐험을 하면서 성장해나가는 기반의 시스템\n*** 던전앤파이터, NC소프트의 길드워, 웹젠의 SUN, 소프트닉스의 라키온:카오스 포스, 윈디소프트의 인피니티 등 \n** 장점 ; \n*** MMORPG에 비해 낮은 접근성과 쉬운 조작법, 캐주얼게임보다 강한 몰입도와 높아진 게임성 등, 대규모 군중 속에서 소외될 수밖에 없는 MMORPG와 달리 스스로가 주연이 될 수 있는 장점이 있음\n*** MMORPG와는 다르게 엄청나게 많은 시간을 투자하지 않아도 즐길수 있다.\n** 단점 ;\n*** 단순반복의 던전파티사냥, 소수 매니아층 유저들, 무차별한 캐쉬탬 등\n* MMP game; Massively Multiplayer game(대규모 다중 플레이 게임)\n* MOD; 'Modification'의 약어로 '유저가 게임의 내용을 수정 하거나 추가한 결과물'을 말한다.\n** 다른 게임의엔진이나 구성 요소로부터 새로 구성된 게임\n** 정의상으로 보면 '유즈맵'도 분명 'MOD'에 속한다고 볼 수 있다. 사람에 따라 조금씩 다르지만 보통 'MOD'라고 이야기할 때는 단순히 맵 정도를 새로 제작하는 수준이 아닌 게임 플레이 자체를 완전히 바꾼 경우를 말한다. 높은 완성도를 가진 'MOD'는 원작과 비교해서 아예 다른 게임이라고 불러도 손색이 없다.\n** 'MOD'의 시초는 일반적으로 '캐슬 울펜슈타인(Castle Wolfenstein)'을 변형하여 만든 '캐슬 스머펜슈타인(Castle Smurfenstein)'으로 보고 있다(물론 그 이전에도 이러한 것을 만든 게이머가 없을 것이라고는 보장할 수 없기 때문에 'MOD'의 역사는 더 오래되었다고 할 수 있다). 이 게임은 원래 '울펜슈타인'의 고성에서 나치들을 상대하는 게임이지만 'MOD'에 의해 거대한 버섯성에서 스머프들을 상대하는 게임으로 변했다.\n** 이 게임이 나온 시기는 1980년대 초반이다. 마치 '유즈맵'이 발전하여 'MOD'가 등장한 것처럼 말했지만 그렇지 않다. 하지만 이 시기에는 대다수의 게이머들의 수준 문제도 있었고, 제작사들이 게임소스를 패쇄적으로 운영했기 때문에 'MOD'가 그다지 활성화 되지 못했다. 'MOD'가 활성화되기 시작한 것은 1990년대 부터다. '둠(Doom)'이나 '퀘이크(Quake)' 같은 3D게임들이 인기를 끌기 시작하면서부터 'MOD'에 대한 관심이 증폭되었고, 몇몇 회사에서 'MOD' 개발을 위한 게임엔진과 모드 툴을 개발 및 공개하면서 지금에 이르게 되었다.\n* FPS ; First Person Shooter (1인칭 슈터 게임)\n** 1인칭 시점으로 총기류 등의 무기를 사용해 이동하고 전투를 벌이는 게임 장르이다. 컴퓨터의 성능이 발전함에 따라 슈팅게임 역시 3차원 표현을 활용하게 되었으며, 이드소프트웨어(Id Software)사의 캐슬 울펜스타인(Castle Wolfenstein)이 그 효시이다. 이후 이드소프트웨어와 제작자 존 카맥(John Camack)은 일인칭슈터(First Person Shooter)라는 새로운 게임의 장르를 개척하며 둠 시리즈, 퀘이크 시리즈를 통해 이 분야의 절대 강자로 자리 잡게 되었다.\n\n* 핵 & 슬래쉬 ; hack-and-slash\n\n!!! AOS란 RPG, FPS 등의 게임 장르 중에 하나로,\nAOS라는 단어의 시초는 스타크래프트의 유즈맵인 Aeon Of Strife 의 약자로(공성전) 한 게임 안에서 캐릭터의 성장(RPG 요소), 몬스터의 사냥, 적 캐릭터와의 PVP, 아이템 구입등 전반적인 활동(RTS 요소)을 통해 전투를 이글어 나가는 장르이다.\n\n초기에 스타크래프트 유즈맵으로 시작된 AOS 는 워크래프트3를 통해 룰은 그대로 유지한채 새롭게 DOTA 라는 게임으로 변형된다.\nDOTA는 AOS 장르에 가장 큰 영향을 끼친 유즈맵이며 스타크래프트와 다르게 전투 중심이 아닌 영웅 성장을 통한 전투에 촛점을 맞춘다.\n(게임에 따라서 각각의 특성을 가진 다양한 캐릭터를 지원)\n\n워3라는 기본 게임을 바탕으로 하고 있으며 워3의 가장 큰 장점중에 하나인 영웅 시스템과 성장 시스템을 스타크래프트의 AOS와 융합하여 만들어진 산물이라 할수 있다.\n\n높은 진입장벽이 단점이다. AOS는 기본적으로 PvP를 기반으로 하고 있어서, MMORPG류의 게임처럼 초보존부터 시작해서 차근차근 게임의 재미를 알게 되고, 차근차근 스킬을 배워가며 차근차근 게임에 흡수되는 것이 아니라, AOS는 시작과 동시에 앞서 말했던 RPG의 성장, 수집, RTS의 전략, 전술, 각 캐릭터의 특성을 모두 파악하고 게임에 임해야 승리 할 수 있다. 더군다나, 상대는 유저이기 때문에 이 부분의 학습량에 대한 차이를 둘 기준이 없다.\n(참고. http://blog.naver.com/ryukilsun/130086285287 )\n\n\n!!! 유료게임의 무료/ 부분유료화 전환은\n* 유료 아이템과 게임 밸런싱을 둘러싼 기존 유료/ 신규 무료 이용자 간의 갈등 해소라는 과제를 내포하고 있어, \n** 유료로 구매한 아이템의 성능은 높이되, \n** 전체 게임 내에서의 형평성을 유지할 수 있도록 밸런스를 조절하는 것이 부분유료화 성패의 주요 요소라 할 수 있다.\n\n!! 라이브팀 역할\n소프트웨어를 유지보수하고 컨텐츠를 추가하며, 게임마스터처럼 행동하면서 게이머 손에서 제품이 언제나 새롭게 살아있게 해주는 역할을 담당\n\n!! 게임업계의 333법칙\n* 이용자가 3초 안에 게임명을 기억하게 해야 한다.\n* 또 30분 동안 이용자가 게임에 접속해 있어야 하고, \n* 접속을 종료한 뒤 3시간 전에는 이용자의 머릿속에 해당 게임이 다시 떠올라야 한다.\n\n\n!!! 웹 브라우저 게임(web browser game)\n* 웹게임(Web Game): 별도의 클라이언트를 가동하지 않고 웹 브라우저에서 바로 실행할 수 있는 모든 종류의 게임을 총칭 \n** 일반적으로는 별도의 클라이언트 프로그램을 설치하지 않고 웹 브라우저 상에서 즐기는 게임을 의미하며 <br> 텍스트 기반으로 즐기는 텍스트 머드 게임에서 유래\n** 주로 JavaScrpit 혹은 Flash로 제작하여 PC패키지 게임(CD,DVD설치)이나 온라인게임에 비해 컴퓨터 성능의 부담이 적은 게임을 칭하며, 웹표준을 지키기 때문에 Internet Explorer뿐만 아니라, Firefox, Safari 등에서도 실행 가능 \n** 웹게임은 웹브라우저만 있으면 실행될 수 있기 때문에 일반 PC 뿐만 아니라 휴대폰, 아이팟터치, IP TV등 다양한 기기에 적용이 가능\n\n* 웹게임의 장점\n ▶ 과거 PC 통신의 텍스트 입력 방식의 메드 게임에 대한 향수\n ▶ 사양이 낮은 PC나 휴대용 디바이스에서도 구동되어 언제나 접속 가능하다는 점\n ▶ 오프라인 상태에서도 웹 기반의 세계가 지속 된다는 점 \n 예) OGame, 부족전쟁, 칠용전설(중국 웹게임)\n 출처; 게임산업TREND 2008 4/4분기 고경신(엔씨소프트 Global Biz. Unit 부장)\n\n\n!!! 클라이언트기반 소셜네트워크게임(SNG)\n* 클라이언트 기반 SNG는 브라우저에서 바로 실행되는 기존 SNG와 달리 파일을 내려받아 설치하는 온라인게임의 형식을 따른다. \n** 클라이언트 기반 SNG는 게임 내에 소셜네트워크서비스(SNS)를 갖췄다. 달리 말하면, 이용자가 게임에 들어와야 SNS를 통해 상대방과 친분을 쌓을 수 있다는 얘기다. SNS 파급력이 게임 내부에 한정된다. 즉 게임을 즐기려고 접속한 이용자가 아니면, 인맥 쌓기가 어렵다.\n** 미국에서 발원된 SNG와는 시각차이가 크다. SNS플랫폼 위에서 SNG가 돌아가면서, SNS를 즐기는 이용자가 자연스레 게임에 유입되는 것과는 과정이 반대다.\n\n\n!!! 클라우드 게이밍\n오직 고속 네트워크망과 디스플레이만으로 모든 수치 연산과 파일 저장을 대신하는 원격 시스템을 통해 게임을 플레이한다.\n* 장점 ;\n** 클라이언트를 다운받을 필요가 없으며 고사양 게임을 즐기기 위해 매번 PC를 업그레이드 하지 않아도 된다.\n** 굳이 고정돼있는 PC가 아니더라도 스마트TV나 태블릿 PC등 다양한 유무선 기기들을 활용(미래의 게임 플랫폼으로 각광)\n\n!!! App Store\n* $99의 개발자 등록비만 지불하면 누구나 직접 개발한 애플리케이션 업로드 가능\n** 작년 7월 오픈 후 현재까지 25,000 여 개의 애플리케이션 등록\n** 1~7일이 소요되는 최소한의 버그테스트를 거쳐 App Store에 등록되면, 전세계 iPhone, iPod Touch 이용자들이 자유롭게 유/무료 다운로드 가능\n* 유료 애플리케이션은 제작자 : 애플이 7:3 비율로 수익 배분\n** Electronic Arts, Konami 등 글로벌 업체 및 게임빌, 컴투스 등 국내 업체 입점\n\n\n!!! PvP와 RvR (출처 : Tong - 버들마을님의 게임 이야기통)\n* 구분; PvP의 규모가 커지면 RvR이 되는 게 아니라 아군과 적군이 캐릭터 생성부터 확실한 구분되는 시스템의 지원여부가 기준\n** 자신이 특정 진영에 속할 것인지 아닌지를 플레이어가 결정할 수 있는 PvP 게임과 달리 RvR은 진영선택에 강제성을 띈다. 때문에 진영을 선택한 플레이어는 원하든 원하지 않든, 게임 내에서 확실히 구분되는 아군과 적군을 가지게 된다. 즉, 같은 캐릭터로는 진영 이동이 불가능하고 중립적인 입장도 될 수 없는 것이다. 따라서 개인보다 단체적 성향이 강하다.\n* @@color(#04f): PvP @@(Player vs Player)\n** 예) 리니지 - 몬스터를 처치해 자신의 무기와 방어구를 강화시키고 그 장비들로 공성전과 필드전을 펼치며 혈맹의 끈끈한 정을 느끼는 것\n** 개발자가 만들어 놓은 컨텐츠뿐만 아니라 유저들 스스로가 만들어가는 세력 구도가 PvP 게임의 재미이자 장점이다. 하지만 다양한 세력이 존재하기 때문에 자칫 과도한 경쟁과 감정싸움에 휘말릴 수 있다.\n** 유저들이 창조할 수 있는 범위가 넓지만 협동 부분보단 경쟁 부분이 대다수를 차지하지만, 다양한 세력 구도가 PvP의 중요한 재미인 만큼 유저들에 의해 형성되는 세력 간 관계를 지금보다 유연하게 시스템적으로 지원하게 될 것이다.\n** 게이머를 경쟁 외의 컨텐츠를 즐기기 힘들게 만들 수 있어서, 온라인 게임의 기본적인 재미 요소 중 하나인 협동’을 즐기기엔 힘들다.\n* @@color(#04f): RvR @@(Realm vs Realm)\n** 예) 월드 오브 워크래프트(와우) - 적과 아군이 뚜렸하게 나뉘어져 있으므로 상대진영을 아무런 부담 없이 공격할 수 있다. 거기에 장비보다는 플레이어의 컨트롤 실력이 승패의 많은 부분을 차지하기 때문에 액션 게임 못지 않은 재미를 선사\n** 강제성을 띄기 때문에 유저들이 만들어 가는 컨텐츠가 부족하고 세력간 인구차가 발생한다면 재미가 반감된다. 반면 진영이 확실히 구분되기 때문에 플레이어간 전투를 적극적으로 유도 할 수 있다.\n** 온라인 게임의 가장 기본적인 재미인 협동과 경쟁이 자연스럽게 녹아 있다. 공공의 적을 두고 있다는 점에서 소속감을 높일 수 있고 이런 소속감은 단합, 즉 협동으로 나타난다. 경쟁 요소는 지역을 차지하거나 승리하는 적 진영과의 전투에서 찾을 수 있다. \n** 인구비율이 맞지 않는 경우 RvR 게임의 재미가 반감되기 때문에 기울어진 인구비율을 극복하기 위해선 여러 가지 안전장치가 필요하며, 진영간 전투가 더욱 재미있고 활성화 될 수 있도록 지원하는 시스템이 필수적이다. \n
▣ 용어정리를 위해서 만든 공간으로 위키 설정에 도움을 준 현진에게 감사!\n 여기에 설치된 버전은 ccTiddly-v1.1 final 버전을 받아서 설치\n\n▣ 검색을 위해서 기본적은 tag이 필요 (예. 가, 나, ... ⇒ '목록'으로 정리)\n\nTo get started with this blank TiddlyWiki, you'll need to modify the following tiddlers:\n* SiteTitle & SiteSubtitle: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)\n* MainMenu: The menu (usually on the left)\n* DefaultTiddlers: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened\nYou'll also need to enter your username for signing your edits: <<option txtUserName>>\n\n* Text format ; 유니코드(UTF-8)\n* z0~\n\n▣ 참고사이트\n http://www.tiddlywiki.com/ - 공식사이트\n http://tiddlyvault.tiddlyspot.com/\n http://www.tiddlytools.com/#ImageSizePlugin \n http://tiddlyspot.com/?page=gallery\n
<<search>><<closeAll>><<newTiddler>><<tiddler 'LoginPanel'>><<slider chkSliderOptionsPanel OptionsPanel 'options »' 'Change TiddlyWiki advanced options'>>\n\n\n\n
출처; http://hanigamo.egloos.com/1576787\n\nsyntactic : 문법의\nsemantic : 의미의, 의미론의\nPragmatics : 어용론(語用論)\n\nSemantic은 Syntactic에 대응하는 개념입니다. Syntactic은 과학적, 규칙적인 것을 대변해서 인공의 언어, 한정된 Tag를 가지는 word를 의미하고 주로 외형에 대해서 규정하는 범위를 가지는 것 같습니다. 반면에 Semantic은 Syntactic한데 받아들여질 수 없는 것에 대한 대책으로 나오게 된 것 같습니다. Semantic은 Real word를 반영하는 것으로 이해될 수 있겠지만, 컴퓨터로 Real word를 모델링 하는 것은 곧 커다란 artificial word에 지나지 않습니다. 그러니까 Sematic은 좀 더 섬세한 인공 세상 - 자연 세상을 많이 반영한 - 을 의미할 수 밖에 없습니다. "아버지가 자동차를 먹었다"와 같은 문장은 명사, 동사, 조사 등의 단위를 인식하는 syntactic word에서는 존재할 수 있는 문장이지만, "자동차는 음식이 아니다"라는 사실을 기록해둔 Sematic world에서는 존재하기 어려운 문장이 될 것입니다. (자동차 모양의 과자를 먹었다는 것이 사실이어도 의미론에서는 어쩔수가 없겠지요... 그것을 용납해주는 수준이 의미론입니다.) 그러므로 Syntactic과 Semantic은 다루는 단위의 범위의 차이가 있을 뿐 동일한 체계를 가지고 있습니다. \n\nSemamtic의 중요 개념은 word - (concept)과 (concept) - Relation - (concept) 입니다. 어떤 단어가 어떤 개념인지와 어느 개념과 어느 개념이 어떠한 관계를 가지고 있느냐를 이용하면 Semantic이 되는 것이고 단어의 아주 상위개념 - 특히 언어적인 관점에서 - 인 단어의 품사, 그리고 위치라는 Relation을 사용하면 일반적인 Syntactic이 되는 것 같습니다. 단지 대상과 관계의 종류가 많아진 다는 것이 다른 점이라고 하여야 할 것 같습니다. 그렇다면, Sematic을 도입하려면 어떠한 일을 하면 되는 것일까 생각해 보아야 겠습니다. 그것은 명확하게 대상으로 하는 concept들을 나누어 분류하고, Relation도 나누어 분류한 후에 concept과 concept간의 relation을 규정해 주는 것이 될 것 입니다. 이것을 어려운 이야기로 Ontology구축이라고도 하는 것 같습니다.
Dead라는 말은 신호를 받지 못하고 있는 상태를 말한다.즉 신호가 전달 되지 않으니 신호가 죽은셈이다. Reckoning은 추산하다는 뜻으로 신호가 없는 동안에도 추측으로 계산한다는 것이다. \n다시말해서 신호가 없는 동안에도 이전에 받았던 신호를 바탕으로 추산해서 상태정보를 갱신한다는 것이다. \n\nDead Reckoning은 주로 플레이어의 위치정보를 갱신하는데 사용되는데,\n물론 데드 레커닝 없이 매 프레임마다 플레이어의 위치값을 주고 받을 수 있으면 좋지만.. 제한된 Bandwidth 때문에 그렇게 할 수가 없다. \n추가로 플레이어의 정보를 전달할때 현재의 위치 값 뿐만아니라 위치 값이 전달되지 않는 동안에도 위치 값을 추측하는데 데 필요한 부가적인 정보를 같이 보내한다. \n\n
참고 ; \n http://3dapi.com/bs25_shader1/ - 쉐이더 개요 \n http://attila.ac.upc.edu/wiki/index.php/D3D_ASM_shaders_translation\n -. unity, ''Shader Forge'' - A visual, node-based shader editor\n\n http://tetrackis.tistory.com/entry/0904수업\n http://www.neatware.com/lbstudio/web/hlsl.html - HLSL 샘플 \n\n• AMD GPU ShaderAnalyzer ; DX Asm, HLSL → D3D Assembly 코드로 변환\n• AMD RenderMonkey 1.82 ; HLSL → 'Disassembly'를 통해 D3D Assembly 코드로 변환\n• NVIDIA FX Composer 2.5 ; Effect File (*.fx) → ASM.txt 파일 생성\n\n{{wrappingClass{ fxc -nologo -T vs_1_1 -Fc -Vd NPRMetallic.vhl (HLSL → Assembly 코드로 저장) }}}\nD3DXMATRIX ''matWorldViewProjection'' = matWorld * matView * matProjection; \n\n\n!!! #. VS.1.1 → VS.2.0 변경시 주의점\n1.m4x3 r2,v4,c30;\n error X5478: M4x3 instruction must use destination writemask: .xyz\n → m4x3 r2.xyz,v4,c30;\n\n!!! #. PS.1.1 → PS.2.0 변경시 주의점\n1.단순 출력\n def c0, 1, 0, 0, 1\n / PS.1.1 ; mov r0, c0\n / PS.2.0 ; mov oC0, c0\n\n!!! #. Shader 레지스터\n|>|>|>| Vertex Shader |>| Pixel Shader |\n|>|입력 |>| 출력 |>| 입력 | 출력 |\n|cn | 상수 | | |cn |상수 | |\n|rn | 임시 | | |rn |임시 | |\n| | | oPos|1개의 4-float 값 동차 절단 공간에서의 출력 위치 | | |\n| | | oTn|최대 8개의 4-float 값 | tn | 텍스처 | |\n|vn | 입력 | oDn|2개의 4-float 값 (분산색(oD0)과 반영색(oD1)) |vn |색 (v0 정점 분산색/ v1 반영색) |\n| | | oPts.x|하나의 스칼라 float 출력 점 크기 레지스터 | | | |\n| | | oFog.x|하나의 스칼라 float 안개 값 | | | |\n\n!!! #. Pixel Shader\n정점 쉐이더는 변환, 조명, 안개 효과 등 래스터라이징 이전까지의 처리 과정을 프로그램 가능한 파이프라인을 이용.\n\nRasterizing 이후 만들어진 픽셀 데이터는 픽셀 처리 과정(Pixel Processing)으로 넘어갑니다. \n픽셀 처리 과정은 샘플링→ 다중 텍스처 처리 → 알파 테스트 → 깊이 테스트 → 스텐실 테스트 → 픽셀 포그 → 알파 블렌딩 순으로 진행되고 마지막에 후면 버퍼를 갱신하는 과정이다.\n\n픽셀 쉐이더는 이러한 픽셀 처리 과정 중에서 텍스처에서 색상을 추출하는 ''샘플링(Sampling)''과 ''입력된 색상을 혼합하는 다중 텍스처 처리(Multi-Texturing)''를 고정 기능 파이프라인이 아닌 프로그램 가능한 파이프라인으로 처리.\n\n\n!!! 용어\n|!DirectX |!OpenGL |\n|Vertex Shader |Vertex Programming |\n|Pixel Shader |Fragment Programming |\n|HLSL |GLSL |\n|Geometry Shader |Geometry Shader |\n|Hull Shader |Tessellation control shader |\n|Domain Shader |Tessellation Evaluation Shader |\n※ DirectX10부터는 어셈블리는 지원안됨.\n※ HLSL에서 GLSL로 번역하는 프로그램이 있기 때문에 GLSL을 따로 배울 필요는 없음.\n\n!!! DirectX ver.\n|!Direct3D |!Shader Model |!Note |\n|8.0 |1.0-1.3 |1.2, 1.3 for NVIDIA |\n|8.1 |1.4(PS)/1.1(VS) |1.4 for ATI |\n|9.0 |2.0 | |\n|9.0c |3.0 | |\n|10.0 |4.0 |Added Geometry Shaders |\n|10.1 |4.1 | |\n|11.0 |5.0 |Added Domain&Hull Shaders |\n\n#. DirectX 9.0 (2002년 12월 19일 발표)\n-. 기존 8.x버전부터 도입된 셰이더 언어의 난이도를 낮추기 위해 고수준 셰이더 언어(HLSL)를 지원하기 시작했고, 셰이더 모델 2.0으로 업그레이드됨에 따라 동시 명령어 갯수가 최대 128개로 확장\n-. 부동소수점 텍스처 포맷 지원, 다중 렌더 타겟(MRT) 지원, 다중 요소 텍스처 지원, 스텐실 버퍼 지원, 지오메트리 인스턴싱 적용, 부동소수점 GPGPU의 부분적인 지원.\n\n|!DirectX |!OpenGL |!GLSL Version |\n| |2.0 |1.10.59 |\n|DirectX 9 |OpenGL 2.1 |1.20.8 |\n|DirectX 10 |OpenGL 3.0 |1.30.10 |\n| |3.1 |1.40.08 |\n| |3.2 |1.50.11 |\n| |3.3 |3.30.6 |\n|DirectX 11 |OpenGL 4.0 |4.00.9 |\n| |4.1 |4.10.6 |\n| |4.2 |4.20.6 |\n| |4.3 |4.30.6 |\n\n\n!!! Effect\n이펙트는 쉐이더(버텍스, 픽셀, 텍스처 등)와 파이프라인이 버텍스와 픽셀 데이터를 사용하는 방법을 제어하는 파이프라인 스테이트의 결합으로, 어셈블리 언어 이펙트와 HLSL 이펙트가 있다.\n/ 스테이트(state)란 단어가 자주 사용되는데, 이는 렌더링 조건을 저장할 필요가 있는 파이프라인의 모든 정보를 포함하며, 파이프라인의 거의 모든 기능을 포함한다.\n\n* Asm 쉐이더\n* HLSL 쉐이더 (High Level Shader Language ; Microsoft에서 개발한 고수준 shader 언어)\n** C와 유사한 함수들을 사용하여 쉐이더를 개발하도록 지원하고, 유사한 것으로 OpenGL 의 GLSL 이 있고, NVidia 의 Cg 의 문법과 거의 흡사.\n** 버텍스 및 픽셀 쉐이더 그리고 이펙트까지 만들고 사용할 수 있다.\n** HLSL은 함수, 식, 문장, 표준 데이터 타입, 사용자 정의 데이터 타입, 전처리기 지시문과 같이 많은 표준적인 언어 기능을 제공.\n\n!!! Overview of graphics boards and Shader Versions\n|!Board |!Vertex Shader |!Pixel Shader |!Remarks |\n|ATI 9000 |1.1 |1.4 | |\n|ATI Radeon 9500 Pro |2.0 |2.0 | |\n|ATI Radeon 9700 |2.0 |2.0 | |\n|ATI Radeon 9700 Pro |2.0 |2.0 | |\n|ATI Radeon 9800 PRO |2.0 |2.0 | |\n|ATI Radeon X800 |2.0 |2.0 | |\n|Nvidia Riva128/TNT2/GF 256/GF2 GTS |- |- | |\n|Nvidia GF3 |1.0 |1.1 | |\n|Nvidia GeForce4 Ti 4600 |1.1 |1.3 |DX8 |\n|Nvidia GeForce FX |2.0 / vs_2_a |2.0+ / ps_2_a | |\n|Nvidia GeForce 6800 |3.0 |3.0 | |\n|Intel Integrated Graphics | | |DX7 |\n|DirectX9 REF Software Driver |3.0 |3.0 | |\n\n\n참고서적\n• Microsoft DirectX9 Programmable Graphics Pipeline(정보문화사, 2004)\n<br>
@@color(#04f): ▣ Script @@ (스크립트); 컴퓨터 프로세서나 컴파일러가 아닌 다른 프로그램에 의해 번역되고 수행되는 명령문의 집합. @ 2022-06-01\nC나 C++와 같은 언어들에 비해 제한된 능력을 지니고 실행속도도 느리지만 프로그램을 쉽고 빠르게 작성할 수 있다. 주로 제한된 능력을 가진 프로그램이나 컴파일된 기존 프로그램과 연결하여 재사용되는 프로그램들을 만드는 데 적당하다.\n\n@@color(#04f): ▣ Singleton @@ @ 2022-06-01 @\n ; C++ 클래스 단일체(singleton)는 주어진 임의의 시점에서 시스템 내에 단 하나의 인스턴스만 존재하는 객체를 가리키며, 전역 객체로써 취급된다.\n\n@@color(#04f): ▣ Signature @@ @ 2022-06-01 @\nex) The signatures and behaviors of the virtual functions in Accumulator have changed.\n(gpgstudy에 질문했을 때) 류광_님께서 주신 답글\n저는 signature를 사전 그대로 서명으로 번역하고 있습니다. 사람의 서명이 그 사람을 고유하게 식별해 주듯이 함수의 서명은 그 함수를 고유하게 식별합니다. 서명은 간단히 말하면 함수 선언입니다. 반환값 형식, 함수 이름, 매개변수 형식들 등등 전체를 서명이라고 부릅니다. 그중 하나라도 바뀌면 서명이 바뀐 것입니다. 함수 원형(prototype)이라고도 합니다.\n\n@@color(#04f): ▣ Snap Shot @@ (스냅샷) (→ 야호사전에서 펌) @ 2022-06-01 @\n모든 메모리 바이트, 하드웨어 레지스터 및 상태 표시기를 비롯하여 메모리의 현재 상태를 저장한 것. 오류 발생 시 시스템을 복원하기 위해 정기적으로 저장된다.2. 파일이 업데이트되기 전에 저장된 복사본. 저장소 관리 프로그램의 일부인 스냅샷을 사용하면 이전 버전의 파일을 다시 가져와서 검토하거나 사용할 수 있다.\n\n@@color(#04f): ▣ Spec @@ specification (보통 ~s) 설계 명세서, 시방서\n\n@@color(#04f): ▣ swap file(스왑 파일): @@ 메모리의 보조 역할을 하는 하드 디스크 내의 파일.\n 현재 필요한 리소스가 메모리 상에 없을 경우 스왑 파일로부터 찾아서 메모리에 올리며, 메모리가 부족할 경우 당장 필요하지 않은 리소스를 메모리로부터 해제한다.\n\n\n
@@color(#04f): ROPs @@ = Raster래스터 Operations오퍼레이션 Pipelines파이프라인\n = Render랜더 Output아웃풋 Pipelines파이프라인 \n = Render랜더 Output아웃풋 Units유닛\n\n@@color(#04f): ▣ RDP @@ (Remote Desktop Protocol)는 @ 2015-01-07 @\nMicrosoft에서 개발한 원격 데스크톱 프로토콜이다.\nRDP를 이용해서 외부에서 PC를 제어해서 문서작성이나 웹서핑 등 비교적 간단한 작업은 원활히 이용 가능하지만\n게임이나 동영상 노래재생 등 멀티미디어 부분에 있어서는 이용이 어렵다.\n\n@@color(#04f): ▣ RPG @@ 롤플레잉 게임(Role-Playing Game) @ 2010-03-25 @\n예전에는 종이와 주사위를 가지고 즐겨던 판타지 게임을 가리켰고, 나중에는 그런 게임의 관습을 따르는 컴퓨터 게임 장르를 가리키는 용어로 바뀌었다. ULTIMA나 WIZARD 시리즈가 좋은 예다. 혹은 로켓 추진 수류탄(rocket-propelled grenade)의 약어로도 사용된다.\n\n@@color(#04f): ▣ RTS @@ 실시간 전략 게임(Real-Time Stategy) @ 2010-03-25 @\n끊임 없이 진행되는 액션을 통해 벌어지는 대규모 군사 전투를 묘사하는 게임 장르이며 턴 방식(turn-based) 게임과 대비된다. Westwood의 DUNE II가 초기 작품이다.\n
@@color(#04f): ▣ 타임 박싱 @@(Time Boxing)은\n 작업을 끝내는 기간으로써, 종료일은 고정되어 바뀌지 않는다. 팀이 종료일을 초과하면, 작업은 실패한 것으로 간주하거나, 취소 혹은 일정을 재조정한다.\n\n@@color(#04f): ▣ 터치 제너레이션 @@(Touch! Generations)은\n콘솔 게임의 정의를 확대시킨 닌텐도의 소프트웨어 라인업을 일컫는 용어다.\n강아지를 키우고, 뇌를 단련하고, 영어를 배우고, 요리를 만들고, 본격적인 피트니스나 악기 연주를 즐기는 등 지금까지 게임과는 무관하다고 여겨졌던 테마를 닌텐도 DS와 위를 통해 게임의 형태로 하나하나 실현시킨 것을 말한다.\n\n@@color(#04f): ▣ 테이스테셔널 @@(Tastessional : TASTE + professional)은 @ 2016-01-29 @\n취향이 전문성이 된 사람들을 일컫는다. 취향에 대한 탐닉이야 말로 아마추어를 특별한 전문가로 만들기도 한다. 이제 그들을 테이스테셔널이라 부르기로 하겠다. 아니, 뭘로 부르건 그건 중요치 않다. 중요한 건 취향이 깊어지면 특별한 전문성이 되고, 그 전문성을 세상이 인정하고 있다는 것이다.\n\n@@color(#04f): ▣ 텍스처 @@(texture) @ 2010-03-25 @\n폴리곤 모델에 색상과 셈세함을 더하기 위해 덧씌워지는 2차원 그래픽 이미지. 캐릭터 모델에 적용될 때는 종증 스킨(skin)이라고 불린다.\n\n@@color(#04f): ▣ 턴 방식 @@(turn-based) @ 2010-03-25 @\n특정한 조건이 만족될 때(예를 들어 모든 플레이어가 자신의 캐릭터를 옮겨놓았을 때) 다음의 분리된 라운드로 넘어가는 방식.\n\n@@color(#04f): ▣ 팀빌딩 @@(team building)이란\n집단이 과제를 달성하는 방식을 개선하도록 도움을 주고 집단구성원들이 대인기술과 문제해결기술을 강화하도록 도움을 주는 광범위한 계획적 활동이다(Cummings & Worley, 2001). \n 팀빌딩의 목적은 응집성, 상호협력 및 조직과의 일체감을 높임으로써 팀의 효과성을 높이는데 있다. 팀빌딩은 조직의 영구적이거나 일시적인 집단 또는 팀에서 팀워크와 과제달성을 개선하기 위한 효과적인 접근이 되고 있다. 팀빌딩을 통해 문제해결집단은 구성원이 가진 자원과 기여를 최대로 활용할 수 있으며, 어떤 구체적인 문제들을 극복할 수 있게 된다. \n 팀빌딩은 단독으로 사용할 수도 있지만, 종업원 참여, 직무설계, 구조개편 등과 같은 다른 조직개발 개입기법들의 효과를 높이기 위해 사용할 수도 있다. 팀빌딩을 통해 효과적인 변화 프로그램을 설계하는데 도움이 되며, 조직구성원들이 이러한 변화 프로그램들을 수용하고 실행하도록 보장해준다. \n
@@color(#04f): ▣ PB 브랜드 @@ (유통업체브랜드 Private Brand 또는 PL, Private Label)란 @ 2016-10-23 @\n유통업체가 직접 개발 관리하는 브랜드로서 브랜드 소유권을 유통업체가 갖는 의미가 있다. 전통적으로 브랜드(상품)는 제조업체가 개발하여 생산하면, 유통업체는 이를 판매하는 방식이었으나 PB는 유통업체가 상품에 대한 생산과 판매를 통합, 관리하는 것을 뜻한다.\n유럽은 전체적으로 약 40% 수준인데, 영국의 테스코(Tesco) 매장은 PB 구성이 최소 50%이며, 미국은 이보다 적은 22% 수준이다. 한국은 최근들어 20~25% 수준인데, 대형점포를 중심으로 더 늘어날 추세이다.\n특별히 의류업체에서 PB는 절대 강자이다. 스페인의 자라, 스웨던의 H&M, 일본의 유니클로 등은 SPA(Specialty Store Retailer of Private Label Apparel)라 블리는데, SPA란 상품의 기획, 생산(자체 또는 아웃소싱), 판매 등을 한 회사에서 모두 담당하고, 생산된 의류를 그 회사(유통회사)의 자체브랜드를 붙여 판매하는 소매점을 말한다. 이는 좋은 품질의 의류를 저렴한 가격에 공급할 수 있도록 중간상 단계를 없에 제조업과 유통업의 통합체를 의미한다.\n최소의 PB브랜드라 할 수 있는 '피코크(Peacock)'는 2023년까지 상품수 1,500개를 목표로 하는데 그전에 목표를 달성할 기세로 수가 늘어나고 있다.\n\n+++[#. 가격과 품질에 따라 4가지로 PB 구분 ]\nPB는 NB(Natioal Brand, 제조업체 브랜드)와의 비교에 있어 가격과 품질 격차에 따라 4가지로 구분된다.\n<html> <LEFT>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/shinbo_1610_35.jpg" width=640>\n</LEFT> </html>\n 첫째, 제네릭스(Generics)는 가격과 품질 면에서 모두 NB보다 뒤떨어지는 상품이다. 보통은 특정 브랜드가 없는 경우에 제네릭스라고 한다. 이는 브랜드 마케팅비용이 발생하지 않으므로 대체로 가격을 매우 낮게 매긴다. 과거 신선식품점에서는 채소, 과일 등은 브랜드가 없다고 생각하여 제네릭스 판매를 하지 하였으나, 오늘날에는 신선식품재료의 경우에도 친환경 표시나 유기농임을 강조하는 특정 브랜드를 붙이는 경향이 늘고 있다.\n 둘째, 모방 PB상품(Copycat brand)은 품질은 조금 떨어지는 반면 가격이 20~30% 할인된 PB이다. 많은 유통업체들의 PB상품들이 이어 해당된다.\n 셋째, 프리미엄급 PB상품(Premium lite brand)인데 이는 품질은 더 좋으나 가격이 같은 상품을 말한다. 브랜드 인지도가 낮기 때문에 NB 상품의 동일가격대와 비교하면 해당 PB 상품이 더 나은 품질이라고 소비자가 인지할 수 있어야 성공할 것이다.\n 마지막 네 번째는 프리미엄 PB상품(Premium brand)으로서 고품질이면서도 가격이 더 비싼 상품을 말한다. 대표적으로는 프레지던트 초이스(President Choice), 테스코 파이니스트(Tesco Finest) 등이다. 이는 소비자의 품질 자체에 대한 중요도 인식수준이 높거나 유통업체에 대한 충성도가 높은 경우에 성공한다.\n===\n\n #. 최신 트랜드를 창조하는 PB상품\n #. 유통업체엔 기회인 반면 제조업체엔 위기\n\n@@color(#04f): ▣ PIE 원칙 @@ (Program Intently and Expressively)\n작성하는 코드는 의도를 명확히 전달하고, 반드시 의미가 있어야 한다. 이렇게 하면, 읽기 쉽고 이해하기 쉬운 코드가 될 것이다. 코드가 혼란스럽지 않기 때문에, 잠재적인 에러도 피할 것이다. 의도적이고, 의미 있게 프로그램 하라.\n\n@@color(#04f): ▣ protected와 private의 차이 @@ @ 2022-06-01 @\npublic으로 선언된 멤버 변수와 함수는 클래서 내부와 외부에서 사용할 수 있지만,\n클래스에서 선언된 protected로 선언된 것은 파생 클래스의 내부에서 사용할 수 있다. 기반 클래스에서 private로 선언된 멤버는 파생 클래스에서 내부적으로 사용할 수 없으며, 기반 클래스에서 private으로 선언된 멤버는 파생 클래스로 상속은 되지만 파생 클래스에서 참조만 할 수 없다는 것이다.\n\n@@color(#04f): ▣ POP3 @@ (Post Office Protocol 3) @ 2015-06-18 @\n메일프로그램을 이용해 메일을 사용 가능하도록 하는 것으로 여러 곳의 메일을 한 곳에서 확인할 수 있는 통신규약(프로토콜).\n사용자(또는 전자우편 수신용 클라이언트 프로그램)는 주기적으로 서버에 있는 자신의 메일 수신함을 점검하고, 만약 수신된 메일이 있으면 클라이언트 쪽으로 다운로드 한다. \n\nPOP3는 '보관하고 전달하는' 서비스라고 생각할 수 있으며, IMAP은 원격지 파일서버라고 생각할 수 있다. \n\nPOP과 IMAP은 둘 모두 전자우편을 받는 일을 담당하므로, 인터넷을 통해 전자우편을 전달하는 프로토콜인 SMTP와 혼동해서는 안된다. 송신자가 SMTP를 이용해서 메일을 보내면, 상대방 메일서버에 있는 메일처리기가 수신자를 대신해서 그것을 수신한다. 그리고 난 뒤 그 메일을 POP이나 IMAP을 이용하여 수신자가 읽게 된다.\n\n@@color(#04f): ▣ POP3 @@ (Post Office Protocol 3) @ 2022-06-01 @\n\n\n\n
@@color(#04f): ▣ 마샬링 @@(Marshalling)은 @ 2014-08-19 @\n컴퓨터 프로그래밍에서, 마샬링은 하나 이상의 프로그램 또는 연속되어 있지 않은 저장 공간으로부터 데이터를 모은 다음, 데이터들을 메시지 버퍼에 집어넣고, 특정 수신기나 프로그래밍 인터페이스에 맞도록 그 데이터를 조직화하거나, 미리 정해진 다른 형식으로 변환하는 과정을 말한다. \n\n마샬링은 대체로, 어떤 한 언어로 작성된 프로그램의 출력 매개변수들을, 다른 언어로 작성된 프로그램의 입력으로 전달해야 하는 경우에 필요하다. \n\n@@color(#04f): ▣ 마일스톤 @@(Milestone)은\n자연석에 목적지까지의 남은 거리와 방 향을 새겨 놓은 표지석\n즉, 이정표를 뜻 하기도 하며, 또한 인생, 역사 등의 중대 시점, 획기적인 사건을 뜻하기도 한다.\n\n@@color(#04f): ▣ 말 @@ [명사] \n사람의 생각이나 느낌 따위를 표현하고 전달하는 데 쓰는 음성 기호. 곧 사람의 생각이나 느낌 따위를 목구멍을 통하여 조직적으로 나타내는 소리를 가리킨다. \n\n@@color(#04f): ▣ 매시업 @@ (Mashup)\n매시업은 1960년대부터 음악계에서 쓰이던 용어, 다른 가수의 히트곡 여러 개에서 일정 구절을 따서 이를 섞어 새로운 노래를 만든다는 의미이다. 최근엔 음악뿐만 아니라 동영상, 사전, 컴퓨터 프로그램, 애플리케이션 등의 창조물을 섞어 완전히 새로운 창조물을 만들어낸다는 뜻으로 쓰인다.\n\n@@color(#04f): ▣ 모두발언 @@ 은 책으로 말한다면 머릿말과 같다.\n모두발언은 토론회에서 자주 들을 수 있는데, 본 토론에 들어가기 전에 참여한 토론자들이 순서에 따라 돌아가면서 주제에 대한 자기의 주의, 주장을 요점정리 식으로 말하는 것을 뜻한다.\n\n@@color(#04f): ▣ 모션 캡처 @@ (motion capture)\n실제생명체(보통은 사람)로부터 애니메이션 정보를 얻어내는 기법.\n\n@@color(#04f): ▣ 모티파이슨 @@ (Monty Python)\n1970년대 초반까지 큰 인기를 끌었던 영국의 코미디 <Month Python's Flying Gircus>에 단골로 출연했고, 그외 다수의 극장용 영화를 만든 코미디 창작 집단\n\n@@color(#04f): ▣ 미켈란젤로 동기 @@\n미켈란젤로는 1508년 교황 율리우스 2세의 명령에 따라 그 넓이가 600평방미터나 되는 시스티나 성당에 불후의 명작인 천지창조를 그린 르네상스를 대표하는 화가로 자신의 작품에 대한 굉장한 자부심과 함께 자신의 일을 즐겼던 사람입니다. 그는 그 작업을 위해 사람들의 성당출입을 금하고 4년 동안이나 성당에 틀어 박혀서 오직 그림을 그리는 일에 전념했습니다. \n\n창의적이고 진취적인 사람들은 돈이나 명예를 얻기 위해서 일을 하는 것이 아니라 단지 일이 좋아서 그 일을 즐거움으로 한다고 합니다. 이것이 바로 우리 안에 존재하는 내적동기입니다. 누군가가 자신을 알아주기를 바라는 마음없이 자기 자신만은 너무도 잘 알고 있기에 온 힘을 기울여 최선을 다하는 내적동기를 '미켈란젤로 동기'라고 부릅니다.
| 기호 | 설명 | 기타 |\n| MX | 보급형이라는데 중점적인 의미를 두고있습니다. (보급형 그래픽카드) | 대표모델 : Geforce MX4000, Geforce2 MX400, Geforce4 MX440 |\n| Ti | 2, 3, 4 시리즈중 고급형 모델 입니다. | 대표모델 : Geforce4 Ti4200, Geforce4 Ti4400, Geforce4 Ti4600 |\n| FX | Geforce5 시리즈 모델의 단독적인 이름입니다. | |\n| LE | Low Edition), 보급형 모델로 만들기위해 클럭을 낮추거나 혹은 메모리의 비트수를 내리는 경우이다. | 대표모델 : Geforce FX5700LE, Geforce 6600LE, Geforce 6800LE |\n| XT | (eXtenTion Edition), 값비싼 그래픽카드의 값을 낮춰 많은 이들이 재빠른 3D게임을 할 수 있도록 한다는 의미입니다.LE와 비슷한 개념입니다. | 대표모델 : Geforce FX5900XT |\n| GE | (Gamer(Great) Edition), 게이머들에게 좀더 좋은 성능의 그래픽카드를 주기 위하여 오버클럭을 하여서 상위모델과 비슷한 성능을 내는 그래픽카드에 업체에서 붙여준 것이다. nVIDIA의 정식모델이 아니다. | 대표모델 : Geforce 6600GE |\n| GS | GS가 왜 없지 GT보다 떨어짐... | |\n| GT | (GreaT edition), 중급이상 성능의 그래픽카드에 붙는 이름입니다. | 대표모델 : Geforce 6600GT, Geforce 7600GT, Geforce 8600GT |\n| GTS | (GreaT Stream) 중상급의 성능을 냅니다. | |\n| GTX | (Grand eXtreme Edition), GT보다 상위개념, Extreme이 과격한, 극도의 뜻을 내포하고 있음으로 이는 성능이 높은 그래픽카드에 쓰인다. | 대표모델 : Geforce 7800GTX |\n| Ultra | (Ultra edition), 몇몇 시리즈 라인업 중 최상급의 그래픽카드에 쓰인다. | |\n
@@color(#04f): ▣ 다샹(打赏) @@ 중국 온라인 팁문화 (신용사회 2016.11.) @ 2017-01-09 @\n중국에서 온라인으로 팁을 주는 것을 중국어로 'da shang(打赏)', 또는 'shang(赏)'이라고 부른다. 다샹은 과거 광대들이 거리에서 길거리 공연을 하며 입장료 대신 관중들이 자발적으로 주는 팁을 받았던 것처럼, 본래 고대 중국에서는 윗사람이 아랫사람에게 수여하는 보상금의 의미로 쓰였다. 현대 다샹의 의미는 온라인에 새롭게 등장한 일종의 비강제적 지불 방식으로, 서비스 또는 온라인에 등록된 글, 사진, 영상 중 이용자가 만족을 느낀 창작 콘텐츠에 대해 원작자에 대한 일종의 장려금(팁)으로 감사를 표시하는 것으로 정의 내려졌다.\n이러한 새로운 추세에 따라, 웨이보(2014) 등을 출발점으로 웨이신(2015), 알리페이(2015), 디디추싱(2016) 등 대부분의 중국 유명 온라인 플랫폼들이 다샹 기능을 추가하고 있다.\n다샹은 다양한 산업과 맞물려 주 활용 영역을 넓히고 있다. 다샹 + 언론, 문학 관련 플랫폼, 댜상 + 엔터테이먼트 산업, 다샹 + 서비스산업이다.\n\n@@color(#04f): ▣ 대시보드 @@(dashboard)/ 전산실관리솔루션\nIT대시보드는 기업 IT자원의 안정적인 운영을 위해 시스템 운영현황을 한눈에 파악하여 장애예측을 통한 예방 및 진단, 원인분석을 효과적으로 수행할 수 있도록 하는 솔루션.\n\nIT대시보드는 복잡하고 다양한 IT자원 현황을 운영자관점에서 직관적이고 통합적으로 파악하기 위해, 다이나믹한 화면으로 표현되어야 하며, 실시간 데이터관리를 위한 분산처리환경이 필요합니다. 또한 운영자가 원하는 정보를 언제든지 제공할 수 있도록 손쉬운 화면생성기능과 함께 추가적인 확장이 용이해야 한다.\n\n@@color(#04f): ▣ 대화 @@(對話) [명사] \n마주 대하여 이야기를 주고받음. 또는 그 이야기.\n\n@@color(#04f): ▣ 데쓰매치 @@ (deathmatch) @ 2010-03-25 @\n1인칭 슈팅 게임의 플레이어 대 플레이어(PvP; Player vs. Player) 모드에서 사용되는 매력적인 신조어; 나중에는 실시간 전략 게임과 같은 다른 장르에까지 폭 넓게 사용됨.\n\n@@color(#04f): ▣ 데이터 @@ (data) @ 2010-03-25 @\n지형 구조나 음성 대화 등의 게임 컨텐트. 그것을 조작하며 표시하는데 사용되는 소프트웨어와 구별되는 개념이다.\n\n@@color(#04f): ▣ 디자인 아이덴티티 @@ (신용사회 2019.06. Vol.441) @ 2019-07-19 @\n@@color(#C7254E): 1.고유성 확보 ; @@ 시장 진입을 최초로 하는 제품인 경우는 그 형상( 디자인 이미지 )에서 반드시 혁신성과 심미성을 동시에 확보해야 한다.\n@@color(#C7254E): 2.동질성 확보 ; @@ 명품 브랜드의 공통점, 중소기업들이 장기적인 관점에서 살아남기 위해서는 라인업 전체 상품의 동질적 요소를 적용한 디자인 계통(가족력)을 확보하고, 혁신성을 확보한 디자인 진화를 주도할 수 있는 전략과 골격을 유지해야 한다.\n@@color(#C7254E): 3.지속성 확보 ; @@ 제품의 라인업 체계를 기술과 성능을 중심으로 구축하기 보다는 형상과 유전적 조형 이미지를 기준으로 포트폴리오를 구성해야한다는 것이다.\n\n\n
@@color(#04f): ▣ ''게임 플레이'' @@ (gameplay) @ 2010-03-25 @\n플레이어가 게임에서 하는 일, 활동, 도전 등을 표현하는 다소 모호한 단어. 이를 지원하는 기술 및 그래픽 작업과 대비된다.\n\n@@color(#04f): ▣ ''공유경제''는 @@ @ 2016-10-31 @\n공유할 수 있는 물품과 서비스를 빌려줌으로써 수익을 내는 경제활동이다. 남는 자원과 자산을, 이를 필요로 하는 타인과 함께 활용하는 공유경제는 다양한 규모와 방식으로 진화하고 있다. 공유경제의 기초는 거래의 통화수단인 신뢰라는 주춧돌이다. 그리고 그 신뢰라는 '사회적 자본'은 과거로부터 축적된 거래이력으로부터 나온다.\n공유경제는 무수히 많은 것들 중 특히 유휴한 인간의 재능과 경험, 공간, 시간, 정보, 물건 등을 각각 또는 융합, 복합화해 목적한 경제를 실천하고 있다. 이러한 것들을 '순열(일정 순서대로 나열하는 일)'로 표시하면 거의 무한대의 사례와 비즈니스모델, 일자리가 파생된다.\n\n ''국내 주요 공유경제 서비스와 공유 품목''\n|브랜드 |거래 및 공유 품목 |홈페이지 |\n|쏘시오 |생활 숙 모든 제품 |www.ssocio.com |\n|쏘카 |자동자 |www.socar.kr |\n|모두의 주차장 |주차장 |www.moduparking.com |\n|키플 |아동 의류 |www.kiple.net |\n|스테이즈 |숙박 |www.stayes.com |\n|헬로마켓 |중고거래 |www.hellomarket.com |\n|집밥 |소셜다이닝 |www.zipbob.net |\n|스페이스쉐어 |공간 |spaceshare.kr |\n|짐카 |이사 |zimcar.kr |\n|열린 옷장 |정장 |www.theopencloset.net |\n|코자자 |숙박 |www.kozaza.com |\n|오픈컬리지 |지식/ 경험 |www.opencollege.kr |\n\n@@color(#04f): ▣ ''과거불 (過去佛)'' @@ (gameplay) @ 2015-06-11 @\n흔히 "석존"이전에 나타났다고 하는 6명의 부처님을 가리키며 석존을 포함하여 과거 7불 이라고 한다.\n\n비바시부처님(毘婆尸佛) ; 과거 91겁 전 사람의 수명이 8만4천세 였을때 출현 하셨다.\n (3회의 설법으로 24만8천인을 제도 하셨다 한다.)\n시기부처님(尸棄佛) ; 과거 31겁 전 사람들의 수명이 7만세때 출현하시어 3회에 걸처 설법하시고 \n (25만의 중생을 제도 하셨다 한다.)\n비사부부처님(毘舍浮佛) ; 역시 과거31겁 전에 출현 하시어.\n (2회 설법으로 13만인을 제도 하시었다 한다.) \n구류손부처님(拘留孫佛) ; 현재의 현겁(現劫) 중에 출현하시어 .\n (1회설법에.4만의 비구를 교화 하셨다함.당시의수명은4만세라함).\n구나함모니부처님(拘那含牟尼佛) ; 현겁중 사람의수명이 3만세때. 출현 하시어.\n (1회 설법에 3만의 비구를 제도 하셨다함.)\n가섭부처님(迦葉佛) ; 현겁중 사람의수명이 2만세때 출현 하시어.\n (1회 설법으로 2만명의 제자를 제도 하셨다함.)\n석가모니부처님(釋迦牟尼佛)\n\n이 과거불에 대한 구체적인 기사( 출신. 부모. 자식. 제자..성도한 나무의 이름 등)은 "장아함경의벽두인[대본경]에 자세히 소개 되어 있다.\n\n@@color(#04f): ▣ ''기술'' @@ (technology) @ 2011-06-28 @\n사람들이 ''노동과 원자재를 결합해 상품과 서비스를 만들어내는 방법을 결정하는 모든 요인들''을 지칭한다. \n기술에는 청사진이나 제조 비법이 아니라 부패의 수준, 경영진이 직원을 대하는 태도, 투자자에 대한 법률적 보호, 경쟁 환경에 대한 문화의 영향력, 근로자의 창의성에 영향을 미치는 교육적 전통 등 수많은 요인들이 포함된다.\n\n@@color(#04f): ▣ ''기술마케팅'' @@ 은 @ 2016-06-17 @\n핵심적인 기술개발은 완성되었는데 고객의 구매는 발생되지 않는 격차를 이해하고 이를 해결할 수 있는 과제를 실현하기 위한 전략적 활동.\n특히 현재까지의 기술마케팅은 협의의 관점에서 기술적인 개발과 제품 설계작업이 완성된 이후의 단계에서 참여하여 시장에 제품을 출시하는 전략을 수립하는 제한적인 활동이었다면, 현재부터 미래의 바람직한 기술마케팅은 광의의 관점에서 기술개발이 시작되는 첫 단계부터 참여하여 고객들의 수요를 정확하게 반영하는 기술개발이 진행될 수 있도록 기술개발의 방향성과 전략적인 혁신의견을 제시하고 기술개발의 전체적인 과정이 기업의 성과향상에 직접적인 기여를 할 수 있도록 관리히고 과정상의 적절한 위험을 통제하는 범위로 확대될 필요성이 있는 활동이라고 정의할 수 있다.\n\n@@color(#04f): ▣ ''기조발언'' @@ 은 토론에 앞서 자신이 주장할 전체적인 내용에 대해 큰 틀을 제시하는 것으로, \n 예를들면 토론이 찬성/반대의 형태로 나타난다면 기조발언으로 찬성 혹은 반대의 입장을 밝히고 토론시에 내가 왜 찬성을 하는지에 대한 자세한 내용을 말하는 것이다.\n\n
@@color(#04f): ▣ 1인칭 슈팅 게임 @@ (first-person shooter) @ 2010-03-25 @\n플레이어가 적들로 가득 찬 3차원 세계 안을 돌아다니는 유명한 게임 장르. 플레이어는 머리 높이에 장착된 카메라를 통해 세계를 조망하며, 이러한 시야는 사격 조준기로서의 역할도 함께 한다. Id Software의 CASTLE WOLFENSTEIN 3D가 아마도 첫 번째 예가 될 것이다.\n\n@@color(#04f): ▣ 1인칭 스니커 @@ (first-person sneaker) @ 2010-03-25 @\n플레이어가 목표를 달성하는데 있어 전투보다 잠행(stealth)이 보다 중요하게 사용되는 1인칭 시점의 게임을 이른다. Looking Glass Studios의 THIEF 시리즈가 아마도 가장 돋보이는 예가 될 것이다.\n\n@@color(#04f): ▣ 아티팩트 @@ (artifacts)는 의도하지 않게 생기는 부가적인 효과. \n 단어 자체는 중립적이지만 결과적으로 부산물이 생겨 부정적인 효과를 가져오는 게 일반적이다. 압축이 심한 JPG 이미지에 생기는 지저분한 픽셀이 대표적인 예이다.\n\n@@color(#04f): ▣ 아임스타즈 @@ (IMStars.or.kr) @ 2016-10-31 @\nIdea Made Stars(아이디어가 스타를 만든다)의 줄임말로 우수 중소기업 제품이 시장진출을 통해 스타상품으로 거듭나도록 지원하는 사업이다. 유통 MD가 좋은 상품을 발굴하기 위해 우수 중소기업 제품을 쉽게 검색할 수 있게 하고 개별기업 상담도 빠르게 진행해 중소기업과 대형 유통업체를 효율적으로 연결해준다.\n+++[아이스타즈는 중소기업 유통지원 포털사이트 ]\n중소기업은 자사 상품을 사이트에 직접 등록할 수 있으며, 선별과정을 통해 '표준화 DB'제품으로 선정되면 상표개발, 온라인 상세 페이지 및 홍보 동영상 제작 등 홍보ㆍ마케팅 지원은 물론 판매처까지 확보할 수 있다.\n<html> <LEFT>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/shinbo_1609_67.jpg" width=640>\n</LEFT> </html>\n===\n\n\n@@color(#04f): ▣ 알트 입력법 @@ (Alt code) @ 2015-09-22 @\n알트 키와 숫자키패드를 이용하여 문자(특히 특수문자)를 입력하는 방식. 키보드에 할당되지 않은 문자를 입력하는 데 유용하며, 종종 유일한 방법이 된다.\n / 알트 키를 누른 채로, 입력하려는 문자에 해당하는 값을 누른 다음, 알트 키에서 손을 떼면 된다. \n\n@@color(#04f): ▣ 어뷰징 @@ (abusing) @ 2014-12-18 @\nabuse의 현재 진행형으로 사전적인 의미로는 오용/남용/악용 을 의미한다.\n대체적으로 게임상에서 어뷰징은 개발자의 의도대로 진행하지 않고 짜고치는 행위를 뜻한다.\n\n인터넷 포털 사이트에서 언론사가 의도적으로 검색을 통한 클릭수를 늘리기 위해 동일한 제목의 기사를 지속적으로 전송하거나 인기검색어를 올리기 위해 클릭수를 조작하는 것 등이 이에 해당된다.\n\n@@color(#04f): ▣ 엔진 @@ (engine) @ 2010-03-25 @\n게임 내 환경을 표시하고 기본적인 기능을 규정하는 핵심 시스템; 데이터와 구별되는 개념.\n\n@@color(#04f): ▣ 온디맨드 경제 @@ (On-Demand Economy) @ 2016-10-31 @\n모바일과 온라인 시장에서 소비자의 수요, 즉 주문(Demand)이 공급을 결정한다고 하여 온디맨드 경제라고 불린다. IT의 비약적인 발전과 생활방식의 변화가 불러온 이 시스템은 하나의 경제라고 불릴 만큼 우리 생활에 깊숙이 침투하고 있다. 가파르게 성장한 음식 주문 대행업체를 비롯해 의료, 법률, 금융에 이르기까지, 그 분야도 방대하다. 이미 확보된 재화를 소비자에게 공급하는 공유경제와 혼용되고 있으나 온디맨드 경제의 경우 ''소비자 소요의 맞춤형 서비스가 제공''된다. 소비자가 가격결정의 주도권까지 갖는다는 점에서 큰 차이가 있다.\n\n@@color(#04f): ▣ 와르넷 @@ (warnet) @ 2010-07-14 @\n인도네시아에 있는 일종의 피시방. 가게를 의미하는 와룽(warung)과 인터넷(internet)의 합성어.\n\n@@color(#04f): ▣ 왕홍 @@ (網紅) @ 2017-01-25 @\n인터넷을 뜻하는 왕뤄(網絡)와 스타를 뜻하는 홍론(紅人)의 조합어인 '왕뤄홍런(網絡紅人, 인터넷 스타)'의 줄임말로 이들은 인터넷 플랫폼을 기반으로 활동하며 특정 분야의 전문가로 성장해 중국 온라인 시장의 트랜드를 주도하고 있다.\n\n@@color(#04f): ▣ 외래어 표기법 > 규정보기 @@ (국립국어원) @ 2017-09-01 @\n제1항 ; 외래어는 국어의 현용 24 자모만으로 적는다.\n제2항 ; 외래어의 1 음운은 원칙적으로 1 기호로 적는다.\n제3항 ; 받침에는 ‘ㄱ, ㄴ, ㄹ, ㅁ, ㅂ, ㅅ, ㅇ’만을 쓴다.\n제4항 ; 파열음 표기에는 된소리를 쓰지 않는 것을 원칙으로 한다.\n제5항 ; 이미 굳어진 외래어는 관용으로 존중하되, 그 범위와 용례는 따로 정한다.\n\n@@color(#04f): ▣ 유비쿼터스 @@ (Ubiquitous)란 @ 2010-12-06 @\n'언제 어디에나 존재한다'는 뜻의 라틴어로, 사용자가 컴퓨터나 네트워크를 의식하지 않고 장소에 상관없이 자유롭게 네트워크에 접속할 수 있는 환경을 말한다.\n\n@@color(#04f): ▣ 익스플로잇 @@ (exploit) @ 2010-03-25 @\n(특히 온라인 게임에서) 플레이어가 불공평한 이익이나 보상을 얻을 수 있도록 방치된 게임 내부의 결점.\n\n@@color(#04f): ▣ 인간개발지수 @@ \n유엔 국제연합개발계획이 매년 세계 각국의 문맹률, 평균수명, 1인당 실질 국민소득 등 인간의 삶과 관련된 여러 가지 지표를 조사해 인간개발 성취 정도를 평가하는 지수를 말한다. 인간의 행복이나 발전 정도는 소득 수준과 비례하지 않고, 소득을 얼마나 현명하게 사용하느냐에 달려 있음을 보여주는 지수다.\n\n
@@color(#04f): ▣ 패치 @@ (patch) @ 2010-03-25 @\n이미 출시된 제품의 문제점을 수정하는 소프트웨어. 버그를 수정하고 빠진 기능을 추가해서 내놓곤 한다.\n\n@@color(#04f): ▣ 페트롤프롬 에어 @@ (Petrol from Air) @ 2013.08. Vol.371/ 2013-09-05 @\n2012년 10월 영국 AFS Air Fuel Synthesis 사\n이산화탄소와 수증기를 석유로 변환하는 이 기술은 공기에 수산화나트륨을 섞어 생성된 탄산나트륨에 전기분해를 가해 순수한 이산화탄소를 추출하고, 이를 전기분해한 물에서 나오는 탄산수소와 반응시켜 석유를 생산해낸다. 이렇게 생산된 석유는 상업용 석유와 같은 성질로 그 어떤 연료탱크에 넣어도 작동하며 가솔린, 디젤, 항공유 등으로 재가공할 수도 있다.\n\n@@color(#04f): ▣ 포스트모르템 @@(Postmortem) @ 2009-11-07 @\n원래 '부검'(負劍)이란 뜻으로, 시체를 해부하여 죽은 원인을 밝혀내는 일을 의미한다. \n게임 개발과 관련 해서, 포스트모르템이란 출시된 게임에서 제작 과장에서 성공적이었던 요소와 문제를 야기했던 요소를 낱낱이 분석하는 것을 말한다. 예로, 게임 디벨로퍼(Game Developers) 잡지의 포스트모르템이라는 제목의 연재 기사들이 있다.\n\n@@color(#04f): ▣ 포지티브섬 게임 @@(Positive-sum game)\n\n@@color(#04f): ▣ 폭포수 개발 모델 @@(waterfall development model) @ 2010-03-25 @\n먼저 요구되는 기능을 정리하고, 그것들을 모듈화된(modular) 하위 시스템으로 나눈 다음, 각각의 모듈을 만들고, 전체적으로 통합하며, 끝으로 완성된 시스템이 요구 조건을 모두 만족시키는지 확인한 후 출시하도록 하는 소프트웨어 제작 과정을 말한다. 일반적으로 규모가 크고 잘 알려진 시스템에 대해서는 적합하지만, 높은 효율성과 기능 혁신을 필요로 하는 시스템에 대해서는 덜 효율적이다.\n\n@@color(#04f): ▣ 프레넬 반사@@(Fresnel Reflection)란 @ 2016-10-14 @\n프랑스의 오귀스텡. 장. 프레넬이 제창 한 것으로\n빛이 서로 다른 굴절률을 갖는 매질의 경계면을 통과할 때의 반사로 빛이 매질과 부딪힐 때 그 각도에 따라 굴절, 투과가 다르게 나타하는 현상이다.\n\n평평한 곳에 빛이 투과 된다고 할때 직각에 가까운 각도로 빛이 쏘아지면 대부분이 투과되는 물체를 빛이 꿰뚫지만 평행에 가까운 속도고 빛이 쏘아지면 수면에서 반사해 버려 빛이 투과되는 물체 내에 대부분 들어오지 않는다. \n그리고 물체의 투명도나 빛의 강도 같은 파라미터에 따라 빛이 얼마나 투과체의 표면을 반사하고, 얼마나 투과체의 내부로 들어갈까를 계산한 식을 만들어 냈다.\n\n@@color(#04f): ▣ 프로토타입 @@(Prototype)\n프로토타입의 원래 뜻은 원형, 초기 형태 등을 가리키는 것이지만, 흔히 공학에서 말하는 프로토타입이란 어떤 구조물이나 장비에 대하여, 형상이나 설계, 적합성 또는 성능 등을 평가하기 위해 만든 실물 크기의 모형을 말한다. \n\n@@color(#04f): ▣ 플랫폼 노동자 @@ @ 2018.06. Vol.429/ 2018-09-19 @\n앱, SNS 같은 ''모바일 플랫폼''으로 일거리를 제공받고 노동력을 제공하는 이들을 뜻하며, ‘디지털 특고(특수고용 근로자)’ 라고도 불린다. __주로 배달대행, 대리운전, 가사노동, 심부름 등이 플랫폼 노동 기반이 되는 대표적 서비스이다.__ 스마트폰의 급속한 보급과 모바일 앱 개발이 잇따르면서 플랫폼 노동자도 크게 증가해 노동자수는 약 5만 명으로 추정된다. \n특정 업체와 근로계약을 체결하지 않는 상당수의 플랫폼 노동자는 노조 결성 및 가입, 고용보험·건강보험·산재보험·국민연금 등 4 대 보험 적용이 안 되고 있기 때문에 사회안전망 체계가 필요하다. 네덜란드나 독일 등 유럽에선 일자리를 구하기 위해 플랫폼 노동 앱을 이용한 사람 비율이 11~14%이며 점점 증가하고 있다. 앞으로 한국도 플랫폼 노동자가 임시·일용직의 10% 이상 비중으로 늘어날 것으로 예상되며 플랫폼 노동자 확산으로 지금과 같은 일반적 고용 관계가 크게 바뀔 것으로 예상된다.\n\n@@color(#04f): ▣ 핀테크 @@(FinTech)란\n금융을 뜻하는 파이낸스(Finance)와 기술을 뜻하는 테크놀로지(Technology)의 합성어로 스마트 기술을 활용한 새로운 금융기술을 의미한다.\n모바일결제, 모바일송금, 온라인 개인재정관리, 개인간대출, 크아우드펀딩 등 금융 서비스의 효율성을 제고하는 혁식적인 기술 또는 기술적인 과정을 의미한다.\n\n
@@color(#04f): 시험용 게임물 등급 제도 @@ \n* 게임물등급위원회(게임위)가 시행하고 있으며, 2006년 4월 24일 제정된 게임산업진흥법에 따라 국내에서 서비스되는 게임은 개발과정에서 성능, 안정성, 이용자 만족도 등을 평가할 목적으로 테스트를 진행하는 경우 심험용 게임물 심의를 받아야한다.\n* 테스트는 시험용 게임 등급을 받은 후 30일 이내에 진행돼야하며, 인원은 1만명을 넘지 말아야 한다. 만약 1만명 이상의 인원이 테스트에 참여하려면 정식 심의를 받아야 한다. \n
@@color(#04f): ▣ 사우디아라비아 방위사업청 @@ (GAMI, General Authority for Military Industries) @ 2022-09-25 @\n\n@@color(#04f): ▣ 사우디아라비아 국가 조병창 @@ (SAMI, Saudi Arabian Military Industries) @ 2022-09-25 @\n / 2017년 5월에 설립된 공공 투자 기금으로 조성된 사우디아라비아 국부 펀드 회사로 항공, 지상무기체계, 무기 및 미사일, 국방 전자 등 네 가지 주요 사업부를 운영하고 있다.\n\n@@color(#04f): ▣ 사원수 @@ (Quaternion) @ 2014-07-30 @\n식(1) \n ''Q = q0 + q1*i + q2*j + q3*k''\n / i, j, k 는 허수이고 q0~q3 는 실수이다. 즉, 허수부 3개와 실수부 1개로 이루어져 있다.\n / 사원수끼리의 연산을 할 때 사용하는 식\n\n기하학적으로, Q가 단위 사원수 일때(Q 의 q0~q3 으로 이루어진 벡터의 길이가 1) 다음과 같이 표현할 수 있다.\n\n식(2)\n ''Q = sin(theta)*U + cos(theta)''\n / U 는 벡터를 의미한다. 무슨 벡터인가 하면 사원수 Q로 어떤 점을 회전 변환 시킬 때 회전 축이 되는 단위벡터 U 를 말한다. theta 는 회전 각으로써 위의 식(2) 대로라면 회전축 U 에 대하여 2*theta 만큼 움직이는 사원수가 된다.\n / 실제 회전축과 회전량을 표현하는 식\n \ni, j, k 가 어떤 3개의 축을 표현하는 기저 벡터라고 생각했을 때 외적의 결과와 같다. \n바로 이런 허수의 법칙들 역시 회전 변환에 대해 기하학적으로 관련이 있으며, 허수부가 하나 존재하는 복소수의 경우엔 어떤 복소수에 허수 i 를 곱할 경우 180도 회전이라는 기하학적인 효과를 낳는다.\n \n정리하자면, 사원수끼리의 곱셈은 해밀턴의 법칙을 사용하여 구현하면 되고,\n허수라는 것은 실제로 존재 하는 것이 아닌 하나의 법칙이기 때문에 사원수끼리의 연산에 사용하면 되며 실제 코드에서의 표현은 허수를 제외한 것만으로도 사원수를 구축할 수 있기 때문에 허수를 제외한 사원수의 길이만으로 표현한다.\n\n@@color(#04f): ▣ 상표불사용취소심판 @@ 은 @ 2019-08-30 @\n특허청 심사를 거쳐 등록된 상표라 할지라도 국내에서 3년간 사용하지 않는 경우, 누구나 등록상표를 취소할 수 있는 제도다. 상표권자가 국내에서 계속하여 3년 이상 등록상표를 사용하지 않을 경우, 또는 국내에서 정당하게 사용했음을 증명하지 못하면 해당 상표는 취소될 수 있다. 상표취소를 예방하기 위해선 유명상표라 할지라도 국내에서 사용하지 않으면 취소될 수 있으므로, 상표권자는 상표를 상품에 표시하거나 광고, 거래한 사실 등과 날짜를 입증해 증거(거래명세서, 카탈로그, 사용설명서 등)를 수집해 두는 것이 중요하다.\n\n@@color(#04f): ▣ 샌드박스 @@(sandbox) @ 2010-03-25 @\n복잡하고 동적인 시뮬레이션을 통해 흥미를 이끌어내는 게임. 미리 정해진 목표난 이야기에 의존하기보다 플레이어의 창의성에 의존하다.\n\n@@color(#04f): ▣ 선구동물과 후구동물 @@ @ 2022-11-29\n발생과정 중 구명이 생기기 시작해서 배아를 뚫고 반대편으로 나와 관이 만들어지고 이 관이 나중에 창자가 된다.\n▷ ''선구동물'' ; 처음 생긴 구멍이 나중에 입이 된다.\n / 몸의 겉이 단단하고 속이 연하다. ; 곤충, 연체동물 (오징어, 문어 등 ; 껍데기가 진화과정에서 퇴화)\n\n▷ ''후구동물'' ; 처음 생긴 구멍이 나중에 항문이 된다.\n / 몸의 겉이 연하고 속(뼈)이 단단하다. ; 인간\n\n@@color(#04f): ▣ 소닉코드 @@ 는 @ 2017-06-19 @\n스피커와 마이크를 이용한 간단한 근거리 무선통신으로, 비가청 음파를 이용한 데이터 전송기술이다.\n바코드나 QR코드가 비주얼 패턴을 광학 센서로 인식해서 데이터를 전송하듯이 소닉코드는 오디오 패턴을 음향센서(Mic)로 인식하여 데이터를 전송한다. 스피커를 가진 다양한 단말기에 적용이 가능하며 모든 스마트폰을 지원하는 것이 특징이다. 별도의 하드웨어 인프라 구축비용이 들지 않는다.\n\n@@color(#04f): ▣ 소모규 개방경제 @@ (Small Open Economy)는 @ 2011-01-08 @\nOECD가 명명한 것으로서 보통 약자로 SMOPEC라고 표기한다. 즉 OECD는 경제규모가 작아 정책적으로 국제가격, 금리, 소득에 영향을 미칠 수는 없지만 국제무역에 활발하게 참여하는 국가경제를 소규모 개방경제라고 칭한 것이다. \n한편 强小國(Small but Strong Countries)이란 인구 규모는 작지만 소득 수준이 높은 국가를 지칭한다. \n\n@@color(#04f): ▣ 소셜네트워크서비스 @@ (Social Network Service)란 @ 2011-01-23 @\n웹상에서 이용자들이 친구, 선후배, 동료 등 지인과의 인맥 관계를 강화시키고 또 새로운 인맥을 쌓으며 폭넓은 인적네트워크를 형성할 수 있도록 해주는 서비스로 간단히 SNS라고 부르기도 하는데 트위터ㆍ싸이월드ㆍ페이스북 등이 대표적이다.\n\n@@color(#04f): ▣ 숭꿀 @@ @ 2019-12-17 네이버 오픈 사전 @\n[죽은척하다]의 의미로 사용되는 경상도 사투리 \n\n@@color(#04f): ▣ 숭꼴쟁이 @@ @ 2019-12-17 @\n• 엉큼한 사람. 흉물스러운 사람 ≒숭꼴배기/숭꼴뱅이/숭꼴잽이/숭꿀뱅이/숭꿀쟁이\n• 숭꿀배기 ; 속이 음흉하면서 인색한 사람을 일컫는 경상도 사투리 (네이버 오픈 사전)\n\n@@color(#04f): ▣ 스마트폰 @@(Smartphone)은 일반적으로 'PC와 유사한 기능'을 수행할 수 있는 이동전화를 뜻함. \n 일반적으로 자체 설치된 Operating System를 (Symbian OS, iPhone OS, Windows Mobile, Palm Web OS, Linux, Android 등) 통해 일정관리, 이메일 등의 기본적 기능 외에도 PDF나 MS Office 파일 등의 열람이 가능하며, MP3, 사진, 비디오, 인터넷 브라우징 등이 가능한 모바일 기기를 스마트폰이라 칭함. 최근에는 Apple 사의 App Store를 시초로하여 사용자가 원하는 애플리케이션을 직접 선택, 구매하여 설치할 수 있는 기능이 필수적으로 자리잡고 있음\n 출처 ; February 2009 2nd Issue 글로벌 게임산업 Trend(한국산업진흥원)\n\n@@color(#04f): ▣ 스타형(STAR) 휴가 문화 @@\n천편일률적인 휴가에서 벗어나 휴가를 이용하여 업무 외의 개인적인 관심사를 탐구하는 자기개발 Self-development형, 젊은 여성층을 중심으로 휴가를 기회로 외모 변신을 도모하는 변신형 Transformation, 스스로가 목표하는 계획과 일정에 맞춰 혼자 여행하는 나홀로형 Alone, 집에서 편안하게 휴식하면서 가족과 화목을 도모하는 신체적 재충전을 추구하는 방콕형 Rest 휴가.\n\n@@color(#04f): ▣ 슬로우패션 @@ \n패스트패션의 상대적인 개념으로 강조되고 있으며 옷을 덜 사되, 이왕 살 땐 고품질의 옷을 사서 좀 더 오래 길게 입겠다는 것으로, 사실 과거의 패션 소비로 돌아가는 것이다.\n\n@@color(#04f): ▣ 슬로우TV @@ \n슬로우TV의 시초는, 노르웨이 국영방송인 NRK 방송이 2009년 노르웨이 베르겐 철도 개통 100주년을 기념하기 위해 만든 다큐다. 100년 전과 똑같이 7시간 20분이 걸리는 베르겐~오슬로 구간을 달리는 기차 안팎의 모습을 4대의 카메라로 찍어 편집 없이 그대로 방송했다. \n우리도 슬로우TV를 받아들일 때가 되었다. 빠르고 함축적인 콘텐츠는 스마트폰으로 더 잘 소비한다. 더이상 TV로 새롭고 빠른 걸 받아들이는 게 아니다. TV는 집 안에 있는 가장 큰 창이다. 벽에 붙어있는 세상을 보여주는 창인 것이다. 조급한 마음을 내려놓고 창을 통해 세상을 접할 수 있는 여유가 필요해진 건, 스마트폰을 일상적으로 많이 소비하는 시대인 데다가 1, 2인 가구가 늘어나고, 핵가족이 보편화되어서다. \n\n\n
@@color(#04f): ▣ 모아레 @@(Moire)란\n단어는 프랑스인들이 고대 중국에서 수입된 비단 위에 나타나는 물결무늬를 일컬었던 말로, 요즘에는 두 개 이상의 주기적인 물결무늬가 겹쳐져 생기는 간섭무늬(interference fringe)를 지칭하는 단어로 사용된다.\n\n모기장 같은 망사 두 장이 겹쳐있을 때 망사를 이루는 세밀한 직물의 격자간격보다 훨씬 크고 변화가 다양한 얼룩무늬를 볼 수 있다. 또한 머리빗 두 개를 겹쳐서 보면 간격이 빗살보다 넓은 새로운 어두운 그림자를 볼 수 있다. 이렇게 주기적인 무늬가 겹쳐서 원래의 주기보다 큰 무늬를 만드는 현상을 말한다.\n\n1. 모아레 현상은 맥놀이 현상이 시각적으로 발생하는 것으로, 일정한 간격을 갖는 물체 사이에 발생하는 간섭 무늬를 말하며, 차트 위에 무지개색 물결 무늬가 나타나거나 햇빛이 비치는 날 모기장이나 커텐 등이 겹쳐져 있으면 물결무늬가 생기고, 줄무늬 옷을 입고 촬영한 사진이나 일정한 간격의 구조물을 촬영했을 때 무지개 빛이 나타나는 모습에서도 확인할 수 있다. \n\n2. 부적절한 스크린 각도에 의해 인쇄물에서 나타나는 색상의 덩어리지는 현상.\n도트 무늬가 충돌하여 발생하는 파도 모양의 무늬로서 망점 수가 다른 두 개의 방점 화면이 동일한 이미지에 겹쳐질 때 만들어진다.\n예를 들어 스캔한 원본 망점 화면과 이미지의 dpi 망점 수가 다르면 모니터 화면에 모아레 무늬가 생긴다. 이런 문제가 발생하지 않게 하려면 화면 각도와 망점 화면의 망점 수를 정확하게 설정해야 한다.\n\n3. 포토샵 필터 중에서 Blur(픽셀이 가지고 있는 색상 차이를 줄여서 전반적으로 뿌옇게 만들어준다)를 사용해서, \n스캔 받은 이미지에 묻어있는 잡음이나 모아레 현상을 제거할 수 있다.\n
@@color(#04f): ▣ 캡슐화 @@\n관련있는 데이터를 한데 묶어 줍으로써, 데이터를 보다 일괄적으로 관리하는 것\n\n@@color(#04f): ▣ 커뮤니케이션 @@ [명사]\n사람들끼리 서로 생각, 느낌 따위의 정보를 주고받는 일. 말이나 글, 그 밖의 소리, 표정, 몸짓 따위로 이루어진다. ‘의사 전달’, ‘의사소통’으로 순화. \n\n@@color(#04f): ▣ 컷씬 @@ (cut-scene) @ 2010-03-25 @\n동적으로 생성되기보다는 이미 준비된 데이터부터 재생되는 비대화형(non-interactive) 동영상; 일반적으로 게임의 도입부나 종결부에 사용되며, 줄거리를 전달하는 목적으로 제공되거나, 플레이어가 목표를 달성했을 때 그에 대한 보상으로 웅장한 그래픽을 보여주기도 한다.\n\n@@color(#04f): ▣ 코쿤 @@ (cocoon)은 누에고치를 빗댄 말로,\n 불확실성이 증대되는 경기침제기에 타인과의 접촉이나 교제에서 받는 스트레스를 피해 외부와의 단절을 선언한 사람들을 의미함.\n\n@@color(#04f): ▣ 클라우드 컴퓨팅 @@ (Cloud Computing) @ 2011-06-14 @\n자료나 소프트웨어를 개별 기기가 아닌 데이터센터에 저장해뒀다가 필요할 때마다 인터넷을 통해 꺼내 쓰는 서비스. 전 과정이 마치 구름(cloud)처럼 눈에 보이지 않는 인터넷상에서 이루어진다는 뜻으로 이름 붙여졌다.\n\n
* 별책\n* [[formatting]]\n* [[Testing]]
GettingStarted\n----\n[[용어정리]]\n[[목록]]\n[[주소록]]\n----\n<<slider about [[About...]] [[About...]] 'Learn about the CasePSD team'>>\n----\n\nsince 2008.7.1\n\n
GettingStarted\n
Handmade
(ccTiddly 1.1)a reusable non-linear personal web notebook
/***\nThis is a sample style definition to demonstrate CustomCssClass formatting\n***/\n/*{{{*/\n.wrappingClass {color: #666; background: #bbb;}\n/*}}}*/\n.wrappingClass {color: #000000; background: #D7DEDD;}\n\n/***\nCosmetic fixes that probably should be included in a future TW...\n***/\n/*{{{*/\n.viewer .listTitle { list-style-type:none; margin-left:-2em; }\n.editorFooter .button { padding-top: 0px; padding-bottom:0px; }\n/*}}}*/\n/***\nImportant stuff. See TagglyTaggingStyles and HorizontalMainMenuStyles\n***/\n/*{{{*/\n[[TagglyTaggingStyles]]\n[[HorizontalMainMenuStyles]]\n/*}}}*/\n/***\nClint's fix for weird IE behaviours\n***/\n/*{{{*/\nbody {position:static;}\n.tagClear{margin-top:1em;clear:both;}\n/*}}}*/\n/***\nJust colours, fonts, tweaks etc. See SideBarWhiteAndGrey\n***/\n/*{{{*/\nbody {background:#eee; /* font-size:103%; */}\na{ color: #069; }\na:hover{ background: #069; color: #fff; }\n.popup { background: #178; border: 1px solid #069; }\n.headerForeground a { color: #6fc;}\n.headerShadow { left: 2px; top: 2px; }\n.title { padding:0px; margin:0px; }\n.siteSubtitle { padding:0px; margin:0px; padding-left:1.5em; }\n.subtitle { font-size:90%; color:#ccc; padding-left:0.25em; }\nh1,h2,h3,h4,h5 { color: #000; background: transparent; }\n.title {color:black; font-size:2em;}\n.shadow .title {color:#999; }\n.viewer pre { background-color:#f8f8ff; border-color:#ddf; }\n.viewer { padding-top:0px; }\n.editor textarea { font-family:monospace; }\n#sidebarOptions { border:1px #ccc solid; }\n.tiddler {\n border-bottom:1px solid #ccc; border-right:1px solid #ccc; padding-bottom:1em; margin-bottom:1em; \n background:#fff; padding-right:1.5em; }\n#messageArea { background-color:#bde; border-color:#8ab; border-width:4px; border-style:dotted; font-size:90%; }\n#messageArea .button { text-decoration:none; font-weight:bold; background:transparent; border:0px; }\n#messageArea .button:hover {background: #acd;}\n[[SideBarWhiteAndGrey]]\n\n.viewer td {vertical-align:top;}\n\n.viewer table.noBorder {border-style:none;}\n.viewer table.noBorder td {border-style:none;}\n.viewer table.threeCol td {width:33%;}\n\n#adsense {\n margin: 1em 15.7em 0em 1em; border:1px solid #ddd;\n background:#f8f8f8; text-align:center;margin-bottom:1em;overflow:hidden;padding:0.5em;} \n\n.sliderPanel { margin-left: 2em; }\n\n.viewer th { background:#ddd; color:black; }\n/*}}}*/\n/*{{{*/\n/* for testing clint's new formatter. eg {{red{asdfaf}}} */\n.red { color:white; background:red; display:block; padding:1em; } \n\n/* FF doesn't need this. but IE seems to want to make first one white */\n.txtMainTab .tabset { background:#eee; }\n.txtMoreTab .tabset { background:transparent; }\n\n.faq ol li { padding-top:1em; font-size:120%; }\n.faq ol ul li { padding-top:0px; font-size:100%; }\n\n/*}}}*/\n
!! 문자\n<nowiki>\n@@bgcolor(#ffffff):color(#04f): ◾ 가치주 @@ • · \n</nowiki>\n@@bgcolor(#ffffff):color(#04f): ◾ 가치주 @@ • ◦ ㆍ\n\n| 138, 008, 075 | #8A084B | @@color(#8A084B): ''와인 정보 '' @@ |\n| 238, 027, 036 | #ee1b24 | @@color(#ee1b24): ''강조 '' @@ |\n| 190, 140, 060 | #BE8C3C | @@color(#BE8C3C): ''황토색 '' @@ |\n||\n| 000, 128, 128 | #006666 | @@color(#006666): ''설정값 '' @@ |\n| 000, 168, 080 | #00A850 | @@color(#00A850): ''진행 '' @@ |\n||\n| 000, 051, 255 | #0033ff | @@color(#004a80): ''패치 '' @@ |\n| 000, 074, 128 | #004a80 | @@color(#004a80): ''주석 '' @@ |\n| 000, 102, 153 | #006699 | @@color(#006699): ''기본청색글(소제목) '' @@ |\n| 048, 088, 210 | #3058D2 | @@color(#3058D2): ''설정 '' @@ |\n||\n| 199, 037, 078 | #C7254E | @@color(#C7254E): ''강조 '' @@ | 249, 242, 244 | #FAE3EE |@@bgcolor(#FAE3EE):color(#C7254E): ''강조 '' @@ |\n| 000, 017, 068 | #001144 | @@color(#001144): ''파란색 '' @@ | 187, 221, 238 | #bbddee |@@bgcolor(#bbddee):color(#001144): ''파란색 계열 '' @@ |\n| 255, 255, 255 | #FFFFFF | 흰색 글자 | 255, 094, 000 | #FF5E00 |@@bgcolor(#FF5E00):color(#FFFFFF): ''주황색 배경 '' @@ |\n| 255, 255, 255 | #000000 | 검은색 글자 | 255, 238, 136 | #FFee88 |@@bgcolor(#FFee88):color(#000000): 엷은 노란색 배경 @@ |\n| 255, 255, 255 | #000000 | 검은색 글자 | 255, 187, 000 | #FFBB00 |@@bgcolor(#FFBB00):color(#000000): 노란색 배경 @@ |\n| 255, 255, 255 | #000000 | 검은색 글자 | 240, 240, 255 | #f8f8ff |@@bgcolor(#f0f0ff):color(#000000): 엷은 파란색 배경 @@ |\n| 255, 255, 255 | #000000 | 검은색 글자 | 226, 226, 255 | #e2e2ff |@@bgcolor(#e2e2ff):color(#000000): 엷은 파란색 배경 @@ |\n| 255, 255, 255 | #000000 | 검은색 글자 | 215, 222, 221 | #d7dedd |@@bgcolor(#d7dedd):color(#000000): 엷은 녹색 배경 @@ |\n\n|>|합치기 |2 |\n|1 |1-1 |2 |\n|~|1-2 |2 |\n<nowiki>\n<html>\n<span style="color:red; background:#f8f8ff ; font-family:돋움; font-size: 14px;"> 붉은색, 돋움, 14픽셀로 지정된 텍스트입니다.</span>\n</html>\n</nowiki>\n<html>\n<span style="color:red; background:#f8f8ff ; font-family:돋움; font-size: 14px;"> 붉은색, 돋움, 12픽셀로 지정된 텍스트입니다.</span> <br>\n</html>\n{{{\n@@sf@@\n}}}\n@@sf@@\n<html> <span style="font-size: 10pt;"> <font color=RoyalBlue> <b> => 진정으로 소통하고 싶다면, 쉬운 글로 표현할 것 </b> </font> </span> </html>\n\n<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 16px;"> <b> 소재목 </b> </span>\n</html>\n\n<nowiki>\n{{wrappingClass{Text that is now accentuated }}}\n</nowiki>\n{{wrappingClass{Text that is now accentuated }}}\n\n<nowiki>\n@@text-shadow:black 3px 3px 8px;font-size:10pt;display:block;margin:1em 1em 1em 1em;border:1px solid black;Access any CSS style@@ \n</nowiki>\n@@text-shadow:black 3px 3px 8px;font-size:10pt;display:block;margin:1em 1em 1em 1em;border:1px solid black;Access any CSS style@@ \n\n<nowiki>\n※ @@bgcolor(#014):color(#fff): #014 - / / Bottom blue@@\n</nowiki>\n※ @@bgcolor(#014):color(#fff): #014 - / / Bottom blue@@ - KeyWord ; StyleSheetColors\n\n※ HTML 특수 코드 ; HTML Character Entity(HTML 문자 단위(엔티티))\n https://dev.w3.org/html5/html-author/charref\n\n++++[항목 열고, 닫기]\n+ 3개 - 닫기\n+ 4개 - 열기\n===\n\n!!! 이미지\n<html>\n<img src="http://www.gingaminga.com/wiki/pds/GalleryMacro/Origami_Modular_Cubes01s.jpg" width="64" onClick="javascript:window.open('http://www.gingaminga.com/wiki/pds/GalleryMacro/Origami_Modular_Cubes01.jpg','screenshot','width=660, height=660');"STYLE=cursor:hand; TITLE='클릭하면 전개도를 표시 합니다.'> <br>\n</html>\n<nowiki>\n<DIV>\n<P style="TEXT-ALIGN: center; LINE-HEIGHT: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" \nclass=MsoNormal align=center>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/icon_christmas_ball.png" width=32> </SPAN>\n<br>\n<SPAN style="COLOR: #2b5600"> 그림 설명 </SPAN></p>\n</DIV>\n</nowiki>\n<html>\n<DIV>\n<P style="TEXT-ALIGN: center; LINE-HEIGHT: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" \nclass=MsoNormal align=center>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/icon_christmas_ball.png" width=32> </SPAN>\n<br>\n<SPAN style="COLOR: #2b5600"> 그림 설명 </SPAN></p>\n</DIV>\n</html>\n\n<nowiki>\n<DIV style="TEXT-ALIGN: center; LINE-HEIGHT: 150%" class=MsoNormal align=center>\n<SPAN style="LINE-HEIGHT: 150%; COLOR: black; FONT-SIZE: 11pt" lang=EN-US>\n<HR align=center SIZE=2 width="100%">\n</SPAN></DIV>\n</nowiki>\n<html>\n<DIV style="TEXT-ALIGN: center; LINE-HEIGHT: 150%" class=MsoNormal align=center>\n<SPAN style="LINE-HEIGHT: 150%; COLOR: black; FONT-SIZE: 11pt" lang=EN-US>\n<HR align=center SIZE=2 width="100%">\n</SPAN></DIV>\n</html>\n\n<html> <CENTER>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/HB_world_main.PNG" width=480>\n</CENTER> </html>\n\n!!Code\n{{{\nToday is <<today>>.\n[[Pretty External Link|http://www.tiddlywiki.com]]\n}}}\n\n!!! 내부 이동\n<html>\n<div style="border: 1px solid gold; padding: 10px; background-color: #F9F2F4; ">\n<span style="font-size: 14px;">\n<a name="jangmi" > <br>\n<a href="이동할 페이지의 주소(URL)#jangmi" >장미 구경하세요</a> </div>\n</span>\n<br>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<span style="font-size: 14px;"> <b> #. Chapter 8 Making Your Day Brighter </b> </span>\n</div> </html>\n\n!!! 인용\n/*{{{*/\n// 문법구조\nFor 변수 = 시작값 To 종료값 (Step 변화값)\n (명령문)\n (Exit For) // 선택 사항. For 루프의 외부로 제어를 이동.\nNext 변수 \n/*}}}*/\n\n\n!! Table\n| \ | 1 | 2 | 3 |\n| A | A1 | A2 | A3 |\n| B | B1 | B2 | B3 |\n\n|>|>| 행 합치기 (l>l) | |\n| A | A1 | A2 | A3 |\n| B | B1 | B2 | B3 |\n\n|>|>| !행 합치기 (l>l) | 영문에서 표 생성후 수정 |h\n|>|>| 맨 앞에 '!' 없는 경우 ; 행 합치기 (l>l) | 맨뒤에 'h'가 없는 경우 |\n| B | B1 | B2 | B3 |\n\n| 열 합치기 (l~l) | 1 | 2 | 3 |\n|~| A1 | A2 | A3 |\n|~| B1 | B2 | B3 |\n\n<<<\ndfsf\n<html>\n// SideBarOption\n<<search>><<closeAll>><<permaview>><<newTiddler>><<newJournal 'DD MMM YYYY'>><<tiddler 'LoginPanel'>><<slider chkSliderOptionsPanel OptionsPanel 'options »' 'Change TiddlyWiki advanced options'>>\n</html>\n<<<\n
/***\n''NestedSlidersPlugin for TiddlyWiki version 1.2.x and 2.0''\n^^author: Eric Shulman\nsource: http://www.TiddlyTools.com/#NestedSlidersPlugin\nlicense: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^\n\nQuickly make any tiddler content into an expandable 'slider' panel, without needing to create a separate tiddler to contain the slider content. Optional syntax allows ''default to open'', ''custom button label/tooltip'' and ''automatic blockquote formatting.''\n\nYou can also 'nest' these sliders as deep as you like (see complex nesting example below), so that expandable 'tree-like' hierarchical displays can be created. This is most useful when converting existing in-line text content to create in-line annotations, footnotes, context-sensitive help, or other subordinate information displays.\n\nFor more details, please click on a section headline below:\n++++!!!!![Configuration]>\nDebugging messages for 'lazy sliders' deferred rendering:\n<<option chkDebugLazySliderDefer>> show debugging alert when deferring slider rendering\n<<option chkDebugLazySliderRender>> show debugging alert when deferred slider is actually rendered\n===\n++++!!!!![Usage]>\nWhen installed, this plugin adds new wiki syntax for embedding 'slider' panels directly into tiddler content. Use {{{+++}}} and {{{===}}} to delimit the slider content. Additional optional syntax elements let you specify\n*default to open\n*cookiename\n*heading level\n*floater\n*rollover\n*custom label/tooltip\n*automatic blockquote\n*deferred rendering\nThe complete syntax, using all options, is:\n//{{{\n++++(cookiename)!!!!!^*[label|tooltip]>...\ncontent goes here\n===\n//}}}\nwhere:\n* {{{+++}}} (or {{{++++}}}) and {{{===}}}^^\nmarks the start and end of the slider definition, respectively. When the extra {{{+}}} is used, the slider will be open when initially displayed.^^\n* {{{(cookiename)}}}^^\nsaves the slider opened/closed state, and restores this state whenever the slider is re-rendered.^^\n* {{{!}}} through {{{!!!!!}}}^^\ndisplays the slider label using a formatted headline (Hn) style instead of a button/link style^^\n* {{{"^"}}} //(without the quotes)//^^\nmakes the slider 'float' on top of other content rather than shifting that content downward^^\n* {{{"*"}}} //(without the quotes)//^^\nautomatically opens/closes slider on "rollover" as well as when clicked^^\n* {{{[label]}}} or {{{[label|tooltip]}}}^^\nuses custom label/tooltip. (defaults are: ">" (more) and "<" (less)^^\n* {{{">"}}} //(without the quotes)//^^\nautomatically adds blockquote formatting to slider content^^\n* {{{"..."}}} //(without the quotes)//^^\ndefers rendering of closed sliders until the first time they are opened. //Note: deferred rendering may produce unexpected results in some cases. Use with care.//^^\n\n//Note: to make slider definitions easier to read and recognize when editing a tiddler, newlines immediately following the {{{+++}}} 'start slider' or preceding the {{{===}}} 'end slider' sequence are automatically supressed so that excess whitespace is eliminated from the output.//\n===\n++++!!!!![Examples]>\nsimple in-line slider: \n{{{\n+++\n content\n===\n}}}\n+++\n content\n===\n----\nuse a custom label and tooltip: \n{{{\n+++[label|tooltip]\n content\n===\n}}}\n+++[label|tooltip]\n content\n===\n----\ncontent automatically blockquoted: \n{{{\n+++>\n content\n===\n}}}\n+++>\n content\n===\n----\nall options combined //(default open, cookie, heading, floater, rollover, label/tooltip, blockquoted, deferred)//\n{{{\n++++(testcookie)!!!^*[label|tooltip]>...\n content\n===\n}}}\n++++(testcookie)!!!^*[label|tooltip]>...\n content\n===\n----\ncomplex nesting example:\n{{{\n+++^[get info...|click for information]\n put some general information here, plus a floating slider with more specific info:\n +++^[view details...|click for details]\n put some detail here, which could include a rollover with a +++^*[glossary definition]explaining technical terms===\n ===\n===\n}}}\n+++^[get info...|click for information]\n put some general information here, plus a floating slider with more specific info:\n +++^[view details...|click for details]\n put some detail here, which could include a rollover with a +++^*[glossary definition]explaining technical terms===\n ===\n===\n----\nnested floaters\n>menu: <<tiddler NestedSlidersExample>>\n(see [[NestedSlidersExample]] for definition)\n----\n===\n+++!!!!![Installation]>\nimport (or copy/paste) the following tiddlers into your document:\n''NestedSlidersPlugin'' (tagged with <<tag systemConfig>>)\n===\n+++!!!!![Revision History]>\n\n++++[2006.02.16 - 1.7.7]\ncorrected deferred rendering to account for use-case where show/hide state is tracked in a cookie\n===\n\n++++[2006.02.15 - 1.7.6]\nin adjustSliderPos(), ensure that floating panel is positioned completely within the browser window (i.e., does not go beyond the right edge of the browser window)\n===\n\n++++[2006.02.04 - 1.7.5]\nadd 'var' to unintended global variable declarations to avoid FireFox 1.5.0.1 crash bug when assigning to globals\n===\n\n++++[2006.01.18 - 1.7.4]\nonly define adjustSliderPos() function if it has not already been provided by another plugin. This lets other plugins 'hijack' the function even when they are loaded first.\n===\n\n++++[2006.01.16 - 1.7.3]\nadded adjustSliderPos(place,btn,panel,panelClass) function to permit specialized logic for placement of floating panels. While it provides improved placement for many uses of floating panels, it exhibits a relative offset positioning error when used within *nested* floating panels. Short-term workaround is to only adjust the position for 'top-level' floaters.\n===\n\n++++[2006.01.16 - 1.7.2]\nadded button property to slider panel elements so that slider panel can tell which button it belongs to. Also, re-activated and corrected animation handling so that nested sliders aren't clipped by hijacking Slider.prototype.stop so that "overflow:hidden" can be reset to "overflow:visible" after animation ends\n===\n\n++++[2006.01.14 - 1.7.1]\nadded optional "^" syntax for floating panels. Defines new CSS class, ".floatingPanel", as an alternative for standard in-line ".sliderPanel" styles.\n===\n\n++++[2006.01.14 - 1.7.0]\nadded optional "*" syntax for rollover handling to show/hide slider without requiring a click (Based on a suggestion by tw4efl)\n===\n\n+++[2006.01.03 - 1.6.2]\nWhen using optional "!" heading style, instead of creating a clickable "Hn" element, create an "A" element inside the "Hn" element. (allows click-through in SlideShowPlugin, which captures nearly all click events, except for hyperlinks)\n===\n\n+++[2005.12.15 - 1.6.1]\nadded optional "..." syntax to invoke deferred ('lazy') rendering for initially hidden sliders\nremoved checkbox option for 'global' application of lazy sliders\n===\n\n+++[2005.11.25 - 1.6.0]\nadded optional handling for 'lazy sliders' (deferred rendering for initially hidden sliders)\n===\n\n+++[2005.11.21 - 1.5.1]\nrevised regular expressions: if present, a single newline //preceding// and/or //following// a slider definition will be suppressed so start/end syntax can be place on separate lines in the tiddler 'source' for improved readability. Similarly, any whitespace (newlines, tabs, spaces, etc.) trailing the 'start slider' syntax or preceding the 'end slider' syntax is also suppressed.\n===\n\n+++[2005.11.20 - 1.5.0]\n added (cookiename) syntax for optional tracking and restoring of slider open/close state\n===\n\n+++[2005.11.11 - 1.4.0]\n added !!!!! syntax to render slider label as a header (Hn) style instead of a button/link style\n===\n\n+++[2005.11.07 - 1.3.0]\n removed alternative syntax {{{(((}}} and {{{)))}}} (so they can be used by other\n formatting extensions) and simplified/improved regular expressions to trim multiple excess newlines\n===\n\n+++[2005.11.05 - 1.2.1]\n changed name to NestedSlidersPlugin\n more documentation\n===\n\n+++[2005.11.04 - 1.2.0]\n added alternative character-mode syntax {{{(((}}} and {{{)))}}}\n tweaked "eat newlines" logic for line-mode {{{+++}}} and {{{===}}} syntax\n===\n\n+++[2005.11.03 - 1.1.1]\n fixed toggling of default tooltips ("more..." and "less...") when a non-default button label is used\n code cleanup, added documentation\n===\n\n+++[2005.11.03 - 1.1.0]\n changed delimiter syntax from {{{(((}}} and {{{)))}}} to {{{+++}}} and {{{===}}}\n changed name to EasySlidersPlugin\n===\n\n+++[2005.11.03 - 1.0.0]\n initial public release\n===\n\n===\n+++!!!!![Credits]>\nThis feature was implemented by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]] with research, programming and suggestions from RodneyGomes, GeoffSlocock, and PaulPetterson\n===\n***/\n// //+++!!!!![Code]\n//{{{\nversion.extensions.nestedSliders = {major: 1, minor: 7, revision: 7, date: new Date(2006,2,16)};\n//}}}\n\n//{{{\n// options for deferred rendering of sliders that are not initially displayed\nif (config.options.chkDebugLazySliderDefer==undefined) config.options.chkDebugLazySliderDefer=false;\nif (config.options.chkDebugLazySliderRender==undefined) config.options.chkDebugLazySliderRender=false;\n\n// default styles for 'floating' class\nsetStylesheet(".floatingPanel { position:absolute; z-index:10; padding:0.5em; margin:0em; \s\n background-color:#eee; color:#000; border:1px solid #000; text-align:left; }","floatingPanelStylesheet");\n//}}}\n\n//{{{\nconfig.formatters.push( {\n name: "nestedSliders",\n match: "\s\sn?\s\s+{3}",\n terminator: "\s\ss*\s\s={3}\s\sn?",\n lookahead: "\s\sn?\s\s+{3}(\s\s+)?(\s\s([^\s\s)]*\s\s))?(\s\s!*)?(\s\s^)?(\s\s*)?(\s\s[[^\s\s]]*\s\s])?(\s\s>)?(\s\s.\s\s.\s\s.)?\s\ss*",\n handler: function(w)\n {\n var lookaheadRegExp = new RegExp(this.lookahead,"mg");\n lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = lookaheadRegExp.exec(w.source)\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart)\n {\n // location for rendering button and panel\n var place=w.output;\n\n // default to closed, no cookie\n var show="none"; var title=">"; var tooltip="show"; var cookie="";\n\n // extra "+", default to open\n if (lookaheadMatch[1])\n { show="block"; title="<"; tooltip="hide"; }\n\n // cookie, use saved open/closed state\n if (lookaheadMatch[2]) {\n cookie=lookaheadMatch[2].trim().substr(1,lookaheadMatch[2].length-2);\n cookie="chkSlider"+cookie;\n if (config.options[cookie]==undefined)\n { config.options[cookie] = (show=="block") }\n if (config.options[cookie])\n { show="block"; title="<"; tooltip="hide"; }\n else\n { show="none"; title=">"; tooltip="show"; }\n }\n\n // custom label/tooltip\n if (lookaheadMatch[6]) {\n title = lookaheadMatch[6].trim().substr(1,lookaheadMatch[6].length-2);\n var pos=title.indexOf("|");\n if (pos!=-1)\n { tooltip = title.substr(pos+1,title.length); title = title.substr(0,pos); }\n else\n { tooltip += " "+title; }\n }\n\n // create the button\n if (lookaheadMatch[3]) { // use "Hn" header format instead of button/link\n var lvl=(lookaheadMatch[3].length>6)?6:lookaheadMatch[3].length;\n var btn = createTiddlyElement(createTiddlyElement(place,"h"+lvl,null,null,null),"a",null,null,title);\n btn.onclick=onClickNestedSlider;\n btn.setAttribute("href","javascript:;");\n btn.setAttribute("title",tooltip);\n }\n else\n var btn = createTiddlyButton(place,title,tooltip,onClickNestedSlider);\n btn.sliderCookie = cookie; // save the cookiename (if any) in the button object\n\n // "non-click" MouseOver open/close slider\n if (lookaheadMatch[5]) btn.onmouseover=onClickNestedSlider;\n\n // create slider panel\n var panelClass=lookaheadMatch[4]?"floatingPanel":"sliderPanel";\n var panel=createTiddlyElement(place,"div",null,panelClass,null);\n panel.style.display = show;\n panel.button = btn; // so the slider panel know which button it belongs to\n btn.sliderPanel=panel;\n\n // render slider (or defer until shown) \n w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;\n if ((show=="block")||!lookaheadMatch[8]) {\n // render now if panel is supposed to be shown or NOT deferred rendering\n w.subWikify(lookaheadMatch[7]?createTiddlyElement(panel,"blockquote"):panel,this.terminator);\n // align slider/floater position with button\n adjustSliderPos(place,btn,panel,panelClass);\n }\n else {\n var src = w.source.substr(w.nextMatch);\n var endpos=findMatchingDelimiter(src,"+++","===");\n panel.setAttribute("raw",src.substr(0,endpos));\n panel.setAttribute("blockquote",lookaheadMatch[7]?"true":"false");\n panel.setAttribute("rendered","false");\n w.nextMatch += endpos+3;\n if (w.source.substr(w.nextMatch,1)=="\sn") w.nextMatch++;\n if (config.options.chkDebugLazySliderDefer) alert("deferred '"+title+"':\sn\sn"+panel.getAttribute("raw"));\n }\n }\n }\n }\n)\n\n// TBD: ignore 'quoted' delimiters (e.g., "{{{+++foo===}}}" isn't really a slider)\nfunction findMatchingDelimiter(src,starttext,endtext) {\n var startpos = 0;\n var endpos = src.indexOf(endtext);\n // check for nested delimiters\n while (src.substring(startpos,endpos-1).indexOf(starttext)!=-1) {\n // count number of nested 'starts'\n var startcount=0;\n var temp = src.substring(startpos,endpos-1);\n var pos=temp.indexOf(starttext);\n while (pos!=-1) { startcount++; pos=temp.indexOf(starttext,pos+starttext.length); }\n // set up to check for additional 'starts' after adjusting endpos\n startpos=endpos+endtext.length;\n // find endpos for corresponding number of matching 'ends'\n while (startcount && endpos!=-1) {\n endpos = src.indexOf(endtext,endpos+endtext.length);\n startcount--;\n }\n }\n return (endpos==-1)?src.length:endpos;\n}\n//}}}\n\n//{{{\nfunction onClickNestedSlider(e)\n{\n if (!e) var e = window.event;\n var theTarget = resolveTarget(e);\n var theLabel = theTarget.firstChild.data;\n var theSlider = theTarget.sliderPanel\n var isOpen = theSlider.style.display!="none";\n // if using default button labels, toggle labels\n if (theLabel==">") theTarget.firstChild.data = "<";\n else if (theLabel=="<") theTarget.firstChild.data = ">";\n // if using default tooltips, toggle tooltips\n if (theTarget.getAttribute("title")=="show")\n theTarget.setAttribute("title","hide");\n else if (theTarget.getAttribute("title")=="hide")\n theTarget.setAttribute("title","show");\n if (theTarget.getAttribute("title")=="show "+theLabel)\n theTarget.setAttribute("title","hide "+theLabel);\n else if (theTarget.getAttribute("title")=="hide "+theLabel)\n theTarget.setAttribute("title","show "+theLabel);\n // deferred rendering (if needed)\n if (theSlider.getAttribute("rendered")=="false") {\n if (config.options.chkDebugLazySliderRender)\n alert("rendering '"+theLabel+"':\sn\sn"+theSlider.getAttribute("raw"));\n var place=theSlider;\n if (theSlider.getAttribute("blockquote")=="true")\n place=createTiddlyElement(place,"blockquote");\n wikify(theSlider.getAttribute("raw"),place);\n theSlider.setAttribute("rendered","true");\n }\n // show/hide the slider\n if(config.options.chkAnimate)\n anim.startAnimating(new Slider(theSlider,!isOpen,e.shiftKey || e.altKey,"none"));\n else\n theSlider.style.display = isOpen ? "none" : "block";\n if (this.sliderCookie && this.sliderCookie.length)\n { config.options[this.sliderCookie]=!isOpen; saveOptionCookie(this.sliderCookie); }\n // align slider/floater position with target button\n adjustSliderPos(theSlider.parentNode,theTarget,theSlider,theSlider.className);\n return false;\n}\n\n// hijack animation handler 'stop' handler so overflow is visible after animation has completed\nSlider.prototype.coreStop = Slider.prototype.stop;\nSlider.prototype.stop = function() { this.coreStop(); this.element.style.overflow = "visible"; }\n\n// adjust panel position based on button position\nif (window.adjustSliderPos==undefined) window.adjustSliderPos=function(place,btn,panel,panelClass) {\n ///////////////////////////////////////////////////////////////////////////////\n /// EXPERIMENTAL HACK - WORKS IN SOME CASES, NOT IN OTHERS\n ///////////////////////////////////////////////////////////////////////////////\n // "if this panel is floating and the parent is not also a floating panel"...\n if (panelClass=="floatingPanel" && place.className!="floatingPanel") {\n var left=0; var top=btn.offsetHeight;\n if (place.style.position!="relative") { left+=findPosX(btn); top+=findPosY(btn); }\n if (left+panel.offsetWidth > getWindowWidth()) left=getWindowWidth()-panel.offsetWidth;\n panel.style.left=left+"px"; panel.style.top=top+"px";\n }\n}\n\nfunction getWindowWidth() {\n if(document.width!=undefined)\n return document.width; // moz (FF)\n if(document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) )\n return document.documentElement.clientWidth; // IE6\n if(document.body && ( document.body.clientWidth || document.body.clientHeight ) )\n return document.body.clientWidth; // IE4\n if(window.innerWidth!=undefined)\n return window.innerWidth; // IE - general\n return 0; // unknown\n}\n//}}}\n// //===
You can wrap any text in an HTML {{{<span>}}} or {{{<div>}}} with a specified CSS class. This allows custom CSS styling in a nice, modular way. By placing a rule in your StyleSheet tiddler like {{{.wrappingClass{color: #666; background: #bbb} }}} you can markup a piece of text in the tiddler using this code:\n\n{{{\n{{wrappingClass{Text that is now accentuated}}}\n}}}\n\n{{wrappingClass{Text that is now accentuated}}}\n\nBy default, the text is placed in a {{{<span>}}}. To use a {{{<div>}}} instead, insert a line break before the text:\n\n{{{\n{{wrappingClass{\nText that is now accentuated}}}\n}}}\n\n{{wrappingClass{\nText that is now accentuated}}}\n
/***\n|''Name:''|NestedSlidersTweaks|\n|''Version:''|0.5.0 (07-Mar-2006)|\n|''Source:''|http://rodney.gotdns.com|\n|''Author:''|[[RodneyGomes]]|\n|''Type:''|PluginTweak+Macro|\n\n!Dependencies\nThis is a plugin tweak and it requires NestedSlidersPlugins\n\n!Description\nThis tweak allows you to define nicer looking popup menus... (more description \nto come soon)\n\n!Usage\nMore information soon.\n\n!Example\n<<nstweak on>>+++^[Menu1]\nMenuOption1\nMenuOption2\n+++^[NestedMenu]\nMenuOption3\nMenuOption4\n===\nMenuOption5\n===<<nstweak off>>\n\n// //+++[Revision History]>\n*v0.5.0\n** IE 6 support!\n*v0.4.1\n** fixed up general coding style (mainly because of Firefox 1.5.0.1 bugs)\n* v0.4\n** fixed the buttons to now refresh on click so that even if the tiddler moves\n the next time you click on the button of the slider will make it open in the \n right place.\n* v0.3.1\n** fixed issue with some browsers complaining about "missing formal parameter". \n Was associated with the use of the name class as a paramter to some functions.\n* v0.3.0\n** now with macro support!\n* v0.2.0\n** fixed issue with making the onmouseover work for all floatingPanels\n* v0.1.0\n** initial release. \n// //===\n\n\n// //+++[Code]\n***/\n//{{{\n\nconfig.macros.nstweak = {};\n\nconfig.macros.nstweak.clickingOnNestedSliderOrButton = function(e,obj) {\n var res = false;\n \n if (config.macros.nstweak.clickingOn(e,obj) || \n ("button" in obj && config.macros.nstweak.clickingOn(e,obj.button)))\n return true;\n \n var children = obj.childNodes; \n \n for(var i = 0; i < children.length; i++)\n res = res || \n config.macros.nstweak.clickingOnNestedSliderOrButton(e,children[i]);\n \n return res;\n}\n\nconfig.macros.nstweak.old_main_onClick = document.onclick;\ndocument.onclick = function mainOnClick(e) {\n var floatPanels = document.getElementsByTagName("div");\n \n for(var i = 0; i < floatPanels.length; i++) {\n if (floatPanels[i].getAttribute) { \n var panel = floatPanels[i];\n if (panel.getAttribute('clickclass') == 'clickingclass')\n if (!config.macros.nstweak.clickingOnNestedSliderOrButton(e,panel))\n if (panel.style.display != 'none')\n config.macros.nstweak.closeFloatPanel(floatPanels[i]);\n }\n\n if (config.macros.nstweak.old_main_onClick)\n config.macros.nstweak.old_main_onClick(e);\n }\n}\n\nconfig.macros.nstweak.getElementPosition = function(obj) {\n var offsetTrail = obj;\n var offsetLeft = 0;\n var offsetTop = 0;\n \n while (offsetTrail) {\n offsetLeft += offsetTrail.offsetLeft;\n offsetTop += offsetTrail.offsetTop;\n offsetTrail = offsetTrail.offsetParent;\n }\n \n return {left:offsetLeft, top:offsetTop};\n}\n\nfunction getPageX(e) {\n if (!e) e = window.event;\n if (config.browser.isIE){\n return e.offsetX;\n } else {\n return e.pageX;\n }\n}\n\nfunction getPageY(e) { \n if (!e) e = window.event;\n \n if (config.browser.isIE){\n return e.offsetY;\n } else {\n return e.pageY;\n }\n}\n\nconfig.macros.nstweak.clickingOn = function(e,obj) {\n var posObj = config.macros.nstweak.getElementPosition(obj);\n \n return ((posObj.left < getPageX(e)) && (posObj.left + obj.offsetWidth > getPageX(e)) &&\n (posObj.top < getPageY(e)) && (posObj.top + obj.offsetHeight > getPageY(e)));\n}\n\nconfig.macros.nstweak.closeFloatPanel = function(panel) { \n if (panel.getAttribute)\n if (panel.getAttribute('clickclass') == 'clickingclass')\n panel.style.display = 'none';\n}\n\nconfig.macros.nstweak.closeAllSlidersOfClass = function(_class,place) {\n var elements = place.getElementsByTagName("div");\n \n for(var i = 0; i < elements.length; i++ ) {\n if (elements[i].getAttribute)\n if (elements[i].getAttribute('clickclass') == _class)\n elements[i].style.display = 'none';\n } \n}\n\nconfig.macros.nstweak.allPanelsClosed = function(_class) {\n var elements = document.getElementsByTagName("div");\n var res = true;\n \n for(var i = 0; i < elements.length;i++ ) { \n if (elements[i].getAttribute)\n if (elements[i].getAttribute("clickclass") == _class)\n res = res && (elements[i].style.display == "none");\n } \n \n return res;\n}\n\nconfig.macros.nstweak.state = false;\n\nconfig.macros.nstweak.buttonpopupclass = "buttonpopup";\nconfig.macros.nstweak.sliderpopupclass = "sliderpopup";\nconfig.macros.nstweak.nestedbuttonpopupclass = "nestedbuttonpopup";\nconfig.macros.nstweak.nestedsliderpopupclass = "nestedsliderpopup";\n\nconfig.macros.nstweak.enabled_floating_panel = {};\n\nconfig.macros.nstweak.handler = function(place,macroName,params) {\n if (params[1]) this.buttonpopupclass = params[1];\n if (params[2]) this.sliderpopupclass = params[2];\n if (params[3]) this.nestedbuttonpopupclass = params[3];\n if (params[4]) this.nestedsliderpopupclass = params[4];\n \n if (params[0].toLowerCase() == 'on')\n this.state = true;\n else\n this.state = false; \n}\n\n// hijack NestedSlidersPlugin hook :)\nwindow.adjustSliderPos = function(place,btn,panel,panelClass) {\n if (config.macros.nstweak.state) {\n var _panelClass = panelClass; \n if ( panelClass == "floatingPanel") {\n var _clickclass = "clickingclass";\n \n config.macros.nstweak.enabled_floating_panel[_clickclass] = false;\n \n var onMouseOver = function(e) {\n if (!e) var e = window.event;\n var theTarget = resolveTarget(e);\n \n // Small trick for when everything is closed because it's basically lost\n // focus and therefore we reset the enabled back to false.\n if (config.macros.nstweak.allPanelsClosed(_clickclass)) {\n config.macros.nstweak.enabled_floating_panel[_clickclass] = false;\n return;\n }\n \n // only click if this panelclass is the same as the enabled one and if it is not already shown!\n if (config.macros.nstweak.enabled_floating_panel[_clickclass] && theTarget.sliderPanel.style.display == "none") {\n config.macros.nstweak.closeAllSlidersOfClass(_clickclass,place);\n onMouseClick(e); \n }\n }\n \n var old_onMouseClick = btn.onclick;\n var onMouseClick = function(e) { \n\n if (!e) var e = window.event;\n var theTarget = resolveTarget(e);\n var theSlider = theTarget.sliderPanel\n \n if (theSlider.getAttribute("sliderclass") == "base") {\n var left=0; \n var top=theSlider.button.offsetHeight;\n \n if (theSlider.style.position!="relative") { \n left+=findPosX(theSlider.button); \n top+=findPosY(theSlider.button); \n }\n \n theSlider.style.left=left+"px"; \n theSlider.style.top=top+"px";\n }\n \n if (old_onMouseClick) \n old_onMouseClick(e); \n \n config.macros.nstweak.enabled_floating_panel[_clickclass] = true; \n }\n \n panel.setAttribute("clickclass",_clickclass);\n \n btn.onmouseover = onMouseOver;\n btn.onclick = onMouseClick;\n \n if (place.className=="floatingPanel") {\n panel.className = config.macros.nstweak.nestedsliderpopupclass;\n btn.className = config.macros.nstweak.nestedbuttonpopupclass; \n panel.setAttribute("sliderclass","nested");\n } else { \n panel.className = config.macros.nstweak.sliderpopupclass;\n btn.className = config.macros.nstweak.buttonpopupclass; \n panel.setAttribute("sliderclass","base"); \n }\n }\n } else {\n ///////////////////////////////////////////////////////////////////////////////\n /// EXPERIMENTAL HACK - WORKS IN SOME CASES, NOT IN OTHERS\n ///////////////////////////////////////////////////////////////////////////////\n // "if this panel is floating and the parent is not also a floating panel"...\n if (panelClass=="floatingPanel" && place.className!="floatingPanel") {\n var left=0; var top=btn.offsetHeight;\n if (place.style.position!="relative") { left+=findPosX(btn); top+=findPosY(btn); }\n panel.style.left=left+"px"; panel.style.top=top+"px";\n }\n }\n}\n\n//}}}\n// //===
/***\n| Name:|SiteMapMacro|\n| Author:|Simon Baird|\n| Location:|http://simonbaird.com/mptw/#SiteMapMacro|\n| Version:|1.0.3, 15-Mar-06|\n\n!!Examples\nSee SiteMap and SliderSiteMap for example usage.\n\n!!Parameters\n* Name of tiddler to start at\n* Max depth (a number) \n* Format (eg, nested, see formats below)\n* Don't show root flag (anything other than null turns it on)\n* Tags - a string containing a bracketed list of tags that we are interested in\n\n!!History\n* 1.0.3 (15-Mar-06)\n** added tag filtering\n* 1.0.2 (15-Mar-06)\n** Added json format and dontshowroot option\n* 1.0.1 (9-Mar-06)\n** Added selectable formats and fixed nested slider format\n* 1.0.0 (8-Mar-06)\n** first release\n\n***/\n//{{{\n\nversion.extensions.SiteMapMacro = {\n major: 1,\n minor: 0,\n revision: 3,\n date: new Date(2006,3,15),\n source: "http://simonbaird.com/mptw/#SiteMapMacro"\n};\n\nconfig.macros.siteMap = {\n\n formats: {\n bullets: {\n formatString: "%0[[%1]]\sn%2",\n indentString: "*"\n },\n\n // put this in your StyleSheet to make it look good.\n // .sliderPanel { margin-left: 2em; }\n\n sliders: {\n formatString: "[[%1]]+++\sn%2===\sn\sn",\n formatStringLeaf: "[[%1]]\sn"\n },\n\n openSliders: {\n formatString: "[[%1]]++++\sn%2===\sn\sn",\n formatStringLeaf: "[[%1]]\sn"\n },\n\n popups: {\n formatString: "[[%1]]+++^\sn%2===\sn\sn",\n formatStringLeaf: "[[%1]]\sn"\n },\n\n // these don't work too well\n openPopups: {\n formatString: "[[%1]]++++^\sn%2===\sn\sn",\n formatStringLeaf: "[[%1]]\sn"\n },\n \n // this is a little nuts but it works\n json: {\n formatString: '\sn%0{"%1":[%2\sn%0]}',\n formatStringLeaf: '\sn%0"%1"',\n indentString: " ",\n separatorString: ","\n }\n\n\n },\n\n defaultFormat: "bullets",\n\n treeTraverse: function(title,depth,maxdepth,format,dontshowroot,tags,excludetags) {\n\n var tiddler = store.getTiddler(title);\n var tagging = store.getTaggedTiddlers(title);\n\n if (dontshowroot)\n depth = 0;\n\n var indent = "";\n if (this.formats[format].indentString)\n for (var j=0;j<depth;j++)\n indent += this.formats[format].indentString;\n\n var childOutput = "";\n if (!maxdepth || depth < parseInt(maxdepth)) \n for (var i=0;i<tagging.length;i++)\n if (tagging[i].title != title) {\n if (this.formats[format].separatorString && i != 0)\n childOutput += this.formats[format].separatorString;\n childOutput += this.treeTraverse(tagging[i].title,depth+1,maxdepth,format,null,tags,excludetags);\n }\n\n if (childOutput == "" && (\n (tags && tags != "" && !tiddler.tags.containsAll(tags.readBracketedList())) ||\n (excludetags && excludetags != "" && tiddler.tags.containsAny(excludetags.readBracketedList()))\n )\n ) {\n // so prune it cos it doesn't have the right tags and neither do any of it's children\n return "";\n }\n\n if (dontshowroot)\n return childOutput;\n\n if (this.formats[format].formatStringLeaf && childOutput == "") {\n // required for nestedSliders\n return this.formats[format].formatStringLeaf.format([indent,title,childOutput]);\n }\n\n return this.formats[format].formatString.format([indent,title,childOutput]);\n },\n\n handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n wikify(this.treeTraverse(\n params[0] && params[0] != '.' ? params[0] : tiddler.title, 1, \n params[1] && params[1] != '.' ? params[1] : null, // maxdepth\n params[2] && params[2] != '.' ? params[2] : this.defaultFormat, // format\n params[3] && params[3] != '.' ? params[3] : null, // dontshowroot\n params[4] && params[4] != '.' ? params[4] : null, // tags\n params[5] && params[5] != '.' ? params[5] : null // excludetags\n ),place);\n }\n\n}\n\n//}}}\n
/***\n|Name|TagglyListPlugin|\n|Created by|SimonBaird|\n|Location|http://simonbaird.com/mptw/#TagglyListPlugin|\n|Version|1.1.2 25-Apr-06|\n|Requires|See TagglyTagging|\n\n!History\n* 1.1.2 (25-Apr-2006) embedded TagglyTaggingStyles. No longer need separated tiddler for styles.\n* 1.1.1 (6-Mar-2006) fixed bug with refreshAllVisible closing tiddlers being edited. Thanks Luke Blanshard.\n\n***/\n\n/***\n!Setup and config\n***/\n//{{{\n\nversion.extensions.TagglyListPlugin = {\n major: 1, minor: 1, revision: 2,\n date: new Date(2006,4,25),\n source: "http://simonbaird.com/mptw/#TagglyListPlugin"\n};\n\nconfig.macros.tagglyList = {};\nconfig.macros.tagglyListByTag = {};\nconfig.macros.tagglyListControl = {};\nconfig.macros.tagglyListWithSort = {};\nconfig.macros.hideSomeTags = {};\n\n// change this to your preference\nconfig.macros.tagglyListWithSort.maxCols = 6;\n\nconfig.macros.tagglyList.label = "Tagged as %0:";\n\n// the default sort options. set these to your preference\nconfig.macros.tagglyListWithSort.defaults = {\n sortBy:"title", // title|created|modified\n sortOrder: "asc", // asc|desc\n hideState: "show", // show|hide\n groupState: "nogroup", // nogroup|group\n numCols: 1\n};\n\n// these tags will be ignored by the grouped view\nconfig.macros.tagglyListByTag.excludeTheseTags = [\n "systemConfig",\n "TiddlerTemplates"\n];\n\nconfig.macros.tagglyListControl.tags = {\n title:"sortByTitle", \n modified: "sortByModified", \n created: "sortByCreated",\n asc:"sortAsc", \n desc:"sortDesc",\n hide:"hideTagged", \n show:"showTagged",\n nogroup:"noGroupByTag",\n group:"groupByTag",\n cols1:"list1Cols",\n cols2:"list2Cols",\n cols3:"list3Cols",\n cols4:"list4Cols",\n cols5:"list5Cols",\n cols6:"list6Cols",\n cols7:"list7Cols",\n cols8:"list8Cols",\n cols9:"list9Cols" \n}\n\n// note: should match config.macros.tagglyListControl.tags\nconfig.macros.hideSomeTags.tagsToHide = [\n "sortByTitle",\n "sortByCreated",\n "sortByModified",\n "sortDesc",\n "sortAsc",\n "hideTagged",\n "showTagged",\n "noGroupByTag",\n "groupByTag",\n "list1Cols",\n "list2Cols",\n "list3Cols",\n "list4Cols",\n "list5Cols",\n "list6Cols",\n "list7Cols",\n "list8Cols",\n "list9Cols"\n];\n\n\n//}}}\n/***\n\n!Utils\n***/\n//{{{\n// from Eric\nfunction isTagged(title,tag) {\n var t=store.getTiddler(title); if (!t) return false;\n return (t.tags.find(tag)!=null);\n}\n\n// from Eric\nfunction toggleTag(title,tag) {\n var t=store.getTiddler(title); if (!t || !t.tags) return;\n if (t.tags.find(tag)==null) t.tags.push(tag);\n else t.tags.splice(t.tags.find(tag),1);\n}\n\nfunction addTag(title,tag) {\n var t=store.getTiddler(title); if (!t || !t.tags) return;\n t.tags.push(tag);\n}\n\nfunction removeTag(title,tag) {\n var t=store.getTiddler(title); if (!t || !t.tags) return;\n if (t.tags.find(tag)!=null) t.tags.splice(t.tags.find(tag),1);\n}\n\n// from Udo\nArray.prototype.indexOf = function(item) {\n for (var i = 0; i < this.length; i++) {\n if (this[i] == item) {\n return i;\n }\n }\n return -1;\n};\nArray.prototype.contains = function(item) {\n return (this.indexOf(item) >= 0);\n}\n//}}}\n/***\n\n!tagglyList\ndisplays a list of tagged tiddlers. \nparameters are sortField and sortOrder\n***/\n//{{{\n\n// not used at the moment...\nfunction sortedListOfOtherTags(tiddler,thisTag) {\n var list = tiddler.tags.concat(); // so we are working on a clone..\n for (var i=0;i<config.macros.hideSomeTags.tagsToHide.length;i++) {\n if (list.find(config.macros.hideSomeTags.tagsToHide[i]) != null)\n list.splice(list.find(config.macros.hideSomeTags.tagsToHide[i]),1); // remove hidden ones\n }\n for (var i=0;i<config.macros.tagglyListByTag.excludeTheseTags.length;i++) {\n if (list.find(config.macros.tagglyListByTag.excludeTheseTags[i]) != null)\n list.splice(list.find(config.macros.tagglyListByTag.excludeTheseTags[i]),1); // remove excluded ones\n }\n list.splice(list.find(thisTag),1); // remove thisTag\n return '[[' + list.sort().join("]] [[") + ']]';\n}\n\nfunction sortHelper(a,b) {\n if (a == b) return 0;\n else if (a < b) return -1;\n else return +1;\n}\n\nconfig.macros.tagglyListByTag.handler = function (place,macroName,params,wikifier,paramString,tiddler) {\n\n var sortBy = params[0] ? params[0] : "title"; \n var sortOrder = params[1] ? params[1] : "asc";\n\n var result = store.getTaggedTiddlers(tiddler.title,sortBy);\n\n if (sortOrder == "desc")\n result = result.reverse();\n\n var leftOvers = []\n for (var i=0;i<result.length;i++) {\n leftOvers.push(result[i].title);\n }\n\n var allTagsHolder = {};\n for (var i=0;i<result.length;i++) {\n for (var j=0;j<result[i].tags.length;j++) {\n\n if ( \n result[i].tags[j] != tiddler.title // not this tiddler\n && config.macros.hideSomeTags.tagsToHide.find(result[i].tags[j]) == null // not a hidden one\n && config.macros.tagglyListByTag.excludeTheseTags.find(result[i].tags[j]) == null // not excluded\n ) {\n if (!allTagsHolder[result[i].tags[j]])\n allTagsHolder[result[i].tags[j]] = "";\n allTagsHolder[result[i].tags[j]] += "**[["+result[i].title+"]]\sn";\n\n if (leftOvers.find(result[i].title) != null)\n leftOvers.splice(leftOvers.find(result[i].title),1); // remove from leftovers. at the end it will contain the leftovers...\n }\n }\n }\n\n\n var allTags = [];\n for (var t in allTagsHolder)\n allTags.push(t);\n\n allTags.sort(function(a,b) {\n var tidA = store.getTiddler(a);\n var tidB = store.getTiddler(b);\n if (sortBy == "title") return sortHelper(a,b);\n else if (!tidA && !tidB) return 0;\n else if (!tidA) return -1;\n else if (!tidB) return +1;\n else return sortHelper(tidA[sortBy],tidB[sortBy]);\n });\n\n var markup = "";\n\n if (sortOrder == "desc") {\n allTags.reverse();\n }\n else {\n // leftovers first...\n for (var i=0;i<leftOvers.length;i++)\n markup += "*[["+leftOvers[i]+"]]\sn";\n } \n\n for (var i=0;i<allTags.length;i++)\n markup += "*[["+allTags[i]+"]]\sn" + allTagsHolder[allTags[i]];\n\n if (sortOrder == "desc") {\n // leftovers last...\n for (var i=0;i<leftOvers.length;i++)\n markup += "*[["+leftOvers[i]+"]]\sn";\n }\n\n wikify(markup,place);\n}\n\nconfig.macros.tagglyList.handler = function (place,macroName,params,wikifier,paramString,tiddler) {\n var sortBy = params[0] ? params[0] : "title"; \n var sortOrder = params[1] ? params[1] : "asc";\n var numCols = params[2] ? params[2] : 1;\n\n var result = store.getTaggedTiddlers(tiddler.title,sortBy);\n if (sortOrder == "desc")\n result = result.reverse();\n\n var listSize = result.length;\n var colSize = listSize/numCols;\n var remainder = listSize % numCols;\n\n var upperColsize;\n var lowerColsize;\n if (colSize != Math.floor(colSize)) {\n // it's not an exact fit so..\n lowerColsize = Math.floor(colSize);\n upperColsize = Math.floor(colSize) + 1;\n }\n else {\n lowerColsize = colSize;\n upperColsize = colSize;\n }\n\n var markup = "";\n var c=0;\n\n var newTaggedTable = createTiddlyElement(place,"table");\n var newTaggedBody = createTiddlyElement(newTaggedTable,"tbody");\n var newTaggedTr = createTiddlyElement(newTaggedBody,"tr");\n\n for (var j=0;j<numCols;j++) {\n var foo = "";\n var thisSize;\n\n if (j<remainder)\n thisSize = upperColsize;\n else\n thisSize = lowerColsize;\n\n for (var i=0;i<thisSize;i++) \n foo += ( "*[[" + result[c++].title + "]]\sn"); // was using splitList.shift() but didn't work in IE;\n\n var newTd = createTiddlyElement(newTaggedTr,"td",null,"tagglyTagging");\n wikify(foo,newTd);\n\n }\n\n};\n\n/* snip for later.....\n //var groupBy = params[3] ? params[3] : "t.title.substr(0,1)";\n //var groupBy = params[3] ? params[3] : "sortedListOfOtherTags(t,tiddler.title)";\n //var groupBy = params[3] ? params[3] : "t.modified";\n var groupBy = null; // for now. groupBy here is working but disabled for now.\n\n var prevGroup = "";\n var thisGroup = "";\n\n if (groupBy) {\n result.sort(function(a,b) {\n var t = a; var aSortVal = eval(groupBy); var aSortVal2 = eval("t".sortBy);\n var t = b; var bSortVal = eval(groupBy); var bSortVal2 = eval("t".sortBy);\n var t = b; var bSortVal2 = eval(groupBy);\n return (aSortVal == bSortVal ?\n (aSortVal2 == bSortVal2 ? 0 : (aSortVal2 < bSortVal2 ? -1 : +1)) // yuck\n : (aSortVal < bSortVal ? -1 : +1));\n });\n }\n\n if (groupBy) {\n thisGroup = eval(groupBy);\n if (thisGroup != prevGroup)\n markup += "*[["+thisGroup+']]\sn';\n markup += "**[["+t.title+']]\sn';\n prevGroup = thisGroup;\n }\n\n\n\n*/\n\n\n//}}}\n\n/***\n\n!tagglyListControl\nUse to make the sort control buttons\n***/\n//{{{\n\nfunction getSortBy(title) {\n var tiddler = store.getTiddler(title);\n var defaultVal = config.macros.tagglyListWithSort.defaults.sortBy;\n if (!tiddler) return defaultVal;\n var usetags = config.macros.tagglyListControl.tags;\n if (tiddler.tags.contains(usetags["title"])) return "title";\n else if (tiddler.tags.contains(usetags["modified"])) return "modified";\n else if (tiddler.tags.contains(usetags["created"])) return "created";\n else return defaultVal;\n}\n\nfunction getSortOrder(title) {\n var tiddler = store.getTiddler(title);\n var defaultVal = config.macros.tagglyListWithSort.defaults.sortOrder;\n if (!tiddler) return defaultVal;\n var usetags = config.macros.tagglyListControl.tags;\n if (tiddler.tags.contains(usetags["asc"])) return "asc";\n else if (tiddler.tags.contains(usetags["desc"])) return "desc";\n else return defaultVal;\n}\n\nfunction getHideState(title) {\n var tiddler = store.getTiddler(title);\n var defaultVal = config.macros.tagglyListWithSort.defaults.hideState;\n if (!tiddler) return defaultVal;\n var usetags = config.macros.tagglyListControl.tags;\n if (tiddler.tags.contains(usetags["hide"])) return "hide";\n else if (tiddler.tags.contains(usetags["show"])) return "show";\n else return defaultVal;\n}\n\nfunction getGroupState(title) {\n var tiddler = store.getTiddler(title);\n var defaultVal = config.macros.tagglyListWithSort.defaults.groupState;\n if (!tiddler) return defaultVal;\n var usetags = config.macros.tagglyListControl.tags;\n if (tiddler.tags.contains(usetags["group"])) return "group";\n else if (tiddler.tags.contains(usetags["nogroup"])) return "nogroup";\n else return defaultVal;\n}\n\nfunction getNumCols(title) {\n var tiddler = store.getTiddler(title);\n var defaultVal = config.macros.tagglyListWithSort.defaults.numCols; // an int\n if (!tiddler) return defaultVal;\n var usetags = config.macros.tagglyListControl.tags;\n for (var i=1;i<=config.macros.tagglyListWithSort.maxCols;i++)\n if (tiddler.tags.contains(usetags["cols"+i])) return i;\n return defaultVal;\n}\n\n\nfunction getSortLabel(title,which) {\n // TODO. the strings here should be definable in config\n var by = getSortBy(title);\n var order = getSortOrder(title);\n var hide = getHideState(title);\n var group = getGroupState(title);\n if (which == "hide") return (hide == "show" ? "−" : "+"); // 0x25b8;\n else if (which == "group") return (group == "group" ? "normal" : "grouped");\n else if (which == "cols") return "cols±"; // ±\n else if (by == which) return which + (order == "asc" ? "↓" : "↑"); // ↑ ↓\n else return which;\n}\n\nfunction handleSortClick(title,which) {\n var currentSortBy = getSortBy(title);\n var currentSortOrder = getSortOrder(title);\n var currentHideState = getHideState(title);\n var currentGroupState = getGroupState(title);\n var currentNumCols = getNumCols(title);\n\n var tags = config.macros.tagglyListControl.tags;\n\n // if it doesn't exist, lets create it..\n if (!store.getTiddler(title))\n store.saveTiddler(title,title,"",config.options.txtUserName,new Date(),null);\n\n if (which == "hide") {\n // toggle hide state\n var newHideState = (currentHideState == "hide" ? "show" : "hide");\n removeTag(title,tags[currentHideState]);\n if (newHideState != config.macros.tagglyListWithSort.defaults.hideState)\n toggleTag(title,tags[newHideState]);\n }\n else if (which == "group") {\n // toggle hide state\n var newGroupState = (currentGroupState == "group" ? "nogroup" : "group");\n removeTag(title,tags[currentGroupState]);\n if (newGroupState != config.macros.tagglyListWithSort.defaults.groupState)\n toggleTag(title,tags[newGroupState]);\n }\n else if (which == "cols") {\n // toggle num cols\n var newNumCols = currentNumCols + 1; // confusing. currentNumCols is an int\n if (newNumCols > config.macros.tagglyListWithSort.maxCols || newNumCols > store.getTaggedTiddlers(title).length)\n newNumCols = 1;\n removeTag(title,tags["cols"+currentNumCols]);\n if (("cols"+newNumCols) != config.macros.tagglyListWithSort.defaults.groupState)\n toggleTag(title,tags["cols"+newNumCols]);\n }\n else if (currentSortBy == which) {\n // toggle sort order\n var newSortOrder = (currentSortOrder == "asc" ? "desc" : "asc");\n removeTag(title,tags[currentSortOrder]);\n if (newSortOrder != config.macros.tagglyListWithSort.defaults.sortOrder)\n toggleTag(title,tags[newSortOrder]);\n }\n else {\n // change sortBy only\n removeTag(title,tags["title"]);\n removeTag(title,tags["created"]);\n removeTag(title,tags["modified"]);\n\n if (which != config.macros.tagglyListWithSort.defaults.sortBy)\n toggleTag(title,tags[which]);\n }\n\n store.setDirty(true); // save is required now.\n story.refreshTiddler(title,false,true); // force=true\n}\n\nconfig.macros.tagglyListControl.handler = function (place,macroName,params,wikifier,paramString,tiddler) {\n var onclick = function(e) {\n if (!e) var e = window.event;\n handleSortClick(tiddler.title,params[0]);\n e.cancelBubble = true;\n if (e.stopPropagation) e.stopPropagation();\n return false;\n };\n createTiddlyButton(place,getSortLabel(tiddler.title,params[0]),"Click to change sort options",onclick,params[0]=="hide"?"hidebutton":"button");\n}\n//}}}\n/***\n\n!tagglyListWithSort\nput it all together..\n***/\n//{{{\nconfig.macros.tagglyListWithSort.handler = function (place,macroName,params,wikifier,paramString,tiddler) {\n if (tiddler && store.getTaggedTiddlers(tiddler.title).length > 0)\n // todo make this readable\n wikify(\n "<<tagglyListControl hide>>"+\n (getHideState(tiddler.title) != "hide" ? \n '<html><span class="tagglyLabel">'+config.macros.tagglyList.label.format([tiddler.title])+' </span></html>'+\n "<<tagglyListControl title>><<tagglyListControl modified>><<tagglyListControl created>><<tagglyListControl group>>"+(getGroupState(tiddler.title)=="group"?"":"<<tagglyListControl cols>>")+"\sn" + \n "<<tagglyList" + (getGroupState(tiddler.title)=="group"?"ByTag ":" ") + getSortBy(tiddler.title)+" "+getSortOrder(tiddler.title)+" "+getNumCols(tiddler.title)+">>" // hacky\n // + \sn----\sn" +\n //"<<tagglyList "+getSortBy(tiddler.title)+" "+getSortOrder(tiddler.title)+">>"\n : ""),\n place,null,tiddler);\n}\n\nconfig.macros.tagglyTagging = { handler: config.macros.tagglyListWithSort.handler };\n\n\n//}}}\n/***\n\n!hideSomeTags\nSo we don't see the sort tags.\n(note, they are still there when you edit. Will that be too annoying?\n***/\n//{{{\n\n// based on tags.handler\nconfig.macros.hideSomeTags.handler = function(place,macroName,params,wikifier,paramString,tiddler) {\n var theList = createTiddlyElement(place,"ul");\n if(params[0] && store.tiddlerExists[params[0]])\n tiddler = store.getTiddler(params[0]);\n var lingo = config.views.wikified.tag;\n var prompt = tiddler.tags.length == 0 ? lingo.labelNoTags : lingo.labelTags;\n createTiddlyElement(theList,"li",null,"listTitle",prompt.format([tiddler.title]));\n for(var t=0; t<tiddler.tags.length; t++)\n if (!this.tagsToHide.contains(tiddler.tags[t])) // this is the only difference from tags.handler...\n createTagButton(createTiddlyElement(theList,"li"),tiddler.tags[t],tiddler.title);\n\n}\n\n//}}}\n/***\n\n!Refresh everything when we save a tiddler. So the tagged lists never get stale. Is this too slow???\n***/\n//{{{\n\nfunction refreshAllVisible() {\n story.forEachTiddler(function(title,element) {\n if (element.getAttribute("dirty") != "true") \n story.refreshTiddler(title,false,true);\n });\n}\n\nstory.saveTiddler_orig_mptw = story.saveTiddler;\nstory.saveTiddler = function(title,minorUpdate) {\n var result = this.saveTiddler_orig_mptw(title,minorUpdate);\n refreshAllVisible();\n return result;\n}\n\nstore.removeTiddler_orig_mptw = store.removeTiddler;\nstore.removeTiddler = function(title) {\n this.removeTiddler_orig_mptw(title);\n refreshAllVisible();\n}\n\nconfig.shadowTiddlers.TagglyTaggingStyles = "/***\snTo use, add {{{[[TagglyTaggingStyles]]}}} to your StyleSheet tiddler, or you can just paste the CSS in directly. See also ViewTemplate, EditTemplate and TagglyTagging.\sn***/\sn/*{{{*/\sn.tagglyTagged li.listTitle { display:none;}\sn.tagglyTagged li { display: inline; font-size:90%; }\sn.tagglyTagged ul { margin:0px; padding:0px; }\sn.tagglyTagging { padding-top:0.5em; }\sn.tagglyTagging li.listTitle { display:none;}\sn.tagglyTagging ul { margin-top:0px; padding-top:0.5em; padding-left:2em; margin-bottom:0px; padding-bottom:0px; }\sn\sn/* .tagglyTagging .tghide { display:inline; } */\sn\sn.tagglyTagging { vertical-align: top; margin:0px; padding:0px; }\sn.tagglyTagging table { margin:0px; padding:0px; }\sn\sn\sn.tagglyTagging .button { display:none; margin-left:3px; margin-right:3px; }\sn.tagglyTagging .button, .tagglyTagging .hidebutton { color:#aaa; font-size:90%; border:0px; padding-left:0.3em;padding-right:0.3em;}\sn.tagglyTagging .button:hover, .hidebutton:hover { background:#eee; color:#888; }\sn.selected .tagglyTagging .button { display:inline; }\sn\sn.tagglyTagging .hidebutton { color:white; } /* has to be there so it takes up space. tweak if you're not using a white tiddler bg */\sn.selected .tagglyTagging .hidebutton { color:#aaa }\sn\sn.tagglyLabel { color:#aaa; font-size:90%; }\sn\sn.tagglyTagging ul {padding-top:0px; padding-bottom:0.5em; margin-left:1em; }\sn.tagglyTagging ul ul {list-style-type:disc; margin-left:-1em;}\sn.tagglyTagging ul ul li {margin-left:0.5em; }\sn\sn.editLabel { font-size:90%; padding-top:0.5em; }\sn/*}}}*/\sn";\n\nrefreshStyles("TagglyTaggingStyles");\n\n\n//}}}\n\n// // <html>▸▾−±</html>
TagglyTagging is currently broken up into several components. To install TagglyTagging you should\n#Install the plugins TagglyListPlugin, QuickOpenTagPlugin, RenameTagsPlugin and NewHereCommand\n# Copy the contents of TagglyTaggingViewTemplate and TagglyTaggingEditTemplate to your ViewTemplate and EditTemplate tiddlers respectively\nOr you could just [[Download]] a fresh empty file with TagglyTagging pre-installed and start with that.\n!What is TagglyTagging?\nFor more info about TagglyTagging try the TagglyTaggingFAQ and the TagglyTaggingTutorial.
(See also SliderSiteMap)\n|<<siteMap WhatsNew>><<siteMap FunStuff>>|<<siteMap TagglyTagging>><<siteMap More... 2>>|<<siteMap Plugins 2>>|\n|noBorder threeCol|k\n
Demo of slider formatting in SiteMapMacro\n|!sliders|!openSliders|!popups|\n|{{{<<siteMap TagglyTagging . sliders>>}}}|{{{<<siteMap TagglyTagging . openSliders>>}}}|{{{<<siteMap TagglyTagging . popups>>}}}|\n|<<siteMap TagglyTagging . sliders>>|<<siteMap TagglyTagging . openSliders>>|<<siteMap TagglyTagging . popups>>|
config.messages.customConfigError = "설정에 오류가 있습니다 - %0";\nconfig.messages.savedSnapshotError = "이 TiddlyWiki가 잘못 저장된 것으로 보입니다. 자세한 내용은 http://www.tiddlywiki.com/#DownloadSoftware 를 참조하세요.";\nconfig.messages.subtitleUnknown = "(알 수 없음)";\nconfig.messages.undefinedTiddlerToolTip = "글 '%0' 은 아직 존재하지 않습니다.";\nconfig.messages.externalLinkTooltip = "%0 로의 링크";\nconfig.messages.noTags = "분류된 글이 없습니다.";\nconfig.messages.notFileUrlError = "변경사항을 반영하기 전에 이 TiddlyWiki를 저장해야 합니다.";\nconfig.messages.cantSaveError = "이 브라우저로는 저장할 수 없습니다. 가능하면 [[Firefox|http://mozilla.or.kr]]를 사용해 주세요.";\nconfig.messages.invalidFileError = "원본파일 '%0' 이 올바른 TiddlyWiki 파일이 아닌 것 같습니다.";\nconfig.messages.backupSaved = "백업 파일이 저장되었습니다.";\nconfig.messages.backupFailed = "백업을 실패하였습니다.";\nconfig.messages.rssSaved = "RSS 피드가 저장되었습니다.";\nconfig.messages.rssFailed = "RSS 피드 저장을 실패하였습니다.";\nconfig.messages.emptySaved = "빈 템플릿을 저장하였습니다.";\nconfig.messages.emptyFailed = "빈 템플릿 저장을 실패하였습니다.";\nconfig.messages.mainSaved = "이 TiddlyWiki가 저장되었습니다.";\nconfig.messages.mainFailed = "이 TiddlyWiki의 저장에 실패했습니다. 변경사항이 저장되지 않았습니다.";\nconfig.messages.macroError = "매크로 '%0' 의 실행 중에 오류가 발생했습니다.";\noverwriteWarning: "'%0' 라는 글이 이미 존재합니다. 확인을 누르면 기존의 글은 삭제됩니다.";\n\nconfig.messages.unsavedChangesWarning = "주의하세요! 저장되지 않은 글이 있습니다.\sn\sn확인을 눌러 저장하거나 \sn취소를 눌러 변경된 내용을 취소할 수 있습니다.",\nconfig.messages.dates.months = ["1월", "2월", "3월", "4월", "5월", "6월", "7월", "8월", "9월", "10월", "11월", "12월"];\nconfig.messages.dates.days = ["일요일","월요일", "화요일", "수요일", "목요일","금요일","토요일","일요일"];\n\nconfig.views.wikified.tag.labelNoTags = "분류 없음";\nconfig.views.wikified.tag.labelTags = "분류: ";\nconfig.views.wikified.tag.tooltip = "'%0' 분류된 글 보기";\nconfig.views.wikified.tag.openAllText = "'%0' 분류된 글을 모두 열기";\nconfig.views.wikified.tag.openAllTooltip = "모든 글을 엽니다.";\nconfig.views.wikified.tag.popupNone = "'%0'로 분류된 글이 없습니다.";\n\nconfig.views.editor.tagPrompt = "분류들을 빈 칸으로 구분하거나, 필요하다면 다음과 같이 [[대괄호]]로 묶어 입력해 주세요. 또는 다음을 눌러 기존의 분류를 입력하셔도 됩니다.";\nconfig.views.editor.tagChooser.text = "분류";\nconfig.views.editor.tagChooser.tooltip = "이 글에 기존에 있는 분류를 더합니다.";\nconfig.views.editor.tagChooser.popupNone = "분류가 존재하지 않습니다.";\nconfig.views.editor.tagChooser.tagTooltip = "분류 '%0' 을 추가합니다.";\nconfig.views.editor.defaultText = " '%0' 에 관한 글을 작성해 주세요.";\n\nconfig.macros.search.label = "검색";\nconfig.macros.search.prompt = "이 TiddlyWiki를 검색합니다.";\nconfig.macros.search.successMsg = "%1 를 포함한 %0 개의 글이 검색되었습니다.";\nconfig.macros.search.failureMsg = "%0을 포함한 글을 찾을 수 없습니다.";\nconfig.macros.allTags.tooltip = "'%0' 로 분류된 글 보기";\nconfig.macros.allTags.noTags = "분류된 글이 없습니다.";\nconfig.macros.list.all.prompt = "오름차순으로 정렬된 모든 글";\nconfig.macros.list.missing.prompt = "글을 가리키는 링크는 있지만 존재하지 않는 글";\nconfig.macros.list.orphans.prompt = "어떤 글에서도 참조하지 않는 글";\nconfig.macros.timeline.dateFormat = "YYYY년 MMM DD일";\n\nconfig.macros.closeAll.label = "모든 글 닫기";\nconfig.macros.closeAll.prompt = "현재 열려있는 모든 글을 닫습니다. (현재 편집중인 글은 제외)";\nconfig.macros.permaview.label = "절대경로";\nconfig.macros.permaview.prompt = "현재 보고 있는 글들을 모두 보기 위한 링크";\nconfig.macros.saveChanges.label = "변경사항 저장";\nconfig.macros.saveChanges.prompt = "갱신된 TiddlyWiki를 만들기 위하여 모든 글을 저장합니다.";\nconfig.macros.newTiddler.label = "새 글 쓰기";\nconfig.macros.newTiddler.prompt = "새 글을 만듭니다.";\nconfig.macros.newJournal.label = "새 일기 쓰기";\nconfig.macros.newJournal.prompt = "현재 날짜와 시간을 이용하여 새 글을 만듭니다.";
/***\n| Name:|QuickOpenTagPlugin|\n| Purpose:|Makes tag links into a Taggly style open tag plus a normal style drop down menu|\n| Creator:|SimonBaird|\n| Source:|http://simonbaird.com/mptw/#QuickOpenTagPlugin|\n| Requires:|TW 2.x|\n| Version|1.1 (7-Feb-06)|\n\n!History\n* Version 1.1 (07/02/2006)\n** Fix Firefox 1.5.0.1 crashes\n** Updated by ~BidiX[at]~BidiX.info\n* Version 1.0 (?/01/2006)\n** First release\n\n***/\n//{{{\n\n//⊻ ⊽ ⋁ ▼ \n\nwindow.createTagButton_orig_mptw = createTagButton;\nwindow.createTagButton = function(place,tag,excludeTiddler) {\n var sp = createTiddlyElement(place,"span",null,"quickopentag");\n createTiddlyLink(sp,tag,true,"button");\n var theTag = createTiddlyButton(sp,config.macros.miniTag.dropdownchar,config.views.wikified.tag.tooltip.format([tag]),onClickTag);\n theTag.setAttribute("tag",tag);\n if(excludeTiddler)\n theTag.setAttribute("tiddler",excludeTiddler);\n return(theTag);\n};\n\nconfig.macros.miniTag = {handler:function(place,macroName,params,wikifier,paramString,tiddler) {\n var tagged = store.getTaggedTiddlers(tiddler.title);\n if (tagged.length > 0) {\n var theTag = createTiddlyButton(place,config.macros.miniTag.dropdownchar,config.views.wikified.tag.tooltip.format([tiddler.title]),onClickTag);\n theTag.setAttribute("tag",tiddler.title);\n theTag.className = "miniTag";\n }\n}};\n\nconfig.macros.miniTag.dropdownchar = (document.all?"▼":"▾"); // the fat one is the only one that works in IE\n\nconfig.macros.allTags.handler = function(place,macroName,params)\n{\n var tags = store.getTags();\n var theDateList = createTiddlyElement(place,"ul",null,null,null);\n if(tags.length === 0)\n createTiddlyElement(theDateList,"li",null,"listTitle",this.noTags);\n for (var t=0; t<tags.length; t++)\n {\n var theListItem =createTiddlyElement(theDateList,"li",null,null,null);\n var theLink = createTiddlyLink(theListItem,tags[t][0],true);\n var theCount = " (" + tags[t][1] + ")";\n theLink.appendChild(document.createTextNode(theCount));\n\n var theDropDownBtn = createTiddlyButton(theListItem," "+config.macros.miniTag.dropdownchar,this.tooltip.format([tags[t][0]]),onClickTag);\n theDropDownBtn.setAttribute("tag",tags[t][0]);\n }\n};\n\n\nsetStylesheet(\n ".quickopentag { margin-right:1.2em; border:1px solid #eee; padding:2px; padding-right:0px; padding-left:1px; }\sn"+\n ".quickopentag .tiddlyLink { padding:2px; padding-left:3px; }\sn"+\n ".quickopentag a.button { padding:1px; padding-left:2px; padding-right:2px;}\sn"+\n "a.miniTag {font-size:150%;}\sn"+\n "",\n"QuickOpenTagStyles");\n\n//}}}\n\n/***\n<html>⊻ ⊽ ⋁ ▼ ▾</html>\n***/\n
/***\n| Name:|RenameTagsPlugin|\n| Purpose:|Allows you to easily rename tags|\n| Creator:|SimonBaird|\n| Source:|http://simonbaird.com/mptw/#RenameTagsPlugin|\n| Version:|1.0.1 (5-Mar-06)|\n\n!Description\nIf you rename a tiddler/tag that is tagging other tiddlers this plugin will ask you if you want to rename the tag in each tiddler where it is used. This is essential if you use tags and ever want to rename them. To use it, open the tag you want to rename as a tiddler (it's the last option in the tag popup menu), edit it, rename it and click done. You will asked if you want to rename the tag. Click OK to rename the tag in the tiddlers that use it. Click Cancel to not rename the tag.\n\n!Example\nTry renaming [[Plugins]] or [[CSS]] on this site.\n\n!History\n* 1.0.1 (5-Mar-06) - Added feature to allow renaming of tags without side-effect of creating a tiddler\n* 1.0.0 (5-Mar-06) - First working version\n\n!Code\n***/\n//{{{\n\nversion.extensions.RenameTagsPlugin = {\n major: 1, minor: 0, revision: 0,\n date: new Date(2006,3,5),\n source: "http://simonbaird.com/mptw/#RenameTagsPlugin"\n};\n\nconfig.macros.RenameTagsPlugin = {};\nconfig.macros.RenameTagsPlugin.prompt = "Rename the tag '%0' to '%1' in %2 tidder%3?";\n\n// these are very useful, perhaps they should be in the core\nif (!store.addTag) {\n store.addTag = function(title,tag) {\n var t=this.getTiddler(title); if (!t || !t.tags) return;\n t.tags.push(tag);\n };\n};\n\nif (!store.removeTag) {\n store.removeTag = function(title,tag) {\n var t=this.getTiddler(title); if (!t || !t.tags) return;\n if (t.tags.find(tag)!=null) t.tags.splice(t.tags.find(tag),1);\n };\n};\n\nstore.saveTiddler_orig_tagrename = store.saveTiddler;\nstore.saveTiddler = function(title,newTitle,newBody,modifier,modified,tags) {\n if (title != newTitle && this.getTaggedTiddlers(title).length > 0) {\n // then we are renaming a tag\n var tagged = this.getTaggedTiddlers(title);\n if (confirm(config.macros.RenameTagsPlugin.prompt.format([title,newTitle,tagged.length,tagged.length>1?"s":""]))) {\n for (var i=0;i<tagged.length;i++) {\n store.removeTag(tagged[i].title,title);\n store.addTag(tagged[i].title,newTitle);\n // if tiddler is visible refresh it to show updated tag\n story.refreshTiddler(tagged[i].title,false,true);\n }\n }\n if (!this.tiddlerExists(title) && newBody == "") {\n // dont create unwanted tiddler\n return null;\n }\n }\n return this.saveTiddler_orig_tagrename(title,newTitle,newBody,modifier,modified,tags);\n}\n\n//}}}\n\n
/***\n|Name|NewHereCommand|\n|Source|http://simonbaird.com/mptw/#NewHereCommand|\n|Version|1.0|\n\nCode originally by ArphenLin. Small tweak by SimonBaird\nhttp://aiddlywiki.sourceforge.net/NewHere_demo.html#NewHereCommand\nTo use this you must edit your ViewTemplate and add newHere to the toolbar div, eg\n{{{<div class='toolbar' macro='toolbar ... newHere'></div>}}}\n***/\n\n//{{{\n\nconfig.commands.newHere = {\n text: 'new here',\n tooltip: 'Create a new tiddler tagged as this tiddler',\n handler: function(e,src,title) {\n if (!readOnly) {\n clearMessage();\n var t=document.getElementById('tiddler'+title);\n story.displayTiddler(t,config.macros.newTiddler.title,DEFAULT_EDIT_TEMPLATE);\n story.setTiddlerTag(config.macros.newTiddler.title, title, 0);\n story.focusTiddler(config.macros.newTiddler.title,"title");\n return false;\n }\n }\n};\n\n//}}}
You can do this right here and now. Maybe you should print this out so it's easy to follow while working on screen. I presume you have some familiarity with TiddlyWiki basics. If you are having trouble following this then try this [[excellent tutorial|http://www.blogjones.com/TiddlyWikiTutorial.html]] first.\n\n!Getting started: Create some content\n* First hit "close others" to clear up your screen\n* Click "new tiddler" from the main menu.\n* Name the tiddler "~MyStuff" by typing into the title box.\n* Add some contents to the contents box, for example "This is my stuff"\n* Click the Done button to save the new tiddler. (We will return to this one later).\n* Let's say you just returned from a meeting and want to enter a couple of notes about it\n** Click "new tiddler"\n** Enter tiddler title as "Meeting with Leo - 12 Oct"\n** Add some meeting notes in the content box\n** Don't click Done just yet...\n\n!Tagging your content\n* Before you save the "Meeting with Leo..." tiddler let's add some tags\n** It's a meeting so let's give it a tag called "Meetings". Type Meetings in the tags box.\n** The meeting was with Leo so let's give it a tag called Leo. Type Leo in the tags box.\n** Let's say the meeting was about budget planning for example. Type Budget in the tags box.\n** So your tags box should look like this: {{{Meetings Leo Budget}}}\n*Now save the tiddler by clicking the Done button.\n\n!Using the tags\n*No big deal so far, right? Now we start to get into TagglyTagging territory.\n*Notice the tags appear above the title. They are italicised to indicate they don't exist yet (just like any other tiddler that doesn't exist yet).\n*Click on the Leo tag. You will open an empty tiddler called Leo.\n**Give it some content like "Leo Runcible, ext 1234. Likes cats". Or whatever.\n**Leo's a person so give him a tag of "People" by typing People in the tags box.\n**Save it by clicking Done.\n\n!Lets pick up the pace\n*Go back to your "Meeting with Leo..." tiddler.\n** Click on Meetings. Give Meetings a tag of ~MyStuff and save it.\n** Click on Budget. Give Budget a tag of Projects. Type something about the Budget project in the tiddler contents if you want. Save it.\n** Now above the Budget title click on the Projects tag. Give Projects a tag of ~MyStuff. Save that.\n* Now find your ~MyStuff tiddler. Look at the tagged tiddler list which appears at the bottom of the tiddler. It should be a list containing Meetings, People and Projects.\n* Close a few tiddlers and try navigating to your meeting tiddler from ~MyStuff using the tagged tiddler lists.\n\nThat's a quick look at the basics of TagglyTagging. Hopefully by now you have some idea about what TagglyTagging can do. Play around with it a little more if you like. Then continue to...\n\n!The New Here Button\n* Click on People.\n* Do you know any other people?\n* If so click, "new here" in the People tiddler\n** Notice that the tags box already contains the tag People. (This is what the new here button does. It creates a new tiddler with the tag already filled in).\n** Type someone's name and some notes on that person. Click Done to Save.\n* Add a couple more people for fun\n** Notice what happens to the "tagged tiddler" list at the bottom of the People tiddler.\n\n!Changing the structure of your data\nLet's look at how easy it is to change your structure. Suppose you decide that you want to have different types of Projects: Ongoing, Current and Future\n* Go to your Budget tiddler. Edit it and change the Projects tag to Ongoing Projects. Save.\n* Click the Ongoing Projects tag. Give that a tag of "Projects".\n* That's it. You're done. Well actually you haven't added the Ongoing and Future Projects but you can see that's not hard. Maybe click "new here" at the Projects tiddler. Or maybe just tag a project as Future Projects and do it from the bottom up.\n\n!Another example\n* Suppose your original meeting had an action item for you. Type it into the meeting notes as a wiki word or {{{[[}}}Do Something{{{]]}}}.\n* Now click on it and give it a tag of Todo. Type any extra information about how you're going to do it when it's due by etc into the contents. Put a reminder in there if you have ReminderPlugin installed.\n* Now make sure you can get to your Todos by tagging Todo tiddler as MyStuff.\n* For convenience let's put a link to MyStuff in your MainMenu. This will put all your new organised information at your fingertips at all times.\n\n!Sort Controls and Columns\n* If you mouse over a tagged tiddler list you should some buttons. Try them out. Note that if you save it remembers your choice.\n\n!Wrapup\nHopefully you can see that TagglyTagging gives you a powerful way to organise and structure your information. Don't forget that you can still use conventional wiki links to navigate around your tiddlers. TagglyTagging just gives you another way to do cool stuff with your TiddlyWiki.\n\n\n~~This tutorial is a draft. Feedback is welcome. Please [[contact|Contact]] me with comments and suggestions.~~\n
/***\nFor use in ViewTemplate \n***/\n//{{{\n\nconfig.macros.hideWhen = {};\nconfig.macros.hideWhen.handler = function (place,macroName,params,wikifier,paramString,tiddler) {\n if (eval(params[0]))\n place.style["display"] = 'none';\n}\n\nconfig.macros.hideUnless = {};\nconfig.macros.hideUnless.handler = function (place,macroName,params,wikifier,paramString,tiddler) {\n if (!eval(params[0]))\n place.style["display"] = 'none';\n}\n\n\n//}}}
/***\n|''Name:''|CloseUnsavedOnCancel|\n|''Sourse''|http://jackparke.googlepages.com/jtw.html#CloseUnsavedOnCancel|\n|''Version:''|2.0.8 (16-Apr-2006)|\n|''Author:''|SimonBaird|\n|''Adapted By:''|[[Jack]]|\n|''Type:''|Plugin|\n!Description\nWhen you click new tiddler then click cancel I think the new tiddler should close automatically. This plugin implements that behavious.\n\n!Revision History\n* 1.0.1 (11-Oct-2005) by SimonBaird\n* 2.0.8 Made 2.0.x compatible by Jack on 16-Apr-2006\n\n!Code\n***/\n//{{{\n\nconfig.commands.cancelTiddler.handler = function(event,src,title) {\n if(story.hasChanges(title) && !readOnly)\n if(!confirm(this.warning.format([title])))\n return false;\n story.setDirty(title,false);\n if (!store.tiddlerExists(title) || store.fetchTiddler(title).modifier==config.views.wikified.defaultModifier) {\n story.closeTiddler(title,false);\n store.removeTiddler(title)\n } else {\n story.displayTiddler(null,title);\n }\n return false;\n}\n\n//}}}
/***\nExamples:\n\n|Code|Description|Example|h\n|{{{<<toggleTag>>}}}|Toggles the default tag (checked) in this tiddler|<<toggleTag>>|\n|{{{<<toggleTag TagName>>}}}|Toggles the TagName tag in this tiddler|<<toggleTag TagName>>|\n|{{{<<toggleTag TagName TiddlerName>>}}}|Toggles the TagName tag in the TiddlerName tiddler|<<toggleTag TagName TiddlerName>>|\n|{{{<<toggleTag TagName TiddlerName nolabel>>Click me}}}|Same but hide the label|<<toggleTag TagName TiddlerName nolabel>>Click me|\n(Note if TiddlerName doesn't exist it will be silently created)\n\n!Known issues\n* Doesn't smoothly handle the case where you toggle a tag in a tiddler that is current open for editing. Should it stick the tag in the edit box?\n\n!Code\n***/\n//{{{\n\n\n// This function contributed by Eric Shulman\nfunction toggleTag(title,tag) {\n var t=store.getTiddler(title); if (!t || !t.tags) return;\n if (t.tags.find(tag)==null) t.tags.push(tag)\n else t.tags.splice(t.tags.find(tag),1)\n}\n\n// This function contributed by Eric Shulman\nfunction isTagged(title,tag) {\n var t=store.getTiddler(title); if (!t) return false;\n return (t.tags.find(tag)!=null);\n}\n\nconfig.macros.toggleTag = {};\nconfig.views.wikified.toggleTag = {fulllabel: "[[%0]] [[%1]]", shortlabel: "[[%0]]", nolabel: "" };\n\nconfig.macros.toggleTag.handler = function(place,macroName,params,wikifier,paramString,tiddler) {\n if(tiddler instanceof Tiddler) {\n var tag = (params[0] && params[0] != '.') ? params[0] : "checked";\n var title = (params[1] && params[1] != '.') ? params[1] : tiddler.title;\n var hidelabel = (params[2] && params[2] != '.') ? true : false;\n var alsoRefreshStyles = (params[3] && params[3] != '.') ? true : false;\n\n var onclick = function(e) {\n if (!e) var e = window.event;\n if (!store.getTiddler(title))\n store.saveTiddler(title,title,"",config.options.txtUserName,new Date(),null);\n toggleTag(title,tag);\n\n store.setDirty(true); // so TW knows it has to save now\n\n story.forEachTiddler(function(title,element) {\n if (element.getAttribute("dirty") != "true") \n story.refreshTiddler(title,false,true);\n });\n\n if (alsoRefreshStyles)\n store.notifyAll();\n\n return false;\n };\n\n var lingo = config.views.wikified.toggleTag;\n\n // this part also contributed by Eric Shulman\n var c = document.createElement("input");\n c.setAttribute("type","checkbox");\n c.onclick=onclick;\n place.appendChild(c);\n c.checked=isTagged(title,tag);\n\n if (!hidelabel) {\n var label = (title!=tiddler.title)?lingo.fulllabel:lingo.shortlabel;\n wikify(label.format([tag,title]),place);\n }\n }\n}\n\n//}}}\n
/***\nIntended for use in ViewTemplate\n!Examples\n|{{{<<runMacroIfTagged [[Groceries]] toggleTag Buy>>}}}|<<runMacroIfTagged [[Groceries]] toggleTag Buy>>|\n|{{{<<runMacroIfTagged Plugins toggleTag systemConfig>>}}}|<<runMacroIfTagged Plugins toggleTag systemConfig>>|\n***/\n//{{{\n\n// This function contributed by Eric Shulman\nfunction toggleTag(title,tag) {\n var t=store.getTiddler(title); if (!t || !t.tags) return;\n if (t.tags.find(tag)==null) t.tags.push(tag)\n else t.tags.splice(t.tags.find(tag),1)\n}\n\n// This function contributed by Eric Shulman\nfunction isTagged(title,tag) {\n var t=store.getTiddler(title); if (!t) return false;\n return (t.tags.find(tag)!=null);\n}\n\nconfig.macros.runMacroIfTagged = {};\nconfig.macros.runMacroIfTagged.handler = function(place,macroName,params,wikifier,paramString,tiddler) {\n if (isTagged(tiddler.title,params[0]))\n config.macros[params[1]].handler(place,params[1],params.slice(2),wikifier,paramString/*fixme*/,tiddler);\n}\n\n//}}}\n/***\n!Todo\n* paramString needs to have the first word removed from the front of it at fixme above\n\n\n***/\n\n
<!---\nSee TagglyTaggingViewTemplate\n--->\n<!--{{{-->\n<div class="toolbar">\n <!-- testing this one -->\n <!--<span style="padding-right:0.75em;" class='fakeButton' macro="viewHtml"></span>-->\n <!--<span style="padding-right:0.75em;" class='fakeButton' macro="viewAsJs"></span>-->\n\n <!-- experimental stuff. puts checkboxes in toolbar -->\n <span style="padding-right:0.75em;" class='fakeButton' macro="runMacroIfTagged Plugins toggleTag systemConfig"></span>\n\n <span macro='toolbar -closeTiddler closeOthers +editTiddler references jump refresh newHere'></span>\n</div>\n<div class="tagglyTagged" macro="hideSomeTags"></div>\n<div><span class='title' macro='view title'></span><span class="miniTag" \n\nmacro="miniTag"></span></div>\n<div class='subtitle'>Created <span macro='view created date [[DD-MM-YY]]'></span>, updated <span macro='view modified date [[DD-MM-\n\nYY]]'></span></div>\n<div class='viewer' macro='view text wikified'></div>\n<div class="tagglyTagging" macro="tagglyTagging"></div>\n<!--}}}-->
<!--{{{-->\n<div class="toolbar" macro="toolbar +saveTiddler closeOthers cancelTiddler deleteTiddler"></div>\n<div class="title" macro="view title"></div>\n<div class="editLabel">Title</div><div class="editor" macro="edit title"></div>\n<div class="editLabel">Tags</div><div class="editor" macro="edit tags"></div>\n<div class="editorFooter"><span macro="message views.editor.tagPrompt"></span><span macro="tagChooser"></span></div>\n<div class="editor" macro="edit text"></div>\n<br/>\n<!--}}}-->
/***\n| Title:|CommaSeparatedTags|\n| Source:|http://simonbaird.com/mptw/#CommaSeparatedTags|\n\n!Notes\n* Probably works badly if you have tags containing commas.\n* If you have a non-shadow EditTemplate you need replace {{{macro="edit tags"}}} with {{{macro="editCommaTags"}}} in EditTemplate.\n\n***/\n//{{{\n\n// copied mostly from config.macros.edit.handler\nconfig.macros.editCommaTags = {handler: function(place,macroName,params,wikifier,paramString,tiddler) {\n if (tiddler instanceof Tiddler) {\n story.setDirty(tiddler.title,true);\n var e = createTiddlyElement(place,"input");\n if(tiddler.isReadOnly())\n e.setAttribute("readOnly","readOnly");\n e.setAttribute("edit","tags");\n e.setAttribute("type","text");\n e.value = tiddler.getTags().readBracketedList().join(", "); // <---- this is the tweak\n e.setAttribute("size","40");\n e.setAttribute("autocomplete","off");\n }\n}};\n\n// install in EditTemplate (won't work if you have a real EditTemplate. Then you must modify EditTemplate yourself)\nconfig.shadowTiddlers.EditTemplate = config.shadowTiddlers.EditTemplate.replace(/macro='edit tags'/,"macro='editCommaTags'"); \n\nString.prototype.readCommaList = function(unique) {\n var n = [];\n var split = this.split(",");\n for (var i=0;i<split.length;i++)\n n.pushUnique(split[i].trim(),unique);\n return n;\n};\n\n\nTiddlyWiki.prototype.saveTiddler_orig_commasep = TiddlyWiki.prototype.saveTiddler;\nTiddlyWiki.prototype.saveTiddler = function(title,newTitle,newBody,modifier,modified,tags) {\n if (typeof tags == "string") {\n tags = tags.readCommaList(); // I don't think it every gets here..\n }\n else {\n tags = tags.join(" ").readCommaList(); // seems strange because the commas are already in the array\n }\n\n return this.saveTiddler_orig_commasep(title,newTitle,newBody,modifier,modified,tags);\n};\n\n//}}}\n
<!---\n| Name:|~TagglyTaggingEditTemplate |\n| Version:|1.1 (12-Jan-2006)|\n| Source:|http://simonbaird.com/mptw/#TagglyTaggingEditTemplate|\n| Purpose:|See TagglyTagging for more info|\n| Requires:|You need the CSS in TagglyTaggingStyles to make it look right|\n--->\n<!--{{{-->\n<div class="toolbar" macro="toolbar +saveTiddler closeOthers -cancelTiddler deleteTiddler"></div>\n<div class="title" macro="view title"></div>\n<div class="editLabel">Title</div><div class="editor" macro="edit title"></div>\n<div class="editLabel">Tags</div><div class="editor" macro="edit tags"></div>\n<div class="editorFooter"><span macro="message views.editor.tagPrompt"></span><span macro="tagChooser"></span></div>\n<div class="editor" macro="edit text"></div>\n<br/>\n<!--}}}-->
<!---\n| Name:|~TagglyTaggingEditTemplate |\n| Version:|1.1 (12-Jan-2006)|\n| Source:|http://simonbaird.com/mptw/#TagglyTaggingEditTemplate|\n| Purpose:|See TagglyTagging for more info|\n| Requires:|You need the CSS in TagglyTaggingStyles to make it look right|\n--->\n<!--{{{-->\n<div class="toolbar" macro="toolbar +saveTiddler closeOthers -cancelTiddler deleteTiddler"></div>\n<div class="title" macro="view title"></div>\n<div class="editLabel">Title</div><div class="editor" macro="edit title"></div>\n<div class="editLabel">Tags</div><div class="editor" macro="edit tags"></div>\n<div class="editorFooter"><span macro="message views.editor.tagPrompt"></span><span macro="tagChooser"></span></div>\n<div class="editor" macro="edit text"></div>\n<br/>\n<!--}}}-->
You can have your own personal, self-contained wiki exactly* like this site in just a few seconds. Here's how to do it.\n# Right click on [[empty_mptw.html|./empty_mptw.html]]\n# Click 'Save link as...' and save the file somewhere locally. Name it whatever you want.\n# When the download is finished, double click the file to open it in your browser\nThat's it! You're now ready configure your page's title, menus etc, and add your own content by following the instructions in your new TiddlyWiki file.\n\n~~* Actually the "empty" file contains the TagglyTagging stuff plus Eric Shulman's ImportTiddlersPlugin. I've removed the more experimental plugins used on this site. See [[here|./empty_mptw.html#excludeSearch]] for a full list of what comes with the empty file.~~
The original, revolutionary, super cool, 100% javascript, microcontent, self-contained wiki in a web page, created and maintained by JeremyRuston. For more information visit http://www.tiddlywiki.com/. MonkeyPirateTiddlyWiki is running TiddlyWiki <<version>>.\n\nSo what is TiddlyWiki? In short it's a wiki implemented in javascript and stored in a single html file. But you can think of it as an ''electronic notepad from the future''. Try these links for more information:\n*[[TiddlyWiki Explanation (euicho.com)|http://euicho.com/index.php?p=123]]\n*[[TiddlyWiki Tutorial (blogjones.com)|http://www.blogjones.com/TiddlyWikiTutorial.html]]\n*[[Wikipedia Entry|http://en.wikipedia.org/wiki/Tiddlywiki]]\n\nOr try my new TiddlyWikiFAQ.
//{{{\n\nDate.prototype.getHours12 = function()\n{\n var h = this.getHours();\n return (h > 12 ? h-12 : ( h > 0 ? h : 12 ));\n}\n\nDate.prototype.getAmPm = function()\n{\n return (this.getHours() >= 12 ? "pm" : "am");\n}\n\n// Substitute date components into a string\n// should be a hijack but hopefull this or something like it will go into core...\nDate.prototype.formatString = function(template)\n{\n template = template.replace(/YYYY/g,this.getFullYear());\n template = template.replace(/YY/g,String.zeroPad(this.getFullYear()-2000,2));\n template = template.replace(/MMM/g,config.messages.dates.months[this.getMonth()]);\n template = template.replace(/0MM/g,String.zeroPad(this.getMonth()+1,2));\n template = template.replace(/MM/g,this.getMonth()+1);\n template = template.replace(/DDD/g,config.messages.dates.days[this.getDay()]);\n template = template.replace(/0DD/g,String.zeroPad(this.getDate(),2));\n template = template.replace(/DDth/g,this.getDate()+this.daySuffix());\n template = template.replace(/DD/g,this.getDate());\n template = template.replace(/0hh12/g,String.zeroPad(this.getHours12(),2)); // <--------- new\n template = template.replace(/hh12/g,this.getHours12()); // <--------- new\n template = template.replace(/0hh/g,String.zeroPad(this.getHours(),2));\n template = template.replace(/hh/g,this.getHours());\n template = template.replace(/0mm/g,String.zeroPad(this.getMinutes(),2));\n template = template.replace(/mm/g,this.getMinutes());\n template = template.replace(/0ss/g,String.zeroPad(this.getSeconds(),2));\n template = template.replace(/ss/g,this.getSeconds());\n template = template.replace(/[ap]m/g,this.getAmPm().toLowerCase()); // <--------- new\n template = template.replace(/[AP]M/g,this.getAmPm().toUpperCase()); // <--------- new\n return template;\n}\n\n//}}}\n\n
/***\n| Name:|TiddlerExcerptTooltip|\n| Source:|http://simonbaird.com/mptw/#TiddlerExcerptTooltip|\n| Author:|Simon Baird, adapted from original version posted to mailing list by Udo Borkowski|\n| Version:|1.0.0|\n| Description:|Make tooltip of tiddler links the first line or excerpt of the tiddler content|\n***/\n//{{{\n\n// adjust the following to your preference\nconfig.TiddlerExcerptTooltip = {\n trimLength: 60,\n dateFormat:"DD-MM-YY"\n}\n\n// %0 is title\n// %1 is modifier\n// %2 is modified date\n// %3 is first line\n// %4 is first so many characters\n// %5 is short modified date\n// %6 is short created date\n\n// firefox seems to trim the tooltip if it gets too long...\nconfig.messages.tiddlerLinkTooltip = "%1/%5: %4";\n\nconfig.messages.tiddlerEmpty = "(empty)";\n\nTiddler.prototype.getSubtitle = function()\n{\n var theModifier = this.modifier;\n if(!theModifier)\n theModifier = config.messages.subtitleUnknown;\n var theModified = this.modified;\n if(theModified)\n theModified = theModified.toLocaleString();\n else\n theModified = config.messages.subtitleUnknown;\n\n var m = this.text.match(/\ss*(.*)/);\n var firstLine = (m != null && m.length >= 1) ? m[1] : "";\n\n var contentExcerpt = this.text.prettyTrim(config.TiddlerExcerptTooltip.trimLength);\n if (contentExcerpt == "")\n contentExcerpt = config.messages.tiddlerEmpty;\n\n var shortModified = this.modified.formatString(config.TiddlerExcerptTooltip.dateFormat);\n var shortCreated = this.created.formatString(config.TiddlerExcerptTooltip.dateFormat);\n\n\n return config.messages.tiddlerLinkTooltip.format(\n [this.title,theModifier,theModified,firstLine,contentExcerpt,shortModified,shortCreated]); \n}\n\n// this lifted from TagUtils\nString.prototype.prettyTrim = function(len,prefix,postfix) {\n var result = this.trim().replace(/\sr\sn/g,' ').replace(/[\sn|\st]/g,' ');\n if (result.length > len - 3)\n return result.trim().substr(0,len) + '...';\n else\n return result;\n}\n\n//}}}\n
/***\n| Name:|AutoCorrectPlugin|\n| Created by:|SimonBaird|\n| Location:|http://simonbaird.com/mptw/#AutoCorrectPlugin|\n| Version:|1.0.0 (06-Apr-2006)|\n| Requires:|~TW2.x|\n!Description\nAuto-corrects a list of mistyped or misspelled words. The list of words can be in any tiddler tagged with autoCorrectWords\n!History\n* 06-Apr-06, version 1.0.0\n** split off from InstantTimestamp\n** read translations from a tiddler instead of javascript array\n!Notes\n* See also InstantTimestamp, BigListForAutoCorrect, MyAutoCorrectWords\n!Code\n***/\n//{{{\n\nversion.extensions.AutoCorrectPlugin = { major: 1, minor: 0, revision: 0, date: new Date(2006,4,6),\n source: "http://simonbaird.com/mptw/#AutoCorrectPlugin"\n};\n\nconfig.AutoCorrectPlugin = {\n wordListTag: "autoCorrectWords",\n excludeTags: [\n "noAutoCorrect",\n "CSS",\n "css",\n "systemConfig",\n "zsystemConfig",\n "Plugins",\n "Plugin",\n "plugins",\n "plugin",\n "javascript",\n "code"\n ],\n excludeTiddlers: [\n "StyleSheet",\n "StyleSheetLayout",\n "StyleSheetColors",\n "StyleSheetPrint"\n ]\n}; \n\nif (!Array.prototype.contains)\n Array.prototype.contains = function(item) {\n return (this.find(item) != null);\n };\n\nif (!Array.prototype.containsAny)\n Array.prototype.containsAny = function(items) {\n for (var i=0;i<items.length;i++)\n if (this.contains(items[i]))\n return true;\n return false;\n };\n\nString.prototype.upperCaseFirst = function() {\n return this.substr(0,1).toUpperCase() + this.substr(1);\n}\n\nTiddlyWiki.prototype.saveTiddler_mptw_autocorrect = TiddlyWiki.prototype.saveTiddler;\nTiddlyWiki.prototype.saveTiddler = function(title,newTitle,newBody,modifier,modified,tags) {\n\n tags = (typeof(tags) == "string") ? tags.readBracketedList() : tags;\n var conf = config.AutoCorrectPlugin;\n\n if ( !tags.containsAny(conf.excludeTags) \n && !tags.contains(conf.wordListTag)\n && !conf.excludeTiddlers.contains(newTitle) ) {\n\n var wordListTiddlers = store.getTaggedTiddlers(conf.wordListTag);\n for (var i=0;i<wordListTiddlers.length;i++) {\n var lines = wordListTiddlers[i].text.split(/$/m);\n for (var j=0;j<lines.length;j++) {\n if (lines[j].indexOf("->") > 0) {\n var replacer = lines[j].trim().split("->");\n newBody = newBody.replace(new RegExp(\n "\s\sb"+replacer[0]+"\s\sb","g"),replacer[1]);\n newBody = newBody.replace(new RegExp(\n "\s\sb"+replacer[0].upperCaseFirst()+"\s\sb","g"),replacer[1].upperCaseFirst());\n }\n }\n }\n }\n\n return this.saveTiddler_mptw_autocorrect(title,newTitle,newBody,modifier,modified,tags);\n}\n\n//}}}\n
/***\n| Name:|InstantTimestamp|\n| Created by:|SimonBaird|\n| Location:|http://simonbaird.com/mptw/#InstantTimestamp|\n| Version:|1.0.4 (06-Apr-2006)|\n| Requires:|~TW2.x|\n!Description\nIf you enter {ts} in your tiddler content (without the spaces) it will be replaced with a timestamp when you save the tiddler. Full list:\n* {ts} or {t} -> timestamp\n* {ds} or {d} -> datestamp\n* !ts or !t at start of line -> !!timestamp\n* !ds or !d at start of line -> !!datestamp\n(I added the extra ! since that's how I like it. Remove it from translations below if required)\n!Notes\n* Change the timeFormat and dateFormat below to suit your preference.\n* See also AutoCorrectPlugin\n!History\n* 06-Apr-06, version 1.0.4\n** removed the AutoCorrect stuff and put it in AutoCorrectPlugin\n* 05-Apr-06, version 1.0.3\n** now have exclusion by tag and tiddler name, probably less important here than in AutoCorrectPlugin\n* 05-Apr-06, version 1.0.2\n** put matches into array to and eval them to allow generic substitutions\n* 05-Apr-06, version 1.0.1\n** added ds for datestamp as suggested by DanielBaird\n** made case insensitive\n** Added translation for !t at start of line\n* 05-Apr-06, version 1.0.0\n** written after suggestion by Achim Wessling \n!Code\n***/\n//{{{\n\nversion.extensions.InstantTimestamp = { major: 1, minor: 0, revision: 4, date: new Date(2006,4,6),\n source: "http://simonbaird.com/mptw/#InstantTimestamp"\n};\n\nconfig.InstantTimestamp = {\n\n timeFormat: 'DD/0MM/YY 0hh:0mm',\n dateFormat: 'DD/0MM/YY',\n\n translations: [\n [/^!ts?$/img, "'!!'+now.formatString(config.InstantTimestamp.timeFormat)"],\n [/^!ds?$/img, "'!!'+now.formatString(config.InstantTimestamp.dateFormat)"],\n [/\s{ts?\s}/ig, "now.formatString(config.InstantTimestamp.timeFormat)"],\n [/\s{ds?\s}/ig, "now.formatString(config.InstantTimestamp.dateFormat)"]\n ],\n excludeTags: [\n "noAutoCorrect",\n "CSS",\n "css",\n "systemConfig",\n "zsystemConfig",\n "Plugins",\n "Plugin",\n "plugins",\n "plugin",\n "javascript",\n "code"\n ],\n excludeTiddlers: [\n "StyleSheet",\n "StyleSheetLayout",\n "StyleSheetColors",\n "StyleSheetPrint"\n ]\n}; \n\nif (!Array.prototype.contains)\n Array.prototype.contains = function(item) {\n return (this.find(item) != null);\n };\n\nif (!Array.prototype.containsAny)\n Array.prototype.containsAny = function(items) {\n for (var i=0;i<items.length;i++)\n if (this.contains(items[i]))\n return true;\n return false;\n };\n\nTiddlyWiki.prototype.saveTiddler_mptw_instanttimestamp = TiddlyWiki.prototype.saveTiddler;\nTiddlyWiki.prototype.saveTiddler = function(title,newTitle,newBody,modifier,modified,tags) {\n\n tags = (typeof(tags) == "string") ? tags.readBracketedList() : tags;\n var conf = config.InstantTimestamp;\n\n if ( !tags.containsAny(conf.excludeTags) \n && !conf.excludeTiddlers.contains(newTitle) ) {\n\n var now = new Date();\n var trans = config.InstantTimestamp.translations;\n for (var i=0;i<trans.length;i++) {\n newBody = newBody.replace(trans[i][0], eval(trans[i][1]));\n }\n }\n\n return this.saveTiddler_mptw_instanttimestamp(title,newTitle,newBody,modifier,modified,tags);\n}\n\n//}}}\n
Designed for use with AutoCorrectPlugin. Tag with autoCorrectWords to enable these translations. Sourced from http://www.actwin.com/rwmack/spelling.htm\n{{{\nabsense->absence\nacceptible->acceptable\naccessable->accessible\naccidently->accidentally\naccomadate->accommodate\naccompanyed->accompanied\naccross->across\nacheivement->achievement\nachievment->achievement\nacomplish->accomplish\nacquiantence->acquaintance\nacquited->acquitted\nactualy->actually\nacuracy->accuracy\naddmission->admission\nadolecent->adolescent\nadress->address\nadviced->advised\nagian->again\nagina->again\nagravate->aggravate\nagressive->aggressive\nahev->have\nahppen->happen\nahve->have\nalomst->almost\nalmsot->almost\nalotted->allotted\nalreayd->already\nalusion->allusion\nalwasy->always\nalwyas->always\namature->amateur\namke->make\namking->making\nanbd->and\nanual->annual\nanytying->anything\naquiantance->acquaintance\naquire->acquire\naquitted->acquitted\narangement->arrangement\narguement->argument\nathat->that\naudeince->audience\naveh->have\navhe->have\nawya->away\nbakc->back\nbaout->about\nbarin->brain\nbcak->back\nbecasue->because\nbecuase->because\nbefoer->before\nbegining->beginning\nbeleive->believe\nbera->bear\nboaut->about\nbusness->business\ncasion->casino\nceratin->certain\nchari->chair\nchasr->characters\nclaer->clear\nclaerer->clearer\nclaerly->clearly\nclera->clear\ncomittee->committee\ncomming->coming\ncommitee->committee\nconstatn->constant\ncoudl->could\ncoudln->couldn\ncpoy->copy\ncxan->can\ndael->deal\ndefinit->definite\nderam->dream\ndeside->decide\ndevide->divide\ndiea->idea\ndoens->doesn\ndoign->doing\ndonig->doing\ndreasm->dreams\ndrnik->drink\ndyas->days\nefel->feel\neles->else\nembarass->embarrass\nembarassing->embarrassing\nembarras->embarrass\nembarrasing->embarrassing\nened->need\nenxt->next\nerally->really\nesle->else\nethose->ethos\neveyr->every\nexagerate->exaggerate\nexagerated->exaggerated\nexagerating->exaggerating\nexistance->existence\neyar->year\neyars->years\neyasr->years\nfianlly->finally\nfidn->find\nfiel->file\nfiels->files\nfinancialy->financially\nfirends->friends\nfirts->first\nfomr->from\nforfiet->forfeit\nforhead->forehead\nforiegn->foreign\nfoudn->found\nfourty->forty\nfreind->friend\nfrist->first\nfulfilment->fulfillment\ngaranteed->guaranteed\ngaurd->guard\ngeneraly->generally\ngerat->great\ngodo->good\ngogin->going\ngonig->going\ngoign->going\ngoverment->government\ngoverner->governor\ngrammaticaly->grammatically\ngrammer->grammar\ngreif->grief\ngrwo->grow\ngraet->great\ngrat->great\ngreta->great\nguage->gauge\nguidence->guidance\nhace->have\nhaev->have\nhapened->happened\nharras->harass\nherad->heard\nhera->hear\nherat->heart\nheroe->hero\nheros->heroes\nhieght->height\nhismelf->himself\nhorus->hours\nhousr->hours\nhten->then\nhtere->there\nhtey->they\nhting->thing\nhtikn->think\nhtink->think\nhtis->this\nhumer->humor\nhvae->have\nhvea->have\nhvaing->having\nhwihc->which\nhwile->while\nhwole->whole\nhypocracy->hypocrisy\nhypocrasy->hypocrisy\nhypocrit->hypocrite\nidae->idea\nidaes->ideas\nidesa->ideas\nilogical->illogical\nimagenary->imaginary\nimagin->imagine\nimediately->immediately\nimense->immense\nimmitate->imitate\nincidently->incidentally\nincredable->incredible\nindependant->independent\nindispensible->indispensable\ninevatible->inevitable\ninevitible->inevitable\ninfinit->infinite\ninocence->innocence\nintelectual->intellectual\ninteligence->intelligence\ninteligent->intelligent\ninterpet->interpret\ninterupt->interrupt\nintrest->interest\nirelevent->irrelevant\niresistable->irresistible\niresistible->irresistible\niritable->irritable\niritated->irritated\nirresistable->irresistible\ninot->into\niwll->will\niwth->with\njeapardy->jeopardy\njstu->just\njsut->just\nknowlege->knowledge\nkonw->know\nkonws->knows\nknwo->know\nknwos->knows\nkwno->know\nlabatory->laboratory\nlabratory->laboratory\nleanr->learn\nlegitamate->legitimate\nleran->learn\nlerans->learns\nlevle->level\nliason->liaison\nlibary->library\nlible->liable\nlief->life\nlieing->lying\nliek->like\nliekd->liked\nliesure->leisure\nlightening->lightning\nlitature->literature\nliterture->literature\nlittel->little\nliuke->like\nliev->live\nlivley->lively\nloev->love\nlonelyness->loneliness\nlonley->lonely\nlonly->lonely\nlsat->last\nlveo->love\nlvoe->love\nmaintainance->maintenance\nmaintainence->maintenance\nmaintenence->maintenance\nmakse->makes\nmanuever->maneuver\nmariage->marriage\nmarrage->marriage\nmathamatics->mathematics\nmear->mere\nmedacine->medicine\nmena->mean\nmenas->means\nmessanger->messenger\nminature->miniature\nmischeivous->mischievous\nmisile->missile\nmkae->make\nmkaes->makes\nmkaing->making\nmkea->make\nmoent->moment\nmoeny->money\nmoer->more\nmorgage->mortgage\nmovei->movie\nmroe->more\nmuscels->muscles\nmysefl->myself\nmysterous->mysterious\nnaturaly->naturally\nnaturely->naturally\nneccessary->necessary\nnecesary->necessary\nneice->niece\nnickle->nickel\nnineth->ninth\nninty->ninety\nnkow->know\nnkwo->know\nnoticable->noticeable\nnoticeing->noticing\nnuculear->nuclear\nnuisanse->nuisance\nnusance->nuisance\noaky->okay\nobstacal->obstacle\nocasionally->occasionally\noccassionally->occasionally\noccurance->occurrence\noccured->occurred\noccurence->occurrence\noccurr->occur\noccurrance->occurrence\nocurr->occur\nocurrance->occurrence\nocurred->occurred\nocurrence->occurrence\noging->going\nomision->omission\nomited->omitted\nomre->more\nonot->onto\nonyl->only\noponent->opponent\noportunity->opportunity\noposite->opposite\noppinion->opinion\noptomism->optimism\norgin->origin\norginal->original\norginize->organize\notehr->other\nowrk->work\nowudl->would\npaide->paid\npalce->place\npamplet->pamphlet\nparalel->parallel (500)\nparrallel->parallel (700)\npasttime->pastime\npayed->paid\npeculure->peculiar\npeice->piece\npeom->poem\npeoms->poems\npeopel->people\npeotry->poetry\nperformence->performance\nperhpas->perhaps\nperhasp->perhaps\npermanent->permanent\npermissable->permissible\nperphas->perhaps\npersonel->personal\nplaned->planned\nplesant->pleasant\npoisin->poison\nposess->possess\nposession->possession\npossable->possible\npossably->possibly\npossesion->possession\npracticaly->practically\npracticly->practically\nprairy->prairie\npreceed->precede\nprefered->preferred\nprepair->prepare\nprepartion->preparation\npresense->presence\nprevelant->prevalent\npriviledge->privilege\nprobablly->probably\nprobelm->problem\nproceed->proceed\nproceedure->procedure\nprofesion->profession\nprofesor->professor\nproffesion->profession\nproffesor->professor\nprominant->prominent\nprophacy->prophecy\npropoganda->propaganda\npsycology->psychology\npublically->publicly\npumkin->pumpkin\npwoer->power\nqtuie->quite\nquantaty->quantity\nquizes->quizzes\nqutie->quite\nraelly->really\nreacll->recall\nrealy->really\nrealyl->really\nreciept->receipt\nrecieve->receive\nrecieving->receiving\nrecomend->recommend\nrecrod->record\nrediculous->ridiculous\nrefered->referred\nrefering->referring\nreferrence->reference\nregluar->regular\nrela->real\nrelaly->really\nreleive->relieve\nrememberance->remembrance\nrepatition->repetition\nrepresentive->representative\nrestraunt->restaurant\nrewriet->rewrite\nroomate->roommate\nrussina->russian\nrwite->write\nrythm->rhythm\nrythem->rhythm\nsacrafice->sacrifice\nsaftey->safety\nsalery->salary\nsargant->sergeant\nsasy->says\nschedual->schedule\nscirpt->script\nscripot->script\nsecretery->secretary\nseperate->separate\nseverley->severely\nsherif->sheriff\nshineing->shining\nshoudl->should\nshoudln->shouldn\nsieze->seize\nsimpley->simply\nsincerley->sincerely\nsinse->since\nsmae->same\nsmoe->some\nsnese->sense\nsoem->some\nsohw->show\nsophmore->sophomore\nsoudn->sound\nsoudns->sounds\nsotry->story\nsotyr->story\nsould->soul\nsoulds->souls\nspeach->speech\nsponser->sponsor\nstroy->story\nstoyr->story\nstopry->story\nstoreis->stories\nstorise->stories\nstnad->stand\nstpo->stop\nstrat->start\nstubborness->stubbornness\nsuccessfull->successful\nsuceed->succeed\nsuer->sure\nsumary->summary\nsupercede->supersede\nsuperintendant->superintendent\nsupose->suppose\nsupress->suppress\nsurley->surely\nsuround->surround\nsuseptible->susceptible\nswiming->swimming\nsyas->says\ntaeks->takes\ntahn->than\ntaht->that\ntath->that\ntalek->talk\ntalekd->talked\ntehy->they\ntemperment->temperament\ntemperture->temperature\ntendancy->tendency\nthgat->that\ntghe->the\nther->there\ntheri->their\nthge->the\nthier->their\nthign->thing\nthigns->things\nthigsn->things\nthikn->think\nthikns->thinks\nthikning->thinking\nthiunk->think\nthna->than\nthne->then\nthnig->thing\nthnigs->things\nthsi->this\nthsoe->those\nthta->that\ntiem->time\ntih->with\ntihkn->think\ntihs->this\ntimne->time\ntiome->time\ntje->the\ntjhe->the\ntkae->take\ntkaes->takes\ntkaing->taking\ntlaking->talking\ntobbaco->tobacco\ntodya->today\ntommorrow->tomorrow\ntongiht->tonight\ntowrad->toward\ntrafficed->trafficked\ntrafic->traffic\ntransfered->transferred\ntruely->truly\nturnk->trunk\ntwon->town\ntyhat->that\ntyhe->the\ntyrany->tyranny\nunconcious->unconscious\nunecessary->unnecessary\nunmistakeably->unmistakably\nuntill->until\nuseage->usage\nusefull->useful\nuseing->using\nusualy->usually\nvaccum->vacuum\nvaluble->valuable\nvegtable->vegetable\nvenemous->venomous\nvengance->vengeance\nveyr->very\nvigilence->vigilance\nvillin->villain\nvisable->visible\nvrey->very\nvyer->very\nvyre->very\nwaht->what\nwarrent->warrant\nwatn->want\nwehn->when\nweild->wield\nwendsay->Wednesday\nwensday->Wednesday\nwhcih->which\nwhereever->wherever\nwhic->which\nwhihc->which\nwholy->wholly\nwhta->what\nwief->wife\nwierd->weird\nwiht->with\nwintery->wintry\nwirting->writing\nwithdrawl->withdrawal\nwiull->will\nwnat->want\nwnats->wants\nwnated->wanted\nwohle->whole\nwokr->work\nworshipped->worshiped\nwoudl->would\nwriet->write\nwrok->work\nwroking->working\nwroet->wrote\nwtih->with\nyeild->yield\nytou->you\nyera->year\nyeras->years\nyersa->years\nyeasr->years\n}}}
<<list shadowed>>
/***\n|''Name:''|ForEachTiddlerPlugin|\n|''Version:''|1.0.5 (2006-02-05)|\n|''Source:''|http://tiddlywiki.abego-software.de/#ForEachTiddlerPlugin|\n|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|\n|''Licence:''|[[BSD open source license]]|\n|''Macros:''|[[ForEachTiddlerMacro]] v1.0.5|\n|''TiddlyWiki:''|1.2.38+, 2.0|\n|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|\n!Description\n\nCreate customizable lists, tables etc. for your selections of tiddlers. Specify the tiddlers to include and their order through a powerful language.\n\n''Syntax:'' \n|>|{{{<<}}}''forEachTiddler'' [''in'' //tiddlyWikiPath//] [''where'' //whereCondition//] [''sortBy'' //sortExpression// [''ascending'' //or// ''descending'']] [''script'' //scriptText//] [//action// [//actionParameters//]]{{{>>}}}|\n|//tiddlyWikiPath//|The filepath to the TiddlyWiki the macro should work on. When missing the current TiddlyWiki is used.|\n|//whereCondition//|(quoted) JavaScript boolean expression. May refer to the build-in variables {{{tiddler}}} and {{{context}}}.|\n|//sortExpression//|(quoted) JavaScript expression returning "comparable" objects (using '{{{<}}}','{{{>}}}','{{{==}}}'. May refer to the build-in variables {{{tiddler}}} and {{{context}}}.|\n|//scriptText//|(quoted) JavaScript text. Typically defines JavaScript functions that are called by the various JavaScript expressions (whereClause, sortClause, action arguments,...)|\n|//action//|The action that should be performed on every selected tiddler, in the given order. By default the actions [[addToList|AddToListAction]] and [[write|WriteAction]] are supported. When no action is specified [[addToList|AddToListAction]] is used.|\n|//actionParameters//|(action specific) parameters the action may refer while processing the tiddlers (see action descriptions for details). <<tiddler [[JavaScript in actionParameters]]>>|\n|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|\n\nSee details see [[ForEachTiddlerMacro]] and [[ForEachTiddlerExamples]].\n\n!Revision history\n* v1.0.5\n** Pass tiddler containing the macro with wikify, context object also holds reference to tiddler containing the macro ("inTiddler"). Thanks to SimonBaird.\n** Support Firefox 1.5.0.1\n** Internal\n*** Make "JSLint" conform\n*** "Only install once"\n* v1.0.4 (2006-01-06)\n** Support TiddlyWiki 2.0\n* v1.0.3 (2005-12-22)\n** Features: \n*** Write output to a file supports multi-byte environments (Thanks to Bram Chen) \n*** Provide API to access the forEachTiddler functionality directly through JavaScript (see getTiddlers and performMacro)\n** Enhancements:\n*** Improved error messages on InternetExplorer.\n* v1.0.2 (2005-12-10)\n** Features: \n*** context object also holds reference to store (TiddlyWiki)\n** Fixed Bugs: \n*** ForEachTiddler 1.0.1 has broken support on win32 Opera 8.51 (Thanks to BrunoSabin for reporting)\n* v1.0.1 (2005-12-08)\n** Features: \n*** Access tiddlers stored in separated TiddlyWikis through the "in" option. I.e. you are no longer limited to only work on the "current TiddlyWiki".\n*** Write output to an external file using the "toFile" option of the "write" action. With this option you may write your customized tiddler exports.\n*** Use the "script" section to define "helper" JavaScript functions etc. to be used in the various JavaScript expressions (whereClause, sortClause, action arguments,...).\n*** Access and store context information for the current forEachTiddler invocation (through the build-in "context" object) .\n*** Improved script evaluation (for where/sort clause and write scripts).\n* v1.0.0 (2005-11-20)\n** initial version\n\n!Code\n***/\n//{{{\n\n \n//============================================================================\n//============================================================================\n// ForEachTiddlerPlugin\n//============================================================================\n//============================================================================\n\n// Only install once\nif (!version.extensions.ForEachTiddlerPlugin) {\n\nversion.extensions.ForEachTiddlerPlugin = {major: 1, minor: 0, revision: 5, date: new Date(2006,2,5), source: "http://tiddlywiki.abego-software.de/#ForEachTiddlergPlugin"};\n\n// For backward compatibility with TW 1.2.x\n//\nif (!TiddlyWiki.prototype.forEachTiddler) {\n TiddlyWiki.prototype.forEachTiddler = function(callback) {\n for(var t in this.tiddlers) {\n callback.call(this,t,this.tiddlers[t]);\n }\n };\n}\n\n//============================================================================\n// forEachTiddler Macro\n//============================================================================\n\nversion.extensions.forEachTiddler = {major: 1, minor: 0, revision: 5, date: new Date(2006,2,5), provider: "http://tiddlywiki.abego-software.de"};\n\n// ---------------------------------------------------------------------------\n// Configurations and constants \n// ---------------------------------------------------------------------------\n\nconfig.macros.forEachTiddler = {\n // Standard Properties\n label: "forEachTiddler",\n prompt: "Perform actions on a (sorted) selection of tiddlers",\n\n // actions\n actions: {\n addToList: {},\n write: {}\n }\n};\n\n// ---------------------------------------------------------------------------\n// The forEachTiddler Macro Handler \n// ---------------------------------------------------------------------------\n\nconfig.macros.forEachTiddler.getContainingTiddler = function(e) {\n while(e && !hasClass(e,"tiddler"))\n e = e.parentNode;\n var title = e ? e.getAttribute("tiddler") : null; \n return title ? store.getTiddler(title) : null;\n};\n\nconfig.macros.forEachTiddler.handler = function(place,macroName,params,wikifier,paramString,tiddler) {\n // config.macros.forEachTiddler.traceMacroCall(place,macroName,params,wikifier,paramString,tiddler);\n\n if (!tiddler) tiddler = config.macros.forEachTiddler.getContainingTiddler(place);\n // --- Parsing ------------------------------------------\n\n var i = 0; // index running over the params\n // Parse the "in" clause\n var tiddlyWikiPath = undefined;\n if ((i < params.length) && params[i] == "in") {\n i++;\n if (i >= params.length) {\n this.handleError(place, "TiddlyWiki path expected behind 'in'.");\n return;\n }\n tiddlyWikiPath = this.paramEncode((i < params.length) ? params[i] : "");\n i++;\n }\n\n // Parse the where clause\n var whereClause ="true";\n if ((i < params.length) && params[i] == "where") {\n i++;\n whereClause = this.paramEncode((i < params.length) ? params[i] : "");\n i++;\n }\n\n // Parse the sort stuff\n var sortClause = null;\n var sortAscending = true; \n if ((i < params.length) && params[i] == "sortBy") {\n i++;\n if (i >= params.length) {\n this.handleError(place, "sortClause missing behind 'sortBy'.");\n return;\n }\n sortClause = this.paramEncode(params[i]);\n i++;\n\n if ((i < params.length) && (params[i] == "ascending" || params[i] == "descending")) {\n sortAscending = params[i] == "ascending";\n i++;\n }\n }\n\n // Parse the script\n var scriptText = null;\n if ((i < params.length) && params[i] == "script") {\n i++;\n scriptText = this.paramEncode((i < params.length) ? params[i] : "");\n i++;\n }\n\n // Parse the action. \n // When we are already at the end use the default action\n var actionName = "addToList";\n if (i < params.length) {\n if (!config.macros.forEachTiddler.actions[params[i]]) {\n this.handleError(place, "Unknown action '"+params[i]+"'.");\n return;\n } else {\n actionName = params[i]; \n i++;\n }\n } \n \n // Get the action parameter\n // (the parsing is done inside the individual action implementation.)\n var actionParameter = params.slice(i);\n\n\n // --- Processing ------------------------------------------\n try {\n this.performMacro({\n place: place, \n inTiddler: tiddler,\n whereClause: whereClause, \n sortClause: sortClause, \n sortAscending: sortAscending, \n actionName: actionName, \n actionParameter: actionParameter, \n scriptText: scriptText, \n tiddlyWikiPath: tiddlyWikiPath});\n\n } catch (e) {\n this.handleError(place, e);\n }\n};\n\n// Returns an object with properties "tiddlers" and "context".\n// tiddlers holds the (sorted) tiddlers selected by the parameter,\n// context the context of the execution of the macro.\n//\n// The action is not yet performed.\n//\n// @parameter see performMacro\n//\nconfig.macros.forEachTiddler.getTiddlersAndContext = function(parameter) {\n\n var context = config.macros.forEachTiddler.createContext(parameter.place, parameter.whereClause, parameter.sortClause, parameter.sortAscending, parameter.actionName, parameter.actionParameter, parameter.scriptText, parameter.tiddlyWikiPath, parameter.inTiddler);\n\n var tiddlyWiki = parameter.tiddlyWikiPath ? this.loadTiddlyWiki(parameter.tiddlyWikiPath) : store;\n context["tiddlyWiki"] = tiddlyWiki;\n \n // Get the tiddlers, as defined by the whereClause\n var tiddlers = this.findTiddlers(parameter.whereClause, context, tiddlyWiki);\n context["tiddlers"] = tiddlers;\n\n // Sort the tiddlers, when sorting is required.\n if (parameter.sortClause) {\n this.sortTiddlers(tiddlers, parameter.sortClause, parameter.sortAscending, context);\n }\n\n return {tiddlers: tiddlers, context: context};\n};\n\n// Returns the (sorted) tiddlers selected by the parameter.\n//\n// The action is not yet performed.\n//\n// @parameter see performMacro\n//\nconfig.macros.forEachTiddler.getTiddlers = function(parameter) {\n return this.getTiddlersAndContext(parameter).tiddlers;\n};\n\n// Performs the macros with the given parameter.\n//\n// @param parameter holds the parameter of the macro as separate properties.\n// The following properties are supported:\n//\n// place\n// whereClause\n// sortClause\n// sortAscending\n// actionName\n// actionParameter\n// scriptText\n// tiddlyWikiPath\n//\n// All properties are optional. \n// For most actions the place property must be defined.\n//\nconfig.macros.forEachTiddler.performMacro = function(parameter) {\n var tiddlersAndContext = this.getTiddlersAndContext(parameter);\n\n // Perform the action\n var actionName = parameter.actionName ? parameter.actionName : "addToList";\n var action = config.macros.forEachTiddler.actions[actionName];\n if (!action) {\n this.handleError(parameter.place, "Unknown action '"+actionName+"'.");\n return;\n }\n\n var actionHandler = action.handler;\n actionHandler(parameter.place, tiddlersAndContext.tiddlers, parameter.actionParameter, tiddlersAndContext.context);\n};\n\n// ---------------------------------------------------------------------------\n// The actions \n// ---------------------------------------------------------------------------\n\n// Internal.\n//\n// --- The addToList Action -----------------------------------------------\n//\nconfig.macros.forEachTiddler.actions.addToList.handler = function(place, tiddlers, parameter, context) {\n // Parse the parameter\n var p = 0;\n\n // Check for extra parameters\n if (parameter.length > p) {\n config.macros.forEachTiddler.createExtraParameterErrorElement(place, "addToList", parameter, p);\n return;\n }\n\n // Perform the action.\n var list = document.createElement("ul");\n place.appendChild(list);\n for (var i = 0; i < tiddlers.length; i++) {\n var tiddler = tiddlers[i];\n var listItem = document.createElement("li");\n list.appendChild(listItem);\n createTiddlyLink(listItem, tiddler.title, true);\n }\n};\n\n// Internal.\n//\n// --- The write Action ---------------------------------------------------\n//\nconfig.macros.forEachTiddler.actions.write.handler = function(place, tiddlers, parameter, context) {\n // Parse the parameter\n var p = 0;\n if (p >= parameter.length) {\n this.handleError(place, "Missing expression behind 'write'.");\n return;\n }\n\n var textExpression = config.macros.forEachTiddler.paramEncode(parameter[p]);\n p++;\n\n // Parse the "toFile" option\n var filename = null;\n var lineSeparator = undefined;\n if ((p < parameter.length) && parameter[p] == "toFile") {\n p++;\n if (p >= parameter.length) {\n this.handleError(place, "Filename expected behind 'toFile' of 'write' action.");\n return;\n }\n \n filename = config.macros.forEachTiddler.getLocalPath(config.macros.forEachTiddler.paramEncode(parameter[p]));\n p++;\n if ((p < parameter.length) && parameter[p] == "withLineSeparator") {\n p++;\n if (p >= parameter.length) {\n this.handleError(place, "Line separator text expected behind 'withLineSeparator' of 'write' action.");\n return;\n }\n lineSeparator = config.macros.forEachTiddler.paramEncode(parameter[p]);\n p++;\n }\n }\n \n // Check for extra parameters\n if (parameter.length > p) {\n config.macros.forEachTiddler.createExtraParameterErrorElement(place, "write", parameter, p);\n return;\n }\n\n // Perform the action.\n var func = config.macros.forEachTiddler.getEvalTiddlerFunction(textExpression, context);\n var count = tiddlers.length;\n var text = "";\n for (var i = 0; i < count; i++) {\n var tiddler = tiddlers[i];\n text += func(tiddler, context, count, i);\n }\n \n if (filename) {\n if (lineSeparator !== undefined) {\n lineSeparator = lineSeparator.replace(/\s\sn/mg, "\sn").replace(/\s\sr/mg, "\sr");\n text = text.replace(/\sn/mg,lineSeparator);\n }\n saveFile(filename, convertUnicodeToUTF8(text));\n } else {\n var wrapper = createTiddlyElement(place, "span");\n wikify(text, wrapper, null/* highlightRegExp */, context.inTiddler);\n }\n};\n\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n// Internal.\n//\nconfig.macros.forEachTiddler.createContext = function(placeParam, whereClauseParam, sortClauseParam, sortAscendingParam, actionNameParam, actionParameterParam, scriptText, tiddlyWikiPathParam, inTiddlerParam) {\n return {\n place : placeParam, \n whereClause : whereClauseParam, \n sortClause : sortClauseParam, \n sortAscending : sortAscendingParam, \n script : scriptText,\n actionName : actionNameParam, \n actionParameter : actionParameterParam,\n tiddlyWikiPath : tiddlyWikiPathParam,\n inTiddler : inTiddlerParam\n };\n};\n\n// Internal.\n//\n// Returns a TiddlyWiki with the tiddlers loaded from the TiddlyWiki of \n// the given path.\n//\nconfig.macros.forEachTiddler.loadTiddlyWiki = function(path, idPrefix) {\n if (!idPrefix) {\n idPrefix = "store";\n }\n var lenPrefix = idPrefix.length;\n \n // Read the content of the given file\n var content = loadFile(this.getLocalPath(path));\n if(content === null) {\n throw "TiddlyWiki '"+path+"' not found.";\n }\n \n // Locate the storeArea div's\n var posOpeningDiv = content.indexOf(startSaveArea);\n var posClosingDiv = content.lastIndexOf(endSaveArea);\n if((posOpeningDiv == -1) || (posClosingDiv == -1)) {\n throw "File '"+path+"' is not a TiddlyWiki.";\n }\n var storageText = content.substr(posOpeningDiv + startSaveArea.length, posClosingDiv);\n \n // Create a "div" element that contains the storage text\n var myStorageDiv = document.createElement("div");\n myStorageDiv.innerHTML = storageText;\n myStorageDiv.normalize();\n \n // Create all tiddlers in a new TiddlyWiki\n // (following code is modified copy of TiddlyWiki.prototype.loadFromDiv)\n var tiddlyWiki = new TiddlyWiki();\n var store = myStorageDiv.childNodes;\n for(var t = 0; t < store.length; t++) {\n var e = store[t];\n var title = null;\n if(e.getAttribute)\n title = e.getAttribute("tiddler");\n if(!title && e.id && e.id.substr(0,lenPrefix) == idPrefix)\n title = e.id.substr(lenPrefix);\n if(title && title !== "") {\n var tiddler = tiddlyWiki.createTiddler(title);\n tiddler.loadFromDiv(e,title);\n }\n }\n tiddlyWiki.dirty = false;\n\n return tiddlyWiki;\n};\n\n\n \n// Internal.\n//\n// Returns a function that has a function body returning the given javaScriptExpression.\n// The function has the parameters:\n// \n// (tiddler, context, count, index)\n//\nconfig.macros.forEachTiddler.getEvalTiddlerFunction = function (javaScriptExpression, context) {\n var script = context["script"];\n var functionText = "var theFunction = function(tiddler, context, count, index) { return "+javaScriptExpression+"}";\n var fullText = (script ? script+";" : "")+functionText+";theFunction;";\n return eval(fullText);\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.findTiddlers = function(whereClause, context, tiddlyWiki) {\n var result = [];\n var func = config.macros.forEachTiddler.getEvalTiddlerFunction(whereClause, context);\n tiddlyWiki.forEachTiddler(function(title,tiddler) {\n if (func(tiddler, context, undefined, undefined)) {\n result.push(tiddler);\n }\n });\n return result;\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.createExtraParameterErrorElement = function(place, actionName, parameter, firstUnusedIndex) {\n var message = "Extra parameter behind '"+actionName+"':";\n for (var i = firstUnusedIndex; i < parameter.length; i++) {\n message += " "+parameter[i];\n }\n this.handleError(place, message);\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.sortAscending = function(tiddlerA, tiddlerB) {\n var result = \n (tiddlerA.forEachTiddlerSortValue == tiddlerB.forEachTiddlerSortValue) \n ? 0\n : (tiddlerA.forEachTiddlerSortValue < tiddlerB.forEachTiddlerSortValue)\n ? -1 \n : +1; \n return result;\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.sortDescending = function(tiddlerA, tiddlerB) {\n var result = \n (tiddlerA.forEachTiddlerSortValue == tiddlerB.forEachTiddlerSortValue) \n ? 0\n : (tiddlerA.forEachTiddlerSortValue < tiddlerB.forEachTiddlerSortValue)\n ? +1 \n : -1; \n return result;\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.sortTiddlers = function(tiddlers, sortClause, ascending, context) {\n // To avoid evaluating the sortClause whenever two items are compared \n // we pre-calculate the sortValue for every item in the array and store it in a \n // temporary property ("forEachTiddlerSortValue") of the tiddlers.\n var func = config.macros.forEachTiddler.getEvalTiddlerFunction(sortClause, context);\n var count = tiddlers.length;\n var i;\n for (i = 0; i < count; i++) {\n var tiddler = tiddlers[i];\n tiddler.forEachTiddlerSortValue = func(tiddler,context, undefined, undefined);\n }\n\n // Do the sorting\n tiddlers.sort(ascending ? this.sortAscending : this.sortDescending);\n\n // Delete the temporary property that holds the sortValue. \n for (i = 0; i < tiddlers.length; i++) {\n delete tiddlers[i].forEachTiddlerSortValue;\n }\n};\n\n\n// Internal.\n//\nconfig.macros.forEachTiddler.trace = function(message) {\n displayMessage(message);\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.traceMacroCall = function(place,macroName,params) {\n var message ="<<"+macroName;\n for (var i = 0; i < params.length; i++) {\n message += " "+params[i];\n }\n message += ">>";\n displayMessage(message);\n};\n\n\n// Internal.\n//\n// Creates an element that holds an error message\n// \nconfig.macros.forEachTiddler.createErrorElement = function(place, exception) {\n var message = (exception.description) ? exception.description : exception.toString();\n return createTiddlyElement(place,"span",null,"forEachTiddlerError","<<forEachTiddler ...>>: "+message);\n};\n\n// Internal.\n//\n// @param place [may be null]\n//\nconfig.macros.forEachTiddler.handleError = function(place, exception) {\n if (place) {\n this.createErrorElement(place, exception);\n } else {\n throw exception;\n }\n};\n\n// Internal.\n//\n// Encodes the given string.\n//\n// Replaces \n// "$))" to ">>"\n// "$)" to ">"\n//\nconfig.macros.forEachTiddler.paramEncode = function(s) {\n var reGTGT = new RegExp("\s\s$\s\s)\s\s)","mg");\n var reGT = new RegExp("\s\s$\s\s)","mg");\n return s.replace(reGTGT, ">>").replace(reGT, ">");\n};\n\n// Internal.\n//\n// Returns the given original path (that is a file path, starting with "file:")\n// as a path to a local file, in the systems native file format.\n//\n// Location information in the originalPath (i.e. the "#" and stuff following)\n// is stripped.\n// \nconfig.macros.forEachTiddler.getLocalPath = function(originalPath) {\n // Remove any location part of the URL\n var hashPos = originalPath.indexOf("#");\n if(hashPos != -1)\n originalPath = originalPath.substr(0,hashPos);\n // Convert to a native file format assuming\n // "file:///x:/path/path/path..." - pc local file --> "x:\spath\spath\spath..."\n // "file://///server/share/path/path/path..." - FireFox pc network file --> "\s\sserver\sshare\spath\spath\spath..."\n // "file:///path/path/path..." - mac/unix local file --> "/path/path/path..."\n // "file://server/share/path/path/path..." - pc network file --> "\s\sserver\sshare\spath\spath\spath..."\n var localPath;\n if(originalPath.charAt(9) == ":") // pc local file\n localPath = unescape(originalPath.substr(8)).replace(new RegExp("/","g"),"\s\s");\n else if(originalPath.indexOf("file://///") === 0) // FireFox pc network file\n localPath = "\s\s\s\s" + unescape(originalPath.substr(10)).replace(new RegExp("/","g"),"\s\s");\n else if(originalPath.indexOf("file:///") === 0) // mac/unix local file\n localPath = unescape(originalPath.substr(7));\n else if(originalPath.indexOf("file:/") === 0) // mac/unix local file\n localPath = unescape(originalPath.substr(5));\n else // pc network file\n localPath = "\s\s\s\s" + unescape(originalPath.substr(7)).replace(new RegExp("/","g"),"\s\s"); \n return localPath;\n};\n\n// ---------------------------------------------------------------------------\n// Stylesheet Extensions (may be overridden by local StyleSheet)\n// ---------------------------------------------------------------------------\n//\nsetStylesheet(\n ".forEachTiddlerError{color: #ffffff;background-color: #880000;}",\n "forEachTiddler");\n\n//============================================================================\n// End of forEachTiddler Macro\n//============================================================================\n\n\n//============================================================================\n// String.startsWith Function\n//============================================================================\n//\n// Returns true if the string starts with the given prefix, false otherwise.\n//\nversion.extensions["String.startsWith"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nString.prototype.startsWith = function(prefix) {\n var n = prefix.length;\n return (this.length >= n) && (this.slice(0, n) == prefix);\n};\n\n\n\n//============================================================================\n// String.endsWith Function\n//============================================================================\n//\n// Returns true if the string ends with the given suffix, false otherwise.\n//\nversion.extensions["String.endsWith"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nString.prototype.endsWith = function(suffix) {\n var n = suffix.length;\n return (this.length >= n) && (this.right(n) == suffix);\n};\n\n\n//============================================================================\n// String.contains Function\n//============================================================================\n//\n// Returns true when the string contains the given substring, false otherwise.\n//\nversion.extensions["String.contains"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nString.prototype.contains = function(substring) {\n return this.indexOf(substring) >= 0;\n};\n\n//============================================================================\n// Array.indexOf Function\n//============================================================================\n//\n// Returns the index of the first occurance of the given item in the array or \n// -1 when no such item exists.\n//\n// @param item [may be null]\n//\nversion.extensions["Array.indexOf"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nArray.prototype.indexOf = function(item) {\n for (var i = 0; i < this.length; i++) {\n if (this[i] == item) {\n return i;\n }\n }\n return -1;\n};\n\n//============================================================================\n// Array.contains Function\n//============================================================================\n//\n// Returns true when the array contains the given item, otherwise false. \n//\n// @param item [may be null]\n//\nversion.extensions["Array.contains"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nArray.prototype.contains = function(item) {\n return (this.indexOf(item) >= 0);\n};\n\n//============================================================================\n// Array.containsAny Function\n//============================================================================\n//\n// Returns true when the array contains at least one of the elements \n// of the item. Otherwise (or when items contains no elements) false is returned.\n//\nversion.extensions["Array.containsAny"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nArray.prototype.containsAny = function(items) {\n for(var i = 0; i < items.length; i++) {\n if (this.contains(items[i])) {\n return true;\n }\n }\n return false;\n};\n\n\n//============================================================================\n// Array.containsAll Function\n//============================================================================\n//\n// Returns true when the array contains all the items, otherwise false.\n// \n// When items is null false is returned (even if the array contains a null).\n//\n// @param items [may be null] \n//\nversion.extensions["Array.containsAll"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nArray.prototype.containsAll = function(items) {\n for(var i = 0; i < items.length; i++) {\n if (!this.contains(items[i])) {\n return false;\n }\n }\n return true;\n};\n\n\n} // of "install only once"\n\n// Used Globals (for JSLint) ==============\n// ... DOM\n/*global document */\n// ... TiddlyWiki Core\n/*global convertUnicodeToUTF8, createTiddlyElement, createTiddlyLink, \n displayMessage, endSaveArea, hasClass, loadFile, saveFile, \n startSaveArea, store, wikify */\n//}}}\n\n\n/***\n!Licence and Copyright\nCopyright (c) abego Software ~GmbH, 2005 ([[www.abego-software.de|http://www.abego-software.de]])\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\nRedistributions of source code must retain the above copyright notice, this\nlist of conditions and the following disclaimer.\n\nRedistributions in binary form must reproduce the above copyright notice, this\nlist of conditions and the following disclaimer in the documentation and/or other\nmaterials provided with the distribution.\n\nNeither the name of abego Software nor the names of its contributors may be\nused to endorse or promote products derived from this software without specific\nprior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\nOF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\nSHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\nINCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\nTO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\nBUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\nANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH\nDAMAGE.\n***/\n\n
@@color(#04f): ▣ 잡노마드 @@ (Jobnomad) @ 2016-10-31 @\n한 직장에 오래 머물지 못하는 사람을 일컫던 '잡노마드'라는 단어는 최근 새로운 뜻으로 재조명되고 있다. 깊어지는 취업난으로 인해 작업(Job)을 찾아 유목민(Nomad)처럼 떠도는 젊은이들이 늘어나는 탓이다. 일을 구하기 위해 해외로 떠나거나 자신만의 가치를 가지고 새로운 길을 개척하는 이들을 가르켜 잡노마드라 일컫는다. 경제 침체로 인한 구직이 더욱 어려워지면서 잡노마드 역시 늘어날 전망이다.\n\n@@color(#04f): ▣ 전역변수 @@(Global Variable)\n\n@@color(#04f): ▣ 정렬 @@ @ 2021-01-19 @\n-. 내림차순 ; descending order\n-. 올림차순 ; ascending order\n\n@@color(#04f): ▣ 정점버퍼 @@ @ 2022-06-01 @\n; 정점을 모아두는 일종의 메모리로 비디오 메모리와 시스템 메모리 두 가지의 메모리를 사용한다.\n-.비디오 메모리; 비디오카드의 GPU(Graphic Processing Unit)에 의해서 정점 셰이더, T&L 등의 강력한 하드웨어 가속을 사용할 수 있지만, 자체의 메모리 용량을 벗어날 수 없으며, 게다가 텍스처와 함께 사용해야 하기 때문에 사용 가능한 메모리는 더욱 적을 수밖에 없다.\n-.시스템 메모리; T&L등의 강력한 하드웨어 가속은 사용할 수 없지만, 풍부한 용량으로 상대적으로 많은 정점 버퍼를 관리할 수 있다.\n\n@@color(#04f): ▣ 제 3의 공간 @@ @ 2017-02-07 @\n-. 제 1의 공간 ; 주거 공간\n-. 제 2의 공간 ; 근무 공간\n-. 제 3의 공간 ; 집이 아닌 곳에서의 내 집 같은 분위기를 가진 공간\n / 감각적 체험과 오락적 요소가 가미된 정서적 부가가치의 중요성을 기업에서는 주목\n\n@@color(#04f): ▣ 제로섬게임 @@ (zero-sum game)\n\n@@color(#04f): ▣ 좌표계 @@\n/ CCW(counter-clockwise; 반시계 방향) ; 오른손좌표계 - OpenGL, 3dsMax\n/ CW(clockwise;시계 방향) ; 왼쪽좌표계 - Direct3D\n\n@@color(#04f): ▣ 짐벌락 @@ (gimbal lock) @ 2014-07-30 @\n ; 3개의 축에 대한 회전 연산을 동시에 적용하는 경우, 행렬을 사용하는 한 축이 소실되는 현상\n ⇒ 사원수를 사용하면 이러한 짐벌락 현상을 막을 수 있음 !\n\n@@color(#04f): ▣ 증강현실 @@(Augmented Reality)은\n실제 환경에 가상 물체를 합성하여 원래의 환경에 존재하는 사물처럼 보이도록 하는 기술로, 가상의 공간과 사물만을 대상으로 하는 기존의 가상현실과 달리 현실세계를 가상세계와 접목하여 보완해 줌
寸:마디 촌. 鐵:쇠 철. 殺:죽일 살. 人:사람 인\n'촌철'은 손가락 한 개 폭 정도의 무기를 뜻한다.\n\n@@color(#04f): 한 치의 쇠로 사람을 죽인다. 간단한 경구(警句)로 어떤 일의 급소를 찔러 사람을 감동시킴 @@\n'촌철살인'은 날카로운 경구(驚句)를 비유한 것으로, 상대방의 허를 찌르는 한 마디의 말이 수천 마디의 말을 능가한다는 뜻임\n\n '학림옥로(學林玉露)'라는 책은 남송(南宋) 때의 나대경(羅大徑)이, 찾아오는 손님들과 주고받은 청담(淸談)을 시동(侍童)에게 기록하게 한 것으로 '天地人'의 세 부분 18권으로 구성된 책이다. \n\n 그 중 '지부(地部)' 제7권 <살인수단(殺人手段)>에는 종고선사(宗藁禪師)가 다음과 같이 선(禪)을 논하여 말했다. \n\n "어떤 사람이 무기를 한 수레 가득 싣고 왔다고 해서 살인을 할 수 있는 것이 아니다. 나는 오히려 한 치도 안 되는 칼만 있어도 사람을 죽일 수 있다." \n宗藁論禪曰 譬如人載一車兵器 弄了一件 又取出一件來弄便不是殺人手段 我則只 有寸鐵 便可殺人. \n\n이것은 그가 선(禪)의 요체(要諦)를 갈파한 말이므로, 살인이라고 하지만 물론 칼날로 상처를 입히는 것을 뜻한 것이 아니라, '자기의 마음 속의 속된 생각을 없애는 것'을 뜻한다. \n\n아직 크게 깨달음에 이르지 못한 사람은 그 속된 생각을 끊어버리기 위하여 성급하게 이것 저것 대답을 해 오겠지만, 정신의 집중이 부족하기 때문에 모두 날것들뿐이다. \n\n그와 같은 칼로는 몇 천 몇 만 개나 되는 깨달음의 경지에 이르지 못한다. \n \n모든 일에 온 몸과 온 정성을 다 기울일 때, 충격적으로 번득이는 것, 이것이야말로 큰 깨달음인 것이다. \n[출전] '學林玉露' \n
@@color(#04f): 트위터 @@(twitter)는\n* 40글자 정도의 단문으로 소통하는 블로그이며, 좀 더 쉽게 말씀드리면 40자 글자 제한이 있는 댓글놀이이다.\n** 하지만 단순 댓글이 아니라 각자 자신의 홈을 갖고있고, follow-follower라는 싸이월드 일촌 시스템과 유사한 기능이 있습니다. 이 관계를 맺고있으면 상대방이 쓴글만 모아서 자동으로 받아 볼 수가 있다.\n** 무엇보다도 전세계 동시적으로 다양한 문화권의 사람들이 실시간으로 간편하게 소통할 수 있기 때문에 점차적으로 이용자가 확대되고 있다.\n\n* 트위터(twitter)는 2006년 3월 샌프란시스코의 벤처기업인 오비어스 코프가 오픈한 마이크로 블로그 형식의 소셜 네트워킹 서비스(SNS)이다.\n** 긴 글을 쓰고 사진과 동영상까지 넣을 수 있는 블로그와 달리 트위터는 최대 140자까지만 글을 쓸 수 있고, 사진이나 동영상 그리고 음악 등은 하이퍼텍스트 링크 형식으로만 삽입할 수 있다.\n*** 이를 바탕으로 실시간 소통하는 이 서비스는, 연예계와 정치권에 이어 기업의 마케팅 수단으로도 확산되는 추세. 형식은 블로그와 유사하지만 단문 위주로 커뮤니케이션을 할 수 있어 쉽고, 상대방의 동의를 얻어야 친구가 되는 타 SNS와는 달리, 상대방의 수락 없이도 본인이 원하는 사람들이 보내는 메시지를 받아 볼 수 있다. \n*** 그래서 블로그가 아니라 마이크로 블로그라고 불린다. 대신 트위터는 소셜 네트워킹(Social Networking) 즉 인맥을 만드는 기능이 매우 강한 것이 특징이다. 트위터에서는 따라가기(follow)라고 불리는 기능이 있다. 상대방의 마이크로 블로그에 가서 따라가기 버튼을 누르면 그 다음부터는 그 사람이 쓰는 글이 나에게 자동으로 업데이트 된다.\n** 짦은 문장만 쓸 수 있는 대신, SMS 스마트폰 메신저로 블로그에 글을 올릴 수도 있다.(하지만 트위터는 국내에서는 SMS로 글을 올릴 수 없는 상태이다) 즉 이동성이 뛰어난 유무선 인터넷 서비스이다. 이동성이 뛰어나고, 내 친구가 업데이트하는 글을 실시간으로 받아볼 수 있기 때문에 전세계에서 현재 벌어지는 일을 쉽게 파악할 수 있다.\n*** 트위터의 파워는 바로 '엄청난 속도의 전파력'에서 나온다. 2009년 여름 이란 대통령 선거 이후 테헤란에서 휴대전화 단문메시지 송수신 서비스가 중단됐지만, 트위터를 통해 시위장소와 시위 전개 상황을 실시간으로 이란 네티즌들에게 알리면서 시위를 주도하는 등 변혁을 촉발하는 역할을 해냈다. 또한 중국 우루무치에서 대규모 유혈사태가 발생했을 때 그 어떤 언론보다 신속하게 사태를 전한 것은 다름아닌 트위터였다..\n** 초기의 트위터는 유명인의 소셜 네트워크 서비스(SNS)라는 점에서 호기심을 자극하는 수준이었다면 이제는 언론보다 어 빠른 정보 파급력으로 세력을 넓혀가고 있다.\n*** 기업 CEO들도 상황을 파악하고 소비자들의 목소리를 직접 듣는 도구로 트위터를 활용하고 있다. 눈치빠른 정치인들은 트위터를 통해 국민과 소통하겠다고 나서고 있다. 초기에는 허진호 네오위즈인터넷 대표, 이찬진 드림위즈 대표 등 주로 IT관련 CEO들이 트위터에 합류했다. 최근에는 박용만 두산 인프라코어 회장도 직접 트위터를 개설해 눈길을 끌고 있다.\n\n! 트위터의 문제점\n* 하지만 트위터는 기본적으로 하지만 트위터는 영어 서비스이다. 트위터는 전세계의 언어 중 영어와 일본어 서비스 2개만 하고 있을 뿐이다. 일본어 서비스를 하는 이유는 초기 투자자 가운데 일본기업이 있기 때문이다.\n** 이런 점 때문에 한국 사용자들이 겪는 불편은 꽤 많다. 트위터에 가입을 하면 한국인은 3천만명이 넘는 외국인 가운데 한국인을 찾아야 하는데 이것이 쉽지 않다. 그래서 가입만 해놓고 잠을 자는 회원들이 적지 않다.\n* 한글 검색이 잘 안되고, 트위터와 연동돼 돌아가는 어플리케이션에서는 한글이 깨지는 현상이 나타난다. 브라우저에 따라 한글로 사람 이름을 검색하면 검색이 나오지 않는 현상이 있고, 한글로 글을 검색했을 때도 비슷한 현상이 나타났다.\n** 한국의 이슈가 무엇인지 알 수 없다는 문제점이 있다. 트위터는 메인 페이지에 Trending Topics 라는 것이 나오는데 여기에 실리는 것이 모두 영어이다. 따라서 한국에서는 무엇이 이슈인지 알 수가 없다.\n* 국내 트위터 이용자들은 휴대폰 SMS로 문자를 올리는 것도 불가능합니다. 현재 미국과 영국, 캐나다 등 3나라에서만 휴대폰 SMS 서비스가 가능한 상태다. \n** 트위터는 영어권 서비스이고, 회사 규모가 직원 60명에 불과한 중소기업인데다, 전세계가 단일 채널이어서 야후나 구글처럼 그 나라의 실정에 맞춘 나라별 서비스를 제공하기는 쉽지 않을 것 같다.\n** 그래서 한국한 트위터들이 우후죽순 생겨나고 있다. 이런 현상은 한국뿐 아니라 전세계적으로 공통된 현상이다. 독일, 일본, 중국 등 대부분의 국가에 트위터와 유사한 서비스들이 생겨나 트위터와 경쟁을 하고 있다.\n\n! 국내 트위터 유사 사이트\n* 기타\n** twitter.com ; 김연아, 오바마\n** playtalk.net ; 이외수\n* __트위터와 연동성을 강조한 야그__\n** 가장 트위터와 유사하고 트위터와 연동이 잘 되는 사이트는 야그( www.yagg.kr )이다. 야그는 트위터와 문법체계가 비슷하고 트위터에 가지 않고도 트위터에 글을 올리거나, 트위터에 온 글을 볼 수 있어 인기이다.\n** 또한 야그 사용자는 웹은 물론 휴대전화 문자메시지(SMS)로 내 블로그에 글을 올릴 수 있다. 애플의 iTunes에서 아이폰/아이팟용 어플리케이션을 무료로 내려받으면 아이폰에서 쉽게 야그를 할 수 있다.\n** 한국 내 이슈를 알 수 있다는 점도 장점이고, 한국내의 지역별 검색기능도 갖추고 있어 우리 동네 사람들과 친구를 쉽게 맺을 수 있다.\n* __비즈니스 인맥 쌓기 링크나우__ \n** 비즈니스에 특화된 SNS도 있다. ‘링크나우’ ( www.linknow.kr )는 개인 프로필을 기반으로 한 비즈니스 인맥 서비스다. 출생지, 학교, 직장 등 개인 정보를 회원끼리 공유하면서 인맥을 형성하며, 일촌이 되면 연락처는 물론이고 서로의 인맥까지 공유할 수 있다. 특히 근무 회사나 이메일이 바뀌는 등 신상변동이 있더라도 일촌들에게 자동으로 통보돼 이를 바로 알 수 있는 게 장점이다. 10만명 가까운 CEO, 직장인, 전문직 종사자들이 인맥을 구축하고, 비즈니스 파트너를 찾거나 채용을 하는데 자주 애용하고 있다. \n* __NHN에 인수된 미투데이__ \n** 네이버에 인수된 미투데이( www.me2day.com )도 트위터와 유사한 마이크로 블로그 사이트이다. 그렇지만 이 서비스는 친구 신청을 하고 상대가 동의해야 친구가 되는 방식을 해왔기 때문에 오히려 싸이월드와 비슷하다. 하지만 마이크로 블로그라는 점에서는 트위터와 유사한 점이 많다.\n* __음식점 정보가 있는 런파이프__\n** 싸이월드의 공동창업자로 유명한 이동형 나우프로필 대표가 지난 4월 비공개 서비스를 시작한 ‘런파이프’( www.runpipe.com )도 있다. 특히 '구독로그' 기능은 뉴스사이트나 개인 블로그 등을 직접 불러와 등록하면 해당 기사를 계속 구독할 수 있으며 '퍼뜨리기' 기능으로 관계를 맺은 다른 파이프에게 전달할 수 있다. \n* __SK텔레콤의 토씨__\n** SK텔레콤이 서비스하고 있는 토씨(www.tossi.com)는 한국형 모바일 블로그다. 휴대전화에서 문자를 써서 수신자(#7055)에게 보내면 웹 블로그에 등록된다. 또 친구 새 글이나 댓글이 등록되면 글 내용을 20자까지 SMS로 알려주며, 문자로 답하면 해당글에 댓글을 바로 달 수 있다. 인터넷에 접속하지 않아도 문자를 보내는 것만으로도 유선-무선에 있는 블로거들과 의견을 주고받을 수 있다. 현재 토씨의 가입자수는 25만여명이며 전체 회원 중 64%가 10~20대이다. \n\n! 트위터 = MSN + 세이클럽 + 심심이 전체공개\n트위터 안의 트위터들, 점점 늘어나고 있습니다. \n그렇다면 대체 누가 트위터 안으로 모이는 걸까요?\n 1. MSN 메신저의 '남몰래 로그인' 기능을 즐겨 사용하던 위기관리 전문가 정모 차장. 트위터는 '남몰래 로그인' 기능이 자동지원됩니다. \n 2. 세이클럽에서 채팅방을 만들어 친구가 들어오길 기다리며 지루한 시간을 보내야 했던 홍보대행사 김AE. 트위터는 채팅방을 만들 필요도 없고 지루하게 친구가 들어오기만을 기다릴 필요도 없습니다. 첫째, 채팅방은 늘 개설되어 있으며, 둘째, 그 채팅방에는 누구나 들어갈 수 있으며 (더군다나 '남자 사절' '안 예쁜 여자 입장 불가' '19세 이상 입장 불가'와 같은 입장 제한 조건도 없습니다) 셋째, 마음에 드는 친구가 있으면 따로 말을 걸면 되며 넷째, 그렇지 않은 경우에는 계속해서 눈팅을 즐기면 됩니다. \n 3. 심심이에게 말걸기 좋아하던 OOO 마케팅 부서의 오대리. 트위터에서는 살아있는 사람에게도 말을 걸 수 있습니다. \n\n\n\n
@@color(#04f): ▣ KF @@; (키 프레임) 시퀀스로 파일로 기록되는 애니메이션의 조각\n\n@@color(#04f): ▣ Kick-Off Meeting @@; 첫 회의\n'Kick-off'란 미식축구에서 게임을 시작하기 위해 상대편 진영으로 공을 차는 것을 의미합니다. 따라서 'Kick-off Meeting'이란 어떤 프로젝트나 업무를 시작할 때 담당자들이 모두 모여 향후 업무 분담 및 진행 계획 등을 논의하는 첫 회의를 의미합니다.\n
@@color(#04f): 참고 ; 취업을 위한 준비 @@\n1) 이력서 ; 진실되고, 간결하고, 구체적으로 기술( 이력서 1장 + 자기소개서 1장) \n 50% 정도 차지 - 정해진 형태가 없는 경우, 일반적인 형식 사용(*.hwp, *.doc)\n2) 인터뷰 성공전략 ; 복장, 언어, 태도, 화법 ==> 취업 의지 표명\n -0. 능력, 적응성, 적합성을 기본으로 면접자를 파악 \n -1. 면접 전 제출한 이력서를 숙지하라.\n -2. 해당 기업/ 시장에 대한 거시적인 자료를 다시 확인하라.\n -3. 자기소개(3분 speech)가 성공의 열쇠\n3) 성장배경 + 교육 + 자격/특기 + 경험 + 성과 + 역량 >> To 조직(직무)\n4) 인터뷰 종료후 ; Post Analysis, Thank you Note
1. 진입하고자 하는 시장에 강력한 No.1이 있다면 No.1을 할만한 새로운 시장을 구축하라 - 범주의 원칙\n2. 좋은 제품보다는 시장 진입을 먼저하라 - 리더의 원칙\n3. 시장에 첫 번째로 진입하는 것보다는 고개의 머릿속에 첫 번째로 인식시켜라 - 기억의 원칙\n4. 잠재 고객이 기억하기 쉬운 언어로 메시지를 전달해라 - 집중의 원칙\n -. Net Market 창출 ; 신시장 구축 -> 브랜드 네이밍 -> 시장확장\n -. Segment tation\n -. Brand Naming\n -. Extension\n\n
@ 98. 7. 10. 18:00-18:40 @\n1. 현장 현황 파악 -> 일지작성(Data입력); 전일 반성과 오늘 목표 설정\n2. 공장 설비의 작동원리; 인성파악 -> 정확한 판단 및 예측\n3. 도면과 자료정리 -> 일의 진행 과정을 체크\n4. 자재정리 -> 재고 파악과 부품확보\n5. 구매요령\n 1) 대화 = 문서작성 - -> 대인관계 유지, 발전(논리성)\n 2) 시장조사 철저\n6. 수리, 의뢰 요령 \n 1) 예정가 산정.\n 2) 업체 기술 수준 파악\n\n\n
@@color(#04f): ▣ HDR @@ (High Dynamic Range) ; \n디지털 영상 처리 과정에서 ''높은 명암 비율을 제공해 높은 수준의 영상 표현''을 가능케 해주는 기술. HDR 기술은 밝은 부분은 더 밝게, 어두운 부분은 더 어둡게 보정하여 기존 로컬 디밍(local dimming) 방식보다 더 명암비를 향상시켜 보다 현실감 있는 영상을 제공하는 기술이다. 태양의 강렬한 빛부터 어두운 밤하늘의 별빛까지 현실에 존재하는 다양한 밝기를 표현할 수 있다.\n\n@@color(#04f): ▣ Hook @@; \nWindows가 응용프로그램에게 message를 전달하기 전에 system message queue에서 message를 가로채는 과정 \n\n@@color(#04f): ▣ HUD @@ (Head-Up Display) ; \n-.UI에서 HUD란 반투명한 계기판으로 형태로 말 그대로 고개를 든 채 확인할 수 있는 정보창\n (대개)닫기 버튼 없이 항상 화면에 떠 있으면서 정보를 보여주는 UI로\n UnitFrame(얼굴+HP/MP+상태) 이나 QuickSlot 같은 것들이다.\n-.UI를 만들다보면 갯수가 너무 많아져서 전부 로딩하려면 메모리와 시간낭비가 심해지기 때문에 처음부터 로딩해둬야 하는 것과 나중에 로딩해도 되는 것들을 분류할 필요가 있는데, 이때 HUD 류는 무조건 로딩해야하는 분류에 속한다.\n-.참고; gpgstudy의 'hud란 무엇인가요??' \n http://www.gpgstudy.com/forum/viewtopic.php?p=124838\n-.전투기 조종석 앞 유리창에 있는 투명한 패널에 속도ㆍ고도ㆍ무장정보 등 각종 비행정보 및 임무정보를 조종사의 전방 상단에 제공한다.\n\n@@color(#04f): ▣ HMD @@ (Head mounted Display) ; 안경처럼 머리에 쓰고 대형 영상을 즐길 수 있는 영상표시\n휴대하면서 영상물을 대형화면으로 즐기거나 수술이나 진단에 사용하는 의료기기에 적용할 수 있는 차세대 영상표시 장치로, 군사용, 항공기용으로 개발됐던 HUD (Head-up Display)에서 발전된 형태이다.\n
@@color(#04f): 핵심성공요인 @@(CSF:Critical Success Factor) \n출처; http://opps1004.egloos.com/1286335 - 웁스천사 마케팅 이야기\n참고; [[목표관리(MBO)]]\n\nJohn F. Rocket은 최고 경영자의 정보 요구를 이해하기 위한 수단으로 CSF(Critical Success Factors)를 개발하였다. 이 방법은 기업 전체에 적용되며, 하나의 보다 광범위한 기획 방법으로 확장되어 전략 정보 기획방법의 필수요소로 발전되었다. \n\n핵심 성공 요인(CSF)의 정의를 살펴보면 “개인, 부서 또는 조직에게 성공적인 결과를 가져옴으로써 경쟁력 있는 업무 수행을 보장해 줄 수 있는 한정된 수의 영역”을 의미한다. 따라서, 사업이 번창하고 경영자의 목표가 달성될 수 있기 위해 반드시 성공하여야 할 몇몇 주용 영역의 의미가 있다. CSF는 한 기업의 활동이 성공하기 위해서 갖추거나 수행되어야 할 주요요소를 의미하고 한 기업이 선택한 전략의 방향 뿐만 아니라 산업/경제의 전반적인 구조에 의해 결정된다.\n\nCSF는 경영의 목적(Goal) 및 경영 목표(Objective)를 성취하는데 있어서 중요한 내부 항목으로 경영 목적(Goal)을 위한 수단의 역할을 수행한다. Goal이 비교적 안정적이고 외부적인 경향이 강하다면, CSF는 상대적으로 불안정하며 내부적인 경향이 강하다. 따라서, CSF는 경영의 중요한 가정(Critical Assumption)이 변하면 함께 조정되어야 한다. 또한, CSF는 경영목표를 달성하기 위한 수단(Means)이며, 성과의 달성은 측정될 수 있어야 한다.\n\nCSF는 다음과 같은 특징들을 가지고 있다.\n * CSF는 계층적 구조를 가지고 있다. 최고 경영자, 사업 단위 등으로 세분화될 수 있다.\n * 내적인 CSF와 외적인 CSF, 감시적인 기능의 CSF와 구축적 기능의 CSF로 대별할 수 있다. \n\nCSF가 도출되는 5가지 원천은 아래와 같다.\n * 해당 산업 : 산업 자체의 특성으로부터 도출되는 CSF\n * 경쟁적 전략 또는 업계 내의 위치 : 기업의 특정 활동 범위 또는 역할에 의해 도출되거나 또는 고유한 전략에 의해 도출되는 CSF\n * 환경적 요인 : 환경적 변화 요인에 의해 도출되는 CSF\n * 일시적 요인 : 단기적 위기 상황에 의해 도출되는 CSF로 취기에 관련된 CSF는 중요할 수는 있지만 수명은 짧음\n * 관리직의 위치 : 어떤 CSF는 특정 관리자에게 관련되어 있음\n\n마지막으로 CSF는 경영자에게 2가지 효과를 준다. \n * 경영자로 하여금 가장 중요한 활동에 초점을 맞출 수 있게 한다.\n * 경영자로 하여금 그들의 정보 요구를 심사 숙고하게 도와준다.\n
@@color(#04f): ▣ 라이파이 @@(LI-FI) @ 2016-10-25 @\n1초당 1GB의 데이터를 전송해 3초면 영화 한 편을 모두 다운받을 수 있는 세상이 도래할 전망이다. LED 조명의 가시광선 파장을 이용해 최고속으로 데이터를 전송하는 차세대 무선 네트워크, 라이파이(Li-Fi)를 통해서다. 2011년 영국 에든버른 대학의 헤럴드 하스 교수가 '라이트 피델리티(Light-Fidelity)'라고 칭해 주목바기 시작했다. 기존의 무선 통신 기술이 전파를 이용하는 데 비해 라이파이는 눈에 보이는 빛을 이용해 와이파이보다 100배 빠른 속도를 자랑한다.\n\n@@color(#04f): ▣ 럭키 백(Lucky Bag, 복주머니) 이벤트 @@ ; 재미 + 실속을 추구 @ 2013-03-18 @\n일본의 복주머니 행사에서 유래된 럭키백 이벤트는 가방에 상품을 무작위로 담아 일정 금액에 판매하는 방식의 이벤트이다.\n\n일본 백화점이나 가게에서는 연초 이 같은 럭키백 이벤트가 흔하게 열린다. 일본어로 '후쿠부쿠로'라고 하는 럭키백은 에도시대 상인들이 남은 물건을 한 봉투에 담아 싼 가격에 팔던 데서 유래됐다. \n\n물건이 담긴 봉투안에 무엇이 들어있는 지 알 수 없기 때문에 그야말로 복불복이지만, 얼마나 값진 물건을 '득템'하느냐에 따라 1년 운을 점친다는 의미도 있다. \n\n럭키백이 인기를 끄는 이유는 저렴한 가격으로 더 고가의 상품을 구입할 수 있는 장점과 어떤 상품이 들어있는지 몰라 소비자들의 궁금증이 유발되기 때문이다. \n\n@@color(#04f): ▣ 레벨 @@(level) @ 2010-03-25 @\n일반적으로 게임의 한 스테이지. 혹은 가상의 장소(예를 들어 건물의 층)에 대응되는 한 묶음의 게임 데이터, 또는 게임 캐릭터의 등급을 나타낼 때도 사용된다.\n\n@@color(#04f): ▣ 렌더러 @@(renderer) @ 2010-03-25 @\n이미 만들어진 애니메이션을 재생하는 것이 아니라, 일련의 데이터로부터 특정한 절차를 거쳐 화면에 그려주는 소프트웨어.\n\n@@color(#04f): ▣ 로하스 @@(LOHAS : Lifestyles Of Health And Sustainability) @ 2011-09-25 @\n대표적인 친환경적 생활양식으로 건강과 환경, 사회의 지속적인 발전 등을 심각하게 생각하는 소비자들의 생활 패턴을 가리키며, 웰빙에 사회와 환경을 추가해, 친환경적이고 합리적인 소비패턴을 지향한다.\n\n@@color(#04f): ▣ 롱테일@@ (The Long Tail) 법칙은 @ 2010-12-06 @\n결과물의 80%는 조직의 20%에 의하여 생산된다는 파레토법칙에 배치하는 것으로 80%의 사소한 다수가 20%의 핵심 소수보다 뛰어난 가치를 창출한다는 이론이다.\n\n\n
@@color(#04f): ▣ E3 @@ (Electronic Entertainment Expo) @ 2010-03-25 @\n해마다 6월 말에 열리는 게임 업계의 무역 쇼. 새로운 게임이 E3에서 첫 선을 보이는 경우가 종종 있고, 그 때문에 게임을 마케팅할 때 E3의 중요성이 커지고 있다.\n\n@@color(#04f): ▣ ESG 경영 @@ @ 2017-08-23 @\n국제단체 '책임투자원칙 주도기구(Principles for Responsible Investment, PRI)'가 주도하고 있는 ESG는 \n''환경(Environment)'', ''사회(Social)'', ''지배구조(Governance)'' 3가지 측면을 말하며, 이 조건이 건전한 기업에 투자를 해야 한다는 개념이다. 특히 __국내에서는 기업 지배구조 투명성에 대한 투자자들의 요구가 높아지고 있다.__\n이에 한국거래소는 하반기부터 공시에서 코스피 상장사의 ESG 등급을 공개하기로 했다. ESG에 근거한 투자는 일본과 미국 등을 비롯해 세계적인 추세로 자리 잡고 있다. \n\n
자신이 뜻하는 바를 이루려고 노력을 하지만 그러한 노력을 방해하는 환경에 휩쓸려 자신을 통제하지 못하는 잘못 (from '재무설계를 위한 행동재무학')\n\n중요한 의사결정 순간에 비이성적이고, 비효율적인 판단으로 손실을 초래하는 경우가 종종 있다. 이러한 자기통제오류는 마치 습관처럼 우리의 삶 깊숙이 뿌리내리고 있어서 미래의 풍요로운 삶을 이루지 못하도록 방해한다. 미래를 위한 저축을 방해하는 자기통제오류가 발생하는 이유는 사람들이 미래보다 현재에 소비하는 것을 더 선호하기 때문이다. 이와 같이 현재에 소비하고자 하는 유혹을 이기고 미래의 원하는 삶을 추구하기 위해서는 적절한 자기통제가 필요하며 이를 위해서는 자기통제를 도와주는 시스템의 구축이 필요하다.\n\n자기통제 시스템을 구축하기 위한 방법으로\n첫 번째, 먼저 저축하고 나중에 소비하는 선저축 후소비의 시스템을 유지하기 위해서 가입한 저축금액이 급여통장에서 자동이체 되어 먼저 빠져나가도록 하자.\n두 번째, 한 달 소비에 대한 예산을 짜고 그 예산의 범위 내에서 지출하도록 신용카드 사용을 체크하고 체크카드나 현금을 사용하도록 하자.\n세 번째, 귀찮더라도 매일 가계부를 작성하도록하자.\n네 번째, 통장마다 꼬리표를 달아서 저축상품의 목적을 분명히 하자.\n\n출처; 신용사회 2010.01.(Vol.328) Money 실전 재테크
@@color(#04f): 아이패트 @@는 애플의 태블릿...\nIT기술 동향과 트렌드를 미리 만나볼 수 있는 자리인 CES 2010에서 올해 주목하고 있는 분야는 3가지, 스마트폰, 3DTV 그리고 태블릿이다. 작년 CES에서 주인공은 스마트폰이었고, 여기에 2가지 목록이 추가\n\n''아이패드'' ; 터치에 최적화된 아이팟 터치나 아이폰에서 화면을 확장(더 큰 화면에 더 많은 즐거움을 제공)\n-. 모바일 운영체제인 아이폰 OS를 사용, 아이패드에서 키패드란 있으면 좋고 없어도 상관없는 입력 디바이스일 뿐\n-. 플래시 미지원, 엑티브 X 불가, 멀티태스킹 등이 지원되지 않는다는 점으로 웹 환경이나 사용성에서 제약이 오는 단점이 있지만, 이로인해 누르는 순간 반응하는 터치속도, 빠른 웹 로딩과 즉각적인 애플리케이션의 반응들이 이 단점에서 나오는 것이기도 하다. \n-. 기기 자체보다는 아이폰과 아이팟 터치의 주 수입원이 제품에 있는 게 아니라 앱 스토어를 통해 제공하는 디지털 콘텐츠에 있음\n-. ''PC가 아닌 멀티미디어 기기'' ; 간편함과 신속함이 장점\n 간단하게 게임을 즐기거나 웹서핑을 위해 PC에 전원을 넣을 필요 없이 아이패드를 사용\n 아이패드로 책을 읽고 음악을 듣고 영화를 보고 싶으면 Wi-Fi를 통해 곧 바로 감상\n\n\n''태블릿 PC'' ; 키보드라는 입력체계를 떼어내고 터치스크린을 붙인 것\n-. 마우스와 키보드라는 입력 체계를 가진 PC를 그대로 계승\n-. 오랜 시간동안 구축된 PC환경을 고스란히 사용할 수 있다는 장점이 있지만, 키보드와 마우스에 특화된 소프트웨어를 터치로 조작한다는 건 매우 어렵고도 스트레스를 유발\n* UMPC ; 2001년 MS의 키패드를 제거하고 터치 디스플레이로 동작하는 노트북\n** 그 당시 인터넷 환경과 칩셋 기술력으로는 얇고 가벼우며 오래가야한다는 모바일 디바이스의 특성을 소화해내기에는 버거운 게 현실이었고 결국 실패.\n** PC환경에서 인터넷은 보급화 되었지만, 기동성과 휴대성 측면에서 무선 LAN 환경이 좋지 못했고 짧은 구동시간과 열약한 터치 인터페이스는 태블릿을 노트북보다 못한 존재로 만들어버리고 말았다. \n* MID(모바일 인터넷 디바이스); 인텔이 모바일 시장을 타깃으로 아톰 프로세서를 선보이고 이를 이용한 모델로 계속해서 개선된 모델들이 출시.\n** MID도 PC의 운영체제를 그대로 계승했다는 한계점으로 인해 현재까지도 시장 가능성만을 제시\n
!전략적 사회공헌 3대 유형\n''공유 가치형'' ; 정보격차 해소 주력\n인텔은 나이지리아 내 200개교에 'Classmate'라는 저가 노트북을 개발하여 공급하는 한편, 안정적인 전력공급을 위해 디젤발전기를 학교에 설치하고 무선 인터넷 환경도 제동했다. 또한 마이크로소프트는 부유층에는 '정품판매 방식'을 쓰고 빈곤층에는 정부 및 시민단체와 협력 네트워크를 구축해 '무상지원방식'을 사용하였다.\n\n''시장창조형'' ; 빈부격차 해소 주력\nGE는 인도에서 초간편형 심전계 'MAC400'을 현지기술로 개발해 미국 내 가격의 10분의 1 수준인 1000달러에 판매하였고 필립스는 진흙으로 만든 전통적인 '출라(Chulha)'를 개선해 집안 내 안전사고를 해결하는 한편 신시장 창출에도 성공하였다.\n\n''문제해결형'' ; 의료격차 해소 주력\n미국의 머크는 1987년 실명을 유발하는 회선사상충증 치료제인 멕티잔을 필요한 사람에게 필요한 만큼 지원하겠다는 '멕티잔 기부 프로그램'을 발표, 프로그램이 시작된 이래 25억 개의 약을 기부하여 약 7억 명의 환자를 치료하였으며 현재에도 아프리카, 남미지역에서 연간 8000만 명의 환자가 혜택을 받고 있다. 국내기업으로는 매일유업의 특수이유식, CJ의 저단백밥의 경우가 의료격차 해소에 중점을 둔 기업 활동을 꼽힌다.\n\n출처; 신용사회 2010.02.(Vol.329) Information 존경하는 기업의 조건
@@color(#04f): ▣ xfer @@ ; Transfer @ 2010-07-15 @\n
@@color(#04f): ▣ 반야용선 @@ (般若龍船) ; 불자의 영혼을 싣고 황천을 건너 극락으로 가는 배 @ 2019-04-20 @\n cf. (관음보살,) 인로왕보살, 지장보살\n\n@@color(#04f): ▣ 빈티지 @@(Vintage) @ 2011-06-15 @\n수십 년의 세월이 지나도 변하지 않는 미적 가치와 우월성을 가진 것 (from American Heritage Dictionary)\n -> 희소성의 흔적, 시간의 흔적이 가치를 창조\n cf. 앤티크(Antique) ; 일반적으로 100년 이상의 시간이 지난 것 \n\n@@color(#04f): ▣ 블루슈머 @@(Bluesumer) @ 2010-08-04 @\n블루 오션(Blue Ocean) 전략이란 공급자 중심의 한정된 시장 안에서 경쟁우위를 달성하는 레드 오션(Red Ocean) 전략에서 벗어나, 구매자 중심의 인식의 재구축을 통한 가치혁신으로 미개척된 잠재 수요를 발견하고 이를 타켓으로 다른 기업과 차별화된 가치곡선을 형성하여 비약적인 이익을 이끌어내는 전략을 뜻한다. 간단히 말해 새로운 성장의 잠재력을 지닌 새로운 시장을 만들어 내는 것을 뜻한다. \n블루 오션에서 파생된 단어 블루슈머(Bluesumer ; 신소비 집단)란 '경쟁자가 없는 시장의 새로운 소비자'를 뜻하는 말로, 블루 오션(Blue Ocean)과 소비자를 지칭하는 단어인 Consumer를 합성한 신조어이다.
@@color(#04f): ▣ 한약 1제((劑)는 20첩(貼)이다. @@ @ 2018-02-21 @\n2첩으로 3번을 먹기 때문에, 30(~40)봉지 정도가 나온다.\n하루 3번을 먹으면 10일, 아침, 저녁으로 먹으면 15일을 복용한다.\n\n@@color(#04f): ▣ 항렬(行列) @@ ; 친족집단 내에서 계보상의 종적인 세대관계. @ 2019-12-17/ 한국민족문화대백과사전 @\n즉, 종적인 세대에서 형제관계에 있을 때에 같은 항렬이라는 의미에서 동항(同行)이라 하고, 위로 아버지와 같은 세대에 있을 때에 숙항(叔行), 조부와 같은 세대에 있을 때에 조항(祖行)이라 하며, 또 아래로 아들과 같은 세대에 있을 때에 질항(姪行), 손자와 같은 세대에 있을 때에 손항(孫行)이라고 한다.\n\n전통적인 친족제도에서는 계보상의 거리에 따라 일정한 친족관계가 결정되었으며, 친족집단의 질서와 통합은 그러한 친족관계를 바탕으로 유지되었다. 그러므로 친족집단의 질서와 통합을 위해서는 계보상의 거리에 따르는 친족관계를 명확하게 하는 것이 무엇보다도 중요하였다. 그런데 계보상의 거리는 공동의 조선(祖先)에 대한 세대관계를 통해서 결정되므로, 공동의 조선에 대한 세대관계가 친족관계를 규정하는 일차적 기준이 된다.\n\n그러므로 전통적 친족제도에서는 항렬을 특히 강조하고, 각 세대마다 일정한 순서에 따라서 이름 글자 가운데 한 자를 공통으로 사용함으로써 상호간의 세대관계를 쉽게 확인할 수 있게 하였다. 이와 같이 한 친족집단이 공통으로 사용하는 이름 자를 항렬자(行列字)라고 한다.\n\n항렬자로서 가장 널리 사용되고 있는 글자는 오행을 나타내는 금(金)·수(水)·목(木)·화(火)·토(土), 십간(十干)을 나타내는 갑(甲)·을(乙)·병(丙)·정(丁)·무(戊)·기(己)·경(庚)·신(辛)·임(壬)·계(癸), 수(數)를 나타내는 일(一)·이(二)·삼(三)·사(四)·오(五)·육(六)·칠(七)·팔(八)·구(九) 등을 글자의 일부에 포함한 자, 또는 오상(五常)을 나타내는 인(仁)·의(義)·예(禮)·지(智)·신(信) 같은 자이며, 때로는 위의 오행·십간·오상 등을 상징적으로 의미하는 글자도 사용된다.\n\n그러나 그 어느 경우에도 항렬자는 반드시 위의 오행·십간·수·오상 등의 순서에 따라서 각 세대마다 차례로 사용되며, 그 순서가 다 되면 다시 되풀이한다. 그러나 조상의 이름으로 사용된 글자는 되풀이하지 않는 것이 원칙이다. 이름을 한자로 하는 친족집단에서는 위의 원리에 따라서 이름 자의 일부만을 같이 사용함으로써 항렬자를 대신하고, 또 이름자를 두 글자로 하는 친족집단에서는 한 세대씩 항렬자의 위치를 아래와 위로 바꾸어가면서 교대로 사용하는 것이 일반적이다.\n\n그리고 한 친족집단이 항렬자를 통일하여 그 세대관계를 쉽게 확인할 수 있도록 하기 위해서 앞으로 사용할 항렬자를 족보의 첫머리에 미리 밝혀두는 경우가 많다. 그것은 족보 자체가 친족관계를 확인하는 수단이기 때문이다.\n \n@@color(#04f): ▣ 항렬록(行列錄) @@ @ 2019-12-17 @\n\n@@color(#04f): ▣ 항렬자(行列字) @@ @ 2019-12-17 @\n이름자 중에 한 글자를 공통적으로 사용하여 같은 혈족, 같은 세대(世代)임을 나타내는 것으로서 돌림자라고도 한다.\n\n@@color(#04f): ▣ 희토 @@란 @ 2011-03-12 @\n란탄, 세륨, 디스프로슘 등의 17종의 원소를 포함하는 희귀금속을 포함한다. 희토는 자기부상열차, 전기 자동차 등 모든 첨단제품에 필수적으로 사용되며 '공업의 미타민', '공업의 조미료', '21세기의 황금' 등으로 불리는 전략자원으로 자리잡고 있다. 일찍이 덩샤오핑은 중동에 석유가 있다면 중국에는 희토가 있다고 언급하며 그 전략적 중요성을 강조한 바 있다.\n
@@color(#04f): ▣ 경제 주체 @@ = 가계 + 기업(= 민간) + 정부(= 국민) + 해외(= 국제) + 금융 \n\n@@color(#04f): ▣ 미들맨 @@ (middleman) @ 2011-07-12 @\n중개상 혹은 중개인이라는 사전적 의미를 넘어 국가 간, 기업 간, 개인 간의 국제적 교역을 촉진시키는 역할을 하는 전문가 그룹을 통칭하는 개념으로, 변호사, 컨설팅회사, 통역사, 디자이너, 애널리스트, 은행 등\n\n@@color(#04f): ▣ 미시경제학 @@ (微視經濟學, Microeconomics) @ 2011-07-03 @\n- 사회를 구정하는, 하나의 시장안에서 이루어지는 개별경제주체들의 상호작용을 연구\n- 미시경제학의 주된 분석대상은 ''1.수요자 2.공급자 3.시장구조''\n- 시장구조는 경쟁시장, 독점시장, 과점시장, 독점적 경쟁시장 등으로 구분되면, 각 시장 구조에서의 균형점이 어떻게 결정되는지를 설명\n\n@@color(#04f): ▣ 거시경제학 @@ (巨視經濟學, Macroeconomics) @ 2011-07-03 @\n- 모든 개별경제주체들의 상호작용의 결과로 인해 나타나는 한 나라의 경제전체 현상에 대한 분석.\n- 국민소든, 물가, 실업, 환율, 국제수지 등 경제 전반에 영향을 미치는 변수들의 결정요인과 이러한 변수들간의 상호관련성을 연구하는 분야.\n- ''경제정상이론''과 ''경기변동이론''은 거시경제학에서의 주요 연구대상\n- 정부의 개입이 불필요하다고 보는 고전학파와 시장은 불안정하므로 정부의 적극적인 개입을 통해야한다는 케인즈학파로 구분\n\n@@color(#04f): ▣ 미시자본주의 @@ (마이크로 캐피털리즘, Micro-Capitalism) 란 @ 2011-07-03 @\n자본주의적 발전에서 자본집중의 원리에 따라 대기업이 중심이 되는 고전적인 발전이 아니라, 소기업을 중심으로 발전이 이루어지기 때문에 ''「자본의 분산」이 강화되는 발전''을 말한다. 그러나 이 명칭은 주변화 혹은 비공식화와도 구별되어야 한다. 주변화 marginalization나 비공식화 informalization 와도 구변되어야 한다. 주변화나 비공식화는 이원적 구조의 강화를 의미하나, 미시자본주의는 이원구조의 약화를 의미하기 때문이다.\n- 강력한 개인 재산권, 신용시장의 확대 그리고 기업가정신의 육성에 의해 탄생\n- 마이크로 캐피털리즘은 재능 있는 사람들이 선진국으로 이민을 가지 않고 고국에 머무르게 되면 이들이 공공의료, 교육, 사회간접자본 그리고 산업 발전과 같은 문제들을 외국에 의존하지 않고 직접 해결할 수 있을 것으로 기대\n\n@@color(#04f): ▣ 중력 모형 @@ (gravity model)\n사회학자들이 뉴턴의 만유인력의 법칙을 원용하여 두 지역 간의 인구와 상품 이동 등 상호작용을 중력 모형의 원리에 비춰 설명하는 이론. 중력 모형이 제시하는 기본 원리는 두 도시의 공간적 상호작용의 견인력은 도시의 인구 규모에 비례하며 두 도시 간의 거리의 제곱에 반비례한다.\n\n@@color(#04f): ▣ 집적 경제 @@ (agglomeration economies)\n어떤 지역에 산업이나 인구가 집중하면 서로가 분업하게 되거나 노동력 및 소비시장이 생기는 한편으로 도로 등의 시설이 만련되고 투자 및 생활 효율이 높아지는 것\n\n\n!!경제지수\n@@color(#04f): ▣ 국제재산권지수 @@ (International Property Rights Index)\n전세계 GDP의 95퍼센트를 차지하는 70개 국가를 대상으로 한 조사와 통계 자료를 바탕으로 계산되며, 법적·정치적 환경, 물적재산권, 지적재산권의 세 가지 항목으로 구성된다. \n\n@@color(#04f): ▣ 세계평화지수 @@ (Global Peace Index)\n군사 예산, 무기 수출, 폭력범죄의 정도, 전쟁 사상자, 죄수 규모, 조직범죄 수준, 잠재적인 테러 공격 위험, 사회적·정치적 갈등, 인접 지역이나 국가와의 상대적 관계 등 23개 지표를 종합해 평화를 수치화한 것으로 한국은 2010년 43위를 기록했다.\n\n@@color(#04f): ▣ 인간개발지수 @@ \n유엔 국제연합개발계획이 매년 세계 각국의 문맹률, 평균수명, 1인당 실질 국민소득 등 인간의 삶과 관련된 여러 가지 지표를 조사해 인간개발 성취 정도를 평가하는 지수를 말한다. 인간의 행복이나 발전 정도는 소득 수준과 비례하지 않고, 소득을 얼마나 현명하게 사용하느냐에 달려 있음을 보여주는 지수다.\n\n
@@color(#04f): ▣ CCU @@ (ConCurrent User) ; 동시접속자\n정의 : 동일한 시간대에 게임에 접속해 있는 유저를 말한다. 흔히 로그인 서버를 기준으로 산정한다.\n\n@@color(#04f): ▣ ARPU @@ (Average Revenue Per User) ; 가입자당 평균 매출액, 즉 객단가\n정의 : "일정기간"의 매출액을 그 기간내의 BU로 나누어 산출한 수치\n 한달을 기준으로 해서 유저가 평균적으로 결제한 금액으로 산정.\n\n@@color(#04f): ▣ ACCU @@ (Average ConCurrent User) ; 평균동접\n\n@@color(#04f): ▣ PCCU @@ (Peak ConCurrent User) ; 최고동접\n\n@@color(#04f): ▣ BU @@ (Buying User) = PU(Paying User) ; 구매자, 한번이라도 캐쉬 아이템을 구입한 적이 있는 유저\n주로 정액제 비지니스 모델을 사용하는 게임에서 활용하는 용어\n정액 비용을 결제한 유저(PU), 캐쉬 아이템을 구입한 유저(BU)\n\n@@color(#04f): ▣ UV @@ (Unique Visitor) ; 한번이라도 접속을 한 유저\n • MMO UV 산출법 : PCCU * 3.935\n • CASUAL UV 산출법 : PCCU * 7.45\n\n@@color(#04f): ▣ BUrate @@ (Buying User rate) = BU/UV\n\n\nSTATUS\n보통 게임내에서의 줄임말로 "스탯" 이라고들 많이 한다.\n뜻은 지위, 상태 라고 알고있으면 괜찮겠네요\n게임 내에서 캐릭터에 관련된 각종 수치나 정보를 보여주는 시스템의 일종으로 활용된다\n게임 내에서 캐릭터가 레벨업을 할 경우 스탯포인트가 부여되고,\n이때 원하는 캐릭터로 성장시키기 위해 힘, 민첩, 지능, 지혜등의 스탯에 투자한다.\n\nHP(Health Point)\n보통 인터페이스에서 빨강의 긴띠모양을 지칭하는 것이다. 캐릭터의 Health Point 수치를 확인할 수 있다. 이 포인트는 캐릭터의 체력을 의미한다\n\nMP(Mana Point)\n보통 인터페이스에서 파랑의 긴띠보양을 지칭하는 것이다. 캐릭터의 Mana Point 수치를 확인할 수 있다. 이 포인트는 마법에 관여한다.\n\nSTR\nStrength의 약자로 쓰인다. 물리적인 힘을 뜻하며 실제 게임 내에서도 대부분 물리 공격력에 영향을 주는 능력치로 설정되어있다.\n\nDEX\nDextenfity의 약자로 쓰인다. 손재주, 민첩 등의 뜻이며 게임 내에서는 주로 원거리 공격력에 관련된 영향을 주는 능력치로 설정되어 있다.\n\nINT\nIntelligence의 약자로 쓰인다. 지능 등을 뜻하며 게임 내에서는 주로 마법에 관련된 영향을 주는 능력치로 설정되어있다.\n\nCritical\n이 단어의 뜻은 여러 가지이지만 게임 내에서는 결정적인, 치명적인의 뜻으로 쓰이고 있다. 치명타라는 의미로 Critical Hit 라는 단어가 게임 내에서 종종 쓰이고 있다.\n\nEXP\nExperience의 약자로 쓰인다. 경험 이란 뜻을 가지고 있으며 주로 몬스터를 사냥하거나 퀘스트를 해결하면 얻을 수 있고 레벨업의 도구로써 쓰인다.\n\nNPC(non-player character)\n게임 상에서 사용자가 제어할 수 없는 캐릭터이다. 상인, 창고관리인이나 퀘스트를 주는 캐릭터 등이 있다.\n\n던전(Dungeon)\n몬스터를 잡거나 퀘스트를 수행하기 위한 장소를 의미한다.\n\n파티(Party)\n온라인상 의 사용자들이 그룹을 만들어 함께 캐릭터를 키우는 시스템. 이때 레벨이 낮을 경우 파티를 통해 현재 레벨로 잡을 수 없었던 몬스터를 잡아볼 수 있다.\n\n길드(Guild)\n게임상에서 가입하고 모인 동호회 또는 모임 등을 지칭한다.\n\nPVE(Player Versus Environment)\n온갖 몬스터와의 싸움을 지칭한다.\n\nRVR(Realm Versus Realm)\n대규모 단체전. PVP(Player Versus Player)이 사용자간 1:1 싸움을 가르킨다면 RVR은 단체전을 지칭한다. 자신이 속한 단체에 대한 충성도를 높일 수 있다.\n\nPK(Player Kill)\n상대방과의 전투에서 Kill시키는 것을 지칭한다.\n\n퀘스트(Quest)\n게임 내에서 게임을 진행하거나 보상을 받기 위해 행하는 임무. \n\n아이템(Item)\n몬스터을 잡아 획득하거나 퀘스트를 수행했을 경우 보상으로 받게되는 아이템. 갑옷, 무기, 보석 등 캐릭터에게 필요한 모든 물품들을 아이템이라고 한다.\n\n인벤토리(Inventory)\n(재산 등의)목록 이라는 뜻으로 쓰인다. 흔히들 인벤 으로 줄여쓰기도 한다. 몹을 잡거나 퀘스트를 수행했을 경우 받게되는 보상아이템들을 저장해두는 공간. 저장공간 확보를 위해 창고에 저장해두고 인벤토리는 가볍게 하는 것이 좋다.\n\nQC (Quality Control) – 품질관리 게임의 테스트, 분석 등을 통해 문제점을 파악하는 업무\n\nQA (Quality Assurance) – 품질관리 QC의 업무 자체를 보증하는 업무\n\nRMT (Real Money Trading) – 현거래/현질\n\nPostmortem – 원래 의미는 부검으로 게임 개발 이후에 개발에 대한 사후 분석을 하는 행위\n\nLF (License Fee) – 계약금\n\nMG (Minimum Gurantee) = AR(Advantage Royalty)\n– 로열티를 미리 책정해 땡겨받음\n\nTFT (Task Force Team)\n– 특정한 일을 해결하기 위해서 선별된 인력으로 구성된 임시조직\n\nCM (Commercial Lunch) – 상용화\n\nF2P(Free to play) – 부분유료화 비즈니스 모델을 택한 게임\n\nP2P(Pay to play) – 정액제 비즈니스 모델을 택한 게임\n\nAP (Associate Producer)\n- 게임 기획자와 유사한 역할로 창의력이 요구되는 직책, 각종 이벤트/프로모션 기획, 아웃소싱/관리 코디네이션 업무와 일정관리 등의 업무를 수행\n
▣ 2012.05.14.(월) 14:00 ~ 15:30, 8층 대회의실, VDI(Virtual Desktop Infrastructure)\n\n▶ '클라우드 붐'과 함께 PC 가상화 기술로 통칭되는 서버기반컴퓨팅(SBC)과 데스크톱가상화(VDI)\n : 기기에 상관없이 언제 어디서나 기업 서버에 접속해 필요한 업무자원을 사용\n- 중앙 서버에 애플리케이션을 두고 같이 나눠 쓰는 서버기반컴퓨팅(SBC)\n- PC 애플리케이션이 중앙 서버에 존재하는 데스크톱가상화(VDI)\n\n80% 이상의 기밀 유출 보안 사고는 임직원의 업무용 pc에서 발생한다. SBC나 VDI의 공통점인 '내PC가 비어있다'의 방식은 PC 문서를 유출하거나 USB 메모리로 빼내고 노트북PC를 분실하는 경우 등을 방지할 수 있다. \n\n* 부정적 측면\n** 높은 초기투자비용, 높은 솔루션 가격과 매년 책정되는 라이센스 비용 그리고 버전 업그레이드 비용의 부담\n** 사용자의 불만 (자신의 정보를 빼앗긴 기분, 회사에서 의심받는 느낌/ 느린 업무속도와 자유롭지 못한 어플리케이션 설치)\n\n* 긍정적 측면\n** 보안, 모바일 업무 생산성, 개인 PC보안사고 방지\n** IT관리 편의성 (데스크톱 가상화후 한명이 관리할 수 있는 PC수는 두배가 되었다)\n** 친환경 (PC사용전력 감소)\n** 지식관리시스템 구축용이 (노하우를 쌓는데 유리해짐)\n\n▶ 리소스 제공 관점\n1.원격 데스크톱 연결 (Session Hosted)\n2.데스크톱 가상화(VDI) (Server Hosted)\n3.가상 PC 방식 (Client Hosted) ; 공공, 금융, MED-V\n\n▶ VDI 도입\n1.물리적 디바이스 분리 ; 하드웨어 인프라 ↓\n • 스토리지 사이징 및 설계 중요 ; 적은 용량, 병렬처리 가능한 구성\n • Zero/ Thin Clients (cf.Zero Clients ; OS나 어플리케이션 없이 VM만 작동)\n • RemoteFX ; 추가 GPU를 통한 3D 가속 처리\n • CPU 1 core ≒ 2.5명 → 최대 4명 처리 예상(>> 10명)\n • 데스트톱, 모바일 기기 등 모든 디바이스를 지원\n\n2.통합 관리 System\n • 서버 가상화\n • 데스크톱 가상화\n • 프리젠테이션 가상화\n • 어플리케이션 가상화\n • 프로파일 가상화\n\n3.관리인력을 통한 접근 등 이슈 발생 ; 관리비, 유지 인력 ↑\n • 잘못된 Task 분석과 설계 등으로 장점이 단점으로 나타날 수 있음\n • 자동화 ; 데이타 통합 등에 수작업\n • 인증 Self-Service\n • Public Cloud 연동\n\n▶ 구성\n| 인프라공유 |VM | 개별 사용자 프로파일로 할당된 저장공간에 작업 |\n| 어플리케이션 |~|~|\n|>| Windows HyperVisor | |\n|>| 서버가상화 | Windows XP - 아키텍처 설계시 VM이 고려되지 않음 |\n|>|~| Windows 7 이상의 OS를 추천 (∵ Hyper-V) |\n
!!! 죽령 산신당과 다자구 할미 / 소백산 소백사(다자구할매 신당)\n--------------------------------------------------------------------------------\n소재지 :충북 단양군 대강면 용부원리 \n\n단양군 대강면 용부원리 텃골 남쪽에 다자구 할머니의 산신당이 있다. 이 산신당에는 다자구 할머니가 죽어서 죽령의 산신이 되었으므로 이를 모셔 제사를 모시는 죽령 수호의 산신당인 것이다. 또 이 산신당을 죽령 산신당, 국사당이라고도 부르고 있으며, 인조원년에 단양, 영춘, 풍기의 세 고을 군수가 신당을 짓고 매년 춘추로 제사를 지냈는데 군수가 제주가 되는 관행제로 행해졌다. \n\n그러다 단양, 영춘이 합군이 된 후로는 주민이 주로 되어 산신제를 지냈으며, 현재도 군수가 죽 령산신제에는 꼭 참석하고 있다. 옛날에는 단양군 대강면에서 경상도 풍기로 넘어가는 죽령고개는 험하기도 하였거니와 도둑떼들 이 들끓어 지나가는 행인을 괴롭혀 왔다. 처음에는 밤에만 나타나던 도둑들이 대낮에도 나타나 행패가 심하여지자 관가에서는 군졸들을 풀 어 도둑들을 잡으려 했으나 도둑들은 험한 산세를 이용해 피하였으므로 도둑 잡기가 몹시 힘들 었다. \n\n그런데 도둑들에게 가산을 몽땅 빼앗긴 할머니 한사람이 관가에 찾아와 도둑 잡기를 자청 하였 다. 나이 많은 할머니가 도둑을 잡겠다고 함으로 관원은 의아해 하며 할머니가 어떻게 도둑을 잡겠다 는 것이냐고 물었다. 할머니는 자기가 도둑 떼 속에 들어가있을테니 군졸들을 죽령고개 일대에 숨겨두라는 것이었다. 그러다가 [ 다자구야 자자구야 하고 소리를 내면 도둑들이 다 잠을 자고 있으니 급히 잡으러 오면 되는것이고 들(덜)자구야 들(덜)자구야] 하거든 도둑들이 잠을 자지 않고 있는 것이니 숨어 있으라는 것이었다. 이렇게 서로 약속을 한 할머니는 곧 죽령고개르를 오르락 내리락 하며 목청을 돋구어 [ 다자구야 들자구야 ] 가락을 붙여 소리 높이 외치며 도둑들과 만나기를 기다리고 있었다. 숲 속에 숨어 살던 도둑은 매일같이 노래 부르며 고개를 오르내리는 할머니를 수상히 여겨 할머 니를 잡고는 그 까닭을 물었다. 할머니는 다자구 들자구는 아들들의 이름인데 얼마전 산에 나무를 하러 갔다 아직 돌아오지 않아 호환이나 당하지 않았나 걱정이 되어 찾으로 나온 것이라 했다. 그러면서 두 아들들이 없으면 자기는 올데 갈데 없다고 했다. \n\n도둑들은 할머니에게 자기네를 따라와서 밥짓는 일을 하지 않겠느냐고 하는 것이었다. 할머니는 좋다고 말하고서 도둑들을 따라 갔으며 함께 살며 밥짓는 일을 하게 되었다. 할머니는 관군을 불러 도둑 잡는 좋은 기회를 엿 보았으나 여간해 그런 기회가 오질 않아 밤마 다 [ 들자구야 들자구야 ]를 노래처럼 부르기만 했다. 그러다 하루는 두목의 생일이 되었다. 도둑들은 대낮부터 실컷 술을 마시고 한밤이 되면서 모두 잠에 골아 떨어지게 되었다. \n\n할머니는 그때를 놓치지 않고 [ 다자꾸야 다자꾸야 ] 하고 노래로서 외쳤다. 숨어 있던 관군은 이 소리를 듣고 급히 달려가 도둑들을 모두 잡아 버렸다. 그러나 할머니는 어디로 갔는지 자취를 찾을 수 없었다. 사람들은 할머니를 다자구 할미라 부르고 다자구 할미가 죽어서 죽령산신이 됐다고 믿고 있다. \n\n다자구야 들자구야 \n언제가면 잡나이까\n들자구야 들자구야\n지금오면 안됩니다\n다자구야 다자구야\n소리칠때 기다리다\n다자구야 다자구야\n그때와서 잡으라소\n\n(노래말, 한글학회, 한국지명총람 충북편, 1970) \n
! RAID ( Redundant Array of Inexpensive Disks 또는 Redundant Array of Independent Disks )란?\n\n - 여러개의 하드디스크를 모아 논리적으로 하나의 대형 드라이버처럼 사용\n - 혹은 장애 발생시 데이터를 안전하게 복구할 수 있도록 하는 장비\n\n\nRAID는 1988년 버클리 대학의 3명의 과학자(패터슨, 가스 깁슨, 랜디 카츠)가 제안한 이론(SIGMOD에 'A Case for Redundant Array of Inexpensive Disks'라는 논문 발표)으로 그 당시에는 하드디스크의 용량이 제한적이었고, 함부로 사용하는 이도 드물 정도로 값도 비쌌기 때문에 보다 저렴하며 용량이 적고, 성능이 낮은 하드디스크를 묶어 중복 구성함으로써, 성능이 좋은 고가의 대용량 하드디스크 장비와 겨뤄 손색이 없도록 하는 것이 주목적이었다.\n\n그러나 그들이 열심히 RAID를 연구하는 동안 Storage 기술의 발전으로 용량대비 가격이 지속적으로 하락하였으므로 애초 주목적이었던 가격적인 면보다는 데이터의 안정성과 에러 보정, 그리고 하드디스크의 장애에 의한 데이터의 손실을 막기 위한 측면이 강조되었고, RAID의 의미는 'Inexpensive'에서 'Independent'로 의미가 바뀌게 되었습니다. \n\n단순히 구성으로만 보자면 지금 많이들 사용하는 partition의 반대 비슷한 개념정도 됩니다. \n\n파티션이 하나의 물리적인 드라이브를 여러개의 논리적 드라이브로 분할한것 이라면.. 레이드는 여러개의 물리적 드라이브를 하나의 논리적 드라이브로 묶는 방식 입니다.\n\n보다 정확한 파티션의 반대 개념은 단순히 구성을 묶기만 하는 JBOD (Just a Bunch Of Disks 또는 Just a Bunch Of Drives) 가 더 가까울듯 합니다. 이것은 여러 개의 물리 드라이브를 논리적인 하나의 커다란 드라이브로 결합해주는 것일 뿐, 각각의 드라이브를 독립적으로 사용하는 것에 비해 어떠한 장점도 없으니까요.\n\nRAID 시스템은 동일한 데이터를 여러 개의 디스크에 중복 저장하면서도, 운영체계에는 하나의 단일 디스크로 인식시킴으로써, 내고장성의 증가와 데이터 접근 효율성을 높여주는 장점이 있습니다.\n\n!!!! • RAID 성능 향상의 원리\n\nRAID는 크게 스트라이핑(Strpping)과 미러링(Mirroring)으로 구분할 수 있는데, 뒤에서 설명할 RAID 규격은 모두 이 스트라이핑과 미러링을 어떤 식으로 구성했느냐에 따라 나눈 것이기 때문에 두가지 방식 차이만 잘 알아두면 RAID에 대해 절반은 알고 시작하는 것이라고 하겠다. \n\n스트라이핑이란 논리적으로 연속된 데이터를 물리적으로 여러 개의 저장 장치에 나눠서 저장하는 방식으로 우리가 생각하는 파일 1개씩이 아니라 데이터 단위로 나뉘므로 우리가 볼 때는 하나의 하드로 나타나지만 실제로는 하나의 하드에 들어갈 내용을 여러 개의 디스크에 저장하므로 개별 하드의 데이터는 독립적으로는 쓸모가 없고 스트라이핑 된 모든 하드가 있어야 완전한 저장장치가 된다. \n\n스트라이핑이 좋은 점은 병렬로 하드 디스크를 묶었을 때 각 하드와 데이터를 주고 받는 속도가 단일 하드에 데이터를 주고 받는 속도보다 빠르다는 것이다. 이로 인해 데이터를 하드 디스크에 쓰거나 읽기 위해서 기다려야 하는 시간에 다른 하드의 데이터를 읽고 쓰는 식으로 액세스 타임을 줄일 수 있으며, 이론상 하드 디스크를 추가할수록 성능은 증가하게 된다. \n \n미러링은 말 그대로 거울에 비치는 것처럼 같은 데이터를 복수의 장치에 동일하게 저장하는 방식이다. 이것은 성능과는 관계없는 순수한 데이터 보호를 위한 안정성을 추구하는 방식으로 사용자가 직접 데이터를 백업하는 것이 아니라 데이터 자체를 동일한 형태로 2개 이상의 복수 장치에서 보관하기 때문에 한군데서 데이터가 분실되거나 파손되더라도 보존된 다른 장치에서 같은 데이터를 그대로 복구할 수 있다. \n\n미러링의 경우는 스트라이핑처럼 성능 향상과 관계없고 오히려 복수의 하드에 같은 내용을 저장해야 하므로 성능이 같거나 미세하게 떨어질 수 있고 2개의 하드가 같은 데이터를 기록하게 되니 사용 가능한 용량도 절반으로 줄어든다. 하지만 데이터 복구가 가능하기 때문에 역시 단독 RAID 1 시스템보다는 데이터 유실의 염려가 큰 스트라이핑을 보완하는 식으로 함께 구성된다. \n\n스트라이핑과 미러링을 어떤 식으로 구성하느냐, 그리고 두가지 방식을 보완하기 위해서 어떤 방법을 택하고 있느냐에 따라 RAID의 규격이 바뀌게 되는데... 다음 장에서는 수많은 RAID 규격 가운데 표준 규격으로 사용되는 것들과 비표준 규격이지만 데스크탑 메인보드 제품에서 지원되는 규격들을 살펴보겠다.\n\n\n!!! RAID의 장점 :\n - 시스템에 있는 디스크의 수가 증가함에 따라 디스크가 장애를 일으킬 가능성이 높아가고 있는 상황에서 미러링이나 패리티 정보를 이용해 디스크 장애에 대비\n - 여러 개의 물리적인 하드디스크를 하나의 논리적인 드라이브로 인식함으로써, 용량과 드라이브 수의 제한 극복\n - 여러 디스크에 데이터를 분산시키고 병렬로 입출력을 처리함으로써 속도와 효율성 증가 \n\n!!! RAID의 목적 :\n 1.여러 개의 디스크 모듈을 하나의 대용량 디스크로 사용\n 2.입출력 속도를 높인 것\n 3.장애가 발생하더라도 최소한 데이터가 사라지는 것 방지\n\n\nRAID 시스템이 나온 배경 솔루션\n - 하드 디스크의 질과 성능이 크게 향상되긴 했지만 아직도 컴퓨터 시스템 가운데 가장 취약한 부분으로 남아있다. 때로는 회복이 불가능할 정도로 손상되기도 하는데 시스템이 다운되면 회사로서는 큰 낭패가 아닐수 없다. 그리고 네트워크에서 병목현상이 가장 심하게 일어나는 부분도 하드디스크다.\n\nRAID 시스템은 그런 하드디스크의 결함을 비교적 저렴한 비용으로 해결할 수 있는 솔루션\n\n\n!!! RAID를 구성하기 위한 준비\n\n데스크탑 시스템에서 RAID를 구성하기 위해서는 무엇이 필요할까? 당연히 RAID를 지원하는 장치가 필요할 것이다. 데스크탑 시스템에서 RAID를 지원하는 장치는 외장 카드와 내장 컨트롤러로 구분되는데, 외장 카드는 메인보드의 확장 슬롯에 장착해서 사용하는 방식이며 내장 컨트롤러는 메인보드의 사우스브릿지 칩셋이나 보드에 달린 RAID 기능 지원 추가 컨트롤러를 통하는 방식이다. \n\n(그러나 RAID를 구성하는 방법으로 RAID 기능이 들어간 하드웨어를 사용하지 않고도 운영체제가 제공하는 기능을 이용해 소프트웨어적으로 RAID를 만들 수도 있는데, 이 부분은 이번 테스트에는 포함시키지 않으며 별도의 페이지로 언급하겠다) \n\n!!!! • RAID 기능을 지원하는 메인보드\n\n메인보드는 보통 사우스브릿지라고 불리는 칩셋이나 추가적인 SATA/IDE 컨트롤러에 RAID 기능을 달아서 제공하고 있는데, 이러한 메인보드를 사용하면 보드에 달린 SATA/IDE 커넥터에 하드를 연결해 RAID 구성이 가능하다. \n\nRAID 기능을 지원하는 메인보드는 그렇지 않은 제품보다 가격이 더 비싸지만 대부분 단순히 RAID 유/무의 차이로 가격을 정하는 것은 아니고, 더 좋은 품질의 부품을 쓰거나 부가 기능을 더 많이 포함시켜 만들기 때문이다. \n\n오늘 RAID 기사에서 사용한 메인보드는 ASUS P5K Premium으로 이 제품은 메인보드 사우스브릿지 칩셋인 ICH9R에서도 SATA RAID 기능을 지원하며, IDE 커넥터 및 eSATA 포트를 위한 추가 컨트롤러 칩셋에서도 RAID 기능을 지원하므로 만약 필요하다면 2개의 컨트롤러로 2가지 RAID 구성을 할 수 있다. 양쪽 모두 RAID 기능을 제공하지만 실제 RAID 작업에 필요한 XOR 프로세서 역할이나 캐시 메모리는 PC 자원을 사용하므로 고급형 RAID 컨트롤러 카드처럼 완전한 하드웨어 RAID 방식이라고 할 순 없다. \n\n사우스브릿지에 들어있는 RAID 기능은 칩셋에서 지정원 SATA/IDE 대역폭을 사용하고, 추가 컨트롤러에서 제공하는 RAID는 컨트롤러 칩셋이 메인보드 칩셋과 연결된 인터페이스 대역폭을 사용하게 된다. 이번에 테스트한 메인보드 RAID는 추가 컨트롤러 대신 메인보드 칩셋 ICH9R에서 제공하는 기능을 썼다. \n\n!!!! • RAID 전용 컨트롤러 카드 (고급형)\n\n메인보드에서 제공하는 RAID 기능 대신 별도의 확장 카드를 이용한 RAID를 구성하려는 사람이라면 가격비교 사이트에서 같은 RAID 컨트롤러 카드임에도 불구하고 엄청난 차이가 있는 가격을 보고서 놀란 경험이 있을 것이다. RAID 컨트롤러 카드는 단순히 몇개의 하드를 연결하고 어떤 인터페이스를 지원하느냐 외에 하드웨어 방식이냐 소프트웨어 방식(운영체제를 의미하는 건 아님)이냐로 가격 차이가 난다. \n\n하드웨어 방식의 RAID는 시스템과 별개로 컨트롤러에서 모든 드라이브 통신을 처리해 시스템/운영체제에서 독립된 하나의 저장장치로 보이게 한다. 주로 PCI-X급 이상의 충분한 대역폭을 가진 인터페이스 기반으로 만들어져 일반 데스크탑 시스템보다 서버/워크스테이션 시스템에서 사용되며, RAID 구성 및 작동을 위해 별도의 XOR 프로세서와 전용 캐시 메모리를 내장해 가격이 상당히 비싸다. 하드웨어 RAID 방식은 전송 속도 및 안정성에서 유리하며, 특히 소프트웨어 방식은 시스템에서 RAID 작업을 떠맡아야 하므로 경우에 따라서는 시스템의 성능을 저하시킬 수도 있다. \n\n하드웨어 방식의 RAID 컨트롤러 카드로는 Adaptec사의 ASR-3405 4ch 컨트롤러를 사용했다. 이 제품은 히트싱크가 부착된 인텔 80333 500MHz 프로세서를 하드웨어 XOR RAID 엔진으로 사용하고, 128MB의 DDR 메모리를 카드에 달아 ECC-Protected 데이터 캐시 메모리 역할을 하도록 만들었다. LP(Low Profile) 디자인으로 블레이드 서버 등에서도 사용 가능하다. \n\n단순히 SATA RAID 뿐만 아니라 SAS(Serial Attached SCSI) 컨트롤러로 사용할 수 있으며, PCI-X 인터페이스 대신 PCI Express x4 방식을 지원해 서버/워크스테이션 보드가 아니어도 대역폭 문제가 없다. PCI Express x4 인터페이스의 대역폭이 서버용 PCI-X 133MHz의 대역폭과 같기 때문이다. \n\nPCI Express x4 슬롯은 일반 PCI Express 데스크탑용 메인보드 중에서도 흔한 것은 아니지만, 그래픽 카드의 멀티 GPU 기능을 지원하는 보드라던지 유사 멀티 GPU를 지원하는 보드에서 많이 제공한다. (PCI-X 슬롯을 지원하는 데스크탑 메인보드보다는 훨씬 많다) \n\nRAID 0, 1, 1E, 5, 5EE, 6, 10, 50, 60, JBOD로 핫 스페어(Hot Spare), 핫 스왑(Hot Swap) 기능도 지원한다. 전용 연결 포트와 케이블을 통해 1개의 케이블에서 4개의 하드 디스크를 연결할 수 있으며, 정전이나 시스템 문제가 발생할 때 캐시 데이터를 보호할 수 있는 배터리팩(옵션) 연결도 지원한다. \n\n!!!! • RAID 전용 컨트롤러 카드 (보급형)\n\n메인보드와 별개의 확장 카드로 제공되지만 XOR 프로세서나 캐시 메모리가 따로 들어가지 않는 제품들을 보급형 RAID 컨트롤러 카드라고 부르는데, 이 제품들은 RAID 구성을 위한 기본 기능은 제공하지만 운용을 위한 작업은 시스템에 의존하기 때문에 가격이 저렴하면서 복잡하지 않은 RAID를 지원할 때 사용할 수 있다. \n\nRAID 작업이 단일 하드 사양을 넘는 고성능이 필요하거나 데이터 보호를 위한 것이므로 전문적인 작업이라면 그만큼의 성능과 안정성이 담보된 고급형 컨트롤러 카드를 사용하겠지만 데스크탑에서 1~ 2개의 하드를 가지고 구성하는 RAID 0, 1 수준이라면 보급형 컨트롤러로도 무난한 성능을 낼 수 있다. \n\n다만 보급형 RAID 컨트롤러 카드는 대부분 보다 많은 시스템 호환성을 위해 PCI 인터페이스를 지원하는데, 이 경우 PCI 대역폭이나 속도가 많은 숫자의 하드로 RAID를 구성하기에는 모자라 단일 하드보다 오히려 성능이 떨어질 수도 있다. \n\n누디앙일렉트론의 코요테(Coyote) SATA II RAID 4ch 컨트롤러 카드가 바로 컨트롤러 칩셋과 바이오스만으로 구성된 보급형 제품으로 폭넓은 호환성을 가진 32bit PCI 인터페이스 외에 4채널 RAID 구성을 위해 인 PCI-X 인터페이스도 지원하도록 만든 제품이다. 앞에서도 언급했지만 PCI-X 133MHz인터페이스는 PCI Express x4와 마찬가지로 단방향 1GB/s의 대역폭을 가지고 있다. \n\n보드나라에 32bit PCI RAID 컨트롤러 카드가 따로 없는데다 PCI 전용으로 나온 제품들은 대부분 2포트만을 지원해 특별히 PCI와 PCI-X를 모두 지원하는 이 제품을 포함시켰다. 물론 RAID 테스트는 PCI-X 지원 보드가 아닌 일반 데스크탑 시스템을 기준으로 할 예정이라 이 제품은 32bit PCI RAID 컨트롤러 카드로만 사용될 것이다. \n\n!!!! • RAID 드라이버 설치용 FDD와 플로피 디스켓\n\n윈도우 XP는 출시된지 꽤 오래된 운영체제라 XP 이후에 나온 RAID 장치나 SATA RAID를 운영체제에서 제대로 인식하지 못한다. 이 때문에 RAID로 구성된 드라이브를 인식하거나 운영체제를 설치하기 위해서는 드라이버를 따로 설치해줘야 한다. \n\n윈도우 비스타처럼 최신 운영체제에서는 FDD를 이용하지 않더라도 대부분 드라이버를 가지고 있어 P35 메인보드의 ICH9R을 RAID 모드로 바꿔도 운영체제를 설치할 수 있었지만 이 때도 SATA 포트를 지원하는 블루레이 드라이브를 썼을 때 문제가 생겨 필자는 IDE 지원 DVD 드라이브로 교체했다. \n
!(경주남산 삼릉계) 냉골 선각육존불(아미타삼존불/석가삼존불)\n출처 ; http://blog.daum.net/kinhj4801/15960367\n\n신라에서 선각의 마애불은 8세기 말~9세기 초에 조성되기 시작하는데, 경주 남산 삼릉계곡선각육존불과 경남 함안 방어산마애불(801년) 등이 대표적 작품으로 꼽을 수 있다\n\n!! #.삼릉계 3사지 석가여래삼존불\n\n본존 석가여래는 넓은 연꽃 위에 앉아 계시고 문수보살(文殊菩薩)과 보현보살(普賢菩薩)은 본존의 양 옆에 서 있다.\n\n석가여래상은 두광과 신광을 갖추고, 연화대좌 위에 결가부좌하고 있다. 큼직한 육계에 얼굴은 원만하고, 목에는 三道를 두 줄의 선각으로 표현하였다. \n\n법의는 편단우견(偏袒右肩)으로 가사를 입고 오른손은 가슴 앞에서 엄지와 검지를 맞댄 설법인(說法印)이며 왼손은 무릎 위에서 손바닥을 펴 배 앞에 댄 선정인(禪定印)이다\n\n왼쪽의 문수보살은 바위 표면의 절리로 인해 마멸이 심하여 모습을 잘 알 수 없으나 연꽃 위에 서서 오른손은 설법인으로 가슴에 들고 왼손은 아래로 드리운 채 천의(天衣)자락을 잡고 있는 듯하며 얼굴은 여래쪽으로 돌리고 있다\n\n오른쪽 보현보살은 두광을 갖추고 연화대좌 위에 서 있는데, 오른손은 들어 손등을 위로 하였고 왼손은 늘어뜨려 군의자락을 가볍게 잡고 있다. 두 발은 발꿈치를 중심으로 좌우로 향하고 있다. 상반신은 나체이며 군의를 입고 있는데 허리 아래에서 띠로 묶었다. \n\n두 보살은 모두 구슬을 꿴 목걸이를 걸고 팔과 손목에 팔찌를 끼웠을 뿐 상의는 입지 않았다. \n두 보살이 여래쪽으로 비스듬히 향하고 있음으로 바위 분위기는 아늑하게 표현되어 있다.\n\n※ (왼쪽) 문수보살은 부처의 지혜를, (오른쪽) 보현보살은 부처의 자비를 상징한다\n\n!! #.삼릉계 3사지 아미타삼존불\n\n석가삼존불에서 약 3m 앞의 바위 절벽면에 선각되어 있는 아미타삼존불은 석가삼존불과 반대로 본존여래가 연꽃 위에 서 있고 양쪽 협시보살은 연꽃 위에 앉아 있다. \n\n삼존 모두 원형의 두광과 복련의 연화대좌를 표현하였다.\n\n아미타여래불은 둥근 얼굴에 목에는 두 줄로 된 삼도를 표현하였고 오른 손바닥을 아래로 하여 가슴에 들고 왼손바닥은 위로하여 배 앞에 들고 있다. 가사는 우견편단우견으로 몸에 걸쳤는데 신광(身光)은 없고 두광(頭光)만 원으로 나타나 있다. \n둥글면서 벌어진 어깨는 강건한 느낌을 주면서 허리는 매우 가늘게 표현하였다.\n\n좌우협시보살상은 각각 꿇어앉은 자세로 본존을 향하여 꽃 공양을 하고 있는 자세이다. 형태로 보아 활짝 핀 연꽃으로 보인다 \n두 보살은 모두 둥근 구슬목걸이를 걸었고 팔과 손목에는 팔찌를 끼었다. 어깨에는 얇은 천의를 걸쳐 있으며, 천의자락이 나부낀다.\n왼쪽의 관세음보살상은 여래쪽으로 향해 윤왕좌(輪王座 ; 한쪽 무릎을 세우고 앉는 법)로 앉아 꽃 쟁반을 들었고 오른쪽 팔 아래에 천의 자락이 길게 늘어뜨려져 있다\n오른쪽의 대세지보살은 관세음보살의 반대 모습으로 앉아 역시 꽃 쟁반을 들고 있다. \n\n본존여래가 앉아 있고 협시보살들이 서 있는 예는 보통 있지만, 여기에서처럼 여래가 서 있고 보살들이 앉아 있는 경우는 매우 드물다.\n\n생전에 나무아미타불(南無阿彌陀佛)을 많이 부르고 착한 일을 한 사람이 죽으면 아미타 여래가 보살들을 데리고 죽은 사람의 영혼을 맞으러 지상으로 하강한다. 그때 여래는 서고 보살들은 앉는데 이러한 모습을 내영아미타상(來迎阿彌陀像)이라고 부르기 때문에 이 바위면의 삼존상은 내영아미타상임을 알 수 있다고 한다.\n\n석가여래는 현세의 부처님이시고 아미타여래는 극락세계에 계시는 부처님이시다. 아미타여래는 지상에 하강하여 석가여래로부터 생명을 인계받는다. \n이곳에 석가삼존과 내영아미타삼존이 함께 새겨져 있는 것은 이승에서 저 세상인 극락세계로 생명이 인계되는 중요한 장소라는 뜻이라고 한다.\n\n이 불상의 제작시기는 이상주의적인 양식이 성행하던 8세기경으로 추정하고 있다. \n\n※ (왼쪽) 관세음보살은 자비를, (오른쪽) 대세지보살은 지혜와 광명을 상징한다.\n\n관세음보살은 석가모니의 입적 이후 미륵이 출현할 때까지 중생들을 고통으로부터 지켜주는 대자대비(大慈大悲)의 보살이다. 대세지보살은 지혜의 광명으로 중생을 구제한다.\n
@ 2014-03-11 @\nSSD의 속도와 HDD의 저장공간을 합쳐서 만든 제품이다. 실제 데이터 저장은 HDD 에 하지만, SSD 를 캐쉬로 이용하여, 자주 이용하는 데이터의 경우는 SSD 와 동등한 속도를 내준다(하드디스크에 캐시공간을 크게 만들어 자주쓰는 데이타를 캐시에다가 넣는 원리). 하지만, 현실은 SSD 만큼 비싸고, HDD 만큼 느리다고 알려져있다.\n\n실제로 데스크탑 사용자는 SSD 와 HDD 를 그냥 따로 구매해서, 속도를 위해서는 SSD 를, 용량을 위해서는 HDD 를 사용하여 나눠 쓰는 것이 훨씬 낫다.\n\n@@이 제품이 타게팅하는 마켓은 노트북 사용자층@@이라 할 수 있으며, 대부분의 노트북은 HDD 를 1개만 설치할 수 있기에, SSD 로 교체해서 사용하기에는 비용과 용량의 압박을 받을 수 밖에 없다. 이런 사용자층을 노린 제품이라 보면 된다. 고성능 노트북을 지향하는 경우, 이 SSHD 를 장착하고 나온 제품도 있지만 mSATASSD가 대중화 되고 있어서 이쪽에서도 인기가 저조하다.\n\n참고로 처음에는 Hybrid HDD (HHD) 라는 표현을 사용했다가, SSHD 란 표현으로 바뀌었다.\n
https://kukuta.tistory.com/407 - [VBA] String 완벽 가이드\n\n!! VBA (Visual Basic for Applications) 란 \n@@bgcolor(#f2f2ff): VBA 편집창 열 열기 ; Alt + F11 @@\n\nVBA란 마이크로소프트 오피스에 포함된 일종의 베이직 프로그래밍 언어이다. 특히 금융계에서는 가장 많이 사용하는 오피스 프로그램중 하나인 엑셀의 VBA를 이용하여 수식과 함수만으로 해결하지 못하는 많은 일을 하고 있다.\n\n마이크로소프트 오피스 4.x버전에서 처음으로 VBA가 도입된 이후 이제는 VBA에 관한 많은 정보를 얻을 수 있다. VBA프로그래밍에 입문할 수 있는 여러 종류의 책이 서점의 서가에 꽂혀있고 선량한 네티즌이 자신의 VBA지식을 인터넷에 올려 두고 있다. \n\n프로그래밍을 어려워하는 그들은 VBA가 처음 해보는 프로그래밍 언어라는 공통점이 있는데 결국 그들에게 어려운 것은 VBA가 아니라 프로그래밍 그 자체인 것이다.\n \nVBA는 다음과 같은 장점을 가지고 있다. \n 1. 베이직이 기반이므로 쉽다. 따라서 프로그래밍분야에 입문하기 쉽다.\n 2. 별도로 프로그래밍 도구가 필요 없다. 마이크로소프트 오피스(이하 오피스)가 있으면 어디서든 프로그래밍을 할 수 있다.\n 3. 실용적이라는 점이다. 사무실에서 가장 많이 사용하는 업무프로그램이 오피스이며 업무처리를 빠르고 편하게 정확하게 도와줄 것이다. 다른 언어로는 VBA만큼 쉽고 빠르게 개발할 수 없을 것이다.\n 4. 네 번째 장점은 이 글을 좀 더 읽어 보시면 나올 것이다.\n\nVBA는 마이크로소프트의 베이직 가족 중 하나이며 마이크로소프트 비주얼베이직이 오피스 제품에 들어간 것이다. 지금은 오피스뿐만 아니라 드로잉 도구인 비지오, 오토캐드와 같은 여러 제품에도 VBA가 포함되어 있다. VBA는 베이직 언어로서의 본래의 기능(수치 연산, 문자열 조작, 파일 처리)뿐만 아니라 해당 어플리케이션을 조작하고 다룰 수 있는 기능을 제공한다.\n \n엑셀 VBA의 경우 베이직 언어로서 무언가를 계산한 결과나 그 과정을 워크시트에 기록하거나 워크시트의 값을 읽어 원하는 계산을 수행한다. 그리고 새로운 워크시트를 삽입하거나, 차트를 자동으로 그려주거나 사용자 정의 메뉴를 만들어 주는 등 엑셀을 조작한다.\n \n파워포인트 VBA라면 슬라이드, 그리기 개체, 애니메이션을 다룰 수 있도록 해줄 것이다. 아웃룩 VBA경우 메일, 일정, 연락처, 작업일지 등등에 관한 조작을 자동화해 줄 것이다.\n \n즉 VBA은 해당 어플리케이션에서의 반복적인 작업, 불편한 작업, 어플리케이션이 지원해주지 않는 작업등을 도와주는 베이직 언어의 일종이다. 마이크로소프트는 여러 종류의 베이직언어를 개발하였고 다음은 여러 베이직 언어이다.\n \n| 베이직언어 | 사용영역 |\n| Quick BASIC | DOS |\n| Visual BASIC | Windows |\n| VBA | Microsoft Office, AutoCAD, etc |\n| VBScript | HTML, ASP(Active Server Page), WSH(Windows Shell Host) |\n \n위에서 본 것과 같이 베이직 가족들은 여러 분야에서 활동하고 있다. 활동 분야가 다를 뿐, 그들은 모두 베이직 언어를 기반으로 하고 있다. 따라서 여러분이 VBA를 익히고 나면 다른 활동 분야의 베이직 언어를 쉽게 배울 수 있을 것이다. 하나를 배워 다양한 분야에서 사용할 수 있는 경우는 그리 흔치 않다. 이것이 VBA의 네 번째 장점이다.\n\n!! 기타 \n#. 엑셀 VBA 매크로 소스 주석 Comments 넣는 방법\n1. 홑 따움표를 문장 앞에 입력하면 주석처리\n2. 여러 줄을 한번에 주석으로 처리\n [보기] > [도구 모음] > [편집] 메뉴를 선택, 편집 도구창을 화면에 추가\n 주석 블록 설정, 주석 블록 해제 버튼을 사용\n\n#. ''LABELVIEW''에서는 문자열을 더블바이트로 인식하며\n ActiveCell.Offset(0, 4) = StrConv(SGoods(i, 5), vbWide) 를 사용해서 출력하는 문자열이 깨지는지 확인할 수 있다.\n * vbWide (상수) / 4 (값) / Narrow(싱글 바이트) 캐릭터를 Wide(더블바이트) 캐릭터로 변경\n\n#.시트 선택/ 활성화\n-. Sheets("시트명").Select >> 시트명 선택\n-. Workbooks("엑셀파일명").Worksheets("시트명").Activate >> 시트명 활성화(사용)\n-. Worksheets("시트명").Activate >> 시트명 활성화(사용)\n++++[Special object names ]\n|Object Name |Description |비고 |\n|ActiveCell |The currentiy selected cell | |\n|ActiveChart |The currently selected chart | |\n|AciveSheet |The currently selected sheet |Microsoft Office 2003/ 2007 |\n|ActiveWindow |The currently selected window | |\n|ActiveWorkbook |The current workbook | |\n|ThisCell |The cell form which custom function is being run | |\n|ThisWorkbook |The workbook containing the macro code that is currently running | |\n===\n\n#.셀/ 범위 - 선택\n-. Range("A1").Select >> (A1) 선택\n-. Range(A5) = Cells(5, 1) = Cells(5, "A")\n Range와 Cells의 차이는 다중 영역을 선택할 수 있는지 여부\n\n Range(A5:C7) -> Cells로는 선택할 수 없음 \n\n#.Text/Value/Value2 차이점\n - Text : 화면에 보이는 값이 string 형식으로 넘어옴\n - Value : 화면에 보이는 값이 variant 형식으로 넘어옴\n - Value2 : 셀의 실제 값이 variant 형식으로 넘어옴 (Date -> Double로 변환됨)\n * 셀 서식, Round 함수 등의 사용에 따라 value와 value2는 값이 다를 수 있음\n\n#.Dim 문 ; 하나 이상의 변수에 사용할 저장 공간을 선언하고 할당\n Const nSheet As Integer = 6\n Dim da(nSheet, 100) As Integer\n Dim dd As String\n\n#.배열 설정 ; (1차원, 2차원, 3차원, 4차원 .... 60차원)\n 1차원 ; 가로\n 2차원 ; 세로, 가로\n 3차원 ; 새로, 가로, 층\n 4차원 ; 세로, 가로, 층, 공간\n\n#.메시지 출력\nMsgBox "마지막 등록 정보 : " & sSting(nCount, 1) & " / " & sSting(nCount, 2)\nMsgBox "Next kk = " & kk (출력 문자열 = "내용" &(문자열합성) 변수)\n\n〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓\n#. 파일 생성 (XlFileFormat 열거형)\n---------------------------------\n• [[XlFileFormat 열거형]]\n\nActiveWorkbook.SaveAs Filename:="C:\s테스트엑셀.xlsm", FileFormat:=xlOpenXMLWorkbookMacroEnabled 또는\nActiveWorkbook.SaveAs Filename:="C:\s테스트엑셀.xlsm", FileFormat:=52\n\n/ FileFormat : XlFileFormat 열거형 상수 중 하나\n 50 = xlExcel12 (2007-2010, xlsb, 매크로 없거나 있거나 다됨)\n 51 = xlOpenXMLWorkbook (2007-2010, xlsx, 매크로 없음)\n 52 = xlOpenXMLWorkbookMacroEnabled (2007-2010, xlsm, 매크로 있음)\n 56 = xlExcel9 (91-2003, xls, 매크로 없거나 있거나 다됨)\n \n/ FileFormat : xlDBF2, xlDBF3 및 xlDBF4 파일포맷은 다양한 버전의 *.DBF 파일일 때 지정\n-. Excel 2007 version에서는 Workbooks.Open 함수에서 인식되며, Workbook.SaveAs 함수에서는 인식되지 않고, 마이크로 소프트는 더 이상 디베이스 파일 형식으로 출력을 지원하지 않음\n-. DBF는 더 이상 Excel 2007에서 저장 대화 상자 파일의 옵션으로 지원하지 않으며, DBF에 가까운 다른 타입 파일로는 DIF 파일이 있다.\n-. *.dbf로 저정하기 위해서는 Excel 2003을 사용하거나\n Access에서 Excel 데이터를 가져온 후 DBF로 저장 (또는 외부 프로그램을 사용)\n\ncf. DBF (.dbf) 파일은, dBASE 라는 "데이터베이스(Database)" 프로그램에서 사용되던, 파일 형식의 확장자.\n예전에 국내에서는 "dBASE III" 라는 도스용 프로그램을 많이 사용했습니다. 지금은 DBF 파일이 거의 쓰이지 않는다. 대신, 간단한 데이터를 다룰 때에는 엑셀(Excel)의 xls 파일 형식을 주로 사용하고, 대량의 데이터는 Access 등의 데이터베이스 프로그램에 입력하여 사용.\n\n\n<br>
출처 ; http://overseastory.com/마누카-꿀-등급-구별법-뉴질랜드-꿀-mgo-umf-비교/\n\n마누카꿀은 뉴질랜드에서 자생하는 마누카 꽃에서 채집한 꿀로 마누카꿀은 약용꿀로도 유명하다.\n마누카(Manuka)는 카누카(Kanuka) 또는 차나무(Tea Trees) 라고도 불리며 해발 1800m의 낮은 고산 지대에서 높이 약 10m 까지자라고, 가뭄, 강품 및 서리에 매우 강하여, 꿀벌이나 바람에 의해 수분되며, 상처, 감염 및 기타 불균형을 치료할 수 있는 나무로 알려져 있다.\n\n강력한 항박테리아 성분 때문에 상처치료에도 사용할 수 있고 이러한 특성 때문에 식품은 물론 약의 성분으로도 사용된다. 균으로 인한 피부병은 물론 위궤양과 같은 내과 질환, 그리고 소화불량에도 좋은 효과를 보이는 것으로 나타나고 있다.\n\n마누카꿀의 성분은 크게 UMF와 MGO로 표시한다.\n\n''* MGO는(Methylglyoxal, 메틸글리옥살)'' 마누카꿀의 특유한 항균 기능을 제공하는 것으로 확인된 메틸 글리 옥살이라는 물질의 약자\n독일 드레스던 공대가 마누카꿀의 항염성분이 MGO(메틸글리옥살)이라는 것을 밝혀내면서 부터 마누카꿀의 항염효과의 관한 사항은 MGO 수치로 표기하는 것이 더 옳다는 주장이 제기되고 있으며 가장 대표적인 제품은 드레스던 공대와 협약을 맺고 있는 마누카헬스(Manuka Health)회사의 제품이다.\n\n''* UMF는(Unique Manuka Factor)'' 뉴질랜드 마누카 꿀 협회의 등록 상표\n협회는 마누카 꿀 중에서 특별한 효능이 있는 제품을 엄격하게 관리하여 UMF라는 표시를 하도록 한다. 따라서 UMF 표시가 있는 꿀은 협회가 보증한 것으로 그 꿀의 효능은 믿을 수 있다고 한다. 일반적으로 UMF 10+, 15+등으로 표시되고 있으며 수치가 높을수록 성분이 많이 함유되어 있다고 한다. \n\n''* UMF와 MGO의 선택 기준''\n뉴질랜드 마누카 꿀은 위와 같이 두가지의 종류로 되어 있으며 마누카꿀의 대표적인 특징 항박테리아 수치를 표시하는 방식에 따른 차이다. \nMGO만을 함유하고 있다고 하여 100% 마누카 꿀이라는 것을 증명할 수 있는 것이 아니라 Leptosperin과 같은 인위적으로 제조할 수 없는 성분이 함유되어 있어야 한다. UMF®는 각 배치별 꿀의 랩 테스트를 통해 100% 순수한 마누카 꿀을 확인 후 라이선스를 발급한다. 그러므로, UMF 마크가 붙은 꿀은 100 % 순수한 뉴질랜드의 마누카 꿀이라는 것을 알 수 있다. 숫자가 높을 수록 더 등급이 높은 마누카 꿀이다. 만약, 꿀 포장에 MGO 또는 UMF가 없다면 100% 마누카 꿀이 아니기 때문이다.\n\n| Current MGO | New MGO | UMG |\n| MGO 30+ | MGO 30+ | None |\n| MGO 83+ | MGO 83+ | UMF 5+ |\n| MGO 100+ | MGO 115+ | UMF 6+ |\n| MGO 250+ | MGO 263+ | UMF 10+ |\n| MGO 400+ | MGO 400+ | UMF 13+ |\n| MGO 550+ | MGO 573+ | UMF 16+ |\n| MGO 700+ | MGO 700+ | UMF 18+ |\n| MGO 850+ | | UMF 20+ |\n| MGO 1000+ | | UMF 22+ |\n\n\n\n
워크시트를 저장할 때 사용할 파일 형식\n\n버전 정보\n 추가 버전: Excel 2007\n\n| 이름 | 값 | 설명 |\n| xlAddIn | 18 | Microsoft Office Excel 추가 기능 |\n| xlAddIn8 | 18 | Excel 2007 추가 기능 |\n| xlCSV | 6 | CSV (*.csv) |\n| xlCSVMac | 22 | Macintosh CSV |\n| xlCSVMSDOS | 24 | MSDOS CSV |\n| xlCSVWindows | 23 | Windows CSV |\n| xlCurrentPlatformText | -4158 | 현재 플랫폼 텍스트 (*.txt) |\n| xlDBF2 | 7 | DBF2 |\n| xlDBF3 | 8 | DBF3 |\n| xlDBF4 | 11 | DBF4 |\n| xlDIF | 9 | DIF |\n| xlExcel12 | 50 | Excel 12 |\n| xlExcel2 | 16 | Excel 2 |\n| xlExcel2FarEast | 27 | Excel2 FarEast |\n| xlExcel3 | 29 | Excel3 |\n| xlExcel4 | 33 | Excel4 |\n| xlExcel4Workbook | 35 | Excel4 통합 문서 |\n| xlExcel5 | 39 | Excel5 |\n| xlExcel7 | 39 | Excel7 |\n| xlExcel8 | 56 | Excel8 |\n| xlExcel9795 | 43 | Excel9795 |\n| xlHtml | 44 | HTML 형식 |\n| xlIntlAddIn | 26 | 국제 형식 추가 기능 |\n| xlIntlMacro | 25 | 국제 형식 매크로 |\n| xlOpenXMLAddIn | 55 | Open XML 추가 기능 |\n| xlOpenXMLTemplate | 54 | Open XML 서식 파일 |\n| xlOpenXMLTemplateMacroEnabled | 53 | Open XML 매크로 사용 서식 파일 |\n| xlOpenXMLWorkbook | 51 | Open XML 통합 문서 |\n| xlOpenXMLWorkbookMacroEnabled | 52 | Open XML 매크로 사용 통합 문서 |\n| xlSYLK | 2 | SYLK |\n| xlTemplate | 17 | 서식 파일 |\n| xlTemplate8 | 17 | 서식 파일 8 |\n| xlTextMac | 19 | Macintosh 텍스트 |\n| xlTextMSDOS | 21 | MSDOS 텍스트 |\n| xlTextPrinter | 36 | 프린터 텍스트 (*.prn) |\n| xlTextWindows | 20 | Windows 텍스트 |\n| xlIntlAddIn | 26 | 국제 형식 추가 기능 |\n| xlIntlMacro | 25 | 국제 형식 매크로 |\n| xlOpenXMLAddIn | 55 | Open XML 추가 기능 |\n| xlOpenXMLTemplate | 54 | Open XML 서식 파일 |\n| xlOpenXMLTemplateMacroEnabled | 53 | Open XML 매크로 사용 서식 파일 |\n| xlOpenXMLWorkbook | 51 | Open XML 통합 문서 |\n| xlOpenXMLWorkbookMacroEnabled | 52 | Open XML 매크로 사용 통합 문서 |\n| xlSYLK | 2 | SYLK |\n| xlTemplate | 17 | 서식 파일 |\n| xlTemplate8 | 17 | 서식 파일 8 |\n| xlTextMac | 19 | Macintosh 텍스트 |\n| xlTextMSDOS | 21 | MSDOS 텍스트 |\n| xlTextPrinter | 36 | 프린터 텍스트 (*.prn) |\n| xlTextWindows | 20 | Windows 텍스트 |\n| xlUnicodeText | 42 | 유니코드 텍스트 |\n| xlWebArchive | 45 | 웹 보관 |\n| xlWJ2WD1 | 14 | WJ2WD1 |\n| xlWJ3 | 40 | WJ3 |\n| xlWJ3FJ3 | 41 | WJ3FJ3 |\n| xlWK1 | 5 | WK1 |\n| xlWK1ALL | 31 | WK1ALL |\n| xlWK1FMT | 30 | WK1FMT |\n| xlWK3 | 15 | WK3 |\n| xlWK3FM3 | 32 | WK3FM3 |\n| xlWK4 | 38 | WK4 |\n| xlWKS | 4 | 워크시트 |\n| xlWorkbookDefault | 51 | 통합 문서 기본 |\n| xlWorkbookNormal | -4143 | 통합 문서 일반 |\n| xlWorks2FarEast | 28 | Works2 FarEast |\n| xlWQ1 | 34 | WQ1 |\n| xlXMLSpreadsheet | 46 | XML 스프레드시트 |\n\n\n\n
〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓\n#. 문자열 함수\n---------------------------------\n\n#. ''Left( )함수'' ; 반환문자열=Left(문자열,추출문자수)\n \nLeft( )함수는 문자열로부터 왼쪽에서 문자수만큼의 문자를 반환한다. 예를 들면 다음 코드는 지정된 문자열에서 첫번째 두 문자(“Th”)를 반환한다.\nMsgBox Left(“This is a Test”,2)\n\n#. ''Mid( )함수'' ; 반환문자열=Mid(문자열, 시작위치, 추출문자수)\n \nMid( )함수는 문자열중 시작위치에서 추출문자수만큼의 문자를 뽑아 반환한다. 예를 들면 다음 코드는 지정된 문자열에서 여섯번째 두 문자(“is”)를 반환한다.\nMsgBox Mid(“This is a Test”, 6, 2)\n\n#. ''MIDB( )함수'' ; 사용자가 지정한 위치에서 지정된 바이트 만큼 가져오기\n반환문자열=MIDB(문자열 또는 셀참조, 가져올 문자의 시작 바이트, 가져올 문자 바이트)\ncf.서양국가에서 사용되는 대부분의 언어(SBCS)가 1바이트이고, 2바이트를 사용하는 언어(DBCS)는 한국, 일본, 중국어(간체, 번체 포함)를 포함\n\n#. ''Right( )함수'' ; 반환문자열=Right(문자열, 추출문자수)\nRight( )함수는 Left( )함수와는 반대의 역할을 한다. 문자열의 오른쪽에서 추출문자수만큼 문자를 뽑아 반환한다. 예를 들면 다음 코드는 지정된 문자열에서 여섯번째 두 문자(“st”)를 반환한다.\nMsgBox Right(“This is a Test”, 2)\n \n#. ''LTrim, Trim, RTrim 함수''\nLTrim, Trim, RTrim함수는 문자열내의 공백을 제거한다. LTrim( )함수는 공백이 아닌 문자가 시작되기전 왼쪽의 공백을 제거하고 Trim( )함수는 문자열 양쪽의 공백을 제거한다. Rtrim( )함수는 문자열의 오른쪽 공백을 제거한다.\n \nSub demoTrim()\n MsgBox LTrim(" This is a test. ")\n MsgBox Trim(" This is a test. ")\n MsgBox RTrim(" This is a test. ")\nEnd Sub\n\n#. ''문자열 연산자''\n''&'' ; 문자열 연결 연산자 - 여러개의 문자열 하나로 연결/병합(Merge String)\n/*{{{*/\nSub merge_string()\n s1 = "G"\n s2 = "ㅎㅎ"\n\n MsgBox s1 & s2 & "gle"\nEnd Sub\n/*}}}*/\n\n+ 기호를 사용하여 문자열을 연결할 수도 있지만, 추천되지 않음\n(∵ 덧셈을 해야 할지, 문자열을 연결해야 할지 잘 모르는 경우가 있음)\n\n\n〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓\n#. 문자열 변환\n---------------------------------\n#. ''CHAR(number) 함수'' ; 코드 번호에 해당되는 문자를 반환\n ''CODE(text) 함수'' ; 텍스트의 첫 번째 문자에 대한 숫자 코르를 반환\n\n#. ''HEX2DEC() 함수'' ; 16진수를 10진수로 변환하는 함수\n ''DEC2HEX() 함수'' ; 위와 반대로, 16진수를 10진수로 변환하는 함수\n\n\n〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓\n#. 셀의 색상 변경 지정 매크로\n---------------------------------\n#. 인덱스 컬러를 사용 \n' A1 셀의 글자색을 빨간색으로 변경\n Cells(1, 1).Font.ColorIndex = 3\n\n' B1 셀의 배경색을 노란색으로 변경\n Cells(1, 2).Interior.ColorIndex = 6\n\n+++[Excel 엑셀 색상표, VBA 매크로 색깔 차트; Colorindex Color Code Table]\n<html>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/excel_colorindex_table.png" >\n</html>\n===\n\n\n#.EXCEL에서 cell의 배경색을 변경하는 코드 예 (RGB 색상 조합 및 반목문 등을 사용)\n/*{{{*/\nSub UpdateColor()\n For i = 2 To 51\n r = Range("H" + CStr(i)).Value\n g = Range("I" + CStr(i)).Value\n b = Range("J" + CStr(i)).Value\n Range("K" + CStr(i)).Interior.Color = RGB(r, g, b)\n\n rIndex = 53 - i\n r = Range("H" + CStr(rIndex)).Value\n g = Range("I" + CStr(rIndex)).Value\n b = Range("J" + CStr(rIndex)).Value\n Range("L" + CStr(i)).Interior.Color = RGB(r, g, b)\n Next\nEnd Sub\n/*}}}*/
!!#. 피벗테이블(Pivot Table)\n피벗테이블은 엑셀이 제공하는 가장 강력한 데이터 분석 도구로, 많은 양의 데이터를 빠른 시간에 다양하게 분석할 수 있는 대화형 테이블이다.\n\n피벗(Pivot)이라는건 뭘까요? 피벗은 단어의 의미 그대로 회전중심축을 의미하는데, 원본 데이터를 사용자가 정의한 축을 중심으로 다양하게 분석(회전)해볼 수 있다는 의미이다. 엑셀 97에서 처음 소개된 피벗테이블은 너무 복잡해보여서 사용자들이 쉽게 접근하지 못했던 것이 사실이지만, 엑셀 2007부터는 클릭 몇번으로 피벗테이블을 만들고 분석할 수 있게 지원하고 있다.\n\n참고, http://zez2002.tistory.com/41\n\n\n!!#. 엑셀 함수\n!!! 다른 시트의 데이타 셀을 참조 ; 연산자 이용\n◈ = A1 \n / A1 셀의 값을 그대로 표시\n◈ = Sheet1!A22 \n / 다른 워크 시트에 있는 내용을 참조 ; Sheet1의 A22 셀의 값을 참조 (표시)\n\n!!! 조건함수 ; = IF(logical_test, [value_if_true], [value_if_false]) 함수\n■ logical_test 필수 요소. TRUE 또는 FALSE가 될 수 있는 값 또는 식 (비교 계산 연산자를 사용할 수 있다)\n / 더 자세한 검사를 위해 value_if_true 및 value_if_false 인수로 IF 함수를 64개까지 중첩 가능\n / IF 함수의 인수 중에 배열이 있으면 IF 문이 수행될 때 이 배열의 모든 요소가 계산.\n■ =IF(F6>0,Sheet1!B6,0)\n\n\n<br>\n
<<siteMap 가 . sliders>>\n<<siteMap 나 . openSliders>>\n<<siteMap 다 . openSliders>>\n<<siteMap 라 . openSliders>>\n<<siteMap 마 . openSliders>>\n<<siteMap 바 . openSliders>>\n<<siteMap 사 . openSliders>>\n<<siteMap 아 . openSliders>>\n<<siteMap 자 . openSliders>>\n<<siteMap 차 . openSliders>>\n<<siteMap 카 . openSliders>>\n<<siteMap 타 . openSliders>>\n<<siteMap 파 . openSliders>>\n<<siteMap 하 . openSliders>>\n<<siteMap 기타 . openSliders>>\n<<siteMap C . openSliders>>\n<<siteMap D . openSliders>>\n<<siteMap E . openSliders>>\n<<siteMap H . openSliders>>\n<<siteMap M . openSliders>>
!! OS ────────────────\n!!!#. 우분투 (Ubuntu)\n우분투(Ubuntu)는 데비안 GNU/리눅스(Debian GNU/Linux)에 기초한 컴퓨터 운영 체제로서 고유한 데스크탑 환경인 유니티를 사용하는 리눅스 배포판이다. 영국에 기반을 둔 회사인 캐노니컬의 지원을 받는다. 일반적으로 여섯 달마다 새 판이 하나씩 나오는데 이것은 GNOME의 새 판이 나오는 시기와 비슷하다. 데비안 GNU/리눅스와 견주어 볼 때 사용자 편의성에 많은 초점을 맞추고 있다.\n \n우분투는 그 이름을 남아프리카 공화국의 건국 이념인 우분투 정신에서 가져왔다. 남아프리카 성공회 대주교인 데스몬드 투투 대주교에 의하면 우분투에는 옮겨 쓰기에는 어려울 정도로 다양한 뜻이 있다고 한다. 일반적으로 우분투 운영 체제 사용자들 사이에서, 우분투는 반투어로 "네가 있으니 내가 있다"라는 의미로 사용되고 있으며, 이 문서에선 "다른 사람을 위한 인간애"(영어로는 "humanity towards others")라고 번역되어 있다.\n \n2012년 기준으로 온라인 설문 조사 결과에 따르면, 우분투는 개인용 데스크톱과 노트북에서 가장 인기있는 리눅스 배포판이다.\n\n\n!! 프로그램 ────────────\n!!!#. 루비 (Ruby)\n; 간결함과 생산성을 강조한 동적인 오픈 소스 프로그래핑 언어\n\n!!!#. 에스큐엘라이트 (SQLite) \n; MySQL나 PostgreSQL와 같은 데이터베이스 관리 시스템이지만, 서버가 아니라 응용 프로그램에 넣어 사용하는 비교적 가벼운 데이터베이스이다. 영어권에서는 '에스큐엘라이트'또는 '시퀄라이트'라고 읽는다.\n\n일반적인 RDBMS에 비해 대규모 작업에는 적합하지 않지만, 중소 규모라면 속도에 손색이 없다. 또 API는 단순히 라이브러리를 호출하는 것만 있으며, 데이터를 저장하는 데 하나의 파일만을 사용하는 것이 특징이다. 버전 3.3.8에서는 풀텍스트 검색 기능을 가진 FTS1 모듈이 지원된다. 컬럼을 삭제하거나 변경하는 것 등이 제한된다.\n \n구글 안드로이드 운영 체제에 기본 탑재된 데이터베이스이기도 하다.\n\n
폴라니가 신자유주의의 핵심 공리인 자기조정적 시장에 대한 통렬한 비판자라는 점에서 그의 사상을 음미해 볼 충분한 가치가 있다.\n\n폴라니는 오늘날 신자유주의에 해당하는 자기조정적 시장이라는 신화를 논박하는 데 일생을 바쳤다. 그는 오스트리아로 망명해 <오스트리아 국민경제>의 편집자로 있는 동안 신자유주의의 대부로 알려진 프리드리히 폰 하이에크와 그의 스승 루드비히 폰 미제스(한계효용혁명의 주창자 중 한 명)의 자유 시장 논리를 반박하는 데 주력했다.\n
; 마케팅의 목적은 소비자들의 충족되지 못한 욕구를 발견하고, 그것을 충족시킬 방법을 마련하여 판매를 불필요하게 하는 것\n\n대부분의 경영자들이 기업은 무엇인가에 대한 대답으로 '영리를 추구하는 조직'이라고 하는 반면 피터 드러커는 '영리를 추구한다'는 말이 '기업'에 대해 정의하는 데 적합하지 않으며, 기업의 존재 이유는 '고객'이며 목적은 '시장'이라고 주장했다.\n\n피터 드러커의 경영관으로 기업의 경영의 중심에 고객을 두고, 근로자를 비용이 아닌 자산으로 인식시키려 했다는 점이 피터 드러커가 현대 경영학에 남긴 가장 큰 업적으로 평가 받고 있다.
!!!#. 게임QA 의 주요 업무 - 테스트, 피드백, 매니지먼트\n<html><IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/gameqa_38.jpg" width=400></html>\n\n출처 ; http://gameqa.tistory.com/notice/58 - GameQA 와 관련한 정보와 커뮤니티 공간을 지향\n\n현직에 종사하고 있는 업계 관계자에게\n게임QA 의 업무에 대해 이야기를 해보라고 한다면,\n아마도 이야기 하는 사람마다 다 다른 대답이 나올 것입니다.\n\n왜냐하면, 게임QA 가 어떤일을 할 수 있는지, 여러포지션에서 다양하게 경험해본 사람이 거의 없고,\n임원급 경영진 중에서 게임QA 출신이 거의 없기 때문에, 어떤 역할을 맡길 것인지에 대한 비전을 제시하기도 어렵습니다.\n\n저는 다행히 운이 좋아서, 여러회사에서 다양한 포지션의 QA업무를 경험할 기회가 있었고,\n그래서 이제는 게임QA가 어떤 업무를 하는 직군인지 대략이나마 이야기를 할 수 있게 되었습니다.\n※ 운영, 프로그램, 기획, 독립부서 등 QA가 포지셔닝 할 수 있는 조직은 거의 다 경험을 해본것 같습니다.\n\n결론을 말하자면 게임QA 업무는 테스트 + 피드백 + 매니지먼트 이렇게 정리할 수 있겠습니다.\n\n게임QA 의 주요 업무 중 가장 큰 비중을 차지하고, 또 근간이 되는 부분은 테스트 입니다.\n테스트를 해보지 않고서는 그 게임이 어떤 상태인지를 이야기 할수가 없으니까요.\n테스트는 다시 기본테스트, 기능테스트, 풀테스트, 하드웨어테스트 등등... 다시 세부적으로 나눌 수 있는데\n 각각에 대해서는 다음에 따로 정리를 할 예정입니다.\n\n테스트 이외에 최근에 많이 요구되는 부분은 피드백 입니다.\nNCsoft 에서 Fun QA 를 활용하여 아이온의 성공을 더욱 공고히 한 사실이 알려지면서\n다른 회사에서도 게임안밖에 대한 다양한 자료를 QA에 요구하는 추세로 변하고 있습니다.\n외부조사로는 시장조사, 타게임분석, FGT 등이 있고, 내부조사로는 게임로그 분석 등이 여기에 해당합니다.\n\n매니지먼트는 생소하게 느끼시는 분들도 있으실텐데\n게임QA 중에서도 개발QA 쪽 업무는 패치와 버전관리를 기반으로 하고 있어서\n기획서검토, 패치노트작성, SVN관리, 패치, 기능검수 등과 같은 직관적으로 이해되는 업무에서 부터\n일정관리, PMS관리, 개발자산관리 등 다른 지원부서의 업무등도 상황에 따라 포함될 수 있습니다.\n\n!!!#. SWQA(Software quality assurance) 와 GameQA(Quality Assurance) 의 다른점\n1. 목표가 다릅니다.\nSW 의 목표는 원하는 기능을 구현하는 것이고, Game 의 목표는 재미를 주는 것입니다.\n- SWQA 의 최고 목표는 원하는 기능의 결함이 없도록 하는 것이지만,\n- GameQA 의 최고 목표는 원하는 기능의 결함 여부보다 우선하여, 게임이 재미있게 만들어 지도록 하는 것입니다.\n\n2. 기획의 시기가 다릅니다.\n- SWQA 는 기획이 미리 정해지고, \n- GameQA 는 만들면서 기획이 정해집니다.\n\n3. 업데이트 주기가 다릅니다.\n- SWQA 는 업데이트 주기가 길지만, \n- GameQA 는 상시 서비스 상태로 수시 업데이트 합니다. \n
대한민국 왕초보탈출 시원스쿨(www.SiwonSchool.com)\n이시원 강사\n&_nbsp;\n \n\n++++!!![>왕초보탈출 3탄]>\n''1강 과거연습과 긍정 / 부정 답변''\n+++[2014.09.04.(목)]\n1. 영어의 기본 골격 ; 누가 어떻다.\n\n2. 시제\n what I say - 내가 말하는 것\n I said - 내가 말했던 것\n I've said - 내가 말해 왔던 것/ 내가 말했던 적 있는 것\n I've been saying - 내가 말해 왔던 것\n I will say - 내가 말할 것\n I am saying - 내가 말하는 중인 것\n\n3. Do you know ? (넌 아니 ?) \nDo you understand what I say ?\n ──> I understand what you say.\n ──> I don't understand what you say.\n\n4. 과거형 연습\nDid you understand? ──> I understood./ I didn't understand.\n===\n\n''2강 과거와 현재완료''\n+++[2014.09.17.(수) ~ 09.22.(월)]\n1. Have you worked ? - 너는 일했었니 ? / 너는 일해왔니 ? / 너는 일했던 적 있니 ? )\n ──>I have worked./ I haven't worked.\n\n2. Did you have ? - 드셨습니까?\n I had.\n I didn't have. \n\nHave you had ? (dinner/ morning coffer/ breakfast)\n I have had. (dinner/ morning coffer/ breakfast)\n I haven't had. (dinner/ morning coffer/ breakfast) \n===\n\n''3강 현재완료와 현재완료진행''\n+++[2014.09.23.(화) ~ 09.25.(목)]\n1. have worked - 계속 일해왔다/ 일했다/ 일한적 있다.\n have been working - 계속 일해왔다/ 일했다/ (일한적 있다라는 표현은 되지 않음)\n===\n\n''4강 현재형/완료형/미래형/과거형을 연습''\n 2014.09.26.(금) ~ 09.29.(월) ... Have you ~ed ? / Have you been ~ing? Do you ? / Are you ~ing ? / Can you ~ ?\n''5강 형용사절을 형용사구로 바꾸기''\n+++[2014.09.30.(월) ~ 10.14.(화) ... There are millions of people watching this show right now in the world. ]\n1. people - 사람들\n people (that are) waiting - 기다리는 사람들\n people waiting outside - 바깥에서 기다리는 사람들\n\n2. there is / there are - 있다.\n there are people waiting outside - 바깥에서 기다리는 사람들이 있다.\n\n3. I have a friend. - 난 친구가 있어요.\n I have a friend studying English. - 저는 영어를 공부하는 친구가 있어요.\n===\n\n''6강 형용사절을 형용사구로 바꾸기''\n+++[2014.10.15.(수) ~ 10.21.(화) ... I have apples that are sold here = I have apples sold here. (수동태 생략 형태) ]\n1. 앞 문장이 과거이기 때문에 뒤 문장이 자동으로 과거형이 되지 않는다 (뜻이 완전히 달라짐).\n There are many people asking questions. (질문을 하는 사람들)\n There are many people asked questions. (질문을 받는 사람들)\n\n2. I have apples that are sold here. - 나는 여기서 팔리는 사과를 가지고 있었다.\n ≒ I have apples sold here.\n\n3. There is light fixed on the ceilling. - 천장에 고정되어진 등이 있습니다.\n There is light hanging on the wall. - 벽에 매달려 있는 등불이 있습니다.\n There is a sign painted in red on the wall. - 빨간색으로 칠해진 사인이 벽에 있습니다.\n===\n\n''7강 영어문장늘이기 연습''\n+++[2014.10.22.(수) ~ 10.27.(월) ... to receive information about you that may arise, or be revealed]\n1. There were students waiting outside in -20℃ for at least 20 minutes.\n ; 학생들은 -20℃에서, 적어도 20분 동안 밖에서 기다리고 있다.\n\n2. 호주 이민 심사표\nDo you want your authorized recipient to receive the information about you that may arise, or be revealed, in the course of this application ?\n ; 당신은 이 신청과정에서 생겨날지도 모르고, 발설될지도 모르는 당신에 관한 정보를 허가된 수신자가 받기를 원하십니까?\nDo you want your friend to get your information that may arise?\n ; 당신은 당신의 친구가 생겨날지도 모르는 당신의 정보를 받기를 원하십니까?\n===\n\n''8강 분사구문( ~하기 때문에)''\n+++[2014.10.28.(화) ~ 10.31.(금) ... I couldn’t study because I have a lot of friends. - Having a lot of friends, I couldn’t study]\n1. ~ 때문에 ; Being ~ \nI can speak Engilsh because I'm from Canada. - 캐나다에서 왔기 때문에 난 영어를 할 수 있어요.\n ──>Being from Canada, I can speak Engilsh.\n\n2. ~ 할 수 있었기 때문에 ; Being able to ~\nBeing able to study English, I wanted to work there. - 영어 공부를 할 수 있었기 때문에, 난 거기서 일하길 원했어요.\n\n3. ~ 없었기 때문에 ; Not having ~\nNot given enough money, I couldn't study. - 충분한 돈이 주어지지 않았기 때문에 난 공부를 할 수 없었어요.\n===\n\n''9강 ~ 하더라(~카더라)''\n+++[ 2014.11.05.(수) ~ 11.07.(금) ... He said (that) / He is saying (that) ]\n1. ~ 한 것 같아, ~ 라고 생각해 ; I think (that)\n I think he is busy. - 그는 바쁜 것 같아.\n\n2. 나는 생각했어/ 난 그럴줄 알았어 ; I thought.\n I thought he has a lot of money. - 난 그가 돈이 많은 줄 알았어.\n\n3. he told me that he was busy - 시간 없다 그러더라고\n===\n\n''10강 ~ 해 왔다/한 적이 있다/계속했다(과거 완료형의 해석 ≒ 과거의 과거)''\n+++[ 2014.11.20.(목) ~ 11.26.(수) ... I was very tired because I had been working all day ]\n1. I have studied = I have been studying. (step2 내용중)\n He told me that he loved me. - 그가 나를 사랑한다고 그러더라고\n===\n\n''11강 ~ 그러더라고 / 해석 예문(문장 구조 강조) !!''\n+++[ 2014.12.30.(화) He said that ~ ]\n#. 수동태 - get 사용이 가능\ncover ; 보상하다\nbe(get) covered ; 보상 받다 (수동태 현재형) \nhad gotten covered ; 보상 받았다 (수동태 과거 완료형)\n===\n\n''12강 ~ 간접의문문 ''\n+++[ 2015.01.09.(금) I don’t know how coffee was made ]\n1. 무슨 신발이 만들어 지는지 - what shoes are made\n2. which approach ; 어떤 방법(접근법)\n Do you know which approach doctors take? - 너는 아니? 어떤 방법을 의사들이 선택하는지?\n3. 방법\n I don’t know how coffee was made. - 나는 커피가 어떻게 만들어 졌는지 모르겠어.\n===\n\n''13강 ~ be adjective(형용사) of ''\n+++[ 2015.01.28.(수) I was proud of my son. ]\n1. 나 대신에 for me / 재 대신해서 for him / 우리를 대신해서 for us\n 나 커피 좀 갖다 줄래 ? - Could you go get some coffee for me?\n\n2. 난 부정적이야 - I am skepticla./ 난 ~에 대해 부정적이야 - I am skepticla of ~.\n 나는 자랑스러워 - I'm proud./ 내가 여기 있다는게 자랑스러워 - I'm proud of the fact that I'm here.\n\n3. 내가 여기에 있다. - I'm here.\n 내가 여기에 있다는게 - that I'm here.\n 내가 여기에 있다는 사실이 - the face that I'm here.\n===\n\n''14강 to → ~ that you are studying등 명사절 활용연습 (주어가 있는 경우)''\n+++[ 2015.03.09.(월) ]\n1. 너(는) - you\n 너야(입니다) - is you\n \n2. 쉽다 - It is easy.\n 쉬워질거야 - It will be easy/ It's going to be easy/ It's gonna be easy.\n\n3. 명사절\nIt's (not) late to study tomorrow. - 내일 공부하기에 늦었다(늦지않았다).\nIt's (not) late that we study tomorrow. - 내일 우리가 공부하기에 늦었다(늦지않았다). ; 주어가 있는 경우\n\n4. What make me + 동사 또는 형용사 - 나를 ~ 하게 하는 것\nWhat makes me happy - 나를 행복하게 하는 것\nWhat made me happy was that you were here. - 나를 행복하게 했던 것은 너가 여기에 있었다는 거였어.\n\n5. ~ 거야 - is that ~\n ~ 거였어 - was that ~ \n===\n\n''15강 → What + 명사절 ( What ~+ is that~)''\n++++[ 2015.03.19.(목) ]\n1. What I liked about you - 내가 너에 대해서 마음에 들었던 점은 \n What I liked about this car - 내가 이 차에서 마음에 들었던 점은\n What I liked about what he had said - 내가 그가 이야기 했던 것 중에 마음에 들었던 것은\n\n2. What I didn't like aubot you ( What + 주어 + 동사 + about ~)\n What I can't see ~\n What I can't understand ~\n What I couldn't say ~\n\n3. What (should) concerns us foremost ~ * (What + 동사 + 목적어 ~)\n Concern = makes me(us) worry\nWhat concerns us (foremost) @@color(#04f): is not that @@ Amaze.com managers believe that they have a right to set up the price for the book.\n It @@color(#04f): is that @@ 아마존's managers believe that they have power to enfore their will by cutting off the access to the books.\n===\n\n\n@ <============ 3강 추가 부분===\n<왕초보탈출 3탄>\n\n+++!!![>왕초보탈출 2탄]>\n\n''1강 1탄 문법 총정리 하기''\n\n''2강 ~ 4강 That 하나로 문장을 다양하게''\n+++[2014.07.]\n1. That을 앞두면, '~한다'를 '~하는'으로 변형\n / that 앞에 명사에는 'the'를 붙인다.\n / 내가 타는 버스 The bus that I take\n\n2. He/ She/ It에 붙던 'has'는 앞에 does/ dones not(doesn't)이 오면 'have'로 바뀐다 ~\n\n3. 나는 ~하려고 합니다. I'm trying to do ~\n 사귀다 go out with\n===\n\n''12강 Have로 문장의 깊이를 더하기''\n+++[2014.07.15.]\n1. 기본 구조\n ㆍ work -> am working ; be 동사 뒤에 동사가 오려면 동사 ~ing 형태로 와야 함\n ㆍ worked -> was working\n ㆍ have worked -> have been working\n\n2. 장점\n / have worked -> have been working\n / have been busy\n\n3. 주의 ; 95 % 동일 + 5 % 다른 점\n / 완료형 ; ① ~ 해왔다. ② ~ 한 적있다. ③ ~ 계속 했다. ≒ 과거의 뜻으로 사용\n -> 현재완료 진행형 have been ~ing (계속 ~ 해왔다)으로 ②을 표현할 수 없다.\n===\n\n''13강 Something that과 같은 표현 what 연습하기''\n+++[2014.07.17.]\n1. 완료형과 that을 함께 사용\n\n2. Something that ~ ; 무언가, ~하는 것 (사물) 을 줄여서 what으로 !\n Someone that ~ ; 누군가 (사람)\n\n3. There is someone that ~ ; ~ 누군가가 있다.\n===\n\n'' 14강 ~ 15강 주체가 어떤 행동이 되어짐을 나타내는 '수동태' '' \n+++[2014.07.18. ~ 07.19.]\n14.1. Finish : 끝내다 -> Is finished : 끝나다.\n is finishing (끝낸다) -> is finished (끝납니다)\n\n14.2. 수동태의 시제\n 현재 is made -> 만들어진다.\n 과거 was made -> 만들어졌다.\n 미래 will be made -> 만들어질 것이다.\n cf. will make -> 만들거다.\n\n15.1. 구조\n| make | be made | 조동사 + ~ |\n| | is made | will be made |\n| | are made | can be made |\n| | am made | should be made |\n| 수동태의 진행형 | is being made | |\n\n15.2. 표현\n is made - 만들어 지다.\n was made - 만들어 졌다.\n that wad made - 만들어 졌던.\n\n15.3. 수동태에 따라오는 전치사\n by - 에 의해서 ; 경로\n for - 로, (위해서) ; 이유\n form - 로부터 \n\n15.4. * be given - 주어지다.\nI am given with the money. - 나에게 돈이 주어졌다.\n주어집니다 - is given\n주어지는 - that is given\n주어졌던 - that was given. 예) 주어졌던 시간 - the time that was given\n주어질 - that will be given\n===\n\n'' 16강 일상생활 표현들을 배워보자! ''\n+++[2014.07.24.]\n-. 일상생활에서 많이 쓰는 표현\n do you want to ~ ? - ~ 래요? (요청)\n Could you ~ - ~ 래요? ~ 해둘래요 ? (부탁 등 공손하게 표현)\n\n would you like to ~ ? - ~ 래요?, ~ 하고 싶니? \n \n get - 얻다, 받다/ 오다/ 도착하다/ 가져오다\n===\n\n'' 17강 마법과도 같은 that (상황에 따라 who, where, which) '' \n+++[2014.07.30.]\n1. That 상항에 따라 : who(사람), where(장소), which(사물)로 바뀜\n\n2. 나는 있다 : I am in\n 내가 있는 : where I am in\n 내가 있는 방 : the room where I am in\n 내가 있는 방 알아 ? : Do you know the room where I am in ?\n\n3. that : 사람 (who + 동사), (whom + 주어)\n The people who are studiyng : 공부를 하는 사람들\n The people whom I have met : 내가 만났던 사람들 ('~에게'라는 표현에 적절) ≒ 회화에 who 사용\n===\n\n''18강 과거보다 더 이전의 일을 말할 때는? 과거완료 시제를 사용한다 ! ''\n+++[2014.08.01.]\n1. 과거에 있었던 일을 설명할 때 ; had worked - 과거 완료 \n cf. have worked - 현재완료\n -> 현재완료와 과거완료는 주로 that, who와 뭉쳐서 쓰임\n\n have studied 의 반대는 have not studied\n had studied의 반대는 had not studied)\n\n2. 관계 대명사 whose (= who has/ who - whose - whom)\n the sister who has a bus - 버스를 가진 여동생\n the sister whose a bus is red - 빨간 버스를 가진 여동생\n\n3. I met the person who had been trained in 안기부 - 나는 안기부에서 훈련을 받았던 사람을 만났다.\n I met the person who had trained in 안기부 - 나는 안기부에서 훈련을 시켰던 사람들을 만났다.\n===\n\n''19강 주어와 동사 말하는 연습 + 시제에 맞게 대답하기''\n+++[2014.08.05.]\n1. Are you ~ ? ⇒ I am/ I am not (긍정과 부정으로 대답)\n Is that my car ? ⇒ That is your car./ That is not your car.\n\n Do you ~ ? ⇒ I/ I don't\n Did you ~ ? ⇒ I/ I didn't\n\n Did you have breakfast ?\n I had breakfast.\n I didn't have breakfast.\n\n Was it? ⇒ It was/ It wat not\n\n2. 현재 완료형\n Have you ~ ? ⇒ I have/ I have not (haven't)\n\n3. I'm afraid(= worried) that 주어 + 동사 : 나는 ~ 할 까봐 걱정돼\n I'm afraid that English might be hard. - 나는 영어가 어려울 까봐 걱정돼.\n\n 내가 사랑하는 - whom I love\n 언제부터 - since when (since ~ 이래로)\n===\n\n''20강 ~ 21강 누구의 말을 전달할 때 (~하더라고요, 그러던데요, 그러더라고요) 의 that (1)''\n+++[2014.08.06. ~ 08.08.]\n20.1. He said that (쎄 뎃) 주어 + 동사 he was busy.\n\n Said that "... " - 그대로 전달\n He said that Korea was beautiful. (= He said that "Korea is beautiful".)\n\n He said that the school (that he was in) was fine.\n\n20.2. be good at + 명사 - ~을 잘하다\n\n want + 명사\n want to 를 줄여서 winna ⇒ winna go\n \n go (간다) - went (갔다) - have been (간 적 있다) cf. have gone - 완전히 가버렸다.\n come - came - have been\n\n21.1. 서울에는 남산이 있다 (남산을 가지고 있다.)\n 내가 살고 있는 집은 방이 3개가 있다 (방을 3개 가지고 있다.)\n\nTold me (톨 미) ~ 그래잖아\nYou told me that you were busy.\nYou told me that you would go to school. (~ 할거라 그랬잖아)\n\nI'm not sure ~ 할지 모르겠어\nI'm not sure if ~ 어떻게 할지 안 할지 모르겠어.\n\nI'm not sure if this is right or not. 이게 맞는지 아닌지 모르겠어.\nI'm not sure if this is good enough. 이거 충분히 좋을지 모르겠어.\n===\n\n''22강 문장에서 that is는 생략가능 하다!''\n+++[2014.08.13.]\n1. The car (that is) fast ⇒ the fast car (∵ that is를 생략하면서 단어 순서가 바뀜)\n The TV that was fixed. ⇒ The fixed TV\n\n/ the book that wat sold in 교보 ⇒ the book, sold in 교보 - 교보에서 팔렸던 책\n The phone that was made in China ⇒ The phone, maid in China\n\n2. get 으로 사람, 물건을 잡는다는 표현이 가능\n 재를 잡아주세요 - get him\n 재를 올려 보내 - get him up\n 가방 여기로 가지고 와 - get my bag here\n 내 차 좀 빼내주세요/ 들여보내주세요 - get my car out/ in\n\n/ get + 과거형 ⇒ '이렇게 해놔'\n 이거 청소해놔 - get this room cleaned\n 창문 닫으세요 - get the window closed\n Could you get this down ? - 이거 내려주실 수 있어요?\n\n3. have도 get과 비슷한 의미를 지닌다.\n I had your room cleaned - 내가 니 방 청소해줬어\n===\n\n''23강 ~ 24강 총정리 ''\n+++[2014.08.14. ~ 08.20.]\n1. 사물일 때 which\n that is good = which is good\n 나는 다른 무언가가 필요해 - I need something that/ which is different\n\n2. 여성용 is for women\n 이거 여성용이에요 - this is for women\n\n3. could have pp ~ 할 수 있었는데 ; 만날 수 있었는데 - could have met\n should have pp ~ 했었어야 했는데 ; 너 여기 왔었어야 해 - you should have been here\n===\n\n''보너스강좌 ''\n++++[2014.08.21. ~ 08.29.]\n+++!!!![#. 보너스강좌 1강 ~ 하게 하다. (I make you(목적격) ~)]\n1.1. 나는 ~ 하기를 원해 (I want to ~ )\n I want to go (나는 가기를 원해) - 목적어가 주어가 대한 경우\n I want you to go (네가 가기를 원해) - 주어와 목적절의 주체가 틀린 경우\n\n1.2. 나는 너를 ~ 하게 만든다. = ~ 하게 하다 (I make you(목적격) ~ )\n I make you study - 나는 너를 공부하게 만든다. = 나는 너를 공부하게 해.\n You made me study - 너는 나를 공부하게 만들었다.\n\nYou want me to be happy.\nYou make me happy. (be happy가 행복하다지만, make가 올 때는 to be가 생략)\n===\n+++!!!![#. 보너스강좌 2강 ~ 인 것 같아, ~인 것 같니?, ~인 것 같지 않니? (I think ~)]\n2.1. ~하는 것 같아 ≒ ~라고 생각해 - I think ~\n I think, I am hungry (나는 배고픈 거 같아.) \n\n2.2. ~ 너는 ~인 것 같니? ≒ 너는 ~라고 생각하니? - Do you think ~\n Do you think, I study well? (너는 내가 공부를 잘 하는 거 같니?)\n\ncf. I think, this was good - 이것은 맛있었던 것 같다(과거).\n===\n+++!!!![#. 보너스강좌 3강 ~ 하면서 ~ 하다.(, ~ing ~ )]\n3.1. '~하면서'라고 표현하고 싶다면, 동사를 동명사로 만들어 주라. (, ~ing ~ )\n I am working, listening to the music (나는 음악을 들어면서 일하는 중이다.)\n ⇒ 현재/ 과거/ 미래의 시제는 (콤마) 앞의 문장으로 결정 \n\n3.2. 순서를 바꿔 말해도 같은 뜻이 된다.\n I will listen to the music, sitting by the window. = Sitting by the window, I will listen to the music.\n===\n++++!!!![#. 보너스강좌 4강 (3강의 연장) ~ 하고 나서(After ~ing ~)/ ~ 하기 전에(Before ~ing ~ )]\nAfter finishing my homework, I can go home. (내 숙제를 끝내고 나서, 난 집에 갈 수 있다.)\nBefore watching TV, you have to finish your homework. (넌 TV를 보기 전에, 숙제를 끝내야 해)\n\ncf. After ~, Before ~ 문장은 앞,뒤로 순서를 바꿀 수 있고, 콤마 뒤의 문장에는 어떤 시제도 올 수 있다(과거, 현재, 미래).\n===\n++++!!!![#. 보너스강좌 5강강의 연장) that을 생략]\n5.1. that 생략 가능\n A book that I like ⇒ A book I like\n People that I meet ⇒ People I meet\n\n5.2. that 생략이 불가능\n 1. bus (that) I take \n 2. bus that goes to Sam-sung dong is 69. - 불가능 ; that을 생략할 경우 바로 동사로 이어지는 문장이 되기 때문에 말이 되지 않음\n\n5.3. that + be 동사가 한꺼번에 왔을 때 that + be를 같이 생략 !\n Bus that is going to Sam-sund dong ⇒ Bus going to Sam-sung dong (삼성동으로 가는 버스)\n People that are making money ⇒ People making money (돈을 버는 사람들)\n===\n=== \n===\n<왕초보탈출 2탄>
CSS (Cascading Style Sheets)는 documents가 사용자에게 어떻게 보여질가를 기술하는 언어이다.\n\n참고 사이트\n http://www.homejjang.com/07/how_to.php\n http://blog.wincomi.com/175\n http://coursesweb.net/css/\n\n++++!!!![#. CSS 사용법 ; HTML문서에 CSS를 사용하는 3가지 방법]>\n+++!!!![1. 외부 스타일 시트(External Style Sheet)]\ncss라는 확장자를 가진 스타일 시트 파일을 만들고 이 파일을 HTML 문서에 연결하여 사용하는 방법\n\n<head>\n <link rel="stylesheet" type="text/css" href="mystyle.css">\n</head>\n\n이 방법의 장점은 홈페이지 전체의 스타일을 일관성있게 유지하면서 변경시에도 일괄적으로 변경되므로 홈페이지 제작의 효율성을 극대화\n반면 외부 스타일 시트 파일을 계속적으로 관리해주면서 HTML 문서를 만들어 나가야 하기에 불편한 경우가 있습니다. 그리고 외부 스타일 시트 파일이 지나치게 복잡해지면 곤란하므로 css파일을 관리하는 노하우가 필요.\n===\n+++!!!![2.내부 스타일 시트(Internal Style Sheet)]\nHTML문서내에서 <head>와 </head>사이에 스타일을 정의하는 방법\n{{{\n<head>\n <style type="text/css">\n <!--\n body {font-size:9pt;}\n //-->\n </style>\n</head>\n}}}\nHTML문서마다 스타일을 매번 지정해 주어야 하지만, 한 문서에만 해당되는 스타일을 지정할때 사용\n===\n+++!!!![3.HTML태그내에 스타일 지정(Inline Styles)]\n위의 방법들에 비해서 적용범위가 더욱 좁아진 형태, 스타일을 적용하고 싶은 HTML태그안에서 정의하는 방법.\n\n<p style="color:gray;">이 문단의 색상은 회색으로 지정됩니다.</p>\n\n내용과 스타일의 분리 그리고 이로 인한 스타일 일괄변경의 효율성 측면으로 볼때는 바람직하지 않는 방법\n그러나 위의 소스에서도 보듯이 직관적으로 사용이 가능하다는 장점이 있음\n===\n===\n\n++++!!!![#. CSS 문법]\nCSS 구문은 '''선택자(selector)와 선언''으로 구성되며, 선언은 __속성(property)과 값(value)__으로 구성\n\n#. 선택자는 HTML 태그 중 하나로 <p>태그를 선택자로 사용한 예\n-. 속성과 속성값은 계속적으로 추가가 가능합니다. 이때 ''; 기호를 사용''하여 추가\n p {color:red ; width:200} \n\n-. 선택자 역시도 추가할 수 있습니다. 이때 '', 기호를 사용''하여 추가\n p, td {color:red ; width:200}\n → 문단(p)뿐 아니라 테이블의 셀(td)의 스타일도 {}안의 내용처럼 지정하라는 의미.\n++++!!!![▷ 선택자(Selector)의 종류]>\n선택자(Selector)가 있어야 선언된 CSS가 어디에 적용될지를 결정할 수 있기 때문. 특히 CSS는 상속의 개념을 가짐.\n+++!!!![공통 선택자(Universal Selector)]\n*로 표현되는 선택자입니다\n * { color: gray; }\n → 모든 element 에 color: gray; 라는 스타일을 지정\n===\n+++!!!![타입 선택자(Type Selector)]\np, div, span, table, td, form...등과 같은 HTML 태그를 선택하는 선택자\n p { color: gray; }\n → P element에 color: gray; 라는 스타일을 지정\n===\n+++!!!![ID 선택자(ID Selector)]\n# 이라는 지시어를 사용하면서 element의 아이디값을 지정(특정 element에만 스타일을 지정)\n #gray_text { color: gray; }\n → id 값이 gray_text 인 element에만 스타일이 적용\n===\n+++!!!![Class 선택자(Class Selector)]\n.이라는 지시어를 사용하면서 element의 클래스값을 지정(ID 선택자와 차이점이라면 클래스의 경우는 한 문서에 동일한 이름의 클래스가 여러개 위치해도 괜찮으나 아이디는 유일해야 한다)\n .gray_text { color: gray; }\n → 클래스 값이 gray_text 인 element에만 스타일이 적용\n===\n===\n홈페이지 전체적인 스타일을 일관성있게 지정하기 위해서는 클래스(class)의 사용이 필수적. 실무에서도 클래스(class)의 사용은 빈번하게 사용\n{{{\n<style type="text/css">\n<!--\n.red {color:red}\n//-->\n</style>\n\n<h3 class="red">소제목에도 red 클래스를 지정합니다.</h3>\n<p class="red">red라는 이름의 클래스가 지정된 문단입니다.</p>\n}}}\n===\n\n+++!!!![#. block-level과 inline-level]\nHTML element 를 크게 2가지로 구분해보면 head element 처럼 화면에 표시되지 않은 element가 있고 div, p, table...과 같은 element 처럼 화면에 표시되는 element로 나눌 수 있다.\n\n● 화면에 표시되지 않은 element ; <head> element 내에서 써야 하는 style , link , meta \n● 화면에 표시되는 element ; <body> element 내에서 써야 하는 div , p , a , span 등의 element\n ○ block-level elements ; 한 라인에 하나만 위치, 즉 한 줄에 이어서 표시되지 않고 다음 줄에 표시\n p, h1~h6, ul, ol, pre, dl, div, noscript, blockquote, form, hr, table, fieldset, address\n ○ inline-level elements ; 한 라인에 2개 이상, 다른 인라인 엘리먼트와 가튼 줄에 표시, 즉 한 줄에 이어서 표시\n #PCDATA, tt, i, b, big, small, em, strong, dfn, code, samp, kbd, var, cite, abbr, acronym, a, img, object, br, script, map, q, sub, sup, span, bdo, input, select, textarea, label, button \n\n''Div / Span'' (style container)\n<div> 와 <span> 은 필요한 element들을 속에 담아 하나의 group로 묶는 element이다.\n단, 아무 element나 포함시킬수 있는 건 아니다.\nBlock-level element 는 inline-level element를 포함시킬수 있지만 반대의 경우는 금지된다.\n\n1) Div\ndiv는 block-level element들을 grouping 하는 용도로 사용하는 element이다. \ndiv는 다른 block-level element와는 달리 margin과 같은 초기값이 전혀 없다는 것이다.\nDTD에서는 div속에 body 를 제외한 화면에 표시되는 모든 element들을 담을 수 있도록 정의한다.\n\n2) Span\nspan도 div와 같은 맥락이나 다른점이 있다면 <span>속에 넣을 수 있는 element들이 inline-level로 제한된다.\nspan의 용도는 inline-level element 들의 grouping과 style 지정이다.\n===\n\n++++!!!![#. 텍스트에 적용하는 CSS 속성]\n텍스트의 스타일을 지정하기 위한 속성들\n| 속성 | 속성값 | 설명 |\n| color |red, #FF0000 | 텍스트 색상 |\n| direction |ltr, rtl | 텍스트 방향 |\n| line-height |150% | 줄 간격 |\n| letter-spacing |-0.1px | 글자 간격 |\n| text-align |left, right, center, justify | 텍스트 수평 정렬 |\n| vertical-align|top, middle, bottom | 텍스트 수직 정렬 |\n| text-decoration |none, underline, overline, line-through, blink | 텍스트 장식 |\n| text-indent |20px | 들여쓰기 |\n| text-transform |none, capitalize, uppercase, lowercase | 대소문자 지정 |\n| word-spacing |1px | 단어 간격 |\n+++[CSS 텍스트 color]\n-. color 속성을 이용하여 텍스트의 색상을 지정\n <p style="color:red">이 문단은 붉은색으로 지정됩니다.</p>\n\n-. 하이퍼 링크의 색상을 지정할 수도 있습니다.\n <style type="text/css">\n a {color:red}\n a:hover {color:green}\n </style>\n\n <p><a href="http://www.hoemjjang.com">홈짱닷컴</a>은 홈페이지 제작을 위한 가이드 역할을 합니다.</p>\n===\n\n+++[CSS 텍스트 direction]\n속성값은 ltr(left to right), rtl(right to left) 두가지 중 하나를 사용\n <p style="direction: ltr">direction 속성값을 ltr로 지정한 문단</p>\n <p style="direction: rtl">direction 속성값을 rtl로 지정한 문단</p> \n===\n\n+++[CSS 텍스트 backgroud-color]\n <p style="background-color:yellow;">문단의 배경색을 yellow로 지정</p>\n <p>문단의 <span style="background-color:yellow;">일부분의</span> 배경색을 yellow로 지정</p>\n 테이블에도 배경색을 지정할 수 있음 ; <table> <tr> <td>\n===\n\n+++[CSS 텍스트 line-height]\n라인의 높이를 지정\n <p style="line-height: 10px; background-color:gray;">라인의 높이를 10픽셀로 지정</p>\n <p style="line-height: 30px; background-color:gray;">라인의 높이를 30픽셀로 지정</p>\n줄간격으로, 배경색을 지정하지 않는 경우 leight-height를 10픽셀로 지정하는건 별 의미가 없다.\n한글의 경우 line-height를 100% 이상으로 지정하여 줄사이의 간격을 좀 띄우는 편이 가독성에 좋다.(일반적으로 130%~160%정도)\n===\n\n+++[CSS 텍스트 letter-spacing]\nletter-spacing 속성은 글자 사이의 간격을 지정(한글의 경우, 이 간격을 조금 좁혀줄 수 있음)\n <p>일반적인 문장</p>\n <p style="letter-spacing:-2px">글자사이의 간격을 좁힌 문장</p>\n <p style="letter-spacing:3px;">글자사이의 간격을 넓힌 문장</p>\n===\n\n+++[CSS 텍스트 text-align]\n텍스트의 정렬을 지정\n <p style="text-align:left">왼쪽 정렬입니다.</p>\n <p style="text-align:right">오른쪽 정렬입니다.</p>\n <p style="text-align:center">가운데 정렬입니다.</p>\n <p style="text-align:justify; width:200">자동 줄바꿈시 오른쪽 경계선 부분이 정리 (이 부분은 자동 줄바꿈이 되어야 효과를 확인).</p>\n===\n\n+++[CSS 텍스트 text-decoration ; 하이퍼링크의 스타일 지정]\n <p style="text-decoration:underline">underline 속성값이 적용된 예문입니다.</p>\n <p style="text-decoration:overline">overline 속성값이 적용된 예문입니다.</p>\n <p style="text-decoration:line-through">line-through 속성값이 적용된 예문입니다.</p>\n <p style="text-decoration:blink">blink 속성값이 적용된 예문입니다.</p> (글자가 깜박이는 효과인데 파이어폭스(FireFox)에서 제대로 표시)\n\ntext-decoration 속성값을 ''하이퍼링크의 스타일을 지정''하는데 많이 사용.\n<style type="text/css">\n a:link { text-decoration: none;}\n a:visited { text-decoration: none;}\n a:active { text-decoration: none;}\n a:hover {text-decoration:underline;}\n</style>\n\n <a href="http://www.google.co.kr">구글</a>은 초보자를 위한 홈페이지 제작가이드.\n===\n\n+++[CSS 텍스트 text-indent ; 들여쓰기]\n문단의 첫번째 줄을 지정한 길이만큼 들여쓰기 지정.\n <p>일반적인 문단입니다.</p>\n <p style="text-indent:20px;">20픽셀 들여쓰기 한 문장입니다. 우리말의 경우 문단의 첫부분에서 들여쓰기를 하므로 text-indent 속성을 사용하면 좋습니다.</p> \n===\n\n+++[CSS 텍스트 word-spacing]\n단어 사이의 간격을 지정\n <p>일반적인 문단입니다.</p>\n <p style="word-spacing:10px;">word-spacing 속성값으로 10픽셀을 지정한 문단입니다. letter-spacing이 글자사이의 간격을 지정한다면, word-spacing은 단어 사이의 간격을 지정합니다.</p>\n===\n===\n\n++++!!!![#. CSS 배경 속성]\nHTML보다는 보다 다양한 방법으로 배경을 지정할 수 있음\n| 속성 | 속성값 | 설명 |\n| background-color|#FFFF80, Ivory | 배경색을 지정 |\n| background-image|url(bg.gif) | 배경이미지를 지정 |\n| background-repeat|repeat, repeat-x, repeat-y, no-repeat | 배경이미지의 반복 여부를 지정 |\n| background-position|top left, top center, top right, center left, center center, center right,<br> bottom left, bottom center, bottom right | 배경이미지의 위치를 지정 |\n| background-attachment|scroll, fixed | 배경이미지의 스크롤 여부를 지정 |\n+++[CSS 배경색 background-color]\n <div style="height:50px; background-color: ivory">ivory배경색이 지정된 예제</div> \n <div style="height:50px; background-color: #FFFFF0">ivory배경색이 지정된 예제</div> (√ Hex 코드값)\n===\n\n+++[CSS 배경색 background-image]\n250*250 크기의 레이어에 100*100 크기의 배경이미지를 적용했기에 배경이미지가 반복적으로 출력.\n <div style="width:250; height:250; background-image: url(bg.gif)"></div>\n===\n\n+++[CSS 배경색 background-repeat]\n배경이미지의 반복을 지정\nㆍ repeat : 배경이미지가 반복적으로 적용(기본값)\nㆍ repeat-x : 배경이미지가 가로방향으로만 반복적으로 적용\nㆍ repeat-y : 배경이미지가 세로방향으로만 반복적으로 적용\nㆍ no-repeat : 배경이미지가 반복적으로 적용되지 않고 한번만 적용\n <div style="width:250; height:250; background-image: url(bg.gif) ; background-repeat:repeat-x"></div>\n <div style="width:250; height:250; background-image: url(bg.gif) ; background-repeat:repeat-y"></div>\n===\n\n+++[CSS 배경색 background-position]\nbackground-repeat 속성값으로 no-repeat을 지정하면 배경이미지가 반복되지 않고, 문서의 왼쪽 상단에 위치\n <div style="width:250; height:250; background-image: url(bg.gif) ; background-repeat:no-repeat"></div>\n===\n\n+++[CSS 배경색 background-position]\nbackground-attachment 속성을 사용하면 문서가 스크롤될때 배경이미지의 스크롤여부를 지정\n(이 속성을 사용하지 않으면 기본적으로 문서와 함께 스크롤)\nbackground-attachment : fixed 로 지정하면 문서는 스크롤되지만 배경이미지는 스크롤 되지 않아서 배경위에 텍스트가 떠있는 느낌을 표현\n===\n===\n\n+++!!!![#. CSS 글꼴(Font) 스타일]\nㆍ ''font-family'' 속성을 이용하면 텍스트의 글꼴을 지정\n <p style="font-family: 돋움"> 돋움 글꼴로 지정된 텍스트입니다.</p> \n\nㆍ ''font-size'' 속성을 이용하면 텍스트의 크기를 지정\n <p style="font-size: 13px"> 13픽셀로 지정된 텍스트입니다.</p>\n| 절대단위 | 상대단위 |\n|pt (포인트, 1pt= 1/72 in) |% (기준이 되는 글꼴에 대한 퍼센트) |\n|in (인치, 1in = 25.4 mm) |em (기준이 되는 글꼴에 대한 문자의 높이) |\n|mm (밀리미터) | |\n|cm(센티미터) | |\n|pc (파이카, 1pc=12pt) | |\n|px (픽셀,1px=모니터의 1도트) | |\n1em은 100%와 동일하고 1em 이라는것은 브라우저의 기본 폰트의 100%크기 라는 의미\n폰트의 크기를 지정하지 않으면 12pt 정도의 크기로 화면에 출력 (0.75em으로 지정한 경우 이를 절대값으로 환산하면 9pt 정도의 크기로 출력)\n\nㆍ ''font-weight'' 속성을 이용하면 텍스트의 굵기를 지정\n <p style="font-weight: normal">일반적인 텍스트입니다.</p>\n <p style="font-weight: bold">bold를 지정한 텍스트입니다.</p>\n===\n\n++++!!!![#. Box Model - Margins, padding, borders]\n모든 엘리먼트는 높이(height)와 너비(width)를 가지는 사각형 박스이며, 마진(margin), 패딩(padding), 보더(boarder)로 구성\n\n구성 요소\nㆍ content : 순수한 콘텐츠\nㆍ padding : 콘텐츠와 경계선 사이의 여백\nㆍ border : 경계선\nㆍ margin : 경계선 밖에서 박스모델의 최종 경계선까지의 여백\n\n박스모델에서 엘리먼트의 전체 너비는\n margin-right + border-right + padding-right + width + padding-left + border-left + margin-left\n\n엘리먼트의 전체 높이는 \n margin-top + border-top + padding-top + height + padding-bottom + border-bottom + margin-bottom\n\n''◈ border-color, border-style, border-width''\n+++[border-color]\n- Syntax: border-color: value;\n\n- Values: \n • name - specify a color name (blue, green, ...).\n • RGB - specify a RGB value, like "rgb(10,20,250)".\n • Hex - A hex value (#0101ff , #a8feb8).\n\n- 각 요소별로 색 지정\n border-top-color - sets the color of the top border\n border-bottom-color - sets the color of the bottom border\n border-left-color - sets the color of the left border\n border-right-color - sets the color of the right border\n===\n\n+++[border-style]\n- Syntax: border-style: value;\n\n- Values: \n none, solid, dashed, dotted, double, groove, ridge, inset, outset\n\n- 각 요소별로 스타일 지정\n border-top-style - sets the style of the top border\n border-bottom-style - sets the style of the bottom border\n border-left-style - sets the style of the left border\n border-right-style - sets the style of the right border\n===\n\n+++[border-width]\n- Syntax: border-width: value;\n\n- Values: pixels 또는 3가지 정해진 타입( thin, medium, thick )\n\n- 각 요소별로 두께 지정\n border-top-width - sets the size of the top border\n border-bottom-width - sets the size of the bottom border\n border-left-width - sets the size of the left border\n border-right-width - sets the size of the right border\n===\n\n(화면상에 구분이 잘되게끔 border-width를 2픽셀로 지정)\n <p style="border-width:2px; border-color:gray; border-style:solid;">solid 스타일의 경계선</p>\n <p style="border-width:2px; border-color:gray; border-style:dotted;">dotted 스타일의 경계선</p>\n <p style="border-width:2px; border-color:gray; border-style:dashed;">dashed 스타일의 경계선</p>\n <p style="border-width:2px; border-color:gray; border-style:double;">double 스타일의 경계선</p> \n===\n\n+++!!!![#. CSS 리스트(list)]\nlist-style-type 속성을 사용, 리스트의 marker 스타일을 지정\n\nlist-style-type Syntax:\n list-style-type: disc | circle | square | decimal | decimal-leading-zero | lower-roman | upper-roman | lower-greek | lower-latin | upper-latin | armenian | georgian | lower-alpha | upper-alpha | none | inherit \nㆍ disc ; A closed circular bullet. \nㆍ circle ; An open circle. \nㆍ square ; A square. \nㆍ decimal ; Decimal numbers 1, 2, 3, 4, 5... \nㆍ decimal-leading-zero ; Decimal numbers padded by zeros 01, 02, 03, 04, ... \nㆍ lower-roman ; Lowercase roman numerals i, ii, iii, iv, v... \nㆍ upper-roman ; Uppercase roman numerals I, II, III, IV, V... \nㆍ lower-greek ; Lowercase classical Greek α, β, γ, ... \nㆍ lower-latin or lower-alpha ; Lowercase latin alphabet a, b, c, d, e... \nㆍ upper-latin or upper-alpha ; Uppercase latin alphabet A, B, C, D, E... \nㆍ georgian ; Traditional Georgian numbering an, ban, gan, ... \nㆍ armenian ; Traditional Armenian numbering \nㆍ none ; No list type used. \nㆍ inherit ; The element should have the same list-style-type setting as the parent. \n\n리스트의 marker에 이미지를 사용하는 방법\n<ul>\n <li style="list-style-image: url('marker.gif')">이미지를 사용한 리스트\n <li style="list-style-image: url('marker.gif')">이미지를 사용한 리스트\n</ul>\n===
@@color(#04f): ▣ jQuery란 @@; @ 2014-08-25\njQuery는 HTML 속 클라이언트 사이드 스크립트 언어를 단순화 하도록 설계된 브라우저 호환성이 있는 ''자바스크립트 라이브러리''.\n존 레식에 의해, 2006년 뉴욕 시 바캠프(Barcamp NYC)에서 공식으로 소개되었다. jQuery는 오늘날 가장 인기있는 자바스크립트 라이브러리 중 하나다. jQuery는 MIT 라이선스와 GNU 일반 공중 사용 허가서v2의 듀얼 라이선스를 가진 자유 오픈 소프트웨어이다.\n\n__장점__\n1. 자바스크립트의 코딩이 아주 쉽다. \n2. 가볍다. \n3. 크로스브라우징을 지원한다. \n4. css 문법을 지원합니다.\n5. 플러그인들이 많다. \n\n__jQuery를 jQuery 홈페이지__에서 다운로드 ; http://jquery.com\n1. jQuery를 삽입해보자\n <script type="text/javascript" src="자신의 경로"></script>\n2. jQuery 명령 사용\n <script type="text/javascript" src="./jquery-1.7.1.min.js"></script>\n <script type="text/javascript">\n 여기요!\n </script>\n\n@@color(#04f): ▣ JSON @@ (제이슨, JavaScript Object Notation)은 (from 위키백과) @ 2016-06-07\n''속성-값 쌍''으로 이루어진 데이터 오브젝트를 전달하기 위해 인간이 읽을 수 있는 텍스트를 사용하는 개방형 표준 포맷이다. 비동기 브라우저/서버 통신 (AJAJ)을 위해, 넓게는 XML(AJAX가 사용)을 대체하는 주요 데이터 포맷이다. 특히, 인터넷에서 자료를 주고 받을 때 그 자료를 표현하는 방법으로 알려져 있다. 자료의 종류에 큰 제한은 없으며, 특히 컴퓨터 프로그램의 변수값을 표현하는 데 적합하다.\n \n본래는 자바스크립트 언어로부터 파생되어 자바스크립트의 구문 형식을 따르지만 ''언어 독립형 데이터 포맷''이다. 즉, 프로그래밍 언어나 플랫폼에 독립적이므로, 구문 분석 및 JSON 데이터 생성을 위한 코드는 C, C++, C#, 자바, 자바스크립트, 펄, 파이썬 등 수많은 프로그래밍 언어에서 쉽게 이용할 수 있다.\n \nJSON 포맷은 본래 더글라스 크록포드가 규정하였다. RFC 7159와 ECMA-404라는 두 개의 경쟁 표준에 의해 기술되고 있다. ECMA 표준은 문법만 정의할 정도로 최소한으로만 정의되어 있는 반면 RFC는 시맨틱, 보안적 고려 사항을 일부 제공하기도 한다. JSON의 공식 인터넷 미디어 타입은 application/json이며, JSON의 파일 확장자는 .json이다.\n\n\n\n
!! 2014 휴가 중 CEO가 읽을 책\n!!!@@color:DarkGoldenRod; ▶ SERICEO 추천도서@@ ; 경제ㆍ경영 8권, 인문ㆍ교양 7권\n| !분야 | !제목 | !저자 | !비고 |\n| 경제ㆍ경영 |이카루스 이야기 |세스 고딘 |생각의 틀을 깨는 변화의 힘 |\n|~|나는 왜 이 일을 하는가 |사이먼 사이넥 |'왜?' 라는 질문과 이에 대한 답을 가지느냐가 얼마나 중요한지를 기술 |\n|~|대한민국 어디로 가야 하는가 |이광재 | |\n|~|무엇이 임원의 성패를 결정하는가 ? |스콧 에블린 | |\n|~|미래학자의 통찰법 |최윤식 |2030년까지 벌어질 미래 위기에 관한 예측 시나리오 |\n|~|인티프래질 |나심 니콜라스탈레브 | |\n|~|원씽 |게리켈러, 제이 파파산 |중요한 일 한가지에만 집중하는 것이 성공의 핵심임을 강조 |\n|~|플랫폼, 경영을 바꾸다 |최병삼, 김창욱, 조원영 | |\n| 인문ㆍ교양 |감정은 습관이다 |박용철 |감정을 다스리기 위해 일상에서의 실천방법을 제시 |\n|~|기브앤테이크 |애덤 그랜트 | |\n|~|기업의 시대 |중국 CCTV 다큐멘터리 제작팀 |기획에서 제작까지 2년여에 걸쳐 만든 대규모 프로젝트로, 기업의 탄생부터 근ㆍ현대사에서 나타난 기업의 성과와 폐부를 조명한 10부작 다큐멘터리를 한 권에 담아낸 책으로, 123명의 경제석학과 기업 CEO의 인터뷰를 통해 기업의 생존방식과 미래를 그려볼 수 있는 지혜를 전달 (2010년 중국에서 방영) |\n|~|바른 마음 |조너선 하이트 |2008년 TED 강의 |\n|~|이중톈, 사람을 말하다 |이중톈 |인생의 지혜를 담은 고전 강의 <삼국지 강의>, <초한지 강의> 등의 고전 강의로 잘 알려진 중국 석학 이중톈 교수의 저서, '주역의 계시', '중용의 원칙', '병가의 사고'(손자병법), '노자의 방법', '위진의 풍도'(위진시대 지식인), '선종의 경계'(선종 조사들의 일화) 등 6가지 주제로 고전에서 찾아볼 수 있는 인간 본연의 모습과 고대로부터 전해오는 간단하고 현실적인 세상 이치를 현대적인 안목으로 기술 |\n|~|포커스 |대니얼 골먼 |멈출 수 없는 산만의 시대, 우리는 어떻게 핵심에 집중할 것인가 ? <EQ 감성지능>의 저자 대니얼 골먼이 신경학과 심리학이 다양한 형태의 '주의력'을 어떻게 다루고 있는지를 철저히 파헤친 책 |\n|~|행복의 기원 |서은국 |행복의 의미를 과학적으로 해부 |\n\n!!!@@color:DarkGoldenRod; ▶ 현대경제연구원 추천도서@@ ; 경제ㆍ경영 6권, 인문ㆍ사회 4권 + 고전 1권\n '현대경제연구원 리더스포럼' 회원과 주요 출판사 및 내부 연구원들의 평가를 종합\n| !분야 | !제목 | !저자 | !비고 |\n| 경제ㆍ경영 |르네상스 소사이어티 |롤프 옌센, 마카 알토넨 |저성장 시대를 타개할 새로운 패러다임을 제시, 1인생산ㆍ1인소비 시대 미래에 대한 세 가지 시나리오로 르네상스 소사이어티(새로운 아이디어를 기반으로 행복, 선한 삶 등 비물질적 가치를 중시), 그린 소사이어티, 리스크 소사이어티를 제시 |\n|~|세계경제의 메가트렌드에 주목하라 |짐 로저스 | |\n|~|부자들의 생각법 |하노 벡 |작은 생각의 차이가 부자를 만든다고 주장, 2013년 독일 최우수 경제ㆍ경영 도서에 선정한 책으로 20년간 투자가, 은행가, 경제 전문 기자, 경제학 교수로 활약한 독일 경제 전문가가 자본 시장에서 발생하는 수많은 현상을 심리학으로 설명. 문제는 '돈'이 아니라 '돈을 대하는 우리의 심리'에 있음을 파악하고 심리적 오류에서 벗어나 어떻게 돈을 벌고, 어떻게 번 돈을 지킬 것인가에 대한 연구하고 이 책을 통해 그 내용을 기술 |\n|~|차이를 만드는 조직 |스콧 켈러, 콜린 프라이스 | |\n|~|아이디어 메이커 |뤼크 드 브라방데르 등 | |\n|~|어떻게 의욕을 끌어낼 것인가 |하이디 그랜트할버슨 등 | |\n| 인문ㆍ사회 |생명이 자본이다 |이어령 | |\n|~|감정수업 |강신주 |타인의 감정과 자신의 검정을 파악하는 방법을 소개 |\n|~|나의 문화유산답사기 일본편 1,2,3 |유홍준 | |\n|~|경제학자의 문학살롱 |박병률 | |\n| 고전 |정관정요 |오긍 |중국 역사의 황금시대를 연 당나라 태종의 통치술과 인재등용에 관한 철학을 담은 제왕학의 고전 |\n\n!!!@@color:DarkGoldenRod; ▶ KT경제경영연구소 추천도서@@ ; 경제ㆍ경영 7권, ITC(정보통신기술ㆍInformation Communication Technology)융합 7권\n| !분야 | !제목 | !저자 | !비고 |\n| 경제ㆍ경영 |기업의 시대 |중국 CCTV 다큐멘터리 제작팀 | SERICEO 추천도서 |\n|~|다윗과 골리앗 |말콤 글래드웰 |강자를 이기는 약자의 기술 |\n|~|당신이 경제학자라면 |팀 하포드 | |\n|~|더 인터뷰 |조선일보 위클리비즈 팀 |세계적인 리더 30인의 이야기 |\n|~|메타생각 |임영익 | |\n|~|어떻게 그들은 한순간에 시장을 장악하는가 |래리 다운즈, 폴 누네스 | |\n|~|이나모리 가즈오 1155일간의 투쟁 |오니시 야스유키 |파산 직전의 일본항공(JAL)을 되살린 '경영의 신' 이나모리 가즈오 회장의 스토리 |\n| ICT융합 |뉴노멀 |피터 힌센 |디지털 혁명이 미래의 기업 경영에 어떤 영향을 미칠지 예측 |\n|~|미친듯이 심플 |켄 시걸 |애플을 성공으로 이끈 단순함의 가치 |\n|~|상상, 현실이 되다 |유영민, 차원용 |미래산업 전반을 소개하고 제안 |\n|~|아마존. 세상의 모든 것을 팝니다 |브래드 스톤 | |\n|~|엘론 머스크, 대담한 도전 |다케우치 가즈마사 | |\n|~|융합하라 ! |봅 로드, 레이 벨레즈 | |\n|~|컨텍스트의 시대 |로버트 스코볼, 셀 이스라엘 | |\n\n
@ 2014.12.09.(화) @\nWhy your free-to-play users aren’t coming back ( 어째서 당신의 F2P 유저는 돌아오지 않는가? ) 요약\n저자 ; Eric Seufert (헬싱키에 위치한 모바일 게임 제작사인 Grey Area Labs의 마케팅 및 유저 확보 책임자)\n\n!!!1. 게임의 퀄러티를 전달하지 못함\n- 유저들로부터 가장 뜯어내기 힘든 것은 돈이 아니라 시간임.\n- 아이폰 / 아이패드 / 기타 하이엔드 안드로이드 장비를 갖고 있다는 건 돈은 충분하다는 뜻.\n- 첫 플레이시에 충분히 시간을 투자할만한 가치가 있다는 사실을 납득시키지 못하면 삭제당한다.\n- 허접해 보이면 망해요.\n- 그래픽, 정교한 물리, 새로운 게임 플레이 등\n\n!!!2. 심층 게임 플레이에 대한 인상을 남기지 못함\n- 시간을 빼앗기가 가장 힘들다. 유저는 이 게임을 오래동안 즐길 수 있다고 판단될 때 게임을 계속한다.\n- F2P 유저들은 원나잇이 아닌 오래 지속되는 관계를 원한다.\n- 유저는 계속해서 새롭고 풍성한 경험을 제공받음으로써 자신의 시간이 보상받길 원한다.\n- 게임에 깊이가 있다는 것은 초기에 그리고 강렬하게 전달되어야 한다.\n\n!!!3. 모두에게 어필하려고 너무 노력함\n- 게이머 성향은 매우 다양하고 차이가 큼. (슈팅 게임과 농장 시뮬레이션 비교)\n- 모든 장르의 게임 요소를 다 갖다 붙인다고 모든 유저에게 어필할 수 있는 것은 아니다. 오히려 난잡해 보일 뿐.\n- 좋은 게임은 핵심적인 게임 플레이 메카닉에 집중하고, 그 주변에서 풍성한 경험을 만들어낸다.\n- 유저가 여러 기믹에 정신이 팔려 게임의 핵심 플레이에 대해 알아채지 못한다면, 유저는 떠난다.\n- 유저는 게임을 진행하는 동안 자신이 어떤 점에서 점점 성장하고 있는 것인지 확인하고자 한다.\n- 총을 잘 쏘고 있나? 자원을 잘 사용하고 있나? 타이밍을 잘 맞추고 있나? 등등\n- 이걸 확인하지 못하면 게임에 몰입하지 못함.\n\n!!!4. 결론\n- 공짜라고 해서 유저가 단조롭고 평범한 게임 플레이를 참을 거라는 것은 착각.\n- 다른 수많은 게임들과 경쟁해서 사용자의 시간을 빼앗아야 함.\n- 첫날 유지율이 낮다는 건 위 세가지를 실패했다는 것.\n- 유저는 이미 당신 게임을 좋아하지 않는다. 아주 가까운 친구의 근거 없이는 이런 인식은 바뀌지 않는다.\n\n
夜(밤 야)關(빗장 관) 門(문 문) 한자 뜻 풀이를 해보자면 '밤에 빗장을 연다'는 뜻.\n\n야관문은 콩과에 딸린 여러해살이 풀로, 산과 들에서 자생하는 식물이며 3장의 잔잎으로 이루어지고며\n야관문의 꽃은 싸리나무 꽃과 유사한고 늦여름부터 초가을에 핀다.\n\n우리말로는 비수리라고 하며 한자로는 절엽철소추(截葉鐵掃帚), 효능 야관문(夜關門), 삼엽초(三葉草), 야계초(野鷄草), 반천뢰(半天雷), 폐문초(閉門草), 공모초(公母草), 음양초(陰陽草), 백관문초(白關門草), 야폐초(野閉草) 등의 여러 이름이 있다.\n이것을 먹으면 천리 밖에서도 빛이 난다고 하여 천리광(千里光)이라고도 한다.\n또 큰 힘을 나게 한다 하여 대력왕(大力王)이라고도 하며, 뱀을 쫓는다고 하여 사퇴초(蛇退草)라는 이름도 있다.야관문은 흔한 풀이다. 새로 찻길을 닦느라고 깎아낸 비탈 같은 곳에 무리지어 자란다. 고속도록 옆에 무리지어 자라는 것을 흔히 볼 수 있다.\n옛사람들은 이 풀을 꺾어서 묶어 빗자루로 쓰기도 했다.\n\n야관문은 뱀한테 물렸을 때 뱀독을 푸는 효과도 탁월하다. 산에서 뱀에 물렸을 때에는 야관문을 진하게 달여서 먹거나 그늘에서 말려 가 루 내어 먹으면 좋다. 잎과 줄기를 짓찧어 물린 상처에 붙이거나 가루를 물에 풀어서 물린 자리에 붙이는 방법을 같이 쓰면 치료효과가 더욱 빠르다.\n야관문에는 파충류나 곤충이 싫어하는 냄새가 나서 야관문 근처에는 뱀, 개구리, 두꺼비, 곤충 같은 것들이 가까이 오지 않는다.\n뱀뿐만 아니라 개, 쥐, 고양이에 물린 상처나 벌에 쏘였을 때에도 야관문을 달여 먹으면서 이와 함께 물린 부위를 달인 물로 씻으면 잘 낫는다. \n\n!!! ▷ 약성\n맛은 쓰고 약간 매우며 성질은 평하고 독이 없다. 폐와 간, 콩팥에 주로 작용한다. 간과 콩팥을 튼튼하게 하고 어혈을 없애며 부은 것을 내리게 한다.\n\n야관문의 잎, 뿌리, 줄기에는 플라보노이드, 피니톨, 페놀, 탄닌, 시토스테롤 등이 있는데, 이들 성분이 염증을 없애고 가래를 삭이며 황색포도상구균, 폐렴상구균, 연쇄상구균, 카타르 구균 등을 죽이거나 억제한다. \n\n!!!! ▷ 복용법\n일반적으로 약초를 먹는 방식인 달이거나, 말려 가루로 내어 차로 우려 먹는 식의 복용법도 가능하지만 효능이 떨어진다고 한다.\n야관문은 술과 함게 우려냈을 때 제대로된 효능을 얻을 수 있다고 하는데,\n9월에서 10월 사이 꽃필 무렵 청정지역에서 채취하여 30도 이상의 증류주에 야관문을 술의 3분의 1 가량 되는 양을 넣은 다음 약 3개월가량 숙성시키듯 우려내는데 숙성기간 동안 세번 정도 병을 흔들어 주고, \n숙성기간이 끝나면 정량, 하루 2잔 정도를 마시면 효능이 나타남.\n\n!!!! ▷ 효능\n1. @@color(#04f): 양기부족 치료 @@\n2. @@color(#04f): 기침 치료 @@\n 야관문을 80g에 물 1.8리터를 냄비에 부고 약한불로 해서 농축하신후에 기호에 맞게 설탕을 넣으시고 아침 저녁 두번, 식후에 드시면 기침 치료에 좋음\n3. @@color(#04f): 시력감퇴 개선 @@\n4. @@color(#04f): 급성위염 치료 @@\n 야관문의 잎과 뿌리와 줄기 말린것 100g을 잘게 써신후에 물 1.2리터와 함께 냄비에 넣고 끓이신후에 천을 이용해서 걸러준다.\n이것을 3~5시간 간격으로 드시면 급성위염이나 설사 치료에 좋다.\n5. @@color(#04f): 당뇨병 치료 @@\n 야관문 30~50g과 오골계의 살고기 부위를 함께 작은불로 푹삶아서 드시거나 야관문 40~80g에 물 1.8리터를 부고 물이 1L가 된 물을 차대신에 자주 마시면 당뇨병 치료에 탁월.\n6. @@color(#04f): 기력회복 @@\n 야관문씨를 가루로 만든후에 하루에 두세번 정도 복용 (한번에 드실양은 4~5그램)\n7. @@color(#04f): 신경쇠약치료 @@\n 야관문 뿌리 30~40g에 물 1.8리터를 부고 물이 절반이 될때까지 약한불로 달여주신후에 하루에 두번정도 나누어서 드시면 신경쇠약 치료에 좋다.\n\n
\n<html>\n<span style="color:#8A084B; font-family:돋움; font-size: 14px;"> <b>와인 정보 </b> </span>\n</html>\n http://www.winebow.co.kr/ - 와인보우 (vinamour_at_winebow.co.kr) / zinyw***/ wine**\n http://www.seoulwine.net/ - 서울와인 / zinyw***/ wine**/ cf. 2015.08.\n http://www.kaja2002.co.kr/ - 와인천국 가나주류백화점 동대문할인점\n\n* http://blog.naver.com/hitejinrovin - (하이트진로) 와인 놀이방 (http://hitejinro.com/ - Shotfire Shiraz(샷파이어 쉬라즈) )\n** http://www.hiliquor.net/ - 세계주류 서울대입구점\n** http://onul31.tistory.com/ - 로리의 와인창고\n** http://www.kiljin.co.kr/ - 길진 인터내셔날\n* 와인바 ; 해운대 지라프앤뱅\n** Thorn-Clarke Shotfire Shiraz 2011, Barossa Valley, Australia (쏜 클락 샷파이어 쉬라즈)\n\n\n| 날짜 | 이름 | 구입처 | 가격 | 비고 |\n| 2015.12. |반피 로사 리갈 (Banfi Rosa Regale) |이마트 신도림점 | 30,000 |크리스마스 할인 |\n| 2015.07. |Bava, Rosetta | 서울와인 | (1+1) 35,000 |10~50%세일 카테코리 |\n| 2015.07. |Shot Fire Shiraz | 와인보우 | 60,000 X 2 | |\n| 2015.08. |모엣 샹동 샴페인 브뤼 임페리얼 <br> Moet & Chandon Champagne Brut Imerial | 와인보우 | (78,000⇒) 52,000 |2015 클리어런스세일 |\n| 2015.08. |뵈브 클리코 퐁사르탱 엘로우 라벨 <br> Veuve Clicquot Champagne Brut Yellow Label | 와인보우 | (90,000⇒) 62,900 |2015 클리어런스세일 |\n| 2015.08. |돔 페리뇽 (Dom Perignon) 샴페인 | 일본 | ¥13,890 X 10(9.51) ≒ 140,000 | from P.준영/ 와인보우 220,000 |\n\n|와인 이름 |종류 |품종 |생산지 |도수 |STYLE |BODY |기타 |\n|바바 로제타 (Bava Rosetta) |스파클링 |Malvasia |Italy > Piemonte > Bava |5.5% |●●●●○ 4 (Sweet) |●●○○○ 2 (Light) |길진 인터내셔날 |\n|반피 로사리갈 (Banfi Rosa Regale) |스파클링 |Brachetto |Italy > Piemonte |6.5% |●●●●○ 4 (Sweet) |●●●○○ 3 (Medium) | |\n\n<html>\n<span style="color:#8A084B; font-family:돋움; font-size: 14px;"> <b>기타 </b> </span>\n</html>\n\nhttp://ko.woorisool.kr/woori/ko/ - 우리술(대통주)\n\nhttp://msfarm.co.kr/ - 광양매실촌 (광양다압 유기농 황(홍)매실)\n / 2015.06.08.(월) 특대 20kg - 113,000 원\n / 2016.04.14.(목) 대품 20kg - 101,000 원 ; 주문번호 *460597*6*453\n / 2018.06.01.(금) 대품 유기농 황매실 10kg - 043,000 원 ; 주문번호 2*18*6*14615443*\n / 2019.06.10.(월) 특품 유기농 황매실 20kg - 092,000 원 ; NPay\n
오 디는 뽕나무에 4~5월 연두빛으로 달리기 시작하여 6월경 흑자색으로 익는다. 오디는 맛이 대단히 좋고 풍부한 포도당이 함유되어 있어, 관절을 이롭게 하고 혈기를 통하게 한다. 농업과학기술원에 따르면 오디에는 노화억제물질인 C3G와 고혈압 억제물질인 루 틴, 혈압강화물질인 GABA 성분이 다량 함유되어 있으며, 오디씨에는 불포화지방산이 87%나 들어 있어 기능성 건강식품으로의 활용가치가 매우 높은 것으로 나타났다.\n\n술, 음료, 각종 식품으로 개발 가능성이 가장 높은 수종으로 오디를 이용하여 오디주, 오 디쨈, 유제품에 첨가, 화장품 첨가제, 기능성 식품으로 식품개발과 홍보에 따라 소비추세 는 증가될 것이다. 척박한 땅에서도 잘 자라며 농약을 덜 써도 수확이 가능한 환경 친화 형 작물이며 유휴지, 산지, 밭 등에 식재한다.\n\n!!! ▷ 약성\n오디의 C3G(Cyanidin-3-Glucoside) 함량은 1.5%로, 포도의 23배 정도이며 검정콩의 8배, 유색미(有色米)의 50배 이상 높다.\n오디에는 비타민C가 사과의 14배, 비타민B는 70배 그리고 철분은 복분자의 9배, 칼슘은 포도의 11배 정도 함유되어 있습니다.\n\n!!! ▷ 복용법\n#. ''오디주''\n씻어서 물기를 말린 오디에 조금의 설탕을 넣은 후 30-35˚의 소주를 오디의 3배정도 부어준다. 오디를 서늘한 곳에 보관해놓았다가, 2-3개월 후에 건더기를 걷어내고 1개월 가량 더 보관하면 오디주가 완성된다. \n\n#. ''오디 액기스''\n오디와 설탕을 같은 비율러 섞어 통에 넣어 1주일 정도보관해놨다가 통을 열어 다시 잘섞이게 저어준다. 이런 식으로 서늘한 곳에서 3개월 정도 숙성시키면 오디 액기스가 완성된다. \n\n!!! ▷ 효능\n심장과 간, 신장에도 작용해 이뇨제, 완화제 역할을 합니다. 혈액과 진액을 보충하고 열을 내려주는 작용을 가지로 있어 소갈, 가슴이 두근거리면서 잠을 이루지못할때, 어지럽고 귀가 울릴때, 기침, 천식등에 효과를 나타낸다.\n\n1. @@color(#04f): 노화방지 @@\n 노화방지는 오디효능을 논할대 빼놓을 수 없는 효능이다. 오디에는 포도의 22배, 검정콩의 10배나 되는 안토시아닌이 함유되어 있다. 이 안토시아닌은 활성산소를 제거하는데 매우 효과적인 성분이기 때문에 노화를 방지하는데 매우 탁월한 효능이 있다. 동의보감에는 '오디를 지속적으로 섭취했을 경우 백발을 검게한다'라는 말이 써있을 정도이다.\n2. @@color(#04f): 고혈압 완화 @@\n 대표적인 오디효능 중 하나로, 오디에 풍족하게 함유되어 있는 루틴이 혈압을 낮추고 모세혈관을 튼튼하게 해주는 GABA 성분이뽕잎과 같은 수준으로 함유되어 있기 때문에 때문에 고혈압을 치료해주는 효능이 있다. 또한 체내의 혈액공급을 원활하게 하는 효닝이 있어 손발이 차거나 고지혈증과 같은 질병을 예방할 수 있다.\n3. @@color(#04f): 불면증 개선 @@\n 불면증에 좋아 한방에서도 '상심자'라는 약재로 사용하고 있다. 잠을 제대로 못자는 분들께서 오디를 꾸준히 섭취하시면 불면증을 개선하는데에 도움이된다. 또한 오디효능 중에는 두뇌활동을 촉진시키는 효능도 있어 자주 까먹는 건망증을 개선하는데에도 효능이 있다.\n4. @@color(#04f): 당뇨병치료 @@\n 오디효능 중에는 혈당수치를 일정하게 맞추어주고 신체의 밸런스를 맞추어주는 효능이 있다. 그 근거로 당뇨병 환자의 80%에 달하는 인슐린 비의존형 당뇨병 환자에게 지속적으로 오디를 섭취하게 한결과, 혈당을 현저하게 감소시켜주었다는 연구결과가 있다.\n5. @@color(#04f): 숙취, 더위, 갈증해소 @@\n 알코올을 분해하여 숙취를 해소하는 효능이 있으며, 포도당과 사과산이 풍부하게 함유되어 있어 한여름의 갈증과 더위를 효과적으로 해소할 수 있다.\n6. @@color(#04f): 빈혈 및 골다공증에 좋다. @@\n 비타민A,D와 포도당 외에도 철분, 칼슘이 풍족하게 함유되어 있어 빈혈과 골다공증 환자에게 매우 좋다. 또한 조혈작용이 있어 관절부위를 튼튼하게 해주고 원할한 혈액순환에도 좋다. 특히 칼슘과 철분이 부족한 임산부에게 매우 좋은 음식이라고 할 수 있다\n
@ 신용사회 2015.09. Vol.396\n''전통주 갤러리'' ; 국내산 농수산뭉르 기반으로한 한국 전통주의 맛과 멋을 널리 알리기 위해 농림축산식품부가 문화체육관광부와 협업으로 마련한 공간.\n\n<html> <CENTER>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/shinbo396_01.jpg" > </CENTER> </html>\n\n● ''이강주''\n최남선은 이강주, 죽력고, 감흥로를 조선 3대 명주로 언급한 바 있다. \n그중 직접 만든 소주에 배(梨)와 생강(薑)이 들어가 이강주(梨薑酒)라 불린 이강주는 조선 중기부터 전라도와 황해도에서 빚어온 전통 민속주이다. 1987년, 이강주 제조 기술을 가진 조정형 명인이 전라북도 무형문화재 제6-2호 기능보유자로 지정되었고 1991년부터 대중에서 판매되기 시작했다. \n누룩과 맵살로 빚은 약주를 증류하여 소주를 만든 후 배즙과 생강, 계피, 울금 등의 추출액을 첨가하고 꿀을 넣어 1개월 이상 숙성시키는 방식으로 만들어진다. \n알코올도수 25%.\n\n● ''문배술''\n중요 무형문화재 제86호로 지정, 고려 왕건 시대부터 제조되어 내려온 평양 지역의 전통 증류식 소주인 문배술도 빼놓을 수 없는 우리의 전통주. 북한에서는 명맥이 끊겼지만 3대 전수자인 이\n경찬 옹이 한국전쟁 후 서울에 내려와 만들면서 1986년 중요무형문화재 기능보유자로 지정되었고 1990년에 정식으로 전통주 제조 허가를 받아 지금의 문배술을 빚기 시작했다. 지금은 한국식\n품명인 7호로 지정된 4대 이기춘 명인이 양조원을 대표하고 있다. \n메조와 찰수수를 이용해 빚어낸 순곡의 증류주로 잡곡만을 사용해 만들었는데도 우리나라 토종배인 문배나무 과실 향이난다고 해 문배술이라고. 알코올 도수가 40%임에도 불구하고 이처럼 향긋\n한 과일 향, 깔끔한 맛이 특징이다. \n알코올도수 40%.\n\n● ''감홍로주''\n달 감(甘)자에 붉을 홍(紅), 이슬 로(露)자를 썼다. 달고 붉은 술이 항아리 속에서 이슬처럼 맺힌다는 뜻의 감홍로주는 이름과 같이 붉은 빛깔을 띠고 달착 지근한 향이 나지만 부드러운 겉모습\n과는 달리 40% 도수의 독주다. \n<춘향전> <별주부전> 등 고전문학부터 <동국세시기> 등 다양한 고전문헌에 등장하는 감홍로주는 용안육, 진피, 계피 등 8가지 약재를 침출시켜 완성하는 덕에 몸을 따뜻하게 해주며 조선시대에는 약을 대신해 집에서 사용할 만큼 약효가 뛰어난 술이었다고 전해진다. \n문배술과 혈통이 같은 술로 인간문화재였던 이경찬 옹이 문배주는 큰아들에게, 감홍로주는 작은 아들에게 물려줬는데 작은 아들이 일찍이 타계하면서 명맥이 끊어질 위기에 놓였으나 여동생 이\n기숙씨가 물려받아 2012년, 대한민국전통식품부분 ‘명인’으로 정식 등록됐다. \n알코올도수 40%.\n\n● ''죽력고''\n조선 3대 명주 중 하나로 꼽히는 정읍의 죽력고는 약주 중의 약주라고 해 술에 붙일 수 있는 극존칭 고(膏)가 붙은 진귀한 술로 일제강점기 주세법이 있을 때도 치료약 명분으로 명맥을 유지\n할 수 있었다고 전해진다. \n대나무를 잘라 항아리에 넣고 왕겨를 태워 3~5일 동안 대나무 진액인 죽력을 내리고 이것을 증류하는 데 드는 시간만 꼬박 석달이 걸린다. 이처럼 어려운 전통 제조방식을 30여 년간 묵묵히 지켜온 송명섭 명인은 누룩을 빚는 쌀농사도 직접하고 있다고. 죽력고는 32%로 도수가 꽤 높음에도 불구하고 부드럽고 향긋한 맛이 나는데 술에 직접 약재를 넣지않고도 간접적으로 그 맛과 향이 우러나게 하는것이 바로 죽력고의 참맛이다. \n알코올도수 32%.\n\n<html> <CENTER>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/shinbo396_02.jpg" > </CENTER> </html>\n\n● ''왕주''\n종묘대제의 제주로 사용되는 왕주는 명성황후의 친정에서 빚던 가양주이자 궁중 진상주. 남상란 명인은 어머니인 도화희 여사에게 왕주 빚기를 배웠는데 그녀의 어머니가 명성황후의 친정 조카인 고 민재득 여사였다. \n왕주의 주원료인 쌀과 누룩에 야상국화와 구기자, 오미자, 솔잎, 매실, 산수유, 가시오가피, 홍삼 등을 약재로 가미한다. 술밥을 찔 때 뜨거운 상태에서 누룩을 섞는데 이는 가문의 비법으로 천연 잡균 방지 효과가 있다. 덧술을 한 다음 약재를 넣고 참나무 숯과 말린 고추를 띄워 밀봉한 후 그늘에서 100일 정도 발효시킨 후 3~4회 여과해 맑은 술로 만든다. 배양 누룩과 매실 과즙 혼합물에 효모를 접종해 발효시켜 누룩 냄새를 90% 잡았다. \n알코올도수 17.7%.\n\n● ''한산 소곡주''\n특유의 감칠맛이 일품으로 한번 마시다 보면 자리에서 일어날 줄 모른다 하여 일명 ‘앉은뱅이술’로도 불린다. 백제 왕실에서 즐겨 마시던 술로 한국 전통주 가운데 가장 오래된 술이라고. 소\n곡주, 소국주 등의 이름으로 제조법이 전해져왔는데 1979년 충남 무형문화재 3호로 지정된 김영신 명인이 선조로부터 그 제조법을 전수받아 이후 며느리인 우희열씨가 전수받았다.\n찹쌀과 누룩을 주원료로 들국화, 메주콩, 생강, 홍고추 등의 조화 속에 100일간 숙성해 완성된다.\n청와대 만찬주로 선정되는 등 국내에서 명성을 떨침과 동시에 2014년 몽드셀렉션 금상, 영국 주류품평회 IWSC증류주 부문 브론즈 메달을 수상하는 등 세계시장에서도 인정을 받고 있다.\n알코올도수 18%.\n\n● ''추성주''\n추성주는 대나무로 유명한 전라남도 담양의 옛 지명인 ‘추성군’에서 따온 이름으로 그 지역의 전통 민속주이다. 고려 초, 연동사 스님들이 건강을 지키기 위해 밥에 약초를 섞어 발효시킨 데서\n유래한 이 술은 쌀을 기본으로 구기자, 오미자, 산약 등 10여 가지 한약재를 넣고 알코올 도수 40%의 증류주로 만든다음, 다시 약재 추출물을 가미해 알코올 도수 25%의 추성주로 빚는다. 바로 마시지 않고 100일 이상 숙성시켜 약초들의 은은한 향취가 더욱 깊어지며 탈취 및 항균 작용이 있는 대나무 숯으로 여과한다. \n2013년 대한민국주류품평회에서 일반증류주부분 대상 수상, 2014년 세계 3대 주류품평회인 SWSC에서 더블 골드, 벨기에 몽드셀렉션에서 그랜드 골드를 수상하였다. \n알코올도수 25%.\n\n-----\n@ 2014.09.29.(월) @\n-. 살림 9단의 만물상 74회(2014.09.07.) ; 약이 되는 배의 기적 (한의사 배한호)\n\n-. 특징\n / 조선 시대 5대 명주 중 하나 ; 전북 전주(무형문화재)나 황해도 지역이 유명\n / @@color(#04f): 소주에 배와 생강을 혼합하여 만든 약소주 @@\n = 배 梨 + 생강 薑 + (울금 & 계피 & 꿀)을 첨가해서 30일 정도 숙성한 술\n\n-. 술을 잘 먹지 못하는 수족냉증 여성 환자에 좋음\n\n!!!#. 25 ~ 30도 담금주를 활용한 방법\n1. 작은 크기의 배를 껍질째 갈아 용기에 넣는다.\n2. 생강을 갈아 한 스푼 정도 넣는다.\n3. 통계피를 부수어 5조간 정도만 넣는다.\n4. 꿀을 반 스푼 정도만 넣는다(cf. 배가 달기 때문에 꿀은 소량만 넣을 것)\n5. 갈아서 넣은 배와 같은 양의 담금주를 부어준다.\n6. 일주일 동안 상온에 보관한 뒤 1~2일 냉장 보관한다(cf. 30일 정도 숙성).\n7. 체로 건더기를 빼고 맑은 물만 걸러낸다.\n\n| 날 짜 |>| 배 |>| 생강 |>| 계피 | 꿀 | 강황 | 술 | 비 고 |\n| 21.10.01 | 17,980 g | 1000| 139 g | 7.73| 36 g | 2.0| 2 숫가락 | 1 숫가락 | 3 L (좋은데이 담금주 30%) |2일 상온 + 냉장보관 + 상온 보관 |\n| |>|>|>|>|>|>|>|>|10.03. 냉장 보관 | |\n| |>|>|>|>|>|>|>|>|10.11. 상온 보관 (∵ 숙성되지 않음) | |\n| |>|>|>|>|>|>|>|>|10.30. 술 추가/ 125ml, 56% 이과두주 (홈플러스, 1,580원) | |\n\n\n
#. ''직책이란, '직무상의 책임'이다.''\n__직무상의 책임에 따라 구분되는 직책__. 쉽게 설명하면 팀장, 사업부장, 본부장 등을 말한다. 직책은 아래에서 이야기할 '직위'와 상관없이 그 직무에 권한과 책임을 가진 사람을 의미한다. 예를 들어 생각해보자. A라는 회사에 김팀장과 박팀장이 있다. 김팀장은 직위가 과장이지만, 박팀장은 직위가 차장이다. 즉, 직책은 그 사람이 맡고 있는 직무상의 책임인 것이다.\n\n#. ''직위란, '직책상의 지위'이다.''\n__직위는 직무를 수행하기 위한 서열, 즉 순위__를 말합니다. 앞에서 직위가 '과장이다' 혹은 '차장이다'라고 이야기한 것처럼, 직위는 우리가 잘 알고 있는 '승진'의 개념과 관련이 깊다. 사원을 시작으로 대리, 과장, 차장, 부장, 상무, 전무, 사장 등을 우리는 '직위'라고 하며 한 조직 내의 수직적인 서열을 의미한다.\n\n#. ''직급이란, '직책의 급수'이다.''\n__직급은 직무의 등급__을 말합니다. 일의 종류나 난이도, 책임에 따라 같은 직위를 묶은 최하위 개념의 구분이죠. 보통 회사에서는 이를 '호봉'이라고 부르기도 하는데요. 예를 들어, 같은 대리라도 1년차 대리와 4년차 대리가 동등한 등급이 아닌 경우가 대표적인 케이스입니다. 영어로는 'class'로 불립니다.\n\n\n!! 일반적인 회사의 직위 분류\n가장 먼저 설명드린 직위에 대해 보다 자세히 알아보시죠. 평범한 직장인이라면 이 정도 서열 쯤은 알고 있어야 클라이언트나 파트너 사와의 미팅 자리에서 실수를 막을 수 있으니까요. 사원부터 시작해 사장으로 끝나는 직위 살펴볼까요.\n\n사원(Staff) → 계장(Chief) → 주임, 대리(Assistant manager) → 과장(Manager) → 차장(Deputy General Manager) → 부장(Deputy General Manager) → 부사장(Vice President) → 사장(President)\n\n물론 위의 서열이 절대적이지는 않습니다. 각 회사마다 구분되어있는 직위 체계가 조금씩 다르니까요. 상무나 고문, 회장과 같이 빠져있는 직위도 있으니 참고하시기 바랍니다.\n\n\n!! 직위vs직책, 어떤 걸 불러야할까?\n사회 초년생들이 가장 궁금해하는 부분입니다. 바로 직위와 직책을 동시에 가지고 있는 상사의 경우 어떤 호칭으로 불러야 할지에 대한 고민인데요. 일반적으로 호봉에 해당하는 직급은 잘 부르지 않기 때문에 대개 직위와 직책을 가지고 혼동하게 되죠. 누가 정해놓은 정답은 없지만 보통 직책을 부르는게 일반적입니다.\n\n또한 직위가 있어도 직책이 없는 경우가 있습니다. 하지만 직책만 있고 직위가 없는 경우는 드물죠. 매우 작은 회사에서는 직책만 붙여 커뮤니케이션을 하는 기업도 상당수 있지만 이런 경우엔 그냥 직책을 부르면 되니 고민할 이유가 없겠죠. 반대로 직위만 가진 채 직책이 없다면 편하게 직위만 부르면 됩니다.\n\n\n!! 압존법...\n압존법이란 대화를 하는 상대방보다 낮은 직위(직책)을 언급할 때 '~님'이라고 붙이지 않는 것을 말하는데요. 상대방인 상사인 기준에서 대화에 표현된 사람이 아랫사람이냐 윗 사람이냐를 따져 부르는 방법입니다.\n\n국립국어원에서는 압존법을 가족을 포함한 친족 등 사적인 관계에서만 적용되고 직장에서는 적절하지 않는 방법이라고 얘기하는데요. 직장에서 사용하지 않는다고 하지만 직장 분위기나 규율에 따라 충분히 달라질 여지가 있으니 압존법의 의미 정도만 알아둔 후 회사 분위기에 맞춰 맞춤형 표현법을 사용하는게 가장 좋은 방법일 듯 싶습니다.\n
CMS(Contents Management System : 콘텐츠 관리 시스템)란 "인터넷이나 컴퓨터 통신 등을 통하여 제공되는 각종 정보나 그 내용물들을 관리하는 정의된 목적을 달성하기 위한 통합 요소들의 집합체"이다.\n그냥 간단하게 말해서 CMS는 개발지식이 없는 사람도 홈페이지를 만들고 운영할 수 있는 툴(?)로, 블로그를 넘어서 콘텐츠를 체계적으로 운영할 수 있도록 돕는 툴(Tool).\n\n!!#.오픈소스 CMS 솔루션\n1. XpressEngine: XE(과거명:ZeroBoard)\n강력한 오픈 소스 CMS로서 수백 개의 플러그 인과 무한한 가능성을 제공합니다.\nhttp://www.xpressengine.com/\n\n2. kimsQ: 킴스큐\nkimsQ는 웹 사이트를 빠르게 구축하고 콘텐츠를 손쉽게 생성하고 관리하는 데 사용할 수 있는 CMS 솔루션입니다. 몇 번의 입력과 마우스 클릭으로 웹 사이트를 쉽게 구축할 수 있으므로 PHP에 대한 지식이 필요하지 않습니다. kimsQ를 사용하여 개인 블로그, 카페, 일반 사이트 및 포털 사이트를 구축할 수 있으며, 확장 프로그램을 사용하여 쇼핑몰이나 그룹웨어를 만들 수도 있습니다.\nhttp://dev.kimsq.com/\n\n3. GnuBoard: 그누보드\nhttp://sir.co.kr/main/gnuboard4/\n\n4. DotNetNuke\nDotNetNuke®는 동적 콘텐츠 및 대화형 기능을 사용하여 전문적인 웹 사이트를 구축하는 데 사용할 수 있는 뛰어난 웹 콘텐츠 관리 플랫폼(CMS)입니다. 50만 개가 넘는 웹 사이트가 구현되어 운영되고 있으며 수천 개의 타사 확장 프로그램을 즉시 설치할 수 있으므로 DNN®을 사용하면 상용 웹 사이트, 커뮤니티 포털 또는 인트라넷 솔루션을 신속하고 경제적으로 개발할 수 있습니다.\nhttp://www.dotnetnuke.com/\nhttp://dotnetnuke.codeplex.com/\n\n5. Umbraco CMS\nUmbraco CMS는 http://www.asp.net/, http://www.wired.co.uk/ 및 85,000개가 넘는 다양한 사이트에서 콘텐츠와 응용 프로그램을 관리하고 수백만 명의 사용자에게 제공하는 데 사용하는 프레임워크입니다. 최신 UI, 순수한 .NET 아키텍처 및 활발한 커뮤니티를 갖춘 Umbraco는 가장 뛰어난 웹 CMS입니다. Umbraco는 사용하기 쉬우며 확장이 간편하고 기존 시스템과 통합이 가능합니다.\nhttp://umbraco.com/\n\n블로그형\n6. WordPress\nWordPress는 미학, 웹 표준 및 사용 편의성에 중점을 둔 최신식 게시 플랫폼입니다.\nhttp://www.wordpress.org/\n\n블로그형\n7. Textcube\nhttp://www.textcube.org/
@ 2014.12.09.(화) @\n저자 ; 김낙형 / TERA Korea-Japan Live Service Producer at Bluehole Studio\n\n!!!#. 특징\n-. F2P(Free-2-Play) ; 부분 유료\n\n-. 과거 RPG의 정석 ; 용사는 동료들과 힘을 모아 열심히 레벨업을 하여 드디어 마왕을 물리쳤습니다 !\n-. 요즘 모바일 RPG의 정석 ; 3성 용사는 열심히 레벨업을 하여, 4성 용사의 합성 재료가 되었다.\n\n-. 도탑전기는 캐릭터를 재료로 합성하지 않음\n / 게임 중반에 접어들면 더 상급 캐릭터들을 획득하게 되지만, 여전히 성장 시켜 놓은 초기 캐릭터들도 꾸준히 활용해서 게임을 진행\n / 중요 포인트는 캐릭터에 대한 나의 투자를 소멸시키지 않고, 투자한 캐릭터의 가치를 계속 유지시켜 준다는 점\n ㅡ> 캐릭터에 대한 애착과 감정이입이 발생\n\n-. 게임의 밸런싱이 잘 되어 있음\n / 게임에서 적절한 난관의 제공은 매우 중요\n / 난관이 없으면 게임이 쉽게 지루해지고, 너무 어려우면 좌절하고 그만두게 됨\n\n-. 도탑전기는 현질을 강요하지 않음\n / F2P 게임은 돈을 벌기 위해서 일부러 큰 난관을 배치\n ㅡ> 대다수의 유저는 그 지점 때문에 이탈\n / 주어진 캐릭터만 꾸준히 성장시키면 메인 컨텐츠인 캠페인은 물론, PVP도 어렵지 않게 즐기 수 있음\n / 접속만해도 엄청나게 많은 보석과 상급 캐릭터, 아이템 등을 지급\n ㅡ> 절대 비과금 유저가 박탈감을 느끼게 하는 일이 없음\n\n|일반적인 모바일 RPG 요소 |캠페인 |\n|~|아레나(PVP) |\n|특징 | 크루세이드 모드 |\n★ 크루세이드 모드 : 일종의 연속 PVP 모드, 사망한 캐릭터는 다시 사용할 수 없지만, 완료시 큰 보상을 받음\n ㅡ> 투자한 캐릭터의 가치를 유지시켜 주는 대표적인 컨텐츠 \n\n!!!#. VIP 레벨에서 악마(의 BM)을 보다\n= @@color(#04f): 계속하고 싶게 만드는 게임플레이 + (넛지 Nudge + 꽃신) + VIP 레벨 시스템 @@\n\n-. 게임 중 VIP레벨 메시지를 자주 노출시켜서 과금을 유도하지만\n 비과금 유저도 풍족하게 리소스를 지원 받음\n\n-. 낚시의 시작은 미끼\n / Monthly Card ; 3천원에 판매\n 정가 보석 교환율이 100개 = 1천원인데, 이 상품은 3600개 = 3천원\n\n-. VIP 레벨이 오르면 리소스 교환 횟수가 증가하지만\n 보석을 이용한 리소스 교환 횟수가 늘어날수록 교환에 들어가는 보석의 숫자가 늘어나는 구조\n ㅡ> 다음날 교환 비율이 리셋이 되지만 더 빨리 성장하고 싶을수록, 돈을 조금씩 더 많이 소비하는 시스템\n\n-. 19/20은 7/20과 마찬가지로 1/20 이지만 느껴지는 가치는 다름\n / 보석의 교환비율은 더 이상 중요하지 않음\n / 어차피 지르면 VIP 레벨도 올라간다는 자기 합리화가 발동\n\n-. 엄청나게 많은 돈을 쓰는 고래 유저들에게 효율은 큰 의미가 없다.\n / 어떻게 차별화 된 서비스를 제공하느냐\n / 돈을 많이 쓸수록 효율을 떨어지는 구조\n ㅡ> VIP 레벨의 보상으로 효율 감소 부분을 상쇄시키고\n ㅡ> 게임 밸런스적으로도 빈부격차를 줄여서 비과금 유저의 박탈감도 완화 시키는 효과\n\n!!!#. 중국의 역습\n-. 혹독한 경쟁에서 단련된 중국 게임 ; 더 큰 시장 = 더 치열한 경쟁\n ㅡ> 온라인 게임 < 웹게임 ≒ 모바일 게임 ; 소규모 팀이 기획력을 중심으로 런칭 \n\n-. 웹게임은 기술과 그래픽 요소들로 차별화하기 힘든 만큼, \n 기획적인 요소들을 통해서 게임의 재미를 이끌어 내는 것이 중요\n\n-. 모바일은 웹에 비해서 보안이나 결제 시스템 등을 플랫폼 차원에서 상당부분 제공 받음\n ㅡ> 게임 개발에만 팀의 역량을 집중할 수 있는 환경\n / 해외 진출이 상대적으로 온라인 게임에 비해 용이\n / 클라우드 서비스 때문에 해외 퍼블리셔 없이 직접 서비스가 가능\n ㅡ> 글로벌 서버에 글로벌 원빌드로 서비스를 하기 때문에 관리비용 차원에서도 큰 이익\n 예.슈퍼셀의 'Clash of Clans', 컴투스의 '서머너즈 워' \n\n-. ''F2P 게임으로 출발한 시장에서 탄생하고 성장한 개발자들로 뛰어난 유료화 모델을 개발''\n\n
@ 2014-12-22 (월) @\n컬링( Culling )은 실제 화면에 안보이는 폴리곤을 그리지않도록 추려내는 작업\n\n!!! 후면컬링\n0.1 폴리곤을 그릴때, 화면상에 보이지 않은 뒷면, 즉 삼각형의 양쪽면을 앞면 뒷면이라고 할때, 뒷면을 그리지 않음으로써 연산속도 향상을 가져온다.\n 실제로 3D게임할때, 캐릭터같은것을 뚫고 들어가면 속안이 보이지 않는것이 그 예.\n\n!!! 오클루젼 컬링( Occlusion Culling )이란? \n(GPG1권) 4.8 오브젝트 오클루젼 컬링 참고\n1.1 앞의 오브젝트에 의해서 가려진 뒷면에 존재하는 오브젝트를 컬링하는 기법 \n 오브젝트가 다른 오브젝트에 의해 가려져서 카메라에 보이지 않을 때 해당 오브젝트의 랜더링을 비활성화 하는 기능.\n1.2 동적인 오브젝트(애니메이션, 이동등)의 컬링에도 적용할 수 있다 \n1.3 실내뿐만 아니라, 실외에서도 활용 가능하다 \n\n!!! 프러스텀 컬링( frustum culling ) \n2.1 시야(Field of View)에 제외된 오브젝트를 컬링 \n2.2 프러스텀 컬리의 기본 구현은 오클루전 컬링에도 그래도 적용된다 \n2.3 1. 오브젝트의 바운딩 스피어를 시야 공간으로 변환한다 \n2.4 2. Z값을 이용하여 근단면, 원단면 밖의 오브젝트를 제거한다 \n2.5 3. 좌우 평면 사이에 있는지 계산한다 \n2.6 4. 상하 평면 사이에 있는지 계산한다 \n\n!!! 오클루젼 컬링 \n3.1 시점 - 오클루젼 사각형으로 오클루젼 영역을 계산한다 \n3.2 이 프러스텀 영역에 들어가면 '보이지 않는' 객체이다 \n3.3 시점 좌표에서 오클루전 최소 Z보다 앞에 있는 오브젝트는 컬링을 적용할 필요가 없다 \n3.4 오클루젼 영역을 구성하는 5개의 평면의 방정식을 구한다 \n3.5 5개의 평면과 오브젝트의 바운딩 스피어와의 거리를 계산한다 (프러스텀과 거의 동일) \n\n...\n\n!!! 요약 \n7.1 오클루젼 컬링을 구현하는것은 그리 어렵지 않다 \n7.2 음성이나 한 모델내에서도 가려지는 객체를 컬링하도록 활용할 수 있다 \n
@ 2014.12.23.(화) @ 출처 ; http://faq.hostway.co.kr/Windows_Web/1714\n\n''로그 파일 위치''\n기본적으로 IIS는 %WINDIRSystem32Logfiles에 해당 로그 파일을 저장합니다. \n이 디렉터리에는 각 WWW(World Wide Web) 및 FTP 사이트에 대한 별도의 디렉터리가 포함됩니다. \n기본적으로 로그는 디렉터리에서 매일 만들어지고 날짜를 포함하는 이름(예: exYYMMDD.log)으로 지정됩니다.\n\n''HTTP''\n''1xx - 정보 전달용''\n이 상태 코드는 임시 응답을 나타냅니다. 클라이언트가 정식 응답을 받으려면 \n하나 이상의 1xx 응답을 받을 준비가 되어 있어야 합니다. \n 100 - 계속 작업합니다. \n 101 - 프로토콜을 전환합니다.\n\n''2xx - 완료''\n상태 코드의 이 클래스는 서버가 클라이언트 요청을 받아들였음을 나타냅니다. \n 200 - 클라이언트 요청이 성공했습니다. \n 201 - 만들어졌습니다. \n 202 - 받아들여졌습니다. \n 203 - 권한이 없는 정보입니다. \n 204 - 내용이 없습니다. \n 205 - 내용을 다시 설정합니다. \n 206 - 일부 내용\n\n ''3xx - 리디렉션''\n클라이언트 브라우저는 요청을 처리하기 위해 좀더 조치를 취해야 합니다. \n예를 들어, 브라우저는 서버에서 다른 페이지를 요청해야 하거나 프록시 서버를 사용하여 요청을 반복해야 할 수 있습니다. \n 302 - 개체 이동 \n 304 - 수정되지 않았습니다. \n 307 - 임시 리디렉션\n\n''4xx - 클라이언트 오류''\n오류가 발생하고 클라이언트에 문제가 있는 것으로 나타납니다. \n예를 들어, 클라이언트가 존재하지 않는 페이지를 요청하거나 올바른 인증 정보를 제공하지 않을 수도 있습니다. \n 400 - 요청이 잘못되었습니다. \n 401 - 액세스가 거부되었습니다. IIS는 오류의 원인을 보다 구체적으로 나타내는 여러 다른 401 오류를 정의합니다. \n 이러한 특정 오류 코드는 브라우저에 표시되지만 IIS 로그에는 표시되지 않습니다. \n 401.1 - 로그온하지 못했습니다. \n 401.2 - 서버 구성으로 인해 로그온하지 못했습니다. \n 401.3 - 리소스의 ACL에 의해 액세스가 거부되었습니다. \n 401.4 - 필터에 의해 권한을 부여하지 못했습니다. \n 401.5 - ISAPI/CGI 응용 프로그램에 의해 권한을 부여하지 못했습니다. \n 401.7 - 웹 서버의 URL 인증 정책에 의해 액세스가 거부되었습니다. 이 오류 코드는 IIS 6.0에만 해당됩니다. \n 403 - 금지. IIS는 오류의 원인을 보다 구체적으로 나타내는 여러 다른 403 오류를 정의합니다. \n 403.1 - 실행 액세스 금지 \n 403.2 - 읽기 액세스 금지 \n 403.3 - 쓰기 액세스 금지 \n 403.4 - SSL이 필요합니다. \n 403.5 - SSL 128이 필요합니다. \n 403.6 - IP 주소가 거부되었습니다. \n 403.7 - 클라이언트 인증서가 필요합니다. \n 403.8 - 사이트 액세스가 거부되었습니다. \n 403.9 - 사용자가 너무 많습니다. \n 403.10 - 구성이 올바르지 않습니다. \n 403.11 - 암호 변경 \n 403.12 - 매퍼가 액세스를 거부했습니다. \n 403.13 - 클라이언트 인증서를 취소했습니다. \n 403.14 - 디렉터리 목록이 거부되었습니다. \n 403.15 - 클라이언트 액세스 라이센스가 초과되었습니다. \n 403.16 - 클라이언트 인증서가 신뢰되지 않거나 잘못되었습니다. \n 403.17 - 클라이언트 인증서가 만료되었거나 아직 유효하지 않습니다. \n 403.18 - 현재 응용 프로그램 풀에서 요청된 URL을 실행할 수 없습니다. 이 오류 코드는 IIS 6.0에만 해당됩니다. \n 403.19 - 이 응용 프로그램 풀에서 클라이언트에 대한 CGI를 실행할 수 없습니다. 이 오류 코드는 IIS 6.0에만 해당됩니다. \n 403.20 - Passport 로그온에 실패했습니다. 이 오류 코드는 IIS 6.0에만 해당됩니다. \n\n 404 - 찾을 수 없습니다. \n 404.0 - (없음) - 파일 또는 디렉터리를 찾을 수 없습니다. \n 404.1 - 요청된 포트에서 웹 사이트에 액세스할 수 없습니다. \n 404.2 - 웹 서비스 확장 잠금 정책으로 인해 이 요청이 방지됩니다. \n 404.3 - MIME 맵 정책으로 인해 이 요청이 방지됩니다. \n\n 405 - 이 페이지에 액세스하는 데 사용되는 HTTP 동사를 허용할 수 없습니다(메서드를 허용할 수 없음). \n 406 - 클라이언트 브라우저가 요청된 페이지의 MIME 형식을 받아들이지 않습니다. \n 407 - 프록시 인증이 필요합니다. \n 412 - 전제 조건이 실패했습니다. \n 413 - 요청 엔터티가 너무 큽니다. \n 414 - 요청 URI가 너무 깁니다. \n 415 - 지원되지 않는 미디어 유형입니다. \n 416 - 요청된 범위를 충족시킬 수 없습니다. \n 417 - 실행하지 못했습니다. \n 423 - 잠금 오류\n\n''5xx - 서버 오류''\n서버에 오류가 발생하여 요청을 완료할 수 없습니다. \n 500 - 내부 서버 오류 \n 500.12 - 응용 프로그램이 웹 서버에서 다시 시작되는 중입니다. \n 500.13 - 웹 서버 사용량이 많습니다. \n 500.15 - Global.asa의 직접 요청을 허용할 수 없습니다. \n 500.16 - UNC 인증 자격 증명이 잘못되었습니다. 이 오류 코드는 IIS 6.0에만 해당됩니다. \n 500.18 - URL 인증 저장소를 열 수 없습니다. 이 오류 코드는 IIS 6.0에만 해당됩니다. \n 500.100 - 내부 ASP 오류 \n\n 501 - 헤더 값이 구현되지 않은 구성을 지정합니다. \n 502 - 웹 서버가 게이트웨이나 프록시 역할을 하는 동안 잘못된 응답을 받았습니다. \n 502.1 - CGI 응용 프로그램이 시간을 초과했습니다. \n 502.2 - CGI 응용 프로그램에서 오류가 발생했습니다. \n\n 503 - 서비스를 사용할 수 없습니다. 이 오류 코드는 IIS 6.0에만 해당됩니다. \n 504 - 게이트웨이가 시간을 초과했습니다. \n 505 - HTTP 버전이 지원되지 않습니다. \n\n\n\n
!Markup\n!!Simple Images\n{{{\n<html> <CENTER>\n<IMG SRC="링크.../icon_christmas_ball.png" width=32>\n</CENTER> </html>\n}}}\n<html> <CENTER>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/icon_christmas_ball.png" width=32> </CENTER>\n</html>\n{{{\n[IMG[링크.../icon_christmas_ball32.png]]\n}}}\n[IMG[http://www.gingaminga.com/wiki/pds/GalleryMacro/icon_christmas_ball32.png]]\n\n\n!!Images Titles/ Links\n{{{\n[IMG[tooltip|링크.../icon_christmas_ball32.png][링크 URL]]\n}}}\n[IMG[tooltip|http://www.gingaminga.com/wiki/pds/GalleryMacro/icon_christmas_ball32.png]]\n\n\n!!Floating Images\nTo clear a float, append...\n{{{\n@@clear:both;display:block; @@\n}}}\n\n\n!!Floating Left...\n{{{\n[<img[http://tiddlywiki.org/fractal.jpg]]\n@@clear:both;display:block; all clear@@\n}}}\n[<img[http://tiddlywiki.org/fractal.jpg]]\n@@clear:both;display:block; all clear@@\n\n\n!!Floating Right\n{{{\n[>img[http://tiddlywiki.org/fractal.jpg]]\n@@float:right;clear:both;display:block; all clear@@\n@@clear:both;display:block; @@\n}}}\n[>img[http://tiddlywiki.org/fractal.jpg]]\n@@float:right;clear:both;display:block; all clear@@\n@@clear:both;display:block; @@\n\n\n'''URL'''\n<nowiki>\n[img[URL of image]]\n</nowiki>\n\n'''URL with alternate text and link'''\n<nowiki>\n[img[alternate text|URL of image][tiddler or URL]]\n</nowiki>\n\n'''HTML'''\n<nowiki>\n<html>HTML code from hosting site</html>\n</nowiki>\n\n참고 ; http://tiddlywiki.org/
출처 ; http://brandog.biz/293 - 2014년 문화예술 트렌드 키워드 '스낵컬쳐(Snack Culture)'\n\n<html> <CENTER>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/스낵컬쳐.jpg" width=240 > </CENTER> </html>\n!@@color(#ffbb00): 이제는 스낵컬쳐의 시대 @@\n문화체육관광부에서 발표한 '2014년 문화예술 새로운 10대 흐름' 중 스낵컬쳐가 유행할 것으로 전망되었습니다. 스낵컬쳐란 가볍고 편하게 즐기는, 짧은 시간에 간편하게 즐기는 문화를 의미하는데요. 스낵컬쳐의 유행이 전망되는 이유는 현대 사회에서 사람들이 문화를 즐기기에 시간이 부족하고, 국내 스마트 폰 보급의 확산으로 사용자 94.2%가 모바일 영상 서비스 등으로 문화를 쉽고 빠르게 즐기는 행동이 보편화되었기 때문이라고 합니다. 따라서, 이번시간에는 스낵컬쳐 트렌드로 시장에 어떠한 변화가 일어나고 있는지 자세히 살펴보려고 합니다.\n\n<html> <CENTER>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/스마트_소설.jpg" width=240 > </CENTER> </html>\n!@@color(#ffbb00): 새로운 장르 스마트 소설 @@\n오늘날 스마트 소설이라는 새로운 장르가 등장하게 되었습니다. 스마트 소설이란 원고지 10~30매 내외의 분량을 지닌 소설로 간결하게 정제된 미학에 중점을 둔 장르입니다. 분명 책이라고 하기에는 너무나 짧은 분량으로 과연 소설이라고 할 수 있을까라는 의문이 들 수도 있지만 스마트 소설만의 매력과 특징으로 대중들을 사로 잡기에 충분하다고 생각이 들며 책의 한 장르로 표현할 만큼 가치가 충분하다고 판단이 됩니다. 그 이유는 짧은 소설이지만 그 속에 담긴 글은 결코 가볍지 않기 때문인데요. 단편의 스마트 소설을 읽고 그 의미에 잠겨 멍한 상태로 눈이 감기는 작품을 만나고 싶다던 소설가 박인성씨의 바람을 구현하기 위해 '스마트 소설'이라는 형식으로 창조되었다고 합니다. 짧은 분량임에도 임팩트 있고 결코 가볍지 않은 스마트 소설은 오늘날 스낵컬쳐의 한 움직임이라고 볼 수 있겠습니다.\n\n<html> <CENTER>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/모바일_게임.jpg" width=240 > </CENTER> </html>\n!@@color(#ffbb00): 쉽고 간편한 모바일 게임 @@\n스낵컬쳐의 움직임을 가장 쉽게 볼 수 있는 것이 바로 스마트폰 어플리케이션인데요. 그 중에서도 쉽고 간편한 모바일 게임을 그 예로 들 수 있겠습니다. 요즘 지하철이나 버스 등 대중 교통 속에서 사람들이 간편한 모바일 게임을 즐기는 것을 쉽게 살펴볼 수 있는데요. 과거 rpg와 같은 스토리 성을 지니며 오랜 시간을 소비해야 하는 모바일 게임에서 오늘날에는 오래 걸리지 않고 간편하게 즐길 수 있는 모바일 게임이 상당한 인기를 끌고 있습니다. 이 모바일 게임이 흥행을 할 수 있었던 이유는 간단한 게임 룰과 지인들과 함께 할 수 있는 시스템 등이 있습니다. 이러한 점이 스낵컬쳐의 한 모습으로 보여지며, 더 나아가서는 한 모바일 게임만을 즐기는 것이 아닌 여러 모바일 게임을 쉽게 즐기며 문화를 소비한다는 점에서 역시 스낵컬쳐의 모습을 살펴 볼 수 있습니다.\n\n<html> <CENTER>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/해바라기쇼핑몰.jpg" width=240 > </CENTER> </html>\n!@@color(#ffbb00): 한꺼번에 즐기는 해바라기한 쇼핑몰 @@\n이제는 복합쇼핑몰에서 쇼핑/놀이/공연을 한꺼번에 즐기는 몰링(Malling) 쇼핑몰이 큰 인기를 끌고 있습니다. 신생아부터 초등학생까지의 어린이들을 대상으로 한 키즈테마파크 등의 다양한 컨텐츠가 생성되면서 30~40대의 엄마들의 마음을 사로잡고 있습니다. 어린이들을 위한 다양한 시설은 몰론 세련된 쇼핑까지 원스톱으로 가능한 복합쇼핑몰은 많은 사람들의 발걸음을 옮기고 있는데요. 이러한 현상 역시 스낵컬쳐의 트렌드로 쉽고 간편하게 그리고 다양하게 문화를 즐기고 싶어하는 소비자들의 니즈가 투영된 것이라고 생각이 됩니다.\n\n<html> <CENTER>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/데이캠핑.jpg" width=240 > </CENTER> </html>\n!@@color(#ffbb00): 부담이 없는 '데이 캠핑' @@\n도심 속에서 벗어나 자유롭게 캠핑을 즐기고 싶어하는 사람들이 늘어가고 있는데요. 그러나 캠핑을 가려면 기본적으로 1박을 하며 많은 계획을 세우고 가야 한다는 인식이 강했었습니다. 이러한 인식이 이제는 바뀌기 시작하였는데요. 그것이 바로 '데이 캠핑'입니다. 데이 캠핑은 야외에서 밤을 보내지 않는 무박 여행으로 매트리스, 취사 도구 등 최소한의 캠핑 용품만 챙겨 가볍게 떠날 수 있다는 점에서 많은 사람들에게 사랑을 받고 있습니다. 이에 따라 한강이나 도심 근처의 산, 계곡에 데이 캠핑을 즐길 수 있는 여건이 마련이 되었으며 스낵컬쳐의 트렌드 중 하나로 문화를 쉽고 간편하게 즐길 수 있는 분위기가 조성이 된 것이라고 할 수 있습니다. \n\n지금까지 스낵컬쳐란 무엇이며 스낵컬쳐의 트렌드로 어떠한 모습이 펼쳐지고 있는지 살펴보았는데요. 문화를 간편하고 쉽게 즐기려는 소비자들이 늘어남에 따라 그들을 사로잡기 위해서는 간편하면서도 임팩트가 있는 특징이 있어야겠다는 생각이 드네요. 이상 포스팅을 마치겠습니다.\n\n\n
출처 ; http://ektha307.com.ne.kr/tags/tag_abc01.html\n| !형 식 | !구 성 | !내 용 |\n|>|>|>| |\n|>|>|!문서의 기본 구조를 나타내 주는 태그 |\n|<HTML> |<HTML>...</HTML> |HTML 언어로 작성되어 있다는 것을 알려줍니다. |\n|<HEAD> |<HEAD>...</HEAD> |Heading의 준말로 글의 머리말에 해당합니다. |\n|<BODY> |<BODY>...</BODY> |본문에 해당하는 부분을 알려줍니다. |\n|<TITLE> |<TITLE>...</TITLE> |타이틀바에 새겨질 글자를 정의합니다. |\n|<Hn> |<Hn>...</Hn> |표제 부분에 들어갈 말을 정의합니다.<br> 1~6까지의 숫자를 사용하고 숫자가 커질수록 표제는 작아집니다. 기본값은 H4입니다. |\n|<STYLE> |<div style="...">...</div> |@@style 정보(글꼴, 색상, 너비, 높이 등)를 규정하는 태그로, 주로 css 문서에서 사용.@@ |\n| |>|Inline Style Sheet는 HTML 태그의 style 속성에 코드를 넣어 적용시키는 방법 <br> <p style="color:gray;">이 문단의 색상은 회색으로 지정됩니다.</p> <br> <div style="height:50px; background-color: #F0FFF0"> 배경색이 지정된 예제</div> |\n|<!-...-> |<!-주석내용-> |주석을 달거나 잠시동안 이미지를 보이지 않게 할 때 사용합니다. |\n|>|>|>| |\n|>|>|!문단 혹은 줄을 바꾸는 태그 |\n|<P> |<P> |문단을 바꾸는 태그입니다. 줄바꿈과 동시에 줄을 띤 것같은 효과가 나타납니다. |\n|<BR> |<BR> |문단을 바꾸는 태그입니다. 줄바꿈의 역할만을 수행합니다. |\n|<PRE> |<PRE>...</PRE> |여백이나 줄간격 등을 고정시켜 주는 역할을 합니다. |\n|>|>|>| |\n|>|>|!글자의 크기를 마음대로 조절하는 태그 |\n|<FONT> |<FONT SIZE=n> ...</FONT> |글자의 크기를 마음대로 조절해 줍니다. <br> 뒤의 숫자는 1~7이며 7이 가장 큰 크기입니다. 기본값은 3입니다. |\n|>|>|>| |\n|>|>|!선그리기 태그 |\n|<HR> |<HR ALIGN= WIDTH= SIZE=> |입체적인 선을 그려줍니다. <br> ALIGN은 선의 정렬을, WIDTH는 선의 폭을, SIZE는 선의 높이를 정해줍니다. |\n|~|<HR align=center SIZE=2 width="20%"> |size ; 입력한 크기만큼의 높이를 설정 <br> width ; 입력한 크기만큼 넓이를 설정 (크기를 픽셀 단위로 지정할 수 있고, 웹브라우저의 넓이에 대한 비율(%)로 지정할 수도 있다. <br> align ; 정렬 방식 (left, right, center) <br> color ; 선의 색상을 설정 <br> noshade ; 입체감이 없는 선을 만듦 |\n|>|>|>| |\n|>|>|!이미지 맵을 처리하는 태그 |\n|<ISMAP> |<IMG SRC= "..." ISMAP> |이미지맵을 정의합니다. |\n|<MAP> |<MAP NAME=...> ...</MAP> |넷스케이프2.0에서 이미지맵을 정의합니다. |\n|>|>|>| |\n|>|>|!목록을 정리해 주는 태그 |\n|<LI> |<UL>...</UL> |순서가 없는 목록으로 일반적인 나열을 말합니다. |\n|~|<OL>...</OL> |순서가 있는 목록으로 위에서부터 번호를 매깁니다. |\n|~|<MENU>...</MENU> |메뉴 목록으로 그리길지 않은 문장의 열거에 사용합니다. |\n|~|<DIR>...</DIR> |디렉토리 목록으로 메뉴 목록보다 짧은 문장을 나열합니다. |\n|~|<DL>...</DL> |정의 목록 태그입니다. <LI>가 아닌 <DT>와 <DD>를 사용합니다. |\n|>|>|>| |\n|>|>|!문서를 가운데로 정렬시켜 주는 태그 |\n|<CENTER> |<CENTER>... </CENTER> |전체 문장을 가운데로 정렬시켜 줍니다. |\n|>|>|>| |\n|>|>|!인용하기 태그 |\n|<BLOCKQUOTE> |<BLOCKQUOTE>... </BLOCKQUOTE> |문장 내에서 인용을 할 경우 들여쓰기를 한 후 인용구로 처리합니다. |\n|>|>|>| |\n|>|>|!글자의 모양을 정의해 주는 태그 |\n|<STRONG> |<STRONG>...</STRONG> |굵은 글씨를 나타내 주는 태그입니다. |\n|<B> |<B>...</B> |~|\n|<EM> |<EM>...</EM> |이탤릭체의 글씨를 나타내 주는 태그입니다. |\n|<I> |<I>...</I> |~|\n|<KBD> |<KBD>...</KBD> |타자기체의 글씨를 나타내 주는 태그입니다. |\n|<CODE> |<CODE>...</CODE> |~|\n|<TT> |<TT>...</TT> |~|\n|>|>|>| |\n|>|>|!배경 이미지 작업하기 |\n|<BODY> |<BODY BACKGROUND="..."> |배경 이미지를 띄워줍니다. |\n|~|<BODY BGCOLOR="#nnnnnn"> |배경 색깔을 지정해 줍니다. |\n|>|>|>| |\n|>|>|!그밖의 태그들 |\n|<DFN> |<DFN>...</DFN> |정의되어지는 단어에 대한 것을 말합니다. |\n|<CITE> |<CITE>...</CITE> |책이나 사진 등의 제목을 말할 때 쓰입니다. |\n|<SAMP> |<SAMP>...</SAMP> |컴퓨터상에 메시지를 나탈낼 때 쓰입니다. |\n|<VAR> |<VAR>...</VAR> |이탤릭체로 표현됩니다. |\n|<SUB> |<SUB>...</SUB> |첨자에 관한 태그입니다. |\n|<SUP> |<SUP>...</SUP> |윗첨자를 나타냅니다. |\n|<BASEPOINT> |<BASEPOINT>... <BASEPOINT> |기본적으로 미리 약속된 크기를 다시 정할 때 사용합니다. |\n|>|>|>| |\n|>|>|!부분을 강조해 주는 태그 |\n|<BLINK> |<BLINK>...</BLINK> |글자를 깜박이게 해줍니다. |\n|<U> |<U>...</U> |글자에 밑줄을 그어줍니다. |\n|>|>|>| |\n|>|>|!연결하기 태그 |\n|<A> |<A HREF="...">...</A> |다른 홈페이지와 연결시켜 줍니다. |\n|~|<A NAME="...">...</A> |자신의 홈페이지 내에서 연결해 줍니다. |\n|>|>|>| |\n|>|>|!주소 및 편지 서비스 |\n|<ADDRESS> |<ADDRESS>... </ADDRESS> |주소에 대한 정의를 내려줍니다. |\n|<MAILTO> |<A HREF="MAILTO..."> |편지쓰기 창을 띄워 줍니다. |\n|>|>|>| |\n|>|>|!색상 지정하기 |\n|<BODY> |<BODY TEXT= "#nnnnnn">...</BODY> |글자색을 지정합니다. |\n|~|<BODY LINK= "#nnnnnn">...</BODY> |하이퍼링크의 색을 지정합니다. |\n|~|<BODY VLINK= "#nnnnnn">...</BODY> |한 번 누른적이 있는 하이퍼링크의 색을 지정합니다. |\n|~|<BODY ALINK= "#nnnnnn">...</BODY> |누르고 있는 동안의 색을 지정합니다. |\n|>|>|>| |\n|>|>|!표 만들기 태그 |\n|<TABLE> |<TABLE BORDER>... </TABLE> |표의 전체 형식을 나타냅니다. |\n|~|<TR><TD></TD></TR> |표 내부에 들어갈 형식을 정의합니다. |\n|~|<TD COLSPAN=n> |가로칸을 n만큼 합쳐줍니다. |\n|~|<TD ROWSPAN=n> |세로칸을 n만큼 합쳐줍니다. |\n|~|<TD ALIGN=...> |표안의 좌우 정렬 방식을 정의합니다. |\n|~|<TD VALIGN=...> |표안의 상하 정렬 방식을 정의합니다. |\n|>|>|>| |\n|>|>|!문서를 임의로 고정시키는 태그 |\n|<NOBR> |<NOBR>...</NOBR> |화면 크기에 따라 문단이 바뀌는 것을 방지합니다. |\n|<WBR> |<WBR>...</WBR> |위의 태그 안에서 문단을 바꿀 때 사용합니다. |\n|>|>|>| |\n|>|>|!CGI 양식 첨가하기 |\n|<FORM> |<FORM>...</FORM> |양식을 정의합니다. |\n|~|<FORM METHOD="..." ACTION="..."> |양식의 방법을 정의합니다. |\n|<TEXTAREA> |<TEXTAREA NAME="..." ROWS="..."> |글틀 상자를 정의합니다. |\n|<INPUT> |<INPUT TYPE="..."> |어떤 형태로 입력할 것인지를 정의합니다. |\n|~|<INPUT TYPE="RADIO"> |라디오 단추를 만들어줍니다. |\n|~|<INPUT TYPE= "CHECKBOX"> |체크 상자를 만들어 줍니다. |\n|~|<INPUT TYPE= "SUBMIT"> |제출 버튼을 만들어 줍니다. |\n|~|<INPUT TYPE="RESET"> |취소 버튼을 만들어 줍니다. |\n|<SELECT> |<SELECT NAME="..."> |선택 사항 상자를 만들어 줍니다. |\n|>|>|>| |\n|>|>|!창만들기 태그 |\n|<FRAME> |<FRAMESET>... </FRAMESET> |창의 기본 틀을 지정합니다. |\n|~|<FRAMESET ROW= "숫자 혹은 %"> |위 아래로 나눠줍니다. |\n|~|<FRAMESET COLS= "숫자 혹은 %"> |좌우로 나눠줍니다. |\n|~|<FRAME SRC="..." MARGINWIDTH="..."> |창에 들어갈 좌우 여백을 정의합니다. |\n|~|<FRAME SRC="..." MARGINHEIGHT="..."> |창에 들어갈 상하 여백을 정의합니다. |\n|~|<FRAME SCROLLING= "...> |스크롤바를 설정해 줍니다. |\n|~|<NOFRAMES>... </NOFRAMES> |프레임이 안보이게 해줍니다. |\n|>|>|>| |\n|>|>|!이미지 다루기에 필요한 태그 |\n|<IMG> |<IMG SRC="..."> |이미지를 정의해 줍니다. |\n|~|<IMG SRC="..." ALIGN=...> |이미지의 정렬 상태를 나타내 줍니다.<br> <img src="파일명" align="top/middle/bottom"> |\n|~|<IMG SRC="..." WIDTH="..." HEIGHT="..."> |이미지의 크기를 조절해 줍니다. |\n|~|<IMG SRC="..." LOWSRC="..."> |이미지를 JPEG파일로 나타내 줍니다. |\n|~|<IMG SRC="..." VSPACE= HSPACE=> |이미지의 여백을 조절해 줍니다. |\n|~|<IMG SRC="..." BORDER="..."> |이미지의 태두리선을 조절합니다. |\n|~|<IMG SRC="..." ALT="..."> |이미지가 전송되지 않았을 경우에 글자로 대처해 줍니다. |\n\n \n
|width:250px; !Example | !Example Markup |h\n| how the example markup renders | what to enter as tiddler text |\n|>| ![[Basic Text Formatting|Basic Formatting]] |\n|''bold''|{{{''bold''}}} (two __single__-quotes) |\n|//italics//|{{{//italics//}}} |\n|''//bold italics//''|{{{''//bold italics//''}}} |\n|__underline__|{{{__underline__}}} |\n|--strikethrough--|{{{--strikethrough--}}} |\n|super^^script^^|{{{super^^script^^}}} |\n|sub~~script~~|{{{sub~~script~~}}} |\n|@@highlight@@|{{{@@highlight@@}}} |\n|foo -- bar|{{{foo -- bar}}} -- two dashes create an Em dash|\n|>| ![[Avoiding Wikification|Suppressing Formatting]] |\n|to output text as-is (escaping), enclose it in three double quotes or use the {{{<nowiki>}}} markup|>|\n|"""plain//text""" |{{{"""plain//text"""}}}|\n|<nowiki>not__wikified</nowiki>|{{{<nowiki>not__wikified</nowiki>}}}|\n|>| ![[Headings]] |\n|start a new line with one or more exclamation points to create headings |>|\n|<html><h1>Heading 1</h1><h2>Heading 2</h2><h3>Heading 3</h3><h4>Heading 4</h4><h5>Heading 5</h5></html>|{{{!Heading 1}}}<br />{{{!!Heading 2}}}<br />{{{!!!Heading 3}}}<br />{{{!!!!Heading 4}}}<br />{{{!!!!!Heading 5}}}|\n|>|![[Lists]]|\n|>| [[Ordered Lists|Lists]] |\n|<html><ol><li>item one</li><li>item two<ol><li>level two<ol><li>level three</li></ol></li></ol></li></ol></li></ol></html>|{{{#item one}}}<br/>{{{#item two}}}<br/>{{{##level two}}}<br/>{{{###level three}}}|\n|>| [[Unordered Lists|Lists]] |\n|<html><ul><li>item one</li><li>item two<ul><li>level two<ul><li>level three</li></ul></li></ul></li></ul></html>|{{{*item one}}}<br/>{{{*item two}}}<br/>{{{**level two}}}<br/>{{{***level three}}}|\n|>| [[Definition List|Lists]] |\n|<html><dl><dt>term</dt><dd>definition</dd></dl></html>|{{{;term}}}<br />{{{:definition}}}|\n|>| [[Mixed Lists|Lists]] |\n|<html><ol><li>ordered<ul><li>unordered<dl><dt>term</dt><dd>definition</dd></dl></li></ul></li></ol></html>|{{{# ordered}}}<br />{{{#* unordered}}}<br />{{{#*;term}}}<br />{{{#*:definition}}}|\n| ![[Blockquotes]] |>|\n| [[Nested Blockquotes|Blockquotes]] |>|\n|<html><blockquote>blockquote<blockquote>level two<blockquote>level three</blockquote></blockquote></blockquote></html>|{{{>blockquote}}}<br />{{{>>level two}}}<br />{{{>>>level three}}}|\n|>| [[Multi-line Blockquotes|Blockquotes]] |\n|<html><blockquote>multi-line<br/>blockquote</blockquote></html>|{{{<<<}}}<br />{{{multi-line}}}<br />{{{blockquote}}}<br />{{{<<<}}}|\n|>| [[Mixed Blockquotes|Blockquotes]] |\n|<html><blockquote>foo<br><blockquote>inner foo, level 1<br><blockquote>inner foo, level 2<br></blockquote></blockquote>more foo<br></blockquote></html>|{{{<<<}}}<br />{{{foo}}}<br />{{{> inner foo, level 1}}}<br />{{{>> inner foo, level 2}}}<br />{{{more foo}}}<br />{{{<<<}}}|\n|>| ![[Code / Monospaced Text|Code]] |\n|>| [[Inline Code|Code]] |\n|{{{monospaced text}}}|<html><code>{{{mono space text}}}</code></html>|\n|>| [[Code Block|Code]] |\n|<html><pre>{{{<br/>multi-line<br/>code block<br/>}}}</pre></html>|<html><code>{{{</code></html><br/>{{{multi-line}}}<br/>{{{code block}}}<br/><html><code>}}}</code></html>|\n| ![[Links]] |>|\n|>| [[Internal Links|TiddlyLink]] |\n|[[formatting]]|{{{formatting}}}|\n|~NoLink|{{{~NoLink}}} -- a tilde {{{~}}} prevents automatic ~WikiWord links|\n|[[Plain Link]]|{{{[[Plain Link]]}}}|\n|[[Pretty Link|Tiddler Name]]|{{{[[Pretty Link|Tiddler Name]]}}}|\n|>| [[External Links|External Link]] |\n|A valid URL is automatically rendered as an external link.|>|\n|http://www.tiddlywiki.com|{{{http://www.tiddlywiki.com}}}|\n|[[Pretty External Link|http://www.tiddlywiki.com]]|{{{[[Pretty External Link|http://www.tiddlywiki.com]]}}}|\n|>| ![[Filesystem Links|Links]] |\n|You can, of course, use file system links both as plain or pretty links.|>|\n|''Windows Network Path''|{{{[[file://///server/share]]}}}|\n|''Windows Local''|{{{[[file:///c:/folder/file]]}}}|\n|''Linux/Unix Local''|{{{[[file:///folder/file]]}}}|\n|''Relative Path (Subfolder)''|{{{[[folder/file]]}}}|\n|>| ![[Images]] |\n|In general, image files are external to a TiddlyWiki.|>|\n|[img[http://www.tiddlywiki.com/favicon.ico]]|{{{[img[path/image.jpg]]}}}|\n| aligned right [>img[http://www.tiddlywiki.com/favicon.ico]]|{{{[>img[path/image.jpg]]}}}|\n|[<img[http://www.tiddlywiki.com/favicon.ico]] aligned left|{{{[<img[path/image.jpg]]}}}|\n|w/ internal link [>img[http://www.tiddlywiki.com/favicon.ico][TiddlyWiki]]|{{{[img[path/image.jpg][TiddlerName]]}}}|\n|w/ external link [>img[http://www.tiddlywiki.com/favicon.ico][http://www.tiddlywiki.com]]|{{{[img[path/image.jpg][TiddlyWiki|http://www.tiddlywiki.com]]}}}|\n|>| ![[Gradients|gradient]] |\n|<<gradient horiz #faa #afa #aaf>> __vert__ical or __horiz__ontal<br> see [[gradient macro|http://tiddlywiki.org/#[[gradient (macro)]]]]>>|{{{<<gradient horiz #faa #afa #aaf>>wiki text>>}}}|\n|>| ![[Tables]] |\n|<<tiddler HTML_TABLE>>|<<tiddler HTML_TABLE_MARKUP>>|\n|>|<<tiddler HTML_TABLE_RULES>>|\n|>| ![[Custom Styles|CSS Formatting]] |\n|>|a {{{@@highlight@@}}} element can accept CSS syntax to directly style text.|>|\n|@@color:green;green coloured@@|{{{@@color:green;green coloured@@}}}|\n|>| ![[Custom CSS Class Wrapper|CSS Formatting]] |\n|>|You can define a custom css class wrapper, like {{{.button}}} below. By default, the inner text is placed inline into a {{{<span>}}} of said class(s). If you start and end the inner text with a newline, the content is placed in a {{{<div>}}}. Use the StyleSheet to define the css styles applied to the class.|\n|<br>{{button title{Click!}}}|<html><pre>{{button title{Click!}}}</pre></html>|\n|>| ![[Embedded HTML|HTML Formatting]] |\n|<html><span style="padding-right:30px;font-size:2em;">any</span><br /><b>valid</b> <em>xhtml</em></html>|<html><code style="font-weight:bold"><html></code></html>{{{<span style="padding-right:30px;font-size:2em;">any</span><br /><b>valid</b> <em>xhtml</em>}}}<html><code style="font-weight:bold"></html></code></html>|\n|>| [[Embedded <iframe>|HTML Formatting]] |\n|<html><iframe height="200px" width="300px" src="http://www.youtube.com/embed/Cj6ho1-G6tw?vq=hd720" frameborder="0" allowfullscreen/></html>|<html><code style="font-weight:bold"><html></code></html>{{{<iframe src="http://the.url"/>}}}<html><code style="font-weight:bold"></html></code></html>|\n|>| ![[Line Break|Line Breaks]] |\n|handy for entering multi-line content into table cells or lists|>|\n|a<br>b|{{{a<br>b}}} or {{{a<br/>a}}} or {{{a<br />a}}}|\n|>| ![[Horizontal Rules]] |\n|before<hr>after|{{{<hr>}}} or <br>{{{----}}} on its own line|\n|>| ![[HTML Entities]] |\n|>|You can use HTML entities...|\n|ɸ™ |{{{ɸ™}}}|\n| ![[Macros]] |>|\n|>|macros are called by enclosing the macro name in {{{<<}}} and {{{>>}}}|\n|<<version>> |{{{<<version>>}}}|\n|>| ![[Hidden Text|Basic Formatting]] |\n|This is hidden: |{{{This is hidden: /% secret comment %/}}}|\n\n!See also...\n[[formatting]]\n[[Images]]\n[[Testing]]
'formatting' 에 관한 글을 작성해 주세요.
원문 ( http://itxcloud.tistory.com/127 ) 요약\n\n''서버 가상화 (Server Virtualization)란''\n기존의 물리 서버 환경의 컴퓨터 네트워크 관리자는 하나의 어플리케이션 또는 태스크에 하나의 전용 서버를 할당함으로써 애플리케이션에서 발생하는 문제의 원인을 쉽게 발견할 수 있었으며, 더불어 네트워크 구성 또한 용이하였다.\n하지만, 이러한 방식은 몇 가지 문제를 유발하는데\n하나는 고집적 CPU의 파워를 충분히 활용하지 못한다는 점이며\n다른 하나는 컴퓨터 네트워크 규모가 커지고 복잡해짐에 따라, 서버가 점유하는 물리적 공간은 급증하고 동시에 이러한 서버랙들로 꽉찬 데이터센터는 엄청난 전력을 소비함과 동시에 열을 발생시킨다는 점이다.\n\n서버 가상화는 이러한 이슈들을 한 번에 해결하고자 시도되었다.\n하나의 물리 서버는 여러 개의 가상 머신으로 전환될 수 있으며, 각각의 가상 서버는 마치 독립적인 물리 서버처럼 동작한다.\n또한 자체 운영시스템을 구동할 수 있으므로, 이론상으로는 물리 서버의 실제 처리 능력을 최대한 활용할 수 있는 만큼의 개수에 해당하는 가상 서버를 생성할 수 있다.\n\n''서버 가상화를 도입하는 이유''\n...\n\n''서버 가상화의 종류''\n...\n\n''서버 가상화의 한계''\n서버 가상화가 주는 해택은 너무도 매력적이어서, 모든 기술에는 한계가 있다는 사실을 종종 잊어버리게 한다. \n서버 가상화는 도입 전 반드시 자체 네트워크 아키텍쳐와 필요 사항, 도입 예정인 서버 가상화 기술을 면밀히 검토해야 한다.\n\nCPU 점유률이 높은 애플리케이션의 전용 서버에 있어서 가상화는 큰 도움이 되지 않을 수도 있다. 가상화는 본질적으로 물리 서버의 처리능력을 여러 개의 가상 서버에 나누어 사용하기 때문에, 애플리케이션의 요구환경에 미달할 경우 문제가 발생할 수 있다.\n최악의 경우 서버의 처리능력을 넘어서게 되면 시스템이 다운될 가능성도 있다. 따라서 네트워크 관리자는 사전에 CPU 사용량을 자세히 검토해야 한다.\n\n하나의 물리 서버에 지나치게 많은 가상 서버들을 생성하여 서버의 CPU에 과부하를 일으키는 것은 그다지 현명한 일이 아니다. 하나의 물리 서버에는 구동하는 가상 서버가 많아지면 많아질수록, 각각의 가상 서버가 사용할 수 있는 처리 능력은 줄어들게 되며, 물리 서버의 디스크 사용량 또한 동일한 문제를 일으킬 수 있다.\n\n또 다른 문제는 마이그레이션인데, 현재는 하나의 물리 서버에서 구동되는 가상 서버를 마이그레이션할 수 있는 전제조건은 동일한 제조사의 프로세서를 사용해야 한다는 것이다. 만일 동일한 네트워크 상에 있는 인텔 프로세서를 사용하는 서버에서 AMP 프로세서를 사용하는 가상 서버를 포팅하고자 한다면, 이는 불가능하다.\n\n가상 서버의 마이그레이션이 왜 필요한가? 만일 하나의 물리 서버에 대한 유지보수가 필요할 경우, 다른 물리 서버로 가상 서버를 포팅하는 것이 애플리케이션 다운타임을 최소화 할 수 있기 때문이다. 마이그레이션은 선택사항이 아니다. 하나의 물리서버에서 구동되는 가상 서버의 모든 애플리케이션들은, 유지보수 시에는 서비스가 불가하게 될 것이다.\n\n이러한 제약사항에도 불구하고 많은 기업들은 서버 가상화에 대한 투자를 지속하고 있다. 서버 가상화 기술이 발전하게 되면, 대규모 데이터센터가 필요하지 않는 상황이 발생할 수도 있다. 서버의 전력 소비량과 열 발생량 또한 감소하게 되면, 자원 활용에 대한 효율성 뿐만 아니라, 그린 IT에 대한 니즈 또한 충족시킬 수 있다.
※ 추천 ; CLASS10 규격, 샌디스크 울트라 제품 정도면 무난/ MCL 제품\n\n마쓰시타와 샌디스크, 도시바가 디지털 카메라, 핸드헬드 컴퓨터, PDA, GPS 장치와 같은 휴대용 장치에 사용하기 위해 개발한 플래시 (비휘발성) 메모리 카드 포맷이다.\n\n#. 크기\n| 일반 SD 카드 |주로 디지털카메라 등 |\n| 마이크로 SD 카드 |스마트폰이나 블랙박스 등 |\n\n#. 저장용량에 따라 (logo 표시) - 기기에 따라 인식을 못하는 경우가 있기 때문에 호환성 여부를 확인해야 한다.\n| SD |2G |\n| SDHC |4~32G |\n| SDXC |64G 이상 |\n\n#. 전송속도에 따라 (동그라미 표시가된 숫자) - Class\n| 클래스 2 |초당 2MB |최소 전송속도로 기기와의 환경에 따라 그 이상의 속도가 나올 수 있다 |\n| 클래스 4 |초당 4MB |일반적인 경우 |\n| 클래스 6 |초당 6MB |낮은 클래스를 사용하여 동영상을 촬용할 경우 끊김 현상 발생 |\n| 클래스 10 |초당 10MB |동영상 등 전문적으로 사용할 경우 |\n| UHS |데이타의 최대전송속도 표시 |(U안에 숫자로 표시) |\n클래스 10, UHS 1이라면 초당 전송속도가 최소 10M, 최대 50M\n\n#. 저장방식에 따라\n| TCL | 1개의 셀에 3비트를 저장 |제조원가 및 가격이 저렴 |읽기/쓰기 횟수 약 1,000회 |\n| MCL | 1개의 셀에 2비트를 저장 |TCL보다 가격이 조금 비쌈 |읽기/쓰기 횟수 약 10,000회 |\n| SCL | 1개의 셀에 1비트를 저장 |제조원가 및 가격이 비쌈 |읽기/쓰기 횟수 약 100,000회 |\n\n
원문 ''ETF 란 ETF 투자의 장점, 주의할 점, 투자방법…'' (http://financetech.kr/article/465/ ) 요약\n\nETF의 의미는 기초자산의 수익을 따라가게 구성된 지수(인덱스, index) 펀드로, 우리말로는 상장지수펀드라고 부르고 있다.\n\n지수(Index) 펀드이면서 동시에 상장되어 한 주(한 좌)를 기본 단위로 실시간 거래될 수 있는 펀드입니다.\n펀드이지만 펀드와는 달리 거래소에서 실시간 시장 가격으로 거래 될 수 있다는 점, 또 환매수수료가 없고,\n개별 주식처럼 거래 되기는 하지만, 개별 주식과는 달리 ETF한 주(좌)에 투자를 해도 (기본적으로는 펀드이기 때문에) 여러 주식에 분산 투자한 효과를 낸다는 특징이 있다.\n요약하자면, 지수(Index)를 기초자산으로 추정하는 지수 펀드이면서 주식 시장에서 개별 주식처럼 거래 될 수 있는 것이 ETF이다.\n\nETF 투자의 목적은,\n더도 말고 덜도 말고 시장 평균 수익률 만큼만 수익을 내자는 것이다.\n단기적인 기간 동안 주가지수는 상승과 하락을 왔다 갔다 하지만, 장기적으로는 주가지수는 상승한다. 그렇다면, 주가지수의 변동을 쫓아 가게 만든 ETF역시 장기적으로는 상승할 것이다. 그리고 ETF가 얻는 수익은 주가지수가 얻는 수익률만큼 즉 시장평균수익률 만큼 비례해서 얻게 된다.\n\n!! ETF의 장점\n1. 거래비용이 저렴하다.\n2. 10만원대로 바로 투자를 시작할 수 있다.\n3. 현재 시가대로 매매 할 수 있다.\n4. 시장 흐름을 따르는 투자를 하게 된다.\n\n!! ETF에 투자할 때 주의할 점\n1. 거래량이 많은 ETF에 투자하라\n 현재 거래량이 많은, 그리고 초보자가 접근하기에 좋은 ETF는 삼성투신에서 운영하는 KODEX 펀드이다.\n2. ETF도 원금손실이 발생할 수 있다\n3. 변형 ETF에는 경험이 필요하다\n 종합주가지수 ETF가 아닌 다른 ETF에 투자 할 때는 조심할 필요가 있다. 초보자는 종합주가지수 ETF에 투자 하는 것이 좋다.\n4. ETF의 세 가지 가격에 관심을 기울여라\n\n''ETF의 가격에는 이론NAV, 추적NAV, 거래가격이 있다.''\n이론NAV: ETF가 따르는 지수의 실시간 가격 \n추적NAV: 실시간 추정 ETF 가격 \n거래가격: 추적NAV를 기준으로 수요 공급에 의해 결정되는 거래가격 \n\n여기서 각 가격이 의미하는 바를 깊게 이해할 필요가 없다. 다만, 이론NAV와 추적NAV가 차이가 나는 경우(이를 추적오차율이라고 한다.)와 추적NAV와 거래가격에 차이가 나는 경우(이를 괴리율이라고 한다.)가 있는데, 이 추적오차율 또는 괴리율이 크고 또 자주 발생한다면 ETF투자를 다시 생각해 보아야 한다는 점만은 주의해야 한다.\n추적오차율이 크다는 것은 펀드 구성이 기초자산 지수를 제대로 따라가지 못하도록 구성되었다는 것을 의미하고, 괴리율이 크다는 것은 ETF를 운영 하는 주체에 문제가 있음을 의미하기 때문이다.\n그러나, 추적오차율과 괴리율은 어느 정도는 있을 수 밖에 없는 데, 이는 기초자산 지수를 닮도록 구성한 펀드기이지 기초자산 지수 그 자체는 아니기 때문이다.\n
!!! 1. iSCSI (Internet Small Computer Systems Interface) 란 무엇인가?\nIBM 과 CISCO 가 2000 년 2 월에 Internet Engineering Task Force (IEFT)에 제출한 Storage Network 기술이다. \niSCSI는 SCSI 명령을 TCP/IP 패킷으로 캡슐화하고 IP 네트워크를 통한 블록 데이터 전송을 지원하는 IETF 표준 프로토콜이다. IP 네트워크를 통해 iSCSI 명령을 전송함으로써, 인트라넷을 통해 데이터를 수월하게 전송하고 멀리 떨어진 위치에서도 스토리지를 관리하기 위해 iSCSI를 사용할 수 있다. 도처에 IP 네트워크가 존재하기 때문에, iSCSI를 사용하여 LAN, WAN 또는 인터넷을 통해 데이터를 전송하고, 위치에 상관없는 데이터 스토리지 및 검색을 지원할 수 있다.\n\n\n!!! 2. iSCSI 가 줄수 있는 것은? \niSCSI 는 Local 에서나 원격지에서 서버와 Storage 를 연결되도록하며 편재되어있고, 신뢰성이 있으며 IP Network 의 관리가 쉬운, 고성능의 SAN 에서 사용된다. iSCSI 이전에는 SAN 을 구축하기 위한 유일한 Storage Network 방법으로는 사용자가 각각의 분리된 SAN infrastructure 에 투자해야하는 Fibre Channel 뿐이 없었다. \n\n역사적으로 스토리지는 DAS(direct-attached storage)형태로 전체 네트워크와 독립되어 있었다. 하지만 iSCSI 의 도입으로 사용자는 원격에서도 Database 에 접근이 가능하다. \n가장 큰 영향도 스토리지에 IP Networking 을 이용하여 접근, resources 의 사용이 가능하다는 것이다. 이것은 스토리지 네트워킹의 큰 혁명이라 할 수 있을 것이다. \n\n고성능 및 안정성을 위해 Fibre Channel SAN(storage area network)을 구현하면 원격 백업/저장, 고가용성, 중앙 집중식 관리 등을 포함한 비즈니스 지속성 및 장애 방지 환경을 지원할 수 있다. 하지만, FC는 원시 형태로는 저대역폭의 원거리 IP WAN 네트워크를 통해 쉽게 전송될 수 없으므로 특수 게이트웨이 하드웨어 및 프로토콜이 필요하다.\n\nIP 네트워크를 통해 iSCSI를 사용한다고 해서 FC 네트워크를 대신할 수는 없지만, IP가 연결된 호스트에 트랜스포트를 제공하여 FC 기반 타깃에 액세스할 수 있도록 한다. 이외에도, iSCSI는 IP 기반 네트워크를 통해 격리된 FC SAN 환경을 연결하는 프로토콜로서 다음과 같은 이점이 있다.\n\n • 전세계 IP 네트워크를 통해 먼 거리에서도 FC SAN 환경을 상호 연결할 수 있는 비용 효율적인 솔루션 제공\n • 관리, 보안 및 서비스 품질을 위한 표준 이더넷 기반의 네트워크 프로토콜과 미들웨어의 가용성\n • 네트워크 관리자나 스토리지 관리자에게 필요한 추가 기술이나 교육 없이도 iSCSI를 통해 기존 FC SAN을 확장할 수 있음\n\n기존의 FC 기반 스토리지 리소스를 보다 효율적으로 활용함으로써 iSCSI를 통해 추가적인 가치를 실현할 수 있다. 호스트는 기존 IP/이더넷 네트워크 연결을 활용하여 스토리지 요소에 액세스할 수 있기 때문에, 이제 스토리지의 통합이 보다 쉬워졌으므로 사용률을 훨씬 더 높일 수 있다.\n\n-----\n#. ''DAS (direct-attached storage)'' ; @@color(#04f): 직접 연결 저장 장치@@\nDAS는 컴퓨터나 서버에 직접 연결된 컴퓨터 저장장치로서, 특별한 고려가 되어 있지 않는 한 다른 장치에서 직접 접근이 불가능하다.\n\n#. ''SAN (storage area network)'' ; @@color(#04f): 스토리지 전용 네트웍@@\nSAN[쌘]은 대규모 네트웍 사용자들을 위하여 서로 다른 종류의 데이터 저장장치를 관련 데이터 서버와 함께 연결하는 특수목적용 고속 네트웍(또는 서브네트웍)이다. 대체로, SAN은 한 기업의 전체 컴퓨팅 자원을 연결해 놓은 네트웍의 일부가 된다. SAN은 대개 IBM S/390 메인프레임과 같은 다른 컴퓨팅 자원에 아주 근접하여 밀집해 있게 되는 것이 보통이지만, 그러나 백업이나 기록의 영구보관 저장을 위해 ATM이나 SONET 등과 같은 광역통신망 기술을 이용하여 원거리에 있는 장소로 확장될 수도 있다. \n\nSAN은 서로 다른 종류의 저장장치들이 네트웍 서버를 통한 모든 사용자들에 의해 공유될 수 있도록 서로 연결되어 있는 시스템이다. SAN은 IBM의 광섬유인 ESCON과 같은 기존의 통신기술을 이용하거나, 새로운 파이버 채널 기술을 이용할 수도 있다. SAN 시스템 통합 기술을 가진 일부 회사들은, 이것을 하드디스크나 CD-ROM 플레이어와 같이 서로 다른 종류의 저장 장치들에 의해 공유될 수 있는 PC의 공통 저장 버스에 비유하기도 한다. \n\nSAN은 디스크 미러링, 백업 및 복원, 영구보관 및 영구보관용 데이터의 검색, 한 저장장치에서 다른 저장장치로 데이터 이동, 그리고 네트웍 상의 서로 다른 서버들 간에 데이터의 공유 등을 지원한다. \n
감사 ; http://easyprogramming.tistory.com/23\n\n!! 서론\n 문자열이 란게, 엄청 간단하게 보이면서도, 어떤 프로젝트를 진행하든지 무조건 사용하게 되고, C, JavaScript, Java 등등 여러 언어를 넘나들다 보면 헷갈리는 부분도 많다. 개인적으로 문자열의 깔끔한 처리들을 위해 이 포스트를 작성하게 되었다.\n\n\n!! 본론\n/ 문자 셋(Character Set)\n/ 문자열 처리의 기본 3가지\n/ 기타 문자열에 알아야 할 것들\n\n!!! 문자 셋(Character Set)\n) 1바이트만 쓰는 놈\n 0bit ~ 127bit 까지 ASCII, 128bit ~ 256bit 표준화 한것이 ANSI, CP-949는 128부터 255까지 한글로 맵핑했다는 뜻 \n C/C++ Language - char\n \n2) 1~4바이트 쓰는 놈\n0bit ~ 127bit 까지는 1byte로 저장, 128이상은 2~4byte로 저장 해서 ''ASCII와 호환''이 된다.\n''UTF-8''이 이런 종류의 대표적인 인코딩.\nC/C++ Language - unsigned char(그냥 char 써도 호환이 되긴 하다)\n \n3) 2~4바이트 쓰는 놈\n대표적인 놈이 ''Unicode''. 다만 저장할 때 문제가 될만한게 있다. 예를 들어 H의 유니코드 번호는 U+0048 이고, 보통 저장할 때는 00 48 로 저장한다.(리틀 엔디안) 하지만 48 00 으로 저장하는 빅 엔디안 방법도 있다.\n''Unicode와 ASCII, UTF8은 호환이 거의 안된다.''\nC/C++ Language - wchar_t\n\n\n!!! 문자열 처리의 기본 3가지\n보통 Java나 Python, JavaScript같은 진보된(?) 언어에 대해서는 문자열을 요리하는게 쉽다. 하지만 C/C++ Language 에서는 헷갈리는 부분이 많아서 C/C++ Language 에 편향된 설명을 한다.\n\n++++[ 1. 문자열 생성 및 복사 ]\nC/C++ Langauge에서는 많이 쓰는 문자열 데이터 타입들은 다음과 같다.\n(MFC의 CString, Objective-C 의 NSString, Qt의 QString 같은 클래스들은 쉬우니까 패스!)\n \nchar*\nwchar_t*\nstd::string\nstd:wstring\nTCHAR*(Windows OS를 위한)\n\n''char* 와 std::string''\nstd::string은 char*를 내부에 값으로 가지고 있고, 그 외에 필요한 함수들을 제공하기 때문에 두개는 쉽게 호환이 가능하다.\n \nchar* tmp1 = "test";\nstd::string tmp2 = tmp1;\n \n''wchar_t* 와 std::wstring''도 마찬가지로 쉽게 호환이 가능하다.\n \nwchar_t* tmp3 = "test2";\nstd::wstring tmp4 = tmp3;\n \n하지만 char* 와 wchar_t* 사이의 호환은 쉽게 (=) 대입 연산자로 가능한게 아니다.\n아래 함수를 사용해서 변환이 가장 깔끔할 듯 싶다.\n+++[ 더보기 ]\n{{{\nwchar_t* CharToWChar(const char* pstrSrc)\n{\n int nLen = strlen(pstrSrc)+1;\n\n wchar_t* pwstr = (LPWSTR) malloc ( sizeof( wchar_t )* nLen);\n mbstowcs(pwstr, pstrSrc, nLen);\n\n return pwstr;\n}\n\nchar* WCharToChar(const wchar_t* pwstrSrc)\n{\n\n#if !defined _DEBUG\n int len = 0;\n len = (wcslen(pwstrSrc) + 1)*2;\n char* pstr = (char*) malloc ( sizeof( char) * len);\n \n WideCharToMultiByte( 949, 0, pwstrSrc, -1, pstr, len, NULL, NULL);\n#else\n\n int nLen = wcslen(pwstrSrc);\n\n char* pstr = (char*) malloc ( sizeof( char) * nLen + 1);\n wcstombs(pstr, pwstrSrc, nLen+1);\n#endif\n return pstr;\n}\n}}}\n===\n\nTCHAR*는 컴파일 환경에 따라서 char* 또는 wchar_t*로 자동변환된다. 마이크로소프트에서 만든 거라서 아마 윈도우즈 환경에서만 쓰일것이다.(다국어를 위해서 필수로 알아야 된다.)\n===\n\n++++[ 2. 문자열 조작(오리고 붙이고) ]\n일반 스크립트 언어에서는 오리고 붙이고를 +,- 연산자로 쉽게 가능하지만 이 놈의 C/C++ Language에서 각종 함수들을 사용해야 한다. 또한 char*를 위한 함수랑 wchar_t* 를 위한 함수들이 서로 다르다.\n\n| !설명 | !ANSI | !UNICODE | !TCHAR |\n|문자열 길이 반환 | strlen() | wcslen() | _tcslen() |\n|두 문자열 붙이는 함수 | strcat() | wcscat() | _tcscat() |\n|!사이즈 만큼 이어 붙이기 | !strncat() | !wcsncat() | !_tcsncat() |\n|문자열에서 문자 찾는 함수 | strchr() | wcschr() | _tcschr() |\n|!문자 찾기 (문자열 끝에서 부터 검색) | !strrchr() | !wcsrchr() | !_tcsrchr() |\n|두 문자열 비교 함수 (반환 값(-1, 0, 1)) | strcmp() | wcscmp() | _tcscmp() |\n|!사이즈 만큼 문자열 비교 | !strncmp() | !wcsncmp() | !_tcsncmp() |\n|대소문자를 구별하지 않고 문자열을 비교 | stricmp() | wcsicmp() | _tcsicmp() |\n|사이즈 만큼 대소문자를 구별하지 않고 문자열을 비교 | strnicmp() | wcsnicmp() | _tcsnicmp() |\n|문자열 복사 함수 | strcpy() | wcscpy() | _tcscpy() |\n|!사이즈 만큼 복사 | !strncpy() | !wcsncpy() | !_tcsncpy() |\n|부분 문자열 찾는 함수 | strstr() | wcsstr() | _tcsstr() |\n|문자 찾기 (두번째 인수를 찾고자 하는 문자들의 집합(문자열)으로 구성) | strpbrk() | wcspbrk() | _tcspbrk() |\n|문자열 자르기 (두번째 인수를 집합(문자열)으로 구성 가능), 해당 문자가 NULL로 치환 됨 | strtok() | wcstok() | _tcstok() |\n|문자 치환, 첫째 인수의 모든 문자를 두번째 인수 문자로 변경함), "abc" ⇒ "bbb" | strset() | wcsset() | _tcsset() |\n|사이즈 만큼 문자 치환 | strnset() | wcsnset() | _tscnset() |\n|문자열을 뒤집는 함수 ( "가나다라마" ⇒ "마라다나가" ) | strrev() | _wcsrev() | _tcsrev() |\n|대문자로 치환 | strupr() | wcsupr() | _tcsupr() |\n|소문자로 치환 | strlwr() | wcslwr() | _tcslwr() |\n|표준 출력 파일 스트림에 포멧을 지정하여 출력하는 함수 | printf() | wprintf() | _tprintf() |\n| | sprintf() | swprintf() | _stprintf() |\n|키보드로부터 문자열을 입력받는 함수이다 | scanf() | wscanf() | _tscanf() |\n|메모리로부터 문자열을 입력받는 함수이다 | sscanf() | swscanf() | _stscanf()|\n\n• 화면에 출력되는 길이와 상관없이 문자열을 구성하는 문자의 개수만으로 판단해서 길이를 구해주고\n 제어문자인 '\st', '\sn', '\sr' 같은 문자열도 모두 1개의 문자로 처리되고 문자열의 끝을 의미하는 'NULL 문자'인 '\s0'은 제외.\n\nTCHAR함수의 경우 컴파일시 어떤 종류로 세팅하느냐 에 따라서 _tcslen()이 strlen() 또는 wcslen() 둘중 하나로 자동 변환되기 때문에\n멀티바이트/유니코드 신경 안쓰시고 작업하려면 _stprintf_s 와 같은 TCHAR 함수를 사용.\nsprintf() 함수는 printf() 함수와 사용 방법이 유사하다. \n/ printf() 함수 ; 형식 문자열에 맞게 화면에 출력\n/ sprintf() 함수 ; 화면 대신 문자 배열에 복사하는 기능\n\n\n+++[ 유니코드와 멀티바이트가 호환이되게 코딩하는 법 ]\n출처 ; http://ddangddoo.tistory.com/entry/유니코드와-멀티바이트\n\n1. 모든 문자열 상수는 TEXT()키워드로 감싼다. ex) " 문자열" -> TEXT("문자열")\n2. char -> TCHAR\n3. char* -> LPTSTR\n4. const char* -> LPCTSTR\n\n멀티바이트와 UNICODE console 출력 함수 or 매크로\n\n멀티바이트 출력 : cout / printf\n유티코드 출력 : wcout / wprintf\n멀티바이트/유니코드 출력 : _tprintf\n\n\n일반적으로 사용코드\n\n1.멀티바이트\nchar* message = new char[20];\nsprintf(message, "%s", "문자열");\n\n2.유니코드\nwchar_t* message = new wchar_t[20];\nswprintf(message, L"%s", L"문자열");\n\n3. 멀티바이트/문자열 호환 코드\nTCHAR* widestring = new TCHAR[20];\nwsprintf( widestring, TEXT("%s"), TEXT("문자열));\n===\n===\n\n++++[ 문자열 찾기 ]\nC/C++ Language에서 기본적인 문자열 찾기는 strcmp() 또는 wcscmp()로 가능하다. 하지만 따로 뺀 이유는 ''정규표현식(Regular Expression)'' 이 더 강력한 방법이기 때문이다.\nC/C++에서는 따로 라이브러리를 설치해야 하지만 일반 다른 언어들 보면 기본 내장되어 있는 객체가 있다. 이 정규표현식을 사용하면 함수들을 사용하는 것보다 훨신 깔끔하게 코딩이 가능하다. 하지만 정규표현식을 완벽하게 알기는 어렵다.\n===\n\n\n!!! 기타 문자열에 알아야 할 것들\n''널 문자''\nC/C++ Language로 만든 문자열의 맨뒤에는 무조건 '\s0' 문자가 들어가야 한다.\nchar* tmp1 = "test"; \n의 경우는 '\s0' 문자가 눈에는 안보이지만 자동적으로 들어간다. 간혹 배열로 스트링을 만들 때 꼭 '\s0'을 넣어줘야 한다.\nconst int len = 4;\nchar tmp2[len+1];\nfor(int i=0; i < len; i++)\n{\n tmp2[i] = 'k';\n}\ntmp2[len] = '\s0';\n \n근데 난 이 널문자가 C/C++에서만 중요한 줄 알았다. 아니였다. ''JavaScript도 널 문자를 먹는다''. 스트링 한참 잘 처리하다가 중간에 '\s0' 가 들어가버리면 문자열이 거기서 끝나버린다.\n \n''Windows API''\n예를 들어 CreateDirectory란 함수를 사용하고 컴파일 하다가, "CreateDirectoryW 함수에서 const char* 안 받아요" 라는 오류 메시지가 뜰 때가 있다. 그렇다. Windows 의 내부 API 는 두가지 버전으로 되어 있다.A와 W.\nCreateDirectory 는 TCHAR처럼 컴파일시 CreateDirectoryA와 CreateDirectoryW 두가지 중 하나로 바뀐다. 자신이 char* 만 쓴다면 애초에 CreateDirectoryA로 명시하고 작성하는게 오류 안나고 깔끔하지만 다국어 처리를 위해선 TCHAR와 CreateDirectory 둘다 쓰는게 좋다.\n \n''NSString''\nNSString은 Unicode를 가진다. UTF8아니다.\n\n\n!! 결론\n사실 이런거 다 필요없이 깔끔한 라이브러리들 - CString, NSString, QString - 같은거 쓰거나, 그냥 C/C++를 쓰지말고 다른 언어를 쓰는게 훨신 편하다. 솔직히 C/C++에서 문자열 처리때문에 머리 아프다. 다국어 처리할 때 더 머리 아프다. 하기 싫다. 하지만 어쩔수 없이 해야할 때는 위에 적어 놓은 기초들을 잘 머리에 담아두면 왜 char* 부분에서 오류가 나는지 쉽게 알 수 있다.\n
!!! ▷ OutputDebugString("디버그 테스트"); \n디버그 모드에서 콘솔이 아닌 출력창에 문자열 출력\n / 문자열만 입력이 가능하기 때문에 숫자는 아스키코드로 바꿔주고 (itoa)\n / 자동줄바꿈이 되지 않기 때문에 뒤에 \sn을 넣어준다.\n\n!!! ▷ #pragma 전처리기를 이용해서 subsystem을 정해주는방법\n{{{\n#ifdef _DEBUG\n#pragma comment(linker, "/entry:WinMainCRTStartup /subsystem:console" )\n#endif\n// printf("문자열"); - 문자열을 콘솔창에 표시\n\n#include "stdafx.h"\n...\n\nLONG APIENTRY MainWndProc( HWND hWnd, UINT message, UINT wParam, LONG lParam) \n{\n return TRUE;\n}\n\nint APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)\n{\n... \n return nResult;\n}\n}}}\n\nprintf( "%s", str); - char *, \nprintf( "%S", str); - wchar_t *로 변환해서 출력\n\nTCHAR *str;\n _tprintf(_T(“%s”), str);\n\nwchar_t *str;\nprintf( "%S", str); = printf(“%ws”, str); \n\n\n!!! ▷ AllocConsole();, FreeConsole(); 이용하기\n{{{\nLRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)\n{\n switch(iMessage) {\n case WM_DESTROY:\n FreeConsole();\n PostQuitMessage(0);\n return 0;\n case WM_CREATE:\n AllocConsole();\n printf("Hello, World! in Win32 API Application...\sn");\n return 0;\n }\n return(DefWindowProc(hWnd,iMessage,wParam,lParam));\n// return g_pApp->MsgProc(hWnd, message, wParam, lParam);\n}\n}}}
| 헤더 |stdio.h |\n| 형태 |int printf (const char * format, ... ); |\n| 인수 |char *format 서식 문자열 |\n| 반환 |int 출력된 문자 수를 반환하며 오류가 발생하면 음수를 반환 |\n\nprintf() / sprintf() / fprintf() 함수 속의 퍼센트(%) 기호들은, "Format Specifier" 라고 하는데, 출력 형식을 지정한다.\n\n| !변환 문자열 | !의미 |\n| %o | 8진 정수 형식으로 출력 |\n| %d | 10진 정수 형식으로 출력 |\n| %ld | long형 10진 정수 형식으로 출력 |\n| %x | 16진 정수 형식으로 출력 |\n| %u | 부호 없는 10진 정수 형식으로 출력 |\n| %f | 소수점 형식으로 출력 |\n| %e %E | 지수 형식으로 출력 |\n| %g %G | %e와 %f 중 짧은 쪽, 소수점에 이어지는 0은 생략 |\n| %c | 문자 형식으로 출력 |\n| %S | 문자열 형식으로 출력 cf. %s인 경우 문자 1자만 출력 |\n\n출력 형식을 지정한 예\n| !변환 문자열 | !출력 | !설명 |\n| printf("%d", 123) |123 |표준 출력장치로 출력 |\n| printf("]", 123) |__123 |10진수를 5자리에 맞추어 출력, 123앞에 공백 2개 추가 |\n| printf("%-5d", 123) |123__ |10진수를 5자리에 맞추어 출력, 왼쪽 맞춤, 오른쪽에 공백 추가 |\n| printf("%f", 1.234567) |1.234567 |소수점 형식으로 출력 |\n| printf("O", 1.234567) |1.2346 |소쉄 이하 4자리 출력, 반올림 |\n| printf("%7.2f", 1.234567) |___1.23 |소숫점 포함해서 전체 7자리, 소수점 이하 2자리. 공백 3개가 앞 부분에 추가됩니다. |\n| printf("%S", "forum.falinux.com") |forum.falinux.com |문자열 형식으로 출력 |\n| printf(" S", "forum.falinux.com") |___forum.falinux.com |자릿수를 맞추기 위해 왼쪽에 공백을 넣어 문자열 출력 |\n| printf("S", "forum.falinux.com") |forum.falinux.com |문자열이 더 길면 그대로 출력 |\n| printf("%.10s", "forum.falinux.com") |forum.fali |문자열이 더 길면 잘라서 출력 |\n| printf("%-20s", "forum.falinux.com") |forum.falinux.com___ |문자열을 왼쪽 맟춤으로 하여 오른쪽에 모자르는 자리를 공백으로 메꿈 |\n| printf(".10S", "forum.falinux.com") |__forum.fali |전체 12자리로 10자리만 출력, 모자른 부분은 왼쪽에 공백 추가하여 출력 |\n
++++!!![>왕초보 영단어1]>\n''1강 일상속의 영어 단어''\n++++[2015.01.05.(목)]\n|!둔다 | !put it | |\n|집어 넣는다 |pit it |in |\n|올려 놓는다 |pit it |on |\n|내려 놓는다 |pit it |under |\n|옆에 둔다 |pit it |aside |\n|뒤에 둔다 |pit it |back |\n|거기에 둔다 |pit it |there |\n|여기에 둔다 |pit it |here |\n|치운다 |pit it |away |\n===\n\n===
http://taeyo.net/columns/View.aspx?SEQ=389&PSEQ=23&IDX=4 - WCF - IIS에 서비스 호스팅하기\nhttp://vstarmanv.tistory.com/215 - 너무나 간단한 웹서버 구축 - IIS7.5\nhttp://pyhu26.blogspot.kr/2012/10/wcf-iis_29.html#!/2012/10/wcf-iis_29.html - (WCF) IIS 설정하기 \n\n\n!!! WCF란\n분산 어플리케이션 개발과 플랫폼에 상관없는 높은 상호 운용성을 지원하는 어플리케이션을 쉽게 개발할 수 있도록 해주는 기반 기술로서, XML 웹 서비스(Web Service) 기반의 차세대 서비스 통신 프레임워크이다.\n\nWCF의 클라이언트 및 서비스는 기본적으로 SOAP을 사용하여 통신하며, 서비스의 메타데이터를 전달하기 위한 방식으로 WSDL을 사용한다.\n\ncf. SOAP( Simple Object Access Protocol ) - M/S, IBM 등 주요 밴더들이 주도하여 상호 운영성 문제를 해결하고자 만들어짐 XML과 HTML을 사용하여 플랫폼에 독립적으로 서비스 혹은 분산 객체를 엑세스 하는 방법을 정의 \n\ncf. WSDL - WSDL은 웹서비스 기술언어 또는 기술된 정의 파일의 총칭으로 XML로 기술된다. 웹 서비스의 구체적 내용이 기술되어 있어 서비스 제공 장소, 서비스 메시지 포맷, 프로토콜 등이 기술됨.\n\n\n!!! WCF의 ABC\nA. ''Address''\n 인터넷 상에서 서비스의 위치를 나타내는 URI(Uniform Resource Identifier)\n\nB. ''Binding''\n WCF Service를 Network를 통해 호출할 때 고려해야 할 다양한 요소들의 집합 \n 1. 어떤 프로토콜을 사용할 것인가? 예) TCP, HTTP, FTP, 등 \n 2. 데이터 포맷은 어떤 방식을 사용할 것인가? 예) 바이너리, 텍스트, MIME 등 \n 3. 네트워킹 보안을 적용할 것인가? 적용한다면 어떤 보안 방식을 취할 것인가? 예) SSL, 암호화 등 \n 4. 트랜잭션 처리, 비동기 전송 등의 진보된 기능을 사용할 것인가? \n \nC. ''Contract''\n WCF 서비스가 제공하는 기능들에 대한 인터페이스 \n\n\n!!! End Point\nABC의 요소를 합친 객체.\n반드시 하나 이상의 End Point를 가지며 End Point를 통해서만 서비스를 호출할 수 있음.\n\nWCF 서비스는 반드시 하나 이상의 종점을 갖는다. WCF에서는 클라이언트는 반드시 서비스의 종점을 통해서만 서비스를 호출할 수 있으므로 서비스의 종점을 서비스에 대한 관문 혹은 액세스 포인트 정도로 생각할 수도 있겠다. 실제로 WCF 클라이언트가 WCF 서비스를 호출하기 위해서는 서비스에 대한 종점 객체를 생성해야만 하며, 이 종점 객체는 서비스의 인터넷 주소가 무엇인지, 어떤 바인딩 구성을 사용하는지, 서비스의 계약은 어떠한 가를 모두 명시해야만 한다. \n\n서비스가 하나의 이상의 종점을 갖는다는 말은 곧 WCF 서비스가 2개 이상의 종점을 가질 수 있다는 말이 되겠다. 실제로 하나의 서비스가 HTTP 기반의 바인딩과 TCP 기반의 바인딩을 각각 사용하는 2개의 종점을 가질 수 있으며, HTTP 프로토콜을 사용하는 클라이언트는 HTTP 기반의 종점을 통해서 서비스를 호출하고, TCP 프로토콜을 사용하는 클라이언트는 TCP 기반의 종점을 통해서 서비스를 호출할 수 있다는 것이다. 이점이 WCF의 장점 중 하나이다. \n\n\n!!! 서비스 호스트와 클라이언트 \nWCF를 이용하여 서비스를 구현하면, 이 서비스는 WCF 호스트(host)에 의해 호스팅이 되어야만 클라이언트의 호출을 받을 수 있게 된다. WCF는 서비스가 실제로 클라이언트 호출을 받을 수 있도록 호스팅 환경을 완벽하게 갖추고 있으며, 이 호스팅 환경은 일반 닷넷 EXE 어플리케이션 혹은 IIS를 이용하여 호스팅 될 수 있다. WCF가 제공하는 호스트는 다중 쓰레드 풀(multi-thread pool)을 완벽하게 지원하기 때문에 개발자가 여러 클라이언트의 동시 호출(concurrent call)에 대해 고민하거나 염려할 필요가 전혀 없다. 개발자는 단순히 호스트 객체(ServiceHost 클래스)를 생성하고 Open 메쏘드를 호출하기만 하면 된다. WCF 런타임이 네트워크 포트(port)나 HTTP 프로토콜을 구성하여 클라이언트 메시지를 수신하기 시작할 것이고 수신된 클라이언트 호출은 쓰레드 풀의 쓰레드 중 한 쓰레드에 의해 WCF 서비스가 호출될 것이다. \n\nWCF 클라이언트가 서비스를 호출하는 것 역시 많은 부분 WCF 프레임워크의 도움을 받게 된다. 클라이언트는 서비스의 계약으로부터 서비스가 어떤 메쏘드를 제공하며 그 메쏘드의 매개변수, 반환 값(return value)에 대한 정보를 얻을 수 있다. WCF 런타임과 유틸리티는 서비스의 계약 정보로부터 서비스에 대한 프록시(proxy) 클래스를 생성할 수 있으며, 이 프록시 클래스는 웹 서비스 호출을 마치 로컬 메쏘드 호출과도 같이 간단한 작업으로 만들어 줄 수 있게 된다. \n\nWCF 클라이언트가 프록시를 생성하는 작업 외에 추가적으로 수행해야 할 것은, WCF 런타임이 적절히 서비스를 찾고 XML 메시지를 전송할 수 있도록 호출하고자 하는 서비스의 종점에 대한 정보를 제공하는 것이다. 다시 말해 서비스에 대해 어떤 주소와 어떤 바인딩을 사용해야 하는가를 WCF 런타임에게 알려주어야 하는 것이다. 정확한 주소가 있어야만 해당 서비스에게 메시지가 전달될 것이고, 메시지를 전달할 프로토콜, 보안 사용 여부 등이 서비스가 이해할 수 있는 것이어야 하므로 서비스가 제공하는 바인딩과 동일한 바인딩을 클라이언트가 사용해야 한다.\n
-. 현재 대부분의 MO 게임은 캐릭터 작업과 캐릭터 및 성별(남,녀)이 매칭된 형식\n\n-. C9은 캐릭터 선택한 후에 캐릭터를 커스터마이징으로 새로운 캐릭터를 만들어 낼 수 있을 정도의 커스터 마이징 항목을 제공.\n (MMO 형식의 커스터마이징)\n\n-. 드레곤네스트와 마영전의 경우에는 신장이나 얼굴 표정과 생상 변경 정도로 기본 캐릭터성에서 변경이 어려움.\n\n-. C9의 경우 남녀와 청순 그리고 섹세 정도등의 캐릭터성을 가지나 캐릭터가 실사적인 경우이며\n 마영전과 드레곤네스트의 경우에는 캐릭터성을 극도로 강조한 경우로 사실성에서 벗어난 경우.\n\n-. HG2의 캐릭터성이 사실성에 기반을 두는지 여부가 구성의 기준\n / 사실적, 실사풍의 캐릭터 -> C9과 같은 디데일한 커스터마이징 제공\n / 극도로 강조된 캐릭터 -> 마영전, 드레곤네스트와 같은 제한적인 커스터마이징 제공\n\n++++!!![파츠구분]\n| 캐릭터 장비 | C9| 머리 | 어깨 | 상의 | | 하의 | 장갑 | 신발 | 주무기|보조 무기 | |\n|~| 드레곤네스트(일반)| 머리 | | 상의 | | 하의 | 장갑 | 신발 | 무기|보조 무기 | |\n|~| 드레곤네스트(코스튬)| 머리 | | 상의 | | 하의 | 장갑 | 신발 | 무기|보조 무기 | |\n|~| 영웅전| 머리 | | 가슴 | 벨트 | 다리 | 손 | 발 | 무기|방패 | |\n|~| HG| 머리 | 어깨 | 상체 | 허리 | 다리 | 손 | 발 | 왼손 무기|오른손 무기 |X 3개 Set |\n|~| HG2(일반)| 머리 | 어깨 | 상의 | 벨트 | 하의 | 장갑 | 신발 | 주무기|보조 무기 | |\n|~| HG2(코스튬)| 머리 | 어깨 | 상의 | 벨트 | 하의 | 장갑 | 신발 | 주무기|보조 무기 | |\n| |\n| 장신구 | C9| 목걸이 | 귀걸이(1) | 팔찌 | 벨트 | 반지(2) | | | | | |\n|~| 드레곤네스트(일반)| 목걸이 | 귀걸이(1) | | | 반지(2) | 문장 | | | | |\n|~| 드레곤네스트(코스튬)| 목걸이 | 귀걸이(1) | | | 반지(2) | | 정령 | 날개 | 꼬리 | 데칼 |\n|~| 영웅전| | | | | 반지(2) | 장신구 |>|>|>|(귀걸이, 목걸이, 장신구, 징표 중 택 1) |\n|~| HG| 목걸이 | | 팔찌 | | 반지 | 엘릭시르(영약) | 코스튬 <br> _가면 | 코스튬 <br> _전신 방어구 | | |\n|~| HG2(일반)| 목걸이 | 귀걸이(1) | 팔찌 | | 반지(2) | | | | | |\n|~| HG2(코스튬)| 목걸이 | 귀걸이(1) | 팔찌 | | 반지(2) | | | | | |\n cf. 영웅전의 장신구 ; 귀걸이, 목걸이, 장신구, 징표 중 택 1\n===\n\n++++!!![커스터마이징]>\n++++[C9 ; 작업과 캐릭터 매칭]\n| 기본 | 캐릭터 이름| |\n|~| 캐릭터 작업|헌터 - 남 <br> 샤먼 - 여 <br> 위치블레이드 - 여 <br> 파이터 - 남 |\n|~| 얼굴선택|헌터(샤프남, 강인남, 야성남) <br> 샤먼(창순녀, 도도녀, 발랄녀) <br> 위치블레이드(섹시녀, 냉혈녀, 매혹녀) <br> 파이터(강인남, 터프남, 정열남) |\n|~| 얼굴스타일|1번 얼굴 스타일 <br> 2번 얼굴 스타일 <br> 3번 얼굴 스타일 |\n|~| 피부 색상| |\n| 얼굴 |>|눈크기 조정, 눈썹 조정, 코높이 조정, 코넓이 조정, 입크기 조정, 입술 두께 조정, 턱 조정, 아래턱 조정, 광대뼈 조정, 입술 색상, 눈동자 색상 |\n| 스타일 |>|헤어선택, 헤어 생상, 헤어 길이1, 헤어 길이2, 헤어 길이3, <br> 문신 선택, 문신 크기, 문신 위치1, 문신 위치2 |\n| 신체 |>|전체, 머리, 어깨, 가슴(여자 캐릭터만), 허리, 팔, 다리, 손, 발 |\n===\n\n++++[드레곤네스트]\n / 머리(형태와 색상 변경), 얼굴(표정과 생상 변경), 눈(색상 변경), 상체(상의 디자인 변경), 하체(하의 디자인 변경), 장갑(장갑 디자인 변경), 부츠(신발 디자인 변경)\n===\n\n++++[영웅전 ; 작업과 캐릭터 매칭]\n / 캐릭터 이름, 키(캐릭터 신장 설정), 가슴(캐릭터 가슴 크기 설정), 헤어 스타일 선택, 피부색 선택, 길이(?), 색상 선택(헤어, 끈, 장식), 표정(얼굴 표정 선택)\n===\n\n++++[HG]\n| 기본 |>| 캐릭터 이름|\n|~| 성별 |남/ 여 |>| cf.수호기사 남/ 수호기사 여 |\n|~| 직업 |Faction Class | Templar | Hunter | Cabalist |\n|~|~|Character Race | Guardian 수호기사, Blademaster 검기사, Exemplar 성기사 | Summoner 악마술사, Evoker 암흑술사, Metamorph 변신술사 | Engineer 기술요원, Marksman 전투요원, Recon 정찰요원 |\n| 신체 |>| 얼굴 |>|>|1 ~ 12가지 |\n|~|>| 머리모양 |>|>|1 ~ 12가지 |\n|~|>| 수염 |>|>|1 ~ 14가지 |\n|~|>| 피부색 |>|>|6X6 = 36가지색 팔레트 형식, 선택 |\n|~|>| 머리색 |>|>|6X6 = 36가지색 팔레트 형식, 선택 |\n|~|>| 키 |>|>|슬라이드바 형식으로 설정 |\n|~|>| 체격 |>|>|슬라이드바 형식으로 설정 |\n|~|>|>|>|>|▷ 무작위 설정 지원 |\n===\n\n+++[HG2 ; 직업과 캐릭터 매칭]\n| 기본 | 캐릭터 이름|\n|~| 캐릭터 직업|수호기사 - 남 <br> 검기사 - 여 <br> 전투요원 - 남 <br> 기술요원 - 여 <br> 암흑술사 - 남 <br> 악마술사 - 여 |\n|~| 얼굴선택|수호기사(샤프남, 강인남, 야성남) <br> 검기사(청순녀, 도도녀, 발랄녀) <br> 기술요원(섹시녀, 냉혈녀, 매혹녀) <br> 전투요원(강인남, 터프남, 정열남) <br> 암흑술사( ... ) <br> 악마술사( ... ) |\n|~| 얼굴스타일|1번 얼굴 스타일 <br> 2번 얼굴 스타일 <br> 3번 얼굴 스타일 |\n|~| 피부 색상| |\n| 얼굴 |>|눈크기 조정, 눈썹 조정, 코높이 조정, 코넓이 조정, 입크기 조정, 입술 두께 조정, 턱 조정, 아래턱 조정, 광대뼈 조정, 입술 색상, 눈동자 색상 |\n| 스타일 |>|헤어선택, 헤어 생상, 헤어 길이1, 헤어 길이2, 헤어 길이3, <br> 문신 선택, 문신 크기, 문신 위치1, 문신 위치2 |\n| 선체 |>|전체, 머리, 어깨, 가슴(여자 캐릭터만), 허리, 팔, 다리, 손, 발 |\n===\n\n===\n\n\n\n\n\n\n\n
<!DOCTYPE ...생략>\n<nowiki>\n<!-- saved from url=(0013)about:internet --> // '차단된 콘텐츠 허용' 자동으로 허용하기\n</nowiki>\n<script language="javascript"> \n... 정의\n</script> \n\n<body>\n... 호출\n</body>\n\n++++[▶ 한번 클릭으로 여러개 창 열기]\nfunction loadtwo(url1, url2) {\n parent.info1.location.href = url1;\n parent.memo2.location.href = url2;\n }\n----\ncf. <a href="25_dd/25_dd_info.html" target="info1"> # 25_dd </a> <br>\n<a href=# onclick="loadtwo('24_dd/24_dd_info.html','24_dd/24_dd_memobar.html');"> # 24_dd </a>\n<a href=# onclick="loadtwo('25_dd/25_dd_info.html','25_dd/25_dd_memobar.html');"> # 25_dd </a> <br>\n===\n\n+++[▶'차단된 콘텐츠 허용' 자동으로 허용하기 ]\n오프라인에서 작성한 HTML 문서등을 오픈할때 javascript 등이 있으면 위와 같이 '차단된 콘텐츠 허용'이 필요하다는 알림이 출력된다.\n\n{{{ <!DOCTYPE ...생략> 다음 행에 <!-- saved from url=(0013)about:internet --> 추가 }}}\n===\n\n+++[▶ Edge 브라우저에서 <a href>로 새창 열기 ]\n원문 ; https://kocssds.github.io/2022/07/05/NewPopupOpenInEdge/ - Edge 브라우저는 기본적으로 페이지 오픈을 '새탭'으로 열립니다.\n\nEdge 브라우저에서 페이지 오픈은 일반적으로 새 탭으로만 열리기 되어 있다.\n* 상위 이미지의 Popup navigation클릭 시, 나타난 팝업창은 주소 편집이 되지 않고 toolbar 및 menubar가 존재하지 않는 창띄우는 예제\n* 띄우고자 하는 popup 사이즈 조정을 위해, 가로 세로 너비 값을 전달할 수 있다.\n{{{\n<!DOCTYPE html> \n<html lang="en"> \n<head> \n <meta charset="UTF-8"> \n <meta http-equiv="X-UA-Compatible" content="IE=edge"> \n <meta name="viewport" content="width=device-width, initial-scale=1.0"> \n <title>Document</title> \n <script> \n function popup(url) { \n window.open(url, 'samplePopup', 'popup'); \n } \n </script> \n</head> \n<body> \n <a href="https://www.microsoft.com" onclick="popup(this.href); return false;">Popup navigation</a> \n</body> \n</html> \n}}}\n===\n
원문 요약 ; http://www.venturesquare.net/540560 - 떠오르는 트렌드..O2O는 무엇일까요\n\n!!! O2O는 역쇼루밍 현상\n쇼루밍(Showrooming)이라는 말 들어 보셨나요? 백화점이나 마트에서 상품을 구경한 후, 똑같은 제품을 값싼 온라인에서 사는 현상을 뜻하는데요.\nO2O는 이에 반하는 ‘역쇼루밍’ 트렌드를 만들어 내고 있는 비즈니스 모델입니다.\n쉽게 말하면 온라인이나 모바일에서 대금결제를 한 후, 오프라인에서 실제 서비스와 물건을 받는 소비형태를 뜻합니다.\n\n\n!!! O2O, 중국에서 떠오르기 시작한 새로운 트렌드\n도대체 지금 와서 새삼스럽게 '온라인·모바일'에서 상품을 사고, 현장에서 물건을 찾아가는 이 비즈니스 모델이 주목받는 이유는 무엇일까요?\nO2O가 주목받는 가장 큰 이유는 중국에서 빠르게 성장하고 있는 서비스 모델이기 때문입니다.\n\nKTB 투자증권에 따르면 중국 O2O 서비스 시장의 크기는 올해 ‘213조원’ -_-;;;;;에 이릅니다. B2C 온라인 쇼핑이 606조원 규모로 추산되니 약 1/3정도 됩니다.\n\n더군다나 이 O2O 비즈니스 모델은 ‘게임’에 이어 ‘메신저’와 찰떡궁합인 서비스로 텐센트가 적극적으로 밀어붙이고 있는 상황이라는 점도 주목받고 있습니다.\n\n아이비컨(iBeacon)과 같은 위치정보 서비스의 발전, 페이팔과 같은 결제서비스의 발전으로 새로운 이용자는 더욱 간편한 소비를 할 수 있고 판매자는 다양한 프로모션의 기회를 가지게 된다는 장점이 있습니다.\n\nO2O 플랫폼에서 근처에 있는 소비자들의 정보를 알려주면 그에 적합한 프로모션을 즉각 시행할 수 있고, 단골들과 지속적으로 소통하며 충성도를 올릴 수 있습니다.\nO2O 비즈니스 모델의 최대 장점은 오프라인 매장 운영자가 다수의 소비자들과 소통할 수 있는 ‘의사소통’ 비용을 크게 줄여 준다는 점입니다.\n\n\n!!! 한국에서 이 같은 서비스가 가능할까?\n'시럽' 서비스 (SK플래닛) ; 스마트월렛이라는 포인트카드 모음 앱을 바탕으로 O2O 플랫폼\n"결국 온라인·오프라인 커머스의 경계를 허무는 것으로 ‘모바일’이 등장했고, 모바일은 죽어가는 오프라인 커머스를 살릴 기회가 될 것" (서진우 SK 플래닛 대표)\n\n'카카오택시' 서비스 (다음카카오); 카카오톡이라는 강력한 플랫폼에 다음이 확보한 방대한 광고주 DB, 지도서비스, 실패를 통해 쌓은 풍부한 사업경험(ㅜㅜ) 등이 시너지를 낼 수 있을 것으로 보인다.\n\n\n!!! O2O? Mobile to Offline 이 더 적합한 용어 아닐까\nOnline to Offline보다는 차라리 M2O(Mobile to Offline)가 더 적합한 용어라고 생각하는 이유는 \n모바일 기술의 극적인 발전으로 가능해진 비즈니스 모델이기 때문이다. (중국의 예)\n
무선 충전의 기본 원리는 19세기 영국 물리학자 패러데이가 발견한 '전자기유도(電磁氣誘導)' 현상이다. 간단히 말해 전선에 전류가 흐르면 주변에 자기장이 생기고, 이 자기장의 에너지가 가까운 곳에 있는 다른 전선에 전류를 발생시키는 물리학 원리이다.\n\n▶ 원문 정리 ; 말 많은 휴대폰 무선충전 오해와 진실, 2013.04.29. \n( http://www.zdnet.co.kr/news/news_view.asp?artice_id=20130429165644 )\n\n무선충전 방식은 크게 자기유도 방식과 공진유도 방식으로 나뉜다. \n두 방식의 차이점은 크게 단말기과 충전기 간 접촉 여부로 구분한다. 현재 상용화된 무선충전 기술은 모두 자기유도방식이다. 삼성전자 갤럭시S4도 자기유도 방식 무선충전 기술 중 하나인 WPC의 'Qi(치)' 표준을 지원한다.\n\n''자기유도 방식''은 전력 송신부 코일에서 자기장을 발생시키면 이 자기장이 수신부의 2차 코일에 유도돼 전류를 공급하는 전자기 유도 원리를 이용한 기술이다. 하지만 단말기가 충전기로부터 멀리 떨어지게 되면 충전이 불가능하다. \n\n이같은 단점을 보완할 수 있는 기술이 공진유도 혹은 ''자기공명 방식''으로 불리는 기술이다. 송신부 코일에서 공진주파수로 진동하는 자기장을 생성해 동일한 공진 주파수로 설계된 수신부 코일에만 에너지가 집중적으로 전달되도록 하는 것이 공진유도 방식의 원리다.\n \n이 방식은 무선 충전기 위에 단말기를 아무렇게나 올려놓거나 2m 정도 떨어져 있어도 충전이 가능하고 하나의 무선 충전기에 여러 대의 단말기를 올려놓아도 동시에 충전할 수 있어 사용 편의성 측면에서 획기적인 개선이 가능할 것으로 보고 있다.
<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 16px;"> <b> Windows 7 기반 컴퓨터에서 사용할 수 있는 메모리가 설치된 메모리보다 적을 수 있음 </b> </span>\n</html>\n출처 ; https://support.microsoft.com/ko-kr/help/978610/the-usable-memory-may-be-less-than-the-installed-memory-on-windows-7-b#!/ko-kr/help/978610/the-usable-memory-may-be-less-than-the-installed-memory-on-windows-7-b\n\n!!! 증상\nWindows 7을 실행하는 컴퓨터에서는 사용할 수 있는 메모리(RAM)가 설치된 메모리보다 적을 수 있습니다.\n \n예를 들어 32비트 버전 Windows 7에서는 4GB의 메모리가 설치된 컴퓨터에서 사용할 수 있는 시스템 메모리가 3.5GB뿐인 것으로 보고할 수 있습니다.\n \n64비트 버전 Windows 7에서는 8GB의 메모리가 설치된 컴퓨터에서 사용할 수 있는 시스템 메모리가 7.1GB뿐인 것으로 보고할 수 있습니다.\n \n''참고'' 위의 예에서 언급한 사용할 수 있는 메모리의 양은 정확한 수치가 아닙니다. 사용할 수 있는 메모리의 양은 총 실제 메모리에서 "하드웨어 예약" 메모리를 빼는 방식으로 계산됩니다.\n\n!!! Windows 7의 실제 메모리 제한\n아래 표에는 각 Windows 7 버전의 실제 메모리 관련 제한이 나와 있습니다. \n|버전 |32비트 Windows의 제한 |64비트 Windows의 제한 |\n|Windows 7 Ultimate |4GB |192GB |\n|Windows 7 Enterprise |4GB |192GB |\n|Windows 7 Professional |4GB |192GB |\n|Windows 7 Home Premium |4GB |16GB |\n|Windows 7 Home Basic |4GB |8GB |\n|Windows 7 Starter |2GB |2GB |\n\nWindows 릴리스의 메모리 제한과 관련된 자세한 내용을 알아보려면 다음 링크를 클릭하여 Microsoft 웹 사이트의 문서를 확인하십시오. \nWindows 릴리스의 메모리 제한 (https://msdn.microsoft.com/ko-kr/library/aa366778(vs.85).aspx)\n\n\n<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 16px;"> <b> 윈도우 네트워크 상태 확인 (NETSTAT 명령어) </b> </span>\n</html>\n!!! netstat -ano\n''옵션''\na : 모든 연결 포트를 표시\nn : 주소와 포트를 주소:포트 형식으로 표시\no : 각 연결의 소유 프로세스 id를 표시\n\n''상태'' (현재 해당 소켓의 상태)\nLISTENING : 통신을 하기를 대기하고 있는 상태입니다. (아직 통신중이 아님)\nCLOSE-WAIT : 연결이 종료되기를 대기하고 있는 상태입니다.\nCLOSED : 연결이 종료된 상태\nTIME-WAIT : 연결 종료 후 일정시간 유지하고 있는 상태(일정 시간 이후 완전 종료)\nESTABLISHED : TCP에서 3 Way Handshake 이후 통신중인 상태\nSYS-SENT : 통신 상태에게 SYN 패킷을 보낸 후 연결을 요청한 상태\n공백 : 상태값이 없는 경우는 UDP 프로토콜을 사용하는 경우\n\n''PID''\n해당 소켓을 사용하는 프로세스의 아이디\n\nnetstat -ano | findstr 8080 (8080포트 필터링)\nnetstat -abno > netstat.txt (파일로 저장)\n\n\n<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 16px;"> <b> 현재 루트에서 명령창 열기 ; Shift+오른쪽키 </b> </span>\n</html>\nvs_professional.exe /uninstall / force\n\n\n<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 16px;"> <b> 윈도우 7, '입력 도구 모음' 복구 </b> </span>\n</html>\n입력도구모음은 ctfmon.exe파일이 담당\n\n#. regedit 추가 ; HKEY_LOCAL_MACHINE\sSOFTWARE\sMicrosoft\sWindows\sCurrentVersion\sRun\n / 오른쪽창에서 마우스오른버튼 클릭/새로만들기/문자열값 을 하고 이름을 임의대로 정하고 \n / 값에 c:\swindows\ssystem32\sctfmon.exe 라고 입력\n\n\n<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 16px;"> <b> CMD(command) 명령 </b> </span>\n</html>\nsysteminfo ; OS, 시스템 정보, 프로세서 정보, 바이오스 버전 등 정보를 CMD 창에 표시\nmsinfo32 ; 시스템 정보, 개별창으로 출력\n\n\n\n\n
<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 16px;"> <b> 원격 데스크톱 접근 사용자 계정에 세션수 변경(Windows 2008 R2) </b> </span>\n</html>\n\n윈도우 서버 2008 R2에서 원격 데스크톱으로 여러 명이 동시에 접속할 수 있도록 설정하는 방법\n \n▶ 시작 - 관리 도구 - 원격 데스크톱 서비스 - 원격 데스크톱 세션 호스트 구성\n\n#. 서버 구성; (오른쪽 클릭) RDP-Tcp 속성 > 네트워크 어댑터\n 최대 연결 수 => 설정 \n\n#. 설정 편집\n 사용자당 세션을 하나로 제한 => 더블 클릭\n 사용자당 세션을 하나로 제한 => 체크 풀기 ; 예 > 아니오 변경\n\n\n<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 16px;"> <b> 원격 데스크톱 복사 붙여넣기가 안되는 현상 </b> </span>\n</html>\n\n원격컴퓨터에서 복사한 내용이 로컬컴퓨터에 붙지 않고, 로컬컴퓨터에서 복사한 내용이 원격컴퓨터에 붙지 않는 현상\n\n/ 원인: 원격컴퓨터에서 rdpclip.exe이 제대로 동작하지 않음\n\n/ 해결방법\n 작업관리자에서, rdpclip.exe를 끄고 다시 시작한다. \n • 프로세스 탭 -- rdpclip.exe 클릭 -- <프로세스 끝내기(E)>\n • "rdpclip.exe을(를) 끝내시겠습니까?" -- <프로세스 끝내기>\n • 응용 프로그램 탭 -- <새 작업(N)...>\n • "새 작업 만들기" -- 열기(O): rdpclip √ Enter\n\n
무료 온라인 강의를 뜻하며 'Massive Open Online Course'의 약자다.\n'유엔미래보고서'는 오는 2030년에는 무료 강의 앱의 확산으로 대학이 사라질 것이라는 예측을 내놓기까지 했다.\n스테파니 미셸 하버드대 총장은 무크에 대해 '지진과 맞먹는 변화'라고 말했다. '무크'가 미래 교육 시장의 지각변동을 예고한단 것. 전문가들은 앞으로 '정보를 아는 것(Know-how)'에서 '정보를 이용하는 것(Know-where)'으로의 이동은 한층 가속화될 것이라고 내다보고 있다.\n\n| 강의 앱 | 추천 강의 | 언어 | 강의자 | 웹사이트 주소 |h\n| 스누온(서울대) | 경제원론 | 한국어 | 서울대학교 이준구 교수 | snuon.snu.ac.kr |\n| 유다시티 | 스타트업 키우기 | 영어 | 스티브 블랭크 스탠퍼드대 교수 | www.udacity.com |\n| 코세라 | 머신러닝 (빅데이터) | 영어 | 스탠포드 대학교 Andrew Ng | www.coursera.org |\n| OPEN KU (고려대) | 생명공학과 미래 사회 | 한국어 | 고영규 고려대 생명과학부 교수 | open.korea.ac.kr |\n| 대학공개강의 | 심리학의 이해 | 한국어 | 이화여대 양윤 교수 | www.kocw.net |\n| 유데미 | Change and Innovation Management | 영어 | Change and Innovation Management | www.udemy.com |\n\n
원문 ; 확률형아이템 자율규제안, 추후 과제는? ( http://www.zdnet.co.kr/news/news_view.asp?artice_id=20150506105602 )\n▷ 요약\n\n확률형 아이템 또는 캡슐형 유료 아이템이란 뽑기처럼 이용자가 그 아이템을 구입해 열어보기 전 까지 아이템의 내용물 및 성능, 효과 등을 알 수 없는 상품을 말한다. 운이 좋으면 구하기 힘든 레어 아이템을 얻을 수 있어 많은 이용자들이 해당 상품을 구매한다. \n\n논란이 되는 것은 이 확률형 아이템의 구성 및 확률이 공개되지 않는다는 점이다. 일각에서는 아이템 구매 당사자가 해당 상품에 대해 정보를 제공받지 못한다면 이는 불공정한 거래라고 주장한다. 소비자는 구입 물품을 선택할 때 필요한 정보를 제공받을 권리가 있다는 것이다.\n\n이에 대해 다른 쪽에서는 국산 게임에만 확률형 아이템의 확률 및 구성을 공개하도록 강제하는 것은 해외 게임과의 역차별 문제를 낳을 수 있으며 게임 사업자의 자율성을 침해할 수 있다고 반박해 왔다. \n\n\n■ '''가챠 시스템’(Gacha System) 이란'' (∵ 네이버 게임용어사전)\n게임에서 어떠한 아이템이 뽑힐지 알 수 없는 ‘랜덤박스’(Random Box) 아이템을 구입하는 시스템을 말한다. 만약 운이 좋다면 구매한 가격 대비 가치가 높은 아이템을 획득할 수 있는 반면, 운이 나쁘다면 구매한 가격 대비 가치가 낮은 아이템을 획득할 가능성도 있다.\n\n가챠 시스템을 이용하면 원하는 아이템이 100% 나온다는 보장이 없다.\n\n가챠 시스템의 ‘가챠’라는 용어는 일본의 캡슐 토이(Capsule Toy) 자동 판매기 가샤폰(ガシャポン)과 동의어로 쓰이는 가챠폰(ガチャポン)에서 유래한 말이다. 다수 상품이 들어있는 자판기에 동전을 넣고 손잡이를 돌려 캡슐을 뽑는 가챠폰의 시스템을 따서 가챠 시스템이라는 용어가 정착됐다.\n\n가챠 시스템은 상품 자체를 구매하는 게 아니라 상품을 뽑을 기회를 구매하는 것이기 때문에 소비자는 원하는 것을 얻기 위해서는 반복 구매를 할 수밖에 없다. 이 때문에 국내에서는 사행성을 조장하는 것이 아니냐는 논란이 끊이질 않고 있다. 실제로 마비노기, 메이플 스토리, 카운터 스트라이크 온라인 등 국내 온라인 게임에서는 주로 이벤트 아이템 판매에서만 가챠 시스템(랜덤 박스)을 활용하는 것으로 자율 규제를 적용하기도 했다.\n\n가챠 시스템이 특히 많이 사용되는 게임 장르로는 모바일 카드 배틀(Card Battle) 게임이 손꼽힌다.\n\n가챠 시스템의 발전된 형태로는 ‘컴플리트 가챠’(Complete ガチャ, 수집형 뽑기), 일명 ‘컴프 가챠’가 있다. 이는 오직 뽑기로 얻을 수 있는 상품을 모아서 더욱 희귀한 상품을 뽑는 시스템으로, 일본의 카드 배틀 게임에서 굉장히 많이 사용되었다. 다만 이 시스템은 일본에서조차 사행성 논란이 거세져 결국 2012년, 일본 소비자청이 게임 업계에 경고 조치를 취하면서 사실상 사장된 시스템이 되었다.
앱(App) 이란 Application의 약자로 응용 소프트웨어의 총칭으로 운영 체제에서 실행되는 응용 프로그램입니다.\n\n!!! 모바일 웹\n-. 위키피디아의 정의 ; 모바일 디바이스의 브라우저를 통해서 접속하는 서비스를 총칭하는 의미\n / 모바일 디바이스로 접속하는 서비스에 가까우며, \n / 사용자가 모바일 디바이스와 인터넷 브라우저를 통해서 이용할 수 있는 웹 서비스(또는웹콘텐츠)를 의미한다. 쉽게 표현하자면 스마트폰의 브라우저 주소창을 통해 접속하는 웹서비스이다.\n\n!!! 웹앱\n-. 위키피디아의 정의 ; 웹브라우저를 통해서 실행되는 응용 프로그램을 총칭하는 의미\n / 모바일 디바이스 뿐만 아니라 기존 PC 환경까지 포함하는 넓은 의미의 H/W 접속을 통해 사용하는 응용 프로그램(application S/W)를 뜻하고\n / 모바일 디바이스의 웹 브라우저 안에서 동작하면서터치와 관련된 사용자 경험(UX)과 기능을 제공하고 네이티브 앱과 모양이 유사한 웹 응용프로그램을 의미한다.\n\n-. "앱"의 발전 맥락에서 애플의 "웹앱" 정의 ; 스마트폰의 멀티터치 기능과 함께 이용할 수 있으며 홈화면에서 웹클립 아이콘을 등록해서마치 네이티브 앱의 사용자경험과 동일하게 제공해주는 웹 응용프로그램이라고 정의\n-. 안드로이드 OS 진영의 웹앱 정의 ; 안드로이드 OS에 앱을 어떻게 배포하는 지의 관점에서 웹앱을 정의. 배포하는 방법은 첫번째로 클라이언트 사이드 앱(네이티브 앱인 *.apk)형태가 있고, 두번째로 웹표준을 사용해서 브라우저에서 실행시키는 웹앱이 있다고 설명하고 있다. 즉, 안드로이드 진영에서도 웹앱의 개념은 브라우저에서 실행하는 HTML5로 작성된 콘텐츠를 말하고 있다.\n\n\n■ ''웹은 플랫폼이다, 웹앱 확산 가속''\n\n원문 ; MS 새 브라우저가 웹 생태계에 던진 메시지 ( http://www.zdnet.co.kr/news/news_view.asp?artice_id=20150430142412 )\n▷ 요약\n\n마이크로소프트(MS)가 브라우저 세대 교체를 선언했다. 인터넷 익스플로러(IE)를 명맥만 유지시키고 차세대 브라우저인 엣지(코드명: 스파르탄)를 전진배치했다. 종속적인 웹 기술을 모두 걷어낸 엣지를 윈도10 기본 브라우저로 투입하는 등 향후 IE보다 엣지에 무게 중심을 둔 브라우저 전략을 실행해 나갈 계획이다. \n\n이전에는 OS에 프로그램을 설치해야 쓸 수 있던 애플리케이션들이 웹기반으로 전환되는 경우가 늘고 있다. OS가 하던 플랫폼 역할을 웹이 대체하는 모습이다...\n문서작성을 위해 오피스SW 패키지를 설치하지 않아도 구글 닥스나 MS온라인 오피스를 이용해 쉽게 문서 작성과 편집이 가능해 진 것을 생각하면 이해가 쉽다. \n\n웹 앱의 최대 강점은 사용자 입장에서 어떤 디바이스를 사용하더라도 모두 접근이 가능하다는 점이다. 웹 앱은 디바이스나 운영체제에 대한 종속성이 없기 때문에 접근성을 크게 높일 수 있다.\n\n개발자 입장에서도 매력적이다. 기존 네이티브 앱에선 다양한 디바이스 환경에 맞추기 위해 디바이스 플랫폼 마다 서로 다른 언어로 개발해야 했다면 웹 앱에서는 네이티브처럼 개발 소스를 많이 가져가지 않아도 된다. 또 모든 플랫폼에 동일한 업데이트 및 정책을 적용할 수 있다는 장점도 있다. 네이티브 앱은 플랫폼 별로 배포 환경은 물론 배포 타이밍도 다를 수 밖에 없다. 하지만 웹 앱은 사용자가 애플리케이션을 로딩할 때 바로 새로운 업데이트와 정책이 적용된 상태로 서비스를 제공할 수 있다.\n\n
<html> <a name="Page190529"> </a> </html>\n<html>\n<a href="#Page190529_01"> #. 개요 </a> <br>\n<a href="#Page190529_02"> #. HTML 특수문자 코드표 </a> <br>\n</html>\n\n<html> <a name="Page190529_01"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page190529"> <span style="font-size: 14px;"> <b> #. 개요 </b> </span> </a>\n</div> </html>\nHTML이란 웹에서 문서를 출력할때 사용하는 일종의 표현 규격이다.\nHTML 문서는 꺽쇠(<, >)로 이루어진 태그로 구성되어있으며 태그는 속성을 가질 수 있다.\n\n\n!!! 기본 태그 작성법\nHTML 문서에서 기본 태그는 아래처럼 작성한다\n{{{\n<태그>내용</태그>\n}}}\n단, 이때 태그는 연 순서대로 닫아야 한다\n{{{\n<태그1>내용1</태그1> (O)\n<태그2><태그3>내용2</태그3></태그2> (O)\n\n<태그2><태그3>내용2</태그2></태그3> (X)\n}}}\n<html>\n<UL> \n <LI> < ul > < ol > < dl > 태그 ; 목록을 작성\n <uL>\n <li> < ul > 태그는 unordered list의 약자로, 숫자나 알파벳 등 순서가 필요 없는 목록을 작성\n <li> < ol > 태그는 ordered list의 약자로, 숫자나 알파벳 등 순서가 있는 목록을 작성\n <li> < dl > 태그는 definition list의 약자로, 사전처럼 용어를 설명하는 목록을 작성\n </uL>\n <LI> < li > 태그 ; list item의 약자로 < ul > < ol >의 각 항목들을 나열할 때 사용\n <LI> < pre > 태그 ; Preformatted Text </LI>\n문장형태 그대로 브라우저에 표시. 예를 들어 엔터(Enter), 탭(Tab), 스페이스바(Space) 는 pre 를 사용하지 않았을 때 무조건 공백 하나로 인식하게 됩니다. 하지만 pre 를 사용하게 되면 HTML 형태 그대로 유지가 가능합니다. 그래서 소스를 표현하는데 많이 이용합니다.\n</UL> </html>\n\n!!! HTML 문서의 기본구조\nHTML 문서의 시작은 <html> 태그로 시작하고 </html> 태그로 끝낸다\n\nHTML 문서 내부는 크게 웹 문서 제작자나 사용된 언어 등 화면에 직접적으로 표시되지 않는 여러 정보가 들어가는 <head> 태그와 실제 컨텐츠의 정보가 들어가는 <body>태그로 이루어져있다.\n\n<head> 태그 안에는 웹 문서의 제목을 표시하는 <title> 태그, 웹 페이지의 정보를 정의하는 <meta> 태그, JavaScript 를 삽입하는 <script> 태그, CSS 등의 파일을 삽입하는 <link> 태그 등이 들어간다.\n\n<body> 태그 안에는 <head> 태그안에 들어가지 않는 거의 모든 태그가 들어된다.\n{{{\n<html>\n <head>\n <title>페이지 제목</title>\n </head>\n\n <body>\n 웹 문서의 내용\n </body>\n</html>\n}}}\n\n\n!!! XHTML, HTML5\nHTML의 문서 규격을 표시 할 때에는 DOCTYPE 이라는 것으로 표시한다. \n\nXHTML 문서는 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd> 같은 doctype을 사용하고 \n\nHTML5 문서는 <!doctype html> 같은 doctype을 사용한다. \n\ndoctype을 지정하지 않을 경우 Internet Explorer에서 문서를 Internet Explorer 6 엔진으로 해석하므로 꼭 지정 해 주도록 한다. \n{{{\n<!DOCTYPE html>\n<html>\n<head>\n <title>Title of the document</title>\n <meta charset="utf-8">\n</head>\n<body>\n The content of the document\n</body>\n</html>\n}}}\n\n\n!!! 한글 깨짐 문제\nHTML의 인코딩 방식 때문에 한글이 깨질 때가 있다. \n\n이는 브라우저에서 인식하는 인코딩 방식과 html 파일의 인코딩 방식이 달라 생기는 문제인데,\n둘 다 하나의 인코딩 방식으로 통일해 주면 된다. \n\nUTF-8 인코딩 방식 설정예.\n''XHTML''의 경우에는 아래 코드를 <head> 태그 안에 추가\n{{{\n<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />\n}}}\n''HTML5''의 경우 아래 코드를 <head> 태그 안에 추가\n{{{\n<meta charset="utf-8">\n}}}\n\n\n<html> <a name="Page190529_01"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page190529"> <span style="font-size: 14px;"> <b> #. 수식 표현 </b> </span> </a>\n</div> </html>\n-. 윗첨자 ; 승수를 표현하는 것은 <sup></sup> 태그를 사용하여 다음과 같이 간단히 해결할 수 있다. \n <html> ax<sup>2</sup> + bx + c = 0 </html>\n{{{\nax<sup>2</sup> + bx + c = 0\n}}}\n-. 아래첨자 ; <sub></sub> 태그를 사용\n\n\n<html> <a name="Page190529_02"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page180201"> <span style="font-size: 14px;"> <b> #. HTML 특수문자 코드표 </b> </span> </a>\n</div> </html>\nhttp://kor.pe.kr/util/4/charmap.htm - 유니코드 특수문자 리스트\nhttps://m.blog.naver.com/PostView.nhn?blogId=design4u74&logNo=220800269271&proxyReferer=http - 유용한 특수문자 / 별문자 / 하트기호 / 화살표특수문자 복붙하기\n{{{\n| 표현문자 | 숫자표현 | 문자표현 | 설명 |\n|- | �- | - |사용하지 않음 |\n|space | 	 | - |수평탭 |\n|space | | - |줄 삽입 |\n|- | - | - |사용하지 않음 |\n...\n|# | # | - |숫자기호 |\n...\n|* | * | - |아스트릭 |\n...\n|- | - | - |Hyphen |\n|. | . | - |마침표 |\n|/ | / | - |Solidus (slash) |\n|0 - 9 | 0 - 9| - |0부터 9까지 |\n|: | : | - |콜론 |\n|; | ; | - |세미콜론 |\n|< | < | < |보다 작은 |\n|= | = | - |등호 |\n|> | > | > |보다 큰 |\n...\n|[ | [ | - |왼쪽 대괄호 |\n|\s | \ | - |역슬래쉬 |\n|] | ] | - |오른쪽 대괄호 |\n|^ | ^ | - |탈자부호 |\n|_ | _ | - |수평선 |\n...\n|a - z | a - z | - |a부터 z까지 |\n|{ | { | - |왼쪽 중괄호 |\n|| | | | - |수직선 |\n|} | } | - |오른쪽 중괄호 |\n|~ | ~ | - |꼬리표 |\n\n}}}\n\n<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 14px;"> <b> 윈도우 특수문자 입력 방법 </b> </span> \n</html>\n\n1. 키보드에서 한글 자음(ㄱ,ㄴ,ㄷ,ㄹ,ㅁ,ㅂ,ㅅ... 등)을 입력 >> 한자키 >> 특수문자 목록이 표시되며\n 원하는 특수문자를 목록에서 선택해서 입력한다.\n 예) 'ㅁ'의 경우 ★△◆▶ ....\n\n2. 키보드에서 왼쪽 Alt키 + 숫자키패드의 해당 특수키의 코드값을 입력한다.\n • 는 Alt+149\n\n3. 엑셀을 이용, 해당 문자의 코드값을 확인하는 방법\n 셀에 =code("■") 이라고 입력하면 코드값을 산출 (■의 코드번호는 41441)\n\n| !code | !ㄱ | !code | !ㄴ | !code | !ㄷ | !code | !ㄹ | !code | !ㅁ | !code | !ㅂ | !code | !ㅅ | !code | !ㅇ | !code | !ㅈ | !code | !ㅊ | !code | !ㅋ | !code | !ㅌ | !code | !ㅍ | !code | !ㅎ | !code | !ㄲ | !code | !ㄸ | !code | !ㅃ | !code | !ㅆ |\n| 41889 | ! | 41890 | " | 41899 | + | 41892 | $ | 41891 | # | 42657 | ─ | 43185 | ㉠ | 43213 | ⓐ | 48 | 0 | 43254 | ½ | 42145 | ㄱ | 42197 | ㅥ | 41921 | A | 42433 | Α | 43169 | Æ | 43681 | ぁ | 43938 | ア | 44193 | А |\n| 39 | ' | 41896 |( | 41901 | - | 41893 | % | 41894 | & | 42658 | │ | 43186 | ㉡ | 43214 | ⓑ | 49 | 1 | 43255 | ⅓ | 42146 | ㄲ | 42198 | ㅦ | 41922 | B | 42434 | Β | 43170 | Ð | 43682 | あ | 43939 | ィ | 44194 | Б |\n| 41900 | , | 41897 | ) | 41916 | < | 41948 | ₩ | 41898 | * | 42659 | ┌ | 43187 | ㉢ | 43215 | ⓒ | 50 | 2 | 43256 | ⅔ | 42147 | ㄳ | 42199 | ㅧ | 41923 | C | 42435 | Γ | 43172 | Ħ | 43683 | ぃ | 43940 | イ | 44195 | В |\n| 41902 | . | 41947 | [ | 41917 | = | 41926 | F | 41920 | @ | 42660 | ┐ | 43188 | ㉣ | 43216 | ⓓ | 51 | 3 | 43257 | ¼ | 42148 | ㄴ | 42200 | ㅨ | 41924 | D | 42436 | Δ | 43174 | IJ | 43684 | い | 43941 | ゥ | 44196 | Г |\n| 41903 | / | 41949 | ] | 41918 | > | 41415 | ′ | 41431 | § | 42661 | ┘ | 43189 | ㉤ | 43217 | ⓔ | 52 | 4 | 43258 | ¾ | 42149 | ㄵ | 42201 | ㅩ | 41925 | E | 42437 | Ε |43176 | Ŀ | 43685 | ぅ | 43942 | ウ | 44197 | Д |\n| 41914 | : | 41979 | { | 41406 | ± | 41416 | ″ | 41432 | ※ | 42662 | └ | 43190 | ㉥ | 43218 | ⓕ | 53 | 5 | 43259 | ⅛ | 42150 | ㄶ | 42202 | ㅪ | 41926 | F | 42438 | Ζ | 43177 | Ł | 43686 | う | 43943 | ェ | 44198 | Е |\n| 41915 | ; | 41981 | } | 41407 | × | 41417 | ℃ | 41433 | ☆ | 42663 | ├ | 43191 | ㉦ | 43219 | ⓖ | 54 | 6 | 43260 | ⅜ | 42151 | ㄷ | 42203 | ㅫ | 41927 | G | 42439 | Η | 43178 | Ø | 43687 | ぇ | 43944 | エ | 44199 | Ё |\n| 41919 | ? | 41390 | ‘ | 41408 | ÷ | 41418 | Å | 41434 | ★ | 42664 | ┬ | 43192 | ㉧ | 43220 | ⓗ | 55 | 7 | 43261 | ⅝ | 42152 | ㄸ | 42204 | ㅬ | 41928 | H | 42440 | Θ | 43179 | Œ | 43688 | え | 43945 | ォ | 44200 | Ж |\n| 41950 | ^ | 41391 | ’ | 41409 | ≠ | 41419 | ¢ | 41435 | ○ | 42665 | ┤ | 43193 | ㉨ | 43221 | ⓘ | 56 | 8 | 43262 | ⅞ | 42153 | ㄹ | 42205 | ㅭ | 41929 | I | 42441 | Ι | 43181 | Þ | 43689 | ぉ | 43946 | オ | 44201 | З |\n| 41951 | _ | 41392 | “ | 41410 | ≤ | 41420 | £ | 41436 | ● | 42666 | ┴ | 43194 | ㉩ | 43222 | ⓙ | 57 | 9 | 43510 | ¹ | 42154 | ㄺ | 42206 | ㅮ | 41930 | J | 42442 | Κ | 43182 | Ŧ | 43690 | お | 43947 | カ | 44202 | И |\n| 41952 | ` | 41393 | ” | 41411 | ≥ | 41421 | ¥ | 41437 | ◎ | 42667 | ┼ | 43195 | ㉪ | 43223 | ⓚ | 42401 | ⅰ | 43511 | ² | 42155 | ㄻ | 42207 | ㅯ | 41931 | K | 42443 | Λ | 43183 | Ŋ | 43691 | か | 43948 | ガ | 44203 | Й |\n| 41980 | | | 41394 | 〔 | 41412 | ∞ | 41652 | ¤ | 41438 | ◇ | 42668 | ━ | 43196 | ㉫ | 43224 | ⓛ | 42402 | ⅱ | 43512 | ³ | 42156 | ㄼ | 42208 | ㅰ | 41932 | L | 42444 | Μ | 43425 | æ | 43692 | が | 43949 | キ | 44204 | К |\n| 41381 | ‥ | 41399 | 》 | 41425 | ⊥ | 42915 | ㎗ | 41443 | ▲ | 42673 | ┗ | 43201 | ㉰ | 43229 | ⓠ | 42407 | ⅶ | 43517 | ₃ | 42161 | ㅁ | 42213 | ㅵ | 41937 | Q | 42449 | Ρ | 43430 | ij | 43697 | け | 43954 | ゲ | 44209 | П |\n| 41382 | … | 41400 | 「 | 41426 | ⌒ | 42916 | ℓ | 41444 | ▽ | 42674 | ┣ | 43202 | ㉱ | 43230 | ⓡ | 42408 | ⅷ | 43518 | ₄ | 42162 | ㅂ | 42214 | ㅶ | 41938 | R | 42450 | Σ | 43431 | ĸ | 43698 | げ | 43955 | コ | 44210 | Р |\n| 41383 | ¨ | 41401 | 」 | 41427 | ∂ | 42917 | ㎘ | 41445 | ▼ | 42675 | ┳ | 43203 | ㉲ | 43231 | ⓢ | 42409 | ⅸ | | | 42163 | ㅃ | 42215 | ㅷ | 41939 | S | 42451 | Τ | 43432 | ŀ | 43699 | こ | 43956 | ゴ | 44211 | С |\n| 41383 | ¨ | 41401 | 」 | 41427 | ∂ | 42917 | ㎘ | 41445 | ▼ | 42675 | ┳ | 43203 | ㉲ | 43231 | ⓢ | 42409 | ⅸ | | | 42163 | ㅃ | 42215 | ㅷ | 41939 | S | 42451 | Τ | 43432 | ŀ | 43699 | こ | 43956 | ゴ | 44211 | С |\n| 41384 | 〃 | 41402 | 『 | 41428 | ∇ | 42918 | ㏄ | 41446 | → | 42676 | ┫ | 43204 | ㉳ | 43232 | ⓣ | 42410 | ⅹ | | | 42164 | ㅄ | 42216 | ㅸ | 41940 | T | 42452 | Υ | 43433 | ł | 43700 | ご | 43957 | サ | 44212 | Т |\n| 41385 | | 41403 | 』 | 41429 | ≡ | 42919 | ㎣ | 41447 | ← | 42677 | ┻ | 43205 | ㉴ | 43233 | ⓤ | 42416 | Ⅰ | | | 42165 | ㅅ | 42217 | ㅹ | 41941 | U | 42453 | Φ | 43434 | ø | 43701 | さ | 43958 | ザ | 44213 | У |\n| 41386 | ― | 41404 | 【 | 41430 | ≒ | 42920 | ㎤ | 41448 | ↑ | 42678 | ╋ | 43206 | ㉵ | 43234 | ⓥ | 42417 | Ⅱ | | | 42166 | ㅆ | 42218 | ㅺ | 41942 | V | 42454 | Χ | 43435 | œ | 43702 | ざ | 43959 | シ | 44214 | Ф |\n| 41387 | ∥ | 41405 | 】 | 41452 | ≪ | 42921 | ㎥ | 41449 | ↓ | 42679 | ┠ | 43207 | ㉶ | 43235 | ⓦ | 42418 | Ⅲ | | | 42167 | ㅇ | 42219 | ㅻ | 41943 | W | 42455 | Ψ | 43436 | ß | 43703 | し | 43960 | ジ | 44215 | Х |\n| 41388 | \ | | | 41453 | ≫ | 42922 | ㎦ | 41450 | ↔ | 42680 | ┯ | 43208 | ㉷ | 43236 | ⓧ | 42419 | Ⅳ | | | 42168 | ㅈ | 42220 | ㅼ | 41944 | X | 42456 | Ω | 43437 | þ | 43704 | じ | 43961 | ス | 44216 | Ц |\n| 41389 | ∼ | | | 41454 | √ | 42923 | ㎙ | 41451 | 〓 | 42681 | ┨ | 43209 | ㉸ | 43237 | ⓨ | 42420 | Ⅴ | | | 42169 | ㅉ | 42221 | ㅽ | 41945 | Y | 42465 | α | 43438 | ŧ | 43705 | す | 43962 | ズ | 44217 | Ч |\n| 41637 | ´ | | | 41455 | ∽ | 42924 | ㎚ | 41655 | ◁ | 42682 | ┷ | 43210 | ㉹ | 43238 | ⓩ | 42421 | Ⅵ | | | 42170 | ㅊ | 42222 | ㅾ | 41946 | Z | 42466 | β | 43439 | ŋ | 43706 | ず | 43963 | セ | 44218 | Ш |\n| 41638 | ~ | | | 41456 | ∝ | 42925 | ㎛ | 41656 | ◀ | 42683 | ┿ | 43210 | ㉹ | 43239 | ① | 42422 | Ⅶ | | | 42171 | ㅋ | 42223 | ㅿ | 41953 | a | 42467 | γ | 43440 | ʼn | 43707 | せ | 43964 | ゼ | 44219 | Щ |\n| 41639 | ˇ | | | 41457 | ∵ | 42926 | ㎜ | 41657 | ▷ | 42684 | ┝ | 43211 | ㉺ | 43240 | ② | 42423 | Ⅷ | | | 42172 | ㅌ | 42224 | ㆀ | 41954 | b | 42468 | δ | | | 43708 | ぜ | 43965 | ソ | 44220 | Ъ |\n| 41640 | ˘ | | | 41458 | ∫ | 42927 | ㎝ | 41658 | ▶ | 42685 | ┰ | 43212 | ㉻ | 43241 | ③ | 42424 | Ⅸ | | | 42173 | ㅍ | 42225 | ㆁ | 41955 | c | 42469 | ε | | | 43709 | そ | 43966 | ゾ | 44221 | Ы |\n| 41641 | ˝ | | | 41459 | ∬ | 42928 | ㎞ | 41659 | ♤ | 42686 | ┥ | 43441 | ㈀ | 43242 | ④ | 42425 | Ⅹ | | | 42174 | ㅎ | 42226 | ㆂ | 41956 | d | 42470 | ζ | | | 43710 | ぞ | 43967 | タ | 44222 | Ь |\n| 41642 | ˚ | | | 41460 | ∈ | 42929 | ㎟ | 41660 | ♠ | 42687 | ┸ | 43442 | ㈁ | 43243 | ⑤ | | | | | 42175 | ㅏ | 42227 | ㆃ | 41957 | e | 42471 | η | | | 43711 | た | 43968 | ダ | 44223 | Э |\n| 41643 | ˙ | | | 41461 | ∋ | 42930 | ㎠ | 41661 | ♡ | 42688 | ╂ | 43443 | ㈂ | 43244 | ⑥ | | | | | 42176 | ㅐ | 42228 | ㆄ | 41958 | f | 42472 | θ | | | 43712 | だ | 43969 | チ | 44224 | Ю |\n| 41644 | ¸ | | | 41462 | ⊆ | 42931 | ㎡ | 41662 | ♥ | 42689 | ┒ | 43444 | ㈃ | 43245 | ⑦ | | | | | 42177 | ㅑ | 42229 | ㆅ | 41959 | g | 42473 | ι | | | 43713 | ち | 43970 | ヂ | 44225 | Я |\n| 41645 | ˛ | | | 41463 | ⊇ | 42932 | ㎢ | 41663 | ♧ | 42690 | ┑ | 43445 | ㈄ | 43246 | ⑧ | | | | | 42178 | ㅒ | 42230 | ㆆ | 41960 | h | 42474 | κ | | | 43714 | ぢ | 43971 | ッ | 44241 | а |\n| 41646 | ¡ | | | 41464 | ⊂ | 42933 | ㏊ | 41664 | ♣ | 42691 | ┚ | 43446 | ㈅ | 43247 | ⑨ | | | | | 42179 | ㅓ | 42231 | ㆇ | 41961 | i | 42475 | λ | | | 43715 | っ | 43972 | ツ | 44242 | б |\n| 41647 | ¿ | | | 41465 | ⊃ | 42934 | ㎍ | 41665 | ⊙ | 42692 | ┙ | 43447 | ㈆ | 43248 | ⑩ | | | | | 42180 | ㅔ | 42232 | ㆈ | 41962 | j | 42476 | μ | | | 43716 | つ | 43973 | ヅ | 44243 | в |\n| 41648 | ː | | | 41466 | ∪ | 42935 | ㎎ | 41666 | ◈ | 42693 | ┖ | 43448 | ㈇ | 43249 | ⑪ | | | | | 42181 | ㅕ | 42233 | ㆉ | 41963 | k | 42477 | ν | | | 43717 | づ | 43974 | テ | 44244 | г |\n| | | | | 41467 | ∩ | 42936 | ㎏ | 41667 | ▣ | 42694 | ┕ | 43449 | ㈈ | 43250 | ⑫ | | | | | 42182 | ㅖ | 42234 | ㆊ | 41964 | l | 42478 | ξ | | | 43718 | て | 43975 | デ | 44245 | д |\n| | | | | 41468 | ∧ | 42937 | ㏏ | | | 42695 | ┎ | 43450 | ㈉ | 43251 | ⑬ | | | | | 42183 | ㅗ | 42235 | ㆋ | 41965 | m | 42479 | ο | | | 43719 | で | 43976 | ト | 44246 | е |\n| | | | | 41469 | ∨ | 42938 | ㎈ | | | 42696 | ┍ | 43451 | ㈊ | 43252 | ⑭ | | | | | 42184 | ㅘ | 42236 | ㆌ | 41966 | n | 42480 | π | | | 43720 | と | 43977 | ド | 44247 | ё |\n| | | | | 41470 | ¬ | 42939 | ㎉ | | | 42697 | ┞ | 43452 | ㈋ | 43253 | ⑮ | | | | | 42185 | ㅙ | 42237 | ㆍ | 41967 | o | 42481 | ρ | | | 43721 | ど | 43978 | ナ | 44248 | ж |\n| | | | | 41633 | ⇒ | 42940 | ㏈ | | | 42698 | ┟ | 43453 | ㈌ | 43469 | ⒜ | | | | | 42186 | ㅚ | 42238 | ㆎ | 41968 | p | 42482 | σ | | | 43722 | な | 43979 | ニ | 44249 | з |\n| | | | | 41634 | ⇔ | 42941 | ㎧ | | | 42699 | ┡ | 43454 | ㈍ | 43470 | ⒝ | | | | | 42187 | ㅛ | | | 41969 | q | 42483 | τ | | | 43723 | に | 43980 | ヌ | 44250 | и |\n| | | | | 41635 | ∀ | 42942 | ㎨ | | | 42700 | ┢ | 43455 | ㈎ | 43471 | ⒞ | | | | | 42188 | ㅜ | | | 41970 | r | 42484 | υ | | | 43724 | ぬ | 43981 | ネ | 44251 | й |\n| | | | | 41636 | ∃ | 42943 | ㎰ | | | 42701 | ┦ | 43456 | ㈏ | 43472 | ⒟ | | | | | 42189 | ㅝ | | | 41971 | s | 42485 | φ | | | 43725 | ね | 43982 | ノ | 44252 | к |\n| | | | | 41649 | ∮ | 42944 | ㎱ | | | 42702 | ┧ | 43457 | ㈐ | 43473 | ⒠ | | | | | 42190 | ㅞ | | | 41972 | t | 42486 | χ | | | 43726 | の | 43983 | ハ | 44253 | л |\n| | | | | 41650 | ∑ | 42945 | ㎲ | | | 42703 | ┩ | 43458 | ㈑ | 43474 | ⒡ | | | | | 42191 | ㅟ | | | 41973 | u | 42487 | ψ | | | 43727 | は | 43984 | バ | 44254 | м |\n| | | | | 41651 | ∏ | 42946 | ㎳ | | | 42704 | ┪ | 43459 | ㈒ | 43475 | ⒢ | | | | | 42192 | ㅠ | | | 41974 | v | 42488 | ω | | | 43728 | ば | 43985 | パ | 44255 | н |\n| | | | | | | 42947 | ㎴ | | | 42705 | ┭ | 43460 | ㈓ | 43476 | ⒣ | | | | | 42193 | ㅡ | | | 41975 | w | | | | | 43729 | ぱ | 43986 | ヒ | 44256 | о |\n| | | | | | | 42948 | ㎵ | | | 42706 | ┮ | 43461 | ㈔ | 43477 | ⒤ | | | | | 42194 | ㅢ | | | 41976 | x | | | | | 43730 | ひ | 43987 | ビ | 44257 | п |\n| | | | | | | 42949 | ㎶ | | | 42707 | ┱ | 43462 | ㈕ | 43478 | ⒥ | | | | | 42195 | ㅣ | | | 41977 | y | | | | | 43731 | び | 43988 | ピ | 44258 | р |\n| | | | | | | 42950 | ㎷ | | | 42708 | ┲ | 43463 | ㈖ | 43479 | ⒦ | | | | | | | | | 41978 | z | | | | | 43732 | ぴ | 43989 | フ | 44259 | с |\n| | | | | | | 42951 | ㎸ | | | 42709 | ┵ | 43464 | ㈗ | 43480 | ⒧ | | | | | | | | | | | | | | | 43733 | ふ | 43990 | ブ | 44260 | т |\n| | | | | | | 42952 | ㎹ | | | 42710 | ┶ | 43465 | ㈘ | 43481 | ⒨ | | | | | | | | | | | | | | | 43734 | ぶ | 43991 | プ | 44261 | у |\n| | | | | | | 42953 | ㎀ | | | 42711 | ┹ | 43466 | ㈙ | 43482 | ⒩ | | | | | | | | | | | | | | | 43735 | ぷ | 43992 | ヘ | 44262 | ф |\n| | | | | | | | | | | 42712 | ┺ | 43467 | ㈚ | 43483 | ⒪ | | | | | | | | | | | | | | | 43736 | へ | 43993 | ベ | 44263 | х |\n| | | | | | | | | | | | | 43468 | ㈛ | 43484 | ⒫ | | | | | | | | | | | | | | | 43737 | べ | 43994 | ペ | 44264 | ц |\n| | | | | | | | | | | | | | | 43485 | ⒬ | | | | | | | | | | | | | | | 43738 | ぺ | 43995 | ホ | 44265 | ч |\n| | | | | | | | | | | | | | | 43486 | ⒭ | | | | | | | | | | | | | | | 43739 | ほ | 43996 | ボ | 44266 | ш |\n| | | | | | | | | | | | | | | 43487 | ⒮ | | | | | | | | | | | | | | | 43740 | ぼ | 43997 | ポ | 44267 | щ |\n| | | | | | | | | | | | | | | 43488 | ⒯ | | | | | | | | | | | | | | | 43741 | ぽ | 43998 | マ | 44268 | ъ |\n| | | | | | | | | | | | | | | 43489 | ⒰ | | | | | | | | | | | | | | | 43742 | ま | 43999 | ミ | 44269 | ы |\n| | | | | | | | | | | | | | | 43490 | ⒱ | | | | | | | | | | | | | | | 43743 | み | 44000 | ム | 44270 | ь |\n| | | | | | | | | | | | | | | 43491 | ⒲ | | | | | | | | | | | | | | | 43744 | む | 44001 | メ | 44271 | э |\n| | | | | | | | | | | | | | | 43492 | ⒳ | | | | | | | | | | | | | | | 43745 | め | 44002 | モ | 44272 | ю |\n| | | | | | | | | | | | | | | 43493 | ⒴ | | | | | | | | | | | | | | | 43746 | も | 44003 | ャ | 44273 | я |\n| | | | | | | | | | | | | | | 43494 | ⒵ | | | | | | | | | | | | | | | 43747 | ゃ | 44004 | ヤ | | |\n| | | | | | | | | | | | | | | 43495 | ⑴ | | | | | | | | | | | | | | | 43748 | や | 44005 | ュ | | |\n| | | | | | | | | | | | | | | 43496 | ⑵ | | | | | | | | | | | | | | | 43749 | ゅ | 44006 | ユ | | |\n| | | | | | | | | | | | | | | 43497 | ⑶ | | | | | | | | | | | | | | | 43750 | ゆ | 44007 | ョ | | |\n| | | | | | | | | | | | | | | 43498 | ⑷ | | | | | | | | | | | | | | | 43751 | ょ | 44008 | ヨ | | |\n| | | | | | | | | | | | | | | 43499 | ⑸ | | | | | | | | | | | | | | | 43752 | よ | 44009 | ラ | | |\n| | | | | | | | | | | | | | | 43500 | ⑹ | | | | | | | | | | | | | | | 43753 | ら | 44010 | リ | | |\n| | | | | | | | | | | | | | | 43501 | ⑺ | | | | | | | | | | | | | | | 43754 | り | 44011 | ル | | |\n| | | | | | | | | | | | | | | 43502 | ⑻ | | | | | | | | | | | | | | | 43755 | る | 44012 | レ | | |\n| | | | | | | | | | | | | | | 43503 | ⑼ | | | | | | | | | | | | | | | 43756 | れ | 44013 | ロ | | |\n| | | | | | | | | | | | | | | 43504 | ⑽ | | | | | | | | | | | | | | | 43757 | ろ | 44014 | ヮ | | |\n| | | | | | | | | | | | | | | 43505 | ⑾ | | | | | | | | | | | | | | | 43758 | ゎ | 44015 | ワ | | |\n| | | | | | | | | | | | | | | 43506 | ⑿ | | | | | | | | | | | | | | | 43759 | わ | 44016 | ヰ | | |\n| | | | | | | | | | | | | | | 43507 | ⒀ | | | | | | | | | | | | | | | 43760 | ゐ | 44017 | ヱ | | |\n| | | | | | | | | | | | | | | 43508 | ⒁ | | | | | | | | | | | | | | | 43761 | ゑ | 44018 | ヲ | | |\n| | | | | | | | | | | | | | | 43509 | ⒂ | | | | | | | | | | | | | | | 43762 | を | 44019 | ン | | |\n| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 43763 | ん | 44020 | ヴ | | |\n| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 44021 | ヵ | | |\n| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 44022 | ヶ | | |\n \n\n\n
#.''IF 함수 ''\n \n지정한 조건이 '참'일 때와 '거짓'일 때 각각 다른 값을 반환합니다. IF를 사용하여 값이나 수식에 대한 조건부 검사를 수행.\n\n''(형식) =IF(logical_test,value_if_true,value_if_false)''\n- logical_test : 지정하고자 하는 조건을 표시\n- value_if_true : 지정한 조건이 참인 경우에 표시하는 값(숫자,문자) 또는 수식을 대입\n- value_if_false : 지정한 조건이 거짓인 경우에 표시하는 값(숫자,문자) 또는 수식을 대입\n\n''(사용예) =IF(A2>B2,"예산 초과","OK")''\nA2셀에 있는 값이 B2셀에 있는 값보다 크면 셀에 '예산 초과' 라는 텍스트를 표시해주고, A2셀에 있는 값이 B2셀에 있는 값보다 작거나 같으면 'OK'라고 표시\n\n\n〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓\n#. 조건판단문\n---------------------------------\n''1. IF THEN ELSE문''\n가장 대표적인 조건판단문이 IF구문이다. 비교 또는 논리연산자를 이용하여 조건식을 만들어 그 결과에 따라 달리 실행하도록 하는 것이다. IF문은 다음과 같은 형식으로 사용한다.\n \nIf 조건1 Then\n 조건1이 참인 경우\nElseIf 조건2 Then\n 조건2가 참인 경우\nElse\n 어느 조건도 아닌 경우\nEnd If\n\n\n''2. SELECT CASE문''\n하나의 조건식이나 변수로 여러 조건을 검사하고자 하는 경우 중첩된 블록If문을 사용할 수 있는데 이보다는 Select Case문을 이용하는 것이 한결 간결하고 편하다.\n\nSelect Case 조건식이나 변수\n Case 비교대상1\n 실행문1\n Case 비교대상2\n 실행문2\n Case Else\n 실행문3\nEnd Select\n \n조건식이나 변수가 Case문 비교대상에 부합하는 경우 Case 절 이후의 문을 수행한 후 End Select 문 다음의 문으로 넘어간다. Case Else 절은 다른 Case 문의 비교대상 중 조건식이나 변수와 부합하는 조건이 하나도 없는 경우 사용한다.\n \n예상치 않은 경우를 처리하기 위하여 Select Case 문에 Case Else 문을 함께 사용한다. 각 Case 절 안에서 여러 식이나 범위를 사용할 수 있다. 예를 들면 다음과 같은 표현도 유효하다.\n \nCase 1 To 4, 7 To 9, 11, 13, Is > 최대값\n
〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓\n#. 반복문\n---------------------------------\n''1. For - Next'' ; 명령은 반복적인 작업을 위해 사용하는 명령문이다. 일정한 횟수만큼 반복 수행한다.\n/*{{{*/\n// 문법구조\nFor 변수 = 시작값 To 종료값 (Step 변화값)\n (명령문)\n (Exit For) // 선택 사항. For 루프의 외부로 제어를 이동.\nNext 변수 \n/*}}}*/\n단순 반복문의 구조로서 작동은 다음과 같다.\n 1. For 문을 처음 만나 변수에 시작값을 넣는다.\n 2. 변수의 값이 종교값을 넘었는가 검사한다.\n 3. 명령문을 수행한다.\n 4. Next 문을 만나면 위쪽의 For 문으로 올라온다.\n 5. For문에서 변수의 변화값을 변화시킨 후 종료값을 넘었는가 검사한다.\n 6. 넘지 않았으면 3~5번을 반복수행하고, 넘었으면 For문을 빠져나온다.\n \n예1)\nFor i=1 To 5 Step 1\n s=s+i\nNext i\n\n''2. Do While ~ Loop''\n/*{{{*/\n# While 이 앞에 있는 경우이며 조건이 만족하지 않으면 실행하지 않음 \nDo While 조건문\n 실행문\nLoop\n \n# While 뒤에 있는 경우이며 무조건 한번은 실행되는 구조임\nDo \n 실행문\nLoop While 조건식\n/*}}}*/\n
''#. 전도시 교역품 목록'' ; http://nacancel.tistory.com/56\n http://d5.d5mickey.wiki/crlamw - 미키위키\n''#. 일본 위키 사이트'' ; https://translate.googleusercontent.com/translate_c?depth=5&hl=ko&ie=UTF8&nv=1&prev=_t&rurl=translate.google.com&sl=ja&tl=ko&u=http://wikiwiki.jp/voyagev/?&usg=ALkJrhjWVgJkEGHKdJ2funx0QXXDQE7r5A\n\n''#. 선박 설계도''\n| 그레이드 | E | D | C | B | A | S | X |\n| 보너스 횟수 | 0 | 1 | 2 | 3 | 4 | 5 | 7 |\n보너스 적용 개소 ... 내구성, 항속 적재 승무원, 공격, 방어, 장비 프레임 보너스의 상승량은 10 % ~ 20 %, 장비 프레임이 선택된 경우 +1이된다. \n순위 X는 기본 장착 프레임이 1 개 증가하기 있기 때문에, 보너스가 적용되면 총 +2 될 가능성이있다. \n\n''#. 특수 성능''\n중소형 이상 크기의 선박을 신규 조선 때, 배 고유의 특수 성능 (특성)을 최대 3 개까지 붙을 수 있다.\n\n▷ 특수 도시\n모든 선중에 일반 특수 성능이 추가되고\n보통의 특수 성능 이외에도 특별한 특수 성능이 붙는 경우도 있다.\n ''브랜든 (종교 도시)''\n 내구도 90 % 수리 (모든 선종에서 건조 가능) \n ''세렌디부 (정치 도시)'' ; 나오\n 도움말 포인트 업 (모든 선종에서 건조 가능) \n ''캇시테리데스 (전통 도시)''\n 돛 조종 미니 게임 횟수 업 (모든 선종에서 건조 가능) \n\n\n++++[#. 해도 입수 ]\n| 해도 | 획득 방법 |\n| 브리튼 섬 주변 1 | 메인 퀘스트 “소니아로부터의 호출”에서 소니아 한테 받음 |\n| 브리튼 섬 주변 2 | 메인 퀘스트 “라몬을의 발자취를 쫓아 라”에서 리스본에에서 받음 |\n| 브리튼 섬 주변 3 | 메인 퀘스트 “머스킷 총을 손에 넣자 '에서 엠마한테 받음 |\n| 북해 1 | 메인 퀘스트 “다음 단서를 찾아” “더블린에서 받음. |\n| 북해 2 | 메인 퀘스트 “라몬이 남긴지도를 따라가라”코펜하겐 상인한테 받음 |\n| 북해 3 | 아드리아 해 1 · 펠로폰네소스 거점 올림피아 유적을 완전 제패 |\n| 발트해 1 | 메인 퀘스트 ” 해도와 메르카토르” 암스테르담의 메르카토르에게서 받음 |\n| 발트해 2 | 중유럽 2 쾰른 남동쪽 거점 트리어 유적을 완전 제패 |\n| 발트해 3 | 메인 퀘스트 “라몬이 남긴지도를 따라가라”코펜하겐 상인한테 받음 |\n| 중유럽 1 | 메인 퀘스트 “다음 단서를 찾아” “더블린에서 받음 |\n| 중유럽 2 | 북해1 ·2 스코네 거점 알레스타나 유적을 완전 제패 |\n| 중유럽 3 | 메인 퀘스트 “소니아를 쫓아 라”에서 메르카토르한테 받음 |\n| 중유럽 4 | 메인 퀘스트 |\n| 프랑스 서해안 1 | 메인 퀘스트 “라몬의 발자취를 쫓자 - 자금을 모아보자”에서 받음 |\n| 프랑스 서해안 2 | 메인 퀘스트 “뉴턴의 설득” 콜럼버스한테 받음 |\n| 프랑스 서해안 3 | 소아시아 1 에게해 북동쪽 거점 트로이 유적을 완전 제패 |\n| 이베리아 반도 1 | 처음부터 가지고 시작 |\n| 이베리아 반도 2 | 메인 퀘스트 항해의 기본을 배우자 - 롯코를 마중하자 에서 받음 |\n| 이베리아 반도 3 | 마그레브 서부 2 페스 남쪽 거점 볼루빌리스 고대 유적을 완전 제패 |\n| 이베리아 반도 4 | 메인 퀘스트 “카시테리데스의 수수께끼 찾기” 에서 받음. |\n| 서부 지중해 1 | 초기에 니나한테 받음 |\n| 서부 지중해 2 | 메인 퀘스트 항해의 기본을 배우자 - 롯코를 마중하자 에서 받음 |\n| 서부 지중해 3 | 소아시아 3 에게해 북동쪽 거점 에페소 유적을 완전 제패 |\n| 아드리아 해 1 | 메인 퀘스트 “토스카네리을 찾아라 '에서 다빈치한테 받음. |\n| 아드리아 해 2 | 중유럽 3 쾰른 남서쪽 거점 용의 바위를 완전 제패 |\n| 아드리아 해 3 | 북해 1 ·2 올보르 거점을 린홀름호이 유적을 완전 제패 |\n| 흑해 1 | 소아시아 1 마케도니아 거점 베르기나 유적을 완전 제패 |\n| 흑해 2 | 북해 3 코펜하겐 서쪽 거점 헤오로트 궁전을 완전 제패 |\n| 흑해 3 | 메인 퀘스트 “소니아를 뒤쫓자”에서 메르카토르한테 받음 |\n| 흑해 4 | 메인 퀘스트 |\n| 소아시아 1 | 메인 퀘스트 “뉴턴의 설득”에서 뉴턴한테 받음 |\n| 소아시아 2 |\n| 소아시아 3 | 아드리아 해 1 나폴리 남쪽 거점 폼페이 유적을 완전 제패 |\n| 소아시아 4 | 메인 퀘스트 |\n| 마그레브 서부1 | 메인 퀘스트 “해도와 메르카토르”에서 메르카토르한테 받음. |\n| 마그레브 서부2 | 메인 퀘스트 “해도의 목표에서 유적 발굴”에서 쥬피톨한테 받음. |\n| 마그레브 서부3 | 사하라1 아리보리 거점 (1,3,4 층)에서 지정된 발견 물을 발굴 파리의 조사 이벤트 |\n| 마그레브 동부 1 | 메인 퀘스트 '전설의 섬과 현자의 돌'에서 뉴턴한테 받음. |\n| 마그레브 동부 2 | 중유럽2 알프스 산맥 남쪽 거점 완전 재패 |\n| 마그레브 동부 3 | 마그레브 동부 트리폴리 동쪽 거점 랩티스 마그나 유적 |\n| 이집트 1 | 메인 퀘스트 “알제 해적을 쫓아라”에서 쥬피톨한테 받음 |\n| 이집트 2 | 메인 퀘스트 “카시테리데스의 수수께기 찾기”에서 받음 |\n| 이집트 3 | 마그레브 서부1 지브롤터 거점 헤라클레스의 기둥을 완전 제패 |\n| 나일강 북부 1 | 메인 퀘스트 “뉴턴의 의뢰” 에서 받음 |\n| 나일강 북부 2 | 메인 퀘스트 “나일강 유역을 조사하라” 중간 보상 |\n| 나일강 남부 1 | 메인 퀘스트 “나일강 유역을 조사하라” 최종 보상 |\n| 나일강 남부 2 | 메인 퀘스트 “나일강 유역을 조사하라” 중간 보상 |\n| 콩고강 1 | 메인 퀘스트 |\n| 콩고강 2 | 메인 퀘스트 |\n| 아프리카 남부 1 | 메인 퀘스트 |\n| 아프리카 남부 2 | 메인 퀘스트 |\n| 마다가스카르 1 | 메인 퀘스트 |\n| 마다가스카르 2 | 메인 퀘스트 |\n| 대서양 중부 1 | 메인 퀘스트 |\n| 대서양 중부 2 | 메인 퀘스트 |\n| 카리브 해 1 | 메인 퀘스트 |\n| 카리브 해 2 | 메인 퀘스트 |\n| 멕시코 만 1 | 메인 퀘스트 |\n| 멕시코 만 2 | 메인 퀘스트 |\n| 아프리카 동부 1 | 메인 퀘스트 |\n| 아프리카 동부 2 | 메인 퀘스트 |\n| 아리비아 반도1 | 메인 퀘스트 |\n| 아리비아 반도2 | 메인 퀘스트 |\n| 루시 1 | 메인 퀘스트 |\n| 루시 2 | 메인 퀘스트 |\n| 루시 3 | 메인 퀘스트 |\n===
한라봉, 레드향, 천혜향과 같은 감귤이 12월에서 2월까지 출하\n\n!!! 카라향\n카라향의 특징은 감귤꽃이 피는 시기인 4∼5월(봄철)에 꽃과 함께 열매가 달려 수확하고\n감귤이 생산되지 않는 4~5월에 수확이 가능한 감귤로, 틈새시장을 공략할 수 있다는 장점이 있다. \n\n일본에서 카라만다린과 길포포칸이라는 감귤 품종을 교배해 육성한 품종으로 '남진해'라고도 불리고\n당도는 한라봉과 천혜향 등 다른 하우스감귤과 비슷한 14브릭스 이상으로 높지만 산도는 낮아 맛과 품질이 우수하다.\n\n<br>
여성가족부(장관 김희정)는 인터넷게임 사업자들이 심야시간대(오전0시부터 오전 6시까지) \n16세 미만 청소년에게 제공을 제한(일명‘셧다운제’)해야 하는 인터넷게임물의 범위를 5월 1일(금) 고시(5월 20일 시행)했다.\n\n''(적용대상)''\n기기별: PC\n게임물별: 온라인PC게임, 웹게임, PC패키지게임 등\n\n''(적용제외)''\n기기별: 스마트폰, 태블릿PC, 콘솔기기(* 유료 콘솔게임은 적용대상에 포함됨)\n게임물별: 플래시게임 중 일부, PC패키지게임물 중 일부\n\n○ 비영리를 목적으로 제공되고 개인정보를 수집 또는 이용하지 않는 게임물\n ※ “비영리 목적”, “개인정보 수집 및 이용” 관련 심야시간대 인터넷게임의 제공시간 제한제도 적용 여부 판단기준\n|>| 구 분 |>|>| 개인정보 수집 또는 이용 여부 |\n|>|~|수집 또는 이용하지 않음 | 수집 또는 이용함 |\n| 게 임 <br> 이용료 | 무료 |>| 제도 적용 제외 | 제도 적용 |\n|~| 유료 |>| 제도 적용 | 제도 적용 |\n\n○「게임산업진흥에 관한 법률」 제21조제1항제3호에 따라 등급분류를 받지 않는 게임물 중 시험용 게임물\n\n○「게임산업진흥에 관한 법률」 제21조제1항제1호 및 제2호에 따라 등급분류를 받지 않는 게임물 중 \n 게임대회.전시회용 게임물, 교육, 공익홍보용 게임물\n\n''(고시 적용기간)''\n2015년 5월 20일 ~ 2017년 5월 19일(2년간)\n
!! 기타\n■ 주소\n부산광역시 부산ㅈㄱ 연ㅅ로 12-열7 (ㅇㅈㄷ 95-삼6) / cf. 연ㅅ로 12-열5 (95-사3)\n\n서울시 관악구 신림동 11-48 \n 서울특별시 관악구 남부순환로182길 8 (신림동)\n\n서울특별시 구로구 신도림동 경인로 610 (신도림동, 코리아빌딩) 7층 라이브팀, 한빛소프트\n 서울특별시 구로구 신도림동413-9 코리아빌딩 \n\n서울특별시 금천구 가산동 459-11 제이플라츠 \n 서울 금천구 가산디지털1로 186 제이플라츠 빌딩 304호 / 08502\n\n\n■ 진 95-36 (연** 12-17)\n■ GMail 등록계정 : empal 계정 - goo***9*\n\n<br>\n
* 참고\n** 소전대( 燒錢臺 )\n\n<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 14px;"> <b> 종중 설립 및 등기 방법 </b> </span> \n</html>\n출처 ; http://blog.daum.net/yescheers/8597978?categoryId=789907 (안산김씨)\n\n<html> <span style="font-size: 10pt;"> <font color=RoyalBlue> <b> 종중 부동산 주소변경 등기 서류 </b> </font> </span> (* 등기소 민원실에 신청) </html>\n• 시군구청에 @@color(#3058D2): 종중등록 @@ 신청\n ▶ 등록증명서 첨부하여 등기소에 부동산 명의이전 등기 \n ▶ 농지의 경우 : 영농조합 법인설립이 가능하면 활용\n • 헌법 제21조 1항에 ‘국가는 농지에 관하여 경자유전(耕者有田)의 원칙이 달성될 수 있도록 노력하여야 하며, 농지의 소작제도는 금지된다’는 규정이 있다. \n • 또 농지법 제10조는 농지 소유자가 정당한 사유 없이 농지를 농업경영에 이용하지 않을 경우 사유가 발생한 날부터 1년 이내에 해당 농지를 처분하도록 강제하고 있다. \n• 세무서에 @@color(#3058D2): 종중 고유번호등록 @@ 신청\n\n종중 재산이 개인들 명의도 되어 있어서 이 명의를 바꾸면 종부세 대상이 되지 않는데, 종중재산이 개인명의로 되어 있어서 과세대상이 되어 종부세 고지서가 발부되면 고스란히 명의자가 혼자 납부를 해야만 하는 부담도 안고 있다.\n\n종중의 대표자와 주소가 변경된 경우에는 신대표자가 종중의 정관 기타 규약이나 결의서 등 종중 대표자의 변경을 증명하는 서면을 첨부하여 등기명의인의 표시변경등기를 할 수 있다.\n\n<html> <span style="font-size: 10pt;"> <font color=RoyalBlue> <b> 종중 부동산 주소변경 등기 서류 </b> </font> </span> (* 등기소 민원실에 신청) </html>\n<<<\n1.정관 \n2.총회 결의록\n "주소 변경 사항", "대표자 선임 사항" 의결 기록 \n 회원 3명 이상 인감증명서 및 도장 \n3.구 등기문서 \n4.종중 등록확인서 \n5.대표자 주민등록 초본, 도장.\n6.회장 직인\n<<<\n\n\n<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 14px;"> <b> 4대봉제사 (四代奉祭祀) </b> </span> \n</html>\n출처 ; http://blog.daum.net/yekus/15777775\n\n|혼(魂: 하늘기운, 陽) | - 하늘 -> | 신(神) | - 4대 -> | 영(靈) |\n|~|~|~|~| 선(仙) |\n|백(魄: 땅기운, 陰) |>|>| - 땅 -------- 4대 -> | 귀(鬼) |\n\n4대봉제사란 아버지, 할아버지, 증조할아버지, 고조할아버지까지 지내는 제사를 말한다. 조상에 대해 지내는 제사에 자신까지 여기에 포함시킬 수 없으니 당연히 4대봉제사가 된다. 전통 제례에서 고조할아버지까지는 매년 기제사(忌祭祀)를 지내지만 고조할아버지의 아버지, 즉 5대조가 되면 묘제(墓祭)를 지내는 것이 상례다.\n\n나(0대) → 아버지(1대조) → 할아버지(2대조) → 증조할아버지(3대조) → 고조할아버지(4대조)\n\n본인이 주체가 되어 조상의 대수를 헤아리면 고조할아버지까지는 4대조가 된다. 자신을 조상 대수에 넣을 수 없기 때문이다.\n...\n본래 세(世)와 대(代)는 같은 뜻으로 사용해 왔는데, 후에 당나라 태종 이세민(李世民)의 이름자인 세(世)자를 당나라 사람들이 바로 읽을 수가 없다고 하여 세(世)자 대산애 대(代)자로 바꾸어 썼다.\n\n세(世)와 대(代)의 쓰임을 정확히 알려면 이 말이 쓰이던 역사적인 배경부터 알아야 한다. 청(淸)나라 선종(宣宗) 도광(道光) 26년(1846)에 편집하여 지경학재장판(知敬學齋藏板)에서 출판한 ≪피휘록(避諱錄)≫이란 책이 있다.\n( ▶ ‘세와 대는 같은 뜻’으로 쓰인 역사적 근거 - 이병직 박사(전 부산대학교 명예교수) )\n\n\n
@@color(#04f): ▣ ODBC @@; (Open DataBase Connectivity)는 @ 2015-06-01\n마이크로소프트가 만든, 데이터베이스에 접근하기 위한 소프트웨어의 표준 규격으로, 각 데이터베이스의 차이는 ODBC 드라이버에 흡수되기 때문에 사용자는 ODBC에 정해진 순서에 따라서 프로그램을 쓰면 접속처의 데이터베이스가 어떠한 데이터베이스 관리 시스템에 관리되고 있는지 의식할 필요 없이 접근할 수 있다.\n / *.gdb, *.fdb는 InterBase 데이터베이스 시스템에서 사용되는 확장자로 ODBC 드라이버를 설치하여 파일 메뉴의 원격서버 DB 연결 메뉴를 통해 열 수 있습니다.\n / 원격서버 DB의 연결 방법 (ODBC) ; 로컬 또는 네트워크 내의 파일 기반의 데이터가 아닌 서버에 저장된 DB(MySQL, MS SQL, Oracle 등)의 자료는 ODBC 연결을 통해 한번에 가져올 수 있습니다.\n\n@@color(#04f): ▣ OHI @@; (기업 조직건강도 지수; Organizational Health Index) @ 2015-06-01\n맥킨지가 기업의 재무 및 조직 운영 건전성 측정을 위해 1991년 독자적으로 개발한 지표.\n<br>
경고가 오류로 처리되어 생성된 개체 파일이 없습니다.\n\n/WX는 컴파일러가 모든 경고를 오류로 처리하도록 합니다. 오류가 발생했기 때문에, 개체나 실행 파일이 생성되지 않았습니다. \n오류는 /WX 플래그가 설정될 때에만 나타나고 경고는 컴파일하는 동안에 발생 합니다. 이 오류를 해결 하려면, 프로젝트의 모든 경고를 제거 해야 합니다. \n\n해결하려면, 다음 방법 중 하나를 사용합니다.\n • 프로젝트에서 경고를 발생 시키는 문제를 해결 합니다.\n • 낮은 경고 수준에서 컴파일합니다 — 예를 들어 /W3 를 사용합니다 (/W4대신).\n • 경고 pragma를 사용하여 사용 안 함 또는 특정 경고를 표시 합니다.\n • 컴파일 하기 위해 /WX 사용하지 않습니다. \n\n-. Project Settings > Configuration Properties > C/C++ > General > Treat Warnings As Errors as ; No\n-. OS에 따라서 같은 버전의 Visual Studio (2005)를 사용하고 있더라도 오류가 발생되지 않는 경우가 발생\n
!!! 기타\n* http://www.icoda.co.kr/ - 아이코다\n* http://www.danawa.com/ - 다나와\n* 추천 하드 디스크 (from 2016.03.10. 양*석)\n** Western Digital ; 1 TB\n** Hitachi ; 2T\n\n| 종류 | 업체 | 종류 | 기타 |\n| 하드디스크 SSD | ADATA |Pro SP900 STAT3 256GB | 2016.04. / MLC 추천, TLC 타입은 지향 |\n|~| MICRON | | 국민 SSD ; 240 GB, 512 GB |\n| CPU | 인텔 |인텔 코어i5- 7500 (cf. i7-?) |2017.03. |\n|~| 인텔 |인텔 코어i7-4세대 4790 |2016.04. |\n| 그래픽 카드 | ZOTAC |지포스 GTX1060 MINi D5 6GB |마드보드 크기? |\n| LCD | 알파스캔 | AOC 2777 IPS MHL+DP 모니터 무결점[68.6cm] |cf. 아이코다 (from 2016.04. 문태) |\n| 노트북 | DELL |에일리언웨어/ 17인치 R3 X54E771AKR (3.78kg 무거움) |2017.03. 180만원선? |\n| 하드독 | 스카이디지탈 |SKY 알로이 듀얼독 USB3.0 (SATA 방식) |와장하드 도킹스테이션 (cf. IDE 하드용 젠더) |\n● [에이데이타/256GB/SSD] Premier Pro SP900 (R 555/W 530) \n SSD/ SATA3/ MLC/ 읽기555MB/s 쓰기530MB/s/ 무상 3년/ 가이드포함\n 최초출시 ; 2012년 5월\n\n● 메모리 DDR3 이상 ; 16GB 이상, 가상드라이버로 설정\n● 케이스 (? 마이크로 사이즈) ⇒ 마드보드 (슬롯 갯수) ⇒ 그래픽 카드\n\n\n<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 16px;"> <b> 인텔 2세대 코어 i3, i5, i7 </b> </span>\n</html>\n\n원문 ; http://it.donga.com/5326/ - 2011.04.08. IT동아, 인텔 2세대 코어 i3, i5, i7의 특징과 차이점은?\n\n인텔 2세대 코어 프로세서, i3 제품군은 보급형(저가, 업무/사무용), i5 제품군은 중급형(중가, 가정용/엔터테인먼트용), i7 제품군은 고급형(고가, 전문가/마니아용)을 뜻한다. 즉 숫자가 높을수록 성능이 높다. 물론 그만큼 가격도 비싸다.\n|! 제품군 |! 코어 i3 |! 코어 i5 |! 코어 !7 |\n| 모델명 | 코어 i3 - 21X0 | 코어 i5 - 23X0 <br> 코어 i5 - 2400 <br> 코어 i5 - 2500 | 코어 i7 - 2600 |\n| 제조 공정 | 32 nm | 32 nm | 32 nm |\n| 코어/ 쓰레드 | 2/ 4 | 4/ 4 | 4/ 8 |\n| 터보 부스트 2.0 | X | O | O |\n| 소켓 | LGA 1155 | LGA 1155 | LGA 1155 |\n| L3 캐시 메모리 | 3 MB | 6 MB | 8 MB |\n위 표에서 모델명은 각 제품군에 해당하는 프로세서이다. 모델명 중간의 ‘X’는 코어 i3-2100, 코어 i3-2120처럼 다양한 모델이 존재함을 나타낸다. 일반적으로 숫자가 높을수록 성능과 가격대가 높다.\n\n다만, 코어 수가 많다고 무조건 성능이 뛰어나다고는 할 수 없다. 과거 코어2 쿼드(4개 코어)의 경우 코어2 듀오(2개 코어) 제품보다 코어는 많은데, 동작 클럭이 낮아 부분적인 성능은 낮게 측정되는 경우도 있기 때문. 이 때문에 일부 사용자는 프로세서 선택에 혼란을 겪기도 했는데, 2세대 코어 프로세서에서는 순수하게 성능 순으로 i7 > i5 > i3로 구분하여 숫자만 보고 직관적으로 성능을 판별할 수 있도록 했다.\n\n한편 위 표에서 코어 i3, i7의 경우 쓰레드 수가 코어 수의 두 배에 해당하지만, 코어 i5는 코어 수와 쓰레드 수가 같음을 알 수 있다. 이는 코어 i3, i7이 인텔의 '하이퍼쓰레딩(Hyper-Threading)' 기술을 지원하기 때문이다. 하이퍼쓰레딩은 코어 한 개당 가상의 데이터 처리 쓰레드를 더 늘려주어 마치 처리 성능을 향상시키는 인텔의 고유 기술이다. 예컨대, 코어를 공장이라 하면, 쓰레드는 공장 내 일꾼이라 이해하면 쉽다. 다만 앞서 언급한 대로, 하이퍼쓰레딩 기술로 인해 현저한 성능 향상을 기대하긴 어렵다. 참고로 하이퍼쓰레딩 기술은 메인보드에 따라 바이오스(또는 CMOS) 설정에서 켜고 끌 수도 있다.\n\n\n!!! NAS(Network Attached Storage) 장비란?\n네트워크 망에 연결하여 사용자들이 쉽게 접근하여 대용량 데이터를 올릴 수 있는 장비.\n(TCP/IP기반으로 연결하여 데이터 송수신)\n / NAS는 기본적으로 네트워크 스토리지 기능을 갖추고 있으며 이메일 서버나 미디어 서버, 클라우드 서비스 등 각종 각종 부가기능을 손쉽게 추가하면서 자신의 서버를 상대적으로 저렴한 비용으로 구축할 수 있는 점이 특징.\n\n!!! 서버 타입\n-. ''랙 마운트형 클러스터 서버'' ; 가로로 랙 서버를 쌓아 올린 형태\n-. ''블레이드 서버'' ; 슬롯에 칼날처럼 얇은 블레이드들을 세로로 꽂는 것이 특징\n / 컴퓨팅 성능 향상에 따른 전력소비와 발열량 증가 문제를 해결할 수 있을 것으로 예상\n / 얇은 초박형 블레이드를 슬롯에 꽂아 제작하는 블레이드 서버는 두께를 얇게 구성할 수 있으므로, 수십 개 혹은 수백 개의 서버들을 하나의 캐비넷에 장착할 수 있다. 그리고 네트워크, 스위치, 스토리지, 어플라이언스 등을 특정한 기능에 따라 독립적인 블레이드로 구성할 수도 있다.\n-. ''카타리지 타입 서버'' ; 나디아(Nadia) 서버\n\n
천지를베다 공식 카페 ; http://cafe.naver.com/threejinmobile\nHanbitsoft/ T3Entertainment 의 모바일게임\n\n2015.07.23.(목) 정식오픈\n / 중국 ‘삼국지(三國志)’의 실존 역사와 다채로운 시나리오를 기반으로 다수의 적을 호쾌한 액션으로 베어 나가는 모바일 전쟁 RPG (액션 롤플레잉 게임)\n / 자신과 함께 성장할 수 있는 ‘부관 시스템’, 영지를 번영, 확장시키는 ‘영지 시스템’ 등 흥미로운 콘텐츠들을 포함\n\n정리 ; 카페 378 / 영지 점령전 정보/ 2015.05.26. \n\n!!! 메인 화면 구성\n<html> <CENTER>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/HB_world_main.PNG" width=480>\n</CENTER> </html>\n\n1. 상단 메뉴\n ▷ 계정 정보 : 닉네임과 계정레벨이 표시됩니다. \n ▷ 군량미 : 행동력으로써 계정레벨이 오르면 절대치가 확장되며, 영지에서 수확으로 획득 가능합니다. \n ▷ 보옥 : 게임 내 아이템을 구매할 수 있는 유료 캐시입니다. \n ▷ 골드 : 게임 내 아이템을 구매할 수 있는 게임 캐시입니다. \n ▷ 옵션 설정 : 음향, 그래픽을 수정할 수 있는 옵션 설정입니다. \n ▷ 채널 대화 : 해당 채널에 있는 유저와 소통할 수 있는 대화창입니다. \n\n2. 우측 메뉴 \n ▷ 도감 : NPC(부관) 정보로, 시나리오별 수집 정보를 표시합니다. >>> [[천지_도감]]\n ▷ 업적 : 각종 업적을 확인할 수 있습니다. \n ▷ 우편 : 아이템 및 골드 등 각종 보상을 받을 수 있는 공간입니다. \n\n3. 중앙 메뉴 \n ▷ 본인의 작위 정보를 확인할 수 있습니다. \n ▷ 버프 정보를 알 수 있습니다. \n ▷ 본인이 현재 플레이하고 있는 영웅을 보여줍니다.(하후연) >>> [[천지_캐릭터정보]]/ [[천지_승급정보]]\n ▷ 본인이 현재 함께 전투에 참여하고 있는 부관을 보여줍니다.(원소) >>> [[천지_부관정보]]\n ▷ 본인이 보유한 영웅은 좌측에 나열되어 있습니다.(대교, 관우) \n\n4. 하단 메뉴 \n ▷ 캐릭터 : 본인 영웅의 상세 정보를 볼 수 있습니다. \n / 무력 : 공격력 - 무관\n / 통솔 ; 방어력 - 보좌\n / 정치 ; 체력 - 문관\n / 지능 ; 스킬 공격력 - 책사\n ▷ 장비 : 각 영웅의 장비와 능력치를 볼 수 있고, 그 외 보유하고 있는 재료 및 부관을 확인할 수 있습니다. >>> [[천지_장비정보]]\n ▷ 스킬 : 영웅의 스킬을 확인할 수 있습니다. >>> [[천지_스킬정보]] \n ▷ 지도 : 중국 전 지역을 볼 수 있으며 각 영토별 정보를 확인할 수 있습니다. >>> [[천지_지도정보]] / [[천지_영지정보]]\n ▷ 친구 : 친구 목록을 볼 수 있습니다. \n ▷ 상점 : 부관 및 아이템을 구매할 수 있는 곳입니다. >>> [[천지_상점정보]] \n\n5. 좌측 하단 메뉴\n ▷ 대전모드\n ▷ 시나리오 : 삼국지 스토리를 따라가며 액션을 즐길 수 있는 스테이지입니다. >>> [[천지_시나리오]] \n\n!!! 특성창\n1. [[천지_전투정보]]\n2. [[천지_영지점령전]]\n\n\n
<html> <CENTER>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/HB_world_character01.PNG" width=480>\n</CENTER> </html>\n1. 좌측 화면 \n ▷ 현재 보유하고 있는 영웅의 모습을 한 눈에 볼 수 있고 능력치를 확인할 수 있습니다. \n\n2. 우측 화면 \n ▷ 현재 보유하고 있는 영웅을 공격력 / 방어력 / 체력 / 레벨 순으로 나열할 수 있고 캐릭터 선택 시 상세 정보를 확인할 수 있습니다. \n\n<html> <CENTER>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/HB_world_character02.PNG" width=480>\n</CENTER> </html>\n ▷ 상세 정보(클릭 시) \n 1) 영웅의 능력치 및 스킬 정보를 확인할 수 있습니다. \n - 터치 시 스킬 정보 확인 가능 \n 2) 영웅 승급 \n - 승급 조건을 만족하면 승급을 할 수 있고, 승급 시 능력치 상승과 외형이 변합니다. \n
<html> <CENTER>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/HB_world_equipment01.png" width=480>\n</CENTER> </html>\n1. 좌측 화면 \n ▷ 영웅 고유의 무기 / 장신구로써 재료를 모아 승급할 수 있습니다. \n ▷ 무기 / 목걸이 / 팔찌 / 반지 \n 1) 무기, 목걸이, 팔찌, 반지는 승급 시 등급(A, B, C, D)을 부여 받습니다. \n - A : 보라색, B : 파란색, C : 초록색 D : 검은색 \n\n2. 우측 화면 \n ▷ 현재 장착 중인 부관 정보와 재료 / 부관 / 기타 정보를 확인할 수 있습니다.\n\n<html> <CENTER>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/HB_world_equipment02.png" width=480>\n</CENTER> </html>\n1. 아이템 카테고리\n ▷ 이전 아이템\n 1) 승급된 아이템의 등급이 낮을 경우, 옵션을 다 장착한 후 다시 승급시킬 수 있다.\n 2) 재승급된 아이템의 등급이 낮을 경우 '분해'를 통해 승급시 장착한 아이템을 회수 할 수 있다 (파괴될 수도 있음).\n\n<html> <CENTER>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/HB_world_upgrade05.jpg" width=480>\n</CENTER> </html>\n\n ▷ 현재 아이템\n 1) 옵션을 다 장착한 경우, 무기/ 장신구를 @@color(#ff0000): ''승급''@@ 시킬 수 있다.\n\n<html> <CENTER>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/HB_world_upgrade01.png" width=480>\n</CENTER> </html>\n\n2. 장비 세부 정보 \n ▷ 무기 / 목걸이 / 팔찌 / 반지 클릭 \n 1) 각 파츠별 해당하는 재료를 다 모으면 승급할 수 있습니다. \n 2) “+” 표시 터치 시 획득할 수 있는 스테이지 정보를 가르쳐 주고 바로 이동할 수 있습니다. \n 3) 등급에 따라 제공되는 옵션 개수가 달라집니다. \n 4) 이전 무기로 돌아가 재료를 다시 모아 재승급도 가능합니다.\n\n<html> <CENTER>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/HB_world_equipment03.png" width=480>\n</CENTER> </html>\n ▷ 재료 : 무기 / 장신구에 장착할 수 있고 강화에 사용됩니다.\n\n<html> <CENTER>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/HB_world_equipment04.png" width=480>\n</CENTER> </html>\n ▷ 부관 : 현재 장착 중인 부관을 보여줍니다.\n\n<html> <CENTER>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/HB_world_equipment05.png" width=480>\n</CENTER> </html>\n ▷ 보유하고 있는 부관을 보여주고 누르면 상세 정보를 볼 수 있습니다.\n\n<html> <CENTER>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/HB_world_equipment06.png" width=480>\n</CENTER> </html>\n ▷ 기타 재료를 확인할 수 있습니다. \n
<html> <CENTER>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/HB_world_skill01.png" width=480>\n</CENTER> </html>\n1. 액티브\n ▷ 스킬 1 : Lv.1부터 사용할 수 있습니다. \n ▷ 스킬 2 : Lv.5부터 사용할 수 있습니다. \n ▷ 스킬 3 : Lv.10부터 사용할 수 있습니다. \n ▷ 남은 스킬 포인트 : 캐릭터의 레벨이 오를 때마다 스킬 포인트를 1포인트씩 획득합니다. \n ▷ 스킬 레벨업 : 스킬 포인트와 골드를 이용해 스킬을 레벨업 합니다. \n\n<html> <CENTER>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/HB_world_skill02.png" width=480>\n</CENTER> </html>\n1. 패시브\n ▷ 특별한 조작없이 발동되는 스킬로써 영웅마다 고유의 패시브를 보유하고 있습니다. \n\n<html> <CENTER>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/HB_world_skill03.png" width=480>\n</CENTER> </html>\n1. 특수\n ▷ 필살기 스킬의 능력치를 올려주는 영웅 공통 스킬입니다.\n ▷ 기마 상태에서의 능력치를 올려주는 영웅 공통 스킬입니다.\n\n
<html> <CENTER>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/HB_world_map01.jpg" width=480>\n</CENTER> </html>\n1. 활성화 \n ▷ 지도는 시나리오 1-1을 클리어하면 자동 활성화됩니다. \n2. 영지의 종류 >>> [[천지_영지정보]]\n ▷ 영지 : 시나리오를 통해 획득한 영토는 본인 고유의 영토로써 부관을 임명할 수 있습니다. \n * 최초 획득하는 영지는 ‘수도’로서 다양한 컨텐츠를 즐길 수 있습니다. \n ▷ 점령지 : 영지 점령전을 통해 획득한 영토로써 골드 및 아이템을 보내오기도 합니다. \n\n<html> <CENTER>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/HB_world_map02.png" width=480>\n</CENTER> </html>\n ▷ 각 영토는 특징이 존재합니다. \n 1) 벼 문양(농업 수치) : 농가에서 군량미 획득이 빠릅니다. \n 2) 금괴 문양(상업 수치) : 상가에서 상납금 징수가 빠릅니다. \n 3) 망치 문양(공업 수치) : 대장간에서 획득하는 아이템이 좋습니다. \n 4) 책 문양(학문 수치) : 교습소에서 부관 강화시 능력치가 높게 올라갑니다. \n\n
<html> <CENTER>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/HB_world_area01.png" width=480> <br>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/HB_world_area02.png" width=480>\n</CENTER> </html>\n1. 좌측 화면 \n ▷ 태수 : 부관의 능력치에 따라 영웅의 모든 능력치가 상승합니다. \n ▷ 무관 : 부관의 능력치(무력)에 따라 공격력이 상승합니다.\n ▷ 문관 : 부관의 능력치(정치)에 따라 체력이 증가합니다.\n ▷ 보좌 : 부관의 능력치(통솔)에 따라 방어력이 상승합니다.\n ▷ 책사 : 부관의 능력치(지능)에 따라 스킬 데미지가 증가합니다.\n\n<html> <CENTER>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/HB_world_loading01.jpg" width=480> <br>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/HB_world_area12.jpg" width=480>\n</CENTER> </html>\n2. 중앙 화면(우측으로 이동 가능) \n ▷ 관청 : 백성들에게 받은 퀘스트(느낌표 말풍선)를 확인할 수 있습니다. \n ▷ 병영 : 영지 방어를 위해 강화할 수 있습니다. \n ▷ 국고 : 세금 징수를 통해 골드를 수급할 수 있습니다. \n ▷ 등용소 : 부관을 거래할 수 있습니다. \n ▷ 교습소 : 부관을 강화할 수 있습니다.\n ▷ 농장 : 군량미를 수확할 수 있습니다. \n ▷ 상회 : 상납금 징수를 통해 골드를 수급할 수 있습니다. \n\n3. 우측 화면 \n ▷ 전적 기록을 확인 하실 수 있습니다. \n\n4. 하단 화면 \n ▷ 수도의 간략한 정보를 제공합니다.\n\n<html> <CENTER>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/HB_world_area03.png" width=480> <br>\n<느낌표 말풍선 터치 시> <br>\n<br>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/HB_world_area04.png" width=480> <br>\n<관청> <br>\n<br>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/HB_world_area05.png" width=480> <br>\n<병영> <br>\n<br>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/HB_world_area06.png" width=480> <br>\n<국고> <br>\n<br>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/HB_world_area07.png" width=480> <br>\n<교습소> <br>\n<br>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/HB_world_area08.png" width=480> <br>\n<등용소> <br>\n<br>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/HB_world_area09.png" width=480> <br>\n<농장> <br>\n<br>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/HB_world_area10.png" width=480> <br>\n<상회> <br>\n</CENTER> </html>\n\n<html> <CENTER>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/HB_world_area11.png" width=480>\n</CENTER> </html>\n5. 수도를 제외한 영지 \n ▷ 시나리오로 획득한 영지 중 수도를 제외한 영지에도 부관을 임명할 수 있습니다. \n ▷ 이 곳에 임명된 부관은 영웅과 각 영토 방어에 버프를 제공합니다.\n\n
<html> <CENTER>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/HB_world_store01.png" width=480>\n</CENTER> </html>\n1. 부관 뽑기 : 유료 캐시와 게임 캐시, 우정 포인트로 부관을 획득할 수 있습니다. \n2. 그 외 보옥(유료 캐시), 군량미(행동력), 금(게임 캐시), 기타를 구매할 수 있습니다.\n\n
<html> <CENTER>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/HB_world_scenario01.png" width=480> <br>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/HB_world_scenario02.jpg" width=480> <br>\n</CENTER> </html>\n1. 일반 모드 \n ▷ 삼국지의 스토리를 따라가는 시나리오 모드로 각 시나리오 마다 10개 이상의 스테이지가 존재합니다. \n ▷ 행동력인 군량미를 소모하여 스테이지에 참여할 수 있습니다. \n ▷ 각 스테이지를 클리어하면 경험치, 골드, 재료, 부관을 획득할 수 있습니다. \n ▷ 앞 장을 클리어하면 다음 장이 자동으로 해금됩니다. \n ▷ 1장을 클리어하면 어려움 모드가 해금됩니다. \n\n<html> <CENTER>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/HB_world_scenario03.png" width=480> <br>\n</CENTER> </html>\n2. 어려움 모드 \n ▷ 일반 모드보다 난이도가 높지만 경험치와 골드 획득량이 많고 승급 시 필요한 인장을 획득할 수 있습니다. \n ▷ 인장 : 2차 승급(2성→3성) 시 필요한 재료로 각 진영 별로 나뉘어져 있습니다. 승급을 위해서는 해당 진영의 인장을 획득해야 합니다. \n ▷ 인장 이미지는 가이드에서 [장비]-[기타] 참조 \n\n
@@bgcolor(#f2f2ff): DLC (Downlodable Contents) @@\n인터넷을 통해 비디오게임의 공식 콘텐츠를 배포하는 것을 의미한다. DLC는 게임 내의 의상추가에서 확장팩처럼 새로운 스토리의 확장에 이르기까지 여러 종류가 있다. 즉 DLC는 새로운 게임 모드, 사물, 레벨과 도전과제 등을 완성되고 이미 발매된 게임에 추가하는 것이라고 할 수 있다. 또는 게임 종류에 따라서 언락 확장 패치를 다운로드 받는 방식도 존재한다. (from 위키백과)\n\n\n
<html> <CENTER>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/HB_world_combat01.png" width=480>\n</CENTER> </html>\n1. 이동 \n ▷ 전,후,좌,우로 조작 가능합니다. \n ▷ 기본 공격으로 연속 타격 모션이 있습니다. \n ▷ 스킬 공격으로 각 쿨타임이 존재합니다. \n ▷ 구르기로 회피할 수 있습니다. \n ▷ 자동 전투 : 네비게이션에 따라 자동으로 전투합니다. \n\n<html> <CENTER>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/HB_world_combat02.png" width=480>\n</CENTER> </html>\n ▷ 자동스킬 : 스테이지 1번 클리어 후 구현되며, 네이게이션에 따라 스킬을 사용하며 자동으로 전투합니다.\n ▷ 필살 : 필살 스킬을 사용 할 수 있습니다.\n\n2. 부관 \n ▷ 부관이 함께 전투에 참여하면 부관의 능력치에 따라 영웅에게 버프 효과를 줍니다. \n\n<html> <CENTER>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/HB_world_combat03.png" width=480>\n</CENTER> </html>\n3. 오브젝트 \n ▷ 항아리 : 말을 부르는 마패 / 회복할 수 있는 음식 / 아이템 및 골드 등이 숨겨져 있습니다. \n ▷ 장애물 : 기본 공격으로 장애물을 파괴해 앞으로 진행할 수 있습니다. \n\n<html> <CENTER>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/HB_world_combat04.png" width=480>\n</CENTER> </html>\n4. 보스 \n ▷ 각 스테이지마다 존재하는 보스로써 강력한 힘과 높은 체력을 보유하고 있습니다. \n ▷ 힘겨루기 : 근접 공격 시 랜덤으로 발동되며 힘겨루기 스킬이 높고 영웅의 능력치가 높을수록 승리할 가능성이 높습니다.\n\n<html> <CENTER>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/HB_world_combat05.png" width=480>\n</CENTER> </html>\n5. 승리 보상 \n ▷ 스테이지에서 획득한 보상 외 승리 보상을 선택할 수 있습니다. \n ▷ 재뽑기를 통해 다른 보상을 택할 수 있습니다.\n\n
<html> <CENTER>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/HB_world_upgrade01.png" width=480> <br>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/HB_world_upgrade02.jpg" width=480>\n</CENTER> </html>\n1. 승급\n ▷ 무기 / 장신구를 영웅 승급 조건에 맞게 모두 승급하시면 메인 화면에 승급 버튼이 활성화 됩니다.\n\n<html> <CENTER>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/HB_world_upgrade03.png" width=480> \n</CENTER> </html>\n2. 승급\n ▷ 승급 조건 달성 후 영웅 승급 버튼을 누르시면 일정 골드를 소모하여 영웅이 승급 됩니다.\n\n<html> <CENTER>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/HB_world_upgrade04.png" width=480> \n</CENTER> </html>\n3. 승급\n ▷ 영웅 승급은 총 5차 승급까지가능합니다.\n ▷ 영웅 승급 시 능력치와 코스트가 올라가고 외형 변화가 있습니다.\n\n
<html> <CENTER>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/HB_world_adjutant01.jpg" width=480> <br>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/HB_world_adjutant03.jpg" width=480>\n</CENTER> </html>\n1. 부관의 종류 \n ▷ 부관은 총 300여 종 이상으로 2성부터 6성까지 다양하게 준비되어 있습니다. \n ▷ 추후 업데이트를 통해 지속적으로 나올 예정입니다. \n\n2. 부관 획득 방법 \n ▷ 부관은 상점에서 뽑기나 시나리오에서 승리 보상을 통해 획득 가능하고 등용소에서도 획득하실 수 있습니다. \n\n3. 부관의 용도 \n ▷ 전투에 함께 참여할 수 있습니다. \n ▷ 수도나 영지에 및 무관 / 문관 / 책사 / 보좌로 임명해 영웅과 영토에 버프를 줄 수 있습니다. \n\n<html> <CENTER>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/HB_world_adjutant02.jpg" width=480>\n</CENTER> </html>\n4. 부관 합성 \n ▷ 부관이 Lv.10(Max)이 되면 합성할 수 있습니다. \n ▷ 합성에 필요한 부관 역시 Lv.10이어야 하며 같은 등급의 부관이어야 합니다. \n ▷ 각 등급별 합성에 필요한 부관의 수(본인 제외)는 아래와 같습니다. \n| 1성 ~2성 | 3성 ~ 4성 | 5성 |\n| +1장 | +2장 | +3장 |\n ▷ 부관 합성을 하면 한 단계 상위 등급의 부관을 랜덤으로 획득할 수 있습니다.\n ▷ 합성을 시도할 경우 실패 없이 100% 성공합니다.\n ▷ 동일한 부관으로만 합성을 진행 할 시 동일한 부관으로 진화 됩니다.\n\n5. 부관 귀속 시스템 \n ▷ 부관을 한 번이라도 이용하면 귀속되기 때문에 주의하셔야 합니다. \n * 이용 : 전투 참가, 퀘스트 위임, 영지 관직 임명 등 귀속 시 경매장에서 거래가 불가능합니다.\n\n
<html> <CENTER>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/HB_world_dominion01.png" width=480>\n</CENTER> </html>\n1. 매칭 \n ▷ 시나리오 2-1을 클리어해야 영지 점령전을 할 수 있습니다. \n ▷ 지도에서 자신의 영토 주변 빨간 색 영토를 공격할 수 있습니다. \n ▷ 빨간 색 영토를 클릭하면 그 영토를 보유한 유저들의 목록을 확인할 수 있습니다. \n ▷ 알맞은 상대를 찾아 공격할 수 있고 승리하면 영토를 획득하게 됩니다. \n\n<html> <CENTER>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/HB_world_dominion02.png" width=480>\n</CENTER> </html>\n2. 영지 점령전 \n ▷ 천하통일을 위해 영토를 뺏고 뺏기는 전투를 영지 점령전이라고 합니다. \n ▷ 자신의 영지에 침공이 왔을 때 푸쉬 알람으로 알려줍니다. \n ▷ 방어자 : 영지 점령전이 시작되면 두 가지 방법으로 대응할 수 있습니다. \n 1) 직접전투(실시간 PVP) \n - 전투에 참여하여 본인이 보유한 영웅과 현재 장착하고 있는 부관으로 방어를 할 수 있습니다. \n - 시간이 다소 흘러도 영지 침공 텍스트가 노출되고 있으면 전투 중이니 참여할 수 있습니다. \n - 실시간 PVP를 진행해서 승리하면 방어에 성공합니다. \n 2) 전투위임 \n - 본인이 보유한 영웅과 장착 중인 부관이 전투하는 것은 직접전투와 동일하지만, 전투가 자동으로 이루어집니다. \n - 전투 상황을 이미지로 대체하여 결과만 확인할 수 있습니다. \n 3) 부관 방어 \n - 유저가 위 두 가지 방법을 사용하지 않으면 침공당한 영토에 임명한 부관들이 자동으로 방어합니다. \n ▷ 공격 \n 1) 최초에 시나리오 모드와 동일하게 해당 영지의 병사들과 부관들을 처치하면 승리하고 영지를 획득합니다. \n 2) 타 유저가 실시간으로 방어를 하러 오면 기존에 전투 중이던 병사와 부관은 사라지고 타 유저와 PVP를 진행하게 됩니다. 승리 시 영토를 획득합니다. \n\n<html> <CENTER>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/HB_world_dominion03.png" width=480>\n</CENTER> </html>\n3. 작위 \n ▷ 영토 보유 개수에 따라 작위가 부여됩니다. \n\n
!!! 부관 정보\n+++[1장 황천의 광풍]\n| 이름 | 등급 | 공격력 | 체력 | 방어력 | 사거리 || 통솔 (보좌) | 무력 (무관) | 지력 (책사) | 정치 (문관) |\n| | | 스킬 1 | | | || 팀 효과 | | | |\n| !고승 | 1 | 109 | 1,103| 41 | 4 || 19 | 21 | 12 | 14 |\n|~| 2 | 149 | 1,929| 54 | 4 || 23 | 25 | 14 | 17 |\n| | | 갑옷 파괴 | | | || | | | |\n|~|>|>|>|>|>|>|>|>|>|+++[열전] 황건의 무장. 장보의 부장으로 주준과 유비가 쳐들어왔을 때 장보의 명령으로 선봉을 맡아 곡양에서 싸움을 걸었으나 장비에게 몇 합만에 죽음을 당한다. === |\n| !공도 | 1 | 101 | 1,054| 40 | 4 || 17 | 20 | 13 | 14 |\n|~| 2 | 140 | 1,823| 52 | 4 || 20 | 24 | 16 | 17 |\n| | | 갑옷 파괴 | | | || | | | |\n|~|>|>|>|>|>|>|>|>|>|+++[열전] 황건의 무장. 황건의 난 이후에도 유벽과 함께 여남에서 세력을 쌓는다. 원소와 조조가 싸울 때 유비에게 호흥하여 조조를 공격하였다. === |\n| !등무 | 1 | 93 | 985| 39 | 2 || 15 | 19 | 13 | 12 |\n|~| 2 | 136 | 1,736| 50 | 2 || 19 | 24 | 16 | 15 |\n| | | 강타 | | | || 단역의 비애 | | | |\n|~|>|>|>|>|>|>|>|>|>|+++[열전] 황건의 무장. 정원지의 부장으로 5만의 군사로 탁군에 쳐들어 왔다가 장비에게 죽음을 당한다. === |\n| !손하 | 1 | 102 | 1,062| 40 | 15 || 18 | 20 | 14 | 13 |\n|~| 2 | 141 | 1,843| 53 | 15 || 22 | 24 | 17 | 16 |\n| | | 둔화사격 | | | || 의리의 단역 | | | |\n|~|>|>|>|>|>|>|>|>|>|+++[열전] 황건의 무장. 황건적의 난 때 완성을 점검하면서 주준에 맞서 싸웠지만 손견의 공격을 받아 완성이 함락되자 도망치다 정산에서 추격당하여 베어진다. === |\n| !유벽 | 1 | 105 | 1,071| 41 | 15 || 20 | 20 | 15 | 10 |\n|~| 2 | 145 | 1,862| 55 | 15 || 24 | 24 | 18 | 12 |\n|~| 3 | | | | || 31 | 31 | 23 | 16 |\n| | | 빙결 | | | ||불굴의 황건적 | | | |\n|~|>|>|>|>|>|>|>|>|>|+++[열전] 황건의 무장. 황소, 하의, 하만 등과 함께 여남, 영천에서 할거했다. 원술과 손견에게 호응하여 지원을 받다 196년 조조의 공격을 받아 참수 되었다. === |\n| !장각 | 2 | 126 | 2,212| 62 | 15 || 30 | 17 | 25 | 25 |\n| | | 황천의 바람 | 변심 | 창천이사 | || 천지인 | | | |\n|~|>|>|>|>|>|>|>|>|>|+++[열전] 수만명의 신도를 모아 조직화 하여 184년에 한 왕조 타도를 기치로 거병하였으며 순식간의 8주에 영향을 끼쳐 세력을 장악하였다. 노식, 동탁이 이끄는 관군에 대항해 우세하게 싸웠으나 곧 병사하였다. === |\n| !장보 | 2 | 123 | 1,997| 58 | 15 || 26 | 18 | 22 | 20 |\n|~| 3 |\n|~| 4 | | | | || 41 | 26 | 24 | 31 |\n| | | 황천의 불꽃 | 낙석 | | || 천지인 | | | |\n|~|>|>|>|>|>|>|>|>|>|+++[열전] 황건적의 난을 일으킨 장각의 동생으로 스스로 (지공 장군)이라 칭했다. 주준, 유비에 맞서 요술을 사용했지만 이내 요술이 깨져 양성으로 후퇴했으며 부하 장수인 엄정에게 목이 잘려 죽었다. === |\n| !장량 | 2 | 146 | 1,957| 55 | 4 || 24 | 24 | 20 | 18 |\n|~| 3(이) | 266 | 4,300| 104 | 4 || 29 | 29 | 24 | 22 |\n|~| 4(이) | 545 | 10,332| 224 | 4 || 37 | 37 | 30 | 27 |\n| | | 장군의 위세 | 검기 | | || 천지인 | | | |\n|~|>|>|>|>|>|>|>|>|>|+++[열전] 황건적의 난을 일으킨 장각의 셋째 동생. 스스로 (인공장군)이라 칭했다. 장각과 함께 노식과 동탁의 공격을 물리치고 장각이 병사 한 뒤에도 광종을 지키면서 항보숭을 물리 쳤으나 적을 깔보다 야습을 받아 전사한다. === |\n| !정원지 | 1 | 104 | 1,074| 40 | 4 || 16 | 20 | 12 | 13 |\n|~| 2 | 144 | 1,848| 54 | 4 || 19 | 24 | 14 | 16 |\n| | | 강타 | | | || 단역의 비애 | | | |\n|~|>|>|>|>|>|>|>|>|>|+++[열전] 황건의 무장. 등무와 함께 5만의 군사로 탁군에 쳐들어 왔다가 관우에게 죽음을 당한다. === |\n| !파재 | 1 | 99 | 1,067| 40 | 4 || 16 | 19 | 14 | 14 |\n|~| 2 | 138 | 1,837| 53 | 4 || 19 | 23 | 17 | 17 |\n| | | 독강타 | | | || | | | |\n|~|>|>|>|>|>|>|>|>|>|+++[열전] 황건의 거사 중 한 명. 영천에서 주준이 이끄는 관군을 격파하고 황보숭의 군사를 포위하였으나 황보숭의 화공과 주준, 조조, 손견군의 연합 공격을 받아 패했다. === |\n| !하의 | 1 | 96 | 1,089| 42 | 4 || 18 | 18 | 15 | 14 |\n|~| 2 | 136 | 1,887| 55 | 4 || 22 | 22 | 18 | 17 |\n| | | 독화살 | | | || 불굴의 황건적 | | | |\n|~|>|>|>|>|>|>|>|>|>|+++[열전] 황건의 무장. 유벽, 황소, 하만 등과 함께 여남, 영천에서 큰 세력을 만들었으며 수만명의 군사를 거느리고 원술에게 귀부했다가 손견에게 귀부하였다. === |\n| !한충 | 1 | 110 | 1,149| 43 | 2 || 20 | 20 | 15 | 13 |\n|~| 2 | 152 | 2,004| 58 | 2 || 24 | 24 | 18 | 16 |\n|~| 3 | | | | || 30 | 30 | 23 | 19 |\n| | | 방패 후려치기 | | | || 의리의 단역 | | | |\n|~|>|>|>|>|>|>|>|>|>|+++[열전] 황건의 무장. 완성을 점거하면서 주준을 이끄는 관군들과 싸웠지만 조홍이 전사하자 그가 수령이 되어 완성을 탈취하였다. 성밖으로 공격하러 나왔다가 관군에 격파 되어 항복했지만 남양태수 진힐에게 죽임을 당한다. === |\n| !밀우 | 5 | 1,145 | 22,860| 466 | 3 || 69 | 75 | 33 | 26 |\n| | | 화궁 | 난사 | 결사 | || 개마무사 | | | |\n|~|>|>|>|>|>|>|>|>|>|+++[열전] 고구려 동천왕의 무장. 위나라 관구검 부대에 맞서 싸웠다. 관구검에게 패해 퇴각하는 동천왕을 지키기 위해 결사대를 조직하여 동천왕을 가까스로 지킨다. 훗날 동천왕은 목숨을 걸고 자신을 지킨 밀우에게 1등 동신록을 내렸다. === |\n\n| 팀 효과 |>|>|>|>|>| 구성 | 효과 |\n| 개마무사 | 고남무 | 고우위거 | 명림답부 | 을파소 | 밀우 | |공격력 증가 + 20%, 방어력 증가 + 15%, 체력 증가 + 20%,<br> 공격속도 + 15%, 상태이상 저항 + 25% |\n| 단역의 비애 | 등무 | 정원지 | | | | |공격력 증가 + 10% |\n| 불굴의 황건적 | 유벽 | 하의 | 황소 | 하만 | | |공격력 증가 + 25%, 방어력 증가 + 25%, 체력 증가 + 25%, 공격속도 + 15%, 상태이상 저항 +50% |\n| 의리의 단역 | 한충 | 손하 | | | | |공격력 증가 - 10%, 체력 증가 + 30% |\n| 천지인 | 장보 | 장량 | 장각 | | | |공격력 증가 + 5%, 체력 증가 + 25%, 상태이상 저항 + 5% |\n===\n\n++++[2장 동탁 토벌전]\n| 이름 | 등급 | 공격력 | 체력 | 방어력 | 사거리 || 통솔 (보좌) | 무력 (무관) | 지력 (책사) | 정치 (문관) |\n| | | 스킬 1 | | | || 팀 효과 | | | |\n| !가후 | 3 | 172 | 3,963 | 90 | 15 || 24 | 16 | 41 | 39 |\n| | | 스킬1 | | | || 신뢰의 관계 | 군략가 | | |\n|~|>|>|>|>|>|>|>|>|>|+++[특성] 내용 1 <br> 내용 2 === |\n| !곽사 | 2 | 156 | 2,114 | 59 | 3 || 26 | 24 | 20 | 18 |\n|~| 3 | 279 | 4,601 | 111 | 3 || 31 | 29 | 24 | 22 |\n| | | 스킬1 | | | || 기회의 사나이 | 요행의 상징 | | |\n|~|>|>|>|>|>|>|>|>|>|+++[특성] 내용 1 <br> 내용 2 === |\n| !동민 | 1 | 100 | 1,077 | 40 | 3 || 17 | 20 | 12 | 17 |\n|~| 2 | 134 | 1,931 | 53 | 3 || 19 | 22 | 17 | 24 |\n|~| 3 | 264 | 4,400 | 100 | 3 || 25 | 29 | 20 | 29 |\n| | | 스킬1 | | | || 가문의 위상 | | |\n|~|>|>|>|>|>|>|>|>|>|+++[특성] 내용 1 <br> 내용 2 === |\n| !동탁 | 3 | 372 | 5,619 | 127 | 3 || 39 | 41 | 24 | 25 |\n|~| 4 |\n|~| 5(합) | 1,081 | 23,194 | 459 | 3 || 56 | 59 | 35 | 36 |\n| | | 스킬1 | | | || 가문의 위상 | 삼각관계 | | |\n|~|>|>|>|>|>|>|>|>|>|+++[특성] 내용 1 <br> 내용 2 === |\n| !번조 | 1 | 100 | 1,896 | 41 | 15 || 19 | 19 | 13 | 15 |\n|~| 2 | 145 | 2,005 | 55 | 15 || 24 | 24 | 18 | 21 |\n|~| 3 | 264 | 4,415 | 104 | 15 || 29 | 29 | 22 | 25 |\n| | | 스킬1 | | | || 기회의 사나이 | | | |\n|~|>|>|>|>|>|>|>|>|>|+++[특성] 내용 1 <br> 내용 2 === |\n| !서영 | 2 | 192 | 2,254 | 62 | 4 || 30 | 31 | 24 | 14 |\n|~| 3 | 342 | 4,991 | 120 | 4 || 36 | 37 | 29 | 17 |\n| | | 스킬1 | | | || | | | |\n|~|>|>|>|>|>|>|>|>|>|+++[특성] 내용 1 <br> 내용 2 === |\n| !양봉 | 1 | 100 | 1,037 | 40 | 3 || 17 | 20 | 11 | 13 |\n|~| 2 | 146 | 1,886 | 53 | 3 || 21 | 15 | 16 | 18 |\n|~| 3 | 298 | 4,498 | 106 | 3 || 28 | 34 | 19 | 22 |\n| | | 스킬1 | | | || | | | |\n|~|>|>|>|>|>|>|>|>|>|+++[특성] 내용 1 <br> 내용 2 === |\n| !여포 | 3 | 489 | 6,171 | 141 | 4 || 41 | 55 | 17 | 12 |\n|~| 4(진) | 943 | 14,167 | 298 | 4 || 49 | 70 | 20 | 14 |\n| | | 스킬1 | | | || 동탁선봉대 | 삼각관계 | | |\n|~|>|>|>|>|>|>|>|>|>|+++[특성] 내용 1 <br> 내용 2 === |\n| !우보 | 1 | 118 | 1,116 | 40 | 3 || 18 | 23 | 13 | 14 |\n|~| 2 | 159 | 1,948 | 54 | 3 || 22 | 28 | 16 | 17 |\n|~| 3 | 313 | 4,532 | 106 | 3 || 28 | 36 | 19 | 20 |\n| | | 스킬1 | | | || 가문의 위상 | | | |\n|~|>|>|>|>|>|>|>|>|>|+++[특성] 내용 1 <br> 내용 2 === |\n| !이각 | 2 | 156 | 2,054 | 55 | 15 || 24 | 26 | 17 | 21 |\n|~| 3 | 325 | 4,935 | 115 | 15 || 34 | 36 | 17 | 21 |\n| | | 스킬1 | | | || 기회의 사나이 | 요행의 상징 | | |\n|~|>|>|>|>|>|>|>|>|>|+++[특성] 내용 1 <br> 내용 2 === |\n| !이숙 | 1 | 59 | 933 | 37 | 15 || 15 | 12 | 21 | 18 |\n|~| 2 | 89 | 1,593 | 48 | 15 || 18 | 14 | 25 | 22 |\n|~| 3 | 180 | 3,610 | 88 | 15 || 23 | 18 | 33 | 28 |\n| | | 스킬1 | | | || | | | |\n|~|>|>|>|>|>|>|>|>|>|+++[특성] 내용 1 <br> 내용 2 === |\n| !이유 | 2 | 81 | 1,589| 48 | 15 || 18 | 12 | 38 | 25 |\n|~| 3 | 163 | 3,477| 84 | 15 || 22 | 15 | 46 | 30 |\n|~| 4(진) | 330 | 7,984| 169 | 15 || 26 | 18 | 55 | 36 |\n| | | 스킬1 | | | || | | | |\n|~|>|>|>|>|>|>|>|>|>|+++[특성] 내용 1 <br> 내용 2 === |\n| !장수 | 2 | 136 | 2,109| 58 | 3 || 28 | 21 | 21 | 24 |\n|~| 3 | 248 | 4,672 | 111 | 3 || 34 | 25 | 25 | 29 |\n|~| 4(이) | 404 | 8,976 | 193 | 3 || 40 | 30 | 30 | 35 |\n| | | 스킬1 | | | || 신뢰의 관계 | | | |\n|~|>|>|>|>|>|>|>|>|>|+++[특성] 내용 1 <br> 내용 2 === |\n| !장제 | 2 | 137 | 1,990| 57 | 4 || 26 | 22 | 17 | 19 |\n|~| 3 | 257 | 4,631| 115 | 4 || 35 | 26 | 20 | 23 |\n| | | 스킬1 | | | || 기회의 사나이 | | | |\n|~|>|>|>|>|>|>|>|>|>|+++[특성] 내용 1 <br> 내용 2 === |\n| !초선 | 2 | 63 | 1,445| 45 | 3 || 16 | 9 | 39 | 24 |\n|~| 3 | 133 | 3,222| 81 | 3 || 20 | 11 | 48 | 30 |\n| | | 스킬1 | | | || 삼각관계 | | | |\n|~|>|>|>|>|>|>|>|>|>|+++[특성] 내용 1 <br> 내용 2 === |\n| !호진 | 1 | 124 | 1,149 | 41 | 3 || 20 | 24 | 11 | 12 |\n|~| 2 | 169 | 2,016 | 57 | 3 || 24 | 29 | 13 | 14 |\n|~| 3 | 327 | 4,710 | 111 | 3 || 31 | 37 | 16 | 17 |\n| | | 스킬1 | | | || 동탁선봉대 | | | |\n|~|>|>|>|>|>|>|>|>|>|+++[특성] 내용 1 <br> 내용 2 === |\n| !화웅 | 3 | 347 | 4,838 | 111 | 4 || 30 | 40 | 21 | 20 |\n| | | 스킬1 | | | || 동탁선봉대 | 명성의 희생사 | | |\n|~|>|>|>|>|>|>|>|>|>|+++[특성] 내용 1 <br> 내용 2 === |\n| !고우위거 | 5 | 1,428 | 27,217| 540 | 3 || 66 | 82 | 30 | 26 |\n| | | 스킬 1 | | | || 개마무사 | | | |\n|~|>|>|>|>|>|>|>|>|>|+++[특성] 내용 1 <br> 내용 2 === |\n\n| 팀 효과 |>|>|>|>|>| 구성 | 효과 |\n| 가문의 위상 | 동탁 | 동민 | 우보 | | | |공격력 증가 - 15 %, 방어력 증가 - 10 %, 체력 증가 + 60 % |\n| 군략가 | 정욱 | 가후 | 곽가 | | | |공격력 증가 + 8 %, 방어력 증가 + 5 %, 체력 증가 + 5 % |\n| 기회의 사나이 | 장제 | 이각 | 곽사 | 번조 | | |공격력 증가 + 15 %, 방어력 감소 - 10 %, 체력 증가 + 30 %, 공격 속도 + 15 % |\n| 동탁선봉대 | 호진 | 여포 | 화웅 | | | |공격력 증가 + 15%, 방어력 증가 + 15%, 체력 증가 + 15% |\n| 명성의 희생자 | 화웅 | 안량 | 문추 | | | |공격력 증가 + 13 %, 방어력 증가 + 13 %, 체력 증가 + 13 % |\n| 삼각관계 | 여포 | 동탁 | 초선 | | | |공격력 증가 + 8 %, 체력 증가 + 8 %, 상태이상 저항 + 15 % |\n| 신뢰의 관계 | 장수 | 가후 | | | | |체력 증가 + 30 %, 상태이상 저항 + 30 % |\n| 요행의 상징 | 이각 | 곽사 | | | | |공격력 증가 + 15 %, 체력 증가 + 20 %, 공격속도 + 30 % |\n===\n\n!!! 색인\n+++!!![>1장 황천의 광풍]\n<html> <CENTER>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/HB_world_Scenario_Adjutant_01.jpg" width=480>\n</CENTER> </html>\n===\n+++!!![>2장 동탁 토벌전]\n<html> <CENTER>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/HB_world_Scenario_Adjutant_02.jpg" width=480>\n</CENTER> </html>\n===\n+++!!![>3장 하북 패권전]\n<html> <CENTER>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/HB_world_Scenario_Adjutant_03.jpg" width=480>\n</CENTER> </html>\n===\n+++!!![>4장 맹호 승천]\n<html> <CENTER>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/HB_world_Scenario_Adjutant_04.jpg" width=480>\n</CENTER> </html>\n===\n+++!!![>5장 보수 설한]\n<html> <CENTER>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/HB_world_Scenario_Adjutant_05.jpg" width=480>\n</CENTER> </html>\n===\n\n
불교에서는 우주의 시간을 3대겁(三大劫)으로 나눈다.\n* 장엄겁(莊嚴劫) ; 과거불의 시대 ⇔ 현겁(賢劫) ; 현재불의 시대 ⇔ 성수겁(星宿劫) ; 미래불의 시대\n** 장엄겁의 삼불(三佛) ; 비바시불(毘婆尸佛), 시기불(尸棄佛), 비사부불(毘舍孚佛)\n** 현겁의 사불(四佛) ; 구류손불(拘留孫佛), 구나함모니불 (俱那含牟尼佛), 가섭불(迦葉佛), 석가모니불(釋迦牟尼佛)\n\n석존의 제자는 크게 두 부류로 나눌 때, 성문제자와 보살제자로 된다.\n* 성문제자 ; 소승의 제자로 생사해탈을 성취했지만 성불할 수는 없는 작은 법, 얕은 법을 얻은 제자들\n** 수다원(須陀洹) ; 입류(入流)\n** 사다함(사陀含) ; 일래과(一來果)\n** 아나함(阿那含) ; 불퇴과(不退果 또는 不還果) - 위의 3과는 아직 배우고 닦을것이 남아 있는 유학인(有學人)\n** 아라한(阿羅漢) ; 응공(應供 :또는 無學) - 더 배우고 더 닦을 것이 없는 무학인(無學人)\n* 보살제자 ; 대승의 제자로 생사해탈에 그치지 않고 보살행을 통해 부처를 이룰 수 있는 크고 깊은 법을 실천 수행하는 제자들
++++[2015.10. 메모]\n| !구분 | !내용 | !비고 |\n|https://etk.srail.kr/ | 2380278743 / #*srt9** |23.09,04. 가입 ; bi****@n- |\n|https://www.unrealengine.com/ko/ | b~@e~.com / #*e***9* |20.01.17. EPIC 계정 ; zi**9** |\n|d5.gandromeda.com/main/ | gan** | gan**9* |\n|https://www.pathofexile.com/ | b~@n~.com / pa**9* |17.03.16. GandaGo |\n===\nhttps://railplus.korail.com/ - 레일플러스 W****l*** / #*z***1***\nhttp://www.nunauri.com/ h*-m* nuna*9 >> 2017.02.11 \n352-0710-8622-03 *협\n\n+++[2015.09. 나무]\n| !이름 | !번호 | !참고 | | |\n| 라이나생명 | https://www.lina.co.kr/ | 간편로그인|0*1*** |2004.09.03. 발급 |\n| 사이버연수원 | 한국HDR 협회 인재개발원 <br> http://www.khrdedu.com/ | w****l**e|han***9* |http://t3hbs.khrdedu.com/main/login.jsp |\n| CJmall (CJ ONE) | 7703-0201-8828-4396 | z***b**k|#cjm***9* |http://display.cjmall.com/ http://www.cjone.com/ |\n| LG TeleCom | 2013-0160-9597-3037 | w****l**e|mob*le9* |2016.07.08.재발급 |\n|~| 2013-0159-0195-9026 | | |2016.06.07.재발급 / 카드 미배송 |\n|~| 2002-0157-9271-2013 | | |2004.05.11.발급 / 카드 노후 |\n|~| U+Zone|00-13-E8-92-D6-D3 |at***@upluszone | |\n|~|~|A4-EB-D3-F4-FC-93 |~|~|\n| OK Cashbag | 1019-****-0721-6252 | z***9**|c***b*g** | |\n| L.Point | 8710-4009-3823-7266 | bis***@n****.c**|#lo***9* |https://www.lpoint.com/ cf. 모바일 바코드 / lpoint9* |\n| Happy point | 8231-1234-3732-7951 | bis***|@ha***9* | |\n| ipTIME | (for A/S)| z***ip|##ip****9* |19.09.17. http://iptime.com/ |\n\n| !이름 | !참고 | | | |\n| LG U+ | bis***_at_n****.c**|@*mob***9* |http://www.uplus.co.kr |\n| 스마일게이트 | bis***_at_n****.c**|#*st***9* |https://www.onstove.com/ |24.09.04. |\n| 한빛온 (로그호라) | gangig*|han***9* |http://www.hanbiton.com |\n| 아이코다(주) | wat******|i****9* |http://www.icoda.co.kr |\n| GS리테일 | z***c***|#p**c***9* |http://www.gsretail.com |\n| GS Shop | wat******|1*** |http://www.gsshop.com |\n| 팝 카드 | b~|#p**c***9* |http://www.popcard.co.kr |\n| 부산은행 | b~|ba**9* |https://ibank.busanbank.co.kr |\n| 우리은행 | b~|woo~9* |https://www.wooribank.com |\n| BCc_ | wat******|#*bc***9* | | |\n| 신한c_| z***c***|shin***9* | |\n| 현대c_| z***92*|#*c***9* |https://www.hyundaicard.com/ |19.02.09. 04** |\n| 신세계| bis***|#*ss*c**9* |http://www.ssg.com/ |\n| 옥션| Z***9**|a******9* |http://www.auction.co.kr |\n| 11번가| 네이버 간편결재| |https://www.11st.co.kr/ |21.10.23. |\n| 신세계면세점 | bis***|shins****9* |http://www.ssgdfs.com/shop/main |\n| 롯데면세점| bis***_at_n****.c**|#*lo***9* |http://www.lottedfs.com |\n| 알라딘서점 | z***b***|a~9* |https://www.aladin.co.kr/ |\n| 인더페이퍼(두성재지) | z***pa***|pa**9* |https://www.inthepaper.co.kr/ |18.05.23. |\n| 다나와(샵)| wat******|#*gan**9* |www.danawa.com/ |18.07.17. 계정 회복 |\n| 로지아이| b~_at_e****.c**|1*2* |http://www.logii.com/ |18.07.19. 택배 수취인 포인터 적립 |\n| (주)테라코어| bis***|1*2* |http://www.xylimax.kr/ |18.11.06. 핀란드 파제르 질리맥스 자일리톨 공식 홈페이지 |\n| 카카오 | 011-...|kaokao** |https://open.kakao.com/o/gpRkz17 |18.12.29. *234 |\n| 트윈박스(해외구매) | bis***_at_e****.c**|li**9* |http://lifement.co.kr/ |19.02.12. |\n| 예스24 | z***b***|#*yes24c** |http://www.yes24.com/ |21.01.29. |\n\n| !구분 | !내용 | !비고 |\n|우리 Won 인증 | 2*1**4 | 2024.10.15. |\n|Google 로그인 계정 | b~_at_em~.*** | g~9* |\n|Adobe 로그인 계정 (2015.12.08.) | b~_at_naver.*** | Effect** |\n===\n\n+++[2015.10. 가]\n*20.09.08. 우리** OTP 교체 (≒ 교체주기 3년)\n| !구분 | !입력 | !내용 | !참고 | ! |\n| 국세청홈텍스 |현금영수증 카드 등록 | wat******|#home***9* |https://www.hometax.go.kr/ |\n| 국세청 |개인통관고유번호 | P16공공14272254|pUNI-PASS |https://unipass.customs.go.kr/csp/persIndex.do <br> 2016.07.08.(금) 발급 |\n| 금융투자교육원 |레버리지 ETF,ETN 투자자 사전교육 | bis***|#*zi**1*** |https://www.kifin.or.kr - 2021.07.07.(화) 수료 |\n| 코레일 |1*4*3136*8 | zz**45@*| |http://www.letskorail.com |\n\n*http://www.옥산전씨.com/ - 옥산(경산)전씨대종회\n*http://blog.daum.net/jsoohyung - 소리곳 jsoohyung / qq__45__\n*http://cafe.naver.com/ultramen - 육천기 __ / qq__#_ (cf. 2017.05.24. 폐쇄)\n*보이~코~\n===\n\n+++[2017.05. 가_17]\n| !구분 | !입력 | !내용 | !참고 |\n| 19.04.03. | 전세 1000/ 43|부암 | |\n| 19.06.27. | 45|부암 세탁기 교체 | |\n\n\n===\n\n\n\n
| 스킬 | 설명 |\n| 갑옷 파괴 |데미지를 입히며, 일정 시간동안 방어력을 감소시킨다. |\n| |고승1, 공도1 |\n| 강타 |연속으로 3회 찌르며 피해를 입힌다. |\n| |정원지1 |\n| 강타 |적을 강타하여 피해를 입히고 상대를 뒤로 밀쳐낸다. |\n| |등무1 |\n| 검기 |전방의 적에게 검기를 날려 피해를 입힌다. |\n| |장량2 |\n| 결사 |고구려 결사대를 일정시간 동안 4명을 소환한다. |\n| |밀우3 |\n| 낙석 |돌무더기를 소환, 범위 안에 낙하시켜 피해를 입힌다. |\n| |장보2 |\n| 난사 |일정시간 동안 자신의 공격속도를 일정량 만큼 상승시켜 적들에게 빠른 화살 공격을 가한다. |\n| |밀우2 |\n| 독강타 |철퇴에 독 피해를 입히며, 일정 시간 동안 피해를 입힌다. |\n| |파재1 |\n| 독화살 |독화살을 날려 피해를 입히며, 일정 시간 동안 피해를 입힌다. |\n| |하의1 |\n| 둔화사격 |데미지를 입히며, 일정 시간동안 이동속도를 감소시킨다. |\n| |손하1 |\n| 방패 후려치기 |데미지를 입히고, 일정 시간 동안 기절시킨다. |\n| |한충1 |\n| 변심 |적이 일정시간 동안 아군이 된다. |\n| |장각2 |\n| 빙결 |데미지를 입히고, 일정 시간 동안 결빙 시킨다. |\n| |유벽1 |\n| 장군의 위세 |주변의 적에게 피해를 입히고 일정 시간 동안 기절 시킨다. |\n| |장량1 |\n| 창천이사 |태수로 배치시 영지의 모든 병사들이 황건적이 된다. |\n| |장각3 |\n| 화궁 |전방에 5발의 불화살을 날려 적들에게 공격력 대비 일정량의 피해를 입히고 일정시간 동안 공격력 대비 일정량의 화상 피해를 입힌다. |\n| |밀우1 |\n| 황천의 바람 |적에게 공격력 대비 피해를 입힌다. |\n| |장각1 |\n| 황천의 불꽃 |주변의 적에게 피해를 입히고 일정 시간 동안 지속 피해를 입힌다. |\n| |장보1 |\n
| 명령어 | 옵션 | | |\n| del | | game.dat |특정 파일 하나만 삭제 |\n|~| | game*.bak |game으로 시작하는 모든 *.bak 파일 삭제 |\n|~| | . |현재 디렉토리의 모든 파일 삭제 (. 현재 디렉토리) |\n|~| /p | game.obj |파일을 삭제하기 전에 삭제를 확인하는 메시지를 표시 |\n|~| /f | game.obj |읽기전용 파일 삭제 |\n|~| /s | game.obj |모든 하위 디렉토리에서 파일을 삭제 |\n|~| /q | game.obj |파일을 삭제할것인지 묻는 메시지를 표시하지 않음 |\n| rem | | |그 행이 모두 주석이 된다. (≒ ::) |\n\n\n+++[ 01_clean_txt.bat ]\ndel *.txt\n=== \n\n+++[ 03_clean_cooked.bat ]\ndel *.cooked\n=== \n++++[ 04_clean_cooked_s.bat ]\ndel /s *.cooked\n=== \n\n\n\n
!! 프로그램\n*설치 프로그램\n**시스템\n***http://www.3dpchip.com/3dpchip/index_kor.html - 3DP Chip, 드라이버 설정 프로그램\n***http://wincdemu.sysprogs.org/portable/ - WinCDEmu (*.iso) 무설치 가상드라이브\n***http://rodream.tistory.com/ - 클릭 투 트윅\n***http://www.gobest.kr/goclean_app/index.htm - 고클린, PC 최적화 프로그램\n**툴\n***https://kr.bandisoft.com/bandizip/ - 반디집, 무료 압축 프로그램\n***https://notepad-plus-plus.org/ - 문서 편집기이자 소스 코드 편집기\n***http://www.nyam.pe.kr/dev/imagine/ - Imagine 뷰어\n***https://www.tracker-software.com/product/pdf-xchange-viewer - PDF-XChange Viewer, Free PDF Reader\n***ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ\n***http://freemind.sourceforge.net/wiki/index.php/Download - FreeMind\n***https://www.softwareok.com/?seite=Freeware/Q-Dir - Q-Dir, 윈도우 탐색기 기능을 강화한 프로그램 (사용 메모리에 주의)\n***http://datools.kr/ - 다뷰 인디(DaVu Indy)는 완전무료 통합(문서,이미지,캐드)뷰어 프로그램\n***https://www.revouninstaller.com/ - 프로그램 완전삭제 프로그램 RevoUninstaller\n**** DOWNLOADS 탭에서 Free 버전을 받을 수 있음 ( ∵ 참고 사이트 http://rockykim5581.tistory.com/25 )\n**** 해당 프로그램 삭제 이후에 검색을 통해서, 남겨진 찌꺼지 파일과 레지스트리를 삭제할 수 있다.\n***www.inputdirector.com - inputdirector, 윈도우7까지 호환되는 KVM 소프트웨어\n**개발 툴\n***Windows Grep\n***http://www.wireshark.org - Wireshark (Network Protocol Analyzer) ; 네트워크 트래픽 캡처 (from ㅇ지영)\n***파일 비교\n****http://diffuse.sourceforge.net/ - Diffuse 파일 비교 도구 ( 오픈소스 / 윈도우, 맥, 리눅스 무료 )\n****notepad++ 에 Compare plugin 설치 ( C:\sProgram Files\s Notepad++\s Plugins )\n*=================================\n*참고\n**https://tools.pdf24.org/ko/ - Online PDF Tools\n**앱플레이어\n***http://www.momoplayer.com/ - 모모앱플레이어\n***MEmu App Player - 미뮤 앱플레이어는 안드로이드 가상머신의 일종 (Android emulator for PC)\n***https://downloadcenter.intel.com/download/7838/Intel-Processor-Identification-Utility-Windows-Version - Hardware Virtualization\n\n!!! 보안솔루션\n* 금융 웹보안 / 인증 솔루션 Inisafe CrossWeb EX V3 3.3.2.40 이하 버전 제거 @ 2023-04-21 from Travel Tube @ \n** 북한이 2023년 금융 소프트웨어 이니세이프의 약점을 활용해 국내 주요기관 60여곳을 해킹\n\n!!! 관리프로그램\n@@color(#04f): ▣ SIMS @@ (공용 정보 관리 시스템) @ 2015-09-09 @\nshared information management system\ncf. Cbase 운영체계 - Call play를 지칭, 온라인 및 전화 상담툴을 일원화된 시스템으로 구축하여 개별 히스토리 확인을 통한 고객 서비스 개선\n\n\n!! 기타\nhttp://vessoft.kr/software/windows/download/iexplorer - Internet Explorer 다운로드\nhttp://2proo.net/1684 - 와이브로 에그 사용량 확인하는 방법\n\n@@color(#04f): ▣ 유튜브 동영상 다운로드 @@ @ 2015-12-03 @\n1. http://en.savefrom.net/ 에서 해당 URL을 입력\n 원하는 포맷의 파일을 다운로드 ; 소리가 나오는 영상 중 가장 화질이 좋은 MP4 720p로 다운로드\n2. 동영상 URL 수정\n https://에서 s를 빼고 http://로 변경, www.youtube.com에서 ss를 넣어서 www.ssyoutube.com로 수정하면 1번 사이트로 이동\n\n\n+++[▣ 한글문서 hwp ⇒ 워드 문서로 변환 @ 2018-11-05 @ ]\nhttps://www.microsoft.com/ko-kr/download/details.aspx?id=36772 - Microsoft Word를 위한 아래아한글 문서 변환 도구\n\n/ HwpConvert_x86_ko-kr.exe - Office 32비트 버전 설치 (정확한 버전을 모를 때)\n ⇒ C:\sProgram Files (x86)\sMicrosoft Office\sOffice15\s BATCHHWPCONV.EXE\n/ HwpConvert_x64_ko-kr.exe - Office 64비트 버전 설치\n ⇒ C:\sProgram Files\sMicrosoft Office\sOffice15\s BATCHHWPCONV.EXE \n\n''지원 운영 체제'' : Windows 7, Windows 8, Windows Server 2003, Windows Server 2008, Windows Server 2012, Windows Vista, Windows XP \n''지원하는 Microsoft Word 프로그램'' : Microsoft Word 2007 서비스 팩 2(SP2) 이상, Microsoft Word 2010, Microsoft Word 2013 \n''세부 운영 체제 추가사항'' : Microsoft Word 2013은 Windows 7과 Windows 8만을 지원\n===\n<br>\n+++[▣ Windows 7에서 Windows XP Mode 설치 및 사용 @ 2016-04-01 @ ]\n출처 ; __windows.microsoft.com/ko-kr/windows7/install-and-use-windows-xp-mode-in-windows-7__\n설치와 사용 ; __teia.tistory.com/1212__\n\n2014년 4월 8일 이후부터 PC를 보호하는 업데이트를 포함하여 Windows XP 및 Windows XP Mode에 대한 기술 지원이 중단됩니다. 이는 지원이 종료된 이후에 Windows 7 PC에서 Windows XP 또는 Windows XP Mode를 계속 사용할 경우 PC가 보안 위험 및 바이러스에 더 취약해질 수 있음을 의미합니다. \n\n따라서 지원이 종료된 이후에 Windows 7 PC에 대한 보안을 유지하려면 인터넷에 연결되지 않은 상태에서만 Windows XP Mode를 사용하는 것이 좋습니다.\n\nWindows XP Mode를 사용하면 Windows 7 Professional, Enterprise 또는 Ultimate 버전을 실행하는 컴퓨터에서 Windows XP용으로 디자인된 프로그램을 실행할 수 있습니다. Windows XP Mode는 Windows 8에서 지원되지 않습니다.\n\n''Windows XP Mode는 어떻게 작동합니까?''\n\nWindows XP Mode는 두 가지 방법, 즉 가상 운영 체제로서 및 Windows 7 내에서 프로그램을 여는 방법으로서 작동합니다. Windows XP Mode는 완전한 기능을 갖춘, 사용이 허가된 Windows XP 버전인 경우를 제외하고는 프로그램과 마찬가지로 Windows 7 데스크톱의 별도 창에서 실행됩니다. Windows XP Mode에서는 Windows XP를 실행하는 컴퓨터를 사용하는 것처럼 실제 컴퓨터의 CD/DVD 드라이브에 액세스하고, 프로그램을 설치하며, 파일을 저장하고, 다른 작업을 수행할 수 있습니다.\n\nWindows XP Mode에서 프로그램을 설치하면 프로그램이 프로그램의 Windows XP Mode 목록과 프로그램의 Windows 7 목록에 모두 나타나므로 Windows 7에서 직접 프로그램을 열 수 있습니다.\n\n''참고''\n\nWindows Vista 및 Windows XP와 호환되는 대부분의 프로그램은 Windows 7에서 잘 실행됩니다. 프로그램이 제대로 실행되지 않을 경우 먼저 프로그램 호환성 문제 해결사를 시도해 볼 수 있습니다. 프로그램 호환성 해결사는 모든 Windows 7 버전에 포함되어 있습니다. 자세한 내용은 프로그램 호환성 문제 해결사 열기을 참조하십시오. \n\nWindows 7에서 작동하는 일부 하드웨어와 장치가 Windows XP Mode에서는 검색되지 않거나 작동하지 않을 수도 있습니다.\n\nWindows XP Mode는 기본적으로 Windows XP에서 Windows 7으로 전환하는 기업을 지원하기 위해 디자인되었습니다. 이 모드는 3D 게임과 같이 그래픽 사용량이 많은 프로그램에 맞게 최적화되지 않았으며 TV 튜너와 같은 하드웨어 요구 사항이 있는 프로그램에도 적합하지 않습니다.\n\nWindows Media Player를 사용하여 Windows XP Mode로 음악 또는 비디오를 재생하는 동안 Windows XP Mode 창을 최대화 또는 최소화하는 경우 Windows Media Player가 재생을 중지합니다. 계속 재생하려면 Windows Media Player의 재생 단추를 클릭합니다.\n===\n\n\n
<html> <a name="Page170223"> </a> </html>\n<html>\n<a href="#Page170223_01"> #. 웹 사이트 </a> <br>\n<a href="#Page170223_04"> #. keyword </a> <br>\n<a href="#Page170223_02"> #. 생활 </a> <br>\n<a href="#Page170223_03"> #. 목록 </a> <br>\n</html>\n\nhttps://kr.dhgate.com/ - 중국 도매 제품 구매 온라인 쇼핑\n\n<html> <a name="Page170223_01"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page170223"> <span style="font-size: 14px;"> <b> #. 웹 사이트 </b> </span> </a>\n</div> </html>\n* 공공\n** http://www.apt2you.com/ - 금융결제원/ 주택청약 서비스\n** http://fine.fss.or.kr/ - 금융소비자 정보 포탈 사이트 (Financial Information Network) ; 은행, 보험사, 우체국, 미소금융중앙재단에 있는 휴면예금과 휴면 보험금을 한벙에 조회할 수 있는 사이트.\n*** https://www.cardpoint.or.kr/ - 여신금융협회, 카드 포인트 통합조회 서비스\n*** https://www.e-insmarket.or.kr/ - 보험다모아, 온라인 보험슈퍼마켓\n*** http://credit4u.or.kr/ - 크레딧포유, 신용ㆍ보험 정보 조회, 한국신용정보원이 보유하고 있는 개인의 신용정보 등을 확인하고 잘못된 정보의 정정청구도 할 수 있다.\n*** https://www.payinfo.or.kr/ - 금융결제원, 계좌정보통합관리서비스\n** http://www.eum.go.kr/ - 토지이음 (토지이용계획열람)\n*** 네이버 지도에서 번지 확인\n*** https://www.gov.kr/ - 정부24 > 토지대장 열람\n** 공시\n*** https://www.ftc.go.kr/ - 공정거래위원회\n**** 정보공개 > 행정정보공개 > 사전정보공표 - 국민생활에 매우 큰 영향을 미치는 정책에 관한 정보\n**** https://www.egroup.go.kr/egps/wi/mainPage.do - 기업집단포털 (공정거래위원회 기업집단정책과)\n***** 2007년 7월 처음 구축\n***** 기업집단포털시스템을 통해 공개되는 정보는 상호출자제한기업집단, 채무보증제한기업집단 및 지주회사의 소속회사 등 각 기업에서 제출한 소속 회사현황, 주주현황, 출자 현황, 채무보증현황, 지주회사현황 등의 각종 현황 자료.\n*** https://kind.krx.co.kr/corpgeneral/treasurystk.do?method=loadInitPage - 한국거래소 > 상장법인상세정보 > 자사주취득/처분\n*** http://freesis.kofia.or.kr/ - 금융투자협회, 채권수익률 공시\n** https://www.bccard.com/app/card/view/common/zipcode/newZipSearch.jsp?callbackFunc=setAddressOffice - bc카드 우편번호 검색\n\nhttp://www.credipia.net/ - 월간 신용사회 (주)SB에이드, 신용보증기금\nhttps://securities.miraeasset.com/ - 미래에셋증권\n\n| !주소 | !설명 | !비교 |\n| http://www.cherrybeans.co.kr/ |Caffe Cherry Beans | |\n| https://smartstore.naver.com/lioncoffeekorea |라이언커피 코리아 공식 스토어 | |\n|>|>|>| |\n| !주소 | !설명 | !비교 |\n| http://www.zonmal.com/main.asp |존 한자사전 | |\n| http://studybuddha.tistory.com/ |불교용어 사전 | |\n| http://www.icoda.co.kr/ |아이코다 |컴퓨터 쇼핑몰(용산) |\n| http://www.globalbuy.co.kr/ |글로벌바이 |구매대행(무료배송) |\n|>|>|>| |\n| !주소 | !설명 | !비교 |\n| http://hnbaustralia.com.au/ |호주 종합 쇼핑몰 | |\n| http://www.theshop9.com/ |더샵나인(인테리어소품전문점) |생활/주방 > 홀더/촛대/램프 |\n| |이케아 |이케아 ROTERA 랜턴 (제품명) |\n| http://www.hiart.net/ |하이아트 |스틸초받침 |\n| |초받침 |캔들 홀더 CVE203 SPAAS 검정색 필라 촛대 |\n| http://www.cupandcup.co.kr/ |컵앤컵 - 수입 주방용품 도매, 소매 |cf. 에말리아 코니퍼 법랑머그 350 ml |\n| G마켓/ e좋은차(www.egoodtea.com) |가경 eshop - 주방용품 제수용품 |분청 둥근 오목접시형 촛대, 분청 원형 굽 촛대 |\n| http://www.cathkidstonkorea.co.kr/ |캐시키드슨 코리아 |영국 전통 컨츄리 하우스 스타일에 대한 재해석 |\n| http://blog.daum.net/_blog/BlogTypeMain.do?blogid=0ORd6 |행운의 시계(대구시계수리전문업체) |디젤 가죽밴드 교체 |\n\n*http://banpummart.com/ - 반품 마트\n**http://www.banpummall.com/ - 반품몰 \n\n+++[#중고거래 장터]>\n*https://www.hellomarket.com/ - 안전한 중고거래 장터\n*https://www.yetnal.co.kr/shop/ - 옛날 물건 ; 경남 밀양시 중앙로 80-6 (가곡동)\n*http://www.gomisul.com/shop/ - 고미술닷컴 (창원시)\n===\n\n++++[#집]>\n* https://www.zaekook.com/?c=46/47&p=2&p=1 - 캠핑제국 > 이동주택\n** http://ecocabin.co.kr/ - 에코케빈 ; 북유럽 에스토니아 제품 수입, 설치\n===\n\n\n<html> <a name="Page170223_04"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page170223"> <span style="font-size: 14px;"> <b> #. keyword </b> </span> </a>\n</div> </html>\n<html><span style="background:#E2E2ff ; font-family:돋움; font-size: 12px;"> <b> 선행기술정보 제공 사업 신청 사이트 </b> </span></html>\nhttps://www.kista.re.kr - 한국특허전략개발원\nhttp://www.pipc.or.kr - 특허정보진흥센터\nhttp://www.ipsolution.co.kr - 아이피솔루션 ; 지식재산서비스전문기업\nhttp://www.wipscorp.com - 윕스 ; 특허청 지정 선행기술 전문조사기관\nhttp://www.iktg.com - 케이티지 ; 특허청 지정 선행기술 전문조사기관\nhttps://www.totalip.kr - 토탈리프 ; 지적재산 전문기업\n\n<html><span style="background:#E2E2ff ; font-family:돋움; font-size: 12px;"> <b> 선박 정보 검색 </b> </span></html>\nhttps://www.shipfinder.com/ - 선박 검색\nhttps://www.marinetraffic.com/ - 선박위치정보\nhttps://www.wcpfc.int/ - 서부 및 중부 태평양 수산 위원회(WCPFC)\n\n* [[학습]]\n** [[프로그램]]\n* 데이터 변환\n** https://allinpdf.com/kr/convert/fileconvert/fileconvert-start-hwp - HWP PDF 변환 \n** https://online-audio-converter.com/ - 온라인 오디오 변경 사이트\n* 도메인 관리 (도메인 연장 비용 기준 비교)\n** 기관이전 예정 ; http://www.nunauri.com/ h*-m* nuna*9 >> 2018.04.\n** https://www.hosting.kr/ - 12,100원\n** http://www.webtizen.co.kr/ - 웹티즌(도메인최저가) - 12,900원\n** http://www.domainclub.kr/ - 도메인클럽 - 13,000원\n* 산업용품\n** https://www.soyutne.co.kr/ - 소유티앤이 쇼핑몰 (포장자동화기계)\n\n<html> <a name="Page170223_02"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page170223"> <span style="font-size: 14px;"> <b> #. 생활 </b> </span> </a>\n</div> </html>\n* 디자인 / 공방\n** https://www.kcdfshop.kr/ - (재)한국공예·디자인 문화진흥원 온라인숍 - 공예정원\n** 기념품\n*** https://m.qsilla.co.kr/ - 큐신라 ; 신라토기 고배 잔 (고족배, 고블렛 잔)\n*** http://www.bronzeartist.co.kr/shop/ - 브론즈 아트공방 (요강 등)\n*** https://shopofkorea.com/ - 외국인선물 전통 공예 기념품\n** http://남원목기.net/ - 춘향골 남원목기\n** http://mirimi.kr/ - 미리미동국\n*** https://blog.naver.com/yuri4315 - 미리미동국 공식블로그\n** https://www.gongboocha.com/ - 공부차 (인터내셔널 티 컴퍼니) ; 차와 다기 > 백자 삼족 향로 차 거름망\n** https://www.e-deasung.co.kr/ - (금속공예) 대성재료상사\n** 민화\n*** https://blog.naver.com/sun_dayminwha - 선데이민화\n*** https://www.youtube.com/@sunday_minwha/videos\n*** 밀양, 민화 그리기 공방 여름화실 - 경남 밀양시 시청서길 41 2층\n** 도자기\n*** 달소금 도자기 손잡이 술잔, 아쿠아블루 4개 X 1세트 ; 쿠팡에서 구매 @ 2024.11.19.\n*** https://sosohan-kitchen.com/ - 소소한 부엌 ; 고요 도자기 소주잔, 앞접시\n*** https://www.tovy.co.kr/ - 이천도자기 토비\n*** https://ohou.se/ - 오늘의 집 ; 2023.07. 무광도자기 5인치 접시세트 5p\n* 쇼핑몰\n** http://www.danawa.com/ - 가격비교 사이트 다나와\n** https://shoppinghow.kakao.com/ - 쇼핑하우스\n** http://www.thirtymall.com/ - 떠리몰(유통기한이 다가오는 제품을 합리적인 가격에 판매하는 식품 전문 이커머스)\n** http://www.handmax.co.kr/ - 핸드맥스(안전보호구)\n** https://www.soolmarket.com/ - 전통술마켓\n* 해외구매\n** https://www.temu.com/ - 2022년 매사추세츠주 보스턴에서 설립\n** http://lifement.co.kr/ - 홈/주방/생활잡화 해외구매대행 ; 향로\n** http://www.salechina.co.kr/ - 세일차이나(중국해외 구매대행) ; 12지신 구궁팔괘\n** http://sunnyshop.co.kr - 뷰티 해외구매대행 ; 스톤 홀더, 향로 \n** http://japanking.co.kr/ - 라쿠텐 ; 스톤 양초 홀더, 소용돌이향\n* 헬스&뷰티숍\n** https://www.lohbs.co.kr/ - LOHB's 온라인몰(롯데가 만든 헬스&뷰티숍)\n** http://www.yaksawa.com/ - 약사와닷컴\n** http://www.fndkorea.com/ - 에프앤디넷 맘스오메가3\n* 하드웨어\n** http://www.gmdata.co.kr/gmtools/hddscan.html - 지엠데이터(GoodMorning Data) GM HDDSCAN 툴 (배드 섹터 검사)\n** 하드독 도킹스테이션\n*** 스카이디지탈 / SKY 알로이 듀얼독 USB3.0 도킹스테이션 외장하드게이스\n*** 강원전자 / (넷메이트) NM-WD01 USB3.0 WiFi 도킹 스테이션 - 강원전자\n*** 밴텍 / (NexStar) WiFi 무선외장하드 독\n*** 유니콘정보시스템 / WN-5000M 무선 하드독 도킹스테이션\n* 화장품\n** http://smartstore.naver.com/euromoms - 유로맘스 독일직구 ; 히말라야 너리싱 크림\n\n* http://sieve.kr/ - 마미체(채화원)\n* http://www.louisvuitton-handbags.com.co - Louis Vuitton Handbags and Bags Sale -Louis Vuitton Outlet\n* http://www.stefano.co.kr/ - Stefano Conti 가방, (주)나래\n\n\n!!! 게임\n\n\n\n<html> <a name="Page170223_03"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page170223"> <span style="font-size: 14px;"> <b> #. 목록 </b> </span> </a>\n</div> </html>\n▷ [[장부_2016]]\n #. 생활 ; 가전 - 조명, 배터리, 부품\n #. 취미\n #. Mall\n\n▷ [[장부_종이]]\n #. 종이 ; 인더페이퍼(두성종이), 페이퍼모어(삼원특수지)\n #. 종이접기 \n\n▷ [[정보_장소]]\n\n\n
!! Dim 변수이름 As 데이터형\n|!데이터 |!데이터형 |\n|정수 |Byte, Integer, Long |\n|실수 |Single, Double |\n|문자 |String |\n|날짜 |Date |\n|참거짓 |Boolean |\n|모든 데이터 |Variant 혹은 ‘As 데이터형’ 생략 |\n|워크북 |Workbook |\n|워크시트 |Worksheet |\n|셀 범위 |Range |\n\n+++[ 데이터 형, 범위 ]\n| 데이터 형 | 크기 | 종류 | 표현 범위 |\n| Byte | 1 | 정수 |0~255 |\n| Integer | 2 | 정수 |-32,768 ~ 32767 |\n| Long | 4 | 정수 |-2,147,483,648 ~ 2,147,483,647 |\n| Single | 4 | 실수 |양수 : 1.401298E-45 ~ 3.40282E38 <br> 음수: -3.402823E38 ~ -1.401298E-45 |\n| Double | 8 | 실수 |양수 : 4.94065645841247E-324 ~ 1.79769313486232E308 <br> 음수 : -1.79769313486232E308 ~ -4.94065645841247E-324 |\n| Boolean | 2 | Bool |true, false |\n| Currency | 8 | 화폐 |-922,337,203,685,477.5808 ~ 922,337,203,685,477.5807 |\n| Date | 8 | 날짜 |100/1/1 ~ 999/12/31 |\n| Object | 4 | 개체 |모든 개체 참조 |\n| String | 가변 / 고정 길이 | 문자열 |가변길이 : 10bytes + 문자열 길이 (0 ~약 2조...) <br> 고정길이 : 1~약 65,400 |\n| Variant | 16 / 24 | 가변 |16 : Double 범위 내 모든 숫자 <br> 24: 문자열 길이 + 22bytes(문자) |\n| Type | 사용자 정의형식 | 사용자 정의형 |사용자 정의형식 |\n===\n\n!!!Dim 배열명(배열의 크기) As 데이터형\n@@color(#3058D2): Dim Arr1(10) As Double @@ \n@@color(#3058D2): Dim Arr2(5) As Long @@ \n \nArr1은 0부터 시작하여 10까지 11개의 원소를 가진 실수를 저장하는 배열이다. Arr2는 0부터 시작하여 5까지 6개의 원소를 가진 정수를 저장할 수 있는 배열이다. 그러나 배열은 시작 번호와 끝 번호를 지정하여 선언할 수 있다.\n \n@@color(#3058D2): Dim Arr3(1 To 10) As Double @@ \n@@color(#3058D2): Dim Arr4(2 To 5) As Long @@ \n \nArr3은 1부터 시작하여 10까지 10개의 원소를 가진 실수를 저장하는 배열이다. Arr4는 2부터 시작하여 5까지 4개의 원소를 가진 정수를 저장할 수 있는 배열이다. 배열의 크기를 반드시 지정할 필요는 없다. 그러나 나중에 사용을 하려면 ReDim을 사용하여 배열의 크기를 지정할 수 있다.\n\n!! 변수 선언 방법\n!!! 명시적 선언 (Option Explicit)\n명시적 선언 (Option Explicit)\nDim 이란 예약어를 사용하여 선언하는 방법\nex. Dim 변수명 As 데이터형\n\n!!! 암시적 선언\n예약어를 사용하지 않고 그냥 변수명을 사용한다.\n즉 코드내에서 임의로 변수를 쓰면 자동으로 만들어서 처리해준다는 의미.\n\n!!! 변수명 설정시 주의점\n/ A~Z, a~z, 숫자 0~9, _(under bar)로 구성\n/ 첫문자는 영문자나 _ 로 시작 (숫자나 특수문자 사용불가)\n/ 대소문자 구별안함\n/ 변수명에 공백 있으면 안됨\n/ 예약어 사용 불가\n/ 변수명은 최대 255자까지 가능\n\n\n!! 연산자\n|!산술연산자 |!설명 |!예 |!결과 |\n|+ |더하기 |10+5 |15 |\n|- |빼기 |10-5 |5 |\n|* |곱하기 |10*5 |50 |\n|/ |나누기 |10/5 |2 |\n|₩ |정수나누기 |11₩5 |2 |\n|^ |지수 |10^5 |100000 |\n|Mod |나머지 |10 Mod 5 |0 |\n|- |음수 |-10 |-10 |\n|& |문자열 연결 |“AB” & “CD” |“ABCD” |\n|! 비교연산자 |!설명 |!예 |!결과 |\n|> |크다 |10>5 |TRUE |\n|< |작다 |10<5 |FALSE |\n|>= |크거나 작다 |10>=5 |TRUE |\n|<= |작거나 같다 |10<=5 |FALSE |\n|= |같다 |10=5 |FALSE |\n|<> |같지 않다 |10<>5 |TRUE |\n|Like |비슷하다 |“VBA” Like “V?A” |TRUE |\n|! 논리연산자 |>|>|!설명 |\n|A And B |>|>|양쪽이 모두 True이면 True, 그렇지 않으면 False |\n|A Or B |>|>|양쪽 중 적어도 하나가 True이면 True, 양쪽이 모두 False이면 False |\n|Not A |>|>|A가 True이면 False, False이면 True |\n|A Xor B |>|>|양쪽이 모두 True 또는 False이면 False, 그렇지 않으면 True |\n|A Eqv B |>|>|양쪽이 모두 True 또는 False이면 True, 그렇지 않으면 False |\n|A Imp B |>|>|A가 True이고 B가 False이면 False, 그렇지 않으면 True |\n\n<br>
[[학명재(鶴鳴齋)]] ; 경상북도 경산시 남천면 대명길 33-8 (경상북도 경산시 남천면 대명리 201)\n\n{{wrappingClass{Info_map_***.*** 위치관련 이미지 }}}\n\nhttp://www.당구대통철판삼겹살.infom.kr/\n / 본 점 양산점 : 경상남도 양산시 동면 가산리 1201-2/ 055-364-4016 ( 부산2호선 호포역 )\n / 울산점 : 울산광역시 울주군 온산읍 삼평길 453/ 052-237-4016 ( 동해고속(부산-울산) 온양IC )\n\n\n++++[#. 대구간송박물관]\nhttps://kansong.org/daegu/\n대구광역시 수성구 미술관로 60\n2024년 9월 3일 개관, 간송미술관의 최초의 지역분관으로 간송미술문화재단이 보유하고 있는 국ㆍ보물, 문화유산 등을 상설 전시하는 공간\n===\n\n+++[#. 경상북도, 경주 요석궁]\nhttps://www.1779.kr/ - HOUSE OF CHOI (경주 최씨가문(崔富者家), 요석궁, 대몽재(大夢齋) 등)\n경상북도 경주시 교촌안길 19-4\n경주 최부잣집에서 소개하는 요석궁의 시절식(時節食)은 한식을 바탕으로 절기에 순응한 식재료로 음식 맛을 극대화\n===\n\n+++[#. 경상북도, 경주 추령재 백년찻집]\n추령재 꼭대기에 위치한 백년찻집은 휴게소였던 건물을 찻집으로 개조한 한옥\n===\n\n+++[#. 경상북도 경주시 양북면(陽北面)]\nhttp://www.gyeongju.go.kr/village/yangbuk/page.do?mnu_uid=447\n■ 연혁\n • 신라시대 : 신라6부의 하나인 금산가리촌(金山加利村)에 속함\n • 고려시대 : 신라6부의 명칭 개명으로 가덕부(加德部)에 속함\n • 조선시대 : 경주부(慶州府) 동해면(東海面) - 감포, 양남 포함\n • 1895년 : 지방제 개편으로 경주부를 경주군(慶州郡)으로 개칭\n • 1906년 : 장기군(長鬐郡)에 편입, 내남면(內南面)으로 개칭\n • 1914년 : 장기군에 편입된 내남면, 양남면을 경주군으로 환속, 내남면을 외동면 상신리 일부를 병합하여 양북면으로 개칭, 경주군 양북면이 됨\n • 1937년 : 감포지역이 읍으로 승격 분리, 15개 마을로 현재까지 구성\n • 1955년 : 경주읍이 시로 승격되고 군명칭을 월성군으로 개칭, 월성군 양북면\n • 1975년 : 범곡리 일부(석굴암)가 경주시에 편입\n • 1987년 : 봉길리 일부(월성원자력)가 양남면에 편입\n • 1989년 : 월성군을 경주군으로 명칭 환원, 경주군 양북면\n • 1995년 : 시군 통합으로 경주시 양북면으로 개칭\n • 2008년 : 15개 법정리 20개 행정동\n\n■ 유래\n • ''어일리(魚日里)''\n 1,600년 경 정응서가 이 마을을 개척하여 마을 앞산의 지형이 고기 한마리를 닮았다하여 어일(魚一)이라 칭하여 오다가 1,900년 초기 이후부터 어일(魚日)로 개칭. 속칭 장터라고도 하며 양북면 소재지로서 5일마다 시장이 개설되며 상거래가 활발하여 동해 3개 읍면(감포읍, 양북면, 양남면)의 교통의 중심지로 발전하였다.\n • ''와읍리(臥邑里)''\n 사발바위에서 동산으로 이어지는 바위가 길게 누워 있었으므로 와룡(臥龍)이라 하였다 하며 또는 기와를 굽던 곳이라 하여 왓골, 왯골이라 불렀다. 1914년 행정구역 개편에 의해 중기리 등을 병합하여 와읍리로 하였다.\n • ''용동리(龍洞里)''\n 지형이 용의 머리처럼 생겼다 하여 용두(龍頭) 또는 용동(龍洞)이라 불렀다. 1914년 행정구 개편에 의하여 용동리로 하였다.\n • ''권이리(權伊里)''\n 권이(權伊)는 약 250년 전 난을 피해온 권씨가 마을을 개척하면서 권이라 불렀다고 한다.\n • ''호암리(虎岩里)''\n 마을 앞산에 마치 입을 벌린 범처럼 생긴 기이한 바위가 있으므로 그 바위의 이름을 범바위라 부르고 마을 이름도 호암 또는 범바우라 불렀다고 한다.\n • ''안동리(安洞里)''\n 조선중엽에 강찬성(姜讚成)이라는 선비가 마을을 개척하였다고 하며 지형이 남쪽으로 향하고 있어 장차 이 마을이 평온하고 부유한 마을이 되라는 뜻에서 안동, 안골로 불렀다고 한다.\n • ''장항리(獐項里)''\n 마을 앞산의 지형이 노루의 목처럼 생겼다 하여 노루목, 장항이라 불렀다. 1914년 행정구역 통합에 의거 경주군 외동면 상신리 일부를 병합하여 장항리로 하였다.\n • ''범곡리(凡谷里)''\n 옛날 석굴암 근처 사는 범이 자주 이 마을에 나타나므로 처음에는 호곡(虎谷)이라고 부르다가 나중에 범곡(凡谷), 범실이라 부르게 되었다고 한다.\n • ''입천리(卄川里)''\n 형제봉 산에서 내려오는 물이 스무 길이나 되며 내(川) 양편 하류에 마을이 형성되어 있으므로 스므내, 이십천 또는 입천이라 하였다고 한다. 다른 이야기로는 스무 골짜기에서 내려온 물이 모여 내를 이루므로 스무내로 하는데 이 스무내의 아래쪽에 마을이 있다고 하여 마을 이름도 그대로 스무내(卄川)로 하였다는 이야기도 있다.\n • ''송전리(松田里)''\n 소나무 숲이 울창하다고 하여 솔밭 또는 송전이라 불렀다고 한다.\n • ''죽전리(竹田里)''\n 영월 엄씨(嚴氏)가 개척한 마을로 큰 대나무밭 밑에 마을이 있어 대숲, 대숲말, 대밭 또는 죽전(竹田)이라 불렀다. 또 마을 밑에 대수못이 있으므로 죽연(竹淵)이라 부른다고 한다.\n • ''두산리(斗山里)''\n 사방으로 산이 둘러싸여 있으므로 돌산(乭山), 돌산리, 두산으로 불렀다고 한다.\n • ''용당리(龍堂里)''\n 신문왕의 부왕인 문무왕의 성룡호국(成龍護國)의 유언에 의해 수중릉을 만들고 유덕을 기리기 위해 감은사를 창건하여 용이 출입할 수 있는 지하 수로를 만드니 수십 길의 용소가 생겨나서 용담이라 불렀다고 한다. 용당, 용당리, 돌담이라고도 하는데 돌담은 용이 못(潭)을 돌았다는데서 나온 말이라 한다. 1914년 행정구역 개편에 의하여 용당리(龍潭里)와 원당리(院堂里)를 병합하여 용당리(龍堂里)로 하였다.\n • ''구길리(九吉里)''\n 구길(九吉)은 마을 앞에 대종천(大鐘川)이 흐르는데, 마을의 형태가 마치 거북이 꼬리 같다고 하여 구미(龜尾)라 불렀다 한다. 다른 이야기로는 이 지역의 산이 거북이 엎드린 모양 같으므로 수북(水北) , 수남(水南), 전비(前飛), 하리(下里), 덕음(德音) 등의 부락을 합쳐 구길(龜吉)이라 불렀다는 이야기도 있다. 1914년 행정구역 개편때 쓰기 어려운 거북구(龜)자를 아홉구(九)자로 바꾸어 구길리(九吉里)라 부르게 되었다고 한다.\n • ''봉길리(奉吉里)''\n 경주최씨가 이 마을을 개척할 때 마을이 마치 봉황이 알을 품는 것 같은 모양을 하고 있다고 하여 봉길(鳳吉)이라 부르다가 조선 말기부터 봉길(奉吉)로 고쳐 부르게 되었다고 한다.\n===\n\n+++[#. 그레뱅 뮤지엄 ]\nhttp://www.grevin-seoul.com/ko\n<html> <CENTER>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/Info_map_GrevinKorea.jpg" width=480> <br>\n</CENTER> </html>\n그레뱅 뮤지엄은 100년이 넘는 역사를 지닌 세계적인 프랑스 밀랍인형 전문 박문관이다. 캐나다 몬트리올, 체코 프라하에서 문을 열었고, 2015년 7월 30일 아시아 최초로 서울 을지로 시청별관에 4번째 그레뱅 뮤지엄을 개관했다.\n===\n\n+++[#. 대한불교 천태종 구인사 ]\n▷ 5층 대법당\n천태종 중창조이며, 구인사 개산조인 상월원각대조사가 1945년에 손수 엮은 초가삼간터에 1980년 4월 완공한 구인사의 중심 전각이다.\n1층부터 4층까지는 스님들과 신도들의 선방으로 사용되고 있으며, 5층 '설법보전'에는 석가모니불을 본존으로한 삼존상과 목각 삼세불탱이 모셨다.\n\n▷ 호국안민 기원 대범종\n<html> <P style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class=MsoNormal align=left>\n<img src="http://www.gingaminga.com/wiki/pds/GalleryMacro/2010구인사_호국안민기원대범종.jpg" width="120" onClick="javascript:window.open('http://www.gingaminga.com/wiki/pds/GalleryMacro/2010구인사_호국안민기원대범종.jpg','screenshot','width=598, height=900');"STYLE=cursor:hand; TITLE='클릭하면 큰 이미지를 표시 합니다.'> <br>\n<SPAN style="COLOR: #2b5600"> 2010.10. 현재 </SPAN> </p> </html>\n▷ 국태민안 기원 대범종 ; 2017.08.22. 타종법회\n주조는 원광식 성종사 대표(http://sungjongsa.co.kr/ 국가 중요무형문화재 제112호 주철장)이 맡아서 높이 2.4m, 폭 1.2m 규모로 동 1200관을 들여 제작했다.\n===\n\n+++[#. 대한불고 천태종 부산 북부지부 광명사]\nhttp://www.광명사.org/ - 주소 : 부산 금정구 금샘로 51\n / 대광명전(大光明殿)의 삼존불(三尊佛) ; 비로자나불·약사유리광불·석가모니불을 모시고 있다.\n / 대광명전의 33응신불 ; 『법화경』 <관세음보살보문품>에는 관세음보살님이 33가지 모습으로 나타나 응하시는 모습을 33응신(應身)이라고 표현하고 있으며, 대광명전에 서른 세 분의 관세음보살님을 모시고 있다. \n===\n\n+++[#. 청와대 사랑채 ]\nhttp://www.cwdsarangchae.kr - 서울특별시 종로구 효자로 13길 45\n대한민국 현대사의 심장부인 청와대를 중심으로 역대 대통령의 발자취를 살펴볼 수 있는 공간이다. 또한 대한민국의 과거ㆍ현재ㆍ미래, 수도 서울 등에 대한 정보를 한자리에서 쉽게 접할 수 있는 역사기념관이자 문화홍보관으로 우리나라를 처음 접하는 외국인에게는 훌륭한 관광쿄스로도 활용되고 있다.\n===\n\n+++[#. 충청남도 논산시 (주)연미석재 ; 대한민국명장 석공예 이수희 명장 ]\n▷ 대한민국 명장 제650호, 논산시 부적면 계백로 1635-16\nhttps://blog.naver.com/shbae3521/223204610229\n===\n\n+++[#. 충청남도 천안시(天安市)]\n삼한시대 마한 54개 소국 중의 하나인 목지국이 있었다. 삼국시대에는 백제의 대록군과 감매현·순치현이었다. 천안이라는 지명은 고려 초기에 처음 등장하였다. 고려 태조는 930년에 동서도솔을 합쳐 천안도독부를 설치하였다. 태조 왕건은 술사 예방이 삼국의 중앙에 해당하는 천안은 다섯 용이 구슬을 다투는 지세이므로 이곳에 큰 관부를 설치하면 후백제가 스스로 항복해 올 것이라는 말을 들었다. 천안은 고려의 남진정책의 전초기지로 중앙군이 파견되어 주둔하였을 것이라고 추측된다. 왕건은 왕자성에 성을 쌓고 군사훈련소를 설치하였다. \n\n직산군은 고려시대에 홍경원이 설치되어 있던 곳으로, 본래 교통의 편의를 위해 설치되었던 홍경원은 막강한 경제력을 행사하였던 것으로 추측되는데, 망이·망소이의 난때에는 명학소민들이 홍경원을 불태우고, 고려 현종이 1021년 아버지 안종의 뜻을 받들어 세운 280칸짜리 고려 10대 사찰 중의 하나인 홍경사의 승려들을 죽였다는 기록이 있다. \n\n조선 시대에는 충청도 공주목의 관할 지역이었고, 1895년 제2차 갑오개혁으로 23부제를 실시했을 때에는 공주부에 속하였다. \n1914년 4월 1일 : 천안군, 직산군(현 직산읍, 성환읍, 성거읍, 입장면), 목천군(현 목천읍, 북면, 성남면, 수신면, 병천면, 동면)이 천안군으로 통폐합되었다.\n\n • 1917년 10월 1일 : 영성면을 천안면으로, 성산면을 직산면으로 개칭하였다.\n • 1931년 4월 1일 : 천안면이 천안읍으로 승격하였다.\n • 1963년 1월 1일 : 천안읍과 환성면이 통합하여 천안시로 승격하고, 천안군의 이름이 천원군(天原郡)으로 변경되어 12면을 관할하였다.\n • 1973년 7월 1일 : 성환면이 성환읍으로 승격하였다.\n • 1985년 10월 1일 : 성거면이 성거읍으로 승격하였다.\n • 1991년 1월 1일 : 천원군이 다시 천안군으로 개칭하였다.\n • 1995년 5월 10일 : 천안시와 천안군을 통합하여 도농복합시인 천안시가 되었다. (2읍 10면 13행정동)\n • 2002년 1월 1일 : 직산면이 직산읍으로, 목천면이 목천읍으로 승격하였다. (4읍 8면 13행정동)\n • 2003년 8월 1일 : 쌍용3동이 쌍용2동에서 분동하였다. (4읍 8면 14행정동)\n • 2005년 9월 30일 : 시청사를 문화동에서 시내 서부의 불당동으로 이전하였다.\n • 2006년 1월 10일 : 백석동이 쌍용3동에서 분동하였다. (4읍 8면 15행정동)\n • 2007년 5월 28일 : 신용동이 일봉동과 신방동으로 분동되었다. (4읍 8면 16행정동)\n • 2008년 6월 23일 : 동남구와 서북구가 설치되었다. (2구 4읍 8면 16행정동)\n • 2013년 10월 14일 : 불당동이 백석동에서 분동하고, 부성동이 부성1동과 부성2동으로 분동되었다. (2구 4읍 8면 18행정동)\n===\n\n+++[#. 한국가구박물관 ]\nhttp://www.kofum.com\n2011년에 CNN의 웹페이지에서 '서울에서 가장 아름다운 박물관'으로 선정, 한국의 옛 가옥 10채를 옮겨 궁채, 사대부집, 곳간채와 부엌채 등로 아름답게 꾸며 놓았다.\n모든 관람은 사전 예약제로 운영되며, 모든 예약은 박물관 홈페이지를 통해 가능하다. 가이드 투어는 매주 화요일~토요일 진행되며, 관람료는 인당 20,000원(초중고생, 장애인 할인 적용)이다.\n===\n\n+++[#. 한국조폐공사 화폐박물관 ]\nhttp://museum.komsco.com\n<html> <CENTER>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/Info_map_komsco.gif" width=480> <br>\n</CENTER> </html>\n주소 : (34132) 대전광역시 유성구 과학로 80-67(가정동) \n박물관안내 : (042)870-1200\n콜센터 : 1577-4321(콜센터 운영시간 : 평일 09:00 ~ 18:00 주말/공휴일 휴무)\n===\n\n
!!! 제사상 음식 위치, 제사상 차리는 방법\n제사상은 신위를 북쪽에 놓습니다.\n제주가 있는 쪽은 남쪽이며, 제주의 오른쪽이 동쪽, 왼쪽이 서쪽이 된다.\n\n제사상은 보통 5열로 차리는데\n1열에는 밥과 국을\n2열에는 구이, 전 등을\n3열에는 탕류를 (탕은 어탕, 육탕, 계탕 등 홀수로 여러가지를 올리거나 3가지 재로를 사용해 한꺼번에 만들기도 한다)\n4열에는 나무류, 김치(나막김치), 포 등을\n5열에는 과일을 놓습니다.\n\n!!! 유의점\n1.복숭아와 갈치, 삼치, 갈치 등 끝에 '치'자가 들어가는 것은 쓰지 않는다.\n2.고추가로와 마늘 양념은 사용하지 않는다.\n3.붉은 팥은 쓰지 않고, 껍질을 벗긴 흰 고물을 사용한다.\n\n!!! 제사상 음식 위치\n반서갱동 ; 밥(메)는 서쪽, 국(갱)은 동쪽에 놓는다(산 사람과 반대).\n적접거중 ; 구이(적)은 중앙에 놓는다.\n어동육서 ; 생선은 동쪽, 고기는 서쪽에 놓는다.\n동두서미 ; 머리를 동쪽, 고리는 서쪽을 향하게 놓는다.\n배복방향 ; 생선포는 등이 위로 향하게 놓는다.\n숙서생동 ; 익힌 나물은 서쪽, 생김치는 동쪽에 놓는다.\n홍동백서 ; 붉은 과일은 동쪽, 흰색 과일은 서쪽에 놓는다.\n좌포우혜 ; 왼쪽 끝에는 포, 오른쪽 끝에는 식혜를 놓는다.\n동조서율 ; 대추는 동쪽에, 밤은 서쪽에 놓는다.\n조율이시 ; 왼쪽부터 대추, 밤, 배, 감의 순으로 놓는다.\n\n\n
!!! 행 삽입, 삭제\nCells(i, 1).Resize(n).EntireRow.Insert\nCells(i, 1).Resize(n).EntireRow.Delete\n\n#.''특정 영역 삭제''\nSelection.EntireColumn.Hidden = False\nRange("a6:f140,h4:iv5,h1:iv1,h6:iv140").Select\nSelection.ClearContents\nRange("b1").Select\n\n#.''셀의 색상 변경하기''\nSheet1.Cells(row, 4).Interior.Color = vbWhite\nSelection.Interior.Color = vbWhite\n| Constant | Value | Description |\n| vbBlack | 0x0 | 검정 |\n| vbRed | 0xFF | 빨강 |\n| vbGreen | 0xFF00 | 녹색 |\n| vbYellow | 0xFFFF | 노랑 |\n| vbBlue | 0xFF0000 | 파랑 |\n| vbMagenta | 0xFF00FF | 진한 빨강 |\n| vbCyan | 0xFFFF00 | 진한 파랑 |\n| vbWhite | 0xFFFFFF | 흰색 |\n\nSelection.Interior.Color = RGB(0, 0, 255)\n\nSelection.Interior.Color = QBColor(0) / 함수의 인수로 들어가는 수는 0~15 사이로 16가지의 색\n| number | Color | number | Color |\n| 0 | 검정 | 8 | 회색 |\n| 1 | 파랑 | 9 | 라이트 블루 |\n| 2 | 녹색 | 10 | 라이트 그린 |\n| 3 | 시안 | 11 | 라이트 시안 |\n| 4 | 빨강 | 12 | 라이트 레드 |\n| 5 | Magenta | 13 | Light Magenta |\n| 6 | 노란색 | 14 | 밝은 노란색 |\n| 7 | 흰색 | 15 | 밝은 흰색 |\n\n#.''화면 업데이트 방지를 통한 계산 속도 개선''\nApplication.ScreenUpdating = False '코드 실행 중 차트와 같은 화면 업데이트 방지\nApplication.Calculation = xlCalculationManual '코드 실행 중 셀 계산 방지\nApplication.EnableEvents = False '이벤트 실행 방지\n\n'실행 코드\n\nApplication.EnableEvents = True\nApplication.Calculation = xlCalculationAutomatic\nApplication.ScreenUpdating = True\n\n+++[ 행 삽입]\n{{{\nSub InsertRows()\n Dim i As Long, n As Long\n n = Val(InputBox("삽입할 행 수를 입력하세요", "삽입행 수"))\n If n <= 0 Then Exit Sub\n For i = Cells(Rows.Count, 1).End(3).Row To 2 Step -1\n Cells(i, 1).Resize(n).EntireRow.Insert\n Next i\nEnd Sub\n}}}\n===\n\n+++[ 시트의 특정부분을 복사후 다른 시트에 붙여 넣기 ]\n''Sheets(1).Cells(1, 1).Resize(6, 12).Copy Sheets(2).Cells(1, 1).Resize(6, 12)''\n첫번째 시트의 첫번째 셀부터 6행(1,2,3,...) 12열(A,B,C,...)만큼 복사후 2번째시트의 첫번째 셀로부터 6행 12열만큼 붙여 넣는다.\n\n''Worksheets("Sheet1").Cells(1, 1).Resize(6, 12).Copy Worksheets("참조").Cells(1, 1).Resize(6, 12)''\nWorkSheets("셀이름") 으로 표현할 수 있다.\n\n''Worksheets("Sheet1").Range("A1:L6").Copy Worksheets("참조").Range("A1")''\nRange("시작행렬:끝행렬") 형식으로 사용가능하고, Range("A1") 은 A1 셀부터 시작된다.\n\n위 모두 결과는 같음\n===\n\n+++[ Application.VLookup( ) ]\n{{{\nSub Search_Item()\n\nDim table_array As Range\nDim nLineCurrent As Integer\nDim Result As Variant\nDim Character_Name As Variant\nDim Account_Name As Variant\n\nSet table_array = Worksheets("P아이템").Range("A5:F2900")\n\n\nnLineCurrent = 5\nRange("J5:M13800").ClearContents\n\nDo While Cells(nLineCurrent, 9) <> ""\n'For i = 0 To 20\n\n Cells(2, 11) = Cells(nLineCurrent, 1)\n \n Result = Application.VLookup(Cells(nLineCurrent, 9).Value, table_array, 1, 0)\n \n If (Application.IsError(Result)) Then\n Cells(nLineCurrent, 10) = "-"\n Else\n Character_Name = Application.VLookup(Cells(nLineCurrent, 9).Value, table_array, 6, 0)\n Account_Name = Application.VLookup(Cells(nLineCurrent, 9).Value, table_array, 4, 0)\n \n If (IsError(Character_Name)) And (IsError(Account_Name)) Then\n Cells(nLineCurrent, 10) = "#N/A"\n Cells(nLineCurrent, 13) = "#N/A"\n Else\n Cells(nLineCurrent, 10) = "보유"\n Cells(nLineCurrent, 11) = Character_Name\n Cells(nLineCurrent, 12) = Account_Name\n End If\n \n End If\n\n nLineCurrent = nLineCurrent + 1\n \n'Next i\nLoop\n\nEnd Sub\n}}}\n===
<html> \n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page180201"> <span style="font-size: 14px;"> <b> #. 함수 </b> </span> </a>\n</div> </html>\n\n#. VBA에서 워크시트의 함수를 불러오는 명령어\n ''Application.WorksheetFunction.명령어'' 형식으로 사용\n\n!! {{wrappingClass{▷ sub프로시저와 Function 프로시저의 차이점 }}}\nsub는 리턴값이 없고 function은 리턴값이 있다. 일반적인 언어에서는 통합되어 있는 기능이 VBA에서는 나뉘어져 있다.\n\n▼ 생성법\n ''> sub의 경우 ―――――――――――''\n Sub 프로시저명()\n 처리 내용\n End Sub\n\n ''> function의 경우 ――――――――――''\n Function 프로시저명 () As 리턴값 데이터형\n 처리 내용\n End Function\n\n\n[VBA] 'Sub'와 'Function' 완벽 가이드 불러오는 법\nsub의 경우 Call을 이용하여 호출하는 경우가 많다. function의 경우 리턴치를 돌려줄때 call을 앞에 붙이면 에러가 난다.\n\nSub main() \n Call macro1\nEnd Sub\n\nSub macro1()\n Dim str As String\n str = func1()\n MsgBox str, vbInformation\nEnd Sub\n \nFunction func1() As String\n func1 = "Hello VBA!"\nEnd Function\n\n참고 ; https://kukuta.tistory.com/417 - [VBA] 'Sub'와 'Function' 완벽 가이드\n▼ ByRef 와 ByVal\nVBA에서 모든 매개변수는 ByRef 또는 ByVal 속성을 가지고 있다. 만일 둘 중 아무것도 지정되어 있지 않은 경우라면 @@color(#ee1b24): ByRef가 기본값으로 적용 @@ 된다.\n ''> ByVal'' - 전달한 매개변수의 복사본을 만든다. 이는 매개변수의 값을 프로시져 내부에서 변경한다고 하더라도 복사본을 수정하는 것이기 때문에 원본의 값은 그대로 유지 된다는 것을 의미한다.\n ''> ByRef'' - 전달한 매개변수의 참조를 만든다. 이는 매개변수의 값을 프로시져 내부에서 변경한다면 참조가 가리키는 원본을 변경한다.\n\n' 값으로 매개변수 넘기기\nSub WriteValue1(ByVal x As Long)\nEnd Sub\n\n' 참조로 매개변수 넘기기\nSub WriteValue2(ByRef x As Long)\nEnd Sub\n\n' 명시적으로 지정되지 않았으므로 ByRef로 지정\nSub WriteValue3(x As Long)\nEnd Sub\n\n!! {{wrappingClass{▷ ISERROR 함수 }}}\n값의 오류값을 검사하고 값에 따라 TRUE(참)와 FALSE(거짓)를 표시\n값이 오류 값(#N/A, #VALUE!, #REF!, #DIV/0!, #NUM!, #NAME?, #NULL!)을 참조하는 경우에 iserror() 함수를 사용하여 참과 거짓을 표시\n\n''[형식] =ISERROR(value)''\n\n- value : 검사할 값입니다. 값으로는 공백(빈 셀), 오류 값, 논리값, 텍스트, 숫자, 참조 값 또는 이러한 항목을 참조하는 이름을 사용할 수 있습니다.\n\n''[사용예] =ISERROR(A4)''\nA4셀에 있는 값이 오류인지 여부를 확인합니다. TRUE로 표시되면 오류가 있는 경우이고 FALSE로 표시되면 오류가 없는 경우입니다. \n \n+++[ #N/A 오류메시지를 표시하지 않으려면 ; if() 함수와 iserror() 함수를 사용 ]\n''함수식에 if() 함수와 iserror() 함수를 사용하여 #N/A 표시를 '코드없음'으로 나오도록 수정한 예''\n \n현재 함수식 \n=VLOOKUP(A4,$F$3:$G$6,2,FALSE) \n\n수정할 함수식 \n=IF(ISERROR(VLOOKUP(A4,$F$3:$G$6,2,FALSE)),"코드없음",VLOOKUP(A4,$F$3:$G$6,2,FALSE)) \n===\n\n!! {{wrappingClass{▷ 데이터가 "#N/A" 일 때, 조건문에서 비교하는 방법 }}}\n{{{\nDim Character_Name As Variant\nDim Account_Name As Variant\n\nCharacter_Name = Application.VLookup(Cells(nLineCurrent, 9).Value, table_array, 6, 0)\nAccount_Name = Application.VLookup(Cells(nLineCurrent, 9).Value, table_array, 4, 0)\n\nIf (IsError(Character_Name)) And (IsError(Account_Name)) Then\n Cells(nLineCurrent, 10) = "#N/A"\n Cells(nLineCurrent, 13) = "#N/A"\nElse\n Cells(nLineCurrent, 10) = "보유"\n Cells(nLineCurrent, 11) = Character_Name\n Cells(nLineCurrent, 12) = Account_Name\nEnd If \n}}}\n\n| !WEEKDAY(serial_number,return_type) |@@ 지정한 날짜가 일주일중 몇 번째 날짜인가를 정수(1∼7)로 구한다. @@ |\n|~|1 또는 생략 - 1(일요일)에서 7(토요일)까지의 숫자, 2 - 1 (월요일)에서 7 (일요일), 3 - 0 (월요일)에서 6 (일요일)까지의 숫자입니다. |\n| !WEEKNUM(serial_number,return_type) |@@ 지정한 날짜가 1년중 몇 번째 주 인가를 구한다.[도구] - [추가기능] @@ |\n|~|1 - 일요일부터 주가 시작, 2 - 월요일부터 주가 시작된다. |\n| @@ Serial_number @@|날짜와 시간을 계산하기 위해 Microsoft Excel이 사용하는 날짜 시간 코드이다. serial_number로 숫자 대신에 "15-Apr-1993" 또는 "1993-4-15"와 같은 문자열을 지정할 수도 있다. |\n\n\n+++[ 엑셀 VLOOKUP 함수, HLOOKUP 함수 ]\n''VLOOKUP ( ① lookup_value(찾는 값), ② table_array(데이터 테이블 범위), ③ col_index_num (열 번호), ④ range_lookup(완전일치여부) )''\n ; vlookup 함수는 콕, 드래그, 열, false만\n 데이터 ② 테이블 범위의 첫 번째 열에서 ① 찾는 값을 검색한 후 일치하는 값이 있으면 사용자가 지정한 ③ 열 번호에 있는 값을 반환한다. \n 이 때 유사하게 일치하는 값을 찾도록 지정할 수도 있는데요. ④ 완전일치여부에 TRUE를 입력하면 유사하게 일치하는 값을 찾아 지정된 행의 값을 반환하고, 반대로 FALSE 를 입력하면 완전히 일치되는 값만을 찾는다.\n\nVLOOKUP 함수는 열배열 함수이며, HLOOKUP 함수는 행배열 함수로서\n 완성된 데이터에서 사용자가 원하는 값을 추출\n / VLOOKUP = Vertical (수직) + Look up (검색) ; 첫 번째 열에서 사용자가 지정한 값과 일치하는 행을 찾은 후 그 행에서 사용자가 지정한 열 번호에 있는 값을 추출하는 함수\n / HLOOKUP = Horizontal (수평) + Look up (검색) ; 첫 번째 행에서 값을 검색한 후 사용자가 지정한 행 번호에 있는 값을 추출하는 함수\n\n■ col_index_num 필수 요소. 반환해야 하는 값이 있는 table_array 인수의 열 번호 \n -. col_index_num 인수가 1이면 table_array의 첫 번째 열 값이 반환되고, col_index_num이 2이면 table_array의 두 번째 열 값이 반환.\n / 1보다 작으면#VALUE! 오류 값이 반환\n / table_array의 열 수보다크면 #REF! 오류 값이 반환\n\n■ range_lookup 선택 요소. 정확하게일치하는 값을 찾을 것인지, 근사값을 찾을 것인지를 결정하는 논리값\n -. range_lookup이 TRUE이거나 생략되면 정확한 값이나 근사값이 반환됩니다. 정확하게 일치하는 값이 없으면 lookup_value보다 작으면서 그 다음으로 가장 큰 값이 반환\n / range_lookup이 TRUE이거나 생략되면 table_array의 첫 번째 열 값을 오름차순으로 정렬해야 한다. 그렇지 않으면 VLOOKUP 함수를 실행하여 올바른 결과를 얻을 수 없다.\n / range_lookup이 FALSE이면 table_array의 첫 번째 열 값을 정렬할 필요가 없다.\n -. range_lookup 인수가 FALSE이면정확하게 일치하는 값만 찾는다. table_array의 첫 번째 열에 lookup_value와 일치하는 값이 두 개 이상 있으면 먼저 발견된 값이 사용. 정확하게 일치하는 값이 없으면 #N/A 오류 값이 반환.\n===
\n\n<html> <span style="background:#d7dedd; font-size: 10pt;"> Windows가 프로그램명.exe에서 중단점을 트리거했습니다. <br> \n힙이 손상되었거나 프로그램명.exe 또는 여기서 로드한 DLL에 버그가 있을 수도 있습니다. <br> \n <br>\n자세한 진단 정보는 [출력] 창을 참조하십시오. </b> </span> </html>\n • 선언후, 정의한 메모리의 할당범위를 넘어 접근하려는 경우에 발생\n 예를들어 a[10] 선언후, 할당범위를 넘어서 접근하는 경우:a[11], 등등, 이 발생할때 생긴다\n • 영상처리 분야에서는 가로 640, 세로 480 영상이 입력되고 있을때, 가로-세로를 혼동하여 접근하려는 경우 에러 발생 가능성이 있음\n\n-. Visual Studio C/C++ Compi;er Option - https://kh2ya.tistory.com/3\n\n\n<html><span style="background:#E2E2ff ; font-family:돋움; font-size: 14px;"> <b> #. (VC++) OutputDebugString을 printf처럼 사용하기 </b> </span></html>\n출처 ; https://sens.tistory.com/482\n//ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ\n//#define NO_DEBUG_PRINT\n#ifdef NO_DEBUG_PRINT\n#define DEBUG_PRINT\n#else\nstatic void _PrintDebugString(const WCHAR *format, ...) {\n WCHAR buf[1024];\n va_list vaList;\n va_start(vaList, format);\n _vsnwprintf_s(buf, sizeof(buf), format, vaList);\n va_end(vaList);\n OutputDebugStringW(buf);\n}\nstatic void _PrintDebugString(const char *format, ...) {\n char buf[1024];\n va_list vaList;\n va_start(vaList, format);\n _vsnprintf_s(buf, sizeof(buf), format, vaList);\n va_end(vaList);\n OutputDebugStringA(buf);\n}\n#define DEBUG_PRINT _PrintDebugString\n#endif\n\n//ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ\n// Usage examples\nDEBUG_PRINT("Hello World: %s", char_string);\nDEBUG_PRINT(L"Hello World: %s", wchar_string);\n\n\n<html> \n<div style="border: 1px solid #3058D2; padding: 10px;">\n<span style="font-size: 14px;"> #. Visual Studio 2017 (버전 15.0) </span>\n</div> </html>\nVisual Studio 2017 (버전 15.0)\n 구성 속성 > 일반 > 플랫폼 도구 집합 : Visual Studio 2017 (v141)\n\n<html> <span style="background:#FFEEEE; font-size: 12pt;"> <b> √ . All 228 functions were compiled because no usable IPDB/IOBJ from previous compilation was found. </b> </span> </html>\nVisual Studio 2013 -> 2015 에서 부터 발생\n''속성 페이지''\n구성 속성 > 링크 > 최적화 - 링크 타임 코드 생성\n / Debug ; '기본값'으로 변경\n / Release ; '빠른 링크 타임 코드 생성 사용 (/LTCG:incremental)' -> '링크 타임 코드 생성 사용(/LTCG)' 으로 변경\n\n\n<html> \n<div style="border: 1px solid #3058D2; padding: 10px;">\n<span style="font-size: 14px;"> #. Visual Studio 2013 (12) </span>\n</div> </html>\n2013년 10월 Windows 8.1과 함께 출시된 버전으로, 윈도우의 발표 주기가 짧아지면서 비주얼 스튜디오도 거기에 맞춰 약 1년만에 후속 버전인 2013 버전이 등장하였다.\n...\nWindows 7도 서비스 팩 1이 선행 설치된 상태여야만 설치할 수 있다.\n...\nWindows 10에서는 호환성 모드가 설정되었다며 설치되지 않는다. 다행히 업데이트 4 또는 5가 적용된 버전은 설치 가능하다.\n\n\n''속성 페이지''\n구성 속성 > 링커 > 일반 - 출력 파일 ; $(OutDir)$(TargetName)$(TargetExt)\n\n''Visual Studio Debugger 단축키''\nCtrl + Alt + B ; 중단점 대화상자 표시\n\n\n<html> <span style="background:#FFEEEE; font-size: 12pt;"> <b> √ . Visual Studio 2015에서 빌드된 프로젝트 Visual Studio 2013에서 빌드하기 </b> </span> </html>\nVisual Studio 2015 (V140) 에서 빌드한 프로젝트를 Visual Studio 2013 (V120)에서 빌드했을 때 발생하는 에러 메시지\n\n1>C:\sProgram Files (x86)\sMSBuild\sMicrosoft.Cpp\sv4.0\sV120\sMicrosoft.Cpp.Platform.targets(64,5): error MSB8020: The build tools for v140 (Platform Toolset = 'v140') cannot be found. To build using the v140 build tools, please install v140 build tools. Alternatively, you may upgrade to the current Visual Studio tools by selecting the Project menu or right-click the solution, and then selecting "Upgrade Solution...".\n\n프로젝트 속성에서\n구성 속성 > 일반 - 플랫폼 도구 집합 ; Visual Studio 2013 (V120)으로 설정\n\n\n<html> <span style="background:#FFEEEE; font-size: 12pt;"> <b> √ . 디버깅 정보를 찾을 수 없거나 정보가 일치하지 않습니다. </b> </span> </html>\n출처 ; http://yusiky.tistory.com/\n\n{{wrappingClass{ '<XXX.exe>'의 디버깅 정보를 찾을 수 없거나 정보가 일치하지 않습니다. 이진 파일이 디버그 정보를 사용하여 빌드되지 않았습니다. <br> 디버깅을 계속하시겠습니까? }}}\n\n에러 메세지가 뜨는 경우, 프로젝트의 속성창에 가서 설정을 변경해주어야 한다.\n''공통(Win32/x64)''\n속성 > C/C++ > 최적화 > 최적화:사용 안 함 (/Od)\n속성 > 링커 > 디버깅 > 디버그 정보 생성 (/DEBUG)\n\n''Win32''\n속성 > C/C++ > 일반 > 디버그 정보 형식 > 편집하여 계속하기를 위한 프로그램 데이타베이스 (/ZI)\n\n''x64''\n속성 > C/C++ > 일반 > 디버그 정보 형식 > 프로그램 데이타베이스 (/Zi)\n\n\n<html> <span style="background:#FFEEEE; font-size: 12pt;"> <b> √ . Visual Studio 에서 독립 프로세스를 디버그 하기 - 프로세스 연결 (Attach to Process) </b> </span> </html>\n\n프로젝트에서 직접 디버그 모드로 실행시켜서 디버그를 하는 것이 아닌, \n이미 실행중인 프로세스를 디버그 해야 하는 경우에 사용한다.\n\n디버거 >> 프로세스에 연결 (Atach to Process)\n\n프로세스에 연결 메뉴를 선택하면 현재 시스템에서 실행중인 프로세스 목록이 나열된다.\n(일부 다른 세션에서 실행중인 프로세는 안보일수 있기 때문에 하단의 "모든 사용자의 프로세스 표시" 및 "모든 세션의 프로세스 표시" 를 선택할 것을 권장.)\n\n원하는 프로세스를 선택한 후에 디버그를 한다.\n주의할 점은 해당 프로세스가 디버그 모드로 빌드된 상태여야 하며, 해당 프로세스의 프로젝트를 Visual Studio 에서 띄워놓은 상태에서 정상적으로 브레이크 포인트를 걸 수 있다. \n\n\n<html> <span style="background:#FFEEEE; font-size: 12pt;"> <b> √ . PDB 파일을 찾거나 열 수 없습니다. </b> </span> </html>\n출처 ; http://singleton.tistory.com/370\n\nVisual Studio 2012 에서 프로젝트 디버그 시 \n''"...을(를) 로드했습니다. PDB 파일을 찾거나 열 수 없습니다."''라는 메시지가 출력될 경우\n\n1. 윈도우가 기호 파일을 로드하지 못한다는 뜻이며, 디버그 시 시스템 dll 파일들로부터 다양한 정보들을 보기 위해서는 dll 파일의 기호(pdb 파일) 파일이 필요하다.\n\n2. @@color(#3058D2): 보통 VS 템플릿을 사용하지 않고 직접 프로젝트를 생성하거나 한 경우에 에러가 발생할 확률이 높다. @@ 직접 프로젝트를 생성한 경우, VS는 개발자가 기호 파일이 어디있는지 다 안다고 가정한다. \n(역자 주: Cocos2d-x 로 프로젝트를 생성한 경우도 이 경우에 해당되어 에러가 발생하는게 아닐까 생각된다.) \n\nVisual Studio 설정에서 Microsoft 사의 서버에서 다운받거나, 직접 파일을 다운받아서 해결한다.\nVS의 설정을 통해 Microsoft 사의 서버에서 기호 파일들을 다운받는 식으로 해결할 경우\n\nVisual Studio의 디버그 -> 옵션 및 설정 -> 기호에 들어가서\n''"Microsoft 기호 서버"에 체크''해주면 \n"이 디렉터리의 기호 캐시:" 에 지정된 경로로 MS사의 서버로부터 기호파일을 다운받게 된다.\n(이 이후로부터는 Visual Studio가 해당 경로에 다운받은 파일에서 기호를 로드할 수 있다.)\n\n설정을 마치고 프로젝트를 실행하면 약간의 다운로드가 진행된 후, 기호가 '잘...' 로드되었다는 메시지 출력하고,\n이제 기호파일을 오프라인에 저장해서 서버에서 기호파일을 받을 필요는 없기 때문에 \n다시 설정에 들어가서 __"Microsoft 기호 서버"의 체크를 풀어주고 다운받은 파일들로부터 기호를 로드할 수 있도록 디렉터리 경로는 그대로 남겨둔다.__\n\n\n\n<html> \n<div style="border: 1px solid #3058D2; padding: 10px;">\n<span style="font-size: 14px;"> #. Visual Studio 2005 (8) </span>\n</div> </html>\n2005년 11월에 출시된 버전으로 .NET 프레임워크 2.0 및 64비트 운영체제를 지원하기 시작했다. 이전 버전에 비해 표준 C/C++ 규격 적용 강화. 이 버전부터 초보/비전문 개발자들을 위한 무료 배포 버전인 Express 제품군이 추가되었다. MSN(윈도우 라이브) 계정만 있다면 간단한 정보를 입력한 후 무료로 등록하여 사용할 수 있다.\n\nWindows 98, 98 SE, Me를 지원하는 마지막 버전이다.\n\n\n<html> <span style="background:#FFEEEE; font-size: 12pt;"> <b> √ . Microsoft XML 파서 설정 </b> </span> </html>\n#import <msxml4.dll>\nHGL_ASSERT_RETNULL(XSUCCESSED(m_ptrXDocument.CreateInstance(__uuidof(MSXML2::DOMDocument40))));\n\n#import <msxml6.dll>\nHGL_ASSERT_RETNULL(XSUCCESSED(m_ptrXDocument.CreateInstance(__uuidof(MSXML2::DOMDocument60))));\n\n\n<html> <span style="background:#FFEEEE; font-size: 12pt;"> <b> √ . VS2013 MultiByte 설정 사용하기 위한 준비단계 </b> </span> </html>\n\nVS2013에서 MBCS(Multi-Byte Character Set)로 설정된 MFC 프로젝트를 컴파일하면 다음과 같은 에러 발생한다.\n\nerror MSB8031: Building an MFC project for a non-Unicode character set is deprecated. You must change the project property to Unicode or download an additional library. See http://go.microsoft.com/fwlink/p/?LinkId=286820 for more information. C:\sProgram Files (x86)\sMSBuild\sMicrosoft.Cpp\sv4.0\sV120\sMicrosoft.CppBuild.targets 369 5 IOKF_Client\n\n2013 부터는 MBCS용 MFC 라이브러리(DLL)가 제공되지 않는다.\n디볼트인 유니코드를 사용 권장하기 때문이다.\n\n사용 해야 할 경우에는 MS 에서 제공하는 " Visual Studio 2013용 멀티바이트 MFC 라이브러리 " 를 설치하면 이문제는 해결된다.\n\n아래 사이트에서 다운받고 설치하면 된다.\nhttp://www.microsoft.com/ko-kr/download/details.aspx?id=40770\n\n\n<html> <span style="background:#FFEEEE; font-size: 12pt;"> <b> √ . Visual Studio 인코딩 설정하기 </b> </span> </html>\n\n!!! Visual Studio 6.0 에서는 내부 인코딩이 "멀티바이트 문자 집합"이었으나, Visual Studio 2005 이후 버전들은 기본으로 "유니코드 문자 집합"을 사용한다. 어떤 사정에 의해서 "멀티바이트 문자 집합"을 사용하려면 아래와 같이 한다.\n\n''프로젝트 속성'' (Alt+F7) → 구성 속성 → 일반 → 문자집합 에서 "멀티바이트 문자 집합 사용" 또는 "유니코드 문자 집합 사용" 선택\n\ncf. (VS 2005기준) 문자열 사용시 일어나는 속칭 'LPCWSTR'문제를 해결 할 수 있다\n\ncf. 'char [260]'에서 'LPCWSTR'(으)로 변환할 수 없습니다.\n ; VS2005부터는 문자설정이 유니코드로 설정 되기 때문에 이전 프로젝트를 char* 으로 문자열을 처리한 경우, 위와 같은 메시지를 출력\n ⇒ 문자집합을 '멀리바이트 문자 집합 사용'으로 변경\n\n\n<html> <span style="background:#FFEEEE; font-size: 12pt;"> <b> √ . mspdbsrv.exe가 비주얼 스튜디오를 종료 한 후에도 종료되지 않는 현상 </b> </span> </html>\n\nspdbsrv.exe는 컴파일 할 때 Visual Studio에서 .pdb 파일을 만드는 데 사용하는 프로세스이다. 이것들은 어플리케이션을 디버그 할 수있게 해주는 심볼 파일이지만, Visual Studio를 종료 할 때 올바르게 종료되지 않을 수도 있다. \n이 경우, 프로세스 탐색기 나 작업 목록 (Windows에서는 Ctrl + Alt + Delete)을 사용하여 mspdbsrv.exe가 손상된 경우 수동으로 제거.\n\n
출처 ; http://www.nzkoreapost.com/bbs/board.php?bo_table=news_column&wr_id=5624 (2014.08.14. 뉴질랜드 코리아 포스트)\n\n쉬라(Syrah)는 프랑스를 비롯한 구대륙에서 부르는 말이고 쉬라즈(Shiraz)는 호주 등 신대륙에서 사용한다는 식의 뭉뚱그린 상식을 가지고 있다면 정보의 업데이트가 필요하다. 프랑스산에서도 쉬라즈가 발견되고 호주 산에서도 쉬라 라고 표기된 와인이 있기 때문이다. 심지어 어떤 이는 그 이유에 대해 와인어리 주인장의 국적에 따른다고 터무니없는 주장을 펴기도 한다. \n\n고대 페르시아에서 유래한 종자인 쉬라(Syrah)를 1830년 초 제임스 버스비가 호주에서 처음 심었을 때 프랑스 론(Rhone)의 에르미타쥬(Hermitage) 지역의 묘목을 심었으니 그 뿌리는 같다고 할 수 있다. 이들 품종은 한식 육류(소)요리와 한국인의 입맛에도 잘 맞는다. 특히 쉬라즈는 숯불구이 집에 가져갈 만한 착한 가격에 맛이 진해서 강한 양념에도 밀리지 않을뿐더러 오크숙성을 통해 우러나오는 바닐라 향이나 토스트 향은 숯불 향과 잘 어울린다.\n\n이탈리아의 토스카나(볼게리) 지방과 시칠리아 지방에서도 쉬라가 생산되는 데 산지오베제(Sangiovese)나 네로 디아볼라(Nero d’Avola)와 블렌딩하는 경우가 많고 론과 스타일이 비슷하다. 칠레나 아르헨티나에서도 론 스타일을 만들고 미국과 남아공에서는 호주의 쉬라즈(Shiraz) 스타일을 선택했다. 유달리 캘리포니아에서는 쉬라 라고 표기하는 와인이 더 많은데 기후가 론 지역과 매우 흡사해 같은 스타일의 와인이 생산되기 때문이다. 뉴질랜드(주로 Hawkes Bay)는 쉬라나 쉬라즈 둘 다 있다. 결국 ''쉬라즈(Shiraz)는 호주의 스타일을, 쉬라(Syrah)는 프랑스 론 지방의 에르미타쥬 스타일을 지향한다는 의미로 봐야 한다''는 것이 내 생각이다. \n\n프랑스 남부를 거쳐 지중해로 흐르는 론 강의 북쪽지역에는 8개의 주요한 와인 생산지(꼬뮌, Commune)가 있는데 모두 프랑스 와인 등급 중 최고등급인 AOC등급의 와인이 만들어지고 있는 곳이다. 8개의 꼬뮌 중 높은 경사면에 포도밭이 있어 면적당 햇볕을 더 많이 받는 에르미타쥬(Hermitage)지역은 로마시대부터 와인을 만들어 온 곳으로 프랑스에서 가장 오래된 포도 재배 지역 중 하나다. 이곳에서 적 포도는 쉬라(Syrah), 청포도는 비오니에(Viognier), 루산느(Roussane), 마르산느(Marsanne)가 주요품종이다. 가장 남성적인 매력이 있는 레드 와인을 생산하는 곳으로 에르미타쥬 와인은 최고 50년 이상의 숙성도 가능한 와인이다. 전체 생산량의 1/5은 마르산느를 주로 사용하여 만드는 화이트 와인인데, 화이트 와인 역시 튼튼한 구조 감을 지녀 장기 보관이 가능하다.\n\n뜨거운 햇살이 내리쬐는 론 지방의 기후가 빚어낸 쉬라(Syrah)가 처음엔 거칠고 강한 이미지로 평가가 그다지 높지 않았다. 국제적으로 좋은 평가를 받으려면 ‘균형’이 중요하기 때문이다. 그러나 최근에는 ‘에르미타쥬’ 뿐만 아니라 ‘코트 로티(Cote Rotie)’나 100% 쉬라 품종만을 사용하도록 법으로 제정되어있는 ‘코르나스(Cornas)’도 명품의 대열에 올라있다. 특히 보잘것없는 시골와인이었던 코트 로티와인을 일약 스타덤에 올린 장본인은 론의 명가, 기갈(Guigal)이다. 그의 탁월한 재능이 아니었다면 론의 와인은 관광지 지역상품 정도의 평가에서 벗어나지 못했을 것이다. 그의 코트 로티 3총사, 라 물린느(La Mouline), 라 랑돈느(La Landonne), 라 투르크(La Tourque)는 세계적인 와인 비평가 로버트 파카로부터 100점 만점을 18번이나 받은 명품이다. \n\n쉬라와 쉬라즈의 다른 점을 굳이 꼽자면 론의 쉬라는 산미와 스파이스 향이 강조되는 반면 호주 산 쉬라즈는 풍만한 바디감과 풍성한 과일 향과 허브 향에 특징이 있다. 물론 론의 쉬라 라고 과일 향이 없거나 호주의 쉬라즈라고 스파이스 한 느낌이 없는 것이 아니라 두 품종의 보다 두드러진 특징이 그렇다는 것이다. \n\n특히 호주 산 쉬라즈는 베리류, 체리 등의 과일 향과 바닐라, 흑설탕, 잼, 허브와 스파이스 향이 빼어나게 좋고 파워풀해서 간결하고 직설적인 스타일이다. 대단히 높은 절제 감과 균형감각을 지녔고 또한 부드러움조차 겸비하고 있다. 쉬라는 산미가 강한 편이라 날카로운 느낌을 주는 와인인 반면 쉬라즈는 단 맛도 강한 편이며 묵직하다. 저렴한 가격에서는 쉬라즈가 가격대비 질이 우수하지만 높은 가격일 수록 프랑스 론(Rhone)의 쉬라가 뛰어나다.\n\n쉬라(Syrah)는 호주에서 쉬라즈(Shiraz)로 변신하고 ''바로사 밸리(Barossa Valley)와 맥라렌 베일(Mclaren Vale) 지역에서 대성공을 거뒀다.'' 호주로 건너온 지도 벌써 2백 년이 넘어서 DNA를 검사해 보면 프랑스 쉬라와 호주 쉬라즈는 조금 다르다고 한다. 다른 환경에 적응해서 진화해온 결과다. 그러므로 쉬라(Syrah)와 쉬라즈(Shiraz)는 유전적으로는 같은 품종이지만 와인 스타일은 다르다고 해야 옳다. \n
Microsoft DirectX. MS에서 말하는 발음법은 '다이렉트 엑스'이나 미국에서는 '디렉트 엑스'라고 읽히는 경우도 있다.\n출처 ; https://namu.wiki/w/DirectX#fn-40\n http://gameqa.tistory.com/75 - 하드웨어 테스트(적합성 테스트, 사양 테스트) 방법\n \n!!! 개요\n1995년 9월에 마이크로소프트가 Windows용으로 제작하여 클로즈드 소스 형태로 발표한 멀티미디어게임용 종합 라이브러리.\n\n|>|>|>| ''A Brief History of DirectX'' |\n| !Version | !Operating System | !Launch Date |\n| DirectX 1.0 | Windows 95a | 9/30/95 |\n| DirectX 2.0/2.0a | Windows 95OSR2/NT4.0 | 6/5/96 |\n| DirectX 3.0/3.0a | Windows NT 4.0 SP3 | 9/15/96 |\n| DirectX 4.0 | | Never Released |\n| !DirectX 5.0 | !Windows NT 4.0/Beta for NT 5.0 | !7/16/97 |\n| DirectX 5.1 | Windows 95/98/NT4.0 | 12/1/97 |\n| DirectX 5.2 | Windows 95 | 5/5/98 |\n| !DirectX 6.0 | !Windows 98/NT4.0 | !8/7/98 |\n| |>|>|environment bump mapping; 평면적인 2D 표면에 요철을 주어 더욱 현실적으로 보이게 했다. |\n| DirectX 6.1 | Windows 95/98/98SE | 2/3/99 |\n| !DirectX 7.0 | !Windows 95/98/98SE/2000 | !9/22/99 |\n| |>|>|CPU 기반 3D 프로세싱에서 GPU 기반 3D 프로세싱으로의 이전; CPU에서 담당하던T&L(transforming & lightning) 단계가 GPU로 넘어갔다. DirectX 6.1 대비 20%이상의 성능 향상이 있었다. |\n| DirectX 7.0a | Windows 95/98/98SE/2000 | 9/99 |\n| |>|>|force-feedback 성능과 호환성 향상 |\n| DirectX 7.1 | Windows 95/98/98SE/ME/2000 | 9/16/99 |\n| |>|>|Windows ME와 같이 출시 |\n| !DirectX 8.0/8.0a | !Windows 95/98/98SE/ME/2000 | !9/30/2000 |\n| |>|>|Shader Model 1.0/1.1; (동시에 12 명령어까지 처리 가능한) 프로그래머블 픽셀 쉐이더와 버텍스쉐이더가 도입되었다. XBOX 콘솔에도 이 버전의 DirectX가 사용되었다. (PS1.0은 사용되지 않았음) |\n| DirectX 8.1 | Windows 95/98/98SE/ME/2000/XP | 11/12/01 |\n| |>|>|Pixel Shader 1.2/1.3/1.4; 동시에 처리가능한 명령어 수가 28개로 늘어났다. PS1.4는 ATI Radeon 8500에서만 사용되었다. |\n| !DirectX 9.0 | !Windows 95/98/98SE/ME/2000/XP | !12/19/2002 |\n| |>|>|Shader Model 2.0 <br>96 명령어 길이의 픽셀 쉐이더를 지원한다. DirectPlay와 몇가지 오디오, 비디오 기능이 향상되었다. |\n| DirectX 9.0b | Windows 98/98SE/ME/2000/XP | 8/13/2003 |\n| |>|>|Pixel Shader 2.0b & Vertex Shader 2.0 <br>ATI Radeon X600/X700/X800 시리즈에 가장 먼저 사용되었고 더 많은 명령어(최고 1536)와 임시레지스터(12에서 32로 증가)를 지원한다. 새로운 facing resister외에 geometry instancing 역시 지원한다. |\n| DirectX 9.0c | Windows 98/98SE/ME/2000/XP | 8/9/2004 |\n| |>|>|Shader Model 3.0, GPGPU <br>픽셀/버텍스 쉐이더의 최고 명령어수가 증가되었고 flow control/dynamic branching 기능이 추가되었다. NVIDIA GeForce 6800 시리즈에서 가장 먼저 사용되었다. |\n| DirectX 9.0L |>|Windows Vista only, Vista version of DirectX 9.0c, Shader Model 3.0, Windows Graphics Foundation 1.0, DXVA 1.0, GPGPU |\n| Direct3D 10 |>|Windows Vista/Windows 7, Shader Model 4.0, Windows Graphics Foundation 2.0, DXVA 2.0, GPGPU |\n| Direct3D 10.1 |>|Windows Vista SP1/Windows 7, Shader Model 4.1, Windows Graphics Foundation 2.1, DXVA 2.1, GPGPU |\n| Direct3D 11 |>|Windows Vista/Windows 7, Shader Model 5.0, Multithreaded rendering, Compute shaders, supported by hardware and software running Direct3D 9/10/10.1, GPGPU |\n\n각 운영체제를 거치면서 많은 버전의 DirectX가 공개되었다. 새로운 하드웨어 장치가출시되면서 MS는 신기술을 최대한 활용할 수 있도록 하드웨어 개발자들과 작업해왔다. \n\n최근의 추세는, 목표로 하는 유저층을 한국 뿐 아니라 중국까지 포함하는 경우가 많은데,\n중국은 아직 저사양 PC의 비율이 (무시하지 못할 만큼) 많은 것으로 알려져 있다.\n따라서, @@color(#3058D2): 픽셀 쉐이더 버전은 3.0 을 경계값으로 하는 경우가 많다. @@\n \n※ 픽셀 쉐이더 4.0 이상 버전에서는 3.0 에서보다 더 화려한 효과를 낼 수 있는데,\n고사양 PC를 사용하는 유저를 타겟으로 하는 경우에는, 최상 옵션을 고려하여 4.0 도 경계값에 포함되어야 한다.\n\n\n!!! 주요 버전별 특이사항\n!!!! 1세대 (1995~1998년)\n• 1.0 - 최초의 DirectX, Windows 95 출시 1달 후인 1995년 9월에 SDK 형태로 공개[21]되었으며 이전에 MS-DOS 기반 Windows 3.1의 그래픽 API를 Win32 환경에서도 구동하기 위해 WinG라는 이름으로 먼저 알려져 있었다.\n\n• 2.0 - Windows 95 OSR2 확장팩부터 기본 지원,[22] 1996년 상반기에 등장했고 이때부터 우리가 아는 DirectX라는 이름으로 사용되었다. 3D 그래픽 라이브러리인 Direct3D가 추가되었다.\n...\n• 5.2 - Windows 98 기본 지원\n\n!!!! 2세대 (1998~2000년)\n...\n\n!!!! 3세대 (2001~2006년)\n• 8.0 - 2000년 11월에 정식 발표된 버전으로 프로그래머블 버텍스 셰이더와 픽셀 셰이더 개념을 처음 도입되었고 최대 12개의 명령어를 동시에 처리할 수 있는 등 발표 당시엔 획기적인 3D 그래픽 처리를 보여줘서 주목받았으나 이를 지원하는 하드웨어는 2001년 초 지포스 3 시리즈부터였고 지원하는 게임은 당시 낯설어 보였던 셰이더 프로그래머블 기능이 고난이도로 취급했기 때문에 한동안 그림의 떡이 되었다. 또한 여태껏 2D 그래픽을 담당했던 DirectDraw는 7.x버전에서 끊김으로써 Direct3D가 3D 겸 2D 그래픽 라이브러리로 통폐합되어 DirectX Graphics로 명명되었고 음향 관련 라이브러리 쪽에는 DirectSound와 DirectMusic이 DirectX Audio로 통합 및 명명되었다.\n\n• 8.0a - Windows 95의 마지막 지원 버전, 2001년 초에 발표되었고 셰이더 모델이 개선될 겸 최대 동시 명령어의 갯수가 약간 증가했다.\n\n• 8.1 - Windows XP, XBOX, Windows Server 2003 기본 지원, 2001년 11월에 발표한 버전으로 8.0a과 마찬가지로 8.0의 개선판이며, ''픽셀 셰이더가 1.4로 업데이트''될 겸 최대 동시 명령어의 갯수가 28개로 대폭 증가되었다. 실질적으로 게임에 채택된 8.x버전 중 해당 버전이 제일 많다.\n\n•9.0 - 2002년 12월 말에 정식 발표한 버전으로 하드웨어에서는 AMD 라데온 9700이 제일 먼저 지원했고 로고가 지금의 형태로 변경되었으며 ''버텍스 셰이더 2.0, 픽셀 셰이더 2.0으로 업그레이드''되어 최대 명령어 수가 96개로 크게 증가되었다. HLSL을 도입하여 독자적인 셰이더 프로그래밍을 고수준 언어로 제어할 수 있게 되었고, HDR 렌더링을 지원하여 보다 높은 컬러 선명도를 구현하는게 가능해졌다.\n\n• 9.0c - Windows XP(SP2 이상), Windows Server 2003(SP1 이상), Windows Server 2003 R2, XBOX 360 기본 지원, 하드웨어에서는 엔비디아 지포스 6 시리즈부터 제일 먼저 지원했고 엑스박스 360에서의 마지막 32비트 지원버전이자 Windows XP의 마지막 지원버전, 2004년 8월에 등장한 버전으로 같은 9.0 계열임에도 ''버텍스 셰이더 3.0, 픽셀 셰이더 3.0으로 대폭 업그레이드''되어 최대 명령어 수가 또 증가했고 맵핑 기술의 최고사양급인 변위(디스플레이스먼트)맵핑과 GPGPU 기능을 처음으로 지원하는 등 사실상 9.0c라는 이름보단 9.5에 더 어울릴만한 버전. 역대 가장 많은 Windows 버전들이 마지막으로 지원한 API였기 때문에 DIrectX API계의 Windows XP 버전이라고 할 수 있다.\n\n!!!! 4세대 (2007~2015년)\n• 10.0 - Windows Vista 기본 지원, 2006년 말에 처음 나왔지만 이를 활용한 게임은 한동안 나오지 않았고 2007년 늦봄이 되서야 하나둘씩 도입된 버전이다. 얼핏 보기엔 기존 9.0c 버전과는 큰 차이가 없어 보이지만 내부적으로는 그래픽 처리에 있어서 전체적인 메커니즘이 많이 변경되었기 때문에 ''셰이더 모델 4.0으로 업그레이드''되었고 각각의 셰이더 유닛들을 합하여 통합 셰이더로 명명되었다. 이전에 7.0부터 9.0c버전까지 버전을 거듭하면서 새로운 기능과 동시에 가능한 명령어 갯수가 늘어났는데 기존 하드웨어 스펙으로는 9.0c의 풀스펙으로 활용하기가 어려웠고 구현하면서 병목 및 오버헤드 문제가 발생하는 바람에 이러한 문제점을 해결하기 위해 고안된 일종의 9.0c 최적화 버전이라고 할 수 있다.\n...\n\n!!!! 5세대 (2015년~)\n• 12.0 - Windows 10 기본 지원 (Windows 10 이전 버전은 미지원 엑스박스 원도 운영체계를 윈도우10 기반으로 업데이트 하여 지원).\n\n\n
출처 ; https://msdn.microsoft.com/ko-kr/library/jj152935.aspx\n\n1. .NET Framework 프로젝트에 대한 구성 파일을 추가하거나 찾습니다.응용 프로그램에 대한 구성 파일은 동일한 디렉터리에 있고 응용 프로그램과 동일한 이름이지만 확장명이 .config입니다.예를 들어, MyExecutable.exe라는 응용 프로그램의 경우 응용 프로그램 구성 파일의 이름은 MyExecutable.exe.config입니다.\n\nVisual Studio 메뉴 모음에 구성 파일을 추가하려면 ''프로젝트'', ''새 항목 추가''를 차례로 선택합니다.왼쪽 창에서 ''일반''을 선택한 다음 ''구성 파일''을 선택합니다.구성 파일 이름을 appName.exe.config로 지정합니다.해당 플랫폼에서 활성화 정책이 변경될 수 없으므로 이러한 메뉴 선택은 Windows 스토어 앱 또는 Windows Phone 앱 프로젝트에서 사용할 수 없습니다.\n\n2. 다음과 같은 @@color(#3058D2): <supportedRuntime> @@ 요소를 응용 프로그램 구성 파일에 추가합니다. \n{{{\n<configuration>\n <startup>\n <supportedRuntime version="<version>"/>\n </startup>\n</configuration>\n}}}\n여기서 <version>은 앱이 지원하는 .NET Framework 버전에 맞는 CLR 버전을 지정합니다.다음과 같은 문자열을 사용합니다.\n ◦ .NET Framework 1.0: "v1.0.3705"\n ◦ .NET Framework 1.1: "v1.1.4322"\n ◦ .NET Framework 2.0, 3.0 및 3.5: "v2.0.50727"\n ◦ .NET Framework 4 및 4.5(4.5.1 등의 포인트 릴리스 포함): "v4.0"\n\n기본 설정 순서대로 나열된 여러 @@color(#3058D2): <supportedRuntime> @@ 요소를 추가하여 .NET Framework의 여러 버전에 대한 지원을 지정할 수 있습니다.\n\n다음 표에서는 컴퓨터에 설치된 응용 프로그램 구성 파일 설정과 .NET Framework 버전으로 .NET Framework 3.5 응용 프로그램이 실행 중인 버전을 결정하는 방법을 보여 줍니다.이 예제는 .NET Framework 3.5 응용 프로그램에 국한되지만 이전 .NET Framework 버전으로 빌드된 대상 응용 프로그램에 이와 유사한 논리를 사용할 수 있습니다..NET Framework 2.0 버전 번호(v2.0.50727)는 응용 프로그램 구성 파일에서 .NET Framework 3.5를 지정하는 데 사용됩니다.\n\n|!App.config 파일 설정 |!버전 3.5가 설치된 컴퓨터 |!버전 3.5 및 4 또는 4.5가 설치된 컴퓨터 |!버전 4 또는 4.5가 설치된 컴퓨터 |\n|없음 |3.5에서 실행 |3.5에서 실행 |사용자가 올바른 버전*을 설치하도록 요청하는 오류 메시지 표시 |\n|<supportedRuntime version="v2.0.50727"/> |3.5에서 실행 |3.5에서 실행 |사용자가 올바른 버전*을 설치하도록 요청하는 오류 메시지 표시 |\n|<supportedRuntime version="v2.0.50727"/> <br> <supportedRuntime version="v4.0"/> |3.5에서 실행 |3.5에서 실행 |4 또는 4.5에서 실행 |\n|<supportedRuntime version="v4.0"/> <br> <supportedRuntime version="v2.0.50727"/> |3.5에서 실행 |4 또는 4.5에서 실행 |4 또는 4.5에서 실행 |\n|<supportedRuntime version="v4.0"/> |사용자가 올바른 버전*을 설치하도록 요청하는 오류 메시지 표시 |4 또는 4.5에서 실행 |4 또는 4.5에서 실행 |\n \n* 이 오류 메시지와 이 오류를 방지하는 방법에 대한 자세한 내용은 @@color(#3058D2): .NET Framework 초기화 오류: 사용자 환경 관리@@을 참조하세요.\n
출처 ; 전자용어사전\n\n컴퓨터에 의해 계산을 한다든지, 정보의 처리를 하기 위한 프로그램을 만드는 것. \n그 절차로서는 문제를 해석하고, 계산의 방식을 정하여 흐름도를 만들고, 그에 따라서 코딩하고, 기계에 의한 점검을 하는 등의 작업이 필요하다.
출처 ; https://blogs.msdn.microsoft.com/chuckw/2013/07/01/where-is-the-directx-sdk-2013-edition/\nJuly 1, 2013By Chuck Walbourn - MSFT\n\n''See also'' ''[[“Where is the DirectX SDK (2015 Edition) ?"|https://blogs.msdn.microsoft.com/chuckw/2015/08/05/where-is-the-directx-sdk-2015-edition/]]''\n\nAt BUILD 2013 last week, Microsoft released the Windows 8.1 Preview, Visual Studio 2013 Preview, and the Windows SDK for Windows 8.1 Preview (included in the VS 2013 Preview). Note that RTM was released on October 17th, 2013.\n\nAs with the Windows 8.0 SDK, the Windows 8.1 SDK is where you’ll find Direct3D 11.2, Direct2D 1.2, DXGI 1.3, DirectXMath 3.05, a new HLSL complier (#47), and some updates to WIC. We recommend using the Windows 8.x SDK instead of the DirectX SDK, or at a minimum using the Windows 8.x SDK primarily with only specific usages of the legacy DirectX SDK.\n\nThe 18.0 C++ compiler in the Visual Studio 2013 Preview includes support for a new @@bgcolor(#F9F2F4):color(#C7254E): __vectorcall @@ x86 and x64 calling-convention, and DirectXMath 3.05 has been updated to take advantage of it. I refreshed the DirectXMath extensions series, XDSP, and SHmath to integrate smoothly with this new version. The 18.0 C++ compiler supports additional C++11, Standard Library/STL, and C99 library features as well. See the Visual C++ Team blog, Somasegar’s blog, and the Visual Studio blog. Remote Debugging Tools packages are also available. \n\nYou’ll find VS 2013 projects for DirectXTex, DirectXTK, and Effects 11 on their respective CodePlex/GitHub sites. There is a Windows Store app for Windows 8.1 version of DirectXTK Simple Sample available on MSDN Code Gallery.\n\nThe DirectX SDK (June 2010) is still available as the last release of the standalone DirectX SDK, but we strongly encourage developers to begin to transition to using the Windows SDK instead. Instructions for ‘mixing’ use of the new Windows SDK and older DirectX SDK content can be found [[here|https://msdn.microsoft.com/en-us/library/windows/desktop/ee663275.aspx]]. Remember that for Windows Store app development, do not use the DirectX SDK.\n\n''VS 2010 Users:'' The standalone Windows 8.1 SDK does not integrate a new “platform toolset” option for Visual Studio 2010 to use the newer headers. See this [[post|https://blogs.msdn.microsoft.com/chuckw/2013/10/18/visual-studio-2013-and-windows-8-1-sdk-rtm-are-now-available/]] for more details.\n\n...\n\n''System requirements:'' Windows 8.1 will run on the majority of hardware that can run Windows 8. The 64-bit version does require CPU support for some additional instructions which are not present on early first-generation 64-bit processors. See the [[Windows 8.1 Preview FAQ|http://windows.microsoft.com/en-us/windows/support#1TC=windows-7]] for details.\n\nVisual Studio 2013 can be installed on Windows 8.1, Windows 8, and Windows 7 Service Pack 1. For Windows 7 SP1, installing KB 2670838 is required as part of the setup.\n\n...\n\n''DirectX SDK:'' If you want to make use of ''@@color(#3058D2):legacy DirectX SDK @@'' components such as D3DX9, D3DX10, D3DX11, or XAudio 2.7 with ''__Visual Studio 2013__'', see MSDN for details on mixing the paths correctly.\n\n
출처 ; http://sktype.tistory.com/112\n\nVisual Studio 2010 (Microsoft Visual Studio 10.0)\nVisual Studio 2013 (Microsoft Visual Studio 12.0)\nVisual Studio 2015 (Microsoft Visual Studio 14.0)\n\n<html> <CENTER>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/visualstudio_version.jpg" width=800>\n</CENTER> </html>\n@@bgcolor(#FF5E00):color(#FFFFFF): Visual Studio 6.0 @@\n- 컴파일 속도가 빠르다.\n- 단순히 C, C++ 의 기능을 공부하고자 할 경우.\n- ''클래스위자드 (Ctrl + W) 사용이 편하다.''\n- C#이 없던 시절이니, C# 기능이 없다.\n- C++ 개발에서는 ''MFC''를 이용해 Windows GUI 응용 프로그램 만들 수 있다.\n- 표준 C++98 도입\n\n@@bgcolor(#FFBB00):color(#000000): Visual Studio .NET ~ Visual Studio .NET 2003 @@\n- C#이 처음으로 등장.\n- 닷넷 초창기 버전이라 오류가 많아 최악의 평을 얻는다.\n- 2003부터 2008버전까지 ''클래스 위자드가 사라진다.''\n- .NET 개발에서는 ''Windows Forms(또는 "Winforms")''를 이용해 Windows GUI 응용 프로그램 만들 수 있다.\n- MFC vs Winforms : http://gendoh.com/m/74, http://msdn.microsoft.com/ko-kr/library/0xb61xs7.aspx\n\n@@bgcolor(#FFBB00):color(#000000): Visual Studio .NET 2005 @@\n- VS 2005 및 .NET Framework 3.0 SP2 이상부터 쓸만한 듯 하다.\n- 그러나 최소 .NET 2008 이상을 사용하는 것이 낫다.\n- .NET 3.0부터 ''WPF''를 이용해서도 Windows GUI 응용 프로그램 만들 수 있다. 단, xaml 등 별도로 더 배워야 한다.\n- 표준 C++03 도입\n- WPF vs Windows Forms\n http://www.hoons.net/board/qanet3/content/25330\n http://www.hoons.net/Board/itdisc/Content/52987\n http://softwarekishorekoney.blogspot.kr/2009/10/wpf-vs-windows-forms-vs-mfc.html (해외)\n http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=82&MAEULNO=2&no=1&page=1\n\n[WPF] \n단점 - copy & paste가 어렵다. 되긴 하는데 스타일이 흩트러져 쓸수 없다.\n - xaml 적응 기간이 오래걸린다. xaml배우다가 오픈일 못지킬수 있다. 아따 어렵다.\n - 윈폼보다 속도가 느리다? (이 부분에서 둘다 dll컴파일이기 때문에 wpf라고 따로 느릴리 없다고 생각하는데요. 다른 분들은 html처럼 xaml이 런타임에 해석되는 것으로 오해하고 있음)\n - xaml의 난이도는 HTML과 동일하다. 즉 winform과 비고해서 3배 시간이 더 걸린다.\n - 디자이너와 협업이 어렵다. (wpf가 애초에 디자이너와의 협업을 원칙으로 만들어졌지만 막상 디자이너한테 가면 개발자가 만든 xaml코드 모르겠어요. 그냥 새로 만들어요. 이렇게 된단다)\n\n장점 - 예쁘다. 끝\n\n[WinForm]\n단점 - wpf보다 예쁘지 않다.\n장점 - wpf에 비교해서 몇배 빠른 개발이 가능하다. \n\n@@bgcolor(#FF5E00):color(#FFFFFF): Visual Studio .NET 2008 @@\n- 윈도우7에 .NET Framework 3.5가 자체포함되어 있어 별도로 사용자는 설치할 필요가 없다.\n- 윈도우7을 많이 사용하는 요즘 2008을 사용해 개발하는 것이 낫다.\n- 2013년 현재 2008을 가장 많이 사용한다.\n- 클래스 위자드 대신 사용하는 방법 : http://lafirr.tistory.com/59, http://minimonk.net/2929\n\n@@bgcolor(#FFBB00):color(#000000): Visual Studio .NET 2010 @@\n- 컴파일 속도가 2008보다 굉장히 느리다. 답답하다고 한다.\n- ''클래스 위자드의 귀환''\n- PC사양이 좋다면 2010을 쓰고, 2010 사용하기가 버벅거린다면 2008을 쓴다.\n- 윈도우7에서도 별도로 Framework 4.0을 별도로 설치해야 한다.\n- 2013 현재 2008과 2010을 많이 사용한다.\n- 2010 사용할바에 2012를 사용하는 것이 낫다.\n- Express 버전으로 MFC 만들 때 별도로 추가해야할 시스템 파일 : http://ethobis.tistory.com/71\n mfc100ud.dll, msvcp100d.dll, msvcr100d.dll\n- 에디션별 Exoress(무료) <<< PRO << PREMIUM < ULTIMATE\n- 차기표준 가칭 C++0x 도입 (정식으로 채택되지 않는 상태인듯)\n\n@@bgcolor(#FF5E00):color(#FFFFFF): Visual Studio .NET 2012 @@\n- 컴파일 속도가 2010보다 개선.\n- ''메트로 앱'' 개발이 가능.\n- 윈도우8은 별도로 .NET Framework 4.5를 설치할 필요가 없다.\n- 윈도우7은 별도로 .NET Framework 4.5를 설치해야 한다.\n- 2010 사용할바에 2012를 사용하는 것이 낫다.\n- 에디션별 PRO << PREMIUM < ULTIMATE\n- 표준 C++11 도입 (C++0x가 정식명칭 C++11로 바뀌면서 표준으로 채택)\n\n윈도우 NT 3.1 / Version 3.1\n윈도우 NT 3.5 / Version 3.5\n윈도우 NT 4.0 / Version 4.0\n윈도우 2000 / Version 5.0\n윈도우 XP / Version 5.1\n윈도우 비스타 / Version 6.0\n윈도우 7 / Version 6.1\n윈도우 8 / Version 6.2\n\n수집한 자료를 종합해보면,\nVS 6.0 : C, C++ 입문용. 그러나 2008부터 바로 입문해도 된다.\nVS 2008 : 윈도우7 많이 사용하는 요즘에 적합.\nVS 2012 : 앞으로의 추세. 하지만, 기존의 닷넷 버전들과 vista와 7의 OS관계로 비추어볼 때, VS 2015 정도가 나왔을때부터 진가를 발휘할 듯 싶으나, 그때부터 뛰어들면 남들보다 너무 늦고 메트로 앱을 개발하고 싶다면 초기개발 단계인 지금부터 툴에 뛰어들어야 한다고 생각한다.\n\n참고)\nhttp://msdn.microsoft.com/ko-kr/library/bb822049.aspx\nhttp://blog.naver.com/PostView.nhn?blogId=saltynut&logNo=120164126907\nhttp://ko.wikipedia.org/wiki/마이크로소프트_비주얼_스튜디오\n
출처 ; https://blogs.msdn.microsoft.com/chuckw/2015/08/05/where-is-the-directx-sdk-2015-edition/\nAugust 5, 2015By Chuck Walbourn - MSFT Chuck Walbourn - MSFT\n\nAs noted on MSDN, the DirectX SDK is deprecated. The June 2010 release is the last release, and “DirectX” is now part of the Windows SDK. There are really only three scenarios where you should continue to use the old DirectX SDK:\n\n 1. You have code (or perhaps an older book) that makes use of D3DX9, D3DX10, D3DX11, or XACT Engine. \n 2. Your application uses use XAudio2 and supports Windows 7 systems. \n 3. You are targeting Windows XP with the alternate @@bgcolor(#F9F2F4):color(#C7254E): v1x0_xp @@ Platform Toolset.\n\n...\n\n''D3DX:'' All versions of D3DX are deprecated including D3DX9, D3DX10, and D3DX11. See [[Living without D3DX|https://blogs.msdn.microsoft.com/chuckw/2013/08/20/living-without-d3dx/]] for replacements and recommendations including [[DirectX Tool Kit|https://github.com/Microsoft/DirectXTK]], [[DirectXTex|https://github.com/Microsoft/DirectXTex]], [[DirectXMesh|https://github.com/Microsoft/DirectXMesh]], and [[UVAtlas|https://github.com/Microsoft/UVAtlas]] on GitHub.\n\n...\n\n''DirectX SDK:'' If you need to make use of legacy DirectX SDK components such as D3DX9, D3DX10, D3DX11, or XAudio 2.7 with VS 2012, VS 2013 or VS 2015, see MSDN for details on mixing the Windows 8 or Windows 10 SDK correctly with the legacy DirectX SDK. Be sure to [[The Zombie DirectX SDK|http://blogs.msdn.com/b/chuckw/archive/2015/03/23/the-zombie-directx-sdk.aspx]] as well. If you are targeting Windows XP which makes use of the Windows 7.1A SDK, see [[Visual Studio 2012 Update 1|http://blogs.msdn.com/b/chuckw/archive/2012/11/26/visual-studio-2012-update-1.aspx]].\n\n\n<html> <span style="font-size: 16px;"> DirectX 12 </span> </html>\n\nThere is something called the DirectX 12 SDK which was used as a beta vehicle for the development of DirectX 12 through the Early Access Program. Now that the Windows 10 SDK is final, you don’t need access to the DirectX 12 SDK at all. The DirectX 12 samples are on [[GitHub|https://github.com/Microsoft/DirectX-Graphics-Samples]]. Note that there is also a header file called @@bgcolor(#F9F2F4):color(#C7254E): d3dx12.h @@ which is an all inline header with some utility code shipped in the GitHub samples.\n\n''Related:'' [[Where is the DirectX SDK (2013 Edition)?|http://blogs.msdn.com/b/chuckw/archive/2013/07/01/where-is-the-directx-sdk-2013-edition.aspx ]]\n\n''See also:'' [[Where is DXERR.LIB?|http://blogs.msdn.com/b/chuckw/archive/2012/04/24/where-s-dxerr-lib.aspx]], [[GDF Tools|http://blogs.msdn.com/b/chuckw/archive/2012/05/31/windows-8-release-preview-and-gdfs.aspx]], [[XDSP.H|http://blogs.msdn.com/b/chuckw/archive/2012/05/01/xdsp-h.aspx]], [[ SH Math | tp://blogs.msdn.com/b/chuckw/archive/2012/07/28/spherical-harmonics-math.aspx ]]\n\n
<html> <a name="#Page190516"> </a> </html>\n<html>\n<a href="#Page190516_01"> #. 배열의 개수를 세는 _countof 매크로 </a> <br>\n<a href="#Page190516_02"> #. 배열 동적할당 </a> <br>\n</html>\n\n<html> <html> <a name="Page190516_01"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page190516"> <span style="font-size: 14px;"> #. 배열의 개수를 세는 _countof 매크로 </span> </a>\n</div> </html>\n원문 ; http://norux.me/9\n\nsizeof가 어떤 구조체나, 배열의 전체 사이즈의 byte를 구해준다면, _countof 는 배열의 개수를 구하는 매크로 이다.\n * _countof는 비주얼스튜디오에서만 사용이 가능하다.\n\n''int arr[10];'' - int 형 타입의 배열을 선언하면\n sizeof(arr) = 40 bytes (4 바이트인 int 타입이 10개)\n _countof(arr) = 10 elements (10개의 배열)\n이 된다.\n\n_countof는 비주얼 스튜디오에서만 사용 가능한 매크로이다.\n{{{\n#define _countof(_Array) sizeof(_Array) / sizeof(_Array[0])\n}}}\n\n<html> <html> <a name="Page190516_02"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page190516"> <span style="font-size: 14px;"> #. 배열 동적할당 </span> </a>\n</div> </html>\n''정적 메모리 할당''\n 1.선언과 동시에 크기가 정해지며, 중간에 바꿀 수 없다. \n 2.소멸할때 운영체제가 자동으로 할당한 메모리를 회수한다.\n ⇒ 변수가 소멸할때까지 이 공간의 크기를 바꾸지 못하기 때문에, 메모리를 크게 잡을 경우 메모리 낭비가 클 수 있다.\n\n\n<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 14px;"> <b> 문자열 동적할당 </b> </span>\n</html>\n\nWCHAR * lpszStr = L"돋움: 24!..asFF.고고씽 abcdefg \sn가나다라마바사";\n\n//ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ\nWCHAR * ip; \nip = &(*lpszStr);\n\n//ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ\nWCHAR * lpszStr;\nUINT lenStr = 0;\n\nlenStr = wcslen(lpText00) + 1;\nlpszStr = new WCHAR[lenStr]{ 0, };\nwcscpy_s(lpszStr, lenStr, lpText00);\n\ndelete [] lpszStr;\n\n\n<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 14px;"> <b> 1. C에서 동적할당 ; malloc() 함수 사용 </b> </span>\n</html>\n\nint *p; // 포인터 변수 선언\nint arr_size; // 배열의 크기를 입력 받을 변수\n\nscanf("%d", &arr_size); // 배열의 크기를 입력 받음\n\np = (int *)malloc(sizeof(int) * arr_size); // 입력 받은 숫자만큼 배열을 동적 생성\n\nfree(p); // 사용이 끝난 후 메모리 해제\n\n\n<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 14px;"> <b> 2. C++에서 동적할당 ; new 키워드 사용 </b> </span>\n</html>\n\nint *p; // 포인터 변수 선언\nint arr_size; // 배열의 크기를 입력받을 변수\n\ncin >> arr_size; // 배열의 크기를 입력받음\n\np = new int[arr_size]; // 입력받은 크기만큼 배열을 동적 생성\n\ndelete[] p; // 사용이 끝난 후 메모리 해제\n\n\n\n\n
출처 ; http://tip.daum.net/question/50774959\n참고 ; http://www.nahonza.kr/59\n\n''엘리어트파동이론 이란 ?''\n\n@@color(#ee1b24): 패턴(Pattern), 비율(Ratio), 시간(Time)@@의 세가지 요소를 포함하고 있다. 주가의 움직임은 @@color(#3058D2): 상승 5파와 하락 3파@@로 움직이면서 끝없이 순환한다는 이론으로 1939년 엘리어트가 발표한 이론이다. \n엘리어트는 주가는 연속적인 파동에 의해 상승하고 다시 하락함으로서 상승5파와 하락3파의 여덟 개 파동으로 구성된 하나의 사이클을 형성한다고 주장했다.\n\n큰 사이클인 주순환파(Primary Cycle)를 완성하기까지는 __보통 3년 정도가 소요__된다. 상승5파의 1번, 3번, 5번은 상승파동으로 주파동 또는 충격파동(Impulse Wave)으로 불리고 2번, 4번은 하락파동으로 조정파동(Corrective Wave)이다. 1번에서 5번까지의 상승 국면이 끝나면 하락3파에서 하락 국면이 시작된다.\n\n특히, 엘리어트파동이론에서는 피보나치 수열을 이용해 조정의 폭과 목표가격을 예측하는데 필요한 비율분석, 시간은 패턴이나 비율보다 중요성이 떨어지지만 패턴분석과 비율분석의 정확성 입증에 사용된다.\n\n엘리어트 파동이론은 상승/하락장 모두 적용이 가능하다.\n...\n\n예. 상승 국면 ; A(62), B(60), C(85), D(75) 일 때, 상승 예측치 = ?\n (C-B) X 0.618(황금비율) + D = E\n (85-60) X 0.681 + 75 = 90.45\n\n@@color(#ee1b24): 상승5파 @@\n@@color(#ee1b24): 1파 @@ : 추세의 시작을 알리는 파동\n@@color(#ee1b24): 2파 @@ : 1파의 급작스런 상승에 대한 되돌림의 파동 통상 1파 크기의 38.2% 내지는 61.8%의 조정을 보이는 경우가 많으며 100%의 조정은 절대로 있을 수 없다\n@@color(#ee1b24): 3파 @@ : 가장 강력한 본격상승국면을 보여주는 파동으로서 1파 크기의 1.618배로 상승하는 것이 일반적이며 상승파동인 1파나 5파보다 절대로 작을 수 없다\n@@color(#ee1b24): 4파 @@ : 상승 3파에 대한 조정파동으로서 3번파동의 소파동과 일치하는 경우가 많으며 통상 38.2%의 조정이 많다.\n@@color(#ee1b24): 5파 @@ : 상승장세의 마무리파동으로, 3파의 고점을 뚫지 못하고 하락하는 미달형이 많은 것이 특징이다. \n\n@@color(#3058D2): 하락3파 @@\n@@color(#3058D2): a파 @@ : 대단히 빠른속도의 하락\n@@color(#3058D2): b파 @@ : 갑작스런 하락추세의 시작에 따른 반발매수세의 등장으로 a파 크기의 38.2% 내지는 61.8%의 상승조정이 일반적이다.\n@@color(#3058D2): c파 @@ : 강력한 본격하락국면이 시작되며 a파 크기의 1.618배로 하락하는 경우가 많다.\n\n[img[../wiki/pds/GalleryMacro/201604_ElliottWave.jpg]]\n* 시작 ; 713\n** 1파 ; ''상승폭 751'' = 1,464 - 713\n* 상승점 ; 1,464 (∵ 기준)\n** 2파 ; 1번 파동폭의 38.2%, 751 x 38.2% = - 287 \n** 2파 ; 1번 파동폭의 61.8% 비율로 하락, 751 x 61.8% = - 464\n** 2번 파동이 1번의 출발점인 713 이하로 내려가면 엘리어드파동 성립 안됨\n* 하락점 ; 1,177 = 1,464 - 287 (또는 1,000 = 1,464 - 464)\n** 3파 ; 1번 파동폭의 1.618배 상승, 751 x 1.618 = 1,215\n** 가장 긴 파동으로 주가 상승이 제일 큰 구간으로 3번 파동 초기에 매수가 가장 수익내기 좋다.\n* 상승점 ; 2,392 = 1,177 + 1,215\n** 4파 ; 3번 파동폭의 38.2% 하락 예상, 1,215 x 38.2% = - 464\n** 이론상 1번 파동의 고점 이하로 하락해서는 안되며 <br> 2번 파동 끝인 1,177 이하로 하락할 경우 엘리어드파동 성립 안됨 \n* 하락점 ; 1,928 = 2,392 - 464\n** 5파 ; 3번 파동폭의 61.8% 상승, 1,215 x 61.8% = 750\n** 5파 ; 1번 파동의 상승폭 만큼 상승, 1,928 + 751 = 2,679\n** 5번 파동 마무리 시점에 매도 과점을 갖는 것이 좋다.\n* __상승점(최고점) ; 2,678 = 1,928 + 750 __\n** 상승 추세에서 이제 하락추세로 전환되는 구간으로 <br> 1 ~ 5번 파동 내의 작은 파동을 파악함으로써 a 파동의 진위를 확인하다.\n* 하락점\n** a 파동의 38.2% 또는 61.8% 만큼 상승 예상\n* 상승점\n** a 파동폭과 비슷하게 하락한다.\n* 하락점\n\n''파동이론에서 매매에 활용할 수 있는 응용기법''\n\n1. 파보니치 아크 ; 주가의 저점에서 고점, 고검에서 저점을 연결한 선\n 그 선을 기준으로 그림과 같은 38.2%, 50.0%, 61.8%에 해당하는 점을 찍는다.\n\n2. 파보나치 팬 ; 저점과 고점 또는 고점과 저점을 연결한 직선 만든다 . 그리고 선의 시작점과 종료점을 이용한 직각삼각형을 그린다.\n 직각삼각형의 세로변을 38.2%, 50.0%, 61.8%에 해당하는 지점에 점을 찍은뒤 그 점과 시작점을 연결한 직선을 그어 만들게 되는 추세선이 피보나치 팬이다.\n\n3. 파보나치 회귀\n 추세선으로의 사용보다 좀 더 쉽게 피보나치 목표가격을 계산하기 위한 도구로서 더욱 많이 사용하고 있다. 역시 저점과 고점 또는 고점과 저점을 연결한 선을 그은 뒤 이번엔 선의 위/아래 폭을 기준으로 38.2%, 50%, 61.8%에 해당하는 점의 수평선을 그어 만든다. 이렇게 하면 상승폭(또는 하락폭) 대비 38.2%, 50%, 61.8%에 해당하는 조정폭이 얼마나 되는지를 그래프 상에서 쉽게 파악할 수 있기 때문에 편리하다. \n\n\n
<html> <a name="Page200117_01"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<span style="font-size: 14px;"> #. 주식의 안전마진 </span> </div> </html>\n▣ 인용 ; 벤자민 그레이엄의 현명한 투자자 : 정말 읽기 쉬운 핵심 요약판 \n\n@@color(#C89342): ''추천 서문''@@\n(p.009) 주식의 안전마진은 '기업의 수익력이 채권수익률을 훨씬 초과할 때' 확보된다. 예를 들어 한 @@color(#3058D2): 기업의 이익수익률 @@''<EPS(주당순이익)/주가>''이 9%이고 채권수익률이 4%라고 가정하자. 이 주식은 수익률 면에서 채권보다 연 5% 포인트 유리하다. 이 회사는 초과 수익률 일부를 투자자에게 지급하고, 나머지는 재투자해서 기업의 가치를 높일 것이다.\n 10년 뒤에는 초과 수익률 합계가 주식 매입원가의 50%에 이를 것이다. 바로 이것이 안전마진이 되어 손실을 막거나 줄여줄 것이다. 이런 종목 20개 이상에 분산투자하면, 특별히 나쁜 상황만 아니라면 십중팔구 좋은 실적이 나올 것이다. 그래서 대표주에 투자하면 대단한 통찰이나 선견지면 없이도 성과를 얻을 수 있다.\n\n(p.010) 시장의 채권수익률보다 높은 수익률을 가진 기업에 부산 투자하며, 또한 주식에 올-인하는 것이 아니라 채권에 분산하여 투자하는 것. 이것이야말로 그레이엄이 《현명한 투자자》에서 진실로 말하고 싶었던 핵심이라는 생각이 든다.\n- 홍춘욱 -\n\n@@color(#C89342): ''주식투자의 원칙''@@\n1. 10~30 종목으로 적절하게 분산투자하라.\n2. 재무 구조가 건전한 대형 우량주를 선택하라.\n3. 20년 이상 배당을 계속 지급한 기업을 선택하라.\n4. 7년 평균 PER(주가수익배수)이 25 미만이고 12개월 PER은 20 미만인 기업을 선택하라.\n 이런 기준을 적용하면 인기 성장주들은 제외될지도 모른다.\n\n@@color(#C89342): ''포트폴리오의 시가평가액 변동''@@\n(p.084) 함부로 매매해서는 안 된다. 인간의 본성은 취약하므로, 충동에 휘말려 매매하지 않도록 유의해야 한다. __주가가 상승하면 고평가된 주식 일부를 매도해서 채권 비중을 높이고, 주가가 하락하면 채권 일부를 매도해서 주식 비중을 높이는 방식이 좋다.__\n\n@@color(#C89342): ''기업의 가치와 시가총액''@@\n(p.085) 시가총액이 순자산가치보다 3분의 1 이상 높은 주식, 즉 ''PBR이 1.33 이상인 주식은 매수하지 않는 편이 좋다.'' 그렇다고 해서 시가총액이 순자산가치와 비슷한 주식은 반드시 유망하다는 뜻은 아니다. PBR이 만족스러우면서, 재무 구조가 건전하고, 장기 수익성 전망도 밝은지 확인해야 한다. 이런 주식은 시가총액에 '투기 프리미엄' 비중이 크지 않으므로 주가 변동도 상대적으로 크지 않을 것이다.\n\n(p.089) @@color(#3058D2): 단기간에 돈을 벌려는 투기꾼은 시점선택 timing에 매달리지만, 기회를 기다릴 수 있는 투자자는 가격선택 pricing을 한다. @@\n일반 대중이 시장을 예측해서 돈을 벌 수 있다고 생각한다면 터무니없는 착각에 불과하다.\n\nhttp://freesis.kofia.or.kr/ - 금융투자협회, 채권수익률 공시\n| 기업 | 2015.12.EPS | 2016.04.26.주가 | 이익수익률 | PER | PBR | 3년 회사채 |\n| 사조산업 | 3,821 | 59,400 | 6.43| 15.31| 0.93| 1.924 |\n| 우리은행 | 1,566 | 10,650 | 14.70| 5.43| 0.39|~|\n| 현대산업 | 2,876 | 46,150 | 6.23| 16.05| 1.52|~|\n\n\n<html> <a name="Page200117_01"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<span style="font-size: 14px;"> #. Note </span> </div> </html>\n\n<html> <SPAN style="color:#C7254E; background-color:#F9F2F4; FONT-SIZE: 11pt" > #. PER & EPS증가율 매트릭스 차트 </SPAN></html>\n\n출처 ; http://m.itooza.com/view.php?ud=2011062312064703260\n\n'' @@color(#3058D2): PER @@ (Price Earning Ratio ; 주가수익비율) = 주가 / 1주당 당기순이익 = 주가 / 주당순이익(EPS) = 시가총액 / 순이익''\n ; 회사의 주식 가치가 고평가됐는지 저평가됐는지를 나타내는 지표\n\n● @@color(#3058D2): 보통은 10을 기준으로 이보다 낮으면 저평가로 매수를 하라고 하고 10이 넘으면 고평가로 매도를 하라고 한다.@@\n 주의 ; PER 값을 산출할 때 쓰이는 주당순이익이 전년도 순이익을 기준으로 계산된다.(기준 시점에 주의)\n\n● 데이비드 드레먼은 역발상 투자이론을 통해 PER이 높다는 것이 계속적으로 매래가치가 높은 업체라고 보기도 한다.\n\n● PER이 유지된다면, 분모인 주가와 분자인 EPS는 함께 움직입니다. 즉 EPS가 증가하면 주가도 그만큼 오릅니다. 아래 표는 PER이 10인 기업의 EPS가 20% 증가했을 때 주가 역시 20% 상승함을 보여준다.\n따라서 PER이 낮고 EPS증가율이 높은 기업이라면, 주가가 상승할 가능성도 그만큼 크다고 할 수 있습니다. 이를 알기 쉽게 나타낸 것이 바로 PER & EPS증가율 매트릭스 차트이다.\n\n 1. PER이 비슷한 기업 가운데 EPS증가율이 높은 기업 찾아라\n 2. EPS증가율이 비슷한 기업 가운데 PER이 낮은 기업을 찾아라\n\n\n'' @@color(#ee1b24): ROE @@ (Return On Equity ; 자기자본이익률) = 당기순이익 / 자본총액''\n ; 기업이 자본을 이용하여 얼마만큼의 이익을 냈는지를 나타내는 지표\n\n● 주의 ; 자기자본이 거의 없는 기업이 과도하게 빚을 내어 투자한다면, 약간의 수익이 발생하더라도 ROE가 높게 왜곡되어 나타날 수 있기 때문이다.\n\n\n<html> <SPAN style="color:#C7254E; background-color:#F9F2F4; FONT-SIZE: 11pt" > #. 골든크로스 </SPAN></html>\n골든크로스라는 것은 단기주가이동평균선(5, 20일선)이 중장기주가이동평균선(60, 120일선)을 치고서 올라는 형태를 말하며 주가가 상승을 한다는 시그널로써 일반적으로 매수의 시점으로써 인식된다.\n그와 반대로 단기주가이동평균선이 중, 장기 주가이동평균선을 치고서 내려가는것을 바로 데드크로스라고 하며 주가의 하락과 매도의 시점의 시그널로써 받아들진다.
참고 사이트\n-. http://j3nasis.tistory.com/entry/버퍼오버플로우-취약-함수별-대책 - 버퍼오버플로우 취약 함수별 대책\n-. http://blog.naver.com/PostView.nhn?blogId=nunteng1&logNo=120140277 - 110113 sprintf warning 제거\n\nVC++ 6.0으로 작성된 프로젝트를 VS2005 이상으로 변환해서 컴파일 하거나\nVS2005로 프로젝트 작성시 strcpy, sprintf, strcat 등의 C 런타임 함수를 사용하면 다음과 같은 warning 메시지를 출력된다.\n\nwarning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.\n\n+++[ warning 메시지 제거 ]\n{{{\n#pragma warning(disable:4996) // 설정하거나 \n#define _CRT_SECURE_NO_DEPRECATE // 설정\n}}}\n헤더파일을 인크루드하기 전에, 정의를 하는 전처리기 방식으로 선언\n===\n\n\n++++[ strcpy_s 등의 _s 류의 문자열처리 함수로 대체 ]\nstrcpy, sprintf, strcat 등의 C 런타임 함수는 입력 값의 길이나 버퍼의 크기(문자 개수)를 설정할 수 없어 보안에 취약한 경우가 많다.\n⇒ strcpy_s, sprintf_s, strcat_s 등 (C11 표준 라이브러리 함수)\n* ''char *strcpy(char *dest, const char *src);''\n* ''char *strcpy_s(char *dest, size_t count, const char *src);''\n** 받을 문자열(dest)에 복사할 문자열(src)을 최대 길이(count) 만큼 복사한다. <br> 만약 최대 길이가 복사할 문자열보다 작다면 에러가 발생한다.\n\n* ''int sprintf_s(char *buffer, size_t sizeOfBuffer, const char *format, ... );''\n** 파라미터\n*** buffer 출력을 위한 저장소 위치\n*** sizeOfBuffer 저장할 최대 문자 수 ; 만약 문자열이 설정한 버퍼 사이즈를 넘어버렸을 경우를 미리 방지할 수 있다. 만약 설정한 버퍼를 넘어버렸다면 버퍼를 전부 NULL로 설정하고 에러를 리턴한다. <br> cf. sizeof가 어떤 구조체나, 배열의 전체 사이즈의 byte를 구해준다면, _countof 는 배열의 개수를 구하는 매크로 이다 (_countof는 비주얼스튜디오에서만 사용이 가능하다).\n*** format 형식 컨트롤 문자열\n*** ... 서식을 지정할 선택적 인수\n** 반환 값\n*** 기록된 문자 수이며, 오류가 발생할 경우는 -1입니다.\n참고 ; https://msdn.microsoft.com/ko-kr/library/ce3zzk1k.aspx\n''sprintf_s'' 함수는 일련의 문자 및 값의 서식을 지정하고 buffer에 저장합니다. <br> 각 argument(있는 경우)가 format의 해당 형식 사양에 따라 변환되어 출력됩니다. 형식은 일반 문자로 구성되어 있으며, printf를 위한 format 인수와 동일한 형태와 기능을 가지고 있습니다. 기록된 마지막 문자 뒤에 null 문자가 추가됩니다. 중복되는 문자열 간에 복사가 이뤄지면 이 동작은 정의되지 않습니다.\n\n''sprintf_s''와 ''sprintf''의 주요 차이점은 ''sprintf_s''는 유효한 서식 문자에 대한 서식 문자열을 검사하고, ''sprintf''는 서식 문자열 또는 버퍼가 ''NULL'' 포인터인지 여부만 검사한다는 점입니다. 검사에 실패할 경우 매개 변수 유효성 검사에 설명된 대로 잘못된 매개 변수 처리기가 호출됩니다. 계속해서 실행하도록 허용한 경우 함수는 -1을 반환하고 ''errno''를 ''EINVAL''로 설정합니다.\n\n''sprintf_s''와 ''sprintf''의 다른 주요 차이점은 ''sprintf_s''는 출력 버퍼의 크기(문자 수)를 지정하는 길이 매개 변수를 사용한다는 점입니다. 종료 null을 포함하여 서식 있는 텍스트에 대해 버퍼가 너무 작은 경우 buffer[0]에 null 문자를 배치하여 버퍼를 빈 문자열로 설정하면 잘못된 매개 변수 처리기가 호출됩니다. ''_snprintf''와 달리 ''sprintf_s''는 버퍼 크기가 0이 아닌 한 버퍼를 null로 종료합니다.\n\n''swprintf_s''는 ''sprintf_s''의 와이드 문자 버전이며, ''swprintf_s''에 대한 포인터 인수는 와이드 문자 문자열입니다. ''swprintf_s''에서 인코딩 오류의 탐지 방식은 ''sprintf_s''와 다를 수 있습니다._l 접미사가 있는 이러한 함수 버전은 현재 스레드 로캘 대신 전달된 로캘 매개 변수를 사용하는 경우를 제외하고는 동일합니다.\n\n|!루틴 |!필수 헤더 |\n|''sprintf_s'', ''_sprintf_s_l'' |C: <stdio.h> <br> C++: <cstdio> 또는 <stdio.h> |\n|''swprintf_s'', ''_swprintf_s_l'' |C: <stdio.h> 또는 <wchar.h> <br> C++: <cstdio>, <cwchar>, <stdio.h> 또는 <wchar.h> |\n\nchar s1[20];\nsprintf_s(s1, _countof(s1), "%s", "Hello, world!");\n\nstatic TCHAR buffer[16];\n_stprintf_s(buffer, sizeof(buffer)/sizeof(TCHAR), _T("[%d]"), index);\n===\n\n\n+++[ 경계값 체크하는 안전한 함수를 사용 ]\n1. strcpy(), strcat(), sprintf(), vsprintf(), gets()와 같은 함수는 경계 값 체크를 하지 않으므로\n⇒ strncpy(), strncat(), snprintf(), fget()와 같은 함수로 대체\n2. scanf 계열의 함수들은 위험하므로 최대한 입력받을 수 있는 스트링의 길이를 제한\n3. realpath()나 getopt()과 같은 함수도 최소한의 PATH_MAX 바이트 길이를 정해주는 getwd() 함수를 사용\n\n!!! strcpy() 함수의 대체\nstrcpy() 함수는 버퍼의 크기를 평가하지 않아 문제가 발생하므로 복사할 데이터의 크기를 미리 검사하는 strncpy() 함수를 대신 사용할 수 있다.\n\n<취약한 프로그래밍 예> \n{{{\nvoid func( char * str ) {\nchar buffer[ 256 ];\nstrcpy( buffer, str );\nreturn; } \n}}}\n<안전한 프로그래밍 예>\n{{{\nvoid func( char * str) {\nchar buffer[ 256 ];\nstrncpy( buffer, str, sizeof(buffer)-1 );\nbuffer[ sizeof(buffer) - 1 ] = 0;\nreturn; }\n}}}\nstrcpy는 str의 널 문자를 자동으로 복사하지만 strncpy는 파라미터 n개만 복사하고 널을 붙이지 않는다.\nstr의 길이가 n보다 짧다면 buffer에 갖다 붙인 str 뒤로 인덱스 n-1까지는 널로 채우고,\n버퍼의 길이가 짧을 경우, 버퍼의 길이 -1개의 문자를 복사하고 '\s0'을 써준다. 즉, 어떤 경우에도 '\s0'으로 끝나는 올바른 문자열을 만들어 준다.\n\n!!! strcat() 함수의 대체\n<취약한 프로그래밍 예>\n{{{\nvoid func( char * str ) {\nchar buffer[ 256 ];\nstrcat( buffer, str );\nretrun; }\n}}}\n<안전한 프로그래밍 예>\n{{{\nvoid func( char * str ) {\nchar buffer[ 256 ];\nstrncat( buffer, str, sizeof( buffer) -1 );\nretrun; }\n}}}\n명시한 길이만큼 원래의 스트링에 덧붙인다.\n\n!!! sprintf() 함수의 대체\n이 함수는 데이터의 길이가 버퍼보다 더 크면 버퍼에 어떤 것도 기록하지 않고, snprintf() 함수의 return 값으로 버퍼에 쓰여진 값을 확인할 수 있다.\n\n<취약한 프로그래밍 예>\n{{{\nvoid func( char * str ) {\nchar buffer[ 256 ];\nsprintf( buffer, "%s", str );\nretrun; }\n}}}\n<안전한 프로그래밍 예>\n{{{\nvoid func( char * str ) {\nchar buffer[ 256 ];\nif ( snprintf( buffer, sizof( buffer )-1, "%s", str ) > sizeof( burrer ) -1 )\n/*....*/\nretrun; }\n}}}\n버퍼에 기록한 문자의 수를 리턴하는 것이 아니라 버퍼에 기록할 문자의 수를 계산하여 리턴한다.\n===\n\n
!! Cocos2d-x 3 모바일 게임 프로그램\n2014.05. 이자건 지음, 에이콘출판주식회사, ISBN 978-89-6077-565-7\n\n코코스2d는 원래 파이썬용으로 제작된 프레임워크입니다. 하지만, 2008년에 리카르도 케사다 Ricardo Quesada가 아이폰 버전으로 포팅한 것이 지금의 코코스2d-x의 모체가 되었습니다. 그리고 2011년 초에 코코스2d 아이폰 버전 개발팀이 미국의 소셜게임 회사인 징가 Zynga에 인수되면서 코코스2d 아이폰 버전은 징가에서 개발 및 배포, 관리를 하고 있습니다.\n\n코코스2d-x는 2010년 7월에 코코스2d 아이폰 버전을 중국의 샤먼 Xiamen(하문)지역에 있는 Team-X팀에서 포팅을 하면서 처음으로 제작되었습니다. 현재는 중국의 모바일 게임 회사인 추콩 테크놀로지에서 개발 및 배포, 관리를 하고 있습니다. 코코스2d-x에 대한 자세한 정보는 코코스2d-x 공식 홈페이지(http://cocos2d-x.org)에서 얻을 수 있습니다.\n\n\n!!! (p.033) ''코코스2d-x와 유니티 비교''\n| ! | !코코스2d-x | !유니티 |\n|개발 언어 |C++, 자바스크립트, 루아 |C#, 자바스크립트, Boo |\n|지원 플랫폼 |iSO, 안드로이드 등 대부분에 모바일 플랫폼 및 PC 플랫폼 |모바일 플랫폼과 PC 플랫폼 외에 콘솔(Xbox, PS) 플랫폼도 지원 |\n|가격 |무료 |프로버전 165만원, iSO, 안드로이드 플러그인 프로버전 각 165만원 |\n|2D 기능 |제공 |4.3버전부터 스프라이트 등 일부 기능 제공 |\n|3D 기능 |일부 기능 제공 |제공 |\n|GUI |대부분의 GUI 기능 제공 |일부분 제공, 대부분 유료 플로그인으로 구현 |\n|모바일 플랫폼 빌드 |조금 어려움 |쉬움 |\n|에디터 지원 |코코스튜디오 등 일부 지원 |완벽 지원 |\n|접근성 |낮음, 개발 언어에 대한 이해도가 없으면 사용하기 어려움 |높음, 개발 언어에 이해도가 낮아도 사용하기 쉬움 |\n\n-. http://cocos2d-x.org ; 코코스2d-x 공식 홈페이지\n Cocos2d-JS ; 웹용 프로그램 및 게임을 만들 때 사용되는 코코스2d의 버전\n CocoStudio ; GUI 및 애니메이션 에디터 등이 있는 에디터 툴\n-. http://www.python.org ; 코코스2d-x의 경우 파이썬 3.4.x 버전보다는 2.7.x 버전을 다운로드하는 것을 권장\n\n\n!!! 좌표계 ; OpenGL 3D 그래픽 API 기반 ( 좌하(0,0) ⇒ 우상(99,99) )\n-. 앵커포인트 ; 화면에 이미지나 텍스트와 같은 객체를 출력할 때 기준값 (정렬방식 (0,0) ⇒ (1,1) )\n / x 값이 0 이면 x축 정렬 기준은 객체의 왼쪽 끝, 1 이면 오른쪽 끝 \n / y 값이 0 이면 y축 정렬 기준은 객체의 가장 아래, 1 이면 가장 위\n / 스프라이트 애커포인트의 기본값은 (0.5, 0.5)\n\n-. Sprite 객체\n / 이미지를 화면에 출력하는 객체, 이미지의 위치, 색상, 투명도 등을 포함한 객체\n \n-. Label 객체\n / 텍스트를 화면에 출력하는 객체\n\n-. 폰트\n / BMFont ; 비트맵 이미지로 만든 .png 파일과 폰트의 정보를 저장한 .fnt 파일을 가지고 글자를 출력\n / CharMap ; BMFont와 비슷하지만 BMFont처럼 폰트의 정보 파일(.fnt)을 사용하지 않고 사용자가 파일의 정보를 직접 저장\n 글자의 순서는 ASCII Code 순서로 제작하며, 각 글자의 너비와 높이도 모두 동일\n 게임에서 숫자를 표시하는 겨우에 많이 사용\n / SystemFont, TTF와 BMFont의 기본 앵커포인트의 값은 (0.5. 0.5)이지만\n CharMap의 기본 앵커포인트의 값은 (0,0) 이기 때문에 가운데 출력을 위해서는 따로 앵커포인트를 지정해야 한다.\n\n\n!!! 액션\n-. ''기본 액션'' ; 함수명 By와 To\n / By로 끝나는 액션 ; 변경하는 값이 현재 값을 기준으로 상대적인 값으로 변경\n / To로 끝나는 액션 ; 변경하는 값이 현재 값과는 상관없이 입력한 절대값으로 변경\n|! 분류 |! 종류 |\n|위치 |MoveBy, MoveTo, JumpBy, JumpTo, BezierBy, BezierTo, Place |\n|크기 |ScaleBy, ScaleTo |\n|회전 |RotateBy, RotateTo |\n|화면 출력 |Show, Hide, Blink, ToggleVisibility |\n|투명도 |FadeIn, FadeOut, FaceTo |\n|색상 |TintBy, TintTo |\n / 만들어진 액션은 ''runAction()'' 메소드를 통해 실행 <br> 메소드를 호출하면, 호출한 해당 객체에 지정된 액션이 바로 실행되며, 따로 설정하지 않아도 지정된 시간 동안 액션이 실행\n\n-. ''응용 액션'' ; 마지막에는 더 이상 입력하는 액션이 없다는 것을 알려주기 위해서 꼭 NULL값을 입력\n* Sequence 액션 ; 2개 이상의 액션을 순차적으로 실행\n* Spawn 액션 ; 동시에 2개 이상의 액션을 실행\n* reverse 액션 ; 실행했던 액션을 반대로 실행 (반대로 실행할 수 있는 액션만 가능)\n* DelayTime 액션 ; 지정된 시간 동안 어떤 동작도 하지 않고 기다리는 액션\n* Repeat 액션 ; 지정된 액션을 지정된 횟수만큼 반복\n* RepeatForever 액션 ; 무한 반복\n* Ease 액션 ; 액션을 실행할 때 동일한 속도가 아닌 특정한 가속도를 주어서 실행\n** EaseIn, EaseOut, EaseInOut \n** EaseSineIn, EaseSineOut, EaseSineInOut \n** EaseElasticIn, EaseElasticOut, EaseElasticInOut \n** EaseBackIn, EaseBackOut, EaseBackInOut\n* Call Function 액션 ; 메소드를 호출, 보통 조합 액션에서 사용\n** CallFunc 액션 ; 매개변수가 없는 콜 펑션\n** CallFuncN 액션 ; 매개변수로 액션을 실행한 객체 등을 받는 콜 펑션\n\n
!! 개발\n* 프로그램\n** https://code.i-harness.com/ko-kr/q/1381a - CODE Q&A\n** http://sdr1982.tistory.com/32 - (TCP/IP 소켓 프로그래밍) 20. 동기와 비동기의 이해\n* C++\n** 폰트\n*** http://blog.naver.com/PostView.nhn?blogId=dolicom&logNo=10071034119\n; ; MFC 더블버퍼링 그림 그리기 - 깜박임 제거 바탕화면 그리기 - 메모리 버퍼 이용\n*** https://m.blog.naver.com/pusna25/100187016232 - 2013.04.\n*** https://jangjy.tistory.com/60 - IplImage 에 한글text 삽입하기\n*** 김성엽의 Windows 프로그래밍 이야기 (비트맵 생성하기)\n*** http://dolphin.ivyro.net/file/directx_tip/CreateDiBSection한글처리.html - CreateDIBSection를 이용한 한글 처리 루틴\n* Direct3D (DirectX 9.0)\n** http://ube43.wix.com/directxers#!directx-9 - DirectXers (예. DirectX 9 - Tutorial 2 Shader)\n** http://www.dimmension3.spine.pl/modules.php?name=Tutorials&wtd=show_tutorial&nr=70 \n; ; GRAFiKA 3D / Tutoriale - Direct3D - Dot3 env. (cf. texm3x3vspec - ps.1.1.)\n** http://3dapi.com/blc/ - @@color(#ee1b24): Lectures on Game Programming @@\n** http://telnet.or.kr/directx/graphics/reference/reference.htm - Direct3D C/C++ 레퍼런스\n* Direct3D (DirectX 8.1)\n** http://www.codeproject.com/KB/directx/dx8template/dx8template.zip - CD3DApplication 구성 샘플\n* Shader\n** http://www.bencloward.com/portfolio.shtml - BEN CLOWARD 홈페이지(Character Animator...I am a technical artist.)\n** https://docs.microsoft.com/ko-kr/windows/desktop/direct3dhlsl/texm3x3spec---ps - texm3x3spec - ps (Windows)\n*** Reference for HLSL > Asm Shader Reference >> Pixel Shaders >>> Pixel Shader Instructions\n** http://3dapi.com/dv16_shader3/ - Lectures on Game Programming (Shader 학습)\n** http://archive.gamedev.net/archive/columns/hardcore/dxshader4/default.html - Shader Programming by Wolfgang Engel\n** http://www.bitmanagement.de/developer/index.html - Extensions > Hardware Shader\n** http://www.bencloward.com/resources.shtml - HLSL Shader\n* C#\n** https://vesselsdiary.tistory.com/109 - Winform WebBrowser 내부에 Document 컨트롤하기\n** https://codingcoding.tistory.com/256 - C# HTML, 웹브라우저 제어 예제, WebBrowser 컨트롤 소스\n* 참고\n** http://3doc.i3dconverter.com/index.html - 3D Object Converter\n*** AIKA에서 사용하고 있는 *.msh 파일을 확인할 수 있음(Data Load만 가능). \n*** *.msh ; GiD ASCII MESH, Gmsh ASCII MESH 포맷으로 로딩\n** http://www.copypastecharacter.com/ - 특수문자 모음 사이트\n** http://www.buupjungbonara.com/bizservice/bookcon/ - 비즈폼 도서콘텐츠\n** https://minimonk.net/195 - WinMerge 엑셀 미리 보기 플러그인 - binary file preview plugin(구차니의 잡동사니 모음)\n\n!! for 3DS MAX\n@@color(#04f): ▣ 3Ds Max - Allegorithmic Substance 텍스처 @@ @ 2015-10-16 @\n\n3Ds Max 2011부터 지원하고 있으며 설치 후 Substance에서 제공하는 각종 라이브러리를 사용할 수 있다.\n설치때 Allegorithmic Substance 옵션을 지정하면 기본 제공되는 텍스처 라이브러리를 무료로 사용할 수 있다.\n\n3Ds Max 설치시 '''Install Tools & Utilities'''에서 Allegorithmic Substance 관련 항목을 체크 설치한다.\n\n!!! SHADERFX\nhttp://www.bencloward.com/resources.shtml - Technical Artist\n\nShaderFX is a plugin for 3ds Max that I co-authored. It lets artists create real-time HLSL FX shaders for use in the 3ds Max viewport and also for external game engines such as XNA, Quest 3D, Virtools, Ogre, etc. The node-based interface is simple and easy to use. Artists with no shader programming experience can create complex shaders in just a few minutes. Check it out!\nShaderFX is currently at version 4.1\n\n@@color(#ee1b24): Nvidia's Cg plugin doesn't work in Max 8@@, but the good thing is, it doesn't need to. Max has supported HLSL shaders natively since version 6. I posted a set of HLSL shaders on my site that you're welcome to use. Grab them here:\n\nhttp://www.bencloward.com/resources_shaders.shtml \n\n\n!! for UNITY\n@@color(#04f): ▣ Adventure Creator @@ @ 2015-11-03 @ (from 동선)\n__www.adventurecreator.org__ - cinematic scene 구성에 활용 (facial animation 가능)\n* 파티클 효과 생성\n** Particle Designer ; 맥 PC에서 사용할 수 있는 파티클을 만드는 툴 <br> https://71squared.com/particledesigner\n** Particle2dx ; 웹에서 쉽게 파티클을 제작할 수 있는 페이지 (인터넷 익스플로어에서는 실행되지 않음) <br> http://particle2dx.com/\n\n\n!! for Unreal Engine\n@@color(#04f): ▣ 언리얼 데이타는 cm를 기본으로 사용 @@ @ 2016-11-15 @\n / 일반 메쉬인 경우는 m, inch 단위에서 익스포트후 수정해도 문제가 발생하지 않음\n / Bone 적용 바디인 경우는 m, inch → cm 단위로 변환 후 익스포트해서 사용\n m, inch 단위에서 익스포트 하면 Bone 회전시 문제가 발생할 수 있음\n\n
<html> <span style="font-size: 14px;"> <b> 함수 포인터를 나타내는 형식을 선언 </b> </span> </html>\n참고 ; http://blog.naver.com/taksclub/80068771412\n\nC++에서 Delegate은 전역함수, 일반함수, 멤버함수, 함수자(functor)를 ''Delegate에 작업을 위임함으로서 일관된 관점을 통해 처리하도록 도와주는 인터페이스''라고 할 수 있다. 다르게 이야기하면 구현되는 함수나 객체들은 Delegate로 묶어버리면, 이를 관리하는 곳에서는 Delegate만 알면된다는 의미이다. C#에서도 Delegate라는게 언어 자체에서 지원하고 있다. 이를 활용하면 상당히 유연한 구성을 할 수 있게 된다.\n\n<html> <span style="font-size: 14px;"> <b> ▶ 함수 포인터(함수를 가르키는 포인터)의 대체 </b> </span> </html>\n{{{\n//ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ\n#include <stdio.h>\n\nint (*pMulti)(int a, int b);\n\nint Multi(int a, int b)\n{\n int c;\n c = a * b;\n return c;\n}\n\nvoid main()\n{\n pMulti = Mutli;\n printf("함수 포인터 호출 : %d",pMulti(3, 7));\n}\n}}}\nC#에선 포인터를 제한해 놓았기 때문에 위와같은 것의 사용은 불가능하다.\n그러나 그 대체 기법으로 델리게이트(대리자)를 제공해준다. 모양은 위와 크게 다른데. 기본적으로 하는일은 위와 크게 다르지 않다.\n아래는 위 코드를 C#으로 바꾼것이다.\n{{{\n//ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ\nusing System;\n\ndelegate int delegateMulti (int a, int b); //델리게이트 선언\n\nclass App\n{\n static int Multi(int a, int b)\n {\n int c;\n c = a * b;\n } \n\n static void Main()\n {\n delegateMulti dMulti = new delegateMulti(Multi); //생성, 대입\n Console.Write Line("델리게이트 사용 : {0}", dMulti(3, 7));\n }\n}\n}}}\n-. 델리케이트의 구성 ; delegate 반환형 델리게이트이름 ( 파라미터들);\n 델리게이트는 클래스나 구조체와 같은 등급이므로 메서드 내에선 정의 할 순 없다.\n\n-. delegateMulti dMulti = new delegateMulti(Multi);\n 델리게이트의 생성자에 파라미터 하나를 꼭 넣게 되어있는데 그 부분에 대리 호출할 메서드의 이름을 적어주면 된다.\n\n-. 정의 형식\ndelegate @@color(#FF0000): int @@ delFunc( @@color(#0000FF): int @@ a, @@color(#0000FF): char @@ b);\n\n@@color(#FF0000): int @@ Func( @@color(#0000FF): int @@ a, @@color(#0000FF): char @@ c)\n{\n\n}\n@@color(#FF0000): 1. 델리게이트의 반환형과 메서드의 반환형(int) @@\n@@color(#0000FF): 2. 델리게이트의 파라미터가 int, char 이면 메서드의 파라미터도 int , char 이어야 함. @@\n{{{\n//〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓\n// C/C++의 함수 포인터\n//ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ\ntypedef void (*delFunc)();\n\nvoid Func()\n{\n ...\n}\n\nvoid main()\n{\n delFunc dFunc;\n dFunc = Func;\n dFunc();\n}\n\n//〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓\n// C#의 델리게이트\n//ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ\ndelegate void delFunc();\n\nclass App\n{\n static void Func()\n {\n ...\n }\n\n static void Main()\n {\n delFunc dFunc;\n dFunc = new delFunc(Func);\n dFunc();\n }\n}\n}}}\n\n<html> <span style="font-size: 14px;"> <b> ▶ 델리게이트와 이벤트 </b> </span> </html>\n{{{\n//ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ\nusing System;\n\ndelegate void EventDelegate(Object sender);\n\nclass EventClass\n{\n public event EventDelegate Event;\n\n public FireEvent()\n {\n if (Event != null)\n {\n Event(this);\n }\n }\n}\n\nclass App\n{\n public void EventFunc(Object sender)\n {\n Console.Write Line(sender.ToString() + "의 이벤트가 발생했습니다.");\n }\n\n public static void Main()\n {\n EventClass evtCls = new EventClass();\n evtCls.Event += new EventDelegate(EventFunc);\n evtCls.FireEvent();\n }\n}\n}}}\nEventFunc()를 실행하지도 않았는데.. 'XXX의 이벤트가 발생했습니다.' 라고 출력된다.\n\nEventFunc() 가 호출된 것은 Event에 의해 호출되었기 때문이다. 그럼 실행되는 과정을 알아보자.\n1. EVentClass를 바탕으로 evtCls객체가 생성됨.\n2. evtCls클래스의 Event란 이벤트가 EventDelegate란 델리게이트에 의해 EventFunc 메서드와 연결됨.\n3. evtCls내의 FireEvent() 메서드 호출\n여기까지는 App내의 Main메서드가 있는 클래스의 실행과정이다.\n그럼 이벤트가 있는 클래스는 어떨까.. FireEvent() 메서드를 보면 Event를 발생시키고 있는것이 보일것이다.\n\n그런데 잘 보면 이것이 널인지 아닌지를 검사하고 있다. 이는 델리게이트가 연결되지 않았을때의 이벤트 발생을 막기 위한 것이다. 이벤트는 자료형이 델리게이트이기 때문에.. 어떠한 델리게이트도 연결되지 않으면 NULL 값을 가진다.\n만약에 NULL값 처리가 미흡해 델리게이트가 연결되지 앟은 이벤트를 실행하게 되면 NULL값이나 형(자료형)에 관한 에러를 낼것이다.\n
긍정심리학(肯定心理學, positive psychology)은 \n개인과 사회를 번영시키는 강점과 장점을 연구하는 최근 주목받고있는 심리학의 한 분야이다. 단지 정신질환을 치료하는 것보다 일반적인 인생을 보다 충실히 하기 위한 연구가 이루어지고 있다. 즉, 긍정심리학은 능력 개발 상담의 한 분야이다.\n\n!!! 고통스러운 몰입도 행복을 가져온다\n'긍정 심리학의 창시자'라고 일컬어지는 ''마틴 셀리그먼'' Martin Seligman 교수의 행복 공식 'PERMA'\n{{wrappingClass{\n ①긍정적 정서(Positive emotion)=기쁨, 희열, 따뜻함, 자신감, 낙관성\n ②몰입(Engagement)=시간 가는 줄 모르는 것, 어떤 활동에 빠져든 동안 자각하지 못하는 것, 자발적으로 업무에 헌신하는 것\n ③관계(Relationship)=타인과 함께 하는 것, 말할 수 없이 기뻤던 순간, 자신의 성취에 엄청난 자긍심을 느꼈을 때를 생각해 보면 거의 타인과 함께 했을 때\n ④의미(Meaning)=자신보다 더 중요하다고 믿는 어떤 것에 소속되고 거기에 기여하는 것에 기초\n ⑤성취(Accomplishment)=남에게 이기기 위해서이거나 돈을 벌기 위해서가 아니라 성취 그 자체가 좋아서 추구하는 것\n}}}\n\nPERMA가 기존의 행복 이론과 다른 점은, 사람들이 특별한 이유 없이 '그 자체가 좋아서' 하는 행위들을 행복의 조건으로 포함한 데 있다. 셀리그먼 교수는 이를 춤출 때의 우아함에 비유한다. 우아함은 춤의 결과로 얻어지는 어떤 보상이 아니다. 우아함은 그 자체로 훌륭한 춤의 일부이다. 또 명상의 즐거움에 대해 말한다는 것은 명상하는 행위 그 자체를 말할 뿐, 명상에 수반되는 어떤 정서를 의미하는 게 아니다.\n\n긍정 심리학의 요체는 행복하려면 주변 환경이 안정적이고 자신을 위협하는 조건이 없어야 하지만 현실이 그렇지 않다면 적극적인 방법으로 심신을 만족스러운 상태로 바꾸려는 노력을 하고, 개인의 관심과 가치가 반영된 적절한 목표를 세우고, 생각을 밝게 하도록 훈련하는 것이다. 또한 매사를 긍정적으로 보면 사고의 폭이 넓어지고 부정적인 생각이 사라지며, 유머를 즐기면 사고가 긍정적으로 발전하고, 매사에 감사하는 훈련, 남의 훌륭한 면을 보거나 선행을 하는 ‘고양’ 과정을 경험하는 것, ‘몰입’을 통해 순수한 즐거움을 체득하는 것 등이다.\n\n마틴 셀리그만은 행복해지려면 행복에 대해 지금까지 가지고 있던 시각부터 바꾸라고 조언하며, ‘생각을 바꿔 행복해지는 십계명’으로 다음을 제시하였다.\n{{wrappingClass{\n ① 자신의 편견을 파악하라.\n ② 모든 잘못을 내 탓이라고 단정하지 말라.\n ③ 최악의 순간보다 최상의 순간을 상상하라.\n ④ 쉬운 해결책을 찾아라.\n ⑤ 성공했을 때의 모습을 상상하라. \n ⑥ 낙천주의자라면 어떻게 했을까 생각하라.\n ⑦ 좋았던 일의 목록을 만들어라. \n ⑧ 주위 사람들과 기쁨을 나눠라. \n ⑨ 즐길 수 있는 목표를 찾아라.\n ⑩ 자신이 할 수 있는 한계를 정하라. \n}}}\n
\n* http://blog.naver.com/ntscafe/221034285044 - 부동산 보유세, 주택 보유시 내는 세금은? (국세청 블로그)\n* http://www.hamanchoysj.pe.kr/9/menu5.htm - 염수재, 지방, 축문 쓰기\n* http://www.yonghwa.or.kr/bbs/skin/ggambo7002_board/print.php?id=b_story_4&no=124 - 광명진언이란?\n\n● 이본 쉬나드(Yvon Chouinard) ; 파타고니아(Patagonia) 창업자 - 글로벌 아웃도어 기업\n 최상의 제품을 만들고, 자연과 환경에 불필요한 해악을 끼치지 말 것이며, 비스니스를 통해 환경 위기에 대한 해결 방안을 제시하고 실천한다.\n\n+++[● 빌 게이츠 (Bill Gates) ; 마이크로소프트(Microsoft) 창업자 ]\n▷ 2019.08.Vol.443 / 글 강경태 한국CEO 연구소장\n<html> <SPAN style="FONT-SIZE: 11pt;"> <font color=RoyalBlue> <b> 기회를 포착하고 실력으로 승부하라 </b> </font> </SPAN> </html>\n\n''#.기회 포착이 경쟁력이다 ''\n...\n 빌 게이츠가 말하는 컴퓨터 산업에서 얻은 가장 소중한 교훈은 "소비자는 우수하고 다양한 응용 소프트웨어를 제공하는 컴퓨터에 더 높은 점수를 준다"는 사실이었다.\n\n''#.현명한 직원이 경쟁력이다 ''\n...\n 그는 고객 불만과 요구 사항을 제품과 서비스 개발에 반영하는데 유용한 접근법 3가지를 제시한다. 이 원칙을 철저히 따르면 나쁜 상황이 오히려 큰 기회가 될 수 있다고 말한다.\n첫째, 가장 불만이 많은 고객에게 초점을 맞추어라.\n둘째, 고객이 겪은 불편한 경험들을 수집하고, 그들이 원하는 개선 사항을 파악하라.\n셋째, 수집된 불만 사항을 담당자에게 신속하게 전달하여 개선케 하라.\n빌 케이츠는 최고의 자원은 '시간'이라고 말한다. 시간을 어떻게 사용하느냐가 중요하다고 강조한다.\n...\n "디지털 도구는 지구상에서 사고력, 협업 등 인간만이 가진 능력을 확대해 줍니다. 기업들이 문제를 해결하기 위해 직원들에게 힘을 부여하고, 그들을 위해 강력한 도구를 제공한다면, 놀라운 창의력과 독창성의 꽃이 활짝 피어날 것이라고 확신합니다."\n===\n\n+++[● 리드 헤이스팅스 (Phil Knight) ; 넷플릭스(Netflix) 창업자 ]\n▷ 2019.05.Vol.440 / 글 강경태 한국CEO 연구소장\n<html> <SPAN style="FONT-SIZE: 11pt;"> <font color=RoyalBlue> <b> 역발상으로 1등 기업이 되라 </b> </font> </SPAN> </html>\n넷플릭스(Netflix) = 넷(Net) + 영화(flicks)\n\n''#.역발상에 도전하라!''\n...\n''#.직원들을 자유케하라!''\n...\n 넷플릭스에서 공유되는 구절 중에는 '우리는 팀이며, 가족은 아니다'라는 문구가 있다. 헤이스팅스는 "회사란 자신의 성장을 위해 실력 있는 구성원이 모인 곳이며, 최고의 보상은 탁월한 동료"라고 말한다. 우수한 인재들에게는 보상을 아끼지 않지만, 성장에 해가 되는 직원의 해고는 빠르게 결정했다. 넷플릭스는 업계 평균보다 생산성이 40% 높다.\n...\n 헤이스팅스는 직원들에게 자유를 부여하면 스스로 훌륭한 판단을 하며 기업은 큰 성장을 이룬다고 말한다. "넷플릭스의 장점은 재능 있는 사람들을 뽑고, 그들에게 자유와 책임을 부여하는 것입니다. 그러면 직원들이 힘을 발휘해, 스스로를 제어하는 동시에, 창의적으로 일하는 것을 발견했습니다. 놀라운 일들을 해내는 것이죠."\n===\n\n+++[● 필 나이트 (Phil Knight) ; 나이키(Nike) 창업자 ]\n / 우리는 브랜드뿐 아니라 문화를 창조하고, 제품뿐 아니라 아이디어를 판다.('창조적 문화'를 강조)\n / 달리기는 고통스럽고 위험한 운동이다. 보상도 적고, 그마저 확실히 받는다는 보장이 없다. 목적지가 정해서 있는 것도 아니다. 스스로 달리는 행위에서 기쁨을 얻어야 하고, 자신을 석득할 수 있어야 한다. (사업은 달리기와 유사하다)\n / Just Do It.\n===\n\n+++[#. 이미지 = 대상 + 상태 + 가치 ]\n▷ 2018.06.13. 어쩌다 어른 139회 - 차별이 죽어야 산다 (사회학자 오찬호)\n / 3대 차별 ; 인종차별, 남여차별, 계층차별\n / 아기 돼지 삼형제 ; 성실한 섯째 돼지가 이상적 모델\n → 우리의 가치 판단은 사회적 영향이 큰 작용\n / 사회화가 되어 가면서, 대상에 대한 고정관념 발생\n → 절대적인 이미지가 아니라 환경에 의해서 만들어졌을 뿐이다.\n → 옳은 이미지로 기억할 수 있도록 잘못된 이미지를 바로 잡아야 한다 !\n / 결과가 평등한가?\n ; 인간의 존엄성을 보장받을 권리가 있다는 것 !\n===\n\n+++[#. 디테일은 일류와 이류의 차이를 만든다. (수준의 차이 결정) ]\n▷ 레이 브레드버리의 소설 <화씨 451>\n 세밀하게 이야기하라.\n 생생하게 이야기하라.\n 좋은 작가들은 진실한 삶의 이야기를 담지만,\n 그저 그런 작가들은 수박 겉핥기식으로 쓱 어루만지고 지나갈 뿐이다.\n===\n\n+++[#. 미래에 살아남을 업종 (by 인구학적 분석)]\n▷ 저출산의 원인과 해법 <조영태>\n-. ''어떤 연령대가 대상인가''\n / 대형마트의 황금기, 2000년대 초반 ; 4인가구\n ⇒ 1~2인 가구 증가 ; 노인 1인 가구 증가 (⇒ 동네 소매점 선호), 일본 다이소 급성장\n / 20~ 30대 스타벅스 등 기호 상품 ; 소비 습관을 유지하는 경향 ⇒ 40대에서도 소비\n===\n<br>\n<html> <SPAN style="FONT-SIZE: 11pt;"> <font color=RoyalBlue> <b> #. 나무 </b> </font> </SPAN> </html>\n\n|>| |>| 내 것이 아님 (비자기) |>| 나의 것 (자기) |\n|~|~| 해롭지 않음 (꽃가루) | 해로움 (병원체) | 정상 세포 | 비정상 세표 (암 세포) |\n| 면역 반응 | 있음 | @@bgcolor(#F8ECE0): 알레르기 @@ | 정상 (병원체 물리침) | @@bgcolor(#e2e2ff): 자가 면역 질환 @@ | 정상 (암 초기 진압) |\n|~| 없음 | 정상 | @@bgcolor(#E0F8E6): 면역 결핍 @@ | 정상 | @@bgcolor(#F8E0E6): 악성 종양 발생 @@ |\n \n\n* 책\n** 풍수화 / 저자 김용운 \n* 전통화\n** 중요무형문화재 제118호 불화장 임석환씨 ; 칠성탱화, 십장생도, 십장생도 8폭병풍, 백수백복도 등\n* 사경\n** 신송(神松) 겸당 오현주 사경장(寫經匠) - 조계종 영축총림 통도사 앞 사하촌, 통도사성보박문관 문화강좌 지도교수\n** https://blog.naver.com/eksrnswkths - 한국전통사경연구원 외길 김경호(국가무형문화재 제141호 사경장)\n\n\n
출처 ; rpkim.tistory.com/26\n\n''winnt.h'' 에서\ntypedef void * POINTER_64 PVOID64;\n이 부분에 에러가 날 때가 있다.\n\n위의 부분을 주석으로 해주고 아래와 같이 적는다.\n{{wrappingClass{ typedef void *POINTER_64; <br> typedef POINTER_64 PVOID64; }}}\n\n간혹, 반대로 에러가 날 때가 있으니, 지우지 말고 꼭 주석처리한다.\n\n\n<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 16px;"> <b> VS2005, typedef void * POINTER_64 PVOID64; 에러 </b> </span>\n</html>\n출처 ; http://blog.naver.com/PostView.nhn?blogId=psj5500&logNo=140117468122&parentCategoryNo=&categoryNo=28&viewDate=&isShowPopularPosts=false&from=section\n\n''문제 : '' (VS2005에서 나오는 문제)\nWinNt.h 에서\ntypedef void * POINTER_64 PVOID64; 을 컴파일할 때\n error C2146: 구문 오류: ';'이(가) 'PVOID_64' 식별자 앞에 없습니다.\n에러 발생.\n\n''원인 : ''\nPVOID_64 가 basestd.h에서 정의되지 못하는 문제.\n{{{\n#if !defined(_MAC) && (defined(_M_MRX000) || defined(_M_AMD64) || defined(_M_IA64)) && (_MSC_VER >= 1100) && !(defined(MIDL_PASS) || defined(RC_INVOKED))\n #define POINTER_64 __ptr64\n typedef unsigned __int64 POINTER_64_INT;\n\n #if defined(_WIN64)\n #define POINTER_32 __ptr32\n #else\n #define POINTER_32\n #endif\n\n#else\n\n #if defined(_MAC) && defined(_MAC_INT_64)\n #define POINTER_64 __ptr64\n typedef unsigned __int64 POINTER_64_INT;\n #else\n\n #if (_MSC_VER >= 1300) && !(defined(MIDL_PASS) || defined(RC_INVOKED))\n #define POINTER_64 __ptr64\n #else\n #define POINTER_64\n #endif\n\n typedef unsigned long POINTER_64_INT;\n #endif\n\n #define POINTER_32\n#endif\n}}}\n\n''해결책 : ''\n1.winnt.h를 수정하는 방법\n{{{\n#if (_MSC_VER >= 1300) && !(defined(MIDL_PASS) || defined(RC_INVOKED))\n#define POINTER_64 __ptr64\n#else\n#define POINTER_64\n#endif\n}}}\ntypedef void *PVOID;\ntypedef void * POINTER_64 PVOID64;\n\n2.stdafx.h에서 다른 파일을 include 하기 전에 define을 추가\n{{{\n#if (_MSC_VER >= 1300) && !(defined(MIDL_PASS) || defined(RC_INVOKED))\n#define POINTER_64 __ptr64\n#else\n#define POINTER_64\n#endif\n}}}\n#include ...\n\n\n
''* SAFESEH ( Structured Exception Handling )''\n- 윈도우 상에서 예외처리를 하는 기법\n- 메모리에 대한 손상이 발생하거나 시스템이 예기치 않게 종료되는 이벤트 발생시 프로그램에 대한 예외처리 담당\n- 외부 공격자가 프로그램에 대해 예외처리 레코드를 덮어쓰게 되면 이 예외를 탐지하여 프로그램을 종료시킴\n \n''*옵션 On/Off''\n프로젝트 속성 -> 링커 -> 고급 -> 이미지에 안전한 예외처리기 포함 ( 예/아니오 )\n혹은 명령줄 에서 /SAFESEH:NO 입력\n\n''해결법''\n프로젝트 속성->구성 속성->링커->명령줄\n{{{\n/safeseh:no\n}}}\n
{{{\nHRESULT D3DDevice::DisplayErrorMsg( HRESULT hr, DWORD dwType )\n{\n...\n\n // case HRESULT_FROM_WIN32( ERROR_FILE_NOT_FOUND ):\n case __HRESULT_FROM_WIN32( ERROR_FILE_NOT_FOUND ):\n _tcscpy( strMsg, _T("Could not load required media." ) );\n break;\n\n...\n return hr;\n\n}\n}}}\n''error C2051 : case 식이 상수가 아닙니다.//\n환경에서 HRESULT_FROM_WIN32가 인라인 함수로 정의되어 있기 때문에 이것을 매크로 로 바꿉다.\n\n참고, c:\sProgram Files (x86)\sWindows Kits\s8.1\sInclude\sshared\swinerror.h\n{{{\n//\n// HRESULT_FROM_WIN32(x) used to be a macro, however we now run it as an inline function\n// to prevent double evaluation of 'x'. If you still need the macro, you can use __HRESULT_FROM_WIN32(x)\n//\n#define __HRESULT_FROM_WIN32(x) ((HRESULT)(x) <= 0 ? ((HRESULT)(x)) : ((HRESULT) (((x) & 0x0000FFFF) | (FACILITY_WIN32 << 16) | 0x80000000)))\n}}}
''error LNK2019: _main 외부 기호(참조 위치: _tmainCRTStartup 함수)에서 확인하지 못했습니다.''\n{{{\nMSVCRTD.lib(crtexe.obj) : error LNK2019: _main 외부 기호\n(참조 위치: ___tmainCRTStartup 함수)에서 확인하지 못했습니다.\nC:\s경로~\sD3D_Normal.exe : fatal error LNK1120: 1개의 확인할 수 없는 외부참조입니다.\nD3D_Normal_2 - 오류: 2개, 경고: 0개\n========== 빌드: 성공 0, 실패 1, 최신 0, 생략 0 ==========\n}}}\n_tmainCRTStartup를 찾을 수 없다는 것은 CALLBACK함수인 main()을 찾지 못했다는 것이다.\n즉 main() 함수가 없을때 발생하는 에러.\n \n그런데 우린 main()함수가 있다? -> @@color(#FF0000): 프로젝트 설정문제다. @@\n\n메뉴에서 ''프로젝트 > 속성 > 구성 속성 > 링커 > 시스템 > 하위 시스템''에서 자신이 만들려는 프로젝트와 맞는 설정으로 바꿔준다. \n\n※ 비주얼 스튜디오로 프로젝트를 새로 작성할때 Win32에 두개의 템플릿을 선택할 수 있는데, 작성하고자 하는 프로그램과 다른 템플릿을 선택했을경우 위와 같이 에러가 난다. \n콘솔에서는 프로그램의 시작점이 main(), 윈도우 프로그래밍에서는 WinMain()이 시작점이다.\n\n
!!! Class 속성\n/ private (은닉) ; 내부에만 사용하는 속성\n/ protected (상속) ; 상속되는 객체는 허용하는 속성\n -> 자식에게도 어느 정도 제어가 가능하게, 확장성을 고려해서 작성\n/ public (공개) ; 외부 공개되는 속성\n -> 최대한 복잡하지 않게 사용자가 단순히 설정 값만 바꿔도 동작 처리가 가능하게 작성\n\n!!! WinAPI-기본코드\n|main |도스 프로그램의 시작점, 반드시 소문자 |\n|~|통상 인수 없이 사용되지만, main( int argc, char * argv[] )처럼 인수를 사용 |\n|WinMain |윈도우 프로그램의 시작점, 대소문자를 구분 |\n|~|인수를 반드시 4개를 가짐 |\n\nint WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow );\n|hInstance |현재 실행되고 있는 프로그램의 인스턴스 핸들 |\n|hPrevInstance |바로 앞에 실행된 현재 프로그램의 인스턴스 핸들. 통상 NULL |\n|lpCmdLine |명령 행으로 입력된 프로그램 인자. main 함수의 argv 인수에 해당 |\n|nCmdShow |프로그램이 처음 실행 되었을 때 윈도우 창의 형태. 최소, 보통 등... |\n \nhttp://serious-code.net/doku/doku.php?id=kb:visualcpptips - C++ 예외 처리 방식 - be serious\n\n<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 14px;"> <b> Naming </b> </span>\n</html>\n// unit genus\nenum GENUS\n{\n GENUS_NONE = 0,\n GENUS_PLAYER = 1,\n GENUS_MONSTER = 2,\n GENUS_MISSILE = 3,\n GENUS_ITEM = 4,\n GENUS_OBJECT = 5,\n \n NUM_GENUS,\n};\n\n
''전처리문''은\n실질적인 컴파일 이전에 미리 처리되는 문장으로, 선행처리기라고도 한다. 따라서 컴파일러는 사용자가 작성한 코드를 컴파일하기 전에 전처리문에서 정의해 놓은 작업들을 먼저 수행한다.\n\nC의 전처리문이 오는 줄(Line)의 첫 문자는 항상 ‘#’으로 시작하고ㅡ ANSI 표준에 따른 C의 전처리문의 종류는 다음과 같다.\n • 파일 처리를 위한 전처리문 : #include\n • 형태 정의를 위한 전처리문 : #define (매크로 정의), #undef (정의된 매크로 삭제)\n • 조건 처리를 위한 전처리문 : #if, #ifdef, #ifndef, #else, #elif, #endif\n • 에러 처리를 위한 전처리문 : #error\n • 디버깅을 위한 전처리문 : #line\n • 컴파일 옵션 처리를 위한 전처리문 : #pragma\n\n조건 처리를 위한 전처리문은 어떤 조건에 대한 검사를 하고 그 결과를 참(0 이 아닌 값) 또는 거짓(0)으로 돌려준다.\n\n #if : …이 참이라면\n #ifdef : …이 정의되어 있다면\n #else : #if나 #ifdef에 대응된다.\n #elif : “else + if”의 의미\n #endif : #if, #ifdef, #infdef 이 끝났음을 알린다.\n\n원문; http://sarghis.com/blog/802/\n\n\nsource\sCommon\scommon.h\n{{{\n//----------------------------------------------------------------------------\n// VERSION DEFINES\n//----------------------------------------------------------------------------\n#define DEBUG_VERSION 0x00000001\n#define RETAIL_VERSION 0x00000002\n#define OPTIMIZED_VERSION 0x00000010 // optimized\n#define DEBUG_ID 0x00000020 // use debug ids\n#define DEVELOPMENT 0x00000100 // dev version\n#define CHEATS_ENABLED 0x00000200 // development cheats enabled\n#define RELEASE_CHEATS_ENABLED 0x00000400 // release cheats enabled\n#define DEMO_VERSION 0x00001000 // demo w/ some features turned off\n#define CLIENT_ONLY_VERSION 0x00010000 // tugboat client\n#define SERVER_VERSION 0x00020000 // server\n#define US_SERVER_VERSION 0x00100000 // large-realm specific server\n#define ASIA_SERVER_VERSION 0x00200000 // small-realm server\n#define RELEASE_VERSION 0x00400000 // release version\n#define NEW_PATCH_VERSION 0x00800000 // new patch version\n#define XTRAP_VERSION 0x01000000 // xtrap version\n\n#define CURRENT_VERSION (DEBUG_VERSION | DEVELOPMENT | CHEATS_ENABLED | VERSION_FLAGS | RELEASE_CHEATS_ENABLED )\n\n#define ISVERSION(x) ((CURRENT_VERSION & (x)) == (x))\n}}}\n\nsource\sCommon\sWorkDefines.h\n{{{\n//============================================================================\n// WorkDefines.h\n//============================================================================\n#pragma once\n\n#define __PLAYER_MOVING_STOP__ // tj. 2010.08.18. Key Command 시, 캐릭터 움직임을 정지 시킴\n\n//----------------------------------------------------------------------------\n//개발 중인 버젼은 여기다 추가\n//----------------------------------------------------------------------------\n#if ISVERSION(DEVELOPMENT)\n\n#if !defined(_WIN64)\n#define __INGNORE_NO_POPUP__\n#endif\n\n#if ISVERSION(SERVER_VERSION)\n#define __PVP_GAME_RECORD_LOG__\n#endif\n...\n\n#endif\n}}}\n\nsource\sc_input.cpp\n{{{\n//----------------------------------------------------------------------------\n// c_input.cpp\n//\n//----------------------------------------------------------------------------\n// INCLUDE\n//----------------------------------------------------------------------------\n#include "stdafx.h"\n#if !ISVERSION(SERVER_VERSION)\n#include "c_input.h"\n...\n\n\n#endif //!SERVER_VERSION\n\n//----------------------------------------------------------------------------\n//----------------------------------------------------------------------------\nBOOL sKeyGuildPanel(\n KEY_HANDLER_PARAMS)\n{\n ASSERT_RETFALSE(game && unit);\n\n#ifdef __PLAYER_MOVING_STOP__\n c_PlayerClearAllMovement( game ); // tj 2010.08.18.\n#endif\n\n UIToggleGuildPanel(); \n\n return TRUE;\n}\n\n// 기타 \n#if !ISVERSION(SERVER_VERSION)\n if (AppCommonGetSilentAssert())\n#else if ISVERSION(DEVELOPMENT)\n BOOL DesktopServerIsEnabled(void);\n if(AppCommonGetSilentAssert() && !DesktopServerIsEnabled())\n#endif\n}}}\n\n<html>\n<div style="border: 1px solid gold; padding: 10px; background-color: #F9F2F4; ">\n<span style="font-size: 14px;"> #define 재정의 </div> </span> </html>\n#define이 매크로를 정의하는데 비해, #undef는 정의된 매크로를 삭제한다.\n\n#define TIME 800\n#include <ext1.h>\n#undef TIME\n#define TIME 1400\n#include <ext2.h>\next1.h를 컴파일할 때 TIME은 800이 되고 ext2.h를 컴파일할 때 TIME은 1400이 된다.\n\n#ifdef MACRO\n#undef MACRO\n#endif\n#define MACRO 내가 원하는 값\n만약 MACRO가 이미 정의되어 있다면 취소해 버리고 원하는 값으로 다시 정의한다.\n\n\n
<html>\n<table>\n <tr> \n <td> <IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_Direct3D_ShaderX.jpg" height=64 >\n </td>\n <td> <b> Direct3D ShaderX : 정점 & 픽셀 셰이더 팁과 트릭 </b> <br>\n<br>\n▼ 볼프강 F. 엥겔 외 공저/ 류광, 최지호 공역/ 2003.06.20.초판/ 정보문화사/ ISBN 89-5674-120-4 <br>\n </td> \n </tr>\n</table>\n</html>\n''DirectX8, Visual Studio 6.0 환경''에서 서술하고 있기 때문에 \n ''DirectX9, Visual Studio 2013 환경''에서 학습 하면서, 개인적으로 정리\n\n참고 ; Learn Vertex & Pixel Shader Programming with DirectX 9 ( Author: James Leiterman/ ISBN-10: 1556222874 ) \n\n\n!! [[PART 1 셰이더 프로그래밍 입문]] \n 1. 정점 셰이더의 기초 / ◇ 볼프강 F. 엥겔 (Wolfgang F. Engel)\n 2. 정점 셰이더 프로그래밍 / ◇ 볼프강 F. 엥겔 (Wolfgang F. Engel)\n 3. 픽셀 셰이더의 기초 / ◇ 볼프강 F. 엥겔 (Wolfgang F. Engel)\n 4. 픽셀 셰이더 프로그래밍 / ◇ 볼프강 F. 엥겔 (Wolfgang F. Engel)\n 5. Shader Studio를 이용한 기초족인 셰이더 개발 / ◇ 존 슈왑 (John Schwab)\n\n\n!! [[PART 2 정점 셰이더 트릭들]]\n 1. 셰이더 안에서 정점 압축 풀기 / ◇ 딘 캘버 (Dean Calver)\n 2. 정점 셰이더로 그림자 영역 돌출시키기 / ◇ 크리스 브레너 (Chris Brennan) \n 3. Direct3D 정점 셰이더를 이용한 캐릭터 애니메이션 / ◇ 데이비드 고슬린 (David Gosselin)\n 4. 단일 표면 물체의 조명 / ◇ 그렉 제임스 (Greg james)\n 5. 소프트웨어 정점 셰이더의 최적화 / ◇ 킴 팰리스터 (Kim Pallister)\n 6. 입자 효과를 위한 몇 가지 정점 셰이더 트릭들 / ◇ 스코트 르 그랜드 (Scott Le Grand)\n 7. 펄린 잡음 및 셰이더 프로그램의 결과 반환 / ◇ 스티븐 리들 (Steven Riddle) / 올리버 C. 제카 (Oliver C. Zecha) \n\n\n <html> <span style="font-size: 14px;"> <b> PART 3 픽셀 셰이더 트릭들 </b> </span> </html>\n 1. 지형을 위한 텍스처 블렌딩\n 2. Direct3D의 1.4 픽셀 셰이더를 사용한 이미지 프로세싱\n 3. Hallo World - 픽셀 셰이더르 사용한 폰드 스무딩\n 4. 셰이더로 기하 에뮬레이트하기 - 임포스터\n 5. ps.1.4를 사용한 부드러운 조명\n 6. 픽셀 당 프레넬 항\n 7. 분산 입방체 맵핑\n 8. 객체 거리 조정에 의한 정확한 반사 및 굴절\n 9. 반복을 피하기 위한 UV 뒤집기(Flipping) 기법\n 10. 정점 및 픽셀 셰이더를 사용한 실사같은 얼굴\n 11. 픽셀 세이더와 정점 셰이더를 사용한 비실사 렌더링\n 12. 픽셀 셰이더와 정점 셰이더로 움직이는 풀 만들기\n 13. 텍스처 섭동 효과\n 14. 바닷물 렌더링\n 15. 반사와 굴절이 적용된 잔물결\n 16. 수정/ 사탕 셰이더\n 17. 비누 방울 셰이더\n 18. 픽셀 당 가닥 기반 비등방 조명\n 19. 픽셀 셰이더에서 정수가 아닌 거듭제곱 함수 구현\n 20. 범프 매핑과 결합된 BRDF 렌더링\n 21. 입자 흐름의 실시간 시뮬레이션과 렌더링\n\n\n <html> <span style="font-size: 14px;"> <b> PART 4 셰이더에서 3차원 텍스처 활용 </b> </span> </html>\n 1. 3차원 텍스처와 픽셀 셰이더\n 2. 진정한 입체 효과\n\n\n <html> <span style="font-size: 14px;"> <b> PART 5 셰이더를 이용하는 엔진 설계 </b> </span> </html>\n 1. 셰이더 주도적 게임 엔진의 설계에 대한 초기 고려 사항들\n 2. Krass 게임 엔진을 이용한 시각화\n 3. Quake III 형식을 위한 정점 셰이더 기반의 3D 엔진 설계\n\n\n
!! PART 2 정점 셰이더 트릭들\n+++!!![1. 셰이더 안에서 정점 압축 풀기 ]\n◇ 딘 캘버 (Dean Calver)\n\n<html> <span style="font-size: 12px;"> <b> 정점 압축의 개요 </b> </span> </html>\n(p.255) 우리의 목표는 압축된 정점의 해제 과정 전체를 정점 셰이더 안에서 수행하도록 하는 것이다... 압축 해제 알고리즘에 사용할 데이터의 양은 매우 제한적이다(정점 셰이더 상수 공간의 거의 대부분은 예를 들어 스키닝 행렬 등이 이미 사용하고 있을 것이므로). 정점 단위가 아니라 객체 단위로 정점 상수 메모리에 올릴 상수들도 몇 가지 있다.\n\n▣ 양자화(quantization) - 가장 간단한 형태의 압축이다. 그냥 최하위 비트들의 손실을 통해서 비트 수를 줄이는 것이다.\n▣ 비례된 오프셋 - 선형 방정식 방버의 특별한 경우로, 방정식을 한 점으로부터의 비례된 오프셋에 국한시킨다.\n▣ 압축 변환 - 객체에 선형 변환을 적용해서 객체를 압축에 좀더 적합한 공간으로 옮긴다(선형 변환, 즉 행렬을 적용).\n / 압축에서의 주된 과정은 양자화에 의한 오차를 최소화할 수 있는 변환을 찾는 것으로 이루어진다.\n / 필자가 주로 사용하는 압축 공간은 하나의 회전, 하나의 비례, 그리고 하나의 이동으로 구성된다.\n▣ 다중 압축 변환 - 각 정점은 일련의 압축 변환들 중 하나를 선택한다.\n▣ 슬라이딩 압축 변환 - 여분의 패딩 바이트들을 적절히 활용해서 압축 변환의 정밀도를 높이는 방법이다.\n▣ 변위 매핑과 벡터 필드 - 특정한 종류의 데이터에만 적용할 수 있으나, 텍스처 같은 기하구조를 저장함으로써 공간을 절약할 수 있다.\n\n(p.256) 이러한 압축 방법들에 동일하게 깔려 있는 개념은 정점 성분을 더 적은 비트들로 저장한다는 것이다. 부동소수점은 매우 큰 동적 범위(dynamic range)로 설계된 것인데, 정점에 대해서는 그렇게 큰 범위가 필요치 않으므로 범위를 줄임으로써 공간을 절약할 수 있다.\n다행히, DirectX는 정점 셰이더로 들어가기 전에 부동소수점으로 변환되는 다양한 비 부동소수점 자료형들을 지원한다.\n\n<html> <span style="font-size: 12px;"> <b> 기본적인 압축 </b> </span> </html>\n(p.265) ''최적화''\n첫번째 최적화는, 이미 4x4 행렬 변환을 수행해 두었다면 이전의 어떠한 압축도 저절로 해결될 수 있다느는 점에 착안한 것이다. 압축 해제 단계를 변환 행렬에 포함시킴으로써, 행렬과 벡터의 곱하기가 수행될 때 압축 해제가 자동으로 일어나게 만든다(이는 모든 압축들이 선형 변환과 관련되어 있기 때문에 가능하다). \n\n또 다른 최적화는, 꼭 필요하기 않다면 임시 레지스터를 거치지 말라는 정점 셰이더의 규칙을 따르는 것이다. 출력을 직접 출력 레지스터에 넣을 수 있다면 임시 레지스터를 사용할 필요가 없다.\n\n양자화된 D3DVSDT_UBYTE4를 사용하는 곳이라면 그것 대신 D3DVSDT_D3DCOLOR를 사용해도 된다. 정점 셰이더 안에서 255.0으로 나누기와 스위즐링이 아무 비용 없이 이루어질 수 있기 때문이다.\n\n<html> <span style="font-size: 12px;"> <b> 고급 압축 </b> </span> </html>\n(p.267) ''다중 압축 변환''\n본질적으로 이 방법은 물체를 개별적인 압축 영역들로 나누고 각 정점을 개별 영역으로 배정한다. 주된 어려움은, 압축 과정에서 물체에 틈이 생기지 않도록 만드는 것이다.\n\n(p.269) ''슬라이딩 압축 변환''\n이 방법은 이미 쓰이고 있는 정점 성분에 더 많은 데이터를 집어넣는 것이 아니라 추가적인 "더미(dumy)" 채움 데이터를 활용하는 것이다. 변위 값을 채움 데이터에 인코딩해 놓음으로써 전체 압축 행렬을 이동시킬 수 있으며, 이를 통해서 각 정점을 더 나은 압축이 가능한 공간으로 이동(sliding)시킬 수 있다.\n=== <html> <! 1. 셰이더 안에서 정점 압축 풀기 > </html>\n+++!!![2. 정점 셰이더로 그림자 영역 돌출시키기 ]\n◇ 크리스 브레너 (Chris Brennan)\n\n<html> <span style="font-size: 12px;"> <b> 소개 </b> </span> </html>\n(p.277) 실시간 그림자 렌더링 중 그림자 입체(shadow volume) 기법을 위해서는 물체가 드리운 그림자의 안쪽 영역을 결정하는 기하구조를 구축해야 한다.\n...\n무엇보다도 주된 단점은 그림자 입체를 구축하는 데 필요한 CPU 비용이 크며 그림자 입체를 적절히 구축하기 위해서는 캐릭터 애니메이션도 CPU에서 처리해 주어야 한다는 것이다. 그러나 전처리를 좀 해 주고 정점 셰이더를 잘 짜면 CPU의 부담을 크게 줄일 수 있다.\n\n(p.278) 그림자 입체에서 또 하나 해결해야 하는 문제는 관찰자가 그림자 안에 있는 상황이다... 다행히 간단한 해결책이 하나 존재한다. 그림자 입체의 가시 영역에 대해 스텐실 버퍼를 증가, 감소시키는 대신, 깊이 판정을 실패하도록 설정해서 입체가 다른 표면에 의해 가려졌을 때에만 스텐실 버퍼를 수정하는 것이다... 다만, 모든 그림자 입체들이 완전히 닫혀 있어야 제대로 작동한다(이전의 방법들은 그림자 입체의 앞, 뒤면이 열려 있어도 상관없다).\n\ncf. 스텐실 그림자 입체는 깊이 버퍼 같은 다른 그림자 알고리즘에 비해 장점도 가지고 있지만 단점 역시 존재한다. 스텐실 방법은 무한한 정밀도를 가지며 시각적 결합이 없는 반면, 가장자리가 날카롭고 물체 형태의 복잡성이나 관찰자, 빛의 위치에 따라서 렌더링이 복잡해질 수 있다.\n=== <html> <! 2. 정점 셰이더로 그림자 영역 돌출시키기 > </html>\n+++!!![3. Direct3D 정점 셰이더를 이용한 캐릭터 애니메이션 ]\n◇ 데이비드 고슬린 (David Gosselin)\n\n<html> <span style="font-size: 12px;"> <b> 소개 </b> </span> </html>\n(p.285) 캐릭터 애니메이션에서 흔히 사용하는 기법 두 가지는\n1. 트우닝 (tweening, morphing 이라고도 한다)\n2. 스키닝 (skinning, 골격 에니메이션 (skeletal animation) 이라고도 한다)\n\n<html> <span style="font-size: 12px;"> <b> 트위닝 </b> </span> </html>\n(p.285) 트위닝은 애니메이션의 두(또는 그 이상의) "키" 프레임들을 선형으로 보간하는 기법이다.\n\n(p.287) 트위닝이라는 애니메이션 기법은 애니메이션 데이터가 상당히 크다는 단점을 가지고 있다. 반면 스키닝은 메모리 사용량이 적다. 스키닝을 구현하려면 더 많은 정점 셰이더 명령들이 필요하지만, 애니메이션의 프레임 당 데이터는 더 작다.\n\n<html> <span style="font-size: 12px;"> <b> 스키닝 </b> </span> </html>\n(p.288) 메시로부터 생성된 정점은 뼈대 가중치들로 가지는데, 뼈대 가중치는 해당 행렬(뼈대)로부터 영향을 받는 정도를 의미한다. 이 가중치들은 정점에 대한 해당 행렬들의 영향을 혼합할 때 쓰인다. 혼합 공식은 다음과 같다.\n\n최종 위치 = SUM ( matrix[n]*position*weight[n])\n\n정점 셰이더 하드웨어가 나오기 전에는 이러한 계산을 CPU 상에서 수행했었다(이를 "소프트웨어 스키닝"이라고 부르기도 한다). 그런 경우 모형의 스키닝 이후 정확한 법선들을 계산할 수 있다는 장점이 있지만, 일반적으로 계산량이 상당히 크다... \n그러나 이제는 정점 셰이더를 이용해서 좀더 자유롭게 하드웨어 스키닝을 구현하는 것이 가능하다. 이 절에서는 두 종류의 스키닝에 대해 이야기한다.\n하나는 고정 기능 파이프라인이 지원하는 하드웨어 스키닝 같은 방식의 행렬 네 개짜리 스키닝이고,\n또 하나는 팔레트 방식이다. 후자는 그리기(drawing) 호출들을 좀더 몰아서 처리할 수 있다는 장점이 있다.\n\n(p.291) 팔레트 스키닝 방식의 한 가지 단점은 고차 표면들과는 잘 맞지 않는다는 것이다. 이는 정점 셰이더가 표면 분할 이전의 정점들을 처리하며, 위치와 법선을 제외한 나머지 정점 데이터가 선형으로 보간된다는 점 때문이다. 혼합 행렬들에 대한 색인 값들을 보간한다는 것은 무의미한 일이다.\n\n''스키닝과 트위닝의 통합''\n(p.291) 만일 미묘한 안면 움직임을 뼈대로 처리한다면 상당히 많은 뼈대들이 필요하게 될 텐데, 그렇게 되면 계산량도 계산량이지만 3D 모델링 패키지에서 뼈대들을 관리하는 것도 쉽지가 않을 것이다. __그런 경우라면 머리와 몸, 팔다리는 뼈대로, 그리고 얼굴은 정점 트위닝으로 처리하는 것이 적당하다.__\n\n<html> <span style="font-size: 12px;"> <b> 픽셀 당 조명을 위한 접선 공간의 애니메이션 </b> </span> </html>\n\n<html> <span style="font-size: 12px;"> <b> 요약 </b> </span> </html>\n(p.302) 정점 셰이더를 이용하면 그래픽 파이프라인을 응용 프로그램에 맞게 커스텀화할 수 있으며, 또한 CPU의 처리 부담 일부를 GPU에 떠넘기고, 남은 CPU 시간을 좀더 재미있는 게임을 위해 활용할 수 있게 된다.\n=== <html> <! 3. Direct3D 정점 셰이더를 이용한 캐릭터 애니메이션 > </html>\n+++!!![4. 단일 표면 물체의 조명 ]\n◇ 그렉 제임스 (Greg james)\n\n(p.303) 예를 들어서, 나뭇잎, 풀입, 입자 시스템 객체들, 머리카락, 옷 등은 피부가 없는 얇은 종이장 같은 형태로 만들어지는데,...\n문제는 각 정점이 오직 하나의 표면 법선 벡터를 가질 수 있다는 점에서 비롯된다. 하나의 표면 법선은 삼각형의 앞면이 보일 때에는 정확하나 뒷면이 보일 때에는 그렇지 못하다. 뒷면이 보일 때의 법선은 의도한 것과는 반대 방향을 가리키게 되며, 따라서 조명 계산이 법선에 근거하는 경우 결과가 부정확해진다.\n\n(p.304) 단일 표면 물체의 조명 문제는 각 면에 대해 상대적인 관찰자의 방향에 의존한다... 빛의 위치는 적절한 법선을 선택하는 것과는 무관하다는 점에 주의하기 바란다. 문제가 되는 것은 정점 법선에 상대적인 시점 위치뿐이다.\n\n<html> <span style="font-size: 12px;"> <b> 얇은 물체들을 위한 개선된 조명 </b> </span> </html>\n\ncf. The accompanying example program is provided with the NVIDIA EffectsBrowser. It is called Two-Sided Lighting.\n=== <html> <! 4. 단일 표면 물체의 조명 > </html>\n+++!!![5. 소프트웨어 정점 셰이더의 최적화 ]\n◇ 킴 팰리스터 (Kim Pallister)\n\n(p.312) 소프트웨어 정점 셰이더 지원은 DirectX 런타임에 내장된 정점 셰이더 컴파일러가 정점 셰이더 코드를 CPU에 최적화된 명령 스트림(Pentium III와 Pentium 4 프로세서의 경우 SSE와 SSE2 명령들)으로 컴파일하는 식으로 구현된다.\n\n<html> <span style="font-size: 12px;"> <b> SSE에 대해 </b> </span> </html>\n(p.315) SSE와 SSE2 명령들을 완전히 이해해야만 정점 셰이더 컴파일러의 작동 방식을 알 수 있는 것은 아니다. SSE 명령들에 대한 좀더 자세한 내용은 Intel의 개발자 서비스 웹사이트(www.intel.com/IDS)에서 찾아볼 수 있다.\n\n(p.316) 이 글에서는 SSE/ SSE2 명령 집합을 모두 이야기하지 않는다. 다만 컴파일러의 작동 방식을 이해하는 데 중요한 또 다른 주제인 __데이터 정렬__에 대해서는 언급을 할 필요가 있을 것 같다.\n\n<html> <span style="font-size: 12px;"> <b> SSE 명령들을 위한 최적의 데이터 배치 </b> </span> </html>\n\n<html> <span style="font-size: 12px;"> <b> 정점 셰이더 컴파일러의 작동 방식 </b> </span> </html>\n(p.318) DirextX 8 API는 정점 가상 머신(vertex virtual machine, VVM)이라는 것을 제공하는데, 이것은 입력 정점 데이터 스트림의 처리를 위한 전용 가상 머신이다. \n\n(p.320) ''최적화 지침''\n| !소프트웨어 정점 셰이더의 최적화를 위한 지침들 |\n|【 규칙 】 |\n|1. 필요한 결과들만 기록할 것. |\n|2. 가능한 곳이라면 항상 매크로들을 사용할 것. |\n|3. 의존성 연쇄를 최소화할 것. |\n|4. 마지만 산술 명령의 결과를 직접 출력 레지스터에 기록할 것. |\n|5. 가능한 한 같은 임시 레지스터를 재사용할 것. |\n|6. 색과 안개 값을 묵시적으로 포화(범위 한정)시키지 말 것. |\n|7. exp와 log 함수를 사용할 때에는 받아들일 수 있는 최저의 정확도를 제공하는 형태를 사용할 것. |\n|8. 가능하면 주소 레지스터를 사용하지 말 것. |\n|9. 주소 레지스터를 반드시 사용해야 한다면, 정점들의 순서를 주소 필드 순서와 일치시킬 것. |\n|10. 무엇보다도 중요한 것은 프로파일링(profiling), 즉 구체적인 성능 측정이다. |\n=== <html> <! 5. 소프트웨어 정점 셰이더의 최적화 > </html>\n+++!!![6. 입자 효과를 위한 몇 가지 정점 셰이더 트릭들 ]\n◇ 스코트 르 그랜드 (Scott Le Grand)\n\n<html> <span style="font-size: 12px;"> <b> 소개 </b> </span> </html>\n(p.328) 그러나 CPU에서 처리하던 절차적 효과를 정점 셰이더로 옮기는 문제는 그리 간단한 것이 아니다. 무엇보다도, 정점 셰이더에는 조건 분기가 없거나 매우 제한적이며, 또한 정점들 사이에서 어던 정보를 공유하는 것도 불가능하다. 다행히, 조건 분기는 적절한 비트 마스트로 흉내낼 수 있다.\n\n''주기적인 시간 간격 다루기''\n''단발성 효과''\n''난수''\n''흐름 제어''\n''외적''\n=== <html> <! 6. 입자 효과를 위한 몇 가지 정점 셰이더 트릭들 > </html>\n++++!!![7. 펄린 잡음 및 셰이더 프로그램의 결과 반환 ]\n◇ 스티븐 리들 (Steven Riddle) / 올리버 C. 제카 (Oliver C. Zecha)\n\n{{wrappingClass{ 1. Light 효과가 나타나지 않음 (∵ 원인 찾지 못함) <br> 2. Vertex Shader 출력에는 mov oPos, v0 가 필요하기 때문에 <br> FLOAT x, y, z; (D3DDECLUSAGE_POSITION : The input coordinate)을 통해서 좌표 전달 <br> 3. FVF 등 변경된 설정과 함수명이 같지만 인자가 다른 경우가 있음 }}}\n\n<html> <span style="font-size: 12px;"> <b> 셰이더의 한계 </b> </span> </html>\n(p.333) 하드웨어로 가속되는 프로그래밍 가능한 셰이더는 오늘날의 컴퓨터 그래픽에서 이루어진 가장 중요한 진보이다... 그러한 활용 가능성은 주로 셰이더 기술의 벡터 처리 능력에서 비롯되는 것으로, 벡터 처리 능력은 복잡한 조명 모형 및 기타 시각적으로 놀라운 효과들을 가능하게 한다.\n...\n그러나 오늘날 그래픽 기술의 발전 속도를 생각한다면, (적어도 당분간은) CPU가 GPU의 처리 능력을 따라잡기는 힘들 것 같다. 이는 GPU의 수행 유닛들의 특징 때문이다.\n\n(p.334) 셰이더의 한계\n@@color(#FF0000): 1. 명령 개수의 한계 ; @@\n벡터와 그래픽 계산에 GPU를 최대한 사용한다는 말은, 코드의 관점에서 볼 때 최대한 많은 일들을 프로그래밍 가능한 셰이더로 처리한다는 뜻이다. 여기서 셰이더의 중대한 한계와 부딪히게 되는데, 그것은 최대로 활용할 수 있는 셰이더 명령들이 정점 파이프라인 안에서는 128개, 픽셀 파이프라인 안에서는 산술 명령 8개 더하기 어드레싱 명령 4개뿐이라는 점이다(픽셀 셰이더 버전 1.4에서는 어드레싱 명령들이 6개로 늘었으나 산술 명령들은 여전히 8개이다. 다만 페이즈가 두 개로 늘어서, 각 페이즈마다 14(8+6)개, 총 28개를 사용할 수 있게 되었다).\n\n@@color(#FF0000): 2. 메인 프로그램에서 셰이더의 계산 결과를 알기가 힘들다. @@\n(p.335) 필자들은 결국 정점 셰이더가 쓰기 전용이라는 사실을 깨닫게 되었다. 값을 돌려 받기가 어렵다는 것, 이것이 셰이더의 또 다른 주요 한계이다.\n\n※ 해결책 1\n명령들이 병렬로 수행되도록 함으로써 성능도 높일 수 있다. 그러나 명령 개수를 줄여서 얻을 수 있는 이득은 그리 크지 않다. \n이상적인 해결책은 __두 정점 셰이더 프로그램들을 순차적으로 실행시키는 것이다. 즉 첫번째 것의 결과를 두번째 것의 입력으로 사용하도록 하는 것이다.__ \n그러나 그러한 순차 실행은 아직 셰이더 프준에 도입되지 않았으므로, 현재로서는 셰이더 프로그램의 출력을 메인 프로그램이 받아서 다시 처리하는 것이 최선의 방책이다. 그런데 우연하게도 이 방책은 두번째 한계와도 관련되어 있다.\n\n※ 해결책 2\n두 가지 한계를 모두 해결... 셰이더 프로그램의 결과를 직접 돌려 받는 것은 불가능하지만, 간접적으로나마 얻는 것은 가능하다. 일반적으로 셰이더 프로그램들은 렌더링된 결과를 메모리에 넣는데, 대개의 경우 그 메모리는 화면 상에 표시될 비디오 메모리이다. 그러나 렌더링의 대상을 텍스처로 설정하는 것이 가능하다. __그 텍스처를 계산 결과의 배열로 사용하면 되는 것이다.__ \n... 셰이더 파이프라인으로부터 값들을 돌려 받을 수 있게 되면 계산량이 꽤 큰 여러 알고리즘들을 GPU 상에서 실행되는 좀더 빠른 셰이더 프로그램들로 구현 할 수 있게 된다.\n\n(p.336) 이러한 목표를 달성하기 위해서는 각 정점에 추가적인 정보를 배정해야 한다. 이 추가적인 정보는 결과가 저장된 텍스처 좌표이다. 이 추가적인 데이터는 AGP 버스를 통해 이동되며, 당연히 그에 따른 비용도 존재한다. 따라서 그 결과가 CPU 상에서보다 못할 수 있다. @@color(#0000FF): GPU를 활용해서 이득을 얻을 수 있을 정도로 충분히 복잡한 계산을 정점에 대해 수행하는 경우에만 효과를 볼 수 있는 것이다. @@\n\n<html> <span style="font-size: 12px;"> <b> 펄린 잡음(Perlin noise)과 부분 브라운 운동 </b> </span> </html>\n(p.336) 컴퓨터 그래픽은 일반적으로 가장자리가 날카로우며 실제 모습에 비해 '지나치게 완벽한' 모습으로 만들어지는 경향이 있다. 따라서 좀더 사실적인 모습을 위해 잡음을 추가함으로써 결점과 무작위성을 표현하기도 한다. 잡음을 선에 추가하면 스케치한 듯한 선이 그려지며, 텍스처에 적용하면 다양한 변종들이 나타난다. 캐릭터 애니메이션에 잡음을 추가하면 좀더 자연스러운 움직임이 나오고, 기하구조에 추가하면 불완전한, 그리서 더 사실적인 형태가 만들어진다.\n...\n펄린 잡음이란 명칭은 매끄러운 의사 난수 잡음의 생성 기법을 고안해 낸 켄 펄린(Ken Perlin)의 이름에서 따온 것이다... 펄린 잡음의 가장 중요한 특징은 반복 가능성이다. 다른 말로 하면, 펄린 잡음에서 주어진 임의의 지점의 잡음은 언제 계산해도 항상 동일한 것이다.\n\ncf. 잡음에 가우스 블러(Gausian blur) 같은 일종의 평준화(smoothing) 처리를 해 주기도 한다. 그러나 가우스 블러는 상당히 느릭 때문에 실시간 그래픽에 사용하기에는 조금 무리가 있다. 이를 대신하기 위해 등장한 것이 펄린 잡음이다.\n\n(p.337) 매끄러운 의사 난수 잡음을 만들기 위해서는 하나의 난수 발생기와 하나의 보간 함수가 필요하다. 난수 발생기는 잡음 함수로 쓰이며, 보간 함수는 잡음으로부터 하나의 연속 함수를 만들어 내는 데 쓰인다.\n\n\n(그림1)은 1차원 난수 함수의 예이다. \n이 함수는 하나의 정수가 주어지면 0에서 1 사이의 실수 의사 난수를 돌려준다. 이 함수는 주어진 한 점에 대해 항상 동일한 의사 난수를 돌려주며, 따라서 반복 가능하다. 이것이 이 예제의 잡음 함수이다(≒ 단순한 파동 함수).\n\n<html> <IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_ShaderX_PerlinNoise_01.jpg" width=240 > </html>\n\n(그림2)는 1차원 잡음 함수에 삼차 보간을 적용한 결과이다.\n잡음 함수처럼 이 함수도 반복 가능하다. 그러나 잡음 함수와는 달리 이 함수는 연속이며, 따라서 x 정의역의 어떠한 실수에 대해서도 평가될 수 있다. 이 매끄러운 함수를 잡음파(noise wave)라고 부른다.\n\n<html> <IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_ShaderX_PerlinNoise_02.jpg" width=240 > </html>\n\n<html> <IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_ShaderX_PerlinNoise_03.jpg" width=240 > </html>\n\n잡음파의 진폭(A) = 치역의 상한과 하한 사이의 거리\n파장(λ) = 파동 한 주기의 길이 (≒ 잡음파에서는 인접한 두 점 사이의 x 거리)\n\n주파수(f) = 1/λ\n\n(p.338) 주파수(frequency, 진동수)는 특정한 펄린 잡음파를 특정짓는, 그리고 펄린 잡음파들을 서로 비교할 수 있게 하는 요인이다.\n잡음파 1의 주파수가 잡음파 2의 두 배일 때, 잡음파 1이 잡음파 2보다 한 "옥타브" 위라고 말한다. 여기서 말하는 옥타브는 음악에서의 옥타브와 동일한 의미를 지닌다. 음악에서도 어떤 음의 한 옥타브 위의 음은 원래 음보다 주파수가 두 배이다.\n\n<html> <IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_ShaderX_PerlinNoise_T1.jpg" width=480 > </html>\n\n주파수와 진폭을 달리 주면 다양한 펄린 잡음이 나온다. \n / 주파수는 X 축의 비례를 통해서 제어한다. 점들이 적을수록(점들 사이의 간격이 클수록) 주파수는 높아진다.\n / 진폭은 난수 발생기의 결과에 나누기를 적용해서 제어한다. 제수가 크면 진폭은 작아진다.\n(표1)은 몇 가지 매끄러운 잡음 함수들로, 치역이 【 -0.5. 0.5】가 되도록 비례시킨 것이다. (그림4)는 (표1)의 처음 다섯 잡음 함수들을 합한 것이다.\n\n(p.339) (그림4)는 복잡한 합성 잡음 함수의 하나인 ''부분 브라운 운동''(fractional Brownian motion, fBm. 또는 프랙탈 브라운 운도)이다. \nfBm은 켄 머스그레이브(Ken Musgrave)가 발견한 프랙탈의 일종이다. fBm 잡음을 만드는 가장 일반적인 방법은 __펄린 잡음의 연속적인 옥타브들을 함치는 것으로, 그 합은 모든 펄린 잡음을 겹친 것이다.__\n이렇게 하면 각 파의 특징들이 모두 결과에 나타난다. 합칠 때에는 각 단계에서 진폭을 2로 나눠 높은 주파수의 효과를 감소시킨다.\n\n<html> <IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_ShaderX_PerlinNoise_T2.jpg" width=480 > </html>\n\n(p.339) 2차원 잡음은 용도가 더 다양한데, 왜냐하면 텍스처나 높이 맵으로 사용할 수 있기 때문이다. 2차원 잡음 함수는 두개의 2차원 실수 좌표를 받아서 하나의 실수를 돌려준다.\n...\n2차원 잡음은 하나의 벡터를 입력받고 하나의 의사 난수 스칼라 값을 돌려주는 함수로 볼 수 있다.\n\n(p.341) 3차원 잡음을 이용하면 고체를 깎아내느 효과를 얻을 수 있다. 고체를 반으로 자르는 경우 여전히 연속적인 텍스처가 나타난다. 이 기법은 대리석을 흉내낼 때 흔히 쓰이며 결과도 상당히 좋다.\n\n(p.343) 펄린 잡음을 셰이더 안에서 생성한다고 할 때 나서는 문제는 그 결과를 어떻게 받을 것인가이다. 우리가 얻을 수 있는 값은 픽셀들 뿐이므로, @@color(#FF0000): 함수의 출력을 색들로 인코딩해야 한다.@@ 예제에서는 양의 결과를 청색 성분으로, 음의 결과를 녹색 성분에 저장한다.\n\n(p.359) 이것으로 모든 계산이 끝났다. 이제 점의 위치와 색(계산 결과)를 출력한다. 위치는 색이 기록될 텍스처 상의 x, y 좌표이다. 그리고 위의 과정에 의해, 양의 잡음은 녹색 성분에 기록되고 음의 잡음은 청색 성분에 기록된다. 알파는 진폭이다.\n\n; x 위치 = 텍스처 상의 xy 위치\nmov oPos, v0\n; 최종 색을 출력\nmov oD0, r7.xyzw\n\n<html> <span style="font-size: 12px;"> <b> 맺음말 </b> </span> </html>\n(p.359) @@color(#0000FF): 이 셰이더에 넣는 정점은 하나의 FVF에 두 개의 벡터가 들어있는 형태이다.@@ 벡터 하나는 펄린 잡음을 얻고자 하는 점의 위치를 의미하고, 또 하나는 텍스처 위치를 위미한다. 128x128 메시(점의 갯수는 약 16,384개)의 경우 AGP 버스로 전송되는 데이터가 약 8 메가바이트인데, 이 정도면 그리 나쁘지 않다.\n벡터가 두 개뿐이므로 ''입력 공간''에는 14개의 벡터들에 해당하는 여유가 남아 있다. 즉 추가적인 정보를 위한 공간은 충분한 것이다. 게다가 잡음 자체에는 텍스처가 전혀 쓰이지 않았다. 따라서 텍스처를 또 다른 입력 데이터로 사용할 수도 있다.\n단점이라면 정점 파이스파인 안에서 93개의 명령 공간이 소비된다는 점인데, x에 대한 선형 보간 등으로 상당히 단순화시킨 면도 많으므로 명령 개수를 더 줄이기는 힘들 것이다. 그래도 35개의 명령 공간이 남아 있고, 또한 픽셀 세이더는 사용하지 않으므로 픽셀 파이프라인의 능력을 더욱 활용할 여지도 남아 있다.\n\n(p.360) 정점 프로그램들이 소프트웨어 모드에서 실행될 때에는 최적화된 정점 파이프라인이 작동한다. 소프트웨어 정점 파이프라인은 그래픽 하드웨어에 독립적이며, 3DNOW!나 SSE 같은 스트림라이닝 CPU 어셈블리 명령들의 장점을 취한다.\n\n값을 돌려 받는 기법은 속도가 느리며 의문의 여지를 가지고 있지만, GPU들이 좀더 빨라짐에 따라 GPU로부터 값을 돌려 받는 기법의 장점 역시 더욱 커지게 될 것이다. 게다가 그런 기법 없이는 구현이 불가능한 효과들도 존재하므로, 익혀둔다면 다른 게임에서는 볼 수 없는 독특한 효과를 얻는 데 도움이 될 수 있을 것이다.\n...\n정점 셰이더들은 대량의 데이터를 선호한다. 따라서 추가된 정점들의 목록을 저장하고 잡음 값들을 하나의 블록으로 계산한다면 효율을 좀더 높일 수 있을 것이다.\n\n이 글의 기법과 예제는 하나의 실험일 수도 있고, 독자의 잡음 활용을 위한 하나의 기반이 될 수도 있다. 확실은 것은 아직 제품에 넣을 만한 정도는 아니라는 점이다. __충돌 검출이나 표면과의 상호작용을 위해서는 이동된 정점 위치를 알아야 하는데(결국 잡음 값을 알아야 한다는 뜻), 그러자면 GPU 상에 만들어진 텍스처를 다시 읽어 와야한다. 이는 매우 비효율적인 과정이다.__ \n이 기법의 잠재력은 충분히 인정할 만 하지만, 특정 응용을 위한 구현을 생각한다면 더 많은 최적화가 필요할 것이다. 셰이더에는 개선의 여지가 많은데, 특히 텍스처 적용 부분이 그렇다. 어쨋든, GPU 대 CPU의 능력 차이는 확실히 보여주고 있다.\n=== <html> <! 7. 펄린 잡음 및 셰이더 프로그램의 결과 반환 > </html>\n\n\n
<html> <span style="background:#f2f2ff; font-size: 14px;"> <b> #. DirextX8 >> DirextX9 에서 변경된 함수 </b></span> </html>\n-. IDirect3DDevice8::CopyRects ⇒ IDirect3DDevice9::UpdateSurface\n\n<html> <span style="background:#f2f2ff; font-size: 14px;"> <b> #. 'd3dx9.h': No such file or directory </b></span> </html>\nD3DXMATRIX m_matProj;를 사용하고 싶지만 header 파일을 찾을 수 없을 때\n\n프로젝트 \n ● 속성 > C/C++ > 일반 ; DirectX 9 SDK의 include/lib 폴더 경로를 설정 (in Visual Studio 2013)\n ● 속성 > 링커 ; 추가 라이브러리 디렉터리, 설정\n\n{{wrappingClass{#pragma comment(lib, "d3dx9.lib") <br> #include <d3dx9.h> <br> ... <br> D3DXMATRIX m_matProj; }}}\n\n\n<html> <span style="background:#f2f2ff; font-size: 14px;"> <b> #. 'd3dx9math.h': No such file or directory </b></span> </html>\n\n1>... : fatal error C1083: 포함 파일을 열 수 없습니다. 'd3dx9math.h': No such file or directory\nMicrosoft DirectX SDK (Auguset 2007) 삭제 ; dxsdk_aug2007.exe\nMicrosoft DirectX SDK (June 2010) 설치 ; DXSDK_Jun10.exe\n\n\n<html> <span style="background:#f2f2ff; font-size: 14px;"> <b> #. 큐브 환경맵 설정 </b></span> </html>\ng_pd3dDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR | 1); \n{{{\nd3d9types.h\n\n// Values, used with D3DTSS_TEXCOORDINDEX, to specify that the vertex data(position\n// and normal in the camera space) should be taken as texture coordinates\n// Low 16 bits are used to specify texture coordinate index, to take the WRAP mode from\n//\n#define D3DTSS_TCI_PASSTHRU 0x00000000\n#define D3DTSS_TCI_CAMERASPACENORMAL 0x00010000\n#define D3DTSS_TCI_CAMERASPACEPOSITION 0x00020000\n#define D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR 0x00030000\n#define D3DTSS_TCI_SPHEREMAP 0x00040000\n}}}\nD3DTSS_TCI_PASSTHRU 는 정점에 주어진 텍스쳐 좌표를 그대로 사용 \nD3DTSS_TCI_CAMERASPACENORMAL 는 정점의 법선 정보를 카메라의 공간좌표로 변환 한 뒤 텍스쳐 변환 행렬 적용 후 텍스쳐 좌표로 사용(환경 맵핑) \nD3DTSS_TCI_CAMERASPACEPOSITION 는 정점의 위치를 카메라 공간좌표로 변환한 뒤 텍스쳐 변환행렬 적용 후 텍스쳐 좌표로 사용(그림자 맵핑) \nD3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR 는 정점의 위치와 법선을 카메라 공간좌표로 변호나한 뒤 시선에 대한 반사벡터를 구하여 텍스쳐 변환행렬 적용 후 텍스쳐 좌표로 사용(반사 환경 맵핑) \nD3DTSS_TCI_SPHEREMAP는 구면 맵핑을 위한 텍스쳐 좌표를 사용(구면 맵핑) \n\n<html> <span style="background:#f2f2ff; font-size: 14px;"> <b> #. 렌더링 프레임 설정 </b></span> </html>\nD3DPRESENT_PARAMETERS d3dpp;\n...\nd3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; - 플리핑을 즉시 시행 (프레젠테이션이 수직 동기와 동기 하지 않는 것을 의미)\n / D3DPRESENT_INTERVAL_DEFAULT - 디폴트의 시스템 타이머 정밀도를 사용 (≒ 60 FPS)\n\n\n\n
<html>\n<table>\n <tr> \n <td> <IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_ShaderX2_DirectX9.jpg" height=64 >\n </td>\n <td> <b> 도서_ShaderX² : DirectX 9 셰이더 프로그래밍 </b> <br>\n(원표제: ShaderX² intorduction & tutorials with DirectX 9) <br>\n<br>\n▼ WOLFGANG ENGEL 지음/ 이창한, 신승백 옮김/ 2004.09.15. 출간/ 정보문화사/ ISBN 89-5674-212-X <br>\n </td> \n </tr>\n</table>\n</html>\n\n!!! 역자의 글\n(p.001) 셰이더는 DirectX 8.0에서 처음 선을 보였다. 초기에 제한적인 기능만을 제공하던 3D API는 점점 늘어나 마침내는 프로그래머가 직접 GPU를 프로그래밍할 수 있는 영역까지 확장되었고, DirectX 9.0에서는 HLSL(High Level Shading Language)과 좀 더 확장된 문법을 지원하여 프로그래머의 부담도 많이 줄게 되었다.\n\n같은 저자가 쓴 셰이더에 관한 바로 전 책과 이 책을 비교해보면 정말로 많은 것이 바뀌었음을 알 수 있을 것이다. 부정확한 부동 소수 정밀도와 제한된 픽셀 셰이더로 인해서 텍스처에 미리 계산된 값을 저장하여 텍스처에서 값을 읽어서 처리해야 했던 것들이 픽셀 셰이더 2.0에서는 수식 계산으로 처리할 수도 있다.\n\n\n!!! 편집자 서문\n『ShaderX2: DirectX 9 셰이더 프로그래밍』 (ShaderX2 Introductions & Turorials with DirectX 9)\n『ShaderX2: DirectX 9 셰이더 프로그래밍 팁 & 트릭』 (ShaderX2 Shader Programming Tips & Tricks with DirectX 9)\n\n첫 번째 책은 독자들이 셰이더 프로그래밍을 시작하는 데 도움이 되는 것들을 중심으로 엮었고, 두 번째 책(이 책)은 숙련된 셰이더 프로그래머에게 필요한 팁과 트릭들로 구성하였다.\n\n\n!!! 도입\n(p.023) 이 책은 셰이더 프로그래밍의 기초 (고수준 셰이딩 언어와 3.0 버전에서부터 그림자 매핑과 스텐실 그림자 입체에 이르기까지) 를 설명하는 글들의 모임이다. 다음은 이 글들의 간략한 개요이다.\n\nHLSL과 그 컴파일러의 제작자 중 한 명인, Jason L. Mitchell과 Craig Peeper가 "1. DirectX 고수준 셰이딩 언어 HLSL에 대한 소개"라는 제목의 HLSL에 대한 훌륭한 소개 글을 썼다. 이 글은 공식 출처에서 사온 것이므로, HLSL 프로그래머가 필요로 하는 기본적인 것은 물론 더 많은 것들을 다루고 있다.\n\nvs_3_0와 ps_3_0 셰이더 모델은 3세대 셰이더 그래픽 하드웨어에서는 사용 가능할 것이다. 이 셰이더 버전들은 전 버전보다 좀 더 유연하고 강력하다. 정점 텍스처링 기능, 조건자(predication), 고정 유동 조건 분기(flow control), 정점 스트링 빈도 그리고 더 많은 것들을 제공한다. Nicolas Thibieroz, Kristof Beets 그리고 PowerVR의 Aaron Burton 등이 새롭게 추가된 기능들과 간략한 소스 코드를 포함하는 이 새로운 셰이더 모델에 대한 소개를 썼다.\n\nMichal Valient의 글인 "3. Direct3D 9로 구현한 향상된 조명과 셰이딩"은 퐁(Phong), 오렌-나야르(Qren-Nayar) 그리고 쿡-토르란스(Cook-Torrance)를 포함하는 보다 진보된 조명 모델을 다룬다. 그는 이 알고리즘을 ps_1_4, ps_2_0, ps_3_0 그리고 HLSL로 인식하였다. 이 주제에 관한 가장 넓은 범위를 포함하는 글이다.\n\n게임에서 특정한 분위기를 만들어내는 안개를 사용하는 다양한 기법들이 있다. Markus Nuebel은 안개를 이식하는 모든 가능한 기법들을 이해하기 쉽게 보여준다. 여섯 개의 예제 프로그램이 안개 사용을 보다 쉽게 만들어준다.\n\n(p.024) Michal Valient는 두 번째 글로 "5. Direct3D 9로 구현한 그림자 매핑"을 썼다. DirectX 9에서 사요할 수 있는 부동소수점 텍스처로, 그림자 구현을 위해 그림자 맵을 사용하면 보다 나은 시각 체험을 하게 될 것이다. Michal은 어떻게 그림자 매핑을 가장 효율적이고 유연한 방법으로 이식하는지를 보여주고, 응용프로그램을 어떻게 디버깅하는 지에 관한 팁을 알려줄 것이다.\n\n그림자 입체에 대한 가장 포괄적인 처리법이 Hun Yen Kwoon이 쓴 "6. 스텐실 그림자 입체 이론"에 나와 있다. 이 글은 그림자 입체를 프로그래밍하는 다양한 방법에 관한 여러 부분들을 조망한다. 몇 분 안에 그림자 입체를 이식할 수 있는 여섯 개의 예제 프로그램을 통해 그림자 입체를 쉽게 구현할 수 있게 도와줄 것이다.\n\nATI의 렌더몽키는 셰이더 개발 툴로 프로그래머와 아티스트의 작업 부하를 줄이는 데 도움을 준다. 이 프로그램의 개발자 중 한 명인, Natalya Tatarchuk가 이것을 사용하는 방법과 어떠한 기능들이 있는지에 대해 설명한다.\n\n어느 곳에서도 잘 다루어지지 않지만 아트 파이프라인에서 기하적인 테이터를 제작하는 데 필수적인 주제가 셰이더-친화적인 모델이다. Gim Guan Chua가 이 작업에 관해 설명하고, 어떻게 그것을 수행하는지를 단계적으로 설명해준다.\n\n\n!! [[1. DirectX 고수준 셰이딩 언어 HLSL에 대한 소개]] \n ◇ Craig Peeper & Jason L. Mitchell\n\n 소개\n 간단한 예제\n 언어의 기초\n 내장 함수\n 셰이더 입력\n 셰이더 출력\n 셰이더의 적용 예\n 최적화\n D3DX Effect를 사용하여 엔진에 적용하기\n D3DX Effect를 사용하지 않고 엔진에 적용하기\n SDK 업데이트\n 결론\n 감사의 말\n\n\n!! [[2. Vs_3_0 및 ps_3_0 셰이더 모델 소개]]\n ◇ Nicolas Thibieroz, Kristof Beets, Aaron Burton\n\n 소개\n vs_3_0과 ps_3_0의 일반적인 기능\n vs_3_0의 기능\n ps_3_0 기능\n 결론\n 참고 자료\n\n\n!! [[3. Direct3D 9로 구현한 향상된 조명과 셰이딩]] \n ◇ Michal Valient\n\n 소개\n 픽셀 당 퐁(phong)\n 프레넬 항을 이용한 픽셀 당 환경 범프 매핑\n 진보적인 모델을 위한 배경 지식\n 오렌-나야르 모델\n 쿡-토르란스 모델\n 결론\n 참고 자료\n\n\n++++!!![4. 다양한 안개 효과 소개 (HLSL 샘플) ]\n◇ Markus Nuebel\n\n<html> <span style="font-size: 12px; "> <b> #. 소개 </b> </span> </html>\n+++!!!![#. 안개 계산 이면의 이론 ]\n(p.174) 안개 계산은 3개의 주요 매개변수로 이루어진다.\n\n▣ 안개 색 (C_Fog)\n▣ 농도 (g)\n▣ 거리 (d)\n\n(p.175) 거리 요인(d)을 결정하는 두 가지 일반적인 접근 방법으로 면 기준(plane-based)과 거리 기준(range-based)이 있다.\n\n▣ 면 기준 : 정점/ 픽셀의 카메라 공간 상 z-깊이를 거리 요인으로 사용한다. 계산 비용이 적은 방법이다.\n▣ 거리 기준 : 정점/ 픽셀과 카메라 상의 정확한 거리를 계산한다. 세계 공간이나 카메라 공간 어느 쪽에서도 계산할 수 있다. 이 방법은 일반적으로 제곱근 값으 구하기 때문에 계산 비용이 더 많다.\n===\n+++!!!![#. 기법 하나: 선형 안개 ]\n(p.177) 선형 안개는 여기서 논의되는 모든 방법 중 가장 간단한 계산이다. 선형 안개에서는 장면에 걸쳐 안개 입자가 균등하게 분포되어 있다고 가정한다.\n===\n+++!!!![#. 기법 둘: 지수 안개 ]\n(p.180) 안개는 장면의 한 점에서 시작하여 가상 카메라를 향하는 광선을 따라 빛의 세계가 감소함으로 인해 발생한다는 사실을 상기해볼 때, 지수 안개가 현실 세계 현상과 매우 많이 닮아있다는 것을 알 수 있다. 간략화된 모델에서는, 장면 전체에 걸쳐 일정한 안개 농도를 가정할 수 있다. 장면의 한 점에서 시작한 빛이 광선을 따라 여러 단계를 거쳐 움직이는데, 각각의 단계는 미리 정의된 단위 길이를 가진다고 생각해보자. 빛이 광선을 따라 첫 번째 단위를 지나쳤을 때, 빛의 세기는 상수 요소(정의된 농도에 따라)에 따라 감소한다. 다음 단위는 줄어든 빛의 세기로 시작해서, 앞의 광선에 적용된 똑같은 상수 감소 요소에 따라 감소한다.\n\n(p.181) 매우 작은 구획들로 선택해보면, 마침내는 지수적 양상을 보이고 이것은 자연 로그 함수를 사용하여 잘 시뮬레이션할 수 있다.\n===\n+++!!!![#. 기법 셋: 지수 제곱 안개 ]\n<html> <span style="font-size: 14px; "> <b> 안개 방정식 </b> </span> </html>\n(p.186) 응용프로그램에서 보면, 가상 카메라 주변에서는 넓은 범위에 완전히 선명한 시야를 가지고, Z_FogEnd를 향해 갈수록 농도가 매우 짙어진다.\n\n현 세대의 그래픽 하드웨어에서는, 좀 더 복잡한 지수 계산이 성능 상 큰 문제가 되지 않지만, 구 세대의 카드를 위한 셰이더를 짤 때는 눈에 띌 정도로 차이가 생길 수 있다는 것을 명심해야 한다.\n\n<html> <span style="font-size: 14px; "> <b> 구현 </b> </span> </html>\n(p.186) 물론, 구현은 지수 안개와 매우 유사하지만, 두 가지 큰 차이점을 지적할 만하다.\n\n첫째로, 거리 요소로 카메라 공간 z 깊이를 사용하지 않는다. \n둘째로, 안개 요소 계산에 추가의 곱셈을 포함하도록 변경하였다.\n===\n+++!!!![#. 기법 넷: 레이어 안개 ]\n<html> <span style="font-size: 14px; "> <b> 이론과 방정식 </b> </span> </html>\n(p.189) 이 부분에서는 간단한 종류의 입체 안개 효과인 레이어 안개를 살펴보겠다. 구현의 기반 이론은 "빠른 다중 레이어 안개"라는 논문에 근거하고 있다. cf. 참고 자료 Legakis, J., "Fast Multi-Layer Fog", ACM SIGGRAPH 98 Conference Abstracts and Appications, p.266\n\n레이어 안개의 기반이 되는 착상은 방정식을 확장하여 거리 요소뿐만이 아니라 높이 요소도 포함시키는 것이다.\n\n<html> <span style="font-size: 12px; "> <b> 셰이더 </b> </span> </html>\n(p.195) 처리되는 정점이 안개 상단 아래쪽일 경우에는, 두 개의 농도를 계산해야 한다. 첫째는 시점과 안개 상단 사이의 선을 계산해야 하고,\n둘째는 정점 높이와 안개 상단 사이의 선을 계산해야 한다. 최종 값은 이 두 농도의 차이로부터 나온다.\n===\n+++!!!![#. 기법 다섯: 움직이는 안개 ]\n<html> <span style="font-size: 14px; "> <b> 이론과 방정식 </b> </span> </html>\n(p.198) 움직이는 안개의 바탕이 되는 주 개념은 주기 함수를 통해 안개 방정식의 다양한 항인 흡수, 산란, 발산 같은 것들을 근사하는 데 있다. 이 방정식들에 가중치를 사용하고 전체 장면에 적용시킴으로서 결과적으로 비정규적인 안개 분포를 얻을 수 있다.\n\n주기 함수들의 도움으로, 안개에 대한 바람의 영향을 시뮬레이션 해주는 종류의 애니메이션을 추가하는 것은 쉽다. 애니메이션 설정 조정으로 심지어 바람의 속도와 방향에 의한 시뮬레이션 변화까지도 가능하다.\n===\n++++!!!![#. 결론 ]\n(p.202) 여기서 사용한 모든 픽셀 셰이더들은 단지 혼합 작용을 수행할 뿐이다. 안개 계산을 정점 셰이더에서 픽셀 셰이더로 옮기면 더 정확한 결과를 얻을 수 있다. 하지만 이것은 사안별로 추가되는 계산 비용(매 정점 대신에 매 픽셀별로 계산함으로 인해 발생하는)이 가치가 있는지에 근거해서 결정해야 한다. 일반적으로, 안개는 대부분 균등한 색들을 다루기 때문에 큰 차이를 느끼지 못할 것이다.\n\n또 다른 것은 논의한 셰이더에서의 상수 항 사용이다. 안개 기법을 정의하는 방정식에 직접 연결하기 위해서, 대부분의 셰이더는 내부에서 자체적으로 상수 항을 계산한다. 현실의 응용프로그램에 있어서는, 이것은 (물론) 시렁 상 맞지 않다. CPU에서 상수항을 미리 계산해서 프레임마다 GPU에 제공하는 것이 셰이더 프로그램의 매 실행마다 반복해서 계산하는 것보다 훨씬 더 효과적이다.\n\n마지막으로 언급할 만한 것은 안개 색을 다루는 법이다. 우리의 모든 셰이더는 상수 안개 색을 사용하지만, 추천 사항은 아니다. 정점이나 픽셀을 위한 안개 색을 판별하기 위해서 추가적인 계산을 함으로서 정말로 흥미롭고 재미있는 효과를 얻어서 당신의 응용프로그램에 최후의 한 획을 더할 수 있다.\n<br>\n===\n<html> <span style="font-size: 12px; "> <b> #. 참고 자료 </b> </span> </html>\n===\n++++!!![5. Direct3D 9로 구현한 그림자 매핑(Shader 2.0) ]\n◇ Michal Valient\n\n<html> <span style="font-size: 12px; "> <b> #. 소개 </b> </span> </html>\n<html> <span style="font-size: 12px; "> <b> #. 그림자 알고리즘(Shadow Algorithm) </b> </span> </html>\n<html> <span style="font-size: 12px; "> <b> #. 깊이 보정 문제 </b> </span> </html>\n+++!!!![#. 그림자 맵 필터링 ]\n(p.207) 이 알고리즘의 품질은 사용된 그림자 맵의 해상도에 의존하기 때문에, 텍스처가 작다면 그림자들이 거칠거나 계단 현상들을 보일 수 있다. 이런 문제들을 완벽하게 제거할 수 없지만, 자연스러운 그림자를 얻기 위해 맵을 필터링할 수는 있다. z 값을 바로 필터링하면 잘못된 결과가 나오기 때문에 PCF(Percent Closer Filter)이라는 특별환 알고리즘이 개발되었다.\n\n(p.208) 지금까지 PCF는 실시간으로 구현이 불가능했다(아니면 매우 제한적인 형태로 구현되었다). 하지만 Direct3D 9 덕택에, 이 작업을 픽셀 셰이더에서 할 수 있게 되었다.\n===\n++++!!!![#. 그림자 맵 생성을 위한 셰이더 ]\n(p.209) 이 단계에서 사용된 셰이더는 매우 간단하다. __정점 셰이더는 빛에 의해 생성된 절단 공간 및 세계 공간에 간단한 변환만을 가해준다. 그런 다음 실제 빛에서 대상까지의 거리를 계산하고, 이를 정규화한 뒤, 깊이 보정값을 적용(선택적)하고 출력한다. 픽셀 셰이더는 단순히 이 결과를 출력해주기만 한다.__\n\n+++[아래는 그림자 맵을 생성하는 정점 셰이더이다. ]\n{{{\nvs_2_0 //Shader version 2.0\n\n// 상수 레지스터들\n//---------------------------------- \n// c0-c3 - 세계 * 시야 * 투영 - 이번 경우에는 빛을 위하여 사용\n// c4-c7 - 전치된 세계 공간\n// c8 - 광원의 위치(세계 공간에서)\n// c9 - Z 범위 값들(ZNear, ZFar, 1/(ZFar-ZNear), DepthBias)\ndef c10, 0.5f, 0.0f, 0.0f, 0.0f\n\n// 입력 레지스터들\n//----------------------------------\ndcl_position v0\ndcl_normal v1 \ndcl_texcoord v2\ndcl_tangent v3\n\n// 아래의 코드는 위치와 텍스처의 좌표를 출력한다.\n//----------------------------------\nm4x4 oPos, v0, c0 // 정점 클립의 위치\nm4x4 r8, v0, c4 // 실제 공간으로 정점을 변환\n\n// 광원에서의 거리를 구한 뒤 (0~1) 사이의 값으로 정규화한다.\n//----------------------------------\nsub r0, c8, r8 // 광원에서 정점까지의 빛 벡터를 구한다.\ndp3 r1.x, r0, r0 // 길이의 제곱\npow r2.x, r1.x, c10.x // 앞에서 구한 값의 제곱근\nsub r3.x, r2.x, c9.x // Dst - ZNear\nmul r4.x, r3.x, c9.z // (Dst - ZNear)/(ZFar - ZNear) - 정규화된 위치\nadd r4.x, r4.x, c9.w // 보정 값을 더함, c9.w=0이면 보전 값을 적용하지 않음\nmov oT0, r4.x // 결과를 출력\n}}}\n===\n<br>\n(p.210) +++[아래는 그림자 맵을 생성하는 픽셀 셰이더이다. ]\n{{{\nps_2_0 //Shader version 2.0\n\n// 사용된 입력 레지스터\n//----------------------------------\ndcl t0 // 픽셀의 농담(진하기)\n\n// Output value\n//----------------------------------\nmov r0, t0 // 부동 소수점 Z 값을 일어온다.\nmov oC0, r0 // 색 출력\n}}}\n===\n===\n++++!!!![#. 최종 렌더링을 위한 셰이더 ]\n(p.211) 픽셀 셰이더는 64개라는 명령어 범위 안에서 최대의 효과를 내기 위하여 매우 최적화 되어 있다. 정점 셰이더는 "3. Direct3D 9로 구현한 향상된 조명과 셰이딩"에서 퐁 조명의 부가적인 거리 계산을 위하여 사용된 것과 동일하다.\n\n+++[다음은 그림자를 렌더링하는 정점 셰이더 2.0 모델이다. ]\n{{{\nvs_2_0 //Shader version 2.0\n\n// 상수 레지스터들\n//---------------------------------- \n// c0-c3 - 전치된 세계 공간\n// c4-c7 - 세계 * 시야 * 투영\n// c8 - 조명 위치(세계 공간에서) \n// c9 - 시점 위치(세계 공간에서)\n// c10-c13 - 점적광 투영 행렬\n// c14 - c14.w = 05. 빛의 Z 값 범위 (for 그림자 맵 생성)\n\n// 입력 레지스터들\n//----------------------------------\ndcl_position v0\ndcl_normal v1 \ndcl_texcoord v2\ndcl_tangent v3\n\n// 출력\n//----------------------------------\n// oT0 - 텍스처 좌표\n// oT1 - 빛 벡터(접선 공간에서)\n// oT2 - 시선 벡터(접선 공간에서)\n// oT3 - 투영된 점광원 텍스처 좌표\n// oT4 - 광원에서의 거리 (for 그림자 맵 생성)\n\n// 좌표와 텍스처 좌표계 출력\n//----------------------------------\nm4x4 oPos, v0, c4 // 정점 절단 위치\nmov oT0.xy, v2.xy // 색 텍스처를 위한 텍스처 좌표\nm4x4 r8, v0, c0 // 정점을 세계 공간으로 변환\n\n// 접선 공간의 기저 벡터 생성\n//----------------------------------\nm3x3 r11.xyz, v1, c0 // 법선 N을 실제 공간으로 변환\nmov r11.w, v1.w\nm3x3 r9.xyz, v3, c0 // 접선 T을 실제 공간으로 변환\nmov r9.w, v3.w\ncrs r10.xyz, r9, r11 // 외적 - 종법선 B=NxT\n\n// 빛 벡터, 관찰자 벡터, 투영자의 텍스처 좌표를 계산\n//----------------------------------\nsub r0, c8, r8 // 광원에서 정점까지의 빛 벡터 구현\nnrm r1, r0 // 벡터 정규화\nm3x3 oT1.xyz, r1, r9 // NxT 벡터를 접선 공간으로 변환\n\nsub r0, c9, r8 // 정점에서 카메라까지의 관찰자 벡터 구현\nnrm r1, r0 // 벡터 정규화\nm3x3 oT2.xyz, r1, r9 // NxT 벡터를 접선 공간으로 변환\n\nm4x4 oT3.xyzw, v0, c10 // 투영된 텍스처 좌표계의 계산\n\n// 빛으로부터의 거리를 계산한 후 (0~1) 사이로 정규화 (for 그림자 맵 생성)\n//----------------------------------\nsub r0, c8, r8 // 광원에서 정점까지의 빛 벡터를 구현\ndp3 r1.x, r0, r0 // 벡터^2의 길이\npow r2.x, r1.x, c14.w // sqrt(길이^2)\nsub r3.x, r2.x, c14.x // Dst - ZNear\nmul r4.x, r3.x, c14.z // (Dst - ZNear)/(ZFar - ZNear) 정규화된 위치\nmov oT4, r4.x // 결과를 출력\n}}}\n===\n\n(p.212)\n+++[아래는 그림자를 렌더링하는 픽셀 셰이더 2.0 모델이다. ]\n{{{\nps_2_0 //Shader version 2.0\n\n// 1 - 상수 레지스터\n//---------------------------------- \n// c0 - 분산 텍스처 곱수(조명 색과 곱해진 것)\n// c1 - 반영 텍스처 곱스(조명 색과 곱해진 것)\n// c2 - 반영 광택(shi, shi, shi, 1.0f)\n// c3 - 그림자 텍셀 보정 값(x,y)과 텍스처 가로/세로(z,w)\n// c4 - c11 - 3x3 필터링 커널\n// c29 - 텍스처 가로/세로(x,y)\n// c30 - 텍셀 divider - 1 / texels_in_kernel(이 경우는 4)\ndef c31, 2.0f, 1.0f, 0.0f, 4.0f // 헬퍼 상수\n\n// 1 - 입력 레지스터\n//----------------------------------\ndcl t0.xy // 텍스처 좌표\ndcl t1.xyz // 빛 벡터\ndcl t2.xyz // 관찰자 벡터\ndcl t3.xyzw // 투영 텍스처 좌표계\ndcl t4.xyzw // 정규화된 빛으로부터 거리\n\n// 1 - 텍스처 샘플러\n//----------------------------------\ndcl_2d s0 // (알파에서 글로스) 분산 텍스처\ndcl_2d s1 // 법선 텍스처\ndcl_2d s2 // 그림자 맵\ndcl_2d s3 // 점적광 텍스처\n\n// 2 - 실제 픽셀의 그림자 텍스처를 위한 좌표 계산\n//----------------------------------\nrcp r11, t3.w // 투영 분할을 위한 1/w\nmad r0, t3, r11, c3 // 텍스처 좌표계를 구현(중점 보정된)\ntexld r11, r0, s2 // 샘플 그림자\n\n// 3 - 나머지 3x3 필터링 커널을 위한 좌표 계산\n//----------------------------------\nadd r10, c4, r0 // 좌측 열\nadd r9, c5, r0\nadd r8, c6, r0\n\nadd r7, c7, r0 // 중앙 열\nadd r6, r8, r0\n\nadd r5, c9, r0 // 우측 열\nadd r4, c10, r0\nadd r3, c11, r0\n\n// 4 - 3x3 필터링 커널을 채움\n//----------------------------------\ntexld r10, r10, s2 // 좌측 열\ntexld r9, r9, s2\ntexld r8, r8, s2\n\ntexld r7, r7, s2 // 중앙 열\ntexld r6, r6, s2\n\ntexld r5, r5, s2 // 우측 열\ntexld r4, r4, s2\ntexld r3, r3, s2\n\n// 5 - 거리 비교 - 3x3 이진 커널 획득\n//----------------------------------\nsub r10.x, t4.x, r10.x // 좌측 열\nsub r10.y, t4.x, r9.x\nsub r10.z, t4.x, r8.x\ncmp r1.xyz, r10, c30.g, c30.r // 거리 비교\n\nsub r9.x, t4.x, r7.x // 중앙 열\nsub r9.y, t4.x, r11.x\nsub r9.z, t4.x, r6.x\ncmp r2.xyz, r9, c30.g, c30.r // 거리 비교\n\nsub r8.x, t4.x, r5.x // 우측 열\nsub r8.y, t4.x, r4.x\nsub r8.z, t4.x, r3.x\ncmp r3.xyz, r8, c30.g, c30.r // 거리 비교\n\n// 6 - 3x3 이진 커널의 이선형 필터링\n//----------------------------------\nmul r0, r0, c29 // 텍스처 상의 좌표계 획득\nfrc r0, r0 // 소수 부 획득\n\nlrp r10.xyz, r0.x, r2, r1 // 1, 2열의 보간\nlrp r11.xyz, r0.x, r3, r2 // 2, 3열의 보간\n\nlrp r3.x, r0.y, r10.y, r10.x // 1열과 1행의 보간\nlrp r3.y, r0.y, r10.z, r10.y // 1열과 2행의 보간\nlrp r3.z, r0.y, r11.y, r11.x // 2열과 1행의 보간\nlrp r3.w, r0.y, r11.z, r11.y // 2열과 2행의 보간\n\ndp4 r8.x, r3, c31.g\n\n// 7 - 필요한 벡터를 설정 - 읽어서 정규화\n//----------------------------------\ntexld r0, t0, s1 // 법선 벡터를 읽음\nmad r1, r0, c31.r, -c31.g // 법선 벡터 값을 -1, 1 사이 값으로 조정\nnrm r11, r1 // r11 = 정규화된 법선 벡터\nmov r1.xyz, t1\nnrm r10, r1 // r10 = 정규화된 광원 벡터\nmov r1.xyz, t2\nnrm r9, r1 // r9 = 정규화된 시선 벡터\n\n// 8 - 분산 색과 반영 색 계산\n//----------------------------------\ndp3 r0, r11, r10 // r0 = (n.l)\nmul r1, r0, c31.r // r1.g = 2*(n.l)\nmad r1, r1, r11, -r10 // r1 = 반사 벡터 r1을 계산\n // 2(n.l)n - 1\ndp3_sat r1, r1, r9 // r1 = (r.v)\npow r0.g, r1.r, c2.r // r1 = (r.v)^shi\ncmp r0, r0.r, r0, c31.b // (n.l)<0 이라면 조명을 적용하지 않는다.\n\n// 9 - 계산된 세기로 텍스처를 곱합\n//----------------------------------\ntexld r6, t0, s0 // 분산 텍스처를 읽음(알파에서는 광택 맵이다.)\ntexldp r4, t3, s3 // 투영 텍스처(원근 수저된)를 읽음\nmul r2, r6.a, r0.g // 반영 정도를 광택 맵으로 반사도를 곱함\nmul r2, r2, c1 // ... 재질의 반영 색과 빛의 색\nmul r3, r6, r0.r // 분산 정도를 텍스처와 곱...\nmad r0, r3, c0, r2 // ... 재질의 분산 색과 빛의 색을 적용\n\n // 반사를 더함\nmul r0, r0, r4 // 점적광 텍스처를 곱하고\nmul r0, r0, r8.x // 음영을 추가하여 변환\n\nmov oC0, r0 // 색깔 출력\n}}}\n===\n<br>\n(p.215) 셰이더의 두 번째 부분에서는 그림자 맵 텍스처의 좌표를 계산하고 있다. 정점 셰이더에서 계산된 이 값들을 가지고 원근이 고려된 텍스처 룩업을 해야 한다. 적절한 음영을 만들기 위해서는 텍스처 좌표가 정확히 텍셀의 중점을 가리키도록 조정해야 하고, 이 값을 다음 섹션에서 나머지 8개의 좌표를 얻어서 커널 생성을 완성시키기 위해 사용해야 한다. 이 때문에 이것을 단순한 texldp 대신에 수동으로, w로 나누어주고 그것에 texld를 적용시키는 것이다. 이 계산을 mad 명령어가 해주는데, 1/w로 곱하고 0.5/shadow_map_size 만큼을 더해준다.\n\n(p.216) 셰이더의 마지막 부분은 "Direct3D 9로 구현된 향상된 조명과 셰이딩"에서 소개된 픽셀 단위의 퐁 조명을 수행한다. 단 차이가 있다면 조명 결과를 그림자로 곱한 것 정도이다.\n===\n<html> <span style="font-size: 12px; "> <b> #. 결론 </b> </span> </html>\n(p.217) Direct3D 9의 기능을 이용하여 고정 그림자 맵 알고리즘을 변형하면, 자연스러운 그림자를 얻을 수 있고, 깊이 보정으로 인해 생긴 문제를 최소화할 수 있다. PCF로 만들어진 3x3 이진 커널에서의 이선형 필터링으로, 저해상도의 그림자 맵에서도 매우 자연스러운 그림자를 만들 수 있게 되었다. 뒷면 그림자 맵 기법으로 깊이 비교 시에 발생하는 오류를 최소화하고, 더 낮은 깊이 맵을 사용할 수 있게 되었다. 이것은 깊이 정보를 해석하기 위해여 두 개의 8비트 채널로 구성된 텍스처들를 사용하는 Direct3D 8 지원 하드웨어 입장에서는 매우 중요하다.\n\n<html> <span style="font-size: 12px; "> <b> #. 참고 자료 </b> </span> </html>\n===\n!! [[6. 스텐실 그림자 입체 이론]] \n ◇ Hun Yen Kwoon\n\n 소개\n 그림자 입체의 개념\n 문제와 해법\n CPU에서의 실행\n GPU(셰이더)에서의 실행\n DirectX 9 HLSL 샘플\n 효율과 견고함\n 결론\n 참고 자료\n\n!![[7. 렌더몽키를 사용한 셰이더 개발]]\n ◇ Natalya Tatarchuk\n\n개개의 렌더몽키 시각 효과 조합들은 하나의 단일한 XML 작업 공간으로 캡슐화한다. 개개의 효과를 다시 만드는 데 필요한 모든 정보 중 실제 텍스처와 모델 데이터를 빼고는 모두 이 하나의 XML 파일에 저장된다. (*.rfx)\n\n 소개\n IDE 개괄\n 기본 조명 효과 제작\n 실행 시간 데이터베이스 개괄\n 픽셀과 정점 셰이더들\n 렌더 스테이트 블록 관리\n 렌더몽키에서의 텍스처링\n 텍스처에 렌더링하기\n 렌더 가능한 텍스처 편집\n 요약\n\n++++!!![8. 셰이더 친화적 3D 모델 제작을 위한 팁 ]\n◇ Gim Guan Chua\n+++!!!![#. 소개 ]\n(p.344) 접선 기저(tangent basis)나 범프 매핑 등의 사용에 관한 더 많은 정보는 nVidia의 "CG로 배우는 셰이더 프로그래밍"(정보문화사 번역 출간)을 참조\n\n보통 3D 모델 데이터는 법선과 텍스처 좌표들의 정보만 가지고 있어서, 접선이나 종법선은 법선과 텍스쳐 좌표를 이용해 자동으로 만들어내곤 했다(접선 기저는 법선, 종법선 그리고 접선으로 구성된다). 이 방법은 편리하고 효과적이지만, 때때로 마람직하지 않은 가공물을 만들어 낸다. 이것은 다음과 같은 요소 때문이다.\n\n▣ 적절한 텍스처 좌표들이 필요하다.\n▣ "정점 가중치"나, 같은 정점이 공유하는 삼각형 수에 영향을 받는다.\n▣ 볼록한 표면을 가진 모델에는 이상적이지만 오목하거나 돌출한 모델에서는 문제가 나타난다.\n<br>\n===\n<html> <span style="font-size: 12px; "> <b> #. 적절한 텍스처 좌표 생성하기 </b> </span> </html>\n+++!!!![#. "정점 가중치"의 영향 ]\n(p.345) 만약 한 정점이 많이 삼각형에 의해 공유되면, 보다 많은 삼각형들이 그 정점의 접선 기저에 영향을 미친다. 이상적인 메쉬는 삼각형 스트립 같은 것으로 정점들을 균일하게 공유한다. 그렇지만 메쉬는 종종 고차 폴리곤(사각형, 오각형 등)으로부터 삼각형들로 자동 분할(auto-tesselate)되고, 이 과정에서 공유하는 정점의 균일 분포 등은 고려하지 않는다. \n이것을 극복하는 방법은 ''선택적으로 문제 영역을 재분할(re-tesselate)''하는 것이다.\n===\n+++!!!![#. 비볼록(Non-Convex) 평면의 문제 ]\n(p.347) 오목하거나 튀어나온 복잡한 모델들은 종종 접선 기저를 엉망으로 만든다. 이것 역시 정점 가중치 효과가 원인이다.\n\n이 문제를 해결하기 위한 3가지 방법이 있다.\n\n▣ 법선, 접선 그리고 종법선들을 수정할 수 있는 모델링 도구를 사용한다. 몇몇 도구에서는 법선 수정을 지원하지만, 접선, 종법선 수정은 드물다.\n▣ 모델을 분리시킨다... (분리된) 두 메쉬 간에 완전히 불연속이다.\n▣ 추가 분할로 불연속 효과를 완충시키거나 부드럽게 한다... (결과적으로 수정된 메쉬는) 실제로 약간의 연속성을 보존한다.\n===\n++++!!!![#. 결론 ]\n(p.349) 이 3가지 방법(적합한 텍스처 좌표 생성, 정점 가중치를 좀 더 균등하게 하기 위한 재분할 그리고 불연속 효과를 완화시키기 위한 완충 분할(buffered tesselation)의 조합은 범프 맵, 반영 하이라이트 그리고 다른 접선 기저에 의존적인 효과들을 바르게 렌더링할 수 잇는 복잡한 모델을 만드는 데 효과적이다. \n모델링 도구나 셰이더를 바꾸어야 할 필요는 없다. 대신, 모델러의 임무로 모델을 셰이더-친화적으로 만들기 위해 좀 더 많은 작업이 요구될 뿐이다.\n===\n===\n\n\n!!!찾아보기 \n
출처 ; 가끔은 격하게 외로워야 한다 - 김정운\n\n''인간의 동기를 두 가지 측면으로 나눈 것'' (심리학자 토리 히긴스)\n\n접근동기는 자신이 원하는 목적에 접근하기 위해 열심히 노력하는 것을 말하고 (cf. me/ 긴 시간)\n회피동기는 반대로 자신이 싫어하는 대상으로부터 벗어나기 위해 애쓰는 것을 말한다. (cf. we/ 짧은 시간)\n\n{{wrappingClass{ex. 공부 열심히 해야 성공할 수 있어! / 좋은 학교에 가지 않으면 낙오자가 되는거야! }}}\n\n일의 결과가 바로 나타나는 것은 회피동기("그렇게 하면 손해를 본다"),\n결과가 나중에 나오는 것은 접근동기("그렇게 해야 성공한다")로 각각 설명해야 유리하다.\n\n{{wrappingClass{ex. 은퇴설계 보험을 권할 경우 풍요로운 노년의 삶을 보여줘야 한다. (접근동기를 자극) \n은퇴설계를 제대로 하지 않았을 경우 요양원에서 늙고 병들어 가는 모습을 보여주며 회피동기에 호소하는 방법은 그리 효과가 없다.\n왜냐하면 먼 훗날의 일이기 때문. \n반대로 규칙을 지키지 않으면 사고가 일어나는 일처럼 당장 눈앞의 일은 회피동기를 자극해야 효과가 있다. }}}\n\n접근동기는 상상력을 자극하고, 회피동기는 일을 치밀하게 한다.\n창조적 능력을 발휘시키려면 긍정적인 정서를 유발시키는 접근동기를 자극해야 하고 (놀듯이 일해야 창의성이 자극됨),\n치밀함과 정확성을 요구하는 일은 회피동기를 자극해야 한다. (제대로 처리하지 않으면 큰일난다!는 식)\n\n한국에 애플같은 회사가 나오지 않는 이유...가 설명되는 이론.\n
원문 ; http://blog.bagesoft.com/254\n\n해당 프로그램을 직접 실행해 봐야 할 것 같은데.....\n일단 이런 것들을 확인해보세요.\n \n1. debug와 Release모드에서의 Project Setting을 확인해보세요.\n라이브러를 include해주는 부분에 차이가 날 수 있구요...\n\n2. 혹시 직접제작한 라이브러리 이외의 라이브러리를 사용하신다면 \n그 라이브러리가 Debug모드와 Release모드에서 모두 동작하는 지 확인해보세요.\n\n3. 경고는 뜨지 않지만 함수의 호출이 잘 못되어 있는 경우가 있을 수 있습니다.\nDebug모드에서는 자동으로 강제로 변환해주지만, Release에서는 안되는 경우가 있습니다. ( 이경우에는 닷넷에서 컴파일해보면 경고로 뜹니다.)\n \n4. 포인트변수의 초기화가 이루어지지 않은 경우.\n포인트변수의 초기화를 해두지 않고 메모리만 할당해 놓은 상태라면 debug모드에서는 자동으로 초기화되는 경우가 있지만, Release에서는 초기화가 되지를 않습니다.\n \n5. 다른 클래스에서 사용하는 전역변수의 경우에 Debug모드에서는 잘 찾아가지만, Release모드에서는 찾지 못하는 경우가 발생하기도 합니다. \n\n6. 마지막으로 실행되는 순서입니다. \n프로그램을 하다보면, 스레드나, 메시지를 많이 사용하게 되는데, 그 순서가 바뀌는 경우가 있습니다. \n\n예전에 약간 경험했던 황당했던 기억을 되살려서 정리했는데, \n참고가 되시길.....
!!!#. 상수 레지스터 설정\n1. DirectX9\n{{{\n// constant registers ; c0.x = 0, c0.y = 1, c0.z = 2, c0.w = 3.0f\nD3DXVECTOR4 vCon(0.0f, 1.0f, 2.0f, 3.0f);\nm_pd3dDevice->SetVertexShaderConstantF(0, (float*)&vCon, 1);\n}}}\n \n2. DirectX8 \n{{{\n// Common constants\nfloat c[4] = {0.0f,1.0f,2.0f,3.0f}; // c0의 .x=0, .y=1, .z=2, .w=3.0f 으로 저장\n\nDWORD dwDeclCOLOR[] =\n{\n D3DVSD_STREAM(0),\n D3DVSD_REG(D3DVSDE_POSITION, D3DVSDT_FLOAT3 ), \n D3DVSD_REG(D3DVSDE_NORMAL, D3DVSDT_FLOAT3 ), \n D3DVSD_REG(D3DVSDE_DIFFUSE, D3DVSDT_D3DCOLOR), \n D3DVSD_REG(D3DVSDE_TEXCOORD0, D3DVSDT_FLOAT2 ), \n D3DVSD_CONST(0,1),*(DWORD*)&c[0],*(DWORD*)&c[1],*(DWORD*)&c[2],*(DWORD*)&c[3],\n D3DVSD_END() \n};\n}}}\n\n<html> <span style="font-size: 14px;"> <b> ■ dcl_?(usage)? : Source sampler declarations </b></span> </html>\n|| Vertex element semantics\n+++[// typedef enum 3DDECLUSAGE //-------------------------- ]\n{{{\ntypedef enum _D3DDECLUSAGE\n{\n D3DDECLUSAGE_POSITION = 0, // dcl_position\n D3DDECLUSAGE_BLENDWEIGHT = 1, // dcl_blendweight\n D3DDECLUSAGE_BLENDINDICES = 2, // dcl_blendindices\n D3DDECLUSAGE_NORMAL = 3, // dcl_normal\n D3DDECLUSAGE_PSIZE = 4, // dcl_psize\n D3DDECLUSAGE_TEXCOORD = 5, // dcl_texcoord\n D3DDECLUSAGE_TANGENT = 6, // dcl_tangent\n D3DDECLUSAGE_BINORMAL = 7, // dcl_binormal\n D3DDECLUSAGE_TESSFACTOR = 8, // dcl_tessfactor\n D3DDECLUSAGE_POSITIONT = 9, // dcl_positiont\n D3DDECLUSAGE_COLOR = 10, // dcl_color\n D3DDECLUSAGE_FOG = 11, // dcl_fog\n D3DDECLUSAGE_DEPTH = 12, // dcl_depth\n D3DDECLUSAGE_SAMPLE = 13, // dcl_sample\n} D3DDECLUSAGE;\n}}}\n===\n\n\n<html> <span style="font-size: 14px;"> <b> ■ D3DVERTEXELEMENT9 vertElements[]; </b></span> </html>\n{{{\nD3DVERTEXELEMENT9 vertElements[] = \n{ \n { 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 }, \n { 0, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0 },\n { 0, 24, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 }, \n D3DDECL_END() \n};\n}}}\n/ 첫번째 parameter ; stream 설정\n/ 두번째 parameter ; 해당 stream에서 몇번째 byte부터 data가 시작한다는 의미\n\n첫번째 설정에서 D3DDECLTYPE_FLOAT3이기 때문에 3 * 4byte = 12 byte 데이터로 정의 (∵ float = 4byte)\n\n<html> <span style="font-size: 14px;"> <b> ■ LPDIRECT3DVERTEXDECLARATION9 m_pVertexDeclaration; </b></span> </html>\n''Shader Declarations''\nLoading data in the constant memory at the time that a shader is set as the current shader. \nBinding stream data to vertex shader input registers. \n\n1.정의\nLPDIRECT3DVERTEXDECLARATION9 m_pVertexDeclaration;\n\n2.초기화\nm_pVertexDeclaration = NULL;\n\n3.설정\n{{{\n// Create the shader declaration.\nD3DVERTEXELEMENT9 decl[] =\n{\n { 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 },\n { 0, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0 },\n { 0, 24, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 },\n D3DDECL_END()\n};\n\nm_pd3dDevice->CreateVertexDeclaration(decl, &m_pVertexDeclaration);\n}}}\n4.사용(렌더링)\n{{{\n// Begin the scene\nif (SUCCEEDED(m_pd3dDevice->BeginScene()))\n{\n...\n // m_pd3dDevice->SetFVF(D3DFVF_VERTEX);\n m_pd3dDevice->SetVertexDeclaration(m_pVertexDeclaration);\n...\n // End the scene.\n m_pd3dDevice->EndScene();\n}\n}}}\n5.해제\nSAFE_RELEASE(m_pVertexDeclaration);\n\n※ 참고\n{{{\nstruct VERTEX\n{\n FLOAT x, y, z; // The untransformed position for the vertex\n FLOAT nx, ny, nz;\n FLOAT u, v;\n};\n\n// set custom FVF macro\n#define D3DFVF_VERTEX (D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX2)\n}}}\n\n\n\n\n
!! 분류\n''BI | 비즈니스 인텔리전스 (Business Intelligence)''\n기업에서 데이터를 수집, 정리, 분석하고 활용하여 효율적인 의사결정을 할 수 있는 방법에 대해 연구하는 학문이다.\n기업의 비전을 달성하기 위하여 비즈니스의 전략을 효율적이고 효과적으로 지원하여 각 조직의 구성원(종업원, 중간 관리자, 의사결정자 등)에게 적시에 의사결정을 할 수 있도록 지원하는 정보체계라고 정의하기도 한다.\n\n''UC | 통합 커뮤니케이션 (Unified communications)''\n전화, 팩스, 이메일, 핸드폰, 메신저, 영상통화, 음성메일 등 기업 내 다양한 커뮤니케이션 도구를 단일한 플랫폼을 통해 제공하는 것을 말한다.\n\n\n\n\n!! 기업 정보\n<html> <span style="font-size: 14px; color:#BE8C3C "> <b>(주)유비베이스 </b> </span> </html> (www.ubibase.com) / UC\n마이크로소프트 기반의 통합커뮤니케이션(UC) 분야의 기업. <br> 고객들이 마이크로소프트 제품을 제대로 구축하고 활용할 수 있도록 솔루션 구축, 개발은 물론 유지, 보수, 운용까지 토털 맞춤형으로 서비스하고 있으며, 마이크로소프트 Azure 기반의 오피스 365, CRM 등 클라우드 기반의 시스템 구축 및 확장성을 위한 자체 솔루션을 개발하여 제공.\n\n
세렌디피티 (Serendipity)는 단어의 어원은 옛 페르시아의 우화 '세렌딥의 세 왕자(The Three Princes of Serendip)'에서 유래, 보물을 찾아 먼 여행을 떠난 인도의 세 왕자가 자신들이 원하던 것은 얻을 수 없었지만 뜻밖의 사건을 통해 인생을 살아가는 데 필요한 지혜와 용기를 자신들의 마음 속에서 찾아낸다는 이야기이다. \n\n18세기 영국의 호레이스 월폴 (Horace Walpole)이라는 작가가 그의 친구들에게 편지를 보내면서 그 당시에는 신조어였을 이 단어를 처음 사용하게 되면서 세상에 널리 알려지게 되었다고 한다. \n\n요즈음에 와서 ‘세렌디피티’라는 단어는 __생각지도 못한 것을 우연히 발견하는 능력, 열심히 일하는 행복 속에서 찾아오는 행운, 행운을 불러오는 힘이나 능력 등의 의미로 폭넓게 사용되고 있는데 최근 특히 과학분야에서 실험 도중에 실패해서 얻은 결과에서 중대한 발견 또는 발명을 하는 것을 말한다.__\n\n그 가장 대표적인 사례로 플레밍의 페니실린 발견을 들 수 있다. 플레밍이 배양실험을 하는 도중에 실수로 잡균인 푸른곰팡이를 혼입한 것이 후에 감염증으로부터 수많은 사람들을 구해낸 항생물질을 발견하게 된 사건이 된 것이다. 그리고 또 감마선 폭발의 경우도 대표적이다. 핵실험 감시위성인 벨라 위성은 지상에서 나오는 핵실험의 감마선대신, 우주에서 나오는 감마선을 포착하게 되는데 과학자들은 이 경우를 조사하다가 감마선 폭발을 발견하게 되었다. 또한 이런 실수들은 전자렌지(초단파는 2차대전당시에는 비밀무기에 속했다.)나 3M사의 포스트잇 메모지(이것 역시 시작은 초강력접착제였다.) 같은 상품을 만들게 된 계기가 되기도 했다.\n\n
!! PART 1 셰이더 프로그래밍 입문\n++++!!![1. 정점 셰이더의 기초 ]\n◇ 볼프강 F. 엥겔 (Wolfgang F. Engel)\n+++!!!![# 정점 셰이더 아키텍처 ]\n| | |정점 입력 <br> 128 비트 == float 4개 <br> 항목 16개 | | |\n| | | ↓ | | |\n|레지스터들 <br> 128 비트 == float 4개 <br> 항목 12개 |→ <br> ← |정점 셰이더 <br> <br> 명령 128개 | <br> → / AD / → <br> ────> <br> <──── <br> <br> <br> <br> |상수메모리 <br> 주소 <br> 데이터 <br> 128 비트 == float 4개 <br> RADEON 8500: <br> 항목 192개 |\n| | | ↓ | | |\n| | |정점 출력 <br> 128 비트 == float 4개 <br> 항목 12개 | | |\n| | | ↓ | | |\n(p.044) 정점 셰이더의 모든 데이터는 네 개의 float들의 묶음으로 표현된다 (4X32 = 128 비트).\n\n하드웨어 정점 셰이더에서 하나의 명령은 네 개의 32 비트 변수들에 동시에 영향을 미치는데, 이는 전형적인 SIMD(Single Instruction Multiple Data) 프로세서와 같은 특징이다.\n\n(p.045) 정점 입력 데이터로... 정점의 위치, 법선, 분산 및 반영색, 안개 좌표, 점의 크기, 여러 텍스처들의 좌표들을 담는다. \n\n|!레지스터들 |!레지스터 개수 |!속성 |\n|입력 (v0-v15) |16 |RO1, 읽기 전용 |\n|출력 (o*) |Geforce 3/4TI: 9; RADEON 8500: 11 |WO, 쓰기 전용 |\n|상수 (c0-c95) |vs.1.1 표준: 96; RADEON 8500: 192 |RO1 |\n|임시 (r0-r11) |12 |R1W3 |\n|주소 (a0.x) |1 (vs.1.1 이상) |WO (mow의 경우에는 W) |\n(p.046) 입력 레지스터는 읽기 전용이고 출력 레지스터는 쓰기 전용이라는 점에서, 정점 셰이더 아키텍처는 스트리밍 구조이다. \n=== +++!!!![# 정점 셰이더 프로그래밍의 개요 ]\n<html> <span style="font-size: 12px;"> <b> 정점 셰이더 지원 여부 확인 </b> </span> </html>\n(p.047) 다음은 정점 셰이더 버전 1.1 지원 여부를 점검하는 코드이다.\nif ( pCaps->VertexShaderVersion < D3DVS_VERSION(1.1) )\n return E_FAIL;\n\n|!버전 |!기능성 |\n|0.0 |DirectX 7 |\n|1.0 |DirectX 8, 단 주소 레지스터 a0이 없음 |\n|1.1 |DirectX 8과 DirectX 8.1, 하나의 주소 레지스터 a0이 존재 |\n|2.0 |DirectX 9 |\n\n<html> <span style="font-size: 12px;"> <b> 정점 셰이더의 작성 및 컴파일 </b> </span> </html>\n(p.057) 정점 셰이더 ALU(Arithmetic Logic Unit)는 부동소수점 수 네 개의 묶음에 대해 작동하는 다중 스레딩 방식의 벡터 프로세서이다. ALU는 두 개의 유닛들로 구성된다. 하나는 ''SIMD Vector Unit''으로, 이것은 mov, mul, add, mad, dp3, dp4, min, max, slt, sge 명령들을 처리한다. 또 하나는 ''Special Function Unit''으로, rcp, rsq, logp, expp, lit 명령들을 처리한다. 이 명령들의 실행 사이클은 대부분 1이나, rcp와 rsq의 경우 특정 조건 하에서 2 사이클 이상을 소비하게 된다. 이들은 정점 셰이더 안에서는 오직 하나의 슬롯만을 차지하지만, 결과가 즉시 쓰이는 경우 레지스터 막힘(stall) 때문에 실제로는 2 사이클 이상을 소비한다.\n\n<html> <span style="font-size: 12px;"> <b> 정점 셰이더의 복합 명령들 </b> </span> </html>\n(p.058) 필요하다면 네 개의 dp4 명령들을 하나의 m4X4로 대체하는 것이 이득이 될 수도 있다. 셰이더에서 m4X4 명령을 사용하기로 했다면, 이후 동일한 데이터에 대해 dp4를 사용하지 말아야 한다. 그래야 불필요한 문제나 성능 하락을 피할 수 있다. 에를 들어 한 셰이더 안에서 위치 계산을 위해 m4X4와 dp4를 모두 사용한다면 z 타툼(z-fighting)이 생길 수도 있다.\n\n<html> <span style="font-size: 12px;"> <b> 기본적인 사용 방법 </b> </span> </html>\n\n''입력 레지스터의 사용 ''\n(p.059) 16개 입력 레지스터들ㅇ느 v0-v15까지의 이름들로 접근할 수 있다. 일반적으로 입력 레지스터에는 다음과 같은 값들이 설정된다.\n\n▣ 위치 (x, y, z, w)\n▣ 분산색 (r, g, b, a) - 0.0에서 _1.0\n▣ 반영색 (r, g, b, a) - 0.0에서 _1.0\n▣ 최대 8개의 텍스처 좌표들 (각각 s, t, r, q or u, v, w, q).\n 구체적인 개수는 하드웨어마다 다르며, 일반적으로 4에서 6개이다.\n▣ 안개 (f, *, *, *) - 안개 공식에 쓰이는 값\n▣ 점의 크기 (p, *, *, *)\n\n''상수 레지스터의 사용 ''\n(p.060) 상수 레지스터들은 주로 다음과 같은 데이터를 담는 데 쓰인다.\n\n▣ 행렬 데이터 - 4X4 행렬의 각 행(row)을 하나의 상수 레지스터(float 4개)에 담는다.\n▣ 조명 특성들 (위치, 감쇠 등)\n▣ 현재 시간\n▣ 정점 보간 데이터\n▣ 절차적 데이터\n\n상수를 저장하는 데 사용할 수 있는 상수 레지스터는 총 96개(RADEON 8500의 경우 192개)이다. 행렬로 치면 총 24개(또는 48개)의 행렬을 담을 수 있는 크기인데, 이 정도면 예를 들어 색인화도니 정점 혼합 (흔히 "행렬 팔레트 스키닝"이라고 하는 것)을 처리하기에도 충분하다.\n\n정점 셰이더의 입장에서 상수 레지스터들은 읽기 전용이다. 반면 응용 프로그램은 상수 레지스터들을 쓸 수도 읽을 수도 있다. 상수 레지스터들의 수명은 하나의 정점 셰이더의 수명보다 길며, 따라서 한 정점 셰이더에서 사용한 상수 레지스터들을 그 다음의 정점 셰이더에서 재사용하는 것이 가능하다.\n \n''주소 레지스터의 사용 ''\n(p.061) 주소 레지스터들은 a0에서 an이다(정점 셰이더 버전이 1.1보다 높을 경우 주소 레지스터가 여러 개일 수 있다). vs.1.1.에서는 a0뿐이며, 이 경우 a0은 상수 메모리의 오프셋을 위한 간접 주소지정 연사자로만 쓰인다.\n\n레지스터 a0은 정수만을 담으며 a0에서 사용할 수 있는 성분은 a0.x뿐임을 주의하기 바란다. 또한 정점 셰이더 안에서 a0.x의 값을 설정할 수 있는 방법은 mov 명령뿐이다.\n\n''임시 레지스터의 사용 ''\n(p.062) 임시 레지스터는 총 12개로, r0에서 r11까지이다. \n... 정점 셰이더는 이미 쓰여진 임시 레지스터만을 읽을 수 있다. 어떠한 값이 설정된 적이 없는 임시 레지스터를 읽으려 하는 경우, 응용 프로그램에서 CreatVertexShader()로 정점 셰이더를 로드할 때 오류가 발생한다.\n\n''출력 레지스터의 사용 ''\n(p.062) 출력 레지스터는 총 13개로, 모두 읽기 전용이다. 출력 레지스터들은 래스터라이저에 대한 입력으로 쓰인다. 각 레지스터의 이름은 소문자 "o"로 시작하며, 그 뒤에 픽셀 셰이더에서의 용도를 암시하는 이름이 붙는다.\n\n|!이름 |!값 |!설명 |\n|oDn |2개의 4-float 값들 |픽셀 셰이더로 직접 들어가는 출력 색 데이터 <br>분산색(oD0)과 반영색(oD1)에 쓰인다. |\n|oPos |1개의 4-float 값 |동차 절단 공간에서의 출력 위치. 정점 셰이더는 반드시 이것을 설정해야 한다. |\n|oTn |최대 8개의 4-float 값들 |GeForce3의 경우 4개, RADEON 8500의 경우 6개. 출력 텍스처 좌표들. 텍스처 혼합 단계에 동시에 묶여진 최대 개수의 텍스처들에 필요 |\n|oPts.x |하나의 스칼라 float |출력 점 크기 레지스터. 스칼라 x 성분만 유효하다. |\n|oFog.x |하나의 스칼라 float |안개 값. 보간되어서 안개 데이블로 전달돈다. 스칼라 x 성분만 유효하다. |\n\n<html> <span style="font-size: 12px;"> <b> 스위즐링(swizzling)과 마스킹 </b> </span> </html>\n\n''스위즐링 (vn, cn, rn이 원본 레지스터인 경우에만 해당) ''\n(p.065) 원본 레지스터를 부정함과 동시에 스위즐링하는 것이 가능하다.\n\nmov R1, -R2.xyyz\n\n''마스킹 (대상 레지스터 on, rn에 해당) ''\n(p.065) 마스킹이란 명령의 결과가 저장될 대상 레지스터의 성분들을 명시적으로 지정하는 것이다. 기본적으로는 명령의 결과가 대상 레지스터(쓰기 가능한 모든 레지스터, 즉 o*, r)의 모든 성분들에 적용된다. 그러나 다음과 같이 표기하면 R1의 x 성분만 영향을 받게 된다.\n\nmov R1.x, R2\n\n|!성분 수정자 |!설명 |\n|R.[x][y][z][w] |대상 마스크 |\n|R.xwzy (하나의 예이다) |원본 스위즐링 |\n|-R |원본 부정 |\n\n\n<html> <span style="font-size: 12px;"> <b> 정점 세이더 작성 지침 </b> </span> </html>\n(p.066) 다음은 정점 셰이더를 작성할 때 반드시 염두에 두어야 하는 중요한 제한 사항들이다.\n\n▣ 각 정점 셰이더는 출력 레지스터 oPos의 성분들을 적어도 하나는 반드시 써야 한다.\n▣ 한 정점 셰이더가 가질 수 있는 명령들의 최대 개수가 128이다.\n▣ 한 명령의 원본으로 사용할 수 있는 상수 레지스터는 최대 1개이다 (예를 들어 add r0, v1, v2는 잘못된 명령이다).\n▣ C에서와 같은 조건문은 없으나 r0 = (r1 > r2) ? r3 : r4 같은 구문은 sge 명령으로 흉내낼 수 있다.\n▣ 정점 셰이더로부터 나오는 모든 반복된 값(iterated value)들은 [0.. 1]로 한정된다.\n\n다음은 정점 셰이더를 최적화될 때 도움이 될 사항들이다.\n\n▣ 소프트웨어 정점 셰이더의 최적화에 대한 정보가 (Palister)에 나와 있다. 하드웨어에서 실행되는 정점 셰이더를 최적화하는 데에도 도움이 될 것이다.\n▣ 정점 셰이더 상수 데이터를 설정할 때, SetVertexShader() 호출 한 번으로 모든 데이터를 설정하도록 노력할 것.\n▣ mov 명령은 최대한 자제할 것.\n▣ 여러 연산들은 한번에 수행할 수 있도록 할 것.\n▣ 최적화를 생각하기 전에, 정점 셰이더의 크기를 최대한 줄일 것 (m4X4나 m3X3 같은 복합 명령들을 제거).\n▣ CPU/ GPU 사이의 부하 분산에 가장 중요한 원칙 하나: 정점마다 계산할 필요 없이 객체마다 계산해도 되는 것은 셰이더 밖으로 빼내서 상수 레지스터들에 넣을 것. 그러면 GPU의 부담을 줄일 수 있으며 CPU/ GPU 병렬성도 향상된다.\n\n\n<html> <span style="font-size: 12px;"> <b> 정점 세이더의 컴파일 </b> </span> </html>\n(p.067) OpenGL 구현들은 문자열을 파싱하는 반면, Direct3D는 바이트 코드를 사용하다. 따라서 Direct3D 개발자들은 정점 셰이더를 어셈블러로 어셈블해야 한다. 이느 개발 과정 도중 버그를 미리 발견하거나 로딩 시간을 줄이는 데 도움이 된다.\n\n필자가 아는 한, 정점 셰이더를 컴파일하는 방법은 세 가지이다.\n\n▣ 정점 셰이더를 개별적인 ASCII 파일 (예를 들면 test.vsh)로 작성하고, 정점 셰이더 어셈블러로 이진 파일 (예를 들면 test.vso)을 만든다. 그렇게 만든 이진 파일을 응용 프로그램의 시작 부분에서 읽어온다.\n이 방법의 경우 컴파일된 이진 파일만 배포할 수 있으므로 셰이더 소스를 숨길 수 있다.\n\n<Note> NVLink는 이미 컴파일된 셰이더 코드들을 실행 시점에서 하나로 연결할 수 있다.\n\n▣ 정점 셰이더 소스를 개별적인 ASCII 파일 또는 *.cpp 파일의 char 문자열로 작성하고 응용 프로그램의 시작 부분에서 D3DXAssembleShader*() 함수로 컴파일한다.\n▣ 정점 셰이더 소스를 하나의 효과 파일로 작성하고, 응용 프로그램 시작 부분에서 효과 파일을 연다. D3DXCreateEffectFromFile()로 그 파일을 로드하면서 정점 셰이더도 컴파일한다. 효과 파일 자체를 미리 컴파일해 둘 수도 있다. 효과 파일 함수들로 정점 셰이더를 다룰 수 있으므로 간편하다.\n\n<Note> 또 다른 방법은 d3dtypes.h에 정의되어 있는 옵코드(opcode)들을 이용해서 직접 정점 어셈블러/ 디셈블러를 작성하는 것이다.\n\n\n<html> <span style="font-size: 12px;"> <b> 정점 세이더의 설정 </b> </span> </html>\n(p.068) DrawPrimitive*()를 호출하기 전에 SerVertexShader()를 사용해서 특정 객체에 대한 정점 셰이더를 설정한다. 이 함수는 DrawPrimitive*() 호출들 사이에서 정점 셰이더를 동적으로 로드한다.\n{{{\n// 정점 셰이더를 설정한다.\nm_pd3dDevice->SerVertexShader(m_dwVertexShader);\n}}}\n이 함수의 매개변수에는 CreateVertexShader()로 만든 정점 셰이더 핸들을 넣어야 한다. 이 함수의 호출 부담은 SetTexture() 호출보다 작으므로 자주 사용해도 된다. SerVertexShader()로 설정한 정점 셰이더는 제출된 도형의 매 정점마다 실행된다. 예를 들어서 색인화된 삼각형 목록으로 구현된 정점 네 개짜리 사각형을 회전시키는 경우, NVIDIA Shader로 살펴보면 DrawPrimitive*() 함수가 호출되기 전에 정점 셰이더가 네 번 실행됨을 확인할 수 있다.\n=== \n=== <html> <! 1. 정점 셰이더의 기초 //=================================== > </html>\n+++!!![2. 정점 셰이더 프로그래밍]\n◇ 볼프강 F. 엥겔 (Wolfgang F. Engel)\n\n(p.072) RacorX 예제는 녹색이 균일하게 적용된 하나의 사각형을 표시한다. 이 예제는 DirectX 8.1 SDK가 제공하는 공통 파일 프레임웍의 사용법과 D3DXAssemble 함수로 정점 셰이더를 컴파일하는 방법을 보여준다.\n\nMicrosoft Visual Studio 6.0, 공통 파일 프레임웍 C:\s DXSDK8\s Samples\s Multimedia\s Common\s src 을 활용\n ⇒ isual Studio 2013 + Microsoft DirectX9 SDK (February 2010)으로 마이그레이션\n\nD3DXMATRIX m_matProj;를 사용하고 싶지만 header 파일을 찾을 수 없을 때\n\n프로젝트 속성 > C/C++ > 일반 > ''추가 포함 디렉터리 '' (in Visual Studio 2013)\n DirectX 9 SDK의 Include 폴더를 설정해 준다.\n\n{{wrappingClass{#pragma comment(lib, "d3d9.lib") <br> #include <d3dx9.h> <br> ... <br> D3DXMATRIX m_matProj; }}}\n+++!!!![# RacorX1]\n(p.072) RacorX 예제는 녹색이 균일하게 적용된 하나의 사각형을 표시한다. 이 예제는 DirectX 8.1 SDK가 제공하는 공통 파일 프레임웍의 사용법과 D3DXAssemble 함수로 정점 셰이더를 컴파일하는 방법을 보여준다.\n\nMicrosoft Visual Studio 6.0 \n공통 파일 프레임웍 C:\s DXSDK8\s Samples\s Multimedia\s Common\s src 을 활용\n\n2016년에 맞춰서 Visual Studio 2013으로 마이그레이션\n+ Microsoft DirectX9 SDK (February 2010)\n\nD3DXMATRIX m_matProj;를 사용하고 싶지만 'd3dx9.h': No such file or directory 가\n\n프로젝트 속성 > C/C++ > 일반 > 추가 포함 디렉터리 \n DirectX 9 SDK의 Include 폴더를 설정해 준다.\n\n#pragma comment(lib, "d3dx9.lib")\n#include <d3dx9.h>\n...\nD3DXMATRIX m_matProj;\n\n<html> <span style="font-size: 12px;"> <b> 요약 </b> </span> </html>\n(p.088) RacorX는 정점 셰이더를 실행하기 위한 기반구조와 간단한 정점 셰이더 하나로 구성되어 있다. 정점 셰이더의 소스는 RacorX.cpp 안에 내장되어 있으면 D3DXAssembleShader()로 컴파일된다... 오직 하나의 재질 색상을 사용한다.\n+++[ // RestoreDeviceObjects ( ... ); //================================ ]\n{{{\nin RacorX.cpp\n\n//-----------------------------------------------------------------------------\n// reg c4-7 = WorldViewProj matrix\n// reg c8 = constant color\n// reg v0 = input register\n//-----------------------------------------------------------------------------\nconst char BasicVertexShader[] =\n"vs_1_1 // 정점 쉐이더 버전 1.1 \sn"\s\n"dcl_position v0 // 위치 레지스터 \sn"\s\n"mov r0, v0 // 정점의 위치를 임시 레지스터에 복사 \sn"\s\n"m4x4 r1, v0, c4 // 회전 적용 \sn"\s\n"mov oPos, r1 // 출력 레지스터에 저장 \sn"\s\n"mov oD0, c8 // Diffuse color = c8 \sn";\n\ncf. Direct3D ShaderX 책의 내용을 수정\n\n//-----------------------------------------------------------------------------\nHRESULT CMyD3DApplication::RestoreDeviceObjects()\n{\n...\n\n HRESULT rc;\n\n rc = D3DXAssembleShader(BasicVertexShader, iLen, NULL, NULL, dwFlags, &pVS, &pErrors);\n...\n\n D3DXVECTOR4 fMaterial(0, 1, 0, 0);\n m_pd3dDevice->SetVertexShaderConstantF(8, (float*)&fMaterial, 1);\n...\n\n return S_OK;\n}\n}}}\n=== <html> <! RestoreDeviceObjects ( ... ); // ============ > </html> === <html> <! RacorX1 //=================================== > </html>\n+++!!!![# RacorX2]\n(p.088) RacorX2에서는 NVASM으로 미리 컴파일해 둔 이진 형식의 정점 셰이더를 사용한다. 그 외의 부분은 동일하다.\n\n<html> <font color= #BE8C3C > <b> ▷ RacorX201 </b> </font></html>\n / basic.vsh는 Vertex Shader를 저장한 text 파일\n / D3DXAssembleShader(); → D3DXAssembleShaderFromFile("basic.vsh", ... );\n{{{\n//-----------------------------------------------------------------------------\n// set custom FVF macro\n//-----------------------------------------------------------------------------\n#define D3DFVF_VERTEX (D3DFVF_XYZ)\n\nm_pd3dDevice->SetFVF(D3DFVF_VERTEX);\n\n//-----------------------------------------------------------------------------\n// SetFVF와 같은 코드\n//-----------------------------------------------------------------------------\nLPDIRECT3DVERTEXDECLARATION9 m_pVertexDeclaration;\n\nD3DVERTEXELEMENT9 decl[] =\n{\n { 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 },\n D3DDECL_END()\n};\nm_pd3dDevice->CreateVertexDeclaration( decl, &m_pVertexDeclaration );\n\nm_pd3dDevice->SetVertexDeclaration( m_pVertexDeclaration );\n}}}\n\n<html><font color= #BE8C3C > <b> ▷ RacorX202 </b></font> </html>\n\n(p.090) 정점 셰이더 자체는 ASCII 형식의 파일로, 이름은 basic.vsh이다. 이것을 컴파일하면 basic.vso라는 이름의 이진 목적 파일이 shaders 디렉토리에 만들어진다.\n\nNVASM은 Directx8 환경에서 작동하는 툴이기 때문에 DirectX9에서 변경된 내용을 error로 처리\n// the dcl_* stuff was new to DX9.\ndcl_position v0 // 위치 레지스터\n\n/ Debug 모드 ; "Shader\s\sbasic.vsh"을 읽어 와서 "Shader\s\sbasic.bin"을 생성 후 shader 실행\n/ Release 모드 ; "Shader\s\sbasic.bin"를 읽어 와서 shader 실행\n+++[ // HRESULT RestoreDeviceObjects(); //================================ ]\n{{{\n//-----------------------------------------------------------------------------\n// Name: RestoreDeviceObjects()\n// Desc: Restore device-memory objects and state after a device is created or\n// resized.\n//-----------------------------------------------------------------------------\nHRESULT CMyD3DApplication::RestoreDeviceObjects()\n{\n // Restore the device objects for the font\n m_pFont->RestoreDeviceObjects();\n \n // Set the projection matrix\n FLOAT fAspect = m_d3dsdBackBuffer.Width / (FLOAT)m_d3dsdBackBuffer.Height;\n D3DXMatrixPerspectiveFovLH(&m_matProj, D3DX_PI / 4, fAspect, 1.0f, 100.0f);\n\n // Set up the view matrix. \n D3DXMatrixLookAtLH(&m_matView, &D3DXVECTOR3(0.0f, 1.0f, -4.0f), //from\n &D3DXVECTOR3(0.0f, 0.0f, 0.0f), //at\n &D3DXVECTOR3(0.0f, 1.0f, 0.0f));//up\n\n // assemble and create the vertex shader\n DWORD dwFlags = 0;\n\n#if defined( _DEBUG ) || defined( DEBUG )\n dwFlags |= D3DXSHADER_DEBUG;\n#endif\n\n char szBuffer[128];\n ID3DXBuffer* pVS;\n\n HRESULT rc;\n\n#if defined( _DEBUG ) || defined( DEBUG )\n ID3DXBuffer* pErrors;\n // INT iLen = strlen(BasicVertexShader);\n // rc = D3DXAssembleShader(BasicVertexShader, iLen, NULL, NULL, dwFlags, &pVS, &pErrors);\n\n rc = D3DXAssembleShaderFromFile( "Shader\s\sbasic.vsh", NULL, NULL, dwFlags, &pVS, &pErrors );\n if (FAILED(rc))\n {\n OutputDebugString("Failed to assemble the vertex shader, errors:\sn");\n OutputDebugString((char*)pErrors->GetBufferPointer());\n OutputDebugString("\sn");\n }\n else\n {\n FILE* fp = NULL;\n fp = fopen( "Shader\s\sbasic.bin", "wb" );\n if (fp != NULL){\n fwrite(pVS->GetBufferPointer(), pVS->GetBufferSize(), 1, fp);\n fclose(fp);\n }\n }\n#else\n int handle = _open("Shader\s\sbasic.bin", O_RDONLY | O_BINARY, NULL);\n if (handle == -1){\n OutputDebugString("Read VertexShader Error.. \sn");\n return S_FALSE;\n }\n\n int nLength = _filelength(handle);\n D3DXCreateBuffer(nLength, &pVS);\n _read(handle, pVS->GetBufferPointer(), nLength);\n\n#endif\n\n\n // Create the vertex shader\n rc = m_pd3dDevice->CreateVertexShader((DWORD*)pVS->GetBufferPointer(), &m_pVertexShader);\n if (FAILED(rc))\n {\n OutputDebugString("Failed to create the vertex shader, errors:\sn");\n _stprintf(szBuffer, _T("Error: %s error description: %s\sn"), DXGetErrorString(rc), DXGetErrorDescription(rc));\n OutputDebugString(szBuffer);\n OutputDebugString("\sn");\n }\n\n SAFE_RELEASE(pVS);\n if (FAILED(rc))\n return rc;\n \n D3DXVECTOR4 fMaterial(0, 1, 0, 0);\n m_pd3dDevice->SetVertexShaderConstantF(8, (float*)&fMaterial, 1);\n \n // z-buffer enabled\n m_pd3dDevice->SetRenderState(D3DRS_ZENABLE, TRUE);\n\n // Turn off D3D lighting, since we are providing our own vertex shader lighting\n m_pd3dDevice->SetRenderState(D3DRS_LIGHTING, FALSE);\n\n // Turn off culling, so we see the front and back of the quad\n m_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);\n \n return S_OK;\n}\n}}}\n=== <html> <! RestoreDeviceObjects(); // ============ > </html>\n\n<html> <span style="font-size: 12px;"> <b> 요약 </b> </span> </html>\n(p.094) 이번 예제에서는 NVASM을 IDE에 통합하고 그것으로 정점 셰이더를 미리 컴파일하는 방법, 그리고 컴파일된 이진 정점 셰이더 파일을 로드하는 방법에 대해 살펴보았다.\n=== <html> <! RacorX2 //=================================== > </html>\n+++!!!![# RacorX3]\n(p.094) RacorX3는 RacorX2에 비해 정점 셰이더가 개선되었다. RacorX3의 정점 셰이더에는 정점 당 분산 반사(diffuse reflection) 모형이 추가되었다. 이것은 가장 간단한 조명 계산 모형들 중 하나로, 정점 법선과 빛 벡터의 내적에 기반해서 색을 산출한다.\n\nRacorX3은 (0.0, 0.0, 1.0)에 위치한 광원 하나와 녹색을 사용한다.\n\n<html> <span style="font-size: 12px;"> <b> 정점 셰이더 상수 레지스터들의 설정 </b> </span> </html>\n(p.095) 상수 레지스터 이름들이 헤더 파일 const.h에 들어있으며, 이 헤더 파일을 RacorX.cpp와 diffuse.vsh가 포함한다(#include). 이렇게 하면 코드의 일관성이 향상되며 불필요한 실수를 줄일 수 있다. const.h는 다음과 같다.\n{{{\n#define CLIP_MATRIX 0\n#define CLIP_MATRIX_1 1\n#define CLIP_MATRIX_2 2\n#define CLIP_MATRIX_3 3\n\n#define INVERSE_WORLD_MATRIX 4\n#define INVERSE_WORLD_MATRIX_1 5\n#define INVERSE_WORLD_MATRIX_2 6\n\n#define LIGHT_POSITION 11\n\n#define DIFFUSE_COLOR 14\n\n-. SetFVF( ... ); 을 사용하지 않고 SetVertexDeclaration( ...); 함수를 사용하도록 수정\n//-----------------------------------------------------------------------------\nHRESULT CMyD3DApplication::Render()\n{\n...\n\n // m_pd3dDevice->SetFVF(D3DFVF_VERTEX);\n m_pd3dDevice->SetVertexDeclaration( m_pVertexDeclaration );\n...\n\n return S_OK;\n}\n\n// LPDIRECT3DVERTEXDECLARATION9 m_pVertexDeclaration; 설정\n//-----------------------------------------------------------------------------\nHRESULT CMyD3DApplication::RestoreDeviceObjects()\n{\n...\n // Create the shader declaration.\n D3DVERTEXELEMENT9 decl[] =\n {\n { 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 },\n { 0, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0 },\n D3DDECL_END()\n };\n \n m_pd3dDevice->CreateVertexDeclaration(decl, &m_pVertexDeclaration);\n...\n\n return S_OK;\n}\n}}}\n+++[ // diffuse.vsh //=================================================== ]\n{{{\n; per-vertex diffuse lighting (정점 당 분산 조명)\n\n#include "const.h"\n\nvs.1.1 // 정점 쉐이더 버전 1.1\n\n// the dcl_* stuff was new to DX9.\ndcl_position v0 // 위치 레지스터\ndcl_normal v3 // 정점 법선\n\n// 정점의 변환\nmov r0, v0 // 정점의 위치를 임시 레지스터에 복사\nm4x4 r1, v0, c[CLIP_MATRIX] // 회전 적용\nmov oPos, r1 // 출력 레지스터에 저장\n\n; transform normal\ndp3 r1.x, v3, c[INVERSE_WORLD_MATRIX]\ndp3 r1.y, v3, c[INVERSE_WORLD_MATRIX_1]\ndp3 r1.z, v3, c[INVERSE_WORLD_MATRIX_2]\n\n; renormalize it\ndp3 r1.w, r1, r1\nrsq r1.w, r1.w\nmul r1, r1, r1.w\n\n; N dot L\n; we need L vector towards the light, thus negate sign\ndp3 r0, r1, -c[LIGHT_POSITION]\n\nmul oD0, r0, c[DIFFUSE_COLOR] ; modulate against a diffuse color\n}}}\n=== <html> <! diffuse.vsh > </html>\n=== <html> <! RacorX3 //=================================== > </html>\n+++!!!![# RacorX4]\n(p.102) 베지어 패치를 이용한 곡면을 표시하며, 그 위에 텍스처도 입힌다. 조명 모형 역시 개선되었는데, 이번에는 분산과 반영(specular)이 결합된 조명 모형을 사용한다.\n\n그리고 RacorX4에서는 사용자가 직접 객체를 회전시키거나 이동시키는 기능을 제공하는데, 이를 위해서는 공통 파일 프레임웍이 제공하는 트랙볼(trackball) 클래스를 이용한다. 또한 <C> 키로 반영 색상을 선택하거나 마우스 휠로 확대, 축소하는 기능도 제공한다.\n\n<html> <span style="font-size: 12px;"> <b> 요약 </b> </span> </html>\n(p.112) RacorX4에서는 블린-퐁 반사 모형과 매우 비슷한 반영 반사 모형이 사용되었으며, lit 명령의 기능 및 정점 셰이더에서 텍스퍼를 입히는 기본적인 방법 등이 소개되었다.\n=== <html> <! RacorX4 //=================================== > </html>\n+++!!!![# RacorX5]\n(p.112) RacorX5는 RacorX4에 점광원을 추가한 것이다. 사용자는 <Home> 키와 <End> 키, 그리고 상하좌우 화살표 키들로 그 광원의 위치를 이동시킬 수 있다. 또한 이전 예제와 마찬가지로 <C> 키로 반영광의 색을 변경하는 것도 가능하다.\n\n<html> <span style="font-size: 12px;"> <b> 점광원 </b> </span> </html>\n점광원(point light source)은 장면 안에서 색과 위치만을 가지며 방향은 없다. 점광원의 광선들은 한 점에서 모든 방향으로 균등하게 방사된다. 감쇠 값을 명시적으로 지정하지 않고 한 광선의 세기는 광원과 표면의 거리에 상관없이 일정하다. 점광은 실생활의 전구(電球)를 흉내내는 데 유용하다.\n\n<html> <span style="font-size: 12px;"> <b> 요약 </b> </span> </html>\n(p.118) 이 예제는 Direct3D 고정 기능 파이프라인에서 쓰이는 것과 동일한 감쇠 모형을 가진 점광원의 구현 방법에 대해 보여준다. 이 점광원은 결합된 분산 및 반영 모형을 사용한다.\n=== <html> <! RacorX5 //=================================== > </html>\n=== <html> <! 2. 정점 셰이더 프로그래밍 > </html>\n++++!!![3. 픽셀 셰이더의 기초]\n◇ 볼프강 F. 엥겔 (Wolfgang F. Engel)\n+++!!!![# 픽셀 셰이더를 사용하는 이유 ]\n(p.121) 다음은 현재의 픽셀 셰이더 기술로 구현할 수 있는 몇 가지 효과들이다.\n\n▣ 단일 패스 픽셀 당 조명 (다음 절 참고)\n▣ 진정한 퐁 셰이딩 <Beaudoin/ Guardado>\n▣ 비등방 (anisotropic) 조명 <Isidoro/ Brennan>\n▣ 비실사 렌더링 : 카툰 셰이딩, 해치, 구치(gooch) 조명, 이미지 공간 기법들 <Card/ Mitchell>\n▣ 픽셀 당 프레널 항 <Brennan>\n▣ 입체 기반 효과 <Kraus> <Hart>\n▣ 고급 범프 매핑 (자기 그림자 범프 맵, 수평석 매핑이라고도 알려져 있다.)\n▣ 절차적 텍스처 <Zecha> 와 텍스처 섭동 <Isidoro/ Riguer>\n▣ 양방향 반사율 분산 함수 <Moravansky>\n\n...\n픽셀 셰이더에서 한 가지 골치 아픈 문제는, 픽셀 셰이더가 종종 정점 셰이더의 도움을 받아야 한다는 점이다. 예를 들어 픽셀 당 조명을 계산하기 위해서는 삼각형의 방향과 빛 벡터의 방향, 그리고 경우에 따라서는 시선 벡터의 방향을 알아야 한다.\n=== <html> <! 정점 셰이더 프로그래밍의 개요> </html>\n+++!!!![# 파이프라인 안에서 픽셀 셰이더의 역할 ]\n(p.127) 픽셀 셰이더는 하위 픽셀 셰이더 수준에는 관여하지 않는다. 픽셀 셰이더는 z에 따라 이미 다중 샘플링된 픽셀들과 색 값들, 그리고 텍스처 정보를 받는다.\n...\nDirectX3D 8.1은 5개의 픽셀 셰이더 표준들을 지원한다.\n...\nps.1.1, ps.1.2, ps.1.3은 기능에서만 차이를 보일 뿐 구문 구조 차원에서는 같은 선상에 놓여있다. 그러나 ps.1.4는 새롭고 좀더 유용한 접근 방식을 가진다.\n...\nps.1.4의 명령들은 RISC 방식에 가깝고 ps.1.1-ps.1.3의 명령들은 CISC 방식에 더 가깝다고 볼 수도 있을 것이다.\n\n<html> <span style="font-size: 14px; color:#BE8C3C "> <b> ▷ CISC (Complex Instruction Set Computer) </b> </span> </html>\nCISC는 명령어의 길이가 가변적으로 구성된 것입니다.\n한 명령어의 길이를 줄여 디코딩 속도를 높이고 최소크기의 메모리 구조를 가집니다.\n대표적으로 X86.\n하드웨어의 비중이 큼.\n\n''장점''\n컴파일러 작성이 쉽다.\n복잡한 명령도 마이크로코드(microcode)이므로 실행효율이 좋다.\n호환성이 좋다.\n\n''단점''\n하나의 명령어가 복잡하여 해석(디코딩)에 시간이 오래걸리며, 해석에 필요한 회로가 복잡하다.\n적은 수의 일부 명령어만 주로 쓰인다.\n명령어의 길이가 달라서 동시의 여러개의 명령처리는 어렵다.\n\n<html> <span style="font-size: 14px; color:#BE8C3C "> <b> ▷ RISC (Reduced Instruction Set Computer) </b> </span> </html>\nCPU에서 수행하는 동작 대부분이 몇개의 명령어 만으로 가능하다는 사실에 기반하여 구현함.\n고정된 길이의 명령어를 사용한다.\n적은수의 명령어로 명령어 집합을 구성하며 기존의 복잡한 명령은 보유한 명령어를 조합해서 사용한다.\n보통 많은 수의 범용 레지스터를 가진다.\n대표적으로 ARM.\n소프트웨어의 비중이 큼.\n\n''장점''\n각 명령어가 한 클럭에 실행되도록 고정되어, 파이프라인 성능에 최적화 됨\n고정된 명령어이기 때문에 해석(디코딩)속도가 빠르며, 여러개의 명령어를 처리할 수 있다.\n\n''단점''\n컴파일러의 최적화 과정이 복잡해진다.\n명령길이가 고정되어 있기 때문에 코드효율이 낮다.\n\n(p.127) Direct3D 파이프라인 안에서의 픽셀 셰이더의 임무들을 요약하자면:\n\n▣ 픽셀 셰이더에는 레스터화된 픽셀들이 입력된다. 대부분의 경우 그러한 픽셀들은 z 차폐 제외, 다중 샘플링, 그리고 구로 셰이딩이 이미 적용된 것들이다.\n▣ 픽셀 셰이더에는 보간된 텍스처 좌표와 보간된 분산 및 반영색들이 입력된다.\n▣ 픽셀 셰이더는 크게 네 가지 버전들로 나뉜다. 구문 구조적 관점에서 볼 때 ps.1.1-ps.1.3 표준들은 CISC와 비슷한 접근 방식인 반면 ps.1.4 표준 접근 방식은 RISC와 비슷하다. RISC 접근 방식은 최신의 ps.2.0에서도 쓰인다.\n▣ 픽셀 셰이더는 셰이딩된 픽셀들을 안개 단계로 넘긴다.\n▣ 픽셀 셰이더는 이후의 Direct3D 단계들을 지원 또는 주도할 수 있다.\n=== <html> <! 파이프라인 안에서 픽셀 셰이더의 역할 > </html>\n<html> <span style="font-size: 12px; color:#006699"> <b> # 픽셀 셰이더 도구들 </span> </html>\n-. Microsoft Pixel Shader Assembler\n Executable: (SDK root)\sbin\sDXutils\n\n-. MFC Pixel shader\n Source: (SDK root)\sSamples\sMultimedia\sDirect3D\sMFCPixelShader\n Executable: (SDK root)\sSamples\sMultimedia\sDirect3D\sBin\n\n-. ATI ShaderLab (cf. 찾지 못함)\n(p.133) MFC 픽셀 셰이더 도구보다 나은 점이라면, 상수 레지스터들과 텍스처를 직접 저장할 수 있다는 것이다.\n+++!!!![# 픽셀 셰이더 아키텍처 ]\n(p.133) 픽셀 셰이더 산술 논리 단위 (ALU, arithmetic logic unit)\n\n다음은 <그림7>에 나온 여러 레지스터들을 정리한 표이다.\n\n| !종류 | !이름 | !ps.1.1 | !ps.1.2 | !ps.1.3 | !ps.1.4 | !읽기/ 쓰기 여부 |\n|상수 레지스터 | cn |8 |8 |8 |8 |RO |\n|텍스처 레지스터 | tn |4 |4 |4 |6 |RW / ps.1.4: RO |\n|임시 레지스터 | rn |2 |2 |2 |6 |RW |\n|색 레지스터 | vn |2 |2 |2 |페이즈 2에서 2개 |RO |\n\n<html> <span style="font-size: 12px;"> <b> 색 레지스터들(ps.1.1-ps.2.4: v0+v1) </b> </span> </html>\n(p.136) 색 레지스터들은 정점 당 색 값들을 담으며, 값의 범위는 0에서 1(포화됨)이다. 흔히 v0이 정점 분산색을 담고 v1이 반영색을 담는다.\n\n픽셀 셰이더의 입장에서 이 색 레지스터들은 읽기 전용이다. ps.1.4의 경우 색 레지스터들은 두번째 페이즈(이것이 기본 페이즈이다)에서만 사용할 수 있다. 그 외의 모든 레지스터들은 ps.1.4의 두 페이즈들 모두에서 사용 가능하다.\n\n<html> <span style="font-size: 12px;"> <b> 범위 </b> </span> </html>\n(p.137) 다중 텍스처링 단위 대신 픽셀 셰이더를 사용하는 한 가지 이유는 픽셀 셰이더 ALU가 사용하는 높은 정밀도 때문이다.\n\n| !레지스터 이름 | !범위 | !버전 |\n|cn |-1에서 +1 |모든 버전 |\n|rn |-D3DCAPS8.MaxPixelShaderValue에서 D3DCAPS8.MaxPixelShaderValue |모든 버전 |\n|tn |-D3DCAPS8.MaxPixelShaderValue에서 D3DCAPS8.MaxPixelShaderValue |ps.1.1-ps.1.3 |\n| |D3DCAPS8.MaxTexturePepeat에서 D3DCAPS8.MaxTexturePepeat |ps.1.4 |\n| vn |0에서 +1 |모든 버전 |\n...\n\n텍스처를 색 값들을 담는 용도로 사용할 때 ps.1.4에서 훨씬 더 높은 색 정밀도를 얻을 수 있다.\n=== <html> <! 픽셀 셰이더 아키텍처 > </html>\n+++!!!![# 픽셀 셰이더 프로그래밍의 개요 ]\n(p.138) 픽셀 셰이딩은 하나의 렌더링 패스 도중 픽셀별로 또는 객체별로 일어난다.\n\n그럼 픽셀 셰이더를 사용하는 응용 프로그램을 만드는 과정을 살펴보자. 다음은 픽셀 셰이더 응용 프로그램을 만드는 데 필요한 단계들을 수행 순서대로 나열한 것이다. \n\n▣ 픽셀 셰이더 지원 여부를 확인한다.\n▣ 텍스터 연산 플래그들(D3DTSS_*)을 설정한다.\n▣ SetTexture()로 텍스처를 설정한다.\n▣ SetPixelShaderConstant()나 def로 상수들을 정의한다.\n▣ 픽셀 셰이더를 작성한다.\n ▣ 텍스처 어드레스 명령들\n ▣ 산술 명령들\n▣ 픽셀 셰이더를 어셈블한다.\n▣ 픽셀 셰이더를 생성한다.\n▣ 픽셀 셰이더를 설정한다.\n▣ 픽셀 셰이더 자원들을 해제한다.\n\n<html> <span style="font-size: 12px;"> <b> 픽셀 셰이더 지원 여부 확인 </b> </span> </html>\n{{{\n// 픽셀 셰이더 버전 1.1의 지원 여부를 확인한다.\nif ( pCaps->PixelShaderVersion < D3DPS_VERSION(1,1) ) \n return E_FALL;\n}}}\n(p.139) DirectX 8.1 SDK의 공통 파일 프레임웍을 사용하는 경우라면 프레임웍이 채워준다. 그래픽 카드가 해당 픽셀 셰이더 버전을 지원하지 않으며 다중 텍스처 단위로 전환하는 대체 메카니즘이 없다면 레퍼런스 래스터라이저(REF)가 쓰이게 된다. 이것이 공통 파일 프레임웍의 기본적인 행동 방식이나, REF는 매우 느리기 때문에 게임에서 실제로 사용하는 것은 비현실적이다.\n\n<html> <span style="font-size: 12px;"> <b> 픽셀 셰이더 명령들 </b> </span> </html>\n(p.141) 정점 셰이더에서는 프로그래머가 명령들의 순서를 자유롭게 선택할 수 있다. 반면 __픽셀 셰이더에서는 명령들의 순서에 제한__이 있다. 그리고 명령들의 구체적인 순서는 __ps.1.1-ps.1.3과 ps.1.4에서 서로 다르다.__\n\n<html> <span style="font-size: 12px;"> <b> ps.1.1-ps.1.3 텍스처 어드레싱 </b> </span> </html>\n(p.145) 텍스처 어드레스 명령은 그 결과들을 내부적으로 사용해서 텍스처를 샘플링한다. 픽셀 셰이더에서 텍스처 좌표들에 접근할 수 있느 유일한 방법은 texcoord 명령뿐이다. 이 명령은 텍스처 좌표 데이터를 색 값으로 변환하며, 변환된 색 값은 다른 텍스처 어드레싱 명령들이나 산술 명령들에서 사용할 수 있다. 이 색 값들을 텍스처를 샘플링하기 위한 텍스처 좌표들로써 사용하기 위해서는 texreg2* 명령들이 필요하다.\n\n(p.155) 텍스처 좌표들을 수정한 후 텍스처를 추출하는 텍스처 어드레스 명령들은 다음과 같다.\n\n▣ texbem/ texbeml\n▣ texdp3tex\n▣ texm3x2tex\n▣ texm3x3spec\n▣ texm3x3tex\n▣ texm3x3vspec\n\n다음의 명령들은 색 값을 텍스처 좌표로 사용해서 텍스처를 샘플링한다. 그 색 값들 중 하나가 어떠한 명령에 의해 변하면, 그 샘플링은 의존적 읽기가 된다.\n\n▣ texreg2ar\n▣ texreg2gb\n▣ texreg2rgb\n\n그래서 이 명령들을 범용적인 의존적 텍스처 읽기 명령들이라고 부른다.\n\n앞에서 이야기했듯이, 하나의 ps.1.1-ps.1.3 픽셀 셰이더는 최대 8개의 산술 명령들과 4개의 텍스처 어드레스 명령들을 가질 수 있다. 모든 텍스처 어드레스 명령들은 하나의 명령 슬롯을 차지한다. 단 texbeml 의 경우에는 하나의 텍스처 어드레스 슬롯과 하나의 산술 슬롯을 차지한다.\n\n<html> <span style="font-size: 12px;"> <b> ps.1.4 텍스처 어드레스 명령 </b> </span> </html>\n(p.156) ps.1.4 에서 텍셀이나 텍스처 좌표들을 사용하려면 먼저 texld 나 texcrd 로 로드해야 한다. 이 명령들은 텍셀 또는 텍스처 좌표들에 접근할 수 있는 유일한 수단이다. texcrd 로 텍스처 좌표들을 색 데이토로 변환한 후에는 모든 산술 명령들로 텍스처 좌표(색 데이터)를 수정할 수 있다. 이 덕분에 ps.1.4 에서는 텍스처 어드레싱이 좀더 직관적이다.\n\n(p.158) ps.1.4 에는 단 네 개의 텍스처 어드레스 명령들만 존재한다.(texcrd, texdepth, texkill, texld) 그러나, 앞에서 이야기했듯이 텍스처 어드레스 정보를 산술 명령들로 조작할 수 있으므로 대단히 다양한 방식으로 텍스처 어드레싱 작업들을 수행할 수 있다.\n\n(p.159) ps.1.4 에서는 산술 명령들로도 텍스처 데이터를 조작할 수 있기 때문에 좀더 유연하다고 할 수 있다.\n\n(p.171) 모든 산술 연산들은 임시 레지스터 rn들을 사용할 수 있다. rn 레지스터들은 초기에는 설정되지 않은 상태이며, 뭔가가 쓰여지지 않는 한 원본으로 사용될 수 없다. 이러한 제한은 rn 레지스터의 각 성분별로 적용된다. ps.1.4 에서 tn 레지스터들은 산술 명령에 쓰일 수 없으며, 오직 텍스처 어드레싱 명령들에만 쓰일 수 있다(단 texdepth는 예외).\n\n첫번째 페이즈의 산술 연산 명령들에서 원본 레지스터로 사용할 수 있는 것은 rn 과 cn 이다. 두번째 페이즈의 산술 연산 명령들에서는 rn, vn, cn 을 원본 레지스터로 사용할 수 있다.\n\nps.1.1-ps.1.3 과 ps.1.4 의 차이점은 그리 많지 않다. ps.1.4 에서만 가능한 명령은 bem 이다. 이 명령은 texbem 과 texbeml 기능을 산술 명령으로 대체한 것이라 할 수 있다. 또한 cmp 와 cnd 명령은 ps.1.4 에서 좀더 강력하다. ps.1.4 에서는 산술 명령들을 모든 텍스처 어드레싱 및 혼합 작업에 사용할 수 있으므로 산술 명령들의 활용 범위가 ps.1.1-ps.1.3 보다 ps.1.4 에서 훨씬 더 크다.\n\n정점 셰이더와 마찬가지로, 픽셀 셰이더의 산술 명령들에 조건 분기 명령은 없다. 그러나 cmp 나 cnd 로 조건 분기의 기능성을 제한적이나마 흉내내는 것은 가능하다.\n\n모든 rn.a 채널들은 첫번째 페이즈의 끝에서 설정되지 않은 상태(unset)가 된다. 따라서 phase 명령으로 페이즈가 바뀌면 색 데이터의 네번째 성분은 손실된다. 이 문제는 명령들의 순서를 바꾸는 것으로 어느 정도 해결할 수 있다. \n\n예를 들어, 다음 예제에서는 페이즈가 바뀌면서 r3 의 알파 값이 사라진다.\nps.1.4\n...\ntexld r3, t3\nphase\n...\nmul r0, r2, r3\n\n명령들을 다음과 같이 배치하면 알파 값이 사라지지 않는다.\nps.1.4\n...\nphase\ntexld r3, t3\n...\nmul r0, r2, r3\n\nphase 명령이 없으면 셰이더 전체는 두번째 페이즈 안에 있는 것으로 간주되어서 평가, 수행된다.\n\n하나의 셰이더는 반드시 r0 의 모든 성분들에 값을 기록해야 한다.\n\n<html> <span style="font-size: 12px;"> <b> 읽기 포트 한계 </b> </span> </html>\n(p.172) 읽기 포드 한계 (read port limit) 란 동일한 종류의 레지스터들이 하나의 명령에서 원본 레지스터로 최대 몇 개나 쓰일 수 있는지를 의미한다. 각 버전의 읽기 포트 한계는 다음과 같다.\n\n| !레지스터 이름 |>|>|>|!버전 |\n|~|''ps.1.1'' |''ps.1.2'' |''ps.1.3'' |''ps.1.4'' |\n|cn |2 |2 |2 |2 |\n|rn |2 |2 |2 |3 |\n|tn |2 |3 |3 |1 |\n|vn |2 |2 |2 |2 |\n\n(p.173) ps.1.4 에서 한 명령에 세 개의 임시 레지스터들을 사용하는 예가 이전의 cmp, cnd 명령 항목에 나와 있다. __ps.1.4 에서 tn 레지스터들은 산술 명령에 쓰일 수 없으며 텍스처 어드레스 명령들은 tn 레지스터를 원본으로 하나만 사용할 수 있다.__ 따라서 ps.1.4 에서는 tn 레지스터들의 읽기 포트 한계를 넘기는 일이 원천 봉쇄된다.\n\n쓰기 포트 한계 같은 것은 없는데, 왜냐하면 모든 명령들은 오직 하나의 대상 레지스터만 가지기 때문이다.\n\n<html> <span style="font-size: 12px;"> <b> 스위즐링/ 선택자 </b> </span> </html>\n(p.174) 픽셀 셰이더의 스위즐링은 정점 셰이더의 것보다 제한적이다. 픽셀 셰이더에서는 원본 레지스터의 채널 하나를 모든 채널들에 복제하는 것만 지원된다. 이러한 스위즐링은 소위 '원본 레지스터 선택자'라는 것을 통해서 이루어진다.\n\n| !원본 레지스터 선택자 |!구분 |!ps.1.1 |!ps.1.2 |!ps.1.3 |!ps.1.4 |\n|적색 복사 |source.r | | | |X |\n|녹색 복사 |source.g | | | |X |\n|청색 복사 |source.b |X |X |X |X |\n|알파 복사 |source.a |X |X |X |X |\n\n.r 과 .g 선택자들은 ps.1.4 만 지원한다. 다음은 원본 레지스터의 적색 채널을 모든 채널들로 복제하는 예이다.\n\nmov r1, r1.r; r1.rgba = r1.r\n\n<html> <span style="font-size: 12px;"> <b> 원본 레지스터 수정자들 </b> </span> </html>\n(p.177) 원본 레지스터 수정자들은 명령에 쓰일 레지스터 데이터의 범위를 조정하거나 값을 비례시키는 데 유리하다.\n\n| !수정자 |!구문 |!ps.1.1 |!ps.1.2 |!ps.1.3 |!ps.1.4 |\n|바이어스 |r0_bias |X |X |X |X |\n|역수 |1-r0 |X |X |X |X |\n|부정 |-r0 |X |X |X |X |\n|비례 x2 |r0_x2 | | | |X |\n|부호 있는 비례 |r0_bx2 |X |X |X |X |\n\n(p.178) 바이어스(bias) 수정자는 모든 성분들에서 0.5를 뺀다. 이는 DX6/ 7 다중 텍스처링 유닛의 D3DTOP_ADDSIGEND 에 해당한다. 이 수정자는 0에서 1의 범위의 값을 -0.5에서 0.5의 범위로 변경한다.\n\n<html> <span style="font-size: 12px;"> <b> 명령 수정자들 </b> </span> </html>\n(p.180) 명령 수정자는 명령 이름 다음에 밑줄로 연결된다. 명령 수정자들은 명령의 출력을 변경하는 역할을 한다. 다음 표에서 보듯이, 명령 수정자들을 통해서 결과에 2의 배수를 곱하거나 결과를 【0..1】로 한정할 수 있다.\n\n| !명령 수정자 |!설명 |!구문 |!ps.1.1-ps.1.3 |!ps.1.4 |\n|_x2 |2를 곱한다. |명령_x2 |X |X |\n|_x4 |4를 곱한다. |명령_x4 |X |X |\n|_x8 |8을 곱한다. |명령_x8 | |X |\n|_d2 |2로 나눈다. |명령_d2 |X |X |\n|_d4 |4로 나눈다. |명령_d4 | |X |\n|_d8 |8로 나눈다. |명령_d8 | |X |\n|_sat |【0..1】로 한정 |명령_sat |X |X |\n\n(p.181) 곱하기 수정자들은 값의 비례에 유용하다. 단 값이 곱해지면 결과의 정밀도가 감소하게 됨을 주의하기 바란다. \n\n<html> <span style="font-size: 12px;"> <b> 명령 짝짓기 </b> </span> </html>\n(p.185) 픽셀 셰이더 ALU 에는 두 개의 파이프라인이 있는데, 하나는 색 데이터를 위한 것이고 또 하나는 알파 데이터를 위한 것이다. 이 파이프라인들은 병렬적으로 색 데이터를 기록하는 명령과 알파 데이터를 기록하는 명령이 서로 짝을 지어 수행되도록 할 수 있으며, 그렇게 하면 채움 비율을 줄이는 데 도움이 된다. 이러한 짝짓기는 __산술 명령들에만 적용할 수 있다.__ 단 예외는 dp4로, dp4는 짝짓기가 안 된다.\n짝짓기(pairing) 또는 병렬 수행(co-issuing)은 두 명령들 중 두번째 명령 앞에 더하기(+) 기호를 붙여서 지정한다.\n...\n\nps.1.1-ps.1.3 에서는 짝짓기를 할 때 항상 .rgb 와 .a 쓰기 마스크를 지정해야 된다. ps.1.4 에서는 .r, .g, .b 쓰기 마스크들이 쓰인 레지스터와 .a 마스크가 쓰인 대상 레지스터를 함께 짝지을 수 있다.\n...\n\n병렬 수행된 명령들은 하나의 개체로 간주되며, 그래서 두 명령 모두 완결되어야 그 결과가 사용 가능해진다.\n...\n\n셰이더 유효성 점검 과정에서 그런 논리적인 버그는 검출되지 않으며, 따라서 예상과는 다른 결과가 나오게 된다. \n\n(p.186) 그리고 병렬 수행되는 두 명령들이 서로 다른 종류의 레지스터들을 최대 세 개까지만 사용할 수 있다는 점도 기억해 두기 바란다.\n\n<html> <span style="font-size: 12px;"> <b> 요약 </b> </span> </html>\n(p.188) 이번 장에서는 픽셀 셰이더에 대한 기본적인 내용을 살펴보았다. 이번 장에서 이야기한 것들을 요약하자면 :\n\n▣ D3DCAPS 구조체의 PixelShaderVersion 비트로 픽셀 셰이더에 대한 하드웨어 지원 여부를 점검한다.\n▣ 다중 텍스처링 단위에서와 마찬가지로, 모든 텍스처들을 SetTexture() 로 설정한다.\n▣ 픽셀 셰이더에서 제공할 상수 값들을 설정한다. 응용 프로그램 안에서 SetPixelShaderConstant()로 설정할 수 있고, 픽셀 셰이더의 def 명령으로 설정할 수도 있다.\n▣ 픽셀 셰이더에는 텍스처 어드레스 명령들과 산술 명령들이 있다. ps.1.1-ps.1.3 에서는 텍스처 어드레스 명령들이 텍스처 데이터를 로드하고 변경할 수 있다. ps.1.4 의 경우에는 텍스처 데이터를 로드하는 것만 가능하다. ps.1.4 와 ps.1.1-ps.1.3 에서 텍스처 데이터를 변경할 때에는 산술 명령들을 사용한다.\n▣ 픽셀 셰이더의 소스를 작성한 후에는 컴파일해야 한다.\n▣ 픽셀 셰이더의 핸들을 얻으려면 CreatePixelShade() 로 픽셀 셰이더를 생성해야 한다.\n▣ 픽셀 셰이더를 사용하려면 픽셀 셰이더를 SetPixelShader() 로 설정해야 한다.\n▣ 픽셀 셰이더를 사용하고 난 후에는 픽셀 셰이더가 가지고 있던 자원을 DeletePixelShader() 로 해제해야 한다.\n=== <html> <!픽셀 셰이더 프로그래밍의 개요 > </html>\n=== <html> <! 3. 픽셀 셰이더의 기초 > </html>\n+++!!![4. 픽셀 셰이더 프로그래밍]\n◇ 볼프강 F. 엥겔 (Wolfgang F. Engel)\n+++!!!![# RacorX6 ]\n<html> <span style="font-size: 12px;"> <b> 픽셀 당 조명 </b> </span> </html>\n''L을 텍스처 공간으로 변환''\n(p.202) U와 W 벡터들을 구한 후에는 다음과 같은 정점 셰이더를 통해서 L을 U와 W가 구성하는 텍스처 공간으로 변환한다.\n\ndcl_position v0 ; Position\ndcl_normal v3 ; Normal\ndcl_texcoord v7 ; Texture\ndcl_tangent v8 ; Tangent\n\nm3x3 r5, v8, c0 ; generate tangent U\nm3x3 r7, v3, c0 ; generate normal W\n\n; Cross product\n; generate binormal V\nmov r5.w, v8.w ; 초기화 (주의 w의 초기 값이 없는 경우, 다음 계산에서 에러 발생)\nmov r7.w, v3.w ; 초기화\nmul r0, r5.yzxw, r7.zxyw;\nmad r6, r5.yzx, -r7.zxy,-r0;\n\n;transform the light vector with U, V, W\ndp3 r8.x, r5, -c12\ndp3 r8.y, r6, -c12\ndp3 r8.z, r7, -c12\n\n; 색상 출력\nmad oD0.xyz, r8.xyz, c33, c33 ; multiply a half to bias, then add half\n\n+++[ // X 파일 로딩... //================================ ]\n{{{\n// Create the shader declaration.\nD3DVERTEXELEMENT9 decl[] =\n{\n { 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 }, // position\n { 0, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0 }, // Normal\n { 0, 24, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TANGENT, 0 }, // tangent\n { 0, 36, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 }, // texture\n D3DDECL_END()\n};\n\n\nHRESULT CMyD3DApplication::LoadXFile(TCHAR* name)\n{\n HRESULT hr;\n LPD3DXMESH pMeshSysMem = NULL;\n\n if (FAILED(D3DXLoadMeshFromX(name, D3DXMESH_SYSTEMMEM, m_pd3dDevice, \n NULL, NULL, NULL, NULL, &pMeshSysMem)))\n return E_FAIL\n ;\n ID3DXMesh * temp;\n\n hr = pMeshSysMem->CloneMesh(D3DXMESH_MANAGED, decl, m_pd3dDevice, &temp);\n pMeshSysMem->Release();\n pMeshSysMem = temp;\n\n m_iNumTriangles = pMeshSysMem->GetNumFaces();\n m_iNumVertices = pMeshSysMem->GetNumVertices();\n\n DWORD *adjacency = NULL;\n adjacency = new DWORD[m_iNumTriangles * 3];\n\n pMeshSysMem->GenerateAdjacency(ADJACENCY_EPSILON, adjacency);\n\n // compute U (tangent) - Vertex 정의가 없는 경우, 실패한다. \n hr = D3DXComputeTangent(pMeshSysMem, 0, 0, D3DX_COMP_TANGENT_NONE, TRUE, adjacency);\n if (FAILED(hr))\n return E_FAIL;\n\n // compute the normals - Vertex 정의가 없는 경우, 실패한다.\n hr = D3DXComputeNormals(pMeshSysMem, adjacency);\n if (FAILED(hr))\n return E_FAIL;\n\n delete[] adjacency;\n\n hr = pMeshSysMem->GetIndexBuffer(&m_pIndexBuffer);\n if (FAILED(hr))\n return E_FAIL;\n hr = pMeshSysMem->GetVertexBuffer(&m_pVertices);\n if (FAILED(hr))\n return E_FAIL;\n // cleanup\n SAFE_RELEASE(pMeshSysMem);\n\n return S_OK;\n}\n}}}\n===\n\n\n<html> <span style="font-size: 12px;"> <b> 셰이더와 무관한 코드 </b> </span> </html>\n(p.208) 이 예제는 가상 트랙볼 기능을 제공하는데, 그 부분의 코드는 몇 년 전 SGI가 오픈 소스로 공개한 것을 가져다 쓴 것이다. trackball.h에는 SGITrackball.cpp에 담긴 SGI 코드를 쉽게 사용할 수 있도록 하는 인터페이스가 정의되어 있다.\n\n<html> <span style="font-size: 12px;"> <b> 요약 </b> </span> </html>\n(p.209) RacorX6은 정점 셰이더의 결과를 픽셀 셰이더가 받아서 사용하는 방법을 보여준다. 픽셀 셰이더에 쓰이는 모든 데이터는 정점 셰이더에 의해 계산, 제공된다. 텍스처 공간 좌표계를 구축하기 위한 U와 W 벡터는 *.x 파일을 로드한 후 D3DXComputeNormals()와 D3DXComputeTangent() 함수로 단 한 번만 계산해 둔다. \n대역폭을 절약하기 위해, 종법선에 해당하는 V 벡터는 미리 계산해 두지 않고 정점 셰이더에서 매 정점마다 계산한다. U, V, W로 구성된 텍스처 공간 좌표계는 빅 벡터 L을 텍스처 공간으로 변환하는 데 쓰인다. 변환된 L은 색 출력 레지스터 oD0을 통해서 픽셀 셰이더에 전달된다. 이 예제에서 텍스처 공간 좌표계는 픽셀 당 조명의 기조로 쓰였으며, 이는 이후의 예제들에서도 마찬가지이다.\n=== <html> <! # RacorX6 > </html>\n+++!!!![# RacorX7 ]\n(p.209) RacorX6에 비해 RacorX7에서의 주된 개선점은 분산 반사 모형 대신 반영(specularity) 반사 모형을 사용하는 것이다.\ncf.하이라이트와 같은 강한 반사는 입사한 빛이 반사되는 각도에서 보았을 때 제일 강하게 반사된다.\n이말은 (시선이 물체에서 반사되었을 때, 그 방향이 빛의 입사방향에 가까울수록 밝게 보인다.)고 바꾸어 말 할 수 있다\n\nRacorX7은 RacorX6과 동일한 텍스처 및 텍스처 단계 상태들을 사용한다. 상수는 하나 더 추가되었다.\n(관찰자 방향을 의미하는 벡터 추가)\n\n<html> <span style="font-size: 12px;"> <b> 픽셀 셰이더 명령들 </b> </span> </html>\n(p.210) 반영 반사를 서술하려면 적어도 광원의 위치 L, 관찰자의 방향 V, 표면 법선의 방향 N이 필요하다. 그리고 반사의 방향을 의미하는 벡터 R 도 있으면 편하다. 원래의 퐁 공식에서는 R 벡터의 계산에 비용이 많이 드나, 짐 블린(Jim Blinn)이 소개한 중간 벡터 H (반각 벡터라고도 한다)를 이용하면 계산을 줄일 수 있다.\n\n+++[ // 07_v_SpecDot3Pix.vsh //================================ ]\n{{{\n; Constant registers \n; c0-c3 - world space transposed\n; c8-c11 - world * view * proj\n; c12 - Light Direction (In World Space)\n; c24 - camera direction\n; c33 - four constants with 0.5f\n\nvs.1.1 // 정점 쉐이더 버전 1.1\n\n; Input registers\n; the dcl_* stuff was new to DX9.\ndcl_position v0 ; Position\ndcl_normal v3 ; Normal\ndcl_texcoord v7 ; Texture\ndcl_tangent v8 ; Tangent\n\n; position in clip space\nm4x4 oPos, v0, c8\n\nm3x3 r3, v8, c0 ; generate tangent U\nm3x3 r5, v3, c0 ; generate normal W\n\n; Cross product\n; generate binormal V\nmov r3.w, v8.w ; 초기화\nmov r5.w, v3.w ; 초기화\nmul r0, -r3.zxyw, r5.yzxw;\nmad r4, -r3.yzxw, r5.zxyw,-r0;\n\n; position in world space\nm4x4 r2, v0, c0 \n\n; get a vector toward the camera/eye V\nadd r2, -r2, c24\n\n; normalize eye vector V\ndp3 r11.x, r2.xyz, r2.xyz \nrsq r11.xyz, r11.x \nmul r2.xyz, r2.xyz, r11.xyz \n\nadd r2.xyz, r2.xyz, -c12 ; get half angle\n\n; normalize half angle\ndp3 r11.x, r2.xyz, r2.xyz \nrsq r11.xyz, r11.x \nmul r2.xyz, r2.xyz, r11.xyz \n\n; transform the half angle vector into texture space\ndp3 r8.x,r3,r2\ndp3 r8.y,r4,r2\ndp3 r8.z,r5,r2\n\n; half vector -> oD1\nmad oD1.xyz, r8.xyz, c33, c33 ; multiply by a half to bias, then add half\n \nmov oT0.xy, v7.xy\nmov oT1.xy, v7.xy\n}}}\n===\n\n+++[ // 07_p_SpecDot3(/314).psh //================================ ]\n{{{\nps.1.1\ntex t0 ; color map\ntex t1 ; normal map\ndp3 r0,t1_bx2,v1_bx2; ; dot(normal,half)\n\nmul r1,r0,r0; ; raise it to 32nd power\nmul r0,r1,r1; \nmul r1,r0,r0;\nmul r0,r1,r1;\n\n; assemble final color\nmul r0,t0,r0\n\n//-----------------------------------------------------------------------------\nps.1.4\ntexld r0, t0 ; color map\ntexld r1, t1 ; normal map\ndp3 r2, r1_bx2, v1_bx2 ; dot(normal, half)\n\nmul r3,r2,r2 ; raise it to 32nd power\nmul r2,r3,r3 \nmul r3,r2,r2\nmul r2,r3,r3\n\nmul r0, r0, r2 \n}}}\n===\n\n(p.213) 반영 지수를 픽셀 셰이더 안에서 mul 명령들로 계산해 조명에 적용시키년 눈이 띄는 벤딩(banding) 결함이 생길 수 있다.\n\n<html> <span style="font-size: 12px;"> <b> 요약 </b> </span> </html>\nRacorX7은 반영 반사 모형을 구현하는 한 가지 방법을 제시한다. 이 예제의 단점은 반영 지수 값들의 정밀도가 낮다는 점이다. 다음의 RacorX8에서는 좀더 높은 정밀도의 반영 반사를 얻는 한 가지 방법이 소개된다.\n=== <html> <! # RacorX7 > </html>\n+++!!!![# RacorX8 ]\n(p.214) RacorX7과 달리 RacorX8은 반영 지수들을 픽셀 셰이더에서 직접 계산하지 않고 미리 만들어진 참조 테이블(반영 맵)로부터 읽어온다. 이러한 참조 테이\n\n블 기법 덕분에 밴딩이 줄어든다. 이는 반복적인 mul 명령들로 얻는 결과보다 더 높은 정빌도의 값들을 참조 테이블로부터 가져올 수 있기 때문이다.\n\n이 방법의 단점은 반영 지수들을 담은 참조 테이블(반영 맵) 때문에 텍스터 단계가 하나 더 필요하다는 것이다.\n\n<html> <span style="font-size: 12px;"> <b> 텍스처 연산 플래그들의 설정 (D3DSAMP_* 플래그들) </b> </span> </html>\n(p.214) RacorX8 역시 RestoreDeviceObjects()에서 텍스처 연산 플래그들을 설정한다. 이전 예제에 비해 반영 지수 값들을 담은 텍스처 맵(반영 맵)을 위한 텍스처 단계 상태 설정들이 두 개 추가되었다.\n{{{\n// additionally for table specular \nm_pd3dDevice->SetSamplerState(2, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP); \nm_pd3dDevice->SetSamplerState(2, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);\n}}}\nD3DTADDRESS_CLAMP 플래그는 텍스처가 한 번만 적용되며 범위 밖의 텍스처 좌표들에 대해서는 가장자리 픽셀의 색이 반복된다는 뜻이다. 이 플래그가 없다면 지구 둘레애 흰색의 고리가 나타나게 될 것이다.\n\n<html> <span style="font-size: 12px;"> <b> 픽셀 셰이더 명령들 </b> </span> </html>\n(p.216) 픽셀 셰이더에게 데이터를 제공하는 정점 셰이더는 마지막 네 줄만 빼고는 이전 예제와 동일하다.\n{{{\n...\n; oT0 coordinates for normal map\n; oT1 half angle\n; oT2 half angle\n; oT3 coordinates for color map\nmov oT0.xy, v7.xy \nmov oT1.xyz, r8 \nmov oT2.xyz, r8 \nmov oT3.xy, v7.xy\n}}}\n법선 맵과 색 맵에 대한 좌표들은 각각 oT0과 oT3에 저장된다. 반각 벡터는 하나의 텍스처 좌표 쌍 형태로 oT1과 oT2에 저장된다. 이들은 픽셀 셰이더에서 3x2 행렬 형태로 쓰인다. 행렬의 값들은 텍스처 단계 2의 반영 맵에 저장되어 있던 지수 값들이다.\n\n{{wrappingClass{ (p.218) Note <br> 정점 셰이더의 출력 레지스터 값은 (0.. 1)로 한정된다. 이는 음의 값은 0으로 설정되고, 양의 값은 그대로 변하지 않고 남는다는 뜻이다. 이러한 범위 한정의 문제를 피하는 한 가지 방법은, 정점 셰이더를 거치지 않고 픽셀 셰이더에서 텍스처로부터 데이터를 직접 로드하는 것이다. }}}\n\n<html> <span style="font-size: 12px;"> <b> 요약 </b> </span> </html>\n(p.219) 이 예제는 반영 지수 참조 테이블(반영 맵 ; 내부에서 생성된 텍스처)을 사용해서 반영 지수의 정밀도를 개선했다. 이 기법의 단점은 추가적인 텍스처를 사용한다는 것인데, 이 문제는 법선 맵의 알파 채널을 활용하는 것으로 극복할 수 있다.\n=== <html> <! # RacorX8 > </html>\n+++!!!![# RacorX9 ]\n(p.219) RacorX9는 분산 반사 모형과 반영 반사 모형을 결합한다. 이는 RacorX6과 RacorX7에 기반한 것이다. 이 예제의 ps.1.4 셰이더는 반영 값을 법선 맵의 알파 채널로부터 읽어오도록 개선되었다.\n\n(p.220) 이전 예제에 비해 이 예제의 특징은 반사 모형들을 단 2 개의 텍스처들로 처리한다는 점이다. 절약한 텍스처 하나는 다른 작업 또는 더 향상된 픽셀 당 조명을 위해 사용할 수 있다.\n\n(p.223) m_pLightMap16의 반영 맵은 LightEval() 함수(RacorX8에 이미 나왔다)로 만들어 둔 것이다. 위의 코드는 그 맵의 값들을 맵의 알파 채널에 집어넣은 후 맵을 해제한다.\n\n<html> <span style="font-size: 12px;"> <b> 요약 </b> </span> </html>\n(p.224) 주된 장점은 하나 이상의 픽셀 당 조명에 사용할 수 있는 명령 슬롯들이 남는다는 점이다. 픽셀 당 조명에서 한 가지 권장할 만한 규칙은, 한 장면 안에서 주된 물체에 대해서는 픽셀 당 조명을 최대 3 개까지만 사용하고, 장면의 나머지 것들에 대해서는 정점 당 조명을 사용하라는 것이다.\n\n이번 장의 예제들은 여러 가지 방향으로 개선해 볼 수 있을 것이다. 특히 RacorX5에서 정점 기반으로 적용했던 감쇠 계수를 픽셀 기반으로 계산해서 적용한다거나, 또는 감쇠 맵을 이용해서 픽셀 당 감쇠를 적용하는 방식 등을 고려해 보기 바란다.\n=== <html> <! # RacorX9 > </html>\n=== <html> <! 4. 픽셀 셰이더 프로그래밍 > </html>\n <html> <span style="font-size: 14px; color: #006699"> <b>5. Shader Studio를 이용한 기초족인 셰이더 개발 </b> </span> </html>\n ◇ 존 슈왑 (John Schwab)\n\n
<html>\n<table>\n <tr> \n <td> <IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_ShaderX2_DirectX9_Tip.jpg" height=64 >\n </td>\n <td> <b> 도서_ShaderX² : DirectX 9 셰이더 프로그래밍 팁 & 트릭 </b> <br>\n(원표제: ShaderX² Shader Programming Tips & Tricks with DirectX 9) <br>\n<br>\n▼ WOLFGANG ENGEL 지음/ 정재원 옮김/ 2004.10.15. 출간/ 정보문화사/ 89-5674-214-6 <br>\n </td> \n </tr>\n</table>\n</html>\n\n!!! 편집자 서문\n『ShaderX2: DirectX 9 셰이더 프로그래밍』 (ShaderX2 Introductions & Turorials with DirectX 9)\n『ShaderX2: DirectX 9 셰이더 프로그래밍 팁 & 트릭』 (ShaderX2 Shader Programming Tips & Tricks with DirectX 9)\n\n첫 번째 책은 독자들이 셰이더 프로그래밍을 시작하는 데 도움이 되는 것들을 중심으로 엮었고, 두 번째 책(이 책)은 숙련된 셰이더 프로그래머에게 필요한 팁과 트릭들로 구성하였다.\n\n+++!!![1부 기하 조작 트릭 ]\n1. 정점 셰이더를 사용한 기하 압축 \n2. 정점 셰이더에서 참조표 사용하기 \n3. 정점 셰이더를 이용한 지형 기하 모핑 \n4. GPU로 나타내는 3D 행성 \n5. 픽셀 및 정점 셰이더 3.0을 사용한 옷감 애니메이션 \n6. 충돌 셰이더\n7. 변위 매핑 \n===\n+++!!![2부 렌더링 기법 ]\n1. 두꺼운 입체로 렌더링하기 \n2. 최소한의 정점 버퍼 잠금으로 입자들을 화면 정렬하기 \n3. 래디오시티 맵을 사용한 반구 조명 계산 \n4. 성운 텍스처 \n5. 몰아치는 태양(Turbulent Sun) \n6. 프래그먼트 수준의 퐁 조명 계산 \n7. ps_1_4 이전 하드웨어에서의 스페큘러 범프 매핑 \n8. ps_3_0을 사용한 복셀 렌더링 \n9. 부동소수 렌더 타깃 간의 블렌딩 연산 시뮬레이션하기 \n10. 광선 추적으로 정점 및 픽셀 셰이더에서 입체 렌더링하기 \n11. 법선 맵 압축하기 \n12. 흐르는 물방울과 텍스처 스프라이트 \n13. 고급 물 효과 \n14. 복사 조도 환경 맵의 효율적인 계산 \n15. 실용적인 기 계산된 복사 휘도 전달 \n16. 고급 천구 렌더링 \n17. 다중 렌더 타깃을 통한 지연 셰이딩 \n18. Meshuggah의 효과들에 대한 소개 \n19. 층진 자동차 페인트 셰이더 \n20. 기하 및 셰이딩 왜곡을 사용한 모션 블러 \n21. 얇은 표면에서의 무지개 빛깔과 반투명도 효과 시뮬레이션하기 \n22. 부동소수 큐브 맵 \n23. 셰이더를 사용한 하드웨어 입체 영상 렌더링 \n24. 음영선과 스트로크 스타일, 점묘 화법 \n25. 층진 안개 \n26. GPU를 통한 밀집 행렬 연산 \n===\n+++!!![3부 소프트웨어 셰이더와 셰이더 프로그래밍 팁 ]\n++++!!!![1. 소프트웨어 정점 셰이더 처리 ]\n◇ Dean P. Macri (Intel Cporporation)\n\n<html> <span style="font-size: 14px;"> <b> #. 왜 소프트웨어 정점 처리를 사용하는가? </b> </span> </html>\n(p.545) DirectX가 제공하는 정점 셰이더 모형을 살펴보면, 소프트웨어 정점 처리를 사용해야 하는 여러 이유들이 금방 머리 속에 떠오른다.\n\n▣ 정점 셰이더를 지원하지 않는 그래픽 하드웨어를 지원한다.\n▣ 현 하드웨어에서 지원하는 것보다 더 높은 버전의 셰이더를 사용할 수 있다.\n▣ 하드웨어 셰이더 제한보다 더 많은 명령어를 사용하는 셰이더를 작성할 수 있다.\n\n좀 더 생각을 해보면, 다음과 같이 소프트웨어 정점 처리를 해야 하는 덜 명확한 이유들도 떠올릴 수 있다.\n\n▣ 정점 셰이더의 출력에 픽셀 처리 이외의 다른 작업 수행\n▣ 익숙한, 벡터 기반 셰이더 모형을 사용하여 그래픽 이외의 작업 수행\n▣ 여러 엔더유저 시스템들에 대해 예측 가능한 성능 및 호환성 보장\n\n<html> <span style="font-size: 14px;"> <b> #. 최적화 가이드라인 </b> </span> </html>\n(p.550) ''APi가 제공하는 가장 높은 버전의 셰이더를 사용한다''\nDirectX 9는 vs.2.0, vs.2.x, vs.3.0의 세 가지 정점 셰이더 모형을 도입하였다. 소프트웨어 파이프라인의 경우에는, 2.x 및 3.0 모형에서 레지스터 및 라벨 수 제한을 확장하고 명령어 수 한계를 없앤 vs.2.sw 및 vs.3.sw 버전을 또한 지원하고 있다. 가능한 가장 높은 셰이더 버전(vs.3.0 또한 제한이 문제라면 vs.3.sw)을 사용함으로써, 그 셰이더 모형이 제공하는 모든 기능들을 활용하여 가능한 한 최대 성능을 얻을 수 있다. \n\n(p.550) ''매크로를 사용한다''\nDirectX 9의 셰이더 모형들에서는 여러 매크로 명령어들을 지원하고 있다 (일부는 새로운 것이고 일부는 이전 셰이더 버전들에 지원되던 것들이다). 행렬 곱셈 연산(M4X4, M3X4 등)과 외적 연산(CRS)이 그 예이다. 이들을 사용하면 컴파일러가 어떠한 레지스터들을 임시적으로 메모리에 저장해야 하고 어떠한 것들을 사용 후에 버릴 수 있는지에 관해 더 영리한 결정을 할 수 있게 된다.\n\n(p.551) ''많이 사용되는 상수들을 정의한다''\ndef와 defi, defb 명령어를 사용하여 셰이더 내에서 상수를 정의하는 경우에는, 컴파일러가 특정 값을 조사하여 셰이더 밖에서 DirectX API를 통해 상수들을 정의한 경우보다 더 최적화된 코드를 만들어낼 수 있다...\n어떻게 셰이더를 사용할 것인지에 관계없이 항상 일정한 상수 값들은 모두 def, defi, defb 명령어를 사용하여 셰이더 내에 직접 정의해야 한다.\n\n(p.551) ''출력 레지스터에 바로 쓴다''\n(p.551) ''소스 스위즐과 목적 마스크를 사용한다''\n(p.552) ''종속 사슬을 최소화한다''\n(p.552) ''기본 블록 간의 임시 레지스터 사용을 최소화한다''\n\n(p.553) ''반복문에서 aL이 필요하지 않다면 rep 명령어를 사용한다''\nvs.2.0 셰이더 모형에서는 rep 와 loop 의 두 가지 반복문이 도입되었다. rep 명령어는 정수 상수에 기반하여 명령어 시퀀스를 정해진 횟수만큼 반복할 수 있게 해준다. loop 명령어는 비슷하게 동작하지만, aL 레지스터를 반복 카운터로 상수 풀을 인텍싱하는 데 사용할 수 있다. 반복 카운터에 기반하여 상수 레지스터를 접근할 필요가 없는 반복문의 경우에는, 컴파일러가 더 간소한 코드를 만들어낼 수 있도록 rep 명령어를 사용하는 것이 좋다.\n\n(p.553) ''주소 레지스터 사용을 피하거나 기대값에 따라 정점들을 재정렬한다''\n(p.554) ''불필요한 조건부 실행을 없앤다''\n(p.554) ''마스킹을 쓸 수 없는 소수의 명령어들에 대해서는 조건자를 사용한다''\n\n(p.555) ''break 명령어를 사용하여 반복문에서 일찍 빠져나온다''\nvs.2.x 와 vs.3.0 셰이더 모형에서 제공하는 break_xx 명령어를 통해, 맞는 조건을 검사하고 해당 반복의 나머지 부분에서 어떤 유용한 계산을 하지 않게 되는 반복문을 빠져나올 수 있다. \n\n(p.555) ''조건부 실행을 사용하여 드물게 사용되는 코드에서 일찍 빠져나온다''\n(p.556) ''기대되는 행동 패턴에 근거하여 조건부 데이터를 정렬한다''\n\n(p.556) ''프로파일링이 중요하다!''\n__셰이더 어셈블리를 조정해가면서 프레임율을 살펴보는 것__ 이외에는 정점 셰이더를 프로파일링할 수 있는 별다른 방법이 없었는데, 이용할 수 있는 툴이 거의 없었기 때문이다.\n이제 인텔의 ''VTume'' 성능 분석기 7.0에서 소프트웨어 정점 셰이더의 프로파일링과 최적화를 매우 쉽게 해주는 기능을 지원한다.\n\n(p.558) 소프트웨어 정점 셰이더를 프로파일링하는 데 VTune 분석기를 사용할 때에 한 가지 주의해야 할 점은 정점 셰이더 선언과 셰이더를 생성하는 시점에 샘플링이 커져 있어야 한다는 것이다.\n\n... 가장 추천할만한 대처법은 VTPause()와 VTResume() API를 사용하여 정점 셰이더 및 선언의 생성 주분에서 샘플링이 켜져 있도록 하는 것이다.\n\n<html> <span style="font-size: 14px;"> <b> #. 결론 </b> </span> </html>\n(p.559) DirectX 9에서 지원하는 소프트웨어 정점 처리는 매우 훌륭한 성능을 제공하기 때문에, 그를 통해 그래픽 및 비 그래픽 관련 계산 모두에 정점 셰이딩을 이용하는 게임 타이틀을 충분히 제작할 수 있다. 이를 사용하면 컨슈머 시장에 다다른 최신 프로세서들의 명령어 셋과 테크놀로지 특징들을 십분 활용하는 벡터화된 코드를 매우 쉽고 유연하게 만들 수 있는 것이다. 이 글에서 설명하는 가이드라인들은 셰이더가 최적으로 돌게 하고, 다른 게임 관련 계산에 프로세서를 할애할 수 있게 하여, 수많은 작품들 속에서도 눈에 띄는 타이틀을 만들 수 있도록 도와줄 것이다.\n<br>\n===\n<html> <span style="font-size: 12px; background-color: #d7dedd; "> <b> 2. x86 셰이더-소프트웨어 ps_2_0 셰이더 </b> </span> </html>\n<html> <span style="font-size: 12px; background-color: #d7dedd; "> <b> 3. SoftD3D: 마이크로소프트 Direct3D API의 소프트웨어 전용 구현 </b> </span> </html>\n<html> <span style="font-size: 12px; background-color: #d7dedd; "> <b> 4. 셰이더 개발에서의 지명 상수 </b> </span> </html>\n===\n+++!!![4부 이미지 공간 ]\n1. DirectX 9 픽셀 셰이더를 사용한 고급 이미지 프로세싱 \n2. 야간 시야: ps.1.1 하드웨어에서의 프레임 버퍼 후처리 \n3. MotoGP 2에서의 비실사적 후처리 필터 \n4. DirectX 9 픽셀 셰이더를 사용한 이미지 효과 \n5. 픽셀 셰이더를 통해 문자를 사용한 모자이크 효과 구현하기 \n6. 만델브로트 집합 렌더링하기 \n7. 실시간 피사계 심도 시뮬레이션 \n===\n+++!!![5부 그림자 ]\n1. 부드러운 그림자 \n2. 견고한 개체 ID 그림자 \n3. 역으로 돌출된 그림자 입체 \n===\n++++!!![6부 3D 엔진 및 툴 디자인 ]\n<html> <span style="font-size: 12px; background-color: #d7dedd; "> <b> 1. 셰이더 추상화 </b> </span> </html>\n<html> <span style="font-size: 12px; background-color: #d7dedd; "> <b> 2. 효과 버퍼를 통한 흥미로운 후처리 </b> </span> </html>\n<html> <span style="font-size: 12px; background-color: #d7dedd; "> <b> 3. 셰이더 제어(Codecreatures 엔진) </b> </span> </html>\n<html> <span style="font-size: 12px; background-color: #d7dedd; "> <b> 4. Gamebryo 그래픽 엔진에서의 셰이더 통합 </b> </span> </html>\n\n+++!!!![5. 정점 셰이더 컴파일러 ]\n◇ David Pangerl\n\n<html> <span style="font-size: 14px;"> <b> #. 소개 </b> </span> </html>\n(p.893) 정점 셰이더 컴파일러(VSC)는 프리웨어인 C 기반 DirectX 정점 셰이더(VS) 컴파일러이다. 이는 DirectX VS 어셈블리 프로그래밍을 위한 고수준 프로그래밍 언어(HLPL, high-level programming language)를 제공한다. VSC의 출력은 부가적인 런타임 정보를 가지는 최적화된 VS 어셈블러이다.\n\n<html> <span style="font-size: 14px;"> <b> #. 현 기능 </b> </span> </html>\n(p.893) VSC 는 빠르고 견고하며 안정적인 컴파일러이다. 정점 셰이더 파이프라인을 여러 부분으로 나누도록 설계되었다. 이것은 또한 강력한 플러그인 시스템과 고유의 (built-in) 최적화, 프리컴파일러를 제공한다. 이는 다음과 같은 기능을 가진다.\n\n▣ 문자열 또는 파일을 통해 제공되는 프로그램의 컴파일\n▣ 다른 메쉬 정점 유형들에 대해 같은 코드 적용 가능\n▣ 함수 스왑핑(swapping)\n▣ 빠른 컴파일\n▣ 괜찮은 최적화\n▣ 레지스터 제한 처리\n▣ VS 배열 지원\n▣ 매우 간단한 인터페이스의 작고 간단한 C++ 코드 (~3300 라인)\n\n<html> <span style="font-size: 14px;"> <b> #. VSC 라이센스 </b> </span> </html>\n(p.894) VSC의 저작권은 ZootFly가 가진다. 본 라이브러리는 프리소프트웨어이다. BSD식의 라이센스 하에 이를 재배포하거나 수정할 수 있으며, 그 라이센스에 대해서는 본 라이브러리의 license_bad.txt 파일을 참조한다.\n\n<html> <span style="font-size: 14px;"> <b> #. 개념 </b> </span> </html>\n<html> <span style="font-size: 14px;"> DirectX 정점 셰이더 어셈블러 </span> </html>\n\n(p.894) DirectX VS 어셈블러는 정점 처리를 프로그래밍하는 직접적인 방식이다. 매우 강력하고 유용하지만, 그것을 사용하기 위해서는 여러 분야에서의 지식이 필요하다.\n\n▣ 기본적인 어셈블리 지식\n▣ 명령어 명세 (DirectX 문서)\n▣ 명령어 제한 (DirectX 문서)\n▣ 레지스터 용법 (DirectX 문서)\n▣ 명령어 당 레지스터 제한 (DirectX 문서)\n\n가장 간단한 함수(길이, sin, cos 등) 조차도 많은 어셈블리 명령을 필요로 한다. 또한 HLPL 과는 약간 다른 접근을 필요로 한다. 게다가 어셈블리 코드의 유지보수와 디버깅, 업그레이드는 매우 어렵고 힘든 작업이다.\n\n이러한 이유로, 어셈블리 프로그래밍의 모든 귀찮은 작업을 없애기 위해, 우리는 별도의 HLPL을 개발하기로 결정하였다.\n<br>\n===\n++++!!!![6. 셰이더 역어셈블러 ]\n◇ Jean-Sebastian Luce (Nadeo)\n\n(p.916) 마이크로소프트 DirectX 9에서는 새로운 셰이딩 언어인 고수준 셰이딩 언어(HLSL)가 되입되었는데, 이는 이전의 셰이더 어셈블리와 비교하면 훨씬 더 쉽게 사용할 수 있다. 그러나 비디오 드라이버는 오직 셰이더 바이트 코드만 이해하므로, DirectX 런타임에서 HLSL과 어셈블리 셰이더 코드를 각각 컴파일하고 어셈블해야 한다. 셰이더 어셈블리와는 달리, __셰이더 바이트 코드는 인간이 "읽을 수 있는" 형태가 아니다.__ 이 글에서는 셰이더 바이트 코드를 (역으로) 어셈블리 명령어로 변환하는 방법을 제시한다.\n\n<html> <span style="font-size: 14px; "> <b> #. 셰이더 역어셈블러: 무엇에 유용한가? </b> </span> </html> \n(p.917) HLSL은 프로그래머에게 여러모로 유용하지만, 생성된 코드가 직접 작성한 어셈블리 코드만큼 최적이 아닐 수 있다는 단점을 지닌다. 때때로 HLSL로 코딩하는 경우, 프로그래머가 완전히 @@color(#0000FF): 벡터화된 연산을 사용@@하는 것을 잊으면 최적이 아닌 이진 프로그램이 나올 수 있는 것이다.\n\n(p.918) 게다가, 초기의 픽셀 셰이더 하드웨어(ps_1_x)는 나중 버전에 비해 그 능력이 매우 제한적이다(소수의 주소 지정 및 산술 명령어, 소수의 가용한 명령어 슬롯). 그러므로 이러한 플랫폼들에 대한 HLSL 코딩은 주의 깊게 이루어져야 한다.\n... 따라서 HLSL 프로그래머는, 적어도 목적 플랫폼의 제한점을 알고 있어야 하는데, 생성된 어셈블리 코드를 샬펴볼 수 있다면 최적화 코드 작성에 도움이 될 것이다. 이러한 이유로 생성된 HLSL 프로그램의 셰이더 어셈블리를 읽고 검사하는 것이 중요하다. DirectX 9 SDK에서 HLSL 컴파일러가 생성한 어셈블리 코드를 볼 수 있는 유일한 방법은 @@color(#FF0000): 외부 컴파일러 fxc.exe를 -Fc 옵션으로 사용하는 길뿐이다. @@\n\n<html> <span style="font-size: 14px; "> <b> #. 셰이더 바이트 코드 해설 </b> </span> </html> \n(p.921) 상대 주소 지정이 활성화되고 셰이더 버전이 2_0 이상이면 (vs_1_1은 항상 암묵적으로 유일한 주소 레지스터인 aO.x를 사용한다), 이 매개변수 토큰 뒤로 상대 주소 지정 토큰이 온다.\n\n(p.922) def, defi, defb와 같은 특수한 어셈블리 명령어들은 어셈블리로 작성된 상수 값들을 나타내는, 각각 부동소수점 수, 정수, 부울의 소스 매개변수를 필요로 한다. \n\n어셈블리 명령어 dcl은 용도와 용도 색인 또는 텍스처 유형(샘플러 레지스터의 경우)의 정보를 가지는 (레지스터 유형과 번호에 더하여) 특수한 매개변수 토큰이 뒤따른다.\n\n디버그 정보를 저장하기 위해 컴파일러가 주석 토큰을 사용할 수도 있다(여기서는 오직 다음 명령어 토큰을 위한 점프 오프셋을 계산하기 위해 그를 읽어온다).\n\n종료 토큰(Ox0000FFFF 값으로 인식하는)으로 셰이더 바이트 코드 스트림은 끝난다.\n\n<html> <span style="font-size: 14px; "> <b> #. 역어셈블리 알고리즘 </b> </span> </html> \n(p.922) 각 명령어마다 다음 명령어 토큰에 앞서 하나 이상의 매개변수 토큰들이 뒤이으므로, 셰이더 바이트 코드를 역어셈블하기 위해서는, 각 명령어 토큰을 파싱하고 해당 명령어에 따라 개대되는 매개변수 토큰들을 파싱하여, 역어셈블리를 출력하고 다음 명령어로 넘어가게 된다.\n\n새로운 토큰을 가지고 제일 먼저 해야 할 것은 그가 특수 토큰(즉, 버전 토큰이나 주석 토큰, 종료 토큰)인지 검사하는 것이다. 이러한 토큰들 중 하나가 아니라면, 명령어의 연산 코드를 확인해야 한다. 그러고 나면 첫 번째 어려운 작업 부분을 맞닥뜨리게 된다. 다양한 원형(명령어의 인자들의 형과 개수)을 가지는 많은 상이한 명령어들이 존재하는 것이다.\n\n이 문제를 해결하기 위해 위해, 우리는 C 전처리 매크로를 사용하였다. Dx9ShaderBCode_Instr.h 파일을 읽어보면, (거의) 모든 명령어에 대해 OpCode_ID(가령, D3DSIO_NOP)와 그 매개변수들(소스/ 목적 레지스터에는 RegSrc/ Dst, 상수 값에는 Real/ Bool/ Interger)을 기술하는 줄이 하나씩 있음을 확인할 수 있다. 연산 코드에 대한 switch 구문으로, 각 매크로는 그 매개변수들을 명령어/ 매개변수 역어셈블리 함수에 대한 호출로 확장한다. 고유의 구문을 가지거나 (dcl 명령어처럼) 정점/ 픽셀 셰이더 타깃 버전에 따라 작동을 달리하는 (texcoord/ texcrd와 tex/ texId) 몇몇 명령어 연산 코드들을 특수한 방식으로 처리해 주어야 한다.\n\n(p.923) 이제는 각 명령어를 역어셈블하는 방법에 대해 더 자세히 살펴보자. 먼저, CatInstr 함수가 소문자로 명령어 이름을 출력하고, 몇몇 비고 명령어(ifc, breakc, setp)에 대해 부가적인 특수 제어 텍스트를 추가한 다음, 부가적인 쉬프트 텍스트와 목적 수식어 텍스트(둘 모두 다음의 목적 매개변수 토큰으로부터 가져온다)를 덧붙인다.\n\n그 다음에 CatParamRegSrc와 CatParamRegDst 함수로 목적 및 소스 매개변수들을 역어셈블한다. 이들 두 함수는 레지스터 명과 부가적인 색인을 출력하는 CatRegister 함수에 기반한다. CatParamRegSrc는 먼저 가능한 소스 수식어 (가령, 부정(negation)이나 보정(bias))로 시작하여, 레지스터 명을 출력하고 적절한 스위즐과 함께 부가적인 주소 지정 텍스트를(이 경우, 현 소스 매개변수 토큰에 이어 주소 레지스터 토큰이 나와야 한다), 그리고 필요에 따라 접미 수식어를 추가한다. 마지막으로 스위즐 지정자(".xxxx"에 대해서는 ".x"를 출력한다)를 추가한다. CatParamRegDst 는 레지스터에 쓰기 마스크만 추가하면 되기 때문에 더 간단하다.\n\n동반 수행과 조건 명령어 변경자는 연산 코드 스위치 전에 처리된다. 조건자의 경우가 더 어려운데, 이는 조건자 레지스터 코큰이 첫 번째와 두 번째 매개변수 토큰 사이에 삽입되기 때문이다(InstrToken, Param1Token, PredicateToken, Param2Token, ...). 이어지는 명령어의 역어셈블러 작업을 위해서는 조건자 토큰을 건너뛰어야 한다.\n===\n===\n\n\n
''error c2668: '***' : 오버 로드 된 함수 에 대한 호출 이 모호 합니다.''\nerror c2668: '***' : ambiguous call to overloaded function\n\nvisual c++ 버전 업그레이드, 변경 내용 중에 수식 라이브러리 함수의 C++ 오버로드 함수 관련된 변경사항이 있을 때 발생한다.\n오류를 해결 방법\n / 변경된 테이터 형으로 캐스팅\n / cmath로 이동한 c++ 오버로드 함수를 사용하기 위해서 #include <cmath> 를 추가\n{{{\n// C2668d.cpp\n#include <math.h>\nint main() {\n int i = 0;\n float f;\n f = cos(i); // C2668\n f = cos((float)i); // OK\n}\n\n// C2668e.cpp\n#include <math.h>\nint main() {\n pow(9,9); // C2668\n pow((double)9,9); // OK\n}\n}}}
◇ Michal Valient\n\n<html> <span style="font-size: 14px; "> <b> #. 소개 </b> </span> </html>\n\n(p.106) 이 글에서는 DirectX 9의 새로운 기능들에 대해 논의할 것이다. 고전적인 픽셀 당 셰이딩으로 시작하여 조명을 구현해보고, 좀더 질을 향상시킨, 룩업 텍스처는 사용하지 않는 셰이더 2.0으로 다시 구현해본 다음, 셰이더 버전 3.0을 이용하여 단일 패스에서 유동적인 조건 분기와 상대적 어드레싱을 이용하여 4개의 점적광을 구현할 것이다.\n\n다음으로 다룰 주제는 픽셀 당 환경 범프 매핑인데, (픽셀 셰이더 1.4에 포함되어 있는) DirectX 8.1을 먼저 소개하고 나서 새로운 셰이더 2.0을 소개할 것이다. 그리고 마지막으로 보다 인상적이고 현실적인 효과를 위해 프레널(Fresnel) 항을 추가할 것이다.\n\n이 글의 마지막에는 실시간 컴퓨터 그래픽에서는 일반적으로 사용하지 않는 두 가지 조명 모델에 대해 논의할 것이다. 이것은 주로 DirectX 버전의 제약보다는 하드웨어 제약에 의한 것이다.\n람베르트 분산(Lambertian diffuse) 모델의 오렌-나야르(Oren-Nayar) 생성은 셰이더 2.0으로 구현하였다. 이것은 진흙이나 자기 같은 재질을 더 현실적으로 만든다.\n쿡-토르란스(Cook-Torrance) 모델의 반영(specular) 부분도 시각적인 비교를 위해 셰이더 1.4와 2.0으로 구현하였다. 이 모델은 금속 표면에 대해서 매우 훌륭한 결과물을 내놓는다.\n\n\n<html> <span style="font-size: 14px; "> <b> #. 픽셀 당 퐁(phong) </b> </span> </html>\n\n<html> <span style="font-size: 14px; "> <b> 정점 및 픽셀 셰이더 2.0 </b> </span> </html>\n(p.107) 이 섹션에서는 퐁 조명이 새로운 셰이더 모델에서 사용 가능한지 알아볼 것이다. 이 글은 이전 버전에서 DirectX9로 업그레이드하려는 사람을 대상으로 쓰여졌다.\n\n<html> <span style="font-size: 12px; "> <b> 정점 셰이더 2.0 </b> </span> </html>\n(p.108) 새로운 정점 셰이더에서 픽셀 당 셰이딩을 설정하는 것은 버전 1.1과 별반 차이가 없다.\n...\n\n(p.109) 다음이 입력 레지스터 선언에서 첫 번째 찾을 수 있는 변화돤 부분이다.\n{{{\ndcl_position v0\ndcl_normal v1 \ndcl_texcoord v2\ndcl_tangent v3\n}}}\nDirect3D 8에서 정점들은 셰이더 바깥에서 셰이더를 생성할 때 선언되었다. 셰이더의 입력 레지스터가 데이터의 어떤 부분을 읽어들일지를 명시해야 한다. Direct3D 9에서는 다음 두 가지 유형의 선언이 있다.\n\n▣ ''SetVertexDeclaration 메소드를 포함하는 셰이더 외부'' 이 단계에서는, 각각의 입력 레지스터가 스트림으로부터 어떤 것을 읽어들일지를 정의한다(스트림의 시작 지점부터 데이터 요소까지의 바이트 상 거리와 float, vector에 대한 float3 등과 같은 데이터형, 그리고 나중에 셰이더에서 사용될 위치, 법선, 접선, 종법선 등과 같은 요소의 의미).\n▣ ''셰이더 내부'' 여기서는 특정한 의미를 가진 데이터에 대한 타겟 레지스터를 명시한다(예, 위치, 법선, 접선, 종법선 등 셰이더 외부에서와 같다).\n\n이것은 특정한 입력 구조를 예상하지 않고 셰이더를 작성할 수 있도록 하고 개개의 모델에 대한 새로운 정점 유형에 동일한 셰이더를 사용할 수 있게 한다. 앞의 예에서는 처음 4개 입력 레지스터에서 한 개의 위치와 텍스처 좌표, 법선, 종법선을 읽어들이지만 정점 스트림에서 이 데이터는 어디에서나 위치할 수 있고 심지어 다른 방식으로 정렬될 수도 있다(예, 법선, 텍스처 좌표, 위치, 접선).\n\n<html> <span style="font-size: 12px; "> <b> 픽셀 셰이더 2.0 </b> </span> </html>\n(p.112) 정점 셰이더는 버전 1.1과 단지 사소한 부분에서 차이가 있었지만, 픽셀 셰이더에서는 보다 많은 부분이 변화되었다.\n...\n\n(p.113) 첫줄부터 바뀐 것들이 보인다. 먼저 정점 셰이더에서 넘어온 것을 받아 입력 레지스터를 명시해야 한다.\n... 만약 정점 셰이더가 이것을 채우지 않으면, 실행 시에 셰이더 링커는 실패할 것이다. 그리고 셰이더 전체에 걸쳐서 자유롭게 그것을 읽기 전용 레지스터로 사용할 수 있다.\n\n다음은 입력 레지스터 선언이다.\n{{{\ndcl t0.xy // 텍스처 좌표\ndcl t1.xyz // 빛 벡터\ndcl t2.xyz // 시선 벡터\ndcl t3.xyzw // 투사기의 텍스처 좌표\n}}}\n\n(p.114) 다음은 입력 텍스처 샘플러의 선언이다.\n{{{\ndcl_2d s0 // 분산 텍스처(알파에는 광택)\ndcl_2d s1 // 법선 텍스처\ndcl_2d s3 // 점적광 텍스처\n}}}\n\n설정 후, 첫 단계는 법선 벡터를 읽어들이는 것이다. 여기서도 texld 명령어를 사용하지만, 버전 1.4 픽셀 셰이더와는 다르다.\n...\n\n여기서 큰 차이점을 볼 수 있는데, 픽셀 셰이더 2.0 셰이더들의 위력 덕분으로 이제는 각각의 입력 벡터의 정규화가 가능해졌다.\n\n(p.116) 주의할 점은 픽셀 셰이더 2.0에서는 출력 레지스터가 전 버전에서의 r0 대신에 oCn 이며, 픽셀 셰이더가 출력을 4개까지 가질 수 있다는 것이다.\n\n<html> <span style="font-size: 12px; "> <b> HLSL 버전 </b> </span> </html>\n\n<html> <span style="font-size: 12px; "> <b> 품질 비교 </b> </span> </html>\n(p.119) 픽셀 셰이더는 정규화가 실현되고 정밀도도 더 높아져 이전 버전에서 보다 훨씬 좋은 결과를 얻을 수 있게 되었다. 다음의 이미지에서도 비교 가능하지만, 움직이는 동작에서 더 확연히 차이를 볼 수 있다. 움직이는 동작에서의 조명 세기는 픽셀 셰이더 2.0 버전에서 훨씬 안정적이다.\n\n\n<html> <span style="font-size: 14px; "> <b> 정점과 픽셀 셰이더 3.0 </b> </span> </html>\n(p.120) Direct3D 9로 셰이더를 개발한다는 것은 다소 모험적인데, 다른 버전의 셰이더도 가능하기 때문이다(버전 3.0). 3.0은 2.0과 문법 면에서는 근소한 차이를 보여주지만 (셰이더와 레지스터 설정 단계 등에서)세이더 기능 면에서 매우 다르다.\n\n정점 셰이더 3.0의 실행 코드는 오히려 전 보전보다는 더 커질 수 있다. 셰이더에는 적어도 512개의 명령어가 있지만, 조건 분기를 사용하면 디바이스는 훨씬 많은 명령어를 실행할 수 있을것이다(65,536 이상). 동적인 조건 분기도 이 셰이더에서는 가능하다(루프는 임시 혹은 특별 속성 레지스터 값에 의존해서 존재할 수 있다). 다른 기능으로는 정점 셰이더에서의 텍스처 룩업이나 상수에서 입력이나 출력으로의 상대 인덱싱 확장이 있다.\n\n(p.121) 픽셀 셰이더 3.0도 정점 셰이더와 비슷하다. 동적 그리고 정적 조건 분기가 가능하고, 명령어 개수 제한도 같다. 텍스처 명령어 개수 제한은 없고 의존적 텍스처 읽기에 대한 제한도 없다. 새로운 입력 레지스터(스크린에서의 픽셀 위치와 면 방위 레지스터(face orientation register))가 도입된다. 또한 입력 레지스터의 변화율을 조사할 수 있는 증감 레지스터가 새로 도입된다.\n\n<html> <span style="font-size: 12x; "> <b> 정점 셰이더 3.0 </b> </span> </html>\n(p.123) 이 셰이더 버전에서는, 오직 하나의 출력 레지스터 집합만 있다. 앞에서는 oD#를 색상, oFog, oPos를 절단 공간 위치, oPts를 점 크기, 그리고 oT#를 텍스처 좌표로 사용했다. 여기서는 @@color(#FF0000): 오직 o# 레지스터만 가능@@하지만, 그것을 어떻게든 사용할 수 있다. 그러므로 모든 사용할 출력 레지스터의 의미를 입력 레지스터를 처리했던 방식으로 셰이더 시작 부분에서 선언할 필요가 있다. __반드시 하나의 dcl_position0은 절단 공간 정점 위치를 특정하기 위해서 항상 선언해야 한다.__ \n\n<html> <span style="font-size: 12x; "> <b> 픽셀 셰이더 3.0 </b> </span> </html>\n(p.128) 우선 주의할 점은 입력 레지스터 선언에서의 변화이다. 우리는 의미구조를 특정지어야 한다. 올바른 결과를 얻기 위해서, 픽셀 셰이더가 사용하는 입력 값의 의미는 정점 셰이더의 출력 값의 의미와 일치해야 한다.\n\n\n<html> <span style="font-size: 14px; "> <b> #. 프레넬 항을 이용한 픽셀 당 환경 범프 매핑 </b> </span> </html>\n(p.131) 환경 매핑(EM)은 반사면을 시뮬레이션하거나 표면에 금속 질감을 주기 위해 널리 사용한다. 핵심 개념은 텍스처를 반사 데이터 소스로 사용하고, 면의 법선 주의의 카메라 반사 벡터를 계산해서, 이 룩업 값을 텍스처에 사용하는 것이다. 세 가지 유형의 EM이 있다. \n\n ▣ ''포물면 EM''(Paraboloid EM) - 하나의 텍스처를 사용하고(구형 맵이라고도 하는데, 완벽하게 반사되는 구에 비추어진 반사가 저장되기 때문이다). 이 텍스처는 오브젝트 주위의 한 반구로부터 정보를 저장한다. 그래서 오직 이 반구가 카메라를 마주하고 있을 때에만 반사를 처리해서 예상하는 결과를 얻을 수 있다. 셰이더 없이는 구형 맵을 상호작용적으로 갱신하기 어렵다.\n ▣ ''이중 포물면 EM''(Dual paraboloid EM) - 두 개의 구형 맵을 사용하고, 그래서 오브젝트 주변을 완벽한 구로 덮을 수 있다.\n ▣ ''입방체 맵 EM''(Cube map EM) - 6개의 텍스처(혹은 하나의 입방체 맵)를 사용한다. 개개의 텍스처는 오브젝트 주위의 입방체의 한 면을 반영한다. 입방체 맵은 갱신하기 쉽고(입방체의 한 면만 갱신할 수도 있다) 사용하기도 쉽다. 이것은 네이티브 포맷으로, 입방체의 중심으로부터의 (x, y, z)좌표를 나타내는 (x, y, z) 벡터를 사용해서 텍스처를 추출한다.\n\n각각의 EM 유형은 정점별 혹은 픽셀별로 수행할 수 있다. 이것은 반사 벡터를 어디서(정점 혹은 픽셀 셰이더) 계산하느냐에 좌우된다. 이 글에서는 __입방체 맵과 반사 벡터를 픽셀 당 계산을 사용하며, 결과 효과는 프레넬 항을 사용해서 확장한다.__\n\ncf. 프레넬 반사(Fresnel Reflection)란 프랑스의 오귀스텡. 장. 프레넬이 제창 한 것으로\n빛이 서로 다른 굴절률을 갖는 매질의 경계면을 통과할 때의 반사로 빛이 매질과 부딪힐 때 그 각도에 따라 굴절, 투과가 다르게 나타하는 현상이다.\n\n평평한 곳에 빛이 투과 된다고 할때 직각에 가까운 각도로 빛이 쏘아지면 대부분이 투과되는 물체를 빛이 꿰뚫지만 평행에 가까운 속도고 빛이 쏘아지면 수면에서 반사해 버려 빛이 투과되는 물체 내에 대부분 들어오지 않는다. \n그리고 물체의 투명도나 빛의 강도 같은 파라미터에 따라 빛이 얼마나 투과체의 표면을 반사하고, 얼마나 투과체의 내부로 들어갈까를 계산한 식을 만들어 냈다.\n\n<html> <span style="font-size: 14px; "> <b> 수학적 배경 </b> </span> </html>\n(p.133) 이제 이 반사 결과를 프레넬 항을 가지고 확장할 수 있다. 이것은 카메라를 향해 반사되는 빛의 양과 재질 경계에 부딪혔을 때 굴절되는 빛의 양을 기술한다. 표면의 법선과 시선 벡터 사이의 각이 π/2에 가까울수록 빛의 반사율이 최대가 되며, 0에 가까울수록 빛의 반사율은 최소가 된다.\n\n<html> <span style="font-size: 14px; "> <b> 정점 셰이더 </b> </span> </html>\n(p.134) 우선 DirectX 8 기반으로 하드웨어를 위한 버전을 살펴보자. 정점 셰이더부터 볼 것인데 명확한 코드와 더 간단한 설명을 위해서 정점 셰이더 버전 2.0을 사용했다(버전 1.1은 nrm과 crs 매크로 명령어를 더 옛날 셰이더를 위한 개개의 코드로 교체함으로서 얻을 수 있다).\n\n+++[다음은 환경 매칭을 위한 2.0 정점 셰이더이다. ]\n{{{\nvs_2_0 //Shader version 2.0\n\n// 상수 레지스터들\n//---------------------------------- \n// c0-c3 - 전치된 입방체 맵 공간(세계 공간이 될 수도 있다.)\n// c4-c7 - 세계 * 시야 * 투영\n// c8 - 시선 위치(입방체 공간에서)\n// c9 - 입방체 맵을 위한 수정치\n// \n\n// 입력 레지스터들\n//----------------------------------\ndcl_position v0\ndcl_normal v1 \ndcl_texcoord v2\ndcl_tangent v3\n\n// 출력\n//----------------------------------\n// oT0 - 텍스처 좌표\n// oT1 - 입방체 공간에서 시선 벡터\n// oT2 - 접선에서 입방체 공간으로 변환 행렬의 1열\n// oT3 - 접선에서 입방체 공간으로 변환 행렬의 2열\n// oT4 - 접선에서 입방체 공간으로 변환 행렬의 31열\n// oT5 - 정점 수정자\n//----------------------------------\n\n// 절단 공간 위치, 텍스처 좌표를 출력한다.\n// 입방체 공간에서의 시선 벡터를 계산한다.\n//----------------------------------\nm4x4 oPos, v0, c4 // 정점 절단 위치\nmov oT0.xy, v2.xy // 색 텍스처를 위한 텍스처 좌표\n\nm4x4 r8, v0, c0 // 정점을 입방체 맵 공간으로 변환한다.\nadd r0, c8, -r8 // 시선 벡터\nnrm r1.xyz, r0 // 정규화한다.\nmov oT1.xyz, r1 // 출력한다.\n\n// 접선 공간 기저를 계산하고 행렬을 접선에서 입방체 공간으로 변환\nmov r9, v3 // 접선 복사\ncrs r10.xyz, r9, v1 // 종법선을 계산하기 위해서 외적한다.\nmov r11, v1 // 그리고 법선 복사 - 행렬은 r9, r10, r11에 있다.\n\nm3x3 oT2.xyz, c0, r9 // 변환 행렬 생성(전치된)\nm3x3 oT3.xyz, c1, r9\nm3x3 oT4.xyz, c2, r9\n\nmul oT5, r8, c9.xxx // 반사 벡터 수정치\n}}}\n===\n\n(p.135) 첫 번째 주목할 것은 시선 벡터가 입방체 공간에서 계산된다는 것이다(시선 위치는 공간에서 정점 셰이더로 옮겨지고, 정점 역시 입방체 공간으로 변환된다). 그 벡터는 어떤 추가의 변환 없이 픽셀 셰이더에 넘겨진다.\n\n<html> <span style="font-size: 14px; "> <b> 픽셀 셰이더 1.4 </b> </span> </html>\n(p.137) 일반적인 법선과 시선 벡터를 읽은 후에 (또한 전치된 변환 행렬도), 법선을 입방체 공간으로 변환한다(3개의 연속적인 내적은 m3x3 벡터-행렬 곱의 기능을 갖는다). 주의할 점은 이 명령어들은 _bx2 수정자를 사용해서 법선을 (-1...1) 범위로 만든다는 것이다. 다음으로 시선 반사 벡터를 계산한다.\n첫 번째 단계의 마지막 명령어는 이미 언급했던 반사 벡터 수정이다.\n\n+++[다음은 환경 매칭을 위한 1.4 픽셀 셰이더이다. ]\n{{{\nps_1_4 //Shader version 1.4\n\n// 상수 레지스터들\n//---------------------------------- \n// c0 - R(0)\ndef c3, 1.0f, 1.0f, 1.0f, 1.0f\ndef c4, 0.0f, 0.0f, 0.0f, 1.0f\n\n// 사용하는 입력 레지스터\n//----------------------------------\n// t0 - 색/ 범프 좌표 \n// t1 - 입방체 공간에서의 시선 벡터\n// t2, t3, t4 - 접선에서 입방체 행렬\n// t5 - 반사 벡터 이동\n\n// 사용하는 입력 텍스처 단계\n//----------------------------------\n// stage0 - 주변 텍스처\n// stage1 - 법선 텍스처\n// stage3 - 프레넬 룩업 덱스처\n\n// 출력\n//----------------------------------\n// r0 - 출력 색\n//\n\ntexld r1, t0 // 법선 벡터(n)\ntexcrd r2.rgb, t1.xyz // 시선 벡터(v)\ntexcrd r3.rgb, t2 // 접선에서 입방체 행렬의 첫 번째 열\ntexcrd r4.rgb, t3 // 접선에서 입방체 행렬의 두 번째 열\ntexcrd r5.rgb, t4 // 접선에서 입방체 행렬의 세 번째 열\ntexcrd r0.rgb, t5 // 벡터 이동\n\n// 법선을 변환 행렬과 곱한다.\ndp3 r3.r, r3, r1_bx2 // 법선을 입방체 공간으로 변환\ndp3 r3.g, r4, r1_bx2\ndp3 r3.b, r5, r1_bx2\n\n// 카메라 반사 벡터 계산\ndp3 r1.rgb, r3, r2 // r1 = dot(normal, eye)\nmad r4.rgb, r1_x2, r3, -r2 // 반사율 벡터 r2 = 2(n.e)n-e\nadd r4.rgb, r4, r0 // 이동\n\nphase\ntexld r0, t0 // 분산 텍스처(n)\ntexld r2, r4 // 입방체 맵 룩업\ntexld r3, r1 // 프레넬 룩업\n\nmul r0.rgb, r0, r1.r // 분산 조명을 시뮬레이션하기 위해서\nlrp_sat r4, c0.r, c0.g, r3 // 프레넬 값을 준비한다(R(0) 포함)\n// mul_sat r4, r4, r0.a // 광택율과 곱하기 연산한다.\nlrp r0.rgb, r4.a, r2, r0 // 최종 색을 계산한다.\n}}}\n===\n\n(p.138) 두 번째 단계에서, 입방체 텍스처로부터 앞에서 계산한 반사 벡터로 상술한 좌표를 가지고 환경 반사를 읽는다. 그리고 법선과 시선 벡터의 내적(첫 번째 단계에서 계산한)을 사용해서 프레넬 반사 근사의 한 부분((1-cos(θ))^5 )을 가지고 있는 텍스처에서 룩업한다. 이것을 셰이더에서 직접 계산할 수도 있지만, 제한된 정밀도로 인해서 더 많은 오류가 발생할 수도 있기 때문에, 1차원 텍스처를 사용해서 룩업하는 것이 훨씬 빠르다. 계산한 내적을 이용해서 한 번 더 분산 조명을 시뮬레이션하면, 이것으로 장면이 밋밋하지 않게 보인다(이것은 별개의 패스에서 조명이 이루어지는 게임의 상황은 아니다).\n\n<html> <span style="font-size: 14px; "> <b> 픽셀 셰이더 2.0 </b> </span> </html>\n(p.139) 픽셀 셰이더 2.0에서는 셰이더 내에서 모든 것을 계산할 수 있으므로 프레넬 텍스처 룩업은 건너뛴다. 이것은 변경된 주 요소로, 시간 시 입력 벡터가 정규화되고 프레넬 항의 쉬릭스 근사가 셰이더에서 직접적으로 계산된다. 셰이더의 나머지 부분은 앞과 거의 유사하다.\n\n+++[다음은 환경 매핑을 위한 픽셀 셰이더 2.0이다. ]\n{{{\nps_2_0 //Shader version 2.0\n\n// 상수 레지스터\n//---------------------------------- \n// c0 - 굴절 인덱스\ndef c1, 2.0f, 1.0f, 5.0f, 0.0f\n\n// 사용된 입력 레지스터\n//----------------------------------\ndcl t0.xy // 법선 벡터(n)\ndcl t1.xyz // 시선 벡터(v)\ndcl t2.xyz // 접선에서 입방체 행렬의 첫 번째 열\ndcl t3.xyz // 접선에서 입방체 행렬의 두 번째 열\ndcl t4.xyz // 접선에서 입방체 행렬의 세 번째 열\ndcl t5.xyz // 반사 벡터 이동\n\n// 사용하는 입력 텍스처 샘플러\n//----------------------------------\ndcl_2d s0 // 분산 텍스처(알파는 광택)\ndcl_2d s1 // 법선 텍스처\ndcl_cube s2 // 입방체 텍스처\n\n// 출력\n//----------------------------------\n// oC0 - 출력 색\n//\n\n// 필요한 벡터를 설정한다. - 읽어서 정규화한다.\n//----------------------------------\ntexld r0, t0, s1 // 법선을 로드한다.\nmad r1, r0, c1.r, -c1.g // 법선을 범위 -1, 1로 보정한다.\nm3x3 r0.xyz, r1, t2 // 입방체 공간으로 변환한다.\nnrm r11, r0 // r11 = 정규화된 법선\nmov r1.xyz, t1\nnrm r10, r1 // r10 = 정규화된 시선 벡터\n\n// 카메라 반사 벡터 계산\n//----------------------------------\ndp3 r9.r, r11, r10 // r1 = dot(normal, eye)\nmul r8.r, r9.r, c1.r // r1 = 2*(n.v)\nmad r8.rgb, r8.r, r11, -r10 // 반사율 벡터 - r1 = 2(n.v)n-v\nadd r8.rgb, r8, t5 // 이동\n\n// 프레넬 항 계산 (쉬릭스 근사) F=IR+(1-IR)*(1-(n.v))^5\n//----------------------------------\nsub r1.r, c1.g, r9.r // r1 = 1 - n.v\npow r0.r, r1.r, c1.b // r0 = (1-(n.v))^5\nlrp r7.rgb, c0.r, c0.g, r0.r // 최종 F = IR*1 + (1-ir)*r0\n\n// 텍스처 룩업과 최종 곱하기 연산\n//----------------------------------\ntexld r0, t0, s0 // 분산 텍스처\ntexld r1, r8, s2 // 입방체 맵 룩업\nmul r0.rgb, r0, r9.r // 분산 조명을 시뮬레이션하기 위해서(n.v)\n// mul r7.rgb, r7, r0.a // 프레넬 항과 광택을 곱하기 연산한다.\nlrp r1.rgb, r7.r, r1, r0 // 최종 색을 계산한다.\nmov oC0, r1\n}}}\n===\n\n\n<html> <span style="font-size: 14px; "> <b> HLSL 버전 </b> </span> </html>\n\n\n<html> <span style="font-size: 14px; "> <b> #. 진보적인 모델을 위한 배경 지식 </b> </span> </html>\n<html> <span style="font-size: 14px; "> <b> 구 좌표계 </b> </span> </html>\n<html> <span style="font-size: 14px; "> <b> 표면의 거칠기 </b> </span> </html>\n<html> <span style="font-size: 14px; "> <b> 마스킹과 섀도잉 </b> </span> </html>\n\n<html> <span style="font-size: 14px; "> <b> #. 오렌-나야르 모델 </b> </span> </html>\n(p.147) 마이클 오렌과 쉬리 K. 나야르는 1992년에 일반적인 람베르티안 모델(분산 조명을 계산하는 데 흔히 사용하는)을 확장하는 조명 모델을 발표했다(O-N 모델, 혹은 그냥 O-N으로 부르기도 한다).\n\n람베르티안 모델은 오직 빛의 위치와 표면 법선에만 의존한다. 이것은 몇몇 부드러운 표면에서는 맞지만, 진흙이나 콘크리트 같은 거친 표면에서는 맞지 않다.\n왜냐하면, 이들 경우에는 관찰자의 위치를 무시할 수 없기 때문이다.\n\n(p.148) O-N 모델은 표면이 개별적으로 완벽하게 난반사하는 매우 작은 극소-파셋으로 구성되었다고 가정한다. 이 모델은 파셋에 마스킹과 섀도잉을 채택하고 또한 내부 반사 요소(인접한 파셋들 끼리 반사되는 빛)를 추가한다.\n\n표면의 전체적인 밝기는 그것의 모든 파셋(일부는 다른 것에 의해 마스킹된다.) 밝기 강도들의 적분이다. 실시간으로 이 적분을 계산하기 위해서는 새로운 세대의 하드웨어를 기다려야만 한다.\n\n\n<html> <span style="font-size: 14px; "> <b> #. 쿡-토르란스 모델 </b> </span> </html>\n(p.157) 이 모델은 1981년에 발표되었고 1967년의 토르란스-스패로우 모델에 기반하고 있다. 쿡-토르란스(C-T) 모델은 종종 금속이나 플라스틱의 반영 하이라이트를 계산하는데 사용한다. 이것은 물리적으로 근거가 있는 방법으로 퐁 모델을 능가하는데, 이것은 실제 재질로부터 측정한 데이터를 사용해서 개발되었고 물리적으로 측정 가능한 요소인 에너지나 파장 같은 것을 사용하기 때문이다.\n\n쿡-토르란스 모델은 다음을 사용한다.\n\n▣ 표면 거칠기를 위한 극소-파셋 모델\n▣ 반사량과 하이라이트 색 변화를 계산하기 위한 프레넬 방정식\n▣ 스스로 섀도잉과 마스킹을 하는 극소-파셋을 위한 기하학적인 감쇠 요소\n\n이 모델에 대한 몇 가지 흥미로운 결론들이다.\n\n▣ 반영 하이라이트는 일반적으로 빛이 아닌 금속의 색을 가진다.\n▣ 프레넬 방정식은 번쩍이는 각도에서 반영 요소의 색 변환을 예측한다.\n▣ 몇몇 유형의 재질(페인트칠된 물체나 플라스틱들)은 같은 색을 가지지 않는 반영과 분산을 가진다.\n\n\n<html> <span style="font-size: 14px; "> <b> #. 결론 </b> </span> </html>\n(p.171) 앞에서 다룬 예제들은 Direct3D 9 셰이더가 현실적인 게임을 향한 보다 큰 진전임을 보여준다... 주요 장점은 __픽셀 셰이더에서의 부동소수점 정확도이다.__\n\n정점 셰이더 2.0은 게임을 위해 생겨났다 할 만큼 게임에 적합하다. 정점 셰이더 2.0에는 막대한 명령어 개수와 조건 분기가 포함되어 있어, 정점 당 조명이나 메쉬 스키닝 같은 기능을 가진 전체 장면을 표현하고자 한다면 단지 해당 함수에 적합한 명령어 한둘을 골라 사용하면 된다. 더 이상 정점 당 조명 때문에, 셰이더를 바꾸어서 다중패스 렌더일을 할 필요가 없게 된 것이다.\n\n픽셀 셰이더 2.0 구조는 진보된 픽셀 당 조명 모델을 수행할 수 있게 해준다. 64개의 산술 연산과 32비트 텍스처 명령어는 대부분의 게임에서 최소한으로 필요한 패스 개수를 유지하기에 충분하다.\n\n셰이더 3.0은 기능 면에서 훌륭하지만, 상수 레지스터의 상대 어드레싱이 결여되어 있기 때문에 픽셀 셰이더 측면에서는 약간 부족하다는 생각이 든다. 이러한 것만 보완된다면, (그림자 없는 세계 공간) 단일 패스에서 루프를 이용하여 픽셀 당 조명들의 임의의 개수를 계산할 수 있게 될 것이다(이것은 지금 디자인 시점에서 루프 언롤링으로 해결할 수 있다. 그러나 그것은 쉬운 일이 아니다).\n\n게임에서 셰이더 2.x 모델을 지원할지는 의문이다. 그것은 (그래픽) 카드에 의해 좌우되므로, 게임에서 이 셰이더들의 모든 잠재력을 사용할 수 있으려면 오로지 각 장치들의 기능별로 준비된 코드의 조각들을 병합하는 일종의 런타임 링커가 있어야만 가능하다.\n\n\n<html> <span style="font-size: 14px; "> <b> #. 참고 자료 </b> </span> </html>\n\n▷ [[도서_ShaderX² : DirectX 9 셰이더 프로그래밍]]
<html> <a name="DirectX_HLSL"> </a> </html>\n◇ Craig Peeper & Jason L. Mitchell\n<html>\n<a href="#DirectX_HLSL_fxc"> <span style="font-size: 12px;"> <b> 커맨드라인 컴파일러 - fxc </span> </a> <br>\n<a href="#DirectX_HLSL_ps_1_x_Compile"> <span style="font-size: 12px;"> <b> ps_1_x 컴파일 타겟의 사용 </span> </a> </html>\n\n\n<html> <span style="font-size: 14px; "> <b> #. 소개 </b> </span> </html> \n\n(p.026) HLSL(High Level Shading Language)은 DirectX 9에서 새로이 추가된 것들 중 가장 강력하다 할 수 있다... HLSL은 개발자가 하드웨어 세부사항까지도 알아야 하는 부담에서 해방시킴과 더불어, 쉬운 코드 재사용, 가독성 증가, 최적화된 컴파일러 등 여러 고급 언어의 장점들을 가지고 있다.\n\n\n<html> <span style="font-size: 14px; "> <b> #. 어셈블리 언어와 컴파일 타겟 </b> </span> </html> \n\n(p.029) DirectX 8.0과 DirectX 8.1에서 (vs_1_1과 ps_1_1 ~ ps_1_4로 이름 붙여진) 셰이더 모델로 작성된 프로그램은 어셈블리 언어로 작성되었으며 비교적 간결했다... 응용프로그램은 D3DXAssembleShader()를 통해 DX3D 라이브러리에 사람이 이해할 수 있는 어셈블리 언어 코드를 전달...\n\nDirectX9의 응용프로그램도 HLSL 셰이더를 D3DXCompileShader() API를 통해 D3DX에 전달...\n이렇게 생성된 이진 어셈블리 코드는 국한 사용자나 개발자 시스템의 그래픽 하드웨어에 독립적이다... 실제로 Direct3D 실행 모듈은 오로지 이진 어셈블러 셰이더 모델만을 실행하고 HLSL에 대해서는 관여하지 않는다. 이것은 HLSL 컴파일러를 D3D에 독립적으로 업데이트할 수 있다는 이점이 있는데, ...\n(p.030) 응용프로그램 개발자들은 이 새로운 모델(vs_2_0, vs_3_0, ps_2_0과 ps_3_0)들을 직접 어셈블리 언어를 사용하여 작업할 수도 있지만, 셰이더의 복잡도와 편의성을 감안할 때 많은 개발자들이 어셈블리보다는 HLSL을 통해 셰이더를 개발할 것으로 본다.\n\n<html> <span style="font-size: 12px; "> <b> 컴파일 실패 </b> </span> </html> \n(p.030) 앞서 언급했다시피, 주어진 HLSL 셰이더에서 특정한 컴파일 타켓에 컴파일이 실패했다는 것은 셰이더가 너무 복잡하여 특정 컴파일 타겟에서는 컴파일할 수 없다는 것을 의미한다.\n\n(p.031) 이것은 셰이더가 너무 많은 리소스를 요구하거나 선택된 컴파일 타켓이 지원하지 않는 동적 분기와 같은 특정 기능을 사용했다는 뜻이다. 예를 들어, 어떤 HLSL 셰이더가 셰이더에서 주어진 텍스처 맵을 6번 접근할 수 있게 작성되었다고 하자. 만일 이 셰이더가 ps_1_1 컴파일 타켓에서 컴파일한다면 ps_1_1 모델은 4개의 텍스처만 지원하므로 컴파일되지 않을 것이다. 또다른 컴파일 에러의 이유 중 대부분은 선택된 컴파일 타켓의 명령어 개수가 초과될 때 나타난다. HLSL에 표현된 알고리즘이 주어진 컴파일 타겟에서 실행될 때 너무 많은 명령어를 요구하는 것이다.\n\n여기서 강조하고 싶은 점은 컴파일 타켓을 결정하는 문제는 HLSL 문법의 사용 범위와는 무관하다는 것이다.\n... 물론, 결과 셰이더가 너무 길거나 컴파일 타겟의 리소스 제한을 초과할 경우 컴파일은 실패하게 된다.\n<html> <a name="DirectX_HLSL_fxc"> </a> </html>\n<html> <a href="#DirectX_HLSL"> <span style="font-size: 12px;"> <b> 커맨드라인 컴파일러 - fxc </span> </a> </html>\n(p.031) 많은 개발자들은 HLSL 셰이더를 D3DX로 유저들의 컴퓨터에서 프로그램이 로딩할 때 나 처음 실행될 때 컴파일하는 것보다 제품을 배포하기 전에 미리 이진 어셈블리 형태로 컴파일하는 것을 선호한다. 이렇게 하면 소스 코드를 이것저것 뜯어보기를 좋아\n하는 유저들로부터 숨길 수 있고, 실행되는 모든 셰이더들을 자체적으로 품질 검증 과정을 거치게 할 수 있기 때문이다.\n\nfxc 커맨드라인 컴파일러는 오프라인으로 셰이더를 컴파일할 수 있게 하는 편리한 유틸리티로 DirectX 9 SDK에서 찾아볼 수 있다. 이 유틸리티는 커맨드라인에서 사용할 수 있을 뿐만 아니라, 특정한 컴파일 타겟을 위한 디스어셈블된 코드를 생성할 수 있는 편리한 옵션들을 제공한다. 만일 셰이더를 최적화시키기를 원하거나 가상 셰이더 머신의 능력을 보다 자세히 알고 싶다면 디스어셈블된 결과물을 살펴보기 바란다.\n\n커맨드라인에서 사용 가능한 옵션들은 다음과 같다.\n|!커맨드라인 옵션 |!설명 |\n|-T target |컴파일 타겟(기본 값: vs_2_0) |\n|-E name |엔트리 포인트 name(기본 값: main) |\n|-Od |최적화하지 않음 |\n|-Vd |검증하지 않음 |\n|-Zi |디버깅 정보를 삽입 |\n|-Zpr |열 기준으로 행렬 정리 |\n|-Zpc |행 기준으로 행렬 정리 |\n|-Fo file |목적 파일 출력 |\n|-Fc file |생성된 코드의 출력 |\n|-Fh file |생성된 코드를 포함한 헤더의 출력 |\n|-D id = text |매크로 정의 |\n|-nologo |저작권 메시지를 출력하지 않음 |\n<profile>: vs_1_1 vs_2_0 vs_2_a vs_2_sw vs_3_0 vs_3_sw vs_4_0 vs_4_1\n ps_2_0 ps_2_a ps_2_b ps_2_sw ps_3_0 ps_3_sw ps_4_0 ps_4_1\n gs_4_0 gs_4_1 fx_2_0 fx_4_0 fx_4_1\n\n<html> <span style="font-size: 14px; "> <b> #. 언어의 기초 </b> </span> </html> \n...\n<html> <span style="font-size: 12px; "> <b> 벡터 데이터형 (Working with Vectors )</b> </span> </html> \n(p.034) HLSL 셰이더에서는 벡터 값을 많이 사용한다. 벡터 데이터형을 정의하는 방법은 다음과 같이 여러 가지가 있다.\n...\n\n4개의 float형 데이터를 정의하기 위해서 여러분은 다음 중 아무 것이나 사용하면 된다.\n{{wrappingClass{ float4 fVector0; \nfloat fVector1[4]; \nvector fVector2; \nvector <float, 4> fVector3; }}}\n\n개의 bool형의 데이터를 선언하고 싶다면 다음 중 아무 것이나 사용하면 된다.\n{{wrappingClass{ bool3 bVector0;\nbool bVector1[3];\nvector <bool, 3> bVector2; }}}\n\n벡터 값을 한번 정의한 후에는 인덱스 접근을 이용하거나 스위즐(swizzle)을 사용해서 직접 벡터의 성분을 명시하는 방식으로 그 성분들을 읽거나 쓸 수 있다.\n\n(p.035) Ps_2_0이나 더 낮은 픽셀 셰이더 모델에서는 임의의 스위즐을 기본으로 지원하지 않는다. 따라서 임의의 스위즐을 사용하는 간결한 고수준 코드를 스위즐이 지원되지 않는 타겟용으로 컴파일한다면 컴파일러는 상당히 지저분한 이진 어셈블리 코드를 생성할 것이다.\n\n<html> <span style="font-size: 12px; "> <b> Constructors </b> </span> </html> \n\n<html> <span style="font-size: 12px; "> <b> 형 변환 (type casting) </b> </span> </html> \n(p.039) 셰이더 코드를 쉽게 효율적으로 작성하려면 HLSL의 형 변환에 익숙해져야 한다. 유형을 정의할 때는 이미 주어진 값들과 대응하는 변수들을 취하거나 버려야 한다. 예들 들면, vResult를 초기화하고 싶을 때에는 float 0.0f로 선언해도 되고 float4(0.0f, 0.0f, 0.0f, 0.0f)로 선언해도 된다.\n\n<html> <span style="font-size: 12px; "> <b> Structures </b> </span> </html> \n\n<html> <span style="font-size: 12px; "> <b> 샘플러 (sampler) </b> </span> </html> \n(p.041) 픽셀 셰이더에서 사용하는 각각의 텍스처 맵에서 정보를 가져오기 위해서는 맵마다 sampler를 만드시 선언해주어야 한다. 앞서의 hlsl_rings() 셰이더를 상기해보자.\n{{{\nfloat4 lightWood; // 나무결 색상의 밝은 부분\nfloat4 darkWood; // 나무결 색상의 어두운 부분\nfloat ringFreq; // 나무결의 촘촘한 정도\nsampler PulseTrainSampler;\n\nfloat4 hlsl_rings (float4 Pshade : TEXCOORD0) : COLOR\n{\n float scaledDistFromZAix = sqrt(dot(Pshade.xy, Pshade.xy)) * ringFreq;\n float blendFactor = tex1D ( PulseTrainSampler, scaledDistFromZAix );\n return lerp ( darkWood, lightWood, blendFactor );\n}\n}}}\n(p.042) 이 셰이더에서는 PulseTrainSampler라는 전역 형태의 샘플러를 선언하고 이를 tex1D()라는 내장 함수의 첫 번째 매개변수로 사용했다.\n\n\n<html> <span style="font-size: 14px; "> <b> #. 내장 함수 (Intrinsics) </b> </span> </html> \n\n(p.043) 앞서 언급했던 것처럼 DirectX HLSL은 많은 내장 함수들을 가지고 있다. 수많은 내장 함수 중 수학 함수들은 코드 수를 줄이기 위해 (코딩을 편하게 하기 위해) 제공되는 반면, 위에서 언급한 tex1D()와 tex2D() 같은 종류의 것들은 데이터 샘플러를 통해 텍스처 데이터를 접근하기 위해서 제공된다.\n\n<html> <span style="font-size: 12px; "> <b> Math Intrinsics </b> </span> </html> \n<html> <span style="font-size: 12px; "> <b> Texture Sampling Intrinsics </b> </span> </html> \n\n\n<html> <span style="font-size: 14px; "> <b> #. 셰이더 입력 </b> </span> </html> \n\n(p.048) 정점 셰이더와 픽셀 셰이더는 varying과 uniform의 두 가지 입력 데이터형을 가진다.\nvarying 입력은 각 셰이더가 실행될 때마다 달리 적용되는 데이터이다. 정점 셰이더의 경우 varying 데이터(위치, 법선 등)는 정점 스트림에서 들어온다.\nuniform 데이터(개체의 색, 세계 변환 등)는 셰이더가 실행될 때마다 동일하게 적용되는 상수이다. \n어셈블리 모델로 보면 정점과 픽셀 셰이더에서 uniform 데이터는 상수 레지스터에 들어있는 값으로 볼 수 있고, varying 데이터는 v레지스터나 t레지스터에 들어있는 값으로 볼 수 있다.\n\n<html> <span style="font-size: 14px; "> <b> uniform 입력 </b> </span> </html> \n\n<html> <span style="font-size: 14px; "> <b> varying 입력 </b> </span> </html> \n(p.050) varying 데이터는 최상위 함수의 입력 매개변수에 의해 설정된다.\n\n(p.051) 입력 의미구조는 주어진 셰이더의 입력과 그래픽 파이프라인의 전 단계의 출력을 연결하기 위해 사용된 이름이다. 예를 들어, ''POSITION0''은 정점 셰이더에서 입력 데이터를 연결된 정점 버퍼에서 가져오기 위해서 사용된다.\n\n픽셀과 정점 셰이더는 각각의 셰이더 유닛으로 공급되는 그래픽 파이프라인이 다르기 때문에 다른 종류의 입력 의미구조들을 가진다. 정점 셰이더의 입력 의미구조는 정점 버퍼에서 읽어들인 각 정점의 정보를 정점 셰이더에서 쓸 수 있게 정점의 구조를 알려주는 역할을 한다(위치나 법선 벡터, 텍스처 좌표, 색상 값, 탄젠트 값, 종법선 등이 그렇다). 이런 입력 의미구조들은 정점 버퍼에 있는 정점의 구조를 기술하기 위해 사용된 D3DDECLUSAGE 열거형과 UsageIndex의 조합과 1대 1로 연결된다.\n\n픽셀 셰이더 입력 의미구조는 래스터화(rasterization) 유닛에 의해 각 픽셀에 제공된 정보에 기술한다. 이 데이터는 현재의 정점과 각각의 정점 셰이더의 출력의 보간으로 생성된다. 이러한 @@color(#0000FF): 기본 픽셀 셰이더 입력 의미구조는 입력 색과 텍스처 좌표계 정보를 입력 매개변수로 저장한다.@@\n\n입력 의미구조는 두 가지 방법으로 셰이더 입력과 연결될 수 있다.\n첫 번째 방법은 콜론(:)을 추가한 된 입력 의미구조의 이름으로 입력 매개변수 선언을 하는 방법이다.\n두 번째 방법은 입력 의미구조를 각각의 입력 구조체의 요소로 입력 구조체를 정의하는 것이다.\n\n\n<html> <span style="font-size: 14px; "> <b> #. 셰이더 출력 </b> </span> </html> \n\n(p.053) 정점 셰이더 출력물은 픽셀 셰이더와 래스터라이저를 연결하기 위해 사용된다. ''POSITION''은 정점 셰이더의 래지터라이저로 들어가서 보간된 결과 값을 만들어내지만 픽셀 셰이더에서는 등장하지 않는다. ''TEXCOORDn''과 ''COLORn''은 픽셀 셰이더에서 보간에 의해 생성된다.\n\n픽셀 셰이더의 출력은 해당 렌더링 대상의 출력 색상을 정의한다. 픽셀 셰이더에서 출력한 컬러 값은 출력될 렌더 타겟이 수정되는 방법을 결정하는 알파 블랜드 스테이지와 연결된다. DEPTH 출력 의미구조는 현재 래스터 위치의 깊이 값을 바꾸는 데 사용한다.\n\n출력 의미구조를 위한 문법은 입력 의미구조의 것과 다르지 않다. 의미구조들은 출력 매개변수로 직접 선언되거나 함수의 출력 매개변수 또는 반환 값으로 사용될 구조체에서 정의할 수 있다.\n{{{\n// 픽셀 셰이더에서 출력하는 세 가지 다른 방법들\nPS_OUT PSFunc1() { ... }\n\nvoid PSFunc2( \n out float4 Color : COLOR, out float Depth : DEPTH)\n{ \n...\n}\n\nvoid PSFunc3( out PS_OUT Out )\n{\n...\n}\n}}}\n\n<html> <span style="font-size: 14px; "> <b> #. 셰이더의 적용 예 </b> </span> </html> \n(p.055) 이제 NPR Metallic이라는 셰이더 예제를 살펴보자. 이 예제는 셀 애니메이션에서 보여지는 렌더링과 매우 유사하게 보인다.\n\n먼저, HLSL로 작성된 NPR Metallic 정점 셰이더에 대해서 살펴보자.\n{{{\nfloat4x4 view_proj_matrix;\n\nfloat4 view_position;\nfloat4 light0;\nfloat4 light1;\nfloat4 light2;\n\nstruct VS_OUTPUT\n{\n float4 Pos : POSITION;\n float3 View : TEXCOORD0;\n float3 Normal : TEXCOORD1;\n float3 Light1 : TEXCOORD2;\n float3 Light2 : TEXCOORD3;\n float3 Light3 : TEXCOORD4;\n};\n\nVS_OUTPUT main( float4 inPos : POSITION,\n float3 inNorm : NORMAL)\n{\n VS_OUTPUT Out = (VS_OUTPUT) 0;\n // 변환된정점위치를 출력한다.\n Out.Pos = mul( view_proj_matrix, inPos) ;\n \n Out.Normal = inNorm;\n \n // 시야벡터를계산한다.\n Out.View = normalize( view_position - inPos ) ;\n // 현재의정점위치로부터 각광원을향하는 세개의 벡터를구한다.\n Out.Light1 = normalize( light0 - inPos) ; // 광원 1\n Out.Light2 = normalize( light1 - inPos) ; // 광원 2\n Out.Light3 = normalize( light2 - inPos) ; // 광원 3\n \n return Out ;\n}\n}}}\n\n(p.057) {{wrappingClass{fxc /nologo /T vs_1_1 /Vd /Fc NPRMetallic_vs_1_1.txt NPRMetallic.vhl }}}\n\n이 정점 셰이더는 분기 제어 같은 것이 필요가 없기 때문에 vs_1_1을 컴파일 타겟으로 설정하였다. 또한, 코드 파일 생성과 검증을 생략하도록 플래그를 설정하였다. 다음의 코드는 이러한 결과로 생성된 코드이다.\n{{{\n//\n// Generated by Microsoft (R) HLSL Shader Compiler 9.19.949.1104\n//\n// fxc /nologo /T vs_1_1 /Fc NPRMetallic_vs_1_1.txt NPRMetallic.vhl\n//\n//\n// Parameters:\n//\n// float4 light0;\n// float4 light1;\n// float4 light2;\n// float4 view_position;\n// float4x4 view_proj_matrix;\n//\n//\n// Registers:\n//\n// Name Reg Size\n// ---------------- ----- ----\n// view_proj_matrix c0 4\n// view_position c4 1\n// light0 c5 1\n// light1 c6 1\n// light2 c7 1\n//\n\n vs_1_1\n dcl_position v0\n dcl_normal v1\n mul r0, v0.y, c1\n mad r0, c0, v0.x, r0\n mad r0, c2, v0.z, r0\n mad oPos, c3, v0.w, r0\n add r0, -v0, c4\n dp4 r0.w, r0, r0\n rsq r0.w, r0.w\n mul oT0.xyz, r0, r0.w\n add r0, -v0, c5\n dp4 r0.w, r0, r0\n rsq r0.w, r0.w\n mul oT2.xyz, r0, r0.w\n add r0, -v0, c6\n dp4 r0.w, r0, r0\n rsq r0.w, r0.w\n mul oT3.xyz, r0, r0.w\n add r0, -v0, c7\n dp4 r0.w, r0, r0\n rsq r0.w, r0.w\n mul oT4.xyz, r0, r0.w\n mov oT1.xyz, v1\n\n// approximately 21 instruction slots used\n}}}\n(p.058) 최종 결과가 저장되는 oPos, oT0, oT1, oT2, oT3과 oT4 레지스터에 대해서도 이해를 해야 한다. 이는 각각의 멤버에 부여되는 구조체를 이루는 함수를 만들어낸다. 꼭 필요하진 않지만, 개발 시 좀 더 최적화된 어셈블리 코드를 생성하는 HLSL\n을 작성하고자 한다면 fxc의 사용법을 이해하는 것이 좋다.\n\n<html> <span style="font-size: 14px; "> <b> #. 최적화 </b> </span> </html> \n\n(p.062) 셰이더를 빠르게 최적화시키기 위해서 기억해두어야 할 점은, __컴파일러는 컴파일러에게 요구한 대로 구현해주기 위해 존재한다__는 것이다. 다시 말해서 여러분이 요구한 대로 구현해주기 위해 존재한다는 것이다. 다시 말해서 여러분이 어떤 수학적인 연산을 한다거나 출력 성분의 특정 값을 얻기 위해서 셰이더를 짠다면, 단지 지시한 연산만을 수행해야 한다. 컴파일러는 사용하지 않는 코드들을 잘 찾아내서 제거할 수는 있지만, 셰이더가 넘겨주는 값이 어떻게 쓰일지 까지는 스스로 알 수 없다.\n\n(p.063) 또 한 가지 셰이더의 성능 향상을 위해 매우 중요한 것은, __값이 바뀌어야 할 곳만 계산하여 바꾸는지를 확인하는 것이다.__ 만약 픽셀 당 계산을 정점 당 계산으로 대체할 수 있다면 그렇게 하라. 이 최적화 방법은 종종 이런 종류의 연산들에서 최대의 효과를 거두어들인다.\n\n<html> <span style="font-size: 12px; "> <b> 행렬 데이터형의 사용법 </b> </span> </html> \n(p.063) HLSL이 C 표준과 크게 다른 점은 벡터와 행렬의 데이터형에 있다... 벡터 데이터형의 사용은 컴파일러가 벡터에 관련된 명령을 쉽게 처리할 수 있도록 해 준다.\n\n셰이더를 행렬 대신에 벡터의 배열로 적용하고자 한다면, 행렬을 행렬형 데이터로 저장하는 것을 추천한다. 행렬형의 데이터를 사용하면 컴파일러는 행렬이 사용되는 형태에 따라 내장된 행렬을 각각의 행과 열의 순서로 저장한다. 이러한 최적화는 각각의 픽셀 또는 정점 셰이더를 생성하는 데 매우 유용하다. 앞서 언급했던 것처럼 입력 행렬의 경우에, 컴파일러는 기본적으로 행을 기준으로 하여 행렬을 저장한다.\n\n<html> <span style="font-size: 12px; "> <b> 정수 데이터형의 사용법 </b> </span> </html> \n(p.064) 정수 값이라는 것을 명시하려는 목적으로 int 데이터형이 추가되었다. 입력 데이터를 부동 소수점 데이터로 다루지 않는 이상 사용할 모든 입력 데이터는 int로 정의해야 한다. 예를 들어 정점 스트림으로부터 읽어온 행렬 팔레트 인덱스들은 int로 표시되어야 한다.\n\n<html> <span style="font-size: 12px; "> <b> 조건 분기와 성능 </b> </span> </html> \n(p.065) 대부분의 기존 정점 및 픽셀 셰이더 하드웨어들은 조건 분기를 지원하지 않는다. 그 하드웨어들은 셰이더가 순차적으로 실행되고 각각의 명령어를 한 번에 하나씩 실행하도록 설계된 것이다... HLSL이 다양한 조건 분기를 지원할 수 있도록 컴파일될 수 있지만, 제한된 모델에서만 실행할 수 있다는 것을 염두에 두어야 한다. \n\n루프는 셰이더에서 거의 볼 수 없다. 특정 하드웨어의 경우에는 정적이나 동적 루프를 지원하지만, 대부분은 순차적인 실행만을 지원한다. 루프를 지원하지 않는 모델의 경우에는 모든 루프는 전개된다... 고성능의 셰이더를 작성하기 위하여 컴파일러가 루프를 펼쳐주는 작업을 하는 데 사용될 수 있지만, 명령어 수 제한에 걸린다거나 반복 수가 너무 많아 성능이 저하될 수 있다는 것을 염두에 두어야 한다.\n\nIf 구문을 사용하는 것은 대부분의 어셈블리 수준의 셰이더 모델에서 많은 연산을 필요로 한다. 분기를 지원하지 않는 모델의 경우에는 if 구문의 양쪽 모두가 실행되며, 각각의 출력 결과에 따라서 선택되어 실행된다. CPU 프로그래밍 관점에서 보았을 때, 이러한 형태의 실행은 HLSL 작성자가 원하는 실행 형태가 아니다.\n\n<html> <span style="font-size: 12px; "> <b> 입력 데이터형 선언의 중요성 </b> </span> </html> \n(p.067) 셰이더 작성자들은 흔히 정점 데이터가 셰이더의 입력 레지스터로 로드될 때 자동으로 데이터에 없는 값들이 float4형에 맞게 채워진다는 것을 이용하여 최적화를 한다... 위치 입력 매개변수가 float3으로 정의되어 있다면 w 성분에 1.0을 넣어줄 추가적인 명령어가 필요하다. 매개변수가 float4로 정의되어 있다면 하드웨어가 입력 레지스터를 저장하면서 자동으로 1.0으로 설정할 것이다.\n\n또 다른 최적화 과정은 셰이더에서 모든 입력 매개변수의 데이터형을 확실히 선언해주는 것이다. 예를 들어 들어오는 데이터가 정수형이고, 이 데이터가 메모리 주소 연산을 목적으로 사용된다면, 이를 int형으로 설정해야 float형으로 자동 변환되는 일이 없을 것이다.\n\n<html> <span style="font-size: 12px; "> <b> 정밀도 문제(logp, expp, lit) </b> </span> </html> \n(p.068) vs_1_1이나 vs_2_0 같은 다른 셰이더의 경우에는 저정밀도 버전의 명령어가 따로 있다. logp, expp와 lit은 log, exp와 pow 함수의 저정밀도 버전이다. 어떤 하드웨어에서는 저정밀도와 고정밀도 함수의 수행 시간의 차가 크게 나는 것도 있다. log와 exp를 수행하기 위해서는 10개의 명령어가 필요하지만, logp, expp는 단 한 개의 명령어만 있으면 된다... 이러한 @@color(#0000FF): 저정밀도의 명령어를 사용하려면 half라는 저정밀도 데이터형으로 캐스팅하여 저장하면 된다.@@ 이 저정밀도로 결과를 받으려면 컴파일러는 가능한 저정밀도 버전의 명령어를 사용하여 계산해야 할 것이다.\n<html> <a name="DirectX_HLSL_ps_1_x_Compile"> </a> </html>\n<html> <a href="#DirectX_HLSL"> <span style="font-size: 12px;"> <b> ps_1_x 컴파일 타겟의 사용 (Using the ps_1_x Compile Targets) </span> </a> </html>\n(p.068) ps_1_x 컴파일 타겟에 대하여 기억해야 할 첫 번째 점은 하드웨어가 임의의 스위즐들을 지원하지 않는다는 것이다. 이런 제한은 스위즐을 쓰게 되면 항상 추가적인 명령어들이 따라붙게 된다는 것을 의미한다. 이런 명령어들이 추가되다보면 해당 컴파일 타겟이 지원할 수 있는 최대 명령어 수를 쉽게 초과해버리곤 한다...\nPs_1_4 컴파일 타겟은 복제 스위즐과 임의의 쓰기 마스크를 지원한다.\n(p.069) 이것들은 ps_1_x 컴파일 타겟들을 대상으로 HLSL 코드를 작성할 때의 참고 사항일 뿐이다. ps_1_x 타겟이 임의의 스위즐 지원이 안되더라도 source 나 dest 수정자를 0부터 1까지로 값을 자른다거나 source의 보수를 취한다거나 부호를 바꾸고 보정을 하는 등의 작업을 추가적인 부담 없이 수행할 수 있다. 이런 수정자들은 적은 수의 명령어들로 셰이더를 생성해야 할 때 매우 유용하다.\n\nWe now present a series of HLSL code sequences that generate free source modifiers when compiling to ps_1_x targets.\n\n''The _bx2 Modifier''\nThere are a number of different HLSL code sequences that can be used to cause the HLSL compiler to generate _bx2 modifiers. Any of the following main functions will cause the compiler to generate a _bx2 modifier:\n{{{\nfloat4 main( float3 Col : COLOR0, float3 Tex : TEXCOORD0 ) : COLOR0\n{\n return dot(Col, Tex*2 - 1);\n}\n\nfloat4 main( float3 Col : COLOR0, float3 Tex : TEXCOORD0 ) : COLOR0\n{\n float3 val = Tex*2;\n val = val -1;\n return dot(Col,val);\n}\n\nfloat4 main( float3 Col : COLOR0, float3 Tex : TEXCOORD0 ) : COLOR0\n{\n return dot(Col, (Tex -.5f)*2);\n}\n}}}\nAll of these main functions generate the same asm shader:\n\nps_1_1\ntexcoord t0\ndp3 r0, v0, t0_bx2\n\nIt is important to note that the Tex*2 -1 version is recommend because it generates more optimal code in ps_2_0 targets and beyond.\n\n''The _bias Modifier''\nThe following code causes the HLSL compiler to generate a _bias modifier:\n{{{\nfloat4 main( float3 Col : COLOR0, float3 Tex : TEXCOORD0 ) : COLOR0\n{\n return dot(Col, (Tex - .5f));\n}\n}}}\nThis main function generates the following assembly shader:\n\nps_1_1\ntexcoord t0\ndp3 r0, v0, t0_bias\n\nNote that _bias cannot be done in ps_1_1, ps_1_2, or ps_1_3 unless the source is known to be in the range of 0 to 1. That is, it must have been previously saturated.\n\n''The _x2 Modifier (ps_1_4 only)''\nThe following code causes the HLSL compiler to generate an _x2 source modifier:\n{{{\nfloat4 main( float3 Col : COLOR0, float3 Tex : TEXCOORD0 ) : COLOR0\n{\n return dot(Col, Tex*2);\n}\n}}}\nThis HLSL code results in the following asm shader code:\n\nps_1_4\ntexcrd r0.xyz, t0\ndp3 r0, v0, r0_x2\n\n'' The _x2, _x4, _x8, _d2, _d4, and _d8 Destination Write Modifiers''\nA set of destination write modifiers exists in the ps_1_x models, and it is possible to write HLSL code to cause the compiler to generate them in the resulting asm. The modifiers to double (_x2), quadruple (_x4), and halve (_d2) the result of the instruction are supported on ps_1_1 through ps_1_3 models, while the ps_1_4 model supports all six of the modifiers — _x2, _x4, _x8, _d2, _d4, and _d8. The following code will generate the corresponding modifiers for N = 2, 4, 8, 0.5, 0.25, or 0.125:\n{{{\nstatic const float N = 2;\n\nfloat4 main( float4 Col[2] : COLOR0 ) : COLOR0\n{\n return (Col[0] + Col[1] )*N;\n}\n}}}\nThe above HLSL code results in the following asm output:\n\nps_1_1\nadd_x2 r0, v0, v1\n\n''The Complement Modifier''\nIt is also possible to write HLSL code that allows the compiler to generate a complement modifier when compiling to a ps_1_x target. Note that this only works if the quantity being complemented is known to be in the 0 to 1 range (i.e., the quantity has previously been saturated). The following HLSL code causes the compiler to generate a free complement modifier:\n{{{\nfloat4 main( float4 Col[2] : COLOR0 ) : COLOR0\n{\n return (1-Col[0]) * (Col[1]);\n}\n}}}\nThis HLSL code results in the following asm shader:\n\nps_1_1\nmul r0, 1-v0, v1\n\n''The Saturate Modifier''\nThe following two shaders generate a _sat modifier. Note that this modifier is available on all pixel shader compile targets:\n{{{\nfloat4 main( float4 Col[2] : COLOR0 ) : COLOR0\n{\n return saturate(Col[0]);\n}\n\nfloat4 main( float4 Col[2] : COLOR0 ) : COLOR0\n{\n return clamp(Col[0],0,1);\n}\n}}}\nBoth of these HLSL shaders result in the following asm shader:\n\nps_1_1\nmov_sat r0, v0\n\n'' The Negate Modifier ''\nThe following shader generates a negate modifier, which is also available on all shader targets.\n\n{{wrappingClass{ ''NOTE'' On ps_1_x, constant registers cannot be directly negated and hence will not result in a single free negation, since the constant will have to be moved to a temp before it can be negated. }}}\n{{{\nfloat4 main( float4 Col[2] : COLOR0 ) : COLOR0\n{\n return -Col[0];\n}\n}}}\nThis HLSL code will result in the following asm shader:\n\nps_1_1\nmov r0, -v0\n\n\n<html> <span style="font-size: 12px; "> <b> ps_1_x 타겟을 위한 전략 (Strategy for Targeting ps_1_x) </b> </span> </html> \nps_1_x 컴파일 타겟에서 최적화하는 방법 중 하나는 @@color(#FF0000): 먼저 셰이더를 ps_2_0으로 작성하는 것이다.@@ 이는 ps_2_0이 적용되는 하드웨어에서는 쉽고 빠르게 원형을 만들 수 있기 때문인데, 셰이더가 원하는 대로 작동이 된다면 다시 이를 원하는 ps_1_x 모델로 크로스 컴파일하면 된다. Fxc.exe를 사용할 때 검정 옵션을 사용하지 않으면, ps_1_x 모델엑서 제한이 없을 경우 생성될 명령어들이 얼마나 많은지를 확인할 수 있다. 셰이더가 적용되지 않는다 하더라도 효율적인 ps_1_x용 셰이더 코드를 얻고 실행하기 위해 어떤 불필요한 부분들이 있는지를 확인할 수 있다.\n\n\n<html> <span style="font-size: 14px; "> <b> #. D3DX Effect를 사용하여 엔진에 적용하기 </b> </span> </html>\n \n(p.073) D3DX 라이브러리 중 D3DX Effect 프레임웍은 전문 개발자들의 많은 관심을 받고 있는데 DirectX 9 버전 D3DX Effect는 HLSL의 지원 부분이 더 추가되어 있다. D3DX Effect는 3차원 응용프로그램에서 특수 효과 등을 편하게 렌더링할 수 있게 감씨놓을 목적으로 추상화된 인터페이스이다. Effect는 렌더링 스테이트(Rendering state)뿐만 아니라 이전 버전들의 하드웨어를 지원하기 위한 부분까지 포함되어 HLSL이나 asm으로 짜놓은 셰이더들까지 사용할 수 있다. @@color(#0000FF): Effect는 일반적인 경우 하나의 .fx 또는 .fxl 파일로 저장되고, 그 파일 자체가 techniques라는 다양한 버전의 Effect들을 담게 된다. @@\n\n<html> <span style="font-size: 14px; "> <b> Effect API </b> </span> </html> \n(p.078) 이제 이것들을 응용프로그램 코드에서 사용해보자. 제일 먼저 해야 할 것은 D3DXCreateEffectFromFile() API를 사용하여 Effect를 작성하는 것인데, 이 과정이 성공적으로 수행되면 Effect에 필요한 변수들을 Effect API를 통하여 설정할 수 있게 된다.\n\n\n<html> <span style="font-size: 14px; "> <b> #. D3DX Effect를 사용하지 않고 엔진에 적용하기 </b> </span> </html>\n\n(p.080) HLSL 셰이더 관리를 위한 D3DX Effect가 매우 편하기는 하지만 반드시 필요한 것은 아니다. \n...\n이는 D3DXAssembleShader*() 루틴 대신에 D3DXCompileShader*() 루틴을 사용하는 것만을 제외하고는 어셈블리 셰이더를 사용하여 응용프로그램 코드를 작성하는 것과 매우 유사하다.\n\n<html> <span style="font-size: 14px; "> <b> 상수 테이블 </b> </span> </html> \n(p.081) D3DXCompileShader*() 루틴에서 반환되는 상수 테이블은 고수준 상수들과 샘플러들을 특정 하드웨어 상수들과 샘플러들에 연결시키기 위해서 사용된다. 글로벌 스코프에서 정의된 정적이지 않은 변수들은 컴파일된 셰이더에서 사용할 입력 매개변수로 인식되고 셰이더가 정확하게 실행되기 위해서 반드시 적절하게 초기화되어야 한다. 상수 테이블이 바로 이런 역할을 해준다.\n보통 ID3DXConstantTable 인터페이스를 직접 사용하는 것이 편한데 실제 상수 테이블의 데이터 구조를 파싱할 필요가 없기 때문이다. ID3DXConstantTable 인터페이스는 ASCII 이름으로 알려진 정의된 변수들의 handle들을 찾을 수 있는 쉬운 메소드들을 제공한다.\n\n(p.082) 렌더 스테이트나 텍스처 스테이지 스테이트, 샘플러 스테이트들은 D3DX Effect에서 지원되었던 것처럼 HLSL에서 설정할 수 없으므로 응용프로그램에 의해 직접 관리되어야 한다.\n...\nD3DX Effect를 사용하지 않고 __HLSL 셰이더를 응용프로그램에 적용할 경우에는 ID3DXConstantTable 인터페이스에 익숙해지는 것이 좋다.__\n\n\n<html> <span style="font-size: 14px; "> <b> #. SDK 업데이트 </b> </span> </html> \n<html> <span style="font-size: 14px; "> <b> #. 결론 </b> </span> </html>\n<html> <span style="font-size: 14px; "> <b> #. 감사의 말 </b> </span> </html>\n\n▷ [[도서_ShaderX² : DirectX 9 셰이더 프로그래밍]]
◇ Nicolas Thibieroz, Kristof Beets, Aaron Burton)\n\n<html> <span style="font-size: 14px; "> <b> #. 소개 </b> </span> </html>\n\n(p.086) 셰이더 2.x 버전들은 몇몇 3.0 모델의 핵심적인 요소들을 지원하고 있지만 하드웨어에 따라서 동작하는 것도 그렇고, 그렇지 않는 것들도 있다. 하지만 정점 및 픽셀 셰이더 3.0에서는 지원 여부를 좀 더 쉽게 판단할 수 있다. 또한 서로 통일된 의미구조와 문법을 공유하므로 좀 더 직관적이고 간단하게 코드를 작성할 수 있다. 이 때문에 vs_3_0 프로그램은 반드시 ps_3_0과 같이 작성되어야 한다. 이 장에서는 이 새로운 셰이더 모델의 기능들을 관련 예제와 함께 살펴볼 것이다.\n\n\n<html> <span style="font-size: 14px; "> <b> #. vs_3_0과 ps_3_0의 일반적인 기능 </b> </span> </html>\n\n<html> <span style="font-size: 14px; "> <b> 유연한 입ㆍ출력 선언 </b> </span> </html>\n(p.086) 3.0 셰이더 모델에서는 입력 레지스터(정점 및 픽셀 셰이더 모두 해당)와 출력(정점 셰이더에만 해당) 레지스터들을 사용하기 전에 선언해두어야 한다. 하지만 선언된 레지스터들은 하나 이상의 선언 유형을 포함할 수 있는데, 여러 입력들을 한 레지스터에 함께 넣을 수 있다.\n\n(p.087) 정점 셰이더가 출력한 값은 보통 픽셀 셰이더가 그대로 받게 되므로, 픽셀 셰이더에서 이 기능은 정점 셰이드만큼 유용하지 않다. 픽셀 셰이더에서는 임의의 소스 스위즐링이 유용하게 사용될 수 있다.\n\n입출력 성분이 어느 레지스터를 사용할지 직접 연결할 수 있게 되어, 한 성분이 한 레지스터만을 사용해야 하는 제약이 없어졌다. 정점 및 픽셀 셰이더의 입출력 시 많은 수의 데이터형을 사용한다면 이 기능은 매우 유용할 것이다.\n\n<html> <span style="font-size: 14px; "> <b> 조건자(Predication) </b> </span> </html>\n(p.087) 조건자 레지스터(p0)는 동적인 쓰기 마스킹이 가능한 4개을 불린 플래그(x, y, z, w 채널)들의 묶음이다. 이 레지스터를 이용해서 보통 4개의 채널별로 일어나는 셰이더 연산이 적용될 것인지 아닌지를 정할 수 있다.\n이 레지스터에 조건 값을 넣으려면 setp_comp p0, src1, src2를 사용하면 된다.\n\n<html> <span style="font-size: 14px; "> <b> 정적, 동적 조건 분기 </b> </span> </html>\n(p.089) vs_2_0 모델에서는 정적 조건 제어를 사용할 수 있다(예를 들어 상수 레지스터 값에 의해 호출되는 서브루틴이나 루프 같은 분기 명령어들)... 정적 루프는 고정된 회수의 루프를 사용할 경우에 유용하다.\n3.0 모델과의 유일한 차이점은 2.0에서는 정적 조건 분기가 중첩문을 사용할 수 없다는 것이다.\nvs_2_0이 중접을 지원하지 않지만, vs_3_0과 ps_3_0은 4 단계의 중첩이 되는 정적 조건 분기를 지원한다. 하지만 3.0 모델의 가장 큰 장점은 동적 분기를 꼽을 수 있다.\n\n동적 조건 분기란, 셰이더 프로그램 내의 결과 값에 의해 수정된 레지스터 값을 비교하여 다른 코드를 수행하는 것이다. 이것은 유연성과 효율성이라는 두 가지의 큰 장점을 가지는데,... 동적 분기 명령은 24단계까지 중첩될 수 있다. 이의 설명은 다음과 같다.\n\n▣ if_comp - 비교 결과에 따라 다음의 처리를 조건적으로 수행한다.\n If 블록의 범위를 제한하기 위하여 else/ endif를 사용\n▣ if_pred - 조건자 레지스터의 값에 따라 다음의 처리를 조건적으로 수행한다.\n If 블록의 범위를 제한하기 위하여 else/ endif를 사용\n▣ callnz_pred - 조건자 레지스터의 값에 따라 서브루틴을 호출 서버루틴에서 결과 값을 사용하기 위하여 ret 명령을 사용\n▣ break_pred - 조건자 레지스터의 값에 따라 loop/ endloop 또는 rep/ endrep 블록을 조건적으로 빠져 나온다.\n▣ break_comp - 비교 값에 의해 loop/ endloop 또는 rep/ endrep 블록을 조건적으로 빠져 나온다.\n\n<html> <span style="font-size: 14px; "> <b> 임의의 스위즐(Arbitary Swizzle) </b> </span> </html>\n(p.091) vs_3_0과 ps_3_0 모두 임의의 소스 스위즐을 지원한다 (ps_2_0은 지원하지 않는다. 이 기능은 순서에 관계없이 명시된 소스 성분을 선택할 수 있게 하여 주어진 성분들이 다음 명령어에서 사용될 레지스터의 성분 배열과 일치하지 않을 경우에 레지스터를 복사하거나 수정할 필요가 없이 쓸 수 있게 해준다.\n\n<html> <span style="font-size: 14px; "> <b> 텍스처 명령어 상의 쓰기 금지 마스크 </b> </span> </html>\n\n\n<html> <span style="font-size: 14px; "> <b> #. vs_3_0의 기능 </b> </span> </html>\n\n<html> <span style="font-size: 14px; "> <b> 레지스터 </b> </span> </html>\n(p.093) vs_3_0 모델에서는 vs_2_0 모델에 있었던 12개의 레지스터에 비해 32개의 임시 레지스터(r0...r31)가 있다.\n\n셰이더의 유연성을 높이기 위하여 12개의 출력 레지스터는 oX(o0-011)로 명명되었는데, 픽셀 셰이더에서 사용하는 실수 값을 저장할 수 있다. 이 중에는 10의 레지스터만 4개의 성분을 가지는 출력 레지스터이고, 하나는 출력 위치로 선언되어야 하며, 나머지 하나는 스프라이트 크기를 지정하기 위해 사용되어야 한다.\n\n루프 카운터 레지스터 aL는 vs_2_0의 몇 번 반복하였는지 알기 위한 상수 참조의 목적으로만 사용되었지만 이제 다른 레지스터의 상대 주소 참조용으로 사용할 수 있게 되었다.\n{{{\nvs_3_0\n\n; 반복을 위한 상수형 정수 선언\ndefi i0, 8, 2, 1, 0 ; 2에서 시작하여 1씩 증가하여 8번 반복한다.\ndef c4, 0, 0, 0, 1 ; 정적 상수\n...\n\nloop aL, i0 ; 루프 시작 aL은 2에서 9로 변할 것이다.\n...\n\nendloop\n}}}\n\n<html> <span style="font-size: 14px; "> <b> 명령어 </b> </span> </html>\n(p.095) 정점 셰이더 프로그램에서 vs_2_0 모델이 256개의 명령어를 지원했던 것과 비해 새로운 vs_3_0 모델은 최소한 512개의 명령어를 지원한다. 정점 셰이더에서 실행된 명령어의 개수는 루프와 서브루틴을 사용하면 증가할 수 있다는 점을 알아두어야 한다.\n\n_abs 소스 수정자는 vs_3_0에서 새롭게 추가되었다. 이 명령어를 사용하여 소스 레지스터의 절대값을 구할 수 있다. 음수를 사용하기 위해서는 부정 수정자(-)보다 이 명령어가 앞서 사용되어야 한다.\n\n정점 및 픽셀 셰이더 모델 통합하기 위한 노력으로, ps_2_0에서 사용되었던 _sat 명령어 수정자는 vs_3_0에도 포함되었다. 이를 이용하여, 결과 값을 (0,1) 범위 안으로 변환할 수 있다.\n{{{\nsub_sat r0, r0, r1 ; r0에서 r1을 빼고, 그 결과를 (0,1) 범위로 클램프한다.\n}}}\n\n<html> <span style="font-size: 14px; "> <b> 텍스처 샘플링 </b> </span> </html>\n(p.096) 2.0 모델에서는 정점 셰이더 유닛에 기본적인 텍스처 샘플러 기능이 있었다. 그렇지만 고정된 텍스처 좌표계를 가지는 하나의 텍스처로 기능이 매우 젝한되었는데, (필터링을 지원하는) 정점 스트림을 직접 읽거나, (포인터 샘플링만을 지원하는) 정점 인덱스로부터 가져오는 그리고 n-패치와의 조합만으로 가능한 것들이었다.\n\n3.0 모델에서는 정점 텍스처링 기능을 완벽히 지원하기 때문에 정점 셰이더에서도 픽셀 셰이더와 같은 수준의 기능과 유연함을 가지고 텍스처를 참조할 수 있게 되었다... 이런 샘플러들은 셰이더 프로그램에서 dcl_textureType s# 구문을 통해서 선언되어야 하고, 텍스처 유형으로는 2d나 cube 또는 volume이 들어갈 수 있다. (예, dcl_2d s0) \n픽셀 셰이더의 텍스처와의 유일한 차이점은 이방성 필터링이 지원되지 않는다는 것이다. 또한 밉맵 계산 등을 위한 변화율 정보가 지원되지 않기 때문에 셰이더나 응용프로그램에서 LOD을 계산해서 실제 텍스처 샘플링 명령에 결과를 매개변수로 제공해주어야 한다. 따라서 texldl 명령만 지원되고 샘플링하기 위한 특정 밉맵 레벨(LOD)이 텍스처 좌표 값의 네 번째 성분으로 명시해야 한다.\n...\n\n정점 텍스처링은 매우 큰 룩업 테이블의 구현을 가능하게 해주는데, 텍스처를 정점 셰이더에서 자유롭게 사용할 수 있는 대용량 저장 공간으로 사용할 수 있게 해준다. 매번 읽을 때마다 테이블로부터 4개의 변수(RGBA 성분)을 가져올 수 있다. 이것으로 변위 매핑(displacement mapping, 텍스처의 명암 값으로 지형 같은 기하구조의 높이를 표현할 수 있게 해주는 등의 정점의 정보를 변화시키기 위한 목적으로 사용되는 맵)도 구현할 수 있다.\n\n<html> <span style="font-size: 14px; "> <b> 정점 스트림 빈도 </b> </span> </html>\n(p.098) DirectX 9에서 정점 스트림 빈도(vertex steam frequency)를 사용하려면 하드웨어가 vs_3_0 모델을 완벽하게 지원해야 한다. 정점 스트림 빈도를 설정하면 같은 입력 데이터를 한 번 이상 사용할 수 있도록 정점 데이터를 서로 다른 비율로 가져올 수 있다.\n스트림 빈도는 다음의 함수를 이용하여 설정한다.\n\n{{wrappingClass{ HRESULT IDirect3DDevice9::SetStreamSourceFreq( UNIT StreamIndex, UNIT Frequency ); }}}\n\nFrequency가 설정될 빈도로 설정이 되었기 때문에 StreamIndex는 어떤 스트림의 빈도가 설정되었는지 확인한다.\n\n정점 스트림 빈도의 실제적인 사용 예로 정점 압축을 들 수 있다.\n\n(p.099) 스트림 빈도를 사용하는 또 다른 방법은 정점 버퍼에 있는 각각의 삼각형의 애니메이션을 제어하기 위하여 정점 스트림을 사용하는 것이다.\n...\n\n정점 데디터는 어떤 형태이든지 정점 그룹간의 공유가 가능하다.\n\n\n<html> <span style="font-size: 14px; "> <b> #. ps_3_0의 기능 </b> </span> </html>\n\n<html> <span style="font-size: 14px; "> <b> 레지스터 </b> </span> </html>\n(p.100) ps_3_0 모델은 32개의 임시 레지스터와 256개의 상수 레지스터(224개의 실수, 16개의 정수, 16개의 불린)을 지원한다. 이러한 변화로 12개의 임시 레지스터와 32개의 상수 레지스터를 지원했던 ps_2_0 모델에 비하여 더 많은 데이터를 다루고 저장할 수 있게 되었다.\nps_2_0 이 8개의 실수와 2개의 정수 입력 레지스터만을 지원한 반면, ps_3_0 에서는 10개의 입력 레지스터가 모두 실수형이다. 때문에 정점 셰이더 모델에서 보간된 색은 실수형으로 전달되고, 따라서 처리중에 정밀도를 높일 수 있다. 두 개의 추가된 레지스터(p0, aL)로 조건자(predicate)와 정적/ 동적 분기를 제어한다. 이 입력 레지스터의 인덱싱은 루프 카운터 aL을 이용하여 수행한다.\n\nps_3_3 에서는 면 레지스터(face register)를 사용할 수 있게 되었는데, 이것으로 입력 픽셀이 앞면에 속해있는지를 판별할 수 있게 되었다.\n\n다음은 조건자를 이용하여 앞쪽의 픽셀을 빨간색으로, 뒤쪽의 픽셀을 녹색으로 설정하는 예이다 (vFace 레지스터가 픽셀 셰이더 프로그램에서 사용되기 전에 선언되어야 함을 기억하라).\n{{{\nps_3_0\n\ndcl vFace ; 면 레지스터를 정의\ndef c0, 0, 0, 0, 1 ; 상수 정의\n\n; 앞편이면 조건자를 참으로 뒤면이면 거짓으로\nstep_gt p0.x, vFace, c0.x\n\n; 앞면을 빨강으로, 뒤면을 녹색으로\n(p0.x) mov oC0, c0.wxx\n(!p0.x) mov cC0, c0.xwx\n}}}\n(p.101) ps_3_0 모델에서 또 다른 유용한 레지스터는 위치 레지스터인 vPos 이다. 선언되면 이 레지스터는 스크린 좌표에서 현재 픽셀의 위치를 저장한다. vPos의 x 또는 y 성분만을 사용하는 것도 가능하다. 이러한 편의는 렌더링된 장면을 포함하는 면의 모든 전처리 효과에 매우 유용하다... 간단한 예로, 다음의 코드는 매 2줄에 한 번씩 다른 색으로 렌더링을 수행한다.\n{{{\nps_3_0\n\ndcl vPos.xy ; 위치 레지스터 정의\ndef c0, 1, 0, 0, 0.5 ; 상수 정의 \n\n; 위치를 2로 나눈다.\nmul r0.xy, vPos, c0.w\n\n; 작은 부분(fractional)을 받는다.\nfrc r0.xy, r0\n\n; '작은 부분 != 0'이라면 조건자를 true로 설정한다.\nsetp_ne p0.xy, r0, c0.y\n\n; 조건자 레지스터에 따라 서로 다른 색상 값을 출력한다.\n(p0.y) mov oC0, c0.xyyx ; 빨강 출력\n(!p0.y) mov cC0, c0.yxyx ; 녹색 출력\n}}}\n\n<html> <span style="font-size: 14px; "> <b> 명령어 </b> </span> </html>\n(p.102)vs_3_0 모델과 마찬가지로 ps_3_0은 512개의 명령어를 지원한다. 이는 96개(64개의 산술, 32개의 텍스처)의 명령어를 지원하는 ps_2_0에 비하면 비약적인 발전이다. 게다가 ps_2_0의 제한 때문에 불가능했던 퍼센테이지-클러져 필터링 또는 큰 필터 커널과 같은 복잡한 셰도우 매핑이 가능해졌다. 게다가 산술 명령어나 텍스처 명령어에 상관없이 512개의 명령어를 사용할 수 있다. 하지만 픽셀 셰이더 안에서 실행되는 명령어의 개수는 루프와 서브루틴의 사용으로 증가할 수 있으므로 주의하기 바란다.\n...\nvs_3_0에서 사용했던 _abs 소스 수정자는 ps_3_0에도 사용할 수 있다.\n\nps_3_0은 새로운 텍스처 명령을 제공하는데, texldl을 사용하여 부분적인 밉맵 레벨을 선택할 수 있고, 소스 텍스처 좌표의 w 성분으로 MIP 레벨을 설정할 수 있다. w 값을 소수 값으로 설정하면 MIP 레벨간을 혼합할 수 있다. 이 기능은 매우 작거나 정밀한 텍스처링, 또는 텍스처 필터링을 변경할 때 매우 유용하다.\n\ngradient 명령어는 ps_3_0 모델의 새로운 명령어이다. dsx, dsy와 texldd 등이 이를 수행하는 새로운 명령어인데, 이 명령어는 레지스터 값에 인접한 픽셀의 수평(dsx)과 수직(dsy) 방향의 변화율을 감지하는 데 사용한다. \ntexldd 명령어는 함수에 전달된 텍스처 좌표계의 수직 및 수평 번화율에 따라 픽셀을 샘플링하기 위해 사용된다. \ngradiednt 명령어는 일반적으로 샘플링된 텍셀에 적용된 밉맵 레벨을 측정하여 임의의 필터링이 적용될 수 있도록 하는 데 쓰인다. 다음은 텍스처 좌표계에서의 변화율을 측정하고 texldd 명령어에 그 값을 전달하는 셰이더 예제이다.\n{{{\nps_3_0\n\n; 샘플러들\ndcl_2d s0 ; 장면에 포함된 텍스처\n\n; 입력 레지스터\ndcl_texcoord0 v0 ; 텍스처 좌표\n\n; 텍스처 좌표에 인접한 수평 및 수직 변화율을 계산한다.\ndsx r1, v0 ; 수평\ndsy r2, v0 ; 수직\n\n; 픽셀 샘플링\ntexldd r0, v0, s0, r1, r2\n}}}\n\ncentroid는 멀티 샘플링을 사용할 때, 텍스처 샘플링 위치를 조정하기 위해서 사용하는 명령어 수정자이다. 멀티샘플링된 삼각형 꼭지점이 픽셀의 가운데를 포함하지 않고, 멀티샘플링된 마스크의 서브픽셀을 하나 이상 포함하는 것을 피하기 위해서 사용한다. centroid는 _centroid 수정자를 텍스처 명령어에 추가하여 사용한다. 다음은 멀티샘플링 된 장면의 픽셀 셰이더 코드의 예이다.\n{{{\nps_3_0\n\n; 샘플러\ndcl_2d s0 ; 텍스처\n\n; 입력 레지스터\ndcl_texcoord0 v0 ; 텍스처 좌표\n\n; 가운데의 텍셀을 샘플링\ntexld_centroid r0, v0, s0\n}}}\n\n<html> <span style="font-size: 14px; "> <b> 무제한의 텍스처 샘플과 의존적 읽기 </b> </span> </html>\n(p.103) ps_3_0 모델에서는 모든 텍스처 읽기 제한이 완벽하게 없어졌다. 이제 셰이더를 좌표 계산을 이용하여 어떤 소스에서도 무제한적으로 텍스처를 몇 번이라도 읽을 수 읽게 되었다.\n이전의 2.0 모델은 픽셀 셰이더 프로그램 안에서 32개의 텍스처 명령어와 4번의 의존적인 읽기만 수행이 되었다. 이러한 새로운 기능이 반복적이고 재귀적인 알고리즘을 하드웨어에 독립적으로 사용할 수 있게 하였다.\n\n\n<html> <span style="font-size: 14px; "> <b> #. 결론 </b> </span> </html>\n\n(p.104) 3.0 셰이더 모델은 이전의 2.0 모델에 비해 많은 발전이 있었다. 레지스터와 명령어가 제한되었던 부분이 혁신적으로 개선되었기 때문에 더 많은 진보된 기능들이 적용될 수 있게 되었다. 정점 셰이더 모델과 픽셀 셰이더 모델이 통일되면서 간결해졌을 뿐만 아니라, 보다 유연하게 명령어와 레지스터들을 사용할 수 있게 되었다.\n\n<html> <span style="font-size: 14px; "> <b> #. 참고 자료 </b> </span> </html>\n\n▷ [[도서_ShaderX² : DirectX 9 셰이더 프로그래밍]]
''#. 전투''\n|>|!01장 전쟁의 시작 | !일반|!정예 ||>|!02장 치닫는 위기감 | !일반|!정예 |\n|베네토급 |북해 공격 | 리벤지급|콜로라도 |~|그라프 체펠린급 |동맹국의 반목 | 아드미랄 히퍼급|운류 |\n|~|U47호 추격 | 콩고급|요크타운 |~|~|그리스 지원 | 와스프급|노스캐롤라이나 |\n|~|아이슬란드 수송 | 네바다급|카사블랑카 |~|~|노르웨이 외해 | 콜로라도급|소비에트 |\n|~|대서양 복수 | 브르타뉴급|사우스다코타 |~|~|비즈마크 섬멸 | 바라쿠다급|I-400 |\n|>|!03장 영미동맹 |! |! | |>|!04장 극동탐색 |! |! |\n|샤른호르스트급 |에니그마 | 퀸 엘리자베스급|베네토 |~|뱅가드급 |Z함대 전투 | 뉴멕시코급|뱅가드 |\n|~|악마의 등장 | 커레이저스급|그라프 체펠린 |~|~|북호주 방어 | 디모인급|소비에트 |\n|~|실력 테스트 | 타카오급|샤른호르스트 |~|~|산호해 전투 | 도이칠란드급|나가토 |\n|~|막다른 골목 | VIIC형|사우스다코타 |~|~|암류의 제거 | 쉬르쿠프급|일러스트리어스 |\n|>|!05장 북유럽 출정 |! |! | |>|!06장 악의세력 근절 |! |! |\n|소비에트급 |빙해격전 | 이세급|리슐리외 |~|나가토급 |빙해 2차전 | 됭케르크급|넬슨 |\n|~|어둠의 등장 | 조프르급|샤른호르스트 |~|~|소굴 탐색 | 렉싱턴급|아카기급 |\n|~|북해의 늑대 | 요크타운급|알자스 |~|~|늑대 유인 | 토네급|I-400 |\n|~|어둠의 재등장 | VIIB형|비스마르크 |~|~|어둠의 2차전 | M형|다이호 |\n|>|!07장 아태의 반격 |! |! | |>|!08장 반격 전략 |! |! |\n|일러스트리어스급 |솔로몬 해전 | 후소급|나가토 |~|리슐리외급 |레이테만 해전 | R형|A형 |\n|~|솔로몬 보위 | 콜로서스급|후드 |~|~|무사시호 격침 | 펜실베니아급|킹 조지 5세 |\n|~|오거스타만 전투 | 렉싱턴급|운류 |~|~|오키나와 해전 | 인디펜던스급|소류 |\n|~|마리아나 해전 | 런던급|라이언 |~|~|야마토 전멸 | 투르비유급|힌덴부르크 |\n|>|!09장 동틀무렵 |! |! | |>|!10장 적의 소굴 |! |! |\n|운류급 |바다의 격전 | 카이다이형|소류 |~|비스마르크급 |소굴 공격 | 알래스카급|A형 |\n|~|악전고투 | 카이오 두일리오급|텐치 |~|~|마지막 저항 | 카츄사급|아크로열 |\n|~|엄밀방어 | 카사블랑카급|넬슨 |~|~|치명적 타격 | 카사블랑카급|리슐리외 |\n|~|승승장구 | 쥰센형|IXD2형 |~|~|남극 결전 | 마르첼로급|에식스 |\n|>|!11장 대양함대 |! |! | |>|!12장 새로운 적군 |! |! |\n|넬슨급 |공해 순항 | 아드미랄 히퍼급|노스캐롤라이나 |~|아카기급 |지원 사격 | 퀸 엘리자베스급|일러스트리어스 |\n|~|적군 대면 | 와스프급|그라프 체펠린 |~|~|함대 격파 | 커레이저스급|알자스 |\n|~|주력 격돌 | 콜로라도급|텐치 |~|~|기함 격파 | 타카오급|IXD2형 |\n|~|바짝 추격 | 바라쿠다급|뱅가드 |~|~|부패세력 | |비스마르크 |\n\n\n\n|>|03장 | 일반|정예 | |>|04장 | 일반|정예 |\n| | | | |~| | | | |\n| | | | |~| | | | |\n| | | | |~| | | | |\n| | | | |~| | | | |\n\n
출처 ; http://telnet.or.kr/directx/graphics/programmingguide/programmable/vertexshaders/decouplingvertexdeclaration.htm\n\n<html> <span style="font-size: 14px;"> <b> LoadXFile();과 렌더링 시, Vertex 정의 분리 </b> </span> </html>\n!!! LoadXFile();\n{{{\nstruct ShaderVertex\n{\n FLOAT x, y, z; // The untransformed position for the vertex\n FLOAT nx, ny, nz;\n FLOAT u, v;\n};\n\n// set custom FVF macro\n#define D3DFVF_VERTEX (D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1)\n\n// for CloneMesh(...);\nD3DVERTEXELEMENT9 decl_LoadVertex[] =\n{\n { 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 }, // position\n { 0, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0 }, // Normal\n { 0, 24, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 }, // texture\n D3DDECL_END()\n};\n//-----------------------------------------------------------------------------\nHRESULT CMyD3DApplication::LoadXFile(TCHAR* name)\n{\n HRESULT hr;\n LPD3DXMESH pMeshSysMem = NULL;\n\n if (FAILED(D3DXLoadMeshFromX(name, D3DXMESH_SYSTEMMEM, m_pd3dDevice,\n NULL, NULL, NULL, NULL, &pMeshSysMem)))\n return E_FAIL\n ;\n ID3DXMesh * temp;\n\n hr = pMeshSysMem->CloneMesh(D3DXMESH_MANAGED, decl_LoadVertex, m_pd3dDevice, &temp);\n pMeshSysMem->Release();\n pMeshSysMem = temp;\n\n m_iNumTriangles = pMeshSysMem->GetNumFaces();\n m_iNumVertices = pMeshSysMem->GetNumVertices();\n\n ...\n\n return S_OK;\n}\n}}}\n!!! 렌더링시 Vertex Shader 정의\n ; Input registers\n ; the dcl_* stuff was new to DX9.\ndcl_position v0 ; Position\ndcl_normal v3 ; Normal\ndcl_texcoord v7 ; Texture\ndcl_tangent v8 ; Tangent\n{{{\n// Create the shader declaration.\nD3DVERTEXELEMENT9 decl[] =\n{\n { 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 }, // position\n { 0, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0 }, // Normal\n { 0, 24, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 }, // texture\n { 0, 32, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TANGENT, 0 }, // tangent\n D3DDECL_END()\n};\n//-----------------------------------------------------------------------------\n// LPDIRECT3DVERTEXDECLARATION9 m_pVertexDeclaration;\nHRESULT CMyD3DApplication::InitDeviceObjects()\n{\n...\n m_pd3dDevice->CreateVertexDeclaration(decl, &m_pVertexDeclaration);\n\n return S_OK;\n}\n\nHRESULT CMyD3DApplication::Render()\n{\n if (SUCCEEDED(m_pd3dDevice->BeginScene()))\n {\n\n ...\n // set FVF\n m_pd3dDevice->SetVertexDeclaration(m_pVertexDeclaration);\n\n // set the vertex shader\n m_pd3dDevice->SetVertexShader(m_pVertexShader);\n\n // ... rendering\n m_pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, m_iNumVertices, 0, m_iNumTriangles);\n \n // End the scene.\n m_pd3dDevice->EndScene();\n }\n\n return S_OK;\n}\n}}}\n\n<html> <span style="font-size: 14px;"> <b> Vertex 정의 예 </b> </span> </html>\n{{{\n// A structure for our custom vertex type\nstruct SVertex\n{\n float x, y, z; // position\n float nx, ny, nz; // normal\n float u1, v1; // firts texture channel\n float ux, uy, uz; // U vector\n float vx, vy, vz; // V vector\n float uvx, uvy, uvz; // UxV vector\n};\n// Our custom FVF, which describes our custom vertex structure\n#define FVF_VERTEX ( D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX4 | \s\n D3DFVF_TEXCOORDSIZE2(0) | D3DFVF_TEXCOORDSIZE3(1) | D3DFVF_TEXCOORDSIZE3(2) | D3DFVF_TEXCOORDSIZE3(3))\n}}}\n| 위치 정보 | Normal 정보 | Textur 4개로 구성 | 개별 Textur 정보 |\n| D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX4 |D3DFVF_TEXCOORDSIZE2(0),<br> D3DFVF_TEXCOORDSIZE3(1), D3DFVF_TEXCOORDSIZE3(2), D3DFVF_TEXCOORDSIZE3(3)|\n\n\nMicrosoft® DirectX® 9.0 에서는, 셰이더 생성 (CreateVertexShader) 시에는 정점 셰이더와 정점 선언을 바인드 하지 않게 되었다. 셰이더의 평가는 2 개의 부분으로 나누어졌다. 최초의 부분을 셰이더 생성시에 실행해, 나머지의 부분을 드로잉(Drawing) (DrawPrimitive) 시에 실행한다. \n\n!!! DirectX 8. x 정점 선언의 DirectX 9.0 정점 선언에의 맵핑\n|!DirectX 8. x |!DirectX 9.0 사용법 |!DirectX 9.0 사용법인덱스 |\n|D3DVSDE_POSITION |D3DDECLUSAGE_POSITION |0 |\n|D3DVSDE_POSITION2 |D3DDECLUSAGE_POSITION |1 |\n|D3DVSDE_NORMAL |D3DDECLUSAGE_NORMAL |0 |\n|D3DVSDE_NORMAL2 |D3DDECLUSAGE_NORMAL |1 |\n|D3DVSDE_BLENDWEIGHT |D3DDECLUSAGE_BLENDWEIGHT |0 |\n|D3DVSDE_BLENDINDICES |D3DDECLUSAGE_BLENDINDICES |0 |\n|D3DVSDE_PSIZE |D3DDECLUSAGE_PSIZE |0 |\n|D3DVSDE_DIFFUSE |D3DDECLUSAGE_COLOR |0 |\n|D3DVSDE_SPECULAR |D3DDECLUSAGE_COLOR |1 |\n|D3DVSDE_TEXCOORDn |D3DDECLUSAGE_TEXCOORD |n |\n\n!!! FVF 코드의 DirectX 9.0 정점 선언에의 맵핑\n|!FVF |!데이터 타입 |!사용법 |!사용법인덱스 |\n|D3DFVF_XYZ |D3DDECLTYPE_FLOAT3 |D3DDECLUSAGE_POSITION |0 |\n|D3DFVF_XYZRHW |D3DDECLTYPE_FLOAT4 |D3DDECLUSAGE_POSITIONT |0 |\n|D3DFVF_XYZW |D3DDECLTYPE_FLOAT4 |D3DDECLUSAGE_POSITIONT |0 |\n|D3DFVF_XYZB5 및 D3DFVF_LASTBETA_UBYTE4 |D3DVSDT_FLOAT3, D3DVSDT_FLOAT4, D3DVSDT_UBYTE4 |D3DDECLUSAGE_POSITION, D3DDECLUSAGE_BLENDWEIGHT, D3DDECLUSAGE_BLENDINDICES |0 |\n|D3DFVF_XYZB5 |D3DDECLTYPE_FLOAT3, D3DDECLTYPE_FLOAT4, D3DDECLTYPE_FLOAT1 |D3DDECLUSAGE_POSITION, D3DDECLUSAGE_BLENDWEIGHT, D3DDECLUSAGE_BLENDINDICES |0 |\n|D3DFVF_XYZBn (n=1..4) |D3DDECLTYPE_FLOAT3, D3DDECLTYPE_FLOATn |D3DDECLUSAGE_POSITION, D3DDECLUSAGE_BLENDWEIGHT |0 |\n|D3DFVF_XYZBn (n=1..4) 및 D3DFVF_LASTBETA_UBYTE4 |D3DDECLTYPE_FLOAT3, D3DDECLTYPE_FLOAT(n-1), D3DDECLTYPE_UBYTE4 |D3DDECLUSAGE_POSITION, D3DDECLUSAGE_BLENDWEIGHT, D3DDECLUSAGE_BLENDINDICES |0 |\n|D3DFVF_NORMAL |D3DDECLTYPE_FLOAT3 |D3DDECLUSAGE_NORMAL |0 |\n|D3DFVF_PSIZE |D3DDECLTYPE_FLOAT1 |D3DDECLUSAGE_PSIZE |0 |\n|D3DFVF_DIFFUSE |D3DDECLTYPE_D3DCOLOR |D3DDECLUSAGE_COLOR |0 |\n|D3DFVF_SPECULAR |D3DDECLTYPE_D3DCOLOR |D3DDECLUSAGE_COLOR |1 |\n|D3DFVF_TEXCOORDSIZEm(n) |D3DDECLTYPE_FLOATm |D3DDECLUSAGE_TEXCOORD |n |\n\n!!! DirectX 9.0 정점 선언의 DirectX 8. x 정점 선언에의 맵핑\n|!사용법 |!사용법인덱스 |!DirectX decl |\n|D3DDECLUSAGE_POSITION |0 |D3DVSDE_POSITION |\n|D3DDECLUSAGE_POSITION |1 |D3DVSDE_POSITION2 |\n|D3DDECLUSAGE_BLENDWEIGHT |0 |D3DVSDE_BLENDWEIGHT |\n|D3DDECLUSAGE_BLENDINDICES |0 |D3DVSDE_BLENDINDICES |\n|D3DDECLUSAGE_NORMAL |0 |D3DVSDE_NORMAL |\n|D3DDECLUSAGE_NORMAL |1 |D3DVSDE_NORMAL2 |\n|D3DDECLUSAGE_PSIZE |0 |D3DVSDE_PSIZE |\n|D3DDECLUSAGE_COLOR |0 |D3DVSDE_DIFFUSE |\n|D3DDECLUSAGE_COLOR |1 |D3DVSDE_SPECULAR |\n|D3DDECLUSAGE_TEXCOORD |n |D3DVSDE_TEXTUREn, n <= 7 |\n\n!!! DirectX 9.0 정점 선언의 FVF 코드에의 맵핑\nDirectX 8.0 및 그 이후의 드라이버에서는, 선언에 정상적으로 변환할 수 있어 따라 고정 기능 정점 처리로 사용할 수 있는 타입이 그 밖에도 있다. \n|!데이터 타입 |!사용법 |!사용법인덱스 |!FVF |\n|D3DDECLTYPE_FLOAT3 |D3DDECLUSAGE_POSITION |0 |D3DFVF_XYZ |\n|D3DDECLTYPE_FLOATn |D3DDECLUSAGE_BLENDWEIGHT |0 |D3DFVF_XYZBn |\n|D3DDECLTYPE_UBYTE4 |D3DDECLUSAGE_BLENDINDICES |0 |D3DFVF_XYZB (nWeights+1) |\n|D3DDECLTYPE_FLOAT3 |D3DDECLUSAGE_NORMAL |0 |D3DFVF_NORMAL |\n|D3DDECLTYPE_FLOAT1 |D3DDECLUSAGE_PSIZE |0 |D3DFVF_PSIZE |\n|D3DDECLTYPE_D3DCOLOR |D3DDECLUSAGE_COLOR |0 |D3DFVF_DIFFUSE |\n|D3DDECLTYPE_D3DCOLOR |D3DDECLUSAGE_COLOR |1 |D3DFVF_SPECULAR |\n|D3DDECLTYPE_FLOATm |D3DDECLUSAGE_TEXCOORD |n |D3DFVF_TEXCOORDSIZEm(n) |\n|D3DDECLTYPE_FLOAT3 |D3DDECLUSAGE_POSITION |1 |부적당용 |\n|D3DDECLTYPE_FLOAT3 |D3DDECLUSAGE_NORMAL |1 |부적당용 |\n\n\n
◇ Hun Yen Kwoon\n\n<html> <span style="font-size: 14px; "> <b> #. 소개 </b> </span> </html>\n\n(p.220) 그림자는 현실감을 높이기 위한 가장 좋은 방법 중의 하나이다. 그림자는 보는 이에게 화면에서 각 대상이 어떻게 놓여있는지에 대한 중요한 단서를 제공해준다.\n\ncf. Allan Watt가 소개한 주요한 그림자 표현 방식 ; 스캔라인 검사(이전 기술), 가시면의 그림자 폴리곤(이전 기술), 그림자 입체, 그림자 z 버퍼\n\n그림자 입체가 확실한 비교 우위에 있는 것은 아니지만, 다른 방법들에 비하여 몇 가지 장점이 있는 것은 사실이다. 먼저 모서리가 확연하게 드러나는 그림자를 표현할 수 있고 자신에게 그림자를 드리우는 것이 기본적으로 가능하다(다른 그림자 생성기법에서는 불가능하다). 그림자가 드리워질 대상물이 잔뜩 있는 장면에서도 정확한 모양의 그림자 드리우기가 가능하다... 또한 그림자 입체 구현 시 소프트 그림자 또는 거리에 따라 희석되는 그림자 생성 같은 효과를 얻기 위해서 다른 렌더링 기법들(투영 텍스처링, 불륨 텍스처링이나 그림자 매핑 등)과 함께 쓸 수도 있다.\n\n\n<html> <span style="font-size: 14px; "> <b> #. 그림자 입체의 개념 </b> </span> </html>\n\n(p.223) 스텐실 그림자 입체를 구현하는 데는 두 가지 기법이 있다. 하나는 오리지널 기술인 depth-pass로 알려진 것이고, 다른 하나는 새롭게 변형된 depth-fail이라고 알려진 기법이다.\n\n<html> <span style="font-size: 14px; "> <b> depth-pass (z-pass) </b> </span> </html>\n(p.224) 스텐실 버퍼 안의 이 값은 다음과 같은 스텐실 연산으로 생성된다.\n\n1. 앞면을 렌더링한다. depth-pass인 경우에 스텐실 값을 증가시킨다. depth-fail일 때는 그대로 둔다. 프레임과 깊이 버퍼는 그리지 않도록 설정한다.\n\n2. 뒷면을 렌더링한다. depth-pass인 경우에 스텐실 값을 감소시킨다. depth-fail일 때는 그대로 둔다. 역시 프레임과 깊이 버퍼는 그리지 않도록 설정한다.\n\n위의 알고리즘이 depth-pass 스텐실 그림자 입체 기법이다. 깊이 판정을 통과할 경우에만 스텐실 값을 바꾸기 때문에, depth-pass는 z-pass라고 불리기도 한다.\n...\n\n@@color(#0000FF): depth-pass 기법의 알고리즘이 동작하려면 픽셀로 표현되는 광선이 오클루더의 그림자 입체를 몇 번이나 출입했는가를 셀 수 있게 매 픽셀마다 그림자 입체 카운팅을 해야 한다.@@ 뜻밖에도 이것은 화면에 표시할 색상 값을 계산하기 위해 광선을 투영하는, 광선-추적(ray-tracing) 기법에서 사용하는 개념과 같은 것이다. 스텐실 그림자 입체의 경우에느 그림자 안에 픽셀의 존재 유무만 확인하면 된다.\n\n(p.225) John Carmak와 Bill Bilodeau Mike Songy는 개별적으로 대안 기법들을 내놓았는데, depth-pass 스텐실 알고리즘을 반대로 사용하는 것이다. 후에 이 기법은 depth-fail 기법이라고 불리게 되었다...\ndepth-pass 스텐실 알고리즘의 대안들을 내놓은 것일까? depth-pass는 대부분의 경우에 완벽하게 동작한다. 하지만 __시점이 그림자 입체의 안으로 들어가게 되면 depth-pass 알고리즘은 완벽하게 깨져버린다.__\n\n<html> <span style="font-size: 14px; "> <b> depth-fail (z-fail) </b> </span> </html>\n(p.227) 위의 단계를 단순화하면 다음과 같다.\n\n1. 뒷면을 렌더링한다. depth-fail인 경우 스텐실 값을 증가시킨다. depth-pass인 경우 그냥 놔둔다. 프레임과 깊이 버퍼에는 그리지 못하게 한다.\n\n2. 앞면을 렌더링한다. depth-fail인 경우 스텐실 값을 감소시킨다. depth-pass인 경우 그냥 놔둔다. 프레임과 깊이 버퍼에는 그리지 못하게 한다.\n\n위 두 단계의 스텐실 작업이 완성된 depth-fail 알고리즘이다. 이것은 스텐실 값이 깊이 판정(depth-test)이 실패했을 경우에만 변하기 때문에 depth-fail 스텐실 그림자 입체 기법이라고 한다. depth-fail은 z-fail이라고도 한다. 이 depth-fail 알고리즘은 depth-pass 알고리즘의 반대 방식인데 이 알고리즘은 시점이 그림자 입체의 안으로 들어가도 문제가 생기지 않는다.\n\n(p.229) 스텐실 버퍼에 0이외의 값을 넣기 위한 depth-fail 기법은 그림자 입체에서의 시점을 기준으로 하여 뒷면을 렌더링할 수 있는가 없는가에 달려있다. 이것은 그림자 입체가 반드시 유연한 입체여야 한다는 것을 의미한다. 즉 그림자 입체의 앞면과 뒷면이 (그것들이 무한히 이어진다 하더라도) 닫혀 있어야 한다는 것이다. 닫혀 있지 않다면 depth-fail 기법은 제대로 된 계산을 하지 못한다. 설령 무한 입체라 할지라도 그림자 입체는 유한한 입체로 만들어야 한다.\n\n(p.230) 여기서 유한 입체를 렌더링하는 것이 앞뒤를 막지 않은 depth-pass 방식을 사용하는 것보다 계산량이 많을 수 있다는 점을 알아야 한다. 게다가 입체를 막기 위한 덮개 때문에 더 늘어난 폴리곤 숫자들로 인하여 앞뒤를 막는 면들을 계산하고 저장하는데, 더 많은 자원이 필요하게 된다.\n\n\n<html> <span style="font-size: 14px; "> <b> #. 문제와 해법 </b> </span> </html>\n\n<html> <span style="font-size: 14px; "> <b> 유한 그림자 덮개 </b> </span> </html>\n(p.231) 무한 그림자 입체는 오브젝트가 오클루더에 얼마나 근접해있는지는 고려하지 않으며, 결과로 나온 그림자 입체는 장면에서 나오는 모든 오브젝트를 포함한다.\n\n<html> <span style="font-size: 14px; "> <b> 고스트 그림자 </b> </span> </html>\n(p.231) 오브젝트를 무한하거나 아주 큰 값으로 늘리는 것으로 유한 그림자 입체 덮개 문제를 해결할 수 있지만, 이로 인해 다른 문제가 발생한다. FPS 게임에서 2명의 플레이어가 방과 방이 이어진 던젼을 플레이한다고 생각해보자. 한 방에는 탁상 램프가 있고, 이 때문에 한 플레이어가 벽돌고 만들어진 벽에 그림자를 드리운다.\n\n다른 방에 있는 플레이어는 그림자 입체가 무한대로 확장된다면, 이 그림자를 볼 수 있다. "고스트" 그림자 때문에, 두꺼운 벽이 갑자기 얇으 종이 장처럼 보이기도 한다.\n\n(p.232) 유한 그림자 입체 덮개와 고스트 그림자의 문제를 해결할 수 있는 유일한 방법은 장면에서 광원과 오클루더의 위치를 제한하는 것이다. __그림자를 드리우는 광원과 오클루더의 최소 거리를 알 수 있다면, 고스트 그림자를 발생시키지 않으면서 그림자 입체를 확장할 수 있는 최대 거리를 알 수 있다.__ 장면에서 오클루더와 광원이 서로 간섭하지 않게 하거나, 스텐실 그림자 입체를 적용하지 않거나 하는 것은 설계자의 권한이다.\n\n<html> <span style="font-size: 14px; "> <b> 시야 절두체 절단 </b> </span> </html>\n(p.233) 그림자 입체가 폴리곤으로 만들어졌기 때문에, 다른 폴리곤과 마찬가지로, 근단면 또는 원단면에 의해 절단되는 문제를 안고 있다. 그러나 그림자 볼륨의 이런 성질은 입체가 절단됨으로써 그림자 볼륨의 카운팅을 잘 할 수 없게 되어 잘못된 그림자를 렌더링 할 수 있다는 데에 더 심각한 문제가 있다. depth-pass 와 depth-fail 두 기법은 모두 다른 식으로 시야 절두체 절단으로 인한 문제를 가진다.\ndepth-pass 기법은, 그림자 입체가 근단면을 가로지른 뒤에 잘렸을 때, 에러를 발생한다.\n반대로 depth-fail 기법은 원단면에 의한 그림자 입체의 절단 때문에 발생한다.\n\n(p.234) 이러한 문제를 해결하는 간단한 방법은 절단면이 그림자 입체를 자르지 않도록 이동시키는 것이다. 근면(near plane)이 깊이 판정을 통과하는 문제가 발생하지 않도록 하기 위해 조정하는 것은 깊이의 정밀도 범위에 큰 영향을 미치고, 깊이 버퍼값을 사용하는 다른 작업에 부정적인 영향을 끼칠 수 있기 때문에 그다지 적당하지 않다. 반면에 원면(far plane)을 무한대로 옮기는 것은 depth-fail 기업에서 원면 절단 문제를 해결할 수 있다.\n\n(p.238) 하지만 무한대의 시야 절두체를 사용하다는 것은 더 많은 기하 구조체를 그려야 한다는 것임을 명심하자(시야가 무한대로 넓어지므로 시야 안에 기하구조들이 더 많이 들어오게 된다). 이는 효율에 문제가 될 수 있기 때문에 신중해야 한다.\n\n(p.239) depth-fail 그림자 입체를 어떤 그래픽 카드(최소한 스텐실 기법을 지원하는)에서도 사용하기를 원한다면, 깊이 클램핑(depth clamping, nVidia의 GeForce3 이상의 그래픽 카드에서 지원) 확장법 대신에, 무한 시야 절두체 투영법을 사용해야 할 것이다.\n\n\n<html> <span style="font-size: 14px; "> <b> #. CPU에서의 실행 </b> </span> </html>\n\n(p.239) CPU에서의 실행에 들어가기에 앞서 이 책에 포함되어 있는 CD에 있는 DepthPassCPU와 DepthFailCPU 샘플을 살펴보아야 한다. 이 두개의 샘플은 DirectX 8.1로 작성되었다. CPU에서 그림자 입체를 실행하기 위한 일반적인 과정은 간단하다. 다음 2개의 예는 CPU 기반의 샘플에 대한 소개이다.\n\n<html> <span style="font-size: 14px; "> <b> 어떤 방식으로 실행되나? </b> </span> </html>\n\n<html> <span style="font-size: 14px; "> <b> 외곽선 찾기 </b> </span> </html>\n(p.244) 윤곽 측정은 스텐실 그림자 입체를 적용하는 과정에서 가장 많은 계산을 수행하는 2개의 과정 중에 하나라는 것에 주의하라. \n나머지 하나는 스텐실 버퍼를 업데이트하기 위해 그림자 입체를 렌더링하는 것이다. 이 두 영역의 최적화가 최적화 과정의 대부분을 차지한다.\n\n<html> <span style="font-size: 14px; "> <b> 그림자 입체 만들기 </b> </span> </html>\n(p.248) 고정 기능 파이프라인을 사용하는 렌더링 벡터(w=0)는 에러가 발생할 뿐만 아니라 효율적이지 않다. 많은 양의 기하구조의 정점 변환과 매핑이 필요하고, 하드웨어의 강력한 수치 계산 능력이 요구되어 CPU 자원 소모가 높아진다.\n이상적으로 기하구조의 무한 돌출은 이미 정점 셰이더 안에서 정점들을 변환하기 때문에 정점 프로그램 안에서 더 쉽게 구현할 수 있다. 사실 간단한 정점 프로그램은 이미 InfiniteGPU 샘플 안에 있고 이는 "GPU(셰이더)에서의 실행"섹션에서 다루었다. 그림자 입체 폴리곤에의 색깔은 아무런 의미가 없기 때문에, 정점들에 조명을 줄 필요가 없다는 점을 알아두도록 하자.\n\n<html> <span style="font-size: 14px; "> <b> 그림자 입체 덮개 </b> </span> </html>\n(p.248) 그림자 입체 덮개의 목적은 그림자 입체를 닫힌 입체로 만들기 위해서이며, 무한한 그림자 입체일 경우에도 반드시 닫혀 있어야 한다... 점광원은 윤곽선을 점에서 점으로 돌출시키고, 무한 지향 광원은 모든 윤곽선을 한 점에서 무한으로 돌출시킨다.\n이는 그림자 입체의 뒤쪽을 닫는 것이 무한 지향 광원에서는 무한한 점에 의해 이미 닫혀 있으므로 필요가 없다는 이야기이다. @@color(#0000FF): 점광원은 돌출된 거리에 무관하게 앞과 뒤를 닫아야 하므로 보다 복잡한 문제에 부딪히게 된다. @@\n\n<html> <span style="font-size: 14px; "> <b> Depth-pass 스텐실 작업(DepthPassCPU) </b> </span> </html>\n(p.250) 정확한 그림자 카운트로 스텐실 버퍼를 채우기 위하여 그림자 입체를 렌더링하기 전에, 스텐실 작업을 설정해야 한다.\n\n<html> <span style="font-size: 14px; "> <b> Depth-fail 스텐실 작업(DepthFailCPU) </b> </span> </html>\n\n<html> <span style="font-size: 14px; "> <b> 그림자 입체 덮개의 렌더링 </b> </span> </html>\n(p.258) depth-Pass를 위한 그림자 입체의 렌더링이 일반적으로 행하여지며, 특별한 설정이 필요한 것도 아니다. 하지만 간혹 동일 평면상에서 오클루더의 기하구조의 덮개로 인한 depth-fail 기법이 적용되지 않을 때가 있다.\n\n... 오브젝트마다 투영된 깊이 값을 보정하면 미세한 조정이 가능해지고, 때로는 더 좋은 성능을 보여준다. 그러나 당연히 구현은 좀 더 복잡해진다. 적절한 카메라 공간 오프셋의 선택은 투영 조망에서의 깊이 버퍼의 규격화되지 않은 정밀도 때문에 복잡해질 수 있다. 카메라와의 거리가 멀어지면 깊이 정밀도는 큰 폭으로 떨어질 수 있으며, 깊이 값 때문에 렌더링이 잘못되어 폴리곤이 가까이 있는 것처럼 보일 수가 있다.\n예를 들어 낮은 깊이 정밀도 때문에 관찰자가 멀어질수록 벽에 걸려있는 벽걸이의 조각이 마치 벽 뒤에 있는 것처럼 보이기도 한다. 깊이 정밀도 에러는 일반적으로 z-fighting이라 알려진 폴리곤의 깜빡거림을 동합한다. 이처럼 비선형적인 행동에 맞추어 수정되어야 하는 투영된 깊이 값을 조작할 때 카메라 공간의 오프셋을 이용한다.\n{{{\n01 // 오클루더의 z-보정 값을 높게 설정한다.\n\n02 m_pd3dDevice->SetRenderState(D3DRS_ZBIAS, 1);\n03 // 오클루더를 렌더링한다.\n\n04 .\n05 .\n06 .\n\n07 // 그림자 입체의 z-보정을 낮게 설정한다.\n\n08 m_pd3dDevice->SetRenderState(D3DRS_ZBIAS, 0);\n09 // 그림자 입체를 설정한다.\n}}}\nZ-보정 플래그값(D3DRS_ZBIAS)을 그림자를 드리우는 물체의 기하구조에 높게 설정하고, 그림자 입체에는 낮게 설정한다. 이는 그림자 입체의 앞면 덮개가 오클루더 기하구조 앞면의 뒤에서 렌더링하도록 하기 위해서이다.\n\n\n<html> <span style="font-size: 14px; "> <b> #. GPU(셰이더)에서의 실행 </b> </span> </html>\n\n(p.260) ATI Radeon 8000 시리즈와 nVidia GeForce3 시리즈의 발표 이후로 대부분의 새로운 그래픽 카드는 최한의 정점과 픽셀 셰이더는 모두 지원하고 있다. \n\n<html> <span style="font-size: 14px; "> <b> 어떤 방식으로 실행되나? </b> </span> </html>\n(p.260) 셰이더를 사용한 스텐실 그림자 입체 적용의 일반적인 단계는 앞의 CPU에서의 실행... 마찬가지로 적용된다. 가장 큰 차이점은 윤곽 계산의 실행에 있다. \n셰이더를 이용한 스텐실 그림자 입체 적용에 대해서 이야기하려면, 실제로 윤관을 계산하는데 필요한 CPU의 부담을 GPU로 넘녀주는 과정을 알아야 한다. 이는 ''프로그램 안에서 오클루더의 윤곽을 실제로 계산하지 않는다는 의미인데, 그 대신에 GPU가 실행되는 정점 셰이더가 정점 셰이더가 적당히 전처리된 오클루더의 기하구조와 정점 셰이더 상수로 이 작업을 수행''하도록 한다.\n\n(p.261) 결론적으로, 그래픽 파이프라인에 공급된 정점 셰이더는 이런 방법으로 오클루더의 메쉬를 전처리하고, 그림자 입체로 변환한다.\n\n<html> <span style="font-size: 14px; "> <b> 데이터의 전처리 </b> </span> </html>\n(p.262) 현재의 프로그래밍이 가능한 그래픽 파이프라인은 새로운 정점 데이터를 생성하지 못한다(이러한 제한은 조만간 사라질 것이다). 따라서 새로운 데이터를 생성하지 않고, 어떻게든 원래의 기하구조 데이터를 전처리하는 것으로 이런 제한을 극복하여, 방향에 관계없이 그림자 업체를 만들 수 있게 해야 한다.\n\n(p.263) 그림자 입체에 셰이더를 적용하기 위해 기하구조를 전처리하면서 발생하는 가장 큰 문제는 전처리 과정에서 생기는 수많은 정점들이다. 일반적으로 최종적으로 전처리된 메쉬는 원래의 메쉬에 비해 3배 이상의 정점들을 가지고 있다. 이는 그림자 입체를 렌더링하는 GPU의 정점 처리량을 확장한다하더라도, 그림자 입체의 셰이더 적용에 있어서 심각한 문제이다.\n\n... 두 면이 같은 방향으로 평행이 가까운 법선을 가지고 있다면, 공유된 변은 동일한 평면 위에서 존재하고, 윤곽의 일부가 되기 힘들다. 사실, 법선이 정확하게 평행하다면, 윤곽의 일부가 되는 것이 불가능하다. 따라서 윤곽의 일부가 될 수 있는지는 두 법선의 간단한 내적을 구하는 것으로 충분히 확인할 수 있다. 내적의 결과가 1.0이라면, 그 변은 윤곽선이 되는 것이 불가능하기 때문에, 계산에 포함되지 않는다.\n\n(p.264) 이런 전처리 과정의 목적은 처리 속도의 향상이 아니라, 최종 기하구조의 수를 최소화하는 데 있다는 것이다. 사실, 전처리 과정은 전적으로 오프라인으로 수행되어야 한다.\n\n<html> <span style="font-size: 14px; "> <b> 셰이더에서 그림자 입체 만들기 </b> </span> </html>\n<html> <span style="font-size: 14px; "> <b> 정점 셰이더에서 실행하기(FiniteGPU) </b> </span> </html>\n<html> <span style="font-size: 14px; "> <b> 정점 셰이더에서 실행하기(InfiniteGPU) </b> </span> </html>\n\n<html> <span style="font-size: 14px; "> <b> 셰이더 방식이 더 좋은가? </b> </span> </html>\n(p.275) 또 다른 유의 사항은 그림자를 생성하는 광원의 수가 많아지면 비효율성이 확대된다는 점이다. \n\n마지막으로 그림자 입체를 실행하기 위해 셰이더를 사용하는 이유 중 하나는 ''메모리 요구량이 동적인 그림자 입체를 CPU에 적용했을 때에 비해 거의 변하지 않는다''는 점이다. \n오클루더의 윤곽은 시점에서의 각에 따라 매우 다르게 보이므로 전체적인 기하구조의 수에 직접적인 영향을 미친다. 또 초기에 할당된 메모리가 너무 적다면 새로운 윤곽선 정보를 담기 위해 메모리의 재할당이 필요하다.\nGPU에서는 어떤 각도에서도 그림자 입체를 생성하기 위해서 정적ㆍ정점 버퍼에 미리 고정된 수(필요한 모든 정점들이 포함된)로 전처리시킨 그림자 입체의 기하구조를 저장하기 때문에 이런 문제로 고민할 필요가 없다.\n\n인공지능, 물리, 네트워크, 입력, 스크립트, 다른 연산의 관리 등과 같은 CPU의 작업이 필요한 상황에서 그림자 입체를 구현하는 데 GPU를 이용하면 효율 면에서 큰 도움이 된다.\n\n\n<html> <span style="font-size: 14px; "> <b> #. DirectX 9 HLSL 샘플 </b> </span> </html>\n\n(p.276) HLSL 샘플은 최신의 기법이 적용된 두 개의 예제가 포함되었는데, 이 두 예제는 FiniteHLSL과 InfiniteHLSL이다. 전자는 앞에서 다루었던 FiniteGPU와 유사한 유한 그림자 입체 돌출의 적용이며, 후자는 InfiniteGPU와 같은 무한 그림자 입체 돌출의 적용이다.\n\nDirectX 9에서는 Direct3D API가 양면 스텐실 작업을 지원한다. 앞서 설명했던 depth-pass와 depth-fail 스텐실 작업을 위해, 앞면과 후면을 위한 두 가지 패스로, 그림자 입체를 그려야 한다. 각각의 패스를 시작하기에 앞서, 앞면과 후면을 렌더링할 때에는 다른 종류의 스텐실 작업이 필요하기 때문에, 스텐실 작업의 변환이 필요하다.\nGPU가 정점을 처리할 때, 특별히 변형된 그림자 입체의 기하구조를 렌더링하기 위해서는 2개의 패스가 필요하다... 양면 스텐실 모드는 다른 스텐실 작업을 이용하여, 앞면과 뒷면을 개별적으로 렌더링하여, 스텐실 버퍼 값이 정확하게 채워졌는지 확인해준다.\n\n(p.277) 새로운 렌더링 스테이트를 나타내면 ''D3DRS_TWOSTENCILMODE''는 양면 스텐실 기법을 활성화하기 위해서 ''true''로 설정된다. 기본 값은 false이다.\n\n(p.279) 양면 스텐실 기법이 대부분의 그래픽 카드에서 지원하는 기본 기능은 아니다. 따라서 프로그램을 시작할 때, 양면 스텐실 기법을 활용하기 위해서는 그래픽 하드웨어의 지원 유무를 확인해야 한다. DirectX9에 추가된 D3DSTENCILCAPS_TWOSIDED Capability check로 새로운 스텐실 모드 지원 여부를 확인할 수 있다. HLSL 샘플에서는 이전의 단면 스텐실 모드와 양면 스텐실 모드를 모두 구현한 다음 양면 모드가 가능하면 이용할 수 있도록 되어 있다.\n\n\n<html> <span style="font-size: 14px; "> <b> #. 효율과 견고함 </b> </span> </html>\n\n<html> <span style="font-size: 14px; "> <b> 많은 것을 위해 적게 사용하라 </b> </span> </html>\n(p.280) 스텐실 그림자 입체를 실행하면, 복잡한 윤곽 계산이나 보이지 않는 부분의 계산 등 2가지의 병목 현상을 보인다. 성능을 개선하는 많은 방법들은 보통 이 두 가지의 병목 현상을 최소화하는 데 초점을 맞추고 있다.\n\n그림자 입체를 계산할 대 사용하는 원본 데이터를 줄이면 CPU와 GPU에서 좀 더 빠르게 실행할 수 있다. 대부분의 경우에는 그림자 입체를 계산하기 위한 오클루더에 적은 수의 폴리곤을 쓰는 것만으로도 충분하다. Direct3D 사용 시 필요한 원본 데이터를 밀착된 메쉬로 사용할 것을 권장한다.\n\n(p.281) 다음으로, 만들어진 목록 안의 폴리곤들을 뒤에서 앞의 순서로 정렬한다. 이 목록의 모든 폴리곤마다 광원의 위치와 각 면의 변을 이용한 작은 절두체가 만들어진다. 여기서 각 면 자체는 4번째 절단면으로 쓰인다. 이 절두체로 자신에게 가려지는 폴리곤들을 찾아서 버린다. 재귀적으로 단계를 반복해서 겹친(overlapping) 앞면들이 제거된 앞면 덮개를 만들 수 있다. 면을 정리하고 불필요한 정점들을 없애서 앞쪽의 덮개를 좀 더 최적화할 수 있다.\n\n<html> <span style="font-size: 14px; "> <b> 가능한 한 편법을 사용하라 </b> </span> </html>\n(p.281) 다음 영역으로 실시간으로 윤곽을 계산하는 알고리즘의 최적화를 들 수 있겠다.\n\n(p.282) 최적화할 때에는 잘못된 영역을 계산하여 전체 부하 중 극히 미비한 부분을 차지하는 곳에 시간을 투자하는 일이 벌어지지 않도록 경계해야 할 것이다. \n\n<html> <span style="font-size: 14px; "> <b> 보이지 않는 영역의 계산 </b> </span> </html>\n(p.282) 그림자 입체의 경로를 렌더링하기 위해서 필요한 보이지 않는 fillrate의 계산을 줄이는 것 역시 문제가 된다. 그림자 입체를 렌더링하기에 앞서 Direct3D에서 D3DRS_COLORWRITEENABLE을 설정하여 계산을 줄일 수 있다. 지금의 단계에서는 색상 정보는 필요하지 않고, 스텐실 버퍼를 채우는 것만 필요하기 때문에, 붉은색, 녹색, 푸른색, 알파 채널 그리기의 사용을 제한하기 위하여 이를 사용한다.\n\n문제를 쉽게 만드는 또 다른 방법은 같은 프레임에서는 스텐실 버퍼의 데이터를 재사용하는 것이다. 프레임 버퍼의 픽셀에 그림자를 드리우기 위한 fillrate를 초래하지만, 그 과정에서 스텐실 버퍼를 저장해야 한다.\n\n<html> <span style="font-size: 14px; "> <b> 안쪽과 바깥쪽의 장면 관리 </b> </span> </html>\n(p.283) 가장 중요한 원칙은 어떤 시점에서도 그림자를 생성하는 광원은 한 번에 최대로 4개 이상이 계산되면 안된다는 것이다... 광원 관리의 가장 중요한 점은, 어떤 광원이 그림자 입체 생성 과정에 포함이 되는지를 선택하는 것이다. 관찰자로부터의 거리와 집중도, 게임 플레이의 타당성과 가시적인 부분 등이 고려해야 할 부분이다.\n\n... 빛을 발하는 범위는 장면을 구성할 때 광원이 얼마나 영향을 끼치는지에 대한 좋은 척도이다.\n\n(p.284) 장면 관리를 요약하면 @@color(#FF0000): 광원을 선택하고 오클루더를 컬링하는 것이다.@@ 장면 관리에 있어서 중요한 부분은 레벨 기획자와 디자이너가 기존에 높여진 그림자 입체의 적용과 타협하거나 이를 깨지 않고, 어떤 조명을 설정하고 어디에 위치할 것인가를 결정하는 것이다. 그렇기 때문에 정면을 만들기에 앞서 레벨 기획자와 디자이너는 그래픽 엔진에 의해 만들어지는 기존 조명의 선택 원칙을 이해하고 있어야 한다.\n\n또다른 장면 관리 기법은 오클루더와 광원 사이의 관계를 명시하고, 가능한 한 이 정보를 장면 계층 안에 내장하는 것이다. 광원에 대한 기하구조의 운동 거동과 관계에 따른 표식을 붙이는 것은 그림자 입체의 실행을 빠르게 하는 좋은 방법이다.\n\n다음으로 중요한 점은 그림자 입체는 닫힌 공간 메쉬를 필요로 한다는 것이다. 앞서 이야기했던 것처럼, 메쉬 안의 어떠한 틈이난 공간은 스텐실 카운팅을 방해하여 그림자 입체를 적용할 수 없게 하는 요소들이다. 이것 때문에 모델러들이나 기획자들은 작업 방법과 모델링 형태를 바꾸어야 하는 것이다.\n\n<html> <span style="font-size: 14px; "> <b> 언제나 효과적인 전환을 하라 </b> </span> </html>\n(p.285) 견고한 동작을 위해서 일반적으로 depth-fail 알고리즘을 이용한다. 하지만 __카메라가 그림자 입체 안에 없다고 확신할 경우에는 더 빠른 depth-pass 기법으로 전환할 수 있다.__ ''근면 공간''을 만들면 오클루더와 간섭되는지를 쉽게 확인할 수 있다.\n\n<html> <span style="font-size: 14px; "> <b> 혼합과 배치 </b> </span> </html>\n\n\n<html> <span style="font-size: 14px; "> <b> #. 결론 </b> </span> </html>\n<html> <span style="font-size: 14px; "> <b> #. 참고 자료 </b> </span> </html>\n\n▷ [[도서_ShaderX² : DirectX 9 셰이더 프로그래밍]]
◇ Natalya Tatarchuk\n\n<html> <span style="font-size: 14px; "> <b> #. 소개 </b> </span> </html>\n\n(p.290) 비록 어셈블리나 고수준 셰이딩 언어로 코드를 짜는 것이 셰이더 개발 과정의 핵심이지만, 셰이더는 단순한 코드 그 이상이다. 셰이더 기반 효과들을 캡슐화하는 것은 복잡한 작업으로, 이는 이런 효과들을 렌더링하는 데 관련된 시스템의 전체 상태를 캡쳐하는 작업을 필요로 하기 때문이다. 이것으로 인해 셰이더 개발자들 사이에 현존하는 일반적인 문제가 있는데, 셰이더를 교환하고 공유하는 것이 간단한 작업이 아니라는 것이다.\n\n많은 게임 개발자들이 셰이더 개발을 시작할 때 마주치는 다른 문제는 개발 과정에서 아티스트와 밀접하게 연관될 필요가 있다는 것이다. 아티스트에게 편한 도구 없이 효과 제작을 함께 하는 것이 어렵다. 필요한 것은 프로그래머뿐만이 아니라 아티스트와 게임 디자이너도 함께 셰이더를 사용하여 압도적인 특수 효과를 개발할 수 있는 작업 환경이다.\n\n\n<html> <span style="font-size: 14px; "> <b> #. IDE 개괄 </b> </span> </html>\n\n(p.291) 렌더몽키 응용프로그램 인터페이스는 마이크로소프트 비주얼 스튜디오 같은 IDE를 사용해온 개발자라면 누구라도 직관적으로 알 수 있도록 설계되어 있다.\n\nRenderMonkey™ Toolsuite - http://developer.amd.com/tools-and-sdks/archive/games-cgi/rendermonkey-toolsuite/\n현재 RenderMonkey™ 1.82 (94.6MB) / Launch Date ; 12/18/2008\n\n\n<html> <span style="font-size: 14px; "> <b> #. 기본 조명 효과 제작 </b> </span> </html>\n\n<html> <span style="font-size: 14px; "> <b> #. 실행 시간 데이터베이스 개괄 </b> </span> </html>\n\n(p.294) 개개의 렌더몽키 시각 효과 조합들은 ''하나의 단일한 XML 작업 공간으로 캡슐화''한다. 개개의 효과를 다시 만드는 데 필요한 모든 정보 중 실제 텍스처와 모델 데이터를 빼고는 모두 이 하나의 XML 파일에 저장된다. \n\n(p.295) 렌더몽키 효과 작업 공간의 모든 개개의 요소들은 ''노드''라고 부른다.\n\n<html> <span style="font-size: 14px; "> <b> 작업 공간 뷰 </b> </span> </html>\n(p.295) 효과 작업 공간 안의 메인 창은 작업 공간 뷰 창이다.\n\n(p.296) 작업 공간 트리 뷰에는 2개의 탭이 있다(Effect 탭과 Art 탭).\n''Effect 탭''은 모든 변수와 보이는 패스들을 가진 전체 작업 공간을 보는 데 사용한다.\n''Art 탭''은 작업 공간에 존재하는 아티스트 편집 가능 변수만을 보여준다.\n효과는 프로그래머가 Effect 탭을 사용하여 효과가 만들어지고 나면, 아티스트에게 넘겨주게 되고 아티스트는 Art 탭을 선택하여 원하는 대로 데이터를 보면서 편집하게 된다.\n\n<html> <span style="font-size: 14px; "> <b> 변수 생성과 관리 </b> </span> </html>\n\n<html> <span style="font-size: 14px; "> <b> 미리 정의된 렌더몽키 변수들 </b> </span> </html>\n(p.299) 다음은 편의를 위해서 렌더몽키에서 제공하는 미리 정의된 변수들의 모음이다.\n\n▣ view_proj_matrix : 행렬형 변수, 시야-투영 행렬을 값으로 가진다.\n▣ view_matrix : 행렬형 변수, 시야 행렬을 값으로 가진다.\n▣ inv_view_matrix : 행렬형 변수, 시야-투영 행렬의 역행렬을 값으로 가진다.\n▣ proj_matrix : 행렬형 변수, 투영 행렬을 값으로 가진다.\n▣ time : 벡터형 변수, 순환되는 현재의 시간 값을 제공하는데 이 순환 주기는 기본적으로 120으로 설정되어 있고, 렌더몽키 환경 대화상자에서 수정할 수 있다.\n▣ cos_time : 벡터형 변수, 시간의 코사인 값을 제공한다.\n▣ sin_time : 벡터형 변수, 시간의 사인 값을 제공한다.\n▣ tan_time : 벡터형 변수, 시간의 탄젠트 값을 제공한다.\n\n<html> <span style="font-size: 14px; "> <b> 스트림 매핑 모듈 </b> </span> </html>\n(p.301) __올바른 조명 결과를 계산하기 위해서는, 정점 셰이더 입력으로 정점 위치만큼이나 정점 법선도 필요하다는 것은 이미 알고 있을 것이다.__\n... 법선 채널에서는 변수형을 FLOAT3으로 설정하는 것을 잊으면 안 된다.\n\n<html> <span style="font-size: 14px; "> <b> 모델 관리 </b> </span> </html>\n(p.303) 모든 시각 효과의 중요한 면 중 하나는 화면에 렌더링되는 실제 지오메트리이다. 렌더몽키는 모델과 모델 레퍼런스 노드를 사용해서 사용자가 각각의 그리기 호출에서 어떤 지오메트리를 렌더링할지를 명시할 수 있도록 해준다.\n \n(p.304) 실제로 데이터를 스트림에서 셰이더로 연관시키기 위해서, 렌더몽키는 스트림 맵과 모델 데이터 노드를 짝 짓는다. 이것은 필요한 데이터가 실행 시에 존재한다는 것을 확실히 하기 위해서 개개의 패스에 두 레퍼런스 모두를 추가하고 그것을 스트림 소스와 연관 시킴으로서 이루어진다.\n\n<html> <span style="font-size: 14px; "> <b> 효과 관리 </b> </span> </html>\n(p.304) 효과를 하과자 하는 주 작업은 어떤 효과인지 확인하는 것이다. 이를 위해서는, 렌더하기 원하는 효과를 활성 효과로 만들어야 한다... 이는, 원하는 효과에 오른 클릭을 하고 메뉴 옵션에서 ''Set as Active Effect''를 선택하면 된다.\n\n\n<html> <span style="font-size: 14px; "> <b> #. 픽셀과 정점 셰이더들 </b> </span> </html>\n\n(p.305) 렌더몽키는 어셈블리와 HLSL 셰이더를 IDE에서 모두 지원한다. \n\n(p.306) 렌더몽키는 자동적으로 각 셰이더 버전에 맞는 셰이더 편집기를 선택해준다. 주의할 점은 하나의 독립된 패스에 대해서 각각 하나의 정점과 픽셀 셰이더를 가질 수 있다는 것이다. 만약 셰이더 유형을 바꾸기 원한다면 (예를 들어, 어셈블리 셰이더를 HLSL 셰이더로 교체한다면), 먼저 예전 셰이더를 지우고 그 자리에 새로운 셰이더를 추가해야 한다.\n\n<html> <span style="font-size: 14px; "> <b> 셰이더 편집하기 </b> </span> </html>\n\n<html> <span style="font-size: 14px; "> <b> 정점 셰이더 설정과 편집 </b> </span> </html>\n(p.308) 패스 1의 정점 셰이더에 몇 가지 코드를 추가해보자. 아래는 우리가 추가할 코드 목록이다.\n+++[이것은 퐁 조명을 계산하는 정점 셰이더이다. ]\n{{{\nfloat4x4 view_matrix;\nfloat4x4 view_proj_matrix;\nfloat4 lightDir;\n\nstruct VS_INPUT \n{\n float4 inPos : POSITION;\n float3 inNorm : NORMAL;\n float3 inTex : TEXCOORD0;\n};\n\nstruct VS_OUTPUT \n{\n float4 Pos : POSITION;\n float3 Norm : TEXCOORD0;\n float3 View : TEXCOORD1;\n float3 Light : TEXCOORD2;\n float2 Tex : TEXCOORD3;\n};\n\nVS_OUTPUT main( VS_INPUT Input )\n{\n VS_OUTPUT Out = (VS_OUTPUT) 0;\n\n // 변환된 위치를 출력:\n Out.Pos = mul( view_proj_matrix, Input.inPos );\n \n // 빛 벡터를 출력:\n Out.Light = -lightDir;\n \n // 시야 공간에서의 위치 계산:\n float3 Pview = mul( view_matrix, Input.inPos);\n \n // 입력 법선을 시야 공간으로 변환:\n Out.Norm = normalize( mul( view_matrix, Input.inNorm ) );\n \n // 시야 공간에서 시선 방향 계산:\n Out.View = - normalize( Pview );\n \n // 텍스처 좌표를 픽셀 셰이더에 전달:\n Out.Tex = inTex;\n\n return Out;\n}\n}}}\n===\n\ncf. 책의 예제는 RenderMonkey 1.5로 작성되었고, (현재 버전) RenderMonkey 1.82의 변경된 규칙에 맞춰 수정.\n\n<html> <span style="font-size: 14px; "> <b> 셰이더 컴파일하기 </b> </span> </html>\n(p.311) Commit Changes 버튼을 메인 도구 바에서 클릭하면 된다. 또한 단축키(F7)를 사용해서 셰이더 컴파일을 시작할 수도 있다. Commit Changes는 작업 공간 안의 모든 수정된 셰이더를 컴파일해서 출력 창에 컴파일 결과를 출력한다.\n\n<html> <span style="font-size: 14px; "> <b> 출력 창 </b> </span> </html>\n<html> <span style="font-size: 14px; "> <b> 셰이더 어셈블리 혹은 컴파일 에러 </b> </span> </html>\n<html> <span style="font-size: 14px; "> <b> 어셈블리 편집하기 </b> </span> </html>\n<html> <span style="font-size: 14px; "> <b> 픽셀 셰이더 설정과 편집 </b> </span> </html>\n(p.315) 조명 결과를 위해서 다음의 매개변수들을 사용해야 한다는 것을 알 수 있다.\n\n▣ Ka, Kd, Ks : 각각 주변, 분산, 반영광에 기여하는 계수\n▣ Ia : 주변광 강도\n▣ Id : 우리가 시뮬레이션하는 점 광원의 분산광에 기여한다.\n▣ Is : 우리가 시뮬레이션하는 점 광원의 반영광에 기여한다.\n▣ Ns : 반영-반사 매개변수, 시야와 반사 벡터 사이의 각 Φ에 비례한다.\n+++[픽셀 셰이드 ]\n{{{\nfloat Ka;\nfloat Kd;\nfloat Ks;\nfloat Ns;\nfloat4 Ia;\nfloat4 Id;\nfloat4 Is;\nsampler2D baseMap; // 텍스처 맵을 사용하기 위해 설정\n\nfloat4 ps_main( \n float4 Diff : COLOR0,\n float3 Normal : TEXCOORD0,\n float3 View : TEXCOORD1,\n float3 Light : TEXCOORD2,\n float2 Tex : TEXCOORD3\n ) : COLOR0\n{\n // 반사 벡터 계산:\n float3 vReflect = normalize( 2 * dot( Normal, Light) * Normal - Light );\n \n // 주변(anbient) 하 계산:\n float4 AnbientColor = Ia * Ka;\n \n // 분산(diffuse) 항 계산:\n float4 DiffuseColor = Id * Kd * max( 0, dot( Normal, Light) );\n \n // 반영(specular) 항 계산:\n float4 SpecularColor = Is *Ks * pow( max( 0, dot( vReflect, View ) ), Ns );\n\n float4 FinalColor = \n (AnbientColor + DiffuseColor) * tex2D( baseMap, Tex ) + SpecularColor; \n \n return FinalColor;\n}\n}}}\n===\n<br>\n<html> <span style="font-size: 14px; "> <b> 미리보기 창 </b> </span> </html>\n<html> <span style="font-size: 14px; "> <b> 변수 편집하기 </b> </span> </html>\n\n\n<html> <span style="font-size: 14px; "> <b> #. 렌더 스테이트 블록 관리 </b> </span> </html>\n\n<html> <span style="font-size: 14px; "> <b> #. 렌더몽키에서의 텍스처링 </b> </span> </html>\n\n<html> <span style="font-size: 14px; "> <b> 텍스처 오브젝트 </b> </span> </html>\n\n<html> <span style="font-size: 14px; "> <b> HLSL 셰이더로 텍스처 사용하기 </b> </span> </html>\n(p.329) 실제로 픽셀 셰이더에서 텍스처 맵을 사용하기 위해서는, 우선 픽셀 셰이더에 샘플러(sampler2D)를 추가해야 한다... 샘플러를 추가하기 위해서는 반드시 유효한 텍스처 오브젝트를 가진 텍스처 레퍼런스가 있어야 한다. \n\n\n<html> <span style="font-size: 14px; "> <b> #. 텍스처에 렌더링하기 </b> </span> </html>\n\n<html> <span style="font-size: 14px; "> <b> 렌더 패스 </b> </span> </html>\n(p.331) 가장 간단한 텍스처에 렌더링하는 효과 작성을 시작하기 위해서, 적어도 두 개의 패스가 필요하다.\n\n<html> <span style="font-size: 14px; "> <b> 렌더 가능한 텍스처 지원 </b> </span> </html>\n\n\n<html> <span style="font-size: 14px; "> <b> #. 렌더 가능한 텍스처 편집 </b> </span> </html>\n\n<html> <span style="font-size: 14px; "> <b> #. 렌더 타겟 편집하기 </b> </span> </html>\n\n<html> <span style="font-size: 14px; "> <b> 아티스트 편집기 (Artist Editor) </b> </span> </html>\n(p.338) 아티스트 편집기 창은 artist-editable 변수들을 포함하고 있는 각각의 효과 작업 공간, 효과 그룹, 효과 혹은 패스에 대해서 탭을 가지고 있다. 만약 노드가 지원되는 유형의 atrist-editable 변수를 하나도 포함하고 있지 않다면, 아티스트 편집기에는 탭이 나타나지 않을 것이다.\n\n<html> <span style="font-size: 14px; "> <b> 아티스트 편집 모듈에서 변수 편집 </b> </span> </html>\n\n\n<html> <span style="font-size: 14px; "> <b> #. 요약 </b> </span> </html>\n\n\n▷ [[도서_ShaderX² : DirectX 9 셰이더 프로그래밍]]
+++[▷ Identify the Pixel Shader version of your graphics card ]\n!!! Intro\nGames will be compatible depending on the version of Pixel Shader implemented in your graphics card. \nTherefore it is important to determine the limits of your graphics system. \n\n''A Pixel Shader is a graphics function that calculates effects on a pixel level.''\nDepending on the desired resolution, several million extra pixels may be necessary to achieve what is required. This takes a lot of computing power. \n\nHere are the different versions of Pixel Shader with the Direct X version corresponding to the two leading manufacturers, ATI and nVidia, and also for the integrated chips from Intel (although their capacity for gaming is limited): \n<<<\n''Pixel Shader 1.0/1.1 (DX 8.0)''\nnVidia GeForce 3 series \n\n''Pixel Shader 1.3 (DX 8.0a)''\nnVidia GeForce 4 Ti/ 4200 Go series \n\n''Pixel Shader 1.4 (DX 8.1)''\nATI Radeon 8500-9250 series \n\n''Pixel Shader 2.0 (DX 9.0)''\nATI Radeon 9500-9800, X300-X600 series \nIntel GMA 900/950/3000/3100 series \n\n''Pixel Shader 2.0a (DX 9.0a)''\nnVidia GeForce FX 5000 series \n\n''Pixel Shader 2.0b (DX 9.0b)''\nATI Radeon X700-X850 series \n\n''Pixel Shader 3.0 (DX 9.0c)''\nATI Radeon X1300-X1950, nVidiaGeForce 6 et 7, Intel GMA X3000 series \n\n''Pixel Shader 4.0 (DX 10)''\nATI Radeon X2400-X2900, nVidia GeForce 8 et 9 and GT200, Intel GMA X3100, X3500, X4500 series \n\n''Pixel Shader 4.1 (DX 10.1)''\nATI Radeon HD 3000-4000 series and Nvidia GT 300, GT 220, GT 240 series \n\n''Pixel Shader 5.0 (DX 11)''\nATI HD 5000/,6000 nVidia GT400 and GT500 series \n<<<\n===\n\n\n++++[▷ Table A-6 Pixel Shader 1.1-1.4 Textur Assembly Instructions ]\n출처 ; The Complete Effect and HLSL Guide (책)\n|!Name |!Description |!Slots |!1.1 |!1.2 |!1.3 |!1.4 |\n|tex |Sample a texture. |1 |!x |!x |!x | |\n|texbem |Apply a fake bump environment-map. |1 |!x |!x |!x | |\n|texbeml |Apply a fake bump environment-map transform with lumminance corrction. |2 |!x |!x |!x | |\n|texcoord |Interpret texture coordinate date as color data. |1 |!x |!x |!x | |\n|texcrd |Copy texture coordinate data as color data. |1 | |!x | |!x |\n|texdepth |Calculates depth values. |1 | |!x | |!x |\n|texdp3 |Three-component dot product between texture data and the texture coordinates. |1 | |!x |!x | |\n|texdp3tex |Three-component dot product and 1-D texture lookip. |1 | |!x |!x | |\n|texkill |Cancels rendering of pixels based on a comparison. |1 |!x |!x |!x |!x |\n|texld |Sample a texture. |1 | | | |!x |\n|texm3x2depth |Calculates per-pixel depth values. |1 | | |!x | |\n|texm3x2pad |First row matrix multiply of a two-row matrix multiply. |1 |!x |!x |!x | |\n|texm3x2tex |Final row matrix multiply or a two-row matrix multiply. |1 |!x |!x |!x | |\n|texm3x3 |3x3 matrix multiply. |1 | |!x |!x | |\n|texm3x3pad |First or second row multiply of a three-row matrix multiply. |1 |!x |!x |!x | |\n|texm3x3spec |Final row multiply of a three-row matrix multiply. |1 |!x |!x |!x | |\n|texm3x3tex |Texture look up using a 3x3 matrix. |1 |!x |!x |!x | |\n|texm3x3vspec |Texture look up using a 3x3 matrix multiply, with non-constant eye-ray vector. |1 |!x |!x |!x | |\n|texreg2ar |Sample a texture using the alpha and red components. |1 |!x |!x |!x | |\n|texreg2gr |Sample a texture using the gb components. |1 |!x |!x |!x | |\n|texreg2rgb |Sample a texture using the rgb components. |1 | |!x |!x | |\n===\n\n* texm3x3vspec 검색 ; PS 2.0으로 수정 시 texture 명령어에 대한 코드 수정이 필요\n** http://www.forum-3dcenter.org/vbulletin/archive/index.php/t-44943.html - ps 1.1 -> ps 1.4 - brauch da mal Hilfe\n** http://attila.ac.upc.edu/wiki/index.php/D3D_ASM_shaders_translation\n** https://msdn.microsoft.com/en-us/library/windows/desktop/bb206229(v=vs.85).aspx\n** https://swiftshader.googlesource.com/SwiftShader/+/HEAD/src/Shader/PixelPipeline.cpp\n\n+++[▷ 픽셀 셰이더의 각 버전간의 차이점은 다음과 같다. ]\n출처 ; http://telnet.or.kr/directx/graphics/reference/shaders/pixelshaderdifferences.htm\n\n|!버전 |!최대 명령수 |\n| 1_x 버전 |1_1 에서는 8 |\n|~|버전 1_2 및 1_3 에서는 12 |\n|~|버전 1_4 에서는 14 |\n|2_0 |64 산술 명령 및 32 텍스처 명령 |\n|2_0 확장 |최대 512 |\n|3_0 |1024 |\n\n!!! 새 기능\n각 버전의 새 기능에는, 다음의 것이 있다. \n\n!!! 버전 3_0\n* 정적 flow control 명령 :call, callnz, else, end, endif, endloop, endrep, if, label, loop, rep, ret\n* 정적 flow control의 네스트의 깊이\n* 임시 레지스터의 수\n* 동적 flow control 명령 :break, breakc, ifc\n*프레디케이션 :setp 명령, p# 레지스터\n새로운 레지스터 :정수 정수, 정수 불리언 값, 루프 카운터, 프레디케이션\n\n새로운 수식자 :임의의 교체\n\n!!! 버전 2_0 확장\n* 새로운 정적 flow control 명령 (능력의 설정이 필요) :call, callnz, else, end, endif, endloop, endrep, if, label, loop, rep, ret\n* 정적 flow control의 네스트의 깊이\n* 임시 레지스터의 수\n* 동적 flow control 명령 :break, breakc, ifc\n* 그라데이션 명령 :dsx 와 dsy\n* 텍스처 명령 :texldd\n* 프레디케이션 - setp 명령, p# 레지스터\n새로운 레지스터 :정수 정수, 정수 불리언 값, 루프 카운터, 프레디케이션\n\n새로운 수식자 (능력의 설정이 필요) :임의의 교체\n\n!!! 버전 2_0\n새로운 명령\n\n* 셋업 명령 :def, ps\n* 산술 명령 :add, cmp, cnd, dp3, dp4, lrp, mad, mov, mul, nop, sub\n* 매크로 :exp, frc, log, m3x2, m3x3, m3x4, m4x3, m4x4\n* 텍스처 명령 :\n** 추가 :texldb, texldp\n** 삭제 :tex, exbem, texbeml, texcoord, texcrd, texdepth, texdp3, texdp3tex, texm3x2depth, texm3x2pad, texm3x2tex, texm3x3, texm3x3pad, texm3x3tex, texm3x3spec, texm3x3vspec, texreg2ar, texreg2gb, texreg2rgb\n새로운 레지스터 :부동 소수점형 정수, 샘플러, 출력 컬러, 출력 깊이\n\n새로운 수식자 :정부의 반전, 부분 정밀도, 포화\n\n동시 실행 명령의 삭제\n\n!!! 버전 1_X\n새로운 명령\n\n* 셋업 명령 :def, ps\n* 산술 명령 :add, cmp, cnd, dp3, dp4, lrp, mad, mov, mul, nop, sub\n* 매크로 :exp, frc, log, m3x2, m3x3, m3x4, m4x3, m4x4\n* 텍스처 명령 :tex, texbem, texbeml, texcoord, texcrd, texdepth, texdp3, texdp3tex, texkill, texld, texm3x2depth, texm3x2pad, texm3x2tex, texm3x3, texm3x3pad, texm3x3tex, texm3x3spec, texm3x3vspec, texreg2ar, texreg2gb, texreg2rgb\n새로운 레지스터 :정수, 임시, 텍스처, 컬러\n\n새로운 수식자 :명령 수식자, 레지스터 수식자, 입력 레지스터 실렉터, 레지스터 쓰기 마스크\n===\n\n
<html> <a name="Page_PixelShader"> </a> </html>\n참고\nDirect3D ShaderX : 정점 & 픽셀 셰이더 팁과 트릭 \n도서_ShaderX² : DirectX 9 셰이더 프로그래밍\nhttps://msdn.microsoft.com/en-us/library/windows/desktop/bb173419(v=vs.85).aspx : frc_vs 검색\nhttps://msdn.microsoft.com/en-us/library/windows/desktop/bb204833(v=vs.85).aspx : cnd_ps 검색\n\n!Vertex shader 명령어\n|!Vertex shader versions |!1_1 |!2_0 |!2_x |!2_sw |!3_0 |!3_sw | !비 고 |\n|frc |x |X |x |x |x |x |소수점 이하 값 (0.0 ~ 1.0) |\n|mad |x |X |x |x |x |x |dest = (src1 * src2) + src3 |\n|max |x |X |x |x |x |x |dest = (src1 >= src2) ? src1 : src2 |\n|min |x |X |x |x |x |x |dest = (src1 < src2) ? src1 : src2 |\n|sge |x |X |x |x |x |x |dest = (src1 >= src2) ? 1 : 0 |\n|<html><a href="#slt"> #. slt</a></html> |x |X |x |x |x |x |dest = (src1 < src2) ? 1 : 0 |\n\n!Pixel Shader 명령어\n!!레지스터\n|!종류 | !이름 | !ps.1.1 | !ps.1.2 | !ps.1.3 | !ps.1.4 | !읽기/쓰기 여부 |\n|상수 레지스터 |cn |8 |8 |8 |8 |RO |\n|텍스처 레지스터 |tn |4 |4 |4 |6 |RW / ps.1.4: RO |\n|임시 레지스터 |rn |2 |2 |2 |6 |RW |\n|색 레지스터 |vn |2 |2 |2 |페이즈 2에서 2개 |RO |\n\n!!! 색 레지스터들 (ps.1.1-ps.1.4: v0+v1)\n(p.136) 색 레지스터들은 정점 당 색 값들을 담으며, 값의 범위는 0에서 1(포화됨)이다. 흔히 v0이 정점 분산색을 담고 v1이 반영색을 담는다.\n픽셀 셰이더의 입장에서 이 색 레지스터들은 읽기 전용이다. ps.1.4의 경우 색 레지스터들은 두번째 페이즈(이것이 기본 페이즈이다)에서만 사용할 수 있다. 그 외의 모든 레지스터들은 ps.1.4의 두 페이즈들 모두에서 사용 가능하다.\n\n\n<html> <a href="#Texture_Address_Instruction"> <b> 텍스처 어드레스 명령어 </b> </html>\n|!Pixel shader versions |!1_1 |!1_2 |!1_3 |!1_4 |!2_0 |!2_x |!2_sw |!3_0 |!3_sw | !비 고 |\n|<html><a href="#texm3x3pad"> #. texm3x3pad</a></html> |x |x |x | | | | | | |with texm3x3, texm3x3spec, texm3x3vspec, texm3x3tex |\n|<html><a href="#texm3x3spec"> #. texm3x3spec</a></html> |x |x |x | | | | | | | |\n|<html><a href="#texm3x3vspec"> #. texm3x3vspec</a></html> |x |x |x | | | | | | |cf. Local Viewer Reflection |\n\n<html> <a href="#Arithmetic_Iinstruction"> <b> 산술 명령어 </b> </html>\n|!Pixel shader versions |!1_1 |!1_2 |!1_3 |!1_4 |!2_0 |!2_x |!2_sw |!3_0 |!3_sw | !비 고 |\n|<html><a href="#cmp"> #. cmp </a></html> | |x |x |x |x |x |x |x | |src0 >= 0. 비교 |\n|<html><a href="#cnd"> #. cnd </a></html> |x |x |x |x | | | | | |src0 > 0.5 비교 (ps.1.1 >> ps.1.4 변경시 주의) |\n|<html><a href="#dp3"> #. dp3 </a></html> |x |x |x |x |x |x |x |x |x |3 성분 내적 |\n|<html><a href="#frc"> #. frc </a></html> | | | | |x |x |x |x |x |소수점 이하 값 (0.0 ~ 1.0) |\n|<html><a href="#mad"> #. mad </a></html> |x |x |x |x |x |x |x |x |x |dest = src0 * src1 + src2 |\n|#. mov |x |x |x |x |x |x |x |x |x | |\n|<html><a href="#mul"> #. mul </a></html> |x |x |x |x |x |x |x |x |x |dest = src0 * src1 |\n|#. sub |x |x |x |x |x |x |x |x |x |dest = src0 - src1 |\n-. mov ; 원본 레지스터의 내용을 대상 레지스터에 복사한다. mov를 사용할 때에는 mov보다 더 적합한 명령이 없는지 먼저 고민할 필요가 있다.\n\n<html> <a href="#Instruction_Modifiers"> <b> 명령 수정자들 (Instruction Modifiers) </b> </html>\n\n\n<html>\n<a href="#Page_PixelShader"> <span style="font-size: 16px;"> <b> Pixel Shader 명령어 </b> </span> </a> </html>\n\n<html> <a name="slt"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page_PixelShader"> <span style="font-size: 14px;"> <b> #. slt </b> </span> </a>\n</div> </html>\ndest = (src1 >= src2) ? 1 : 0\n조건문을 흉내내는 데 유용하다.\n ; r0 = (r1 >= r2) ? r3 : r4 ; (r1 >= r2) 이 참이면 1, 그렇지 않으면 0\nSEG r0, r1, r2\nADD r1, r3, -r4\n ; r0 = r0*(r3 - r4) + r4 = r0*r3 + (1 - r0)*r4\n ; 결과적으로는 r3과 r4의 극단들 사이의 LERP가 된다.\nMAD r0, r0, r1, r4\n\n\n<html> <a name="Texture_Address_Instruction"> </a>\n<br>\n<a href="#Page_PixelShader"> <span style="font-size: 16px;"> <b> 텍스처 어드레스 명령어 </b> </span> </a> </html>\n\n(p.144) 두 페이즈(phase)를 모두 사용하는 경우 산술 명령들과 텍스처 어드레스 명령 모두 해서 총 28개의 명령들을 사용할 수 있다. phase 명령이 지정되지 않으면 기본 페이즈인 페이즈 2에서 총 14개의 산술 및 어드레스 명령들을 사용할 수 있다.\n\n... 의존적 읽기란 이전에 픽셀 셰이더에서 계산된 텍스처 좌표를 이용해서 텍스처 맵으로부터 텍셀을 읽는 것이다.\n\n''ps.1.4 텍스처 어드레스 명령''\n(p.156) ps.1.4에서 텍셀이나 텍스처 좌표들을 사용하려면 먼저 texld나 texcrd로 로드해야 한다. 이 명령들은 텍셀 또는 텍스처 좌표들에 접근 할 수 있는 유일한 수단이다. texcrd로 텍스처 좌표들을 색 데이터로 변환한 후에는 모든 산술 명령어들로 텍스처 좌표(색 데이터)를 수정할 수 있다.\n\n(p.158) ps.1.4에는 단 네 개의 텍스처 어드레스 명령들만 존재한다. 그러나, 앞에서 이야기했듯이 텍스처 어드레스 정보를 산술 명령들로 조작할 수 있으므로 대단히 다양한 방식으로 텍스처 어드레싱 작업을 수행할 수 있다.\n...\n그렇다고 ps.1.4에서 의존적 읽기를 구현하는 것이 어려운 것은 아니다. 다음은 ps.1.4에서 가능한 의존적 읽기를 보여주는 두 가지 의사 코드이다.\n\n ; 전달 함수\ntexld ; 첫번째 텍스처를 로드\n ; 여기서 색 데이터를 수정\nphase\ntexld ; 수정된 색 데이터를 주소로 사용해서 두번째 텍스처를 추출\n\n또는 \n\ntexcrd ; 텍스처 좌표들을 로드\n ; 여기서 텍스처 좌표들을 수정\nphase\ntexld ; 수정된 어드레스로 텍스처를 추출\n\n이런 식으로 생각할 수도 있다. phase 이후의 texld 명령의 두번째 매개변수가 rn이라면 (tn이 아니라) 그것은 의존적 읽기인 것이다. 왜냐하면 텍스처 좌표들이 임시 레지스터 안에 있다는 것은 그것들이 이미 어딘가에서 계산되었음을 뜻하기 때문이다.\n\n.....\nphase\ntexld rn, rn\n\n이 예에서는 원본 레지스터에 rn이 있는데, 이는 phase 명령 이전에 rn이 이미 설정되어 있음을 뜻한다(만일 그렇지 않다면 셰이더는 실행을 실패한다).\n\ncf. @@color(#0000ff): 픽셀 셰이더는 두 단계(phase)로 수행된다. @@ \n첫 번째 phase1에서는 텍스처 샘플링과 텍스처 주소 연산에 관련된다.\n \n두 번째 phase2에서는 색 연산과 함께 종속적 텍스처 읽기가 허용된다.\n텍스처 값을 추출하고, 그 값을 주소명령 셰이더(adress shader)에서 변경하고, 그 변경된 값을 다른 텍스쳐의 값을 추출하기 위한 하나의 주소로 사용할 수 있는 능력은 픽셀 셰이더가 종속적 텍스쳐 읽기 라고 알려진 기능을 수행할 수 있게 하는 것이다. 그렇지만 지포스3에서는 단지 입방체 환경 범프 맵핑 도중의 하나의 특별한 경우로서만 종속적 텍스쳐 읽기가 지원된다.\n\n\n<html> <a name="texm3x3pad"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page_PixelShader"> <span style="font-size: 14px;"> <b> #. texm3x3pad </b> </span> </a>\n</div> </html>\n3x3 행렬의 첫번째 또는 두번째 행 곱하기를 수행한다. 이 명령은 자기 자신만으로는 쓰일 수 없으며 반드시 \ntexm3x3 이나 texm3x3spec, texm3x3vspec, texm3x3tex와 함께 쓰여야 한다.\n| !texm3x3pad|!d, S |\n| |d ← (Ud, Vd, Wd)ㆍ(Sr,Sg,Sb) |\n| !texm3x3|!d, S |\n| |U' = ( Ud−2, Vd−2, Wd−2 )ㆍ( Sr, Sg, Sb ) <br> V' = ( Ud−1 ,Vd−1, Wd−1 )ㆍ( Sr, Sg, Sb ) <br> W' = ( Ud, Vd, Wd )ㆍ( Sr, Sg, Sb ) <br> d ← ( U', V', W', 1) |\n| !texm3x3tex|!d, S |\n| |U' = ( Ud−2, Vd−2, Wd−2 )ㆍ( Sr, Sg, Sb ) <br> V' = ( Ud−1 ,Vd−1, Wd−1 )ㆍ( Sr, Sg, Sb ) <br> W' = ( Ud, Vd, Wd )ㆍ( Sr, Sg, Sb ) <br> d ← Td ( U', V', W' ) |\n| !texm3x3spec|!d, S0, S1 |\n| |U' = ( Ud−2, Vd−2, Wd−2 )ㆍ( S0r, S0g, S0b ) <br> V' = ( Ud−1 ,Vd−1, Wd−1 )ㆍ( S0r, S0g, S0b ) <br> W' = ( Ud, Vd, Wd )ㆍ( S0r, S0g, S0b ) <br> √n (벡터 n) = ( U', V', W' ) <br> ( U", V", W" ) = 2(√nㆍ√S1 )√n - (√nㆍ√n )√S1 cf. = 2 [(√nㆍ√S1 )/ (√nㆍ√n )]√n - √S1 <br> d ← Td ( U", V", W" ) |\n| !texm3x3vspec|!d, S0, S1 |\n| |U' = ( Ud−2, Vd−2, Wd−2 )ㆍ( S0r, S0g, S0b ) <br> V' = ( Ud−1 ,Vd−1, Wd−1 )ㆍ( S0r, S0g, S0b ) <br> W' = ( Ud, Vd, Wd )ㆍ( S0r, S0g, S0b ) <br> √n (벡터 n) = ( U', V', W' ) <br> √e = ( qd-2, qd-1, qd ) <br> ( U", V", W" ) = 2(√nㆍ√S1 )√n - (√nㆍ√n )√e cf. = 2 [(√nㆍ√S1 )/ (√nㆍ√n )]√n - √e <br> d ← Td ( U", V", W" ) |\n\n<html> <a name="texm3x3spec"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page_PixelShader"> <span style="font-size: 14px;"> <b> #. texm3x3spec </b> </span> </a> (매개변수 ; d, s1, s2)\n</div> </html>\n두 개의 texm3x3pad 명령들과 함께 3x3 행렬 곱하기를 수행한다. 결과로 생긴 벡터를 법선 벡터로 해서 s2의 상수레지스터에 담긴 시선 벡터를 반사시키고, 반사된 벡터를 텍스처 어드레스로 사용해서 d의 텍스처를 참조한다.\n\n반사 및 환경 매핑에 유용하다.\n\n<html> ---------------------------------------- </html>\nps.1.1\ntex t0 ; 법선 맵\ntexm3x3pad t1, t0 ; 행 #1로부터 u를 계산\ntexm3x3pad t2, t0 ; 행 #2로부터 v를 계산\ntexm3x3spec t3, t0, c0 ; 행 #3으로부터 w를 계산한다.\nmov r0, t3 ; 결과를 출력\n\n ; 반사된 벡터로 t3의 텍스처를 참조한다 (예, g_lpCubeEnvTexture).\n\n버덱스 정의와 textur 사용에 주의\ng_lpD3DDevice->SetTexture(0, g_lpMeshNormalTexture);\ng_lpD3DDevice->SetTexture(1, NULL);\ng_lpD3DDevice->SetTexture(2, NULL);\ng_lpD3DDevice->SetTexture(3, g_lpCubeEnvTexture);\n\n<html> ---------------------------------------- </html>\n ; 다음은 위와 매우 비슷한 효과를 내는 ps.1.4 픽셀 셰이더이다.\n ; 시선 벡터는 입방체 맵에 정규화된 벡터로 저장된다.\nps.1.4 \ntexld r0, t0 ; 법선 맵을 참조한다.\ntexld r1, t4 ; 정규화 입방체 맵으로부터 시선 벡터를 얻는다.\n\ntexcrd r4.rgb, t1 ; 환경 행렬의 첫번째 행\ntexcrd r2.rgb, t2 ; 환경 행렬의 두번째 행 \ntexcrd r3.rgb, t3 ; 환경 행렬의 세번째 행 \n \ndp3 r4.r, r4, r0_bx2 ; 행렬의 첫번째 행 곱하기 \ndp3 r4.g, r2, r0_bx2 ; 행렬의 두번째 행 곱하기\ndp3 r4.b, r3, r0_bx2 ; 행렬의 세번째 행 곱하기 \ndp3 r5, r4, r1_bx2 ; 법선과 시선 벡터의 내적 \nmov r0, r5\n\ncf. 주의할 점은 _bx2 수정자를 사용해서 법선을 (-1...1) 범위로 만든다는 것이다. 다음으로 시선 반사 벡터를 계산한다.\n\n\n<html> <a name="texm3x3vspec"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page_PixelShader"> <span style="font-size: 14px;"> <b> #. texm3x3vspec </b> </span> </a> (매개변수 ; d, s) cf. Local Viewer Reflection \n</div> </html>\n두 개의 texm3x3pad 명령과 함께 3x3 행렬 곱하기를 수행한다.\n그 결과로 생긴 벡터는 시선 벡터를 반사시키기 위한 법선 벡터로 쓰이며, 반사된 벡터는 텍스처 참조를 위한 텍스처 주소로 쓰인다.\n이는 texm3x3spec과 비슷하나, 세 개의 4D 텍스처 좌표 집합들의 q 좌표들로부터 시선 벡터를 취한다는 점이 다르다.\n이 3x3 행렬은 렌더링되는 표면의 정확한 접선 공간의 법선 벡터의 방향을 설정하는데 유용하게 쓰인다. 이 3x3 행렬은 세번째 텍스처 단계의 텍스처 좌표들과 이전의 두 텍스처 단계의 결과물로 구성된다. 이전의 두 텍스처 단계들에 배정된 모든 텍스처들은 무시된다.\n이 명령은 시선 벡터가 고정되어 있지 않은 상황에서의 반영 반사나 환경 매핑에 유용하게 쓰일 수 있다.\n\n<html> ---------------------------------------- </html>\n ; (t1)은 3x3 행렬의 행 #1을 담고 있다.\n ; (t2)은 3x3 행렬의 행 #2을 담고 있다.\n ; (t3)은 3x3 행렬의 행 #3을 담고 있다.\n ; t3에는 색 데이터(RGBA)를 가진 입방체 맵 또는 영역 맵이 배정된다.\n ; t0은 입방체 범프 매핑을 위한 법선 맵을 담고 있다.\n ; 정점 당 시선 벡터는 정점 셰이더에서 카메라 위치로부터 도출된다.\nps.1.1\ntex t0 ; {xyz}\ntexm3x3pad t1, t0 ; 행 #1로부터 u를 계산\ntexm3x3pad t2, t0 ; 행 #2로부터 v를 계산\n\n ; 행 #3으로부터 w를 계산\n ; t1-t3의 q 텍스처 좌표 값들로 시선 벡터를 계산, 시선 벡터로 u, v, w를 반사시킨다.\n ; 반사된 벡터로 t3의 텍스처를 참조한다.\ntexm3x3vspec t3, t0 ; (u", v", w") = 2 * (N . E) * N - E * (N . N)\nmov r0, t3 ; 결과를 출력\n\n<html> ---------------------------------------- </html>\n(in shader2/ 7.ps_1_4 이전 하드웨어에서의 스페큘러 범프 매핑)\n''정규화 스페큘러 범프 매핑 (Normalized Specular Bump Mapping)'' \n(p.247) 스페큘러 멱함수를 구현하는 데에도 큐브 맵을 사용하면 된다. 이 기법은 표준 환경 맵 범프 매핑 세이더의 확장이라 할 수 있다. 다음이 표준 셰이더이다.\n\n''Local Viewer Reflection''\n * Compute Local Viewer Specular reflection about Normal from Normal Map\n * Eye vector comes from q coordinates of the 3 sets of 4D textures\n\n ; c0 = 스페큘러 조명 색상\nps_1_1\ntex t0 ; Normal Map\ntexm3x3pad t1, t0 bx2 ; 1 st matrix row, x of eyevector\ntexm3x3pad t2, t0 bx2 ; 2 nd matrix row, y of eyevector \ntexm3x3vspec t3, t0 bx2 ; 3 rd row & eye z, reflect & sample (Dependent texture read)\nmul r0, t3, c0\n\n이 셰이더에서는 t0에 저장된 픽셀별 법선 값을 월드 공간으로 변환하고, 시야 반사 벡터를 계산하여, 이를 가지고 환경 큐브 맵을 참조하고 있다 (시야 벡터는 oT1.w, oT2.w, oT3.w에서 보간된다).\n\n큐브 맵은 하나의 조명이 고정된 방향을 비추는 상황을 기준으로 하여 미리 계산할 것이다. 텍셀의 정규화된 u, v, w 좌표를 입력 벡터로 하고 (0,1,0) 같은 고정 벡터를 조명 방향으로 하여 스펙큘러 함수를 적용하여 각 텍셀을 계산한다.\n\n<html> ---------------------------------------- </html>\nps.1.4 \ndef c0, 1,1,1,1 \n \ntexld r0, t0 ; Look up normal map. \ntexcrd r1.xyz, t4 ; Eye vector \n\ntexcrd r4.xyz, t1 ; 1st row of environment matrix \ntexcrd r2.xyz, t2 ; 2st row of environment matrix \ntexcrd r3.xyz, t3 ; 3rd row of environment matrix \n \ndp3 r4.x, r4, r0_bx2 ; N.x = 1st row of matrix multiply \ndp3 r4.y, r2, r0_bx2 ; N.y = 2nd row of matrix multiply \ndp3 r4.z, r3, r0_bx2 ; N.z = 3rd row of matrix multiply \ndp3_x2 r3.xyz, r4, r1 ; 2(N.Eye) \nmul r3.xyz, r4, r3 ; 2N(N.Eye) \ndp3 r2.xyz, r4, r4 ; N.N \n\nmad r2.xyz, -r1, r2, r3 ; 2N(N.Eye) - Eye(N.N) \n \nphase \n \ntexld r2, r2 ; Sample cubic reflection map \ntexld r3, t0 ; Sample base map with glos\ntexld r4, r4 ; Sample cubic diffuse maps in alpha \n \nmul r1.rgb, r3.a, r2 ; Specular = Gloss*Reflect\nmad r0.rgb, r3, r4, r1 ; Base*Diffuse + Specularion \n+mov r0.a, c0.a ; Put 1.0 in alpha \n\n<html> <a name="Arithmetic_Iinstruction"> </a>\n<br>\n<a href="#Page_PixelShader"> <span style="font-size: 16px;"> <b> 산술 명령어 </b> </span> </a> </html>\n\nps.1.1-ps.1.3과 ps.1.4의 차이점은 그리 많지 않다. ps.1.4에서만 가능한 명령은 bem이다. 이 명령은 texbem과 texbeml 기능을 산술 명령으로 대체한 것이라 할 수 있다. 또한 cmd와 cnd 명령은 ps.1.4에서 좀더 강력하다. ps.1.4에서는 산술 명령들을 모든 테스처 어드레싱 및 혼합 작업에 사용할 수 있으므로 산술 명령들의 활용 범위가 ps.1.1-ps.1.3보다 ps.1.4에서 훨씬 더 크다.\n\n정점 셰이더와 마찬가지로, 픽셀 셰이더의 산술 명령들에 조건 분기 명령은 없다. 그러나 cmd나 cnd로 조건 분기의 기능성을 제한적이나마 흉내내는 것은 가능하다.\n\n| 명령 | 매개변수 |>|>|>| 레지스터 | 버전 |\n|~|~| vn | cn | tn | rn |~|\n| mov |dest | | | X | X |ps.1.1-ps.1.3 |\n|~|~| | | | X |ps.1.4 |\n|~|src | X | X | X | X |ps.1.1-ps.1.3 |\n|~|~| | X | | X |ps.1.4 페이즈 1 |\n|~|~| X | X | | X |ps.1.4 페이즈 2 |\n\n| 명령 | 매개변수 |>|>|>| 레지스터 | 버전 |\n|~|~| vn | cn | tn | rn |~|\n| dp3, mul, sub |dest | | | X | X |ps.1.1-ps.1.3 |\n|~|~| | | | X |ps.1.4 |\n|~|src0, src1 | X | X | X | X |ps.1.1-ps.1.3 |\n|~|~| | X | | X |ps.1.4 페이즈 1 |\n|~|~| X | X | | X |ps.1.4 페이즈 2 |\n\n| 명령 | 매개변수 |>|>|>| 레지스터 | 버전 |\n|~|~| vn | cn | tn | rn |~|\n| cmp, mad |dest | | | X | X |ps.1.1-ps.1.3 |\n|~|~| | | | X |ps.1.4 |\n|~|src0, src1, src2 | X | X | X | X |ps.1.1-ps.1.3 |\n|~|~| | X | | X |ps.1.4 페이즈 1 |\n|~|~| X | X | | X |ps.1.4 페이즈 2 |\n\n<html> <a name="cmp"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page_PixelShader"> <span style="font-size: 14px;"> <b> #. cmp </b> </span> </a> src0 >= 0. 비교 </div> </html>\n(p.162) src0 >= 0의 비교 결과에 따라 src1과 src2 중 하나를 선택한다. 비교와 선택은 모두 성분별로 일어난다.\n\nps.1.2와 ps.13의 경우 cmp는 두 개의 산술 명령 슬롯들을 차지한다. CreatePixelShader()는 이 명령이 하나의 슬롯을 차지한다고 간주하는데, 이는 오류이다. 따라서 이 명령을 사용하는 픽셀 셰이더를 작성할 때에는 슬롯들을 직접 계산해서 확인해야 한다. 그리고 ps.1.2와 ps.1.3에서 cmp의 원본 레지스터들 중 대상 레지스터와 같은 것이 하나라도 있어서는 안 되는데, 이것도 CreatePixelShader()가 잡아내지 못한다.\n\n ; 네 성분 모두를 비교\nps.1.4\ntexcrd r1, t1 ; r1은 -0.6, 0.6, 0, 0.6을 담고 있다.\ntexcrd r2, t2 ; r2는 0, 0, 0, 0을 담고 있다.\ntexcrd r3, t3 ; r3은 1, 1, 1, 1을 담고 있다.\n\ncmp r0, r1, r2, r3 ; ( 1, 0, 0, 0 )\n ; r0.x 는 r1.x = -0.6 < 0 이므로 r3.x = 1\n ; r0.y 는 r1.y = 0.6 >= 0 이므로 r2.y = 0\n ; r0.z 는 r1.z = 0 >= 0 이므로 r2.z = 0\n ; r0.w 는 r1.w = 0.6 >= 0 이므로 r2.w = 0\n\n<html> ---------------------------------------- </html>\n ; 카툰 픽셀 셰이더\n ; t0은 법선 벡터\n ; t1은 빛 벡터\nps.1.4\ndef c0, 0.1f, 0.1f, 0.1f, 0.1f ; c0은 감쇠 계수 #1을 담는다.\ndef c1, 0.8f, 0.8f, 0.8f, 0.8f ; c1은 감쇠 계수 #2을 담는다.\ndef c2, 0.2f, 0.2f, 0.2f, 1.0f ; c2는 어두운 색\ndef c3, 0.6f, 0.6f, 0.6f, 1.0f ; c3은 평균 색\ndef c4, 0.9f, 0.9f, 1.0f, 1.0f ; c4는 밝은 색\ntexcrd r0.xyz, t0 ; 법선 벡터를 r0에 넣는다.\ntexcrd r1.xyz, t1 ; 빛 벡터를 r1에 넣는다.\n\ndp3 r3, r0, r1 ; n.l\nsub r4, r3, c0 ; n.l에서 감쇠 계수 #1을 뺀다.\ncmp_sat r0, r4, c3, c2 ; n.l > 인지? (참이면 평균 색, 아니면 어두운 색을 사용)\nsub r4, r3, c1 ; n.l에서 감쇠 계수 #2을 뺀다.\ncmp_sat r0, r4, c4, r0 ; n.l > 인지? (참이면 밝은 색, 아니면 주어진 색을 그대로 사용)\n\n\n<html> <a name="cnd"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page_PixelShader"> <span style="font-size: 14px;"> <b> #. cnd </b> </span> </a> src0 > 0.5 비교 (ps.1.1 --> ps.1.4 변경시 주의) </div> </html>\n| 명령 | 매개변수 |>|>|>| 레지스터 | 버전 |\n|~|~| vn | cn | tn | rn |~|\n| cnd |dest | | | X | X |ps.1.1-ps.1.3 |\n|~|~| | | | X |ps.1.4 |\n|~|src0 | | | | r0.a |ps.1.1-ps.1.3 |\n|~|src1, src2 | X | X | X | X |ps.1.1-ps.1.3 |\n|~|src0, src1, src2 | | X | | X |ps.1.4 페이즈 1 |\n|~|~| X | X | | X |ps.1.4 페이즈 2 |\n(p.165) r0.a > 0.5 비교의 결과에 기반해서 src1 과 src2 중 하나를 선택한다. ps.1.4의 경우에는 src0의 각 성분(채널)마다 src0 > 0.5의 비교를 수행, 선택한다.\n|!Pixel shader versions |!1_1 |!1_2 |!1_3 |!1_4 |!2_0 |!2_x |!2_sw |!3_0 |!3_sw | !비 고 |\n|cmp | |x |x |x |x |x |x |x | |src0 >= 0. 비교 (src0 > - 0.01 / if 정밀도 = 0.01 일 때) |\n|cnd |x |x |x |x | | | | | |src0 > 0.5 비교 (ps.1.1 >> ps.1.4 변경시 주의) |\n''cnd'' src0(- 0.51) > 0.5 (- 0.51)\n src0(- 0.51) > -0.01 ''cmp''\n{{{\n// ps.1.1-1.3 (Version 1_1 to 1_3 compares against the replicated alpha channel of r0 only.) \nif (r0.a > 0.5)\n dest = src1\nelse \n dest = src2\n\n// ps.1.4는 각 채널을 개별적으로 비교한다.\nsrc0의 각 채널에 대해\n{\n if (src0.channel > 0.5)\n dest.channel = src1.channel\n else\n dest.channel = src2.channel \n}\n}}}\n ; r0.a > 0.5 비교\nps.1.1\ndef c0, -0.5, 0.5, 0, 0.6\ndef c1, 0, 0, 0, 0\ndef c2, 1, 1, 1, 1\nmov r0, c0\ncnd r1, r0.a, c1, c2 ; r0.a > 0.5 이므로 r1.xyzw = c1.xyzw\n ; 결과적으로 r1에는 0, 0, 0, 0이 배정된다.\n<html> ---------------------------------------- </html>\n ; 네 성분 모두 비교\nps.1.4\n ; r1은 -0.6, 0.5, 0, 0.6\n ; r2는 0, 0, 0, 0\n ; r3은 1, 1, 1, 1\ntexcrd r1, t1\ntexcrd r2, t2\ntexcrd r3, t3\ncnd r0, r1, r2, r3 ; r0에는 1, 1, 1, 0이 배정된다. 그 과정은:\n ; r0.x ( r1.x < 0.5 이므로 ) = r3.x\n ; r0.y ( r1.y = 0.5 이므로 ) = r3.y\n ; r0.z ( r1.z < 0.5 이므로 ) = r3.z\n ; r0.w ( r1.w > 0.5 이므로 ) = r2.w\n\ncf .r과 .g 선택자들은 ps.1.4만 지원한다. 다음은 원본 레지스터의 적색 채널을 모든 채널들로 복제하는 예이다.\nmov r1, r1.r ; r1.rgba = r1.r\n\n<html> <a name="dp3"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page_PixelShader"> <span style="font-size: 14px;"> <b> #. dp3 </b> </span> </a> 3 성분 내적\n</div> </html>\n3 성분 내적을 계산한다. 결과인 스칼라 값이 모든 채널들에 복사된다. 즉:\ndest.w = (scr0.x * scr1.x) + (scr0.y * scr1.y) + (scr0.z * scr1.z);\ndest.x = dest.y = dest.z = dest.w = dp3의 스탈라 값\n\n결과가 자동으로 (0..1) 범위로 한정되는 것은 아니다. 이 명령은 벡터 파이프라인 안에서 수행되므로, 알파 파이프라인 안에서 수행되는 다른 하나의 명령과 짝을 이룰 수 있다(즉 병렬 수행될 수 있다. 병렬 수행(co-issue)에 대해서는 잠시 후에).\n\ndp3 r0.rgb, t0, v0\n+mov r2.a, t0\n\nps.1.1-ps.1.3에서 dp3은 항상 .rgb를 출력한다. ps.1.4에서는 대상 레지스터 마스킹을 통해서 rgba 네 채널들 중 임의으 세 채널을 원하는 대로 선택할 수 있다.\n<html> ---------------------------------------- </html>\n ; Dot3 픽셀 당 반영 조명 (반영 지수는 참조 테이블로부터 읽어 온다.)\nps.1.4\n ; r0은 법선 맵\n ; t1은 빛 벡터\n ; t2는 중각 벡터\n ; r2는 2D 텍스처 (참조 테이블)\n ; r3은 색 맵\ntexld r0, t0 ; 법선 맵\ntexcrd r1.rgb, t1\ntexcrd r4.rgb, t2\n\ndp3 r1.r, r1, r0_bx2 ; u를 계산\ndp3 r1.g, r4, r0_bx2 ; v를 계산\n\nphase\n\ntexld r3, t3\ntexld r2, r1 ; u, v로 t2 (참조 테이블)를 추출\nmul r0, r2, r3\n\n\n<html> <a name="frc"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page_PixelShader"> <span style="font-size: 14px;"> <b> #. frc </b> </span> </a> 소수점 이하 값 (0.0 ~ 1.0)\n</div> </html>\nReturns the fractional portion of each input component.\ndest.x = src.x - (float)floor(src.x);\ndest.y = src.y - (float)floor(src.y);\ndest.z = src.z - (float)floor(src.z);\ndest.w = src.w - (float)floor(src.w);\ncf.\nThe floor of 2.8 is 2.000000 버림\nThe floor of -2.8 is -3.000000\nThe ceil of 2.8 is 3.000000 올림\nThe ceil of -2.8 is -2.000000 \n\n\n<html> <a name="mad"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page_PixelShader"> <span style="font-size: 14px;"> <b> #. mad </b> </span> </a> dest = src0 * src1 + src2\n</div> </html>\n이 명령은 예를 들어 분산색을 더 어둡게 또는 밝게 매핑하는 경우에 유용하다.\n<html> ---------------------------------------- </html>\n ; 다음 예제들은 조명 맵으로 색 맵을 변조하는 방법을 보여준다.\n ; 이러한 기법은 색 맵의 일부를 더 어둡게 할 때 종종 쓰이며, 어두운 매핑(dark mapping)이라고 부른다.\n ; 이 예에서는 추가적으로 분산색을 더한다.\nps.1.1\ntex t0 ; 색 맵\ntex t3 ; 조명 맵\nmad r0, t3, t0, v0\n\n ; 어두운 매핑 + 분산색\nps.1.4\ntexld r0, t0 ; 색 맵\ntexld r3, t3 ; 조명 맵\nmad r0, r3, r0, v0\n\n\n<html> <a name="mul"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page_PixelShader"> <span style="font-size: 14px;"> <b> #. mul </b> </span> </a> </div> </html>\n ; 다음은 조명 맵으로 색 맵을 변조하는 예이다.\n ; 이 기법은 색 맵의 일부를 어둡게 만드는 데 주로 쓰인다(어두운 매핑 dark mapping).\nps.1.1\ntex t0 ; 색 맵\ntex t3 ; 조명 맵\nmul r0, t0, t3\n\n ; 어두운 매핑\nps.1.4\ntexld r0, t0 ; 색 맵\ntexld r3, t3 ; 조명 맵\nmul r0, r0, r3\n\n\n<html> <a name="Instruction_Modifiers"> </a>\n<br>\n<a href="#Page_PixelShader"> <span style="font-size: 16px;"> <b> 명령 수정자들 (Instruction Modifiers) </b> </span> </a> </html>\n''스위즐링/ 선택자''\n(p.174) 픽셀 셰이더의 스위즐링은 정점 셰이더의 것보다 제한적이다. 픽셀 셰이더에서는 원본 레지스터의 채널 하나를 모든 채널들에 복사하는 것만 지원된다. 이러한 스위즐링은 소위 '원본 레지스터 선택자'라는 것을 통해서 이루어진다.\n\n| !원본 레지스터 선택자 | !구문 | !ps.1.1 | ! ps.1.2 | !ps.1.3 | !ps.1.4 |\n|적색 복제 |source.r | | | |x |\n|녹색 복제 |source.g | | | |x |\n|청색 복제 |source.b |x |x |x |x |\n|알파 복제 |source.a |x |x |x |x |\n.r과 .g 선택자들은 ps.1.4만 지원한다. 다음은 원본 레지스터의 적색 채널을 모든 채널들로 복제하는 예이다.\n\nmov r1, r1.r ; r1.rgba = r1.r\n\n.b 복제 기능은 DirectX 8.1때부터 ps.1.1-ps.1.3에서 사용할 수 있게 되었으나, 다음처럼 한 명령에서 대상 레지스터의 알파 쓰기 마스크와 함께 쓰일 때에만 유효하다.\n\nmul r0.a, r0, r1.b\n\n{{wrappingClass{ Note DirectX 8.0의 ps.1.1은 .b 복제를 지원하지 않는다. }}}\n이는 ps.1.1-ps.1.3의 dp3에서는 .b 원본 선택자를 사용할 수 없다는 뜻이다. 왜냐하면 dp3의 대상 쓰기 마스크로 사용할 수 있는 것은 .rgb 또는 .rgba 뿐이기 때문이다(쓰기 마스크에 대해서는 잠시 후에).\n\ndp3 r0.a, r0, c0.b ; 실패\n\n''원본 레지스터 수정자들''\n(p.177) 원본 레지스터 수정자들은 명령에 쓰일 레지스터 데이터의 범위를 조정하거나 값을 비례시키는 데 유용하다.\n|!수정자 |!구문 |!ps.1.1 |!ps.1.2 |!ps.1.3 |!ps.1.4 |!비 고 |\n|바이어스 |r0_bias |x |x |x |x |add -0.5 |\n|역수 |1-r0 |x |x |x |x |add -1 |\n|부정 |-r0 |x |x |x |x | |\n|비례 x2 |r0_x2 | | | |x |mul 2.0 |\n|부호 있는 비례 |r0_bx2 |x |x |x |x |add -0.5 followed by mul 2 |\n(p.178) 바이어스(bias) 수정자는 모든 성분들에서 0.5를 뺀다. 이는 DX6/ 7 다중 텍스처링 유닛의 D3DTOP_ADDSIGEND에 해당한다. 이 수정자는 0에서 1의 범위의 값을 -0.5에서 0.5의 범위를 변경한다. 그 범위 밖의 데이터에 대해 바이어스를 적용하면 정의되지 않은 결과가 나타날 수 있으므로, 먼저 _sat 명령 수정자로 범위를 (0..1)로 만든 후 이 수정자를 사용해야 할 것이다.\n\n역(invert) 수정자는 각 채널의 값을 뒤집는다(1 - 값). 다음은 원본 레지스터 r1의 성분들을 뒤집어서 곱하는 예이다.\n\nmul r0, r0, 1-r1; (1.0 - r1)을 곱한다.\n...\n부호 있는 비례(singed scaling) 수정자 _bx2는 바이어스와 비례의 결합이다. 이것은 각 채널에서 0.5를 뺀 후 2를 곱한다. 이에 의해 부호 없는 입력 데이터는 부호 있는 데이터가 된다. 바이어스와 마찬가지로, 범위 (0..1) 바깥의 데이터에 대해 이 수정자를 사용하면 정의되지 않은 결과가 나올 수 있다.\n\n(p.180) 명령 수정자는 명령 이름 다음에 밑줄로 연결된다. 명령 수정자들은 명령의 출력을 변경하는 역할을 한다.\n|!명령 수행자 |!설명 |!구문 |!ps.1.1 - ps.1.3 |!ps.1.4 |\n|_x2 |2를 곱한다. |명령_x2 |x |x |\n|_x4 |4를 곱한다. |명령_x4 |x |x |\n|_x8 |8를 곱한다. |명령_x8 | |x |\n|_d2 |2를 나눈다. |명령_d2 |x |x |\n|_d4 |4를 나눈다. |명령_d4 | |x |\n|_d8 |8를 나눈다. |명령_d8 | |x |\n|_sat |(0..1)로 한정 |명령_sat |x |x |\n_sat는 다른 수정자들과 함께 쓰일 수 있다 (예를 들면 mad_d8_sat).\n\n<html>\n<a href="#Page_PixelShader"> ▷ 최상위로 ///////////////////////////////////////////////////////</a> <br>\n</html>\n
<html> <a name="Part0"> </a>\n<table>\n <tr> \n <td> <IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_2004_Shaders_P&A.jpg" height=70 >\n </td>\n <td> <b> Shaders for Game Programmers and Artists </b> <br>\n<br>\n▼ Sebastian St Laurent 저/ 2004.5.13.초판/ Boston, Ma. : Thomson/Course Technology / \nISBN-10: 1-59200-092-4 / ISBN-13: 978-1592000920 <br>\n </td> \n </tr>\n</table>\n</html>\n!! Introduction\n<html>\n <a href="#Part1"> #. Part I From the Ground Up </a> <br>\n <a href="#Part2"> <u> #. Part II Screen Effects </a> </u>\n</html> >> [[Part II Screen Effects]]\n<html>\n <a href="#Part3"> <u> #. Part III Making It Look Real </a> </u>\n</html> >> [[Part III Making It Look Real]]\n<html>\n <a href="#Part4"> <u> #. Part IV Advanced Topics </a> </u>\n</html> >> [[Part IV Advanced Topics]]\n<html>\n <a href="#Part5"> #. Part V Appendixes </a> <br>\n</html>\n\n<html> <a name="Part1"> </a>\n<a href="#Part0"> <span style="color:#3058D2; background:#d7dedd; font-family:돋움; font-size: 18px;"> <b> Part I From the Ground Up </b></span> </a>\n</html>\n!!! #. Chapter 1 Welcome to the World of Shaders\n''Vertex and Pixel Shader Pipelines and Capabilities''\n(p.008)\n<html>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_2004_Shaders_P&A_008.jpg" width=400>\n</html>\n(p.010)\n<html>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_2004_Shaders_P&A_010.jpg" width=400>\n</html>\n\n!!! #. Chapter 2 The Art of 3D\n(p.031) ''Which One Is Better?''\nThere has been major debate and battle in deciding which API is better: Direct3D or OpenGL...\n\nBoth APIs are straightforward to use. However, DirectX usually needs more initialization code to get going. DirectX is updated more often and is better suited to take advantage of the latest technologies than OpenGL.\n\n<html>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_2004_Shaders_P&A_032.jpg" width=400>\n</html>\n\n!!! #. Chapter 3 RenderMonkey Version 1.5 \n!!! #. Chapter 4 Getting Started, Your First Shaders \n(재구성) Chapter4_Getting_Started.rfx\n-. 4.1_Your First Shader\n / Sphere.3ds\n\n-. 4.2_Texturing Your Object\n / Teapot.3ds\n / fieldstone.tga\n\n-. 4_3.Seeing Double\n / Pass 0 ; 4.2\n / Pass 1 ; 4.1 + float4 teapot_position; 추가\n\n<html> <span style="font-size: 14px;"> <b> Exercise 2: BLENDING TWO TEXTURES </b> </span> </html>\n#. Randering Pass: Pass 0 ( ps_2_0 / on the CD-ROM as as shader_2.rfx )\n{{{\nsampler Texture0;\nsampler Texture1;\nfloat4 ps_main( float4 inDiffuse: COLOR0, float2 inTxr1: TEXCOORD0, float2 inTxr2: TEXCOORD1 ) : COLOR0\n{\n // Output moduleted texture color:\n return tex2D(Texture0,inTxr1)*tex2D(Texture1,inTxr2);\n}\n}}}\n\n\n<html> <a name="Part2"> </a>\n<a href="#Part0"> <span style="color:#3058D2; background:#d7dedd; font-family:돋움; font-size: 18px;"> <b> Part II Screen Effects </b></span> </a>\n</html> >> [[Part II Screen Effects]]\n\n(p.066) In Chapter 5, “Looking Through a Filter,” I will explore the basics needed to render screen-based effects, such as rendering your scene to a temporary texture and manipulating it through a shader. I will initially focus on color manipulation filters and other basic filters, such as blurs and other convolution filters. In Chap-ters 6,“Blurring Things Up,” 7,“It’s Getting Hot in Here,” and 8,“Making Your Day Brighter,” I will explain how to accomplish more powerful effects such as depth of field, heat haze, and high-dynamic range rendering.\n\n<html> <span style="font-size: 14px;"> <b> #. Chapter 5 Looking Through a Filter </b> </span> </html>\n▶ Vertex Shader에서 RenderTarget을 이용, 렌더링된 이미지를 Pixel Shader에서 그대로 출력하거나 흑백 이미지 등 출력 pixel color를 가공하는 방법을 소개\n\n<html> <span style="font-size: 14px;"> <b> #. Chapter 6 Blurring Things Up </b> </span> </html>\n▶ first real-life usable effect. <br> The effect is called depth of field (DOF) and can simulate the in- and out-of-focus properties that the human eye and video cameras perceive.(advantage of the blurring filters)\n\n<html> <span style="font-size: 14px;"> <b> #. Chapter 7 It’s Getting Hot in Here </b> </span> </html>\n▶ screen effect called heat haze, or heat shimmer. <br> Your bag of tricks now contains techniques to both blur and distort your environment.\n / Exercise 1: YOUR OWN @@color(#0000ff): REFRACTION SHADER @@\n\n<html> <span style="font-size: 14px;"> <b> #. Chapter 8 Making Your Day Brighter </b> </span> </html>\n▶ High dynamic range (HDR) ; Glare, Streaks, Lens Flares (렌더링 속도에는 좋지못함)\n\n\n<html> <html> <a name="Part3"> </a>\n<a href="#Part0"> <span style="color:#3058D2; background:#d7dedd; font-family:돋움; font-size: 18px;"> <b> Part III Making It Look Real </b></span> </a>\n</html> >> [[Part III Making It Look Real]]\n\n(p.154) In Part II,“Screen Effects,” you learned how simple screen-based effects can be used to achieve stunning graphics and enhance the realism of your renderings. One drawback with these techniques is that they only focus on improving the quality of something that has already been rendered. It is now time to start focusing on making the objects look better as you render them in the first place.\n\nIn Part III, you’ll learn several techniques that can be used to improve the quality of your objects. Lighting, discussed in Chapters 9,“May There Be Light,” 10,“Shiny Little Pixels,” and 11, “Mirror, Mirror, On the Wall,” is probably one of the most important visual cues and can do wonders for your graphics. In those chapters you will explore many topics, including basic lighting information, per-vertex lighting,per-pixel lighting, and even bumpmapping.\n\nIn Chapters 12, “Not All Materials Are the Same,” 13, “Building Materials from Scratch,” and 14, “Why Does It Always Need to Look Real?,” you will explore the topic of materials. Although textures and lighting may look good, some materials have different behaviors, and exploring techniques to reproduce this can yield stunningly realistic results. Here you will learn about techniques such as BRDFs and procedural materials.\n\nFinally, you will learn how fogging and animations can make your scene even livelier.\n\n<html> <span style="font-size: 14px;"> <b> #. Chapter 9 May There Be Light </b> </span> </html>\n▶ Per-vertex lighting : Combining the code for the ambient, diffuse, and specular lighting\n\n<html> <span style="font-size: 14px;"> <b> #. Chapter 10 Shiny Little Pixels </b> </span> </html>\n▶ Per-pixel lighting : diffuse and specular lighting / advantage of per-pixel lighting to add pixel-level details to your objects by using bumpmaps and normal maps\n\n<html> <span style="font-size: 14px;"> <b> #. Chapter 11 Mirror, Mirror, On the Wall </b> </span> </html>\n▶ Reflection, refraction, materials that exhibit both translucency and reflectivity\n\n<html> <span style="font-size: 14px;"> <b> #. Chapter 12 Not All Materials Are the Same </b> </span> </html>\n▶ Bi-Directional Refractance Functions (BDRFs, 양방향반사도분포함수) ; such as velvet\n\n<html> <span style="font-size: 14px;"> <b> #. Chapter 13 Building Materials from Scratch </b> </span> </html> \n▶ new materials procedurally ; Perlin noise, noise procedurally clouds or wood, marble\n\n<html> <span style="font-size: 14px;"> <b> #. Chapter 14 Why Does It Always Need to Look Real? </b> </span> </html>\n▶ Non-photorealistic rendering ; Outline Rendering, Toon Shading, Real-Time Hatching\n\n\n<html> <a name="Part4"> </a>\n<a href="#Part0"> <span style="color:#3058D2; background:#d7dedd; font-family:돋움; font-size: 18px;"> <b> Part IV Advanced Topics </b></span> </a>\n</html> >> [[Part IV Advanced Topics]]\n\n<html> <span style="font-size: 14px;"> <b> #. Chapter 15 Watch Out for That Morning Fog </b> </span> </html>\n▶ (mostly static) Fog (by the hardware), Volumetric fog\n\n<html> <span style="font-size: 14px;"> <b> #. Chapter 16 Moving Objects Around </b> </span> </html>\n▶ Animation 관련 함수(time_0_1, time_0_2PI 등), keyframing and skinning 이론 설명\n\n<html> <span style="font-size: 14px;"> <b> #. Chapter 17 Advanced Lighting </b> </span> </html>\n▶ Outdoor Scene Lighting, Polynomial texture map (PTM with bumpmap, self-shadowing), Spherical Harmonics.\n\n<html> <span style="font-size: 14px;"> <b> #. Chapter 18 Shadowing </b> </span> </html>\n▶ Shadow mapping (determine accurate per-pixel shadows), Shadow Volumes (the z-buffer + hardware support of stencil buffers)\n\n<html> <span style="font-size: 14px;"> <b> #. Chapter 19 Geometry Tricks </b> </span> </html>\n▶ Level of detail (LOD, Static LOD, Progressive LOD, Re-Creating Lost Details) / Displacement Mapping \n ; To balance your rendering between quality and performance }}}\n\n\n<html> <a name="Part5"> </a>\n<a href="#Part0"> <span style="color:#3058D2; background:#d7dedd; font-family:돋움; font-size: 18px;"> <b> Part V Appendixes </b></span> </a>\n</html>\n\n(p.342) This section is filled with extra information and reference materials that will be useful to you as a shader developer. The first two appendixes include reference manuals for both Microsoft's High-Level Shader Lan- guage and RenderMonkey. The following appendices will give you installation instructions for the content on the CD and solutions to most of the exercises pro- posed throughout the book. \n\n''Appendix A'': Serves as a reference manual for the HLSL shader language. This is your best source of information on all the built-in functions and how to make the most of this shading language. \n\n''Appendix B'': Contains a user manual for RenderMonkey. Use it to familiarize yourself with all the nooks and crannies of RenderMonkey. \n\n''Appendix C'': Serves as a brief introduction to the content available on the com- panion CD-ROM. \n\n''Appendix D'': Contains in-depth solutions to all the exercises developed through- out the book. \n\n''Appendix E'': A reference shader library. Presents all the important pieces of shader code developed throughout this book in an easy-to-use reference list. \n\nIt has been a fun and thrilling journey writing this book. I hope the knowledge I con- veyed to you will be helpful and allows you to create the most stunning graphics!\n\n\n!!! #. Appendix A High-Level Shader Language Reference\n!!! #. Appendix B Render Monkey 1.5 User Manual\n!!! #. Appendix C What’s on the CD\n!!! #. Appendix D Exercise Solutions\n!!! #. Appendix E Shader Library\n\n!! Index \n\n\n
<html> <a name="Part03"> </a> </html>\n(p.154) In Part II,“Screen Effects,” you learned how simple screen-based effects can be used to achieve stunning graphics and enhance the realism of your renderings. One drawback with these techniques is that they only focus on improving the quality of something that has already been rendered. It is now time to start focusing on making the objects look better as you render them in the first place.\n\nIn Part III, you’ll learn several techniques that can be used to improve the quality of your objects. Lighting, discussed in Chapters 9,“May There Be Light,” 10,“Shiny Little Pixels,” and 11, “Mirror, Mirror, On the Wall,” is probably one of the most important visual cues and can do wonders for your graphics. In those chapters you will explore many topics, including basic lighting information, per-vertex lighting,per-pixel lighting, and even bumpmapping.\n\nIn Chapters 12, “Not All Materials Are the Same,” 13, “Building Materials from Scratch,” and 14, “Why Does It Always Need to Look Real?,” you will explore the topic of materials. Although textures and lighting may look good, some materials have different behaviors, and exploring techniques to reproduce this can yield stunningly realistic results. Here you will learn about techniques such as BRDFs and procedural materials.\n\nFinally, you will learn how fogging and animations can make your scene even livelier.\n\n{{wrappingClass{ ▶ 좀더 풍부한 환경을 만드는 렌더링 ; per-vertex lighting, per-pixel lighting, bumpmapping, \n Bi-Directional Refractance Distribution Functions (BRDFs) and procedural materials }}}\n\nPart I From the Ground Up\n[[Part II Screen Effects]]\nPart III Making It Look Real\n[[Part IV Advanced Topics]]\nPart V Appendixes\n\n<html>\n<a href="#Chapter09"> #. Chapter 9 May There Be Light </a> <br>\n<a href="#Chapter10"> #. Chapter 10 Shiny Little Pixels </a> <br>\n<a href="#Chapter11"> #. Chapter 11 Mirror, Mirror, On the Wall </a> <br>\n<a href="#Chapter12"> #. Chapter 12 Not All Materials Are the Same </a> <br>\n<a href="#Chapter13"> #. Chapter 13 Building Materials from Scratch </a> <br>\n<a href="#Chapter14"> #. Chapter 14 Why Does It Always Need to Look Real? </a> <br>\n</html>\n\n<html> <a name="Chapter09"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Part03"> <span style="font-size: 16px;"> <b> #. Chapter 9 May There Be Light </b> </span> </a>\n</div> </html>\n{{wrappingClass{ ▶ Per-vertex lighting : Combining the code for the ambient, diffuse, and specular lighting }}}\n\n(p.155) In this chapter, you will learn how lighting can be applied to your geometry. You will start with some theory of how lighting works and explore some of the basic types of lights and approaches taken in computer graphics. \n\nLater, you will learn how to take advantage of this knowledge to apply lighting to your object. During this chapter, I will show you how you can light your objects in both a per-vertex and per-pixel way.\n\n<html> <span style="font-size: 16px;"> <b> Of Light and Magic </b> </span> </html>\n\n<html> <span style="font-size: 14px;"> <b> What Makes Light in the First Place </b> </span> </html>\n(p.156) When light hits a surface of any type, two phenomena happen. The light directly interacts with the surface. There, light is reflected in a way which is specific to the properties of the material of the surface... For example, a polished metal surface tends to directly reflect the incident light, while a matte finish wall diffuses the light in many directions. \n\nThe second phenomenon is what happens to light when it is absorbed, transmitted, and scattered within the surface. For example, glass is mostly translucent and lets most of the light through. On the other hand, clouds, which may seem opaque, actually scatter light\nin many directions as it passes through their vapor surface.\n\n(p.157) Although the following list summarizes them, keep in mind that this is a simple generalization, and I will discuss other techniques later on.\n\n■ ''Ambient lighting'': This is a gross approximation of the total level of lighting in a scene. In reality, there is no such thing because the ambient lighting level comes from a multitude of discrete lights. However, this serves as a good approximation\nthat can help to significantly reduce the number of lights to consider within a par-ticular scene. Ambient lighting generally manifests itself as a constant-colored light that affects the object uniformly.\n■ ''Diffuse lighting'': Materials with a rough surface exhibit what is called diffuse lighting. The surface’s microscopic roughness has the effect of reflecting incoming light uniformly in all directions. This causes the perceived lighting to be the same from any viewing angle.\n■ ''Specular lighting'': When the surface of a material is smooth, you will observe what is called specular lighting. In this case, light reflects off the surface in a non-uniform way. This means that for specular lighting, the light intensity not only depends on the light-to-surface angle but also on the viewing angle.\n\n<html> <span style="font-size: 14px;"> <b> Refraction </b> </span> </html>\n(p.159)\n<html>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_2004_Shaders_P&A_159.jpg" width=400>\n</html>\n\n<html> <span style="font-size: 14px;"> <b> Sub-Surface Scattering </b> </span> </html>\n(p.159) Probably one of the best examples is skin. \n\n(p.160) Sub-surface scattering stems from this. For a particular material surface, light is reflected off the surface, but some of the rays penetrate the surface.\n<html>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_2004_Shaders_P&A_160.jpg" width=400>\n</html>\n\n<html> <span style="font-size: 14px;"> <b> BRDFs (Bi-Directional Refractance Distribution Functions) </b> </span> </html>\ncf. 양방향반사도분포함수(Bidirectional reflectance distribution function:BRDF) 또는 양방향반사율분포함수는 빛이 불투명한 표면에서 어떤 방식으로 반사되는지를 정의하는 4차원 함수이다.\n\n(p.161)\n<html>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_2004_Shaders_P&A_161.jpg" width=400>\n</html>\n\nYou can see in Figure 9.7 that BRDFs can be useful in describing the relationship between the incident light angle and the viewing angle. We’ll examine this phenomenon further in Chapter 12, “Not All Materials Are the Same.”\n<html>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_2004_Shaders_P&A_161_2.jpg" width=400>\n</html>\n\n<html> <span style="font-size: 16px;"> <b> Types of Lights </b> </span> </html>\n\n<html> <span style="font-size: 14px;"> <b> Directional Light </b> </span> </html>\n(p.162) A directional light only has the purpose of estimating the case where a source of light is sufficiently far away. In such a case, you can estimate it by assuming that all rays of light are parallel to one another.\n\nThe best example of this is sunlight.\n\n(p.163) As Figure 9.9 shows, you only need to consider the angle between the light rays and the surface normal.\n\nThe surface normal represents the direction, which is perpendicular to the surface at a specific point. This would yield the following shader code:\n{{{\nColor = Light_Color * clamp(0, 1, dot( Light_Direction, inNormal ));\n}}}\n\n<html>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_2004_Shaders_P&A_163.jpg" width=400>\n</html>\n\n<html> <span style="font-size: 14px;"> <b> Point Lights </b> </span> </html>\n<html> <span style="font-size: 14px;"> <b> Spot Lights </b> </span> </html>\n<html> <span style="font-size: 14px;"> <b> Area Lights </b> </span> </html>\n\n<html> <span style="font-size: 16px;"> <b> Let’s Get Shading </b> </span> </html>\n\n(p.167) In the following sections, I will implement shaders for ambient, diffuse, and specular lighting. \n\nPixel shader에 color 정보를 전달하기 위해, Vertex shader에서 lighting color를 설정한다.\n{{{\nfloat4x4 view_proj_matrix;\nfloat4 Light_Ambient;\nstruct VS_OUTPUT // >> Pixel shader로 전달하는 정보\n{\n float4 Pos: POSITION; // position\n float2 TexCoord: TEXCOORD0; // texture\n float4 Color: COLOR0; // light color\n};\n}}}\n<html> <span style="font-size: 14px;"> <b> Ambient Lighting </b> </span> </html>\non the CD-ROM as shader_1.rfx\n\n(p.169) Vertex shader에서 정의한 float4 Light_Ambient; 값을 그대로 출력\n{{{\nfloat4 ps_main(float4 inColor: COLOR0) : COLOR \n{\n // Simply route the vertex color to the output\n return inColor;\n}\n}}}\n<html> <span style="font-size: 14px;"> <b> Diffuse Lighting </b> </span> </html>\n(p.169) Now that you have some ambient lighting in the scene, it is time to add a real point light and calculate its diffuse \n\ncomponent. Because a point light has position, color, and distance attenuation factors, you need to create the proper variables named \n\nLight_Position, Light_Color, and Light_Attenuation. With these variables, you are now set to create the actual shader.\n\nFor this shader, you will put the lighting code in a function called Light_PointDiffuse, which takes in the light \n\nparameters and returns the resulting color. The function takes in the light position, color, and attenuation, as well as the vertex \n\nposition and normal. \n\non the CD-ROM as shader_2.rfx\n\nfloat4x4 view_proj_matrix;\nfloat4 Light_Ambient;\nfloat4 Light1_Position;\nfloat4 Light1_Attenuation;\nfloat4 Light1_Color;\n\n<html> <span style="font-size: 14px;"> <b> Specular Lighting </b> </span> </html>\n(p.171) The last component to complete the point lighting shader is the integration of a specular part to the lighting equation. The \n\nmajor difference with specular lighting is that the lighting intensity is not only influenced by the surface-to-light angle but also \n\nby the light-to-viewer angle.\n\non the CD-ROM as shader_3.rfx\n\nfloat4x4 view_proj_matrix;\nfloat4 Light_Ambient;\nfloat4 Light1_Position;\nfloat4 Light1_Attenuation;\nfloat4 Light1_Color;\nfloat4 view_position;\nfloat4x4 inv_view_matrix;\nfloat4x4 view_matrix;\n\n<html> <span style="font-size: 14px;"> <b> Putting It Together </b> </span> </html>\n(p.174) That’s it! Well, not all of it; you still need to put it together into a final shader. This is simply a matter of combining \n\nthe code for the ambient, diffuse, and specular lighting into a single function called Light_Point. \n\n#. Randering Pass: Object ( ps_2_0 / on the CD-ROM as as shader_4.rfx )\n\n+++[Rendering results for your complete lighting shader ]\n{{{\nfloat4x4 view_proj_matrix;\nfloat4 Light_Ambient;\nfloat4 Light1_Position;\nfloat4 Light1_Attenuation;\nfloat4 Light1_Color;\nfloat4 view_position;\nfloat4x4 inv_view_matrix;\nfloat4x4 view_matrix;\nstruct VS_OUTPUT \n{\n float4 Pos: POSITION;\n float2 TexCoord: TEXCOORD0;\n float4 Color: COLOR0;\n};\n\nfloat4 Light_Point(float3 VertPos, float3 VertNorm, float3 LightPos,\n float4 LightColor, float4 LightAttenuation, float3 EyeDir)\n{\n // Determine the distance from the light to the vertex and the direction\n float3 LightDir = LightPos - VertPos;\n float Dist = length(LightDir);\n LightDir = LightDir / Dist;\n\n // Compute half vector\n float3 HalfVect = normalize(LightDir-EyeDir);\n\n // Compute distance based attenuation. This is defined as:\n // Attenuation = 1 / ( LA.x + LA.y*Dist + LA.z*Dist*Dist )\n float DistAttn = clamp(0,1, 1 / ( LightAttenuation.x +\n LightAttenuation.y * Dist + \n LightAttenuation.z * Dist * Dist ));\n\n // Specular\n float SpecularAttn = pow( clamp(0, 1,dot(VertNorm, HalfVect)),32);\n\n // Diffuse\n float AngleAttn = clamp(0, 1, dot(VertNorm, LightDir) );\n \n // Compute final lighting\n return LightColor * DistAttn * (SpecularAttn+AngleAttn);\n}\n\n\nVS_OUTPUT vs_main(float4 inPos: POSITION, float3 inNormal: NORMAL,float2 inTxr: TEXCOORD0)\n{\n VS_OUTPUT Out;\n\n // Compute the projected position and send out the texture coordinates\n Out.Pos = mul(view_proj_matrix, inPos);\n Out.TexCoord = inTxr;\n\n // Output the ambient color\n float4 Color = Light_Ambient;\n\n // Determine the eye vector\n float3 EyeVector = -normalize(mul(inv_view_matrix,float4(0,0,10,1))+inPos);\n\n // Compute light contribution\n Color += Light_Point(inPos, inNormal, Light1_Position, \n Light1_Color, Light1_Attenuation, EyeVector);\n\n // Output Final Color\n Out.Color = Color;\n\n return Out;\n}\n}}}\n===\n\nVertex shader에서 계산된 Color 값을 Pixel shader에서 그대로 출력\n\n(p.176) You can now add a texture to the workspace and change the pixel shader so that it samples the texture and modulates it with the resulting light color. The changes required to the pixel shader are as follows:\n\n#. Randering Pass: Object ( ps_2_0 / on the CD-ROM as as shader_5.rfx )\n\n{{{\nsampler Texture0;\nfloat4 ps_main(float4 inColor: COLOR0,float2 inTxr: TEXCOORD0) : COLOR \n{\n // Output the lit color\n return inColor*tex2D(Texture0,inTxr);\n}\n}}}\ncf. shader_4.rfx 와의 차이점은 Pixel shader에 Texture 적용\n\n<html> <span style="font-size: 16px;"> <b> It’s Your Turn! </b> </span> </html>\n\n<html> <span style="font-size: 14px;"> <b> Exercise 1: DIRECTION LIGHTS </b> </span> </html>\n(p.177) Throughout this chapter, all the lighting shaders you developed took advantage of point lights. As described earlier, directional light can often be used to represent distant sources of light, such as the sun, in a more efficient way than can be achieved with point lights.\nFor this exercise, I invite you to modify the ambient/diffuse/specular shader developed in this chapter to use a directional light instead of a point light.\n\nAs you develop this shader, you must remember that directional light does not have position or attenuation. @@color(#0000ff): The only thing of importance for a directional light is its direction. @@\n\n#. Randering Pass: Object ( ps_2_0 / on the CD-ROM as as shader_ex1.rfx )\n\n+++[Direction Lights Shader ]\n{{{\nfloat4x4 view_proj_matrix;\nfloat4 Light_Ambient;\nfloat4 Light1_Direction;\nfloat4 Light1_Attenuation;\nfloat4 Light1_Color;\nfloat4 view_position;\nfloat4x4 inv_view_matrix;\nfloat4x4 view_matrix;\nstruct VS_OUTPUT \n{\n float4 Pos: POSITION;\n float2 TexCoord: TEXCOORD0;\n float4 Color: COLOR0;\n};\n\nfloat4 Light_Dir(float3 VertPos, float3 VertNorm, float3 LightDir,\n float4 LightColor, float3 EyeDir)\n{\n // Compute half vector\n float3 HalfVect = normalize(LightDir-EyeDir);\n\n // Specular\n float SpecularAttn = max(0,pow( dot(VertNorm, HalfVect),32));\n\n // Diffuse\n float AngleAttn = max(0, dot(VertNorm, LightDir) );\n \n // Compute final lighting\n return LightColor * (SpecularAttn+AngleAttn);\n}\n\n\nVS_OUTPUT vs_main(float4 inPos: POSITION, float3 inNormal: NORMAL,float2 inTxr: TEXCOORD0)\n{\n VS_OUTPUT Out;\n\n // Compute the projected position and send out the texture coordinates\n Out.Pos = mul(view_proj_matrix, inPos);\n Out.TexCoord = inTxr;\n\n // Output the ambient color\n float4 Color = Light_Ambient;\n\n // Determine the eye vector\n float3 EyeVector = -normalize(mul(inv_view_matrix,float4(0,0,10,1))+inPos);\n\n // Compute light contribution\n Color += Light_Dir(inPos, inNormal, Light1_Direction, \n Light1_Color, EyeVector);\n\n // Output Final Color\n Out.Color = Color;\n\n return Out;\n}\n}}}\n===\n\n\n<html> <span style="font-size: 14px;"> <b> Exercise 2: ANIMATING LIGHTS </b> </span> </html>\n(p.177) Taking advantage of the time_0_1 built-in HLSL variable, you can animate both the light’s position and color.\non the CD-ROM as as shader_ex2.rfx \n\n\n<html> <a name="Chapter10"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Part03"> <span style="font-size: 16px;"> <b> #. Chapter 10 Shiny Little Pixels </b> </span> </a>\n</div> </html>\n{{wrappingClass{ ▶ Per-pixel lighting : diffuse and specular lighting / advantage of per-pixel lighting to add pixel-level details to your objects by using bumpmaps and normal maps }}}\n\n<html> <span style="font-size: 16px;"> <b> Why Isn’t Vertex Lighting Enough? </b> </span> </html>\n\n(p.179) The interpolation of color resulting from the per-vertex lighting calculations does not give the same results as interpolating each component individually and then computing the result for each pixel.\n\n(p.180) When dealing with high polygon counts, per-vertex lighting can do well because each individual polygon covers little of the screen and each pixel suffers from little interpolation. \nHowever, when dealing with lower detail geometry, pixel-based lighting is the way to go!\n\nAnother advantage of per-pixel lighting is the ability to add detail that doesn’t exist in the original mesh. @@color(#0000ff): By using bumpmaps and normal maps @@, you can add bumpiness to your geometry on a per-pixel level, which doesn’t exist on the geometry but which creates the illusion of such detail through the use of proper lighting.\n\n<html> <span style="font-size: 16px;"> <b> Basic Pixel Lighting </b> </span> </html>\n\n(p.180) Now that you know the why behind per-pixel lighting, it is time to discuss the how.\nBecause the reason for the downfall of per-vertex lighting is its linear interpolation, you will need to determine which components of lighting are interpolatable.\n\nBased on those determinations, you will be able to move some of the lighting computing from the vertex shader to the pixel shader to ensure better lighting while keeping the graphics processor work to a minimum.\n\nIn regards to ambient lighting, because it is simply a constant color applied over the whole object, the results are the same whether it is done for each vertex or pixel. Therefore, I will not discuss ambient lighting any further in this chapter.\n\nIn the next two sections, I will go over both diffuse and specular lighting and help you create the new pixel-based lighting shaders. Note that because you will be doing the same process as done in the previous chapter, you will also use the same base shader.\n\n<html> <span style="font-size: 14px;"> <b> Diffuse Lighting </b> </span> </html>\n(p.181) From the end to the beginning, what defines diffuse lighting is the dot product between the surface normal and the light vector.\n\nThey can be passed to the pixel shader using TEXCOORD1 and TEXCOORD2. Applying the modifications yields the following output structure:\n\n#. Randering Pass: Object ( ps_2_0 / on the CD-ROM as as shader_1.rfx )\n\n{{{\nfloat4 Light1_Position;\nfloat4 Light1_Attenuation;\nstruct VS_OUTPUT\n{\n float4 inPos: POSITION;\n float3 inNormal: NORMAL;\n float2 inTxr: TEXCOORD0;\n};\n\nstruct VS_OUTPUT\n{\n float4 Pos: POSITION;\n float2 TexCoord: TEXCOORD0;\n float3 Normal: TEXCOORD1;\n float4 LightDir: TEXCOORD2;\n};\n}}}\ncf. LightDir.w의 값은 VS_OUTPUT ''vs_main''( ... ); 에서 Light1_Attenuation 값을 참조로 계산 >> Pixel shader로 전달\n\n(p.183) On the pixel shader end, the task is simply a matter of taking the incoming vectors and computing the dot product and the final lighting color. For convenience, the lighting code can be put in a function called ''Light_PointDiffuse''( ... );, as was done before in the per-vertex lighting shader. So in essence, the lighting computation code is the same as the vertex shader version.\n\nYou also need to add the input parameters to the pixel shader main function, ''ps_main''( ... );, so the interpolated normal and light direction can be read. With all those adjustments, you should end up with the following pixel shader:\n{{{\nfloat4 Light1_Color;\nfloat4 Light_PointDiffuse(float4 LightDir, \n float3 Normal,\n float4 LightColor)\n{\n // Compute suface/light angle based attenuation defined as dot(N,L)\n float AngleAttn = clamp(0, 1, dot(Normal, LightDir.xyz) );\n \n // Compute final lighting (Color * Distance Attenuation *\n // Angle Attenuation)\n return LightColor * LightDir.w * AngleAttn;\n}\n\nfloat4 ps_main(float3 inNormal:TEXCOORD1,\n float4 inLightDir:TEXCOORD2) : COLOR \n{\n // Compute the lighting contribution for this single light\n return Light_PointDiffuse(inLightDir,inNormal,Light1_Color);\n}\n}}}\n<html> <span style="font-size: 14px;"> <b> Specular Lighting </b> </span> </html>\n(p.184) With these modifications, the output structure should look as follows:\n\n#. Randering Pass: Object ( ps_2_0 / on the CD-ROM as as shader_2.rfx )\n\n{{{\nstruct VS_OUTPUT\n{\n float4 Pos: POSITION;\n float2 TexCoord: TEXCOORD0;\n float3 Normal: TEXCOORD1;\n float4 LightDir: TEXCOORD2;\n float3 HalfVect: TEXCOORD3;\n};\n}}}\n(p.186) On the pixel shader front, it is simply a matter of creating a function called ''Light_PointSpecular''( ... );, which will take the input vectors and compute the dot product. With this, you can then consider the lighting color and the distance attenuation. \n\n<html> <span style="font-size: 14px;"> <b> Putting It All Together </b> </span> </html>\n(p.187) Now we will put the components together to get a final lighting shader. From the point of view of the vertex shader, the per-pixel specular lighting shader computes all the components required, and no work is needed.\n\nFor the pixel shader, you need to create a new function, ''Light_Point''( ... );, which calculates both the diffuse and specular dot products and then combines the results to determine the final lighting value. With these simple changes, you should have the following pixel shader:\n\n#. Randering Pass: Object ( ps_2_0 / on the CD-ROM as as shader_3.rfx )\n\n+++[Results for the combined per-pixel diffuse and specular shader ]\n{{{\nfloat4 Light1_Color;\nfloat4 Light_Point(float3 Normal, float3 HalfVect, float4 LightDir,\n float4 LightColor)\n{\n // Compute both specular and diffuse factors\n float SpecularAttn = pow( clamp(0, 1,dot(Normal, HalfVect)),32);\n float DiffuseAttn = clamp(0, 1,dot(Normal, LightDir));\n \n // Compute final lighting\n return LightColor * LightDir.w * (SpecularAttn+DiffuseAttn);\n}\n\nfloat4 ps_main(float3 inNormal:TEXCOORD1, float4 LightDir:TEXCOORD2,\n float3 HalfVect:TEXCOORD3) : COLOR \n{\n // Output lighting color\n return Light_Point(inNormal,HalfVect,LightDir,Light1_Color);\n}\n}}}\n===\n\n\n(p.188) Results for the combined textured per-pixel diffuse and specular shader.\n\n#. Randering Pass: Object ( ps_2_0 / on the CD-ROM as as shader_4.rfx )\n\n<html> <span style="font-size: 16px;"> <b> Giving You Goose Bumps </b> </span> </html>\n\n(p.189) Now that you can light each pixel of your object individually, we can explore the topic of bumpmapping and normal mapping. \n<html>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_2004_Shaders_P&A_189.jpg" width=400>\n</html>\n\n<html> <span style="font-size: 14px;"> <b> Bumpmapping </b> </span> </html>\n(p.191) Within a pixel shader, all you need to do is take the interpolated surface normal and offset it by the bumpmap values.\n\n<html> <span style="font-size: 14px;"> <b> Tangent Space </b> </span> </html>\n(p.191) A more practical approach is to create a new uniform coordinate system, which is the same for every pixel on your object and can be built from your bump/normal texture. To accomplish this, you need to consider that if your object was not bumped, the normal for each point on the surface would be perpendicular to the surface.\n\n(p.192) When doing lighting with tangent space, all you need to do is build a tangent space matrix from the surface normal, tangent vector, and bi-normal vector. This matrix can then be used to transform any of the lighting components into this coordinate system by multi-plying it by the tangent space matrix.\n<html>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_2004_Shaders_P&A_192.jpg" width=400>\n</html>\n\n범프 매핑은 탄젠트 공간상의 법선을 노멀 맵에 저장하며, 탄젠트 공간은 normal이 항상 z축이 되는 공간이다.\ntangent와 binormal은 같은 평면 위에 존재하는 축으로, tangent와 binormal은 언제나 normal과 수직이지만 tangent과 binormal 끼리는 이론적으로 수직일 필요는 없다.(평면에 대한 수직축으로 정의)\n\n법선은 언제나 보는 사람을 향한 방향으로, tangent와 binormal은 폴리곤 평면과 평행한데 tangent는 x축을, binormal은 y축 방향으로 표현된다. 이 두 법선은 노멀 맵 텍스쳐의 uv 좌표계에 바로 대응되는데, u좌표가 tangent, v좌표가 binormal이 된다.\n\n(p.193) After you complete this operation, all your lighting components are interpolated relative to the local tangent space for each pixel. The following piece of code shows how you can construct a tangent space matrix and use it to convert a vector from object space to tangent space:\n{{{\n// Build the tangent space matrix\nfloat3x3 TangentSpace;\nTangentSpace[0] = inTangent;\nTangentSpace[1] = inBinormal;\nTangentSpace[2] = inNormal;\n\n// Transform a vector from object space to tangent space\nLightDir = mul(TangentSpace,LightDir);\n}}}\n<html> <span style="font-size: 14px;"> <b> Normal Maps </b> </span> </html>\n(p.194) The generated normal map texture can be found on the CD-ROM as FieldstoneBumpDOT3.tga. Remember to make sure that filtering is enabled on this new texture by setting the MINFILTER, MAGFILTER, and MIPFILTER to LINEAR in the texture object settings. \n\n#. Randering Pass: Object ( shader_2_0 / on the CD-ROM as as shader_5.rfx )\n\n+++[Results for the normal mapped per-pixel specular and diffuse lighting shader ]\nVertex shader code:\n{{{\nfloat4 Light1_Attenuation;\nfloat4 view_position;\nfloat4x4 view_proj_matrix;\nfloat4x4 inv_view_matrix;\nfloat4x4 view_matrix;\nfloat4 Light_Ambient;\nstruct VS_OUTPUT \n{\n float4 Pos: POSITION;\n float2 TexCoord: TEXCOORD0;\n float4 LightDir: TEXCOORD1;\n float3 HalfVect: TEXCOORD2;\n};\n\nVS_OUTPUT vs_main(float4 inPos: POSITION, float3 inNormal: NORMAL,\n float3 inTangent:TANGENT, float3 inBinormal:BINORMAL,\n float2 inTxr: TEXCOORD0)\n{\n VS_OUTPUT Out;\n\n // Compute the projected position and send out the texture coordinates\n Out.Pos = mul(view_proj_matrix, inPos);\n Out.TexCoord = inTxr;\n\n // Determine the distance from the light to the vertex and the direction\n float4 LightDir;\n LightDir.xyz = mul(inv_view_matrix,float3(80,00,-80)) - inPos;\n float Dist = length(LightDir.xyz);\n LightDir.xyz = LightDir.xyz / Dist;\n\n // Compute the per-vertex distance based attenuation\n LightDir.w = clamp(0,1, 1 / ( Light1_Attenuation.x +\n Light1_Attenuation.y * Dist + \n Light1_Attenuation.z * Dist * Dist ));\n\n\n // Determine the eye vector\n float3 EyeVector = normalize(view_position-inPos);\n\n // Transform to tangent space and output \n // half vector and light direction\n float3x3 TangentSpace;\n TangentSpace[0] = inTangent;\n TangentSpace[1] = inBinormal;\n TangentSpace[2] = inNormal;\n Out.HalfVect = mul(TangentSpace,normalize(LightDir.xyz+EyeVector));\n Out.LightDir = float4(mul(TangentSpace,LightDir.xyz),LightDir.w);\n\n return Out;\n}\n}}}\nPixel shader code:\n{{{\nfloat4 Light1_Color;\nsampler Texture0;\nsampler Bump;\nfloat4 Light_Point(float3 Normal, float3 HalfVect, float4 LightDir,\n float4 LightColor)\n{\n // Compute both specular and diffuse factors\n float SpecularAttn = pow( clamp(0, 1,dot(Normal, HalfVect)),16);\n float DiffuseAttn = clamp(0, 1,dot(Normal, LightDir));\n \n // Compute final lighting\n return LightColor * LightDir.w * (SpecularAttn+DiffuseAttn);\n}\n\n\nfloat4 ps_main(float2 inTxr:TEXCOORD0,float4 LightDir:TEXCOORD1,\n float3 HalfVect:TEXCOORD2) : COLOR \n{\n // Read bump and influence the normal\n float3 normal = tex2D(Bump,inTxr) * 2 - 1; \n\n // Output lighting color\n return tex2D(Texture0,inTxr)*\n (0.15+Light_Point(normal,HalfVect,LightDir,Light1_Color));\n}\n}}}\n===\n\n<html>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_2004_Shaders_P&A_196.jpg" width=280>\n</html>\n\n<html> <span style="font-size: 16px;"> <b> It’s Your Turn! </b> </span> </html>\n\n<html> <span style="font-size: 14px;"> <b> Exercise 1: DIRECTION LIGHTS </b> </span> </html>\n(p.197) To complete this shader, start off with the bumpmapped shader developed earlier and change the light to support a directional light.(감쇠가 없는 라이트 모델)\non the CD-ROM as as shader_ex1.rfx \n\n<html> <span style="font-size: 14px;"> <b> Exercise 2: MULTIPLE LIGHTS </b> </span> </html>\non the CD-ROM as as shader_ex2.rfx\n\n\n<html> <a name="Chapter11"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Part03"> <span style="font-size: 16px;"> <b> #. Chapter 11 Mirror, Mirror, On the Wall </b> </span> </a>\n</div> </html>\n{{wrappingClass{ ▶ Reflection, refraction, materials that exhibit both translucency and reflectivity }}}\n\n<html> <span style="font-size: 16px;"> <b> From Reflections to Refractions </b> </span> </html>\n\n(p.199) Many materials, as you know, have properties that allow them to either reflect or refract light. Probably the most obvious example is glass, which presents both phenomena at the same time. On the other hand, other materials that have glossy surfaces, such as car paint, also show reflections under the right lighting conditions.\n\n<html> <span style="font-size: 14px;"> <b> Reflections (반사) </b> </span> </html>\n(p.203) You may recall our discussion on specular lighting in Chapter 10, “Shiny Little Pixels.”\nLight from a source bounces off a polished surface onto the viewer. Although this may seem different from reflection, it is the same process. The specular lighting equation emulates the same phenomenon but from the point of view of a single light. The reality is that\nall visible objects in a scene can be seen as a source of light and treated in the same way, especially when you are dealing with highly glossy surfaces.\n<html>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_2004_Shaders_P&A_203.jpg" width=400>\n</html>\n\n(p.204) For this shader, you only need to do the reflection calculations on the vertex shader to maximize shader efficiency. \n\n#. Randering Pass: Environment ( ps_2_0 / on the CD-ROM as as shader_2.rfx )\n / Pixel shader에서 환경맵 적용 ; float4 ps_main(float3 dir: TEXCOORD0) : COLOR { return texCUBE(Environment, dir); }\n\n#. Randering Pass: Object \n+++[Screenshot of the reflection shader in action ]\nVertex shader code:\n{{{\nfloat4x4 view_proj_matrix;\nfloat4 view_position;\nstruct VS_OUTPUT \n{\n float4 Pos: POSITION;\n float2 TexCoord: TEXCOORD0;\n float3 Reflect: TEXCOORD1;\n};\n\nVS_OUTPUT vs_main(float4 inPos: POSITION, float3 inNormal: NORMAL,\n float2 inTxr: TEXCOORD0)\n{\n VS_OUTPUT Out;\n\n // Compute the projected position and send out the texture coordinates\n Out.Pos = mul(view_proj_matrix, inPos);\n Out.TexCoord = inTxr;\n\n // Compute the reflection vector\n Out.Reflect = -reflect(view_position-inPos,inNormal);\n\n return Out;\n}\n}}}\nPixel shader code:\n{{{\nsampler Wood;\nsampler EnvMap;\nfloat4 ps_main(float2 inTxr: TEXCOORD0,float3 inReflect: TEXCOORD1) : COLOR \n{\n // Output texture color with reflection map\n return 0.6*tex2D(Wood,inTxr)+0.4*texCUBE(EnvMap,inReflect);\n}\n}}}\n===\n\n\n<html> <span style="font-size: 14px;"> <b> Refraction (굴절) </b> </span> </html>\n(p.206) On the other end of the spectrum is the refraction effect. Translucent materials, such as glass, let rays of light through their surface. \n<html>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_2004_Shaders_P&A_206.jpg" width=620>\n</html>\n\nKeep in mind that the IOR generally varies slightly in relationship to the color of light. The values given in Table 11.1 assume a midrange yellow-colored light. \n\n#. Randering Pass: Object ( shader_2_0 / on the CD-ROM as as shader_3.rfx )\n\n+++[Rendering output for the final refraction shader ]\nVertex shader code:\n{{{\nfloat4x4 view_proj_matrix;\nfloat4 view_position;\nstruct VS_OUTPUT \n{\n float4 Pos: POSITION;\n float2 TexCoord: TEXCOORD0;\n float3 Refract: TEXCOORD1;\n};\n\nVS_OUTPUT vs_main(float4 inPos: POSITION, float3 inNormal: NORMAL, float2 inTxr: TEXCOORD0)\n{\n VS_OUTPUT Out;\n\n // Compute the projected position and send out the texture coordinates\n Out.Pos = mul(view_proj_matrix, inPos);\n Out.TexCoord = inTxr;\n\n float3 viewVec = normalize(view_position - inPos);\n\n // Compute the reflection vector using Snell's law\n // the refract HLSL function does not always work properly\n // n_i * sin(theta_i) = n_r * sin(theta_r)\n\n // sin(theta_i)\n float cosine = dot(viewVec, inNormal);\n float sine = sqrt(1 - cosine * cosine);\n\n // sin(theta_r)\n float sine2 = saturate(1.14 * sine);\n float cosine2 = sqrt(1 - sine2 * sine2);\n\n // Determine the refraction vector be using the normal and tangent\n // vectors as basis to determine the refraction direction\n float3 x = -inNormal;\n float3 y = normalize(cross(cross(viewVec, inNormal), inNormal));\n Out.Refract = x * cosine2 + y * sine2;\n\n return Out;\n}\n}}}\nOn the pixel shader side, all you need to do is sample the environment map and output the color as the following code does:\n{{{\nsampler Wood;\nsampler EnvMap;\nfloat4 ps_main(float2 inTxr: TEXCOORD0,float3 inRefract: TEXCOORD1) : COLOR \n{\n // Output texture color with reflection map\n return texCUBE(EnvMap,inRefract);\n}\n}}}\n===\n\n\n<html> <span style="font-size: 14px;"> <b> Walking Hand in Hand </b> </span> </html>\n(p.209) As you have seen from the rendering for the refraction shader, there are regions where no refraction occurs, and the result is a grayish color. The reason behind this result is not a coding error or similar glitch, but a natural phenomenon that occurs when dealing with refraction.\n\nIf you look at a container of water, such as an aquarium, dead-on, you will see through the water without any difficulty. However, if you look at the same container from a shallow angle, it will not be transparent anymore and will start behaving more like a mirror.\n\nThis phenomenon happens because refraction will stop happening past a certain angle, called the critical angle. At this angle, the refraction angle is equal to 90 degrees, and any incident rays past this angle exhibit a phenomenon called total internal reflection (or TIR), which in essence means that the surface will then behave as a mirror instead of being transparent. Figure 11.7 shows the transition of a refractive material towards TIR.\n<html>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_2004_Shaders_P&A_209.jpg" width=400>\n</html>\n\non the CD-ROM as as shader_4.rfx\nRendering for the combined reflection and refraction shader.\n\n<html> <span style="font-size: 16px;"> <b> Building Dynamic Environment Maps </b> </span> </html>\n\n(p.212) All these reflection and refraction shenanigans are nice for static scenes with one object, but when your scene gets more dynamic or contains many objects, our current scheme falls short. Because the environment map contains only a static, prebuilt scene, any reflections or refractions done with it will not contain any other objects in your scene.\n\nThe common solution to this problem is to use a dynamic cubemap instead of a static one. In this section I will briefly review how this can be achieved. Unfortunately, at the time of this writing, __RenderMonkey does not support using cubemaps as render targets__, so you will not be able to implement a shader with this technique.\n\n(p.213) The only other setting required for your camera to render cubemap faces is the field of view angle... all cubemap faces are of equal size, you need to set @@color(#FF0000): the FOV for your camera to 90 degrees.@@\n\nOne last consideration when creating dynamic environment maps is performance.\nBecause you must render each face individually, your scene needs to @@color(#FF0000): be rendered six times every time @@ you update the cubemap.\n\n<html> <span style="font-size: 16px;"> <b> It’s Your Turn! </b> </span> </html>\n\n<html> <span style="font-size: 14px;"> <b> Exercise 1: DOING IT ALL PER-PIXEL </b> </span> </html>\non the CD-ROM as as shader_ex1.rfx \n\n<html> <span style="font-size: 14px;"> <b> Exercise 2: COLOR-BASED REFRACTION </b> </span> </html>\n(p.214) For this exercise, you are asked to implement a refraction shader which considers the color dispersion due to the variation of the IOR based on the color of light. \n\non the CD-ROM as as shader_ex2.rfx \n\n\n<html> <a name="Chapter12"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Part03"> <span style="font-size: 16px;"> <b> #. Chapter 12 Not All Materials Are the Same </b> </span> </a>\n</div> </html>\n{{wrappingClass{ ▶ Bi-Directional Refractance Functions (BDRFs, 양방향반사도분포함수) ; such as velvet }}}\n\n(p.215) As you know by now, Part 3 mainly focuses on different materials and their behaviors when they are lit. So far, I have discussed simple lighting models, such as diffuse and specular, as well as reflection and refraction.\n...\nThis works fine for many cases, but every once in a while, you want to render a material that seems to defy the laws of physics when it comes to lighting. Don’t worry, the material isn’t really breaking any laws of nature; it’s simply behaving in a manner that isn’t consistent with our simplified models. Probably one of the most significant examples of this is ''velvet''.\n\n<html>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_2004_Shaders_P&A_216.jpg" width=400>\n</html>\n\n(p.216) As you can see in Figure 12.1, the lighting distribution lobe for a velvet-like material follows neither the specular nor the diffuse model. The shape of the lobe resembles more a flattened diffuse lobe, where more of the light is re-emitted at sharp angles.\n\n... Figure 12.2 illustrates how the light actually interacts with a velvet surface.\n\nThis being said, how can we light such materials? The answer comes from taking into account the angles of both the light and the viewer. One such way of representing this type of lighting is __by using a Bi-Directional Refractance Distribution Function, commonly referred to as BRDF__.\n\n<html>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_2004_Shaders_P&A_216_2.jpg" width=400>\n</html>\n\n<html> <span style="font-size: 16px;"> <b> BRDFs Are Your Friends </b> </span> </html>\n\n(p.217) BRDFs are one of many ways to represent lighting in a more correct way.\n...\nIn Figure 12.3, notice the light (incident) and view vector (reflected) angles. These are the same vectors you dealt with in regular diffuse and specular lighting.\n\n<html>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_2004_Shaders_P&A_217.jpg" width=400>\n</html>\n\nUnfortunately, there is no “fits-all”equation, nor is there a standard way of discovering the BRDF function for a specific material.\n\n<html> <span style="font-size: 14px;"> <b> Soft and Velvety </b> </span> </html>\n(p.218) For this, you need to consider what composes the surface of a velvet-like material. The surface of velvet is composed of a multitude of tiny little hairs. Those hairs cause the incident light to be reflected at an angle greater than normally occurs with specular lighting. \n\n... In 1941, a researcher named Minneart came up with a lighting equation for the subtle lighting of anisotropic surfaces and darkening at the edges of objects. As it turns out, his lighting model can be easily adapted to the lighting of velvet.\n\n<html>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_2004_Shaders_P&A_219.jpg" width=240>\n</html>\n\n(p.219) This is similar to the diffuse and specular lighting shader developed previously. Because velvet is considered an isotropic\nmaterial, all you need to send to the pixel shader is the surface normal, light direction, and eye vector. \n\n#. Randering Pass: Velvet (Minnaret) ( ps_2_0 / on the CD-ROM as as shader_1.rfx )\n\n+++[Minneart velvet shader ] \n{{{\nstruct VS_OUTPUT \n{\n float4 Pos: POSITION;\n float3 Normal: TEXCOORD0;\n float3 LightDir: TEXCOORD1;\n float3 EyeVect: TEXCOORD2;\n};\n\n//ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ\nfloat4 Light1_Color;\nfloat Velvet_Exponent;\nfloat4 Light_Velvet(float3 Normal, float3 EyeVect, float3 LightDir,\n float4 LightColor)\n{\n // Compute both the light and eye angle about the surface\n // normal for the surface\n float l = pow( clamp(dot(Normal, LightDir),0,1), \n Velvet_Exponent );\n float e = pow( clamp(dot(Normal, EyeVect),0,1),\n Velvet_Exponent );\n \n // Compute final lighting. Which is defined as the product\n // of the cosine of both the light and eye vectors.\n return LightColor * clamp(l*e,0.2,1);\n}\n\n\nfloat4 ps_main(float3 inNormal:TEXCOORD0, float3 LightDir:TEXCOORD1,\n float3 EyeVect:TEXCOORD2) : COLOR \n{\n // Call the lighting function and return the result\n return Light_Velvet(inNormal,-normalize(EyeVect),\n normalize(LightDir),Light1_Color);\n}\n}}}\n===\n\n\n(p.221) When doing an isotropic BRDF with a lookup texture, you will have two input variables, which correspond to the light and viewer angles. Making those inputs correspond to the U and V axes of the texture makes the process easy. You need to pre-compute the results of the lighting equation into a texture and then simply use the input parameters to perform a regular texture lookup. Although this may seem convoluted, it can be much more efficient than computing complex functions in real-time inside your pixel shader.\n\n<html>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_2004_Shaders_P&A_221.jpg" width=400>\n</html>\n\n<html> <span style="font-size: 14px;"> <b> Determining BRDFs </b> </span> </html>\n(p.222) The velvet shader you just developed was based on a lighting equation developed by Min-neart.\n...\nResearchers at Columbia University and Utrecht University have collaborated in a joint effort to explore the visual appearance of real-world surfaces. Their research has yielded a database of BRDF measurements for over 60 common, real-world materials. In addition to these BRDF samples, they have created best-matching functions of those materials for use with @@color(#0000ff): the Oren-Nayer or Koenderink lighting models @@. The database can be found online at ttp://www1.cs.columbia.edu/CAVE/curet/.\n\nThe simplest form of curve matching the Curet team has employed was to use the Oren-Nayer lighting model. This model uses three coefficients to represent a variety of mostly diffuse materials. Figure 12.6 shows the equation used by the Oren-Nayer model.\n\n<html>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_2004_Shaders_P&A_222.jpg" width=400>\n</html>\n\n+++[Table 12.1 Oren-Nayer Coefficients for Common Materials ]\n|!Material | !Rho [rho] | !Sigma | !Kd |\n|Artificial grass | 0.026120 | 1.378872 | 0.993315 |\n|Brick | 0.132886 | 0.893379 | 0.991720 |\n|Concrete | 0.668533 | 0.600672 | 0.994044 |\n|Corduroy | 0.439532 | 0.699112 | 0.972717 |\n|Cork | 0.249295 | 0.659956 | 0.960105 |\n|Cotton | 0.484087 | 0.482679 | 0.947116 |\n|Felt | 0.386790 | 0.414686 | 0.944892 |\n|Foil | 0.581514 | 0.252702 | 0.891302 |\n|Frosted glass | 0.142109 | 0.416384 | 0.907097 |\n|Human skin | 0.198588 | 0.579386 | 0.956055 |\n|Insulation | 0.556606 | 0.136013 | 0.884576 |\n|Lambswool | 0.325133 | 0.978133 | 0.966085 |\n|Leather | 0.579367 | 0.179776 | 0.926559 |\n|Limestone | 0.292841 | 0.413544 | 0.972684 |\n|Linen | 0.251781 | 0.514593 | 0.958734 |\n|Loofah | 0.527886 | 0.300436 | 0.973872 |\n|Moss | 0.006588 | 0.542447 | 0.996590 |\n|Orange peel | 0.526023 | 0.235808 | 0.876384 |\n|Plant | 0.141438 | 0.758465 | 0.986035 |\n|Plaster | 0.834116 | 0.362825 | 0.997624 |\n|Polyester | 0.379962 | 0.576862 | 0.959845 |\n|Rabbit fur | 0.457542 | 0.933632 | 0.973208 |\n|Roof shingle | 0.195128 | 0.819147 | 0.997328 |\n|Rough plastic | 0.480943 | 0.278057 | 0.969021 |\n|Rug | 0.444769 | 0.566478 | 0.961640 |\n|Sandpaper | 0.422396 | 0.513084 | 0.980324 |\n|Slate | 0.030252 | 0.356822 | 0.974449 |\n|Sponge | 0.301070 | 0.872413 | 0.967614 |\n|Stones | 0.561534 | 1.107168 | 0.996424 |\n|Straw | 0.282849 | 0.717587 | 0.978161 |\n|Styrofoam | 0.477248 | 0.509725 | 0.956598 |\n|Terrycloth | 0.619111 | 0.458514 | 0.973167 |\n|Velvet | 0.171323 | 0.751002 | 0.990415 |\n|Wood | 0.132031 | 0.598438 | 0.965061 |\n===\n\n\n(p.224) On the other hand, the Oren-Nayer function was developed to represent a broader class of BRDF functions.\n\n<html> <span style="font-size: 14px;"> <b> Oren-Nayer Velvet </b> </span> </html>\n(p.224) To implement an Oren–Nayer-based shader, you need to understand its equation. The first thing to notice is that the equation needs the surface normal, eye vector, light direction, and both of the tangent space angles. \n\n#. Randering Pass: Velvet (Oren-Nayer) ( ps_2_0 / on the CD-ROM as as shader_2.rfx )\n\n(p.227) the Oren-Nayer approach yields a reasonable estimation to rendering velvet through a BRDF. \n\n<html> <span style="font-size: 16px;"> <b> It’s Your Turn! </b> </span> </html>\n\n(p.227) BRDFs are a great way for you to represent lighting on somewhat unusual materials.\n\n<html> <span style="font-size: 14px;"> <b> Exercise 1: Exercise 1: USING LOOKUP TEXTURES </b> </span> </html>\n(p.227) In this chapter, you developed a velvet shader by using the Minneart equation. However, computing this equation on a per-pixel basis can be prohibitive.One solution to work around this is to precompute the result of the equation in a texture and then use this texture as a lookup table for the results based on the light and view angles about the surface normal.\n\nImplementing this shader is relatively simple, but you need to find a way to bake the results of the Minneart equation into a texture; this is the major challenge for this exercise.\n\nFor this shader, start with the Minneart equation and not the Curet database data. Using the Minneart equation and logic, you should be able to determine how to build the lookup texture with ease.\n\n#. Randering Pass: USING LOOKUP TEXTURES ( ps_2_0 / on the CD-ROM as as shader_ex1.rfx )\n\n<html> <span style="font-size: 14px;"> <b> Exercise 2: MULTIPLE BRDFs </b> </span> </html>\n(p.228) For this exercise, you simply need to take the Oren-Nayer BRDF shader developed in this chapter to implement various materials using data from the Curet database. This exercise is simply a matter of taking the Bi-Directional Refractance Distribution Function parameters for the Oren-Nayer implementation and calculating the A, B, and ρ _ π coefficients for the shader. For this exercise, you are asked to implement the BRDF shader for felt, skin, and corduroy.\n\n\n<html> <a name="Chapter13"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Part03"> <span style="font-size: 16px;"> <b> #. Chapter 13 Building Materials from Scratch </b> </span> </a>\n</div> </html>\n{{wrappingClass{ ▶ new materials procedurally ; Perlin noise, noise procedurally clouds or wood, marble }}}\n\n(p.229) In this chapter, I will show you a few techniques you can use to render materials in a procedural way where you do not need prebaked textures.\n\n... One of the most common techniques is using Perlin noise. This simple technique can be used to generate noise procedurally, and can be used to produce textures, such as clouds or wood. I will also take you through other techniques that can be used to render other noisy materials such as marble.\n\n<html> <span style="font-size: 16px;"> <b> Turning Up the Noise! </b> </span> </html>\n\n(p.230) Many materials and objects in nature have inherent random attributes. For example, trees and plants have well known shapes and randomness, which can be well approximated by fractals, mathematical functions combining both randomness and pattern repetition. On the other hand, some materials, such as wood or marble, have attributes that can be recreated through the clever use of simple noise functions such as Perlin noise.\n\nThis is where noise generation shaders can come in handy... \n\nIn Figure 13.1, you can see a noise texture that has been generated with Adobe Photoshop. The noise in this texture was created with a general random number generation function. This essentially means the noise has a Gaussian distribution, which in turn means that the noise has a perfectly random distribution and is unpredictable.\n<html>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_2004_Shaders_P&A_230.jpg" width=240>\n</html>\n... First of all, if you are to make materials from scratch, you want to have a noise function that can be recreated on demand.\n\n(p.231) The second thing to consider when deciding what makes a noise function practical is its smoothness.\n\nRemember when I said that the noise function in Figure 13.1 was useless. Well, it isn't completely useless. When using a technique such as Perlin noise, such a texture can be used as a base function to define a more complex final noise.\n<html>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_2004_Shaders_P&A_231.jpg" width=480>\n</html>\n\n(p.232) A one-dimensional example of this operation has been provided in Figure 13.3.\n<html>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_2004_Shaders_P&A_232.jpg" width=480>\n</html>\n\n(p.233) Having focused only on one-dimensional noise, let's start looking at more useful noise functions in either two or three dimensions. By using a two-dimensional noise function, you can create several different textures, such as clouds or even marble.\n\nThree-dimensional noise function can be even handier. By taking advantage of your hardware’s volume texture support, you can build 3D noise textures that can be used to render solid textures, such as wood. On the plus side, you can even use the third dimension\nas the time axis to create animated 2D textures, such as animated clouds.\n\ncf. ScreenAlignedQuad.3ds는 4x4 격자, 평면 오브젝트\n\n#. Randering Pass: Present (on the CD-ROM as as shader_1.rfx (Rendering result for a basic Perlin noise shader) )\n \nVertex shader code (vs_1_1):\n{{{\nfloat viewport_inv_width;\nfloat viewport_inv_height;\nstruct VS_OUTPUT {\n float4 Pos: POSITION;\n float2 texCoord: TEXCOORD0;\n};\n\nVS_OUTPUT vs_main(float4 Pos: POSITION){\n VS_OUTPUT Out;\n\n // Simply output the position without transforming it\n Out.Pos = float4(Pos.xy, 0, 1);\n\n // Texture coordinates are setup so that the full texture\n // is mapped completly onto the screen\n Out.texCoord.x = 0.5 * (1 + Pos.x - viewport_inv_width);\n Out.texCoord.y = 0.5 * (1 - Pos.y - viewport_inv_height);\n\n return Out;\n}\n}}}\n\n(p.234) you will be using the NoiseVolume.dds texture supplied with Render Monkey.\n\n(p.235) To combine multiple octaves of noise, you simply need to sample the noise texture multiple times and add the result together.\n\nPixel shader code (ps_2_0):\n{{{\nfloat time_0_1;\nfloat persistance;\nsampler Texture0;\nfloat4 ps_main(float2 texCoord: TEXCOORD0) : COLOR \n{\n // Sample only the first slice of the noise texture\n float3 txr = float3(texCoord,0);\n\n // Combine 4 octaves of noise together\n // Note: that the noise is considered signed but read from\n // an unsigned texture so it must be renormalized\n float final_noise = 0;\n for(int i=0;i<4;i++)\n final_noise +=(1.0/pow(persistance,i))*\n (tex3D(Texture0, txr*pow(2,i))*2-1);\n\n // Remove the sign from the noise\n return (final_noise+1)/2;\n}\n}}}\n\n<html> <span style="font-size: 14px;"> <b> Clouds, Clouds in the Sky </b> </span> </html>\n(p.236) For this example, we will assume that we are looking at the clouds as if we were seeing them from the ground. Cloud rendering gets more complicated as you get closer to the clouds. But with this assumption, clouds are seen as a clump of white puffy balls moving across the sky.\n\n#. Perlin noise-based cloud ; vs_1_1, ps_2_0 / on the CD-ROM as as shader_2.rfx\n\n<html> <span style="font-size: 14px;"> <b> Wood and Marble </b> </span> </html>\n(p.237) Marble is a constant-colored material with colored veins running through it. The noise can be used as a way to modulate the base color so that the veins are of a darker color.\n\n#. Procedural marble shader ; vs_1_1, ps_2_0 / on the CD-ROM as as shader_3.rfx\n<html>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_2004_Shaders_P&A_239.jpg" width=480>\n</html>\n\n(p.239) There is still one important aspect missing from the rings in wood. Those rings are concentric, circling around the center of the tree trunk, meaning the function needs to give a circular value along a specific plane. This can be done with the following code, which takes the dot product of two axes along a plane, creating a circular value on that plane. The following code shows how:\n\n{{wrappingClass{ Circle = dot(noisetxr.xy,noisetxr.xy); }}}\n\n#. Procedural wood texture ; vs_1_1, ps_2_0 / on the CD-ROM as as shader_4.rfx\n\n<html> <span style="font-size: 14px;"> <b> Using Noise to Move Things Around </b> </span> </html>\n(p.242) Now, keep in mind that this example is simplistic and somewhat pointless, but similar techniques can be used to create interesting effects. \n\n#. Noise-animated geometry ; vs_1_1, ps_2_0 / on the CD-ROM as as shader_5.rfx\n\n<html> <span style="font-size: 16px;"> <b> It’s Your Turn! </b> </span> </html>\n\n<html> <span style="font-size: 14px;"> <b> Exercise 1: ANIMATING CLOUDS </b> </span> </html>\nYou can use the built-in time_0_1 variable to access the third dimension of the noise texture so that it animates with time.\n\n#. vs_1_1, ps_2_0 / on the CD-ROM as as shader_ex1.rfx\n\n<html> <span style="font-size: 14px;"> <b> Exercise 2: RENDERING STRATA </b> </span> </html>\nIn this material, rocks of different colors are layered together. To render such a material, you need to use a one-dimensional texture containing the colors for each layer. This texture can be found as StrataSpline.dds on the CD-ROM.\n\n#. vs_1_1, ps_2_0 / on the CD-ROM as as shader_ex2.rfx\n\n\n<html> <a name="Chapter14"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Part03"> <span style="font-size: 16px;"> <b> #. Chapter 14 Why Does It Always Need to Look Real? </b> </span> </a>\n</div> </html>\n{{wrappingClass{ ▶ Non-photorealistic rendering ; Outline Rendering, Toon Shading, Real-Time Hatching }}}\n\n(p.245) In this chapter, I will discuss the topic of non-photorealistic rendering. As the name implies, this topic is wider than just rendering cartoonish graphics but refers to the general art of adapting your graphics to various non-realistic styles. In the first part of this chapter, I mostly focus on toon rendering techniques, which are the most used non-photorealistic rendering, or NPR, techniques. In the second half of the chapter, I will discuss the topic of hatching, which allows you to take advantage of the rendering hardware to render geometry in a such way that it looks as if it has been pencil-sketched.\n\n<html> <span style="font-size: 16px;"> <b> Just Like a Television Cartoon </b> </span> </html>\n\n(p.246) The first thing is the low number of colors used in both the texturing and lighting; this is something I will address later. \n\n<html> <span style="font-size: 14px;"> <b> Outline Rendering </b> </span> </html>\n(p.247) Rendering Pass: Render (pass index: #0)\nFor this shader, you need to create a first pass that takes an object and renders it to a render target. Refer to Chapter 5, “Looking Through a Filter,” if you need to brush up on this process. Just remember that the render target size should be set to match the viewport size, or you may experience aliasing in the final rendering.\n\n(p.248) Rendering Pass: Edge Detect (pass index: #1)\nFor this particular task, you will use a Sobel filter, which detects edges both horizontally and vertically.\n\ncf. Sobel edge detection filter used to render the object outline.\n\n#. Rendering the outline of an object using the edge detection method ; vs_1_1, ps_2_0 / on the CD-ROM as as shader_1.rfx\n\n<html> <span style="font-size: 14px;"> <b> Other Outlining Ideas </b> </span> </html>\n(p.249) Another shortfall of this method, depending on your situation, is that the method only renders the outer outline of the object. This makes sense because the whole object is rendered in a single opaque color, and then an edge detection algorithm is run on the result.\nImagine your teapot being oriented so the spout faces the camera. In this case, you would only get an outline for the teapot itself, not the spout.\n\n#. Rendering the outline of an object using the depth buffer ; vs_1_1, ps_2_0 / on the CD-ROM as as shader_ex1.rfx\n\n(p.251) Taking advantage of this property, you can render your object’s relative depth into a render target and then run a similar edge detection algorithm to determine the object’s outline from @@color(#FF0000): the depth discontinuities @@. \n...\nKeep in mind that this approach requires good precision normals and will not work well on low-polygon-count geometry.\n\n(p.252) It generally becomes a matter of choosing the one that matches the desired style and fits well within your rendering architecture. But for now, let’s move on to what is inside the outline: the actual object!\n\ncf. 바라보는 방향에 따라 shader_1.rfx에서는 teapot의 spout 부분(겹치는 부분)이 나타나지 않지만 shader_ex1.rfx에서는 Depth buffer의 값을 사용하기 때문에 실제 형태가 나타난다.\n\n<html> <span style="font-size: 14px;"> <b> Toon Shading </b> </span> </html>\n(p.252) Take, for example, the fieldstone.dds texture you have used several times so far. This texture has too many colors to use in a cartoonish environment. However, using an image editing program, such as Adobe Photoshop, you can stylize and reduce the number of colors on the texture.\n\n<html>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_2004_Shaders_P&A_252.jpg" width=400>\n</html>\n\n(p.253) After it’s compiled, this will give you a cartoonish textured object, with outline.\n\n#. the basic textured toon shader ; vs_1_1, ps_2_0 / on the CD-ROM as as shader_2.rfx\n ⇒ 포토샵에서 수정한 텍스처(Artistic Toon Texture)를 사용 \n\nJust a simple texture on your object may not be enough to do the trick.\n\n#. a textured and lit toon shader ; vs_1_1, ps_2_0 / on the CD-ROM as as shader_3.rfx\n\n(p.254) To render the object with cartoonish lighting, you need to modify the vertex shader code to render some lighting and reduce the number of shades in the final result.\n\n(p.255) On the pixel shader side, you already have the color of the final lighting. You need to reduce it to a discrete set of shades, as discussed earlier, and then modulate the result with the object’s texture. \n\n<html> <span style="font-size: 16px;"> <b> Real-Time Hatching </b> </span> </html>\n\n(p.256) In this section, I will introduce to you an approach that can simulate the shading accomplished when objects are hand-drawn. This shader, called real-time hatching, takes lighting information to render an object in a way that makes its lighting appear as if it were hand-shaded.\n\n#. the real-time hatching shader ; vs_2_0, ps_2_0 / on the CD-ROM as as shader_4.rfx\n\nThe tricky part with this shader is determining which two textures to use out of the set of six. For this to happen, you need to take advantage of the vertex shader 2.0 architecture... In addition to this, the fractional part of the texture gives you the interpolation factor between the two textures.\n<html>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_2004_Shaders_P&A_259.jpg" width=180>\n</html>\n\n<html> <span style="font-size: 16px;"> <b> It’s Your Turn! </b> </span> </html>\n\n<html> <span style="font-size: 14px;"> <b> Exercise 1: DEPTH-BASED OUTLINE </b> </span> </html>\n#. Rendering the outline of an object using the depth buffer ; vs_1_1, ps_2_0 / on the CD-ROM as as shader_ex1.rfx\n\n<html> <span style="font-size: 14px;"> <b> Exercise 2: SILHOUETTE AND TOON SHADING </b> </span> </html>\n(p.160) The task itself is simple but will require you to deduce a proper set of rendering states so that both the toon shaded object and outline combine properly together.\n\n#. vs_1_1, ps_2_0 / on the CD-ROM as as shader_ex2.rfx\n\n<html>\n<a href="#Part03"> ▷ 최상위로 ///////////////////////////////////////////////////////</a> <br>\n</html>\n
<html> <a name="Part02"> </html>\n(p.066) In Chapter 5, “Looking Through a Filter,” I will explore the basics needed to render screen-based effects, such as rendering your scene to a temporary texture and manipulating it through a shader. I will initially focus on color manipulation filters and other basic filters, such as blurs and other convolution filters. In Chap-ters 6,“Blurring Things Up,” 7,“It’s Getting Hot in Here,” and 8,“Making Your Day Brighter,” I will explain how to accomplish more powerful effects such as depth of field, heat haze, and high-dynamic range rendering.\n\nPart I From the Ground Up\nPart II Screen Effects\n[[Part III Making It Look Real]]\n[[Part IV Advanced Topics]]\nPart V Appendixes \n\n<html>\n<a href="#Chapter05"> #. Chapter 5 Looking Through a Filter </a> <br>\n<a href="#Chapter06"> #. Chapter 6 Blurring Things Up </a> <br>\n<a href="#Chapter07"> #. Chapter 7 It’s Getting Hot in Here </a> <br>\n<a href="#Chapter08"> #. Chapter 8 Making Your Day Brighter </a> <br>\n</html>\n\n<html> <a name="Chapter05"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Part02"> <span style="font-size: 16px;"> <b> #. Chapter 5 Looking Through a Filter </b> </span> </a>\n</div> </html>\n{{wrappingClass{ ▶ Vertex Shader에서 RenderTarget을 이용, 렌더링된 이미지를 Pixel Shader에서 그대로 출력하거나 흑백 이미지 등 출력 pixel color를 가공하는 방법을 소개 }}}\n\n(p.067) In this chapter, I will explore both color manipulation filters and simple pixel manip-ulation filters such as blurs. But before I can get deeper into those effects, I must explain some basic elements needed for all screen effect rendering. \nFirst, I will show you how you can render your scene to a temporary texture, and second, how to use this texture and present it to the user.\n\n<html> <span style="font-size: 16px;"> <b> Rendering to a Sketchpad </b> </span> </html>\n\nThe general process used to do screen effects is simple. ''First of all, the scene is rendered to a temporary texture instead of the regular screen buffer.'' After this has been done, the temporary texture is processed by the filter of your choice. The result is then put into the screen buffer to be presented to the user. So before you can even consider some of the effects, I need to teach you how to render your scene to a temporary texture. This will also prove valuable later, for other types of effects.\n\n(p.070) For the process to work, your geometry needs to be a simple rectangle, set up so that its coordinates match the corners of the screen in screen-space: (–1,–1,0), (1,–1,0), (–1,1,0) and (1,1,0). Such a pre-setup piece of geometry has been supplied with RenderMonkey in the file called @@color(#0000ff): ScreenAlignedQuad.3ds @@. Because the coordinates of the geometry are already supplied in screen space with this model, you don’t need to apply a projection matrix to the coordinates; you simply need to route them to the pixel shader.\n\n<html> <span style="font-size: 14px;"> <b> Texture Coordinates </b> </span> </html>\n(p.073) To correct for this, you need to offset the texture by half a pixel. In this case, because the width and height of the render target matches the size of the preview window, you can take advantage of the built-in variables viewport_inv_width and viewport_inv_height to properly offset the texture. \n...\n\nWhen the texture coordinate code and the vertex position code are combined, you should have the following final vertex shader code:\n\ncf. 간략한 구성\n#. Rendering Pass : Teapot\n ◎ RenderTarget\n\n#. Rendering Pass : Elephant\n ◎ RenderTarget\n\n#. Present Pass\n ● ScreenSpaceQuad.3ds\n ▣ Texture0\n ↗ Render Target\n{{{\nfloat4x4 view_proj_matrix;\nfloat viewport_inv_width;\nfloat viewport_inv_height;\n\nstruct VS_OUTPUT \n{\n float4 Pos: POSITION;\n float2 texCoord: TEXCOORD0;\n};\n\nVS_OUTPUT vs_main(float4 Pos: POSITION)\n{\n VS_OUTPUT Out;\n\n // Simply output the position without transforming it\n Out.Pos = float4(Pos.xy, 0, 1);\n\n // Texture coordinates are setup so that the full texture \n // is mapped completely onto the screen\n Out.texCoord.x = 0.5 * (1 + Pos.x - viewport_inv_width);\n Out.texCoord.y = 0.5 * (1 - Pos.y - viewport_inv_height);\n\n return Out;\n}\n}}}\n<html> <span style="font-size: 14px;"> <b> Finally Rendering Your Render Target </b> </span> </html>\n(p.074) ... To do that, sample the texture at the supplied texture coordinate and output the sam-pled color. But remember that you need to add a sampler variable to your pixel shader before you can do so. The resulting code for this pixel shader is as follows:\n\nVertex Shader에서 RenderTarget을 이용, 렌더링된 이미지를 Pixel Shader에서 그대로 출력\n{{{\nsampler Texture0;\nfloat4 ps_main(float2 texCoord: TEXCOORD0) : COLOR\n{\n // Simply read the temporary texture and send\n // the color to the output without manipulating it\n return tex2D(Texture0, texCoord);\n}\n}}}\n\n<html> <span style="font-size: 16px;"> <b> Don’t Adjust Your TV! </b> </span> </html>\n\n+++[Black and White, Like in the Old Times ]\n(p.075) Although this will give you a grayscale value, it is not totally correct because it assumes an equal weight for all color components. This is a flawed idea that assumes the human eye makes out all color components equally. The reality is that your eyes see color components differently, being most sensitive to green and least sensitive to the blues. Some researchers have determined estimated weights for the color perception of the human eye and have determined that intensity is determined as: \nIntensity = 0.299*Red + 0.587*Green + 0.184*Blue.\n\n#. Randering Pass: Filter_BW ( on the CD-ROM as shader_3.rfx )\n{{{\nsampler Texture0;\nfloat4 ps_main(float2 texCoord: TEXCOORD0) : COLOR\n{\n // Read the source color\n float4 col = tex2D(Texture0, texCoord);\n float Intensity;\n\n // Make it B&W, intensity defines as being\n // I = 0.299*R + 0.587*G + 0.184*B\n Intensity = 0.299*col.r + 0.587*col.g + 0.184*col.r;\n\n // Note, can also be done as a dot product such as\n Intensity = dot(col,float4(0.299,0.587,0.184,0));\n\n // Return the intensity as a uniform RGB color\n return float4(Intensity.xxx,col.a);\n}\n}}}\n===\n\n\n+++[Generalizations Are Good! ]\n(p.078) Grayscale conversion represented as a matrix operation.\n\n#. Randering Pass: Filter_MTX ( on the CD-ROM as shader_4.rfx )\n\n{{{\nfloat4x4 color_filter; // 외부에서 설정된 매트릭스 타입의 값을 링크 (각 요소들의 값은 미리 설정)\nsampler Texture0;\nfloat4 ps_main(float2 texCoord: TEXCOORD0) : COLOR\n{\n // Read the source color\n float4 col = tex2D(Texture0, texCoord);\n\n // Apply the matrix to the incoming color\n return mul(color_filter,col);\n}\n}}}\n===\n\n(p.079) Rendering output for your thermal imaging shader.\n출력색에 곱해지는 매트릭스의 각 요소를 설정함으로써 특정 분위기를 연출하는 예 \n\nBased on my description, you could come to the conclusion that the final color should be defined as something similar to the following, keeping in mind that the numbers below come from experimentation:\n\nColor.r = 0.1495*RT.r + 0.2935*RT.g + 0.057*RT.b + 0.5;\nColor.g = 0.1495*RT.r + 0.2935*RT.g + 0.057*RT.b + 0.25;\nColor.b = 0.1495*RT.r + 0.2935*RT.g + 0.057*RT.b;\n\n#. Randering Pass: Filter_MTX ( on the CD-ROM as shader_5.rfx )\n\n<html> <span style="font-size: 16px;"> <b> Blurring Things Up </b> </span> </html>\n\n(p.080) There are many types of filters, or filter kernels, which can be used to blur a texture. We'll start with what is commonly known as the box filter.\n\n(p.081) Such blurring and convolution filters require you to sample your texture multiple times. Each sample is at some offset from the current position and has some weight applied to it. Because of this, you can store the offsets and weight into a\nconstant array within the shader. For example, the following table shows how the four samples for your box filter can be represented in an array:\n\nconst float4 samples[4] = {\n -1.0, 0.0, 0, 0.25,\n 1.0, 0.0, 0, 0.25,\n 0.0, .0, 0, 0.25,\n 0.0 -1.0, 0, 0.25 \n};\n\nWith this representation, you can take advantage of a loop statement that iterates through all the elements of your array to compute the shader. For each iteration of the loop, you must sample the texture at the desired offset, weigh the result by the correct factor, and add the final value to an accumulation variable, repeating the process for every sample in\nyour filter. \n\n#. Randering Pass: Blur ( ps_2_0 / on the CD-ROM as shader_6.rfx )\n\n+++[Render output for a box filter blurring shader ]\n{{{\nfloat viewport_inv_width;\nfloat viewport_inv_height;\nsampler Texture0;\nconst float4 samples[4] = {\n -1.0, 0.0, 0, 0.25,\n 1.0, 0.0, 0, 0.25,\n 0.0, 1.0, 0, 0.25,\n 0.0, -1.0, 0, 0.25\n};\n\n\nfloat4 ps_main(float2 texCoord: TEXCOORD0) : COLOR \n{\n float4 col = float4(0,0,0,0);\n\n // Sample and output the box averaged colors\n for(int i=0;i<4;i++)\n col += samples[i].w*tex2D(Texture0,texCoord+\n float2(samples[i].x*viewport_inv_width,\n samples[i].x*viewport_inv_height));\n return col;\n}\n}}}\n===\n\n\n<html> <span style="font-size: 14px;"> <b> Bring on the Filters </b> </span> </html>\n(p.084) Rendering output for both the edge detection and image sharpening filters in action.\n매트릭스 설정에 따라서 다양한 filter 효과를 나타낸다.\n\non the CD-ROM as shader_6a.rfx and shader_6b.rfx\n\n<html> <span style="font-size: 16px;"> <b> Motion Blur </b> </span> </html>\n\n(p.085) Before you can write a motion blur shader, you should understand the process of how the effect happens using RenderMonkey. In essence, you will need to render your scene to a render target and then blend the current result with the previous output from the previous frame. \n\n<html> <span style="font-size: 14px;"> <b> Building the Motion Blur Shader </b> </span> </html>\nThe current pixel shader code simply samples the first texture and outputs it to Blur1. But now you want to blend two textures together. For this effect, you can simply sample both textures using the same texture coordinates, and interpolate between the two values based on the blend factor variable. With HLSL, this can easily be done by using the @@color(#0000ff): lerp @@ function, which will perform a simple linear interpolation between two values. \nThe pixel shader code that interpolates the two render targets is as follows:\n\n#. Randering Pass: Present ( ps_2_0 / on the CD-ROM as as shader_8.rfx )\n\n+++[Workspace and preview window for your motion blur effect ]\n{{{\nfloat4 blur_factor;\nsampler Texture0;\nsampler Texture1;\nfloat4 ps_main(float2 texCoord: TEXCOORD0) : COLOR \n{\n float4 col1 = tex2D(Texture0, texCoord);\n float4 col2 = tex2D(Texture1, texCoord);\n\n return lerp(col1,col2,blur_factor);\n}\n}}}\n===\n\n\n<html> <span style="font-size: 16px;"> <b> It’s Your Turn! </b> </span> </html>\n\n<html> <span style="font-size: 14px;"> <b> Exercise 1: OLD TIME MOVIE </b> </span> </html>\non the CD-ROM as as shader_ex1.rfx \n\n<html> <span style="font-size: 14px;"> <b> Exercise 2: GAUSS FILTER </b> </span> </html>\non the CD-ROM as as shader_ex2.rfx \n\n\n<html> <a name="Chapter06"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Part02"> <span style="font-size: 16px;"> <b> #. Chapter 6 Blurring Things Up </b> </span> </a>\n</div> </html>\n{{wrappingClass{ ▶ first real-life usable effect. <br> The effect is called depth of field (DOF) and can simulate the in- and out-of-focus properties that the human eye and video cameras perceive.(advantage of the blurring filters) }}}\n\n(p.089) In this chapter, you will learn about a common effect observed with the human eye and through photography called depth of field. I will explain how the effect occurs naturally so you can have a better understanding of its behavior. Then I will focus on a few possible implementations of such an effect that can be achieved with today’s hardware through the use of shaders, and conclude with considerations for future implementations on upcoming hardware.\n\n<html> <span style="font-size: 16px;"> <b> What Is Depth of Field? </b> </span> </html>\n\n(p.090) Depth of field, or DOF, is an effect that occurs naturally in the human eye and in photographic equipment. The first thing worth considering is what DOF actually is and how it occurs. \n<html>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_2004_Shaders_P&A_090.jpg" width=400>\n</html>\n(p.092) This has the side effect of allowing some of the light that is not converging perfectly at the center of the aperture to make it through to the receiver. This excess light then makes it to the receiver and causes unwanted blurring and distortions.\n...\nBecause of this flaw in our eyes and cameras, depending on the lens setup and aperture size, there is a region where most rays received will be straight and the image will appear crisp. However, going outside the region leads to an image that is rogressively more blurred and distorted. Depth of field, or DOF, refers to the in-focus region. \nThere are many ways to evaluate the focal distances used for DOF.\n\n<html> <span style="font-size: 16px;"> <b> It’s All About Faking It! </b> </span> </html>\n\n(p.093) You should keep in mind when developing effects, however, that re-creating an effect following the equations and theory isn't always the best. Sometimes the cost of doing an effect perfectly is too prohibitive. Other times, an effect is too subtle and needs to be exaggerated so it can catch the viewer's eye.\n... \nFirst, we’ll take a closer, more detailed look at blurring, which is common to all techniques.\n\n<html> <span style="font-size: 14px;"> <b> Blurring Things, Take Two </b> </span> </html>\n(p.094) Chapter 5: the box filter and the Gauss filter.\n...\nBecause the box filter is too simple and the Gauss filter needs two passes, we’ll try a new blur filter kernel that will do better than a box filter, but will be simple enough to fit in a single pass so it can be repeated several times.\n\nThis new filter kernel is essentially a simple 9-samples filter kernel.\nThis filter is simpler than the regular Gauss filter and can be performed in a single pass... this filter is essentially the expanded form of a 3-by-3 Gauss filter.\n\n#. Randering Pass: Blur ( ps_2_0 / on the CD-ROM as as shader_1.rfx )\n\n+++[3-by-3 Gauss filter를 확장한 filter ]\n{{{\nfloat viewport_inv_width;\nfloat viewport_inv_height;\nsampler Texture0;\nconst float4 samples[9] = {\n -1.0, -1.0, 0, 1.0/16.0,\n -1.0, 1.0, 0, 1.0/16.0,\n 1.0, -1.0, 0, 1.0/16.0,\n 1.0, 1.0, 0, 1.0/16.0,\n -1.0, 0.0, 0, 2.0/16.0,\n 1.0, 0.0, 0, 2.0/16.0,\n 0.0, -1.0, 0, 2.0/16.0,\n 0.0, 1.0, 0, 2.0/16.0,\n 0.0, 0.0, 0, 4.0/16.0\n};\n\nfloat4 ps_main(float2 texCoord: TEXCOORD0) : COLOR \n{\n float4 col = float4(0,0,0,0);\n\n // Sample and output the averaged colors\n for(int i=0;i<9;i++)\n col += samples[i].w*tex2D(Texture0,texCoord+\n float2(samples[i].x*viewport_inv_width,\n samples[i].y*viewport_inv_height));\n return col;\n}\n}}}\n===\n\n\n<html> <span style="font-size: 14px;"> <b> Depth Impostors </b> </span> </html>\n절두체 안의 영역(In-Focus)에서는 선명하게, 카메라의 Far_Distance 밖의 오브젝트에만 Bulur 효과를 준다.\n<html>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_2004_Shaders_P&A_097.jpg" width=400>\n</html>\n(p.098) The vertex shader code that handles the vertex position looks like this:\nOut.Pos = float4(Pos.xy, 0, 1);\n\nVertex shader에서 vertex position 관련 부분을 수정\nChanging this code to use the far and near distance variables yields the following:\n{{{\n// Set the position of the impostor so that it covers the screen.\n// The Z value is set to either Far_Dist or Near_Dist and the W\n// component is set to one so that no perspective occurs on the \n// geometry.\nOut.Pos = float4(Pos.xy, Far_Dist, 1);\n// Or for the near plane.\nOut.Pos = float4(Pos.xy, Near_Dist, 1);\n}}}\nVertex shader 수정과 함계 Render State도 수정이 필요\n\nshader_4.rfx의 구성\n<html>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_2004_Shaders_P&A_100.jpg" width=400>\n</html>\n\n<html> <span style="font-size: 14px;"> <b> Using the Alpha Channel </b> </span> </html>\n(p.106) The completed shader for this section can be found on the CD-ROM as shader_5.rfx. \nIn the second exercise at the end of this chapter, I invite you to simplify this shader by using a lookup texture that contains the relationship between depth and the blurring factor.\n\n<html> <span style="font-size: 14px;"> <b> Creating a Two-Pass DOF Shader </b> </span> </html>\nThis completed shader can also be found on the CD-ROM as shader_6.rfx.\n\n<html> <span style="font-size: 16px;"> <b> It’s Your Turn! </b> </span> </html>\n\n<html> <span style="font-size: 14px;"> <b> Exercise 1: MULTIPLE IMPOSTORS </b> </span> </html>\non the CD-ROM as shader_ex1.rfx.\n\n<html> <span style="font-size: 14px;"> <b> Exercise 2: USING A LOOKUP TEXTURE </b> </span> </html>\non the CD-ROM as shader_ex2.rfx.\n\n<html> <span style="font-size: 14px;"> <b> Exercise 3: USING INTERMEDIATE BLUR TEXTURES TO CREATE A SMOOTHER TRANSITION </b> </span> </html>\non the CD-ROM as shader_ex3.rfx.\n\n\n<html> <a name="Chapter07"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Part02"> <span style="font-size: 16px;"> <b> #. Chapter 7 It’s Getting Hot in Here </b> </span> </a>\n</div> </html>\n{{wrappingClass{ ▶ screen effect called heat haze, or heat shimmer. <br> Your bag of tricks now contains techniques to both blur and distort your environment. }}}\n\n(p.115) In this chapter you will learn where this effect comes from in the real world and how you can reproduce it in a 3D rendering environment.\n\n<html> <span style="font-size: 16px;"> <b> What Is Heat Haze? </b> </span> </html>\n\n(p.115) Heat haze, or heat shimmer, is an effect that occurs naturally in real life where an image seems distorted because of the rising air off a hot surface. This is commonly seen above asphalt pavement on a warm and sunny day. This phenomenon stems from a simple physical concept called refraction.\n\n<html> <span style="font-size: 16px;"> <b> Uses for Heat Haze </b> </span> </html>\n\n(p.118) In this chapter, you will learn that this basic effect can also be used to emulate effects, such as refraction for wavy water or even some nonrealistic sci–fi-type spatial distortions by using cleverly crafted distortion maps.\n\n<html> <span style="font-size: 14px;"> <b> It’s All About Distortion Maps </b> </span> </html>\n(p.118) The most important thing needed to create a heat haze effect is the ability to distort your render target when you copy it back to your frame buffer. This section will serve as a quick introduction to distortion and bumpmaps.\nThe process for the heat haze effect is simple. You render your scene to a render target, as you did in Chapter 5, “Looking Through a Filter,” and Chapter 6, “Blurring Things Up.” \nHowever, this time when you copy your render target pixels to the screen, you will distort them from their original state.\n\n(p.119) Based on the type of effect, different types of distortion maps can be used. Noisy ones can be well suited for effects such as heat haze, and more smooth ones can be used for effects such as wavy water refraction. Either way, there is one more detail that you must know about before you can use a distortion map.\n\nrenderTexture로 얻은 이미지 + (NoiseVolume.dds) distortion map = Pixel Shader에서 혼합\n\n#. Randering Pass: Heat_Impostor ( ps_2_0 / on the CD-ROM as as shader_3.rfx )\n{{{\nfloat OffsetScale; // a - 1\nsampler Texture0;\nsampler Texture1;\nfloat4 ps_main(float2 texCoord: TEXCOORD0) : COLOR \n{\n // Read and scale the distortion offsets\n float2 offset = tex3D(Texture1,float3(8*texCoord.x,8*texCoord.y,0)).xy; // (8*)는 texture 혼합시 상대적 강도 조절\n offset = ((offset*2.0)-1.0)*OffsetScale;\n \n return tex2D(Texture0,texCoord+offset);\n}\n}}}\n\n<html> <span style="font-size: 14px;"> <b> Putting a Background to Your Shader </b> </span> </html>\n(p.120) cube environment map (Snow.dds)을 사용\n\n#. Randering Pass: Environment ( ps_2_0 / on the CD-ROM as as shader_1.rfx )\n+++[Shader code ]\nVertex shader code:\n{{{\nfloat4x4 view_proj_matrix;\nfloat4 view_position;\nstruct VS_OUTPUT \n{\n float4 Pos: POSITION;\n float3 dir: TEXCOORD0;\n};\n\nVS_OUTPUT vs_main(float4 Pos: POSITION)\n{\n VS_OUTPUT Out;\n\n // Center environment around camera\n Out.Pos = mul(view_proj_matrix, float4(Pos.xyz + view_position, 1));\n Out.dir = Pos.xyz;\n\n return Out;\n}\n}}}\n\nPixel shader code:\n{{{\nsampler Environment;\nfloat4 ps_main(float3 dir: TEXCOORD0) : COLOR \n{\n // Sample and output the environment map color\n return texCUBE(Environment, dir);\n}\n}}}\n===\n\n\n(p.123) You also need to have the scene rendered to the frame buffer because the heat haze effect is used to enhance the scene and not to construct it in the first place. This means you also need to create, or copy from a previous shader, another pass node, which takes care of copying your render target back to the frame buffer after all objects have been rendered to it.\n\nThe final version of this template shader is included on the CD-ROM as shader_2.rfx.\n오브젝트 >> renderTexture >> 이미지 가동 방식으로 출력 \n\n<html> <span style="font-size: 16px;"> <b> Hitting the Pavement </b> </span> </html>\n\n(p.124) For this shader, you can simply use the base shader developed in the previous section and copy the depth impostor pass from the shader in Chapter 6. As with the depth impostor, you need to add the proper Far_Dist variable to your workspace, which I will call Heat_Dist.\n\n#. Randering Pass: Heat_Impostor ( ps_2_0 / on the CD-ROM as as shader_3.rfx )\n\n#. Randering Pass: Heat_Impostor ( ps_2_0 / on the CD-ROM as as shader_4.rfx )\n >> 애니메이션을 위해서 Pixcel shader에서 float time_0_1; 변수를 사용 (0~1)\n\n<html> <span style="font-size: 16px;"> <b> Looking Above the Flame </b> </span> </html>\n\n(p.127) This code is based on the ''ParticleSystem.rfx'' sample file included with RenderMonkey.\n\n(p.129) First of all, you need to re-create many of the variables that existed in the sample particle shader and that are needed by the particle rendering pass. These variables include particleShape, particleSize, particleSystemHeight, particleSpeed, particleSystemShape, and particleSpread. With these variables in place, you need to make a few more changes to the shader for it to render the heat haze effect.\n\n(p.131) The final version of this shader can be found on the CD-ROM as shader_5.rfx.\n >> Randering Pass: ParticleSystem 추가\n\n<html> <span style="font-size: 16px;"> <b> It’s Your Turn! </b> </span> </html>\n\n<html> <span style="font-size: 14px;"> <b> Exercise 1: YOUR OWN REFRACTION SHADER </b> </span> </html>\n(p.132) Here’s a way to exercise your creativity and create a full shader on your own. Make a simple scene, rendering both an environment map and a refractive teapot. Set up your scene so that the environment map is rendered in the background. Then render a teapot where you use the view_position vector for your camera and the refract built-in function to compute a new view direction to look up into the environment map.\n\nAlso remember that the air-to-glass refraction index is 1.33.\n\n#. Randering Pass: Object ( ps_2_0 / on the CD-ROM as shader_ex1.rfx )\n+++[Shader code ]\nVertex shader code:\n{{{\nfloat4 view_position;\nfloat4x4 view_proj_matrix;\nstruct VS_OUTPUT \n{\n float4 Pos: POSITION;\n float3 Normal: TEXCOORD0;\n float3 View: TEXCOORD1;\n};\n\nVS_OUTPUT vs_main(float4 inPos: POSITION, float3 inNormal: NORMAL)\n{\n VS_OUTPUT Out;\n\n // Compute the projected position and send out the normal\n Out.Pos = mul(view_proj_matrix, inPos);\n Out.Normal = normalize(inNormal);\n\n // Determine the view direction (i.e: eye vector) for our\n // refraction calculations\n Out.View = normalize(view_position-inPos);\n return Out;\n}\n}}}\n\nPixel shader code:\n{{{\nfloat indexOfRefractionRatio;\nsampler Environment;\nfloat4 ps_main(float3 inNormal: TEXCOORD0, float3 inView: TEXCOORD1) : COLOR \n{\n // Make sure all incoming vectors are normalized\n inNormal = normalize(inNormal);\n inView = normalize(inView);\n\n // Refraction texture lookup\n float3 refrVect = refract(-inView,inNormal,indexOfRefractionRatio).xyz;\n float4 refraction = texCUBE(Environment,refrVect);\n\n // Output refracted color\n return refraction;\n}\n}}}\n===\n\n\n<html> <span style="font-size: 14px;"> <b> Exercise 2: MAKING IT MORE LIVELY </b> </span> </html>\n(p.132) Also remember that for it to look good, your distortion map should animate upwards to give the impression that the hot air is rising.\n\non the CD-ROM as shader_ex2.rfx \n\n\n<html> <a name="Chapter08"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Part02"> <span style="font-size: 16px;"> <b> #. Chapter 8 Making Your Day Brighter </b> </span> </a>\n</div> </html>\n{{wrappingClass{ ▶ High dynamic range (HDR) ; Glare, Streaks, Lens Flares (렌더링 속도에는 좋지못함) }}}\n\n<html> <span style="font-size: 16px;"> <b> What Is High Dynamic Range? </b> </span> </html>\n\n(p.134) @@color(#0000ff): High dynamic range (HDR) is the science of recognizing the different intensity levels of light. @@\n\n<html> <span style="font-size: 14px;"> <b> Glare </b> </span> </html>\n(p.134) Probably the most common effect that comes out of bright intensity light is the glare effect. A bright source of light exhibits a blooming effect, where it can even take over neighboring regions that stand between the light and the receiver.\n\nThis effect is caused by the way the human eye and photography equipment work; excess lighting energy affects not only a particular point on the receiver but also neighboring points. In fact, the excess light energy leaks onto its surroundings, creating a glow-like\neffect often referred to as glare, or blooming.\n\n<html> <span style="font-size: 14px;"> <b> Streaks </b> </span> </html>\n(p.135) You may have noticed when driving in a car that sometimes street lights and headlights seem to have a star-like glow around them. This phenomenon is generally due to internal reflections and refractions caused by microscopic scratches on the glass surface of the\ncamera lens. The same thing happens through your car windshield because it is not a well polished surface.\n\nLater in this chapter, I will explain how you can re-create this effect using specifically designed blur filters. These filters blur the bright portions of the render target in a diagonal manner instead of the standard way it has been done with the regular blur filters.\n\n<html> <span style="font-size: 14px;"> <b> Lens Flares </b> </span> </html>\n(p.135) Lens flares, or ghosts, are commonly seen effects when you see film or photography of a bright source of light such as the sun. This is probably one of the first HDR effects ever used in video games. This phenomenon comes from the fact that the bright light source is reflected between the different lenses of a camera, creating ghost images of the bright lights.\n\nVideo games have reproduced this effect by creating fake billboard geometry, placed suitably depending on where the source of light is. In this chapter, you will learn how to generically reproduce this with proper filters.\n\n<html> <span style="font-size: 16px;"> <b> A Few HDR Basics </b> </span> </html>\n\n<html> <span style="font-size: 14px;"> <b> What About Floating-Point Textures? </b> </span> </html>\n\n<html> <span style="font-size: 14px;"> <b> What About Floating-Point Textures? </b> </span> </html>\n(p.136) What this means for you is that the color values in a floating-point texture are represented in a way that enables you to represent any numerical value.\n\nBecause HDR does not require such a great range, 16-bit textures will be used for the ren-der targets throughout this chapter, especially the A16R16G16B16 format.\n\n<html> <span style="font-size: 14px;"> <b> Exposure Control: The First Step </b> </span> </html>\n(p.137) For this example, we will be adding HDR information to the environment map.\n\n#. Randering Pass: Environment ( ps_2_0 / on the CD-ROM as as shader_1.rfx )\n{{{\nfloat Exposure_Level; // 강도 조절을 위한 변수\nsampler Environment;\nfloat4 ps_main(float3 dir: TEXCOORD0) : COLOR \n{\n // Read texture and determine HDR color based on alpha\n // channel and exposure level\n float4 color = texCUBE(Environment, dir);\n return color * ((1.0+(color.a*64.0))* Exposure_Level);\n}\n}}}\n\n<html> <span style="font-size: 14px;"> <b> A Note on Automatic Exposure Control </b> </span> </html>\n(p.139) The human eye adjusts its iris automatically to adapt to the surrounding light. This is a behavior you might want to emulate in your rendering.\n\nAutomatic exposure control aims to adjust the average brightness of the scene. The idea is that the average brightness of the scene should be around 0.5 because the displayable intensity range is from zero to one. If the average brightness is known, the exposure value can be determined with\n\nExposure = 0.5 / Average_Brightness;\n\nKeep in mind that you wish the exposure to slowly adapt and not change instantaneously.\nTo do this, you could use the following code:\n\nExposure = lerp(Exposure, 0.5 / Average_Brightness, Exposure_Adjust_Speed);\n\nYou need to determine the average brightness of the scene, which isn’t an easy task. \n\n<html> <span style="font-size: 16px;"> <b> Time for Some High Dynamic Range Effects </b> </span> </html>\n\n<html> <span style="font-size: 14px;"> <b> Your First HDR Shader: The Glare! </b> </span> </html>\n(p.139) The glare phenomenon is caused by the energy from a bright source of light not only exciting the area it contacts but also leaking onto neighboring areas. Because of this leaking, this phenomenon can easily be simulated using a properly selected sequence of blur filters.\n\n(p.141) These intermediate blurring results will be used within the glare shader a little later. Keep in mind that you need to create multiple render targets to account for this and for the intermediate results needed.\n\nThe final version of this shader is included on the CD-ROM as shader_2.rfx.\n\n<html> <span style="font-size: 14px;"> <b> Time for Some Streaking! </b> </span> </html>\n(p.143) To estimate this effect, you need to create a star pattern. This can be achieved by using a specific blur filter, which acts in a specific direction, causing a streak in that direction. This filter is simple and involves the use of four samples, which are taken along a specific diagonal. Figure 8.6 illustrates how this filter works.\n\n<html>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_2004_Shaders_P&A_143.jpg" width=400>\n</html>\nthe final version of this shader is included on the CD-ROM as shader_3.rfx.\n\n<html> <span style="font-size: 14px;"> <b> Lens Flare Free-for-All </b> </span> </html>\nthe final version of this shader is included on the CD-ROM as shader_4.rfx.\n\n<html> <span style="font-size: 14px;"> <b> Putting It All Together </b> </span> </html>\n(p.148) Putting all the effects together is simply a matter of combining all the render targets and render passes of each individual effect. This can be done with the Copy and Paste options on the right-click menu.\n\nThis shader is included on the CD-ROM as shader_5.rfx.\n\n<html> <span style="font-size: 16px;"> <b> Solutions for Today’s Hardware </b> </span> </html>\n\n(p.150) Although the use of floating-point textures and render targets is the ideal way of implementing high dynamic range effects, it is not necessarily well suited to today’s hardware.\n@@color(#0000ff): At the time of this writing, support for such features is sparse, and its speed is not so good. @@\nAlthough in the future, floating-point textures will be the way to go, you need a solution that works on most of today’s hardware architectures.\n\nBecause you cannot use floating-point textures, you need a way to represent light intensity with less precision.\n\nthis shader on the CD-ROM as shader_6.rfx.\n(Figure 8.12 Rendering the final HDR shader using @@color(#FF0000): non-floating-point textures @@.)\n\n<html> <span style="font-size: 16px;"> <b> It’s Your Turn! </b> </span> </html>\n\n<html> <span style="font-size: 14px;"> <b> Exercise 1: USING A BIG FILTER </b> </span> </html>\non the CD-ROM as shader_ex1.rfx.\n\n<html> <span style="font-size: 14px;"> <b> Exercise 2: USING A BIG FILTER </b> </span> </html>\non the CD-ROM as shader_ex2.rfx.\n\n\n<html>\n<a href="#Part02"> ▷ 최상위로 ///////////////////////////////////////////////////////</a> <br>\n</html>\n
#. 504동 1501호\n\n입주지정기간 ; 2016년 12월 12일(월) - 2017년 02월 28일(화)\n/ 임금 시 동호수 또는 계약자명으로 입금 ; "501-501" 또는 "홍길동"\n/ www.bando.co.kr 납입대금 조회(화면하단 왼쪽)\n\n|부가세제외(토지가+건물가) |181,200,000 | | |\n| 1,2차 계약금| | !18,096,020| |\n| 중도금| | 108,769,900| |\n| 미납금| | 54,334,080| 113-2004-2112-01|(주)반도종합건설 |입주지원센터 055-367-9562~5 |\n| 옵션미납금| | 5,500,000| 113-2004-3529-00| | |\n| 후불제 보증료| | 325,550| 113-2004-3528-03| | |\n| 선수관리비| | 201,000| 113-2007-9406-04|(주)명건 |관리사무소 055-367-8051 |\n\n남양산지점 ; 055-365-0175, 고선희 과장, 장정아 대리\n취득세 세율(1.1%) = 취득세 1.0% + 지방교육세 0.1% ; 양산시청 세무과 055-392-2207
<html> <a name="Part04"> </a> </html>\n\n{{wrappingClass{ ▶ Fog, Volumetric fog, Animation 관련 함수(time_0_1, time_0_2PI 등), keyframing and skinning 이론 설명 }}}\n\nPart I From the Ground Up\n[[Part II Screen Effects]]\n[[Part III Making It Look Real]]\nPart IV Advanced Topics\nPart V Appendixes\n\n<html>\n<a href="#Chapter15"> #. Chapter 15 Watch Out for That Morning Fog </a> <br>\n<a href="#Chapter16"> #. Chapter 16 Moving Objects Around </a> <br>\n<a href="#Chapter17"> #. Chapter 17 Advanced Lighting </a> <br>\n<a href="#Chapter18"> #. Chapter 18 Shadowing </a> <br>\n<a href="#Chapter19"> #. Chapter 19 Geometry Tricks </a> <br>\n</html>\n\n<html> <a name="Chapter15"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Part04"> <span style="font-size: 16px;"> <b> #. Chapter 15 Watch Out for That Morning Fog </b> </span> </a>\n</div> </html>\n{{wrappingClass{ ▶ (mostly static) Fog (by the hardware), Volumetric fog }}}\n\n(p.263) Fog is an important aspect of rendering that is often neglected. In addition, it has often been used in the past as a way to optimize performance by restricting how far you can see..\n\nThroughout this chapter, I will introduce you to the basic concepts of fog and how such phenomena occur in real life. Armed with this knowledge, you will understand various fogging techniques, ranging from hardware-accelerated fog to a volumetric fogging technique.\n\n<html> <span style="font-size: 16px;"> <b> The Basics of Fog </b> </span> </html>\n\n(p.264) In Figure 15.1, you can see that this interaction has two consequences. First, some of the light coming at the viewer straight from the light is deflected away, thus reducing the perceived light intensity. The second effect is that light not oriented at the viewer is deflected back towards the viewer.\n<html>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_2004_Shaders_P&A_265.jpg" width=460>\n</html>\n\n(p.265) This is even more important when dealing with atmospheric scattering, which can yield very complex equations. I will discuss better mathematical guesses for outdoor atmospheric effects at the end of this chapter, but for now, let's focus on emulating simple fog using your rendering hardware.\n\n<html> <span style="font-size: 16px;"> <b> Hardware Fog </b> </span> </html>\n\n(p.265) Most 3D video cards have built-in hardware support for fog. It would be ridiculous not to take advantage of it to add atmospherics to your scene at near-zero cost. In fact, the only cost to you is the computation of the fogging intensity; the calculation as to how this fog is applied to the end result is done automatically by the rendering hardware. The hardware, depending on its level of support, allows several forms of basic fogging to be applied to your geometry.\n\nBased on current specifications, hardware can support both per-vertex and per-pixel fogging models. \n\n(p.266) The fogging hardware can be controlled through a set of render states defining many parameters. The first parameters are to enable the fogging hardware and control the start and end of the fog region. They are named D3DRS_FOGENABLE, D3DRS_FOGSTART, and D3DRS_FOGEND. This region, defined by the start and end render states, establishes where the fog effect starts becoming visible and at which point it is at full intensity.\n\n... If the hardware supports it, you can turn on such a radial mode with the D3DRS_RANGEFOGENABLE render state.\n\nKeep in mind that this is the color to be used when full fog is present. As fog creeps in, this value is blended with your object’s color in a way proportionate to the fog ratio determined by the hardware.\n<html>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_2004_Shaders_P&A_266.jpg" width=400>\n</html>\n\n#. Render State ( on the CD-ROM as as shader_1.rfx )\n / D3DRS_FOGCOLOR\n / D3DRS_FOGENABLE\n / D3DRS_FOGSTART\n / D3DRS_FOGEND\n / D3DRS_RANGEFOGENABLE - TRUE (Range Fog), FALSE (Distance Fog)\n / D3DRS_FOGTABLEMODE - D3DFOG_NONE, D3DFOG_EXP, D3DFOG_EXP2, D3DFOG_LINEAR\n\n(p.267) Under normal circumstances, the use of hardware fog is simply a matter of setting a few render states and letting the hardware take care of the rest. However, the situation is somewhat different when dealing with a vertex shader.\n\nBecause of the programmable nature of vertex shaders, you cannot simply set render states and have the fog render. Because the hardware has no control over the rendering of the geometry, an output register with the semantics of FOG has been created. It is your responsibility to set this value to the appropriate fog level. This has the effect of overriding the following render tates: D3DRS_FOGSTART, D3DRS_FOGEND, and D3DRS_FOGTABLEMODE. When using vertex shaders, you need to determine the proper fogging value yourself. It may mean a little more work, but in the end, it gives you much more flexibility. After you set a value for your FOG output variable, the hardware automatically blends in the appropriate amount of fogging.\n\n(p.269) __Because the fogging is actually handled by the hardware__, the pixel shader code does not need to do anything special beyond sampling the object’s texture and outputting its color.\n\n● Figure 15.5 Rendering the hardware-accelerated fog shader. ( ps_2_0/ on the CD-ROM as as shader_1.rfx )\n{{{\ncf. Vertex Shader OUTPUT 구조체 정의\nstruct VS_OUTPUT \n{\n float4 Pos: POSITION;\n float2 Txr1: TEXCOORD0;\n float1 Fog: FOG;\n};\n// Set the fog based on a zero fog start and fixed end distance \n// 오브젝트와의 거리만를 기준으로 안개의 농도 계산\nOut.Fog = pow(1-((Pos.z)/650),4);\n}}}\n\n<html> <span style="font-size: 14px;"> <b> Not Just Your Everyday Fog </b> </span> </html>\n(p.270) Applying this new shader code to the shader you previously developed yields a height-based fog similar to the one shown in Figure 15.6. The final version of the shader is included on the companion CD-ROM as shader_2.rfx.\n{{{\n// Set the fog proportional to the Y height.\n// With a vertex shader, the fog can be set to any value you wish. \n// Because you wish a screen height in the proper range, you must divide the\n// Y component by the W component to take perspective into account.\n// 바닥에 깔리는 포그 연출\nOut.Fog = (2*Pos.y/Pos.w)+1;\n}}}\n<html>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_2004_Shaders_P&A_270.jpg" width=400>\n</html>\n\n<html> <span style="font-size: 14px;"> <b> Giving Your Fog a Little Depth </b> </span> </html>\n(p.271) To achieve something like this, you need to be able to create your fog in a volumetric way.\nUnfortunately, for something like this, you cannot count on support from the hardware and will need to generate it yourself.\n\n...how do you go about rendering such a fog volume? The answer lies in using render targets to store the depth of the fog object. By using two render targets, one for the depth of the front-facing faces and one for the back-facing ones, you can render your object twice and save the depths.\n\n(p.272) To render those two render passes, you need to store the depth of the object in the render target...\n각 Rendering Pass마다 Render State를 설정해야 된다.\n\n|!Rendering Pass |!D3DRS_ALPHABLENDENABLE |!D3DRS_BLENDOP |!D3DRS_SRCBLEND |!D3DRS_DESTBLEND |!D3DRS_CULLMODE |\n|#. Teapot_Fog_Back ⇒ Rander Target: Back |TRUE |D3DBLENDOP_ADD |D3DBLEND_ONE |D3DBLEND_ONE |D3DCULL_CCW |\n|#. Teapot_Fog_Front ⇒ Rander Target: Front |(TRUE) |(D3DBLENDOP_ADD) |(D3DBLEND_ONE) |(D3DBLEND_ONE) |D3DCULL_CW |\n|#. Fog = Front + Back |(TRUE) |(D3DBLENDOP_ADD) |(D3DBLEND_ONE) |(D3DBLEND_ONE) |D3DCULL_NONE |\ncf. Renderable Texture ; 512 X 512 (A8R8G8B8) \n\n● Figure 15.8 Rendering a volumetric fog object. ( ps_2_0/ on the CD-ROM as as shader_3.rfx )\n\n(p.273) the depth is computed in a single component and output to the texture color, this gives you only eight bits of precision, which is usually less than adequate for such a task.\n\n● Figure 15.9 Rendering output for the increased resolution volumetric fog shader. ( ps_2_0/ on the CD-ROM as as shader_4.rfx )\n || shader_3.rfx 과는 달리 pixel shader에서 전체적인 정밀도를 높이는 코드 추가\n\n(p.274) Didn’t we use a technique to do just this in Chapter 6, “Blurring Things Up”? By taking advantage of the different color components to store different levels of precision for your depth, you can increase your total precision.\n\n... you will notice that we only use 32 values for each component, thus only using five bits of precision.\n\nApplying this to the previous shader requires you to change the pixel shader for your depth rendering passes to encode the depth received from the vertex shader into the different color components. \n\n● Figure 15.10 Rendering the volumetric fog shader interacting with a solid object. ( ps_2_0/ on the CD-ROM as as shader_5.rfx )\n\n(p.275) So far you have only rendered volume fog as an individual object, but in reality, your fog needs to interact with other geometry. The technique overviewed, does not take care of this situation but fortunately, there is a simple solution to the problem.\n<html>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_2004_Shaders_P&A_277.jpg" width=600>\n</html>\n\n<html> <span style="font-size: 16px;"> <b> Rendering the Atmosphere </b> </span> </html>\n\n(p.277) In this section, I will discuss briefly some techniques that can be used to render real outdoor atmospherics using better approximations... For this section, I will not implement a full shader for the approaches discussed because it is not a trivial task to perform with RenderMonkey.\n<html>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_2004_Shaders_P&A_278.jpg" width=480>\n</html>\n\n(p.278) There are a wide range of different models that can be used to render outdoor atmospherics, all varying in realism and complexity. The CIE model is simple and gives good results for the sky atmospherics in a clear sky environment.\n\n...I invite you to read the Siggraph paper at: http://www.ati.com/developer/SIGGRAPH03/PreethamSig2003CourseNotes.pdf.\n\n<html> <span style="font-size: 16px;"> <b> It’s Your Turn! </b> </span> </html>\n\n<html> <span style="font-size: 14px;"> <b> Exercise 1: ROUND FOG </b> </span> </html>\n(p.279) For this exercise, you are asked to expand the hardware-accelerated fog shader developed earlier in this chapter. You need to render your object in a way so that the fog is in a circular pattern around the center of the object. To do so, you need to take the distance of\nthe object from the center of the screen, using its screen space position and scaling appropriately to ensure you have enough fogging.\n● on the CD-ROM as as shader_ex1.rfx \n\n\n<html> <a name="Chapter16"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Part04"> <span style="font-size: 16px;"> <b> #. Chapter 16 Moving Objects Around </b> </span> </a>\n</div> </html>\n{{wrappingClass{ ▶ Animation 관련 함수(time_0_1, time_0_2PI 등), keyframing and skinning 이론 설명 }}}\n\n(p.281) ...In this chapter, I will introduce to you some animation techniques that are commonly used in computer graphics and can be optimized by taking advantage of the hardware acceleration of vertex shaders.\n...\nUnfortunately, at the time of the writing of this book, RenderMonkey has no built-in support for animation. Because the situation is likely to change with future releases of the tool, I still want to introduce you to the topic of nimations and give you code snippets that may come in handy later on.\n\n<html> <span style="font-size: 16px;"> <b> Light, Camera, Action! </b> </span> </html>\n\nBecause the topic of this chapter is animation, it makes sense to start with a simple form of animation. Remember that we previously discussed procedural vertex animations in Chapter 13, “Building Materials from Scratch”? Let me refresh your memory.\n\nUsing a Perlin noise function and a time-based variable such as @@color(#0000ff): time_0_1 @@, you can offset vertices of an object at run-time.\n\n(p.282) Using a built-in variable such as @@color(#0000ff): time_0_2PI @@, you can input this offset time value into a sine/cosine function to determine the position along a circular path. \n...\nNow let’s move on from this simple form of animation to something that is more useful. Not everything is composed of randomly deforming meshes or rotating planets. \n\n<html> <span style="font-size: 14px;"> <b> Object Metamorphosis </b> </span> </html>\n(p.283) Keyframing is similar to the way still frame animations are done. Under ideal circumstances, you store the mesh for each position, or frame, within your animation. \n\n(p.284) you can take advantage of the HLSL built-in lerp function.\nThe following vertex shader code illustrates how the positions of two keyframes can be interpolated:\n{{{\nstruct VS_OUTPUT\n{\n float4 Pos: POSITION;\n};\n\nVS_OUTPUT vs_main(float4 inPos_1: POSITION, float4 inPos_2: POSITION)\n{\n VS_OUTPUT Out;\n\n // Blend the two animation frames together\n float4 inPos = lerp(inPos_1,inPos_2,animation_blend);\n\n // Compute the object position.\n Out.Pos = mul(view_proj_matrix, inPos);\n return Out;\n}\n}}}\n\n(p.286) The cool thing with keyframe interpolation-based animation is that you can animate more than just the position of your object. Any component that can be interpolated can be animated. \n...\nYou generally need to renormalize your vectors after they have been interpolated. The following code snippet shows you how:\n\n{{wrappingClass{ float3 normal = normalize(lerp(inNormal1,inNormal2,animation_blend); }}}\n\n(p.287) Although this animation technique gives you a great amount of flexibility, even with proper keyframing it can consume large amounts of memory. \n\n<html> <span style="font-size: 14px;"> <b> Of Skin and Bones </b> </span> </html>\n(Skinning) This technique can be somewhat more restrictive but works well when animating characters and is much more memory efficient.\n\n(p.290) Skinning is a very efficient technique to animate characters within your scene. It does require more initial setup and art work but will pay off in the memory savings. In addition, you can potentially use the skeletal structure of your character and procedurally animate it by combining several animations or by applying some form of inverse kinematics. Skinning might seem more expensive by looking at the vertex shader code, but a four-bone skinning shader can be implemented on the vertex shader 1.1 architecture.\n\n<html> <span style="font-size: 16px;"> <b> It’s Your Turn! </b> </span> </html>\n\nBecause most of the topics covered in this chapter cannot currently be implemented under RenderMonkey, there is no homework for this chapter. Enjoy!!\n\n\n<html> <a name="Chapter17"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Part04"> <span style="font-size: 16px;"> <b> #. Chapter 17 Advanced Lighting </b> </span> </a>\n</div> </html>\n{{wrappingClass{ ▶ Outdoor Scene Lighting, Polynomial texture map (PTM with bumpmap, self-shadowing), Spherical Harmonics. }}}\n\n(p.291) The goal of this chapter is to introduce you to some of these techniques and how they can be used in current and future rendering architectures.\n...\nLet’s move on and start by exploring a simple custom-built lighting model that can work well for both outside and indoor scenes.\n\n<html> <span style="font-size: 16px;"> <b> Outdoor Scene Lighting </b> </span> </html>\n\n(p.292) Rendering objects in an outdoor environment can be tricky. Because of the interreflections of the objects in your scene, the lighting in the environment comes from all directions. \n\ncf.(p.307) By taking such an approach, you can make your ambient lighting for outdoor scenes much more realistic at a relatively low cost. In addition, this technique can be expanded to take into account local mesh phenomena such as self-shadowing.\n\n<html> <span style="font-size: 14px;"> <b> Some General Approaches </b> </span> </html>\nThe problem with this approach is determining the number, positions, and colors of those lights in the first place.\n\nThe cubemap itself can be used to represent a pure reflection, but when dealing with simple specular and diffuse lighting, you have to change your approach slightly. Specular lighting is almost like reflection, but it is slightly more diffused, or fuzzy.\n\n...Figure 17.1 illustrates the results for a cubemap, along with its specular and diffuse version.\n<html>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_2004_Shaders_P&A_293.jpg" width=480>\n</html>\ncf. 환경맵인 큐브맵을 활용해서, specular와 diffuse lighting를 렌더링에 추가함으로써 실외 환경을 재현\n\n(p.294) Although the blurring process does not give the same result as a real integration, it does factor in the lighting contribution from neighboring pixels.\n\n<html> <span style="font-size: 14px;"> <b> Hemisphere Lighting Model </b> </span> </html>\n<html>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_2004_Shaders_P&A_294.jpg" width=240>\n</html>\n\n(p.294) To achieve the appropriate blend, you need to determine the proportion of the microfacet hemisphere that corresponds to the sky and ground portions.\n\n● Figure 17.4 Rendering result for the hemisphere shader.(on the CD-ROM as as shader_1.rfx )\n\n... With this, your vertex shader simply needs to take in the vertex normal, compute the blending factor, and use the lerp function to blend both colors. The following is the resulting vertex shader: (in Vertex Shader 1.1)\n{{{\nfloat4x4 view_proj_matrix;\nfloat4 sky_color;\nfloat4 ground_color;\nstruct VS_OUTPUT\n{\n float4 Pos: POSITION;\n float4 Diff: COLOR;\n float4 Tex: TEXCOORD;\n};\nVS_OUTPUT vs_main(\n float4 inPosition: POSITION,\n float4 inNormal: NORMAL,\n float4 inTex: TEXCOORD )\n{\n VS_OUTPUT Out; \n\n // Transform the position and output the texture coordinate\n Out.Pos = mul( view_proj_matrix, inPosition);\n Out.Tex = inTex;\n\n // Determine the sky/ground factor\n float factor = (dot(inNormal, float3(0,-1,0)) + 1.0)/2.0;\n\n // Determine final lighting color\n Out.Diff = lerp(sky_color,ground_color,factor);\n Out.Diff.a = 1.0;\n\n return Out;\n}\n}}}\n(p.295) The pixel shader simply needs to take in the determined lighting color and modulate this interpolated value with the texture color of your object, yielding the following pixel shader code: (in Pixel Shader 2.0)\n{{{\nsampler color_map;\nfloat4 ps_main(\n float4 inDiff: COLOR, \n float4 inTex: TEXCOORD ) : COLOR\n{\n // Return the hemisphere color modulated\n // with the color of the base texture\n return inDiff * tex2D(color_map, inTex);\n}\n}}}\n(p.296) Why is this technique so awesome? There are a few reasons worth mentioning; the first is the quality of the rendering results versus its ease of implementation. It is essentially a great, low-cost way of representing ambient lighting.\n\nAnother interesting point of this approach is that you can use it to represent @@color(#FF0000): self-occlusion @@, or @@color(#FF0000): self-shadowing @@. If you determine a self-shadowing factor for each vertex, you can use this value to attenuate the lighting coming in from the ambient hemisphere lighting. \n...\nI will not explain exactly how to determine the shadowing factors because that is outside the scope of this book, but you do need to remember that such a technique only works well for a solid mesh, which does not animate or deform over time.\n\n<html> <span style="font-size: 16px;"> <b> Polynomial Texture Maps (PTM) </b> </span> </html>\n\ncf.(p.307) The advantage of PTMs is that, by taking lighting samples for different angles, you can formulate the lighting of each pixel in terms of a polynomial equation, which can then be evaluated at run-time, allowing more surface detail to be present, such as BRDF characteristics and self-shadowing.\n\n<html> <span style="font-size: 14px;"> <b> Combining BRDF and Bumpmapping </b> </span> </html>\n(p.297) In this section, I will introduce a new texture mapping technique called polynomial texture maps. They are a new form of texture representation that enables you not only to consider micro-details, such as the elevations on a surface, but also to take into account self-shadowing and some BRFD-like properties of your object’s material. Before you can write a polynomial texture map, or PTM shader, let’s look at how this all works.\n<html>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_2004_Shaders_P&A_297.jpg" width=240> <br>\n<br>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_2004_Shaders_P&A_298.jpg" width=240> <br>\n</html>\n(p.298) This leaves you with six coefficients, which can be determined by passing a set of lighting values through a curve-matching algorithm. By applying this curve-matching to the set of lighting images you determined earlier, you can determine a set of coefficients per-pixel. Those coefficients enable you to approximate the lighting in relationship to the lighting angle for each of the pixels in your texture map.\n...\nWith six coefficients to represent, you can use two textures to store this side information.\nSamples are provided with RenderMonkey and are named tablet_a012.tga and tablet_a345.tga. Also keep in mind that because the polynomial coefficients can be signed, proper scale and bias will need to be applied to the texture.\n\n<html> <span style="font-size: 14px;"> <b> Building the Shader </b> </span> </html>\n(p.299) Developing a shader for polynomial texturing is straightforward. Because ''the polynomial information is stored in a texture'', the bulk of the work needs to be done on the pixel\nshader. The only thing the vertex shader needs to do is to transform the lighting vector into tangent space so that we may discover a per-pixel U and V coefficient for you to eval-\nuate the polynomial.\n\n● Figure 17.9 Rendering result for the polynomial texture map shader for various lighting directions. (on the CD-ROM as as shader_2.rfx )\n\nTo accomplish this, you need to transform the light vector into tangent space. This means you need to set up your stream mapping so that it returns @@color(#0000ff): the normal, tangent, and binormal for the vertex @@. \n\n(p.300) The pixel shader for PTM is significantly more complex. Access to the polynomial textures is simple, but you need to prepare the lighting vector to be useful. The first step is to normalize the lighting vector and extract the U and V components. \n\n(p.301) As you can see in Figure 17.9, the image from different angles takes into account __not only the bumpiness but also more subtle details, such as self-shadowing__.\n\n<html> <span style="font-size: 16px;"> <b> Spherical Harmonics </b> </span> </html>\n\n... These allow you to represent the lighting from a single environment as seen from a single point.\ncf.(p.307) By taking advantage of the low frequency characteristics of diffuse lighting, you can represent environmental lighting for a single point in space through a small set of frequency harmonics wrapped around a sphere.\n\n<html> <span style="font-size: 14px;"> <b> The Basic Idea </b> </span> </html>\n(p.303) For this chapter, we will not create our own coefficients, but will use a predetermined set from an environment map of a cathedral. The coefficients have been extracted from this environment map and are presented in matrix form in Figure 17.12. Using this set of coef- ficients on an object yields lighting that would simulate the lighting of an object within this environment.\n\n<html>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_2004_Shaders_P&A_303.jpg" width=600>\n</html>\n\n<html> <span style="font-size: 14px;"> <b> Lighting with Spherical Harmonics </b> </span> </html>\n(p.304)... For this shader, you also need to set your stream mapping to export the vertex normal; it will be useful for lighting.\n\nIn this particular shader, we will accomplish the lighting ''on a per-vertex basis''. In the exercise at the end of this chapter, you will be asked to do the same task on a per-pixel basis.\n\n● Figure 17.13 Rendering result for the spherical harmonic shader. (vs_1_1, ps_2_0 / on the CD-ROM as as shader_3.rfx )\n\n(p.306) If you want to push things even further, there are additional uses for spherical harmonics. For example, they can be used to represent self-shadowing coefficients, as well as self-reflections on a mesh. Spherical harmonics are an interesting approach to lighting and with the increase of rendering power will most likely become a more common approach in the future.\n\n<html> <span style="font-size: 16px;"> <b> It’s Your Turn! </b> </span> </html>\n\n<html> <span style="font-size: 16px;"> <b> Exercise 1: PER-PIXEL SPHERICAL HARMONICS </b> </span> </html>\n(p.306) For this exercise, you are asked to take the spherical harmonics shader developed earlier in this chapter and expand it to do its operations per-pixel. To do so, you simply need to move some of the variables from the vertex shader to the pixel shader and compute your lighting for each pixel.\n\n● vs_1_1, ps_2_0 / on the CD-ROM as as shader_ex1.rfx\n{{{\nstruct VS_OUTPUT\n{\n float4 Pos: POSITION;\n float4 Tex: TEXCOORD0;\n float3 Normal: TEXCOORD1;\n float3 Tangent: TEXCOORD2;\n float3 Binormal: TEXCOORD3;\n};\n\nVS_OUTPUT vs_main(\n float4 inPosition: POSITION,\n float4 inNormal: NORMAL,\n float4 inTex: TEXCOORD,\n float4 inTangent: TANGENT,\n float4 inBinormal: BINORMAL )\n{\n VS_OUTPUT Out; \n...\n return Out;\n}\n// Out.Normal, Out.Tangent, Out.Binormal 정보를 Pixel Shader로 보내서 \n// Pixel Shader에서 bump, spherical harmonic 계산\n}}}\n\n\n<html> <a name="Chapter18"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Part04"> <span style="font-size: 16px;"> <b> #. Chapter 18 Shadowing </b> </span> </a>\n</div> </html>\n{{wrappingClass{ ▶ Shadow mapping (determine accurate per-pixel shadows), Shadow Volumes (the z-buffer + hardware support of stencil buffers) }}}\n\n<html> <span style="font-size: 16px;"> <b> The Basics of Shadows </b> </span> </html>\n\n(p.310) Shadows are a byproduct of lighting and, under some circumstances, can be an even more important visual cue than the lighting itself. \n...\nWhen rendering a scene with lighting, you and the hardware have no knowledge of whether a source of light is occluded by another object. Because of this, shadowing does not happen naturally and must be artificially re-created. Because you can't know about light occlusions, you cannot do shadowing as part of your regular lighting process and must render shadows as a secondary process.\n<html>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_2004_Shaders_P&A_310.jpg" width=360> <br>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_2004_Shaders_P&A_311.jpg" width=360>\n</html>\n\n(p.311) Although it would be nice for them to be part of the lighting process itself, occlusions cannot be easily determined at run-time and are generally kept for more advanced rendering techniques, such as ray tracing.\n\n(p.312) Because the old-style techniques work well for flat receiving surfaces, they worked well back when the geometry for the game worlds was simple enough. But with today's complex environments, these techniques just can't cut it; they lead to serious visual problems. Because of this, new techniques needed to be developed to take advantage of the latest hardware and to ensure that the shadows themselves can conform to any kind of receiver within your scene.\n\nIn the next two sections, I will talk about two of the most commonly used shadowing techniques today. In the first section, I will discuss shadow mapping, which takes advan- tage of render targets to determine accurate per-pixel shadows on your geometry. In the second section, I will discuss shadow volumes, which take advantage of some properties of shadows and hardware support of stencil buffers.\n\n<html> <span style="font-size: 16px;"> <b> Shadow Mapping </b> </span> </html> - determine accurate per-pixel shadows\n\n(p.312) For this to happen, you have to consider an aspect of shadowing. If you take a look at your scene from the point of view of the light, shadowed regions correspond to the portions of the scene that are behind the object occluding the light. In rendering terms, any object whose depth is greater than the occluder's from the point of view of the light will be in shadow.\n<html>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_2004_Shaders_P&A_313.jpg" width=360>\n</html>\n\n● Figure 18.4 Rendering result for various light positions of the shadow mapping shader. (on the CD-ROM as as shader_1.rfx )\n\n(p.313) For the purpose of this shader and to better illustrate the shadow, I have opted for an ani- mating source of light. The light is set up to rotate in a circle, based on time, slightly above the shadow casting object. The code used to animate the position of the light is as follows:\n\nlightPos.x = cos(1.321 * time_0_X);\nlightPos.z = sin(0.923 * time_0_X);\nlightPos.xz = 100 * normalize(lightPos.xz);\nlightPos.y = 100;\n\n▷ ''Rendering Pass: Depth'' (pass index: #0) - 라이트 관점에서, Vertes Shader에서 이미지 생성\n / Render Target: ShadowMap\n\n(p.315) You may have noticed that the output variable lightVec from the vertex shader is simply the vertex position in light-space. Because we want to be precise, we need to find out the exact radial distance from the light's viewpoint. \n...\nKeep in mind that the preceding pixel shader assumes that you are rendering your depth to a floating-point render target. If you were to render it to a fixed-point texture, you will need to adapt the pixel shader to appropriately encode the depth into a set of red, green, and blue components.\n\n▷ ''Rendering Pass: Object'' (pass index: #1) - 오브젝트에 비치는 그림자 처리\n / Model: Elephant\n / Texture: ShadowMap, SpotLight\n\n(p.315) ... First of all, you need to find out the light-space position of your vertex so you can get the depth value from the occluder depth texture. To do this, you need to find out the light-space vertex position and project this value; the code for this is the same as the one used when building your depth map.\n...\nThe second thing you need is the depth of this pixel in light-space. \n\n(p.317) This is done as a simple specular and diffuse lighting using the following code:\n\ndiffuse = saturate(dot(lightVec, inNormal));\nspecular = pow(saturate(dot(\nreflect(-normalize(viewVec), inNormal), lightVec)),16);\n\n▷ ''Rendering Pass: Platform'' (pass index: #2) - 바닥에 비치는 그림자 처리\n / Model: Disc\n / Texture: ShadowMap, SpotLight\n\n(p.319) This process can be applied to any receiver objects within your scene. For the purpose of this shader, it has been applied both to the occluder and a floor object that has been put within the scene. Keep in mind that you generally need to include the occluder object as part of the receivers because the back side of the object will be in shadow, and you should take into account self-shadowing.\n...\n... The first one involves hardware support. Some of the current hardware has built-in hardware support for shadow mapping and will take care of the light-space depth test for you automatically.\n\n(p.320) The second point I need to discuss is that shadow mapping leaves you with a hard shadow. In fact, this algorithm leaves you with a sharp shadow edge without any penumbra. If you remember our discussion earlier, most lights are not perfect point lights; you may want to take that into account so that your shadows have soft edges.\n...\n... Also, this technique requires you to render receivers multiple times if you want to account for multiple shadows.\n\n<html> <span style="font-size: 16px;"> <b> Shadow Volumes </b> </span> </html> - the z-buffer + hardware support of stencil buffers\n\nin-shadow and out-of-shadow regions 결정이 필요\n / 오브젝트는 막힌 공간으로 구성 되어야 하고 normal 계산을 수행\n (분리된 vertices로 인해 'stitching' polygons이 추가될 수도 있음)\n / the z-buffer + hardware support of stencil buffers\n\n\n(p.320) I need to warn you about one thing beforehand. Because of the nature of shadow volume, they currently cannot be implemented under RenderMonkey. Because of this, I will dis- cuss the technique and give pieces of code where appropriate, but no actual shader will be developed.\n<html>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_2004_Shaders_P&A_321.jpg" width=320>\n</html>\n\n(p.321) ... you can discover whether any edge is in-shadow, out-of-shadow, or part of the boundary. To determine this, you need to look at each face that makes up the edge. Using the face normal, you can discover whether a particular face is shadowed or not. If, for a particular edge, one face is shadowed and the other isna€™t, then this particular edge defines the boundary for the shadow volume.\n\n... In practical terms, it means that the mesh itself needs to be closed and that each edge of your mesh belongs to two, and only two, faces. .. This is because, for the volume shadow algorithm to work properly, __''the volume that is generated needs to be fully closed''; it needs a full boundary without any gaps.__\n\n(p.322) The trick to getting a shadow out of your volume is to take advantage of both the z-buffer and the stencil buffer that is offered by the rendering hardware. The approach to this is very similar to the one taken earlier to render volumetric fog.\n...\nAfter you render all your shadow volumes, you can simply do a full-screen pass of a dark- ening color, which checks for nonzero values. This leaves darkening values where receivers intersect with the shadow volumes.\n<html>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_2004_Shaders_P&A_322.jpg" width=360>\n</html>\n\n(p.323) This is a simple as it gets. The whole process is pretty simple, but there are a few caveats that you will need to keep in mind. The first problem arises when the shadow volume intersects the front clipping plane of the camera. This clipping plane prevents the whole volume from being displayed, leading to an incorrect stencil buffer count, which in turn leads to wrong shadowing. \n\nThe last major problem is that the shadow volume needs to be determined on the CPU, one of the main reasons why we could not create a shader under RenderMonkey. On the bright side, with a little cleverness, there is a way to avoid building the silhouette on the CPU, which is the topic of this next section\n\n<html> <span style="font-size: 14px;"> <b> Taking Advantage of the Hardware </b> </span> </html>\n(p.323) In essence, with shadow volumes, you want to determine the silhouette of where the in-shadow and out-of-shadow regions meet.\n<html>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_2004_Shaders_P&A_323.jpg" width=360>\n</html>\n\n(p.324) As you may have noticed, this process requires you to change your mesh ahead of time. By detaching the vertices and adding "stitching"? polygons ahead of time, you can do a one- time process on the CPU that enables you to construct your silhouette at run-time on the graphics processor.\n\nThis brings us to how you determine the silhouette on the graphics processor. With the proper mesh and information, the task is simple. You need to find out if the face normal, which is stored on each vertex, is in shadow. This is done simply by computing a dot prod- uct of the normal with the light direction vector. If the vertex itself is in shadow, simply offset its position in the direction of the light by some sufficient amount. The following code illustrates how this can be performed:\n{{{\nvoid vs_main(\n float3 inPos : POSITION,\n float3 inNormal : NORMAL)\n{\n // Determine vert/light vector\n float3 LightDir = normalize(inPos ? lightPosition);\n\n // If face is facing away from light, offset it\n if (dot(LightDir,inNormal)>0)\n inPos.xyz = inPos.xyz + LightDir*100;\n\n // Transform the vertex position\n Out.Pos = mul(view_proj_matrix,inPos);\n}\n}}}\n\n<html> <span style="font-size: 16px;"> <b> It’s Your Turn! </b> </span> </html>\n\n<html> <span style="font-size: 14px;"> <b> Exercise 1: SOFT SHADOW MAPPING </b> </span> </html>\n● on the CD-ROM as as shader_ex1.rfx\n\n\n<html> <a name="Chapter19"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Part04"> <span style="font-size: 16px;"> <b> #. Chapter 19 Geometry Tricks </b> </span> </a>\n</div> </html>\n{{wrappingClass{ ▶ Level of detail (LOD, Static LOD, Progressive LOD, Re-Creating Lost Details) / Displacement Mapping <br> ; To balance your rendering between quality and performance }}}\n\n(p.327) Throughout this book, I have focused mostly on rendering topics that have hovered around lighting and materials. These approaches are critical in creating more realistic and stunning graphics, but with the advances in rendering technologies, meshes and scenes are becoming more and more complex and dense.\n\nEven though the hardware can handle more complex meshes, you want to maximize your scene complexity by using a minimum of geometry.\n\n... In this chapter, I will introduce to you a variety of level of detail, or LOD, techniques that can be used to dynamically control the quality and detail of your geometry... you need to balance your rendering between quality and performance.\n\nIn addition to introducing you to LOD techniques, I will spend a little time revisiting the topic of procedural geometry. In this chapter I will especially focus on displacement mapping, which allows you to get geometry data not only from a vertex buffer but from other sources, such as textures. I will teach you how these techniques will be applicable through the use of shaders.\n\n<html> <span style="font-size: 16px;"> <b> Level of Detail </b> </span> </html>\n\n<html> <span style="font-size: 14px;"> <b> Static LOD </b> </span> </html>\n ; LOD 레벨과 카메라 거리와의 관계 등으로 good quality를 유지하는 변환이 쉽지 않음\n\n(p.329) The first simple metric is to use the size of a polygon. Keeping in mind that LOD meshes are used when a model is at a certain distance from the camera, smaller polygons have less of a visual impact and can be removed. This can easily be accomplished by determining the area of the polygon and using this value to discover which polygons will be removed first.\n<html>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_2004_Shaders_P&A_329.jpg" width=320>\n</html>\n\n(p.330) No matter which approach is taken, you need to ensure that the quality of each level of detail is sufficient to ensure good rendering quality. Even so, you need to determine at which time any particular LOD needs to be displayed. There are two factors that come into play when trying to determine this: visual needs and performance.\n\nWhen discussing visual needs, you need to determine at which distance from the camera it is appropriate to switch from one LOD to another. \n\n... I know this is a rough metric, but there is no fits-all solution for you to use, and you need to experiment with a more proper metric based on your circumstances.\n...\nKeeping all this in mind, static LOD techniques are simple and easy to implement. Because there is no fits-all metric, you may need to experiment some to find the best balance in your application One of the biggest drawbacks to static LODs, however, isn’t the different levels of geometry but the transition from one to another. Because you need to change from one mesh to another at a specific point in time, even though both meshes are of good quality, it is likely the user will notice the transition. \n\nTo reduce such artifacts, you could potentially use dynamic transitions between different meshes, such as fading from one to another, but even such techniques yield some visual problems. To reduce such problems and simplify the authoring of LOD meshes, there are progressive LOD techniques that can be used to construct meshes of any level of detail on- the-fly. These techniques are covered in the next section.\n \n<html> <span style="font-size: 14px;"> <b> Progressive LOD </b> </span> </html>\n ; the edge split information을 통해서 적절한 레벨의 geometry를 생성 (DirectX 9.0 SDK, ID3DX9MESH interfaces)\n\n(p.331) For this chapter, we will explore one of the most commonly used techniques developed by Hugues Hoppe of Microsoft, simply called ''progressive meshes''.\n \nThe representation offered by the __progressive mesh__, or ''PM'', technique is useful for on-the-fly LOD determination. In fact, this technique can also be used to do mesh simplification, progressive geometry transmission, and even geometric compression.\n\nThe basic idea behind the PM algorithm is as follows: Take a mesh at its lowest level and instead of representing different levels of detail, store such progressive information as how to reconstruct the higher level of detail from this original mesh. The progressive informa- tion is stored as a simple transformation called @@color(#C7254E): a VERTEX SPLIT@@, which essentially takes the current mesh and adds a new vertex, thus taking an existing face and splitting it into three new ones by adding a polygon somewhere inside the f/ace. \n\n(p.332) Before we talk about simplification, it is easier to talk about the progressive mesh representation and how to reconstruct a mesh. When dealing with progressive meshes, the basic reconstruction operation is called a VERTEX SPLIT. On the opposite side, the reverse operation is called an EDGE COL- LAPSE. This operation essentially takes an edge and collapses its two vertices together to create a simplified version of the geometry. This operation has been illustrated in Figure 19.2.\n<html>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/book_2004_Shaders_P&A_332.jpg" width=320>\n</html>\n\n... Because you are collapsing and re-creating vertices, you need to store information on the vertex as part of the progressive mesh representation. \n\n(p.333) cf. For more information on progressive meshes, I recommend you visit Hugues Hoppe's Web site at: http://research.microsoft.com/~hoppe/.\n\n... This metric is simple because it simply uses the squared geometric distance of the original mesh versus the new mesh. Keep in mind that for simplicity, this value is defined as the geometric distance of all vertices from their original position for a specific simplification in the mesh, not only the one you directly modified.\n\n... The advantage of the progressive mesh technique is that the simplification can be done ahead of time, and you can then use the results in real-time through ''the edge split information to generate the proper level of detail in your geometry''. As you can see, the whole progressive mesh process may seem daunting and complex. But it can make great differences in the run-time performance and quality of an application. \n\nA little note: This technique has been implemented as part of the DirectX 9.0 SDK and is ready for you to use through the ID3DX9MESH interfaces.\n\n<html> <span style="font-size: 14px;"> <b> Re-Creating Lost Details </b> </span> </html>\n ; LOD에 의해 줄어든 면때문에 줄어든 사실감을 bumpmapping을 사용해서 개별 pixel 단위에서 복원\n\n(p.334) The advantage of LOD is that it enables you to better control the visual quality and per- formance of your application. However, whichever approach you take, you still lose some visual detail. So you may wonder if there is any way to compensate for this lost detail. The fact is that there is!\n\nIn Chapter 10,"Shiny Little Pixels," I discussed the topic of bumpmapping and how it can be used to create non-existent detail. When simplifying a mesh, you can use this information to re-create the lost detail. Keep in mind that the geometry still stays simplified, but the lost detail can be re-created and used for lighting purposes.\n\nThe process to re-create this lost detail involves your original mesh and the simplified one. By mapping the simplified LOD mesh for bumpmapping, you can determine where each pixel is in space. With this position, you can find out, by using ray-tracing techniques, which face of the original mesh the pixel corresponds to.\n\n(p.335) ''NVIDIA'' created a tool called ''Melody'', intended to simplify the whole process. This tool not only generates the mesh LODs for you, but also generates the appropriate texture mapping and bumpmaps to re-create the lost detail.\n...\nOn the flip side, ''ATI'' Technologies has developed a similar tool called ''NormalMapper''. This tool does not handle the creation of LODs but, given an original mesh and a simplified version, generates the proper texture mapping coordinates and a bumpmap to re-create the lost detail. Their tool is already available from the developer section of their Web site at www.ati.com.\n\n<html> <span style="font-size: 16px;"> <b> Displacement Mapping </b> </span> </html>\n ; 광활한 전경을 구현하기 위해 사용, 지형의 높이를 texture에서 정의 (heightmap texture)\n\n(p.336) In Chapter 13, "Building Materials from Scratch," I discussed how, when dealing with procedural materials, I made a small incursion into modifying the geometry procedu- rally to create a new effect. In this section, I will introduce a variant on this, where you define a simple piece of geometry and let the hardware determine the final vertex positions.\n\nOne thing to keep in mind before I start: This technology is currently available only on 3.0 vertex shader hardware.\n\n(p.337) One of the biggest advantages of using such displacement mapping is its independence from the resolution of the initial mesh used. Because the height of the terrain is defined through a texture, you benefit from mipmapping and bilinear filtering. This means that in no way does your terrain mesh have to match your heightmap texture. You can use any resolution of mesh, thus allowing you to fully support LOD on your landscape.\n\n<html> <span style="font-size: 16px;"> <b> It's Your Turn! </b> </span> </html>\n\nFor this last chapter, I have decided to let you go free without any homework. Enjoy!\n\n<html> <span style="font-size: 16px;"> <b> Summary </b> </span> </html>\n\n<html> <span style="font-size: 16px;"> <b> What's Next? </b> </span> </html>\n\n(p.339) The shader model 3.0 will, in theory, solve some of these problems. Although it's supported by DirectX 9.0, no current hardware supports this model, although you should expect some soon after this book is released. This new version allows for better branching and looping control in addition to some limited texture sampling at the vertex shader level. This new flexibility will allow even more powerful algorithms to be implemented in shader form. To a limited extent, some people have even managed to implement complex algorithms, such as ray tracing or radiosity, using the 3.0 shader models.\n\n\n<html>\n<a href="#Part04"> ▷ 최상위로 ///////////////////////////////////////////////////////</a> <br>\n</html>\n
<html> <a name="Page230803"> </a> \n<meta name="robots" content="noindex, nofollow"/></html>\n<html>\n<a href="#Page230803_01"> #. '돈이 된다! 주식투자, 김지훈 <br>\n<a href="#Page230803_02"> #. '농구천재' 송근용 </a> <br>\n</html>\n\n<html> <a name="Page230803_01"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page230803"> <span style="font-size: 14px;"> <b> #. '돈이 된다! 주식투자, 김지훈 </b> </span> </a>\n</div> </html>\n투자 종목 선정, 3가지 조건 (from 김지훈, '돈이 된다!" 주식투자)\n-. 거래대금이 늘어나는 종목 (5배 이상)\n-. @@color(#C89342): 기간과 외수인 매수 @@\n-. @@color(#ee1b24): 단기 체결강도가 급격하게 올라가는 종목 (100 이상) @@\n\n\n<html> <a name="Page230803_02"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page230803"> <span style="font-size: 14px;"> <b> #. '농구천재' 송근용 </b> </span> </a>\n</div> </html>\nhttps://www.youtube.com/@Ystreet - 와이스트릿 Ystreet / 2023.07.04.\n-. ''6개월 ~ 1년 내에 50 ~ 100% 수익을 낼 수 종목에 집중 투자''\n / 초창기 ; 저평가 초가치주, PER 3미만에 투자 \n / 단순 PER 기준 평가 ⇒ @@color(#ee1b24): 비싸지 않으면서도 남들도 좋아할 만한 종목에 투자 @@ (존 케인즈, "주식은 미인대회")\n\n-. ''기본적으로 역발상을 하지 않는다.''\n / 좋아지는 초입이나 중턱에 있는 종목에 투자\n / 전체적으로 좋은 실적이 예상되는 종목은 상한가인 날에도 매입할 수 있다.\n / 차트 분석 보다는 오르는 종목이 더 좋아지는 상황에서 수익이 더 크게 발생\n / 기업 특성 \n // IT 부품 기업은 일반적으로 1년이상 상승 사이클을 유지하지 못한다. \n ; 1년에서 6개월 내에 수익을 내야한다 (시한부 투자)\n // 소비자 기호 변화에 맞는 소비재 생산 기업\n ; 상승 사이클이 1년 ~ 2, 3년을 유지 (주식을 매매할 수 있는 충분한 시간이 있다.)
<html>\n<span style="font-size: 20px;"> <b> 국제주의 vs 고립주의 </b> <p>\n<b> 美 정치 전통, 대외정책 영향력 행사 </b></span>\n</html>\n<html>\n<span style="color:#a50829;"> \n2016년 미국 대통령 선거의 키워드는 '트럼프 현상'이다. 트럼프 현상은 일개 부동산 개발업자에서 미국 양대 정당인 공화당의 대통령 후보로 선출된 도달드 트럼프라는 한 인물에 대한 이야기만은 아니다. 트럼프에 지지를 보내는 수많은 미국 유권자들이 바로 트럼프 현상의 주인공이다. 비록 미주당 후보 힐러리 클린터에 뒤지고는 있지만 트럼프는 40%라는 콘크리트 지지율을 자랑한다. 수많은 인종차별적ㆍ성차별적 발언과 친딸까지 소재로 삼는 음담패설에도 트럼프 지지자들은 꿈쩍하지 않는다. 비록 트럼프가 대선에 패배하더라도 유권자 10명 중 4명에 달하는 트럼프 지지자의 존재는 미국 정치 지형의 변화를 야기할 것이다. 정치 변화는 외교안보정책의 전환을 의미한다. 외교는 국내정치의 연장이기 때문이다. </span>\n</html>\n\n글 김능현 서울경제신문 국제부 기자/ 신용사회 2016.11.(Vol.410)\n\n!! 미국 정치의 4가지 전통\n(p.040) 트럼프 지지자의 심리를 이해하려면 200년 역사를 통해 형성된 미국의 정치적 전통부터 들여다 볼 필요가 있다. 200년 남짓한 역사에서 무슨 전통이 있느냐고 반문할 수도 있다. 하지만 민주주의 역사만 따지면 미국은 지구촌에서 가장 유서 깊은 나라다. 더구나 미국은 봉건시대나 왕정시대를 거치지 않았다. 구체제의 유물이 남아있지 않은 순수한 민주적 전통을 보유하고 있다는 얘기다.\n 미국의 정치 이념은 크게 국제주의와 고립주의로 나뉜다. 국제주의는 또 다시 해밀턴주의(Hamiltonianism)와 윌슨주의(Wilsonianism), 고립주의는 제퍼슨주의(Jeffersonianism)와 잭슨주의(Jacksonian)로 구분해볼 수 있다.\n\n!! 국제주의\n!!! 해밀턴주의 (Hamiltonianism)\n 강력한 연방정부와 상업적 이익을 중시한 미국 초대 재무장관 알렉산더 해밀턴의 정책에서 유래한 해밀턴주의는 오늘날 해양국가로서 미국의 경제적 이익을 추구한다. 18 ~ 19세기 세계 외교의 주무대인 유럽대륙에서 멀찌감치 떨어진 외딴 해양국가로서 미국이 가장 두려워한 것은 '고립'이었다. 유럽과 유럽이 지배하는 아시아ㆍ아프리카 식민지와의 무역 단절은 곧 '가난'을 의미했다. 해밀터주의 전통은 무역과 항행의 자유에 대한 강박증적 추종으로 이어졌다. 해양국가인 미국에게 항행의 자유는 곧 무역의 자유를 의미한다. 미국이 중국과의 일전을 불사하면서까지 '항행의 자유'를 외치며 남중국해에 군함을 파견하는 것은 해밀터주의의 대표적 사례에 해당한다.\n\n!!! 윌슨주의 (Wilsonianism)\n 미국 28대 우드로 윌슨 대통령의 정책에서 유래한 윌슨주의는 미국의 민주주의적 가치를 전세계에 전파하는 것을 사명으로 삼는다. 여기서 핵심은 '사명(Mission)'이라는 단어다. '우월한 존재가 열등한 자를 가르친다'는 뉘앙스가 포함된 사명이라는 단어는 기독교의 선교활동을 연상시킨다. 미국적 오만함의 산물이라는 평가가 나오는 것도 무리는 아니다. 윌슨주의는 세계 각국 분쟁에 개입하는 명분을 제공해왔다. 미국은 제 3세계 분쟁에 개입하면서 독재나 권위주의 정부를 무너뜨리고 민주주의를 이식하겠다는 논리를 내세웠다. 후세인 정권을 무너뜨리고 민주주의 체제를 이식하겠다며 일으킨 이라크 전쟁이 윌슨주의의 산물이다. 윌슨주주는 민주주의 국가끼리는 전쟁을 하지 않는다는 '민주평화론'과도 맥이 닿아있다.\n\n\n!! 고립주의\n!!! 제퍼슨주의 (Jeffersonianism)\n 고립주의 전통의 시발점인 제퍼슨주의는 미국 첫 국무장관인 토머스 제퍼슨의 사상을 기반으로 한다. 연방정부 축소와 주정부 강화를 주장하며 해밀턴과 대립각을 세웠던 제퍼슨은 작은 정부와 개인의 자유를 전문에 내세웠다. 큰 정부는 필연적으로 개인의 자유를 위축시킨다는 '자유주의적' 사상이 제퍼슨주의의 핵심이다. '작은 정부'를 추구하는 제퍼슨주의는 대외개입과 군사력 팽창에 극도의 거부반응을 보인다. 대외개입은 군사력을 필요로 하며 군사력은 예산증가를 유발해 정부의 권한을 증대시키고 개인의 자유를 위축시킨다는 논리다.\n\n!!! 잭슨주의 (Jacksonian)\n 또 하나의 고립주의인 잭슨주의는 대중중심의 정치를 추구한 제 7대 대통령 앤드루 잭슨에서 유래했다.\n 제퍼슨주의와 잭슨주의는 개인의 자유를 최우선시 한다는 점에서 유사하지만 강조점이 다르다. 제퍼슨주의는 표현의 자유를 규정한 수정헌법 1조를 금과옥조로 여기는 반면, 잭슨주의는 총기소유의 자유를 골자로 하는 수정헌법 2조를 최우선 가치로 삼는다. 미국에서 총기 소유란 단순히 카우보이적 멋스러움을 추구할 수 있는 권리를 의미하지 않는다. 못된 정부가 무력을 동원해 개인의 자유를 억압할 때, 각 개인이 총을 들고 항거할 수 있는 '저항권'을 의미한다. 스텔스 전투기와 항공모함이 활개치는 오늘날 개인 총기소유의 의미는 상당히 퇴색됐지만 미국의 총기협회는 총기규제 도입을 막는 명분으로 '저항할 수 있는 자유'즉 잭슨주의의 수호를 내세운다. 잭슨이 중하류층의 광범위한 지지를 바탕으로 당선된 것은 이런 가치가 미국인들의 호감을 샀기 때문이다. 이 가치를 국가정책으로 확장하면 개인의 자유를 보장하는 작은 정보와 미국의 가치를 보호하는 도구로서의 '강한 군사력'으로 연결된다. 다시 말해, 잭슨주의는 작은 정부를 지향하고 대외개입을 꺼린다는 제퍼슨주의와 유사하지만 일단 대외분쟁에 개입하면 미국의 강력한 입을 보여주어야 한다고 주장하는 점에서 다르다.\n\n
@@color(#04f): ▣ ''내적'' 연산 @@ (Dot Product) ; 한 벡터가 다른 벡터에 투영된 길이 값. @ 2017-01-24 @\nEx) Dot(A , B) ; B를 A위치로 회전했을 때 투영되어 직교되는 위치만큼의 크기 값\n각 벡터를 Normalize한 후의 스칼라 곱의 결과값이며 그 값은 두 벡터의 코사인 의 값과 일치한다. 그러므로 음수 인지 양수 인지 그리고 각도의 크기 값도 알아 낼 수 있다.\n\n@@color(#04f): ▣ ''외적'' 연산 @@ (Cross Product) ; 임의의 두 벡터와 직교를 이루는 벡터. @ 2017-01-24 @\nEx) 폴리곤의 법선 벡터 정보를 알려준다.\n폴리곤의 직교되는 법선 벡터 정보를 알게 되면, 라이트와의 관계, 오브젝터 충돌 등에 사용할 수 있다.\n\n@@color(#04f): ▣ ''BRDF'' @@ (Bidirectional Reflectance Distribution Function) @ 2017-01-17 @\n재질의 표면은 빛을 반사하는 정도가 다 다르며 그렇기 때문에 각 곡면에서 반사되어 우리 눈으로 들어오는 반사랑도 다 다르게 된다. 이로인해 같은 모양의 구라 하더라도 재질에 따라 어떤 것은 구의 가운데가 더 반짝일수도 있고 또 어떤 것은 구의 외곽으로 갈수록 더 반짝거리는 것도 있을 수 있다. 이런 표현은 일반적인 쉐이더로 나타낼 수 없으며 카메라의 입사각과 관련된 표면에 대한 반사율을 컨트롤 할 수 있어야 가능한 현상이다.\n\n@@color(#04f): ▣ ''PTM'' @@ (Polynomial Texture Map) @ 2017-01-17 @\nthe normal, tangent, and binormal for the vertex가 필요하며, 범프는 아니지만 좀더 세밀하게 표현 ( 예를 들면, self-shadowing / Pixel Shader 조작)\n\n@@color(#04f): ▣ ''Spherical Harmonics'' @@ (구면조화)/ 라이트 프로브(Light Probe) @ 2017-01-24 @\n3차원 공간에서 특정 위치에 들어오는 빛을 샘플링, Spherical Harmonics (구면조화)라고 알려진 삼각 함수를 이용해서 구체(sphere)를 통해서 이 정보를 인코딩한다. 이러한 계수(coefficients)는 저장 비용이 낮고 게임 플레이 시에 정보를 빠르게 변환될 수 있기 때문에, 쉐이더(shader)에서 씬 안의 표면 빛을 근사시키기 위해서 사용한다.\n유니티에서는 라이트 프로브(Light Probe)를 통해서 이 기능을 제공한다.\n\n프로브 라이팅을 사용하는데는 제약이 따른다. 이런 제약 중 하나는 고주파(high frequency) 빛과, 이 특별한 숫자의 수준(크기)를 증가시키지 않고 구체의 범위에 걸친 얼룩덜룩한 빛을 표현하기 어렵다. 불행하게도 정밀도가 높아지면 비용이 급격하게 증가하기 때문에, 낮은 수준의 구면 조화함수만을 사용할 수 밖에 없다.\n\n게임 세계에서 하나의 3차원 위치에는, 그 위치의 라이팅에 대해서 하나의 구면 표현(spherical representation)만 존재하기 때문에, 매우 다양한 빛 표현을 필요로하는 아주 큰 오브젝트에 대한 빛 처리에는 프로브 라이팅이 적합하지 않다. 또다른 제약은 구면조화 함수는 빛을 처리한 값들을 구체로 저장하기 때문에 큰 평면 오브젝트나 상당히 오목한 부분을 가진 오브젝트에는 대체로 적합하지 않다.\n\n이러한 제약사항이 있음에도, 적절하게 작고, 볼록한 오브젝트에 프로브 라이팅이 사용되면 비교적 낮은 비용으로 적절하게 만족할만한 수준의 결과를 얻을 수 있다. 적절한 곳에서 프로브 라이트를 사용하면 씬에서 라이트맵 수를 줄일 수 있다.\n\n
@@color(#0044ff): ▣ 로버스 @@ (ROVERS) https://www.lesmore.com/\n「로버스」는 1959년 금강제화의 계열사로 탄생한 브랜드이다. 「로버스」는 지난 2005년 레스모아의 PB브랜드로 선보인 이후, 트렌디한 디자인과 합리적인 가격으로 디자인에 민감한 젊은 고객층을 겨냥한 「로버스 바이 랜드로바」를 최근 론칭 단독 매장을 오픈했다. \n특히 「로버스」는 39년 전통의 랜드로바 제품팀이 직접 제품 제작에 참여해 검수한 제품으로 고객 니즈를 맞출려고 노력한다. 1020세대를 공략하는 캐주얼 콘셉 신발을 비교적 저렴한 5만~6만 원대에 선보이며 인기몰이에 나섰다.\n
''1차 산업혁명 ; 증기기관 ''\n1784년 수력 증기기관을 활용하여 철도, 면사방적기와 같은 기계적 혁명을 불러온다.\n\n''2차 산업혁명 ; 전기 동력 대량생산 ''\n1870년대부터 시작된 2차 산업혁명은 1차 산업혁명의 연장선. 공장에 전력이 공급되고 컨베이어벨트를 이용한 대량생산이 가능해졌고, 자동차 회사 포드의 ‘T형 포드’와 같이 조립 설비와 전기를 통한 대량생산체계를 구축한다.\n\n''3차 산업혁명 ; 컴퓨터 제어 자동화 ''\n컴퓨터를 이용한 생산자동화를 통해 대량생산이 진화. 업무용 메인프레임 컴퓨터, 개인용 컴퓨터, 인터넷 등을 통한 정보기술 시대가 개막한다.\n\n''4차 산업혁명 ; 융합과 연결 ''\n4차 산업혁명은 2016.01.20. 스위스 다보스에서 열린 ‘세계경제포럼’에서 처음 언급된 개념으로, 제4차 산업혁명을 “3차 산업혁명을 기반으로 한 디지털과 바이오산업, 물리학 등의 경계를 융합하는 기술혁명”이라고 설명한다.\n3차 산업혁명의 주춧돌인 정보통신기술의 발달은 4차 산업혁명의 필요조건이다. 정보통신기술의 발달로 전 세계적인 소통이 가능해지고 개별적으로 발달한 각종 기술의 원활한 융합을 가능케 한다. 정보통신기술과 제조업, 바이오산업 등 다양한 산업 분야에서 이뤄지는 연결과 융합은 새로운 부가가치를 창출해 낸다.\n\n4차 산업 혁명의 특징은 ''△초연결성 △초지능성 △예측 가능성''이다. 사람과 사물, 사물과 사물이 인터넷 통신망으로 연결(초연결성). 초연결성으로 비롯된 막대한 데이터를 분석하여 일정한 패턴 파악(초지능성). 분석 결과를 토대로 인간의 행동을 예측(예측 가능성). \n\n\n| 구분 | 내용 |\n|1차 산업 |농업, 임업, 축산업 |\n|2차 산업 |경공업, 중공업, 건설업, 중화학공업 |\n|3차 산업 |상업, 운송업, 관광업 |\n|4차 산업 |3차산업 중에서 정보, 의료, 교육, 서비스 관련 산업을 별도로 구별 |\n|5차 산업 |3차산업 중에서 패션, 오락 및 레저산업을 별도로 구별 |\n|6차 산업 |농촌에 존재하는 모든 유무형의 자원을 바탕으로 농업과 식품, 특산품 제조가공(2차산업) 및 유통 판매, 문화, 체험, 관광, 서비스(3차산업) 등을 연계함으로서 새로운 부가가치를 창출하는 활동 |\n\n
; This uses the ps 2.0 instruction set and registers\n''PS_2_0''\n\n<html> <span style="font-size: 12px;"> <b> d3d9types.h </b> </span> </html>\n{{{\n// DCL pixel shader sampler info token.\n#define D3DSP_TEXTURETYPE_SHIFT 27\n#define D3DSP_TEXTURETYPE_MASK 0x78000000\n\ntypedef enum _D3DSAMPLER_TEXTURE_TYPE\n{\n D3DSTT_UNKNOWN = 0<<D3DSP_TEXTURETYPE_SHIFT, // uninitialized value\n D3DSTT_2D = 2<<D3DSP_TEXTURETYPE_SHIFT, // dcl_2d s# (for declaring a 2-D texture)\n D3DSTT_CUBE = 3<<D3DSP_TEXTURETYPE_SHIFT, // dcl_cube s# (for declaring a cube texture)\n D3DSTT_VOLUME = 4<<D3DSP_TEXTURETYPE_SHIFT, // dcl_volume s# (for declaring a volume texture)\n D3DSTT_FORCE_DWORD = 0x7fffffff, // force 32-bit size enum\n} D3DSAMPLER_TEXTURE_TYPE;\n\n/* CubeMap Face identifiers */\ntypedef enum _D3DCUBEMAP_FACES\n{\n D3DCUBEMAP_FACE_POSITIVE_X = 0, // 큐브 맵의 정방향의 x 면. \n D3DCUBEMAP_FACE_NEGATIVE_X = 1, // 큐브 맵의 부방향의 x 면. \n D3DCUBEMAP_FACE_POSITIVE_Y = 2, // 큐브 맵의 정방향의 y 면. \n D3DCUBEMAP_FACE_NEGATIVE_Y = 3, // 큐브 맵의 부방향의 y 면. \n D3DCUBEMAP_FACE_POSITIVE_Z = 4, // 큐브 맵의 정방향의 z 면. \n D3DCUBEMAP_FACE_NEGATIVE_Z = 5, // 큐브 맵의 부방향의 z 면. \n\n D3DCUBEMAP_FACE_FORCE_DWORD = 0x7fffffff // 이 열거형을 강제적으로 32 비트 사이즈에 컴파일 한다. 이 값은 사용되지 않았다. \n} D3DCUBEMAP_FACES;\n}}}\n\n\n<html> <span style="font-size: 12px;"> <b> 단순 출력 </b> </span> </html>\n\ndef c0, 1, 0, 0, 1\n ; PS.1.1 ; mov r0, c0\nmov oC0, c0\n\n\n<html> <span style="font-size: 12px;"> <b> Textur 출력 (A simple pixel shader) </b> </span> </html>\n\n ; Declare the s0 register to be the sampler for stage 0\ndcl_2d s0 ; D3DXCreateTextureFromFile(...); 함수로 텍스처 로딩\ndcl_cube s1 ; D3DXCreateCubeTextureFromFile(...); 함수로 텍스처 로딩\n\n ; Declare t0 to have 2D texture coordinates from stage 0. \n ; These are the interpolated texture coordinates.\ndcl t0.xy\ndcl t1\n ; Sample the texture at stage 0 into the r1 temporary register\ntexld r1, t0, s0\ntexld r3, t1, s1\n\n ; mov r1, r3\n ; move r1 to the output register\nmov oC0, r1\n\n\n<html> <span style="font-size: 12px;"> <b> Signed Scaling _bx2 대체 코드 </b> </span> </html>\n\nps.1.4\n\ndp3_sat r5, r1_bx2, r2_bx2 ; normal dot light 1 (_bx2 because moved into 0..1)\n\n----\nps.2.0\n\ndef c0, -1.0f, -1.0f, -1.0f, -1.0f ; for _bx2 emulation\ndef c1, 2.0f, 2.0f, 2.0f, 2.0f ; for _bx2 emulation\nmov r11, c1\n\n ; emulate ps1x _bx2, so substract 0.5f and multiply by 2\nmad r1.xyz, r1, r11, c0\nmad r2.xyz, r2, r11, c0\n\ndp3_sat r2, r1, r2 ; normal dot light 1 (_bx2 because moved into 0..1)\n\n\n\n
출처 ; https://msdn.microsoft.com/ko-kr/library/windows/desktop/bb172918(v=vs.85).aspx\n\nPixel shaders depend on registers to get vertex data, to output pixel data, to hold temporary results during calculations, and to identify texture sampling stages. There are several types of registers, each with a unique functionality. This section contains reference information for the input and output registers implemented by pixel shader version 2_x.\n\n!!! Input Register Types\n|Register |Name |Count |R/W |# Read ports |# Reads/inst |Dimension |RelAddr |Defaults |Requires DCL |\n|v# |Input Color <br> Register |2 |R |1 |Unlimited |4 |N |Partial(0001). <br> See note 4 |Y |\n|r# |Temporary <br> Register |See note 1 |R/W |3 |Unlimited |4 |N |None |N |\n|c# |Constant Float <br> Register |32 |R |1 |2 |4 |N |0000 |N |\n|i# |Constant Integer <br> Register |16 |See note 2 |1 |1 |4 |N |0000 |N |\n|b# |Constant Boolean <br> Register |16 |See note 2 |1 |1 |1 |N |FALSE |N |\n|p0 |Predicate <br>Register |1 |See note 2 |1 |1 |1 |N |None |Y |\n|s# |Sampler <br> (Direct3D 9 asm-ps) |16 |See note 3 |1 |1 |4 |N |See note 5 |Y |\n|t# |Texture Coordinate <br> Register |8 |R |1 |1 |4 |N |None |Y |\n\nNotes:\n\n1. 12 min/32 max: The number of r# registers is determined by D3DPSHADERCAPS2_0.NumTemps (which ranges from 12 to 32).\n2. Only usable by a flow control instruction.\n3. Only usable by a texture sampling instruction.\n4. partial(x, y, z, w) - If only a subset of channels are updated in the register, the remaining channels will default to specified values (x, y, z, w).\n5. Defaults for sampler lookups exist, but values depend on texture format.\n \nThe number of readports is the number of different registers (for each register type) that can be read in a single instruction.\n\n!!! Output Register Types\n|Register |Name |Count |R/W |Dimension |RelAddr |Defaults |Requires DCL |\n|oC# |Output Color Register |See Multiple-element Textures <br> (Direct3D 9) |W |4 |N |None |N |\n|oDepth |Output Depth Register |1 |W |1 |N |None |N |\n\n<br>
!! Vertex Shader\n!!! procedural wood1 렌더링\n{{{\nfloat 4x4 view_proj_matrix;\nfloat 4x4 texture_matrix0;\n\nstruct VS_PUTOUT\n{\n float4 Pos : POSITION;\n float3 Pshade : TEXCOORD0;\n};\n\nVS_OUTPUT main (float4 vPosition : POSITION)\n{\n VS_OUTPUT Out = (VS_OUTPUT) 0;\n\n // 절단 공간으로 변환\n Out.Pos = mul (view_proj_matrix, vPosition) ;\n\n // Pshade를변환\n Out.Pshade = mul (texture_matrix0, vPosition) ;\n\n ret urn Out ;\n}\n}}}\n\n!! Pixel Shader\n!!! procedural wood1 렌더링 (ps_2_0)\n{{{\nfloat4 lightWood; // 나무결 색상의밝은부분\nfloat4 darkWood; // 나무결 색상의어두운부분\nfloat ringFreq; // 나무결의촘촘한 정도\n\nsampler PulseTrainSampler;\n\nfloat4 hlsl_rings (float4 Pshade : TEXCOORD0) : COLOR\n{\n float scaledDistFromZAxis = sqrt (dot (Pshade.xy, Pshade.xy) ) * ringFreq;\n float blendFactor = tex1D (PulseTrainSampler, scaledDistFromZAxis ) ;\n return lerp (darkWood, lightWood, blendFactor ) ;\n}\n}}}\n\n!! ps1.1 >> ps.2.0\n!!! _bx2 대체 코드\n{{{\nfloat4 main( float3 Col : COLOR0, float3 Tex : TEXCOORD0 ) : COLOR0\n{\n float4 Out;\n\n Out = dot(Col, Tex*2 - 1);\n// Out = clamp(Out,0,1);\n\n return Out;\n}\n}}}\n ; Generated by Microsoft (R) HLSL Shader Compiler 9.29.952.3111\nps_2_0\ndef c0, 2, -1, 0, 0\ndcl v0.xyz\ndcl t0.xyz\n\nmad r0.xyz, t0, c0.x, c0.y\ndp3 r0, v0, r0\n ; mov_sat r0, r0.x\n\nmov oC0, r0\n\n ; approximately 4 instruction slots used\n\n!! HLSL 파일\n#. ''기본 구성''\n{{{\nfloat4 main( float4 Tex : TEXCOORD0 ) : COLOR0\n{\n return Tex;\n}\n}}}\nps_2_0\ndcl t0\nmov oC0, t0\n\n#. ''1개 Texture 적용''\n{{{\nsampler Texture0;\nfloat4 ps_main( float2 inTxr1: TEXCOORD0 ) : COLOR0\n{\n // Output the color taken from our texture\n return tex2D( Texture0, inTxr1 );\n}\n}}}\nps_2_0\ndcl t0.xy ; 텍스처 좌표\ndcl_2d s0 ; 텍스처 샘플러\ntexld r0, t0, s0 ; 텍스처 로딩 \nmov oC0, r0\n
출처 ; C:\sAMD\sGPU ShaderAnalyzer\sGPUShaderAnalyzer.html\n\n!!! Contents\n<html>\n<UL>\n <LI><a href="#Overview">Overview</A><br>\n <LI><a href="#New">What's New</A><br>\n <LI><a href="#Requirements">Requirements</A>\n <LI><a href="#Known Issues">Known Issues</A>\n <LI><a href="#Getting Started">Getting Started</A>\n <LI><a href="#Compiler Statistics">About the Compiler Statistics</A>\n <LI><a href="#D3D Assembly Statistics">About the D3D Assembly Statistics</A>\n <LI><a href="#Command Line">Using the Command Line Interface</A>\n <LI><a href="#Shader Annotation">Shader Annotation</A>\n <LI><a href="#Support">Support</A>\n <LI><a href="#Resources">Resources</A>\n</UL> \n<a name="Overview"></html>\n!!! Overview\nGPU ShaderAnalyzer is a tool for analyzing the performance of pixel, vertex, geometry, hull, domain and compute shaders for ATI Radeon™ graphics cards. It gives you accurate performance estimates for your shaders and even allows you to view disassembly of the generated hardware shader, all without having to run the application on actual hardware. GPU ShaderAnalyzer can be used as a GUI tool for interactive tuning of your shaders or in command line mode to generate detailed reports. It supports Direct3D (D3D9.0 - D3D11) and OpenGL (GLSL 1.50, arb_fp and arb_vp) shaders.\n\n<html><a name="New"></html>\n!!! What's New\n<html>\n<UL>\n <LI>\n <b>v1.59.3208 (13th April 2012)</b>\n <UL>\n <li>Support for Catalyst™ drivers 12.1, 12.2, 12.3, 12.4.\n </UL>\n <br>\n <LI>\n <b>v1.58.3084 (23rd December 2011)</b>\n <ul>\n <li>Support for Catalyst™ driver 11.9-11.12.\n </UL>\n <br>\n <LI>\n <b>v1.57.2971 (16th September 2011)</b>\n <ul>\n <li>Support for Catalyst™ driver 11.1-11.8.\n <li>Support for AMD Radeon™ HD 6670 and HD 6450 graphics cards. \n <li>Improved analysis for ATI Radeon™ HD 6970 graphics cards.\n </UL>\n <br>\n <LI>\n <b>v1.56.2720 (18th January 2011) - January 2011 Refresh</b>\n <ul>\n <li>Support for Catalyst™ driver 10.10-10.12.\n <li>Support for ATI Radeon™ HD 6870 and HD 6970 graphics cards. \n <li>Report compilation time from HLSL shaders to D3D assembly.\n </UL>\n <br>\n <LI>\n <b>v1.55.2597 (23rd September 2010) - September 2010 Refresh</b>\n <ul>\n <li>Support for Catalyst™ driver 10.4-10.9.\n <li>Support for June 2010 DirectX SDK.\n <li>Fixed an installation problem on a machine with VBScript disabled.\n </UL>\n <br>\n <LI>\n <b>v1.54.2438 (5th May 2010) - May 2010 Refresh</b>\n <ul>\n <li>Support for GLSL 1.50 (OpenGL 3.2).\n <li>Support for Catalyst™ driver 10.1-10.3.\n <li>Support for ATI Radeon™ HD 5570 graphics cards.\n <li>Support for ATI Radeon™ HD 5450 graphics cards.\n <li>Additional control over the shader source type used for compilation.\n <li>Updated the ALUTexRatio to report the ALU vs Tex ratio from the non Tex bottleneck vs Tex ratio.\n <li>Improved static analysis for ATI Radeon™ HD 5870 graphics cards.\n <li>Disassembly window now handles large outputs.\n <li>Disassembly and statistics now stay visible while code is modified.\n <li>GLSL macros now fully supported.\n <li>Added tooltips.\n </UL>\n <br>\n <LI>\n <b>v1.53.2271 (15th January 2010) - January 2010 Refresh</b>\n <ul>\n <li>Support for Microsoft® DirectX® 11.\n <li>Support for Catalyst™ driver 9.9-9.12.\n <li>Support for ATI Radeon™ HD 5870 graphics cards.\n <li>Support for ATI Radeon™ HD 5770 graphics cards.\n <li>Fixed support for IL disassembly.\n <li>Fixed issue with simple GLSL shaders.\n </UL>\n <br>\n <LI>\n <b>v1.52.2177 (3rd September 2009) - August 09 Refresh</b>\n <ul>\n <li>Support for Catalyst™ driver 9.5-9.8.\n <li>Support for ATI Radeon™ HD 4890 graphics cards.\n <li>Support for ATI Radeon™ HD 4770 graphics cards.\n <li>Improved interface for selecting which ASICs to generate statistics for.\n <li>Compiler Statistics table now remembers which column to sort by.\n </UL>\n <br>\n <LI>\n <b>v1.51.1983 (23rd April 2009) - April 09 Refresh</b>\n <ul>\n <li>Support for Catalyst™ driver 9.2-9.4.\n <li>Support for Microsoft® DirectX® November 2008 and March 2009.\n <li>Improved support for HLSL compiler options.\n <li>Fixed a bug where the object code window might not show the full disassembly output.\n <li>Fixed a bug where the statistics report the number of GPRs one larger than it should be.\n </UL>\n <br>\n <LI>\n <b>v1.50.1904 (6th February 2009) - January 09 Refresh</b>\n <ul>\n <li>Support for Catalyst™ driver 9.1.\n <li>Support for GLSL 1.30 (OpenGL 3.0).\n <li>Improved analysis for dynamic flow controls.\n <li>Fixed an issue with compiling DX9 shader (SM 3) for ATI Radeon™ x1300, x1600 and x1900 graphics cards.\n <li>Support for ATI Radeon™ HD 4550 graphics cards.\n </UL>\n <br>\n <LI>\n <b>v1.49.1845 (12th December 2008) - December 08 Refresh</b>\n <ul>\n <li>Support for Catalyst™ driver 8.12.\n <li>Support for Brook+ & IL (Intermediate Language) shaders has been moved to a newly created tool Stream KernelAnalyzer.\n </UL>\n <br>\n <LI>\n <b>v1.48.1822 (20th November 2008) - November 08 Refresh</b>\n <ul>\n <li>Support for Catalyst™ driver 8.11.\n <li>Improved stability.\n <li>Catalyst™ driver 7.2 to 7.10 modules have been removed from the installer.\n </UL>\n <br>\n <LI>\n <b>v1.47.1786 (22th October 2008) - October 08 Refresh</b>\n <ul>\n <li>Support for Catalyst™ driver 8.10.\n <li>Added -NoGeometryShader (G) option for a DX10 shader to the command line option.\n <li>Fixed several issues with CAL compute shader.\n </UL>\n <br>\n <LI>\n <b>v1.46.1735 (19th September 2008) - September 08 Refresh</b>\n <ul>\n <li>Support for Catalyst™ driver 8.9.\n <li>Support for ATI Radeon™ HD 4670 graphics cards.\n <li>Support for CAL 1.2.\n <li>Support for CAL Compute Shader (only for ATI Radeon™ HD 48xx graphics cards).\n <li>Improved analysis of bottleneck computation for shaders with dynamic branching.\n <li>No geometry shader setting is turned on by default for DX10 shader.\n </UL>\n <br>\n <LI>\n <b>v1.45.1701 (28th August 2008) - August 08 Refresh</b>\n <ul>\n <li>Support for Catalyst™ driver 8.8.\n <li>More descriptive text for bottleneck statistics.\n <li>Improved behaviour when saving & restoring window size & state.\n <li>Improved support for shader annotation when auto compile is off.\n <li>ESC key will not exit the app.\n <li>Improved support for Add All in the Statistics Column Selection option window.\n <li>A new -verbose option to the command line version to provide detailed statistics of the shader analysis.\n <li>Reformatted the DX error message. Now, you can double click on the error message to jump to the error line.\n </UL>\n <br>\n <LI>\n <b>v1.44.1647 (31st July 2008) - July 08 Refresh</b>\n <ul>\n <li>Support for Catalyst™ driver 8.7.\n <li>Fixed default file extensions.\n <li>Fixed a bug in calculating min, max and avg cycles for RV770.\n <li>Removing an item in the Statistics Column Selection option window now works properly.\n </UL>\n <br>\n <LI>\n <b>v1.43.1597 (30th June 2008) - June 08 Refresh</b>\n <ul>\n <li>Support for Radeon™ HD 4870.\n <li>Support for Catalyst™ driver 8.6.\n <li>Fix for erroneous output color buffer target compilation problem with GLSL shaders.\n <li>Support for June 2008 DirectX SDK.\n </UL>\n <br>\n <LI>\n <b>v1.42.1586 (20th May 2008) - May 08 Refresh</b>\n <ul>\n <li>Support for <a href="#Shader Annotation">Shader Annotation</A>.\n <li>Support for Catalyst™ driver versions 7.2 - 8.5.\n <li>Support for CAL version 1.1 as used by the StreamComputing SDK. The StreamComputing SDK is available from <a title="http://ati.amd.com/technology/streamcomputing/index.html" href="http://ati.amd.com/technology/streamcomputing/index.html">http://ati.amd.com/technology/streamcomputing/index.html</A>.\n <li>Support for March 2008 DirectX SDK.\n <li>Brook+ compilation errors now reported in Object Code window.\n <li>Support for Radeon™ HD 3870 disassembly.\n <li>New "No Geometry Shader" option for DX10 pixel & vertex shaders.\n <li>Fixed file associations.\n <li>Improved stability.\n <li>Various UI improvements.\n </UL>\n <br>\n <LI>\n <b>v1.41.1373 (5th February 2008) - Catalyst™ 8.1 Update</b>\n <ul>\n <li>Support for Catalyst™ driver versions 7.1 - 8.1.\n </UL>\n <br>\n <LI>\n <b>v1.40.1326 (19th December 2007) - December 07 Refresh</b>\n <ul>\n <li>Support for DX10.1 shaders (ps_4_1/vs_4_1/gs_4_1).\n <li>Support for ATI Radeon™ HD 3870 graphics cards.\n <li>Support for ATI Radeon™ x1300 & x1600 graphics cards.\n <li>Support for Catalyst™ driver versions 6.9 - 7.12.\n <li>Support for Brook+ & IL (Intermediate Language) shaders as used by the StreamComputing SDK. The StreamComputing SDK will be available shortly.\n <li>New AMD Updater utility checks for the lastest version of GSA.\n <li>Support for setting the value of bool constants.\n <li>Switch to using D3DX10 for compiling DX10 shaders. The version of D3DX10 used can be configured in the Options dialog.\n <li>Improved sort ordering of stats list columns.\n <li>Improved support for include paths.\n </UL>\n <br>\n <LI>\n <b>v1.30.1141 (16th August 2007) - Summer 07 Tools Release</b>\n <ul>\n <li>Support for DX10 shaders (ps_4_0/vs_4_0/gs_4_0).\n <li>Support for OpenGL shaders (GLSL/arb_fp/arb_vp).\n <li>Improved analysis of shaders with flow control.\n <li>Analysis of probable shader bottleneck.\n <li>Calculation of shader throughput.\n <li>Support for ATI Radeon™ HD 2000 series graphics cards.\n <li>Support for multiple Catalyst™ driver revisions.\n This release contains Catalyst™ versions 6.9 - 7.6, future releases will add later Catalyst™ versions.\n <li>User-configurable shader context-coloring (available in the Options dialog).\n <li>User-selectable statistics columns (available in the Options dialog).\n <LI>Support for configuring flow control coherence settings.\n </UL>\n <br>\n <LI>\n <b>v1.0.1024 (31st October 2006) - Initial public release.</b>\n <ul>\n <li>So everything is kinda new.\n </ul>\n</UL> </html>\n<html> <a name="Requirements"></html>\n!!! Requirements\n<html>\n<ul>\n <li>Windows® XP, Windows® Vista® or Windows® 7\n <li>Microsoft® DirectX® SDK (April 07 or later).\n</ul> </html>\n<html> <a name="Known Issues"></html>\n!!! Known Issues\n<html>\n<dl>\n <dt><b>GLSL Interface blocks are not supported</b></dt>\n <dd>GLSL shaders which declare variables within interface blocks are not supported. Please remove variables from interface block to successfully analyze shader.</dd>\n <dt><b>GLSL unsized arrays are not supported</b></dt>\n <dd>GLSL geometry shaders which declare input/output variables as unsized arrays are not supported. Please explicitly declare the size of the array to match the number of primitive vertices.</dd>\n <dt><b>Incomplete handling of R6xx HW Break & Continue instructions</b></dt>\n <dd>The current implementation takes some account of break & continue instructions but research is ongoing on understanding the full performance implications of these instructions. If your shader makes usage of the break instruction you can still consider the reported performance estimates as good but if for instance you know that the break will likely be triggered after only a few iterations of a loop then you should factor this into your analysis.</dd>\n <dt><b>OpenGL vertex shaders not supported on R3xx-R5xx GPUs</b></dt>\n <dt><b>General Purpose Register usage is not currently considered</b></dt>\n <dd>In circumstances where a shader has a high latency (generally when there is a high texture dependency level) and high GPR usage the GPU can run out of the GPRs that is uses to hide latency. In these circumstances lowering the number of GPRs can improve shader performance.\n This is not currently factored into GSAs analysis but it is something we are actively researching.</dd>\n <dt><b>Unmatched <tt>#ifdef</tt> with <tt>#endif</tt> usage can cause crashes</b></dt>\n <dd>If you suffer crashes when editing shaders which use preprocessor commands (<tt>#ifdef</tt>, <tt>#endif</tt>, etc.) it is recommended that you disable <b>Auto Compile</b> in the Options dialog and instead click the "Compile" button when you have completed editting your shader.</dd>\n</dl></html>\n<html> <a name="Getting Started"> </html>\n!!! Getting Started\n<html> \n<ul>\n <li>Enter your shader into the <b>Source Code</b> window. You can load it via the File menu, drag and drop it onto the window or type it in from scratch if you prefer.\n <li>If you load your shader via the File menu or drag and drop, GPU ShaderAnalyzer will attempt to automatically detect the shader type.<i>This functionality can be changed in the <b>Options</b></i>.\n <li>Ensure the <b>Source type</b> is set correctly and, if required, the HLSL or GLSL <b>Target</b> is also set correctly for your shader.\n <li>If your shader is HLSL then you may need to set the <b>Function</b> correctly for your shader.\n <li>Click the <b>Compile</b> button. <i>Auto compile can be enabled in the <b>Options</b></i>\n <li>If your shader is compiled successfully you should see the disassembly of it in the <b>Object Code</b> window.\n</ul>\nThe <b>Compiler Statistics</b> window and <b>D3D Assembly Statistics window</b> will list statistics about your program. If you wish to see disassembly of the hardware shader as generated by ATI뭩 Shader Compiler, you may select the ATI Radeon™ graphics card you are interested in from the <b>Format</b> list above the <b>Object Code</b>. </html>\n<html> <a name="Compiler Statistics"> </html>\n!!! About the Compiler Statistics\nGPU ShaderAnalyzer (GSA) analyzes the hardware shader generated by ATI's Shader Compiler and estimates the number of cycles it will take to process each pixel, vertex or primitive. For shaders that contain flow control instructions, the quoted figures are the estimated average performance results. If your shader always executes the maximum number of loops or always takes the slowest execution path then your runtime results will differ.\n\nThe cost of texture instructions varies with the type of filtering being used so GSA quotes figures for bilinear, trilinear and anisotropic filtering. These figures are based on the estimated cost of filtering once texture caching has been taken into account. If your shader is ALU bound rather than texture bound then increasing the texture filtering level may have no effect on performance. Estimates are based upon 32bpp textures, wider format textures will have a greater performance cost. If your texture usage shows bad cache coherence then the cost of texture instructions can be much higher. This is not factored into GSA's calculations as in this case performance is considered to be texture bound rather than shader bound.\n\nThe ALU:Tex ratio statistics estimate how close you are to the sweet spot of balancing the ALU and Texture cost of your shader. This information can guide you as to where you have extra ALU compute available to spare. ALU:Tex ratios of 1.2 or greater are highlighted in green and those of 0.9 or less are highlighted in red. When a particular GPU has the capability to execute multiple ALU instructions on each pixel this is factored into GSA's analysis.\n<html>\n<table border="1">\n<tr><th>Column Heading</th><th>Full Name</th><th>Description</th></tr>\n<tr><td>Name</td><td>Name</td><td>The name of the GPU being analyzed.</td></tr>\n<tr><td>Code</td><td>Code</td><td>The internal product code for the GPU being analyzed.</td></tr>\n<tr><td>ALU</td><td>Alu Instructions</td><td>The number of ALU instructions in the shader.</td></tr>\n<tr><td>TEX</td><td>Texture Instructions</td><td>The number of texture fetch instructions in the shader.</td></tr>\n<tr><td>VTX</td><td>Vertex Instructions</td><td>The number of vertex fetch instructions in the shader.</td></tr>\n<tr><td>Interp</td><td>Interpolator Instructions</td><td>The number of interpolator instructions in the shader.<br>\n On R3xx-R5xx GPUs interpolator instructions interpolate the input parameters passed from vertex shader to pixel shader.</td></tr>\n<tr><td>CF</td><td>Control Flow Instructions</td><td>The number of control flow instructions in the shader.</td></tr>\n<tr><td>EXP</td><td>Export Instructions</td><td>The number of export instructions in the shader.</td></tr>\n<tr><td>EMIT</td><td>Emit Instructions</td><td>The number of emit, cut and emit_cut instructions in the shader.</td></tr>\n<tr><td>TexDependency</td><td>Texture Dependancy Levels</td><td>The maximum number of texture dependancy levels.</td></tr>\n<tr><td>GPR</td><td>General Purpose Registers</td><td>The number of General Purpose Registers used or allocated. This can affect shader performance.</td></tr>\n<tr><td>Min</td><td>Min Cycles</td><td>The minimum number of cycles the shader is expected to take.</td></tr>\n<tr><td>Max</td><td>Max Cycles</td><td>The maximum number of cycles the shader is expected to take.</td></tr>\n<tr><td>Avg</td><td>Avg Cycles</td><td>The average number of cycles the shader is expected to take.</td></tr>\n<tr><td>Est Cycles(Pt)</td><td>Estimated Cycles(Point)</td><td>The estimated number of cycles the shader is expected to take with point filtering on textures.<br>\n On current GPUs point filtering bares the same cost as bilinear filtering.</td></tr>\n<tr><td>Est Cycles(Bi)</td><td>Estimated Cycles(Bilinear)</td><td>The estimated number of cycles the shader is expected to take with bilinear filtering on textures.</td></tr>\n<tr><td>Est Cycles(Tri)</td><td>Estimated Cycles(Trilinear)</td><td>The estimated number of cycles the shader is expected to take with trilinear filtering on textures.</td></tr>\n<tr><td>Est Cycles(Aniso)</td><td>Estimated Cycles(Aniso)</td><td>The estimated number of cycles the shader is expected to take with anisotropic filtering on textures.</td></tr>\n<tr><td>ALU:TEX(Pt)</td><td>ALU:TEX Ratio(Point)</td><td>The expected ALU:Texture instruction ratio with point filtering on textures.<br>\n On current GPUs point filtering bares the same cost as bilinear filtering.</td></tr>\n<tr><td>ALU:TEX(Bi)</td><td>ALU:TEX Ratio(Bilinear)</td><td>The expected ALU:Texture instruction ratio with bilinear filtering on textures.</td></tr>\n<tr><td>ALU:TEX(Tri)</td><td>ALU:TEX Ratio(Trilinear)</td><td>The expected ALU:Texture instruction ratio with trilinear filtering on textures.</td></tr>\n<tr><td>ALU:TEX(Aniso)</td><td>ALU:TEX Ratio(Aniso)</td><td>The expected ALU:Texture instruction ratio with anisotropic filtering on textures.</td></tr>\n<tr><td>BottleNeck(Pt)</td><td>BottleNeck(Point)</td><td>The likely bottleneck(s) to shader performance with point filtering.</td></tr>\n<tr><td>BottleNeck(Bi)</td><td>BottleNeck(Bilinear)</td><td>The likely bottleneck(s) to shader performance with bilinear filtering.</td></tr>\n<tr><td>BottleNeck(Tri)</td><td>BottleNeck(Trilinear)</td><td>The likely bottleneck(s) to shader performance with trilinear filtering.</td></tr>\n<tr><td>BottleNeck(Aniso)</td><td>BottleNeck(Aniso)</td><td>The likely bottleneck(s) to shader performance with anisotropic filtering.</td></tr>\n<tr><td>Throughput(Pt)</td><td>Avg Peak Throughput(Point)</td><td>The estimated average peak throughput with point filtering.<br>\n This does not take into account the cost of other shaders on a unified shader architecture such as R6xx and as such will<br>\n only be achievable when the other shaders (i.e. vs & gs when analying ps) pose minimal cost.</td></tr>\n<tr><td>Throughput(Bi)</td><td>Avg Peak Throughput(Bilinear)</td><td>The estimated average peak throughput with bilinear filtering.<br>\n This does not take into account the cost of other shaders on a unified shader architecture such as R6xx and as such will<br>\n only be achievable when the other shaders (i.e. vs & gs when analying ps) pose minimal cost.</td></td></tr>\n<tr><td>Throughput(Tri)</td><td>Avg Peak Throughput(Trilinear)</td><td>The estimated average peak throughput with trilinear filtering.<br>\n This does not take into account the cost of other shaders on a unified shader architecture such as R6xx and as such will<br>\n only be achievable when the other shaders (i.e. vs & gs when analying ps) pose minimal cost.</td></td></tr>\n<tr><td>Throughput(Aniso)</td><td>Avg Peak Throughput(Aniso)</td><td>The estimated average peak throughput with anisotropic filtering.<br>\n This does not take into account the cost of other shaders on a unified shader architecture such as R6xx and as such will<br>\n only be achievable when the other shaders (i.e. vs & gs when analying ps) pose minimal cost.</td></td></tr>\n<tr><td>Item\s\sClock(Pt)</td><td>Avg Throughput Per Clock(Point)</td><td>The estimated average peak per clock throughput with point filtering.<br>\n This does not take into account the cost of other shaders on a unified shader architecture such as R6xx and as such will<br>\n only be achievable when the other shaders (i.e. vs & gs when analying ps) pose minimal cost.</td></tr>\n<tr><td>Item\s\sClock(Bi)</td><td>Avg Throughput Per Clock(Bilinear)</td><td>The estimated average peak per clock throughput with bilinear filtering.<br>\n This does not take into account the cost of other shaders on a unified shader architecture such as R6xx and as such will<br>\n only be achievable when the other shaders (i.e. vs & gs when analying ps) pose minimal cost.</td></td></tr>\n<tr><td>Item\s\sClock(Tri)</td><td>Avg Throughput Per Clock(Trilinear)</td><td>The estimated average peak per clock throughput with trilinear filtering.<br>\n This does not take into account the cost of other shaders on a unified shader architecture such as R6xx and as such will<br>\n only be achievable when the other shaders (i.e. vs & gs when analying ps) pose minimal cost.</td></td></tr>\n<tr><td>Item\s\sClock(Aniso)</td><td>Avg Throughput Per Clock(Aniso)</td><td>The estimated average peak per clock throughput with anisotropic filtering.<br>\n This does not take into account the cost of other shaders on a unified shader architecture such as R6xx and as such will<br>\n only be achievable when the other shaders (i.e. vs & gs when analying ps) pose minimal cost.</td></td></tr>\n<tr><td>Scratch Reg</td><td>Max Scratch Registers</td><td>The maximum number of scratch memory registers used by the shader. Use of scratch memory tends to have a performance cost.</td></tr>\n</table> </html>\n<html> <a name="D3D Assembly Statistics"> </html>\n!!! About the D3D Assembly Statistics\nThe D3D Assembly Statistics window shows you statistics based on static analysis of the D3D shader stream. It summarizes the instruction and register usages at the D3D assembly shader level.\n<html> <a name="Command Line"> </html>\n!!! Using the Command Line Interface\n<html>\n<pre>Usage: GPUShaderAnalyzer <InputFile> <command> [OutputFile] [options]\nCommands:\n -Analyze (-A) Analyze InputFile, saving to OutputFile if specified.\n -CSV (-V) Generate a csv file named OutputFile with analysis of the\n shader(s) specified by InputFile. Wildcards are accepted.\n -Disassemble (-I) Disassemble InputFile, saving to OutputFile if specified.\n -ListModules (-L) List the available SC Compiler module versions.\nOptions:\n -Module (-M) Specify which SC Compiler module to use.\n [Latest|LatestCatalyst], or specify module name from\n -ListModules\n Defaults to Latest.\n -Profile (-P) Specify which profile to compile shaders to.\n [ ps_1_1 | ps_1_2 | ps_1_3 | ps_1_4 ]\n [ ps_2_0 | ps_2_a | ps_2_b | ps_3_0 ]\n [ vs_1_1 | vs_2_0 | vs_2_a | vs_3_0 ]\n [ ps_4_0 | ps_4_1 | vs_4_0 | vs_4_1 | gs_4_0 | gs_4_1 ]\n [ vs_5_0 | gs_5_0 | ps_5_0 | hs_5_0 | ds_5_0 ]\n [ glsl | glsl_fp_asm | glsl_vp_asm | glsl_ps | glsl_vs | glsl_gs ]\n [ cs_4_0 | cs_4_1 | cs_5_0 ]\n -Function (-F) Specify which function to compile in a HLSL shader.\n Defaults to "main".\n -ASIC (-C) Which ASIC(s) to target this can be multiple ASICs in\n Analyze & CSV mode or a single ASIC to Disassemble.\n [ HD2400 | HD2600 | HD2900 | HD3870 ]\n [ R600 | RV610 | RV630 | RV670 ]\n [ HD4890 | HD4870 | HD4770 | HD4670 | HD4550 ]\n [ RV790 | RV770 | RV740 | RV730 | RV710 ]\n [ HD5870 | HD5770 | HD5670 | HD5450 ]\n [ Cypress | Juniper | Cedar | Redwood ]\n [ HD6970 | HD6870 | HD6670 | HD6450 ]\n [ Cayman | Barts | Turks | Caicos ]\n [ IL | D3D | ALL ]\n -Static (-S) Perform static analysis.\n -Define (-D) Define a symbol. -D [symbol] <value>.\n -Recurse (-R) Recursively search for shader files. CSV mode only.\n -Append (-E) Append the results to specified csv file. CSV mode only.\n -Coherence (-O) Set pixel shader flow control quad coherence.\n -IncludePath (-IP) Set the include path to a ';' seperated list.\n -IP [pathlist].\n -UseDX9Mode (-9) Use DX9 instrinsics for a DX10 shader.\n -NoGeometryShader (-G) No Geometry Shader option for a DX10/DX11 shader.\n -Verbose (-Z) Use with the Analyze option to output detailed statistics.\nExample:\n GPUShaderAnalyzer Test.hlsl -Analyze Test.txt -Profile ps_3_0 -ASIC ALL\nIf no command is specified GPUShaderAnalyzer will load InputFile in GUI mode\n</pre>\n<a name="Shader Annotation"> </html>\n!!! Shader Annotation\nGPU ShaderAnalyzer supports a number of shader file annotations that set preferences for the analysis of a particular shader file. Whenever a shader file is loaded is is scanned for these annotations. The annotations take the syntax: "// Annotation: Value" e.g. "// Profile: ps_3_0".\n\nCommands: \n<html>\n<dl>\n <dt><b>SourceType [type]</b></dt>\n <dd>The source type to compile code to.<br>\n [ DX Asm | HLSL | GL FP Asm | GL VP Asm | GLSL ]<br><br>\n </dd>\n <dt><b>Profile [profile]</b></dt>\n <dd>Which profile to compile HLSL shaders to.<br>\n [ ps_1_1 | ps_1_2 | ps_1_3 | ps_1_4 ]<br>\n [ ps_2_0 | ps_2_a | ps_2_b | ps_3_0 ]<br>\n [ vs_1_1 | vs_2_0 | vs_2_a | vs_3_0 ]<br>\n [ ps_4_0 | ps_4_1 | vs_4_0 | vs_4_1 | gs_4_0 | gs_4_1 ]<br>\n [ vs_5_0 | gs_5_0 | ps_5_0 | hs_5_0 | ds_5_0 ]<br>\n [ cs_4_0 | cs_4_1 | cs_5_0 ]<br><br>\n </dd>\n <dt><b>Function [function]</b><br>\n <b>EntryPoint [function]</b></dt>\n <dd>Which function to compile in an HLSL shader.<br><br>\n </dd>\n <dt><b>Define <symbol> <value></b><br>\n <b>D <symbol> <value></b></dt>\n <dd>Define a symbol. If no symbol is provided the macro list is cleared.<br><br>\n </dd>\n <dt><b>AvoidFlowControl [option]</b></dt>\n <dd>Avoid Flow Control (DX HLSL Only).<br>\n [TRUE|FALSE|1|0]<br><br>\n </dd>\n <dt><b>PreferFlowControl [option]</b></dt>\n <dd>Prefer Flow Control (DX HLSL Only).<br>\n [TRUE|FALSE|1|0]<br><br>\n </dd>\n <dt><b>UseDX9Intrinsics [option]</b></dt>\n <dd>Use DX9 Intrinsics (DX10 HLSL Only).<br>\n [TRUE|FALSE|1|0]<br><br>\n </dd>\n <dt><b>SkipOptimization [option]</b></dt>\n <dd>Skip Optimization (DX HLSL Only]).<br>\n [TRUE|FALSE|1|0]<br><br>\n </dd>\n <dt><b>NoGS [option]</b></dt>\n <dd>Presume no geometry shader when compiling shader (DX10/DX11 PS/VS HLSL Only).<br>\n [TRUE|FALSE|1|0]<br>\n </dd>\n</dl> <a name="Support"> </html>\n!!! Support\n<html>\n<UL>\n <LI> <a href="http://developer.amd.com/support/pages/default.aspx">General Support & Training website</a><BR>\n <LI> <a href="http://developer.amd.com/gpu/Pages/default.aspx">GPU Developer Tools website</a><BR>\n <LI> <a href="http://forums.amd.com/devforum/categories.cfm?catid=347">GPU Developer Tools forum</A><br>\n</UL>\nReport a specific problem or request help for GPU ShaderAnalyzer at\n<a href="http://developer.amd.com/support/KnowledgeBase/pages/HelpdeskTicketForm.aspx?Category=2&SubCategory=14">GPU Developer Tools Help Desk</a>. </html>\n<html> <a name="Resources"> </html>\n!!! Resources\n<html>\n<UL>\n <LI> <a href="http://developer.amd.com/gpu/ATIStreamSDK/assets/ATI_Intermediate_Language_(IL)_Specification_v2a[1].pdf">IL Specification</a>\n <LI> <a href="http://developer.amd.com/gpu_assets/R600_Instruction_Set_Architecture.pdf">R600 ISA</a>\n <LI> <a href="http://developer.amd.com/gpu_assets/R700-Family_Instruction_Set_Architecture.pdf">R700 ISA</a>\n <LI> <a href="http://developer.amd.com/gpu/ATIStreamSDK/assets/AMD_Evergreen-Family_ISA_Instructions_and_Microcode.pdf">Evergreen ISA</a>\n <LI> <a href="http://developer.amd.com/gpu/ATIStreamSDK/assets/R600-R700-Evergreen_Assembly_Language_Format.pdf">R600-R700-Evergreen Assembly Language Format</a>\n</UL> </html>\n\n
!! iostream 구현의 문제점\nVisual C++ .NET 2003에서는 이전의 iostream 라이브러리가 제거되었습니다.\n\n표준 C++ 라이브러리와 이전 런타임 라이브러리의 주요 차이점은 iostream 라이브러리에 있습니다. iostream 구현에 관한 세부 내용이 변경되었으므로 표준 C++ 라이브러리에 링크하려면 iostream을 사용하는 일부 코드를 다시 작성해야 합니다. \n\n코드에 포함시킨 이전 iostream 헤더(fstream.h, iomanip.h, ios.h, iostream.h, istream.h, ostream.h, streamb.h 및 strstrea.h)를 모두 제거하고, 한 개 이상의 새 표준 C++ iostream 헤더(<fstream>, <iomanip>, <ios>, <iosfwd>, <iostream>, <istream>, <ostream>, <sstream>, <streambuf> 및 <strstream>이며 모두 .h 확장명 없음)를 추가해야 합니다. \n\n!!! std::ostream::tellp\ncf. http://www.cplusplus.com/reference/ostream/ostream/tellp/\n{{{\n// position in output stream\n#include <fstream> // std::ofstream\n\nint main () {\n\n std::ofstream outfile;\n outfile.open ("test.txt");\n\n outfile.write ("This is an apple",16);\n long pos = outfile.tellp();\n outfile.seekp (pos-7);\n outfile.write (" sam",4);\n\n outfile.close();\n\n return 0;\n}\n}}}\n
<html> <a name="Page_1.4PixelShaders"> </a> </html>\nhttp://www2.ati.com/developer/ATIMeltdown01Pixel.PDF\n\n''▷ Jason L. Mitchell''\n3D Application Research Group Lead, JasonM@ati.com\n\n----\n간편리스트\n<html> <a href="#Page_1.4PixelShaders_1.1Model"> <b> 1.1 Model </b> </html>\n<html> <a href="#Page_1.4PixelShaders_1.4Model"> <b> 1.4 Model </b> </html>\n<html> <a href="#Page_1.4PixelShaders_BumpEnv."> <b> Bumpy Environment Mapping </b> </html>\n<html> <a href="#Page_1.4PixelShaders_Memo"> <b> 메모 </b> </html>\n----\n\n<html> <span style="font-size: 14px;"> <b> Pixel Shader API </b> </span> </html>\n\n''Assemble and create the shader:''\n D3DXAssembleShader( strOpcodes, lstrlen(strOpcodes), 0, NULL, &m_pD3DXBufShader, &pBuffer );\n m_pd3dDevice->CreatePixelShader( (DWORD*)m_pD3DXBufShader->GetBufferPointer(), &m_hPixelShader );\n''Set the current pixel shader:''\n m_pd3dDevice->SetPixelShader(m_hPixelShader);\n''Clean up on the way out:''\n m_pd3dDevice->SetPixelShader(0);\n m_pd3dDevice->DeletePixelShader(m_hPixelShader);\n\n''Textures''\n• 6 Textures (12 fetches)\n• Unified Instruction Set\n• 16 Instructions\n\n''Constants Constants''\n• Eight read-only constants (c0..c7)\n• Range -1 to +1\n • If you pass in anything outside of this range, it just gets clamped\n• A given co-issue (rgb and aa) instruction may only reference up to two constants\n• Example constant definition syntax:\n def c0, 1.0f, 0.5f, -0.3f, 1.0f\n\n''Interpolated Quantities''\n• Diffuse and Specular (v0 and v1)\n • Low precision and unsigned\n • In ps.1.1 through ps.1.3, available only “color shader”\n • Not available before ps.1.4 phase marker\n• Texture coordinates\n • High precision signed interpolators\n • Can be used as extra colors, signed vectors, matrix rows etc\n\n<html> <a name="Page_1.4PixelShaders_1.1Model"> </a> </html>\n<html> <span style="font-size: 14px;"> <b> 1.1 Model </b> </span> </html>\n<html> <span style="font-size: 14px;"> <b> The 1.1 Address Shaders </b> </span> </html>\n\n''One instruction''\n|; One texture <br> ps.1.1 <br> tex t0 |; Texcoord as color <br> ps.1.1 <br> texcoord t0 |; Mimic a clip plane <br> ps.1.1 <br> texkill t0 |\n\n''Two instructions''\n|; Two textures <br> ps.1.1 <br> tex t0 <br> tex t1 |; Two texcoords as colors <br> ps.1.1 <br> texcoord t0 <br> texcoord t1 |; Mimic two clip planes <br> ps.1.1 <br> texkill t0 <br> texkill t1 |; One texbem <br> ps.1.1 <br> tex t0 <br> texbem t1, t0 |\n|; One texbeml <br> ps.1.1 <br> tex t0 <br> texbeml t1, t0 |; Color AR remapping <br> ps.1.1 <br> tex t0 <br> texreg2ar t1, t0 |; Color GB remapping <br> ps.1.1 <br> tex t0 <br> texreg2gb t1, t0 |; Sample and texcoord <br> ps.1.1 <br> tex t0 <br> texcoord t1 |\n\n''Three instructions''\n|; 3 textures <br> ps.1.1 <br> tex t0 <br> tex t1 <br> tex t2 |; Mimic 3 clip planes <br> ps.1.1 <br> texkill t0 <br> texkill t1 <br> texkill t2 |; 2 samples & a texcoord <br> ps.1.1 <br> tex t0 <br> tex t1 <br> texcoord t2 |; One texbem and a texcoord <br> ps.1.1 <br> tex t0 <br> texbem t1, t0 <br> texcoord t2 |\n|>|; One texbeml and a sample <br> ps.1.1 <br> tex t0 <br> texbeml t1, t0 <br> tex t2 |; One texbeml and a texcoord <br> ps.1.1 <br> tex t0 <br> texbeml t1, t0 <br> texcoord t2 |; One texbem and a sample <br> ps.1.1 <br> tex t0 <br> texbem t1, t0 <br> tex t2 |\n|>|; Sample and 2 texcoords <br> ps.1.1 <br> tex t0 <br> texcoord t1 <br> texcoord t2 |; Three texcoords as colors <br> ps.1.1 <br> texcoord t0 <br> texcoord t1 <br> texcoord t2 |; 3x2 matrix multiply <br> ps.1.1 <br> tex t0 <br> texm3x2pad t1, t0 <br> texm3x2tex t2, t0 |\n\n''Four Instruction Shaders''\n|; 4 textures <br> ps.1.1 <br> tex t0 <br> tex t1 <br> tex t2 <br> tex t3 |; Mimic clip planes <br> ps.1.1 <br> texkill t0 <br> texkill t1 <br> texkill t2 <br> texkill t3 |; 3 Samples and one texcoord <br> ps.1.1 <br> tex t0 <br> tex t1 <br> tex t2 <br> texcoord t3 |; 2 Samples and 2 texcoords <br> ps.1.1 <br> tex t0 <br> tex t1 <br> texcoord t2 <br> texcoord t3 |; 1 texbem and 2 samples <br> ps.1.1 <br> tex t0 <br> texbem t1, t0 <br> tex t2 <br> tex t3 |\n|; 1 Sample and 3 texcoords <br> ps.1.1 <br> tex t0 <br> texcoord t1 <br> texcoord t2 <br> texcoord t3 |; Two texbems <br> ps.1.1 <br> tex t0 <br> texbem t1, t0 <br> tex t2 <br> texbem t3, t2 |; 4 texcoords <br> ps.1.1 <br> texcoord t0 <br> texcoord t1 <br> texcoord t2 <br> texcoord t3 |; 1 texbem, a sample and a texcoord <br> ps.1.1 <br> tex t0 <br> texbem t1, t0 <br> tex t2 <br> texcoord t3 |; 1 texbem and 2 texcoords <br> ps.1.1 <br> tex t0 <br> texbem t1, t0 <br> texcoord t2 <br> texcoord t3 |\n|; Two texbemls <br> ps.1.1 <br> tex t0 <br> texbeml t1, t0 <br> tex t2 <br> texbeml t3, t2 |>|; One texbeml and two samples <br> ps.1.1 <br> tex t0 <br> texbeml t1, t0 <br> tex t2 <br> tex t3 |; 1 texbeml, a sample and a texcoord <br> ps.1.1 <br> tex t0 <br> texbeml t1, t0 <br> tex t2 <br> texcoord t3 |; 3x2 multiply and texcoord <br> tex t0 <br> texm3x2pad t1, t0 <br> texm3x2tex t2, t0 <br> texcoord t3 |\n|; 1 texbeml and 2 texcoords <br> ps.1.1 <br> tex t0 <br> texbeml t1, t0 <br> texcoord t2 <br> texcoord t3 |; 3x2 multiply & sample <br> ps.1.1 <br> tex t0 <br> texm3x2pad t1, t0 <br> texm3x2tex t2, t0 <br> tex t3 |; 3x3 multiply <br> ps.1.1 <br> tex t0 <br> texm3x3pad t1, t0 <br> texm3x3pad t2, t0 <br> texm3x3tex t3, t0 |; 3x3 matrix multiply and <br> ; reflect constant vector <br> tex t0 <br> texm3x3pad t1, t0 <br> texm3x3pad t2, t0 <br> texm3x3spec t3, t0, c0 |; 3x3 matrix multiply and <br> ; reflect interpolated vector <br> tex t0 <br> texm3x3pad t1, t0 <br> texm3x3pad t2, t0 <br> texm3x3vspec t3, t0 |\n\n<html> <span style="font-size: 14px;"> <b> 1.2 Shaders </b> </span> </html>\n<html> <span style="font-size: 14px;"> <b> 1.3 Shaders </b> </span> </html>\n<html> <a name="Page_1.4PixelShaders_1.4Model"> </a> </html>\n<html> <span style="font-size: 14px;"> <b> 1.4 Model </b> </span> </html>\n• Flexible, unified instruction set\n • Think up your own math and just do it rather than try to wedge your ideas into a fixed set of modes\n• Flexible dependent texture fetching\n• More textures\n• More instructions\n• High Precision\n• Range of at least -8 to +8\n• Well along the road to DX9\n\n<html> <span style="font-size: 14px;"> <b> 1.4 Texture Instructions </b> </span> </html>\nMostly just data routing. Not ALU operations per se\n• texld\n • Samples data into a map\n• texcrd\n • Moves high precision signed data into a temp register (rn)\n • Higher precision than v0 or v1\n• texkill\n • Kills pixels based on sign of register components\n • Fallback for parts that don’t have clip planes\n• texdepth\n • Substitute value for this pixel’s z!\n\n<html> <span style="font-size: 14px;"> <b> texld vs tex </b> </span> </html>\n• Both cause a register to be filled with sampled data from a map\n• tex\n • Unary op\n• texld\n • Binary op\n • Context is associated with destination register\n • That means texture handle, filtering modes etc\n • Explicitly specifies dependent reads at the top of phase 2\n\n<html> <span style="font-size: 14px;"> <b> texcrd vs texcoord </b> </span> </html>\n• texcoord clamps input to 0..1 range\n • Basically behaves like a color\n • You have to scale and bias into 0..1 in your vertex shader\n • Very annoying if you’re also using the texm3x2 instructions, as you have already found\n• texcrd does not clamp 0..1\n • Takes same input range as texm3x2 type instructions\n • Retains pixel pipeline’s native precision which is higher than colors\n\n<html> <span style="font-size: 14px;"> <b> 1.4 Pixel Shader ALU Instructions </b> </span> </html>\n\n<html> <span style="font-size: 14px;"> <b> cnd and cmp </b> </span> </html>\n• cnd d, s0, s1, s2; d = (s0 > @@color(#FF0000): 0.5 @@ ) ? s1 : s2\n • Conditionally chooses between s1 and s2\n • In DirectX 8.1, cnd can now perform a component wise comparison of s0 to 0.5 in order to select s1 or s2’s component:\n • For s0 = [0.4, 0.5, 0.51, -5.6], d = [s2.r, s2.g, s1.b, s2.a] \n\n• cmp d, s0, s1, s2; d = (s0 >= @@color(#FF0000): 0 @@ ) ? s1 : s2\n • Conditionally chooses between s1 and s2\n • For s0 = [-0.4, 0.0, 5.0, -6.3], d = [s2.r, s1.g, s1.b, s2.a]\n • New Instruction in DirectX 8.1\n • Useful for absolute value: cmp d, s0, s0, -s0\n<html> <a name="Page_1.4PixelShaders_BumpEnv."> </a> </html>\n<html> <span style="font-size: 14px;"> <b> Bumpy Environment Mapping </b> </span> </html>\nps.1.4\n\ntexld r0, t0 ; Look up normal map\ntexld r1, t4 ; Eye vector through normalizer cube map\ntexcrd r4.rgb, t1 ; 1st row of environment matrix\ntexcrd r2.rgb, t2 ; 2st row of environment matrix\ntexcrd r3.rgb, t3 ; 3rd row of environment matrix\ntexcrd r5.rgb, t5 ; World space L (Unit length is light's range)\n\ndp3 r4.r, r4, r0_bx2 ; 1st row of matrix multiply\ndp3 r4.g, r2, r0_bx2 ; 2nd row of matrix multiply\ndp3 r4.b, r3, r0_bx2 ; 3rd row of matrix multiply\ndp3_x2 r3.rgb, r4, r1_bx2 ; 2(N·Eye)\nmul r3.rgb, r4, r3 ; 2N(N·Eye)\ndp3 r2.rgb, r4, r4 ; N·N\nmad r2.rgb, -r1_bx2, r2, r3 ; 2N(N·Eye) - Eye(N·N)\n\nphase\n\ntexld r2, r2 ; Sample cubic reflection map (!! r2 ; Dependent Reads) \ntexld r3, t0 ; Sample base map\ntexld r4, r4 ; Sample cubic diffuse map (!! r4 ; Dependent Reads)\ntexld r5, t0 ; Sample gloss map\n\nmul r1.rgb, r5, r2 ; Specular = Gloss * Reflection\nmad r0.rgb, r3, r4_x2, r1 ; Base * Diffuse + Specular\n<html> <a name="Page_1.4PixelShaders_Memo"> </a> </html>\n<html> <span style="font-size: 14px;"> <b> 메모 </b> </span> </html>\n ; 흑백 이미지 출력\nps.1.4\ntexld r3, t3 ; texture 로딩\ndp3 r0, r3, r3\nmov r0.w, v0.w\n\n\n\n
원본 ; http://www.hiramid.co.kr/bbs/board.php?bo_table=10_7&wr_id=306 (요약정리)\n\n사람은 혼과 백으로 이루어져 있어\n죽으면 혼은 하늘로 가고 백은 땅으로 돌아간다는 뜻이다.(혼비백산)\n\n혼(魂)은 영에 달려 있기 때문에 영혼 그렇게 부른다.\n혼이라는 것은 그 사람의 정신이기 때문에 사람이 죽어서도 영을 따라 다니며\n그 사람의 정신을 혼이라고 부르기도 한다.\n\n정신(精神)이란 말의 뜻은 정이라는 것은 생각과 마음의 상태이고 \n신이라는 것은 생각과 마음이 에너지가 된 것 또는 영을 의미하기도 한다.\n결국은 무형의 생각과 마음은 모두 신으로 돌아가게 된다.\n\n사람의 혼백을 삼혼칠백이라고 하는데\n''삼혼은 정기신이다. 정기신은 생각 마음 단전을 말한다.''\n정기신 합일이란 말은 정신통일상태이다.\n생각과 마음과 몸이 하나로 모아졌다. \n하나로 통일 되었다는 말이다.\n \n''이목구비의 7개 구멍을 7백이라 하고, 7백은 사람의 의식이 출입하는 통로이다.''\n그래서 7백은 육체의 작용으로 7백이 밝아야 한다는 것이다.\n공부를 잘하면 혼백이 밝고 공부를 못하면 혼백이 어둡다고 한다.\n\n사람이 죽으면 자손들이 4대까지는 제사의 영향을 받는다고 한다.\n\n
<html> <span style="font-size: 16px;"> <b> 반사 및 환경 매핑의 사용 예 (Local Viewer Reflection) </b> </span> </html>\n• Compute Local Viewer Specular reflection about Normal from Normal Map\n• Eye vector comes from q coordinates of the 3 sets of 4D textures\n• texm3x3spec 명령어는 ps.1.4에서 삭제\n / 다른 명령어로 대체할 경우 SetSamplerState 등의 설정이 필요\n / ps.1.4로 버텍스 정보를 넘기는 vs.1.1에서도 추가, 수정이 필요\n• Keyword ; ps.1.4, Sample environment map\n\n<html> <span style="font-size: 14px;"> <b> Vertex 정의 </b> </span> </html>\n{{{\n// A structure for our custom vertex type\nstruct SVertex\n{\n float x, y, z; // position\n float nx, ny, nz; // normal\n float u1, v1; // firts texture channel\n float ux, uy, uz; // U vector\n float vx, vy, vz; // V vector\n float uvx, uvy, uvz; // UxV vector\n};\n\n// Our custom FVF, which describes our custom vertex structure\n#define FVF_VERTEX ( D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX4 | \s\n D3DFVF_TEXCOORDSIZE2(0) | D3DFVF_TEXCOORDSIZE3(1) | \s\n D3DFVF_TEXCOORDSIZE3(2) | D3DFVF_TEXCOORDSIZE3(3))\n}}}\n\n<html> <span style="font-size: 14px;"> <b> Source 설정 </b> </span> </html>\n{{{\n#define EARTH_NORMAL_TEX "Media/earth_normal.tga"\n#define ENV_CUBE_MAP "Media/LobbyCube.dds"\n\nLPDIRECT3DTEXTURE9 g_lpMeshNormalTexture;\nLPDIRECT3DCUBETEXTURE9 g_lpCubeEnvTexture;\n\nbool InitGeometry()\n{\n HRESULT hResult;\n...\n // load normal texture\n hResult = D3DXCreateTextureFromFile(g_lpD3DDevice, EARTH_NORMAL_TEX, &g_lpMeshNormalTexture);\n if (D3D_OK != hResult)\n g_lpMeshTextures[i] = NULL;\n\n // load cube enviromental texture\n hResult = D3DXCreateCubeTextureFromFile(g_lpD3DDevice, ENV_CUBE_MAP, &g_lpCubeEnvTexture);\n if (D3D_OK != hResult)\n return false;\n \n return true;\n}\n\nVOID SetupMatrices()\n{\n...\n // shaders data\n matViewProj = matView * matProj;\n vectEye = D3DXVECTOR4(0.0f, 0.0f, -6.0f, 0.0f);\n g_lpD3DDevice->SetVertexShaderConstantF(0, (float*)D3DXMatrixTranspose(&matWorld, &matWorld), 4);\n g_lpD3DDevice->SetVertexShaderConstantF(4, (float*)D3DXMatrixTranspose(&matViewProj, &matViewProj), 4);\n g_lpD3DDevice->SetVertexShaderConstantF(8, (float*)&vectEye, 1);\n}\n\nvoid Render()\n{\n g_lpD3DDevice->BeginScene();\n {\n ...\n // texture filtering\n g_lpD3DDevice->SetFVF(FVF_VERTEX);\n g_lpD3DDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);\n g_lpD3DDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);\n g_lpD3DDevice->SetSamplerState(3, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);\n g_lpD3DDevice->SetSamplerState(3, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);\n\n // shaders settings\n g_lpD3DDevice->SetPixelShader(g_lpPixelShader);\n g_lpD3DDevice->SetVertexShader(g_lpVertexShader);\n\n // texture settings - pass normal map to final stage\n g_lpD3DDevice->SetTexture(0, g_lpMeshNormalTexture); // 노말맵\n g_lpD3DDevice->SetTexture(1, NULL);\n g_lpD3DDevice->SetTexture(2, NULL);\n g_lpD3DDevice->SetTexture(3, g_lpCubeEnvTexture); // 반사로 사용될 이미지\n ...\n }\n g_lpD3DDevice->EndScene();\n g_lpD3DDevice->Present(NULL, NULL, NULL, NULL);\n}\n}}}\n\n<html>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<span style="font-size: 14px;"> <b> Vertex Shader </b> </span>\n</div> </html>\n ; vs.1.1 수정없이 vs.2.0에 그대로 사용\nvs.1.1\n ;―――――――――――――――\n ; Constant registers \n ;―――――――――――――――\n ;\n ; c0-c3 - world transform matrix\n ; c4-c7 - view*proj transform matrix\n ; c8 - eye position\n\n ;―――――――――――――――\n ; Input registers\n ;―――――――――――――――\n ;\ndcl_position v0\ndcl_normal v3\ndcl_texcoord0 v7 ; textur vu 좌표\ndcl_texcoord1 v8 ; move u to world space\ndcl_texcoord2 v9 ; move v to world space\ndcl_texcoord3 v10 ; move uv to world space\n\n ;―――――――――――――――\n ; Output\n ;―――――――――――――――\n ;\n ; oT0 - tex coord\n ; oT1 - move u to world space\n ; oT2 - move v to world space\n ; oT3 - move uv to world space\n ; oT1.w, oT2.w, oT3.w - eye vector\n ; oD0 - store diffuse color\n\n ;===========================================================================\n ; light and helper\ndef c9, 0.0f, 0.0f,-1.0f, 0.0f\ndef c10, 0.0f, 0.25f, 0.5f, 1.0f\ndef c11, 0.5f, 0.5f, 0.5f, 0.5f\n\n ; transform position into world space\ndp4 r0.x, v0, c0\ndp4 r0.y, v0, c1\ndp4 r0.z, v0, c2\ndp4 r0.w, v0, c3\n\n ; move u to world space\ndp3 r2.x, v8, c0\ndp3 r2.y, v8, c1\ndp3 r2.z, v8, c2\n\n ; move v to world space\ndp3 r3.x, v9, c0\ndp3 r3.y, v9, c1\ndp3 r3.z, v9, c2\n\n ; move uv to world space\ndp3 r4.x, v10, c0\ndp3 r4.y, v10, c1\ndp3 r4.z, v10, c2\n\nmov oT1.xyz, r2.xyz\nmov oT2.xyz, r3.xyz\nmov oT3.xyz, r4.xyz\n\n ; move light to texture space\ndp3 r1.x, r2.xyz, c9\ndp3 r1.y, r3.xyz, c9\ndp3 r1.z, r4.xyz, c9\n\n ; store diffuse color\nmov oD0, c11\n\n ; calculate eye vector and put it to texture\nsub r1.xyz, r0.xyz, c8.xyz ; from eye to vertex\ndp3 r1.w, r1.xyz, r1.xyz ; normalize eye vector\nrsq r1.w, r1.w\nmul r1.xyz, r1.xyz, r1.w\n\n ; ps.1.4를 위한 설정\nmov oT4.xyz, -r1.xyz\n\nmov oT1.w, r1.x ; 계산된 eye vector의 xyz값을 oT1.w, oT2.w, oT3.w에 넣어서 pixel shader로 전달\nmov oT2.w, r1.y\nmov oT3.w, r1.z\nmov oT0.xy, v7.xy ; texture 0의 uv 좌표를 v0 값으로 설정\n\n ; output\ndp4 oPos.x, r0, c4\ndp4 oPos.y, r0, c5\ndp4 oPos.z, r0, c6\ndp4 oPos.w, r0, c7\n\n<html>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<span style="font-size: 14px;"> <b> Pixel Shader </b> </span>\n</div> </html>\nps.1.1 \n ;―――――――――――――――\n ; Used input registers\n ;―――――――――――――――\n ;\n ; T0 - color / bump coordinates\n ; T1 - move u to world space\n ; T2 - move v to world space\n ; T3 - move uv to world space\n ; T1.w, T2.w, T3.w - eye vector\n\n ;―――――――――――――――\n ; Used input texture stages\n ;―――――――――――――――\n ;\n ; stage0 - normal texture\n ; stage3 - Environment texture\n\n ;―――――――――――――――\n ; Output\n ;―――――――――――――――\n ;\n ; r0 - output color\n\n ;===========================================================================\ntex t0 ; Normal Map\ntexm3x3pad t1, t0 ; 1 st matrix row, x of eyevector\ntexm3x3pad t2, t0 ; 2 nd matrix row, y of eyevector \ntexm3x3spec t3, t0, c0 ; 3 rd row & eye z, reflect & sample\n\nmov r0, t3 \n\n----\n ; ps.1.4와 ps.2.0에서는 ps.1.1의 출력과 비슷한 형태의 결과물이 출력 되도록 조정이 필요\n ; 참고 https://forum.beyond3d.com/threads/pixel-shader-incompatibility.1221/\n\nps.1.4\n\n ;―――――――――――――――\n ; Constant registers \n ;―――――――――――――――\n ;\n def c2, -0.98f, -0.92f, 0.0f, 0.0f ; 반사맵 uv 조정 (좌우, 상하, x, x)\n\n ;―――――――――――――――\n ; Used input registers\n ;―――――――――――――――\n ;\n ; T0 - color / bump coordinates\n ; T1 - move u to world space\n ; T2 - move v to world space\n ; T3 - move uv to world space\n ; Get the 3-vector from the normal map\n\n ;―――――――――――――――\n ; Used input texture stages\n ;―――――――――――――――\n ;\n ; stage0 - normal texture \n ; stage3 - Environment texture\n\n ;―――――――――――――――\n ; Output\n ;―――――――――――――――\n ;\n ; r0 - output color\n\n ;===========================================================================\ntexld r0, t0\n\n ; Get environment matrix\ntexcrd r1.rgb, t1\ntexcrd r2.rgb, t2\ntexcrd r3.rgb, t3\n\n ; Normalize eye-ray vector through normalizer cube map\ntexld r4, t4 ; CUBE MAP here!!\n\n ; Transform normal\ndp3 r5.r, r1, r0_bx2 ; 1st row of matrix multiply = N.x\ndp3 r5.g, r2, r0_bx2\ndp3 r5.b, r3, r0_bx2\n\n ; Reflection calculation\n ; ps.1.4 라인 제한 때문에 반사맵 계산을 단순화 시킴\nmov r4, r4_bx2\nadd r4.xyz, r4, c2 ; 반사맵 uv 조정\n \ndp3_x2 r3.rgb, r5, r4 ; 2(N.Eye)\nmul r3.rgb, r5, r3 ; 2N(N.Eye)\nadd r2.rgb, r3, -r4 ; 2N(N.Eye) - Eye cf. ≒ 2*[(N dot E)/(N dot N)]*N - E\n\n ; Dependent read needed\nphase\n\n ; Sample environment map\ntexld r3, r2\n\n ; Output result\nmov r0, r3\n\n----\n ; 비슷한 효과를 내는 Sahder code (∵ Vertex Shader에서 texcrd r1.xyz, t4(Eye Vector), oT4를 설정)\nps.1.4\n\ntexld r0, t0 ; Look up normal map\ntexld r1, t4 \n\ntexcrd r4.xyz, t1 ; 1st row of environment matrix \ntexcrd r2.xyz, t2 ; 2st row of environment matrix \ntexcrd r3.xyz, t3 ; 3rd row of environment matrix \n\ndp3 r4.x, r4, r0_bx2 ; N.x = 1st row of matrix multiply \ndp3 r4.y, r2, r0_bx2 ; N.y = 2nd row of matrix multiply \ndp3 r4.z, r3, r0_bx2 ; N.z = 3rd row of matrix multiply \n\ndp3 r2, r4, r1_bx2 ; (N.Eye)\n\nphase\n\ntexld r3, t3 ; Reflection texture (UV 좌표, 환경맵이 적용되지 않음)\nmul r0.rgb, r3, r2_x2 ; Specular = Reflection * Gloss\nmov r0.w, v0.w\n\n----\nps.2.0\n\n ;―――――――――――――――\n ; Constant registers \n ;―――――――――――――――\n ;\ndef c0, -1.0f, -1.0f, -1.0f, -1.0f ; for _bx2 emulation\ndef c1, 2.0f, 2.0f, 2.0f, 2.0f ; for _bx2 emulation\ndef c2, -0.1f, -0.10f, 0.0f, 0.0f ; 반사맵 uv 조정 (좌우, 상하, x, x)\n\n ;―――――――――――――――\n ; Used input registers\n ;―――――――――――――――\n ; 텍스처 좌표\ndcl t0.xy ; texture coordinates\ndcl t1.xyz\ndcl t2.xyz\ndcl t3.xyz\ndcl t4\n\n ;―――――――――――――――\n ; Used input texture samplers\n ;―――――――――――――――\n ; 텍스처 샘플러\ndcl_2d s0\ndcl_cube s3\n\n ;―――――――――――――――\n ; Used input texture stages\n ;―――――――――――――――\n ;\n ; stage0 - normal texture\n ; stage3 - Environment texture\n\n ;―――――――――――――――\n ; Output\n ;―――――――――――――――\n ;\n ; oC0 - output color\n\n ;===========================================================================\n ; Normal texture 로딩\ntexld r0, t0, s0\n\n ; Normalize eye-ray vector through normalizer cube map\ntexld r4, t4, s3 ; CUBE MAP here!!\n\n ; emulate ps1x _bx2, so substract 0.5f and multiply by 2\nmov r11, c1\nmad r0.xyz, r0, r11, c0\n\n ; Transform normal\ndp3 r5.x, t1, r0 ; 1st row of matrix multiply = N.x\ndp3 r5.y, t2, r0\ndp3 r5.z, t3, r0\n\n ; Reflection calculation\nmad r4.xyz, r4, r11, c0\nadd r4.xyz, r4, c2 ; 반사맵 uv 조정\n\ndp3 r3.xyz, r5, r4 ; (N.Eye)\nmul r3.xyz, r5, r3 ; N(N.Eye)\nmul r3.xyz, r3, c1 ; 2N(N.Eye)\ndp3 r2.rgb, r5, r5 ; N.N\nmad r2.rgb, -r4, r2, r3 ; 2N(N.Eye) - Eye(N.N) cf. 2*[(N dot E)/(N dot N)]*N - E\n \n ; Normalize eye-ray vector through normalizer cube map\ntexld r3, r2, s3\n\nmov oC0, r3\n\n
<html> <span style="font-size: 14px;"> ● 인텔의 WiDi </span> </html>\n\n와이다이(WiDi, Wireless Display) 2.0은 지난해 인텔이 2세대 코어 시리즈와 함께 소개한 기술로, ‘무선으로 노트북과 TV, 모니터 등을 연결할 수 있는 ‘무선 디스플레이 기술’이다.\n기존 1.0 버전이 HD급(720p) 영상과 스테레도 사운드를 지원했던 것에 비해 2.0 버전은 풀HD급(1080p) 영상과 5.1 채널의 사운드를 지원하고, 무선 연결이 가능한 거리도 최대 10m로 늘어나 블루레이급의 콘텐츠를 감상하기에 더욱 유리해져 활용성이 한층 높아진 것이 특징.\n\n''▶ WiDi를 구현하기 위해 필요한 것은? ''\n인텔 2세대 코어프로세서 이상의 CPU, 인텔의 내장 그래픽 칩셋, 인텔 무선랜 모듈이 내장된 노트북과 와이다이 전용 프로그램, 그리고 와이다이의 영상신호를 수신할 전용 어댑터이다.\n\n보통 노트북이나 PC를 샀을 때 WiDi Softward까지 설치가 되어 있다면, 팜레스트의 맨 위에 WiDi 로고 스티커가 붙어 있다. 그리고 와이다이(WiDi)를 지원하는 노트북의 경우 기본적으로 기능을 실행하는 프로그램이 설치되어 있기 때문에 실행해 주면 된다.\n \nCPU와 LAN카드 모두 만족하는데 프로그램이 없다면 intel 홈페이지에서 무료로 다운받아 사용한다.\n\n\n<html> <span style="font-size: 14px;"> ● 미라케스트 (Miracast)</span> </html>\n\n미라캐스트(Miracast)는 노트북, 태블릿, 스마트폰과 같은 장치를 텔레비전이나 모니터와 같은 디스플레이에 무선으로 접속하기 위한 표준이다. 장치를 화면에 연결할 때 케이블을 대체한다는 이유에서 "Wi-Fi를 경유하는 HDMI"로 기술된다. 이전에도 인텔의 WiDi라는 게 있었는데, 이것이 미라캐스트로 계승되면서 WiDi 역시 미라캐스트와 호환성을 가지게 된다.\n\n미라캐스트 기기는 영상/음성을 보내는 측으로부터 무선으로 데이터를 받으면서 모니터 측의 HDMI 단자에는 동일하게 영상/음성 신호를 넣어주는 역할을 한다. \n데이터 전송 규약이 공개되어 있으므로 다른 전자 장치들도 WiFi만 구비되어 있고 미라캐스트 출력을 지원한다면 영상/음성을 전송하는 것이 가능하게 되고, 이 때문에 스마트 폰 같은 경우 화면 자체를 그대로 미러링(Mirroring)해서 미라캐스트 장비에 전송하는 기능이 제공되기도 한다.\n \n무선이다보니 영상이나 소리가 끊기거나 밀리는 현상이 발생하기도 하는데, 이를 줄이려면 미라캐스트 연결 중에 기기를 최대한 움직이지 않도록 해야 하며, 일부 저가형 미라캐스트는 노트북이나 윈도우 태블릿을 연결하지 못하기 때문에 유의.\n\n''▶ 미라캐스트 사용 가능 PC 확인 방법''\n운영체제(윈도우 8.1), 무선 랜카드(NDIS 6.3지원), 그래픽 카드(WDDM 1.3, 미라캐스트 지원) 등 여러가지 조건이 맞아야 한다.\n이런 조건들을 간단히 확인하는 방법으로 윈도의 내가 DirectX 진단 도구 (didiag)를 이용한다.\n<모든 정보 저장>을 해서 'Miracast : Supported'라는 항목이 있는지 확인\n\n\n<html> <span style="font-size: 14px;"> ● 크롬캐스트 (Chromecast) </span> </html>\n\n미라캐스트와 다른 점은, 바로 WiFi 통신을 중계해 주는 무선 액세스 포인트(Access Point) 장비가 있어야 한다. 즉, 미라캐스트는 장치 간에 직접 연결해 영상/음성 데이터를 전송하는 반면 크롬캐스트는 액세스 포인트를 경유해 무선 데이터를 전송받게 된다.\n \n\n\n\n\n\n\n
DDS는 DirectX(이하 DX)의 Texture 포맷과 일대일로 대응하는 파일 포맷으로 손실압축방식이라 다른 포맷에 비해서 상대적으로 비디오메모리를 아낄 수 있고, 많은 갯수의 텍스쳐, 큰 크기의 텍스쳐를 적은 용량으로 해결할 수 있다.\nDDS포맷 용량 그대로 비디오메모리에 올릴 수 있어 높은 퀄리티의 화면을 높은 프레임으로 구현하기가 용이하고, 현재는 DDS가 거의 모든 그래픽카드에서 가속을 지원한다.\n\nNVIDA dds Format (v8.54.0625.1800)\n|format | 구성 | 픽셀당 비트 | 알파 채널 |\n|DXT1 | RGB| 4 bpp |no alpha |\n|DXT1 | ARGB| 4 bpp |1 bit alpha |\n|DXT3 | ARGB| 8 bpp |explicit alpha |\n|DXT5 | ARGB| 8 bpp |interpolated alpha |\n|DXT5_NM | XY| 8 bpp |using DXT5 |\n|기타 포맷 ||>|>|>|\n\n용량은 DXT1 이 제일 작은 1픽셀당 4비트이고 나머지 DXT2 ~ DXT5 는 1픽셀당 8비트를 사용한다.\n\n알파채널이 있는 UI 이미지를 DXTn 포맷으로 저장하면 손실압축이라 이미지가 깨질 수 있기 때문에, PNG나 TGA를 쓰는것이 좋다. dxt5는 알파를 보간하기 때문에 알파값이 급격하게(샤프하게?) 바뀔때는 dxt5가 더 안좋은 결과물을 만들 수 있다.\n\nTGA, JPG, DDS는 파일 포맷이고, A8R8G8B8, DXT1 같은 것은 픽셀 포맷입니다. 따라서 DDS == DXTn 은 아니다.\nDDS에서도 A8R8G8B8로 저장할 수 있고, TGA 32bpp와 거의 비슷하다고 한다.\n\n\n
<html> <span style="font-size: 11pt;"> <font color=RoyalBlue> <b> (오류) error LNK1104: 'nafxcw.lib' 파일을 열 수 없습니다. </b> </font> </span> </html>\nMicrosoft Visual C ++ 6.0 ⇒ VS2013으로 마이그레션을 했고\nVisual Studio 2013에서 프로젝트를 컴파일하는데 이와 같은 오류가 발생한 경우\n\n> LINK : fatal error LNK1104: 'nafxcw.lib' 파일을 열 수 없습니다.\n\nVisual Studio 2013용 멀티바이트 MFC 라이브러리를 설치한다.\nhttps://www.microsoft.com/ko-KR/download/details.aspx?id=40770\n\n\n<html> <span style="font-size: 11pt;"> <font color=RoyalBlue> <b> (오류) error LNK1104 : d3dx9dt.lib 파일을 열 수 없습니다. </b> </font> </span> </html>\n가끔 예전에 만들어진 소스를 다운받아서 컴파일 하다보면 이런 오류가 발생한다.\n\n> LINK : fatal error LNK1104: 'd3dx9dt.lib' 파일을 열 수 없습니다. \n이럴때는 라이브러리 d3dx9dt.lib 대신 d3dx9d.lib 를 사용한다.\n\n<html> <span style="font-size: 11pt;"> <font color=RoyalBlue> <b> fatal error LNK1104: cannot open file 'dxerr8.lib' </b> </font> </span> </html>\nIf you are using the most recent DirectX SDK ("November 2007"), the file dxerr8.lib does no longer exist. To fix this, you'll need to change the newview project to include 'dxerr9.lib' instead. To do this, right-lick newview > Configuration Properties > Linker > Input, click Additional Dependencies on the right to show a button labeled "..." on it at the very right on the line, then click the ... button. Scroll down the list to find 'dxerr8.lib'. Rewrite it to 'dxerr9.lib'. Remember to do this for both the ReleaseForDownload and the ReleaseNoOpt Configurations.\n\n\n<html> <span style="font-size: 11pt;"> <font color=RoyalBlue> <b> (오류) error LNK1104 : libc.lib 파일을 열 수 없습니다. </b> </font> </span> </html>\n출처 ; http://duncom.co.kr/duncom/g5/bbs/board.php?bo_table=aca_2&wr_id=4&sst=wr_hit&sod=desc&sop=and&page=2&device=pc\n싱글 쓰레드용 라이브러리(libc, libcd)는 더이상 지원하지 않는다.\n⇒ 프로젝트 세팅에서 C/C++ > 코드생성 > 런타임 라이브러리 옵션을 /MT나 /MD 계열로 바꾸고 시도\n\n.NET 2003으로 넘어오면서 2002까지 지원하던 구 버전의 iostream Library를 더이상 포함하지 않는다고 한다.\n\n- 구 버전 -\n> LIBCI.lib : Single-thread, Static Link /ML\n> LIBCIMT.lib : Multithreaded, static link /MT\n> MSVCIRT.lib : Multithreaded, dynamic link /MD\n\n- 신 버전 -\n> LIBC.lib : Single-threaded, static link /ML\n> LIBCMT.lib : Multithreaded, static link /MT\n> MSVCRT.lib : Multithreaded, dynamic link /MD\n \n파일명에 ' i '가 빠져있다.\n\n< 해결책 >\n1.프로젝트 속성 -> 구성 속성 -> 링커 -> 입력\n / -> 추가 종속성에 libc.lib가 포함된 경우, libc.lib를 삭제\n / -> 특정 라이브러리 무시에 libci.lib를 포함한다.\n\n2..NET 폴더에서 libcp.lib를 찾아 같은 폴더에 libci.lib라는 이름으로 복사한다.\n
| 종목 |>| 최저 |>| 입 |>| 출 |>| 최고 | 비고 |\n\n@@color(#C7254E): ''상승'' @@\n@@color(#3058D2): ''하락'' @@\n\n
출처 ; https://www.winehq.org/pipermail/wine-devel/2008-February/062290.html\n\ntony.wasserka at freenet.de tony.wasserka at freenet.de \nTue Feb 5 04:29:57 CST 2008 \n\n* Previous message: [10/20] WineD3D: Make Clear aware of the depth stencil sharing \n* Next message: d3dx9_36: Implementation of D3DXCheckVersion try 2 \n* Messages sorted by: [ date ] [ thread ] [ subject ] [ author ] \n----\n\nI probably should've gone into a bit more detail about this function:\nIt's just for developer purpose. If you have a very big project and\nare trying to upgrade e.g. from d3dx9_27 to d3dx9_36 some files\nmay need to be rebuild, some files may not. This function is just there\nto ensure the developer that all files are built with the right dll.\n\nNow THIS means, that we won't ever see an ENDUSER application\nfail because of a d3dx9 version mismatch.\n\nAlso, we come to a problem when a user wants to built an application\nwith Winelib, where we can only use one definition of D3DX_SDK_VERSION\nwhich only applies to ONE dll. Now just watch following code sample:\n> #include "d3dx9.h"\n>\n> int check_version() {\n> if( D3DXCheckVersion( D3D_SDK_VERSION, D3DX_SDK_VERSION ) == FALSE ) {\n> MessageBox( NULL, "D3DX9 Versions don't match!", "Error!", MB_OK );\n> exit( 1 );\n> }\n> }\n\nNow, if a Winelib user compiles this, D3DX_SDK_VERSION is 9 (as its specified in our\ncurrent d3dx9core.h). But if the program requires to be built with d3dx9_36 (and thus\nuses our implementation of D3DXCheckVersion) it will report an error as D3DX_SDK_VERSION\nwas expected to be 36.\n\nSo, the only thing we can test in this function is if D3DX_SDK_VERSION is between 24 and 36,\nwhich are all compatible versions (also, no enduser application will need the accurate implementation\nas stated above). I have made a mistake though, when I defined D3DX_SDK_VERSION to be 9,\nwhich was caused by my somewhat old installation of the DX SDK, which is incompatible\nwith d3dx9_24 to d3dx9_36. (it was statically linked at that time), You don't need correct this\nin your patch, as this will be addressed in one of my future patches, I am just waiting for\nJulliard to (hopefully) accept my d3dx9_24 patch.\n\nIn conclusion, all you have to do is replace the line\n> return ((D3DSdkVersion==D3D_SDK_VERSION) && (D3DXSdkVersion==D3DX_SDK_VERSION));\nwith\n> return ((D3DSdkVersion==D3D_SDK_VERSION) && (D3DXSdkVersion>=24 && D3DXSdkVersion <=36));\n(Could also be => and =<, ain't that familiar with it)\n\nBest regards,\n Tony\n\n
<html> <a name="Page190409"> </a> </html>\n<html>\n<a href="#Page190409_01"> #. ID3DXSprite( ... ); </a> d3d 내에서 2D를 표현하기 위한 인터페이스 </a> <br>\n<a href="#Page190409_02"> #. LPD3DXFONT( ... ); </a> 다이렉트에서 폰트를 사용하게 해주는 인터페이스 </a> <br>\n<a href="#Page190409_03"> #. 폰트의 Point 크기와 논리 크기 변환 방법 </a> <br>\n<a href="#Page190409_06"> #. WM_PAINT 메시지, 출력 유무 설정 </a> ; ValidateRect( ... );, InvalidateRect( ... ); <br>\n<a href="#Page190409_04"> #. DrawText( ... ); </a> <br>\n<a href="#Page190409_05"> #. TextOut( ... ); </a> <br>\n</html>\n\n<html> <span style="background:#E2E2ff; font-size: 16pt;"> <font color=RoyalBlue> <b> 기타 </b> </font> </span> </html>\n\n■ GetDC()로 얻은 DC는 ReleaseDC()로 해체\n / 출력 장치에 연결된 DC이기 때문에 출력 대상과 일치하는 크기\n\n■ CreateCompatibleDC()로 생성한 DC는 DeleteDC()로 해제\n / 출력 대상이 없는 상태로 그리기 특성만 정해져서 만들어지기 때문에 비트맵 객체가 연결은 되어 있지만 제대로 된 비트맵 객체는 아니다.\n\n\n<html> <a name="Page190409_01"> </a>\n<div style="border: 1px solid gold; padding: 10px; background-color: #F9F2F4; ">\n<a href="#Page190409"> <b> #. ID3DXSprite( ... ); </b> d3d 내에서 2D를 표현하기 위한 인터페이스 </a> </div> </html>\n-. 주로 UI를 그리거나 하는 평면 이미지를 그릴때 사용하고, 원하는 국가 언어를 표시할 때도 사용\n\n@@color(#00A850): / Allow multiple draw calls to sort by texture changes by ID3DXSprite @@\n@@color(#00A850): / When drawing 2D text use flags: D3DXSPRITE_ALPHABLEND | D3DXSPRITE_SORT_TEXTURE @@\n@@color(#00A850): / When drawing 3D text use flags: D3DXSPRITE_ALPHABLEND | D3DXSPRITE_SORT_BACKTOFRONT @@\n\nRECT rc;\nLPD3DXSPRITE g_pTextSprite = NULL;\nLPD3DXFONT pFont = NULL;\nLPD3DXFONT pFontItalic = NULL;\n\n//------------------------------------------------------------\npd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB(0, 200, 200, 200), 1.0f, 0 );\n\nIDirect3DDevice9::BeginScene\n @@color(#00A850): / ID3DXSprite::Begin( D3DXSPRITE_ALPHABLEND | D3DXSPRITE_SORT_TEXTURE ); @@\n g_pTextSprite->Begin( D3DXSPRITE_ALPHABLEND | D3DXSPRITE_SORT_TEXTURE );\n \n ID3DXSprite::Draw();\n\n @@color(#00A850): / Draw a simple line using ID3DXFont::DrawText @@\n pFont->DrawText( g_pTextSprite, ..., -1, &rc, DT_NOCLIP, ... );\n\n @@color(#00A850): / Word wrapping and unicode text. @@\n @@color(#00A850): / Note that not all fonts support dynamic font linking. @@\n g_pFont2->DrawTextW( g_pTextSprite, ..., -1, &rc, DT_LEFT | DT_WORDBREAK | DT_EXPANDTABS, ... );\n \n @@color(#00A850): / ID3DXSprite::End(); @@\n g_pTextSprite->End();\nDirect3DDevice9::EndScene\n\npd3dDevice->Present (NULL,NULL,NULL,NULL);\n\n<html> <a name="Page190409_02"> </a>\n<div style="border: 1px solid gold; padding: 10px; background-color: #F9F2F4; ">\n<a href="#Page190409"> <b> #. LPD3DXFONT( ... ); </b> 다이렉트에서 폰트를 사용하게 해주는 인터페이스 </a> </div> </html>\n-.장점 : 간단하며 강력ㅋ 하다. 글씨 크기 , 굵기 등등 조절 가능\n-.단점 : 내부적으로 GDI 사용 ->느림\n{{{\nHRESULT D3DXCreateFont(\n LPDIRECT3DDEVICE9 pDevice,\n INT Height, // 폰트의 픽셀 단위 높이\n UINT Width, // 폰트의 픽셀 단위 폭 (=0) ; 글꼴 크기에 대해 Height 매개변수를 독점으로 제어\n UINT Weight, // 폰트의 두께 (0 ~ 1000) ; FW_DONTCARE\n UINT MipLevels, // 밉맵 레벨의 수 (=1)\n BOOL Italic, // true이면 이텔릭체로 표시\n DWORD CharSet, // DEFAULT_CHARSET ; 현재 시스템 지역에 기반을 두고 문자 집합을 지정\n DWORD OutputPrecision, // 출력의 정확도 ; OUT_DEFAULT_PRECIS\n DWORD Quality, // 논리적 폰트를 물리적 폰트에 얼마나 근접하게 할지 설정 ; DEFAULT_QUALITY\n DWORD PitchAndFamily, // 폰트의 피치를 설정 ; DEFAULT_PITCH | FF_DONTCARE\n LPCTSTR pFacename, // 글꼴 이름 ""\n LPD3DXFONT* ppFont\n);\n}}}\n\n''UINT Weight'' ; 굵은 글씨체로 출력 \n #define FW_DONTCARE 0/ FW_THIN 100/ FW_EXTRALIGHT 200/ FW_LIGHT 300/ FW_NORMAL 400/ FW_MEDIUM 500/ FW_SEMIBOLD 600/ FW_BOLD 700/ FW_EXTRABOLD 800/ FW_HEAVY 900\n\n''DWORD CharSet'' : 문자코드와 문자의 대응 관계를 정의하는 문자셋\n o ANSI_CHARSET : 영어를 사용 지역의 시스템에서는 DEFAULT_CHARSET과 같다\n o SYMBOL_CHARSET : 심볼 집합을 생성\n o MAC_CHARSET : 애플 매킨토시 문자 집합을 생성\n\n''DWORD Quality'' ; 윈도우에서 래스터 글꼴을 사용할 때 어떻게 실제 글꼴과 원하는 글꼴을 맞추는지, 그리고 어떻게 트루타입 글꼴에 영향을 주는지 지정\n\n''DWORD PitchAndFamily'' ; 피치에는 DEFAULT_PITCH, FIXED_PITCH, VARIABLE_PITCH가 있다.\n 패밀리에는 FF_DECORATIVE, FF_DONTCARE, FF_MODERN, FF_ROMAN, FF_SCRIPT, FF_SWISS가 있다. \n\n\n<html> <a name="Page190409_03"> </a>\n<a href="#Page190409"> <span style="background:#E2E2ff ; font-family:돋움; font-size: 16px;"> <b> 폰트의 Point 크기와 논리 크기 변환 방법 </b> </span> </a>\n</html>\n''INT Height'' ; 폰트의 픽셀 단위 높이 (Height = 0 ; Default Height)\n ⇒ Cell Height (양수) = Character Height (음수) + Internal Leading 설정\n| Internal Leading | Cell Height (Height > 0) |\n| <br> Character Height <br> (Height < 0) <br> |~|\n{{{\n#define MulDiv(a,b,c) (((a)*(b))/(c))\n\n// wingdi.h\n#define LOGPIXELSX 88 /* Logical pixels/inch in X (해상도를 조사) */\n#define LOGPIXELSY 90 /* Logical pixels/inch in Y */\n\nint nFontSize = 24; // 일반 크기(pt)(폰트의 Point 크기)\nHDC hDC = GetDC(NULL);\nint nLogPixelsY = GetDeviceCaps(hDC, LOGPIXELSY);\nReleaseDC(NULL, hDC);\n\n// 일반 크기(pt) 를 논리 크기로 변환\nint nHeight = -MulDiv( nFontSize, nLogPixelsY, 72 ); // 논리 크기\n// 논리크기 = -((일반크기 * GetDeviceCaps(hDC, LOGPIXELSY)) / 72)\n\nhr = D3DXCreateFont(g_pd3dDevice, nHeight, 0, FW_DONTCARE, 1, FALSE, DEFAULT_CHARSET,\n OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE,\n "Arial", &pFont );\n \n// 논리 크기를 일반 크기로 변환\n// nFontSize = -MulDiv( nHeight, 72, nLogPixelsY );\n// 일반크기 = -((논리크기 * 72) / GetDeviceCaps(hDC, LOGPIXELSY))\n}}}\n-. 72는 MM_TEXT 매핑 모드에서 1인치당 표시 가능한 픽셀 수를 의미한다.\ncf. MFC ; LOGFONT.lfHeight (논리 크기)\n\n{{{\n#ifdef KOREA\n #define CODE_PAGE_NUM 949\n#elif defined(JAPAN)\n #define CODE_PAGE_NUM 932\n#elif defined(CHINA)\n #define CODE_PAGE_NUM 936\n#elif defined(TAIWAN)\n #define CODE_PAGE_NUM 950\n#elif defined(THAILAND)\n #define CODE_PAGE_NUM 874\n#elif defined(AMERICA)\n #define CODE_PAGE_NUM 437\n#elif defined(INDONESIA)\n #define CODE_PAGE_NUM 437\n#elif defined(SINGAPORE)\n #define CODE_PAGE_NUM 437\n#endif\n}}}\n\n\n<html> <a name="Page190409_06"> </a>\n<a href="#Page190409"> <span style="background:#E2E2ff ; font-family:돋움; font-size: 16px;"> <b> WM_PAINT 메시지, 출력 유무 설정 ; ValidateRect( ... );, InvalidateRect( ... ); </b> </span> </a>\n</html>\n''BOOL ValidateRect( HWND hWnd, CONST RECT *lpRect );''\n / 윈도우의 특정 영역 또는 전체 영역을 유효화 상태로 변경하는 것으로\n 해당 영역을 정상적으로 출력했기 때문에 다시 출력할 필요가 없다고 설정\n / WM_PAINT 메시지가 발생하는 것을 막는데 사용\n\n''BOOL InvalidateRect( HWND hWnd, CONST RECT *lpRect, BOOL bErase);''\n / 사용자가 InvalidateRect 함수를 통해 윈도우의 일부분을 무효화 시켜놓았다면 \n 윈도우에 발생되는 WM_PAINT 메시지를 통해 무효화된 부분을 다시 그려준다.\n / BOOL bErase = TRUE; 무효화 영역의 Background를 지워준다.\n{{{\nLRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)\n{\n switch(uMsg)\n {\n case WM_LBUTTONDOWN:\n {\n InvalidateRect(hWnd, NULL, FALSE);\n // InvalidateRect 함수 호출후 작업... ---> 처리루틴 A\n }\n return FALSE;\n\n \n\n case WM_PAINT:\n {\n // WM_PAINT 메세지 처리 루틴 내 작업... ---> 처리루틴 B\n\n }\n return FALSE;\n\n return DefWindowProc(hWnd, uMsg, wParam, lParam);\n}\n}}}\n\n<html> <a name="Page190409_04"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page190409"> <span style="font-size: 14px;"> #. DrawText( ... ); </span> </a>\n</div> </html>\n{{{\nDrawText(\n HDC hDC, //출력받을 DC\n TCHAR * str, //문장\n int len, //문장 길이 : -1를 넣으면 자동으로 길이를 계산\n RECT * rect, //영역\n UINT flag //출력 방법 플래그\n);\n}}}\nUINT nFormat = DT_LEFT | DT_WORDBREAK;\nnFormat = DT_VCENTER | DT_CENTER | DT_SINGLELINE | DT_END_ELLIPSIS;\n\n''DrawText() Format Flags'' : |(비트연산자 or)로 붙여서 사용 \n|!종류 |!값 |!특징 |\n|#define DT_TOP |0x00000000 |영역의 위로 정렬 |\n|#define DT_LEFT |0x00000000 |영역의 왼쪽으로 정렬 |\n|#define DT_CENTER |0x00000001 |영역의 수평 가운데로 정렬 |\n|#define DT_RIGHT |0x00000002 |영역의 오른쪽으로 정렬 |\n|#define DT_VCENTER |0x00000004 |DT_SINGLELINE이랑 함께 사용한다. 영역의 수직 가운데 정렬 |\n|#define DT_BOTTOM |0x00000008 |DT_SINGLELINE이랑 함께 사용한다. 영역의 아래로 정렬 |\n|#define DT_WORDBREAK |0x00000010 |문장길이가 영역 너비보다 클경우 다음 행으로 넘어가서 계속 출력 <br> 한글인 경우 글자단위로 개행, 영문, 숫자인 경우 단어 단위로 개행 |\n|#define DT_SINGLELINE |0x00000020 |문장길이에 상관없이 한 줄로 출력한다. 영역을 벗어나는 글자는 보이지 않는다. |\n|#define DT_CALCRECT |0x00000400 |출력될 텍스트의 너비와 높이를 계산한다. <br> 이 플래그가 지정되어 있을 경우 텍스트는 출력되지 않고 DrawText 함수는 높이를 리턴한다. |\n|>|!#if(WINVER >= 0x0400) |\n|#define DT_EDITCONTROL |0x00002000 |DT_WORDBREAK에 OR해 주면, 영문, 한글, 술자 모두 글자 단위로 개행 |\n|#define DT_PATH_ELLIPSIS |0x00004000 | |\n|#define DT_END_ELLIPSIS |0x00008000 |글자가 범위를 넘어가며 끝 부분을 '...'로 표시 |\n|>|!#if(WINVER >= 0x0500) |\n|#define DT_NOFULLWIDTHCHARBREAK |0x00080000 |단어 단위로 개행 |\n|>|!#if(_WIN32_WINNT >= 0x0500) |\n|... |... | |\n|>|!#endif /* _WIN32_WINNT >= 0x0500 */ |\n|>|!#endif /* WINVER >= 0x0500 */ |\n|>|!#endif /* WINVER >= 0x0400 */ |\n■ int ''FillRect''( HDC hDC, CONST RECT *lprc, HBRUSH hbr); / / 안이 채워진 사각형을 그리는 함수\n{{{\nHDC hdc;\nchar Str[] = "님은 갔습니다. ....";\n\nRECT rt = { x, y, 400, 300 }; // 초기 설정\nHBRUSH brush = CreateSolidBrush( RGB(0,100,100) );\n\ncase WM_PAINT:\n hdc = BeginPaint(hWnd, &ps);\n\n // 텍스트의 색을 붉은색으로 지정한다\n SetTextColor(hdc, RGB(255, 0, 255));\n // 텍스트 배경의 색을 파란색으로 지정한다\n // SetBkColor(hdc, RGB(0, 0, 255));\n SetBkMode(hdc, TRANSPARENT);\n\n DrawText(hdc, Str, -1, &rt, DT_CALCRECT | DT_LEFT | DT_WORDBREAK);\n FillRect(hdc, &rt, brush); // 출력된 영역만 사각형을 색칠 \n\n DrawText(hdc, Str, -1, &rt, DT_LEFT | DT_WORDBREAK);\n\n EndPaint(hWnd, &ps);\n\n ValidateRect(hWnd, NULL);\n\n return 0;\n}}}\n\n\n<html> <a name="Page190409_05"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page190409"> <span style="font-size: 14px;"> #. TextOut( ... ); </span> </a>\n</div> </html>\n단순하게 텍스트만 출력할 수 있는 함수로 멀티라인을 지원하지 않아 한 줄씩 출력하고,\n정수나 실수를 출력하는 함수는 따로 없으므로 sprintf(), wsprintf() 같은 함수로 서식화하여 문자열을 만들어서 출력한다.\n\nTCHAR str[128];\nint Score = 85;\nwsprintf( str, TEXT("현재 점수는 %d점 입니다."), Score );\nTextOut( hdc, 10, 10, str, lstrlen(str) );\n\n텍스트의 속성을 지정하는 함수인 SetTextAlign, SetTextColor, SetBkColor, SetBkMode 등의 함수를 사용하여 변경할 수 있다.\n보다 다양한 기능을 필요로 하면 DrawText 함수를 사용해야 한다.\n\n@@color(#BE8C3C): SetTextAlign - 문자열의 정렬방법을 변경 @@\n|!플래그 |!설명 |\n|TA_BLASELINE |텍스트의 기준선에 정렬 |\n|TA_TOP |수직 상단 정렬 |\n|TA_BOTTOM |수직 하단 정렬 |\n|TA_CENTER |수평 중앙 정렬 |\n|TA_LEFT |수평 왼쪽 정렬 |\n|TA_RIGHT |수평 오른쪽 정렬 |\n|TA_NOUPDATECP |문자열이 출력된 후 CP(Current Point)는 변경되지 않는다. |\n|TA_RTLREADING |문자열을 오른쪽에서 왼쪽으로 출력한다. 한글 윈도우즈에서는 의미가 없다. |\n|TA_UPDATECP |문자열 출력 좌표 CP를 사용하며 문자열 출력 후 CP를 갱신한다. |\nSetTextAlign 함수로 TA_UPDATECP 플레그를 주면 TextOut 함수는 인수로 전달되는 좌표값을 무시하고 현재 CP위치에 문자열을 출력하며 문자열 출력 후 CP를 문자열의 끝으로 재설정한다. 따라서 CP위치에 문자열을 출력하면 연속된 단어를 계속 출력할 수 있다. \n{{{\n▷ wingdi.h\n/* Text Alignment Options */\n#define TA_NOUPDATECP 0\n#define TA_UPDATECP 1\n\n#define TA_LEFT 0\n#define TA_RIGHT 2\n#define TA_CENTER 6\n\n#define TA_TOP 0\n#define TA_BOTTOM 8\n#define TA_BASELINE 24\n#if (WINVER >= 0x0400)\n#define TA_RTLREADING 256\n#define TA_MASK (TA_BASELINE+TA_CENTER+TA_UPDATECP+TA_RTLREADING)\n#else\n#define TA_MASK (TA_BASELINE+TA_CENTER+TA_UPDATECP)\n#endif\n}}}\n\nSetTextAlign(hdc, TA_UPDATECP); // 연속된 단어로 계속 출력 ; One Two Three\nTextOut(hdc,0,0,"One ",4);\nTextOut(hdc,0,0,"Two ",4);\nTextOut(hdc,0,0,"Three",5);\n\n{{{\nTextOut(\n HDC hDC, //출력받을 DC \n int x, int y, //좌표 \n TCHAR * str, //문장\n int len //문장 길이\n);\n}}}\n\n{{{\n//-----------------------------------------------------------------------------\n//-----------------------------------------------------------------------------\nHRESULT CreateDevice( HWND hWnd )\n{\n RECT rc;\n GetWindowRect(hWnd, &rc);\n HDC hDC = GetDC( NULL );\n HBRUSH br = CreateSolidBrush( RGB( 50, 50, 64 ) ); // 배경색 \n\n FillRect(hDC, &rc, br);\n\n DeleteObject( br );\n\n return S_OK;\n}\n\n//-----------------------------------------------------------------------------\n// Name: MsgProc()\n//-----------------------------------------------------------------------------\nLRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)\n{\n HDC hdc;\n PAINTSTRUCT ps;\n\n switch (msg)\n {\n case WM_CREATE:\n CreateDevice( hWnd );\n return 0;\n\n case WM_DESTROY:\n Cleanup();\n PostQuitMessage(0);\n return 0;\n\n case WM_PAINT:\n hdc = BeginPaint(hWnd, &ps);\n\n Ellipse(hdc, 10, 10, 200, 90);\n\n // 텍스트를 가운데 정렬로 지정\n SetTextAlign(hdc, TA_CENTER);\n // 텍스트의 색을 붉은색으로 지정\n SetTextColor(hdc, RGB(255, 0, 0));\n // 텍스트 배경의 색을 파란색으로 지정\n SetBkColor(hdc, RGB(255, 255, 0));\n // 투명한 문자열 출력 ; OPAQUE (Default, 불투명)\n // cf. GetBkMode : 현재 설정되어 있는 혼합 모드를 조사\n SetBkMode(hdc, TRANSPARENT);\n\n TextOut(hdc, 100, 100, L"Beautiful Korea", 15);\n\n EndPaint(hWnd, &ps);\n return 0;\n }\n return DefWindowProc(hWnd, msg, wParam, lParam);\n}\n}}}\n\ncase WM_PAINT: 가 아닌 default:에서 VOID Render();로 호출한 경우\n{{{\nHDC g_hDC;\nLPD3DXSPRITE g_pTextSprite = NULL;\nLPDIRECT3DTEXTURE9 g_pHTexture = NULL;\n\n\n//------------------------------------------------------------------------------\n//------------------------------------------------------------------------------\nHRESULT InitD3D(HWND hWnd)\n{\n D3DXCreateSprite(g_pd3dDevice, &g_pTextSprite);\n\n // LPDIRECT3DTEXTURE9 g_pHTexture 생성 및 초기화\n g_pd3dDevice->CreateTexture(TEXTURE_WIDTH, TEXTURE_HEIGHT,\n 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &g_pHTexture, NULL);\n\n g_hDC = CreateCompatibleDC(NULL);\n\n return S_OK;\n}\n\ncf. DeleteDC( g_hDC );\n\n//------------------------------------------------------------------------------\n//------------------------------------------------------------------------------\nVOID Render()\n{\n if (NULL == g_pd3dDevice) return;\n\n D3DXVECTOR3 vCenter(0.0f, 0.0f, 0.0f);\n D3DXVECTOR3 vPosition(50.0f, 50.0f, 0.0f);\n\n // Clear the backbuffer to a blue color\n g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0, 0, 0, 255), 1.0f, 0);\n\n // Begin the scene\n if (SUCCEEDED(g_pd3dDevice->BeginScene()))\n {\n// g_pTextSprite->Begin(D3DXSPRITE_ALPHABLEND | D3DXSPRITE_SORT_TEXTURE);\n g_pTextSprite->Begin(NULL);\n/*\n // Rendering of scene objects can happen here\n int y = 10;\n\n SetRect(&rc, 10, y, 0, 0);\n g_pFont->DrawText(NULL, ("ID3DXFont - 연출 연습용 !@#$ 1234 [Normal]"),\n -1, &rc, DT_NOCLIP, D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f));\n \n SetRect(&rc, 10, y += 30, 0, 0);\n g_pFont->DrawText(g_pTextSprite, ("ID3DXFont - 연출 연습용 !@#$ 1234 [Normal Alpha]"),\n -1, &rc, DT_NOCLIP, D3DXCOLOR(1.0f, 1.0f, 1.0f, 0.5f));\n*/\n TextOut(g_hDC, 2, 2, L"퇴근전 커밋!", (int)wcslen(L"퇴근전 커밋!"));\n\n g_pTextSprite->Draw(g_pHTexture, NULL, &vCenter, &vPosition, D3DCOLOR_XRGB(255, 255, 255));\n\n g_pTextSprite->End();\n \n // End the scene\n g_pd3dDevice->EndScene();\n }\n\n // Present the backbuffer contents to the display\n g_pd3dDevice->Present(NULL, NULL, NULL, NULL);\n}\n}}}\n\n\n
@@color(#04f): ▣ 메타포(metaphor) @@ @ 2019-12-18 @\n출처 ; https://uipac.com/87 요약\n\n다른 대상을 통해서 특정 대상을 이해하거나 경험하는 행위라고 할 수 있다. 즉, 사용자가 아직 경험해 보지 못한 대상을 사용자가 이미 경험하고 오래 전부터 알고 있는 대상을 투영하여 알기 쉽게 설명할 수 있도록 하는 것이다. \n\n메타포의 대표적인 예로는, 데스크탑을 처음 사용할 때 데스크탑에 있는 휴지통을 보고 "아! 저것은 문서를 삭제하거나 버리는 곳이구나" 라고 느끼는 것과 같이 기존 휴지통에서 가질 수 있는 경험의 산물을 사용자에게 전달하는 것이다.\n...\n메타포를 설계하는 것은 시스템 설계에서 전반적은 컨셉을 잡아 가는 과정으로, 누구나 이해하기 쉽고 사용자가 봤을 때 명시적으로 알 수 있는 메타포 설계가 메타포 설계의 핵심이다.\n\n* 엔진 학습\n** https://www.unrealengine.com/ko/ - 언리얼 엔진\n* C#\n** http://www.csharpstudy.com/ - 예제로 배우는 C# 프로그래밍 \n* C++\n** http://soen.kr/lecture/win32api/win32lec.htm - API 입문 강좌\n** http://www.functionx.com/vcnet/ - Microsoft Visual C++ .NET Tutorials - FunctionX\n* 무료 아이콘을 받을 수 있는 웹사이트\n** https://iconmonstr.com/ - 아이콘 몬스터(iconmonstr)\n* http://www.homejjang.com/ - 홈짱닷컴(홈페이지 제작가이드) ; CSS(Cascading Style Sheets) 고급 강좌\n* https://hanziyuan.net/ - Chinese Etymology 字源\n** 한자의 서체 ; 전서(篆書), 예서(隸書), 해서(楷書), 행서(行書), 초서(草書)의 다섯 가지\n** 한글의 서체 ; 초기의 인쇄체인 판본체(板本體), 궁중의 여성들을 중심으로 필사체로서 발달한 궁체(宮體)\n\n<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 16px;"> <b> 정렬 알고리즘 </b> </span>\n</html>\n출처 ; https://gmlwjd9405.github.io/2018/05/08/algorithm-merge-sort.html (알고리즘) ''합병 정렬''(merge sort)이란\n!! 합병 정렬(merge sort) 알고리즘의 특징\n* 단점\n** 만약 레코드를 배열(Array)로 구성하면, 임시 배열이 필요하다. ◦제자리 정렬(in-place sorting)이 아니다.\n** 레크드들의 크기가 큰 경우에는 이동 횟수가 많으므로 매우 큰 시간적 낭비를 초래한다.\n* 장점\n** 안정적인 정렬 방법 \n*** 데이터의 분포에 영향을 덜 받는다. 즉, 입력 데이터가 무엇이든 간에 정렬되는 시간은 동일하다. (O(nlog₂n)로 동일)\n** 만약 레코드를 연결 리스트(Linked List)로 구성하면, 링크 인덱스만 변경되므로 데이터의 이동은 무시할 수 있을 정도로 작아진다. \n*** 제자리 정렬(in-place sorting)로 구현할 수 있다.\n** 따라서 크기가 큰 레코드를 정렬할 경우에 연결 리스트를 사용한다면, 합병 정렬은 퀵 정렬을 포함한 다른 어떤 졍렬 방법보다 효율적이다.\n\n!! 정렬 알고리즘 시간복잡도 비교\n| !Name | !Best | !Avg | !Worst | !Run-Time(정수 60,000개, 단위 : Sec) |\n| 삽입정렬 | n | n² | n² | 07.438 |\n| 선택정렬 | n² | n² | n² | 10.842 |\n| 버블정렬 | n² | n² | n² | 22.894 |\n| 셸 정렬 | n | <html> n<sup>1.5</sup> </html> | n² | 0.056 |\n| 퀵 정렬 | <html> nlog<sub>2</sub> </html> | <html> nlog<sub>2</sub> </html> | n² | 0014 |\n| 힙 정렬 | <html> nlog<sub>2</sub> </html> | <html> nlog<sub>2</sub> </html> | <html> nlog<sub>2</sub> </html> | 0.034 |\n| @@bgcolor(#FFee88): 병합정렬 @@ | @@bgcolor(#FFee88): <html> nlog<sub>2</sub> </html> @@ | @@bgcolor(#FFee88): <html> nlog<sub>2</sub> </html> @@ | @@bgcolor(#FFee88): <html> nlog<sub>2</sub> </html> @@ | @@bgcolor(#FFee88): 0.026 @@ |\n* 단순(구현 간단)하지만 비효율적인 방법 \n** 삽입 정렬, 선택 정렬, 버블 정렬\n* 복잡하지만 효율적인 방법 \n** 퀵 정렬, 힙 정렬, ''합병 정렬'', 기수 정렬\n\n
> CVTRES : fatal error CVT1100: 리소스가 중복되었습니다. 형식:MANIFEST, 이름:1, 언어:0x0409\n> LINK : fatal error LNK1123: COFF로 변환하는 동안 오류가 발생했습니다. 파일이 잘못되었거나 손상되었습니다.\n\n1. manifest 파일을 지우면, manifest 파일이 없다는 에러 메시지 발생\n / rc 파일을 직접 열어서\n / 특정 항목 주석 처리 ; CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "res\s\sMiniCalendar.exe.manifest" \n\n2. VS2008 - 프로젝트 속성 창\n / 메니페스트 도구 - 입력 및 출력 텝 - 메니페스트 포함 : 예 -> 아니오 로 변경\n\n
Visual Studio 2012 이후 버전에서는 .fx 파일을 프로젝트에 추가 시켰을 때, 발생하며\n셰이더 관련 컴파일러(.fx)를 설정해 준다.\n\n> 프로젝트 > 속성 > ''HLSL 컴파일러'' > 일반\n>> ''셰이더 형식'' : 효과(/fx)\n>> ''셰이더 모델'' : 셰이더 모델 2(2_0) (cf. .fx 파일에서 컴파일 버전 확인 후 설정)\n
A D3D object has a non-zero reference count(meaning things were not properly cleaned up).\n ⇒ DXUT를 사용하고, 프로그램 종료시 발생하는 에러이며, Direct 관련 객체들을 릴리즈 안했기 때문이다.\n\n※ 참고 code\n{{{\n//-----------------------------------------------------------------------------\n// Name: Cleanup3DEnvironment() (in Common\s d3dapp.cpp)\n// Desc: Cleanup scene objects\n//-----------------------------------------------------------------------------\nvoid CD3DApplication::Cleanup3DEnvironment()\n{\n if( m_pd3dDevice != NULL )\n {\n if( m_bDeviceObjectsRestored )\n {\n m_bDeviceObjectsRestored = false;\n InvalidateDeviceObjects();\n }\n if( m_bDeviceObjectsInited )\n {\n m_bDeviceObjectsInited = false;\n DeleteDeviceObjects();\n }\n\n if( m_pd3dDevice->Release() > 0 )\n DisplayErrorMsg( D3DAPPERR_NONZEROREFCOUNT, MSGERR_APPMUSTEXIT );\n m_pd3dDevice = NULL;\n }\n}\n\n//-----------------------------------------------------------------------------\n// Name: DisplayErrorMsg()\n// Desc: Displays error messages in a message box\n//-----------------------------------------------------------------------------\nHRESULT CD3DApplication::DisplayErrorMsg( HRESULT hr, DWORD dwType )\n{\n static bool s_bFatalErrorReported = false;\n TCHAR strMsg[512];\n\n // If a fatal error message has already been reported, the app\n // is already shutting down, so don't show more error messages.\n if( s_bFatalErrorReported )\n return hr;\n\n switch( hr )\n {\n case D3DAPPERR_NONZEROREFCOUNT:\n _tcscpy( strMsg, _T("A D3D object has a non-zero reference\sn")\n _T("count (meaning things were not properly\sn")\n _T("cleaned up).") );\n break;\n// ...\n\n default:\n _tcscpy( strMsg, _T("Generic application error. Enable\sn")\n _T("debug output for detailed information.") );\n }\n\n if( MSGERR_APPMUSTEXIT == dwType )\n {\n s_bFatalErrorReported = true;\n _tcscat( strMsg, _T("\sn\snThis sample will now exit.") );\n MessageBox( NULL, strMsg, m_strWindowTitle, MB_ICONERROR|MB_OK );\n\n // Close the window, which shuts down the app\n if( m_hWnd )\n SendMessage( m_hWnd, WM_CLOSE, 0, 0 );\n }\n else\n {\n// ...\n }\n\n return hr;\n}\n}}}
참고 ; https://blog.naver.com/kbs3033/70003251127 - 윈도우에서 사용하는 문자 코드에 대한 이해 \n\n<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 14px;"> 일반 문자열과 유니코드 비교 (C++) </span>\n</html>\n\n일반 문자열 = "ABC"; [0]=A, [1]=B, [2]=C\n유니코드 = L"ABC"; [0]=A, [1]=0, [2]=B, [3]=0,[4]=C, [5]=0 - 2 바이트 씩 저장\n{{{\nconst WCHAR *wcCurrent = Str;\nWCHAR str[2] = { L'\s0', L'\s0' };\n\nwhile (wcCurrent && *wcCurrent)\n{\n str[0] = *wcCurrent;\n \n // if (!wcscmp(str, L"\sn")) // 3개의 조건은 동일\n // if ( str[0] == L'\sn' )\n if ( *str == L'\sn' )\n {\n\n }\n\n wcCurrent++;\n}\n}}}\n\n#. 유니코드와 멀티바이트 환경에서 문자 갯수가 달라짐\n / wcslen(L"가나다12") 일 때, 5 ; 글자 갯수\n / strlen( "가나다12") 일 때, 8 ; 바이트 갯수\n\n<html>\n<div style="border: 1px solid gold; padding: 10px; background-color: #F9F2F4; ">\n<span style="font-size: 14px;"> <b> #. 유니코드 </b> (Unicode) </span>\n</div> </html>\n전 세계의 모든 문자를 컴퓨터에서 일관되게 표현하고 다룰 수 있도록 설계된 산업 표준이며, 유니코드 협회(Unicode Consortium)가 제정한다. 이 표준에는 ISO 10646 문자 집합, 문자 인코딩, 문자 정보 데이터베이스, 문자들을 다루기 위한 알고리즘 등을 포함하고 있다. \n\n| | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 |\n| 초 | ㄱ | ㄲ | ㄴ | ㄷ | ㄸ | ㄹ | ㅁ | ㅂ | ㅃ | ㅅ | ㅆ | ㅇ | ㅈ | ㅉ | ㅊ | ㅋ | ㅌ | ㅍ | ㅎ | | | | | | | | | |\n| 중 | ㅏ | ㅐ | ㅑ | ㅒ | ㅓ | ㅔ | ㅕ | ㅖ | ㅗ | ㅘ | ㅙ | ㅚ | ㅛ | ㅜ | ㅝ | ㅞ | ㅟ | ㅠ | ㅡ | ㅢ | ㅣ | | | | | | | |\n| 종 | X | ㄱ | ㄲ | ㄳ | ㄴ | ㄵ | ㄶ | ㄷ | ㄹ | ㄺ | ㄻ | ㄼ | ㄽ | ㄾ | ㄿ | ㅀ | ㅁ | ㅂ | ㅄ | ㅅ | ㅆ | ㅇ | ㅈ | ㅊ | ㅋ | ㅌ | ㅍ | ㅎ |\n\n초성 : 자음(14) + 쌍자음(5) = 19 개\n중성 : 자음(10) + 쌍자음(11) = 21 개\n종성 : 자음(14) + 쌍자음(11) + 쌍자음(2) = 27 개 (종성을 사용하지 않는 경우 + 1)\n ◾ 총 크기 = 19 X 21 X 28 ( = 11,172 )\n\n유니코드 한글 범위 ; U+AC00 ~ U+D7AF (블록 크기 ; 11,184) (cf. U+ 16진수 숫자)\n ◾ 유니코드 완성형 한글코드 = 0xAC00 + 28*21*(초성인덱스) + 28*(중성인덱스) + (종성인덱스)\n\n\n<html>\n<div style="border: 1px solid gold; padding: 10px; background-color: #F9F2F4; ">\n<span style="font-size: 14px;"> <b> #. MBCS </b> (Multibyte character set) ; 멀티 바이트 문자 집합 </span>\n</div> </html>\nVisual C++에서 MBCS는 항상 DBCS를 의미하며. 2바이트보다 큰 문자 집합은 지원하지 않는다.\nMBCS는 멀티바이트 문자를 위한 모든 유니코드를 사용하지 않는 지원을 설명하는 데 사용된다. \n\nASCII 문자 집합은 모든 멀티바이트 문자 집합의 부분 집합으로 정의된다. 많은 멀티바이트 문자 집합에서 0x00 - 0x7F 범위의 각 문자는 ASCII 문자 집합 내의 동일한 값을 가진 문자와 같다. 예를 들어, ASCII 및 MBCS 문자열 모두에서 1바이트 NULL 문자('\s0')는 0x00 값을 가지며 종료 null 문자를 가리킨다.\n\n<html>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<span style="font-size: 14px;"> #. DBCS (double-byte character set) ; 더블 바이트 문자 집합 </span>\n</div> </html>\nDBCS (double-byte character set) ; 더블 바이트 문자 집합\n2바이트로 된 개별 문자가 포함된 문자 집합으로, DBCS는 특별한 문자나 기호를 포함하는 국가 언어를 지원한다.\n\n가장 일반적인 MBCS 구현은 DBCS(더블바이트 문자 집합)이다. \n\nDBCS 문자는 1 바이트 또는 2 바이트로 구성됩니다. 일부 범위의 바이트는 선행 바이트로 사용되기 때문에 따로 둡니다. 선행 바이트에 따라 선행 바이트와 뒤따르는 바이트가 하나의 2 바이트 문자를 구성한다. \nDBCS는 소위 확장 8비트 문자 집합이라고 한다. 문자를 나타내는 단위가 한 바이트 혹은 두 바이트이기 때문에 일종의 ANSI 문자 집합으로 간주된다. \n\nDBCS문자, 즉 2바이트 문자의 폭도 개별적으로 다르기 때문에 '한'자의 폭을 대표로 사용할 수 없기 때문에 출력과 정렬이 정상적으로 이루어지지 않는다. \n정확한 출력과 정렬을 위해서는 각 문자에 대해 정확한 폭을 계산하도록 해야 한다. \n\n<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 14px;"> 한글 폰트 구성 예 </span>\n</html>\n| (0x...) 코드 | 설명 |\n|a1a1~a2ff |그래픽 기호 |\n|a3a1~a3ff |전각 숫자 및 알파벳 |\n|a4a1~a4a1 |한글 낱글자, 고어 |\n|a5a1~a5ff |그리스 문자 |\n|a6a1~a9ff |원 문자, 괄호 문자, 선 문자, 도량형 문자 |\n|aaa1~abff |일본어 |\n|aca1~acff |러시아어 |\n|b0a1~c8fe |완성형 한글 |\n|ca00~ |한자 |\n\n참고 ; http://soen.kr/project/dangeun/dg1/12-4-2.htm - (당근) 가변폭 폰트 지원\n\n\n!! ● 문자열 가공\n{{{\n// TCHAR m_strMeshFilename[512];\n#ifdef UNICODE\n int cchFileName = _tcslen(m_strMeshFilename);\n#else\n int cchFileName = strlen(m_strMeshFilename);\n#endif\n\n#ifdef UNICODE\n OutputDebugString(_T("----> X_FileFormat \sn"));\n#else\n OutputDebugString("----> X_FileFormat \sn");\n#endif\n}}}\n\n\n!! ● TCHAR ↔ char 변환\nTCHAR tmp[256]=L"한글입니당";\nint len = 256;\nchar ctemp[256];\n \nWideCharToMultiByte(CP_ACP, 0, tmp, len, ctmp, len, NULL, NULL);\nprintf("%s" , ctmp);\n\n\n!! ● char -> TCHAR 변환\nchar charBuff[]="test";\nTCHAR szUniCode[256]={0,};\nMultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, charBuff, strlen(charBuff), szUniCode, 256);\n\n\n!! ● (오류) error C2664: 매개 변수 1을(를) 'const char [11]'에서 'LPCWSTR'(으)로 변환할 수 없습니다.\n유니코드 문자 집합을 사용함으로 생기는 문제\n -. 프로젝트 속성 페이지 > 구성 속성 > 일반 > 프로젝트 기본값 > 문자 집합 \n ; '유니코드 문자 집합 사용' 이외의 옵션 사용\n -. 문자열 앞에 _T()메크로를 사용하는 것입니다. "test" - > _T("test") \n\ncf. visual studio 6.0 -> VS2008 마이그레이션에서 많이 발생\n\n
<html> <span style="font-size: 11pt;"> <font color=RoyalBlue> <b> d3dapp.obj : error LNK2001: _Direct3DCreate9@4 외부 기호를 확인할 수 없습니다.</b> </font> </span> </html>\n\nDebug 모드에서 정상적으로 빌드가 되지만, Release 모드에서는 위와 같은 에러 메시지를 출력하는 경우\n추가 종속성을 설정하는 부분까지 꼼꼼히 확인해야 한다.\n\n< 해결책 >\n프로젝트 속성 -> 구성 속성 -> 링커 -> 입력\n / -> 추가 종속성에 필요한 lib가 포함 되어 있는지 확인\n\nDXSDK9B의 Samples 소스에서는 아래의 lib가 포함된 경우가 있다.\nd3dxof.lib\ndxguid.lib\nd3dx9d.lib\nd3d9.lib\ncomctl32.lib\nwinmm.lib\n
출처 ; linuxism.tistory.com/334\n\n!!! 확장비트열(escape sequence)\n아스키 문자 집합의 27번째 문자인 확장 문자(ESC)로 시작되는 비트열. ESC와 1개 또는 2개 이상의 문자의 집합으로 이루어지는 확장 비트열은 인쇄기와 같은 주변 장치와 프로그램에 대해서 어떤 명령을 수행하도록 하는 제어 문자로 사용된다. 확장 비트열은 특히 인쇄기에 대해서 강조 활자(굵은 활자)로 인쇄하게 하는 등 다양한 명령을 내리는 데 사용된다. \n \n''이스케이프 시퀀스(escape sequence)''는 컴퓨터와 주변 기기의 상태를 바꾸는 데에 쓰이는 일련의 문자열이다. 제어 시퀀스(control sequence)라고도 한다. 일부 제어 시퀀스는 늘 같은 의미를 지니고 있는 특수 문자이다. 이스케이프 시퀀스는 이스케이프 문자를 이용하여 이를 따르는 문자들의 뜻을 바꿀 수 있는데, 여기서 문자들은 데이터가 아닌 실행 명령어로 해석할 수 있다. \n\n키보드의 "엔터키"에 해당하는 "Escape 문자"는, \sn(₩n) 이다. 각종 프로그래밍 언어에서나, 편집기 등에서 \sn 을 엔터키 대신에 사용할 수 있다.\n\n''escape sequence 종류''\n| !escape sequence | !Represents | !의미 |\n| \s0 | NULL |공백 문자 |\n| \sa | Bell (alert) |경보 문자 |\n| \sb | Backspace |백스페이스 |\n| \sf | Formfeed |새 페이지로 |\n| \sn | New line |다음 줄로 |\n| \sr | Carriage return |현재 행의 처음으로 |\n| \st | Horizontal tab |수평 탭 문자 |\n| \sv | Vertical tab |수직 탭 문자 |\n| \s' | Single quotation mark |작은 따옴표 |\n| \s " | Double quotation mark |큰 따옴표 |\n| \s\s | Backslash |백슬래쉬 |\n| \s? | Literal question mark |물음표 |\n| \s ooo | ASCII character in octal notation |아스키 문자의 8진수 표기 |\n| \sxhh | ASCII character in hexadecimal notation |아스키 문자의 16진수 표기 |\n\n"\sr" ; Carriage Return(CR) - 종이를 다시 오른쪽 끝으로 움직인다.\n"\sn" ; Line Feed(LF) ≒ New Line - 종이를 위로 올려준다.\n\nteletype를 제어할 시절에는 작성하고 있는 문서를 한 줄 내려 작성하기 위해서 우선 CR(커서를 맨 앞으로 되돌리기)을 하고 LF(종이를 한 칸 올리기)를 해야 한다. 그래서 한 줄을 내리기 위해서 CRLF(\sr\sn, 정확히 ASCII 코드로는 13번과 10번)을 해줘야만 한다.\n\nUnix-like OS에서는 한 줄 내림을 LF만 가지고 표시한다.\nWindows OS에서는 한 줄 내림을 전통적인 방식의 CRLF를 쓴다.\n\n
▷ 출처 ; https://m.blog.naver.com/PostView.nhn?blogId=milennium9&logNo=20180066954&proxyReferer=http://www.google.co.kr/url?url=http://m.blog.naver.com/milennium9/20180066954&rct=j&frm=1&q=&esrc=s&sa=U&ved=0ahUKEwizot7p6-fWAhXDw7wKHcasA-4QFggTMAA&usg=AOvVaw1EBzPv_5OSU1DnKR2ZpmTj\n - 구떡의 블로그\n\n<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 12px;"> <b> - 문제 발생 ; Visual Studio 2005, Windows 7 (64비트) OS / Hellgate, Release 빌드시 발생 </b> </span>\n</html>\n\nLINK1106 에러는 대부분 하드디스크가 꽉 찼을 때 만나던 에러인데 하드디스크가 50Gb 정도 남아 있는 상태에서 발생.\n\n* MSDN에서 설명한 원인은\n** 디스크가 가득 찼습니다. 디스크의 공간을 확보한 후 다시 시도하세요.\n** 네트워크를 통해 링크를 시도했습니다. 일부 네트워크는 링커에서 사용되는 memory-mapped 파일을 완전히 지원해 주지 못합니다. 로컬 디스크에서 링크를 재시도 해보세요.\n** 디스크에 배드블럭이 존재합니다. 운영체제와 하드웨어에서 에러를 발견하려면 disk-checking 프로그램을 실행하세요.\n** 힙 공간이 부족합니다. C1060 (http://msdn.microsoft.com/en-us/library/yz7kx3y2(v=vs.80).aspx) 문서를 참고 하세요.\n\n문제는 1, 2, 3에 해당하지 않는 원인으로 발생한 문제로, 하드디스크의 문제라면 다른 PC에서는 빌드가 되어야 하지만 빌드가 되지 않음.\n\n그래서 4번 메모리 부족을 원인으로 지목했습니다. 실제로 빌드된 lib 파일의 크기는 500Mb가 넘는 거대한 파일이 생성되니까 내부적으로 메모미 부족이 일어날 수 있다고 생각되었습니다. 무엇보다 빌드 실패한 PC들이 32bit OS를 사용하고 있었고, 빌드가 되는 PC들은 64bit를 사용하고 있었다는 것이 결정적인 단서가 되었습니다.\n\n그러면 이러한 현상을 해결하는 방법은 무엇이냐고 하니 바로 링커 옵션이었습니다.\n<프로젝트 속성 -> 링커(라이브러리 매니저) -> 명령줄> 에다가 \n''/expectedoutputsize:1000000000''\n\n이런식으로 출력파일의 예상 사이즈를 입력해주면 내부적으로 메모리를 알아서 잘 할당을 하는 것 같습니다. 물론 32bit OS에서 예상 사이즈를 2Gb 이상 할당하다보면 메모리 부족으로 계속 링크가 안됩니다. 그런 파일을 꼭 빌드해야 겠다고 하면 64bit OS로 갈아타야 합니다.\n\n\n<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 16px;"> <b> LNK1106 with big binary resource - Stack Overflow </b> </span>\n</html>\n\n▶ 출처 ; https://stackoverflow.com/questions/1742568/lnk1106-with-big-binary-resource\n(c++ - LNK1106 with big binary resource - Stack Overflow)\n\nIf the .res file is 544078588 bytes (about 518.9MB) or larger, the error occurs.\n/ expectedoutputsize:600000000 설정 (∵ 544,078,588 bytes ≒ 518.9 MB)\n\ncf. 32비트 XP 및 Windows Vista, 7에서 메모리 3GB 사용을 사용하기 위해서는 메모리 3GB 옵션을 켜서 응용프로그램이 3G메모리를 쓸 수 있도록 한다.\n윈도우7에서 설정을 할 경우에는 시작 / 실행에 다음과 같이 입력을 하고 리부팅을 한다.\nbcdedit /set IncreaseUserVa 3072\n
출처 ; 2017년 10월 1호 글로벌게임산업트렌드 (2017-10-13)\n'(글로벌) 인-게임 아이템의 역할과 수익 전략 변화'의 요약 정리\n\n<html> <span style="color:#7820b9; font-family:돋움; font-size: 14px;"> <b> #.인-게임 아이템 확산 배경 </b> </span> </html>\n\n○ 게임산업에서 인-게임(in-game) 아이템 등장은 부분유료 비즈니스 모델 확산이 주요 요인\n○ 스마트폰 확산과 앱마켓 중심의 유통구조도 부분유료화 확산의 주요 요인으로 작용 \n○ 부분유료 비즈니스 모델은 유료 판매 중심이던 게임산업에서 게임을 무료로 배포하는 새로운 비즈니스 모델로 평가. \n 무료로 배포한 게임의 이용자 수를 기반으로 부가 콘텐츠 결제를 통해 수익 확보\n\n\n<html> <span style="color:#7820b9; font-family:돋움; font-size: 14px;"> <b> #.주요 F2P(Free-To-Play) 비즈니스 모델 </b> </span> </html>\n\n○ 수익화 측정 플랫폼 ‘숨라(SOOMLA)’ 설립자 야니브 니잔(Yaniv Nizan)은 F2P게임에서 활용 가능한 비즈니스 모델 42개를 7개 영역으로 분류\n\n<html> <span style="color:#0075c8; font-family:돋움; font-size: 12px;"> <b> F2P게임에서 활용 가능한 주요 비즈니스 모델 </b> </span> </html>\n| 분류 | 주요 비즈니스 모델 |\n| 광고 | 배너광고, 틈새광고, 게임 종료 시 광고, 유사한 게임 <br> 아이콘 노출, 쿠폰 제공, PPL, 비디오 광고, 검색 광고, <br> 리워드 광고, 이용자 데이터 판매 등 |\n| 콘첸츠 판매 | 프리미엄 버전 게임 별도 제작, 상위 레벨 콘텐츠 유료 판매, <br> 지도나 배경 등 디자인을 변경한 콘텐츠, 월페이퍼(Wallpaper), <br> 벨소리 등 |\n| 제한 제거 | 광고 제거, 게임 이용 시간 및 횟수 추가 아이템 판매, <br> 스테이지 클리어를 위한 제한시간이 있는 경우 시간 판매 |\n| 가상아이템 판매 | 캐릭터 판매, 레벨업이나 튜닝, 무기 등을 통한 이점 제공, <br> 업그레이드, 외형 변경, 게임에 필요한 주요 자원 판매, <br> 아이템 제작 시스템, 자원 획득 X배, 랜덤박스(가챠(gotcha) 포함), <br> 한정판 아이템 등 |\n| 결재 다양화 | 통신사, 바우처, 모바일 결제 등 결제 수단 다양화를 통한 수익 확보 |\n| 부가 상품 판매 | 의류, 스마트폰 케이스 등 IP를 활용한 부가상품 판매 |\n| 이벤트 | 게임 대회 및 e스포츠, 유료 선물 기능 등 |\n출처: Gameanalytics 블로그(www.gameanalytics.com)\n\n\n<html> <span style="color:#7820b9; font-family:돋움; font-size: 14px;"> <b> #. 인-게임 아이템의 주요 형태 </b> </span> </html>\n\n○ 게임 수익화를 위해 활용되는 인-게임 아이템의 주요 형태는 게임 장르, 이용자 반응, 콘텐츠 형태, ARPU(Average Revenue Per User) 등이 영향을 미쳤으며 한 가지 아이템만을 판매하기보다 다양한 형태의 인-게임 아이템이 동시에 활용되는 경향\n ■ 게임의 생명이 긴 온라인게임보다 상대적으로 주기가 짧은 모바일게임을 중심으로 다양한 인-게임 아이템 활용. \n 짧은 주기로 인해 초기 모바일게임은 온라인게임보다 수익 확보에 집중\n ■ 전략, RPG 장르 인기, 지속적인 업데이트와 콘텐츠 제공 중요성 증가 등으로 상위 차트에 위치한 모바일게임을 \n 중심으로 생명 주기가 과거보다 길어지고 ARPU가 증가 \n\n<html> <span style="color:#0075c8; font-family:돋움; font-size: 12px;"> <b> 1.경쟁우위 중심의 인-게임 아이템 </b> </span> </html>\n\n○ 경쟁우위 중심의 인-게임 아이템은 유료 결제를 통해 다른 이용자보다 경쟁에서 우위를 점할 수 있는 것이 특징\n ■ 캐릭터의 강함이 중요한 요소로 작용하는 RPG 게임이나 다른 이용자와 직접 경쟁해야 하는 전략, FPS 게임에서 주로 활용\n ■ 경쟁 우위 중심의 인-게임 아이템 판매는 유료 결제 이용자가 다른 이용자보다 경쟁에서 우위를 점하는 특성으로 인해 ‘페이 투 윈(Pay to Win)’ 게임으로 통칭. 일부 게임의 지나친 유료 결제 유도로 인해 비판 대상\n\n<html> <span style="color:#0075c8; font-family:돋움; font-size: 12px;"> <b> 2.시간 단축을 위한 인-게임 아이템 </b> </span> </html>\n\n○ 시간 단축을 위한 인-게임 아이템은 전략이나 건설 게임을 중심으로 활용. 건물 건설 및 유닛 생성이 게임의 중요한 부분을 차지하는 장르 특성 상 시간 단축은 타 이용자와의 경쟁에서 중요한 요소로 작용\n ■ 전략 장르는 건물 건설, 유닛 생성, 타 유저 영지 침입 및 자신의 영지 방어가 기본 콘텐츠. 건물 건설 및 업그레이드, 유닛 생성에 짧게는 몇 분부터 길게는 2주 이상 시간 소요\n ■ 발전 속도가 타 이용자 대비 경쟁 우위를 점할 수 있는 중요한 요소이기 때문에 전략이나 건설 게임에서 시간 단축을 위한 인-게임 아이템은 ‘페이 투 윈’으로 간주되기도 함\n\n○ 시간 단축의 다른 케이스는 FPS 게임에서 활용하는 방식으로 최고 등급 캐릭터 획득을 위해 소요되는 시간 단축\n ■ 이용자는 유료 결제 없이 게임 내 모든 콘텐츠 이용 가능. 유료 결제를 통해 얻을 수 있는 장점은 최고 등급 캐릭터 획득을 위한 경험치, 게임 내 화폐 획득 증가\n ■ 최고 등급 캐릭터를 획득하더라도 실제 게임 플레이 시 아군과 적군 모두 비슷한 등급의 캐릭터가 매칭돼 캐릭터 등급이 절대적인 우위를 제공하지 않음\n\n<html> <span style="color:#0075c8; font-family:돋움; font-size: 12px;"> <b> 3.불편함 제거를 위한 인-게임 아이템 </b> </span> </html>\n\n○ 불편함 제거를 위한 인-게임 아이템은 PC 온라인게임과 모바일게임을 중심으로 활용. 이용자에게 직접적 이익을 제공하지 않고 게임 이용 시 불편한 요소를 유료 아이템을 통해 해결\n ■ PC 온라인게임은 가방, 아이템 무게, 이동 속도, 순간이동 등 게임 진행 관련 요소들을 유료 아이템을 통해 해결하는 방식 선택. 모바일게임은 게임 이용 횟수, 진행 속도, 자동 사냥 등 편의성 중심\n ■ PC 온라인게임은 가방, 아이템 무게, 이동 속도, 순간이동 등 게임 진행 관련 요소들을 유료 아이템을 통해 해결하는 방식 선택. 모바일게임은 게임 이용 횟수, 진행 속도, 자동 사냥 등 편의성 중심\n\n<html> <span style="color:#0075c8; font-family:돋움; font-size: 12px;"> <b> 4. 스킨과 랜덤박스 </b> </span> </html>\n\n○ 스킨(Skin)과 랜덤 박스, 최근 PC 온라인게임을 중심으로 활용. MOBA(Multiplayer Online Battle Arena), FPS 등 이용자 경쟁 기반 게임이 게임성에 영향을 미치는 인-게임 아이템보다 캐릭터, 무기 외형변경 아이템을 중심으로 수익 창출\n ■ 게임에서 다른 요소의 개입 없이 이용자의 실력이 유일한 승리 요인이 될 수 있다는 점, 이용자 선택에 따라 별다른 유료 결제 없이 모든 콘텐츠 이용이 가능해 이용자 유입\n ■ 방대한 이용자를 바탕으로 캐릭터 스킨 판매를 통해 수익 창출\n\n\n<html> <span style="color:#7820b9; font-family:돋움; font-size: 14px;"> <b> #. 인-게임 아이템의 변화 양상 </b> </span> </html>\n\n○ 인-게임 아이템은 게임 밸런스에 직접 영향을 미치는 방식에서 외형 변경, 불편함 제거 등 이용자 지속성에 초점을 맞추는 방향으로 변화\n ■ 경쟁에서 승리하기 위한 일방적인 유료 결제 유도보다 게임, 캐릭터에 대한 이용자의 애착을 형성하고 이를 기반으로 유료 결제 유도\n\n○ 모든 게임에 스킨과 같은 인-게임 아이템이 효과를 보이는 것은 아님. 게임 전문 매거진 ‘가마수트라(Gamasutra)’는 외형 변경 인-게임 아이템이 효과를 보일 수 있는 조건 분석\n ■ 외형 변경 중심 인-게임 아이템이 효과를 보일 수 있는 주요 조건은 다음과 같음\n - 거대한 이용자 및 커뮤니티 규모.\n - 게임 영상 스트리밍 활성화로 이용자의 모방\n - 캐릭터 밸런스와 이용자간 높은 경쟁 요소\n - 이용자 욕구 충족을 위한 많은 수의 외형 변경 아이템\n ■ 중요한 부분은 많은 이용자 규모와 높은 충성도가 전제 되어야 한다는 점. ‘가마수트라’는 <리그 오브 레전드>의 이용자 유료 결제 전환율이 5%미만이며, 다른 비즈니스 모델을 선택한 PC 온라인게임의 15~25%보다 낮은 편임을 지적\n\n\n<html> <span style="color:#7820b9; font-family:돋움; font-size: 14px;"> <b> #. 게임의 장르, 생명 주기, 기대 이용자 수 등에 대한 분석 필요 </b> </span> </html>\n\n○ 인-게임 아이템 판매가 게임 산업의 주요한 비즈니스 모델인 상황에서 성공한 대형 게임 비즈니스 모델의 단순 모방은 실패할 가능성 높음\n ■ 'EA' 자회사 ‘미스틱 엔터테인먼트(Mythic Entertain-ment)’의 케이트 플랙(Kate Flack)은 게임이 인기를 얻는 원인은 비즈니스 모델 하나 때문만이 아님을 지적\n ■ 마케팅, 그래픽, 출시 날짜, 기술 수준, 게임 플레이 방식, 수익 창출 옵션 등 다양한 원인이 있으며 게임 설계 전 게임에 맞는 비즈니스 모델에 대한 대략적인 계획이 있어야 함을 조언\n ■ 가입형, 유료 게임, F2P 등 다양한 수익 창출 형태에 따라 게임이 초점을 맞추어야 하는 부분이 달라지기 때문 \n ■ 인디게임 인큐베이터 ‘엑스큐션 랩(Execution Labs)의 케이스 카츠(Keith Katz)는 상위 순위에 위치한 게임의 비즈니스 모델 분석에서 얻을 수 있는 것은 거의 없음을 지적\n ■ F2P 모델에서 게임의 무료 제공과 이용자에게 호소할 수 있는 콘텐츠의 균형을 찾는 과정이 더욱 중요하며, 이를 위해 게임 팬덤(fandom)에 대한 이해가 더욱 중요함을 언급 \n\n\n
Visual Studio의 프로젝트 속성\n/ C++\n - 일반\n 경고를 오류로 처리 : '아니오' 로 설정
출처 ; http://copynull.tistory.com/40 - 2010.06.05.\n\nVisual Studio 환경에서 작성한 프로그램에서 ''stack overflow''가 발생되었다면, 프로젝트 속성에서 지정한 stack의 크기를 벗어났음을 의미한다.\n\n임의로 stack 크기를 지정하지 않은 상태에서 \nchar str[1024*1024*10]; 으로 10MB의 변수 메모리를 할당하였다면, stack overflow 발생될 것이다.\n\nMS Visual Studio에서 default로 정해진 stack size는 ''1M byte'' 이다. (1024*1024*1)\n속성 페이지 > 구성 속성 > 링크 > 시스템\n '''스택 예약 크기'''가 0으로 지정되어 있으면 default 값으로 1MB의 스택사이즈를 가진다.\n\n더 큰 사이즈의 stack을 사용하고 싶다면 2가지 방법이 있다.\n\n1.아예 동적으로 힘 공간을 사용하는 방법이다.\n new delete나 malloc free로 할당하면 heap 공간은 유연하게 늘어나고 줄어드는 사용자 메모리를 할당할 수 있다.\n\n2.Visual Studio에서 제공되는 스택사이즈를 조절할 수 있다.\n 프로젝트 - 속성 - 링크 - 시스템에서 stack reserve size(스택예약크기)를 변경한다.\n 예를 들어 10MB를 사이즈를 넣고 싶다면 1024*1024*10 = 10485760 으로 설정한다.\n\nheap를 너무 많이 사용하면 동적시의 new delete시의 오버헤드가 많아서 영향을 끼칠 것이고, 스택을 너무 많이 사용하면 프로그램의 전체적인 메모리 효율성이 떨어지기 때문에 heap과 스택을 적덜히 사용하는게 좋은 코팅방법이다.\n
<html> <span style="font-size: 10pt;"> <font color=RoyalBlue> <b> 큰돈보다는, 작은 여러 종류의 보상을 부여하라 </b> </font> </span> </html>\n@@color(#04f): '분배할 수 있는 상' @@\n@@color(#8A084B): 와인 정보 @@\n\n++++[남자를 불에 비유하면]\n10대 : 부싯돌(불꽃만 일어난다).\n20대 : 성냥불(확 붙었다가 금세 꺼진다).\n30대 : 장작불(강한 화력에다 새벽까지 활활 타오른다).\n40대 : 연탄불(겉으로 보면 그저 그래도 은은한 화력을 자랑한다).\n50대 : 화롯불(꺼졌나 하고 자세히 뒤져보면 아직 살아 있다).\n60대 : 담뱃불(힘껏 빨아야 불이 붙는다).\n70대 : 반딧불(불도 아닌 게 불인 척한다).\n80대 : 도깨비불(불이라고 우기지만 본 놈이 없다).\n===\n\n+++[여자 나이와 국가]\n20대 : 여자나이 스물이 되면 스페인을 닮은 꼴이 된다.\n 아주 뜨겁고 느긋해서 자기의 아름다움에 대한 자신감이 있다.\n30대 : 여자나이 서른이 되면 이태리를 닮은 꼴이 된다.\n 예전만은 못해도 여전히 가볼 만하고 따뜻하고 탐스러운 데가 있다.\n40대 : 여자나이 마흔이 되면 영국을 닮은 꼴이 된다.\n 남들은 알아주지 않는데 아직도 자기가 최고라는 착각에 산다.\n 을씨년스러운 날씨에 안개도 잘 껴서 사람들을 곤혹스럽게 만든다.\n50대 : 여자나이 쉰이 되면 캐나다를 닮은 꼴이 된다.\n 아주 넓고 조용하며 국경에는 사실상 순찰이 없고…\n 몹시 차가워서 사람들이 얼씬하지 않는다.\n60대 : 여자나이 예순이 되면 몽골과 닮은 꼴이 된다.\n 오래전 옛날 온갖 정복으로 엮어낸 영광스런 과거가 있지만…\n 한스럽게도 미래가 없다.\n70대 : 여자나이 일흔이 되면 이라크 같은 꼴이 된다.\n 그 나라가 어디 있는지는 다들 알지만…\n 그곳에 가 보고 싶어하는 사람은 없다\n===\n\n+++[2311/ 일당백 > (주역에서 배우는 인생의 지혜) 오십에 읽는 주역 ( 강기진, 정영진, 이지선, 정승민) ]\nhttps://www.youtube.com/watch?v=XiM8sDNlAsc\n\n5행의 입장에서\n ''4주의 영향을 받는 사람은 누구나 20%의 결핍이 있다.''\n 이는 열등감의 기본적인 원인이고, 이것일 자주팔자의 기본적인 통찰이다.\n\n사람은 누구나 자기만의 십자가를 짊어지고 산다.\n 융은 이를 자기만의 기질이라고 하고, 자기만의 기질은 자기를 굉장히 괴롭힌다.\n 이는 자기 부정의 원인이며 자기가 자기를 부끄럽게 생각하는 원인이다.\n\n영성을 가진 무한한 하늘의 둥근 도는\n 결핍의 가진 유한한 평평한 인간에게 모두 담을 수 없다.\n 들어간 부분은 결핍된 부분이고, 튀어나온 부분이 자기의 강점이 된다.(≒ 괘)\n\n세상 만물은 모두 모가 나있으며\n 이는 자기만의 십자가로 결핍된 부분이 끝임없이 자기를 괴롭히는 원인이 된다.\n 결핍된 부분을 채우기 위한, 전일성을 회복하기 위해서 움직이는 사람이 군자이다.\n\n세상은 대인(≒ 군자), 소인 , 비인(匪人)으로 구성되어 있다.\n 비인(匪人)은 글자에서 보듯, 뒤쪽이 열려 있지만 대체로 틀에서 빠져나오지 못한다.\n\n''주역에서는 군자는 비인과 말을 섞지 말라고 제시한다.''\n 비인은 말로서 설득할 수 있는 존재가 아니고 대부분의 결과가 좋지 못하기 때문이다.\n\n개운(開運)의 비결은 대인, 소인, 비인을 구분하는데 있다.\n @@color(#8A084B): ''문제는 마음에 따라 구분하기 때문에, 마음이 선한 사람은 상대방도 선하다고 본다.'' @@\n 대인, 소인, 비인의 구분이 상대적이다.\n\n주역은 이 세상을 하나의 세계로 보지 않는다.\n 세상은 크게 상경(上經, 하늘의 도리)과 하경(下經, 사람의 일)으로 이루어져 있고 하경과 하경은 섞여 있다.\n \n내가 비인을 만난다면 이는 상경(≒ 난세, 원칙이 정립되지 않은 세상)의 세상이고\n 대인을 만난다면 하경(≒ 평화의 시대, 군자와 대인이 합심해서 상경을 평정한 세상 ; 후천개벽)의 세상이다.\n\n@@color(#04f): ''주역은 사람의 관계와 관계 사이의 위치를 파악해서, 그것에 맞게 대처하는 것이 중요하다.'' @@\n 상대방이 비인이면 말을 하지 말아야 한다.\n 개운은 상경의 관계망에서 벗어나 하경의 관계망으로 이동하는 것이다.\n\n주역에서는 마음이 주관적이고 상대적으로 비인을 파악하기 때문에 \n 비인을 정의하지 않고, 현상으로서 비인이 있다고 언급한다.\n\n상경의 세상에서는 의리가 적용되지 않기 때문에 에티켓만 지키면 된다.\n 반면, 하경에서는 예와 의리를 다해야 한다.\n\n20, 30대에는 자기 주변일을 감정의 폭풍 가운데 있기 때문에 정확히 보지 못한다. \n @@color(#8A084B): ''겉으로 에티켓만 지키면서 비인과 큰 마찰없이 자기를 지키는 상경의 세상 원칙을 따를는게 중요하다.''@@\n 상경의 세상에서 예와 의리를 다 지키겠다고 하면, 비인을 만나 잘못하면 회복불능의 피해를 입게 될 수 있다.\n\n20대는 자기를 모르고\n30대는 자기를 알기 시작하지만 남을 모르고\n40대는 자기와 남을 알기 시작하고\n50대는 자기와 남을 조금 알고, 높은 시점에서 자기를 관망할 수 있다.\n 20, 30대에 판단했던 나의 모습, 환경, 주변에 대한 생각이 지금에 와서 달라질 수 있다.\n 자기의 과거를 최소한 껴안을 수 있어야 과거와 미래를 바꿀 수 있다.\n\n@@color(#04f): ''외면하고 싶어하는 과거를 직시할 수 있어야 문제를 해결하고 과거와 미래를 바꿀 수 있다.'' @@\n 천명을 찾아야 한다. \n\n역경에서는 만물의 정을 분류한 것이 괘다. \n 자아는 12세 전후에 형성된 것이다. 자아가 아닌 영성(靈性)에서 천명을 찾아야 한다. \n===\n\n+++[1912/ 결과에만 보상하면 동기는 사라진다 ]\n2019.12. Vol.447, LIFE STYLE_CEO 심리학, 글 ''김경일'' 아주대학교 심리학과 교수\n...\n<html> <span style="font-size: 10pt;"> <font color=RoyalBlue> <b> 큰돈보다는, 작은 여러 종류의 보상을 부여하라 </b> </font> </span> </html>\n\n어떤 결과나 행동을 유도하기 위해 별다른 생각 없이 큰 돈으로 보상을 하는 것은 의외로 위험한 발상이다. 그 일을 다시 하거나 본질적 동기를 잃어버리게 만들 수도 있으니 말이다. \n...''한 종류의 큰 보상만 고집하지 말라는 것이다.'' 그렇다면 어떻게 해야 하는가? 결과뿐만 아니라 그것에 도달하는 여러 과정에 작은 여러 보상을 하라는 뜻이다. 그렇게 함으로 인해 큰 결과를 만들어내기 위한 ''작은 걸음 하나하나에도 동기 부여를 해낼 수 있기 때문이다.''\n이를 제대로 하기 위해서는 어떤 큰 결과나 성취의 주인공으로 하여금 그 수 많은 과정에서 자신을 기꺼이 도운 조직 내의 다양한 주변 사람들에게 무언가를 나누어줄 수 있는 이른바 @@color(#04f): '분배할 수 있는 상' @@을 주는 것이다.\n...\n큰일을 해낸 부하가 있다면 그 사람에게 나중에 합쳐보면 크지만 하나씩은 작은 여러 종류의 보상을 부여하는 지혜로운 고민이 필요하다.\n===\n\n+++[1906/ 사자는 왜 멸종하지 않았을까? ]\n2019.06. Vol.441, LIFE STYLE_CEO 심리학, 글 ''김경일'' 아주대학교 심리학과 교수\n\n사자는 어떤 비결로 무려 350만년 동안 멸종하지 않고 살아남았을까? 답은 바로 이타성이다. 특히, 분배에 대한 이타성이다. ''오랫동안 멸종하지 않고 생존해 온 종들에게는 이타성과 윤리적인 개체에게 보스의 자리를 물려주는 공통점이 있다.'' 지능이 높은 종일수록 이런 경향이 더 강하다. 이를 반대로 생각하면 이기적이면서 능력만 있는 자를 중요하면 동물만도 못한 조직을 만드는 것과 다르지 않다. 성과가 좋다고 혹은 능력이 뛰어나다고 무조건 리더에 앉히는 건 금물이다. @@color(#04f): 그들이 어떻게 보상하고 분배하는가를 주의 깊게 살펴봐야 한다. @@\n===\n\n+++[1905/ 해석과 분석의 차이를 이애하라 ]\n2019.05. Vol.440, LIFE STYLE_CEO 심리학, 글 ''김경일'' 아주대학교 심리학과 교수\n\n분석의 초반부에 사소하게라도 해석이 들어가면서 배가 산으로 간다. 분석을 해야 할 부분에서 해석을 하지 말라.\n해석과 그에 따르는 질문은 이 모든 분석이 모두 끝난 뒤에야 나와야 한다. 그렇지 않으면 분석이 망가져 엉망이 되니 말이다. 때 이른 해석은 어떻게든 정확한 현실 인식을 망가뜨린다.\n\n''분석 ( 分析, analysis )'' ; 개념이나 문장을 보다 단순한 개념이나 문장으로 나누어 그 의미를 명료하게 함\n / 지금까지 하나로 봤던 무엇가를 여러 개로 나누는 과정을 필연적으로 포함 \n / 복잡한 여러 개의 내용으로 구성되어 있지만 누가 해도 동일해야 한다.\n\n''해석 ( 解釋, interpretation)'' ; 문장이나 사물 따위로 표현된 내용을 이해하고 설명함\n / 많은 내용 중 중요한 핵심과 느낀 바를 주관적으로 요약\n / 함축적이지만 사람에 따라 다양해지는 것이 당연하고 또 그럴 수 밖에 없다.\n===\n\n+++[1810/ 성공은 '기술'하고, 실패를 '설명'해야 하는 이유 ]\n2018.10. Vol.433, LIFE STYLE_CEO 심리학, 글 ''김경일'' 아주대학교 심리학과 교수\n<html> <span style="font-size: 10pt;"> <font color=RoyalBlue> <b> 기술과 설명의 차이 </b> </font> </span> </html>\n\n''기술(記述)'' ; 대상이나 과정의 내용과 특징을 있는 그대로 열거하거나 기록하여 서술하는 것\n / 정확해야 하며 최대한 풍부한 내용을 포함 (임의의 각색은 조금도 허용되지 않는다)\n\n''설명(說明)'' ; 어떤 일이나 대상의 내용을 상태방이 잘 알 수 있도록 밝혀 말함 또는 그런 말\n / 상대방 이해의 편의를 높일 수 있으면 내용의 경중에 따라 어떤 항목은 강조되거나 반대로 좀 누락되어도 크게 문제될 것이 없음 (각색이 허용된다)\n\n'성공 스토리'...성공이 좋은 결과를 거두었을 때 사람들은 자기 자신에게 그 원인을 두는 내부귀인을 하는 경향이 강하다. 반면, 실패나 부정적 결과를 받아 들게 되면 그 이유를 외부 환경의 다양한 요인에 그 원인을 둔다. '잘하면 내 탓 잘못 되면 남(혹은 환경) 탓'.\n...\n성공을 설명하기만 하면 그 성공을 만들어 내는데 결정적으로 작용했던 외부 상황 요인들이 모두 누락된다. 따라서 이후의 사람들에게 별 도움이 되지 않는다. 실패를 기술만 하면 정작 실패를 만들어 낸 사람들에게 무엇이 부족했는지를 되돌아 볼 수가 없다. 따라서 성공의 경우는 기술해야 하고 실패의 경우는 설명해야 한다.\n...\n@@color(#04f): 성공한 사람에게는 자신을 빼고 성공의 이유를 묻는 과정을, 실패한 사람에게는 자기 요인만 가지고 실패의 이유를 설명하는 과정 말이다.@@\n===\n\n+++[1803/ (진짜인지, 가짜인지 모를) 정보 홍수의 시대에 어떻게 읽고 쓸 것인가? ]\n2018.03.07. 차이나는 클래스 52회, 1주년 기념 ''유시민''\n\n''텍스트(TEXT) ; 해석이 필요한 모든 것 ''\n 컨텍스트(context) ; 텍스트를 해석하는 데 필요한 모든 정보\n\n''문자 텍스트 해석에 중요한 컨텍스트 ''\n1. 생산자는 누구인가 ? (관계자/ 제 3자)\n2. 생산한 동기나 목적은 무엇인가 ? (이익/ 신념/ 감정)\n3. 무엇을 표현했나 ? (감정과 취향/ 생각과 주장)\n4. 왜 이런 방식으로 만들었나 ? (용어/ 문장)\n / 어려운 전문 용어 vs 쉬운 용어\n / 문장이 길엇 읽기 어려운 글 vs 간단명료한 문장으로 읽기 쉬운 글\n / 능력의 차이 vs 의도의 차이\n\n<html> <span style="font-size: 10pt;"> <font color=RoyalBlue> <b> => 진정으로 소통하고 싶다면, 쉬운 글로 표현할 것 </b> </font> </span> </html>\n\n※ 나쁜 글의 체크리스트\n① 이해관계자가 썼다 ?\n② 실현되면 이익을 본다 ?\n③ 생각과 주장이 있는 글이다 ?\n④ 이해하기 어렵다 ?\n\n''텍스트가 어려운 이유 ''\n1. 자기 취향이 아닌 글\n / (이야기) 서사에 끌리는 사람은 세부 묘사가 많은 책을 못 읽는다.\n2. 담고 있는 정보가 낯선 글\n / 취향이 맞는 경우에도 어려운 책!?\n\n''나쁜 텍스트 ''\n1. 읽기 편하지 않다.\n2. 듣기 아름답지 않다.\n3. 들어서, 또는 읽어서 뜻을 이해하기 힘들다.\n\n''못난 글 피하는 법 ''\n1. 문장을 짧게\n2. 군더더기 없애기\n3. 거시기 화법 지우기\n4. 중국 글자 줄이기\n5. 일본식 조사 피하기 ; 문학의 밤에로의 초대\n6. 피동문 쓰지 않기 \n / 유럽식, 일본식 문장 번역을 통해 전파되고 말의 습관으로 자리 잡음\n ⇒ 책임 회피를 위해 피통문을 쓰는 경우가 많다.(그냥 일어나는 것처럼 보이게 함)\n / 능동문 권장 \n ⇒ 주어가 명확하면 주어를 생략하는 경우가 많음 ; 주어가 없어져야 리듬이 살아난다.\n\n<html> <span style="font-size: 10pt;"> <font color=RoyalBlue> <b> => 한번 문장을 보고, 소리 내서 읽어 보고, (6가지 체크리스트를) 점검한다면 <br> \n 나만의 스타일이 살아있는 글을 쓸 수 있음 \n </b> </font> </span> </html>\n===\n\n+++[1711/ 말할 수 없는 것에 대해서는 침묵하라 / 비트겐슈타인 ]\n2017.11. Vol.422 신용사회, 칼럼 명문장으로 배우는 인생, 글 ''안상현'' 자기경영연구소장\n\n''표현할 수 없는 것들''\n\n<html> <span style="font-size: 10pt;"> <font color=RoyalBlue> <b> "철학은 혼탁하고 흐릿한 경계를 명료하고 분명하게 경계짓는 일이다." </b> </font> </span> </html>\n\n이것이 비트켄슈타인이 철학을 바라보는 방식이다. 우리가 일상적으로 사용하는 언어들 중 대부분은 참된 논리적 구조를 가진 것이 아니다. 개념을 분명하게 설명하거나 이해하는 것이 불가능한 상황에서 억지로 설명하려고 시도했고 대충 이해하고 넘어갔을 뿐이다.\n...\n<html> <span style="font-size: 10pt;"> <font color=RoyalBlue> <b> "말 할 수 없는 것에 대해서는 침묵하라." </b> </font> </span> </html>\n\n이 말을 남기고 비트겐슈타인은 철학계를 떠나고 만다.\n\n''말할 수 있는 것은 말하라''\n\n언어를 제대로 이해하고 사용하려면 현실 속에서 구체적인 맥락을 살펴봐야 한다. 이것이 후기 비트겐슈타인의 생각이었다. 그렇다면 말할 수 없는 것에 대해서 침묵하라고 했던 그의 주장은 여전히 유효할까? 아마 그럴 것이다. 말할 수 없는 것에 대해서는 침묵하고, 말할 수 있는 것을 현실적 맥락 속에서 잘 표현할 때 언어로 인한 문제가 사라질 것이기 때문이다. 하지만 말할 수 없는 것이라도 구체적인 생활언어를 통해 정확하게 표현한다면 그것도 필요한 일이 될 것이다.\n===\n\n+++[ 1705/ 돈, Don't Worry (2017.05.17. 자산 관리자 유수진) ]\n<br>\n<html>\n<span style="font-size: 12px;"> <b> 투자는 게임이다! (머니 게임 룰) </b> </span>\n</html>\n 1.경기 변동 사이클에 주목하라\n 2.금융 위기는 반복해서 온다\n\n<html>\n<span style="font-size: 12px;"> <b> 부자들의 돈 버는 찬스 ; 금융위기 ≒ 투자자들에게는 기회 </b> </span>\n</html>\n -. 위기를 예측하고, 자금을 준비\n\n<html>\n<span style="font-size: 12px;"> <b> 투자 타이밍 </b> (금융위기를 예측하기 위한 지표) </span>\n</html>\n 1.부자들의 자금 흐름을 파악하라 (참고)\n 2.외국계 자금 흐름을 파악하라 (참고)\n 3.GDP(국내총생산)를 파악하라 ; GDP = 가계소비 + 기업투자 + 정부지출 + 순수출(수출-수입)\n / OECD, IMF, 기획재정부, 한국은행, KDI(한국개발연구원), 민간 경제 연구원\n / 검색 키워드 ; GDC 증가률, 경제 성장률\n\n<html>\n<span style="font-size: 12px;"> <b> 투자 원칙 </b> </span>\n</html>\n 1.아는 것만 해라?!\n 2.주도적으로 해라\n\n<html>\n<span style="font-size: 12px;"> <b> 주식 </b> </span>\n</html>\n -. top-down 방식 ; 경기 예측 ⇒ 유망 산업 ⇒ 기업 선택\n -. bottom-up 방식 ; 유망기업 선택 (전문가들의 방식 ≒ 일반 투자자에게는 추천하지 않음)\n -. 기본적ㆍ기술적 분석이 가능할 때 투자\n / 기술적 분석 ; 1차 목표가 설정 ⇒ 손해를 감수하고 파는 손절가 설정\n / 시장 & 회사 종목 리스크 존재\n / 시장 상황만 고려한 투자 ; 인덱스 펀드, 주식형 펀드, ETF(상장지수펀드)\n 예, 하반기 경기 호황 예상 ; 경기 흐름에 맞춰 매입 ⇒ 장기 투자\n -. 안전한 기업에 투자\n / 개발도상국의 주식을 사둬라\n / 지속성장 기업의 주식을 사둬라\n / 유망한 콘텐츠 보유 기업에 주목 ! (예, 디즈니)\n\n<html>\n<span style="font-size: 12px;"> <b> 부동산 </b> </span>\n</html>\n -. 나만의 기준을 가져라\n / 지역 탐방\n / 입지가 중요 \n -. 금융위기, 부동산 침체기가 올 때까지 기다림\n\n<html> <HR SIZE=2 width="100%"> </html>\n===\n\n+++[1503/ "경쟁 말고 독점" 페이팔 창업자 피터 틸 인터뷰]\n@ ChosunBix, 2015.03.07.(토), 0에서 1 창조… 온리 원이 돼라 ( http://biz.chosun.com/site/data/html_dir/2015/03/06/2015030601940.html )\n\n피터 틸(Peter Thiel) ; 실리콘밸리를 움직이는 파워그룹 ‘페이팔 마피아’의 대부. 손꼽히는 스타트업 성공 사업가이자 벤처캐피탈 투자자.\n\n책 ; 제로 투 원/ 피터 틸,블레이크 매스터스 공저/이지연 역\n...\n\n―독점이 사회에 어떻게 기여하는지 좀 더 설명을 부탁 드립니다.\n\n“좋은 독점은 사회에 풍족함을 제공합니다. 테슬라는 실제로 사람들이 운전해보고 싶어하는 첫 전기차를 개발했어요. 새로운 시장을 만들고 독점적 지위를 갖게 됐습니다. 사람들은 이런 혁신을 통해 기존에는 없던 새 혜택을 누리고 있습니다.\n\n그러나 나쁜 독점은 항상 부족함을 유발합니다. 사회에 돌아가는 혜택의 공급을 제한한다는 겁니다. 예컨대 샌프란시스코에서는 4층 이상 건물을 지을 때 ‘지역개발규제법’의 영향을 받습니다. 재개발을 하거나 새집을 지으려면 법의 허락을 받아야만 합니다. 그러다 보니 부족함이 양산됐고, 결국 부동산 가격은 계속 올랐습니다. 그리고 그 혜택은 기존 빌딩 주인들이 독식했습니다. 저는 우리가 이런 형태의 독점에 항상 주의해야 한다고 생각합니다.”\n\n!!!너무 작다 싶을 만큼 작게 시작하라\n―독점 기업이 되려면 어떻게 해야 할까요?\n\n“방법은 세 가지입니다. ''먼저 작게 시작해서 독점하세요.'' 너무 작다 싶을 만큼 작게 시작해야 합니다. 장악하고 지배하기 쉽기 때문입니다. 신생 기업에 완벽한 표적 시장은 경쟁자가 없거나 아주 적고, 특정한 사람이 모여 있는 시장입니다. 처음부터 1억명 시장에 대해 이야기한다면 완전히 빨간불입니다. 그만큼 경쟁이 치열할 테고, 이는 곧 이윤이 ‘0’이 된다는 말이니까요.\n\n둘째, 그렇게 해서 ''일단 시장을 장악하고 난 뒤 몸집을 키우세요.'' 제프 베조스가 아마존을 처음 세웠을 때는 책을 팔았습니다. 그리고 가장 비슷한 시장부터 공략했죠. 음악 CD, 비디오, 소프트웨어를 거쳐 지금은 만물상이 됐습니다.\n\n셋째는 ''파괴하려고 하지 말라는 겁니다.'' 신생 기업은 파괴에 대한 강박을 갖고 있습니다. 파괴적 혁신(disruptive innovation)이라는 유행어 때문입니다. 그러나 파괴에 집착하면 장애물이 늘어납니다. 사람들의 이목이 집중되고 싸움을 계속해야 합니다. 설령 파괴를 하더라도 이를 겉으로 드러내지 마세요. 신생 기업은 ‘창조’라는 활동 자체가 훨씬 더 중요합니다. 가능하면 경쟁은 피할수록 좋습니다. 경쟁은 회사를 약하게 만듭니다.”\n===\n\n+++[(주)내비오닉스코리아 / 박시몽 ]\n| 설립일 |2011년 12월 16일 |>|from 사람인, 출처 ; NICE평가정보 / 2023.10.31. |\n| 업종 |시스템 소프트웨어 개발 및 공급업 | 대표자명 |박시몽 |\n| 사업내용 |소프트웨어 개발,공급/정밀기기,산업용로봇,비디오,영상기기,항행용무선기기 제조 | 주소 |경기 성남시 분당구 ... |\n| 보유기술 |>|>|◎ 특허권 - 이동체의 움직임 측정장치 및 그의 측정방법(2014) <br> ◎ 특허권 - 이동체의 움직임 측정장치, 그 측정 및 보정 방법(2014) <br> ◎ 특허권 - 비행체 로터 출력 보정 시스템(2013) <br> ◎ 특허권 - 이동 표준 편차를 이용한 데이터 필터링 장치 및 방법(2013) |\n''기업비전 ''\n당사는 임베디드 SW 및 각종 프로그램을 개발, 판매하는 세계적인 소프트웨어 개발회사를 만들기 위한 목적으로 2011년 12월에 법인 설립 하였으며, 지난 4년여 기간동안 센서퓨전기술을 기반으로 하는 항법소프트웨어 (Airscape) 및 무인항공기 (UAV) 시스템, 영상분석시스템 등의 원천기술을 확보하기 위해 R&D에 집중 투자하여 관련분야에 다수의 지적재산권을 확보 하였습니다. 동 기간중 당사는 정부국책사업 (방사청, 농림부 출연 사업)을 통한 4건의 기술개발을 지속적으로 수행하여 국가적 원천기술 확보는 물론 당사 기술력을 인증 받아 고기술 보유업체로서 인정 받게 되었고, 또한 최근 무인기 (UAV, 드론) 시장이 미래 신 성장산업으로 각광을 받으며 엄청난 성장세를 보이고 있으며, 무한한 잠재력을 가지고 있어 당사가 보유하고 있는 항법소프트웨어, 무인항공기 시스템, 영상처리분석기술 등 핵심 원천기술을 활용하여 특수용 및 민수용 (셀카드론) 드론의 시장참여를 확대하고 기술적 성숙도를 높여 국내뿐 아니라 세계적으로도 우수한 제품을 출시할 계획으로 있습니다. 당사는 2016년을 제 2의 창업기로 보고 힘찬 도약을 준비하고 있으며, 원천기술 확보 및 인재양성과 우주항공분야 소프트웨어 국산화를 추진하고 세계적인 기업으로 성장하여, 인류의 발전에 기여하는 기업이 되고자 합니다.\n===\n
<<tabs tabtxtdemo\n"제목 show a section" "툴팁 sec 1" ClassicTabsDemo::Do1\n"제목 section 2" "툴팁 2" ClassicTabsDemo::Do2\n"제목 and a slice" "툴팁 3" [[ClassicTabsDemo::slice]]\n"About " "툴팁 4" [[About...]]\n>>\n<<slider slidertest [[About...]] "click me»" "주석" >>\n/%\n|~Do1| first section: this is a hidden section below |\n|~Do2| another hidden section of this tiddler |\n|~slice| a hidden slice of this tiddler|\n%/\n
|!location | !code |\n|none | 00 |\n|head | 01 |\n|cape | ?? |\n엑셀에서 새로운 code ?? 가 필요할 경우, 매크로 NewCode를 실행... 새로운 code(02)를 생성한다.\n\nGlobal Const CodeChar As String = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"\nGlobal Const CodeLen As Integer = 62 ' 26[a-z]*2 + 10\n\n62진법을 활용 ; AA ⇒ AB\n10진법으로 변환할 때, 자리수를 고려한 매크로 활용\n 예) 2자리수로 구성 되어 있을 때, * itemclass=HEX2DEC( DEC2HEX( CODE( RIGHT(B164,1) ) ) & DEC2HEX( CODE( LEFT(B164,1) ) ) ) cf. B164는 엑셀 셀 위치\n\n+++[▷ 매크로 NewCode]\n{{{\nSub NewCode()\n'\n' NewCode Macro\n' assign a new code to the current row\n'\n' Keyboard Shortcut: Ctrl+n\n'\n If ActiveWorkbook.FileFormat <> xlNormal And ActiveWorkbook.FileFormat <> xlExcel8 Then\n Response = MsgBox("Workbook must be in .xls format.", vbOKOnly, "Error")\n Exit Sub\n End If\n\n Dim myFilePath As String\n Dim myXlsFileName As String\n Dim myCode As String\n \n CodeChar = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"\n CodeLen = Len(CodeChar)\n \n myFilePath = ActiveWorkbook.Path\n myXlsFileName = myFilePath + "\s" + ActiveWorkbook.Name\n myTxtFileName = myFilePath + "\s" + ActiveSheet.Name + ".txt"\n numRows = ActiveSheet.UsedRange.Rows.Count\n myRow = ActiveCell.Row\n \n If GetAttr(myXlsFileName) And vbReadOnly Then\n Response = MsgBox(myXlsFileName + " is read only.", vbOKOnly, "Error")\n Exit Sub\n End If\n If Dir(myTxtFileName) <> "" Then\n If GetAttr(myTxtFileName) And vbReadOnly Then\n Response = MsgBox(myTxtFileName + " is read only.", vbOKOnly, "Error")\n Exit Sub\n End If\n End If\n\n ' compute which column corresponds to CODE\n codeCol = -1\n numCols = ActiveSheet.UsedRange.Columns.Count\n For curCol = 1 To numCols\n curCell = StrConv(ActiveSheet.Cells(1, curCol).Value, vbUpperCase)\n If StrComp(curCell, "CODE") = 0 Then\n codeCol = curCol\n Exit For\n End If\n Next curCol\n \n ' loop through each row and assign code\n myCode = Mid(CodeChar, 1, 1) + Mid(CodeChar, 1, 1)\n For curRow = 2 To numRows\n If curRow <> myRow Then\n curCode = ActiveSheet.Cells(curRow, codeCol).Value\n If StrComp(myCode, curCode) <= 0 Then\n If Mid(curCode, 2, 1) = Mid(CodeChar, CodeLen, 1) Then\n If Mid(curCode, 1, 1) = Mid(CodeChar, CodeLen, 1) Then\n Response = MsgBox("Exceeded maximum code range handled by this macro.", vbOKOnly, "Error")\n Exit Sub\n Else\n myCode = Mid(CodeChar, (InStr(CodeChar, Mid(curCode, 1, 1)) + 1), 1) + Mid(CodeChar, 1, 1)\n End If\n Else\n myCode = Mid(curCode, 1, 1) + Mid(CodeChar, (InStr(CodeChar, Mid(curCode, 2, 1)) + 1), 1)\n End If\n End If\n End If\n Next curRow\n ActiveSheet.Cells(myRow, codeCol) = myCode\n\nEnd Sub\n}}}\n===
!! ACT6급 취득하면 Digital Academy 수료 인증\n\nhttp://jijusoft.co.kr/old_board/board_02_view.asp?neNu=32&query=page=7&SearchMode=&SearchKeyword=&viewall= (2004-08-21)\n\nDigital Contents Academy는 IT Developer(게임개발자, 게임 디자이너 등)를 육성하는 곳입니다. 게임개발자는 게임화면을 구성하고 운영하는 시스템을 기획해 프로그램화하는 능력을 갖춰야 하는데 폭발적인 수요에 비하여 공급이 매우 부족합니다. 그래서 FOVIX(포빅스)에서는 Digital Contents Academy를 설립, 운영하고 수료생은 국내및 해외 관련업계에 추천하고 있습니다. ACT6급(알고리듬 능력검정 6급)을 취득하면 Academy 수료생과 동등한 대우를 받습니다\n\nFOVIX는 게임및 Digital Contents 해외 마케팅및 정보제공을 선도하는 회사입니다.\n\n고도의 성장기를 맞은 국내 IT산업은 세계적으로도 주목받고 있습니다. 그러나 국내현실은 해외마케팅역량 부족, 정보 부실, 전문인력의 부재, 게임컨텐트 편중화 등으로 인하여 많은 개발사 및 그에 따른 투자사들이 어려움을 겪고 있습니다. 이러한 때에 FOVIX는 풍부한 경험의 해외 마케팅 Know-How를 바탕으로 우수한 국내 컨텐트 해외 공급및 정보 제공을 하고 있습니다.\n\nhttp://www.fovix.co.kr\n(이사람) N&C소프트 노흥식 사장 (http://www.etnews.com/199508110092)\n1995년 "신대동여지도" 개발, 국내 최초로 한국의 지도를 CD롬에 내장.\n\n\n!! 清华万博网络技术有限公司 Tsinghua Wisdom\nhttp://th-wisdom.com.cn/about.html (구글번역기)\n\n"Tsinghua University Huambo"는 전문 직업 교육, 국가 정보 상담 및 서비스, 첨단 공원 건설 및 운영 서비스, 청화대 통제하에있는 고급 교육을 전문으로하는 엔터프라이즈 브랜드입니다. 전 칭화 대학 네트워크 센터 교육 서비스 센터를 기반으로 1999 년에 설립 된이 학교는 중국에서 중, 고등 직업 교육에 종사하는 초기 기업 중 하나입니다. 수년간의 개발 끝에 Tsinghua University Huambo는 직업 교육, 대학 운영, 양질의 교육, IT 서비스, 공원 운영 및 서비스, 소프트웨어 제품을 통합하는 산업화 그룹으로 점차 자리를 옮겼습니다.\n\n2010 년에 설립 된 "Huambo 엘리트"는 "칭화 웨버"지부 교육 공원 운영 및 서비스에 종사하고 고급 교육 및 서비스를 제공하는 데 협력하는 전문 기업입니다. 칭화 대학의 "미덕과 자기 개선"의 100 년 모토를 준수, 회사는 엘리트 기업 클러스터를 구축, 산업 클러스터의 엘리트 기업 급속한 발전을 구축, 핵심으로 미래의 고품질 엘리트를 양성, 지역 자원, 학교 교육 자원, 학교 기반 기업의 통합 리소스, 칭화 동문 및 기타 리소스, 지역 및 지역 산업 엘리트 플랫폼 및 엘리트 교육 플랫폼을 만드는 데 전념하고 업계에서 가장 전문적인, 산업 엘리트 높은 공헌 스타 부티크 기업을 수집하기 위해 노력하고 있습니다.\n\n
''Ambient''는 광원으로부터 직접 받는 빛(직사광선)이외의 주변의 물체등에 반사되어서 받는 주변광들을 단순화 시켜서 빛의 방향과 면의 법선에 관계없이 일정한 량의 빛을 받는다고 가정한 개념이다.\n하지만, 각 물체의 부분들이 받는 반사광은 엄연히 위치별로 다르다. 왜냐하면 주변의 물체들의 반사율도 다르고, 주변물체들에 의해서 반사광이 가려지는 부분도 생기기 때문이다.\n\n이중에 가려지는(occlusion) 영향을 Ambient에 적용시킨것이 Ambient Occlusion이다. 이를테면 방바닥 중간과 방바닥 모서리는 주변에서 반사되어 오는 빛의 량이 다르다. Ambient Occlusion을 사용하게 되면 주변물체에 의해서 많이 가려지는 곳(예, 움푹 들어간 모서리 부분)은 더 어둡게 되어서 장면의 깊이감을 더해준다. 언뜻보면 잘 모를 수도 있지만, 모서리 부분을 주의해서 보시면 차이를 확인할 수 있다.\n\nAO 의 가장 좋은 예는 제품 사진을 찍는 라이트 박스에 어떠한 물건을 넣었을때 생기는 그림자이다. 그림자의 한종류인데 '방향성이 없다' 라는게 핵심이다. 좀더 일반적인 것은 밝은 환경에서도 사람 콧구멍 안쪽이나 소매 안쪽에 그림자가 생기는 그런 현상이다.\n\n''ambient occlusion''은 ambient 성분으로 인해 생기고\n"주변의 빛이 얼마나 가렸느냐"를 의미하기 때문에 경계가 불분명하고 광원이 움직여도 영향을 받지 않는다.\n\n''self shadow''는 diffuse 성분으로 인해 생기고\n"광원에서 나오는 빛이 얼마나 가렸느냐"를 의미하기 때문에 경계가 분명하며 광원이 움직일때 같이 변경된다.\n\n어떠한 3D 모델에 Ambient Light 를 먹이면 그만큰 무조건 밝아진다. \n이는 Phong shading 공식이 다음과 같기 때문으로, Ambient 에 Diffuse 성분이 더해지기 때문에 밝아질 수도 있다.\n(결과가 밝다는 거지 AO 자체가 영향받은 것은 아니다. / by 단일 광원)\n\nAmbient + Diffuse + Specular = Phong Reflection\n\nAO 와 Shadow를 적용\nAmbient * AO + Diffuse * Shadow + Specular\n\nTexture를 적용\nAmbient * T * AO + Diffuse * T * Shadow + Specular\n\n전체 환경에 맞춰 주변과 정밀한 계산을 해주는 작업으로, 콧구멍 뿐만이 아니라 관절 안쪽, 옷 안쪽등 Ambient 값이 높더라도 너무 밝아지면 어색한 분위들이 되기 때문에, Ambient Occlusion 은 그러한 Ambient Light 상에서 생기는 그림자를 만들어 사실적으로 표현한다.\n\n 1. Real-Time 방식으로 Depth buffer 를 사용하는 SSAO 기법\n 2. 3D 렌더링 툴에서 라이트맵을 생성할 때 적용\n 3. 노말맵을 만들면서 툴을 이용해서 Diffuse Map에 자연스럽게 추가\n\n\n추가 검색 \nAmbient occlusion 과 shadow 를 모두 합친 기법을 연구한 사람들이 있는데, terrain 의 경우 아주 좋습니다. web 에서 ambient aperture lighting 으로 검색해 보세요.\n\n \n
출처 ; https://ko.wikipedia.org/wiki/레드덕\n\n레드덕(Redduck)은 2006년 2월에 설립된 대한민국의 온라인 비디오 게임 게임 개발사이다. 본사는 서울특별시 강남구 삼성1동 108-6 JBK타워 7층에 위치하고 있다. 1992년 정재영에 의해 설립된 타프시스템을 전신으로 하고 있으며, 매각·인수·합병의 과정을 거치면서 현재의 레드덕에 이르렀다. CEO는 네오위즈 출신의 오승택이다.\n \n네오위즈에서 서비스 중인 얼라이언스 오브 발리언트 암스(A.V.A.)의 제작사로 잘 알려져 있다.\n\n!! 역사\n* 창립\n** 1992년~2005년 (타프시스템)\n** 2006년 2월 1일 (레드덕)\n* 창립자 ; 정재영 (타프시스템)\n** 전신 ; 타프시스템, 엔틱스소프트\n** 핵심 인물 ; 오승택 (레드덕 현 CEO)\n** 모기업 ; 네오위즈\n\n정재영에 의해 처음에는 타프시스템으로서 1992년 신사동 화랑가의 5평 규모의 사무실에서 설립되었다.\n \n네오위즈는 타프시스템이 개발중이던 루시아드의 배급 및 마케팅 협력의 제휴를 통해 타프시스템의 전환사채를 매입하고 및 지분을 인수하였다.\n \n2005년 11월 바이오 벤처기업 엔비텍에 다시 매각되면서, 회사 자체가 바이오 벤처기업이 되었다. 엔틱스는 미국의 인공 간 개발업체 헤파호프로 건너가 네오시안으로 상호명을 바뀌었고 헤파호프 코리아에 합병되었다. 2006년 2월 게임 분야가 분할되어 레드덕으로 설립됨과 동시에 네오위즈에 재인수되었으며, 1년 뒤 요구르팅은 대한민국에서의 서비스를 종료한다.\n \n2006년 2월 21일 네오위즈에 인수되어 계열사로 편입되면서 사명이 레드덕으로 바뀌었다.\n \n전작인 A.V.A.와 마찬가지로 언리얼 엔진 3을 기반으로 차기 FPS 게임(메트로 컨플릭트: 프레스토)이 2008년 10월부터 개발을 시작하여 초기 작업에 착수 중이라 발표했다. 프로젝트에 참여할 인원을 채용하였으며, 2009년 1월부터 본격적인 개발을 시작하였다.\n\n!! 만든 게임\n!!! 타프시스템\n낚시광\n낚시광 2\n대물낚시광\n대물낚시광 2\n붕가붕가\n못말리는 탈옥범\n대물낚시광 3\n딩가 곤충나라 대모험\n루시아드 (요구르팅으로 리뉴얼)\n요구르팅 - 서비스 종료\n\n!!! 레드덕\n얼라이언스 오브 발리언트 암스\n공박 - 서비스 종료\n찹스 온라인 - 서비스 종료\n메트로 컨플릭트: 프레스토 - 서비스 종료\n\n
''메시지''\n프로젝트 : error PRJ0002 : 오류 결과 31이(가) 'C:\sProgram Files (x86)\sMicrosoft Visual Studio 8\sVC\sbin\smt.exe'에서 반환되었습니다.\n\n''해결법''\n작업관리자에서 mspdbsrv.exe 프로세스 끝낸다.\n\ncf. 프로젝트 : error PRJ0002 : 오류 결과 31이(가) 'C:\sProgram Files\sMicrosoft SDKs\sWindows\sv6.0A\sbin\smt.exe'에서 반환되었습니다.\n출처 ; http://blog.naver.com/PostView.nhn?blogId=kyoungseop&logNo=140198512123\n
<html> <a name="Page180201"> </a> </html>\n<html>\n<a href="#Page180201_01"> #. 종이 </a> <br>\n<a href="#Page180201_03"> #. 종이 목록 </a> <br>\n<a href="#Page180201_02"> #. 종이접기 </a> <br>\n</html>\n\n<html> <a name="Page180201_01"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page180201"> <span style="font-size: 14px;"> <b> #. 종이 </b> </span> </a>\n</div> </html>\n* 크기\n| 46전지| 1,091 X 788 mm|\n| 2절지| 788 X 545 mm|\n| 4절지| 545 X 394 mm|\n| 8절지| 394 X 272 mm|\n| 16절지| 272 X 197 mm|\n| 32절지| 197 X 136 mm|\n| 48절지| 136 X 098 mm|\n\n* 지물점\n** http://schoolnews.kr/goods/goods_list.php?page=1&cateCd=026027007002 - 뉴구김지펄 (스쿨뉴스)\n*** 2절 - 700원 (1장 단위) ; 2018.03.12. 크림색외 8장 주문\n*** 2018.01.31. 뉴구김지펄 등 주문 ; 종이별로 크기가 다름\n** http://www.daedoi.com/ - 대도지물 (서울 중구 남대문로4가 20-31번지)\n*** 펄구김지 2절 - 770원 (10장 단위) / cf. 18.01.11. 900원 X 5장 구입\n** http://www.handimall.co.kr/ - 핸디몰 (공예재료 전문점)\n*** 펄구김지 2절 - 1,080원 (5장 단위)\n** loving home 러빙홈 포장지펄\n\n#.유닛 꽃접기 ( 다면체 종이접기 )\n| 색상 | 이름 | 비고 | 상품코드 | 가격 |\n| 눈(엷은 회색)|대례지 70g/㎡ 4절 | 빳빳하고 어두운 느낌|A0 / 인더페이퍼 |280 원 |\n| 내추럴(엷은 살구색)|대례지 70g/㎡ 4절 | 만다라지보다 두꺼운 느낌|A2 / 인더페이퍼 |280 원 |\n| 흰색|클래식코튼 90g/㎡(Solar White) A3| 무광, 부드러운 속지/ 필름 위 코팅 가공|... / 페이퍼모어 | 230원 |\n| 흰색(엷은 분홍색 반사광)|클래식코튼 90g/㎡(Avon Brilliant White) A3| |PCCCT02C / 페이퍼모어 | 230원 |\n| 엷은 노란색|클래식코튼 90g/㎡(Classic Natural White) A3| |PCCCT01C / 페이퍼모어 | 230원 |\n| 화이트(엷은 미색)|문켄퓨어 80g/㎡ 4절(화이트) 4절| |R80 / 인더페이퍼 | 110원 |\n\n#.병\n| 색상 | 이름 | 비고 | 상품코드 | 가격 |\n| 흰색|클래식코튼 90g/㎡(Solar White) A3| 무광, 부드러운 속지/ 필름 위 코팅 가공|../ 페이퍼모어 | 230 원|\n| 퓨어 화이트|에이프랑 100g/㎡ 4절 | 부드러운 색상의 비목재 펄프 인쇄용지|100 / 인더페이퍼 | 180 원|\n| 화이트|주름크라프트 120g/㎡ | 나뭇결무늬|120 / 인더페이퍼 | 160 원|\n| 흰색(엷은 분홍색 반사광)|클래식코튼 90g/㎡(Avon Brilliant White) A3| |PCCCT02C / 페이퍼모어 | 230 원|\n| 엷은 노란색|클래식코튼 90g/㎡(Classic Natural White) A3| |PCCCT01C / 페이퍼모어 | 230 원|\n| 눈(엷은 회색)|대례지 105g/㎡ 4절 | 빳빳하고 얇은 사진인화지 느낌|B0 / 인더페이퍼 | 420 원|\n| 돌로마이트|스타드림 핀포인트 110g/㎡ 4절| 얇은 천을 붙인 느낌, 청색 반사광이 나는 종이|C127 / 인더페이퍼 | 460 원|\n| 크림색|콩코르컨셉이리데슨트 T07.옐로우골드 120g/㎡ 4절 | 엷은 노란색|PCONT07B / 페이퍼모어 | 320 ~350 원|\n| 크림색|큐리어스 메탈릭메탈 T07.화이트골드 120g/㎡ 4절 | 결이 있고, 콩코르...보다 노란색이 짙음|PKCMT07B / 페이퍼모어 | 376 원|\n| 화이트(엷은 미색)|문켄퓨어 100g/㎡ 4절(화이트) 4절| |R100 / 인더페이퍼 | 130 원|\n\n| 색상 | 이름 | 가격 | 비교 |\n|>|!강조 |! |! |\n| 금색|큐리어스 메탈릭메탈 T07. 화이트골드_120g/㎡ |376 원 / 페이퍼모어 | |\n|>|!Base |! |! |\n| 퓨어 화이트|에이프랑 100_100g/㎡ |180 원 / 인더페이퍼 | |\n| 화이트(엷은 미색, 반사광 없음)|문켄퓨어 R100. 화이트_100g/㎡ |130 원 / 인더페이퍼 | Frame으로 사용 어려움|\n| 눈(엷은 회색)|□ 대례지_105g/㎡ |420원 / 인더페이퍼 | 빳빳하고 얇은 사진인화지 느낌|\n| 흰색|클래식코튼_90g/㎡(Solar White) |230원 / 페이퍼모어 | 무광, 부드러운 속지/ 필름 위 코팅 가공|\n| 벚꽃|□ 대례지_105g/㎡ |420원 / 인더페이퍼 | |\n| 흰색(엷은 분홍색 반사광)|클래식코튼_90g/㎡(Avon Brilliant White) |230원 / 페이퍼모어 | |\n|>|!Frame ■ |! |! |\n| 크림색 + 흰색 반사광|콩코르컨셉이리데슨트 T07. 옐로우골드_120g/㎡ |350 원 / 페이퍼모어 | |\n| 엷은 분홍색 반사광|마제스틱T02. 밀키화이트_120g/㎡ 4절 |270 원 / 페이퍼모어 | 꼭지로 사용 어려움|\n| 흰색 + 회색 반사광|◎ 스타드림 핀포인트. 돌로마이트_110g/㎡ |460 원 / 인더페이퍼 | |\n|>|Frame ; 두꺼움 | | |\n| 화이트|주름크라프트 120. 120g/㎡ |160 원 / 인더페이퍼 | 나뭇결무늬|\n| 화이트(엷은 미색)|디프매트 R100_116g/㎡ |360 원 / 인더페이퍼 | 접기 힘듦|\n\n\n\n<html> <a name="Page180201_03"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page180201"> <span style="font-size: 14px;"> <b> #. 종이 목록 </b> </span> </a>\n</div> </html>\n\n++++[2018.05.24. 인더페이퍼 ]\nhttp://www.inthepaper.co.kr/ ( http://www.doosungpaper.co.kr/ - 두성종이 )\n2018-05-23 주 D18052301003 \n2019-05-24 주 D19052404002 \n2019-06-20 주 D19061912002 \n\n| 색상 | 이름 | 비고 | 상품코드 | 가격 |\n|>|>|!구김펄색지 ; 부드러운 색감과 펄, 주름 패턴의 팬시페이퍼 |>| ! |\n| 연보라색펄|구김펄색지 110g/㎡ 4절 | ?! 가격 주의|P112 | 600 원|\n| 노란색펄|구김펄색지 110g/㎡ 4절 | |P113 | 600 원|\n| 분홍색펄|구김펄색지 110g/㎡ 4절 | |P116 | 600 원|\n| 옥색펄|구김펄색지 110g/㎡ 4절 | |P117 | 600 원|\n|>|>|!에이프랑(aplan) ; 부드러운 색상의 비목재 펄프 인쇄용지 |>| ! |\n| 퓨어 화이트|에이프랑 100g/㎡ 4절 | |100 | 180원|\n|>|>|!문켄퓨어(MUNKEN PURE) ; 선명한 이미지 재현성의 미색 인쇄용지 |>| ! |\n| 화이트(엷은 미색)|문켄퓨어 100g/㎡ 4절 | 매끄러운 표면, 상대적으로 얇고 질긴 느낌|R100 | 130원|\n|>|>|!디프매트(DEEP-MAT) ; 고강도와 다양한 평량을 갖춘 그래픽색지 (X 20색) |>| ! |\n| 화이트(미색)|디프매트 116g/㎡ | ≒ 에이프랑 느낌과 비슷|120 | 360원|\n|>|>|!대례지 ; 깃털 모양의 패턴이 고급스러운 무늬지 (파스텔톤 한지느낌 X 6색) |>| ! |\n| 눈(엷은 회색)|대례지 70g/㎡ 4절 |클래식코튼 A3 90g/㎡(Solar White) 보다 빳빳하고 어두운 느낌 |A0 | 280 원|\n| 내추럴(엷은 살구색)|대례지 70g/㎡ 4절 | 만다라지보다 두꺼운 느낌|A2 | 280 원|\n| @@bgcolor(#FAE3EE): 눈 @@|@@bgcolor(#FAE3EE): 대례지 105g/㎡ 4절 @@ | ≒ 얇은 사진인화지|@@bgcolor(#FAE3EE): B0 @@|@@bgcolor(#FAE3EE): 420 원 @@|\n| 벚꽃|대례지 105g/㎡ 4절 | |B3 | 420 원|\n| 바다|대례지 105g/㎡ 4절 | |B4 | 420 원|\n| 달빛|대례지 105g/㎡ 4절 | |B5 | 420 원|\n|>|>|!스타드림핀포인트 ; 패턴을 입혀 펄의 효과를 극대화한 종이 |>| ! |\n| 오팔|스타드림 핀포인트 110g/㎡ 4절 | 복숭아색 반사광이 나는 종이|C112 | 320 원|\n| 금색|스타드림 핀포인트 110g/㎡ 4절 | 미세한 앰보싱 반사광이 느낌이 남|C113 | 350 원|\n| 돌로마이트| 스타드림 핀포인트 110g/㎡ 4절 | 청색 반사광이 나는 종이|C127 | 460 원|\n|>|>|!주름크라프트(Crease Kraft) ; 독특한 패턴,부드러우면서도 질긴 강도의 종이 (표면의 나뭇결무늬) |>| ! |\n| 화이트|주름크라프트 120g/㎡ | |120 | 160 원|\n|>|>|!만다라 ; 횟집에서 사용하는 얇은 종이 느낌 |>| ! |\n| 살구색|만다라 60g/㎡ 4절 | 표면이 매끄러운 한지느낌|006 | 500 원|\ncf.스타드림 핀포인트는 한쪽 면에 얇은 천을 붙인듯한 종이로, 빳빳한 느낌이 있음\n 오리지널그문드 Original Gmund\n===\n<br>\n주름크라프트\n오리지널그문드\n@@bgcolor(#d7dedd): 엷은 녹색 배경 @@ \n\n++++[2018.페이퍼모어 ]\nhttp://www.papermore.com/ ( http://www.samwonpaper.com/ - 삼원특수지)\n23-02-14 주 1676365838392\n22-11-04 주 1667498054829\n19-03-09 주 1552103457698\n18-11-06 주 1541482127552\n18-07-25 주 1532486921782 \n18-01-30 주 1517308914508\n\n| 색상 | 이름 | 비고 | 상품코드 | 가격 |\n| 흰색|뉴구김지펄105g/㎡(흰눈색펄) 4절 | |PNEVPEA01B | 450 원|\n|~|클래식코튼 A3 90g/㎡(Solar White) | 무광, 부드러운 속지/ 필름 위 코팅 가공| | A3/ 230 원|\n| 실버펄(엷은 금속반사)|프리미어_C05 220g/㎡ 4절 | 얇은 천으로 코딩된 두꺼운 느낌|PPREC05B | 320 ~ 350 원|\n| 페퍼민트펄|프리미어_C04 220g/㎡ 4절 | 얇은 천으로 코딩된 두꺼운 느낌|PPREC04B | 320 원|\n| 백녹색|!(한정수량)OK 코튼_25.Byakuroku_137g/㎡ 4절| 무광, 골판지느낌(cf.18.11.08.전시상품 아님)|POK25B | 300 원|\n| 흰색(엷은 분홍색 반사광)|클래식코튼 A3 90g/㎡(Avon Brilliant White) | 무광, 부드러운 속지/ 필름 위 코팅 가공|PCCCT02C | A3/ 220 원|\n| 엷은 노란색|클래식코튼 A3 90g/㎡(Classic Natural White) | 무광, 부드러운 속지/ 필름 위 코팅 가공|PCCCT01C | A3/ 220 원|\n| 크림색|뉴구김지펄105g/㎡(크림색펄) 4절 | |PNEVPEA02B | 450 원|\n|~|@@bgcolor(#d7dedd): 칼라텍스 4절 120g/㎡(D02) @@ | @@bgcolor(#d7dedd): 얇은 가죽 느낌/ 접은 면, 갈리짐 @@|PTEXDO2B | (한정수량) 210 원|\n| 노란색(금색)|콩코르컨셉이리데슨트 T07.옐로우골드 120g/㎡ 4절 | 엷은 노란색|PCONT07B | 320 ~350 원|\n|~|큐리어스 메탈릭메탈 T07.화이트골드 120g/㎡ 4절 | 결이 있고, 콩코르...보다 노란색이 짙음|PKCMT07B | 376 원|\n|~|마제스틱T03-1. 캔들라이트크림 120g/㎡ 350x500mm | 미색 양면지|PMJTT03B | 240 ~ 300 원|\n|~|뉴구김지펄105g/㎡(노랑색펄) 4절 | | | 450 원|\n|~|마제스틱T06-1. 멜로우옐로 120g/㎡ 350x500mm | 엷은 노란색 양면지|PMJTT06B | 260 ~ 320 원|\n|~|@@bgcolor(#d7dedd): 씨리오펄 01번 230g/㎡ 4절(골드) @@ | @@bgcolor(#d7dedd): 두껴운 마분지 느낌/ 가공이 어려움 @@|PSIP01B | 590 원|\n| 엷은 청색 반사광|큐리어스 메탈릭메탈 T06.아이스골드 120g/㎡ 4절 | |PKCMT06-2B | 350 ~ 376 원|\n| 청색|뉴구김지펄105g/㎡(하늘색펄) 4절 | | | 450 원|\n|~|마제스틱T04-1.다마스크블루 120g/㎡ 350x500mm | ≒ 하늘색 양면지|PMJTT04B | 300 원|\n| 사파이어 블루|[한정수량/재단x]데코 타이벡(DT03) 55g/㎡ 4절 | 뒷면이 비늘같은 느낌|PDTYDT03B | 331 원|\n| 엷은 분홍색 반사광|마제스틱T02. 밀키화이트 120g/㎡ 4절 | |PMJTT02B | 270 원|\n| 분홍색|뉴구김지펄105g/㎡(분홍색펄) 4절 | | | 450 원|\n|~|마제스틱T17. 페탈 120g/㎡ 350X500mm | 연분홍 양면지|PMJTT17B | 240 ~ 300 원|\n| 포도주색|뉴구김지펄105g/㎡(포도주색 펄) 4절 | | | 450 원|\n| !보라색|!스펙트럴 100g/㎡(Purple Haze) 4절 | !두꺼운 유산지/ 접은 면, 갈리짐|!PSPRS11B | !325 원|\n| 청동색|마제스틱T07-1. 카지노골드 120g/㎡ 350x500mm | 색이 짙은 양면지|PMJTT07B | 390 원|\n|~|칼라텍스 4절 120g/㎡(B05) | 격자 엠보싱(금속 느낌)|PTEXBO5B | (한정수량) 140 원|\n| 황토색|!(한정수량)OK 코튼_39..Azuki 137g/㎡ 4절 | 무광, 골판지느낌(cf.18.11.08.전시상품 아님)|POK39B | 300 원|\n| 검은색|뉴구김지펄105g/㎡(검정색펄) 4절 | |PNEVPEA22B | 450 원|\ncf. 마제스틱T06-1. 멜로우옐로 (무광) ≒ 뉴구김지펄 노란색 / 350x500mm은 4절지(545 X 394 mm) 보다 작음\n\n|''뉴구김지펄'' | |>|>|\n| 03 연분홍색펄 105g/㎡ 4절| | 2023.02.14|360원 |\n| 08 노랑색펄 105g/㎡ 4절| | 2023.02.14|360원 |\n| 13 분홍색펄 105g/㎡ 4절| | 2023.02.14|360원 |\n|''마제스틱'' |양면지고, 상대적으로 딱딱한 느낌 |>|>|\n| T02 밀키화이트 120g/㎡ 4절|엷은 살구색 반사광 | 2023.02.14|340원 |\n| T15 째즈 화이트골드 120g/㎡ 4절|노란색 반사광 | 2023.02.14|400원 |\n|''큐리어스메탈릭이리데슨트'' |기본색은 엷은 살구색에 펄에따른 약간의 반사광이 있고, 부드러운 재질 <br> ▶ 목공풀에 재질이 뭉개지는 경향이 있음 |>|>|\n| T01 화이트펄 120g/㎡ 4절|표면이 약간 반짝임 | 2022.11.04|400원 |\n| T02 그레이펄 120g/㎡ 4절| | 2022.11.04|420원 |\n| T07 미스트펄 120g/㎡ 4절|상대적으로 짙은 노란색 | 2022.11.04|420원 |\n|''콩코르컨셉이리테슨트'' |큐리어스메탈릭이리데슨트보다 반사광이 많지만, 부드러운 재질은 비슷 |>|>|\n| T01 블루펄 120g/㎡ 4절|엷은 살구색 + 푸른색 반사광 | 2022.11.04|400원 |\n| ▶ T06 실버펄 120g/㎡ 4절|전체적으로 연두색 느낌 | 2022.11.04|380원 |\n|''에코클로스'' |나뭇잎이 무늬가 눌려진 재질 |>|>|\n| S01 백색 120g/㎡ 380x530mm| | 2023.02.14|330원 |\n|''칼라텍스'' |작은 마름모 엠보싱 재질 |>|>|\n| C01 120g/㎡ 4절|흰색 | 2022.11.04|170원 |\n\ncf. 미스트는 안개라는 뜻. 미스트는 원래 색 이름으로 사용되는 낱말은 아니다. \n 특정 색상 뒤에 '미스트'가 붙은 색들은 원래 색보다 톤이 옅어지고 살짝 회색끼가 돌고, 파스텔톤보다 좀더 차분한 색상들이 된다.\n\n\n===\n<br>\n<html> <a name="Page180201_02"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page180201"> <span style="font-size: 14px;"> <b> #. 종이 접기 </b> </span> </a>\n</div> </html>\n* 중간 사이즈 ; 90 X 144 (≒ 150)\n** 1개 크기 ; 11.25 X 37.5 / (11.25 X 8) X ( 37.5 X 4 )\n** 소형 1개 크기 ; 9 X 30\n\n* 유닛 접기\n** http://homeworks.tistory.com/2283 - 꽃 쿠수다마 장식공 접기 동영상(Origami Kusudama Flower Ball)\n** https://funtoorigami.tistory.com/204 - (모듈) 연결형 모듈 종이접기 동영상 (cf. 사각박스 연결)\n* https://www.youtube.com/watch?v=NYvMLQURnZc - Origami Lotus (종이 연꽃접기)\n* 백조 접기\n** https://www.youtube.com/watch?v=WzC8xuBxS-w - 3D origami small swan tutorial ( model 1)\n*** black = 60 개, white = 129 개 / 기준단 횡갯수= 15개, 머리 14개 + 눈 1개 + 부리 1개(약간 작음)\n** http://blog.naver.com/PostView.nhn?blogId=wlsrpxkfhqh&logNo=170598402&parentCategoryNo=4&categoryNo=&viewDate=&isShowPopularPosts=true&from=search\n* 종이 항아리 만들기\n** https://www.youtube.com/watch?v=6gq4H-NkKrQ\n** https://www.youtube.com/watch?v=fwPfNiW7oc4 - How to make 3d origami Basket 10\n* 꽃모빌 인형\n** https://m.post.naver.com/viewer/postView.nhn?volumeNo=6910385&memberNo=33184509\n** 책 ; 창의영재지도사2급 종이접기 지도사 (2017.02)\n** 책 ; 꽃모빌 유니트 접기로 만드는 페이퍼 플라워 인형 (2003.05. 절판)\n\n\n\n
Performance 고려 사항\n\n00.게임\n / 아이템 생성시 지연\n / 아이템 파괴 후 퀘스트, 도전과제, 미니게임 적용 여부를 체크\n / NPC 리셋이 과도하게 빠른 경우\n / 많은 아이템이 필드에 드랍되는 경우\n / 보스 NPC가 등장할 때, 데이터를 로딩으로 의심되는 지연 현상\n / 오브젝트 Texture 등이 없는 경우 \n / 개방형 필드에서 프레임이 급격하게 떨어지는 현상\n\n00.지형\n / 포털 ; 이동후, 특히 pet의 경우 리셋 위치를 찾지 못함\n / 지형 에러 ; 노말 벡터, 매트릭스, 라이트 위치, 사운드 위치 등의 계산과 설정에 영향 \n\n00.DRLG (랜덤 던전) ; Dungeon of Random Logic\n / 경계선 부분이 벌어짐으로써 발생하는 카메라, 캐릭터 빠짐 현상\n / 룸 정보 계산 ; 벡터, 매트릭스 등\n\n00.소프트웨어\n / 물리 ; 충돌처리 처리 지연\n / 메모리 ; 메모리 누수 시, 정리에 따른 지연 (예, Garbage Collection)\n\n00.이펙트\n / 환영 효과 관련 투명한, 2side 반짝이는 효과\n / 아지랭이 등의 효과\n\n<html> \n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page190529"> <span style="font-size: 14px;"> <b> #. 개별 사항 </b> </span> </a>\n</div> </html>\n+++[Hellgate Tooltip 최대 갯수]\n ; void UITooltipDetermineSize( UI_COMPONENT *pComponent );\n // tj 2010.05.10. ITEMTOOLTIP에 <itemdisplayarea>setitemprops</...> 추가 (MAX_LINES = 20 ⇒ 21)\n / static const int MAX_LINES = 21;\n\n''Tooltip formation''\n / data\suix\sxml\smain_screen.xml\n / data_common\sexcel\sui_component.xls\n|<tooltip name="..."> |ui_component |\n|item tooltip |ITEMTOOLTIP |\n|secondary item tooltip |SECONDITEMTOOLTIP |\n|tertiary item tooltip |THIRDITEMTOOLTIP |\n|micro_transaction tooltip |MICROTRANSACTIONTOOLTIP |\n===\n\n\n\n\n
<html> <a name="Page180209"> </a> </html>\n<html>\n<a href="#Page180209_01"> #. 어플리케이션의 상태 정의 </a> <br>\n<a href="#Page180209_02"> #. 어플리케이션 상태에 따른 실행 함수 </a> <br>\n<a href="#Page180209_03"> #. 게임 루프 </a> <br>\n</html>\n\n<html> <a name="Page180209_01"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page180209"> <span style="font-size: 14px;"> <b> #. 어플리케이션의 상태 정의 </b> </span> </a>\n</div> </html>\n{{{\n//----------------------------------------------------------------------------\n// ENUMERATIONS\n//----------------------------------------------------------------------------\n\nenum APP_STATE\n{\n APP_STATE_INIT,\n APP_STATE_PLAYMOVIELIST,\n APP_STATE_MAINMENU,\n APP_STATE_MENUERROR,\n APP_STATE_CHARACTER_CREATE,\n APP_STATE_CONNECTING_START,\n APP_STATE_CONNECTING_PATCH,\n APP_STATE_CONNECTING,\n APP_STATE_LOADING,\n APP_STATE_IN_GAME,\n APP_STATE_RESTART,\n APP_STATE_EXIT,\n APP_STATE_FILLPAK,\n\n APP_STATE_RESTARTLOGIN,\n APP_STATE_CREDITS,\n}\n}}}\n\n!!! 어플리케이션의 정의 ; 필요한 상태나 조건을 기록\n-. 게임 플레이어 기준에서 정의 \n / 접속 정보(서버, 채널 정보 등)\n / 유저 정보(계정이름, 패스워드 등)\n / 게임 환경 설정\n / 어플리케이션의 상태\n / 체팅, 게임, 패치 서버등 기능별 서버 접속 정보\n / 기타 전역으로 사용되는 정보 ; 정보의 세부 처리 방식이나 형식에 따라 구성 요소가 달라짐\n{{{\n//----------------------------------------------------------------------------\n//----------------------------------------------------------------------------\nenum APP_TYPE\n{\n APP_TYPE_NONE,\n APP_TYPE_SINGLE_PLAYER,\n APP_TYPE_CLOSED_CLIENT,\n APP_TYPE_CLOSED_SERVER,\n APP_TYPE_OPEN_CLIENT,\n APP_TYPE_OPEN_SERVER,\n};\n\n//----------------------------------------------------------------------------\n//----------------------------------------------------------------------------\nstruct APP\n{\n char userName[MAX_USERNAME_LEN];\n char passWord[MAX_PASSWORD_LEN];\n...\n APP_TYPE eStartupAppType; // app type determined by cmd line\n TIME m_tiAppWaitTime;\n...\n APP_STATE m_eAppState;\n APP_STATE m_eAppStateBeforeMovie;\n\n struct GAME * pClientGame;\n GAMEID m_idSelectedGame;\n...\n};\n}}}\n<html> <a name="Page180209_02"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page180209"> <span style="font-size: 14px;"> <b> #. 어플리케이션 상태에 따른 실행 함수 </b> </span> </a>\n</div> </html>\n!!! 함수 정의 예\n{{{\n//----------------------------------------------------------------------------\nstatic void AppMainMenuInit(\n APP_STATE eFromState, \n va_list args) // cf. c:\sprogram files (x86)\smicrosoft visual studio 8\svc\sinclude\svadefs.h\n{\n...\n}\n\n//----------------------------------------------------------------------------\nstatic void AppMainMenuDo(\n unsigned int sim_frames)\n{\n...\n}\n\n//----------------------------------------------------------------------------\nstatic void AppMainMenuEnd()\n{\n...\n}\n}}}\n\n!!! 실행 함수, 테이블 정의\n테이블 형식을 사용, 함수 포인터 형식으로 어플리케이션 상태에 따른 실행 함수 정의 \n{{{\ntypedef void (*FN_STATE_DO)(unsigned int sim_frames);\ntypedef void (*FN_STATE_BEGIN)(APP_STATE eFromState, va_list);\ntypedef void (*FN_STATE_END)();\n//----------------------------------------------------------------------------\n//----------------------------------------------------------------------------\nstruct APP_STATE_TABLE\n{\n APP_STATE eState;\n const char * szName;\n FN_STATE_BEGIN fpBegin;\n FN_STATE_DO fpDo;\n FN_STATE_END fpEnd;\n};\n}}}\n\n!!! 상태 전환 \n{{{\nvoid AppSwitchState(\n APP_STATE eState,\n ... )\n{\n SVR_VERSION_ONLY(REF(eState));\n#if !ISVERSION(SERVER_VERSION)\n\n ASSERT_RETURN(eState >= 0 && eState < sizeof(gAppStateTbl));\n // States 초기화 \n if(eState == APP_STATE_CHARACTER_CREATE)\n {\n memset(pgdwGameTickStateEnds, 0, sizeof(DWORD) * MAX_STATES_DISPLAY_ITEMS);\n memset(pgnTrackingStates, -1, sizeof(int) * MAX_STATES_DISPLAY_ITEMS);\n }\n\n trace("AppSwitchState() -- %s\sn", gAppStateTbl[eState].szName);\n\n e_PfProfMark(("AppSwitchState(); Enter End; %s", gAppStateTbl[gApp.m_eAppState].szName));\n if (gAppStateTbl[gApp.m_eAppState].fpEnd)\n {\n gAppStateTbl[gApp.m_eAppState].fpEnd();\n }\n e_PfProfMark(("AppSwitchState(); Leave End; %s", gAppStateTbl[gApp.m_eAppState].szName));\n\n APP_STATE eFromState = gApp.m_eAppState;\n gApp.m_eAppState = eState;\n\n AppStartOrStopBackgroundMovie();\n\n e_PfProfMark(("AppSwitchState(); Enter Begin; %s", gAppStateTbl[gApp.m_eAppState].szName));\n if (gAppStateTbl[gApp.m_eAppState].fpBegin)\n {\n va_list args;\n va_start( args, eState );\n gAppStateTbl[gApp.m_eAppState].fpBegin( eFromState, args );\n }\n e_PfProfMark(("AppSwitchState(); Leave Begin; %s", gAppStateTbl[gApp.m_eAppState].szName));\n\n#endif\n}\n}}}\n\n<html> <a name="Page180209_03"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page180209"> <span style="font-size: 14px;"> <b> #. 게임 루프 </b> </span> </a>\n</div> </html>\n{{{\n//----------------------------------------------------------------------------\n// MAIN\n//----------------------------------------------------------------------------\nint WINAPI WinMain(\n HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )\n{\n int returnCode = 0;\n...\n // initializes a few globals (doesn't use memory or anything else)\n PrimeInitAppNameAndMutexGlobals(lpCmdLine);\n...\n/*\n PrimeInit( ... ); --> AppInit(hInstance, lpCmdLine);에서 \n CLT_VERSION_ONLY( AppSwitchState(APP_STATE_INIT) ); 설정\n*/\n if (PrimeInit(hInstance, hPrevInstance, lpCmdLine, nShowCmd))\n {\n PrimeRun();\n }\n\n\n PrimeClose();\n... \n CL_LOG.Shutdown();\n\n return returnCode;\n}\n}}}\n\nvoid PrimeRun(void); 에서\n / unsigned int sim_frames = CommonTimerSimulationUpdate(AppCommonGetTimer(), true);\n gAppStateTbl[AppGetState()].fpDo(sim_frames);\n ⇒ static void AppInitDo(unsigned int sim_frames); 호출\n / Inserted to help Windows and the client play better. If this causes trouble in the server, feel free to mark it client-only.\n Sleep(0);\n
ISO 3166-1 numeric: 세 개의 아라비아 숫자로 구성된 국가 코드이다. 국제 연합의 통계학상의 분배에 의해 생성되었다.\nISO 3166-1 alpha-2: 알파벳 두 글자로 구성되며 수많은 곳에 적용된다. 특히 대부분의 인터넷 국가 도메인에 적용된다.\nISO 3166-1 alpha-3: 알파벳 세 글자로 구성된 국가 코드이다.\n\ncf.http://devbible.tistory.com/350 - 국기 포함\ncf.https://en.wikipedia.org/wiki/File:Europe_ISO_3166-1.svg\nhttps://msdn.microsoft.com/ko-kr/library/office/cdax410z(v=vs.120) - 국가/ 지역 문자열\n\n\n| !나라 이름 | !숫자 | !apha-3 | !alpha-2 | !enum <br> LANGUAGE | LANGUAGE_ | URL ARG <br> 해당 로컬 이름 |\n|가나 | 288 | GHA | GH | | | |\n|가봉 | 266 | GAB | GA | | | |\n|가이아나 | 328 | GUY | GY |\n|감비아 | 270 | GMB | GM |\n|과들루프 | 312 | GLP | GP |\n|과테말라 | 320 | GTM | GT |\n|괌 | 316 | GUM | GU |\n|그레나다 | 308 | GRD | GD |\n|그루지야 | 268 | GEO | GE |\n|그리스 | 300 | GRC | GR |\n|그린란드 | 304 | GRL | GL |\n|기니 | 324 | GIN | GN |\n|기니비사우 | 624 | GNB | GW |\n|나미비아 | 516 | NAM | NA |\n|나우루 | 520 | NRU | NR |\n|나이지리아 | 566 | NGA | NG |\n|남극 | 010 | ATA | AQ |\n|남아프리카 공화국 south africa | 710 | ZAF | ZA | | | af-ZA |\n|네덜란드 holland | 528 | NLD | NL | | | nl-NL |\n|네덜란드령 안틸레스 | 530 | ANT | AN |\n|네팔 | 524 | NPL | NP |\n|노르웨이 | 578 | NOR | NO |\n|노퍽 섬 | 574 | NFK | NF |\n|누벨칼레도니 | 540 | NCL | NC |\n|뉴질랜드 new-zealand | 554 | NZL | NZ | | | en-NZ |\n|니우에 | 570 | NIU | NU |\n|니제르 | 562 | NER | NE |\n|니카라과 | 558 | NIC | NI |\n|대한민국 south korea | 410 | KOR | KR | 1 |LANGUAGE_KOREAN | ko_KR |\n|덴마크 | 208 | DNK | DK |\n|도미니카 | 212 | DMA | DM |\n|도미니카 공화국 | 214 | DOM | DO |\n|독일 | 276 | DEU | DE | 7 |LANGUAGE_GERMAN | de_DE |\n|동티모르 | 626 | TLS | TL |\n|라오스 | 418 | LAO | LA |\n|라이베리아 | 430 | LBR | LR |\n|라트비아 | 428 | LVA | LV |\n|러시아 | 643 | RUS | RU | 12 |LANGUAGE_RUSSIAN | ru_RU |\n|레바논 | 422 | LBN | LB |\n|레소토 | 426 | LSO | LS |\n|레위니옹 | 638 | REU | RE |\n|루마니아 | 642 | ROU | RO |\n|룩셈부르크 | 442 | LUX | LU |\n|르완다 | 646 | RWA | RW |\n|리비아 | 434 | LBY | LY |\n|리투아니아 | 440 | LTU | LT |\n|리히텐슈타인 | 438 | LIE | LI |\n|마다가스카르 | 450 | MDG | MG |\n|마르티니크 | 474 | MTQ | MQ |\n|마셜 제도 | 584 | MHL | MH |\n|마요트 | 175 | MYT | YT |\n|마카오 | 446 | MAC | MO |\n|마케도니아 공화국 | 807 | MKD | MK |\n|말라위 | 454 | MWI | MW |\n|말레이시아 | 458 | MYS | MY |\n|말리 | 466 | MLI | ML |\n|멕시코 | 484 | MEX | MX |\n|모나코 | 492 | MCO | MC |\n|모로코 | 504 | MAR | MA |\n|모리셔스 | 480 | MUS | MU |\n|모리타니 | 478 | MRT | MR |\n|모잠비크 | 508 | MOZ | MZ |\n|몬트세랫 | 500 | MSR | MS |\n|몰도바 | 498 | MDA | MD |\n|몰디브 | 462 | MDV | MV |\n|몰타 | 470 | MLT | MT |\n|몽골 | 496 | MNG | MN |\n|미국 united-states | 840 | USA | US | 0 |LANGUAGE_ENGLISH | en_US |\n|미국령 군소 제도 | 581 | UMI | UM |\n|미국령 버진아일랜드 | 850 | VIR | VI |\n|미얀마 | 104 | MMR | MM |\n|미크로네시아 연방 | 583 | FSM | FM |\n|바누아투 | 548 | VUT | VU |\n|바레인 | 048 | BHR | BH |\n|바베이도스 | 052 | BRB | BB |\n|바티칸 시국 | 336 | VAT | VA |\n|바하마 | 044 | BHS | BS |\n|방글라데시 | 050 | BGD | BD |\n|버뮤다 | 060 | BMU | BM |\n|베냉 | 204 | BEN | BJ |\n|베네수엘라 | 862 | VEN | VE |\n|베트남 | 704 | VNM | VN | 14 |LANGUAGE_VIETNAMESE | vi_VN |\n|벨기에 | 056 | BEL | BE |\n|벨라루스 | 112 | BLR | BY |\n|벨리즈 | 084 | BLZ | BZ |\n|보스니아 헤르체고비나 | 070 | BIH | BA |\n|보우벳 섬 | 074 | BVT | BV |\n|보츠와나 | 072 | BWA | BW |\n|볼리비아 | 068 | BOL | BO |\n|부룬디 | 108 | BDI | BI |\n|부르키나파소 | 854 | BFA | BF |\n|부탄 | 064 | BTN | BT |\n|북마리아나 제도 | 580 | MNP | MP |\n|불가리아 | 100 | BGR | BG |\n|브라질 | 076 | BRA | BR |\n|브루나이 | 096 | BRN | BN |\n|사모아 | 882 | WSM | WS |\n|사우디아라비아 | 682 | SAU | SA |\n|사우스조지아 사우스샌드위치 제도 | 239 | SGS | GS |\n|산마리노 | 674 | SMR | SM |\n|상투메 프린시페 | 678 | STP | ST |\n|생피에르 미클롱 | 666 | SPM | PM |\n|서사하라 | 732 | ESH | EH |\n|세네갈 | 686 | SEN | SN |\n|세르비아 몬테네그로 | 891 | SCG | CS |\n|세이셸 | 690 | SYC | SC |\n|세인트루시아 | 662 | LCA | LC |\n|세인트빈센트 그레나딘 | 670 | VCT | VC |\n|세인트키츠 네비스 | 659 | KNA | KN |\n|세인트헬레나 섬 | 654 | SHN | SH |\n|소말리아 | 706 | SOM | SO |\n|솔로몬 제도 | 090 | SLB | SB |\n|수단 | 736 | SDN | SD |\n|수리남 | 740 | SUR | SR |\n|스리랑카 | 144 | LKA | LK |\n|스발바르 얀마옌 | 744 | SJM | SJ |\n|스와질란드 | 748 | SWZ | SZ |\n|스웨덴 | 752 | SWE | SE |\n|스위스 | 756 | CHE | CH |\n|슬로바키아 slovak | 703 | SVK | SK | | | sk-SK |\n|슬로베니아 | 705 | SVN | SI |\n|시리아 | 760 | SYR | SY |\n|시에라리온 | 694 | SLE | SL |\n|싱가포르 | 702 | SGP | SG |\n|아랍에미리트 | 784 | ARE | AE |\n|아루바 | 533 | ABW | AW |\n|아르메니아 | 051 | ARM | AM |\n|아르헨티나 | 032 | ARG | AR |\n|아메리칸사모아 | 016 | ASM | AS |\n|아이슬란드 | 352 | ISL | IS |\n|아이티 | 332 | HTI | HT |\n|아일랜드 | 372 | IRL | IE |\n|아제르바이잔 | 031 | AZE | AZ |\n|아프가니스탄 | 004 | AFG | AF |\n|안도라 | 020 | AND | AD |\n|알바니아 | 008 | ALB | AL |\n|알제리 | 012 | DZA | DZ |\n|앙골라 | 024 | AGO | AO |\n|앤티가 바부다 | 028 | ATG | AG |\n|앵귈라 | 660 | AIA | AI |\n|에리트레아 | 232 | ERI | ER |\n|에스토니아 | 233 | EST | EE |\n|에스파냐 (Espanha · Spain ) | 724 | ESP | ES | 6 |LANGUAGE_SPANISH | es_ES |\n|에콰도르 | 218 | ECU | EC |\n|에티오피아 | 231 | ETH | ET |\n|엘살바도르 | 222 | SLV | SV |\n|영국 england | 826 | GBR | GB | | | en-GB |\n|영국령 버진아일랜드 | 092 | VGB | VG |\n|영국령 인도양 식민지 | 086 | IOT | IO |\n|예멘 | 887 | YEM | YE |\n|오만 | 512 | OMN | OM |\n|오스트레일리아 | 036 | AUS | AU |\n|오스트리아 | 040 | AUT | AT |\n|온두라스 | 340 | HND | HN |\n|올란드 제도 | 248 | ALA | AX |\n|요르단 | 400 | JOR | JO |\n|우간다 | 800 | UGA | UG |\n|우루과이 | 858 | URY | UY |\n|우즈베키스탄 | 860 | UZB | UZ |\n|우크라이나 | 804 | UKR | UA |\n|월리스 푸투나 | 876 | WLF | WF |\n|이라크 | 368 | IRQ | IQ |\n|이란 | 364 | IRN | IR |\n|이스라엘 | 376 | ISR | IL |\n|이집트 | 818 | EGY | EG |\n|이탈리아 | 380 | ITA | IT | 8 |LANGUAGE_ITALIAN | it_IT |\n|인도네시아 | 360 | IDN | ID |\n|인도 | 356 | IND | IN |\n|일본 | 392 | JPN | JP | 4 |LANGUAGE_JAPANESE | ja_JP |\n|자메이카 | 388 | JAM | JM |\n|잠비아 | 894 | ZMB | ZM |\n|적도 기니 | 226 | GNQ | GQ |\n|조선민주주의인민공화국 | 408 | PRK | KP |\n|중앙아프리카 공화국 | 140 | CAF | CF |\n|중화민국 | 158 | TWN | TW |\n|중화인민공화국 china | 156 | CHN | CN | 2 |LANGUAGE_CHINESE_SIMPLIFIED | zh_CHS |\n|~|~|~|~| 3 |LANGUAGE_CHINESE_TRADITIONAL | zh_CHT |\n|지부티 | 262 | DJI | DJ |\n|지브롤터 | 292 | GIB | GI |\n|짐바브웨 | 716 | ZWE | ZW |\n|차드 | 148 | TCD | TD |\n|체코 czech | 203 | CZE | CZ | 10 |LANGUAGE_CZECH | cs_CZ |\n|칠레 | 152 | CHL | CL |\n|카메룬 | 120 | CMR | CM |\n|카보베르데 | 132 | CPV | CV |\n|카자흐스탄 | 398 | KAZ | KZ |\n|카타르 | 634 | QAT | QA |\n|캄보디아 | 116 | KHM | KH |\n|캐나다 | 124 | CAN | CA |\n|케냐 | 404 | KEN | KE |\n|케이맨 제도 | 136 | CYM | KY |\n|코모로 | 174 | COM | KM |\n|코스타리카 | 188 | CRI | CR |\n|코코스 제도 | 166 | CCK | CC |\n|코트디부아르 | 384 | CIV | CI |\n|콜롬비아 | 170 | COL | CO |\n|콩고 공화국 | 178 | COG | CG |\n|콩고 민주 공화국 | 180 | COD | CD |\n|쿠바 | 192 | CUB | CU |\n|쿠웨이트 | 414 | KWT | KW |\n|쿡 제도 | 184 | COK | CK |\n|크로아티아 | 191 | HRV | HR |\n|크리스마스 섬 | 162 | CXR | CX |\n|키르기스스탄 | 417 | KGZ | KG |\n|키리바시 | 296 | KIR | KI |\n|키프로스 | 196 | CYP | CY |\n|타이 | 764 | THA | TH | 13 |LANGUAGE_THAI | th_TH |\n|타지키스탄 | 762 | TJK | TJ |\n|탄자니아 | 834 | TZA | TZ |\n|터크스 케이커스 제도 | 796 | TCA | TC |\n|터키 | 792 | TUR | TR |\n|토고 | 768 | TGO | TG |\n|토켈라우 제도 | 772 | TKL | TK |\n|통가 | 776 | TON | TO |\n|투르크메니스탄 | 795 | TKM | TM |\n|투발루 | 798 | TUV | TV |\n|튀니지 | 788 | TUN | TN |\n|트리니다드 토바고 | 780 | TTO | TT |\n|파나마 | 591 | PAN | PA |\n|파라과이 | 600 | PRY | PY |\n|파키스탄 | 586 | PAK | PK |\n|파푸아 뉴기니 | 598 | PNG | PG |\n|팔라우 | 585 | PLW | PW |\n|팔레스타인 | 275 | PSE | PS |\n|페로스 제도 | 234 | FRO | FO |\n|페루 | 604 | PER | PE |\n|포르투갈 | 620 | PRT | PT |\n|포클랜드 제도 | 238 | FLK | FK |\n|폴란드 | 616 | POL | PL | 9 |LANGUAGE_POLISH | pl_PL |\n|푸에르토리코 | 630 | PRI | PR |\n|프랑스 | 250 | FRA | FR | 5 |LANGUAGE_FRENCH | fr_FR |\n|프랑스령 기아나 | 254 | GUF | GF |\n|프랑스령 남부 지역 | 260 | ATF | TF |\n|프랑스령 폴리네시아 | 258 | PYF | PF |\n|피지 | 242 | FJI | FJ |\n|핀란드 | 246 | FIN | FI |\n|필리핀 | 608 | PHL | PH |\n|핏케언 섬 | 612 | PCN | PN |\n|허드 맥도날드 제도 | 334 | HMD | HM |\n|헝가리 | 348 | HUN | HU | 11 |LANGUAGE_HUNGARIAN | hu_HU |\n|홍콩 hong-kong | 344 | HKG | HK | | | zh-HK |\n\n
@@color(red): red @@\n@@color(blue): blue @@\n\n\n| !UI| ! | ! | ! | |''*.xml'' |\n| |widthbasis | ... |/widthbasis |\n| |ws_widthbasis |\n| |heightbasis |\n| | !Panel| ! | ! |\n| | |texture |@@color(red): lang @@ | "English", "Korean", "Japanese" |@@color(blue): ⇒ *_atlas.xml @@ |\n| | |ws_texture |@@color(red): lang @@ |\n| | |frame | |\n| | |x | |\n| | |y | |\n| | |width | |\n| | |height | |\n| | |ws_width | |\n| | |visible | |\n| | |alpha | |\n| | |anim_category | |\n| | |stretch | |\n| | |rendersection | |\n| | !/Panel| ! | ! |\n| !/UI| ! | ! | ! |\n\n| !atlas| ! | ! | ! | | ''*_atlas.xml'' |\n| |file |data\suix\s*_atlas.png |/file |\n| |widthbasis |\n| |chunksize |\n| | !frame| ! | ! |\n| | |name | |\n| | |x | |\n| | |y | |\n| | |w | |\n| | |h | |\n| | |xoffs | |\n| | |yoffs | |\n| | !/frame| ! | ! |\n| !/atlas| ! | ! | ! |\n\n-. 파일 위치 ; data\suix\s*.dds (설정된 파일 형식)\n\n\n
<html> <a name="Page180327"> </a> </html>\n<html>\n<a href="#Page180327_01"> #. soundsvox </a> <br>\n</html>\n \n<html> <span style="font-size: 10pt;"> <font color=RoyalBlue> <b> => 진정으로 소통하고 싶다면, 쉬운 글로 표현할 것 </b> </font> </span> </html>\n\n<html> <a name="Page180327_01"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page180327"> <span style="font-size: 14px;"> <b> #. soundsvox </b> </span> </a>\n</div> </html>\n<html> <span style="font-size: 10pt;"> <font color=RoyalBlue> <b> 호출 </b> </font> </span> </html>\n▷ data\s excel\s npc.xls > npc\n|Name |version_package |Greeting Generic |Greeting Templar |Greeting Cabalist |Greeting Hunter |\n|AeronAltair |release |AltairGreetingGroup |AltairTemplarGreetingGroup |AltairCabalistGreetingGroup |AltairHunterGreetingGroup |\n\n기타 구분 ; Greeting Male, Greeting Female, Greeting Faction Bad, Greeting Faction Neutral, Greeting Faction Good, \n Goodbye Generic, Goodbye Templar, Goodbye Cabalist, Goodbye Hunter, Goodbye Male, Goodbye Female, Goodbye Faction Bad, Goodbye Faction Neutral, Goodbye Faction Good\n\n\n<html> <span style="font-size: 10pt;"> <font color=RoyalBlue> <b> 보이스(voice) 설정 </b> </font> </span> </html>\n▷ data\s excel\s soundbalance.xls > soundvcas\n|Name |volume |\n|VOX | 0 |\n|VoxEnglish | 0 |\n|VoxFrench | 0 |\n|VoxGerman | 0 |\n|VoxKorean | 0 |\n|VoxJapanese | 0 |\n\n▷ data\s excel\s sounds.xls > soundsvox\n|Name |... |language |... |Bus |VCAs |... |Directory |Extension |LQ Extension |Filename1 |Weight1 |Filename2 |Weight2 |Filename3 |Weight3 |... |Weight16 |\n|AltairGreeting | | English |... |VOX |VOX,VoxEnglish,Altair |... |Dialogue\sEnglish\s01_Altair |way |mp2 |01_A_12_Eng | 10 |01_A_02_Eng | 10 |01_A_04_Eng | 10 |... | |\n|>|>|\n|AltairGreetingFrench | | French |... |VOX |VOX,VoxFrench,Altair |... |Dialogue\sFrench\s01_Altair |way |mp2 |01_A_12_Fre | 10 |01_A_02_Fre | 10 |01_A_04_Fre | 10 |... | |\n|>|>|\n|AltairGreetingGerman | | German |... |VOX |VOX,VoxGerman,Altair |... |Dialogue\sGerman\s01_Altair |way |mp2 |01_A_12_GRE | 10 |01_A_02_GRE | 10 |01_A_04_GRE | 10 |... | |\n|>|>|\n|AltairGreetingGroup | | |... |VOX |VOX |... | |wav |mp2 |AltairGreeting | 10 |AltairGreetingFrench | 10 |AltairGreetingGerman | 10 |... | |\n\n-. AltairGreetingGroup은 NPC 설정에서 호출하는 보이스 ; 사운드 type을 SOUND_LINK으로 설정\n / 엑셀 파일 파싱할 때, int SOUND_DATA::type;(int SOUND_DATA::index;) 설정 ; EXCEL_SET_FIELD_RESULT ''SoundExcelParse'' ( ... );\n{{{\n//-------------------------------------------------------------------------------------------------\n//-------------------------------------------------------------------------------------------------\nenum\n{\n SOUND_NONE,\n SOUND_FILE,\n SOUND_LINK,\n};\n//-------------------------------------------------------------------------------------------------\n//-------------------------------------------------------------------------------------------------\n#define MAX_SOUND_FILES_PER_GROUP 16\nstruct SOUND_DATA\n{\n...\n int type;\n int index;\n...\n};\n}}}\n\n\n<html> <span style="font-size: 10pt;"> <font color=RoyalBlue> <b> struct SOUND_GROUP { ... }; 설정 </b> </font> </span> </html>\n{{{\n#define MAX_SOUND_FILES_PER_GROUP 16\nstruct SOUND_GROUP\n{\n EXCEL_STR(pszName);\n...\n LANGUAGE eLanguage;\n...\n int nBus; // DATATABLE_SOUNDBUSES\n int nVCAs[MAX_VCAS_PER_SET]; // DATATABLE_SOUNDVCAS\n...\n EXCEL_STR(pszFolder);\n EXCEL_STR(pszExtension);\n EXCEL_STR(pszLQExtension);\n SOUND_DATA pSoundData[ MAX_SOUND_FILES_PER_GROUP ];\n...\n int nTotalSounds;\n};\n}}}\n-. int SOUND_GROUP::nTotalSounds; - pSoundData 크기(갯수)\n / 언어별, 사운드 출력시 비교 기준으로 사용 \n{{{\n//-------------------------------------------------------------------------------------------------\n//-------------------------------------------------------------------------------------------------\nenum SOUND_MEMORY_REQUEST_ITEM_RESULT\n{\n SMRIR_NONE,\n SMRIR_BREAK,\n SMRIR_CONTINUE,\n};\n//-------------------------------------------------------------------------------------------------\n//-------------------------------------------------------------------------------------------------\nstatic SOUND_MEMORY_REQUEST_ITEM_RESULT c_sSoundMemoryRequestItem(\n SOUND_GROUP * pSoundGroup,\n int nSoundDataIndex,\n BOOL bForceBlocking,\n BOOL bLockImmediately,\n SOUND_LOAD_TYPE eLoadType)\n{\n ASSERT_RETVAL(pSoundGroup, SMRIR_BREAK);\n...\n // We'll need a count of the actual number of sounds set.\n pSoundGroup->nTotalSounds++;\n\n if(pSoundGroup->pSoundData[nSoundDataIndex].bLoaded)\n {\n return SMRIR_CONTINUE;\n }\n...\n return SMRIR_NONE;\n};\n\n//-------------------------------------------------------------------------------------------------\n//-------------------------------------------------------------------------------------------------\nint c_sPickSoundToPlay( \n SOUND_GROUP * pSoundGroup )\n{\n if(!pSoundGroup)\n {\n return INVALID_LINK;\n }\n\n // Use Peter's KICKASSS (sic) picker tech to select a sound\n PickerStartCommonF(sgpPickers, picker);\n for (int ii = 0; ii < pSoundGroup->nTotalSounds; ii++)\n {\n if(pSoundGroup->pSoundData[ii].fWeight > 0 &&\n (pSoundGroup->pSoundData[ii].type == SOUND_LINK || c_SoundMemoryIsLoaded(pSoundGroup, ii)) &&\n c_sPickSoundMatchesLanguage(pSoundGroup, ii))\n {\n PickerAdd(MEMORY_FUNC_FILELINE(sgpPickers, c_SoundMemoryGetMemoryPool(), ii, pSoundGroup->pSoundData[ii].fWeight));\n }\n }\n int pick = PickerChoose(sgpPickers, sgtSoundRand);\n if(pick < 0)\n {\n return INVALID_LINK;\n }\n\n return pick;\n}\n\n//-------------------------------------------------------------------------------------------------\n//-------------------------------------------------------------------------------------------------\nBOOL c_sPickSoundMatchesLanguage(\n SOUND_GROUP * pSoundGroup, int ii )\n{\n ASSERT_RETTRUE(gpfnGetCurrentAudioLanguage)\n if(pSoundGroup->pSoundData[ii].type == SOUND_LINK && pSoundGroup->pSoundData[ii].index >= 0)\n {\n SOUND_GROUP * pLinkedSound = (SOUND_GROUP *)ExcelGetDataNotThreadSafe(EXCEL_CONTEXT(), DATATABLE_SOUNDS, pSoundGroup->pSoundData[ii].index );\n if(pLinkedSound && pLinkedSound->eLanguage >= 0)\n {\n if(pLinkedSound->eLanguage != gpfnGetCurrentAudioLanguage( AppGameGet() ))\n {\n return FALSE;\n }\n }\n }\n return TRUE;\n}\n}}}
원문 ; http://lab.cliel.com/entry/C-C-표준-Library-함수-문자-판단-함수\n\n아래 함수를 사용하기 위해서는 ctype.h Header File이 선언되어야 합니다.\n\n| !함수 | ! 사용 | ! 설명 |\n| isalnum() |isalnum(c) |전달되온 c가 영문자/숫자가 아니면 0을 반환합니다. |\n| isalpha() |isalpha(c) |전달되온 c가 영문자가 아니면 0을 반환합니다. |\n| isascii() |isascii(c) |전달되온 c가 ascii문자가 아니면 0을 반환합니다. |\n| iscntrl() |iscntrl(c) |전달되온 c가 제어문자가 이니면 0을 반환합니다. |\n| iscsym() |iscsym(c) |전달되온 c가 _, 영문자, 숫자가 아니면 0을 반환합니다. |\n| iscsymf() |iscsymf(c) |전달되온 c가 _, 영문자가 아니면 0을 반환합니다. |\n| isdigit() |isdigit(c) |전달되온 c가 숫자가 아니면 0을 반환합니다. |\n| isgraph() |isgraph(c) |전달되온 c가 출력가능한 문자가 아니면 0을 반환합니다.(공백이 없어야 합니다.) |\n| islower() |islower(c) |전달되온 c가 소문자가 아니면 0을 반환합니다. |\n| isprint() |isprint(c) |전달되온 c가 출력가능한 문자가 아니면 0을 반환합니다.(공백을 포함합니다.) |\n| ispunct() |ispunct(c) |전달되온 c가 출력가능한 문자가 아니면 0을 반환합니다.(숫자, 문자, 공백이 아닌것만 해당합니다.) |\n| isspace() |isspace(c) |전달되온 c가 공백, feed(\sf), tab(\st, \sv), 넘김(\sr)이 아니면 0을 반환합니다. |\n| isupper() |isuppper(c) |전달되온 c가 대문자가 아니면 0을 반환합니다. |\n| isxdigit() |isxdigit(c) |전달되온 c가 16진수가 아니면 0을 반환합니다. |\n\n 각 함수의 c는 문자형인수를 의미합니다. 다음 표는 각 함수의 반환값에 대한 설명입니다.\n| !함수 | ! 설명 |\n| isalnum() |영문대문자 : 1, 영문소문자 : 2, 숫자 : 4 |\n| isalpha() |대문자 : 1, 소문자 : 2 |\n| isascii() | ascii문자 : 1 |\n| iscntrl() |0x00~0x1F/0x7F : 32 |\n| iscsym() |true로 판단되는 문자 : 1 |\n| iscsymf() |true로 판단되는 문자 : 1 |\n| isdigit() |숫자 : 4 |\n| isgraph() |영문대문자 : 1, 영문소문자 : 2, 숫자 : 4, 그외 : 16 |\n| islower() |영문소문자 : 2 |\n| isprint() |영문대문자 : 1, 영문소문자 : 2, 숫자 : 4, 공백 : 64, 그외 : 16 |\n| ispunct() |true로 판단되는 문자 : 16 |\n| isspace() |true로 판단되는 문자 : 16 |\n| isupper() |영문대문자 : 1 |\n| isxdigit() |16진수 : 128 |\n\n{{{\n#include <stdio.h>\n#include <ctype.h>\n\nmain()\n{\n char s[7];\n int i;\n \n printf("문자열 입력하세요 : "); scanf("%s", &s);\n \n for(i = 0; i <= 6; i++){\n if (isdigit(s[i]) != 0){\n printf("입력하신 내용에 숫자가 있습니다.\sn");\n \n return;\n }\n }\n \n printf("모두 문자 입니다.\sn");\n}\n}}}\n
@@color(#04f): ▣ 추령(Churyeong, 楸嶺), 추령재(Churyeongjae)은 @@ @ 2019-12-17 @\n대한민국의 경상북도 경주시 황용동에서 양북면을 연결하는 고개이다. 또는 가내동재(관해(觀海)동재)라고 하기도 한다. 높이는 약 310m이다. 국도 제4호선이 추령터널로 가로질러 지나갈 수 있다. 도로명은 추령재길(Churyeongjae-gil)이다. \n\n\n
참고 ; http://freemmer.tistory.com/35\n\nC++에서 Memory(auto든 static이든 dynamic이든)를 사용할 때 초기화 하지 않았을 때의 값은 Undefined다. VC++에서는 Debug모드일 때 메모리 관련 오류를 디버깅하기 위해 자동으로 메모리를 초기화 해 준다.\n\nVisual C++ debugging memory state\n|!값 |!의미 |\n|0xCCCCCCCC |초기화 하지 않은 스택 메모리. |\n|0xCDCDCDCD |메모리 할당 후 초기화되지 않은 힙 메모리. |\n|0xDDDDDDDD or 0xFEEEFEEE |힙에서 Free된 메모리이다. 그것을 사용할 때. |\n|0xFDFDFDFD |할당한 것을 벗어난 heap의 공간을 사용할 시에 할당된 메모리의 전후 가드용으로 바이트에 채워지는 값 |\n|ABABABAB |HeapAlloc으로 메모리 할당 후 가드 바이트에 채워진 값. |\n|BAADF00D |LocalAlloc(LMEM_FIXED)으로 메모리를 할당한 후 초기화하지 않음. |\n|FEEEFEEE |힙 메모리 해제후 채워지는 값. |\n\n참고로 코드에 메모리 주소를 출력하는 코드는 다음과 같다.\n{{{\nPrint("[%#x]",ptr); // 0x001234\nPrint("[%x]",ptr); // 0x1234\nPrint("[%p]",ptr); // 001234\n}}}\n디버그에서는 쓰레기 값으로 채우지만, 릴리즈에서는 이 값을 채워 넣지 않는다.\n\n*.exe의 0xdddddddd에 첫째 예외가 있습니다. 0xC0000005: 0xdddddddd 위치를 읽는 동안 액세스 위반이 발생했습니다.\n*.exe의 0xdddddddd에 처리되지 않은 예외가 있습니다. 0xC0000005: 0xdddddddd 위치를 읽는 동안 액세스 위반이 발생했습니다.\n\n\n<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 16px;"> <b> 비쥬얼 스튜디오 주소값(메모리)로 디버깅하기 </b> </span>\n</html>\n출처 - https://kin.naver.com/open100/detail.nhn?d1id=1&dirId=104&docId=1401708\n\n에러난 변수를 조사식으로 끌어내리고, 변수의 앞네 주소값을 의미하는 &연산자를 붙여서, 주소값을 찾는다.\n비쥬얼 스튜디오에서 이 주소를 가지는 값이 바뀌게 될 때 브레이크 포인트가 자동으로 걸리게 설정한다.\n\n디버그 -> 새중단점-> 새데이터 중단점(D)... 순으로 들어가 클릭\n\nㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ\n새 중단점\n지정한 주소의 메모리가 변경될 때 실행을 중간합니다.\n...\n주소(A):\n\nㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ\n\n다시 실행하면 \n처음 시작할때 한번은 해당 주소가 할당 되었을때 조사를 해고 \n그다음부터 해당 주소의 값이 변경 되거나하면 아래처럼 브레이크 포인트가 자동으로 걸리게 된다.\n\n\n\n
직물은 크게 면직물, 마직물, 견직물로 나눌 수 있다.\n\n<html> <SPAN style="FONT-SIZE: 11pt;"> <font color=RoyalBlue> <b> ○ 면직물 </b> </font> </SPAN> </html>\n면직물은 목화씨로 만든 면사로 짠 직물을 총칭한다.\n\n<html> <SPAN style="FONT-SIZE: 11pt;"> <font color=RoyalBlue> <b> ○ 마직물 </b> </font> </SPAN> </html>\n마직물은 삼, 모시풀, 아마등으로 짠 식물섬유를 말한다.\n(대마풀) 대마가 삼베이고, (모시풀) 저마가 모시이다.\n린넨은 서양의 마섬유로, 아마라는 식물로 만든다.\n\n <html> <SPAN style="FONT-SIZE: 10pt;"> <font color=RoyalBlue> <b> ■ 모시 </b> </font> </SPAN> </html>\n서천의 한산모시, 충남 청양의 춘포\n\n <html> <SPAN style="FONT-SIZE: 10pt;"> <font color=RoyalBlue> <b> ▷ 춘포 </b> </font> </SPAN> </html>\n춘포는 명주실을 날실로, 모시를 씨실로 하여 짜서 치자물을 들인 ‘배(布)로서, 봄에 주로 입기 때문에 ’춘포‘라고 한다. 누에고치에서 직접 명주실을 뽑아 치자물을 먹여 옷감을 짠다.\n\n\n <html> <SPAN style="FONT-SIZE: 10pt;"> <font color=RoyalBlue> <b> ■ 삼베 </b> </font> </SPAN> </html> 또는 베는 삼실로 짠 피륙이다. \n삼 줄기의 인피섬유를 이용해서 짜며, 표백하면 상하므로 특유의 누런 색상 그대로 사용한다. 뻣뻣하고 신축성이 적으며 잘 늘어나지 않아서 오늘날에는 수의 외에는 옷감으로 잘 사용하지 않는다. 대신 질기고 물에도 강해 로프·카펫·구두나 가방을 만들 때 쓰는 바느질용 실, 침구류 등에 사용된다.\n\n <html> <SPAN style="FONT-SIZE: 10pt;"> <font color=RoyalBlue> <b> ▷ 안동포 </b> </font> </SPAN> </html> 는 경상북도 안동 지방에서 생산되는 올이 가늘고 빛이 누런 베를 가리킨다. \n짜임새가 가늘고 고와 삼베 중에서 최고급품으로 친다. 주로 남자 어른용 고의나 적삼을 만드는 데 이용된다.\n\n\n<html> <SPAN style="FONT-SIZE: 11pt;"> <font color=RoyalBlue> <b> ○ 견직물 </b> </font> </SPAN> </html>\n견직물은 비단, 영어로 silk이다.\n누에나방이 뽕나무를 먹고 고치(먹고 토한 실로 만든 집)를 만들면 이를 가지고 삶아서 비단실을 뽑아낸다.\n\n\n<br>
source\sfillpak.cpp\n√ 표시 ; static BOOL ''sFillPakServerMinPakFn''( );에서 호출\n AppSetDebugFlag(ADF_FILL_PAK_BIT, TRUE);\n AppSetDebugFlag(ADF_FILL_PAK_MIN_BIT, TRUE);\n -forcepak -minpak -regentxt -nomutexchecks -version_major20\n\n● 표시 ; static BOOL ''sFillPakServerFn''( );에서 호출\n AppSetDebugFlag(ADF_FILL_PAK_BIT, TRUE);\n AppSetDebugFlag(ADF_FILL_SOUND_PAK_BIT, TRUE);\n if TEXT("patch"), AppSetDebugFlag(ADF_DONT_ADD_TO_PAKFILE, TRUE);\n FillPakLocalizedSetup( NULL );\n -forcepak -pak -regentxt -nomutexchecks -version_major20\n\n → hellgate_sound000, hellgate000.dat\n\nstruct {\n FILLPAK_SERVER_RESPONSE_COMMANDS iCmd;\n BOOL (*handler)(MSG_STRUCT* pMsg);\n} FILLPAK_CMD_HANDLER_ARRAY[] =\n{\n+++[√ { FPC_LOAD_UI, sFillPakClt_LoadUI },]\n / UIInit( FALSE, TRUE );\n → hellgate000.dat 갱신\n=== \n+++[√ { FPC_LOAD_MASTER_DB, sFillPakClt_LoadMasterDatabaseFile },]\n / e_CompatDB_LoadMasterDatabaseFile();\n path_string(FILE_PATH_EXCEL) + @@color(#FF0000): "compatdb.csv" @@;\n → *.dat 갱신 없음\n=== \n+++[√ { FPC_LOAD_EFFECT, sFillPakClt_LoadEffect }, ]\n / sEffectFillpakCallback(pMsg->strFileName);\n FilesIterateInDirectory( FILE_PATH_EFFECT, @@color(#FF0000): "*.fxo" @@, sFillPak_LoadEffect, NULL, TRUE);\n FilesIterateInDirectory( FILE_PATH_EFFECT_COMMON, @@color(#FF0000): "*.fxo" @@, sFillPak_LoadEffect, NULL, TRUE);\n → hellgate000.dat 갱신\n=== \n+++[√ START_SECTION( "Wardrobes" ); ]\n# attachments in layers ; DATATABLE_WARDROBE_LAYER\n** wardrobe.xls > wardrobe_layer_mods 시트에서 'Row Collection'이 1인 경우에 low 폴드에 해당 data 필요\n** *.GR2 ⇒ *.am 파일을 생성 ⇒ *.wm paking \n** 워드롭메시 생성 - PRESULT e_WardrobeModelFileUpdate( ... ); (in source\s Engine\s Source\s DxC\s dxC_wardrobe.cpp)\n# models ; DATATABLE_WARDROBE_MODEL, DATATABLE_WARDROBE_APPEARANCE_GROUP\n# textures ; DATATABLE_WARDROBE_APPEARANCE_GROUP, DATATABLE_WARDROBE_BLENDOP, DATATABLE_WARDROBE_TEXTURESET\n → hellgate_graphicshigh000, hellgate_playershigh000, hellgate_sound000, hellgate000.data 갱신\n=== \n / { FPC_LOAD_WARDROBE_LAYER, sFillPakClt_LoadWardrobeLayer },\n / { FPC_LOAD_WARDROBE_MODEL, sFillPakClt_LoadWardrobeModel },\n / { FPC_LOAD_WARDROBE_BLENDOP, sFillPakClt_LoadWardrobeBlendOp },\n / { FPC_LOAD_WARDROBE_TEXTURE, sFillPakClt_LoadWardrobeTexture },\n+++[static void sFillPak_EngineCleanUp()]\n{{{\n{\n CLT_VERSION_ONLY(sFillPakClt_EngineCleanUp(NULL));\n SVR_VERSION_ONLY(FillPakServerSendCleanUpToClients());\n}\n//----------------------------------------------------------------------------\nstatic BOOL sFillPakClt_EngineCleanUp( MSG_STRUCT* msg )\n{\n UNREFERENCED_PARAMETER(msg);\n sFillPakEngineCleanup();\n return TRUE;\n}\n//----------------------------------------------------------------------------\nvoid FillPakServerSendCleanUpToClients()\n{\n\n}\n}}}\n=== \n+++[√ { FPC_LOAD_UNIT, ( Unit genus ) sFillPakClt_LoadUnit }, ]\nenum ''GENUS'' (//saved in database, do not change value)\n{\n* GENUS_NONE = 0 - DATATABLE_NONE\n* GENUS_PLAYER = 1 - DATATABLE_PLAYERS\n** players - 캐릭터 선택창에 표시될 클래스별 외형과 성별, hp, state 등 설정\n* GENUS_MONSTER = 2 - DATATABLE_MONSTERS\n** monsters\n* GENUS_MISSILE = 3 - DATATABLE_MISSILES\n** missiles\n* GENUS_ITEM = 4 - DATATABLE_ITEMS\n** items ; items_mt, items_misc, items_weapons, items_armor, items_mods\n* GENUS_OBJECT = 5 - DATATABLE_OBJECTS\n** objects\nNUM_GENUS,\n};\n → hellgate_graphicshigh000, hellgate_sound000, hellgate000.dat\n=== \n+++[● { FPC_LOAD_ROOM, sFillPakClt_LoadRoom }, ]\n → hellgate_bghigh000, hellgate_graphicshigh000, hellgate_sound000, hellgate000.dat 갱신\n / DATATABLE_ROOM_INDEX\n{{{\nSTART_SECTION( "Rooms" );\n{\n GAME* pGame = AppGetCltGame();\n\n int nRoomIndexCount = ExcelGetNumRows( pGame, DATATABLE_ROOM_INDEX );\n for ( int i = 0; i < nRoomIndexCount; i++ ) {\n FPC_LOAD_GENERAL_MSG msg(i);\n sFillPak_Execute(FPC_LOAD_ROOM, &msg); --> sFillPakClt_LoadRoom( ... );\n }\n}\nEND_SECTION();\n}}}\n / static BOOL sFillPakClt_LoadRoom( MSG_STRUCT* msg );에서는 LOD_LOW(=0), LOD_HIGH(=1) 데이터를 paking\n / static ROOM_DEFINITION * sRoomDefinitionGet( ... ); 에서 LOD 단계를 확인\n if (bLoadModel)\n {\n room_definition->nModelDefinitionId = e_ModelDefinitionNewFromFile( \n fullfilename, NULL, sRoomGetBackgroundModelDefinitionNewFlags(), fDistanceToCamera );\n }\n\n#. 그래픽 옵션 디폴트값 설정 \n ; PRESULT e_OptionState_Init(OptionState * pState); 에서 \n pState->set_nBackgroundLoadForceLOD(LOD_HIGH);\n / 호출 ; e_OptionState_GetActive()->get_nBackgroundLoadForceLOD() \n{{{\n//============================================================================\n// source\s room.cpp\n//----------------------------------------------------------------------------\nstatic unsigned sRoomGetBackgroundModelDefinitionNewFlags(void)\n{\n#if !ISVERSION(SERVER_VERSION)\n#if ISVERSION(DEVELOPMENT)\n if (e_IsNoRender()) // fillpaking\n {\n return MDNFF_DEFAULT; // Low 파일이 필요\n }\n#endif\n switch (e_OptionState_GetActive()->get_nBackgroundLoadForceLOD())\n {\n case LOD_LOW:\n return MDNFF_ALLOW_LOW_LOD | MDNFF_IGNORE_HIGH_LOD;\n case LOD_HIGH:\n return MDNFF_IGNORE_LOW_LOD | MDNFF_ALLOW_HIGH_LOD;\n default:\n break;\n }\n#endif\n return MDNFF_DEFAULT;\n}\n}}}\n / paking에서는 Low 파일들을 포함해서 paking 하지만\n 게임에서는 e_OptionState_GetActive()->get_nBackgroundLoadForceLOD(); 로 설정값을 확인\n cf. 현재 pState->set_nBackgroundLoadForceLOD(LOD_HIGH);\n=== \n+++[● START_SECTION( "DRLGs" ); ]\n - FPC_LOAD_DRLG, FPC_LOAD_DRLG_TEMPLATE, FPC_LOAD_DRLG_SUBSTITUTION_RULE, FPC_LOAD_DRLG_SUBSTITUTION_REPLACEMENT\n / DATATABLE_LEVEL_RULES\n → hellgate_bghigh000, hellgate_sound000, hellgate000.dat 갱신\n{{{\nstatic void sFillPak_LoadDRLGs()\n{\n...\n START_SECTION( "DRLGs" );\n int nRuleCount = ExcelGetNumRows( pGame, DATATABLE_LEVEL_RULES );\n \n // load all DRLGs\n for (int i = 0; i < nRuleCount; i++) {\n FPC_LOAD_GENERAL_MSG msg(i);\n sFillPak_Execute(FPC_LOAD_DRLG, &msg);\n }\n \n // load all DRLGs layout overrides\n for (int i = 0; i < nRuleCount; i++)\n {\n // Now we need to load any overridden room layouts:\n // First the templates\n → sFillPak_Execute( FPC_LOAD_DRLG_TEMPLATE, &msg );\n\n // Now the substitutions\n → sFillPak_Execute( FPC_LOAD_DRLG_SUBSTITUTION_RULE, &msg );\n → sFillPak_Execute( FPC_LOAD_DRLG_SUBSTITUTION_REPLACEMENT, &msg ); \n }\n END_SECTION();\n}\n}}}\n=== \n / { FPC_LOAD_DRLG, sFillPakClt_LoadDRLG },\n / { FPC_LOAD_DRLG_TEMPLATE, sFillPakClt_LoadDRLGTemplate },\n / { FPC_LOAD_DRLG_SUBSTITUTION_RULE, sFillPakClt_LoadDRLGSubstitutionRule },\n / { FPC_LOAD_DRLG_SUBSTITUTION_REPLACEMENT, sFillPakClt_LoadDRLGSubstitutionReplacement },\n+++[● { FPC_LOAD_ENVIRONMENT, sFillPakClt_LoadEnvironment }, ]\n → hellgate_bghigh000, hellgate000.dat 갱신\n\n - sFillPak_LoadEnvironments();\n DATATABLE_LEVEL_DRLGS, DATATABLE_LEVEL_THEMES, DATATABLE_LEVEL_DRLG_CHOICE\n - sFillPakClt_LoadEnvironment( MSG_STRUCT* msg );\n DATATABLE_LEVEL_DRLGS, DATATABLE_LEVEL_THEMES, \n DATATABLE_LEVEL_ENVIRONMENTS, \n DATATABLE_WEATHER_SETS, DATATABLE_WEATHER\n{{{\n#define MAX_DRLG_THEMES 20\n#define MAX_THEMES_FROM_WEATHER 4\n\n#define MAX_LEVEL_THEME_ALLOWED_STYLES 16\n#define MAX_WEATHER_SETS 8\n\nchar *envDebug = "";\nstatic void sFillPak_LoadEnvironments()\n{\n START_SECTION( "Environments" );\n\n // load all environments\n int nDRLGCount = ExcelGetNumRows(pGame, DATATABLE_LEVEL_DRLGS);\n int nThemeCount = ExcelGetNumRows(pGame, DATATABLE_LEVEL_THEMES);\n\n envDebug = "DATATABLE_LEVEL_DRLGS loop";\n for(int i = 0; i < nDRLGCount; i++) \n {\n // → sFillPak_Execute(FPC_LOAD_ENVIRONMENT, &msg);\n\n }\n\n envDebug = "DATATABLE_LEVEL_DRLG_CHOICE loop"; \n\n int nNumChoices = ExcelGetNumRows(pGame, DATATABLE_LEVEL_DRLG_CHOICE);\n for ( int i = 0; i < nNumChoices; i++ )\n {\n // → sFillPak_Execute(FPC_LOAD_ENVIRONMENT, &msg);\n }\n\n END_SECTION();\n}\n}}}\n=== \n+++[√ START_SECTION( "States" ); ]\n → hellgate_sound000, hellgate000.dat 갱신\n\n sFillPak_LoadGlobalMaterials();\n → sFillPak_Execute(FPC_LOAD_GLOBAL_MATERIAL, &msg); \n / DATATABLE_MATERIALS_GLOBAL\n sFillPak_Execute(FPC_LOAD_STATE, &msg); \n / DATATABLE_STATES\n sFillPak_Execute(FPC_LOAD_STATE_LIGHTING, &msg);\n → static BOOL sFillPakClt_LoadStateLighting( MSG_STRUCT* msg );\n → c_StateLightingDataEngineLoad(); \n / DATATABLE_STATE_LIGHTING\n=== \n / { FPC_LOAD_GLOBAL_MATERIAL, sFillPakClt_LoadGlobalMaterial },\n / { FPC_LOAD_STATE, sFillPakClt_LoadState },\n / { FPC_LOAD_STATE_LIGHTING, sFillPakClt_LoadStateLighting },\n+++[√ { FPC_LOAD_SKILL, sFillPakClt_LoadSkill }, ]\n → hellgate_sound000, hellgate000.dat 갱신\n\n sFillPak_Execute(FPC_LOAD_SKILL, &msg); - DATATABLE_SKILLS \n → static BOOL sFillPakClt_LoadSkill( MSG_STRUCT* msg );\n=== \n+++[√ { FPC_LOAD_MELEE_WEAPON, sFillPakClt_LoadMeleeWeapon }, ]\n → *.dat 갱신 없음\n\nSTART_SECTION( @@color(#FF0000): "Melee Weapons" @@ );\n sFillPak_Execute(FPC_LOAD_MELEE_WEAPON, &msg); - DATATABLE_MELEEWEAPONS\n cf. 근접무기와 관련된 effect 참고\nEND_SECTION\n{{{\nEXCEL_STRUCT_DEF(MELEE_WEAPON_DATA)\n EF_STRING( "name", szName )\n EF_FILE( "swing events", szSwingEvents )\n EF_INT( "", nSwingEventsId, INVALID_ID )\n EF_FILE( "Particle Folder", szEffectFolder )\n EF_DSTRING( "Tiny Hit", pEffects[COMBAT_RESULT_HIT_TINY].szDefault )\n...\n EF_DSTRING( "Fumble Physical", pEffects[COMBAT_RESULT_FUMBLE].tElementEffect[DAMAGE_TYPE_PHYSICAL].szPerElement )\n EXCEL_SET_INDEX(0, EXCEL_INDEX_WARN_DUPLICATE, "name")\nEXCEL_STRUCT_END\nEXCEL_TABLE_DEF(DATATABLE_MELEEWEAPONS, MELEE_WEAPON_DATA, APP_GAME_ALL, EXCEL_TABLE_PRIVATE, "meleeweapons") EXCEL_TABLE_END\n}}}\n=== \n+++[● { FPC_LOAD_AI, sFillPakClt_LoadAI }, ]\n / DATATABLE_AI_INIT → *.dat 갱신 없음\n\nunsigned int nAICount = ExcelGetNumRows(pGame, DATATABLE_AI_INIT);\nfor (unsigned int ii = 0; ii < nAICount; ii++) {\n FPC_LOAD_GENERAL_MSG msg(ii);\n sFillPak_Execute(FPC_LOAD_AI, &msg);\n}\n=== \n+++[● START_SECTION("Fillpak Sound"); ]\nFILLPAK_SOUND ; AppSetDebugFlag(ADF_FILL_SOUND_PAK_BIT, TRUE);\n → static BOOL sFillPakSoundServerFn()\n{\n sFillPak_LoadSounds(); - DATATABLE_SOUNDS\n / sFillPak_Execute(FPC_LOAD_SOUND, &msg);\n → hellgate_sound000, hellgate_soundmusic000, hellgate000.dat 갱신\n\n sFillPak_LoadSoundBuses(); - DATATABLE_SOUNDBUSES\n / sFillPak_Execute(FPC_LOAD_SOUNDBUS, &msg); → hellgate000.dat 갱신\n\n sFillPak_LoadSoundMixStates(); - DATATABLE_SOUND_MIXSTATES\n / sFillPak_Execute(FPC_LOAD_SOUNDMIXSTATE, &msg); → hellgate000.dat 갱신\n\n sFillPak_LoadSoundMixStateValues(); - DATATABLE_SOUND_MIXSTATE_VALUES\n / sFillPak_Execute(FPC_LOAD_SOUNDMIXSTATEVALUE, &msg); → hellgate000.dat 갱신\n\n return TRUE;\n}\n / DATAWARNING20180615.log 파일에 \n Music Ref 'CG' does not have required groove level type 'IdleLowTalox' 등, 총 943개 경고메시지 기록 (테이블 설정, 문제)\n=== \n ● { FPC_LOAD_SOUND, sFillPakClt_LoadSound },\n ● { FPC_LOAD_SOUNDBUS, sFillPakClt_LoadSoundBus },\n ● { FPC_LOAD_SOUNDMIXSTATE, sFillPakClt_LoadSoundMixState },\n ● { FPC_LOAD_SOUNDMIXSTATEVALUE, sFillPakClt_LoadSoundMixStateValue },\n+++[√ { FPC_LOAD_CLEANUP, sFillPakClt_EngineCleanUp }, ]\n-. FPC_LOAD_CLEANUP 메시지 호출 없이, 관련 함수로 호출\n{{{\n//----------------------------------------------------------------------------\nstatic void sFillPak_EngineCleanUp()\n{\n CLT_VERSION_ONLY(sFillPakClt_EngineCleanUp(NULL));\n SVR_VERSION_ONLY(FillPakServerSendCleanUpToClients());\n}\n\n//----------------------------------------------------------------------------\nstatic BOOL sFillPakClt_EngineCleanUp( MSG_STRUCT* msg )\n{\n UNREFERENCED_PARAMETER(msg);\n sFillPakEngineCleanup();\n return TRUE;\n}\n}}}\n=== \n{ FPC_LOAD_FINISHED, NULL },\n{ FPC_FILE_INFO_RESPONSE, NULL },\n+++[● CMDLINE("paksku_", sCmdLineFillPakSKU), ]\n-. -forcepak -paksku_korea_client_online/ -paksku_usa_client_online\n-. hellgate_localized000.dat 파일 안에, data/sku.sku 파일을 포함하고 있는 경우 에러 발생\n MessageBox( NULL, "Error filling language pak file" , MB_OK | MB_ICONERROR );\n → hellgate_adverts_localized000, hellgate_localized000, hellgate_movies000, hellgate_movieslow000, hellgate000.dat\n{{{\nstatic BOOL sFillPakLocalized(void);에서\n// fill strings for all languages in this sku\nStringTablesFillPak( nSKU ); → hellgate_localized000.dat 갱신\n\n// add localized textures from level textures\nsFillPak_Execute( FPC_LOAD_LEVEL_LOCALIZED, &tMessage );\n / DATATABLE_LEVEL_FILE_PATHS → hellgate_adverts_localized000, hellgate_localized000.dat 갱신\n\n// add the SKU code to the pak file\nSKUWriteToPak( nSKU ) → sku.sku 생성\n\n// Add localized voice files to the language pak here\nsFillPak_Execute(FPC_LOAD_SOUND_LOCALIZED, &msg);\n / DATATABLE_SOUNDS → hellgate_localized000.dat 갱신\n\n// Add movies to the movie pak here\nsFillPak_Execute(FPC_LOAD_MOVIE_LOCALIZED, &msg);\n / DATATABLE_MOVIES → hellgate_movies000, hellgate_movieslow000.dat 갱신\n\n// Add the localized EULA text\nsFillPak_Execute(FPC_LOAD_EULA_LOCALIZED, &msg);\n / sFillPakClt_LoadEulaText(filename); → hellgate_localized000.dat 갱신\ncf. data\sdocs\susa_client_online\s\n HG_EULA_English.txt, HG_EULA_Korean.txt / HG_TOS_English.txt, HG_TOS_Korean.txt\n}}}\n=== \n ● { FPC_LOAD_SOUND_LOCALIZED, sFillPakClt_LoadSoundLocalized },\n ● { FPC_LOAD_LEVEL_LOCALIZED, sFillPakClt_LoadLevelLocalized },\n ● { FPC_LOAD_MOVIE_LOCALIZED, sFillPakClt_LoadMovieLocalized },\n ● { FPC_LOAD_EULA_LOCALIZED, sFillPakClt_LoadEulaLocalized },\n{ FPC_FILE_ANNOUNCE, NULL },\n+++[● { FPC_LOAD_SPECIAL_FILE, sFillPakClt_LoadSpecialFile }, ?? ]\n-. Dave Berk's special file ?? → *.dat 갱신 없음\n / FILE NOT FOUND: data_common\smonitor-do_not_remove.txt\n\n / static BOOL sFillPakClt_LoadSpecialFile( MSG_STRUCT* msg);에서 \n return FALSE;\n=== \n+++[● { FPC_LOAD_DEMOLEVEL, sFillPakClt_LoadDemoLevel } ]\n / data\sdemolevel\sshafts.xml, streets.xml → hellgate000.dat 갱신\n\n static BOOL sFillPakClt_LoadDemoLevel( MSG_STRUCT* msg );\n → DemoLevelLoadDefinition(pMsg->strFileName);\n=== \n};
<html> <a name="Page180717"> </a> </html>\n<html>\n<a href="#Page180717_01"> #. 생활 </a> <br>\n<a href="#Page180717_03"> #. 취미 </a> <br>\n<a href="#Page180717_02"> #. Mall </a> <br>\n</html>\n▷ [[주소록]]\n\n* 커즈베이 ; 불타는 배럴, 넓은 원형 용기, 재현품, 둥근 모양 4발 향로\n* 스텐 음식물 쓰레기통 음식물처리통 가정용음식물 \n* 라쿠텐\n** 훈명당 소용돌이\n** 콘형 향\n* 오일 램프 광업 랜턴 / 핸드메이드 램프 아웃도어 캠프 JD바포드마이나즈란프 L\n* 쿠팡 ; 캔들워머 불교 용품 연꽃 오일등\n* https://smartstore.naver.com/ongdalsem33/products/6588746219 - 보이차 거름망 필터 여과기\n* https://wadmall.com/ - 와드몰 (차도구 백화점)\n* 뚜껑 있는 스테인레스 일본식 수프 그릇\n\n<html> <a name="Page180717_01"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page180717"> <span style="font-size: 14px;"> <b> #. 생활 </b> </span> </a>\n</div> </html>\n!! 생활\n| 구분 | 상품 | 브랜드 | 업체 | 가격 | 기타 |\n| 건강식품 | 코엔자임 큐텐 <br> (Co-Enzyme Q10) | 세노비스 (Cenovis) | 인천 신라면제점 |34,397원 <br> (32$ - D.C 3$ = 29$) | 15.12.16. |\n|~|~|~| G마켓 |75,000원 <br> 4팩 세트 | 16.01.15. |\n| 건재 |삼지구엽초(음양곽) | 국내산 |정선농협 <br> http://jsnh.nonghyup.com/ |50g - 7,000원 | 18.10.17. |\n|~|~|~|경동시장인터넷상인회 <br> http://www.internetkyungdong.or.kr/ |300g - 37,400원 | |\n|~|~| 중국산 |한약재시장 <br> http://hanyakjae.net/index.html | | |\n| 섬유유연제 |소프트 빈스 리필 2L x 6개 | cj라이온 | G 마켓 |23,310원 (25,900원, CJmall 10할인) | 18.10.16. |\n| 인스턴트커피 | 모코나 콘티넨탈 골드(250g) |제조사; SARA LEE COFFer JOURE (네덜란드) <br> 수입원; (주)네다한 | G마켓_남대문시장월푸드 |19,000원 | 15.11.25. |\n| 장류 |kikkoman こいくち 코이꾸찌 (진간장) | kikkoman | | | 염미(소금맛) |\n\n++++[건강]\n* Propolis Spray\n** 얼리버드 호주 마누카100 프로폴리스 스프레이30ml x6 - 59,900원 (할인가 52,720원) ■ 23.10.29. 11번가 / cf. EarlyBird Propolis Spray 40% 30ml\n* 꿀\n** Longan Honey ; 태국, 유리병, 1000g\n** 마누카헬스 MGO 115+(UMF 6+) 마누카 꿀 허니 1kg X 4개(기존 MGO100+) - 215,600원 + 배송비 39,600원 ≒ 할인가격 230,280원 (@ 57,570원) ■ 21.09.23. <br> https://smartstore.naver.com/healthinside ; 네이버 결재\n** 콤비타 UMF5+(MGO 83+) 마누카 꿀 1kg X 5개 - 261,500원 + 배송비 9,000원 ≒ 할인가격 257,430원 (@ 51,486원) ■ 21.10.06. <br> https://www.wellbeingshop.co.nz/ ; ziny9**/ well*****9*/ bis_@n~_at_com (21.10.06. 가입)\n* 녹색홍합\n** 블랙모어스 리프리놀 100정 ( 35,010원 ) X 3개 = 105,030원 (무료배송) ■ 21.10.23. 11번가, 호주약사언니\n* 기타 ; 루카스 포포크림, 프로폴리스 치약\n* 행복비타민 레스트업(Rest up) 수액패치 (www.funzzy.net) ; 풋테라피 효과를 주는 건강 수액패치\n* 이지덤 씬 2매(가위증정) - 4,390원 ■ 20.01.08. (http://anapharm.net) 안아팜\n* 3M 코반 2인치 1582 ( 50mm x 4.5 m )\n===\n\n+++[건강_안국 루테인 플러스]\n* 60캡슐 5개 - 59,980 원 (@ 200 원) ; https://smartstore.naver.com/yaksavita - 약사의비타민 ■ 18.07.17.\n* 60캡슐 2개 X 2세트 - 48,800 원 (@ 203 원) ; ■ 19.11.08. 위메프\n* 60캡슐 5개 - 65,970 원 (@ 220 원) - 약사의비타민 ■ 19.02.11.\n* 60캡슐(PTP) X 7박스 - 93,660 원 (@ 223 원) ; 롯데카드 5%청구할인, 네이버 최대 7% 추가할인\n* 180캡슐(PTP) X 2박스 - 55,010 원 (@ 153 원) ; (by 다나와) CJmall ■ 19.08.22.\n* 180캡슐(PTP) X 2박스 - 67,000 원 (@ 186 원) ; 쿠팡 ■ 20.06.02.\n===\n\n* 식품\n** 올반 찰 핫도그 800g (80g X 10개입)\n** 동원F&B 쎈쿡 맛있는 찰진약밥 210g\n* 주방\n** 그릇\n*** 티타늄 이중그릇 √ 티타늄 27종스텐 반상기, 티타늄 이중 한식기\n**** 한쿡스 티타늄 2인 반상기 세트(15P) ■ 19.10.29. 위메프\n***** (9P만 받음) 37,430원 ; 주발(밥공기, 107 X 54 )세트2P, 대접(국그릇, 133 X 55) 2P, 원형찬기 소1P, 중1P, 대1P\n**** http://cookpanda.co.kr/ - 쿡판다\n*** 트라이탄 용기\n**** 롯데마트 통큰 트라이탄 물병 1.3L\n**** 마크뉴슨 트라이탄 저그\n*** 미야모토 산업 덮밥, 미야모토 애니멀 월드 면기 - http://malltem.com/ ( 일본 구매대행 몰템 )\n**** PatternName:라-면 덮밥(돈부리) - 07,300 원 ■ 2019.07.22. cf. MIYAMOTO SANGYO ANIMARU BOWL\n**** PatternName:볼 - 06,100 원\n**** PatternName:플레이트 - 12,200 원\n*** 쿨기어 스윙탑 물병\n*** 프리파라 밀폐용기세트4P-스몰 9.5 x 높이14.5cm - 위메프 29,240원\n** 제기\n*** 골드 BS2.0 탕그릇 - 늘해랑 남원공방 ( 부산대성스텐레스공업사 )\n** 젓가락\n*** AOOSY, 6각 젓가락 AOOSY 육각 젓가락 5선 세트(230mm) - http://lifement.co.kr/ - 해외배송 대행\n**** 19.02. (한달 배송) - 15,300원 X 2개 + 배송비 15,300원\n*** http://bykatie.co.kr/ - 서교동언니집 ; Kitchen > 수저/포크\n** 미네랄 환원수 ; http://www.chnation.co.kr/ - 창하, 아리스톤워터\n* 청소용품\n** 사슴가죽 타월 수건 (60cm X 90cm) - 5,000원 ■ 19.10.23. 11번가\n\n!! 의류\n| 구분 | 상품 | 브랜드 | 업체 | 가격 |\n| 여름 | 반바지, 셔츠 | AND Z by ZIOZIA |신성통상(주) |2015.07. 수형 - 롯데몰 |\n| 여름 | 자켓 | OLZEN |신성통상(주) |2015.07. 수형 - 롯데몰 |\n| 여름 | 모자, 셔츠 | BUCKAROO |(주)엠케이트렌드 |2015.07. 시현 - 롯데몰 |\n| 신발 | (크록스) 산타 크루즈 2 럭스| 크록스 |크록스 코리아(주) |M9(270) / 2018.05. 수형 - GS Shop ; 57,880원 |\n|~| (크록스) 산타 크루즈| 크록스 |롯데백화점 |에스프레소, M9(270) / 2018.11. - GS Shop ; 39,920원(20% 할인) |\n* 의류\n** 유니클로\n*** Man ; 나일론 기어팬츠(3D컷) ㅣ/ 08 Dark Gray/ 96% 나일론, 4% 폴리우레탄\n* 양말\n** [POLO CLUB] 국산 오랜전통의 타올양말 남자양말10켤레 - 29,500원 ■ 19.11.26. 싹스토아\n*** http://minishop.gmarket.co.kr/sockstore\n** [POLONIZE] 캐주얼 부클사 타올 양말 (단목) - 1,940원 ■ 19.11.05. 양말나라 \n*** https://smartstore.naver.com/yangmalnara\n\n\n<html> <a name="Page180717_03"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page180717"> <span style="font-size: 14px;"> <b> #. 취미 </b> </span> </a>\n</div> </html>\n▷ [[장부_종이]]\n\n!! 비즈재료\n* 볼베어링 도래 ; 맨도래, 회전도래\n** http://www.all59.com/shop/goods/goods_list.php?category=004 - 10 개\n** http://marinemart.kr/shop/goods/goods_list.php?category=012002 - 100 개\n* 종이나라 펄트레이싱지 (2015.08. 현재 단종)\n** http://mungukorea.net/ - 문구코리아 / 15개(5색, 10매), 1박스 (10.500원) X 2개 구매\n* 악세사리\n** http://www.stone-k.co.kr/ - 스톤케이(천연석 팔찌)\n** https://indigo.co.kr/ - 인디.K > 태슬 매듭 ◁ 24.01.03. \n** https://okart.co.kr/index.html - 오케이아트 \n*** 미니 심플 수술 고리형(2종-10개) 5,000원 + 배송비 2,750원 ■ 23.04.06.\n** https://hannahart.kr/ - 한나아트 ; 랍스터, O링, 올챙이지프(구멍지프), 고정볼(누름볼) / 비즈 등\n** https://deardeco.com/ - 디어데코(DearDeco) ; 미니 금강저 통과장식 은팔찌재료(길이14mm)\n** http://www.selfart.co.kr/ - 공예 전문 포털-셀프아트 ; 라운드 마크네타이트(자철석)\n** https://sugardeco.kr/ - 슈가데코 ; 열쇠고리\n** https://미라클스톤.com/ - 부산광역시 진구 백양대로18번길 43 (부암동) 3층 미라클스톤\n** 기타\n*** [루앤블리] 올챙이캡 구멍지프 비드팁, 로즈골드, 고리형 지프 3mm, 4.4g(약 50개) + 0.5g @ 1,000원 ■ 24.04.09. 쿠팡\n*** 부자재 ; 우레탄줄 0.7mm, 나이론매듭실 0.7mm\n\n++++[비즈재료 ]\n| 상품 | 옵션 | 가격 | 구입 날짜 | 업체 | 비고 |\n|드림캐쳐 팬던트 |골드, 34 x 27mm | 500원 | 2024.08.19. | 슈가데코 | |\n|깃털장식 팬던트小 |팝핑크, 화이트, 20 ~ 23 mm | 590원 | 2024.08.19. | 슈가데코 | |\n| |\n|크리스탈 납작주판알 5mm |5mm, 색상 Crystal AB (16개) | 2,500원 | 2024.08.19. | 셀프아트 | |\n|납작볼 누름볼 부자재(약 100알) |B(14k금도금), 2mm | 1,200원 | 2024.08.19. |슈가데코 | |\n| |\n|미니 금강저 통과장식 은팔찌재료(길이14mm) |실버 부자재 | 5,950원 | 2024.08.19. | 디어데코 | |\n|젬스톤(원석) 라운드 마그네타이트(자철석) |자성 헤마타이트 4.5mm (1줄/약 38cm) | 1,500원 | 2024.08.19. | 셀프아트 | |\n|메탈비즈 라운드(메탈볼) 3mm |금도금, 3mm (100개) | 2,800원 | 2024.08.19. | 셀프아트 | |\n| |\n|실버 오링반지(고금도금) |지름 18 mm | 1,000원 | 2024.08.19. |슈가데코 | 홈페이지 가격 1,000원 |\n=== \n+++[열쇠고리 ]\n| 상품 | 옵션 | 가격 | 구입 날짜 | 업체 | 비고 |\n|별 하트 열쇠고리 키링 |별모양 / 실버, 2.5 x 3.5 cm | 450원 | 2024.08.19. |슈가데코 | |\n|실버 별&하트 열쇠고리 키링 |하트모양 / 실버, 2.4(3.0) x 6.5 cm | 500원 | 2024.08.19. |슈가데코 | |\n|고급 키링 열쇠고리(미니) |실버, 1.3 x 3.0 cm | 600원 | 2024.08.19. |슈가데코 | |\n=== \n\n\n!! 소품\n+++[오일 램프 ; 인등, Candle Holder ]\n* 참고\n** Design life 초모양 오일램프\n* http://www.jungtomall.com - 정토불교용품점\n** 인등,유등 > 유등(기름인등)-중(15cm) - 25,000원\n* http://candle1.co.kr - 남대문천일양초\n** 촛대 > 오일 램프 촛대 705 파라핀 램프, 호야램프(파라핀)4종 - 37,000원\n* 소모품\n** 심지\n*** 알콜램프심지(MS-627)/ 길이1미터/Lamp Wick ; 두께 약 5mm - 2,000원 ■ 20.01.07. 매직싸이언스\n** 파라핀 오일\n*** 오일왁스1.8 L - 6,000원 ■ 20.01.02. http://hiart.net/ - 하이 아트 (오일램프용)\n*** 워터캔들 액상향초 500ml, 블랙 체리(No. 6500 B) - 8,000원 ■ 19.12.12.\n** 심지가위(윅트리머)-블랙 @ 5,800원, 울트라 코어심지 4호(1m) @ 550원, 5호(1m) - 양초용 @ 600원 ■ 20.01.02.http://www.hiart.net/\n* Candle / Candle Holder\n** 불교 촛불 Ghee 램 프 홀더 - 18,230원(할인가, 무료 중국배송) ■ 2019-12-24 11번가\n** http://loveukata.co.kr/index.html - 러뷰카타 (해외 구매 대행이 아닌, 일본상품 판매)\n*** 라벤더 부엉이 세라믹 장식품 (일본 출고 캔들홀더 아로마 콘향 향로 디퓨저 보석함) / 11,000원 ■ 2019-11-11\n** http://www.housezille.com/ - 에덴의 동쪽 ; Soapstone Elephant 3.5 inches / 23,200원 ■ 2019-05-12\n===\n\n* 향/ 향로/ 코일향\n** 향\n*** https://www.sejonmall.com/ - 세존몰 ; 조연향당 (침향, 연꽃향, 자단)\n*** https://www.cwh.co.kr/ - 취운향당 (능혜스님)\n*** https://joyanghd.modoo.at/?link=bkywn8x9 - 조양향당\n**** 비나리향 (국산향) / 단, 80g, 143mm / 15,000원 ■ 21.11.03. 붓다존\n*** http://manbokhyangdang.co.kr/ - 만복향당 (일볼 향당 한국지사)\n*** http://www.zangter.co.kr/ - 인사동장터 ; 코일향\n*** http://ch15.co.kr/index.html - 범진침향원\n** 향로\n*** 순동 구리 향로 아로마 테라피 인센스 홀더 콘 받침대 (구리 향로+구리 받침대/ 34,410원(+17,090원)) @ 51,500 * 0.8(새해 세일) = 41,200원 ■ 2023.01.10. 옥션\n*** 가정용 테이블 백단 판향 향로 인테리어 장식 소품 @ 26,200 ■ 2022.11.25. 롯데온\n*** http://www.aromanbody.com/ - 양키캔들 (아로마 앤 바디) ; HOME > 아로마테라피용품 > 인센스/받침\n*** [Heavens] 인센스 콘타입 - 녹차 / (20corns) 7,500원 ■ 19.11.11. ( 주문 1573446907372 )\n*** http://www.omanmul.com/ - 오만물 \n**** 기도용 신주향로 (동느낌나는 신주 향로) -小- 자석식(향꽂이) \n**** 인천도자기 낮은촛대(중) - 인천스텐에서 만든 낮은도자기 촛대\n**** cf. 분청 둥근 오목접시형 촛대 ; 상부지름 125, 높이 38\n*** http://buddhabook.co.kr/ - 붓다북 불교전문쇼핑몰\n*** http://www.buddhazone.co.kr/ - 붓다존\n*** http://withbuddha.co.kr/ - 위드붇다 ; 향로-청자, 개구리 수반\n* 키워드\n** 은공예\n*** 뿔딱공예\n**** (천태종기) 3D 목걸이 (지름 24mm) ; @55,000원 ■ 22.11.28. 10개 주문\n***** 목걸이줄 ; 3.0mm X 450mm X 면체인 ; @40,000원 ■ 22.12.04.\n***** 목걸이줄 ; 3.0mm X 500mm X 면체인\n**** (천태종기) 3D 목걸이 (지름 26mm) ; @70,000원 ■ 22.12.10. 2개 주문\n***** 목걸이줄 ; 3.5mm X 600mm X 면체인 ; @70,000원 ■ 22.12.16.\n**** 로듐도금 (Rhodium) ; 목걸이 개당 @20,000원 ■ 22.12.16.\n**** 범종 메달 (중, 지름 36mm) cf. 원본, 지름 40mm / 대, 지름 38mm / 중, 36mm / 소, 지름 34mm \n***** ■ 22.10. 은 50,000원 X 5개 / 동 25,000원 X 10개 ■ 22.10.\n***** ■ 2024.07.24. ▷ 08.07. 은 (+ 로듐도금 + 고리) 130,000원 X 12개 = 1,560,000원\n***** 대, 중(3mm 은고리), 소 + 소(3mm 은고리) / 표범 여자 팔찌 500,000원 ▷ 총 1,000,000원 (선불) + 1,100,000원\n** 보리수 향로, 엔틱향로\n*** http://www.manjamall.co.kr/ - 만자몰 ; 순은 악세사리\n*** http://www.moranbulkyo.co.kr/ - 모란불교용품 ; 도자기 보리수 향로\n\n\n+++[주문 내역 ]\n| 구분 | 상품 | 포장단위 | 가격 | 단가 | 참고 |\n|>|스와로브스키 크리스탈 |\n|크리스탈(축구볼) |축구볼 4mm Crystal(AB) | 약 48개| 1,200원| 25원|17.07.25.(화) 엔비즈 |\n|~|론델컷 6mm 오렌지골드(OP) | 약 48개| 1,400원| 30원|17.07.25.(화) 엔비즈 |\n|주판알 |5D 713 Rose 로즈 | 10개| 1,400원| 140원|2015.06.03.(수) 비즈갤러리 |\n|~|6D Rose Peach 로즈피치 | 12개| 2,300원| 192원|2015.08.26.(수) |\n|캣츠아이(라운드) |6mm 연오렌지 | 약 32개| 1,900원| 60원|17.07.25.(화) 엔비즈 |\n|>|진주 |\n|스왈진주 |스왈진주8mm-로잘린 | 10개| 2,200원| 220원|2015.06.03.(수) 비즈갤러리 |\n|아크릴진주(라운드) |8mm 크림 | 약68개| 1,100원| 16원|17.07.25.(화) 엔비즈 |\n|>|금속부자재 |\n|랍스터(701) |5*10 신주버니쉬 | 10개| 800원| 80원|17.07.25.(화) 엔비즈 |\n|>|공구/케이스 |\n|공구 |Round nose pliers PL58 (Beadsmith) | 1개| 10,500원| |2015.06.03.(수) 비즈갤러리 |\n=== \n\n<html> <a name="Page180717_02"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page180717"> <span style="font-size: 14px;"> <b> #. Mall </b> </span> </a>\n</div> </html>\n\n\n<html> \n<a href="#Page180717"> <span style="font-size: 12px;"> <b> △ 맨위 =============== </b> </span> </a>\n</html>\n
++++[알리바바 창업자 마윈]\n2018.06. Vol.429 / 글 강경태 한국CEO연구소장 ... 요약\n\n!!!상생 경영이 성공의 지름길\n\n마윈은 1999년 친구 17명을 집에 초대했다. 이들은 좋은 일자리를 얻지 못해 창업에 도전했다. 학벌이 좋지 않았고 경력이 뛰어난 것도 아니지만 미래의 꿈을 위해 함께 했다. 사이트 이름은 ‘alibaba.com’으로 정했다. 창립자들은 인터넷이 보물창고가 되어 소기업들이 이곳에서 ‘열려라, 참깨!’의 꿈을 이룰 수있기를 희망했다. 마윈이 가장 먼저 하고 싶었던 일은 ‘소기업을 돕는 것’이었다. 설립 일에 사명을 분명히 했다. 그는 동업자들에게 우리가 이 자리에 모인 것은 소기업의 성장을 돕기 위해서이며, 이것이 우리의 사명이라고 강조했다.\n...\n마윈은 ‘IT(Information Technology) 시대를 지나 DT(Data Technology) 시대로 가는 전환기에 놓여있다’고 말하면서, ‘DT 시대는 고객, 직원, 협력사를 성장시키는 이타적인 생각을 가졌을 때 성공할 수 있다’고 강조한다. 그는 기업 운영의 세 가지 키워드로 EQ(감성지수), IQ(지능지수), LQ(사랑지수)을 언급한다. \n''‘성공한 창업자는 EQ가 높아 인간의 본성을 잘 파악한다’고 얘기하면서, 그러나 ‘LQ가 없다면 돈이 아무리 많아도 존중 받을 수 없다’고 말한다.''\n\n!!!기업가의 제일 덕목은 낙관주의\n\n마윈이 생각하는 ‘비즈니스 기회’는 어디에 있을까? 그는 사람들이 불평하는 곳에 있다고 말한다. 그리고 @@color(#04f): ‘진정한 기업가는 불평하지 않고, 성공한 사람은 언제나 자신의 문제를 돌아본다’고 강조한다. @@\n“나는 다른 사람이 불평하는 소리를 들으면 흥분된다. 기회가 보이고 그들을 위해 무엇을 할 수 있을지 고민하기 때문이다.” 그래서 ‘낙관’의 중요성에 대해 힘주어 얘기한다. “성공한 기업가, 정치지도자, 예술가를 많이 만났는데 그들은 모두 미래를 낙관했다. 비관적인 사람은 성공할 수 없다.”\n...\n알리바바에는 이런 말이 있다. “If not me, then who? If not now, then when?(내가 아니라면 누가? 지금이 아니면 언제?). @@color(#04f): 말로만 떠드는 것은 부족하며, 실제 행동이 수반되어야 한다는 점을 강조한다. 그래서 실패는 자연스러운 현상이며, 마윈도 많은 실패를 경험했다고 말한다. @@ 그는 ‘인생에서 가장 큰 자산은 과거의 모든 실패 경험이며, 어떻게 실패했는지 파악하고 돌아보는 것이 중요하다’고 강조한다.\n...\n마윈은 회사의 최대 상품은 ‘직원’이라고 얘기하면서 알리바바의 ‘인재 전략’에 대해 설명한다. “구글은 세계 일류 인재를 선호하지만, 알리바바는 평범한 사람을 선호한다. 배우고자 하는 사람이 우리 인재다. 돈이 생기면 바로 일류의, 대기업 출신을 찾으려고 하는데 그러면 안 된다. 자기에게 맞는 사람을 찾아야지, 최고의 사람을 찾으려 해서는 안 된다. 트랙터에 보잉747기의 엔진을 달면 \n되겠는가?”\n...\n''그는 30년 동안 ‘이상주의’, ‘책임감’, ‘낙관적인 긍정 에너지’의 세 가지를 꾸준히 지켜왔다고 말한다... “인생에서 최상의 대학은 사회의 대학이며, 만 권의 책을 읽는 것보다 만리길을 가는 것이 더 중요하다.”''\n===\n\n\n
*字(자): 한자 문화권, 특히 중국이나 한국, 일본에서 성년이 되는 관례 때 받는 이름인 관명과 함께 스스럼없이 부를 수 있도록 짓는 새로운 이름을 말한다.\n*號(호): 유교 문화권, 특히 중국이나 한국에서 본명이나 자 이외에 따로 지어 부르는 이름으로, 사람의 별칭이나 필명 또는 별호(別號)나 아호(雅號) 등을 가리킨다. \n*一名(일명): 본명 이외에 한편에서 따로 부르는 이름. cf.二名(이명)\n*初名(초명): «처음에 붙인 이름»라는 뜻의 한자어로서 아이 때의 이름\n*譜名(보명): 항렬(行列)을 사용해 지은 족보이름\n
\n<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 16px;"> <b> 현재 디렉토리 </b> </span>\n</html>\n\nWCHAR pathW[ MAX_PATH ];\n_wgetcwd( pathW, MAX_PATH );\n\n\n<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 16px;"> <b> 실행 파일이 있는 디렉토리 </b> </span>\n</html>\n\n\nTCHAR path[ MAX_PATH ];\nGetModuleFileName( NULL, path, MAX_PATH );\nPStrGetPath( path, MAX_PATH, path );\n\nWCHAR pathW[ MAX_PATH ];\nGetModuleFileNameW( NULL, path, MAX_PATH );\nPStrGetPath( pathW, MAX_PATH, pathW );\n{{{\n//----------------------------------------------------------------------------\n//----------------------------------------------------------------------------\ntemplate<class T>\nstatic\nint _PStrGetPath(\n T * newstring,\n int buflen,\n const T * oldstring)\n{\n ASSERT_RETZERO(newstring);\n ASSERT_RETZERO(oldstring);\n ASSERT_RETZERO(buflen > 0);\n\n buflen--; // set aside 0 terminator\n\n T * cur = newstring;\n int last_slash_pos = -1;\n int len = 0;\n while (*oldstring)\n {\n if (*oldstring == '\s\s' || *oldstring == '/')\n {\n last_slash_pos = len;\n }\n *cur++ = *oldstring++;\n len++;\n ASSERT(len < buflen);\n if (len >= buflen)\n {\n *newstring = 0;\n return 0;\n }\n }\n if (last_slash_pos < 0)\n {\n *newstring = 0;\n return 0;\n }\n *(newstring + last_slash_pos + 1) = 0;\n return last_slash_pos;\n}\n\nint PStrGetPath(char * newstring, int buflen, const char * oldstring)\n{\n return _PStrGetPath(newstring, buflen, oldstring);\n}\n\nint PStrGetPath(WCHAR * newstring, int buflen, const WCHAR * oldstring)\n{\n return _PStrGetPath(newstring, buflen, oldstring);\n}\n}}}\n\n<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 16px;"> <b> 문자열 가공을 통한 현재 루트 디렉토리 </b> </span>\n</html>\n\nWCHAR pathW[256];\nPGetModuleDirectory(pathW, _countof(pathW));\n\n{{{\ntypedef wchar_t OS_PATH_CHAR;\n//----------------------------------------------------------------------------\n//----------------------------------------------------------------------------\nBOOL PGetModuleDirectory(\n OS_PATH_CHAR * path,\n int size)\n{\n int len = OS_PATH_FUNC(GetModuleFileName)(NULL, path, size);\n len = PStrGetPath(path, size, path);\n\n OS_PATH_CHAR* last = path + len;\n for(;;)\n {\n if (last > path && (*last == OS_PATH_TEXT('\s\s') || *last == OS_PATH_TEXT('/') || *last == OS_PATH_TEXT(':')))\n {\n last--;\n }\n while (last > path && !(*last == OS_PATH_TEXT('\s\s') || *last == OS_PATH_TEXT('/') || *last == OS_PATH_TEXT(':')))\n {\n last--;\n }\n if (*last != 0 &&\n (PStrICmp(last + 1, OS_PATH_TEXT("bin\s\s")) == 0 ||\n PStrICmp(last + 1, OS_PATH_TEXT("MP_x86\s\s")) == 0 ||\n PStrICmp(last + 1, OS_PATH_TEXT("SP_x86\s\s")) == 0 ||\n PStrICmp(last + 1, OS_PATH_TEXT("MP_x64\s\s")) == 0 ||\n PStrICmp(last + 1, OS_PATH_TEXT("SP_x64\s\s")) == 0 ||\n PStrICmp(last + 1, OS_PATH_TEXT("debug\s\s")) == 0 ||\n PStrICmp(last + 1, OS_PATH_TEXT("debugNewPatch\s\s")) == 0 ||\n PStrICmp(last + 1, OS_PATH_TEXT("debugtugboat\s\s")) == 0 ||\n PStrICmp(last + 1, OS_PATH_TEXT("debugdx10\s\s")) == 0 ||\n PStrICmp(last + 1, OS_PATH_TEXT("debugoptimized\s\s")) == 0 ||\n PStrICmp(last + 1, OS_PATH_TEXT("debugoptimizeddx10\s\s")) == 0 ||\n PStrICmp(last + 1, OS_PATH_TEXT("debugoptimizedserver\s\s")) == 0 ||\n PStrICmp(last + 1, OS_PATH_TEXT("profile\s\s")) == 0 ||\n PStrICmp(last + 1, OS_PATH_TEXT("profiledx10\s\s")) == 0 ||\n PStrICmp(last + 1, OS_PATH_TEXT("profiletugboat\s\s")) == 0 || \n PStrICmp(last + 1, OS_PATH_TEXT("release\s\s")) == 0 ||\n PStrICmp(last + 1, OS_PATH_TEXT("releaseclientonly\s\s")) == 0 ||\n PStrICmp(last + 1, OS_PATH_TEXT("releasedemo\s\s")) == 0 || \n PStrICmp(last + 1, OS_PATH_TEXT("releasedx10\s\s")) == 0 ||\n PStrICmp(last + 1, OS_PATH_TEXT("releasetugboat\s\s")) == 0 ||\n PStrICmp(last + 1, OS_PATH_TEXT("Win32\s\s")) == 0 ||\n PStrICmp(last + 1, OS_PATH_TEXT("x64\s\s")) == 0 ||\n PStrICmp(last + 1, OS_PATH_TEXT("debughellgateserver\s\s")) == 0 ||\n PStrICmp(last + 1, OS_PATH_TEXT("debughellgateservernewpatch\s\s")) == 0 ||\n PStrICmp(last + 1, OS_PATH_TEXT("retailhellgateserver\s\s")) == 0 ||\n PStrICmp(last + 1, OS_PATH_TEXT("retailhellgateserverNewPatch\s\s")) == 0 ||\n PStrICmp(last + 1, OS_PATH_TEXT("retailtugboatserver\s\s")) == 0 ||\n PStrICmp(last + 1, OS_PATH_TEXT("heapagenthellgateserver\s\s")) == 0 ||\n PStrICmp(last + 1, OS_PATH_TEXT("heapagent\s\s")) == 0\n ))\n {\n *(last + 1) = 0;\n }\n else\n {\n break;\n }\n }\n\n return TRUE;\n}\n}}}\n\n
\n| argv[0][0] | argv[1][0] <br> check operation | argv[2][0] <br> check flags | argv[3][0] |\n| -help / -? |DisplayShortHelp(); | | |\n| 경로 |-help / -? |ShowExtendedHelp(); | |\n| |-add ( PAK_ADD ) |-ovr <br> bOverwriteFiles = true; | |\n| |~|-nocom <br> bNoCompressed = true; | Paking data (*.dat) 생성시 압축하지 않도록 강제 |\n| |-list ( PAK_LIST ) |-file |listFileName[MAX_PATH] <br> bUseListFile = true; |\n| |-extract ( PAK_EXT ) |-all <br> bExtractAll = true; | |\n| |~|-rem <br> bRemove = true; | 해당 파일이나 폴더명 필요 <br> (*.dat 파일 내에서 삭제) |\n| |-remove ( PAK_REM ) | | |\ncf. .\shellpak hellgate_movies001 -extract -all -rem cinematic ; -all, -rem은 개별적으로 적용\n\n''enum PAK_OPERATIONS'' { PAK_ADD=0, PAK_LIST, PAK_EXT, PAK_REM };\n\n''void DisplayShortHelp()''\n{\n printf(_T("Usage: Hellpak pakname(no ext) -operation [-flags] <files, directories>\snType 'Hellpak -help' or 'Hellpak -?' for more help\sn"));\n}\n\n''void ShowExtendedHelp()''\n{\n printf(_T("\s\n 세부 내역\n "));\n}\n\n\n''void main(int argc, char *argv[]); ''\n* if (argc < 2)\n** DisplayShortHelp();\n* else\n** state = 0;\n** TCHAR pakFileName[MAX_PATH]; <br> TCHAR listFileName[MAX_PATH];\n** PAK_OPERATIONS op; <br> vector<TCHAR*> opFiles;\n** bool bOverwriteFiles = false; ∬ -add: -ovr <br> bool bNoCompressed = false; ∬ -add: -nocom <br> bool bUseListFile = false; ∬ -list: -file <br> bool bExtractAll = false; ∬ -extract: -all <br> bool bRemove = false; ∬ -extract: -rem <br> \n** for (int index=1; index<argc; index++)\n*** switch(state)\n**** case 0:\n***** if (argv[index][0] == '-')\n****** if ((_tcscmp(argv[index], _T("-help")) == 0) || (_tcscmp(argv[index], _T("-?")) == 0)) <br> ShowExtendedHelp();\n****** else <br> state = 99;\n***** else <br> _tcscpy_s(pakFileName, MAX_PATH, argv[index]); state = 1;\n***** break;\n**** case 1: (check operation)\n***** if (argv[index][0] == '-')\n****** if (_tcscmp(argv[index], _T("-list")) == 0) <br> op = PAK_LIST; state = 2;\n****** else if (_tcscmp(argv[index], _T("-add"))==0) <br> op = PAK_ADD; state = 2;\n****** else if (_tcscmp(argv[index], _T("-extract"))==0) <br> op = PAK_EXT; state = 2;\n****** else if (_tcscmp(argv[index], _T("-remove"))==0) <br> op = PAK_REM; state = 2;\n****** else <br> state = 99;\n***** else <br> state = 99;\n***** break;\n**** case 2: (check flags)\n***** if (argv[index][0] == '-')\n****** switch(op)\n******* case PAK_LIST:\n******** if (_tcscmp(argv[index], _T("-file")) == 0)\n********* index++;\n********* if (index < argc) <br> _tcscpy_s(listFileName, MAX_PATH, argv[index]); <br> bUseListFile = true;\n******** else <br> state = 99;\n******** break;\n******* case PAK_ADD:\n******** if (_tcscmp(argv[index], _T("-ovr")) == 0) <br> bOverwriteFiles = true;\n******** else if (_tcscmp(argv[index], _T("-nocom")) == 0) <br> bNoCompressed = true;\n******** else <br> state = 99;\n******** break;\n******* case PAK_EXT:\n******** if (_tcscmp(argv[index], _T("-all")) == 0) <br> bExtractAll = true;\n******** else if (_tcscmp(argv[index], _T("-rem")) == 0) <br> bRemove = true;\n******** else <br> state = 99;\n******** break;\n***** else\n****** index --; <br> state = 3;\n***** break;\n**** case 3:\n***** opFiles.push_back(argv[index]); <br> break;\n**** default:\n***** break; <br> \n** √ check exit states <br> switch(state)\n*** case 0: <br> break;\n*** case 2: (maybe flags, but no files)\n**** if (op == PAK_LIST) <br> if (bUseListFile) 관련 처리\n**** else if (op == PAK_EXT) <br> if (bExtractAll) 관련 처리\n**** else <br> printf(_T("Error in syntax. Type 'hellpak -?' for usage.\sn"));\n**** break;\n*** case 3: (maybe no flags, should have files)\n**** if (op == PAK_ADD) <br> bOverwriteFiles 옵션, 관련 함수 인수로 적용 <br> bNoCompressed 옵션, 관련 함수 인수로 적용 <br> ⇒ pakFile.AddDirectoryToPak(opFiles[i], bOverwriteFiles, bNoCompressed); <br> ⇒ pakFile.AddFileToPak(opFiles[i], bOverwriteFiles, bNoCompressed);\n**** else if (op == PAK_EXT) <br> bRemove 옵션이 있을 때, 해당 파일 삭제\n**** else if (op == PAK_REM)\n**** else <br> printf(_T("Error in syntax. Type 'hellpak -?' for usage.\sn"));\n**** break;\n*** default: <br> printf(_T("Error in syntax. Type 'hellpak -?' for usage.\sn")); <br> break;\n\n
SHFOLDERAPI SHGetFolderPathA(HWND hwnd, int csidl, HANDLE hToken, DWORD dwFlags, LPSTR pszPath);\nSHFOLDERAPI SHGetFolderPathW(HWND hwnd, int csidl, HANDLE hToken, DWORD dwFlags, LPWSTR pszPath);\n{{{\nHRESULT SHGetFolderPathW(\n HWND hwndOwner,\n int nFolder, // 패스명을 가져오는, 폴더 식별을 위한 CSIDL값 ; CSIDL_PERSONAL 등\n HANDLE hToken, \n DWORD dwFlags, // 0 (SHGFP_TYPE_CURRENT)/ 1 (SHGFP_TYPE_DEFAULT) \n LPWSTR pszPath // 경로 저장 ( 리턴값이 S_FALSE 일 때, 공문자열이 된다)\n);\n}}}\nSHELL32.DLL 또는 SHFOLDER.DLL\n\n* int nFolder ; 패스명을 가져오는, 폴더 식별을 위한 CSIDL값 <br>(cf.microsoft\ssdk\swindows\sv6.0\sinclude\sshlobj.h)\n{{{\n#define CSIDL_DESKTOP 0x0000 // <desktop>\n#define CSIDL_INTERNET 0x0001 // Internet Explorer (icon on desktop)\n#define CSIDL_PROGRAMS 0x0002 // Start Menu\sPrograms\n#define CSIDL_CONTROLS 0x0003 // My Computer\sControl Panel\n#define CSIDL_PRINTERS 0x0004 // My Computer\sPrinters\n#define CSIDL_PERSONAL 0x0005 // My Documents\n...\n#define CSIDL_TEMPLATES 0x0015\n#define CSIDL_COMMON_STARTMENU 0x0016 // All Users\sStart Menu\n#define CSIDL_COMMON_PROGRAMS 0X0017 // All Users\sStart Menu\sPrograms\n#define CSIDL_COMMON_STARTUP 0x0018 // All Users\sStartup\n#define CSIDL_COMMON_DESKTOPDIRECTORY 0x0019 // All Users\sDesktop\n#define CSIDL_APPDATA 0x001a // <user name>\sApplication Data\n#define CSIDL_PRINTHOOD 0x001b // <user name>\sPrintHood\n}}}\n* DWORD dwFlags ; 어느 쪽의 패스가 돌려주어지는지를 지정하는 플래그 <br> 이 파라미터는 CSIDL 값에 할당할 수 있고 있는 폴더가 유저에 의해서 이동되거나 이름이 변경될지도 모르는 경우에 사용.\n** 0 (SHGFP_TYPE_CURRENT) ; 폴더의 현재의 패스명을 돌려준다.\n** 1 (SHGFP_TYPE_DEFAULT) ; 폴더의 디폴트의 패스명을 돌려준다.\n\n이전의 버젼의 쉘에는 SHGetSpecialFolderPath 함수가 포함되어 있다.\n\n{{{\nWCHAR szUserDataPath[MAX_PATH];\nif (SHGetFolderPathW(NULL, CSIDL_PERSONAL, NULL, SHGFP_TYPE_CURRENT, szUserDataPath) != S_OK) \n{\n MessageBox(NULL, "Error retrieving personal folder.", "Error", MB_OK);\n return -1;\n}\n}}}\n\n
{{{\n// ref. directx_june2007\s d3d9caps.h\n// PresentationIntervals\n//\n#define D3DPRESENT_INTERVAL_DEFAULT 0x00000000L // 디폴트의 시스템 타이머 정밀도를 사용 (≒ 60 FPS)\n#define D3DPRESENT_INTERVAL_ONE 0x00000001L\n#define D3DPRESENT_INTERVAL_TWO 0x00000002L\n#define D3DPRESENT_INTERVAL_THREE 0x00000004L\n#define D3DPRESENT_INTERVAL_FOUR 0x00000008L\n#define D3DPRESENT_INTERVAL_IMMEDIATE 0x80000000L // 즉시 갱신\n}}}\n수직동기화를 설정할 경우(pState->get_bFlipWaitVerticalRetrace()), 티어링을 방지할 수 있어나 Draw fps가 떨어짐\n D3DPRESENT_PARAMETERS & Pres;\n Pres.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;\n\n{{{\nvoid dxC_StateToPresentation(const OptionState * pState, D3DPRESENT_PARAMETERS & Pres)\n{\n Pres.Windowed = pState->get_bWindowed();\n\n unsigned nBackBufferCount = pState->get_nBackBufferCount();\n ASSERT_DO( nBackBufferCount >= 0 && nBackBufferCount <= 2 )\n {\n nBackBufferCount = 1;\n }\n\n#ifdef ENGINE_TARGET_DX9\n Pres.BackBufferCount = nBackBufferCount;\n Pres.BackBufferFormat = dxC_GetBackbufferRenderTargetFormat( pState );\n Pres.SwapEffect = e_IsNoRender() ? D3DSWAPEFFECT_COPY : D3DSWAPEFFECT_DISCARD;\n Pres.BackBufferWidth = pState->get_nFrameBufferWidth();\n Pres.BackBufferHeight = pState->get_nFrameBufferHeight();\n // Denominator ignored for DX9\n Pres.FullScreen_RefreshRateInHz = Pres.Windowed ? 0 : pState->get_nScreenRefreshHzNumerator(); \n#endif\n#ifdef ENGINE_TARGET_DX10\n Pres.BufferCount = nBackBufferCount + 1; //Need to include front buffer\n Pres.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;\n Pres.BufferUsage = DXGI_USAGE_SHADER_INPUT | DXGI_USAGE_RENDER_TARGET_OUTPUT;\n E_SCREEN_DISPLAY_MODE Mode;\n e_Screen_DisplayModeFromState(pState, Mode);\n Pres.BufferDesc = dxC_ConvertNativeDisplayMode(Mode);\n#endif\n Pres.hDeviceWindow = AppCommonGetHWnd();\n\n#ifdef ENGINE_TARGET_DX9 //No autodepthstencil in DX10\n Pres.EnableAutoDepthStencil = true;\n Pres.AutoDepthStencilFormat = gtAutoDepthStencilFormat;\n Pres.PresentationInterval = pState->get_bFlipWaitVerticalRetrace() ? D3DPRESENT_INTERVAL_ONE : D3DPRESENT_INTERVAL_IMMEDIATE;\n#endif\n\n //Set MSAA\n Pres.MultiSampleType = pState->get_nMultiSampleType() DX10_BLOCK( != 0 ? pState->get_nMultiSampleType() : 1 );\n Pres.MultiSampleQuality = pState->get_nMultiSampleQuality();\n\n Pres.Flags = 0;\n}\n}}}\n
++++[ #. 통찰, 평범에서 비범으로 ]\n게리 클라인 지음| 김창준 옮김 | 알키 | 2015년 01월 15일 출간 \n\n저자 : 게리 클라인 (Gary Klein)\n40년 이상 인지과학 분야를 연구한 자연주의적 의사결정론의 창시자이며, 노벨상 수상자인 대니얼 카너먼Daniel Kahneman과 함께 의사결정이론의 양대 산맥으로 꼽힌다. 1969년 피츠버그 대학교에서 실험심리학으로 박사학위를 받은 후, 경력 초기엔 오클랜드, 윌버포스 대학교에서 교수로 근무했고, 경력 중기엔 미 공군의 연구 심리학자, 백악관 상황실 재설계의 주요 구성원 등 정부 일을 주로 했다. 1978년부터 2005년까지는 자신의 이름을 내건 클라인 어소시어츠Klein Associates라는 연구 개발 회사를 설립해, 인간이 실질적으로 어떻게 의사결정을 내리는지에 대한 모델을 연구했다. 현재 매크로코그니션MacroCognition LLC의 수석 과학자이며, 미국심리학회 선임연구원으로 활동하고 있다. 특히 인간공학 분야에 기여한 공로를 인정받아 ‘Jack A. Kraft’ 혁신가 상을 받았다. \n\n저술한 책으로는 《인튜이션Sources of Power: How People Make Decisions》, 《직관의 힘The Power of Intuition》, 《작업하는 정신Working Minds: A Practitioner’s Guide to Cognitive Task Analysis》(공저), 《이기는 결정의 제1원칙Streetlights and Shadows: Searching for the Keys to Adaptive Decision Making》 등이 있다. \n...\n\n40년 넘게 '사람이 어떻게 사고하는지'를 연구해온 인지과학자 게리 클라인(Gary Klein·71) 박사는 통찰(insight)이 빛났던 역사적 사례 120건을 연구하고 분석했다. 신문과 책, 인터뷰를 통해 수집한 과학적 발견, 발명, 경영의 사례다.\n\n그는 그런 통찰이 ''촉발''된 계기를 분석했다. 그것은 다섯 가지로 범주화할 수 있다. @@color(#04f): 연결, 우연의 일치, 호기심, 모순, 창의적 절망@@이 그것이다. 그리고 그 결과를 책 '통찰, 평범에서 비범으로'에 담았다.\n===
{{{\ntypedef struct _SHFILEOPSTRUCT { \n HWND hwnd; // 윈도우 핸들 \n UINT wFunc; // 실행하는 조작 \n LPCTSTR pFrom; // 대상 파일명 \n LPCTSTR pTo; // 목적 파일명 \n FILEOP_FLAGS fFlags; // 플래그 \n BOOL fAnyOperationsAborted; // 결과 \n LPVOID hNameMappings; // 파일명 매핑 오브젝트 \n LPCTSTR lpszProgressTitle; // 다이얼로그의 타이틀 \n} SHFILEOPSTRUCT, FAR *LPSHFILEOPSTRUCT;\n}}}\nwFunc는 실행하는 파일 조작을 나타내는 값을 지정한다.\n|FO_COPY |pFrom 파일을 pTo로 복사한다. |\n|FO_DELETE |pFrom 파일을 삭제한다. |\n|FO_MOVE |pForm 파일을 pTo로 이동한다. |\n|FO_RENAME |pFrom 파일을 pTo로 이름을 변경한다. 단 파일에 대해서만 사용할 수 있다. |\n\nfFlags는 파일 조작을 제어하는 옵션 플래그를 지정, 0 또는 이하의 값을 조합해 지정한다.\n|FOF_ALLOWUNDO |동작의 취소를 지원하는데 좀 더 구체적으로 얘기하자면 파일 삭제시 휴지통으로 보내 복원할 수 있게 한다.이 기능을 사용하려면 pFrom은 반드시 완전경로 이어야 한다. |\n|FOF_FILESONLY |와일드 카드식은 파일만을 대상으로 한다. |\n|FOF_MULTIDESTFILES |pTo는 여러 개의 목적 파일을 지정하며 각각은 순서대로 원본에 대응된다. |\n|FOF_NOCONFIRMATION |덮어 쓰거나 읽기 전용 파일 삭제 등의 동작에 대해 확인을 생략한다. 확인 대화상자에서 "모두"를 선택하는 것과 동일하다. |\n|FOF_NOCONFIRMMKDIR |새로운 디렉토리를 생성할 것인지를 묻지 않는다. 디렉토리 복사시 목적지에 없는 디렉토리가 자동으로 생성된다. |\n|FOF_NOERRORUI |동작에 실패하더라도 에러 메시지 박스를 띄우지 않는다. |\n|FOF_NORECURSION |지정한 디렉토리만 대상으로 하며 서브디렉토리는 작업 대상에서 제외한다. |\n|FOF_RENAMEONCOLLISION |복사, 이동, 이름 변경시 기존 파일과 이름이 충돌하면 새로운 이름을 작성한다. |\n|FOF_SILENT |프로그래서 대화상자를 표시하지 않는다. |\n|FOF_SIMPLEPROGRESS |프로그래스 대화상자를 표시하되 파일명은 표시하지 않는다. |\n\n*adverts0*(hellgate_adverts000).dat/ .idx를 특정 폴더에 copy하는 예\n{{{\nWCHAR szOldFile[MAX_PATH];\nWCHAR szNewFile[MAX_PATH];\n\nPStrPrintf(szOldFile, MAX_PATH, L"%sdata_dir_hellgate\s\spakfull_localized\s\s%s\s\s*adverts0*a",\n pBuildCopyInfo->szRemotePath, findData.cFileName);\nszOldFile[PStrLen(szOldFile)-1] = L'\s0';\n\nPStrPrintf(szNewFile, MAX_PATH, L"%s%s%d.%d.%d.%d\s\sdata\s\s%s\s\sa",\n szAppRootDirectory, szBuildDir,\n pBuildCopyInfo->version.dwVerTitle, pBuildCopyInfo->version.dwVerPUB,\n pBuildCopyInfo->version.dwVerRC, pBuildCopyInfo->version.dwVerML, findData.cFileName);\nszNewFile[PStrLen(szNewFile)-1] = L'\s0';\n\nASSERT_GOTO(CreateDirectoryIgnoreAlreadyExists(pBuildCopyInfo->hWndCopyDlg, szNewFile), _err);\n\nif (!sBuildCopySH(pBuildCopyInfo->hWndCopyDlg, szOldFile, szNewFile, TRUE)) {\n goto _err;\n}\n...\nbResult = TRUE;\n\n_err:\n...\n\nreturn bResult;\n\n//----------------------------------------------------------------------------\n//----------------------------------------------------------------------------\nstatic BOOL sBuildCopySH(\n HWND hWndParent,\n LPCWSTR szSrc,\n LPCWSTR szDir,\n BOOL bRecursive)\n{\n SHFILEOPSTRUCTW infoFileOp;\n INT32 iErr = 0;\n\n ASSERT_RETFALSE(hWndParent != NULL);\n\n structclear(infoFileOp);\n infoFileOp.hwnd = hWndParent;\n infoFileOp.wFunc = FO_COPY;\n infoFileOp.pFrom = szSrc;\n infoFileOp.pTo = szDir;\n infoFileOp.fFlags = FOF_NOCONFIRMMKDIR | (bRecursive ? 0 : FOF_NORECURSION);\n infoFileOp.fAnyOperationsAborted = FALSE;\n infoFileOp.hNameMappings = NULL;\n infoFileOp.lpszProgressTitle = NULL;\n\n iErr = SHFileOperationW(&infoFileOp);\n if (iErr != 0 || infoFileOp.fAnyOperationsAborted) {\n return FALSE;\n }\n return TRUE;\n}\n}}}\n
한자성어(漢字成語) 혹은 고사성어(故事成語)는 주로 중국의 고사에서 유래하여 비유적인 내용을 담은 함축된 글자로 상황, 감정, 사람의 심리 등을 묘사한 말이다. 주로 4글자로 된 것이 많기때문에 사자성어(四字成語)라 일컬키도 한다. 일상생활이나 글에 많이 사용된다.\n \n한국어권에서 쓰인 속담이 한자성어로도 쓰이는 경우도 있는데, 그 예로 ‘제 논에 물 대기’가 아전인수(我田引水)로 쓰이는 것이 있다.\n\n@@color(#0044ff): ▣ 귤화위지 @@ (橘化爲枳) ; 회남의 귤을 회북에 심으면 탱자가 된다는 귤화위지는 제 아무리 좋은 사람이나 물건도 환경이 바뀌면 변한다는 의미를 담고 있다.\n\n@@color(#0044ff): ▣ 유항심 유항산 @@ (有恒心 有恒産) ; 마음이 있는 곳에 결과가 있다.\n\n@@color(#0044ff): ▣ 民之爲道也, 有恒産者有恒心, 無恒産者無恒心. @@ ; 민지위도야, 유항산자유항심, 무항산자무항심.\n''맹자, 등문공 상 (滕文公·上) 3''\n백성들이 살아가는 방법을 보자. 생업이 있으면 변치 않는 마음이 있지만, 생업이 없으면 변치 않는 마음이 있을 수 없다.\n\n@@color(#0044ff): ▣ Momento Mori @@ ; 고대 로마에서 사용되던 라틴어로 '죽음을 기억하라'는 뜻.
한국어 팩을 적용했으나 인터넷이나 프로그램 사용시 한글이 깨지는 경우이고\n일반 웹페이지 나 프로그램, 결재나 공인인증서 로그인 할때도 언어가 깨져서 표시된다.\n\n1.시작(윈도우 버튼) - 설정 \n / 시간 및 언어 선택\n2.시간 및 언어\n / 지역 및 언어\n / 관련 설정 ; 추가 날짜, 시간 및 지역 설정\n3.국가 또는 지역\n / 관리자 옵션\n / 시스템 로컬 변경 ; 유니코드를 지원하지 않는 프로그램용 언어이 설정 (시스템 로컬)은 유니코드를 지원하지 않는 프로그램에서 텍스트를 표시할때 사용되는 언어를 제어합니다. \n ⇒ 원하는 국가 설정\n\n한국 프로그램 또는 웹사이트를 많이 사용한다면 한국으로 설정\n미국 프로그램 또는 웹사이트를 많이 사용한다면 영어(미국)으로 설정해서 사용한다.\n\n대부분 웹은 한국어 적용하면 한국어로 전환되어 보이지만 프로그램의 경우는 이곳의 설정을 바꿔줘야만 원하는 언어로 표시된다.\n\ncf. Windows7에서도 같은 현상 발생
https://pikabu.tistory.com/48 - [ 웹툴 ] 복사방지 금지되어 있는 글 복사 방법 html 태그 제거 소스 지우기 문자 텍스트 추출\n\n!! Org Chart (Organisational Chart)\n* CSS, 트리 뷰(tree view) 제작하기 - 사악미소의 현대마법의 공방\n** https://wickedmagic.tistory.com/561\n** https://wickedmagic.tistory.com/562 - 폰텔로(http://fontello.com/) 사이트에서 필요한 아이콘을 받아서 설치\n* jQuery OrgChart\n** 사용법 ; https://www.jquerycards.com/uncategorised/orgchart/\n** Demo ; https://rawgit.com/dabeng/OrgChart/master/demo/index.html\n** 한글 ; https://s00741.tistory.com/m/137 - 차트 OrgChart 웹차트 jquery차트 제이쿼리 차트 조직도\n* GoJS JavaScript Library\n** https://gojs.net/latest/samples/orgChartEditor.html\n* JSON List데이터를 트리구조로 변환\n** http://gjjoo.github.io/portfolio/Plugin/zooTree/index.html\n* 기타\n** http://jsfiddle.net/hp5ksgfh/6/embedded/result,css,html,js - css org chart - JSFiddle\n** https://www.edrawsoft.com/share-orgchart.php - Free Org Chart Templates\n** https://developers.google.com/chart/interactive/docs/gallery/orgchart - Google Charts, Organization Chart\n
@@color(#04f): ▣ DC @@(Device Context) ; 출력을 위한 모든 데이터를 가지는 구조체\nDC는 현재 상황에서 어떤 영역이 출력 허가된 영역인가를 계산하여 허가된 영역에만 출력을 내보낸다.\n\n◾ ''HDC''는 DC를 제어하는 핸들로, 시스템 리소스(Bitmap, DC, .... 등등)들은 외부에서 직접적으로 제어가 불가능 하기 때문에, HANDLE이라는 개념을 사용해서 리소스를 제어한다.\n\n◾ ''CDC''는 MFC에서 출력과 관련된 다양한 정보를 제공해주는 디바이스 컨텍스트(DC)를 관리하기 위한 클래스이다.\n\n\n\n
출처 ; http://cagetu.egloos.com/3253793\n{{{\n// 텍스쳐 LOD(Mipmap Detail 설정)\nfloat fLODBias = -3.0f;\npDevice->SetSamplerState( 0, D3DSAMP_MAXMIPLEVEL, 0 ); \npDevice->SetSamplerState( 0, D3DSAMP_MIPMAPLODBIAS, *((LPDWORD)(&fLODBias)) );\n}}}\n값이 너무 높으면, 안티알리아싱 때문에 지글거리니까, 주의! \n\n
<html> <a name="#Page190426"> </a> </html>\n<html>\n<a href="#Page190426_07"> #. VC++ 에서 프로젝트 기본값 설정 </a> <br>\n<a href="#Page190426_01"> #. 한글 판별 코드 (세부적으로 판별) </a> <br>\n<a href="#Page190426_02"> #. 한글 여부 판단 </a> <br>\n<a href="#Page190426_03"> #. 문자열 Wrapping </a> <br>\n<a href="#Page190426_04"> #. 폰트 정의 </a> <br>\n<a href="#Page190426_05"> #. Filtering </a> <br>\n<a href="#Page190426_06"> #. 입력문자 확인 함수 </a> <br>\n</html>\n참고 ; \n http://dolphin.ivyro.net/file/directx_tip/CreateDiBSection한글처리.html - CreateDIBSection를 이용한 한글 처리 루틴 \n http://foreblog.tistory.com/764 \n http://soen.kr/ - SoEn:소프트웨어 공학 연구소 > 프로젝트 > 당근 1.0 > 가변폭 폰트 지원\n일반 글꼴 정보 : \n ◾ Font 정보 (그림으로 정의 설명) : https://iwoohaha.tistory.com/53\n ◾ LOGFONT, TEXTMETRIC structure 설명 : http://yhyacinth.github.io/general/2015/05/22/text-draw.html - 프로그램의 텍스트 출력 방법들\n\n\n<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 14px;"> <b> IsDBCSLeadByte 함수를 사용하지 않고 최상위 비트가 1인지 비교 </b> </span> \n</html>\nTCHAR *buf;\n\ninline BOOL IsDBCS(int nPos)\n{\n return ((buf[nPos] & 0x80) != 0/*IsDBCSLeadByte(buf[nPos])*/ \n || (buf[nPos]==‘\sr’ && buf[nPos+1]==‘\sn’));\n}\n\n<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 14px;"> <b> bool IsDBCSLeadByte( BYTE ); </b> </span> \n</html>\n / 글자가 2바이트 문자인지 조사하는때 쓰는 함수 \n / 싱글바이트로 들어가서 순수 한글을 판단하는건 불가능함. (cf.코드페이지에 해당하는 전각 문자열 범위로 판단)\n\nchar buf[3] = "공";\nIsDBCSLeadByte(buf[0]); - 결과 : true\nIsDBCSLeadByte(buf[1]); - 결과 : true \n\ncf. 문자의 두번째바이트도 true\n\n\n<html> <html> <a name="Page190426_07"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page190426"> <span style="font-size: 14px;"> #. VC++ 에서 프로젝트 기본값 설정 예 </span> </a>\n</div> </html>\nVC++ 에서 프로젝트 기본값 -> 문자 집합을 ''멀티바이트로 설정''\n ◾ 다국어 처리 ; (from 서버) 멀티바이트 입력 ⇒ (클라이언트) 유니코드 처리 ⇒ (to 서버) 멀티바이트 출력\n ◾ 유니코드는 모든 문자에 대해 동일한 코드체계로 구성\n 멀티바이트는 글자 하나가 2, 3, 4, 5, 6 다양하게 구성되기 때문에 필터링, 문자열 가공 등이 어려움\n\n윈도우즈에서는 문자를 처리하기 위하여 다음과 같은 세가지 인코딩 방식을 사용한다.\n - SBCS(Single-Byte Character Set) : 단일 바이트 문자 집합\n - MBCS(Multi-Byte Character Set) : 다중 바이트 문자 집합\n - UNICODE(Wild Character Set) : 유니코드\n\nassert(strlen("한글abc") == 7); // 7 bytes - ANSI 코드를 위한 함수\nassert(_mbslen("한글abc") == 5); // 7 bytes\nassert(wcslen(L"한글abc") == 5); // 10 bytes - 유니코드\n\nstrlen( ... ); SBCS용으로 바이트 수와 같은 문자열을 싱글바이트 문자열로 해석\n_mbslen( ... ); MBCS용으로 문자열의 문자수를 리턴 (∵ mbstring.h)\n_mbstrlen(... ); 멀티 바이트 문자, 문자열의 바이트 수를 반환\nwcslen( ... ); 유니코드용으로 문자 개수를 계산\n{{{\nstatic int CountListText = LIST_TEXT01;\n\nWCHAR * lpszStr; \nUINT lenStr = 0;\n\n//-----------------------------------------------------------------------------\n// 멀티바이트 (CHAR * lpChar;) \n// --> 유니코드 변환 데이터 가공(WCHAR * lpDumyStr;) --> 유니코드(WCHAR * lpszStr;)\n//-----------------------------------------------------------------------------\nCHAR * lpChar;\n\nCHAR * lpText00 = "0: asFF.고";\nCHAR * lpText01 = "1: 퇴근전 커밋!..asFF.고가 abc나다라마바사 1234567890";\nCHAR * lpText02 = "2: 돋움, 24!..asFF.고고씽 abcd.\sn가나다라마바사";\n \nCHAR * ip;\n\nswitch (CountListText)\n{\ncase LIST_TEXT01:\n ip = &(*lpText01);\n break;\n\ncase LIST_TEXT02:\n ip = &(*lpText02);\n break;\n\ncase LIST_TEXT00:\ndefault:\n ip = &(*lpText00);\n break;\n}\n\nlenStr = strlen(ip) + 1;\nlpChar = new CHAR[lenStr]{ 0, };\nstrcpy_s(lpChar, lenStr, ip);\n\n//-----------------------------------------------------------------------------\nint nLen = MultiByteToWideChar(CP_ACP, 0, lpChar, strlen(lpChar), NULL, NULL);\n\nWCHAR * lpDumyStr; // 유니코드로 변환된 문자열을 임시로 받음\nlpDumyStr = new WCHAR[nLen]{ 0, };\nMultiByteToWideChar(CP_ACP, NULL, lpChar, strlen(lpChar), lpDumyStr, nLen);\n\nlpszStr = new WCHAR[nLen+1]{ 0, }; // 필요한 경우, 임시로 받은 문자열에서 필요한 길이만큼 가공\nwcsncpy_s(lpszStr, nLen+1, lpDumyStr, nLen);\n\n// lenStr = wcslen(lpszStr); // 확인 부분\n\ndelete[] lpszStr;\ndelete[] lpDumyStr;\n}}}\n\n<html> <html> <a name="Page190426_01"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page190426"> <span style="font-size: 14px;"> #. 한글 판별 코드 (세부적으로 판별) </span> </a>\n</div> </html>\n{{{\n//==============================================================================\n// IsHangulString\n// Present by FORE\n// 출처 ; http://foreblog.tistory.com/764 \n//------------------------------------------------------------------------------\n\n#include <windows.h>\n\n//------------------------------------------------------------------------------\n//------------------------------------------------------------------------------\nBOOL WINAPI IsHangulStringA(LPSTR lpString)\n{\n BYTE ch1,ch2;\n while(*lpString)\n {\n ch1 = (BYTE)*lpString;\n if ( ch1 & 0x80 )\n {\n ch2 = (BYTE)*(lpString+1);\n if ( (ch1>0x80 && ch1<=0xA0) || (ch1>=0xB0 && ch1<=0xC5) )\n {\n if ( (ch2>0x40 && ch2<0x5B) || (ch2>0x60 && ch2<0x7B) || (ch2>0x80 && ch2<0xFF) )\n return TRUE;\n }\n else if ( ch1>0xA0 && ch1<0xB0 )\n {\n if ( (ch2>0x40 && ch2<0x5B) || (ch2>0x60 && ch2<0x7B) || (ch2>0x80 && ch2<0xA1) )\n return TRUE;\n if ( ch1 == 0xA4 ) // 여기가 자모 코드. 자모 판별 필요 없을시 제거 가능.\n { \n if ( ch2>0xA0 && ch2<0xFF )\n return TRUE;\n }\n }\n else if ( ch1 == 0xC6 )\n {\n if ( (ch2>0x40 && ch2<0x53 ) || (ch2>0xA0 && ch2<0xFF) )\n return TRUE;\n }\n else if ( ch1 > 0xC6 && ch1 < 0xC9 )\n {\n if ( ch2>0xA0 && ch2<0xFF )\n return TRUE;\n }\n lpString++;\n }\n lpString++;\n }\n return FALSE;\n}\n\n//------------------------------------------------------------------------------\n//------------------------------------------------------------------------------\nBOOL WINAPI IsHangulStringW(LPWSTR lpString)\n{\n WCHAR ch1;\n while(*lpString)\n {\n ch1 = *lpString;\n if ( (ch1 >= 0xAC00 && ch1 <=0xD7A3)\n || (ch1 >= 0xA960 && ch1 <=0xA97C) // 이 밑부터 죄다 자모 코드\n || (ch1 >= 0xD7B0 && ch1 <=0xD7C6)\n || (ch1 >= 0xD7CB && ch1 <=0xD7FB)\n || (ch1 >= 0x3131 && ch1 <=0x318E) )\n return TRUE;\n\n lpString++;\n }\n return FALSE;\n}\n}}}\n\n\n<html> <html> <a name="Page190426_02"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page190426"> <span style="font-size: 14px;"> #. 한글 여부 판단 </span> </a>\n</div> </html>\nANSI 코드에서 0x80으로 비교 분삭할 경우, 문제는 한글외 전각문자 예를 들면 ★, あ와 같은 것들도 한글로 처리.\n\nDBCS 코드는 첫번째 바이트의 영역에 따라 문자가 한 바이트 코드인지 두 바이트 코드인지를 결정한다. 보통은 0x80보다 크면 두 바이트로 문자를 처리한다. 따라서 문자열을 다룰 때 현재 위치의 바이트만을 보고는 이 글자가 두 바이트로 표현된 문자의 첫째 바이트인지, 둘째 바이트인지 알 수 없다. \n{{{\nint main(void)\n{\n printf("Hello Workd \sn");\n\n int id = 100;\n char sString[512];\n PStrPrintf(sString, 512, "SELECT userid = '%d' \sn", id);\n printf(sString);\n\n WCHAR szString[512];\n PStrPrintf(szString, 512, L"test_______! \sn");\n wprintf(szString);\n\n char str[512];\n scanf("%s", str);\n\n for (int i= 0; i < 512; i++)\n {\n \n if (str[i] == '\s0')\n break;\n\n if (str[i] < 0xAC00 || str[i] > 0xD7A3)\n {\n printf("%c", str[i]);\n }\n else\n {\n printf("%c%c", str[i], str[i + 1]);\n i++;\n }\n/*\n if ( (str[i] & 0x80) != 0 ) // 한글\n {\n printf("%c%c", str[i], str[i + 1]);\n i ++ ;\n }\n else // (text[0] & 0x80) == 0 // 한글아님\n {\n printf("%c", str[i]); \n }\n*/\n }\n \n return 0;\n}\n}}}\n\n\n\n<html> <html> <a name="Page190426_03"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page190426"> <span style="font-size: 14px;"> #. 문자열 Wrapping </span> </a>\n</div> </html>\nint PStrPrintf(\n char * str, int buf_len, const char * format, ... );\n\nint PStrPrintf(\n WCHAR * str, int buf_len, const WCHAR * format, ... );\n{{{\n//=============================================================================\n/* _TRUNCATE */\n#if !defined(_TRUNCATE)\n#define _TRUNCATE ((size_t)-1)\n#endif\n\n#define USE_VS2005_STRING_FUNCTIONS 1\n\n//-----------------------------------------------------------------------------\nint PStrPrintf(\n char * str, int buf_len, const char * format, ... )\n{\n va_list args;\n va_start(args, format);\n\n#ifdef USE_VS2005_STRING_FUNCTIONS\n return _vsnprintf_s(str, buf_len, _TRUNCATE, format, args);\n#else\n return _vsnprintf(str, buf_len, format, args);\n#endif\n}\n\n//-----------------------------------------------------------------------------\nint PStrPrintf(\n WCHAR * str,\n int buf_len,\n const WCHAR * format,\n ...)\n{\n va_list args;\n va_start(args, format);\n\n#ifdef USE_VS2005_STRING_FUNCTIONS\n return _vsnwprintf_s(str, buf_len, _TRUNCATE, format, args);\n#else\n return _vsnwprintf(str, buf_len, format, args);\n#endif\n}\n\n//-----------------------------------------------------------------------------\n#define MAX_WORD 512\n\nchar szQuery[512];\nPStrPrintf(szQuery, MAX_WORD, "SELECT userid FROM profiles WHERE login_name = '%s'", szEmail);\n}}}\n\n\n<html> <html> <a name="Page190426_04"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page190426"> <span style="font-size: 14px;"> #. 폰트 정의 </span> </a>\n</div> </html>\n''LOGFONT'' structure ; 논리적 폰트 정의\n''TEXTMETRIC'' structure ; TEXTMETRIC은 물리적 폰트 정보를 정의\n\n<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 14px;"> <b> BOOL GetCharABCWidthsW </b> ( HDC hdc, UINT wFirst, UINT wLast, LPABC lpABC); </span> \n</html>\n\n@@color(#C7254E): ''GetTextExtentPoint32W()는 문자의 baseline 너비를 알려주는 함수'' @@ 이기 때문에 \nGetTextExtentPoint32W()로는 Italic font로 쓰여진 문자의 정확한 너비를 구할 수 없다. \ncf.국가별 문자열 표시에 정상적으로 표시되는지 주의 !\n\nBaseline의 너비는 다음 문자를 positioning하기 위해서는 꼭 필요한 값이지만(offset),\nglyph를 rendering하기 위해 필요한 rect의 너비(width)를 계산하기에는 조금 부족하다. \n이탤릭체의 경우, baseline의 너비가 차지하는 공간보다 더 오른쪽으로 글자가 튀어나오기 때문..\n\nconst WCHAR *wcCurrent;\nABC abc;\n...\nGetCharABCWidthsW(hdc, *wcCurrent, *wcCurrent, &abc);\nint nFullWidth = ABS(abc.abcA) + abc.abcB + (abc.abcC > 0 ? abc.abcC : 0);\n\n@@bgcolor(#FAE3EE): ''※ GetCharABCWidthsW(...); 함수는 유니코드와 멀티바이트인 경우, 리턴 값이 다름'' (cf. 개발 환경에 영향을 받을 수 있다.) @@\n\n멀티 바이트는 if ((cCurrent[nCounter] & 0x80) != 0) 로 2개의 바이트로 구성된 문자열을 판단\n\nif ((cCurrent[nCounter] & 0x80) != 0) // 한글\n 2개의 바이트로 묶어서 GetCharABCWidthsW(hDc, *wcCurrent, *wcCurrent, &abc);\nelse\n 1개의 바이트 GetCharABCWidthsA(hDc, *wcCurrent, *wcCurrent, &abc);\n\n⇒ 결과적으로 GetCharABCWidthsW(...);의 리턴 값이 유티코드 > 멀티바이트 (?) \n 멀티 바이트의 경우, DrawTextA(g_hDC, nW, -1, &rt, DT_CALCRECT);를 사용\n\n\n<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 14px;"> <b> BOOL GetTextMetrics </b> ( HDC hdc, LPTEXTMETRIC lptm ); </span> \n</html>\n; GetTextMetrics 함수를 사용하여 원하는 글자체의 높이와 넓이를 구할 수 있다.\n{{{\n//-----------------------------------------------------------------------------\n// Name: GetSize( ... )\n//-----------------------------------------------------------------------------\nBOOL GetSize(HDC hDc, WCHAR * Str, int LenStr, SIZE &outSize)\n{\n// GetTextExtentPoint32W(hDc, Str, LenStr, &outSize);\n\n ABC abc;\n const WCHAR *wcCurrent = Str;\n WCHAR str[2] = { L'\s0', L'\s0' };\n int nFullWidth = 0.0f;\n int nWidth = 0.0f;\n\n while (wcCurrent && *wcCurrent)\n {\n str[0] = *wcCurrent;\n GetCharABCWidthsW(hDc, *str, *str, &abc);\n // nWidth = ABS(abc.abcA) + abc.abcB + (abc.abcC > 0 ? abc.abcC : 0);\n nWidth = ABS(abc.abcA) + abc.abcB + abc.abcC ; \n\n wcCurrent++;\n nFullWidth = nFullWidth + nWidth;\n }\n\n\n TEXTMETRIC tm; // 물리적 폰트 정보\n GetTextMetrics(hDc, &tm);;\n\n int nFontheight = MAX(tm.tmHeight, tm.tmAscent + tm.tmDescent);\n \n outSize.cx = nFullWidth;\n outSize.cy = nFontheight;\n\n return S_OK;\n}\n}}}\n| typedef|struct tagTEXTMETRIC { | |\n| LONG|tmHeight; |문자의 높이.( = tmAscent + tmDescent ) |\n| LONG|tmAscent; |기준 선의 윗쪽 높이 |\n| LONG|tmDescent; |기준 선의 아래쪽 높이 |\n| LONG|tmInternalLeading; |tmHeight 안쪽의 여백 공간. 이 부분은 여백이며 실제 폰트가 그려지는 부분이 아니므로 문자열 출력에 의해 변경되지 않는 영역이다. 폰트 디자이너는 이 값을 0으로 설정해야 한다. |\n| LONG|tmExternalLeading; |tmHeight에는 포함되지 않는 여백. 문자열간의 줄간을 띄울 때 사용하는 부분. 실제 폰트가 그려지는 부분이 아니므로 문자열 출력에 의해 변경되지 않는다. |\n|>|>|...|\n|>|>|} TEXTMETRIC, *PTEXTMETRIC; |\ncf.한 줄을 찍을 때 필요 높이 = tmAscent + tmDescent + tmExternalLeading (마지막 줄 다음의 공백)\n\n\n<html> <html> <a name="Page190426_05"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page190426"> <span style="font-size: 14px;"> #. Filtering </a>\n</div> </html>\n{{{\nBOOL PStrIsPrintable( WCHAR c )\n{\n if (c == 0xFFFE || c == 0xFFFF)\n return FALSE;\n\n if (c == 0x2122) //trademark symbol\n return TRUE;\n\n if (c == 0x30fc || c == 0x3005) //important Japanese characters\n return TRUE;\n\n if (c == 0x2190 || c == 0x2191 || c == 0x2192 || c == 0x2193)\n return TRUE;\n\n\n switch (AppGetNation())\n {\n case APP_NATION_USA:\n {\n if (!isascii(c))\n return FALSE;\n\n return TRUE;\n }\n break;\n case APP_NATION_JAPAN:\n {\n return TRUE;\n }\n }\n\n return _iswprint_l(c, LanguageGetLocale());\n}\n}}}\n\n참고. int _iswprint_l( wint_t _C, _locale_t _Locale);\n{{{\n//----------------------------------------------------------------------------\n//----------------------------------------------------------------------------\nstruct LANGUAGE_GLOBALS\n{\n LANGUAGE eLanguage; // the current language\n _locale_t nLocale; // the current locale\n};\n\n//----------------------------------------------------------------------------\nstatic LANGUAGE_GLOBALS sgtLanguageGlobals;\n\n//----------------------------------------------------------------------------\nstatic void sLanguageGlobalsInit( \n LANGUAGE_GLOBALS *pGlobals)\n{\n pGlobals->eLanguage = LANGUAGE_ENGLISH; // default language is the first row in this table\n pGlobals->nLocale = _get_current_locale();\n} \n\n//----------------------------------------------------------------------------\nstatic LANGUAGE_GLOBALS *sLanguageGlobalsGet(\n void)\n{\n return &sgtLanguageGlobals;\n}\n\n//----------------------------------------------------------------------------\n_locale_t LanguageGetLocale(\n void)\n{\n LANGUAGE_GLOBALS *pGlobals = sLanguageGlobalsGet();\n return pGlobals->nLocale;\n} \n\n\n//----------------------------------------------------------------------------\nvoid LanguageSetCurrent(\n APP_GAME eAppGame,\n LANGUAGE eLanguage)\n{\n ASSERTX_RETURN( eLanguage != LANGUAGE_INVALID, "Invalid language" );\n \n // set the new language\n LANGUAGE_GLOBALS *pGlobals = sLanguageGlobalsGet();\n pGlobals->eLanguage = eLanguage;\n\n const LANGUAGE_DATA *pLanguageData = LanguageGetData( eAppGame, eLanguage );\n ASSERTX_RETURN( pLanguageData, "Language data not found" );\n if (pLanguageData->szLocaleString && pLanguageData->szLocaleString[0])\n {\n pGlobals->nLocale = _create_locale(LC_ALL, pLanguageData->szLocaleString);\n }\n\n // debug print \n TraceDebugOnly("Language set to '%s'\sn", LanguageGetCurrentName());\n}\n}}}\nenum LANGUAGE\n{\n LANGUAGE_ENGLISH = 0,\n LANGUAGE_KOREAN = 1,\n ...\n LANGUAGE_NUM_LANGUAGES ∬ keep this last please\n};\n\nLANGUAGE LANGUAGE_DATA::eLanguage; ∬ the language enum reference\nchar LANGUAGE_DATA::szLocaleString[64]; ∬ locale string for windows setlocale\n\nLANGUAGE_ENGLISH 일 때, "English"\nLANGUAGE_KOREAN 일 때, "Korean" 으로 설정\n\n\n<html> <html> <a name="Page190426_06"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page190426"> <span style="font-size: 14px;"> #. 입력문자 확인 함수 </a>\n</div> </html>\n헤더 ; <ctype.h>이나 <cctype>\n|int isalnum( int c ); |알파벳 문자이거나 숫자 일 때 true | |\n|int isalpha( int c ); |알파벳 문자 일 때 true |영문 대문자 = 1, 소문자 = 2 를 리턴 |\n|int isupper( int c ); |알파벳 대문자 일 때 true | |\n|int islower( int c ); |알파벳 소문자 일 때 true | |\n|int isdigit( int c ); |숫자 일 때 true | |\n|int isxdigit( int c ); |16진 숫자(0 - 9, a - f 또는 A - F) 문자 일 때 true | |\n|int ispunct( int c ); |구두점(알파벳과 숫자를 제외한 인쇄가능한) 문자 일 때 true | |\n|int isspace( int c ); |표준 화이트스페이스(0x09 - 0x0D or 0x20) 문자 일 때 true |' ' space, '\sf' form feed, '\sn' new line, '\sr' carriage return, '\st' tab, '\sv' vertical tab |\n|int isprint( int c ); |빈칸을 포함하여 인쇄할 수 있는(0x20 - 0x7E) 문자 일 때 true |공백 문자 = 64 |\n|int isgraph( int c ); |빈칸이 아닌 인쇄할 수 있는 문자 일 때 true |영문 대문자 = 1, 소문자 = 2, 숫자 = 4, 그외 문자 = 16 |\n|int iscntrl( int c ); |제어(0x00 - 0x1F or 0x7F) 문자 일 때 true |제어 문자 = 32 (스페이스를 제외한 공백문자) |\n|int isblank(int c) |스페이스와 탭 문자 일 때 true | |\n{{{\nint __iscsym( int c ); |숫자와 알파벳 그리고 언더바('_') 문자 일 때 true\nint __iscsymf( int c ); |알파벳과 언더바('_') 문자 일 때 true \nint __isascii( int c ); |ACSII (0x00 - 0x7F)문자 일 때 true (cf.7비트 ASCII 코드)\ntoascii(char c): |문자를 아스키 코드 값으로 변경\ntolower(char c): |c를 소문자로 변환\ntoupper(char c): |c를 대문자로 변환\n}}}\n\n
<button name="button dialog ok">\n <texture>inventory_atlas</texture> \n <rendersection>DynamicBottom</rendersection> ; 설정 형식\n ...\n</button>\n\n<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 16px;"> <b> Rendering 구분 </b> </span>\n</html>\n{{{\n//ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ\n//ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ\nstruct STR_DICT\n{\n const char * str;\n int value;\n};\n\n//ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ\nSTR_DICT pRenderSectionEnumTbl[] =\n{\n { "World", RENDERSECTION_WORLD},\n { "", RENDERSECTION_BOTTOM},\n { "Bottom", RENDERSECTION_BOTTOM},\n { "DynamicBottom", RENDERSECTION_DYNAMIC_BOTTOM},\n { "Masks", RENDERSECTION_MASKS},\n { "MaskedModels", RENDERSECTION_MASKEDMODELS},\n { "Models", RENDERSECTION_MODELS},\n { "ItemText", RENDERSECTION_ITEMTEXT},\n { "Tooltips", RENDERSECTION_TOOLTIPS},\n { "Menus", RENDERSECTION_MENUS},\n { "Dialogs", RENDERSECTION_MENU_DIALOG},\n { "DialogMasks", RENDERSECTION_DIALOG_MASKS},\n { "DialogMaskedModels", RENDERSECTION_DIALOG_MASKEDMODELS},\n { "DialogModelOverlay", RENDERSECTION_DIALOG_MODELS_OVERLAY},\n { "LoadingScreen", RENDERSECTION_LOADING_SCREEN},\n { "DialogTop", RENDERSECTION_DIALOG_TOP},\n { "CursorContents", RENDERSECTION_CURSOR_CONTENTS},\n { "Cursor", RENDERSECTION_CURSOR},\n { "Debug", RENDERSECTION_DEBUG},\n\n { NULL, RENDERSECTION_BOTTOM },\n};\n}}}\nDWORD g_dwRenderState[NUM_RENDER_SECTIONS];\n\n<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 16px;"> <b> Rendering 여부 </b> </span>\n</html>\n{{{\n//----------------------------------------------------------------------------\n// Constants\n//----------------------------------------------------------------------------\n#define UIRS_NEED_UPDATE MAKE_MASK(0)\n#define UIRS_NEED_RENDER MAKE_MASK(1)\n\n//----------------------------------------------------------------------------\ninline void UISetNeedToRender( int nRenderSection )\n{\n g_dwRenderState[nRenderSection] |= UIRS_NEED_UPDATE; \n}\n\n//----------------------------------------------------------------------------\ninline void UIClearNeedToRender(int nRenderSection )\n{\n g_dwRenderState[nRenderSection] &= ~UIRS_NEED_RENDER;\n}\n\n//==============================================================================\nvoid UISetNeedToRenderAll( void )\n{\n for (int i=0; i < NUM_RENDER_SECTIONS; i++)\n {\n UISetNeedToRender(i);\n }\n}\n\n//----------------------------------------------------------------------------\nvoid UISetNeedToRender( UI_COMPONENT *component )\n{\n UISetNeedToRender(component->m_nRenderSection);\n\n UI_COMPONENT* child = component->m_pFirstChild;\n while (child)\n {\n UISetNeedToRender(child);\n child = child->m_pNextSibling;\n }\n}\n\n//==============================================================================\nvoid UIRepaint( void )\n{\n g_UI.m_bFullRepaintRequested = TRUE; // BOOL UI::m_bFullRepaintRequested;\n}\n\n\n//----------------------------------------------------------------------------\nvoid UIRefreshText( void )\n{\n UIComponentHandleUIMessage( g_UI.m_Components, UIMSG_REFRESH_TEXT_KEY, 0, 0 );\n UIRepaint();\n}\n}}}\n\nBOOL UI::m_bFullRepaintRequested; 처리는 \nvoid ''UIProcess''(void)\n{\n ...\n if (g_UI.m_bFullRepaintRequested)\n {\n UIComponentHandleUIMessage( g_UI.m_Components, UIMSG_PAINT, 0, 0 );\n UIComponentHandleUIMessage( g_UI.m_Cursor, UIMSG_PAINT, 0, 0 );\n g_UI.m_bFullRepaintRequested = FALSE;\n g_UI.m_bNeedItemWindowRepaint = FALSE; ∬ we've painted everything, can't possibly need the smaller subset of item ui pieces\n }\n ...\n if (!g_UI.m_bFullRepaintRequested)\n {\n 개별 UI_COMPONENT 별로 활성화 여부를 확인\n ⇒ 활성화된 경우, UIComponentHandleUIMessage( g_UI.m_Components, UIMSG_PAINT, 0, 0 ); 호출\n }\n}\n\n\n\n\n
<html>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<span style="font-size: 14px;"> #. 더블 버퍼링 (WinAPI) </span>\n</div> </html>\n출처 ; https://jhedde.tistory.com/entry/7-더블-버퍼링\n\n-.화면에 바로 출력할 경우, 계산 등의 이유로 깜박거림을 개선할 목적으로 사용\n 보이지 않는 화면을 하나 더 만들어서 미리 그린 후, 그린 이미지를 화면에 출력\n\n-.과정\n1.메모리 DC를 만든다.\n2.메모리 비트맵을 만든다.\n3.메모리 비트맵을 DC에 적용시킨다.(SelectObject)\n4.적용시킨 DC에 그림을 그린다.\n5.메모리 DC에 있는 데이터를 화면 DC로 복사한다.\n6.메모리 비트맵과 메모리 DC를 삭제한다.\n{{{\n#pragma comment(lib, "msimg32.lib")\n\nvoid drawByDC( HWND hWnd, HDC hdc );\n\n//=============================================================================\n//-----------------------------------------------------------------------------\nvoid drawByDBuffering( HWND hWnd, HDC hdc )\n{\n RECT windowRect;\n GetClientRect( hWnd, &windowRect );\n\n // 메모리 DC와 BITMAP 생성\n // HDC hdc = GetDC(hWnd);\n HDC hMemDC;\n HBITMAP bitmap;\n \n // 메모리 DC 및 BitMap과 현재 DC의 설정 일치\n hMemDC = CreateCompatibleDC( hdc );\n bitmap = CreateCompatibleBitmap( hdc, windowRect.right, windowRect.bottom );\n \n // 메모리 비트맵을 DC에 적용\n SelectObject( hMemDC, bitmap );\n\n // 메모리 DC에 출력\n HBRUSH br = CreateSolidBrush(RGB(20, 20, 100)); // 배경색 \n FillRect( hMemDC, &windowRect, br ); // (HBRUSH)COLOR_WINDOWFRAME\n \n drawByDC( hWnd, hMemDC );\n\n // 메모리 DC를 현재 DC에 복사\n TransparentBlt( hdc, 0, 0, windowRect.right, windowRect.bottom,\n hMemDC, 0, 0, windowRect.right, windowRect.bottom, RGB( 255, 0, 255 ) );\n\n // 사용된 메모리 DC 및 HBITMAP을 삭제\n DeleteObject( bitmap );\n DeleteDC( hMemDC );\n}\n \n//-----------------------------------------------------------------------------\n//-----------------------------------------------------------------------------\nvoid drawByDC( HWND hWnd, HDC hdc )\n{\n // 그릴 코드를 구현.\n}\n}}}\n\n<html>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<span style="font-size: 14px;"> #. 더블 버퍼링 (MFC) </span>\n</div> </html>\n출처 ; https://myblue0324.tistory.com/27 - ''메모리DC를 이용한 더블 버퍼링''\n{{{\nvoid CXXXDlg::OnPaint()\n{\n CPaintDC dc(this); // device context for painting\n // TODO: 여기에 메시지 처리기 코드를 추가합니다.\n // 그리기 메시지에 대해서는 CWnd::OnPaint()을(를) 호출하지 마십시오.\n\n // ***************************************************** //\n // 더블 버퍼링 처리.\n // ***************************************************** //\n CDC* pDC = GetDC();\n\n CRect rect;\n GetClientRect(rect);\n\n // 메모리 DC와 BITMAP 생성.\n CDC MemDC;\n CBitmap* pOldBitmap;\n CBitmap bmp;\n\n // 메모리 DC 및 BITMAP과 현재 DC의 설정 일치.\n MemDC.CreateCompatibleDC(pDC);\n bmp.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());\n pOldBitmap = (CBitmap*)MemDC.SelectObject(&bmp);\n MemDC.PatBlt(0, 0, rect.Width(), rect.Height(), WHITENESS);\n\n // 메모리 DC에 그리기.\n DrawImage(&MemDC);\n\n // 메모리 DC를 현재 DC에 복사.\n pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &MemDC, 0, 0, SRCCOPY);\n\n // 사용된 메모리 DC 및 BITMAP의 삭제.\n MemDC.SelectObject(pOldBitmap);\n MemDC.DeleteDC();\n}\n\nvoid CXXXDlg::DrawImage(CDC* pDC)\n{\n // 파라미터로 넘겨진 메모리 DC에 그리기 동작 구현.\n}\n}}}\n\n<html>\n<div style="border: 1px solid gold; padding: 10px; background-color: #F9F2F4; ">\n<b> #. TransparentBlt 함수 </b> (WinAPI)\n</div> </html>\n-.이미지의 특정 색을 투명하게 적용시켜 화면에 출력하는 함수 (≒ StretchBlt 함수 + 투명화가 추가된 함수)\n BitBlt 함수과 다르게 이미지 크기도 변경할 수 있다.\n-.외부참조 오류가 발생할 경우\n #pragma comment(lib, "msimg32.lib")을 추가\n{{{\nBOOL TransparentBlt(\n HDC hdcDest, // 출력\n int xoriginDest, // 이미지 출력 위치\n int yoriginDest,\n int wDest, // 출력 이미지의 넓이, 높이\n int hDest,\n HDC hdcSrc, // 원본\n int xoriginSrc, // 가져올 이미지의 좌표\n int yoriginSrc,\n int wSrc, // 가져올 이미지의 넓이, 높이\n int hSrc,\n UINT crTransparent); // 투명하게 할 RGB 색상\n}}}\n\n
{{{\n//-----------------------------------------------------------------------------\n// Name: MsgProc()\n// Desc: The window's message handler\n//-----------------------------------------------------------------------------\nLRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)\n{\n HDC hdc;\n PAINTSTRUCT ps;\n\n HDC hMemDC;\n HBITMAP hBmp, hOldBitmap;\n int bx, by;\n BITMAP bit;\n\n LPCWSTR str;\n\n switch (msg)\n {\n case WM_CREATE:\n CreateDevice( hWnd );\n return 0;\n\n case WM_DESTROY:\n Cleanup();\n PostQuitMessage(0);\n return 0;\n\n case WM_PAINT:\n {\n hdc = BeginPaint(hWnd, &ps);\n hMemDC = CreateCompatibleDC(hdc); // 메모리 DC를 만든다\n\n // 비트맵 속성으로 파일을 불러오고 HBITMAP으로 형변환해서 hImage에 저장한다\n/*\n // 이미지 로딩\n hBmp = (HBITMAP)LoadImage(NULL, TEXT("190423_image.bmp"),\n IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);\n // 검은색 단색\n hBmp = CreateBitmap(256, 256, 1, 32, NULL);\n\n // 비트맵 색(파란색) 설정\n unsigned int *p = new unsigned int[256*256]; // 256*256*4 크리고 메모리 생성\n for( int i = 0; i < 256*256; i++)\n *(p+i) = 0xFF0000FF; // 0xAARRGGBB\n\n hBmp = CreateBitmap(256, 256, 1, 32, p);\n\n delete[] p;\n*/\n BITMAPINFO bmi;\n unsigned int * pBits;\n ZeroMemory( &bmi, sizeof(BITMAPINFO) );\n bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);\n bmi.bmiHeader.biWidth = 256;\n bmi.bmiHeader.biHeight = -256;\n bmi.bmiHeader.biPlanes = 1;\n bmi.bmiHeader.biBitCount = 32;\n bmi.bmiHeader.biCompression = BI_RGB;;\n bmi.bmiHeader.biSizeImage = 0;\n bmi.bmiHeader.biXPelsPerMeter = 100;\n bmi.bmiHeader.biYPelsPerMeter = 100;\n bmi.bmiHeader.biClrUsed = 0;\n bmi.bmiHeader.biClrImportant = 0;\n\n hBmp = ::CreateDIBSection(hMemDC, &bmi, DIB_RGB_COLORS, (void**)&pBits, NULL, 0);\n\n // hImage가 선택되기 전의 핸들을 저장해 둔다\n hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBmp);\n\n // 비트맵 정보를 알아낸다\n GetObject(hBmp, sizeof(BITMAP), &bit);\n bx = bit.bmWidth;\n by = bit.bmHeight;\n\n // 메모리 DC에 윈도우즈 폰트로 글자를 쓰는 부분 \n RECT rc;\n rc.left = 0;\n rc.top = 0;\n rc.right = bx;\n rc.bottom = by;\n \n HBRUSH br = CreateSolidBrush(0x00FF00FF); // 배경색 ( ∵ For filtering )\n FillRect(hMemDC, &rc, br);\n\n HFONT hFont = CreateFont(30, 0, 0, 0,\n FW_NORMAL, FALSE, FALSE, FALSE,\n ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, NONANTIALIASED_QUALITY, DEFAULT_PITCH, \n L"궁서");\n\n // 원본\n SetBkMode(hMemDC, TRANSPARENT);\n SetTextColor(hMemDC, RGB(0, 255, 0));\n\n SelectObject(hMemDC, hFont);\n str = TEXT("원본");\n TextOut(hMemDC, 40, 30, str, lstrlen(str));\n \n DeleteObject(hFont);\n DeleteObject(br);\n\n //-----------------------------------------------------------------------------\n // HBITMAP 개별 색 Filtering (by 0x00FF00FF)\n //-----------------------------------------------------------------------------\n unsigned int * pSrc32 = (unsigned int *) pBits;\n for (int y = 0; y < by; y++)\n {\n for (int x = 0; x < bx; x++)\n {\n // 0x00FF00FF는 투명으로 처리한다. 나머지는 찍는다. \n if (*pSrc32 == 0x00FF00FF)\n *pSrc32 = 0x00;\n else\n *pSrc32 = *pSrc32 | 0xFF000000;\n\n pSrc32++;\n }\n }\n //-----------------------------------------------------------------------------\n\n BitBlt(hdc, 50, 50, bx, by, hMemDC, 0, 0, SRCCOPY);\n\n // hImage 선택을 해제하기 위해 hOldBitmap을 선택한다\n SelectObject(hMemDC, hOldBitmap);\n \n DeleteObject(hBmp); // 선택 해제된 비트맵을 제거한다\n DeleteDC(hMemDC); // 메모리 DC를 제거한다\n\n EndPaint(hWnd, &ps);\n // ValidateRect(hWnd, NULL);\n return 0;\n }\n case WM_KEYDOWN:\n if (wParam == VK_ESCAPE)\n ::DestroyWindow(hWnd);\n break;\n\n default:\n App_Update( hWnd );\n break;\n }\n\n return DefWindowProc(hWnd, msg, wParam, lParam);\n}\n}}}
렌더링 할 때는 상황마다 렌더 스테이트 값을 얻어오고 저장한 뒤 렌더링을 다시 복구해 주는데\n이 때 값을 얻어 오거나 복구(설정) 할 때 아래의 함수를 사용한다.\n\nHRESULT ''SetRenderState'' ( \n D3DRENDERSTATETYPE State, DWORD Value );\n\nHRESULT ''GetRenderState'' ( \n D3DRENDERSTATETYPE State, DWORD *pValue );\n\n@@ 이전 렌더 스테이트 저장 >> 해당 렌더 스테이트 설정 >> 렌더링 >> 이전 렌더 스테이트 복구 @@\n{{wrappingClass{ d3d9types.h }}}\n|>|>|typedef enum _D3DRENDERSTATETYPE { |\n| D3DRS_ZENABLE|= 7, |/* D3DZBUFFERTYPE (or TRUE/FALSE for legacy) */ |\n| D3DRS_FILLMODE|= 8, |/* D3DFILLMODE */ |\n| ... | | |\n| D3DRS_FORCE_DWORD|= 0x7fffffff, |/* force 32-bit size enum */ |\n|>|>|} D3DRENDERSTATETYPE; |\n\n▶ 와이이 프레임으로 렌더링\n pDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME); \n|>|>|typedef enum _D3DFILLMODE { |\n| D3DFILL_POINT |= 1, | |\n| D3DFILL_WIREFRAME |= 2, | |\n| D3DFILL_SOLID |= 3, | |\n| D3DFILL_FORCE_DWORD |= 0x7fffffff, |/* force 32-bit size enum */ |\n|>|>|} D3DFILLMODE; |
출처 ; http://dolphin.ivyro.net/file/directx_tip/CreateDiBSection한글처리.html \n - CreateDIBSection를 이용한 한글 처리 루틴 - (기본으로 부분 추가)\n\n{{{\nLPDIRECT3DDEVICE9 g_pd3dDevice = NULL; // Our rendering device\nLPDIRECT3DTEXTURE9 g_pHTexture = NULL;\n\n#define TEXTURE_WIDTH 128 \n#define TEXTURE_HEIGHT 128 \n\n//-----------------------------------------------------------------------------\n// Name: ResetHangul()\n//-----------------------------------------------------------------------------\nvoid ResetHangul( )\n{\n HDC hDC;\n HBITMAP hBmp;\n VOID* pBmp = NULL;\n\n hDC = CreateCompatibleDC(NULL);\n\n g_pd3dDevice->CreateTexture(TEXTURE_WIDTH, TEXTURE_HEIGHT,\n 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &g_pHTexture, NULL);\n\n BITMAPINFO bi;\n ZeroMemory(&bi, sizeof(BITMAPINFO));\n\n bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);\n bi.bmiHeader.biWidth = TEXTURE_WIDTH;\n bi.bmiHeader.biHeight = -TEXTURE_HEIGHT;\n bi.bmiHeader.biPlanes = 1;\n bi.bmiHeader.biBitCount = 32;\n bi.bmiHeader.biCompression = BI_RGB;\n bi.bmiHeader.biSizeImage = 0;\n bi.bmiHeader.biXPelsPerMeter = 100;\n bi.bmiHeader.biYPelsPerMeter = 100;\n bi.bmiHeader.biClrUsed = 0;\n bi.bmiHeader.biClrImportant = 0;\n\n hBmp = CreateDIBSection(hDC, &bi, DIB_RGB_COLORS, &pBmp, NULL, 0);\n\n if (g_pHTexture)\n {\n // 메모리 Bmp에 윈도우즈 폰트로 글자를 쓰는 부분 \n RECT rc;\n rc.left = 0;\n rc.top = 0;\n rc.right = TEXTURE_WIDTH;\n rc.bottom = TEXTURE_HEIGHT;\n\n (HBITMAP)::SelectObject(hDC, hBmp);\n HBRUSH br = CreateSolidBrush(0x00FF00FF); // 배경색 (Filtering으로 분홍색 설정)\n HFONT hFont = CreateFont(20, 0, 0, 0,\n FW_NORMAL, FALSE, FALSE, FALSE,\n ANSI_CHARSET,\n OUT_DEFAULT_PRECIS,\n CLIP_DEFAULT_PRECIS,\n NONANTIALIASED_QUALITY,\n DEFAULT_PITCH,\n L"궁서");\n\n SelectObject(hDC, hFont);\n FillRect(hDC, &rc, br);\n\n SetBkMode(hDC, TRANSPARENT);\n SetTextColor(hDC, RGB(0, 255, 0));\n TextOut(hDC, 2, 2,\n L"퇴근전 커밋!", (int)wcslen(L"퇴근전 커밋!"));\n\n DeleteObject(hFont);\n DeleteObject(br);\n\n // Bmp의 내용을 Texture로 복사하는 부분 \n D3DLOCKED_RECT rect;\n g_pHTexture->LockRect(0, &rect, &rc, 0); //D3DLOCK_DISCARD); \n\n int i = 0, x = 0, y = 0;\n UINT* pSrc32 = (UINT*)pBmp; // BMP \n UINT* pDst32 = (UINT*)rect.pBits; // TEXTURE \n\n // bmp의 폭이가 4의 배수가 아닌 경우는\n // 이 루틴이 적용되지 않을 수 있다. \n for (y = 0; y < TEXTURE_HEIGHT; y++)\n {\n for (x = 0; x < TEXTURE_WIDTH; x++)\n {\n // 0x00FF00FF는 투명으로 처리한다(필터링). 나머지는 찍는다. \n if (*pSrc32 == 0x00FF00FF)\n *pDst32 = 0x00;\n else\n *pDst32 = *pSrc32 | 0xFF000000;\n\n pDst32++;\n pSrc32++;\n }\n }\n g_pHTexture->UnlockRect(0);\n }\n DeleteObject(hBmp);\n}\n}}}\n''VOID Render()''\n{\n ResetHangul(); ∬ ⇒ 내부에서 문자 설정과 출력\n\n D3DXVECTOR3 vCenter(0.0f, 0.0f, 0.0f);\n D3DXVECTOR3 vPosition(50.0f, 50.0f, 0.0f);\n\n ∬ Clear the backbuffer to a blue color\n g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0, 0, 0, 255), 1.0f, 0);\n\n ∬ Begin the scene\n if (SUCCEEDED(g_pd3dDevice->BeginScene()))\n {\n ∬ g_pTextSprite->Begin(D3DXSPRITE_ALPHABLEND | D3DXSPRITE_SORT_TEXTURE);\n g_pTextSprite->Begin(NULL);\n\n ∬ TextOut(g_hDC, 2, 2, L"퇴근전 커밋!", (int)wcslen(L"퇴근전 커밋!"));\n\n g_pTextSprite->Draw(g_pHTexture, NULL, &vCenter, &vPosition, D3DCOLOR_XRGB(255, 255, 255));\n \n g_pTextSprite->End();\n \n >> End the scene\n g_pd3dDevice->EndScene();\n }\n\n ∬ Present the backbuffer contents to the display\n g_pd3dDevice->Present(NULL, NULL, NULL, NULL);\n}\n\n@@ #.g_pTextSprite->Begin(D3DXSPRITE_ALPHABLEND | D3DXSPRITE_SORT_TEXTURE); @@\n ⇒ DrawIndexedPrimitive( ... );로 변경시 참고 옵션\ng_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);\ng_pd3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);\ng_pd3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);\n\n\n
'New Tiddler' 에 관한 글을 작성해 주세요.
The Walking Dead : No Man's Land - 워킹데드 : 무인지대 \n\n| 장르|RPG, 좀비, 전략 |\n| 출시|2015.09.27 |\n| 개발사|Next Games |\n| 퍼블리셔|Next Games |\n| 플랫폼|안드로이드, iOS |\n| 특징|턴제, 자동전투 없음 |\n영화 '워킹데드' IP를 통해 스토리 내용을 담은 좀비 사냥 게임으로 구현\n영화 속 등장인물들이 '영웅' 캐릭터들로 등장하는 영웅 수집형 RPG\n\n\n''열심히 물자를 모으고 경험치를 모아서 캠프를 키운다.''\n<<<\n모닥불 : 미션을 시작 하는 곳\n농장 : 물자를 생산 - 물자를 통해 건물을 짓고 업그레이드를 함\n집회소 : 새로운 건물 잠금 해제 / 물자와 경험치 저장 용량을 늘려줌\n무전텐트 : 무전으로 찾는 생존자의 레벨을 높임 (더 높은 레벨의 생존자를 찾음) / 건축 포인트\n텐트 : 경험치 생산 - 경험치로 생존자와 무기를 업그레이드 함\n병원 : 전투 중 부상 당한 생존자 치료\n물자 저장고 : 물자 저장 용량을 늘림\n훈련장 : 생존자 훈련 -> 생존자 레벨 업\n작업장 : 방어구와 무기 레벨 업\n미션 자동차 : 연료 저장 용량을 늘림 - 연료를 한 게임당 2-3개 사용\n<<<\n\n''숫자 + 트리피 아이콘''\n<<<\n일일퀘스트\n도전과제\n프로필 > 클래스\n| 정찰(스카우트)|글렌 | 단일 근접, 공격력 강함, 이동력 높음|단검 |\n| 브루저|네간 | 탱커, 스턴사용, HP강하고 공격력 약함|몽둥이 |\n| 헌터|사샤 | 직선 원거리, 공격력 중간, 멀티 타겟|라이플, 석궁 |\n| 슈터|칼 | 단일 원거리, 공격력 강함 (챕터4 클리어시 해제)|권총 |\n| 워리어|미숀 | 범위 근접형, 공격력 강함 (챕터7 클리어시 해제)|장검 |\n| 어설트|로지타 | 방사형 원거리, 멀티 타겟, 낮은 공격력 (챕터9 클리어시 해제)|기관총 |\n<<<\n\n''무전 '' ; 새로운 생존자를 호출\n\n''생존자''\n\n''장비'' ; 등급에는 전설, 우수, 희귀, 특이, 보통 총 5가지 등급
<button name="button dialog ok">\n <texture>inventory_atlas</texture> \n <rendersection>DynamicBottom</rendersection> ; 설정 형식\n ...\n</button>\n\n<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 16px;"> <b> Rendering 구분 </b> </span>\n</html>\n{{{\n//ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ\n//ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ\nstruct STR_DICT\n{\n const char * str;\n int value;\n};\n\n//ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ\nSTR_DICT pRenderSectionEnumTbl[] =\n{\n { "World", RENDERSECTION_WORLD},\n { "", RENDERSECTION_BOTTOM},\n { "Bottom", RENDERSECTION_BOTTOM},\n { "DynamicBottom", RENDERSECTION_DYNAMIC_BOTTOM},\n { "Masks", RENDERSECTION_MASKS},\n { "MaskedModels", RENDERSECTION_MASKEDMODELS},\n { "Models", RENDERSECTION_MODELS},\n { "ItemText", RENDERSECTION_ITEMTEXT},\n { "Tooltips", RENDERSECTION_TOOLTIPS},\n { "Menus", RENDERSECTION_MENUS},\n { "Dialogs", RENDERSECTION_MENU_DIALOG},\n { "DialogMasks", RENDERSECTION_DIALOG_MASKS},\n { "DialogMaskedModels", RENDERSECTION_DIALOG_MASKEDMODELS},\n { "DialogModelOverlay", RENDERSECTION_DIALOG_MODELS_OVERLAY},\n { "LoadingScreen", RENDERSECTION_LOADING_SCREEN},\n { "DialogTop", RENDERSECTION_DIALOG_TOP},\n { "CursorContents", RENDERSECTION_CURSOR_CONTENTS},\n { "Cursor", RENDERSECTION_CURSOR},\n { "Debug", RENDERSECTION_DEBUG},\n\n { NULL, RENDERSECTION_BOTTOM },\n};\n}}}\nDWORD g_dwRenderState[NUM_RENDER_SECTIONS];\n\n<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 16px;"> <b> Rendering 여부 </b> </span>\n</html>\n{{{\n//----------------------------------------------------------------------------\n// Constants\n//----------------------------------------------------------------------------\n#define UIRS_NEED_UPDATE MAKE_MASK(0)\n#define UIRS_NEED_RENDER MAKE_MASK(1)\n\n//----------------------------------------------------------------------------\ninline void UISetNeedToRender( int nRenderSection )\n{\n g_dwRenderState[nRenderSection] |= UIRS_NEED_UPDATE; \n}\n\n//----------------------------------------------------------------------------\ninline void UIClearNeedToRender(int nRenderSection )\n{\n g_dwRenderState[nRenderSection] &= ~UIRS_NEED_RENDER;\n}\n\n//==============================================================================\nvoid UISetNeedToRenderAll( void )\n{\n for (int i=0; i < NUM_RENDER_SECTIONS; i++)\n {\n UISetNeedToRender(i);\n }\n}\n\n//----------------------------------------------------------------------------\nvoid UISetNeedToRender( UI_COMPONENT *component )\n{\n UISetNeedToRender(component->m_nRenderSection);\n\n UI_COMPONENT* child = component->m_pFirstChild;\n while (child)\n {\n UISetNeedToRender(child);\n child = child->m_pNextSibling;\n }\n}\n\n//==============================================================================\nvoid UIRepaint( void )\n{\n g_UI.m_bFullRepaintRequested = TRUE; // BOOL UI::m_bFullRepaintRequested;\n}\n\n\n//----------------------------------------------------------------------------\nvoid UIRefreshText( void )\n{\n UIComponentHandleUIMessage( g_UI.m_Components, UIMSG_REFRESH_TEXT_KEY, 0, 0 );\n UIRepaint();\n}\n}}}\n\nBOOL UI::m_bFullRepaintRequested; 처리는 \nvoid ''UIProcess''(void)\n{\n ...\n if (g_UI.m_bFullRepaintRequested)\n {\n UIComponentHandleUIMessage( g_UI.m_Components, UIMSG_PAINT, 0, 0 );\n UIComponentHandleUIMessage( g_UI.m_Cursor, UIMSG_PAINT, 0, 0 );\n g_UI.m_bFullRepaintRequested = FALSE;\n g_UI.m_bNeedItemWindowRepaint = FALSE; ∬ we've painted everything, can't possibly need the smaller subset of item ui pieces\n }\n ...\n if (!g_UI.m_bFullRepaintRequested)\n {\n 개별 UI_COMPONENT 별로 활성화 여부를 확인\n ⇒ 활성화된 경우, UIComponentHandleUIMessage( g_UI.m_Components, UIMSG_PAINT, 0, 0 ); 호출\n }\n ∬ DWORD dwAnimTime = 0;\n if (g_UI.m_Cursor)\n {\n ...\n }\n\n {\n PERF(UI_PROCESS);\n sUIProcess(); ∬ ⇒ void UIRenderToLocal( ... ); 호출\n }\n\n {\n PERF(UI_SCHED);\n CSchedulerProcess(AppGetCltGame());\n }\n\n}\n\n
''참고''\n [[UIProcess()_<rendersection>]]\n\n<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 16px;"> <b> 정의 </b> </span>\n</html>\n<ui> ∬ in data\s uix\s xml\s gamestart.xml\n...\n <screen>\n <name>gamestart screen</name>\n ...\n <rendersection>Menus</rendersection>\n ...\n <OnKeyDown>UIMainMenuOnKeyDown</OnKeyDown>\n <OnPaint>UIPaintIfNoMovieIsPlaying</OnPaint>\n <menu name="game type menu">\n <label name="ui menu singleplayer">\n <string>ui menu singleplayer</string> ∬ 싱글 플레이\n ...\n <OnLClick>UIStartGameMenuDoSingleplayer</OnLClick>\n <OnLClickSnd>TitleScreenSinglePlayer</OnLClickSnd>\n </label>\n ...\n </menu>\n ...\n </screen>\n</ui>\n\n<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 16px;"> <b> 처리 로직 </b> </span>\n</html>\nstatic void ''AppMainMenuDo''( unsigned int sim_frames ); (in source\s prime.cpp)\n ⇒ void ''UIProcess''( void ); (in source\s uix.cpp)\n ⇒ static void ''sUIProcess''( void );\n UIRenderToLocal(g_UI.m_Components, g_UI.m_Cursor);\n ⇒ void ''UIRenderToLocal''( UI_COMPONENT *pComponentList, UI_COMPONENT *pCursor); (in source\s uix_graphic.cpp)\n\n◾ pComponent 별로 RenderSection을 순차적으로 처리\ncf. DWORD g_dwRenderState[NUM_RENDER_SECTIONS]; ∬ = 20\ngamestart의 메뉴는\n <rendersection> Menus </rendersection> 으로 정의\n{{{\n▷ source\s uix_graphic.cpp\nvoid UIRenderToLocal( UI_COMPONENT *pComponentList, UI_COMPONENT *pCursor)\n{\n ...\n for (int iRenderSection = 0; iRenderSection < NUM_RENDER_SECTIONS; iRenderSection++)\n {\n // RENDERSECTION_MENUS = 9\n // g_dwRenderState[iRenderSection]; flag 상태 확인\n\n // copy elements from all drawlists into vertex/index buffers\n UIRenderDrawLists(iRenderSection);\n ...\n }\n}\n}}}\n
{{wrappingClass{ d3d9types.h }}}\n{{{\n// Flexible vertex format bits\n//\n#define D3DFVF_RESERVED0 0x001\n#define D3DFVF_POSITION_MASK 0x400E\n#define D3DFVF_XYZ 0x002\n#define D3DFVF_XYZRHW 0x004\n...\n#define D3DFVF_XYZW 0x4002\n\n#define D3DFVF_NORMAL 0x010\n#define D3DFVF_PSIZE 0x020\n#define D3DFVF_DIFFUSE 0x040\n#define D3DFVF_SPECULAR 0x080\n}}}\n◾ D3DFVF_XYZ ; 3D 좌표를 사용\n◾ D3DFVF_XYZRHW ; 2D 인터페이스의 좌표를 기반\n 화면의 왼쪽 위 끝이 (0,0)이고, 오른쪽으로 갈 수록 x값이 중가, 아래쪽으로 갈수록 y값이 증가한다.
''#. MAX''\n{{{\n//-----------------------------------------------------------------------------\n//-----------------------------------------------------------------------------\ntemplate<typename T> \ninline T MAX(\n T a, T b )\n{ \n return (a > b) ? a : b; \n}\n\n//----------------------------------------------------------------------------\ntemplate<>\ninline int MAX<int>(\n int a, int b )\n{\n b = a - b;\n return a - (b & (b >> 31));\n}\n\n//----------------------------------------------------------------------------\ninline int MAX0(\n int a )\n{\n return a & ~(a >> 31);\n}\n\n// ---------------------------------------------------------------------------\n// ---------------------------------------------------------------------------\ntemplate<typename T> \ninline T MAX(\n T a, T b, T c )\n{ \n if (a > b)\n return (a > c) ? a : c;\n else\n return (b > c) ? b : c;\n}\n\n// ---------------------------------------------------------------------------\n// return index 0-2\n// ---------------------------------------------------------------------------\ntemplate<typename T> \ninline T MAXIDX(\n T a, T b, T c )\n{ \n if (a >= b)\n return (a >= c) ? 0 : 2;\n else\n return (b >= c) ? 1 : 2;\n}\n}}}\n\n''#. MIN''\n{{{\n//----------------------------------------------------------------------------\n//----------------------------------------------------------------------------\ntemplate<typename T> \ninline T MIN(\n T a, T b )\n{ \n return (a < b) ? a : b; \n}\n\n// ---------------------------------------------------------------------------\ntemplate <>\ninline int MIN<int>(\n int a, int b )\n{\n a = a - b;\n return b + (a & (a >> 31));\n}\n\n// ---------------------------------------------------------------------------\n// ---------------------------------------------------------------------------\ntemplate<typename T> \ninline T MIN(\n T a, T b, T c )\n{ \n if (a < b)\n return (a < c) ? a : c;\n else\n return (b < c) ? b : c;\n}\n\n// ---------------------------------------------------------------------------\ntemplate<typename T> \ninline T MINIDX(\n T a, T b, T c )\n{ \n if (a <= b)\n return (a <= c) ? 0 : 2;\n else\n return (b <= c) ? 1 : 2;\n}\n}}}\n\n''#. ABS''\n{{{\n//----------------------------------------------------------------------------\n//----------------------------------------------------------------------------\ntemplate<typename T> \ninline T ABS(\n T a )\n{ \n return (a >= (T)0) ? a : -a; \n}\n\n//----------------------------------------------------------------------------\ntemplate <>\ninline int ABS<int>(\n int a )\n{\n return (a ^ (a >> 31)) + ((unsigned)a >> 31);\n}\n}}}\n\n''#. AVERAGE''\n{{{\n//----------------------------------------------------------------------------\n// average even if a + b overflows\n//----------------------------------------------------------------------------\ninline DWORD AVERAGE(\n DWORD a, DWORD b )\n{\n return (a & b) + ((a ^ b) >> 1);\n}\n}}}\n\n\n
텍스처의 샘플러 스테이트를 설정한다.\n\nHRESULT ''SetSamplerState''(\n DWORD Sampler,D3DSAMPLERSTATETYPE Type,DWORD Value);\n\nHRESULT ''GetSamplerState''(\n DWORD Sampler,D3DSAMPLERSTATETYPE Type,DWORD * pValue);\n\n|>|>|typedef enum _D3DSAMPLERSTATETYPE { |\n| D3DSAMP_ADDRESSU|= 1, |/* D3DTEXTUREADDRESS for U coordinate */ |\n| D3DSAMP_ADDRESSV|= 2, |/* D3DTEXTUREADDRESS for V coordinate */ |\n| D3DSAMP_ADDRESSW|= 3, |/* D3DTEXTUREADDRESS for W coordinate */ |\n| ... | | |\n| D3DSAMP_MAGFILTER|= 5, |/* D3DTEXTUREFILTER filter to use for magnification */ |\n| ... | | |\n| D3DSAMP_FORCE_DWORD|= 0x7fffffff, |/* force 32-bit size enum */ |\n|>|>|} D3DSAMPLERSTATETYPE; |\n\n▶ Texture UV 적용 방식 ; D3DSAMP_ADDRESSU, D3DSAMP_ADDRESSV\n g_pd3dDevice->SetSamplerState( 0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);\n\n|>|>|typedef enum _D3DTEXTUREADDRESS { |\n| D3DTADDRESS_WRAP|= 1, |바둑판 모양으로 반복 배치 |\n| D3DTADDRESS_MIRROR|= 2, |0.0 ~ 1.0 밖의 텍셀들을 뒤집어 준다. |\n| D3DTADDRESS_CLAMP|= 3, |0.0 ~ 1.0 밖의 색은 텍스처의 Edge 부분이 색을 늘려서 채움 |\n| D3DTADDRESS_BORDER|= 4, |0.0 ~ 1.0 밖의 색은 지정한 경계색으로 채움 |\n| D3DTADDRESS_MIRRORONCE|= 5, |-1.0 ~ 1.0 범위 안에서는 미러링이 되고, 이 밖의 영역은 클램핑 |\n| D3DTADDRESS_FORCE_DWORD|= 0x7fffffff, |/* force 32-bit size enum */ |\n|>|>|} D3DTEXTUREADDRESS; |\n\n\n
''Visual Studio 2005''부터는 strcpy 같은 보안상 취약성을 가진 문자열 함수들은 모두 경고 처리 된다.\n\nwarning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. \nTo disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.\nscanf는 문자열 사이즈를 넣지 않아도 사용이 가능하기 때문에 "오버플로우(overflow)"라는 문제점이 발생할 수 있다.\n이러한 문제 발생을 보안하고자 canf 대신 scanf_s를 사용하라고 권하는 오류를 표시한다.\n\n''Visual Studio 2013''에서는 컴파일러가 강화되어, 예전 2010버전에서는 Warning 정도로 처리했던 unsafe 함수들에 대해 에러로 처리하여 컴파일이 되지 않는다.\n\nerror C4996: 'wcsncpy': This function or variable may be unsafe. Consider using wcsncpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.\n\n'wcsncpy' 이 함수는 안전하지 않기 때문에, wcsncpy_s를 사용하거나 _CRT_SECURE_NO_WARNINGS을 사용\n\nerror C4996: 'wcsncpy': This function or variable may be unsafe. Consider using wcsncpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.\n\n1.비주얼 스튜디오 2013, 전처리기 정의에서 추가\nProject -> properties -> Configuration Properties(구성 속성) \n -> c/c++ -> Preprocessor(전처리기) -> Preprocessor Definitions -> _CRT_SECURE_NO_WARNINGS 추가\n\n2.소스 코드에서 정의\n{{{\n#define _CRT_SECURE_NO_WARNINGS \n#pragma warning(disable:4996) \n}}}\n\n3.프로젝트 환경 설정에서 SDL 검사 끄기\n구성 속성 > C/C++ > SDL 검사 ; 아니요(/sdl-) 설정\n\n4.Visual Studio에서 프로젝트 생성시 \n응용 프로그램 설정 > SDL(Security Development Lifecycle) 검사 끄기\n\n<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 14px;"> <b> #. wcsncpy_s( ... ); 함수 사용예 </b> </span>\n</html>\n\nerrno_to ''wcsncpy_s''( wchar_t * strDest, strDest의 크기, const wchar_t * strSource, 복사할 문자 수);\n{{{\nwchar_t szDest[256] = { 0, };\nwchar_t szSource[] = L"TEST";\n\nwcsncpy_s( szDest, 256, szSource, 4 );\n\n// or 널 문자를 위해 szSource의 널문자까지만 복사. 255문자를 복사하는 것이 아님\nwcsncpy_s( szDest, 256, szSource, 256 - 1 );\n}}}\n\n\n
출처 ; https://arer.tistory.com/95\n\n이스케이프 시퀀스는 컴퓨터와 주변 기기의 상태를 바꾸는 데에 쓰이는 일련의 문자열로, 제어 시퀀스(control sequence)라고 한다.\n\n백슬래스(\)와 특정문자(알파벳, ', ? 등)를 결합하여 언어특성상 표현할 수 없는 기능, 문자를 표시하고,\n키보드에서는 백슬래시(\)가 없고 ₩로 대체한다.\n\n이스케이프 문자들은 데이터가 아닌 실행 명령어로 해석할 수 있다. \n\n| !문자 | !의미 | !설명 |\n| \a |경보(alert) |경보를 울림(하드웨어에 따라 상이) |\n| \b |백스페이스(backspace) |백스페이스 |\n| \f |폼피드(form feed) |커서를 다음 페이지의 시작부분으로 넘김 |\n| \n |개행, 뉴라인(new line) |커서를 다음줄 첫번째 위치로 넘김 |\n| \r |복귀, 캐리지 리턴(carriage return) |커서를 다음줄로 넘기지 않고 첫번째 위치로 넘김 |\n| \t |수평 탭(horizontal tab) |키보드의 tab키와 같은 기능 |\n| \v |수직 탭(vertical tab) |수직으로 탭 |\n| \\ |백슬래시(backslash) |백슬래시를 표기해줌(₩또는\로 표기) |\n| \' |작은 따옴표(single quotation marks) |C/C++에서 문자(character)를 'a'와 같이 표기하는데 이 기능과 충돌 방지를 위해 이스케이프 문자로 표기함 |\n| \" |큰 따옴표(double quotation marks) |C/C++에서 문자열(string)을 "abc"와 같이 표기하는데 이 기능과 충돌 방지를 위해 이스케이프 문자로 표기함 |\n| \? |물음표(question mark) |물음표는 C/C++에서 함수로 사용되는데 이와 충돌 방지를 위해 이스케이프 문자로 표기함 |\n| \o(8진수 숫자) |8진수(octal number) |10진수와 구분하기 위해 8진수를 이스케이프 문자를 이용하여 표기함, (예시) \o73 |\n| \x(16진수 숫자) |16진수(hexadecimal number) |10진수와 구분하기 위해 8진수를 이스케이프 문자를 이용하여 표기함, (예시) \xA78D |\n\n\n
원문 ; http://www.gyeongkim.co.kr/jokbocol/bang-wee1.htm - 묘지조성과 방위예절\n\n<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 14px;"> <b> 묘지조성과 방위 </b> </span> \n</html>\n\n''부부간에 쌍분으로 모실 때 남자(考位)와 여자(配位)를 좌우 어느 편에 모셔야 한다는 풍수지리학상의 근거는 없다.''\n왜냐하면 풍수지리학상으로 말하면 길지(吉地)와 흉지(兇地)의 혈(穴)은 하나의 독립된 묘(墓)를 이룬다는 개념이지 복수의 묘소를 말하는 것이 아니다. 즉 산(山)의 혈맥(血脈)에서 길지는 한 곳 밖에 없게 된다. 풍수지리학상으로는 요즘처럼 가족이나 가문의 묘소를 한 곳에 여럿 모신다는 것이 좋지 못한 것이다. 그것이 좋은 혈이라 하더라도 하나밖에 없는 기(氣)를 여럿이서 나누면 좋지 않는 것이다. 그래서 옛날에는 좋은 가문일수록 부부간이나 부자 및 조손 간에도 묘소가 여러 곳에 산재할 수 밖에 없었던 것이다.\n이제는 조상의 묘소도 후손이 관리하기 쉽게 한 곳에 모으게 되고 부부간에도 식별이나 묘제 등을 모시기 쉽게 합장이나 쌍분으로 하는 경우가 늘어나게 된 것이다.\n\n조선시대에서 지금까지 내려온 예법의 기준에서 동서남북이라고 말하는 방위는 우리가 보통 인식하는 실제의 방향 즉 해가 뜨는 동쪽(Ease), 해가 지는 서쪽(West), 따뜻한 남쪽(South), 추운 북쪽(North)과는 아무 상관이 없다. 다만 좌우(左右)가 혼동하지 않도록 하기 위해서는 별도로 동서남북(동서남북)을 만들었다.\n\n예법(禮法)에서는 같은 상석(上席)이라도 \n망자(亡者)은 서방(西方)이 상석이고 - 망자의 자리는 묘소의 배치와 제사에서의 신위\n생자(生者)은 반대로 동방(東方)이 상석이다. - 생자의 자리는 회갑(회갑)이나 생일이나 폐백에서의 자리 등\n\n<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 14px;"> <b> 동서남북의 구분 </b> </span> \n</html>\n\n※ 망자의 쌍분\n| |>|>| 상석(上席) <br> @@color(#FF0000): 북(北) @@ | |\n| @@color(#FF0000): 서(西) @@ | 남편 | | 부인 | @@color(#FF0000): 동(東) @@ |\n|~| 상석(床石) |~| 상석(床石) |~|\n| |>|>| @@color(#FF0000): 남(南) @@ | |\n\n※ 망자의 제사 ; 여러 대(代) 합사(合祀)\n| | 상석(上席) <br> @@color(#FF0000): 북(北) @@ | |\n| @@color(#FF0000): 서(西) @@ | <고조고,비> <증조고,비> <조고,비> <고(부),비(모)> <br> 제상(祭床) | @@color(#FF0000): 동(東) @@ |\n| | 제관(祭官) <br> @@color(#FF0000): 남(南) @@ | |\n\n※ 생자의 회갑, 생일, 폐백\n| |>| 상석(上席) <br> @@color(#FF0000): 북(北) @@ | |\n| @@color(#FF0000): 서(西) @@ | 아내 | 남편 | @@color(#FF0000): 동(東) @@ |\n|~|>| 음식상 |~|\n| |>| @@color(#FF0000): 남(南) @@ | |\n\n\n
원문 ; https://boycoding.tistory.com/164, 요약\n\n● 비트(bit) - 컴퓨터에서 사용하는 가장 작은 데이터 단위, 하나의 비트는 2진수 1 또는 0으로 표현되어 데이터를 처리, 저장, 전송 할 때 사용\n● 바이트(Byte) - 데이터 파일의 크기, 디스크 또는 그 외 저장 매체의 공간, 그리고 네트워크를 통하여 전송 되는 데이터의 양을 표현하는데 사용 되는 측정 단위 (1Byte = 8bit)\n\n0x00 ~ 0xFF ===> 1바이트로 표현하는 종류( 0 ~ 255 )\n0x0000 ~ 0xFFFF ===> 2바이트로 표현하는 종류 ( 0 ~ 65535 )\n\n\n<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 14px;"> <b> #. 비트 플래그 (bit flag) </b> </span></html>\n\n메모리의 최소 크기 단위는 1바이트이므로 변수의 크기는 적어도 1바이트 이상이다. 8비트(1바이트)는 비트가 8개이므로 8가지 상태를 저장할 수 있다. 이는 1바이트를 사용해서 1비트만 사용하고 7비트를 낭비함으로써 1가지 상태만 저장하는 bool 자료형보다 훨씬 효율적이다.\n\n1. 옵션(or 상태)가 많이 필요할 때\n2. 옵션(or 상태)을 조합할 때 유용하다.\n\n\n<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 14px;"> <b> #. 비트 플래그 정의 </b> </span></html>\n\n// Define 8 separate bit flags (these can represent whatever you want) \nconst unsigned char option0 = 0x1; // hex for 0000 0001 \nconst unsigned char option1 = 0x2; // hex for 0000 0010 \nconst unsigned char option2 = 0x4; // hex for 0000 0100 \nconst unsigned char option3 = 0x8; // hex for 0000 1000 \nconst unsigned char option4 = 0x10; // hex for 0001 0000 \nconst unsigned char option5 = 0x20; // hex for 0010 0000 \nconst unsigned char option6 = 0x40; // hex for 0100 0000 \nconst unsigned char option7 = 0x80; // hex for 1000 0000\n\n''왼쪽 시프트 연산자(<<)를 사용한 방법''\n// Define 8 separate bit flags (these can represent whatever you want) \nconst unsigned char option0 = 1 << 0; // 0000 0001\nconst unsigned char option1 = 1 << 1; // 0000 0010\nconst unsigned char option2 = 1 << 2; // 0000 0100\nconst unsigned char option3 = 1 << 3; // 0000 1000\nconst unsigned char option4 = 1 << 4; // 0001 0000\nconst unsigned char option5 = 1 << 5; // 0010 0000\nconst unsigned char option6 = 1 << 6; // 0100 0000\nconst unsigned char option7 = 1 << 7; // 1000 0000\n\n\n<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 14px;"> <b> #. 플래그를 사용한 비트 조작 (Using bit flags to manipulate bits) </b> </span></html>\n\n사용하는 옵션(option) 수에 따라 적절한 크기(8비트, 16비트, 32비트 등)의 부호 없는(unsigned) 정수 자료형을 사용한다.\n\n// 8가지 옵션을 위해 8비트를 사용할 때\nunsigned char myflags = 0; // all bits turned off to start\n\n''▷ 비트 켜기 ; 비트 OR 연산자(|)를 사용''\nmyflags |= option4; // myflags = (myflags | option4)\n\n''▷ 비트 끄기 ; 비트 AND 연산자(&)와 비트 NOT 연산자(~)를 사용''\nmyflags &= ~option4; // myflags = (myflags & ~option4)\nmyflags &= ~(option4 | option5); // 동시에 끄기\n\n''▷ 비트 뒤집기 ; 비트 XOR 연산자(^)를 이용해서 비트를 토글(toggle)''\nmyflags ^= option4;\nmyflags ^= (option4 | option5); \n\n''▷ On, Off 확인 ; 비트 AND 연산자(&)를 이용해서 비트 상태를 확인''\nif (myflags & option4)\nif !(myflags & option5)\n\ncf. #define ISFLAG(x) (myflags & (x))\nif ISFLAG( option4 )\n\n<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 14px;"> <b> #. 비트 마스크 (bit mask) </b> </span></html>\n\n비트 플래그의 원칙은 비트 단위 연산 한 번으로 여러 비트를 한 번에 켜거나, 끄거나, 뒤집거나, 검사하도록 확장할 수 있다.\n플래그의 비트를 조작하거나 검사할 때 사용하는 숫자를 비트 마스크(bit mask)라고 부른다.\n\n151은 바이너리(binary)로 1001 0111이다. lowMask를 8비트 바이너리로 0000 1111라 한다면,\n1001 0111 & 0000 1111 = 0000 0111이므로 10진수 7을 출력한다.\n\n\n\n\n
뷰포트는 렌더링을 위한 화면 크기를 설정한다. \nMinZ, MaxZ는 깊이 버퍼의 범위이며 대체적으로 0~1로 고정적으로 설정한다.\n\n다음은 화면분할에서 표시할 때, 구성이다.\n\n//\n// Render to the left viewport\n//\nD3DVIEWPORT9 leftViewPort;\n\nleftViewPort.X = 0;\nleftViewPort.Y = 0;\nleftViewPort.Width = g_dwBackBufferWidth / 2;\nleftViewPort.Height = g_dwBackBufferHeight;\nleftViewPort.MinZ = 0.0f;\nleftViewPort.MaxZ = 1.0f;\n\ng_pd3dDevice->SetViewport( &leftViewPort );\n\n// Now we can clear just view-port's portion of the buffer to red...\ng_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,\n D3DCOLOR_COLORVALUE( 1.0f, 0.0f, 0.0f, 1.0f ), 1.0f, 0 );\n\ng_pd3dDevice->BeginScene();\n...\ng_pd3dDevice->EndScene();\n\n//\n// Render to the right viewport\n//\nD3DVIEWPORT9 rightViewPort;\n\nrightViewPort.X = g_dwBackBufferWidth / 2;\nrightViewPort.Y = 0;\nrightViewPort.Width = g_dwBackBufferWidth / 2;\nrightViewPort.Height = g_dwBackBufferHeight;\nrightViewPort.MinZ = 0.0f;\nrightViewPort.MaxZ = 1.0f;\n\ng_pd3dDevice->SetViewport( &rightViewPort );\n\n// Now we can clear just view-port's portion of the buffer to green...\ng_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,\n D3DCOLOR_COLORVALUE( 0.0f, 1.0f, 0.0f, 1.0f ), 1.0f, 0 );\n\ng_pd3dDevice->BeginScene();\n...\ng_pd3dDevice->EndScene();\n\n\n
<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 14px;"> <b> 공정세대란 ( 2000년생 ) </b> </span> \n</html>\n자신과 직, 간접적으로 관련이 있는 문제에 대해 공정성을 중요하게 여기는 2000년생을 뜻한다. 자신과 관련한 공정성 문제에 대해서는 기성세대보다 큰 목소리를 낸다는 것이다. 동아일보가 최근 2000년생을 대상으로 조사를 한 결과, 이들의 주요한 특징으로 공정세대 외에도 인맥을 형성하는 데 있어 가성비를 따지는 인코노믹스, 연애와 생활의 균형을 중요하게 생각하는 러라벨 등을 꼽았다.\n\n\n<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 14px;"> <b> 삼원갑자 </b> </span> \n</html>\n해와 달과 수성, 금성, 화성, 목성, 토성을 칠요(七曜)라 부르며 지구와 칠요가 차례로 일직선이 되는 해를 갑자년으로 잡았다. 이렇게 지구와 칠요(七曜)가 일직선이 되는 주기는 180년이다. 이 기간을 3등분 하여 상,중,하원갑자로 분류한다. \n서기 연수를 180으로 나눈 나머지가 64일 때, 이 해를 상원갑자년이라 한다. 그리고 나머지가 124년일 때 중원갑자년, 4년일 때는 하원갑자년이다.\n\n1원 상원갑자는 1864~1923 계해년 까지이고\n2원 중원갑자는 1924~1983 계해년 까지이고\n3원 하원갑자는 1984~2043 계해년 까지이다.\n
<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 16px;"> <b> warning C4995 </b> </span>\n</html>\n\nwarning C4995 경고 메시지는 #pragma deprecated 로 지정된 함수를 사용할 때 발생하는 메시지이다.\n\n@@color(#3058D2): warning C4995: 'strcpy': 이름이 #pragma deprecated로 표시되었습니다. @@\n@@bgcolor(#d7dedd):\n''Error Message ''\n\n'function': name was marked as #pragma deprecated \n\nThe compiler encountered a function that was marked with pragma deprecated. The function may no longer be supported in a future release. You can turn this warning off with the warning pragma (example below). \n@@\nMSDN에서는 보안 문제 등 여러가지 이유로\n더 이상 지원이 되지 않을 수 있는 함수이고, 다음 버전에서는 더 이상 지원하지 않을 수 있다고 설명한다.\n\n경고문을 표시하지 않는 방법(해결책)\n1.#pragma warning(disable:4995)\n2.#define STRSAFE_NO_DEPRECATE\n\n\n<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 16px;"> <b> warning C4996 </b> </span>\n</html>\n\nwarning C4996 경고 메시지는 개선된 함수를 사용하지 않았기 때문에 발생하는 메시지이다.\n\n경고문을 표시하지 않는 방법(해결책)\n1.#pragma warning(disable:4996)\n2."stdafx.h" 상단에 #define _CRT_SECURE_NO_DEPRECATE 를 정의\n@@bgcolor(#d7dedd):\nerror C4996: 'stricmp': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _stricmp. See online help for details.\n@@\n위와 같은 메시지가 발생할 경우, 헤드 파일에 #define _CRT_NONSTDC_NO_DEPRECATE 를 정의한다.\n\n\n
<html>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<span style="font-size: 14px;"> #. (Windows API) BOOL __stdcall PtInRect( CONST RECT *lprc, POINT pt ); // WinUser.h </span>\n</div> </html>\n원문 ; http://egloos.zum.com/Lusain/v/2958427\n\nPtInRect - RECT로 지정된 사각형 범위의 내에 POINT형 변수가 존재하면 0, 아니면 이외의 값을 반환하는 bool형 함수.\n ■ RECT형 구조체변수를 넣을 땐 주소값을 전달\n ■ UI 버튼 영역에 마우스가 있는지 확인에 사용\n\n{{{\nRECT in_Rect = { 10, 10, 50, 50 } ;\nPOINT in_Pt ; // 마우스 포인터\n\nswitch( uMsg)\n{\n WM_LBUTTONDOWN:\n in_Pt.x = LOWORD(lParam);\n in_Pt.y = HIWORD(lParam);\n\n\n if( PtInRect( &in_Rect, in_Pt ) )\n MessageBox( hWnd, "안에 있다", "!", MB_OK ) ;\n\n break;\n}\n\nreturn 0 ;\n}}}\n\n
원문 ; http://chungheongong.com/(E)/gt13.htm\n\n▣분묘[墳墓]라 함은 땅을 파고 시신[屍身:시체]을 토광[土壙]에 안치] 한 후 평장[平葬]:흙을 덮고 묻음]을 한 다음 봉분[封墳:흙을 쌓아줌] 함을 말한다.\n\n▶묘소[墓所]란 시신을 안장 한 묘 의 소재지를 말하며 이를 선산[先山].선영[先塋].선조[先兆]라고도 부른다.\n보첩[譜牒]을 보면 방주란[旁註欄]에 묘의 위치[位置] 등을 기록 하는데 묘[墓]라고 한 자만을 기록한다.\n여기에는 묘의 위치 와 좌향[坐向:방위]까지 상세히 기재[記載]하는데 합장[合葬:부부를 같이한 봉분에 매장함] 했을 경우 합폄[合폄] 등으로 표기하며 좌향도 자좌[子坐]:정북을 나타내며 북쪽을 등지고 있다는 뜻이므로 정남을 가리키는 것이다.\n유좌[酉坐:정서이며 정동을 가리킴] 등으로 표기하며 석물[石物]등의 유무[有無]까지 명기[明記]하여 둔다.\n\n▶묘소[墓所] 좌향[坐向]\n묘소 위치의 배면[背面:등뒤]를 좌[坐]라 하고 전면[前面]을 향[向]이라한다.\n\n| !좌[坐] | !향[向] |\n|자좌[子坐]:정북 [正北] |오향[午向]:정남[正南] |\n|계좌[癸坐]: |정향[丁向]: |\n|축좌[丑坐]: |미향[未向]: |\n|간좌[艮坐]:북동[北東] |곤향[坤向]:남서[南西] |\n|인좌[寅坐]: |신향[申向]: |\n|갑좌[甲坐]: |경향[庚向]: |\n|묘좌[卯坐]:정동[正東] |유향[酉向]:정서[正西] |\n|을좌[乙坐]: |신향[辛向]: |\n|진좌[辰坐]: |술향[戌향]: |\n|손좌[巽坐]:남동[南東] |건향[乾向]:북서[北西] |\n|사좌[巳坐]: |해향[亥向]: |\n|병좌[丙坐]: |임향[壬向]: |\n|오좌[午坐]:정남[正南] |자향[子向]:정북[正北] |\n|정좌[正坐]: |계향[癸向]: |\n|미좌[未坐]: |축향[丑向]: |\n|곤좌[坤坐]:남서[南西] |간향[艮向]:북동[北東] |\n|신좌[申坐]: |인향[寅向]: |\n|경좌[庚坐]: |갑향[甲向]: |\n|유좌[酉坐]:정서[正西] |묘향[卯向]:정동[正東] |\n|신좌[辛坐]: |을향[乙向]: |\n|술좌[戌坐]: |진향[辰向]: |\n|건좌[乾坐]:북서[北西] |손향[巽向]:남동[南東] |\n|해좌[亥坐]: |사향[巳向]: |\n|임좌[壬坐]: |병향[丙向]: |\n\n▶묘계[墓界]\n묘계는 무덤의 구역[區域]으로 조선조[朝鮮朝]에서는 품계[品階]에 따라 무덤을 중심으로 1품은 사방 100보 [步] 걸어가는 걸음 2품은 90보. 3품은 80보. 4품은 70보 5품은 50보. 생원[生員] 진사[進士]는 40보 그리고 서민은 사방 10보로 제한 하였다.\n\n▶묘표[墓表]\n표석이라고도 하며 망자[亡者:죽은사람] 의 품계[品階]와 관직[官職].명호[名號]를 앞면에 새겨 세우며 뒷면에는 자[字].호[號] 휘[諱]행적[行蹟] .생졸년월[生卒年月] 비석[碑石]을 세운 년 월일 비문[碑文]을 찬[撰:작문함] 한사람 글씨를 쓴사람 등을 명기 하여 무덤 앞에 세우는 비석등을 말한다. 예[例] 가정대부[嘉靖大夫] 이조참판 밀양 박공 지묘 관작이 없으면 호와 휘...이름을 쓴다.\n호가 없을 경우에는 일반 적으로 학생: 벼슬길에 나가지 않았다는 뜻 모공 휘 지묘 라 쓴다.\n\n▶묘지[墓誌]\n지석[誌石]이라고도 하며 천재지변[天災地變: 폭풍우:산사태 등]으로 묘를 잃어 버릴 것에 대비하여 돌[石] 등에 망인[죽은 사람의 관 .성 .명.[貫姓名] 생졸년월일.묘의 위치 자손의 이름등을 간략하게 새겨 무덤아에 묻는 것을 말한다.\n\n▶묘비[墓碑]와 비명[碑銘]\n묘비란 무덤 앞에 세우는 비석에 총칭[摠稱]이며 비명[碑銘]이란 비석에 비문을 새긴 것을 말하는데 고인[故人:죽은 사람의 관,성.명.은 물론 그 경력이나 사적[事績]등을 서술[敍述]함을 말한다.\n\n▶묘갈[墓喝]\n묘비와 비슷하나 3품 이하 관리 들의 무덤앞에 세우는 것으로 머리 부분에 별도의 관석[冠石: 머릿돌]이 없이 비신[비석을 새긴 비석의 주장되는 돌] 머리부분을 동그스름하게 만든 것으로 묘비[墓碑]에 비해 그 체재와 규모가 작은 편이다. 중국에서는 진[晉]나라에서 비롯되었다. \n
<html>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<span style="font-size: 14px;"> <b> 퀘스트 지문 </b> </span>\n</div> </html>\n\n<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 14px;"> <b> 퀘스트 Parsing </b> ( cf Text.txt ) </span> \n</html>\n\n#define MAX_TEXT 10240 // 최대치 설정\n\nSTRUCT_TEXT* g_pText = NULL;\ng_pText = new STRUCT_TEXT[MAX_TEXT];\n\n#define NPCMENU_LENGTH 64\n#define MAX_TALK_SPEECH 40\n#define MESSAGE_LENGTH 128\n#define ADD_TEXT_STRING 4\n\nstruct STRUCT_TEXT\n<<<\nint NPCID;\nchar Title[NPCMENU_LENGTH];\n(struct) TEXT_INFO Text[MAX_TALK_SPEECH];\n> char Focus; // FOCUS_NPC...\n> char Emoticon; // EMOTICON_HAPPY... ??\n> char Animation;\n> char Reserved;\n> char Text[MESSAGE_LENGTH];\n> char Put[ADD_TEXT_STRING]; // ADD_CHARNAME...\n<<<\n\n[text 1]\ntitle=경비병_NPC1\nnpcid=1\nfocus=1\ntext=실례합니다._레겐샤인_경비대_소속이시군요._레겐샤인으로_가는_안내를\nfocus=1\ntext=받고_싶습니다만...\nfocus=0\ntext=오호...레겐샤인에_임관_신고를_하러_가시는_엘터분이시군요._여기까지_\n...\n[text 185]\n...\nfocus=0\ntext=그래??_내_욕을_많이_하던가?\nfocus=2\nemoticon=8\ntext=입에_거품을_물던데요??헤헤헤\nfocus=1\nanimation=25\naddstring=5\ntext=%s_!!!\n\nint Number = 0; // 초기화\nint EmptyIdx = 0;\n| '[' |시작점 |@@bgcolor(#fae3ee): Number = atoi( szTemp+i ); @@ |(g_pText[Number]) |범위 제한 ; if( (Number < 0) || (Number >= MAX_TEXT) ) <br> 중복 필터링 ; if( g_pText[Number].Text[0].Text[0] != 0 ) |\n| '=' |값 설정 |>| | |\n|struct STRUCT_TEXT { ... }; |title=경비병_NPC1 |if( !strcmp( temp, "title" ) ) |g_pText[Number].Title | |\n|~|npcid=1 |if( !strcmp( temp, "npcid" ) ) |g_pText[Number].NPCID | |\n|TEXT_INFO <br> STRUCT_TEXT::Text[MAX_TALK_SPEECH]; |focus=1 |if( !strcmp( temp, "focus" ) ) |g_pText[Number].Text[EmptyIdx].Focus = (char)Focus; |#define FOCUS_NPC 0 <br>#define FOCUS_USER 1 <br>#define FOCUS_PRAN 2 <br>#define FOCUS_MOB 3 |\n|~|emoticon=8 |if( !strcmp( temp, "emoticon" ) ) |g_pText[Number].Text[EmptyIdx].Emoticon = (char)Emoticon; |제한 조건 ; if( Emoticon <= 0 ) break; <br> cf. 외부 파일로 설정 |\n|~|animation=25 |if( !strcmp( temp, "animation" ) ) |g_pText[Number].Text[EmptyIdx].Animation = (char)Animation; | |\n|~|addstring=5 |text의 %s 문자 치환 |≒ 출력시 내부 함수를 통해 변환 <br> for( int k = 0; k < 4; k++ ) <br> g_pText[Number].Text[EmptyIdx].Put[k] = (char)AddString; |#define ADD_CHARNAME 1 // charname <br>#define ADD_CHARCLASS 2 // charclass <br>#define ADD_GUILDNAME 3 // guildname <br>#define ADD_NATION 4 // nationname <br> #define ADD_PRANNAME 5 // pranname |\n|~|text=맥스요? (직접 표현) <br> text=%s_!!! (치환) |if( !strcmp( temp, "text" ) ) |g_pText[Number].Text[EmptyIdx].Text <br> BASE_GetString( ... ); <br> BASE_UnderBarToSpace( ... ); |범위 제한 ; if( EmptyIdx >= MAX_TALK_SPEECH ) |\n|~| |내부적으로 옵션으로 사용 |g_pText[Number].Text[EmptyIdx].Reserved; |?? 파싱에서는 설정하지 않음 |\n|@@bgcolor(#fae3ee): EmptyIdx++; @@ | |>| | |\n\n\n#. emoticon 예\n|Index |Ani |Name |Desc |\n|0 |39 |경례 |씩씩하게 경례를 합니다. |\n|1 |40 |앉기 |앉아서 휴식을 취합니다. |\n|2 |42 |도발 |상대방을 도발하는 제스처를 취합니다. |\n|3 |59 |인사 |정중하게 인사를 합니다. |\n|4 |60 |박수 |"짝짝짝" 박수를 칩니다. |\n|5 |62 |승리 |승리의 환호를 지릅니다. |\n|6 |63 |울기 |세상이 자신을 버린듯한 표정으로 웁니다. |\n|7 |64 |웃기 |즐거운듯이 소리내어 웃습니다. |\n|8 |65 |춤추기 |즐겁게 춤을 춥니다. |\n|9 |43 |비굴 |비굴한 행동을 합니다. |\n|10 |61 |대화 |대화를 나눕니다. |\n\n\n\n
<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 16px;"> <b> 악성 인터넷광고 팝업창 </b> </span> ■ 20.04.16.\n</html>\nfind.relatedpop.com - 제거방법 ; https://ganjangsamsun.tistory.com/18\n\n\n<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 16px;"> <b> Internet Explorer 호환성 보기 </b> </span> ■ 19.11.20.\n</html>\n\n호환성 보기는 현재 사용하고 있는 브라우저 버전에서 기존 버전과의 호환성을 극복하기 위한 하나의 보완 수단이다.\n브라우저 11을 쓰는 사람이 브라우저 7, 8, 9 등에 최적화된 사이트를 이용할 때 발생하는 문제를 호환성 보기 옵션을 통해 최소화 할 수 있다.\n\n호환성 보기 체크\n1.도구 > 호환성보기 설정\n2.개발자 모드(F12)를 통한 브라우저 모드 변경\n\n\n<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 16px;"> <b> 익스플로러, 라이브서치 검색창 없애는 방법 </b> </span>\n</html>\n\n시작 > 실행 > pgedit.msc (로컬그룹정책편집기)\n\n로컬 컴퓨터 정책\n / 컴퓨터 구성\n / 관리 템플릿\n / Windows 구성 요소\n / Internet Explorer 항목 ; Internet Explorer 검색 상자 표지 금지 - 사용 선택\n\n
출처 ; http://m.gjnews.com/view.php?idx=14173\n@ 경주신문 기자 / 2007년 03월 05일\n\n< ? > 참고, 사진 링크 끊어짐\n@@bgcolor(#d7dedd): 일제때 와룡이 '와읍(臥邑)'으로 둔갑(?) @@\n\n 양북면 와읍으로 가기위해 덕동호와 황룡골짜기를 따라 굽이굽이 돌아가는 길옆 산자락에는 앙상한 나뭇가지를 헤치고 노란 산수유 꽃이 봄을 노래하고 있었다. 갓 태어난 복슬복슬한 강아지새끼처럼 귀여운 갯버들강아지들도 졸졸 흐르는 시냇물에 봄을 속삭이고 있었다. \n\n 와읍은 본래 마을 어귀에 솟아있는 동산(洞山)에서부터 거랑바닥까지 길게 내려와 누워있는 사발바위가 마치 용이 내려와 누워있는 것 같다고 하여 와룡(臥龍)이라고 하였다. 이 마을이 와읍(臥邑)으로 바뀐 것은 일제강점기인 1914년 행정구역 통·폐합 때의 일이다. 죽어서도 용이 되어 왜적을 막겠다던 문무왕의 수중릉과 용이 된 문무왕을 위해 지은 감은사가 지척에 있는 이곳에 와룡이 있다는 게 왜놈들에겐 못마땅했을 건 뻔한 이치다. 그래서 와룡을 슬그머니 와읍으로 바꿔버린 것은 아닐까? \n\n< ? >\n@@bgcolor(#d7dedd): 6개의 작은 마을로 이루어져 @@\n\n 이 마을은 또 기와굴이 있던 곳이라 ‘왓골’, ‘왯골’이라고도 불렀다. 경주에서 국도 4호선을 타고 추령재를 넘어 기림사와 골굴사의 입구인 안동을 지나면 와읍주유소가 있고, 와읍교가 나온다. 그 왼쪽 골짜기가 와읍이다. ''와읍은 ‘굴바우’, 능골‘, ’연당‘, ‘신리’, ‘공장마을’, ‘중테’ 등 6개의 작은 마을들이 모여서 이루어진 마을이다.'' 골짜기에서 흘러내리는 거랑을 중심으로 서편에 ‘굴바우’ 마을이 있고, 북쪽 골짜기로 더 들어가 용동교를 지나 오른쪽으로 ‘신리’가 있고, 그 안 골짜기에는 ‘공장마을’이 있다. \n\n 용동교에서 왼쪽으로 가면 용동과 권이리에 이른다. 와읍마을회관이 있는 굴바우에서 거랑 건너 동편에는 2004년에 들어선 ‘한전방제센타’가 있고, 그 동편 언덕배기에 ‘능골’이 있다. 능골에서 북쪽으로 등성이를 넘으면 ‘연당’이고, 동쪽으로 고개를 넘으면 ‘중테’에 이른다. \n\n 본래 이 마을은 1, 2리로 나뉘어 있었으나, 50여 년 전에 한 마을로 통합했다고 한다. \n\n 주로 벼농사에 의존하고 있고, 산간지역이다보니 밭이 많아 밭작물도 많이 한다. 가축은 한우 100두, 젖소 50두, 사슴 7두, 양 40두 등이다. 이 마을도 멧돼지, 노루 등 산짐승들에 의한 농작물의 피해가 크다고 한다. \n\n 와읍은 107가구에서 250명의 주민들이 생활하고 있다. \n\n@@bgcolor(#d7dedd): 내외가 함께 사는 다복한 ‘능골’ @@\n\n ''굴바우 마을 서쪽 산기슭에 굴바위가 있어 마을이름을 ‘굴바우’라 했다고 한다. ‘굴암(窟岩)’ 혹은 ‘굴암리(窟岩里)’라고도 한다.'' 능골 서북쪽에 있으며 와읍마을회관이 있다. (27가구) \n\n< ? >\n\n 능골 마을이 능선으로 둘러싸인 구릉 위에 있어 ‘능곡(陵谷)’, ‘능동(陵洞)’이라고 하며, 연당의 남쪽에 있는 마을이다. 또 능처럼 생긴 등성이에 마을이 둘러싸여 있다고 하여 그렇게 불렀다고도 한다. 요즘 대부분의 시골마을에는 할머니나 할아버지가 혼자 사는 집이 많은 편인데, 이 마을은 혼자 사는 사람은 한 집도 없고, 모두 내외가 같이 살고 있다는 다복한 마을이다. \n\n@@bgcolor(#d7dedd): 신리(新里) ‘새마을’이라고도 하며, 굴바우 북쪽에 70여 년 전에 새로 생긴 마을이다. (5가구) @@\n\n 공장마을 약 50년 전인 일제시대 때 이곳에 광산이 들어서면서 생긴 마을로 근처에 규조토 공장이 있으므로 ‘공장마을’이라고 한다. 굴바우 북쪽 골짜기 끝으로 예비군교장 아래에 있다. (7가구) \n\n<?>\n\n 당나무 마을 앞 등성이에 서있는 500여 년 된 느티나무로 이 일대에는 느티나무 4그루를 비롯한 울창한 숲이 조성되어있다. 매년 정월보름날 당제를 지내다가 당제를 모시는 사람 정하기가 어려워 10여 년 전부터 칠월칠석날 지낸다. (25가구) \n\n ''연당(蓮塘) 마을 한가운데 있는 못에 연꽃이 많이 피었으므로 마을이름을 ‘연당’이라 했다고 한다. 능골 위쪽에 있는 마을로, 예로부터 천석꾼이 나오는 명당과 장군이 나오는 명당이 있다고 한다.'' 그래서인지 당나라 장수 이여송(李如松)이 고개의 혈을 잘랐다는 이야기도 전해 온다. 마을 동북쪽 등성이가 잘록하게 잘린 채 대안골로 가는 길이 되어 있다. (18가구) \n \n 중기(中基) 마을의 모양이 마치 묘지와도 같으며, 마을 위치가 그 가운데 있다고 하여 ‘중터’ 혹은 ‘중기(中基)’라 부르게 되었다고 한다. \n\n 또 마을 가운데 묘지가 있다고 하여 그렇게 불렀다고도 한다. 지금도 마을 한가운데 함양박씨의 무덤이 자리하고 있었다. 중기는 어일에서 감포 노동으로 넘어가는 고개 옆에 있다. 위치상으로 볼 때 어일리에 포함되어야 하는데 와읍에 속해 있다. 행정구역 통폐합 당시 이 마을 어른들이 장테(어일장)로 가기 싫다고 하여 와읍으로 편입되었다고 한다. (20가구) \n\n@@bgcolor(#d7dedd): 매월 초하루 보름 분향 @@\n\n<?>\n\n ''우천서당(遇川書堂)'' 이간(夷簡) 이종생(李終生)과 우옹(遇翁) 이일형(李日馨)을 추모하여 그 후손들이 1974년 능골에 세운 재실이다. 이종생은 조선 정종의 제 6남 진남군(鎭南君)으로 예종 때 순충적덕보조공신(純忠積德補祚功臣)이다. 이일형은 이종생의 13대손으로 학문과 덕행이 뛰어나 종묘사예(宗廟司藝)에 추증되었으나 벼슬에 나아가지 않고 이곳 와읍으로 옮겨와 후진 양성에 크게 힘썼다. 경주에서 양북으로 가다가 와읍교에서 왼쪽으로 보이는 이 서당은 4칸 팔작지붕으로 둥근기둥에 가운데 마루를 배치하고 양쪽에 방을 두었으며, 공포를 설치한 전통건축양식으로 지었다. 뒤쪽에는 사당을 배치하였으며 매월 초하루와 보름마다 분향예배를 드린다고 한다. \n\n<?>\n\n 활수정(活水亭) 김제민(金劑民)이란 선비가 공부하던 곳이었는데 그 아들 계수(桂秀)가 추모하여 일제 때 연당에 세운 정자다. 연못이 내려다보이는 북편에 둥근기둥의 3칸 접집으로 지은 이 정자는 가운데 마루를 두고 양쪽에 방을 배치하는 방식으로 팔작지붕의 기와집이다. 정자를 지은 이가 김정철 전 경주시의원의 증조부이다. \n\n@@bgcolor(#d7dedd): 종일 햇볕이 드는 골짜기 @@\n\n 우리산 마을 뒤에 있는 큰 산. 중기 위쪽에 있는 마을 공동묘지가 들어선 산 일대를 ‘우리’라고도 한다. \n\n 동산(洞山) 능골 서편에 있는 동네 소유의 산으로 지금은 개인소유이지만 동산이라고 부른다. 와읍주유소 북쪽 산이다. \n\n \n\n닛골재 굴바우의 동북쪽에서 감포읍 노동리의 닛골로 넘어가는 고개. \n\n 도툿말재 연당의 동북쪽에서 감포읍 노동리의 도툿말로 넘어가는 고개. \n\n 토골 주일 안쪽에 있는 골짜기인데 왜 토골인지는 모른다. \n\n 중산골 옛날에 절이 있었던 골짜기라 ‘중산골’이라고 하는데 절은 빈대 때문에 불태웠다고 전한다. \n\n 대안골 골짜기가 크고 논이 많은 연당 뒤쪽 안 골짜기이다. 이여송이 잘랐다는 등성이 사이로 난 길을 통해 드나든다. \n\n 수제골 연당 북쪽 골짜기로 약물내기가 있다. \n\n 주일골 산골짜기이지만 하루 종일 해가 든다고 해서 ‘주일골’이라고 한다. 그 안 골짜기에 일제 때에 막은 못이 있다. \n\n 쌍저(雙猪)골 두 마리 돼지가 누워 있는 형상을 한 골짜기로, 연당 동북쪽에 있다. \n\n@@bgcolor(#d7dedd): 용바위 깨어지고 그 흔적만 @@\n\n 사발바우 사발 모양으로 생긴 바위로, 굴바우 마을 어귀의 거랑 가에 있다. 본래 이 바위는 마치 용이 누워있는 형상이라 하여 ‘와룡’이라고 했던 바위와 연결되어 있었다고 한다. 즉 동산에서 지금의 와읍거랑을 가로질러 사발바위까지 하나의 긴 바위로 연결되어 있었던 것이다. \n\n 그러나 50여 년 전인 일제강점기에 이 바위를 깨고 거랑을 이쪽으로 돌리면서 훼손되고 지금은 아랫부분만 남아 있다. 거랑 가운데에 그 흔적이 있다. \n\n ''굴바우 굴이 있었던 바위로, 굴암리에 있다. 굴암(窟岩)이라고도 한다.'' 마을 주민들은 이 바위가 사발바위와 같은 것이라고 한다. \n\n 수캐바위 개가 앉아 있는 형국의 바위로 주일 못 안에 있다. 그 곁에 암캐바위도 있었는데 지금은 떨어지고 없다. \n\n 평풍바위 주일골에 평풍처럼 생긴 바위로 주일 못 안에 있다. \n\n@@bgcolor(#d7dedd): 일요일 공휴일에 서는 와읍장 @@\n\n 주일(晝日)들 연당의 북쪽에 있는 들. 종일 햇빛이 잘 드는 양북의 곡창지대이다. \n\n 두들 연당의 서쪽 언덕에 위에 있는 들로 모두 밭이다. \n\n@@bgcolor(#d7dedd): 주일못 일제시대에 막은 주일 안 골짜기의 못 @@\n\n<?> \n\n 월성원자력방제센타 2004년도에 능골 우천서당 뒤쪽에 들어선 월성원자력 방제센타이다. \n\n 와읍장 와읍마을 어귀의 다리 옆 공터에는 매주 일요일과 공휴일마다 서는 시골장이 관광 객들의 인기를 끌고 있다. 몇 년 전부터 마을 할머니들이 산나물과 채소 등을 이곳에서 팔기 시작하면서 생긴 장으로 지금은 괘나 알려져 제법 성황을 이루고 있다. \n\n\n@@bgcolor(#d7dedd): 자연에 순응하는 장수마을 @@\n\n 산등성이와 계곡 여기저기에 이루어진 작은 마을들이 모여 이루어진 와읍은 예로부터 자연에 순응하면서 살아온 탓일까? 마을주민들의 인심이 좋다고 한다. 산 좋고, 물 맑아, 살기 좋은 마을이며, 장수마을이다. 250명의 주민 중에 90살 넘은 어른이 6분이나 계신다. \n\n 마을간 연결도로가 좁고, 가팔랐지만 주민들은 절실하게 바라는 숙원 사업은 없다고 했다. 능골에 경로당을 짓는 일이 숙제였지만 그 마저도 올 3월에 지을 예정이란다. \n\n 이 마을 최고령자는 연당마을 어귀에 사는 권봉선(전호댁·95) 할머니로 아직 허리조차 굽지 않아 지팡이가 필요 없고, 일상대화는 물론 농담도 곧 잘 하실 정도로 정신도 맑고 아주 건강한 상태였다. 할머니의 건강비결은 채식위주로 적게 먹고, 열심히 일 하는 것이라고 했다. 아직도 쑥 캐고, 밭도 맨다고 한다. \n \n 이 마을 출신으로는 이방희(81·전 양북면장), 허진상(66·서화가 연진미술 장원), 김정철(63·전 경주시의원), 이재준(58·청송 진보중·고등학교 교장), 이재천(57·예비역 육군 준장), 이재근(54·부산대 교수), 이재관(51·부산 내과의원) 등이 있다. \n\n 친절한 마을 안내에서 후한 점심까지 대접해주신 황판술 이장님과 이재병 노인회장님께 감사드린다. \n
신도(神道)란 죽은 사람의 묘로(墓路)를 뜻하며, 신도비란 임금이나 고관의 업적을 기리기 위하여 무덤 앞 또는 무덤으로 가는 길목에 세운 비석을 가리킨다. 우리나라에서는 임금이나 고관의 무덤 동남쪽에 남쪽을 향하여 세운다.\n\n신도비를 묘의 동남쪽에 세우게 된 것은, 지리가(地理家)의 말에 따르면 동남쪽을 신도라 하기 때문이다. 후한(後漢) 때에는 묘 앞에 길을 트고 석주(石柱)를 세워 표하였던 것을 신도라 칭하였으나, 진송 이후 비각(碑刻)하게 되었다.\n\n신도비는 7, 8척(尺)되는 큰 비를 세우고 이수(螭首)·귀부(龜趺)로 장식해 위용을 보인다. 대체로 비의 덮개 부분인 개석(蓋石), 비문을 새긴 비신(碑身), 비신을 꽂아 세우는 기대(基臺)로 구성되며, 기대 아래에 비 전체를 받치는 대좌*(臺座)가 있는 예도 간혹 있다. \n\n유래 (from 위키백과)\n* 중국 : 진송(晋宋, 5세기초) 때 비롯되어 천자 및 제후들이 모두 신도비를 세웠다. 처음에는그 각문(刻文)이 다만 '모제(某帝)' 혹은 '모관신도지비(某官神道之碑)'라고 하였다. 그러다가 한(漢)나라 양진(楊震) 때 종2품 이상의 관계(官階)를 지녔던 사람에 한하여 세웠다. 고대위양공지신도비(故大尉楊公之神道碑)가 전해 내려온다.\n* 대한민국 \n** 고려 : 《동문선(東文選)》 등의 문집에 비문(碑文) 형태로 전하며 당시는 3품 이상의 관직자 무덤에 세운 것으로 추정된다.\n** 조선 : 우리나라의 신도비는 조선시대 왕릉의 신도비로서 태조의 건원릉신도비(建元陵神道碑)와 세종의 영릉신도비(英陵神道碑)가 있다. 정2품 이상에 한하여 세우는 것으로 제도화지만 문종은 왕릉에 신도비를 세우는 것을 법으로 금지하였고, 공신이나 석학(碩學) 등에 대하여는 왕명으로 신도비를 세우게 하였다. 따라서, 우리나라의 사대부의 신도비는 그 수가 헤아릴 수 없이 많다.\n\n\n참고; 위키배과, 한국민족문화대백과사전, 월간미술\n\n
위치 : 대구광역시 수성구 파동 425\n\n<html><span style="background:#E2E2ff ; font-family:돋움; font-size: 14px;"> <b> 옥산전씨(玉山全氏) </b> </span></html>\n옥산전씨(玉山全氏)의 시조 전영령(全永齡)은 도시조(都始祖) 전섭(全聶:환성군)의 27세손이다. 그는 고려 신종 때 신호위대장군(神虎衛大將軍)으로 공을 세워 옥산군(玉山君.지금의 경산)에 봉해졌다. 그래서 후손들이 정선전씨(旌善全氏)에서 분적, 그를 시조로 하고 본관을 옥산(玉山)으로 하여 세계를 이어오고 있다.\n\n옥산군 01세/ 환성군 27세\n옥산군 25세/ 환성군 51세\n\n\n<html><span style="background:#E2E2ff ; font-family:돋움; font-size: 14px;"> <b> 무동재(武洞齋)는 玉山人(옥산인) </b> </span></html>\n通訓大夫行平海郡守 全由性, 忠順衛贈通訓大夫通禮院左通禮 全順孫, 贈通政大夫兵暫參議 全益堅, 禦侮將軍呂島萬戶 全復堅, 贈資憲大夫兵曹判書 겸 義禁府事 全璉, 機張縣監 全琛, 都事 號 洗心亭 全應昌, 嘉善大夫行平安兵使 贈資憲大夫 兵曹判書 號 巴 全繼信, 司諫院正言 司憲持平 號 溪東 全慶昌의 薺宿之所. \n\n(통훈대부행평해군수 전유성, 충순위증통훈대부통례원좌통례 전순손, 증통정대부병잠참의 전익견, 어모장군려도만호 전복견, 증자헌대부병조판서 겸 의금부사 전련, 기장현감 전침, 도사 호 세심정 전응창, 가선대부행평안병사 증자헌대부 병조판서 호 파수 전계신, 사간원정언 사헌지평 호 계동 전경창)의 제숙지소이다. \n\n1900년에 창건하고 1978년에 重建(중건)하였다.\n창건당시는 草家(초가)였고, 일부기록에는 巴山齋(파산재) 또는 파재란 異名(이명)도 있다.\n<html><DIV>\n<P style="TEXT-ALIGN: center; LINE-HEIGHT: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" \nclass=MsoNormal align=center>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/20200112_무동재.png" width=640> </SPAN> <br>\n<SPAN style="COLOR: #2b5600"> 2020.01.12. 무동재 </SPAN></p>\n</DIV></html>\n<html><span style="background:#E2E2ff ; font-family:돋움; font-size: 14px;"> <b> 계동 전경창은 </b> </span></html>\n조선 중종 27년(1532) 임진 정월 9일에 대구의 수성 파잠(巴岑: 지금의 파동)에서 태어났으며 1585년(선조 18) 54세에 한양에서 지병으로 타계 하였는데 향년 54세였다. \n\n부친은 장사랑(將仕郞, 보첩에는 통덕랑) 전순(全珣: 1497-1536)이고 모친은 김해송씨(金海宋氏)이다. \n\n옥산전씨는 고려조에 신호위(神虎衛) 대장군을 역임한 옥산군(玉山君) 전영령(全永齡)을 시조로 삼는다. 옥산은 지금의 경산의 고지명이다. 6대를 내려와 7세(世) 문평공(文平公) 전백영(全伯英: 1345~1412)은 정몽주의 문인으로 고려조에 등과하여 조선 태종조에 경상도와 경기도 관찰사, 예조판서를 역임하였는데 전경창의 5대조이다. 이분이 경산의 고모에서 파잠으로 이사하여 대대로 이곳에서 살게 되었다. 고조 전유성(全由性)은 평해군수이고, 증조 전순손(全順孫)은 충순위이고, 조부 전복견(全復堅)은 여도만호(呂島萬戶)이다.\n...\n계동선생은 24세인 1555년(명종 10) 진사시에 합격하여 성균관에 들어가서 공부했다.\n\n그 후 1561년(명종 16) 임하 정사철의 연화재(煙花齋)를 방문하여 주자서를 강론하였으며 1564년(명종 19) 매암 등과 연경서원을 창건하고, 1566(명종 21) 35세 때에 모당(慕堂) 손처눌(11세)과 태암(苔巖) 이주(11세)가 공에게 배움을 청했다. 이 때 아호를 계동 즉 신천의 동쪽에 기거한다는 의미로 사용했다. 또한 낙재 서사원(17세)과 괴헌 곽재겸(20세)이 찾아옴으로 각기 <심경>과 <근사록>을 주었다.\n\n1571년(선조 4) 연정 서형, 남간 서식 형제와 송탄(송담) 채응린이 청하여 청하 내연산을 유람했다. <유산록(遊山錄)>을 남겼으나 임란 때 유실되었다고 한다.\n\n1572년(선조 5) 형 응창이 문과에 합격하고 이듬해인 1573년(선조 6) 그의 나이 42세 비교적 늦은 나이에 그 역시 문과에 급제했다.\n\n1575년(선조 8) 출사해 경주, 진주교수를 시작으로 성균관 학록, 정자, 예문관 검열 겸 춘추관 기사관, 대교, 봉교를 거처 1581년 병조좌랑(정 6품)에 올랐다. \n\n이 때 그때까지 일반사신이 겸하든 종계변무(宗系辨誣)업무를 전담사신이 담당해야 한다고 상소를 올리자 이를 선조가 받아들여 성사시켰다. 종계변무란 반대파가 태조 이성계의 아버지가 이인임이라고 명나라에 허위로 고발하여 이것이 문서로 굳어지면서 조선왕실의 정통성이 훼손되자 개국 후 200여 년 간 수차례 사신을 보내 시정을 요구했으나 이루지 못했던 일이었다. \n\n이후 영변 통판을 역임하고 다시 내직으로 돌아와 예조좌랑, 사간원 정언을 거쳐 사헌부 지평, 호조정랑(정5품) 등에 제수되었으나 병으로 나아가지 아니하다가 1585년(선조 18) 54세에 한양에서 돌아가셨다.\n\n1590년(선조 23) 종계변무 원종공신으로 녹훈되고 홍문관 응교(정4품)로 증직되었으며 1635(인조 13)연경서원 방묘(榜廟)에 봉안되었다.\n\n조선 말기 대구의 거유였던 임제(臨霽) 서찬규(徐贊奎, 1825~1905)는 계동을 일러 ‘대구지역의 유학은 계동선생으로부터 시작되어 발전했다.’라고 했다. \n\n그 후 공의 제자들은 성주와 대구에서 활동하든 한강(寒岡) 정구(鄭逑, 1543~1620) 문하에 흡수되면서 대구의 문풍을 진작시키는데 크게 기여했으며 저서로 <계동집>이 있다.\n\n이런 점에서 계동선생은 정구에 의해 소위 한강학단이 이루어지기 전까지 손처눌이나 서사원 등을 통해 대구 유학에 디딤돌을 그것도 아주 튼튼하게 놓은 분으로 자리매김 될 수 있다.\n...\n계동 전경창 선생은 조선조 후기를 거치면서 대구지역의 주요 문중을 형성하여 대구지역의 유학을 발전시켜 왔다. \n\n최근 2009년에는 방손(傍孫)이자 대구향교의 원로위원이신 전광섭 옹과 영수, 병걸, 봉진, 현수 등이 선생의 묘소가 있는 산하 무동재(武洞齋) 곁에 선생의 유적비를 세웠다.(선생은 후사가 없다.)\n\n▶ http://www.grandculture.net/daegu/toc/GC40000055 - 파동의 계동정사와 대구유학 / 대구역사문화대전\n...\n''[개설]'' \n대구유학(大邱儒學)은 전경창(全慶昌)[1532~1585]의 계동정사(溪東精舍)에서 시작되었으며, 계동정사는 대구유학의 출발점이다.\n\n''[전경창과 계동정사]''\n...\n전경창은 30여 세에 안동 예안의 계상서당(溪上書堂)으로 가서 퇴계(退溪) 이황(李滉)의 문하에서 공부하였다. 전경창이 이황에게 수업한 것은 『도산급문제현록(陶山及門諸賢錄)』에 수록되어 있다. 전경창은 계상에서 돌아온 후 성주의 가야산으로 들어가 1년 동안 홀로 공부하고 돌아왔다. 당시에 대하여 제자인 손처눌(孫處訥)은 「계동행록(溪東行錄)」에서 다음과 같이 말하고 있다.\n\n“늦게 퇴계 이황의 풍모를 듣고 사모하고 감발하였다. 그래서 『심경(心經)』, 『근사록(近思錄)』, 『주자서(朱子書)』를 가지고 가야산에 들어가 문을 닫고 고요히 거처하면서 새벽에 일어나 세수하고 머리 빗고 종일 바르게 앉아 구부려 읽고 우러러 생각하며 침잠반복(沈潛反覆)하며 그 귀추를 연구하여 스스로 터득하기를 기약하였다. 그런 후 한 해가 지나서 돌아왔다.”\n \n손처눌이 기록한 짧은 글에서 전경창이 독실히 학업에 매진한 것을 알 수 있다. \n\n퇴계 문하에서 가르침을 받고 가야산에 들어가 공부하고 돌아온 이후 전경창의 명성이 널리 알려졌던 것으로 보인다. 1566년(명종 21) 35세 되는 해에 자신의 서재를 ‘계동정사’라고 하고 강학을 하며 후학을 양성하게 된다.\n\n▶ https://ljw1674.tistory.com/18302208 - 대구출신 옥산인 계동 전경창(대구의 인물) / 이정웅 2011. 1. 8. 20:24\n...\n평소 알고 지내던 전병견(경산시경계산행협의회)회장으로부터 구본욱 대구향교 장의를 소개 받아 ‘조선중기이후 대구지역의 유학과 관련하여’라는 부제가 붙은<계동 전경창 선생의 연보작성을 위한 시론>이라는 소책자를 받아보고\n...\n구(具) 장의에 의하면 당시 대구에 사는 사람으로 ‘도산급문제현록’에 등재된 사람은 계동(溪東) 전경창(全慶昌, 1532~1585)과 추월헌(秋月軒) 채응룡(蔡應龍, 1530~1574) 두 분뿐이었다. 그러나 추월헌은 본디 대구사람이기는 하되 아버지 채증이 을사사화로 벼슬(예조정랑)에서 물러나 안동 임하에 정착 ,그곳에서 출생 도산에 수학하였고 아버지가 돌아가시자 다시 대구로 옮겨 살았다고 하니 실제 대구 출신은 계동선생 한 분 뿐이었다.\n\n\n\n\n\n<html><span style="background:#E2E2ff ; font-family:돋움; font-size: 14px;"> <b> 전계신(全繼信) ; 1562년 ~ 1614년 </b> </span> </html>\n 조선후기 경상도우후, 함안군수, 첨지중추부사 등을 역임한 무신. (출처 ; 한국민족문화대백과사전)\n<<<\n+++[ 자는 여중(汝重), 호는 파수(巴叟). ]\n부친은 사재감정(司宰監正) 전련(全璉)이다. 1594년(선조 27) 무과 별시 병과에 급제하였다.\n\n1602년(선조 35)에 경상도 동래소모진(東萊召募陣) 천총(千摠)으로 근무 중 경상도체찰사 이덕형(李德馨)의 추천에 의하여 승려 유정(惟政)을 따라 일본에 사신으로 다녀왔다. 이 공으로 첨지중추부사가 되었고, 1604년에는 경상도우후(慶尙道虞候)가 되었다.\n\n1609년 일본의 도쿠가와 이에야쓰[德川家康]가 조선과 화친을 꾀하여 통신사의 파견을 요구해오자 1606년(선조 39) 일본의 사정을 알아보기 위한 사절로서 조훤(趙暄)·손문욱(孫文彧) 등과 함께 대마도에 건너가 일본 측의 의사를 타진하고 돌아왔다. 이후 1607년(선조 40) 첨지중추부사와 함안군수를 역임하였다.\n\n1614년에 사망하였다. 전계신을 추모하기 위해 화강서당(花岡書堂)이 건립되었다. 시문집으로 『파수실기(巴叟實紀)』가 있다.\n===\n<<<\n\n
■ table, tr, td 공통 속성\n|width |table, tr, td 넓이 |\n|height |table, tr, td 높이 |\n|bgcolor |table, tr, td 바탕색 |\n|background |table, tr, td 배경이미지 |\n|align |table, tr, td 수평정렬 ; left , center , right 중에 하나 |\n|valign |table, tr, td 수직정렬 ; top , middle , bottom 중에 하나 |\n|style |CSS 스타일쉬트 기능으로 정밀하게 꾸미기 |\n\n■ table~ / table 에만 있는 속성\n|>|border |테이블 경계선 두께 |\n|>|frame |border="1" 이상일 때, 표 외곽선의 외부 테두리 제어 |\n| |above | 바깥쪽 경계선 중 윗쪽만 나타남 |\n| |below |바깥쪽 경계선 중 아래쪽만 나타남 |\n| |border |기본적인 외곽선 |\n| |hsides |바깥쪽 경계선 중 위아래만 나타남 |\n| |Lhs |바깥쪽 경계선 중 왼쪽만 나타남 |\n| |rhs |바깥쪽 경계선 중 오른쪽만 나타남 |\n| |vside |바깥쪽 경계선 중 좌우만 나타남 |\n| |void |외곽선이 나타 나지 않음 |\n|>|rules |border="1" 이상일 때, 표 외곽선의 내부 테두리 제어 |\n| |cols |열 사이의 경계선만 그림 |\n| |rows |행 사이의 경계선만 그림 |\n| |none |표 외곽선을 제외한 내부 셀 경계를 모두 지움 |\n| |all |표 외곽선을 포함한 내부 셀 경계를 모두 그림 |\n| |group |<tbody>, <tfoot>등 그룹들 안의 경계선을 설정 |\n|>|bordercolor |테이블 경계선 색상 |\n|>|bordercolorlight |테이블 경계선 색상의 밝은 부분 |\n|>|bordercolordark |테이블 경계선 색상의 어두운 부분 |\n|>|cellpadding |열(셀) 내부에서의 내용물이 경계선으로부터 떨어저야 할 여백 |\n|>|cellspacing |각 열(셀) 들간에 떨어져야 할 여백 |\n|>|style |스타일 시트 입력 |\n <table style="border: #000000 1px solid"> // 게시판에 따라서 제대로 표시 되지 않을 수 있음\n\n■ td~ / td 에만 있는 속성 \n|colspan |칸을 열로 합치기 |\n|rowspan |칸을 행으로 합치기 |\n\n■ thead, tfoot, tbody 태그\n|thead |표의 머리글 역할, <th>태그를 이용 |\n|tfood |표의 바닥글 역할 |\n|tbody |본문이 들어가는 행의 묶음 |\n 코딩 순서 : thead -> tfood -> tbody\n 위와 같은 순서로 코딩하더라도 화면 출력시 thead -> tbody -> tfood 형식으로 출력\n \n 표 출력시 페이지가 넘어갈 경우, thead, tfood 부분이 반복 인쇄가 된다.\n thead, tfood는 하나의 테이블에 하나만 존재해야 하지만,\n tbody는 여러 개 존재 가능하다.\n\n■ TABLE의 TD 고정/배경이미지 고정하는 법\n1. 테이블 고정\n <table width=100px height=5px style="table-layout:fixed">\n <tr>\n <td>\n <div style="width:100%;height:100%;overflow:auto;">\n 여기 내용이 테이블 길이보다 길어지면 스크롤바가 생기게 됨.\n </div>\n </td>\n </tr>\n </table>\n\n2. td안의 텍스트 길이 고정\n <td height="auto" style="word-break:break-all">\n 글자가 테이블길이만큼 쓰여지고 나머지는 다음줄에 이어서 쓰여짐.\n </td>\n\n3. tag 설명\n3-1. style="table-layout:fixed"\n 테이블의 크기를 가로세로 모두 고정시킴.\n\n3-2. style="word-break:break-all;"\n 고정된 테이블에 긴 글을 넣을경우 가로가 고정되어 있으므로 글자가 잘려 보이는 경우가 발생.\n 이것을 방지하고 글의 자동 줄바꿈 효과\n\n3-3. height="auto" \n 고정된 테이블의 세로때문에 글이 고정된 세로길이까지만 보인다.\n 이것을 방지하기위해 세로의 길이를 오토로 조정해줌\n\n\n\n\n
출처 ; 뿌리정보미디어 > 새소식 , 2018-08-31\nhttp://www.yesjokbo.com/php/board.php?board=yesnews&page=2&command=body&no=184 \n\n옥산전씨대종회와 뿌리정보미디어사는 2018년 6월 14일 옥씨전씨대동보 발간과 종회 홈페이지 및 인터넷족보 구축 계약을 체결하고 현재 족보 입력 및 수단접수를 병행하여 시행하고 있다.\n금번 발간하는 대동보는 1988년 대동보 발간 이후 약 30년만에 발간하는 대동보로서 기존 한자로 된 족보를 누구나 쉽게 읽을 수 있도록 국역화 하여 편찬한다.\n더불어 한자와 족보를 잘모르는 후손들에게 효과 뿌리교육, 인성교육에 활용하고자 종회 홈페이지와 인터넷족보를 병행하여 구축하고 있다.\n옥산전씨 인터넷족보는 컴퓨터와 휴대폰 모두 열람할 수 있도록 구축하여 세계곳곳에 살고있는 옥산전씨 후손들이 선조님의 훌륭한 업적을 보고 배워 옥산전씨 후손으로서 자긍심을 갖도록 하는데 있다.\n따라서 많은 후손들이 금번 대동보에 수록될 수 있도록 노력해야 할 것이다.\n족보에 등재하고자하는 후손은 전화문의 또는 종회 홈페이지와 안내문 등을 참조하여 족보등재신청서를 작성한 후 대종회로 접속하면 다음달에 자기의 족보를 컴퓨터나 휴대폰으로 열람할 수 있으며, 추후 대동보에도 수록된다.\n홈페이지 주소: www.옥산전씨.com\n\n
<html><span style="background:#E2E2ff ; font-family:돋움; font-size: 12px;"> <b> #.경상북도 경주시 양북면 용동리 산334-1 </b> </span></html>\n2019.11.18.(월) 석축 작업 ; 700만원 (⇒ 도ㅇ) \n / 12.10.(화) 석축 1줄 쌓음 ; ''비용 620만원 사용'' ⇒ 12.27.(금) 80만원 돌려받음\n2019.11.30.(토) 고조부(구현, ∵ 멧돼지), 증조부(성락), 시골 큰집 할아버지 도래석 설치\n / (140 X 2)/ (울산)10명 ≒ 30 + 140\n / (울산) 도ㅇ, 부ㅇ, (영주) 화ㅈ 참석 (⇒ 10만원 찬조금)\n\n\n+++[#.인터넷 족보 ]\n2018.06.14.(금) 뿌리정보미디어사와 옥씨전씨대동보 발간과 종회 홈페이지 및 인터넷족보 구축 계약을 체결\n / 08.31.(토) 뿌리정보미디어 > 새소식, 내용 등재 ; [[옥산전씨대동보 편찬 작업 중~]]\n2018.09.10.(월) 대동보 발간관련 자료 다운로드 (in 수ㅎ)\n2018.11.18.(일) 수월산 세무 할아버지, 시사 (∵ 11월 3주 일요일)\n / 등재 양식 복사본 (in 수ㅎ), 집안에 배포\n ⇒ 울산 도ㅇ 아제\n\n----------------------\n2019.05.05.(일) 대종회 정기총희 (in 학명제) \n\n2019.09.01.(일) 고모집 방문 (∵ 오후 5시 주례, 동해 횟집)\n ⇒ 09.03.(화) 고모, 족보 수정 내용 ; 학명제로 등기로 발송 (by 미ㄱ) cf.두달 후에 수정 확인\n\n2019.09.13.(금) 추석 때, 도ㅇ 아제에게 세무 할아버지 등 주소 확인이 필요하다는 의견 전달 ⇒ 현재, 주소로 변경\n\n2019.11.04.(토) 학명제 시사 (∵ 11월 1주 토요일)\n\n2019.11.17.(일) 수월산 시사 (∵ 11월 3주 일요일)\n ⇒ 12.01.(일) 음 11.05. 시사\n===\n\n\n<html><span style="background:#E2E2ff ; font-family:돋움; font-size: 12px;"> <b> #.2019.12.18.(수) 현재 </b> </span></html>\n+++[20세 정규(井圭) ▼]\n++++[21세 인현(麟鉉)]\n++++[22세 기락(畿洛) ; 포항 대신 / 2권 732]\n=== <html> <!-- 22세 기락 --> </html>\n=== <html> <!-- 21세 인현 --> </html>\n+++[21세 봉현(鳳鉉)]\n=== <html> <!-- 21세 봉현 --> </html>\n++++[21세 구현(龜鉉)]\n(22세 기락(畿洛) ⇒ 21세 인현 )\n+++[22세 종락(鍾洛) ; 영주 하망 / 2권 739]\n=== <html> <!-- 22세 종락 --> </html>\n+++[22세 성락(成洛) ; 울주 두산 / 2권 746]\n=== <html> <!-- 22세 성락 --> </html>\n=== <html> <!-- 21세 구현 --> </html>\n+++[21세 용현(龍鉉)]\n=== <html> <!-- 21세 용현 --> </html>\n=== <html> <!-- 20세 정규 --> </html>\n+++[20세 대규(大圭) ]\n=== <html> <!-- 20세 대규 --> </html>\n
출처 ; Microsoft | Office 제품\n\n다음 Office 버전은 Windows 10에서 완전히 테스트되었으며 지원됩니다. 이러한 Office 버전은 Windows 10으로의 업그레이드를 완료한 후에도 계속 컴퓨터에 설치됩니다. \n\nOffice 365(버전 16)\nOffice 2019(버전 16)\nOffice 2016(버전 16)\nOffice 2013(버전 15)\nOffice 2010(버전 14)\n\nOffice 2007(버전 12)은 더 이상 일반 지원에 속하지 않으며 Windows 10에서 테스트되지 않았습니다. 그러나 Office 2007은 Windows 10에서 설치 및 실행됩니다. \n\nOffice 2007 이전 버전의 Office는 더 이상 지원되지 않으며 Windows 10에서 작동하지 않을 수 있습니다. 최신 Office 버전으로의 업그레이드에 대한 옵션을 보려면 Office 선택을 참조하세요.\n\n참고. \nExcel 2003에서 작성된 매크로, Excel 2007에서 매크로를 실행하면 경우에 따라 에러 발생\n ⇒ Excel 2003의 sheet와 매크로를 복사해서 Excel 2007 파일을 새로 구성\n(Office) Excel 2010 설치 ; Excel 2003에서 작성된 매크로 정상적으로 작성 (∵ 보이지 않던 메시지가 발생)\n\n
@@bgcolor(#f2f2ff): ANNO 시리즈 ; 실시간 도시 건설·전략 게임 @@\n ≒ 문명과 대항해시대, 심시티를 합친 게임\n| 시리즈 | 제작사 | 비고 |\n|!• 본편 시리즈 |>|!연도의 모든 자릿수를 합하면 9가 되게끔 제목을 짓는다는 게 특징 |\n| Anno 1602 (1998)|Max Design 제작 | |\n| Anno 1503 (2003)|Max Design 제작 | |\n| Anno 1701 (2006)|Related Designs 제작 | |\n| Anno 1404 (2009)|Blue Byte Software, Related Designs 공동제작 | |\n| Anno 2070 (2011)|Related Designs, Ubisoft Blue Byte 공동제작 | |\n| Anno 2205 (2015)|Ubisoft Blue Byte 제작 |달 개척을 위시한 우주 개발 |\n| Anno 1800 (2019)|Ubisoft Blue Byte 제작 |2019년 4월 16일 발매, 유일한 정식 한글 출시작으로 산업 혁명 시대를 배경 |\n|!• 외전 |>|! |\n| Anno 1701: Dawn of Discovery (2007)|닌텐도 DS 발매, Keen Games 제작| |\n| Anno: Create A New World (2009)|Wii 발매, Keen Games 제작 | |\n| Anno Online (2013)|Anno 1404를 기반으로 한 Anno 시리즈의 웹 게임 버전 | |\n\n
위치 ; 경상북도 경산시 남천면 대명길 33-8 (경상북도 경산시 남천면 대명리 201)\n\nhttp://www.옥산전씨.com/ - 옥산(경산)전씨대종회 > 인터넷족보\nhttp://www.yesjokbo.net/jokboroot/new_default.asp - 옥산전씨대종회 인터넷 족보\n\n<html> <span style="background:#f2f2ff; font-size: 12px;"> <b> #. 환성군(歡城君) 단소(壇所) </b></span> </html>\n • 서울특별시 동대문구 이문1동 산15-1 (경희대로 26)\n • 충청남도 천안시 동남구 풍세면 삼태리 219번지 (금호1길 117-10)\n ; 전씨시조단소 및 재실 (충남 도문화재 제297호)\n\n-. 단소(壇所) ; 묘가 없을 경우 제향을 위해 만드는 시설\n-. 환성은 천안의 옛 지명이며, 천안시 서남향에 있는 풍세일대이다.\n\n<html><span style="background:#E2E2ff ; font-family:돋움; font-size: 14px;"> <b> 옥산전씨(玉山全氏) </b> </span></html>\n옥산전씨(玉山全氏)의 시조 전영령(全永齡)은 도시조(都始祖) 전섭(全聶:환성군 歡城君 )의 27세손이다. 그는 고려 신종 때 신호위대장군(神虎衛大將軍)으로 공을 세워 옥산군(玉山君.지금의 경산)에 봉해졌다. 그래서 후손들이 정선전씨(旌善全氏)에서 분적, 그를 시조로 하고 본관을 옥산(玉山)으로 하여 세계를 이어오고 있다.\n\n옥산군 01세/ 환성군 27세\n옥산군 25세/ 환성군 51세\n\n<html> \n<div style="border: 1px solid #3058D2; padding: 10px;">\n<span style="font-size: 14px;"> </span> </div> </html>\n▣ [[달성 한천서원(寒泉書院)]] ; 대구광역시 달성군 가창면 행정리 870번지 (가창동로 117)\n ; 고려개국공신 태사(太師) 충렬공(忠烈公) 전이갑(全以甲)과 충강공(忠康公) 전의갑(全義甲) 형제를 배향하는 곳이다\n\n▣ ''@@color(#3058D2): 박곡서당 @@'' ; 대구광역시 달성군 가창면 가창동로 219-5 (가창면)\n<html>\n<img src="http://www.gingaminga.com/wiki/pds/GalleryMacro/20200112_박곡서당.png" height="140" onClick="javascript:window.open('http://www.gingaminga.com/wiki/pds/GalleryMacro/20200112_박곡서당.png','screenshot','width=420, height=500');"STYLE=cursor:hand; TITLE='클릭하면 큰 이미지를 표시 합니다.'>\n2020.01.12. \n<img src="http://www.gingaminga.com/wiki/pds/GalleryMacro/20200112_박곡서당02.jpg" height="140" onClick="javascript:window.open('http://www.gingaminga.com/wiki/pds/GalleryMacro/20200112_박곡서당02.jpg','screenshot','width=1024, height=430');"STYLE=cursor:hand; TITLE='클릭하면 큰 이미지를 표시 합니다.'>\n \n<img src="http://www.gingaminga.com/wiki/pds/GalleryMacro/20200112_박곡서당_강당_승정당.jpg" height="140" onClick="javascript:window.open('http://www.gingaminga.com/wiki/pds/GalleryMacro/20200112_박곡서당_강당_승정당.jpg','screenshot','width=1024, height=511');"STYLE=cursor:hand; TITLE='클릭하면 큰 이미지를 표시 합니다.'>\n</html>\n문평공(文平公) 파계(巴溪) 전백영(全伯英)의 추모소(追慕所)인데 1965년 2월에 건립하였는데 유계(儒契)가 있다. <br>\n서당 앞에는 1989년 정헌대부 예조판서 지의정부사 문평공 파계 전선생 신도비(神道碑)(正憲大夫 禮曹判書 知議政府事 文平公 巴溪 全先生 神道碑)를 건립하고 성산인(星山人) 이헌주(李憲柱)가 비문을 썼다.\n\ncf. 유계(儒契) ; 문인이나 유생들이 조직한 친목계의 일종\n\n▶ ''@@color(#C89342): 장인 기린 사위 둘 '700년 가연'…가창 박곡서당 '강선계' @@ '' / 매일신문 2013.05.20. ( https://news.imaeil.com/page/view/2013052010170343138 )\n''옥산 전·아산 장·밀양 박씨 매년 시제·묘사 함께 봉행, 동문수학 하며''\n...\n두 사위가 장인을 기리는 마음에서 출발한 인연이 세 가문의 후손들에 의해 700여 년 세월 동안 이어지고 있어 '세상 인정 바뀌는 게 출렁이는 파도'와 같은 요즘 세태에 귀감이 되고 있다.\n\n19일 대구시 달성군 가창면 상원리 박곡서당(樸谷書堂)에선 ''옥산 전(全)씨'', ''아산 장(蔣)씨'', ''밀양 박(朴) 씨'' 세 가문 후손 100여 명이 '강선계'(講先契)를 열었다. 강선계는 가문의 인연을 잇고 선조를 추모하며 유지를 받든다는 취지로 매년 음력 4월 10일 세 가문이 번갈아 개최하고 있다. 올해는 유사 가문인 옥산 전씨가 조선 초 예조판서를 지낸 전백영 선생의 추모 장소이자 후학들의 강학소인 박곡서당에서 계를 열었다.\n\n세 가문의 인연은 700여 년 전 고려 말로 거슬러 올라간다. ''고려 말 판밀직사를 지낸 전의룡(全義龍)의 첫째와 둘째 딸이 각각 동래부사 장흥부(蔣興膚)와 대사헌 박해(朴해)에게 시집을 가면서 장인과 사위의 인연을 맺고 교의를 두텁게 쌓아갔다.'' 특히 세 가문은 경산시 인근에 거주한 공통점이 있던 터에 두 사위 집안은 전의룡 사후에도 현재의 경산시 남천면에 있는 그의 묘소를 찾아 한 해도 빠짐없이 시제(時祭)를 올렸다. 세 가문은 이후 왕래를 대물림하면서 한 번 맺은 혈연을 다져갔고, 선대의 가풍을 이어 동문수학하면서 조선조에 많은 인재를 배출했다.\n...\n\n▶ 다음은 문평공(文平公)의 시호를 받은 문신들이다.(참고 ; 한국민족문화대백과사전, 필수역사용어해설사전(이은식 저) 등 )\n\n''#. 고려 명종 - 이지명(李知命)'' ; 1127년 (고려 인종 5년) ~ 1191년 (고려 명종 21년)\n 고려시대 정당문학, 태자소부, 동지공거 등을 역임한 관리. 재상, 문신.\n<<<\n+++[ 본관은 한산(韓山)이며, 자는 낙수(樂叟). ]\n1144년(인종 22) 과거에 급제하였으며 황주서기·충주판관을 거치는 동안 청렴하고 정직하여 특히 굶주린 사람들을 구휼하는 데 힘썼다.\n...\n1184년에는 한림학사승지(翰林學士承旨)를 겸하였으며, 다음해 외직으로 나가 서해도안찰사와 서북면병마사를 각각 역임하였다. 그 뒤 정당문학(政堂文學)에 오르고 1190년에는 태자소부(太子少傅)를 겸하였다.많은 서적들을 널리 읽고 사부(詞賦)를 잘 지었으며, 특히 초서(草書)와 예서(隷書)에 능하였다. 1182년 동지공거(同知貢擧)로서, 1190년에는 지공거로서 과거를 주관하였는데, 조충(趙冲)·한광연(韓光衍)·이규보(李奎報)·유승단(兪升旦)·유충기(劉冲基) 등이 이지명의 문생들이었다. 시호는 문평(文平)이다.\n===\n<<<\n''#. 고려 고종 - 윤극민(尹克敏)''\n 고려시대 판호부사, 정당문학, 수문전태학사 등을 역임한 관리. 문신.\n<<<\n+++[ 본관은 남원(南原). ]\n▷ 윤위(남원윤씨 시조)\ncf. 고려 23대 고종 (1192~1259) ; 재위 46년 (1213~1259)\n▷ 2대 윤극민(尹克敏)은 고종 35년 문과에 급제하고 여러 벼슬을 거쳐 판호부사(判戶府使)ㆍ정당문학(政堂文學)ㆍ수문전태학사(修文殿太學士)를 지냈다. 몽고군의 침입 때 아성(牙城)의 전투에서 순절하였는데 그 공을 기려 시호(諡號)를 문평(文平)이라 하고 정려(旌閭)를 세워 표상하였다.\n===\n<<<\n''#. 태종 - 전백영(全伯英)'' ; 1345년 (고려 충목왕 원년) ~ 1412년 (태종 12년)\n 조선전기 첨서승추부사, 지의정부사 등을 역임한 문신. \n<<<\n+++[ 본관은 옥산(玉山). 호는 파계(巴溪). ]\n아버지는 고려(高麗) 광정대부 판밀직사사 상호군(匡靖大夫 判密直司事 上護軍)을 지낸 전의용(全義龍)이며, 어머니는 貞夫人 月城 崔氏로 집의(執義)를 지낸 최원우(崔元祐)의 딸이다.(2남 3녀중 장남이다)\n\n1345년(고려 충목왕 1년) 수성구 고모에서 태어나 파잠(巴岑'파동)으로 이거하면서 아호마저도 파동과 신천에서 따와 파계(巴溪)라고 했다. 정몽주로부터 글을 배워 27세 때인 1371년(고려 공민왕 20년) 문과에 급제했다. 초임부터 관료들의 비리와 왕의 실정에 대해서 바른말을 하는 간관(諫官)을 맡았다. \n...\n1401년(태종 원년) 노비변정도감(奴婢辨正都監) 설치에 따라 제조(提調)가 되었다.\n...\n1404년(태종 4년) 첨서승추부사(簽書承樞府使)로 명나라 서울에 가서 새해를 축하하고 세자의 책봉을 청하였다. 그해 7월 정헌대부(正憲大夫)으로 성격, 예조판서(정2품)에 올랐다. 1406년(태종 6년) 다시 경기도 관찰사로 나갔다. \n...\n태종 12년(1412) 10月 26日에 享年 68歲로 생을 마쳤으며 시호(諡號)는 문평(文平)이다.\n===\n<<<\n''#.태종 - 평원군(平原君), 조박(趙璞)'' ; 1356년 (고려 공민왕 5년) ~ 1408년 (태종 8년)\n 조선전기 개성유후사 유후, 호조판서, 동북면도제찰사 등을 역임한 문신.\n<<<\n+++[ 본관은 평양(平壤). 자는 안석(安石), 호는 우정(雨亭). ]\n문하시중 조인규(趙仁規)의 4세손이며, 아버지는 전의령(典儀令) 조사겸(趙思謙)이다.\n...\n1392년 4월 간관들에게 탄핵을 받아 청주목사직이 삭탈되고 귀양갔으나, 8월에 조선이 개국되자 예조전서로서 개국공신 1등이 되어 전(田) 170결(結)과 노비 20구를 받았으며 평원군(平原君)에 봉해졌다.\n...\n1409년 생전에 불교를 신봉했다는 탄핵을 받아 공신녹권이 추탈되었고, 1422년(세종 4) 공신녹권이 소각되었다. 시호는 문평(文平)이다.\n===\n<<<\n''#. 세조 - 복천군(福川君), 권개(權愷)'' ; 미상 ~ 1468년 (세조 14년)\n 조선전기 관찰사, 중추원부사 등을 역임한 문신.\n<<<\n+++[ 본관은 안동(安東). ]\n권적(權適)의 증손으로, 할아버지는 권현(權顯)이고, 아버지는 권식(權遈)이며, 어머니는 양일우(梁一雨)의 딸이다.\n\n1447년(세종 29) 친시문과에 정과로 급제하여 여러 번 승진하다가 병조정랑에 임명되었다. 1453년(단종 1) 수양대군이 계유정난을 일으키던 날 대궐 안에 입직해 있다가 달려가 협력한 공로로, 세조가 즉위한 뒤 좌익공신(佐翼功臣) 3등에 책정되었다.\n이듬해 판종부시사(判宗簿寺事)·좌사간을 지내고, 1457년(세조 3) 지병조사, 이듬해 첨지중추원사 겸 황해도 관찰출척사, 1461년 강원도관찰사를 지냈다. 이듬해 복천군(福川君)에 봉해지고 경상도도관찰사에 임명되었다. 1463년 중추원부사가 되었다. 시호는 문평(文平)이다.\n===\n<<<\n''#. 성종 - 월천군(月川君), 김길통(金吉通)'' ; 1408년 (태종 8년) ~ 1473년 (성종 4년)\n 조선전기 지중추부사가, 한성부판윤, 호조판서 등을 역임한 문신.\n<<<\n+++[ 본관은 청풍(淸風). 자는 숙경(叔經), 호는 월천(月川). ]\n김직방(金直方)의 증손으로, 할아버지는 김광무(金光茂)이고, 아버지는 증 좌찬성 김효례(金孝禮)이며, 어머니는 오은(吳隱)의 딸이다.\n...\n성종 즉위 후 지중추부사가 되고 한성부판윤 등 여러 내외직을 두루 지내고 호조판서에 올라, 1471년(성종 2년) 좌리공신(佐理功臣) 4등으로 월천군(月川君)에 봉해지고, 숭정대부(崇政大夫)가 되었다. 성품이 청백하여 항상 청빈하였고, 평생 동안 공도(公道)로써 관직생활을 지냈다. 저서로는 『월천집(月川集)』이 있다. 시호는 문평(文平)이다.\n===\n<<<\n''#. 성종 - 영산부원군(永山府院君), 김수온(金守溫)'' ; 1410년 (태종 10년) ~ 1481년 (성종 12년)\n 조선전기 지영천군사, 판중추부사, 호조판서 등을 역임한 문신. \n<<<\n+++[ 본관은 영동(永同). 자는 문량(文良), 호는 괴애(乖崖)·식우(拭疣). ]\n아버지는 증 영의정 김훈(金訓)이다.\n...\n호조판서를 거쳐 1469년(성종 즉위년) 보국숭록대부(輔國崇祿大夫)에 오르고, 1471년(성종 2) 좌리공신(佐理功臣) 4등에 책록, 영산부원군(永山府院君)에 봉해졌으며, 1474년 영중추부사를 역임하였다.\n...\n세종 때 수양대군·안평대군이 존경하던 고승 신미(信眉)의 동생으로 불경에 통달하고 제자백가(諸子百家)·육경(六經)에 해박해 뒤에 세조의 총애를 받았다. \n\n『치평요람(治平要覽)』·『의방유취(醫方類聚)』 등의 편찬, 『석가보(釋迦譜)』의 증수, 『명황계감(明皇誡鑑)』·『금강경(金剛經)』 등의 번역에 참여했으며, 「원각사비명(圓覺寺碑銘)」을 찬하고 사서오경의 구결(口訣)에 참여하였다. 저서로는 『식우집(拭疣集)』이 있다. 시호는 문평(文平)이다.\n===\n<<<\n''#. 중종 - 이계맹(李繼孟)'' ; 1458년 (세조 4년) ~ 1523년 (중종 18년)\n 조선전기 동지중추부사, 평안도관찰사, 병조판서 등을 역임한 문신.\n<<<\n+++[ 본관은 전의(全義). 자는 희순(希醇), 호는 묵곡(墨谷) 또는 묵암(墨巖). ]\n태사(太師) 이도(李棹)의 후손이며, 부여감무 이의(李宜)의 증손이다. 할아버지는 현감 이대정(李大種)이고, 아버지는 이영(李潁)이며, 어머니는 생원 채소명(蔡紹明)의 딸이다.\n...\n1517년 주청사(奏請使)로 중국에 가서 『대명회전(大明會典)』에 이성계(李成桂)가 이인임(李仁任)의 아들로 잘못 기록된 것을 발견하고 보고하였다. 이어 좌찬성·병조판서 겸 지경연사(兵曹判書兼知經筵事)를 거쳤다.\n\n1519년 기묘사화(己卯士禍) 때 사류(士類)들에 대한 처리가 지나치자, 스스로 논의에 맞지 않다고 여겨 김제(金堤)에 있는 농막으로 퇴거하였다. 성품이 강직해 옳고 그름에 명백한 태도를 취했고 군자다운 태도가 있었다 한다. 전주의 서산사우(西山祠宇)와 김제의 용암서원(龍巖書院)에 제향되었다. 시호는 문평(文平)이다.\n===\n<<<\n\n\n▣ [[무동재(武洞齋)]] ; 대구광역시 수성구 파동 425\n\n\n
위치 : 대구광역시 달성군 가창면 행정리 870번지 (가창동로 117)\n\n한천서원은 고려개국공신 태사(太師) 충렬공(忠烈公) 전이갑(全以甲)과 충강공(忠康公) 전의갑(全義甲) 형제를 배향하는 곳이다. 두 장수는 918년 동수대전 때 신숭겸, 김락과 더불어 왕건을 구해내면서 장렬히 전사한 고려 개국 공신들이다. \n1838년(현종 4년)에 창건되었으나, 서기 1871년(고종 8년)에 서원철폐령으로 훼철(毁撤) 된 후 설단(設壇)하고 재사(齋舍)를 지어 공의 높은 충의를 기려오다가 서기 1989년 서원으로 복원(復元)되었다.\n\n서원은 강학공간과 제향공간이 일자(一字)로 배치되어 있는데 외삼문을 들어서면 좌측으로 한천서원이 있고 우측으로 사당인 충절사가 자리하고 있다.\n\n사당 충절사(忠節祠)에서는 고려개국공신 태사(太師) 충렬공(忠烈公) 전이갑(全以甲)과 충강공(忠康公) 전의갑(全義甲), 형제와 종제(從弟)인 충달공(忠達公) 전락(全樂), 삼충공(三忠公)을 매년 4월 5일에 향사를 올리고 있다.\n\n대지 800평 규모에 1곽 3동으로 되어 있으며, 담밖에 달성군 보호수 8-1호인 1000년 된 은행나무가 있다.\n(지석묘, 전두환 전대통령 기념수 등이 있음)\n\n
<html><span style="background:#E2E2ff ; font-family:돋움; font-size: 14px;"> <b> [집성촌을 찾아서]범서읍 두산리(옥산전씨) </b> </span></html>\n\n출처 ; 경상일보, 2004.01.13 http://www.ksilbo.co.kr/news/articleView.html?idxno=83076\n\n중구 다운동을 지나 경북 포항까지 이어진 국도 14호선을 따라 북으로 길을 잡으면 척과와 관문성쪽으로 가는 길이 갈라진다. 삼거리 오른쪽에 내동주유소가 있어 찾기가 수월하다. 그 삼거리에서 관문성 방향으로 오르면 바로 범서읍 두산리 구룡(九龍)마을을 알리는 마을회관이 도로 오른쪽에 붉은 벽돌로 지어져 있다. 이곳부터 대신마을 못미친 지점까지가 구룡마을이다. 마을회관을 지나 조금만 더 가면 구룡마을 시내버스 정류소가 구룡마을에 다 왔음을 알려준다.\n 등성이를 사이에 두고 2개의 작은 마을로 구성돼 있는 구룡마을은 옥산전씨(玉山全氏)들의 집성촌이다. 동으로는 상아산이 북구 달천과 경계를 구분해 주고 멀리 연화산과 치술령 등이 자리한 까닭에 마을 중심부에 남북으로 골이 깊게 뻗어 있다. 이 골을 따라 국도 14호선이 달린다. 구룡마을 앞 도로도 80년대 후반부터 차들로 붐비기 시작해 지금은 산뜻하게 왕복 2차선으로 포장돼 있다. 산기슭의 마을과 도로사이에 천이 자리하고 있다.\n 구룡마을에 옥산전씨들이 자리잡기 시작한 때는 1800년대 초로 경주 양북에서 옮겨왔다. 처음 이 곳 구룡마을에 자리한 옥산전씨는 통훈대부(通訓大夫)를 지낸 전환규(全煥圭) 할아버지. 환규 할아버지의 7촌 조카인 전구현(全龜鉉) 할아버지와 함께 경주 와읍에서 이곳으로 옮겨왔다. 그후 전권열(全權烈·75)씨가 경주에서 이곳으로 와 합세했다.\n 환규 할아버지의 5대손인 전규열(全圭烈·70)씨는 "구룡마을에 처음 자리잡은 분은 환규 할아버지이지만 이곳 사람들 모두가 환규 할아버지의 5대조이자 경산을 떠나 경주 와읍에 자리를 잡았던 세무(世茂) 할아버지로부터 나온 자손들이어서 세무 할아버지를 입향조로 꼽고 있다"고 설명했다. "세무 할아버지의 증조부가 선무원종 일등공신(宣武原從 一等功臣)인 계신(繼信) 할아버지로 파조인 신호위대장군(神虎"大將軍)으로 공을 세워 옥산군(玉山君)에 봉해진 전영령(全永齡)의 12대손이 된다"고 덧붙였다.\n 전만부(全萬富·65)씨는 "파조 할아버지는 도시조로 백제창립십제공신이었던 전섭(全") 할아버지의 27세손인 만큼 지금 현재 구룡마을을 지키고 있는 열(烈)자 항렬이 51세손이 되는 셈이다"고 뿌리깊음을 설명했다.\n 규열씨는 "어릴 때만 해도 인근에서 "삼거리 전가"라고 불리며 구룡마을에만 20여집이 있었으나 지금은 10여집만 남아있고 모두들 외지로 나가 있다"고 말했다.\n 마을을 중심으로 골마다 생각보다 넓은 들을 갖고 있어 주로 논농사와 함께 과수원을 경작해 마을 사람들은 어렵지않게 생활했다"는 만부씨의 말에 함께 한 전권열씨도 맞장구쳤다.\n 구룡마을 전씨들도 다른 집성촌과 마찬가지로 젊은 사람들은 대부분 도시로 나가 현재 노인들만 고향을 지키는 집들이 많다.\n 울산을 비롯해 부산, 서울 등 전국에 100여집이 이 곳 범서읍 두산리 구룡마을을 고향으로 삼고 있다.\n 구룡마을 출신으로는 입향조의 6세손인 전진수(全"秀)씨가 농협중앙회 울주군지부장으로 활동 중에 있으며 울산축협에 근무중인 전진하씨도 같은 항렬이다.\n 또 범서읍 승격 추진위원장을 맡아 범서읍 승격에 일익을 담당한 전규열(全圭烈)씨도 구룡마을 토박이이며, 규열씨의 장자가 울산시의원을 지낸 전경환(全庚煥) 전의원이고 둘째가 전영록(全永")씨로 현재 제주관광대학교 사회복지학과장로 재직중이다.\n 이밖에 전두열(全枓烈) 신정고 전 동창회장과 전부열(全扶烈) 부산신광산업사 대표를 비롯해 부산에서 해송전업사를 운영중인 전봉열(全峰烈)씨와 봉열씨의 아들로 한의원 원장으로 활동하고 있는 태진(泰")(√ 수형을 잘못 표시)씨도 같은 문중이다.\n 또 육군대령과 소령으로 각각 예편해 서울에서 활동중인 전득열씨와 전병호씨, 중국 북경에서 중소기업을 경영하고 있는 전진윤(全"閏)씨 등도 구룡마을 옥산전씨의 일가들이다. \n\n서찬수기자 sgija@ksilbo.co.kr\n경상일보, KSILBO\n\n
<html><span style="background:#E2E2ff ; font-family:돋움; font-size: 14px;"> <b> 대곡리 김해김씨 열녀 비 (경북 장기면 대곡리 산 61) </b> </span></html>\n\n출처 ; 2015.10.3. http://blog.daum.net/loh4624/6211440\n\n2015. 10. 2. \n오늘은 포항의 남구 장기면 지역을 탐방한다... \n\n여행은 길 위의 움직이는 학교이다. \n운명과도 같은 새로운 만남과 사람과 삶을 배운다. 서로 사랑하는 법, 감동을 나누는 법을 배운다. 나를 용서하는 법, 화해하는 법도 배운다. 인생을 새롭게 설계하는 기술을 배우고 진정한 기쁨과 행복도 배운다.\n또한 지나온 자신을 돌아보며 그래서 사람들은 종종 여행을 떠난다. 삶의 중간에서..\n이런 햇살 좋은날 나홀로 행복한 나만의 포항 남구 장기면 일대 문화탐방을 나선다.\n\n탐방할 문화재와 여행지는 포항시 남구 장기면 정천리 선정비와 대곡리 김해김씨 열녀비, 학곡리 학삼서원, 장기읍성, 장기향교, 장기면사무소 안에 있는 척화비, 근민당, 선정비, 금곡리 금산서원과 삼효각. 허진수 유허비, 계원2리 화재 이언적 시비, 양포리 정인품 절효각, 수성리 정유서 유록 유허비, 임중리 김사민 종효각, 장기초등학교 교정의 송시열. 정약용 사적비와 은행나무, 마현리 삼명서원을 두루 돌아볼 예정이다.....\n\n오천을 지나 장기면으로 향하면서 장기의 초입에서 정천리 선정비를 보고 오늘 두번째인 다음 여행지인 장기 대곡리 김해김씨 열녀비를 만나러 간다...\n<html> <DIV>\n<P style="TEXT-ALIGN: center; LINE-HEIGHT: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" \nclass=MsoNormal align=center>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/2015_열녀비01.png" width=640> </SPAN>\n</DIV> </html>\n대곡리 용수골에 위치한다.\n<html><DIV>\n<P style="TEXT-ALIGN: center; LINE-HEIGHT: 150%; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" \nclass=MsoNormal align=center>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/2015_열녀비02.png" width=570> </SPAN> <br>\n<SPAN style="COLOR: #2b5600"> 열녀비 </SPAN></p>\n</DIV></html>\n비각은 정면1칸 측면1칸으로 지붕과 기둥은 모루돌을 가공하여 만들었으며, 지붕은 비석의 가첨석과 유사한 모습이다.\n기둥은 배흘림기둥이며, 지붕에 네 모퉁이에 기둥을 받쳤다.\n\n박춘무(朴春茂)의 처 김해김씨를 기리기 위한 비석으로 옛날 산에서 범이 내려와 남편 박춘무를 잡아 가므로 처 김해김씨가 범과 대항하여 남편을 구하고 몸을 크게 상한 남편의 병 구환을 잘하여 완치케 한 열녀(烈女)로 주민들이 건립하였으며 현재는 후손 박을출(朴乙出)이 관리한다.\n\n두번째인 장기 대곡리 김해김씨 열녀비를 만난 후 화창한 날씨와 산들바람 멋진 경치를 보며 오늘의 세번째 여행지인 장기면 학곡리 학삼서원을 만나러 간다...\n.\n.\n.\n.\n
<html> <a name="Page200117"> </a> </html>\nhttps://www.unrealengine.com/ko/ - EPIC 계정 생성 ; b~@e~.com / #*e***9*\n\n• Visual Studio 2017 v15.6 이상 (권장)\n\n<html>\n<a href="#Page200117_01"> #. Tutorial </a> <br>\n<a href="#Page200117_02"> #. 메모 </a> <br>\n<a href="#Page200117_03"> #. UE4 C++ -> Blueprint </a> <br>\n</html>\n▶ [[언리얼 4]]\n #. 언리얼4 엔진 문서\n #. 학습 \n\n<html> <a name="Page200117_01"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page200117"> <span style="font-size: 14px;"> #. Tutorial </span> </a>\n</div> </html>\nhttps://forums.unrealengine.com/development-discussion/blueprint-visual-scripting/1534506-how-to-find-a-value-in-data-table-or-string-table \n / 블루프린트 DataTable 검색\nhttps://towanouta.tistory.com/135 - SceneCaptureComponent2D 활용하여 캐릭터 포트레이트(Portrait) 제작하기\n / render to texture를 바로 사용하지 않고, 알파값을 조작한 material을 사용\nhttps://bornsoul.tistory.com/32 - (UE4) UMG ListView 데이터 연동 방법\nhttps://forums.unrealengine.com/community/community-content-tools-and-tutorials/1595437-listview-getting-started-in-bp\n / (TUTORIAL) Listview - getting started in BP\nhttps://limesode.hatenablog.com/entry/2020/05/18/111251 - UMG의 애니메이션 종료 탐지\n\nhttps://www.youtube.com/watch?time_continue=90&v=zuek4eq2Klo&feature=emb_title - Blue Protocol Closed Alpha Test Character Creation Videos (캐릭터 생성)\n\nhttps://www.youtube.com/c/MathewWadsteinTutorials/videos\n • https://www.youtube.com/watch?v=Czp4g3AFP_k - WTF Is? Hardware Benchmark in Unreal Engine 4 ( UE4 ) 노드 및 설정\n\n@@bgcolor(#FFBB00):color(#000000): ''#.UI Navigation Tutorial'' @@\nhttps://www.youtube.com/watch?v=T1okpz8xJwM - UI Navigation Tutorial - Setup\n / 프로젝트 세팅 > 엔진 > 유저 인터페이스\n ◢ Focus\n Render Focus Rule ; Navigation Only 로 설정\nhttps://www.youtube.com/watch?v=w7maDj-mCFM - UI Navigation Tutorial - Navigation (1/2)\n / UINavButton 사용\n / 함수 ; Append Navigation Grid 1D( ... ); Append Navigation Grid 2D( ... ); 함수\n // Event Ready for Setup 이벤트 ; Make ButtonNavigation → Append Navigation Grid 1D( ..., Edge Navigation ); \n\nhttps://www.youtube.com/watch?v=8UIv6UcVpYo - UE4 Controller Menu Navigation Tutorial\n▷ UMG_GameMenu 개별 버튼으로 구성\n / Construct 이벤트 ; UMG_Button과 \n Bind Event to On Click Button ; 개별 버튼에 이벤트를 연결 (cf. Bind Event to OnClicked)\n + ✔ Delay (0.1초) + ✔ 처음 버튼에 Set keyboard Focus 설정 (∵ 버튼 기준에서 Navigation)\n ▶ UMG_Button\n / SetButtenText 이벤트\n / Event On Added to Focus Path 이벤트\n / Event On Removed from Focus Path 이벤트\n ▶ UMG_Button \n ...\n\n\n<html> <a name="Page200117_02"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;"> <a href="#Page200117"> <span style="font-size: 14px;"> #. 메모 </span> </a> </div> </html>\n<html><span style="background:#e2e2ff ; font-family:돋움; font-size: 14px;"> <b> #.UMG </b> </span></html>\n\n@@bgcolor(#FFBB00):color(#000000): ''#. ListView'' @@\n / 원하지 않는 Key Navigation 작동 ⇒ 개별 UMG, Is Focusable ; off 설정\n\n● Set Selected Index( ... ); 설정하면, On List Item Selection Changed (ListView_103) 이벤트 호출됨\n● (Bool) HasAnyUserFocusedDescendants(); 사용자가 하위 위젯에 초점을 맞추면 true를 리턴\n● List로 사용되는 UMG에서 마우스 버튼 클릭을 제한 ; OnMouseButtonDown( ... ); 오버라이드 함수\n / Unhandled을 Return할 경우, 마우스 버튼 다운 발생\n / ''Handled''을 Return할 경우, 마우스 버튼 다운 이벤트를 ListView에 전달하지 못한다. \n\n@@bgcolor(#FFee88): ''#. 버튼 상태 조작'' @@\n● Button ; Set Style 함수를 사용해서 상태 설정\n / 선택된 버튼의 (Slate Brush)Btn_Hovered ⇒ Nomal Style로 설정 (cf.아닌 경우, Btn_Normal ≒ Nomal Style)\n● CheckBox ; toggle type을 사용\n● Button UMG을 만들어서 사용\n\n@@bgcolor(#FFee88): ''#. 오버라이드 함수의 Return 값'' @@\n(2017.07.) 예를 들어 동일한 위젯에 대해 두 개의 이벤트를 처리해야합니다. On Touch Started 및 On Drag Detected입니다. \n둘 다 사용하려면 On Touch Started에서 "Unhandled"를 반환해야합니다. Handled를 반환하면 드래그 앤 드롭 작업을 사용할 수 없습니다.\n참고 https://forums.unrealengine.com/development-discussion/blueprint-visual-scripting/56052-how-am-i-supposed-to-create-an-event-reply-structure-in-umg\n\n@@bgcolor(#bbddee):color(#001144): ''#. UMG 구성에 따라서 표시되는 형태가 달라질 수 있다. '' @@\n // Overlay \n //// Image (cf. UMG_Inventory_Widget_10)\n ―> 아래 구성에서 스크롤바 표시 등의 변동 사항이 있을 때, 미묘한 차이가 발생할 수 있음\n//――――――――――――――――――――――――――――――――――――――――\n // Border ⇒ 대체 ; 고정된 형태로 유지\n\n\n<html><span style="background:#e2e2ff ; font-family:돋움; font-size: 14px;"> <b> #.마우스 </b> </span></html>\n\n@@bgcolor(#FFee88): ''#. 마우스 관련 함수'' @@\n ; 해당 위젯이 Focus를 받고 있어야 한다.\n\n■ ''마우스 버튼 판별''\n1. OnMouseButtonDown( ... ); 오버라이드 함수\n / Mouse Event -> GetEffecting Button == Equal( 오른쪽 마우스 버튼)\n / 좌우 마우스 여부 확인 ; (OnMouseButtonDown.In Mouse Event ->) Is Mouse Button Down(); 함수 사용\n\n■ ''마우스 드레그 판별''\n참고, https://docs.unrealengine.com/ko/Engine/UMG/HowTo/DragAndDrop/index.html - 드래그 앤 드롭 UI 제작\n1. OnMouseButtonDown( ... ); 오버라이드 함수\n / Detect Drag if Pressed( ... ); 함수\n // 입력 -1. OnMouseButtonDown.Mouse Event ⇒ Pinter Event \n -2. Drag Key 설정 (예, 왼쪽 마우스 버튼)\n // 출력 ; Return Value ⇒ 반환 노드 전달\n\n2. OnDragDetected( ... ) 오브라이드 함수에 이벤트 발생\n\n■ ''Hover 관련 이벤트''\nOn Focused 이벤트 ; 키보드, 패드를 통해 주목받게되면 실행\n ⇔ On Focus lost 이벤트\nOn Mouse Enter 이벤트 ; 마우스 커서가 UI 안으로 들어오면 실행\n ⇔ On Mouse Leave 이벤트\n-. UMG, Slider에서는 OnHovered 이벤트가 없기 때문에 On Mouse Enter 이벤트 활용\n\n■ ''Focus 이동 확인''\nOn Added to Focus Path 이벤트를 사용\n\n■ ''UMG에서 화면에 보일 때, Key 값을 받기 위한 설정''\nOnKeyDown 오버라이드 함수\n ; (조건) / Is in Viewport (AND) Is Visible / 일 때, OnKeyDownEvent( InputKey ) 이벤트 호출\n\n<html><span style="background:#e2e2ff ; font-family:돋움; font-size: 14px;"> <b> #.기타 </b> </span></html>\n\n○ Detail Menu: ''Allow Context Menu'' 옵션\n 언리얼에서 Edit Text나 Editable Text 등 문자열 입력시 \n 마우스 오른쪽 버튼을 클릭했을 때, 표시되는 문자열 편집기능 옵션\n\n○ PIE 에서 ESC 키를 다른 키로 교체 Ctrl+Q\n 에디터 개인설정 > 일반 > 키보드 단축키 ; \n // 월드 플레이(PIE/SIE) ; 중지(시뮬레이션 중지) 설정\n\n#.메시지창 표시할 때 주의할 사항\n○ 중복메시지 여부\n / On Key Down 이벤트 Key 값 저장\n / 상태 값 설정\n ⇒ On Key Up 이벤트 저장된 Key 값을 비교하고 저장된 Key 값 삭제\n / 같은 이벤트에서 연속으로 들어오는 경우, 나중 메시지만 전달되는 경우 있음\n○ 위젯 중복 사용 여부\n / 유효성 확인 ; Is Valid - 없다면 생성\n / 가시정 확인 ; Is Visble - 화면에 단독으로 존재할 경우\n참고. Widget 생성 후 Viewport에 연결, 화면 표시하는 경우\n 1. Remove from Parent로 화면에서 제거하더라도 참조하고 있는 곳이 있다면 바로 삭제되지 않는다.\n 2. Get All Widgets Of Class 로 참조 중인 Widget을 찾아서 for each loop를 이용, 각각의 Widget을 Remove from Parent 할 수 있다.\n\n\n<html> <a name="Page200117_03"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page200117"> <span style="font-size: 14px;"> #. UE4 C++ -> Blueprint </span> </a>\n</div> </html>\n출처 ; \n https://darkcatgame.tistory.com/61?category=795582\n https://kyoun.tistory.com/143 - 델리게이트 + 종류 및 함수 + 시그니처 + 바인딩\n참고 ;\n https://www.unrealengine.com/ko/blog/unreal-property-system-reflection?lang=ko - 2014.03.28. 언리얼 프로퍼티 시스템 (리플렉션)\n http://sweeper.egloos.com/3205739 - 2017.08.07. (UE4) 함수 및 UFUNCTION 주요 지정자 \n http://sweeper.egloos.com/3205742 - 2017.08.07. (UE4) 클래스 및 UCLASS 주요 지정자\n\n<html><span style="background:#e2e2ff ; font-family:돋움; font-size: 14px;"> <b> #.UE4 Intellisense </b> </span></html>\n- UPROPERTY()같은 메크로 자동완성 기능\n\n<html><span style="background:#e2e2ff ; font-family:돋움; font-size: 14px;"> <b> #.Reflection(리플렉션) </b> </span></html>\nReflection(리플렉션)은 프로그램이 실행시간에 자기 자신을 조사하는 기능으로, 에디터의 디테일 패널, 시리얼라이제이션, 가비지 콜렉션, 네트워크 리플리케이션, 블루프린트/C++ 커뮤니케이션 등 다수의 시스템에 탑재\nJava나 C# 등 에서는 리플렉션을 지원하지만 C++에서는 지원하지 않아 언리얼4 엔진 자체적으로 리플렉션이 구현.\n전형적으로 이러한 리플렉션은 '프로퍼티 시스템'이라고 부르는데, '리플렉션'은 그래픽 용어이기도 하기 때문이다.\n\n리플리케이션 시스템은 옵션. 리플렉션 시스템에 보이도록 했으면 하는 유형이나 프로퍼티에 주석을 달아주면, Unreal Header Tool (UHT)가 그 프로젝트를 컴파일할 때 해당 정보를 수집한다.\n{{{\n#include "FileName.generated.h"\n}}}\n이제 UENUM(), UCLASS(), USTRUCT(), UFUNCTION(), UPROPERTY() 를 사용하여 헤더의 다양한 유형과 멤버 변수 주석을 달 수 있다. 이 매크로 각각은 유형 및 멤버 선언 전에 오며, 추가적인 지정자 키워드를 담을 수 있다.\n\n<html><span style="background:#e2e2ff ; font-family:돋움; font-size: 14px;"> <b> #.언리얼 메크로함수 </b> </span></html>\nUENUM(), UCLASS(), USTURCT(), UFUNCTIONI(), UPROPERTY()등 이 있으며 클래스, 변수, 함수 등 상황에 맞게 리플렉션을 위한 메크로 함수를 작성.(for C++와 블루프린트 연동)\n\n!!!1. UPROPERTY() - 변수 공개, 수정 권한\nUPROPERTY( EditDefaultsOnly , BlueprintReadWrite, Category = "ParentCategory | TestCategory" )\nclass UDataTable* OptionInfoTable;\n\n■ 첫번째 인자\n| | Edit | Visible |\n| DefaultsOnly |EditDefulatOnly <br> 블루프린트 에디터 창의 디테일 패널에서 값을 수정 가능 |VisibleDefaultsOnly <br> 블루프린트 에디터 창의 디테일 패널에서 값을 보기 가능 |\n| InstanceOnly |EditInstanceOnly <br> 월드상에 배치된 오브젝트의 디테일 패널에서 값을 수정 가능 |VisibleInstanceOnly <br> 월드상에 배치된 오브젝트의 디테일 패널에서 값을 보기 가능 |\n| Anywhere |EditAnywhere <br> 블루프린트 에디터 & 월드상에 배치된 오브젝트의 디테일 패널에서 값을 수정 가능 |VisibleAnywhere <br> 블루프린트 에디터 & 월드상에 배치된 오브젝트의 디테일 패널에서 값을 보기 가능 |\n\n-. 포인터 변수를 사용할 때\n / Edit 설정 ; 해당 클래스를 수정하는 것이 아니라 포인터 변수의 참조를 수정\n / Visible 설정 ; 해당 클래스를 수정\n\n■ 두번째 인자\n|BlueprintReadOnly |블루프린트에서 해당 변수를 읽기가 가능 |\n|BlueprintReadWrite |블루프린트에서 해당 변수를 읽기 & 쓰기가 가능 |\n|BlueprintGetter |해당 변수에 접근 할 수 있는 함수를 지정하고 블루프린트는 해당 함수를 통해 변수에 접근 |\n|BlueprintSetter |해당 변수에 수정 할 수 있는 함수를 지정하고 블루프린트는 해당 함수를 통해 변수에 수정 |\n\n-. BlueprintGetter & BlueprintSetter\nC#의 Gettset & Setter와 같은 기능을 가졌으며 간단히 말하면 Get, Set을 커스텀 함수로 만들어 사용 할 수 있다.\n특이 사항은 Settter함수를 사용 할 떄 자동으로 Getter함수까지 호출\n\n{{{\nUPROPERTY( EditAnywhere, BlueprintGetter = GetTestValueGS, BlueprintSetter = SetTestValueGS )\nfloat m_TestValue_GS = 3.0f;\n\nUFUNCTIONI( BlueprintGetter )\nfloat GetTestValueGS()\n{\n return m_TestValue_GS + 20.0f;\n}\n\nUFUNCTIONI( BlueprintSetter )\nvoid SetTestValueGS( foat fValue)\n{\n m_TestValue_GS+= fValue + 100.0f;\n}\n}}}\n블루프린트 노드에서 Set.m_TestValue_GS(0.0)으로 하면\nGetter가 자동으로 호출되서 기본값 3.0 + Getter 20.0f + Setter + 100.0f로 프로세스가 진행 = 123.0f가 된다.\n\n■ 세번째 인자 ; Category - 디테일 패널의 항목 이름\n\n-. 그 외 기능\n□ Meta ; Metadata 지정자\n(Matadata ; https://docs.unrealengine.com/ko/Programming/UnrealArchitecture/Reference/Metadata/index.html)\n{{{\nPrivate:\n // Comments her - 주석 표시\n UPROPERTY( EditAnywhere, BlueprintReadWrite, meta = (AllowPrivateAccess = "true", UIMin = 0, UIMAX = 10 ) )\n float m_TestValue = 0.3f;\n}}}\n변수가 private로 되어 있지만 AllowPrivateAccess = "true" 명령어 ; 에디터에서 보이게 할 수 있다.\nUIMin = 0, UIMAX = 10은 에디터에서 조정할 수 있는 숫자 범위를 지정\n\n□ Display ; AdvanceDisplay를 사용하면 화살표를 통해 접었다 펼칠 수 있다.\n{{{\nPublic:\n UPROPERTY( EditAnywhere, BlueprintReadWrite, SimpleDisplay )\n float m_TestValue = 0.3f;\n UPROPERTY( EditAnywhere, BlueprintSetter = SetTestValueGS, AdvanceDisplay )\n float m_TestValue_GS = 3.0f;\n}}}\n\n!!!2. UFUNCTION()지정자\n\n@@◢ BlueprintCallable @@ ; C++의 구현 내용을 블루프린트에서 재정의할 수 없으며, 호출만 가능, 대체적으로 setter 성격의 함수에 많이 사용\n@@◢ BlueprintPure @@ ; (const) getter의 성격에 해당하는 함수를 블루프린트 그래프에 노출시킬 때 사용\n\n''UFUNCTION( BlueprintPure, Category = "FuctionTest" ) ''\nfloat GetValue_Pure( float fValue){\n return fValue + 100.0f;\n}\n\n@@◢ BlueprintImplementableEvent @@ ; C++에서는 시그너쳐 선언만 하고 내용은 블루프린트에서만 구현 가능케 하는 함수 지정자\nUHT(언리얼 헤더 툴)에게 블루프린트에 의해 구현될 빈 함수를 만들라고 알려준다.\n\n''UFUNCTION(BlueprintImplementableEvent, Category = Power) ''\nvoid UpdatePowerEffect();\n\ncf. 블루프린트에서 만든 Custom Event 함수를 C++에서 호출하는 방법\n{{{\n#include "Misc/OutputDeviceNull.h"\n\nvodi AVariable::BeginPlay()\n{\n Super::BeginPlay();\n\n FOutputDeviceNull pAR;\n // CustomEvent ; 인자가 없는 경우\n this->CallFunctionByNameWithArquments( TEXT("CustomEvent"), pAR, nullptr, true );\n // CustomEvent2 ; 인자가 있는 경우 - FString::Printf함수를 이용해 "함수 이름 %d" 형식으로 구현\n this->CallFunctionByNameWithArquments( *FString::Printf( TEXT( "CustomEvent2 %d"), 123), pAR, nullptr, true);\n ...\n}\n}}}\n\n@@◢ BlueprintNativeEvent @@ ; C++ 네이티브 구현이 존재하지만, 필요시 블루프린트에서 override 할 수 있게 해주는 지정자\nUHT는 해당 함수의 블루프린트 재지정이 존재하면 블루프린트의 그것을, 존재하지 않으면 C++의 함수가 호출되도록 처리\n\n''UFUNCTION( BlueprintNativeEvent ) ''\nvoid OnCollection();\nvirtual void OnCollection_Implementation();\n\n!!!3. UENUM( ) 지정자 - 언리얼 에디터에서 해당 enum을 사용\n / UENUM( BlueprintType ) ; BlueprintType을 넣으면 블루프린트에서도 사용 가능\n{{{\nUENUM( BlueprintType )\nenum class ECharacterClass : uint8\n{\n //! DisplayName은 언리얼 에디터, 블루프린트에서 표시되는 이름\n E_Warrior = 0 UMETA( DisplayName = "Warrior" ),\n E_Mage UMETA( DisplayName = "Mage" ),\n E_Archer UMETA( DisplayName = "Archer" ),\n\n E_MAX,\n};\n}}}\n\n!!!4. UCLASS() 지정자\n이름, 상속 관계 표시, 그리고 엔진 및 에디터 전용 기능을 위한 UCLASS specifier와 meta 지정이 있으며 형식은 다음과 같다.\n / UCLASS specifier 열거값들은 ObjectMacro.h의 namespace UC에서 확인\n{{{\n#include "ClassName.generated.h"\n\nUCLASS([specifier, specifier, ...], [meta(key=value, key=value, ...)])\nclass ClassName : public ParentName\n{\n GENERATED_BODY()\n // ...\n}\n}}}\n\n!!!5. USTRUCT() 지정자 \n / @@color(#ee1b24): 구조체의 이름앞에 F를 붙여야합니다. 이는 댕글링(dangling) 포인터 방지하기 위함입니다. @@\n 댕글링(dangling)포인터 : 삭제된 오브젝트를 참조하여 프로그램이 터지는 현상\n\nUSTRUCT(Atomic, BlueprintType)\n@@◢ Atomic @@ ; 이 구조체는 항상 하나의 단위로 Serialize 됨 (해당 구조체를 디테일패널에서 사용)\n / Atomic을 사용하면 구조체 내부 변수들의 UPROPERTY메크로에 EditAnywhere를 필수적으로 사용\n\n@@◢ BlueprintType @@ ; 해당 구조체를 블루프린트에서 사용\n / 구조체 내부 변수들의 UPROPERTY메크로에 BlueprintReadWrite를 필수적으로 사용\n\n!!!6. 델리게이트 (Delegate) - C++ 함수에서 선언\n컴퓨터 프로그래밍에서 델리게이트는 함수를 안전하게 호출할 수 있는 기능\n\nC++ 언어에서는 델리게이트라는 개념이 존재하지 않고, C++ 의 다음 세대 언어인 C#(CLI 플랫폼 기반)에서 선보인 개념으로\n\n콜백 함수를 등록하기 위해 C 혹은 C++에서 사용한 함수 포인터가 문법이 복잡하고, 위험한 방식이었다면, \n델리게이트는 간편한 문법과 안전성을 갖춰 콜백 함수를 호출하기 위해 고안되었다.\n\n델리게이트가 하나의 함수 뿐만 아니라 동일한 리턴값과 인자 타입을 가지는 여러 개를 관리할 수 있다.\nC# 언어의 주요 패턴 중 하나인 발행/구독(Publish/Subscribe) 패턴의 구현으로 특정 이벤트가 발생하면 델리게이트에 등록된 모든 함수를 한꺼번에 호출할 수 있다.\n\n언리얼에서 델리게이트 기능을 사용하려면 먼저 매크로를 사용해 델리게이트를 선언하고\n지정한 함수의 리턴값과 인자 타입을 가지는 함수만 대표할 수 있습니다. \n\n언리얼 딜리게이트 시스템에 등록 가능한 함수는 다음과 같다.(바인딩)\n ▪ 전역 C++ 함수 : BindStatic API를 사용해 등록\n ▪ 전역 C++ 람다 함수 : BindLambda API를 사용해 등록\n ▪ C++클래스 멤버 함수 : BindRaw API를 사용해 등록\n ▪ 공유포인터 클래스의 멤버 함수 (쓰레드 미지원) : BindSP API를 사용해 등록 \n ▪ 공유포인터 클래스의 멤버 함수 (쓰레드 지원) : BindThreadSafeSP API를 사용해 등록\n ▪ UFUNCTION 멤버 함수 : BindUFunction API를 사용해 등록\n ▪ 언리얼 오브젝트의 멤버함수 : BindUObject API를 사용해 등록\n\n!!!7. 다이내믹 델리게이트 (Dynamic Delegate) - 함수의 이름을 기반으로 등록해 호출하는 방식 \n(C++ 함수 뿐만 아니라 블루프린트 함수도 연결)\n\n블루프린트와 관련된 C++함수는 모두 UFUNCTION 매크로를 사용해야 한다.\n이렇게 블루프린트 객체와도 연동하는 델리게이트를 언리얼 엔진에서는 다이내믹 델리게이트라고 한다.\n\n이름 기반이다보니 저장할 수 있다는 특징이 있습니다만, 반면에 동작이 느리다는 단점이 있다.\n다이나믹 델리게이트를 선언하려면 인자의 이름까지 정확히 일치해야 한다. \n그래서 딜리게이트의 선언도 함수 인자 하나당 타입과 이름 정보가 들어가야 한다.\n\n◢ 다이나믹 델리게이트 바인딩 (함수 이름 문자열을 자동 생성)\n ▪ BindDynamic( UserObject, FuncName ) - 다이내믹 델리게이트에서 호출\n ▪ AddDynamic( UserObject, FuncName ) - 다이내믹, 멀티캐스트 델리게이트에서 호출\n ▪ RemoveDynamic( UserObject, FuncName ) - 다이내믹, 멀티캐스트 델리게이트에서 호출\n\n◢ 다이내믹 델리게이트 실행\n ; 델리게이트를 실행하기 전 "바인딩" 되었는지 반드시 확인해야 한다. (for 코드 안전성)\n ▪ Execute() 함수 ; 델리게이트에 바인딩된 함수를 호출하여 실행\n ▪ IsBound() 함수 ; 델리게이트가 실행해도 안전한 지 검사\n ▪ ExecuteIfBound() 함수 ; 반환값이 없는 델리게이트 호출 (출력 파라미터는 초기화되지 않을 수 있다는 점 주의)\n\n!!!8. 멀티캐스트 델리게이트 ()\n
<html><span style="background:#f8f8ff ; font-family:돋움; font-size: 14px;"> <b> #.윈도우 최소화 </b> </span></html>\n// 최소화시키는 메시지 발생 (WM_SYSCOMMAND 메시지의 SC_MINIMIZE)\n\nSendMessage(hWnd, WM_SYSCOMMAND,SC_MINIMIZE, 0); \n ; 메시지를 큐를 거치지 않고 직접 윈도우 프로시저로 보내 처리\nPostMessage(hWnd,WM_SYSCOMMAND,(WPARAM)SC_MINIMIZE,0); \n ; 메시지를 메시지 큐를 넣고 즉시 리턴 (비동기적으로 처리)\n/*\n * System Menu Command Values\n */\n#define SC_SIZE 0xF000 // 윈도우의 크기를 조정\n#define SC_MOVE 0xF010 // 이동 항목을 선택하여 윈도우를 이동\n#define SC_MINIMIZE 0xF020 // 윈도우를 최소화\n#define SC_MAXIMIZE 0xF030 // 윈도우를 최대화\n...\n''WM_SYSCOMMAND'' 는 시스템 메뉴를 직접 선택하거나 타이틀 바에 있는 최대, 최소, 닫기 버튼 등의 명령들도 이 메시지를 발생한다.\n시스템 메뉴에 있는 명령들은 윈도우를 관리하기 위한 기본적인 명령이므로 응용 프로그램은 이 메시지를 직접 처리하지 않고 보통 DefWindowProc으로그냥 보내 준다.\n\n<html><span style="background:#f8f8ff ; font-family:돋움; font-size: 14px;"> <b> #.API, ShellExecute( ); </b> </span></html>\n; 외부의 프로그램을 실행시키고자 할 때 사용하는 Windows API 함수\n참고 ; http://blog.daum.net/_blog/BlogTypeView.do?blogid=0S1mF&articleno=1125&categoryId=41®dt=20180416104800\n\n''응용프로그램 실행하기''\n일반적으로 가장 많이 사용하는 기능 중에 하나이다. 해당 함수의 두 번째 인자에 “open” 키워드를 명시한 후에 세 번째 인자에 실행할 응용프로그램의 경로를 명시하면 된다.\nShellExecute( Handle, ‘open’, ‘C:\s\sSMIS.EXE’, nil, nil, SW_SHOWNORMAL );\n\n''인터넷 익스플로러 사용하기''\n인터넷 익스플로러를 실행한다.\n// 현재 익스플로러가 실행중인 경우 새탬 혹은 현재 페이지에서 www.google.com에 접속한다.\nShellExecute( nil, ‘open’, ‘www.google.com’, nil, nil, SW_SHOWNORMAL );\n\n// 무조건 새로운 익스플로러가 실행되어 www.google.com에 접속한다.\nShellExecute( nil, ‘open’, ‘iexplore’, ‘http://www.google.com’, nil, SW_SHOWNORMAL );\n\n<html><span style="background:#f8f8ff ; font-family:돋움; font-size: 14px;"> <b> #.윈도우(Form)의 텍스트(caption) 바꾸기 </b> </span></html>\n\n''GetWindowText''(\n HWND, // 캡션 정보를 가져 올 윈도우 핸들\n LPCTSTR, // 담을 문자열 변수\n UINT // 최대 글자 수\n);\n문자열 변수에 지정된 창의 타이틀바 텍스트를 복사한다. (지정된 윈도우가 컨트롤이면 컨트롤의 텍스트를 복사)\n\n''SetWindowText''(\n HWND, // 캡션 정보를 변경 할 윈도우 핸들\n LPCTSTR // 담을 문자열 변수\n);\n지정된 창의 타이틀바 텍스트를 변경한다. (지정된 윈도우가 컨트롤이면 컨트롤의 텍스트를 변경)\n\nGetWindowText( ... );와 SetWindowText( ... );는 다른 응용 프로그램의 컨트롤의 텍스트는 가져 올 수 없다.\n\nBOOL ''InvalidateRect''(HWND hWnd, CONST RECT*lpRect, BOOL bErase);\n특정 영역이나 윈도우 영역을 무효화하여, WM_PAINT 메시지를 발생시켜 화면을 다시 그리도록 한다.\n / hWnd:무효 영역을 설정할 윈도우의 핸들. NULL일 경우 모든 윈도우를 무효화한다.\n / lpRect:무효화할 영역. NULL이면 작업 영역 전체가 무효화된다.\n / bErase:무효 영역의 배경을 먼저 지울 것인가를 지정한다. TRUE이면 BeginPaint 함수가 배경을 먼저 지운후 작업 영역을 그린다.\n\n\n
출처 ; https://aucd29.tistory.com/1668 (aucd29's devBox)\n\nWM_CTLCOLOR Notification\nThe WM_CTLCOLOR message is used in 16-bit versions of Windows to change the color scheme of list boxes, the list boxes of combo boxes, button controls, edit controls, static controls, message boxes, and dialog boxes.\n\nNote For information related to this message and 32-bit versions of Windows, see Remarks.\n\nWM_CTLCOLOR\nWPARAM wParam // Handle to a display context (DC).\nLPARAM lParam; // Handle to a child window (control).\n\nReturn Value\nIf an application processes this message, it returns a handle to a brush. The system uses the brush to paint the background of the control.\n\nRemarks\nThe WM_CTLCOLOR message has been replaced by more specific notifications in 32-bit versions of Windows. These replacements include the following:\n\nWM_CTLCOLORBTN // button\nWM_CTLCOLOREDIT // edit\nWM_CTLCOLORDLG // dialog\nWM_CTLCOLORLISTBOX // listbox\nWM_CTLCOLORSCROLLBAR // scrollbars\nWM_CTLCOLORSTATIC // static\nFor more information about these messages, see the Platform SDK.\n\nThis message is sent to the parent window of a control when it is about to be drawn. By responding to this message, the parent window can set the control's foreground and background colors.\n\n<html> \n<div style="border: 1px solid #3058D2; padding: 10px;">\n<span style="font-size: 14px;"> #. How to set transparent background for static control? </span>\n</div> </html>\n출처 ; (요약 정리)\nhttps://www.codeproject.com/Questions/607177/Howplustoplussetplustransparentplusbackgroundplusf\nhttp://soen.kr/lecture/win32api/reference/Message/WM_CTLCOLORSTATIC.htm\n\nstatic HBRUSH hBrush = CreateSolidBrush(RGB( 230, 230, 230));\nWNDCLASS WndClass;\n\n<html> <span style="background:#FFEEEE; font-size: 10pt;"> 1. WndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); </span> </html>\nstatic HWND hStatic;\ncase WM_CREATE:\n{\n hStatic = CreateWindowEx(WS_EX_TRANSPARENT,\n TEXT("Static"), TEXT("text"), WS_CHILD, \n 10, 150, 250, 70, hWnd, NULL, g_hInst, NULL);\n ShowWindow(hStatic, SW_SHOW);\n UpdateWindow(hStatic);\n}\nbreak;\n\ncase WM_CTLCOLORSTATIC:\n{\n HDC hdcStatic = (HDC) wParam;\n SetBkMode(hdcStatic, TRANSPARENT);\n return (INT_PTR)(HBRUSH)GetStockObject(NULL_BRUSH);\n}\nbreak;\n\n<html> <span style="background:#FFEEEE; font-size: 10pt;"> 2.WndClass.hbrBackground = hBrush; // 윈도우 생성시 hbrBackground 특정 색으로 설정한 경우 </span> </html>\nstatic HWND hS1;\ncase WM_CREATE:\n{\n hS1=CreateWindow("static", NULL, WS_CHILD | WS_VISIBLE,\n 10,50,300,25,hWnd,(HMENU)0,g_hInst,NULL);\n SetWindowText( hS1, "부모 윈도우가 설정한 색상" );\n}\nbreak;\n\ncase WM_CTLCOLORSTATIC:\n{\n HDC hdcStatic = (HDC)wParam;\n if ((HWND)lParam == hS1)\n {\n SetTextColor(hdcStatic, RGB(255, 0, 0));\n SetBkMode(hdcStatic, TRANSPARENT);\n return (LRESULT) hBrush;\n }\n}\nbreak;\n\n\n
\n<html> \n<div style="border: 1px solid #3058D2; padding: 10px;">\n<span style="font-size: 14px;"> #. winsock으로 자신의 ip주소 얻기 </span>\n</div> </html>\n출처 ; https://yk209.tistory.com/entry/winsock으로-자신의-ip주소-얻기\n{{{\n#include <stdio.h>\n#include <string.h>\n#include <winsock2.h>\nint main()\n{\n WORD w;\n WSADATA wsa;\n char name[255];\n char *ip;\n PHOSTENT host;\n w=MAKEWORD(2,0);\n\n if(WSAStartup(w, &wsa)==0)\n {\n if(gethostname(name,sizeof(name))==0)\n {\n if((host=gethostbyname(name))!=NULL)\n {\n ip=inet_ntoa(*(struct in_addr *)*host->h_addr_list);\n }\n }\n }\n\n printf("%s\sn",ip);\n}\n}}}\n\n<html> \n<div style="border: 1px solid #3058D2; padding: 10px;">\n<span style="font-size: 14px;"> #. MAC Address 얻기 </span>\n</div> </html>\n참고;\nhttps://codingcoding.tistory.com/796\nhttp://blog.naver.com/PostView.nhn?blogId=tipsware&logNo=220750343628&categoryNo=44&parentCategoryNo=0&viewDate=¤tPage=1&postListTopCurrentPage=1&from=section\n\nGetAdaptersInfo 함수를 사용해서 윈도우 기반의 컴퓨터에서 MAC Address를 얻어오는 방식\n(Iphlpapi.lib 함수를 아래와 같이 프로그램에 포함)\n\n#pragma comment (lib, "Iphlpapi.lib")\n\n네트워크 카드(NIC)가 1개인 경우\n{{{\nIP_ADAPTER_INFO *adapter_info;\nDWORD result;\nULONG info_size = sizeof(IP_ADAPTER_INFO);\n \nadapter_info = (IP_ADAPTER_INFO *)malloc(info_size);\n \nif (adapter_info == NULL)\n return -1;\n \nresult = GetAdaptersInfo(adapter_info, &info_size)\n}}}\n\ndo while문을 사용하여 NIC 여러 개의 MAC Address를 얻는 경우\n{{{\nchar str[13];\nunsigned char mac[6];\n \nlist<char[13]> mac_address;\n \nif (result == NO_ERROR)\n{\n IP_ADAPTER_INFO *adapter = adapter_info;\n \n do {\n for (i = 0; i < 6; i++)\n mac[i] = (unsigned char)adapter->Address[i];\n sprintf_s(str, "xxxxxx", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);\n mac_address.push_back(str);\n \n adapter = adapter->Next;\n } while (adapter);\n}\nelse\n{\n nret = -1;\n}\n \nfree(adapter_info);\n}}}\n\n
''유니버설 윈도우 플랫폼(Universal Windows Platform, UWP)''은 (from 위키백과)\n마이크로소프트가 개발한 API의 하나로서, 윈도우10에 처음 도입되었다. 이 플랫폼의 목적은 제각기 재개발할 필요 없이 윈도우 10, 윈도우 10 모바일, 엑스박스 원, 홀로렌즈에서 실행할 유니버설 앱의 개발을 돕기 위한 것이다. C++, C 샤프, VB.NET, XAML을 사용한 윈도우 앱 개발을 지원한다. 이 API는 C++로 구현되어 있으며 C++, VB.NET, C#, F 샤프, 자바스크립트로 지원된다.\n윈도우 서버 2012, 윈도우 8에 처음 도입된 윈도우 런타임 플랫폼의 확장 기능으로 설계된 UWP는 여러 종류의 장치들에서 잠재적으로 구동될 앱들을 개발자들이 개발할 수 있게 한다.\ncf. Visual Studio 2017(및 Windows 10) 이상 설치\n\nkeyword ; webview scriptnotify\n\n\n
<html>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<span style="font-size: 14px;"> #. 프로그램 실행 시 인자 값 주기 </span>\n</div> </html>\n출처 ; https://neverstory.tistory.com/entry/TIP-014-프로그램-실행-시-인자-값-주기\n\nex)\n// 인자 값 넘기는 이벤트 ( 송신 )\nprivate void button1_Click(object sender, EventArgs e)\n{\n Process.Start(@"D:\saa.exe","11");\n}\n\n// 인자 값 받는 이벤트 ( 수신 ) - aa.exe 부분\nprivate void Form1_Load(object sender, EventArgs e)\n{\n string[] strArg = Environment.GetCommandLineArgs();\n if( strArg.Length > 1 )\n {\n label1.Text = strArg[1];\n }\n}\n\n위와 같이 실행 시키면 되는데 뒤에 인자로 "11"이란 값을 주었습니다.\n폼 로드시에 Envirionment의 GetCommandLineArgs()함수를 이용해서 값을 받아오고 있다.\n\n\n
Install-Package HtmlAgilityPack -Version 1.11.18 ; NuGet 패키지 관리자 콘솔로 등록\n{{{\nusing agi = HtmlAgilityPack;\n\n//ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ\nstring strDocumentText = (string)test.DocumentText;\n\n<html>\n <head></head>\n <body>\n <input type="hidden" name="bridge_login_token" id="bridge_login_token" value="8352deb69f6bb" />\n </body>\n</html>\n\n//ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ\nstatic string strLoginToken = null;\n\nagi.HtmlDocument doc = new agi.HtmlDocument();\ndoc.LoadHtml(strDocumentText);\n\nagi.HtmlNode node = doc.GetElementbyId("bridge_login_token");\n\nif (node != null)\n{\n var id = node.Id;\n strLoginToken = node.Attributes["value"].Value;\n#if DEBUG\n MessageBox.Show(strLoginToken, "check");\n#endif\n}\n}}}\n\n
<html> <a name="Page200208"> </a> </html>\n''C++/CLI(Common Language Infrastructure)''은 \n다른 CLS 언어가 하지 못하는 일을 해낸다. 기존에 작성한 네이티브 C++ 라이브러리와 닷넷 프레임워크를 연결하는 역할은 C++/CLI밖에 하지 못하는 것이다.\n\n''참고 사이트''\n(MFC) 다이얼로그 기반에 웹 브라우저 띄우기 - https://shaeod.tistory.com/537\n(MFC) HTML 파서 만들기 #1 - http://webprogramer.kr/blog/P000000039/post.do\n(MFC) 로그파일 생성하고 쓰기 - https://m.blog.naver.com/ddarunglee/220285614541\n(MFC) A Progress bar with bitmap fill - http://www.mctainsh.com/Articles/MFC/cprogressctrlst.aspx\nMFC 이용 HTML Parsing하기\n윈도우 Message 사용 및 PostMessage와 SendMessage의 차이 - https://daru87.tistory.com/entry/윈도우-Message-사용-및-PostMessage와-SendMessage의-차이\n\n<html>\n<a href="#Page200208_01"> #. Active 컨트롤, IWebBrowser2를 사용 </a> <br>\n<a href="#Page200208_02"> #. CBitmapButton 설정 (by UI기준) </a> <br>\n<a href="#Page200208_03"> #. MFC Progress Control </a> <br>\n<a href="#Page200208_06"> #. 스레드함수에서 static컨트롤에 값 표시 </a> <br>\n<a href="#Page200208_04"> #. MFC 응용 프로그램을 배포하려면... </a> <br>\n<a href="#Page200208_05"> #. MFC에서 콘솔창 띄우기 </a> <br>\n</html>\n\n<html><span style="background:#E2E2ff ; font-family:돋움; font-size: 14px;"> <b> #. 메인 윈도우 얻어서 Progress Bar 접근 (컨트롤에 접근) </b> </span></html>\nCWinApp *pApp = (CWinApp *)AfxGetApp();\nCWnd *pWnd = pApp->GetMainWnd();\n\nCProgressCtrl *barCtl = (CProgressCtrl *)pWnd->GetDlgItem(IDC_PROGRESS1);\nbarCtl->SetPos(10);\n\n-. 버튼의 BN_CLICKED 이벤트 발생\n / SendMessage(버튼을 포함하고 있는 윈도우 핸들, WM_COMMAND, MAKEWPARAM(버튼의 컨트롤 아이디, BN_CLICKED), 0L);\n / (MFC) pDlg->SendMessage(WM_COMMAND, MAKEWPARAM(IDC_BtnGameStart, BN_CLICKED), NULL);\n\n<html><span style="background:#E2E2ff ; font-family:돋움; font-size: 14px;"> <b> #. 다이얼로그 제목 바꾸기 </b> </span></html>\n-. 기본적은 틀로 생성\n000App.cpp 파일에서 000App::InitInstance() 부분에\n\n// The one and only window has been initialized, so show and update it.\nm_pMainWnd->ShowWindow(SW_SHOW);\nm_pMainWnd->UpdateWindow();\n\nm_pMainWnd->SetWindowText( "프로그램 제목 변경" );\n\n-. 다이얼로그 기반의 프로그램\n000Dlg.cpp 파일에서 C000Dlg::OnInitDialog() 부분에\n\nSetIcon(m_hIcon, TRUE); // 큰 아이콘을 설정합니다.\n ....\nSetWindowText(_T("프로그램 제목 변경"));\n\n<html><span style="background:#E2E2ff ; font-family:돋움; font-size: 14px;"> <b> #. mfc 다이얼로그 크기 변경 위치 이동 </b> </span></html>\n● 다이얼로그 속성, 설정 변경\n 모양 > Border 속성을 변경 해야 다이얼로그 크기를 변경할 수 있다. (Default 값 = Dialog Frame) \n참고 ; https://kjk92.tistory.com/17\n\n● (MFC) 다이얼로그에 배경넣기 ; https://phiru.tistory.com/78\n\n다이얼로그 OnInitDialog();에서\nthis->SetWindowPos(NULL, 0, 0, 300, 500, SWP_NOREPOSITION);\nUINT nFlags // 윈도우 순서, 위치, 크기에 대한 속성 사용 여부\n 인자값\n SWP_NOZORDER => pWndInsertAfter 속성 사용 안함(값이 있더라도 무시)\n SWP_NOREPOSITION => 윈도우 위치 사용 안함(값이 있더라도 무시)\n SWP_NOSIZE => 윈도우 크기 사용 안함(값이 있더라도 무시)\n\n<html><span style="background:#E2E2ff ; font-family:돋움; font-size: 14px;"> <b> #. 다이얼로그 Border가 None일때 이동하기 </b> </span></html>\n원문 ; https://pangsan.tistory.com/164\n\n왼쪽 마우스를 누른상태에서 드레그를 하기 위해 WM_LBUTTONDOWN 메시지를 추가하고\nSendMessage( WM_NCLBUTTONDOWN, HTCAPTION, 0 ); 호출한다.\n\nvoid XXXX::''OnLButtonDown''(UINT nFlags, CPoint point)\n{\n // TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.\n SendMessage( WM_NCLBUTTONDOWN, HTCAPTION, 0 );\n\n CDialog::OnLButtonDown(nFlags, point);\n}\n\n\n<html> <a name="Page200208_01"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page200208"> <span style="font-size: 14px;"> #. Active 컨트롤, IWebBrowser2를 사용 </span> </a>\n</div> </html>\n<html><span style="background:#E2E2ff ; font-family:돋움; font-size: 14px;"> <b> #. (MFC) CWebBrowser2 내장 IE 브라우저 이슈 </b> </span></html>\n출처 ; https://del4u.tistory.com/123 (창조적 귀차니즘)\n\n1.에러 우회하기\n // CString strURL = _T("https://www.google.com/");\n (CWebBrowser2) m_WebViewer.put_Silent(TRUE);\n m_WebViewer.SetWindowPos(NULL, 0, 32, 1280, 588, SWP_NOREPOSITION);\n m_WebViewer.Navigate(sNoticeURL, NULL, NULL, NULL, NULL);\n2...\n3.헤더에 user agent 세팅하기\nCString userAgent;\nuserAgent = _T("User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/7.0");\nCComVariant headers(userAgent.IsEmpty() ? NULL : (LPCTSTR)userAgent);\nm_browser.Navigate(m_url, NULL, NULL, NULL, &headers);\n\n{{{\n#include <Mshtml.h>\n/////////////////////////////////////////////////////////////////////////////////////////////////////////\n// <BODY><INPUT id=login_token type=hidden value=4f3b66 name=login_token> </BODY>\n/////////////////////////////////////////////////////////////////////////////////////////////////////////\n// 05Dlg.h\nCString 05Dlg::strBridge_login_token;\n\n// 05Dlg.cpp\nvoid 05Dlg::DocumentCompleteExplorer1(LPDISPATCH pDisp, VARIANT* URL)\n{\n\n // BSTR to char*\n char* pbstr;\n USES_CONVERSION; // <atlconv.h>, convert를 위한 macro\n pbstr = OLE2A( URL->bstrVal ); // BSTR -> char\n\n if (strstr(pbstr, "login/execute") != NULL)\n {\n LPDISPATCH pdisp = m_Page_Viewer.get_Document();\n CComPtr<IHTMLDocument2> pDoc = (IHTMLDocument2*)pdisp;\n\n CComPtr<IHTMLElement> pHTMLElmt;\n pDoc->get_body(&pHTMLElmt);\n CComBSTR tmpstr = _T("");\n pHTMLElmt->get_outerHTML(&tmpstr);\n\n USES_CONVERSION;\n CString strHTML;\n strHTML = OLE2A(tmpstr);\n\n int nStart=0, nEnd=0;\n nStart = strHTML.Find(_T("value="), nEnd);\n nStart += (int)strlen("value=");\n nEnd = strHTML.Find( _T(" name="), nStart);\n\n strlogin_token.Empty();\n strlogin_token = strHTML.Mid(nStart, nEnd - nStart);\n\n MessageBox(strlogin_token, _T("Check"), MB_OK);\n }\n}\n}}}\n<html><span style="background:#E2E2ff ; font-family:돋움; font-size: 14px;"> <b> #. CString strToken; --> char login_token[MAX_STRING_LEN]; 변환 </b> </span></html>\nUSES_CONVERSION;\nCString strHTML;\nstrHTML = OLE2A(tmpstr);\n\n// 원하는 문자열 추출\nint nStart = 0, nEnd = 0;\nnStart = strHTML.Find(_T("value="), nEnd);\nnStart += (int)strlen("value=");\nnEnd = strHTML.Find(_T(" name="), nStart);\n\nCString strToken; // 문자열 추출\nstrToken = strHTML.Mid(nStart, nEnd - nStart); \n\n// CString -> WCHAR * 변환\nWCHAR *wszToken = T2W(strToken.GetBuffer());\n\n// WCHAR * 변환 -> char login_token [MAX_STRING_LEN]; 으로 변환\nint len = WideCharToMultiByte(CP_ACP, 0, wszToken, -1, NULL, 0, NULL, NULL);\nWideCharToMultiByte(CP_ACP, 0, wszToken, -1, strBridge_login_token, len, NULL, NULL);\n\n\n<html> <a name="Page200208_02"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page200208"> <span style="font-size: 14px;"> #. CBitmapButton 설정 (by UI기준) </span> </a>\n</div> </html>\n참고 ; https://cysnim12.tistory.com/entry/CBitmapButton-사용하기 - CBitmapButton 사용하기\n\n-. MFC 클래스 추가 마법사를 통해서 CBitmapButton test; 변수 추가\n (Dialog 클래스에 맵버 변수로 등록)\nclass CMFCButton02Dlg : public CDialogEx\n{\n...\npublic:\n CBitmapButton test;\n};\n\n-. Dialog 위에 Button 위치 설정 ; Button Control 속성에서 Owner Draw = True로 반드시 설정\n버튼 Control이 버튼과 되어 있는지 확인\nvoid CMFCButton02Dlg::DoDataExchange(CDataExchange* pDX)\n{\n CDialogEx::DoDataExchange(pDX);\n DDX_Control(pDX, IDC_BUTTON1, test);\n}\n\n-. 리소스 파일 등록 (*.bmp)\nIDB_StartBtnDefault , IDB_StartBtnPress, IDB_StartBtnOver, IDB_StartBtnDisable\n\n-. Dialog 초기화 함수에서 마우스 클릭에 따른 이미지 설정\nBOOL CMFCButton02Dlg::OnInitDialog()\n{\n CDialogEx::OnInitDialog();\n...\n // TODO: 여기에 추가 초기화 작업을 추가합니다.\n test.LoadBitmaps(IDB_StartBtnDefault, IDB_StartBtnPress, IDB_StartBtnOver, IDB_StartBtnDisable);\n test.SizeToContent(); // 버튼의 크기에 맞춰 자동으로 이미지 크기를 조정\n test.EnableWindow(FALSE); // 비활성화된 상태\n // GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE);\n\n return TRUE;\n}\n\n-. 버튼 이미지 설정 예\nm_OK.LoadBitmaps( IDB_OKU, IDB_OKD ); cf. "U"=Up/ "D"=Down/ "F"=Fource/ "X"=disable\n\n\n<html> <a name="Page200208_03"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page200208"> <span style="font-size: 14px;"> #. MFC Progress Control </span> </a>\n</div> </html>\nhttps://sincereguy.tistory.com/10\nhttps://m.blog.naver.com/kimsw3446/100203594335 - Progress Control 사용방법 (쓰레드를 사용해서 프로그레스 바를 이동)\ncf.쓰레드에서 호출되는 함수는 정적 함수로 등록 ; static UINT ThreadFunc(LPVOID lParam);\n{{{\nBOOL CMFCApplication5Dlg::OnInitDialog()\n{\n CDialogEx::OnInitDialog();\n...\n CProgressCtrl m_bar;\n m_bar.SetRange32(0, 100); // 범위\n m_bar.SetPos(20); // 현재 위치\n SetTimer(1, 500, NULL); // 대부분 SetTimer함수를 이용하여 feedback ; WM_TIMER 발생\n\n return TRUE; // 포커스를 컨트롤에 설정하지 않으면 TRUE를 반환합니다.\n}\n\nvoid CMFCApplication5Dlg::OnTimer(UINT_PTR nIDEvent)\n{\n CDialogEx::OnTimer(nIDEvent);\n m_bar.OffsetPos(-1); //프로그레스바 1씩 감소\n}\n}}}\n처음에 전체길이가 지정되면 그 다음 진행과정을 나타낼 때, 현재 위치만 설정\n\n// Sets range of values for the control. (16-bit limit)\nvoid SetRange(_In_ short nLower, _In_ short nUpper);\n\n// Sets range of values for the control. (32-bit limit)\nvoid SetRange32(_In_ int nLower, _In_ int nUpper);\n\n// Sets the current position within the set range of the control.\nint SetPos(_In_ int nPos);\n\nSetTimer(UINT_PTR nIDEvent, UINT nElapse, NULL); \n / UINT nElapse ; 일정 시간 (기본단위는 밀리초(millisecond, ms = 1/1000 초))\n / callback 될 함수 포인터, NULL 일 경우 WM_TIMER 메시지가 호출\nBOOL KillTimer(UINT_PTR nIDEvent);\n\n''Progress bar의 색은 현재 Windows시스템이 어떤 테마를 사용하느냐''에 달려 있기 때문에\nAero 테마를 쓴다면 녹색만 표시 되고 위의 코드에 의해 다른 색으로 변경되지 않는다.\n\n√.원하는 컨트롤만 테마를 변경/해제하는 방법\nSetWindowTheme(GetDlgItem(프로그레스바 아이디)->GetSafeHwnd(), L"", L"");\n\nm_Bar_Progress.SetWindowPos(NULL, 27, 680, 740, 6, SWP_NOREPOSITION);\nm_Bar_Progress.SetBarColor(RGB(13, 110, 255));\nm_Bar_Progress.SetBkColor(RGB(0,0,0));\nm_Bar_Progress.SetRange32(0, 100);\n\n또는 m_Bar_Progress.SendMessage(PBM_SETBARCOLOR, 0, (LPARAM)(COLORREF)RGB(255, 0, 0));\n\n\n<html> <a name="Page200208_06"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page200208"> <span style="font-size: 14px;"> #. 스레드함수에서 static컨트롤에 값 표시 </a>\n</div> </html>\n원문 ; http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNo=20&no=768359&ref=768359 정리\n\nMFC 다이얼로그 기반에 프로젝트에서\n쓰레드 내에서 변경된 내용을, static 컨트롤에 표시할 때\n쓰레드 함수에서 MFC 핸들맵 접근하는 함수(UpdateData) 를 직접 호출하면 static 컨트롤에 원하는 표시를 할 수 없다.\n\n스태틱 갱신 메시지 핸들러 만들고, thread 함수 내에서 SendMessage로 메시지를 보내서 처리한다.\n(∵ 메시지 종류와 메시지를 처리하는 함수가 필요)\n\n쓰레드가 아니더라도 바탕색을 투명하게 처리한 static 컨트롤에서\n특히 Progress 바의 상태나 빈번한 내용을 표시할 경우, 갱신되지 않고 겹치는 현상이 나타날 수도 있다.\n\n''▷ 08Dlg.h''\n#define THREAD_UPDATE ( WM_USER +1 ) // 메시지 종류\n\nclass 08Dlg : public CDialogEx\n{\n...\n static UINT ThreadProc(void *lParam);\n afx_msg LRESULT OnStaticUpdate(WPARAM w, LPARAM l);\n\n CStatic m_Text1; // 클래스 마법사를 통해 다이얼로그 리소스의 static control과 연결\n}\n\n''▷ 08Dlg.cpp''\nint g_nLocalVersion = 0; // 현재 버전\nWCHAR g_szStaticTitle[MAX_STRING_LEN] = TEXT("Tool"); // 형식 Tool Ver. 2\n\nBEGIN_MESSAGE_MAP(08Dlg, CDialogEx)\n...\n ON_MESSAGE(THREAD_UPDATE, OnStaticUpdate) // 메시지에 따른 함수 호출\nEND_MESSAGE_MAP()\n\n//=========================================\n// 함수: LRESULT OnStaticUpdate(WPARAM w, LPARAM l);\n// 목적: Static Control의 문자열 변경\n//=========================================\nLRESULT CGP2Launcher_08Dlg::OnStaticUpdate(WPARAM w, LPARAM l)\n{\n CRect rect;\n CStatic * pStatic = (CStatic *)GetDlgItem(w);\n\n pStatic->GetWindowRect(&rect);\n ScreenToClient(&rect);\n InvalidateRect(&rect);\n pStatic->SetWindowTextW((LPCTSTR)l);\n this->UpdateWindow(); // 내용이 변경되지 않을 때만 호출\n\n return S_OK;\n}\n\n//=========================================\nUINT 08Dlg::ThreadProc(void *lParam)\n{\n...\n // 버전 표시\n CString strVer;\n strVer.Format(TEXT("%s Ver. %d"), g_szStaticTitle, g_nLocalVersion);\n pDlg->SendMessage(THREAD_UPDATE, (WPARAM)IDC_STATICTitle, (LPARAM)(LPCTSTR)strVer);\n// pDlg->PostMessage(THREAD_UPDATE, (WPARAM)IDC_STATICTitle, (LPARAM)(LPCTSTR)strVer);\n...\n return 0;\n}\n\n''★ PostMessage 함수''\nPostMessage 함수는 Msg 인수로 지정된 메시지를 hWnd 윈도우의 메시지 큐에 집어넣어 윈도우 프로시저에서 이 메시지를 처리하도록 한다. @@color(#ee1b24): 메시지를 메시지 큐에 넣어 놓기만 하고 곧바로 리턴하므로 메시지는 곧바로 처리되지 않는다.@@ 큐에 붙여진 메시지는 GetMessage 에 의해 읽혀지고 DispatchMessage 에 의해 윈도우 프로시저로 보내져 처리될 것이다.\n\n급하게 처리될 필요가 없거나 또는 지금 하고 있는 작업을 완전히 끝내야만 처리할 수 있는 메시지는 PostMessage 함수로 큐에 붙인다. 이 함수로 붙여진 메시지는 언제 처리될지 정확하게 예측하기 힘들다. 그래서 붙여지는 메시지의 wParam 과 lParam 에는 지역 포인터를 사용하지 않아야 한다. 메시지를 붙일 시점에는 포인터가 존재했더라도 메시지가 처리될 시점에는 포인터가 무효해질 수 있기 때문이다.\n\n''★ SendMessage 함수''\n메시지를 큐에 넣는 것이 아니라 곧바로 윈도우 프로시저로 보내 즉각 처리하도록 하며 메시지가 완전히 처리되기 전에는 리턴하지 않는다. 즉 블록시킨다. 그래서 SendMessage는 윈도우간, @@color(#ee1b24): 특히 부모 윈도우와 차일드 컨트롤간의 통신에 자주 사용된다. @@\n\n\n<html> <html> <a name="Page200208_04"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page200208"> <span style="font-size: 14px;"> #. MFC 응용 프로그램을 배포하려면... </span> </a>\n</div> </html>\n원문 ; http://blog.naver.com/tipsware/220945066758\n\n-. 실행파일 배포 ; 프로그램 개발이 완료된 후에 이 프로그램을 사용할 컴퓨터에 실행파일을 전달하는 과정\n\n-. 배포용 실행파일 만들기\n / Visual C++에서 Release 모드로 빌드\n (첫 빌드할 때는 가능한 솔루션 다시 빌드를 실행 )\n -> 다른 컴퓨터에서 실행 ; 배포용 실행 파일임에도 불구하고 *.dll 파일이 없다는 시스템 오류 메시지 발생\n (∵ Release 기본 설정값 ; '공유 DLL에서 DLL 사용)\n / 프로젝트 속성창에서\n 구성 속성 >> 일반 >> MFC 사용 : '정적 라이브러리에서 MFC 사용' 으로 설정\n\n-. 참고 ; Rlease 모드에서 '공유 DLL에서 MFC 사용' 이라고 하면 Visual Studio가 설치 안된 컴퓨터에서 오류를 발생했었지만, \n VS2019로 개발해서 Windows10에 설치하는 경우에는 이제 오류가 발생하지 않습니다. (원문 인용)\n\n\n<html> <html> <a name="Page200208_05"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page200208"> <span style="font-size: 14px;"> #. MFC에서 콘솔창 띄우기 </span> </a>\n</div> </html>\n원문 ; https://www.jakeworld.net/125\n\n참고로 <stdafx.h> 에 \n#ifdef _DEBUG\n#pragma comment(linker, "/entry:WinMainCRTStartup /subsystem:console")\n#endif\n이렇게 설정할 수도 있지만 경고 메시지가 발생\n\nAllocConsole(); // 콘솔을 할당\nFreeConsole(); // 콘솔을 해제\n\n#include <io.h>\n#include <fcntl.h>\n#include <stdio.h>\n#include <iostream>\n\n// 초기화 콘솔을 열고 stdout, stdin 설정후 콘솔을 닫음\nAllocConsole();\n\nint hCrtout = _open_osfhandle((long)GetStdHandle(STD_OUTPUT_HANDLE), _O_TEXT);\nFILE *hout = _fdopen(hCrtout, "w");\n*stdout = *hout;\nint hCrtin = _open_osfhandle((long)GetStdHandle(STD_INPUT_HANDLE), _O_TEXT);\nFILE *hin = _fdopen(hCrtin, "r");\n*stdin = *hin;\nsetvbuf(stdin, NULL, _IONBF, 0);\n// FreeConsole(); \n\nSetConsoleTitle(_T("Furyheimdall's Console"));\n\n사용 ; \nif(AllocConsole())\n{\n printf("Test ... \sn");\n}\n\n<html><span style="background:#E2E2ff ; font-family:돋움; font-size: 14px;"> <b> #. (MFC) CString 형 데이터, 콘솔 창에 출력 std::cout, std::wcout </b> </span></html>\n원문 ; http://blog.naver.com/chansung0602/221041052270\n\nCString cs("Hello");\nstd::wcout << (const wchar_t*)cs << std::endl;\n\n
(C++) Zip Utils - clean, elegant, simple, C++/Win32 - https://blog.naver.com/binoz/40044276494\n(MFC) 파일 ZIP 압축/해제 활용하기 - https://zadd.tistory.com/53\n\n<html><span style="background:#E2E2ff ; font-family:돋움; font-size: 14px;"> <b> #. Visual Studio 2017 - MFC 설치하기 (MFC 추가, 설치) </b> </span></html>\n\n스튜디오(C++ 환경)만을 설치하고 비주얼 스튜디오 2017을 실행해보면 \n새 프로젝트 창에서 <MFC 응용 프로그램>이 없는 것을 발견 할 수 있다.\n\n비주얼 스튜디오 2017 설치(추가 설치는 <수정> 버튼 클릭) 시 나오는 \n메뉴에서 <C++를 사용한 데스크톱 개발>을 선택하시고 \n오른쪽의 <설치 세부 정보>에서 <x86 및 x64용 Visual C++ MFC>를 선택하시고 설치한다.\n\n\n<html><span style="background:#E2E2ff ; font-family:돋움; font-size: 14px;"> <b> #. Visual Studio 불필요한 파일 정리하기 </b> </span></html>\n원문 ; https://smok95.tistory.com/211\n\nfileCleaner.bat 파일\ndel /f /q /s /a rhsa *.bak *.ncb *.obj *.pdb *.idb *.ilk *.pch *.suo *.aps *.opt *.sbr *.bsc *.user *.log\npause\n\n\n<html><span style="background:#E2E2ff ; font-family:돋움; font-size: 14px;"> <b> #. does not found "tmschema.h" </b> </span></html>\nVS2008부터 개정된 부분으로, 아래와 같이 수정한다.\n\n#include <tmschema.h> 를\n\n#if _MSC_VER <1700 // Before Visual Studio 2012\n#include <tmschema.h>\n#else\n#include <vsstyle.h>\n#endif\n\n참고, CXListCtrl - Visual Studio 2012에서 컴파일 하기\nhttp://rexhitechdevelopment.blogspot.com/2016/01/cxlistctrl-visual-studio-2012-httpwww.html
<html> <a name="Page200220"> </a> </html>\n<html>\n<a href="#Page200220_04"> #. Windows 파일 무결성 – OpenSSL 라이브러리 사용 </a> <br>\n<a href="#Page200220_01"> #. (MFC) CBitmapButton 클래스의 마우스 Hover 기능 추가 </a> <br>\n<a href="#Page200220_02"> #. (MFC) 디스크 공간 정보 출력하기 </a> <br>\n<a href="#Page200220_03"> #. ini 파일 생성 및 읽고 쓰기 </a> <br>\n</html>\n\n<html><span style="background:#E2E2ff ; font-family:돋움; font-size: 12px;"> <b> ▷ (MFC) GetModuleFileName 이용하여 현재 실행 경로 얻기 </b> </span></html>\n원문 ; https://shaeod.tistory.com/600\n\nCString CAdoTestDlg::GetExecutedPath( )\n{\n CString strResult;\n CString strPath;\n\n if( GetModuleFileName( nullptr, strPath.GetBuffer(_MAX_PATH + 1), MAX_PATH ) != FALSE )\n {\n strPath.ReleaseBuffer( );\n\n strResult = strPath.Left( strPath.ReverseFind( '\s\s' )+1 );\n }\n else\n {\n }\n\n return strResult;\n}\n\n<html><span style="background:#E2E2ff ; font-family:돋움; font-size: 12px;"> <b> ▷ 콘트롤의 EnableWindow( ... ); 함수 - TRUE 활성화/ FALSE 비활성화 </b> </span></html>\nMFC에서 윈도우폼에 사용된 콘트롤에 대한 능동적인 활성화와 비활성화를 위한 멤버함수\n버튼을 EnableWindow(FALSE); 할 경우 비활성화된 버튼 형태로 표시\n\n버튼변수명.EnableWindow(TRUE/ FALSE);\nGetDlgItem(IDC_BUTTON)->EnableWindow(TRUE/ FALSE);\n\n<html><span style="background:#E2E2ff ; font-family:돋움; font-size: 12px;"> <b> ▷ Invalidate(); - 강제로 화면을 다시 그리는 함수 </b> </span></html>\nInvalidate(TRUE); // 화면전체\nInvalidate(FALSE); // 변경된 부분만\n컨트롤의 이동이나 크기의 변경이 있을때는 그뒤에 추가\n\n\n<html> <a name="Page200220_04"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page200220"> <span style="font-size: 14px;"> #. Windows 파일 무결성 – OpenSSL 라이브러리 사용 </span> </a> </div> </html>\n출처 ; \n • 설정 - https://epdl-studio.tistory.com/51 - visual studio 2019 에서 openssl 빌드하는 방법\n • 사용방법 - https://greenlandshark.tistory.com/16 - (C언어) 해시 알고리즘 / OpenSSL/ SHA256 사용\n • https://ko.wikipedia.org/wiki/SHA\n\n파일의 무결성 검사, 해쉬 알고리즘을 이용한 비교는 원본에 대한 고유한 해쉬값을 만들고, (Download나 Copy 등) 차후 원본의 해쉬값과 비교하는 것이다. 이를 전자 지문이라고도 한다.\n비교 값이 동일하다면 원본과 같다고 증명할 수 있다. 즉 무결성을 검증하는 데 사용되게 된다. \n\nMD5(Message Digest)는 입력 데이터(문자열이거나, 데이터이거나)로부터 128비트의 메시지로 결과값을 반환하게 된다.\nSHA(Secure Hash Algorithm, 안전한 해시 알고리즘) 함수들은 서로 관련된 암호학적 해시 함수들의 모음이다. 이들 함수는 미국 국가안보국(NSA)이 1993년에 처음으로 설계했으며 미국 국가 표준으로 지정되었다. SHA 함수군에 속하는 최초의 함수는 공식적으로 SHA라고 불리지만, 나중에 설계된 함수들과 구별하기 위하여 SHA-0이라고도 불린다. 2년 후 SHA-0의 변형인 SHA-1이 발표되었으며, 그 후에 4종류의 변형, 즉 SHA-224, SHA-256, SHA-384, SHA-512가 더 발표되었다. 이들을 통칭해서 SHA-2라고 하기도 한다. \n\nSHA-1은 SHA 함수들 중 가장 많이 쓰이며, TLS, SSL, PGP, SSH, IPSec 등 많은 보안 프로토콜과 프로그램에서 사용되고 있다. SHA-1은 이전에 널리 사용되던 MD5를 대신해서 쓰이기도 한다. 혹자는 좀 더 중요한 기술에는 SHA-256이나 그 이상의 알고리즘을 사용할 것을 권장한다. \n\n다음은 SHA 함수들의 특성을 요약한 표이다. \n| 알고리즘 | 해시값 크기 | 내부 상태 크기 | 블록 크기 | 길이 한계 | 워드 크기 | 과정 수 | 사용되는 연산 | 충돌 |\n| SHA-0 | 160 | 160 | 512 | 64 | 32 | 80 | +,and,or,xor,rotl | 발견됨 |\n| SHA-1 | 160 | 160 | 512 | 64 | 32 | 80 | +,and,or,xor,rotl | 발견됨 |\n| SHA-256/224 | 256/224 | 256 | 512 | 64 | 32 | 64 | +,and,or,xor,shr,rotr | - |\n| SHA-512/384 | 512/384 | 512 | 1024 | 128 | 64 | 80 | +,and,or,xor,shr,rotr | - |\n\nSHA-256은 SHA(Secure Hash Algorithm) 알고리즘의 한 종류로서 256비트로 구성되며 64자리 문자열을 반환한다. SHA-256은 미국의 국립표준기술연구소(NIST; National Institute of Standards and Technology)에 의해 공표된 표준 해시 알고리즘인 SHA-2 계열 중 하나이며 블록체인에서 가장 많이 채택하여 사용하고 있다. 이름에 내포되어 있듯 2^^256^^만큼 경우의 수를 만들수 있다. 개인용 컴퓨터로 무차별 대입을 수행해 해시 충돌 사례를 찾으려고 할 때 많은 시간이 소요될 정도로 큰 숫자이므로 충돌로부터 비교적 안전하다고 평가된다.\n\n<html><span style="background:#E2E2ff ; font-family:돋움; font-size: 12px;"> <b> ▷ OpenSSL </b> </span></html>\nOpenSSL은 네트워크를 통한 데이터 통신에 쓰이는 프로토콜인 TLS와 SSL의 오픈 소스 구현판이다. C 언어로 작성되어 있는 중심 라이브러리 안에는, 기본적인 암호화 기능 및 여러 유틸리티 함수들이 구현되어 있다. \n\nOpenSSL은 Eric A. Young과 Tim Hudson이 만든 SSLeay에 그 근거를 두고 있다. SSLeay의 개발은 Young과 Hudson이 RSA Security로 적을 옮긴 1998년 12월 이래 비공식적으로 중단되어 있다.\n\n거의 모든 버전의 유닉스 계열 운영 체제(솔라리스, 맥 OS X, 리눅스, BSD 포함) 및 OpenVMS, 윈도우에서 OpenSSL을 이용할 수 있다. \n\n<html><span style="background:#E2E2ff ; font-family:돋움; font-size: 12px;"> <b> ▷ Precompiled OpenSSL 사이트 </b> </span></html>\nhttps://www.npcglib.org/~stathis/blog/precompiled-openssl/\nhttp://slproweb.com/products/Win32OpenSSL.html\n\n<html><span style="background:#E2E2ff ; font-family:돋움; font-size: 12px;"> <b> ▷ Visual studio 2013에서 OpenSSL 빌드하기 (in Windows 10) </b> </span></html>\n\nhttps://www.npcglib.org/~stathis/blog/precompiled-openssl/ 에서 openssl-1.1.0f-vs2013 받아서 사용\n\n프로젝트 > 속성으로 들어간다.\n\n구성 속성 > VC++ 디렉터리\n 포함 디렉터리 : .\sopenssl-1.1.0f-vs2013\sinclude 추가\n 라이브러리 디렉터리 : .\sopenssl-1.1.0f-vs2013\slib 추가 (∵ 프로젝트명 변경에 대응하기 위해 상대 위치로 설정)\n\n구성 속성 > C/C++ > 전처리기\n 전처리기 정의 ; " _CRT_SECURE_NO_WARNINGS" 추가\n\n구성 속성 > C/C++ > 코드생성 (Debug 모드)\n 런타임 라이브러리 : 다중 스레드 DLL(/MD) 로 변경 \n cf. 빌드시 메시지를 참고, 다중 스레드 디버그 DLL(/MDd)를 사용할 수도 있음\n\n구성속성 > 링커 > 입력\n 추가 종속성 : libcrypto64MDd.lib, libcrypto64MTd.lib, libssl64MDd.lib, libssl64MTd.lib 추가\n\n또는 stdafx.h 설정\n#pragma comment (lib, "libcryptoMDd.lib")\n#pragma comment (lib, "libcryptoMTd.lib")\n#pragma comment (lib, "libsslMDd.lib")\n#pragma comment (lib, "libsslMTd.lib")\n\n//ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ\n#ifdef _DEBUG\n#include "include\sopenssl\sapplink.c"\n#include "include\sopenssl\ssha.h"\n#else\n#include "openssl-1.1.0f-vs2013\sinclude\sopenssl\sapplink.c"\n#include "openssl-1.1.0f-vs2013\sinclude\sopenssl\ssha.h"\n#endif\n\nvoid sha256_hash_string(unsigned char hash[SHA256_DIGEST_LENGTH], char *outputBuffer)\n{\n int i = 0;\n for (i = 0; i < SHA256_DIGEST_LENGTH; i++)\n {\n sprintf(outputBuffer + (i * 2), "x", hash[i]);\n }\n outputBuffer[64] = 0;\n}\n\nint calc_sha256(char *path, char *output) \n{\n FILE* file = fopen(path, "rb");\n if (!file) return -1;\n\n unsigned char hash[SHA256_DIGEST_LENGTH];\n const int bufSize = 32768;\n unsigned char *buffer = (unsigned char *)malloc(bufSize);\n SHA256_CTX sha256;\n int bytesRead = 0;\n\n if (!buffer) return -2;\n\n SHA256_Init(&sha256);\n\n while ((bytesRead = fread(buffer, 1, bufSize, file))) \n {\n SHA256_Update(&sha256, buffer, bytesRead);\n }\n\n SHA256_Final(hash, &sha256);\n sha256_hash_string(hash, output);\n fclose(file);\n\n return 0;\n}\n\n//ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ\n// 버튼 클릭시, SHA256 값을 Edit Control (IDC_EDITSHA)에 출력\nvoid CSHA_testDlg::OnBnClickedBtnsha()\n{\n CString str = _T("All files(*.*)|*.*|"); // 모든 파일 표시\n // _T("Excel 파일 (*.xls, *.xlsx) |*.xls; *.xlsx|"); 와 같이 확장자를 제한하여 표시할 수 있음\n CFileDialog dlg(TRUE, _T("*.dat"), NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, str, this);\n\n CString strPathName;\n if (dlg.DoModal() == IDOK)\n {\n strPathName = dlg.GetPathName();\n // 파일 경로를 가져와 사용할 경우, Edit Control에 값 저장\n SetDlgItemText(IDC_EDIT1, strPathName);\n }\n\n char szCurrentPath[1024] = { 0, }; // 파일 경로\n\n WCHAR *wszPath = T2W(strPathName.GetBuffer());\n int len = WideCharToMultiByte(CP_ACP, 0, wszPath, -1, NULL, 0, NULL, NULL);\n WideCharToMultiByte(CP_ACP, 0, wszPath, -1, szCurrentPath, len, NULL, NULL);\n\n char calc_hash[65];\n int result;\n result = calc_sha256(szCurrentPath, calc_hash);\n\n SetDlgItemText(IDC_EDITSHA, CString(calc_hash) );\n}\n\n\n<html> <a name="Page200220_01"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page200220"> <span style="font-size: 14px;"> #. (MFC) CBitmapButton 클래스의 마우스 Hover 기능 추가 </span> </a> </div> </html>\nMFC CBitmapButton 클래스를 사용한 버튼인 경우 마우스 Hover 상태에 대한 처리가 없다.\n\n<html><span style="background:#E2E2ff ; font-family:돋움; font-size: 12px;"> <b> ▷ CBitmapButton::AutoLoad( ... ); </b> </span></html>\nCBitmapButton myButton;\nmyButton.AutoLoad(IDC_MYBUTTON, this);\n\n비트맵을 씌우기 때문에 실제 caption은 나타나지 않지만\n비트맵 버튼은 caption을 기준으로 리소스에서 이미지를 찾아온다.\n\ncaption 이름 : MYBUTTON\nbutton symbol : IDC_MYBUTTON\n리소스의 ID : 비트맵 버튼의 캡션뒤에 각각 U,D,F,X로 만든 ID로 만든다.\n(리소스 이름 양쪽에 " " 를 꼭 붙여준다)\n"MYBUTTONU", "MYBUTTOND", "MYBUTTONF", "MYBUTTONX"\n\n<html><span style="background:#E2E2ff ; font-family:돋움; font-size: 12px;"> <b> ▷ CBitmapButton::LoadBitmaps( ... ); </b> </span></html>\nCBitmapButton *pmyButton = new CBitmapButton();\n\n// Load the bitmaps for this button.\npmyButton->LoadBitmaps(IDB_UP, IDB_DOWN, IDB_FOCUS, IDB_DISABLE);\n\n//=============================================================================\n#pragma once\n#include "afxext.h"\n\nenum BUTTON_STATE{ BUTTON_OFF, BUTTON_ON, BUTTON_OVER, BUTTON_DISABLE };\n\nclass CMyButton : public CBitmapButton\n{\npublic:\n CMyButton();\n ~CMyButton();\n\n BOOL m_bCursorOnButton;\n BUTTON_STATE m_ButtonState;\n int m_nIDC;\n\n DECLARE_MESSAGE_MAP()\n afx_msg void OnMouseHover(UINT nFlags, CPoint point);\n afx_msg void OnMouseLeave();\n afx_msg void OnMouseMove(UINT nFlags, CPoint point);\n};\n\n//=============================================================================\n#include "stdafx.h"\n#include "MyButton.h"\n#include "resource.h"\n\nCMyButton::CMyButton()\n{\n m_bCursorOnButton = FALSE;\n m_ButtonState = BUTTON_OFF;\n}\n\nCMyButton::~CMyButton()\n{\n}\n\nBEGIN_MESSAGE_MAP(CMyButton, CBitmapButton)\n ON_WM_MOUSEHOVER()\n ON_WM_MOUSELEAVE()\n ON_WM_MOUSEMOVE()\nEND_MESSAGE_MAP()\n\nvoid CMyButton::OnMouseHover(UINT nFlags, CPoint point)\n{\n // MessageBox(_T("HOVER"), _T("HOVER"), 0);\n if (BUTTON_DISABLE == m_ButtonState)\n return;\n\n m_ButtonState = BUTTON_OVER;\n switch ( m_nIDC )\n {\n case IDC_BtnGameStart:\n LoadBitmaps(IDB_StartBtnOver);\n break;\n\n case IDC_BtnCancel:\n LoadBitmaps(IDB_CancelBtnOver);\n break;\n }\n\n // LoadBitmaps(IDB_StartBtnOver);\n // Invalidate();\n CRect rect;\n this->GetWindowRect(&rect);\n ScreenToClient(&rect);\n InvalidateRect(&rect);\n\n CBitmapButton::OnMouseHover(nFlags, point);\n}\n\nvoid CMyButton::OnMouseLeave()\n{\n // Leave시 Flag False로 만들고 버튼 Hover하면 이벤트 설정되게\n m_bCursorOnButton = FALSE; \n // MessageBox(_T("LEAVE"), _T("LEAVE"), 0);\n\n if (BUTTON_DISABLE == m_ButtonState)\n return;\n\n m_ButtonState = BUTTON_OFF;\n switch (m_nIDC)\n {\n case IDC_BtnGameStart:\n LoadBitmaps(IDB_StartBtnDefault);\n break;\n\n case IDC_BtnCancel:\n LoadBitmaps(IDB_CancelBtnDefault);\n break;\n }\n\n // LoadBitmaps(IDB_StartBtnDefault);\n // Invalidate();\n CRect rect;\n this->GetWindowRect(&rect);\n ScreenToClient(&rect);\n InvalidateRect(&rect);\n \n CBitmapButton::OnMouseLeave();\n}\n\n\nvoid CMyButton::OnMouseMove(UINT nFlags, CPoint point)\n{\n if (m_bCursorOnButton == FALSE)\n {\n TRACKMOUSEEVENT tme;\n ZeroMemory(&tme, sizeof(TRACKMOUSEEVENT));\n tme.cbSize = sizeof(tme);\n tme.hwndTrack = m_hWnd;\n tme.dwFlags = TME_LEAVE | TME_HOVER;\n tme.dwHoverTime = 1;\n m_bCursorOnButton = _TrackMouseEvent(&tme);\n }\n\n CBitmapButton::OnMouseMove(nFlags, point);\n}\n\n//ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ\n// 버튼 위치 조정 ; CMyButton m_Btn_Start; \n// 시작 버튼 설정 ; IDB_StartBtnDefault, IDB_StartBtnPress, IDB_StartBtnOver, IDB_StartBtnDisable\nm_Btn_Start.SetWindowPos(NULL, 40, 20, 300, 60, SWP_NOREPOSITION);\nm_Btn_Start.LoadBitmaps(IDB_StartBtnDisable);\nm_Btn_Start.SizeToContent();\nm_Btn_Start.m_ButtonState = BUTTON_STATE::BUTTON_DISABLE;\nm_Btn_Start.m_nIDC = IDC_BtnGameStart;\n\n\n<html> <a name="Page200220_02"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page200220"> <span style="font-size: 14px;"> #. (MFC) 디스크 공간 정보 출력하기 </span> </a> </div> </html>\n참고 ; https://cinema4dr12.tistory.com/632\n\nGetDiskFreeSpaceEx(); 는 하드디스크의 총 용량, 사용 용량, 남은 용량을 가져오는 함수이다.\n\n\nBOOL WINAPI GetDiskFreeSpaceEx(\n __in LPCTSTR lpDirectoryName,\n __out PULARGE_INTEGER lpFreeBytesAvailable,\n __out PULARGE_INTEGER lpTotalNumberOfByte,\n __out PULARGE_INTEGER lpTotalNumberOfFreeBytes\n );\n\n//ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ\nULARGE_INTEGER avail, total, free;\navail.QuadPart = 0L;\ntotal.QuadPart = 0L;\nfree.QuadPart = 0L;\n\nint m_avail, m_total, m_free;\n\nCString strMsg;\n\n// c:\s 하드디스크 용량 정보\nGetDiskFreeSpaceEx(TEXT("c:\s\s"), &avail, &total, &free);\n\n// GByte 로 표현을 하기 위한 부분\nm_total = (int)(total.QuadPart>>30);\nm_free = (int)(free.QuadPart>>30);\n\nstrMsg.Format(_T("C: Total Size: %d GB , Free Size : %d GB\sn"), m_total, m_free);\n\n// D:\s 하드디스크 용량 정보\nGetDiskFreeSpaceEx(TEXT("d:\s\s"), &avail, &total, &free);\n\n// GByte 로 표현을 하기 위한 부분\nm_total = (int)(total.QuadPart>>30);\nm_free = (int)(free.QuadPart>>30);\n\n// Print out information of disks\nstrMsg.Format(strMsg + _T("D: Total Size: %d GB , Free Size : %d GB\sn"), m_total, m_free);\nAfxMessageBox(strMsg);\n\n참고, MByte 단위로 하드디스크의 용량 계산\nm_total = (int)(total.QuadPart >> 20);\nm_free = (int)(free.QuadPart >> 20);\n\n\n<html> <a name="Page200220_03"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page200220"> <span style="font-size: 14px;"> #. ini 파일 생성 및 읽고 쓰기 </span> </a> </div> </html>\n출처 ; https://cailisin.tistory.com/168\n\n16비트 버전의 Windows 와 호환을 위해 제공되고 있으며 어플리케이션의 초기화 정보는 ini 파일 보다는 registry 를 권장\n\nini 파일의 구성 ; 섹션 (Section), 키 (Key), 문자열 값 (String Value)\n[ section ]\nkey=string\n... \n...\n\n▶ 파일 쓰기\nBOOL WritePrivateProfileString(\n LPCSTR lpAppName, // 섹션 (Section) 이름 \n LPCSTR lpKeyName, // 키 (Key) 이름 - NULL 인 경우 해당 섹션 (Section) 이 삭제\n LPCSTR lpString, // 값 (Value) - NULL 인 경우 해당 섹션의 키 (Key) 를 삭제\n LPCSTR lpFileName // 저장할 ini 파일 경로 \n);\n-. ini 파일이 존재하지 않으면 신규 생성\n\n// 섹션 (Section) 삭제 \nWritePrivateProfileString("Section_1", NULL, NULL, "C:\s\stest.ini"); \n// 키 (Key) 삭제 \nWritePrivateProfileString("Section_1", "Key_1", NULL, "C:\s\stest.ini");\n\n▶ 파일 읽기\nDWORD GetPrivateProfileString(\n LPCTSTR lpAppName, // 섹션 (Section) 이름 \n LPCTSTR lpKeyName, // 키 (Key) 이름 \n LPCTSTR lpDefault, // 해당 키 (Key) 값 없을 경우 리턴 할 기본값 \n LPTSTR lpReturnedString, // 값 (Value) 을 리턴 할 버퍼 \n DWORD nSize, // 버퍼 사이즈 LPCTSTR \n lpFileName // 읽어들일 ini 파일 경로 \n);\n\n▶ 예제\n// Multibyte Project Code \nint main(void) \n{\n char *cBuf = NULL;\n cBuf = (char *)malloc(sizeof(char) * 256);\n memset(cBuf, 0x00, sizeof(cBuf));\n\n // Write\n WritePrivateProfileString("Section_1", "Key_1", "True", "C:\s\stest.ini");\n WritePrivateProfileString("Section_1", "Key_2", "False", "C:\s\stest.ini");\n WritePrivateProfileString("Section_2", "Key_1", "False", "C:\s\stest.ini");\n WritePrivateProfileString("Section_2", "Key_2", "False", "C:\s\stest.ini");\n\n // Read\n GetPrivateProfileString("Section_1", "Key_2", "-", cBuf, 256, "C:\s\stest.ini");\n printf("%s \sn", cBuf);\n GetPrivateProfileString("Section_3", "Key_1", "-", cBuf, 256, "C:\s\stest.ini");\n printf("%s \sn", cBuf);\n\n return 0; \n}\n\n\n
<html> <a name="Page200220"> </a> </html>\n참고\n(팁) TWebBrowser 및 IE 갖고 놀기 - http://www.delmadang.com/community/bbs_view.asp?bbsNo=3&bbsCat=43&indx=195149&page=87\n\n<html>\n<a href="#Page200220_03"> #. Displaying a Local html file in a WebBrowser control </a> <br>\n<a href="#Page200220_01"> #. (MFC) CWebBrowser2 스크롤바 없애기 </a> <br>\n<a href="#Page200220_02"> #. (MFC) CWebBrowser2 Control 이벤트 </a> <br>\n</html>\n\n<html> <a name="Page200220_03"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page200220"> <span style="font-size: 14px;"> #. Displaying a Local html file in a WebBrowser control </span> </a>\n</div> </html>\n<html><span style="background:#E2E2ff ; font-family:돋움; font-size: 14px;"> <b> ▷ 외부 *.html 파일을 사용할 경우 ; Navigate( ... );에 전체 경로를 설정 </b> </span></html>\n//ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ\n#define MAX_STRING_LEN 1024\nchar szCurrentPath[MAX_STRING_LEN]; // 현재 경로\n\nvoid SetDir()\n{\n GetModuleFileNameA(NULL, szCurrentPath, MAX_STRING_LEN);\n int len = strlen(szCurrentPath);\n for ( int i = len - 1; i > 1; i-- )\n {\n if (szCurrentPath[i] == '\s\s') \n { \n szCurrentPath[i] = 0; \n break; \n }\n }\n SetCurrentDirectoryA(szCurrentPath);\n}\n\n//ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ\nchar szFullPath[MAX_STRING_LEN];\nSetDir();\n\nsprintf_s(szFullPath, sizeof(szFullPath), "%s\s\s%s", szCurrentPath, "test.html" );\nm_WebViewer.Navigate( CString(szFullPath), NULL, NULL, NULL, &headers);\n\n<html><span style="background:#E2E2ff ; font-family:돋움; font-size: 14px;"> <b> ▷ 리소스에 HTML 파일(test.html)을 등록(*.rc)해서 사용하는 경우 ; Navigate( ... );에 전체 경로를 설정 </b> </span></html>\n-. 리소스 등록 후\n / 솔루션 탐색기에도 test.html 파일이 등록\n / Resource.h에서 고유 아이디 부여 받음\n#define IDR_HTML1 130\n\n-. m_WebViewer.Navigate( path, NULL, NULL, NULL, &headers ); \n / (path) URL 형식\n res:// + (절대 경로) Application.ExeName + /130 (#define IDR_HTML1 130)\n res://F:\s2020Test\sWebBrowser2\sDebug\sWebBrowser2.exe/130\n\nCString userAgent;\nuserAgent = _T("User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/7.0");\nCComVariant headers(userAgent.IsEmpty() ? NULL : (LPCTSTR)userAgent);\n\nHMODULE hMod = GetModuleHandle(NULL);\nCString path;\nGetModuleFileName(hMod, path.GetBufferSetLength(256), 256);\npath.ReleaseBuffer();\npath += L"/130"; /* #define IDR_HTML1 130 */\npath.Insert(0, TEXT("res://"));\n\nm_WebViewer.Navigate(path, NULL, NULL, NULL, &headers);\n\n\n<html> <a name="Page200220_01"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page200220"> <span style="font-size: 14px;"> #. (MFC) CWebBrowser2 스크롤바 없애기 </span> </a>\n</div> </html>\n출처 ; https://ddirty.tistory.com/20\n√ 다운로드가 완료된 웹에서 IHTMLBodyElement 와 <IHTMLStyle> 을 설정하는 방식\n{{{\n<html>\n <head></head>\n <body bgcolor='#ffbbbb'>\n 바탕 화면이 붉은색으로 표시됩니다.\n </body>\n</html>\n\n※ body의 scroll=no 옵션으로 스크롤바를 표시하지 않는다.\n 결국, 프로그램적으로 scroll=no을 추가하는 과정이다.\n<html>\n <head></head>\n <body scroll=no bgcolor='#ffbbbb'>\n 바탕 화면이 붉은색으로 표시됩니다.\n </body>\n</html>\n}}}\n#include <mshtml.h>\n#include <ATLBASE.H>\n\nCWebBrowser2 m_WebViewer; 이라고 할 때,\nvoid OnDocumentCompleteWeb(LPDISPATCH pDisp, VARIANT FAR* URL) 에 추가한다.\n\nHRESULT hr;\n\n// IHTMLDocument2 얻기 (√ Release(); 필요)\nIHTMLDocument2* m_pHTMLDocument2 = 0; \nLPDISPATCH lpDispatch = m_WebViewer.get_Document();\n\nif (lpDispatch)\n{\n hr = lpDispatch->QueryInterface(IID_IHTMLDocument2, (LPVOID*)&m_pHTMLDocument2);\n lpDispatch->Release();\n\n if (hr == S_OK)\n {\n // IHTMLElement 얻기 (√ Release(); 필요)\n IHTMLElement *pIElement;\n hr = m_pHTMLDocument2->get_body (&pIElement);\n if(!SUCCEEDED(hr))\n return;\n // IHTMLElement -> IHTMLBodyElement 얻기\n IHTMLBodyElement *pIBodyElement;\n hr = pIElement->QueryInterface (IID_IHTMLBodyElement, (void**)&pIBodyElement);\n if(!SUCCEEDED(hr))\n return;\n\n BSTR bstr, bstr1;\n CString strScroll = "no";\n CString strOverflow = "hidden";\n\n // CString strScroll, strOverflow -> BSTR bstr, bstr1로 변환\n bstr = strScroll.AllocSysString();\n bstr1 = strOverflow.AllocSysString();\n\n if(SUCCEEDED(hr) && pIBodyElement)\n {\n pIBodyElement->put_scroll (bstr); // scroll=no 옵션 설정\n\n CComPtr <IHTMLStyle> pStyle;\n COleVariant var ((long) 0, VT_I4);\n if(SUCCEEDED (pIElement-> get_style (&pStyle)) )\n {\n pStyle-> put_marginTop (var);\n pStyle-> put_marginLeft (var);\n pStyle-> put_marginRight (var);\n pStyle-> put_marginBottom (var);\n pStyle-> put_overflow (bstr1);\n }\n }\n SysFreeString(bstr);\n SysFreeString(bstr1);\n }\n m_pHTMLDocument2->Release();\n m_pHTMLDocument2 = NULL;\n}\n\n<html><span style="background:#E2E2ff ; font-family:돋움; font-size: 14px;"> <b> ▷ < body bgcolor='#ffbbbb' > 의 bgcolor 변경 </b> </span></html>\nIHTMLBodyElement *pIBodyElement; 를 받아 왔을 때,\n\nVARIANT varColors;\nvarColors.vt = VT_BSTR;\nCString strColor = TEXT("#000129"); // RGB(0, 1, 41) - 검은 청색 \nvarColors.bstrVal = strColor.AllocSysString();\n\npIBodyElement->put_bgColor(varColors);\n\nSysFreeString(varColors.bstrVal);\n\n\n<html> <a name="Page200220_02"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page200220"> <span style="font-size: 14px;"> #. (MFC) CWebBrowser2 Control 이벤트 </span> </a>\n</div> </html>\n참고 ; \nhttps://frontjang.info/ - C++ / C# > WebBrowser Control 사용시. 페이지로딩이 완료되었는지 확인하기 \nhttp://blog.daum.net/riversnails/8000693 - 웹페이지 로딩 완료시점은 언제인가?\nhttps://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/platform-apis/aa768280(v=vs.85)?redirectedfrom=MSDN - Internet Explorer for Developers\n\n● 콘솔창에 문자열 표시를 위해 <stdafx.h>에 등록\n#pragma comment(linker, "/entry:WinMainCRTStartup /subsystem:console")\n\n● 화면 표시 진행 방식\n배너 광고 페이지 ⇒ ID, Password 입력, 로그인버튼 클릭 ⇒ 결과 받고 ⇒ 결과 사이트(이미지) 표시\n\n● Microsoft 웹 브라우저 컨트롤 WebBrowser\nCWebBrowser2 m_WebViewer;\n\nBOOL CMy123Dlg::OnInitDialog()\n{\n CDialogEx::OnInitDialog();\n ...\n // TODO: 여기에 추가 초기화 작업을 추가합니다.\n m_WebViewer.SetWindowPos(NULL, 0, 32, 1280, 588, SWP_NOREPOSITION);\n\n CString userAgent;\n userAgent = _T("User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/7.0");\n CComVariant headers(userAgent.IsEmpty() ? NULL : (LPCTSTR)userAgent);\n m_WebViewer.Navigate(strNoticeURL, NULL, NULL, NULL, &headers);\n\n return TRUE; // 포커스를 컨트롤에 설정하지 않으면 TRUE를 반환합니다.\n}\n\n<html><span style="background:#E2E2ff ; font-family:돋움; font-size: 14px;"> <b> ▷ Dialog 리소스뷰에서 컨트롤 이벤트 Override </b> </span></html>\n\nBEGIN_EVENTSINK_MAP(CMy123Dlg, CDialog)\n ON_EVENT(CMy123Dlg, IDC_EXPLORER1, 250 /* BeforeNavigate2 */, BeforeNavigate2Explorer1, VTS_DISPATCH VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PBOOL)\n ON_EVENT(CMy123Dlg, IDC_EXPLORER1, 102 /* StatusTextChange */,StatusTextChangeExplorer1, VTS_BSTR)\n ON_EVENT(CMy123Dlg, IDC_EXPLORER1, 252 /* NavigateComplete2 */, NavigateComplete2Explorer1, VTS_DISPATCH VTS_PVARIANT)\n ON_EVENT(CMy123Dlg, IDC_EXPLORER1, 259 /* DocumentComplete */, DocumentCompleteExplorer1, VTS_DISPATCH VTS_PVARIANT)\nEND_EVENTSINK_MAP()\n\n※. 마우스 클릭 했을 때, 이런 식으로 이벤트 발생\n>> BeforeNavigate2Explorer1\nStatusTextChange 이벤트 ; 이동할 사이트 주소 등을 표시\n...\n◎ NavigateComplete2Explorer1\n● DocumentCompleteExplorer1\n\n//=========================================\n-. BeforeNavigate2 이벤트 ; 지정된 객체 (window element 나 frameset element)에서 탐색하기 전에 실행\n / 웹사이트, 버튼 위에서 마우스 클릭했을 때 이벤트 발생\n DocumentComplete 이벤트 와 중복될 수 있음 (자동 변환되는 사이트는 표시하지 않음)\n\nvoid CMy123Dlg::BeforeNavigate2Explorer1(LPDISPATCH pDisp, VARIANT* URL, VARIANT* Flags, VARIANT* TargetFrameName, VARIANT* PostData, VARIANT* Headers, BOOL* Cancel)\n{\n // TODO: 여기에 메시지 처리기 코드를 추가합니다.\n printf(">> BeforeNavigate2Explorer1 \sn");\n}\n\n//=========================================\n-. StatusTextChange 이벤트 ; 오브젝트의 status bar text가 변경되면 발생 (자동 변환 사이트 내용도 표시)\n / 웹사이트에서 버튼 위에 마우스가 올라가더라도 이벤트 발생\n\nvoid CMy123Dlg::StatusTextChangeExplorer1(LPCTSTR Text)\n{\n // TODO: Add your control notification handler code here\n // 콘솔창에 웹사이트 상태를 표시\n printf("%ws \sn", Text);\n}\ncf. CString cs("Hello"); // 문자열 표시\n std::wcout << (const wchar_t*)cs << std::endl;\n\n//=========================================\n-. NavigateComplete2 이벤트 ; window element 나 frameset element에서 링크 탐색이 완료된 후 발생\n\n-. NavigateComplete2와 DocumentComplete 이벤트를 사용한 웹페이지 로딩 완료시점 ?\nLPDISPATCH glpDisp = NULL; // 전역 설정, 사용하지 않을 경우 여러번 출력됨 \nvoid CMy123Dlg::NavigateComplete2Explorer1(LPDISPATCH pDisp, VARIANT* URL)\n{\n // Check if glpDisp is NULL. If NULL, that means it is\n // the top level NavigateComplete2. Save the LPDISPATCH\n if (!glpDisp)\n {\n glpDisp = pDisp;\n printf("◎ NavigateComplete2Explorer1 \sn");\n }\n}\n\nvoid CMy123Dlg::DocumentCompleteExplorer1(LPDISPATCH pDisp, VARIANT* URL)\n{\n if (glpDisp && glpDisp == pDisp)\n {\n // if the LPDISPATCH are same, that means\n // it is the final DocumentComplete. Reset glpDisp\n // TRACE("Document is done downloading");\n glpDisp = NULL;\n printf("● DocumentCompleteExplorer1 \sn");\n }\n}\n\n//=========================================\n-. DocumentComplete 이벤트 ; 웹페이지 로드가 완료되는 시점에서 이벤트 발생\n / WebBrowser 컨트롤은 ReadyState 속성이 READYSTATE_COMPLETE로 변했을때 DocumentComplete 이벤트를 생성\n\n • 페이지에 프레임이 없는 경우(단일페이지), DocumentComplete는 페이지 로드 완료시 한번만 발생된다.\n • 여러 프레임이 존재하는 경우 DocumentComplete도 마찬가지로 여러번 발생된다. 모든 프레임이 이 이벤트를 발생시키는건 아니지만, DowonloadBegin 이벤트를 발생시키는 모든 프레임은 이에 상응하는 DocumnetComplete를 발생시킨다.\n • DocumentComplete 이벤트 발생시, 인자값으로 해당 프레임의 IDispatch를 가리키는 IDispatch* 를 갖는다.\n • 최상위(DOM) 프레임은 가장 나중에 DocumentComplete를 발생한다. 그러므로 페이지 로드 완료를 확인하기 위해서, IDispatch* 인자값이 WebBrowser 컨트롤의 IDispatch와 동일한 항목을 가리키는지 확인하면 된다.\n\ncf. DocumentTitle 속성 값이 변경됨\n\n<html><span style="background:#E2E2ff ; font-family:돋움; font-size: 14px;"> <b> ▷ 웹페이지 로드될 때까지 기다리기 </b> </span></html>\n출처 ; https://sb.pe.kr/1127\n\nm_pWebBrowser->Navigate(...); 로 페이지 호출 후 페이지가 로딩 완료될 때까지 기다리는 함수이다.\n\nbool CMyInternetExplorer::WaitTillLoaded (int nTimeout)\n{\n READYSTATE result;\n DWORD nFirstTick = GetTickCount ();\n\n do\n {\n m_pWebBrowser->get_ReadyState (&result);\n \n if (result != READYSTATE_COMPLETE)\n Sleep (250);\n \n if (nTimeout > 0)\n {\n if ((GetTickCount () - nFirstTick) > nTimeout)\n break;\n }\n } while (result != READYSTATE_COMPLETE);\n\n if (result == READYSTATE_COMPLETE)\n return true;\n else\n return false;\n}\n\n\n
원문 ; https://social.msdn.microsoft.com/Forums/vstudio/en-US/45668d18-2840-4887-87e1-4085201f4103/visual-c-to-unzip-a-zip-file-to-a-specific-directory?forum=vclanguage\n{{{\n//------------------------------------------------------------------------------\nbool Unzip2Folder(BSTR lpZipFile, BSTR lpFolder)\n{\n IShellDispatch *pISD;\n\n Folder *pZippedFile = 0L;\n Folder *pDestination = 0L;\n\n long FilesCount = 0;\n IDispatch* pItem = 0L;\n FolderItems *pFilesInside = 0L;\n\n VARIANT Options, OutFolder, InZipFile, Item;\n CoInitialize(NULL);\n __try\n {\n if (CoCreateInstance(CLSID_Shell, NULL, CLSCTX_INPROC_SERVER, IID_IShellDispatch, (void **)&pISD) != S_OK)\n return 1;\n\n InZipFile.vt = VT_BSTR;\n InZipFile.bstrVal = lpZipFile;\n pISD->NameSpace(InZipFile, &pZippedFile);\n if (!pZippedFile)\n {\n pISD->Release();\n return 1;\n }\n\n OutFolder.vt = VT_BSTR;\n OutFolder.bstrVal = lpFolder;\n pISD->NameSpace(OutFolder, &pDestination);\n if (!pDestination)\n {\n pZippedFile->Release();\n pISD->Release();\n return 1;\n }\n\n pZippedFile->Items(&pFilesInside);\n if (!pFilesInside)\n {\n pDestination->Release();\n pZippedFile->Release();\n pISD->Release();\n return 1;\n }\n\n pFilesInside->get_Count(&FilesCount);\n if (FilesCount < 1)\n {\n pFilesInside->Release();\n pDestination->Release();\n pZippedFile->Release();\n pISD->Release();\n return 0;\n }\n\n pFilesInside->QueryInterface(IID_IDispatch, (void**)&pItem);\n\n Item.vt = VT_DISPATCH;\n Item.pdispVal = pItem;\n\n Options.vt = VT_I4;\n Options.lVal = 1024 | 512 | 16 | 4;//http://msdn.microsoft.com/en-us/library/bb787866(VS.85).aspx\n\n bool retval = pDestination->CopyHere(Item, Options) == S_OK;\n\n pItem->Release(); pItem = 0L;\n pFilesInside->Release(); pFilesInside = 0L;\n pDestination->Release(); pDestination = 0L;\n pZippedFile->Release(); pZippedFile = 0L;\n pISD->Release(); pISD = 0L;\n\n return retval;\n\n }\n __finally\n {\n CoUninitialize();\n }\n}\n}}}\n<html><span style="background:#E2E2ff ; font-family:돋움; font-size: 12px;"> <b> ※ 전체 경로가 필요 </b> </span></html>\nCan be done this way. \nUnzip2Folder(::SysAllocString(_T("c:\s\sfilename.zip")), ::SysAllocString(_T("c:\s\sfolder")));\n\nusing the CComBSTR class.\n\nCComBSTR file("c:\s\sfilename.zip");\nCComBSTR folder("c:\s\sfolder");\nUnzip2Folder(file, folder);\n\n<html><span style="background:#E2E2ff ; font-family:돋움; font-size: 12px;"> <b> ※ Char -> BSTR 변환의 예 </b> </span></html>\nWCHAR strPath[MAX_STRING_LEN] = { 0, };\n// 멀티 바이트 크기 계산 길이 반환\nint strSize = MultiByteToWideChar(CP_ACP, 0, g_szCurrentPath, -1, NULL, NULL);\n// 형 변환\nMultiByteToWideChar(CP_ACP, 0, g_szCurrentPath, strlen(g_szCurrentPath) + 1, strPath, strSize);\nBSTR dstfld = SysAllocString(strPath);\n...\nchar szFullPath[MAX_STRING_LEN] = { 0, };\nsprintf_s(szFullPath, sizeof(szFullPath), "%s\s\s%s", g_szCurrentPath, szFileListName);\n\nWCHAR strFullPath[MAX_STRING_LEN] = { 0, };\nint strFullSize = MultiByteToWideChar(CP_ACP, 0, szFullPath, -1, NULL, NULL);\nMultiByteToWideChar(CP_ACP, 0, szFullPath, strlen(szFullPath) + 1, strFullPath, strFullSize);\n\nBSTR file = SysAllocString(strFullPath);\nBOOL res = Unzip2Folder(file, dstfld);\nif (TRUE == res)\n{\n pDlg->SendMessage(THREAD_UPDATE, (WPARAM)IDC_STATICProgress, (LPARAM)L"");\n}\nelse\n{\n pDlg->SendMessage(THREAD_UPDATE, (WPARAM)IDC_STATICProgress, (LPARAM)L"_");\n}\n\nSysFreeString(file);\n...\nSysFreeString(dstfld);\n\n\n\n\n\n\n
<html> <a name="Page200820"> </a> </html>\n<html>\n<a href="#Page200820_01"> #. 언리얼4 엔진 문서 </a> <br>\n<a href="#Page200820_02"> #. 학습 </a> <br>\n</html>\n▶ [[언리얼 4 (UE4)_Note]]\n #. Tutorial \n #. 메모 \n #. UE4 C++ -> Blueprint\n\n<html> <a name="Page200820_01"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page200820"> <span style="font-size: 14px;"> #. 언리얼4 엔진 문서 </span> </a>\n</div> </html>\n\n<html><span style="background:#e2e2ff ; font-family:돋움; font-size: 14px;"> <b> Setting Up Visual Studio for Unreal Engine </b> </span></html>\n\n''Before Setting-up your Unreal Engine-to-Visual Studio Workflow''\nThe following table lists which versions of VS are integrated with the binary version of UE. \n|!Unreal Engine Version |!Visual Studio Version |\n|4.25 or Later |VS 2019 (Default) |\n|4.22 or Later |VS 2017 / VS 2019 |\n|4.15 or Later |VS 2017 |\n|4.10 to 4.14 |VS 2015 |\n|4.2 to 4.9 |VS 2013 |\n\nRuntime > Engine > GameFramework > APlayerController >\n / APlayerController::''GetViewportSize'' - Helper to get the size of the HUD canvas for this player controller. Returns 0 if there is no HUD\n\nRuntime > Engine > Engine > UGameViewportClient >\n / UGameViewportClient::''GetViewportSize'' - Retrieve the size of the main viewport.\n\nRuntime > UMG > Blueprint > UWidgetLayoutLibrary > \n / UWidgetLayoutLibrary::''GetMousePositionOnPlatform'' - Gets the platform's mouse cursor position. This is the 'absolute' desktop location of the mouse.\n\nUnreal Engine API Reference > Runtime > UMG > Animation > ''UWidgetAnimation'' >\n / UWidgetAnimation::''GetEndTime'' - 이 애니메이션의 종료 시간을 가져옵니다.\n cf. PlayAnimation( ... );의 StartAtTime을 GetEndTime으로 설정 + NumLoopsToPlay = 1 인 경우, 맨 마지막 상태로 설정\n\nUnreal Engine API Reference > Runtime > UMG > Components > ''UWidget'' >\n / UWidget::''GetCachedGeometry'' - 위젯을 Tick하는데 사용 된 마지막 geometry를 가져옵니다.\n +++[Remarks]\n위젯을 틱하는 데 사용 된 마지막 지오메트리를 가져옵니다. 이 호출이 위젯이 틱 / 페인팅되기 전에 발생하거나 오래되었거나 프레임이 뒤처진 경우이 데이터가 아직 존재하지 않을 수 있습니다.\n cf. 생성자 등 함수 호출 위치에 따라서 값을 못가지고 오는 경우 있음\n이 데이터를 사용하지 않도룩 권고하는 것은 문제를 해결할 다른 방법이 없는 경우입니다.\n일반적으로 Slate에서는 계층 구조의 종속 위젯 부분을 만들어 이러한 문제를 처리합니다. 프레임에서 감춰지거나 hysteresis problems을 참조하는 무엇가를 방지하도록 하는데, 두 경우는 이전 플레임에 사용된 geometry가 원인입니다. 현재 프레임의 종속 개체 layout이 어떠한지 확인하기 바랍니다.\n===\n\n / UWidget::''GetDesiredSize'' - 원하는 위젯의 크기를 가져옵니다.\n\nUnreal Engine API Reference > Runtime > UMG > Blueprint > ''UUserWidget''\n / UUserWidget::''OnAddedToFocusPath'' - 이 위젯 또는 하위 위젯에서 포커스를 얻고이 위젯이 포커스 경로에 추가되고 이전에 포함되지 않은 경우이 이벤트가 호출.\n / UUserWidget::''OnRemovedFromFocusPath'' - 이 위젯 또는 하위 위젯에서 포커스가 손실되고이 위젯이 더 이상 포커스 경로의 일부가 아닌 경우.\n / UUserWidget::''PlayAnimation'' - 이 위젯에서 지정된 횟수만큼 애니메이션을 재생합니다.\n\nUnreal Engine API Reference > Runtime > UMG > Components > ''UScrollBox'' >\n / GetScrollOffset( ) - 슬레이트 단위로 스크롤 상자의 스크롤 오프셋을 가져옵니다.\n / GetScrollOffsetOfEnd ( ) - Slate Units에서 ScrollBox 아래쪽의 스크롤 오프셋을 가져옵니다.\n / SetScrollOffset( ) - 스크롤 박스의 스크롤 오프셋을 업데이트합니다.\n / ScrollToEnd ( ) - 다음 레이아웃 단계에서 ScrollBox를 즉시 맨 아래로 스크롤합니다. \n / ScrootoStart( ) - ScrollBox를 즉시 맨 위로 스크롤합니다.\n\nUnreal Engine Blueprint API Reference > ''Data Table''\n / Does Data Table Row Exist - Table에 RowName이라는 행이 있는지 여부를 반환합니다.\n / Get Data Table Row Names - 데이터 테이블 행 이름 가져 옵니다.\n\nUnreal Engine Blueprint API Reference > ''List View''\n / GetNumItems() - List 갯수를 리턴 (7개, Index 0 ~ 6)\n / Scroll Index Into View() - 지정된 인덱스의 항목이보기로 스크롤되도록 요청합니다.\n / Is Item Visible( ) - 주어진 개체의 항목이 현재 목록에 표시되는지 여부를 가져옵니다.\n\nUnreal Engine Blueprint API Reference > Utilities > ''Input Event''\n / Alt Down - 이 이벤트가 발생했을 때 Alt 키가 눌러져 있으면 true를 반환합니다. 대상은 Kismet Input Library 입니다.\n / Is Left Shift Down \n\nUnreal Engine Blueprint API Reference > Widget > \n / Has User Focused Descendants - 특정 사용자가 하위 위젯에 초점을 맞추면 true를 리턴합니다. (✔ ListView)\n / HasAnyUserFocusedDescendants\n\nUtilities > Pointer Event > \n / ''Get Screen Space Position'' - Get Screen Space Position\n / ''Get Last Screen Space Position'' - Returns the position of the cursor in screen space last time we handled an input event Target is Kismet Input Library\n\nInput > \n메인 메뉴 연결을 위한 입력 모드 3가지\n / ''Set Input Mode Game And UI'' ; UI와 게임 전부에 입력을 전달\n / ''Set Input Mode Game Only'' ; 게임 루프 자체 플레이어 컨트롤러를 통해 입력을 전달 - FPS In Game\n / ''Set Input Mode UI Only'' ; UI UMG 엘리먼트에 모든 입력을 전달 - 메인 메뉴\n cf. Get Player Controller->Set Show Mouse Cursor 함수를 통해 화면에 마우스 표시를 제어\n\n\n<html> <a name="Page200820_02"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page200820"> <span style="font-size: 14px;"> #. 학습 </span> </a>\n</div> </html>\n@@bgcolor(#FFBB00):color(#000000): ''#.개발자를 위한 언리얼 엔진 시작하기 '' @@\n ▷ 개발자를 위한 언리얼 엔진 시작하기 - 소개\n+++[▷ 월드 빌딩 시작하기]\n√ 월드 빌딩 - 소개 및 철학\n√ 월드 빌딩 - 스키매틱\n-. 통계 명령어\n Start None\n Start Scenerendering\n Start Game - 블루프린터 통계\n Start FPS\n Start Units\n√ 월드 빌딩 - 조언\n√ 월드 빌딩 시작하기 퀴즈\n===\n\n+++[▷ 렌더링 시작하기]\n√ 렌더링 - 소개 및 철학\n√ Rendering - Schematic Overview\n-. Shadow ; 디스턴스 필드에 대한 의존도가 높다면 메시의 스케일은 최대한 일관되게 유지해야 한다.\n / Capsule Shadows\n / DFAO (← Distance Field Meshes)\n / Raytraced AO\n√ 렌더링 - 조언\n√ 렌더링 시작하기 퀴즈\n===\n\n+++[▷ 애니메이션 시작하기]\n√ 애니메이션 - 소개 및 철학\n√ 애니메이션 - 스키매틱\n√ 애니에이션 - 조언\n√ 애니메이션 시작하기 퀴즈\n-. 블렌드 스페이스 ; 변수 값을 기준으로 애니메이션을 블렌딩할 애니메이션 그룹 조작\n-. 스켈레톤 ; 애니메이션 프레임워크의 기본 구조\n-. 싱크 그룹 및 싱크 마커 ; 두 애니메이션의 길이가 서로 다르지만 함께 블렌딩해야 할 때\n 애니메이션을 동기화하여 원활한 트랜지션을 가능하게 해준다.\n===\n\n+++[▷ 엔진 구조 시작하기]\n√ 엔진 구조 - 소개 및 철학\n√ 엔진 구조 - 스키매틱\n√ 엔진 구조 - 조언\n√ 엔진 구조 시작하기 퀴즈\n-. 건틀릿 ; 언리얼 엔진 프로그램에서 검증 테스트를 해야 할 때 테스트에 사용할 수 있는 애플리케이션\n-. 한 폴더에 있는 메시 머티리얼을 다른 폴더로 옮겼는데도 메시가 계속 해당 머티리얼을 사용\n -> 리디렉터가 머티리얼의 새로운 위치가 어디인지 메시에게 알려주기 때문\n===\n\n+++[▷ 프로그래밍 시작하기]\n√ 프로그래밍 - 소개 및 철학\n√ 프로그래밍 - 스키매틱\n-. FText ; 현지화가 준비된 문자열\n -> FText를 생성할 때마다 현지화 시스템에서 블루프린트, 액터, 코드에 있는 모든 FText를 수집해서 현지화\n-. 배열의 배열은 설정할 수 없다.\n-. 벡터, 회전, 쿼터니언 및 트랜스폼 로테이터와 같은 기존의 트랜스폼 유형은 오일러 각도를 사용\n-. ''UObject'' ! ; 가비지 컬렉터 시스템에서 처리할 오브젝트\n-. ''Actor'' ! ; 컴포넌트는 액터에 기능을 추가\n / ''Actor'' ! + Components ⇒ ''UObject'' ! ⇒ Life Cycle (생성 ~ 소멸) ⇒ Smart pointers + Data Objects ⇒ ''Source Code'' !\n / 오브젝트의 경우, 자동으로 삭제하려고 하면 안된다. \n -> @@color(#3058D2): 오브젝트는 해당 오브젝트에 대한 레퍼런스가 없을 때 가비지 컬렉터에서 제거 @@\n / 맵에 배치된 오브젝트 ; 맵을 언로드하면 모두 자동으로 가비지 컬렉션이 수행\n-. Gameplay Framework\n-. @@color(#ee1b24): 엔진은 블루프린트로 연결되는 거대한 델리게이트 및 이벤트 시스템 @@\n√ 프로그래밍 - 조언\n√ 프로그래밍 시작하기 퀴즈\n-. 개발 중인 프로젝트에 여러 액터 유형에서 공유해야 할 함수 기능은 컴포넌트에 적용\n-. AActor 클래스 ; 언리얼 엔진 프로젝트에서 씬에 배치할 C++ 기반 에셋을 생성할 때 처음 사용\n===\n\n++++[▷ 블루프린트 시작하기]\n√ 블루프린트 - 소개 및 철학\n√ 블루프린트 - 스키매틱\n√ 블루프린트 - 조언\n√ 블루프린트 시작하기 퀴즈\n===\n\n\n\n\n@@bgcolor(#FFBB00):color(#000000): ''#.UMG UI 디자이너 퀵스타트 가이드'' @@\n ; 언리얼 엔진 4 에서 언리얼 모션 그래픽 사용 시작 안내입니다.\n\n / Create Widget 노드 + Add to Viewport 노드 \n + Get Player Controller 에서 True 로 설정된 Set Show Mouse Cursor 노드 추가\n / Get Player Controller\n / OnClicked(PlayButton) ; OpenLevel 노드 + Remove from Parent 노드 추가\n / Settings 버튼 ; Execute Console Command 노드 추가\n / Set Input Mode Game Only ; Is Head Mounted Display Enabled 조건 사용\n Set Input Mode UI Only\n / Set Game Paused ; 일시정지 함수\n\n<html><span style="background:#e2e2ff ; font-family:돋움; font-size: 14px;"> <b> #.언리얼 화면 구성 </b> </span></html>\n\n월드뷰\n뷰포트\n / 카메라 = 북마크\n\n컴퍼넌트\n / 프로퍼티\n\n모드 패널 ; 배치 모드 등\n콘텐츠 브라우저 ; 최대 4개를 독립적으로 사용 가능\n\n''에픽게임즈 런처가 중요''\n\n<html><span style="background:#e2e2ff ; font-family:돋움; font-size: 14px;"> <b> #.블루프린트 유형 </b> </span></html>\n레벨 블루프린트 ; 레벨과 연동\n / 레벨이 바뀔 경우, 재사용이 되지 않는다.\n / 레벨과 연관된 설정이나 초기 스크립트의 실행을 위한 것\n\n액터 블루프린트 ; 동일 레벨에서 복제할 수 있다.\n\n애니메이션 블루프린트\n / 스테이트 머신을 구성 \n\n언리얼 모션 그래픽을 활용한 UI용 위젯 블루프린트\n\n※ 여러 블루프린트에 있는 데이터와 기능을 액세스할 때\n유효하지 않는 레퍼런스로 들어갈 경우, 오류가 발생할 수 있고,\n\n순환 종속을 최대한 회피해야 한다.\n\n<html><span style="background:#e2e2ff ; font-family:돋움; font-size: 14px;"> <b> #.프로젝트 및 파일 구조 이해 </b> </span></html>\n1. 대규모 팀에서 애셋 공유 속도를 높이고 싶습니다. 아트 애셋 공유에 도움이 되는 방법은 무엇일까요?\n ⇒ 파생 데이터 캐시(DDC)를 팀원과 공유합니다. \n\n2. 프로젝트를 언리얼 엔진 새 프리뷰 빌드로 이동하는 도중, 플러그인이 지원되지 않는다는 메시지를 받았습니다. 우회해서 프로젝트를 실행하는 방법은 무엇일까요?\n ⇒ .uproject 파일에서 플러그인(들)을 제거합니다. \n\n3. 다른 개발자에게 블루프린트 프로젝트를 전송하려 합니다. 그 개발자가 프로젝트를 실행하려면 .uproject 파일 말고 어떤 폴더가 필요할까요?\n ⇒ Content 그리고 Config 폴더입니다. \n\n4. 마켓플레이스 애셋을 프로젝트에 처음으로 추가하고 있습니다. 무슨 일이 벌어질까요? \n ⇒ 애셋이 다운로드되고, 프로젝트에 추가된 뒤, Cached Downloads 폴더에 저장됩니다. \n\n5. 학습 탭에서 에픽게임즈가 제작한 학습 프로젝트를 다운로드했습니다. 그 프로젝트 파일을 액세스할 수 있는 곳은 어디인가요?\n ⇒ 보관함\n\n\n<html><span style="background:#e2e2ff ; font-family:돋움; font-size: 14px;"> <b> #.더 나은 파이프라인 구축 </b> </span></html>\n-.System Units ; 1 언리얼 유닛 = 1센티미터 (기본 단위)\n-. 텍스처 ; X, Y축 각각 2의 승수 (⇒ LOD 적용)\n-. 독립된 알파로 사용될 파일 사용 \n / 알파채널이 포함될 경우, 용량이 2배가 됨\n / LOD를 적용할 경우, Base Texture는 그대로 사용할 수 있어서 품질 유지에 도움\n-. 오브젝트에 머티리얼 ID가 있을 경우,\n 각 머티리얼 ID를 표시하려면 매 머티리얼 ID 마다 다시 렌더링\n (머티리얼 ID 5이면, 5번 렌더링하고 최적적으로 한번 더 레더링 된 결과를 표시)\n-. Lightmap UV's\n / 3ds Max UV "채널 2" (1부터 카운팅) = 언리얼 엔진의 "채널1" (0부터 카운팅)\n-. Collisiion Meshes ; UCX_숫자 형식\n / 3dsMax에서 폴리곤 생성하거나 \n / 언리얼의 콜리전 메쉬를 사용 (복잡한 형태는 '컨벡스 분해' 옵션 사용)\n-.Limiting Oerdraw \n 알파값을 가진 텍스처를 사용하는 경우, Overdraw를 최소화하도록 메쉬를 구성\n / 정사각형 정형화된 구성인 경우, 끝 부분에서 버려지는 픽셀이 많을 수도 있음\n / 언리얼의 '셰이더 복잡도'를 통해 확인 ; 흰색 부분이 최대한 적게 표시되도록 구성\n-. Creating LOD's\n 메쉬의 권장 LOD 비율 ; 75% >> 35% >> 12%까지 줄임 (for 메모리 절약)\n\n\n<html><span style="background:#e2e2ff ; font-family:돋움; font-size: 14px;"> <b> #.마스터 머티리얼 제작 </b> </span></html>\n-. 머티리얼 함수 ; 머티리얼간의 셰이더 코드를 공유하는 수단\n-. 버텍스 애니메이션 ; 주어진 메시의 버텍스를 오프셋\n ⇒ 굉장히 복잡한 애니메이션이 필요한 물, 천, 폴리지 등에 저렴한 비용으로 효과를 발생\n\n\n<html><span style="background:#e2e2ff ; font-family:돋움; font-size: 14px;"> <b> #.텍스처 스트리밍 </b> </span></html>\n-. 기본적으로 텍스처가 얼마나 크거나 작게 보일지 처리한다.\n / 레벨의 오브젝트와 카메라의 거리에 따라 서로 다른 레벨 오브 디테일을 스트링 \n ; LOD나 텍스처 밉맵으로 채울 수 있는 특정 메모리 세트\n / UE4 Console 이나 ( r.Streaming.PoolSize = SizeInMB )\n DefaultEngine.ini 에서 스트리밍 풀 크기를 설정\n / UI 등 가장 높은 해상도를 사용해서 화면에 표시할 경우, 'Naver Stream' 옵션을 사용\n ⇒ 많은 비용을 발생하고, 퍼포먼스에 영향을 준다.\n\n\n<html><span style="background:#e2e2ff ; font-family:돋움; font-size: 14px;"> <b> #.Performance & Optimization </b> </span></html>\n-. LOD & 스태틱 메시 병합\n▷ ''Merge Actor Tool''\n / 배경, 동일 Triangle 수에서 1개의 오브젝트, Material, Texture로 병합 \n / 일반적으로 LOD0에서 병합\n\n▷ ''Hierarchical Level of Detail(HLOD) Tool''\n / 카메라와의 거리에 따라 오브젝트, Material, Texture 갯수를 줄여주는 역할\n 레벨이 커면 클수록, 오브젝트 밀도가 높으면 높을수록 프록시 메시 생성데 드는 시간이 길어짐\n//ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ\n-.Lighting ; 3가지 방식 - 스태틱, 스테이셔너리, 다이내믹\n-.Shadowing ; 2가지 방식 \n / 스태틱, 다이내믹 섀도잉 (컨택트 섀도, 디스턴스 필드 새도, 케스케이디드 섀도 맵)\n-.Post Process\n\n//ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ\n-.Volume ; 언리얼에서는 다양한 볼륨이 존재\n / Lightmass Volumes ; 라이팅 영역을 설정하거나 정적 라이트를 보완하는 역할\n ; Lightmass Importance Volume, Lightmass Character Indirect Detail Volume\n / Cull Distance Volumes \n ; 오브젝트가 랜더링 될지 아니면 렌더링을 멈출지의 기준이 될 크기와 거리를 결정\n (개별 오브젝트별 수동설정이 가능)\n\n//ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ\n-.Reflections ; 건축이나 차량 시각화\n -> 모든 월드에 배치된 특정 액터에 의해 제어 (cf.Reflection View)\n / Screen Space Reflections ; 캐릭터 이동 등 동적인 반사맵에 사용 (or Planar Reflections)\n -> 화면에 있는 정보를 가지고 생성 (화면 밖 오브젝트는 반사되지 않는다.)\n / Sphere Reflections (가장 저렴) ; 3가지 타입 모두 큐브 맵을 사용\n Box Reflections ; 복도나 긴 통로에 사용\n Planar Reflections (비싼 비용) ; \n -> 설정 ; Light > Support Global Clip Plane for Planar Reflections 이 활성화\n / Getting Higher Quality Reflections\n\n\n
http://contents.history.go.kr/mobile/ta/view.do?levelId=ta_h71_0080_0020_0020\n\n조선시대에는 오래 살면 서민이라도 '영감' 벼슬을 받았다. 성종 때 법제화된 노인직 또는 수직(壽職)이 그것이다. 조선 후기의 경우 80세는 통정대부(通政大夫 정3품), 90세는 가선대부(嘉善大夫 종2품), 100세는 숭정대부(崇政大夫 종1품)의 위계를 내렸다. 물론 실직은 아니고 품계만 주는 공명첩(空名帖)이다. 매년 초 관찰사가 양천(良賤)을 막론하고 80세 이상 노인들을 조정에 추천했다. 노인을 흔히 '영감'이라 부르는 것도 실은 노인직 제도에서 비롯됐다. 정2품 이상은 대감, 종2품~정3품 당상관은 '영감'이라 했던 것이다.\n\n!! 조선시대 관직의 품계 및 색상\n\n출처 ; https://www.jnilbo.com/view/media/view?code=2022041209581076776 - 박현일의 '색채 인문학'> 조선 왕실 '회색' 금기시… 계급 낮을수록 파란색 옷\n<html> <left>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/20220412_색채와생활.jpg" width=640>\n</left> </html>\n조선 시대 왕비의 의례복 치마는 자색이었다. 자주 치마는 정실 왕비 외에는 입을 수 없는 가장 권위 있는 치마 색이었고, 보통 때는 다홍색이다. 세자빈의 치마는 역시 다홍색이었다.\n\n한편 왕실에서 회색은 금기시하는 색이었고, 특히 조선 시대에는 계급이 낮을수록 파란색 옷을 입었다. 조선 시대에는 품계에 따라 상징색이 달랐으며, 종3품~6품까지는 파란색이었다.\n\n\n!! 공명첩(空名帖)\n공명첩이라 함은 교지와 교첩등과 같은 사령장에서 개인의 성명이 포함되지 않는 사령장을 이르는 말이다. 공명첩의 종류에는 관직·관작의 임명장인 공명고신첩(空名告身帖), 양역(良役)의 면제를 인정하는 공명면역첩(空名免役帖), 천인에게 천역을 면제하고 양인이 되는 것을 인정하는 공명면천첩(空名免賤帖), 향리에게 향리의 역을 면제하여주는 공명면향첩(空名免鄕帖) 등이 있었다.\n칙명 좌측으로 첫 행에 관작을 부여 받는 개인의 이름이 기록되어야 하나 이름이 비었으니 공명(空名)이라 한다.\n정 3품이라고 하는 것은 당상관과 당하관을 구분하는 기준이 되며 조선시대 당상관과 당하관의 차별은 엄격하였다. ''당상관이 되어야 어전회의에 참석할 수 있는 기준이 된다. 통정대부는 정 3품 당상관에게 주어지는 관작이다.''\n\n공명첩이 처음 사용하게 된 시기는 임진왜란 시기인데, 전국이 병란으로 국토가 유린된 후에 수복을 하기 위하여 지주들과 또는 일반 양인들에게도 여러 의무를 면제해 주고 발급해 주는 역할을 하였다. 조선왕조실록에서 공명첩이라는 말이 선조실록에 22건 기록되어 있는데, 이는 임진왜란이 발생하고 국가 재정이 파탄에 이르자 지방의 유지들을 통하여 지방의 민심을 조금이라도 잡아보고자 했던 조정의 방책이었으며 공명첩의 남발은 국가의 근간이 자못 흔들릴 수 있는 사안이라 어전회의에서 사헌부와 비변사의 계(啓)가 올라온다.\n\n공명첩이 임진왜란 시기에 만들어졌으나 어려운 시기 때마다 사용되었던 것으로 보인다. 숙종 시대에 함흥도 관찰사 윤지선은 통정대부와 가선대부의 공명첩 300장을 만들어서 전력강화나 지방재정의 보충등으로 사용한 기록이 보인다.\n\n또한 정조시에는 사찰의 보수 작업에도 공명첩이 남발하였다는 기록이 있는데 강원도 금강산의 유점사에 쓰일 용도로 100장, 철종시에 속리산 보수작업에 공명첩 400장, 고종 대에 귀주사에 공명첩 500장을 발행하여 재원의 원역(院役)확보에 나섰던 것으로 보인다.\n\n여러 문중들의 족보와 묘지, 묘갈명 등을 살펴보면 증직이나, 수직으로, 또는 공명첩으로 받은 정 3품 통정대부에 대한 내용이 무수히 많다. 조정에서는 원역을 확보할 수 있는 기회가 되었고, 또한 사대부에서는 가문에 대한 번성과 족보에 올릴 수 있는 내용, 국가에 대한 보답이라는 명분이 있었던 것으로 보인다. \n\n\n\n\n\n\n
08:30 ~ 08:40 정전시간외거래\n08:40 ~ 09:00 장전동시호가매매\n09:00 ~ 15:20 정규장매매\n\n@@color(#C89342): ''기업의 가치와 시가총액''@@ (in 벤자민 그레이엄의 현명한 투자자 : 정말 읽기 쉬운 핵심 요약판)\n(p.085) 시가총액이 순자산가치보다 3분의 1 이상 높은 주식, 즉 ''PBR이 1.33 이상인 주식은 매수하지 않는 편이 좋다.'' 그렇다고 해서 시가총액이 순자산가치와 비슷한 주식은 반드시 유망하다는 뜻은 아니다. PBR이 만족스러우면서, 재무 구조가 건전하고, 장기 수익성 전망도 밝은지 확인해야 한다. 이런 주식은 시가총액에 '투기 프리미엄' 비중이 크지 않으므로 주가 변동도 상대적으로 크지 않을 것이다.\n\n@@color(#C89342): ''전기차 배터리 유형''@@ \n| ! | !양극재 | !음극재 | !분리막 | !전해질 | !특징 |\n|삼원계 배터리 |니켈, 코발트, 망간, 알루미늄 |흑연, 실리콘 | 있음 | 액체 |에너지 밀도 높음, 긴 주행거리 |\n|인산철 배터리 |철, 인 |흑연, 실리콘 | 있음 | 액체 |가격 저렴, 안전 |\n|4680 |다양한 구성 가능 |흑연, 실리콘 | 있음 | 액체 |테슬라 개발 중 |\n|리튬메탈 배터리 |다양한 구성 가능 |리튬금속(메탈) | 있음 | 반고체 또는 고체 |차세대 배터리 |\n|전고체 배터리 |다양한 구성 가능 |다양한 구성 가능 | 없음 | 고체 |차세대 배터리 |\n\n
<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 14px;"> <b> ■ 아버지 제사 축문 </b> </span> \n</html>\n참고 ; https://copyrightyoon.tistory.com/156\n<html> <IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/20240214_Prayer.jpg" width=300> </html>\n\n<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 14px;"> <b> ■ 할머니가 두분인 경우 </b> </span> \n</html>\n<html>\n<table align="center" border="0" >\n <tr>\n <td width="30"> 饗 향 </td> <td width="30"> </td> <td width="30"> </td> <td width="30"> </td> <td width="30"> </td> \n <td width="30"> </td> <td width="30"> </td> <td width="30"> 維 유 </td>\n </tr>\n <tr>\n <td width="30"> </td> <td width="30"> </td> <td width="30"> </td> <td width="30"> 顯 현 </td> <td width="30"> 顯 현 </td> \n <td width="30"> 顯 현 </td> <td width="30"> </td> <td width="30"> </td>\n </tr>\n <tr>\n <td width="30"> </td> <td width="30"> 謹 근 </td> <td width="30"> 氣 기 </td> <td width="30"> 八 팔 </td> <td width="30"> 八 팔 </td> \n <td width="30"> 八 팔 </td> <td width="30"> </td> <td width="30"> 歲 세 </td>\n </tr>\n <tr>\n <td width="30"> </td> <td width="30"> 以 이 </td> <td width="30"> 序 서 </td> <td width="30"> 代 대 </td> <td width="30"> 代 대 </td> \n <td width="30"> 代 대 </td> <td width="30"> </td> <td width="30"> 次 차 </td>\n </tr>\n <tr>\n <td width="30"> </td> <td width="30"> </td> <td width="30"> 流 유 </td> <td width="30"> 祖 조 </td> <td width="30"> 祖 조 </td> \n <td width="30"> 祖 조 </td> <td width="30"> </td> <td width="30"> </td>\n </tr>\n <tr>\n <td width="30"> </td> <td width="30"> 淸 청 </td> <td width="30"> 易 역 </td> <td width="30"> 妣 비 </td> <td width="30"> 妣 비 </td> \n <td width="30"> 考 고 </td> <td width="30"> 八 팔 </td> <td width="30"> 癸 계 </td>\n </tr>\n <tr>\n <td width="30"> </td> <td width="30"> 酌 작 </td> <td width="30"> </td> <td width="30"> </td> <td width="30"> </td> \n <td width="30"> </td> <td width="30"> 代 대 </td> <td width="30"> 卯 묘 </td>\n </tr>\n <tr>\n <td width="30"> </td> <td width="30"> 庶 서 </td> <td width="30"> 霜 상 </td> <td width="30"> 淑 숙 </td> <td width="30"> 淑 숙 </td> \n <td width="30"> 通 통 </td> <td width="30"> 孫 손 </td> <td width="30"> </td>\n </tr>\n <tr>\n <td width="30"> </td> <td width="30"> 羞 수 </td> <td width="30"> 露 로 </td> <td width="30"> 夫 부 </td> <td width="30"> 夫 부 </td> \n <td width="30"> 政 정 </td> <td width="30"> ︵ </td> <td width="30"> 十 시 </td>\n </tr>\n <tr>\n <td width="30"> </td> <td width="30"> </td> <td width="30"> 旣 기 </td> <td width="30"> 人 인 </td> <td width="30"> 人 인 </td> \n <td width="30"> 大 대 </td> <td width="30"> </td> <td width="30"> 月 월 </td>\n </tr>\n <tr>\n <td width="30"> </td> <td width="30"> 祗 지 </td> <td width="30"> 降 강 </td> <td width="30"> </td> <td width="30"> </td> \n <td width="30"> 夫 부 </td> <td width="30"> </td> <td width="30"> 乙 을 </td>\n </tr>\n <tr>\n <td width="30"> </td> <td width="30"> 薦 천 </td> <td width="30"> </td> <td width="30"> 羅 나 </td> <td width="30"> 月 월 </td> \n <td width="30"> 府 부 </td> <td width="30"> ︶ </td> <td width="30"> 亥 해 </td>\n </tr>\n <tr>\n <td width="30"> </td> <td width="30"> 歲 세 </td> <td width="30"> 瞻 첨 </td> <td width="30"> 州 주 </td> <td width="30"> 城 성 </td> \n <td width="30"> 君 군 </td> <td width="30"> 敢 감 </td> <td width="30"> 朔 삭 </td>\n </tr>\n <tr>\n <td width="30"> </td> <td width="30"> 事 사 </td> <td width="30"> 掃 소 </td> <td width="30"> 林 임 </td> <td width="30"> 金 김 </td> \n <td width="30"> </td> <td width="30"> 昭 소 </td> <td width="30"> </td>\n </tr>\n <tr>\n <td width="30"> </td> <td width="30"> </td> <td width="30"> 封 봉 </td> <td width="30"> 氏 씨 </td> <td width="30"> 氏 씨 </td> \n <td width="30"> </td> <td width="30"> 告 고 </td> <td width="30"> 七 칠 </td>\n </tr>\n <tr>\n <td width="30"> </td> <td width="30"> 尙 상 </td> <td width="30"> 塋 영 </td> <td width="30"> </td> <td width="30"> </td> \n <td width="30"> </td> <td width="30"> 于 우 </td> <td width="30"> 日 일 </td>\n </tr>\n <tr>\n <td width="30"> </td> <td width="30"> </td> <td width="30"> </td> <td width="30"> 之 지 </td> <td width="30"> </td> \n <td width="30"> </td> <td width="30"> </td> <td width="30"> 辛 신 </td>\n </tr>\n <tr>\n <td width="30"> </td> <td width="30"> </td> <td width="30"> 不 불 </td> <td width="30"> 墓 묘 </td> <td width="30"> </td> \n <td width="30"> </td> <td width="30"> </td> <td width="30"> 巳 사 </td>\n </tr>\n <tr>\n <td width="30"> </td> <td width="30"> </td> <td width="30"> 勝 승 </td> <td width="30"> </td> <td width="30"> </td> \n <td width="30"> </td> <td width="30"> </td> <td width="30"> </td>\n </tr>\n <tr>\n <td width="30"> </td> <td width="30"> </td> <td width="30"> 感 감 </td> <td width="30"> </td> <td width="30"> </td> \n <td width="30"> </td> <td width="30"> </td> <td width="30"> </td>\n </tr>\n <tr>\n <td width="30"> </td> <td width="30"> </td> <td width="30"> 慕 모 </td> <td width="30"> </td> <td width="30"> </td> \n <td width="30"> </td> <td width="30"> </td> <td width="30"> </td>\n </tr>\n</table>\n</html>\n''[축문내용]''\n효손(또는 효자, 증손) 00는 할아버님·할머님 묘소에 고하나이다.\n계절의 순서가 흘러 바뀌어 서리와 이슬은 벌써 내렸습니다. \n무덤을 찾아와서 가다듬어보니 감모(感慕)의 정을 이기지 못 하겠습니다.\n삼가 맑은 술과 여러 반찬으로 세사(歲事)를 받자오니 흠향하시옵소서.\n| 維(유)|이어서 내려오다는 뜻 |\n| 歲次(세차)|해의 차례라는 뜻 |\n| 干支(간지)|간지는 천간지지 육십갑자의 그해의 태세를 쓴 것이며 그 예로 금년이 丁丑년이면 "丁丑"이라고 쓴다. |\n| 某月(모월)|제사날을 따라 쓰며 제사달이 8월이면 "八月"이라 쓴다. |\n| 干支朔(간지삭)|제사달의 초하루라는 뜻. 제사달 초하루의 일진을 쓴다. 예를 들면 초하루 일진이 丁亥이면 "丁亥朔"라 쓴다. |\n| 某日(모일)|제사날을 쓴 것이며 15일이면 그대로 "十五日"로 쓴다. |\n| 干支(간지)|그 제사날의 일진을 쓴다. 예를 들면 15일이 제삿날이고 15일의 일진이 甲子이면 "甲子"라고 쓴다. |\n| 敢昭告于(감소고우)|삼가 밝게 고한다는 뜻 |\n||\n| 기서유역(氣序流易)|절기가 바뀌었다. |\n| 상로기강(霜露旣降)|찬 서리가 이미 내렸다. |\n| 첨소봉영(瞻掃封塋)|묘역(墓域)을 쓸고 봉분(封墳)을 우러러보다. |\n| 불승감모(不勝感慕)|흠모하는 정을 이길 수 없나이다. |\n| 근이(謹 以)|정성을 다하여. 삼가. |\n| 청작서수(淸酌庶羞)|맑은 술과 여러 가지 음식을 드린다. |\n| 지천세사(祗薦歲事)|삼가 세사(歲事, 연중 행사)를 올린다. |\n\n<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 14px;"> <b> ■ 고조 ~ 나 ~ 현손 </b> </span> \n</html>\n| 고조 高祖 | 증조 曾祖 | 조 祖 | 부 父 | 기 己 (나) | 자 子 | 손 孫 | 증손 曾孫 | 현손 玄孫 |\n| 5세 | 4세 | 3세 | 2세 | (1세) | 2세 | 3세 | 4세 | 5 세 |\n曾祖(증조) - 曾孫(증손)\n高祖(고조) - 玄孫(현손)\n증손(曾孫)보다 아래의 자손은 고손(高孫)이 아니고 현손(玄孫)이라 한다. 여기서 현(玄)은 '검다'는 뜻도 있지만 '멀다'는 뜻이다.\n증조부(曾祖父)보다 더 높은 조상에게 높을 고(高)를 사용해서 고조부(高祖父)라고 하는데 아래로 내려갈 때 증손(曾孫)보다 더 아래의 자손에게 높을 고(高)를 쓸 수 없기 때문이다.\n\n아랫대 후손에 쓰이는 호칭의 순서대로 나열하면 아래와 같다.\n| 己(나) | 자 子 | 손 孫 | 증손 曾孫 | 현손 玄孫 | 래손 乃孫. 來孫 | 곤손 昆孫 | 잉손 仍孫 | 운손 雲孫 |\n| 1세 | 2세 | 3세 | 4세 | 5세 | 6세 | 7세 | 8세 | 9세 |\n| (기준) | 1세손 | 2세손 | 3세손 | 4세손 | 5세손 | 6세손 | 7세손 | 8세손 |\n- 넓은 의미로 원손(遠孫)을 가리키며 ‘구름과 같이 멀어진 자손’을 말한다.\n\n\n<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 14px;"> <b> ■ 묘제축문(墓祭祝文) </b> </span> \n</html>\n참고 ; https://m.blog.naver.com/khd9345/221158907712 - 묘제축문 쓰는 법\n\n-. 기제를 모시지 않는 5대조 이상 친진(親盡)의 조상에게 1년에 한번 지내는 세일사묘제[세일사(歲一祭)] 축문\n-. 기제를 모시는 4대친[친미진(親未盡):고조~부모]에게 계절에 따라 지내는 묘제축문\n\n<예시>\n維\n 歲次壬辰 十月己卯朔 初十日戊子\n 八代孫○○ 敢昭告于\n顯八代祖考學生府君\n顯八代祖妣孺人坡平尹氏之墓\n 歲薦一祭 禮有中制 履玆霜露 彌增感慕 謹以 淸酌庶羞 祗薦歲事 尙\n饗\n(임진년 10월 10일 8대손 ○○는 8대조 할아버님과 할머님께 감히 고하옵니다. 일 년에 한 차례씩 제사를 드리는 것이 예에 맞는 법이옵니다. 서리와 이슬을 밟으니 더욱 감동하고 사모하는 마음 간절하여 삼가 맑은 술과 여러 음식으로 공경을 다하여 세사를 드리오니 흠향하시옵소서)\n\n<예시>\n維\n 歲次 ○○ ○月 ○○ 朔 ○日 ○○\n ○代孫 ○○ 敢昭告于\n顯 ○代祖考 學生府君\n顯 ○代祖妣 孺人○○ ○氏 之墓\n 氣序流易 霜露旣降 瞻掃封塋 不勝感模 謹以 淸酌庶羞 祗薦歲祀 尙\n饗\n\n<예시>\n維\n 歲次 ○○ ○月 ○○ 朔 ○日 ○○\n ○代孫 ○○ 敢昭告于\n顯 ○代祖考 學生府君\n顯 ○代祖妣 孺人○○ ○氏 之墓\n 氣序流易 雨露旣濡 瞻掃封塋 不勝感慕 謹以 淸酌庶羞 祗薦歲事 尙\n饗\n(절기가 바뀌어 봄이 되어 비와 이슬이 내려 젖었습니다. 묘역을 쓸고 봉분을 바라보니 감동하여 사모하는 마음 금할 수 없사옵니다. 삼가 맑은 술과 여러 음식으로 공경을 다하여 세사를 드리오니 흠향하시옵소서)\n\n<html> <span style="font-size: 10pt;"> <font color=RoyalBlue> <b> 여러 신위를 한 장으로 작성한 예 </b> </font> </span> </html>\n축문은 여러 대의 묘제를 실내(재실)에서 합동으로 지내도 각 대별로 각각 작성하고 각 대별로 초헌할 때 각각 독축한다. 그러나 10여 대 이상 많은 신위를 모시는 경우에는 정례는 아니지만 편의상 모든 신위를 열서하여 한 장으로 작성하고 최존위(最尊位)에 초헌할 때 독축하기도 한다.\n\n<html> <IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/20221122_묘제(합설).jpg" width=640> </html>\n① ○○ ○○敢昭告于\n② ○代孫 ○○ 敢昭告于\n③ 孝後世孫 ○○ 敢昭告于\n위 ① ② ③ 중 제위(祭位)와 제주(祭主)와의 관계에 따라 작성(作成)한다.\n\n\n<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 14px;"> <b> ■ 개제 고사문 </b> </span> \n</html>\n출처 ; https://mongyang-archives.org/items/show/2211 / 소장처 ; 몽양기념관\n\n''내용''\n봉사손인 여정현의 선조고의 상기(喪期)가 다 끝나서 신주(神主)를 사당으로 옮기고 개제(改題)하겠다고 여러 신주들에게 고유하는 고사(告辭)이다.\n\n''원문''\n維歲次辛未十二月丙辰朝三十 一乙西穴代孫正錄敢岡告于\n顯六代祖考通訓大夫行私文館校理知製 敎兼 經遊侍讀官春秋館記注官府君\n顯六代祖妣淑人延安李氏\n顯六代祖妣淑人全州李氏\n顯五代祖考通政大夫承政院同副承旨知製 敎兼 經遊參贊官春秋館修攝官府君\n顯五代祖妣淑夫人文化柳氏\n顯高祖考 贈喜善大夫吏普參判兼同知義禁府事五衛都德府副德管行折衝將軍命知中極府事兼普司五衛將府君\n顯高祖地 贈貞夫人豊川任氏\n顯曾祖考通訓大夫行榮川郡守兼安東鎭管兵馬同兪節制使府君\n顯曾祖妣淑人潘南朴氏\n顯曾祖妣淑人海州吳氏\n顯祖妣龐淑夫人延安李氏法以先祖考通政大夫敎掌府都正府君喪期己盡\n顯穴代祖考通訓大夫行私文館校理知製 敎兼 經遊侍讀官春秋館記注官府君\n顯穴代祖妣淑人延安李氏\n顯穴代祖妣淑人全州李氏\n顯五代祖考通政大夫承政院同副承S知製 敎兼 經遊參贊官春秋館修授官府君\n顯五代祖妣淑夫人文化柳氏\n顯高祖考 贈喜善大夫吏普參判兼同知義禁府事五衛都擔、府副德管行折衝將軍兪知中極府事兼普司五衛將府君\n顯高祖妣 贈貞夫人豊川任氏\n顯曾祖考通訓大夫行榮川郡守兼安東鎭管兵馬同命節制使府君\n顯曾祖妣淑人潘南朴氏\n顯曾祖妣淑人海州吳氏\n顯祖妣 贈淑夫人延安李氏神主 今將改題 世次送遷 不勝感情 議以酒果 用仰度告 證告\n\n''국역''\n유세차(維歲次) 신미년 12월 병진 30일 을유일에 6대손 정현(正錢)이 감히 분명하게 고합니다.\n현육대조고(顯穴代祖考) 통훈대부(通訓大夫) 행홍문관교리(行私文館校理) 지제교(知製敎) 겸 경연 시독관(兼經遊侍讀官) 춘추관 기주관(春秋館記注官) 부군(府君)\n현육대조비(顯穴代祖妣) 숙인(被人) 연안(延安) 이씨(李氏) 현육대조비(顯穴代祖姚) 숙인(減人) 전주(全州) 이씨(李氏)\n현오대조고(顯五代祖考) 통정대부(通政大夫) 승정원 동부승지(承政院同副承旨) 지제교(知製敎) 겸경연 참찬관(兼經 遊參資官) 춘추관 수찬관(春秋館修授官) 부군(府君)\n현오대조비(顯五代祖妣) 숙부인(被夫人) 문화(文化) 유씨(柳氏)\n현고조고(顯高祖考) 증가선대부(僧喜善大夫) 이조참판(吏曹參判) 겸 동지의금부사(兼同知義禁府事) 오위도총부 부총관(五衛都德府副擔管) 행 절충장군(行折衝將軍) 첨지중추부사(命知中極府事) 겸 조사 오위장(兼普司五衛將) 부군(府君)\n현고조비(顯高祖妣) 증정부인(譜貞夫人) 풍천(豊川) 임씨(任氏)\n현증조고(顯曾祖考) 통훈대부(通訓大夫) 행 영천군수(行榮川郡守) 겸 안동진 관병마동첨절제사(兼安東鎭管兵馬同兪節制 使) 부군(府君)\n현증조비(顯曾祖妣) 숙인(被人) 반남(潘南) 박씨(朴氏) 현증조비(顯曾祖如) 숙인(滅人) 해주(海州) 오씨(吳氏) 현조비(顯祖姚) 증 숙부인(趙滅夫人) 연안(延安) 이씨(李氏)\n이제 선조고(先祖考) 통정대부(通政大夫) 돈녕부 도정(敎掌府都正) 부군(府君)의 상기(喪期)가 이미 다하였습니다.\n현육대조고(顯六代祖考) 통훈대부(通訓大夫) 행홍문관교리(行私文館校理) 지제교(知製敎) 겸 경연 시독관(兼經遊侍讀官) 춘추관 기주관(春秋館記注官) 부군(府君)\n현육대조비(顯穴代祖妣) 숙인(滅人) 연안(延安) 이씨(李氏) 현육대조비(顯六代祖如) 숙인(液人) 전주(全州) 이씨(李氏)\n현오대조고(顯五代祖考) 통정대부(通政大夫) 승정원 동부승지(承政院同副承旨) 지제교(知製敎) 겸 경연 참찬관(兼經ffi參 贊官) 춘추관 수찬관(春秋館修撰官) 부군(府君)\n현오대조비(顯五代祖妣) 숙부인(滅夫人) 문하(文化) 유씨(柳氏)\n현고조고(顯高祖考) 증 가선대부(僧喜善大夫) 이조참판(吏普參判) 겸 동지의금부사(兼同知義禁府事) 오위도총부 부총관(五衛都德府副德管) 행 절충장군(行折衝將軍) 첨지중추부사(兪知中權府事) 겸 조사 오위장(兼舊司五衛將) 부군(府君)\n현고조비(顯高祖妣) 증 정부인(騰貞夫人) 풍천(豊川) 임씨(任氏)\n현증조고(顯曾祖考) 통훈대부(通訓大夫) 행 영천군수(行榮川郡守) 겸 안동진 관병마동첨절제사(兼安東鎭管兵馬同兪節制 使) 부군(府君)\n현증조비(顯曾祖妣) 숙인(淑人) 반남(潘南) 박씨(朴氏) 현증조비(顯普祖妣) 숙인(淑人) 해주(海州) 오씨(吳氏) 현조비(顯祖妣) 증 숙부인(譜淑夫人) 연안(延安) 이씨(李氏)\n신주(神主)를 지금 고쳐 쓰려고 하니, 세대의 차례가 차례대로 옮겨지게 되어 감회와 슬픔을 견디지 못하겠습니다. 삼가 술과 과일로 경건히 고합니다.\n\n
출처 ; http://www.jejukwangsan.com/board/gcontent/contentview.php?content_id=kcon0314&PHPSESSID=41a9fd74bf0c9559753c2cee3eef58a5\n\n<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 18px;"> <b> 축문 </b> </span>\n</html>\n\n<html> <IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/20221122_광산김씨36.gif" width=800> </html>\n* 문정공(태현),문간공(광제)문하시중수,제주입도조(윤조),둔지(치남), 존옥이(계충)선조님의 단향제(단향제)또는 묘제 축문은 통일 되었음.\n* 감소고우 (敢昭告于) : 처의 제사에는 감자를 쓰지 않고 소고우(昭告于)라 하며 제(弟)이하에서는 고우(告于)만 쓴다. 감소고우(敢昭告于)란 감히 밝혀 아뢰옵니다 라는 뜻임\n\n* 기서유역(氣序流易) : 절기가 바뀌었다는 뜻임\n* 우로기유(雨露旣濡) : 봄이 되어 비와 이슬이 내린다는 끗이다\n* 첨소봉단(瞻掃封壇) : 선조의 산소를 깨끗이 단장한다는 뜻임\n* 불승감모(不勝感慕) : 영원하신 조상님을 사모하는 정을 이기지 못한다는 뜻임\n* 근이(謹以) : 정성을 다한다는 뜻임\n* 청작서수(淸酌庶羞) : 맑은 술과 여러 가지 음식을 드린다는 뜻임\n\n* 향(饗) : 흠양하옵소서 높이 받드는 문자이며 줄을 바꾸어 현(현)자와 함께 높여 쓴다.\n\n<html> <IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/20221122_광산김씨37.gif" width=320> </html>\n* 유시보우(維時保佑) : 천신께서 보호하여 주신다는 뜻\n* 실뢰신휴(實賴神休) : 신령님의 은혜를 받든다는 뜻\n\n\n
<html>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<span style="font-size: 14px;"> #. 원가 </span> </div> </html>\n|2021.10.21. |\n|(중과) 자몽 12입 4.5kg내외(개당 350~380g내외) | 2,770 g| 34,000 원 | 이마트 트레이더스 (농업회사법인 이에프시) |\n|백설 브라운 자일로스 설탕 5kg / 15,940원 | 2,216 g| 7,065 원 | |\n\n \n<html>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<span style="font-size: 14px;"> #. 자몽차 만들기 </span> </div> </html>\n1. 자몽 손질\n 뜨거운 물에 1분30초 끊인 후, 물이 충분히 식힌 후에 자몽껍질과 피를 제거해준다.\n ( 너무 오래 끊이면 피가 쉽게 벗겨지지 않는다. )\n2. (자일로스) 설탕과 배합 ; 김치 냉장고용 김치통에서 배합\n 손질한 자몽 과육 100 : (자일로스) 설탕 80\n3. 상온에서 2일 숙성\n 아침, 저녁으로 잘 저어준다. (그대로 두면 공기중에 노출된 과육이 마른다)\n4. 냉장실에서 3일 이상 숙성\n 숙성후 작은 병에 나누어서 보관\n\n<br>
https://contents.premium.naver.com/historia9110/historia91 - 혁명 읽는 사람 (손민석)\n\n<html><span style="background:#E2E2ff ; font-family:돋움; font-size: 14px;"> <b> #. 2022.04.27./ 러시아-우크라이나 전쟁의 원인은 세계화!? 이게 무슨 얘기야? [지구본 특강반 1-1부] (손민석) </b> </span></html>\nhttps://www.youtube.com/watch?v=T_9HDpDJTNw\n\n<html> <span style="font-size: 10pt;"> <font color=RoyalBlue> <b> ◆ 세번째 자본주의 성장 ⇒ 자본주의적 세계시장의 형성 </b> </font> </span> </html>\n1. 16세기 자본주의적 세계시장의 탄생\n2. 19세기 자본주의적 세계시장의 완성\n → 형식적 포섭 ; 영국 평균 1% 성장 (시장이 커지는 경향과 비슷한 수준에서 성장)\n3. 20세기 자본주의적 세계시장의 심화\n → 실질적 포섭 ; 미국 평균 3% 이상 폭발적인 성장\n / 자본주의가 가정 내로 파급, 자동차, 가전제품 등으로 가사 노동의 상품화로 대중 소비가 증가\n4. 네번째 자본주의 ; 노동력 자체의 질적인 저항\n / 20세기 자본주의 ; 단순, 저부가가치 노동이 유형의 기계로 대체 (''임금 노예'')\n 네번째 자본주의 ; @@color(#BE8C3C): 무형의 노동 자체의 가치가 상승해서, 경영적인 마인드로 개인의 가치를 관리하는 단계로 발전 @@ (''임금 농노'')\n\n<html> <span style="font-size: 10pt;"> <font color=RoyalBlue> <b> ◆ 대침체 ; 불균등한 변화로 인한 세력의 균형이 깨짐 ⇒ 세계 대전으로 귀결 </b> </font> </span> </html>\n1. 이윤율 하락\n2. 가격 하락 ; 선발 주자의 둔화로 후발 주자(금융 부담 감소 등)와의 기존의 격차가 없어지는 효과 발생\n 영국 자본주의를 독일, 러시아의 자본주의가 따라 잡음\n3. 이자율 하락\ncf. 새로 시작하는 체제에서는 기회가 될 수 있는 환경\n\n<html> <span style="font-size: 10pt;"> <font color=RoyalBlue> <b> ◆ 러시아-우크라이나 전쟁의 원인은 세계화!? </b> </font> </span> </html>\n0. ''2022년 모습은 일상적인 모습이 아니라 큰 변화의 갈림길의 초입'' \n ≒ 과거로 돌아가기는 쉽지않은 환경\n\n\n<html><span style="background:#E2E2ff ; font-family:돋움; font-size: 14px;"> <b> #. 2022.05.02./ 강력한 러시아를 만들자는 푸티니즘, 과연 이건 이념이라 할 수 있을까? [지구본 특강반 1-2부] (손민석) </b> </span></html>\nhttps://www.youtube.com/watch?v=UYHx2_NHmyo\n\n<html> <span style="font-size: 10pt;"> <font color=RoyalBlue> <b> ◆ 푸티니즘(푸틴주의)이란? </b> </font> </span> </html>\n푸틴주의는 몇 가지 속성을 갖고 있다. (출처 ; 한양대학교 아태지역연구센터, 푸틴시기 러시아의 정치체제: '푸틴주의'의 특성을 중심으로)\n첫째, 푸틴주의는 푸틴 개인의 정치적 권위와 영향력에 크게 의존하는 권위주의의 통치체제를 바탕으로 하고 있다. \n둘째, 푸틴은 기본적으로 주기적 선거 등을 포함하는 절차적 민주주의의 틀을 유지해왔다. 그러나 그러한 절차적 민주주의는 종종 크렘린의 권력강화라는 목적에 의해 훼손되기도 했다. \n셋째, 푸틴주의는 시장경제의 뼈대를 유지하면서도 전반적으로 경제에 대한 국가의 영향력과 통제를 강화시키는 경향이 있다.\n넷째, 푸틴주의는 현상유지와 보수주의의 성격을 띤다. \n다섯째, 푸틴주의는 대외정책을 권력당국의 정당성 제고에 적극적으로 활용하는 경향을 나타낸다. \n여섯째, 푸틴의 러시아는 유라시아주의에 입각해 유라시아 통합을 향후 러시아 국가발전의 중심축으로 설정하고 있다.\n\n▷ 강한 러시아\n1. 국영 기업 ; 천연자원, 원자재 중심의 (70%) 국영기업 강화\n2. 이중적인 통치 구조 ; 실질적인 2개의 정부, 정부 내각 ≒ 크렌린궁 대통령실(의회의 통제를 벗어남)\n\n푸티니즘은 체계화된 철학적 이념이기 보다는 필요에 따라 정책적으로 만들어진 이념으로 \n @@color(#BE8C3C): 전통적인 러시아의, 국가주의적 정치문화 + (푸틴으로) 개인화 되서 표출 @@\n\n<html> <span style="font-size: 10pt;"> <font color=RoyalBlue> <b> ◆ 현 러시아는 민주주의인가 사회주의인가? </b> </font> </span> </html>\n0. 국유화를 통한 (독일) 국가사회주의 ⇒ 레닌이 러시아에 도입\n / 전통적인 사회주의는 국가의 소멸을 지향\n / 1920년대 레닌의 국가사회주의 ; 사회주의의 이행에 목적\n 중국 발전 모델을 해석을 위한 현재 국가사회주의 ; 사적인, 영미식의 자유 자본주의와의 효율성의 우위를 비교\n ⇒ 위의 2개의 국가사회주의는 지향하는 목적이 다름\n\n0. (푸틴의) 러시아 ; 사회주의 X, 국가 사회주의 X\n @@color(#ee1b24): 넓은 의미의 자본주의 + 민주주의 국가 + 러시아적인 역사적 특징이 반영 (러시아 짜르 식의 통치) @@\n\n0. 중국 특색 사회주의 ; 덩샤오핑 이론 \ncf. 푸티니즘과의 공통점은 사회에 대한 국가의 우위를 지속시키는 체제\n -1. 촌민위원회 ; 자치\n -2. 지방정부\n -3. 현능주의 ; 중앙 공산당 (시진핑 ; 공산당 내의 권력자)\n → 모택동 ; 당 위의 권력자\n\n<html> <span style="font-size: 10pt;"> <font color=RoyalBlue> <b> ◆ 대한민국이 나아가야 할 방향성 </b> </font> </span> </html>\n ; @@color(#BE8C3C): 다원적이고, 보편화되고, 개방화된 아시아의 미국이 되자. @@\n\n<html> <span style="font-size: 10pt;"> <font color=RoyalBlue> <b> ◆ 자본주의의 흐름 </b> </font> </span> </html>\n ; 좀더 나은 삶을 살고자하는 집단적 욕구와 노력이 진정으로 역사를 움직이는 힘\n ⇒ ''변화나 발전을 위한 집단적인 욕구가 충족되지 않는 경우, 현재의 상황이 반복되고 지속''\n\n\n
@@color(#04f): ▣ NDLCD @@; NDL Collision Data @ 2022-06-01 @
도금 ; 금속이나 비금속의 표면에 다른 금속이나 합금의 얇은층을 입히는 것. (네이버 국어사전)\n\n!! 도금의 목적\n1. 부식을 방지\n2. 표면의 마모르 방지\n3. 표면의 광택 증가\n4. 색과 광택을 개선하여 아름답게 보이려 함\n\n!! 아세사리에 쓰이는 도금의 종류\n!!! 로듐도금 (Rhodium)\n-. Original Rhodium\n-. Imitation Rhodium \n\n!!! 골드도금\n\n!!! 핑크골드도금\n\n!!! 흑니켈도금\n\n!!! 버니시도금\n\n!!! 은도금\n\n!!! 니켈도금\n\n!!! 파라듐도금\n
<html> <a name="Page230307"> </a> \n<meta name="robots" content="noindex, nofollow"/></html>\n<html>\n<a href="#Page230307_01"> #. 종가 매매 </a> <br>\n<a href="#Page230307_02"> #. 탐정매매 ; 2가지만 알면 수익납니다 </a> <br>\n<a href="#Page230307_03"> #. 내올 매매기법 ; 눌림목 매매 </a> <br>\n<a href="#Page230307_04"> #. 추세선 ; 선 3개... </a> <br>\n<a href="#Page230307_05"> #. 돌파매매 </a> <br>\n<a href="#Page230307_09"> #. 보조지표 </a> <br>\n</html>\n이박사의 차트연구소 ; 이데이일TV 머니키워드림, 차트매니저 이정혁 \n!!! 주식은 예측이 아니라 대응이다.\n!!! 손실은 적게, 수익은 길게...\n\n1. 거래량 ; 주가는 속여도 거래량은 못속인다!!\n2. 추세\n3. 세력(들의 계좌수)\n\n-. 재테크 3요소 ; 수익성, 유동성, 안정성 (√ 학습이 필요!)\n\n<html>\n<span style="background:#E2E2ff ; font-family:돋움; font-size: 16px;"> <b> ◆ 문제는 기준이다. </b> </span> </html>\n''@@color(#C89342): 이평선의 기준 @@'' ; 240 지평선이 하락에서 저점 지지로 전환\n / 20일, 60일선이 만나게 되면 상방이나 하방성을 나타낸다.\n / 20일선의 흐림을 보고 물타기\n / @@color(#ee1b24): 신규 매입의 경우, 주가가 20일선을 터치한 후에 대응 ! @@\n\n''@@color(#C89342): 거래량의 기준 @@'' ; 매집량 증가 (체결강도)\n\n''@@color(#C89342): 추세선의 기준 @@'' ; 6개월 ~ 36개월, 평균 12개월 (52주)\n / 상승 추세로 전환 ⇒ 추세선 위에서만 매매\n / 저점 관리 여부 ; 저점을 유지하면서 추세를 전환한다 ⇒ 세력의 흔적!\n\n''@@color(#C89342): 매집기간 기준 @@'' - 유통량\n\n▶ ''@@color(#C89342): 매집 @@''\n / 5일선이 고개를 들고 있을 때\n / 윗꼬리가 붙은 종목에 주목\n / 점상 유도 ; 세력의 자신 투입\n\ncf. ''@@color(#C89342): 재무재표 기준 @@''\n / 부체 비율 ; 200 미만 기준 \n / PER 값이 낮을수록 외국인 매수가 커질 확률이 높아짐 (해당 회사가 거둔 이익에 비해 주가가 낮다 ≒ 저평가)\n / 배당 수익률 ≒ 주주 친화적이다 cf. 10월 이전에 배당 관련주 점검\n\n\n<html> <a name="Page230307_01"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page230307"> <span style="font-size: 14px;"> <b> #. 종가 매매 </b> </span> </a>\n</div> </html>\n1. 양봉 매수 금지! @@color(#ee1b24): 무조건 음봉!!에서 매매 @@\n2. 장 마감후 집에서 검색\n3. 검색에서 거래량이 많은 종목을 관심 종목에 등록\n4. 다음날이나 그 다음날에 양봉으로 바뀐 후에 전날 종가에 매수\n / @@color(#3058D2): 양봉에서 매수했을 때, 상승가능성이 70% 이상 @@\n / 음봉에서 매수했을 때, 상승가능성이 20% 이하\n5. 상승 기대\n\n#. 하락장에서 거래량이 감소\n / 거래량이 증가하는 경우는 위험 신호\n 특히, 장태음봉에서 거래량이 실리는 경우 탈출 신호#. 하락장에서 거래량이 감소\n / 거래량이 증가하는 경우는 위험 신호\n 특히, 장태음봉에서 거래량이 실리는 경우 탈출 신호\n\n#. 돌파매매\n / 양봉이든, 음봉이든 거래량이 실리면 위험 신호로 판단, 재진입을 하더라도 일단은 매도\n / 전고점 돌파매매는 눌림이 발생할 수 있기 때문에 면밀한 검토가 필요\n\n\n<html> <a name="Page230307_02"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page230307"> <span style="font-size: 14px;"> <b> #. 탐정매매 ; 2가지만 알면 수익납니다 </b> </span> </a>\n</div> </html>\n1. 52주(1년) 신고가\n2. 거래량 검토 \n / 유통주식수가 20 ~ 30%가 거래되는 경우 (의미있는 거래로 세력의 흔적)\n / 전일 종가 기준 ; 고가와 저가의 폭이 ±30%를 넘는 경우\n3. 단기 매매 ; (5%, 7%, 10%)목표 수익에서 절반 이상 수익 실현후 장기 대비\n\n\n<html> <a name="Page230307_03"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page230307"> <span style="font-size: 14px;"> <b> #. 내올 매매기법 ; 눌림목 매매 </b> </span> </a>\n</div> </html>\n고점이 아닌, @@color(#3058D2): 저점에서 매수@@해야 수익을 크게 낼 수 있다!\n ( 3 또는 2 연상 후 단기 눌림을 찾아, 거래량을 보고 (단기) 매입 )\n\n1. 거래량 확인 = 돈의 흐름 <유통주식수 기준>\n / 거래량차트 ; 가격차트와 동일하게 표시\n / OBV 역할 ; @@color(#ee1b24): 13 이평 추가 - 저가, 적합으로 설정 @@\n cf. 22 이평 추가 - 저가, 적합으로 설정\n ◾ 5일선 - 연두색, 20일선 - 적, 60일선 - 녹, 120일선 - 청, 240일선 - 군청 \n / 가격 이동평균 ; 발생신호 - 주가돌파 시 / 이동평균(10) 기준\n 1-1. 기준봉이 없는 경우는 매수하지 않는다.\n 1-2. 주봉 ; 앞전 8개 주봉을 기준으로 변동 사항을 관찰\n 1-3. 월봉 ; @@color(#ee1b24): 월봉 3이평선 @@ ≒ 지지선 역할 (일봉, 주봉에서는 빠지고 있지만 월봉에서 싸고 있을 때)\n 1-4. 일봉 ; 20일선, 60일선 관심\n\n2. 매수 시점을 보조지표를 통해 확인\n''영역 1''\n 2-1-1. 가격차트 > LOG 차트 옵션 설정\n / %(상승/ 하락률)에 근거한 등락폭을 보여주는 로그 차트가 적절\n / 단기에 크게 오른 종목이 소폭 저정왔을 때 성급하게 진입하는 것을 방지할 수 있음\n 2-1-2. 가격 이동평균\n / 단타 ; 5일 이평이 고개를 들고 있는 추세에서, 시초가 전에 5일 선상에 대기 매수\n 2-1-3. 거래량 이동평균 ; 13일 단순 추가 (아래 그림에서 첫번째 영역, 점선)\n\n''영역 2''\n 2-2-1. 거래량 차트\n 2-2-1. OBV\n\n''영역 3''\n 2-3. 지표 ; RSI = 추세의 강도를 나타냄 (변동성지표)\n ◾ RSI(Relative Strength Index) ; Period 6, Signal 4 설정 (cf. RSI Signal은 표시하지 않는다.)\n ◾ 70% 초과 - 과매수 / 30% 미만 - 과매도\n\n''영역 4''\n 2-4. 지표 기준 변경 ; Stochastic ( Fast / Slow ) = 기간의 변동폭 (변동성지표)\n ◾ Fast K ; 3 / Fast D ; 2 로 설정 (cf. Fast D는 표시하지 않는다.)\n ◾ 80 이상 - 과열 / 20% 미만 - 침체\n\n※ RSI와 Stochastics Faset의 파란색 영역에서, 이평선에 화살표 등장시 홀딩 ; MACD 크로스 신호 = 장단기 골든크로스\n cf. 주가돌파 신호 ; 종가가 이동평균(10일선)을 상승 또는 하향 돌파\n\n''영역 5''\n 2-5-1. MACD (Moving Average Convergence & Divergence) Oscillator 추세분석 보조지표 설정\n ◾ 기본 설정값 ; MACD : 12일 지수이동평균 - 26일 지수이동평균 / 시그널 : MACD의 9일 지수이동평균 / 오실레이터 : MACD값 - 시그널값\n 미국 거래일 6일 기준\n ◾ 12-240-9 로 설정\n 2-5-2. CO(Chaikin Oscillator) ; 거래량 지표 - 고점 매도 기준 (DMI의 매수와 매도 신호의 보조 지표로 사용 )\n ◾ CO를 주봉으로 사용 ; 단기 이평 3주, 장기 이평 10주로 설정\n\n3. 대기매수 진행\n\n4. 수익 5% (20%), 7% (20%), 10% (20%) 매도후 "홀딩"\n<html>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/20230915_micobiomed.jpg" width=720> </html>\n\n\n<html> <a name="Page230307_04"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page230307"> <span style="font-size: 14px;"> <b> #. 추세선 ; 선 3개... </b> </span> </a>\n</div> </html>\n-. 추세선 ; 고점과 고점을 연결, 저점과 저점을 연결한 선 \n ; 상승, 하락, 변곡점 (∵ 변곡점을 찾는데 집중)\n\n1. 하락선 ; 상단의 꼭지점을 연결 (고점기준)\n / 강력한 저항대 ; 하락선 위에 있을 때, 매도 - 단기 매매 포지션에 유리\n2. 상승선 ; 저점과 저점을 연결 (저점기준)\n / 지지대 ; 상승선 아래 왔을 때, 매수 - 단기 이평선이 상승일 때 매매\n / 심리적 안정선 확인 ; 이평선 + 추세선을 활용\n3. 지지선 (수평선)\n / 거래량이 많은 곳, 매매를 한 지점\n\n※ 추세가 눈에 보인다면 변곡점만 찾아서 매수! (∵ 단기이평선이 상승일 때 매매)\n\n<html>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/20230324_추세선2.png" width=720> </html>\n▷ 상승선이 하락선을 올라 타는 경우\n ⇒ 강한 상승세 (≒ 큰 수익을 예상)\n\n-. 상승선 아래에서 매수 → 하락선 위에서 매도\n ⇒ 상승추세와 하락추세 사이의 매매는 수익률이 낮다.\n\n※ 상승선을 지지받고 있는 종목을 매입하는 경우, 수익이 날 경우가 많다.\n\n\n<html> <a name="Page230307_05"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page230307"> <span style="font-size: 14px;"> <b> #. 돌파매매 </b> </span> </a> </div> </html>\n!! 240선 돌파 (1년)\n<html>\n<IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/20230315_240선돌파.jpg" width=720> </html>\n1. 장전 동시호가 시간에 허매수 물량을 걸러 내는 방법\n2. 시초가에 가장 먼저 보고 있어야 하는 종목을 선별하는 방법\n3. 정확한 매수타점을 잡아서 수익내는 방법\n\n<html> <a name="Page230307_09"> </a>\n<div style="border: 1px solid #3058D2; padding: 10px;">\n<a href="#Page230307"> <span style="font-size: 14px;"> <b> #. 보조지표 </b> </span> </a>\n</div> </html>\n!! 캔들\n-. T자 캔들 ; 지인 태우기기 캔들\n ⇒ 주가가 상승시 거래량이 실리지 않는 아래꼬리 차트일 때, 매수 검토\n\n\n!! 이평선\n단기 매매 ; 5일선(1주일), 20일선(1개월)의 흐름\n장기 매매 ; 120일선(6개월), 240일선(1년), 480일선(2년)의 흐름\n ⇒ 단기 포지션의 경우 단기이평을, 장기 포지션의 경우 장기이평을 참고\n\n단기 매매, 장기 매매 첫 매수 타이밍은 단기 이평선이 고개를 숙이지 않은 상태에서 매수하는 것이\n심리적으로 우위에 설수 있는 방법!!\n\n\n!! 기준봉(중심봉)과 매집봉\n-. 기준봉 (중심봉) ; 주가의 흐름을 바꾸는 캔들 (큰 매수 물량을 동반한 캔들)\n / 기준봉의 시가를 이탈하면 흐름이 무너진다.\n / 거래량이 터진 장대 양봉, 거래량이 터진 몸통이 긴 양봉\n\n-. 매집봉 ; 세력들이 매집을 하기위해 띄우는 캔들\n / 개미들이 물량을 많이 가지고 있으면 주가가 무거워지니까!!\n ⇒ 전고점부분까지 주가를 끌어 올렸다가 바로 빼는 형식\n / 장대 음봉, 윗 꼬리가 긴 양봉\n\n!! CO (Chaikin Oscillator) ; 거래량 지표\n-. 고점 매도 기준 (DMI의 매수와 매도 신호의 보조 지표로 사용 )\n / CO를 주봉으로 사용 ; 단기 이평 3주, 장기 이평 10주로 설정\n / CO의 장점 ; 일정한 구간에서 매집 거래인지, 분산 거래가 이루어졌는지를 비교적 정확하게 보여준다.\n\n■ 주가 상승 중에 \n - 스토케스틱에서 강력한 매도 신호가 발생 ; 다이버전스 발생 (매도 신호는 불확실성을 내포)\n - CO에서는 계속해서 매수 중임을 보여주는 경우\n ⇒ 결론적으로 이 종목은 매도하지 않는다.\n\n■ 활용 방법\n1) 기준선\n ① CO값이 기준선(0)을 상향 돌파하면 매수\n ② CO값이 기준선(0)을 하향 돌파하면 매도\n\n2) 다이버전스 신호\n ① 고점 신호 - 주가는 점차 상승하고 있는데, CO는 점차 하락하면 하락 징후 다이버전스\n ② 저점 신호 - 주가는 점차 하락하고 있는데, CO는 점차 상승하면 상승 징후 다이버전스\n\n3) 0선 돌파신호; CO가 기준선인 0선 근처에 있을 때는 기존에 거래된 거래량 수준을 유지해야 기존 추세가 유지된다.\n ① 주가 > 이평선 일때 0선 상향돌파 - 강세장\n ② 주가 < 이평선 일때 0선 하향돌파 – 약세장\n\n!! PER (Price Earnings Ratio) ; 주가수익률\n-. 특정 종목의 시가총액을 당기순이익으로 나눠 계산, 즉 기업이 벌어들이는 돈의 몇 배만큼을 주식으로 투자받고 있는지 알 수 있다.\n\n-. PER가 낮다면 기업이 이익을 내는 수준에 비해 주가가 저평가돼 있다는 뜻\n / PER가 낮을수록 '가성비'가 좋다 ; 내가 주식으로 투자한 금액에 비해 기업이 이익을 잘 내고 있는 것이기 때문에 상대적으로 싸게 주식을 매수\n\n-. PER의 높고 낮음을 결정하는 절대적인 수치는 없다. 같은 산업군에 속한 여러 기업들의 PER와 비교\n\n-. PER가 낮은 게 무조건 좋은 것은 아니다. 투자 성향에 따라 PER가 높은 종목에 투자할 수도 있다. \n / 미래 시점에 성장할 것이라고 기대되는 기업은 현재에는 비교적 이익을 적게 낼 수밖에 없다.\n (넷플릭스는 빅테크 흐름을 견인하면서 2019년까지 PER 100배 이상을 기록)\n ⇒ 성장주의 경우, 앞으로 순이익이 더 늘어날 것으로 보이는 고PER 종목에 투자\n\n
블록체인(Blockchain)은 분산 컴퓨팅 기술 기반의 데이터 위변조 방지 기술이다.\n한국에서는 블록체인 기반 암호화폐의 줄임말로 암호화폐(Cryptocurrency)라고 많이 쓴다.\n\n블록체인 기술은 비즈니스 네트워크 내에서 정보를 투명하게 공유할 수 있도록 하는 고급 데이터베이스 메커니이다. 블록체인 데이터베이스는 연쇄적으로 연결된 블록에 데이터를 저장하고, 네트워크의 합의 없이 체인을 삭제하거나 수정할 수 없으므로 이 데이터는 시간 순서대로 일관성을 가진다. 그 결과 블록체인 기술을 사용하여 주문, 결제, 계정, 기타 트랜잭션을 추적하기 위해 불변하거나 변경 불가능한 원장을 생성할 수 있다. 무단 트랜잭션 항목을 방지하고 이러한 트랜잭션의 공유 보기에서 일관되게 생성하는 메커니즘을 제공하는 경우도 있다.\n\n잠재적으로 일어날 수 있는 법적 문제를 방지하기 위해 신뢰할 수 있는 제3자가 거래를 감독, 검증하는 경우, 이 중앙 기관의 존재가 거래를 복잡하게 할 뿐만 아니라 단일 취약점을 만든다. 중앙 데이터베이스가 손상되면 양쪽 모두가 피해를 입을 수 있다.\n\n블록체인은 거래를 기록하는 탈중앙화 변조 방지 시스템을 만들어 이러한 문제를 완화하는데, 블록체인은 구매자와 판매자 각각에 대해 하나의 원장을 생성한다. 모든 거래는 양 당사자의 승인을 받아야 하며 두 원장에서 실시간으로 자동 업데이트되고, 과거 거래에서 일어난 모든 손상은 전체 원장을 손상시킨다. 블록체인 기술의 이러한 속성은 Bitcoin과 같은 디지털 통화의 생성 등 다양한 분야에 사용된다.\n\n
https://anyconv.com/ko/ - 온라인 파일 변환기\nhttps://anyconv.com/ko/xls-to-dbf-byeonhwangi/ - XLS DBF 변환\n\ndBASE는 원래 데이터베이스 관리 시스템 중 하나였으며 dBASE 파일 형식(.dbf)은 오랫동안 사용되었다. \n엑셀 2007 이후 버전에서는 DBF 형식의 저장을 지원하지 않는다.\nMicrosoft Access를 사용해서 dBASE III, dBASE IV, dBASE 5 및 dBASE 7 dBASE 파일 형식으로 내보내기를 한다.\n\n1) 엑셀에서 DBF 파일로 저장하고자 하는 Sheet를 새 통합 문서에 복사본을 만들어서 저장한다.\n\n2) Microsoft Access은 Office 2007 설치하면 기본적으로 설치되는 프로그램\n '시작' > 프로그램 > Microsoft Office > Access 2007 실행.\n\n3) Access, 왼쪽 상단 동그란 단추로고 > 열기 > 엑셀파일 열기\n 파일형식을 '모든파일(*.*)로 바꿔서 *.xls 파일을 찾음\n\n4) 창이 뜨면서 첫번째행이 머리글(제목)이냐고 묻는 창에 데이터가 보인다.\n 다음 누르고 '연결테이블이름' 항목 대략 무시하고 '마침' 누른다.\n 파일연결했다는 메세지 뜨면 '확인' 누른다. (오른쪽 창에 아무런 표시가 되지 않는다.)\n 왼쪽에 보이는 엑셀파일을 더블클릭하면. 오른쪽에 데이터가 출력된다.\n\n5) 그 상태로 상단 메뉴, '외부 데이터' > 저장된 데이터 내보내기에서\n 옵션으로 '기타' > 기타 들어가시면 dBASE파일 클릭한다.\n 저장될 위치에 파일형식을 기본 dBASEIII으로 저장한다.\n\n\n
중화의침상보 ( 中華醫針樣譜 )\n\n9침 12자\n\n<html> <span style="font-size: 12pt;"> <font color=RoyalBlue> <b> 침의 종류 </b> </font> </span> </html>\n출처 ; https://blog.naver.com/mrf0070/110124424516\n<html> <IMG SRC="http://www.gingaminga.com/wiki/pds/GalleryMacro/20231126_침의_종류.jpg" width=480> </html>\n''1.참침(鑱鍼)''\n;길이 1.6촌, 모양은 활촉같이 생기고 끝은 예리 (외과용 수술도와 흡사), 전두침(箭頭鍼)\n陽分의 사기를 瀉한다. 피부를 淺刺하여 사혈 한 후, 頭部, 신체의 열증과 피부병을 치료한다.\n\n''2. 원침 (圓鍼)''\n;길이 1.6촌, 침체가 원주형으로 생기고 침끝은 란원형(卵圓刑)\n인체표면을 문질러 피부와 근육사이의 사기를 몰아내지만 피부와 근육은 손상주지 않는다.\n\n''3. 시침(鍉鍼)''\n;길이 3.5촌, 침끝이 기장썰처럼 둥글고 약간 뾰족\n경맥을 누르지만 深入해서는 안된다.(피부를 뚫고 들어가지 않을 정도로)\n혈맥의 질병을 치료하고, 기가 부족함을 보양해줄 때에는 너무 깊이 누르지 않는다.\n\n''4. 봉침(鋒鍼)''\n;길이 1.6촌, 침체는 원주형이며 침은 예리하고 세 개 면의 릉(三稜鍼)으로 되어있다.\n사혈하여 옹종 및 열병 치료하거나 낙맥(絡脈)을 사(瀉:뭉친 기운을 빼냄)하는 데 쓰였다.\n\n''5. 피침(鈹鍼)''\n;길이 4촌, 너비 2.5촌, 모양은 검처럼 생기고 예리 (외과용 수술도와 흡사), 검침(劍鍼)\n피부를 베어 옹농 등의 외증을 치료한다.\n후세에 劍鍼(검침) 이라 부르며 割刀(활도,메스)로 썼다.\n\n''6. 원리침(員利鍼)''\n;길이 1.6촌, 둥글고 예리하며 침끝은 크고 침체는 오히려 가늘다. (외과용)\n깊이 찌르는데 사용되며 옹종(癰腫)과 비증을 치료하고 음양을 조화시켜준다.\n외과용이고, 최근에는 형태가 바뀌어 小眉刀(소미도)로 만들어 사혈하는데 사용한다.\n\n''7. 호침(毫鍼)''\n;길이 3.6촌, 침은 머리카락처럼 가늘고 침끝은 모기나 등에 주등이처럼 가늘다.\n침을 찌른 뒤 류침하며 한비(寒痺)와 열비(熱痺)증으로 인한 통증을 치료하며 기와 정을 보양한다.\n9침 가운데 주체로서 응용범위가 가장 넓으며 오늘에 이르기까지 자침요법(刺鍼療法:침으로 찌르는 요법)의 주요 도구이다.\n\n''8. 장침(長鍼)''\n;길이 7촌, 침체가 길고 가늘며 예리, 환도침(環跳鍼)\n호침을 길게 한 것이며, 깊이 찌르는데 사용되어 사기가 깊은 부위에 있거나 혈에서 멀리 떨어져 있는 부위의 비증(痺證)을 치료하며 오래낫지 않는 체내의 질병을 치료한다.\n\n''9. 대침(大鍼)''\n;길이 4촌, 침끝이 뾰족하며 침체가 실하고 둥글다.\n수기(水氣)를 없애버리고 수종을 내리게 한다. (관절의 질병 치료) \n호침을 굵게 한 것이며, 가열 후에 화침(火鍼)으로 사용되어 라력(瘰瀝), 옹종(癰腫)을 치료한다.\n이를 황제내경에서는 쉬자(焠刺)라고 하였다.\n\n<html> <span style="font-size: 12pt;"> <font color=RoyalBlue> <b> 자구법(刺灸法) </b> </font> </span> </html>\n자법(刺法) ; 침찌르기\n구법(灸法) ; 뜸뜨기\n\n<html> <span style="font-size: 10pt;"> <font color=RoyalBlue> <b> 황제내경의 자침법 ; 12자 </b> </font> </span> </html>\n''십이자침''\n《灵枢·官针》记载:“凡刺有十二节,以应十二经。”\n"자침에는 십이절이 있어 십이경에 응한다"\n\n''1.우자법 偶刺''\n“偶刺者,以手直心苦背,直痛所,一刺前,一刺后,以治心痹。刺此者,傍针之也。”\n\n우자법은 신체의 앞,뒷면(가슴의 모혈과 등의 배수혈)에 자침하는 것으로 압통점에 자침하며 심비증心痹을 치료한다. 앞과 뒤는 음과 양으로도 표현되어 "음양자"“阴阳刺”라고도 칭한다. \n\n''2. 보자법 报刺''\n“报刺者,刺痛无常处也。上下行者,直内无拔针,以左手随病所按之,乃出针复刺之也。”\n\n이 방법은 유주성游走性 질병의 통증을 치료하는 것으로, 환자가 보고하는 곳에 따라 침을 놓는 것이다.수법을 시행한 후 환자에게 자침한 곳의 통증이 나아졌는지 물어보고 다른 통증부위에 침을 놓는다.보(報)는 '복(復)'으로 해석된다. 즉 침이 뺀 뒤 다시 찔린다는 뜻이기도 하다.\n\n''3. 회자법 恢刺''\n“恢刺者,直刺傍之,举之,前后恢筋急,以治筋痹也。”\n\n회자법은 근육의 구급비통(拘急痹痛) 부위 주위로 자침하는 것으로.먼저 傍刺에 자침, 득기후 환자에게 관절 기능을 활동하게 하여 끊임없이 침자 방향을 바꾸게 하여 경락의 기운을 소통시키고 근육의 긴장을 완화시킨다.회(恢)는 원래의 활동 기능을 회복한다는 의미가 있다.\n\n''4. 제자법 齐刺''\n“齐刺者,直入一,傍入二,以治寒气小深者。或曰三刺,三刺者,治痹气小深者也。”\n\n제자법은 정중앙에 먼저 침을 놓고, 양 옆에 2개의 침을 나란히 찌르는 것으로 그래서 제자(齊刺) 법이라 하며 이것은 회자법과 반대되는 것이다. \n회자는 한 혈자리에 여러침을 놓는 다향자법(多向刺)이다.\n제자법은 세 바늘의 집합이라 하여 세자법이라고도 불린다. 병변의 범위가 비교적 작고 부위가 깊은 비통을 치료하다.\n\n''5. 양자법 扬刺''\n“扬刺者,正内一,傍内(纳)四而浮之,以治寒气之博大者也。”\n是在穴位正中先刺一针,然后在上下左右各浅刺一针,刺的部位较为分散,故称为扬刺。本法适宜治疗寒气浅而面积较大的痹证。近代梅花针叩刺法,即为扬刺法的演变。\n\n양자법은 정중앙에 먼저 침을 찌른 후 상하좌우에 각각 한 바늘씩 얕게 찌르는 것으로 자침하는 부위가 분산되어 있기 때문에 양자(扬刺)라고 한다. 이 밥법은 한기가 얕고 면적이 비교적 넓은 비증(痹证)을 치료하는데 적합하다.근대의 매화침법이 바로 양자법의 변천이다.\n\n''6. 직자법 直针刺''\n“直针刺者,引皮乃刺之,以治寒气之浅也。”\n\n먼저 자침부위의 피부를 손으로 집은 후 침을 피하 아래로 찌른다. " 근대의 피부침이나 횡침이 이에 속한다. 이런 침법은 부위가 얕은 낙맥의 병을 치료한다.\n\n''7.수자법 输刺''\n“输刺者,直入直出,稀发针而深之,以治气盛而热者也。”\n\n수자법은 비교적 깊은 곳에 수직으로 찌르고 득기(得气)후에 천천히 침을 빼내는 방법으로 음에서 양을 끌어내어 열사병을 물리치는 방법으로, 기가 성하고 열이 나는 병을 치료한다.\n\n''8.단자법 短刺''\n“短刺者,刺骨痹稍摇而深之,致针骨所,以上下摩骨也。”\n\n단자법은 침을 천천히, 살짝 흔들며 깊게 찔러 뼈에 가까운 곳에서는 침을 위아래로 살짝 돌리는 방법이다.짧다는 것은 가까이 있다는 뜻이라 해서 단자법이라고 부른다.골비(骨痹) 등의 심부 통증을 치료하다.\n\n''9. 부자법 浮刺''\n“浮刺者,傍入而浮之,以治肌急而寒者也。”\n\n이것은 사침천자(斜针浅刺)법의 하나이므로, 부침이라는 이름이 붙었다.\n얕게 찌르고 깊게 자침하는 않는 방법으로 근육의 한기와 긴장된 것을 치료한다. 근대의 피내침법이 부자법에 속한다.\n\n부자법과 모자법(毛刺), 양자법(扬刺) 모두 얕게 찌르는 방법이지만 모자법은 적은 수의 침을 얕게 자침하고, 양자법은 많은 침을 사용하는 것이 부자법과 차이가 있다. \n\n''10. 음자법 阴刺''\n“阴刺者,左右率刺之,以治寒厥,中寒厥,足踝后少阴也。”\n\n음자법은 좌우 양측의 혈자리를 같이 사용하는 방법이다.\n\n''11. 방자법 傍针刺''\n“傍针刺者,直刺、傍刺各一,以治留痹久居者也。”\n\n밥자법은 압통이 비교적 뚜렷할 뿐만 아니라, 그 부위가 변하지 않고 오래되어도 낫지 않는 비증에 많이 응용된다.먼저 직침하고, 다시 근방에서 비스듬히 한 번 더 자침한다..정방(正傍) 배합이라 '방침자'이라고 부른다.\n\n\n''12 . 찬자법 赞刺''\n“赞刺者,直入直出,数发针而浅之出血,是谓治痈肿也。”\n\n찬자법은 직입직출, 얕게 찌르고 빠르게 침을 빼내는 것으로 얕은 데를 계속 흩어 피를 내는 자법으로 종기, 단독 등을 치료한다.찬(赞)은 소산(消散)하는 것을 돕는다는 의미이다.\n\n\n\n
▶ 2024.07.06.\nGalaxy Book2 NT550XEZ-A58AG - 2022.06. 39.62cm (15.6인치) / 1.8kg
++++[#. 거래처가 있고, 관리항목이 없는 매입만 있는 경우 ]\n| 구분 | 관리항목 코드 | 관리항목명 |\n| 내용 | 상청정_회계 | 회계 |\n1. 입고 ; 거래처가 있고, 관리항목이 없고, 재고만 남은 경우 (기존)\n1.1. 거리처 ; 주식회사 오케이푸트물류 (기존)\n1.1. 관리항목 ; 회계 (추가)\n\n2. 출고 ; 재고 정리 (추가)\n2.1. 거래처 ; ''전표'' (추가)\n2.2. 관리항목 ; 회계 (추가)\n===\n\n++++[#. 입고 없고, 출고만 있는 경우 ]\n1. 입고 품목 (10kg, 폐기)과 출고 품목 (kg, 반송)이 다른 경우\n1.1. 출고 품목만 - 값으로 쌓임\n\n2. 입고 추가 ; 거래처 (''조정 더미'')\n2.1. 관리항목 ; 출고 품목에 적힌 관리항목으로 기록\n===
출처 ; https://blog.naver.com/henuri21/222823011198 - 고시레의 유래<옛이야기 고쳐 쓰기4>\n\n옛날, 그러니까 이 이야기는 신라 말기 때쯤 있었던 일이야. @@color(#8A084B): ''도선''이라는 풍수쟁이가 하나 살았대.@@ 이 도선은 오래전에 돌아가신 자기 어머니 유골을 명당에 모시고 자기도 한번 잘 살아보겠다는 욕심이 있었어.\n\n어머니를 위해서가 아니라 오직 자기한테 좋은 자리를 찾아 어머니의 유골을 보따리에 싸서 짊어지고 전국으로 명당을 찾아다녔지.\n\n여기저기 돌아다니다가 어느 날은 아주 큰 기와집 앞을 지나는데 그 집에서 하룻밤 쉬어가고 싶은 생각이 들었어.\n\n그래서 찾아들어가 하룻밤 재워달라고 부탁을 했지. 그러자 주인이 선뜻 그러라고 하네. 옛날에는 지나가는 사람이 하룻밤 제워 달라고 하면 거절하지 않는 그런 인정이 있었지. 그래서 그 집 사랑방에 묵게 되었는데,\n\n도선이 방에 앉아 가만히 보니 바로 그 집 마루 밑이 명당이네. 그곳에 어머니를 묻으면 사흘 안으로 돈 천 냥이 생긴다는 괘가 나오는 거야. 천 냥이면 그 시절에는 어마어마한 돈이지. 벼락부자가 될 수 있는 돈이란 말이야.\n\n그래서 도선은 한밤중에 그 집 마루 밑에 어머니 뼈를 묻기로 작정했어. 근데 일이 잘 안되려고 그랬던지 주인이 안방에서 안 자고 손님과 같이 사랑방에서 자겠다네.\n\n그러니 손님으로 나서야 할 말 있나. 둘이서 자게 됐지. 그래도 도선은 이 막중한 일을 안 헐 수는 없었지. 한밤중에 살그머니 일어나 어머니의 유골을 들고 방을 나왔어. 그리고 호미를 하나 찾아들고 마루 밑으로 기어들어가 호미로 대강 파고 유골을 거기 묻었지. 그러고는 나오면서 "히히 됐다. 이제 사흘 뒤면 돈 천 냥이 생기겠지." 했네. \n\n주인은 주인대로 자는 척하고 이 사람의 행동을 보고 있다가 그 말을 들었어.\n\n날이 새고 손님이 떠나자마자 집 주인은 얼른 마루 밑으로 들어가 파 보니 백골이 나오네. 그래서 그 백골을 파 들고 뒷산에 있는 자기 어머니 묘로 가서 어머니 유골을 파내고 그 자리에 마루 밑에서 파온 유골을 대강 묻고 자기 어머니의 유골은 가져다 마루 밑 그 자리에 묻었지. 한편 도선은 사흘이 돼도 돈이 안 생기자 점을 쳐봤어. 그랬더니 어머니 유골이 엉뚱한 데 가 있는 거야. 그래서 도선은 다시 그 집을 찾아갔지. 찾아온 도선을 보자 집주인은 겁을 먹고 사실을 고백했어. "당신이 하는 말을 듣고 돈 천 냥이 생긴다는 소리에 눈이 뒤집혀 몹쓸 짓을 하고 말았습니다. 그랬더니 글쎄 사흘 뒤에 정말 돈 천 냥이 생기지 않았겠소."\n\n그러자 도선이 "잘 했소. 그 돈 천 냥은 내 복이 아니니 어쩔 수 없는 일이오." 하며 제 어머니 유골을 어디에 묻었느냐고 물어 그 유골을 파서 싸 들고 다시 길을 떠났지. 그리고 전라도 김제 평야를 찾아갔어. 끝도 없이 드넓은 그 김제 평야를 보며 여기에 우리 어머니를 묻으면 제삿밥은 실컷 배부르게 얻어 잡수겠지 하며 그 평야 한쪽에 어머니 유골을 묻었어. \n\n그리고 소문을 냈지. 이 산소에다 제물을 차려놓고 제사를 지내는 사람은 농사가 대풍년이 들 거라고. 그 소문은 퍼지고 퍼져서 사람들이 도선 어머니 묘에 찾아와 제사를 드렸는데 정말 제사를 드린 사람 농사는 그렇게 다 잘 됐다네. 그러니 도선 어머니는 살았을 때 곯았던 배를 죽어서 오랜 세월 제삿밥을 배 터지게 얻어먹은 거지. 그 도선이 어머니 성이 고씨였다네. 그런데 그곳에서 멀리 사는 사람들은 찾아가지 못할 거 아냐? \n\n그래서 자기들이 일하다 밥을 먹을 때마다 밥하고 반찬을 도선이 어머니 묘가 있는 쪽으로 던지며 "고씨네 흠감하시유" 했는데 그말이 오랜 세월 지내오며 "고시레"로 변했다고 하네. 그래서 지금도 농부들은 들에서 밥을 먹을 때마다 고시레를 한다고 합니다.\n\n\n