長矛射殺國家公園大猩猩領袖 四男恐被關到死

摘錄自2020年6月14日自由時報報導

遊客到訪烏干達都會排上尋找山地大猩猩的行程,近日卻傳出一隻「明星」大猩猩遭到長矛刺殺死亡,涉嫌殺害大猩猩的4名男子供稱,因為大猩猩企圖發動攻擊,因此自衛時才會不小心誤殺大猩猩,目前4人因違反野生動物保護法而被起訴,警方尚在釐清犯案過程,若4人罪名成立將可能面臨540萬美元(約新台幣1.6億元)的罰款或終身監禁。

綜合外媒報導,25歲的銀背大猩猩拉飛奇(Rafiki)在布恩迪難以穿越國家公園(Bwindi Impenetrable National Park)擔任恩庫林哥(Nkuringo)大猩猩團的領袖,深受遊客喜愛,6月1日拉飛奇離奇失蹤,隔日救難隊發現其遺體。

烏干達野生動物管理局表示拉飛奇的死亡是「很大的打擊」,因大猩猩是烏干達的主要旅遊景點之一,且目前大猩猩已瀕臨絕種被列為保育類動物,拉飛奇生前喜歡與人類互動,如今死亡恐怕導致大猩猩團不再信任人類甚至團體分裂,進而影響到當地旅遊發展與經濟。

物種保育
生態保育
生物多樣性
國際新聞
烏干達
銀背大猩猩

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

【其他文章推薦】

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

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

※回頭車貨運收費標準

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

※超省錢租車方案

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

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

研究:全球大型瀕危哺乳動物消失 最終原因是人口激增

環境資訊中心外電;姜唯 翻譯;林大利 審校;稿源:ENS

西藏野氂牛(Wild Yak,學名:Bos mutus)、巴塔哥尼亞馬駝鹿(Patagonian Huemul,學名:Hippocamelus bisulcus)、不丹的羚牛(Takin,學名:Budorcas taxicolor)、越南的中南大羚(Saola,學名:Pseudoryx nghetinhensis)等世界各地特殊大型哺乳動物正在悄悄消失。過去的幾十年間,連非洲的三種斑馬和牛羚也大幅度減少。

研究人員指出,造成這些哺乳動物消失的原因不僅僅是疾病和棲息地破碎化、森林砍伐或野生動植物貿易。最終原因是人口激增。

而且,除非人類行為大幅度改變,否則科學家認為,這些哺乳動物未來的族群狀況將永遠回不去了。

西藏野氂牛、巴塔哥尼亞馬駝鹿等世界各地特殊大型哺乳動物正悄悄消失。照片來源:birdcapemay(CC BY-NC-ND 2.0)

科學家分析全球大型哺乳動物角色改變的原因 答案正是人口激增

科學家將這些發現發表在《生態與演化前線(Frontiers in Ecology and Evolution)》期刊上,題目是「破碎的食物網和混亂的未來:面對地球人口不斷成長的現代有蹄類(Disassembled food webs and messy projections: modern ungulate communities in the face of unabating human population growth)」。

研究主要作者、科羅拉多州立大學教授伯傑(Joel Berger)說,是付諸行動的時候了,吹捧過去的保育成就對改善人類的未來沒什麼幫助。

在這項研究中,科學家們分析了導致全球生態系統中哺乳動物角色改變的直接和間接原因,同時也指出生態交互作用的本質如何產生根本性的變化,甚至在未來幾十年內更大規模地發生。

他們研究了巴塔哥尼亞馬駝鹿、不丹的羚牛,北美沙漠的野馬、狼和郊狼的變化,以及大型食肉動物就地滅絕後大生態系統改變的必然性。

科學家認為,隨著人口在陸地上的分布越來越廣,這些改變是現在進行式。

「即使是在喜馬拉雅山脈的偏遠地區,人類入侵帶來流浪狗和野狗,嚴重破壞了高經濟價值和文化象徵意義的野生和圈養物種。」不丹基金會的Wangchuk說。

隨著人口激增,大型哺乳動物數量卻是在遞減。圖為巴塔哥尼亞馬駝鹿。照片來源:Vera & Jean-Christophe(CC BY-SA 2.0)

2020年世界人口已接近80億 地球上的哺乳動物有97%是牲畜和人類

人類定居喜馬拉雅山部分地區還是近年暖化融冰後的事。科學家們還指出全球人口的劇烈變化。1830年,海軍中將羅伯特.斐茲洛伊(Robert Fitzroy)乘著小獵犬號穿越南美洲麥哲倫海峽(Magellan Straits)時,地球人口不到12億。到1970年世界地球日,已超過35億。

僅50年後的今天,世界人口已接近80億,牲畜和人類占了地球哺乳動物生物量高達97%。

研究團隊指出,全世界的食物網已被人類大幅改變無法回頭了,重建過去的條件或恢復曾經由原生種創造的生態功能幾乎是不可能的。例如今日除南極洲外,在每個大陸以及美國70%的州中都有野化的家豬。這些動物影響了魚類、爬行動物、鳥類以及其他小型哺乳動物,甚至植物和土壤。

此外,氣候變遷使海洋暖化,導致海洋藻類增生,漁獲量減少。相對魚類的需求減少,陸地上盜獵野生生物的情況隨之增加。

科學家們還記錄下時尚需求如何增加從蒙古、印度和中國輸出至西方的喀什米爾羊毛,導致更多中亞沙漠牧民飼養山羊。這些山羊與原生物種競爭食物,同時也因當地狗越來越多而身處險境。

這些狗不僅是掠食者,還攜帶疾病,傳染雪豹(Snow Leopard,學名:Panthera uncia)、西藏野驢(Kiang,學名:Equus kiang)和普氏原羚(Przewalski’s gazelle,學名:​​​​​​​Procapra przewalskii)等瀕臨滅絕的物種。

棲息在亞洲中部山區的雪豹。照片來源:Antonio Marín Segovia(CC BY-NC-ND 2.0)

但作者們認為,儘管形勢嚴峻,並非沒有機會挽回。像是在極地,適應寒冷氣候的物種仍是人類重要的文化資產,我們仍然有時間保存僅存的生態。

全世界還有許多保護區,如非洲的塞倫蓋蒂和克魯格國家公園、北美黃石公園和朗格-聖伊利亞斯國家公園暨保護區、玻利維亞麥迪迪國家公園、智利和阿根廷的巴塔哥尼亞冰原、中國長塘自然保護區以及世界最大國家公園東北格陵蘭國家公園。

儘管大型哺乳動物食物網將與過去有所不同、有著不同以往的運作方式,但對於未來的走向還有許多選擇。

作者表示:「現在還不算太晚,我們沒有時間為失去哀悼。必須將生態悲痛化為行動,尊重仍然存在的特殊生物多樣性,並透過保護地球的大片原野地來實現。」

Wildife Suffers Humpty Dumpty Effect as Humans Multiply FORT COLLINS, Colorado, June 9, 2020 (ENS)

Some of the world’s largest, most spectacular and unheralded mammals are silently slipping away – species like Tibetan wild yaks and Patagonia’s huemul, Bhutan’s takin and Vietnam’s saola. Even Africa’s three species of zebras and wildebeest have suffered massive reductions over the last several decades.

The reasons for these losses are more than disease and habitat fragmentation, deforestation or wildlife trade, according to researchers. Ultimately, the cause is rampant human population growth.

And unless human behavior changes in unprecedented ways, these scientists warn that future communities of these mammals will never resemble those of the recent past or even today.

The findings are based on a new study, “Disassembled food webs and messy projections: modern ungulate communities in the face of unabating human population growth,” published June 9 in the journal “Frontiers in Ecology and Evolution.”

Joel Berger, lead author of the study and a professor at Colorado State University, said that the time for action is now, and that touting past conservation achievements does little to better humanity’s future.

In this study, the scientists analyzed direct and indirect disruptions that lead to the changing roles of mammals in global ecosystems and noted how the nature of ecological interactions has changed and will do so, on an even larger scale, in the coming decades.

They looked at what has happened with the huemul in Patagonia, takin in Bhutan, wild horses in deserts, wolves and coyotes in North America, and the inevitability of change in big ecosystems as large carnivores are extirpated.

They said this is happening as the human population increases its footprint on land.

“Even in the remote reaches of the Himalayas, stray and feral dogs, a direct result of human intrusions, wreak havoc on wild and domestic species of high economic value and cultural importance,” said Wangchuk of the Bhutan Foundation.

Humans only recently colonized parts of the Himalayas, areas where ice has receded due to warming temperatures. Yet, the authors also point to human population change at a global scale. In 1830 when Vice-Admiral Robert Fitzroy captained his ship, the Beagle, through the Magellan Straits of South America, fewer than 1.2 billion people inhabited Earth. By Earth Day in 1970, there were more than 3.5 billion.

Today, only 50 years later the world’s population approaches eight billion. Livestock and humans now constitute a staggering 97 percent of the planet’s mammal biomass.

The research team explained that worldwide food webs have become irretrievably altered by humans, with little hope to reconstitute even recent past conditions or to put back the ecological functions once created by native species.

Feral pigs, for instance, exist today on every continent except Antarctica, and in 70 percent of the states in the United States. These animals disrupt fish, reptiles, birds and other small mammals, plants and soils.

In addition, climate change warms the oceans, which in turn foments marine algal blooms, reducing fishery catches. With less demand for fish, a consequent uptick in wildlife poaching on land occurs.

The scientists also documented how an appetite for fashion like cashmere increases imports to the west from Mongolia, India and China, resulting in economic incentives for desert pastoralists to produce more domestic goats in central Asia. These goats compete for food with native species and are in danger due to increasing numbers of dogs in these areas.

The dogs are not only predators but also carry diseases, which jeopardizes endangered species like snow leopards, kiang and Przewalksi’s gazelle.

Berger and the study authors suggest that despite the grim findings, all is not yet lost.

Prospects for ecological integrity and the conservation of unheralded species improve greatly toward the world’s edges where the planet’s cold-adapted species remain important to the human spirit and we still have time to save what we have.

The world has remarkable protected areas including Serengeti and Kruger National Park in Africa, Yellowstone and Wrangell-St. Elias National Park & Preserve in North America, Madidi National Park in Bolivia, the Patagonia Ice Fields of Chile and Argentina, the Chang Tang Nature Reserve in China, and Northeast Greenland National Park, the world’s largest national park.

And although food webs with large mammals will be different from those of the past and operate differently today, there are options to shape the future.

“It is not too late and we simply do not have the luxury of time to mourn what we have lost,” said Lambert. “We need to use our ecological grief to implement action and honor the exceptional biodiversity that remains. This can be done by protecting large tracts of the planet’s wild places.”

※ 全文及圖片詳見:ENS

保育類野生動物
哺乳動物
人口
國際新聞
生態保育
生物多樣性

作者

姜唯

如果有一件事是重要的,如果能為孩子實現一個願望,那就是人類與大自然和諧共存。

林大利

於特有生物研究保育中心服務,小鳥和棲地是主要的研究對象。是龜毛的讀者,認為龜毛是探索世界的美德。

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

【其他文章推薦】

※回頭車貨運收費標準

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

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

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

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

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

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

什麼樣的車才稱得上是真正的7座車?

老實說,現在我還是覺得自己選擇是正確的。GL8對於我來說,用於家用的時候,可以說是“好幫手”,用於商務的時候也是很給足我面子。每逢過年過節,都有親戚朋友來借我的GL8,出門去個自駕。(順便讓我的老款GL8空間亮相一下,見下圖)在這裏可以給想買GL8的朋友一些建議,對於新款的GL8,我這老車主有話要說:一、外在方面:宜商宜家以前還覺得買GL8太商務,但是現在看新款GL8,其設計宜商宜家都挺適合的,宜商的話,和豪華車沒什麼區別,甚至功能層面更實用,分分鐘給足你面子。

引言

本人是GL8車主,兩年前買的,當大家在一直追逐於SUV的時候,我選擇了MpV,一款能給我足夠的空間享受的愛車。GL8一次也沒給我打過臉,這次大學同學聚會更是如此。當我開車把大家送到酒店時,大家開始聊起開什麼車的話題,同學里有開BMW 5,也有開奧迪A4L,不過發現有很大部分人和我一樣選擇了7座車,漢蘭達、奧德賽、艾力紳、大眾夏朗等等,大家結婚生子甚至有些已經生了二胎后,都處於上有老下有小的階段,7座車正好符合了我們這群人的用車需求。

奧德賽 夏朗 艾力紳 漢蘭達

這是我的愛車——2014款的豪華商務旗艦版GL8(順便露一下臉)

從談話中,總結了我們這群7座車主同學們對於7座的共同訴求:(請叫我雷鋒,拿去不謝)

1. 乘坐空間大——滿足日常用車需要,典型的“421家庭”出行方便,甚至連家裡的寵物狗帶進來都沒問題。

2. 乘坐感要夠舒適——第二排空間足夠舒適,比起轎車或者兩廂車乘坐的人要舒服。

3. 儲物空間要大——很多車上沒辦法放進來的物品都能塞得下,甚至是自行車。

滿意的點總是那麼的相似,而吐槽的點確實各不相同,彷彿“車車都有一本難念的經“。(為了這文章,同學們紛紛發來的圖片,只供觀看,不許外傳。)

奧德賽車主說:我的奧德賽座椅空間還不錯,家裡用用完全篤定,開出去也夠掙面子。就是儲物空間讓我有點受不了,一輛如此大的MpV居然設計得這麼不人性化,就比如第二排吧,商務座椅挺舒服,但卻連一個杯架都沒有。還有就是后懸太硬,有幾次去外地經過路況差的地方顛簸挺大的,坐後排的人抱怨不是很舒服。隔音也一般,車子開稍快些會有點吵。

艾力紳車主說:我的艾力紳在儲物格的設計方面還好,二、三排空間還算過得去。但油箱太小,大塊頭耗油快,經常去加油站排隊加油有點苦逼。沒有電動尾門,不過後來我自己改裝了。另外,平時接小孩上下學挺方便的,二三排過道還有點小,尤其是三排進出不是很方便。我家小孩已經不是第一次跟我抱怨這個點,現在每次出趟遠門,都要考慮誰坐第三排的位置。

漢蘭達車主說:你們都沒我的苦逼,我的第三排,8成時間都是放倒,用來當儲物格。當初買車的時候就沒注意到,2-3-2結構的座椅,每次家人要坐到第三排的時候,都要把第2排座椅放倒才能爬進去,每次爸媽要坐進去的時候都費好大勁,老母的腿腳不好還是略折騰。麻煩也就算了,我有時候還要考慮安全問題。三排後面就是后擋風玻璃,我每次一踩剎車就會不自覺地看后視鏡,怕一不小心追尾,家人坐第三排直接成肉靶子。你們說,我這跟買個5座的有什麼區別。

奧德賽車主說:說到放東西我還有話要說,我家小寶貝3周歲,為了乘車安全我買了個兒童安全座椅,平時就鎖在二排,帶寶貝去公園的時候就直接坐上去。不過上周,客戶從北京飛過來,領導派我去機場接,我那安全座椅事先忘記拿下來了,結果到了發現來了一票人,我把安全座椅拆下來招呼客戶坐進去,卻發現後備箱根本塞不下,那叫一個尷尬啊,最後只能強行放三排,大家擠一擠了。

大眾夏朗車主(女)說:這有啥尷尬的,有次我和我老公出去,還帶着我們家那小泰迪,一開始給我抱着,後來大概是看到隔壁車的小泰迪激動了,一個乘我不注意,直接竄到第三排去,還開始亂跳抓椅子,那時候在高架上,我中間有排擋過不去,也沒辦法開車門,真是心疼死了。

艾力紳車主說:你們的問題都小事,最重要的是我們家經常一家出遊,坐滿人後,後排放的行李很多,經常後備箱是不夠位置放的,都要放車內,我是欲哭無淚啊!

這同學會聚的,都快成為一個七座車吐槽大會了,身為GL8車主的我,當他們問為我的時候,我只能笑而不語,他們說的這些問題,我都很少遇到。我只能說同學們說的這些問題,在我買車的時候都考慮過,在萬眾排除后,我選擇GL8。老實說,現在我還是覺得自己選擇是正確的。

GL8對於我來說,用於家用的時候,可以說是“好幫手”,用於商務的時候也是很給足我面子。每逢過年過節,都有親戚朋友來借我的GL8,出門去個自駕。(順便讓我的老款GL8空間亮相一下,見下圖)

在這裏可以給想買GL8的朋友一些建議,對於新款的GL8,我這老車主有話要說:

一、外在方面:宜商宜家

以前還覺得買GL8太商務,但是現在看新款GL8,其設計宜商宜家都挺適合的,宜商的話,和豪華車沒什麼區別,甚至功能層面更實用,分分鐘給足你面子。宜家主要是升級了很多,空間大,座椅舒適型高,乘坐舒服。

(全新GL8)

二、內在領域:大而舒適

重要的事情要再總結一遍:

1. 要顛覆一下大家對7座的刻板印象,不是僅僅有7個座位就可以稱作7座車了,還要每個坐在座位上的人坐得都舒服。全新GL8不單單在車內空間設計上下足功夫,據說座椅也升級了,具有腰托、腿托、椅背角度等電動調節功能,無論是小孩還是老人都能通過調節其功能,選擇最適合自己的坐姿。另外,座椅還配備了加熱、通風、按摩、扶手調節及側翼六向可調航空頭枕,據了解,很多老一輩對這配備贊不絕口,都說再也不用擔心長途顛簸路段,有了全新GL8,長途坐車再也不是事。

2. 坐滿7人的前提下,還要能放下東西,要不出門自駕時,人去到,東西沒帶齊,也挺苦逼的。全新GL8應該是7座車裡,為數不多能同時滿足這兩個需求的車型。具不少試駕員表示,平常春節個老家、出門來個自駕,後備箱放個自行車、兒童座椅、28寸的旅行箱等等都沒問題。

3. 另外,通過性強,座位之間能方便車內乘坐人員走動。這個點從我的同學吐槽裏面,是很多同級別車型所沒有的。具實測全新GL8第二排座椅下部中間的寬度有約450px,這個寬度一般成年人側身是可以自由穿行的。可能單這個點,就可以完爆其他競品車型。

4. 方便長輩小孩上下車以及人性化的第三排設計。全新GL8在這點也很人性化,底盤不會太高,車高合適,老人小孩上下車都可以說“so easy”。值得表揚的還有第三排座椅坐墊高度比其他車型要優化不少,這樣如果是老人小孩坐在第三排,也不會覺得好像整個人好像窩在裏面,很不舒服。另外,第三排還配備了中央扶手,高度也合適,這也是相對老款做的提升,大大提升第三排乘坐舒適度。

5. 全車人的安全性。確實,出現像上面同學說到的,買了7座只能當5座開,有點尷尬。這個點在全新GL8上也表現的挺好。除了第三排與后擋風玻璃間的距離大,全新GL8還配備了主被動安全、智慧安全系統及其他提高駕駛安全性的配備,另外,全車共配備了8安全氣囊。這些配置對於全車人的安全方面無疑是提供了全面的保護。

扯了這麼多,我承認我是有私心的,我就是想找到GL8組織,讓更多GL8車主一起體驗這款車。有機會還能組個團,大家一起開GL8集體出去自駕。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

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

※台北網頁設計公司全省服務真心推薦

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

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

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

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

DevOps系列——Jenkins/Gitlab自動打包部署

前面只說了DevOps的兩個基礎組件Jenkins和GitLab,客官也不要着急,我們玩就玩的深入一點,Gitlab和Jenkins的各種配置和

插件很多,也夠啃一陣子的,不要照着操作一通就感覺萬事大吉了,多做些邊緣測試,多玩點不一樣的操作,那今天我們來點

實戰整合加強訓練。

作者原創文章,謝絕一切轉載,違者必究!

本文只發表在”公眾號”和”博客園”,其他均屬複製粘貼!如果覺得排版不清晰,請查看公眾號文章。 

準備:

VMwareWorkstation15Pro/RHEL8.0/Jenkins2.222.3/Gitlab-ee-13.0.0

難度: 新手–戰士–老兵–大師

說明:

為了遇見各種問題,同時保持時效性,我盡量使用最新的軟件版本。源碼地址,其中的day30:https://github.com/xiexiaobiao/dubbo-project

目標:

  1. window主機提交代碼到Gitlab主機,Jenkins自動完成jar打包,併發布到Gitlab主機(可為任意主機)上運行。

1 架構

整體部署架構:

2 環境

2.1開發Java應用,一個極簡的服務,可打包為jar運行:

package com.biao.study;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class AppMain {
    public static void main(String[] args) {
        SpringApplication.run(AppMain.class,args);
        System.out.println("AppMain app started >>>>>>>>>>>>");
    }

    @RequestMapping("/jenkins/{name}")
    public String hello(@PathVariable(name = "name") String name){
        System.out.println("Variable: "+ name);
        return "hello, " + name;
    }
}
 

運行測試,GET http://localhost:8081/jenkins/biao 輸出:hello, biao

2.2 GitLab主機上建立一個項目,操作步驟,略!注意看下項目的兩個git地址,显示的端口號是Gitlab的端口號,不是Nginx的:

2.3 配置Jenkins主機到Gitlab主機的SSH,(配置window到Gitlab主機的SSH,也是一樣,window在CMD 下執行):

[root@server224 docker-deploy]#ssh-keygen #生成密鑰對
[root@server224 docker-deploy]#ssh-copy-id root@192.168.2.226 #發送公鑰

Window下使用git測試ssh安裝:

2.4 Jenkins主機上測試使用SSH協議連接GitLab,這樣Git可以免密連接,並使用SSH連接執行shell,

進入新建的空白目錄 /usr/hellojenkins 下:

[root@server224 hellojenkins]# ssh -T git@192.168.2.226  #測試ssh
[root@server224 hellojenkins]# git init  #初始化本地git庫,否則報錯not a git repository
[root@server224 hellojenkins]# git remote –v  # -verbose查看遠程gitlab url
[root@server224 hellojenkins]# git remote add origin git@192.168.2.226:biao/hellojenkins.git
[root@server224 hellojenkins]# git pull origin master

如下,可見連接成功,其他git操作客官請隨意:

2.5 Jenkins主機上測試使用HTTP協議連接GitLab,在 /usr/hellojenkins 下:

[root@server224 hellojenkins]# rm -rf ./* #清空hellojenkins目錄,.git和 .idea也要刪除
[root@server224 hellojenkins]# git init 
[root@server224 hellojenkins]# git remote -v
[root@server224 hellojenkins]# git remote add origin http://192.168.2.226:9099/biao/hellojenkins.git  #注意url,不是gitlabUI中給的項目url,因有Nginx代理
[root@server224 hellojenkins]# git pull origin master

如下,可見http連接成功,其他git操作客官請隨意

特別注意:如開啟了Nginx代理,會導致gitlab UI中給的項目url (見圖1),在git中無法使用,應使用Nginx的端口號!

2.6 訪問JenkinsUI,添加 ”Publish Over SSH” 插件(見前文:Jenkins安裝),並在 ”系統管理-系統配置” 添加SSH目標主機 (比如我這是192.168.2.226):

要點: 1.SSH主機登錄密碼和私鑰key,可以二選一,推薦使用私鑰key,這樣可以使用相同的私鑰key登錄多個目標主機。

2.使用私鑰key測試不通過,可能是格式問題,見後文問題部分。

3.RemoteDirectory為SSH連接后要訪問的目錄 4.Test必須显示為Success才算配置成功

2.7 其他工具配置:Jenkins主機需先安裝好Maven,Git,JDK,略!並在 “系統管理—>全局工具配置”中做對應的配置:

3 任務構建

3.1 我們來個Jenkins自動構建的實驗:新建一個任務,選擇”構建一個自由風格的軟件項目”:

General中我全空,懶得寫了。

源碼管理使用Git,(也可使用Subversion,需對應的插件),並選擇前面配置好的”憑證”:

自動構建觸發的條件是 push 事件:

構建前清空工作目錄:

構建時執行的shell腳本,source /etc/profile 不能省,可能導致mvn命令無法識別,cd $JENKINS_HOME/workspace/hellojenkins,使用環境變量來進入工作目錄,

也可使用 $WORKSPACE/hellojenkins 效果一樣,有個環境變量列錶鏈接,可供參考;mvn clean package 即 maven 編譯打包命令,內存不足的話可先只測試 mvn clean

構建后操作:1 source files是待發送的源文件,這裏特別注意要寫相對路徑target/*.jar,不是絕對路徑/var/lib/jenkins/workspace/hellojenkins/target/*.jar

2 remove prefix是需要去掉的前綴,置空則將文件和路徑一起發送,並在遠程主機建立對應目錄結構;

3 remote directory是遠程主機的目錄,發送的文件將保存至此;

4 執行的shell腳本,會在文件發送后執行,先可直接簡化為如下建立一個日期文件(最常見的是停止舊jar的運行,並運行新的jar,完整版見後面的腳本);如果需要文件發送前執行,可以添加兩個”構建后操作”,並將shell腳本執行放前,文件transfer放后:

附,完整Exec comand腳本:

#!/bin/bash
pid=$(ps -ef | grep HelloJenkins-1.0-SNAPSHOT | grep 'java' | grep -v grep | awk '{print $2'})
if [ -z "$pid" ]; then
    echo 'there are no HelloJenkins process. starting will be continue.'
fi
if [ -n "$pid" ]; then
    echo 'java process id is '$pid
    if ps -p $pid > /dev/null
    then
        echo $pid' will be kill'
        kill -9 $pid
    fi
fi
echo 'start HelloJenkins wait.'
nohup java -jar HelloJenkins-1.0-SNAPSHOT.jar  > /dev/null 2>error.log &
echo 'finish starting HelloJenkins'
 

3.2 進行 ”立即構建” 測試:

3.3 等待構建完畢查看控制台日誌,或左側”構建執行狀態”查看正在進行的Job:

控制台內容:

以上步驟解析:1 Jenkins生成對應的工作目錄,注意 /var/lib/jenkins 對應 JENKINS_HOME 變量,即Jenkins家目錄;

2對應配置選項Delete workspace before build starts,構建前刪除; 3使用SSH連接遠程Gitlab代碼庫; 4 Git操作完畢后的消息,可用於記錄本次構建;

5可以看到Jenkins將構建的配置和構建流程共同生成了一個臨時的Shell腳本,然後執行,這也是Jenkins的工作原理之一。

 

總結:這裏的Jenkins自動構建流程是使用Git從遠程庫clone到本地,然後本地構建,同時部分流程和配置會組合生成一個臨時的Shell腳本來執行,

最終完成整個構建工作流程。(Jenkins還有其他構建方式)。

 

以上步驟解析:1對應執行”構建”配置中shell命令mvn clean package的結果; 2-5是對應”構建后操作” 中的配置,其中2是開始SSH連接,

3是開始執行”Exec command”中的shell命令,4斷開SSH連接,5文件傳輸的結果

以下為server226上對應”構建后操作”中的結果,生成的文件和傳輸過來的jar包:

4 題外話

4.1 我上傳的代碼中還包含了 Dockerfile 和自動打包/部署Docker鏡像的shell腳本,內容太多,各位看官可以嘗試一下:使用Jenkins自動構建

並生成鏡像和部署運行,有空我就後期再說吧,一次寫太多看的也累。

4.2 Gitlab的WebHook功能:在Gitlab收到push事件后,可以 POST 發送定製的信息至指定的URL,從而觸發更新。比如SpringCloud的config

配置自動更新,當GitHub上的配置文件更新后,WebHook自動觸發Refresh 到Config Server 上,而完成配置自動刷新。

5 問題

5.1 添加SSH服務器時,test失敗,提示:

Failed to connect or change directory jenkins.plugins.publish_over.BapPublisherException: Failed to add SSH key. Message [invalid privatekey: [B@d8d395a]

這是因為私鑰格式Jenkins無法識別,如果打開私鑰文件,”—–BEGIN OPENSSH PRIVATE KEY—–” 表示使用的是最新的OpenSSH格式,需要使用舊版格式,重新生成密鑰,命令如下:

ssh-keygen -t rsa -b 4096 -m PEM

再打開私鑰文件,可見私鑰文件內容開頭:”—–BEGIN RSA PRIVATE KEY—–”,

5.2 運行自動生成鏡像腳本錯誤提示$'\r' command not found

這種錯誤是因為編寫的 shell腳本是在window下編寫的,每行結尾是 \r\n,而 Unix 結束行是 \n , 所以在Linux下運行腳本會認為 \r 是一個字符,需要把文件轉換下:

[root@server224 docker-deploy]# sed -i 's/\r//' auto-image.sh

5.3 錯誤提示:Does not have a commit checked out,這是因為當前目錄下存在沒有提交的目錄,首先使用 pwd (present working directory)命令查看當前目錄,

需保持 .init命令和 pwd 命令目錄一致:

5.4 提示 http/https協議不支持,可能原因是url錯誤,或者沒添加遠程地址,初始化沒完成,即git remote add命令:

5.5 打包編譯時,內存不足,看控制台輸出,我將Jenkins主機由6G調整為8G才解決,還好我的小電腦內存足夠大:

總結:控制台輸出是個非常有用的記錄,比如我之前的構建失敗記錄,可以看到無法識別 mvn 命令,於是知道是maven未配置好!

全文完!

我近期其他文章:

  • 1 DevOps系列——Jenkins私服
  • 2 DevOps系列——Gitlab私服
  • 3 聊聊算法——滑動窗口
  • 4 聊聊算法——回溯算法
  • 5 Redis高級應用

只寫原創,敬請關注

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

【其他文章推薦】

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

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

※回頭車貨運收費標準

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

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

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

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

RocketMQ系列(三)消息的生產與消費

前面的章節,我們已經把RocketMQ的環境搭建起來了,是一個兩主兩從的異步集群。接下來,我們就看看怎麼去使用RocketMQ,在使用之前,先要在NameServer中創建Topic,我們知道RocketMQ是基於Topic的消息隊列,在生產者發送消息的時候,要指定消息的Topic,這個Topic的路由規則是怎樣的,這些都要在NameServer中去創建。

Topic的創建

我們先看看Topic的命令是如何使用的,如下:

./bin/mqadmin updateTopic -h

usage: mqadmin updateTopic -b <arg> | -c <arg>  [-h] [-n <arg>] [-o <arg>] [-p <arg>] [-r <arg>] [-s <arg>] -t
       <arg> [-u <arg>] [-w <arg>]
 -b,--brokerAddr <arg>       create topic to which broker
 -c,--clusterName <arg>      create topic to which cluster
 -h,--help                   Print help
 -n,--namesrvAddr <arg>      Name server address list, eg: 192.168.0.1:9876;192.168.0.2:9876
 -o,--order <arg>            set topic's order(true|false)
 -p,--perm <arg>             set topic's permission(2|4|6), intro[2:W 4:R; 6:RW]
 -r,--readQueueNums <arg>    set read queue nums
 -s,--hasUnitSub <arg>       has unit sub (true|false)
 -t,--topic <arg>            topic name
 -u,--unit <arg>             is unit topic (true|false)
 -w,--writeQueueNums <arg>   set write queue nums

其中有一段,-b <arg> | -c <arg>,說明這個Topic可以指定集群,也可以指定隊列,我們先創建一個Topic指定集群,因為集群中有兩個隊列broker-abroker-b,看看我們的消息是否在兩個隊列中負載;然後再創建一個Topic指向broker-a,再看看這個Topic的消息是不是只在broker-a中。

創建兩個Topic,

./bin/mqadmin updateTopic -c 'RocketMQ-Cluster' -t cluster-topic -n '192.168.73.130:9876;192.168.73.131:9876;192.168.73.132:9876'

./bin/mqadmin updateTopic -b 192.168.73.130:10911 -t broker-a-topic

第一個命令創建了一個集群的Topic,叫做cluster-topic;第二個命令創建了一個只在broker-a中才有的Topic,我們指定了-b 192.168.73.130:10911,這個是broker-a的地址和端口。

生產者發送消息

我們新建SpringBoot項目,然後引入RocketMQ的jar包,

<dependency>
    <groupId>org.apache.rocketmq</groupId>
    <artifactId>rocketmq-client</artifactId>
    <version>4.3.0</version>
</dependency>

然後配置一下生產者的客戶端,在這裏使用@Configuration這個註解,具體如下:

@Configuration
public class RocketMQConfig {

    @Bean(initMethod = "start",destroyMethod = "shutdown")
    public DefaultMQProducer producer() {
        DefaultMQProducer producer = new
                DefaultMQProducer("DefaultMQProducer");
											producer.setNamesrvAddr("192.168.73.130:9876;192.168.73.131:9876;192.168.73.132:9876;");
        return producer;
    }
}
  • 首先創建一個生產者組,名字叫做DefaultMQProducer;
  • 然後指定NameServer,192.168.73.130:9876;192.168.73.131:9876;192.168.73.132:9876;
  • 最後在@Bean註解中指定初始化的方法,和銷毀的方法;

這樣,生產者的客戶端就配置好了,然後再寫個Test類,在Test類中向MQ中發送消息,如下,

@SpringBootTest
class RocketmqDemoApplicationTests {

    @Autowired
    public DefaultMQProducer defaultMQProducer;

    @Test
    public void producerTest() throws Exception {

        for (int i = 0;i<5;i++) {
            Message message = new Message();
            message.setTopic("cluster-topic");
            message.setKeys("key-"+i);
            message.setBody(("this is simpleMQ,my NO is "+i).getBytes());

            SendResult sendResult = defaultMQProducer.send(message);
            System.out.println("SendStatus:" + sendResult.getSendStatus());
            System.out.println("BrokerName:" + sendResult.getMessageQueue().getBrokerName());
        }
    }
}
  • 我們先自動注入前面配置DefaultMQProducer;
  • 然後在Test方法中,循環5次,發送5個消息,消息的Topic指定為cluster-topic,是集群的消息,然後再設置消息的key和內容,最後調用send方法發送消息,這個send方法是同步方法,程序運行到這裡會阻塞,等待返回的結果;
  • 最後,我們打印出返回的結果和broker的名字;

運行一下,看看結果:

SendStatus:SEND_OK
BrokerName:broker-b
SendStatus:SEND_OK
BrokerName:broker-b
SendStatus:SEND_OK
BrokerName:broker-b
SendStatus:SEND_OK
BrokerName:broker-b
SendStatus:SEND_OK
BrokerName:broker-a

5個消息發送都是成功的,而發送的隊列有4個是broker-b,1個broker-a,說明兩個broker之間還是有負載的,負載的規則我們猜測是隨機。

我們再寫個測試方法,看看broker-a-topic這個Topic的發送結果是什麼樣子的,如下:

@Test
public void brokerTopicTest() throws Exception {

    for (int i = 0;i<5;i++) {
        Message message = new Message();
        message.setTopic("broker-a-topic");
        message.setKeys("key-"+i);
        message.setBody(("this is broker-a-topic's MQ,my NO is "+i).getBytes());

        defaultMQProducer.send(message, new SendCallback() {
            @Override
            public void onSuccess(SendResult sendResult) {
                System.out.println("SendStatus:" + sendResult.getSendStatus());
                System.out.println("BrokerName:" + sendResult.getMessageQueue().getBrokerName());
            }

            @Override
            public void onException(Throwable e) {
                e.printStackTrace();
            }
        });

        System.out.println("異步發送 i="+i);

    }
}
  • 消息的Topic指定的是broker-a-topic,這個Topic我們只指定了broker-a這個隊列;
  • 發送的時候我們使用的是異步發送,程序到這裏不會阻塞,而是繼續向下執行,發送的結果正常或者異常,會調用對應的onSuccess和onException方法;
  • 我們在onSuccess方法中,打印出發送的結果和隊列的名稱;

運行一下,看看結果:

異步發送 i=0
異步發送 i=1
異步發送 i=2
異步發送 i=3
異步發送 i=4
SendStatus:SEND_OK
SendStatus:SEND_OK
SendStatus:SEND_OK
SendStatus:SEND_OK
BrokerName:broker-a
SendStatus:SEND_OK
BrokerName:broker-a
BrokerName:broker-a
BrokerName:broker-a
BrokerName:broker-a

由於我們是異步發送,所以最後的日誌先打印了出來,然後打印出返回的結果,都是發送成功的,並且隊列都是broker-a,完全符合我們的預期。

消費者

生產的消息已經發送到了隊列當中,再來看看消費者端如何消費這個消息,我們在這個配置類中配置消費者,如下:

@Bean(initMethod = "start",destroyMethod = "shutdown")
public DefaultMQPushConsumer pushConsumer() throws MQClientException {
    DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("DefaultMQPushConsumer");
    consumer.setNamesrvAddr("192.168.73.130:9876;192.168.73.131:9876;192.168.73.132:9876;");
    consumer.subscribe("cluster-topic","*");
    consumer.registerMessageListener(new MessageListenerConcurrently() {
        @Override
        public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
            if (msgs!=null&&msgs.size()>0) {
                for (MessageExt msg : msgs) {
                    System.out.println(new String(msg.getBody()));
                    System.out.println(context.getMessageQueue().getBrokerName());
                }
            }

            return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
        }
    } );
    return consumer;
}
  • 我們創建了一個消費者組,名字叫做DefaultMQPushConsumer;
  • 然後指定NameServer集群,192.168.73.130:9876;192.168.73.131:9876;192.168.73.132:9876;
  • 消費者訂閱的Topic,這裏我們訂閱的是cluster-topic,後面的*號是對應的tag,代表我們訂閱所有的tag;
  • 最後註冊一個併發執行的消息監聽器,實現裡邊的consumeMessage方法,在方法中,我們打印出消息體的內容,和消息所在的隊列;
  • 如果消息消費成功,返回CONSUME_SUCCESS,如果出現異常等情況,我們要返回RECONSUME_LATER,說明這個消息還要再次消費;

好了,這個訂閱了cluster-topic的消費者,配置完了,我們啟動一下項目,看看消費的結果如何,

this is simpleMQ,my NO is 2
broker-b
this is simpleMQ,my NO is 3
broker-b
this is simpleMQ,my NO is 1
broker-b
this is simpleMQ,my NO is 0
broker-a
this is simpleMQ,my NO is 4
broker-b

結果符合預期,cluster-topic中的5個消息全部消費成功,而且隊列是4個broker-b,1個broker-a,和發送時的結果是一致的。

大家有問題歡迎評論區討論~

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

【其他文章推薦】

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

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

※回頭車貨運收費標準

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

※超省錢租車方案

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

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

「MoreThanJava」Java發展史及起航新世界

  • 「MoreThanJava」 宣揚的是 「學習,不止 CODE」,本系列 Java 基礎教程是自己在結合各方面的知識之後,對 Java 基礎的一個總回顧,旨在 「幫助新朋友快速高質量的學習」
  • 當然 不論新老朋友 我相信您都可以 從中獲益。如果覺得 「不錯」 的朋友,歡迎 「關注 + 留言 + 分享」,文末有完整的獲取鏈接,您的支持是我前進的最大的動力!

Part 1. Java 發展簡史

  • 圖片來源:https://www.geeksforgeeks.org/the-complete-history-of-java-programming-language/

起源:”Green” 項目

20 世紀 90 年代,單片式計算機系統誕生,單片式計算機系統不僅廉價,而且功能強大,使用它可以大幅度提升消費性电子產品的智能化程度。

SUN 公司為了搶佔市場先機,在 1991 年成立了一個由詹姆斯·高斯林(James Gosling)領導,名為 “Green” 項目小組,目的是開發一種 能夠在各種消費性电子產品上運行的程序架構(主要是像 有線電視轉換盒 這一類 處理能力和內存都很有限,並且 CPU 廠商又各不相同 的消費設備)。

由於這些消費設備的處理能力和內存都有限,所以語言必須 非常小且能夠生成非常緊湊的代碼。另外,由於不同廠商會選擇不同的 CPU,因此很重要的一點是這種語言 不應該與任何特定的體繫結構綁定。代碼短小、緊湊且與平台無關,這些要求促使開發團隊設計出一個 可移植的語言,可以為虛擬機生成中間代碼。

不過,Sun 公司的人都有 UNIX 的應用背景。因此,所開發的語言以 C++ 為基礎,而不是 Lisp/ Smalltalk 或 Pascal。不過,就像 Gosling 在專訪中談道:“畢竟,語言只是實現目標的工具,而不是目標本身。”

Gosling 把這種語言稱為 “Oak”(直譯為橡樹,大概是因為它非常喜歡自己辦公室窗外的一顆橡樹…)。後來 Sun 公司發現,Oak 是一種已有的計算機語言名字,於是 Gosling 和他的團隊進行了一次頭腦風暴,多次討論后,從 Java/ DNA/ SILK/ RUBY 中決定使用 Java 來命名。事實證明這是一個很有靈感的選擇。

埋沒:沒人為 “Green” 項目買單

1992 年,Green 項目發布了它的第一個產品,稱之為 「* 7」。這個產品可以提供非常智能的遠程控制。遺憾的是,Sun 公司對生產這個產品並不感興趣。Green 項目組的人員必須找出其他的方法來講他們的技術推向市場。

然而,仍然沒有任何一家標準消費品电子公司對此感興趣。於是,Green 項目組投標了一個設計有線電視盒的項目,它能提供視頻點播等新型有線服務,但他們沒能拿到這個合同 (有趣的是,得到這個項目的公司的領導恰恰是開闢 Netscape 公司的 Jim Clark。Netscape 公司後來對 Java 的成功給予了很大的幫助。)

Green 項目 (這時已經換了一個新名字 ———— “First Person 公司”)1993 年一整年以及 1994 年上半年,一直在苦苦尋找買家購買他們的技術。然而,一個也沒有找到 (Partick Naughton ———— 項目組的創始人之一,也是完成了大多數營銷工作的人,聲稱為了銷售這項技術,已累計飛行了 300,000 英里)

1994 年 First Person 公司解散了。

轉機:Internet 的壯大

當這一切在 Sun 公司發生的時候,Internet 的萬維網也在日漸發展壯大。萬維網的關鍵是把超文本頁面轉換到屏幕上的瀏覽器。

1994 年大多數人都在使用 Mosaic,這是一個 1993 年出自伊利諾斯大學超級計算中心的非商業化的 Web 瀏覽器( Mosaic 的一部分是由 Marc Andreessen 編寫的。當時,他作為一名參加半工半讀項目的本科生, 編寫了這個軟件,每小時的薪水只有 6.85 美元。他後來成了 Netscape 公司的創始人之一和技術總監, 可謂名利雙收。)

在接受 SunWorld 採訪的時候,Gosling 說在 1994 年中期,Java 語言的開發者意識到: “我們能夠建立一個相當酷的瀏覽器。在客戶機/ 服務器主流模型中,瀏覽器恰好需要我們已經完成的一些工作:體繫結構中立、實時、可靠、安全 ———— 這些在工作站環境並不太重要,所以,我們決定開發瀏覽器”

實際的瀏覽器是由 Patrick Naughton 和 Jonathan Payne 開發的,並演變為 HotJava 瀏覽器。為了炫耀 Java 語言超強的能力,HotJava 瀏覽器採用 Java 編寫。設計者讓 HotJava 瀏覽器具有在網頁中執行內嵌代碼的能力。 這一 “技術證明” 在 1995523 日的 SunWorld’95 上得到展示,同時引發了人們延續至今的對 Java 的狂熱追逐。

至此,這一場持續長達 20 多年的「Java 熱」開始了。

  • 觀察近 20 年的數據,Java 的排名從未跌出過前三,而且有將近一半的年份搶佔了透明,不得不令人感嘆:「流水的程序員,鐵打的 Java 啊!」

Part 2. Java 與 Internet

  • 圖片來源:https://www.morethanshipping.com/internet-things-iot-will-help-logistics/

如果 Java 僅僅只是眾多的程序設計語言中的一種,你可能就會問:為什麼它如此重要呢?為什麼它促使計算機編程語言向前邁進了革命性的一步?

如果從傳統的程序設計的角度看,問題的答案似乎不太明顯。儘管 Java 對於解決傳統的單機程序設計問題非常有用,但同樣重要的事,它解決了在萬維網(WWW)上的程序設計問題

Web 1.0 時代的程序設計問題

在剛創造 Java 的年代(20 世紀 90 年代),整個互聯網還處於 Web 1.0 的網絡萌芽階段。

在 之前的一篇文章 其實有對 Web 做了一些概念性的描述(概念、發展、體繫結構)。

問題一:網頁沒有交互

Web 1.0 的網站是靜態的。最初的互聯網只有一種很簡單的 單向過程:你 對某一個服務器發起一個請求,然後它 返回 給你一個 文件,你的機器(俗稱客戶端)上的 瀏覽器軟件 根據本地機器的格式來 解讀並展示 這個文件的內容。這期間沒有任何的交互發生,因為最初的瀏覽器只是一個 “展示器”,它甚至不能執行最簡單的計算任務。(另一方面,它確是安全的,因為它在你的本地機器上不會執行任何程序,而這些程序可能包含 bug 和病毒)

用戶 只能訪問 這些站點而不會對它們做出任何貢獻。這就像你捧起書架中的一本書一樣,它是一種 「只讀」 模式的存在,如果你想與創造這本書的出版社也好,作者也好建立鏈接,只能通過其他的一些方式。(當時的網站也是主要是向消費者展示產品,從感興趣的消費者那裡收錢)

很快人們就不滿足於只是從服務器傳遞迴頁面,人們希望實現完整的客戶/ 服務器能力,使得客戶可以將信息反饋給服務器,來完成例如:在服務器上進行數據查找,並將用戶提供的新信息加到服務器中,服務器管理人員接受到新信息之後就下發訂單的操作。

問題二:響應緩慢

早期的瀏覽器不僅沒有交互,而且它還趨向於讓服務器和 Internet 阻塞。因為在任何時候,只要 你需要完成 通過編程 才能實現的 任務,就必須將信息發揮到 服務器處理。然而在互聯網中,在任意時刻都有可能會有 成百上千 的客戶向服務器發出請求,所以任何小的延遲都會產生重大的影響。

為了解決這個問題,人們採用了各種不同的方法。首先,圖形標準得到了加強,這使得在瀏覽器中可以播放質量更好的動畫和視頻。剩下的問題通過引入 在客戶端瀏覽器中運行程序 的能力就可以解決,這被稱為 「客戶端編程」

問題三:客戶端編程平台各異

大多數運行 Web 瀏覽器的機器都是能夠執行大型任務的強有力的引擎。在使用原始的靜態 HTML 方式的情況下,它們通常只是閑在那裡,等着服務器送來下一個頁面。

客戶端編程意味着 Web 瀏覽器能夠用來執行任何它可以完成的工作,使得返回給用戶的結果 更迅速 (不用全部的結果都等着服務器來運算),而且使得你的網站 更加具有交互性 (那些不需要使用服務器數據的操作可以完全在本地完成)

但客戶端編程的問題是:它與通常意義上的編程十分不同,參數幾乎相同,而平台卻不同。在 Web 瀏覽器中編程就像是使用一台功能受限的操作系統,而每一台功能還略微的有差別。最終,你不僅需要編寫程序,還需要處理因為平台不同帶來的兼容問題。

小結

因為「沒有交互」和「訪問緩慢」的問題,所以引入「客戶端編程」,因為引入客戶端編程,遇到「各種各樣不僅僅是平台差異帶來的問題」。

Java 的解決方案

插件和腳本語言 “差點意思”

在當時,客戶端編程所邁出的最重要的一步就是 插件(plug-in) 的開發。通過這種方式,用戶可以下載一段代碼,並將其插入到瀏覽器中適當的位置,以此來為瀏覽器添加新的功能。

  • 圖片來源:https://zhuanlan.zhihu.com/p/28889449

插件又引發了瀏覽器 腳本語言(scripting language) 的開發。通過使用某種腳本語言,你可以將客戶端程序的源代碼直接嵌入到 HTML 頁面中,解釋這種語言的插件在 HTML 頁面被显示時自動激活。(腳本語言可以解決客戶端編程中遇到的百分之八十的問題) 腳本語言先天就相當易於理解,因為它們只是作為 HTML 頁面一部分的簡單文本,當服務器收到要獲取該頁面的請求時,它們可以被快速加載。此方法的缺點是代碼會直接暴露給任何瀏覽(或竊取)的人,但是,通常不會使用腳本語言去做相當複雜的事情,所以這個缺點不會太嚴重。

如果腳本語言可以解決客戶端編程百分之八十的問題的話,那麼剩下那百分之二十 (那才是真正難啃的骨頭) 又該怎麼辦呢?

Java 帶來了 Applet

  • 圖片來源:https://www.ibm.com/developerworks/cn/java/

Java 帶着 Applet 及時出現。

1995 年, Java 之父 James Gosling 和 Sun 公司科學辦公室主任 John Gage 一起前往蒙特利,去參加一個 TED 會議,兩人要在那裡展示一個划時代的技術, 號稱向能把枯燥的靜態網頁變得栩栩如生,美輪美奐。

演示開始了,James Gosling 把鼠標指向了瀏覽器中的一個 3D 分子模型,來回地旋轉它,台下的觀眾發出陣陣驚嘆聲,他們被鎮住了,從沒有人想到在瀏覽器中也能實現這麼 “美輪美奐” 的效果 !

  • 圖片來源:https://zhuanlan.51cto.com/art/201911/606791.htm

Java 火了!

這個演示所使用的技術就是 Applet。

Applet 是只在 Web 瀏覽器中運行的小程序,它是作為網頁的一部分而自動下載的 (就像是網站圖片被自動下載一樣)。當 Applet 被激活時,它變開始執行一個程序,這正是它優雅的地方:它提供了一種分發軟件的方式,一旦用戶需要客戶端軟件時,就自動從服務器把客戶端軟件分發給用戶。

用戶獲取最新版本的客戶端軟件時不會產生錯誤,而且也不需要很麻煩的重新安裝過程 (有點像現在的小程序)。Java 的這種設計方式,使得程序員只需要創建單一的程序,而只要一台計算機有瀏覽器,且瀏覽器具有內置的 Java 解釋器 (大部分機器都有),那麼這個程序就可以自動在這台計算客戶端盡可能地多做事情。例如,不必跨網絡地發送一張請求表單來檢查自己是否填寫了錯誤的日期或者其他參數,客戶端計算機就可以快速地標出錯誤數據。

這不僅立即就獲得了快速的響應能力,而且也降低了網絡流量和服務器負載,從而不會使整個網絡的速度慢下來。

Java 對服務端編程的加持

當提出對服務器的請求之後,會發生什麼呢?大部分時間,請求只是要求「給我發送一個文件」,之後瀏覽器會以某種適當的形式解釋這個文件,例如將其作為 HTML 頁面、圖片、Java applet 或腳本程序等來解釋。

更複雜的對服務器的請求通常涉及數據庫,這可能會需要服務器端對請求到的數據進行一定的編排 (例如把數據嵌到一個表格之內) 來最終使其成為一個 HTML 文件發送給客戶端 (當然,如果客戶端具備更多的只能,你完全可以把原始數據發送給客戶端讓它自己進行編排工作..)。另一種常見的情形是:你註冊賬號或者提交訂單,這對數據庫數據造成了更改,而這些必須通過服務器端的某些代碼進行處理,這就是所謂的 服務端編程

Java 後來編寫的被稱為 Servlet 的程序 (及其衍生物 JSP),是許多開發網站的公司遷移到 Java 上的主要原因。尤其是因為憑藉 Java 跨平台的特性 消除了處理具有不同能力的瀏覽器時所遇到的問題

小結

Java 憑藉自身強大、安全、跨平台、國際化的特性,加上解決了當時客戶端、服務端開發的諸多 “痛點”,成功搭上 Internet 這列 “國際快車”,一躍成為了時下 20 實際 90 年代中) 最熱門的語言之一,並持續火熱至今 (這跟 Java 自身不斷地成熟有脫不開的關係)

現如今 Applet 和 Servlet 兩個技術已經逐步淡出人們的視野,但在 Java 的歷史上,是舉足輕重的兩個突破點。

Part 3. Hello Wrold!

  • 圖片來源:https://medium.com/@thiagonascimento/time-to-first-hello-world-11a4735602f2

當我們集中注意力 學習一種新的編程語言 時,教程上的 第一個案例 就是如何 在計算機屏幕上显示短語 Hello,world! 也許這條短語最知名的來源是貝爾實驗室的備忘錄《C 語言編程——一份教程》。這份材料編寫於 1974 年。不過在編寫於 1972 年的 B 語言教程中,我們同樣看到了這條短語的身影。

Hello, World! 是一種偉大的教學方法。這是一項能夠輕鬆完成的小任務,同時也代表着一種標準,體現出不同編程語言之間的重要差異。此外,這也是高級程序員在安裝新環境測試一切是否正常的快速簡便方法。(有時候,程序員們也會使用「hello world」運行時間來比較不同語言與環境的速度水平。) 也許更重要的是,Hello, world! 具有一種溫暖而柔和的力量,對編程新人有着一種莫名的親和力。

「代碼擁有無窮威力,而新的世界已經向你張開懷抱。」 ———— Chris Noessel,IBM 公司 AI 設計負責人

public class Main {

    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}

以上就是Java 語言版本 Hello World 程序。(現在看不懂也沒關係,可以進 https://c.runoob.com/compile/10 這個網站在線運行測試一下看看效果…)

至此,歡迎你進入 Java 的世界。

參考資料

  1. 《Thinking in Java》 第四版;
  2. 《Java 核心技術 卷 I》 第 11 版;
  3. The complete History of Java Programming Language – https://www.geeksforgeeks.org/the-complete-history-of-java-programming-language/
  4. Java 發展簡史:初生遇低谷,崛起於互聯網 – https://www.chainnews.com/articles/628715645859.htm
  5. 永別了,Java的“小蘋果”! – https://zhuanlan.51cto.com/art/201911/606791.htm
  6. 改變世界的代碼行 – https://www.infoq.cn/article/5CaYH8NbS6BmptWKRgkX

往期精彩

  1. 「MoreThanJava」當大學選擇了計算機之後應該知道的
  2. 「MoreThanJava」計算機發展史—從織布機到IBM
  3. 「MoreThanJava」計算機系統概述
  4. 「MoreThanJava」一文了解二進制和CPU工作原理
  5. 「MoreThanJava」機器指令到彙編再到高級編程語言
  • 本文已收錄至我的 Github 程序員成長系列 【More Than Java】,學習,不止 Code,歡迎 star:https://github.com/wmyskxz/MoreThanJava
  • 個人公眾號 :wmyskxz,個人獨立域名博客:wmyskxz.com,堅持原創輸出,下方掃碼關注,2020,與您共同成長!

非常感謝各位人才能 看到這裏,如果覺得本篇文章寫得不錯,覺得 「我沒有三顆心臟」有點東西 的話,求點贊,求關注,求分享,求留言!

創作不易,各位的支持和認可,就是我創作的最大動力,我們下篇文章見!

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

【其他文章推薦】

※回頭車貨運收費標準

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

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

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

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

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

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

奔馳將推史上最強E級,AMG E63 Coupe橫空出世!

新E級CoupeC級CoupeS級Coupe內飾延續了E級轎車的整體布局,不過在風格上則更為年輕,運動,如碳纖維中控飾板,渦輪式出風口,無邊框車門以及全新設計的運動座椅。值得一提的是,先前透露的新E級Coupe 220d,200,300,400 4MATIC只是首發版本,而最令人期待的,則是這一代E級Coupe將確定推出AMG E63版本。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

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

※台北網頁設計公司全省服務真心推薦

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

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

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

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

研究:野火改變了鳥類叫聲 區域性「方言」隨野火次數增加而更多樣

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

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

【其他文章推薦】

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

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

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

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

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

※回頭車貨運收費標準

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

泰國禁農藥「巴拉刈」和「毒死蜱」 美國、巴西抗議

摘錄自2020年6月22日自由時報報導

泰國本(6)月初通過新的農藥禁令,將劇毒農藥巴拉刈(Paraquat)和殺蟲劑「毒死蜱」(Chlorpyrifos)列入危險物質清單,進而影響另條法規:禁止含有殘留違禁化學物質的農產品進口。美國與巴西對此提出抗議,認為泰國過度限制、強硬的手段,會損害他們農產品的出口。

泰國農業部副部長Mananya Thaiset表示,巴拉刈已在各種研究中被證明其與帕金森氏症有關。而針對「毒死蜱」(Chlorpyrifos),許多科學研究也提出它會影響孩童的大腦發育,已在歐盟和美國加州被禁止使用。

泰國目前約有1000萬個農戶開始受到禁令影響,該國農業普遍認為相關禁令會產生連鎖破壞反應,因為泰國的動物飼料幾乎完全仰賴進口的大豆、小麥。工商業暨銀行聯合委員會(Joint Standing Committee on Commerce, Industry and Banking)警告,該禁令將造成1.7兆泰銖(約新台幣1.6兆元)的損失和1200萬個工作機會消失,呼籲總理放寬禁令緩衝期限至2021年年底。

毒物
農林漁牧業
公害污染
永續發展
環境經濟
污染治理
土地利用
循環經濟
國際新聞
泰國
美國
巴西
禁用農藥
糧食

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

【其他文章推薦】

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

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

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

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

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

※回頭車貨運收費標準

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

80后的朋友們別買BBA了 這次給你們推薦點不一樣的

內飾Q50L的內飾風格顯得有些個性,並不如外觀給人感覺那麼的運動,更偏向一台家用車,但由於豪華品牌的定位,用料做工層面還是非常厚道細膩的類型。由於也是前置后驅,後排同樣存在這中間地台較高的特點。動力Q50L搭載的2。

說到30-40萬的豪華品牌車型,不少人第一主觀就會聯想到德系三強BBA,儘管BBA品牌雄踞豪華車市場銷量榜前列多年,但是路面曝光率過高的事實也不免顯得稍微喪失了一些個性,其實在豪華車市場,還有不少新晉的車型。

捷豹XFL

推薦車型:2.0T 200pS風華版

指導價格:38.80萬

捷豹XFL是捷豹品牌在中國首款國產的車型,對標車型是奔馳E級,寶馬5系這類豪華品牌中大型車,但是從定價來看,XFL的入門定價顯得頗為“謙虛”,38.80萬的入門車型配置已經非常不錯。

外觀

XFL的外觀設計呈現的車身姿態比較低矮,真的就宛如一隻卧身伏擊的豹子,囂張的前臉更凸顯了它品牌血統里就富有的攻擊氣質。

車尾設計優雅沉穩,並沒有太多視覺上覺得突兀的地方,或許這也是英國車的一種特點吧;XFL車身修長,超過5米,但並不顯得生拉硬拽,整車比例相當協調,線條勾勒手法流暢柔和,表明了它同樣是一台尺寸傲人的豪華轎車。

內飾

作為最低配的風華版,車內裝飾並沒有使用高配車型上所使用的撞色設計,但根據市場反饋,似乎消費者對於全黑內飾並不會抗拒。

XFL內飾秉承了捷豹家族式的風格,採用了整體環抱式的設計理念,讓前排人員駕乘時的包裹感更加強烈。

由於是前置后驅的驅動形式,後排地板因為傳動軸的原因導致地台較高,乘坐三人稍微有些不便利。

動力

200pS 風華版搭載了一台2.0T渦輪增壓發動機,最大馬力200匹,峰值扭矩320牛米,動力參數上領先於同級別主流的豪華品牌車型。與之匹配的是一台8擋手自一體變速箱,日常行駛動力儲備相當充沛,變速箱的平順性也非常出色。

英菲尼迪Q50L

推薦車型:2016款 2.0T悅享版

指導價格:30.98萬

英菲尼迪是誕生於北美地區的日產豪華品牌,旗下的Q50L是一款性價比較高的中型三廂車,對錶車型是奧迪A4L、寶馬3系這一級別的豪華品牌車型。作為豪華品牌車型,27.98萬的起售門檻還算不錯。

外觀

Q50L同樣也是作為東風英菲尼迪在華國產的首款車型,相較於進口Q50,Q50L的軸距加長了48mm,車身加長50mm,更大尺寸的車身和更長的軸距也讓Q50L更向“豪華”層面靠攏一分。

英菲尼迪Q50L採用了“長車頭短車尾”的造型設計,視覺效果保持一個上揚的態勢,營造出了一種較為兇狠的感覺,車尾緊湊飽滿,外露的雙邊排氣管凸顯了轎跑車型的運動范兒,Q50L偏運動風格的造型也是年輕人更喜歡的類型。

內飾

Q50L的內飾風格顯得有些個性,並不如外觀給人感覺那麼的運動,更偏向一台家用車,但由於豪華品牌的定位,用料做工層面還是非常厚道細膩的類型;由於也是前置后驅,後排同樣存在這中間地台較高的特點。

動力

Q50L搭載的2.0T發動機,最大馬力211匹,峰值扭矩350牛米,匹配的是7速手自一體變速箱,整體調校稍微有些激進,配合上略顯沉重但是十分精準的轉向,Q50L是一台極其富有駕駛樂趣的三廂車。

林肯MKZ

推薦車型:2017款 2.0T尊享版

指導價格:30.48萬

林肯和凱迪拉克一樣,都曾經作為美國總統用車的品牌,只是凱迪拉克在中國市場耕耘已久,而林肯則更多的是作為後起之秀意圖在國內立足。林肯MKZ是目前林肯旗下定位相對親民的一款三廂轎車,起步售價28.48萬,這個價位也引起了不少目標車型在ATS-L、寶馬3系這類車型潛在買家的關注。

外觀:

2017款的MKZ外觀借鑒了林肯自家旗艦車型Continental(大陸)的設計,未來這種尺寸更大,風格更沉穩的進氣格柵設計很有可能成為林肯最新的家族風格。MKZ整體外觀並不激進,圓潤大氣的設計理念讓它彰顯出一種行政級的嚴肅氣質。車尾標誌性的貫穿式尾燈永遠是林肯品牌的辨別武器,就目前來說,一台林肯MKZ還是非常小眾的存在。

內飾:

作為福特旗下的豪華品牌,MKZ的內飾風格看上去高檔感還是相對出色,中間按鍵式的換擋機構對於眾多消費者來說一時間可能難以適應,不過操作便利程度還是很高。由於MKZ是前驅車型,後排地台相對平整,在乘坐空間上的的捨棄程度沒前兩款那麼高,後排空間相對充裕。

動力:

林肯MKZ搭載的是2.0T渦輪增壓發動機,最大馬力203匹,峰值扭矩381牛米,匹配的是6速手自一體變速箱,調校風格也是偏向“福特”的類型,油門輕快,動力輸出很直接。

全文總結:現如今很多80後人群買車的預算區間已經上升到30萬的層級,但是多數人的選擇依舊停留在BBA,不是說BBA不好,而是在崇尚個性化的當下,選擇一款不一樣的,也正是符合年輕人個性化訴求的選擇。

以上三款車型,捷豹接近40萬的售價或許對於大多數人來說還是高了,所以推薦在Q50L和MKZ之間做抉擇;而喜歡駕駛樂趣和操控感的可以考慮Q50L,后驅布局,動力不俗;

偏向沉穩舒適訴求的朋友則可以考慮林肯MKZ,畢竟定位就是一款偏向舒適的中型車。亦個性亦豪華,三十萬級別這兩款都是不錯的選擇。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

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

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

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

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

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

※回頭車貨運收費標準

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