月份: 2020 年 1 月

  • 中國AI獨角獸完成全球競賽三連冠偉業:孫劍帶隊,曠視再刷榜

    中國AI獨角獸完成全球競賽三連冠偉業:孫劍帶隊,曠視再刷榜

      邊策 郭一璞 發自 凹非寺
      量子位 報道 公眾號 QbitAI

      全球 AI 競賽再奪 3 項世界第一,實現 COCO 重頭戲“物體檢測”三連冠。

      新歷史、新紀錄,榮耀屬於中國公司,展示的統治力堪比乒乓球。

      這就是 AI 獨角獸曠視科技,剛剛從全球 AI 頂會 ICCV 2019 傳來的捷報。

      而且 IPO 上市當前,無疑是既有實力的繼續展示。

      全球 AI 競賽再奪 3 項第一

      ICCV,國際計算機視覺大會,英文全稱 International Conference on Computer Vision。

      被譽為計算機視覺領域三大頂級會議之一,與 CVPR 和 ECCV 並列。

      ICCV 兩年舉辦一次,今年 10 月 27 日在韓國首爾開幕。

      不過剛剛開幕,中國力量就捷報頻傳,繼續展現在全球 AI 研發領域的潛力和實力。

      特別是在本屆 ICCV 的 COCO 挑戰賽上,曠視再度問鼎,拿下 COCO 物體檢測(Detection)、人體關鍵點(Keypoint)和全景分割(Panoptic)3 項第一。

      繼 2017、2018 年後再度奪冠,更是在最重要的“物體檢測”完成三連冠偉業,自 2015 年 COCO 開賽以來,前無古人,創下新紀錄。

      此外,曠視還獲得今年新設立的 COCO+Mapillary 挑戰賽的最佳論文獎(Best Paper Award),原因是“最具創新性的算法”。

      COCO 是 ICCV 2019 的重頭戲,也是 AI 視覺領域最具影響力的通用物體檢測挑戰賽。

      今年的 COCO 挑戰賽與往年不同,加入了新的規則:

    首先、參加者必須提交一份技術報告,該報告將替代先前要求的簡短描述。只有與報告一起提交的材料才會被考慮參賽,並被放入 COCO 排行榜中。

    其次,今年的每個挑戰賽都將設立兩個不同的獎項:最佳結果獎和最具創新獎。最具創新獎根據根據參賽作品的創新而非最佳成績來評定,最終由 COCO 獎項委員會決定,獲獎團隊將受邀參加 Workshop。

    最後,今年的大會針對所有挑戰提供最具創新性和成功解決方案的最佳論文獎。獲獎者將由研討會組委會確定。

      物體檢測任務是讓算法輸出邊界框輸出或實例分割,自動駕駛、醫療影像識別中都會用到。另外在 2019 年的挑戰賽中,只有具有目標分割輸出的檢測任務會被重點介紹。

      COCO 全景分割任務目的是生成豐富而完整的連貫場景分割,這是自動駕駛或增強現實等實際應用的中一項重要技術。

      人體關鍵點檢測是在不提供人位置的情況下,定位並返回人體各部位關鍵點坐標位置。關鍵點定位了頭、肩、肘、手、臀、膝、腳等部位,可以用於人的行為識別,對於安防技術有重大意義。

      三連冠偉業

      今年的 MS COCO 總共 7 項比賽,除了曠視的 3 項冠軍,香港中文大學-商湯科技聯合實驗室和南洋理工大學團隊也在 Object Detection 比賽中拿到了不含額外數據集的第一名。

      可以說中國軍團延續傳統,繼續在全球 AI 競技中展現實力。

      而且 COCO 中最被看重的“物體檢測”比賽,孫劍和其帶隊的中國軍團,更是實現了垄斷級的統治力。

      物體檢測項目,從 2015 年第一屆就存在,此後一直延續了下來。

      在第一屆比賽中,孫劍帶隊的 MSRA 團隊斬獲冠軍,成員包括何愷明(現 FAIR)、任少卿(現 Momenta)、代季峰(現商湯)和張祥雨(現曠視),所用的算法,是何愷明和 RBG 大神第一次合作的 Faster R-CNN。

      不過 2016 年,冠軍被谷歌研究院的G-RMI 隊拿下,只是所用的算法依然是 Faster R-CNN。

      2015 年第一屆 MS COCO 大賽中除了物體檢測,還有個生成圖片說明(Captioning Challenge)項目,當時奪冠的谷歌團隊,與人類 baseline 相比依然差了一大截,這個比賽項目也沒能繼續下去。

      在 2016 年,物體檢測之外的比賽項目變成了人體關鍵點檢測,當時奪冠的團隊來自 CMU。

      而從 2017 年開始,COCO 的各項比賽,就真正進入了中國時間——甚至可以更具體說“曠視時間”。

      這家中國 AI 獨角獸在孫劍加盟擔當研究院院長后,如虎添翼,在 COCO 競賽中展現出的實力,就像中國乒乓球、女排在奧運會展現的一樣。

      2017 年,MS COCO 的 6 個比賽項目中,曠視拿下了邊界檢測(Detection: Bounding Box)、人體關鍵點檢測(Keypoints)和地點實例分割(Places Instance Segmentation)3 個項目的冠軍,以及檢測分割(Detection: Segmentation)的亞軍。

      而在 2018 年的 6 個項目中,曠視拿下了物體檢測(Detection)、全景分割(Panoptic)、人體關鍵點檢測(Keypoints)和 Mapillary Panoptic4 個項目的冠軍。

      另外的兩個項目 DensePose 和 Mapillary 街景檢測則分別由北京郵電大學自動化學院模式識別與測控技術實驗室(BUTP-PRIV)和滴滴獲得——這一整屆比賽的冠軍都被中國團隊包了。

      所以算下來,曠視已經在三年 MS COCO 的比賽上拿到了累計 10 個冠軍。

      最重頭的“物體檢測”,更是完成三連冠偉業,前無古人。

      更加值得一提的是,之前我們也揭秘過,曠視在 COCO 上的統治力,去往年開始就啟用大牛老將帶實習生參賽的機制,於是諸多名不見經傳的本科實習生,早早就成為了 AI 世界冠軍。

      而且刷榜奪冠,不僅是鍛煉隊伍,而且對曠視自研的 Brain++,也是一次次最佳說明。

      在今年 ICCV 奪冠后,曠視研究院院長孫劍再次感謝曠視算法工具平台 Brain++,稱一連串成績的取得,離不開背後強大的 Brain++。

      曠視介紹,一方面 Brain++ 具備多機訓練方案,支持完備的底層算法,確保算法的高效實現與快速驗證。

      比如,在 COCO Detection 任務中,曠視重新設計了 RPN 匹配策略和 Proposal 採樣策略,使用兩階段檢測器即可直接獲得很好的高 IoU 檢測結果,甚至超過了使用更多階段的 Cascade R-CNN,最終大幅領先,取得 test-challenge 52.5 的冠軍成績。

      另一方面 Brain++ 針對計算機視覺定製優化,適合工業界的產品開發,為競賽技術的應用轉化鋪平道路。

      還集成了新一代 AutoML 技術,降低算法試錯成本,實現技術創新和產品落地齊頭並進。Brain++從算法設計、算法框架和算法平台三個方面為 AI 競賽保駕護航。

      在剛剛舉行的烏鎮世界互聯網大會上,Brain++還為曠視斬獲了“世界互聯網領先科技成果”。

      於是也有更多注意力開始關注起這個基礎算法研發平台,曠視聯合創始人及 CTO 唐文斌還比喻說,如果說曠視各種各樣的算法是“雞蛋”,那 Brain++ 就是出產“所有雞蛋”的“母雞”。

      總之,Brain++可以視為曠視面向 AI 時代的生產工具,而再配以優秀的人才,連續在全球 AI 競技中奪魁,自然也不是意料之外。

      One more thing

      最後,新冠軍、新紀錄和三連冠偉業之外,今年 COCO 的冠軍對曠視而言還有更多意義。

      一方面,這家 AI 獨角獸已經向港交所提交了招股書,IPO 上市只是時間問題,也將成為 AI 創業上市第一股。

      另一方面,就在不久前,曠視也突發遭遇偷襲,被美國列入了“實體名單”,成為“川普優選”的又一家公司。

      因為衝刺上市當前,還引發了更多關注。

      但 Brain++ 獲國家認證,COCO 比賽三連冠,毫無疑問就是最好回應。

      還是那句話,如果美國拉黑了你,不要悲傷,不要氣餒。

      猝不及防的日子,最好的回擊就是業績和人心。

      並且 ICCV 2019 這才剛剛開幕,聽說曠視的三連冠,還不是中國 AI 新榮譽的全部。

      讓我們保持關注,繼續期待~

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

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

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

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

  • 滴滴每天處理超4875TB數據 基於AI的需求預估準確率達85%

    滴滴每天處理超4875TB數據 基於AI的需求預估準確率達85%

      作者:行者崟濤

      【TechWeb】在 2019 博世智能出行大會上,滴滴旗下小桔車服車聯網業務負責人黃智信表示,滴滴大概每天處理超過 106TB 的軌跡數據,4875TB 的綜合數據,通過 AI 和大數據技術,可以進行叫車供給需求 15 分鐘后的預測,目前準確率達到 85%,派單導航 ETA 誤差率小於 15%,此外還有很多的安全功能等等。

      過去都是通過手機把車和人連接起來,目前滴滴也在做一些探索,如何更好的結合車輛相關數據,實現智能充電、智能維保和派單系統的結合,以更好地提高車輛運營效率和司機體驗。

      黃智信也提出,滴滴也希望可以跟更多產業鏈上下游合作夥伴一起,在數據、技術、產品等方面實現更加開放、深度的合作,為司機和乘客提供更為安全、便捷、舒適的體驗,更好的鼓勵安全、良好的駕駛行為。

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

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

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

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

  • 小白學 Python 爬蟲(4):前置準備(三)Docker基礎入門

    小白學 Python 爬蟲(4):前置準備(三)Docker基礎入門

    人生苦短,我用 Python

    前文傳送門:

    Docker 基礎

    首先說一件事情,就在本文寫作前一天,Mirantis 這家公司宣布收購了 Docker 的企業業務和團隊。並且在官網上也掛出了相關的文字。

    沒別的意思,相關的新聞通告一下。

    Docker 官網地址:

    什麼是 Docker ?

    emmmmm,說實話,Docker 是什麼並不好說,下面通過四點大致解釋下 Docker 到底是個什麼東西。

    1. Docker 是全球領先的軟件容器平台。
    2. Docker使用Google公司推出的Go語言進行開發實現,基於Linux內核的cgroup,namespace,以及AUFS類的UnionFS等技術,對進程進行封裝隔離,屬於操作系統層面的虛擬化技術。
    3. 由於隔離的進程獨立於宿主和其它的隔離的進程,因此也稱其為容器。Docke最初實現是基於LXC。
    4. 用戶可以方便地創建和使用容器,把自己的應用放入容器。

    Docker 容器的特點:

    1. 輕量化:在一台機器上運行的多個Docker容器可以共享這台機器的操作系統內核;它們能夠迅速啟動,只需佔用很少的計算和內存資源。鏡像是通過文件系統層進行構造的,並共享一些公共文件。這樣就能盡量降低磁盤用量,並能更快地下載鏡像。
    2. 標準化:Docker容器基於開放式標準,能夠在所有主流Linux版本、Microsoft Windows以及包括VM、裸機服務器和雲在內的任何基礎設施上運行。
    3. 安全:Docker賦予應用的隔離性不僅限於彼此隔離,還獨立於底層的基礎設施。Docker默認提供最強的隔離,因此應用出現問題,也只是單個容器的問題,而不會波及到整台機器。

    為什麼要用Docker:

    • Docker的鏡像提供了除內核外完整的運行時環境,確保了應用運行環境一致性,從而不會再出現“這段代碼在我機器上沒問題啊”這類問題;——一致的運行環境
    • 可以做到秒級、甚至毫秒級的啟動時間。大大的節約了開發、測試、部署的時間。——更快速的啟動時間
    • 避免公用的服務器,資源會容易受到其他用戶的影響。——隔離性
    • 善於處理集中爆發的服務器使用壓力;——彈性伸縮,快速擴展
    • 可以很輕易的將在一個平台上運行的應用,遷移到另一個平台上,而不用擔心運行環境的變化導致應用無法正常運行的情況。——遷移方便
    • 使用Docker可以通過定製應用鏡像來實現持續集成、持續交付、部署。——持續交付和部署

    說起容器,與虛擬機的比較是一個永恆的話題,因為它做的事情和虛擬機做的事情非常的接近。

    傳統虛擬機技術是虛擬出一套硬件后,在其上運行一個完整操作系統,在該系統上再運行所需應用進程;而容器內的應用進程直接運行於宿主的內核,容器內沒有自己的內核,而且也沒有進行硬件虛擬。因此容器要比傳統虛擬機更為輕便。

    Docker 安裝

    Win10 下的安裝

    首先介紹一下 win 環境下 Docker 的安裝,打開官網,下載最新版的 Docker Desktop 。

    Docker 官方下載地址:

    下載前可能需要先註冊下 Docker Hub ,註冊完成後會直接跳轉下載頁面。

    下載完成后默認配置 next 就好了。

    驗證:

    在 CMD 命令行中執行:

    docker info

    請確保 Docker 正常啟動狀態,否則會報錯的。

    小編本地電腦執行后显示如下:

    Client:
     Debug Mode: false
    
    Server:
     Containers: 26
      Running: 0
      Paused: 0
      Stopped: 26
     Images: 28
     Server Version: 19.03.1
     ...

    內容有些多,我就不全貼出來了,主要會显示一些當前 Docker 相關的信息。

    CentOS 下的安裝

    懶人神器,使用 CentOS 下的包管理工具 yum 進行安裝,直接輸入:

    yum install docker

    然後靜靜等待進度條走完,驗證命令和上面一致,同樣需確保 Docker 服務正常啟動。

    CentOS 中 Docker 基本操作命令:

    # docker 啟動
    systemctl start docker
    # 重啟 docker服務
    systemctl restart docker
    # 關閉 docker 服務
    systemctl stop docker

    驗證結果:

    Docker 基礎

    首先了解兩個概念:

    鏡像:Docker 鏡像是用於創建 Docker 容器的模板。

    容器:容器是獨立運行的一個或一組應用。

    講人話就是鏡像可以是我們自己的程序,也可以是第三方廠商提供的組件,比如數據庫,緩存服務等等,而這個鏡像想要運行的話,就要放在容器裏面運行,它自己是不能單獨運行的,就好比炒菜,光有菜不行,還要有鍋,菜是在鍋里炒出來的。

    因為 Docker 默認的鏡像源是在遙遠的太平洋彼岸,訪問速度會有些慢,建議各位同學配置一個國內的鏡像源。

    國內的鏡像源有很多的,百度一下可以找到很多,小編這裏使用的阿里雲提供的容器鏡像加速服務,大家可以登錄自己的淘寶賬號,在阿里雲上找到容器鏡像服務:

    具體的配置方案阿里雲已經提供出來了,小編這裏不再贅述,大家自己登錄阿里雲查看吧。

    上面這些都配置完成后,我們來講幾個最基礎的 Docker 命令:

    獲取鏡像

    語法:docker pull NAME[:TAG]
    其中,NAME是鏡像倉庫的名稱(用來區分鏡像),TAG是鏡像的標籤(用來表示版本信息)

    查看鏡像

    語法:docker images

    可以看到,小編的機器上目前有一個 mysql5.7 鏡像。

    搜索鏡像

    語法:docker search [image-name]
    從docker倉庫搜索docker鏡像

    刪除鏡像

    語法:docker rmi NAME
    用來刪除指定鏡像,其中後面的參數可以是tag,如果是tag時,實際上是刪除該tag,只要該鏡像還有其他tag,就不會刪除該鏡像。當後面的參數為鏡像ID時,則會徹底刪除整個鏡像,連通所有標籤一同刪除

    實戰 hello-world

    首先輸入 docker pull hello-world 來拉取 hello-world 鏡像:

    拉取成功后,我們使用 docker images 來查看下這個 hello-world 鏡像 :

    好了,我們已經看到這個 hello-world 鏡像了,現在來嘗試一下啟動,使用命令 docker run hello-world

    若是出現了上圖的內容則說明hello-world運行成功,如果沒出現的話,emmmmmmmmmm,你們可能就要想想自己之前的操作了。

    本篇文章到這裏就結束了,希望各位同學能自己動手實踐一下,畢竟實踐出真知嘛。

    參考

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

    ※帶您來了解什麼是 USB CONNECTOR  ?

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

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

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

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

  • JVM 問題排查和性能優化常用的 JDK 工具

    JVM 問題排查和性能優化常用的 JDK 工具

    JDK 提供了一系列用於監控、診斷 Java 進程的工具,它們在 JDK 安裝目錄的 bin 目錄下,有 jps、jcmd、jstack、jinfo、jmap 等。其中jmc、jconsole、jvisualvm 是 GUI 工具,其他大部分都是命令行工具。

    cd $JAVA_HOME/bin
    ls

    本篇只是個入門介紹,不涉及深入分析。每一個工具都有它專門的作用,掌握使用方法只是很簡單的入門階段,更重要的是根據工具得到的信息去分析系統存在的問題以及性能瓶頸,每一個工具的使用和分析都可以單獨成文。

    jps

    如果你用過 Linux,那肯定熟悉 ps 命令,用來查看進程列表的。jps 就好比是 ps 命令的子集,它查詢的是當前用戶下已經啟動的 Java 進程。這是進行線上問題排查的大門鑰匙,有了它才能下手後面的動作。

    下面是 jps 的幫助文檔

    usage: jps [-help]
           jps [-q] [-mlvV] [<hostid>]
    
    Definitions:
        <hostid>:      <hostname>[:<port>]

    一般的用法是 jps -l,前面一列显示 pid,後面一列显示進程名稱。

    還可以用下列參數查看更具體的 Java 進程信息,用法為 jps -lv

    jstack

    查看 Java 進程內當前時刻的線程快照,也就是每條線程正在執行的方法棧情況,用於定位線程停頓、死鎖等長時間等待的問題。

    以下是 jstack 的幫助文檔。

    Usage:
        jstack [-l] <pid>
            (to connect to running process)
        jstack -F [-m] [-l] <pid>
            (to connect to a hung process)
        jstack [-m] [-l] <executable> <core>
            (to connect to a core file)
        jstack [-m] [-l] [server_id@]<remote server IP or hostname>
            (to connect to a remote debug server)
    
    Options:
        -F  to force a thread dump. Use when jstack <pid> does not respond (process is hung)
        -m  to print both java and native frames (mixed mode)
        -l  long listing. Prints additional information about locks
        -h or -help to print this help message
    

    最常用的就是 jstack -pid 或者 jstack -l pid,打印線程狀態、棧使用情況。

    如果是線上查看不方便的話,可以用命令 jstack -l pid > stack.log,輸出到文件中下載到本地查看。

    jstack -m pid,打印 Java 和 Native 棧信息

    如果 -l 和 -m 都不起作用的時候,可以使用 java -F pid 強制 dump。

    jinfo

    它的主要作用是查看 JVM 配置參數,還可以動態設置部分參數值。jinfo 使用時需要 attach 到目標 JVM 上。關於 attach jvm 可以點擊查看

    使用 jinfo -h查看幫助文檔

    Usage:
        jinfo [option] <pid>
            (to connect to running process)
        jinfo [option] <executable <core>
            (to connect to a core file)
        jinfo [option] [server_id@]<remote server IP or hostname>
            (to connect to remote debug server)
    
    where <option> is one of:
        -flag <name>         to print the value of the named VM flag
        -flag [+|-]<name>    to enable or disable the named VM flag
        -flag <name>=<value> to set the named VM flag to the given value
        -flags               to print VM flags
        -sysprops            to print Java system properties
        <no option>          to print both of the above
        -h | -help           to print this help message

    jinfo -flags pid

    查看 JVM 參數,其中 Non-default VM flags 是虛擬機默認設置的參數,Command line 是用戶指定的參數,比如命令行啟動 jar 包的時候加上的參數。

    jinfo -flag 參數名 pid

    可以查看指定參數的值,比如查看堆的最大值(-XX:MaxHeapSize 也就是 -Xmx ):

    jinfo -flag MaxHeapSize 92041
    
    -XX:MaxHeapSize=20971520

    jinfo -sysprops pid

    查看系統參數

    jinfo pid

    查看 jvm 參數和系統參數

    以上信息,如果我們用過 visualVM 等監控工具,一定非常熟悉。另外,我之前做過一個 ,也實現了這個功能。

    另外,還可以修改部分參數值。

    jinfo -flag [+|-] pid

    jinfo -flag = pid

    可以修改部分 JVM 參數。

    前者可以修改布爾值參數,比如開啟簡單 GC 日誌

    jinfo -flag +PrintGC 92041

    後者是設置非布爾值參數的,比如設置 HeapDumpPath

    jinfo -flag HeapDumpPath=/users/fengzheng/jvmlog

    哪些參數是允許動態修改的呢,用下面這個命令可以查看

    #Linux 和 Mac 
    java -XX:+PrintFlagsInitial | grep manageable
    
    #windows
    java -XX:+PrintFlagsInitial | findstr manageable

    jmap

    jmap 查看給定進程、核心文件、遠程調試服務器的共享對象內存映射和堆內存細節的工具,可查看堆使用情況、堆內對象直方圖、加載類、生成堆快照等。

    Usage:
        jmap [option] <pid>
            (to connect to running process)
        jmap [option] <executable <core>
            (to connect to a core file)
        jmap [option] [server_id@]<remote server IP or hostname>
            (to connect to remote debug server)
    
    where <option> is one of:
        <none>               to print same info as Solaris pmap
        -heap                to print java heap summary
        -histo[:live]        to print histogram of java object heap; if the "live"
                             suboption is specified, only count live objects
        -clstats             to print class loader statistics
        -finalizerinfo       to print information on objects awaiting finalization
        -dump:<dump-options> to dump java heap in hprof binary format
                             dump-options:
                               live         dump only live objects; if not specified,
                                            all objects in the heap are dumped.
                               format=b     binary format
                               file=<file>  dump heap to <file>
                             Example: jmap -dump:live,format=b,file=heap.bin <pid>
        -F                   force. Use with -dump:<dump-options> <pid> or -histo
                             to force a heap dump or histogram when <pid> does not
                             respond. The "live" suboption is not supported
                             in this mode.
        -h | -help           to print this help message
        -J<flag>             to pass <flag> directly to the runtime system

    jmap -heap pid

    打印 JVM 堆概要信息,包括堆配置、新生代、老生代信息

    jmap -histo pid

    打印類的直方圖,也就是各個類實例的個數和空間佔用情況。

    如果加 :live,jamp -histo:live pid 則只打印活動類的信息。這個命令會出發 GC 動作,會導致 JVM 停頓,所以在線上環境要慎用。

    jmap -dump

    dump 當前 JVM 堆,一般用法如下:

    #dump 所有對象在堆中的分佈情況
    jmap -dump:format=b,file=/Users/fengzheng/jvmlog/jamp_dump.hprof 95463
    
    #加:live 參數 dump 存活對象在隊中的分佈情況
    jmap -dump:live,format=b,file=/Users/fengzheng/jvmlog/jamp_dump.hprof 95463

    之後再用堆分析工具,比如 visualVM、JProfile、MAT 等進行分析。和我們設置

    -XX:+HeapDumpOnOutOfMemoryError 參數后,在發生 OOM 的時候 dump 的堆信息是一樣的。

    注意,dump 的過程會比較慢,在這個過程中會發生 JVM 停頓,而且在使用 :live 參數后,會觸發 GC 操作。

    jmap -clstats pid

    Java 類加載器(ClassLoader)信息,包括加載器名稱、已加載類個數、佔用空間、父加載器、是否存活、類型信息。

    jmap -finalizerinfo pid

    查看等待被回收的對象。

    jstat

    jstat 主要用來通過垃圾回收相關信息來判斷 JVM 性能問題,也可以查看類加載、編譯的情況,主要的用法是通過持續的固定時間間隔的輸出來觀察。比如每 3 秒打印一次 GC 回收次數,連續打印 10 次,通過動態的變化來觀察 GC 是否過於密集。

    下面是 jstat 的幫助手冊。

    Usage: jstat -help|-options
           jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
    
    Definitions:
      <option>      An option reported by the -options option
      <vmid>        Virtual Machine Identifier. A vmid takes the following form:
                         <lvmid>[@<hostname>[:<port>]]
                    Where <lvmid> is the local vm identifier for the target
                    Java virtual machine, typically a process id; <hostname> is
                    the name of the host running the target Java virtual machine;
                    and <port> is the port number for the rmiregistry on the
                    target host. See the jvmstat documentation for a more complete
                    description of the Virtual Machine Identifier.
      <lines>       Number of samples between header lines.
      <interval>    Sampling interval. The following forms are allowed:
                        <n>["ms"|"s"]
                    Where <n> is an integer and the suffix specifies the units as 
                    milliseconds("ms") or seconds("s"). The default units are "ms".
      <count>       Number of samples to take before terminating.
      -J<flag>      Pass <flag> directly to the runtime system.

    通過 jstat -options 可以看到 jstat 支持查看哪些信息。

    $ jstat -options
    -class  #類加載情況 加載個數和空間使用
    -compiler #即時編譯器信息
    -gc  # GC情況 包括 young gc、full gc 次數、時間等
    -gccapacity #年輕代、老年代的使用情況
    -gccause #GC 統計信息和回收原因
    -gcmetacapacity #显示有關metaspace大小的統計信息
    -gcnew #新生代 GC 統計
    -gcnewcapacity #新生代內存統計
    -gcold #老年代 GC 統計
    -gcoldcapacity #老年代內存使用情況
    -gcutil #GC 匯總信息
    -printcompilation #編譯方法統計

    上述這些大多數可以對應到 visualVM 的這一部分显示

    示例用法,如下是打印 5301 進程下的垃圾回收情況,-h 3 表示每 3 行輸出一次標題信息,3s 5 表示每 3s 輸出一次,一共輸出 5 次

    jstat -gcutil -h 3 5301 3s 5

    最後輸出的內容如下:

    jstat -gcutil -h 3 5301 3s 5
      S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT   
     99.92   0.00  11.90  35.29  94.96  94.08     34   12.675     3    1.946   14.621
     99.92   0.00  11.90  35.29  94.96  94.08     34   12.675     3    1.946   14.621
     99.92   0.00  11.90  35.29  94.96  94.08     34   12.675     3    1.946   14.621
      S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT   
     99.92   0.00  11.94  35.29  94.96  94.08     34   12.675     3    1.946   14.621
     99.92   0.00  11.94  35.29  94.96  94.08     34   12.675     3    1.946   14.621

    jcmd

    jcmd 會將命令發送給 JVM。這些命令包括用於控制 Java Flight Recording(飛行記錄)、診斷命令等。 必須運行在 JVM 本地,不能遠程使用,並且必須用 JVM 啟動用戶執行。

    通過 jps 命令找到一個 JVM 進程,然後使用下面的代碼可以看到 jcmd 支持的命令

    #進程 5173 
    jcmd 5173 help 
    
    5173:
    The following commands are available:
    JFR.stop
    JFR.start
    JFR.dump
    JFR.check
    VM.native_memory
    VM.check_commercial_features
    VM.unlock_commercial_features
    ManagementAgent.stop
    ManagementAgent.start_local
    ManagementAgent.start
    GC.rotate_log
    Thread.print
    GC.class_stats
    GC.class_histogram
    GC.heap_dump
    GC.run_finalization
    GC.run
    VM.uptime
    VM.flags
    VM.system_properties
    VM.command_line
    VM.version
    help

    基本包含了問題排查的常用命令,並且和上面介紹的幾個工具有部分重合。

    通過命令 jcmd 5173 help GC.heap_dump 可以查詢到 GC.heap_dump 命令的使用方法,其他命令都可以通過這個方法找到使用說明

    jcmd 5173 help GC.heap_dump
    5173:
    GC.heap_dump
    Generate a HPROF format dump of the Java heap.
    
    Impact: High: Depends on Java heap size and content. Request a full GC unless the '-all' option is specified.
    
    Permission: java.lang.management.ManagementPermission(monitor)
    
    Syntax : GC.heap_dump [options] <filename>
    
    Arguments:
        filename :  Name of the dump file (STRING, no default value)
    
    Options: (options must be specified using the <key> or <key>=<value> syntax)
        -all : [optional] Dump all objects, including unreachable objects (BOOLEAN, false)

    然後通過如下代碼就可以 dump 堆信息下來了,和 jmap -dump 的作用一樣

    jcmd 5173 GC.heap_dump /Users/fengzheng/jvmlog/jcmd_heap_dump.hprof

    拋磚引玉就到此了,之後會對 jinfo、jmap、jstack、jstat、jcmd 做詳細說明,記得關注啊。

    相關閱讀:

    歡迎關注,不定期更新本系列和其他文章
    古時的風箏 ,進入公眾號可以加入交流群

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

    ※為什麼 USB CONNECTOR 是電子產業重要的元件?

    網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

    ※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

    ※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

  • Python 命令行之旅:深入 click 之子命令篇

    Python 命令行之旅:深入 click 之子命令篇

    作者:HelloGitHub-Prodesire

    HelloGitHub 的《講解開源項目》系列,項目地址:https://github.com/HelloGitHub-Team/Article

    一、前言

    在上兩篇文章中,我們介紹了 click 中的”參數“和“選項”,本文將繼續深入了解 click,着重講解它的“命令”和”組“。

    本系列文章默認使用 Python 3 作為解釋器進行講解。
    若你仍在使用 Python 2,請注意兩者之間語法和庫的使用差異哦~

    二、命令和組

    Click 中非常重要的特性就是任意嵌套命令行工具的概念,通過 和 (實際上是 )來實現。

    所謂命令組就是若干個命令(或叫子命令)的集合,也成為多命令。

    2.1 回調調用

    對於一個普通的命令來說,回調發生在命令被執行的時候。如果這個程序的實現中只有命令,那麼回調總是會被觸發,就像我們在上一篇文章中舉出的所有示例一樣。不過像 --help 這類選項則會阻止進入回調。

    對於組和多個子命令來說,情況略有不同。回調通常發生在子命令被執行的時候:

    @click.group()
    @click.option('--debug/--no-debug', default=False)
    def cli(debug):
        click.echo('Debug mode is %s' % ('on' if debug else 'off'))
    
    @cli.command()  # @cli, not @click!
    def sync():
        click.echo('Syncing')

    執行效果如下:

    Usage: tool.py [OPTIONS] COMMAND [ARGS]...
    
    Options:
      --debug / --no-debug
      --help                Show this message and exit.
    
    Commands:
      sync
    
    $ tool.py --debug sync
    Debug mode is on
    Syncing

    在上面的示例中,我們將函數 cli 定義為一個組,把函數 sync 定義為這個組內的子命令。當我們調用 tool.py --debug sync 命令時,會依次觸發 clisync 的處理邏輯(也就是命令的回調)。

    2.2 嵌套處理和上下文

    從上面的例子可以看到,命令組 cli 接收的參數和子命令 sync 彼此獨立。但是有時我們希望在子命令中能獲取到命令組的參數,這就可以用 來實現。

    每當命令被調用時,click 會創建新的上下文,並鏈接到父上下文。通常,我們是看不到上下文信息的。但我們可以通過 裝飾器來顯式讓 click 傳遞上下文,此變量會作為第一個參數進行傳遞。

    @click.group()
    @click.option('--debug/--no-debug', default=False)
    @click.pass_context
    def cli(ctx, debug):
        # 確保 ctx.obj 存在並且是個 dict。 (以防 `cli()` 指定 obj 為其他類型
        ctx.ensure_object(dict)
    
        ctx.obj['DEBUG'] = debug
    
    @cli.command()
    @click.pass_context
    def sync(ctx):
        click.echo('Debug is %s' % (ctx.obj['DEBUG'] and 'on' or 'off'))
    
    if __name__ == '__main__':
        cli(obj={})

    在上面的示例中:

    • 通過為命令組 cli 和子命令 sync 指定裝飾器 click.pass_context,兩個函數的第一個參數都是 ctx 上下文
    • 在命令組 cli 中,給上下文的 obj 變量(字典)賦值
    • 在子命令 sync 中通過 ctx.obj['DEBUG'] 獲得上一步的參數
    • 通過這種方式完成了從命令組到子命令的參數傳遞

    2.3 不使用命令來調用命令組

    默認情況下,調用子命令的時候才會調用命令組。而有時你可能想直接調用命令組,通過指定 click.groupinvoke_without_command=True 來實現:

    @click.group(invoke_without_command=True)
    @click.pass_context
    def cli(ctx):
        if ctx.invoked_subcommand is None:
            click.echo('I was invoked without subcommand')
        else:
            click.echo('I am about to invoke %s' % ctx.invoked_subcommand)
    
    @cli.command()
    def sync():
        click.echo('The subcommand')

    調用命令有:

    $ tool
    I was invoked without subcommand
    $ tool sync
    I am about to invoke sync
    The subcommand

    在上面的示例中,通過 ctx.invoked_subcommand 來判斷是否由子命令觸發,針對兩種情況打印日誌。

    2.4 自定義命令組/多命令

    除了使用 來定義命令組外,你還可以自定義命令組(也就是多命令),這樣你就可以延遲加載子命令,這會很有用。

    自定義多命令需要實現 list_commandsget_command 方法:

    import click
    import os
    
    plugin_folder = os.path.join(os.path.dirname(__file__), 'commands')
    
    class MyCLI(click.MultiCommand):
    
        def list_commands(self, ctx):
            rv = []  # 命令名稱列表
            for filename in os.listdir(plugin_folder):
                if filename.endswith('.py'):
                    rv.append(filename[:-3])
            rv.sort()
            return rv
    
        def get_command(self, ctx, name):
            ns = {}
            fn = os.path.join(plugin_folder, name + '.py')  # 命令對應的 Python 文件
            with open(fn) as f:
                code = compile(f.read(), fn, 'exec')
                eval(code, ns, ns)
            return ns['cli']
    
    cli = MyCLI(help='This tool\'s subcommands are loaded from a '
                'plugin folder dynamically.')
    
    # 等價方式是通過 click.command 裝飾器,指定 cls=MyCLI
    # @click.command(cls=MyCLI)
    # def cli():
    #     pass
    
    if __name__ == '__main__':
        cli()

    2.5 合併命令組/多命令

    當有多個命令組,每個命令組中有一些命令,你想把所有的命令合併在一個集合中時,click.CommandCollection 就派上了用場:

    
    @click.group()
    def cli1():
        pass
    
    @cli1.command()
    def cmd1():
        """Command on cli1"""
    
    @click.group()
    def cli2():
        pass
    
    @cli2.command()
    def cmd2():
        """Command on cli2"""
    
    cli = click.CommandCollection(sources=[cli1, cli2])
    
    if __name__ == '__main__':
        cli()

    調用命令有:

    $ cli --help
    Usage: cli [OPTIONS] COMMAND [ARGS]...
    
    Options:
      --help  Show this message and exit.
    
    Commands:
      cmd1  Command on cli1
      cmd2  Command on cli2

    從上面的示例可以看出,cmd1cmd2 分別屬於 cli1cli2,通過 click.CommandCollection 可以將這些子命令合併在一起,將其能力提供個同一個命令程序。

    Tips:如果多個命令組中定義了同樣的子命令,那麼取第一個命令組中的子命令。

    2.6 鏈式命令組/多命令

    有時單級子命令可能滿足不了你的需求,你甚至希望能有多級子命令。典型地,setuptools 包中就支持多級/鏈式子命令: setup.py sdist bdist_wheel upload。在 click 3.0 之後,實現鏈式命令組變得非常簡單,只需在 click.group 中指定 chain=True

    @click.group(chain=True)
    def cli():
        pass
    
    
    @cli.command('sdist')
    def sdist():
        click.echo('sdist called')
    
    
    @cli.command('bdist_wheel')
    def bdist_wheel():
        click.echo('bdist_wheel called')

    調用命令則有:

    $ setup.py sdist bdist_wheel
    sdist called
    bdist_wheel called

    2.7 命令組/多命令管道

    鏈式命令組中一個常見的場景就是實現管道,這樣在上一個命令處理好后,可將結果傳給下一個命令處理。

    實現命令組管道的要點是讓每個命令返回一個處理函數,然後編寫一個總的管道調度函數(並由 MultiCommand.resultcallback() 裝飾):

    @click.group(chain=True, invoke_without_command=True)
    @click.option('-i', '--input', type=click.File('r'))
    def cli(input):
        pass
    
    @cli.resultcallback()
    def process_pipeline(processors, input):
        iterator = (x.rstrip('\r\n') for x in input)
        for processor in processors:
            iterator = processor(iterator)
        for item in iterator:
            click.echo(item)
    
    @cli.command('uppercase')
    def make_uppercase():
        def processor(iterator):
            for line in iterator:
                yield line.upper()
        return processor
    
    @cli.command('lowercase')
    def make_lowercase():
        def processor(iterator):
            for line in iterator:
                yield line.lower()
        return processor
    
    @cli.command('strip')
    def make_strip():
        def processor(iterator):
            for line in iterator:
                yield line.strip()
        return processor

    在上面的示例中:

    • cli 定義為了鏈式命令組,並且指定 invoke_without_command=True,也就意味着可以不傳子命令來觸發命令組
    • 定義了三個命令處理函數,分別對應 uppercaselowercasestrip 命令
    • 在管道調度函數 process_pipeline 中,將輸入 input 變成生成器,然後調用處理函數(實際輸入幾個命令,就有幾個處理函數)進行處理

    2.8 覆蓋默認值

    默認情況下,參數的默認值是從通過裝飾器參數 default 定義。我們還可以通過 Context.default_map 上下文字典來覆蓋默認值:

    @click.group()
    def cli():
        pass
    
    @cli.command()
    @click.option('--port', default=8000)
    def runserver(port):
        click.echo('Serving on http://127.0.0.1:%d/' % port)
    
    if __name__ == '__main__':
        cli(default_map={
            'runserver': {
                'port': 5000
            }
        })

    在上面的示例中,通過在 cli 中指定 default_map 變可覆蓋命令(一級鍵)的選項(二級鍵)默認值(二級鍵的值)。

    我們還可以在 click.group 中指定 context_settings 來達到同樣的目的:

    
    CONTEXT_SETTINGS = dict(
        default_map={'runserver': {'port': 5000}}
    )
    
    @click.group(context_settings=CONTEXT_SETTINGS)
    def cli():
        pass
    
    @cli.command()
    @click.option('--port', default=8000)
    def runserver(port):
        click.echo('Serving on http://127.0.0.1:%d/' % port)
    
    if __name__ == '__main__':
        cli()

    調用命令則有:

    $ cli runserver
    Serving on http://127.0.0.1:5000/

    三、總結

    本文首先介紹了命令的回調調用、上下文,再進一步介紹命令組的自定義、合併、鏈接、管道等功能,了解到了 click 的強大。而命令組中更加高階的能力()則可看官方文檔進一步了解。

    我們通過介紹 click 的參數、選項和命令已經能夠完全實現命令行程序的所有功能。而 click 還為我們提供了許多錦上添花的功能,比如實用工具、參數自動補全等,我們將在下節詳細介紹。

    『講解開源項目系列』——讓對開源項目感興趣的人不再畏懼、讓開源項目的發起者不再孤單。跟着我們的文章,你會發現編程的樂趣、使用和發現參与開源項目如此簡單。歡迎留言聯繫我們、加入我們,讓更多人愛上開源、貢獻開源~

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

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

    網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

    ※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

  • 天啦!竟然從來沒有人講過 SpringBoot 支持配置如此平滑的遷移

    天啦!竟然從來沒有人講過 SpringBoot 支持配置如此平滑的遷移

    SpringBoot 是原生支持配置遷移的,但是官方文檔沒有看到這方面描述,在源碼中才看到此模塊,spring-boot-properties-migrator,幸虧我沒有跳過。看到這篇文章的各位,可算是撿到寶了,相信你繼續往下看下去,定會忍不住點贊、收藏、關注。

    效果

    先放個效果吸引你 🙂

    從 SpringBoot 2.0.0 版本開始,配置服務上下文,不支持 server.context-path,而需要server.servlet.context-path配置。但是只要加上以下一個官方依賴,就可以支持使用 server.context-path

        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-properties-migrator</artifactId>
        </dependency>

    server.context-path 所對應的屬性 ServerProperties#contextPath 在 Java 代碼中已不存在,server.servlet.context-path 所對應的的屬性在內部類 Servlet 中才有,為何加了此依賴就能實現如此神奇的效果呢。

    原理

    SpringBoot 對外部化配置原生支持遷移功能,所謂遷移,具體是指對應配置的屬性名變動,仍可以使用原來的屬性名配置。
    spring-configuration-metadata.json 的信息可以輔助 IDE 進行配置的提示,也可以用來完成配置的遷移。非常的簡單。

    相關文章:

    通過閱讀代碼,獲得以下信息:

    1. 監聽 ApplicationPreparedEvent 事件(即:環境已準備事件),執行以下操作並收集信息
    2. classpath*:/META-INF/spring-configuration-metadata.json 中載入所有配置
    3. 從上下文的 environment 中過濾出提示的配置(滿足條件:1. deprecation 不為 null,且提示 level 為 error)
    4. 判斷是否兼容(兼容條件見下一節),提取出兼容的屬性
    5. 將 value 對應到 replacement 的 key,並將其屬性源命名為:migrate-原名
    6. 將配置遷移的新屬性源添加到 environment 中,且添加到原屬性源之前(優先級高)。
    7. 監聽事件:ApplicationReadyEvent(應用上下文已準備) 或 ApplicationFailedEvent(應用啟動失敗),打印以上步驟收集的遺留配置信息。以 warn 級別打印兼容的配置,以 error 級別打印不兼容的配置

    配置兼容條件

    根據元數據中定義的 type 判斷

    1. 如果舊類型、新類型其中之一為 null(元數據中未指定),則不兼容
    2. 如果兩個類型一樣,兼容
    3. 如果新類型是 Duration,而舊類型是 Long 或 Integer,則兼容
    4. 其他情況視為不兼容
    5. environment 中取配置信息,理論上支持 SpringBoot 所有的配置方式

    效果

    兼容效果:
    棄用屬性(如果還存在)與替換后的屬性都會使用配置文件中的棄用的屬性名所對應的的值。

    總結

    使用配置遷移功能,需要以下步驟:

    1. 引入依賴:spring-boot-properties-migrator(支持配置遷移)、spring-boot-configuration-processor(生成元數據文件,如果已經有完整的,不需要此依賴)
    2. 元數據文件spring-configuration-metadata.json 中棄用屬性名對應的 properties 中必須有 deprecation(在additional-spring-configuration-metadata.json 中添加,相關文章: )
    3. deprecation 中需指定 levelerror
    4. deprecation 中需指定 replacement
    5. replacement 對應的屬性配置在元數據文件中存在,與棄用屬性兼容

    經典示例之配置上下文

    再說回一開始展示的配置上下文示例。

    # 配置 servlet 服務上下文
    server:
      context-path: test

    從 SpringBoot 2.0.0 版本開始,以上配置不支持,點到配置元數據文件中(spring-configuration-metadata.json),發現如下信息:

    {
      "properties": [
        {
          "name": "server.context-path",
          "type": "java.lang.String",
          "description": "Context path of the application.",
          "deprecated": true,
          "deprecation": {
            "level": "error",
            "replacement": "server.servlet.context-path"
          }
        },
        {
          "name": "server.servlet.context-path",
          "type": "java.lang.String",
          "description": "Context path of the application.",
          "sourceType": "org.springframework.boot.autoconfigure.web.ServerProperties$Servlet"
        }

    替換屬性名為:server.servlet.context-path,此屬性在org.springframework.boot.autoconfigure.web.ServerProperties 中,且在類中可以發現,server.context-path 所對應的屬性 ServerProperties#contextPath 在代碼中已不存在,而是在內部類 Servlet 中有,也就是對應 server.servlet.context-path 的屬性才有。

    但是其滿足配置兼容的條件,為什麼實際上使用卻好像不兼容呢?
    其實是因為沒有引入依賴,當引入依賴,就會發現此方式配置可以起作用。

    示例之兩種屬性都存在

    代碼示例見

    1、引入依賴

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-properties-migrator</artifactId>
    </dependency>
    
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-configuration-processor</artifactId>
      <optional>true</optional>
    </dependency>

    2、Java 配置
    此處故意保留棄用屬性

    @Data
    @Configuration
    @ConfigurationProperties(prefix = "my")
    public class MyProperties {
      /** the project name */
      private String name;
    
      private App app;
    
      @Data
      public static class App {
        private String name;
      }
    }

    3、元數據配置,spring-configuration-metadata.json 由程序生成,自定義配置放在 additional-spring-configuration-metadata.json

    {
      "properties": [
        {
          "name": "my.name",
          "type": "java.lang.String",
          "description": "the project name.",
          "deprecation": {
            "reason": "test the properties-migrator feature.",
            "replacement": "my.app.name",
            "level": "error"
          }
        },
        {
          "name": "my.app.name",
          "type": "java.lang.String",
          "sourceType": "com.lw.properties.migrator.config.MyProperties$App",
          "description": "the project name."
        }
      ]
    }

    4、在 properties 或 yml 文件中配置

    my:
      name: lw
      app:
        name: app

    5、打印配置信息

    @Slf4j
    @SpringBootApplication
    public class PropertiesMigratorApplication {
    
      public static void main(String[] args) {
        ConfigurableApplicationContext context =
            SpringApplication.run(PropertiesMigratorApplication.class, args);
        MyProperties myProperties = context.getBean(MyProperties.class);
        log.info("myProperties.name:{}", myProperties.getName());
        log.info(
            "myProperties$app.name:{}",
            Optional.ofNullable(myProperties.getApp()).orElse(new App()).getName());
      }
    }

    6、打印信息如下:

    2019-11-23 21:42:09.580 WARN 109408 — [ main] o.s.b.c.p.m.PropertiesMigrationListener :
    The use of configuration keys that have been renamed was found in the environment:

    Property source ‘applicationConfig: [classpath:/application.yml]’:
    Key: my.name
    Line: 4
    Replacement: my.app.name
    Key: server.context-path
    Line: 2
    Replacement: server.servlet.context-path

    Each configuration key has been temporarily mapped to its replacement for your convenience. To silence this warning, please update your configuration to use the new keys.
    ……… myProperties.name:lw
    ……… myProperties\(app.name:lw ……… serverProperties\)servlet.contextPath:/app

    7、效果解析
    在 yml 中棄用屬性名優先級更高,棄用屬性與新屬性都使用此棄用屬性名對應的值。

    參考資料

    SpringBoot 2.2.1.RELEASE 源碼
    公眾號:逸飛兮(專註於 Java 領域知識的深入學習,從源碼到原理,系統有序的學習)

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

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

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

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

  • 嚇人!在浴池洗浴竟會感染梅毒?很多人都不知情…

    嚇人!在浴池洗浴竟會感染梅毒?很多人都不知情…

      本文專家:田靖博士,南部戰區疾病預防控制中心,主治醫師

      我們都知道艾滋病很可怕,得了基本上就需要終生抗爭。

      最近,僅次於艾滋病的第二大性接觸疾病——梅毒,突然成了微博上最熱門的話題。

      某知名企業創始人稱自己“在浴池洗浴感染梅毒,打了 6 天針后治癒”。


    微博截圖

      先是洗浴感染梅毒驚呆眾網友,只要在公共中心泡過澡、游過泳的都表示瑟瑟發抖。

      還有對 6 天治癒梅毒表示疑問,畢竟我們所知的梅毒是比較可怕的。

      那泡澡到底會不會感染梅毒?梅毒究竟該如何治癒?我們就網友關心的這些問題科普一下。

      洗浴、游泳真會感染梅毒嗎?

      梅毒螺旋體(Treponema pallidum,TP)又稱為蒼白螺旋體,是造成感染梅毒的“罪魁禍首”。

      目前全球每年約有 1200 萬新發梅毒病例,我國梅毒發病率呈上升趨勢。

      梅毒的感染途徑有——

      1、血液傳播和性接觸傳播

      梅毒螺旋體僅可以感染人類,血液傳播和性接觸傳播是主要途徑。95% 以上的感染者通過危險的無保護的性行為感染,而男同性戀人群中的梅毒感染率近年來急劇上升。

      2、母嬰傳播。梅毒可以通過垂直傳播途徑,由感染梅毒的母親傳染給新生兒。

      梅毒螺旋體病毒感染人類需要具備一定的病毒載量,在某些特殊條件下才能發生,如通過性接觸直接接觸梅毒感染者的創面或者血液傳播,同時也取決於被感染者的身體狀況等。

      因此,常規使用公共設施和出入公共場所,如游泳池游泳、接觸馬桶墊、共用餐具、衣物接觸等情況都不會感染梅毒。

      並且游泳池中的水通常含有漂白粉等消毒劑,不適合淋球菌、梅毒螺旋體等性病病原體存活。所以,去正規的游泳館不存在感染梅毒的可能性。

      梅毒有什麼危害?

      按照《梅毒診斷標準》(WS273-2018),根據梅毒感染的不同階段以及出現癥狀的差異可以將梅毒分為I期、II 期、III 期、胎傳和隱形梅毒。

      I 期~III 期梅毒對於患者的損害是不同的,能造成——

    1. 硬下疳、腹股溝或患部近位淋巴結腫大;
    2. 多個部位的瀰漫性皮損,最終造成頭面部以及四肢產生結節性梅毒疹;
    3. 關節出現結節;
    4. 皮膚、口腔、舌咽出現樹膠腫;
    5. 產生骨梅毒、眼梅毒、心血管梅毒、神經梅毒和其他內臟梅毒等。

      胎傳:所有未經有效治療的梅毒母親所生的嬰兒可能感染胎傳梅毒,根據發病時間分為早期胎傳梅毒、晚期胎傳梅毒和隱性胎傳梅毒。

      隱形梅毒:無臨床癥狀與體征的隱性梅毒患者,仍然具有傳染性,部分病人可以發生晚期損害。

      晚期梅毒可導致不可逆的心血管損傷和中樞系統損害,嚴重者可導致死亡。

      中樞神經系統的梅毒感染可以發生在疾病的任何時期,病程越長、精神癥狀越嚴重。

      此外,梅毒與艾滋病常常是一對“好兄弟”。在感染艾滋病的患者中,大約有 42.8% 的患者都曾感染梅毒。

      梅毒感染會造成皮膚破損,增加體液中 CD4+ 細胞的數量,為 HIV 的感染提供更多的靶細胞,促進 HIV 的傳播,因此從這個意義上來說,感染梅毒是艾滋病的“幫凶”。

      梅毒真能 6 天治癒嗎?

      不一定!

      因為涉及個人體質、治療抗生素的使用方案及青霉素是否過敏等問題,治療周期和結果都會因人而已,最重要是嚴格遵循醫囑和臨床檢查結果。

      因此,治癒的時間根據選擇藥物和患者的病情來確定,不能簡單用時間判斷!

      感染梅毒該如何治療?

      青霉素是治療梅毒的首選藥物之一,對病原菌的細胞壁生成進行抑制 , 從而降低抗原反應素,可短期改善認知功能。青霉素過敏者可採用紅黴素治療。

      多西環素是非青霉素的一種,及早治療血清轉陰率可達 83%-100%,成為當前治療早期梅毒(梅毒螺旋體感染<2 年,II 期早期梅毒)的主要手段。

      頭孢曲松鈉及苄星青霉素聯合治療梅毒比單一用藥效果好。

      不過,抗生素治療僅對免疫系統正常的患者有效。當患者產生梅毒血清抵抗時,單獨使用青霉素,無論增加劑量還是延長治療時間,都對患者無效。

      梅毒治療后,15%~41% 的患者可能形成梅毒血清固定,使用免疫調節劑再治療梅毒血清固定患者有一定的效果,但存在爭議。

      所以,治療梅毒需要嚴格遵循醫囑,才能達到有效治癒。

      此外,還要保持健康良好的生活方式,防止不安全的性行為。

     

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

    ※帶您來了解什麼是 USB CONNECTOR  ?

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

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

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

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

  • Facebook改進換臉術:無需“投喂”圖片,從視頻里直接變臉

    Facebook改進換臉術:無需“投喂”圖片,從視頻里直接變臉

      曉查 發自 凹非寺 
      量子位 報道 公眾號 QbitAI

      近兩年來,Deepfakes 讓許多歐美明星吃盡了苦頭,面對自己的頭像被替換到各種視頻中,卻無能為力。

      比如黑寡婦就對自己的臉被替換到小電影中感到很無奈,呼籲大家停止用 AI 作惡。

      而最近,Facebook 人工智能研究院讓換臉技術再次進化。

      過去 Deepfakes 這項技術需要很多準備材料:一是被替換人臉的原視頻,二是來自換臉人面部各個角度的照片。有這兩樣東西才能造出完美無暇的換臉視頻。

      而來自 Facebook 的技術不需要照片,可以從原視頻直接生成換臉視頻,甚至能對實時視頻進行換臉。

      它讓“大表姐”變得不再熟悉。 

      這項技術的換臉實際上是毫無違和感地修改五官特徵,好讓 AI 無法識別出,因此也就不需要照片了。

      而且 Facebook 的研究人員還表示,這項技術修改后的明星臉仍然可以被人識別出來,但是 AI 卻不行。 

      Facebook 研發這項技術可不是為了換臉好玩,最近因使用人臉識別技術飽受爭議,這家公司希望通過這項新技術來保護用戶的隱私。

      人臉識別和換臉技術對普通民眾的隱私也造成了很大的威脅。比如前一陣大熱的換臉應用 ZAO,讓每個人都享受到換臉帶來的樂趣,但同時也會收集用戶圖片。

      研究人員在論文摘要中說:“人臉識別可能會導致隱私丟失,而換臉技術可能會被用於製作誤導性視頻。”Facebook 用後者來去除視頻中的隱私信息。

      Facebook 聲稱,該技術屬於業內首創,足以抵禦複雜的人臉識別系統。

      Facebook 將在下周韓國首爾舉行的國際計算機視覺國際會議(ICCV)上介紹該工作。

      本周,Facebook 還聯合微軟和亞馬遜,提供 Deepfakes 換臉挑戰數據集,希望能夠提高識別換臉視頻算法的魯棒性,以控制假視頻的傳播。

      此舉頗有些以彼之矛攻彼之盾的意味。

      原文鏈接:

      https://venturebeat.com/2019/10/25/facebook-alters-video-to-make-people-invisible-to-facial-recognition/

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

    ※為什麼 USB CONNECTOR 是電子產業重要的元件?

    網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

    ※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

    ※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

  • 國家電網預計將於2020年6月前全面實現即插即沖新技術

    國家電網預計將於2020年6月前全面實現即插即沖新技術

      作者:JoJo

      【TechWeb】10 月 27 日,近日,國網電動汽車服務有限公司發布了充電服務創新模式“車電服務包”。國網電動汽車公司總經理沈建新表示,國網電動汽車公司將加大車聯網的規模,擴大平台充電樁的數量。同時,國網電動汽車公司將在半年內實現“即插即充、無感支付”在公共場站、專用場站、私人充電樁業務場景全覆蓋,加速布局主要城市充電網絡。

      該措施首先是提供主機廠車電包服務範圍內場景全覆蓋、布局更密集的充電設施服務網絡。 國網目前已建成 9 萬自營充電樁,其中高功率直流快充 6.5 萬根。對此,沈建新表示,未來還將引入更多社會資源,擴大充電樁規模,保證主要城市充電站布點半徑不超過 500 米,同一站點充電等候不超過 30 分鐘,確保充電服務套餐用戶實現區域內充電暢行。

      其次,是加快即插即充、無感支付新技術全覆蓋。2020 年 6 月前,通過技術升級及硬件改造,國網電動汽車公司將完成國網系統充電樁全面支持即插即充,新投入車聯網平台的充電樁全部滿足“即插即充、無感支付”要求,實現“充綠色電,比加油更方便”。

      此次發布的“車電服務包”是與四家車企聯合推出與新車綁定銷售的充電產品,用戶一次付費購買“車電服務包”並綁定車輛后,即可在國網充電樁上享受“即插即充、無感支付”。電動汽車插入充電槍后,充電過程不需要人為干預,自動完成認證、充電啟動、充電停止以及訂單生成與結算,實現了車、樁、網、能源的泛在互聯與高效互動,是國家電網公司泛在電力物聯網建設的典型終端。

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

    ※為什麼 USB CONNECTOR 是電子產業重要的元件?

    網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

    ※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

    ※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

  • 是什麼觸發了宇宙大爆炸?

    是什麼觸發了宇宙大爆炸?


    圖片來源:Christine Daniloff, MIT, ESA/Hubble and NASA

      1.

      根據大爆炸理論,我們的宇宙誕生於 138 億年前,從一個無限小的緻密“火球”,不斷地擴張膨脹,並慢慢冷卻。漸漸地,宇宙中形成了第一批恆星、星系,以及我們如今所見到的所有形式的物質。

      物理學家相信,就在大爆炸將宇宙推向不斷膨脹的進程之前,早期宇宙還經歷了另一個更具爆炸性的階段——宇宙暴脹。這個過程持續的時間不到萬億分之一秒,但膨脹的速度卻是以指數級增長的。  


    Guth 的筆記

      上個世紀 80 年代,物理學教授 Alan Guth 首次提出了宇宙膨脹理論,該理論預測宇宙最初是一個極微小的物質點,其大小可能只有質子的千億分之一。這個點中充滿了超高能物質,能量非常之大,以至於內部的壓力產生了一種排斥性的引力——這就是暴脹背後的驅動力。就像火花之於引信一樣,這種引力以前所未有的速度將新生的宇宙向外推,在不到萬億分之一秒的時間內,使宇宙膨脹到接近原始大小的 10²⁷倍。

      許多天文觀測結果都支持了大爆炸和宇宙暴脹理論。但是,這是兩個截然不同的過程,科學家們一直難以理解其中一個是如何緊隨另一個之後出現的。

      在一項新的研究中,物理學家詳細地模擬了早期宇宙中一個可能連接了宇宙暴脹和大爆炸的中間階段。這個階段被稱為“再熱”,這一過程出現在宇宙暴脹末期和大爆炸開始之前的階段,將暴脹產生的冷的、均勻的物質轉變成超熱的、複雜的物質湯。

      論文的作者David Kaiser說:“后暴脹再熱時期為大爆炸創造了條件,在某種意義上,是它啟動了‘爆炸’,正是在這個橋樑時期,所有的事物都開始鬆動,物質的行為變得非常複雜。”

      2.

      對於這個連接了宇宙暴脹和大爆炸的橋樑階段,研究人員很好奇它最初會是什麼樣子。

      Kaiser 說:“再熱的最初階段應該用共振來標記。一種高能物質佔據主導地位,它在廣闊的空間中與自身同步來回擺動,導致爆炸式地產生新的粒子。但這種行為不會永遠持續下去,一旦它開始將能量轉移到另一種形式的物質上,它自身的擺動將在空間中變得更加起伏不平。我們想要測量的是,需要多長的時間共振效應才會破裂,產生的粒子才會彼此分散並且達到某種熱平衡,讓人想起大爆炸發生時的情況。”

      他們的計算機模擬中展示了一個很大的晶格,在這個晶格上,他們繪製了多種形式的物質,並追蹤了當某些條件被改變時,能量和分佈會如何隨之在空間和時間上發生變化。模擬的初始條件是基於一個特定的暴脹模型而設置的,這個模型是一組關於早期宇宙的物質分佈在宇宙暴脹期間的行為得到一系列預測。

      他們之所以選擇這一特定的暴脹模型,是因為它的預測與高精度的宇宙微波背景測量結果非常吻合。

      3.

      在模擬中,他們研究了兩種可能在暴脹期間佔主導地位的物質的行為,這些物質與希格斯玻色子非常相似。

      在進行模擬之前,研究人員對模型中的引力描述進行了一個微小的調整。我們如今看到的普通物質在引力下的作用應正如愛因斯坦廣義相對論中所預測的那樣;但在更高的能量下,比如在宇宙暴脹期間,物質的行為或許會略有不同,與之產生相互作用的引力是由量子力學修正過的。

      在廣義相對論中,引力的強度被表示為一個常數,物理學家稱之為是最小耦合,這意味着,無論一個特定粒子的能量為何,它都會以一個由普適常數所設定的強度對引力效應做出反應。

      然而,在宇宙暴脹的高能量下,物質與引力的相互作用會以一種更為複雜的方式進行。而量子力學效應預測,當與超高能物質發生相互作用時,引力的強度在空間和時間中會發生變化,這是一種被稱為非最小耦合的現象。

      研究人員將這一個非最小耦合項納入了他們的暴脹模型中,並觀察了物質和能量的分佈是如何隨着量子效應的漲落變化的。

      最後他們發現,量子修正過的引力效應對物質的影響越強,宇宙就會越快地從暴脹中寒冷、均勻的物質過渡到更熱、更多樣的大爆炸過程中特有的物質。

      “再熱是一個瘋狂的過程,一切都不受控制。我們發現,當時物質之間的相互作用非常強烈,以至於它可以相應地快速放鬆下來,為大爆炸創造了合適的條件。我們以前並不知道會是這個樣子,但這些都是我們用已知的物理學從模擬中得出的結論。這正是讓我們興奮的地方。”

      對於新的發現,其他物理學家認為,關於造成了暴脹階段的提議有數百種,但從暴脹階段到所謂的‘熱大爆炸’之間的過渡卻是人們最不了解的部分,而這篇論文則通過包含多個獨立的場和複雜的動力學在模型中精確地模擬后暴脹階段,開闢了新的領域。這是極具挑戰性的數值模擬,併為研究早期的宇宙非線性動力學提供了最新的技術。

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

    ※帶您來了解什麼是 USB CONNECTOR  ?

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

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

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

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