2016年1月2日 星期六

Practice Reative(Rx) - merge

http://reactivex.io/documentation/operators/merge.html

前言: 最近Rx相關的議題在Android圈特別熱門,除了在Android Weekly裡面的文章幾乎都會擦到邊,又或者很多公司直接把這個架構導入產品之中;對我來說,原本某些code就已經有這個概念的影子,例如Async的操作,我們是用Parse推出的Bolts來實踐Defer/Promise,但Rx的概念更為通用,這表示Async的功能只是其中之一;學習Design Pattern最重要的是套用實際案例,所以以後Practice Reative(Rx)的系列文章,將針對各個component如何套用到實際的問題為目標

今天要聊到merge,其概念就是將數個Observable合併起來,你可以用在把所有Error report的Observable合併,再透過統一方式去處理,而此範例將搭配RxBinding跟map來解決Report Flurry Event的問題。

假設UI(此Sample Code來自好事地圖的專案)有8個按鈕都要report不同的event到flurry,你可以這樣寫(Gist)



如有更多有趣的使用方式歡迎分享。

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的核心原則