<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet href="http://rss.egloos.com/style/blog.xsl" type="text/xsl" media="screen"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
	<title>아름다운 프로그래밍</title>
	<link>http://hangulee.egloos.com</link>
	<description>즐겁게, 그리고 아름답게...!</description>
	<language>ko</language>
	<pubDate>Thu, 13 Dec 2007 09:55:40 GMT</pubDate>
	<generator>Egloos</generator>
	<image>
		<title>아름다운 프로그래밍</title>
		<url>http://pds6.egloos.com/logo/200711/21/49/d0002249.jpg</url>
		<link>http://hangulee.egloos.com</link>
		<width>80</width>
		<height>120</height>
		<description>즐겁게, 그리고 아름답게...!</description>
	</image>
  	<item>
		<title><![CDATA[ 스프링 노트 ]]> </title>
		<link>http://hangulee.egloos.com/1644210</link>
		<guid>http://hangulee.egloos.com/1644210</guid>
		<description>
			<![CDATA[ 
  아주 맘에 듭니다. 이런걸 만들어볼까 하는 생각을 했지만 미처 그럴만한 여유도 능력도 못되었는데 좋은게 있어서 씁니다. 앞으로는 주로 그곳에 글을 남기게 될 것 같습니다.<br />
<br />
<a href="http://hangulee.springnote.com">http://hangulee.springnote.com</a><br />
			 ]]> 
		</description>

		<comments>http://hangulee.egloos.com/1644210#comments</comments>
		<pubDate>Thu, 13 Dec 2007 09:55:40 GMT</pubDate>
		<dc:creator>이한길</dc:creator>
	</item>
	<item>
		<title><![CDATA[ WIPI-JAVA를 시작하다... ]]> </title>
		<link>http://hangulee.egloos.com/1601296</link>
		<guid>http://hangulee.egloos.com/1601296</guid>
		<description>
			<![CDATA[ 
  휴대폰에다가 간단한 프로그램을 만들어서 사용하고 싶었습니다. 그러면 PDA만은 못해도 늘 가지고 다니는 휴대폰이기에 활용하기가 좋을 것 같았거든요. 하지만 그런 휴대폰을 찾는게 쉽지 않았습니다. 그래서 생각하다가 WIPI-JAVA를 시작했습니다.(KLDP.ORG에서 어느분이 소개해주셨습니다)&nbsp;SKT꺼 휴대폰이라면 SK-VM이나 WIPI-JAVA둘중 하나를 지원하니까요. 그리고 둘은 매우 비슷합니다.<br><br>그런데 환경은 매우 제한적입니다. 사실 기대할 이유도 없지만 그래서 마치 자바스크립트로 브라우저 내에서 프로그래밍하기 위해 간단한 베이스 모듈을 만들듯이 만들기 시작했습니다. 한번은 조금 복잡하게 들어가다가 실패하고 두번째는 그럭저럭 괜찮은 모양이 나왔습니다. 제 생각에 그렇습니다. 그리과 말 그대로 그럭저럭 괜찮은 모양입니다. 그래서 간단히 소개하려고 합니다. 얼마나 도움이 될지는 모르겠습니다.<br><br>먼저 Page라는 추상 클래스를 만들어서 화면에 보여질 것들은 이것을 상속하게 합니다. 다음으로 PageContainer를 만들어서 Page들을 담게 합니다. 마지막으로 PageContainer를 이용하여 페이지를 담고 화면에 보여줄 PageCanvas를 만듭니다. PageCanvas는 Canvas라는 Displayable을 상속받으므로 Display에 setCurrent로 담아넣을 수 있습니다. 그리고 PageContainer는 Page를 상속하므로 그 자신도 다른 PageContainer 객체에 들어갈 수 있습니다.<br><br>소스를 보시면 아마도 이해가 되실거라 생각합니다. 파일을 첨부해야겠네요. 문제는 주석이 없습니다. 하지만 너무 간단해서 없이도 다 이해할 수 있으실 것입니다.<br>&nbsp;<br><a href="http://pds7.egloos.com/pds/200711/20/49/Page.java">Page.java</a>&nbsp; <br><a href="http://pds6.egloos.com/pds/200711/20/49/PageCanvas.java">PageCanvas.java</a>&nbsp; <br><a href="http://pds6.egloos.com/pds/200711/20/49/PageChangeListener.java">PageChangeListener.java</a>&nbsp; <br><a href="http://pds6.egloos.com/pds/200711/20/49/PageContainer.java">PageContainer.java</a><br><br>저기에 PageChangeListener은 Page에서 Canvas의 repaint를 호출할 수 없기 때문에 그 일을 대신 하기 위해서 사용됩니다. 보통 자바 SDK에 보면 이런 리스너는 여러개를 등록할 수 있게 하고 있지만 WIPI-JAVA의 특성상 최대한 간단하게 해야 하므로 하나만 가능하게 했습니다.<br><br>PS. WIPI-JAVA에 대한 소개나 입문에 대한 글을&nbsp;쓰려고 했지만&nbsp;그에 대한 자료들은 <a href="http://developer.xce.co.kr/">http://developer.xce.co.kr/</a> 에 있는데다가 WIPI-JAVA를 하려면 어짜피 위 사이트에 가입해서 에뮬레이터를 비롯한 자료를 받아야 하므로 위 사이트를 참고하시라고 적지 않았습니다.			 ]]> 
		</description>
		<category>WIPI-JAVA</category>

		<comments>http://hangulee.egloos.com/1601296#comments</comments>
		<pubDate>Tue, 20 Nov 2007 13:58:24 GMT</pubDate>
		<dc:creator>이한길</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 개발에 독이 되고 약이 되는 귀차니즘 ]]> </title>
		<link>http://hangulee.egloos.com/1601239</link>
		<guid>http://hangulee.egloos.com/1601239</guid>
		<description>
			<![CDATA[ 
  개인적인 사정으로 오랫동안 몸을 움츠렸었습니다. 그러면서 책을 좀 읽었지요.<br><ul><li>조엘 온 소프트웨어</li><li>조엘이 엄선한 블로그 베스트 29선</li><li>소프트웨어 컨플릭트 2.0</li><li>피플웨어</li><li>The Art of Unix Programming</li><li>OS구조와 원리</li><li>실용주의 프로그래머</li><li>해커와 화가</li><li>아키텍쳐 이론과 실제</li></ul><p>다 적었는지는 모르겠습니다. 책을 보고 적은것이 아니라서 이름이 정확한지도 모르겠군요. 하지만 이런 책들을 읽으면서 깊이 느낀바가 있었습니다. 프로그래밍을 하면서 겪게 되는 고충은 다들 비슷하고 그것을 해결하는 방법도 비슷합니다. 방법론을 다룬 책들이 특히 인상깊었는데 제가 개인적으로 내린 결론은 이러합니다.<br><br><span style="FONT-SIZE: 130%"><p></p><div style="TEXT-ALIGN: center"><span style="FONT-SIZE: 130%"><strong>코딩을 포함한 그 이전의 모든 단계에서는 귀찮아 하지 마라. 하지만 그 다음의 일들은 귀찮아 하라<br></strong></span></div><p></p></span><p></p><p><br>코딩을 하는 것을 포함하여 그 이전단계에서 뭔가 귀찮아서 일을 저지르면 두고두고 후회합니다. 특히 유지보수에서... 하지만 그 다음의 일들을 수작업으로 한다면 지치게 됩니다.<br><br>한가지 예로 실용주의 프로그래머 책에서 중복을 피하라고 강조합니다. 사실 프로그래밍 할 때 중복을 온전히 피하는것은 무척 귀찮은 일이 됩니다. 요즘 프로그래밍 하면서 중복되는 부분이 나타날 때 카피엔페이스트로 재활용하는 것은 무척 간단하지만 재활용 가능한 코드를 만들고 그것을 사용하게 하는 것은 상대적으로 귀찮은 작업이 됩니다.<br><br>개인적으로는 컨디션이 좋을 때에만 개발작업을 하는 것이 이렇게 하는데 도움이 된다는 생각이 듭니다. 실천하기는 힘들지만 예전에 썼던 글에도 나타난 운동하기나 1시간을 주기로 주기적으로 휴식을 취하기 등이 필요하다는 생각이 듭니다.<br><br>이런 그동안 몸을 움츠리고 있으면서 책을 읽고 내린 결론을 개발에 적용하면서&nbsp;블로그에 또 하나씩 글을 쓸까 합니다.</p>			 ]]> 
		</description>

		<comments>http://hangulee.egloos.com/1601239#comments</comments>
		<pubDate>Tue, 20 Nov 2007 13:31:52 GMT</pubDate>
		<dc:creator>이한길</dc:creator>
	</item>
	<item>
		<title><![CDATA[ Oh.pageYSoftScrollListener ]]> </title>
		<link>http://hangulee.egloos.com/261221</link>
		<guid>http://hangulee.egloos.com/261221</guid>
		<description>
			<![CDATA[ 
  Oh.pageYSoftScrollListener는 스크롤을 감지하여 알리는 객체이다. 이 객체는 스크롤이 일어났는지를 확인하기 위하여 계속해서 "document.body.scrollTop"를 살펴야 한다. 그리고 일어났을 경우 등록된 모든 리스너들을 호출한다.<br />
<br />
호출할 때에는 두가지 인자를 넘겨주는데 첫번째것은 현재의 "document.body.scrollTop"값이고, 두번째것은 소프트스크롤을 위한 "document.body.scrollTop"의 변화량이다. 사용할 메쏘드는 다음과 같다.<br />
<br />
<span style="font-weight: bold;">add</span><br />
리스너 등록, 함수를 인자로 호출한다<br />
<br />
<span style="font-weight: bold;">remove</span><br />
리스너 삭제, 등록한 함수를 인자로 호출하면 등록된 함수가 제거된다<br />
<br />
만약 등록된 리스너가 없다면 스크롤이 일어났는지를 감지하지 않으며, 리스너가 등록되면 다시 감지하기 시작한다.<br /><br />			 ]]> 
		</description>
		<category>Oh 라이브러리</category>

		<comments>http://hangulee.egloos.com/261221#comments</comments>
		<pubDate>Sat, 19 Aug 2006 12:46:45 GMT</pubDate>
		<dc:creator>이한길</dc:creator>
	</item>
	<item>
		<title><![CDATA[ Oh.mouseMotionListener ]]> </title>
		<link>http://hangulee.egloos.com/260781</link>
		<guid>http://hangulee.egloos.com/260781</guid>
		<description>
			<![CDATA[ 
  Oh.mouseMotionListener 객체는 마우스의 움직임을 감지하여 처리한다. 이 객체에는 다음과 같은 메써드가 제공된다.<br />
<br />
<span style="font-weight: bold;">add</span><br />
마우스 움직임을 감지해야 할 객체를 등록한다. 등록된 객체는 마우스가 이벤트를 발생시킬 때, 발생에 대한 메시지를 받을 메써드를 가지고 있어야 한다. 그 메써드의 이름은 "mouseMotionListener"이다. 이 메써드가 없는 객체는 마우스의 움직임이 감지되어도 아무런 메시지를 받을 수 없다. 그리고 위 메써드는 Event객체를 인자로 받는다.<br />
<br />
<span style="font-weight: bold;">remove</span><br />
더이상 마우스 움직음을 감지할 필요가 없는 객체를 삭제한다.<br />
<br />
<span style="font-weight: bold;">드래그의 처리</span><br />
이 객체는 특별히 등록하지 않는 객체라 하더라도 "onMouseDrag"라는 메써드를 가지고 있는 객체에게 그 메써드를 호출하여 마우스의 드래그를 알린다. "onMouseDrag"를 호출할 때 넘겨주는 인자는 Event객체, x축으로 이동한 거리, y축으로 이동한 거리이다.<br />
<br />
<span style="font-weight: bold;">chnageDragSource</span><br />
드래그와 관련된 메써드이다. 이 객체는 마우스의 드래그를 알릴 객체를 선택하는데, 마우스의 버튼이 눌러진 객체를 선택한다. 이 때, 선택된 객체를 바꾸어 다른 객체에게 마우스의 드래그를 알리고자 한다면 이 메써드를 사용해서 드래그 이벤트를 받을 객체를 지정할 수 있다<br />
<br />
<span style="font-weight: bold;">fire</span><br />
이 메쏘드는 document.onmousedown , document.onmouseup, document.onmousemove, document.onmouseover, document.onmouseout에 미리 등록하여 등록된 객체들에게 마우스의 움직임을 알린다.<br /><br />			 ]]> 
		</description>
		<category>Oh 라이브러리</category>

		<comments>http://hangulee.egloos.com/260781#comments</comments>
		<pubDate>Sat, 19 Aug 2006 10:04:55 GMT</pubDate>
		<dc:creator>이한길</dc:creator>
	</item>
	<item>
		<title><![CDATA[ Oh.onResize ]]> </title>
		<link>http://hangulee.egloos.com/260737</link>
		<guid>http://hangulee.egloos.com/260737</guid>
		<description>
			<![CDATA[ 
  Oh.onResize 객체는 Oh.onLoad와 비슷하게 동작한다. 단 객체 이름에서 알려주는 것처럼 전체 화면의 크기가 변할 때 등록한 함수들을 호출한다.<br />
<br />
단 한가지 더 제공되는 것은 remove메써드인데 이 메써드는 등록했던 함수를 삭제할 수 있다. 가끔 객체를 만들어서 스크린 크기가 변할 때마다 재배치하려고 했던 객체가 더 이상 사용할 필요가 없을 경우 삭제할 수 있다.<br />
<br /><br />			 ]]> 
		</description>
		<category>Oh 라이브러리</category>

		<comments>http://hangulee.egloos.com/260737#comments</comments>
		<pubDate>Sat, 19 Aug 2006 09:53:13 GMT</pubDate>
		<dc:creator>이한길</dc:creator>
	</item>
	<item>
		<title><![CDATA[ Oh.onLoad ]]> </title>
		<link>http://hangulee.egloos.com/260725</link>
		<guid>http://hangulee.egloos.com/260725</guid>
		<description>
			<![CDATA[ 
  이 객체는 처음 페이지가 로드될 때 실행되어야 할 코드들을 관리한다. 브라우저에서는 처음 페이지가 로드될 때 실행될 코드를 다음처럼 지정한다.<br />
<blockquote>window.onload = function(){ ... }</blockquote>그런데 이와같이 지정하다보면 코드 중간중간에 처음 로드될 때 실행되어야 할 코드를 지정해주고 싶다면 다음처럼 해 주어야 할 것이다.<br />
<blockquote>var before = window.onload<br />
window.onload = function() {<br />
&nbsp;&nbsp;&nbsp; before()<br />
&nbsp;&nbsp;&nbsp; ...<br />
}</blockquote>하지만 Oh.onLoad객체를 이용할 때는 다음과 같다.<br />
<blockquote>Oh.onLoad.add(function() {<br />
&nbsp;&nbsp;&nbsp; ...<br />
})</blockquote>그리고 다음번에 또 처음 로드될 때 실행되어야 할 코드가 생겼다면 위와같이 하나 더 추가하기만 하면 된다.<br />
<br />
Oh.onLoad객체는 window.onload 에 미리 이 객체의 fire메쏘드를 호출하여 추가된 모든 함수를 호출하여 실행시킨다.<br /><br />			 ]]> 
		</description>
		<category>Oh 라이브러리</category>

		<comments>http://hangulee.egloos.com/260725#comments</comments>
		<pubDate>Sat, 19 Aug 2006 09:49:34 GMT</pubDate>
		<dc:creator>이한길</dc:creator>
	</item>
	<item>
		<title><![CDATA[ Oh.simpleXMLParser ]]> </title>
		<link>http://hangulee.egloos.com/260631</link>
		<guid>http://hangulee.egloos.com/260631</guid>
		<description>
			<![CDATA[ 
  Oh.simpleXMLParser 객체는 간단한 XML을 파싱하여 객체로 만들어준다. 이 객체에는 parse와 scanner라는 메쏘드를 갖는데 이중 scanner는 parse가 호출하여 사용하는 메써드로 직접 호출할 필요는 없다.<br />
<br />
<span style="font-weight: bold;">parse</span><br />
이 메써드는 XMLDocument 객체를 인자로 받는다. 흔히 <span style="text-decoration: underline;">Ajax와 함께 사용</span>하는데 그 예를 보면 다음과 같다<br />
<blockquote>var f = function(req) {<br />
&nbsp;&nbsp;&nbsp; var result = Oh.simpleXMLParser(req.responseText)<br />
}<br />
<br />
Oh.Ajax.request("member.xml", f)</blockquote>위에서 받아온 XML 파일이 다음과 같다고 하자..<br />
<blockquote>&lt;memberinfo&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;member&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &lt;name&gt;한길&lt;/name&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &lt;email&gt;hangulee@gmail.com&lt;/email&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/member&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;member&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &lt;name&gt;철수&lt;/name&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &lt;email&gt;cholsu@test.com&lt;/email&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/member&gt;<br />
&lt;/memberinfo&gt;</blockquote>그렇다면 위의 <span style="font-weight: bold;">result</span>변수에 담긴 객체는 다음처럼 생성한것이 된다<br />
<blockquote>var result = {<br />
&nbsp;&nbsp;&nbsp; memberinfo : {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  member : [<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  { name : "한길" , email : "hangulee@gmail.com" } ,<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  { name : "철수" , email : "cholsu@test.com" }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  ]<br />
&nbsp;&nbsp;&nbsp; }<br />
}</blockquote>보고 눈치챘겠지만 한가지 제약이 있다. XML요소의 속성은 파싱에서 고려하지 않는다. 단지 요소만으로 이루어진 아주 간단한 XML문서만을 사용한다.<br />
<br />
그리고 결과물에 대해서도 같은 이름의 요소가 둘 이상이면 배열로, 하나면 바로 문자열로 이름에 대한 값을 저장한다.<br />
<br />
<br />
<br /><br />			 ]]> 
		</description>
		<category>Oh 라이브러리</category>

		<comments>http://hangulee.egloos.com/260631#comments</comments>
		<pubDate>Sat, 19 Aug 2006 09:24:00 GMT</pubDate>
		<dc:creator>이한길</dc:creator>
	</item>
	<item>
		<title><![CDATA[ Oh.Cookie ]]> </title>
		<link>http://hangulee.egloos.com/258819</link>
		<guid>http://hangulee.egloos.com/258819</guid>
		<description>
			<![CDATA[ 
  이 객체는 자바스크립트로 보다 쉽게 cookie의 값에 접근하도록 한다. 이 객체는 다음의 두가지 메써드를 제공한다.<br><br>여기서 이 처리 메써들의 특징은 주어진 문자열을 URL 인코드/디코드한다는 것이다. 즉 쿠키에 설정할 때에는 인코드하여 설정하고 받을때는 디코드하여 넘겨준다. 그렇기 때문에 이 객체의 메서드만을 이용할 때에는 문제가 없지만 다른 라이브러르를 같이 이용한다면 참고할 필요가 있다. 서버 베이스드 스크립트가 URL인코드하여 쿠키를 설정하고 디코드하여 읽게 하면 문자열이 UTF8한글 문자열인 경우에도 서로 아무런 문제없이 읽고 쓸 수 있기 때문에 이렇게 처리한다.<br><br>ps.이렇게 작성한것은 오래 전의 일이다. 그냥 했을 경우 문제를 발생시켰던 것으로 기억한다. 직접 해보고 결과를 알려주시면 좋겠다<br><br><span style="FONT-WEIGHT: bold">set</span><br>이 메써드는 "쿠기이름, 쿠키 값, 기간"을 순서대로 인자로 받는다.<br><br><span style="FONT-WEIGHT: bold">get</span><br>이 메써드는 "쿠키이름"을 인자로 받고 해당 쿠키 값을 리턴한다. 없다면 null을 리턴한다.<br>			 ]]> 
		</description>
		<category>Oh 라이브러리</category>

		<comments>http://hangulee.egloos.com/258819#comments</comments>
		<pubDate>Fri, 18 Aug 2006 15:40:52 GMT</pubDate>
		<dc:creator>이한길</dc:creator>
	</item>
	<item>
		<title><![CDATA[ Oh.Ajax ]]> </title>
		<link>http://hangulee.egloos.com/258772</link>
		<guid>http://hangulee.egloos.com/258772</guid>
		<description>
			<![CDATA[ 
  Ajax를 좀더 편리하게 사용하도록 해 주는 객체이다. 이 객체에서는 "request"라는 이름의 메써드를 제공하여 일을 수행한다. 무엇보다도 요청된 url에서 데이터를 받아오는 일을 순서적으로 수행하도록 하여 결과를 순서대로 넘겨주므로 받아온 데이터가 혼돈을 일으키지 않도록 한다. "reqeust"메써드의 선언은 다음과 같다.<br />
<br />
<span style="font-weight: bold;">function (url, callback, form)</span><br />
<br />
첫번째 인자는 데이터를 받아올 주소이다.<br />
<br />
두번째는 그것을 받아와서 그 데이터를 처리할 함수이다. 이 함수는 request객체를 인자로 주고, 아울러 그 객체가 가지고 있는 값이긴 하지만 성공여부와 상태를 인자로 준다.<br />
<br />
마지막 인자는 요청의 형태를 POST방식으로 하기 위해 사용한다. 그 FROM값으로 "FROM"엘리먼트 객체(요소)를 넘겨주면 그 값을 POST방식으로 주어진 URL에 보낸다. 사용하지 않으려면 null값을 주거나 undefined로 하면 된다.<br /><br />			 ]]> 
		</description>
		<category>Oh 라이브러리</category>

		<comments>http://hangulee.egloos.com/258772#comments</comments>
		<pubDate>Fri, 18 Aug 2006 15:27:38 GMT</pubDate>
		<dc:creator>이한길</dc:creator>
	</item>
</channel>
</rss>
