天燈惹禍!德國動物園失火 30多隻動物慘被燒死

摘錄自2020年1月2日聯合報德國報導

德國警方表示,一間動物園的猿猴館在跨年夜發生大火,導致30多隻動物死亡,懷疑是天燈惹的禍。

德新社報導,這場大火燒毀克雷菲爾德動物園(Krefeld Zoo)的猿猴館,約30多隻動物命喪火窟,包括黑猩猩、紅毛猩猩、兩隻年長大猩猩,只有兩隻黑猩猩獲救。火災也導致狐蝠和鳥類死亡。

克雷菲爾德動物園距離杜塞道夫約15公里,1日和2日不對外開放。警方懷疑可能是跨年夜當晚,有人放天燈才導致大火,並在該地區發現一些類似的天燈。

調查人員霍普曼(Gerd Hoppmann)說,天燈相當危險,可能會飛行超過一公里。另外,也呼籲在該地區放天燈的人自首。

德國之聲報導,天燈導致幾起死亡火災後,德國北萊茵-西發利亞邦2009年起禁止放天燈。

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

【其他文章推薦】

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

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

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

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

瞄準中國市場 特斯拉 Model X 明年攻陸開賣

美國豪華電動車製造商特斯拉 (Tesla) 電動運動休旅車 Model X 本季正式在美國發表後,預計 2016 年上半年就會進軍中國。   特斯拉北京分部發言人 Gary Tao 在接受專訪時透露了上述訊息,還宣稱特斯拉今年底前要在中國加開 5 至 6 個全新展示間,預計展示車輛的據點有望增加至 15 處,展示新車的位置會在北京、上海、廣州等重點城市。     

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

【其他文章推薦】

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

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

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

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

Ember.js和Vue.js對比,哪個框架更優秀?

本文由葡萄城技術團隊於博客園翻譯並首發

轉載請註明出處:,葡萄城為開發者提供專業的開發工具、解決方案和服務,賦能開發者。

JavaScript最初是為Web應用程序創建的。但是隨着前端技術的發展,大多數開發人員更喜歡使用基於JavaScript的框架。它簡化了你的代碼以及使你能完成更多全棧工作,您幾乎可以在任何框架中使用JavaScript。

使用什麼類型的框架決定了創建應用程序的便捷程度。因此,您必須慎重選擇。在已經足夠複雜的前端環境里,其中兩個框架脫穎而出。我們會在本文中對Ember.js和Vue.js之間進行對比,以幫助你更好的做出判斷。

為什麼要選擇框架?

在開始比較這兩個框架之前,我們應該先來了解下選擇一個框架的決定因素都有什麼。每個開發人員選擇一個框架之前,讓我們看看選擇的理由。

  • 代碼必須簡單易懂。
  • 應以更少的代碼量產出更多的功能。
  • 應提供一個布局合理的工作框架。
  • 是否支持內置路由或外部插件的路由?
  • 應該能夠在頁面加載時傳輸更多數據,從而使頁面成為單頁應用,單頁應用程序使用體驗顯然更好。
  • 在單頁架構中,如果用戶需要共享應用子頁面鏈接,那麼框架應該具有基於URL路由不同功能的能力。
  • 更嚴格的模板選項有助於實現雙向綁定。
  • 不應與任何第三方庫產生衝突。
  • 應該很容易測試框架內的代碼。
  • 應為Ajax調用提供HTTP客戶端服務
  • 文檔也必不可少,應該是完整且最新。
  • 應該與瀏覽器的最新版本兼容。
  • 必須滿足上述條件,便於APP的構建。您必須確保所選擇的框架符合條件。

Vue.js

開發人員總是在尋找新的框架來構建他們的應用程序。主要要求是速度快、成本低。這個框架應該很容易被新開發人員理解並且能夠以更低的成本使用。其他考慮選項還有簡單的編碼方式、健全的幫助文檔等。

在Web應用程序開發中,VUEJS在軟件語言方面結合了很多優點。VUE.JS的體繫結構易於使用。使用VUE.JS開發的應用程序很容易與新的應用程序集成。

VUE.JS是一個非常輕量級的框架。你能很快的下載到它。它也比其他框架快得多。該框架的單文件組件性質也很棒。這個尺寸使它很受歡迎。

同時你可以進一步減少它的體積。使用Vue.js可以將模板和編譯器分離為虛擬DOM。您只能部署只有12 KB的壓縮后的壓縮解釋器。您可以在您的機器中編譯模板。

Vue.js的另一個重要優點是它可以輕鬆地與使用JavaScript創建的現有應用程序集成。使用此框架可以輕鬆地對已經存在的應用程序進行更改。

Vue.js還可輕鬆與其他前端庫集成。您可以插入另一個庫,以彌補此框架中的任何不足。此功能使該工具成為通用工具。

Vue.js使用服務器端渲染流的方法。它使服務器具有較高的響應速度。 你的用戶將很快獲得渲染的內容。

Vue.js非常適合SEO。由於該框架支持服務器端渲染,因此視圖直接在服務器上渲染。便於搜索引擎直接索引到這些網頁內容。

但對你來說最重要的是你可以輕鬆地學習Vue.js。該結構是基本的。即使是新的開發人員,也會發現使用它來構建應用程序很容易。該框架有助於開發大型和小型模板。它有助於節省大量時間。

您可以返回並輕鬆檢查錯誤。除了測試組件外,您還可以返回並檢查所有狀態。就任何開發人員而言,這是另一個重要功能。

Vue.js也有非常詳細的文檔。它有助於為你快速上手開發應用程序。您可以使用HTML或JavaScript的基本知識來構建網頁或應用。

  • Vue.js它能與其他應用程序集成
  • Vue.js輕巧且快速。通過部署解釋器,就可以使它更輕量
  • 您可以將編譯器和模板分離為虛擬DOM。
  • 得益於便於集成的優點,您可以使用它來對現有應用進行更改
  • 豐富的庫和組件為你的應用程序帶來更多可能
  • 應用能夠快速響應。
  • 服務器端渲染還有助於使搜索引擎排名更高。
  • 結構簡單。易於任何新開發者使用
  • 您可以返回檢查並更正錯誤。
  • 您可以檢查所有現有狀態。
  • 詳細的文檔有助於快速構建網頁或應用程序。

Ember.js

Ember.js是MVVM模型框架。它是開源軟件。該平台主要用於創建複雜的多頁面應用程序。它保持最新的特性,並不會丟棄任何舊功能。

通過這個框架,您必須嚴格遵循框架的體繫結構。JS框架是非常嚴密的組織。所以它降低了和其他框架可能提供的靈活性。

它的平台和工具有非常完善的控制系統。您可以使用提供的工具將其與新版本集成,以避免使用過時的API。

您可以輕鬆了解Ember的API。他們也很容易工作。您可以簡單,直接地使用高度複雜的功能。

當類似的工作一起處理時,性能更好。它創建了相似的綁定和DOM更新,讓瀏覽器一次性處理它們,以提高性能。這樣則將避免為每個工作重複計算,以免浪費大量時間。

因為Promise無處不在,所以你可以以簡單的方式編寫代碼和模塊,使用 Ember 的任何 API。

同時Ember也有一個很不錯的上手指南。上面記錄著API的使用方式。Ember明確了一般應用程序的組織和結構,因此你將不會犯任何錯誤。你將不可能在不必要的情況下使程序複雜化。Ember的模板語言是Handlebar,Handlebar簡潔的語法可以使你可以輕鬆閱讀和理解模板,同樣的也能使頁面加載速度變得更快。使用Handlebar另一個優勢是,不必每次在頁面上添加或刪除數據時都更新模板。語言本身將自動為你完成。

最後,Ember.js擁有一個活躍的社區,可以定期更新框架並從而促進向後兼容

  • Ember.js是適用於複雜結構的多頁應用程序的MVVM模型開源框架。
  • 同時提供了最新功能和舊的功能。
  • 它有一個非常嚴密的結構框架,不能提供太高的靈活性
  • 非常完善的控制系統可幫助你與新版本完美集成。
  • 對避免使用過時的API版本有着嚴格的指導。
  • Ember的API可幫助您以簡單的方式使用複雜的功能
  • 該框架提供高效的運算機制,以保證運行效率
  • Promise可讓你使用Ember.js的任何API來編寫模塊化和簡單的代碼。
  • Ember.js是一個完全加載的前端框架。
  • 框架穩定,因為所有組件都具有相同的功能和屬性。
  • 具有明確定義的限制,可防止您使應用程序複雜化
  • Handlebar使你可以輕鬆閱讀和理解模板。並且還有助於更快地加載模板。
  • 每次添加或刪除數據時,Handlebar將確保更新模板。
  • Ember.js有一個活躍的社區,可以定期更新框架並從而促進向後兼容。

Ember.js Vue.js對比

當你需要將原有應用程序向現代框架上遷移時,Vue.js可以為您提供幫助。它結合了其他框架的許多優點。Vue.js面向開發過程的框架,所以沒有提供現成的界面元素庫。但是,許多第三方社區庫可以為您提供幫助。

Ember.js為您提供了一個值得信賴的成熟框架。當你的開發團隊規模很大時,這個框架比較合適。由於MVVM結構所致,它使每個人都可以為項目做出貢獻。

Vue.js可以幫助你兼容應用程序中不同類型的語法,它有助於輕鬆編寫代碼,同時由於後端渲染,它也是一個對SEO友好的框架。而Ember是一個完全加載的前端框架,可以幫助您非常快速地開發應用程序。但是它不適合開發小型項目。

很難說誰比誰更具優勢。選擇哪個框架將取決於你實際參与的項目類型是什麼。兩者都有其優缺點,所以我為大家總結了一張表,也許它能幫助你更好地進行對比:

 

總結

選擇什麼,取決於您要開發的應用程序。這兩個框架都在發展中。兩者也都在更新。

雖然Ember是一個全棧框架,但它太複雜了,很難應用於較小的項目。而Vue.js憑藉著輕盈的體量,易於上手的特點,使開發應用程序變得異常高效,從而獲得了不少行業的開發者的青睞。

此外,無論選擇什麼類型的框架,葡萄城都為廣大開發者提供了兼容各類框架的開發組件,例如:和 ,為開發者賦能。

 

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

【其他文章推薦】

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

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

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

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

越南向寮國購電 盼解缺電隱憂

摘錄自2020年1月6日中央社河內報導

越南電力集團(EVN)4日與寮國供電業者簽署5項購電合同,預計2021年起將從寮國進口數十億度電,希望解決國內缺電隱憂。

越南近年來經濟發展迅速,現今隨著美中貿易戰而掀起外商轉向越南投資的浪潮,加上經濟發展依賴能源密集的製造業,使境內電力需求量日益增加。

越南正面臨兩項潛在的能源危機。一是發電能量不足,二是中國對越南鑽探離岸石油及天然氣的動作強力施壓。

越南工商部表示,2021年起越南恐將嚴重缺電,因為建設新電廠的速率趕不上電力需求增長。缺電可能使外資卻步,對從美中貿易戰受惠最多的越南形成不小隱憂,電力需求將於2021年超出供給,因為許多越南能源計畫延宕而使2021至2025年間缺電情況最嚴重,每年缺口可達70億至80億度或千瓦小時(kWh)。

「民智報」網站6日報導,越南電力集團與寮國Phongsubthavy和Chealun Sekong兩家供電集團簽署電力銷售合同,向由這2家集團運作的5個水力發電廠購買電力,其中寮國2號南空水力發電廠(Nam Kong 2)自2021年開始每年向越南出口2.631億度,其餘4個發電廠2022年起每年向越南輸送2.04億至4.2774億度。

越南2019年電力需求量為2400億度,與2018年同期相較,增加8.9%;預計今年電力需求量增至2620億度。

 

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

【其他文章推薦】

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

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

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

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

昶洧純電動原型車 將於法蘭克福車展亮相

  宣稱性能可媲美特斯拉的台灣品牌純電動車,由昶洧設計製造的 Thunder Power 品牌,即將現身今年德國法蘭克福車展。   自許在研發「四輪電腦」的昶洧,純電動車選定在今年德國法蘭克福車展曝光,展出車款 5-passenger RWD sedan 的設計,是以「Timeless『Zen』,Simple、Concise、Flexible but Sharp」永恆禪風、極簡、精煉、靈活敏銳為核心精神。   昶洧電動車除 Zagato 負責造型設計及擬具整車開發計畫的評估報告外,還與歐洲、BOSCH、Dallara、CSI 等名車設計工程公司,進行技術開發,共同打造。   昶洧表示,原型車目前已可達到只需充電 30 分鐘即可行駛 200 公里以上,充飽電至少可行駛 700 公里,及車身平台及模組化平台的概念,未來一系列車型包括轎車、運動休旅車(SUV)、跨界休旅車(Crossover)、中小型房車(Compact)都可共用車身平台。

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

【其他文章推薦】

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

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

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

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

卜時明餐|記一次項目開發經歷

卜時明餐:校園餐廳人流量實時監測系統

做了一兩周,這個項目應該要告一段落了
這幾周每天肝到深夜,也挺開心的啊,和小夥伴完美配合,做出成品后還是很有成就感。
把這學期學的數據庫啊、java、計算機網絡都實際用到了
簡單記錄一下這次項目經歷。

大概是這樣子的

P的視頻

編造的背景

校園餐廳 中午、晚餐吃飯學生驚人的多!
每次排隊時間超長煩惱至極,心情不愉。。
校園兩餐廳距離遙遠,美食遙不可及,無法實時觀測人數
排隊浪費零碎時間

虛構的功能

幫助學生和在校教師合理規劃用餐時間,避開人流高峰。
(校園餐廳各個樓層人流實時監測,實時刷新每個窗口人數,實時通過小程序查看每個窗口的用餐情況)

花里胡哨的技術棧

深度學習:Tensorflow + yolov3
後端:java、SpringBoot
前端:微信小程序
數據庫:Mysql
服務器:ubuntu

前端

用戶端:微信小程序
展示餐廳、熱門窗口實時人數,菜譜推薦。
[]

深度學習算法

Tensorflow + yolov3物體識別
小夥伴開發的
二餐二樓自助餐窗口人流識別

數據庫

第一次真正意義上玩linux系統,部署了mysql數據庫

還設計了很正經的數據庫ER圖,真的把這學期學到的知識用上了。。

後端

最後就是後端了,用java寫的(也是這學期學的呀。。)
用了SpringBoot框架 + JDBC操作數據庫;
其實和現在學的Tomcat+sevlert+JDBC一樣的操作。

架構圖

怎麼把前端、後端、深度學習物體識別、數據庫連接起來呢?
首先是,攝像頭記錄餐廳實時視頻狀況,傳給yolov3物體識別服務器(小夥伴的筆記本),模型識別出實時人數,(通過TCP/IP協議)連接阿里雲服務器部署的數據庫,寫入實時數據
然後是用戶端,用戶玩手機打開微信小程序,會發起Http請求給後端,後端拿到並解析Http數據報后,向服務器上的數據庫獲取實時人數數據,返回給微信小程序,微信小程序渲染數據就可以了。

差不多就這樣

最後放上倆小夥伴丑照,和我帥氣的壁紙屏保,留念。

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

【其他文章推薦】

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

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

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

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

VueRouter爬坑第一篇-簡單實踐

VueRouter系列的文章示例編寫時,項目是使用vue-cli腳手架搭建。

項目搭建的步驟和項目目錄專門寫了一篇文章:

後續VueRouter系列的文章的示例編寫均基於該項目環境。

 VueRouter系列文章鏈接

  

  《VueRouter爬坑第二篇》-動態路由

  《VueRouter爬坑第三篇》-嵌套路由

 本篇文章完整代碼請移步:

  

 

 

閱讀目錄

一.前言

二.安裝VueRouter

  1.npm 安裝VueRouter

  2.如何使用VueRouter

三.組件和路由之間的映射

  1.<router-link>編寫可以跳轉的url

  2.編寫跳轉的目的組件

  3.定義路由

  4.入口文件main.js配置路由

  5.配置組件渲染的位置

四.總結

 

一.前言

  關於項目的搭建我們在文章最前面已經給了鏈接,在項目搭建這篇文章的最底部有一個注意事項,為了能清楚的理解本篇文章,我再把注意事項貼在這裏:

  

  我們的項目在使用vue-cli初始化的時候是沒有安裝vue-router的,所以如果你的在初始化的時候安裝了vue-router,那這篇文章的有些部分可能不太適用了。

  請大家謹慎觀看。

二.安裝VueRouter

1.npm 安裝VueRouter

  安裝命令:npm install vue-router

  

2.如何使用VueRouter

  安裝完成之後,需要有兩個步驟才能使用

  第一步:引入vue-router

    

  第二步:將組件註冊到全局(全局註冊后,在別的組件中可以直接使用,無需單獨引入)

     

   這塊先貼出步驟,暫時不寫代碼,後面做組件和路由映射的時候在把代碼寫上。

三.組件和路由之間的映射

  接着我們的疑問就來了:頁面中的一個URL如何匹配到我們編寫的組件?下面我們就一步一步揭開這個疑惑。

1.<router-link>編寫可以跳轉的url

   關於router-link的官方文檔說明可查看

  關於上面的疑問,我們第一步需要先編寫一個可以跳轉的URL。我們先把項目中默認生成的HelloWorld.vue組件中div.hello中的內容刪除,然後在加上我們自己的內容。

 

E:\MyStudy\test\VueDemo\src\components\HelloWorld.vue

 

<template>
  <div class="hello">
    <p>這裡是HelloWorld組件</p>
    <!-- 可跳轉的URL -->
    <router-link to="/index">點擊這裏渲染出另外一個組件</router-link>   
  </div>
</template>
// 後面的script和style沒有修改,因此省略

 

App組件不做修改,這裏就不貼代碼了,接着我們使用npm run dev啟動項目查看一下瀏覽器效果。

web頁面效果

 

<template> <div class=”hello”> <p>這裡是HelloWorld組件</p> <!– 可跳轉的URL –> <router-link to=”/index”>點擊這裏去另外一個組件</router-link> </div> </template> // 後面的script和style沒有修改,因此省

2.編寫跳轉的目的組件

  因為我們要實現url跳轉,因此需要編寫一個跳轉的目的組件。在這裏我們創建一個組件Index。

E:\MyStudy\test\VueDemo\src\components\Index.vue

<template>
    <div>  
        <h1>這裡是Index.vue組件</h1>
    </div>
</template>
<script>
export default {
    name: 'Index'
}
</script>

3.定義路由

  現在可點擊的URL準備好了,跳轉的目標組件也準備好了。接下來就是定義路由配置:將URL映射到組件。

  一般項目中為了後續好維護,會將路由配置單獨寫在一個文件中。因此我們先在E:\MyStudy\test\VueDemo\src 目錄下創建一個rotuer目錄,在該目錄下創建一個router.js文件,後面所有的路由配置均在該文件中編寫。

  創建路由配置文件

  

E:\MyStudy\test\VueDemo\src\router\router.js

// vue-router使用第一步:引入vue-router
import Vue from "vue"
import Router from "vue-router"

// vue-router使用第二步:組件註冊到全局
Vue.use(Router)

// 第三步:定義路由配置
// 引入路由需要映射的組件
import Index from '@/components/Index.vue'
const routes = [
    {
        path: '/index',   // 匹配的URL
        component: Index  //映射的目標組件
    }
]

// 第四步:創建vue-router實例,傳遞前面定義的路由配置
const router = new Router({
    routes: routes
})

// 第五步:將vue-router實例使用export導出(供其他模塊使用)
export default router 

  步驟一和步驟二在前面我們已經說過,步驟四和步驟五基本都是固定的配置不可缺少。

  第三個步驟中的routes就是稱為路由配置,可以看到routes是一個數組,它可以包含多個字典對象。每一個字典對象就是一條單個的路由。

  我們寫的這個路由只有最簡單的兩個配置項:path和component,註釋中有說明這兩個配置項的含義。

 

4.入口文件main.js配置路由

  前面的三個部分完成后,還需要在入口文件處把這個路由實例注入到跟組件中,這樣整個應用都可以擁有路由功能。

E:\MyStudy\test\VueDemo\src\main.js

// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import App from './App'
import router from './router/router'
Vue.config.productionTip = false

/* eslint-disable no-new */
new Vue({
  el: '#app',
  components: { App },
  template: '<App/>',
  //將路由實例註冊到根組件中
  router: router
})

 

大功告成,我們現在點擊界面的鏈接試一下

 

 

 

 

   在這裏呢,賣了個關子少了一個步驟:沒有告訴vue-router把匹配到的組件渲染到哪裡。

5.配置組件渲染的位置

<!-- 使用下面的這個標籤可以告訴vue-router將匹配到的組件渲染到這個位置 -->
<router-view>  </router-view>

 

然後我們將該段代碼加入到HelloWorld.vue這個組件中。

E:\MyStudy\test\VueDemo\src\components\HelloWorld.vue

<template>
  <div class="hello">
    <p>這裡是HelloWorld組件</p>
    <!-- 可跳轉的URL -->
    <router-link to="/index">點擊這裏去另外一個組件</router-link>
    
    <!-- 使用下面的這個標籤可以告訴vue-router將匹配到的組件渲染到這個位置 -->
    <router-view></router-view>
  </div>
</template>
// 後面的script和style沒有修改,因此省略

 

現在我們重新試一下效果

 

 

 

 

 

現在可以看到點擊鏈接后界面發生了變化:

index.vue中的內容显示到了HelloWorld.vue中router-view配置的位置

url由localhost:8080/#/變為localhost:8080/#/index

四.總結

  至此,一個簡單的url路由到組件的實例就完成了,現在總結一下前面梳理過的內容

  1.需要使用npm安裝vue-router。

注意:在使用veue init 初始化項目的時候會提示是否安裝vue-router,如果選擇是,那後續就不需要再次手動安裝了。

  2.可以使用<router-link/>編寫可跳轉的url,並使用<router-view/>指定組件的渲染位置

  3.創建Vue-Router實例,傳入配置的路由:最簡單的路由配置就是path和component

 

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

【其他文章推薦】

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

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

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

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

消費不要黑地球 DO Black卡:全球第一張以碳足跡為額度的信用卡

環境資訊中心記者 吳宜靜報導

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

【其他文章推薦】

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

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

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

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

僅次於北京,安徽新能源汽車創新能力全國第二

據國家知識產權局專利局專利文獻部與中國專利技術開發公司組織編寫的《全球專利創新活動研究報告(2014)》顯示,安徽新能源汽車產業創新能力在中國各省區市中綜合排名第二,僅次於北京。   2010—2013年,安徽新能源汽車產業共獲發明專利授權131件,每申請人平均發明專利授權量14.56件。奇瑞汽車股份有限公司在全球新能源汽車產業主要競爭者綜合排名中,僅次於豐田自動車株式會社和通用汽車環球科技運作公司居第三位。   最新的統計數據顯示,2013-2015年9月底,合肥市範圍內累計推廣應用新能源汽車7334輛,任務完成率128%,位居全國前列,合肥在全國範圍內累計推廣應用新能源汽車1.8萬輛,約占全國8%。在蕪湖,過去5年來奇瑞相繼推出QQ3EV、M1EV、eQ等純電動產品車型,累計銷售純電動汽車約3萬輛。其中2014年實現銷量9007輛,位列全國第三。   未來5年,合肥、蕪湖新能源汽車產業集聚發展基地將規劃建設108個重大專案,力爭產值突破千億元,朝著有國際競爭力的新能源汽車產業集聚發展基地的目標大步邁進。   資料來源:安徽日報

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

【其他文章推薦】

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

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

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

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

分佈式應用框架 Dapr

微服務架構已成為構建雲原生應用程序的標準,微服務架構提供了令人信服的好處,包括可伸縮性,鬆散的服務耦合和獨立部署,但是這種方法的成本很高,需要了解和熟練掌握分佈式系統。為了使用所有開發人員能夠使用任何語言和任何框架輕鬆地構建便攜式微服務應用程序,無論是開發新項目還是遷移現有代碼

Dapr 介紹

Github: 

Dapr是一種可移植的,事件驅動的,無服務器運行時,用於構建跨雲和邊緣的分佈式應用程序。

Distributed Application Runtime. An event-driven, portable runtime for building microservices on cloud and edge.

其中提到了多語言和多開發者框架,我認為這是他選擇的通過通信共享信息,即 HTTPGRPC 支持多語言等特性。微軟想通過這個設定一個構建微服務應用的規則。從根本上確立你開發的每一個應用的獨立性。賦能每個開發者,為了使Dapr對於不同的語言更加方便,它還包括針對Go,Java,JavaScript,.NET和Python的語言特定的SDK。這些SDK通過類型化的語言API(而不是調用http / gRPC API)公開了Dapr構建塊中的功能,例如保存狀態,發布事件或創建actor。這使開發人員可以使用他們選擇的語言編寫無狀態和有狀態功能以及參与者的組合。並且由於這些SDK共享Dapr運行時,您甚至可以獲得跨語言的actor和功能支持!

Dapr還可以與任何開發人員框架集成。例如,在Dapr .NET SDK中, Core集成,該集成帶來了可響應其他服務的發布/訂閱事件的狀態路由控制器, Core成為構建微服務Web應用程序的更好框架。

 

不過需要注意的是Dapr目前正處於Alpha階段, 今天剛發布了0.2版本。在v1.0穩定版本發布之前,建議不要用於生產環境。

 

下面進行一個 QuickStart

環境

  1. Install (微服務已經離不開容器化了)
  2. Install
  3. Install

在Windows 上通過Powershell 安裝:

powershell -Command "iwr -useb https://raw.githubusercontent.com/dapr/cli/master/install/install.ps1 | iex"
然後把 c:\dapr 添加到環境變量 PATH
運行dapr命令,檢查輸出是否正常

C:\workshop\Github\dotnet-sdk>dapr –help

         __
     ____/ /___ _____  _____
    / __  / __ ‘/ __ \/ ___/
   / /_/ / /_/ / /_/ / /   
   \__,_/\__,_/ .___/_/
               /_/

======================================================
A serverless runtime for hyperscale, distributed systems

Usage:
   dapr [command]

Available Commands:
   help        Help about any command
   init        Setup dapr in Kubernetes or Standalone modes
   list        List all dapr instances
   publish     publish an event to multiple consumers
   run         Launches dapr and your app side by side
   send        invoke a dapr app with an optional payload
   stop        Stops a running dapr instance and its associated app
   uninstall   removes a dapr installation

Flags:
   -h, –help      help for dapr
       –version   version for dapr

Use “dapr [command] –help” for more information about a command.

 

執行初始化(會啟動 docker 容器)
dapr init 
Making the jump to hyperspace... 
Downloading binaries and setting up components 
Success! Dapr is up and running
下載.NET SDk代碼
 ,裏面有.NET Core的多個示例代碼:
示例 描述
Demonstrates creating virtual actors that encapsulate code and state. Also see docs in this repo for a tutorial.
Demonstrates ASP.NET Core integration with Dapr by create Controllers and Routes.

The gRPC client sample shows how to make Dapr calls to publish events, save state, get state and delete state using a gRPC client.


我們一起來看下ASP.NET Core的Demo;

例子中主 我們使用 Dapr 的交互。Dapr通過 Runtime

  • 提供 Dapr API 給多語言調用。
  • 提供 狀態管理 By state stores

 

/// <summary>
  /// Sample showing Dapr integration with controller.
  /// </summary>
  [ApiController]
  public class SampleController : ControllerBase
  {
      /// <summary>
      /// Gets the account information as specified by the id.
      /// </summary>
      /// <param name=”account”>Account information for the id from Dapr state store.</param>
      /// <returns>Account information.</returns>
      [HttpGet(“{account}”)]
      public ActionResult<Account> Get(StateEntry<Account> account)
      {
          if (account.Value is null)
          {
              return this.NotFound();
          }

         return account.Value;
      }

 

     /// <summary>
      /// Method for depositing to account as psecified in transaction.
      /// </summary>
      /// <param name=”transaction”>Transaction info.</param>
      /// <param name=”stateClient”>State client to interact with dapr runtime.</param>
      /// <returns>A <see cref=”Task{TResult}”/> representing the result of the asynchronous operation.</returns>
      [Topic(“deposit”)]
      [HttpPost(“deposit”)]
      public async Task<ActionResult<Account>> Deposit(Transaction transaction, [FromServices] StateClient stateClient)
      {
          var state = await stateClient.GetStateEntryAsync<Account>(transaction.Id);
          state.Value ??= new Account() { Id = transaction.Id, };
          state.Value.Balance += transaction.Amount;
          await state.SaveAsync();
          return state.Value;
      }

 

     /// <summary>
      /// Method for withdrawing from account as specified in transaction.
      /// </summary>
      /// <param name=”transaction”>Transaction info.</param>
      /// <param name=”stateClient”>State client to interact with dapr runtime.</param>
      /// <returns>A <see cref=”Task{TResult}”/> representing the result of the asynchronous operation.</returns>
      [Topic(“withdraw”)]
      [HttpPost(“withdraw”)]
      public async Task<ActionResult<Account>> Withdraw(Transaction transaction, [FromServices] StateClient stateClient)
      {
          var state = await stateClient.GetStateEntryAsync<Account>(transaction.Id);

         if (state.Value == null)
          {
              return this.NotFound();
          }

         state.Value.Balance -= transaction.Amount;
          await state.SaveAsync();
          return state.Value;
      }
  }

 

這裏重點是狀態存儲,即將 state 通過 StateClient 存儲在 Dapr 中,我們通過狀態轉移在 Dapr 里實現了 stateless。
 
Dapr 運行.NET 應用程序

演示Dapr的服務調用,在終端中切換到項目目錄,然後使用dapr啟動應用

 

C:\workshop\Github\dotnet-sdk\samples\AspNetCore\ControllerSample>dapr run –app-id routing –app-port 5000 dotnet run   
Starting Dapr with id routing. HTTP Port: 61102. gRPC Port: 61103
You’re up and running! Both Dapr and your app logs will appear here.

 

注意: 以上dapr run命令,通過app-id指定了應用的ID,通過app-port指定了應用的端口(webapi默認使用5000作為http端口),後跟dotnet run命名啟動當前項目。可參考Dapr文檔

 

後台運行的 CLI 命令,這裡是前台打印的日誌, 注意到 .NET App 在指定的 5000 端口運行,同時還有狀態存儲的 redis6379 端口運行

 

== DAPR == time=”2019-11-16T18:33:22+08:00″ level=info msg=”starting Dapr Runtime — version 0.2.0 — commit c75b11
1-dirty”
     == DAPR == time=”2019-11-16T18:33:22+08:00″ level=info msg=”log level set to: info”
== DAPR == time=”2019-11-16T18:33:22+08:00″ level=info msg=”standalone mode configured”
== DAPR == time=”2019-11-16T18:33:22+08:00″ level=info msg=”dapr id: routing”
== DAPR == time=”2019-11-16T18:33:22+08:00″ level=info msg=”loaded component messagebus (pubsub.redis)”       
     == DAPR == time=”2019-11-16T18:33:22+08:00″ level=info msg=”loaded component statestore (state.redis)”
     == DAPR == time=”2019-11-16T18:33:22+08:00″ level=info msg=”application protocol: http. waiting on port 5000″
     == APP == info: Microsoft.Hosting.Lifetime[0]
     == APP ==       Now listening on:
== APP == info: Microsoft.Hosting.Lifetime[0]
== APP ==       Application started. Press Ctrl+C to shut down.
     == APP == info: Microsoft.Hosting.Lifetime[0]
== APP ==       Hosting environment: Development
== APP == info: Microsoft.Hosting.Lifetime[0]
== APP ==       Content root path: C:\workshop\Github\dotnet-sdk\samples\AspNetCore\ControllerSample
     == DAPR == time=”2019-11-16T18:33:31+08:00″ level=info msg=”application discovered on port 5000″
     == DAPR == 2019-11-16 18:33:32.029764 I | redis: connecting to localhost:6379
     == DAPR == 2019-11-16 18:33:32.036316 I | redis: connected to localhost:6379 (localAddr: [::1]:61164, remAddr:
[::1]:6379)
     == DAPR == time=”2019-11-16T18:33:32+08:00″ level=info msg=”actor runtime started. actor idle timeout: 1h0m0s.
actor scan interval: 30s”
     == DAPR == time=”2019-11-16T18:33:32+08:00″ level=info msg=”actors: starting connection attempt to placement se
rvice at localhost:6050″
== DAPR == time=”2019-11-16T18:33:32+08:00″ level=info msg=”http server is running on port 61102″
== DAPR == time=”2019-11-16T18:33:32+08:00″ level=info msg=”gRPC server is running on port 61103″
     == DAPR == time=”2019-11-16T18:33:32+08:00″ level=info msg=”local service entry announced”
== DAPR == time=”2019-11-16T18:33:32+08:00″ level=info msg=”dapr initialized. Status: Running. Init Elapsed 917
6.5164ms”
== DAPR == time=”2019-11-16T18:33:32+08:00″ level=info msg=”actors: established connection to placement service
  at localhost:6050″
== DAPR == time=”2019-11-16T18:33:32+08:00″ level=info msg=”actors: placement order received: lock”
== DAPR == time=”2019-11-16T18:33:32+08:00″ level=info msg=”actors: placement order received: update”
== DAPR == time=”2019-11-16T18:33:32+08:00″ level=info msg=”actors: placement tables updated”
== DAPR == time=”2019-11-16T18:33:32+08:00″ level=info msg=”actors: placement order received: unlock”
== APP == info: System.Net.Http.HttpClient.state.LogicalHandler[100]
== APP ==       Start processing HTTP request GET
== APP == info: System.Net.Http.HttpClient.state.ClientHandler[100]
== APP ==       Sending HTTP request GET
== APP == info: System.Net.Http.HttpClient.state.ClientHandler[101]
== APP ==       Received HTTP response after 2228.2998000000002ms – OK    
== APP == info: System.Net.Http.HttpClient.state.LogicalHandler[101]      
== APP ==       End processing HTTP request after 2257.3405000000002ms – OK
== APP == info: System.Net.Http.HttpClient.state.LogicalHandler[100]
== APP ==       Start processing HTTP request POST
== APP == info: System.Net.Http.HttpClient.state.ClientHandler[100]
== APP ==       Sending HTTP request POST
== APP == info: System.Net.Http.HttpClient.state.ClientHandler[101]
     == APP ==       Received HTTP response after 67.46000000000001ms – Created
== APP == info: System.Net.Http.HttpClient.state.LogicalHandler[101]
== APP ==       End processing HTTP request after 68.0343ms – Created
     == APP == info: System.Net.Http.HttpClient.state.LogicalHandler[100]
     == APP ==       Start processing HTTP request GET
== APP == info: System.Net.Http.HttpClient.state.ClientHandler[100]
== APP ==       Sending HTTP request GET
== APP == info: System.Net.Http.HttpClient.state.ClientHandler[101]
== APP ==       Received HTTP response after 5.8247ms – OK
== APP == info: System.Net.Http.HttpClient.state.LogicalHandler[101]
== APP ==       End processing HTTP request after 6.268400000000001ms – OK
== APP == info: System.Net.Http.HttpClient.state.LogicalHandler[100]
== APP ==       Start processing HTTP request POST
== APP == info: System.Net.Http.HttpClient.state.ClientHandler[100]
== APP ==       Sending HTTP request POST
== APP == info: System.Net.Http.HttpClient.state.ClientHandler[101]
== APP ==       Received HTTP response after 4.5181000000000004ms – Created
== APP == info: System.Net.Http.HttpClient.state.LogicalHandler[101]
== APP ==       End processing HTTP request after 4.6208ms – Created
== APP == info: System.Net.Http.HttpClient.state.LogicalHandler[100]
== APP ==       Start processing HTTP request GET
== APP == info: System.Net.Http.HttpClient.state.ClientHandler[100]
== APP ==       Sending HTTP request GET
== APP == info: System.Net.Http.HttpClient.state.ClientHandler[101]
== APP ==       Received HTTP response after 20.2967ms – OK
== APP == info: System.Net.Http.HttpClient.state.LogicalHandler[101]
== APP ==       End processing HTTP request after 20.691100000000002ms – OK

 

 

為了同時實現可移植性和與現有代碼的輕鬆集成,Dapr通過http或gRPC提供了標準API。Dapr端口可從Dapr啟動日誌中獲取,如以下日誌表示Dapr公開的HTTP端口為61102(通過Dapr也可使用gRPC方式進行服務調用)

 

== DAPR == time=”2019-11-16T18:33:32+08:00″ level=info msg=”http server is running on port 61102″
== DAPR == time=”2019-11-16T18:33:32+08:00″ level=info msg=”gRPC server is running on port 61103″

 

我們可通過以下地址來調用示例方法,根據Dapr服務調用API規範,其代理調用規則為:

POST/GET/PUT/DELETE http://localhost:<Dapr端口>/v1.0/invoke/<id>/method/<method-name>

直接調用:GET http://localhost:5000/17

通過Dapr服務調用: GET 
 
注意: Dapr的服務調用是有dapr sidecar來實現的,在被調用的服務中無需注入任何與dapr相關的代碼。

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

【其他文章推薦】

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

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

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

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