기본 콘텐츠로 건너뛰기

Cordova(구 phonegap)로 android 앱을 만들 때 GPS 정보를 잘 못 받아온다면.

어떤 폰에선 되고 어떤 폰에선 안되고 되다가도 안되고 하도 현상이 여러가지라서 거의 2주동안 붙잡고 씨름했는데 허무한 결말. navigator.geolocation.getCurrentPosition(success, failure, option); 에서 option에 {   timeout: 10000 } 만 줘서 하니 잘 된다. iOS는 뭐 아무렇게나 해도 잘되는데 Android에선 enableHighAccuracy : true 옵션을 주면 안된다. 나머지는 config.xml에     <feature name="Geolocation">         <param name="android-package" value="org.apache.cordova.geolocation.GeoBroker" />     </feature> 이런게 있는지 platforms/android/AndroidManifest.xml에 가 있는지 ....     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />     <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" /> 권한이 잘 들어갔는지 정도만 신경 써주면 된다.

Meteor를 client만 사용하기 - Offline Meteor

'뭔소리야 서버부터 클라이언트까지 하나의 언어 하나의 자료형을 쓰는게 Meteor의 장점인데 왜 서버를 분리해?' 라며 당연하고 올바른 생각을 가지고 계신 분이라면 '뒤로 가기' 추천합니다. ^^;;; Meteor는 좋은데 서버가 자바야, PHP야. 혹은 Cordova(구 phonegap)이나 Chrome Apps같은 분야에 적용하고 싶은데 Meteor로 하고 싶어라고 생각하신다면 추천. Meteor 프로젝트를 meteor create <...> 로 생성하셨다면 Meteor는 run을 한 시점부터 .meteor/local/build/programs/client 에 클라이언트 쪽 파일들을 생성합니다. 이걸 고대로 떠서 약간의 작업을 하면 서버와 상관없이 사용할 수 있는데. app.html 의 ##HASH## 들을 삭제한다. __meteor_runtime_config__ 을 추가하여 ROOT_URL을 지정한다. (보통은 localhost) package등에서 사용하는 정적 자원에 대한 경로를 수정한다. 8000포트에 할 경우 .html 파일에 아래와 같은 부분을 ##RUNTIME_CONFIG## 있는 곳에 바꿔 넣어줍니다.   __meteor_runtime_config__={   ROOT_URL = "http://localhost:8000"   } 정도가 되겠습니다. 의외로 어렵지 않죠? 근데 실제로 해보면 신경쓸 것들이 좀 있습니다. 제 경우는 디렉토리 구조를 이렇게 잡았습니다. 생성한 과정은 이렇습니다. $ mkdir pack $ cd pack $ meteor create memo $ mkdir www $ cd memo 여기까지 하고 client 쪽 코드를 약간 수정합니다. Meteor는 기본적으로 클라이언트 vs 서버간 websocket통신을 하고 있기 때문에 관련 그 부분을 hack해서 못쓰게 ...

android(armv7)에 node.js 올리기. (Rockchip RK3188/MK809C)

http://masashi-k.blogspot.kr/2013/08/nodejs-on-android.html 이쪽 글을 참조했다. 환경은 일단 RK3188 계열인 MK809C로 시도해보았다. 먼저 루팅이 되어있고 Linux Installer나 Debian Tool kit등으로 리눅스를 설치했고 터미널 클라이언트나 SSH를 통해 접근 가능한 상태라고 가정한다. 현재 node.js의 안정(stable) 버전은 v0.10.23이므로 해당 소스를 다운받자. http://nodejs.org/download/ 에 들어가서 http://nodejs.org/dist/v0.10.23/node-v0.10.23.tar.gz 직접 소스를 받으면 된다. $ wget  http://nodejs.org/dist/v0.10.23/node-v0.10.23.tar.gz 으로 받자. $ tar xzf node-v0.10.23.tar.gz $ cd node-v0.10.23 해서 빌드 준비를 하자. $ ./configure --without-snapshot --dest-cpu=arm --dest-os=linux 로 먼저 빌드 환경을 잡고 바로 make 하기전에 thumb inter-working 관련 오류를 피하기 위해 macro-assembler-arm.cc 파일의 일부를 수정한다. 압축푼 경로를 기준으로 vi ./deps/v8/src/arm/macro-assembler-arm.cc 파일을 열어 60라인 근처를 수정하자. #if defined(USE_THUMB_INTERWORK) && !defined(CAN_USE_THUMB_INSTRUCTIONS) # error "For thumb inter-working we require an architecture which supports blx" #endif 아마 이런 부분이 있을 것이다. # error 부분 줄을 삭제하거나 // 처리 하자. ( http://...

Multiple pub/sub collection in meteor

iron Router를 잘 쓰고 있는데 쓰다 보니 이상한 점이 있다. 페이지별로 subscribe 하는 것까지는 좋지만 당연히 여러 개의 page에 대해 subscribe를 해야 하는데 waitOn 같은 곳에서 여러 개의 collection에 대해 subscribe를 하다 보니 N번 화면을 갱신하기도 하고 코드도 좀 번거롭다. 여러 개의 Collection에 대한 pub/sub을 한 번에 할 수 없을까 생각하고 있었는데 https://github.com/meteor/meteor/pull/716 최근 내용을 보니까 구현이 되어있다! 이것도 undocumented라고 해야 하나 싶다. 아무튼, 좋다. Posts, Replies 두 개의 Collection이 있다고 할 때 autopublish package를 meteor(혹은 mrt) remove autopublish하여 삭제하고 수동 가입을 구현한다면 /model/model.coffee @Posts = new Meteor.Collection "posts" @Replies = new Meteor.Collection "replies" /client/subscribe.coffee Meteor.subscribe 'posts-replies' /server/publish.coffee Meteor.publish 'posts', ->   [Posts.find(), Replies.find()] 이렇게 [ ] 배열 형태로 묶어만 주면 된다. 좋은 패치라고 생각한다. 적극적으로 활용하자.

iron-router에서 /#/(hashbang) 을 사용할때 주의점( ex. verify-email등)

iron-router 적응 중인데 역시 대세다. 최근 server-side도 반영되어 구 router package에서 안심하고 넘어와도 되겠다 싶었다. E-mail 인증( http://spectrumdig.blogspot.kr/2013/10/meteor-e-mail.html )을 구현해 놓았는데 이게 실제로 해보니까 iron-router 에선 제대로 되지 않는다. 찾아보니 Server 쪽에서 해당 URL이 들어올때 패치하는 방법이 있다. https://github.com/EventedMind/iron-router/issues/3#issuecomment-20917649 Server 아래 Route 관련 부분에 Accounts.urls.resetPassword = (token) ->   Meteor.absoluteUrl "reset-password/#{token}" Accounts.urls.verifyEmail = (token) ->   Meteor.absoluteUrl "verify-email/#{token}" Accounts.urls.enrollAccount = (token) ->   Meteor.absoluteUrl "enroll-account/#{token}" 이런 식으로 넣어주면 된다.

meteor에서 특정 조건에서 head를 조작하기

server/header.js 식으로 server에서만 작동하는 코드를 만들자. Fiber = Npm.require("fibers"); WebApp.connectHandlers.use(function(req, res, next) { if (req.url==='/connect') { res.writeHead(200, {'Content-Type': 'text/html'}); Fiber(function() { res.write('<html>') res.write('<head>'); res.write('<meta property="qc:admins" content="2311172222411526554572637573766534" />'); res.write('<head>'); res.write('<body></body>'); res.write('</html>') res.end(); }).run(); } else { next(); } }); 위 코드는 weiyun 인증의 경우인데 <meta property="qc:admins" ... 를 사이트에서 요구하는 경우이다. 이런 식으로 meta를 요구하는 경우가 종종 있는데 아마 구글 서비스 중에도 있을 듯. 사이트 도구? 아마 그럴 것이다. 저번에도 이야기 했지만 WebApp.connectHandlers 요거 좋은 놈이다. 서버쪽에서 특정 url로 들어왔을때 예외처리를 하고 싶다면 이걸 사용하면 된다. 예의 경우는 /connect 로 들어왔을 때만 예외처리를 하고 나머지는 그냥 next()로 넘겼다. ...

SoX Library 컴파일하기(for OS X)

./osxbuild 실행 오류 $ ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)" $ brew install automake 재시도 $ ./osxbuild configure.ac:21: installing './compile' configure.ac:10: installing './config.guess' configure.ac:10: installing './config.sub' configure.ac:12: installing './install-sh' configure.ac:12: installing './missing' libgsm/Makefile.am:35: error: Libtool library used but 'LIBTOOL' is undefined libgsm/Makefile.am:35:   The usual way to define 'LIBTOOL' is to add 'LT_INIT' libgsm/Makefile.am:35:   to 'configure.ac' and run 'aclocal' and 'autoconf' again. libgsm/Makefile.am:35:   If 'LT_INIT' is in 'configure.ac', make sure libgsm/Makefile.am:35:   its definition is in aclocal's search path. libgsm/Makefile.am: installing './depcomp' lpc10/Makefile.am:8: error: Libtool library used but 'LIBTOOL' is undefined ...