2015年11月20日 星期五

ANR with Google Analytics when purchasing the in-app-purchase items

     昨天suffer了一個離奇的deadlock issue,情境是如果User已經買過某個IAP Item後,重複購買時有些Device就會卡住然後ANR,結果dump出來Thread的狀態後發現,結果Main Thread卡在在GA回報Crash的Task。

stackoverflow有人建議直接把它回報crash的功能關掉(專心做event的事情就好了啊GA)

http://stackoverflow.com/questions/30654669/anr-with-google-analytics

2015年11月18日 星期三

Parse Push Notification 1.11.0 Integration issue

今天無聊拿side project來整合Parse的Push Notification,結果弄了一個多小時才try出來;故事是這樣子的,使用的Parse版本是1.11.0,照著官方文件(或者Github Sample Project)設定完AndroidManifest.xml、在Application.onCreate()塞Code後,你會得到一個完全收不到Notification的程式碼;此時你必須注意兩件事情。

第一,AndroidManifest.xml的ParseBroadcastReceiver的intent-filter要ㄕ對:

<receiver android:name="com.parse.ParseBroadcastReceiver">
  <intent-filter>
    <action android:name="android.intent.action.BOOT_COMPLETED" />
    <action android:name="android.intent.action.USER_PRESENT" />
  </intent-filter>
</receiver>

但你必須要這樣
<receiver android:name="com.parse.ParsePushBroadcastReceiver"
    android:exported="false">
  <intent-filter>
      <action android:name="com.parse.push.intent.RECEIVE" />
      <action android:name="com.parse.push.intent.DELETE" />
      <action android:name="com.parse.push.intent.OPEN" />
    </intent-filter>
</receiver>

第二,記得把ParsePushBoradcastReceiver寫進去AndroidManifest.xml

官方文件沒有教你寫進去,是我自己開Debug Log跟追SDK Code之後才發現,發送Notification的人是ParsePushBoradcastReceiver,但它沒有權限接受Broadcast。



搞不好過一陣子官方就會把文件全部更新到正確,而這篇文章則是紀念這一個小時的自己到底發生了什麼事情;不過好險Parse把SDK也Open Source,某種程度也是鼓勵開發者發現Bug時先別急著回報,可以幫忙它們修一點Bug。

2015年10月9日 星期五

Develop VR App by Unity3D

前言:因為公司買了一些VR的設備,藉由之前用Unity開發遊戲的經驗,剛好替公司破億下載的派對做一個派對限定的APP。

Unity3D在5.1版後正式支援VR功能,而最近各個VR的平台紛紛做好Unity3D的Plugin,讓開發者能夠專心在處理想要呈現的世界,像Google Cardboard的在這,以及Samsung GearVR的在這,概念大概是把攝影機的Prefab拉到Unity的編輯世界裡就完成了,不過每家VR也有些特殊的功能通常也會提供,像Google Cardboard右邊有個拉環可以拉,它的SDK也包含這個觸發的Prefab。

Google Cardboard可以把程式甚至Deploy到iPhone上,用Cardboard就能得到跟Android一樣的體驗,只能說Google的想法真的很特別(民主);不像Oculus只想著如何綁硬體來賣,雖然用Unity開發,但只有Android而且還要Samsung S6跟Note4才能讓程式跑起來。

最後分享一下我的成品,概念是會把派對時,把大家拍的照片放在一個類似五次元的空間中(靈感來自星際效應的最後片段)。

https://github.com/bearprada/PicCollage100MPartyVRApp


2015年9月21日 星期一

FloatMath在Android M版本不見了

   升級到Android M版本拿掉很多官方覺得不適用的Classes,像是AndroidClient以及FloatMath,只要你將專案的版本升級到23之後就會發現。AndroidClient的問題可以在build.gradle裡面加上:
useLibrary 'org.apache.http.legacy'
    但是FloatMath的問題官方就沒有特別說明處理的方式,而公司的專案剛好用到兩個library都踩到這個雷,它們分別為PhotoViewAviary;如果要等它們升級到最新版本可能要等到天荒地老,而且Aviary最近好像要停止支援,希望大家去另外一套library叫做Adobe Creative SDK(其實跟Aviary長的一模一樣),可能是Adobe正在宣示主權吧!

   最後想到一招可以解決目前的過渡期,那就是自行新增一個android.util.FloatMath.java,然後把Method全部bypass到Math的物件,就能夠安然的編譯完成。


更新:PhotoView在1.2.4把這個問題解決了(commit)

2015年9月6日 星期日

斷捨離之開不完的分頁

   訊爆炸的時代好在有強大的電腦,能夠讓瀏覽器開啟幾百個分頁還是如此順暢,也因為如此閱讀的習慣變得很不一樣,不知道有多少人跟我一樣是看完標題後,覺得這個文章很有價值,但不想現在花時間看完,所以就讓它躺在某個分頁之中;這種狀況也可以延伸到書本,我也得了一種看了書的封面就想買回去的症狀,自己深信不疑買了就能獲得那本書的知識,但它們只是悄悄躺在書架上,直到書架不夠放時才意識到它也不是那麼重要。

    為了解決這類型的問題,亦或者是習慣造成的延伸問題,有各式各樣的小工具發展出來,以下會介紹到自己本身有在用的工具及心得。用Chrome瀏覽器但是記憶體沒有那麼多的人,非常建議安裝OneTab的套件,堪稱一鍵備份所有分頁,我用的非常勤勞,也用的非常錯誤,所以最高紀錄有超過250分頁備份在此,但從不打開它。

    同時我也有用稍後閱讀(Read It Later)的應用,我選擇Pocket只因為它做得還不錯,而且是免費的,同時還有支援手機的APP,還支援Offline閱讀;而臉書也有自己的儲存連結,我把它用來紀錄臉書上看到不錯的文章,但我在裡面也塞了幾百個連結但從不打開。

    這些工具讓我們覺得安全,讓腦中那些有趣的連結(回憶)永遠存在世界的某個地方,但對腦袋來說並沒有消化任何內頁的知識,而只像個龐大的圖書館但只有目錄;就像我買的那些書一樣,除了有些封面挺有設計感,可以當作書櫃的裝飾外,對它的內頁仍然一無所知。

    但現有的工具似乎沒有辦法把這些氾濫的資訊處理得很好,有天偶然在做捷運時又再想了一次這個問題,頓時覺得閱讀文章的類型跟閱讀時的場域有很大的關係,例如坐捷運的時候就不適合讀長文章,因為隨時就要換車或者讓座;而在慵懶的下午就適合看些長文章,以及跟工作沒什麼相關的主題;而工作時最適合看能夠解決問題的文章,或者能提升工作能力的文章。

    有了這個想法後,開始就把Pocket裡面的文章利用Tag的功能把每篇文章貼上像是Work、MRT、Holiday等等,就在適合的時間把相對應的Tag消化完畢,我想應該會有更專門的服務能幫助用戶把這些"回憶"處理的更恰當。

文中提到有250分頁塞在瀏覽器裡,這些分頁雖然不佔記憶體,但跟放在連結墳場沒什麼兩樣,所以我花了一個下午把它們分類並塞到Pocket裡面(當中也丟了一堆後來看起來不重要的連結),如同標題提到的"斷捨離"的技巧用在分頁上,最重要的概念是:

    處理資料不應該是一口氣解決,而是不斷迭代的過程,如同看書也不該是從第一個字看到最後一個字(小說可能可以這樣),而有點像金字塔的結構,從最上層的概念(標題),抽絲剝繭的往下看(目錄),到最後每個章節的每個字句,有點像麥肯錫在用的金字塔原理。有時看到某個層次後就可以停止閱讀下去。

完整的Flow有點像:

瀏覽器 --(開啟連結)--> 分頁中 --(添加Tags)--> Pocket --(offline備份)--> Mobile APP


後記:最近才發現Pocket發現相同的問題,開始替每個Link加上分類標籤像是Best Of、LongStory或者ShortStory,應該非常多人跟我把一堆Link塞到Pocket然後就不讀它了。

Nvidia GTC Conference


  在網路上看到的活動,我自己是沒寫過Cuda,對OpenCV也沒直接操作過,只有用Engine來開發過,會參加這個活動也是純粹看看不同領域東西的心態,果然一到會場就覺得跟我所處的世界有很大的不同,大概所有有用到NVidia顯示卡的硬體廠商都來了,而主要也是在推廣他們的主機有多少GPU在上面,跑的效能曲線有多高,可以說是另一種類型的電腦展。

但開場的Talk倒是挺吸引我的,連NV也對於DeepLearning的領域有高度興趣,可能現在所以
ML相關的運算很饑渴吧?!而NV大概跟Intel等晶片公司想的差不多,那邊有計算的需求就往哪跑,對他們而言都是靠相同的玩意賺錢。

    而其中一個講者是騰訊的ML部門負責人,同時也是一位教授,他說了蠻多騰訊的核心理念跟成長過程,以及每個有用到ML功能的細節,我對ML或者DeepLearning也是新手的狀態,倒是沒有真的好好把這個黑盒子實作出來。不過如同一開始提到,我是真的來走馬看花找關鍵字來刺激想法的。

超過六億的用戶實在很噁心


不知道多少的虛擬紅包在今年過年送出

WeChat有用到的AI技術們

這功能對我來說挺特別的,廣告變成另一種身份地位的象徵

個人廣告的資料

全中國有超過兩千萬人是盲胞,這塊跟台灣人數差不多了,花個60秒替他們讀個一小段,能夠享受獲取知識的平等。但後來覺得可以透過Google翻譯直接唸出不就可以了?

語音辨識用的技術
他們如何用GPU加速運算 
這是語音匹配用的技術
WeChat的核心原則

2015年8月23日 星期日

Implementation of Undo/Redo on Android



    最近公司的產品拼貼趣想做Undo(上一步)和Redo(下一步)的功能,因為使用者常常不小心就把拼好的作品誤移,然後又很難移回來,其中一個發想就是參考Photoshop可以做Undo/Redo(還有其他發想例如把某個Layer鎖住的功能),聽起來對現在的code非常有挑戰,但還是花了一個下午做出第一版Prototype(只支援Undo),看起來會動只是畫面會狂閃;後來iOS的同事才跟我介紹他們實作的方式 - UndoManager

    秀了幾行code給我看後,感覺這個設計架構根本就超好,結果Android內建沒有這套實作,結果它藏在Android Framework裡,而且命名規則也很iOS(每一個Command叫做Operation),感覺是給內部UI Widget用的功能。

    解決這類型問題也有常用的Design Pattern,在SO找到這篇推薦Command Pattern,有空再來消化這個Pattern的其他應用方式。


2015年8月22日 星期六

Android Vision library

   Google Play Service 7.8 introduces the android vision library. that can easy to implement the function of face detection and barcode reader. the best part of it is that supports android 2.2 devices. you can checkout the sample code here.

Random idea: the traditional digital camera support smile mode. that means you can take photo by your smile face. now you can do the same thing on the android app. or you can trigger it by a wink

 

Solving the confliction on Android BuildToolsVersion 23 with RenderScript v8 library

If you using renderscript support library, and you try to upgrade the android tools version to 23.0.0. you will get the issue likes when compile your project :

UNEXPECTED TOP-LEVEL EXCEPTION:com.android.dex.DexException: Multiple dex files define Landroid/support/annotation/AnimRes;
at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:554)
at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:535)
at com.android.dx.merge.DexMerger.merge(DexMerger.java:189)
at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:502)
at com.android.dx.command.dexer.Main.runMonoDex(Main.java:334)
at com.android.dx.command.dexer.Main.run(Main.java:277)
at com.android.dx.command.dexer.Main.main(Main.java:245)
at com.android.dx.command.Main.main(Main.java:106)

it cause the renderscirpt support library includes the annotation library's source code. you can solve this issue by adding a few of code in build.gradle

configurations {
    all*.exclude group: 'com.android.support', module: 'support-annotations'
}

reference : http://stackoverflow.com/questions/32051938/getting-multiple-dex-error-when-using-render-script-support-lib/32090710#32090710

2015年8月1日 星期六

Feedback : Upgrade Android M Preview 2

   最近大膽地將自己的Nexus 6升級到Android M的Preview版本,正所謂第一次將Preview版本用在自己手機就上手,反正也是前陣子才從iPhone換成Android,該遺失的資料也早該丟光光了,正所謂沒什麼很失去的時候,人就會變得特別有勇氣。

以上是用起來的後果:

1. Google Now Launcher瘋狂閃退:只要你用adb裝一次apk它就一定閃退給你看
2. Line已不舉:不知道它用了哪個API來檢查網路狀況,升級過後你永遠沒辦法登入Line的帳號,它只會不停的跟你說: "Please make sure that you have network connectivity and try again",這也表示Line的所有遊戲都GG了
3. 如果你是開發Camera App,可以特別把Camera的permission關掉,當你Call Camera.open()時就會拿不到Camera,請做好error handling,以我們的App(SelfieGrid)來說,雖然不會crash,但就剩黑畫面

如果還有其他後果歡迎與我分享


TabLayout will get empty Tab after upgrade design library to 22.2.1

  Google introduces the design library for making material design easier. so we reimplement the tab component by TabLayout. it's work perfectly in 22.2.0. but we get problem after upgrade the version to 22.2.1. the tab doesn't show up anymore(issue track).

  it's work on some place, but some one isn't. we couldn't figure out what is the right way to handle this. so we decide to rollback the version to 22.2.0.








2015年4月25日 星期六

Fresco : an image management library





    書在F8發表了自己的Image Loader Library(Android)叫做Fresco,因為他們在市面上找不到完全符合需求的Library,所以自己就寫了一個(這邏輯很Facebook),它主要強調功能有五:1)有更佳的記憶體管理、2)支援Progressive JPEG、3)Animation Format(GIF和WebP)、4)Drawing(更整合customize layer:例如想要塞浮水印之類的)以及 5)更加的Loading體驗。

針對第五點想要特別強調:1) 它可以同時設定多種resolution的圖片,讓較低解析度的圖片先秀出、2) 支援EXIF Thumbnail、3) Auto-resize rotation(base on EXIF)、 4) 讓Android 2.3的裝置也支援WebP。

翻了翻它的source code發現,所以decoder都適用NDK寫的,包含jpeg、png、gif跟WebP真的是佛心來著。看來該把原本在用的Ion拔掉了。


2015年4月8日 星期三

GIF Encoder on Android



    近跟臉書的Messenger Platform合作了一款新的APP叫做GIFCAM(希望大家趕快去下載來玩唷!),看APP的名稱就知道跟GIF格式有所相關,今天想要分享(抱怨)在開發中碰到的痛點之一GIF Encoder。

為什麼痛呢?第一沒有官方support的版本(iOS在ImageIO Framework裡);第二有3rd party library是存JAVA的solution,但performance就是差到很誇張;第三想找NDK solution但找不太到標準或比較常用的library。

基於上面的思路,想必要自己把它擠出來了,所以我參考了一個半成品叫做Gifflen,看起來是我們想要的答案,但是,它的code style不太像個OK的library,果然用了之後碰到很多問題,細節之後再透過其他文章跟大家分享,總之為了要達成像iOS ImageIO的效能,我們把GIF的Spec認真的看了一遍,一個一個byte去看iOS為什麼可以做得比較好(之後我們會把自己的Gifflen再open source出來),目前雖然沒有達到一樣,但效能跟輸出結果還差強人意,勉強可以通過測試並且上線。