顯示具有 筆記 標籤的文章。 顯示所有文章
顯示具有 筆記 標籤的文章。 顯示所有文章

2013年8月21日 星期三

[筆記] Google Drive API兩三事: App data, 靜態網頁連結

颱風天, 適合寫點東西, 所以就把上次的PinterestRSSAggregator加上發佈到Google Drive功能, 第一次碰Google drive api, 不過還好Google已經有了一個node.js的module: https://github.com/google/google-api-nodejs-client,省去了重刻Google API的功(這module還頗有趣的, 利用了Google discovery API, 支援了相當多Google API, 但實際上各API的細節的實作卻不在這module之中), 不過一開始還是在Google drive上碰到了一些問題:
  1. 想說要存個設定檔, 但檔案如果可以被使用者看到, 就會有機會被他砍了
  2. 因為是要發佈rss檔, 所以最好可以有一靜態連結
  3. Google drive是允許在同一目錄有同名的檔案的, 這似乎跟Dropbox不一樣, 它真正獨一無二的識別是id不是檔名, 所以要更新某個檔案還得先找到它的id, 有點小麻煩
第一項的解法還蠻簡單, 只要使用app data就好, 這目錄比較單純, 它的id就叫做"appdata"(真是夠怪了, 這個id是固定的, 但使用者的根目錄的id卻不是, 還得先用about去取得), 我用它實作了一個放設定的(參考這, AppConfig), 放在這目錄的好處是不會被使用者看到並刪除掉, 但要注意的一點是, 取得auth token時所做的認證用的scope必須包含"https://www.googleapis.com/auth/drive.appdata"

至於第二項的作法就是建立一個public folder, 並取得這目錄的webViewLink, 比如說是"https://www.googledrive.com/host/0B5rbRldWhe82WjhURVdkSzUxTjA/", 這樣你在這目錄下建的檔案, 例如 julianshen.rss 就可以用 "https://www.googledrive.com/host/0B5rbRldWhe82WjhURVdkSzUxTjA/julianshen.rss" 這連結來存取

2013年2月9日 星期六

讓Eclipse支援Retina Display

前陣子買了一台Retina display的mac book pro, 興沖沖的把一切都設定好後, 正很滿足的想要用這漂亮的畫面開始工作時, 一打開Eclipse後, 一整個傻眼, 字變糊變鋸齒, 看來Eclipse對Retina display並沒有很好的支援, 查詢過各方資料後, 所幸還有救(不然就想投奔到別的IDE去了)

1. 找到Eclipse, 在上面按右鍵選"顯示套件內容"

2. 找到Info.plist, 用Xcode開啟


3. 新增一個"High Resolution Capable", 並將其設成"YES"


2013年1月22日 星期二

[Android][筆記] BitmapShader

http://www.curious-creature.org/2012/12/11/android-recipe-1-image-with-rounded-corners/
這篇文章裡面使用到了BitmapShader做圓角的效果, 使用這方法, 如果drawRect的大小比原先大的話, 會根據Shader.TileMode來畫出不同的效果:

Shader.TileMode.CLAMP (效果: 尾端拉長) --

Shader.TileMode.MIRROR (效果: 鏡射) --

(畫面是我的小作業 - iTunes U for Android)










 

2012年9月2日 星期日

[筆記] 2012 9月第一週

這禮拜想到的東西真有點雜, 標題只好隨便下, 本來這週給自己要求的進度應該要再多一點, 結果最後只為了node for Android加了Android log的機制

node for Android

這週本來預定的目標是串接上NativeActivity, 不過, 沒做到, 需要多花點時間想切入點:
  1. pass "struct android_app *" to Node (從android_main呼叫新的node::Start)
  2. wrap "struct android_app *" (是否要依附在process object? 參考資料: node_object_wrap.h, v8::Object::SetPointerInInternalField)
  3. Design of callbacks for AppCmd, InputEvent (NativeActivity --> Node)
這邊有點頭痛, 要找到一個比較好的切入點設計一個新的架構給NativeActivity, 不過這邊又回頭想了一個問題, 到底Node適不適合UI programming, 還是當做一個server, 掛到一個Android service會比較適合?

adding native module to Node:
為了練習這部份, 把android log的機制加進去, 完成後可以在js裡用下面這樣叫用Android log
require('android');
alog.d('tag', 'message1'); //debug log
alog.e('tag', 'var a=', a, ' found', 1, 'error'); //error log
由這code看, 主要有兩個部分, 一個是一個名為android的module, 一個是alog這個global object (Node本身已有"log", 為避免衝突, 改名為alog)

新增module的參考資料為: http://nodejs.org/api/addons.html#addons_hello_world , 不過, 這邊加的不是addon而是一個native module, 所以有點不同, 首先為了這個module新增了, node_android.cc (class Android), 名字一定要是"node_"開頭 , 這是由於binding時, 會尋找"node_"開頭的module (參考 node_extensions.cc : get_builtin_module), 這邊主要implement的是用"NODE_SET_METHOD"加入新的method "log", 用"NODE_DEFINE_CONSTANT"映射了幾個log level的常數, 最後用"NODE_MODULE"定義module的init method
Source code: https://github.com/julianshen/node-android/blob/master/jni/node-v0.8.8/android/node_android.cc
不過這樣不夠, 因為我要的不是只有"log", 而是要像"alog.d"這樣的東西, 因此又多了一個android.js來處理:
 
var binding = process.binding('android');
function log(level, args) {
    var tag = args[0];
    var len = args.length;
    var objs = [];
    for(var i = 1; i < len; i++) {
       objs.push(args[i]);
    }
    var msg = objs.join(' ');
    binding.log(level, tag, msg);
}
var alog = {
    v: function() {
        log(binding.ANDROID_LOG_VERBOSE, arguments);
    },
    d: function() {
        log(binding.ANDROID_LOG_DEBUG, arguments);
    },
    i: function() {
        log(binding.ANDROID_LOG_INFO, arguments);
    },
    w: function() {
        log(binding.ANDROID_LOG_WARN, arguments);
    },
    e: function() {
        log(binding.ANDROID_LOG_ERROR, arguments);
    }
};
global.alog = alog;



首先用了process.binding來bind剛剛native的部份, 另為就是把alog變成global object


其他TODO

Idea board, Bluetooth OPP....還沒想fb world hack做啥好