2015年12月10日木曜日

[Event] 2015/09/26 日本酒主義

鍵人對於日本酒可說是一竅不通。平常幾乎沒有在喝。最大的原因是鍵人在台灣看到的清酒都是以不合理的價格在做販售。怎麼可能去買勒...

為了多些經驗,還是參加酒展最快啦。
所以今年就多了這篇日本酒的參展紀錄。

老規矩,參展之前一定要吃飽飯。剛好展場在信義區附近,於是挑了這間開幕沒很久的新店:一幻來試試。台灣終於有甲殼湯的拉麵店,真的要高興一下。

圖上的是濃厚豚骨味增+叉燒。濃度沒有問題,只是豚骨的味道壓過甲殼湯,有點可惜。
下次改點原味試試。


喝日本酒當然要用日式杯。這次就由相聚一刻的Piyo豬口杯陪伴全程。
禁止酒駕分隔線禁止酒駕分隔線禁止酒駕分隔線禁止酒駕分隔線禁止酒駕分隔線禁止酒駕分隔線禁止酒駕分隔線禁止酒駕分隔線禁止酒駕分隔線禁止酒駕分隔線禁止酒駕分隔線禁止酒駕分隔線


週末的下午,場內相當熱鬧。


繞了一圈,想不到該喝哪款。逛到這攤,第一次的出征,「初陣」這酒名相當配。
所以就從這隻開始。感覺還不錯。沒有釀造味,清爽口感,純粹的米香。第一隻就有不錯的印象。


華吹雪是偏淡的口感。


男山的味道重,辣,有蘋果味,有尾韻而且是芋頭味。


雪の茅舍長在尾韻。


まんさくの花 純米大吟釀:尾韻不錯。偏辣。
まんさくの花 祭:酸度跟平衡。有點酸度的酒比較不會膩。


醉樂天:偏甘口。
古式 純造り:尾勁強。
春霞 華兆:尾勁強。


銀河鉄道の夜:多種味道混在一起,相當有趣的一款。


純米酒 初孫:鍵人判定本場次的MVP。 第一次讓我知道「生酛」的厲害的一隻。
香氣之重令人驚訝。一口就知道這隻就是不一樣...
酒本身的酸,甘,香,刺激辣感之外,熱,溫,冰不同溫度帶來的味道也不一樣。


香梅:辣,淡。



楯野川 出羽燦々33%:甘,酒體濃,偏辣。


山櫻:辣
笹の川 純米酒:淡。


威士忌 山櫻Cherry: 硝味,嗆辣,尾韻回甘。


穩:果香。
自然酒 純米吟釀:微酸,甘,微辣,果香,飽滿的感覺。印象相當好。







真野鶴 綠瓶:芭樂味,微辣,微酸。
真野鶴 紅瓶:芭樂味,微辣,微酸,還多了股豬油味。
真野鶴 純米1901號:比紅瓶的豬油味更重!
万穂 真野鶴:微甘。
+


辯天 純米大吟釀:尾韻有不錯的米香。


濃厚古酒(葡萄酒):波特味www
喝到這邊已經不知酒味了。無評語的就請多包涵。


富成喜 純米吟釀:尾韻不錯。



白岳仙 五百万石:糖味。
白岳仙 山田錦:香氣。
白岳仙 純米大吟釀:酒精味較強,尾韻甘甜。


無濾過 一次火:淡,酸,甘味,飽滿。



梅申春秋(梅酒):相當濃,甜而且有力。令人印象深刻。



整體來說只喝了5成的酒。實在是太多款了XD
其實也沒想到會這麼多... 而且清酒的味道差異並不是非常明顯。
結果就是味道比較特殊的出線。有找到自己喜歡的酒就是好事。
只是豬油味... Orz

2015年11月21日土曜日

[安藤]android將2MB的XML匯入DB,耗時由10分鐘 ->6秒的歷程



這次接到的任務是下載一個壓縮過的xml檔案,並灌入db裡面。
檔案下載之前已經寫好含db+cache管理功能的模組,zip也只要套個zipinputstream並預先分析zipentry是不是目標檔。
XML parser之前也已經用DOM格式寫好可以任意取text / attributes值的tool。
一切都是如此美好。



但是在遇到2MB的xml之後,完全變了調。
初次的完整執行,等了3分鐘開始不耐煩,以為跑進了無限迴圈。
開始加一些debug print,發現一直有在動,只好耐心等待。

等了5分鐘,真的等不下去,分析一下debug print,資料的重複性似乎很高,
有點擔心是不是會跑不出來。轉而步進分析,看看到底是慢在哪。

一開始步進,傻了...



  DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
  DocumentBuilder db;
  try {
   db = dbf.newDocumentBuilder();
   InputSource ii = new InputSource();
   ii.setCharacterStream(is);
   Document doc = db.parse(ii);
   doc.getDocumentElement().normalize();
   return doc;
  } catch (ParserConfigurationException e) {
   // Auto-generated catch block
   e.printStackTrace();
  }


以上這幾行就要1分鐘(debug狀態)。 Orz
常用的doc.getElementsByTagName(...); 一call就是幾十秒在算。
心想這不是辦法。趕快找資料求救。咕狗:「android xml dom parse too slow」
直到看到了這一篇:
http://stackoverflow.com/questions/7224318/how-to-solve-the-xml-parsing-performance-issue-on-android
才知道DOM parser之慢... Orz (上面那篇的圖表必見。)


看來把parser改寫成SAX格式是在所難免。還好之前有寫過並不會覺得太難,只是SAX的循序走查方式,對付xml階層很深的格式的xml很難寫。
目標的XML只有兩層,資料都用attributes帶入,就不需要考慮這樣的問題。
(開始覺得設計目標資料格式的人一定相當有經驗。)

改寫成sax格式之後再跑,果然是快多了。一口氣從10分鐘降為3分鐘。
不過還是在需要做task管理的範圍。結果又花了點時間寫暫停跟續傳。

但是,想要加速的想法並沒有這樣就停止。
看起來問題應該不是xml了。那剩下的就是在db的存取上面。
繼續查資料... 咕狗:「android db insert too slow」

又看到一篇:
http://stackoverflow.com/questions/3501516/android-sqlite-database-slow-insertion

介紹只要把db.insert(...)
用下面的方法寫

db.beginTransaction();
db.insert(...);
db.setTransactionSuccessful();
db.endTransaction();



就可以爆速。於是加了那三行。3分鐘變成30秒。 (抖)

30秒已經是可以不需要暫停背景執行的射程目標。
接下來就是繼續努力看看是不是可以再縮。
因為目前都還是使用單筆插入,於是把焦點放到bulkinsert(...)上面。
得一次全抓完資料再寫入,需要比較大的記憶體,為了速度這時也不在意了,
全部放到ArayList<ContentValues[]>去。

bulkinsert一樣加上上面三行,改成bulkinsert之後,降為10秒!
之前寫的task管理的操作正式宣告作廢。 雖然是好事啦。

繼續努力。上面那篇文中還提到一個技巧:


private void insertTestData() {
    String sql = "insert into producttable (name, description, price, stock_available) values (?, ?, ?, ?);";

    dbHandler.getWritableDatabase();
    database.beginTransaction();
    SQLiteStatement stmt = database.compileStatement(sql);

    for (int i = 0; i < NUMBER_OF_ROWS; i++) {
        //generate some values

        stmt.bindString(1, randomName);
        stmt.bindString(2, randomDescription);
        stmt.bindDouble(3, randomPrice);
        stmt.bindLong(4, randomNumber);

        long entryID = stmt.executeInsert();
        stmt.clearBindings();
    }

    database.setTransactionSuccessful();
    database.endTransaction();

    dbHandler.close();
}

這是使用db的compile sql方式(加速處理,不需要每次都sql command parse)然後綁參數的強力技巧。但是因為這方法需要照欄位的資料型態綁參數,加上insert所指定的欄位,每一個欄位都必需要有資料,其實有點麻煩。不過...

之前寫過一篇關於db架構的文。
用這篇提到的方法架構的db,稍微小改寫一下,要取得欄位名稱跟欄位的資料型態是輕而易舉。
改寫成此法之後... 降為6秒。 應該沒招了。到此為止。



備註:

  • 經由這次教訓之後,決心以後設計xml格式的時候,帶的參數一律用attributes帶。
  • 日期建議直接以字串存取。在不考慮時區的處理,yyyy-MM-dd HH:mm:ss格式是最好用的。要比對最小單位為秒的時間也很簡單,直接使用大小於比對就好。
    轉成Calendar / date等等日期格式再parse出來存將會拖累速度。反正android的sqlite,所有資料都是string存放(連數字都一樣)...



2015年9月14日月曜日

[Event]2015/08/15 WhiskyL

今年很神奇。兩場列酒展覽竟然衝堂。
一場是Whisky Live停辦之後,冒出來的展覽,在今年突然擴大出展。
一場是在展覽前全無資訊讓我十分不安的對岸主辦WhiskyL。

其實要視這兩場步衝堂的話,我都會去。
但是衝堂的狀況下就需要做一些取捨。
在經歷過某場買了貴貴入場券卻搶不到酒喝的慘況之後,想想還是跑便宜的場比較不會痛。
早鳥票價只要$400真的是太佛心,於是今年決定參加WhiskyL。



禁止酒駕分隔線禁止酒駕分隔線禁止酒駕分隔線禁止酒駕分隔線禁止酒駕分隔線




低票價自然會帶來一絲不安,深怕展覽的品質不足。到了展場,看到出展廠牌列表,
這樣的擔心煙消雲散。

場內第一杯是很重要的。因為舌頭還沒有受到影響。
其實場內大部分的品牌都喝過也有基本味道的掌握了,於是給了還沒碰過的深耕園BABUZA...

TN:聞有果香。入口覺得相當酸,很像不甜的果汁。有葡萄皮味跟些微的酸敗味...
不對我味。


深耕園渣釀白蘭地。相當嗆,原來是53%的濃度。接近義式GRAPPA的感覺... 不過是比較好的。
當Grappa賣的話應該還不錯。


這隻1847 cream著實讓我驚訝(先撇開它不是烈酒)。
蜂蜜的香味,清香,可樂的甜度。酸甜平衡,沒有雪莉酒會有的釀造味。當場帶走一隻...

這隻也列入之後會購買的口袋名單。PX等級的甜跟濃,甘蔗味,清爽不膩,PX的另一種style。

喝完低酒精度的之後,終於要開始烈酒啦。
這隻有甘味,溫順不嗆。味道是慢慢出來的,而且有後勁。
相當喜歡。

跟上一隻黃金鼠的味道接近,不過再重一點。高地區的味道是慢慢給,這隻把該出來的味道先給的感覺。

大摩12y,酒體輕,很強的甘甜雪莉桶味,一種嚴重吃桶吃到像白蘭地的感覺。

Diplomatico。這攤位上面展出三隻rum。
6y版:甘甜,簡單乾淨,順口。
8y版:再多草味,有點辣。
12y:跟zacapa非常接近,少了巧克力味多了古早糖果味。深得我心,又當場帶了一隻走...

中場休息30分鐘。快喝到分辨不出味道了...
進場人數也控制得恰當,整個展場給人一種輕鬆舒服愉快的感覺,喝酒本該如此。

繼續衝。百富12年三桶:

布納哈本27年。還好老闆願意給一點嘗嘗。
不愧是高年份的,花香,味道強烈奔放,順口不嗆。

這隻也很棒。

這隻是名副其實的spirit。63%,只有濃濃的麥香跟甘甜,溫潤不嗆。

這隻大潤發有進。輕泥煤,蜂蜜風味,有點淡。還好有先在這裡試喝... 總之不用買了


硝味,較為甘甜,輕泥煤,微嗆,味道夠重。


嗯。就VSOP...
順便單喝Vermouth blanc的調酒用基酒。 白葡萄,檸檬糖香,有點釀造味。
味道很像S社的Mistia,不過Mistia的味道重多了也比較沒有釀造味。


Rye Whisky!? 這啥... 趕快要一點來嚐嚐。
白橡木桶味,偏輕淡,微嗆。
後來查資料,叫做「裸麥威士忌」。難怪跟波本的味道不一樣...


喝完一圈之後,發現人散得差不多了,看了一下時間,原來接近結束時間了。
先來把場內照片補一補。人太多的時候不方便拍...










相信這次的展覽是相當成功的。期待還有下次嘍。