我的產品/競品分析鍛煉記錄(分析產品核心)

  一來,以前剛入行的時候也想學習下競品分析/產品分析,然後好提高自身的分析能力,當時看了很多文章,然後看到大多都是學生寫的,分析的思路都是從用戶、核心流程,然後一直說到交互,但是整片文章偏重的是說某個小交互怎麼設計得不好,怎麼改進怎麼。

  二來,最近面試了一次,面試我的人應該也是挺教條主義的,面試過程我說了下競品分析,了解過市場行情,當時她追問,我就說下我的分析思路,我的分析思路很特別,只是分析產品核心、整體設計的優缺、預判產品的未來發展方向等,對於細節、業務流程等,一概不分析。

  三來想起來幾年前,那時候我還非常空閑,做了個100個APP分析挑戰,結果沒做完,尷尬。

  所以想整理下這篇,關於我對產品/競品分析的一些思路及想法,以供其他人參考。

 

1、產品經理究竟是負責什麼?

  必須要理清這個點,如果沒對產品經理的職責有清晰定位,很難做出比較適合的分析。為什麼這麼說呢?因為很多剛入行的人,要不從運營/業務入行,要不就技術/畫圖入行,只是了解業務或者功能設計,而不是真正、完整的產品管理。

  產品經理是要對一個產品的從頭到尾的管理,包括用戶了解、分析、業務設計、功能設計實施、運營推廣,從產品冷啟動到產品發展到產品退出市場,產品經理都需要負起帶頭的責任。這個是我理解的產品經理該需要承擔起來的責任。(這裏不展開說,不然這文章沒完沒了)

  基於這個概念,所以我作為一個產品經理,應該關注產品核心價值,因為核心價值才是讓這個產品獨立生存在市場上面,關注市場用戶的情況,而不是將關注點局限在一個小功能、小交互。所以才會有文章一開始說的,分析思路跟那些教科書的,有差異。

2、產品分析與競品分析的差異?

  在我的概念裏面,產品分析是偏重某個產品的的分析,偏重產品的核心價值、核心業務、核心設計。而競品分析偏重是在某個市場環境裏面,同類產品的核心價值差異。

  一個相對深入點,一個相對注重分析面,並且注重市場環境。

3、我的產品分析思路,要分析什麼?

  競品分析就不怎麼寫了,以前我也沒怎麼做過真正的競品分析,產品分析我也是只是分析核心的而已。

  我的方法很原始,就是作為一個用戶、作為一個產品設計者,兩種角色交替去對一個產品進行觀察、感受,寫出它的優缺而已。

  

下面截圖一下當時做的一些內容:

 

 

 

  從上面截圖可以看到當時我做這個鍛煉的目的及原始的一些思路,這個挑戰持續一年的,所以當時在自我學習過程裏面,開始逐漸完善我自身的分析。

  當然,這個是幾年前的分析,分析重點是一個產品的核心,沒有分析細節怎麼設計是好的,怎麼不好,只是純粹從小白的角度去嘗試,從如果我是這個產品的負責人的話,市場環境大概是那樣,我該如何去突破尋求發展?

 

如果說專業一點的競品分析文章,這裏介紹一篇超級詳細的競品分析文章,分析非常深入透徹,但是個人覺得價值不大!為什麼會這麼說呢?

  1、請問要分析一個行業的競品,單靠一個人,要像這位哥們分析到這麼深入,需要多少時間?一個月?一個季度?

  2、以前做產品分析的時候就發現一個問題,當你做完產品分析,產品已經發生改變,你所做的,都是歷史記錄的(當然有很重要的參考意義,這點無可厚非),花費那麼大的時間精力,是否值得?(跟隨是無法超越對方的,因為對方的創新永遠比你快,除非你的創新比它快,這樣要求你的團隊比對方要牛逼,要更清楚用戶需要)

 

  文章鏈接:https://www.zhihu.com/question/23601989/answer/91519343

  作者:大禹

 

       在後來的工作上面,針對這種專門競品/產品分析幾乎是沒有,可能我孤陋寡聞,但是貌似,沒見過有什麼企業,會做比較專門的競品/產品分析,因為做這些實在是耗費時間精力,但是做出來的時候,市場環境可能已經發生了改變了。

       而且當分析深度不夠深的話,還不如外包給專業的市場調研機構,他們會更專業,更有效率產出相對來說更準確的報告。而產品人員通過這些分析,可以拓寬自身眼界,鍛煉思考產品的核心。如果是這樣~~~好像也沒必要畫流程圖啊、寫交互優缺~~

       以上是我個人對產品經理、產品/競品分析的一些見解,純屬個人看法,如有更好的歡迎下面評論一起討論,研究下。

【精選推薦文章】

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

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

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

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

細談unity資源管理的設計

一、概要

本文主要說說Unity是如何管理的,基於何種方式,基於這種管理方式,又該如何規劃資源管理,以及構建bundle,是後面需要詳細討論的。

二、Unity的資源管理方式

2.1 資源分類

unity項目中的資源,大體上可以分為外部導入資源和內部生成資源兩種類型。
外部導入資源: 美術生成的大部分資源,都是外部帶入資源,模型,貼圖,UI用圖,基本是美術工具生成后,導入到工程中的。
內部生成資源: 部分美術生成資源,例如材質,shader,特效,場景等,屬於基於Unity引擎來製作生成的,此外各種prefab(UI/角色等),以及代碼腳本(c#為主),也屬於Unity的內部生成資源。

2.2 資源的存儲方式

在資源導入到unity工程后,會以各種方式進行轉換存儲,主要有以下幾種:

2.2.1 腳本類資源

對於工程中的腳本類資源,主要分為plugin和非plugin兩類。

  • plugin類:在plugin中引用的dll, 屬於自己生成相關的dll,在最終構建遊戲包的時候,被打入到相關遊戲包中:      
  • 非plugin類:unity會構建成4個基本的dll, 構建的順序為:
    • Assembly-CSharp-firstpass: standard assets/Pro standard assets/plugins 中的腳本
    • Assembly-CSharp-Editor-firstpass: editor scripts in standard assets/Pro standard assets/plugins 這個dll不會被打入到遊戲包中,屬於編輯器下特有的dll
    • Assembly-CSharp: all other scripts that not inside editor 主體遊戲邏輯的dll
    • Assembly-CSharp-Editor: all remaing scripts inside editor 這個dll也不會被打入到遊戲包中,編輯器中特有的dll

所有最終構建到遊戲包中的dll,主要分為:

  • Assembly-CSharp.dll/Assembly-CSharp-firstpass.dll 這2個主要遊戲邏輯dll
  • 引擎dll和插件引用的dll

2.2.2 美術類資源

美術類資源,分為外部導入和內部生成兩個大類

  • 外部導入類: 場景/模型/貼圖 都可以外部導入
    • 繼承自AssetPostprocesser后,可以對導入的貼圖,材質,模型,場景,均執行相關的修改
  • 內部生成類: shader/材質/prefab/場景 均可以內部生成美術資源的貼圖資源和特效資源,屬於重點關注對象,後面會細談這幾個資源的管理
    • 修改操作同上

2.2.3 meta文件

工程資源劃分好后,如何對這些資源進行管理? 不同的引擎有不同的管理方式,那麼unity中是如何管理的?
這兒管理分為2個步驟:序列化和meta文件的生成

2.2.3.1 unity的序列化

工程中的資源,要存儲到本地磁盤,那麼就會通過引擎進行一步序列化的操作,序列化的實質,就是將資源對象按照一定的順序轉換成二進制文件。

2.2.3.2 meta文件的生成

在完成序列化后,unity會對應的為該文件生成一份meta文件,這份meta文件會跟隨該文件一直存在,如果刪除該資源文件,其對應的meta文件也會被引擎自動刪除。
meta文件的主要構成:

  • 文件的guid: 這個文件的全工程中的唯一索引id,基於該id,可以對應的查找到該文件。guid的生成本質,就是基於文件的路徑來進行轉換生成的,同理,如果多個工程合併的時候出現guid衝突,可以自己重新生成一份guid,相關鏈接: https://gist.github.com/ZimM-LostPolygon/7e2f8a3e5a1be183ac19

  • 文件的導入設置:

    • 對於一般的文件,導入設置都比較簡單腳本類叫MonoImporter, 資源類叫NativeFormatImporter
    • 貼圖屬於需要重點關注的類型,其導入類型叫TextureImporter,裏面詳細的列出對該貼圖的各種壓縮格式,mipmaps, 類型,uv,貼圖大小等等詳細的設置信息

2.2.4 基於meta文件和序列化的資源管理

除了meta文件的guid,unity還會為每個資源生成一份文件id,也就是fileID, 不過現在fileID已經不再保留在meta文件中了,保留到文件的序列化文件中了,對於該資源,還會有一份localID, 這個localID, 對應的就是在一個資源中包含多個子資源的時候,定位每個子資源所用:  

那麼序列化是如何與guid/fileID關聯的?
在unity工程內部,如果給資源添加其他資源的引用,例如加一個腳本,拖拽一個外部引用,那麼就會觸發一次序列化操作,序列化操作的時候,就會將引用的資源的fileID和guid都序列化下來,這樣在反序列化的時候,就會基於fileID和guid來反向找到依賴的資源,從而加載進來。   

這個過程,在Unity中,就是一個裝載的過程,多說一句,如果一個資源依賴的其他資源越多,那麼這個裝載過程就會越耗時,所以在打開一個很大的UI的時候,有一部分的時間是消耗在裝載UI上各個組件上的。

三、總結

基於前文,可以對整個unity的資源管理有一個初步的認識,基於meta文件和序列化操作,可以管理工程中的資源,同時也能管理好各個資源的互相引用,那麼基於這樣的設計,在構建bundle的時候,是可以進行相關的設計和實現的。

【精選推薦文章】

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

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

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

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

手把手教你學會 基於JWT的單點登錄

  最近我們組要給負責的一個管理系統 A 集成另外一個系統 B,為了讓用戶使用更加便捷,避免多個系統重複登錄,希望能夠達到這樣的效果——用戶只需登錄一次就能夠在這兩個系統中進行操作。很明顯這就是單點登錄(Single Sign-On)達到的效果,正好可以明目張膽的學一波單點登錄知識。

本篇主要內容如下:

  • SSO 介紹
  • SSO 的幾種實現方式對比
  • 基於 JWT 的 spring boot 單點登錄實戰

注意:
  SSO 這個概念已經出現很久很久了,目前各種平台都有非常成熟的實現,比如OpenSSOOpenAMKerberosCAS等,當然很多時候成熟意味着複雜。本文不討論那些成熟方案的使用,也不考慮 SSO 在 CS 應用中的使用。

什麼是 SSO

  單點點說就是:一次登錄后可免登陸訪問其他的可信平台。比如我們登錄淘寶網后,再打開天貓首頁可以發現已經是登錄狀態了。SSO 是一種比較流行的服務於企業業務整合的一種解決方案。

如何實現 SSO

  我們都知道目前的 http 協議是無狀態的,也就是第一次請求和第二次請求是完全獨立,不相關的,但現實中我們的業務邏輯都是有狀態的,這樣就引入了 cookie-session 的機制來維護狀態,瀏覽器端存儲一個 sessionId,後台存儲跟該 sessionId 相關的數據。每次向後台發起請求時都攜帶此 sessionId 就能維持狀態了。然後就有了 cookie,瀏覽器在發送請求時自動將 cookie 中的數據放到請求中,發給服務端,無需手動設置。

  然後我們可以考慮考慮實現 SSO 的核心是什麼?答案就是如何讓一個平台 A 登錄后,其他的平台也能獲取到平台 A 的登錄信息(在 cookie-session 機制中就是 sessionId)。

方案一 共享 cookie

  基於 cookie-session 機制的系統中,登錄系統後會返回一個 sessionId 存儲在 cookie 中,如果我們能夠讓另外一個系統也能獲取到這個 cookie,不就獲取到憑證信息了,無需再次登錄。剛好瀏覽器的 cookie 可以實現這樣的效果(詳見web 跨域及 cookie 學習)。

  cookie 允許同域名(或者父子域名)的不同端口中共享 cookie,這點和 http 的同域策略不一樣(http 請求只要協議、域名、端口不完全相同便認為跨域)。因此只需將多個應用前台頁面部署到相同的域名(或者父子域名),然後共享 session 便能夠實現單點登錄。架構如下:

  上面方案顯而易見的限制就是不僅前台頁面需要共享 cookie,後台也需要共享 session(可以用jwt來幹掉 session,但是又會引入新的問題,這裏不展開).這個方案太簡單了,不作進一步說明。

方案二 基於回調實現

  通過上文可以知道,要實現單點登錄只需將用戶的身份憑證共享給各個系統,讓後台知道現在是在訪問。就能實現一次登錄,到處訪問的效果,實在是非常方便的。在 session 機制中是共享 sessionId,然後多個後台使用同一個 session 源即可。這裏我們用一種新的基於 JWT 的 token 方式來實現,不了解 JWT 的可以看這篇:java-jwt 生成與校驗,簡單來說 jwt 可以攜帶無法篡改的信息(一段篡改就會校驗失敗),所以我們可以將用戶 id 等非敏感信息直接放到 jwt 中,幹掉了後台的 session。然後我們要做的就是將 jwt 共享給各個平台頁面即可。系統架構如下:

  此架構中,業務系統 A 和業務系統 B 之間不需要有任何聯繫,他們都只和 SSO 認證平台打交道,因此可以任意部署,沒有同域的限制。你可能就要問了這樣要怎麼共享身份憑證(也就是 jwt 字符串)?這裏就要通過 url 參數來進行騷操作了。文字總結來說是這樣的:jwt 存到認證平台前端的 localStore(不一定是 localStore,cookie,sessionStore 都可以),然後業務平台攜帶自己的回調地址跳轉到認證中心的前台,認證中心的前台再將 ujwt 作為 url 參數,跳回到那個回調地址上,這樣就完成了 jwt 的共享。

  文字很可能看不懂,下面是整個過程的路程圖:

相信通過上面的流程圖你應該能大概看明白,jwt 是如何共享了的吧,還看不懂的繼續看下來,下面上一個 spring boot 實現的簡易 SSO 認證。主要有兩個系統:SSO 認證中心,系統 A(系統 A 換不同端口運行就是系統 A、B、C、D 了).

實戰

實現 SSO 認證中心

  spring boot 框架先搭起來,由於是簡易項目,除 spring boot web 基本依賴,只需要如下的額外依賴:

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

<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>fastjson</artifactId>
  <version>1.2.4</version>
</dependency>
<dependency>
  <groupId>com.auth0</groupId>
  <artifactId>java-jwt</artifactId>
  <version>3.7.0</version>
</dependency>

完整的 POM 文件,請到 github 上查看.

後台實現

  後台做的事情並不多,只有以下 5 個方法:

  • /login : 登錄成功后簽發一個 jwt token
    在 demo 中只是簡單對比用戶名密碼如果是一樣的認為登錄成功,返回 token
  • /checkJwt : 檢查 jwt 的有效性
    檢查傳來的 jwt-token 是否有效,返回失效的 jwt 列表
  • /refreshjwt : 刷新 jwt
    判斷該 jwt 是否快要過期,如果快要過期,生成一個新的 jwt 返回
  • /inValid : 讓某個 jwt 失效
    jwt 如何失效一直是一個比較麻煩的問題,各有利弊。本例中採用的是為每個 jwt 生成一個隨機的秘鑰 secret,將 jwt–secret 保存到 redis 中,想要讓某個 jwt 失效,只需將該記錄在 redis 中刪除即可(這樣在解密時便無法獲取到 secret)。但是這樣讓無狀態的認證機制變成有狀態了(記錄了 jwt 和 secret 的對應關係)。

  總結來說 SSO 後台主要只做了兩件事:驗證用戶名密碼返回 jwt;驗證 jwt 是否合法。具體代碼查看 github 上 sso 目錄下的代碼。

前台實現

  前台的邏輯較為複雜,不是那麼容易理解,不明白的多看幾遍上面的流程圖。

  再次回到 SSO 的重點:分享登錄狀態。要如何在前台將登錄狀態(在這裏就是 jwt 字符串)分享出去呢?由於瀏覽器的限制,除了 cookie 外沒有直接共享數據的辦法。既然沒有直接共享,那肯定是有間接的辦法的!

  這個辦法就是回調。系統 A 的前台在跳轉到 SSO 的前台時,將當前路徑作為 url 參數傳遞給 sso 前台,sso 前台在獲取到 jwt 后,再跳轉到系統 A 傳過來的 url 路徑上,並帶上 jwt 作為 url 參數。這就完成了 jwt 的一次共享,從 sso 共享到系統 A。

打個比方:你點了個外賣,別人要怎麼把外賣給你呢?顯然你會留下的地址,讓別人帶上飯送到這個地址,然後你就能享用美食了。這和 jwt 的傳遞非常相識了。

系統 A 說:我要 jwt,快把它送到http://localhost:8081/test1/這個地址上。

SSO 說:好嘞,這個地址是合法的可以送 jwt 過去,這就跳轉過去:http://localhost:8081/test1/?jwt=abcdefj.asdf.asdfasf

系統 A 說:不錯不錯,真香。

  要注意這裏有個坑就是:如果另外一個惡意系統 C 安裝相同的格式跳轉到 SSO,想要獲取 jwt,這顯然是不應該給它的。所以在回跳回去的時候要判斷一下這個回調地址是不是合法的,能不能給 jwt 給它,可以向後台請求判斷也可以在 sso 前台直接寫死合法的地址。在 demo 是沒有這個判斷過程的。

實現業務系統

  業務系統代碼非常簡單,主要是用了一個攔截器,攔截 http 請求,提取出 token 向 sso 認證中心驗證 token 是否有效,有效放行,否則返回錯誤給前端。太簡單也不貼代碼了,到 github 上看看就明白了。

效果

  上面說了一大串都是原理了,其實這個難也就難在原理部分,代碼實現並沒有那麼複雜。這裏就不貼代碼了,有需要直接到 github 上看。

  這裏上幾個效果圖:

  • 系統 A 首次登陸系統

可以看到首次登陸是需要跳到 sso 認證中心輸入用戶名密碼進行登陸驗證的。登陸成功回跳後接口請求成功。

  • 將 A 的啟動端口改為 8082 后再次啟動,當作系統 B

可以看到這次是無需登陸的,跳到認證中心后就馬上跳回了,如果去掉 alert 一般是看不出跳轉過程的。

最後在任意一個系統註銷,都會讓所有的系統推出登陸。

可以看到,在系統 A 登錄系統后,系統 B,系統 C 都不再需要輸入用戶名密碼進行登錄。如果速度足夠快甚至都注意不到調到 SSO 再跳回來的過程。

源碼:github

本篇原創發佈於:www.tapme.top/blog/detail/2019-03-01-18-52

【精選推薦文章】

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

想要讓你的商品在網路上成為最夯、最多人討論的話題?

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

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

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

Spring 核心技術(1)

接上篇:Spring 框架概述

version 5.1.8.RELEASE

這部分參考文檔涵蓋了 Spring Framework 所有絕對不可或缺的技術。

其中最重要的是 Spring Framework 的控制反轉(IoC)容器。在介紹完 Spring 框架的 IoC 容器之後,緊接着全面介紹 Spring 的面向切面編程(AOP)技術。Spring Framework 有自己的 AOP 框架,它在概念上易於理解,並且成功地定位了 Java 企業編程中 AOP 需求的 80% 最佳擊球點。

Spring 提供與 AspectJ (目前功能最豐富,也是Java企業領域中最成熟的 AOP 實現)的集成。

1. IoC容器

本章介紹 Spring 的控制反轉(IoC)容器。

1.1 Spring IoC 容器和 Bean 簡介

本章介紹了 Spring Framework 控制反轉(IoC)的實現原理。IoC 也稱為依賴注入(DI)。通過這個機制,對象可以通過構造方法參數、工廠方法參數以及通過工廠方法構建或返回的實例上設置的屬性來定義它們的依賴關係(即它們使用的其他對象)。然後容器在創建 bean 時注入這些依賴項。這個過程從根本上反轉了 Bean 自身通過直接調用構造方法或服務定位模式等機制來控制實例化或定位其依賴的模式,因此叫做控制反轉。

org.springframework.beansorg.springframework.context 包是 Spring 框架的 IoC 容器的基礎。BeanFactory 接口提供了一種能夠管理任何類型對象的高級配置機制。ApplicationContext 是 BeanFactory 的子類。它補充的內容有:

  • 更容易與 Spring 的 AOP 功能集成
  • 消息資源處理(用於國際化)
  • 事件發布
  • 應用層特定的上下文,例如在 Web 應用程序中使用的 WebApplicationContext

簡而言之,BeanFactory 提供了配置框架和基本功能,ApplicationContext 添加了更多針對企業級的功能。ApplicationContextBeanFactory 完整的超集,在本章中僅用它描述 Spring IoC 容器。有關使用 BeanFactory 而不是 ApplicationContext的更多信息 請參考 BeanFactory。

在 Spring 中,構成應用程序架構並由 Spring IoC 容器管理的對象稱為 beans。bean 是一個由 Spring IoC 容器實例化、組裝或管理的對象。除此之外,bean 只是應用程序中眾多對象之一。Bean 及其之間的依賴關係反映在容器使用的配置元數據中。

1.2 容器概覽

org.springframework.context.ApplicationContext 接口代表 Spring IoC 容器,負責實例化、配置和組裝 bean。容器通過讀取配置元數據獲取有關需要實例化、配置和組裝對象的指令。配置元數據以 XML、Java 註解或 Java 代碼錶示,通過它可以表示構成應用的對象以及對象之間豐富的依賴關係。

Spring 提供了多種 ApplicationContext 接口實現。在傳統單機應用中,通常會創建一個 ClassPathXmlApplicationContextFileSystemXmlApplicationContext 的實例。雖然 XML 是定義配置元數據的傳統格式,但你也可以通過提供少量 XML 配置聲明容器啟用對其他元數據格式的支持后使用 Java 註解或代碼作為元數據格式。

在大多數應用程序方案中,不需要顯式使用代碼來實例化 Spring IoC 容器實例。例如,在 Web 應用程序場景中,應用程序文件 web.xml 中一個 8 行左右的 web 描述模板 XML 就足夠了(請參閱 Web 應用程序快速實例化 ApplicationContext)。如果你使用 Spring Tool Suite(一個基於 Eclipse 的開發環境),只需點擊幾下鼠標或按幾下鍵盤即可輕鬆創建此模板配置。

下圖是 Spring 工作原理的高級視圖。應用程序類與配置元數據相結合,在 ApplicationContext 創建並初始化之後,即可擁有完全配置且可執行的系統或應用程序。

1.2.1 配置元數據

如上圖所示,Spring IoC 容器使用一系列配置元數據。這些配置元數據描述了Spring 容器在應用程序中如何實例化,配置和組裝對象。

傳統配置元數據使用簡單直觀的 XML 格式,本章大部分內容也是用 XML 來表達 Spring IoC 容器的關鍵概念和功能。

XML 不是唯一的配置元數據格式。Spring IoC 容器與實際編寫配置元數據的格式完全解耦。目前,許多開發人員為其 Spring 應用程序選擇基於 Java 的配置。

有關在 Spring 容器中使用其他形式的元數據的信息,請參閱:

  • 基於註解的配置:Spring 2.5 引入了對基於註解的配置元數據的支持。
  • 基於Java的配置:從 Spring 3.0 開始,Spring JavaConfig 項目提供的許多功能成為 Spring Framework 核心的一部分。因此,你可以使用 Java 而不是 XML 文件來定義應用程序類外部的 bean。要使用這些新功能,請參閱 @Configuration@Bean@Import,和 @DependsOn 註解。

Spring 配置信息由至少一個(通常不止一個) 必須由容器進行管理的 bean 定義組成。基於 XML 的配置元數據將這些 bean 配置為頂級元素 <beans/> 內的 <bean/> 元素。基於 Java 的配置通常在使用 @Configuration 註解的類中使用帶有 @Bean 註解的方法。

這些 bean 定義對應構成應用程序的實際對象。我們一般會定義服務層對象,數據訪問對象(DAO),展示層對象(例如 Struts Action 實例),基礎結構對象(例如 Hibernate SessionFactories、JMS Queues 等)。一般不會在容器中配置細粒度的域對象,因為通常由 DAO 和業務邏輯負責創建和加載域對象。然而,你可以使用 Spring 集成 AspectJ 來配置非 IoC 容器創建的對象。請參閱使用 Spring 和 AspectJ 進行域對象的依賴注入。

以下示例显示了基於 XML 的配置元數據的基本結構:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="..." class="...">①②
        <!-- collaborators and configuration for this bean go here -->
    </bean>

    <bean id="..." class="...">
        <!-- collaborators and configuration for this bean go here -->
    </bean>

    <!-- more bean definitions go here -->

</beans>

① id 屬性是一個標識單個 bean 定義的字符串

② class 屬性使用完整的類名定義 bean 的類型

id 屬性的值表示協作對象。在此示例中未包含用於引用協作的對象的 XML。有關更多信息,請參閱依賴。

1.2.2 實例化容器

提供給 ApplicationContext 構造函數的位置路徑是一個資源字符串,它允許容器從各種外部資源加載配置元數據,例如本地文件系統、Java 環境變量等。

ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");

在了解了 Spring 的 IoC 容器之後,你可能想要了解有關 Spring 資源抽象化(參考資源描述)的更多信息,特別是 Resource 路徑用於構建應用程序上下文(請參考應用程序上下文和資源路徑),它提供了一種便捷的機制從 URI 語句中定義的位置讀取 InputStream。。

以下示例展示了服務層對象配置文件(services.xml):

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- services -->

    <bean id="petStore" class="org.springframework.samples.jpetstore.services.PetStoreServiceImpl">
        <property name="accountDao" ref="accountDao"/>
        <property name="itemDao" ref="itemDao"/>
        <!-- additional collaborators and configuration for this bean go here -->
    </bean>

    <!-- more bean definitions for services go here -->

</beans>

以下示例展示了數據訪問對象文件(daos.xml):

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="accountDao"
        class="org.springframework.samples.jpetstore.dao.jpa.JpaAccountDao">
        <!-- additional collaborators and configuration for this bean go here -->
    </bean>

    <bean id="itemDao" class="org.springframework.samples.jpetstore.dao.jpa.JpaItemDao">
        <!-- additional collaborators and configuration for this bean go here -->
    </bean>

    <!-- more bean definitions for data access objects go here -->

</beans>

在前面的示例中,服務層由 PetStoreServiceImpl 類和兩個數據訪問對象 JpaAccountDaoJpaItemDao(基於 JPA 對象關係映射標準)組成。property 元素的 name 屬性指的是 JavaBean 屬性的名稱,ref 屬性指向另一個 bean 定義的名稱。元素 idref 之間的這種聯繫表達了協作對象之間的依賴關係。有關配置對象的依賴關係的詳細信息,請參閱依賴關係。

編寫基於XML的配置元數據

通常,每個單獨的 XML 配置文件都對應着架構中的邏輯層或模塊,讓 bean 定義在多個 XML 文件中生效會非常有用。

如上一節中所示,應用程序上下文構造函數可以使用多個 Resource 位置,它可以從這些 XML 片段中加載 bean 定義。另外也可以使用一個或多個 <import/> 元素從其他文件加載 bean 定義。以下示例展示了如何執行此操作:

<beans>
    <import resource="services.xml"/>
    <import resource="resources/messageSource.xml"/>
    <import resource="/resources/themeSource.xml"/>

    <bean id="bean1" class="..."/>
    <bean id="bean2" class="..."/>
</beans>

在前面的例子中,從三個文件中加載外部 Bean 定義,分別是 services.xml、messageSource.xml 和 themeSource.xml。對於執行導入的定義文件來說,所有路徑都是相對路徑,因此 services.xml 必須與執行導入的文件位於相同的目錄或環境變量, messageSource.xml 和 themeSource.xml 必須位於導入文件路徑下方的 resources 目錄中。正如你所見,前邊的斜杠會被忽略掉。鑒於提供的都是相對路徑,所以最好不要使用斜杠。這些文件中包括根據 Spring Schema 定義的正確的 XML Bean 在內的內容都會被導入,包括頂級元素 <beans/>

雖然可以使用相對路徑“../”引用父目錄中的文件,但不建議這樣使用,因為這樣做會使得當前應用依賴程序之外的文件。非常不建議使用 classpath:URL(例如,classpath:../services.xml)引用文件,因為運行時解析過程會選擇“最近”的環境變量根目錄,然後查找其父目錄。環境變量配置的更改可能導致目錄選擇不正確。

可以使用完整的資源位置替代相對路徑,例如,file:C:/config/services.xml 或 classpath:/config/services.xml。然而需要注意應用程序的配置將會與特定的絕對路徑耦合。通常最好為這些絕對路徑保持間接聯繫,例如通過在運行時通過“$ {…}”佔位符替代 JVM 系統屬性。

命名空間本身提供了導入指令的功能。Spring 提供的一系列 XML 命名空間中提供了除普通 bean 定義之外的其他配置功能,例如 context 和 util 命名空間。

Groovy Bean 定義 DSL

作為外化配置元數據的另一個示例,bean 定義也可以在 Spring 的 Groovy Bean 定義 DSL 中表示,就像 Grails 框架。通常此類配置位於“.groovy”文件中,其結構如下例所示:

beans {
    dataSource(BasicDataSource) {
        driverClassName = "org.hsqldb.jdbcDriver"
        url = "jdbc:hsqldb:mem:grailsDB"
        username = "sa"
        password = ""
        settings = [mynew:"setting"]
    }
    sessionFactory(SessionFactory) {
        dataSource = dataSource
    }
    myService(MyService) {
        nestedBean = { AnotherBean bean ->
            dataSource = dataSource
        }
    }
}

此配置樣式在很大程度上等同於 XML bean 定義,同樣支持 Spring 的 XML 配置命名空間。它還允許通過 importBeans 指令直接導入 XML bean 定義文件。

1.2.3 使用容器

ApplicationContext 是一個高級工廠接口,主要負責維護不同 bean 及其依賴項的註冊。通過使用 T getBean(String name, Class<T> requiredType) 方法可以獲得 Bean 的實例。

通過 ApplicationContext 可以讀取 bean 定義並訪問它們,如下例所示:

// create and configure beans
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");

// retrieve configured instance
PetStoreService service = context.getBean("petStore", PetStoreService.class);

// use configured instance
List<String> userList = service.getUsernameList();

使用 Groovy 配置時,初始化程序看起來非常相似。不同的是使用了支持 Groovy 的上下文實現類(也支持 XML bean 定義)。以下示例展示了 Groovy 配置:

ApplicationContext context = new GenericGroovyApplicationContext("services.groovy", "daos.groovy");

最靈活的使用方式是 GenericApplicationContext 與讀取器委派結合使用,例如針對 XML 文件使用 XmlBeanDefinitionReader,如以下示例所示:

GenericApplicationContext context = new GenericApplicationContext();
new XmlBeanDefinitionReader(context).loadBeanDefinitions("services.xml", "daos.xml");
context.refresh();

還可以使用針對 Groovy 文件使用 GroovyBeanDefinitionReader ,如以下示例所示:

GenericApplicationContext context = new GenericApplicationContext();
new GroovyBeanDefinitionReader(context).loadBeanDefinitions("services.groovy", "daos.groovy");
context.refresh();

你可以在相同的 ApplicationContext 中混合使用此類讀取器委託, 從不同的配置源讀取 bean 定義。

你可以使用 getBean 方法來獲取 Bean 實例。ApplicationContext 接口還有一些其他方法可以獲取 bean,但理想情況下你的應用程序不應該使用它們。實際上,你的應用程序代碼根本不應該調用 getBean()方法,也應該不依賴於 Spring API。例如,Spring 集成的 Web 框架為各種 Web 框架組件(如控制器和 JSF 託管的 bean)提供依賴注入,以便通過元數據聲明對特定 bean 的依賴關係,例如自動裝配註解。

  • 我的CSDN:https://blog.csdn.net/liweitao7610
  • 我的博客園:https://www.cnblogs.com/aotian/
  • 我的簡書:https://www.jianshu.com/u/6b6e162f1fdc

【精選推薦文章】

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

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

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

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

List集合去重方式及效率對比

List集合相信大家在開發過程中幾乎都會用到。有時候難免會遇到集合里的數據是重複的,需要進行去除。然而,去重方式有好幾種方式,你用的是哪種方式呢?去重方式效率是否是最高效、最優的呢?今天就給大家講解一下List集合去重的常見及常用的四種方式。

01

實現思路:使用兩個for循環遍歷集合所有元素,然後進行判斷是否有相同元素,如果有,則去除。這種方式是大部分最先想到的,也是最簡單的實現方式。其中,這種方式可以保證List集合原來的順序不變。

代碼實現:

/**
* notes:使用兩個for循環實現List去重
@param list
@return
*/
public static List repeatListWayOne(List<String> list){
   for(int i = 0;i < list.size();i++){
       for(int j = i+1;j < list.size();j++){
           if(list.get(i).equals(list.get(j))){
               list.remove(j);
           }
       }
   }
   return list;
}

 

02

實現思路:我們知道HashSet實現了Set接口,不允許出現重複元素。可以基於這個想法,把List集合所有元素存入HashSet對象,接着把List集合元素全部清空,最後把HashSet對象元素全部添加至List集合中,這樣就可以保證不出現重複元素。而HashSet有一個構造函數,在初始化時可以直接添加元素。其中,HashSet不能保證順序不變,所以此方式不能保證List集合原來的順序不變。

代碼實現:

/**
* notes:使用HashSet實現List去重
@param list
@return
*/
public static List repeatListWayTwo(List<String> list){
  //初始化HashSet對象,並把list對象元素賦值給HashSet對象
  HashSet set = new HashSet(list);
  //把List集合所有元素清空
  list.clear();
  //把HashSet對象添加至List集合
  list.addAll(set);
  return list;
}

 

03

實現思路:TreeSet集合也是實現Set接口,是一個有序的,並且無重複元素集合。同理,我們可以根據上面方式二的思想進行去重。其中,去重后的List集合可以保證和原來的順序一致。

代碼實現:

/**
* notes:使用TreeSet實現List去重
@param list
@return
*/
public static List repeatListWayThird(List<String> list){
   //初始化TreeSet對象,並把list對象元素賦值給TreeSet對象
   TreeSet set = new TreeSet(list);
   //把List集合所有元素清空
   list.clear();
   //把TreeSet對象添加至List集合
   list.addAll(set);
   return list;
}

 

04

實現思路:利用List集合contains方法循環遍歷,先創建新的List集合,接着循環遍歷原來的List集合,判斷新集合是否包含有舊集合,如果有,則不添加至新集合,否則添加。最後,把舊集合清空,把新集合元素賦值給舊集合。

代碼實現:

/**
* notes:利用List集合contains方法循環遍歷去重
@param list
@return
*/
public static List repeatListWayFourth(List<String> list){
   //新建新List集合,用於存放去重后的元素
   List<String> newList = new ArrayList<String>();
   //循環遍歷舊集合元素
   for(int i = 0; i < list.size(); i++ ){
       //判斷新集合是否包含有,如果不包含有,則存入新集合中
       boolean isContains = newList.contains(list.get(i));
       if(!isContains){
           newList.add(list.get(i));
       }
   }
   //把List集合所有元素清空
   list.clear();
   //把新集合元素添加至List集合
   list.addAll(newList);
   return list;
}

上面給大家介紹了四種List集合去重方式。那麼,哪種方式效率是最好的呢?下面就演示一下進行對比。

為了演示方式,隨機生成0-500之間的20000個整数字符串,並存入List集合,並在相應代碼打印相關時間進行對比。其中,隨機生成List集合代碼如下:

/**
* 隨機生成0-500之間的20000個整数字符串,並存入List集合
@return
*/
public static List<String> getRandomList(){
   List<String> list = new ArrayList<String>();
   //隨機生成20000個整数字符串
   for(int i = 1; i <= 20000; i++){
       //任意取[0,500)之間整數,其中0可以取到,500取不到
       int number = new Random().nextInt(500);
       String number_str = "geshan"+number;
       list.add(number_str);
   }
   return list;
}

為了保證List集合元素一致,創建四個List集合,分別對應List去重方式。效率對比代碼如下:

public static void main(String[] args){
   //隨機生成0-500之間的1000個整数字符串List集合
   List<String> list = getRandomList();

   //為了演示四種方式效率,創建四個List集合,保證List集合元素一致
   //方式一List集合
   List<String> oneList = new ArrayList<>();
   oneList.addAll(list);
   //方式二List集合
   List<String> twoList = new ArrayList<>();
   twoList.addAll(list);
   //方式三List集合
   List<String> thirdList = new ArrayList<>();
   thirdList.addAll(list);
   //方式四List集合
   List<String> fourthList = new ArrayList<>();
   fourthList.addAll(list);

   System.out.println("方式一:使用兩個for循環實現List去重");
   System.out.println("原來集合大小:"+oneList.size()+",集合元素>>"+oneList);
   Date oneDateBegin = new Date();
   repeatListWayOne(oneList);
   System.out.println("集合去重大小:"+oneList.size()+",集合元素>>"+oneList);
   Date oneDateEnd = new Date();
   System.out.println("去重所需時間:"+(oneDateEnd.getTime()-oneDateBegin.getTime())+"毫秒");

   System.out.println("方式二:使用HashSet實現List去重");
   System.out.println("原來集合大小:"+twoList.size()+",集合元素>>"+twoList);
   Date twoDateBegin = new Date();
   repeatListWayTwo(twoList);
   System.out.println("集合去重大小:"+twoList.size()+",集合元素>>"+twoList);
   Date twoDateEnd = new Date();
   System.out.println("去重所需時間:"+(twoDateEnd.getTime()-twoDateBegin.getTime())+"毫秒");

   System.out.println("方式三:使用TreeSet實現List去重");
   System.out.println("原來集合大小:"+thirdList.size()+",集合元素>>"+thirdList);
   Date thirdDateBegin = new Date();
   repeatListWayThird(thirdList);
   System.out.println("集合去重大小:"+thirdList.size()+",集合元素>>"+thirdList);
   Date thirdDateEnd = new Date();
   System.out.println("去重所需時間:"+(thirdDateEnd.getTime()-thirdDateBegin.getTime())+"毫秒");

   System.out.println("方式四:利用List集合contains方法循環遍歷去重");
   System.out.println("原來集合大小:"+fourthList.size()+",集合元素>>"+fourthList);
   Date fourthDateBegin = new Date();
   repeatListWayFourth(fourthList);
   System.out.println("集合去重大小:"+fourthList.size()+",集合元素>>"+fourthList);
   Date fourthDateEnd = new Date();
   System.out.println("去重所需時間:"+(fourthDateEnd.getTime()-fourthDateBegin.getTime())+"毫秒");
}

多次運行結果如下:

第一次四種方式運行時間如下:223、10、16、30;

第二次四種方式運行時間如下:164、10、17、43;

第三次四種方式運行時間如下:164、9、16、37;

綜合代碼及運行時間對比,方式二是最好的去重方式,代碼最簡潔、耗時最短。你平時List集合去重,方式用對了嗎?

【精選推薦文章】

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

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

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

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

設計模式之迭代器與組合模式(四)

因為這系列篇幅較長,所以在這裏也不進行任何鋪墊,直奔主題去啦。

利用組合設計菜單

我們要如何在菜單上應用組合模式呢?一開始,我們需要創建一個組件接口來作為菜單和菜單項的共同接口,讓我們能夠用統一的做法來處理菜單和菜單項。換句話說,我們可以針對菜單或菜單項調用相同的方法。

讓我們從頭來看看如何讓菜單能夠符合組合模式的結構:

實現菜單組件

好了,我們開始編寫菜單組件的抽象類;請記住,菜單組件的角色是為恭弘=恭弘=恭弘=叶 恭弘 恭弘 恭弘節點和組合節點提供一個共同的接口。

public abstract class MenuComponent {
   
    public void add(MenuComponent menuComponent) {
        throw new UnsupportedOperationException();
    }
    public void remove(MenuComponent menuComponent) {
        throw new UnsupportedOperationException();
    }
    public MenuComponent getChild(int i) {
        throw new UnsupportedOperationException();
    }
  
    public String getName() {
        throw new UnsupportedOperationException();
    }
    public String getDescription() {
        throw new UnsupportedOperationException();
    }
    public double getPrice() {
        throw new UnsupportedOperationException();
    }
    public boolean isVegetarian() {
        throw new UnsupportedOperationException();
    }

    public abstract Iterator<MenuComponent> createIterator();
 
    public void print() {
        throw new UnsupportedOperationException();
    }
}

讓我們來看菜單類。別忘了,這是組合類圖裡的恭弘=恭弘=恭弘=叶 恭弘 恭弘 恭弘類,它實現組合內元素的行為。

public class MenuItem extends MenuComponent {
 
    String name;
    String description;
    boolean vegetarian;
    double price;
    
    public MenuItem(String name, 
                    String description, 
                    boolean vegetarian, 
                    double price) 
    { 
        this.name = name;
        this.description = description;
        this.vegetarian = vegetarian;
        this.price = price;
    }
  
    public String getName() {
        return name;
    }
  
    public String getDescription() {
        return description;
    }
  
    public double getPrice() {
        return price;
    }
  
    public boolean isVegetarian() {
        return vegetarian;
    }

    public Iterator<MenuComponent> createIterator() {
        return new NullIterator();
    }
 
    public void print() {
        System.out.print("  " + getName());
        if (isVegetarian()) {
            System.out.print("(v)");
        }
        System.out.println(", " + getPrice());
        System.out.println("     -- " + getDescription());
    }

}

我們已經有了菜單項,還需要組合類,這就是我們叫做菜單的。別忘了,此組合類可以持有菜單項或其他菜單。

public class Menu extends MenuComponent {
    Iterator<MenuComponent> iterator = null;
    ArrayList<MenuComponent> menuComponents = new ArrayList<MenuComponent>();
    String name;
    String description;
  
    public Menu(String name, String description) {
        this.name = name;
        this.description = description;
    }
 
    public void add(MenuComponent menuComponent) {
        menuComponents.add(menuComponent);
    }
 
    public void remove(MenuComponent menuComponent) {
        menuComponents.remove(menuComponent);
    }
 
    public MenuComponent getChild(int i) {
        return menuComponents.get(i);
    }
 
    public String getName() {
        return name;
    }
 
    public String getDescription() {
        return description;
    }

  
    public Iterator<MenuComponent> createIterator() {
        if (iterator == null) {
            iterator = new CompositeIterator(menuComponents.iterator());
        }
        return iterator;
    }
 
 
    public void print() {
        System.out.print("\n" + getName());
        System.out.println(", " + getDescription());
        System.out.println("---------------------");
    }
}

因為菜單是一個組合,包含了菜單項和其他的菜單,所以它的print()應該打印出它所包含的一切。如果它不這麼做,我們就必須遍歷整個組合的每個節點,然後將每一項打印出來。這麼一來,也就失去了使用組合結構的意義

所以,print還得進行優化,如下:

public void print() {
    System.out.print("\n" + getName());
    System.out.println(", " + getDescription());
    System.out.println("---------------------");
 
    Iterator<MenuComponent> iterator = menuComponents.iterator();
    while (iterator.hasNext()) {
        MenuComponent menuComponent = iterator.next();
        menuComponent.print();
    }
}

看到上面了沒,我們用了迭代器。用它遍歷所有菜單組件,遍歷過程中,可能遇到其他菜單,或者是遇到菜單項。由於菜單和菜單項都實現了print,那我們只要調用print即可。

開始測試數據之前,我們了解一下,在運行時菜單組合是什麼樣的:

開始運行我們的測試程序啦:

public class MenuTestDrive {
    public static void main(String args[]) {

        MenuComponent pancakeHouseMenu = 
            new Menu("PANCAKE HOUSE MENU", "Breakfast");
        MenuComponent dinerMenu = 
            new Menu("DINER MENU", "Lunch");
        MenuComponent cafeMenu = 
            new Menu("CAFE MENU", "Dinner");
        MenuComponent dessertMenu = 
            new Menu("DESSERT MENU", "Dessert of course!");
  
        MenuComponent allMenus = new Menu("ALL MENUS", "All menus combined");
  
        allMenus.add(pancakeHouseMenu);
        allMenus.add(dinerMenu);
        allMenus.add(cafeMenu);
  
        pancakeHouseMenu.add(new MenuItem(
            "K&B's Pancake Breakfast", 
            "Pancakes with scrambled eggs, and toast", 
            true,
            2.99));
        pancakeHouseMenu.add(new MenuItem(
            "Regular Pancake Breakfast", 
            "Pancakes with fried eggs, sausage", 
            false,
            2.99));
        pancakeHouseMenu.add(new MenuItem(
            "Blueberry Pancakes",
            "Pancakes made with fresh blueberries, and blueberry syrup",
            true,
            3.49));
        pancakeHouseMenu.add(new MenuItem(
            "Waffles",
            "Waffles, with your choice of blueberries or strawberries",
            true,
            3.59));

        dinerMenu.add(new MenuItem(
            "Vegetarian BLT",
            "(Fakin') Bacon with lettuce & tomato on whole wheat", 
            true, 
            2.99));
        dinerMenu.add(new MenuItem(
            "BLT",
            "Bacon with lettuce & tomato on whole wheat", 
            false, 
            2.99));
        dinerMenu.add(new MenuItem(
            "Soup of the day",
            "A bowl of the soup of the day, with a side of potato salad", 
            false, 
            3.29));
        dinerMenu.add(new MenuItem(
            "Hotdog",
            "A hot dog, with saurkraut, relish, onions, topped with cheese",
            false, 
            3.05));
        dinerMenu.add(new MenuItem(
            "Steamed Veggies and Brown Rice",
            "A medly of steamed vegetables over brown rice", 
            true, 
            3.99));
 
        dinerMenu.add(new MenuItem(
            "Pasta",
            "Spaghetti with Marinara Sauce, and a slice of sourdough bread",
            true, 
            3.89));
   
        dinerMenu.add(dessertMenu);
  
        dessertMenu.add(new MenuItem(
            "Apple Pie",
            "Apple pie with a flakey crust, topped with vanilla icecream",
            true,
            1.59));
        dessertMenu.add(new MenuItem(
            "Cheesecake",
            "Creamy New York cheesecake, with a chocolate graham crust",
            true,
            1.99));
        dessertMenu.add(new MenuItem(
            "Sorbet",
            "A scoop of raspberry and a scoop of lime",
            true,
            1.89));

        cafeMenu.add(new MenuItem(
            "Veggie Burger and Air Fries",
            "Veggie burger on a whole wheat bun, lettuce, tomato, and fries",
            true, 
            3.99));
        cafeMenu.add(new MenuItem(
            "Soup of the day",
            "A cup of the soup of the day, with a side salad",
            false, 
            3.69));
        cafeMenu.add(new MenuItem(
            "Burrito",
            "A large burrito, with whole pinto beans, salsa, guacamole",
            true, 
            4.29));
 
        Waitress waitress = new Waitress(allMenus);
   
        waitress.printVegetarianMenu();
 
    }
}

結果這裏就不附上了,請大家自行去跑代碼實現吧。相信你們又對組合模式也已經有了一個大概了吧。下一篇,還有更犀利的,組合迭代器等着我們。小編馬上回去搞起來,安排上。

愛生活,愛學習,愛感悟,愛挨踢

【精選推薦文章】

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

想要讓你的商品在網路上成為最夯、最多人討論的話題?

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

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

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

ASC19最新戰況:北航打破HPL基準測試賽會紀錄!

ASC19最新戰況:北航打破HPL基準測試賽會紀錄!

2019-04-23 23:32    原創  作者: 謝濤 編輯:
0購買

  【IT168現場報道】今天(4月23日)是全球矚目的ASC19全球總決賽第三天,經過前两天的系統搭建與調試工作后,20支隊伍進入了正式競賽階段,向總冠軍寶座發起最後衝刺。

  根據賽程,今天所有參賽隊伍需要完成的項目包括超級計算機性能基準測試HPL&HPCG、超級團隊對抗賽賽題Fluidity以及全球氣候變化模式CESM——其中,CESM是今年“e Prize計算挑戰獎”的指定賽題。

  上午十二時左右,組委會公布了第一項賽題HPL的成績,在3000瓦功耗約束下,北京航空航天大學代表隊以每秒50.21萬億次浮點運算的成績打破了賽會紀錄,在HPL賽題單項成績上排名第一。

  HPL是國際通用的超級計算機浮點性能基準測試程序,是全球超算TOP500榜單評比的重要依據,主要考察參賽隊伍對硬件平台的浮點計算性能優化能力。ASC競賽的HPL計算性能測試有嚴格的規定,各參賽隊伍需要在功耗不高於3000W的約束下,採用組委會統一提供的超算節點、高速網絡和自行配置加速卡等設備,完成超算系統搭建。

  HPL測試側重於系統的整體運行能力和峰值性能,這個項目考察參賽隊伍在搭建系統、性能優化和配置選擇上的綜合能力。為了取得更好的成績,參賽隊伍需要從超算系統體繫結構、多級存儲一致性、高速網絡、算法優化等不同角度,進行全方位的深入研究,在不同方案之間進行抉擇,通過反覆優化和測試獲得更高的運算性能。

  在這一項目上,歷屆ASC大賽總能給我們帶來驚喜,充分體現了“百尺竿頭,更進一步”的積極進取精神。ASC15,來自新加坡的南洋理工大學以11.92萬億次浮點運算/秒的成績打破上一年的紀錄;ASC16,該紀錄被浙江大學以12.03萬億次浮點運算/秒的成績刷新;ASC17,濰坊學院代表隊創下31.7萬億次浮點運算/秒的新紀錄;ASC18,也就是去年,台灣清華大學獲得42.99萬億次浮點運算/秒的成績,再次刷新紀錄。

  今年,北京航空航天大學則以50.21萬億次/秒的驚人成績又一次打破賽會紀錄,在現場引起一片呼聲。該代表隊設計了“3機12卡”的異構超算系統,共採用3台浪潮AI超算服務器NF5280M5配置12塊NVIDIA Tesla系列V100加速卡。值得一提的是,北京航空航天大學在預賽期間就曾獲得了第一名的好成績。

  根據ASC19競賽組委會的介紹,明天(4月24日)將公布正式競賽第一天其餘賽題的成績,包括HPCG、Fluidity、CESM。此外,參賽隊伍還將完成人工智能賽題人臉圖像超分辨率(Face SR)、中國科學家研發的第三代基因測序組裝軟件wtdbg以及一個神秘應用賽題。

  在這些賽題上,各位參賽隊伍又將給我們帶來哪些驚喜呢?大家一起期待明天的結果吧!

  4月24日下午,第21屆國際超算高峰論壇將在大連理工大學隆重舉行。全球超級計算機排行榜TOP500提出人、ASC競賽專家委員會主席、田納西大學傑出教授Jack Dongarra,憶阻器提出人加州大學伯克利分校教授Leon Chua(蔡少棠)等多位知名國際國內專家將出席並進行主題報告與分享,與參會嘉賓就超算話題展開思想碰撞。

  IT168將對本次大賽進行全程報道,了解大賽更多信息,請持續關注:http://zt.itpub.net/topic/ASC19/

, ,

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

【精選推薦文章】

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

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

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

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

采埃孚coPILOT助力提升安全性與駕駛舒適性

采埃孚coPILOT助力提升安全性與駕駛舒適性

2019-04-24 11:46    原創  作者: 陶然 編輯:
0購買

  近日,采埃孚宣布推出采埃孚coPILOT智能高級駕駛輔助系統(ADAS),助力提升安全性和駕駛舒適性。藉助AI的強大功能同時配備全面的傳感器組,車輛能夠執行各類自動駕駛功能。在高速公路行駛時,該輔助系統的功能尤為突出。此外,采埃孚coPILOT可通過語音指令進行操作,識別交通狀況,感知車輛操控並監控駕駛員,並且能夠通過主動控制干預來幫助預防危險情況發生。采埃孚coPILOT基於采埃孚ProAI中央計算機和NVIDIA DRIVE平台,專為量產而設計,預計將於2021年開始供貨。

  距離采埃孚和NVIDIA宣布“采埃孚ProAI成為首個運行NVIDIA DRIVE軟件的系統”僅三個月後,采埃孚coPILOT就在上海國際汽車工業展覽會上首次亮相。兩家高科技公司共同推出這一極具吸引力的 “L2+級”自動駕駛輔助系統,可提高乘用車的安全性和駕駛舒適性。

  采埃孚先期開發工程部門負責人兼采埃孚風險投資公司(Zukunft Ventures GmbH)總經理TorstenGollewski表示:“采埃孚coPILOT配備了人工智能、360度全方位傳感器組、功能強大的采埃孚ProAI中央計算機以及NVIDIA DRIVE平台,可實現高於常規L2級系統的駕駛和安全功能。這使我們能夠實現更高性能的半自動駕駛。”

  采埃孚coPILOT演示車將在上海車展首次亮相,詳細展示其功能範圍以及其為駕駛員所提供的舒適性與安全性:車輛可自主執行特定的駕駛操作,例如在適當情況下進出高速公路。對於相對輕鬆的高速公路駕駛,采埃孚coPILOT將先進的巡航控制系統與主動轉向輔助功能和車道保持輔助功能相結合。此外,采埃孚coPILOT能夠主動變道、穿行和並道,還能持續分析車輛周圍環境,識別行人、對面車輛和交叉路口。

  采埃孚coPILOT配備了相應的傳感器和功能,能夠監控駕駛員並在發生潛在危險情況時觸發警告。例如,當發生駕駛員注意力不集中、幾乎完全未將注意力放在路面交通上或显示出瞌睡跡象等狀況時,警告將會被觸發。此外,采埃孚coPILOT還能夠進行智能路線引導,包括“MyRoute”這一能夠識別重複路線的地圖功能。該系統還配備了語音識別功能,駕駛員能夠通過語音指令便捷地啟用並操作駕駛員輔助功能;在駕駛員想要手動駕駛時,也可以通過語音指令對其禁用。

  在演示車輛中,搭載的采埃孚傳感器組包括一個前置雷達、四個角雷達以及八個攝像頭。其中,兩個攝像頭向前,一個向後,還有兩個分別集成在兩個側鏡中,一個負責監控駕駛員。

  為評估整套傳感器組實時收集的大量數據,高性能處理能力必不可少。這正是采埃孚coPILOT所採用的第二代采埃孚ProAI中央計算機的用武之地:以NVIDIA DRIVE Xavier處理器的高性能、高能效計算能力為核心,采埃孚ProAI可集成並完全控制預訓練算法,實現所有駕駛員輔助功能。該系統具有靈活性、可擴展性且能夠無縫更新。汽車製造商還可以根據需求添加自主開發或采埃孚開發的其他特性和功能。

  采埃孚ProAI產品系列包括從L0級到L5級的四種型號,覆蓋了整個自動駕駛運行範圍。高端型號采埃孚ProAIRoboThink每秒運行速度高達600萬億次(600 teraOPS),是目前移動出行領域功能最強大的AI超級計算機。

  高級駕駛員輔助 隨時隨地,隨您所需

  SAE L3級高度自動駕駛在許多國家和地區暫未被允許,因此采埃孚coPILOT提供SAE L2級半自動駕駛,要求駕駛員持續監控交通狀況。但采埃孚和NVIDIA所提供的L2+級技術更加強大,能夠起到可靠且便利的輔助駕駛作用,如同“私人駕駛助手”一般為駕駛員提供支持。

  “我們相信,像采埃孚coPILOT這樣的擴展型L2+級系統對製造商來說非常具有吸引力:鑒於其廣泛的功能,它在安全性和駕駛舒適性方面為消費者提供了明顯的附加值,且在價格方面也很具有競爭力,”TorstenGollewski如是說。

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

【精選推薦文章】

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

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

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

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

​解讀浪潮“元腦”:不是AI大腦,欲引爆AI應用的工業化量產

​解讀浪潮“元腦”:不是AI大腦,欲引爆AI應用的工業化量產

2019-04-24 15:26    來源:廠商稿  作者: 廠商動態 編輯:
0購買

  文章來源:雲科技時代

  2016年以來,AI人工智能遍地開花。以神經元網絡為代表的深度學習成為了風靡大街小巷的熱詞,人工智能和深度學習技術創業公司如雨後春筍般湧現,各種深度學習開源框架、人工智能大腦和服務以及國際AI大賽跑分成為常態。進入2019年,全國共有35所高校獲首批“人工智能”新專業建設資格、96所高校獲批“智能科學與技術”專業、101所高校獲批“機器人工程”專業,人工智能也入選了《普通高中信息技術課程標準》新課標。

  儘管全民對於人工智能的熱情高漲,但人工智能的產業化以及在各產業和行業中推進人工智能應用,仍面臨着重重阻礙。“當前人工智能計算的業態還是相當分散的,需要買不同的機器、服務和加速卡等,還要自己配置人工智能應用環境、搭建人工智能框架,處理數據、模型和計算的管理、共享、調度等,這對客戶來說太複雜了,不知道怎麼做。”浪潮AI與HPC總經理劉軍在4月16日2019浪潮雲數據中心合作夥伴大會(IPF2019)上接受採訪時坦言,“合作夥伴更怕在幾十種選擇中組合,人工智能的生意很難做。”

  2018年Gartner與中國信通院合作的《2018世界人工智能產業發展藍皮書》也指出:人工智能仍處於早期採用階段,僅有4%的被調研企業已經投資並部署了AI技術,許多企業還處在正在考慮採用AI和規劃AI的階段。在Gartner的AI技術成熟度曲線中,仍有許多AI的相關技術都擁堵在期望膨脹期,要過渡到生產實施階段仍非常困難。此外,AI技術的碎片化十分嚴重,據藍皮書統計在中國市場就有上千家各類AI技術供應商。

  在IPF2019大會上,浪潮發布了“元腦”:打包了計算、算法、框架、PaaS以及服務的一站式人工智能解決方案交付。劉軍表示,“元腦”不是人工智能“大腦”,而是“大腦”的核心,浪潮希望與合作夥伴一起,基於“元腦”快速“量產”各行業的人工智能應用和“大腦”。劉軍表示,“元腦”的意義不亞於當年的福特T型車,福特並不是汽車的發明者,但T型車開創了汽車工業化時代,浪潮也希望“元腦”能開創人工智能應用的工業化時代。

  

  浪潮發布“元腦”

  1908年福特T型車的啟示

  1908年是人類歷史上一個重要的年份,這一年福特推出了歷史上著名的T型車。1903年成立的福特公司,並不是汽車的發明者。從1886年的世界上第一輛四輪汽車,到1893年發明了化油器以及1896年發明了石棉製動片和轉向盤等,汽車的結構越來越趨向現代汽車。但1908年的福特T型車,則首次讓汽車以低廉的價格走入了尋常百姓家,T型車不僅開創了現代汽車工業,更成就了“車輪上的國家”——美國。

  T型車的生產製造過程,開創了革命性的流水裝配線,代替了之前的個體手工製作方式。T型車是世界上第一種以大量通用零部件進行大規模流水線裝配作業而生產製造出來的汽車,1913年到1914年經過優化的流水裝配線可以在93分鐘內生產一輛汽車,超過同期其它所有汽車生產商生產能力的總合。最開始,T型車以競爭車型1/3的價格推動了汽車的普及,1920年後進一步降低到其它競爭車型1/10價格,讓普通生產線工人也能購買屬於自己的汽車。直到1927年停產,共生產了1500萬輛T型車,這一紀錄保持了近一個世紀。

  浪潮“元腦”就是福特T型車這樣的定位:不僅要開創人工智能應用的工業化量產,還要創造T型車這樣的爆款產品。此前,浪潮已經推出了一個AI爆款產品,這就是2017年推出的AGX-2 2U GPU服務器。2017年5月,浪潮推出了第一版的AGX-2 2U GPU服務器,當時是全球首款在2U空間內高速互聯集成8顆最高性能GPU加速器的服務器,2018年3月更新支持了最新的NVIDIA架構,成為全球性能最高的AI 2U服務器。儘管後來浪潮又發布了超級AI服務器AGX-5,但AGX-2仍然是受到廣大用戶喜歡的爆款產品。

  在運營商領域:浪潮AGX-2中標中國電信人工智能服務器集中採購,份額高達40%,大規模用於智能營業廳、智能推薦等場景人工智能訓練;中國移動子公司咪咕文化科技有限公司(簡稱:咪咕)2018年GPU服務器採購項目中,浪潮獲得億元採購訂單一半份額,為咪咕提供涵蓋創新AI服務器AGX-2在內的AI解決方案。在金融領域:AGX-2幫助招商銀行建設了先進的大數據智能平台以及多種人工智能應用場景。在視頻物聯等領域:海康威視的視頻人工智能訓練平台100%基於AGX-2,而大華以AGX-2為核心的人工智能解決方案,在智慧城市、雪亮工程、平安城市等多個領域落地。

  有了前面的這些市場基礎,在2019年,浪潮希望進一步高度集成AI技術、產品和服務於“元腦”,用“元腦”打開人工智能應用的工業化生產變革。

  浪潮“元腦”的構成

  什麼是浪潮“元腦”呢?具體來說包括以下組成部分:

  · 超強AI計算系統:通過浪潮人工智能計算平台、人工智能超高速計算加速卡、極低延遲RDMA網絡與超高帶寬并行存儲,共同提供極致人工智能計算性能;

  · 敏捷AI Paas平台:由極致優化的AI資源平台、極速流程化AI開發平台、開放兼容的AI生態平台和秒速構建AI軟件棧。最新開發的人工智能PaaS平台AIStation面向人工智能企業訓練場景,可實現容器化部署、可視化開發、集中化管理等,有效打通開發環境、計算資源與數據資源,提升開發效率;

  · 高效的Auto ML Suite:最新開發的AutoML Suite可實現非專業人員亦能通過極少操作構建網絡模型並獲得高精度,極大降低了人工智能開發、應用的門檻和成本。在2018年的NIPS 的自動機器學習挑戰賽中,浪潮與北京郵電大學、中南大學團隊合作,獲得自動機器學習領域的國際頂尖賽事的全球第三佳績。

  · 整合一體化交付:計算/存儲/網絡一體化、內置AI Paas平台、內置建模優化工具、預配置系統調優。

  

  中國工程院院士、浪潮集團執行總裁王恩東

  IPF 2019大會的主題為“智慧凝聚”,中國工程院院士、浪潮集團執行總裁王恩東的大會主題演講題目為《人工智能計算 未來核心動力》以及提出了人工智能三大趨勢——融合、開放、敏捷,這兩大主題和三大趨勢都透露了浪潮要“凝聚”過去幾年在人工智能方面的重大投資,並希望用融合、開放和敏捷的人工智能產品及解決方案拉升数字經濟大勢的想法和思路。而浪潮“元腦”就是基於融合、開放和敏捷的人工智能工業化生產線裝配出來的“T型車”。

  激進拉升千億市場到萬億

  “2018年,浪潮與合作夥伴一起創造了諸多令人振奮的成績,見證了服務器產業的快速發展,也體驗了人工智能產業的爆髮式增長。”王恩東在IPF 2019上如是表示。他認為,人工智能發展能為中國經濟帶來巨大增長機遇,據有關預測,到2035年人工智能領域的經濟總量將佔所有經濟的20%,所以“計算力就是生產力,而人工智能計算則是核心計算力”。

  在人工智能時代,浪潮認為有兩大市場:一個是千億的人工智能產業市場,另一個是萬億的產業人工智能市場。一方面,浪潮通過技術產品化、產品市場化,推動AI科技公司的技術成果轉化,也就是AI產業化的過程,創造和實現千億市場價值。另一方面就是產業AI化,即在傳統產業和行業的轉型和升級中,行業ISV和分銷渠道商鏈接着眾多客戶,浪潮通過生態協作方式,把AI計算平台、AI科技公司的技術能力和ISV的行業方案進行整合,通過分銷渠道交付到各行各業,從而撬動萬億級市場。

  那麼,如何普及人工智能計算這種先進的新型生產力?生產力有三大要素:生產力、生產工具和生產資料。其中,浪潮“元腦”就已經交付了先進了生產工具。浪潮集團副總裁彭震強調,浪潮“元腦”提供了一體化的解決方案,把浪潮的人工智能計算能力、存儲能力、網絡能力以及人工智能PaaS平台、AutoML Suite自動算法調優工具等集合在一起,通過浪潮專家的預配置、預調優、預集成,實現了完整平台級解決方案。

  

  浪潮集團副總裁彭震

  接下來就需要把浪潮“元腦”這樣的先進生產工具交付到更多的勞動者手中,讓他們在數據這種新型“生產資料”上,創造更多新型的人工智能應用。為了達成這一目標,光依靠浪潮自己遠遠不夠,還需要動員龐大渠道生態合作夥伴體系。截止至2018年底,浪潮共有9000多家合作夥伴,人工智能百強超過80家與浪潮建立了合作關係;合作夥伴業務增長116%,分銷夥伴增長124%;浪潮與合作夥伴開發聯合解決方案400多個,其中人工智能聯合方案20多個。

  為了把合作夥伴帶入人工智能時代,讓更多的合作夥伴儘早入場人工智能,劉軍表示浪潮將有可能採取激進的策略,包括激進的價格策略以激發整體的人工智能大市場。劉軍強調,人工智能產業和產業人工智能化都處於初期階段,浪潮在這個階段的策略不是自己實現更多的營收,而是要拉動合作夥伴都能獲益。儘管很多合作夥伴對於如何做人工智能生意還有很大的困惑,但劉軍認為“不要在岸上看,一起下來‘游泳’”。

  當然,浪潮也做好了充分的準備。浪潮集團渠道管理部總經理王峰在IPF 2019上提出了浪潮合作生態2.0,將要扮演的三個新角色:生態孵化器、AI試驗場和AI放大器。生態孵化器指的是浪潮將積極幫助AI技術公司、行業ISV以及分銷商,完成AI產品、應用和市場孵化,特別是針對區域行業客戶的AI場景,以及培養更多的AI人才;AI試驗場,指的是浪潮“元腦”與AI技術公司針對不同AI場景應用的聯合方案開發、預裝與轉售,通過浪潮方案創新平台InCloud Lab與行業ISV完成AI產品和方案的POC測試和驗證,以及通過浪潮分銷業務體系面向中小行業客戶的AI應用一體化產品;AI放大器,指的是浪潮將與合作夥伴、AI算法夥伴、AI場景應用+行業ISV夥伴一起,完成多行業的複製、推動多產業的AI化,其中包括面向全行業的行業標桿客戶AI應用以及面向區域市場客戶的一體化AI應用方案產品。

  浪潮在AI渠道總體上的2019目標是:發展 200家AI算法夥伴,每個夥伴要有面向行業場景的算法軟件,至少發布一個AI場景應用、培養AI場景應用認證工程師;發展400家AI方案集成夥伴 ,每個夥伴要有行業應用解決方案、行業AI應用整合和交付能力,要落地三個行業客戶AI應用方案、舉行一次行業客戶AI應用推薦、培養AI行業應用認證工程師;以及80家分銷商和2400經銷商組成的AI方案產品銷售夥伴,每個夥伴要有區域客戶AI應用產品交付和服務能力,每個分銷商要激活30家AI產品銷售經銷商以及通過AI應用產品銷售工程師認證。

  2019年,浪潮渠道還將特別聚焦計算機視覺、語音識別、自然語言識別、量化交易等四大基礎AI應用場景,集中發展100家以上算法合作夥伴,幫助400家以上的行業ISV建立AI能力,在金融、企業、通信、教育、零售、醫療、媒體和互聯網等8大行業落地客戶。

  總體來說,IPF 2019拉開了人工智能應用的工業化時代,是浪潮過去幾年在人工智能計算領域投資的大匯總和高度凝練,是對渠道生態合作夥伴的總動員,其意義不亞於浪潮在2015年所提出的“計算+”戰略及“硬件重構”和“軟件定義”核心。在智慧時代,AI與產業深度融合的大幕已經拉開,“融合、開放、敏捷”將要定義新的計算力——人工智能計算。

,

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

【精選推薦文章】

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

想要讓你的商品在網路上成為最夯、最多人討論的話題?

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

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

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

冠軍倒計時:參賽隊員眼中的ASC19

冠軍倒計時:參賽隊員眼中的ASC19

2019-04-24 20:34    原創  作者: 謝濤 編輯:
0購買

  【IT168 現場報道】4月24日,ASC19全球總決賽第四天。經過緊張的两天系統搭建與調試后,來自全球各大高校的百位新生代“超算之星”們,將在明天迎來他們最後的答案。

  在這段時間里,這些熱愛超算技術的大學生們在七大賽題上同台競技、各展風采,也在超級團隊對抗賽中與其他隊伍積極交流、通力合作,共同完成超級賽題。既磨練了自己的專業技能,也與更多志同道合的同學建立了親密聯繫。無論成績好壞,他們都已經在ASC舞台上完成了對自我的挑戰,向更高的未來走去。

  

參賽學生接受採訪

  ASC世界大學生超級計算機競賽是由中國發起的世界最大規模的大學生超算競賽,從2012年至今,已為全球超過1400支參賽隊伍、超過7000 名年輕人才搭建了一個展現自我,相互交流的平台,推動了各國、各地區超算人才培養,以及行業應用與技術研發能力的提升。

  按照大賽規則,20支進入全球總決賽的參賽隊伍,在完成前期的競賽系統搭建與調試后,需要在两天時間內完成超級計算機性能基準測試HPL&HPCG、超級團隊對抗賽賽題Fluidity、全球氣候變化模式CESM、人工智能賽題人臉圖像超分辨率(Face SR)、中國科學家研發的第三代基因測序組裝軟件wtdbg以及一個神秘應用賽題。

  每支參賽隊伍的最終成績將根據HPL、HPCG、CESM、Face SR、wtdbg以及神秘賽題的單項成績進行綜合評定,而超級團隊對抗賽則單獨設置了獎項,不計入最終結果。雖然目前ASC19競賽組委會已公布了HPL、HPCG、CESM的成績,但冠軍最後將花落誰家仍然難以預測——如我們所見,單項賽題的成績並不能代表最終成績。

  今年首次設置的超級團隊對抗賽的結果也已經出爐,中山大學、太原理工大學、香港中文大學、德國埃爾朗根-紐倫堡大學組成的團隊最終獲得了“超級團隊獎”,這四支隊伍將平分總計2萬元的獎金。獎勵只是一方面,更重要的是參賽隊員們與來自其他國家、地區、高校的同學們在完成挑戰賽題的過程中,進行了積極踴躍的溝通,彼此學習、共同提高。

  作為世界最大規模的大學生超算競賽,ASC面向前沿技術領域,無論是近幾年加入的AI賽題,還是今年首次設置的超級團隊對抗賽,大賽每年在賽題設置上都會給人帶來新的驚喜。許多參賽學生都表示,有機會使用行業領先的計算硬件親自動手設計、搭建一台超級計算機,完成極具挑戰性的前沿應用賽題,對他們來說是一個非常寶貴的經驗。

  而同學們在競賽中展現出的進取精神也同樣讓人備受感染,他們在競賽中取得的優秀成績令人驚嘆,在他們身上,我們看到了超算行業的廣闊前景與光明未來。隨着超級計算機從科研、氣象等領域向互聯網、製造等更多行業普及應用,超算已成為驅動科技與產業創新的重要力量。在這之中,超算人才的培養是重中之重,ASC競賽以全球化的影響力,獲得了社會各界的認可。

  明天(4月25日)下午,ASC19總決賽閉幕式暨頒獎儀式將隆重舉行,這些辛苦了四天的參賽隊員們,將迎來屬於他們的高光時刻。

  點擊進入IT168的ASC19賽事報道專區,即可在線觀看閉幕式現場視頻直播。

,

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

【精選推薦文章】

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

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

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

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