This is to test my own blog
header 1
header 2
console.log("111")
test test
Header1
Header2
Header3
from Le murmure de Julian http://ift.tt/1UW76yv
via IFTTT
This is to test my own blog
console.log("111")
test test
This is to test my own blog
console.log("111")
test test
收到了一個IE 10會看不到圖片的bug, 昨天看了半天, 本以為在IE10沒正確載入遠端的資料(後來覺得我怎會蠢到這麼想), debug了半天(IE 10也沒很好的tool), 結果後來發現完全不是這麼一回事, 原本的code是這樣的:
<div style="background-image: url({{mydata.getImageUrl()}})"></div>
一開始也沒想到這邊, 看起來都沒問題, 但後來下面這樣的並沒問題:
<img src="{{mydata.getImageUrl()}}"/>
才發現原來AngularJS在IE10底下, 在style裡用{{變數}}會有問題, 解決的方法是要改用ng-style, 例如
<div ng-style="mydata.backgroundStyle()"></div>
而這裡的backgroundStyle是這樣的(不是string喔)
backgroundStyle = function() {
return {
backgroundImage: this.getImageUrl()
}
}
著名的工具軟體Clean Master有一項遊戲加速的功能, 它會放一個捷徑在桌面上, 而它的長得就像是跟資料夾一樣:
之前沒仔細去看它, 一直以為它是個小工具(AppWidget), 但其實它只是個捷徑而已, 點選它會跳出一個透明背景的對話窗, 所以很容易誤以為是桌面上的資料夾(如圖右)
這用了個小技巧, 雖然有點唬人, 但其實不難, 以下就如法炮製一個類似的吧!
在這實驗, 就把Youtube, Google plus, Google map三個app的圖示放一起, 邊框, 麻煩就先省略
利用”com.android.launcher.action.INSTALL_SHORTCUT”這個Intent可以在桌面上創建捷徑, 應該幾乎所有的桌面軟體都有支援, 關鍵點在於這Intent裡會帶的Intent.EXTRA_SHORTCUT_ICON, 這可以帶一個Bitmap來當作這個捷徑的圖示, 沒意外的, 就是從這邊動手
因為我們需要把四個圖示畫到一個上面, 所以每個圖示變成原本的1/4, 因此, 在用BitmapFactory.decodeResource載入圖示時, 可以把sample size設成2(也就是1/4大小), 這樣可以減少一些記憶體的使用, 取得了圖示後就可以把它們畫到另一個新的Bitmap了
要注意的是, 要用INSTALL_SHORTCUT的話, 要在AndroidManifest.xml裡加上:
<uses-permission android:name=”com.android.launcher.permission.INSTALL_SHORTCUT” />
這方法的缺點是, 一旦捷徑被創建好後, 就沒機會改它的圖示了
認真說的話, 這也算不上啥非官方API, 算是一個為了抓取Play store上資訊的一個小小工具: PlaystoreUtil
現在很多網路的服務, 大多有提供開放的REST API來供人寫原生的程式使用, 當然也有非常多並沒有, 像是Play store, 目前就沒開放的API可供存取, 剛好想要有個東西可以查詢某個app在play store上是屬於啥分類的, 所以就乾脆自己自製一個囉…
現在的網頁, 大多結構性很好, 所以就算沒有REST API, 其實也不難處理, 搭配上 jsoup , 可以說輕而易舉
jsoup是一個可以用css selector來解析html的Java函式庫, 有了這個, 解析html可以不用辛苦的爬dom tree, 只要幾行簡單的程式即可:
Document doc = Jsoup.connect("http://example.com/").get;
Elements links = doc.select("a[href]"); // a with href
Elements pngs = doc.select("img[src$=.png]");
再來看看play store
先看看每個app的資訊畫面, 以Facebook為例, 它的url是 —
很明顯的, id後面是package name, 另外如果加上”&hl=”可以指定語言, 然後再看到頁面上:
在Facebook (公司名稱)下方有個分類, 可以使用Chrome的開發人員工具(我比較習慣這個), 找到這個連結的css class名稱是”document-subtitle category”,而名稱則在它底下的一個span, 這span有個屬性itemprop, 值是genre
因此, 透過以下這段code就可以取到類別名稱囉
Document doc = Jsoup.connect("http://ift.tt/OQdlpn" + packageName + "&hl=" + locale.getISO3Language()).get();
Elements elements = doc.select("span[itemprop=genre]");
當然, 這方法不只適用於play store, 其他網頁也可以嘗試用這個方法來取得資料
詳細的範例在: http://ift.tt/1oNXmMj
過完年, 趁著轉換工作的空檔, 去了新加坡玩, 也順便去了馬來西亞的樂高樂園(Lego Land)
這樂園算是蠻新的, 2012年的九月才開幕的, 至今也不過一年多, 地點蠻偏僻的, 但從新加坡搭巴士過去(我們是搭WTS的車, 門票也是透過他們買的)大約一小時吧, 中途要出入海關(新加坡, 馬來西亞)
論設施來說, 這樂園可能有點不及其他著名的主題樂園, 玩樂的設施比較偏年紀小的小朋友, 但對樂高迷來說, 也算是一個天堂
這邊隨處可見樂高拼成的人物, 建築, 尤其是在中間miniland的建築, 相當的逼真
像這棟馬來西亞的KLCC, 拍起來的照片真的很像如臨現場, 感覺不出來這是一片片樂高堆積起來的作品
不過這邊的缺點是, 販賣店賣得樂高其實價格偏高, 不太適合樂高迷來這掃貨
Spark.function()這函數的作用在於對應core上的函數以及自定的REST API:
Spark core跟一般Arduino不同, 它並沒有一個在PC上的IDE供你寫及編譯程式, 這動作完全是在雲端, 開發者在Web IDE上攥寫程式, 之後server會去編譯並下載firmware到Spark core端執行
明明電腦跟Spark core都在眼前, 但程式卻不是在眼前編譯反而繞了一段路從Spark cloud下來, 感覺是有點多此一舉, 但其實Spark cloud的功能不僅於此, 它還提供了一個叫TINKER的服務
TINKER分為兩部分, 一個是手機上的TINKER APP
這App的用途就是讓你可以在不用寫任何一行程式的情況下, 就可以測試你的Spark core, 它背後的作法就是發送REST API, 也就是另一部分, 所謂的TINKER API, 到Spark cloud上, Spark cloud在把對應的命令轉到core上面, 由於core設定只要一打開就會連上網連到Spark cloud上, 因此可以用如此的方式控制它
因為可以透過TINKER API來控制core, 加上TINKER API也是公開的REST API, 因此, 我們未必要用Arduino的程式寫法來控制core, 我們也可以透過TINKER API用自己想用的程式語言來做開發
以以下的閃爍LED當做例子:
以傳統Arduino的寫法, 這樣一個程式(這範例應該老到掉牙了), 應該是這樣的:
跟C有點像, 當然啦,你不用期待它有啥多執行緒(Multiple threading), 或是啥事件驅動(event driven)等等東西可以用啦, 基本上它也是編譯好跑在Spark core上, core並沒有強大的運算能力跟複雜的硬體可以搞這麼複雜的東西, 有一點要注意的是, 這樣一個程式從Spark cloud燒錄到core去, 原本的TINKER就會被取代而失效, 必須由TINKER APP重新燒錄
至於說到TINKER API, 由於是REST API, 因此你可以用你習慣的語言去包裝, 不管是java, javascript, 或是go也好, 包裝它相當容易, 基本上目前也只有四個API: digitalwrite, digitalread, analogread, analogwrite
我包裝了Node.js跟Go可以使用的版本, 需要的人可以直接取用:
如果改用了Node.js或是Go, 那這個閃爍程式該如何寫?
Node.js:
這邊就可以把原本用"delay"的方式改用javascript中的setTimeout來實作
Go:
Go這邊則就是用了Tick
Access token跟device ID其實是可以去你的Web IDE上查到的
透過TINKER API, 這樣程式就不用一定得要"on board"去執行, 而且使用的程式語言也不會有侷限, 但缺點是, 首先要考慮到網路所造成的時間差問題, 另一個問題是, 現在提供的API像是digitalread這樣的API都非常的基本, 如果所有程式全部放在遠端, 遠端程式就必須要很頻繁的透過Spark cloud來發號司令, 如果連上Spark cloud的core越多, Spark cloud的負擔就相當可觀, 如果能提供custom command或custom api的方式, 把部分常態的邏輯變成在core端執行的內儲程序被呼叫, 或許可以減輕些Spark cloud的負擔
Android library project是為了解決Android開發中在不同專案間分享原始碼以及資源檔(resource)而出現的, 傳統的jar並未考慮資源檔的問題, 因此便需要靠Android library project來解決
目前, Android library project已經被廣泛運用, 舉凡ActionbarSherlock, Facebook Android SDK, 很多都已採用這形式
不過現在一般用法還是比較廣泛應用在跟UI相關這類的應用上, 這也合理, 這類的應用常需要包含原始碼和資源檔, 不過它也適合在其他應用上, 舉個例子(好吧, 這例子有點不清不楚), 我們也有可能需要讓所有使用某個library project的應用程式自動加上一個Intent Receiver, 假設這receiver實作上是固定的, 並不需要使用的應用程式自行去繼承, 或是, 我們希望某個Activity的實作是被連結到各個應用程式中, 這類應用使用Android library project也是可以辦到的
這類的應用, 通常還需要在AndroidManifest裡宣告, 除了receiver, activity, 也有可能加上一些service, 甚至是permission, 正常來說, 在建置使用了Android library project的專案時, library project裡的AndroidManifest的內容並不會合併到最後的AndroidManifest裡, 以致於, 雖然在library project內這些都被宣告了, 但成品內可能無法被使用, 這解法也很單純, 只要在應用程式(不是library project)的project.properties裡加上:
manifestmerger.enabled = true
Manifest merger似乎存在有一段時間了, 但似乎也沒看到啥正式的官方文件, 不過目前這方法是可行的就是了
想說最近有電影,宣傳的好像不錯一樣,就先來看一下小說,兩天內就拼完了三集,這還後面還有六集呀….
看完三集後,老實說不會想再看下去了,所謂的奇幻不過就是搞個吸血鬼狼人,闇影獵人之類的老梗外,沒啥太大的想像空間,扣除這些後就是…..灑夠狗血囉…..隱瞞,欺騙,背叛,三角習題,愛上的人結果是親妹妹(哥哥)想不出還有沒再多比這些更狗血的老梗了
天呀,我居然還看完三集!