<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8182501247262747119</id><updated>2012-02-28T13:22:04.063+09:00</updated><category term='truffles'/><category term='node.js'/><category term='dotcloud'/><category term='func'/><category term='javascript'/><category term='java'/><category term='html5'/><category term='ListAdapter'/><category term='reduce'/><category term='vm'/><category term='object'/><category term='map'/><category term='hosting'/><category term='struct'/><category term='callback'/><category term='requestAnimFrame'/><category term='algorithm'/><category term='golang'/><category term='go'/><category term='filter'/><category term='iteration'/><category term='array'/><category term='tcp'/><category term='jquery'/><category term='audio'/><category term='carousel'/><category term='forEach'/><category term='chocolat'/><category term='android'/><category term='player'/><category term='animation'/><category term='pattern'/><category term='routing'/><category term='redmine'/><category term='prototype'/><title type='text'>spectrum learns to dig</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://spectrumdig.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8182501247262747119/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://spectrumdig.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>jaeho lee</name><uri>https://profiles.google.com/110687673892501970268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-Jwtg9OLo-N0/AAAAAAAAAAI/AAAAAAAADco/jAp295u7dEI/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>26</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8182501247262747119.post-90735351371764916</id><published>2012-02-24T06:17:00.000+09:00</published><updated>2012-02-24T06:17:22.257+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vm'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>느려터진 안드로이드 에뮬은 버리고 VM을 쓰자.</title><content type='html'>iOS개발 환경이 안드로이드보다 우월점은 여러가지가 있겠지만&lt;br /&gt;개인적으로 가장 큰부분이라고 생각하는 점이 iOS Simulator 의 넘사벽 속도다.&lt;br /&gt;사실 iOS 의 경우 Emulator 가 아니라 Simulator 라는 훼이크를 써서 그런건데.&lt;br /&gt;하드웨어+소프트웨어를 같이 하는 회사만이 쓸 수 있는 필살기라 볼 수 있다.&lt;br /&gt;&lt;br /&gt;반면 안드로이드의 경우 ARM 에뮬레이터를 사용하는데&lt;br /&gt;이게 참 못만들었다.&lt;br /&gt;플스에뮬이나 GBA에뮬 반정도만 만들어도 써줄텐데 아직 갈길이 멀다.&lt;br /&gt;그래서 구시렁 거리면서 하드웨어를 연결해서 테스트를 하고 있는데&lt;br /&gt;역시 USB연결하는 건 불편하고&lt;br /&gt;apk 를 전송하는 과정도 그다지 빠르지 않아서 개발 생산성이 월등히 나아지지는 않는다.&lt;br /&gt;루팅을 하면 wifi 를 통해 apk 를 인스톨 할 수 있다고 해서&lt;br /&gt;몇 가지를 해보았으나 잘 모르겠지만 인스톨까진 잘 되었는데 디버깅 모드로 실행이 되지 않아 그만두었다. 게다가 전송속도도 USB보다 wifi가 느리고 맘에 들지 않더라.&lt;br /&gt;그러던중 stackoverflow.com(늘 신세지고 있습니다) 에서&lt;br /&gt;&lt;br /&gt;"VM으로 안드로이드를 띄워서 adb connect 하면 좋아!"&lt;br /&gt;라는 글에 눈이 번쩍.&lt;br /&gt;&lt;br /&gt;시행착오를 몇번 했지만 의외로 간단하더라.&lt;br /&gt;&lt;br /&gt;1. VMWare건 VirtualBox건 상관없다. VM호스트를 준비하자.&lt;br /&gt;2.&amp;nbsp;http://www.android-x86.org/download 로 가서&amp;nbsp;&lt;a href="http://code.google.com/p/android-x86/downloads/detail?name=android-x86-2.2-generic.iso&amp;amp;can=2&amp;amp;q="&gt;Deprecated x86 2.2 generic&lt;/a&gt;&amp;nbsp;을 받자.&lt;br /&gt;&lt;br /&gt;Q) 왜 Deprecated 인 2.2 generic 을 받나요. Deprecated는 쓰면 안되는 거 아님?&lt;br /&gt;A) &lt;a href="http://mariuz.android-dev.ro/vm.iso.7z"&gt;http://mariuz.android-dev.ro/vm.iso.7z&lt;/a&gt; 도 있다고 한다.&amp;nbsp;http://www.android-x86.org/download 에 있는 요즘 것들은 죄다 안된다.&lt;br /&gt;&lt;br /&gt;3. 죄다 일단 Default 설정에 yes yes 하고 설치한다. 한글 문서가 필요한 분은 "카카오톡 PC"로 검색하면 만족하실만한 내용이 나올 것이다.&lt;br /&gt;4. 부팅 후 Live CD 와 Installation이 나오는데 당연히 Installation&lt;br /&gt;5. Choose Partition / Create/Modify partitions&lt;br /&gt;6. 파티션 만들자. new / primary / bootable / write / yes 하고 quit&lt;br /&gt;7. Choose Partition / sda1 ... 가 첫번째로 추가된 것을 확인하고 엔터&lt;br /&gt;8. ext3 으로 포멧&lt;br /&gt;9. grub 설치 yes&lt;br /&gt;10. /system 디렉토리를 읽고 쓰기할거냐라고 묻는데 맘대로 하세요. yes 했음.&lt;br /&gt;11. Congratulation 나오면 Create a fake SD card 엔터&lt;br /&gt;12. 리붓&lt;br /&gt;13. HDPI 나 MDPI 둘중 선택 (해상도가 다르다)&lt;br /&gt;14. 겁나 빠른 부팅&lt;br /&gt;15. 이 화면을 보았으면 일단 OK&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-R8uOK6LYepI/T0ad0iQ_IPI/AAAAAAAAFJY/YuMYSVCsToA/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-02-24+%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB+5.12.04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="271" src="http://1.bp.blogspot.com/-R8uOK6LYepI/T0ad0iQ_IPI/AAAAAAAAFJY/YuMYSVCsToA/s320/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-02-24+%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB+5.12.04.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;16. alt+f1을 눌러 console 상태로 들어간다.&lt;br /&gt;17. ifconfig eth0 을 입력하여 ethernet 어댑터의 ip 정보를 메모한다.&lt;br /&gt;18. 터미널 혹은 커맨드 창을 열어 adb connect &amp;lt;ip&amp;gt; 때려서 연결&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-wuF7JbpKoqk/T0afEOfYIHI/AAAAAAAAFJo/PRKyuvO8IoY/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-02-24+%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB+4.50.30.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="252" src="http://1.bp.blogspot.com/-wuF7JbpKoqk/T0afEOfYIHI/AAAAAAAAFJo/PRKyuvO8IoY/s320/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-02-24+%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB+4.50.30.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;19. 5555 포트에 연결한 것을 확인한다.&lt;br /&gt;20. 수고하셨습니다.&lt;br /&gt;&lt;br /&gt;Eclipse/IntelliJ 등에서 실행하면 에뮬레이터가 아니라 연결한다.&lt;br /&gt;말도 안되게 빠르다;;;;;&lt;br /&gt;20MB 넘는 apk파일 구동하는데 업로드에서 인스톨까지 2초면 된다.&lt;br /&gt;게임같이 하드웨어 의존이 많은 어플리케이션이면 모를까 느려터진 에뮬을 쓸 이유가 없다.&lt;br /&gt;&lt;br /&gt;ESC,마우스 오른쪽버튼이 Back&lt;br /&gt;Cmd(아마 윈도우에선 CTRL?) 키가 HOME&lt;br /&gt;ALT+F4, ALT+F6 F6 이 전원 버튼 꾸욱&lt;br /&gt;ALT+F1 이 console mode&lt;br /&gt;ALT+F7 이 복귀&lt;br /&gt;ALT+F3 이 Call log&lt;br /&gt;&lt;br /&gt;대충 이정도 메뉴키는 뭔지 모르겠다. windows 에선 윈도우키라는 소리가 있다.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8182501247262747119-90735351371764916?l=spectrumdig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spectrumdig.blogspot.com/feeds/90735351371764916/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://spectrumdig.blogspot.com/2012/02/vm.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8182501247262747119/posts/default/90735351371764916'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8182501247262747119/posts/default/90735351371764916'/><link rel='alternate' type='text/html' href='http://spectrumdig.blogspot.com/2012/02/vm.html' title='느려터진 안드로이드 에뮬은 버리고 VM을 쓰자.'/><author><name>jaeho lee</name><uri>https://profiles.google.com/110687673892501970268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-Jwtg9OLo-N0/AAAAAAAAAAI/AAAAAAAADco/jAp295u7dEI/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-R8uOK6LYepI/T0ad0iQ_IPI/AAAAAAAAFJY/YuMYSVCsToA/s72-c/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-02-24+%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB+5.12.04.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8182501247262747119.post-4584387369617775947</id><published>2012-02-23T14:33:00.006+09:00</published><updated>2012-02-23T14:36:35.119+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='animation'/><category scheme='http://www.blogger.com/atom/ns#' term='carousel'/><title type='text'>javascript 3d round carousel</title><content type='html'>&lt;a href="http://jsdo.it/spectrum/carousel"&gt;http://jsdo.it/spectrum/carousel&lt;/a&gt;&lt;br /&gt;역시나 맘에 드는게 없어서 만들었다.&lt;br /&gt;어렵지 않을려나 싶었는데 생각보다 얼마 안걸림.&lt;br /&gt;역시 모닝 코딩인가.&lt;br /&gt;querySelectorAll 때문에 $s 랑, items() 를 프로토타입에서 array를 반환하도록 하여 forEach를 돌릴 수 있도록 소금(salt)을 쳤다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;var $=function(selector) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; return document.querySelector(selector);&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;var $s=function(selector) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; return document.querySelectorAll(selector);&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;NodeList.prototype.items=function() {&lt;br /&gt;&amp;nbsp; &amp;nbsp; var array=[];&lt;br /&gt;&amp;nbsp; &amp;nbsp; for (var i=0; i&amp;lt;this.length; i++) {&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;array[i]=this.item(i);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; return array;&lt;br /&gt;};&lt;br /&gt;var p={&lt;br /&gt;&amp;nbsp; &amp;nbsp; objects: [],&lt;br /&gt;&amp;nbsp; &amp;nbsp; idx: 0,&lt;br /&gt;&amp;nbsp; &amp;nbsp; radius: 100,&lt;br /&gt;&amp;nbsp; &amp;nbsp; onLoad: function() {&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;$('#turnLeft').onclick=p.turnLeft;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;$('#turnRight').onclick=p.turnRight;&lt;br /&gt;&amp;nbsp; &amp;nbsp; },&lt;br /&gt;&amp;nbsp; &amp;nbsp; turnLeft: function() {&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;p.objects.items().forEach(function(v) {&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt; &amp;nbsp; &amp;nbsp;v.classList.add('ease');&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;});&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;p.idx--;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;p.renderCarousel(p.idx);&lt;br /&gt;&amp;nbsp; &amp;nbsp; },&lt;br /&gt;&amp;nbsp; &amp;nbsp; turnRight: function() {&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;p.objects.items().forEach(function(v) {&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt; &amp;nbsp; &amp;nbsp;v.classList.add('ease');&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;});&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;p.idx++;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;p.renderCarousel(p.idx);&lt;br /&gt;&amp;nbsp; &amp;nbsp; },&lt;br /&gt;&amp;nbsp; &amp;nbsp; renderCarousel: function(idx) {&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;p.objects.items().forEach(function(v,k) {&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt; &amp;nbsp; &amp;nbsp;var degree = 90+(k+idx)* (360/p.objects.length);&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt; &amp;nbsp; &amp;nbsp;var x = $('ul').offsetWidth/2 - v.offsetWidth/2 +&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;p.radius*Math.cos(degree*Math.PI/180);&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt; &amp;nbsp; &amp;nbsp;var y = $('ul').offsetHeight/2 - v.offsetHeight/2 +&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;p.radius*Math.sin(degree*Math.PI/180) / 2;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt; &amp;nbsp; &amp;nbsp;// cos의 min/max 는 270일때 -1, 90일때 1&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt; &amp;nbsp; &amp;nbsp;// 1 - &amp;nbsp; 하면 &amp;nbsp; &amp;nbsp; [-1, 1] &amp;gt; [2, 0] (뒤집힘)&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt; &amp;nbsp; &amp;nbsp;// / 2 &amp;nbsp; 하면 &amp;nbsp; &amp;nbsp; [1, 0]이 됨.&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt; &amp;nbsp; &amp;nbsp;// * (1-2/5) 하면 [3/5, 0]&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt; &amp;nbsp; &amp;nbsp;// 1 - &amp;nbsp; 하면 &amp;nbsp; &amp;nbsp; [2/5, 1]&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt; &amp;nbsp; &amp;nbsp;var scale = (1-(1-Math.sin(degree*Math.PI/180))/2*(1-2/5));&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt; &amp;nbsp; &amp;nbsp;v.setAttribute('style',&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt; &amp;nbsp; 'left:'+parseInt(x,10)+'px;'+&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt; &amp;nbsp; 'top:'+parseInt(y,10)+'px;'+&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt; &amp;nbsp; 'z-index:'+parseInt(y,10)+';'+&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt; &amp;nbsp; '-webkit-transform: scale('+scale+');'&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt; &amp;nbsp;);&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;});&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;};&lt;br /&gt;document.ontouchmove = function(e){ e.preventDefault(); };&lt;br /&gt;p.objects=$s('ul#container&amp;gt;li');&lt;br /&gt;p.renderCarousel(p.idx);&lt;br /&gt;window.onload=p.onLoad;&lt;br /&gt;&lt;br /&gt;ul 안에 li를 몇개든 넣어보자.&lt;br /&gt;중심을 기준으로 반지름은 100px, 종횡비는 2/5:1 정도인데 입맛대로 수정하면 됨.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8182501247262747119-4584387369617775947?l=spectrumdig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spectrumdig.blogspot.com/feeds/4584387369617775947/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://spectrumdig.blogspot.com/2012/02/javascript-3d-round-carousel.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8182501247262747119/posts/default/4584387369617775947'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8182501247262747119/posts/default/4584387369617775947'/><link rel='alternate' type='text/html' href='http://spectrumdig.blogspot.com/2012/02/javascript-3d-round-carousel.html' title='javascript 3d round carousel'/><author><name>jaeho lee</name><uri>https://profiles.google.com/110687673892501970268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-Jwtg9OLo-N0/AAAAAAAAAAI/AAAAAAAADco/jAp295u7dEI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8182501247262747119.post-5140372501313416788</id><published>2012-02-20T23:29:00.001+09:00</published><updated>2012-02-20T23:29:16.499+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='html5'/><category scheme='http://www.blogger.com/atom/ns#' term='audio'/><title type='text'>html5 audio player를 만들어 보았다. #2</title><content type='html'>&lt;a href="http://spectrumdig.blogspot.com/2012/02/html5-audio-player.html" target="_blank"&gt;html5 audio player를 만들어 보았다.&lt;/a&gt;&lt;br /&gt;에서 언급했던 audio player 를 조금 업데이트.&lt;br /&gt;&lt;br /&gt;마찬가지로 소스는 이곳 :&amp;nbsp;&lt;a href="http://jsdo.it/spectrum/webAudioPlayer"&gt;http://jsdo.it/spectrum/webAudioPlayer&lt;/a&gt;&lt;br /&gt;플레이 전용(모바일 등등)은&amp;nbsp;&lt;a href="http://jsrun.it/spectrum/webAudioPlayer"&gt;http://jsrun.it/spectrum/webAudioPlayer&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;전체 시간을 보여주고 재생 배속을 설정할 수 있다.&lt;br /&gt;소스는 대동소이.&lt;br /&gt;duration 을 사용. 전체 재생 길이를 보여주고&lt;br /&gt;playbackRate 으로 재생 배속을 변경하도록 하였다.&lt;br /&gt;&lt;a href="http://dev.w3.org/html5/spec/Overview.html#htmlmediaelement"&gt;http://dev.w3.org/html5/spec/Overview.html#htmlmediaelement&lt;/a&gt;&lt;br /&gt;의외로 오디오 재생 피치를 유지한 상태로 정말 배속만 변하더라.&lt;br /&gt;double 값이라서 세세한 조정은 가능함.&lt;br /&gt;아쉽게도 android/iOS에서는 배속 지원은 안함.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$=function(element) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; return document.querySelector(element);&lt;br /&gt;};&lt;br /&gt;p={&lt;br /&gt;&amp;nbsp; &amp;nbsp; audio : null,&lt;br /&gt;&amp;nbsp; &amp;nbsp; onLoad: function() {&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;p.audio = new Audio('http://k003.kiwi6.com/hotlink/3dgmyavs49/your_name_ft_gaduk.mp3');&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;$('#play').onclick=p.onPlay;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;$('#stop').onclick=p.onStop;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;$('#pause').onclick=p.onPause;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;$('#rew10').onclick=p.on10rew;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;$('#ff10').onclick=p.on10ff;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;$('#rate').onclick=p.onRate;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;p.audio.addEventListener('timeupdate', p.onTimeUpdate, false);&lt;br /&gt;&amp;nbsp; &amp;nbsp; },&lt;br /&gt;&amp;nbsp; &amp;nbsp; onPlay: function() {&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;p.audio.play();&lt;br /&gt;&amp;nbsp; &amp;nbsp; },&lt;br /&gt;&amp;nbsp; &amp;nbsp; onStop: function() {&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;p.audio.currentTime = 0;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;p.onPause();&lt;br /&gt;&amp;nbsp; &amp;nbsp; },&lt;br /&gt;&amp;nbsp; &amp;nbsp; onPause: function() {&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;p.audio.pause();&lt;br /&gt;&amp;nbsp; &amp;nbsp; },&lt;br /&gt;&amp;nbsp; &amp;nbsp; on10rew: function() {&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;p.audio.currentTime -=10;&lt;br /&gt;&amp;nbsp; &amp;nbsp; },&lt;br /&gt;&amp;nbsp; &amp;nbsp; on10ff: function() {&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;p.audio.currentTime +=10;&lt;br /&gt;&amp;nbsp; &amp;nbsp; },&lt;br /&gt;&amp;nbsp; &amp;nbsp; onRate: function() {&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;var rate = $('#rate').textContent;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;$('#rate').textContent= rate === '1x' ? '2x' : rate === '2x' ? '1/2x' : '1x';&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;rate = $('#rate').textContent;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;p.audio.playbackRate = rate === '1x' ? 1.0 : rate=== '2x' ? 2.0 : 0.5;&lt;br /&gt;&amp;nbsp; &amp;nbsp; },&lt;br /&gt;&amp;nbsp; &amp;nbsp; onTimeUpdate : function() {&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;var currTime = p.audio.currentTime;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;$('#time').textContent=parseInt(currTime/60,10)+':'+&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt; &amp;nbsp; &amp;nbsp;parseInt(currTime%60,10) + '/' +&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt; &amp;nbsp; &amp;nbsp;parseInt(p.audio.duration/60,10)+':'+&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt; &amp;nbsp; &amp;nbsp;parseInt(p.audio.duration%60,10);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;};&lt;br /&gt;window.onload=p.onLoad;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8182501247262747119-5140372501313416788?l=spectrumdig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spectrumdig.blogspot.com/feeds/5140372501313416788/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://spectrumdig.blogspot.com/2012/02/html5-audio-player-2.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8182501247262747119/posts/default/5140372501313416788'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8182501247262747119/posts/default/5140372501313416788'/><link rel='alternate' type='text/html' href='http://spectrumdig.blogspot.com/2012/02/html5-audio-player-2.html' title='html5 audio player를 만들어 보았다. #2'/><author><name>jaeho lee</name><uri>https://profiles.google.com/110687673892501970268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-Jwtg9OLo-N0/AAAAAAAAAAI/AAAAAAAADco/jAp295u7dEI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8182501247262747119.post-7633796231727491283</id><published>2012-02-16T17:27:00.001+09:00</published><updated>2012-02-16T17:27:21.053+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='callback'/><category scheme='http://www.blogger.com/atom/ns#' term='golang'/><title type='text'>routing module을 만들자 - handler</title><content type='html'>&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;callback을 바로 넣을 수는 없어보이고&lt;/span&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;type 에 func 을 정의하고 달면 된다.&lt;/span&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;나름 명시적이네.&lt;/span&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;역시 소스는&amp;nbsp;&lt;/span&gt;&lt;a href="http://golang.org/doc/play/#package%20main%0A%0Aimport%20(%0A%20%20%22fmt%22%20%0A)%0A%0Atype%20Handler%20func(method%20string)%0A%0Atype%20Route%20struct%20%7B%20%0A%20%20Method%2CPattern%20string%0A%7D%0A%0Atype%20Routes%20struct%20%7B%0A%20%20Routes%20%5B%5DRoute%0A%7D%20%0Afunc%20(r%20Routes)%20routeCount()%20int%20%7B%0A%20%20return%20len(r.Routes)%0A%7D%0Afunc%20(r%20*Routes)%20addRoute(method%2C%20pattern%20string%2C%20handler%20Handler)%20%7B%0A%20%20r.Routes%3Dappend(r.Routes%2C%20Route%7BMethod%3Amethod%2C%20Pattern%3Apattern%7D)%0A%20%20fmt.Printf(%22route%20Count%20%3A%20%25d%5Cn%22%2C%20len(r.Routes))%0A%20%20handler(method)%0A%7D%0Afunc%20(r%20*Routes)%20GET(pattern%20string%2C%20handler%20Handler)%20%7B%0A%20%20r.addRoute(%22GET%22%2C%20pattern%2C%20handler)%0A%7D%0Afunc%20(r%20*Routes)%20POST(pattern%20string%2C%20handler%20Handler)%20%7B%0A%20%20r.addRoute(%22POST%22%2C%20pattern%2C%20handler)%0A%7D%0Afunc%20(r%20*Routes)%20PUT(pattern%20string%2C%20handler%20Handler)%20%7B%0A%20%20r.addRoute(%22PUT%22%2C%20pattern%2C%20handler)%0A%7D%0Afunc%20(r%20*Routes)%20DELETE(pattern%20string%2C%20handler%20Handler)%20%7B%0A%20%20r.addRoute(%22DELETE%22%2C%20pattern%2C%20handler)%0A%7D%0Afunc%20handler(method%20string)%20%7B%0A%20%20fmt.Printf(%22%25s%20handler%20executed%20%5Cn%22%2C%20method)%0A%7D%0A%0Afunc%20main()%20%7B%0A%20%20r%3A%3Dnew(Routes)%0A%20%20r.GET(%22%2Fuser%2F%3Auser%22%2C%20handler)%0A%20%20r.PUT(%22%2Fadd%2F%3Auser%22%2C%20handler)%0A%20%20r.POST(%22%2Fupdate%2F%3Auser%22%2C%20handler)%0A%20%20r.DELETE(%22%2Fdelete%2F%3Auser%22%2C%20handler)%0A%20%20for%20_%2Cv%3A%3Drange%20r.Routes%20%7B%0A%20%20%20%20fmt.Printf(%22%25s%3A%25s%5Cn%22%2Cv.Method%2C%20v.Pattern)%0A%20%20%7D%0A%7D" style="-webkit-transition-delay: initial; -webkit-transition-duration: 0.3s; -webkit-transition-property: color; -webkit-transition-timing-function: initial; background-color: white; color: #009eb8; display: inline; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; outline-color: initial; outline-style: none; outline-width: initial; text-align: justify; text-decoration: none;" target="_blank"&gt;여기&lt;/a&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;package main&lt;/span&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;import (&lt;/span&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;&amp;nbsp; "fmt"&lt;/span&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;)&lt;/span&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;b style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;type Handler func(method string)&lt;/b&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;type Route struct {&lt;/span&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;&amp;nbsp; Method,Pattern string&lt;/span&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;}&lt;/span&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;type Routes struct {&lt;/span&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;&amp;nbsp; Routes []Route&lt;/span&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;}&lt;/span&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;func (r Routes) routeCount() int {&lt;/span&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;&amp;nbsp; return len(r.Routes)&lt;/span&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;}&lt;/span&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;func (r *Routes) addRoute(method, pattern string,&amp;nbsp;&lt;/span&gt;&lt;b style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;handler Handler&lt;/b&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;) {&lt;/span&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;&amp;nbsp; r.Routes=append(r.Routes, Route{Method:method, Pattern:pattern})&lt;/span&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;&amp;nbsp; fmt.Printf("route Count : %d\n", len(r.Routes))&lt;/span&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;b style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;handler(method)&lt;/b&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;}&lt;/span&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;func (r *Routes) GET(pattern string,&amp;nbsp;&lt;/span&gt;&lt;b style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;handler Handler&lt;/b&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;) {&lt;/span&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;&amp;nbsp; r.addRoute("GET", pattern, handler)&lt;/span&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;}&lt;/span&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;func (r *Routes) POST(pattern string,&amp;nbsp;&lt;/span&gt;&lt;b style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;handler Handler&lt;/b&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;) {&lt;/span&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;&amp;nbsp; r.addRoute("POST", pattern, handler)&lt;/span&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;}&lt;/span&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;func (r *Routes) PUT(pattern string,&amp;nbsp;&lt;/span&gt;&lt;b style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;handler Handler&lt;/b&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;) {&lt;/span&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;&amp;nbsp; r.addRoute("PUT", pattern, handler)&lt;/span&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;}&lt;/span&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;func (r *Routes) DELETE(pattern string,&amp;nbsp;&lt;/span&gt;&lt;b style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;handler Handler&lt;/b&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;) {&lt;/span&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;&amp;nbsp; r.addRoute("DELETE", pattern, handler)&lt;/span&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;}&lt;/span&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;func handler(method string) {&lt;/span&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;&amp;nbsp; fmt.Printf("%s handler executed \n", method)&lt;/span&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;}&lt;/span&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;func main() {&lt;/span&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;&amp;nbsp; r:=new(Routes)&lt;/span&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;&amp;nbsp; r.GET("/user/:user", handler)&lt;/span&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;&amp;nbsp; r.PUT("/add/:user", handler)&lt;/span&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;&amp;nbsp; r.POST("/update/:user", handler)&lt;/span&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;&amp;nbsp; r.DELETE("/delete/:user", handler)&lt;/span&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;&amp;nbsp; for _,v:=range r.Routes {&lt;/span&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;&amp;nbsp; &amp;nbsp; fmt.Printf("%s:%s\n",v.Method, v.Pattern)&lt;/span&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;&amp;nbsp; }&lt;/span&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;}&lt;/span&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;------&lt;/span&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;의도는 이게 아닌데 빨리 무엇이든 달아보고 싶었다.&lt;/span&gt;&lt;br style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;" /&gt;&lt;br /&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: #f0f0f0; background-image: initial; background-origin: initial; color: #0000aa; font-family: Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; font-size: 13px; padding-bottom: 0.5em; padding-left: 1em; padding-right: 1em; padding-top: 0.5em; text-align: justify;"&gt;route Count : 1&lt;br /&gt;GET handler executed &lt;br /&gt;route Count : 2&lt;br /&gt;PUT handler executed &lt;br /&gt;route Count : 3&lt;br /&gt;POST handler executed &lt;br /&gt;route Count : 4&lt;br /&gt;DELETE handler executed &lt;br /&gt;GET:/user/:user&lt;br /&gt;PUT:/add/:user&lt;br /&gt;POST:/update/:user&lt;br /&gt;DELETE:/delete/:user&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8182501247262747119-7633796231727491283?l=spectrumdig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spectrumdig.blogspot.com/feeds/7633796231727491283/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://spectrumdig.blogspot.com/2012/02/routing-module-handler.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8182501247262747119/posts/default/7633796231727491283'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8182501247262747119/posts/default/7633796231727491283'/><link rel='alternate' type='text/html' href='http://spectrumdig.blogspot.com/2012/02/routing-module-handler.html' title='routing module을 만들자 - handler'/><author><name>jaeho lee</name><uri>https://profiles.google.com/110687673892501970268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-Jwtg9OLo-N0/AAAAAAAAAAI/AAAAAAAADco/jAp295u7dEI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8182501247262747119.post-4122970306961965845</id><published>2012-02-16T03:08:00.005+09:00</published><updated>2012-02-16T17:28:46.559+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='func'/><category scheme='http://www.blogger.com/atom/ns#' term='golang'/><title type='text'>routing module을 만들자 - REST 붙이기</title><content type='html'>&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;별 중요한 건 없지만 역시 func (variable struct)를 쓰는 패턴을 학습한다.&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;routeCount 를 구할땐 func(r Routes)를&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;addRoute, GET/POST/PUT/DELETE를 할땐 func(r *Routes) 를 쓰는 부분에 주목하자.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;역시 소스는&amp;nbsp;&lt;/span&gt;&lt;a href="http://golang.org/doc/play/#package%20main%0A%0Aimport%20(%0A%20%20%22fmt%22%20%0A)%0A%0Atype%20Route%20struct%20%7B%20%0A%20%20Method%2CPattern%20string%0A%7D%0Atype%20Routes%20struct%20%7B%0A%20%20Routes%20%5B%5DRoute%0A%7D%20%0Afunc%20(r%20Routes)%20routeCount()%20int%20%7B%0A%20%20return%20len(r.Routes)%0A%7D%0Afunc%20(r%20*Routes)%20addRoute(method%2C%20pattern%20string)%20%7B%0A%20%20r.Routes%3Dappend(r.Routes%2C%20Route%7BMethod%3Amethod%2C%20Pattern%3Apattern%7D)%0A%20%20fmt.Printf(%22route%20Count%20%3A%20%25d%5Cn%22%2C%20len(r.Routes))%0A%7D%0Afunc%20(r%20*Routes)%20GET(pattern%20string)%20%7B%0A%20%20r.addRoute(%22GET%22%2C%20pattern)%0A%7D%0Afunc%20(r%20*Routes)%20POST(pattern%20string)%20%7B%0A%20%20r.addRoute(%22POST%22%2C%20pattern)%0A%7D%0Afunc%20(r%20*Routes)%20PUT(pattern%20string)%20%7B%0A%20%20r.addRoute(%22PUT%22%2C%20pattern)%0A%7D%0Afunc%20(r%20*Routes)%20DELETE(pattern%20string)%20%7B%0A%20%20r.addRoute(%22DELETE%22%2C%20pattern)%0A%7D%0Afunc%20main()%20%7B%0A%20%20r%3A%3Dnew(Routes)%0A%20%20r.GET(%22%2Fuser%2F%3Auser%22)%0A%20%20r.PUT(%22%2Fadd%2F%3Auser%22)%0A%20%20r.POST(%22%2Fupdate%2F%3Auser%22)%0A%20%20r.DELETE(%22%2Fdelete%2F%3Auser%22)%0A%20%20for%20_%2Cv%3A%3Drange%20r.Routes%20%7B%0A%20%20%20%20fmt.Printf(%22%25s%3A%25s%5Cn%22%2Cv.Method%2C%20v.Pattern)%0A%20%20%7D%0A%7D" style="-webkit-transition-delay: initial; -webkit-transition-duration: 0.3s; -webkit-transition-property: color; -webkit-transition-timing-function: initial; background-color: white; color: #009eb8; display: inline; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; outline-color: initial; outline-style: none; outline-width: initial; text-align: justify; text-decoration: none;" target="_blank"&gt;여기&lt;/a&gt;&lt;br /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;package main&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;import (&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;&amp;nbsp; "fmt"&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;type Route struct {&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;&amp;nbsp; Method,Pattern string&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;type Routes struct {&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;&amp;nbsp; Routes []Route&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;func (r Routes) routeCount() int {&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;&amp;nbsp; return len(r.Routes)&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;func (r *Routes) addRoute(method, pattern string) {&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;&amp;nbsp; r.Routes=append(r.Routes, Route{Method:method, Pattern:pattern})&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;&amp;nbsp; fmt.Printf("route Count : %d\n", len(r.Routes))&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;func (r *Routes) GET(pattern string) {&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;&amp;nbsp; r.addRoute("GET", pattern)&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;func (r *Routes) POST(pattern string) {&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;&amp;nbsp; r.addRoute("POST", pattern)&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;func (r *Routes) PUT(pattern string) {&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;&amp;nbsp; r.addRoute("PUT", pattern)&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;func (r *Routes) DELETE(pattern string) {&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;&amp;nbsp; r.addRoute("DELETE", pattern)&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;func main() {&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;&amp;nbsp; r:=new(Routes)&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;&amp;nbsp; r.GET("/user/:user")&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;&amp;nbsp; r.PUT("/add/:user")&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;&amp;nbsp; r.POST("/update/:user")&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;&amp;nbsp; r.DELETE("/delete/:user")&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;&amp;nbsp; for _,v:=range r.Routes {&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;&amp;nbsp; &amp;nbsp; fmt.Printf("%s:%s\n",v.Method, v.Pattern)&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;------&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;결과는 아래와 같다.&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;거의 준비가 다 되었다.&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: white; color: #333333; font-family: 'Helvetica Neue Light', HelveticaNeue-Light, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 19px; text-align: justify;"&gt;내일은 package 를 분리하고 handler를 달아봐야지.&lt;/span&gt;&lt;br /&gt;&lt;pre style="background-attachment: initial; background-clip: initial; background-color: #f0f0f0; background-image: initial; background-origin: initial; color: #0000aa; font-family: Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; font-size: 13px; padding-bottom: 0.5em; padding-left: 1em; padding-right: 1em; padding-top: 0.5em; text-align: justify;"&gt;route Count : 1&lt;br /&gt;route Count : 2&lt;br /&gt;route Count : 3&lt;br /&gt;route Count : 4&lt;br /&gt;GET:/user/:user&lt;br /&gt;PUT:/add/:user&lt;br /&gt;POST:/update/:user&lt;br /&gt;DELETE:/delete/:user&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8182501247262747119-4122970306961965845?l=spectrumdig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spectrumdig.blogspot.com/feeds/4122970306961965845/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://spectrumdig.blogspot.com/2012/02/routing-module-rest.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8182501247262747119/posts/default/4122970306961965845'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8182501247262747119/posts/default/4122970306961965845'/><link rel='alternate' type='text/html' href='http://spectrumdig.blogspot.com/2012/02/routing-module-rest.html' title='routing module을 만들자 - REST 붙이기'/><author><name>jaeho lee</name><uri>https://profiles.google.com/110687673892501970268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-Jwtg9OLo-N0/AAAAAAAAAAI/AAAAAAAADco/jAp295u7dEI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8182501247262747119.post-3218623101204828014</id><published>2012-02-16T02:12:00.000+09:00</published><updated>2012-02-16T02:16:05.763+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='struct'/><category scheme='http://www.blogger.com/atom/ns#' term='func'/><category scheme='http://www.blogger.com/atom/ns#' term='golang'/><title type='text'>go 공부 - struct에 대하여</title><content type='html'>&lt;br /&gt;routing module 을 만들기 위해 객체를 작성해야겠다는 생각이 들어 struct와 function을 보고 있다.&lt;br /&gt;아무래도 나온지 2년이나 되었지만 인지도가 약해서인지 제대로 돌아가는 소스가 적다.&lt;br /&gt;직접 해보고 오류 메시지를 보면서 학습할 수 밖에.&lt;br /&gt;&lt;br /&gt;go는 javascript 처럼 functional하기도 하고 prototypal 한 특성을 가지고 있다.&lt;br /&gt;function 을 이용하는 법을 보고 있는데&lt;br /&gt;얼추 비슷하게 쓸 수 있겠다.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://golang.org/doc/ExpressivenessOfGo.pdf"&gt;http://golang.org/doc/ExpressivenessOfGo.pdf&lt;/a&gt;&amp;nbsp;중 21page 를 보면서 소스를 타이핑 해본다.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://golang.org/doc/play/#package%20main%0A%0Aimport%20(%0A%20%20%22fmt%22%20%0A%20%20%22math%22%0A)%0A%0Atype%20Point%20struct%20%7B%20x%2C%20y%20float64%20%7D%0Afunc%20(p%20Point)%20Abs()%20float64%20%7B%0A%20%20return%20math.Sqrt(p.x*p.x%20%2B%20p.y*p.y)%0A%7D%0A%0Afunc%20main()%20%7B%0A%20%20p%3A%3DPoint%7B3%2C4%7D%0A%20%20fmt.Printf(%22%25f%22%2C%20p.Abs())%0A%7D" target="_blank"&gt;소스보기&lt;/a&gt;&lt;br /&gt;package main&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;import (&lt;br /&gt;&amp;nbsp; "fmt"&lt;br /&gt;&amp;nbsp; "math"&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;type Point struct { x, y float64 }&lt;br /&gt;func (p Point) Abs() float64 {&lt;br /&gt;&amp;nbsp; return math.Sqrt(p.x*p.x + p.y*p.y)&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;func main() {&lt;br /&gt;&amp;nbsp; p:=Point{3,4}&lt;br /&gt;&amp;nbsp; fmt.Printf("%f", p.Abs())&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;객체를 생성할땐 pascal 타입의 선언자 := 를 써서 쓸 수도 있고&lt;br /&gt;다른 언어들처럼 new를 써서 main부분을 바꿔보면.&lt;br /&gt;&lt;br /&gt;func main() {&lt;br /&gt;&amp;nbsp; p:=new(Point)&lt;br /&gt;&amp;nbsp; p.x = 3&lt;br /&gt;&amp;nbsp; p.y = 4&lt;br /&gt;&amp;nbsp; fmt.Printf("%f", p.Abs())&lt;br /&gt;}&lt;br /&gt;이런식으로 초기화 할 수도 있다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;아마도 javascript 로 쓰면 아래와 같을 것이다.&lt;br /&gt;var Point = function(arg) {&lt;br /&gt;&amp;nbsp; var x;&lt;br /&gt;&amp;nbsp; var y;&lt;br /&gt;&amp;nbsp; x=arg.x;&lt;br /&gt;&amp;nbsp; y=arg.y;&lt;br /&gt;&amp;nbsp; return {&lt;br /&gt;&amp;nbsp; &amp;nbsp; Abs : function() {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; return Math.sqrt(x*x,y*y);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;var p = new Point({x:3,y:4});&lt;br /&gt;console.log(p.Abs());&lt;br /&gt;&lt;br /&gt;이정도쯤 되겠네.&lt;br /&gt;이렇게 비교하면서 보니까 상당히 괜찮군. 여러가지 생각이 든다.&lt;br /&gt;func (p Point) 부분이 좀 어색하고 중복이 느껴지긴 한데 익숙해지면 재미있는 표현법이겠다.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8182501247262747119-3218623101204828014?l=spectrumdig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spectrumdig.blogspot.com/feeds/3218623101204828014/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://spectrumdig.blogspot.com/2012/02/go-struct.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8182501247262747119/posts/default/3218623101204828014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8182501247262747119/posts/default/3218623101204828014'/><link rel='alternate' type='text/html' href='http://spectrumdig.blogspot.com/2012/02/go-struct.html' title='go 공부 - struct에 대하여'/><author><name>jaeho lee</name><uri>https://profiles.google.com/110687673892501970268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-Jwtg9OLo-N0/AAAAAAAAAAI/AAAAAAAADco/jAp295u7dEI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8182501247262747119.post-6568143100115757437</id><published>2012-02-15T00:51:00.002+09:00</published><updated>2012-02-15T15:42:32.753+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='routing'/><category scheme='http://www.blogger.com/atom/ns#' term='golang'/><title type='text'>go용 routing module을 만들고 있다.</title><content type='html'>ror/sinatra 나 express.js 처럼 우아한 routing쓰고 싶은데&lt;br /&gt;연습삼아 만들어보자는 생각에 서툰 코딩을 시작&lt;br /&gt;/user/:userid 인 경우&amp;nbsp;\/user\/([^\/]+)\/? 이런 식으로 우아하게 정규식 치환을 했으면 했는데&lt;br /&gt;string 패키지도 좀 볼겸. 단순하게 문자열 조작+뺑뺑이로 구현했다.&lt;br /&gt;&lt;a href="https://gist.github.com/1827639"&gt;https://gist.github.com/1827639&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: white; font-family: 'Bitstream Vera Sans Mono', Courier, monospace; font-size: 12px; line-height: 1.4em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left;"&gt;&lt;div class="line" id="LC1" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&lt;span class="k" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;package&lt;/span&gt; &lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;main&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="line" id="LC2" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="line" id="LC3" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&lt;span class="k" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;import&lt;/span&gt; &lt;span class="s" style="color: #dd1144; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;"fmt"&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="line" id="LC4" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&lt;span class="k" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;import&lt;/span&gt; &lt;span class="s" style="color: #dd1144; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;"strings"&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="line" id="LC5" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="line" id="LC6" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&lt;span class="k" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;var&lt;/span&gt; &lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;routes&lt;/span&gt; &lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;=&lt;/span&gt; &lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;[]&lt;/span&gt;&lt;span class="nb" style="color: #0086b3; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;string&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="line" id="LC7" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class="s" style="color: #dd1144; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;"/user/:id/friends/:friendsId"&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;,&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="line" id="LC8" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class="s" style="color: #dd1144; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;"/scrapbook/:scrapbookid/scrap/:scrapid"&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;,&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="line" id="LC9" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class="s" style="color: #dd1144; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;"/"&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="line" id="LC10" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="line" id="LC11" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&lt;span class="k" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;func&lt;/span&gt; &lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;getParams&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;(&lt;/span&gt;&lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;url&lt;/span&gt; &lt;span class="nb" style="color: #0086b3; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;string&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;)&lt;/span&gt; &lt;span class="k" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;map&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;[&lt;/span&gt;&lt;span class="nb" style="color: #0086b3; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;string&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;]&lt;/span&gt;&lt;span class="nb" style="color: #0086b3; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;string&lt;/span&gt; &lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="line" id="LC12" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class="k" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;for&lt;/span&gt; &lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;idx&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;,&lt;/span&gt;&lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;_&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;:=&lt;/span&gt;&lt;span class="k" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;range&lt;/span&gt; &lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;routes&lt;/span&gt; &lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="line" id="LC13" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;format&lt;/span&gt; &lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;:=&lt;/span&gt; &lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;routes&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;[&lt;/span&gt;&lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;idx&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;]&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="line" id="LC14" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;urlToken&lt;/span&gt; &lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;:=&lt;/span&gt; &lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;strings&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;.&lt;/span&gt;&lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Split&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;(&lt;/span&gt;&lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;url&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;,&lt;/span&gt; &lt;span class="s" style="color: #dd1144; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;"/"&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="line" id="LC15" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;formatToken&lt;/span&gt; &lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;:=&lt;/span&gt; &lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;strings&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;.&lt;/span&gt;&lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Split&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;(&lt;/span&gt;&lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;format&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;,&lt;/span&gt; &lt;span class="s" style="color: #dd1144; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;"/"&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="line" id="LC16" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="line" id="LC17" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="cm" style="color: #999988; font-style: italic; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;/* match pattern */&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="line" id="LC18" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="k" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;if&lt;/span&gt; &lt;span class="nb" style="color: #0086b3; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;len&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;(&lt;/span&gt;&lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;urlToken&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;)==&lt;/span&gt;&lt;span class="nb" style="color: #0086b3; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;len&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;(&lt;/span&gt;&lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;formatToken&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;)&lt;/span&gt; &lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb" style="color: #0086b3; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;len&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;(&lt;/span&gt;&lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;formatToken&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;)&amp;gt;&lt;/span&gt;&lt;span class="mi" style="color: #009999; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;0&lt;/span&gt; &lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="line" id="LC19" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;params&lt;/span&gt; &lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;:=&lt;/span&gt; &lt;span class="nb" style="color: #0086b3; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;make&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;(&lt;/span&gt;&lt;span class="k" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;map&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;[&lt;/span&gt;&lt;span class="nb" style="color: #0086b3; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;string&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;]&lt;/span&gt;&lt;span class="nb" style="color: #0086b3; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;string&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="line" id="LC20" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;match&lt;/span&gt; &lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;:=&lt;/span&gt; &lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;true&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="line" id="LC21" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="k" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;for&lt;/span&gt; &lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;i&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;,&lt;/span&gt;&lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;v&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;:=&lt;/span&gt;&lt;span class="k" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;range&lt;/span&gt; &lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;formatToken&lt;/span&gt; &lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="line" id="LC22" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="k" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;if&lt;/span&gt; &lt;span class="nb" style="color: #0086b3; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;len&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;(&lt;/span&gt;&lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;v&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;)&amp;gt;&lt;/span&gt;&lt;span class="mi" style="color: #009999; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;0&lt;/span&gt; &lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;v&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;[&lt;/span&gt;&lt;span class="mi" style="color: #009999; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;0&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;:&lt;/span&gt;&lt;span class="mi" style="color: #009999; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;1&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;]&lt;/span&gt; &lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;==&lt;/span&gt; &lt;span class="s" style="color: #dd1144; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;":"&lt;/span&gt; &lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="line" id="LC23" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;params&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;[&lt;/span&gt;&lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;v&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;[&lt;/span&gt;&lt;span class="mi" style="color: #009999; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;1&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;:]]=&lt;/span&gt;&lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;urlToken&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;[&lt;/span&gt;&lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;i&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;]&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="line" id="LC24" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;}&lt;/span&gt; &lt;span class="k" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;else&lt;/span&gt; &lt;span class="k" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;if&lt;/span&gt; &lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;v&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;!=&lt;/span&gt;&lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;urlToken&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;[&lt;/span&gt;&lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;i&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;]&lt;/span&gt; &lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="line" id="LC25" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;match&lt;/span&gt; &lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;=&lt;/span&gt;&lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;false&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="line" id="LC26" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="line" id="LC27" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="line" id="LC28" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="k" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;if&lt;/span&gt; &lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;match&lt;/span&gt; &lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="line" id="LC29" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="k" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;return&lt;/span&gt; &lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;params&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="line" id="LC30" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="line" id="LC31" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="line" id="LC32" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="line" id="LC33" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class="k" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;return&lt;/span&gt; &lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;nil&lt;/span&gt;  &lt;/div&gt;&lt;br /&gt;&lt;div class="line" id="LC34" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="line" id="LC35" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="line" id="LC36" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&lt;span class="k" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;func&lt;/span&gt; &lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;main&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;()&lt;/span&gt; &lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="line" id="LC37" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class="k" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;for&lt;/span&gt; &lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;i&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;,&lt;/span&gt;&lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;v&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;:=&lt;/span&gt;&lt;span class="k" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;range&lt;/span&gt; &lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;getParams&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;(&lt;/span&gt;&lt;span class="s" style="color: #dd1144; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;"/scrapbook/1ABCDE/scrap/401"&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;)&lt;/span&gt; &lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="line" id="LC38" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;fmt&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;.&lt;/span&gt;&lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Printf&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;(&lt;/span&gt;&lt;span class="s" style="color: #dd1144; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;"[%s:%s]"&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;,&lt;/span&gt;&lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;i&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;,&lt;/span&gt;&lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;v&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="line" id="LC39" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="line" id="LC40" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;fmt&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;.&lt;/span&gt;&lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Println&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;(&lt;/span&gt;&lt;span class="s" style="color: #dd1144; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;""&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="line" id="LC41" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class="k" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;for&lt;/span&gt; &lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;i&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;,&lt;/span&gt;&lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;v&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;:=&lt;/span&gt;&lt;span class="k" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;range&lt;/span&gt; &lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;getParams&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;(&lt;/span&gt;&lt;span class="s" style="color: #dd1144; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;"/user/spectrum/friends/cid"&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;)&lt;/span&gt; &lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="line" id="LC42" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;fmt&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;.&lt;/span&gt;&lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Printf&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;(&lt;/span&gt;&lt;span class="s" style="color: #dd1144; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;"[%s:%s]"&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;,&lt;/span&gt;&lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;i&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;,&lt;/span&gt;&lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;v&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="line" id="LC43" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;}&lt;/span&gt;  &lt;/div&gt;&lt;br /&gt;&lt;div class="line" id="LC44" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;fmt&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;.&lt;/span&gt;&lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Println&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;(&lt;/span&gt;&lt;span class="s" style="color: #dd1144; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;""&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="line" id="LC45" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class="k" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;for&lt;/span&gt; &lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;i&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;,&lt;/span&gt;&lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;v&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;:=&lt;/span&gt;&lt;span class="k" style="font-weight: bold; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;range&lt;/span&gt; &lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;getParams&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;(&lt;/span&gt;&lt;span class="s" style="color: #dd1144; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;"/root"&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;)&lt;/span&gt; &lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="line" id="LC46" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;fmt&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;.&lt;/span&gt;&lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Printf&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;(&lt;/span&gt;&lt;span class="s" style="color: #dd1144; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;"[%s:%s]"&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;,&lt;/span&gt;&lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;i&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;,&lt;/span&gt;&lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;v&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="line" id="LC47" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;}&lt;/span&gt;  &lt;/div&gt;&lt;br /&gt;&lt;div class="line" id="LC48" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;fmt&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;.&lt;/span&gt;&lt;span class="n" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Println&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;(&lt;/span&gt;&lt;span class="s" style="color: #dd1144; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;""&lt;/span&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="line" id="LC49" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="line" id="LC49" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&lt;span class="p" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/1827639.js"&gt; &lt;/script&gt;&lt;br /&gt;&lt;a href="http://golang.org/doc/play/#package%20main%0A%0Aimport%20%22fmt%22%0Aimport%20%22strings%22%0A%0Avar%20routes%20%3D%20%5B%5Dstring%7B%0A%20%20%22%2Fuser%2F%3Aid%2Ffriends%2F%3AfriendsId%22%2C%0A%20%20%22%2Fscrapbook%2F%3Ascrapbookid%2Fscrap%2F%3Ascrapid%22%2C%0A%20%20%22%2F%22%7D%0A%0Afunc%20getParams(url%20string)%20map%5Bstring%5Dstring%20%7B%0A%20%20for%20idx%2C_%3A%3Drange%20routes%20%7B%0A%20%20%20%20format%20%3A%3D%20routes%5Bidx%5D%0A%20%20%20%20urlToken%20%3A%3D%20strings.Split(url%2C%20%22%2F%22)%0A%20%20%20%20formatToken%20%3A%3D%20strings.Split(format%2C%20%22%2F%22)%0A%0A%20%20%20%20%2F*%20match%20pattern%20*%2F%0A%20%20%20%20if%20len(urlToken)%3D%3Dlen(formatToken)%20%26%26%20len(formatToken)%3E0%20%7B%0A%20%20%20%20%20%20params%20%3A%3D%20make(map%5Bstring%5Dstring)%0A%20%20%20%20%20%20match%20%3A%3D%20true%0A%20%20%20%20%20%20for%20i%2Cv%3A%3Drange%20formatToken%20%7B%0A%20%20%20%20%20%20%20%20if%20len(v)%3E0%20%26%26%20v%5B0%3A1%5D%20%3D%3D%20%22%3A%22%20%7B%0A%20%20%20%20%20%20%20%20%20%20params%5Bv%5B1%3A%5D%5D%3DurlToken%5Bi%5D%0A%20%20%20%20%20%20%20%20%7D%20else%20if%20v!%3DurlToken%5Bi%5D%20%7B%0A%20%20%20%20%20%20%20%20%20%20match%20%3Dfalse%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20if%20match%20%7B%0A%20%20%20%20%20%20%20%20return%20params%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20return%20nil%20%20%0A%7D%0A%0Afunc%20main()%20%7B%0A%20%20for%20i%2Cv%3A%3Drange%20getParams(%22%2Fscrapbook%2F1ABCDE%2Fscrap%2F401%22)%20%7B%0A%20%20%20%20fmt.Printf(%22%5B%25s%3A%25s%5D%22%2Ci%2Cv)%0A%20%20%7D%0A%20%20fmt.Println(%22%22)%0A%20%20for%20i%2Cv%3A%3Drange%20getParams(%22%2Fuser%2Fspectrum%2Ffriends%2Fcid%22)%20%7B%0A%20%20%20%20fmt.Printf(%22%5B%25s%3A%25s%5D%22%2Ci%2Cv)%0A%20%20%7D%20%20%0A%20%20fmt.Println(%22%22)%0A%20%20for%20i%2Cv%3A%3Drange%20getParams(%22%2Froot%22)%20%7B%0A%20%20%20%20fmt.Printf(%22%5B%25s%3A%25s%5D%22%2Ci%2Cv)%0A%20%20%7D%20%20%0A%20%20fmt.Println(%22%22)%0A%7D" target="_blank"&gt;웹에서 코드실행&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: white; font-family: 'Bitstream Vera Sans Mono', Courier, monospace; font-size: 12px; line-height: 1.4em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left;"&gt;&lt;div class="line" id="LC7" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&lt;span class="s" style="color: #dd1144; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;/user/:id/friends/:friendsId&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="line" id="LC8" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 1em; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&lt;span class="s" style="color: #dd1144; line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;/scrapbook/:scrapbookid/scrap/:scrapid&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;에서 각각 :으로 시작하는 인자값을 뽑아낸다.&lt;br /&gt;&lt;br /&gt;정적 타이핑 언어치고 재미있네. 에휴 Dennis Ritchie옹 생각에 눙무리 ;;ㅅ;;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8182501247262747119-6568143100115757437?l=spectrumdig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spectrumdig.blogspot.com/feeds/6568143100115757437/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://spectrumdig.blogspot.com/2012/02/go-routing-module.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8182501247262747119/posts/default/6568143100115757437'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8182501247262747119/posts/default/6568143100115757437'/><link rel='alternate' type='text/html' href='http://spectrumdig.blogspot.com/2012/02/go-routing-module.html' title='go용 routing module을 만들고 있다.'/><author><name>jaeho lee</name><uri>https://profiles.google.com/110687673892501970268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-Jwtg9OLo-N0/AAAAAAAAAAI/AAAAAAAADco/jAp295u7dEI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8182501247262747119.post-7612194364622664595</id><published>2012-02-11T08:17:00.001+09:00</published><updated>2012-02-15T06:01:00.980+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='player'/><category scheme='http://www.blogger.com/atom/ns#' term='audio'/><title type='text'>html5 audio player를 만들어 보았다.</title><content type='html'>&lt;br /&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;a href="http://jsdo.it/spectrum/webAudioPlayer"&gt;http://jsdo.it/spectrum/webAudioPlayer&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;audio 객체를 이용한 플레이어.&lt;/div&gt;&lt;div class="p3"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p2"&gt;onTimeUpdate 이벤트를 이용해 재생 시간을 업데이트하고&lt;/div&gt;&lt;div class="p2"&gt;audio.currentTime 을 이용해 구간 이동.&lt;/div&gt;&lt;div class="p3"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p2"&gt;크로스플랫폼(iOS/Android등등) 플레이어가 필요하다면 간단하게 구현할 수 있다.&lt;/div&gt;&lt;div class="p3"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p4"&gt;&lt;/div&gt;&lt;div class="p4"&gt;&lt;/div&gt;&lt;div class="p4"&gt;&lt;/div&gt;&lt;div class="p4"&gt;$=function(element) {&amp;nbsp;&lt;/div&gt;&lt;div class="p4"&gt;&amp;nbsp; &amp;nbsp; return document.querySelector(element);&lt;/div&gt;&lt;div class="p4"&gt;};&lt;/div&gt;&lt;div class="p4"&gt;p={&lt;/div&gt;&lt;div class="p4"&gt;&amp;nbsp; &amp;nbsp; audio : null,&lt;/div&gt;&lt;div class="p4"&gt;&amp;nbsp; &amp;nbsp; onLoad: function() {&lt;/div&gt;&lt;div class="p4"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; p.audio = new Audio('http://k003.kiwi6.com/hotlink/3dgmyavs49/your_name_ft_gaduk.mp3');&lt;/div&gt;&lt;div class="p4"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; $('#play').onclick=p.onPlay;&lt;/div&gt;&lt;div class="p4"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; $('#stop').onclick=p.onStop;&lt;/div&gt;&lt;div class="p4"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; $('#pause').onclick=p.onPause;&lt;/div&gt;&lt;div class="p4"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; $('#rew10').onclick=p.on10rew;&lt;/div&gt;&lt;div class="p4"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; $('#ff10').onclick=p.on10ff;&lt;/div&gt;&lt;div class="p4"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; p.audio.addEventListener('timeupdate', p.onTimeUpdate, false);&lt;/div&gt;&lt;div class="p4"&gt;&amp;nbsp; &amp;nbsp; },&lt;/div&gt;&lt;div class="p4"&gt;&amp;nbsp; &amp;nbsp; onPlay: function() {&lt;/div&gt;&lt;div class="p4"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; p.audio.play();&lt;/div&gt;&lt;div class="p4"&gt;&amp;nbsp; &amp;nbsp; },&lt;/div&gt;&lt;div class="p4"&gt;&amp;nbsp; &amp;nbsp; onStop: function() {&lt;/div&gt;&lt;div class="p4"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; p.audio.currentTime = 0;&lt;/div&gt;&lt;div class="p4"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; p.onPause();&lt;/div&gt;&lt;div class="p4"&gt;&amp;nbsp; &amp;nbsp; },&lt;/div&gt;&lt;div class="p4"&gt;&amp;nbsp; &amp;nbsp; onPause: function() {&lt;/div&gt;&lt;div class="p4"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; p.audio.pause();&lt;/div&gt;&lt;div class="p4"&gt;&amp;nbsp; &amp;nbsp; },&lt;/div&gt;&lt;div class="p4"&gt;&amp;nbsp; &amp;nbsp; on10rew: function() {&lt;/div&gt;&lt;div class="p4"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; p.audio.currentTime -=10;&lt;/div&gt;&lt;div class="p4"&gt;&amp;nbsp; &amp;nbsp; },&lt;/div&gt;&lt;div class="p4"&gt;&amp;nbsp; &amp;nbsp; on10ff: function() {&lt;/div&gt;&lt;div class="p4"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; p.audio.currentTime +=10;&lt;/div&gt;&lt;div class="p4"&gt;&amp;nbsp; &amp;nbsp; },&lt;/div&gt;&lt;div class="p4"&gt;&amp;nbsp; &amp;nbsp; onTimeUpdate : function() {&lt;/div&gt;&lt;div class="p4"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; var currTime = p.audio.currentTime;&lt;/div&gt;&lt;div class="p4"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; $('#time').textContent=parseInt(currTime/60,10)+':'+parseInt(currTime%60,10);&lt;/div&gt;&lt;div class="p4"&gt;&amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div class="p4"&gt;};&lt;/div&gt;&lt;div class="p4"&gt;window.onload=p.onLoad;&lt;/div&gt;&lt;br /&gt;추가:&lt;br /&gt;&lt;a href="http://www.w3.org/TR/html5/the-iframe-element.html#media-element"&gt;http://www.w3.org/TR/html5/the-iframe-element.html#media-element&lt;/a&gt;&lt;br /&gt;비디오도 요령은 같다.&lt;br /&gt;duration, timeupdate 관련 내용은&lt;br /&gt;&lt;a href="http://www.w3.org/TR/html5/the-iframe-element.html#mediacontroller"&gt;http://www.w3.org/TR/html5/the-iframe-element.html#mediacontroller&lt;/a&gt;&lt;br /&gt;이쪽을 보자. 내용이 상당히 방대하다.&lt;br /&gt;하지만 다른 곳에서 검색하는 것보다 역시 레퍼런스를 보는 편이 세세한 걸 잘 알 수 있다.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8182501247262747119-7612194364622664595?l=spectrumdig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spectrumdig.blogspot.com/feeds/7612194364622664595/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://spectrumdig.blogspot.com/2012/02/html5-audio-player.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8182501247262747119/posts/default/7612194364622664595'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8182501247262747119/posts/default/7612194364622664595'/><link rel='alternate' type='text/html' href='http://spectrumdig.blogspot.com/2012/02/html5-audio-player.html' title='html5 audio player를 만들어 보았다.'/><author><name>jaeho lee</name><uri>https://profiles.google.com/110687673892501970268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-Jwtg9OLo-N0/AAAAAAAAAAI/AAAAAAAADco/jAp295u7dEI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8182501247262747119.post-3782368954837105790</id><published>2012-02-11T04:46:00.003+09:00</published><updated>2012-02-11T04:51:07.413+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='chocolat'/><category scheme='http://www.blogger.com/atom/ns#' term='truffles'/><category scheme='http://www.blogger.com/atom/ns#' term='go'/><category scheme='http://www.blogger.com/atom/ns#' term='golang'/><title type='text'>go 언어용 개발환경으로 Chocolat을 써보자.</title><content type='html'>&lt;a href="http://chocolatapp.com/"&gt;http://chocolatapp.com&lt;/a&gt;&lt;br /&gt;textmate 는 너무 무겁고 한글이 지원이 헬이어서 다른 걸 찾던 중 발견한 에디터인데&lt;br /&gt;아직 beta지만 꽤 훌륭한 완성도라 애용하고 있다.&lt;br /&gt;프리오더의 유혹이 (후덜덜; )&lt;br /&gt;&lt;br /&gt;go 언어용 에디터로 쓰고 싶은데 찾아보니 Truffle 파일이 있더라.&lt;br /&gt;textmate 용으로 먼저 만든게 아닌가 싶은데 textmate github 엔 없더라&lt;br /&gt;https://github.com/chocolat/go.truffle&lt;br /&gt;&lt;br /&gt;일단 chocolat 을 종료하고&lt;br /&gt;해당 Truffle을 추가해보자.&lt;br /&gt;&lt;br /&gt;git clone&amp;nbsp;https://github.com/chocolat/go.truffle&lt;br /&gt;하거나 zip download 해서 압축을 풀면&amp;nbsp;go.truffle 디렉토리가 생긴다.&lt;br /&gt;응용프로그램 &amp;gt; Chocolat 2 를 선택하여 "패키지 내용 보기" 하면&lt;br /&gt;Contents/SharedSupport/Truffles 가 있다.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-iU--du9nsaQ/TzVyNX_6XnI/AAAAAAAAFCI/lY67f70Oxtk/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-02-11+%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB+4.37.51.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="298" src="http://3.bp.blogspot.com/-iU--du9nsaQ/TzVyNX_6XnI/AAAAAAAAFCI/lY67f70Oxtk/s400/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-02-11+%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB+4.37.51.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;go.truffle 디렉토리를 Truffles 아래에 복사한 후&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Chocolat 을 기동해보자.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-wO1tVTr_FHI/TzVyM8njkoI/AAAAAAAAFCA/bKKuLCjSSvU/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-02-11+%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB+4.32.15.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="441" src="http://3.bp.blogspot.com/-wO1tVTr_FHI/TzVyM8njkoI/AAAAAAAAFCA/bKKuLCjSSvU/s640/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-02-11+%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB+4.32.15.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;아이 좋아. =_=)&lt;br /&gt;스샷은 go로 만든 웹서버. 사실 이것때문에 본거임. 심플하고 좋네.&lt;br /&gt;Action &amp;gt; Go &amp;gt; Compile 을 실행하니&lt;br /&gt;&lt;br /&gt;&lt;div class="p1"&gt;/Applications/Chocolat 2.app/Contents/SharedSupport/Truffles/go.truffle/support/gomate.rb:3:in `require': no such file to load -- /Applications/Chocolat 2.app/Contents/SharedSupport/Support/lib/tm/executor (LoadError) from /Applications/Chocolat 2.app/Contents/SharedSupport/Truffles/go.truffle/support/gomate.rb:3 from /var/folders/pO/pORC8XqvHvCCoR6XVJTsa++++TI/-Tmp-/CHTemporaryFiles/47C22E5B-C1A2-4309-A68B-F99B784A5776:3:in `require' from /var/folders/pO/pORC8XqvHvCCoR6XVJTsa++++TI/-Tmp-/CHTemporaryFiles/47C22E5B-C1A2-4309-A68B-F99B784A5776:3&lt;/div&gt;&lt;br /&gt;에러를 뿜어낸다. (...)&lt;br /&gt;그냥 편집기로만 쓰자.&lt;br /&gt;&lt;br /&gt;다른 개발환경을 원한다면&lt;br /&gt;$GOROOT/misc 아래 보면 아래와 같이 나오니&lt;br /&gt;&lt;br /&gt;IntelliJIDEA&lt;br /&gt;arm&lt;br /&gt;bash&lt;br /&gt;bbedit&lt;br /&gt;cgo&lt;br /&gt;chrome&lt;br /&gt;dashboard&lt;br /&gt;emacs&lt;br /&gt;fraise&lt;br /&gt;godoc&lt;br /&gt;goplay&lt;br /&gt;kate&lt;br /&gt;notepadplus&lt;br /&gt;swig&lt;br /&gt;vim&lt;br /&gt;xcode&lt;br /&gt;zsh&lt;br /&gt;입맛대로 골라쓰면 된다. 뭐 윈도우에서 쓸 수 있는 건 별로 없지만 notepadplus 하고 intelliJIDEA 정도쓰면 될 듯.&lt;br /&gt;goclipse(http://code.google.com/p/goclipse)가 있긴한데 망할 이클립스용 플러그인들이 그렇듯이 잘 죽고 인내심 실험장이라는 평.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8182501247262747119-3782368954837105790?l=spectrumdig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spectrumdig.blogspot.com/feeds/3782368954837105790/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://spectrumdig.blogspot.com/2012/02/go-chocolat.html#comment-form' title='1개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8182501247262747119/posts/default/3782368954837105790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8182501247262747119/posts/default/3782368954837105790'/><link rel='alternate' type='text/html' href='http://spectrumdig.blogspot.com/2012/02/go-chocolat.html' title='go 언어용 개발환경으로 Chocolat을 써보자.'/><author><name>jaeho lee</name><uri>https://profiles.google.com/110687673892501970268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-Jwtg9OLo-N0/AAAAAAAAAAI/AAAAAAAADco/jAp295u7dEI/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-iU--du9nsaQ/TzVyNX_6XnI/AAAAAAAAFCI/lY67f70Oxtk/s72-c/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-02-11+%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB+4.37.51.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8182501247262747119.post-7651551170550643073</id><published>2012-02-09T08:06:00.003+09:00</published><updated>2012-02-11T08:21:42.325+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='requestAnimFrame'/><category scheme='http://www.blogger.com/atom/ns#' term='html5'/><title type='text'>requestAnimFrame 사용</title><content type='html'>&lt;a href="http://jsdo.it/spectrum/rG9b"&gt;http://jsdo.it/spectrum/rG9b&lt;/a&gt;&lt;br /&gt;setInterval 로 bpm 카운터를 만들어봤더니 시간이 말도 안되게 안맞아서&lt;br /&gt;requestAnimFrame을 사용해 오차를 측정해보았다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;var p = {&lt;br /&gt;&amp;nbsp; &amp;nbsp; frameRate : 60,&lt;br /&gt;&amp;nbsp; &amp;nbsp; fps : document.querySelector('#fps'),&lt;br /&gt;&amp;nbsp; &amp;nbsp; deltaTime : 0,&lt;br /&gt;&amp;nbsp; &amp;nbsp; onLoad : function() {&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;fps.onclick=p.onClick;&lt;br /&gt;&amp;nbsp; &amp;nbsp; },&lt;br /&gt;&amp;nbsp; &amp;nbsp; onClick : function() {&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;p.setDelta();&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;p.animationLoop();&lt;br /&gt;&amp;nbsp; &amp;nbsp; },&lt;br /&gt;&amp;nbsp; &amp;nbsp; setDelta : function() {&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;p.deltaTime = +(new Date());&lt;br /&gt;&amp;nbsp; &amp;nbsp; },&lt;br /&gt;&amp;nbsp; &amp;nbsp; animationLoop : function() {&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;var currentTime = +(new Date());&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;p.fps.innerHTML= (currentTime - p.deltaTime) +'msec/frame in 60frames';&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;p.setDelta();&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;requestAnimFrame(p.animationLoop);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;window.onload=p.onLoad;&lt;br /&gt;window.requestAnimFrame = (function(callback) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame ||&lt;br /&gt;&amp;nbsp; &amp;nbsp; function(callback) {&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;window.setTimeout(callback, 1000 / p.frameRate);&lt;br /&gt;&amp;nbsp; &amp;nbsp; };&lt;br /&gt;})();&lt;br /&gt;&lt;br /&gt;16/17으로 일정한 지연이 발생한다. latency 가 16ms라고 보면 되는데 이정도면 쓸만한 편.&lt;br /&gt;&lt;a href="http://html5-demos.appspot.com/"&gt;http://html5-demos.appspot.com/&lt;/a&gt; 여기를 참조하였음.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8182501247262747119-7651551170550643073?l=spectrumdig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spectrumdig.blogspot.com/feeds/7651551170550643073/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://spectrumdig.blogspot.com/2012/02/requestanimframe.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8182501247262747119/posts/default/7651551170550643073'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8182501247262747119/posts/default/7651551170550643073'/><link rel='alternate' type='text/html' href='http://spectrumdig.blogspot.com/2012/02/requestanimframe.html' title='requestAnimFrame 사용'/><author><name>jaeho lee</name><uri>https://profiles.google.com/110687673892501970268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-Jwtg9OLo-N0/AAAAAAAAAAI/AAAAAAAADco/jAp295u7dEI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8182501247262747119.post-8033825561554393403</id><published>2012-02-04T04:07:00.003+09:00</published><updated>2012-02-04T04:15:02.319+09:00</updated><title type='text'>client 에서도 node.js 처럼 require 를 써보자.</title><content type='html'>&lt;br /&gt;&lt;pre style="white-space: pre-wrap; word-wrap: break-word;"&gt;문득 생각난 옛날 코드. 그땐 include 였나 싶기도 한데&lt;/pre&gt;&lt;pre style="white-space: pre-wrap; word-wrap: break-word;"&gt;html 문서에 script 태그를 덕지덕지 쓰는게 싫었다.&lt;/pre&gt;&lt;pre style="white-space: pre-wrap; word-wrap: break-word;"&gt;그래서 script 객체를 동적으로 생성하고 javascript 안에서 참조하도록 하곤 했는데 간단하게 만들어 보았다.&lt;/pre&gt;&lt;pre style="white-space: pre-wrap; word-wrap: break-word;"&gt;&lt;/pre&gt;&lt;pre style="word-wrap: break-word;"&gt;&lt;span style="white-space: pre-wrap;"&gt;var require=function(a){document.getElementsByTagName("head")[0].appendChild(function(b){b.type="text/javascript";b.src=a;return b;}(document.createElement("script")));};&lt;/span&gt;&lt;/pre&gt;&lt;pre style="word-wrap: break-word;"&gt;&lt;span style="white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="word-wrap: break-word;"&gt;&lt;span style="white-space: pre-wrap;"&gt;딱 한줄 넣어주시라.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="word-wrap: break-word;"&gt;&lt;span style="white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="word-wrap: break-word;"&gt;&lt;span style="white-space: pre-wrap;"&gt;require('&lt;b&gt;source URI&lt;/b&gt;');&lt;/span&gt;&lt;/pre&gt;&lt;pre style="word-wrap: break-word;"&gt;&lt;span style="white-space: pre-wrap;"&gt;형식으로 사용하면 된다.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="word-wrap: break-word;"&gt;&lt;span style="white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="word-wrap: break-word;"&gt;&lt;span style="white-space: pre-wrap;"&gt;풀어서 쓰면 아래와 같다.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="word-wrap: break-word;"&gt;&lt;span style="white-space: pre-wrap;"&gt;script 객체를 만들어서 속성을 정해주고 head에 append하는 함수인셈이다.&lt;/span&gt;&lt;/pre&gt;&lt;pre style="word-wrap: break-word;"&gt;&lt;span style="white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="white-space: pre-wrap; word-wrap: break-word;"&gt;var require = function(URI) {&lt;/pre&gt;&lt;pre style="white-space: pre-wrap; word-wrap: break-word;"&gt;  document.getElementsByTagName('head')[0].appendChild(&lt;/pre&gt;&lt;pre style="white-space: pre-wrap; word-wrap: break-word;"&gt;    (function(s) {&lt;/pre&gt;&lt;pre style="white-space: pre-wrap; word-wrap: break-word;"&gt;      s.type='text/javascript';&lt;/pre&gt;&lt;pre style="white-space: pre-wrap; word-wrap: break-word;"&gt;      s.src=URI;&lt;/pre&gt;&lt;pre style="white-space: pre-wrap; word-wrap: break-word;"&gt;      return s;&lt;/pre&gt;&lt;pre style="white-space: pre-wrap; word-wrap: break-word;"&gt;    })(document.createElement('script'))&lt;/pre&gt;&lt;pre style="white-space: pre-wrap; word-wrap: break-word;"&gt;  )&lt;/pre&gt;&lt;pre style="white-space: pre-wrap; word-wrap: break-word;"&gt;};&lt;/pre&gt;&lt;pre style="white-space: pre-wrap; word-wrap: break-word;"&gt;&lt;/pre&gt;&lt;pre style="white-space: pre-wrap; word-wrap: break-word;"&gt;실제 사용예.&lt;/pre&gt;&lt;pre style="word-wrap: break-word;"&gt;&lt;span style="white-space: pre-wrap;"&gt;&lt;a href="http://jsbin.com/ihamaf/edit#javascript,html,live"&gt;http://jsbin.com/ihamaf/edit#javascript,html,live&lt;/a&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="word-wrap: break-word;"&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;div style="text-align: -webkit-auto;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="white-space: pre-wrap;"&gt;var require=function(a){document.getElementsByTagName("head")[0].appendChild(function(b){b.type="text/javascript";b.src=a;return b;}(document.createElement("script")));};&lt;br /&gt;require('http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js');&lt;br /&gt;window.onload=function(){&lt;br /&gt;  $('p').text('realtime javascript loader');&lt;br /&gt;};&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;span style="white-space: pre-wrap;"&gt;실시간으로 생성하는 것이라 onload 이후에 사용해야한다는 점을 조심하자.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8182501247262747119-8033825561554393403?l=spectrumdig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spectrumdig.blogspot.com/feeds/8033825561554393403/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://spectrumdig.blogspot.com/2012/02/client-nodejs-require.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8182501247262747119/posts/default/8033825561554393403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8182501247262747119/posts/default/8033825561554393403'/><link rel='alternate' type='text/html' href='http://spectrumdig.blogspot.com/2012/02/client-nodejs-require.html' title='client 에서도 node.js 처럼 require 를 써보자.'/><author><name>jaeho lee</name><uri>https://profiles.google.com/110687673892501970268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-Jwtg9OLo-N0/AAAAAAAAAAI/AAAAAAAADco/jAp295u7dEI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8182501247262747119.post-3617300680167538066</id><published>2012-02-02T07:06:00.002+09:00</published><updated>2012-02-02T08:15:07.961+09:00</updated><title type='text'>audiolib.js 를 사용하여 Web Audio 를 만져보자. 악기도 만들어보자.</title><content type='html'>&lt;a href="https://github.com/jussi-kalliokoski/audiolib.js/wiki/Tutorials"&gt;https://github.com/jussi-kalliokoski/audiolib.js/wiki/Tutorials&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;아무래도 안되겠어서 튜토리얼을 읽기로함.&lt;br /&gt;Oscillator 를 써서 440hz 음을 내는 것부터 다시.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://jsbin.com/uculiz/9/edit"&gt;http://jsbin.com/uculiz/10/edit&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;var p = {&lt;br /&gt;&amp;nbsp; channelCount : 2,&lt;br /&gt;&amp;nbsp; frequency : 440,&lt;br /&gt;&amp;nbsp; preBufferSize : 0,&lt;br /&gt;&amp;nbsp; sampleRate : 44100,&lt;br /&gt;&amp;nbsp; gain:1.0,&lt;br /&gt;&amp;nbsp; rec:null,&lt;br /&gt;&amp;nbsp; dev:null,&lt;br /&gt;&amp;nbsp; audioElement:null,&lt;br /&gt;&amp;nbsp; onReady : function(){&lt;br /&gt;&amp;nbsp; &amp;nbsp; $("#play").click(p.onPlay);&lt;br /&gt;&amp;nbsp; &amp;nbsp; $("#stop").click(p.onStop);&lt;br /&gt;&amp;nbsp; },&lt;br /&gt;&amp;nbsp; onPlay: function() {&lt;br /&gt;&amp;nbsp; &amp;nbsp; dev = audioLib.AudioDevice(function(buffer, channelCount) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; osc.append(buffer, channelCount);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }, p.channelCount);&lt;br /&gt;&amp;nbsp; &amp;nbsp; osc = audioLib.Oscillator(dev.sampleRate, p.frequency);&lt;br /&gt;&amp;nbsp; },&lt;br /&gt;&amp;nbsp; onStop: function() {&lt;br /&gt;&amp;nbsp; &amp;nbsp; dev.kill();&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;$().ready(p.onReady);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;음 역시 이렇게 하는건 안끊기네. kill로 끊는 것도 잘되고. (근데 설명에선 chrome 이 kill을 지원안한다고 하네)&lt;br /&gt;하지만 내가 원하는 건 이런게 아니야. tutorial을 다 봐도 시큰둥.&lt;br /&gt;&lt;br /&gt;아 정말 새로 만들어야하나;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8182501247262747119-3617300680167538066?l=spectrumdig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spectrumdig.blogspot.com/feeds/3617300680167538066/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://spectrumdig.blogspot.com/2012/02/audiolibjs-web-audio.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8182501247262747119/posts/default/3617300680167538066'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8182501247262747119/posts/default/3617300680167538066'/><link rel='alternate' type='text/html' href='http://spectrumdig.blogspot.com/2012/02/audiolibjs-web-audio.html' title='audiolib.js 를 사용하여 Web Audio 를 만져보자. 악기도 만들어보자.'/><author><name>jaeho lee</name><uri>https://profiles.google.com/110687673892501970268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-Jwtg9OLo-N0/AAAAAAAAAAI/AAAAAAAADco/jAp295u7dEI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8182501247262747119.post-3160580673837692685</id><published>2012-02-02T04:35:00.001+09:00</published><updated>2012-02-02T06:41:41.978+09:00</updated><title type='text'>Web Audio로 악기를 만들자.</title><content type='html'>잉여력이 넘치던 꼬꼬마 시절. 10년전쯤이었나. 2000년 이전이었는지 이후였는지 가물가물.&lt;br /&gt;친구 taekie군과 함께 Lazy Bird Cook Book 이란 프로젝트명을 걸고&amp;nbsp;wb303이라는 TB-303 머신을 만든 적이 있다.&lt;br /&gt;생긴건 대충 이런 식.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-wBHuU6Hb52U/Tylpg90iAMI/AAAAAAAAE_Y/r5AIPf0NIKg/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-02-02+%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB+1.33.21.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-wBHuU6Hb52U/Tylpg90iAMI/AAAAAAAAE_Y/r5AIPf0NIKg/s320/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-02-02+%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB+1.33.21.png" width="261" /&gt;&lt;/a&gt;&lt;/div&gt;구조는 건반을 찍고 나면 Music Macro Language(&lt;a href="http://en.wikipedia.org/wiki/Music_Macro_Language"&gt;http://en.wikipedia.org/wiki/Music_Macro_Language&lt;/a&gt;) 비슷한 일련의 문자열을 생성하고 wav 파일을 생성하도록 인자를 POST하는 구조였는데&lt;br /&gt;MSX에서 play 명령문으로 음악을 만들어보거나 마비노기로 연주를 만들어본 사람이라면 익숙한 구조일것이다.&lt;br /&gt;&lt;br /&gt;C 1 ! _&lt;br /&gt;&lt;br /&gt;첫번째는 C D E F G A B (도레미파솔라시도) 로 음계를&lt;br /&gt;두번째는 옥타브를&lt;br /&gt;그 뒤부터 붙는 !와 _ , x는 각각 accent와 slide, mute 여부를 표기하는 방식으로 극히 단순하지만 나름 효율적인 구조여서 게시판이나 메일, 메신저 등등으로 간편하게 주고 받을 수 있었는데 아무튼 나중엔 Propellerhead 사의 rb338 파일 저장형식인 rbs 포멧을 분석. rbs import 와 song pattern 도 가능했지만 당시에 호스팅했던 하나포스가 망해버리는 바람에 소스가 엉망이 되어버리긴했지만서도.&lt;br /&gt;&lt;br /&gt;암튼 요즘은 세상이 좋아져서 Native Application에서나 가능했던 영역들이 속속 html5란 이름 아래 모여들고 있는데&lt;br /&gt;Web Audio라는 기술이 생겨 관심있게 지켜보고 있어 뭐라도 안할 수가 없다.&lt;br /&gt;&lt;br /&gt;뚜껑을 열어보니 생각보다 진지하게 만든 구조라서 좀 놀랐음.&lt;br /&gt;&lt;a href="https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html"&gt;https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html&lt;/a&gt;&lt;br /&gt;풀 스펙은 위의 링크를 참조하면 됨.&lt;br /&gt;low-pass filter, send effect, pan 등을 routing 하는 구조가 잡혀있음. 심지언 impulse response 까지 지원. 뭐야 무섭쟎아!&lt;br /&gt;일단 빨리 뭐라도 소리를 내보고 싶어서 좀 쉬운 라이브러리가 없나 구글링을 해보니&lt;br /&gt;FireFox와 Chrome 간의 구현방법이 달라서 jQuery 같은 표준라이브러리로 쓸만한 놈이 필요했다.&lt;br /&gt;Sink.js(&lt;a href="https://github.com/jussi-kalliokoski/sink.js"&gt;https://github.com/jussi-kalliokoski/sink.js&lt;/a&gt;)가 있고&lt;br /&gt;거기에 FFT(고속푸리에변환)용 라이브러리랑, Wav codec 지원, binary data 처리 라이브러를 합쳐놓은 audiolib.js(&lt;a href="https://github.com/jussi-kalliokoski/audiolib.js"&gt;https://github.com/jussi-kalliokoski/audiolib.js&lt;/a&gt;)가 있어&amp;nbsp;둘 다 써보기로 결정하고.&lt;br /&gt;&lt;br /&gt;삐익하고 소리를 내보았다.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://jsbin.com/uculiz/edit#javascript,html,live"&gt;http://jsbin.com/uculiz/edit#javascript,html,live&lt;/a&gt;&lt;br /&gt;먼저 audiolib.js를 써서&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;var dev, sampleRate, osc, buf, fx, filter;&lt;br /&gt;var p = {&lt;br /&gt;&amp;nbsp; onReady : function(){&lt;br /&gt;&amp;nbsp; &amp;nbsp; $("#play").click(p.onPlay);&lt;br /&gt;&amp;nbsp; },&lt;br /&gt;&amp;nbsp; onPlay : function() {&lt;br /&gt;&amp;nbsp; &amp;nbsp; setTimeout(function(){&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; dev&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;= audioLib.AudioDevice(null, 2);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; sampleRate&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;= dev.sampleRate;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; buf&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;= new Float32Array(sampleRate * 8);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; osc&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;= new audioLib.Oscillator(sampleRate);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; osc.waveShape = 1;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; osc.append(buf.subarray(0, sampleRate * 1), 2);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; dev.writeBuffer(buf);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }, 0);&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;$().ready(p.onReady);&lt;br /&gt;&lt;br /&gt;헉 html 파일에 오타있네.&lt;br /&gt;요정도로 일단.&lt;br /&gt;채널이 2개(stereo)인 AudioDevice를 생성하고&lt;br /&gt;square 파형인 1초 분량의 440hz 음인 buffer 를 생성 후 writeBuffer로 소리를 출력하는 구조.&lt;br /&gt;&lt;br /&gt;해놓고보니 sink.js 를 포함하고 있어서 그냥 이걸 쓰는게 낫겠다는 생각이 들었음.&lt;br /&gt;&lt;br /&gt;waveShape따위를 쓰고 싶은 생각은 없어서 sink를 사용해서 직접 low-level로 버퍼를 핸들링함.&lt;br /&gt;&lt;a href="http://jsbin.com/uculiz/3/edit"&gt;http://jsbin.com/uculiz/3/edit&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;var p = {&lt;br /&gt;&amp;nbsp; channelCount : 1,&lt;br /&gt;&amp;nbsp; preBufferSize : 0,&lt;br /&gt;&amp;nbsp; sampleRate : 0,&lt;br /&gt;&amp;nbsp; onReady : function(){&lt;br /&gt;&amp;nbsp; &amp;nbsp; $("#play").click(p.onPlay);&lt;br /&gt;&amp;nbsp; },&lt;br /&gt;&amp;nbsp; onPlay : function() {&lt;br /&gt;&amp;nbsp; &amp;nbsp; var dev = audioLib.Sink(function(sampleBuffer){&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; // make some noise&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; for (i=0; i&amp;lt;sampleBuffer.length; i++){&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sampleBuffer[i] = Math.random() - 0.5;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; }, p.channelCount, p.preBufferSize, p.sampleRate);&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;$().ready(p.onReady);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;channelCount 를 제외한 나머지 preBufferSize나 sampleRate는 값을 바꿔도 별 효과가 없음.&lt;br /&gt;-0.5~0.5 사이의 값을 무작위로 생성하여 화이트 노이즈를 생성했다.&lt;br /&gt;play를 하면 무한 재생이 되는데 지금은 일단 모르겠고&lt;br /&gt;의미있는 음도 재생해봐야겠다 싶어서 sin파를 생성해본다.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://jsbin.com/uculiz/4/edit"&gt;http://jsbin.com/uculiz/4/edit&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;var p = {&lt;br /&gt;&amp;nbsp; channelCount : 2,&lt;br /&gt;&amp;nbsp; frequency : 440,&lt;br /&gt;&amp;nbsp; preBufferSize : 0,&lt;br /&gt;&amp;nbsp; sampleRate : 44100,&lt;br /&gt;&amp;nbsp; onReady : function(){&lt;br /&gt;&amp;nbsp; &amp;nbsp; $("#play").click(p.onPlay);&lt;br /&gt;&amp;nbsp; },&lt;br /&gt;&amp;nbsp; onPlay : function() {&lt;br /&gt;&amp;nbsp; &amp;nbsp; var dev = audioLib.Sink(function(sampleBuffer){&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; // sampleBuffer length:8192&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; for (i=0; i&amp;lt;sampleBuffer.length; i++){&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sampleBuffer[i] = Math.sin(i * Math.PI * p.frequency / p.sampleRate);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; }, p.channelCount, p.preBufferSize, p.sampleRate);&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;$().ready(p.onReady);&lt;br /&gt;&lt;br /&gt;440hz의 sin파를 생성하려고 했는데 8192 버퍼마다 끊어짐.&lt;br /&gt;음 뭔가 잘못했나 싶어서 여기저기 기웃기웃.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://jsbin.com/uculiz/5/edit"&gt;http://jsbin.com/uculiz/5/edit&lt;/a&gt;&lt;br /&gt;Gain 을 달아주면 음량을 조절할 수 있다.&lt;br /&gt;최대값이 1이므로 0이면 무음. 1이상이면 overdrive가 걸린다.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://jsbin.com/uculiz/8/edit"&gt;http://jsbin.com/uculiz/9/edit&lt;/a&gt;&lt;br /&gt;녹음은 잘 되나?&lt;br /&gt;아 record는 현재 장비에서 나는 음을 캡쳐하는 것이구나.&lt;br /&gt;실시간 mixdown 같은 개념으로 보면 되겠네.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;var p = {&lt;br /&gt;&amp;nbsp; channelCount : 2,&lt;br /&gt;&amp;nbsp; frequency : 440,&lt;br /&gt;&amp;nbsp; preBufferSize : 0,&lt;br /&gt;&amp;nbsp; sampleRate : 44100,&lt;br /&gt;&amp;nbsp; gain:1.0,&lt;br /&gt;&amp;nbsp; rec:null,&lt;br /&gt;&amp;nbsp; dev:null,&lt;br /&gt;&amp;nbsp; audioElement:null,&lt;br /&gt;&amp;nbsp; onReady : function(){&lt;br /&gt;&amp;nbsp; &amp;nbsp; $("#rec").click(p.onRecord);&lt;br /&gt;&amp;nbsp; &amp;nbsp; $("#play").click(p.onPlay);&lt;br /&gt;&amp;nbsp; },&lt;br /&gt;&amp;nbsp; onRecord : function() {&lt;br /&gt;&amp;nbsp; &amp;nbsp; p.dev = audioLib.Sink(function(sampleBuffer){&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; // make some noise&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; for (i=0; i&amp;lt;sampleBuffer.length; i++){&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sampleBuffer[i] = Math.floor(i*440/this.sampleRate) % 2 ? 1:-1;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; }, p.channelCount, p.preBufferSize, p.sampleRate);&lt;br /&gt;&amp;nbsp; &amp;nbsp; p.rec = p.dev.record();&lt;br /&gt;&amp;nbsp; &amp;nbsp; $("#log").text("recording....");&lt;br /&gt;&amp;nbsp; &amp;nbsp; /* To stop */&lt;br /&gt;&amp;nbsp; &amp;nbsp; setTimeout(p.recordStop, 4000);&lt;br /&gt;&amp;nbsp; },&lt;br /&gt;&amp;nbsp; recordStop: function() {&lt;br /&gt;&amp;nbsp; &amp;nbsp; p.rec.stop();&lt;br /&gt;&amp;nbsp; &amp;nbsp; p.dev.kill();&lt;br /&gt;&amp;nbsp; &amp;nbsp; // To export wav&lt;br /&gt;&amp;nbsp; &amp;nbsp; p.audioElement = new Audio(&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 'data:audio/wav;base64,' + btoa( p.rec.toWav() )&lt;br /&gt;&amp;nbsp; &amp;nbsp; );&lt;br /&gt;&amp;nbsp; &amp;nbsp; p.audioElement.play();&lt;br /&gt;&amp;nbsp; &amp;nbsp; $("#log").text(p.rec.toWav().length);&lt;br /&gt;&amp;nbsp; },&lt;br /&gt;&amp;nbsp; onPlay: function() {&lt;br /&gt;&amp;nbsp; &amp;nbsp; p.audioElement.play();&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;$().ready(p.onReady);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;악! 크롬 다운되서 다날렸다;;&lt;br /&gt;다음에 계속(...할 수 있으려나)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8182501247262747119-3160580673837692685?l=spectrumdig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spectrumdig.blogspot.com/feeds/3160580673837692685/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://spectrumdig.blogspot.com/2012/02/web-audio.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8182501247262747119/posts/default/3160580673837692685'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8182501247262747119/posts/default/3160580673837692685'/><link rel='alternate' type='text/html' href='http://spectrumdig.blogspot.com/2012/02/web-audio.html' title='Web Audio로 악기를 만들자.'/><author><name>jaeho lee</name><uri>https://profiles.google.com/110687673892501970268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-Jwtg9OLo-N0/AAAAAAAAAAI/AAAAAAAADco/jAp295u7dEI/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-wBHuU6Hb52U/Tylpg90iAMI/AAAAAAAAE_Y/r5AIPf0NIKg/s72-c/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA+2012-02-02+%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB+1.33.21.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8182501247262747119.post-8493605385510097912</id><published>2012-01-27T14:53:00.000+09:00</published><updated>2012-02-11T08:22:22.422+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='array'/><category scheme='http://www.blogger.com/atom/ns#' term='map'/><category scheme='http://www.blogger.com/atom/ns#' term='filter'/><category scheme='http://www.blogger.com/atom/ns#' term='reduce'/><category scheme='http://www.blogger.com/atom/ns#' term='forEach'/><category scheme='http://www.blogger.com/atom/ns#' term='iteration'/><title type='text'>Array function - Iteration</title><content type='html'>이것만은 꼭 알고 이해하고 손에 익숙해두자.&lt;br /&gt;&lt;br /&gt;forEach : 배열의 갯수만큼 반복&lt;br /&gt;map : return 값을 인자로 배열을 반환&lt;br /&gt;reduce : return 값과 배열을 인자로 연산&lt;br /&gt;some : return 이 하나라도 참이면 참을 반환&lt;br /&gt;every : return 이 모두 참이면 참을 반환&lt;br /&gt;sort : return 이 참인 기준의 순방향 정렬&lt;br /&gt;filter : return 이 참인 것들의 배열을 반환&lt;br /&gt;&lt;br /&gt;배열을 만들고 직접 돌려보고 느껴보자.&lt;br /&gt;reduce 로 sum, min, max를 한다던가&lt;br /&gt;every 로 transaction처리를 한다던가 하는 걸 예로 들면 사고의 폭이 좁아질 수도 있으니&lt;br /&gt;돌려보면서 현상을 관찰하는게 좋다.&lt;br /&gt;&lt;br /&gt;기타 함수&lt;br /&gt;concat : 배열들을 연결&lt;br /&gt;indexOf : 인자의 위치를 반환&lt;br /&gt;join : 인자로 배열들을 연결&lt;br /&gt;slice : from&amp;lt;to 범위의 배열을 반환&lt;br /&gt;splice : from에서 n개만큼 배열을 잘라내고 그 부분을 반환&lt;br /&gt;push, pop : 배열의 뒷쪽에 넣고 빼기&lt;br /&gt;unshift, shift : 배열의 앞쪽에서 넣고 빼기&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8182501247262747119-8493605385510097912?l=spectrumdig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spectrumdig.blogspot.com/feeds/8493605385510097912/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://spectrumdig.blogspot.com/2012/01/array-method-iteration.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8182501247262747119/posts/default/8493605385510097912'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8182501247262747119/posts/default/8493605385510097912'/><link rel='alternate' type='text/html' href='http://spectrumdig.blogspot.com/2012/01/array-method-iteration.html' title='Array function - Iteration'/><author><name>jaeho lee</name><uri>https://profiles.google.com/110687673892501970268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-Jwtg9OLo-N0/AAAAAAAAAAI/AAAAAAAADco/jAp295u7dEI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8182501247262747119.post-5499103951619900187</id><published>2012-01-25T19:54:00.000+09:00</published><updated>2012-01-27T02:31:17.474+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='jquery'/><title type='text'>requery 를 피하는 법</title><content type='html'>객체를 생성 후 생성한 객체를 다시 참조하는 패턴으로&lt;br /&gt;&lt;br /&gt;&lt;div&gt;$('div#mainContext').append('&amp;lt;div class="header"/&amp;gt;');&lt;br /&gt;$('div.header').click(function() {&lt;br /&gt;&amp;nbsp; // do something&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;이런 식으로 흔히들 쓰는데 $('div.header') 를 도는 비용이 많이 드니&lt;br /&gt;&lt;br /&gt;$('&amp;lt;div class="header"/&amp;gt;').appendTo('div#mainContext').click(function() {&lt;br /&gt;&amp;nbsp; // do something&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;으로 순서를 바꿔서 객체를 chaining으로 활용하자.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8182501247262747119-5499103951619900187?l=spectrumdig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spectrumdig.blogspot.com/feeds/5499103951619900187/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://spectrumdig.blogspot.com/2012/01/requery.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8182501247262747119/posts/default/5499103951619900187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8182501247262747119/posts/default/5499103951619900187'/><link rel='alternate' type='text/html' href='http://spectrumdig.blogspot.com/2012/01/requery.html' title='requery 를 피하는 법'/><author><name>jaeho lee</name><uri>https://profiles.google.com/110687673892501970268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-Jwtg9OLo-N0/AAAAAAAAAAI/AAAAAAAADco/jAp295u7dEI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8182501247262747119.post-7551796430898100507</id><published>2012-01-25T19:44:00.000+09:00</published><updated>2012-01-27T02:32:34.602+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='pattern'/><title type='text'>object-literal을 이용한 패턴</title><content type='html'>&lt;div&gt;Object-literal은 아래처럼 new Object() 대신&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;var car = new Object();&lt;/div&gt;&lt;div&gt;car.goes = "far";&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;심플하게 JSON인&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;var car = {goes: "far"};&lt;/div&gt;&lt;div&gt;를 사용하는 패턴인데&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;$().ready(function() {&lt;/div&gt;&lt;div&gt;&amp;nbsp; $('#submit').click(function() {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; $('.container').slideUp(function() {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; // do something&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; });&lt;/div&gt;&lt;div&gt;&amp;nbsp; });&lt;/div&gt;&lt;div&gt;&amp;nbsp; $('#navBar').bind('swipeleft', function() {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;// do something&lt;/div&gt;&lt;div&gt;&amp;nbsp; });&lt;/div&gt;&lt;div&gt;});&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;무기명 함수를 사용할 경우 흔히 발생하는 콜백 패크맨 형태를 정리하는데 사용할 수 있다.&lt;/div&gt;&lt;div&gt;사용 방법은 간단하다.&lt;/div&gt;&lt;div&gt;var app = {&lt;/div&gt;&lt;div&gt;&amp;nbsp; onReady: function() {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; $('#submit').click(app.onSubmit);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; $('#navBar').bind('swipeleft', app.onSwipeLeft);&lt;/div&gt;&lt;div&gt;&amp;nbsp; },&lt;/div&gt;&lt;div&gt;&amp;nbsp; onSubmit: function() {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; $('.container').slideUp(app.afterSlideUp);&lt;/div&gt;&lt;div&gt;&amp;nbsp; },&lt;/div&gt;&lt;div&gt;&amp;nbsp; afterSlideUp: function() {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; // do something&lt;/div&gt;&lt;div&gt;&amp;nbsp; },&lt;/div&gt;&lt;div&gt;&amp;nbsp; onSwipeLeft: function() {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; // do something&lt;/div&gt;&lt;div&gt;&amp;nbsp; }&lt;/div&gt;&lt;div&gt;};&lt;/div&gt;&lt;div&gt;$().ready(app.onReady);&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;콘솔 테스트나 유닛 테스트를 하기에도 편하고 가독성도 낫다.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8182501247262747119-7551796430898100507?l=spectrumdig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spectrumdig.blogspot.com/feeds/7551796430898100507/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://spectrumdig.blogspot.com/2012/01/object-literal.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8182501247262747119/posts/default/7551796430898100507'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8182501247262747119/posts/default/7551796430898100507'/><link rel='alternate' type='text/html' href='http://spectrumdig.blogspot.com/2012/01/object-literal.html' title='object-literal을 이용한 패턴'/><author><name>jaeho lee</name><uri>https://profiles.google.com/110687673892501970268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-Jwtg9OLo-N0/AAAAAAAAAAI/AAAAAAAADco/jAp295u7dEI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8182501247262747119.post-7712900488470875261</id><published>2012-01-20T23:10:00.000+09:00</published><updated>2012-01-27T02:35:40.409+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='algorithm'/><title type='text'>Dijkstra's algorithm을 이용한 최단 경로 찾기를 javascript 로 구현해보았다.</title><content type='html'>&lt;a href="http://upload.wikimedia.org/wikipedia/commons/4/45/Dijksta_Anim.gif"&gt;&lt;img border="0" src="http://upload.wikimedia.org/wikipedia/commons/4/45/Dijksta_Anim.gif" /&gt;&lt;/a&gt;&lt;div&gt;&lt;div&gt;&lt;a href="http://en.wikipedia.org/wiki/Dijkstra's_algorithm"&gt;http://en.wikipedia.org/wiki/Dijkstra's_algorithm&lt;/a&gt;&lt;/div&gt;&lt;div&gt;여기가 위키.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;언제나처럼 소스는&amp;nbsp;&lt;a href="http://jsbin.com/acatav/3/edit#javascript"&gt;http://jsbin.com/acatav/3/edit#javascript&lt;/a&gt;&lt;/div&gt;&lt;div&gt;"최단경로 그까이꺼 대충 트리로 펼친 담에 올 합산한 비용이 젤 적은 놈 뽑아내면 되는거 아니야?"&lt;/div&gt;&lt;div&gt;라고 생각했다가 역시 검색이 최고. 나보다 멍청한 놈은 좀처럼 없다는 것이 진리.&lt;/div&gt;&lt;div&gt;알고리즘은 심플하다.&lt;/div&gt;&lt;div&gt;'자신과 인접한 노드와 이제까지 탐색한 노드 중 가까운 놈만 남기고 다 지운다.'의 반복.&lt;/div&gt;&lt;div&gt;node 에서 해보려면 맨 마지막 $('p')부분을 지워주시면 되겠다.&lt;/div&gt;&lt;div&gt;사용예는 다음과 같다.&lt;/div&gt;&lt;div&gt;computePath(vertices, vertices[0]);&lt;/div&gt;&lt;div&gt;vertices 중 0번째부터 출발하는 최단 경로를 계산해서 각 vertex별 previous 와 minDistance를 넣어준다.&lt;/div&gt;&lt;div&gt;node.js 에서 바로 돌려볼 수 있는 소스는 다음과 같다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;var vertex = function(param){&lt;/div&gt;&lt;div&gt;&amp;nbsp; var name = '';&lt;/div&gt;&lt;div&gt;&amp;nbsp; var edge = [];&lt;/div&gt;&lt;div&gt;&amp;nbsp; var minDistance = 99999;&lt;/div&gt;&lt;div&gt;&amp;nbsp; var previous = null;&lt;/div&gt;&lt;div&gt;&amp;nbsp; name = name || param.name;&lt;/div&gt;&lt;div&gt;&amp;nbsp; edge = edge || param.edge;&lt;/div&gt;&lt;div&gt;&amp;nbsp; minDistance = minDistance || param.minDistance;&lt;/div&gt;&lt;div&gt;&amp;nbsp; previous = previous || param.previous;&lt;/div&gt;&lt;div&gt;&amp;nbsp; return {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; "name" : name,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; "edge" : edge,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; "minDistance" : minDistance,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; "previous" : previous&lt;/div&gt;&lt;div&gt;&amp;nbsp; };&lt;/div&gt;&lt;div&gt;};&lt;/div&gt;&lt;div&gt;var vertices = [];&lt;/div&gt;&lt;div&gt;vertices.push(new vertex({"name" : 'Harrisburg'})); // Baltimore,Allentown&lt;/div&gt;&lt;div&gt;vertices.push(new vertex({"name" : 'Baltimore'})); // Harrisburg&lt;/div&gt;&lt;div&gt;vertices.push(new vertex({"name" : 'Washington'})); // Baltimore&lt;/div&gt;&lt;div&gt;vertices.push(new vertex({"name" : 'Philadelphia'})); // Baltimore,Allentown,New York&lt;/div&gt;&lt;div&gt;vertices.push(new vertex({"name" : 'Binghamton'})); // Allentown&lt;/div&gt;&lt;div&gt;vertices.push(new vertex({"name" : 'Allentown'})); // Harrisburg,Philadelphia,Binghamton,New York&lt;/div&gt;&lt;div&gt;vertices.push(new vertex({"name" : 'New York'})); // Philadelphia,Allentown&lt;/div&gt;&lt;div&gt;vertices[0].edge = [{&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; "id" : vertices[1],&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; "distance" : 79.83&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; },{&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; "id" : vertices[5],&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; "distance" : 81.15&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; }];&lt;/div&gt;&lt;div&gt;vertices[1].edge = [{&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; "id" : vertices[0],&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; "distance" : 79.75&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; },{&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; "id" : vertices[2],&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; "distance" : 39.42&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; },{&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; "id" : vertices[3],&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; "distance" : 103.00&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; }];&lt;/div&gt;&lt;div&gt;vertices[2].edge = [{&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; "id" : vertices[1],&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; "distance" : 38.65&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; }];&lt;/div&gt;&lt;div&gt;vertices[3].edge = [{&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; "id" : vertices[1],&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; "distance" : 102.53&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; },{&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; "id" : vertices[5],&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; "distance" : 61.44&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; },{&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; "id" : vertices[6],&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; "distance" : 96.79&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; }];&lt;/div&gt;&lt;div&gt;vertices[4].edge = [{&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; "id" : vertices[5],&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; "distance" : 133.04&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; }];&lt;/div&gt;&lt;div&gt;vertices[5].edge = [{&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; "id" : vertices[0],&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; "distance" : 102.53&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; },{&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; "id" : vertices[3],&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; "distance" : 62.05&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; },{&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; "id" : vertices[4],&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; "distance" : 134.47&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; },{&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; "id" : vertices[6],&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; "distance" : 91.63&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; }];&lt;/div&gt;&lt;div&gt;vertices[6].edge = [{&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; "id" : vertices[3],&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; "distance" : 97.24&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; },{&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; "id" : vertices[5],&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; "distance" : 87.94&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; }];&lt;/div&gt;&lt;div&gt;var computePath=function(vertices, source) {&lt;/div&gt;&lt;div&gt;&amp;nbsp; source.minDistance = 0;&lt;/div&gt;&lt;div&gt;&amp;nbsp; var vertexQueue = [source];&lt;/div&gt;&lt;div&gt;&amp;nbsp; while (vertexQueue.length) {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; var u = vertexQueue.shift(0);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; console.log('-----');&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; console.log(u.name);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; u.edge.forEach(function(v,k) {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; var distanceThroughU = u.minDistance + v.distance;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; console.log(' &amp;nbsp; &amp;nbsp;', v.id.name + ':'+distanceThroughU+'&amp;lt;'+v.id.minDistance +&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (distanceThroughU &amp;lt; v.id.minDistance ? '' : '(out)' ));&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; if(distanceThroughU &amp;lt; v.id.minDistance) {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; v.id.minDistance = distanceThroughU;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; v.id.previous = u;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; vertexQueue.push(v.id);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; });&lt;/div&gt;&lt;div&gt;&amp;nbsp; }&lt;/div&gt;&lt;div&gt;};&lt;/div&gt;&lt;div&gt;computePath(vertices, vertices[0]);&lt;/div&gt;&lt;div&gt;vertices.forEach(function(v) {&lt;/div&gt;&lt;div&gt;&amp;nbsp; var path = [];&lt;/div&gt;&lt;div&gt;&amp;nbsp; var current = v.previous;&lt;/div&gt;&lt;div&gt;&amp;nbsp; while(!!current) {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; path.push(current);&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; current = current.previous;&lt;/div&gt;&lt;div&gt;&amp;nbsp; }&lt;/div&gt;&lt;div&gt;&amp;nbsp; var result = v.name+':'+path.map(function(w) {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; return w.name;&lt;/div&gt;&lt;div&gt;&amp;nbsp; }).reverse().join('-&amp;gt;')+'=&amp;gt;'+v.name+'('+v.minDistance+')';&lt;/div&gt;&lt;div&gt;&amp;nbsp; console.log(result);&lt;/div&gt;&lt;div&gt;});&lt;/div&gt;&lt;br /&gt;&lt;div style="color: #333333; font-family: 'Trebuchet MS', sans-serif; font-size: 12px;"&gt;&lt;/div&gt;&lt;div style="color: #333333; font-family: 'Trebuchet MS', sans-serif; font-size: 12px;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8182501247262747119-7712900488470875261?l=spectrumdig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spectrumdig.blogspot.com/feeds/7712900488470875261/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://spectrumdig.blogspot.com/2012/01/dijkstras-algorithm-javascript.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8182501247262747119/posts/default/7712900488470875261'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8182501247262747119/posts/default/7712900488470875261'/><link rel='alternate' type='text/html' href='http://spectrumdig.blogspot.com/2012/01/dijkstras-algorithm-javascript.html' title='Dijkstra&apos;s algorithm을 이용한 최단 경로 찾기를 javascript 로 구현해보았다.'/><author><name>jaeho lee</name><uri>https://profiles.google.com/110687673892501970268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-Jwtg9OLo-N0/AAAAAAAAAAI/AAAAAAAADco/jAp295u7dEI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8182501247262747119.post-4666603105282086537</id><published>2012-01-09T13:03:00.000+09:00</published><updated>2012-01-27T02:30:33.061+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='jquery'/><title type='text'>jQuery vs Native</title><content type='html'>&lt;a href="http://sharedfil.es/js-48hIfQE4XK.html"&gt;http://sharedfil.es/js-48hIfQE4XK.html&lt;/a&gt; 내용.&lt;br /&gt;맘에 들어서 퍼옴.&lt;br /&gt;포인트는 querySelector 같은게 IE 에서 되면 뭐다러 jQuery selector를 쓰냐&lt;br /&gt;forEach가 먹으면 뭐하러 귀찮게 $.each를 쓰냐.&lt;br /&gt;이게 다 IE 때문이다. 그래서 jQuery 를 쓴다.&lt;div style="color: #333333; font-family: 'Trebuchet MS', sans-serif; font-size: 12px;"&gt;&lt;/div&gt;&lt;div style="color: #333333; font-family: 'Trebuchet MS', sans-serif; font-size: 12px;"&gt;&lt;table style="-webkit-border-horizontal-spacing: 20px; -webkit-border-vertical-spacing: 20px; color: black; font: normal normal normal 13px/normal 'lucida grande', arial, sans-serif; text-align: left;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;jQuery&lt;/th&gt;&lt;th&gt;JavaScript&lt;/th&gt;&lt;/tr&gt;&lt;tr style="background-attachment: initial; background-clip: initial; background-color: #f0f0f0; background-image: initial; background-origin: initial;"&gt;&lt;td&gt;&lt;pre&gt;$(document).ready(function() {  // code…});&lt;/pre&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;document.addEventListener("DOMContentLoaded", function() {  // code…});&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;var divs = $("div");&lt;/pre&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;var divs = document.querySelectorAll("div");&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="background-attachment: initial; background-clip: initial; background-color: #f0f0f0; background-image: initial; background-origin: initial;"&gt;&lt;td&gt;&lt;pre&gt;var newDiv = $("&amp;lt;div/&amp;gt;");&lt;/pre&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;var newDiv = document.createElement("div");&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;newDiv.addClass("foo");&lt;/pre&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;newDiv.classList.add("foo");&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="background-attachment: initial; background-clip: initial; background-color: #f0f0f0; background-image: initial; background-origin: initial;"&gt;&lt;td&gt;&lt;pre&gt;newDiv.toggleClass("foo");&lt;/pre&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;newDiv.classList.toggle("foo");&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;$("a").click(function() {  // code…})&lt;/pre&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;[].forEach.call(document.querySelectorAll("a"), function(el) {  el.addEventListener("click", function() {    // code…  });});&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="background-attachment: initial; background-clip: initial; background-color: #f0f0f0; background-image: initial; background-origin: initial;"&gt;&lt;td&gt;&lt;pre&gt;$("body").append($("&amp;lt;p/&amp;gt;"));&lt;/pre&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;document.body.appendChild(document.createElement("p"));&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;$("img").filter(":first").attr("alt", "My image");&lt;/pre&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;document.querySelector("img").setAttribute("alt", "My image");&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="background-attachment: initial; background-clip: initial; background-color: #f0f0f0; background-image: initial; background-origin: initial;"&gt;&lt;td&gt;&lt;pre&gt;var parent = $("#about").parent();&lt;/pre&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;var parent = document.getElementById("about").parentNode;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;var clonedElement = $("#about").clone();&lt;/pre&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;var clonedElement = document.getElementById("about").cloneNode(true);&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="background-attachment: initial; background-clip: initial; background-color: #f0f0f0; background-image: initial; background-origin: initial;"&gt;&lt;td&gt;&lt;pre&gt;$("#wrap").empty();&lt;/pre&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;var wrap = document.getElementById("wrap");while(wrap.firstChild) wrap.removeChild(wrap.firstChild);&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;if($("#wrap").is(":empty"))&lt;/pre&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;if(!document.getElementById("wrap").hasChildNodes())&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="background-attachment: initial; background-clip: initial; background-color: #f0f0f0; background-image: initial; background-origin: initial;"&gt;&lt;td&gt;&lt;pre&gt;var nextElement = $("#wrap").next();&lt;/pre&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;var nextElement = document.getElementById("wrap").nextSibling;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;br style="color: #333333; font-family: 'Trebuchet MS', sans-serif; font-size: 12px;" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8182501247262747119-4666603105282086537?l=spectrumdig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spectrumdig.blogspot.com/feeds/4666603105282086537/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://spectrumdig.blogspot.com/2012/01/jquery-vs-native.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8182501247262747119/posts/default/4666603105282086537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8182501247262747119/posts/default/4666603105282086537'/><link rel='alternate' type='text/html' href='http://spectrumdig.blogspot.com/2012/01/jquery-vs-native.html' title='jQuery vs Native'/><author><name>jaeho lee</name><uri>https://profiles.google.com/110687673892501970268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-Jwtg9OLo-N0/AAAAAAAAAAI/AAAAAAAADco/jAp295u7dEI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8182501247262747119.post-3064691966717879410</id><published>2011-12-20T15:06:00.000+09:00</published><updated>2012-01-27T02:39:34.677+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='ListAdapter'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>JSONObject 전용 CustomView Adapter를 만들었다.</title><content type='html'>&lt;br /&gt;질보다 양이 우선하는 허접안드로이드 프로그램 의뢰를 처리해주고 있다.&lt;br /&gt;어찌나 기능들이 다양한지 덕분에 스터디는 제대로 하네 ㅎㅎ&lt;br /&gt;하다보니 리스트들이 엄청 많은데&lt;br /&gt;SimpleAdapter 로 대충 하려고 했더니 요리조리 잘도 빠져들 나가서&lt;br /&gt;커스텀 시리즈를 하나씩 종류별로 다 만들고 있다.&lt;br /&gt;SimpleAdapter를 선호하는 편인데 Hash Map 에만 넣어주면 이미지건 뭐건 알아서 잘 해주니까 좋다.&lt;br /&gt;&lt;br /&gt;myAdapter = new SimpleAdapter(this, groupData, R.layout.couponlist,&lt;br /&gt;&lt;br /&gt;new String[] { "title", "desc" }, new int[] {&lt;br /&gt;&lt;br /&gt;R.id.textViewListTitle, R.id.textViewListDesc });&lt;br /&gt;&lt;br /&gt;mListView.setAdapter(myAdapter);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;대략 이런식.&lt;br /&gt;&lt;br /&gt;1.context 를 주고,&lt;br /&gt;&lt;br /&gt;2.Map의 ArrayList 형을 받고,&lt;br /&gt;&lt;br /&gt;3.리스트를 표현할 Layout을 정하고&lt;br /&gt;&lt;br /&gt;4.리스트에 값을 가져올 Map의 키와&lt;br /&gt;&lt;br /&gt;5. 그 키값에 대응하는 List안의 View들을 대응&lt;br /&gt;&lt;br /&gt;이것만으로 오케이&lt;br /&gt;&lt;br /&gt;물론 이것마저도 사실 지저분하고 더러운 코드로 보이지만 자바에선 이정도면 짧은 코드인편&lt;br /&gt;&lt;br /&gt;그런데 이걸 Custom으로 구현하면 갑자기 일이 커진다.&lt;br /&gt;&lt;br /&gt;http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List4.html&lt;br /&gt;&lt;br /&gt;나는 짜증나서 이짓 못하겠다.&lt;br /&gt;&lt;br /&gt;일단 서버나 array.xml 등등에서 JSON을 다루는 일이 대부분이라서&lt;br /&gt;&lt;br /&gt;SQLite DatabaseAdapter (어라 이것도 만들었네)에서도 그냥 죄다 키발키발(key:val)해버렸다.&lt;br /&gt;&lt;br /&gt;하나 만들고 리팩토링하면서 생각해봐야지 하고 촥 만들고 보니&lt;br /&gt;&lt;br /&gt;Custom ListAdapter라고 해봤자. 결국 getView 만 외부에서 콜백으로 지정할 수 있으면 나머지는 매번 작성할 필요가 없다는 생각이 들었다.&lt;br /&gt;&lt;br /&gt;package com.appsoulute.library;&lt;br /&gt;&lt;br /&gt;import java.util.List;&lt;br /&gt;&lt;br /&gt;import org.json.JSONObject;&lt;br /&gt;&lt;br /&gt;import android.content.Context;&lt;br /&gt;import android.view.LayoutInflater;&lt;br /&gt;import android.view.View;&lt;br /&gt;import android.view.ViewGroup;&lt;br /&gt;import android.widget.ArrayAdapter;&lt;br /&gt;&lt;br /&gt;public class CustomJSONListAdapter extends ArrayAdapter&lt;jsonobject&gt; {&lt;/jsonobject&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;private onGetViewCallback getViewCustomCallBack;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;public List&lt;jsonobject&gt; objects;&lt;/jsonobject&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;private int listViewResourceId;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;Context context;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;public CustomJSONListAdapter(Context context,&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;int listViewResourceId, List&lt;jsonobject&gt; objects) {&lt;/jsonobject&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;super(context, listViewResourceId, objects);&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;this.listViewResourceId = listViewResourceId;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;this.objects = objects;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;this.context = context;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;/-&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt; * Callbacks from getView&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt; *-&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;public interface onGetViewCallback {&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;View getView(final int position, View convertView,&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt;ViewGroup parent);&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;}&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;public void setOnGetViewCallback(onGetViewCallback onGetViewCallback) {&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;getViewCustomCallBack = onGetViewCallback;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;@Override&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;public int getCount() {&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;return objects.size();&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;}&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;@Override&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;public JSONObject getItem(int position) {&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;return objects.get(position);&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;}&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;@Override&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;public long getItemId(int position) {&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;return position;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;}&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;@Override&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;public View getView(final int position, View convertView, ViewGroup parent) {&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;if(convertView==null) {&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;convertView=(LayoutInflater.from(context)).inflate( listViewResourceId, parent, false);&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;}&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;return getViewCustomCallBack.getView(position, convertView, parent);&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;}&lt;br /&gt;}&lt;br /&gt;이런 형태가 되겠다.&lt;br /&gt;&lt;br /&gt;실제 사용은 해당 CallBack 만 채워주면 된다.&lt;br /&gt;&lt;br /&gt;groupData = new ArrayList&lt;jsonobject&gt;();&lt;/jsonobject&gt;&lt;br /&gt;&lt;br /&gt;mListView = (ListView) findViewById(R.id.listViewSearchLocation);&lt;br /&gt;&lt;br /&gt;myAdapter = new CustomJSONListAdapter(this, R.layout.bookmarkperformancelist, groupData);&lt;br /&gt;&lt;br /&gt;myAdapter.setOnGetViewCallback(getViewListener);&lt;br /&gt;&lt;br /&gt;mListView.setAdapter(myAdapter);&lt;br /&gt;&lt;br /&gt;요정도로 OnCreate 에 선언해주고&lt;br /&gt;&lt;br /&gt;private onGetViewCallback getViewListener = new onGetViewCallback() {&lt;br /&gt;&lt;br /&gt;&amp;nbsp; @Override&lt;br /&gt;&lt;br /&gt;&amp;nbsp; public View getView(int position, View convertView, ViewGroup parent) {&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; try {&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; ((TextView)convertView.findViewById(R.id.textViewListTitle)).setText(myAdapter.objects.get(position).getString("title"));&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; ((CheckBox)convertView.findViewById(R.id.checkBox1)).setChecked(((ListView)parent).isItemChecked(position));&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; } catch (JSONException e) {&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; e.printStackTrace();&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; return convertView;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;리스너를 취향에 맞게 만들어 주시면 되겠다. setText 할때 myAdapter.objects 라고 쓴 부분이 맘에 안드는데 자바 하도 오래간만에 해서 다 까묵었다.&lt;br /&gt;&lt;br /&gt;일단 여기까지 올리고 차차 수정해보자.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8182501247262747119-3064691966717879410?l=spectrumdig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spectrumdig.blogspot.com/feeds/3064691966717879410/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://spectrumdig.blogspot.com/2011/12/jsonobject-customview-adapter.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8182501247262747119/posts/default/3064691966717879410'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8182501247262747119/posts/default/3064691966717879410'/><link rel='alternate' type='text/html' href='http://spectrumdig.blogspot.com/2011/12/jsonobject-customview-adapter.html' title='JSONObject 전용 CustomView Adapter를 만들었다.'/><author><name>jaeho lee</name><uri>https://profiles.google.com/110687673892501970268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-Jwtg9OLo-N0/AAAAAAAAAAI/AAAAAAAADco/jAp295u7dEI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8182501247262747119.post-5352775649181573562</id><published>2011-12-07T03:22:00.000+09:00</published><updated>2012-01-27T02:45:06.545+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='object'/><category scheme='http://www.blogger.com/atom/ns#' term='prototype'/><title type='text'>왜 object에 prototype을 쓰지 않나?</title><content type='html'>&lt;br /&gt;&lt;span style="color: #0000ee;"&gt;&lt;u&gt;&lt;/u&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://triin.net/2009/09/13/Why_exactly_is_Object.prototype_verboten"&gt;http://triin.net/2009/09/13/Why_exactly_is_Object.prototype_verboten&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;이유는 이렇다.&lt;/div&gt;&lt;div&gt;prototype 에 method 를 정의하면&lt;/div&gt;&lt;div&gt;자기 자신도 해당 object 에 카운트가 된다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;무슨말이냐?&lt;/div&gt;&lt;div&gt;object (array포함) 의 key와 value를 보기 위해 종종 아래와 같이 해본다.&lt;/div&gt;&lt;div&gt;var ages = { &amp;nbsp;John: 10, &amp;nbsp;Mary: 28, &amp;nbsp;Alice: 16};&lt;/div&gt;&lt;div&gt;일때&lt;/div&gt;&lt;div&gt;(function(obj){ for (idx in obj) { console.log(idx+':'+obj[idx]) }})(ages)&amp;nbsp;&lt;/div&gt;&lt;div&gt;이렇게 떠 보면&lt;/div&gt;&lt;div&gt;John:30&lt;/div&gt;&lt;div&gt;Mary:30&lt;/div&gt;&lt;div&gt;Alice:30&lt;/div&gt;&lt;div&gt;뭐 이렇게 나오겠지.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;그럼 아예 object 에 이걸 prototype 해서 그냥 method 로 만들지 싶어&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Object.prototype.printObject=function(){ for (idx in this) { console.log(idx+':'+this[idx]) }};&lt;/div&gt;&lt;div&gt;요따우로 해주면&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ages.printObject()&lt;/div&gt;&lt;div&gt;&amp;gt; John:10&lt;/div&gt;&lt;div&gt;&amp;gt; Mary:20&lt;/div&gt;&lt;div&gt;&amp;gt; Alice:30&lt;/div&gt;&lt;div&gt;&amp;gt; printObject:function (){ for (idx in this) { console.log(idx+':'+this[idx]) }}&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;망한다.&lt;/div&gt;&lt;div&gt;다시 이야기 하지만 자기 자신도 객체의 일부가 되니까.&lt;/div&gt;&lt;div&gt;그래서 쓰지말라는 것이다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;hasOwnProperty를 사용해서 피해가는 방법도 있겠지만 다른 문제가 있다.&lt;/div&gt;&lt;div&gt;자세한 설명은 생략한다. 왜 그런지 알고 싶으면 본문 봐라. (난 알고싶지 않아서 안봤다. 안쓸거니까 우왕ㅋ)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;결론은 이거다.&lt;/div&gt;&lt;div&gt;defineProperty 를 사용하자.&lt;/div&gt;&lt;div&gt;ECMAScript 5 스펙이다. 하지만 망할 IE7 에선 안되겠지&lt;/div&gt;&lt;div&gt;http://ejohn.org/blog/ecmascript-5-objects-and-properties/ (꼼꼼히 읽어볼 필요가 있다)&lt;/div&gt;&lt;div&gt;사용법이 좀 뜨억함.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Object.defineProperty(Object.prototype, "printObject", {&lt;/div&gt;&lt;div&gt;&amp;nbsp; value: function() {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; for (idx in this) { console.log(idx+':'+this[idx]) }&lt;/div&gt;&lt;div&gt;&amp;nbsp; }&lt;/div&gt;&lt;div&gt;});&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;이런식으로 쓰면 된다.&lt;/div&gt;&lt;div&gt;console.log 를 찍은 삽질을 해도 이해바란다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;---------- 보너스 ---------&lt;/div&gt;&lt;div&gt;get 으로 합을 구해보자.&lt;/div&gt;&lt;div&gt;array 형인 경우 length 라는 property 가 있어서 항상 갯수를 반환한다.&lt;/div&gt;&lt;div&gt;length() 가 아니고 length 로 말이다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;[10,20,30].length() &amp;lt;- 이게 아니다.&lt;/div&gt;&lt;div&gt;[10,20,30].length &amp;lt;- 요거&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;그렇다. getter를 정의한 것이다. 그럼 sum이 getter 로 선언하면 되는데.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;일단 sum은 어떻게 구하는가?&lt;/div&gt;&lt;div&gt;reduce를 사용해본다. noSQL! 하고 외친다면 당신이 생각하는 그것이 맞다고 말해주고 싶다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;var ages = [10,20,30];&lt;/div&gt;&lt;div&gt;ages.reduce(function(sum,val) { return sum+val; });&lt;/div&gt;&lt;div&gt;&amp;gt; 60&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Object.defineProperty(Object.prototype, "sum", {&lt;/div&gt;&lt;div&gt;&amp;nbsp; get: function() {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; return this.reduce(function(sum,val) { return sum+val; });&lt;/div&gt;&lt;div&gt;&amp;nbsp; }&lt;/div&gt;&lt;div&gt;});&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ages.sum&lt;/div&gt;&lt;div&gt;&amp;gt; 60&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;좋지 아니한가?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8182501247262747119-5352775649181573562?l=spectrumdig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spectrumdig.blogspot.com/feeds/5352775649181573562/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://spectrumdig.blogspot.com/2011/12/object-prototype.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8182501247262747119/posts/default/5352775649181573562'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8182501247262747119/posts/default/5352775649181573562'/><link rel='alternate' type='text/html' href='http://spectrumdig.blogspot.com/2011/12/object-prototype.html' title='왜 object에 prototype을 쓰지 않나?'/><author><name>jaeho lee</name><uri>https://profiles.google.com/110687673892501970268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-Jwtg9OLo-N0/AAAAAAAAAAI/AAAAAAAADco/jAp295u7dEI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8182501247262747119.post-1380773027235141797</id><published>2011-11-29T02:30:00.000+09:00</published><updated>2012-01-27T02:47:32.179+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='tcp'/><category scheme='http://www.blogger.com/atom/ns#' term='node.js'/><title type='text'>node.js 로 만드는 좀 더 본격적인 TCP Server</title><content type='html'>&lt;br /&gt;서로 에코만 하는게 부족하다면 유닉스의 wall 채팅을 구현해보자.&lt;br /&gt;사실 이것만 되면&lt;br /&gt;누가 접속했는지도 알고&lt;br /&gt;누가 누구한테 무얼 보낼 수 있는지도 아는 셈이므로&lt;br /&gt;채팅방을 하든지&lt;br /&gt;온라인대전 격투게임 서버를 만들던지&lt;br /&gt;바카라(어이쿠 위험한 단어) 서버를 만들던지&lt;br /&gt;엠엠오알피지 서버를 만들던지&lt;br /&gt;알아서 주무르면 된다.&lt;br /&gt;&lt;br /&gt;자 그럼 이 대단한 서버의 코드를 보자&lt;br /&gt;&lt;br /&gt;var clients = [];&lt;br /&gt;require('net').createServer(function(socket) {&lt;br /&gt;&lt;br /&gt;&amp;nbsp; socket.on("connect", function() {&lt;br /&gt;&amp;nbsp; &amp;nbsp; clients.push(socket);&lt;br /&gt;&amp;nbsp; });&lt;br /&gt;&lt;br /&gt;&amp;nbsp; socket.on("close", function() {&lt;br /&gt;&amp;nbsp; &amp;nbsp; clients.splice(clients.indexOf(socket), 1);&lt;br /&gt;&amp;nbsp; });&lt;br /&gt;&lt;br /&gt;&amp;nbsp; socket.on("data", function(data) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; var sender = this;&lt;br /&gt;&amp;nbsp; &amp;nbsp; clients.forEach(function(client) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; if (client !== sender) client.write(data);&lt;br /&gt;&amp;nbsp; &amp;nbsp; });&lt;br /&gt;&amp;nbsp; });&lt;br /&gt;}).listen(1337,"0.0.0.0");&lt;br /&gt;&lt;br /&gt;네트워크 프로그래밍 좀 해본 사람이라면 다리에 힘이 턱 풀릴 정도로 허무한 코드라고 할 수 있겠다.&lt;br /&gt;코드를 위에서부터 말로 쭉 설명하자면&lt;br /&gt;&lt;br /&gt;1. 빈 접속자 배열을 만든다.&lt;br /&gt;2. connect 할때마다 접속자 배열에 해당 소켓을 추가한다.&lt;br /&gt;3. close 하면 socket 의 위치를 찾아(indexOf) 해서 떼어낸다(splice)&lt;br /&gt;4. data 즉 접속자로 부터 입력을 받으면 자기 자신이 아닌 다른 모든 소켓에게 쓰기를 한다.&lt;br /&gt;5. 이 모든 것을 1337번 포트에 연다.&lt;br /&gt;&lt;br /&gt;정말 간단하다.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8182501247262747119-1380773027235141797?l=spectrumdig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spectrumdig.blogspot.com/feeds/1380773027235141797/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://spectrumdig.blogspot.com/2011/11/nodejs-tcp-server.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8182501247262747119/posts/default/1380773027235141797'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8182501247262747119/posts/default/1380773027235141797'/><link rel='alternate' type='text/html' href='http://spectrumdig.blogspot.com/2011/11/nodejs-tcp-server.html' title='node.js 로 만드는 좀 더 본격적인 TCP Server'/><author><name>jaeho lee</name><uri>https://profiles.google.com/110687673892501970268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-Jwtg9OLo-N0/AAAAAAAAAAI/AAAAAAAADco/jAp295u7dEI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8182501247262747119.post-3920500565592997055</id><published>2011-11-25T03:19:00.000+09:00</published><updated>2012-01-27T02:49:11.323+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='tcp'/><category scheme='http://www.blogger.com/atom/ns#' term='node.js'/><title type='text'>node.js server pattern</title><content type='html'>&lt;br /&gt;에코 서버 3줄이면 된다는 걸 증명하기 위해선&lt;br /&gt;&lt;br /&gt;require('net').createServer(function(socket) {&lt;br /&gt;&amp;nbsp; socket.pipe(socket);&lt;br /&gt;}).listen(1337,"127.0.0.1");&lt;br /&gt;&lt;br /&gt;요정도면 충분.&lt;br /&gt;접속/서버메시지/접속종료 구현은&lt;br /&gt;&lt;br /&gt;require('net').createServer(function(socket) {&lt;br /&gt;&amp;nbsp; socket.on("connect", function() {&lt;br /&gt;&amp;nbsp; &amp;nbsp; socket.write("hello\n");&lt;br /&gt;&amp;nbsp; });&lt;br /&gt;&amp;nbsp; socket.on("close", function() {&lt;br /&gt;&amp;nbsp; &amp;nbsp; console.log("closed");&lt;br /&gt;&amp;nbsp; });&lt;br /&gt;&amp;nbsp; socket.on("data", function(data) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; socket.write("usay:"+data);&lt;br /&gt;&amp;nbsp; });&lt;br /&gt;}).listen(1337,"127.0.0.1");&lt;br /&gt;&lt;br /&gt;이정도면 충분하겠다.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8182501247262747119-3920500565592997055?l=spectrumdig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spectrumdig.blogspot.com/feeds/3920500565592997055/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://spectrumdig.blogspot.com/2011/11/nodejs-server-pattern.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8182501247262747119/posts/default/3920500565592997055'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8182501247262747119/posts/default/3920500565592997055'/><link rel='alternate' type='text/html' href='http://spectrumdig.blogspot.com/2011/11/nodejs-server-pattern.html' title='node.js server pattern'/><author><name>jaeho lee</name><uri>https://profiles.google.com/110687673892501970268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-Jwtg9OLo-N0/AAAAAAAAAAI/AAAAAAAADco/jAp295u7dEI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8182501247262747119.post-4634196363093401242</id><published>2011-10-30T00:50:00.000+09:00</published><updated>2012-01-27T02:52:15.080+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='redmine'/><category scheme='http://www.blogger.com/atom/ns#' term='dotcloud'/><title type='text'>DotCloud 에서 Redmine 수정 후 Push 하였을때 발생하는 오류에 대한 대처법</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://pds22.egloos.com/pds/201110/30/21/c0002721_4eac1f3f6435a.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="180" src="http://pds22.egloos.com/pds/201110/30/21/c0002721_4eac1f3f6435a.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://www.redmine.org/boards/2/topics/11085"&gt;http://www.redmine.org/boards/2/topics/11085&lt;/a&gt; 구글링해보았다.&lt;br /&gt;&lt;br /&gt;a key is required to write a cookie containg the session data&lt;br /&gt;&lt;br /&gt;오류인데 당황하지 말고&lt;br /&gt;&lt;br /&gt;$ dotcloud ssh redmine.redmine (redmine.redmine 은 나만 이렇게 쓰고 있으니 알아서 변경하시길)&lt;br /&gt;로 들어가서&lt;br /&gt;&lt;br /&gt;$ cd current&lt;br /&gt;$ rake config/initializers/session_store.rb&lt;br /&gt;&lt;br /&gt;해주면 끝.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8182501247262747119-4634196363093401242?l=spectrumdig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spectrumdig.blogspot.com/feeds/4634196363093401242/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://spectrumdig.blogspot.com/2011/10/dotcloud-redmine-push.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8182501247262747119/posts/default/4634196363093401242'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8182501247262747119/posts/default/4634196363093401242'/><link rel='alternate' type='text/html' href='http://spectrumdig.blogspot.com/2011/10/dotcloud-redmine-push.html' title='DotCloud 에서 Redmine 수정 후 Push 하였을때 발생하는 오류에 대한 대처법'/><author><name>jaeho lee</name><uri>https://profiles.google.com/110687673892501970268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-Jwtg9OLo-N0/AAAAAAAAAAI/AAAAAAAADco/jAp295u7dEI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8182501247262747119.post-5238850890198562495</id><published>2011-09-28T02:15:00.000+09:00</published><updated>2012-01-27T02:54:00.701+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='redmine'/><category scheme='http://www.blogger.com/atom/ns#' term='dotcloud'/><title type='text'>redmine project 식별자(identifier) 변경</title><content type='html'>&lt;br /&gt;보통은 식별자를 Admin모드에서 바꿀 수 없다.&lt;br /&gt;하지만 누구나 실수는 하는 법.&lt;br /&gt;mysql 을 뒤져보니 간단하게 바꿀 수 있더라.&lt;br /&gt;&lt;br /&gt;$ dotcloud ssh redmine.db&lt;br /&gt;$ mysql -uroot -p&amp;lt;암호&amp;gt;&lt;br /&gt;mysql&amp;gt; use redmine;&lt;br /&gt;Reading table information for completion of table and column names&lt;br /&gt;You can turn off this feature to get a quicker startup with -A&lt;br /&gt;&lt;br /&gt;Database changed&lt;br /&gt;mysql&amp;gt; show tables;&lt;br /&gt;+-------------------------------------+&lt;br /&gt;| Tables_in_redmine &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; |&lt;br /&gt;+-------------------------------------+&lt;br /&gt;| attachments &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; |&lt;br /&gt;| auth_sources &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| boards &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| changes &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; |&lt;br /&gt;| changesets &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| changesets_issues &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; |&lt;br /&gt;| comments &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| custom_fields &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; |&lt;br /&gt;| custom_fields_projects &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| custom_fields_trackers &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| custom_values &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; |&lt;br /&gt;| documents &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; |&lt;br /&gt;| enabled_modules &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; |&lt;br /&gt;| enumerations &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| groups_users &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| issue_categories &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| issue_relations &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; |&lt;br /&gt;| issue_statuses &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| issues &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| journal_details &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; |&lt;br /&gt;| journals &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| member_roles &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| members &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; |&lt;br /&gt;| messages &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| news &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| open_id_authentication_associations |&lt;br /&gt;| open_id_authentication_nonces &amp;nbsp; &amp;nbsp; &amp;nbsp; |&lt;br /&gt;| projects &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| projects_trackers &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; |&lt;br /&gt;| queries &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; |&lt;br /&gt;| repositories &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| roles &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; |&lt;br /&gt;| schema_migrations &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; |&lt;br /&gt;| settings &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| time_entries &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| tokens &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| trackers &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| user_preferences &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| users &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; |&lt;br /&gt;| versions &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| watchers &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| wiki_content_versions &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; |&lt;br /&gt;| wiki_contents &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; |&lt;br /&gt;| wiki_pages &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| wiki_redirects &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| wikis &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; |&lt;br /&gt;| workflows &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; |&lt;br /&gt;+-------------------------------------+&lt;br /&gt;47 rows in set (0.00 sec)&lt;br /&gt;&lt;br /&gt;슬쩍보니까 projects 라는 테이블이 있다.&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; desc projects;&lt;br /&gt;+-------------+--------------+------+-----+---------+----------------+&lt;br /&gt;| Field &amp;nbsp; &amp;nbsp; &amp;nbsp; | Type &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | Null | Key | Default | Extra &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;+-------------+--------------+------+-----+---------+----------------+&lt;br /&gt;| id &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| int(11) &amp;nbsp; &amp;nbsp; &amp;nbsp;| NO &amp;nbsp; | PRI | NULL &amp;nbsp; &amp;nbsp;| auto_increment |&lt;br /&gt;| name &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| varchar(255) | NO &amp;nbsp; | &amp;nbsp; &amp;nbsp; | &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| description | text &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | YES &amp;nbsp;| &amp;nbsp; &amp;nbsp; | NULL &amp;nbsp; &amp;nbsp;| &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| homepage &amp;nbsp; &amp;nbsp;| varchar(255) | YES &amp;nbsp;| &amp;nbsp; &amp;nbsp; | &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| is_public &amp;nbsp; | tinyint(1) &amp;nbsp; | NO &amp;nbsp; | &amp;nbsp; &amp;nbsp; | 1 &amp;nbsp; &amp;nbsp; &amp;nbsp; | &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| parent_id &amp;nbsp; | int(11) &amp;nbsp; &amp;nbsp; &amp;nbsp;| YES &amp;nbsp;| &amp;nbsp; &amp;nbsp; | NULL &amp;nbsp; &amp;nbsp;| &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| created_on &amp;nbsp;| datetime &amp;nbsp; &amp;nbsp; | YES &amp;nbsp;| &amp;nbsp; &amp;nbsp; | NULL &amp;nbsp; &amp;nbsp;| &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| updated_on &amp;nbsp;| datetime &amp;nbsp; &amp;nbsp; | YES &amp;nbsp;| &amp;nbsp; &amp;nbsp; | NULL &amp;nbsp; &amp;nbsp;| &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| identifier &amp;nbsp;| varchar(255) | YES &amp;nbsp;| &amp;nbsp; &amp;nbsp; | NULL &amp;nbsp; &amp;nbsp;| &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| status &amp;nbsp; &amp;nbsp; &amp;nbsp;| int(11) &amp;nbsp; &amp;nbsp; &amp;nbsp;| NO &amp;nbsp; | &amp;nbsp; &amp;nbsp; | 1 &amp;nbsp; &amp;nbsp; &amp;nbsp; | &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| lft &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | int(11) &amp;nbsp; &amp;nbsp; &amp;nbsp;| YES &amp;nbsp;| MUL | NULL &amp;nbsp; &amp;nbsp;| &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;| rgt &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | int(11) &amp;nbsp; &amp;nbsp; &amp;nbsp;| YES &amp;nbsp;| MUL | NULL &amp;nbsp; &amp;nbsp;| &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;br /&gt;+-------------+--------------+------+-----+---------+----------------+&lt;br /&gt;&lt;br /&gt;음 이놈맞네. identifier 를 바꿔주자.&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; update projects set identifier='&lt;b&gt;&amp;lt;변경할ID&amp;gt;&lt;/b&gt;' where identifier ='&lt;b&gt;&amp;lt;이전ID&amp;gt;&lt;/b&gt;';&lt;br /&gt;Query OK, 1 row affected (0.02 sec)&lt;br /&gt;Rows matched: 1 &amp;nbsp;Changed: 1 &amp;nbsp;Warnings: 0&lt;br /&gt;&lt;br /&gt;영향도가 있을까봐 걱정했는데 현재 버전(redmine 1.2.1)에선 별 영향없단다.&lt;br /&gt;그래도 처음에 긴장하고 identifier 는 신중하게 잘 짓자.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8182501247262747119-5238850890198562495?l=spectrumdig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spectrumdig.blogspot.com/feeds/5238850890198562495/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://spectrumdig.blogspot.com/2011/09/redmine-project-identifier.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8182501247262747119/posts/default/5238850890198562495'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8182501247262747119/posts/default/5238850890198562495'/><link rel='alternate' type='text/html' href='http://spectrumdig.blogspot.com/2011/09/redmine-project-identifier.html' title='redmine project 식별자(identifier) 변경'/><author><name>jaeho lee</name><uri>https://profiles.google.com/110687673892501970268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-Jwtg9OLo-N0/AAAAAAAAAAI/AAAAAAAADco/jAp295u7dEI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8182501247262747119.post-81730579211806008</id><published>2011-09-22T05:29:00.000+09:00</published><updated>2012-01-27T03:11:51.347+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dotcloud'/><category scheme='http://www.blogger.com/atom/ns#' term='hosting'/><title type='text'>dotcloud 에 redmine 등록 후 Domain 도 연결해보자</title><content type='html'>&lt;a href="http://spectrumdig.blogspot.com/2011/09/redmine-dotcloudcom.html"&gt;redmine 을 dotcloud.com 에 올렸습니다. 무료니까요.&lt;/a&gt;&lt;br /&gt;이후 할것들이 몇가지가 있다.&lt;br /&gt;&lt;br /&gt;하나는 Domain 연결이고&lt;br /&gt;나머지 하나는 mail notification 인데 차근차근 보자&lt;br /&gt;&lt;br /&gt;잘 등록했다면 list 를 보았을때&lt;br /&gt;&lt;br /&gt;$ dotcloud list&lt;br /&gt;redmine:&lt;br /&gt;&amp;nbsp; - db &amp;nbsp; &amp;nbsp; &amp;nbsp;(type: mysql; instances: 1)&lt;br /&gt;&amp;nbsp; - redmine (type: ruby; instances: 1) &lt;br /&gt;&lt;br /&gt;라고 나올 것이다.&lt;br /&gt;&lt;br /&gt;http://docs.dotcloud.com/guides/domains/ 가이드대로&lt;br /&gt;&lt;br /&gt;$ dotcloud alias add ramen.www www.example.com 형식으로 써보자&lt;br /&gt;&lt;br /&gt;어플리케이션명이 redmine 이고 모듈도 redmine 이니까&lt;br /&gt;&lt;br /&gt;$ dotcloud alias add redmine.redmine www.&amp;lt;니가 쓰는 도메인&amp;gt; 형식이 되겠다.&lt;br /&gt;&lt;br /&gt;아래와 같이 나오면 정상.&lt;br /&gt;&lt;br /&gt;Ok. Now please add the following DNS record:&lt;br /&gt;www.&amp;lt;니가 쓰는 도메인&amp;gt;. IN CNAME gateway.dotcloud.com.&lt;br /&gt;&lt;br /&gt;내 경우엔 서브도메인으로 쓰고 싶어서&lt;br /&gt;&lt;br /&gt;$ dotcloud alias add redmine.redmine redmine.&amp;lt;내 도메인&amp;gt; 형식으로 썼다.&lt;br /&gt;&lt;br /&gt;브라우저에서 &amp;nbsp;http://redmine.&amp;lt;내 도메인&amp;gt; 으로 접근했을때 CNAME Alias 를 줘서 호스팅 서비스쪽에서 gateway.dotcloud.com 을 바라보게 하고 gateway.dotcloud.com 에서 해당 어플리케이션으로 연결되게 하는 구조다.&lt;br /&gt;netfirms.com 이란 곳에서 도메인 호스팅을 받고 있는데 관련 설정을 보면 이런 식이다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CNAME (Alias)&lt;br /&gt;&lt;br /&gt;A CNAME record (also known as an alias record) is a subdomain that points to a domain name (sales.yourdomain.com &amp;gt;&amp;gt; yourdomain.com)&lt;br /&gt;&lt;div style="font-family: 굴림; font-size: 12px; line-height: 15px;"&gt;&lt;span class="Apple-style-span" style="background-color: #eaf3fe; font-family: arial, helvetica, clean, sans-serif; line-height: 14px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;table class="dns-table" style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; border-collapse: collapse; font-size: 1em; width: 613px;"&gt;&lt;thead&gt;&lt;tr style="border-bottom-color: rgb(102, 153, 204); border-bottom-style: dotted; border-bottom-width: 1px; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; height: 20px;"&gt;&lt;th scope="col" style="background-attachment: initial; background-clip: initial; background-color: #6699cc; background-image: initial; background-origin: initial; color: white; font-style: inherit; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.5em; padding-left: 0.5em; padding-right: 0.5em; padding-top: 0.5em; text-align: left;"&gt;Host&lt;/th&gt;&lt;th scope="col" style="background-attachment: initial; background-clip: initial; background-color: #6699cc; background-image: initial; background-origin: initial; color: white; font-style: inherit; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.5em; padding-left: 0.5em; padding-right: 0.5em; padding-top: 0.5em; text-align: left;"&gt;Points To:&lt;/th&gt;&lt;th scope="col" style="background-attachment: initial; background-clip: initial; background-color: #6699cc; background-image: initial; background-origin: initial; color: white; font-style: inherit; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.5em; padding-left: 0.5em; padding-right: 0.5em; padding-top: 0.5em; text-align: left;"&gt;Action&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr class="entry" style="border-bottom-color: rgb(102, 153, 204); border-bottom-style: dotted; border-bottom-width: 1px; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; height: 20px;"&gt;&lt;td style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 4px; padding-left: 4px; padding-right: 20px; padding-top: 4px;"&gt;&lt;div id="n298999728" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;redmine&lt;/div&gt;&lt;/td&gt;&lt;td style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 4px; padding-left: 4px; padding-right: 20px; padding-top: 4px;"&gt;&lt;div id="c298999728" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;gateway.dotcloud.com&lt;/div&gt;&lt;/td&gt;&lt;td style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 4px; padding-left: 4px; padding-right: 20px; padding-top: 4px;"&gt;&lt;s-lect class="actions" size="1" style="font-family: inherit; font-size: inherit; font-style: inherit; font: normal normal normal 99%/normal arial, helvetica, clean, sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/s-lect&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span class="Apple-style-span" style="background-color: #eaf3fe; font-family: arial, helvetica, clean, sans-serif; line-height: 14px;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: 굴림; font-size: 12px; line-height: 15px;"&gt;&lt;/div&gt;&lt;div style="font-family: 굴림; font-size: 12px; line-height: 15px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;CNAME 설정을 이렇게 했다. 쓰고 있는 도메인 호스팅 서비스마다 차이가 있겠지만 알아서 잘 하면 된다&lt;span style="font-family: 굴림;"&gt;&lt;span style="font-size: 12px; line-height: 15px;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8182501247262747119-81730579211806008?l=spectrumdig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spectrumdig.blogspot.com/feeds/81730579211806008/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://spectrumdig.blogspot.com/2011/09/redmine-dotcloud.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8182501247262747119/posts/default/81730579211806008'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8182501247262747119/posts/default/81730579211806008'/><link rel='alternate' type='text/html' href='http://spectrumdig.blogspot.com/2011/09/redmine-dotcloud.html' title='dotcloud 에 redmine 등록 후 Domain 도 연결해보자'/><author><name>jaeho lee</name><uri>https://profiles.google.com/110687673892501970268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-Jwtg9OLo-N0/AAAAAAAAAAI/AAAAAAAADco/jAp295u7dEI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8182501247262747119.post-5260051545401935255</id><published>2011-09-20T15:31:00.000+09:00</published><updated>2012-01-27T03:00:38.827+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='redmine'/><category scheme='http://www.blogger.com/atom/ns#' term='dotcloud'/><category scheme='http://www.blogger.com/atom/ns#' term='hosting'/><title type='text'>redmine 을 dotcloud.com 에 올렸습니다. 무료니까요.</title><content type='html'>&lt;br /&gt;PaaS(Platform as a Service)의 시대입니다.&lt;br /&gt;지금 배타고 물들어올때 잽싸게 올라타자 하는 마음으로&lt;br /&gt;http://www.dotcloud.com 에 계정을 하나 만들어놓았습니다.&lt;br /&gt;소프트웨어(ex.ASP) 뿐만이 아니라 플랫폼마저도 빌려쓰는 세상이라니 좋은 세상입니다.&lt;br /&gt;&lt;br /&gt;자 바로 본론입니다.&lt;br /&gt;먼저 http://dotcloud.com 에 가입하시고 http://docs.dotcloud.com/firststeps/install 에서 cli 도 설치하고 기본 준비를 하세요.&lt;br /&gt;이런건 패스합니다. 읽어보면 멸치라도 할 수 있어요. 봐도 모르시겠다고요. 그럼 Backspace : )&lt;br /&gt;현재는 Free Plan 뿐입니다만 너무도 훌륭한 서비스입니다.&lt;br /&gt;&lt;br /&gt;http://yanitime4u.fluxflex.com/56 를 보고 해보니까 쉽더군요.&lt;br /&gt;근데 보실 필요는 없어요. 왜냐면 이 아래에 쓸 내용도 같은 내용이니까요 :)&lt;br /&gt;&lt;br /&gt;https://www.dotcloud.com/settings/ 에서 유저명을 바꿔주세요.&lt;br /&gt;API Key, Username,First name, Last name, E-mail address 순으로 있죠?&lt;br /&gt;두번째 Username을 바꿔줍니다. 최종 우리가 사용할 URL은 http://redmine-&amp;lt;Username&amp;gt;.dotcloud.com 이 될테니까요.&lt;br /&gt;&lt;br /&gt;일단 지금 홈디렉토리라고 가정하고 복사하고 붙여봅니다.&lt;br /&gt;현재 최신버전인 redmine 1.2.1 을 사용합니다.&lt;br /&gt;&lt;br /&gt;$ mkdir redmine&lt;br /&gt;$ cd redmine&lt;br /&gt;$ wget http://rubyforge.org/frs/download.php/75097/redmine-1.2.1.tar.gz&lt;br /&gt;$ tar zxvf redmine-1.2.1.tar.gz&lt;br /&gt;&lt;br /&gt;일단 압축을 풀으셨으면 디플로이할때 걸리적거리니까 redmine-1.2.1.tar.gz 일단 지워주고 dotcloud.yml 파일을 만듭니다.&lt;br /&gt;우리는 redmine 을 쓰고 mysql을 db로 쓸테니 다음과 같은 파일을 만듭니다.&lt;br /&gt;&lt;br /&gt;$ vi dotcloud.yml&lt;br /&gt;---- 아래 복사하세요 -----&lt;br /&gt;redmine:&lt;br /&gt;&amp;nbsp; type: ruby&lt;br /&gt;&amp;nbsp; approot: redmine-1.2.1&lt;br /&gt;&amp;nbsp; config:&lt;br /&gt;&amp;nbsp; &amp;nbsp; ruby-version: ree&lt;br /&gt;&lt;br /&gt;db:&lt;br /&gt;&amp;nbsp; type: mysql&lt;br /&gt;---- 여기까지 ----&lt;br /&gt;&lt;br /&gt;이제 Application 을 생성해봅니다.&lt;br /&gt;&lt;br /&gt;$ dotcloud create redmine&lt;br /&gt;$ dotcloud push redmine&lt;br /&gt;&lt;br /&gt;오케이 redmine 이라고 꼭 할 필욘없습니다. 이게 Application 명이니까요 다른 이름을 써도 무방. 설명은 이걸 redmine으로 합니다.&lt;br /&gt;&lt;br /&gt;$ dotcloud list&lt;br /&gt;로 확인하거나&lt;br /&gt;https://www.dotcloud.com/dashboard/ 에서 확인해볼 수 있습니다.&lt;br /&gt;&lt;br /&gt;여기까지 했다면 준비는 끝났습니다.&lt;br /&gt;이제 남은 건 세세한 설정 뿐이죠.&lt;br /&gt;&lt;br /&gt;$ dotcloud info redmine&lt;br /&gt;$ dotcloud info redmine.redmine&lt;br /&gt;$ dotcloud info redmine.db&lt;br /&gt;&lt;br /&gt;설정을 보고 어딘가에 복사해놓습니다. 다 쓸데가 있어요&lt;br /&gt;대충 이런식으로 나올겁니다.&lt;br /&gt;&lt;br /&gt;$ dotcloud info redmine&lt;br /&gt;db:&lt;br /&gt;&amp;nbsp; &amp;nbsp; config:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mysql_password: &amp;lt;mysql 암호&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; instances: 1&lt;br /&gt;&amp;nbsp; &amp;nbsp; type: mysql&lt;br /&gt;redmine:&lt;br /&gt;&amp;nbsp; &amp;nbsp; config:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; rack-env: production&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ruby-version: ree&lt;br /&gt;&amp;nbsp; &amp;nbsp; instances: 1&lt;br /&gt;&amp;nbsp; &amp;nbsp; type: ruby&lt;br /&gt;&amp;nbsp; &amp;nbsp; url: http://redmine-&amp;lt;Username&amp;gt;.dotcloud.com/&lt;br /&gt;$ dotcloud info redmine.redmine&lt;br /&gt;aliases:&lt;br /&gt;- redmine-&amp;lt;Username&amp;gt;.dotcloud.com&lt;br /&gt;build_revision: rsync-1316499221.6&lt;br /&gt;cluster: wolverine&lt;br /&gt;config:&lt;br /&gt;&amp;nbsp; &amp;nbsp; rack-env: production&lt;br /&gt;&amp;nbsp; &amp;nbsp; ruby-version: ree&lt;br /&gt;created_at: 1316499226.2593739&lt;br /&gt;image_version: aec61048b63c (latest)&lt;br /&gt;ports:&lt;br /&gt;- &amp;nbsp; name: ssh&lt;br /&gt;&amp;nbsp; &amp;nbsp; url: ssh://dotcloud@redmine-&amp;lt;Username&amp;gt;.dotcloud.com:13631&lt;br /&gt;- &amp;nbsp; name: http&lt;br /&gt;&amp;nbsp; &amp;nbsp; url: http://redmine-&amp;lt;Username&amp;gt;.dotcloud.com/&lt;br /&gt;state: running&lt;br /&gt;type: ruby&lt;br /&gt;$ dotcloud info redmine.db&lt;br /&gt;cluster: wolverine&lt;br /&gt;config:&lt;br /&gt;&amp;nbsp; &amp;nbsp; mysql_password: &amp;lt;mysql 암호&amp;gt;&lt;br /&gt;created_at: 1316499226.5895569&lt;br /&gt;image_version: 57db01da2848 (latest)&lt;br /&gt;ports:&lt;br /&gt;- &amp;nbsp; name: ssh&lt;br /&gt;&amp;nbsp; &amp;nbsp; url: ssh://mysql@redmine-&amp;lt;Username&amp;gt;.dotcloud.com:13632&lt;br /&gt;- &amp;nbsp; name: mysql&lt;br /&gt;&amp;nbsp; &amp;nbsp; url: mysql://root:&amp;lt;mysql 암호&amp;gt;@redmine-&amp;lt;Username&amp;gt;.dotcloud.com:13633&lt;br /&gt;state: running&lt;br /&gt;type: mysql&lt;br /&gt;&lt;br /&gt;대인배입니다. ssh 까지 제공하다니요. 그저 고맙습니다.&lt;br /&gt;mysql 설정 먼저 합니다.&lt;br /&gt;redmine DB 생성하고 redmine 유저를 만듭니다. 암호는 &amp;lt;mysql 암호&amp;gt; 를 사용합니다.&lt;br /&gt;&lt;br /&gt;$ dotcloud ssh redmine.db&lt;br /&gt;$ mysql -u root -p&amp;lt;mysql 암호&amp;gt;&lt;br /&gt;create database redmine character set utf8;&lt;br /&gt;grant all on redmine.* to redmine@"%" identified by "&amp;lt;mysql 암호&amp;gt;";&lt;br /&gt;FLUSH PRIVILEGES;&lt;br /&gt;quit&lt;br /&gt;$ exit&lt;br /&gt;&lt;br /&gt;바로 어플리케이션 설정도 들어갑니다.&lt;br /&gt;필요한 ruby gem 들을 설치합니다.&lt;br /&gt;&lt;br /&gt;$ dotcloud ssh redmine.redmine&lt;br /&gt;$ gem install mysql&lt;br /&gt;$ gem install rack -v=1.1.1&lt;br /&gt;$ gem install i18n -v=0.4.2&lt;br /&gt;$ exit&lt;br /&gt;&lt;br /&gt;거의 다왔습니다.&lt;br /&gt;이제 redmine 압축 푼 경로에 config.database 를 만듭시다.&lt;br /&gt;아까 복사한 것들 잘 붙여넣습니다.&lt;br /&gt;&lt;br /&gt;$ cd redmine-1.2.1/&lt;br /&gt;$ vi config/database.yml&lt;br /&gt;&lt;br /&gt;production:&lt;br /&gt;&amp;nbsp; adapter: mysql&lt;br /&gt;&amp;nbsp; database: redmine&lt;br /&gt;&amp;nbsp; host: redmine-&amp;lt;Username&amp;gt;.dotcloud.com&lt;br /&gt;&amp;nbsp; port: &amp;lt;mysql Port&amp;gt;&lt;br /&gt;&amp;nbsp; username: redmine&lt;br /&gt;&amp;nbsp; password: &amp;lt;mysql 암호&amp;gt;&lt;br /&gt;&amp;nbsp; encoding: utf8&lt;br /&gt;&lt;br /&gt;이제 내 서버 셋팅만 하면 끝입니다.&lt;br /&gt;&lt;br /&gt;$ dotcloud push redmine&lt;br /&gt;&lt;br /&gt;이제까지 한 작업을 push 합니다.&lt;br /&gt;서버에 올라가고 나면&lt;br /&gt;&lt;br /&gt;$ dotcloud ssh redmine.redmine&lt;br /&gt;&lt;br /&gt;ssh 로 다시 어플리케이션 접근해서&lt;br /&gt;&lt;br /&gt;$ cd current&lt;br /&gt;&lt;br /&gt;현재 버전으로 들어가서&lt;br /&gt;rake 합니다.&lt;br /&gt;&lt;br /&gt;$ rake config/initializers/session_store.rb&lt;br /&gt;$ rake db:migrate RAILS_ENV="production"&lt;br /&gt;&lt;br /&gt;마지막으로 디폴트데이터를 적재하는데 언어를 묻습니다. 한글을 쓸거니까 ko 라고 입력해줍니다.&lt;br /&gt;&lt;br /&gt;$ rake redmine:load_default_data&lt;br /&gt;(in /home/dotcloud/rsync-1316495751.45/redmine-1.2.1)&lt;br /&gt;&lt;br /&gt;Select language: bg, bs, ca, cs, da, de, el, en, en-GB, es, eu, fa, fi, fr, gl, he, hr, hu, id, it, ja, ko, lt, lv, mk, mn, nl, no, pl, pt, pt-BR, ro, ru, sk, sl, sr, sr-YU, sv, th, tr, uk, vi, zh, zh-TW [en] ko&lt;br /&gt;====================================&lt;br /&gt;Default configuration data loaded.&lt;br /&gt;&lt;br /&gt;자 끝났습니다!&lt;br /&gt;&lt;br /&gt;http://redmine-&amp;lt;Username&amp;gt;.dotcloud.com 해서 확인해봅니다.&lt;br /&gt;&lt;br /&gt;초기 어드민 계정은 admin/admin 이므로 최초 로그인 후 암호 변경합니다.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8182501247262747119-5260051545401935255?l=spectrumdig.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://spectrumdig.blogspot.com/feeds/5260051545401935255/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://spectrumdig.blogspot.com/2011/09/redmine-dotcloudcom.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8182501247262747119/posts/default/5260051545401935255'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8182501247262747119/posts/default/5260051545401935255'/><link rel='alternate' type='text/html' href='http://spectrumdig.blogspot.com/2011/09/redmine-dotcloudcom.html' title='redmine 을 dotcloud.com 에 올렸습니다. 무료니까요.'/><author><name>jaeho lee</name><uri>https://profiles.google.com/110687673892501970268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-Jwtg9OLo-N0/AAAAAAAAAAI/AAAAAAAADco/jAp295u7dEI/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry></feed>
