2016/05/05

JavaMail透過GMail送信遇到的問題

這樣的技術文件,網路上應該很多了,那些詳細的實作就不贅述
套著網路上的資訊,使用了下面的參數


結果遇到了下列的exception

javax.mail.MessagingException: Can't send command to SMTP host;
  nested exception is:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at com.sun.mail.smtp.SMTPTransport.sendCommand(SMTPTransport.java:1564)
at com.sun.mail.smtp.SMTPTransport.sendCommand(SMTPTransport.java:1551)
at com.sun.mail.smtp.SMTPTransport.ehlo(SMTPTransport.java:935)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:426)
at javax.mail.Service.connect(Service.java:310)
at javax.mail.Service.connect(Service.java:169)
at javax.mail.Service.connect(Service.java:118)
at com.ruby.vtun.entity.GeneralMail.send(GeneralMail.java:133)
at com.ruby.vtun.entity.GeneralMail.main(GeneralMail.java:161)
Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1884)
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:276)
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:270)
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1439)
at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:209)
at sun.security.ssl.Handshaker.processLoop(Handshaker.java:878)
at sun.security.ssl.Handshaker.process_record(Handshaker.java:814)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1016)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312)
at sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:702)
at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:122)
at com.sun.mail.util.TraceOutputStream.write(TraceOutputStream.java:114)
at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)
at com.sun.mail.smtp.SMTPTransport.sendCommand(SMTPTransport.java:1562)
... 8 more
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:385)
at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292)
at sun.security.validator.Validator.validate(Validator.java:260)
at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:326)
at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:231)
at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:126)
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1421)
... 19 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:196)
at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:268)
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:380)
... 25 more


經過被蹂躪了一陣子,總算發現是我的防毒軟體Avast作怪!把Avast關掉,就可以正常送信了。
要解決這問題,除了關掉Avast外,可以透過更改Avast的設定來解決,因為目前是使用port 587來送,只要把587從Avast的設定中拿掉,就可以正常送信了

2016/02/03

你、我、他

記得在服役時,長官都交代不說「你我他」。那時也不知道原因,問班長他也說不出為什麼,只說從以前就這樣,不要問太多,遵守就對了!

經過這些年來的歷鍊,逐漸地端倪出這個規定真的是很受用的規定。
口語上少用「你我他」,多用「我們」,除非讚美他人時

因為你我他有高度針對性
當語氣拿捏不好時,很容易讓聽者有不同的詮釋
用「我們」,則讓人覺得你我是同一團隊,禍福與共
後面的那些話,聽起來就不那麼刺耳了

GCM SERVICE_NOT_AVAILABLE

今天又遇到怪事了
在修改一支Android APP,這支APP有用到GCM來做push notification,但是修改的點只有在UI的部份
修改完放到Samsung Galaxy Mega(4.2.2)一跑就當,以前沒發生過這問題
查了一下,是跑到GoogleCloudMessaging的register()就當,這段程式應該是很標準的寫法

if (gcm == null) {
    gcm = GoogleCloudMessaging.getInstance(parent);
}
String regId = gcm.register(Global.GCM_SENDER_ID);


丟出來的exception是SERVICE_NOT_AVAILABLE
java.io.IOException: SERVICE_NOT_AVAILABLE
at com.google.android.gms.gcm.GoogleCloudMessaging.register(Unknown Source)
at com.ruby.switch2go.manager.GCMHelper$GCMAsyncTask.doInBackground(GCMHelper.java:76)
at android.os.AsyncTask$2.call(AsyncTask.java:287)
at java.util.concurrent.FutureTask.run(FutureTask.java:234)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
at java.lang.Thread.run(Thread.java:856)

把程式放到ASUS Nexus 7(6.0.1)上跑,耶!一樣的程式,卻可以正常執行喔。所以應該不是程式的問題,那...難道是Android版本的問題?

再找來另一支6.0的手機,嗶~~~,還是SERVICE_NOT_AVAILABLE!
看來應該不是Android版本問題了
這幾台的Google Play Service都是8.4.89版的

再回到Samsung GALAXY Mega,用另一個類似但sender ID不同的程式來跑,卻又正常了

看了這篇Google Cloud Messaging is Extremely Unreliable for Push Notifications,手機端能檢查的都看過,好像也無解。

那~~~問題在那裡?真的是Google server-side的問題嗎?
是不是不同的phone token與sender ID會分派到不同的server去處理,而負責DUT的server剛好這時候有問題了?

果然,時間是最好的解藥。經過兩個多小時的等待,一切都恢復正常了。看來,是GCM server-side有問題了。




2015/12/05

ABCDE 的期勉

Dr. Jay Lee 在一次演講中提到,他在lab的牆上貼著ABCDE五項目以期勉大家

A - Attitude (態度)
B - Breadth (寬度)
C - Curiosity (好奇)
D - Dedication (專注)
E - Execution (執行力)

我覺得還可以加上一個
F - Foresight (遠見)

與大家共勉!

2015/11/22

螞蟻給我的省思

每天早上掃地時,除了落葉垃圾外,總是會掃了許多螞蟻。如果馬上畚起來打包進垃圾袋,這些螞蟻可能會跟著落葉垃圾上垃圾車,然後進焚化爐,結束那短短的生命。

不忍,所以總是會隔段時間再畚,讓這些已被變故驚嚇的螞蟻懂得反應,在有限的時間趕快逃離。

有時,總是會聯想到上帝是不是也會這樣,當要有變故時,也會先給我們一先徵兆,預留一些時間,讓我們能有機會作反應。

想起約五年前很流行的一部影片《改變世界的6度C》,裡面提到每升高一度,會有怎樣的改變(內容摘錄於後),其中一個很重要的論述就是2度C會是一個臨界點,當上升超過2度C時地球暖化的趨勢將全面失控,形成惡性循環越演越烈,簡單說當超過這個臨界點後,不管做再多的努力都回不去了!

在2010年時,已經上升0.8度了,2012也來到0.85度了(有興趣的朋友可以關切這裡)。雖然有許多科學家並不認同這個氣候模型,但是已經是11月下旬的小雪日,我們仍然穿著短袖開電扇(甚至冷氣),相信大多數的人都承認這種氣候有問題了。

大部份的螞蟻會在我畚起垃圾前逃離。
老天已經給我們算是很明顯的徵兆,也給了我們時間作反應,我們有辦法作得比螞蟻好嗎?還是要繼續麻木無感,耽於逸樂,只重眼前利益?

註:摘錄自這裡
全球氣溫上升攝氏一度 
- 北極圈可能半年不結冰,傳說中的西北通道打開,讓船隻通行。 
- 漲潮可能淹沒孟加拉灣周遭數千棟房屋。 
- 氣溫上升攝氏一度可能引發颶風開始侵襲南大西洋。 
- 美國西部的嚴重旱災可能導致全球穀物和肉類市場短缺。 
- 美國西部的乾旱地區可能變回沙漠般的環境。 
- 氣溫上升攝氏一度,可能促成英國的農業大改變,之前無法在英國生存的農作物將開始蓬勃生長。英國如今有超過四百座葡萄園,種植通常在法國生長的葡萄。 

全球氣溫上升攝氏兩度 
- 格陵蘭的冰河以更快的速度持續融化。事實上,格陵蘭的雅各布港冰川(Jakobshavn Glacier)已是全球移動最快速的冰原;每隔幾天從冰河斷裂的冰塊水含量,足以供應紐約市一整年的用水。 
- 因為海洋冰原減少,北極熊成為瀕臨絕種的動物。 
- 昆蟲可能往奇怪的新方向遷移。舉例來說,當溫和的氣候移到美國北部,松樹甲蟲可能會摧毀廣大的白榕樹林。 
- 森林開始在融化的加拿大凍原生根成長。 
- 太平洋吐瓦魯群島(Islands of Tuvalu)可能被上漲的海潮淹沒。 
- 當氣溫上升兩度,海洋生態系統受到的衝擊可能很嚴重;全球大多數的熱帶珊瑚礁可能會成群死亡。 

全球氣溫上升攝氏三度 
- 在全球氣溫升高三度的極端情況下,亞馬遜雨林可能經歷重複不斷的乾旱和火災循環。倘若我們失去大片的亞馬遜雨林,數億噸儲存的二氧化碳可能會重新釋放,可能讓全球暖化再升高一度。 
- 氣溫上升攝氏三度,導致阿爾卑斯山山頂的積雪消失。 
- 地中海和歐洲部分地區夏季極度乾燥酷熱。 
- 隨著海洋愈來愈熱—一種極度不穩定的全球氣候模式出現,也許會反映出所謂厄爾尼諾現象(El Nino)的天氣異常。 
- 假如地球溫度上升三度,下一代的超級風暴:首批六級颶風可能會出現。 
- 許多科學家將氣溫上升三度,視為地球上生活方式劇烈改變的臨界點。 

全球溫度上升攝氏四度 
- 氣溫上升攝氏四度可能導致海平面持續上升,淹沒人口稠密的三角洲:如孟加拉和埃及等國家可能被毀滅,如威尼斯等城市可能會被完全淹沒。 
- 恆河是中國、尼泊爾和印度超過十億人口的生命泉源。首先,注入恆河的喜馬拉雅山冰河融化雪水,可能會宣洩史無前例的大洪水。然而,假如冰河完全消失,也會發生極嚴重的缺水和飢荒問題。 
- 研究顯示以目前的流失速度,到了2035年,喜馬拉雅山脈的冰河將全部消失。 
- 加拿大北部可能成為全球最豐收的農業區域之一。 
- 整個西南極大冰原可能會崩塌,造成海平面更進一步升高。 
- 氣溫上升四度時,海平面可能上升超過一公尺,全球的海岸大城市將面臨大災難。 

全球氣溫上升攝氏五度 
- 兩個不適宜居住的巨大區域,可能延伸到南北半球原本的溫帶地區。 
- 供水給全球某些大城如洛杉磯、開羅、利馬、孟買的高山積雪和地下含水層可能將枯竭。 
- 氣溫上升攝氏五度時,氣候造成的難民可能會增加至數千萬人,爭奪極有限資源的潛在衝突可能一觸即發。 

全球氣溫上升攝氏六度 
- 當氣溫上升攝氏六度,世界可能變成像一億四千四百萬到六千五百萬年前的白堊紀時代,當時全球的氣溫比現今高許多。 
- 營養素消失的海洋可能會變成亮藍色(bright blue)。 
- 沙漠如同勝利大軍一般,在各大陸成功開疆闢土。 
- 天災成為家常便飯,世上某些大城市可能會被淹沒或遺棄。