[iOS][Python][unix][golang][程式設計週記] 工作上的一些雜事筆記20141219

前言: 在上完一個禮拜的Intel課程後,本週可以在辦公室專心做事情.可以專心的好好的把工作進度來超前一下.加上coursera的課程都上完了,應該可以有更多的時間可以好好的看看. 本週重點是學習iOS HealthKit 跟 etcd,當然還是有工作上管理伺服器的一些事情….. 筆記: [Unix] 如何增加一個客製化的服務(custom service) 前言: 新增一些伺服器,所以要把舊的伺服器上面的一些服務搬過來. 流程: 複製相關的shell script 到 /etc/default 與 /etc/init.d 這裡要注意,透過windows檔案複製的話會出現”/bin/sh^M : bad interpreter”,解決方式可以參考這裡. 要使用dos2unix 去轉換這些script 增加一些設定檔script到 /etc 記得用”initctl reload-configuration”把這些services重讀,參考這裡 [iOS] 關於錯誤“Capturing [an object] strongly in this block is likely to lead to a retain cycle” 前言: 因為HealthKit都在搞Async process所以經常在GCD的過程中去使用原先的self process,所以容易產生這個問題. 原因: 根據stackoverflow上面的解釋,主要原因是因為block會保留一份在裡面,如果保留的是self就會造成循環的持有. 解決方式: 加上以下的部分就可以了 __weak typeof(self) weakSelf = self; [someprocess setCompletionBlockWithSuccess:^(Operation *operation) { [weakSelf someOperationInSelf]; } [iOS] 關於IPWORKS整合 前言: 公司在用的3rd party component,不過每次整合都會忘記,紀錄一下. 步驟: copy IPWORKs, libSSL Add related framework: libz.dylib libssl.a libcrypto.a Add “Preprocessor Macros” in debug IPWORKS_MINSIZE INCLUDE_IPWORKS_XMPP Change “C++ compiler setting in Apple LLVM 6.0 - Language ++” C++ Language Dialect -> Compiler default. Standard Library -> Compiler default. [Go] 準備好好研究一下etcd 前言: 主要起因是因為這個一月份的Golang聚會,裡面有提到etcd很適合作為IOT(Internet Of Thing)的資料庫,所以打算開始survey.看看是不是真的能讓速度快一點. 筆記: 基本上etcd是一個相當快速的key pairing 資料庫,可以透過http直接存取. 其實發現etcd有以下的幾個優點: 可以透過http來讀取與存取. (讀取直接打網址,存可以用Put跟Post) 雖然是Key Pairing Database,但是還是存有index.所以可以記錄之前的資料.也可以透過wait=true達到key-value observing的效果. 參考: 一些關於python 使用etcd說明 在CoreOS裡面使用etcd的一些使用方式 中文簡介,有提到一些優點 etcd 官網 [iOS] 關於HealthKit的筆記 玩HealthKit到現在,其實有點困難必須得承認就是對於單位與測量數值的標準化. 簡單的說: 你想要量個血壓,你就得知道你要量血壓單位名稱.還有血壓數值一般轉換的方式. 舉例而言: 你現在需要量血壓,血壓有兩種數值收縮壓(Diastolic)與舒張壓(Systolic),這時候你需要知道以下一些東西: 舒張壓的資料型態(Type)是 HKQuantityTypeIdentifierBloodPressureDiastolic HKQuantityType *DiastolicType = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierBloodPressureDiastolic]; 舒張壓的單位是(millimeter Of...
繼續閱讀

[iOS] HealthKit的初體驗..

前言: 最近開始仔細瞭解HealthKit,發現使用上並沒有那麼的直覺.(可能是我對於許多醫療單位沒有那麼清楚的關係 XD) 使用上有一些要注意的與需要瞭解的部分,稍微做一些紀錄. 筆記: [基本概念] 到目前為止,HealthKit只有iPhone可以用,並且要有iOS8.所以iPad執行程式會失敗. 每一個資料有所屬的資料格式數量(HKQuantity)與該數量的格式(HKQuantityType),而數量(Quantity)本身與單位的格式(HKUnit)有關. 必須要清楚地瞭解,存取的資料數量單位與單位的格式. 比如說,身高要確認是用cm還是inch,體重是使用pound還是kg. 每一個存取都與使用者權限有關,去拿使用者不開放的資料,就會引發錯誤. 所有的動作都是Async的方式: 這邊比較麻煩的是,如果需要抽象化的話可能要把async改成sync這邊可以參考這邊的內容. [基本資料欄位] 關於資料欄位舉例而言,要敘述關於血壓的舒張壓,你就得要撰寫以下的部分: //敘述你的血壓單位是 mmag mullumeter of mercyry unit HKUnit *BPUnit = [HKUnit millimeterOfMercuryUnit]; //透過這個HKUnit去建立單位 HKQuantity HKQuantity *BPSystolicQuantity = [HKQuantity quantityWithUnit:BPUnit doubleValue:SIS]; // 透過建立的單位與數值來建立這個單位類型(HKQuantityType) HKQuantityType *BPSystolicType = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierBloodPressureSystolic]; [取得使用者權限] 上面的方式僅僅是拿來作為處理資料欄位而已,接下來要開始去跟HealthKit查詢資料.在查詢資料之前,由於HealthKit上的資料都是儲存在手機上面,屬於個人私密資料.需要取得使用者的權限. //取出體重單位格式 HKQuantityType *weightType = [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierBodyMass]; //取出身高單位格式 HKQuantityType *heightType = [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeight]; // 將身高體重加入要求的權限集合,這裡有分"讀取"與"寫入"的集合 NSSet *writeDataTypes = [NSSet setWithObjects:heightType, weightType, nil]; NSSet *readDataTypes = [NSSet setWithObjects:heightType, weightType, nil]; // 確認HealthKit 存不存在,這裡如果還是iPad 是不會有的,請注意. if ([HKHealthStore isHealthDataAvailable]) { // 要求使用者同意 [self.healthStore requestAuthorizationToShareTypes:writeDataTypes readTypes:readDataTypes completion:^(BOOL success, NSError *error) { if (!success) { NSLog(@"You didn't allow HealthKit to access these read/write data types. In your app, try to handle this error gracefully when a user decides not to provide access. The error was: %@. If you're using a simulator, try it on a device.", error); return; } //處理成功以後,可能需要的資料讀取部分. }]; } [讀取資料] 關於讀取資料這邊,需要注意的就是必須要取得正確的單位. 還是一樣,讀到資料以後是async,所以可以用另外的thread來更新UI 以下提供取得”心跳(Heart Rate)”的方式 //心跳屬於複合資料欄位,需要用字串來找到HKUnit.文件不好找到. HKUnit *dataUnit = [HKUnit unitFromString:@"count/min"];...
繼續閱讀

[iOS][Android][Python]工作上的一些雜事筆記20141212

前言: 本週都在Intel上課,大部份內容屬於NDA.只能找空閒時間看看其他的部分. 筆記: [Mac OSX]一些常用的工具 想要尋找Mac上面類似pietty一樣好用的軟體,卻忘記terminal 本身就有一樣的功能.更何況我有裝iTerm2 [指令] ssh -l username -p portnumber host 參考: 25個SSH指令 除了想要尋找類似pietty一樣的軟體外,也想要尋找可以一次完成SSH跟SFTP的軟體 Fugu 就是我想找的. [Android][iOS] PhoneGap Beta Release 這個東西可以幫助你開發Web App並且可以在手機(模擬器)上面瀏覽. http://phonegap.com/blog/2014/12/11/phonegap-desktop-app-beta/ [Android] Android Studio 1.0 official release 剛剛痛苦的把Android Project轉換成Android 1.0RC2之後,official release出來了.找時間好好來看看如何使用. https://developer.android.com/sdk/index.html [iOS] Parse支援Crash Log,可以考慮要不要加進去自己的App.不過我App用的是Parse 1.2.19現在已經到1.6了. 相關介紹網址 http://goo.gl/70jIEb 這一篇有介紹一些toolkit可以使用 http://www.raywenderlich.com/33669/overview-of-ios-crash-reporting-tools-part-1 TestFlight也是很多人推薦 https://www.testflightapp.com/ 當然挺多人推薦的HockeyApp http://hockeyapp.net/features/ [IaaS][PaaS] 在Azure上面架設VM(Virtual Machine)很方便.但是對外的port要透過設定不然預設都是關閉的.這件事情讓我很困擾. 問題: 建立了伺服器與服務,但是對外都無法找到相對應的服務 內部自己用curl或是其他client app可以找到相對應的服務 解決方式: 在Endpoint得加入你要開放給外面的port 甚至可以做一個簡單的port 修改,比如說把xmpp 從5222改到80,裡面的80 Apache改到8080 此外,現在Azure是有Preview的Manager Dashboard,東西有變多了.
繼續閱讀

[MH4G][MonsterHunter4G]雙刀畢業考心得(師匠からの試練)

第一次打給我驚險在最後八秒過了。 可以關柵欄覺得比較容易。 極限很機車、雙劍刷腳很快倒。如果有極限強化可以更快
繼續閱讀

[iOS][Android][Python]工作上的一些雜事筆記20141205

前言: 本週工作依舊五花八門,下週要去Intel上課.要看看能寫多少出來. 筆記: [MSFT] 關於Visual Studio 2013 upate 4更新過後,整個編輯器變慢. 新增的功能會預設把git當作他的source control plugin這樣會有一些問題. 問題: 更新VS2013 update4 之後,編輯器變慢.尤其是開啟檔案與關閉檔案的時候. 原因: VS2013 source control plugin 會讀取該目錄git的資料,並且加入自已的source control plugin. 如果你已經有用到其他的source control system,可能會造成衝突而變慢. 解決方法: 也不算正式解決方法,只是先關閉這個plugin.可以幫助整體效能的提升. Option -> Source Control -> Plug-in Selection -> Current Source control plugin -> None. 參考: http://stackoverflow.com/questions/20101211/disable-git-in-visual-studio-2013 [iOS] 關於這週的一些小修改 有些App需要在背景的時候強制重啟,以確保連線狀態(尤其是xmpp).對於類似的App設計,可能可以考慮強制不要App進入背景模式. 原因: 這邊紀錄一下,主要是xmpp server通常會主動踢人(1 min),所以通常一般client 的實現都會有keepalive的機制.不過經過測試App方面的keepalive往往不盡人意.除非有傳輸的需求,不然建議不要進入背景模式比較好. 方法: 新增UIApplicationExitsOnSuspend = True在Plist裡面. 參考: http://stackoverflow.com/questions/5999638/quit-app-instead-of-entering-background-when-receiving-applicationdidenterbackgr 關於dispatch_async(dispatch_get_main_queue() 大家都會用它來把工作移到別的thread 但是其實他也是有照順序的,所以如果你依照順序跑三次,他就會依序跑那些你指定的指令. 用法上對於需要等待回應的程式,其實相當的方便. 關於NSUserDefaults的預設值總是會錯~如果第一次安裝App 錯誤狀況: 第一次安裝App後,讀取NSUserDefaults會無法讀到預設為True的值()或是其他預設值) 解決方式: 原因是因為你沒有把plist的數值去註冊,這邊有兩種方式可以選擇. 第一種: 讀取數值不要用boolValue 而用NSNumber接起來~然後判斷是不是nil 第二種: 執行NSUserDefaults registerDefaults把預設值先讀進App 參考資料: http://oleb.net/blog/2014/02/nsuserdefaults-handling-default-values/ XCode更新了6.1.1: 很希望他有把IDE穩定性修好,不過有看到一個特別的詞 (SourceKit),去查了一下原來SourceKit是用來給swift作為Source code parser,Syntax highlighter 還有cross-language header generator… 這裏有詳細的解釋: http://www.jpsim.com/uncovering-sourcekit/ [Android] Android Studio 1.0RC版本出來,有些地方要注意: Android安裝方式,可以選擇Standard來安裝.不過得要啟動時候沒有專案才會出現這個選項. 由於Gradle設定檔有問題,需要把runProguard改成minifyEnabled 參考這篇臉書: https://www.facebook.com/photo.php?fbid=1002023656481430&set=a.113952728621865.18504.100000214145898&type=1 參考這篇問答: http://stackoverflow.com/questions/27078075/gradle-dsl-method-not-found-runproguard 使用舊的Android Studio 含0.8.14版以前,所建立出來的專案,會自動產生res/values-v21/styles.xml造成在Android 5.0的裝置上會因沒有”android:Theme.Material.Light”而Crash掉. 參考這篇臉書: https://www.facebook.com/photo.php?fbid=1002023656481430&set=a.113952728621865.18504.100000214145898&type=1 [Linux][Ubuntu][Python] 手工打造process watcher and recovery 遇到的問題: 工作上遇到的問題主要是有管一些雲端服務,自然要監測這幾個service的狀況.如果遇到service出錯必須要有自動的回覆機制. 解決方式: 原本是透過Python寫一個透過grep來找特定的service的方式,這裡有程式碼. 不過研究過後,或許採取pidof的方式是不容易重複的方式.也改寫成shell script. 參考這裡. 這篇討論很值得思考,偵測process要考慮會不會產生額外的資源消耗.
繼續閱讀

[iOS][Android]工作上的一些雜事筆記20141128

好像變成週記?不過~因為只是草草的紀錄一下,工作上有關的問題或是看到的網路介紹,並沒有打算寫成詳細的文章. [綜合] 關於 Regular Expression http://jex.im/regulex/ 是一個透過Java Script 可以視覺化呈現Regular Exoression 的網頁. 好用的Regular Expression範例(不論是取得信用卡號碼,電話號碼,生日,區碼甚至是Email 與 IP Address都有) http://www.virtuosimedia.com/dev/php/37-tested-php-perl-and-javascript-regular-expressions 個人認為兩個網站搭配起來,可以讓你的Regex的功力更上一層樓. 其他資源: Eclipse 的Regex Tester介紹 http://www.ewdna.com/2009/12/eclipse-regular-expression-tester.html Regex 精華整理 http://www.javaworld.com.tw/jute/post/view?bid=20&id=130126&sty=1&tpg=1&age=0 [iOS] 關於XCode6的Adaptive Layouts 到了Xcode6為了配合iPhone6(或是其他size iPhone),在XCode6裡面新增了Adaptive Layout的功能.仔細看了功能,發現真的是相當容易搞死人的設計. 相關資料: One Storyboard for all sizes http://www.learnswift.io/blog/2014/6/12/size-classes-with-xcode-6-and-swift Size Class tutorials http://www.ioscreator.com/tutorials/size-classes-ios8-xcode-6 Video tutorial https://www.youtube.com/watch?v=E3glNbNnokw [Android] 關於InetAddress的 thread safe 問題 問題: 當手機在做Wifi 切換的時候,如果網路不穩定的狀況下,同時使用InetAddress.getByName()會hang住. 詳細狀況為第一次呼叫到會成功,第二次會hang在裡面.(同時呼叫) 解法: 沒有找到確切的證據,不過由於InetAddress本身是透過JNI來查詢網路,不適合作為網路狀況的確認. 網路上比較建議的方式必須要有UI來負責這件事情,因為比需要使用到permission “android.permission.ACCESS_NETWORK_STATE” 參考: http://stackoverflow.com/questions/1560788/how-to-check-internet-access-on-android-inetaddress-never-timeouts http://thiranjith.com/2011/03/31/how-to-monitor-network-connectivity-in-android/ // 當兩個thread同時呼叫以下的指令,在網路不穩的狀況下會出問題. InetAddress.getByName("SOME_DOMAIN_NAME").isReachable(30); // 比較建議的方式 public boolean isOnline() { ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo netInfo = cm.getActiveNetworkInfo(); return netInfo != null && netInfo.isConnectedOrConnecting(); } // 必須要注意到加到 Manifest < uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
繼續閱讀