15萬買啥車?有轎車有SUV,這2款合資車可以放心買

勁客的優勢在於成熟可靠的動力總成,採用1。5L自然吸氣發動機+CVT無級變速器的搭配能夠帶來非常平順線性的輸出,油門調校靈敏,能夠很好地應付日常市區內行駛,並且也非常省油,可靠性較高。不過其檔次感與配置水平不如哈弗H2。

15萬左右比較推薦的是本田XR-V與豐田卡羅拉,這兩款車目前在市場上都有着不錯的銷量、保值率以及口碑,XR-V在小型SUV市場混得風生水起,靠的就是其成熟的動力系統和越級的空間表現,家用是個非常棒的選擇。而卡羅拉乃全球銷量神車,中庸就是其最大的武器,除了汽油版本外還有雙擎版本可選,擁有非常優秀的燃油經濟性,能夠滿足許許多多的消費者,除了隔音濾振差點,其它方面的表現都非常不錯,乃家用車的不二之選。

一輛是接近中型車的緊湊型車,一輛是標準的中型車,凌渡280DSG豪華版擁有更加豐富的配置,不過因為其比較扁平的設計所以頭部空間表現一般,而君威中型車的身份自然擁有更大的空間以及更高的檔次感,同時全系標配9AT也讓其競爭力進一步上升,採用的1.5T發動機也有着不錯的動力輸出,因此更推薦君威1.5T中配。

510採用的是6擋手動變速器和5擋AMT變速器,假設會開手動擋的話更加推薦手動車型,6個擋位在高速行駛時把轉速壓得更低,能帶來更好的燃油經濟性,同時擁有更高的傳動效率及可靠性,510的手動擋換擋手感不錯,有吸入感並且行程不長,離合器的力度也不沉,沒那麼容易疲勞。而AMT變速器雖然說省去了踩離合器的麻煩,但是其換擋邏輯不清晰,而且頓挫比較嚴重,尤其是在起步階段或者是在堵車狀況下,因此更加推薦510的手動版車型。

兩車都是定位小型SUV,哈弗H2擁有更加親民的售價,更加大氣上檔次的外觀內飾設計,同時配置更加豐富,採用的1.5T發動機+7擋雙離合的搭配,擁有不錯的爆發力,但是雙離合變速器的邏輯有待提高,並且油耗也會偏高。

勁客的優勢在於成熟可靠的動力總成,採用1.5L自然吸氣發動機+CVT無級變速器的搭配能夠帶來非常平順線性的輸出,油門調校靈敏,能夠很好地應付日常市區內行駛,並且也非常省油,可靠性較高。不過其檔次感與配置水平不如哈弗H2。

綜上,假如你預算充足的話,更加建議購買勁客的中配以上車型,而預算不是很足的話,那麼家用選擇H2是一個非常具有性價比的選擇。

2018款飛度新增了運動套件車型,不過在配置方面還是一如既往的寒酸,比較推薦指導價為8.88萬的1.5L CVT潮跑版,在配置上面擁有主/副駕駛座安全氣囊、運動外觀套件、行車電腦显示屏、前霧燈等,類似比較常用的电子車身穩定系統、駐車雷達要到頂配才配備,但是飛度的動力和空間還是非常不錯的,1.5L自吸發動機就能爆發出131匹馬力,日常市區駕駛毫無壓力,加上本田“MM”理念,讓它的空間能夠滿足大多數人的使用需求,市面上大量的改裝件也能讓每位飛度車主把愛車改成獨一無二的樣子。

以上就是本期網友問答欄目的全部內容,假如你也想上牆的話,點擊下方留言留下你的問題並且點個贊,就有機會在下期欄目看見你的身影!本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

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

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

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

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

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

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

初識Redis的數據類型HyperLogLog

前提

未來一段時間開發的項目或者需求會大量使用到Redis,趁着這段時間業務並不太繁忙,抽點時間預習和複習Redis的相關內容。剛好看到博客下面的UVPV統計,想到了最近看書裏面提到的HyperLogLog數據類型,於是花點時間分析一下它的使用方式和使用場景(暫時不探究HyperLogLog的實現原理)。RedisHyperLogLog數據類型是Redid 2.8.9引入的,使用的時候確保Redis版本>= 2.8.9

HyperLogLog簡介

基數計數(cardinality counting),通常用來統計一個集合中不重複的元素個數。一個很常見的例子就是統計某個文章的UVUnique Visitor,獨立訪客,一般可以理解為客戶端IP)。大數據量背景下,要實現基數計數,多數情況下不會選擇存儲全量的基數集合的元素,因為可以計算出存儲的內存成本,假設一個每個被統計的元素的平均大小為32bit,那麼如果統計一億個數據,佔用的內存大小為:

  • 32 * 100000000 / 8 / 1024 / 1024 ≈ 381M

如果有多個集合,並且允許計算多個集合的合併計數結果,那麼這個操作帶來的複雜度可能是毀滅性的。因此,不會使用BitmapTree或者HashSet等數據結構直接存儲計數元素集合的方式進行計數,而是在不追求絕對準確計數結果的前提之下,使用基數計數的概率算法進行計數,目前常見的有概率算法以下三種:

  • Linear Counting(LC)
  • LogLog Counting(LLC)
  • HyperLogLog Counting(HLL)

所以,HyperLogLog其實是一種基數計數概率算法,並不是Redis特有的,Redis基於C語言實現了HyperLogLog並且提供了相關命令API入口。

Redis的作者Antirez為了紀念Philippe Flajolet對組合數學和基數計算算法分析的研究,所以在設計HyperLogLog命令的時候使用了Philippe Flajolet姓名的英文首字母PF作為前綴。也就是說,Philippe Flajolet博士是HLL算法的重大貢獻者,但是他其實並不是RedisHyperLogLog數據類型的開發者。遺憾的是Philippe Flajolet博士於2011年3月22日因病在巴黎辭世。這個是Philippe Flajolet博士的維基百科照片:

Redis提供的HyperLogLog數據類型的特徵:

  • 基本特徵:使用HyperLogLog Counting(HLL)實現,只做基數計算,不會保存元數據
  • 內存佔用:HyperLogLog每個KEY最多佔用12K的內存空間,可以計算接近2^64個不同元素的基數,它的存儲空間採用稀疏矩陣存儲,空間佔用很小,僅僅在計數基數個數慢慢變大,稀疏矩陣佔用空間漸漸超過了閾值時才會一次性轉變成稠密矩陣,轉變成稠密矩陣之後才會佔用12K的內存空間。
  • 計數誤差範圍:基數計數的結果是一個標準誤差(Standard Error)為0.81%的近似值,當數據量不大的時候,得到的結果也可能是一個準確值。

內存佔用小(每個KEY最高佔用12K)是HyperLogLog的最大優勢,而它存在兩個相對明顯的限制:

  • 計算結果並不是準確值,存在標準誤差,這是由於它本質上是用概率算法導致的。
  • 不保存基數的元數據,這一點對需要使用元數據進行數據分析的場景並不友好。

HyperLogLog命令使用

Redis提供的HyperLogLog數據類型一共有三個命令APIPFADDPFCOUNTPFMERGE

PFADD

PFADD命令參數如下:

PFADD key element [element …]

支持此命令的Redis版本是:>= 2.8.9
時間複雜度:每添加一個元素的複雜度為O(1)

  • 功能:將所有元素參數element添加到鍵為keyHyperLogLog數據結構中。

PFADD命令的執行流程如下:

PFADD命令的使用方式如下:

127.0.0.1:6379> PFADD food apple fish
(integer) 1
127.0.0.1:6379> PFADD food apple
(integer) 0
127.0.0.1:6379> PFADD throwable
(integer) 1
127.0.0.1:6379> SET name doge
OK
127.0.0.1:6379> PFADD name throwable
(error) WRONGTYPE Key is not a valid HyperLogLog string value.

雖然HyperLogLog數據結構本質是一個字符串,但是不能在String類型的KEY使用HyperLogLog的相關命令。

PFCOUNT

PFCOUNT命令參數如下:

PFCOUNT key [key …]

支持此命令的Redis版本是:>= 2.8.9
時間複雜度:返回單個HyperLogLog的基數計數值的複雜度為O(1),平均常數時間比較低。當參數為多個key的時候,複雜度為O(N),N為key的個數。

  • PFCOUNT命令使用單個key的時候,返回儲存在給定鍵的HyperLogLog數據結構的近似基數,如果鍵不存在, 則返回0
  • PFCOUNT命令使用key的時候,返回儲存在給定的所有HyperLogLog數據結構的並集的近似基數,也就是會把所有的HyperLogLog數據結構合併到一個臨時的HyperLogLog數據結構,然後計算出近似基數。

PFCOUNT命令的使用方式如下:

127.0.0.1:6379> PFADD POST:1 ip-1 ip-2
(integer) 1
127.0.0.1:6379> PFADD POST:2 ip-2 ip-3 ip-4
(integer) 1
127.0.0.1:6379> PFCOUNT POST:1
(integer) 2
127.0.0.1:6379> PFCOUNT POST:1 POST:2
(integer) 4
127.0.0.1:6379> PFCOUNT NOT_EXIST_KEY
(integer) 0

PFMERGE

PFMERGE命令參數如下:

PFMERGE destkey sourcekey [sourcekey ...]

支持此命令的Redis版本是:>= 2.8.9
時間複雜度:O(N),其中N為被合併的HyperLogLog數據結構的數量,此命令的常數時間比較高

  • 功能:把多個HyperLogLog數據結構合併為一個新的鍵為destkeyHyperLogLog數據結構,合併后的HyperLogLog的基數接近於所有輸入HyperLogLog的可見集合(Observed Set)的並集的基數。
  • 命令返回值:只會返回字符串OK

PFMERGE命令的使用方式如下

127.0.0.1:6379> PFADD POST:1 ip-1 ip-2
(integer) 1
127.0.0.1:6379> PFADD POST:2 ip-2 ip-3 ip-4
(integer) 1
127.0.0.1:6379> PFMERGE POST:1-2 POST:1 POST:2
OK
127.0.0.1:6379> PFCOUNT POST:1-2
(integer) 4

使用HyperLogLog統計UV的案例

假設現在有個簡單的場景,就是統計博客文章的UV,要求UV的計數不需要準確,也不需要保存客戶端的IP數據。下面就這個場景,使用HyperLogLog做一個簡單的方案和編碼實施。

這個流程可能步驟的先後順序可能會有所調整,但是要做的操作是基本不變的。先簡單假設,文章的內容和統計數據都是後台服務返回的,兩個接口是分開設計。引入Redis的高級客戶端Lettuce依賴:

<dependency>
    <groupId>io.lettuce</groupId>
    <artifactId>lettuce-core</artifactId>
    <version>5.2.1.RELEASE</version>
</dependency>

編碼如下:

public class UvTest {

    private static RedisCommands<String, String> COMMANDS;

    @BeforeClass
    public static void beforeClass() throws Exception {
        // 初始化Redis客戶端
        RedisURI uri = RedisURI.builder().withHost("localhost").withPort(6379).build();
        RedisClient redisClient = RedisClient.create(uri);
        StatefulRedisConnection<String, String> connect = redisClient.connect();
        COMMANDS = connect.sync();
    }

    @Data
    public static class PostDetail {

        private Long id;
        private String content;
    }

    private PostDetail selectPostDetail(Long id) {
        PostDetail detail = new PostDetail();
        detail.setContent("content");
        detail.setId(id);
        return detail;
    }

    private PostDetail getPostDetail(String clientIp, Long postId) {
        PostDetail detail = selectPostDetail(postId);
        String key = "puv:" + postId;
        COMMANDS.pfadd(key, clientIp);
        return detail;
    }

    private Long getPostUv(Long postId) {
        String key = "puv:" + postId;
        return COMMANDS.pfcount(key);
    }

    @Test
    public void testViewPost() throws Exception {
        Long postId = 1L;
        getPostDetail("111.111.111.111", postId);
        getPostDetail("111.111.111.222", postId);
        getPostDetail("111.111.111.333", postId);
        getPostDetail("111.111.111.444", postId);
        System.out.println(String.format("The uv count of post [%d] is %d", postId, getPostUv(postId)));
    }
}

輸出結果:

The uv count of post [1] is 4

可以適當使用更多數量的不同客戶端IP調用getPostDetail(),然後統計一下誤差。

題外話-如何準確地統計UV

如果想要準確統計UV,則需要注意幾個點:

  • 內存或者磁盤容量需要準備充足,因為就目前的基數計數算法來看,沒有任何算法可以在不保存元數據的前提下進行準確計數。
  • 如果需要做用戶行為分析,那麼元數據最終需要持久化,這一點應該依託於大數據體系,在這一方面筆者沒有經驗,所以暫時不多說。

假設在不考慮內存成本的前提下,我們依然可以使用Redis做準確和實時的UV統計,簡單就可以使用Set數據類型,增加UV只需要使用SADD命令,統計UV只需要使用SCARD命令(時間複雜度為O(1),可以放心使用)。舉例:

127.0.0.1:6379> SADD puv:1 ip-1 ip-2
(integer) 2
127.0.0.1:6379> SADD puv:1 ip-3 ip-4
(integer) 2
127.0.0.1:6379> SCARD puv:1
(integer) 4

如果這些統計數據僅僅是用戶端展示,那麼可以採用異步設計:

在體量小的時候,上面的所有應用的功能可以在同一個服務中完成,消息隊列可以用線程池的異步方案替代。

小結

這篇文章只是簡單介紹了HyperLogLog的使用和統計UV的使用場景。總的來說就是:在(1)原始數據量巨大,(2)內存佔用要求盡可能小,(3)允許計數存在一定誤差並且(4)不要求存放元數據的場景下,可以優先考慮使用HyperLogLog進行計數。

參考資料:

  • antirez-Redis new data structure: the HyperLogLog
  • Redis Commands
  • 維基百科

(本文完 c-3-d e-a-20191117)

技術公眾號(《Throwable文摘》),不定期推送筆者原創技術文章(絕不抄襲或者轉載):

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

【其他文章推薦】

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

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

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

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

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

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

容器技術之Docker資源限制

  上一篇我們聊到了docker容器的單機編排工具docker-compose的簡單使用,回顧請參考https://www.cnblogs.com/qiuhom-1874/p/13121678.html;今天我們主要來聊一聊docker容器的資源限制;通常情況下我們啟動一個docker容器,其內存和CPU都是同宿主機一樣大,這意味着該容器和宿主機共享相同大小的內存和CPU資源;這樣一來容器正常情況下沒有什麼問題,假如容器里運行的進程特別愛吃內存,很可能存在把宿主機上的內存全部吃掉,觸發內核OOM,從而導致docker daemon直接被內核殺死;為了避免這樣的尷尬局面,對啟動容器我們有必要對容器的資源進行限制;

  所謂OOM就是當系統上的應用申請內存資源時,發現申請不到內存,這個時候Linux內核就會啟動OOM,內核將給系統上的所有進程進行評分,通過評分得分最高的進程就會被系統第一個幹掉,從而騰出一些內存空間,如果騰出的內存空間還是不夠該應用使用,它會繼續殺得分第二高的,直到應用有足夠的內存使用;一旦發生OOM,任何進程都有可能被殺死,包括docker daemon在內,為此,docker特定調整了docker daemon的oom優先級,以免發生oom被內核殺死,但是容器的oom優先級並未做任何調整;

  那麼對於內存資源來講,在啟動為容器時,我們可以通過一些選項來指定容器的內存相關設置;如下圖

  提示:-m 或 –memory 用來指定容器最大能夠使用的內存大小,默認情況不指定表示共享物理宿主機的內存大小;–memory-swap 用來指定容器的內存和交換內存的總大小;對於這個參數的取值比較詭異;待會在說吧;–memory-swappiness該選項用來指定容器使用交換內存的傾向性,swap啟用有個好處就是在內存不夠使用的情況,它可以臨時頂替一部分,但是性能會急劇下降;所以数字越大越早使用交換內存,数字越小越晚使用交換內存,取值在0-100之間;0不代表不是用交換內存,0表示能不用交換內存,則不用,但是在迫不得已的情況還是會使用的,100表示只要有一絲可以使用交換內存的希望,就使用交換內存;通常情況在運行容器的主機上不建議使用swap設備;swap交換分區如果一旦被激活,系統性能會急劇下降,建議直接禁用;–memory-reservation該選項用來指定給系統保留的內存空間大小;–kernel-memory用來指定給內核保留的內存大小;–oom-kill-disable該選項用於指定當發生oom時,是否禁用因oom而殺死該容器進程;

  提示:通常情況–memory-swap這個選項必須同–memory選項一起使用,不可用單獨使用;

  示例:限制容器使用最大內存為256M

[root@docker_registry ~]# docker run --name test --rm -m 256M lorel/docker-stress-ng --vm 2

  提示:以上命令表示啟動一個名為test的容器,限制該容器最大使用內存大小為256M;lorel/docker-stress-ng這個進行用來壓測容器;–vm表示同時使用多少進程來做壓測;

  驗證:用docker stats看看我們啟動test容器是否只能使用256M內存?

  提示:從上面的結果可以看到,在我們啟動容器時,使用-m指定內存大小的容器limit的值就是我們指定的值,而對於沒有用-m指定的容器,默認就是同宿主機內存大小一樣;

  對於CPU來講,默認情況啟動容器時,不限制CPU的資源,此時容器是共享宿主機的CPU資源,也就是說默認情況宿主機上有幾顆cpu核心,啟動的容器就有多少顆核心;對於CPU這種可壓縮資源,不會像內存那樣,如果CPU滿載,也不會導致某個容器崩潰,原因是因為cpu是可壓縮資源;而不同於內存,內存屬於不可壓縮資源,如果申請不到內存,就會出現異常,出現oom;對啟動容器來限制cpu資源,通常也是使用選項來限定;如下圖

  提示:–cpus用來指定容器能夠使用的最大cpu核心數,例如–cpus=1.5,就表示該容器最大能夠使用1.5核的CPU資源,如果宿主機上有4顆CPU核心,那麼該容器最多可把1.5顆核心跑滿;這樣說吧,如果宿主機上有4顆核心,那麼該容器如果使用–cpus限定為1.5,那麼該容器就只能使用宿主機上的百分之150的核心;–cpu-period 和–cpu-quota該選項在docker1.13以後基本廢棄;–cpuset-cpus該選項用於指定容器能夠在哪些CPU上運行;如果宿主機上有4顆CPU,–cpuset-cpus=2,3就表示該容器只能使用第2號cpu和第3號cpu;–cpu-shares該選項用於指定容器使用cpu的比例;比如宿主機上只有一個容器,而該容器啟動時指定–cpu-shares=1024,則表示,如果沒有其他容器,則它可以使用宿主機上的所有cpu資源,如果有第二個容器啟動時,指定cpu-shares=512,那麼第一個容器會從原來使用整個宿主機的cpu變為使用整個宿主機的cpu的2/3;以此類推,如果有第三個,第四個,他們使用cpu資源都是按照給定的比例動態調整;

  示例:第一個容器使用–cpu-shares=256;第二個容器使用–cpu-shares=512,看看當第一個容器啟動后,看看cpu使用情況,然後第二個容器啟動后再看看cpu使用情況

  提示:可以看到當第一個容器啟動時,雖然設置的cpu-shares=256,但是它還是把所有核心幾乎都跑滿了;我們在跑一個容器看看,看看第二個容器啟動后,第一個容器的cpu使用情況是否有變化?

  提示:從上面的結果看,t1和t2的cpu使用比例大概是1比2;總量還是400%並沒有變化;

  示例:設置容器使用1.5個CPU核心

  提示:從上面的結果可以看到使用–cpus來限定容器使用的CPU資源,默認它會在每顆黑核心上都要使用一部分,但是重量不會超過150%;

  示例:限定容器使用CPU核心,只能在0號和3號核心上使用;

  提示:從上面的結果可以看到,限定t1容器只能使用0號和3號CPU后,1號和2號就基本不會被使用,總量也不會增加;

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

【其他文章推薦】

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

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

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

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

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

小師妹學JVM之:GC的垃圾回收算法

目錄

  • 簡介
  • 對象的生命周期
  • 垃圾回收算法
    • Mark and sweep
    • Concurrent mark sweep (CMS)
    • Serial garbage collection
    • Parallel garbage collection
    • G1 garbage collection
    • Z Garbage Collection
  • 怎麼選擇
  • 總結

簡介

JVM的重要性不言而喻了,如果把java的應用程序比作一輛跑車,那麼JVM就是這輛車的發動機,沒有它,java程序就成了空中樓閣,無根浮萍。而在JVM中有一塊內存區域叫做運行時數據區域,存儲了運行時所需要的所有對象,而Heap Area則是其中最大的一塊。

內存畢竟不是無限的,所以就需要一種機制來將不再使用的對象進行回收,這種機制就是今天我們要講的GC。

更多精彩內容且看:

  • 區塊鏈從入門到放棄系列教程-涵蓋密碼學,超級賬本,以太坊,Libra,比特幣等持續更新
  • Spring Boot 2.X系列教程:七天從無到有掌握Spring Boot-持續更新
  • Spring 5.X系列教程:滿足你對Spring5的一切想象-持續更新
  • java程序員從小工到專家成神之路(2020版)-持續更新中,附詳細文章教程

對象的生命周期

小師妹:F師兄,你相信這個世界有輪迴嗎?

師兄我是一個堅定的無神論者,活在當下就好了,何必操心後面的輪迴呢?

小師妹:F師兄,這個你就不懂了,意識是組成腦的原子群的一種組合模式,我們大腦的物質基礎和一塊石頭沒有什麼不同。當我們掌握大腦的組合方式,然後重構,我們的意識就重現了,這就是輪迴。這可是量子理論中提到的觀念哦。

哇,小師妹什麼時候這麼厲害了,都開始探討這麼高深的話題了。F師兄我實在是跟不上節奏啊。

小師妹,F師兄,我是怕你尷尬,想引出java對象的生命周期這個話題嘛。

量子理論我不熟,java對象我還沒怕過誰。

對象的生命周期其實很簡單:創建,使用中,最後被銷毀。

  1. 創建對象

舉個最簡單的創建對象的例子:

Object obj = new Object();

對象創建的時候,將會為該對象分配特定的空間。

  1. 使用對象

對象創建之後,就可以被其他的對象使用,如果其他的對象有使用該對象,那麼我們成為該對象被引用了。

  1. 對象銷毀

當一個對象沒有被其他對象引用的時候,我們就稱為該對象可以被回收了。在Java中,對象的回收是由GC來負責的。

垃圾回收算法

小師妹:F師兄,我覺得垃圾回收好像挺簡單的,我們為每個對象維持一個指針計數器,每引用一次就加一,這樣不就可以實現垃圾回收器了嗎?

底層原理是這麼一個道理,但是JVM需要一種更加高效的算法來保證垃圾回收的效率,同時也不會影響正在運行的程序。

接下來我們將會介紹一下,在JVM中比較常用幾個垃圾回收算法:

Mark and sweep

Mark and sweep是最最簡單的垃圾回收算法,簡單點講,它可以分為兩個步驟:

  1. 標記live對象

標記live對象聽起來很簡單,就是掃描堆中的對象,看這些對象是否被引入。

但是這裡有一個問題,如果是兩個對象互相引用的時候,而這兩個對象實際上並沒有被外部的對象所引用,那麼這兩個對象其實是應該被回收的。所以我們還需要解決一個關鍵性的問題:從哪裡開始掃描的問題。

JVM定義了一些Root對象,從這些對象開始,找出他們引用的對象,組成一個對象圖。所有在這個圖裡面的對象都是有效的對象,反之不在對象圖中的對象就應該被回收。有效的對象將會被Mark為alive。

這些Root對象包括:正在執行的方法中的本地對象和輸入參數。活動的線程,加載類中的static字段和JNI引用。

注意,這種遍歷其實是有個缺點的,因為為了找到對象圖中哪些對象是live的,必須暫停整個應用程序,讓對象變成靜止狀態,這樣才能構建有效的對象圖。後面我們會介紹更加有效的垃圾回收算法。

  1. 刪除對象

掃描對象之後,我們就可以將未標記的對象刪除了。

刪除有三種方式,第一種方式是正常刪除。但是正常刪除會導致內存碎片的產生。所以第二種方式就是刪除之後進行壓縮,以減少內存碎片。還有一種方式叫做刪除拷貝,也就是說將alive的對象拷貝到新的內存區域,這樣同樣可以解決內存碎片的問題。

Concurrent mark sweep (CMS)

在講CMS之前,我們先講一下垃圾回收器中的Eden,Old和Survivor space幾個大家應該都很熟悉的分代技術。

Young Gen被劃分為1個Eden Space和2個Suvivor Space。當對象剛剛被創建的時候,是放在Eden space。垃圾回收的時候,會掃描Eden Space和一個Suvivor Space。如果在垃圾回收的時候發現Eden Space中的對象仍然有效,則會將其複製到另外一個Suvivor Space。

就這樣不斷的掃描,最後經過多次掃描發現任然有效的對象會被放入Old Gen表示其生命周期比較長,可以減少垃圾回收時間。

之後要將的幾個垃圾回收器,除了ZGC,其他都使用的是分代的技術。

好了,現在繼續講CMS,CMS是mark and swap的升級版本,它使用多個線程來對heap區域進行掃描,從而提升效率。

CMS在Young Generation中使用的是mark-copy,而在Old Generation主要使用的是mark-sweep。

使用CMS的命令很簡單:

-XX:+UseConcMarkSweepGC

上面是列出的一些CMS的調優參數。

Serial garbage collection

Serial garbage collection使用單一的線程來進行垃圾回收操作,其好處就是不需要和其他的線程進行交互。如果你是單核的CPU,那麼最好就是選擇Serial garbage collection,因為你不能充分利用多核的好處。同樣的它也常常用在比較小型的項目中。

Serial garbage collection在Young Generation中使用的是mark-copy,而在Old Generation主要使用的是 mark-sweep-compact。

下面是開啟命令:

-XX:+UseSerialGC

Parallel garbage collection

和serial GC類似,它在Young Generation中使用的是mark-copy,而在Old Generation主要使用的是 mark-sweep-compact。不同的是它是并行的。

可以通過下面的命令來指定併發的線程:

-XX:ParallelGCThreads=N

如果你是多核處理器,那麼Parallel GC可能是你的選擇。

Parallel GC是JDK8中的默認GC。而在JDK9之後, G1是默認的GC。

使用下面的命令來開啟Parallel GC:

-XX:+UseParallelGC

G1 garbage collection

為什麼叫G1呢,G1=Garbage First,它是為替換CMS而生的,最早出現在java7中。

G1將heap區域劃分成為多個更小的區域,每個小區域都被標記成為young generation 或者old generation。從而運行GC在更小的範圍里運行,而不是影響整個heap區域。

可以使用下面的命令來開啟:

-XX:+UseG1GC 

Z Garbage Collection

ZGC是一個可擴展的,低延遲的GC。ZGC是併發的,而且不需要停止正在運行的線程。

使用下面的命令來開啟:

 -XX:+UseZGC 

ZGC是在JDK11中被引入的。

怎麼選擇

小師妹:F師兄,你講了這麼多個GC,到底我該用哪個呢?

高射炮不能用來打蚊子,所以選擇合適的GC才是最終要的。這裏F師兄給你幾個建議:

  1. 如果你的應用程序內存本來就很小,那麼使用serial collector : -XX:+UseSerialGC.

  2. 如果你的程序運行在單核的CPU上,並且也沒有程序暫停時間的限制,那麼還是使用serial collector : -XX:+UseSerialGC.

  3. 如果對峰值期的性能要求比較高,但是對程序暫停時間沒多大的要求,那麼可以使用 parallel collector: -XX:+UseParallelGC。

  4. 如果更加關注響應時間,並且GC的對程序的暫停時間必須要小,那麼可以使用-XX:+UseG1GC。

  5. 如果響應時間非常重要,並且你在使用大容量的heap空間,那麼可以考慮使用ZGC: -XX:UseZGC。

總結

本文介紹了幾種GC的算法,大家可以根據需要選用。

本文作者:flydean程序那些事

本文鏈接:http://www.flydean.com/jvm-gc-algorithms/

本文來源:flydean的博客

歡迎關注我的公眾號:程序那些事,更多精彩等着您!

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

【其他文章推薦】

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

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

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

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

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

※超省錢租車方案

Node.js躬行記(4)——自建前端監控系統

  這套前端監控系統用到的技術棧是:React+MongoDB+Node.js+Koa2。將性能和錯誤量化。因為自己平時喜歡吃菠蘿,所以就取名叫菠蘿系統。其實在很早以前就有這個想法,當時已經實現了前端的參數搜集,只是後台遲遲沒有動手,也就拖着。

  • 目前完成的還只是個雛形,僅僅是搜集了錯誤和相關的性能參數。

  • 後台樣式採用了封裝過的matrix。

  • 分析功能還很薄弱,只是做了簡單的演示,並且各種基礎功能還有待完善。

  • 後面打算強化數據分析,並且還要實現錯誤的回放機制,思路的話以前也調研過,參考之前的一篇文章

  現在的這個系統還只能算是個玩具,後期還需要雕琢雕琢。下面是這套系統的目錄結構。

├── pingapple --------------------------------- 菠蘿監控系統
│   ├── client -------------------------------- 系統的前端部分
│   ├── sdk ----------------------------------- 信息搜集代碼庫
│   ├── server -------------------------------- 系統的後端部分

一、SDK

1)primus.js

  在之前的《前端頁面性能參數搜集》一文中,詳細記載了各類性能指標的計算規則,並整理到了primus.js中。

  本次將在primus.js的基礎上做適當的修改,包括刪除代理、測速、資源信息等功能,改變部分性能指標的計算規則,例如從瀏覽器發起HTTP請求算起,忽略瀏覽器重定向的時間等。

2)錯誤處理

  完善錯誤處理,將錯誤分成三類:runtime、load和Promise。在window的error事件中,處理前兩種錯誤。像img元素載入的圖片地址不存在,就會執行formatLoadError()函數;像變量未定義,就會執行formatRuntimerError()函數。

window.addEventListener("error", function (event) {
    var errorTarget = event.target;
    // 過濾 target 為 window 的異常
    if (
      errorTarget !== window &&
      errorTarget.nodeName &&
      LOAD_ERROR_TYPE[errorTarget.nodeName.toUpperCase()]
    ) {
      handleError(formatLoadError(errorTarget));
    } else {
      handleError(
        formatRuntimerError(
          event.message,
          event.filename,
          event.lineno,
          event.colno,
          event.error
        )
      );
    }
  }, true
);

  將window綁定unhandledrejection事件后,就會在Promise被拒絕且沒有reject的回調函數時觸發。

window.addEventListener(
  "unhandledrejection",
  function (event) {
    // console.log('Unhandled Rejection at:', event.promise, 'reason:', event.reason);
    handleError({
      type: ERROR_PROMISE,
      desc: event.reason,
      stack: "no stack"
    });
  },
  true
);

3)初始化

  由於要計算白屏時間,DOM時間等,所以位置不能隨便放,得要放在head的最後面。

<head>
  <script>
    window.pineapple || (pineapple = {});
    pineapple.param = {
      "token": "dsadasd2323dsad23dsada"
    };
  </script>
  <script src="js/pineapple.js"></script>
</head>

二、服務端

1)Koa

  Koa是由Express原班人馬打造的Web輕量框架,通過組合各種中間件來避免繁瑣的回調函數嵌套,當前使用的版本是V2。

npm install --save koa

  使用的Koa腳手架:koa-generator,創建項目的結構,並且在此基礎上做了調整(目錄如下所示)。暫時還不會用到靜態資源和視圖層。

npm install -g koa-generator
├── server --------------------------------- 服務端
│   ├── bin -------------------------------- 命令
│   ├── config ----------------------------- 配置目錄
│   ├── controllers ------------------------ MVC中的邏輯層
│   ├── db --------------------------------- MVC中的數據層
│   ├── public ----------------------------- 靜態資源
│   ├── routes ----------------------------- 路由
│   ├── utils ------------------------------ 工具庫
│   ├── views ------------------------------ MVC中的視圖層
│   ├── app.js ----------------------------- 入口文件

  為了區分開發環境和生產環境,通過cross-env統一不同系統設置環境變量的方式。

npm install --save cross-env

  package.json中的命令如下,添加了環境配置。

"scripts": {
  "start": "node bin/www",
  "dev": "cross-env NODE_ENV=development ./node_modules/.bin/nodemon bin/www",
  "prd": "cross-env NODE_ENV=production pm2 start bin/www"
}

  prd按字面意思應該是生產環境的命令,其中使用了pm2,默認沒有安裝。還沒部署過Node.js,還不清楚裏面有多少坑。

npm install --save pm2

2)MongoDB

  MongoDB是一個開源的非關係型數據庫(圖1是下載界面),既沒有表、行等概念,也沒有固定的模式和結構,所有的數據以文檔(一個對象)的形式存儲。但其使用方式和關係型數據庫相似,並且還支持對數據建立索引,適用於高併發讀寫、海量數據存儲和實時分析等。

圖1

  注意,在安裝時默認會下載MongoDB Compress(一個可視化的MongoDB工具),默認下載會非常慢,建議自行下載,該工具的界面還是蠻清爽的,如圖2所示。

圖2

  在Mac上配置MongoDB比較麻煩,不像Windows那樣一件安裝,需要一些步驟,廢了點力氣才裝好,下面是執行的命令。

sudo mongod --dbpath=/Users/pw/data

3)Mongoose

  Mongoose是MongoDB的一個ORM(Object-Document Mapper,對象文檔映射)工具,可在Node.js環境中執行,封裝了MongoDB操作文檔的常用方法,包括引入數據庫連接(connect),定義模型(model),聲明文檔結構(scheme),實例化模型等操作數據庫的方法。

npm install --save mongoose

  借鑒了以前PHP數據分層的思想,單獨分離出數據庫的連接,並抽象通用的Model層(如下所示)。

const mongoose = require("./db");
class Mongodb {
  constructor(name, schema) {
    //聲明結構
    const mySchema = new mongoose.Schema(schema, { typeKey: "$type" });
    this.model = mongoose.model(name, mySchema);
  }
  //保存
  save(obj) {
    obj.created = Date.now();         //日期
    const doc = new this.model(obj);
    return new Promise((resolve, reject) => {
      doc.save((err, row) => {
        if (err) {
          reject(err);
          return;
        }
        resolve(row);
      });
    });
  }
}
module.exports = {
  model: Mongodb,
  mongoose
};

4)路由

  由於發送的地址是一張gif圖片,因此在處理路由時,返回本地的一張gif圖,如下所示,圖像地址得是絕對路徑,否則無法讀取。

router.get('/pa.gif', async (ctx, next) => {
  const ctr = new indexController();
  ctr.collect(ctx);
  const url = path.resolve(__dirname, "../public/images/blank.gif");
  ctx.body = fs.readFileSync(url);    //空白gif圖
});

5)代理分析

  在接收參數的時候分析代理所帶的信息,例如瀏覽器、操作系統、設備等。使用的是一個第三方庫:UAParser.js,四年前就關注過,當時GitHub上只有1K多個關注量,現在已經翻了4倍。

npm install --save ua-parser-js

6)假數據

  製作一套合適的假數據,新增命令“npm run data”,初始化數據,便於展示。

三、後台

1)UI

  後台模板採用了之前封裝過的Matrix,但不會依賴Bootstrap框架。

  將整個頁面分成五塊,分別是導航、側邊欄、麵包屑、底部欄以及主體。

  安裝react-router的history,用於路由。

npm install --save history

  期間也會安裝各類依賴包,例如不支持在類中直接聲明屬性等。

  在使用的過程中,ESLint會不時的彈出各種錯誤和警告,期間就不停的修改問題或查找相關配置忽略部分限制。

  後台的側邊欄和麵包屑等部分,會隨着URL的不同而發生狀態變化,本來想用多頁實現,但配置要改很多,就依然做成一個SPA,只是稍微做了些改動。

  組件庫採用了流行的Ant Design,調用了按鈕、單選框、日期等組件。

npm install --save antd

  圖表庫使用的是ECharts,目前只用到了折線圖和餅圖。在引用圖表時,為了優化構建,採取了按需引用的手段。

npm install --save echarts

2)項目管理

  首先建立一個項目,然後才能分析該項目的性能和錯誤,如圖3所示。

圖3

  用彈框的形式來創建項目,使用了Ant Design的Model、Form等組件,如圖4所示。

圖4

3)性能分析

  在第一個折線圖標籤中的過濾條件包括項目、字段、日期等,性能指標按平均值呈現,可看到每個性能指標的趨勢,如圖5所示。

圖5

  按分時日統計性能平均數,在MongoDB中計算。原先創建日期是以時間戳的形式存儲的,為了便於使用Aggregate,改成字符串形式。碰到一個坑,MongoDB中的Date類型採用的是格林尼治時間,而不是當前時區的時間,也就是說存在數據庫中的時間會比當前時間早8小時。

  在第二個列表標籤中,可以詳細看到每條記錄的信息,包括代理、網絡等,便於在了解趨勢的前提下,獲悉更為細節的內容,如圖6所示。

圖6

  點擊ajax那一列,可彈出具體的異步請求信息,如圖7所示。

圖7

4)錯誤分析

  有三個標籤,第一個也是折線圖,描繪的是某個時間的錯誤個數;第二個是錯誤列表,會給出具體的錯誤信息,如圖8所示。

圖8

  第三個是餅圖,餅圖主要體現的是發生錯誤的瀏覽器分佈情況(如圖9所示),點擊某一塊可查看瀏覽器的具體版本(如圖10所示)。

圖9

圖10

 

 

【參考資料】
PerformanceTiming

unhandledrejection 處理沒有顯式捕獲的 Promise 異常

狼書(卷2)

Node-區分環境

Koa從零搭建到Api實現—項目部署

koa如何連接MongoDB

Koa2進階學習筆記

如何計算首屏加載時間 

Mongoose Schema Error: “Cast to string failed for value” when pushing object to empty array

Support for the experimental syntax ‘classProperties’ isn’t currently enabled

Template string failing with Cannot read property ‘range’ of null

Disallow JSX props spreading (react/jsx-props-no-spreading)

TypeError: Cannot read property ‘range’ of null from template-curly-spacing

echarts項目的優化

使用 happypack 提升 Webpack 項目構建速度

mac下的mongoDB的安裝和啟動

安裝MongoDB報錯 mkdir: /data/db: Read-only file system

$sum mongoose

 

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

【其他文章推薦】

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

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

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

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

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

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

python工業互聯網應用實戰2—從需求開始

前言:隨着國家工業2025戰略的推進,工業互聯網發展將會提速,將迎來一個新的發展時期,越來越多的企業開始逐步的把產線自動化,去年年底投產的小米亦庄的智能工廠就是一個熱議的新聞。小米/華為智能工廠只能說是中國製造2025的一個代表,產業轉型和製造升級,筆者從事的企業領域就越到越來越多的(製造)企業開始悄悄的自動化/智能化。這裏肯定有國家政策推動的大背景,同時,也有着企業自身不斷提高生產率的“剛需”。

  本序列我們也從一個需求問題開始;然後,拆解需求(問題);其次,解決拆解需求(問題)的點;再次,通過的不斷技術摸索和迭代過程找到一個個合理的解決需求的方法和手段,最終,完成了這個需求(問題)的項目實戰。我們會在文中描述演化過程、方法論、過程保證機制和實用的工具等,最終帶着大家完成這樣一個實際項目需求的項目過程項目涉及的Django的多基礎知識請大家閱讀筆者早期的《Python開發入門與實戰系列》。

  本文的過程採用python3.6和django2.1版本

項目需求:這是一個簡版物流自動化倉庫實例,倉庫控制系統(以下簡稱WCS)需要調度AGV小車運送一個實托盤(搬運單元)從1樓入庫站台經由提升機搬運到2樓指定的倉庫貨位。 

1.需求分析

  倉庫控制系統(以下簡稱WCS)需要調度AGV小車運送一個實托盤(搬運單元)從1樓入庫站台經由提升機搬運到2樓指定的倉庫貨位。這句簡要描述常常是我們在項目URS看到的需求描述,接下來我們需要對拿到的需求進行分析,形成一個個可度量的開發功能點。

1.1.用例說明

  需求用例說明文檔能夠很好的對需求進行詳細的分析,主要的包含內容包括:前置條件、事件流程和後置條件(執行結果)用例描述如下錶,通過用例分析我們能夠很好的把握需求的具體事件執行流程,並通過文檔清晰的描述出來,便於後期設計編碼時作為開發設計人員的指導。

  經過團隊頭腦風暴討論,大家基本上達成了如下錶的需求用例說明,我們把這個調度設備的搬運過程設計成一個序列順序執行的步驟(子任務),這些子任務對應着設備的執行分解動作。

用例編碼

1.1

執行角色

WCS

用例名稱

托盤入庫用例

前提條件

  1. WMS已完成任務貨位的分配,任務核心信息:托盤條碼、源地址、目標地址;
  2. AGV不能跨樓層作業,1樓與2樓分別是不同的AGV小車執行任務;

需求描述

1 WCS分解搬運任務成3個設備作業

2 調度AGV入庫站台搬運托盤到提升機1樓門口工位;

3 調度提升機到1樓並打開廊門

4 調度AGV提升機1樓門口工位到提升機並卸貨,返回提升機門口工位;

5 調度提升機1樓提升到2樓並開門;

6 調度AGV進入提升機並載貨搬運到2樓門口工位;

7 調度提升機關門;

8 調度AGV從2樓門口工位搬運到庫存貨位。

備選過程

 

擴展過程

 

 

原始需求描述

參見 《XXX URS》

特殊需求

後置條件

WCS調度相關設備完成實托盤從入庫站台搬運到庫存貨位,反饋結果給WMS 

2. 需求功能點

  從上面的用例說明的需求描述事件流程來看,我們需要先把這一趟搬運任務分解成設備子任務,並串行的方式順序下達到設備執行,任務清單如下錶:

序號

作業描述

執行設備

1

調度AGV入庫站台搬運托盤到提升機1樓門口工位

1AGV

2

調度提升機到1樓並打開門

提升機

3

調度AGV提升機1樓門口工位到提升機並卸貨,返回提升機門口工位

1AGV

4

調度提升機1樓提升到2樓並開門

提升機

5

調度AGV進入提升機並載貨搬運到2樓門口工位

2AGV

6

調度提升機關門

提升機

7

調度AGV從2樓門口工位搬運到庫存貨位

2AGV

  也就是說這一趟搬運任務,WCS需要分解成7個設備作業子任務,並順序下達給相應的執行設備執行,最終完成任務的執行(當前的任務劃分粒度實際對接AGV和提升機廠家來說會有調整,最終以上步驟會依賴與實際對接的情況,但是主流程不會有太大變化)。 

   經過分析從1樓入庫站台運送托盤到二樓某個指定貨位這樣一個任務,系統需要分解成7個子任務,下達給設備順序執行。系統活動圖如下:

3. 活動圖

  經過分析從1樓入庫站台運送托盤到2樓某個指定貨位這樣一個任務,系統需要分解成7個子任務,下達給設備順序執行。我們還可以通過UML活動圖來進一步詳細的描述作業的執行順序如下圖: 

    從圖中我們可以看出來一次入庫任務,系統分解為7個設備子任務(作業)來執行完整的托盤入庫流程,只有所有子任務(作業)執行完成,托盤的入庫才算完成。

 4. 功能模塊

  對於這樣一個看似簡單的需求來說,包含兩大主要功能模塊

    1. 任務分解:依據物理設備處理任務的條件,對任務進行分解,任務分解的粒度是設備能夠識別並執行(動作)
    2. 任務調度:任務調度就是按照順序執行的邏輯,把任務順序和逐一下達給設備 

  這裏也有幾個基本邏輯就是,設備在某一個時間點上只能執行一個子任務,只有這個任務執行完畢後方能下達新的子任務。多重任務邏輯只會導致設備無法完成任務(不知道到底該執行那個動作)。

 4.1. 實體關係

  我們從上面需求分析整理當前至少包括2個實體,包含的屬性(字段)如下: 

1任務

任務ID,任務號,源地址(從哪兒),目標地址(到哪兒),開始時間,結束時間,狀態 

2子任務:

子任務ID,任務ID,源地址(從哪兒 上一個子任務的目標地址), 目標地址(到哪兒 下一個子任務的源地址), 執行機構,開始時間,結束時間,狀態

5. 小節

  本章我們從一個需求問題開始,然後經過需求分析,把需求問題分解為功能點和數據實體,實體是下一步我們設計表或ORM model的基礎原型,上面的實體只是一個初步的需求分析主要字段要求,實體屬性(字段)會設計時會增加特定的其它屬性(字段)。 下一章節我們將描繪如何把這個需求逐步演化到模型設計。

 

 

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

【其他文章推薦】

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

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

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

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

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

GitHub 熱點速覽 Vol.24:程序員自我增值,優雅賺零花錢

摘要:升職加薪,出任 CTO,迎娶白富美/高帥富,走向人生巔峰是很多人的夢想。在本期的熱點速覽中你將了解自由作者 Easy 如何優雅賺取零花錢的方法,以及定投改變命運 —— 讓時間陪你慢慢變富。說到程序員自我增值,除了優雅賺錢之外,還可以研究下各種生活中小工具的代碼實現,例如,收錄 20+ Web 小應用的 vanillawebprojects。將技術應用在生活中點滴,展現你的技術輔助日常“肝”口袋妖精,或者偶爾用技術給自己生活添加點小樂趣,用遺傳算法製作一個繪製圖像過程的小玩具。

以下內容摘錄自微博@HelloGitHub 的 GitHub Trending,選項標準:新發布 | 實用 | 有趣,根據項目 release 時間分類,發布時間不超過 7 day 的項目會標註 New,無該標誌則說明項目 release 超過一周。由於本文篇幅有限,還有部分項目未能在本文展示,望周知

  • 本文目錄
      1. 本周特推
      • 1.1 遺傳算法玩具:genetic-drawing
      • 1.2 馬斯克火箭:SpaceX-API
      1. GitHub Trending 周榜
      • 2.1 Go 語法書:go-ast-book
      • 2.2 數據庫好搭檔:xgenecloud
      • 2.3 前端小玩意:vanillawebprojects
      • 2.4 統計代碼:lihang-code
      • 2.5 Poke 輔助工具:Pokedex
      • 2.6 高性能框架:Fastapi
      • 2.7 JS 面經:javascript-questions
      1. 本周 GitHub Trending #程序員增值# 主題的主力軍
      • 3.1 優雅賺錢:howto-make-more-money
      • 3.2 定投改變命運:regular-investing-in-box
      • 3.3 機器學習課程個人筆記:Coursera-ML-AndrewNg-Notes
      1. 推薦閱讀

1. 本周特推

1.1 遺傳算法玩具:genetic-drawing

本周 star 增長數:1200+

Newgenetic-drawing 作者在 2017 年做的模仿給定目標圖像的繪製過程的玩具項目,效果見下圖。項目受到互聯網上許多基因繪製示例的啟發,由於項目深受歡迎,作者便在近日將其開源。

GitHub 地址→https://github.com/anopara/genetic-drawing

1.2 馬斯克火箭:SpaceX-API

本周 star 增長數:900+

SpaceX-API 是一個用於火箭、核心艙、太空艙、發射台和發射數據的開源 REST API。技術棧

  • 部署在美國中部 Linode 服務器上
  • 使用了 Nodejs 的 Koa 框架
  • 使用了 Redis、Nginx 和 Cloudflare 進行內容緩存
  • 使用了 Jest 和 Supertest 做測試
  • 使用了 Circle CI 進行持續集成/部署
  • 所有的數據存儲在 MongoDB Atlas 3 節點的副本集集群中
  • 使用 mongodump 在晚上進行數據備份

GitHub 地址→https://github.com/r-spacex/SpaceX-API

2. GitHub Trending 周榜

2.1 Go 語法書:go-ast-book

本周 star 增長數:1000+

go-ast-book 是一個 Go 語法樹入門項目。讓我們語法樹這個維度重新審視 Go 語言程序,我們將得到創建Go語言本身的技術。本書簡單介紹語法樹相關包的使用。

GitHub 地址→https://github.com/chai2010/go-ast-book

2.2 數據庫好搭檔:xgenecloud

本周 star 增長數:800+

New xgenecloud 是一個能即時生成任何數據庫上的 REST 和 GraphQL API 工具,它支持 MySQL、PostgreSQL、MsSQL、SQLite、MariaDB。特性:

  • 為現有數據庫生成 REST API
  • 提供用於調試的 GUI
  • 生成的 API 均可基於 Serverless 部署在任意雲平台

GitHub 地址→https://github.com/xgenecloud/xgenecloud

2.3 前端小玩意:vanillawebprojects

本周 star 增長數:1100+

vanillawebprojects 收錄了用前端技術(Javascript、CSS、HTML5)開發的 20+ 款小應用,包括:表單驗證、匯率計算、打字遊戲、語音閱讀、新年倒計時等等。

GitHub 地址→https://github.com/bradtraversy/vanillawebprojects

2.4 統計代碼:lihang-code

本周 star 增長數:10900+

《統計學習方法》可以說是機器學習的入門寶典,許多機器學習培訓班、互聯網企業的面試、筆試題目,很多都參考這本書。本項目收錄了該書的所有代碼實現,特別是監督學習方法,包括感知機、k 近鄰法、樸素貝恭弘=叶 恭弘斯法、決策樹、邏輯斯諦回歸與支持向量機、提升方法、em 算法、隱馬爾可夫模型和條件隨機場等。

GitHub 地址→https://github.com/fengdu78/lihang-code

2.5 Poke 輔助工具:Pokedex

本周 star 增長數:500+

NewPokedex 使用基於 MVVM 架構的 Dagger Hilt、Motion、Coroutines、Jetpack 開發的 Poke(口袋妖精)輔助工具。這個項目專註實現依賴注入的新庫,支持從網絡獲取數據,並通過存儲庫模式集成數據庫中的持久化數據。

GitHub 地址→https://github.com/skydoves/Pokedex

2.6 高性能框架:Fastapi

本周 star 增長數:1300+

Fastapi 是一個基於 python 的框架,該框架鼓勵使用 Pydantic 和 OpenAPI 進行文檔編製,使用 Docker 進行快速開發和部署以及基於 Starlette 框架進行的簡單測試。特性:

  • 高性能
  • 快速編寫代碼:將功能開發的速度提高大約 200% 至 300%
  • 錯誤更少:減少約40%的人為錯誤(開發人員)
  • 直觀:強大的編輯器支持。完成無處不在。調試時間更少
  • 簡易:旨在易於使用和學習。減少閱讀文檔的時間
  • 短:最小化代碼重複。每個參數聲明中的多個功能,更少的錯誤
  • 健壯:獲取可用於生產的代碼,具有自動交互式文檔。
  • 基於標準:基於(並完全兼容)API的開放標準

GitHub 地址→https://github.com/tiangolo/fastapi

2.7 JS 面經:javascript-questions

本周 star 增長數:800+

從基礎到高級,JavaScript Questions 收錄了 JS 相關的面試題及解法。

GitHub 地址→https://github.com/lydiahallie/javascript-questions

3. 本周 GitHub Trending #程序員增值#主題的主力軍

在本期主題模塊,小魚乾這裏選取了 3 個和增值相關的小工具,希望能提高你生活、工作的幸福值。

3.1 優雅賺錢:howto-make-more-money

howto-make-more-money 是一個程序員@Easy 現身講述優雅的掙零花錢的項目,雖然是一個教你如何賺零花錢的項目,但是通過閱讀本賺零花錢小書你可理清自己的核心資源,以及如何創造資產。

GitHub 地址→https://github.com/easychen/howto-make-more-money

3.2 定投改變命運:regular-investing-in-box

定投改變命運 —— 讓時間陪你慢慢變富。regular-investing-in-box 這本書要講的是普通人擺脫階層固化的路徑 —— 絕對可行,毫無水分,並且全靠你自己。這裏所說的普通人,不分國界、不分地域、不分種族、不分性別、不分年齡、不分高矮胖瘦美醜、不分何種性取向…… 關鍵在於,甚至壓根不分智商和學歷!換言之,這個解決方案,甚至對在北京跑腿送外賣的小哥都適用……

GitHub 地址→https://github.com/xiaolai/regular-investing-in-box

3.3 機器學習課程個人筆記:Coursera-ML-AndrewNg-Notes

Coursera-ML-AndrewNg-Notes 是吳恩達老師的機器學習課程個人筆記,旨在提供了一個廣泛的介紹機器學習、數據挖掘、統計模式識別的課程。主題包括:

  • 監督學習(參數/非參數算法,支持向量機,核函數,神經網絡)。
  • 無監督學習(聚類,降維,推薦系統,深入學習推薦)。
  • 在機器學習的最佳實踐(偏差/方差理論;在機器學習和人工智能創新過程)。

項目還將使用大量的案例研究,你可學習到如何運用學習算法構建智能機器人(感知,控制),文本的理解(Web 搜索,反垃圾郵件),計算機視覺,醫療信息,音頻,數據挖掘,和其他領域。

GitHub 地址→https://github.com/fengdu78/Coursera-ML-AndrewNg-Notes

推薦閱讀

  • GitHub 熱點速覽 Vol.23:前後端最佳實踐
  • GitHub 熱點速覽 Vol.22:如何打造超級技術棧
  • GitHub 熱點速覽 Vol.21:Go 新手起手式,學就完事兒了

以上為 2020 年第 23 個工作周的 GitHub Trending 如果你 Pick 其他好玩、實用的 GitHub 項目,記得來 HelloGitHub issue 區和我們分享下喲

HelloGitHub 交流群現已全面開放,添加微信號:HelloGitHub 為好友入群,可同前端、Java、Go 等各界大佬談笑風生、切磋技術~

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

【其他文章推薦】

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

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

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

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

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

升溫不超過2°C的變數 全球農業氮肥「一氧化二氮預算」首出爐

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

Carbon Brief報導,根據全球碳計畫(Global Carbon Project)的研究,全世界用於生產糧食的氮肥,可能會使全球升溫2°C以內的氣候目標更難達成。

全世界用於生產糧食的氮肥,可能會使全球升溫2°C以內的氣候目標更難達成。照片來源:StateofIsrael(CC BY 2.0)

40年來人為的一氧化二氮排放增加了30%

全球碳計畫探討一氧化二氮(N2O)排放如何加劇氣候變遷,進行首次的全面性評估。研究結果發現,過去40年間,人類產生的一氧化二氮排放增加了30%,主要原因是農業使用。

肉類和奶製品需求成長也是重要推手,因為牲畜糞便會導致一氧化二氮排放,而且氮肥通常也用於生產動物飼料。

其中人類產生的一氧化二氮排放量成長極快的國家包括巴西、中國和印度。

一氧化二氮排放趨勢與氣候目標 兩者途徑不相容

一氧化二氮是能夠長期存在大氣中的溫室氣體,就100年為期來看,能耐是二氧化碳的300倍,僅次於二氧化碳和甲烷,是氣候變遷的第三大貢獻者。

氣體透過各種自然過程釋放到大氣中,包括土壤和海洋中微生物的活動。有些自然過程,包括平流層和對流層中的化學反應,則會減少一氧化二氮排放。

但是,人類活動也會導致一氧化二氮進入大氣。人類產生的一氧化二氮排放主要來自農業,化石燃料業和生質燃燒也會產生,但影響較小。

新研究探討2007至2016年所有排放一氧化二氮排放的方式,包括人類活動和自然過程,以計算出全球首個「一氧化二氮預算」。

奧本大學國際氣候與全球變遷研究中心主任田漢勤教授說,研究結果顯示,除非採取行動去抑制,否則人為一氧化二氮排放可能影響巴黎協定全球暖化遠低於2°C的目標。「研究結果最令人驚訝的發現是,當前一氧化二氮排放趨勢與實現巴黎協定氣候目標的可能途徑不相容。」

人為一氧化二氮排放 大部分來自農業中的氮肥

2007至2016年間,全球一氧化二氮排放量平均每年淨增加430萬噸,包括自然和人為來源產生的排放。

同一時間,人為一氧化二氮排放量成長30%,上升到每年730萬噸,其中一半以上來自提高農業產量的氮肥。

根據2019年政府間氣候變遷專門委員會(IPCC)發表的氣候變遷和土地報告,自1961年以來,全球農業肥料的使用量增加了9倍。

此外,肉類和奶製品需求不斷成長也是農業排放量增加的原因。「肉類和奶製品需求持續成長、牧場草地擴張,全球牲畜糞便生產和管理相關的一氧化二氮排放量也隨之大增。」

研究顯示,自1980年代以來,農業一氧化二氮排放量在東亞和南亞、南美和非洲的成長最快。同時,北美的農業一氧化二氮排放一直維持高水準,而歐洲的農業一氧化二氮排放則有小幅下降。

一氧化二氮排放量與氣候變遷可能情境比較

科學家也將目前一氧化二氮排放量與未來兩種氣候變遷可能情境中的排放量做比較,分別是「代表性濃度途徑(RCPs)」和「共享社會經濟途徑(SSPs)」。

下圖A顯示了全球一氧化二氮排放量與RCPs預測排放量相比。圖C是全球一氧化二氮濃度與RCPs預測濃度的比較。(在RCP2.6的假設情境下,全世界成功將全球暖化限制在2°C以下,RCP8.5則是排放量非常高的假設情境,在這個情境下,本世紀末溫度可能升高約4.3°C或更多。)

圖B顯示全球一氧化二氮排放量與SSPs的預測排放量的比較,而圖D顯示全球一氧化二氮濃度與SSPs的預測濃度的比較。(SSP3是各國在氣候行動上幾乎沒有合作的假設情境,SSP1是世界一同聚焦實現氣候目標的假設情境。)

圖上黑線是平均一氧化二氮排放量,藍色虛線是「自下而上」(bottom-up)估算值,以國家資料為基礎,黃色虛線是「自上而下」(top-down)估算值,以全球模型和衛星資料為基礎。

歷年與預測的一氧化二氮(N2O)排放(A,B)和濃度(C,D)趨勢圖。圖片來源:
Tian et al. (2020)

結果,目前一氧化二氮排放與高排放情境(RCP8.5)相符,並高過所有的SSPs情境。

研究作者、澳洲聯邦科學與工業研究組織(CSIRO)氣候研究中心首席科學家、全球碳計畫執行董事康納戴爾(Pep Canadell)博士說,這表示要將全球暖化限制在2°C以下,未來的幾十年需要迅速減少一氧化二氮排放。

「要種出能養活我們的大量糧食,全球糧食系統免不了會排放一些一氧化二氮,但是我們必須大幅提高使用效率來減少排放。」康納戴爾博士說。

未參與研究的阿伯丁大學植物和土壤科學系主任史密斯(Pete Smith)教授說,這表示全世界需要改變飲食習慣因應氣候變遷。 「我們必須找到更有效率的糧食生產方法,同時降低氮的用量和每單位產品的排放量。 我們還必須重新設計糧食體系,使其減少依賴肉類和奶製品等效率低下的糧食供應鏈,並顯著減少糧食浪費,在地球可負荷範圍內養活我們所有人。」

Nitrogen fertiliser use could ‘threaten global climate goals’ by DAISY DUNNE

The world’s use of nitrogen fertilisers for food production could threaten efforts to keep global warming below 2C above pre-industrial levels.

That is according to the Global Carbon Project’s first comprehensive assessment of how nitrous oxide (N2O) emissions are contributing to climate change.

Published in Nature, the results show that human-caused N2O emissions have increased by 30% over the past four decades – with the use of nitrogen fertilisers in agriculture playing a major role in the uptick.

A growing demand for meat and dairy products has also contributed to the surge. This is because livestock manure causes N2O emissions and nitrogen fertilisers are often used in the production of animal feed, the scientists say.

The countries with the fastest growing human-caused N2O emissions include Brazil, China and India, the research adds.

Potent pollutant

N2O is a long-lived greenhouse gas that is almost 300 times more potent than CO2 over a 100-year period. It is the third-largest contributor to climate change after CO2 and methane.

The gas is released into the atmosphere by various natural processes, including through the activity of microbes in soils and oceans. Other natural processes, including chemical reactions in the stratosphere and troposphere, cause a reduction in N2O emissions.

However, human activities can also cause N2O to be released into the atmosphere. Human-caused N2O emissions chiefly come from agriculture, with the fossil-fuel industry and biomass burning also contributing to a lesser degree.

The new assessment considered all the ways in which human activities and natural processes contributed to N2O emissions from 2007-16 in order to produce the first global “N2O budget”.

The findings show that, unless curbed, human-caused N2O emissions could threaten the Paris Agreement’s target of keeping global warming “well below” 2C, says lead author Prof Hanqin Tian, director of the International Center for Climate and Global Change Research at Auburn University in Alabama. He tells Carbon Brief:

“The most surprising result of the study was the finding that current trends in N2O emissions are not compatible with pathways consistent to achieve the climate goals of the Paris Agreement.”

First budget

The infographic below, which was produced by the Global Carbon project, summarises the findings. On the infographic, orange arrows show human-caused N2O emissions while green arrows show natural N2O emissions. A blue arrow indicates the reduction in N2O emissions provided by chemical reactions in the upper atmosphere (“atmospheric chemical sink”).

The infographic shows that global N2O emissions increased by a net 4.3m tonnes a year, on average, from 2007-16. This figure includes N2O emissions from both natural and human-caused sources.

In that time, human-caused N2O emissions rose to 7.3m tonnes per year. This is 30% higher than four decades ago, the study says.

More than half of human-caused N2O emissions come from agriculture. The main driver of these emissions are nitrogen fertilisers, which are routinely sprayed overfood crops in order to boost yields.

Fertiliser application on crops has increased nine-fold worldwide since 1961, according to a recent landmark report on land and climate change from the Intergovernmental Panel on Climate Change (IPCC) released in 2019.

However, a growing demand for meat and dairy products is also a driver of increasing agricultural emissions, the researchers say in their paper:

“Growing demand for meat and dairy products has substantially increased global N2O emissions from livestock manure production and management associated with the expansion of pastures and grazing land.”

The assessment shows that, since the 1980s, agricultural N2O emissions have been rising the fastest in East and South Asia, South America and Africa.

Meanwhile, agricultural N2O emissions in North America have stayed consistently high, while Europe has seen a small dip in its agricultural N2O emissions.
Outpaced

As part of their analysis, the scientists explored how current N2O emissions compare with those from the scenarios used to make future projections about climate change.

These include the “Representative Concentration Pathways” (RCPs) and the “Shared Socioeconomic Pathways” (SSPs). 

Chart A below shows how global N2O emissions compare with projected emissions from the RCPs. Chart C, meanwhile, shows how global concentrations of N2O compare to projected concentrations from the RCPs.

(RCP2.6 is a scenario where the world successfully limits global warming to below 2C, whereas RCP8.5 is a scenario of very high emissions, where temperatures could rise by around 4.3C or more by the end of the century.)

Chart B shows how global N2O emissions compare with projected emissions from the SSPs, while chart D shows how global concentrations of N2O compare to projected concentrations from the SSPs.

(SSP3 is a scenario where countries do little to cooperate on climate action, whereas SSP1 is a scenario where the world shifts its focus to meeting climate targets.)

On the charts, the black line shows average N2O emissions, whereas the blue line shows “bottom-up” estimates and the yellow line shows “top-down” estimates. (Bottom-up estimates are based on country inventory data, whereas top-up estimates are obtained from global models and satellite data.)

in order to limit global warming to below 2C, N2O emissions will need to be rapidly reduced in the coming decades, explains study author Dr Pep Canadell, chief research scientist at the Commonwealth Scientific and Industrial Research Organisation (CSIRO) Climate Research Centre in Australia and executive director of the Global Carbon Project. He tells Carbon Brief:

“The global food system will always leak some N2O given there are no alternatives to nitrogen fertiliser for growing so much of the food we eat. However, we must become much more efficient in the way we use it, which will lead to significant emission reductions.”

The findings reinforce the message that the world needs to change its eating habits in order to tackle climate change, says Prof Pete Smith, chair of plant and soil science at the University of Aberdeen, who was not involved in the research. He tells Carbon Brief:

“The study underlines that we must find more efficient ways of producing food, with lower nitrogen inputs and emissions per unit of product. But also, we must redesign our current food system so that it can feed us all within ‘planetary boundaries’ by reducing reliance on inefficient supply chains such as meat and dairy and by dramatically reducing food waste.”

※ 全文及圖片詳見:Carbon BriefCC BY-NC-ND 4.0

參考資料

氮肥
一氧化二氮
溫室氣體
升溫
動物飼料
農林漁牧業
國際新聞
氣候變遷

作者

姜唯

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

林大利

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

延伸閱讀

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

【其他文章推薦】

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

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

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

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

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

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

極端天氣自然災害激增 專家籲強化預警和減災

摘錄自2020年10月13日中央社報導

專家今(13日)呼籲,隨著極端天氣與自然災害激增,世人應投注更多心力預測災害,同時儘早行動減輕災害的衝擊。

法新社報導,今天是國際減少災害風險日(International Day for Disaster Risk Reduction),10多個聯合國(UN)單位和金融機構藉最新報告釋出訊息,呼籲人們「(別問)未來天氣如何,該問的是天氣會造成什麼影響」,因為現實情況證明天氣愈來愈具毀滅力。

這份世界氣象組織(WMO)協調做成的報告表示,尤其近幾十年來,氣候變遷已推升這類災害的發生頻率、強度和嚴重性。

報告指出,2018年的風暴、旱澇與野火,曾使1億800萬人尋求國際人道體系協助。報告預估到2030年前,這個人數可能增加約5成。

氣候變遷
國際新聞
極端天氣
自然災害
減災

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

【其他文章推薦】

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

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

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

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

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

反聖嬰現象形成 WMO:2020卻仍是最暖年份之一

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

世界氣象組織(WMO)29日表示,今年太平洋已形成「中等到強」的反聖嬰現象(La Niña),盡管有降溫效應,但在氣候變遷推動下,全球氣溫仍將高於平常。

綜合外媒報導,WMO表示,反聖嬰現象「已經形成,預計將持續到明年,影響世界許多地區的溫度、降水和風暴型式」。該組織表示,這也可能導致今年異常活躍的颶風季節。今年的反聖嬰現象的強度預計為「中等到強」。根據該組織說法,最近一個短暫且較弱的反聖嬰現象發生於2017年11月到2018年4月,而上一次發生強度反聖嬰現象是2010到2011年。

WMO秘書長塔拉斯(Petteri Taalas)指出,反聖嬰現象通常會對全球溫度產生冷卻作用,但現在出現反聖嬰現象的年份甚至比過去出現聖嬰現象的年份更暖。因其大幅被溫室氣體散發到大氣中的熱量所抵銷。塔拉斯說,「因此,2020年仍將是有紀錄以來最溫暖的年份之一,2016至2020年將是有紀錄以來最溫暖的5年」。

氣候變遷
國際新聞
太平洋
聯合國
反聖嬰
全球暖化

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

【其他文章推薦】

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

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

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

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

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

※超省錢租車方案