Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Release 201234

  • Loading branch information...
commit 7e2d91f85c611cf8258068a1fa28799c79a7f1a0 1 parent 1762297
Changwoo Park pismute authored
2  articles/2011/1294884600.html
View
@@ -64,7 +64,7 @@
<h3>UIKit</h3>
-<p>UIViewController 클래스에 추가된 <a href="https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instm/UIViewController/disablesAutomaticKeyboardDismissal">disableAutomaticKeyboardDismissal</a> 메소드는 기본적으로 input view가 사라지도록 하는 Behavior를 Override 할 수 있게 한다.</p></div></article><section id="related"><h3>Related Posts</h3><div class="alert" alert-info><ul><li><span>Jul 08 2010</span>&raquo;<a href="/articles/2010/1278573840.html">Build iPhone Project in Command Line</a></li></ul></div></section><section id="comments"><h3>Feedback</h3><div class="row"><div id="disqus_thread" class="well span10 offset1"></div>
+<p>UIViewController 클래스에 추가된 <a href="https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instm/UIViewController/disablesAutomaticKeyboardDismissal">disableAutomaticKeyboardDismissal</a> 메소드는 기본적으로 input view가 사라지도록 하는 Behavior를 Override 할 수 있게 한다.</p></div></article><section id="related"><h3>Related Posts</h3><div class="alert" alert-info><ul><li><span>Aug 27 2012</span>&raquo;<a href="/articles/2012/persist-cookie-of-uiwebview.html">UIWebView 쿠기 유지하기</a></li><li><span>Jul 08 2010</span>&raquo;<a href="/articles/2010/1278573840.html">Build iPhone Project in Command Line</a></li></ul></div></section><section id="comments"><h3>Feedback</h3><div class="row"><div id="disqus_thread" class="well span10 offset1"></div>
<script type="text/javascript">
var disqus_shortname = 'dogfeet-github';
var disqus_identifier = '/articles/2011/1294884600.html';
6 articles/2012/git-delta.html
View
@@ -20,12 +20,10 @@
| <a href="/site/tagmap.html#git" class="tag">git</a> <a href="/site/tagmap.html#delta" class="tag">delta</a> <a href="/site/tagmap.html#diff" class="tag">diff</a> <a href="/site/tagmap.html#patch" class="tag">patch</a> | <span><a href="/articles/2012/git-delta.html#disqus_thread" data-disqus-identifier="/articles/2012/git-delta.html"></a></span>
<style rel="stylesheet" media="screen, projection" scoped="scoped">#social-buttons {
margin-left: 30px;
-}</style><div id="social-buttons" class="pull-right"><ul class="unstyled"><li><a class="twitter-share-button" href="https://twitter.com/share" data-url="http://dogfeet.github.com/articles/2012/git-delta.html" data-via="pismute" data-count="horizontal" data-lang="en">Tweet</a></li><li><div class="g-plusone" data-size="medium" data-href="http://dogfeet.github.com/articles/2012/git-delta.html"></div></li><li><div class="fb-like" data-href="http://dogfeet.github.com/articles/2012/git-delta.html" data-send="false" data-layout="button_count" data-show-faces="false"></div></li></ul></div></footer><div property="sioc:content"><p>우리가 커밋을 하면 그 시점의 스냅샷을 저장하는 것이고 두 시점의 스냅샷을 비교하면 델타를 얻을 수 있다. VCS는 스냅샷이나 델타를 저장하고 누가, 언제, 왜 저장했는지 등을 추적하고 관리하는 시스템이다. 실제로 저장할 때도 스냅샷을 저장하는 시스템도 있고(SVN, git) 델타를 저장하는 시스템도 있다(git, hg).</p>
+}</style><div id="social-buttons" class="pull-right"><ul class="unstyled"><li><a class="twitter-share-button" href="https://twitter.com/share" data-url="http://dogfeet.github.com/articles/2012/git-delta.html" data-via="pismute" data-count="horizontal" data-lang="en">Tweet</a></li><li><div class="g-plusone" data-size="medium" data-href="http://dogfeet.github.com/articles/2012/git-delta.html"></div></li><li><div class="fb-like" data-href="http://dogfeet.github.com/articles/2012/git-delta.html" data-send="false" data-layout="button_count" data-show-faces="false"></div></li></ul></div></footer><div property="sioc:content"><p>우리가 커밋을 하면 그 시점의 스냅샷을 저장하는 것이고 두 시점의 스냅샷을 비교하면 델타를 얻을 수 있다. VCS는 스냅샷이나 델타를 저장하고 누가, 언제, 왜 저장했는지 등을 추적하고 관리하는 시스템이다. 실제로 저장할 때도 스냅샷을 저장하는 시스템도 있고(SVN, git) 델타를 저장하는 시스템도 있다(git, hg). 이 글은 델타 관점으로 git을 설명하고자 작성했다. 특정 시점을 의미하는 델타와 스냅샷을 두고 git이 어떻게 저장하는지 살펴보고, 델타를 구해서 적용하는 것으로 Merge/Rebase 명령어를 설명해보고자 한다.</p>
<p><img src="/articles/2012/git-delta/crime-and-sin.jpeg" alt="" title="" /></p>
-<p>이 글은 델타 관점으로 git을 설명하고자 작성했다. 특정 시점을 의미하는 델타와 스냅샷을 두고 git이 어떻게 저장하는지 Merge/Rebase 명령어가 실제로는 델타를 구해서 적용하는 것을 설명하고자 한다.</p>
-
<h2>델타</h2>
<p>옛날 옛적에 리눅스 커널을 직접 빌드해야 했던 시절, 돈이 없어 샀던 싸구려 하드웨어 덕에 patch 파일을 받아서 직접 패치해야 했었다. diff와 patch 의 의미, 사용하는 이유 등을 이해한 것은 나중이었지만 내가 처음 접한 것은 그때였다.</p>
@@ -88,7 +86,7 @@
<p><strong>Cherry-pick</strong>:</p>
-<p>Cherry-pick은 특정 커밋과 그 커밋의 부모와의 델타를 구해서(그러니까 해당 커밋의 델타만) 현 브랜치에 적용하는 것이다. 고른 커밋 하나에 대해서면 Rebase하는 것이다:</p>
+<p>Cherry-pick은 특정 커밋과 그 커밋의 부모와의 델타를 구해서(그러니까 해당 커밋의 델타만) 현 브랜치에 적용하는 것이다. 고른 커밋 하나에 대해서만 Rebase하는 것이다:</p>
<p><img src="/articles/2012/git-delta/git-cherry-pick.png" alt="git-cherry-pick" title="" /><a href="http://marklodato.github.com/visual-git-guide/index-ko.html">1</a></p></div></article><section id="related"><h3>Related Posts</h3><div class="alert" alert-info><ul><li><span>Dec 09 2011</span>&raquo;<a href="/articles/2011/git-flow.html">Git:git-flow</a></li><li><span>Apr 29 2012</span>&raquo;<a href="/articles/2012/git-svn.html">Git: git-svn</a></li><li><span>Jan 08 2012</span>&raquo;<a href="/articles/2012/progit.html">progit</a></li><li><span>Jan 01 2012</span>&raquo;<a href="/articles/2012/git-conflict.html">Git:conflict</a></li><li><span>Dec 24 2011</span>&raquo;<a href="/articles/2011/git-diff.html">Git:diff</a></li><li><span>Dec 22 2011</span>&raquo;<a href="/articles/2011/github-flow.html">GitHub Flow</a></li><li><span>Dec 17 2011</span>&raquo;<a href="/articles/2011/git-mergediff.html">Git:mergetool, difftool</a></li><li><span>Mar 25 2012</span>&raquo;<a href="/articles/2012/git-ff.html">Git: git-ff</a></li><li><span>Dec 06 2011</span>&raquo;<a href="/articles/2011/a-successful-git-branching-model.html">A successful git branching model</a></li><li><span>Dec 02 2011</span>&raquo;<a href="/articles/2011/git-refs.html">Git:refs</a></li><li><span>Dec 01 2011</span>&raquo;<a href="/articles/2011/bash-it.html">Bash-it</a></li><li><span>Dec 01 2011</span>&raquo;<a href="/articles/2011/git-helpers.html">Git:git 도우미</a></li><li><span>Nov 30 2011</span>&raquo;<a href="/articles/2011/progit.html">progit</a></li><li><span>Oct 12 2011</span>&raquo;<a href="/articles/2011/1318386790.html">Build distfile using Ant with Git revision</a></li><li><span>Sep 25 2011</span>&raquo;<a href="/articles/2011/1316924580.html">diff::Unified format</a></li></ul></div></section><section id="comments"><h3>Feedback</h3><div class="row"><div id="disqus_thread" class="well span10 offset1"></div>
<script type="text/javascript">
210 articles/2012/maven-scala-plugin.html
View
@@ -0,0 +1,210 @@
+<!DOCTYPE html><html lang="en"><head><!--Meta--><meta charset="utf-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /><meta http-equiv="content-type" content="text/html; charset=utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" /><title>#dogfeet - Maven에서 스크립트 사용하기</title><meta name="description" /><meta name="keywords" /><meta name="author" content="Changwoo Park" /><!--Icons--><link rel="shortcut icon" href="images/favicon.ico" /><link rel="apple-touch-icon" href="images/apple-touch-icon.png" /><link rel="apple-touch-icon" sizes="72x72" href="images/apple-touch-icon-72x72.png" /><link rel="apple-touch-icon" sizes="114x114" href="images/apple-touch-icon-114x114.png" /><link rel="alternate" type="application/atom+xml" title="개발새발 &raquo; Feed" href="http://feeds.feedburner.com/github/dogfeet" /><!--Shims: IE6-8 support of HTML5 elements--><!--[if lt IE 9]>
+ <script async src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
+ <![endif]--><!--Styles--><link rel="stylesheet" href="/css/bootstrap.min.css" media="screen, projection" /><link rel="stylesheet" href="/css/bootstrap-responsive.min.css" media="screen, projection" /><link rel="stylesheet" href="/styles/style.css" media="screen, projection" /><link rel="stylesheet" href="/styles/markdown.css" media="screen, projection" /><!--Scripts--><script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js"></script><script src="http://cdnjs.cloudflare.com/ajax/libs/modernizr/2.0.6/modernizr.min.js"></script><script src="http://connect.facebook.net/en_US/all.js#xfbml=1"></script><script src="/js/bootstrap.min.js"></script><script src="/scripts/script.js"></script></head><body><!--Topbar--><div class="navbar" navbar-fixed-top><div class="navbar-inner"><div class="container-fluid"><a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"><span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span></a><a class="brand" href="/">dogfeet</a><div class="nav-collapse"><ul class="nav"><li><a href="/site/tagmap.html">Tagmap</a></li><li><a href="/site/archive.html">Archive</a></li><li><a href="/site/atelier.html">Atelier</a></li><li><a href="http://feeds.feedburner.com/github/dogfeet"><img src="http://forum.tattersite.com/ko/style/Textcube/feed-icon.png" /></a></li></ul><form id="search-form" class="pull-right" action="http://google.com/search" method="get" navbar-search><input type="hidden" name="q" value="site:dogfeet.github.com" /><input type="text" name="q" results="0" placeholder="Search" search-query /></form></div></div></div></div><!--Markup--><div class="container-fluid"><div class="row-fluid"><section class="content" span10><script src="http://platform.twitter.com/widgets.js"></script><script>//facebook
+(function(d, s, id) {
+ var js, fjs = d.getElementsByTagName(s)[0];
+ if (d.getElementById(id)) {return;}
+ js = d.createElement(s); js.id = id;
+ js.src = "//connect.facebook.net/en_US/all.js#xfbml=1";
+ fjs.parentNode.insertBefore(js, fjs);
+}(document, 'script', 'facebook-jssdk'));
+
+//google plusone
+(function() {
+ var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
+ po.src = 'https://apis.google.com/js/plusone.js';
+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
+})();
+</script><article id="post" typeof="sioc:post" about="/articles/2012/maven-scala-plugin.html" lang="ko-kr" .post .undefined><header><h1 property="dcterms:title">Maven에서 스크립트 사용하기</h1></header><footer class="modern-font" .small-font><span>by <a href="undefined">Changwoo Park</a></span>
+ | <span property="dc:created">2012 Sep 02</span>
+ | <a href="/site/tagmap.html#maven" class="tag">maven</a> <a href="/site/tagmap.html#scala" class="tag">scala</a> <a href="/site/tagmap.html#plugin" class="tag">plugin</a> | <span><a href="/articles/2012/maven-scala-plugin.html#disqus_thread" data-disqus-identifier="/articles/2012/maven-scala-plugin.html"></a></span>
+<style rel="stylesheet" media="screen, projection" scoped="scoped">#social-buttons {
+ margin-left: 30px;
+}</style><div id="social-buttons" class="pull-right"><ul class="unstyled"><li><a class="twitter-share-button" href="https://twitter.com/share" data-url="http://dogfeet.github.com/articles/2012/maven-scala-plugin.html" data-via="pismute" data-count="horizontal" data-lang="en">Tweet</a></li><li><div class="g-plusone" data-size="medium" data-href="http://dogfeet.github.com/articles/2012/maven-scala-plugin.html"></div></li><li><div class="fb-like" data-href="http://dogfeet.github.com/articles/2012/maven-scala-plugin.html" data-send="false" data-layout="button_count" data-show-faces="false"></div></li></ul></div></footer><div property="sioc:content"><p>기본적으로 Maven에는 로직을 넣을 수 없다. 로직이 있으면 있는 대로 없으면 없는 대로 장단점이 있어서 일률적으로 '좋다', '나쁘다.'라고 말할 수 없다. 하지만, 나는 로직을 넣을 수 있는 것이 더 좋다. Ant도 그렇지만 Maven으로 프로젝트를 관리하다 보면 답답할 때가 잦다. 특히 자주 저지르는 실수를 검증하는 코드는 넣고 싶을 때가 잦다(항상 틀린 걸 또 틀리니까!).</p>
+
+<p>Maven에 Plugin으로 스크립트를 Embed할 방법이 있는데 <a href="http://maven.apache.org/plugins/maven-antrun-plugin/">maven-antrun-plugin</a>, <a href="http://groovy.codehaus.org/GMaven">gmaven-plugin</a>, <a href="http://scala-tools.org/mvnsites/maven-scala-plugin/">maven-scala-plugin</a>이 쓸만하다:</p>
+
+<ul>
+<li><code>maven-antrun-plugin</code>: run 골을 이용해서 ant 스크립트를 실행할 수 있다.</li>
+<li><code>gmaven-plugin</code>: execute 골을 이용해서 groovy 스크립트를 실행할 수 있다.</li>
+<li><code>maven-scala-plugin</code>: script 골을 이용해서 scala 스크립트를 실행할 수 있다.</li>
+</ul>
+
+<p><img src="/articles/2012/maven/maple.jpeg" alt="maple" title="" /><br />(from <a href='http://www.talismancoins.com/servlet/detail?no=920'>http://www.talismancoins.com/servlet/detail?no=920</a>)</p>
+
+<h2>maven-antrun-plugin</h2>
+
+<p>ant도 원래 로직을 넣을 수 없다. <a href="http://ant-contrib.sourceforge.net/">Ant-Contrib</a> Task를 추가하면 로직을 사용할 수 있지만 <code>Maven-&gt;Ant Plugin-&gt;Ant-Contrib</code> 형태로 의존성이 생기는 거라 볼썽사납다.</p>
+
+<p>기본적으로 <code>&lt;target&gt;</code> 타스크의 unless 속성을 이용하면 아주 간단한 로직은 구현할 수 있다. 특정 변수가 있을 때 실행할 배치작업을 쉽게 구현할 수 있다(from <a href='http://stackoverflow.com/questions/6342071/ant-target-to-run-only-based-on-condition'>http://stackoverflow.com/questions/6342071/ant-target-to-run-only-based-on-condition</a>):</p>
+
+<pre><code class="dfm xml">&lt;target name="check-abc"&gt;
+ &lt;available file="abc.txt" property="abc.present"/&gt;
+&lt;/target&gt;
+
+&lt;target name="do-unless-abc" depends="check-abc" unless="abc.present"&gt;
+ ...
+&lt;/target&gt;
+</code></pre>
+
+<p><code>abc.present</code>가 있을 때만 "do-unless-abc" 타스크가 수행된다. 특정 변수가 있을 때 실행하는 것을 조절하는 것뿐이지 로직을 구현할 수 있을 만큼은 아니다. </p>
+
+<p>maven-antrun-plugin은 maven 자체로는 하기 어려운 배치작업을 구현할 때 좋다. 파일을 복사하거나 삭제하고, ssh로 원격에서 작업한다거나 하는 일을 할 때 좋다. 로직을 넣어서 검증하는 코드를 작성하기에는 좋지 않다.</p>
+
+<h3>javascript</h3>
+
+<p>최근에는 Rhino엔진이 들어가 있어서 jar파일을 추가하지 않고서도 바로 <code>&lt;script&gt;</code> 타스크에서 Javascript를 사용할 수 있지만 실제로 써보지 않았다.</p>
+
+<p>더군다나 maven-antrun-plugin에서 <code>&lt;script&gt;</code> 타스크를 쓰는 것은 바람직하지 않다.</p>
+
+<h2>gmaven-plugin</h2>
+
+<p>groovy 스크립트를 실행할 수 있기 때문에 Maven 모델에 접근해서 정보를 가져와서 검사할 수 있다. 사용해본지 너무 오래됐고 이제는 <code>maven-scala-plugin</code>만 사용하기 때문에 정확하게 정리할 수는 없지만, 다음과 같이 할 수 있다(from <a href='http://grumpyapache.blogspot.kr/2012/08/maven-is-groovy.html'>http://grumpyapache.blogspot.kr/2012/08/maven-is-groovy.html</a>):</p>
+
+<pre><code class="dfm html">&lt;plugin&gt;
+ &lt;groupId&gt;org.codehaus.gmaven&lt;/groupId&gt;
+ &lt;artifactId&gt;gmaven-plugin&lt;/artifactId&gt;
+ &lt;version&gt;1.4&lt;/version&gt;
+ &lt;executions&gt;
+ &lt;execution&gt;
+ &lt;phase&gt;prepare-package&lt;/phase&gt;
+ &lt;goals&gt;
+ &lt;goal&gt;execute&lt;/goal&gt;
+ &lt;/goals&gt;
+ &lt;configuration&gt;
+ &lt;source&gt;&lt;![CDATA[
+ def concat(s1, s2, t) {
+ def java.io.File f1 = new java.io.File(s1)
+ def java.io.File f2 = new java.io.File(s2)
+ def java.io.File ft = new java.io.File(t)
+ def long l1 = f1.lastModified()
+ def long l2 = f2.lastModified()
+ def long lt = ft.lastModified()
+
+ if (l1 == 0) {
+ throw new IllegalStateException("Source file must exist:" + f1);
+ } else if (l2 == 0) {
+ throw new IllegalStateException("Source file must exist:" + f2);
+ } else if (lt == 0 || l1 &gt; lt || l2 &gt; lt) {
+ java.io.File pd = ft.getParentFile()
+
+ if (pd != null &amp;&amp; !pd.isDirectory() &amp;&amp; !pd.mkdirs()) {
+ throw new IOException("Unable to create parent directory: " + pd)
+ }
+
+ println("Creating target file: " + ft)
+ println("Source1 = " + f1)
+ println("Source2 = " + f2)
+
+ java.io.FileInputStream fi1 = new java.io.FileInputStream(f1)
+ java.io.FileInputStream fi2 = new java.io.FileInputStream(f2)
+ ft.append(fi1)
+ ft.append(fi2)
+ fi1.close()
+ fi2.close()
+ } else {
+ println("Target file is uptodate: " + ft)
+ println("Source1 = " + f1)
+ println("Source2 = " + f2)
+ }
+ }
+ concat("target/classes/com/softwareag/de/s/framework/demo/db/derby/initZero.sql",
+ "src/main/db/init0.sql",
+ "target/classes/com/softwareag/de/s/framework/demo/db/hsqldb/init0.sql")
+
+ concat("target/classes/com/softwareag/de/s/framework/demo/db/derby/initZero.sql",
+ "src/main/db/init0.sql",
+ "target/classes/com/softwareag/de/s/framework/demo/db/hsqldb/init0.sql")
+ ]]&gt;&lt;/source&gt;
+ &lt;/configuration&gt;
+ &lt;/execution&gt;
+ &lt;/executions&gt;
+&lt;/plugin&gt;
+</code></pre>
+
+<p>이 예제를 왜 만들었는지는 JOCHEN WIEDMANN의 <a href="http://grumpyapache.blogspot.kr/2012/08/maven-is-groovy.html">글</a>을 참고하라.</p>
+
+<p>groovy는 Java랑 비슷하니까 대충 짜서 사용할 수 있다. </p>
+
+<h2>maven-scala-plugin</h2>
+
+<p>최근에 Maven에 로직을 넣을 일이 있으면 이 플러그인을 사용한다. 간단한 스크립트를 짜는 게 전부니까 maven에서 scala가 groovy보다 나을 이유는 없다. 익숙한 걸 사용하면 되는데, 최근 scala를 공부하고 있기도 하고 gmaven-plugin보다 사이트가 더 잘 정리돼 있어서 보기 편하다.</p>
+
+<p>scala를 java처럼 사용해도 충분하다. scala의 현란한 문법은 몰라도 된다.</p>
+
+<pre><code class="dfm xml">&lt;plugin&gt;
+ &lt;groupId&gt;org.scala-tools&lt;/groupId&gt;
+ &lt;artifactId&gt;maven-scala-plugin&lt;/artifactId&gt;
+ &lt;version&gt;2.15.2&lt;/version&gt;
+ &lt;executions&gt;
+ &lt;execution&gt;
+ &lt;phase&gt;validate&lt;/phase&gt;
+ &lt;goals&gt;
+ &lt;goal&gt;script&lt;/goal&gt;
+ &lt;/goals&gt;
+ &lt;/execution&gt;
+ &lt;/executions&gt;
+ &lt;configuration&gt;
+ &lt;script&gt; &lt;![CDATA[
+ import java.io.File
+
+ //필요한 환경 변수가 있는지 검사.
+ if( System.getenv("MY_HOME") == null ) {
+ throw new RuntimeException( "MY_HOME variable not found ")
+ }
+
+ //NEED_DIR = "need1, need2, need3"
+ val needDirs="${NEED_DIR}".split(',')
+
+ //프로젝트 이름도 얻어올 수 있다.
+ //project 변수를 통해서 Maven 내부에 접근할 수 있고 Maven의 정보를 이용할 수 있다.
+ println(project.getName+" is the current project")
+
+ //필요한 디렉토리가 만들어져 있는지 검사.
+ needDirs.foreach(dir=&gt;{
+ val file = new File( dir )
+ if( !file.exists() ){
+ throw new RuntimeException( "[" + dir + "] dir not found ")
+ }
+ })
+ ]]&gt; &lt;/script&gt;
+ &lt;/configuration&gt;
+&lt;/plugin&gt;
+</code></pre>
+
+<p>validate Phase에서 내가 빠트린 것을 점검할 수 있다. 그리고 project 변수를 이용하면 더 많은 것들을 할 수 있다.</p>
+
+<p>이 project의 타입은 org.scala.tools.maven.model.MavenProjectAdapter 이고 이 클래스가 제공하는 인터페이스로 Maven 정보를 이용할 수 있다. 자세한 내용은 <a href="http://scala-tools.org/mvnsites/maven-scala-plugin/apidocs/">apidoc</a>을 봐라.</p>
+
+<h2>결론</h2>
+
+<p><code>maven-scala-plugin</code>가 킹왕짱. 사견이지만, Maven에서 배치스크립트를 실행할 때는 <code>maven-antrun-plugin</code>이 검증코드 등 로직을 넣을 때는 <code>maven-scala-plugin</code>이 좋다.</p></div></article><section id="comments"><h3>Feedback</h3><div class="row"><div id="disqus_thread" class="well span10 offset1"></div>
+<script type="text/javascript">
+ var disqus_shortname = 'dogfeet-github';
+ var disqus_identifier = '/articles/2012/maven-scala-plugin.html';
+ (function() {
+ var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
+ dsq.src = 'http://' + disqus_shortname + '.disqus.com/embed.js';
+ (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
+ })();
+</script>
+<noscript>Please enable JavaScript to view the <a href="http://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript><div class="well span10 offset1">
+ <div class="fb-like" data-href="http://dogfeet.github.com/articles/2012/maven-scala-plugin.html" data-send="true" data-width="450" data-show-faces="true"></div>
+ <div class="fb-comments" data-href="http://dogfeet.github.com/articles/2012/maven-scala-plugin.html" data-num-posts="1"></div>
+ </div></div></section></section><aside class="sidebar" span2></aside></div><footer class="footer"><p>Copyright &copy; 2008-2012 Dogfeet from coding to pixels, powered by <a href="https://github.com/balupton/docpad">Docpad</a></p></footer></div><!--DISQUS--><script>var disqus_shortname = 'dogfeet-github';
+(function () {
+ var s = document.createElement('script'); s.async = true;
+ s.type = 'text/javascript';
+ s.src = 'http://' + disqus_shortname + '.disqus.com/count.js';
+ (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);
+}());</script><!--GA--><script>if( 'http://dogfeet.github.com' === 'http://' + window.location.hostname ) {
+ var _gaq = _gaq || [];
+ _gaq.push(['_setAccount', 'UA-27493298-1']);
+ _gaq.push(['_trackPageview']);
+
+ (function() {
+ var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+ ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+ })();
+}</script></body></html>
BIN  articles/2012/maven/maple.jpeg
View
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
108 articles/2012/persist-cookie-of-uiwebview.html
View
@@ -0,0 +1,108 @@
+<!DOCTYPE html><html lang="en"><head><!--Meta--><meta charset="utf-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /><meta http-equiv="content-type" content="text/html; charset=utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" /><title>#dogfeet - UIWebView 쿠기 유지하기</title><meta name="description" /><meta name="keywords" /><meta name="author" content="Sean Lee" /><!--Icons--><link rel="shortcut icon" href="images/favicon.ico" /><link rel="apple-touch-icon" href="images/apple-touch-icon.png" /><link rel="apple-touch-icon" sizes="72x72" href="images/apple-touch-icon-72x72.png" /><link rel="apple-touch-icon" sizes="114x114" href="images/apple-touch-icon-114x114.png" /><link rel="alternate" type="application/atom+xml" title="개발새발 &raquo; Feed" href="http://feeds.feedburner.com/github/dogfeet" /><!--Shims: IE6-8 support of HTML5 elements--><!--[if lt IE 9]>
+ <script async src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
+ <![endif]--><!--Styles--><link rel="stylesheet" href="/css/bootstrap.min.css" media="screen, projection" /><link rel="stylesheet" href="/css/bootstrap-responsive.min.css" media="screen, projection" /><link rel="stylesheet" href="/styles/style.css" media="screen, projection" /><link rel="stylesheet" href="/styles/markdown.css" media="screen, projection" /><!--Scripts--><script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js"></script><script src="http://cdnjs.cloudflare.com/ajax/libs/modernizr/2.0.6/modernizr.min.js"></script><script src="http://connect.facebook.net/en_US/all.js#xfbml=1"></script><script src="/js/bootstrap.min.js"></script><script src="/scripts/script.js"></script></head><body><!--Topbar--><div class="navbar" navbar-fixed-top><div class="navbar-inner"><div class="container-fluid"><a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"><span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span></a><a class="brand" href="/">dogfeet</a><div class="nav-collapse"><ul class="nav"><li><a href="/site/tagmap.html">Tagmap</a></li><li><a href="/site/archive.html">Archive</a></li><li><a href="/site/atelier.html">Atelier</a></li><li><a href="http://feeds.feedburner.com/github/dogfeet"><img src="http://forum.tattersite.com/ko/style/Textcube/feed-icon.png" /></a></li></ul><form id="search-form" class="pull-right" action="http://google.com/search" method="get" navbar-search><input type="hidden" name="q" value="site:dogfeet.github.com" /><input type="text" name="q" results="0" placeholder="Search" search-query /></form></div></div></div></div><!--Markup--><div class="container-fluid"><div class="row-fluid"><section class="content" span10><script src="http://platform.twitter.com/widgets.js"></script><script>//facebook
+(function(d, s, id) {
+ var js, fjs = d.getElementsByTagName(s)[0];
+ if (d.getElementById(id)) {return;}
+ js = d.createElement(s); js.id = id;
+ js.src = "//connect.facebook.net/en_US/all.js#xfbml=1";
+ fjs.parentNode.insertBefore(js, fjs);
+}(document, 'script', 'facebook-jssdk'));
+
+//google plusone
+(function() {
+ var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
+ po.src = 'https://apis.google.com/js/plusone.js';
+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
+})();
+</script><article id="post" typeof="sioc:post" about="/articles/2012/persist-cookie-of-uiwebview.html" lang="ko-kr" .post .undefined><header><h1 property="dcterms:title">UIWebView 쿠기 유지하기</h1></header><footer class="modern-font" .small-font><span>by <a href="undefined">Sean Lee</a></span>
+ | <span property="dc:created">2012 Aug 27</span>
+ | <a href="/site/tagmap.html#uiwebview" class="tag">uiwebview</a> <a href="/site/tagmap.html#ios" class="tag">ios</a> <a href="/site/tagmap.html#cookie" class="tag">cookie</a> <a href="/site/tagmap.html#쿠키" class="tag">쿠키</a> | <span><a href="/articles/2012/persist-cookie-of-uiwebview.html#disqus_thread" data-disqus-identifier="/articles/2012/persist-cookie-of-uiwebview.html"></a></span>
+<style rel="stylesheet" media="screen, projection" scoped="scoped">#social-buttons {
+ margin-left: 30px;
+}</style><div id="social-buttons" class="pull-right"><ul class="unstyled"><li><a class="twitter-share-button" href="https://twitter.com/share" data-url="http://dogfeet.github.com/articles/2012/persist-cookie-of-uiwebview.html" data-via="lethee" data-count="horizontal" data-lang="en">Tweet</a></li><li><div class="g-plusone" data-size="medium" data-href="http://dogfeet.github.com/articles/2012/persist-cookie-of-uiwebview.html"></div></li><li><div class="fb-like" data-href="http://dogfeet.github.com/articles/2012/persist-cookie-of-uiwebview.html" data-send="false" data-layout="button_count" data-show-faces="false"></div></li></ul></div></footer><div property="sioc:content"><p>애플리케이션에서 UIWebView를 사용할 때 쿠키를 저장하는 방법을 살펴본다. 쿠키를 저장하면 애플리케이션이 종료되더라도 로그인 상태 등을 유지할 수 있다. 서버가 특별히 쿠키의 지속 시간을 지정하지 않은 경우 쿠키는 애플리케이션이 종료되면(백그라운드에 남아있는 것과는 다르다) 쿠키 정보는 사라진다.</p>
+
+<p>UIWebView can save and restore cookies. Although application has terminated, the cookies and the session can be restored.</p>
+
+<p><img src="http://farm1.staticflickr.com/182/403856634_db35669863.jpg" width="500" height="375" alt="cookies do not always wish to remain stacked."><br /><em><a href="http://www.flickr.com/photos/klara/403856634/" title="Flickr에서 Klara Kim님의 cookies do not always wish to remain stacked.">cookies do not always wish to remain stacked. by klara</a></em></p>
+
+<h2>애플리케이션 종료시 쿠키 저장</h2>
+
+<p>우선 애플리케이션이 종료되는 이벤트를 잡아야 한다. 현재 멀티태스킹이 지원되는 SDK를 사용하여 애플리케이션을 만든 경우 Application Delegate의 아래 메소드가 호출된다.</p>
+
+<pre><code>- (void)applicationDidEnterBackground:(UIApplication *)application
+</code></pre>
+
+<p>멀티태스킹이 지원되기 이전 버전의 SDK나 멀티태스킹을 사용하지 않도록 설정한 애플리케이션은 다음고 같은 메소드에서 종료 이벤트를 잡을 수 있다.</p>
+
+<pre><code>- (void)applicationWillTerminate:(UIApplication *)application
+</code></pre>
+
+<p>쿠키 정보를 저장할 때 UIWebView 인스턴스는 필요 없다 [<a href="https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSHTTPCookieStorage_Class/Reference/Reference.html">NSHTTPCookieStorage</a> sharedHTTPCookieStorage] 메소드를 호출하면<br />애플리케이션에게 할당된 쿠키 저장소를 반환받는다. 즉 시스템 브라우저인 Safari나 다른 애플리케이션과 공유하지 않는 애플리케이션만의 쿠키 저장소이다. (iOS는 쿠키를 공유하지 않지만 Mac OS는 쿠키를 공유한다)</p>
+
+<pre><code>{
+ NSLog(@"%@", @"PersisteWebCookie");
+ NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies];
+ NSData *cookieData = [NSKeyedArchiver archivedDataWithRootObject:cookies];
+ [[NSUserDefaults standardUserDefaults] setObject:cookieData forKey:@"MySavedCookies"];
+ NSLog(@"%@", @"PersisteWebCookie Saved");
+}
+</code></pre>
+
+<p>저장소에 현재 저장된 쿠키를 배열로(NSArray) 받아와서 NSUserDefaults에 저장할 수 있도록 NSKeyedArchiver를 통해 NSData 인스턴스로 변환한다. 키 값은 <strong>MySavedCookies</strong>를 사용하여 NSUserDefaults에 저장해둔다.</p>
+
+<p>일반적으로 쿠키는 브라우저나 애플리케이션이 종료되면(iOS의 경우 홈버튼을 더블탭 하여 마이너스 아이콘으로 종료시키면) 쿠키 정보가 삭제된다. 하지만 위와 같이 저장한 쿠키 정보는 애플리케이션을 다시 실행시켰을 때 복구할 수 있다.</p>
+
+<h2>애플리케이션으로 돌아왔을 때</h2>
+
+<p>애플리케이션이 백그라운드에서 돌아오거나 다시 실행되는 이벤트는 보통 다음 Application Delegate의 메소드에서 처리한다.</p>
+
+<pre><code>- (BOOL)application:(UIApplication *)application
+ didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
+</code></pre>
+
+<p>쿠키를 다시 되살리는 방법은 저장하는 순서의 반대로 한다. 키 값을 <strong>MySavedCookies</strong>로 하여 NSUserDefaults로부터 데이터를 꺼내오고 배열로 만든 후 하나씩 다시 쿠키 저장소에 저장한다.</p>
+
+<pre><code>{
+ NSLog(@"%@", @"PersisteWebCookie");
+ NSData *cookiesdata = [[NSUserDefaults standardUserDefaults] objectForKey:@"MySavedCookies"];
+ if([cookiesdata length]) {
+ NSArray *cookies = [NSKeyedUnarchiver unarchiveObjectWithData:cookiesdata];
+ NSHTTPCookie *cookie;
+
+ for (cookie in cookies) {
+ [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
+ }
+ }
+ NSLog(@"%@", @"PersisteWebCookie Restored");
+}
+</code></pre></div></article><section id="related"><h3>Related Posts</h3><div class="alert" alert-info><ul><li><span>Jan 13 2011</span>&raquo;<a href="/articles/2011/1294884600.html">iOS 4.3 - 새로운 기능 (Beta)</a></li></ul></div></section><section id="comments"><h3>Feedback</h3><div class="row"><div id="disqus_thread" class="well span10 offset1"></div>
+<script type="text/javascript">
+ var disqus_shortname = 'dogfeet-github';
+ var disqus_identifier = '/articles/2012/persist-cookie-of-uiwebview.html';
+ (function() {
+ var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
+ dsq.src = 'http://' + disqus_shortname + '.disqus.com/embed.js';
+ (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
+ })();
+</script>
+<noscript>Please enable JavaScript to view the <a href="http://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript><div class="well span10 offset1">
+ <div class="fb-like" data-href="http://dogfeet.github.com/articles/2012/persist-cookie-of-uiwebview.html" data-send="true" data-width="450" data-show-faces="true"></div>
+ <div class="fb-comments" data-href="http://dogfeet.github.com/articles/2012/persist-cookie-of-uiwebview.html" data-num-posts="1"></div>
+ </div></div></section></section><aside class="sidebar" span2></aside></div><footer class="footer"><p>Copyright &copy; 2008-2012 Dogfeet from coding to pixels, powered by <a href="https://github.com/balupton/docpad">Docpad</a></p></footer></div><!--DISQUS--><script>var disqus_shortname = 'dogfeet-github';
+(function () {
+ var s = document.createElement('script'); s.async = true;
+ s.type = 'text/javascript';
+ s.src = 'http://' + disqus_shortname + '.disqus.com/count.js';
+ (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);
+}());</script><!--GA--><script>if( 'http://dogfeet.github.com' === 'http://' + window.location.hostname ) {
+ var _gaq = _gaq || [];
+ _gaq.push(['_setAccount', 'UA-27493298-1']);
+ _gaq.push(['_trackPageview']);
+
+ (function() {
+ var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+ ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+ })();
+}</script></body></html>
399 atom.xml
View
@@ -1,10 +1,226 @@
<?xml version="1.0" encoding="utf-8"?>
-<feed xmlns="http://www.w3.org/2005/Atom"><title><![CDATA[ 개발새발 ]]></title><link href="http://dogfeet.github.com/atom.xml" rel="self" /><link href="http://dogfeet.github.com" /><updated>2012-08-25T06:59:24.613Z</updated><id>http://dogfeet.github.com</id><author><name>changwoo-park.html.md</name><email>pismute@gmail.com</email></author><author><name>sean-lee.html.md</name><email>sean@weaveus.com</email></author><author><name>yongjae-choi.html.md</name><email>mage@weaveus.com</email></author><entry><title><![CDATA[ Git: 델타와 스냅샷 ]]></title><link href="http://dogfeet.github.com/articles/2012/git-delta.html" /><updated>2012-08-24T15:00:00.000Z</updated><id>http://dogfeet.github.com/articles/2012/git-delta.html</id><content type="html"><![CDATA[
-<p>우리가 커밋을 하면 그 시점의 스냅샷을 저장하는 것이고 두 시점의 스냅샷을 비교하면 델타를 얻을 수 있다. VCS는 스냅샷이나 델타를 저장하고 누가, 언제, 왜 저장했는지 등을 추적하고 관리하는 시스템이다. 실제로 저장할 때도 스냅샷을 저장하는 시스템도 있고(SVN, git) 델타를 저장하는 시스템도 있다(git, hg).</p>
+<feed xmlns="http://www.w3.org/2005/Atom"><title><![CDATA[ 개발새발 ]]></title><link href="http://dogfeet.github.com/atom.xml" rel="self" /><link href="http://dogfeet.github.com" /><updated>2012-09-02T00:10:56.238Z</updated><id>http://dogfeet.github.com</id><author><name>changwoo-park.html.md</name><email>pismute@gmail.com</email></author><author><name>sean-lee.html.md</name><email>sean@weaveus.com</email></author><author><name>yongjae-choi.html.md</name><email>mage@weaveus.com</email></author><entry><title><![CDATA[ Maven에서 스크립트 사용하기 ]]></title><link href="http://dogfeet.github.com/articles/2012/maven-scala-plugin.html" /><updated>2012-09-01T15:00:00.000Z</updated><id>http://dogfeet.github.com/articles/2012/maven-scala-plugin.html</id><content type="html"><![CDATA[
+<p>기본적으로 Maven에는 로직을 넣을 수 없다. 로직이 있으면 있는 대로 없으면 없는 대로 장단점이 있어서 일률적으로 '좋다', '나쁘다.'라고 말할 수 없다. 하지만, 나는 로직을 넣을 수 있는 것이 더 좋다. Ant도 그렇지만 Maven으로 프로젝트를 관리하다 보면 답답할 때가 잦다. 특히 자주 저지르는 실수를 검증하는 코드는 넣고 싶을 때가 잦다(항상 틀린 걸 또 틀리니까!).</p>
-<p><img src="http://dogfeet.github.com/articles/2012/git-delta/crime-and-sin.jpeg" alt="" title="" /></p>
+<p>Maven에 Plugin으로 스크립트를 Embed할 방법이 있는데 <a href="http://maven.apache.org/plugins/maven-antrun-plugin/">maven-antrun-plugin</a>, <a href="http://groovy.codehaus.org/GMaven">gmaven-plugin</a>, <a href="http://scala-tools.org/mvnsites/maven-scala-plugin/">maven-scala-plugin</a>이 쓸만하다:</p>
+
+<ul>
+<li><code>maven-antrun-plugin</code>: run 골을 이용해서 ant 스크립트를 실행할 수 있다.</li>
+<li><code>gmaven-plugin</code>: execute 골을 이용해서 groovy 스크립트를 실행할 수 있다.</li>
+<li><code>maven-scala-plugin</code>: script 골을 이용해서 scala 스크립트를 실행할 수 있다.</li>
+</ul>
+
+<p><img src="http://dogfeet.github.com/articles/2012/maven/maple.jpeg" alt="maple" title="" /><br />(from <a href='http://www.talismancoins.com/servlet/detail?no=920'>http://www.talismancoins.com/servlet/detail?no=920</a>)</p>
+
+<h2>maven-antrun-plugin</h2>
+
+<p>ant도 원래 로직을 넣을 수 없다. <a href="http://ant-contrib.sourceforge.net/">Ant-Contrib</a> Task를 추가하면 로직을 사용할 수 있지만 <code>Maven-&gt;Ant Plugin-&gt;Ant-Contrib</code> 형태로 의존성이 생기는 거라 볼썽사납다.</p>
+
+<p>기본적으로 <code>&lt;target&gt;</code> 타스크의 unless 속성을 이용하면 아주 간단한 로직은 구현할 수 있다. 특정 변수가 있을 때 실행할 배치작업을 쉽게 구현할 수 있다(from <a href='http://stackoverflow.com/questions/6342071/ant-target-to-run-only-based-on-condition'>http://stackoverflow.com/questions/6342071/ant-target-to-run-only-based-on-condition</a>):</p>
+
+<pre><code class="dfm xml">&lt;target name="check-abc"&gt;
+ &lt;available file="abc.txt" property="abc.present"/&gt;
+&lt;/target&gt;
+
+&lt;target name="do-unless-abc" depends="check-abc" unless="abc.present"&gt;
+ ...
+&lt;/target&gt;
+</code></pre>
+
+<p><code>abc.present</code>가 있을 때만 "do-unless-abc" 타스크가 수행된다. 특정 변수가 있을 때 실행하는 것을 조절하는 것뿐이지 로직을 구현할 수 있을 만큼은 아니다. </p>
+
+<p>maven-antrun-plugin은 maven 자체로는 하기 어려운 배치작업을 구현할 때 좋다. 파일을 복사하거나 삭제하고, ssh로 원격에서 작업한다거나 하는 일을 할 때 좋다. 로직을 넣어서 검증하는 코드를 작성하기에는 좋지 않다.</p>
+
+<h3>javascript</h3>
+
+<p>최근에는 Rhino엔진이 들어가 있어서 jar파일을 추가하지 않고서도 바로 <code>&lt;script&gt;</code> 타스크에서 Javascript를 사용할 수 있지만 실제로 써보지 않았다.</p>
+
+<p>더군다나 maven-antrun-plugin에서 <code>&lt;script&gt;</code> 타스크를 쓰는 것은 바람직하지 않다.</p>
+
+<h2>gmaven-plugin</h2>
+
+<p>groovy 스크립트를 실행할 수 있기 때문에 Maven 모델에 접근해서 정보를 가져와서 검사할 수 있다. 사용해본지 너무 오래됐고 이제는 <code>maven-scala-plugin</code>만 사용하기 때문에 정확하게 정리할 수는 없지만, 다음과 같이 할 수 있다(from <a href='http://grumpyapache.blogspot.kr/2012/08/maven-is-groovy.html'>http://grumpyapache.blogspot.kr/2012/08/maven-is-groovy.html</a>):</p>
+
+<pre><code class="dfm html">&lt;plugin&gt;
+ &lt;groupId&gt;org.codehaus.gmaven&lt;/groupId&gt;
+ &lt;artifactId&gt;gmaven-plugin&lt;/artifactId&gt;
+ &lt;version&gt;1.4&lt;/version&gt;
+ &lt;executions&gt;
+ &lt;execution&gt;
+ &lt;phase&gt;prepare-package&lt;/phase&gt;
+ &lt;goals&gt;
+ &lt;goal&gt;execute&lt;/goal&gt;
+ &lt;/goals&gt;
+ &lt;configuration&gt;
+ &lt;source&gt;&lt;![CDATA[
+ def concat(s1, s2, t) {
+ def java.io.File f1 = new java.io.File(s1)
+ def java.io.File f2 = new java.io.File(s2)
+ def java.io.File ft = new java.io.File(t)
+ def long l1 = f1.lastModified()
+ def long l2 = f2.lastModified()
+ def long lt = ft.lastModified()
+
+ if (l1 == 0) {
+ throw new IllegalStateException("Source file must exist:" + f1);
+ } else if (l2 == 0) {
+ throw new IllegalStateException("Source file must exist:" + f2);
+ } else if (lt == 0 || l1 &gt; lt || l2 &gt; lt) {
+ java.io.File pd = ft.getParentFile()
+
+ if (pd != null &amp;&amp; !pd.isDirectory() &amp;&amp; !pd.mkdirs()) {
+ throw new IOException("Unable to create parent directory: " + pd)
+ }
+
+ println("Creating target file: " + ft)
+ println("Source1 = " + f1)
+ println("Source2 = " + f2)
+
+ java.io.FileInputStream fi1 = new java.io.FileInputStream(f1)
+ java.io.FileInputStream fi2 = new java.io.FileInputStream(f2)
+ ft.append(fi1)
+ ft.append(fi2)
+ fi1.close()
+ fi2.close()
+ } else {
+ println("Target file is uptodate: " + ft)
+ println("Source1 = " + f1)
+ println("Source2 = " + f2)
+ }
+ }
+ concat("target/classes/com/softwareag/de/s/framework/demo/db/derby/initZero.sql",
+ "src/main/db/init0.sql",
+ "target/classes/com/softwareag/de/s/framework/demo/db/hsqldb/init0.sql")
+
+ concat("target/classes/com/softwareag/de/s/framework/demo/db/derby/initZero.sql",
+ "src/main/db/init0.sql",
+ "target/classes/com/softwareag/de/s/framework/demo/db/hsqldb/init0.sql")
+ ]]&gt;&lt;/source&gt;
+ &lt;/configuration&gt;
+ &lt;/execution&gt;
+ &lt;/executions&gt;
+&lt;/plugin&gt;
+</code></pre>
+
+<p>이 예제를 왜 만들었는지는 JOCHEN WIEDMANN의 <a href="http://grumpyapache.blogspot.kr/2012/08/maven-is-groovy.html">글</a>을 참고하라.</p>
+
+<p>groovy는 Java랑 비슷하니까 대충 짜서 사용할 수 있다. </p>
+
+<h2>maven-scala-plugin</h2>
+
+<p>최근에 Maven에 로직을 넣을 일이 있으면 이 플러그인을 사용한다. 간단한 스크립트를 짜는 게 전부니까 maven에서 scala가 groovy보다 나을 이유는 없다. 익숙한 걸 사용하면 되는데, 최근 scala를 공부하고 있기도 하고 gmaven-plugin보다 사이트가 더 잘 정리돼 있어서 보기 편하다.</p>
+
+<p>scala를 java처럼 사용해도 충분하다. scala의 현란한 문법은 몰라도 된다.</p>
+
+<pre><code class="dfm xml">&lt;plugin&gt;
+ &lt;groupId&gt;org.scala-tools&lt;/groupId&gt;
+ &lt;artifactId&gt;maven-scala-plugin&lt;/artifactId&gt;
+ &lt;version&gt;2.15.2&lt;/version&gt;
+ &lt;executions&gt;
+ &lt;execution&gt;
+ &lt;phase&gt;validate&lt;/phase&gt;
+ &lt;goals&gt;
+ &lt;goal&gt;script&lt;/goal&gt;
+ &lt;/goals&gt;
+ &lt;/execution&gt;
+ &lt;/executions&gt;
+ &lt;configuration&gt;
+ &lt;script&gt; &lt;![CDATA[
+ import java.io.File
+
+ //필요한 환경 변수가 있는지 검사.
+ if( System.getenv("MY_HOME") == null ) {
+ throw new RuntimeException( "MY_HOME variable not found ")
+ }
+
+ //NEED_DIR = "need1, need2, need3"
+ val needDirs="${NEED_DIR}".split(',')
+
+ //프로젝트 이름도 얻어올 수 있다.
+ //project 변수를 통해서 Maven 내부에 접근할 수 있고 Maven의 정보를 이용할 수 있다.
+ println(project.getName+" is the current project")
+
+ //필요한 디렉토리가 만들어져 있는지 검사.
+ needDirs.foreach(dir=&gt;{
+ val file = new File( dir )
+ if( !file.exists() ){
+ throw new RuntimeException( "[" + dir + "] dir not found ")
+ }
+ })
+ ]]&gt; &lt;/script&gt;
+ &lt;/configuration&gt;
+&lt;/plugin&gt;
+</code></pre>
+
+<p>validate Phase에서 내가 빠트린 것을 점검할 수 있다. 그리고 project 변수를 이용하면 더 많은 것들을 할 수 있다.</p>
+
+<p>이 project의 타입은 org.scala.tools.maven.model.MavenProjectAdapter 이고 이 클래스가 제공하는 인터페이스로 Maven 정보를 이용할 수 있다. 자세한 내용은 <a href="http://scala-tools.org/mvnsites/maven-scala-plugin/apidocs/">apidoc</a>을 봐라.</p>
+
+<h2>결론</h2>
+
+<p><code>maven-scala-plugin</code>가 킹왕짱. 사견이지만, Maven에서 배치스크립트를 실행할 때는 <code>maven-antrun-plugin</code>이 검증코드 등 로직을 넣을 때는 <code>maven-scala-plugin</code>이 좋다.</p>]]>
+</content></entry><entry><title><![CDATA[ UIWebView 쿠기 유지하기 ]]></title><link href="http://dogfeet.github.com/articles/2012/persist-cookie-of-uiwebview.html" /><updated>2012-08-27T00:00:00.000Z</updated><id>http://dogfeet.github.com/articles/2012/persist-cookie-of-uiwebview.html</id><content type="html"><![CDATA[
+<p>애플리케이션에서 UIWebView를 사용할 때 쿠키를 저장하는 방법을 살펴본다. 쿠키를 저장하면 애플리케이션이 종료되더라도 로그인 상태 등을 유지할 수 있다. 서버가 특별히 쿠키의 지속 시간을 지정하지 않은 경우 쿠키는 애플리케이션이 종료되면(백그라운드에 남아있는 것과는 다르다) 쿠키 정보는 사라진다.</p>
+
+<p>UIWebView can save and restore cookies. Although application has terminated, the cookies and the session can be restored.</p>
+
+<p><img src="http://farm1.staticflickr.com/182/403856634_db35669863.jpg" width="500" height="375" alt="cookies do not always wish to remain stacked."><br /><em><a href="http://www.flickr.com/photos/klara/403856634/" title="Flickr에서 Klara Kim님의 cookies do not always wish to remain stacked.">cookies do not always wish to remain stacked. by klara</a></em></p>
+
+<h2>애플리케이션 종료시 쿠키 저장</h2>
+
+<p>우선 애플리케이션이 종료되는 이벤트를 잡아야 한다. 현재 멀티태스킹이 지원되는 SDK를 사용하여 애플리케이션을 만든 경우 Application Delegate의 아래 메소드가 호출된다.</p>
+
+<pre><code>- (void)applicationDidEnterBackground:(UIApplication *)application
+</code></pre>
+
+<p>멀티태스킹이 지원되기 이전 버전의 SDK나 멀티태스킹을 사용하지 않도록 설정한 애플리케이션은 다음고 같은 메소드에서 종료 이벤트를 잡을 수 있다.</p>
+
+<pre><code>- (void)applicationWillTerminate:(UIApplication *)application
+</code></pre>
+
+<p>쿠키 정보를 저장할 때 UIWebView 인스턴스는 필요 없다 [<a href="https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSHTTPCookieStorage_Class/Reference/Reference.html">NSHTTPCookieStorage</a> sharedHTTPCookieStorage] 메소드를 호출하면<br />애플리케이션에게 할당된 쿠키 저장소를 반환받는다. 즉 시스템 브라우저인 Safari나 다른 애플리케이션과 공유하지 않는 애플리케이션만의 쿠키 저장소이다. (iOS는 쿠키를 공유하지 않지만 Mac OS는 쿠키를 공유한다)</p>
+
+<pre><code>{
+ NSLog(@"%@", @"PersisteWebCookie");
+ NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies];
+ NSData *cookieData = [NSKeyedArchiver archivedDataWithRootObject:cookies];
+ [[NSUserDefaults standardUserDefaults] setObject:cookieData forKey:@"MySavedCookies"];
+ NSLog(@"%@", @"PersisteWebCookie Saved");
+}
+</code></pre>
+
+<p>저장소에 현재 저장된 쿠키를 배열로(NSArray) 받아와서 NSUserDefaults에 저장할 수 있도록 NSKeyedArchiver를 통해 NSData 인스턴스로 변환한다. 키 값은 <strong>MySavedCookies</strong>를 사용하여 NSUserDefaults에 저장해둔다.</p>
-<p>이 글은 델타 관점으로 git을 설명하고자 작성했다. 특정 시점을 의미하는 델타와 스냅샷을 두고 git이 어떻게 저장하는지 Merge/Rebase 명령어가 실제로는 델타를 구해서 적용하는 것을 설명하고자 한다.</p>
+<p>일반적으로 쿠키는 브라우저나 애플리케이션이 종료되면(iOS의 경우 홈버튼을 더블탭 하여 마이너스 아이콘으로 종료시키면) 쿠키 정보가 삭제된다. 하지만 위와 같이 저장한 쿠키 정보는 애플리케이션을 다시 실행시켰을 때 복구할 수 있다.</p>
+
+<h2>애플리케이션으로 돌아왔을 때</h2>
+
+<p>애플리케이션이 백그라운드에서 돌아오거나 다시 실행되는 이벤트는 보통 다음 Application Delegate의 메소드에서 처리한다.</p>
+
+<pre><code>- (BOOL)application:(UIApplication *)application
+ didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
+</code></pre>
+
+<p>쿠키를 다시 되살리는 방법은 저장하는 순서의 반대로 한다. 키 값을 <strong>MySavedCookies</strong>로 하여 NSUserDefaults로부터 데이터를 꺼내오고 배열로 만든 후 하나씩 다시 쿠키 저장소에 저장한다.</p>
+
+<pre><code>{
+ NSLog(@"%@", @"PersisteWebCookie");
+ NSData *cookiesdata = [[NSUserDefaults standardUserDefaults] objectForKey:@"MySavedCookies"];
+ if([cookiesdata length]) {
+ NSArray *cookies = [NSKeyedUnarchiver unarchiveObjectWithData:cookiesdata];
+ NSHTTPCookie *cookie;
+
+ for (cookie in cookies) {
+ [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
+ }
+ }
+ NSLog(@"%@", @"PersisteWebCookie Restored");
+}
+</code></pre>]]>
+</content></entry><entry><title><![CDATA[ Git: 델타와 스냅샷 ]]></title><link href="http://dogfeet.github.com/articles/2012/git-delta.html" /><updated>2012-08-24T15:00:00.000Z</updated><id>http://dogfeet.github.com/articles/2012/git-delta.html</id><content type="html"><![CDATA[
+<p>우리가 커밋을 하면 그 시점의 스냅샷을 저장하는 것이고 두 시점의 스냅샷을 비교하면 델타를 얻을 수 있다. VCS는 스냅샷이나 델타를 저장하고 누가, 언제, 왜 저장했는지 등을 추적하고 관리하는 시스템이다. 실제로 저장할 때도 스냅샷을 저장하는 시스템도 있고(SVN, git) 델타를 저장하는 시스템도 있다(git, hg). 이 글은 델타 관점으로 git을 설명하고자 작성했다. 특정 시점을 의미하는 델타와 스냅샷을 두고 git이 어떻게 저장하는지 살펴보고, 델타를 구해서 적용하는 것으로 Merge/Rebase 명령어를 설명해보고자 한다.</p>
+
+<p><img src="http://dogfeet.github.com/articles/2012/git-delta/crime-and-sin.jpeg" alt="" title="" /></p>
<h2>델타</h2>
@@ -68,7 +284,7 @@
<p><strong>Cherry-pick</strong>:</p>
-<p>Cherry-pick은 특정 커밋과 그 커밋의 부모와의 델타를 구해서(그러니까 해당 커밋의 델타만) 현 브랜치에 적용하는 것이다. 고른 커밋 하나에 대해서면 Rebase하는 것이다:</p>
+<p>Cherry-pick은 특정 커밋과 그 커밋의 부모와의 델타를 구해서(그러니까 해당 커밋의 델타만) 현 브랜치에 적용하는 것이다. 고른 커밋 하나에 대해서만 Rebase하는 것이다:</p>
<p><img src="/articles/2012/git-delta/git-cherry-pick.png" alt="git-cherry-pick" title="" /><a href="http://marklodato.github.com/visual-git-guide/index-ko.html">1</a></p>]]>
</content></entry><entry><title><![CDATA[ Meteor: Learn Meteor Fundamentals and Best Practices ]]></title><link href="http://dogfeet.github.com/articles/2012/meteor-fundametals-and-best-practices.html" /><updated>2012-08-18T15:00:00.000Z</updated><id>http://dogfeet.github.com/articles/2012/meteor-fundametals-and-best-practices.html</id><content type="html"><![CDATA[
@@ -815,177 +1031,4 @@ project/
</code></pre>
<p>이름이 <code>/</code>로 끝났다. <code>/</code> 끝나는 이름은 디렉토리만 매치하겠다는 의미다. 그리고 <code>/</code>로 시작하지 않았기 때문에 base 디렉토리에 있는 <code>target/</code> 뿐만 아니라 <code>project/target</code>처럼 하위 디렉토리 안에 있는 디렉토리도 매치된다.</p>]]>
-</content></entry><entry><title><![CDATA[ sbt: Getting Started Guide: Hello, World ]]></title><link href="http://dogfeet.github.com/articles/2012/sbt-getting-started-hello.html" /><updated>2012-07-07T15:00:00.000Z</updated><id>http://dogfeet.github.com/articles/2012/sbt-getting-started-hello.html</id><content type="html"><![CDATA[
-<p>이 글은 <a href="https://github.com/harrah/xsbt/wiki/Getting-Started-Welcome">Getting Started sbt</a>을 번역한 것이다.</p>
-
-<p><img src="http://dogfeet.github.com/articles/2012/sbt/sbt.png" alt="sbt" title="" /></p>
-
-<h2>소스 코드에 프로젝트 디렉토리 만들기</h2>
-
-<p>어떤 디렉토리에 소스 파일이 하나라도 있으면 그 디렉토리는 sbt 프로젝트라고 할 수 있다. <code>hello</code> 디렉토리를 만들고 그 안에 다음과 같은 <code>hw.scala</code> 파일을 만들어 넣는다:</p>
-
-<pre><code>object Hi {
- def main(args: Array[String]) = println("Hi!")
-}
-</code></pre>
-
-<p><code>hello</code> 디렉토리에서 sbt를 실행하고 sbt 콘솔에서 <code>run</code>을 실행한다. Linux와 OS X에서는 다음과 같이 실행한다:</p>
-
-<pre><code>$ mkdir hello
-$ cd hello
-$ echo 'object Hi { def main(args: Array[String]) = println("Hi!") }' &gt; hw.scala
-$ sbt
-...
-&gt; run
-...
-Hi!
-</code></pre>
-
-<p>sbt는 관례에 따라 동작하는 것인데 다음과 같은 것을 찾는다.</p>
-
-<ul>
-<li>Base 디렉토리에 있는 소스</li>
-<li><code>src/main/scala</code> 또는 <code>src/main/java</code>에 있는 소스</li>
-<li><code>src/test/scala</code> 또는 <code>src/test/java</code>에 있는 테스트</li>
-<li><code>src/main/resources</code> 또는 src/test/resources`에 있는 데이터 파일</li>
-<li><code>lib</code>에 있는 jar 파일</li>
-</ul>
-
-<p>sbt는 sbt를 실행하는 데 사용한 Scala 버전으로 프로젝트를 빌드한다.</p>
-
-<p><code>sbt run</code>으로 프로젝트를 실행하거나 <code>sbt console</code> 명령으로 <a href="http://www.scala-lang.org/node/2097">Scala REPL</a>을 연다. <code>sbt console</code>은 프로젝트의 클래스패스에서 실행하는 것이라서 프로젝트 소스를 이용한 Scala 코드를 라이브로 실행 수 있다.</p>
-
-<h2>빌드 정의하기</h2>
-
-<p>프로젝트들은 보통 손으로 설정해줘야 한다. 프로젝트 Base 디렉토리에 <code>build.sbt</code> 파일을 만들고 기본 설정을 한다.</p>
-
-<p>예를 들어, 프로젝트 Base 디렉토리가 <code>hello</code>라면 <code>hello/build.sbt</code> 파일에 다음과 같이 만든다:</p>
-
-<pre><code>name := "hello"
-
-version := "1.0"
-
-scalaVersion := "2.9.1"
-</code></pre>
-
-<p>각 아이템 사이에 빈 줄이 있는데 그냥 보기 좋으라고 넣은 것이 아니다. 아이템 사이에는 꼭 빈 줄을 넣어줘야 한다. <a href="/articles/2012/sbt-getting-started-sbt-build-definition.html">.sbt build definition</a>에서 <code>build.sbt</code> 파일을 작성하는 방법을 자세히 배운다.</p>
-
-<p>프로젝트를 jar 파일로 패키지할 거라면 <code>build.sbt</code> 파일에 버전과 이름 정도는 설정할 것이다.</p>
-
-<h2>sbt 버전 설정하기</h2>
-
-<p><code>hello/project/build.properteis</code> 파일에 어떤 버전의 sbt를 사용할지 명시할 수 있다. 다음과 같이 만든다:</p>
-
-<pre><code>sbt.version=0.11.3
-</code></pre>
-
-<p>0.10 버전부터는 버전이 올라가도 99% 이상 잘 호환된다. 하지만 <code>project/build.properties</code>에 sbt 버전을 명시하면 혹시 모를 문제를 예방할 수 있다.</p>]]>
-</content></entry><entry><title><![CDATA[ sbt: Getting Started Guide: Setup ]]></title><link href="http://dogfeet.github.com/articles/2012/sbt-getting-started-setup.html" /><updated>2012-07-02T15:00:00.000Z</updated><id>http://dogfeet.github.com/articles/2012/sbt-getting-started-setup.html</id><content type="html"><![CDATA[
-<p>이 글은 <a href="https://github.com/harrah/xsbt/wiki/Getting-Started-Welcome">Getting Started sbt</a>을 번역한 것이다. </p>
-
-<p><img src="http://dogfeet.github.com/articles/2012/sbt/sbt.png" alt="sbt" title="" /></p>
-
-<h2>Overview</h2>
-
-<p>다음과 같은 과정을 거쳐서 sbt 프로젝트를 만든다:</p>
-
-<ul>
-<li>sbt를 설치하고 실행할 스크립트를 만든다.</li>
-<li><a href="/articles/2012/sbt-getting-started-hello.html">hello-world</a> 프로젝트를 만든다.
-<ul><li>프로젝트 디렉토리를 만들고 소스를 넣는다.</li>
-<li>어떻게 빌드할지 정의한다.</li></ul></li>
-<li><a href="/articles/2012/sbt-getting-started-running.html">running</a>을 통해 sbt를 실행하는 법을 배운다.</li>
-<li><a href="/articles/2012/sbt-getting-started-sbt-build-definition.html">.sbt-build-definition</a>에서 어떻게 빌드할지 정의하는 법을 배운다.</li>
-</ul>
-
-<h2>sbt 설치</h2>
-
-<p><code>sbt-launch.jar</code> 파일과 실행할 스크립트만 있으면 된다.</p>
-
-<p><em>Note: 다운로드는 <a href="http://www.scala-sbt.org/download.html">다운로드 페이지</a>에서 할 수 있다.</em></p>
-
-<h3>Yum</h3>
-
-<p><a href="http://rpm.typesafe.com">Typesafe Yum 레파지토리</a>에 yum 패키지가 있다. <a href="http://rpm.typesafe.com/typesafe-repo-2.0.0-1.noarch.rpm">레파지토리 rpm 패키지</a>를 설치하면 typesafe yum 레파지토리가 승인된 소스 목록에 추가된다. 그리고 다음과 같이 실행한다:</p>
-
-<pre><code>yum install sbt
-</code></pre>
-
-<p>sbt의 최신 버전이 설치된다.</p>
-
-<p><em>Note: 이슈를 발견하면 <a href="https://github.com/sbt/sbt-launcher-package/issues">여기</a>에 신고할 수 있다.</em></p>
-
-<h2>Apt</h2>
-
-<p><a href="http://apt.typesafe.com">Typesafe Debian 레파지토리</a>에 sbt Debian 패키지가 있다. <a href="http://apt.typesafe.com/repo-deb-build-0002.deb">레파지토리 deb 패키지</a>를 설치하면 typesafe debian 레파지토리가 승인된 소스 목록에 추가된다. 그리고 다음과 같이 실행한다:</p>
-
-<pre><code>apt-get install sbt
-</code></pre>
-
-<p>sbt의 최신 버전이 설치된다.</p>
-
-<p>sbt 없으면 레파지토리에서 정보를 업데이트한다:</p>
-
-<pre><code>apt-get update
-</code></pre>
-
-<p><em>Note: 이슈를 발견하면 <a href="https://github.com/sbt/sbt-launcher-package/issues">여기</a>에 신고할 수 있다.</em></p>
-
-<h2>Gentoo</h2>
-
-<p>공식 소스 안에는 sbt용 ebuild 스크립트가 없다. 하지만 <a href='https://github.com/whiter4bbit/overlays/tree/master/dev-java/sbt-bin'>https://github.com/whiter4bbit/overlays/tree/master/dev-java/sbt-bin</a> 에 sbt를 머지하는 ebuild 스크립트가 있다. 다음과 같이 ebuild 스크립트로 sbt를 머지한다:</p>
-
-<pre><code>mkdir -p /usr/local/portage &amp;&amp; cd /usr/local/portage
-git clone git://github.com/whiter4bbit/overlays.git
-echo "PORTDIR_OVERLAY=$PORTDIR_OVERLAY /usr/local/portage/overlay" &gt;&gt; /etc/make.conf
-emerge sbt-bin
-</code></pre>
-
-<h2>Mac</h2>
-
-<p><a href="http://macports.org/">MacPorts</a>로 설치한다:</p>
-
-<pre><code>$ sudo port install sbt
-</code></pre>
-
-<p><a href="http://mxcl.github.com/homebrew/">HomeBrew</a>로 설치할 수 있다:</p>
-
-<pre><code>$ brew install sbt
-</code></pre>
-
-<p>sbt-launch.jar를 직접 다운로드할 필요 없다:</p>
-
-<h2>Windows</h2>
-
-<p><a href="http://scalasbt.artifactoryonline.com/scalasbt/sbt-native-packages/org/scala-sbt/sbt-launcher/0.11.3/sbt.msi">msi</a>를 다운로드한다:</p>
-
-<p><em>아니면</em></p>
-
-<p><code>sbt.bat</code> 배치 파일을 만든다:</p>
-
-<pre><code>set SCRIPT_DIR=%~dp0
-java -Xmx512M -jar "%SCRIPT_DIR%sbt-launch.jar" %*
-</code></pre>
-
-<p>그리고 그 디렉토리에 [sbt-launch.jar][] 파일을 넣는다. 커맨드 라인에서 'sbt'라고 실행하려면 PATH 환경 변수에 <code>sbt.bat</code>를 등록해준다.</p>
-
-<h2>Unix</h2>
-
-<p><a href="http://typesafe.artifactoryonline.com/typesafe/ivy-releases/org.scala-sbt/sbt-launch/0.11.3-2/sbt-launch.jar">sbt-launch.jar</a>를 다운로드해서 <code>~/bin</code> 디렉토리에 넣는다.</p>
-
-<p>이 jar 파일을 실행하는 스크립트를 'sbt'라는 이름으로 만들고 <code>~/bin</code> 디렉토리에 넣는다:</p>
-
-<pre><code>java -Xms512M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=384M -jar `dirname $0`/sbt-launch.jar "$@"
-</code></pre>
-
-<p>그리고 스크립트를 실행할 수 있게 만든다:</p>
-
-<pre><code>$ chmod u+x ~/bin/sbt
-</code></pre>
-
-<h2>팁, 노트</h2>
-
-<p>문제가 생겨서 <code>sbt</code>가 실행이 안되면 <a href="https://github.com/harrah/xsbt/wiki/Setup-Notes">설치 노트</a>를 확인하라. 터미널 엔코딩, HTTP 프록시, JVM 옵션 등에 대해 나와 있다.</p>
-
-<p>꼼꼼하게 만들어진 쉘 스크립트가 있어서 이 스크립트로 sbt를 설치할 수 있다: <a href='https://github.com/paulp/sbt-extras'>https://github.com/paulp/sbt-extras</a> (루트 디렉토리에 있는 sbt 파일). 이 스크립트로 설치하면 패키지로 설치하는 것처럼 원하는 버전의 sbt를 설치할 수 있다. 설치할 sbt의 버전을 선택한다든지 하는 유용한 옵션이 있다.</p>]]>
</content></entry></feed>
46 index.html
View
@@ -1,14 +1,36 @@
<!DOCTYPE html><html lang="en"><head><!--Meta--><meta charset="utf-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /><meta http-equiv="content-type" content="text/html; charset=utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" /><title>#dogfeet - 개발새발</title><meta name="description" content="정통 개발 주간 블로그입니다. 주 관심사는 학습과 WEB입니다." /><meta name="keywords" content="학습,Learning,HTML5,Mobile,Web,iPhone,Android,Git,JavaScript,Scala,개발새발,dogfeet" /><meta name="author" content="changwoo-park.html.md, sean-lee.html.md, yongjae-choi.html.md" /><!--Icons--><link rel="shortcut icon" href="images/favicon.ico" /><link rel="apple-touch-icon" href="images/apple-touch-icon.png" /><link rel="apple-touch-icon" sizes="72x72" href="images/apple-touch-icon-72x72.png" /><link rel="apple-touch-icon" sizes="114x114" href="images/apple-touch-icon-114x114.png" /><link rel="alternate" type="application/atom+xml" title="개발새발 &raquo; Feed" href="http://feeds.feedburner.com/github/dogfeet" /><!--Shims: IE6-8 support of HTML5 elements--><!--[if lt IE 9]>
<script async src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
- <![endif]--><!--Styles--><link rel="stylesheet" href="/css/bootstrap.min.css" media="screen, projection" /><link rel="stylesheet" href="/css/bootstrap-responsive.min.css" media="screen, projection" /><link rel="stylesheet" href="/styles/style.css" media="screen, projection" /><link rel="stylesheet" href="/styles/markdown.css" media="screen, projection" /><!--Scripts--><script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js"></script><script src="http://cdnjs.cloudflare.com/ajax/libs/modernizr/2.0.6/modernizr.min.js"></script><script src="http://connect.facebook.net/en_US/all.js#xfbml=1"></script><script src="/js/bootstrap.min.js"></script><script src="/scripts/script.js"></script></head><body><!--Topbar--><div class="navbar" navbar-fixed-top><div class="navbar-inner"><div class="container-fluid"><a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"><span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span></a><a class="brand" href="/">dogfeet</a><div class="nav-collapse"><ul class="nav"><li><a href="/site/tagmap.html">Tagmap</a></li><li><a href="/site/archive.html">Archive</a></li><li><a href="/site/atelier.html">Atelier</a></li><li><a href="http://feeds.feedburner.com/github/dogfeet"><img src="http://forum.tattersite.com/ko/style/Textcube/feed-icon.png" /></a></li></ul><form id="search-form" class="pull-right" action="http://google.com/search" method="get" navbar-search><input type="hidden" name="q" value="site:dogfeet.github.com" /><input type="text" name="q" results="0" placeholder="Search" search-query /></form></div></div></div></div><!--Markup--><div class="container-fluid"><div class="row-fluid"><section class="content" span10><article class="post"><header><a href="/articles/2012/git-delta.html"><h1>Git: 델타와 스냅샷</h1></a></header><footer class="modern-font" .small-font><span>by <a href="undefined">Changwoo Park</a></span>
+ <![endif]--><!--Styles--><link rel="stylesheet" href="/css/bootstrap.min.css" media="screen, projection" /><link rel="stylesheet" href="/css/bootstrap-responsive.min.css" media="screen, projection" /><link rel="stylesheet" href="/styles/style.css" media="screen, projection" /><link rel="stylesheet" href="/styles/markdown.css" media="screen, projection" /><!--Scripts--><script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js"></script><script src="http://cdnjs.cloudflare.com/ajax/libs/modernizr/2.0.6/modernizr.min.js"></script><script src="http://connect.facebook.net/en_US/all.js#xfbml=1"></script><script src="/js/bootstrap.min.js"></script><script src="/scripts/script.js"></script></head><body><!--Topbar--><div class="navbar" navbar-fixed-top><div class="navbar-inner"><div class="container-fluid"><a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"><span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span></a><a class="brand" href="/">dogfeet</a><div class="nav-collapse"><ul class="nav"><li><a href="/site/tagmap.html">Tagmap</a></li><li><a href="/site/archive.html">Archive</a></li><li><a href="/site/atelier.html">Atelier</a></li><li><a href="http://feeds.feedburner.com/github/dogfeet"><img src="http://forum.tattersite.com/ko/style/Textcube/feed-icon.png" /></a></li></ul><form id="search-form" class="pull-right" action="http://google.com/search" method="get" navbar-search><input type="hidden" name="q" value="site:dogfeet.github.com" /><input type="text" name="q" results="0" placeholder="Search" search-query /></form></div></div></div></div><!--Markup--><div class="container-fluid"><div class="row-fluid"><section class="content" span10><article class="post"><header><a href="/articles/2012/maven-scala-plugin.html"><h1>Maven에서 스크립트 사용하기</h1></a></header><footer class="modern-font" .small-font><span>by <a href="undefined">Changwoo Park</a></span>
+ | <span property="dc:created">2012 Sep 02</span>
+ | <a href="/site/tagmap.html#maven" class="tag">maven</a> <a href="/site/tagmap.html#scala" class="tag">scala</a> <a href="/site/tagmap.html#plugin" class="tag">plugin</a> | <span><a href="/articles/2012/maven-scala-plugin.html#disqus_thread" data-disqus-identifier="/articles/2012/maven-scala-plugin.html"></a></span>
+</footer><p>기본적으로 Maven에는 로직을 넣을 수 없다. 로직이 있으면 있는 대로 없으면 없는 대로 장단점이 있어서 일률적으로 '좋다', '나쁘다.'라고 말할 수 없다. 하지만, 나는 로직을 넣을 수 있는 것이 더 좋다. Ant도 그렇지만 Maven으로 프로젝트를 관리하다 보면 답답할 때가 잦다. 특히 자주 저지르는 실수를 검증하는 코드는 넣고 싶을 때가 잦다(항상 틀린 걸 또 틀리니까!).</p>
+
+<p>Maven에 Plugin으로 스크립트를 Embed할 방법이 있는데 <a href="http://maven.apache.org/plugins/maven-antrun-plugin/">maven-antrun-plugin</a>, <a href="http://groovy.codehaus.org/GMaven">gmaven-plugin</a>, <a href="http://scala-tools.org/mvnsites/maven-scala-plugin/">maven-scala-plugin</a>이 쓸만하다:</p>
+
+<ul>
+<li><code>maven-antrun-plugin</code>: run 골을 이용해서 ant 스크립트를 실행할 수 있다.</li>
+<li><code>gmaven-plugin</code>: execute 골을 이용해서 groovy 스크립트를 실행할 수 있다.</li>
+<li><code>maven-scala-plugin</code>: script 골을 이용해서 scala 스크립트를 실행할 수 있다.</li>
+</ul>
+
+<p><img src="/articles/2012/maven/maple.jpeg" alt="maple" title="" /><br />(from <a href='http://www.talismancoins.com/servlet/detail?no=920'>http://www.talismancoins.com/servlet/detail?no=920</a>)</p>
+
+<p><a class="btn" href="/articles/2012/maven-scala-plugin.html">Read more &raquo;</a></p></article><article class="post"><header><a href="/articles/2012/persist-cookie-of-uiwebview.html"><h1>UIWebView 쿠기 유지하기</h1></a></header><footer class="modern-font" .small-font><span>by <a href="undefined">Sean Lee</a></span>
+ | <span property="dc:created">2012 Aug 27</span>
+ | <a href="/site/tagmap.html#uiwebview" class="tag">uiwebview</a> <a href="/site/tagmap.html#ios" class="tag">ios</a> <a href="/site/tagmap.html#cookie" class="tag">cookie</a> <a href="/site/tagmap.html#쿠키" class="tag">쿠키</a> | <span><a href="/articles/2012/persist-cookie-of-uiwebview.html#disqus_thread" data-disqus-identifier="/articles/2012/persist-cookie-of-uiwebview.html"></a></span>
+</footer><p>애플리케이션에서 UIWebView를 사용할 때 쿠키를 저장하는 방법을 살펴본다. 쿠키를 저장하면 애플리케이션이 종료되더라도 로그인 상태 등을 유지할 수 있다. 서버가 특별히 쿠키의 지속 시간을 지정하지 않은 경우 쿠키는 애플리케이션이 종료되면(백그라운드에 남아있는 것과는 다르다) 쿠키 정보는 사라진다.</p>
+
+<p>UIWebView can save and restore cookies. Although application has terminated, the cookies and the session can be restored.</p>
+
+<p><img src="http://farm1.staticflickr.com/182/403856634_db35669863.jpg" width="500" height="375" alt="cookies do not always wish to remain stacked."><br /><em><a href="http://www.flickr.com/photos/klara/403856634/" title="Flickr에서 Klara Kim님의 cookies do not always wish to remain stacked.">cookies do not always wish to remain stacked. by klara</a></em></p>
+
+<p><a class="btn" href="/articles/2012/persist-cookie-of-uiwebview.html">Read more &raquo;</a></p></article><article class="post"><header><a href="/articles/2012/git-delta.html"><h1>Git: 델타와 스냅샷</h1></a></header><footer class="modern-font" .small-font><span>by <a href="undefined">Changwoo Park</a></span>
| <span property="dc:created">2012 Aug 25</span>
| <a href="/site/tagmap.html#git" class="tag">git</a> <a href="/site/tagmap.html#delta" class="tag">delta</a> <a href="/site/tagmap.html#diff" class="tag">diff</a> <a href="/site/tagmap.html#patch" class="tag">patch</a> | <span><a href="/articles/2012/git-delta.html#disqus_thread" data-disqus-identifier="/articles/2012/git-delta.html"></a></span>
-</footer><p>우리가 커밋을 하면 그 시점의 스냅샷을 저장하는 것이고 두 시점의 스냅샷을 비교하면 델타를 얻을 수 있다. VCS는 스냅샷이나 델타를 저장하고 누가, 언제, 왜 저장했는지 등을 추적하고 관리하는 시스템이다. 실제로 저장할 때도 스냅샷을 저장하는 시스템도 있고(SVN, git) 델타를 저장하는 시스템도 있다(git, hg).</p>
+</footer><p>우리가 커밋을 하면 그 시점의 스냅샷을 저장하는 것이고 두 시점의 스냅샷을 비교하면 델타를 얻을 수 있다. VCS는 스냅샷이나 델타를 저장하고 누가, 언제, 왜 저장했는지 등을 추적하고 관리하는 시스템이다. 실제로 저장할 때도 스냅샷을 저장하는 시스템도 있고(SVN, git) 델타를 저장하는 시스템도 있다(git, hg). 이 글은 델타 관점으로 git을 설명하고자 작성했다. 특정 시점을 의미하는 델타와 스냅샷을 두고 git이 어떻게 저장하는지 살펴보고, 델타를 구해서 적용하는 것으로 Merge/Rebase 명령어를 설명해보고자 한다.</p>
<p><img src="/articles/2012/git-delta/crime-and-sin.jpeg" alt="" title="" /></p>
-<p>이 글은 델타 관점으로 git을 설명하고자 작성했다. 특정 시점을 의미하는 델타와 스냅샷을 두고 git이 어떻게 저장하는지 Merge/Rebase 명령어가 실제로는 델타를 구해서 적용하는 것을 설명하고자 한다.</p>
-
<p><a class="btn" href="/articles/2012/git-delta.html">Read more &raquo;</a></p></article><article class="post"><header><a href="/articles/2012/meteor-fundametals-and-best-practices.html"><h1>Meteor: Learn Meteor Fundamentals and Best Practices</h1></a></header><footer class="modern-font" .small-font><span>by <a href="undefined">Changwoo Park</a></span>
| <span property="dc:created">2012 Aug 19</span>
| <a href="/site/tagmap.html#meteor" class="tag">meteor</a> <a href="/site/tagmap.html#node" class="tag">node</a> <a href="/site/tagmap.html#andrew scala" class="tag">Andrew Scala</a> | <span><a href="/articles/2012/meteor-fundametals-and-best-practices.html#disqus_thread" data-disqus-identifier="/articles/2012/meteor-fundametals-and-best-practices.html"></a></span>
@@ -55,21 +77,7 @@
<p><img src="/articles/2012/sbt/sbt.png" alt="sbt" title="" /></p>
-<p><a class="btn" href="/articles/2012/sbt-getting-started-directory-layout.html">Read more &raquo;</a></p></article><article class="post"><header><a href="/articles/2012/sbt-getting-started-hello.html"><h1>sbt: Getting Started Guide: Hello, World</h1></a></header><footer class="modern-font" .small-font><span>by <a href="undefined">Changwoo Park</a></span>
- | <span property="dc:created">2012 Jul 08</span>
- | <a href="/site/tagmap.html#sbt" class="tag">sbt</a> | <span><a href="/articles/2012/sbt-getting-started-hello.html#disqus_thread" data-disqus-identifier="/articles/2012/sbt-getting-started-hello.html"></a></span>
-</footer><p>이 글은 <a href="https://github.com/harrah/xsbt/wiki/Getting-Started-Welcome">Getting Started sbt</a>을 번역한 것이다.</p>
-
-<p><img src="/articles/2012/sbt/sbt.png" alt="sbt" title="" /></p>
-
-<p><a class="btn" href="/articles/2012/sbt-getting-started-hello.html">Read more &raquo;</a></p></article><article class="post"><header><a href="/articles/2012/sbt-getting-started-setup.html"><h1>sbt: Getting Started Guide: Setup</h1></a></header><footer class="modern-font" .small-font><span>by <a href="undefined">Changwoo Park</a></span>
- | <span property="dc:created">2012 Jul 03</span>
- | <a href="/site/tagmap.html#sbt" class="tag">sbt</a> | <span><a href="/articles/2012/sbt-getting-started-setup.html#disqus_thread" data-disqus-identifier="/articles/2012/sbt-getting-started-setup.html"></a></span>
-</footer><p>이 글은 <a href="https://github.com/harrah/xsbt/wiki/Getting-Started-Welcome">Getting Started sbt</a>을 번역한 것이다. </p>
-
-<p><img src="/articles/2012/sbt/sbt.png" alt="sbt" title="" /></p>
-
-<p><a class="btn" href="/articles/2012/sbt-getting-started-setup.html">Read more &raquo;</a></p></article><p><a class="btn info right" href="/site/archive.html">go to Archive &raquo;</a></p></section><aside class="sidebar" span2></aside></div><footer class="footer"><p>Copyright &copy; 2008-2012 Dogfeet from coding to pixels, powered by <a href="https://github.com/balupton/docpad">Docpad</a></p></footer></div><!--DISQUS--><script>var disqus_shortname = 'dogfeet-github';
+<p><a class="btn" href="/articles/2012/sbt-getting-started-directory-layout.html">Read more &raquo;</a></p></article><p><a class="btn info right" href="/site/archive.html">go to Archive &raquo;</a></p></section><aside class="sidebar" span2></aside></div><footer class="footer"><p>Copyright &copy; 2008-2012 Dogfeet from coding to pixels, powered by <a href="https://github.com/balupton/docpad">Docpad</a></p></footer></div><!--DISQUS--><script>var disqus_shortname = 'dogfeet-github';
(function () {
var s = document.createElement('script'); s.async = true;
s.type = 'text/javascript';
2  site/archive.html
View
1 addition, 1 deletion not shown
2  site/tagmap.html
View
1 addition, 1 deletion not shown
2  sitemap.xml
View
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
-<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"><url><loc>http://dogfeet.github.com</loc><lastmod>2012-08-25T06:59:24.613Z</lastmod><changefreq>weekly</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/git-delta.html</loc><lastmod>2012-08-24T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/meteor-fundametals-and-best-practices.html</loc><lastmod>2012-08-18T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/git-merge-rebase.html</loc><lastmod>2012-08-12T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/meteor-for-windows.html</loc><lastmod>2012-08-02T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/sbt-getting-started-basic-def.html</loc><lastmod>2012-07-29T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/site/about.html</loc><lastmod>2012-08-25T06:59:24.613Z</lastmod><changefreq>weekly</changefreq></url><url><loc>http://dogfeet.github.com/site/archive.html</loc><lastmod>2012-08-25T06:59:24.613Z</lastmod><changefreq>weekly</changefreq></url><url><loc>http://dogfeet.github.com/site/atelier.html</loc><lastmod>2012-08-25T06:59:24.613Z</lastmod><changefreq>weekly</changefreq></url><url><loc>http://dogfeet.github.com/authors/changwoo-park.html</loc><lastmod>2012-08-25T06:59:24.613Z</lastmod><changefreq>weekly</changefreq></url><url><loc>http://dogfeet.github.com/styles/markdown.css</loc><lastmod>2012-08-25T06:59:24.613Z</lastmod><changefreq>weekly</changefreq></url><url><loc>http://dogfeet.github.com/scripts/script.js</loc><lastmod>2012-08-25T06:59:24.613Z</lastmod><changefreq>weekly</changefreq></url><url><loc>http://dogfeet.github.com/authors/sean-lee.html</loc><lastmod>2012-08-25T06:59:24.613Z</lastmod><changefreq>weekly</changefreq></url><url><loc>http://dogfeet.github.com/sitemap.xml</loc><lastmod>2012-08-25T06:59:24.613Z</lastmod><changefreq>weekly</changefreq></url><url><loc>http://dogfeet.github.com/styles/style.css</loc><lastmod>2012-08-25T06:59:24.613Z</lastmod><changefreq>weekly</changefreq></url><url><loc>http://dogfeet.github.com/site/tagmap.html</loc><lastmod>2012-08-25T06:59:24.613Z</lastmod><changefreq>weekly</changefreq></url><url><loc>http://dogfeet.github.com/authors/yongjae-choi.html</loc><lastmod>2012-08-25T06:59:24.613Z</lastmod><changefreq>weekly</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/sbt-getting-started-running.html</loc><lastmod>2012-07-24T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/sbt-getting-started-directory-layout.html</loc><lastmod>2012-07-15T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/sbt-getting-started-hello.html</loc><lastmod>2012-07-07T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/sbt-getting-started-setup.html</loc><lastmod>2012-07-02T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/nodejs-monkey-patching.html</loc><lastmod>2012-06-23T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/iamport-nodejs.html</loc><lastmod>2012-06-16T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/nodejs-fibers.html</loc><lastmod>2012-06-09T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/iamport-python.html</loc><lastmod>2012-06-01T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/coroutine.html</loc><lastmod>2012-05-26T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/dogfeet-flavored-markdown.html</loc><lastmod>2012-05-19T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/nodejs-modules.html</loc><lastmod>2012-05-12T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/nodejs-npm-config.html</loc><lastmod>2012-05-04T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/the-game-of-go_a-programmers-perspective.html</loc><lastmod>2012-05-01T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/learning-j-chapter3.html</loc><lastmod>2012-04-30T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/git-svn.html</loc><lastmod>2012-04-28T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/ubuntu-desktop.html</loc><lastmod>2012-04-27T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/bash-profile.html</loc><lastmod>2012-04-21T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/learning-j-chapter2.html</loc><lastmod>2012-04-17T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/nodejs-mocha.html</loc><lastmod>2012-04-14T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/proxy-auto-config.html</loc><lastmod>2012-04-07T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/learning-j-chapter1.html</loc><lastmod>2012-04-06T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/how-to-github.html</loc><lastmod>2012-03-31T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/smacss-part2.html</loc><lastmod>2012-03-31T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/first-speach.html</loc><lastmod>2012-03-29T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/git-ff.html</loc><lastmod>2012-03-24T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/bash-completion.html</loc><lastmod>2012-03-17T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/smacss-icon-module.html</loc><lastmod>2012-03-07T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/git-tracking-vs-remote-tracking.html</loc><lastmod>2012-03-02T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/login-popup-captive-network.html</loc><lastmod>2012-02-26T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/npm-tricks.html</loc><lastmod>2012-02-24T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/by-example-continuation-passing-style-in-javascript.html</loc><lastmod>2012-02-24T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/backbonejs-by-example.html</loc><lastmod>2012-02-17T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/git-global-ignore.html</loc><lastmod>2012-02-09T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/ladybucks.html</loc><lastmod>2012-02-08T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/smacss.html</loc><lastmod>2012-02-03T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/git-translate-flow.html</loc><lastmod>2012-02-01T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/optimize-browser-rendering.html</loc><lastmod>2012-01-27T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/git-todo.html</loc><lastmod>2012-01-21T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/progit-retro.html</loc><lastmod>2012-01-14T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/git-branch-a-v.html</loc><lastmod>2012-01-14T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/progit.html</loc><lastmod>2012-01-07T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/git-conflict.html</loc><lastmod>2012-01-01T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/git-diff.html</loc><lastmod>2011-12-24T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/github-flow.html</loc><lastmod>2011-12-22T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/kinde-fire.html</loc><lastmod>2011-12-18T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/git-mergediff.html</loc><lastmod>2011-12-17T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/git-merge.html</loc><lastmod>2011-12-10T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/git-flow.html</loc><lastmod>2011-12-09T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/a-successful-git-branching-model.html</loc><lastmod>2011-12-06T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/git-refs.html</loc><lastmod>2011-12-02T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/bash-it.html</loc><lastmod>2011-12-01T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/git-helpers.html</loc><lastmod>2011-12-01T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/progit.html</loc><lastmod>2011-11-30T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/docpad.html</loc><lastmod>2011-11-25T16:06:05.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/cake.html</loc><lastmod>2011-11-21T16:06:05.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/coffee-kup.html</loc><lastmod>2011-11-21T16:06:05.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/1320111077.html</loc><lastmod>2011-11-01T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/1319732160.html</loc><lastmod>2011-10-27T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/1319339590.html</loc><lastmod>2011-10-23T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/1319251876.html</loc><lastmod>2011-10-22T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/1318481700.html</loc><lastmod>2011-10-13T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/1318386790.html</loc><lastmod>2011-10-12T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/1317873491.html</loc><lastmod>2011-10-06T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/1317888540.html</loc><lastmod>2011-10-06T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/1317779520.html</loc><lastmod>2011-10-05T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/1317693360.html</loc><lastmod>2011-10-04T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/1317341820.html</loc><lastmod>2011-09-30T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/1317342420.html</loc><lastmod>2011-09-30T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/1317370500.html</loc><lastmod>2011-09-30T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/1317258960.html</loc><lastmod>2011-09-29T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/1317201600.html</loc><lastmod>2011-09-28T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/1317086700.html</loc><lastmod>2011-09-27T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/1317088260.html</loc><lastmod>2011-09-27T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/1316924580.html</loc><lastmod>2011-09-25T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/1316738880.html</loc><lastmod>2011-09-23T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/1315993080.html</loc><lastmod>2011-09-14T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/1315529760.html</loc><lastmod>2011-09-09T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/1309906680.html</loc><lastmod>2011-07-05T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/1294884600.html</loc><lastmod>2011-01-13T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2010/1282271520.html</loc><lastmod>2010-08-20T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2010/1280382600.html</loc><lastmod>2010-07-29T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2010/1279777440.html</loc><lastmod>2010-07-22T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2010/1278573840.html</loc><lastmod>2010-07-08T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2010/1276068720.html</loc><lastmod>2010-06-09T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2010/1275620040.html</loc><lastmod>2010-06-04T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2010/1275352080.html</loc><lastmod>2010-06-01T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2010/1275286380.html</loc><lastmod>2010-05-31T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2010/1274067840.html</loc><lastmod>2010-05-17T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2010/1273557120.html</loc><lastmod>2010-05-11T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2010/1273214460.html</loc><lastmod>2010-05-07T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2010/1272949440.html</loc><lastmod>2010-05-04T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2010/1272334320.html</loc><lastmod>2010-04-27T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2010/1271743080.html</loc><lastmod>2010-04-20T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2010/1271748360.html</loc><lastmod>2010-04-20T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2010/1271648700.html</loc><lastmod>2010-04-19T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2010/1271653140.html</loc><lastmod>2010-04-19T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2010/1266806220.html</loc><lastmod>2010-02-22T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2010/1265361600.html</loc><lastmod>2010-02-05T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2010/1263755580.html</loc><lastmod>2010-01-17T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2010/1263483780.html</loc><lastmod>2010-01-14T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2009/1261931280.html</loc><lastmod>2009-12-27T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2009/1260510300.html</loc><lastmod>2009-12-11T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2009/1259821740.html</loc><lastmod>2009-12-03T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2009/1259735220.html</loc><lastmod>2009-12-02T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2009/1257832500.html</loc><lastmod>2009-11-10T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2009/1257843480.html</loc><lastmod>2009-11-10T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2009/1253444040.html</loc><lastmod>2009-09-23T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2009/1253428440.html</loc><lastmod>2009-09-20T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2009/1253429760.html</loc><lastmod>2009-09-20T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2009/1251975360.html</loc><lastmod>2009-09-03T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2009/1251363000.html</loc><lastmod>2009-08-27T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2009/1251363780.html</loc><lastmod>2009-08-27T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2009/1250666580.html</loc><lastmod>2009-08-19T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2009/1238754840.html</loc><lastmod>2009-04-03T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2009/1238686320.html</loc><lastmod>2009-04-02T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2009/1238601780.html</loc><lastmod>2009-04-01T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2009/1238380980.html</loc><lastmod>2009-03-30T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2009/1237194420.html</loc><lastmod>2009-03-16T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2009/1237202340.html</loc><lastmod>2009-03-16T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2009/1233479340.html</loc><lastmod>2009-02-01T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2009/1230888060.html</loc><lastmod>2009-01-02T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2008/1225019880.html</loc><lastmod>2008-10-26T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2008/1220695860.html</loc><lastmod>2008-09-06T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2008/1219754880.html</loc><lastmod>2008-08-26T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2008/1219110060.html</loc><lastmod>2008-08-19T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/atom.xml</loc><lastmod>2012-08-25T06:59:24.613Z</lastmod><changefreq>weekly</changefreq></url><url><loc>http://dogfeet.github.com/index.html</loc><lastmod>2012-08-25T06:59:24.613Z</lastmod><changefreq>weekly</changefreq></url></urlset>
+<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"><url><loc>http://dogfeet.github.com</loc><lastmod>2012-09-02T00:10:56.238Z</lastmod><changefreq>weekly</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/maven-scala-plugin.html</loc><lastmod>2012-09-01T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/persist-cookie-of-uiwebview.html</loc><lastmod>2012-08-27T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/git-delta.html</loc><lastmod>2012-08-24T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/meteor-fundametals-and-best-practices.html</loc><lastmod>2012-08-18T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/git-merge-rebase.html</loc><lastmod>2012-08-12T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/meteor-for-windows.html</loc><lastmod>2012-08-02T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/sbt-getting-started-basic-def.html</loc><lastmod>2012-07-29T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/site/about.html</loc><lastmod>2012-09-02T00:10:56.238Z</lastmod><changefreq>weekly</changefreq></url><url><loc>http://dogfeet.github.com/site/archive.html</loc><lastmod>2012-09-02T00:10:56.238Z</lastmod><changefreq>weekly</changefreq></url><url><loc>http://dogfeet.github.com/site/atelier.html</loc><lastmod>2012-09-02T00:10:56.238Z</lastmod><changefreq>weekly</changefreq></url><url><loc>http://dogfeet.github.com/authors/changwoo-park.html</loc><lastmod>2012-09-02T00:10:56.238Z</lastmod><changefreq>weekly</changefreq></url><url><loc>http://dogfeet.github.com/styles/markdown.css</loc><lastmod>2012-09-02T00:10:56.238Z</lastmod><changefreq>weekly</changefreq></url><url><loc>http://dogfeet.github.com/scripts/script.js</loc><lastmod>2012-09-02T00:10:56.238Z</lastmod><changefreq>weekly</changefreq></url><url><loc>http://dogfeet.github.com/authors/sean-lee.html</loc><lastmod>2012-09-02T00:10:56.238Z</lastmod><changefreq>weekly</changefreq></url><url><loc>http://dogfeet.github.com/sitemap.xml</loc><lastmod>2012-09-02T00:10:56.238Z</lastmod><changefreq>weekly</changefreq></url><url><loc>http://dogfeet.github.com/styles/style.css</loc><lastmod>2012-09-02T00:10:56.238Z</lastmod><changefreq>weekly</changefreq></url><url><loc>http://dogfeet.github.com/site/tagmap.html</loc><lastmod>2012-09-02T00:10:56.238Z</lastmod><changefreq>weekly</changefreq></url><url><loc>http://dogfeet.github.com/authors/yongjae-choi.html</loc><lastmod>2012-09-02T00:10:56.238Z</lastmod><changefreq>weekly</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/sbt-getting-started-running.html</loc><lastmod>2012-07-24T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/sbt-getting-started-directory-layout.html</loc><lastmod>2012-07-15T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/sbt-getting-started-hello.html</loc><lastmod>2012-07-07T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/sbt-getting-started-setup.html</loc><lastmod>2012-07-02T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/nodejs-monkey-patching.html</loc><lastmod>2012-06-23T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/iamport-nodejs.html</loc><lastmod>2012-06-16T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/nodejs-fibers.html</loc><lastmod>2012-06-09T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/iamport-python.html</loc><lastmod>2012-06-01T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/coroutine.html</loc><lastmod>2012-05-26T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/dogfeet-flavored-markdown.html</loc><lastmod>2012-05-19T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/nodejs-modules.html</loc><lastmod>2012-05-12T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/nodejs-npm-config.html</loc><lastmod>2012-05-04T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/the-game-of-go_a-programmers-perspective.html</loc><lastmod>2012-05-01T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/learning-j-chapter3.html</loc><lastmod>2012-04-30T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/git-svn.html</loc><lastmod>2012-04-28T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/ubuntu-desktop.html</loc><lastmod>2012-04-27T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/bash-profile.html</loc><lastmod>2012-04-21T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/learning-j-chapter2.html</loc><lastmod>2012-04-17T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/nodejs-mocha.html</loc><lastmod>2012-04-14T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/proxy-auto-config.html</loc><lastmod>2012-04-07T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/learning-j-chapter1.html</loc><lastmod>2012-04-06T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/how-to-github.html</loc><lastmod>2012-03-31T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/smacss-part2.html</loc><lastmod>2012-03-31T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/first-speach.html</loc><lastmod>2012-03-29T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/git-ff.html</loc><lastmod>2012-03-24T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/bash-completion.html</loc><lastmod>2012-03-17T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/smacss-icon-module.html</loc><lastmod>2012-03-07T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/git-tracking-vs-remote-tracking.html</loc><lastmod>2012-03-02T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/login-popup-captive-network.html</loc><lastmod>2012-02-26T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/npm-tricks.html</loc><lastmod>2012-02-24T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/by-example-continuation-passing-style-in-javascript.html</loc><lastmod>2012-02-24T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/backbonejs-by-example.html</loc><lastmod>2012-02-17T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/git-global-ignore.html</loc><lastmod>2012-02-09T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/ladybucks.html</loc><lastmod>2012-02-08T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/smacss.html</loc><lastmod>2012-02-03T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/git-translate-flow.html</loc><lastmod>2012-02-01T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/optimize-browser-rendering.html</loc><lastmod>2012-01-27T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/git-todo.html</loc><lastmod>2012-01-21T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/progit-retro.html</loc><lastmod>2012-01-14T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/git-branch-a-v.html</loc><lastmod>2012-01-14T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/progit.html</loc><lastmod>2012-01-07T15:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2012/git-conflict.html</loc><lastmod>2012-01-01T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/git-diff.html</loc><lastmod>2011-12-24T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/github-flow.html</loc><lastmod>2011-12-22T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/kinde-fire.html</loc><lastmod>2011-12-18T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/git-mergediff.html</loc><lastmod>2011-12-17T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/git-merge.html</loc><lastmod>2011-12-10T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/git-flow.html</loc><lastmod>2011-12-09T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/a-successful-git-branching-model.html</loc><lastmod>2011-12-06T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/git-refs.html</loc><lastmod>2011-12-02T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/bash-it.html</loc><lastmod>2011-12-01T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/git-helpers.html</loc><lastmod>2011-12-01T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/progit.html</loc><lastmod>2011-11-30T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/docpad.html</loc><lastmod>2011-11-25T16:06:05.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/cake.html</loc><lastmod>2011-11-21T16:06:05.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/coffee-kup.html</loc><lastmod>2011-11-21T16:06:05.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/1320111077.html</loc><lastmod>2011-11-01T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/1319732160.html</loc><lastmod>2011-10-27T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/1319339590.html</loc><lastmod>2011-10-23T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/1319251876.html</loc><lastmod>2011-10-22T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/1318481700.html</loc><lastmod>2011-10-13T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/1318386790.html</loc><lastmod>2011-10-12T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/1317873491.html</loc><lastmod>2011-10-06T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/1317888540.html</loc><lastmod>2011-10-06T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/1317779520.html</loc><lastmod>2011-10-05T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/1317693360.html</loc><lastmod>2011-10-04T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/1317341820.html</loc><lastmod>2011-09-30T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/1317342420.html</loc><lastmod>2011-09-30T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/1317370500.html</loc><lastmod>2011-09-30T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/1317258960.html</loc><lastmod>2011-09-29T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/1317201600.html</loc><lastmod>2011-09-28T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/1317086700.html</loc><lastmod>2011-09-27T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/1317088260.html</loc><lastmod>2011-09-27T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/1316924580.html</loc><lastmod>2011-09-25T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/1316738880.html</loc><lastmod>2011-09-23T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/1315993080.html</loc><lastmod>2011-09-14T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/1315529760.html</loc><lastmod>2011-09-09T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/1309906680.html</loc><lastmod>2011-07-05T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2011/1294884600.html</loc><lastmod>2011-01-13T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2010/1282271520.html</loc><lastmod>2010-08-20T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2010/1280382600.html</loc><lastmod>2010-07-29T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2010/1279777440.html</loc><lastmod>2010-07-22T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2010/1278573840.html</loc><lastmod>2010-07-08T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2010/1276068720.html</loc><lastmod>2010-06-09T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2010/1275620040.html</loc><lastmod>2010-06-04T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2010/1275352080.html</loc><lastmod>2010-06-01T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2010/1275286380.html</loc><lastmod>2010-05-31T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2010/1274067840.html</loc><lastmod>2010-05-17T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2010/1273557120.html</loc><lastmod>2010-05-11T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2010/1273214460.html</loc><lastmod>2010-05-07T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2010/1272949440.html</loc><lastmod>2010-05-04T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2010/1272334320.html</loc><lastmod>2010-04-27T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2010/1271743080.html</loc><lastmod>2010-04-20T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2010/1271748360.html</loc><lastmod>2010-04-20T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2010/1271648700.html</loc><lastmod>2010-04-19T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2010/1271653140.html</loc><lastmod>2010-04-19T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2010/1266806220.html</loc><lastmod>2010-02-22T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2010/1265361600.html</loc><lastmod>2010-02-05T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2010/1263755580.html</loc><lastmod>2010-01-17T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2010/1263483780.html</loc><lastmod>2010-01-14T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2009/1261931280.html</loc><lastmod>2009-12-27T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2009/1260510300.html</loc><lastmod>2009-12-11T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2009/1259821740.html</loc><lastmod>2009-12-03T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2009/1259735220.html</loc><lastmod>2009-12-02T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2009/1257832500.html</loc><lastmod>2009-11-10T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2009/1257843480.html</loc><lastmod>2009-11-10T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2009/1253444040.html</loc><lastmod>2009-09-23T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2009/1253428440.html</loc><lastmod>2009-09-20T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2009/1253429760.html</loc><lastmod>2009-09-20T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2009/1251975360.html</loc><lastmod>2009-09-03T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2009/1251363000.html</loc><lastmod>2009-08-27T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2009/1251363780.html</loc><lastmod>2009-08-27T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2009/1250666580.html</loc><lastmod>2009-08-19T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2009/1238754840.html</loc><lastmod>2009-04-03T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2009/1238686320.html</loc><lastmod>2009-04-02T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2009/1238601780.html</loc><lastmod>2009-04-01T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2009/1238380980.html</loc><lastmod>2009-03-30T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2009/1237194420.html</loc><lastmod>2009-03-16T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2009/1237202340.html</loc><lastmod>2009-03-16T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2009/1233479340.html</loc><lastmod>2009-02-01T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2009/1230888060.html</loc><lastmod>2009-01-02T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2008/1225019880.html</loc><lastmod>2008-10-26T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2008/1220695860.html</loc><lastmod>2008-09-06T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2008/1219754880.html</loc><lastmod>2008-08-26T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/articles/2008/1219110060.html</loc><lastmod>2008-08-19T00:00:00.000Z</lastmod><changefreq>never</changefreq></url><url><loc>http://dogfeet.github.com/atom.xml</loc><lastmod>2012-09-02T00:10:56.238Z</lastmod><changefreq>weekly</changefreq></url><url><loc>http://dogfeet.github.com/index.html</loc><lastmod>2012-09-02T00:10:56.238Z</lastmod><changefreq>weekly</changefreq></url></urlset>
Please sign in to comment.
Something went wrong with that request. Please try again.