這台飛度飛起來了!超強颱風殺到,要注意什麼_網頁設計公司

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

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

太恐怖了趕緊躲進房間里吧可是我今天約了老漢吃飯答謝他上次推車的恩情呢那麼也就是說必須開車出去咯。好的,那就讓小編美美支招颱風天用車要注意什麼。首先如果你的車是飛度的話為了不讓它飛起來請拉上你的親朋好友坐車增加車重開玩笑颱風天汽車受損主要有2種情況第一,水淹颱風往往伴隨着強降雨目前的城市排水能力有限所以在很多地勢低洼的地方容易積水颱風天一旦把車子停在那些地方分分鐘變成落湯雞鐺鐺鐺鐺,一台泡水車誕生了第二,落物砸壞颱風一來各種亂七八糟的東西吹得滿天都是尤其是人家窗檯放的花花草草啊分分鐘砸下來車頂變形玻璃破碎第

據線人報道

颱風“薩瓦迪卡”就要抵達海南

sorry是颱風“莎莉嘉”

莎莉嘉是什麼來頭呢?

我們可以看看這個魔鬼的生平

10月13日莎莉嘉颱風生成

經過2天的卧薪嘗膽

10月15日莎莉嘉成長為颱風級

一天之內又晉陞為強颱風級

10月16日

這個魔鬼就殺入菲律賓呂宋半島

10月17日

莎莉嘉來到海南省萬寧市東偏南方大約570公里的南海中部

最強風力13級(38米/秒)

12級的大風就可以把列車吹翻

可以把20噸重的汽油罐拋到80米的高空

按照這個速度

10月19日將正式殺入廣東

沒錯,

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

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

也就是今天!

太恐怖了

趕緊躲進房間里吧

可是我今天約了老漢吃飯

答謝他上次推車的恩情呢

那麼也就是說必須開車出去咯?

好的,那就讓小編美美支招

颱風天用車

要注意什麼?

首先如果你的車是飛度的話

為了不讓它飛起來

請拉上你的親朋好友坐車

增加車重

開玩笑

颱風天汽車受損

主要有2種情況

第一,水淹

颱風往往伴隨着強降雨

目前的城市排水能力有限

所以在很多地勢低洼的地方容易積水

颱風天一旦把車子停在那些地方

分分鐘變成落湯雞

鐺鐺鐺鐺,一台泡水車誕生了

第二,落物砸壞

颱風一來

各種亂七八糟的東西吹得滿天都是

尤其是人家窗檯放的花花草草啊

分分鐘砸下來

車頂變形

玻璃破碎

第三,車被吹走了

如果一大早醒來

車子被吹走了

請立即抱緊你的男/女朋友

此時風力肯定非常大

當然有的人就能巋然不動

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

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

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

終於帶T了!這款SUV換上1.5T能否干贏H6和博越?_網頁設計公司

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

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

接着換2擋,即使轉速回落至1000轉的上下,但隨着充足扭矩的緊接而來,車輛的提速依然爽快利落。站在大部分手動擋駕駛者的角度,在擁堵、頻發紅燈起步的情況下,發動機的低扭不足是最為影響體驗的一點(沒有之一)。在經過伊寧縣道的一個又一個路口以後,基本可以確認這台1。

“如果CS75能夠搭載小排量渦輪增壓發動機,那我一定會把它列入我的購車名單當中。”在某次乘搭滴滴專車的過程中,一位長安CS75的車主如是告訴我。

更符合消費需求的1.5T

這位車主的心聲道出了長安CS75在產品布局上存在的不足—消費者需要排量更小、售價更低的渦輪增壓車型以面對日常家用代步的用車需求,而這正是CS75所缺乏的。確實,CS75的2.0L車型由於排量的原因,無法享受到國家的小排量優惠政策。而1.8T車型相對同級競爭車型,12.28萬的起售價又缺乏一定的吸引力。在目前10-15萬級別自主品牌SUV的消費者最看重的兩點核心—價格、油耗上,CS75的產品定位並沒有拿捏到一個較好的平衡。

客觀反映在銷量上,長安CS75在近年的4月、6月、7月的同比銷量均出現了一定程度的下挫。對於長安來說,亟需一個解決方案,以幫助CS75重新站回自主品牌SUV第一梯隊的位置。於是,售價10.58-12.38萬元的CS75 1.5T車型(手動擋)正式被推出了市場。

賽里木湖,既是試車也是賞景

當然,能夠幫助CS75重回第一梯隊,相比起更全面的產品布局,產品的質量或許顯得更為重要。“CS75新車型的動力總成表現如何?”是包括我在內的眾多汽車媒體所關注的重點。於是,在緊接着新車型上市的當天,長安便在新疆的伊寧市為CS75舉辦了媒體試駕活動。因蘋果而出名的伊寧,在10月較其他城市更早地進入冬季。試駕當天的氣度只有6℃,並且從酒店向賽里木湖進發的試駕路程,是逐漸往2000+海拔爬升的過程。不過就試驗一款1.5T發動機的動力性能而言,是一個很理想的環境。

(風景實在太美,容我亂入顯擺兩張)

一台全新設計的發動機

在小排量的政策引導下,目前大多數的緊湊型SUV的渦輪排量都設計為1.4T、1.5T。譬如1.4T的大眾途觀、1.5T的傳祺GS4、1.5T的哈弗H6。而受技術、成本的限制,不少的自主品牌會直接採用三菱的代號4A91T的1.5T發動機,雖然在穩定性上佔據優勢,但使得像缸內直噴等更先進的發動機技術無法在發動機上運用。也因此,CS75並沒有直接採購三菱的發動機方案,而是基於長安的H平台進行研發。當然,後來的試駕證明,這是一個正確的選擇。隨行的長安工程師告訴我:“早在4年前,長安便開始了這款1.5T發動機的研發工作,主要的研發工作由長安位於英國伯明翰的發動機研發中心所完成。整個發動機結構均為全新設計,與1.8T以及2.0L發動機都不盡相同”

這台發動機運用了不少如今主流的發動機技術,相對於不少的自主品牌又是先進的。譬如缸內直噴技術、可變排量機油泵、自動啟停等,在這些技術的結合下,這台1.5T發動機擁有了125kW的最大功率以及230N.m/1950-4500rpm的最大扭矩。動力數據並非1.5T發動機里最強的,但與合資品牌對標也未嘗不可。

這能勝任全面的城市路況

在中高海拔的情況下,預想的低扭不足的情況並沒有出現,1擋起步發動機轉速迅速拉升至1500轉的上下,CS75已經具備了一定明顯的提速感,在紅燈路口的多次試驗我更加肯定這一點。當然實際的提速速度比我感受到的更快,原因在後面再說。接着換2擋,即使轉速回落至1000轉的上下,但隨着充足扭矩的緊接而來,

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

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

車輛的提速依然爽快利落。站在大部分手動擋駕駛者的角度,在擁堵、頻發紅燈起步的情況下,發動機的低扭不足是最為影響體驗的一點(沒有之一)。在經過伊寧縣道的一個又一個路口以後,基本可以確認這台1.5T的小排量發動機能夠很好地勝任城市擁堵的使用環境。我與長安的工程師分享這一點,其表示,這台1.5T發動機的渦輪增壓部件,由博格華納所提供,由於其可靠性以及對小排量渦輪增壓發動機的適配度較高,像大眾等一線的合資車企亦同樣從其採購。

(上海某知名媒體人士)

由於近年來國家對西部的政策扶持,使得伊寧的高速公路網得到了充分的發展,連接伊寧市區與賽里木湖的連霍高速就是其中的一條暫新的高速公路。這條將近200公里距離的路程,過去或許需要開上半天甚至更久,而當天我們頂着120公里的限速前行,花費的時間也只有一個半小時。

(頗為壯觀的果子溝大橋)

頂着高速限速前行,很自然地把擋位掛上6擋。考慮到CS75的SUV定位,6擋變速箱的變速齒比並沒有被設計得過小。120公里/小時巡航時,轉速指針的位置大致在2700rpm的範圍。要是加深油門的開度,發動機也樂於把轉速往3000rpm以上突破以換取更好的加速能力,但是受制於小排量的天生性結構,,車速突破100公里/小時以後,腳下油門的积極程度便已經很難與提速感相協調。

讓人歡喜的靜音以及振動抑制

不過發動機這種長時間處於高轉速運轉轉態的情況,也讓我發現這台1.5T發動機在靜音性以及震動抑制方面有着讓人歡喜的表現。針對小排量發動機特有的高速運轉震動、噪音的短板,工程師為這台1.5T發動機配置了低噪靜音皮帶、低噪噴油器等相對應的靜音、降噪措施。震動抑制方面的效果是出色的,和2.0L發動機的感官感受相差不多,來自上海某知名媒體老濕和我持同樣的意見。

因為私人座駕比較爛的緣故,我一直對汽車的靜音性比較在意。而CS75的靜音表現則可以形容為同級1.5T車型的前列。試駕過程中,偷懶加減檔操作的我,經常把轉速拉升至3000rpm的水平,但此時的發動機噪音確實要比我座駕的發動機處於2000rpm時的表現還要出色。這也解釋了前面CS75在中低速時的加速能力要比人體感官感受要來得更強,很大程度上這台1.5T的暴躁被掩蓋了起來。如果這一點要對標,不少主流合資品牌的緊湊型SUV能夠成為目標對象。

槽點:讓新手犯難的起步熄火

從動力、靜音、震動這三個方面上,這台1.5T發動機的表現都打消了我預期的擔心。得以輕鬆、愜意地在賽里木湖遊玩,很大部分要歸結於CS75的功勞。但儘管如此,手動版的CS75仍然有一個表較明顯的槽點—起步容易熄火。整個的試駕過程中,我在起步階段熄火了2次。其餘試駕的媒體或多或少也存在這樣的情況。對於老司機而言,可以通過快速的熟悉去解決這一問題。而對於剛拿駕照的新手司機而言,則需要更為合理的自動補油程序。

一份目前自主品牌所缺少的實在

其餘升級,像30公里可開啟的360全景影像、自動駐車等新增配置不加以贅敘。但有一點我認為必要着重提及,那便是位於車內后視鏡上方的行車記錄儀USB預留接口。“許多消費者加裝行車記錄儀都必須拆開中控台,從保險盒取電,這個新增的USB借口能夠避免了這些麻煩。”長安的工程師表示,在原有車型的基礎上,新款車型在細節上做了更多合理性的改進。儘管問題細小,但當中卻能夠透露出一份目前自主品牌所缺少的實在。

比以往的CS75都更值得入手

接近2.0L車型的售價,與1.8T車型相差無幾的動力表現,CS75的1.5T車型比以往的車型都更能滿足自主品牌SUV消費者日常用車的消費需求。在過往,CS75是一款受到認可的好車。如今,這款好車又再進一步完善了自己。如果那位兼職滴滴快車的車主尚未換車,我想CS75的1.5T車型會在他的購車名單之內的。文末最後,也要感謝一路隨行的長安汽車工程師,其客觀公正的講解屬於自主品牌當中少見的一位。

(從長安工程師身上,能夠看到長安汽車的工科男性格)本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

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

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

《中國的寶藏》:告訴你一個可親可感的中華文化_網頁設計

※推薦評價好的iphone維修中心

擁有專業的維修技術團隊,同時聘請資深iphone手機維修專家,現場說明手機問題,快速修理,沒修好不收錢

兼具真實性與藝術性的紀錄片,既是我們了解傳統文化的一面鏡子,也是我們探索現代文明的知識寶庫。前不久熱播的紀錄片《中國的寶藏》呈現了中國頂級文物,將“過去”與“現在”聯繫起來,為觀眾提供了一個了解傳統和現代中國的窗口。節目邀請英國節目主持人阿拉斯泰爾·蘇克帶領觀眾踏上博物館尋寶之旅,他對中國歷史十分着迷,正如他在節目中所說:“驚奇於她的美和數千年文明的深度……如果不了解中國的過去,就不可能真正了解今天的中國。”

值得一提的是,《中國的寶藏》英文版已於2019年10月在BBC世界新聞頻道面向全球首播,索福瑞媒介研究有限責任公司對印度、澳大利亞和美國三個國家的觀眾進行了調查,其中有近9成的觀眾表示“我很喜歡紀錄片《中國的寶藏》”,還有觀眾認為這部紀錄片“直觀展示了中國文物的美與獨特”和“深入展現了中國歷史文化的博大精深”。

中英合拍讓中國文物走向世界

由中央廣播電視總台影視劇紀錄片中心出品,央視紀錄國際傳媒有限公司以國際合拍、合作的方式,與BBC世界新聞頻道、英國野馬製作公司共同製作的紀錄片《中國的寶藏》,高水準、藝術化地呈現了故宮博物院等8家博物館、良渚遺址等5個世界文化遺產,包括大禹治水圖玉山、趙孟頫《秀石疏林圖》、大克鼎、章懷太子墓壁畫《客使圖》、兵馬俑等20多件中國頂級文物,為海外觀眾繪製了一幅底蘊深厚的中國歷史文化圖卷。

眾所周知,通暢的傳播渠道對紀錄片到達受眾至關重要,否則,即使有優質的內容,紀錄片也將面臨“傳而不通”的困境。中央廣播電視總台影視劇紀錄片中心召集人庄殿君介紹,“國際合拍模式不僅為中國紀錄片注入了活力,激活了國際合作夥伴的思路,也為中國和世界紀錄片行業的互動提供了更直接的渠道,形成了傳播合力”。

在中英文版本的內容策劃和排播策略上,央視紀錄頻道和BBC世界新聞頻道都充分考慮了海內外觀眾觀看此類節目的需求。據相關數據显示,央視紀錄頻道全國覆蓋3.06億戶家庭觀眾,是中國紀錄片傳播的核心平台,BBC世界新聞頻道全球覆蓋4.65億戶家庭觀眾,促進節目更為廣泛的傳播,激發世界各地的人們對古老而又現代的中國的興趣,加快推動中國文物走向世界的步伐。

央視紀錄頻道副總監史岩表示:“此次首次與BBC世界新聞頻道的合作非常成功,希望未來共同努力,找到中國觀眾和海外觀眾共同感興趣的題材,聯合攝製,共同播出。”BBC世界新聞頻道專題部責任編輯艾瑪·迪亞斯也認同史岩的觀點,她希望以《中國的寶藏》為起點,未來尋求更多題材的項目合作,為全球觀眾提供豐富多彩的節目內容。

描繪文明傳承的力量

台北網頁設計公司這麼多該如何選擇?

網動是一群專業、熱情、向前行的工作團隊,我們擁有靈活的組織與溝通的能力,能傾聽客戶聲音,激發創意的火花,呈現完美的作品

紀錄片《中國的寶藏》共6集,每集25分鐘,呈現現代中國生活的多個側面,分別是家族、藝術、都會、製造、科技和飲食。每集都從館藏文物珍品切入,通過對傳統的深入解釋,試圖從中國人的現代生活中捕捉到迴響,尋找古代文明的現代傳承。在《中國的寶藏》中,阿拉斯泰爾·蘇克通過拜訪中國各大頂尖博物館以及傾聽各行各業的人們的故事,深切感受中國的歷史悠久和幅員遼闊。

在中國傳媒大學中國紀錄片研究中心研究人員李寧看來,“《中國的寶藏》獲得海內外觀眾認同的另一個原因,就是它講述的婚喪嫁娶、生老病死這些內容,都是跨越地域與種族的共同人生命題。從人類學與社會學的角度來看,這些情感與行為最容易獲得跨文化的理解和認同。所以這部紀錄片不光是講述文物的故事,還在現代生活中找到了它所承載的歷史文化信息的延續”。

《中國的寶藏》中方製片人陳丹丹介紹:“在文物的選擇和主題確定上,我們把握兩個原則。一個是時間跨度,我們選擇的是那些既展現了文明起源,又比較接地氣的文物。另一個原則就是主題必須能夠引起人類情感共鳴。比如你如何吃飯、你的家庭是什麼樣的、你的孩子是怎麼教育的、你如何說話寫字等。因為這些主題是不論哪個國家的受眾都會關心的話題。”

如在第六集《飲食的藝術》中,通過文物深度挖掘中國人的飲食文化,主持人帶領觀眾看到了蘊藏在中國文化深處的遺傳密碼。而飲食,不僅是味道的品鑒,更是一種文化的傳承,其背後強大的認同感,跨越歷史刻度描繪出了文明傳承的力量。

用中國寶藏彰顯文化自信

文化是一個國家和民族的精神與靈魂,文化自信是一個國家、一個民族發展中更基本、更深沉、更持久的力量。作為一種跨文化、跨時空的媒介形態,紀錄片是“講好中國故事,傳播中國聲音”的重要載體,是推動中國文化走出去、促進文化交流與溝通的有效途徑。鑒於此,中國积極推動紀錄片在海外的傳播,中宣部(國新辦)專門設立了“紀錄中國”傳播工程,鼓勵紀錄片製作機構創製精品內容,對外展示中國魅力、推介中國形象、傳播中國文化。作為中宣部(國新辦)“紀錄中國”傳播工程支持項目,《中國的寶藏》一經推出,既彰顯了中國的文化自信,也提供了“讓世界了解中國,讓中國走向世界”的國際表達。節目用講故事的方式,將中國文化融於古往今來中國人的日常生活、喜怒哀樂和拼搏奮鬥中,讓觀眾領略到中國藝術開放包容的境界和博採眾長的氣度,感受到悠久歷史對現代中國的深刻影響,展現了一個傳統與現代交匯融合的立體中國。

同時,作為一部國際合拍紀錄片,《中國的寶藏》借鑒“他者”講故事的方式,用介入方式觸摸真實。主持人阿拉斯泰爾·蘇克擔任觸摸者角色,虛心求學於各大博物館研究員身側,搭乘中國高鐵等交通工具,前往湖南廖家宗祠參加清明祭祀活動、在北京潘家園舊貨市場閑逛、在西安的路邊攤吃烤串、在長沙品嘗滿月酒席上象徵好運的紅雞蛋……一系列身臨其境的觸摸體驗,為紀錄片帶來強烈的現場感、參與感和真實感,有利於中國故事的國際化傳播。節目也在不知不覺中回望了各自的歷史和現在,分享發展經驗,實現構建人類命運共同體的目標。

此外,這部紀錄片的意義並不在於誇大自己的文明獨樹一幟,它的基本精神在於在合作中實現了平等的溝通和對話。正如中國駐英國大使劉曉明所說:“《中國的寶藏》通過介紹中國文物,讓世界認識中國從哪裡來、向何處去,從而使各國人民更加深刻地感知中國、了解中國、領悟中國。這部紀錄片體現了中英兩國人民對美好生活的共同嚮往、對文明交流互鑒的共同追求。”

(記者 牛夢笛 通訊員 游歡)

本站聲明:網站內容來http://www.societynews.cn/html/wh/fq/,如有侵權,請聯繫我們,我們將及時處理

網頁設計最專業,超強功能平台可客製化

窩窩以「數位行銷」「品牌經營」「網站與應用程式」「印刷品設計」等四大主軸,為每一位客戶客製建立行銷脈絡及洞燭市場先機。

文物里的唐都長安人生活_貨運

※回頭車貨運收費標準

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

  展出的文官俑。

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

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

  参觀者在觀展。

  近日,陝西西安博物院“樂居長安—唐都長安人的生活”展開展。本次展覽從西安博物院11萬餘件館藏文物中,特別遴選出280餘件/組唐代精品文物,分別圍繞唐長安的“城、人、衣、食、行、娛”等內容,對唐都長安人的生活進行了全面的再現和闡釋。新華社記者 劉瀟攝

本站聲明:網站內容來http://www.societynews.cn/html/wh/fq/,如有侵權,請聯繫我們,我們將及時處理

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

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

Apple Watch 才在台灣開放 ECG 心電圖功能,就有醫師分享幫病患找出心臟問題的實例_網頁設計公司

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

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

「越早電燒或是冷凍氣球治療,未來維持正常心律的機會越大,併發症越少」這是林中行醫師分享所引述的近期研究結果。不過從他所分享多年為莫名心悸所苦,做了多次 24 小時心電圖卻又無法找到問題的病例來看。以往這名病患可能得要再花更多時間才可能找到心房顫動徵狀的狀況,現在透過最近針對 Series 4(不包括 SE)以上 Apple Watch 開放的 ECG 心電圖功能在台灣開放之後。

這位 7、8 年來始終無法診斷出心臟問題的病患,透過 Apple Watch ECG 功能找到心臟狀況並儘速啟動治療的案例。繼續閱讀 Apple Watch 才在台灣開放 ECG 心電圖功能,就有醫師分享幫病患找出心臟問題的實例報導內文。

Apple Watch 才在台灣開放 ECG 心電圖功能,就有醫師分享幫病患找出心臟問題的實例

儘管國外早已有不少透過具備心電圖功能的 Apple Watch,即時測量發現心臟異常的案例。但從 Series 4 開賣等到 2020 年底才正式開放的這個 ECG 心電圖功能,在不到半個月的時間裡,想不到很快就為 7、8 年來始終懷疑自己心悸頭暈可能是心臟問題的蔡先生確認了病徵。
 
時常在社群媒體分享心臟相關知識與案例的林中行醫師,最近分享了一個透過 Apple Watch 心電圖功能確認心房顫動狀況的病患。說真的,用這樣的功能找出問題並不是什麼新聞了,但這位蔡先生的案例其實主要是在於,儘管他自己有察覺不適,但在這些年的時間歷經了 4、5 次的 24 小時心電圖檢查,卻始終無法在診斷期間發現異常。

▲圖片來源:Apple

這也使其多年來都為此所苦 — 不僅是身體不適而已,也包括了找不到病因的不安因素吧?再加上現在普遍的觀念是越早進行相關治療,未來維持正常心律的機會越大且併發症越少的關係,更讓人會希望能儘早發現狀況。

這次的案例,就是讓蔡先生透過 Apple Watch 在疑似發作的時候即時啟動 Apple Watch ECG 的偵測,最終也將輸出的 PDF 心電圖資料與林醫師討論後,確認為心房顫動並將盡快接受電燒治療。

這次的病例,林醫師也分享了 Apple Watch 產生的心電圖資料的判讀心得,認為「圖型真的清楚,實為診斷的一大利器…」是說,經過了這麼久的認證終於放行的這個功能,現在更透過這樣專業的醫師分享的案例讓人知道這類隨手可得的科技產品,也讓人開始知道,這是真的是有可能為輔助醫療用途幫上忙的。也的確如醫師所說,是心律不整病人的福音。

更多資訊:
· Apple Watch 蘋果官網
· 心房顫動相關知識

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

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

延伸閱讀:

HomePod mini 開箱體驗:一顆就能敲開蘋果智慧家門,兩顆更是不嫌多

Porsche Taycan 4S 生活試駕體驗:它沒有瘋狂模式,你有

您也許會喜歡:

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

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

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

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

Google 搜尋魔爪(?)伸向 Instagram 與抖音短影片_網頁設計公司

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

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

短影音的流行,可以從各種服務近年都開始「致敬」Snapchat 的風潮看出。然而,這方面的資訊以往卻無法在 Google 搜尋找到,顯然會一定程度導致使用者變成分別得到不同的平台尋找想看的內容,不再倚賴這個搜尋服務(業績掉的意思)。現在,這個情況似乎將獲得解決。繼續閱讀 Google 搜尋魔爪(?)伸向 Instagram 與抖音短影片報導內文。

▲圖片來源:TechCrunch

Google 搜尋魔爪(?)伸向 Instagram 與抖音短影片

其實這個功能已經在今年稍早啟動了相關的測試,不過據稱現在已經可以開始普遍地在 Google Search 的行動應用中發現(雖然小編在 Android 與 iOS app 似乎都沒看到) 。只要搜尋特定字串如:Packers,便可看到 Instagram 與 TikTok 抖音的短影片內容,出現在 Short Videos 欄位之中。

現在雖然搜尋一般內容並不會顯示短影片的資訊,但很顯然 Google 應該是已經緊鑼密鼓準備要將搜尋引擎的索引爬蟲,伸向這些以往無法觸及的領域。

▲圖片來源:9to5Google

是說,其實類似的功能 Google 也有針對推特的相關平台伸手過。只不過這明顯也是要看其他平台願不願意「配合」?畢竟 Facebook 內建的搜尋功能能找到的東西,似乎與 Google 搜尋還是差上一截。總覺得未來也許也要端看這些短影音服務是否真的肯開放索引,這也將直接影響到這種搜尋結果的實用程度。

而就目前來講點入這些短影音搜尋結果只會開啟網路版本,不會跳轉至 App 的狀態來講,感覺這些短影音社群的服務業者應該不會太樂意?

▲圖片來源:TechCrunch

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

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

引用來源

延伸閱讀:

Tesla FSD 全自動輔助駕駛夜晚山路表現如何?實測看來似乎比多數人開得更好…(影片)

Apple Watch 才在台灣開放 ECG 心電圖功能,就有醫師分享幫病患找出心臟問題的實例

您也許會喜歡:

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

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

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

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

國外用戶抱怨 AirPods Max 長時間使用後,耳罩裡面會出現水滴_包裝設計包裝設計,南投搬家公司費用,網頁設計

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

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

AirPods Max 台灣要等到明年 2 月才會到貨,但國外第一批購買者早在 12/15 就已經拿到,離現在也過了半個月,果然不出所料,新產品多少都有些問題,最近就有多位用戶在 Reddit 論壇上反應,他的 AirPods Max 使用一段時間後,耳罩內會出現水滴,雖然目前還沒有引起任何故障,但畢竟 AirPods Max 不防水,還是會讓人擔心這個現象。

國外用戶抱怨 AirPods Max 長時間使用後,耳罩裡面會出現水滴

近日一名 Donald_Filimon 網友在 Reddit 論壇上抱怨,長時間使用 AirPods Max 之後,耳罩裡面都會有多個凝結小水滴。他沒有在潮濕的環境使用過,主要都是坐在辦公桌前,如果不是某次耳機檢測不正常,他也不知道裡面發生這種情況:

從他 Twitter 推文圖片可以看到,這凝結小水滴數量還真的不是普通的多,感覺很像流汗:

So, uhh… my AirPods Max form condensation after extended use. They’ve never been used in any humid environment. The water gets inside the drivers and has caused ear detection problems. I’ve been wearing them inside sitting at a desk mainly, nothing crazy. Super concerning issue pic.twitter.com/0pWicvxLv9

— Donald Filimon (@donaldfilimon) December 27, 2020

隨後陸續有多位用戶也回報發生同樣狀況像這位 Natural-Peak-4366,他住在佛羅里達州的布雷登頓(Bradenton),使用 AirPods max 長達 2.5 個小時,想清潔耳將耳罩取下後,才注意到裡面有凝結小水滴,他覺得很奇怪,因為他沒有四處走動。這狀況真的嚇到我了:

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

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

好消息是,至少這幾位用戶把水滴弄乾之後,AirPods Max 並沒有出現任何故障問題,依舊可以正常使用。

不過不確定這是個案,還是每一個 AirPods Max 都有這狀況,但至少 AirPods Max 的耳罩還蠻容易拆卸的,手邊已經有的人,建議每使用一段時間就打開來擦拭一下,來避免這些凝結小水滴產生更大的問題。

至於導致水滴的原因,有人猜測可能是最近冬天比較冷,房間溫度低,長時間使用才會發生這狀況。

資料來源:Reddit

日本網友異想天開使用民間散熱法 + 散熱片幫 MacBook 散熱,結果螢幕不小心蓋上整個毀了

您也許會喜歡:

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

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

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

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

Blazor 修仙之旅 – 組件與數據綁定_網頁設計

※推薦評價好的iphone維修中心

擁有專業的維修技術團隊,同時聘請資深iphone手機維修專家,現場說明手機問題,快速修理,沒修好不收錢

一.前言

在第一篇文章中,有提到過組件(Component)這個概念。組件在 Blazor 中是必不可少的,UI 全靠它組裝起來,和前端的 JS 組件是一個意思,比如:vue component、react component 等等。借用官方文檔的描述:

Blazor 應用是使用組件構建的。 組件是自包含的用戶界面 (UI) 塊,例如頁、對話框或窗體。 組件包含插入數據或響應 UI 事件所需的 HTML Tag和處理邏輯。 組件非常靈活且輕量。 可在項目之間嵌套、重複使用和共享。

二.組件

組件一般以 .razor 為文件名後綴,且組件名必須以大寫字母開頭(猜測可能是和VUE里的命名限制一樣,表面和Html標籤名重複)。

我們新建的項目,Shared 文件夾中就有三個組件:

左側導航菜單組件:

在主布局組件中應用了導航菜單組件:

更多關於組件的資料請查閱官方文檔:創建和使用 ASP.NET Core Razor 組件

三.數據綁定

1.介紹

Razor 組件通過名為 @bind 的HTML元素屬性提供數據綁定功能,這個綁定是雙向的。

@bind 是區分大小寫的,例如:@BIND@Bind 都是錯誤的,下面寫了一個例子,將 CurrentValue 綁定到兩個文本框中。

<div class="row">
    <div class="col-6">
        <input class="form-control" type="text" @bind="CurrentValue" />
    </div>
    <div class="col-6">
        <input class="form-control" type="text" @bind="CurrentValue" />
    </div>
</div>

<div class="row">
    <button class="btn btn-primary" @onclick="ChangeValue">變 更</button>
</div>

@code
{
    public int CurrentValue { get; set; } = 0;

    private void ChangeValue()
    {
        CurrentValue ++;
    }
}

需要注意的是在文本框的綁定中,僅當呈現組件時,UI才會更新文本框,而不響應於更改屬性的值。由於組件是在事件處理程序代碼執行后呈現的,因此屬性更新通常在觸發事件處理程序后立即反映在UI中。

@bind="CurrentValue" 等同於以下代碼:

<input value="@CurrentValue"
    @onchange="@((ChangeEventArgs __e) => CurrentValue = 
        __e.Value.ToString())" />
        
@code {
    public int CurrentValue { get; set; } = 0;
}

點擊按鈕,變更了值,也會應用到文本框中:

網頁設計最專業,超強功能平台可客製化

窩窩以「數位行銷」「品牌經營」「網站與應用程式」「印刷品設計」等四大主軸,為每一位客戶客製建立行銷脈絡及洞燭市場先機。

2.變更綁定事件

上面小節中,默認綁定了 onchange 事件,只有文本框失去焦點才會觸發,體驗不是很好,那麼可不可以在輸入的時候就同步更新值呢,當然是可以的,解決方案就是變更綁定事件為 oninput,通過設置@bind:event屬性來變更綁定事件:

<div class="col-6">
    <input class="form-control" type="text" @bind="CurrentValue" @bind:event="oninput" />
</div>
<div class="col-6">
    <input class="form-control" type="text" @bind="CurrentValue" @bind:event="oninput" />
</div>

3.輸入錯誤的值

我們設置的 CurrentValue 的類型是 int ,如果我們輸入字母,那麼字母將不會被接受,同時值會恢復到輸入前的正確值。

4.子父組件數據傳遞

在 vue、react 等 js 中,都有子父組件傳值概念,Blazor 也不例外。

(1)父傳子

新建一個子組件命名為 ChildComponent

<div class="row">
    <h2>子組件</h2>
</div>

<div class="row">
    <span>Year: </span> <input class="form-control" type="text" value="@Year" />
</div>

@code {
    [Parameter]
    public int Year { get; set; }

    [Parameter]
    public EventCallback<int> YearChanged { get; set; }
}

定義一個 Year 屬性和 EventCallback<int> 類型的屬性 YearChanged

新建一個父組件命名為ParentComponent

<div class="row">
    <h2>父組件</h2>
</div>

<div class="row">
    <span>ParentYear: </span> <input class="form-control" type="text" @bind="ParentYear" @bind:event="oninput"/>
</div>

<ChildComponent @bind-Year="ParentYear" />

@code {
    [Parameter]
    public int ParentYear { get; set; } = 1978;
}

在頁面中引用父組件:

YearChanged 是一個約定命名,不能更改,更改將會報錯:

EventCallback 用於子父組件嵌套時公開事件,比如 YearChanged 就公開了子組件 Year 屬性的 changed 事件。父組件里,通過 @bind-Year 來綁定 Year 的 changed 事件,然後將父組件 ParentYear 的值傳遞過去,達成父級組件向子級組件傳遞值。

<ChildComponent @bind-Year="ParentYear" /> 等同於 <ChildComponent @bind-Year="ParentYear" @bind-Year:event="YearChanged" /> ,如果使用後者,那麼事件命名將不會受約定命名限制。

運行效果:

(2)子傳父(鏈式綁定)

子傳父,無法直接通過 @bind 來實現,需要單獨指定事件處理程序和值,我們更改上面的子組件,定義一個 OnYearChanged 事件,並將其綁定到文本框的 oninput 事件,在事件裏手動更新了 Year的值,並調用 YearChanged 來進行傳遞。

<div class="row">
    <h2>子組件</h2>
</div>

<div class="row">
    <span>Year: </span> <input class="form-control" type="text" @oninput="OnYearChanged" value="@Year" />
</div>

@code {
    [Parameter]
    public int Year { get; set; }

    [Parameter]
    public EventCallback<int> YearChanged { get; set; }

    private Task OnYearChanged(ChangeEventArgs e)
    {
        Year = int.Parse(e.Value.ToString());

        return YearChanged.InvokeAsync(Year);
    }
}

運行:

四.資料

  • 本文Demo

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

台北網頁設計公司這麼多該如何選擇?

網動是一群專業、熱情、向前行的工作團隊,我們擁有靈活的組織與溝通的能力,能傾聽客戶聲音,激發創意的火花,呈現完美的作品

被纏上了,小王問我怎麼在 Spring Boot 中使用 JDBC 連接 MySQL_貨運貨運,南投搬家公司費用,網頁設計

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

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

上次幫小王入了 Spring Boot 的門后,他覺得我這個人和藹可親、平易近人,於是隔天小王又微信我說:“二哥,快教教我,怎麼在 Spring Boot 項目中使用 JDBC 連接 MySQL 啊?”

收到問題的時候,我有點頭大,難道以後就要被小王纏上了?

沒等我發牢騷,小王就緊接着說:“二哥,你先別生氣,上次你幫了我的忙后,我在心裏感激了你一晚上,想着第一次遇到這麼親切的大佬,一定要抱緊大腿。。。。。”

馬屁拍到這份上,我的氣自然也就消了。隨後,我花了五分鐘的時間幫他解決了苦惱,沒成想,他又發給我了一個小紅包,表示對我的感謝。並建議我再寫一篇文章出來,因為他覺得像他這樣的小白還有很多。沒辦法,我關上門,開了燈,開始了今天這篇文章的創作。

01、初始化 MySQL 數據庫

既然要連接 MySQL,那麼就需要先在電腦上安裝 MySQL 服務(本文暫且跳過),並且創建數據庫和表。

CREATE DATABASE `springbootdemo`;
DROP TABLE IF EXISTS `mysql_datasource`;
CREATE TABLE `mysql_datasource` (
  `id` varchar(64NOT NULL,
  PRIMARY KEY (`id`)
ENGINE=InnoDB DEFAULT CHARSET=utf8;

02、使用 Spring Initlallzr 創建 Spring Boot 項目

創建一個 Spring Boot 項目非常簡單,通過 Spring Initlallzr(https://start.spring.io/)就可以了。

勾選 Lombok、Web、MySQL Driver、Actuator、JDBC 等五個依賴。

1)Lombok 是一種 Java 實用工具,可用來幫助開發人員消除 Java 的一些冗餘代碼,比如說可以通過註解生成 getter/setter。使用之前需要先在 IDE 中安裝插件。

2)Web 表明該項目是一個 Web 項目,便於我們直接通過 URL 來實操。

3)MySQL Driver:連接 MySQL 服務器的驅動器。

4)Actuator 是 Spring Boot 提供的對應用系統的自省和監控的集成功能,可以查看應用配置的詳細信息,例如自動化配置信息、創建的 Spring beans 以及一些環境屬性等。

5)JDBC:本篇文章我們通過 JDBC 來連接和操作數據庫。

選項選擇完后,就可以點擊【Generate】按鈕生成一個初始化的 Spring Boot 項目了。生成的是一個壓縮包,導入到 IDE 的時候需要先解壓。

03、編輯 application.properties 文件

項目導入成功后,等待 Maven 下載依賴,完成后編輯 application.properties 文件,配置 MySQL 數據源信息。

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/springbootdemo
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

1)spring.datasource. 為固定格式。

2)URL 為 MySQL 的連接地址。

3)username 為數據庫的訪問用戶名。

4)password 為數據庫的訪問密碼。

5)driver-class-name 用來指定數據庫的驅動器。也可以不指定,Spring Boot 會根據 URL(有 mysql 關鍵字) 自動匹配驅動器。

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

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

04、編輯 Spring Boot 項目

為了便於我們操作,我們對 SpringBootMysqlApplication 類進行編輯,增加以下內容。

@SpringBootApplication
@RestController
public class SpringBootMysqlApplication {
    @Autowired
    private JdbcTemplate jdbcTemplate;

    @RequestMapping("insert")
    public String insert() {
        String id = UUID.randomUUID().toString();
        String sql = "insert into mysql_datasource (id,name) values ('"+id+"','沉默王二')";
        jdbcTemplate.execute(sql);
        return "插入完畢";
    }

}

1)@SpringBootApplication、@RestController、@RequestMapping 註解在[之前的文章]()中已經介紹過了,這裏不再贅述。

2)@Autowired:顧名思義,用於自動裝配 Java Bean。

3)JdbcTemplate:Spring 對數據庫的操作在 jdbc 上做了深層次的封裝,利用 Spring 的注入功能可以把 DataSource 註冊到 JdbcTemplate 之中。JdbcTemplate 提供了四個常用的方法。

①、execute() 方法:用於執行任何 SQL 語句。

②、update() 方法:用於執行新增、修改、刪除等 SQL 語句。

③、query() 方法:用於執行查詢相關 SQL 語句。

④、call() 方法:用於執行存儲過程、函數相關 SQL 語句。

本例中我們使用 execute() 方法向 mysql_datasource 表中插入一行數據 {id:uuid, name:'沉默王二'}

05、運行 Spring Boot 項目

接下來,我們直接運行 SpringBootMysqlApplication 類,這樣一個 Spring Boot 項目就啟動成功了。

這時候,我們可以直接瀏覽器的 URL 中鍵入 http://localhost:8080/insert 測試 MySQL 的插入語句是否執行成功。很遺憾,竟然出錯了。

該怎麼辦呢?這需要我們在連接字符串中顯式指定時區,修改 spring.datasource.url 為以下內容。

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/springbootdemo?serverTimezone=UTC

重新運行該項目后再次訪問,發現數據插入成功了。

為了確保數據是否真的插入成功了,我們通過 Navicat(一款強大的數據庫管理和設計工具)來查看一下。

情況不妙,中文亂碼了。該怎麼辦呢?需要我們在連接字符串中顯式指定字符集,修改 spring.datasource.url 為以下內容。

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/springbootdemo?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC

重新運行該項目后再次訪問,發現中文不再亂碼了。

快給自己點個贊。

06、鳴謝

我是沉默王二,一枚有趣的程序員。如果覺得文章對你有點幫助,請微信搜索「 沉默王二 」第一時間閱讀,回復【666】更有我為你精心準備的 500G 高清教學視頻(已分門別類)。

本文 GitHub 已經收錄,有大廠面試完整考點,歡迎 Star。

原創不易,莫要白票,請你為本文點個贊吧,這將是我寫作更多優質文章的最強動力。

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

※回頭車貨運收費標準

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

這些Java8官方挖過的坑,你踩過幾個?_網頁設計公司

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

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

導讀:系統啟動異常日誌竟然被JDK吞噬無法定位?同樣的加密方法,竟然出現部分數據解密失敗?往List裏面添加數據竟然提示不支持?日期明明間隔1年卻輸出1天,難不成這是天上人間?1582年神秘消失的10天JDK能否識別?Stream很高大上,List轉Map卻全失敗……這些JDK8官方挖的坑,你踩過幾個? 關注公眾號【碼大叔】,實戰踩坑硬核分享,一起交流!

@

目錄

  • 一、Base64:你是我解不開的迷
  • 二、被吞噬的異常:我不敢說出你的名字
  • 三、日期計算:我想留住時間,讓1天像1年那麼長
  • 四、List:一如你我初見,不增不減
  • 五、Stream處理:給你,獨一無二
  • 六、結尾:紙上得來終覺淺,絕知此事要躬行!
  • 推薦閱讀

一、Base64:你是我解不開的迷

出於用戶隱私信息保護的目的,系統上需將姓名、身份證、手機號等敏感信息進行加密存儲,很自然選擇了AES算法,外面又套了一層Base64,之前用的是sun.misc.BASE64Decoder/BASE64Encoder,網上的資料基本也都是這種寫法,運行得很完美。但這種寫法在idea或者maven編譯時就會有一些黃色告警提示。到了Java 8后,Base64編碼已經成為Java類庫的標準,內置了 Base64 編碼的編碼器和解碼器。於是乎,我手賤地修改了代碼,改用了jdk8自帶的Base64方法

import java.util.Base64;

public class Base64Utils {

    public static final Base64.Decoder DECODER = Base64.getDecoder();
    public static final Base64.Encoder ENCODER = Base64.getDecoder();

    public static String encodeToString(byte[] textByte) {
        return ENCODER.encodeToString(textByte);
    }

    public static byte[] decode(String str) {
        return DECODER.decode(str);
    }

}

程序員的職業操守咱還是有的,構造新老數據、自測、通過,提交測試版本。信心滿滿,我要繼續延續我 0 Bug的神話!然後……然後版本就被打回了。

Caused by: java.lang.IllegalArgumentException: Illegal base64 character 3f
    at java.util.Base64$Decoder.decode0(Base64.java:714)
    at java.util.Base64$Decoder.decode(Base64.java:526)
    at java.util.Base64$Decoder.decode(Base64.java:549)

關鍵是這個錯還很詭異,部分數據是可以解密的,部分解不開

Base64依賴於簡單的編碼和解碼算法,使用65個字符的US-ASCII子集,其中前64個字符中的每一個都映射到等效的6位二進制序列,第65個字符(=)用於將Base64編碼的文本填充到整數大小。後來產生了3個變種:

  • RFC 4648:Basic
    此變體使用RFC 4648和RFC 2045的Base64字母表進行編碼和解碼。編碼器將編碼的輸出流視為一行; 沒有輸出行分隔符。解碼器拒絕包含Base64字母表之外的字符的編碼。​
  • RFC 2045:MIME
    此變體使用RFC 2045提供的Base64字母表進行編碼和解碼。編碼的輸出流被組織成不超過76個字符的行; 每行(最後一行除外)通過行分隔符與下一行分隔。解碼期間將忽略Base64字母表中未找到的所有行分隔符或其他字符。
  • RFC 4648:Url
    此變體使用RFC 4648中提供的Base64字母表進行編碼和解碼。字母表與前面显示的字母相同,只是-替換+和_替換/。不輸出行分隔符。解碼器拒絕包含Base64字母表之外的字符的編碼。
S.N. 方法名稱 & 描述
1 static Base64.Decoder getDecoder()
返回Base64.Decoder解碼使用基本型base64編碼方案。
2 static Base64.Encoder getEncoder()
返回Base64.Encoder編碼使用的基本型base64編碼方案。
3 static Base64.Decoder getMimeDecoder()
返回Base64.Decoder解碼使用MIME類型的base64解碼方案。
4 static Base64.Encoder getMimeEncoder()
返回Base64.Encoder編碼使用MIME類型base64編碼方案。
5 static Base64.Encoder getMimeEncoder(int lineLength, byte[] lineSeparator)
返回Base64.Encoder編碼使用指定的行長度和線分隔的MIME類型base64編碼方案。
6 static Base64.Decoder getUrlDecoder()
返回Base64.Decoder解碼使用URL和文件名安全型base64編碼方案。
7 static Base64.Encoder getUrlEncoder()
返回Base64.Decoder解碼使用URL和文件名安全型base64編碼方案。

關於base64用法的詳細說明,可參考:https://juejin.im/post/5c99b2976fb9a070e76376cc

對於上面的錯誤,網上有的說法是,建議使用Base64.getMimeDecoder()Base64.getMimeEncoder(),對此我只能建議:老的系統如果已經有數據了,就不要使用jdk自帶的Base64了。JDK官方的Base64和sun的base64是不兼容的!不要替換!不要替換!不要替換!

二、被吞噬的異常:我不敢說出你的名字

這個問題理解起來還是蠻費腦子的,所以我把這個系統異常發生的過程提煉成了一個美好的故事,放鬆一下,吟詩一首!

最怕相思濃
一切皆是你
唯獨
不敢說出你的名字
— 碼大叔

這個問題是在使用springboot的註解時遇到的問題,發現JDK在解析註解時,若註解依賴的類定義在JVM加載時不存在,也就是NoClassDefFoundError時,實際拿到的異常將會是ArrayStoreException,而不是NoClassDefFoundError,涉及到的JDK里的類是AnnotationParser.java, 具體代碼如下:

private static Object parseClassArray(int paramInt, ByteBuffer paramByteBuffer, ConstantPool paramConstantPool, Class<?> paramClass) {
    Class[] arrayOfClass = new Class[paramInt];
    int i = 0;
    int j = 0;
    for (int k = 0; k < paramInt; k++){
        j = paramByteBuffer.get();
        if (j == 99) {
            // 注意這個方法
        	arrayOfClass[k] = parseClassValue(paramByteBuffer, paramConstantPool, paramClass);
        } else {
        	skipMemberValue(j, paramByteBuffer);
        	i = 1;
        }
    }
    return i != 0 ? exceptionProxy(j) : arrayOfClass;
}
private static Object parseClassValue(ByteBuffer paramByteBuffer, ConstantPool paramConstantPool, Class<?> paramClass) {
    int i = paramByteBuffer.getShort() & 0xFFFF;
    try
    {
        String str = paramConstantPool.getUTF8At(i);
        return parseSig(str, paramClass);
    } catch (IllegalArgumentException localIllegalArgumentException) {
        return paramConstantPool.getClassAt(i);
    } catch (NoClassDefFoundError localNoClassDefFoundError) {
         // 注意這裏,異常發生了轉化
        return new TypeNotPresentExceptionProxy("[unknown]", localNoClassDefFoundError);
    } catch (TypeNotPresentException localTypeNotPresentException) {
        return new TypeNotPresentExceptionProxy(localTypeNotPresentException.typeName(), localTypeNotPresentException.getCause());
    }
}

parseClassArray這個方法中,預期parseClassValue返回Class對象,但看實際parseClassValue的邏輯,在遇到NoClassDefFoundError時,返回的是TypeNotPresentExceptionProxy,由於類型強轉失敗,最終拋出的是java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy,此時只能通過debug到這行代碼,找到具體是缺少哪個類定義,才能解決這個問題。

筆者重現一下發現這個坑的場景,有三個module,module3依賴module2但未聲明依賴module1,module2依賴module1,但聲明的是optional類型,依賴關係圖如下:

上面每個module中有一個Class,我們命名為ClassInModuleX。ClassInModule3啟動時在註解中使用了ClassInModule2的類,而ClassInModule2這個類的繼承了ClassInModule1,這幾個類的依賴關係圖如下:

如此,其實很容易知道在module運行ClassInModule3時,會出現ClassInModule1的NoClassDefFoundError的,但實際運行時,你能看到的異常將不是NoClassDefFoundError,而是java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy,此時,若想要知道具體是何許異常,需通過debug在AnnotationParser中定位具體問題,以下展示兩個截圖,分別對應系統控制台實際拋出的異常和通過debug發現的異常信息。

控制台異常信息:

注意異常實際在紅色圈圈這裏,自動收縮了,需要展開才可以看到通過debug發現的異常信息:

如果你想體驗這個示例,可關注公眾號碼大叔和筆者交流。如果你下次遇到莫名的java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy,請記得用這個方法定位具體問題。

三、日期計算:我想留住時間,讓1天像1年那麼長

Java8之前日期時間操作相當地麻煩,無論是Calendar還是SimpleDateFormat都讓你覺得這個設計怎麼如此地反人類,甚至還會出現多線程安全的問題,阿里巴巴開發手冊中就曾禁用static修飾SimpleDateFormat。好在千呼萬喚之後,使出來了,Java8帶來了全新的日期和時間API,還帶來了Period和Duration用於時間日期計算的兩個API。

Duraction和Period,都表示一段時間的間隔,Duraction正常用來表示時、分、秒甚至納秒之間的時間間隔,Period正常用於年、月、日之間的時間間隔。

網上的大部分文章也是這麼描述的,於是計算兩個日期間隔可以寫成下面這樣的代碼:

// parseToDate方法作用是將String轉為LocalDate,略。
LocalDate date1 = parseToDate("2020-05-12");
LocalDate date2 = parseToDate("2021-05-13");
// 計算日期間隔
int period = Period.between(date1,date2).getDays();

一個是2020年,一個是2021年,你認為間隔是多少?1年?
恭喜你,和我一起跳進坑裡了(畫外音:裏面的都擠一擠,動一動,又來新人了)。
正確答案應該是:1天。

這個單詞的含義以及這個方法看起來確實是蠻誤導人的,一不注意就會掉進坑裡。Period其實只能計算同月的天數、同年的月數,不能計算跨月的天數以及跨年的月數。

正確寫法1

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

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

 long period = date2.toEpochDay()-date1.toEpochDay();

toEpochDay():將日期轉換成Epoch 天,也就是相對於1970-01-01(ISO)開始的天數,和時間戳是一個道理,時間戳是秒數。顯然,該方法是有一定的局限性的

正確寫法2

long period = date1.until(date2,ChronoUnit.DAYS);

使用這個寫法,一定要注意一下date1和date2前後順序:date1 until date2。

正確做法3(推薦)

 long period = ChronoUnit.DAYS.between(date1, date2);

ChronoUnit:一組標準的日期時間單位。這組單元提供基於單元的訪問來操縱日期,時間或日期時間。 這些單元適用於多個日曆系統。這是一個最終的、不可變的和線程安全的枚舉。

看到”適用於多個日曆系統“這句話,我一下子想起來歷史上1582年神秘消失的10天,在JDK8上是什麼效果呢?1582-10-15和1582-10-04你覺得會相隔幾天呢?11天還是1天?有興趣的小夥伴自己去寫個代碼試試吧。

打開你的手機,跳轉到1582年10月,你就能看到這消失的10天了。

四、List:一如你我初見,不增不減

這個問題其實在JDK里存在很多年了,JDK8中依然存在,也是很多人最容易跳的一個坑!直接上代碼:

public List<String> allUser() {
    // 省略
    List<String> currentUserList = getUser();
    currentUserList.add("碼大叔");
    // 省略
}

就是上面這樣一段代碼,往一個list里添加一條數據,你覺得結果是什麼呢?“碼大叔”成功地添加到了List里?天真,不報個錯你怎麼能意識到JDK存在呢。

Exception in thread "main" java.lang.UnsupportedOperationException
    at java.util.AbstractList.add(AbstractList.java:148)

原因
因為在getUser方法里,返回的List使用的是Arrays.asList生成的,示例:

    private List<String> getUser(){
        return Arrays.asList("劍聖","小九九");
    }

我們來看看Arrays.asList的源碼

    @SafeVarargs
    @SuppressWarnings("varargs")
    public static <T> List<T> asList(T... a) {
        return new ArrayList<>(a);
    }
 private static class ArrayList<E> extends AbstractList<E>
        implements RandomAccess, java.io.Serializable
    {
   		private final E[] a;
        // 部分代碼略
        ArrayList(E[] array) {
            // 返回的是一個定長的數組
            a = Objects.requireNonNull(array);
        }
        // 部分代碼略
   }

很明顯,返回的實際是一個定長的數組,所以只能“一如你我初見”,初始化什麼樣子就什麼樣子,不能新增,不能減少。如果你理解了,那我們就再來一個栗子

   int[] intArr  = {1,2,3,4,5};
   Integer[] integerArr  = {1,2,3,4,5};
   String[] strArr = {"1", "2", "3", "4", "5"};
   List list1 = Arrays.asList(intArr);
   List list2 = Arrays.asList(integerArr);
   List list3 = Arrays.asList(strArr);
   System.out.println("list1中的數量是:" + list1.size());
   System.out.println("list2中的數量是:" + list2.size());
   System.out.println("list3中的數量是:" + list3.size());

你覺得答案是什麼?預想3秒鐘,揭曉答案,看跟你預想的是否一致呢?

list1中的數量是:1
list2中的數量是:5
list3中的數量是:5

是不是和你預想又不一樣了?還是回到Arrays.asList方法,該方法的輸入只能是一個泛型變長參數。基本類型是不能泛型化的,也就是說8個基本類型不能作為泛型參數,要想作為泛型參數就必須使用其所對應的包裝類型,那前面的例子傳遞了一個int類型的數組,為何程序沒有報編譯錯誤呢?在Java中,數組是一個對象,它是可以泛型化的,也就是說我們的例子是把一個int類型的數組作為了T的類型,所以在轉換后在List中就只有1個類型為int數組的元素了。除了int,其它7個基本類型的數組也存在相似的問題。

JDK里還為我們提供了一個便捷的集合操作工具類Collections,比如多個List合併時,可以使用Collections.addAll(list1,list2), 在使用時也同樣要時刻提醒自己:“請勿踩坑”!

五、Stream處理:給你,獨一無二

Java8中新增了Stream流 ,通過流我們能夠對集合中的每個元素進行一系列并行或串行的流水線操作。當使用一個流的時候,通常包括三個基本步驟:獲取一個數據源(source)→ 數據轉換→執行操作獲取想要的結 果,每次轉換原有 Stream 對象不改變,返回一個新的 Stream 對象(可以有多次轉換),這就允許對其操作可以 像鏈條一樣排列,變成一個管道。

項目上千萬不要使用Stream,因為一旦用起來你會覺得真屏蔽詞爽,根本停不下來。當然不可避免的,還是有一些小坑的。

假設我們分析用戶的訪問日誌,放到list里。

list.add(new User("碼大叔", "登錄公眾號"));
list.add(new User("碼大叔", "編寫文章"));

因為一些原因,我們要講list轉為map,Steam走起來,

private static void convert2MapByStream(List<User> list) {
    Map<String, String> map = list.stream().collect(Collectors.toMap(User::getName, User::getValue));
    System.out.println(map);
}

咣當,掉坑裡了,程序將拋出異常:

Exception in thread "main" java.lang.IllegalStateException: Duplicate key 碼大叔

使用Collectors.toMap() 方法中時,默認key值是不允許重複的。當然,該方法還提供了第三個參數:也就是出現 duplicate key的時候的處理方案

如果在開發的時候就考慮到了key可能重複,你需要在這樣定義convert2MapByStream方法,聲明在遇到重複key時是使用新值還是原有值:

    private static void convert2MapByStream(List<User> list) {
        Map<String, String> map = list.stream().collect(Collectors.toMap(User::getName, User::getValue, (oldVal, newVal) -> newVal));
        System.out.println(map);
    }

關於Stream的坑其實還是蠻多的,比如尋找list中的某個對象,可以使用findAny().get(),你以為是找到就返回找不到就就返回null?依然天真,找不到會拋出異常的,需要使用額外的orElse方法。

六、結尾:紙上得來終覺淺,絕知此事要躬行!

所謂JDK官方的坑,基本上都是因為我們對技術點了解的不夠深入,望文生義,以為是怎樣怎樣的,而實際上我們的自以為是讓我們掉進了一個又一個坑裡。面對着這些坑,我流下了學藝不精的眼淚!但也有些坑,確實發生的莫名其妙,比如吞噬異常,沒有理解JDK為什麼這麼設計。還有些坑,誤導性確實太強了,比如日期計算、list操作等。最後只能說一句:

紙上得來終覺淺,絕知此事要躬行!
編碼不易,且行且珍惜!

推薦閱讀

Try-Catch包裹的代碼異常后,竟然導致了產線事務回滾!
Redis 6.0 新特性-多線程連環13問!
報告老闆,微服務高可用神器已祭出,您花巨資營銷的高流量來了沒?
我成功攻擊了Tomcat服務器,大佬們的反應亮了

公眾號:碼大叔
資深程序員、架構師技術社區
微服務 | 大數據 | 架構設計 | 技術管理
個人微信:itmadashu

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

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

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