[iOS][VC] 關於debugger 的進階利用 - 利用breakpoint幫你列印一些資訊...

最近看了一篇挺好的文章(快速開發iOSApp),雖然是iOS的文章但是有提到一段是關於XCode debugger的進階運用教學
當然這裡提到的不是hit count,condition 那一系列的用法.
這裡有影片,可能需要iOS Dev 帳號 (影片1) (影片2)

裡面最好用(最近)的就是直接利用break point 去印一些文字幫助你debug

  • 設立一個breakpoint

  • 使用右鍵Edit breakpoint

  • “Add action”-> 印出你需要的物件(po XXX 或是  expr (void)NSLog(@“%f”, XXX)

  • 點選”Automatically continue after evaluating”

這裡有官方文件,不過還是影片教學比較好.

回過頭來也去研究微軟的Vistual Studio 看看有沒有類似的功能.沒有那麼強大~但是其實也是有的.以下是VS2013的設定步驟:

  • 建立一個Breakpoint

  • 一樣使用右鍵,選取”When Hit”

  • 印出你要的字,這裡如果要印出變數~多做一些功…  

這裡有完整的說明,可以參考…

兩者(Xcode 5 V.S. VS2013 SP1) 比較一下

  • VS2013

  • XCode

    • 不僅僅可以列印變數,影片中甚至建議你可以利用這個去新增或是變更你的breakpoint.

    • 基本上 Add Action 所以任何Action都可以思考.

      • 影片中有提到可以使用 AppleScript 去寄信給你當任何exception 發生的時候.這樣一來可以跑overnight testing 隔天再來看結果就好了.
    • 但是如同前面提到的,需要跑一些特殊的動作的時候.確認不會變動到你的邏輯.

使用這個的好處是什麼? 

  • 不用改code,不用一個個breakpoint 停下來看.馬上可以了解程式的流程….

  • 不用切換到debug version,可以直接在release來利用印出文字了解流程,但是release版本無法正確印出變數(除非是managed code). 很多問題都只發生在release version你懂得. (尤其是客戶手上的那版 XD)

但是其實也是有一些缺點:

  • 變得慢.. 別忘了任何的breakpoint 都是在程式內部增加 interrupt 所以一定變慢(VS2013上還挺明顯的)

  • 當你試著要做某些動作的時候,有可能會變更IDE內部的動作.這個在XCode的演講裡面有提到,可以詳細去看…

[VC++] OpenCV相機使用相關...

OpenCV是個非常簡單而且好用的影像相關處理的library.
而針對相機的處理上,其實OpenCV也是可以快速寫出一個sample application
之前要處理相機旋轉上作了一些查詢,這裡記錄一下

安裝OpenCV:

  • 抓下最新的code

  • 增加 buildinclude 到VC設定(記得選取到正確的VC版本)

  • 增加buildx86vc12lib 到library 設定

  • 記得複製相關的dll 到執行目錄

關於旋轉方面:

相機拍照的時候如果去旋轉你的相機,你也要把拍進來的資料做旋轉.
關於Rotation的部分,其實找了不少的方式.不過發現最方便的方法還是使用cvTranspose 跟 cvFlip
不過當初為了讓OpenCV瘦身,拔除了不少的function 很難在現在的狀況下去debug.
於是去把OpenCV重新安裝起來,並且自己弄了一個camera的測試小app ,想不到比想像中的快速多
這裡僅僅去備份一下,這個測試app:功能很簡單,開啟相機~並且可以用 “T” “ “R” “F” 來旋轉圖片 “Q”離開 

 

 

 

參考資料: 

[iOS][FacebookSDK] 更換Facebook SDK 到 3.13啟動 SSO (Single Sign On)

我的iOS App送過去iTune Connect 準備上架的review,經過了一個多禮拜的等待.
想不到八個小時就失敗了,接下來就得去修改.

  • 要求把Facebook login 從web login 修改成 SSO(Single Sign On)

  • 要求增加一些互動的功能,比如說分享或是Push Notification…

首先先回頭來看我的Facebook SSO login 的部分吧.

  • 首先我發現我的Facebook版本有點舊,於是我去下載並且更新了最新版本3.13

  • 在沒有修改任何code的狀況下,基本上我使用openActiveSessionWithReadPermissions,我發現了以下的問題:

    • 在模擬器上面,由於沒有FB App 所以一定會走到Web login

    • 在手機上面會出現 error code 2~也不會走去web login

  • 再找了許多方式無法正常解決之後,我決定重新寫一個sample app 來測試.主要是重新看facebook 這裡的教學.想不到就成功了.

  • 於是去分析之後,發現隨著SDK的修改iOS 設定也有以下更改

    • 增加了新數值FacebookDisplayName

    • 由於之前上架,我把我的bunddle name 有修改了,要去FB dev上面的設定去修改

  • 改完之後就可以了…. 想不到換SDK就可以達成SSO,不過可能是bundle name一直錯誤的原因~但是沒有查出來…

  • 如何反覆測試login (How to test SSO repeatedly)

    • 去[Facebook APP]裡面的[隱私設定]->[應用程式] 移除你的App

    • 重新安裝App

提供給大家..

參考文章:

[Python] 如何在Heroku 上面建立第一個Python app

之前一直有聽說Heroku的服務相當好用,其實帳號也申請好了.
但是一直沒有時間把他設定起來,而是一直卡在local端學習Ruby on Rails
不過最近開始要認真把它弄起來,也要把Python開始好好的補習一下
這裡稍微記錄一下關於如何在Mac上架設Heroku Python App的筆記

  • 主要流程參考Heroku官方教學說明,這裡只挑一些會有問題的地方加上註解:

  • 關於Python 環境架設

    • 由於Mac OS本身就有Python,這倒不是太困難的事情.主要是要安裝VisualEnv (這裡有更多說明)

      • easy_install virtualenv
  •  Heroku login與SSH key

    • 第一次打Heroku login 會自動把在你設定的.ssh/rsa_pub 上傳到server去當做你的key
  • 關於Heroku Toolkit : Procfile 與 foreman

    • Procfile是你需要寫一個設定檔 “Procfile”去執行相關的app

    • foreman 可以讓你local 去執行你要建立在Heroku的app

  • 由於架構上是利用 git 把你local 的檔案上傳到遠端的 Heroku Git server 然後去執行它.所以必須要了解Git基本指令,每次改完code可以先用foreman先在本地端預覽,然後再push到Heroku

好了,這樣也架設好第一個Heroku 第一個App接下來要學習更複雜的Python與更多的應用 

參考:

[WindowsStore][C#] 關於Memory Leaks 的debugging 筆記

一直以來,Windows Store App由於有GC (Garbage Collection)的關係,所以之前寫的App也都不容易有memory leak的產生.
最近剛好遇到這樣的問題,也好好的把一些相關的工具都學習了一下.再次筆記一下

Debugging Memory Leaks之前,你必須了解

  • 所謂的memory leak在使用者能夠看到的永遠是記憶體被用完crash(或是app 收起來).但是就像是水管漏水一樣, 積水的地方絕對不是漏水的地方.

  • 所以面對memory leak 的問題,第一件事情就是不斷地簡化復現(reproduce)的步驟.

  • 由於有GC,如果你重複三到五次的動作發現有記憶體長大的情形,絕對不要貿然認為你找到關鍵的步驟.必須要超過10~15次讓系統把記憶體收回去.

    • 通常如果是Frame 的記憶體回收,可能5~10次會發生,WinRT 的部分可能會更久

    • 也可以跑一些其他大記憶體的App讓GC強迫產生

    • 或是放一段時間,讓GC動作.

    • 試著可以加上GC.Collect()的程式碼讓系統快一點回收,不過通常而言產生的效果相當有限.

  • 找到了memory leak的部分的時候,千萬不要選擇使用 Dispose或是 Null 某些component,因為這樣都不是正確的方式.必須要回過頭來去尋找為何該記憶體無法被正常的釋放.

關於尋找Memory Leak的Tools

這邊要註解一下,大部份的C#或是.NET的memory dump tool 都只能先把關於 managed code 的部分可以先列印出來
如果memory leak 出現在WINRT或是自己寫的unmanaged code這樣就比較難去尋找了. 

  • NP .NET Profiler tool

    • 這個工具還不錯,只要先指定好之後.做好一次的動作就用snapshot 抓下現在的記憶體狀況,最後再把狀況dump出來就可以了

    • 心得:

      • 比起等等會提到的PerfView算是比較好用,當然東西會少一點.不過使用上相當直覺,相當好用.
  • PerfView (說明網頁)

    • 這是微軟的工具,一樣只能提managed code的memory dump但是資訊更多還可以trace到Windows System Symbol.

    • 使用方法也相當簡單,先dump一次後.開始執行會產生memory leak 的動作然後執行第二次dump. 打開原始跟第二次的report就可以diff然後觀看結果.

    • 心得:

      • 比較建議使用這個畢竟是微軟提供的工具,資訊也比較多.不過在使用的時候如果有用debugger attach 會更慢.

如何Debugging Memory Leaks

  • 尋找正確的復現步驟,任何bug都是如此但是對於Windows Store(Mobile) system 而言,需要注意以下狀況

    • 如果發現做一次的步驟,記憶體沒有任何的增長,代表你的方式無法復現.反之則不然

    • 做出一次步驟發現記憶體的增長,不要以為找到復現的步驟.恐怕只是系統還未回收記憶體,建議要做到記憶體爆掉App收掉.

  • 這裡先列出一些在managed code裡面容易發生memory leak的部分:

    • UIElement AddHandler/RemoveHandler

      • 根據許多的資料(還有這裡)上來說GC應該會處理這樣的Handler,但是透過我實地拿PerfView的結果卻是會產生memory leak. 還是得注意一下.
    • Delegate的處理  += 記得要 -= 回去

      • 這個是一定會出事情的,千萬要注意你的 OnNavigationTo/OnNavigationFrom 有沒有成對的 += 與 -= 
    • 利用PerfvIew 查詢reference count是否有任何的異常產生(也就是查詢到爆量或是超過自己想像的ref cnt)

  • 利用PerfView 來觀察的部分,這邊有一些小技巧可以去觀察,驗證的方法:

    • [觀察]使用Diff方法,一開始先記錄下來後,做完疑似memory leak 的步驟之後,再記錄下來.

    • [驗證]可以把修改前的跟修改後的比對,不過這裡建議用修改前去diff 修改後~雖然數字出來會是正數但是這樣比較容易分析…

參考文章:

[iOS]繪圖函式CorePlot設定與使用

CorePlot 是一個相當好用來畫各種條狀圖,折線圖與圓餅圖的library. 要在手機上畫出美美的條狀圖,圓餅圖與長方圖?真的只能靠這套Library了.
以下整理一些在使用上可能會遇到的問題 

遇到的問題:

使用了好用的CorePlot也必須要了解使用最基本的方式來畫圖
以下是一些基本跟UIView 有關的部分,順便複習一下

  • 關於UIView
  • UIView Constructor 有兩種
      • (id)initWithCoder:(NSCoder *)aDecoder  
      • (id)initWithFrame:(CGRect)frame
    • initWithCoder 是給 StoryBoard 上面的UIView 使用,另外一個通常是自定frame大小的時候會用到.
    • 參數定義使用property與synthesize
  • 要畫Label 與畫出有顏色的自定UIView 可以用以下方式

          // 畫出UILable  
          CGRect frame = CGRectMake(20, 45, 140, 21);
          UILabel *label = [[UILabel alloc] initWithFrame:frame];
          [self.view addSubview:label];
          [label setText:@"Number of sides:"];
        
          // 自定UIView但是是個塗滿的黑筐
          UIView *lineView = [[UIView alloc] initWithFrame:CGRectMake(0, 200, self.view.bounds.size.width, 30)];
        
          lineView.backgroundColor = [UIColorblackColor];
          [self.view addSubview:lineView];
    
  • 參考:
  • 設定動畫 Animation
    • 主要是利用 UIView 的transform 裡面主要有三種 (可以達到放大,縮小,旋轉與Translation)
      • CGAffineTransformMakeScale
      • CGAffineTransformMakeRotation  
      • CGAffineTransformMakeTranslation
    • 詳細內容如下:

        -(IBAction)startScaleTransform:(id)sender
        {
            self.view.transform = CGAffineTransformMakeScale(2,2);
            [UIViewbeginAnimations:nilcontext:NULL];
            [UIViewsetAnimationDuration:1];
            self.view.transform = CGAffineTransformMakeScale(1,1);
            self.view.alpha = 1.0;
            [UIViewcommitAnimations];
        }
      

參考文章: