기본 콘텐츠로 건너뛰기

2월, 2012의 게시물 표시

느려터진 안드로이드 에뮬은 버리고 VM을 쓰자.

iOS개발 환경이 안드로이드보다 우월점은 여러가지가 있겠지만 개인적으로 가장 큰부분이라고 생각하는 점이 iOS Simulator 의 넘사벽 속도다. 사실 iOS 의 경우 Emulator 가 아니라 Simulator 라는 훼이크를 써서 그런건데. 하드웨어+소프트웨어를 같이 하는 회사만이 쓸 수 있는 필살기라 볼 수 있다. 반면 안드로이드의 경우 ARM 에뮬레이터를 사용하는데 이게 참 못만들었다. 플스에뮬이나 GBA에뮬 반정도만 만들어도 써줄텐데 아직 갈길이 멀다. 그래서 구시렁 거리면서 하드웨어를 연결해서 테스트를 하고 있는데 역시 USB연결하는 건 불편하고 apk 를 전송하는 과정도 그다지 빠르지 않아서 개발 생산성이 월등히 나아지지는 않는다. 루팅을 하면 wifi 를 통해 apk 를 인스톨 할 수 있다고 해서 몇 가지를 해보았으나 잘 모르겠지만 인스톨까진 잘 되었는데 디버깅 모드로 실행이 되지 않아 그만두었다. 게다가 전송속도도 USB보다 wifi가 느리고 맘에 들지 않더라. 그러던중 stackoverflow.com(늘 신세지고 있습니다) 에서 "VM으로 안드로이드를 띄워서 adb connect 하면 좋아!" 라는 글에 눈이 번쩍. 시행착오를 몇번 했지만 의외로 간단하더라. 1. VMWare건 VirtualBox건 상관없다. VM호스트를 준비하자. 2. http://www.android-x86.org/download 로 가서  Deprecated x86 2.2 generic  을 받자. Q) 왜 Deprecated 인 2.2 generic 을 받나요. Deprecated는 쓰면 안되는 거 아님? A) http://mariuz.android-dev.ro/vm.iso.7z 도 있다고 한다. http://www.android-x86.org/download 에 있는 요즘 것들은 죄다 안된다. 3. 죄다 일단 Default 설정에 yes yes 하고 설치한다. 한글 문서가 필요한 분은 "카카오

javascript 3d round carousel

http://jsdo.it/spectrum/carousel 역시나 맘에 드는게 없어서 만들었다. 어렵지 않을려나 싶었는데 생각보다 얼마 안걸림. 역시 모닝 코딩인가. querySelectorAll 때문에 $s 랑, items() 를 프로토타입에서 array를 반환하도록 하여 forEach를 돌릴 수 있도록 소금(salt)을 쳤다. var $=function(selector) { return document.querySelector(selector); }; var $s=function(selector) { return document.querySelectorAll(selector); }; NodeList.prototype.items=function() { var array=[]; for (var i=0; i [2, 0] (뒤집힘) // / 2 하면 [1, 0]이 됨. // * (1-2/5) 하면 [3/5, 0] // 1 - 하면 [2/5, 1] var scale = (1-(1-Math.sin(degree*Math.PI/180))/2*(1-2/5)); v.setAttribute('style', 'left:'+parseInt(x,10)+'px;'+ 'top:'+parseInt(y,10)+'px;'+ 'z-index:'+parseInt(y,10)+';'+ '-webkit-transform: scale('+scale+');' ); }); } }; document.ontouchmove = function(e){ e.preventDefault(); }; p.objects=$s('ul#container>li'); p.renderCarousel(p.idx)

html5 audio player를 만들어 보았다. #2

html5 audio player를 만들어 보았다. 에서 언급했던 audio player 를 조금 업데이트. 마찬가지로 소스는 이곳 :  http://jsdo.it/spectrum/webAudioPlayer 플레이 전용(모바일 등등)은  http://jsrun.it/spectrum/webAudioPlayer 전체 시간을 보여주고 재생 배속을 설정할 수 있다. 소스는 대동소이. duration 을 사용. 전체 재생 길이를 보여주고 playbackRate 으로 재생 배속을 변경하도록 하였다. http://dev.w3.org/html5/spec/Overview.html#htmlmediaelement 의외로 오디오 재생 피치를 유지한 상태로 정말 배속만 변하더라. double 값이라서 세세한 조정은 가능함. 아쉽게도 android/iOS에서는 배속 지원은 안함. $=function(element) { return document.querySelector(element); }; p={ audio : null, onLoad: function() { p.audio = new Audio('http://k003.kiwi6.com/hotlink/3dgmyavs49/your_name_ft_gaduk.mp3'); $('#play').onclick=p.onPlay; $('#stop').onclick=p.onStop; $('#pause').onclick=p.onPause; $('#rew10').onclick=p.on10rew; $('#ff10').onclick=p.on10ff; $('#rate').onclick=p.onRate; p.audio.addEventListener('timeupdate', p.onTimeUpdate, false); }, onPlay: function() { p.audio

routing module을 만들자 - handler

callback을 바로 넣을 수는 없어보이고 type 에 func 을 정의하고 달면 된다. 나름 명시적이네. 역시 소스는  여기 package main import (   "fmt" ) type Handler func(method string) type Route struct {   Method,Pattern string } type Routes struct {   Routes []Route } func (r Routes) routeCount() int {   return len(r.Routes) } func (r *Routes) addRoute(method, pattern string,  handler Handler ) {   r.Routes=append(r.Routes, Route{Method:method, Pattern:pattern})   fmt.Printf("route Count : %d\n", len(r.Routes))    handler(method) } func (r *Routes) GET(pattern string,  handler Handler ) {   r.addRoute("GET", pattern, handler) } func (r *Routes) POST(pattern string,  handler Handler ) {   r.addRoute("POST", pattern, handler) } func (r *Routes) PUT(pattern string,  handler Handler ) {   r.addRoute("PUT", pattern, handler) } func (r *Routes) DELETE(pattern string,  handler Handler ) {   r.addRoute("DELETE", pattern, handler) } func handler(method string) {   fmt.Printf("

routing module을 만들자 - REST 붙이기

별 중요한 건 없지만 역시 func (variable struct)를 쓰는 패턴을 학습한다. routeCount 를 구할땐 func(r Routes)를 addRoute, GET/POST/PUT/DELETE를 할땐 func(r *Routes) 를 쓰는 부분에 주목하자. 역시 소스는  여기 package main import (   "fmt" ) type Route struct {   Method,Pattern string } type Routes struct {   Routes []Route } func (r Routes) routeCount() int {   return len(r.Routes) } func (r *Routes) addRoute(method, pattern string) {   r.Routes=append(r.Routes, Route{Method:method, Pattern:pattern})   fmt.Printf("route Count : %d\n", len(r.Routes)) } func (r *Routes) GET(pattern string) {   r.addRoute("GET", pattern) } func (r *Routes) POST(pattern string) {   r.addRoute("POST", pattern) } func (r *Routes) PUT(pattern string) {   r.addRoute("PUT", pattern) } func (r *Routes) DELETE(pattern string) {   r.addRoute("DELETE", pattern) } func main() {   r:=new(Routes)   r.GET("/user/:user")   r.PUT("/add/:user")   r.PO

go 공부 - struct에 대하여

routing module 을 만들기 위해 객체를 작성해야겠다는 생각이 들어 struct와 function을 보고 있다. 아무래도 나온지 2년이나 되었지만 인지도가 약해서인지 제대로 돌아가는 소스가 적다. 직접 해보고 오류 메시지를 보면서 학습할 수 밖에. go는 javascript 처럼 functional하기도 하고 prototypal 한 특성을 가지고 있다. function 을 이용하는 법을 보고 있는데 얼추 비슷하게 쓸 수 있겠다. http://golang.org/doc/ExpressivenessOfGo.pdf  중 21page 를 보면서 소스를 타이핑 해본다. 소스보기 package main import (   "fmt"   "math" ) type Point struct { x, y float64 } func (p Point) Abs() float64 {   return math.Sqrt(p.x*p.x + p.y*p.y) } func main() {   p:=Point{3,4}   fmt.Printf("%f", p.Abs()) } 객체를 생성할땐 pascal 타입의 선언자 := 를 써서 쓸 수도 있고 다른 언어들처럼 new를 써서 main부분을 바꿔보면. func main() {   p:=new(Point)   p.x = 3   p.y = 4   fmt.Printf("%f", p.Abs()) } 이런식으로 초기화 할 수도 있다. 아마도 javascript 로 쓰면 아래와 같을 것이다. var Point = function(arg) {   var x;   var y;   x=arg.x;   y=arg.y;   return {     Abs : function() {       return Math.sqrt(x*x,y*y);     }   } } var p = new Point({x:3,y

go용 routing module을 만들고 있다.

ror/sinatra 나 express.js 처럼 우아한 routing쓰고 싶은데 연습삼아 만들어보자는 생각에 서툰 코딩을 시작 /user/:userid 인 경우 \/user\/([^\/]+)\/? 이런 식으로 우아하게 정규식 치환을 했으면 했는데 string 패키지도 좀 볼겸. 단순하게 문자열 조작+뺑뺑이로 구현했다. https://gist.github.com/1827639 package main import "fmt" import "strings" var routes = [] string {    "/user/:id/friends/:friendsId" ,    "/scrapbook/:scrapbookid/scrap/:scrapid" ,    "/" } func getParams ( url string ) map [ string ] string {    for idx , _ := range routes {      format := routes [ idx ]      urlToken := strings . Split ( url , "/" )      formatToken := strings . Split ( format , "/" )      /* match pattern */      if len ( urlToken )== len ( formatToken ) && len ( formatToken )> 0 {        params := make ( map [ string ] string )        match := true        for i , v := range formatToken {          if len ( v )> 0 &&