美大選辯論 川普稱森林管理要更好 拜登盼重回巴黎氣候協議

摘錄自2020年9月30日自由時報報導

在美國總統大選辯論中,福斯新聞主持人華勒斯(Chris Wallace)問起了氣候變遷議題,他問川普,在過去讓美國退出巴黎氣候協議,為何不相信氣候變遷。

川普說人們想要乾淨的水和空氣,若從碳排放量來看,數字也表現得很出色,川普說森林的地基都是死掉的樹,放一把火全都會燒起來,我們應該把森林管得更好,並說自己每一年都會接到加州在焚燒的電話,在歐洲則有所謂的森林城市,把森林管得很好,但美國的樹卻比歐洲更容易燃燒。

拜登則宣稱他的環保政策可以創造大量工作崗位,上任第一件事就是加入巴黎氣候協議。

氣候變遷
國際新聞
美國
川普
巴黎協定

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

【其他文章推薦】

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

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

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

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

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

有的判2年,有的罰4800塊,嚇得我開車再也不敢拿手機了

4、在日本,如果開車拿着手機都被視為使用手機,也就是要罰款了。5、而在我國,在新修訂的《機動車駕駛證申領和使用規定》公布后,2013年1月1日起施行,其中規定:駕駛機動車有撥打、接聽手持電話等妨礙安全駕駛的行為的一次記2分。

隨着越來越多的人擁有了自己的車正式成為“司機”的一員之後,許多不文明的開車甚至是危險駕駛的行為也暴露出來,今天想跟大家說的是危險駕駛的一種,開車打電話和開車玩手機,這是一種不得不讓人重視的危險行為。

老實說,手機的內容確實是吸引人(不會,是玩車的!),因此,世界各國針對開車玩手機這種行為頒布了相關的法律法規。

1、在英國,開車打電話最高可判入獄2年,因發短信造成致人死亡車禍的肇事司機責要面臨最高14年的監禁。

2、美國駕車打電話、發送接收短信电子郵件或操作GpS導航的會被定罪為危害公共安全罪,罰款120美元,更有意思的是連行人也管,走路發短信罰款85美元哦!

3、在新加坡開車打電話,對初犯者會罰款1000新元(約4800人民幣)並處以監禁6個月;而對於再犯者就好不客氣了,直接翻倍吧!

4、在日本,如果開車拿着手機都被視為使用手機,也就是要罰款了。

5、而在我國,在新修訂的《機動車駕駛證申領和使用規定》公布后,2013年1月1日起施行,其中規定:駕駛機動車有撥打、接聽手持電話等妨礙安全駕駛的行為的一次記2分。 新交規中此條的完整說明是“駕駛機動車有撥打、接聽手持電話等妨礙安全駕駛行為的,一次記2分”,警方表示,只要不是雙手持方向盤,例如發短信、抽煙等行為都存在安全隱患,查實后都要按扣2分處理,罰200.

開車玩手機的問題是日益嚴重,紛紛引起了世界各地的關注。在此,也奉勸各位開車就專心開車,這麼好玩的車都不玩幹嘛玩手機呢?

給大家看看一些司機開車玩手機的可惡行為,我們代表正義消滅他們吧!

司機大哥,您還是靠邊停車吧,我還是走路好了,我是真的在瑟瑟發抖~

當你在開車玩手機或接電話的時候,你的注意力會被轉移一部分,導致在發生緊急情況時採取緊急措施的反應會比平時慢了很多,而事故就這樣發生了。所以為了自己也為他人的生命負責,我們要杜絕開車玩手機這種極度危險的駕駛行為,還社會一個文明安全的駕駛環境。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

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

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

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

※回頭車貨運收費標準

開這款四門轎車,想不被關注都難,奔馳寶馬都得繞道

並不是誰都能觸手可及瑪莎拉蒂Ghibli是特別的它的發展並不存在“延續”曾經的它是跑車雙門兩座跑車和雙門四座跑車分別都是它的前身可是今天的它不再是一款跑車它僅僅是在不同的歷史階段扮演不同的角色它有着一顆3。0T V6的心臟最大馬力350pS最大扭矩500N·m匹配8AT變速箱如果以跑車,甚至超跑的水準去衡量它的動力這還是嫩了一點4門5座的三廂設計讓它顯得更居家儘管它帶有跑車的基

拉風的外觀

奢華的內飾

澎湃的動力

精準的操控

具備這些因素的一定是超跑?

不!也有可能是瑪莎拉蒂Ghibli

極具藝術感的外觀造型

分分鐘能讓你在鬧市中成為焦點

內飾設計舒適、豪華

還有各種真皮面料、高檔木飾等配飾供你選裝

就連車漆顏色、輪轂、剎車卡鉗、音響等配置都可以選配

讓你打造出獨一無二的專屬座駕

正因為它是如此獨特

彷彿時刻都在訴說“生人勿近”

畢竟它的身價

……

並不是誰都能觸手可及

瑪莎拉蒂Ghibli是特別的

它的發展並不存在“延續”

曾經的它是跑車

雙門兩座跑車和雙門四座跑車分別都是它的前身

可是今天的它不再是一款跑車

它僅僅是在不同的歷史階段扮演不同的角色

它有着一顆3.0T V6的心臟

最大馬力350pS

最大扭矩500N·m

匹配8AT變速箱

如果以跑車,甚至超跑的水準去衡量它的動力

這還是嫩了一點

4門5座的三廂設計讓它顯得更居家

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

【其他文章推薦】

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

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

※回頭車貨運收費標準

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

※超省錢租車方案

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

這3台不到20萬的中型車,讓開邁騰的年輕人羡慕到想賣車

阿特茲,雖然是一大堆的優點,但都是針對駕駛者而設計的,因此乘客的乘坐體驗就一般了,加上在風噪胎躁方面的控制不是很好,整體的乘坐質感並不高,如果是想給家人更多的舒適體驗,那還是再考慮考慮吧。蒙迪歐,綜合實力很平均,然而在這個價位購車的朋友們多多少少會考慮到油耗這個問題,雖然蒙迪歐的動力數據很好,但在強大動力的加持下,油耗的表現確實是偏高。

今天,跟大家嘮嘮幾款打着運動旗號的中型車,它們分別是:阿特茲,蒙迪歐以及思鉑睿,一看到這幾款車,大家都知道,這些車都有一個通病,就是銷量不高~

其中,蒙迪歐在2017的全年的銷量為:112158台,阿特茲則是:53493台,思鉑睿最少,才19277台,換個說法,這三款車每個月的銷量都是不會破萬的,它們的小眾程度可見一般。

三車外觀如何?

阿特茲自不必說,採用了“魂動”設計語言的它不負“ATENZA”這個寓意為萬眾矚目的稱號。

蒙迪歐,大多朋友戲稱為“小馬丁”的存在,當然,此馬丁非天才DJ Martin Garrix,而是汽車界的紳士-阿斯頓·馬丁,雖然嚴謹的說,它們沒什麼關係,但是蒙迪歐的運動外觀卻是不爭的事實。

思鉑睿,低矮的車身,兇悍的前進氣格柵,這都是它為了區別於傳統舒適性中型車的外觀而設計的。

既然是主打運動,那麼動力是必不可少的較量了

通過三台車的動力系統對比,蒙迪歐在總體上比其它兩款車的動力更加好,畢竟渦輪增壓在這裏佔得便宜不小,但是論起操控,號稱東瀛寶馬的馬自達是三車之中最好的,而屬於買發動機送車殼的本田思鉑睿在這三款車中,發動機與變速箱的匹配程度是最高的。

那麼,運動型車能家用嗎?

在這之前,給大家看看三車的後排空間數據,大家就明白是咋回事了。

阿特茲空間數據

蒙迪歐空間數據

思鉑睿空間數據

通過對比看出,其實三款車型均為中型轎車,在空間方面也不要過於擔心,就算再不濟也是足夠正常使用。

三車的配置上,哪個更優?

給大家帶來的是三款車在相近價位的配置對比,通過對比看出阿特茲的配置更加豐富一點,也更加符合國人買車時“配置豐富”的需求,所以阿特茲在配置對比方面優勢不小。

說了這麼多,這些車都沒有缺點嗎?

當然不是,為你一一道來。

阿特茲,雖然是一大堆的優點,但都是針對駕駛者而設計的,因此乘客的乘坐體驗就一般了,加上在風噪胎躁方面的控制不是很好,整體的乘坐質感並不高,如果是想給家人更多的舒適體驗,那還是再考慮考慮吧。

蒙迪歐,綜合實力很平均,然而在這個價位購車的朋友們多多少少會考慮到油耗這個問題,雖然蒙迪歐的動力數據很好,但在強大動力的加持下,油耗的表現確實是偏高。

思鉑睿,說句老實話,它的裝配水平在這麼多的車之中只能算是一般,而且車內各處的異響也不少,但好在整體的行駛質感做得不錯,在保證一定運動格調的情況下還能兼顧到家庭所需。

對於這三款車型而言,其實取捨也很簡單,假如你是一名極致的操控愛好者,那麼阿特茲絕對可以滿足到你,而針對於蒙迪歐和思鉑睿而言,雖然同樣定位在運動型中級車上,但是它們依然保持着很不錯的舒適性能兼顧到家庭所需,更適合那些以家庭出行為主但又對操控有所要求的朋友。

那麼這幾款車,哪個配置的最值得入手呢?阿特茲,選擇2.5L藍天運動版性價比是最高的,在保證足夠的動力的前提下配置也足夠我們日常所需;而蒙迪歐則可以考慮到1.5T的時尚型,動力能滿足日常所需而且在配置上也能滿足需求;最後輪到思鉑睿,雖然2.4L版本更值得推薦,而且已經自帶了原來的SI運動包圍,但據消息稱2.4L版本已經開始停產,而作為主銷車型的實則為2.0L的低排量版本以及混動版本,而更推薦考慮混動版本。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※超省錢租車方案

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

※回頭車貨運收費標準

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

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

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

JS遍歷對象的幾種方法

幾天前一個小夥伴問我 Object.getOwnPropertyNames() 是干什麼用的

平時還真沒有使用到這個方法,一時不知如何回答

從方法名稱來分析,應該是返回的是對象自身屬性名組成的數組

那和 Object.keys() 方法不就一樣了嗎

感覺事情並不這麼簡單,於是我仔細看了一下這幾種遍歷對象的方法的區別

for in

for in 循環是最基礎的遍歷對象的方式,它還會得到對象原型鏈上的屬性

// 創建一個對象並指定其原型,bar 為原型上的屬性
const obj = Object.create({
  bar: 'bar'
})

// foo 為對象自身的屬性
obj.foo = 'foo'

for (let key in obj) {
  console.log(obj[key]) // foo, bar
}

可以看到對象原型上的屬性也被循環出來了

在這種情況下可以使用對象的 hasOwnProperty() 方法過濾掉原型鏈上的屬性

for (let key in obj) {
  if (obj.hasOwnProperty(key)) {
    console.log(obj[key]) // foo
  }
}

這時候原型上的 bar 屬性就被過濾掉了

Object.keys

Object.keys() 是 ES5 新增的一個對象方法,該方法返回對象自身屬性名組成的數組,它會自動過濾掉原型鏈上的屬性,然後可以通過數組的 forEach() 方法來遍歷

Object.keys(obj).forEach((key) => {
  console.log(obj[key]) // foo
})

另外還有 Object.values() 方法和 Object.entries() 方法,這兩方法的作用範圍和 Object.keys() 方法類似,因此不再說明

for in 循環和 Object.keys() 方法都不會返回對象的不可枚舉屬性

如果需要遍歷不可枚舉的屬性,就要用到前面提到的 Object.getOwnPropertyNames() 方法了

Object.getOwnPropertyNames

Object.getOwnPropertyNames() 也是 ES5 新增的一個對象方法,該方法返回對象自身屬性名組成的數組,包括不可枚舉的屬性,也可以通過數組的 forEach 方法來遍歷

// 創建一個對象並指定其原型,bar 為原型上的屬性
// baz 為對象自身的屬性並且不可枚舉
const obj = Object.create({
  bar: 'bar'
}, {
  baz: {
    value: 'baz',
    enumerable: false
  }
})

obj.foo = 'foo'

// 不包括不可枚舉的 baz 屬性
Object.keys(obj).forEach((key) => {
  console.log(obj[key]) // foo
})

// 包括不可枚舉的 baz 屬性
Object.getOwnPropertyNames(obj).forEach((key) => {
  console.log(obj[key]) // baz, foo
})

ES2015 新增了 Symbol 數據類型,該類型可以作為對象的鍵,針對該類型 ES2015 同樣新增了 Object.getOwnPropertySymbols() 方法

Object.getOwnPropertySymbols

Object.getOwnPropertySymbols() 方法返回對象自身的 Symbol 屬性組成的數組,不包括字符串屬性

Object.getOwnPropertySymbols(obj).forEach((key) => {
  console.log(obj[key])
})

什麼都沒有,因為該對象還沒有 Symbol 屬性

// 給對象添加一個不可枚舉的 Symbol 屬性
Object.defineProperties(obj, {
  [Symbol('baz')]: {
    value: 'Symbol baz',
    enumerable: false
  }
})

// 給對象添加一個可枚舉的 Symbol 屬性
obj[Symbol('foo')] = 'Symbol foo'

Object.getOwnPropertySymbols(obj).forEach((key) => {
  console.log(obj[key]) // Symbol baz, Symbol foo
})

Reflect.ownKeys

Reflect.ownKeys() 方法是 ES2015 新增的靜態方法,該方法返回對象自身所有屬性名組成的數組,包括不可枚舉的屬性和 Symbol 屬性

Reflect.ownKeys(obj).forEach((key) => {
  console.log(obj[key]) // baz, foo, Symbol baz, Symbol foo
})

對比

方式 基本屬性 原型鏈 不可枚舉 Symbol
for in 是 是 否 否
Object.keys() 是 否 否 否
Object.getOwnPropertyNames() 是 否 是 否
Object.getOwnPropertySymbols() 否 否 是 是
Reflect.ownKeys() 是 否 是 是

結論

這其中只有 for in 循環會得到對象原型鏈上的屬性,其它方法都只適用於對象自身的屬性

ES 語言後續添加的新特性不會對以前的代碼產生副作用,比如在 ES2015 之前就存在的 for in 循環,Object.keys() 和 Object.getOwnPropertyNames() 是肯定不會返回 Symbol 屬性的

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

【其他文章推薦】

※USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

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

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

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

※回頭車貨運收費標準

Vue數據雙向綁定原理

Vue數據雙向綁定

Vue是通過數據劫持的方式來實現數據雙向數據綁定的,其中最核心的方法便是通過Object.defineProperty()來實現對屬性的劫持,該方法允許精確地添加或修改對象的屬性,對數據添加屬性描述符中的getter與setter實現劫持。

描述

運行一個Vue實例並將data打印,可以看到對象中對於msg有了get與set,通過他們就可以實現數據的劫持,從而進行數據的更新,在Vue中get與set是通過ES5的Object.defineProperty()方法定義的,該方法的具體功能可以查閱https://github.com/WindrunnerMax/EveryDay/blob/master/JavaScript/defineProperty.md。

<!DOCTYPE html>
<html>
<head>
    <title>數據綁定</title>
</head>
<body>
    <div id="app">
        <div>{{msg}}</div>
    </div> 
</body>
<script src="https://cdn.bootcss.com/vue/2.4.2/vue.js"></script>
<script type="text/javascript">
    var vm = new Vue({
        el: '#app',
        data: {
            msg: 'Data'
        },
        created: function() {
            console.log(this.$data); //{__ob__: Observer} 
        }
    })
</script>
</html>
/*
{__ob__: Observer}
    msg: "Data"
    __ob__: Observer {value: {…}, dep: Dep, vmCount: 1}
    get msg: ƒ reactiveGetter()
    set msg: ƒ reactiveSetter(newVal)
    __proto__: Object
*/

分析實現

Vue的雙向數據綁定,簡單點來說分為以下三個部分:

  • Observer: 這裏的主要工作是遞歸地監聽對象上的所有屬性,在屬性值改變的時候,觸發相應的Watcher。
  • Watcher: 觀察者,當監聽的數據值修改時,執行響應的回調函數,在Vue裏面的更新模板內容。
  • Dep: 鏈接Observer和Watcher的橋樑,每一個Observer對應一個Dep,它內部維護一個數組,保存與該Observer相關的Watcher。

根據上面的三部分實現一個功能非常簡單的Demo,實際Vue中的數據在頁面的更新是異步的,且存在大量優化,實際非常複雜。
首先實現Dep方法,這是鏈接Observer和Watcher的橋樑,簡單來說,就是一個監聽者模式的事件總線,負責接收watcher並保存。其中subscribers數組用以保存將要觸發的事件,addSub方法用以添加事件,notify方法用以觸發事件。

function __dep(){
    this.subscribers = [];
    this.addSub = function(watcher){
        if(__dep.target && !this.subscribers.includes(__dep.target) ) this.subscribers.push(watcher);
    }
    this.notifyAll = function(){
        this.subscribers.forEach( watcher => watcher.update());
    }
}

Observer方法就是將數據進行劫持,使用Object.defineProperty對屬性進行重定義,注意一個屬性描述符只能是數據描述符和存取描述符這兩者其中之一,不能同時是兩者,所以在這個小Demo中使用getter與setter操作的的是定義的value局部變量,主要是利用了let的塊級作用域定義value局部變量並利用閉包的原理實現了getter與setter操作value,對於每個數據綁定時都有一個自己的dep實例,利用這個總線來保存關於這個屬性的Watcher,並在set更新數據的時候觸發。

function __observe(obj){
    for(let item in obj){
        let dep = new __dep();
        let value = obj[item];
        if (Object.prototype.toString.call(value) === "[object Object]") __observe(value);
        Object.defineProperty(obj, item, {
            configurable: true,
            enumerable: true,
            get: function reactiveGetter() {
                if(__dep.target) dep.addSub(__dep.target);
                return value;
            },
            set: function reactiveSetter(newVal) {
                if (value === newVal) return value;
                value = newVal;
                dep.notifyAll();
            }
        });
    }
    return obj;
}

Watcher方法傳入一個回調函數,用以執行數據變更后的操作,一般是用來進行模板的渲染,update方法就是在數據變更后執行的方法,activeRun是首次進行綁定時執行的操作,關於這個操作中的__dep.target,他的主要目的是將執行回調函數相關的數據進行sub,例如在回調函數中用到了msg,那麼在執行這個activeRun的時候__dep.target就會指向this,然後執行fn()的時候會取得msg,此時就會觸發msg的get(),而get中會判斷這個__dep.target是不是空,此時這個__dep.target不為空,上文提到了每個屬性都會有一個自己的dep實例,此時這個__dep.target便加入自身實例的subscribers,在執行完之後,便將__dep.target設置為null,重複這個過程將所有的相關屬性與watcher進行了綁定,在相關屬性進行set時,就會觸發各個watcher的update然後執行渲染等操作。

function __watcher(fn){
    this.update = function(){
        fn();
    }
    
    this.activeRun = function(){
        __dep.target = this;
        fn();
        __dep.target = null;
    }
    this.activeRun();
}

代碼示例

這是上述的小Demo的代碼示例,其中上文沒有提到的__proxy函數主要是為了將vm.$data中的屬性直接代理到vm對象上,兩個watcher中第一個是為了打印並查看數據,第二個是之前做的一個非常簡單的模板引擎的渲染,為了演示數據變更使得頁面數據重新渲染,在這個Demo下打開控制台,輸入vm.msg = 11;即可觸發頁面的數據更改,也可以通過在40行添加一行console.log(dep);來查看每個屬性的dep綁定的watcher。

<!DOCTYPE html>
<html>
<head>
    <title>數據綁定</title>
</head>
<body>
    <div id="app">
        <div>{{msg}}</div>
        <div>{{date}}</div>
    </div> 
</body>
<script type="text/javascript">

    var Mvvm = function(config) {
        this.$el = config.el;
        this.__root = document.querySelector(this.$el);
        this.__originHTML = this.__root.innerHTML;

        function __dep(){
            this.subscribers = [];
            this.addSub = function(watcher){
                if(__dep.target && !this.subscribers.includes(__dep.target) ) this.subscribers.push(watcher);
            }
            this.notifyAll = function(){
                this.subscribers.forEach( watcher => watcher.update());
            }
        }


        function __observe(obj){
            for(let item in obj){
                let dep = new __dep();
                let value = obj[item];
                if (Object.prototype.toString.call(value) === "[object Object]") __observe(value);
                Object.defineProperty(obj, item, {
                    configurable: true,
                    enumerable: true,
                    get: function reactiveGetter() {
                        if(__dep.target) dep.addSub(__dep.target);
                        return value;
                    },
                    set: function reactiveSetter(newVal) {
                        if (value === newVal) return value;
                        value = newVal;
                        dep.notifyAll();
                    }
                });
            }
            return obj;
        }

        this.$data = __observe(config.data);

        function __proxy (target) {
            for(let item in target){
                Object.defineProperty(this, item, {
                    configurable: true,
                    enumerable: true,
                    get: function proxyGetter() {
                        return this.$data[item];
                    },
                    set: function proxySetter(newVal) {
                        this.$data[item] = newVal;
                    }
                });
            }
        }

        __proxy.call(this, config.data);

        function __watcher(fn){
            this.update = function(){
                fn();
            }
            
            this.activeRun = function(){
                __dep.target = this;
                fn();
                __dep.target = null;
            }
            this.activeRun();
        }

        new __watcher(() => {
            console.log(this.msg, this.date);
        })

        new __watcher(() => {
            var html = String(this.__originHTML||'').replace(/"/g,'\\"').replace(/\s+|\r|\t|\n/g, ' ')
            .replace(/\{\{(.)*?\}\}/g, function(value){ 
                return  value.replace("{{",'"+(').replace("}}",')+"');
            })
            html = `var targetHTML = "${html}";return targetHTML;`;
            var parsedHTML = new Function(...Object.keys(this.$data), html)(...Object.values(this.$data));
            this.__root.innerHTML = parsedHTML;
        })

    }

    var vm = new Mvvm({
        el: "#app",
        data: {
            msg: "1",
            date: new Date(),
            obj: {
                a: 1,
                b: 11
            }
        }
    })

</script>
</html>

每日一題

https://github.com/WindrunnerMax/EveryDay

參考

https://www.jianshu.com/p/255d4dec710a
https://www.jianshu.com/p/c8186e9e027b
https://www.cnblogs.com/wangjiachen666/p/9883916.html
https://blog.csdn.net/wangshu696/article/details/84570886
https://blog.csdn.net/qq_43051529/article/details/82877673
https://github.com/liutao/vue2.0-source/blob/master/%E5%8F%8C%E5%90%91%E6%95%B0%E6%8D%AE%E7%BB%91%E5%AE%9A.md

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

【其他文章推薦】

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

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

※回頭車貨運收費標準

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

※超省錢租車方案

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

曹工改bug:centos下,mongodb開機不能自啟動,systemctl、rc.local都試了,還是不行,要不要放棄?

問題背景

最近裝個centos 7.6的環境,其中,基礎環境包括,redis、nginx、mongodb、fastdfs、mysql等,其中,自啟動使用的是systemctl,其他幾個組件,都沒啥問題,唯獨,這個mongodb,是死活啟動不了。

但是,我這裏說的,不是啟動不了,如果直接在shell里敲:

systemctl start  mongod.service

是沒啥問題的,是可以啟動的。

mongod.service大致如下,各文件夾的權限也已經仔細檢查過,應該是沒毛病:

[Unit]
Description=High-performance, schema-free document-oriented database
After=network.target
Documentation=https://docs.mongodb.org/manual

[Service]
User=mongod
Group=mongod
Environment="OPTIONS=-f /etc/mongod.conf"
ExecStart=/usr/bin/mongod $OPTIONS
ExecStartPre=/usr/bin/mkdir -p /var/run/mongodb
ExecStartPre=/usr/bin/chown mongod:mongod /var/run/mongodb
ExecStartPre=/usr/bin/chmod 0755 /var/run/mongodb
PermissionsStartOnly=true
PIDFile=/var/run/mongodb/mongod.pid
Type=forking
# file size
LimitFSIZE=infinity
# cpu time
LimitCPU=infinity
# virtual memory size
LimitAS=infinity
# open files
LimitNOFILE=64000
# processes/threads
LimitNPROC=64000
# locked memory
LimitMEMLOCK=infinity
# total threads (user+kernel)
TasksMax=infinity
TasksAccounting=false
# Recommended limits for for mongod as specified in
# http://docs.mongodb.org/manual/reference/ulimit/#recommended-settings

[Install]
WantedBy=multi-user.target

後邊換成了rc.local方式:

/etc/rc.d/rc.local  

#!/bin/bash
/usr/bin/mongod --fork -f /etc/mongod.conf &

但是,依然不行。

這两天,同事也在斷斷續續在弄,大家手裡有其他事,這塊暫時放下了。

轉機:strace命令

我一般瀏覽器開的tab比較多,有個幾天前的tab,是關於strace的,我當時主要是想:找一個命令,可以監控某個進程的網絡請求。

本來可以用tcpdump,但是,這個不是針對某個進程的,只能通過端口過濾,一般情況下,用端口過濾也足夠了,但是,總是覺得不爽。

然後找到了這個鏈接:

https://askubuntu.com/questions/11709/how-can-i-capture-network-traffic-of-a-single-process

裏面提到了strace可以做到。試了下,確實完美解決了我的問題。

比如說,我可以attach到某個進程,然後調用進程的某個接口,讓該進程調用某個微服務,然後看看我們能不能抓到:

(看不清可在單獨tab查看,這個是java應用,向註冊中心eureka發送的心跳,可以發現,完美抓到了)

strace的使用

可參考我的這篇簡單介紹:

Linux下,如何監控某個進程到底向哪個地址發起了網絡調用

大家也可以直接在服務器上直接執行以下shell,查看幫助文檔:

yum install strace
man strace

其主要支持兩種方式,一種是直接使用strace來包裝某個命令,使用strace來啟動該命令;另一種,就是上面說的,attach到某個已經在運行中的進程。

然後,我想到,既然strace可以監控系統調用,那麼,監控下mongodb吧,這裏可以用strace來包裝命令,我試着把命令換成了如下的樣子:

strace -tt -s 10000 -o  mongo.txt /usr/bin/mongod --fork -f /etc/mongod.conf

這塊命令,分兩塊看。

strace -tt -s 10000  -o  mongo.txt 

這部分是strace的參數,

-tt 打印時間

-s 設置字符串的長度,否則具體內容显示不出來

-o 將結果輸出到文件

另外部分,就是mongo的命令了:

/usr/bin/mongod --fork  /etc/mongod.conf

比較正常情況下,和異常情況下的strace輸出日誌

在同事建議下,我們先直接在shell中執行了以下命令:

strace -tt -s 10000  -o  mongo.txt /usr/bin/mongod --fork -f /etc/mongod.conf

然後,得到了mongo.txt。這個是正常的文件。

然後,我們reboot了服務器,然後不清楚文件生成到哪裡了,直接find查找了一把,然後找到后,把這兩個文件,都存到了pc上,用beyond compare進行對比。

下面是對比結果:

建議大圖查看。

可以發現,有問題的文件里,在打開以下文件時,報了錯,提示沒有權限:

/sys/fs/cgroup/memory/memory.limit_in_bytes   EACCES (Permission denied)

然後,我們只是知道了,有這個現象,但不知道為啥,然後就開始了一頓漫無邊際的面向搜索引擎找問題。找了半天,沒啥收穫。

後邊我們就決定再去看看官網,看看官網有沒有說,怎麼才是正統的服務自啟動方式(已經快放棄了。。。)

柳暗花明

結果在官網的如下鏈接:

https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/#install-mongodb-community-edition

看到如下一段話,說SELinux,默認不讓mongo訪問/sys/fs/cgroup:

然後我一看,這個目錄有點熟悉啊,上面報沒有權限的文件,不就這個目錄下嗎?

/sys/fs/cgroup/memory/memory.limit_in_bytes   EACCES (Permission denied)

知道原因就好說了,原來是SELinux,我們這邊比較暴力,直接把這個關閉了。

關閉方式:https://www.cnblogs.com/activiti/p/7552677.html

總結

在華為的時候,組裡的大佬們有一句話:辦法總比困難多。

那時感覺,這也太雞湯了。。。

我現在也有這個感覺,每次在快要放棄時,問題結果被解決了,有點意思。

另外一個感悟:方法比結果重要

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

【其他文章推薦】

※超省錢租車方案

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

※回頭車貨運收費標準

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

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

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

最大冰山直逼南喬治亞恐毀生態

摘錄自2020年11月5日蘋果日報報導

全球最大的冰山A68a正沖向英國南大西洋海外領地南喬治亞(South Georgia),可能破壞大片野生動物棲息地,令大量企鵝和海豹死亡。

A68a面積約4,00平方公里,估計重數千億噸,外形像一隻伸出的食指。它2017年中分離南極州,沿着「冰山巷」漂浮,現已到達南喬治亞西南數百公里。

由於A68a在水下的深度估計只有約200米,停下來前有可能沖上南喬治亞海岸,堵塞企鵝和海豹的覓食通道,嚴重破壞生態。英國南極調查局(BAS)學者塔林(Geraint Tarling)稱冰山或停留在當地十年,令企鵝和海豹要花更長時間到原本覓食地區,未必能趕及回到原地餵飼幼兒,導致牠們餓死。

不過,BAS遙距感測和地圖技術員弗雷特韋爾(Peter Fretwell)洋流仍有機會令A68a改為向西北漂浮,然後在較溫的水域解體,避免這場災難,當局正密切了解冰山在最壞情況下會對生態和漁業造成多大打擊。

生物多樣性
氣候變遷
國際新聞
南極
冰山

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

【其他文章推薦】

※USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

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

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

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

※回頭車貨運收費標準

香港開闊原野鳥類數量跌7成 香港觀鳥會促政府多保護農地、近郊荒地

摘錄自2020年11月5日香港01報導

香港觀鳥會為了更了解香港的鳥類分布,與義工及浸會大學協力作出為期3年(2016至2019)的研究。研究中發現開闊原野雀鳥的分布量大跌7成,調查中的281種鳥類,發現繁殖季中有29種鳥類分布範圍縮減,而冬季則有31種,當中佔大多數的為開闊原野鳥類。包括一年四季棲息在香港的喜鵲分布範圍收窄高達6成,而喜歡在農地棲息的理氏鷚及山斑鳩,前者約下跌6成,後者下跌超過8成。反映開闊原野的環境遭到破壞。

香港觀鳥會指出,鳥類分布的改變能說明環境指標實況,現時的開闊原野如農地、低地草坡、近郊荒地等大多未有受被劃在郊野公園,亦不受法律保護。棲息在開闊原野的鳥類眾多,惟政府過往未有好好關注這些地方。反而以往較為側重保護一些森林和濕地,希望政府日後能多關注及保護農地及近郊荒地。

生物多樣性
國際新聞
香港
鳥類調查
鳥類保育

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

【其他文章推薦】

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

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

※回頭車貨運收費標準

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

※超省錢租車方案

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

拜登勝選,環境翻盤——從野火談到頁岩油 美國大選氣候看點

環境資訊中心綜合外電;許祖菱、鄒敏惠 編譯;鄒敏惠 審校

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

【其他文章推薦】

※超省錢租車方案

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

※回頭車貨運收費標準

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

※FB行銷專家,教你從零開始的技巧