<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://pimg.daum-img.net/whsnake/css/atom.css?ver=1.0" type="text/css"?>
<feed xmlns="http://www.w3.org/2005/Atom" version="1.0" >
  <title>It's Chronicles</title>
  <link rel="alternate" type="text/html" href="http://blog.daum.net/justinsays"/>
  <link rel="self" type="application/atom+xml" href="http://blog.daum.net/xml/atom/justinsays"/>
  <rights>쟈스틴</rights>
  <author>
    <name>쟈스틴</name>
    <uri>http://blog.daum.net/justinsays</uri>
  </author>
  <generator uri="http://blog.daum.net" version="1.0">Daum blog (blogmaster@daum.net)</generator>
  <id>tag:blog.daum.net,2009:justinsays</id>
  <updated>2009-05-14T14:25:30Z</updated>

  		<entry>
	    <title>MOVED</title>
		<link rel="alternate" type="text/html" href="http://blog.daum.net/justinsays/8312633"/>
		<id>tag:blog.daum.net,2009:justinsays.8312633</id>
	    <author>
		    <name>쟈스틴</name>
	    </author>
	    <updated>2009-05-14T14:25:30Z</updated>
	    <published>2009-05-14T14:25:30Z</published>
	    <content type="html">
	    	&lt;p style=&quot;font-size: 24pt; font-family: Verdana, Sans-serif; text-align: center;&quot;&gt;&lt;a href=&quot;http://justinchronicles.net&quot; target=&quot;_blank&quot; title=&quot;[http://justinchronicles.net]로 이동합니다.&quot; style=&quot;font-size: 24pt; font-family: Verdana, Sans-serif; color: blue;&quot;&gt;http://justinchronicles.net&lt;/a&gt;&lt;/p&gt;&lt;br&gt;&lt;br&gt;tag : &lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=블로그이사&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;블로그이사&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=텍스트큐브&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;텍스트큐브&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=Migration&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;Migration&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=TextCube&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;TextCube&lt;/a&gt;
	    </content>
	    	</entry>
    	<entry>
	    <title>클라스 라이브러리에서 .resx 파일 참조하기</title>
		<link rel="alternate" type="text/html" href="http://blog.daum.net/justinsays/8312627"/>
		<id>tag:blog.daum.net,2009:justinsays.8312627</id>
	    <author>
		    <name>쟈스틴</name>
	    </author>
	    <updated>2009-04-05T20:52:09Z</updated>
	    <published>2009-04-05T20:52:09Z</published>
	    <content type="html">
	    	&lt;dl&gt;
	&lt;dt style=&quot;font-size: 12pt; font-family: Segoe UI, Malgun Gothic, Arial, Dotum, Sans-serif;&quot;&gt;참고: &lt;/dt&gt;
	&lt;dd style=&quot;font-size: 12pt; font-family: Segoe UI, Malgun Gothic, Arial, Dotum, Sans-serif;&quot;&gt;&lt;a href=&quot;http://weblogs.asp.net/rinze/archive/2008/12/03/using-globalization-resources-resx-in-a-class-library-or-custom-control.aspx&quot; target=&quot;_blank&quot; style=&quot;font-size: 12pt; font-family: Segoe UI, Malgun Gothic, Arial, Dotum, Sans-serif; color: blue;&quot;&gt;Using globalization resources (.resx) in a class library or custom control &lt;/a&gt;&lt;/dd&gt;
	&lt;dd style=&quot;font-size: 12pt; font-family: Segoe UI, Malgun Gothic, Arial, Dotum, Sans-serif;&quot;&gt;&lt;a href=&quot;http://blog.mediawhole.com/2007/05/localizing-web-parts-custom-controls.html&quot; target=&quot;_blank&quot; style=&quot;font-size: 12pt; font-family: Segoe UI, Malgun Gothic, Arial, Dotum, Sans-serif; color: blue;&quot;&gt;Localizing Web Parts, Custom Controls, and Class Libraries&lt;/a&gt;&lt;/dd&gt;
&lt;/dl&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 10px; font-size: 12pt; font-family: Segoe UI, Malgun Gothic, Arial, Dotum, Sans-serif;&quot;&gt;ASP.NET 웹사이트 프로젝트에서는 .resx 파일에 손쉽게 접근할 수 있다. 일단 모든 .resx 파일들은 App_LocalResources 또는 App_GlobalResources 폴더 안에 저장시켜야만 하는 것도 있고, 이렇게 저장된 .resx 파일 하나하나는 System.Resources 네임스페이스의 하위클라스로서 인식되기 때문이다. 그러나 이것이 Class Library 프로젝트에서는 System.Resources 네임스페이스 아래에 존재하지 않기 때문에, 또한 .resx 파일을 직접 읽어들일 수가 없기 때문에 다른 방법을 통해야만 한다.&lt;/p&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 10px; font-size: 12pt; font-family: Segoe UI, Malgun Gothic, Arial, Dotum, Sans-serif;&quot;&gt;첫번째는 resgen.exe 파일을 이용하여 수동으로 .resx 파일을 .resource 파일로 변환시키는 방법이다. 그러나, 이것은 클라스 라이브러리 프로젝트를 컴파일하기 이전에 미리 변환을 시켜놓아야 해서 여러가지로 번거롭다. 두번째는 컴파일시에 자동으로 변환을 시킬 수 있게끔 코드를 작성하는 방법이다.&lt;/p&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 10px; font-size: 12pt; font-family: Segoe UI, Malgun Gothic, Arial, Dotum, Sans-serif; text-align: center;&quot;&gt;&lt;img src=&quot;http://cfile215.uf.daum.net/image/1853BD1449D89AF6377618&quot; class=&quot;tx-daum-image&quot; actualwidth=&quot;227&quot; style=&quot;clear: none; float: none;&quot; border=&quot;0&quot; vspace=&quot;1&quot; width=&quot;227&quot; hspace=&quot;1&quot; /&gt;&lt;/p&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 10px; font-size: 12pt; font-family: Segoe UI, Malgun Gothic, Arial, Dotum, Sans-serif;&quot;&gt;위 그림을 보도록 하쟈. 클라스 라이브러리에 위와 같이 .resx 파일을 하나 만들어 둔다. 그리고 해당 파일을 클릭하면 속성 창에서 몇가지 조정을 하면 된다. 먼저 Build Action - Embedded Resource, Copy to Output Directory - Do not copy, Custom Tool - ResXFileCodeGenerator, 그리고 마지막으로 Custom Tool Namespace 항목에서 현재 클라스 라이브러리의 네임스페이스를 적어주면 된다 (여기서는 AlienCube.Extensions.Resources 라는 네임스페이스를 줬다).&lt;/p&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 10px; font-size: 12pt; font-family: Segoe UI, Malgun Gothic, Arial, Dotum, Sans-serif;&quot;&gt;이렇게 해놓은 뒤에 소스코드상에서는 AlienCube.Extensions.Resources.PhpBB 로 접근하면 해당 리소스 파일의 데이타를 가져올 수 있다.&lt;/p&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 10px; font-size: 12pt; font-family: Segoe UI, Malgun Gothic, Arial, Dotum, Sans-serif;&quot;&gt;이렇게 리소스 파일을 따로 지정하는 이유는 여러가지가 있겠지만, 다국어버전을 지원할 경우 메시지가 영어 뿐만 아니라 한국어 등 다른 언어로 보일 수 있어야 하기 때문이다. 물론 영어 또는 한국어 하나만 지원하겠다 하면 그다지 필요는 없겠지만 향후의 확장성을 고려한다면 역시나 이부분은 별도의 리소스 파일로 만들어 두는 것이 훨씬 더 편리할 수 있다.&lt;/p&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 10px; font-size: 12pt; font-family: Segoe UI, Malgun Gothic, Arial, Dotum, Sans-serif;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;br&gt;&lt;br&gt;tag : &lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=.resx&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;.resx&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=.resources&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;.resources&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=클라스라이브러리&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;클라스라이브러리&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=Class Library&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;Class Library&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=App_GlobalResources&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;App_GlobalResources&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=App_LocalResources&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;App_LocalResources&lt;/a&gt;
	    </content>
	    	</entry>
    	<entry>
	    <title>PHP 5.x 에서 나타나는 __get() 메쏘드의 버그</title>
		<link rel="alternate" type="text/html" href="http://blog.daum.net/justinsays/8312625"/>
		<id>tag:blog.daum.net,2009:justinsays.8312625</id>
	    <author>
		    <name>쟈스틴</name>
	    </author>
	    <updated>2009-03-24T10:22:58Z</updated>
	    <published>2009-03-24T10:22:58Z</published>
	    <content type="html">
	    	&lt;p style=&quot;margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; &quot;&gt;&lt;font class=&quot;Apple-style-span&quot; face=&quot;'Segoe UI'&quot; size=&quot;4&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: 16px; line-height: 25px;&quot;&gt;&lt;a href=&quot;http://justinchronicles.net/13&quot; target=&quot;_blank&quot; title=&quot;[http://justinchronicles.net/13]로 이동합니다.&quot;&gt;http://justinchronicles.net/13&lt;/a&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;

&lt;br&gt;&lt;br&gt;tag : &lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=Property&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;Property&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=Object Oriented&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;Object Oriented&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=__get()&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;__get()&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=Magic Method&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;Magic Method&lt;/a&gt;
	    </content>
	    	</entry>
    	<entry>
	    <title>닷넷과 PHP를 한번에 개발한다 - VS.PHP for Visual Studio</title>
		<link rel="alternate" type="text/html" href="http://blog.daum.net/justinsays/8312622"/>
		<id>tag:blog.daum.net,2009:justinsays.8312622</id>
	    <author>
		    <name>쟈스틴</name>
	    </author>
	    <updated>2009-03-05T13:57:19Z</updated>
	    <published>2009-03-05T13:57:19Z</published>
	    <content type="html">
	    	&lt;dl&gt;
	&lt;dt style=&quot;font-size: 12pt; font-family: Segoe UI, Malgun Gothic, Arial, Dotum, Sans-serif;&quot;&gt;&lt;a href=&quot;http://justinchronicles.net/30&quot; target=&quot;_blank&quot; title=&quot;[http://justinchronicles.net/30]로 이동합니다.&quot;&gt;http://justinchronicles.net/30&lt;/a&gt;&lt;/dt&gt;&lt;/dl&gt;
&lt;br&gt;&lt;br&gt;tag : &lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=PHP&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;PHP&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=이클립스&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;이클립스&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=Eclipse&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;Eclipse&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=.NET&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;.NET&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=PDT&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;PDT&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=IDE&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;IDE&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=PhpEd&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;PhpEd&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=비주얼스튜디오&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;비주얼스튜디오&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=Visual Studio&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;Visual Studio&lt;/a&gt;
	    </content>
	    	</entry>
    	<entry>
	    <title>닷넷의 마스터 페이지를 PHP에서 흉내내보쟈</title>
		<link rel="alternate" type="text/html" href="http://blog.daum.net/justinsays/8312616"/>
		<id>tag:blog.daum.net,2009:justinsays.8312616</id>
	    <author>
		    <name>쟈스틴</name>
	    </author>
	    <updated>2009-02-09T08:37:12Z</updated>
	    <published>2009-02-09T08:37:12Z</published>
	    <content type="html">
	    	&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt; font-family: Segoe UI, Malgun Gothic, Arial, Dotum, Sans-serif;&quot;&gt;참고: &lt;a href=&quot;http://spinningtheweb.blogspot.com/2006/07/approximating-master-pages-in-php.html&quot; target=&quot;_blank&quot; style=&quot;font-size: 12pt; font-family: Segoe UI, Malgun Gothic, Arial, Dotum, Sans-serif; color: blue;&quot;&gt;Approximating Master Pages in PHP&lt;/a&gt;&lt;/p&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt; font-family: Segoe UI, Malgun Gothic, Arial, Dotum, Sans-serif;&quot;&gt;일반적으로 웹사이트를 개발하는 경우 거의 대부분의 내용이 웹사이트의 어느 한 부분만 바뀔 뿐, 나머지 헤더라든가, 네비게이션, 푸터들은 거의 변하지 않는다. 이런 경우, 매 페이지마다 헤더, 네비게이션, 푸터들을 일일이 임포트하는 것은 정말 번거로운 일이 아닐 수 없다. 페이지 수가 몇개 되지 않는다면 상관없을 수도 있지만, 만약 수백개, 수천개의 페이지가 있을 경우 모든 페이지에 일일이 다 인클루딩을 해주기는 현실적으로 시간낭비이기 때문이다.&lt;/p&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt; font-family: Segoe UI, Malgun Gothic, Arial, Dotum, Sans-serif;&quot;&gt;이런 관점에서 개발자의 손을 덜어주는 기능이 바로 닷넷의 마스터 템플릿이다. 확장자가 .master 로 끝나는 파일이 바로 그것인데, 일반적인 .aspx 페이지의 기능확장이라고 생각하면 되겠다. 이와 비슷한 기능을 구현해 주는 것이 드림위버에서도 있긴 하다만, 프로그래밍적으로 PHP에서 구현하려면 어떻게 해야 할까? 이것을 가능하게 해주는 것이 바로 &lt;a href=&quot;http://au2.php.net/manual/en/book.outcontrol.php&quot; target=&quot;_blank&quot; style=&quot;font-size: 12pt; font-family: Segoe UI, Malgun Gothic, Arial, Dotum, Sans-serif; color: blue;&quot;&gt;Output Buffering Control&lt;/a&gt; 이다. 아래 코드를 살짝 보쟈.&lt;/p&gt;

&lt;pre style=&quot;margin: 10px; padding: 10px; font-size: 10pt; font-family: Consolas, Courier New, Dotumche, Sans-serif; background-color: #e3e3e3; border: 1px solid #000000&quot;&gt;
&lt;span style=&quot;font-size: 10pt; font-family: Consolas, Courier New, Dotumche, Sans-serif; color: red;&quot;&gt;master.php&lt;/span&gt;
	[html]
		[header]
			[title]Title is here[/title]
		[/header]
		[body]
			[div]
				This is the HEADER
			[/div]

			[div]
				This is the SIDE-NAVIGATION
			[/div]

			[?php &lt;span style=&quot;font-size: 10pt; font-family: Consolas, Courier New, Dotumche, Sans-serif; color: blue; font-weight: bold;&quot;&gt;echo $conetnePlaceHolder;&lt;/span&gt; ?]

			[div]
				This is the FOOTER
			[/div]
		[/body]
	[/html]
&lt;/pre&gt;

&lt;pre style=&quot;margin: 10px; padding: 10px; font-size: 10pt; font-family: Consolas, Courier New, Dotumche, Sans-serif; background-color: #e3e3e3; border: 1px solid #000000&quot;&gt;
&lt;span style=&quot;font-size: 10pt; font-family: Consolas, Courier New, Dotumche, Sans-serif; color: red;&quot;&gt;content.php&lt;/span&gt;
	[?php
		&lt;span style=&quot;font-size: 10pt; font-family: Consolas, Courier New, Dotumche, Sans-serif; color: blue; font-weight: bold;&quot;&gt;ob_start();&lt;/span&gt;
	?]

	[div]
		Hello World!
	[/div]

	[?php
		&lt;span style=&quot;font-size: 10pt; font-family: Consolas, Courier New, Dotumche, Sans-serif; color: blue; font-weight: bold;&quot;&gt;$contentPlaceHolder = ob_get_contents();
		ob_end_clean();

		include &quot;master.php&quot;;&lt;/span&gt;
	?]
&lt;/pre&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt; font-family: Segoe UI, Malgun Gothic, Arial, Dotum, Sans-serif;&quot;&gt;위와 같이 ob_start(), ob_get_contents(), ob_end_clean() 함수를 content.php 에서 사용한다면 닷넷의 마스터 템플릿과 유사한 효과를 나타낼 수 있다. 이 ob_start() 함수는 겹쳐서도 쓸 수 있다고 하니, 중첩 마스터 템플릿을 쓰는 경우에도 비슷하게 적용시킬 수 있겠네.&lt;/p&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt; font-family: Segoe UI, Malgun Gothic, Arial, Dotum, Sans-serif;&quot;&gt;참고로 &lt;a href=&quot;http://www.smarty.net&quot; target=&quot;_blank&quot; style=&quot;font-size: 12pt; font-family: Segoe UI, Malgun Gothic, Arial, Dotum, Sans-serif; color: blue;&quot;&gt;스마티 Smarty&lt;/a&gt;라고 불리는 템플릿 엔진이 있다. 이걸 서버에 설치하면 정말 편하게 이런 템플릿들을 관리할 수 있다고 하는데, 문제는 별도로 설치해야 한다는 것. 이것을 위해서 별도의 문법을 공부해야 한다는 것이다. 물론, 개발자라면 이런 것들을 공부하는 데 있어서 두려움이나 귀찮음을 느끼면 안되겠지만, 현실적으로 별도의 엔진을 서버에 설치하는 데에는 이런저런 제약이 있을 수 있으므로, 스마티 엔진이 없어도 구현할 수 있으면 좋겠지?&lt;/p&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt; font-family: Segoe UI, Malgun Gothic, Arial, Dotum, Sans-serif;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;br&gt;&lt;br&gt;tag : &lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=마스터 페이지 템플릿&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;마스터 페이지 템플릿&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=Master Page Template&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;Master Page Template&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=.master&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;.master&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=Output Buffering Control&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;Output Buffering Control&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=ob_start()&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;ob_start()&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=스마티&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;스마티&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=Smarty&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;Smarty&lt;/a&gt;
	    </content>
	    	</entry>
    	<entry>
	    <title>IE에서 자바스크립트 없이 엔터키 이벤트 핸들링하기</title>
		<link rel="alternate" type="text/html" href="http://blog.daum.net/justinsays/8312614"/>
		<id>tag:blog.daum.net,2009:justinsays.8312614</id>
	    <author>
		    <name>쟈스틴</name>
	    </author>
	    <updated>2009-01-27T11:54:05Z</updated>
	    <published>2009-01-27T11:54:05Z</published>
	    <content type="html">
	    	&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt; font-family: Segoe UI, Malgun Gothic, Arial, Dotum, Sans-serif;&quot;&gt;닷넷으로 웹사이트를 개발하다 만나는 에러들 중 많은 부분은 IE 자체가 가진 에러에서 비롯하는 경우가 많다. 텍스트박스에 데이타를 입력하고 난 뒤 일반적으로 마우스를 클릭하는 경우도 있지만, 그냥 엔터키를 치는 경우도 많은데 그때 IE는 그 엔터키를 서브밋 버튼과 연결시켜 인식하지 못할 때가 있다. 이 때 이 엔터키의 역할은 마우스로 서브밋 버튼을 클릭했을 때와 동일한 것이므로, 마우스 클릭 이벤트 핸들러로 연결해주면 되는데... 그 꼼수는 아래와 같다.&lt;/p&gt;

&lt;pre style=&quot;margin: 10px; padding: 10px; font-size: 10pt; font-family: Consolas, Courier New, Dotumche, Sans-serif; border: 1px solid #000000; background-color: #e3e3e3;&quot;&gt;
If (&lt;span style=&quot;font-size: 10pt; font-family: Consolas, Courier New, Dotumche, Sans-serif; color: red;&quot;&gt;Request.Browser.Browser = &quot;IE&quot;&lt;/span&gt;) Then
  Me.Button_Click(Me.Button, CType(args, System.EventArgs))
End If
&lt;/pre&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt; font-family: Segoe UI, Malgun Gothic, Arial, Dotum, Sans-serif;&quot;&gt;위와 같이 브라우저가 IE일 때 강제로 마우스 버튼 클릭 이벤트를 발생시켜 주면 된다. 요 라인을 Page_Load 이벤트 또는 Validator_ServerValidate 이벤트에 넣어주면 된다.&lt;/p&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt; font-family: Segoe UI, Malgun Gothic, Arial, Dotum, Sans-serif;&quot;&gt;물론 자바스크립트로도 해결할 수 있지만, 엔터키 이벤트는 자바스크립트 여부와 상관없이 작동하게 해야 하므로 자바스크립트의 event.which 또는 event.keyCode 객체를 받아와서 쓰는 것은 그닥 권장하지 않는다. ^^&lt;/p&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt; font-family: Segoe UI, Malgun Gothic, Arial, Dotum, Sans-serif;&quot;&gt;그나저나, 닷넷은 나를 아쥬 IE가 얼마나 허접(?)한 브라우저인지를 끊임없이 일깨워 주는구나~ 에헤라~&lt;/p&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt; font-family: Segoe UI, Malgun Gothic, Arial, Dotum, Sans-serif;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;br&gt;&lt;br&gt;tag : &lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=Enter Key Event&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;Enter Key Event&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=엔터키&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;엔터키&lt;/a&gt;
	    </content>
	    	</entry>
    	<entry>
	    <title>WindowsXP SP3 에 MS-SQL Server 2005 설치할 때 생기는 MSXML6 관련 에러</title>
		<link rel="alternate" type="text/html" href="http://blog.daum.net/justinsays/8312610"/>
		<id>tag:blog.daum.net,2009:justinsays.8312610</id>
	    <author>
		    <name>쟈스틴</name>
	    </author>
	    <updated>2009-01-07T19:59:34Z</updated>
	    <published>2009-01-07T19:59:34Z</published>
	    <content type="html">
	    	&lt;dl&gt;
	&lt;dt style=&quot;&quot;&gt;&lt;font class=&quot;Apple-style-span&quot; face=&quot;'Segoe UI'&quot; size=&quot;4&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: 16px; line-height: 25px;&quot;&gt;&lt;a href=&quot;http://justinchronicles.net/11&quot; target=&quot;_blank&quot; title=&quot;[http://justinchronicles.net/11]로 이동합니다.&quot;&gt;http://justinchronicles.net/11&lt;/a&gt;&lt;/span&gt;&lt;/font&gt;&lt;/dt&gt;&lt;/dl&gt;

&lt;br&gt;&lt;br&gt;tag : &lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=MSXML6&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;MSXML6&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=MS-SQL Server 2005&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;MS-SQL Server 2005&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=MS-SQL Server 2005 Developer Edition&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;MS-SQL Server 2005 Developer Edition&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=MS-SQL Server 2005 Express Edition&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;MS-SQL Server 2005 Express Edition&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=System File Protection&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;System File Protection&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=WindowsXP SP3&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;WindowsXP SP3&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=WindowsXP Service Pack 3&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;WindowsXP Service Pack 3&lt;/a&gt;
	    </content>
	    	</entry>
    	<entry>
	    <title>웹표준에 맞는 로그인 콘트롤 렌더링 꼼수(?)</title>
		<link rel="alternate" type="text/html" href="http://blog.daum.net/justinsays/8312604"/>
		<id>tag:blog.daum.net,2009:justinsays.8312604</id>
	    <author>
		    <name>쟈스틴</name>
	    </author>
	    <updated>2008-12-14T19:19:33Z</updated>
	    <published>2008-12-14T19:19:33Z</published>
	    <content type="html">
	    	&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt; font-family: Segoe UI, Malgun Gothic, Dotum, Sans-serif;&quot;&gt;참고: &lt;a href=&quot;http://msdn.microsoft.com/en-au/library/system.web.ui.webcontrols.login.layouttemplate(VS.80).aspx&quot; taget=&quot;_blank&quot; style=&quot;font-size: 12pt; font-family: Segoe UI, Malgun Gothic, Dotum, Sans-serif; color: blue;&quot;&gt;Login.LayoutTemplate Property&lt;/a&gt;&lt;/p&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt; font-family: Segoe UI, Malgun Gothic, Dotum, Sans-serif;&quot;&gt;웹사이트를 만들 때 거의 필수적으로 들어가는 로그인/로그아웃 페이지. 이거 만드는게 로직은 쉽지만 기타 이것저것 생각할게 많은 부분중 하나다. 여기서는 기본적으로 닷넷에서 제공하는 로그인 콘트롤을 활용하는 방법을 알아보쟈. 로그인 콘트롤이 제공하는 기본 템플릿이 있긴 하다만, 이게 죄다 테이블로만 구현해 놓아서 웹표준하고는 동떨어져 있다. 따라서, 이부분을 해결하려면 Login.LayoutTemplate 속성을 이용해서 직접 콘트롤들을 집어넣는 수밖에 없다. 물론, 이 와중에 필수요소들은 집어넣어야 하겠지만... 우얏든둥, Login.LayoutTemplate 속성을 사용하면 많은 부분 해결이 가능하다. 아래 코드를 살짜쿵 보쟈.&lt;/p&gt;

&lt;pre style=&quot;margin: 10px; padding: 10px; font-size: 10pt; font-family: Consolas, Courier New, Dotumche, Sans-serif; background-color: #e3e3e3; border: 1px solid #000000;&quot;&gt;
[asp:Login ID=&quot;login&quot; runat=&quot;server&quot;]
  [LayoutTemplate]
    &lt;span style=&quot;font-size: 10pt; color: green&quot;&gt;[%-- Validation summary --%]&lt;/span&gt;
    [asp:ValidationSummary ID=&quot;validationSummary&quot; runat=&quot;server&quot;
      ShowSummary=&quot;true&quot;
      HeaderText=&quot;Error(s) on:&quot;
      ValidationGroup=&quot;login&quot;
      DisplayMode=&quot;bulletList&quot;
      ForeColor=&quot;&quot; /]
    &lt;span style=&quot;font-size: 10pt; color: green&quot;&gt;[%-- Login --%]&lt;/span&gt;
    [ul &lt;span style=&quot;font-size: 10pt; color: blue; font-weight: bold;&quot;&gt;id=&quot;ul&quot; runat=&quot;server&quot;&lt;/span&gt;]
      [li]
        [label for=&quot;[%=((TextBox)((Login)this.loginView.FindControl(&quot;login&quot;)).FindControl(&quot;UserName&quot;)).ClientID%]&quot;]User ID[/label]
        [asp:TextBox ID=&quot;&lt;span style=&quot;font-size: 10pt; color: red; font-weight: bold;&quot;&gt;UserName&lt;/span&gt;&quot; runat=&quot;server&quot; /]
        [asp:CustomValidator ID=&quot;cvUserName&quot; runat=&quot;server&quot;
          Display=&quot;dynamic&quot;
          OnServerValidate=&quot;cvUserName_ServerValidate&quot;
          ValidationGroup=&quot;login&quot;
          Text=&quot;*&quot; /]
      [/li]
      [li]
        [label for=&quot;[%=((TextBox)((Login)this.loginView.FindControl(&quot;login&quot;)).FindControl(&quot;Password&quot;)).ClientID%]&quot;]Password[/label]
        [asp:TextBox ID=&quot;&lt;span style=&quot;font-size: 10pt; color: red; font-weight: bold;&quot;&gt;Password&lt;/span&gt;&quot; runat=&quot;server&quot; /]
        [asp:CustomValidator ID=&quot;cvPassword&quot; runat=&quot;server&quot;
          Display=&quot;dynamic&quot;
          OnServerValidate=&quot;cvPassword_ServerValidate&quot;
          ValidationGroup=&quot;login&quot;
          Text=&quot;*&quot; /]
      [/li]
      [li]
        [asp:CheckBox ID=&quot;&lt;span style=&quot;font-size: 10pt; color: red; font-weight: bold;&quot;&gt;RememberMe&lt;/span&gt;&quot; runat=&quot;server&quot; /]
        [label for=&quot;[%=((CheckBox)((Login)this.loginView.FindControl(&quot;login&quot;)).FindControl(&quot;RememberMe&quot;)).ClientID%]&quot;]Remember me![/label]
      [/li]
      [li]
        [asp:Button ID=&quot;&lt;span style=&quot;font-size: 10pt; color: red; font-weight: bold;&quot;&gt;Login&lt;/span&gt;&quot; runat=&quot;server&quot; CommandName=&quot;&lt;span style=&quot;font-size: 10pt; color: red; font-weight: bold;&quot;&gt;Login&lt;/span&gt;&quot; Text=&quot;Login&quot; ValidationGroup=&quot;login&quot; /]
      [/li]
      [li]
        [a href=&quot;/password-recovery&quot;]Forgot my password[/a]
      [/li]
      [li]
        [a href=&quot;/signup&quot;]Registration[/a]
      [/li]
    [/ul]
  [/LayoutTemplate]
[/asp:Login]
&lt;/pre&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt; font-family: Segoe UI, Malgun Gothic, Dotum, Sans-serif;&quot;&gt;위와 같은 식으로 작성하게 되면 그나마 웹 표준에 맞는 로그인 콘트롤을 사용할 수 있다. &lt;span style=&quot;font-size: 12pt; color: red; font-weight: bold;&quot;&gt;빨간색&lt;/span&gt;으로 처리한 부분을 주목하시라. 필수요소다. ㅋ UserName, Password, RememberMe, Login 등과 같은 이름들은 로그인 콘트롤에서 이미 지정하여 쓰는 속성이기 때문에 반드시 같은 이름으로 만들어 주어야 한다. 안그러면? 에러지 머.&lt;/p&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt; font-family: Segoe UI, Malgun Gothic, Dotum, Sans-serif;&quot;&gt; 그리고, Login 콘트롤이 LoginView 안의 서브콘트롤로 들어가게 되면 종종 서버콘트롤이 아닌 것들은 아예 렌더링이 안되는 버그(?)가 있다. 이런 경우에는 일반 HTML 태그에 runat=&quot;server&quot; 속성을 지정해서 서버콘트롤로 만들어주면 된다. 위 코드에서 &lt;span style=&quot;font-size: 12pt; color: blue; font-weight: bold;&quot;&gt;파란색&lt;/span&gt; 처리가 된 부분이 바로 그것. 요렇게 서버콘트롤로 만들어주면 제대로 렌더링을 해서 보여준다.&lt;/p&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt; font-family: Segoe UI, Malgun Gothic, Dotum, Sans-serif;&quot;&gt;마지막으로, 로그인 콘트롤 자체를 감싸는 테이블 태그는 없앨 방도가 없기 때문에, 이부분은 &lt;a href=&quot;http://blog.daum.net/justinsays/6603080&quot; taget=&quot;_blank&quot; style=&quot;font-size: 12pt; font-family: Segoe UI, Malgun Gothic, Dotum, Sans-serif; color: blue;&quot;&gt;요기&lt;/a&gt;를 참고해서 렌더링시에 쓰면 되겠다. ㅋ&lt;/p&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt; font-family: Segoe UI, Malgun Gothic, Dotum, Sans-serif;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;br&gt;&lt;br&gt;tag : &lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=웹표준&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;웹표준&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=렌더링&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;렌더링&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=Rendering&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;Rendering&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=Web Standard&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;Web Standard&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=Login Control&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;Login Control&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=로그인 콘트롤&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;로그인 콘트롤&lt;/a&gt;
	    </content>
	    	</entry>
    	<entry>
	    <title>데이타 랜덤하게 소팅하기</title>
		<link rel="alternate" type="text/html" href="http://blog.daum.net/justinsays/8312601"/>
		<id>tag:blog.daum.net,2009:justinsays.8312601</id>
	    <author>
		    <name>쟈스틴</name>
	    </author>
	    <updated>2008-12-08T08:04:53Z</updated>
	    <published>2008-12-08T08:04:53Z</published>
	    <content type="html">
	    	&lt;dl&gt;
	&lt;dt&gt;참고:&lt;/dt&gt;
	&lt;dd style=&quot;font-size: 12pt; font-family: Segou UI, Malgun Gothic, Dotum, Sans-serif;&quot;&gt;&lt;a href=&quot;http://aspnet.4guysfromrolla.com/demos/dgRandomOrder2.aspx&quot; target=&quot;_blank&quot; style=&quot;font-size: 12pt; font-family: Segou UI, Malgun Gothic, Dotum, Sans-serif; color: blue;&quot;&gt;Demo of Displaying a Set of Records in Random Order&lt;/a&gt;&lt;/dd&gt;
	&lt;dd style=&quot;font-size: 12pt; font-family: Segou UI, Malgun Gothic, Dotum, Sans-serif;&quot;&gt;&lt;a href=&quot;http://www.codinghorror.com/blog/archives/001008.html&quot; target=&quot;_blank&quot; style=&quot;font-size: 12pt; font-family: Segou UI, Malgun Gothic, Dotum, Sans-serif; color: blue;&quot;&gt;Shuffling&lt;/a&gt;&lt;/dd&gt;
	&lt;dd style=&quot;font-size: 12pt; font-family: Segou UI, Malgun Gothic, Dotum, Sans-serif;&quot;&gt;&lt;a href=&quot;http://www.codinghorror.com/blog/archives/001015.html&quot; target=&quot;_blank&quot; style=&quot;font-size: 12pt; font-family: Segou UI, Malgun Gothic, Dotum, Sans-serif; color: blue;&quot;&gt;The Danger of Naïveté&lt;/a&gt;&lt;/dd&gt;
	&lt;dd style=&quot;font-size: 12pt; font-family: Segou UI, Malgun Gothic, Dotum, Sans-serif;&quot;&gt;&lt;a href=&quot;http://articles.techrepublic.com.com/5100-10878_11-5663283.html&quot; target=&quot;_blank&quot; style=&quot;font-size: 12pt; font-family: Segou UI, Malgun Gothic, Dotum, Sans-serif; color: blue;&quot;&gt;Working with random numbers in .NET applications&lt;/a&gt;&lt;/dd&gt;
	&lt;dd style=&quot;font-size: 12pt; font-family: Segou UI, Malgun Gothic, Dotum, Sans-serif;&quot;&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Knuth_shuffle&quot; target=&quot;_blank&quot; style=&quot;font-size: 12pt; font-family: Segou UI, Malgun Gothic, Dotum, Sans-serif; color: blue;&quot;&gt;Fisher-Yates shuffle&lt;/a&gt;&lt;/dd&gt;
	&lt;dd style=&quot;font-size: 12pt; font-family: Segou UI, Malgun Gothic, Dotum, Sans-serif;&quot;&gt;&lt;a href=&quot;http://kaistizen.net/EE/index.php/weblog/comments/how_to_get_a_really_random_number_with_mssql/&quot; target=&quot;_blank&quot; style=&quot;font-size: 12pt; font-family: Segou UI, Malgun Gothic, Dotum, Sans-serif; color: blue;&quot;&gt;MSSQL에서 랜덤 레코드를 얻는 방법&lt;/a&gt;&lt;/dd&gt;
	&lt;dd style=&quot;font-size: 12pt; font-family: Segou UI, Malgun Gothic, Dotum, Sans-serif;&quot;&gt;&lt;a href=&quot;http://kaistizen.net/EE/index.php/weblog/comments/order_by_newid/&quot; target=&quot;_blank&quot; style=&quot;font-size: 12pt; font-family: Segou UI, Malgun Gothic, Dotum, Sans-serif; color: blue;&quot;&gt;ORDER BY NEWID에 대해&lt;/a&gt;&lt;/dd&gt;
&lt;/dl&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt; font-family: Segou UI, Malgun Gothic, Dotum, Sans-serif;&quot;&gt;데이타베이스로부터 무작위로 데이타를 뽑아와서 뿌려주는 방법에는 여러가지가 있다.&lt;/p&gt;

&lt;ul&gt;
	&lt;li style=&quot;font-size: 12pt; font-family: Segou UI, Malgun Gothic, Dotum, Sans-serif;&quot;&gt;ORDER BY NEWID() 구믄을 사용하여 데이타베이스 테이블로부터 아예 랜덤하게 정렬된 데이타를 가져오는 방법&lt;/li&gt;
	&lt;li style=&quot;font-size: 12pt; font-family: Segou UI, Malgun Gothic, Dotum, Sans-serif;&quot;&gt;받아온 데이타를 데이타테이블에서 랜덤하게 정렬하는 방법&lt;/li&gt;
&lt;/ul&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt; font-family: Segou UI, Malgun Gothic, Dotum, Sans-serif;&quot;&gt;첫번째 방법에 쓰인 NEWID()라는 함수는 MS-SQL Server 내부적으로 랜덤한 숫자를 만들어서 리턴시키는 듯 한데, 그 내부 알고리즘을 알 수는 없다. 하지만, &lt;em style=&quot;color: red;&quot;&gt;거의&lt;/em&gt; 100% 랜덤한 숫자를 만든다고 한다. 여기서 &lt;em style=&quot;color: red;&quot;&gt;거의&lt;/em&gt;라고 하는 이유는 이 함수가 Pseudo-random 함수라서 그렇다고 한다. 즉, 중복이 될 가능성도 있다는 얘기다. 하지만, 일반적으로 데이타 뿌려주고 정렬하는 &lt;code style=&quot;font-family: Consolas, Courier New; Sans-serif; font-size: 10pt; color: blue;&quot;&gt;SELECT&lt;/code&gt; 구문에서는 그닥 큰 문제는 될 수 없다고 볼 수 있겠다.&lt;/p&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt; font-family: Segou UI, Malgun Gothic, Dotum, Sans-serif;&quot;&gt;두번째 방법은 닷넷 라이브러리의 &lt;code style=&quot;font-family: Consolas, Courier New; Sans-serif; font-size: 10pt; color: blue;&quot;&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/system.random(VS.80).aspx&quot; target=&quot;_blank&quot; style=&quot;font-family: Consolas, Courier New; Sans-serif; font-size: 10pt; color: blue;&quot;&gt;System.Random&lt;/a&gt;&lt;/code&gt; 클라스를 이용하는 방법이다. 이방법 역시 Pseudo-Method 라서 100% 랜덤한 결과를 뽑아내지는 못하지만, 마찬가지로 데이타 정렬에 있어서만큼은 그닥 영향을 주지 않는다고 볼 수 있겠다. 현재까지 가장 안정적인 방법으로 알려진 알고리즘은 Knuth 라는 사람이 1981년에 발표한 내용으로 &quot;Subtractive random number generator algorithm&quot; 으로 알려져 있다. 저 Random 클라스는 바로 이 Knuth 의 알고리즘을 이용한 방법이 되겠다.&lt;/p&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt; font-family: Segou UI, Malgun Gothic, Dotum, Sans-serif;&quot;&gt;그렇다면, 어떤 식으로 뽑아낸 데이타를 정렬하면 될까? 아래에 대략의 방법이 있다. 하나는 Random.NextBytes() 메써드를 이용한 방법이고 다른 하나는 Random.NextDouble() 메써드를 이용한 방법이다. Random.NextBytes() 메써느는 Byte 배열을 만들어 주는 것으로 256개 이하의 데이타를 랜덤하게 정렬하는데 유용하다. 반면에 NextDouble() 메써드는 0에서 1 사이의 소숫점들을 무작위로 꺼내주기 때문에 많은 수의 데이타를 정렬하는 데에는 훨씬 더 유용하다 할 수 있겠다.&lt;/p&gt;

&lt;pre style=&quot;margin: 10px; padding: 10px; font-size: 10pt; font-family: Consolas, Courier New, Dotum-Che, Sans-serif; border: 1px solid #000000; background: #e3e3e3;&quot;&gt;
&lt;span style=&quot;color: red; font-weight: bold;&quot;&gt;System.Random.NextBytes() 메써드 이용:&lt;/span&gt;

Public Function ShuffleData(ByVal dt As DataTable) As DataView
  &lt;span style=&quot;color: green;&quot;&gt;' Adds another column that stores the random order.&lt;/span&gt;
  &lt;span style=&quot;color: green;&quot;&gt;' 랜덤 소팅에 필요한 새로운 컬럼을 하나 삽입한다.&lt;/span&gt;
  If Not (dt.Columns.Contains(&quot;RandomOrder&quot;)) Then
    Dim col As DataColumn = New DataColumn(&quot;RandomOrder&quot;)
    dt.Columns.Add(col)
  End If

  &lt;span style=&quot;color: green;&quot;&gt;' Sets the random order into the new column, RandomOrder.&lt;/span&gt;
  &lt;span style=&quot;color: green;&quot;&gt;' 새로 만들어진 컬럼에 값을 대입시킨다.&lt;/span&gt;
  &lt;span style=&quot;color: green;&quot;&gt;' Reasonably randomised but duplicated numbers possibly exist.&lt;/span&gt;
  Dim rand As Random = New Random()
  Dim randomOrder(dt.Rows.Count) As Byte
  &lt;span style=&quot;color: red;&quot;&gt;rand.NextBytes(randomOrder)&lt;/span&gt;

  For i As Integer = 0 To dt.Rows.Count - 1 Step 1
    dt.Rows(i)(&quot;RandomOrder&quot;) = randomOrder(i)
  Next
  dt.AcceptChanges()

  &lt;span style=&quot;color: green;&quot;&gt;' Sorts by the new column, RandomOrder.&lt;/span&gt;
  &lt;span style=&quot;color: green;&quot;&gt;' 랜덤소팅한다.&lt;/span&gt;
  Dim dv As DataView = dt.DefaultView
  dv.Sort = &quot;RandomOrder&quot;

  Return dv
End Function
&lt;/pre&gt;

&lt;pre style=&quot;margin: 10px; padding: 10px; font-size: 10pt; font-family: Consolas, Courier New, Dotum-Che, Sans-serif; border: 1px solid #000000; background: #e3e3e3;&quot;&gt;
&lt;span style=&quot;color: red; font-weight: bold;&quot;&gt;System.Random.NextDouble() 메써드 이용:&lt;/span&gt;

Public Function ShuffleData(ByVal dt As DataTable) As DataView
  &lt;span style=&quot;color: green;&quot;&gt;' Adds another column that stores the random order.&lt;/span&gt;
  &lt;span style=&quot;color: green;&quot;&gt;' 랜덤 소팅에 필요한 새로운 컬럼을 하나 삽입한다.&lt;/span&gt;
  If Not (dt.Columns.Contains(&quot;RandomOrder&quot;)) Then
    Dim col As DataColumn = New DataColumn(&quot;RandomOrder&quot;)
    dt.Columns.Add(col)
  End If

  &lt;span style=&quot;color: green;&quot;&gt;' Sets the random order into the new column, RandomOrder.&lt;/span&gt;
  &lt;span style=&quot;color: green;&quot;&gt;' 새로 만들어진 컬럼에 값을 대입시킨다.&lt;/span&gt;
  &lt;span style=&quot;color: green;&quot;&gt;' Reasonably randomised but duplicated numbers possibly exist.&lt;/span&gt;
  Dim rand As Random = New Random()

  For Each dr As DataRow In dt.Rows
    dr(&quot;RandomOrder&quot;) = &lt;span style=&quot;color: red;&quot;&gt;rand.NextDouble()&lt;/span&gt;
  Next
  dt.AcceptChanges()

  &lt;span style=&quot;color: green;&quot;&gt;' Sorts by the new column, RandomOrder.&lt;/span&gt;
  &lt;span style=&quot;color: green;&quot;&gt;' 랜덤소팅한다.&lt;/span&gt;
  Dim dv As DataView = dt.DefaultView
  dv.Sort = &quot;RandomOrder&quot;

  Return dv
End Function
&lt;/pre&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt; font-family: Segou UI, Malgun Gothic, Dotum, Sans-serif;&quot;&gt;개인적으로, ORDER BY NEWID() 구문을 이용해서 데이타 셀렉션을 하게 되면 데이타를 무작위로 추출할 때마다 매번 쿼리를 실행시켜야 한다는 점 때문에, 굳이 데이타베이스 커넥션을 이용하는 것 보다는 데이타를 한번 불러들여서 데이타테이블 내에서 두번째 방법과 같이 랜덤 소팅을 이용하는 것이 성능면에서 낫지 않을까 싶기도 하다.&lt;/p&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt; font-family: Segou UI, Malgun Gothic, Dotum, Sans-serif;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;br&gt;&lt;br&gt;tag : &lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=무작위정렬&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;무작위정렬&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=Random Sorting&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;Random Sorting&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=NEWID()&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;NEWID()&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=Random Class&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;Random Class&lt;/a&gt;
	    </content>
	    	</entry>
    	<entry>
	    <title>서로 다른 페이지로 포스트백(?) 하기</title>
		<link rel="alternate" type="text/html" href="http://blog.daum.net/justinsays/8312599"/>
		<id>tag:blog.daum.net,2009:justinsays.8312599</id>
	    <author>
		    <name>쟈스틴</name>
	    </author>
	    <updated>2008-12-01T12:58:59Z</updated>
	    <published>2008-12-01T12:58:59Z</published>
	    <content type="html">
	    	&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt; font-family: Segoe UI, Malgun Gothic, Dotum, Sans-serif;&quot;&gt;참고: &lt;a href=&quot;http://www.builderau.com.au/program/dotnet/soa/Post-data-to-other-Web-pages-with-ASP-NET-2-0/0,339028399,339278603,00.htm&quot; style=&quot;font-size: 12pt; font-family: Segoe UI, Malgun Gothic, Dotum, Sans-serif; color: blue;&quot; target=&quot;_blank&quot;&gt;Post data to other Web pages with ASP.NET 2.0&lt;/a&gt;&lt;/p&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt; font-family: Segoe UI, Malgun Gothic, Dotum, Sans-serif;&quot;&gt;ASP.NET 페이지는 기본적으로 PostBack 메쏘드를 활용한다. [form action=&quot;ACTION_PAGE&quot;][/form] 형태와 같이 폼 안에 있는 action 속성에 지정한 페이지를 가지고 페이지에 할당된 변수들을 넘기게 되는데, 이를 무조건 자기자신으로 세팅하는 것이 ASP.NET의 세계라고나 할까... 그래서, 다른 페이지로 변수들을 넘길 땐 몇가지 방법이 있다.&lt;/p&gt;

&lt;ul&gt;
	&lt;li style=&quot;font-size: 12pt; font-family: Segoe UI, Malgun Gothic, Dotum, Sans-serif;&quot;&gt;세션에 값들을 저장한 후 넘어간 페이지에서 받아 쓴다.&lt;/li&gt;
	&lt;li style=&quot;font-size: 12pt; font-family: Segoe UI, Malgun Gothic, Dotum, Sans-serif;&quot;&gt;Server.Transfer() 메쏘드를 이용한다.&lt;/li&gt;
	&lt;li style=&quot;font-size: 12pt; font-family: Segoe UI, Malgun Gothic, Dotum, Sans-serif;&quot;&gt;Button.PostBackUrl 속성을 이용한다.&lt;/li&gt;
&lt;/ul&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt; font-family: Segoe UI, Malgun Gothic, Dotum, Sans-serif;&quot;&gt;첫번째 방법이 가장 일반적이지 싶다. 일단 해당 페이지에서 버튼을 클릭했을 때 필요한 값들을 세션에 저장해 놓고, Response.Redirect() 메쏘드로 다음 페이지로 넘어간 다음에 거기서 세션값을 불러와 쓰는 방법이다. 가장 무난하다고나 할까... 근데, 무슨 이유에서건 세션이 날아가면? 에러지 머.&lt;/p&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt; font-family: Segoe UI, Malgun Gothic, Dotum, Sans-serif;&quot;&gt;두번째 방법은 Response.Redirect() 메쏘드와는 조금 다르다. Response.Redirect() 메쏘드는 페이지만 바꿔주는 것으로 이전 페이지의 QueryString 이라든가 Form 값들이 페이지 이동중에 없어진다. 따라서, 리디렉션 URL에 QueryString 값을 포함시켜야만 하는 반면에 Server.Transfer() 메쏘드는 QueryString 값과 Form 값을 모두 유지한다. 따라서, Request.Form[parametre] 형태로 이전 페이지에서 저장된 값을 당근 뽑아올 수 있다. 요게 Server.Transfer() 메쏘드의 장점.&lt;/p&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt; font-family: Segoe UI, Malgun Gothic, Dotum, Sans-serif;&quot;&gt;마지막으로 Button.PostBackUrl 속성을 세팅하게 되면, 기본적으로 포스트백을 실행시키고 나서 알아서 Button.PostBackUrl 에 세팅한 페이지로 자동으로 넘겨준다. 그리고 거기서 Request.Form[parametre] 형태로 값을 뽑아 쓸 수 있다.&lt;/p&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt; font-family: Segoe UI, Malgun Gothic, Dotum, Sans-serif;&quot;&gt;또한가지, 두번째와 세번째 방법의 장점이라면 Page.PreviousPage 속성을 이용해 이전 페이지의 콘트롤에 접근이 가능하다는 것이다. 예를 들어보쟈.&lt;/p&gt;

&lt;pre style=&quot;margin: 10px; padding: 10px; font-size: 10pt; font-family: Consolas, Courier New, Sans-serif; border: 1px solid black;&quot;&gt;
&lt;span style=&quot;font-size: 10pt; font-family: Consolas, Courier New, Sans-serif; color: red; font-weight: bold;&quot;&gt;pageA.aspx&lt;/span&gt;

[html]
	[head][/head]
	[body]
		[form ID=&quot;frm&quot; runat=&quot;server&quot;]
			[asp:TextBox ID=&quot;tbxGivenName&quot; runat=&quot;server&quot; Text=&quot;Justin&quot; /]
			[asp:Button ID=&quot;btnSubmit&quot; runat=&quot;server&quot; Text=&quot;Go&quot; &lt;span style=&quot;color: red;&quot;&gt;PostBackUrl=&quot;pageB.aspx&quot;&lt;/span&gt; /]
		[/form]
	[/body]
[/html]
&lt;/pre&gt;

&lt;pre style=&quot;margin: 10px; padding: 10px; font-size: 10pt; font-family: Consolas, Courier New, Sans-serif; border: 1px solid black;&quot;&gt;
&lt;span style=&quot;font-size: 10pt; font-family: Consolas, Courier New, Sans-serif; color: red; font-weight: bold;&quot;&gt;pageB.aspx&lt;/span&gt;

[script runat=&quot;server&quot;]
	protected void Page_Load(object sender, EventArgs e)
	{
		&lt;span style=&quot;color: red;&quot;&gt;Page pp = this.PreviousPage;&lt;/span&gt;
		string givenName = ((TextBox)pp.FindControl(&quot;tbxGivenName&quot;)).Text;
	}
[/script]
&lt;/pre&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt; font-family: Segoe UI, Malgun Gothic, Dotum, Sans-serif;&quot;&gt;요런 식으로 pageA.aspx 에서 pageB.aspx 로 넘어가면서 pageB.aspx 에서 pageA.aspx 에 들어있는 콘트롤들에 접근이 가능한 셈이다. Form 을 이용한 액션에서 알아두면 아주 좋은 팁이라 아니할 수 없지 않을 수 없다고는 하지 못할 수가 없을 것이다. (먼소리여~)&lt;/p&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt; font-family: Segoe UI, Malgun Gothic, Dotum, Sans-serif;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;br&gt;&lt;br&gt;tag : &lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=PostBack&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;PostBack&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=포스트백&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;포스트백&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=CrossPostBack&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;CrossPostBack&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=크로스포스트백&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;크로스포스트백&lt;/a&gt;
	    </content>
	    	</entry>
    	<entry>
	    <title>웹표준에 근접하게 테이블 태그 빼고 콘트롤 렌더링하기</title>
		<link rel="alternate" type="text/html" href="http://blog.daum.net/justinsays/6603080"/>
		<id>tag:blog.daum.net,2009:justinsays.6603080</id>
	    <author>
		    <name>쟈스틴</name>
	    </author>
	    <updated>2008-09-09T10:01:55Z</updated>
	    <published>2008-09-09T10:01:55Z</published>
	    <content type="html">
	    	&lt;dl&gt;
&lt;dt&gt;참고:&lt;/dt&gt;
&lt;dd&gt;&lt;a href=&quot;http://forums.asp.net/t/987744.aspx&quot; style=&quot;color: blue; font-size: 12pt;&quot;&gt;Webparts&lt;/a&gt;&lt;/dd&gt;
&lt;dd&gt;&lt;a href=&quot;http://www.codeplex.com/cssfriendly&quot; style=&quot;font-size: 12pt; color: blue;&quot;&gt;CSS Friendly Control Adapters&lt;/a&gt;&lt;/dd&gt;
&lt;/dl&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt; font-family: Segoe UI, Arial, Sans-serif;&quot;&gt;닷넷으로 개발을 하다보면 반드시 웹서버 콘트롤을 쓸 수 밖에 없는 경우가 생긴다. 그런데, 이 웹서버 콘트롤들이 웹표준을 따르지 않는 경우가 많다. 예를 들어서 불필요한 테이블 태그로 디자인을 한다거나 하는 경우 말이다. 또한 자주 쓰는 콘트롤 중에는 라디오박스 리스트, 체크박스리스트 등과 같은 리스트 콘트롤들이 있는데, 이걸 쓸데없이 테이블 태그로 감싸놓았다. 언제쯤 이런 콘트롤들이 CSS Friendly 하게 변하려나...&lt;/p&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt; font-family: Segoe UI, Arial, Sans-serif;&quot;&gt;우얏든둥, MS에서는 이 사실을 인지하고 있는 듯 싶고, 공식적인 대응이라기 보다는 요 위의 코드플렉스 프로젝트인 CSS Friendly Control Adapters 를 이용해서 해결하려는 듯 싶다. 저걸 이용하면 많은 부분 해결을 할 수 있겠지만, 해당사항이 없는건 또 직접 만들어서 써야겠지.&lt;/p&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt; font-family: Segoe UI, Arial, Sans-serif;&quot;&gt;아래 코드는 렌더링 상황에서 어떻게 테이블 태그를 없앨 수 있는지에 대한 내용이다. VB 코드로 짜놓은 거니 C#으로는 알아서 변형시키면 될 듯.&lt;/p&gt;

&lt;pre style=&quot;margin: 10px 0px; padding: 10px; font-family: Consolas, Courier New; border: 1px solid #000000;&quot;&gt;
Public Class WebPartZoneControlAdapter
  Inherits System.Web.UI.WebControls.Adapters.WebControlAdapter

  Protected sw As StringWriter = Nothing
  Protected hw As HtmlTextWriter = Nothing

  Public Sub New()
    sw = New StringWriter
    hw = New HtmlTextWriter(sw)
  End Sub

  Protected Overrides Sub RenderBeginTag(ByVal writer As System.Web.UI.HtmlTextWriter)
    &lt;span style=&quot;color: green;&quot;&gt;'MyBase.RenderBeginTag(writer)&lt;/span&gt;
  End Sub

  Protected Overrides Sub RenderEndTag(ByVal writer As System.Web.UI.HtmlTextWriter)
    &lt;span style=&quot;color: green;&quot;&gt;'MyBase.RenderEndTag(writer)&lt;/span&gt;
  End Sub

  Protected Overrides Sub RenderContents(ByVal writer As System.Web.UI.HtmlTextWriter)
    MyBase.RenderContents(Me.hw)

    Dim org As String = Me.sw.ToString()
	&lt;span style=&quot;color: green;&quot;&gt;' Removes table, tr and td tags while rendering&lt;/span&gt;
    Dim html As String = Regex.Replace(org, &quot;&lt;[/]?(table|tr|td|[ovwxp]:\w+)[^&gt;]*?&gt;&quot;, &quot;&quot;, RegexOptions.IgnoreCase)
    writer.Write(html)
  End Sub
End Class
&lt;/pre&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt; font-family: Segoe UI, Arial, Sans-serif;&quot;&gt;그다음에 App_Browsers 디렉토리를 만들고 그 안에 form.browser 파일을 만들어 아래 내용을 집어 넣으면 끝.&lt;/p&gt;

&lt;pre style=&quot;margin: 10px 0px; padding: 10px; font-family: Consolas, Courier New; border: 1px solid #000000;&quot;&gt;
[browsers]
  [browser refID=&quot;Default&quot;]
    [controlAdapters]
      [adapter controlType=&quot;System.Web.UI.WebControls.WebPartZone&quot; adapterType=&quot;WebPartZoneControlAdapter&quot; /]
    [/controlAdapters]
  [/browser]
[/browsers]
&lt;/pre&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt; font-family: Segoe UI, Arial, Sans-serif;&quot;&gt;비슷한 방식으로 하면 다른 콘트롤들도 렌더링 할 때 불필요한 테이블 태그들을 없앨 수 있다.&lt;/p&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt; font-family: Segoe UI, Arial, Sans-serif;&quot;&gt;참 쉽지? ^^&lt;/p&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt; font-family: Segoe UI, Arial, Sans-serif;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;br&gt;&lt;br&gt;tag : &lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=Table&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;Table&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=웹표준&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;웹표준&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=렌더링&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;렌더링&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=Rendering&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;Rendering&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=Web Standard&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;Web Standard&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=테이블 태그&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;테이블 태그&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=CSS Friendly&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;CSS Friendly&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=CSS 후렌들리&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;CSS 후렌들리&lt;/a&gt;
	    </content>
	    	</entry>
    	<entry>
	    <title>호환마마보다 더 무서운 SQL Injection</title>
		<link rel="alternate" type="text/html" href="http://blog.daum.net/justinsays/5900851"/>
		<id>tag:blog.daum.net,2009:justinsays.5900851</id>
	    <author>
		    <name>쟈스틴</name>
	    </author>
	    <updated>2008-08-04T09:53:40Z</updated>
	    <published>2008-08-04T09:53:40Z</published>
	    <content type="html">
	    	&lt;dl&gt;
	&lt;dt&gt;참고:&lt;/dt&gt;
	&lt;dd&gt;&lt;a href=&quot;http://www.elizabethcastro.com/html/extras/entities.html&quot; style=&quot;color: blue;&quot; target=&quot;_blank&quot;&gt;Character Entity References in HTML 4 and XHTML 1.0&lt;/a&gt;&lt;/dd&gt;
	&lt;dd&gt;&lt;a href=&quot;http://www.w3schools.com/tags/ref_entities.asp&quot; style=&quot;color: blue;&quot; target=&quot;_blank&quot;&gt;HTML Latin-1 Character Entities Reference&lt;/a&gt;&lt;/dd&gt;
&lt;/dl&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt;&quot;&gt;웹에서 데이타를 주고받는데 있어서 데이타베이스 사용은 필수적일 수 밖에 없다. 그러자면, SQL 쿼리를 이용해서 데이타를 주고받아야 하는데, 쿼리에 필요한 몇가지 특수문자들이 들어가 있을 경우 치명적인 보안 결함을 일으킬 수 있다. 또한, HTML 태그들을 허용할 경우에 [script][/script] 또는 [style][/style] 태그쌍을 이용한 자바스크립트 공격이 있을 수 있으므로 이 또한 피해야 한다. 그럼 어떻게 해야 할까? 당근 이런 문자열들을 다른 것들로 바꿔치기해서 제대로 SQL 인젝션이나 스크립트가 먹히지 않게끔 해야겠지?&lt;/p&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt;&quot;&gt;SQL Injection 공격이 가능한 문자열로는 다음과 같은 것들이 있다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Single Quote: '&lt;/li&gt;
&lt;li&gt;Semi colon: ;&lt;/li&gt;
&lt;li&gt;Double hyphen: --&lt;/li&gt;
&lt;/ul&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt;&quot;&gt;이러한 것들은 반드시 다른 문자로 바꿔줘야 한다. 예를 들어 아래와 같은 식으로 바꾸면 되겠다.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Single Quote: ' 는 '' 로 바꾼다. &amp;apos; 는 표준 엔티티임에도 불구하고 IE에서 먹히지 않는다. ㅡㅡ;&lt;/li&gt;
&lt;li&gt;Semi colon: ; 는 &amp;brvbar; 로 바꾼다. 사실 이건 세미콜론이 아니라 | 표시지만, 어쨌든 바꿔야 하니깐... ^^;&lt;/li&gt;
&lt;li&gt;Double hyphen: -- 는 &amp;ndash;&amp;ndash; 로 바꾼다.&lt;/li&gt;
&lt;/ul&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt;&quot;&gt;또한, HTML 태그들을 모두 HTML 엔티티로 바꿔줘야 한다. 대표적으로 &lt; 와 &gt; 는 각각 &lt; 와 &gt; 로 바꿔둬야 나중에 스크립트 공격에서 안전할 수 있다. 대략 아래와 같은 코드를 예상할 수 있겠다.&lt;/p&gt;

&lt;pre style=&quot;margin: 10px; padding: 10px; font-size: 10pt; border: 1px solid; color: #000000; background-color: #eeeeee;&quot;&gt;&lt;span style=&quot;color: green;&quot;&gt;// Gets string&lt;/span&gt;
string content = this.tbxBody.Text.Trim();

&lt;span style=&quot;color: green;&quot;&gt;// Replaces one single quote to two single quotes&lt;/span&gt;
content = content.Replace(&quot;'&quot;, &quot;''&quot;);

&lt;span style=&quot;color: green;&quot;&gt;// Replaces semi colon to &amp;brvbar;&lt;/span&gt;
content = content.Replace(&quot;;&quot;, &quot;&amp;brvbar;&quot;);

&lt;span style=&quot;color: green;&quot;&gt;// Replaces two hyphens to &amp;ndash;&amp;ndash;&lt;/span&gt;
content = content.Replace(&quot;--&quot;, &quot;&amp;ndash;&amp;ndash;&quot;);

&lt;span style=&quot;color: green;&quot;&gt;// Replaces all HTML entities&lt;/span&gt;
content = System.Web.HttpUtility.HTMLEncode(content);
&lt;/pre&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt;&quot;&gt;반대로 저장된 DB에서 꺼내와서 화면에 뿌려줄 때는 반대의 순서로 디코딩을 해야겠지?&lt;/p&gt;

&lt;pre style=&quot;margin: 10px; padding: 10px; font-size: 10pt; border: 1px solid; color: #000000; background-color: #eeeeee;&quot;&gt;&lt;span style=&quot;color: green;&quot;&gt;// Gets string&lt;/span&gt;
string content = Convert.ToString(DataTable.Rows[0][0]);

&lt;span style=&quot;color: green;&quot;&gt;// Trims unnecessary white spaces at the both ends&lt;/span&gt;
content = content.Trim();

&lt;span style=&quot;color: green;&quot;&gt;// Replaces all HTML entities&lt;/span&gt;
content = System.Web.HttpUtility.HTMLDecode(content);

&lt;span style=&quot;color: green;&quot;&gt;// Replaces two hyphens to &amp;ndash;&amp;ndash;&lt;/span&gt;
content = content.Replace(&quot;--&quot;, &quot;&amp;ndash;&amp;ndash;&quot;);

&lt;span style=&quot;color: green;&quot;&gt;// Replaces semi colon to &amp;brvbar;&lt;/span&gt;
content = content.Replace(&quot;;&quot;, &quot;&amp;brvbar;&quot;);

&lt;span style=&quot;color: green;&quot;&gt;// Replaces one single quote to two single quotes&lt;/span&gt;
content = content.Replace(&quot;'&quot;, &quot;''&quot;);

&lt;span style=&quot;color: green;&quot;&gt;// Replaces [script] and [style] tags not working&lt;/span&gt;
content = content.Replace(&quot;&lt;script&quot;, &quot;&lt;script&quot;).Replace(&quot;&lt;/script&gt;&quot;, &quot;&lt;/script&gt;&quot;);
content = content.Replace(&quot;&lt;style&quot;, &quot;&lt;style&quot;).Replace(&quot;&lt;/style&gt;&quot;, &quot;&lt;/style&gt;&quot;);
&lt;/pre&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt;&quot;&gt;물론, 이것이 전부는 아닐테지만, 기본적인 보안사고를 방지하기 위한 첫걸음 정도 되겠다.&lt;/p&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt;&quot;&gt;다 됐능가? 그럼 아래 SQL 인젝션 코드를 검색 폼이나 본문 입력폼 등에 넣어서 작동을 하나 함 보쟈. 이게 제대로 먹히지 않아야 제대로 된 것이겠지?&lt;/p&gt;

&lt;pre style=&quot;margin: 10px; padding: 10px; font-size: 10pt; border: 1px solid; color: #000000; background-color: #eeeeee;&quot;&gt;[script]alert(&quot;Hi~!&quot;);[/script] A' OR 1=1; exec sp_tables; --
&lt;/pre&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt;&quot;&gt;만약 팝업창이 뜨고, 지금 데이타베이스에 있는 모든 테이블이 주루룩 보인다면, 언능 SQL Injection 검사해 볼 것.&lt;/p&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt;&quot;&gt; &lt;/p&gt;
&lt;br&gt;&lt;br&gt;tag : &lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=해킹&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;해킹&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=보안&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;보안&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=Javascript&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;Javascript&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=SQL Injection&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;SQL Injection&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=SQL 인젝션&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;SQL 인젝션&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=HTML 엔티티&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;HTML 엔티티&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=HTML Entities&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;HTML Entities&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=자바스크립트 공격&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;자바스크립트 공격&lt;/a&gt;
	    </content>
	    	</entry>
    	<entry>
	    <title>이메일에 파일 첨부하기, 이미지 삽입시키기</title>
		<link rel="alternate" type="text/html" href="http://blog.daum.net/justinsays/5650380"/>
		<id>tag:blog.daum.net,2009:justinsays.5650380</id>
	    <author>
		    <name>쟈스틴</name>
	    </author>
	    <updated>2008-07-21T12:48:22Z</updated>
	    <published>2008-07-21T12:48:22Z</published>
	    <content type="html">
	    	&lt;dl&gt;
	&lt;dt&gt;참고&lt;/dt&gt;
	&lt;dd&gt;&lt;a href=&quot;http://www.phpbuilder.com/columns/kartic20000807.php3&quot; style=&quot;color: blue;&quot; target=&quot;_blank&quot;&gt;Sending MIME email in PHP&lt;/a&gt;&lt;/dd&gt;
	&lt;dd&gt;&lt;a href=&quot;http://www.webcheatsheet.com/PHP/send_email_text_html_attachment.php&quot; style=&quot;color: blue;&quot; target=&quot;_blank&quot;&gt;PHP: Sending Email (Text/HTML/Attachments)&lt;/a&gt;&lt;/dd&gt;
	&lt;dd&gt;&lt;a href=&quot;http://www.sitepoint.com/print/advanced-email-php&quot; style=&quot;color: blue;&quot; target=&quot;_blank&quot;&gt;Advanced email in PHP&lt;/a&gt;&lt;/dd&gt;
	&lt;dd&gt;&lt;a href=&quot;http://www.phpeveryday.com/articles/PHP-Email-Using-Embedded-Images-in-HTML-Email-P113.html&quot; style=&quot;color: blue;&quot; target=&quot;_blank&quot;&gt;PHP Email: Using Embedded Images in HTML Email&lt;/a&gt;&lt;/dd&gt;
	&lt;dd&gt;&lt;a href=&quot;http://www.phpeveryday.com/articles/Email-Send-Attachement-Mail-P75.html&quot; style=&quot;color: blue;&quot; target=&quot;_blank&quot;&gt;Email: Sending Dual Format (Part 3)&lt;/a&gt;&lt;/dd&gt;
&lt;/dl&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt;&quot;&gt;웹사이트 구성시, 가입자에게 이메일을 보내는 기능은 필수가 됐다. 이 때, 가입자에게 메일을 보내는 형태는 대개 세네가지 정도로 나뉜다.&lt;/p&gt;

&lt;ul&gt;
	&lt;li style=&quot;font-size: 12pt;&quot;&gt;Plain Text로 보내는 경우&lt;/li&gt;
	&lt;li style=&quot;font-size: 12pt;&quot;&gt;HTML 포맷으로 보내는 경우
		&lt;ul&gt;
			&lt;li style=&quot;font-size: 12pt;&quot;&gt;이미지를 본문에 첨부하여 보내는 경우 - embedded image&lt;/li&gt;
			&lt;li style=&quot;font-size: 12pt;&quot;&gt;서버에 있는 이미지를 링크시켜 보내는 경우&lt;/li&gt;
		&lt;/ul&gt;
	&lt;/li&gt;
	&lt;li style=&quot;font-size: 12pt;&quot;&gt;파일을 첨부하여 보내는 경우&lt;/li&gt;
&lt;/ul&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt;&quot;&gt;사용자의 환경은 다양하기 때문에 모든 경우를 가급적 다 고려해서 이메일을 보내는 것이 바람직하다. 이 때 쓰이는 방법이 multipart/mixed 모드를 사용하여 보내는 것이다. 아래 그림은 multipart/mixed 모드를 사용한 이메일의 대략적인 구조가 되겠다.&lt;/p&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt; text-align: center&quot;&gt;&lt;a href=&quot;javascript:realImgView('http://cfs13.blog.daum.net/original/8/blog/2008/07/21/12/45/4884063d0a5e0&amp;filename=multipart_email_structure.jpg')&quot;&gt;&lt;img src=&quot;http://cfs13.blog.daum.net/image/8/blog/2008/07/21/12/45/4884063d0a5e0&amp;filename=multipart_email_structure.jpg&quot; border=&quot;0&quot; hspace=&quot;0&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt;&quot;&gt;위 그림에서도 볼 수 있다시피, 헤더에는 multipart/mixed로 나타내고 그 아랫부분에 영역에 따라 multipart/alternative, multipart/related로 구분하여 데이타들을 집어넣으면 된다. 위 참고 사이트는 모두 PHP 관련 사이트이긴 하지만, 닷넷이라고 이메일 구조가 달라지는 건 아니니... ^^&lt;/p&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;br&gt;&lt;br&gt;tag : &lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=이메일&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;이메일&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=파일첨부&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;파일첨부&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=MIME&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;MIME&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=multipart/mixed&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;multipart/mixed&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=multipart/alternative&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;multipart/alternative&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=multipart/related&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;multipart/related&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=이미지삽입&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;이미지삽입&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=Image embedding&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;Image embedding&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=File attaching&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;File attaching&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=MIME type e-mail&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;MIME type e-mail&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=Image-embedded e-mail&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;Image-embedded e-mail&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=File-attached e-mail&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;File-attached e-mail&lt;/a&gt;
	    </content>
	    	</entry>
    	<entry>
	    <title>Page 콘트롤, UserControl 콘트롤 간 Page Event 순서</title>
		<link rel="alternate" type="text/html" href="http://blog.daum.net/justinsays/5597636"/>
		<id>tag:blog.daum.net,2009:justinsays.5597636</id>
	    <author>
		    <name>쟈스틴</name>
	    </author>
	    <updated>2008-07-18T12:38:22Z</updated>
	    <published>2008-07-18T12:38:22Z</published>
	    <content type="html">
	    	&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt;&quot;&gt;닷넷 개발중 가장 까다로운 것중 하나는 페이지 이벤트가 일어나는 순서이다. 특히나, 하나의 페이지가 아닌 여러개의 페이지들을 중첩시켜 개발할 경우에는 더욱 그렇다. 기본적으로 가장 많이 쓰이는 콘트롤은 Page 콘트롤과 UserControl 콘트롤 일텐데, 이들 사이의 이벤트들이 일어나는 순서는 대략 아래와 같다.&lt;/p&gt;

&lt;ol&gt;
&lt;li style=&quot;font-size: 12pt;&quot;&gt;UserControl.Page_Init()&lt;/li&gt;
&lt;li style=&quot;font-size: 12pt;&quot;&gt;Page.Page_Init()&lt;/li&gt;
&lt;li style=&quot;font-size: 12pt;&quot;&gt;Page.Page_Load()&lt;/li&gt;
&lt;li style=&quot;font-size: 12pt;&quot;&gt;UserControl.Page_Load()&lt;/li&gt;
&lt;/ol&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt;&quot;&gt;다른 이벤트들도 많이 있지만, 대표적으로 Page_Init, Page_Load 이벤트간 순서가 많이 쓰이기에 정리해 봤음.&lt;/p&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt;&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;br&gt;&lt;br&gt;tag : &lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=Page&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;Page&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=UserControl&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;UserControl&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=Page.Page_Init&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;Page.Page_Init&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=Page.Page_Load&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;Page.Page_Load&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=UserControl.Page_Init&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;UserControl.Page_Init&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=UserControl.Page_Load&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;UserControl.Page_Load&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=Page_Init&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;Page_Init&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=Page_Load&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;Page_Load&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=이벤트 발생 순서&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;이벤트 발생 순서&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=Event Order&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;Event Order&lt;/a&gt;
	    </content>
	    	</entry>
    	<entry>
	    <title>정규표현식으로 BBCode를 HTML로 변환하기</title>
		<link rel="alternate" type="text/html" href="http://blog.daum.net/justinsays/5489059"/>
		<id>tag:blog.daum.net,2009:justinsays.5489059</id>
	    <author>
		    <name>쟈스틴</name>
	    </author>
	    <updated>2008-07-13T21:40:02Z</updated>
	    <published>2008-07-13T21:40:02Z</published>
	    <content type="html">
	    	&lt;dl&gt;
&lt;dt&gt;참고:&lt;/dt&gt;
&lt;dd&gt;&lt;a href=&quot;http://forums.asp.net/p/1274423/2418442.aspx&quot; style=&quot;color: blue;&quot; target=&quot;_blank&quot;&gt;Convert BBCode to HTML (using vb)&lt;/a&gt;&lt;/dd&gt;
&lt;dd&gt;&lt;a href=&quot;http://www.phpbb.com/community/faq.php?mode=bbcode&quot; style=&quot;color: blue;&quot; target=&quot;_blank&quot;&gt;BBCode guide&lt;/a&gt;&lt;/dd&gt;
&lt;dd&gt;&lt;a href=&quot;http://www.wellho.net/regex/posix.html&quot; style=&quot;color: blue;&quot; target=&quot;_blank&quot;&gt;POSIX Regular Expressions - detailed manual&lt;/a&gt;&lt;/dd&gt;
&lt;dd&gt;&lt;a href=&quot;http://www.radsoftware.com.au/regexdesigner/&quot; style=&quot;color: blue;&quot; target=&quot;_blank&quot;&gt;Free Regular Expression Designer&lt;/a&gt;&lt;/dd&gt;
&lt;dd&gt;&lt;a href=&quot;http://www.codeparser.net/&quot; style=&quot;color: blue;&quot; target=&quot;_blank&quot;&gt;Codeparser.net&lt;/a&gt;&lt;/dd&gt;
&lt;/dl&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt;&quot;&gt;한국과 달리 해외에서는 &lt;a href=&quot;http://www.phpbb.com&quot; style=&quot;font-size: 12pt; color: blue;&quot; target=&quot;_blank&quot;&gt;phpBB&lt;/a&gt;라고 불리는 게시판 툴이 아주 널리 쓰인다. 게다가, phpBB의 게시판 스타일을 다른 게시판 툴에서도 차용하여 쓰고 있다. 이 phpBB에는 BBCode (Bulletin Board Code, &lt;a href=&quot;http://en.wikipedia.org/wiki/Bbcode&quot; style=&quot;font-size: 12pt; color: blue;&quot;&gt;http://en.wikipedia.org/wiki/Bbcode&lt;/a&gt;) 라고 불리는 효과적(?)인 HTML 태깅 툴을 쓰고 있다. 이 BBCode는 아주 독특하고 나름 유명한지라 PHP의 공식 &lt;a href=&quot;http://au.php.net/manual/en/bbcode.installation.php&quot; style=&quot;font-size: 12pt; color: blue;&quot; target=&quot;_blank&quot;&gt;PECL Extension&lt;/a&gt;으로도 별도로 공급할 정도이다.&lt;/p&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt;&quot;&gt;그런데, 이 BBCode는 다시 HTML로 바꿔야 할 상황이 되었을 때, 아주 골치아프게 편한다. 예를 들어 phpBB 자체의 기능을 통한다면야 알아서 바뀌기 때문에 걱정할 일이 없다지만, DB의 데이타에 직접 액세스해서 데이타를 가져올 경우에는 이 BBCode 태그들을 모두 걷어내서 HTML 태그로 바꿔줘야 하는데, 이게 만만치 않은 작업이더라.&lt;/p&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt;&quot;&gt;&lt;code&gt;String.Text.Replace()&lt;/code&gt; 메서드를 통해 대부분 바꿔치기가 가능하지만, 몇가지 속성이 지정된 BBCode 태그들은 불가능하기 때문에, 그러한 것들은 정규표현식을 통해 바꿔줘야 한다. 정규표현식 Regular Expression 은 잘만 활용하면 아주 편리하지만, 암호같은 표현식을 보고 있노라면, 이게 도대체 무슨 소린지 알 수도 없고... ㅡㅡ; 하여튼 복잡한 넘이다. 그렇다면 어떻게 하느냐? 아래 코드를 보쟈.&lt;/p&gt;

&lt;pre style=&quot;margin: 10px; padding: 10px; font-family: courier new, sans-serif; border: 1px solid black;&quot;&gt;
public string BBcodeToHTML(string content)
{
  //  Initialises objects and variables
  string pattern = null;
  string replacement = null;

  //  Changes &quot;url: type #1&quot;
  &lt;span style=&quot;color: red;&quot;&gt;pattern = @&quot;\[url[]](.*)\[/url[]]&quot;&lt;/span&gt;;
  &lt;span style=&quot;color: red;&quot;&gt;replacement = &quot;[a href=\&quot;$1\&quot;]$1[/a]&quot;&lt;/span&gt;;
  content = Regex.Replace(content, pattern, replacement, RegexOptions.IgnoreCase);

  //  Changes &quot;url: type #2&quot;
  pattern = @&quot;\[url=([^]]*)[]](.*)\[/url[]]&quot;;
  replacement = &quot;[a href=\&quot;$1\&quot;]$2[/a]&quot;;
  content = Regex.Replace(content, pattern, replacement, RegexOptions.IgnoreCase);

  //  Changes &quot;e-mail&quot;
  pattern = @&quot;\[email[]](.*)\[/email[]]&quot;;
  replacement = &quot;[a href=\&quot;mailto:$1\&quot;]$1[/a]&quot;;
  content = Regex.Replace(content, pattern, replacement, RegexOptions.IgnoreCase);

  //  Changes &quot;img&quot;
  pattern = @&quot;\[img[]](.*)\[/img[]]&quot;;
  replacement = &quot;[img src=\&quot;$1\&quot; /]&quot;;
  content = Regex.Replace(content, pattern, replacement, RegexOptions.IgnoreCase);

  //  Changes &quot;bold&quot;
  pattern = @&quot;\[b[]](.*)\[/b[]]&quot;;
  replacement = &quot;[span style=\&quot;font-weight: bold;\&quot;]$1[/span]&quot;;
  content = Regex.Replace(content, pattern, replacement, RegexOptions.IgnoreCase);

  //  Changes &quot;underline&quot;
  pattern = @&quot;\[u[]](.*)\[/u[]]&quot;;
  replacement = &quot;[span style=\&quot;text-decoration: underline;\&quot;]$1[/span]&quot;;
  content = Regex.Replace(content, pattern, replacement, RegexOptions.IgnoreCase);

  //  Changes &quot;italic&quot;
  pattern = @&quot;\[i[]](.*)\[/i[]]&quot;;
  replacement = &quot;[span style=\&quot;font-style: italic;\&quot;]$1[/span]&quot;;
  content = Regex.Replace(content, pattern, replacement, RegexOptions.IgnoreCase);

  //  Changes &quot;color&quot;
  pattern = @&quot;\[color=(.*)[]](.*)\[/color[]]&quot;;
  replacement = &quot;[span style=\&quot;color: $1;\&quot;]$2[/span]&quot;;
  content = Regex.Replace(content, pattern, replacement, RegexOptions.IgnoreCase);

  //  Changes &quot;size&quot;
  pattern = @&quot;\[size=(.*)[]](.*)\[/size[]]&quot;;
  replacement = &quot;[span style=\&quot;font-size: $1%;\&quot;]$2[/span]&quot;;
  content = Regex.Replace(content, pattern, replacement, RegexOptions.IgnoreCase);

  //  Changes &quot;quote&quot;
  pattern = @&quot;\[quote[=]?[&quot;&quot;]?(.*)[&quot;&quot;]?[]](.*)\[/quote[]]&quot;;
  replacement = &quot;[blockquote][p]$1 wrote:[/p][p]$2[/p][/blockquote]&quot;;
  content = Regex.Replace(content, pattern, replacement, RegexOptions.IgnoreCase);
  content = content.Replace(&quot;[p] wrote:[/p]&quot;, &quot;&quot;);

  //  Changes &quot;code&quot;
  pattern = @&quot;\[code=(.*)[]](.*)\[/code[]]&quot;;
  replacement = &quot;[code]$2[/code]&quot;;
  content = Regex.Replace(content, pattern, replacement, RegexOptions.IgnoreCase);

  //  Changes &quot;list item&quot;
  pattern = @&quot;\[\*[]](.*)\[/\*:m[]]&quot;;
  replacement = &quot;[li]$1[/li]&quot;;
  content = Regex.Replace(content, pattern, replacement, RegexOptions.IgnoreCase);

  //  Changes &quot;unordered list&quot;
  content = content.Replace(&quot;[list]&quot;, &quot;[ul]&quot;).Replace(&quot;[/list:u]&quot;, &quot;[/ul]&quot;);
  //pattern = @&quot;\[list[]](.*)\[/list:u[]]&quot;;
  //replacement = &quot;[ul]$1[/ul]&quot;;
  //content = Regex.Replace(content, pattern, replacement, RegexOptions.IgnoreCase);

  //  Changes &quot;ordered list: number&quot;
  content = content.Replace(&quot;[list=1]&quot;, &quot;[ol]&quot;).Replace(&quot;[/list:o]&quot;, &quot;[/ol]&quot;);
  //pattern = @&quot;\[list=1[]](.*)\[/list:o[]]&quot;;
  //replacement = &quot;[ol]$1[/ol]&quot;;
  //content = Regex.Replace(content, pattern, replacement, RegexOptions.IgnoreCase);

  //  Changes &quot;ordered list: alphabet&quot;
  content = content.Replace(&quot;[list=a]&quot;, &quot;[ol style=\&quot;list-style-type: lower-alpha;\&quot;]&quot;).Replace(&quot;[/list:o]&quot;, &quot;[/ol]&quot;);
  //pattern = @&quot;\[list=a[]](.*)\[/list:o[]]&quot;;
  //replacement = &quot;[ol style=\&quot;list-style-type: lower-alpha;\&quot;]$1[/ol]&quot;;
  //content = Regex.Replace(content, pattern, replacement, RegexOptions.IgnoreCase);

  return content;
}
&lt;/pre&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt;&quot;&gt;위 코드에서 볼 수 있다시피, 각각의 경우에 대해 &lt;code&gt;System.Text.RegularExpression.Regex.Replace()&lt;/code&gt; 메서드를 사용해서 패턴에 맞추어 변환을 시키게 된다. 참고로 위 코드에서 replacement 변수값에 들어가는 태그들은 모두 &lt;, &gt; 들이다. 헷갈리지 말길.&lt;/p&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt;&quot;&gt;이거 한참 삽질하고 있는데, 방금 &lt;a href=&quot;http://en.wikipedia.org/wiki/Bbcode&quot; style=&quot;font-size: 12pt; color: blue;&quot;&gt;위키&lt;/a&gt;를 찾아보니까 닷넷에서는 &lt;a href=&quot;http://www.codeparser.net/&quot; style=&quot;font-size: 12pt; color: blue;&quot; target=&quot;_blank&quot;&gt;Codeparser.net&lt;/a&gt;에서 DLL 파일을 무료로 제공하고 있더라. ㅡㅡ; 이런 젠장.&lt;/p&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt;&quot;&gt;우얏든둥, 난 그동안 며칠을 정규표현식 공부한게 아까와서라도 저거 안쓸끄야! ㅡㅡ^&lt;/p&gt;

&lt;p style=&quot;margin: 10px 0px; padding: 0px; font-size: 12pt;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;br&gt;&lt;br&gt;tag : &lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=HTML&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;HTML&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=Regular Expression&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;Regular Expression&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=정규표현식&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;정규표현식&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=BBCode&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;BBCode&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;/_blog/tagArticleList.do?BLOGID=0IB1y&amp;amp;tagName=BBCode to HTML&quot; rel=&quot;tag&quot; target=&quot;_blank&quot;&gt;BBCode to HTML&lt;/a&gt;
	    </content>
	    	</entry>
      </feed>
