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月3日公視報導

斯里蘭卡首都可倫坡附近,發生有120頭鯨魚擱淺事件,當地民眾無法顧及防疫宵禁措施,徹夜協助要把鯨魚推回大海,但其中還是有兩頭鯨魚因為擱淺、受傷死亡。

警方說,當時不斷有鯨魚沖上岸,民眾根本搶救不及,後來海岸警衛隊及海軍部隊也加入搶救行列,利用小型巡邏艇將鯨魚送回深水區。斯里蘭卡海洋環境保護署則表示,這是斯里蘭卡首度有這麼多的鯨魚擱淺,情況很不尋常,懷疑可能跟澳洲日前發生大規模鯨魚擱淺事件有相似之處。

澳洲的塔斯馬尼亞在九月間,發生470頭領航鯨集體擱淺的意外。當時救援隊伍歷經五天時間,成功將其中110頭送回大海,其餘鯨魚則不幸死亡。為了避免造成二度海洋生態浩劫,當時清運鯨魚屍體也成了棘手問題。至於鯨魚為何一再被沖上岸始終成謎,科學家研判,領航鯨是高度社會化動物,擱淺原因可能跟牠們喜歡群聚生活、彼此互動密切,跟隨著一兩隻偏離航道的領航鯨而集體擱淺。

海洋
國際新聞
斯里蘭卡
鯨豚擱淺

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

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

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

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

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

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

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

東芝挑戰綠能新趨勢 本月內建立亞洲首座虛擬電廠

摘錄自2020年11月5日中國時報報導

日本東芝集團旗下能源系統公司宣布,本月內將與德國公司次世代電廠(Next Kraftwerke)成立合資新公司東芝次世代電廠(東芝 Next Kraftwerke),建立亞洲首座虛擬電廠(virtual power plant,縮寫VPP),透過通信技術和物聯網技術,雲端中央控制全國數個太陽能發電設備,使其像傳統電廠一樣運作。

VPP是在IT技術及物聯網技術更加成熟後,最近10年才興起的分散式電廠概念,有別於傳統集中式電廠,聚集不同類型技術電力,透過電網來調度電力,因此能解決風力、太陽能等再生能源發電量與運動時間不穩定問題,例如在發電後將多餘電量送往其他需要地點或者加以儲存備用,也可以客製化不斷變換負載狀況,更加靈活而有效率,同時也能節省能源。

東芝次世代電廠初步資本額是1.8億日圓(約4991萬台幣),公司就設在東芝能源系統公司本部、神奈川縣川崎市,東芝持股51%,次世代電廠持股49%。東芝已有準確預測發電量的技術,內部人士指出透過中央統一依據需求量來控制各發電設備發電量和調度,可將電力價格波動控制到較低程度。

能源轉型
國際新聞
日本
綠能

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

【其他文章推薦】

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

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

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

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

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

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

摘錄自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網頁設計為架站首選

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

※回頭車貨運收費標準

非洲大城空污直逼北京 禍首是二手車

摘錄自2020年11月4日科技新報報導

非洲國家蒙受空污之苦,在 PM2.5 方面最大禍首是從先進國家進口的二手車,隨著人民對汽車需求愈來愈大,城市空污問題成為難解之題。

QUARTZ 報導,在 2015~2018 年間,從歐盟、日本和美國出口的 1400 萬輛二手車中,約有 80% 流向中低收入國家。非洲是全球每年二手車進口量最多的國家,隨著這種缺乏檢驗標準的老舊汽車進入非洲,加劇城市空氣污染問題。譬如 2017 年與 2018 年荷蘭出口 3.5 萬台到西非的汽車當中,大部分都是 16~20 年的車,由於缺乏監管標準來衡量進口汽車的安全性和品質,這些車很多都低於歐洲安全和排放要求,造成汽車排放物成為非洲最大城市空污的重要來源。

接下來的 30 年中,非洲的人口增長將比其他任何地方都快,污染情況幾乎無法逆轉。最新研究估計,到 2030 年非洲大陸僅發電廠和車輛排放的化石燃料每年將導致近 5 萬人死亡。預計到 2030 年,二氧化硫和氮氧化物的年排放量將比 2012 年的水平多一倍。

污染治理
國際新聞
非洲
空氣污染
二手車

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

【其他文章推薦】

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

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

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

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

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

※超省錢租車方案

日再傳禽流感疫情 東香川市將撲殺4.8萬隻雞

摘錄自2020年11月08日中央通訊社日本報導

日本香川縣養雞場5日發生高致死率的H5N8高病原性禽流感疫情,正在撲殺場內約33萬隻雞,今天又傳出同縣另一處養雞場也發現H5高病原性禽流感,將撲殺場內約4萬8000隻雞。

專家研判病毒可能經由西伯利亞進入日本,現階段傳染給人類的可能性很低。由於短期內出現第2例禽流感疫情,縣府為避免疫情擴散,已將東香川市這處養雞場半徑3公里範圍,列為禁止移動雞隻與雞蛋的「移動限制區域」,並將半徑10公里內列為禁止出貨的「搬出限制區域」。

東香川市這處養雞場,距三豐市發生疫情養雞場約50公里,農林水產省今天(8日)已派遣專家小組前往東香川市,與地方政府就傳染途徑等進行詳細調查。

生物多樣性
國際新聞
香川縣
日本
H5N8
禽流感

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

【其他文章推薦】

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

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

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

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

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

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

生態受威脅 北極探測發出警報

摘錄自2020年11月08日法國國際廣播電台北極報導

德國破冰船極星號(Polarstern)裝載20國的科學家對北極進行為期一年的科學考察,於10月12日成功返回德國出發的港口。本次考察活動是對北極海洋,冰層和大氣的研究,以便能夠對地球未來氣候做出預測。 科學考察們通過1年時間收集的資料需要1到2年進行分析,但是科學家們再次發出警告,如果人類社會不進行控制氣溫升高,幾十年內北極夏季恐將無冰。

根據該項考察工作的任務負責人雷克斯(Markus Rex)在返回後舉行的新聞會議上表示,北極星號得以在有時遠達地平線的大片開闊水域航行,顯示出北極的海冰融化情況有多嚴重。他說即便在北極點(North Pole),夏天我們也發現海冰嚴重消融、又薄又脆。

研究人員在極地的夜間搜集冰下水體樣本,藉此研究浮游植物和細菌,以及進一步了解極端情況下海洋生態系統如何生存。本次北極遠征考察行動也攜回150兆位元組的資料,還有超過1000個冰和海水的樣本。初步估計分析這批資料而且逐漸在科學雜誌上陸續發表需要長達2年。科學家們就是希望能夠建立起氣候變化模型,幫助預測未來20年、50年或100年的熱浪、豪雨、風暴等將是何種現象。

生物多樣性
氣候變遷
國際新聞
北極
冰層消融
全球暖化

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

【其他文章推薦】

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

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

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

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

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

築壩迫遷、鄰近斷層帶 寮國執意於湄公河興建境內最大水壩

環境資訊中心綜合外電;黃鈺婷 編譯;林大利 審校

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

【其他文章推薦】

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

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

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

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

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

日本首見 蝙蝠糞便病毒基因近似武漢肺炎病毒

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

日本東京大學等組成的研究團隊公布,從日本國內的蝙蝠糞便中,發現基因近似新型冠狀病毒的病毒,是日本首度從國內野生動物上發現。這次發現的冠狀病毒並不會傳染給人類。

日本放送協會(NHK)報導,專精獸醫學的東京大學研究所副教授村上晉等人組成的研究團隊,對外公布這項調查結果。研究團隊詳細調查7年前在日本國內洞窟採集到的「角菊頭蝠」(Rhinolophus cornutus)糞便中所含病毒基因時,發現跟新型冠狀病毒有81.5%一致。研究團隊透過實驗確認,這種冠狀病毒不會傳染給人類。

目前已知從中國的蝙蝠等身上,發現跟新型冠狀病毒基因逾95%一致的病毒,但日本研究團隊表示,這應是日本國內發現到跟新型冠狀病毒基因最接近的病毒。村上說,雖然冠狀病毒被認為只有極少部分具有危險,但也不能否定日本國內存在著能傳染給人類的種類,必須調查野生動物,盡速掌握實際狀態。

生物多樣性
國際新聞
日本
蝙蝠
冠狀病毒
武漢肺炎
動物與大環境變遷

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

【其他文章推薦】

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

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

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

※超省錢租車方案

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