<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" version="2.0">

<channel>
	<title>Devspace@Crow</title>
	
	<link>http://crowmaniac.net/crowmania</link>
	<description>all about crowmania as a software creator</description>
	<lastBuildDate>Wed, 05 May 2010 13:15:16 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/crowmaniac" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="crowmaniac" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>디버깅: 마음가짐.</title>
		<link>http://crowmaniac.net/crowmania/?p=1527</link>
		<comments>http://crowmaniac.net/crowmania/?p=1527#comments</comments>
		<pubDate>Wed, 05 May 2010 13:15:16 +0000</pubDate>
		<dc:creator>까막</dc:creator>
				<category><![CDATA[Development Note]]></category>
		<category><![CDATA[공학적 문제 해결]]></category>
		<category><![CDATA[디버깅]]></category>
		<category><![CDATA[마음가짐]]></category>

		<guid isPermaLink="false">http://crowmaniac.net/crowmania/?p=1527</guid>
		<description><![CDATA[전 사실, 대학에서 공학을 전공했습니다. 그것도, 산업공학이란 시스템을 다루는 공학을 전공했지요. 대학시절이 제게 남긴 가장 큰 가르침은 시스템에 대한 정의와 공학적 문제 해결 방법입니다. 시스템에 대한 정의는 언젠가 설계와 관련한 글을 쓸때 써먹게 될 것이고, 오늘 이야기할 디버깅은 공학적 문제 해결 방법을 써먹게 되겠네요.
일을 하면서 느끼는 것은 디버깅을 어렵게 느끼는 사람들이 많다는 점입니다. 어렵게 느끼는 [...]]]></description>
			<content:encoded><![CDATA[<p>전 사실, 대학에서 공학을 전공했습니다. 그것도, 산업공학이란 시스템을 다루는 공학을 전공했지요. 대학시절이 제게 남긴 가장 큰 가르침은 시스템에 대한 정의와 공학적 문제 해결 방법입니다. 시스템에 대한 정의는 언젠가 설계와 관련한 글을 쓸때 써먹게 될 것이고, 오늘 이야기할 디버깅은 공학적 문제 해결 방법을 써먹게 되겠네요.</p>
<p>일을 하면서 느끼는 것은 디버깅을 어렵게 느끼는 사람들이 많다는 점입니다. 어렵게 느끼는 사람들 혹은 어렵게 느끼는 상황을 곰곰히 생각해보면, 어려운 이유는 단 하나입니다. 막막하다는 것이지요.  보통, 막막함에 당황하고, 당황하니 더 막막한 악순환의 고리로 빠져드는 경우가 많습니다. 일단은 침착해야 합니다.</p>
<p>차분하게 공학적 문제 해결 방법을 따라서 생각해보는게 좋습니다.</p>
<ol>
<li>문제를 탐색한다.</li>
<li>문제를 정의한다.</li>
<li>자료를 수집한다.</li>
<li>자료를 분석한다.</li>
<li>대안을 생성한다.</li>
<li>대안을 평가한다.</li>
<li>대안을 선정한다.</li>
<li>대안을 적용한다.</li>
<li>1번으로 돌아간다.</li>
</ol>
<p><br/></p>
<p>네. 사실 &#8216;당연한거 아냐?!&#8217; 라고 생각하기 쉬운 당연하고 자명한 이야기입니다만, 당황하게 되면 의외로 잊기 쉬운 기본적인 것들입니다. 타석에 들어선 야구선수가 공을 끝까지 보고 스윙을 해야하듯이 디버깅도 항상 차분하게 공학적인 자세로 접근해야 하는거죠. 아무리 시스템이 복잡하다해도, 아무리 답이 안보이는 것 같은 문제라 할지라도, 차분하게 접근하면 대부분의 버그들은 찾아낼 수 있습니다. 차분한 마음가짐이 있다면, 비로소 여러 테크닉들을 적용할 수 있게 되니까요. 어려운 버그는 없습니다. 다만 복잡해서 막막한 버그일 뿐이지요. 모든 버그는 그냥 버그일 뿐입니다. <img src='http://crowmaniac.net/crowmania/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://crowmaniac.net/crowmania/?feed=rss2&amp;p=1527</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>왜 개발자로 살고 있는가?</title>
		<link>http://crowmaniac.net/crowmania/?p=1522</link>
		<comments>http://crowmaniac.net/crowmania/?p=1522#comments</comments>
		<pubDate>Sun, 21 Feb 2010 15:04:07 +0000</pubDate>
		<dc:creator>까막</dc:creator>
				<category><![CDATA[Daily Log]]></category>

		<guid isPermaLink="false">http://crowmaniac.net/crowmania/?p=1522</guid>
		<description><![CDATA[정확한 질문은 &#8220;왜 삶의 여러 지층 중 하나가 개발자인가?&#8221; 겠지요.
문득, 미사를 드리러 가려고 샤워를 하는 도중에 이런 생각이 들었습니다. 음악을 하고 그림을 그리고 글을 쓰면서 프로그래밍으로 밥을 벌어먹고 있는데, 왜 하필이면 개발자로 먹고 살고 있는가? 그냥 잘하기 때문에? 가진 능력중 가장 경제적으로 뛰어난 것은 사실이고, 실제로 경제적인 부분은 전적으로 이쪽에 의지하고 있는 것도 사실입니다. 이쯤 [...]]]></description>
			<content:encoded><![CDATA[<p>정확한 질문은 &#8220;왜 삶의 여러 지층 중 하나가 개발자인가?&#8221; 겠지요.</p>
<p>문득, 미사를 드리러 가려고 샤워를 하는 도중에 이런 생각이 들었습니다. 음악을 하고 그림을 그리고 글을 쓰면서 프로그래밍으로 밥을 벌어먹고 있는데, 왜 하필이면 개발자로 먹고 살고 있는가? 그냥 잘하기 때문에? 가진 능력중 가장 경제적으로 뛰어난 것은 사실이고, 실제로 경제적인 부분은 전적으로 이쪽에 의지하고 있는 것도 사실입니다. 이쯤 되니 갑자기 이건 아니다라는 생각이 들더군요. 그러면서, 아 나도 서른이구나. 7년차구나. 라는 생각도.. (퍽)</p>
<p>가장 감명깊었던 책제목은 (내용말구요. 제목!) Just for fun입니다. 라이너스 토발즈씨의 자서전 제목이죠. 요즘 잃고 있었던 초심이 Just for fun이었던 것 같습니다. 대부분의 개발자들이 재미로 시작하지만, 어느새 그 재미를 잃고 있는게 아닌가 싶습니다. 이런 의구심이 드는 시점임에도, 일은 재밌습니다. 문제는 일이 재밌는 것이지 일을 재밌게 만들고 있지는 않다는 점이죠. 제 초심은 일을 재밌게 만드는 것이었으니까요. 잃었던 것을 찾은 이 기쁨은 뭐&#8230; 이루 말할 수 없습니다.</p>
<p>재미있는 일을 더 재밌게 만드는 것. 개발자로 오래 살아남는 가장 즐거운 방법이 아닐까 생각해봅니다. </p>
<p>그리고, 이 곳에 오신 당신은. 왜 지금의 직업을 갖고 계십니까?</p>
]]></content:encoded>
			<wfw:commentRss>http://crowmaniac.net/crowmania/?feed=rss2&amp;p=1522</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>집착하고 있는 것: 흐름</title>
		<link>http://crowmaniac.net/crowmania/?p=1518</link>
		<comments>http://crowmaniac.net/crowmania/?p=1518#comments</comments>
		<pubDate>Wed, 06 Jan 2010 14:30:48 +0000</pubDate>
		<dc:creator>까막</dc:creator>
				<category><![CDATA[Head Snapshot]]></category>
		<category><![CDATA[객체지향]]></category>
		<category><![CDATA[모델링]]></category>
		<category><![CDATA[프로그래밍]]></category>
		<category><![CDATA[흐름]]></category>

		<guid isPermaLink="false">http://crowmaniac.net/crowmania/?p=1518</guid>
		<description><![CDATA[몇몇 지인들은 알고있는 사실이지만, 최근 3년간 집착하고 있는 것은 &#8216;흐름&#8217;이다. 다분히, 들뢰즈적인데, 2004년에 처음 만나서, 가장 많은 영향을 준 사람이니 당연하다면, 당연한 사실이다. 이렇게 쓰면서도 이것이 들뢰즈적이라고 부를 수 있는 것인지 의문스럽다. 공부는 안하면서, 단초만 잡아서 공상만하고 있는 것도 사실이므로.
이런 생각을 하게 된 데에는, 회사에서 밥벌이로 작성하고 있는 소프트웨어가 처절할 정도로 흐름에 기반을 두고 있고, [...]]]></description>
			<content:encoded><![CDATA[<p>몇몇 지인들은 알고있는 사실이지만, 최근 3년간 집착하고 있는 것은 &#8216;흐름&#8217;이다. 다분히, 들뢰즈적인데, 2004년에 처음 만나서, 가장 많은 영향을 준 사람이니 당연하다면, 당연한 사실이다. 이렇게 쓰면서도 이것이 들뢰즈적이라고 부를 수 있는 것인지 의문스럽다. 공부는 안하면서, 단초만 잡아서 공상만하고 있는 것도 사실이므로.</p>
<p>이런 생각을 하게 된 데에는, 회사에서 밥벌이로 작성하고 있는 소프트웨어가 처절할 정도로 흐름에 기반을 두고 있고, 데이터의 흐름을 어떻게 하면 잘 처리해낼 수 있을 것인가가 관건이기 때문이다. 일반적으로 바라보는 객체지향 프로그래밍의 모델링 사상과는 어느 정도 동 떨어져 있는 것도 사실인데다, 복잡하기 그지없는 인터페이스의 난립에 지쳐있기 때문이기도 하다.</p>
<p>그런가하면, 이 &#8216;흐름&#8217;은 2001년에서 2003년까지 연구하던 주제이기도 하다. 당시에는 Business Process를 연구하고 있었고, BPMS와 Simulation Engine이 주요 과제였다. 이런 면에서 보면, 산업공학이란 전공을 선택한 것이 다행이라면 엄청난 다행이다. &#8216;흐름&#8217;은 절단 가능하고, 연결 가능한 그 무엇이다. BPMS와 Simulation Engine이 그랬던 것처럼. 그리고, 그 흐름에 연결되는 다양한 지반들을 어떻게 모델링 해낼 것인가가 현 시점에서 객체지향주의자로서 갖는 유의미한 과제다.</p>
<p>회사의 일정과 시장에서의 위치덕분에 지금 당장은 구현이 어려운 상황이다. 그런 이유로, 무언가 다른 일이 하나 필요할 듯 싶다. 가능하면, 올해 맞는 내 생일 전에 말이지. 씨익-</p>
]]></content:encoded>
			<wfw:commentRss>http://crowmaniac.net/crowmania/?feed=rss2&amp;p=1518</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>언어-사고: 프로그래밍은 왜 어려울까?</title>
		<link>http://crowmaniac.net/crowmania/?p=1351</link>
		<comments>http://crowmaniac.net/crowmania/?p=1351#comments</comments>
		<pubDate>Wed, 06 Jan 2010 05:25:23 +0000</pubDate>
		<dc:creator>까막</dc:creator>
				<category><![CDATA[Head Snapshot]]></category>
		<category><![CDATA[언어]]></category>
		<category><![CDATA[프로그래밍]]></category>

		<guid isPermaLink="false">http://crowmaniac.net/crowmania/?p=1351</guid>
		<description><![CDATA[프로그래밍을 한다고 하면, 사람들은 종종 안드로메다에 거주하는 외계인으로 간주하는 경우가 있다. 특히, 작업하는 것을 옆에서 보게되면 더더욱 심하다. 영어의 탈을 쓴 알아볼 수 없는 괴악한 텍스트 문서를 만들고, 이상한 프로그램을 돌려서 그들이 사용하는 소프트웨어를 만들어내니 그렇게 생각하는 것도 무리는 아닐 것이다. 그런데, 사실 사람이 쓰는 언어보다 프로그래밍 언어 자체는 쉽다. 애매모호함도 덜하거니와, 기계적으로 맞아 떨어져야하는 [...]]]></description>
			<content:encoded><![CDATA[<p>프로그래밍을 한다고 하면, 사람들은 종종 안드로메다에 거주하는 외계인으로 간주하는 경우가 있다. 특히, 작업하는 것을 옆에서 보게되면 더더욱 심하다. 영어의 탈을 쓴 알아볼 수 없는 괴악한 텍스트 문서를 만들고, 이상한 프로그램을 돌려서 그들이 사용하는 소프트웨어를 만들어내니 그렇게 생각하는 것도 무리는 아닐 것이다. 그런데, 사실 사람이 쓰는 언어보다 프로그래밍 언어 자체는 쉽다. 애매모호함도 덜하거니와, 기계적으로 맞아 떨어져야하는 언어이기 때문에 쉬운건 사실이다. 그렇다면, 왜 사람들은 프로그래밍을 어려워할까? 답은 사고에 있다.</p>
<p>인간이 사용하는 자연어는 일반적인 사고의 틀내에서 존재하지만, 프로그래밍 언어는 특정한 목적에 의해 특정한 사고의 틀내에 존재한다. 이 사고방식이 절차지향 프로그래밍이라든가 객체지향 프로그래밍이라든가 함수형 프로그래밍같은 거다. 이 사고방식은 컴퓨터라는 기계의 작동방식에 그 근원을 두고 있기 때문에 자연어의 사고방식과 유사하지만 다르다. 그리고, 이 차이가 어려움을 가져온다. 한가지 재밌는 것은, 자연어의 사고방식과 유사한 사고방식의 언어를 접하게 되면, 프로그래머도 난감해한다는 점이다. 기존의 방식과는 다르므로.</p>
<p>쉬운 프로그래밍은 근본적으로 불가능할지도 모른다. 하지만, 프로그래밍을 쉽게 배우려면, 언어나 문법에 집중하는게 아니라 그 사고의 작동방식에 초점을 맞추어야하지 않을까? </p>
]]></content:encoded>
			<wfw:commentRss>http://crowmaniac.net/crowmania/?feed=rss2&amp;p=1351</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>이글루스에 개설했습니다.</title>
		<link>http://crowmaniac.net/crowmania/?p=1513</link>
		<comments>http://crowmaniac.net/crowmania/?p=1513#comments</comments>
		<pubDate>Sat, 02 Jan 2010 15:22:02 +0000</pubDate>
		<dc:creator>까막</dc:creator>
				<category><![CDATA[Daily Log]]></category>

		<guid isPermaLink="false">http://crowmaniac.net/crowmania/?p=1513</guid>
		<description><![CDATA[네. 이사간다는 이야기는 아닙니다. 정리하면서 사라졌던 분류의 글들을 쓰기 위해 공간을 하나 더 만들었습니다. 사실, 이 블로그에 쓰는 글들이 지적 허영이가득 찬 글들이기도 하거니와, 그냥 무거워진 이 공간말고, 가벼운 공간이 하나 더 필요하다는 요구와 즉흥적인 지름에 하나 더 만든겁니다. 인생 뭐 있나요.
어쩌면, 포스트의 절대적인 수로는 역전현상이 나타날지도 모르겠습니다만. 과거 블로그의 제목이 &#8216;Crow&#8217;s Maniacal World&#8217;이던 시절에서 [...]]]></description>
			<content:encoded><![CDATA[<p>네. 이사간다는 이야기는 아닙니다. 정리하면서 사라졌던 분류의 글들을 쓰기 위해 공간을 하나 더 만들었습니다. 사실, 이 블로그에 쓰는 글들이 지적 허영이가득 찬 글들이기도 하거니와, 그냥 무거워진 이 공간말고, 가벼운 공간이 하나 더 필요하다는 요구와 즉흥적인 지름에 하나 더 만든겁니다. 인생 뭐 있나요.</p>
<p>어쩌면, 포스트의 절대적인 수로는 역전현상이 나타날지도 모르겠습니다만. 과거 블로그의 제목이 &#8216;Crow&#8217;s Maniacal World&#8217;이던 시절에서 Devspace@Crow로 넘어오면서 사라져버린 다른 제 자신을 적어내는 공간이니 당연한 것일지도 모릅니다.</p>
<p>여전히, 이 곳은 쓰던 글들과 써야할 글들이 올라옵니다. 지금 쓰고 있는 글만 3개정도 되는군요. (개요잡고 고민하는 글을 이야기하는 겁니다. 제목과 주제만으로 치면 더 많&#8230; orz) 하지만, 이 곳과 텀블러에 쓰지 않던 글들이 올라오겠지요. 워낙에 관심분야도 넓고 하는 짓도 많아서 어쩔 수 없나봅니다.</p>
<p>그럼. 돌아온 <a href="http://crowmania.egloos.com">Crow&#8217;s Maniacal World</a>를 소개합니다. 씨익-</p>
]]></content:encoded>
			<wfw:commentRss>http://crowmaniac.net/crowmania/?feed=rss2&amp;p=1513</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>웹이 아닌 앱의 시대가 오고있다.</title>
		<link>http://crowmaniac.net/crowmania/?p=1493</link>
		<comments>http://crowmaniac.net/crowmania/?p=1493#comments</comments>
		<pubDate>Wed, 16 Dec 2009 12:56:02 +0000</pubDate>
		<dc:creator>까막</dc:creator>
				<category><![CDATA[Head Snapshot]]></category>
		<category><![CDATA[App]]></category>
		<category><![CDATA[SNS]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[앱]]></category>
		<category><![CDATA[웹]]></category>

		<guid isPermaLink="false">http://crowmaniac.net/crowmania/?p=1493</guid>
		<description><![CDATA[이 글은 링크없는 블로그: 반쪽짜리 블로그에서 출발하여, @minoci님, @pariscom님과의 대화를 통해 발전해서 쓰여졌습니다. 두 분께 감사드립니다. 

웹은 HTTP프로토콜을 기반으로 HTML을 통한 유연한 링크를 이용해 정보사이의 소통이 가능한 길을 열었고, 이는 블로그와 위키를 만나면서 새로운 소통의 시대를 열었다고 해도 과언이 아니다. 하지만, 이 소통의 시대는 현대사회가 아직도 풀지 못하고 있는 장벽에 가로막혔다. 지정학적 혹은 정치학적 요인에 [...]]]></description>
			<content:encoded><![CDATA[<p><em>이 글은 <a href="http://minoci.net/1019">링크없는 블로그: 반쪽짜리 블로그</a>에서 출발하여, <a href="http://twitter.com/minoci">@minoci</a>님, <a href="http://twitter.com/pariscom">@pariscom</a>님과의 대화를 통해 발전해서 쓰여졌습니다. 두 분께 감사드립니다. <img src='http://crowmaniac.net/crowmania/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
</em></p>
<p>웹은 HTTP프로토콜을 기반으로 HTML을 통한 유연한 링크를 이용해 정보사이의 소통이 가능한 길을 열었고, 이는 블로그와 위키를 만나면서 새로운 소통의 시대를 열었다고 해도 과언이 아니다. 하지만, 이 소통의 시대는 현대사회가 아직도 풀지 못하고 있는 장벽에 가로막혔다. 지정학적 혹은 정치학적 요인에 의해 갈라진 국가라는 개념이 인간사이를 막고 있는 것처럼, 이 소통의 시대는 호스트(서비스업체)라는 장벽에 가로막혀 버렸다. 무서울 정도로 국가의 개념과 호스트의 현실은 연계되는데, 현실세계에서 국가의 힘이 결국 국민의 수에 의존하는 것과 마찬가지로 호스트의 가치는 사용자의 수에 의존한다. 또한, 이민을 막는 최종적 발목이 인간관계라는 점을 비추어보아도, 웹에서 유사하게 작동한다. 호스트를 이동하는 것은 존재하던 관계를 버리고 새로운 관계를 생성해야 함을 의미한다. 게다가, 각 호스트에 모인 사람들의 특성은 국가가 제시하는 민족주의와 유사하게 사람들 사이의 집단의식을 이끌어낸다. 인간이 국가라는 틀에 갖혀있는 것처럼, 호스트 속에 갖혀버린다.</p>
<p>올블로그나 블로그코리아 같은 메타업체들이 힘을 쓰지 못하는 것도 마찬가지의 이유다. 대다수의 사람들은 외국과 교류하지 않는다. 지정학적으로 가까운 사람들과 소통하기 마련이며, 다른 문화의 사람들에게 배타적인 심리를 갖기도 한다. 호스트도 마찬가지다. 대다수의 웹이용자들은 자신이 사용하는 호스트내에서 제공하는 아쉬울 것 없는 기능들을 이용하여, 자신의 주변을 만들어간다. 저 멀리에 있는 다른 호스트로 찾아가서 애써 관계를 만들 이유는 없는 것이다.</p>
<p>초창기의 블로고스피어를 생각해보면, 이는 더욱 자명하다. 초창기의 호스트들은 사람들이 원하는 소통량을 달성할 만큼 이용자수를 갖고 있지 못했다. 따라서, 다른 호스트에 있는 사용자들과 소통할 필요를 느꼈고, 메타사이트의 출범과 함께 블로고스피어는 빅뱅을 맞이하는 듯 했다. 하지만, 이용자수가 증가하고 각각의 호스트들 내에서 원하는 소통량을 달성하게 된 사용자들은 점점 메타사이트에 가야할 이유를 잃었다. 이것이 이 블로그의 트래픽유입이 대부분 검색엔진과 RSS리더가 된 이유일 것이다.</p>
<p>하지만, 웹은 RSS/ATOM의 등장과 웹서비스의 발명을 통해 기능을 외부로 노출하는 가능성을 맞이한다. 일종의 국제협약이 생긴 것이다. 페이지를 표현presentation중심이 아닌 의미content중심으로 바라볼 수 있다는 가능성은, 웹을 기반으로 컨텐츠간의 융합을 가능케 했다. 하지만, 여전히 대다수의 사람들은 이 협약을 사용할 필요성을 느끼지 못한다. 여전히 그들은 만족하고 있으므로.</p>
<p>하지만, 쓰기 힘든 글을 기반으로 하는 블로그를 위시한 출판개념의 기존의 웹은 SNS를 맞이하며 변화를 시작한다. 고정된 의미가 아닌 흐르는 소통을 기반으로 하는 SNS들은 웹에서 발명된 것들을 차용하며, 서비스간의 교차점을 만들어냈다. 대표적인 사례가 <a href="http://www.twitter.com">Twitter</a>인데, Twitter는 이미 플랫폼이란 이야기가 나올 정도로 수많은 파생물을 만들며 지금 이 시간에도 변화하고 있다. 정치적 위치와 물리적 한계가 소통을 제약하는 현실세계와는 달리 SNS는 기민함과 익명성을 무기로 소통의 흐름을 가속화하고 있다. SNS는 기존의 웹을 백엔드화 하고 있으며, 이러한 경향은 지속될 것으로 생각된다.</p>
<p>이런 긍정적인 변화에도 불구하고, SNS역시 국가란 개념에서 벗어나기는 힘들다. Twitter, 페이스북, 미투데이, 싸이월드 등의 SNS서비스들은 이전의 웹보다는 나아졌지만, 여전히 호스트라는 장벽에서 벗어나고 있지 못하다. 여기에서 가능성을 하나 찾을 수 있다면, 이전의 웹이 브라우져에 기반하여 제약되고 있었다면, 현대의 웹은 RSS와 웹서비스를 이용한 기능의 노출을 이용해 브라우져가 아닌 앱으로 이용이 가능해지고 있다는 사실이다. 모바일 정보처리장치들의 발전과 궤를 같이하는 것이지만, 단지 그것만은 아니다. 웹에서는 구현하기 어려운 것들이 앱에서는 손쉽게 구현이 가능하다. 실제로 웹이란 인터페이스상에서는 단순한 동기화만 가능하지만, 앱을 이용하게 되면 여러 호스트 사이의 유기적인 통합이 가능하다. <a href="http://www.facebook.com">Facebook</a>과 <a href="http://twitter.com">Twitter</a>를 통합한 <a href="http://www.tweetdeck.com/">TweetDeck</a>이 좋은 사례가 될 것이다. (비록 현 시점에서는 좀 단순한 형태이긴 하지만)</p>
<p>블로그의 출현이 만들어내고 SNS가 가속화하고 있는 RSS/ATOM와 웹서비스, 그리고 이를 잘 활용하여 유기적인 형태로 만들어지고 있는 앱. SNS가 더 널리 사용되고 지속적인 발전을 하게 된다면, 이에 따라 앱 역시 발전하게 될 것이다. 그리고, SNS사이의 표준적인 -dejure이든 defacto이든- 프로토콜이 성립한다면, 웹브라우져는 의미의 지반을 보는 뷰어의 역할을 하게 되고 앱은 그 지반들을 이어주는 소통의 혈관이 될 것이다. 그리고, 모바일의 발전은 소통의 순간을 키보드에서 독립시킬 것이다. 아니, 이미 독립 시키고 있다. 이러한 것들이 서로 만나면서, 결국 국가란 개념이 웹에 뿌리내린 호스트라는 현상은 소통을 제약하지 못하게 될 것이다. </p>
<p>물론, 이 글이 옛날에 쓰여진 허무맹랑한 소설이 될 가능성이 없는 것은 아니다. 하지만, 빅브라더가 이미 현실로 다가온 이 시점에서 정보기술이 사람들의 소통을 억압하는 것이 아니라 이를 가속화했으면 좋겠다는 작은 희망에서 출발한 생각이므로 이대로 되었으면 좋겠다. 물론, 소통이 발전하는 만큼 감시도 발전하겠지만.</p>
<div style="font-size:0.9em">
ps1. 확정형의 표현을 피하는 편이지만, 왠지 오늘은 피할 길이 없다.<br />
ps2. 여러분은 지금 마이크로네이션에서 글을 읽고 계시고, 저는 텀블러에 대사관을 건설한 게 되는군요. 으응?!<br />
ps3. 이 참에 다른데도 대사관을 세워볼까.. (참앗!)
</div>
]]></content:encoded>
			<wfw:commentRss>http://crowmaniac.net/crowmania/?feed=rss2&amp;p=1493</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>애플의 폐쇄구조</title>
		<link>http://crowmaniac.net/crowmania/?p=1486</link>
		<comments>http://crowmaniac.net/crowmania/?p=1486#comments</comments>
		<pubDate>Wed, 16 Dec 2009 04:15:00 +0000</pubDate>
		<dc:creator>까막</dc:creator>
				<category><![CDATA[Head Snapshot]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[맥]]></category>
		<category><![CDATA[아이폰]]></category>
		<category><![CDATA[애플]]></category>

		<guid isPermaLink="false">http://crowmaniac.net/crowmania/?p=1486</guid>
		<description><![CDATA[컴퓨터 하드웨어와 OS를 동시에 만드는 회사는 그리 흔하지 않다. 기억하기로는 애플, Sun, HP, SGI, IBM 정도 일텐데, 각자 특징을 가지고 있다. 이 와중에서, 폐쇄적인 설계구조로 욕먹는 회사는 아마 애플뿐이리라 생각된다. Sun의 Solaris는 x86계열의 CPU(특히, 옵테론)을 적용하기 위해 x86으로 포팅된게 아닌가 싶을 정도로 자사 플랫폼에서만 사용되던 OS였고, HP의 HP-UX나 IBM의 AIX등은 아예 자사 하드웨어 플랫폼에서만 돌아간다. [...]]]></description>
			<content:encoded><![CDATA[<p>컴퓨터 하드웨어와 OS를 동시에 만드는 회사는 그리 흔하지 않다. 기억하기로는 애플, Sun, HP, SGI, IBM 정도 일텐데, 각자 특징을 가지고 있다. 이 와중에서, 폐쇄적인 설계구조로 욕먹는 회사는 아마 애플뿐이리라 생각된다. Sun의 Solaris는 x86계열의 CPU(특히, 옵테론)을 적용하기 위해 x86으로 포팅된게 아닌가 싶을 정도로 자사 플랫폼에서만 사용되던 OS였고, HP의 HP-UX나 IBM의 AIX등은 아예 자사 하드웨어 플랫폼에서만 돌아간다. (고 알고있다.)</p>
<p>애플의 폐쇄구조를 가지고 수많은 이야기들이 오고가지만, Mac OS의 핵심부분인 Kernel이 공개되어있다는 사실은 아는지 모르겠다. 2000년경 Darwin이란 이름으로 공개가 되었으며, 해킨토시(Mac OS X을 일반 PC에서 돌리기 위한 일련의 작업들)에서 많이 사용되는 부두커널같은 녀석도 결국은 Darwin의 소스코드를 이용하여 특정 플랫폼에 맞게 작업하는 것으로 알고 있다. 물론, Quartz나 Cocoa같은 커널 위에 올라가는 다른 부분들은 공개되지 않지만, 의외로 애플에서 공개적으로 개발하는 것은 많다.</p>
<p>현대 컴퓨팅 환경에서 가장 중요한 컴포넌트라면 웹브라우저의 렌더링엔진을 꼽을 수 있다. 애플의 Safari에서 사용하는 엔진은 <a href="http://webkit.org/">WebKit</a>인데, KDE 프로젝트에서 진행하던 KHTML+KJS 프로젝트의 분기branch로 시작한 공개 프로젝트다. <a href="http://trac.webkit.org/wiki/WebKit%20Team">WebKit Team</a>에 가보면, 애플과 구글의 개발자들이 참가하고 있는 것을 알 수 있다. 반면, 전통적으로 소프트웨어 개발에서 가장 중요한 컴포넌트라면 소스코드를 번역하여 기계어 코드를 생산하는 컴파일러를 꼽을 수 있다. 애플은 주목받고 있는 오픈소스인 <a href="http://llvm.org/">LLVM</a> 프로젝트에 투자하고 있다. 역시, <a href="http://llvm.org/developers.cgi">LLVM Developers</a>를 살펴보면, (WebKit처럼 잘 나와있지는 않지만) 애플의 개발자가 있음을 알 수 있다. </p>
<p>물론, 이러한 사항들이 애플이 갖고 있는 폐쇄적인 구조에 대한 변명거리가 될 수는 없다. 하지만, 애플을 컴퓨터 제조업체가 아닌 가전제품 업체로 놓고 생각한다면, 이야기는 좀 달라진다. 삼성이나 LG가 자신들의 제품에 대해서 공개하는 범위와 애플이 자신들의 제품에 대해 공개하는 범위를 놓고 보면 답이 나온다. 휴대폰만 봐도 그렇다. 애플의 휴대폰에서 작동하는 소프트웨어를 만드는 것과 삼성이나 LG의 휴대폰에서 작동하는 소프트웨어를 만드는 것을 비교해보면 자명하다. 삼성이나 LG에는 공개된 SDK가 없다. 게다가, 이들이 공개적으로 개발하는 것도 없다. 그 내부에서 무엇이 일어나고 있는지는 아무도 모른다.</p>
<p>애플의 폐쇄적인 구조에 대한 비판은 Mac의 경우, 보통 성능에 비해 비싼 가격에서 출발하는데, 조립컴퓨터를 사용하던 사람들의 이야기가 아닐까 생각된다. 잘 구성된 하드웨어 위에 그 하드웨어의 성능을 잘 뽑아내는 OS를 얹고, 더불어 그 둘 사이가 잘 연계되어 별 문제없이 (즉, 하드웨어와 OS의 연계에 뇌를 낭비하지 않고) 쓸 수 있는 컴퓨터가 있다면, 성능은 기본만 해주면 크게 문제될 영역은 아니다. 남은 영역은 가격인데, 가격면에서 본다 하더라도 그렇게 많이 비싼편은 아니다. 안정적인 하드웨어 구성과 OS와의 연계에서 오는 장점을 생각해본다면, 사실 이득을 본다고 할 수 있다. 물론, 일반적으로 Windows를 사용하는 PC들에게서 얻은 복잡한 세팅문제에서 출발하는 이야기일 것이다. 하지만, 생각해보자. TV나 DVD 플레이어를 구입하고 세팅에 신경쓰는 사람은 없다. 컴퓨터도 매한가지 아닐까? Let me free. 그냥 컴퓨터로 할 일을 하게 해달라.</p>
<p>연장선상에서 컴퓨터를 별세계의 이야기로 두지 않고, 그냥 가전제품이란 관점에서 보면, 삼성이나 LG가 불법복제 생산품들을 막으려고 애쓰는거나 별반 다를게 없다. 삼성이나 LG가 휴대폰이나 TV같은 제품들의 내부구조나 소프트웨어를 공개하지 않듯이, 애플도 마찬가지다. 그리고, Mac OS X은 애플입장에서는 자사의 제품들에서 작동시키기 위한 OS이지 소프트웨어로 판매하기 위한 OS는 아니다. 게다가, Mac OS X을 공개하거나 다른 플랫폼에 설치할 수 있도록 개방하게 된다면, 애플입장에서는 거기서 발생하는 수익보다 그걸 유지하기 위해서 들어가야하는 비용이 훨씬 커지기 마련이다. MS의 Hardware Compatibility Lab을 생각해보라. 생각만해도 머리아프다. </p>
<p>그리고, 최근에 애플의 폐쇄구조에 대한 이야기가 나오면, iTunes App Store에 대한 이야기가 따라나오기 마련이다. 허나, App Store가 폐쇄적이라는 이야기에 대해서는 동감하지 못하겠다. 애시당초 전혀 다른 Platform이다. 그러니까, 천문학적으로 말하자면 전혀 다른 행성이고, 생물학적으로 말하자면 전혀 다른 생태계다. 애시당초, 스마트폰이 무엇인지도 애매하다. 그리고, 클릭 몇번으로 소프트웨어를 찾아서 다운로드 받는 건, 기존의 휴대폰에도 있던 기능이다. 그 제어 권한이 통신사에서 애플로 넘어갔다는게 첫번째 차이이고, 개발자-컨텐츠 제공자-의 범위가 일반 개발자에게까지 확대 되었다는 점이 두번째 차이이다. 애플의 관리하에 있다는 것이 폐쇄적이란 이야기로 이어지는 것은 어불성설이다. 권한이 바뀌고, 영역이 넓어졌을 뿐이다. Auction이나 G마켓도 폐쇄적이란 말인가?</p>
<p>결론적으로 보자면, 가전업체로서의 애플은 생각보다 그리 폐쇄적이지 않고, 생각보다 많이 공개되어 있고, 개방되어 있다. 그렇다고 애플의 단점이 없는 것은 아니다. 하드웨어와 소프트웨어의 통합이라는 강점을 이용해 소비가전시장에서 돌풍을 일으켜 온 애플이지만, 하드웨어와 소프트웨어를 둘 다 한다는 것은 결국 양쪽에서 모두 경쟁해야 한다는 점이다. 현재는 연합전선의 형태로 단일전선을 유지하지만, 하드웨어 전선과 소프트웨어 전선이 분리되는 순간 애플의 위기는 다가오지 않을까 생각한다. 물론, 애플의 가장 큰 위기는 잡스의 건강이겠지만.</p>
]]></content:encoded>
			<wfw:commentRss>http://crowmaniac.net/crowmania/?feed=rss2&amp;p=1486</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>자기전에 생각나서…</title>
		<link>http://crowmaniac.net/crowmania/?p=1482</link>
		<comments>http://crowmaniac.net/crowmania/?p=1482#comments</comments>
		<pubDate>Mon, 14 Dec 2009 15:42:46 +0000</pubDate>
		<dc:creator>까막</dc:creator>
				<category><![CDATA[Daily Log]]></category>

		<guid isPermaLink="false">http://crowmaniac.net/crowmania/?p=1482</guid>
		<description><![CDATA[워우&#8230; 역시나 워드프레스 앱이있군요.. 꺄악. 이걸로 저도 모바일블로거??? 
제한적인 것 같긴하지만 상당히 유용할 듯 하긴합니다. 으흣-
일단은 태그같은 걸 때려박기는 힘들듯하고.. 간단힌 포스트를 올리는 정도로는 유용할 듯&#8230;
]]></description>
			<content:encoded><![CDATA[<p>워우&#8230; 역시나 워드프레스 앱이있군요.. 꺄악. 이걸로 저도 모바일블로거??? </p>
<p>제한적인 것 같긴하지만 상당히 유용할 듯 하긴합니다. 으흣-</p>
<p>일단은 태그같은 걸 때려박기는 힘들듯하고.. 간단힌 포스트를 올리는 정도로는 유용할 듯&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://crowmaniac.net/crowmania/?feed=rss2&amp;p=1482</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Let me free: 생각대로 하면 되고.</title>
		<link>http://crowmaniac.net/crowmania/?p=1478</link>
		<comments>http://crowmaniac.net/crowmania/?p=1478#comments</comments>
		<pubDate>Tue, 08 Dec 2009 06:28:32 +0000</pubDate>
		<dc:creator>까막</dc:creator>
				<category><![CDATA[Daily Log]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[아이폰]]></category>

		<guid isPermaLink="false">http://crowmaniac.net/crowmania/?p=1478</guid>
		<description><![CDATA[애플에서 만든 iMac. 즉, Mac OS X을 처음 써보고 꽤 큰 쇼크를 먹었다. 그냥, 컴퓨터로 하고 싶은걸 하면 되었다. 하드웨어나 드라이버 같은건 신경쓰지 않아도 되었다. 그냥 하고 싶은걸 하면 된다. 컴퓨터 가격이 아깝지 않은 최초의 순간이었다. (물론 쓰다 불편한 건 이것 저것 깔아서 바꾸긴 하지만.. 지금 내 맥에는 그런 류의 유틸리티는 없다고 봐도 된다. 그냥 [...]]]></description>
			<content:encoded><![CDATA[<p>애플에서 만든 iMac. 즉, Mac OS X을 처음 써보고 꽤 큰 쇼크를 먹었다. 그냥, 컴퓨터로 하고 싶은걸 하면 되었다. 하드웨어나 드라이버 같은건 신경쓰지 않아도 되었다. 그냥 하고 싶은걸 하면 된다. 컴퓨터 가격이 아깝지 않은 최초의 순간이었다. (물론 쓰다 불편한 건 이것 저것 깔아서 바꾸긴 하지만.. 지금 내 맥에는 그런 류의 유틸리티는 없다고 봐도 된다. 그냥 필요한 것만 깔려있다.) PC를 쓸때 했던, 각종 OS관련 설정이나 삽질은 없었다.</p>
<p><a href="http://blog.cnrocks.net/n-95">내가 위키를 쓰지 않는 이유</a> 역시 CN의 그것과 동일하다. personal wiki가 유용해지는 시점은 강의노트를 정리할때 뿐이다. 강의노트는 특성상 링크가 유용할 때가 많은데다가, 책의 내용을 요약하는 경우가 많으므로 대다수의 위키에서 제공하는 Table of Contents 기능이 &#8220;매우&#8221; 유리하다. 또한, 강의노트는 작성 시간에 크게 상관없다. 생각나는 것들을 정리하는 블로그. 블로그의 어원이 Web Log라는 점을 돌이켜보자. 블로그는 어떤 사람의 생각 혹은 행동의 로그다. 일기를 백과사전처럼 쓰는 사람이 없듯이, 몇몇 아티클을 쓰기위해 위키를 쓸 필요는 없는거다.</p>
<p>그냥, 원하는 것을 찾아서 있으면 쓰고, 없으면 만들면 된다. 자연스럽게 쓰면 된다. 시스템에 의해 불필요한 행동이 늘어나는 것 만큼 짜증나는 일이 또 있으랴. Mac과 PC의 차이는 &#8220;생각대로 하면 되고&#8221;에 존재한다. &#8220;아는대로 하면 되고&#8221;가 아니다.</p>
<p>이럴땐 이걸 쓰고 저럴땐 저걸 쓰면 된다. 구글Docs도 혁명적으로 생각하는 사람들이 있는데, 마찬가지다. 그냥 구글Docs가 필요할때 쓰고, MS Office가 필요할때 쓰고, Open Office가 필요할때 쓰면 된다. 그 필요의 정당성에 대해서는 당연히 고민해보아야 하겠지만.</p>
<p>지난번의 투정을 버리고, 아이폰을 구매한 이유도 마찬가지다. 결국은 귀찮았다. WM기반의 핸드폰을 구매할 경우의 삽질, 아이팟터치를 샀을 때의 삽질을 생각해보니, 막막했다. -_-;</p>
<p>어떤 시스템을 사용하기 위해 필요한 Learning Curve와 사용자가 유지해야 하는 Brain Clock수가 문제인거다. 그냥, 최대한 간단하게 원하는 기능을 쓸 수 있게 해달라. 인간의 뇌는 해야할 일이 굉장히 많으므로. <img src='http://crowmaniac.net/crowmania/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>네. 그래서 아이폰 샀다구요. (아니잖아 이건!!)</p>
]]></content:encoded>
			<wfw:commentRss>http://crowmaniac.net/crowmania/?feed=rss2&amp;p=1478</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>MSVC 2008 STL vector</title>
		<link>http://crowmaniac.net/crowmania/?p=1457</link>
		<comments>http://crowmaniac.net/crowmania/?p=1457#comments</comments>
		<pubDate>Thu, 26 Nov 2009 01:58:35 +0000</pubDate>
		<dc:creator>까막</dc:creator>
				<category><![CDATA[Daily Log]]></category>

		<guid isPermaLink="false">http://crowmaniac.net/crowmania/?p=1457</guid>
		<description><![CDATA[사건의 발단은 VC9으로 테스팅하던 코드를 VC7.1로 포팅하면서 발생했습니다. 이상한 점은 VC7.1이 더 빠른겁니다. ?! 그것도 무려 60%정도였습니다. VC7.1은 STLPort를 사용하고 있었고, VC9은 MS에서 제공하는 녀석을 쓰고 있었지요.
일단, 코드부터 봅시다.
C++:




// STLPort 5.2.1 _vector.h:121


typedef _Tp value_type;


typedef value_type* pointer;


typedef const value_type* const_pointer;


typedef value_type* iterator;


typedef const value_type* const_iterator; 






C++:




// MSVC 2008 vector:1886


// 줄바꿈은 제가 한겁니다. @_@


typedef _Vb_const_iterator&#60;size_type, difference_type, _Myt&#62; [...]]]></description>
			<content:encoded><![CDATA[<p>사건의 발단은 VC9으로 테스팅하던 코드를 VC7.1로 포팅하면서 발생했습니다. 이상한 점은 VC7.1이 더 빠른겁니다. ?! 그것도 무려 60%정도였습니다. VC7.1은 STLPort를 사용하고 있었고, VC9은 MS에서 제공하는 녀석을 쓰고 있었지요.</p>
<p>일단, 코드부터 봅시다.</p>
<div class="syntax_hilite"><span class="langName">C++:</span>
<div id="cpp-4">
<div class="cpp">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #ff0000;">// STLPort 5.2.1 _vector.h:121</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000ff;">typedef</span> _Tp value_type;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000ff;">typedef</span> value_type* pointer;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000ff;">typedef</span> <span style="color: #0000ff;">const</span> value_type* const_pointer;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000ff;">typedef</span> value_type* iterator;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000ff;">typedef</span> <span style="color: #0000ff;">const</span> value_type* const_iterator; </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<div class="syntax_hilite"><span class="langName">C++:</span>
<div id="cpp-5">
<div class="cpp">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #ff0000;">// MSVC 2008 vector:1886</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #ff0000;">// 줄바꿈은 제가 한겁니다. @_@</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000ff;">typedef</span> _Vb_const_iterator&lt;size_type, difference_type, _Myt&gt; </div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; const_iterator;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000ff;">typedef</span> _Vb_iterator&lt;size_type, difference_type, _Myt&gt; </div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; iterator;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">..<span style="color: #000000;">&#40;</span>생략<span style="color: #000000;">&#41;</span>..</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000ff;">typedef</span> iterator pointer;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000ff;">typedef</span> const_iterator const_pointer;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000ff;">typedef</span> std::<span style="color: #00eeff;">reverse_iterator</span>&lt;iterator&gt; </div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; reverse_iterator;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000ff;">typedef</span> std::<span style="color: #00eeff;">reverse_iterator</span>&lt;const_iterator&gt; </div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; const_reverse_iterator; </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>두둥. iterator의 타입이 포인터가 아니라.. iterator라는 클래스로 되어 있습니다. 뿐만 아니라, pointer도 iterator클래스로 되어있습니다. 내부를 파고 들어가보니 이렇습니다.</p>
<div class="syntax_hilite"><span class="langName">C++:</span>
<div id="cpp-6">
<div class="cpp">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #ff0000;">// MSVC 2008: vector:114</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #ff0000;">// 역시 줄바꿈은 제가..</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">_Myt&amp; operator++<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #000000;">&#123;</span>&nbsp; &nbsp;<span style="color: #ff0000;">// preincrement</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; _SCL_SECURE_VALIDATE<span style="color: #000000;">&#40;</span>this-&gt;_Has_container<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; _SCL_SECURE_VALIDATE_RANGE<span style="color: #000000;">&#40;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; _Myptr &lt;<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span>_Myvec *<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#40;</span>this-&gt;_Getmycont<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>-&gt;_Mylast</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp;<span style="color: #000000;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;<span style="color: #339900;">#if _HAS_ITERATOR_DEBUGGING</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <span style="color: #0000ff;">if</span> <span style="color: #000000;">&#40;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; this-&gt;_Mycont == <span style="color: #0000dd;color:#800000;">0</span> || </div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span>_Myvec *<span style="color: #000000;">&#41;</span>this-&gt;_Mycont<span style="color: #000000;">&#41;</span>-&gt;_Mylast &lt;= _Myptr</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <span style="color: #000000;">&#41;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; _DEBUG_ERROR<span style="color: #000000;">&#40;</span><span style="color: #666666;">"vector iterator not incrementable"</span><span style="color: #000000;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;<span style="color: #339900;">#endif /* _HAS_ITERATOR_DEBUGGING */</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; ++_Myptr;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <span style="color: #0000ff;">return</span> <span style="color: #000000;">&#40;</span>*<span style="color: #0000dd;">this</span><span style="color: #000000;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #000000;">&#125;</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>_SCL_SECURE_VALIDATE라는 Macro를 장렬하게 호출합니다. (.. ) 이 매크로는 _SECURE_SCL 매크로에 의해 제어가 가능한데, 현재 상태가 제대로 된 상태인지 검사해주는 역할을 합니다. 잘못되면 예외를 발생시킵니다. ;;</p>
<p>일반적으로 vector<T>는 T*를 반복자로 사용해도 문제가 없는 스펙을 갖고 있습니다. STLPort에서 T*를 반복자로 사용하는 이유도 그렇게 써도 되기 때문이지요. (표준안이 바뀌었을지는 모르겠습니다만..) 포인터를 반복자로 사용할 수 있다는 점은 시사하는바가 큽니다. 바로, 성능문제이지요. native타입인 T*는 컴파일러가 최적화 할 수 있는 소지도 많을 뿐더러, 인라인처리가 될까 말까 고민할 필요도 없으니까요. 대신, T*를 사용하게 되면, 이를 악용하는 프로그래머의 실수와 함께, range check와 같은 디버깅 관련 기능을 추가할 수 없다는 단점이 존재합니다.</p>
<p>MSVC 9.0은 단점을 위해 장점을 버린 케이스라고 할 수 있겠습니다. 뭐 성능문제는 _SECURE_SCL매크로를 끄니 5%내외로 낮아지긴 했습니다만.. 왠지 찜찜하군요. 결국 STLPort를 VC9용으로 빌드해버렸습니다. STLPort도 STLP_DEBUG모드로 사용하면, 저런 range check를 해주거든요. <img src='http://crowmaniac.net/crowmania/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>사실 놀랐습니다. 저런 assertion관련 기능은 Release모드에서 별도로 켜주어야 작동하는게 맞는거 같은데 말이죠. 참고로 _SECURE_SCL을 켜두면 set에서 나는 차이는 더더욱 커집니다. 아무리 CPU가 발달해서 넘쳐나는 세상이라지만, 이건 좀 심하네요. -_-</p>
<p>물론, 개발툴입장에서 개발자의 편의를 추구하는 것은 당연하지만, 이런류의 편의성을 채택할거면 C#이나 Java를 쓰지 누가 C++을 쓰겠습니까. -_-; 디버깅할때나 필요할 법한 기능을 Release모드에 때려박다니.. 무슨 숨은 뜻이라도 있는걸까요. <img src='http://crowmaniac.net/crowmania/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  뭐 저는 STLPort를 쓰기때문에 딱히 상관은 없습니다만. <img src='http://crowmaniac.net/crowmania/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>ps1. 표준 관련 호환성은 많이 좋아지긴 한듯 합니다.<br />
ps2. 그냥 STLPort에 투자하면 안되겠니 MS... -_-<br />
ps3. 사고싶어요 징징.</p>
]]></content:encoded>
			<wfw:commentRss>http://crowmaniac.net/crowmania/?feed=rss2&amp;p=1457</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
