北韓暴雨成災糧倉泡湯 金正恩到場視察_網頁設計公司

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

搬家費用:依消費者運送距離、搬運樓層、有無電梯、步行距離、特殊地形、超重物品等計價因素後,評估每車次單

摘錄自2020年8月7日中央社報導

北韓中央通信社(KCNA)報導,北韓領導人金正恩今天(7日)視察黃海北道(North Hwanghae)水患災情,並下令提供糧食和補給品給災民。

法新社報導,北韓部分地區已經連日降下傾盆大雨。北韓許多山地和丘陵地區植被長期以來遭到破壞,使得水流恣意順著山勢往下流。

平壤以南的黃海北道是北韓重要糧倉。

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

透過選單樣式的調整、圖片的縮放比例、文字的放大及段落的排版對應來給使用者最佳的瀏覽體驗,所以不用擔心有手機版網站兩個後台的問題,而視覺效果也是透過我們前端設計師優秀的空間比例設計,不會因為畫面變大變小而影響到整體視覺的美感。

北韓中央通信社說,銀波郡(Unpha County)大青里(Taechong-ri)一帶的堤防潰堤,「導致730餘棟平房和600餘公頃稻田泡湯,179棟住宅被摧毀」。

北韓中央通信社指出,金正恩表示,儘速供應糧食、藥物和基本民生必需品給水患地區災民是當務之急。

國際新聞
北韓
暴雨

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

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

節能減碳愛地球是景泰電動車的理念,是創立景泰電動車行的初衷,滿意態度更是服務客戶的最高品質,我們的成長來自於你的推薦。

英企須揭露氣候風險_租車

※超省錢租車方案

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

摘錄自2020年11月11日經濟日報報導

英國財政大臣蘇納克(Rishi Sunak)宣布,將強制要求大企業和金融機構在未來5年內提出氣候風險報告,以推動淨零碳排放計畫,凸顯英國減緩全球暖化問題的決心。

蘇納克表示,計劃在2025年前強制大公司和金融機構提出氣候風險報告,此舉比「氣候相關財務揭露專案小組」(TCFD)的建議更嚴格,且為20國集團(G20)中第一個實施這種措施的國家。

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

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

英國財政部表示,新規定涵蓋的經濟活動範圍很大,包括上市公司、在英國註冊的大型未上市企業、銀行、住屋互助會、保險公司、獲英國政府核准的資產管理公司、壽險公司、受金融行為監理總署(FCA)監管的退休金方案、職業退休金計畫。

蘇納克也宣布英國第一個綠色債券計畫,預定2021年在金融市場發行,發債籌得的資金,將投入減少碳排放的計劃,以及創造就業機會。

氣候變遷
國際新聞
英國
氣候風險

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

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

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

真相難辨 日本政府涉放射線不實教材 15萬公民連署要求撤回_包裝設計

※產品缺大量曝光嗎?你需要的是一流包裝設計!

窩窩觸角包含自媒體、自有平台及其他國家營銷業務等,多角化經營並具有國際觀的永續理念。

文:宋瑞文(媽媽監督核電廠聯盟特約撰述)

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

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

網動廣告出品的網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上她。

烏茲別克東部水庫潰壩 近10萬人撤離_台中搬家

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

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

摘錄自2020年5月3日中央社報導

法新社、自由歐洲電台報導,烏茲別克東部的薩爾多巴水庫(Sardoba Reservoir)在1日早晨發生潰壩事故,促使政府採取行動撤離7萬人,潰壩引發的大水造成50多人住院接受治療。

哈薩克總統托卡葉夫(Kassym-Jomart Tokayev)3日在推特(Twitter)發文指出,靠近烏茲別克邊界的10座哈薩克村莊也遭受「嚴重洪患」,迫使哈薩克當局撤離2萬2000人。

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

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

薩爾多巴水庫是2010年在時任總理、現任總統米爾濟約耶夫(Shavkat Mirziyoyev)的執掌下開始建造,這座水庫最終於2017年完工。

土地水文
土地利用
生物多樣性
國際新聞
烏茲別克
水患
水壩決堤
水文
水庫

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

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

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

北極圈漏油環保浩劫 俄羅斯拘捕電廠3人_台中搬家公司

※推薦台中搬家公司優質服務,可到府估價

台中搬鋼琴,台中金庫搬運,中部廢棄物處理,南投縣搬家公司,好幫手搬家,西屯區搬家

摘錄自2020年6月11日中央社報導

西伯利亞工業城諾里爾斯克附近電廠柴油外洩,造成北極圈環保大災難。俄羅斯調查人員今(10日)拘捕電廠主管與工程人員共三人。

俄羅斯礦業集團諾里爾斯克鎳業公司(Norilsk Nickel)子公司在諾里爾斯克(Norilsk)經營的一座電廠5月29日發生貯油槽塌陷意外,導致超過2萬1000公噸柴油外洩。

台中搬家公司教你幾個打包小技巧,輕鬆整理裝箱!

還在煩惱搬家費用要多少哪?台中大展搬家線上試算搬家費用,從此不再擔心「物品怎麼計費」、「多少車才能裝完」

參與清理工作的西伯利亞石油運輸公司(Transneft Siberia)總指揮布隆尼科夫(Viktor Bronnikov)表示,現場工作人員已見到漏油對當地生態的第一波衝擊,包括麝鼠與野鴨死亡。

事件調查委員會表示,已拘留3名涉嫌觸犯環境保護法規的人士,包括電廠廠長史米爾諾夫(Pavel Smirnov)與2名工程人員。3人若被定罪,最高可處5年有期徒刑。

生態保育
公害污染
污染治理
生物多樣性
國際新聞
俄羅斯
北極圈
漏油事件
漏油污染
河川污染
水污染

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

※推薦台中搬家公司優質服務,可到府估價

台中搬鋼琴,台中金庫搬運,中部廢棄物處理,南投縣搬家公司,好幫手搬家,西屯區搬家

OPPO Find X3 Lite 完整實機開箱照洩漏!只是外觀有點眼熟?_網頁設計公司

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

台中景泰電動車行只是一個單純的理由,將來台灣的環境,出門可以自由放心的深呼吸,讓空氣回歸自然的乾淨,減少污染,留給我們下一代有好品質無空污的優質環境

前段時間 OPPO 正式在台灣推出 Reno5 系列新機,在 2021 年也傳聞將在第一季 Find X 系列就會推出最新的 Find X3 系列新機。不過在稍早有一款 OPPO Find X3 Lite 的實機外觀提前被曝光!從這些提前被洩漏的完整盒裝配件和標籤,都能肯定這就是 Find X3 Lite 國外市售版的實機。不過眼尖的人可能會發現,這款手機其實有些眼熟。

▲圖片來源:Sudhanshu(Twitter/@Sudhanshu1414)

OPPO Find X3 Lite 完整實機開箱照洩漏!只是外觀有點眼熟?

稍早在 Twitter 由 Sudhanshu 釋出了一批 OPPO Find X3 Lite 的完整實機開箱照片,從中我們可見到 Find X3 Lite 採用四鏡頭主相機、支持螢幕指紋辨識並附贈了軟質保護套和 SuperVOOC 快速充電器。

▲圖片來源:Sudhanshu(Twitter/@Sudhanshu1414)

從其他張照片能清楚看到 Find X3 Lite 的機身正反面,其螢幕採用平面的 OLED 挖孔全螢幕,在機身背面配備四鏡頭主相機。從這些照片各位想必已經覺得它有些眼熟吧?其實這款 OPPO Find X3 Lite 5G 應是針對特定市場推出的更名機型,而它的「本體」正是兩週前才剛在台灣正式發表的 OPPO Reno5 。

▲圖片來源:Sudhanshu(Twitter/@Sudhanshu1414)

OPPO Reno5(Find X3 Lite)與 Reno5 Pro 單從機身背面很難分辨,但從機身正面的螢幕則可區分兩者之間的不同。首先, OPPO Reno5 配備 6.43 吋 FHD+ 解析度 OLED 螢幕,螢幕為平面。至於 Reno5 Pro 則配備更大的 6.55 吋 FHD+ 解析度 OLED 曲面螢幕,兩者皆支援 90Hz 螢幕更新率和 180Hz 觸控採樣率。

▲Reno5(圖左)|Reno5 Pro(圖右)

然而,其實最早提出這則爆料的事 Evan Blass(@evleaks),他在兩週前就已經於 Voice 預告 OPPO 將以 Reno5 推出換名在其他市場上市的 Find X3 Lite ,當時也釋出官方渲染圖(如下):

▲圖片來源:Evan Blass(Voice/@evleaks)

這類將同款產品,針對不同銷售市場更換新的名稱在當地上市是相當常見的。例如之前部分 Redmi 和小米的手機、智慧手錶在引進台灣後,可能會採用不同的名稱。另外,前陣子 realme 在中國市場推出 realme V15 ,近期也將在印度市場更名為 realme X7 在印度上市。

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

網站的第一印象網頁設計,決定了客戶是否繼續瀏覽的意願。台北網動廣告製作的RWD網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上它。

消息來源:Sudhanshu(Twitter/@Sudhanshu1414)|Evan Blass(Voice/@evleaks)

延伸閱讀:
OPPO Reno5 、Reno5 Pro 正式在台發表:全新升級 AI 錄影、獨家 Reno Glow 2.0 星鑽工藝打造精緻外觀

realme Watch 2 智慧手錶通過 FCC 認證,外觀、規格提前曝光!電池容量增加、續航翻倍

您也許會喜歡:

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

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

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

以設計的實用美學觀點,規劃出舒適、美觀的視覺畫面,有效提昇使用者的心理期待,營造出輕鬆、愉悅的網站瀏覽體驗。

官網釋出多張iPhone12的全球風景照 全部出自使用者之手_如何寫文案

※教你寫出一流的銷售文案?

銷售文案是什麼?A文案是廣告用的文字。舉凡任何宣傳、行銷、販賣商品時所用到的文字都是文案。在網路時代,文案成為行銷中最重要的宣傳方式,好的文案可節省大量宣傳資源,達成行銷目的。

對於智慧型手機的用戶而言,照片拍得好不好看,很多時候都是選擇手機的標準之一。而近日蘋果就在官方網站上一口氣貼出許多風景照片,來強調iPhone在拍照上的優異性能。據悉這些照片都是使用iPhone 12系列手機拍攝完成,而且投稿的人都是世界各地iPhone的使用者喔。

↑一片水面映照出上方廣闊的天空。 以 iPhone 12 Pro Max 拍攝;拍攝者:Pieter de Vries,澳洲。

蘋果在官方網站上表示,iPhone 12 與 iPhone 12 mini 的雙相機系統,配備大尺寸超廣角相機和全新廣角相機,具有 ƒ/1.6 光圈,可提供更多 27% 的光線,有效提升在低光源環境中所拍攝的照片與影片。

↑用來遮陽的紅色防水布呈現出小孩嬉戲的倒影。 以 iPhone 12 mini 拍攝,拍攝者:Joe Panpiansin,泰國。

 

↑一個人的藍色眼睛特寫鏡頭。 以 iPhone 12 mini 拍攝,拍攝者:Andrey Glazunov,俄羅斯。

 

↑一個人在城市的街道上映射出長長的倒影。 以 iPhone 12 mini 拍攝,拍攝者:Matti Haapoja,加拿大。

 

↑在敞開的門外,坐在廢墟與陰影中的人物。 以 iPhone 12 拍攝,拍攝者:Bo Liu,中國。

 

↑帶有交錯格子派皮的派。以 iPhone 12拍攝,拍攝者:Nilay Örnek,土耳其。

 

↑站在對著水的碼頭末端的女子。以 iPhone 12拍攝,拍攝者:Bahar Akıncı,土耳其。

 

iPhone 12 Pro 與 iPhone 12 Pro Max 的相機系統配備超廣角、廣角與望遠相機,iPhone 12 Pro Max 配備 65 mm焦距的望遠相機,並提供 5 倍光學變焦範圍,以及廣角鏡頭,而放大 47% 的感光元件,具有 1.7 微米像素,在低光源環境中拍攝表現可大幅提升 87%。

 

※別再煩惱如何寫文案,掌握八大原則!

什麼是銷售文案服務?A就是幫你撰寫適合的廣告文案。當您需要販售商品、宣傳活動、建立個人品牌,撰寫廣告文案都是必須的工作。

↑夜間拍攝在沙漠中坐在營火前的一名男子。以 iPhone 12 Pro 拍攝,拍攝者:Abdullah Shaijie,科威特。

↑杜拜天際線景觀。以 iPhone 12 Pro 拍攝,拍攝者:Abdullah Shaijie,科威特。

↑前景的紅葉刻劃出遠處的瀑布。以 iPhone 12 Pro 拍攝,拍攝者:Ikuchika Aoyama,日本。

↑雙紅橋的尖頂直達天際。以 iPhone 12 Pro 拍攝,拍攝者:Ikuchika Aoyama,日本。

 

↑一個人在黃色牆壁樓梯間的平台上擺姿勢。以 iPhone 12 Pro 拍攝;拍攝者:Sarah M. Lee,英國。

 

看了世界各地的照片,是不是又燃起你想要出國的念頭呢?去年由於疫情的關係,大家幾乎都沒法出門,就先看些照片過過乾癮吧!而最後也提醒一下,對於拍照而言,器材固然重要,但很多時候,如果你想要拍攝出好的照片,其實腦袋與想法會比器材還要重要喔。

 

↑一名女子的人像照,頭頂懸掛著成串發光紅色紙燈籠的女子。以 iPhone 12 Pro Max 拍攝,拍攝者:NKCHU,中國。

↑街上的一大片水坑映射出周遭環境與上方的天空。以 iPhone 12 Pro Max 拍攝;拍攝者:Neal Kumar,美國。

↑義大利的雨中街景。以 iPhone 12 Pro Max 拍攝,拍攝者:Calogero Agrò,義大利。

↑站在海灘上的黑白人物照片,可透過浮木的格子窺見。以 iPhone 12 Pro Max 拍攝,拍攝者:Hélène Hadjiyianni,法國。

↑光影灑落在男孩的臉上。以 iPhone 12 Pro Max 拍攝,拍攝者:Rohit Vohra,印度。

您也許會喜歡:

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

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

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

擁有後台管理系統的網站,將擁有強大的資料管理與更新功能,幫助您隨時新增網站的內容並節省網站開發的成本。

專業的才看的到!美國白宮新官網暗藏玄機 原始碼竟然有「招募啟示」_網頁設計公司

※想知道最厲害的網頁設計公司嚨底家"!

RWD(響應式網頁設計)是透過瀏覽器的解析度來判斷要給使用者看到的樣貌

美國新任總統拜登於20日正式宣布就職,而美國白宮網站也在當天進行了改版。這次的改版除了新增時下流行的「深色模式」外,同時也有字體放大、縮小的功能。而有媒體發現,其實在網站的原始碼中,竟然暗藏一個不為人知的彩蛋。

有國外媒體發現,在白宮官方網站的原始碼中,竟然暗藏了一個非常特別的彩蛋,如果仔細鑽研這些原始碼,可以發現工程師在原始碼中寫下「If you’re reading this, we need your help building back better. 」(如果你正在閱讀這段文字,我們需要你的協助來進行更好的重建),同時還附上一個網址「https://usds.gov/apply」 ,而這段網址則是指向「美國數位服務小組(U.S. Digital Service,USDS)」的官方網站。這個非常特別的招募啟示,真的不是專業的高手根本不會注意到。

 

美國數位服務小組成立於2014年,在歐巴馬任期內成立的單位。由於當時美國政府各個單位、各地方政府都在進行數位化,觀念與知識彼此之間有嚴重落差不說,彼此之間的資料甚至還無法共通,於是歐巴馬就成立數為服務小組,主要工作就是由小組內經驗老道的工程師領導,協助美國政府的各個部門進行數位化的工作。

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

當全世界的人們隨著網路時代而改變向上時您還停留在『網站美醜不重要』的舊有思維嗎?機會是留給努力改變現況的人們,別再浪費一分一秒可以接觸商機的寶貴時間!

 

就過往來講,這次白宮網頁在原始碼中藏彩蛋,也並非是首例,就過往來講,也有非常多案例可以查詢,只是為何工程師們都習慣在原始罵內搞鬼呢?小編曾經詢問過業界相關人員,就有工程師朋友表示,其實身為一個專業的工程師,平時真的會習慣動不動就打開原始碼頁面來觀看,所以對於一般民眾覺得很難發現的原始碼,其實工程師們真的天天打開,一點都不困難,對他們就跟吃飯喝水一樣簡單。

您也許會喜歡:

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

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

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

透過資料庫的網站架設建置,建立公司的形象或購物系統,並提供最人性化的使用介面,讓使用者能即時接收到相關的資訊

api.versioning 版本控制 自動識別最高版本_網頁設計公司

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

以設計的實用美學觀點,規劃出舒適、美觀的視覺畫面,有效提昇使用者的心理期待,營造出輕鬆、愉悅的網站瀏覽體驗。

Microsoft.AspNetCore.Mvc.Versioning //引入程序集

.net core 下面api的版本控製作用不需要多說,可以查閱https://www.cnblogs.com/dc20181010/p/11313738.html

普通的版本控制一般是通過鏈接、header此類方法進行控制,對ApiVersionReader進行設置,例如

services.AddApiVersioning(o => {
                //o.ReportApiVersions = true;//返回版本可使用的版本
                o.ApiVersionReader = ApiVersionReader.Combine(new HeaderApiVersionReader("api-version"), new QueryStringApiVersionReader("api-version"));//通過Header或QueryString進行傳值來判斷api的版本
//o.DefaultApiVersion
= new ApiVersion(1, 0);//默認版本號
});

或者使用https://www.cnblogs.com/tdfblog/p/asp-net-core-api-versioning.html這種方式

這兩種方式都需要傳遞api的版本信息,如果不傳遞將會報錯

{"error":{"code":"ApiVersionUnspecified","message":"An API version is required, but was not specified.","innerError":null}}

如果我們不想傳遞api的版本信息時,可以將

o.AssumeDefaultVersionWhenUnspecified = true; //此選項將用於在沒有版本的情況下提供請求
o.DefaultApiVersion = new ApiVersion(1, 0); //設置默認Api版本是1.0

打開,這個我們每次請求如果不傳遞版本信息也不會報錯了,但我們的請求將會指向1.0版本,那麼我想讓默認版本指向我寫的api裏面的最高版本怎麼做?

我們將默認版本修改為最高版本可以嗎?

這裏將會出現一個問題,我的api版本可能由於各種各樣原因造成最高版本不一致的問題

所以我們不能採用指定默認版本是最高版本的方法來解決,這個最高版本還必須要是動態的,通過翻閱https://github.com/microsoft/aspnet-api-versioning/wiki/API-Version-Selector#current-implementation-api-selector可以得知

The CurrentImplementationApiVersionSelector selects the maximum API version available which does not have a version status. 
If no match is found, it falls back to the configured DefaultApiVersion. For example, if the versions "1.0", "2.0", and "3.0-Alpha" are available,
then "2.0" will be selected because it's the highest, implemented or released API version. CurrentImplementationApiVersionSelector選擇不具有版本狀態的最大可用API版本。 如果找不到匹配項,它將回退到配置的DefaultApiVersion。
例如,如果提供版本“
1.0”,“ 2.0”和“ 3.0-Alpha”,則將選擇“ 2.0”,因為它是最高,已實施或已發布的API版本。

services.AddApiVersioning( options => options.ApiVersionSelector = new CurrentImplementationApiVersionSelector( options ) );

通過這個版本選擇器,我們可以將最大版本得出,修改上面services.AddApiVersioning

services.AddApiVersioning(o => {
                o.ReportApiVersions = true;//返回版本可使用的版本
                //o.ApiVersionReader = new UrlSegmentApiVersionReader();
                //o.ApiVersionReader = ApiVersionReader.Combine(new HeaderApiVersionReader("api-version"), new QueryStringApiVersionReader("api-version"));
                //o.ApiVersionReader = ApiVersionReader.Combine(new QueryStringApiVersionReader("api-version"));
                o.ApiVersionReader = ApiVersionReader.Combine(new HeaderApiVersionReader("api-version"));//版本號以什麼形式,什麼字段傳遞
                o.AssumeDefaultVersionWhenUnspecified = true;//此選項將用於在沒有版本的情況下提供請求
                o.DefaultApiVersion = new ApiVersion(1, 0);//默認版本號
                o.ApiVersionSelector = new CurrentImplementationApiVersionSelector(o);//默認以當前最高版本進行訪問
            });

舉個栗子

namespace Default.v1.Controllers
{
    [ApiVersion("1.0")]
    [Route("[controller]/[action]")]
    [ApiController]
    public class HomeController : Controller, IBaseController
    {
        private readonly ILogger<HomeController> _logger;

        public HomeController (ILogger<HomeController> logger)
        {
            _logger = logger;
        }

        public JsonResult GetJson()
        {
            return Json("Home 1.0");
        }
}

Default.v1.Controllers.Home

namespace Default.v2.Controllers
{
    [ApiVersion("2.0")]
    [Route("[controller]/[action]")]
    [ApiController]
    public class HomeController : Controller, IBaseController
    {
        private readonly ILogger<HomeController> _logger;

        public HomeController (ILogger<HomeController> logger)
        {
            _logger = logger;
        }

        public JsonResult GetJson()
        {
            return Json("Home 2.0");
        }
}

Default.v2.Controllers.Home

namespace Default.v1.Controllers
{
    [ApiVersion("1.0")]
    [Route("[controller]/[action]")]
    [ApiController]
    public class TestController : Controller, IBaseController
    {
        private readonly ILogger<HomeController> _logger;

        public TestController (ILogger<HomeController> logger)
        {
            _logger = logger;
        }

        public JsonResult GetJson()
        {
            return Json("Test 1.0");
        }
}

Default.v1.Controllers.Test

 

 

 

 我們在

請求/home/getjson 時返回“Home 2.0”

請求/test/getjson 時返回“Test 1.0”

這樣就可以動態的請求最高版本了

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

台中景泰電動車行只是一個單純的理由,將來台灣的環境,出門可以自由放心的深呼吸,讓空氣回歸自然的乾淨,減少污染,留給我們下一代有好品質無空污的優質環境

 

但是還是會有問題的,比如,在我添加了Area和User區域下的HomeController,且User區域下的HomeController增加了1.0和3.0版本之後,神奇的一幕出現了

我的HomeController進不去了。。。

{"error":{"code":"UnsupportedApiVersion","message":"The HTTP resource that matches the request URI 'https://localhost:44311/home/getjson' is not supported.","innerError":null}}

這個時候去google都查不到原因。。。

查看api-supported-versions,返回的是1.0,2.0,3.0。。。我的api版本控制被污染了3.0版本從哪裡來的哪?第一反應是從User區域來的

我現在在User區域下添加一個除了Home和Test以外Name的Controller就可以請求成功,這個讓我懷疑到是不是api.versioning本身的問題,首先懷疑的是Controller的Name問題,源碼拉取下來,從添加版本控制的地方(services.AddApiVersioning)開始找

 

 

 

最後終於在ApiVersionCollator中找到了蛛絲馬跡

///https://github.com/microsoft/aspnet-api-versioning/blob/master/src/Microsoft.AspNetCore.Mvc.Versioning/Versioning/ApiVersionCollator.cs

namespace Microsoft.AspNetCore.Mvc.Versioning
{
    using Microsoft.AspNetCore.Mvc.Abstractions;
    using Microsoft.AspNetCore.Mvc.Controllers;
    using Microsoft.Extensions.Options;
    using System;
    using System.Collections.Generic;
    using System.Linq;

    /// <summary>
    /// Represents an object that collates <see cref="ApiVersion">API versions</see> per <see cref="ActionDescriptor">action</see>.
    /// </summary>
    [CLSCompliant( false )]
    public class ApiVersionCollator : IActionDescriptorProvider
    {
        readonly IOptions<ApiVersioningOptions> options;

        /// <summary>
        /// Initializes a new instance of the <see cref="ApiVersionCollator"/> class.
        /// </summary>
        /// <param name="options">The current <see cref="ApiVersioningOptions">API versioning options</see>.</param>
        public ApiVersionCollator( IOptions<ApiVersioningOptions> options ) => this.options = options;

        /// <summary>
        /// Gets the API versioning options associated with the collator.
        /// </summary>
        /// <value>The current <see cref="ApiVersioningOptions">API versioning options</see>.</value>
        protected ApiVersioningOptions Options => options.Value;

        /// <inheritdoc />
        public int Order { get; protected set; }

        /// <inheritdoc />
        public virtual void OnProvidersExecuted( ActionDescriptorProviderContext context )
        {
            if ( context == null )
            {
                throw new ArgumentNullException( nameof( context ) );
            }

            foreach ( var actions in GroupActionsByController( context.Results ) )
            {
                var collatedModel = CollateModel( actions );

                foreach ( var action in actions )
                {
                    var model = action.GetProperty<ApiVersionModel>();

                    if ( model != null && !model.IsApiVersionNeutral )
                    {
                        action.SetProperty( model.Aggregate( collatedModel ) );
                    }
                }
            }
        }

        /// <inheritdoc />
        public virtual void OnProvidersExecuting( ActionDescriptorProviderContext context ) { }

        /// <summary>
        /// Resolves and returns the logical controller name for the specified action.
        /// </summary>
        /// <param name="action">The <see cref="ActionDescriptor">action</see> to get the controller name from.</param>
        /// <returns>The logical name of the associated controller.</returns>
        /// <remarks>
        /// <para>
        /// The logical controller name is used to collate actions together and aggregate API versions. The
        /// default implementation uses the "controller" route parameter and falls back to the
        /// <see cref="ControllerActionDescriptor.ControllerName"/> property when available.
        /// </para>
        /// <para>
        /// The default implementation will also trim trailing numbers in the controller name by convention. For example,
        /// the type "Values2Controller" will have the controller name "Values2", which will be trimmed to just "Values".
        /// This behavior can be changed by using the <see cref="ControllerNameAttribute"/> or overriding the default
        /// implementation.
        /// </para>
        /// </remarks>
        protected virtual string GetControllerName( ActionDescriptor action )
        {
            if ( action == null )
            {
                throw new ArgumentNullException( nameof( action ) );
            }

            if ( !action.RouteValues.TryGetValue( "controller", out var key ) )
            {
                if ( action is ControllerActionDescriptor controllerAction )
                {
                    key = controllerAction.ControllerName;
                }
            }

            return TrimTrailingNumbers( key );
        }

        IEnumerable<IEnumerable<ActionDescriptor>> GroupActionsByController( IEnumerable<ActionDescriptor> actions )
        {
            var groups = new Dictionary<string, List<ActionDescriptor>>( StringComparer.OrdinalIgnoreCase );

            foreach ( var action in actions )
            {
                var key = GetControllerName( action );

                if ( string.IsNullOrEmpty( key ) )
                {
                    continue;
                }

                if ( !groups.TryGetValue( key, out var values ) )
                {
                    groups.Add( key, values = new List<ActionDescriptor>() );
                }

                values.Add( action );
            }

            foreach ( var value in groups.Values )
            {
                yield return value;
            }
        }

        static string TrimTrailingNumbers( string? name )
        {
            if ( string.IsNullOrEmpty( name ) )
            {
                return string.Empty;
            }

            var last = name!.Length - 1;

            for ( var i = last; i >= 0; i-- )
            {
                if ( !char.IsNumber( name[i] ) )
                {
                    if ( i < last )
                    {
                        return name.Substring( 0, i + 1 );
                    }

                    return name;
                }
            }

            return name;
        }

        static ApiVersionModel CollateModel( IEnumerable<ActionDescriptor> actions ) => actions.Select( a => a.GetApiVersionModel() ).Aggregate();
    }
}

View Code

 

其中GroupActionsByController將Controller按照Controller的名字進行分組,再看看內部,分組的時候將GetControllerName( action )作為key,那麼GetControllerName是幹嘛的,

protected virtual string GetControllerName( ActionDescriptor action )
        {
            if ( action == null )
            {
                throw new ArgumentNullException( nameof( action ) );
            }

            if ( !action.RouteValues.TryGetValue( "controller", out var key ) )
            {
                if ( action is ControllerActionDescriptor controllerAction )
                {
                    key = controllerAction.ControllerName;
                }
            }

            return TrimTrailingNumbers( key );
        }

這個方法原本是沒有問題的,但是牽扯到Area的時候就會出問題了。。它將根目錄下的HomeController和User.HomeController視為同一類的Controller然後去做版本的屬性注入,造成CurrentImplementationApiVersionSelector選擇器選不到正確的版本,所以返回了上面的錯誤,我們將GetControllerName內部修改為

protected virtual string GetControllerName( ActionDescriptor action )
        {
            if ( action == null )
            {
                throw new ArgumentNullException( nameof( action ) );
            }

            if ( !action.RouteValues.TryGetValue( "controller", out var key ) )
            {
                if ( action is ControllerActionDescriptor controllerAction )
                {
                    key = controllerAction.ControllerName;
                }
            }

            if ( !action.RouteValues.TryGetValue( "area", out var area ) )
            {
            }

            return TrimTrailingNumbers( area + key );
        }

這樣就可以走通了

 

我們有兩種解決辦法,一個是把源碼拉取下來,方法修改掉,項目的依賴項替換為自己修改的Microsoft.AspNetCore.Mvc.Versioning,另一種辦法是將services.AddApiVersioning重寫。。。請相信我,拉取修改替換依賴比重寫services.AddApiVersioning快且簡便。。。

issue:https://github.com/microsoft/aspnet-api-versioning/issues/630

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

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

網站的第一印象網頁設計,決定了客戶是否繼續瀏覽的意願。台北網動廣告製作的RWD網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上它。

Physic Design:Floorplan算法概覽_如何寫文案

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

擁有後台管理系統的網站,將擁有強大的資料管理與更新功能,幫助您隨時新增網站的內容並節省網站開發的成本。

僅用於學習交流,轉載請聯繫本人。

 

1 floorplan是什麼

floorplan常被翻譯成布圖規劃,是指在芯片級別上對模塊進行布局,也就是哪個單元放在什麼地方,但是單元內部的具體布局並不關心。該步驟為芯片版圖設計中的關鍵步驟之一,因為在這一步會影響芯片的面積、能否成功布線以及布線線長等諸多關鍵指標和步驟。

圖1. 布圖規劃就是確定這些Block的形狀和相對位置,但是對Block內部不關注,一個Block可能是一個加法器或者其它什麼。至於圖中所示的三種類型(臨接,通道、臨界+通道),目前是不重要的。圖片引用自 http://www.signoffsemi.com/floorplan-placement-2/

 

2 目標是什麼

floorplan的首要目標就是給模塊指定一個最佳的形狀(如果需要指定的話),給出模塊間的最佳的相對位置關係。這裏需要先區分一個概念,module和block(這裏對應的中文我記成模塊磚塊)。一個加法器的原理圖是一個模塊,也就是我們知道一個加法器是由一個半加器和進位電路組成的,但是在版圖中這個加法器長寬分別是多少,我們是不知道的。當其長寬確定下來之後,就稱成為一個磚塊(Block),就相當於磚,和建房子的磚沒啥區別,就是說可以用這個磚塊來構建版圖啦,所以翻譯成磚塊。在設計好芯片的邏輯關係后,更具輸入的是磚塊還是模塊可能面臨三種狀況:

(1)輸入的對象都是磚塊(block)。也就是說,構建版圖時,使用的基本構圖單元(加法器)已經被規定好了,只能使用,不能改變形狀和大小。但是這些磚塊間的位置是floorplan需要去確定的。

(2)輸入的對象是模塊(module)。也就是說,構建版圖時,使用的基本構圖單元(加法器)沒有被規定死,可以指定其長寬比例(面積基本上變不了,因為加法器里的東西需要地方放)。這種情況下,floorplan需要為這些模塊指定長寬比例使得模塊變成磚塊,然後還要指出這些磚塊之間的相對位置。

(3)當然是混合型,輸入既有磚塊又有模塊。略。

 

但是這裡有一個問題就是什麼樣算是最佳?或者換一種說法,顯然floorplan是一個優化問題,那麼優化的目標是什麼呢?一般來說有一下幾點:

※教你寫出一流的銷售文案?

銷售文案是什麼?A文案是廣告用的文字。舉凡任何宣傳、行銷、販賣商品時所用到的文字都是文案。在網路時代,文案成為行銷中最重要的宣傳方式,好的文案可節省大量宣傳資源,達成行銷目的。

(1)使芯片面積最小;

(2)使得模塊之間的連線最短,這也就意味着延遲小;

(3)模塊之間擁塞盡可能小,也就是說,模塊之間有足夠的空間讓互連線通過;

優化目標可能是其中一個也可能是其中的很多,如果要同時滿足多個優化目標的話,可以為這些目標分配權重,形成一個綜合的優化目標函數。(但筆者認為,這實在是一種有些天真但在一定程度上可接受的做法,相當於超參數)

f=a*area+b*wirelength+c*congestion (a+b+c=1)

3 常見的算法有哪些

在這裏,再重述一遍floorplan的主要目標,(1)指定模塊的形狀,(2)給出模塊間的相對位置。目前幾乎所有的数字芯片設計都會使用物理設計EDA工具,其中自然就包含floorplan工具,既然是自動化工具,就比然有相應的算法。總體上來說,floorplan可以分為三類(Susmita Sur-Koay):

(1)構造型算法。這一類算法旨在指出磚塊之間的相對位置。這一類算法有slicing embedding,hierarchical enumeration和dual graph等。

(2)迭代型算法。這一類算法旨在將模塊變成磚塊,也就是為模塊確定長寬比。這一類算法有模擬退火,遺傳算法,力導向等。

(3)基於特定知識的算法。這一類算法企圖同時完成這兩件事情。

 

參考文獻

Susmita Sur-Koay. Handbook of Algorithms for Physical Design Automation. p140.

 

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

※別再煩惱如何寫文案,掌握八大原則!

什麼是銷售文案服務?A就是幫你撰寫適合的廣告文案。當您需要販售商品、宣傳活動、建立個人品牌,撰寫廣告文案都是必須的工作。