武漢肺炎詳細解說-上海實況


最近鬧的人心惶惶的新型冠狀病毒,大家俗稱「武漢肺炎」,相信還有許多人一知半解,博主身為在上海工作的台灣人,有必要為了各位的健康,共同抵禦疫情,在此做個詳細的解說。

病毒來源:

病毒爆發處為武漢華南海鮮市場,根據基因組水平上與「蝙蝠冠狀病毒同源性為96%,意味很可能源于蝙蝠。然而蝙蝠與人類不容易接觸,可能中間還存在一個宿主,目前推測也可能是經由蝙蝠傳給蛇,在由蛇傳給人,不論如何,我們可以說病毒傳染的來源,便是這些野味

傳染途徑:

  • 通過咳嗽、打噴嚏等呼吸道的飛沫傳染(主要)」
  • 觸摸或握手等肢體接觸傳染
  • 觸摸帶有病毒的物體或表面後,觸摸嘴部、鼻子、眼睛等間接傳染」
  • 極少數情況也會通過糞便傳染」

病情徵狀:

  • 發熱、乏力、乾咳並逐漸出現呼吸困難部分患者症狀輕微,可無發熱
  • 潛伏期12天
  • 重症率14%
  • 致死率4%

預防方式:

  • 出門配戴口罩,醫用外科口罩、N95口罩(活性碳及一般口罩無用)
  • 勤洗手,酒精消毒
  • 避免人口密集處
  • 桌椅、地板可用漂白粉消毒

武漢現況:

  • 22日全天有近30萬人從鐵路離開武漢。
  • 2020年1月23日10點起,公車、地鐵、渡輪、客運暫停營運,機場、火車站離漢通道暫時關閉(封城)。
  • 23日上午武漢出城高速公路壅堵,下午則關閉高速公路。建立小湯山醫院(火神山醫院),可容納1000張床位。
  • 26日除經許可的運出車、交通車、公務車外,中新城區機動車禁行。再建一所小湯山醫院(武漢雷神山醫院),可容納1300張床位。
  • 目前為止26日中午武漢已有六百多人確診,湖北地區已破千人,許多民眾戴口罩,甚至出現塑膠袋套頭的情景,搶購超市吃喝用品囤貨。

各地現況:

不僅湖北地區,接連浙江、廣東都是、河南、重慶、湖南、安徽等各省,都將陸續突破百人大關,各地口罩已被搶購一空。然而還有許多省分皆不戴口罩,鬆懈看待,尤其較偏遠地區民眾。

上海現況:

博主附近藥局已經都買不到口罩了,戴著口罩在附近採購食物時,目測統計50十餘人,中老年人十人中約有兩人沒戴口罩。疫情目前不論在物資上或者重視程度都有待加強,預計年後返回崗位會再有一波增幅。

期望人人健康,疫苗早日研發出來,平安落幕。

WeChat 圖片_20200126133731.png

實時播報參考以下網址:

疫情地圖

 


impleDateFormat為非線程(Thread)安全, 多線程時會造成問題。

方法一:
直接用static
缺點:不同線程的安全性(皆能共享)

方法二:
使用時才new一個
缺點:消耗內存, 影響效能

方法三:
最推薦的方式為透過ThreadLocal

ThreadLocal可根據不同線程, 存取不同的值,
舉個例子:

final int num = 10;
final ThreadLocal<Integer> threadLocal = new ThreadLocal<>();
    threadLocal.set(num);
    Log.e("adam", "test, 1, get: " + threadLocal.get());
    new Thread(new Runnable() {
    @Override
    public void run() {
        threadLocal.set(20);
        Log.e("adam", "test, 2, get: " + threadLocal.get());
    }
}).start();
    new Thread(new Runnable() {
    @Override
    public void run() {
        Log.e("adam", "test, 3, get: " + threadLocal.get());
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Log.e("adam", "test, 4, get: " + threadLocal.get());
            }
        });
    }
}).start();

結果:
test, 1, get: 10
test, 2, get: 20
test, 3, get: null
test, 4, get: 10

 

Thread中沒設值時, 取出的是null, UIThreadhread設的是10, 並沒有因為第一個Thread設值20而改變, test 4依然是10。

由此可確認,ThreadLocal的存取是獨立於不同線程。
SimpleDateFormat透過ThreadLocal:

private static final ThreadLocal<DateFormat> dateFormatThreadLocal = new ThreadLocal<DateFormat>();
private static DateFormat getDateFormat(String format){
    DateFormat dateFormat = dateFormatThreadLocal.get();
    if(dateFormat == null){
        dateFormat = new SimpleDateFormat(format);
        dateFormatThreadLocal.set(dateFormat);
    }
    return dateFormat;
}

Android String&StringBuilder&StringBuffer比速-附代碼及數據


說明:
String 為常量,每次必創造新常量賦值,耗內存及效能
StringBuilder及StringBuffer為變量, 後者可synchronized線程安全

實驗:
分別跑三萬筆累加字串,測試效能。

結果:
2020-01-06 15:58:32.670 4166-4166/adamtest, String: 24794(ms)
2020-01-06 15:58:32.685 4166-4166/adamtest, StringBuilder:5(ms)
2020-01-06 15:58:32.705 4166-4166/adamtest, StringBuffer:18(ms)

結論:
單線程盡量用StringBuilder, 多線程保障安全時才用StringBuffer

int count = 30000;
long startNs = System.nanoTime();
String str = "";
for(int i=0;i&lt;count;i++){
    str = str + i;
}
long tookMs = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNs);
LogUtils.e("adam", "adamtest, String: "+ tookMs+"(ms) "+str);

long startNs2 = System.nanoTime();
StringBuilder stringBuilder = new StringBuilder();
for(int i=0;i&lt;count;i++){
    stringBuilder.append(i);
}
long tookMs2 = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNs2);
LogUtils.e("adam", "adamtest, StringBuilder:"+ tookMs2+"(ms) "+stringBuilder);

long startNs3= System.nanoTime();
StringBuffer stringBuffer = new StringBuffer();
for(int i=0;i&lt;count;i++){
    stringBuffer.append(i);
}
long tookMs3 = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNs3);
LogUtils.e("adam", "adamtest, StringBuffer:"+ tookMs3+"(ms) "+stringBuffer);</pre>

Android信任指定CA證書+Okhttp+限定https


以下筆者實測單向驗證可運作(雙向尚未驗證)

安卓指定CA證書步驟
1. application中加入設定android:networkSecurityConfig
可排除部分僅用http
可排除第三方使用系統CA證書(他方CA證書)

2. OkHttpClient.Builder給定CA證書sslSocketFactory
可在hostnameVerifier指定信任的域名或地址

步驟一

<application
        android:name=".MyApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher_app"
        android:label="@string/app_name"
        android:largeHeap="true"
        android:supportsRtl="true"
        android:networkSecurityConfig="@xml/network_security_config"
        android:theme="@style/AppTheme">
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="false" >
        <trust-anchors>
            <certificates src="@raw/mycertificate" />
        </trust-anchors>
    </base-config>
    <!-- for some only support http-->
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">my.exclude.com</domain>
        <trust-anchors>
            <certificates src="@raw/mycertificate" />
        </trust-anchors>
    </domain-config>
    <!--友盟分析採用第三方CA, 設定domain排除-->
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">ulogs.umeng.com</domain>
        <domain includeSubdomains="true">ulogs.umengcloud.com</domain>
        <trust-anchors>
            <certificates src="system"/>
        </trust-anchors>
    </domain-config>
</network-security-config>

步驟二

OkHttpClient.Builder builder = new OkHttpClient.Builder()
                .cookieJar(new NovateCookieManger())
                .cache(cache)
                .addInterceptor(new CacheInterceptor())
                .addNetworkInterceptor(new CacheInterceptor())
                .addNetworkInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
                .connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS)
                .writeTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS)
                .readTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS)
                .connectionPool(new ConnectionPool(8, 15, TimeUnit.SECONDS));
        if(SSLCustom){
            builder.sslSocketFactory(getSocketFactory(), new X509TrustManager() {
                @Override
                public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {

                }

                @Override
                public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {

                }

                @Override
                public X509Certificate[] getAcceptedIssuers() {
                    return new X509Certificate[0];
                }
            })
            .hostnameVerifier(new HostnameVerifier() {
                @Override
                public boolean verify(String hostname, SSLSession session) {
                    return true;
                    //return hostname.compareTo("192.1.1.1")==0; //you can compare the Hostname of your server
                }
            });
        }

 

public static SSLSocketFactory getSocketFactory() {
        try {
            CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
            KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
            keyStore.load(null);
            String certificateStrs[] = new String[]{
                    "mycertificate1.cer"
                    "mycertificate2.cer"
            };
            for(int i=0;i&lt;certificateStrs.length;i++){
                InputStream is  = BaseApplication.getInstance().getAssets().open(certificateStrs[i]);
                keyStore.setCertificateEntry(i+"", certificateFactory.generateCertificate(is));
                if (is!=null){
                    is.close();
                }
            }
            SSLContext sslContext = SSLContext.getInstance("TLS");

            TrustManagerFactory trustManagerFactory =
                    TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());

            trustManagerFactory.init(keyStore);

            //初始化keystore, 雙向驗證
//            KeyStore clientKeyStore = KeyStore.getInstance("BKS");
//            clientKeyStore.load(BaseApplication.getInstance().getAssets().open("client.bks"), "quantdo".toCharArray());
//            KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
//            keyManagerFactory.init(clientKeyStore, "quantdo".toCharArray());
//            sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), new SecureRandom());

            //單向驗證
            sslContext.init(null, trustManagerFactory.getTrustManagers(), new SecureRandom());
            return sslContext.getSocketFactory();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

台北旅遊攻略-萬華篇


​​台灣美食眾多,但旅客來到卻不知從何下手,甚至踩雷,本人居住中和31年經驗,秘藏推薦。

今天介紹的是萬華,早期成為艋舺,一府二鹿三艋舺,身為早期台北發展重鎮,這裡流傳下來特美食可想而知。

===========旅遊景點===========

西門町推薦指數★★★★

年輕男女許多來此看電影,也是購買衣服飾品的勝地,常會出現街頭藝人表演,運氣好也會偶遇簽唱會,因此旅客絡繹不絕。

微信图片_20191111124045.png

西本願寺廣場推薦指數★★★★

位於西門町附近,由台灣信徒與日本人籌資蓋成,最簡單就能見到的日式風情之地,有大鐘及日式木造、紅磚建築。在此還能到店家邊喝茶邊感受韻味。

微信图片_20191111124301.png

龍山寺推薦指數★★★★★

早期移民來台的信仰之地,經過百年經營,以成為無法動搖的根本,可見到許多信徒來此參拜,尤其接近大學考試,更能見著家長與學生的身影。

微信图片_20191111124858.png

華西街推薦指數★★★★★

龍山寺附近的知名老街,早期發展重心,小時候還能在此看到現場殺蛇,如今多加開腳底按摩店設立,不論廟會活動遊行還是吃喝美食的不二選,與龍山寺間的廣州街串連,也是著名夜市。

微信图片_20191111124756.png

青草巷推薦指數★★★★☆

相對華西街,位於龍山寺另一側,此地多年來經營各種中草藥的店家,因此許多民眾總會來這「喝一杯」,喝的不是酒,而是青草茶,各種沒見過的草藥,沒喝過的茶飲,都來試試吧。

微信图片_20191111124959.png

剝皮寮推薦指數★★★★

艋舺早期發展的景象遺跡,經過整建,如今是外拍及喜愛歷史文化遊客喜愛之地。

微信图片_20191111125115.png

===========以下為美食============

萬華排骨湯推薦指數★★★★★

地址:台北市萬華區三水街78號

大塊蘿蔔排骨湯,軟嫩多汁,搭配彈牙高麗菜飯,清淡美食首選。

微信图片_20191111125246.png

萬安青草茶推薦指數★★★★☆

地址:台北萬華區西昌街224巷9號

龍山寺附近著名的青草巷,裡面許多店家都有販賣清熱退火的青草茶,其他金線蓮等各種茶飲皆可嘗試,部分偏苦,尤其是可怕的「苦茶」,勇敢者可以跟夥伴們點一杯共享,我相信99%的人喝不下去的。

微信图片_20191111125320.png

建宏牛肉麵推薦指數★★★★☆

地址:台北市萬華區洛陽街45之6號

整碗滿滿的牛肉塊,美味湯頭還能加上牛油、酸菜,包你吃了還想再吃。

微信图片_20191111125520.png

 

越南涼麵河粉推薦指數★★★★☆

地址:台北市萬華區東園街28巷51號

由正宗越南老闆娘開設,越南麵包及越南河粉,口感Q彈,湯頭味道香濃,絕對是不容錯過的美食。

微信图片_20191111125635.png

復興口麵線推薦指數★★★★☆

地址:台北市萬華區東園街28巷25號

在地人才知道的幾十年老店,大腸麵線味道很好,營業時間特殊,只開下午三點到八點,賣完就收。

微信图片_20191111125749.png

​​​​

為什麼android手機很卡


Android手機與iphone兩大平台最常被比較的就是電量效能

然而一面倒的,iphone幾乎霸佔王座,難道android系統如此不堪嗎?其實不是的,某些方面而言,iphone確實有其獨到之處,然影響卡頓最明顯者,卻是系統某個「設定」。

iphone預設不給任何app背景活動,相關背景行為包括收到各種消息,接是透過系統級別的程序完成,大大降低了耗電量及效率,然而android一貫以開放為主,允許各家廠商app可以自行控管背景活動

可以想像的是,如果你安裝了100個app,100款被掛載RAM消耗你的記憶體,默默地執行各自的背景活動,如同PC桌機電腦,你會開100個程式掛在那邊嗎?

肯定不會,因為會很卡!

既然了解原理,我們便能簡單的加速android效能,把各款用不到的app通通關掉,只留下部分讓其能在背景活動接收訊息,例如line, IG等。如此,空出來大量的RAM便能讓其好好的載入需要用的App,而不必讓系統拼命忙於回收,載入你那剩餘一丁點的RAM而造成卡頓。

步驟一:找到啟動開關。

79130a86b198dae9804ac800cb5af00.jpg

步驟二:全部關掉。

42f5c111f10dbc1e202bd7050dc3ca8.jpg

步驟三:只開你要的App部分功能。

4556c45462b170f85eacfdbe6c230d1.jpg

步驟四:重新啟動手機。

有時因為手機BUG,即使關掉各個應用,依然被占用大量的RAM,此時直接重啟手機吧。

 


台北故宮,位於士林區陽明山下,知名度極高,可惜的是展區內不能拍照,喜愛歷史文化的粉絲絕對不能錯過,夥伴們衝吧!

有種說法是北京故宮看建築,台北故宮看文物,據說是當年國共交戰,撤退到台灣時,幾乎把大部分文物都帶來,傳說山洞中藏有許多文物,每年根據更換出來展覽,所以能常常出現不同的展品,至於是否實情就不得而知。

@小知識:
知名的翠玉白菜,白菜上面是什麼昆蟲?答案就是螽斯,又稱紡織娘,與白菜一體成型的青綠白色就是神奇之處。

@交通方式:
捷運文湖線轉公車。

@建議:
故宮旁有個至善園可以順便逛逛,而從故宮到士林夜市及士林官邸也不遠,排個行程一起玩遍吧!台北故宮廁所

電腦工程師需要俱備的三大能力


什麼是電腦工程師呢?不是這個領域的人通常很難理解,因此我們用最簡單的方式,讓大家理解一下。

電腦工程師分為軟硬體兩種,以肉眼可見的建築業來說,硬體的人負責研究製造建材,軟體的人負責設計搭建大樓,同建造房子一樣,不是學土木工程的人,不可能看書學兩下就懂得怎個蓋,同理,非資訊領域的人入門是難度是很高的,千萬不要被補習三個月人人都是工程師的廣告給騙,下定決心轉行進入此領域的人,先來看看工程師應該俱備哪三大能力吧!

 

  1. 數理邏輯

    • 不論是程式開發或者錯誤修正,都需要用到大量的數理能力,反覆排除錯誤,尋找試驗正確做法,如果你從小到大數學都很差,邏輯能力很弱,相信我,絕對不建議你走這行。
  2. 英語程度

    • 由於開發編寫軟體,網路上各種學術文章,官方文獻,各種錯誤排除的討論及第三方開源,幾乎都是英文,因此不建議英文程度太差的人踏入,入門至少要能基本的網路文章看得懂。
  3. 學習精神

    • 最重要的是一顆不斷精進的心,在這一行每天都在追求進步,三年前跟三年後應用的東西差很大,即使同門程式領域可能也改變不少,所以喜歡安逸不愛學習的人,即使進了軟體業也只會覺得累,奉勸有真心喜歡追求突破的人才踏入。

 

如果以上三個能力都俱備,花上數年的時間,相信還是能一步步走在工程師這條路上,祝各位有志者,馬到成功。

大陸與台灣生活大不同-交通篇


前言

說到大陸,許多人的印象還停留在幾十年前,尤其是民國50年代左右出生的人,跨越過台灣錢淹腳目的年代,更是瞧不起大陸人,覺得是大陸是落後的代表,到處素質低落,生活物價水平之低, 然而,在2019年的現在, 事實還是如此嗎?

首先,我們先了解一個事實,大陸大概有260幾個台灣這麼大,如同在台灣,中南部鄉下或花東地區的發展遠不如台北台中高雄,以同樣的觀念,我們看大陸時,不能以他們農村(鄉下)來看待整體的大陸水準,採取相同的標準,以台北台中高雄,比對北京上海廣州深圳才是個比較客觀的方式。

 

返鄉

就台灣來說,即使你家住得再遠,從台北到墾丁,搭乘高鐵轉客運,也不過是8個小時的事情,然而對大陸來說,在上海工作的人,若不搭飛機,搭乘火車回新疆烏魯木齊需要40個小時的車程,即使搭乘飛機,再加上一路轉幾趟車前往住家的小鎮,交通時間都是長得嚇人,所以許多大陸年輕一代來大城市打拼,一整年只有過年才回家一趟,有人甚至幾年才回去一次,因此能理解為何有春運人人都要回家與父母小孩團聚。

 

上班

短程交通是怎麼的差距呢?以台北而言,相信大家上班的交通時間是抓在半小時,最多1個小時,但在上海來講,交通一個小時是很稀鬆平常的一件事情,有人為了省房租,要花上兩三個小時才能到公司,可能錯過唯一一班的公車就沒得回家了, 距離遠近的時間概念,在兩個地方是截然不同的。

 

旅遊

台北出發不論是去陽明山,烏來,平溪,北海岸,交通時間最遠不過兩個小時,許多近郊遊玩的地方更是一個小時內能到達,對我們來說,兩個小時到海邊,一個小時到山上的景點再正常不過,然而對大陸來說,可完全不是這麼一回事,從上海市區出發,除了少數外灘等遊玩地點地鐵一小時能到之外,其他不論要去古鎮,海邊,山上踏青,交通時間絕對是兩個小時起跳,如果是搭乘地鐵,公車等轉乘,海邊則要交通四個小時,去最近的山上郊遊要五六個小時,這距離之遠,讓人理解為何大陸休閒娛樂觀念較為低落,光距離就是個問題。

 

大眾交通

幸運的是在大陸的大眾交通費用是比較低廉的,相比之下,台灣25塊台幣的捷運站交通距離,在上海只需要10塊台幣左右,高鐵的費用也是砍了一半不止,然而有因此造成民眾出遊旅行上的興盛嗎?其實沒有,因為交通距離實在太遠,換算下,跨省旅遊都是一兩千台幣起跳,除非搭乘很慢的火車,交通10個小時,或許能壓在一千台幣也內的交通費,所以交通費的低廉,還是對上班交通的支出比較有感。

 

自駕

台灣到處流行的是機車,大陸則是電瓶車,也就是電動車,意外的發現這邊騎自行車的量都遠比摩托車高,因為法規的不允許,造就電瓶車與自行車為主流,也因此交通排氣上,感覺比台北好了許多,不會出去逛一圈,整個臉都是黑色的。

這裡的轎車與電瓶車大約是7:3,因為遠距離的交通,所以這裡的車輛是非常流行的,通常不論是哪,馬路都修得很大,路邊店家前的人行道也很寬,所以汽車開到哪停到哪, 不需要擔心被拖吊或沒地方停,且許多的中國國產車價格便宜,除了油價與台灣相近外,開車是非常適合的選擇。

不過在大城市如上海,開車有個特別的地方,就是車牌,上海的車牌前方會寫個「滬」, 其他如「皖」, 「閔」取各省簡稱,掛個「滬」是有意義的,因為上海規定部分高架道路只有上海車牌能通行,所以上海的「滬」,成了有錢人代表,價格被炒的跟天一樣高, 有時甚至買車的錢都不夠買一個滬字車牌, 這也是與台灣不同, 非常有趣的地方!

早中晚餐343減肥法


提到減肥, 很多人想著要克制飲食, 減少飯量, 其實減少攝取不是一個很優良的方式, 容易影響基礎代謝率的下降, 且減少進食也很辛苦, 容易放棄。

 

所以我們要換個更有效率, 更輕鬆的方式, 我稱之為「343減肥法」, 簡單來說, 就是把早中晚餐依據30%, 40%, 30%進食。一般而言, 現代人進食在下班後總是特別豐盛, 更別提晚上跟朋友同事的聚餐, 幾乎佔了一天的一半以上, 有時吃個吃到飽, 甚至高達7成都有可能, 這是非常不好的飲食習慣, 容易快速提升血糖, 早成脂肪堆積, 正確的吃法應該少量多餐, 盡量讓血糖平穩, 因此343的比例來進食, 會是個很好的選擇。

 

此外, 有兩個要點, 根據血糖平穩的原則, 下午時刻甚至能吃一點點心, 藉此來降低晚上會餓的狀態, 第二個則是晚餐提早吃, 根據日本研究, 晚餐提早吃 也有助於減重, 所以晚餐盡量在ㄓ5~6點間進食完畢, 根據以上搭配, 祝人人減重成功!

歸納重點:

  1. 早中晚餐3:4:3
  2. 進食下午茶
  3. 晚餐5點吃