9月最受歡迎SUV前五名!價格優惠 檔次高!你也喜歡他們嗎?_租車

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

有別於一般網頁架設公司,除了模組化的架站軟體,我們的營業主軸還包含:資料庫程式開發、網站建置、網頁設計、電子商務專案開發、系統整合、APP設計建置、專業網路行銷。

終端優惠:普遍地區優惠5000以上,部分4S店提供低首付、低利率、長達60期的分期政策。點評:CR-V也是銷冠最有力的競爭者之一,雖然過去的輝煌已經不再,但是在人們心目中都會記得CR-V這一個名字,曾經需要加價提車、賣得火熱的車型到了今天依舊受到不少消費者支持,經過一輪改款,大氣時尚的外觀讓不少人折服。

來到10月中旬,又是一月一度的考核時間。沒錯!9月份的銷量報告已經強勢來襲。然而SUV市場的競爭是非常激烈的,無論是國產車市場還是合資市場,緊湊型SUV已經成為現今最受歡迎的車型之一,今天我們先來點評一下合資緊湊型SUV的成績如何。

9月份合資SUV前十名…

很明顯,在合資SUV榜單上,別克昂科威憑藉26448(輛)的銷量奪得9月份的合資SUV的銷量冠軍,而大眾神車大眾途觀則緊追其後,本月銷量22510(輛),然而在合資SUV銷量前十內,日系SUV佔了5個席位。

這些車到底有什麼能耐?

終端優惠:在大部分地區均有2萬左右的優惠,購買昂科威可享首付35%,18期免息貸款或至高10000元置換補貼或優惠增購禮遇。

點評:別克昂科威算得上是一個非常成功的車型,打從上市以來,憑藉自身時尚大氣的外觀設計、領先同級的配置水平、超大乘坐空間一舉將大眾途觀拉下榜首位置。人們的生活水平越來越高,尤其是在這一個“二胎時代”,車內空間的大小已經成為大部分消費者選車關注點。高實用性、高顏值、高配置成為了別克昂科威的主要賣點。

在動力方面,別克昂科威是這幾款車型中動力表現最為突出的車型,2.0T+6AT的動力表現能夠帶給你一種暢快淋漓的感覺,而且6AT變速箱的換擋邏輯清晰,能夠很好地了解駕駛者的意圖。另外在全車隔音方面,別克昂科威整體水平十分出色,搭配上寬大舒適的座椅,無論是駕駛員還是乘客,都能擁有一個非常不錯的駕乘體驗。

終端優惠:大部分地區有兩萬以上的優惠。

點評:大眾途觀,可以說是掀起我國SUV熱潮的發起者之一。然而途觀已經上市了很長一段時間了,在產品競爭力上可以說是相當低的,但為什麼賣得好?實際上大眾途觀跟哈弗H6有點相似,都存在一個先入為主的概念,還有大眾一直以來的口碑也是催使消費者選擇它的最大原因,因為它是神車呀。

作為大眾旗下的重磅產品,而且大眾玩渦輪增壓以及雙離合的技術也特別溜,屬於大眾目前最為主流的EA888發動機在動力表現方面突出,搭配上在民用車範疇內調校最為出色的7速雙離合變速箱,整體表現值得肯定,但是大眾一直一來“混合動力”的優良傳統在途觀上也是常見情況,

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

日本、大陸,發現這些先進的國家已經早就讓電動車優先上路,而且先進國家空氣品質相當好,電動車節能減碳可以減少空污

不燒機油的大眾車不是好的大眾車嘛,實際上這並不算的上是發動機故障,所以車主在日常駕駛中多關注一下機油量就好了。

終端優惠:普遍地區優惠5000以上,部分4S店提供低首付、低利率、長達60期的分期政策。

點評:CR-V也是銷冠最有力的競爭者之一,雖然過去的輝煌已經不再,但是在人們心目中都會記得CR-V這一個名字,曾經需要加價提車、賣得火熱的車型到了今天依舊受到不少消費者支持,經過一輪改款,大氣時尚的外觀讓不少人折服。前臉是改好了,只是尾部的設計卻是眾多消費者吐槽的主要點之一。

日系車一直以來的調調就是喜歡用自然吸氣發動機,而且本田嘛,I-VTEC的銷魂聲音也是讓無數人難以自拔的存在,而且本田CRV這兩套動力雖然動力平平,但已經足夠日常所需。得益於本田的MM理念(乘員空間最大化,机械空間最少化),在空間利用率方面CR-V是非常充裕的,能夠滿足各種家用需求。

終端優惠:大部分地區有5000以上的購車優惠,1.6T車型享受購置稅減半的國家政策。

點評:雖然同為緊湊型SUV,但實際上途勝在定位方面較上述三位选手低了一個等級,然而在這一個看臉的世界里,現代途勝擁有一個極其帥氣的外觀,這是相當符合年輕消費者的口味,另外一方面就是價格便宜,合資的品牌、國產車般的價格都讓它擁有一個非常不錯的競爭力!

作為韓系小生,顏值已經提過了,在動力方面現代途勝提供了2.0L+6擋手自一體變速箱以及1.6T+7速雙離合,在動力表現方面比較中規中矩,但1.6T排量的車型能享受購置稅優惠減半的政策加上一個比較大幅度的現金優惠,是值得入手的。

終端優惠:大部分地區超過2.5萬的購車優惠,除此以外各個4S店均還有不同程度的優惠政策。

點評:日產奇駿早在14年就進行了一次改款,外觀、內飾均得到了翻天覆地的變化,時尚、年輕的設計也讓它俘虜了不少消費者的內心,而且富有移動沙發之名的日產品牌在奇駿上也是發揮到了極致,大空間、超高的舒適性以及高配置配上不俗的外觀設計成為了奇駿最大的賣點。

就像上文所說,日系車還是喜歡玩自吸,在日產奇駿上提供了2.0L、2.5L兩款自吸發動機,與之搭配的是一台模擬7擋的CVT變速箱,在入門級車型還提供一款6MT的手動變速箱,只是這兩款發動機在技術方面確實比較落後,而且配上CVT的變速箱也談不了運動。但是發動機雖老但質量非常穩定,CVT專註家用,動力輸出平順而且還省油,這也是優點,對於奇駿這一台家用SUV來說,坐得舒服才是最重要的。

緊湊型合資SUV前5名

已經點評完畢

接下來還有更多的銷量報告

敬請期待…本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

※超省錢租車方案

商務出差、學生出遊、旅遊渡假、臨時用車!GO 神州租賃有限公司!合法經營、合法連鎖、合法租賃小客車!

帥氣 寬敞 大氣!聽說大部分成熟男人都選了這幾輛座駕!_包裝設計

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網動廣告出品的網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上她。

能給駕駛者提供更多的操控樂趣,但是也說不上運動型的底盤。如果忽略高轉速時比較轟耳的噪音,雅閣的舒適性是很不錯的。一汽馬自達-阿特茲指導價:17。58-23。98萬元阿特茲的顏值是一直都為車友們所稱道的,也承認,馬自達的魂動外觀的確是很有設計感,既有肌肉感的同時線條又十分流暢。



上世紀六七十年代,豐田乘着美國人的石油危機,憑藉其高可靠性,低油耗的汽車佔領了美國的汽車市場,奠定了豐田國際化的基礎。然而時至今日,日系車當中的佼佼者已經不止豐田一家。今天就和大家看看,在最能體現車企實力的B級車市場,“兩田一馬”,外加一個日產,其主力車型到底有什麼能耐。

指導價:18.48-32.98萬元

舊的凱美瑞會給人中庸,低調的感覺,難免會有“大叔車”的嫌疑。而新款的凱美瑞,採用了全新的家族式“Keen Look”前臉,六邊形的大嘴下格柵也讓車頭更加動感霸氣。側面的線條則比較簡潔流暢,變化不大,車尾造型依舊比較緊湊,橫穿左右的鍍鉻飾條是近來比較流行的元素,也讓車尾的整體感更強。

凱美瑞的內飾延續了以往車型的穩重大氣風格,採用人造皮革+縫線的工藝,內飾高級感更強。略遺憾的是中控大屏並沒有像其他主動和被動安全配置那樣都有全系標配。座椅厚實舒適的同時也保證一定的橫向支撐,舒適性不錯。

動力方面,搭載2.0L自然吸氣代號為6AR-FSE的發動機採用了D4-S雙模式噴射系統和VVT-iW新世代可變氣門正時技術,最大馬力167pS,6AT手自一體的變速箱集成了空擋控制系統、減擋補油控制系統和預緊差速器,動力平順性很好。實際駕駛感受起步動力是很靈敏的,雖然沒有很強的推背感,但也不會有“力不從心”的感覺,中後段的發力也有足夠的底氣。

凱美瑞的底盤是偏向舒適的設定,車內不會感受到十分直接的震動,同時轉向的助力比較沉穩,但轉向的靈敏度一般。總體來說如果你想要體驗操控樂趣的話,凱美瑞並不適合你,凱美瑞還是適合追求舒適、安靜的家用車用戶。

指導價:16.98-23.78萬元

本田也是很靈敏的廠商,它已經意識到現在購車群體的年輕化,所以就一改了以往雅閣那些濃濃的商務風,於是我們就看到呈現在我們眼前這個前臉造型立體,車身線條凌厲,有一雙科技感十足的LED大燈的新雅閣。當然,還有一些看不見的科技,如前置攝像頭和毫米波雷達,是Honda SENSING的基礎,該系統比較複雜,總的來說就是提供行駛安全輔助和保障。

和外觀不同,雅閣的內飾並沒有大改,對稱式的布局,線條十分流暢且有一點的高級感。不得不提是中控的雙屏設計了,兩個屏幕各司其職,用起來順手,看起來NB。但當你看了儀錶盤,你發現中央的行車電腦還是單色屏,也許是本田控製成本的手段,反正這個屏幕能显示必要信息足矣。

動力方面,2.0L/2.4L地球夢發動機,最大馬力155pS/186pS,搭配的CVT變速箱,都是本田的看見本領。和外觀的動感不同,雅閣的雖然油門響應靈敏,但動力的輸出卻不慌不忙,不會給你很激烈的加速感,

※產品缺大量曝光嗎?你需要的是一流包裝設計!

窩窩觸角包含自媒體、自有平台及其他國家營銷業務等,多角化經營並具有國際觀的永續理念。

整個加速過程很平順。如果你打算購買雅閣,就不要想激烈駕駛了,好好享受那平順的CVT吧。

雅閣的採用多連桿獨立后懸挂,算是B級車標配了,底盤的質感很不錯,反應靈敏,處理震動的動作夠快,比凱美瑞的質感要硬。能給駕駛者提供更多的操控樂趣,但是也說不上運動型的底盤。如果忽略高轉速時比較轟耳的噪音,雅閣的舒適性是很不錯的。

指導價:17.58-23.98萬元

阿特茲的顏值是一直都為車友們所稱道的,也承認,馬自達的魂動外觀的確是很有設計感,既有肌肉感的同時線條又十分流暢。於是,2017款的阿特茲也延續了這種設計理念,大嘴格柵通過鍍鉻飾條與兩隻鷹眼大燈相連,感覺像一種很猛的動物,但是又說不出像什麼動物,大家發揮想象力吧。

內飾設計的改變也不少,全新樣式的方向盤和中控按鍵、懸浮式的中控屏,還有一些銀色飾條的加入,運動感更強,唯一不變的應該是變速箱擋把了。內飾採用軟質的皮革材料,也有縫線工藝,質感不錯。座椅的填充比較結實,不是很厚,支撐性和包裹性都比較好,也符合阿特茲偏向運動的風格。

2.0L/2.5L的Skyactiv發動機,最大馬力158/192pS,搭配換擋邏輯聰明,能夠幾乎讓你忘記它存在的6AT手自一體變速箱,組成這個好開有活力的動力系統。實際駕駛的感受是與歐系車類似的,油門初段比較沉重,後段較線性,動力輸出並不弱且提速很快,但又不會有渦輪增壓車那種激烈的推背感。

國產的阿特茲是針對了國內的情況進行了特殊的調校,前段偏軟,小坑小窪的過濾很到位,但仍保留一定的路感,後段的懸挂表現更加紮實,能為高速轉彎的阿特茲提供更好的支撐性。

指導價:17.58-29.98萬元

全新天籟的外觀加入了日產家族式的V-motion設計理念,V字型的中網鍍鉻飾條以及回力標的大燈造型,這些設計都是為了讓日產的外形更加年輕動感,減少了舊款日產圓潤成熟的氣息。至於新日產的外觀好不好看,那就是見仁見智的了。

至於中控的布局變化變化不大,仍然是簡潔商務風,方方正正的中控台造型給人穩重大氣的感覺,只是少了一點時尚感。觸控大屏的加入是新天籟的一個進化,多媒體功能得到了一些升級。至於座椅則一直是天籟的優點,寬大且柔軟,舒適性很好。

動力方面,新款天籟依舊搭載2.0L/2.5L+CVT變速箱的動力系統,最大馬力為150pS/186pS。實際的動力表現依舊是十分平順線性,沒有什麼爆發點。舊天籟的懸挂調校是很軟的,但新天籟在保證舒適性的基礎上給懸挂增加了一點韌性,配合彎道自動循跡系統,新天籟在轉彎時的側傾控制會比舊款天籟要好,但相對同級車型依然不算突出。

總結:

和德系車不同,日系車的動力少了一份直接;和美系車也不同,日系車少了一份力量感。乍一看彷彿沒有什麼優點,但是當你開在路上的時候你又不會發現動力不夠用,你也不會收到乘客投訴你後排的舒適性。這就是日系B級車,看似平庸,實際上這種中庸的均衡的表現,已經蘊含着不少技術的力量在裡頭。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

南投搬家公司費用需注意的眉眉角角,別等搬了再說!

上新台中搬家公司提供您一套專業有效率且人性化的辦公室搬遷、公司行號搬家及工廠遷廠的搬家服務

那些你不知道的汽車標誌小秘密_台中搬家

台中搬家遵守搬運三大原則,讓您的家具不再被破壞!

台中搬家公司推薦超過30年經驗,首選台中大展搬家

而這個三叉星的含義,是代表着海、陸、空的机械化,換言之即是要在這三個領域當老大的意思。法拉利是世界頂級的跑車品牌,創始人恩佐法拉利從一個車隊跟班慢慢成長為賽車界的大佬,最後創立經典的法拉利公司,簡直就是一個傳奇。

相信不少朋友都知道汽車標誌這個東西的存在,不過這些汽車標誌的背後到底有什麼來歷,那可能就沒有這麼多人搞清楚了,所以今天給大家簡單說說一些品牌標誌的故事。

阿爾法羅密歐是一個很有歷史的意大利品牌,而它的標誌也非常高大上,內容也相當豐富。其大約來由就是,在1910年阿爾法羅密歐成立的時候,將米蘭城盾形徽章里的紅色十字和吃人的龍形蛇組成到了一塊,象徵著中世紀米蘭領主維斯康泰公爵的祖先擊退使城市人民遭受苦難的“龍蛇”的傳說。而經過一百多年的變遷,其標誌也進行過不同程度的修改,這也紀錄著阿爾法羅密歐的發展歷程。

奧迪作為最為人熟知的德系汽車品牌,其標誌是四個圓環相扣在一起,只比五環少一環。其來歷就是當時在德國的四家汽車車企Audi、Horch、DKW和Wanderer,在二戰前聯合起來成立了一個集團,史稱汽車聯盟。當時的這個汽車聯盟還參加了歐洲不少的汽車賽事,在汽車運動史上留下了深深的足跡,到了後來才演變為現在的奧迪。

寶馬長久以來都是汽車界的豪強品牌,藍白相間的標誌是街知巷聞。最初寶馬是一個紮根在德國巴伐利亞州的發動機製造公司,其創始人決定採用巴伐利亞州的州徽來作為自家品牌的標誌。後來寶馬不論是搞飛機還是汽車摩托車,

台中搬家公司費用怎麼算?

擁有20年純熟搬遷經驗,提供免費估價且流程透明更是5星評價的搬家公司

都造得有聲有色,而這個藍白相間的標誌也就傳遍宇宙了。

奔馳的標誌一直被大家稱為三叉星,世上第一輛汽車就出自奔馳。所以,擁有這個簡單易記的標誌,更是有助於品牌宣傳。而這個三叉星的含義,是代表着海、陸、空的机械化,換言之即是要在這三個領域當老大的意思。

法拉利是世界頂級的跑車品牌,創始人恩佐法拉利從一個車隊跟班慢慢成長為賽車界的大佬,最後創立經典的法拉利公司,簡直就是一個傳奇。其躍馬標誌也成為世上辨識度最高的標誌之一。其來由相信很多人都聽說過了,就是受一位飛行員老媽的建議,將她兒子飛機上的躍馬標誌copy到自家車上,以期帶來好運。後來飛行員是壯烈犧牲了,但法拉利的公司一直發展到現在。

蘭博基尼也是一個很有個性的跑車品牌,創始人Ferruccio Lamborghini靠着造拖拉機起家,還是個金牛座。本來是個法拉利迷,後來因為和法拉利公司結下樑子,毅然創立蘭博基尼跑車公司,推出大量以鬥牛命名的跑車來與法拉利抗衡。

雪佛蘭的logo被大家戲稱為“衛生巾”。沒錯,就因為那個十字形狀的傢伙。其來由也是有各種不同版本的解答,有的說靈感來源於因為看着牆發獃,覺得牆紙好看,就有了靈感;有的說是在吃吃喝喝的湧出靈感;還有的說是因為由瑞士國旗啟發而來。我看完之後決定也去努力吃吃喝喝然後發獃,看會不會突然來什麼靈感,做點什麼事情,然後走上人生巔峰。

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

台中搬家公司費用怎麼算?

擁有20年純熟搬遷經驗,提供免費估價且流程透明更是5星評價的搬家公司

vivo南紡體驗店登場!推五大開幕限定優惠,再抽萬元五星級飯店雙人假期_網頁設計

台北網頁設計公司這麼多該如何選擇?

網動是一群專業、熱情、向前行的工作團隊,我們擁有靈活的組織與溝通的能力,能傾聽客戶聲音,激發創意的火花,呈現完美的作品

vivo 繼在高雄、台北和台中開設體驗店後,今(12/25)宣布進駐台南佔地最大購物商場–南紡購物中心A2館,為歡慶全台第四間體驗店正式開幕,加上適逢聖誕佳節,vivo特地祭出歷來最殺開幕限定好禮,首三日購買全系列機種可享五大購機優惠,再抽五星級飯店吃住玩雙人假期行程。

vivo南台灣最大體驗店今登場 五大開幕限定優惠

台南南紡購物中心A2館包含地上九層、地下兩層,整體面積約2.1萬坪,商業面積約8千多坪,看準購物中心發展潛力,vivo選擇在此打造南台灣最大體驗店,店內空間寬敞明亮,展現簡潔舒適時尚科技氛圍,近30坪室內空間包含展示體驗區、產品交機區、週邊配件區,帶給消費者全系列完整服務。

今天早上的開幕我們也做了直播介紹,眾多好康購機資訊也在裡面:

 

寬廣的體驗區:

完整配件區:

為歡慶vivo正式落腳台南,vivo於開幕首三日推出超殺開幕好康回饋消費者,凡於12/25-12/27購機可享五大獨家優惠,優惠一,購買vivo X50 Pro旗艦機,送價值6,389元vivo Y12和vivo運動藍牙耳機:

網頁設計最專業,超強功能平台可客製化

窩窩以「數位行銷」「品牌經營」「網站與應用程式」「印刷品設計」等四大主軸,為每一位客戶客製建立行銷脈絡及洞燭市場先機。

優惠二,買vivo X50送市價3990元DJI OM4磁吸式手持雲台,優惠三,購買X全系列可享延長保固至24個月、螢幕意外保障12個月、2021限定桌曆和vivo原廠33W閃充組,上網登錄再送全聯禮券900元:

優惠四,買vivo V與Y系列手機送延長保固至18個月、代言人張鈞甯悠遊卡、vivo輕量雙肩電腦包、V Friends藍牙耳機:

優惠五,購買vivo運動藍牙耳機送KKBOX 30日體驗卡。

除了一系列購機禮外,12/31前只要入手全系列vivo手機並至官網登入序號,還有機會抽中市價14,220元麗寶樂園×福容大飯店五星級飯店吃住玩全包雙人麗寶假期行程,內含精緻雙人房住宿一泊一食、渡假區禮券800元和饗樂券4張。此外,vivo也將於12/26(六)邀請氣球姊姊、12/27(日)請來造型棉花糖達人舉辦快閃活動,凡於周末指定時間到店體驗產品並拍照上傳即可獲得體驗禮,當日不限金額消費還可客製特殊造型款氣球或棉花糖。

4體驗店+3客戶服務中心 六大最強售後搶攻市場

vivo表示,目前已在台北三創、高雄夢時代、台中一中和台南南紡設有四間體驗店,客戶服務中心則在新北、台中、高雄皆有據點,2021年目標將在全台六大都會區完成體驗店布局,此外,vivo也推出業界最強六大保固,凡購買任一機種可享「業界最長15日新品換貨」、「終身維修免費到府收送」、「終身免檢修費」、「保固內原廠殼和原廠保護貼免費更換各兩次」、「終身免費手機健檢」、「長期服務始終如一」等6大業界最強售後保固,希望透過更全面的銷售通路和貼心服務搶攻市場,讓消費者能深入感受 vivo 手機的魅力!

另外在 vivo 館旁也有野獸國快閃店,裡面有展出X戰機 1:1 模型,可上去搭乘拍照,旁邊也有漫威免費著色活動,相當適合帶親子來這邊逛逛,建議大家晚上來更漂亮喔:

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

※推薦評價好的iphone維修中心

擁有專業的維修技術團隊,同時聘請資深iphone手機維修專家,現場說明手機問題,快速修理,沒修好不收錢

台灣之星推出網路限定「用多少付多少」升級版,享受 5G 高速網路就是這麼輕鬆_貨運

※智慧手機時代的來臨,RWD網頁設計為架站首選

網動結合了許多網際網路業界的菁英共同研發簡單易操作的架站工具,及時性的更新,為客戶創造出更多的網路商機。

各家業者都在推 5G 行動網路,手機廠商也因應潮流陸續推出各種 5G 機型,5G 又快、又順真是非常誘人,只不過目前的 5G 資費價格還是偏高,且基站覆蓋率還須努力,要我立刻拋下 4G 轉身迎向 5G,皇上,臣妾真是做不到啊!好險世道還有公平正義,台灣之星從開台就主打「用到 5G 才付錢」的精神,將入手 5G 的門檻降到 399 元,每月有 20GB 上網量可以用;另外還有 4G 不限速吃到飽 799 起,5G 上網另外收費,最高只要加 200 元就可享 4G+5G 吃到飽,所以如果沒有用到 5G 訊號,就只要付 4G 吃到飽的錢就好。

這回台灣之星 So Sweet,特別為超想試試 5G 快感又步步驚心的你推出了「用多少,付多少」5G 版,讓你的每一分錢都用在刀口上,硬是把5G月租降到$0起,入主 5G 就是這麼輕鬆。

0 元起享受台灣之星 5G 飆速快感,立刻申辦點這裡

台灣之星推出網路限定「用多少付多少」升級版,享受 5G 高速網路就是這麼輕鬆

「4G 上網吃到飽」方案是許多人用以滿足生活、工作等網路需求的選擇,每個月只需繳交固定的金額就能滿足所需的無限網路流量,用起來心裡完全無負擔。雖說最新的高速 5G 網路相當吸引人,又很想試試,但是又不知道各家的訊號覆蓋怎麼樣,而目光所見所有的 5G 吃到飽方案低消都得要負擔制少 1399 元的高額月租,先不說這個金額對於一般人來說有多沉重,即便你每日出沒區域還是 4G 網路居多,用到 5G 的機會少之又少,還是免不了要繳交一樣的費用。對於薪水不漲、精打細算的現代人來說,這完全不符合經濟效益,難道要把血汗錢這麼揮霍?

0 元起享受台灣之星 5G 飆速快感,立刻申辦點這裡

台灣之星「用多少付多少」,5G 也可以輕鬆繳

好想用用時下最有話題的 5G 高速網路喔!可是月租拿~摸貴,訊號覆蓋又不夠普及,如果有平價 5G 那該有多好!
吃到飽餐廳裡明明都是付一樣的錢,卻可能因為食量小才吃一點點,對海鮮過敏只能吃肉,眼看著餐檯上滿滿的美食卻真得只能看而已,這根本不是真正的價格公道。噹啷!一向對電信資費方案最有創意的神燈精靈、正義使者 — 台灣之星將實現你的願望!在過去,台灣之星針對了輕量型 4G 行動上網用戶推出大受好評的「用多少付多少」方案,這次全新推出 5G 版「用多少付多少」。資費表先奉上:

◎設定費 300 元為單次費用,將在合約生效後的次月帳單中收取。

這個條件超優渥的資費方案可是【網路門市限定】,要怎麼辦理?必須符合哪些資格?

  • 新申裝與攜碼用戶皆可在網路門市申辦
  • 準備好身分證、第二證件(駕照或健保卡)就可申辦

0 元起享受台灣之星 5G 飆速快感,立刻申辦點這裡

台灣之星「用多少付多少」5G 版有什麼優勢?

為什麼筆者會如此推崇這回台灣之星的 5G 用多少付多少方案呢?先說說我的結論:夠厚道。怎麼說呢?筆者把台灣之星這項升級版方案的優勢與特色列了下來。

  • 4G 與 5G 分開計費,沒用到不用錢
    因為現在的 5G 基站還在進行中,除非你居住、工作與出沒地都在六都蛋黃區或是夠熱鬧的商圈,否則很多時候你用到的並不是 5G 網路,而是系統為了讓你能繼續上網而跳轉到 4G 網路。如果是其他電信業者的計費方式來看,不管你是用 4G 還是 5G 網路,通通得繳一樣的費用,就是一開始你所辦理,平均定價為 1,399 元的所謂「5G 吃到飽」(明明大多數時候可能吃的還是 4G)。台灣之星的計價方式清楚透明,將 4G 與 5G 用量分開計算,怎麼用就怎麼繳,有用到才收費,沒用到不坑錢,不敷衍、不含糊。
    舉例來說:
    這個月只有用到 4G,所用的網路計費就以資費表中的 4G 收費方式來算,每 GB 只要 30 元
    這個月只有用到 5G,所用的網路計費就以資費表中的 5G 收費方式來算,每 GB 只要 60 元
    兩個都有用到,那就看你用幾 GB 的 4G 網路、幾 GB 的 5G 網路,分開計算後再合計費用

    ※回頭車貨運收費標準

    宇安交通關係企業,自成立迄今,即秉持著「以誠待人」、「以實處事」的企業信念

  • 設置計費天花板,不怕帳單爆天價
    以量計價的收費方式,很多人都會擔心是否在無聲無息之間用得太多使得下個月收到天價帳單而用得戰戰競競。台灣之星設置了收費天花板,4G 網路吃到飽最高收到 499 元,5G 網路最高收到 899 元,就算是有時 4G 有時 5G 的使用,最多也是只收到 899 元,有效幫你控制最高支出,讓你安心暢快飆網衝浪。
    舉例來說:
    5G 網路收費 60 元/GB,這個月用了 30GB;4G 網路收費 30 元/GB,這個月用了 20GB
    原本應該支付 60 元 x 30GB + 30 元 x 20GB = 2,400 元
    台灣之星優惠只需支付最高 899 元  為你省下 1,501 元

  • 帳單 0 元起,無低消限制
    最常看到的資費方案,就算你很少用到,還是要支付一筆最低消費,是說花錢買沒用到的東西再便宜都是浪費。台灣之星「用多少付多少」方案最大的特點(與優良傳統)就是終身 0 月租,如果這個月完全沒用到,你就完全不需要付費,讓你的每一分錢都發光發熱,不造成額外的浪費。
    舉例來說:
    我出國去玩個一個月,本月手機根本沒有用到,那我這個月就完全不需要繳錢。

0 元起享受台灣之星 5G 飆速快感,立刻申辦點這裡

沒用到,幹嘛繳?台灣之星「用多少付多少」收費最實在

筆者自己一直很猶豫到底要不要搶在首波加入 5G 的行列,但想想目前 5G 訊號覆蓋不如 4G 網路來得全面又穩定,看著各家業者動不動就上千元的 5G 吃到飽費率,我也產生了許多疑慮,因為居住地、出沒地的不同,似乎也很難確保真得能否暢享 5G 吃得飽,往往變成繳了 5G 吃到飽費用卻一直在用 4G。台灣之星「用多少付多少」升級版不僅有 4G,這回更把 5G 也納入其中,也就是說你用了多少 4G,用了多少 5G ,費用明明白白、清清楚楚,你沒有用到的就完全不需要付費,這點對於大眾來說是最實惠的計價方式。以實際用量為準,免除其他業者一刀切資費方案下可能白花的錢,最適合精打細算又對 5G 躍躍欲試的你。

 

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

※評比南投搬家公司費用收費行情懶人包大公開

搬家價格與搬家費用透明合理,不亂收費。本公司提供下列三種搬家計費方案,由資深專業組長到府估價,替客戶量身規劃選擇最經濟節省的計費方式

Counterpoint公布2020第三季報告,聯發科逆襲成為最大手機晶片供應商_網頁設計公司

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

節能減碳愛地球是景泰電動車的理念,是創立景泰電動車行的初衷,滿意態度更是服務客戶的最高品質,我們的成長來自於你的推薦。

2020 年因為疫情的持續擴散,對各種產業來說都是個凜冬,然而還是有些企業在冷清的時局中創下不錯的成績,聯發科就是其中的一員。根據市場研究機構 Counterpoint 最新公布的 2020 年第三季報告中,更是顯示因為中階手機的蓬勃發展與在關鍵地區的市場持續增長,幫助聯發科逆襲高通,於第三季中登上最大智慧手機晶片供應商的寶座。

Counterpoint公布2020第三季報告,聯發科逆襲高通成為最大手機晶片供應商

在 2020 年第三季中,聯發科在 100 至 200 美元價位的手機間強勁增長,以及於至中國、印度等地區的增長,讓聯發科以 31% 的市場佔比成為最大的智慧手機晶片組供應商。於此同時,2020 年第三季最大的 5G 晶片供應商由高通穩坐,在全球市場的 5G 手機中擁有 39% 的佔比。5G 手機的需求量在 2020 年第三季翻了一倍,光是在這一季裡面售出的智慧型手機中有 17% 是 5G 手機,隨著 Apple 推出其 5G 產品線後,更是加速了 5G 手機的銷售。2020 年第四季度發貨的所有智慧型手機中,預計會有三分之一支援 5G,所以高通仍有可能於 2020 年第四季重新奪回榜首位置。

在對聯發科市場佔比增長的部分,分析師表示聯發科在 2020 年第三季市場佔比猛烈增長主要原因有三。首先是中階智慧型手機與新興市場的強勢表現相當亮眼,美國隊華為的禁令也使得最終讓 Samsung、小米、榮耀等 OEM 廠勝出。與去年同期相比,聯發科晶片在小米手機的佔比增長 3 倍以上,而聯發科也利用美國禁令的時機彌補了晶片需求缺口,使得由台積電製造、經濟實惠的聯發科晶片迅速成為許多 OEM 廠商填補空白的第一選擇。

從另一個方面來看,高通在 2020 年第三季裡面於高階領域與一年前相比也取得了強勁的市佔增長,這再次得益於 HiSilicon 的供應問題,然而高通在中階市場面臨著聯發科的競爭,顯然這一仗打得比較吃力。透過激進的訂價策略和主流 5G 晶片產品的推出,兩者之間激烈的兢爭在 2021 年還會繼續。

高通和聯發科都重新對各自的產品線重新洗牌,消費者對最新科技的關注在其中發揮了關鍵作用。去年,聯發科推出了一款以遊戲為主的曦力 G 系列晶片,而天璣系列晶片則將 5G 導向更經濟實惠的路線,全球最便宜的 5G 行動裝置 realme V3 就是由聯發科提供支援。分析師表示,晶片供應商的當務之急是將 5G 帶給大眾,從而釋放如雲端遊戲等消費者 5G 使用的潛力,進而提升對更高時脈 GPU 和更強大的處理器需求。

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

搬家費用:依消費者運送距離、搬運樓層、有無電梯、步行距離、特殊地形、超重物品等計價因素後,評估每車次單

◎資料來源:Counterpoint

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

透過選單樣式的調整、圖片的縮放比例、文字的放大及段落的排版對應來給使用者最佳的瀏覽體驗,所以不用擔心有手機版網站兩個後台的問題,而視覺效果也是透過我們前端設計師優秀的空間比例設計,不會因為畫面變大變小而影響到整體視覺的美感。

JavaScript的歷史由來及簡介_網頁設計公司

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網站的第一印象網頁設計,決定了客戶是否繼續瀏覽的意願。台北網動廣告製作的RWD網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上它。

JavaScript的歷史由來及簡介

前言

這次寫一篇對於JavaScript的簡介,我們知道的編程語言有很多種,比如Java、C++、Python等等,每種編程語言都有其獨具的特色,不論是語法格式還是表達形式,都能讓每個程序員沉澱在知識的海洋里難以自拔。即每種編程語言都有無限的延展性,但如果我們考慮問題的時候追溯其根源,其實也不難發現每種編程語言都具有共同的初心,最直白的話就是人與計算機進行溝通的語言,在現實生活中,見什麼人說什麼話我們都很清楚,那在與計算機溝通的世界中,做什麼事用什麼編程語言溝通也是同樣的道理,前提就是我們要了解這些編程語言,在你需要選擇的時候做出正確的判斷,這也正是我寫此篇文章的意義。

JavaScript的歷史由來

 

 
在1994年,當時的網景公司(Netscape)憑藉Navigator這個瀏覽器成為了Web時代開啟最著名的第一代的互聯網公司。當時所用的第一版本的瀏覽器就是下圖中的瀏覽器,相信有很多年輕朋友都沒有見過這種瀏覽器。如果大家回想十年前或是十五年前,大家用的瀏覽器應該是IE瀏覽器,那個時候的瀏覽器跟現在的比如說谷歌瀏覽器火狐瀏覽器等相比而言,那就是天壤之別了。

 

 

 

像上圖中這是最早版本的瀏覽器,整個瀏覽器都是靜態的,也就是用HTMLCSS寫的,並沒有像今天的各種瀏覽器一樣具有各種各樣的動態效果了,比如像網頁的圖片輪播、鼠標懸浮切換等效果。

網景公司就想在原來的靜態頁面的基礎上添加一些動態的效果,這時候網景公司出來一個很牛的人物叫布蘭登·艾奇,他用不到兩周的時間就設計出了能在網頁上實現動態效果的編程語言。

 

 

就是上圖中的人設計的這中能實現網頁動態效果的編程語言,並將其編程語言命名為JavaScript

為什麼會命名為JavaScript呢?原因是在當時,Java非常火,網景公司希望借用Java在當時的名氣來進行推廣。其實事實上呢,JavaScript除了語法上有點像Java外,別的地方都跟Java沒有任何關係。

 

 

JavaScript和ECMAScript的關係

從上面講的JavaScript的由來中,我們就知道JavaScript由網景公司的布蘭登·艾奇開發出來的,一年後,微軟又模仿JavaScript開發出了一種編程語言叫JScript,再後來,陸續又有別的商家推出JavaScript的不同實現語言。這就導致JavaScript的語法和特性日益混亂,其標準化問題被提上日程。最終由歐洲計算機製造商協會(ECMA)以JavaScript1.1為藍本,制定了【ECMA-262】標準,並由此標準定義了一種新腳本語言ECMAScript。隨後,ISO也採用ECMAScript作為標準,各瀏覽器廠商便紛紛開始將ECMAScript作為各自JavaScript實現的基礎。

 

 

那到底JavaScriptECMAScript有什麼關係呢? ECMAScript其實並不等同於JavaScript,它只是JavaScript的核心標準(語法、類型、語句、關鍵字、保留字、操作符、對象),而JavaScript還包括文檔對象模型(DOM)和瀏覽器對象模型(BOM)等。其中各主流瀏覽器對ECMAScript的支持都還不錯,但對DOM的支持相差較大,對於BOM一直沒有相關標準。最後再簡單總結一下就是:ECMAScript是一種語言標準,JavaScript是對ECMAScript的一種實現

JavaScript版本

  • 1997年06月 :發布首版。

  • 1997年06月:修改規範完全符合ISO/IEC 16262國際標準。

  • 1998年6月,ECMAScript 2.0版發布。

  • 1999年12月,ECMAScript 3.0版發布,成為JavaScript的通行標準,得到了廣泛支持。

  • 1999年12月:增加正則、更好的文字處理、新的控制語句、try/catch異常處理、更加明確的錯誤定義,数字輸出格式等等。放棄發布。

  • 2007年10月,ECMAScript4.0版草案發布,對3.0版做了大幅升級,預計次年8月發布正式版本。草案發布后,由於4.0版的目標過於激進,各方對於是否通過這個標準,發生了嚴重分歧。以Yahoo、Microsoft、Google為首的大公司,反對JavaScript的大幅升級,主張小幅改動;以JavaScript創造者Brendan Eich為首的Mozilla公司,則堅持當前的草案。

  • 2008年7月,由於對於下一個版本應該包括哪些功能,各方分歧太大,爭論過於激進,ECMA開會決定,中止ECMAScript 4.0的開發,將其中涉及現有功能改善的一小部分,發布為ECMAScript3.1,而將其他激進的設想擴大範圍,放入以後的版本,由於會議的氣氛,該版本的項目代號起名為Harmony(和諧)。會後不久,ECMAScript 3.1改名為ECMAScript 5。

  • 2009年12月:完善了ECMASript 3版本、增加”strict mode,” (嚴格模式)、以及新的功能,如getter和setter、 JSON庫支持和更完整的對象屬性。ECMAScript 5.0版正式發布。Harmony項目則一分為二,一些較為可行的設想定名為JavaScript.next繼續開發,後來演變成ECMAScript 6;一些不是很成熟的設想,則被視為JavaScript.next.next,在更遠的將來再考慮推出。

  • 2011年06月:ECMAscript 5.1版發布,並且成為ISO國際標準(ISO/IEC 16262:2011)。

  • 2013年3月,ECMAScript 6草案凍結,不再添加新功能。新的功能設想將被放到ECMAScript 7。

  • 2013年12月,ECMAScript 6草案發布。

  • 2015年06月:第六版的名字有很多,可以叫ECMAScript6 (ES6) ,也可以叫ECMAScript 2015 (ES2015) 。

  • 2015年6月17日,ECMAScript 6發布正式版本,即ECMAScript 2015。

  • 2016年06月:也被稱為ECMAScript 2016。完善ES6規範,還包括兩個新的功能:求冪運算符(*) 和array.prototype.includes方法。

  • 2017年06月:增加新的功能,如併發、原子操作、Object.values/Object.entries、 字符串填充、promises、 await/asyn等等。

JavaScript的組成部分

 

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

以設計的實用美學觀點,規劃出舒適、美觀的視覺畫面,有效提昇使用者的心理期待,營造出輕鬆、愉悅的網站瀏覽體驗。

 
JavaScript的三個主要組成部分是:ECMAScript(核心),DOM(文檔對象模型),BOM(瀏覽器對象模型)

 

ECMAScript(核心)

【ECMA-262】並沒有參照web瀏覽器,規定了語言的組成部分,其具體內容包括語法、類型、語言、關鍵字、保留字、操作符、對象等。

ECMAScript的兼容

  1. 支持【ECMA-262】描述的所有“類型、值、對象、屬性、函數以及程序語法和語義” 。

  2. 支持Unicode字符標準。

  3. 添加【ECMA-262】沒有描述的更多“類型、值、對象、屬性和函數”,【ECMA-262】說的這些新增特性,主要是指該標準中沒有規定的新對象和對象的新屬性。

  4. 支持【ECMA-262】中沒有定義的“程序和正則表達式的語法”。也就是說可以修改和擴展內置的正則表達式語法。

DOM(文檔對象模型)

文檔對象模型(DOM)是針對XML但經過擴展用於HTML的應用程序編程接口(API)。DOM把整個頁面映射為一個多層次節點結構。HTML或者XML頁面中的每個組成部分都是某種類型的節點,這些節點又包含着不同類型的數據。

 

 

其實說白了,文檔對象模型(DOM)就是操作網頁上的那些標籤,來實現動態的效果。

在DOM中,頁面一般可以用分層節點圖表示。

 

 

DOM級別

  • DOM1級於1998年10月成為W3C的推薦標準。BOM1由兩個模塊組成分別是DOM coreDOM HTML

  • DOM core:規定如何映射基於XML的文檔結構,以便簡化對文檔中任意部分的訪問和操作。

  • DOM HTML:在DOM core的基礎上加以擴展,添加了針對HTML的對象和方法。

  • DOM2級在原來DOM的基礎上有擴充了鼠標和用戶界面事件、範圍、遍歷等細分模塊,通過對象接口增加了對css的支持。包括以下模塊:

  1. DOM Views(DOM視圖):定義了跟蹤不同文檔視圖的接口。

  2. DOM Events(DOM事件):定義了事件與事件處理的接口。

  3. DOM Traversal and Range(DOM遍歷和範圍):定義了遍歷和操作文檔的接口。

  • DOM3級則進一步擴展了DOM,引入了加載和保存模塊以統一方式加載和保存文檔的方法;新增了DOM驗證模塊主要還是驗證文檔的方法。

BOM(瀏覽器對象模型)

瀏覽器對象模型(BOM)是處理瀏覽器窗口框架,我們習慣上把所有針對瀏覽器的JavaScript擴展算作是BOM的一部分。包括以下:

  1. 彈出新瀏覽器窗口的功能。

  2. 移動、縮放和關閉瀏覽器窗口的功能。

  3. 提供瀏覽器所加載頁面的詳細信息的navigator對象。

  4. 提供瀏覽器所加載頁面的詳細信息的location對象。

  5. 提供用戶分辨率詳細信息的screen對象。

  6. 對cookies的支持。

  7. 像XMLHttpRequest和IE的ActionXobject這樣的自定義對象。

瀏覽器對象模型(BOM)其實很簡單,它包含了當前瀏覽器上的一些操作,比如說像關閉按鈕、刷新按鈕、前進和後退按鈕等等。

綜上來說,JavaScript就包含了以上這三部分內容,第一部分就是核心基礎語法,這是非常非常重要的東西,有了核心基礎的鋪墊,我們才能後續的學習文檔對象模型(DOM)和瀏覽器對象模型(BOM).文檔對象模型(DOM)就是操作一些網頁上的一些標籤元素,來實現網頁上的動態效果。而瀏覽器對象模型(BOM)就是像比如說滾動的行為,點擊回到頂部,還有刷新,前進,後退等操作。這些特性就是我們需要了解的內容,在你後續進行詳細學習的時候,就帶着這些特性疑問去學習,會有事半功倍的效果。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

台中景泰電動車行只是一個單純的理由,將來台灣的環境,出門可以自由放心的深呼吸,讓空氣回歸自然的乾淨,減少污染,留給我們下一代有好品質無空污的優質環境

線性結構隊列以及應用(上)_台中搬家公司

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

擁有後台管理系統的網站,將擁有強大的資料管理與更新功能,幫助您隨時新增網站的內容並節省網站開發的成本。

隊列Queue:什麼是隊列?

對列是一種有次序的數據集合,其特徵是新數據項的添加總發生在一端(通常稱為“尾rear”端),而現存數據項的移除總發生在另一端(通常稱為“首front”端)

當數據項加入隊列,首先出現在隊尾,隨着隊首數據項的移除,它逐漸接近隊首。新加入的數據項必須在數據集末尾等待,而等待時間最長的數據項則是隊首。這種次序安排的原則稱為:先進先出。

隊列的例子出現在我們日常生活的方方面面:水管,排隊;隊列僅有一個入口和一個出口。不允許數據項直接插入隊中,也不允許從中間移除數據項。

抽象數據類型Queue

抽象數據類型Queue是一個有次序的數據集合,數據項僅添加到“尾”端,而且僅從”首“端移除,Queue具有先進先出的操作次序。

  • 抽象數據類型Queue由如下操作定義:

    Queue():創建一個空隊列對象,返回值為Queue對象;

    enqueue(item):將數據項item添加到隊尾,無返回值;

    dequeue():從隊首移除數據項,返回值為隊首數據項,隊列被修改;

    isEmpty():測試是否空隊列,返回值為bool;

    size():返回隊列中數據項的個數。

    隊列操作 隊列內容 返回值
    q=Queue() [] Queue object
    q.isEmpty() [] True
    q.enqueue(4) [4]
    q.enqueue(“dog”) [“dog”,4]
    q.enqueue(True) [True,”dog”,4]
    q.size() [True,”dog”,4] 3
    q.isEmpty() [True,”dog”,4] False
    q.enqueue(“dog”) [8.4,True,”dog”,4]
    q.dequeue() [8.4,True,”dog”] 4
    q.dequeue() [8.4,True] “dog”
    q.size() [8.4,True] 2

Python實現Queue

採用List來容納Queue的數據項,將List首端作為隊列尾端,List的末端作為隊列的首端,enqueue()複雜度為O(n),dequeue()複雜度為O(1)

class Queue:
    def __init__(self):
        self.items = []
        
    def isEmpty(self):
        return self.items == []
    
    def enqueue(self, item):
        self.items.insert(0, item)
        
    def dequeue(self):
        return self.items.pop()
    
    def size(self):
        return len(self.items)

注意:首尾倒過來的實現,複雜度也倒過來。

隊列的應用:約瑟夫問題

傳說猶太人反叛羅馬人,落到困境,約瑟夫和39人決定殉難,坐成一圈,報數1-7,報到7的人由旁邊殺死,結果略瑟夫給自己安排了個位置,最後活了下來……

模擬程序採用隊列來存放所有參加遊戲的人名,按照報數的方向從隊首排到隊尾,模擬遊戲開始,只需要將隊首的人出隊,隨機再到對尾入隊,算是一次報數完成,反覆n次后,將隊首的人移除,不再入隊,如此反覆,知道隊列中剩下一人。

def JosephQuestion(namelist,num):
    simqueue = Queue()
    for name in namelist:
        simqueue.enqueue(name)

    while simqueue.size() > 1:
        for i in range(num):
            simqueue.enqueue(simqueue.dequeue())  # 一次傳遞

        simqueue.dequeue()   # 處死隊首
    
    return simqueue.dequeue()

隊列的應用:打印任務

有如下場景:多人共享一台打印機,採取“先到先服務”的策略來執行打印任務,在這種設定下,一個首要問題就是:這種打印作業系統的容量有多大?在能夠接受的等待時間內,系統能夠容納多少用戶以多高頻率提交到少打印任務?

一個具體的實例配置如下:

一個實驗室,在任意的一個小時內,大約有10名學生在場,這一個小時中,每個人發起2次左右的打印,每次1-20頁。打印機的性能是:以草稿模式打印的話,每分鐘10頁,以正常模式打印的話,打印質量好,但是速度下降,每分鐘只能打印五頁。

問題:怎麼設定打印機的模式,讓大家都不會等太久的前提下,盡量提高打印質量?這是一個典型的決策支持問題,但無法通過規則直接計算,我們要用一段程序來模擬這種打印任務場景,然後對程序運行結果進行分析,以支持對打印機模式設定的決策。

如何對問題建模:

首先對問題進行抽象,確定相關的對象和過程。拋棄那些對問題實質沒有關係的學生性別,年齡,打印機型號,打印內容,智障大小等等眾多細節。

對象:打印任務,打印隊列,打印機。

打印任務的屬性:提交事件,打印頁數

打印隊列的屬性:具有“先進先出”性質的打印任務隊列

※推薦台中搬家公司優質服務,可到府估價

台中搬鋼琴,台中金庫搬運,中部廢棄物處理,南投縣搬家公司,好幫手搬家,西屯區搬家

打印機的屬性:打印速度,是否忙

過程:生成和提交打印任務

確定生成概率:實例為每小時會有10個學生提交的20個作業,這樣概率是每180秒會有1個作業生成並提交,概率為每秒1/180。

確定打印頁數:實例是1-20頁,那麼就是1-20頁之間概率相同。

過程:實施打印

當前的打印作業:正在打印的作業

打印結束倒計時:新作業開始打印時開始倒計時,返回0表示打印完畢,可以處理下一個作業。

模擬時間:

統一的時間框架:以最小單位(秒)均勻流逝的時間,設定結束時間

同步所有過程:在一個時間單位里,對生成打印任務和實施打印兩個過程各處理一次

打印任務問題:流程模擬

創建打印隊列對象

時間按照秒的單位流逝

按照概率生成打印作業,加入打印隊列

如果打印機空閑,且隊列不空,則取出隊首作業打印,記錄此作業等待時間

如果打印機忙,則按照打印速度進行1秒打印

如果當前作業打印完成,則打印機進入空閑

時間用盡,開始統計平均等待時間

作業的等待時間

生成作業時,記錄生成的時間戳

開始打印時,當前時間減去生成時間即可

作業的打印時間

生成作業時,記錄作業的頁數

開始打印時,頁數除以打印速度即可

import random

class Printer:
    def __init__(self, ppm):
        self.pagerate = ppm  # 打印速度
        self.currentTask = None  # 打印任務
        self.timeRemaining = 0  # 任務倒計時

    def tick(self):  # 打印1秒
        if self.currentTask != None:
            self.timeRemaining -= 1
            if self.timeRemaining <= 0:
                self.currentTask = None

    def busy(self):  # 打印機忙
        if self.currentTask != None:
            return True
        else:
            return False

    def startNext(self, newtask):  # 打印新作業
        self.currentTask = newtask
        self.timeRemaining = newtask.getPages() * 60 / self.pagerate


class Task:
    def __init__(self, time):
        self.timestamp = time  # 生成時間戳
        self.pages = random.randrange(1, 21)  # 打印頁數

    def getStamp(self):
        return self.timestamp

    def getPages(self):
        return self.pages

    def waitTime(self, currenttime):
        return currenttime - self.timestamp  # 等待時間


def newPrintTask():
    num = random.randrange(1, 181)
    if num == 180:
        return True
    else:
        return False

def simulation(numSeconds,  pagesPerMinute): # 模擬
    labprinter = Printer(pagesPerMinute)
    printQueue = Queue()
    waittingtimes = []

    for currentSecond in range(numSeconds):
        if newPrintTask():
            task = Task(currentSecond)
            printQueue.enqueue(task)

        if not labprinter.busy() and not printQueue.isEmpty():
            nexttask = printQueue.dequeue()
            waittingtimes.append(nexttask.waitTime(currentSecond))
            labprinter.startNext(nexttask)

        labprinter.tick()

    averageWait = sum(waittingtimes) / len(waittingtimes)
    print("Average Wait %6.2f secs %3d tasks remaining" %(averageWait,printQueue.size()))

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

台中搬家公司教你幾個打包小技巧,輕鬆整理裝箱!

還在煩惱搬家費用要多少哪?台中大展搬家線上試算搬家費用,從此不再擔心「物品怎麼計費」、「多少車才能裝完」

Asp.Net Mvc基於Fleck開發的多人網頁版即時聊天室_網頁設計公司

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

透過資料庫的網站架設建置,建立公司的形象或購物系統,並提供最人性化的使用介面,讓使用者能即時接收到相關的資訊

一、項目的核心說明

1、Fleck這個是實現websocket一個比較簡單第三方組件,它不需要安裝額外的容器。本身也就幾個接口可供調用。

2、項目是基於.net framework 4.7.2 ,在vs2019上開發的,沒試過在低版本上運行。但是代碼上沒怎麼用到新特性,所以估計是可以被低版本使用的。

3、這個項目並不是真實項目,也就是玩一下,但是對熟悉Fleck或者了解及時聊天,應該有一丁點的啟發作用。

 

二、Fleck 的簡要說明(https://github.com/statianzo/Fleck)

1、最簡單、最常用的調用方法:(ws://172.10.3.4:8111改成您的服務器本地IP和端口)

//控制台代碼
var server = new WebSocketServer("ws://172.10.3.4:8111");
server.Start(socket =>
{
  socket.OnOpen = () => Console.WriteLine("產生連接處理");
  socket.OnClose = () => Console.WriteLine("連接斷開處理");
  socket.OnMessage = (message) => {
  //1、此方法用於接收客戶端發送來的消息
  //2、可以做一些自己的操作,例如存入數據庫
  //3、為了響應客戶端,一般會使用下面的send函數,返迴響應結果。
  socket.Send(message);
  }
});

2、Fleck本身只負責幫你單線聯繫。也就是客戶端A和服務器建立連接后,會產生一個IWebSocketConnection,也就是上面代碼中socket變量的類型,它包含了接收方法、發送方法,但是都僅限於單一連接內。至於客戶端A想發送消息給客戶端B、C、D亦或者想群發,不好意思Fleck本身不Care。。。當然了那並不是這個功能就不能實現了,只是要開發者自己去把每一個IWebSocketConnection存儲起來,並管理他們的生存周期,通過自己的代碼去實現客戶端A給B發信息或者群發。

3、Fleck不需要額外的容器或進程來運行,它隨着IIS網站運行,也就是在w3wp.exe。至於它是怎麼運行的,目前我還沒有去看源碼,後期有時間再瞧瞧。

 

三、聊天室源碼位置

1、GitHub:https://github.com/DisSunRestart2020/DisSunChat

2、碼雲:https://gitee.com/dissun/DisSunChat

3、微信掃碼演示(網絡時好時壞)

        

 

四、核心代碼說明。

1、IWebSocketHelper接口。因為一開始,我是想用多個插件來實現聊天室,所以想用一個接口來做行為封裝。結果完成了Fleck之後,發現其他的操作模式都不太相同,很難封裝就放棄了,但是保留這個接口,是為了體現擴展性。

    /// <summary>
    /// 所有調用WebSocket的幫助類必須遵從的協議
    /// </summary>
    public interface IWebSocketHelper
    {
        /// <summary>
        /// websocket連通后觸發事件
        /// </summary>
        event SwitchEventHandler WsOpenEventHandler;
        /// <summary>
        /// websocket連接關閉后觸發事件
        /// </summary>
        event SwitchEventHandler WsCloseEventHandler;
        /// <summary>
        /// websocket監聽到消息后觸發事件
        /// </summary>
        event ListenEventHandler WsListenEventHandler;
        /// <summary>
        /// websocket響應處理事件
        /// </summary>
        event ResponseTextEventHandler WsResponseTextEventHandler;
        /// <summary>
        /// 聊天室在線人數
        /// </summary>
        int PlayerCount
        {
            get;
            set;
        }
        /// <summary>
        /// websocket初始化
        /// </summary>
        void WebSocketInit();

        /// <summary>
        /// 向全員發送信息
        /// </summary>
        /// <param name="wsocketMsg"></param>
        void SendMessageToAll(WebSocketMessage wsocketMsg);
        /// <summary>
        /// 向自己發送信息
        /// </summary>
        /// <param name="wsocketMsg"></param>
        void SendMessageToMe(WebSocketMessage wsocketMsg);
    }

接口中用到了4個委託事件,這裏稍微簡單的複習一下委託和事件。

①委託從使用形式來說,是指我們可以把一個函數作為參數進行傳遞,例如我們在解一道數學題,條件和要求都是一樣的,但是求解的過程可以多種多樣,通過委託就可以在不改變主體程序的同時,把不同的求解過程,封裝到不同的函數中,然後把函數作為參數傳入主體程序。

②委託從模式的角度來說,是在實現觀察者模式。訂閱者\觀察者告訴發布者\主題,如果發生了某一特定事情該怎麼處理,“怎麼處理”的過程就是委託方法的內容

※想知道最厲害的網頁設計公司嚨底家"!

RWD(響應式網頁設計)是透過瀏覽器的解析度來判斷要給使用者看到的樣貌

③事件其實就是一個委託,都說事件是一個特殊委託,特殊在哪裡,特殊在它對委託增加了約束,讓你不能毫無顧忌的使用委託,這是為了保證封裝性。

④上面的4個事件,其實我可以直接換成4個委託屬性,對程序運行不會有太大影響。但是為什麼要使用事件,還是第三點的封裝性。事件本來的用意,是達到特定條件后讓發布者自己來觸發委託方法的執行,但是如果使用委託屬性,訂閱者本身就可以進行調用,封裝性就很差。

⑤上面的4個事件,分別是訂閱者告訴Fleck中心,新長連接接通怎麼辦、長連接斷開怎麼辦、客戶端發來消息怎麼辦、要返回客戶端的消息怎麼轉換。

 

2、Fleck類的實現。Fleck實現了IWebSocketHelper接口,這是這個項目的核心代碼。

  1 public class FleckHelper:IWebSocketHelper
  2     {
  3         /// <summary>
  4         /// websocket連通后觸發事件
  5         /// </summary>
  6         public event SwitchEventHandler WsOpenEventHandler;
  7         /// <summary>
  8         /// websocket連接關閉后觸發事件
  9         /// </summary>
 10         public event SwitchEventHandler WsCloseEventHandler;
 11         /// <summary>
 12         /// websocket監聽到消息后觸發事件
 13         /// </summary>
 14         public event ListenEventHandler WsListenEventHandler;
 15         /// <summary>
 16         /// websocket反饋客戶端的文本處理事件
 17         /// </summary>
 18         public event ResponseTextEventHandler WsResponseTextEventHandler;       
 19         /// <summary>
 20         /// 聊天室在線人數 
 21         /// </summary>
 22         public int PlayerCount
 23         {
 24             get;
 25             set;
 26         }
 27         /// <summary>
 28         /// websocket已經連通的連接集合
 29         /// </summary>
 30         private Hashtable socketListHs = new Hashtable();
 31       
 32         public void WebSocketInit()
 33         {
 34        
 35             string websocketPath = Utils.GetConfig("websocketPath");
 36             WebSocketServer wsServer = new WebSocketServer(websocketPath);            
 37 
 38             wsServer.Start(socket =>
 39             {         
 40                 //以下的設置,每當一個新連接進來,都會生效。
 41                 socket.OnOpen = () => {
 42                     //自定義處理
 43                     
 44                     if (this.WsOpenEventHandler != null)
 45                     {
 46                         WebsocketEventArgs args = new WebsocketEventArgs();
 47                         this.WsOpenEventHandler(this, args);
 48                     }
 49                 };
 50 
 51                 socket.OnClose = () => {
 52                     //從連接集合中移除                    
 53                     for (int i= socketListHs.Count-1; i>=0;i--)
 54                     {
 55                         if (socketListHs[i] == null)
 56                         {                           
 57                             socketListHs.Remove(i);
 58                         }                        
 59                     }
 60                     PlayerCount = socketListHs.Count;
 61                     //自定義處理
 62                     if (this.WsCloseEventHandler != null)
 63                     {
 64                         WebsocketEventArgs args = new WebsocketEventArgs();
 65                         this.WsCloseEventHandler(this, args);
 66                     }
 67                 };
 68 
 69                 socket.OnMessage = (message) =>
 70                 {
 71                     ClientData cData = Utils.JsonToObject<ClientData>(message);
 72                     WebSocketMessage wsocketMsg = new WebSocketMessage(socket.ConnectionInfo.ClientIpAddress, socket.ConnectionInfo.ClientPort.ToString(), socket.ConnectionInfo.Id.ToString("N"), cData);
 73 
 74                     if (Convert.ToBoolean(cData.IsConnSign))
 75                     {
 76                         //收到用戶上線信息,更新socket列表
 77                         if (!socketListHs.ContainsKey(cData.IdentityMd5))
 78                         {
 79                             socketListHs.Add(cData.IdentityMd5, socket);
 80                         }
 81                         else
 82                         {
 83                             socketListHs[cData.IdentityMd5] = socket;
 84                         }
 85                         PlayerCount = socketListHs.Count;
 86                     }
 87 
 88                     if (this.WsListenEventHandler != null)
 89                     {
 90                         WebsocketEventArgs args = new WebsocketEventArgs();
 91                         args.WebSocketMessage = wsocketMsg;
 92                         this.WsListenEventHandler(this, args);
 93                     }
 94                 };
 95 
 96             });
 97         }   
 98 
 99         /// <summary>
100         /// 向全員發送信息
101         /// </summary>
102         /// <param name="wsocketMsg"></param>
103         public void SendMessageToAll(WebSocketMessage wsocketMsg)
104         {           
105             string resultData = "";
106             if (this.WsResponseTextEventHandler != null)
107             {
108                 WebsocketEventArgs args = new WebsocketEventArgs();
109                 args.WebSocketMessage = wsocketMsg;
110                 this.WsResponseTextEventHandler(this, args);
111                 resultData = args.ResultDataMsg;
112             }
113 
114             if (!string.IsNullOrWhiteSpace(resultData))
115             {
116                 foreach (DictionaryEntry dey in socketListHs)
117                 {
118                     IWebSocketConnection subConn = (IWebSocketConnection)dey.Value;
119                     subConn.Send(resultData);
120                 }          
121             }
122         }      
123         
124     }

①代碼中IdentityMd5是我自己通過各種本地信息算出來的身份標識,因為在在微信上運行cookie不穩定,不能在本地存儲任何信息,只能通過算法把環境信息合成一個唯一值。

②前面說過,Fleck只負責單線聯繫,每一個連接都是一個IWebSocketConnection,所以我需要把IdentityMd5和IWebSocketConnection存起來,方便索引調用。

③socket.OnMessage中,socketListHs是存儲IWebSocketConnection的集合,每次有消息發來,如果判斷是新的IdentityMd5就會存起來。

④socket.OnClose 中,如果有連接斷開了,IWebSocketConnection就會為null,所以遍歷集合,然後把值為null剔除就能保持socketListHs集合的有效性

⑤SendMessageToAll函數用於群發消息,遍歷集合中所有的對象,調用每個IWebSocketConnection.Send(),就可以把消息發送出去。如果想從客戶端A發到客戶端B,也得利用IdentityMd5來做文章,本項目由於是聊天室並不需要這個功能,所以就省略了。

⑥socket.OnOpen、socket.OnClose、socket.OnMessage都是Fleck自行觸發的事件,前面一開始我們介紹過了,例如OnOpen中,如果我們需要當建立新連接時記錄日誌,我們就可以對WsOpenEventHandler賦值(本項目在Global.asax的Application_Start中用lambda賦值),如下:

        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            RouteConfig.RegisterRoutes(RouteTable.Routes);                   
            App_Start.FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            
         ChatService chatService = new ChatService();
            try
            {

                IWebSocketHelper helper = new FleckHelper();//用FleckHelper來實例化IWebSocketHelper 接口。
                helper.WebSocketInit();
                  
                helper.WsOpenEventHandler +=(sender, args)=>{
                    Utils.SaveLog("WebSocket已經開啟2");
                };

                helper.WsCloseEventHandler += (sender, args) => {
                    Utils.SaveLog("WebSocket已經關閉2");
                };

                helper.WsListenEventHandler += (sender, args) => {
                    Utils.SaveLog("WebSocket監聽到了消息2");
                    if (!Convert.ToBoolean(args.WebSocketMessage.ClientData.IsConnSign))
                    {
                        chatService.CreateChatInfo(args.WebSocketMessage);
                        args.WebSocketMessage.ClientData.SMsg = Utils.ReplaceIllegalWord(args.WebSocketMessage.ClientData.SMsg);
                    }
                    else
                    {
                        string clientName = args.WebSocketMessage.CIp + ":" + args.WebSocketMessage.CPort;
                        string traceInfo = string.Format("{0} 加入聊天室(共{1}人在線)", clientName, helper.PlayerCount);
                        args.WebSocketMessage.ClientData.SMsg = traceInfo;
                    }
                    //給所有人轉發消息
                    helper.SendMessageToAll(args.WebSocketMessage);
                };

                helper.WsResponseTextEventHandler += (sender, args) => {
                    string jsonStr = Utils.ObjectToJsonStr(args.WebSocketMessage);
                    args.ResultDataMsg = jsonStr;
                };

               
            }
            catch(Exception ex)
            {
                Utils.SaveLog("發現了錯誤:" + ex.Message);
            }
        }

 3、在html端連接Fleck,只須一個一個WebSocketJs.js文件。

var socket;
var websocketInit = function (wsPath) {
    if (typeof (WebSocket) === "undefined") {
        socket = null;
        console.log("瀏覽器不支持websocket");
    } else {
        // 實例化socket
        socket = new WebSocket(wsPath);
        // 監聽socket連接
        socket.onopen = wsOnOpen;
        //監聽socket關閉
        socket.onclose = wsOnClose;
        // 監聽socket錯誤信息
        socket.onerror = wsOnError;
        // 監聽socket消息
        socket.onmessage = wsOnMessage;
    }
}


var wsOnOpen = function () {
    console.log("已經成功連接");
    var sMsg = "";

    var sendMsg = "{\"IdentityMd5\":\"" + identityMd5 + "\",\"SMsg\":\"\",\"ImgIndex\":\"" + imgIndex + "\",\"IsConnSign\":\"true\"}";
    socket.send(sendMsg);
}

var wsOnClose = function () {
    console.log("已經關閉連接");
}


var wsOnError = function (evt) {
    console.log("異常:" + evt);
}

var wsSend = function (sMsg) {     
    if (socket == null || sMsg == "") return false;
    console.log("消息成功發出");
    socket.send(sMsg);
}
 

①WebSocket是瀏覽器內置的一個類型,現在一般的瀏覽器都支持,但是還是typeof (WebSocket)來做一下判斷。

②然後在啟動時加載即可(ws://14.215.177.1:8111改成您的服務器公網IP和端口)。

$(function () {
 
    websocketInit("ws://14.215.177.1:8111");    
  
});

 

********** End *****************

上面這些也只是部分代碼,需要可運行代碼,請去github下載源碼。

疫情當前,公司發展不順,舊項目停擺,新項目需求不明。像當前這樣的企業破產潮,我是比較緊張的,畢竟不是小年輕,技術又不是特別過硬,不上不下的焦慮的很。但是也明白,行動起來,每天讓自己靠近目標一點點,是解決焦慮的不二法門。

能寫一些博客,就寫一些博客吧,我也不確定寫這個對我自己有什麼幫助,對讀者都多大的幫助,就當備忘錄吧。

當一個會折騰的“前浪”…

 

歡迎建設性的批評和指導意見。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

當全世界的人們隨著網路時代而改變向上時您還停留在『網站美醜不重要』的舊有思維嗎?機會是留給努力改變現況的人們,別再浪費一分一秒可以接觸商機的寶貴時間!

附019.Rancher搭建及使用_潭子電動車

※超省錢租車方案

商務出差、學生出遊、旅遊渡假、臨時用車!GO 神州租賃有限公司!合法經營、合法連鎖、合法租賃小客車!

一 Rancher概述

1.1 什麼是Rancher

Rancher 是為使用容器的公司打造的容器管理平台。Rancher 簡化了使用 Kubernetes 的流程,方便開發者可以隨處運行 Kubernetes(Run Kubernetes Everywhere),以便於滿足 IT 需求規範,賦能 DevOps 團隊。

當然 Rancher 2.x 已經完全轉向了 Kubernetes。Rancher 2.x 可以部署和管理在任何地方運行的 Kubernetes 集群。

Rancher 可以創建來自 Kubernetes 託管服務提供商的集群,自動創建節點並安裝 Kubernetes 集群,或者導入任何已經存在的 Kubernetes 集群。

Rancher 通過支持集群的身份驗證和基於角色的訪問控制(RBAC),使系統管理員能夠從一個位置控制全部集群的訪問。Rancher 可以對集群及其資源進行詳細的監控和並在需要時發送告警,也可以將容器日誌發送給外部日誌系統,並通過應用商店與 Helm 集成。

若具有外部 CI/CD 流水線系統,則可以將其與 Rancher 對接,如果沒有,Rancher 也提供了簡單易用的流水線實現自動部署和升級工作負載。除此之外,Rancher 還有很多開箱即用的功能用於更好的管理集群和業務應用,例如多集群應用,全局 DNS,服務網格,安全掃描,集群模版和基於 OPA 的策略管理等功能。

綜上所述,Rancher 是一個全棧式的 Kubernetes 容器管理平台,也是一個可以在任何地方都能成功運行 Kubernetes 的工具。

參考:https://docs.rancher.cn/rancher2x/#_1-what-s-rancher?

https://rancher2.docs.rancher.cn/docs/overview/_index

1.2 Rancher Server功能

Rancher API Server 是基於嵌入式 Kubernetes API Server 和 ETCD 數據庫建立的,它提供了以下功能:

  • 授權和角色權限控制
    • 用戶管理: Rancher API server 除了管理用戶在公司內部的使用的認證信息之外,還管理用戶訪問外部服務所需的認證信息,如登錄活動目錄或 GitHub 所需的賬號密碼。
    • 授權: Rancher API server 負責管理權限控制策略 和 安全策略。
  • 基於Rancher使用 Kubernetes 的功能
    • 運行 Kubernetes 集群: Rancher API server 可以在已有節點上運行 Kubernetes 集群 ,或對 Kubernetes 進行版本升級。
    • 應用商店管理: Rancher 可以使用Helm Charts 應用商店重複部署應用。
    • 項目管理: 項目,是 Rancher 中的一個概念,Kubernetes 中並沒有這個概念。項目由一個集群內的多個命名空間和多個訪問控制策略組成,允許用戶以組為單位,一次管理多個命名空間,對其進行 Kubernetes 相關操作。Rancher 用戶界面提供了 項目管理 和 項目內應用管理 兩個功能。
    • 流水線: 流水線 可以幫助開發者快速高效地上線新軟件。Rancher 支持給每一個項目單獨配置流水線。
    • Istio: Rancher 與 Istio 集成,管理員或集群所有者可以將 Istio 交給開發者,然後開發者使用 Istio 執行安全策略,排查問題,或為快速發布、灰度發布和 A/B 測試進行流量控制。
  • 配置雲端基礎信息
    • 同步節點信息: Rancher API server 可以同步集群內所有節點的信息。
    • 配置雲端基礎信息: 當 Rancher 與雲服務提供商配置完了之後,可以在雲端動態配置新節點和持久化存儲。
  • 查看集群信息
    • 日誌: Rancher 可以跟多種主流日誌工具集成,可以設置 集群日誌 或 項目日誌。
    • 監控: 使用 Rancher,可以通過 Prometheus 監控集群節點、Kubernetes 組件、軟件部署的狀態和進度。可以設置 集群監控 或 項目監控。
    • 告警信息: 需要隨時知道集群和項目的計劃和非計劃事件,才可以提高公司的運行效率。可以設置集群告警 或 項目告警。

1.3 Rancher架構設計

Rancher Server 由認證代理(Authentication Proxy)、Rancher API Server、集群控制器(Cluster Controller)、etcd 節點和集群 Agent(Cluster Agent) 組成。除了集群 Agent 以外,其他組件都部署在 Rancher Server 中。

如上圖所示用戶通過 Rancher Server 管控 Rancher 部署的 Kubernetes 集群(RKE 集群)和託管的 Kubernetes 集群的(EKS)集群的流程。以用戶下髮指令為例,指令的流動路徑如下:

  1. 首先,用戶通過 Rancher UI(即 Rancher 控制台)、Rancher API 接口、Rancher 命令行工具(Rancher CLI)輸入指令;
  2. 用戶通過 Rancher 的代理認證后,指令會進一步下發到 Rancher Server;
  3. 與此同時,Rancher Server 也會執行容災備份,將數據備份到 etcd 節點;
  4. 然後 Rancher Server 把指令傳遞給集群控制器。集群控制器把指令傳遞到下游集群的 Agent,最終通過 Agent 把指令下發到指定的集群中。

如果 Rancher Server 出現問題,我們也提供了備用方案,可以通過授權集群端點管理集群。

提示:考慮到性能和安全因素,通常建議使用兩個 Kubernetes 集群,分開用於部署 Rancher Server 和生產環境。部署 Rancher Server 后,可以創建或導入集群,然後使用Rancher Server創建用於生產的 Kubernetes 集群。

提示:可以在單個節點或高可用的 Kubernetes 集群上安裝 Rancher。由於單節點安裝只適用於開發和測試環境,而且單節點和高可用集群之間無法進行數據遷移,所以建議從一開始就使用高可用的 Kubernetes 集群來部署 Rancher Server,而且需要分開部署運行 Rancher Server 的集群和運行業務的生產 Kubernetes 集群。

參考:https://docs.rancher.cn/rancher2x/infrastructure/

https://rancher2.docs.rancher.cn/docs/overview/architecture/_index

1.4 Rancher和下游集群交互

如下圖示例,通過兩個用戶 Bob 和 Alice,理解 Rancher 啟動和管理下游集群的具體過程,以及每個 Rancher 組件的作用。

該示例涉及集群控制器、集群 Agent 和 Node Agent等組件。

  1. 認證代理

如上視圖中 Bob 的用戶希望查看下游集群“User Cluster 1”裏面正在運行的 pod。Bob 發起的請求會首先經過認證代理,通過認證之後,Rancher 的 認證代理才會把 API 調用命令轉發到下游集群。

認證代理集成了多種認證方式,如本地認證、活動目錄認證、GitHub 認證等。在發起每一個 Kubernetes API 調用請求的時候,認證代理會去確認請求方的身份,在轉發調用命令前,請設置正確的 Kubernetes impersonation 的消息頭。

Rancher 使用 Service Account (Service Accout 提供了一種方便的認證機制)和 Kubernetes 進行交互。

默認狀態下,Rancher 生成一個包含認證信息的kubeconfig文件,為 Rancher Server 和下游集群的 Kubernetes API Server 之間的通信提供認證。該文件包含了訪問集群的所有權限。

  1. 集群控制器和集群 Agent

每一個下游集群都有一個集群 Agent 保持下游集群的集群控制器與 Rancher Server 之間的信息暢通。

集群控制器具有以下功能:

  • 檢測下游集群的資源變化,如內存使用率、CPU 使用率等;
  • 把下游集群從“當前”狀態變更到“目標”狀態;
  • 配置集群和項目的訪問控制策略;
  • 通過調用 Docker Machine 和 Kubernetes Engine,如 RKE 和 GKE,創建集群。

提示:默認狀態下,集群控制器連接 Agent,Rancher 才可以與下游集群通信。如果集群 Agent 不可用,集群控制器可以連接到Node Agent,通過Node Agent 實現用戶和集群之間的通信。

集群 Agent,也叫做“cattle-cluster-agent”,是在下游集群中運行的組件,它具有以下功能:

  • 連接使用 Rancher 部署的 Kubernetes 集群(RKE 集群)中的 Kubernetes API;
  • 管理集群內的工作負載,pod 創建和部署;
  • 根據每個集群的設置,配置 Role 和 RoleBindings;
  • 實現集群和 Rancher Server 之間的消息傳輸,包括事件,指標,健康狀況和節點信息等。
  1. 節點 Agents

如果集群 Agent 不可用,下游集群中的其中一個節點 Agent 會創建一個通信管道,由節點 Agent 連接到集群控制器,實現下游集群和 Rancher 之間的通信。

部署節點 Agent 的方式有很多,通常建議使用DaemonSet部署節點 Agent ,這種方式可以確保下游集群內每個節點都成功運行節點 Agent。執行集群操作時,可以使用這種方式將指令下發到下游集群。集群操作包括:升級 Kubernetes 版本、創建 etcd 節點備份和恢復 etcd 節點。

  1. 授權集群端點

Rancher Server 和下游集群之間有明顯的延遲,或 Rancher Server 不可用時,用戶可以通過授權集群端點連接下游集群,實現 Rancher Server 和集群之間的通信,降低網絡延遲。

需要注意的是,只有 Rancher 部署的 Kubernetes 集群(RKE 集群)可以使用授權集群端點這個功能。其他類型的集群,如導入的集群、託管的集群等,並不能夠使用此功能。

kube-api-auth 微服務向授權集群端點提供了用戶認證功能。使用 kubectl 訪問下游集群時,集群的 Kubernetes API Server 通過 kube-api-auth 對用戶進行認證。

與授權集群端點類似, kube-api-auth 認證功能只在 Rancher 部署的 Kubernetes 集群(RKE 集群)中有效。

使用場景舉例:假設 Rancher Server 位於美國,用戶“Alice”和她管理的下游集群“User Cluster 1”位於澳大利亞。雖然 Alice 可以使用 Rancher 控制台管理 User Cluster 1 中的資源,但是她發出的請求要從澳大利亞發送到美國的 Server 端,然後再由 Server 代理回澳大利亞的集群端,澳大利亞集群端處理完請求后,再返回給美國的 Server 端,最後才能返回給澳大利亞的“Alice”。因為美澳之間的距離非常遙遠,所以發送的請求和返回的請求結果都會存在顯著的延遲。Alice 可以使用授權集群端點,降低延遲,更好地掌控她的下游集群。

為下游集群開啟授權集群端點后,Rancher 會在“kubeconfig”文件中額外生成一段 Kubernetes context,來允許用戶直接連接到集群。kubeconfig 這個文件中含有 kubectl 和 helm 的認證信息。

如果 Rancher 出現問題,無法連接,需要使用 kubeconfig 中的 context 幫助訪問集群。因此,建議導出一份 kubeconfig 文件副本,保存到本地,以備不時之需。

1.5 Rancher相關文件

  • rancher-cluster.yml :RKE 集群配置文件。
  • kube_config_rancher-cluster.yml :集群的 kubeconfig 文件,它包含了訪問集群的全部權限。如果 Rancher 出現故障,無法運行,可以使用這個文件連接通過 Rancher 部署的 Kubernetes 集群(RKE 集群)。
  • rancher-cluster.rkestate :Kubernetes 集群狀態文件,該文件含有訪問集群的所有權限。只有使用 RKE 0.2.0 或以上版本時,才會創建該文件。

注意:后兩個文件名的“rancher-cluster”部分取決於如何命名 RKE 集群的配置文件。

1.6 Rancher創建的Kubernetes類型

Rancher通常可以創建如下幾種類型的下游 Kubernetes 集群:

  • Rancher自動創建節點並部署Kubernetes集群:Rancher 可以動態創建位於雲上的節點(Node),如 Amazon EC2、Azure 和 vSphere等,然後在節點上安裝 Kubernetes。Rancher 使用 RKE 和 docker-machine創建這種集群。
  • Rancher通過已有的節點並部署Kubernetes集群:配置這種集群時,Rancher 可以在已有的虛擬機、物理機或雲主機上安裝 Kubernetes。這種集群叫自定義集群。Rancher 使用RKE創建這種集群。
  • Rancher管理雲服務商託管的Kubernetes集群:配置這種集群時,Kubernetes 由雲服務供應商安裝,如 GKE、ECS 和 AKS。Rancher 使用kontainer-engine來調用雲廠商的 API 來創建集群。
  • Rancher導入已有的Kubernetes集群:這種情況下,Rancher 只需要連接到已經配置好 Kubernetes 的集群。因此,Rancher 只設置 Rancher Agent 與集群通信,不直接創建集群。

二 基礎環境配置

2.1 安裝介紹

Rancher Server:用於管理和配置 Kubernetes 集群。可以通過 Rancher Server 的 UI 與下游 Kubernetes 集群進行交互。

RKE(Rancher Kubernetes Engine):是經過認證的 Kubernetes 發行版,它擁有對應的 CLI 工具可用於創建和管理 Kubernetes 集群。在 Rancher UI 中創建集群時,它將調用 RKE 來配置 Rancher 所創建的 Kubernetes 集群。

K3s (輕量級 Kubernetes): 和 RKE 類似,也是經過認證的 Kubernetes 發行版。它比 RKE 更新,更易用且更輕量化,全部組件都在一個小於 100 MB 的二進制文件中。從 Rancher v2.4 開始,Rancher 可以安裝在 K3s 集群上。

2.2 架構選擇

高可用 Kubernetes 安裝: 建議使用 Kubernetes 程序包管理器 Helm 在專用的 Kubernetes 集群上安裝 Rancher。在 RKE 集群中,需要使用三個節點以實現高可用性。在 K3s 集群中,僅需要兩個節點即可。

單節點 Kubernetes 安裝: 另一個選擇是在 Kubernetes 集群上使用 Helm 安裝 Rancher,僅在集群中使用單個節點。雖然在這種情況下的 Rancher Server 不具有高可用性,但是這種架構既節省了資源,又保留了可擴展性。如果想在短期內通過使用單個節點來節省資源,同時又保留高可用性遷移路徑,最合適的架構就是單節點 Kubernetes 安裝。

單節點 Docker 安裝: 將 Rancher 與 Docker 一起安裝在單個節點上。這種安裝方式的優點是開箱即用,建議在測試和演示環境中使用這種架構。它的缺點也非常明顯,單節點 Docker 安裝和高可用集群安裝之間不能進行數據遷移,所以推薦從一開始就使用高可用集群安裝的方式安裝 Rancher。

提示:本實驗基於高可用集群——K3S高可用Kubernetes集群(參考附018.K3S-ETCD高可用部署),同時使用helm來部署Rancher。



節點主機名

IP

類型

master01 172.24.8.71 K3S master節點
master02 172.24.8.72 K3S master節點
master03 172.24.8.73 K3S master節點
worker01 172.24.8.74 K3S worker節點
worker02 172.24.8.75 K3S worker節點
worker03 172.24.8.76 K3S worker節點

本實驗架構:

  • Rancher 的 DNS 解析為 4 層負載均衡器
  • 負載均衡器應將端口 TCP/80 和 TCP/443 流量轉發到 Kubernetes 集群中的所有 3 個節點。
  • Ingress 控制器會將 HTTP 重定向到 HTTPS,並在端口 TCP/443 上終止 SSL/TLS。
  • Ingress 控制器會將流量轉發到 Rancher deployment 中 Pod 上的端口 TCP/80。

2.3 資源需求

本實驗 Rancher Server 安裝在高可用的 Kubernetes 集群(K3S)上。通常安裝 Rancher Server 節點的軟件,硬件和網絡有如下最低要求。

  • 操作系統要求

Rancher 應用可以兼容當前任何流行的 Linux 發行版和流行的 Docker 版本。

Rancher 官方支持並且已在如下操作系統中測試了 Rancher 和 RKE,它們包括 Ubuntu,CentOS,Oracle Linux,RancherOS 和 RedHat Enterprise Linux

本實驗的 K3S 幾乎可以在任何 Linux 版本上運行。K3S 在以下操作系統及其這些版本後續的非主要版本中進行了測試:

Ubuntu 16.04 (amd64)

Ubuntu 18.04 (amd64)

Raspbian Buster (armhf)

所有受支持的操作系統都是 64-bit x86。

同時建議安裝 ntp (Network Time Protocol),這樣可以防止在客戶端和服務器之間因為時鐘不同步而發生證書驗證錯誤。

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

日本、大陸,發現這些先進的國家已經早就讓電動車優先上路,而且先進國家空氣品質相當好,電動車節能減碳可以減少空污

  • 硬件要求

硬件要求根據 Rancher 部署規模而定,官方對於高可用集群安裝的建議如下:

部署規模

集群

節點

vCPUs

內存

最多 150 個 最多 1500 個 2 8 GB
最多 300 個 最多 3000 個 4 16 GB
最多 500 個 最多 5000 個 8 32 GB
特大 最多 1000 個 最多 10000 個 16 64 GB
超大 最多 2000 個 最多 20000 個 32 128GB

  • 網絡要求

單個節點或 Kubernetes 集群上安裝 Rancher,每個節點都應配置一個靜態 IP。

  • 端口要求(K3S高可用環境)
    • 用於與下游集群通信的端口

為了與下游集群通信,Rancher 要求開放不同的端口,通常Rancher 管理面的端口要求如下圖所示:

下錶細分了入站和出站流量的端口要求:

Rancher 節點的入站規則



協議 端口 描述
TCP 80 進行外部 SSL 終止的負載均衡器/代理 使用外部 SSL 終止時的 Rancher UI/API
TCP 443 etcd 節點 controlplane 節點 worker 節點 託管的/導入的 Kubernetes 任何需要使用 Rancher UI 或 API 的源 Rancher Agent,Rancher UI/API,kubectl

Rancher 節點的出站規則




協議

端口

目的

描述

TCP 22 使用主機驅動創建的節點中的任何節點 IP 使用主機驅動通過 SSH 進行節點配置
TCP 443 35.160.43.145/32 35.167.242.46/32 52.33.59.17/32 git.rancher.io (應用商店)
TCP 2376 使用主機驅動創建的節點中的任何節點 IP Docker Machine 使用的 Docker 守護進程的 TLS 端口
TCP 6443 託管的/導入的 Kubernetes API Kubernetes API Server

    • K3s 集群中節點的其他端口要求

為了安裝 Rancher 高可用,K3S Server 需要開放 6443 端口供節點訪問。

使用 Flannel VXLAN 時,這些節點需要能夠通過 UDP 端口 8472 訪問其他節點。

如果要使用指標服務器(Metrics Server),則需要在每個節點上打開端口 10250。

Rancher Server 節點的入站規則




協議

端口

描述

TCP 6443 K3s server 節點 Kubernetes API
UDP 8472 K3s server 和 agent 節點 Flannel VXLAN 需要
TCP 10250 K3s server 和 agent 節點 kubelet

通常情況下,可以允許全部的出站流量。

提示:本手冊基於實驗目的,直接關閉所有防火牆。

更多的環境需求參考:https://rancher2.docs.rancher.cn/docs/installation/requirements/_index。

2.4 ingress安裝

本實驗使用helm部署rancher,配套需要提前部署ingress,參考《附020.Nginx-ingress部署及使用》。

三 Rancher安裝

3.1 安裝Docker

任何運行 Rancher Server 的節點上都需要安裝 Docker。

有兩種安裝 Docker 的選擇。一種選擇是參考官方 Docker 文檔來了解如何在 Linux 上安裝 Docker。

另一種選擇是使用 Rancher 提供的 Docker 安裝腳本,該腳本可用於安裝較新的 Docker 版本。

例如,此命令可用於在 Ubuntu 上安裝 Docker 18.09:

  1 curl https://releases.rancher.com/install-docker/18.09.sh | sh

提示:https://github.com/rancher/install-docker描述所有可快速安裝Docker的腳本。本實驗基於已有的高可用K3S集群,所有Docker均已安裝完成。

3.2 K3S集群安裝

  1 [root@master01 ~]# k3s kubectl get nodes

提示:本實驗基於高可用集群——K3S高可用Kubernetes集群(參考附018.K3S-ETCD高可用部署),同時使用helm來部署Rancher。

3.3 安裝CLI

hlem安裝:參考《053.集群管理-Helm工具》。

kubectl安裝:參考https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-kubectl。

3.4 添加helm chart倉庫

  1 [root@master01 ~]# helm repo add rancher-stable https://releases.rancher.com/server-charts/stable

提示:Rancher不同的倉庫版本參考:https://rancher2.docs.rancher.cn/docs/installation/options/server-tags/_index/。

3.5 創建命名空間

  1 [root@master01 ~]# kubectl create namespace cattle-system        #ns必須為cattle-system 

3.6 CA證書

本實驗使用免費申請的CA證書,並將證書上傳至集群節點。

  1 [root@master01 ~]# mkdir rancher
  2 [root@master01 ~]# cd rancher
  3 [root@master01 rancher]# ll *crt *key
  4 -rw-r--r-- 1 root root 3.7K May 24 14:08 rancher.linuxsb.com.crt
  5 -rw-r--r-- 1 root root 1.7K May 24 14:08 rancher.linuxsb.com.key
  6 [root@master01 rancher]# kubectl -n cattle-system create secret tls tls-rancher-ingress \
  7   --cert=rancher.linuxsb.com.crt \
  8   --key=rancher.linuxsb.com.key

3.7 安裝Rancher

  1 [root@master01 rancher]# helm show values rancher-stable/rancher	#查看可配置選項
  2 [root@master01 rancher]# vi rancher-custom.yaml		        #創建helm配置
  3 auditLog:
  4   level: 1
  5 hostname: "rancher.linuxsb.com"
  6 ingress.tls.source: "secret"
  7 ingress:
  8   tls:
  9     source: "secret"
 10   configurationSnippet: |
 11     more_set_input_headers "X-Forwarded-Host: {{ .Values.http_upgrade }}";
 12     more_set_input_headers "X-Forwarded-Host: {{ .Values.connection_upgrade }}";

提示:更多Helm部署rancher選項參考:https://rancher2.docs.rancher.cn/docs/installation/options/chart-options/_index。也可通過set命令傳入選項,示例如下:

helm install rancher rancher-stable/rancher \

–set hostname=rancher.linuxsb.com \

–set ingress.tls.source=secret

  1 [root@master01 ~]# helm install rancher rancher-stable/rancher -f rancher-custom.yaml --namespace cattle-system
  2 [root@master01 ~]# helm list -n cattle-system
  3 [root@master01 ~]# helm -n cattle-system status rancher
  4 [root@master01 rancher]# kubectl -n cattle-system get pods -o wide
  5 [root@master01 rancher]# kubectl -n cattle-system get svc -o wide
  6 [root@master01 rancher]# kubectl -n cattle-system get ingress -o wide

四 確認驗證

4.1 訪問測試

瀏覽器訪問:https://rancher.linuxsb.com/。

提示:更多Rancher安裝文檔參考:https://rancher2.docs.rancher.cn/docs/installation/k8s-install/_index。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

有別於一般網頁架設公司,除了模組化的架站軟體,我們的營業主軸還包含:資料庫程式開發、網站建置、網頁設計、電子商務專案開發、系統整合、APP設計建置、專業網路行銷。