目前分類:資訊電腦 (121)

瀏覽方式: 標題列表 簡短摘要
第七個,除了 online, offline 以外,還可以繫結 resume, pause 來處理 app 切到背景、前景的情況。resume 時需要針對 phonegap 是否已經 ready 來處理。

第八個,GPS。Phonegap 在 navigator.geolocation 提供 getCurrentPosition, watchPosition, 與 clearWatch 來處理。顯示地圖的話,就是嵌入 Google map API,我想或許也可以用 OpenStreet Map API 或是 Bing Map API 才是。getCurrentPosition 的用法是以 callback 形式,也就是需要帶一個函式進去,在取得位置以後,會把位置帶到函式裡面去。watchPosition 跟 clearWatch 則沒提到,到時候再參考 PhoneGap Documentation
這邊有特別提到當 navigate 到 map.html 時,window.onload 會失效的問題,這是因為 jqMobile 的關係,所以要繫結 pageload 到 onMapLoad 。

第九個,Compass。PhoneGap 是提供 navigator.compass 物件,此物件則有 getCurrentHeading 跟 watchHeading 可用。為了範例,作者引入了 jQuery Rotate plugin。

第十個,accelerometer。相似的方法,在 navigator 提供了 accelerometer 物件,物件提供了 getCurrentAcceleration 跟 watchAcceleration。這邊的例子用到了 Canvas。

第十一個,顯示表格,這邊就是 jqmobile 的領域了,ul tag 加上 data-role="listview" 就可以。

第十二個跟第十三個,都是運用 navigator.contacts 。在組頁面的地方,我想應該可以搭配 jQuery Template 、knockout.jsBackbone 之類的 js library/framework 來輔助。(knockout+phonegap+jqmobile的例子)

更多有關 20 Recipes for Programming PhoneGap 的事情

文章標籤

elleryq 發表在 痞客邦 留言(0) 人氣()

第一個是 deviceready event。

第二個是 PhoneGap 有提供一個 device 的公用變數,可以用來查看目前裝置資訊。

第三個就是建議用 jqmobile。補充資料:Creating Mobile Apps With KnockOutJS, PhoneGap & jQuery Mobile

第四個是如何偵測網路是否暢通,主要就是用 navigator.network.connection.type。例子裡是這樣用:navigator.network.connection.type != Connection.NONE,另外一個例子則有介紹怎麼判斷現在是 3G 還 2G。

第五個是監聽網路狀態,作者提到這個,我還真的愣了一下,JavaScript 既沒有 thread,用 setTimeout 又顯得很笨,所以 PhoneGap 有為 DOM 增加 event listener。一個是 online,一個是 offline,程式大致是這樣:document.addEventListener("online", onOnline, false);

作者在這些範例裡都有特別提到 Blackberry 的限制,這時候真的就只能用 setTimeout 來解了。

第六個主要是講頁面的切換,頁面切換的時候,依照 jqmobile 的方法,就不一定會觸發 deviceready 了,這時候就要利用一些額外的判斷,才能處理。作者是利用一個 currentUrl 的變數來做判斷與處理,要耐心看。

補充:我誤解第六個的意思了,作者是想要共用 js,畢竟 deviceready 每個頁面都要再處理一次,還真的是很麻煩。這個 js 他命名為 common,每個頁面都含括這個 common.js。那麼在 index.html 時,就去觸發 onIndexLoad;在 about.html 時,就觸發 onAboutLoad,才會利用 currentUrl 的判斷來決定要觸發哪個事件。

更多有關 20 Recipes for Programming PhoneGap 的事情
文章標籤

elleryq 發表在 痞客邦 留言(0) 人氣()

閱畢日期:2013/3/14

PacktPub 出的 Instant 系列書籍,都不厚,算是簡單的入門書。

這次看的是 PhoneGap Social App Development,PhoneGap 用的是 2.2 版,目前最新已經是 2.5 版了。
因為 PhoneGap 已經收歸 Apache,專案代號命名為 Cordova,之後有看到 Cordova 時,就自行腦補為 PhoneGap 即可。

書是以 twitter 為例,然後試圖能同時在 iOS 跟 Android 上用,所以 index.html 有分為 index.html 跟 android_index.html,也有跟 iOS 相關的部分。
作者很正統的先以 Wireframe 規劃出畫面以及大致流程,定義出畫面各元件所要做的事情,接著定義資料模型。
接著就是介紹 ChildBrowser 以及 YASMF 等 plugin、framework 的使用。

這本小書還蠻實用的,不過照著做時,常需要翻前找後,可能是因為版本跟現在不太一樣。而且作者是打算橫跨 Android/iOS,步驟是兩個都有囊括的,我忽略掉 iOS 部分,所以才遺漏的吧。

更多有關 Phonegap Social App Development 的事情


文章標籤

elleryq 發表在 痞客邦 留言(0) 人氣()

這一章開始介紹基礎元件了。

AppBar 主要是當按下滑鼠右鍵或是由下往上時出現在螢幕下方。用的方法就是在 HTML 裡增加一個 div,id 屬性設為 appBar,data-win-control 屬性設為 WinJS.UI.AppBar 。裡面的按鈕,則是用 button tag,其 data-win-control 屬性為 WinJS.UI.AppBarCommand,要提供預設屬性設置的話,就用 data-win-options 屬性,屬性內容則是 json 格式的字串。
大致像是這樣子:
<div id="appBar" data-win-control="WinJS.UI.AppBar">
<button data-win-control="WinJS.UI.AppBarCommand" data-win-options="{section: 'global', label: 'New Item', icon: 'add'}">
</button>
</div>

AppBar 因為會被許多 HTML 畫面引用到,所以可以寫在獨立的 HTML 裡,然後使用 HtmlControl 來引用,像這樣:
<div data-win-control="WinJS.UI.HtmlControl" data-win-options="{uri: '/html/appbar.html'}"></div>
作者把這種獨立的 HTML 畫面叫做 HTML fragment。

從上面,可以了解到 WinJS 利用 data-win-control 跟 data-win-options 來做一些事情。程式碼不能寫在 appbar 所在的 HTML 裡,要放在共用的 js 裡,像作者是寫在 default.js,正好每個 HTML 畫面都會用到。除此之外,作者也用一個 namespace 來切開。

Flyout 有點像是 pop dialog,一樣是 div tag,data-win-control 是 WinJS.UI.Flyout。裡面用的 tag 就是標準的 form tags,像 label、input、button 之類的。要讓按鈕叫出這個 flyout,AppBarCommand 按鈕的 data-win-options 裡要加一個 flyout 項目,內容填 flyout 的 id 即可。雖然是填 id,但可以放在跟 AppBar 不同的 HTML fragment 裡。程式的話,就是去操作 DOM element,真正的資料存取則是透過 ViewModel 來做。

Page 是 HtmlControl 的進化版,HtmlControl 能控制的事情很少,Page 可以在頁面載入完成時去執行一些事情。大致的做法跟前面都很類似,但 Page 需要寫的 JavaScript 代碼會比較多一點,頁面跟頁面間的切換是用 WinJS.UI.Pages.render()。

一樣可以用 iframe 來顯示額外的頁面,也可以加上 ready() 的事件做一些處理。

最後提到 package.appmanifest,這邊可以定義 permission,表示 app 會使用到哪些 permission。這一章的程式碼不多,因為沒有跟著實作,僅大致摘錄一下看過的部分。

更多有關 Metro Revealed: Building Windows 8 Apps with HTML5 and JavaScript 的事情
文章標籤

elleryq 發表在 痞客邦 留言(0) 人氣()

主要是在用了 Windows 8 以後,想瞭解 App 怎麼開發,所以就來翻一翻,主要是想快速的瞭解,就不仔細翻閱了。

第一章主要是介紹,沒有告訴你該安裝什麼。我查了一下,就是要裝 Visual Studio 2012 就對了,練習的話,可以下載 Visual studio express 2012 for Windows 8。這本書主要是用 HTML5 + JavaScript + CSS 來寫,所以第一章的後面列出一個空專案的代碼。

第2章就開始寫 code,這一章主要是介紹 UI 與資料的結合。Metro 主要的框架就是走 MVC 或 MVVC,HTML 就是 View,那 JavaScript 就是用來寫 Model 跟 Controller 的。針對 JavaScript 的部分,微軟提出 WinJS.Namespace 來解決 namespace pollution 的問題。然後 HTML 裡 script tag 的順序很重要,default.js 就是放在最後就對了。資料最好都用 WinJS.Binding.as() 或 WinJS.Binding.List(),就是要 WinJS.Binding 開頭的,要不然可能會遇到 readonly 的情況。有寫過 Backbone / jQuery 的開發者對這個應該不會陌生,主要的差別就是很多功能都是要透過呼叫 WinJS 來完成,介面就是 HTML 跟 Template。另外也有導入 Promise Pattern 來解決 Async 的問題,以確保能順利執行 JavaScript 程式。

參考資料:

更多有關 Metro Revealed: Building Windows 8 Apps with HTML5 and JavaScript 的事情
文章標籤

elleryq 發表在 痞客邦 留言(0) 人氣()

這一章是 SL4A 的進階篇,會要擴充 Facades 以便存取 Media store,這剛巧是原來 SL4A 沒有的部分。(現在的版本不知道是否已經新增了?)

因為要擴充 Facades,當然就要先下載 SL4A 的原始碼。SL4A 原始碼的 repository 是用 mercurial,這邊就順便介紹了 Mercurial 與 Mercurial Eclipse plugin。

要建立一個新專案,這是依照前一章的介紹,拿 template project 來改。跟上一章有不一樣的地方是依存性,原本 template project 裡有一份 SL4A framework 的 library,這邊把依存性移除,改連結到剛剛 checkout 下來的 SL4A 原始碼專案(有好幾個)。接著再建立 MovieFacade 專案,同樣也是給 template project 使用。設定完成以後,就是開始寫 code:MovieFacade 的 code、JavaScript 的 code 跟 python 的 code。

自己編譯的好處是可以再去縮減 app 的大小,拿掉不必要的 library。但是感覺這樣做複雜度提高蠻多的,在除錯上可能也會搞死人。

Appendix A 提到測試的部分。介紹了各項術語跟可以使用的類別,然後是建立 UnitTest Project 的方法,要進行 UnitTest 測試時,是選 Run As > Android JUnit Test。除了 Unit Test 以外,也可以做 coverage 測試跟 Stress test (Monkey test,adb shell monkey -p package_name -v 500)。

更多有關 Android Apps with Eclipse 的事情
文章標籤

elleryq 發表在 痞客邦 留言(0) 人氣()


SL4A 主要有3個部分:Script Interpreters、Android RPC client 跟 Facades。Script Interpreters 就是語言的翻譯器,用來翻譯電腦語言。然後每個執行的 script 就是一個 RPC client ,會與 SL4A 的主體,也就是 RPC server 做連結、溝通。Facades 則是提供出來的 API,在 script 裡面只能呼叫這些 API 來控制手機。

SL4A 的安裝相當簡單,就是到 http://code.google.com/p/android-scripting/ 下載 apk,然後以 adb install 或是檔案總管點選該 apk 來安裝。安裝以後,你得再另外下載 interpreter 的 apk 才行,在 SL4A 的介面裡可以選。

要編寫 script,可以用互動主控台(Interactive console)或是編輯器(Script Editor),就我個人使用過的經驗,如果手機不夠快,在手機上面寫程式還蠻痛苦的,要查一些 API 也很麻煩。也可以在 PC 上編寫,然後以 adb push 把檔案放到 /sdcard/sl4a/scripts 下,再用 adb shell am start -a com.googlecode.android_scripting.action.LAUNCH_BACKGROUND_SCRIPT -n com.googlecode.android_scripting/.activity.ScriptingLayerServiceLauncher -e com.googlecode.android_scripting.extra.SCRIPT_PATH /sdcard/sl4a/scripts/your_script.py 來在背景執行該 script;前景執行的話,則改用 adb shell am start -a com.googlecode.android_scripting.action.LAUNCH_FOREGROUND_SCRIPT -n com.googlecode.android_scripting/.activity.ScriptingLayerServiceLauncher -e com.googlecode.android_scripting.extra.SCRIPT_PATH /sdcard/sl4a/scripts/your_script.py 。

另外一個方法是用 RPC,SL4A 預設不接受外來的連線,所以得要點選 "Start server",選 Public 或 Private 以後就啟動了,啟動以後,會有 icon 出現在 status bar (notification)上。接著,要做 port forwarding,因為 server 只 listen loopback device,所以要下 adb forward tcp:9999 tcp:51323 (51323 在下拉 status bar 以後可以看到)。以 python 為例,程式裡就得用 droid=android.Android(('localhost', 9999))。

使用者的介面可以用內建的 dialog API 去問,或者是 Android Layout XML,或者是 Web-Based UI,Web-Based UI 就是用 HTML+CSS+JavaScript,但這邊的處理還蠻麻煩的,HTML裡要寫 javascript,然後你的 script 要使用 while loop 去等使用者回應。

那,可以把這些包成 apk 嗎?這樣就不用讓使用者裝好幾個 apk。答案是可以,要先下載 http://android-scripting.googlecode.com/hg/android/script_for_android_template.zip ,匯入到 eclipse 以後,修改 package name,把 script 檔案放到 res/raw 路徑下,然後把 Script class 裡的 ID 改為 R.raw.your_script 就可以了。

更多有關 Android Apps with Eclipse 的事情
文章標籤

elleryq 發表在 痞客邦 留言(0) 人氣()

閱畢日期:2013/2/4

我個人覺得蠻跳 tone 的,開始介紹起 Malware 跟 Spyware,提到 app 有可能被下載來修改過以後,重新上傳到 market 上面,於是手機就被入侵了。

Case study #1:是一個透過 WAP push message 入侵的 Malware,當點擊訊息上的連結時,就會下載並要求安裝應用程式,安裝以後,手機就被入侵了。

Case study #2:Android app - FlexiSPY,可以做到捕捉 SMS/e-mail、log、提供 GPS 位置、竊聽、竊聽電話跟 SIM card 更換通知等等。作者針對這個 app 稍稍分析了裡面的運作手法跟流程。

至此,歷時約3個月,看完了這本書,對於開發比較有幫助的部分是在前面幾章,主要是側重於如何保護資料、觀念實作與登入的部分。

More about Android Apps Security
文章標籤

elleryq 發表在 痞客邦 留言(0) 人氣()

先介紹上架 Google Play 的申請步驟,然後告訴你,要上架收費,就要面對被人破解的可能。

接著就乾脆教你怎麼破解(反組譯)了,在下載 app 以後,這些 apk 可以在裝置上的 /data/app 下找到,要看這些 apk 並複製,只要下載 Android SDK,用 adb 就可以辦到。adb pull 拿到 apk 以後,就可以用 unzip/winzip 打開,apk 其實就只是個 zip 檔。解開以後,會看到 .dex 檔案,你可以用 smali/baksmali、dexdump(Android SDK 內建)、dedexerdex2jar搭配Java Decompiler 等工具來看人家寫的程式,修改以後再編譯放回去。

Android License Verification Library (現在看到的名字叫做 Google play Licensing library)是 Google 提供的 library ,可以讓開發者使用來保護自己的心血。使用這個 library 需要搭配 Google API,下載以後,會在 Google SDK 目錄下,使用前先把整個目錄 (<Android SDK>\extras\google\market_licensing\library) 複製出來。建立 Library Project ,Package Name 要命名為 com.android.vending.licensing,好了以後,要去 project properties 裡勾選 "Is Library",然後匯入剛剛複製出來的目錄,這樣就好了。

然後在 app 專案裡,去 project properties 找,選加入 Library Project,這個就是選剛剛建立的 Library。程式裡,最主要就是要去寫一個類別繼承 LicenseCheckerCallback ,然後用 LicenseChecker.checkAccess 帶 callback 類別去做檢查。

// 大致的程式碼
// Create an Obfuscator and a Policy
AESObfuscator obf = new AESObfuscator(SALT, getPackageName(), identity);
ServerManagedPolicy policy = new ServerManagedPolicy(ctx, obf);
// Create the LicenseChecker
LicenseChecker lCheck = new LicenseChecker(ctx, policy, PUB_KEY);
// Do the license check
lcb = new LicCallBack();
lCheck.checkAccess(lcb);

AndroidManifest.xml 要加上 <uses-permission android:name = "com.android.vending.CHECK_LICENSE">
程式上架以後,把 PUB_KEY 填到 https://market.android.com/publish/Home 網站上。

這樣做了以後還是有可能被破解,作者建議可以修改 LVL 的 source code ,這也是作者剛剛建議要複製出來的緣故。

最後是介紹 proguard,在 proguard.cfg 填寫要混淆哪些類別就可以,Android SDK 會負責整個過程。

最後的最後,作者整理該注意的事情以及步驟。

More about Android Apps Security


文章標籤

elleryq 發表在 痞客邦 留言(0) 人氣()

這一個章節以兩個例子來貫穿,第一個是 OAuth ,這邊以 OAuth 登入 picasa web album 來當作例子。第二個例子,是作者回顧第六章,以一個自己重新設計過的登入 (Challenge Response)來當作例子。Client 先送請求給 Server ,Server 回應一個 Challenge string - C,Client 產生一個亂數字串 R 跟剛剛的 C 與使用者密碼做 hash,Client 再把 R 跟 hash 傳給 Server ,Server 再去計算與驗證。

More about Android Apps Security

文章標籤

elleryq 發表在 痞客邦 留言(0) 人氣()


這一章是討論企業內部的,一般企業內的應用程式在開發 client-server 時,client 端程式往往會內嵌資料庫的敏感資訊,直接跟資料庫連線,作者在此舉了一個例子,說明這樣不好的原因。第一個不好的原因是嵌了敏感資訊,第二個不好的,是企業內部複雜的網路環境,有可能跨網段,或是牽扯到 VPN 等等的,這都會造成程式的困難。作者建議了,提供一個中間層會是一個比較好的解,這個中間層就是走 HTTP/HTTPS ,這樣就可以避掉 VPN ...等等的麻煩,再者,也可統一以 SSL 來加密。那中間層的格式就是用 XML 或 JSON ,這兩種格式在 Android 裡都有提供函式庫來幫忙解譯,不用另外找函式庫。

目前應該很少人直接連線到資料庫吧~

More about Android Apps Security
文章標籤

elleryq 發表在 痞客邦 留言(0) 人氣()

閱畢日期:2013/1/18

這本書算是資訊類書籍裡講少見的講人文、社會的書籍。作者想說的是可尋性對人類的重要性,探討了從網路開始以來的種種變化。我是因為有人提到這本書才去找來看的,不過,並不是很有興趣,所以看的速度很慢。

Ambient Findability

p.8 如果未能搭配有效使用資訊的能力,只有豐富的資訊本身,並無法建立消息更靈通的公民社會。

p.9 Make site findable

p.10 許多使用者並非從首頁開始瀏覽,有許多使用者永遠不會看到首頁

p.12 差勁的資訊架構、對 Web 標準的弱相容性、沒有 metadata、內容在資料庫裡

綜觀以上,網站開發應該注重使用者需要些什麼,並且加強可尋性與相容性,讓使用者能容易找到所需要的資訊。

p.17 提到 labyrinth 跟 maze 的不同,實際上常提到的 maze 裏面通常有 labyrinth 的成份在。

p.41 James Mark Baldwin 有機體要在生態的挑戰中存活下來,必須依靠培養出的知識和技巧(通常要透過學習),這可能導向物競天擇,為不需要即具有自發知識的有機體帶來優勢。這機制稱為鮑德曼效應,認為有機體可以學習形塑環境,終致改變演化路徑。


p.46 Calvin Mooers 如果顧客覺得擁有資訊比不擁有資訊更痛苦、更麻煩,那麼人們寧願不使用資訊檢索系統。

p.47 該把焦點從「建立豐富的資訊」轉移到「解決注意力貧乏」
反過來就是解決了注意力貧乏的問題,方能吸收資訊。

p.49 資訊由它對終端使用者的價值所定義。


p.51 資訊檢索起源於語言與意義的本質。核心是 relevance,適切的結果就是使用者感興趣且對使用者有用的結果。「精確度」和「涵蓋度」是基本的效用量測方式。


p.52 精確度=存取出的適切數量/總存取數量 涵蓋度=存取出的適切數量/總適切數量


p.59 最省事原則(Principle of Least Effort) 每個人都會採取的行動方針是少做一點事來把事情完成。


Marcia Bates 的 berrypicking 可以說是當代 Web 搜尋行為的基礎


後面因為還書時間快到了,幾乎是草草帶過,沒有記下什麼東西。

要買書可以到博客來網路書局

More about 隨意搜尋
文章標籤

elleryq 發表在 痞客邦 留言(0) 人氣()


一開始丟了一個關於登入的程式碼,問說你覺得這樣寫有什麼問題。

接著開始實作,首先是架設 Web server,作者直接拿 Google appengine 來當 Web Server,原因是方便架設、有限度的免費而且寫起來很快,這邊花了不少篇幅來介紹。
中間介紹了一小段關於 Web Service、REST的歷史以及 Web Application 架構,然後帶了一段 Android app + Web app 登入的範例。

介紹 OWASP 、2010 年的十大漏洞以及十大建議,前一陣子有去上過恆逸的的課程,有介紹到 2011 年的十大漏洞,這兩年的十大漏洞都差不多。

回頭介紹認證的機制,作者一直強調 SSL 很好,但不能全然相信,不管是 trusted CA 或是自己簽發的 CA,因為還是有所謂的 MitM 存在,所以作者又介紹了 MitM (其實跟維基百科上的很相似)。

在 OAuth 之前,如果網站要使用其他網站服務,勢必要在該網站提供帳號跟密碼,而這可能會有風險。OAuth 則是改為在要使用其他網站服務時,導向到服務提供者的網站去,讓使用者決定要不要提供服務給這個網站,允許的話,才可以。網站拿到的是一個 token,而非帳號跟密碼。這邊有一張 OAuth 整個過程的圖片,解釋的很清楚。

最後是介紹 Challenge/Response with Cryptography,這有點類似 OAuth,傳送的資料以密碼來加密,相關的範例會在第八章出現。

More about Android Apps Security
文章標籤

elleryq 發表在 痞客邦 留言(0) 人氣()


網址在 程式人雜誌 2013 年 1 月 (創刊號)

這期介紹不少東西,限於創刊號的東西,所以內容比較偏向創始人所熟悉的領域,像是 Arduino/RS232/電磁學 等...比較偏向軔體方面的題材。
軟體的部分,主要是介紹了 Factory Pattern, Javascript, Web Apps - Single Page application。

Javascript 的部分,是用 Chrome 舉例,建議可以用 jsfiddle 網站所提供的服務,可以達到隨寫隨執行的目的。
Arduino 介紹的蠻清楚的,原來一些附加的硬體可以用疊的的疊上去,就會提供額外的功能,其實之前買 MAKE 雜誌的時候,也有看到介紹,那時就很心動想來玩玩。
文章標籤

elleryq 發表在 痞客邦 留言(0) 人氣()

線上閱讀:MagPI #7

我只挑有興趣的文章來看。

p.18 Tune up Raspberry PI
  1. 需要額外的電源來 overvolting (升電壓),作者建議用 Kindle 或 Apple 的電源,Kindle 提供 850mA,而 Apple 可以提供到 1A。
  2. 設定可以參考 http://elinux.org/RPi_config.txt#Overclocking_options,主要是修改 /boot/config.txt,選項有 arm_freq, core_freq, sdram_freq, over_voltage...等
  3. 有工具可以幫忙做掉調整 config.txt 的差事:sudo raspi-config 再選 overclock,設定會寫到 /boot/config.txt
  4. 開機時按住 shift 會忽略掉 config.txt 裡超頻的設定。


p.26 C++ Cache
基礎介紹,面向的對象是初心者。

p.30 Python command line arguments
雖說是介紹 argparse 這個 module,但範例是用 pygame 來畫圖,最後有提供練習。

說真的,MagPI 雜誌不錯,蠻適合初學者看的,缺點是沒辦法從網頁版複製文字,就只能下載 PDF 才行了。
文章標籤

elleryq 發表在 痞客邦 留言(0) 人氣()

閱畢日期:2012/12/30

用了超快的速度翻完這本大雜燴的書,整體感覺來說,比較適合剛接觸電腦,對於 Google 不熟悉的人。

只紀錄之前沒看過的部份:
  • Google insight: 只知道 Google trends,可是不知道有 insight ,有空要來試試看
  • Google mail lab 裡有「移動圖示欄位」可把附件圖示移到左側。
  • Google document 可以同時編輯,用右上角的「共用」先分享。裏面有註解功能,可以對某部份加上說明。
  • 建立表單,一直都知道,只是都沒用過
  • 用 Google calendar 寫日記,這個主意蠻有趣的,但是這日記要怎麼匯出啊??
  • Google calendar 已經有考慮到時區問題,有選項可以設定。然後跟 gmail 一樣,也有 lab 功能,裏面有一個是「隱藏凌晨和深夜時段」功能,然後自訂檢視可以改一周為兩周。
  • 在聯絡人那邊設定生日以後,可以在 Google calendar 中「設定」「瀏覽有趣的日曆」裡找到朋友生日。
  • Google search 找「電影」或「翻譯 abcd」都有特殊功能。
  • Google Art Project 有提供數位導覽,另外也可以在出國前預先熟悉該館的配置。
  • Google Hotel finder
  • Google reader,好文章除了標記為星號,也要加上標籤(tag),之後才會容易找。
  • iPad Reeder 是一個 iPad 上不錯的 Google reader 閱讀工具,有一個特色是可以用 readability 功能下載全文,而不必用瀏覽器再連出去,這很方便,不知道 PC/Android 上有相似的工具嗎?
  • Google reader 可以查看 blog 的詳細資料與統計資料
  • wordpress plugin - PIcasa Image express 可以讓 wordpress 跟 picasa web album 完美結合
  • 搜尋時,可以在左邊看到社交,點選以後可以只顯示自己社交圈中分享的文章
  • G+,可以在社交圈中設定出現頻率,讓自己人分享的訊息出現的較為頻繁


要買書可以到博客來網路書局

More about 雲端工作術
文章標籤

elleryq 發表在 痞客邦 留言(0) 人氣()

這一章先討論了 PKI ,然後引用了海綿寶寶的例子來做說明,還蠻有趣的,一看就能懂。

接著是提 symmetric key algorithm,Android 內支援的有四種:AES, twofish, blowfish, camellia,不管是用哪一種,程式的方式相當一致,就是 KeyGenerator.getInstance("AES"); 這邊帶的參數不一樣。


public static byte[] generateKey(byte[] randomNumberSeed) {
SecretKey sKey = null;
try {
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
random.setSeed(randomNumberSeed);
keyGen.init(256,random);
sKey = keyGen.generateKey();
} catch (NoSuchAlgorithmException e) {
Log.e(TAG,"No such algorithm exception");
}
return sKey.getEncoded();
}


然後是講到 padding,symmetric key algorithm 是以區塊為單位去做加密,因此會有 padding 問題。什麼是 padding?所謂的 padding 就是未滿資料區塊大小時所要填入的值,像 zero-padding 就表示是填 0;未指定的話,Android 是使用 PKCS5 padding。
再來就是區塊的處理,這邊介紹了 ECB, CBC, PCBC, CFB, OFB 這幾種 mode,看圖會比較容易懂。ECB 就是最簡單的處理,一塊就加密一次,所以 hacker 要破解時,就不用管前後文,直接針對某一塊去暴力破解就好,為了增加破解的複雜度,就有了後面幾種 mode,基本就是利用前一段加密過程所產出的東西來當作這一段的資料之後再加密。
android_apps_security-chap5-cfb_mode android_apps_security-chap5-ofb_mode android_apps_security-chap5-cbc_mode android_apps_security-chap5-pcbc_mode

接著介紹 Android 的儲存機制,Android 的儲存機制有 Shared Preferences, Internal Storage, External Storage, SQLite databases, Network connection。Shared Preferences 實體是 .xml 檔,真正的位置是在 /data/app/app 的資料夾下,這裡說可以設為 MODE_PRIVATE, MODE_WORLD_READABLE, MODE_WORLD_WRITABLE, MODE_MULTI_PROCESS。Internal Storage 的真正位置跟 Shared preferences 一樣,只是就不限於 xml。External Storage 則是在 SD Card 上。SQLite database,列出來的意思不知道是什麼,實際上這取決於放在哪裡。Network connection 的話,就是連線,一般最好就是用 SSL。列出機制以後,就是一堆範例程式。

Shared preference 是用 getSharedPreferences();Internal Storage 是用 context.openFileOutput()/context.openFileInput() 直接開檔做讀寫;SQLite Database 則要建立類別繼承 SQLiteOpenHelper ,複寫必要的函式以建立資料表格、做 CRUD 。作者是說,一般直接讀寫的情況比較少,他自己是都用 shared preference / sqlite database 比較多,操作比較方便。

章節最後是綜合應用,作者建立了一個 KeyManager 用來存放 key,Crypto 則用來作加解密:

// Key Manager
package net.zenconsult.android.crypto;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import android.content.Context;
import android.util.Log;
public class KeyManager {
private static final String TAG = "KeyManager";
private static final String file1 = "id_value";
private static final String file2 = "iv_value";
private static Context ctx;
public KeyManager(Context cntx) {
ctx = cntx;
}
public void setId(byte[] data) {
writer(data, file1);
}
public void setIv(byte[] data) {
writer(data, file2);
}
public byte[] getId() {
return reader(file1);
}
public byte[] getIv() {
return reader(file2);
}
public byte[] reader(String file) {
byte[] data = null;
try {
int bytesRead = 0;
FileInputStream fis = ctx.openFileInput(file);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] b = new byte[1024];
while ((bytesRead = fis.read(b)) ! = -1) {
bos.write(b, 0, bytesRead);
}
data = bos.toByteArray();
} catch (FileNotFoundException e) {
Log.e(TAG, "File not found in getId()");
} catch (IOException e) {
Log.e(TAG, "IOException in setId(): " + e.getMessage());
}
return data;
}
public void writer(byte[] data, String file) {
try {
FileOutputStream fos = ctx.openFileOutput(file,
Context.MODE_PRIVATE);
fos.write(data);
fos.flush();
fos.close();
} catch (FileNotFoundException e) {
Log.e(TAG, "File not found in setId()");
} catch (IOException e) {
Log.e(TAG, "IOException in setId(): " + e.getMessage());
}
}
}



// Crypto
package net.zenconsult.android.crypto;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import android.content.Context;
import android.util.Base64;
public class Crypto {
private static final String engine = "AES";
private static final String crypto = "AES/CBC/PKCS5Padding";
private static Context ctx;
public Crypto(Context cntx) {
ctx = cntx;
}
public byte[] cipher(byte[] data, int mode)
throws NoSuchAlgorithmException, NoSuchPaddingException,
InvalidKeyException, IllegalBlockSizeException,
BadPaddingException, InvalidAlgorithmParameterException {
KeyManager km = new KeyManager(ctx);
SecretKeySpec sks = new SecretKeySpec(km.getId(), engine);
IvParameterSpec iv = new IvParameterSpec(km.getIv());
Cipher c = Cipher.getInstance(crypto);
c.init(mode, sks, iv);
return c.doFinal(data);
}
public byte[] encrypt(byte[] data) throws InvalidKeyException,
NoSuchAlgorithmException, NoSuchPaddingException,
IllegalBlockSizeException, BadPaddingException,
InvalidAlgorithmParameterException {
return cipher(data, Cipher.ENCRYPT_MODE);
}
public byte[] decrypt(byte[] data) throws InvalidKeyException,
NoSuchAlgorithmException, NoSuchPaddingException,
IllegalBlockSizeException, BadPaddingException,
InvalidAlgorithmParameterException {
return cipher(data, Cipher.DECRYPT_MODE);
}
public String armorEncrypt(byte[] data) throws InvalidKeyException,
NoSuchAlgorithmException, NoSuchPaddingException,
IllegalBlockSizeException, BadPaddingException,
InvalidAlgorithmParameterException {
return Base64.encodeToString(encrypt(data), Base64.DEFAULT);
}
public String armorDecrypt(String data) throws InvalidKeyException,
NoSuchAlgorithmException, NoSuchPaddingException,
IllegalBlockSizeException, BadPaddingException,
InvalidAlgorithmParameterException {
return new String(decrypt(Base64.decode(data, Base64.DEFAULT)));
}
}


使用的時候直接用 Crypto 即可,Crypt 內部會自動去建立 KeyManager,然後使用。


More about Android Apps Security
文章標籤

elleryq 發表在 痞客邦 留言(0) 人氣()

這一章有 90% 都是程式碼,主要就是應用前面三章所講的。

今天在想到這本書時,發現完全忘記前面第二章所提到的加解密演算法,在看這章時,特別看了一下,是 AES,這是可還原的。

More about Android Apps Security
文章標籤

elleryq 發表在 痞客邦 留言(0) 人氣()

這一章回頭介紹起 Android 的安全機制,前面詳細解釋內部的做法,簡單說,就是 app 之間是被分隔的,app 要使用系統的某些資源,也需要特別在 AndroidManifest.xml 裡表明,在安裝的時候,使用者認可,那麼你的 app 才能使用這些資源。

app 之間被分隔的話,那麼該怎麼溝通,接著就介紹了 ContentProvider 跟 Intent。ContentProvider 其實就可以當作 DataStore 的同義詞,然後就表列了 Android 內部的 ContentProvider,想不到 Android 本身有提供這麼多 ContentProvider。Intent 的使用就簡單帶過去,因為用法其實就那幾種。

接著就介紹了 Permission,除了 Android 預先定義好的 Permission 之外,使用者也可以自訂 permission,這個我倒是不知道了。在 AndroidManifest.xml 裡,可以這麼寫 <permission android:name="net.zenconsult.mobile.testapp.permission.PURGE_DATABASE"
android:label="@string/label_purgeDatabase"
android:description="@string/description_purgeDatabase"
android:protectionLevel="dangerous" />
最後就舉了一個自訂 permission 的例子。
android:name="" 裡所表明的 PURGE_DATABASE,的確就是要新增一個類別去繼承 permission,並自定義 PURGE_DATABASE 字串。

我想一般要自己定義 permission 的機會應該不多才是。

More about Android Apps Security
文章標籤

elleryq 發表在 痞客邦 留言(0) 人氣()

一開始還是一樣強調安全的重要性,並將攻擊區分為直接與間接攻擊,然後舉了一個 2.2~2.3 的漏洞做為間接攻擊的例子,這個漏洞是這樣子的:使用者瀏覽一個有問題的網頁,因為漏洞的關係,該網頁不會出現詢問的視窗,可以直接下載檔案並儲存到 SD Card,又因為另外一個漏洞,被下載的檔案會有可被執行的權限,於是攻擊者就有了可完整存取 SD Card 的權限。

接著就開始舉例了,第一步就是確認要將資料分類,哪些資料是個人資訊,哪些資料是敏感資訊,作者用了一個表格來做整理:
  • 欄位名稱
  • Personal? 個人資訊?
  • Sensitive? 敏感
  • Create 可以被使用者建立?
  • Store 要存放嗎?存在遠端還是本地端?
  • Send 需要傳送到網路上?
  • Receive 需要從遠端下載?


仔細的寫下來,就可以針對資料欄位的特性來做處理,看需不需要加密、傳送要不要經由 SSL...等等的。章節的最後介紹了 AES 加解密,AES 是一種單一鑰匙就可加解密的演算法,跟要給別人公鑰、自己拿私鑰的那種不一樣。AES 演算法可以參考維基百科上的說明。

More about Android Apps Security
文章標籤

elleryq 發表在 痞客邦 留言(0) 人氣()