標籤: 收購 MACBOOK

  • 可惡!極罕見全白長頸鹿明星母子 雙雙被盜獵慘遭扒皮

    摘錄自2020年3月11日自由時報報導

    肯亞一保護區的稀有全白長頸鹿一家三口在2017年被拍下身影後成為園區明星,不僅全球媒體爭相報導,每年更吸引大量遊客前往觀賞。然而,當時就曾有專家憂心牠們獨特的毛色會為其惹來殺身之禍,果不其然,園方今日宣布噩耗,近日發現長頸鹿母子慘遭盜獵後僅剩白骨的屍體。

    根據《CNN》報導,肯亞Ishaqbini Hirola保護區園方人員今(11日)證實,該園區明星、2017年爆紅的全白長頸鹿一家現已天人永隔,其中母、子獸在失蹤多時後,近日被發現僅剩森森白骨,後經確認遭盜獵者殺害、剝取毛皮後棄屍在地,專家認為,牠們已死亡至少四個月。

    園方表示,此一殺戮悲劇在各層面上都是一記重拳,不僅嚴重挑釁當局保護稀有、獨特物種的政策與宣言,對於當地旅遊業、遺傳學研究所投入的科研資金更是一大打擊。

    動物福利
    國際新聞
    肯亞
    長頸鹿
    盜獵
    剝皮

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

    【其他文章推薦】

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

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

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

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

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

  • 深圳坪山新區將打造新能源汽車推廣應用和運營示範區

    近日,從深圳市坪山新區經濟服務局獲悉,《坪山新區新能源汽車推廣應用行動方案》(簡稱《方案》)正式出臺。

    從《方案》中看到,新區將堅持大力發展新能源汽車產業與推廣新能源汽車的戰略方向,不僅制定了詳細的發展目標,還對重點任務和責任進行了分解。根據發展目標,新區力爭到2017年,在轄區範圍推廣使用2925輛新能源汽車。其中,公車500輛,計程車140輛,環衛、郵政、物流等專用車225輛,執法通勤車60輛,私人領域2000輛。

    如何確保新能源汽車產業的健康發展和推廣應用,當然離不開完善的配套設施。新區在出臺《方案》的同時,還發佈了《新能源汽車充電設施佈局指引》(簡稱《指引》),引導各類新能源汽車充電設施全面發展、合理佈局,至2017年,將建設公交專用快充電樁297個,環衛專用快充電樁37個,公用快充電樁212個,慢充電樁2788個。

    《指引》共分兩個階段,至2017年為試驗推廣階段,該階段以政府推動為主,依靠政府補貼和主導宣傳,逐步替換現有的傳統垃圾清運車、公車、大型企事業單位公用車、少量社會車輛和計程車。第二階段是運營普及階段,從2018年至2020年。期間,將以市場推動為主,在大量計程車和私家車主中推廣使用新能源汽車。

    新區經濟服務局相關負責人表示,將發揮巴斯巴、沃特瑪等轄區企業的帶動作用,壯大產業鏈,在關鍵零部件領域實現突破性創新,打造全國新能源汽車技術創新中心和關鍵零部件生產基地。到2020年,力爭新能源汽車產業實現產值600億元。

    相關閱讀

    截至目前,坪山新區已建設有碧嶺村總站、大窩總站、坪山充電站等3個新能源公交充電站,公交專用充電樁共計56個;可供計程車使用的快充點1處,提供快充電樁20個;可供大型新能源車充電的網站有2處,分別位於新區管委會紅樓、多彩工業園,有充電樁12個;可供私家車慢充的設備點2處,其中,新區管委會大院內慢充電樁10個,比亞迪一廠慢充電樁400個。

    新能源車專用快充網站:新區內公車快充網站共計17處,充電樁共計297個;大型環衛車專用快充網站2處,專用充電樁7個;電動環衛三輪車快充網站18處,充電樁共計30個。

    新能源車公用快充網站:新區內公用快充設備點共計12處,充電樁共計212個;近期小車公用快充樁5km2服務半徑中心城區覆蓋水準達90%。

    新能源車慢充設備點:新區內私家車慢充設備點共計62處,充電樁共計2788個。
     

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

    【其他文章推薦】

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

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

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

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

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

  • 手把手教你如何在阿里雲ECS搭建Python TensorFlow Jupyter

    前段時間在阿里雲買了一台服務器,準備部署網站,近期想玩一些深度學習項目,正好拿來用。TensorFlow官網的安裝僅提及Ubuntu,但我的ECS操作系統是 CentOS 7.6 64位,搭建Python、TensorFlow、Jupyter開發環境過程中遇到很多問題。這裏將具體步驟分享給大家,可以少走很多彎路。

    第一步 安裝anaconda

    Anaconda在linux依然功能強大,管理工具包、開發環境、Python版本都非常方便。

    先在根目錄下創建一個文件夾用於存放Anaconda安裝包

    ~# mkdir anaconda

    ~# cd anaconda

    為保障下載速度,建議選擇清華大學鏡像站

    選擇版本,複製鏈接

    anaconda目錄下運行:

    wget 

     

    這裏可能會報錯,多半是無法解析主機地址,也即DNS解析的問題。

    解決辦法:

    登入root

    sudo vim /etc/resolv.conf

    修改內容為下

    nameserver 8.8.8.8 

    nameserver 8.8.4.4 

    切換到anaconda3所在文件位置

     bash Anaconda3-2019.03-Linux-x86_64.sh

    一路yes,直到安裝完成

    如果中間報錯,這是因為之前創建過anaconda3了

    解決辦法:

    bash Anaconda3-2019.03-Linux-x86_64.sh -u

    測試一下,python pip也都安裝成功了

    如果在安裝Anaconda的過程中沒有將安裝路徑添加到系統環境變量中,需要在安裝後手工添加:

    1、在終端輸入 vim/etc/profile,打開profile文件。

    2、在文件末尾添加一行:

    exportPATH=/root/anaconda3/bin:$PATH,保存。

    3、讓/etc/profile文件修改后立即生效 ,可以使用如下命令: source /etc/profile

     

    另外,Anaconda安裝完成後會創建一個叫base的默認環境,Linux的終端界面前部出現(base)字樣,如不介意,可以跳過這個步驟:

    在終端中輸入conda deactivate,即可消除base字樣,但這是一次性的,再次打開終端依然存在base字樣。在.bashrc文件添加命令:conda deactivate可以永久消除base字樣。

    1.打開一個終端 ,輸入命令:gedit~/.bashrc

    2.在 .bashrc文件最後面添加命令:conda deactivate

     

    第二步 安裝虛擬環境

    virtualenv 是一個創建隔絕的Python環境的工具,用virtualenv創建一個包含所有必要的可執行文件的文件夾,用來使用Python工程所需的包。

    conda也能配置虛擬環境,可以直接從base克隆

     conda create -n myenv–clone base

    但是我還是習慣用virtualenv,conda方法的後續配置方法,大家自行嘗試。

    1、安裝virtualenv

    pip install virtualenv

    在pip安裝包時,系統默認是從aliyun鏡像,我試過幾個鏡像源,發現還是清華的鏡像源比較快。我們修改一下配置文件:

    mkdir ~/.pip

    cd ~/.pip

    vi pip.conf

    將文件內容修改為以下內容,保存即可。

    [global]

    index-url =

    2、安裝虛擬環境,這裏選擇Python3.7版,環境名設為:myenv

     conda create -n myenv python=3.7

    3、激活虛擬環境

     source activate myenv

    4、在虛擬環境安裝TensorFlow

     pip install –ignore-installed –upgrade packageURL

     

    官網提供的URL來自google,由於眾所周知的原因。。。所以我們從pypi.org下載安裝

    pip install –ignore-installed –upgrade

    測試一下,安裝成功!

     

    第三步 搭建Jupyter並遠程訪問

    Anaconda安裝成功后,Jupyter也一樣安裝好了

    But這樣是不行的,因為juypter集成在anaconda中,並不在虛擬環境myenv下,所以我們需要回到第二步中的激活虛擬環境,然後再次安裝jupyter:

    pip install jupyter

    安裝完成后運行#jupyter notebook會報錯,提示說找不到該文件之類的,是沒有配置環境變量的原因。

    解決辦法:

    vim /root/.jupyter/jupyter_notebook_config.py 

    改幾個地方:

    c.NotebookApp.ip = ‘ip地址’ #

    c.NotebookApp.password = u’秘鑰’ 

    c.NotebookApp.port = 8889 # 端口號,自設

    c.NotebookApp.enable_mathjax = True 

    c.NotebookApp.notebookdir = “jupyter安裝地址”

    其中,ip地址可以在控制台實例列表中查詢,這裏要填寫下圖私有ip

     

    秘鑰可以用ipython生成,是的anaconda也集成了ipython,設置一個簡單的密碼(別忘了,後面還要用),生成的秘鑰複製過去即可,代碼如下:

    查詢jupyter安裝地址

    將上文地址修改為/root/anaconda3/envs/myenv/bin

    以上修改完畢,再次運行jupyter notebook

    但是,還沒有結束呢。

    我們還需要設置一下ECS實例的安全規則,入方向、出方向一樣。

    至此,所有設置完畢!在服務器端運行jupyter notebook,進程在後台運行。

    再次在控制台實例列表中查詢ip

    本文由博客一文多發平台 發布!

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

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

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

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

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

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

  • 武漢肺炎防疫靠洗手 非洲水資源不足專家著急

    摘錄自2020年03月21日中央通訊社非洲報導

    新型冠狀病毒(COVID-19,武漢肺炎)疫情持續延燒全球之際,勤洗手是防疫關鍵。但專家表示非洲有許多人連洗手都是奢望,呼籲各國趁此次疫情改善供水設施。

    湯森路透(Thomson Reuters Foundation)引述救援人員和顧問表示,非洲各國應該在明天(22日)的世界水資源日之前,抓住機會加強水資源安全。非洲經常發生旱災,許多人家中連洗手槽都沒有。

    根據聯合國資料,過去一年來,非洲中部與南部西半邊許多地區面臨1981年來最低降雨量。聯合國兒童基金會(UNICEF)指出,非洲西部和中部仍有占總人口超過1/3的民眾,無法取得乾淨水源。

    聯合國的數據顯示,肯亞只有14%的人家中有洗手設施,肯亞政府已呼籲水公司不要因民眾逾期繳費就斷水,並計劃提供民眾免費的乾洗手。

    土地水文
    國際新聞
    非洲
    武漢肺炎
    洗手
    世界水資源日

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

    【其他文章推薦】

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

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

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

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

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

  • 中金國泰與金沙江資本牽頭成立百億新能源汽車專項基金

    近日,中金國泰股權投資基金管理(上海)有限公司和天津濱海高新技術產業開發區、金沙江資本三方簽署合作協定,共同出資成立總額為100億元的新能源汽車專項基金,專項用於向新能源汽車及其相關領域進行投資。

    根據協定,該新能源汽車專項基金將投資於新能源汽車的相關產業,包括但不限於:新能源整車、動力電池、電動汽車電機、電子控制、充電樁、電動汽車租賃、電動汽車計費和管理平臺、新能源電站的開發和建設等。投資區域涵蓋中國大陸市場,以及海外市場。三方出資將分期到位,首期基金規模30億元,共同組建投資決策委員會。中金國泰與金沙江資本將組建基金管理公司,負責基金的日常運營和管理。

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

    【其他文章推薦】

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

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

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

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

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

  • 50行Python代碼實現視頻中物體顏色識別和跟蹤(必須以紅色為例)

    50行Python代碼實現視頻中物體顏色識別和跟蹤(必須以紅色為例)

    目前計算機視覺(CV)與自然語言處理(NLP)及語音識別並列為人工智能三大熱點方向,而計算機視覺中的對象檢測(objectdetection)應用非常廣泛,比如自動駕駛、視頻監控、工業質檢、醫療診斷等場景。

    目標檢測的根本任務就是將圖片或者視頻中感興趣的目標提取出來,目標的識別可以基於顏色、紋理、形狀。其中顏色屬性運用十分廣泛,也比較容易實現。下面就向大家分享一個我做的小實驗———通過OpenCV的Python接口來實現從視頻中進行顏色識別和跟蹤。

    下面就是我們完整的代碼實現(已調試運行):

    import numpy as np
    import cv2
    font = cv2.FONT_HERSHEY_SIMPLEX
    lower_green = np.array([35, 110, 106])  # 綠色範圍低閾值
    upper_green = np.array([77, 255, 255])  # 綠色範圍高閾值
    lower_red = np.array([0, 127, 128])  # 紅色範圍低閾值
    upper_red = np.array([10, 255, 255])  # 紅色範圍高閾值
    #需要更多顏色,可以去百度一下HSV閾值!
    # cap = cv2.VideoCapture('1.mp4')  # 打開視頻文件
    cap = cv2.VideoCapture(0)#打開USB攝像頭
    if (cap.isOpened()):  # 視頻打開成功
        flag = 1
    else:
        flag = 0
    num = 0
    if (flag):
        while (True):
            ret, frame = cap.read()  # 讀取一幀
           
            if ret == False:  # 讀取幀失敗
                break
            hsv_img = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
            mask_green = cv2.inRange(hsv_img, lower_green, upper_green)  # 根據顏色範圍刪選
            mask_red = cv2.inRange(hsv_img, lower_red, upper_red) 
     # 根據顏色範圍刪選
            mask_green = cv2.medianBlur(mask_green, 7)  # 中值濾波
            mask_red = cv2.medianBlur(mask_red, 7)  # 中值濾波
            mask = cv2.bitwise_or(mask_green, mask_red)
            mask_green, contours, hierarchy = cv2.findContours(mask_green, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
            mask_red, contours2, hierarchy2 = cv2.findContours(mask_red, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
    
            for cnt in contours:
                (x, y, w, h) = cv2.boundingRect(cnt)
                cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 255), 2)
                cv2.putText(frame, "Green", (x, y - 5), font, 0.7, (0, 255, 0), 2)
    
            for cnt2 in contours2:
                (x2, y2, w2, h2) = cv2.boundingRect(cnt2)
                cv2.rectangle(frame, (x2, y2), (x2 + w2, y2 + h2), (0, 255, 255), 2)
                cv2.putText(frame, "Red", (x2, y2 - 5), font, 0.7, (0, 0, 255), 2)
            num = num + 1
            cv2.imshow("dection", frame)
            cv2.imwrite("imgs/%d.jpg"%num, frame)
            if cv2.waitKey(20) & 0xFF == 27:
                break
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    如圖所示,我們將會檢測到紅色區域

    最終的效果圖:

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

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

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

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

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

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

  • Appium+python自動化(四十一)-Appium自動化測試框架綜合實踐 – 即將落下帷幕(超詳解)

    Appium+python自動化(四十一)-Appium自動化測試框架綜合實踐 – 即將落下帷幕(超詳解)

    1.簡介

      今天我們緊接着上一篇繼續分享Appium自動化測試框架綜合實踐 – 代碼實現。到今天為止,大功即將告成;框架所需要的代碼實現都基本完成。

    2.data數據封裝

    2.1使用背景

    在實際項目過程中,我們的數據可能是存儲在一個數據文件中,如txt,excel、csv文件類型。我們可以封裝一些方法來讀取文件中的數據來實現數據驅動。

    2.2案例

    將測試賬號存儲在account.csv文件,內容如下:

    account.csv

    hg2018

    hg2018

    hg2019

    zxw2019

    666

    222

    參考代碼

    2.3enumerate()簡介

    enumerate()是python的內置函數

    • enumerate在字典上是枚舉、列舉的意思
    • 對於一個可迭代的(iterable)/可遍歷的對象(如列表、字符串),enumerate將其組成一個索引序列,利用它可以同時獲得索引和值
    • enumerate多用於在for循環中得到計數。

    2.4enumerate()使用

    如果對一個列表,既要遍歷索引又要遍曆元素時,首先可以這樣寫:

    參考代碼
    list = ["", "", "一個", "測試","數據"]
    
    for i in range(len(list)):
    
        print(i,list[i])

    上述方法有些累贅,利用enumerate()會更加直接和優美:

    參考代碼
    list1 = ["", "", "一個", "測試","數據"]
    
    for index, item in enumerate(list1):
    
            print(index,item)

    3.數據讀取方法封裝

      數據讀取方法也屬於公共方法,這裏我們首先實現一下,然後將其封裝到裡邊即可。

    3.1數據讀取方法實現的參考代碼

    import csv
    
    
         def get_csv_data(csv_file,line):
    
            with open(csv_file, 'r', encoding='utf-8-sig') as file:
    
                reader=csv.reader(file)
    
                for index, row in enumerate(reader,1):
    
                    if index == line:
    
                        return row
    
     
    
        csv_file='../data/account.csv'
    
        data=get_csv_data(csv_file,3)
    
        print(data)

    3.2封裝

    將其封裝在公共方法中,在其他地方用到的時候,直接導入調用即可。

    4.utf-8與utf-8-sig兩種編碼格式的區別

    UTF-8以字節為編碼單元,它的字節順序在所有系統中都是一樣的,沒有字節序的問題,也因此它實際上並不需要BOM(“ByteOrder Mark”)。但是UTF-8 with BOM即utf-8-sig需要提供BOM。

    5.config文件配置

    各種配置文件都放在這個目錄下。

    5.1日誌文件配置 

    主要是一些日誌信息的配置。

    log.config

     參考代碼
    [loggers]
    keys=root,infoLogger
    
    [logger_root]
    level=DEBUG
    handlers=consoleHandler,fileHandler
    
    [logger_infoLogger]
    handlers=consoleHandler,fileHandler
    qualname=infoLogger
    propagate=0
    
    [handlers]
    keys=consoleHandler,fileHandler
    
    [handler_consoleHandler]
    class=StreamHandler
    level=INFO
    formatter=form02
    args=(sys.stdout,)
    
    [handler_fileHandler]
    class=FileHandler
    level=INFO
    formatter=form01
    args=('../logs/runlog.log', 'a')
    
    [formatters]
    keys=form01,form02
    
    [formatter_form01]
    format=%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s
    
    [formatter_form02]
    format=%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s

    6.測試用例封裝

    這裏宏哥舉例給小夥伴們演示:封裝註冊和登錄兩個測試用例。

    6.1測試用例執行開始結束操作封裝

    測試用例執行開始和結束的封裝,其他模塊用到直接導入,調用即可。

    myunit.py

    參考代碼
    # coding=utf-8
    # 1.先設置編碼,utf-8可支持中英文,如上,一般放在第一行
    
    # 2.註釋:包括記錄創建時間,創建人,項目名稱。
    '''
    Created on 2019-11-20
    @author: 北京-宏哥   QQ交流群:707699217
    Project:Appium自動化測試框架綜合實踐 - 代碼實現
    '''
    # 3.導入模塊
    import unittest
    from kyb_testProject.common.desired_caps import appium_desired
    import logging
    from time import sleep
    
    class StartEnd(unittest.TestCase):
        def setUp(self):
            logging.info('=====setUp====')
            self.driver=appium_desired()
    
        def tearDown(self):
            logging.info('====tearDown====')
            sleep(5)
            self.driver.close_app()

    6.2註冊用例

    開始註冊用例代碼邏輯的實現。

    test_register.py

    參考代碼
    # coding=utf-8
    # 1.先設置編碼,utf-8可支持中英文,如上,一般放在第一行
    
    # 2.註釋:包括記錄創建時間,創建人,項目名稱。
    '''
    Created on 2019-11-20
    @author: 北京-宏哥   QQ交流群:707699217
    Project:Appium自動化測試框架綜合實踐 - 代碼實現
    '''
    # 3.導入模塊
    from kyb_testProject.common.myunit import StartEnd
    from kyb_testProject.businessView.registerView import RegisterView
    import logging,random,unittest
    
    class RegisterTest(StartEnd):
        def test_user_register(self):
            logging.info('======test_user_register======')
            r=RegisterView(self.driver)
    
            username = 'bjhg2019' + 'fly' + str(random.randint(1000, 9000))
            password = 'bjhg2020' + str(random.randint(1000, 9000))
            email = 'bjhg' + str(random.randint(1000, 9000)) + '@163.com'
    
            self.assertTrue(r.register_action(username,password,email))
    
    if __name__ == '__main__':
        unittest.main()

    6.3登錄用例

    開始登錄用例代碼邏輯的實現。

    test_login.py

    參考代碼
    # coding=utf-8
    # 1.先設置編碼,utf-8可支持中英文,如上,一般放在第一行
    
    # 2.註釋:包括記錄創建時間,創建人,項目名稱。
    '''
    Created on 2019-11-13
    @author: 北京-宏哥   QQ交流群:707699217
    Project:Appium自動化測試框架綜合實踐 - 代碼實現
    '''
    # 3.導入模塊
    from kyb_testProject.common.myunit import StartEnd
    from kyb_testProject.businessView.loginView import LoginView
    import unittest
    import logging
    
    class TestLogin(StartEnd):
        csv_file='../data/account.csv'
    
        @unittest.skip('test_login_zxw2018')
        def test_login_zxw2018(self):
            logging.info('======test_login_zxw2018=====')
            l=LoginView(self.driver)
            data=l.get_csv_data(self.csv_file,2)
    
            l.login_action(data[0],data[1])
            self.assertTrue(l.check_loginStatus())
    
        # @unittest.skip('skip test_login_zxw2017')
        def test_login_zxw2017(self):
            logging.info('======test_login_zxw2017=====')
            l=LoginView(self.driver)
            data = l.get_csv_data(self.csv_file, 1)
    
            l.login_action(data[0], data[1])
            self.assertTrue(l.check_loginStatus())
    
        @unittest.skip('test_login_error')
        def test_login_error(self):
            logging.info('======test_login_error=====')
            l = LoginView(self.driver)
            data = l.get_csv_data(self.csv_file, 3)
    
            l.login_action(data[0], data[1])
            self.assertTrue(l.check_loginStatus(),msg='login fail!')
    
    if __name__ == '__main__':
        unittest.main()

    7.小結

    到此,Appium自動化測試框架就差下一篇就全部完成了,聰明的你都懂了嗎???嘿嘿!慢慢地來吧。

    下節預告

    下一篇,講解執行測試用例,生成測試報告,以及自動化平台,請關注宏哥,敬請期待!!!

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

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

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

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

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

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

  • Thrift總結(四)Thrift實現雙向通信

    Thrift總結(四)Thrift實現雙向通信

    前面介紹過 Thrift 安裝和使用,介紹了Thrift服務的發布和客戶端調用,可以查看我之前的文章:

    但是,之前介紹的都是單向的客戶端發送消息,服務端接收消息。而客戶端卻得不到服務器的響應。

    那如果我們要實現雙向通信(即:客戶端發送請求,服務端處理返回,服務端發送消息,客戶端處理返回)的功能,該怎麼實現呢?

     

    其實在不涉及語言平台的制約,WebService或是webapi 就可以實現這種客戶端發起請求,服務端的處理的單向流程。

    然而,實際場景中,可能我們的某些業務需求,更需要服務端能夠響應請求並處理數據。下面我通過一個demo案例,介紹下Thrift 是如何實現雙向通信的。

     

    一、安裝Thrift

    這裏不再贅述,戳這裏查看我上篇文章的介紹:

     

    二、編寫Thrift IDL文件 

    編寫thrift腳本,命名為student.thrift  如下:

    service HelloWorldService{
        void SayHello(1:string msg);
    }

    生成service 的方法,之前的文章有介紹,這裏就不介紹了。

     

    三、編寫服務端代碼

    創建HelloThrift.Server 服務端工程,添加HelloWorldBidirectionServer類,HelloWorldBidirectionServer 實現了Iface接口用於接收客戶端消息,並有一個客戶端傳輸層對象集合用於記錄所有已連接的客戶端。

     public class HelloWorldBidirectionServer : HelloWorldBidirectionService.Iface
        {
            public void Run(int port)
            {
                try
                {
                    TServerTransport transport = new TServerSocket(port);
    
                    TTransportFactory transportFac = new TTransportFactory();
    
                    TProtocolFactory inputProtocolFactory = new TBinaryProtocol.Factory();
                    TThreadPoolServer server = new TThreadPoolServer(getProcessorFactory(), transport, transportFac, inputProtocolFactory);
    
                    server.Serve();
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
    
            public static List<TTransport> TransportCollection = new List<TTransport>();
    
            public void SayHello(string msg)
            {
                Console.WriteLine(string.Format("{0:yyyy/MM/dd hh:mm:ss} 服務端接收到消息: {1}", DateTime.Now, msg));
            }
    
            public void SayToClient(string msg)
            {
                try
                {
                    foreach (TTransport trans in TransportCollection)
                    {
                        TBinaryProtocol protocol = new TBinaryProtocol(trans);
                        HelloWorldBidirectionService.Client client = new HelloWorldBidirectionService.Client(protocol);
                        //Thread.Sleep(1000);
                        client.SayHello(msg);
                        //Console.WriteLine("發給了客戶端喲");
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
    
            public TProcessorFactory getProcessorFactory()
            {
                return new HelloWorldBidirectionProcessor();
            }
        }
    
        public class HelloWorldBidirectionProcessor : TProcessorFactory
        {
            public TProcessor GetProcessor(TTransport trans, TServer server = null)
            {
                if (trans.IsOpen)
                {
                    HelloWorldBidirectionServer.TransportCollection.Add(trans);
                    Console.WriteLine("客戶端連上。");
                }
    
                HelloWorldBidirectionServer srv = new HelloWorldBidirectionServer();
                return new global::HelloWorldBidirectionService.Processor(srv);
            }
        }

     

    四、編寫客戶端代碼

    首先創建HelloThrift.Client客戶端項目,添加接收服務端消息的類HelloWorldBidirectionClient,裏面只有一個實現Iface接口的方法:

      public class HelloWorldBidirectionClient
        {
            static HelloWorldBidirectionService.Client client = null;
            public void ConnectAndListern(int port, string ip = "127.0.0.1")
            {
                //Tsocket: TCP/IP Socket接口
                TSocket tSocket = new TSocket(ip, port);
                //消息結構協議
                TProtocol protocol = new TBinaryProtocol(tSocket);
                try
                {
                    if (client == null)
                    {
                        client = new global::HelloWorldBidirectionService.Client(protocol);
                        tSocket.Open();//建立連接
                        StartListern(tSocket);//啟動監聽線程
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
    
            public void Say(string msg)
            {
                if (client != null)
                    client.SayHello(msg);
            }
    
            void StartListern(TSocket tSocket)
            {
                Thread t = new Thread(new ParameterizedThreadStart(Run));
                t.Start(tSocket);
            }
    
            public void Run(object tSocket)
            {
                HelloWorldBidirectionService.Processor process = new HelloWorldBidirectionService.Processor(new HelloWorldBidirectionFace());
    
                try
                {
                    while (process.Process(new TBinaryProtocol((TSocket)tSocket), new TBinaryProtocol((TSocket)tSocket)))
                    {
                        Console.WriteLine("消息接收完成,等下一波,阻塞中......");
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine("連接斷開..." + ex.Message);
                }
            }
    
        }
        class HelloWorldBidirectionFace : HelloWorldBidirectionService.Iface
        {
            public void SayHello(string msg)
            {
                Console.WriteLine(string.Format("{0:yyyy/MM/dd hh:mm:ss} 收到服務端響應消息 {1}", DateTime.Now, msg));
    
            }
        }

     實現客戶端,ConnectAndListern方法可以與服務端建立連接,並開啟客戶端端口監聽來自服務端的信息。Say方法可將消息發送至服務端。

     

    五、測試

     測試效果如下:

     

     

     

    六、最後

      1. 關於使用Thrift 構建我們自己的rpc 的方法,這裏基本講完了。其他的方法本文就不再演示了,調用起來都是一樣。  

      2. 後續會簡單討論一下Thrift 框架的通信原理。

      3. 源代碼下載,

     

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

    台北網頁設計公司這麼多,該如何挑選?? 網頁設計報價省錢懶人包”嚨底家”

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

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

    小三通海運與一般國際貿易有何不同?

    小三通快遞通關作業有哪些?

  • 北極白鯨驚奇現身泰晤士河 再不回家專家憂安危

    摘錄自2018年9月26日中央社報導

    據英國各大媒體報導,一隻迷途的白鯨現身英國泰晤士河,第一次被目擊是25日在肯特郡(Kent)格雷夫森德(Gravesend)的泰晤士河段,當時白鯨正在駁船附近覓食,被暱稱為「班尼」(Benny),距離其原棲息地北極圈水域達數千公里。26日白鯨再次現身同個地點,引發是否迷航及可能遇險的擔憂。

    鯨豚保育協會(WDC)海洋哺乳類動物科學家羅特(Rob Lott)表示,這隻白鯨正受到監控,以防牠擱淺。「但白鯨停留在泰晤士河口的時間愈長,就愈令人擔心。」

    海洋生物保育慈善團體ORCA的保育學家巴比(Lucy Babey)表示:「這是白鯨出現在英國的最南端紀錄。」

    英國海洋生物救援組織表示,英國最後一次發現白鯨蹤跡是3年前在北英格蘭的諾森伯蘭(Northumberland)海岸,以及北愛爾蘭,但極為罕見。

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

    【其他文章推薦】

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

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

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

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

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

  • 中國新能源汽車零部件發展規劃成果集中亮相北京10月車展

    中國新能源汽車零部件發展規劃成果集中亮相北京10月車展

    2016年10月13—16日,以“選擇·行動——未來從現在開始”為主題的2016(第四屆)節能與新能源汽車產業發展規 劃成果展覽會、中國國際汽車新能源及技術應用展覽會將在北京國家會議中心舉辦。展會由中國國家工業和資訊化部支援,科學技術部、中國國際貿易促進委員會批准,是貫徹落實國務院《節能與 新能源汽車產業發展規劃(2012—2020年)》,推動中國節能與新能源汽車產業發展的重要舉措之一。本屆展會將全方面覆蓋節能環保汽車、純電動 汽車、混合動力汽車、插電式混合動力和燃料電池汽車,以及電池、電機、電控等關鍵零部件和充電設施等產品,眾多國際知名汽車企業、零部件和充電設施供應 商將攜旗下新品參展。

    汽車產業是國民經濟的重要支柱產業,也是實現新一輪技術革命和產業變革的重要載體。中國汽車產業快速發展,產銷增速連續七年居世界第一位,新能源汽車產業初具規模,15年中國已成為全球最大的新能源汽車生產以及銷售市場.

    但同時,據中國國家863“節能與新能源汽車”重大項目監理諮詢專家組王秉剛調研,中國目前具有生產傳統汽車ABS系統能力的工廠主要有亞太、元豐與伯特利等幾家,他們是未來最有希望成為中國自主電動汽車制動系統的生產企業,與國外同類企業相比,他們規模都不大,在同類產品的市場佔有率不足5%,在年產量達2000多萬輛的中國汽車產業裡,如此重要的底盤部件,自主企業生產的比例低到差不多可以忽略不計的程度。中國汽車產業空心化可見一斑!這裡舉的僅是制動系統的例子,其它零部件也存在類似情況,就連備受關注的動力電池也未必樂觀,已經有國外大電池企業,在部分地方政府優惠政策的支援下在國內建廠。

    中國新能源汽車零部件企業正加強關鍵核心技術研發,推進技術創新,竭盡全力避免傳統汽車產業存在的核心技術缺失、產業空心化現象,在新能源汽車行業重蹈覆轍。據車展合作單位盛大超越展覽公司嶽巍介紹,“新能源汽車零部件主要包括電機、驅動控制系統和電源系統,目前中國在新能源汽車零部件上的技術創新有序推進,整體研發水平不斷提升,中國企業的電機及驅動控制系統在新能源客車(如宇通、安凱、中通等)及乘用車(比亞迪、北汽、江淮等)上已得到廣泛應用,這些成果大部分將在北京10月新能源汽車展上展出,中國的電機及驅動控制系統參展企業包括:德沃仕、英威騰、中冶南方、超同步、合普動力、合康動力、福工動力、八達等。這些企業有的具有國外及科研院所的專業背景,有的是從電梯控制、機床控制發展而來。比如合普動力是低速電動車電機驅動控制的領軍企業,隨著高速新能源汽車市場的不斷成長,已開發了電動客車及乘用車電機驅動控制產品”。

    盛大超越展覽公司電池及BMS展區經理耿忱也對中國企業抱有積極信心,他說,”北京10月新能源汽車成果展上的中國電池企業非常給力,沃特瑪、寧德時代、中航鋰電、力神電池、比克電池、萬向、山東威能、神工光電、內蒙古稀奧科、實聯長宜等知名電池企業展示了車用動力電池技術及市場應用的發展成果,部分電池展商還帶來了實際應用整車配合展示”。他還表示,“環宇賽爾、科隆集團、均勝普瑞等一批新的中國電池及BMS展商將有望加盟2016北京10月新能源汽車成果展,給主機廠提供更加前沿和多元化的產品解決方案“。

    展會相關

    2016中國國際汽車新能源及技術應用展覽會
    節能與新能源汽車產業發展規劃成果展覽會
    行業地位:中國最大高速新能源汽車展
    展覽規模:30,000平方米(2015年)
    觀眾數量:60,000人次(2015年)
    展覽週期:每年一屆,2013年首屆
    連絡人:岳巍 先生
    手機:+86 135 5286 5285
    展會網址:
     

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

    【其他文章推薦】

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

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

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

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

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