我眼中的檳榔_潭子電動車

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

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

初識檳榔已是多年前的事情了,在很小的時候,大人們嚼檳榔,我們就已經耳濡目染了。後來我們長大了參加工作了。第一次吃檳榔還是朋友給的,在一次偶然的飯桌上,酒足飯飽后,朋友遞過來一顆小小的檳榔果,它穿着一層厚厚的芝麻大衣,包裹着細小的果肉,放入口中細細咀嚼,沁人心脾的清爽的感覺,刺激着味蕾,清香的果味混合著芝麻的香醇,回味悠久。

       

從那之後,我跟檳榔的接觸就越來越多了,我也開始了解了一些檳榔的文化,原來檳榔在很久很久以前的時候就已經為人們所知,併為人們所用了。

       

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

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

相傳在很久以前,關於“檳榔”,有個神話傳說。古時候炎帝有個女兒叫賓,她的郎君長的英俊瀟洒,為人善良,平時逞強除惡,而兩人的感情非常的好,心意相通,有一次她的郎君在同妖魔相鬥時不幸被殺死,賓為了紀念她的郎君就將他葬於崑崙石下,化成為一片樹林,賓每天都悉心照顧着這片樹林,後來樹上結出綠油油的果實。

       於是賓將果實裝在茶包里,帶在身旁,以示紀念。後來賓把自己製作的茶包送給人們品嘗,據說人們吃了這種果實后就再不怕妖魔作惡了。於是人們就給這個綠油油的果實以賓加郎命名,於是就取名為檳榔。所以在古代的時候檳榔就已經為人們所食用了,而且還富有很多的價值。

       隨着後來檳榔的廣泛食用,檳榔的功效越來越多的被人們所知道。比如檳榔有很強的藥用價值,它能殺蟲消積,用於腸道寄生蟲,蛔蟲病、蟯蟲病。,而且檳榔是被歷代醫學學者作為治病的葯果,又被稱為“洗瘴丹”,咀食檳榔不僅可以消食下氣、祛痰導滯,而且可以促進腸胃吸收,增強腸道收縮能力,有潤腸通便的效果。

       除此之外,檳榔還被過去住高山地帶的人們常用來禦寒,和消除緊張勞動后的疲勞。所以檳榔還有提神醒腦的作用,當然檳榔的功效還不止是這些,隨便我對檳榔越來越多的認識,越來越覺得這顆小小的檳榔果實渾身上下都是寶。

本站聲明:網站內容來http://www.societynews.cn/html/wh/fq/,如有侵權,請聯繫我們,我們將及時處理

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

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

Robot Framework(15)- 擴展關鍵字_潭子電動車

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

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

如果你還想從頭學起Robot Framework,可以看看這個系列的文章哦!

https://www.cnblogs.com/poloyy/category/1770899.html

 

前言

  • 什麼是擴展關鍵字?就是你自己寫的 Python 文件,裡面包含了函數或者類
  • 然後 RF 導入這個 Python 模塊,就可以調用函數或者類方法,它們就是擴展關鍵字

 

Python 模塊作為測試庫

模塊文件名作為測試庫的名字

比如:Python 模塊名叫 MyLibrary,文件名是 MyLibrary.py,那麼測試庫的名字就叫做 MyLibrary

 

Python 模塊和 Robot 文件同目錄下的栗子

這是目錄結構哈

python 模塊的代碼

def returnlist():
    return [i for i in range(10)]


def return_dict():
    return {"a": "hahhahahaahah"}


# 以下劃線開頭的函數不能作為RF關鍵字
def _returnlist2():
    return [1, 2]

robot 代碼

進入test目錄下,運行以下命令

 robot -P . test.robot 

執行結果

知識點

  • _前綴的方法不會作為關鍵字,在Python裏面, _ 開頭的方法是私有方法,RF 不會識別到它
  • Python 方法作為關鍵字也是大小寫不敏感
  • RF 中會把關鍵字的 _ 和單個空格忽略掉,所以 returndict、return dict、return_dict 都是調用同一個關鍵字

 

Python 類作為測試庫的栗子

項目目錄

所有 Python 測試代碼都在 tlib2.py 裏面哦

最終運行是在【15_擴展關鍵字】目錄下運行的,命令如下

robot -P . testrf

 

栗子一:類初始化不需要傳參

python 代碼

class SubLibrary:
    def __init__(self):
        pass

    def returnint(self):
        return 2020

    def _returnint2(self):
        return 4

robot 代碼

測試結果

知識點

  • 在類裏面, _ 前綴的方法不會當做關鍵字
  • 同樣,類中聲明的方法當做關鍵字的話,大小寫不敏感

 

栗子二:類初始化需要傳參

python 代碼

from robot.api import logger
class SubLibrary2: def __init__(self, host, port, table='test'): self.host = host self.port = port self.table = table def printaddr2(self): logger.console('host:%s,port:%s,table:%s' % (self.host, self.port, self.table))

robot 代碼

測試結果

知識點

如果類的 __init__ 初始化方法需要傳參,則在導入庫後面跟對應的參數列表

拓展 Python 知識點:先有類對象,還是先執行類初始化方法?

 __new__ 方法產生對象

 __init__ 對象的初始化方法

先 new 一個對象,再 init 一個對象

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

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

 

栗子三:類名和模塊名相同

python 代碼

from robot.api import logger

class tlib2:
    def __init__(self, host, port):
        self.host = host
        self.port = port

    def printaddr(self):
        logger.console('host:%s,port:%s' % (self.host, self.port))

robot 代碼

測試結果

知識點

如果類名和模塊名相同,可以不用導入類名

 

栗子四:使用路徑法導入 Python 模塊

Python 代碼用的還是栗子三的

robot 代碼

測試結果

知識點

如果用路徑法,需要注意導入 Python 模塊需要有文件後綴哦,且用 / 來表示目錄下

重點:使用路徑法,只能導入和模塊名相同的類名!

 

Python 擴展庫的搜索規則

統一的規則

  • 先根據 robot 文件自身當前目錄下查找庫文件
  • 如果沒有找到則再根據 –pythonpath 和 -P 提供的搜索路徑進行搜索
  • 最後找 Python 安裝的路徑

 

Python 庫引入了其他模塊

背景

當 robot 文件導入的 Python 測試庫引入了其他模塊時,應該怎麼寫導入路徑?

正確寫法

確保導入的模塊路徑和RF導入的模塊起始路徑統一

看栗子

 testother.robot  導入 test.py 模塊, test.py  模塊引入了 login.py 模塊的方法

目錄結構

login.py 代碼

from robot.api import logger


def login_test():
    logger.console('test login')

test.py 代碼

from pylib.login import login_test
# from login import login_test 報錯

def test():
    login_test()

robot 的代碼

在 othertest 目錄下運行下面命令

robot -P . testother.robot

測試結果

結論

  • 可以看到 robot 文件引入的路徑是 pylib 開頭, test 模塊引入 login 模塊的路徑也是 pylib 開頭
  • 如果路徑是 login 開頭導入,那麼運行robot文件將會報錯(如下圖,包含了解析錯誤)

 

Python 庫中的 class 存在繼承

背景

當 robot 文件導入 Python 測試庫的類繼承了另一個類,應該怎麼寫導入路徑?

正確寫法

  • 確保導入的模塊路徑和RF導入的模塊起始路徑統一
  • 使用的時候 RF 文件只需導入子類即可

看栗子

 test.robot 引入了 other.py  模塊下的 Child 類,而 Child 類繼承了 Base.py 模塊下的 Father 類

目錄結構

base.py 的代碼

from robot.libraries.BuiltIn import logger


class Father:
    def __init__(self):
        logger.console('init Father')

    def money(self):
        return '$10000'

other.py 的代碼

from robot.api import logger
from pylib.Base import Father


class Child(Father):
    def __init__(self):
        Father.__init__(self)
        logger.console('init Child')

    def use_money(self):
        return self.money()

    def make_money(self):
        return '$9999'

robot 的代碼

在 testClass 目錄下運行下面命令

robot -P . test.robot

測試結果

 

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

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

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

HAKOmini 零負重電視盒:不只是輕巧,更能播放高畫質 4K HDR Netflix影音!_潭子電動車

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

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

這次為大家介紹的是超輕巧的 HAKOmini 零負重電視盒 開箱,相信這年頭很多人家裡早就沒有看第四台了吧?很多人可能是申辦電信業者的機上盒充當電視使用,機上盒雖然頻道也不少、價格也比有線電視便宜,但如果不常看的話,其實也是浪費。雖然現代人很多都用手機、平板透過各種串留影音軟體追劇或看影片,但怎樣手機、平板的螢幕都很小,長時間觀看其實很累且傷眼,如果不小心還會雜到臉上,如果在家想躺在沙發或床上無腦追劇、看電影難道沒有更好的選擇嗎?阿達個人是蠻推薦HAKOmini 零負重電視盒,功能多且方便,最重要的是輕巧又超便宜!

HAKOmini 零負重電視盒開箱

我們也拍攝了 HAKOmini 零負重電視盒 的開箱介紹,主要的重點都在影片中(請點我)更多科技新知酷品開箱請訂閱電腦王阿達頻道並開啟小鈴鐺就不會錯過最新資訊:

HAKOmini 零負重電視盒這邊買(請點我)

(*小提醒:募資非網購,下訂前請詳閱相關訊息)

全部的配件如下,有本體、說明書、遙控器、轉接線與旅充等等:

隨產品給了一條接電視用的Micro hdmi 轉HDMI轉接線:

還有一條 USB介面的轉接線,很多人以為 HAKO mini 這麼小巧,恐怕沒辦法外接隨身碟讀取我們自己儲存的照片影片吧?不,廠商特製的轉接線保留了一個 USB B 的介面,可以外接隨身碟等裝置,讀取內部的照片、影片與音樂:

HAKOmini 真的很小一個,長跟寬僅有6.6公分、厚度也只有1.4公分重量僅有37公克,比女生隨身攜帶的粉餅盒還要小:

如果大家沒概念的話,這樣就比較清楚,就是這麼小巧:

甚至面積也比信用卡還小,重量也很輕巧,是可以隨身攜帶完全無感的體積與重量:

側面前緣這邊配置了HDMI連接埠、重置鍵與 LED 狀態燈號:

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

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

另一頭則只有 Micro USB 介面的連接埠。另外 HAKO mini 也支援 2.4/5GHz Wi-Fi 連線與藍牙4.0:

多功能遙控器設計很不錯,除了基本的方向鍵語音量鍵控制以外,還有語音助理功能,下方還有 YouTube、Netflix、KAKO精靈與AMAZON Prime Video的快捷鍵:

 

HAKOmini 零負重電視盒實測

接下來我們將 HAKO mini 接到電視上,真的很簡單,只要將 HDMI 線接好,另外一頭的電源線接到現在電視上都有的任何一個 USB 連接埠即可,HAKO mini 不需要變壓器,只要一般 5V供電的USB接頭都可以使用,而且體積小巧直接隱身在電視後面,完全無感:

接下來我們看一下 HAKO mini 的介面,內建標準的Android TV 9.0系統,預計明年更新到 10.0系統,可下載正版的 Netflix 欣賞最高 4K HDR 畫質的 YouTube 或 Netflix影音,只要透過遙控器快捷鍵就能快速開啟應用,很多電視盒因為沒有拿到正版 Android TV 授權,所以 Netflix 必須透過第三方市集下載或安裝APK才能看,這種電視盒雖然可看,但畫質最高只有1080P,而且還有可能因為官方改版而不能使用,比較麻煩一些。HAKO mini 也內建了 Google Play 市集,可下載愛奇藝、KKBOX影音、Friday、動漫瘋、HBO GO…各種影音串流平台觀看,現在購買再加送 LiTV 90 天全餐服務體驗,可收看超過400多個傳統第四台頻道看到飽!

另外 HAKO mini 也支援 ChromeCast 功能,可以跟智慧型手機連動投影,iOS 裝置只要安裝極速投屏這類應用就可以使用 AirPlay功能。

除了以上功能以外 HAKO mini 還支援 Google語音助理,想看什麼影片,動口說就搞定,還可以詢問天氣與各種資訊,而且獨家的 HAKO 精靈除了可以找影片以外,還可以連動 iHouse 智慧家電,或直接切換使用情境。

HAKOmini 零負重電視盒這邊買(請點我)

(*小提醒:募資非網購,下訂前請詳閱相關訊息)

結語

看完以上的簡單介紹之後,相信大家對 HAKO mini 零負重電視盒應該也有相當清楚的瞭解了,個人覺得 HAKO mini 體積很小巧,安裝在電視或是一般的螢幕後方也完全不佔體積,也沒有亂七八糟的線路,就算要帶出門使用也很輕鬆方便,而且體積雖然小巧,但具備完整的 Android TV 功能與硬體功能,擴充能力強大,還可播放 4K HDR畫質的 YouTube、Netflix 影音、5GHz的連線能力播放高畫質影音也不卡頓,更別說它方便的 Google 語音助理與 HAKO精靈和智慧家電連動能力,最重要的是價格相當便宜,目前嘖嘖預購價不到1500元,相當划算!推薦給在外租屋的小資族與經常外出旅行想在旅館看電視的朋友使用喔!

您也許會喜歡:

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

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

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

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

【Java8新特性】不了解Optional類,簡歷上別說你懂Java8!!_台中搬家

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

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

寫在前面

最近,很多讀者出去面試都在Java8上栽了跟頭,事後自己分析,確實對Java8的新特性一知半解。然而,卻在簡歷顯眼的技能部分寫着:熟練掌握Java8的各種新特性,能夠迅速使用Java8開發高併發應用!這不,又一名讀者因為寫了熟練掌握Java8的新特性而被面試官虐的體無完膚!我不是說不能寫,可以這樣寫!但是,咱在寫熟練掌握Java8新特性的時候,應該靜下心來好好想想自己是否真的掌握了Java8。如果自己心中對是否掌握了Java8這個問題模稜兩可的話,那確實要好好靜下心來為自己充電了!一定要從模稜兩可到徹底掌握Java8,那到時就不是面試官虐你了,而是你吊打面試官!!

什麼是Optional類?

Optional 類(java.util.Optional) 是一個容器類,代表一個值存在或不存在,原來用 null 表示一個值不存在,現在 Optional 可以更好的表達這個概念。並且可以避免空指針異常。

Optional類常用方法:

  • Optional.of(T t) : 創建一個 Optional 實例。
  • Optional.empty() : 創建一個空的 Optional 實例。
  • Optional.ofNullable(T t):若 t 不為 null,創建 Optional 實例,否則創建空實例。
  • isPresent() : 判斷是否包含值。
  • orElse(T t) : 如果調用對象包含值,返回該值,否則返回t。
  • orElseGet(Supplier s) :如果調用對象包含值,返回該值,否則返回 s 獲取的值。
  • map(Function f): 如果有值對其處理,並返回處理后的Optional,否則返回 Optional.empty()。
  • flatMap(Function mapper):與 map 類似,要求返回值必須是Optional。

Optional類示例

1.創建Optional類

(1)使用empty()方法創建一個空的Optional對象:

Optional<String> empty = Optional.empty();

(2)使用of()方法創建Optional對象:

String name = "binghe";
Optional<String> opt = Optional.of(name);
assertEquals("Optional[binghe]", opt.toString());

傳遞給of()的值不可以為空,否則會拋出空指針異常。例如,下面的程序會拋出空指針異常。

String name = null;
Optional<String> opt = Optional.of(name);

如果我們需要傳遞一些空值,那我們可以使用下面的示例所示。

String name = null;
Optional<String> opt = Optional.ofNullable(name);

使用ofNullable()方法,則當傳遞進去一個空值時,不會拋出異常,而只是返回一個空的Optional對象,如同我們用Optional.empty()方法一樣。

2.isPresent

我們可以使用這個isPresent()方法檢查一個Optional對象中是否有值,只有值非空才返回true。

Optional<String> opt = Optional.of("binghe");
assertTrue(opt.isPresent());

opt = Optional.ofNullable(null);
assertFalse(opt.isPresent());

在Java8之前,我們一般使用如下方式來檢查空值。

if(name != null){
    System.out.println(name.length);
}

在Java8中,我們就可以使用如下方式來檢查空值了。

Optional<String> opt = Optional.of("binghe");
opt.ifPresent(name -> System.out.println(name.length()));

3.orElse和orElseGet

(1)orElse

orElse()方法用來返回Optional對象中的默認值,它被傳入一個“默認參數‘。如果對象中存在一個值,則返回它,否則返回傳入的“默認參數”。

String nullName = null;
String name = Optional.ofNullable(nullName).orElse("binghe");
assertEquals("binghe", name);

(2)orElseGet

與orElse()方法類似,但是這個函數不接收一個“默認參數”,而是一個函數接口。

String nullName = null;
String name = Optional.ofNullable(nullName).orElseGet(() -> "binghe");
assertEquals("binghe", name);

(3)二者有什麼區別?

要想理解二者的區別,首先讓我們創建一個無參且返回定值的方法。

public String getDefaultName() {
    System.out.println("Getting Default Name");
    return "binghe";
}

接下來,進行兩個測試看看兩個方法到底有什麼區別。

String text;
System.out.println("Using orElseGet:");
String defaultText = Optional.ofNullable(text).orElseGet(this::getDefaultName);
assertEquals("binghe", defaultText);

System.out.println("Using orElse:");
defaultText = Optional.ofNullable(text).orElse(getDefaultName());
assertEquals("binghe", defaultText);

在這裏示例中,我們的Optional對象中包含的都是一個空值,讓我們看看程序執行結果:

Using orElseGet:
Getting default name...
Using orElse:
Getting default name...

兩個Optional對象中都不存在value,因此執行結果相同。

那麼,當Optional對象中存在數據會發生什麼呢?我們一起來驗證下。

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

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

String name = "binghe001";

System.out.println("Using orElseGet:");
String defaultName = Optional.ofNullable(name).orElseGet(this::getDefaultName);
assertEquals("binghe001", defaultName);

System.out.println("Using orElse:");
defaultName = Optional.ofNullable(name).orElse(getDefaultName());
assertEquals("binghe001", defaultName);

運行結果如下所示。

Using orElseGet:
Using orElse:
Getting default name...

可以看到,當使用orElseGet()方法時,getDefaultName()方法並不執行,因為Optional中含有值,而使用orElse時則照常執行。所以可以看到,當值存在時,orElse相比於orElseGet,多創建了一個對象。如果創建對象時,存在網絡交互,那系統資源的開銷就比較大了,這是需要我們注意的一個地方。

4.orElseThrow

orElseThrow()方法當遇到一個不存在的值的時候,並不返回一個默認值,而是拋出異常。

String nullName = null;
String name = Optional.ofNullable(nullName).orElseThrow( IllegalArgumentException::new);

5.get

get()方法表示是Optional對象中獲取值。

Optional<String> opt = Optional.of("binghe");
String name = opt.get();
assertEquals("binghe", name);

使用get()方法也可以返回被包裹着的值。但是值必須存在。當值不存在時,會拋出一個NoSuchElementException異常。

Optional<String> opt = Optional.ofNullable(null);
String name = opt.get();

6.filter

接收一個函數式接口,當符合接口時,則返回一個Optional對象,否則返回一個空的Optional對象。

String name = "binghe";
Optional<String> nameOptional = Optional.of(name);
boolean isBinghe = nameOptional.filter(n -> "binghe".equals(name)).isPresent();
assertTrue(isBinghe);
boolean isBinghe001 = nameOptional.filter(n -> "binghe001".equals(name)).isPresent();
assertFalse(isBinghe001);

使用filter()方法會過濾掉我們不需要的元素。

接下來,我們再來看一例示例,例如目前有一個Person類,如下所示。

public class Person{
    private int age;
    public Person(int age){
        this.age = age;
    }
    //省略get set方法
}

例如,我們需要過濾出年齡在25歲到35歲之前的人群,那在Java8之前我們需要創建一個如下的方法來檢測每個人的年齡範圍是否在25歲到35歲之前。

public boolean filterPerson(Peron person){
    boolean isInRange = false;
    if(person != null && person.getAge() >= 25 && person.getAge() <= 35){
        isInRange =  true;
    }
    return isInRange;
}

看上去就挺麻煩的,我們可以使用如下的方式進行測試。

assertTrue(filterPerson(new Peron(18)));
assertFalse(filterPerson(new Peron(29)));
assertFalse(filterPerson(new Peron(16)));
assertFalse(filterPerson(new Peron(34)));
assertFalse(filterPerson(null));

如果使用Optional,效果如何呢?

public boolean filterPersonByOptional(Peron person){
     return Optional.ofNullable(person)
       .map(Peron::getAge)
       .filter(p -> p >= 25)
       .filter(p -> p <= 35)
       .isPresent();
}

使用Optional看上去就清爽多了,這裏,map()僅僅是將一個值轉換為另一個值,並且這個操作並不會改變原來的值。

7.map

如果有值對其處理,並返回處理后的Optional,否則返回 Optional.empty()。

List<String> names = Arrays.asList("binghe001", "binghe002", "", "binghe003", "", "binghe004");
Optional<List<String>> listOptional = Optional.of(names);

int size = listOptional
    .map(List::size)
    .orElse(0);
assertEquals(6, size);

在這個例子中,我們使用一個List集合封裝了一些字符串,然後再把這個List使用Optional封裝起來,對其map(),獲取List集合的長度。map()返回的結果也被封裝在一個Optional對象中,這裏當值不存在的時候,我們會默認返回0。如下我們獲取一個字符串的長度。

String name = "binghe";
Optional<String> nameOptional = Optional.of(name);

int len = nameOptional
    .map(String::length())
    .orElse(0);
assertEquals(6, len);

我們也可以將map()方法與filter()方法結合使用,如下所示。

String password = " password ";
Optional<String> passOpt = Optional.of(password);
boolean correctPassword = passOpt.filter(
    pass -> pass.equals("password")).isPresent();
assertFalse(correctPassword);

correctPassword = passOpt
    .map(String::trim)
    .filter(pass -> pass.equals("password"))
    .isPresent();
assertTrue(correctPassword);

上述代碼的含義就是對密碼進行驗證,查看密碼是否為指定的值。

8.flatMap

與 map 類似,要求返回值必須是Optional。

假設我們現在有一個Person類。

public class Person {
    private String name;
    private int age;
    private String password;
 
    public Optional<String> getName() {
        return Optional.ofNullable(name);
    }
 
    public Optional<Integer> getAge() {
        return Optional.ofNullable(age);
    }
 
    public Optional<String> getPassword() {
        return Optional.ofNullable(password);
    }
    // 忽略get set方法
}

接下來,我們可以將Person封裝到Optional中,並進行測試,如下所示。

Person person = new Person("binghe", 18);
Optional<Person> personOptional = Optional.of(person);

Optional<Optional<String>> nameOptionalWrapper = personOptional.map(Person::getName);
Optional<String> nameOptional = nameOptionalWrapper.orElseThrow(IllegalArgumentException::new);
String name1 = nameOptional.orElse("");
assertEquals("binghe", name1);

String name = personOptional
    .flatMap(Person::getName)
    .orElse("");
assertEquals("binghe", name);

注意:方法getName返回的是一個Optional對象,如果使用map,我們還需要再調用一次get()方法,而使用flatMap()就不需要了。

寫在最後

如果覺得文章對你有點幫助,請微信搜索並關注「 冰河技術 」微信公眾號,跟冰河學習Java8新特性。

最後,附上Java8新特性核心知識圖,祝大家在學習Java8新特性時少走彎路。

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

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

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

三菱重工全系列新陣容亮相,以解疫後攀升的商用、家用空調需求_租車

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

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

相比於全球各國,台灣在疫情方面顯然控制得當更加穩定,雖然在經濟景氣方面略有影響但很慶幸的是台灣的商業行為依然如常,在後疫情時代景氣逐步升溫也帶動市場活絡,各種商辦、工廠、店面、民宿、旅館等承租、開業與興建帶動各種空調設備的需求。上洋產業全新引進三菱重工空調全系列產品陣容,滿足各種商業空間的多元需求。

三菱重工全系列新陣容亮相,以解疫後攀升的商用、家用空調需求

三菱重工以「超速冷、超耐用、超美型、超效能」四大優點受到市場信賴與愛用,無論是商用還是家用產品都是許多人喜愛的選擇品牌,這回上洋產業還禮聘林志玲來作為三菱重工品牌代言人。運用重工級的精密技術開發出有如噴射引擎的鋸齒狀尖端渦輪風扇,以低能耗產生強勁氣流,提供室內機長達 20 米的送風距離,加上以潛水艇概念的延伸設計,最小化室內機運轉噪音。渦捲式壓縮機採用多排氣孔式壓縮技術,讓空調運轉保持超高效率,同時全新的 VTCC 節能功能,可省下 34% 以上的能源消耗,結合重工業精密計算電能使用的技術,PAC 商用空調全面皆達一級能效標準。

全系列產品針對各種不同的族群而生:

  • 家庭、小型工作室
    可採用具備優雅簡約外型的壁掛式室內機,符合現代人對家電用品的美感設計邀要求,三組獨立導風扇與極致靜音技術,讓工作與生活環境恆溫舒適,同時具備節能優點,為業主經省荷包。

  • 發展期公司
    空調搭配設計必須考量到未來業務、人員與空間擴張的可能性來做彈性調整,三菱重工的家用多聯系列可達到最高 183% 連結率;另外, VRF 商用的 Micro KX 系列擁有 150% 連結率,高度僅有 84.5 公分,小巧不佔空間,安裝更方便。

  • 成熟期企業
    在大面積或多隔間的辦公空間中,則可選用 KXZ Lite 室外機,120% 連結率提供全區使用之充足馬力,全規格一級能效;搭配 FDT 嵌入式四方吹室內機,搭載 AirFlex 導風葉片,可讓送風擴散更寬管之外還能避免直吹造成人體不適。最新搭載的升降面板在後續更便於檢修維護,同時可以搭配全屋空氣活化機來促進空氣對流,室內空氣可維持充足的含氧量,並且透過 HEPA 與活性碳濾網有效過濾空氣異味與 PM2.5 等有害粒子,以清新乾淨的好空氣打造優質工作環境。

    ※超省錢租車方案

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

  • 長時間或 24 小時營運連鎖商店
    可採用 PAC 商用系列,輕鋼架天花板的空間上可安裝輕巧的 FDTC 迷你四方吹系列,剛好是一格輕鋼架的尺寸。對於潮濕的商用空間,像是火鍋店、美容院等則可採用 FDE 懸吊式系列,避免室內機節滴水的現象。而像是海產店、熱炒店首選 FDF 落地箱式室內機,外觀簡約輕巧,深度僅有 32公分,可將寸土寸金的店面利用率最大化。

  • 整棟商辦建案
    適用於 VRF 商用全系列,其中 FDU 高靜壓吊隱式室內機最適合挑高環境,FDUM 中低靜壓吊隱式室內機則適合寬廣環境,兩者皆內建排水泵,容易安裝保養與維護。而 FDUH 微型吊隱式室內機擁有 57 公分寬的機身,可輕易隱藏於天花板的空間中,最適合各大飯店客房選用。

倘若你的辦公空間、家中正好要選配空調產品,上洋產業引進了三菱重工依照各種空間需求打造的全系列產品,讓你夠依照實際需要從中挑選出最適合的品項,讓生活與工作環境更舒適、更健康。

您也許會喜歡:

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

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

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

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

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 神州租賃有限公司!合法經營、合法連鎖、合法租賃小客車!

附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設計建置、專業網路行銷。

abp(net core)+easyui+efcore實現倉儲管理系統——出庫管理之一(四十九)_潭子電動車

※超省錢租車方案

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

abp(net core)+easyui+efcore實現倉儲管理系統目錄

abp(net core)+easyui+efcore實現倉儲管理系統——ABP總體介紹(一)
abp(net core)+easyui+efcore實現倉儲管理系統——解決方案介紹(二)
abp(net core)+easyui+efcore實現倉儲管理系統——領域層創建實體(三)
 abp(net core)+easyui+efcore實現倉儲管理系統——定義倉儲並實現 (四)
abp(net core)+easyui+efcore實現倉儲管理系統——創建應用服務(五)
abp(net core)+easyui+efcore實現倉儲管理系統——展現層實現增刪改查之控制器(六)
abp(net core)+easyui+efcore實現倉儲管理系統——展現層實現增刪改查之列表視圖(七)
abp(net core)+easyui+efcore實現倉儲管理系統——展現層實現增刪改查之增刪改視圖(八)
abp(net core)+easyui+efcore實現倉儲管理系統——展現層實現增刪改查之菜單與測試(九)
abp(net core)+easyui+efcore實現倉儲管理系統——使用 WEBAPI實現CURD (十一)

abp(net core)+easyui+efcore實現倉儲管理系統——EasyUI前端頁面框架 (十八)

abp(net core)+easyui+efcore實現倉儲管理系統——EasyUI之貨物管理一 (十九)
abp(net core)+easyui+efcore實現倉儲管理系統——ABP WebAPI與EasyUI結合增刪改查之一(二十七)
abp(net core)+easyui+efcore實現倉儲管理系統——ABP WebAPI與EasyUI結合增刪改查之三(二十九)
abp(net core)+easyui+efcore實現倉儲管理系統——ABP WebAPI與EasyUI結合增刪改查之八(三十四)
abp(net core)+easyui+efcore實現倉儲管理系統——ABP WebAPI與EasyUI結合增刪改查之十(三十六)
abp(net core)+easyui+efcore實現倉儲管理系統——入庫管理之一(三十七)
abp(net core)+easyui+efcore實現倉儲管理系統——入庫管理之二(三十八)
abp(net core)+easyui+efcore實現倉儲管理系統——入庫管理之三存儲過程(三十九)
abp(net core)+easyui+efcore實現倉儲管理系統——入庫管理之四(四十)
abp(net core)+easyui+efcore實現倉儲管理系統——入庫管理之五(四十一)
abp(net core)+easyui+efcore實現倉儲管理系統——入庫管理之六(四十二)
abp(net core)+easyui+efcore實現倉儲管理系統——入庫管理之七(四十三)
abp(net core)+easyui+efcore實現倉儲管理系統——入庫管理之八(四十四)   
abp(net core)+easyui+efcore實現倉儲管理系統——入庫管理之九(四十五)
abp(net core)+easyui+efcore實現倉儲管理系統——入庫管理之十(四十六)

abp(net core)+easyui+efcore實現倉儲管理系統——入庫管理之十一(四十七)
abp(net core)+easyui+efcore實現倉儲管理系統——入庫管理之十二(四十八)

.前言

        出庫單的功能。能學習了出庫單管理之後,WMS的 最基本的功能算是完成了。當然一個成熟的WMS還包括了盤點,報表,策略規則,移庫功能及與其他系統(ERP、TMS等)的接口,實現無縫集成,打破信息孤島,讓數據實時、準確和同步。

二、出庫單的流程

    1.一般情況下會有一個前置的OMS系統——即訂單管理系統。主要功能之一是由客戶填寫訂單。

      2.客戶把訂單下第三方物流公司時,第三方物流公司會生成出貨單推送到倉庫時,系統會自動生成揀貨單,理貨員根據揀貨單揀貨,並製作出庫單,然後打印標籤,粘貼條碼標籤,分配托盤,核驗條碼標籤,貨物裝箱,訂艙出庫,並在系統中對出庫單進行審核通過。整個流程如下圖。

 

     當然我們接下來要實現的出庫單功能,沒有這麼複雜。

 

三、創建出庫單實體

    1. 做為一個出庫單,在數據庫中一般存在兩張表,表頭OutStockOrder,表體OutStockDetail

    2.Visual Studio 2017的“解決方案資源管理器”中,右鍵單擊“ABP.TPLMS.Core”項目的“Entitys”文件夾,在彈出菜單中選擇“添加” >

 > “類”。 將類命名為 OutStockOrder,然後選擇“添加”。

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

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

    3.創建OutStockOrder類繼承自Entity<int>,通過實現審計模塊中的IHasCreationTime來實現保存創建時間。代碼如下:

using Abp.Domain.Entities; using Abp.Domain.Entities.Auditing; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Text; namespace ABP.TPLMS.Entitys { public class OutStockOrder: Entity<int>, IHasCreationTime { public const int MaxLength = 255; public OutStockOrder() { No = string.Empty; CustomerCode = string.Empty; CustomerName = string.Empty; WarehouseNo = string.Empty; DeliveryNo = string.Empty; TallyClerk = string.Empty; TallyTime = string.Empty; CreationTime = DateTime.Now; Oper = string.Empty; Checker = string.Empty; CheckTime = string.Empty; Gwt = 0; Nwt = 0; PackageQty = 0; OwnerCode = string.Empty; OwnerName = string.Empty; Remark = string.Empty; Status = 0; PreOutStockTime = string.Empty; } [StringLength(50)] [Required] public string No { get; set; } /// <summary>
        /// 客戶名稱 /// </summary>
 [StringLength(MaxLength)] [Required] public string CustomerName { get; set; } /// <summary>
        /// 車牌號 /// </summary>
        public string VehicleNo { get; set; } /// <summary>
        /// 客戶代碼 /// </summary>
        [StringLength(50)] [Required] public string CustomerCode { get; set; } /// <summary>
        /// 收貨人代碼 /// </summary>
        public string ConsigneeCode { get; set; } /// <summary>
        /// 收貨人 /// </summary>
        public string Consignee{get ;set;} /// <summary>
        /// 收貨人社會信用代碼 /// </summary>
        public string ConsigneeSCCD { get; set; } /// <summary>
        /// 託運人,發貨人 /// </summary>
        public string Shipper { get; set; } /// <summary>
        /// 託運人,發貨人代碼 /// </summary>
        public string ShipperCode { get; set; } /// <summary>
        /// 託運人,發貨人社會信用代碼 /// </summary>
        public string ShipperSCCD { get; set; } /// <summary>
        /// 通知人 /// </summary>
        public string Notify { get; set; } /// <summary>
        /// 通知人代碼 /// </summary>
        public string NotifyCode { get; set; } /// <summary>
        /// 通知人社會信用代碼 /// </summary>
        public string NotifySCCD { get; set; } /// <summary>
        /// 出貨單號 /// </summary>
        public string DeliveryNo { get; set; } /// <summary>
        /// 倉庫號 /// </summary>
        public string WarehouseNo { get; set; } /// <summary>
        /// 貨主 /// </summary>
 [StringLength(MaxLength)] [Required] public string OwnerName { get; set; } public decimal Gwt { get; set; } public decimal Nwt { get; set; } public int PackageQty { get; set; } /// <summary>
        /// 理貨時間 /// </summary>
        [StringLength(20)] public string TallyTime { get; set; } /// <summary>
        /// 理貨員 /// </summary>
        [StringLength(50)] public string TallyClerk { get; set; } [StringLength(50)] public string Oper { get; set; } public int Status { get; set; } [StringLength(50)] public string OwnerCode { get; set; } /// <summary>
        /// 預計出庫時間 /// </summary>
        [StringLength(20)] public string PreOutStockTime { get; set; } /// <summary>
        /// 審核人 /// </summary>
        [StringLength(50)] public string Checker { get; set; } [StringLength(20)] public string CheckTime { get; set; } [StringLength(1000)] public string Remark { get; set; } public DateTime CreationTime { get; set; } [StringLength(20)] public string LastUpdateTime { get; set; } [StringLength(50)] public string LastOper { get; set; } } } 

    4. 重得第2,3步,我們在“ABP.TPLMS.Core”項目的“Entitys”文件夾,創建OutStockOrderDetail類。代碼如下:

using Abp.Domain.Entities; using Abp.Domain.Entities.Auditing; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Text; namespace ABP.TPLMS.Entitys { public class OutStockOrderDetail : Entity<int>, IHasCreationTime { public const int MaxLength = 255; public OutStockOrderDetail() { this.Qty = 0; this.CargoCode = string.Empty; this.CargoName = string.Empty; this.Brand = string.Empty; this.Country = string.Empty; this.CreationTime = DateTime.Now; this.Curr = string.Empty; this.GrossWt = 0; this.Height = 0; this.HSCode = string.Empty; this.Length = 0; this.SecdLawfQty = 0; this.LawfQty = 0; this.NetWt = 0; this.Package = string.Empty; this.Price = 0; this.Spcf = string.Empty; this.Unit = string.Empty; this.InStockNo = string.Empty; this.LawfUnit = string.Empty; this.Vol = 0; this.Width = 0; this.LawfUnit = string.Empty; this.SecdLawfUnit = string.Empty; this.Batch = string.Empty; this.InStockOrderDetailId = 0; } public int SupplierId { get; set; } [MaxLength(50)] public string CargoCode { get; set; } [MaxLength(10)] public string HSCode { get; set; } [MaxLength(MaxLength)] public string CargoName { get; set; } [MaxLength(MaxLength)] public string Spcf { get; set; } [MaxLength(20)] public string Unit { get; set; } /// <summary>
        /// 目的國 /// </summary>
        [MaxLength(20)] public string DestCountry { get; set; } /// <summary>
        /// 原產國 /// </summary>
 [MaxLength(20)] public string Country { get; set; } [MaxLength(50)] public string Brand { get; set; } [MaxLength(20)] public string Curr { get; set; } [MaxLength(20)] public string Package { get; set; } public decimal Length { get; set; } public decimal Width { get; set; } public decimal Height { get; set; } public decimal Vol { get; set; } public decimal Price { get; set; } public decimal TotalAmt { get; set; } public decimal GrossWt { get; set; } public decimal NetWt { get; set; } public DateTime CreationTime { get; set; } [MaxLength(20)] public string InStockNo { get; set; } public int InStockOrderDetailId { get; set; } public decimal Qty { get; set; } public decimal LawfQty { get; set; } public decimal SecdLawfQty { get; set; } [MaxLength(20)] public string LawfUnit { get; set; } [MaxLength(20)] public string SecdLawfUnit { get; set; } [MaxLength(20)] public string Batch { get; set; } public string  Loc { get; set; } } }

5.定義入庫單的實體之後,我們去“ABP.TPLMS.EntityFrameworkCore”項目中的“TPLMSDbContext”類中定義實體對應的DbSet,以應用Code First 數據遷移。添加以下代碼

using Microsoft.EntityFrameworkCore; using Abp.Zero.EntityFrameworkCore; using ABP.TPLMS.Authorization.Roles; using ABP.TPLMS.Authorization.Users; using ABP.TPLMS.MultiTenancy; using ABP.TPLMS.Entitys; namespace ABP.TPLMS.EntityFrameworkCore { public class TPLMSDbContext : AbpZeroDbContext<Tenant, Role, User, TPLMSDbContext> { /* Define a DbSet for each entity of the application */
      

        public TPLMSDbContext(DbContextOptions<TPLMSDbContext> options) : base(options) { } public DbSet<Module> Modules { get; set; } public DbSet<Supplier> Suppliers { get; set; } public DbSet<Cargo> Cargos { get; set; } public DbSet<Org> Orgs { get; set; } public virtual DbSet<InStockOrder> InStockOrder { get; set; } public virtual DbSet<InStockOrderDetail> InStockOrderDetail { get; set; } public virtual DbSet<InStockOrderDetailLoc> InStockOrderDetailLoc { get; set; } public virtual DbSet<OutStockOrder> OutStockOrder { get; set; } public virtual DbSet<OutStockOrderDetail> OutStockOrderDetail { get; set; } } }

     6.從菜單中選擇“工具->NuGet包管理器器—>程序包管理器控制台”菜單。

    7. 在PMC中,默認項目選擇EntityframeworkCore對應的項目后。輸入以下命令:Add-Migration AddEntityOutStock,創建遷移。如下圖。

 

    8. 在上面的命令執行完畢之後,創建成功后,會在Migrations文件夾下創建時間_AddEntityOutStock格式的類文件,這些代碼是基於DbContext指定的模型。如下圖。

 

    9.在程序包管理器控制台,輸入Update-Database,回車執行遷移。執行成功后,如下圖。

 

    10. 在SQL Server Management Studio中查看數據庫,OutStockOrder、OutStockOrderDetail兩張表創建成功。

 

 

 

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

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

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

武漢市發熱門診就診高峰全天超1.5萬人_租車

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

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

新華社武漢1月27日電(記者王作葵、喻珮)武漢市發熱門診就診人數增加,過去幾天的高峰時段,一天就診人數超過1.5萬人,全市發熱門診超負荷運轉。這是武漢市委書記馬國強27日晚在湖北新型冠狀病毒感染的肺炎疫情防控工作例行新聞發布會上說的。

馬國強說,往年同期,武漢市發熱門診日均就診人數在3000例左右。疫情發生以來,發熱門診就診人數逐日增多,高峰時段超過了1.5萬人。儘管發熱門診超負荷運轉,前期一些地方還是出現大量人員排隊的現象。

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

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

“武漢市全市現有62家醫院設置發熱門診,但是由於其分佈不同、知名度不同,大家普遍希望到大醫院、有名的醫院去就診。”馬國強說,前期出現的發熱門診排長隊情況現已有所緩解。

湖北省醫療救治組專家、湖北省人民醫院呼吸科教授胡克說,由於前期診斷的新型冠狀病毒感染的肺炎病例少,出院的病例相對也較少。隨着後期診斷和治療跟進,出院病例數將逐步增加。

他介紹,病毒性肺炎的治療周期在2到3周。為了確保新型冠狀病毒感染的肺炎患者在出院后不具有傳染性,需要進行相應的檢測。要求體溫恢復正常3天以上,呼吸道癥狀明顯好轉,肺部影像學显示炎症明顯吸收,連續2次呼吸道病原核酸檢測陰性,且採樣間隔時間至少在1天以上。符合這些要求才可以解除隔離出院。

本站聲明:網站內容來http://www.societynews.cn/html/wh/fq/,如有侵權,請聯繫我們,我們將及時處理

※超省錢租車方案

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

環境減災二號01組A、B星成功發射!環境衛星家族又添新成員_租車

※超省錢租車方案

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

2020-09-30

2020-09-30
分享到:
[打印]
字號:[大] [中] [小]   9月27日11時23分,我國在太原衛星發射中心用長征四號乙運載火箭,以一箭雙星方式成功發射環境減災二號01組A、B星。
  環境減災二號01組A、B星是國家民用空間基礎設施中長期發展規劃(2015-2025年)支持立項,由生態環境部與應急管理部共同牽頭研製建設的光學對地遙感衛星,用於接替已在軌運行12年的環境減災一號A、B衛星,可滿足國家生態環境部、應急管理部應用需求,併兼顧國土資源、水利、農業、林業、地震等行業需求。 環境減災二號01組A、B星搭載長征四號乙火箭點火起飛   環境減災二號01組A、B星採用了太陽同步回歸軌道,兩顆衛星技術狀態相同,設計壽命為5年,每顆衛星配置了4類光學載荷,包括16m相機、高光譜成像儀、紅外相機、大氣校正儀。其中,16m相機載荷由四台可見光CCD相機組成,通過視場拼接可提供幅寬為800km的多光譜圖像;高光譜成像儀幅寬為96km;紅外相機幅寬為720km;大氣校正儀可在軌同步獲取與16m相機同視場的大氣多譜段信息,進行大氣輻射校正。 環境減災二號01組A、B星載荷配置示意圖 環境減災二號01組A、B星拍攝示意圖   環境減災二號01組A、B星發射成功后可實現同軌組網觀測,

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

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

大幅提高我國中分辨率可見光、紅外及高光譜遙感數據獲取能力,滿足區域生態、環境空氣、地表水環境、城市環境、環境災害、全球環境變化等大範圍、全天候、全天時、動態的監測與評估的遙感數據需要,為實現科學治污、精準治污、依法治污提供重要技術支撐,使我國生態環境監測治理能力更加科學化、現代化。 雙星同軌組網觀測示意圖   環境減災二號01組A、B星成功發射,對提升生態環境遙感監測業務化能力極為重要。在大氣環境遙感監測方面,可針對秸稈焚燒和沙塵污染進行遙感動態監測,實現大氣環境污染的遙感精細化監測應用,為大氣污染防治以及空氣環境質量預警預報提供技術支持;在水環境遙感監測方面,可對恭弘=叶 恭弘綠素a、懸浮物等水質參數,溢油、赤潮等近海環境事件,核電廠、火電廠溫排水等水體熱污染開展動態監測;在生態環境監測方面,可為生態系統監測與評估、生態環境關鍵參數生產、自然保護區綜合監管、礦產資源開發監測評估和城市群生態環境監測等生態管理核心業務提供重要數據支撐,實現生態環境信息提取、分析和綜合應用的業務化運行。 衛星研製團隊部分成員與衛星合影   環境減災二號衛星在為生態環境保護等多個領域提供服務的同時,也將不斷在衛星觀測精度、空間分辨率和時間分辨率等方面繼續提升能力。待“十四五”期間環境減災“4+4”衛星星座建成后,將形成全天時、全天候、動態實時的中分辨率全球生態環境監測能力,為實現“高精度、全方位、短周期”的生態環境遙感監測目標提供更為強力的支撐。

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

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