蝗蟲大軍席捲而來!肯亞出動「超級電腦」滅蟲成效佳

摘錄自2020年3月11日民視報導

從年初以來,東非蝗蟲災害時不時就登上國際新聞版面,其中肯亞的蝗害程度更是70年來首見。肯亞科學家正與時間賽跑,利用超級電腦精確分析多種氣候因素,預測出10天後蝗蟲的動向。目前肯亞的蝗蟲數量明顯減少,不過新孵化的蝗蟲大軍又從索馬利亞前來,仍不能掉以輕心。

肯亞氣候科學家巴畢克提到,「近來我們開始用超級電腦預測,以追蹤沙漠蝗蟲的動態,沙漠蝗蟲是依氣候狀況移動的,所以我們以風速、風向、溫渡,土壤和大氣濕度等指標預測。」科學家將這一大串相關指標數據搭配衛星提供的資訊,例如植被覆蓋等,預測出10天後蝗蟲往哪兒飛。如此一來,可以早一步準備好對付蝗蟲。

巴畢克指出,「這項預測很有幫助,讓我們能把力氣集中在未來10天內最容易受蟲害影響的區域,如此一來能更有效率的分配資源、分配資金對抗沙漠蝗蟲,這是非常創新且新穎的方式,把科技用來解決像沙漠蝗蟲這類很現實的生活問題。」

受到氣候變遷的影響,東非雨季變長,而且極端氣候型頻繁出現,導致許久未見的蝗害捲土重來。不過超級電腦也有極限,科學家無法掌握10天後蝗蟲的動向,未來將設法加強電腦模型和解析度,做出更久的預測。

災害
土地水文
國際新聞
肯亞
蝗蟲災害
超級電腦

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計、台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

※台灣海運大陸貨務運送流程

※兩岸物流進出口一站式服務

BMW集團未來將削減50%燃油車款

摘錄自2020年03月15日ETtoday報導

BMW集團近日公布財報,除了在2019年首度達成全集團(包括二輪、Mini與勞斯萊斯)獲利1,000億歐元(約3.3兆台幣)以上的新高紀錄外,同時也將自明年開始,削減50%的傳統內燃機動力系統,全力發展Hybrid油電混合與純電動EV車款。

根據BMW集團聲明稿內容,自2021年開始,BMW將淘汰多達50%的內燃機車款,並致力於電動化動力系統。雖然BMW並未說明是哪些車款會被淘汰,但這並不意味著現有車型會在幾年內馬上消失,不過可以確定的是,各車系的衍生車型將會縮減,並且不僅限於BMW品牌而已,包括Mini、勞斯萊斯也是。

BMW的電動化策略已在進行中,除了最近亮相的i4 Concept外,iX3與iNext電動休旅也即將在明年上市,而現有的i3則會持續販售至2024年,同時在許多3系列、5系列中也有許多PHEV插電式油電車型。在確定集團未來方向後,可以想見未來BMW的傳統燃油車款將會越來越少。

能源議題
國際新聞
BMW
燃油車
電動車
油電混合車

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※想知道網站建置、網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計及後台網頁設計

※不管是台北網頁設計公司、台中網頁設計公司,全省皆有專員為您服務

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※帶您來看台北網站建置,台北網頁設計,各種案例分享

※小三通物流營運型態?

※快速運回,大陸空運推薦?

Tesla Model 3 正式發表!售價3.5萬美元

幾年以來始終傳言不斷的特斯拉(Tesla)「親民平價」車款Tesla Model 3 終於正式發表了!作為特斯拉打進大眾市場的的第一部親民電動車款,Model 3 售價訂為3.5 萬美元(約新台幣114 萬元),預計在2017 年底前出貨。據特斯拉執行長馬斯克(Elon Musk)透露,Model 3 在發表前夕開放預購的24 小時內,就接到11.5 萬筆訂單,表現超乎預期。

在Model 3 的發表會上,馬斯克表示,Model 3 單次充電至少能跑215 英里(約346 公里),且6 秒內可加速至60 英里(約100 公里),就如同馬斯克所言,「我們不出產慢車」。與Model S 相同,Model 3 提供後輪驅動與四輪傳動兩種版本車型,而自動駕駛功能與自動開啟安全模式一樣是標準配備。

強調舒適性的Model 3,車內可容納5 個成人,其中最特別的是,Model 3 從擋風玻璃到接近車尾的後車廂區塊,全是由一大片玻璃覆蓋而成,只要一抬頭就能將天空景色盡收眼底。

此外,Model 3 與Model S 相同,既然不需要內部引擎驅動,自然空出了「前車廂」,同樣配備前、後車廂儲存空間,與一般汽油車外觀看似相同,但卻多了更多容納物品的空間,「甚至連一塊7 英呎(2.1 公尺)長的衝浪板都能放得下」。

特斯拉創立之初,便對外承諾要打造一台平價電動車款,而馬斯克更曾信誓旦旦的表示,要將電動車推向主流大眾市場,而在Model 3 之前,特斯拉的2 種車款Model S 與Model X 都價格不菲,要讓電動車更為普及,勢必得推出平易近人的車款才行。也因此,這次主打「親民平價」的Model 3,定價僅為3.5 萬美元,較7 萬美元起跳的Model S 及8 萬美元起跳的Model X 便宜許多。

Model 3 將在2017 年底前出貨,在發表會前夕就已開放預購,首批買主可享有預付1,000 美元的訂車優惠。馬斯克表示,發表會前夕已接到11.5 萬Model 3 的預購訂單。

本文授權轉載自《》──〈〉

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計、台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

※台灣海運大陸貨務運送流程

※兩岸物流進出口一站式服務

Algorithm: GCD、EXGCD、Inverse Element

數論基礎

數論是純數學的一個研究分支,主要研究整數的性質。初等數論包括整除理論、同余理論、連分數理論。這一篇主要記錄的是同余相關的基礎知識。

取模

取模是一種運算,本質就是帶余除法,運算結果就是餘數。取模運算結果的符號由被模數(被除數)決定。
\[ 7\%4=3;\space7\%(-4)=3;\\ (-7)\%4=-3;\space(-7)\%(-4)=-3 \]

取模運算的性質

\[ 設a>b>0,有:\\ (a+b)\%c=(a\%c+b\%c)\%c\\ (a-b)\%c=(a\%c-b\%c+c)\%c \\ (a\times b)\%c=(a\%c\times b\%c)\%c \]

例題1

\[ 給定兩個非負整數a,b和正整數n,計算f(a^b)\%n。\\ 其中,f(0)=f(1)=1,且對於\forall i>0,f(i+2)=f(i+1)+f(i)\\ (0\le a,b\le 2^{64},1\le n\le 1000) \]

找規律,對於mod n來說,最多n²項就會出現重複,找出重複項即可得到循環周期,然後找對應的項即可。

例題2:hdu 1212

題意是給一個位數不超過1,000的正整數A和一個大小不超過100,000的正整數B,求A%B。

這裏只需要用到上面的兩條性質,把A截斷,從高到低模擬做除法即可。

#include <iostream>
string s; int mod, ans;
int main() {
    while(std::cin >> str >> mod) {
        ans = 0;
        for(int i = 0; s[i]; i++) ans = (ans * 10 + (s[i] - '0')) % mod;
        std::cout << ans << std::endl;
    }
    return 0;
}

GCD

GCD即Greatest Common Divisor,最大公約數。最大公約數即能同時整除給定兩個整數的最大正整數。特殊地:gcd(a,0)=a。求解最大公約數通常使用輾轉相除法。下面是輾轉相除法的代碼實現:

typedef long long LL;
LL gcd(LL a, LL b) {
    return b ? gcd(b, a % b) : a;
}

輾轉相除法得到的餘數序列增長速度比斐波那契數列更快,已知斐波那契的增長是指數級別,則輾轉相除法的複雜度是對數級別。

輾轉相除法的證明:

1.設兩個數a、b(a>b),他們的最大公約數為gcd(a,b),r = a % b,k = (a – a % b)/ b,那麼證明輾轉相除法,即是要證明:gcd(a,b)=gcd(b,r)。首先我們令c = gcd(a,b),那麼肯定存在互質的整數m,n,使得a = mc,b = nc。那麼有r = a – kb = mc – knc = (m – kn)c,根據這條式子,c也是r的因數。回過頭看,如果能證明m-kn和n互質,那麼就可以說明c=gcd((m-kn)c,nc)=gcd(b,r),所以把問題再次轉化為:求證m-kn和n互質。

2.反證法證明m-kn和n互質:假設m-kn和n不互質,用數學語言描述為:假設存在整數x,y,d,其中d>1,使得m-kn=xd,n=yd。那麼有m=kn+xd=kyd+xd=(ky+x)d,從而a=mc=(ky+x)cd,b=nc=ycd,則gcd(a,b)=cd≠c,與前設矛盾。故m-kn和n互質得證,也就證明了gcd(a,b)=gcd(b,r)。

唯一分解定理

對於任意大於2的正整數X,它總能寫成如下形式:
\[ X=p_1^{a_1}\times p_2^{a_2} \times ……\times p_k^{a_k},其中p是各不相同的質數 \]
即質因數分解。且這個分解唯一。

LCM

LCM即Least Common Multiple,最小公倍數。

\[ \begin{align} &根據唯一分解定理,對於給定的a,b:\\ &a=p_1^{a_1}\times p_2^{a_2} \times……\times p_k^{a_k}\\ &b=p_1^{b_1}\times p_2^{b_2} \times……\times p_k^{b_k}\\ &那麼:\\ &gcd(a,b)=p_1^{min(a_1,b_1)}\times p_2^{min(a_2,b_2)}\times ……p_1^{min(a_k,b_k)}\\ &lcm(a,b)=p_1^{max(a_1,b_1)}\times p_2^{max(a_2,b_2)}\times ……p_1^{max(a_k,b_k)}\\ &因此,gcd(a,b)\times lcm(a,b)=a\times b \end{align} \]

LL lcm(LL a, LL b) {
    return a / gcd(a, b) * b;
}

例題:hdu1788

題意是求最小的正整數N,滿足除以每一個給定的數Mi,其結果均為Mi-a。作如下轉化:
\[ N\%M_i\equiv(M_i-a)\%M_i\Rightarrow (N+a)\%M_i=0(a<M_i<100) \]
即N是Mi的倍數,那麼題意也就是求所有M的最小公倍數,注意数字範圍即可。

同余

對於兩個不同的數a,b,如果有a % p = b % p(p>1),那我們就稱a和b模p同余,記作:
\[ a\equiv b(mod\space p) \]

同余的性質

\[ \begin{aligned} &1.自反性:a\equiv a(mod\space m)\\ &2.對稱性:a\equiv b(mod\space m),則b\equiv a(mod\space m)\\ &3.傳遞性:若a\equiv b(mod\space m),b\equiv c(mod\space m),則a\equiv c(mod\space m)\\ &4.線性運算:若a\equiv b(mod\space m),c\equiv d(mod\space m)\\ &\space\space\space則:a\pm c\equiv b\pm d(mod\space m);\space a\times c\equiv b\times d(mod\space m)\\ &5.冪運算:若a\equiv b(mod\space m),那麼a^n\equiv b^n(mod\space m)\\ &6.若ac\equiv bc(mod\space m),且c≠0,那麼a\equiv b(mod\space {m\over gcd(c,m)})\\ &\space\space\space特殊地,若gcd(c,m)=1,則a\equiv b(mod\space m) \end{aligned} \]

EXGCD

貝祖定理(Bezouts Identity):若設a,b是不全為0的整數,則存在整數x,y,使得ax+by=gcd(a,b),(a,b)代表最大公因數,則設a,b是不全為零的整數,則肯定存在整數x,y,使得ax+by=(a,b)。這個式子稱為貝祖等式。

EXtend GCD 即擴展歐幾里得算法,它可以用於解關於x,y的貝祖等式。

EXGCD的可行性

當a=0時,ax+by=gcd(a,b)=gcd(0,b)=b,這時可以解出y=1而x為任意。同理可得b=0時,解得x=1而y為任意。當a,b都不為0時:
\[ \begin{aligned} &設存在一組解為x_1,y_1,即ax_1+by_1=gcd(a,b)\\ &由歐幾里得定理:gcd(a,b)=gcd(b,a\%b)得:\\ &ax_1+by_1=gcd(a,b)=gcd(b,a\%b)\\ &那麼,bx_2+(a\%b)y_2=gcd(b,a\%b)=ax_1+by_1\\ &又a\%b=a-a/b\times b\\ &\begin {align} 那麼,&ax_1+by_1\\ =&bx_2+(a-a/b\times b)y_2\\ =&bx_2+ay_2-a/b*b*y_2\\ =&ay_2+b(x_2-a/b*y_2) \end{align}\\ &故可以得到:x_1=y_2,\space y_1=x_2-a/b*y_2 \end{aligned} \]
a或b為0即迭代求解的出口,迭代過程用代碼錶示如下:

typedef long long LL;
// ver 1
// 返回值為gcd(a,b),x和y即求出的特解
LL exgcd(LL a, LL b, LL &x, LL &y) {
    if (b == 0) {
        x = 1; y = 0;
        return a;
    }
    LL ans = exgcd(b, a % b, x, y);
    //這裏通過迭代求出了一組解x,y,這組解對應上面推導過程中的x2和y2。
    LL temp = x;
    x = y;
    y = temp - a / b * y;
    return ans;
}

// ver 2
// 在熟悉了推導過程之後,我們可以利用引用的性質得到更為簡潔的ver2寫法
LL exgcd(LL a, LL b, LL &x, LL &y) {
    if (b == 0) {
        x = 1; y = 0;
        return a;
    }
    LL ans = exgcd(b, a % b, y, x);
    y -= a / b * x;
    return ans;
}

EXGCD的應用

求關於x,y的方程ax+by=c的一組解

這裏只需要對貝祖等式稍作變換即可。假設EXGCD求出的方程ax+by=gcd(a,b)的一組解為x1和y1。在方程兩邊同時乘上一個數m,使得c=m*gcd(a,b),這裏也就要求c是gcd(a,b)的倍數,即c%gcd(a,b)=0。這也是方程有解的條件。此時方程為:
\[ \begin{align} &ax_1\times m+by_1\times m=gcd(a,b)\times m=c \end{align} \]
對於ax+by=gcd(a,b),其參數解為:
\[ \begin{align} &x=x_1+{b\over gcd(a,b)}\times t,y=y_1-{a\over gcd(a,b)}\times t,t為參數\\ &這裏選用{b\over gcd(a,b)}和{a\over gcd(a,b)}是為了保證結果均為整數 \end{align} \]
那麼對比方程ax+by=c,可以得到其特解為:
\[ \begin{align} &x_0=x_1\times m=x_1\times {c\over gcd(a,b)}\\ &y_0=y_1\times m=y_1\times {c\over gcd(a,b)} \end{align} \]
那麼其通解為:
\[ \begin{align} &X=x_0+{b\over gcd(a,b)}\times t,Y=y_0-{a\over gcd(a,b)}\times t,t為參數\\ &這裏選用{b\over gcd(a,b)}和{a\over gcd(a,b)}作為係數是為了確保得到均為整數解。 \end{align} \]
對於任意一個確定的t,都有一組確定的解與之對應,只需要根據需要找出對應的解即可。

例如求滿足ax+by=c的X的最小非負整數解,那麼在得到X的通解之後只需調整t,調整過程用偽代碼錶示為:

S = b / gcd(a, b);
X = (x0 % S + S) % S;
// 由於x0可能是負數,故在模之後還要加上S在取一次模。
// 同理可得Y的最小非負整數解
T = a / gcd(a, b);
Y = (y0 % T + T) % T;

完整的exgcd求解方程ax+by=c的X和Y的最小非負整數解得代碼如下:

LL exgcd(LL a, LL b, LL c, LL& x, LL& y) {
    if (b == 0) {
        x = 1; y = 0;
        return a;
    }
    LL ans = exgcd(a, b, c, y, x);
    y -= a / b * x;
    LL S = b / ans, T = a / ans;
    x = (x % S + S) % S;
    y = (y % T + T) % T;
    return ans;
}

求關於x的方程ax≡b(mod m)的最小非負整數解

ax≡b(mod m)即ax%m=b%m,即求ax+my=b%m(取模其實就相當於減去(加上)了若干個模數)。但只有a和m互質時有唯一解,否則無解。轉化為ax+my=b(假設b<m)后,套用exgcd即可。

求a關於模數p的乘法逆元

設x是a關於p的乘法逆元,那麼有ax≡1(mod p),這是第二個應用的特殊情況,顯然也可以通過類似方法求得。

逆元

Inverse Element,逆元,推廣了加法中的加法逆元和乘法中的倒數。直觀地說,它是一個可以取消另一給定元素運算的元素。a關於模p的逆元存在的條件是gcd(a,p)=1。
\[ \begin{align} &在模p意義下,設A的逆元為A^{-1},那麼有A\times A^{-1}\equiv 1(mod\space p) \end{align} \]
為什麼需要逆元呢?
\[ \begin{align} &在模意義下,{A\over B}\%p = {A\%p\over B\%p}\%p並不成立,\\ &那麼設B在模p意義下的逆元表示為B^{-1},根據逆元的定義,有{A\over B}=A\times B^{-1}(mod \space p)。 \end{align} \]
這裏,我們把除法轉化為乘法,就可以運用取模運算的性質:(a * b) % c = (a % c * b % c) % c,優化算法。

逆元的求法

EXGCD求法

給定模數m,求a的逆元相當於求解關於x的方程ax≡1(mod m)。這個方程可以轉化為ax-my=1 。用EXGCD可以求得一組x,y和gcd。檢查gcd是否為1(因為EXGCD是把問題轉化為求解方程ax-my=gcd(a,m),顯然只有gcd(a,m)=1時才能轉化),gcd不為1則說明逆元不存在。在能夠成功求解的情況下,把解調整x到0~m-1的範圍中即可。

費馬小定理

在模p為質數的情況下,有費馬小定理:
\[ a^{p-1}\equiv 1(mod\space p) \]
那麼:
\[ a\times a^{p-2}\equiv 1(mod\space p)\\ 故a的逆元a^{-1}=a^{p-2} \]
然後用快速冪求出逆元即可。

拓展:快速冪

// a是底數,b是指數
LL pow(LL a, LL b, LL mod) {
    LL ans = 1;
    while(b) {
        if(b&1) ans = ans * a % mod;
        b >>= 1, a = a * a % mod;
    }
    return ans;
}

拓展:慢速乘,防止快速冪過程中乘法運算爆long long,只需把快速冪中的乘法替換為mul()即可,一般情況用不上。

// a為因數1,b為因數2
LL mul(LL a, LL b, LL mod) {
    LL ans = 0;
    while(b) {
        if(b&1) ans = (ans + a) % mod;
        b >>= 1, a = (a + a) % mod;
    }
    return ans;
}

歐拉定理

費馬小定理其實是歐拉定理的特殊情況。在模數p不為質數時,有:
\[ a^{\phi(p)}\equiv 1(其中\phi()是歐拉函數) \]
同理可以得到:
\[ a^{-1}\equiv a^{\phi(p)-1} \]

線性逆元表

有時我們需要快速得出1~p-1的所有逆元,這個時候我們需要一種O(n)的方法,這就是線性逆元表。

首先,1關於任意模p的逆元的逆元都是1。設p = k * i + r(r < i ,1 < i < p),那麼有:
\[ k\times i + r \equiv0(mod\space p) \]
利用逆元性質,兩邊同時乘上i的逆元以及r的逆元,得到:
\[ k\times r^{-1}+i^{-1}\equiv 0(mod\space p) \]
移項得:
\[ i^{-1}\equiv-k \times r^{-1}\equiv -⌊{p\over i}⌋\times (p\%i)^{-1}(mod\space p) \]
顯然p%i是小於i的,那麼我們就可以利用之前的結果在O(1)時間算出單獨的逆元。

用代碼錶示即:

// inv[i]對應i的逆元
LL inv[maxn];
void CalInv() {
    // 0沒有逆元,故不初始化
    inv[1] = 1;
    for (int i = 2; i < maxn; i++)
        inv[i] = (mod - mod / i) * inv[mod % i] % mod;
}

利用
\[ (a\times c)\% mod = (a\%mod\times c\%mod)\%mod;\\ 由a\times a^{-1}\equiv1(mod \space p)得,\\ inv_{fac(i)}\equiv inv_{fac(i)}\times (i+1)^{-1}\times (i+1)\equiv inv_{fac(i+1)}\times (i+1)(mod\space p) \]
我們還可以在線性時間求出1~min(n,p)的階乘的逆元,代碼如下:

LL fac[maxn], inv[maxn];
void CalFacInv() {
    // 0的階乘是1
    fac[0] = fac[1] = 1;
    for (int i = 2; i < maxn; i++)
        fac[i] = fac[i - 1] * i % mod;
    inv[maxn - 1] = QPow(fac[maxn - 1], mod - 2);
    // 注意邊界是≥
    for (int i = maxn - 2; i >= 0; i--)
        inv[i] = inv[i + 1] * (i + 1) % mod;
}

例題:hdu1576

題意即把除法轉化為逆元乘法。3種方法的代碼:

#include<iostream>
#include<algorithm>
using namespace std;

typedef long long LL;
LL n, B;
const LL mod = 9973;

LL exgcd(LL a, LL b, LL &x, LL &y) {
    if (b == 0) {
        x = 1, y = 0;
        return a;
    }
    LL ans = exgcd(b, a % b, y, x);
    y -= a/b*x;
    return ans;
}

LL QPow(LL x, LL n)
{
    LL res = 1;
    while(n)
    {
        if(n & 1) res = res * x % mod;
        x = x * x % mod;
        n >>= 1;
    }
    return res;
}

LL inv[10000];
void CalInv() {
    inv[1] = 1;
    for (LL i = 2; i < 10000; i++) {
        inv[i] = (mod * mod - mod / i * inv[mod % i]) % mod;
    }
}


int main() {
    CalInv();
    int t;
    cin >> t;
    while (t--) {
        cin >> n >> B;
        // exgcd
        // LL x, y;
        // exgcd(B, mod, x, y);
        // cout << (x + mod) * n % mod << endl;
        
        // QPow
        // cout << QPow(B, mod - 2) * n % mod << endl;
        
        // 逆元打表
        cout << inv[B % mod] * n % mod << endl;
    }
    return 0;
}

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

※USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計、台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

※台灣海運大陸貨務運送流程

※兩岸物流進出口一站式服務

Spring Boot Actuator監控使用詳解

在企業級應用中,學習了如何進行SpringBoot應用的功能開發,以及如何寫單元測試、集成測試等還是不夠的。在實際的軟件開發中還需要:應用程序的監控和管理。SpringBoot的Actuator模塊實現了應用的監控與管理。

Actuator簡介

生產系統中,往往需要對系統實際運行的情況(例如cpu、io、disk、db、業務功能等指標)進行監控運維。在SpringBoot項目中Actuator模塊提供了眾多HTTP接口端點(Endpoint),來提供應用程序運行時的內部狀態信息。

Actuator模塊提供了一個監控和管理生產環境的模塊,可以使用http、jmx、ssh、telnet等來管理和監控應用。包括應用的審計(Auditing)、健康(health)狀態信息、數據採集(metrics gathering)統計等監控運維的功能。同時,提供了可以擴展 Actuator端點(Endpoint)自定義監控指標。這些指標都是以JSON接口數據的方式呈現。

Actuator的使用

使用Spring Boot Actuator需要加入如下依賴:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

actuator並沒有默認集成在自動配置中,而在作為獨立的項目來呈現的。當引入了上面的依賴,默認會引入actuator相關的兩個項目:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-actuator</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-actuator-autoconfigure</artifactId>
</dependency>

其中spring-boot-actuator為功能實現,spring-boot-actuator-autoconfigure為自動配置。

需要注意:因SpringBoot Actuator會暴露服務的詳細信息,為了保障安全性,建議添加安全控制的相關依賴spring-boot-starter-security,這樣在訪問應用監控端點時,都需要輸入驗證信息。所需依賴如下:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

關於security的使用我們在此不進行展開,可在application文件中配置相應的訪問密碼:

spring:
  security:
    user:
      name: admin
      password: admin

在下面的內容中為了方便,我們暫時不引入security。

經過以上步驟的操作,啟動SpringBoot項目,actuator便自動集成配置了,可通過:http://localhost:8080/actuator 訪問,結果如下:

{
    "_links": {
        "self": {
            "href": "http://localhost:8080/actuator",
            "templated": false
        },
        "health": {
            "href": "http://localhost:8080/actuator/health",
            "templated": false
        },
        "health-component": {
            "href": "http://localhost:8080/actuator/health/{component}",
            "templated": true
        },
        "health-component-instance": {
            "href": "http://localhost:8080/actuator/health/{component}/{instance}",
            "templated": true
        },
        "info": {
            "href": "http://localhost:8080/actuator/info",
            "templated": false
        }
    }
}

默認支持的鏈接有:

/actuator
/actuator/health
/health/{component}/{instance}
/health/{component}
/actuator/info

可以在application配置文件中配置開啟更多的監控信息:

management:
  endpoints:
    web:
      exposure:
        include: '*'
#      base-path: /monitor
  endpoint:
    health:
      show-details: always
    shutdown:
      enabled: true
  • management.endpoints.web.exposure.include=’*’,代表開啟全部監控,也可僅配置需要開啟的監控,如: management.endpoints.web.exposure.include=beans,trace。
  • management.endpoint.health.show-details=always,health endpoint開啟显示全部細節。默認情況下/actuator/health是公開的,但不显示細節。
  • management.endpoints.web.base-path=/monitor,啟用指定的url地址訪問根路徑,默認路徑為/actuator/*,開啟則訪問路徑變為/monitor/*。
  • management.endpoint.shutdown.enabled=true,啟用接口關閉SpringBoot。

監控信息如果需要跨越調用,可通過CORS配置來支持,默認處於禁用狀態。設置management.endpoints.web.cors.allowed-origins屬性后開啟。

比如允許來自https://www.choupangxia.com 域的GET和POST調用:

management:
  endpoints:
    web:
      cors:
        allowed-origins: https://www.choupangxia.com
        allowed-methods: GET,POST

REST接口

Spring Boot Actuator提供了非常豐富的監控接口,可以通過這些接口了解應用程序運行時的內部狀況。Actuator也支持用戶自定義添加端點,可以根據實際應用,定義一些比較關心的指標,在運行期進行監控。

HTTP方法 路徑 描述
GET /auditevents 显示當前應用程序的審計事件信息
GET /beans 显示一個應用中所有Spring Beans的完整列表
GET /conditions 显示配置類和自動配置類(configuration and auto-configuration classes)的狀態及它們被應用或未被應用的原因。
GET /configprops 显示一個所有@ConfigurationProperties的集合列表
GET /env 显示來自Spring的ConfigurableEnvironment的屬性。
GET /flyway 显示數據庫遷移路徑,如果有的話。
GET /health 显示應用的健康信息(當使用一個未認證連接訪問時显示一個簡單的’status’,使用認證連接訪問則显示全部信息詳情)
GET /info 显示任意的應用信息
GET /liquibase 展示任何Liquibase數據庫遷移路徑,如果有的話
GET /metrics 展示當前應用的metrics信息
GET /mappings 显示一個所有@RequestMapping路徑的集合列表
GET /scheduledtasks 显示應用程序中的計劃任務
GET /sessions 允許從Spring會話支持的會話存儲中檢索和刪除(retrieval and deletion)用戶會話。使用Spring Session對反應性Web應用程序的支持時不可用。
POST /shutdown 允許應用以優雅的方式關閉(默認情況下不啟用)
GET /threaddump 執行一個線程dump

如果使用web應用(Spring MVC, Spring WebFlux, 或者 Jersey),還可以使用以下接口:

HTTP方法 路徑 描述
GET /heapdump 返回一個GZip壓縮的hprof堆dump文件
GET /jolokia 通過HTTP暴露JMX beans(當Jolokia在類路徑上時,WebFlux不可用)
GET /logfile 返回日誌文件內容(如果設置了logging.file或logging.path屬性的話),支持使用HTTP Range頭接收日誌文件內容的部分信息
GET /prometheus 以可以被Prometheus服務器抓取的格式显示metrics信息

接口詳解

health主要用來檢查應用的運行狀態,這是使用頻次最高的監控點。通常使用此接口显示應用實例的運行狀態,以及應用不“健康”的原因,比如數據庫連接、磁盤空間不夠等。

默認情況下health的狀態是開放的,訪問:http://localhost:8080/actuator/health 即可看到應用的狀態。

{
    "status" : "UP"
}

設置狀態碼順序:setStatusOrder(Status.DOWN,Status.OUT_OF_SERVICE, Status.UP, Status.UNKNOWN)。
過濾掉不能識別的狀態碼。如果無任何狀態碼,整個SpringBoot應用的狀態是UNKNOWN。將所有收集到的狀態碼排序。返回有序狀態碼序列中的第一個狀態碼,作為整個SpringBoot應用的狀態。

Health通過合併幾個健康指數檢查應用的健康情況。SpringBoot Actuator會自動配置以下內容:

名稱 描述
CassandraHealthIndicator 檢查Cassandra數據庫是否已啟動。
CouchbaseHealthIndicator 檢查Couchbase群集是否已啟動。
DiskSpaceHealthIndicator 檢查磁盤空間不足。
DataSourceHealthIndicator 檢查是否可以建立連接DataSource。
ElasticsearchHealthIndicator 檢查Elasticsearch集群是否已啟動。
InfluxDbHealthIndicator 檢查InfluxDB服務器是否已啟動。
JmsHealthIndicator 檢查JMS代理是否啟動。
MailHealthIndicator 檢查郵件服務器是否已啟動。
MongoHealthIndicator 檢查Mongo數據庫是否已啟動。
Neo4jHealthIndicator 檢查Neo4j服務器是否已啟動。
RabbitHealthIndicator 檢查Rabbit服務器是否已啟動。
RedisHealthIndicator 檢查Redis服務器是否啟動。
SolrHealthIndicator 檢查Solr服務器是否已啟動。

可以通過設置 management.health.defaults.enabled屬性來全部禁用。

原生端點

原生端點分為三大類:

  • 應用配置類:獲取應用程序中加載的應用配置、環境變量、自動化配置報告等與Spring Boot應用密切相關的配置類信息。
  • 度量指標類:獲取應用程序運行過程中用於監控的度量指標,比如:內存信息、線程池信息、HTTP請求統計等。
  • 操作控制類:提供了對應用的關閉等操作類功能。

應用配置類

/conditions:該端點用來獲取應用的自動化配置報告,其中包括所有自動化配置的候選項。同時還列出了每個候選項自動化配置的各個先決條件是否滿足。該端點可以幫助我們方便的找到一些自動化配置為什麼沒有生效的具體原因。

該報告內容將自動化配置內容分為兩部分:positiveMatches中返回的是條件匹配成功的自動化配置和negativeMatches中返回的是條件匹配不成功的自動化配置。

部分代碼如下:

"contexts": {
        "application": {
            "positiveMatches": {
                "MsgAutoConfiguration": [
                    {
                        "condition": "OnClassCondition",
                        "message": "@ConditionalOnClass found required class 'com.secbro2.msg.MsgService'"
                    }
                ],
                "MsgAutoConfiguration#msgService": [
                    {
                        "condition": "OnPropertyCondition",
                        "message": "@ConditionalOnProperty (msg.enabled=true) matched"
                    },
                    {
                        "condition": "OnBeanCondition",
                        "message": "@ConditionalOnMissingBean (types: com.secbro2.msg.MsgService; SearchStrategy: all) did not find any beans"
                    }
                ],

/info:就是在配置文件中配置的以info開頭的信息,如配置為:

info:
  app:
    name: spring-boot-actuator
    version: 1.0.0

返回結果:

{
  "app":{
    "name":"spring-boot-actuator",
    "version":"1.0.0"
  }
}

info中配置的參數也可以通過符號*@*包圍的屬性值來自pom.xml文件中的元素節點。如下:

info:
    build:
        artifact: @project.artifactId@
        name: @project.name@
        description: @project.description@
        ersion: @project.version@

返回結果:

{
    "build": {
        "artifact": "spring-learn",
        "name": "spring-learn",
        "description": "Demo project for Spring Boot",
        "ersion": "0.0.1-SNAPSHOT"
    }
}

/beans:該端點用來獲取應用上下文中創建的所有Bean。

{
    "contexts": {
        "application": {
            "beans": {
                "endpointCachingOperationInvokerAdvisor": {
                    "aliases": [],
                    "scope": "singleton",
                    "type": "org.springframework.boot.actuate.endpoint.invoker.cache.CachingOperationInvokerAdvisor",
                    "resource": "class path resource [org/springframework/boot/actuate/autoconfigure/endpoint/EndpointAutoConfiguration.class]",
                    "dependencies": ["environment"]
                },
                "defaultServletHandlerMapping": {
                    "aliases": [],
                    "scope": "singleton",
                    "type": "org.springframework.web.servlet.HandlerMapping",
                    "resource": "class path resource [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]",
                    "dependencies": []
                },
            },
            "parentId": null
        }
    }
}

接口展現了bean的別名、類型、是否單例、類的地址、依賴等信息。

/configprops:該端點用來獲取應用中配置的屬性信息報告。

{
    "spring.transaction-org.springframework.boot.autoconfigure.transaction.TransactionProperties": {
        "prefix": "spring.transaction",
        "properties": {}
    }
}

上面展示了TransactionProperties屬性的配置信息。

/mappings:該端點用來返回所有SpringMVC的控制器映射關係報告。

{
  "handler": "Actuator web endpoint 'beans'",
  "predicate": "{GET /actuator/beans, produces [application/vnd.spring-boot.actuator.v2+json || application/json]}",
  "details": {
    "handlerMethod": {
      "className": "org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping.OperationHandler",
      "name": "handle",
      "descriptor": "(Ljavax/servlet/http/HttpServletRequest;Ljava/util/Map;)Ljava/lang/Object;"
    },
    "requestMappingConditions": {
      "consumes": [],
      "headers": [],
      "methods": ["GET"],
      "params": [],
      "patterns": ["/actuator/beans"],
      "produces": [{
        "mediaType": "application/vnd.spring-boot.actuator.v2+json",
        "negated": false
      }, {
        "mediaType": "application/json",
        "negated": false
      }]
    }
  }
}

/env:該端點與/configprops不同,它用來獲取應用所有可用的環境屬性報告。包括:環境變量、JVM屬性、應用的配置配置、命令行中的參數。

度量指標類

應用配置類提供的指標為靜態報告,而度量指標類端點提供的報告內容則是動態變化的,提供了應用程序在運行過程中的一些快照信息,比如:內存使用情況、HTTP請求統計、外部資源指標等。這些端點對於構建微服務架構中的監控系統非常有幫助。

/metrics:該端點用來返回當前應用的各類重要度量指標,比如:內存信息、線程信息、垃圾回收信息等。

{
    "names": [
        "jvm.memory.max",
        "jvm.threads.states",
        "http.server.requests",
        "process.files.max",
        "jvm.gc.memory.promoted",
        "system.load.average.1m",
        "jvm.memory.used",
        "jvm.gc.max.data.size",
        "jvm.gc.pause",
        "jvm.memory.committed",
        "system.cpu.count",
        "logback.events",
        "tomcat.global.sent",
        "jvm.buffer.memory.used",
        "tomcat.sessions.created",
        "jvm.threads.daemon",
        "system.cpu.usage",
        "jvm.gc.memory.allocated",
        "tomcat.global.request.max",
        "tomcat.global.request",
        "tomcat.sessions.expired",
        "jvm.threads.live",
        "jvm.threads.peak",
        "tomcat.global.received",
        "process.uptime",
        "tomcat.sessions.rejected",
        "process.cpu.usage",
        "tomcat.threads.config.max",
        "jvm.classes.loaded",
        "jvm.classes.unloaded",
        "tomcat.global.error",
        "tomcat.sessions.active.current",
        "tomcat.sessions.alive.max",
        "jvm.gc.live.data.size",
        "tomcat.threads.current",
        "process.files.open",
        "jvm.buffer.count",
        "jvm.buffer.total.capacity",
        "tomcat.sessions.active.max",
        "tomcat.threads.busy",
        "process.start.time"
    ]
}

從上面的示例中有這些重要的度量值:

  • 系統信息:包括處理器數量processors、運行時間uptime和instance.uptime、系統平均負載systemload.average。
  • mem.*:內存概要信息,包括分配給應用的總內存數量以及當前空閑的內存數量。這些信息來自java.lang.Runtime。
  • heap.*:堆內存使用情況。這些信息來自java.lang.management.MemoryMXBean接口中getHeapMemoryUsage方法獲取的java.lang.management.MemoryUsage。
  • nonheap.*:非堆內存使用情況。這些信息來自java.lang.management.MemoryMXBean接口中getNonHeapMemoryUsage方法獲取的java.lang.management.MemoryUsage。
  • threads.*:線程使用情況,包括線程數、守護線程數(daemon)、線程峰值(peak)等,這些數據均來自java.lang.management.ThreadMXBean。
  • classes.*:應用加載和卸載的類統計。這些數據均來自java.lang.management.ClassLoadingMXBean。
  • gc.*:垃圾收集器的詳細信息,包括垃圾回收次數gc.ps_scavenge.count、垃圾回收消耗時間gc.ps_scavenge.time、標記-清除算法的次數gc.ps_marksweep.count、標記-清除算法的消耗時間gc.ps_marksweep.time。這些數據均來自java.lang.management.GarbageCollectorMXBean。
  • httpsessions.*:Tomcat容器的會話使用情況。包括最大會話數httpsessions.max和活躍會話數httpsessions.active。該度量指標信息僅在引入了嵌入式Tomcat作為應用容器的時候才會提供。
  • gauge.*:HTTP請求的性能指標之一,它主要用來反映一個絕對數值。比如上面示例中的gauge.response.hello: 5,它表示上一次hello請求的延遲時間為5毫秒。
  • counter.*:HTTP請求的性能指標之一,它主要作為計數器來使用,記錄了增加量和減少量。如上示例中counter.status.200.hello: 11,它代表了hello請求返回200狀態的次數為11。

/threaddump:會生成當前線程活動的快照。方便我們在日常定位問題的時候查看線程的情況。主要展示了線程名、線程ID、線程的狀態、是否等待鎖資源等信息。

{
    "threads": [{
        "threadName": "Reference Handler",
        "threadId": 2,
        "blockedTime": -1,
        "blockedCount": 2,
        "waitedTime": -1,
        "waitedCount": 0,
        "lockName": null,
        "lockOwnerId": -1,
        "lockOwnerName": null,
        "daemon": true,
        "inNative": false,
        "suspended": false,
        "threadState": "RUNNABLE",
        "priority": 10,
        "stackTrace": [{
            "classLoaderName": null,
            "moduleName": "java.base",
            "moduleVersion": "11.0.4",
            "methodName": "waitForReferencePendingList",
            "fileName": "Reference.java",
            "lineNumber": -2,
            "className": "java.lang.ref.Reference",
            "nativeMethod": true
        }
  ...
  "lockedMonitors": [],
        "lockedSynchronizers": [{
            "className": "java.util.concurrent.locks.ReentrantLock$NonfairSync",
            "identityHashCode": 2060076420
        }],
        "lockInfo": null
  ...
  {
        "threadName": "DestroyJavaVM",
        "threadId": 42,
        "blockedTime": -1,
        "blockedCount": 0,
        "waitedTime": -1,
        "waitedCount": 0,
        "lockName": null,
        "lockOwnerId": -1,
        "lockOwnerName": null,
        "daemon": false,
        "inNative": false,
        "suspended": false,
        "threadState": "RUNNABLE",
        "priority": 5,
        "stackTrace": [],
        "lockedMonitors": [],
        "lockedSynchronizers": [],
        "lockInfo": null
    }]
}

/trace:該端點用來返回基本的HTTP跟蹤信息。默認情況下,跟蹤信息的存儲採用。

操作控制類

/shutdown:配置文件中配置開啟此功能:

management.endpoint.shutdown.enabled=true

使用 curl 模擬 post 請求此接口:

curl -X POST "http://localhost:8080/actuator/shutdown"

显示結果為:

{
    "message": "Shutting down, bye..."
}

小結

本篇文章介紹了SpringBoot Actuator監控的基本功能和詳解,下篇文章將會帶大家了解一下該功能在Spring Boot中的實現原理。歡迎關注公眾號“程序新視界”。

原文鏈接:《》

程序新視界:精彩和成長都不容錯過

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

※想知道網站建置、網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計及後台網頁設計

※不管是台北網頁設計公司、台中網頁設計公司,全省皆有專員為您服務

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※帶您來看台北網站建置,台北網頁設計,各種案例分享

※小三通物流營運型態?

※快速運回,大陸空運推薦?

科學家警告 武漢肺炎只是開端 更多新興傳染病將因環境破壞而起

環境資訊中心綜合外電;姜唯 編譯;林大利 審校

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計、台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

※台灣海運大陸貨務運送流程

※兩岸物流進出口一站式服務

葉門僅1/3人口有自來水 洗手防疫都奢侈

摘錄自2020年3月24日中央社報導

武漢肺炎防疫戰中,當前最重要的指令是勤洗手。但在戰火摧殘的葉門,乾淨用水極度稀缺,洗手是令數百萬人負擔不起的奢侈動作。法新社報導,葉門崩壞的醫療系統尚未記錄到任何俗稱武漢肺炎的確診病例,但若這波大流行病真的入侵葉門,對這個五年來衝突不斷、被聯合國稱為全球最嚴重人道危機的國家,將造成難以想像的影響。

無國界醫生組織(MSF)擔心許多葉門人無法取得乾淨水源或肥皂。根據聯合國兒童基金會(UNICEF)2019年11月提出的「葉門危機」報告,葉門約2800萬人口中,將近1800萬人無法正常取得安全水源,包括920萬名兒童,且僅有1/3人口能取得自來水。

水文
土地水文
國際新聞
葉門
水資源短缺
自來水
洗手

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※想知道網站建置、網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計及後台網頁設計

※不管是台北網頁設計公司、台中網頁設計公司,全省皆有專員為您服務

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※帶您來看台北網站建置,台北網頁設計,各種案例分享

※小三通物流營運型態?

※快速運回,大陸空運推薦?

只顧觀光不顧居民?東奧聖火核污染惹疑慮 政府民間不同調

文:宋瑞文(媽媽監督核電廠聯盟特約撰述)

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※想知道網站建置、網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計及後台網頁設計

※不管是台北網頁設計公司、台中網頁設計公司,全省皆有專員為您服務

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※帶您來看台北網站建置,台北網頁設計,各種案例分享

※小三通物流營運型態?

※快速運回,大陸空運推薦?

大眾汽車尾氣門賠償方案出爐

據外媒報導,大眾汽車集團將準備至少100億美元,應對“尾氣門”醜聞導致的賠償。按照美國聯邦法官設定的最後期限,大眾日前簽訂框架協定,將回購50多萬輛作弊柴油車,並將向車主支付賠償金。

大眾這次將賠上百億美元

據知情人士披露,大眾汽車集團此次還同意安排至少100億美元預算,用於支付美國政府的美國民事訴訟罰款和美國車主的索賠。

此外,大眾回購的車輛將包括自2009年起售的捷達轎車、高爾夫緊湊車及奧迪A3,這些車輛均搭載2.0升EA189柴油發動機。不過,包括奧迪和保時捷SUV在內的另外8萬輛搭載3.0升柴油發動機的車輛則不在回購範圍之內,這些車輛同樣採用了作弊軟體,使得測試結果好於實際情況。

關於本次大眾如何賠償,來自路透社的消息稱,目前在個人賠償方面,大眾還未做出任何決定。而德國《世界報》(Die Welt)4月20日則報導稱,大眾“尾氣門”解決方案中將包括支付相關車主每人5,000美元,涉及58萬輛車,但不包括升級軟體的費用。

損失總金額到底是多少?

大眾汽車將總共為尾氣門醜聞蒙受多少經濟損失?迄今尚無準確說法。起初在去年9月尾氣門曝光甫始,大眾被指將被美國當局罰款180多億美元,創汽車行業最大罰單。

之後大眾宣佈,在2015年第三季度安排67億歐元(約合76億美元)用於修復相關車輛和賠償。不過由於在全球範圍內涉及超過1,100萬輛車,之後又多次曝光更多車輛涉及排放測試舞弊,業界對大眾經濟損失總額的估計值也隨之膨脹。部分機構甚至認為大眾可能最終損失900億美元之巨。

不過實際情況可能沒有極端說法那樣令人震驚。從理論上說,大眾蒙受的民事賠償可能超過420億美元,但現實中卻並未達到該數字。彭博社分析師Brandon Barnes估算,大眾回購在美國所有舞弊車輛將耗費94億美元。

Evercore ISI機構最新估算數字顯示,大眾可能最終為尾氣門埋單大約300億歐元。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計、台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

※台灣海運大陸貨務運送流程

※兩岸物流進出口一站式服務

沃爾沃計畫到2025年電動車銷量達百萬輛

據報導,由於沃爾沃2015年全球銷量首次突破50萬輛大關,創下同期銷量紀錄,該公司計畫到2025年實現100萬輛電動車的銷量目標。

2015年,沃爾沃全球銷量同比增長了8%至503,127輛。該公司稱其計畫為每款車型都增添至少兩個混合動力版,在2019年推出一款純電動車,到2025年電動車銷量達到100萬輛。

除沃爾沃汽車集團外,雷諾-日產公司2015年電動車全球銷量達302,000輛,其計畫到2017年3月31日實現150萬輛電動車銷量目標,去年銷量則遠遠落後於此目標。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※想知道網站建置、網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計及後台網頁設計

※不管是台北網頁設計公司、台中網頁設計公司,全省皆有專員為您服務

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※帶您來看台北網站建置,台北網頁設計,各種案例分享

※小三通物流營運型態?

※快速運回,大陸空運推薦?