Error:Android Dex: [xxx] Failed to load dx.jar

前陣子把開發環境升到 Android 8.0 就是26這個版本,今天開舊的專案發現全部爛掉不能 build,命令列會吐以下 log:

Error:Android Dex: [xxx] Failed to load dx.jar

比對一下這些舊專案的特徵,都不是用 gradle 而都是用 Intellij 15 來建構,而建構的預設行為上網找是會去找最新版的 build-tools 來用(如下)。

By default, the Android SDK uses the most recent downloaded version of the Build Tools.
嘗試過在 project.properties 裡頭加上 sdk.buildtools 17.0.0,嘗試要指定比較舊版本的 build tool,但完全無用,看起來 Intellij 15 沒有用到專案下(非 gradle 專案)的 ant 相關檔案,就根據專案設定的 Java SDK + Android SDK 就自己用預設值做建構了。

解決方式如下:

方法一
利用 SDK Manager 將 Android SDK Build-Tools 移除26.x.x版本,改用25.0.3。有確認過 25.0.3 和 26.0.2 的這些項目:
  • build-tools/25.0.3/dx > 檔案有存在該路徑
  • build-tools/26.0.2/dx > 檔案有存在該路徑,且內容與25.0.3一模一樣
  • build-tools/25.0.3/lib/dx.jar > 檔案有存在該路徑
  • build-tools/26.0.2/lib/dx.jar > 檔案有存在該路徑,但檔案大小與26.0.2不一樣

方法二(官方作法)
若 Android 專案是走 gradle 架構,可以在 build.gradle 裡指定要該專案要使用的 Build-Tools 版本。


另外測試過以下排列組合:
  • Android SDK 17
    • Java SDK 1.7 + Build-Tools 25.0.3 > Error:Android Dex: [xxx] Exception in thread "main" java.lang.UnsupportedClassVersionError: com/android/dx/command/dexer/Main : Unsupported major.minor version 52.0
    • Java SDK 1.8 + Build-Tools 25.0.3 > 沒問題
    • Java SDK 1.7 + Build-Tools 26.0.2 > Error:Android Dex: [xxx] Failed to load dx.jar
    • Java SDK 1.8 + Build-Tools 26.0.2 > Error:Android Dex: [xxx] Failed to load dx.jar
  • Android SDK 26
    • Java SDK 1.7 + Build-Tools 25.0.3 > Error:Android Dex: [xxx] Exception in thread "main" java.lang.UnsupportedClassVersionError: com/android/dx/command/dexer/Main : Unsupported major.minor version 52.0
    • Java SDK 1.8 + Build-Tools 25.0.3 > 沒問題
    • Java SDK 1.7 + Build-Tools 26.0.2 > Error:Android Dex: [xxx] Failed to load dx.jar
    • Java SDK 1.8 + Build-Tools 26.0.2 > Error:Android Dex: [xxx] Failed to load dx.jar

用 Google Sheets 爬網頁資料


Google 提供的試算表很好用又免費,很多人拿來做自己系統的運算,如果今天有個表格欄位是要填網頁上的某個文字,每次都要自己手動填是不是很麻煩,不用另外寫程式(script),只要學會 IMPORTXML 和 REGEXEXTRACT 兩個函式,就可以完成這個需求。

以下用抓網頁上的報價這個情境當作範例,帶大家走一次。我們想要抓 https://www.f2pool.com/help 上面乙太幣的24小時理論收益(下圖紅字處)。


先使用 IMPORTXML 函式

利用 IMPORTXML,可以抓網頁上指定的區塊。
  • 第一個參數要填網址,填上 https://www.f2pool.com/help
  • 第二個參數要填 XPath 代表某個網頁區塊在 HTML 裡的位置(往下看有教你如何用 Chrome 取得 XPath),在此我們填上 //*[@id='miner-overview']/div/table/tbody/tr[6]/td[5]/strong[1]
    • 使用 Chrome 選取要的文字,右鍵按檢查就會跳出開發者主控台,它會跳到該文字在 HTML 上的位置。

    • 開發者主控台選取 HTML 上的位置,右鍵按 Copy > Copy XPath 就能取得 XPath。這邊取得為 //*[@id="miner-overview"]/div/table/tbody/tr[6]/td[5]/strong[1]

    • 把剛剛取得的 XPath 裡頭的雙引號改成單引號,要不然函式會出錯。
上述完成後,我們可以看到試算表已經正確顯示了“0.00047846 ETH 每 Mhash/s”這個字串。


但我們只想要數字,不想要後面多的描述,這時候你就至少要懂一下正規表示法了,不用到可以憑空寫出但至少要能做到邊看規格邊改的程度。如果真的看不懂那也不勉強,至少不用開網頁就手動複製要的那段數字吧。

使用 REGEXEXTRACT 函式

利用 REGEXEXTRACT,可以從字串中擷取出我們想要的部分。
  • 第一個參數填上字串或是表格,這邊我們填上表格。
  • 第二個參數填上正規運算式,這邊我們填上 \d+.\d+ ,白話就是找出這個字串中有小數點的數字。


上述完成後,我們可以看到試算表已經正確顯示了“0.00047846”這個字串。

寫在最後

上述方法碰到一些用 JavaScript 動態更新的網頁上會失效。這做法並不會一直更新,而是會暫存這結果約兩個小時才會在更新,如果想要進一步做到定期更新的話,就需要利用 Google App Script 去定期更新這張試算表,這篇有破臉書100個喜歡再來花時間介紹好了。

2017 沖繩自駕還是自虐六日遊


上次出國已經是三年前的事情了,一方面這年紀的小孩常常病毒碼更新,假根本不夠用。另外一方面小孩出遠門,我怎麼想都是很吃力不討好的活,所以出國計畫一直只擺在心裡,連假只能看大家出國的照片咬手指頭,臥薪嘗膽忍了三年,終於輪到我了。

臉書牆上朋友帶著一家老小敗家逛街看風景,總是笑容滿面樂開懷,這次實際走一趟,更,這笑容後面都是多少血淚堆砌而成。三個大的總是被兩個小的打敗,一定要一個大的犧牲自己另外兩個人才有得逛,在飯店還好,在外面根本慘不忍睹,突然要上廁所就要一大兩小一起上廁所,狼狽的要死。

老大長大了,心情好的時候可以當作半個戰力使用。小的根本出國開無雙,一下要坐推車,一下要尿尿,一下想睡在歡,一下睡醒起床氣,六天下來回台我覺得我脾氣天下無敵好。

這篇下面也沒啥行程可參考,本人流水帳紀念一下而已,部落客夢已碎,寫個身體健康讓人知道我還活著。

租車


最一開始(2016年10月)初步規劃是全部電車或巴士移動,本人開車苦手,後來年初開始在 Google Map 拉路線規劃,雖然我只玩美國村跟市區,但市區電車只有一條涵蓋率不夠,美國村去公園或 outlet 的公車班次也不太妙,想到小孩在大眾工具上哭鬧,還是尿尿沒趕上坐車時間,到時氣氛一定很差,只好犧牲我自己當司機換得其他人輕鬆一些。事後證明也沒錯,至少哭鬧都是在車上不影響其他人,狀況好時其他乘客還能打個小盹。

OTS 沒有比較便宜,但就是強在中文支援強,網站有中文,有會中文的工作人員,LCC 航站不用轉車直接接送。原本是租 Nissan Note (比較像我在開的 tidda)臨時被告知可以升級到七人坐的 toyota ESTIMA,沒在開大車的我不知為什麼鬼迷心竅就答應升級了,坐的人很舒服啦,空間很大又有天窗,對我來說真的太大台了,看照片就知道這台車可以把整個停車位塞得滿滿的,真的很考驗我駕駛技術啊。

實際上路部份,除了第一天比較可怕以外,不習慣空間感,不熟悉導航,還要開上高速公路,其他幾天就開的比較順手,雖然沖繩有些路比較小條,起伏也比較大,但路上碰到的開車習慣都很好會讓,也很少路邊停車,景點賣場都有很多停車位,整體來說道路駕駛的壓力比台灣輕鬆許多,如果會開車的話真的建議租車,尤其當小孩在車上哭鬧亂吵時,你會慶幸現在不是在電車上。

住宿


美國村第一晚是住 Monpa 公寓式飯店,廁所/浴缸/洗手台都分開的,另外還有流理台。每一間都有一個陽台面海。早餐是發劵在飯店旁的咖啡廳,有洋式日式可以選。


美國村後兩晚住的是 The Beach Tower of Okinawa,不一定能面海,住高樓層的話其實有沒有面海的景觀都很棒。我住那間洗手台廁所洗澡都在一起,雖然空間比 Monpa 大但反而常要排隊搶廁所。早餐是自助式吃到飽,然後有一小區小孩自助區。


市區是住エスティネートホテル,靠近美榮橋站,離國際通也不遠,不過有小小孩的話還是要用推車推去國際通吧!房間就小小的跟去日本住的商務旅館差不多,一樓的開放式用餐空間很舒服,早餐現做的有四種可選。飯店有合作的停車場一晚800羊,有點像逢甲那種俄羅斯方塊停車場(擠的滿滿的),現場有人會幫你移車,如果隨時要用車就會不太方便,附近的停車場就要注意一下價錢,像我就一個不小心一晚就停了3700羊,車上氣氛瞬間凝結。

景點

基本上每個景點我做的事都差不多,停車,追小孩跑,帶小孩上廁所,抱著在歡的小孩,有力氣的話就趕快拍拍照,販賣機投一投喝個涼的。美國村住了三天,我只熟悉北谷公園的沙灘,人生...




中城公園的遊樂設施,部份設施整修中(更)。附近沒有什麼便利商店,要野餐的最好先買好再來。遊樂設施很有誠意沒話說,大小孩到小小孩都有得玩。




AEONMALL OKINAWA RYCOM,沖繩中部的大型商場,吃的喝的買的都有,小朋友推車有兩種,我本文最上面第一張照片有拍到,一種是小車車(比較少台然後不好睡),一種是可坐可躺的(比較多台然後小朋友很好睡),四樓有個遊樂場除了花錢玩,裡頭也有一區可以免費玩積木火車休息的空間,網路上只有提到四樓開放空間有個遊樂區,實際看那是小小小孩玩的,我猜應該是爸媽逛櫃都來不及了,才會沒發現這好地方。

整個商場超大,用餐空間也超舒服,沒買東西逛逛躲太陽躲雨也是很好玩,最少也是要排一整個半天要不然會有遺憾,林北是來了兩個下午,但都是在這個遊樂場,所以也是有遺憾...


美國村,住了三天,真的沒啥好寫的,不是在沙灘玩就是再往沙灘的路上...

裡頭吃的東西都是偏美式的,要吃日式的要走一小段到58公路,不過話說我這次也沒吃到吉野家、松屋之類的店...


浦添大公園,超長溜滑梯使用禁止(更),遊樂設施很有誠意沒話說,大小孩到小小孩都有得玩(剛剛那段複製貼上)。


國際通,就墾丁大街升級版,要買紀念品的可以逛逛,個人覺得新都心比較好買,吃的選擇也比較多。


首里城,觀光景點,有大小孩的記得拿地圖蓋章,整個首里城有25個點可以蓋章,全部點跑完大概一個半小時也去了,小孩體力有消耗到,長輩也有看到古蹟,全部收集完會有小禮物。服務中心也有嬰兒車可以借,可坐可躺。

有大小孩的切記要一開始就要拿地圖!不要逛到一半才拿,到時又要重新跑回之前的點蓋章,切記!


OKINAWA OUTLET MALL ASHIBINAA,靠近機場的大型商場,裡頭吃的比較少逛的比較多,我只逛了 Under Armour,真的是有比台灣便宜的多,花車上還有三折的壓縮衣褲可買,在台灣買 Under Armour 真的是被當羊宰。


豊崎ライフスタイルセンターTOMITON,就在 OKINAWA OUTLET MALL ASHIBINAA 對面,會去不是因為裡頭東西好吃,是因為用餐空間有個大的遊樂設施,這真是我假日夢寐以求的用餐環境,住這邊的爸媽真的好幸福啊。

就跟三年前去大阪一樣,基本上現在不夾娃娃,不亂買用不到的東西,不買漫畫,不買電動,連成人書籍都不能買,逛的時間很少,唯一的樂趣就是亂吃了。


美國村裡 AEON 超市,學黃金傳說買過用餐時間的打折商品,這幾天晚上也是每天吃草莓,今年不想在看到草莓了。


Monpa 附的和式早餐。


中城公園買的餅皮夾紅豆冰淇淋,不知道是不是沖繩比較熱的關係,蠻常看到賣冰的販賣機。


串家物語吃到飽,自己拿食材自己炸,也有沙拉熟食(炒麵/義大利麵)甜點冰淇淋吃到飽,除了炸東西比較怕小小朋友去碰以外,推薦可以帶小朋友來體驗一下。


美國村摩天輪下面的博多麺琉美浜店的豆芽拉麵,原本要去吃グルメ回転すし市場,但是排隊排到哭出來,附近都美式餐廳,有小孩又不能走太遠,只能...




沒吃到壽司太怒了,把小孩送回飯店後,跑了15分鐘(沒誇張就是用跑的)到附近的はま寿司,也是大排長龍,等了25分鐘,花10分鐘吃,跑了15分鐘回飯店,花一小時多一點回去飯店交接換班。

不知道為什麼一個人給我安排一整張桌子,另外就是一開始搞不清楚有些盤子疊在一個藍色碗上代表是有人預定的,結果被我橫刀奪愛...


The Beach Tower of Okinawa 早餐吃到飽,他們日式早餐有豬腳、海葡萄這類當地特色餐點可選,另外水果真的很好吃,鳳梨、柳丁、香蕉都很甜,連我這種不愛吃水果的都說讚!真的推。

上圖是圖文不符小朋友吃的西式早餐。


炭烤牛舌 仙台NATORI的牛舌定食,不便宜但真的好吃。


ST-MARC CAFE 的草莓聖代。




老婆大人指定的焼肉きんぐ,燒肉100分鐘吃到飽,整整100分鐘我都不知道我是在吃肉還是在打小孩,小的跟蟲一樣100分鐘沒停下來過,又很怕他被燙到,又不知道為什麼點了石鍋拌飯,又不知道為什麼只有我有空可以拌,反正我吃的很狼狽,又有被嫌怎麼不幫忙點餐的冤屈。不過我們還是吃到最後一刻(執念真的很深),超強!

跟串家物語一樣,有帶小小孩不太建議來吃。


吃完燒肉喝點小酒平復我被誤會受傷的心靈,左上那個就是回飯店持續在亂動的蟲...


The Beach Tower of Okinawa 早餐吃到飽。


めん家的兒童餐和鮪魚井。


我部祖河食堂的三片肉餐,吃起來就是比較甜的爌肉飯。


全家便利商店的豬排便當。


エスティネートホテル 附的早餐


ガスト的鮪魚井。


Blue Seal 的抹茶聖代。帶小孩容易怒,要吃點甜的冰的比較有耐心。




海產物料理 市 的鮪魚井,因為時間不夠,只能外帶。


全家便利商店的排骨便當。住的附近沒有松屋之類的店,總不能宵夜吃燒烤或是牛排...


エスティネートホテル 附的早餐。這道是 Dome Pancake Plate,他們早餐是四種選一種,飲料則是喝到飽(有牛奶、果汁、咖啡...),如果你只有一次機會可以點這道,好吃。


星巴客的焦糖瑪奇朵,味道跟台灣一樣,無誤。


上機前最後一餐,販賣機的麵包和鳳梨汁。LCC 航站基本上就是個大的鐵皮屋,真的沒有啥東西可吃可買,如果你又是坐 OTS 的接駁車,他接駁車是搭配班機發的,而不是你想坐就發車,所以時間抓的蠻緊的,應該是完全沒機會去國內航站吃東西,最好就是還車前就附近的賣場用餐,超市買點零嘴。

看到最後真的屌

這六天下來,我覺得我體力跟 EQ 又成長到一個層次,每天司機、導遊、褓姆一直切換,所有重要事項都是兩人三腳,跟老婆互相 Cover,與其說是渡假比較像是重新確認彼此默契夠不夠。然後這次回來馬上就收心了,我兩完全無之前出國回來會有的倦怠感,果然是為母(父)則強,回來當晚就整理玩照片,隔天這篇文寫出來,我就打算忘光光了!

經過這次我也再次確認了,在小的沒有上大班前,我們應該不適合去東京大阪這種只有逛的地方,除非每天迪士尼或環球影城,短期內如果經濟狀況穩定應該就是每年沖繩了吧!等到家裡這兩隻變成媽媽逛街咖後,才是我出頭的那一天。

ELK 簡單介紹與架設

需求很簡單,手頭上的一個專案由不同的系統構成,每個系統有自己的 log,有些還不是 log 是寫進 SQL,當要追一個系統問題時,需要在不同的地方找線索串出整個問題發生的前因後果。這樣做不是不行,一來要連進不同的主機,不同的系統,要會下 SQL,要會下正規,查一次下來半條命都去了。

理想上應該將所有的 log 都倒進同一個地方,然後用一個美麗的網頁介面來呈現這些 log。原本想用 Springboot 自幹一個簡單的 Web APP 來做,剛好想到最近看的書 App 後台開發維運和架構實踐,有提到 ELK 這套日誌分析平台,號稱窮人版的 Splunk



ELK 大致架構如上圖:
  • logstash:讀取 log 檔案,讀取時可以做些處理,比如擷取有意義的字串產生一個新的欄位。最後將資料傳給 elasticsearch。
  • elasticsearch:可以想成 no SQL 的搜尋引擎。
  • kibana:連接 elasticsearch,提供一個網頁介面,讓使用者對 elasticsearch 操作,做搜尋、建立圖表、建立即時監控儀表板。
我架設的方法是用 github 上人家做好的 vagrantfile,大致上是用 vagrant 產生一個有 puppet 的 ubuntu,第一次啟動時,vagrant 再利用 puppet 和 script 去安裝 ELK 所需要的元件,順利應該是 vagrant up 完,本地端打開 http://localhost:5601/ 就連上 kibana 了!不用 docker 的原因是,本人目前環境還是直接給 vm 交接速度比較快,用 docker 可能還要花時間教學。

安裝步驟和踩到的雷就放在下方的 google drive 上啦,有需要的人可以拿去參考。至於 ELK 除了網路上外,我另外買了 ELKstack 權威指南,整理的不錯,可以省去初學者不少時間。

覺得看完後對你有幫助,可以用比特幣或是 ETHEREUM 打個賞,贊助一下本人,感恩。
  • 比特幣:13QhmaWSAGU6oeuzM3hKaAjt2sDegxbAgD
  • ETHEREUM:0x5d748f15a641413c3362ae6af37e5dcadf7edf62