標籤: 網頁設計公司

  • 【溫故知新】 編程原則和方法論

    寫了這麼多年代碼,依舊做不好一個項目

    做好一個項目是人力、產品、業務、技術、運營的結合,可能還疊加一點時機的因素,就我們碼農而言,工作就是搬磚,實現產品, 給業務提供支撐。
    “給祖傳代碼加 BUG 修 BUG”,“拿起鍵盤一把梭”這些戲謔程序員的話,聽多了真的會讓程序員麻木,彷彿大家都是這麼乾的。
    從業多年,堆過 shi 山,接手過祖傳代碼, 已經不能沉下氣去查看、調試 shi 山代碼, 說實話,很累。
    本人一直推崇寫流暢、自然、可自解釋的代碼,讓優雅成為一種習慣, 給自己留個念想、給後人留個好評。

    溫故而知新,聊一聊現代編程幾大常見的編程原則

    普世原則
    KISS (Keep It Simple Stupid) 保持系統結構簡單可信賴
    YAGNI (you aren’t gonna need it) 當前確實需要,再去做
    Do The Simplest Things That Could Possibly Work 思考最簡單可行的辦法
    Separation of Concerns 關注點分離
    Keep Things DRY 保持代碼結構清爽 Don’t repeat yourself
    Code For The Maintainer 站在維護者角度寫代碼
    Avoid Premature Optimization 避免提前優化
    Boy-Scout Rule 清掃戰場:清理口水話註釋、無效代碼
    模塊(類)間
    Minimise Coupling 低耦合
    Law of Demeter Don’t talk to strangers,對象方法只接觸該接觸的對象、字段、入參
    Composition Over Inheritance 組合而不是繼承
    Orthogonality 正相關,概念上不相關的事物不應在系統中強行相關
    Robustness Principle 代碼健壯性
    Inversion of Control 控制反轉
    模塊(類)
    Maximise Cohesion 高內聚
    Likov Substitution Principle 里斯替代原則:將程序中對象替換到子類型實例,不會報錯。
    Open/Closed Principle 設計的實體對擴展開放,對修改關閉
    Single Responsiblity Principle 單一責任原則
    Hide Implementation Details 隱藏實施細節
    Curly’s Law 柯里定律:為確定目標編寫特定代碼
    Encapsulate What Changes 封裝變化
    Interface Segregation Principle 接口隔離原則
    Command Query Separation 命令查詢分離

    KISS
    大多數系統保持簡單,會運行的很好。

    • 更少的代碼消耗更好的時間,產生更少的 bug,並且容易修改
    • 複雜業務都是由簡單代碼堆砌而成
    • 完美並不是“沒有什麼東西可以再加”,而是“沒有什麼東西可以被去掉”

    YAGNI
    YAGNI 代表“you aren’t gonna need it.”,不要自以為是的提前實現某些邊角,直到真正需要的時候,再來做。

    • 提前做明天才需要做的工作,意味着當前迭代中需要花費更多精力
    • 導致代碼膨脹,軟件變得臃腫且複雜

    Separation of Concerns
    關注點分離是一種將計算機程序分為不同部分的設計原則,這樣每個部分都可以解決一個單獨的關注點。例如應用程序的業務邏輯是一個問題,而用戶界面是另外一個問題,更改用戶界面不應要求更改業務邏輯,反之亦然。

    • 簡化應用程序的開發和維護
    • 如果關注點分離得很好,則各個部分可以重複使用,也可以獨立開發和更新。

    Interface Segregation Principle
    接口隔離,將胖接口修改為多個小接口,調用接口的代碼應該比實現接口的代碼更依賴於接口。
    why:
    如果一個類實現了胖接口的所有方法(部分方法在某次調用時並不需要),那麼在該次調用時我們就會發現此時出現了(部分並不需要的方法),而並沒有機制告訴我們我們現在不應該使用這部分方法。
    how: 避免胖接口,類永遠不必實現違反單一職責原則的接口。可以根據實際多職責劃分為多接口,類實現多接口后, 在調用時以特定接口指代對象,這樣這個對象只能體現特定接口的方法,以此體現接口隔離。

       public interface IA
        {
            void getA();
        }
    
        interface IB
        {
            void getB();
        }
    
        public class Test : IA, IB
        {
            public string Field { get; set; }
            public void getA()
            {
                throw new NotImplementedException();
            }
    
            public void getB()
            {
                throw new NotImplementedException();
            }
        }
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("Hello World!");
    
                IA a = new Test();
                a.getA();       //  在這個調用處只能看到接口IA的方法, 接口隔離
            }
        }
    

    Command Query Separation
    命令查詢分離: 操作方法就只寫操作邏輯,查詢方法就只寫查詢邏輯,並以明顯的方法名區分自己的動作。
    有了這個原則,程序員可以更加自信地進行編碼:由於查詢方法不會改變狀態,因此可以在任何地方以任何順序使用,使用操作方法時,也心中有數。

    End

    懂得這麼多道理,卻依舊過不好這一生。前人總結的編程原則和方法論需要在實踐中感悟,束之高閣,則始終不能體會編程的魅力和快感

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

    【其他文章推薦】

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

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

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

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

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

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

  • Spring系列.AOP使用

    AOP簡介

    利用面向對象的方法可以很好的組織代碼,也可以繼承的方式實現代碼重用。但是項目中總是會出現一些重複的代碼,並且不太方便使用繼承的方式把他們重用管理起來,比如說通用日誌打印,事務處理和安全檢查等。我們可以將這些代碼封裝起來,做成通用模塊,但是還是需要在代碼中每處需要的地方進行显示調用,使用起來不方便。這是時候就是利用AOP的時候。

    AOP是一種編程範式,用來解決特定的問題,不能解決所有問題,可以看做是OOP的補充,常見的編程範式還有:

    • 面向過程編程;
    • 面向對象編程;
    • 面向函數編程(函數式編程);
    • 事件驅動編程(GUI開發中比較常見);
    • 面向切面編程

    AOP的常見使用場景

    • 性能監控,在方法調用前後記錄調用時間,方法執行太長或超時報警;
    • 緩存代理,緩存某方法的返回值,下次執行該方法時,直接從緩存里獲取;
    • 軟件破解,使用AOP修改軟件的驗證類的判斷邏輯;
    • 記錄日誌,在方法執行前後記錄系統日誌;
    • 工作流系統,工作流系統需要將業務代碼和流程引擎代碼混合在一起執行,那麼我們可以使用AOP將其分離,並動態掛接業務;
    • 權限驗證,方法執行前驗證是否有權限執行當前方法,沒有則拋出沒有權限執行異常,由業務代碼捕捉;
    • 事務處理 。

    Spring AOP相關概念

    • AOP:這種在運行時(或者編譯時或者加載時),動態地將某些公共代碼切入到類的指定方法、指定位置上的編程思想就是面向切面的編程;
    • 切面(Aspect):A modularization of a concern that cuts across multiple classes。在Spring中切面就是一個標註@AspectJ的類,不要想得太複雜;
    • 連接點(Joinpoint):方法執行過程中的某個點,是在應用執行過程中能夠插入切面的一個點。這個點可以是調用方法時、拋出異常時、甚至修改一個字段時。切面代碼可以利用這些點插入到應用的正常流程之中,並添加新的行為;
    • 通知(advice):描述切面要完成什麼工作,以及在什麼時間點進行工作;
    • Pointcut:用來匹配一組連接點,並且pointcut會關聯advice,在pointcut匹配的連接點執行的時候,advice代碼會被執行;
    • Introduction
    • Target object:被織入切面的對象;
    • AOP proxy : 包裝了切面代碼和target代碼的對象,Spring中支持JDK動態代理和
      CGLIB,默認使用JDK動態代理,但是如果被代理的類沒有實現接口,或者用戶強制使用CGLIB,那麼Spring會使用CGLIB代理;
    • Weaving:將切面代碼添加到目標代碼的過程,織入的類型有編譯時織入,加載時織入和運行時織入(Spring是運行時織入)

    SpringAOP可以應用5種類型的通知:

    • 前置通知(Before):在目標方法被調用之前調用通知功能。
    • 後置通知(After):在目標方法完成之後調用通知,此時不會關心方法的輸出是什麼。(不管執行是否成功都執行都執行)
    • 返回通知(After-returning):在目標方法成功執行之後調用通知。
    • 異常通知(After-throwing):在目標方法拋出異常后調用通知。
    • 環繞通知(Around):通知包裹了被通知的方法,在被通知的方法調用之前和調用之後執行自定義的行為。

    Spring AOP相關

    開啟Aop

    
    //自動選擇合適的AOP代理
    //傳統xml這樣配置:<aop:aspectj-autoproxy/>
    
    //exposeProxy = true屬性設置成true,意思是將動態生成的代理類expose到AopContext的ThreadLocal線程
    //可以通過AopContext.currentProxy();獲取到生成的動態代理類。
    
    //proxyTargetClass屬性設置動態代理使用JDK動態代理還是使用CGlib代理,設置成true是使用CGlib代理,false的話是使用JDK動態代理
    
    //注意:如果使用Spring Boot的話,下面的配置可以不需要。AopAutoConfiguration這個自動配置類中已經自動開啟了AOP
    //默認使用CGLIB動態代理,Spring Boot配置的優先級高於下面的配置
    
    @Configuration
    @EnableAspectJAutoProxy(exposeProxy = true,proxyTargetClass = false)
    public class AopConfig {
    
    }
    
    
    

    如果使用傳統的配置方式的話,可按如下配置開啟AOP功能。

    <aop:aspectj-autoproxy/>
    

    定義一個Aspect

    Aspects (classes annotated with @Aspect) can have methods and fields, the same as any other class. They can also contain pointcut, advice, and introduction (inter-type) declarations.

    可以使用普通Bean的定義方式,或者加@Aspect註解的方式定義。一旦一個類被標註成切面類,它就不會成為其他切面的代理對象。

    定義一個PointCut

    切面表達式可以由指示器,通配符和運算符組成

    1. 指示器(Designators)
    • 匹配方法 execution() (重點掌握…)
    • 匹配註解 @target() @args() @within() @annotation()
    • 匹配包/類型 within()
    • 匹配對象 this() bean() target()
    • 匹配參數 args()
    1. Wildcards(通配符)
    • *匹配任意數量的字符
    • +匹配指定類及其子類
    • .. 一般用於匹配任意參數的子包或參數
    1. Operators(運算符)
    • && 與操作符
    • || 或操作符
    • ! 非操作符

    下面給出一個定義PointCut的例子

    package com.csx.demo.spring.boot.aspect;
    
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.*;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Component;
    
    @Component
    @Aspect
    public class MyAspect {
    
        //PointCut匹配的方法必須是Spring中bean的方法
        //Pointcut可以有下列方式來定義或者通過&& || 和!的方式進行組合.
        //下面定義的這些切入點就可以通過&& ||組合
    
        private static Logger logger = LoggerFactory.getLogger(MyAspect.class);
    
        //*:代表方法的返回值可以是任何類型
        //整個表達式匹配controller包下面任何的的echo方法,方法入參樂意是任意
        @Pointcut("execution(* com.csx.demo.spring.boot.controller.*.echo(..))")
        public void pointCut1(){}
    
        //代表echo方法必須有一個參數 參數的類型可以是任意類型
        @Pointcut("execution(* com.csx.demo.spring.boot.controller.*.echo(*))")
        public  void pointCut2(){}
    
        //代表echo方法必須有兩個參數,第一個類型任意,第二個類型必須是String
        @Pointcut("execution(* com.csx.demo.spring.boot.controller.*.echo(*,String))")
        public void pointCut3(){}
    
        //contrller包及其子包下面的任意類的任意方法
        //需要注意的是with和@with都是正對包級別的
        @Pointcut("within(com.csx.demo.spring.boot.controller..*)")
        public void pointCut4(){}
    
        //使用RestController這個註解標註任意類的任意方法
        @Pointcut("@within(org.springframework.web.bind.annotation.RestController)")
        public void pointCut5(){}
    
        //用法和@Within類似
        @Pointcut("@target(org.springframework.web.bind.annotation.RestController)")
        public void pointCut10(){}
    
        //MyService這個接口實現類的任何方法
        //如果MyService是一個類的話,那匹配這個類內部的所有方法
        @Pointcut("this(com.csx.demo.spring.boot.service.MyService)")
        public void pointCut6(){}
    
        @Pointcut("this(com.csx.demo.spring.boot.service.MyServiceImpl)")
        public void pointCut7(){}
    
        //某個bean內部的所有方法
        @Pointcut("bean(myServiceImpl)")
        public void pointCut8(){}
    
        //@within和@target針對類的註解,@annotation是針對方法的註解
        //匹配任何標註GetMaping註解的方法
        @Pointcut("@annotation(org.springframework.web.bind.annotation.GetMapping)")
        public void pointCut9(){}
    
        //匹配只有一個參數,參數類型是String的方法
        @Pointcut("args(String)")
        public void pointCut11(){}
    
    
        @Before("pointCut1()")
        public void befor(){
            logger.info("前置通知vvvv...");
            logger.info("我要做些事情...");
        }
    
        @After("pointCut1()")
        public void after(){
            logger.info("後置通知");
        }
    
        @AfterReturning("pointCut1()")
        public void afterReturn(){
           logger.info("後置返回");
        }
    
         //目標方法拋出相關異常后通知
        @AfterThrowing("pointCut1()")
        public void afterThrowing(){
            logger.info("後置異常");
        }
    
        @Around("pointCut1()")
        public void around(ProceedingJoinPoint point) throws Throwable {
            logger.info("環繞通知...");
            logger.info("我要做些事情...");
            point.proceed();
            logger.info("結束環繞通知");
        }
    
    }
    

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

    【其他文章推薦】

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

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

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

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

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

  • LeetCode 77,組合挑戰,你能想出不用遞歸的解法嗎?

    LeetCode 77,組合挑戰,你能想出不用遞歸的解法嗎?

    本文始發於個人公眾號:TechFlow,原創不易,求個關注

    今天是LeetCode第46篇文章,我們一起來LeetCode中的77題,Combinations(組合)。

    這個題目可以說是很精闢了,僅僅用一個單詞的標題就說清楚了大半題意了。這題官方難度是Medium,它在LeetCode當中評價很高,1364人點贊,只有66個反對。通過率53.6%。

    題意

    題目的題意很簡單,給定兩個整數n和k。n表示從1到n的n個自然數,要求隨機從這n個數中抽取k個的所有組合

    樣例

    Input: n = 4, k = 2
    Output:
    [
      [2,4],
      [3,4],
      [2,3],
      [1,2],
      [1,3],
      [1,4],
    ]
    

    全排列的問題我們已經很熟悉了,那麼獲取組合的問題怎麼做呢?

    遞歸

    這是一個全組合問題,實際上我們之前做過全排列問題。我們來分析一下排列和組合的區別,可能很多人知道這兩者的區別,但是對於區別本身的理解和認識不是非常深刻。

    排列和組合有一個巨大的區別在於,排列會考慮物體擺放的順序。也就是說同樣的元素構成,只要這些元素一些交換順序,那麼就會被視為是不同的排列。然而對於組合來說,是不會考慮物體的擺放順序的。只要是這些元素構成,無論它們怎麼調換擺放順序,都是同一種組合。

    我們獲取全排列的時候用的是回溯法,我們當然也可以用回溯法來獲取組合。但問題是,我們怎麼保證獲取到的組合都是元素的組成不同,而不是元素之間的順序不同呢?

    為了保證這一點,需要用到一個慣用的小套路,就是通過下標遞增來控制拿取元素的順序。如果我們限定了拿取元素的下標是遞增的,那麼就可以保證每一次拿取到的組合都是獨一無二的。所以我們就把這一點加在回溯法上即可,只要理解了,並不難實現。

    在代碼的實現當中,我們用上了閉包,省略了幾個參數的傳遞,整體上來說編碼的難度降低了一些。

    class Solution:
        def combine(self, n: int, k: int) -> List[List[int]]:
            def dfs(start, cur):
                # 如果當前已經拿到了K個數的組合,直接加入答案
                # 注意要做深拷貝,否則在之後的回溯過程當中變動也會影響結果
                if len(cur) == k:
                    ret.append(cur[:])
                    return
                
                # 從start+1的位置開始遍歷
                for i in range(start+1, n):
                    cur.append(i+1)
                    dfs(i, cur)
                    # 回溯
                    cur.pop()
                    
            ret = []
            dfs(-1, [])
            return ret
    

    迭代

    這題並不是只有一種做法,我們也可以不用遞歸實現算法。不用遞歸意味着沒有系統幫助我們建棧存儲中間信息了,需要我們自己把迭代過程當中所有變量的關係整理清楚。

    我們假設n=8,k=3,那麼在所有合法的組合當中,最小的組合一定是[1,2,3],最大的組合一定是[6,7,8]。如果我們保證組合當中的元素是有序排列的,那麼組合之間的大小關係也是可以確定的。進而我們可以思考設計一種方案,使得我們可以從最小的組合[1,2,3]一直迭代到[6,7,8],並且我們還要保證在迭代的過程當中,組合當中元素的順序不會被打亂。

    我們可以想象成這n個數在一根“直尺”上排成了一行,我們有k個滑動框在上面移動。這k個滑動框取值的結果就是n個元素中選取k個的組合,並且由於滑動框之間是不能交錯的,所以保證了這k個值是有序的。我們要做的就是設計一種移動滑動框的算法,使得能夠找到所有的組合情況。

    我們可以想象一下,一開始的時候滑動框都聚集在最左邊,我們要移動只能移動最右側的滑動框。我們把滑動框從k移動到了k+1,那麼這個時候它的右側有k-1個滑動框,一共有k個位置。

    那麼這個問題其實轉化成了k個元素當中取k-1個組合的子問題。我們把1-k的這個部分看成是新的“直尺”,我們要在其中移動k-1個滑動框獲取所有的組合。首先,我們需要把這k-1個滑動框全部移動到左側,然後再移動其中最右側的滑動框。然後循環往複,直到所有的滑動框都往右移動了一格為止,這其實是一個遞歸的過程。

    我們不去深究這個遞歸的整個過程,我們只需要理解清楚其中的幾個關鍵點就可以了。首先,對於每一次遞歸來說,我們只會移動這個遞歸範圍內最右側的滑動框,其次我們清楚每一次遞歸過程中的起始狀態。開始狀態就是所有的滑動框全部集中在“直尺”的最左側,結束狀態就是全部集中在最右側。

    我們把上面的邏輯整理一下,假設我們經過一系列操作之後,m個滑動框全部移動到了長度為n的直尺的最右側。這就相當於的組合都已經獲取完了。如果n+1的位置還有滑動框,並且它的右側還可以移動,那麼我們需要將它往右移動一個,到n+2的位置。這個時候剩下的局面就是,為了獲取這些組合,我們需要把這m個滑動框全部再移動到直尺的最左側,重新開始移動。

    我們在實現的時候當然沒有滑動框,我們可以用一個數組記錄滑動框當中的元素。

    我先用遞歸寫一下這段邏輯:

    class Solution:
        def combine(self, n: int, k: int) -> List[List[int]]:
            def comb(window, m, ret):
                ret.append(window[:-1])
    
                # 如果第m位的滑動框不超過直尺的範圍並且m右側的滑動框
                while window[m] < min(n - k + m + 1, window[m+1] - 1):
                    # 向右滑動一位
                    window[m] += 1
                    # 如果m左側還有滑動框,遞歸
                    if m > 0:
                        # 把左側的滑動框全部移動到最左側
                        window[:m] = range(1, m+1)
                        comb(window, m-1, ret)
                    else:
                        # 否則記錄答案
                        ret.append(window[:-1])
    
                    
            ret = []
            window = list(range(1, k+1))
            # 額外多放一個滑動框作為標兵
            window.append(n+1)
            comb(window, k-1, ret)
            return ret
    

    這種解法的速度比上面正規遞歸的速度快了許多,因為我們遞歸的過程當中做了諸多限制,剪掉了很多無關的情況,相當於做了極致的剪枝。

    最關鍵的是上面的這段邏輯我們是可以用循環實現的,所以我們可以用循環來將遞歸的邏輯展開,就得到了下面這段代碼。

    class Solution:
        def combine(self, n: int, k: int) -> List[List[int]]:
            # 構造滑動框
            window = list(range(1, k + 1)) + [n + 1]
            
            ret, j = [], 0
    
            while j < k:
                # 添加答案
                ret.append(window[:k])
    
                j = 0
                # 從最左側的滑動框開始判斷
                # 如果滑動框與它右側滑動框挨着,那麼就將它移動到最左側
                # 因為它右側的滑動框一定會向右移動
                while j < k and window[j + 1] == window[j] + 1:
                    window[j] = j + 1
                    j += 1
                # 連續挨着最右側的滑動框向右移動一格
                window[j] += 1
                
            return ret
    

    這段代碼雖然非常精鍊,但是很難理解,尤其是你沒能理解上面遞歸實現的話,會更難理解。所以我建議,先把遞歸實現的滑動框的方法理解了,再來理解不含遞歸的這段,會容易一些。

    總結

    我們通過回溯法求解組合的方法應該是最簡單也是最基礎的,難度也不大。相比之下後面一種方法則要困難許多,我們直接去啃,往往不得要領。既會疑惑為什麼這樣可以保證能獲得所有的組合,又會不明白其中具體的實現邏輯。所以如果想要弄明白第二種方法,一定要從滑動框這個模型出發

    從代碼實現的角度來說,滑動框方法的遞歸解法比非遞歸的解法還要困難。因為遞歸條件以及邏輯都比較複雜,還涉及到存儲答案的問題。但是從理解上來說,遞歸的解法更加容易理解一些,非遞歸的算法往往會疑惑於j這個指針的取值。所以如果想要理解算法的話,可以從遞歸的代碼入手,想要實現代碼的話,可以從非遞歸的方法入手。

    這道題目非常有意思,值得大家細細思考。

    如果喜歡本文,可以的話,請點個關注,給我一點鼓勵,也方便獲取更多文章。

    本文使用 mdnice 排版

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

    【其他文章推薦】

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

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

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

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

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

  • 日本也愛野味?每年撲殺7萬頭動物製「野味包」

    摘錄自2020年11月1日民視報導

    日本高知縣是全國森林覆蓋率最高的地方,常有許多鹿與野豬危害作物,像是吃光果實、拿柚子樹的樹幹磨牙,當地一年農損就超過1億日圓,因此每年必須撲殺7萬頭野生動物。

    其中,大多都會進入加工廠,送往餐飲店做成山產料理。但受到疫情影響,餐廳紛紛停業,相關食材賣不出去。於是有業者靈機一動,把這些野味做成寵物食品。甚至有高中社團,研發野味速食包,搶攻年輕人市場。

    寵物食品業者說,「這邊是用高知的鹿肉,以及部分野豬肉做成的寵物食品。」人類不吃的骨頭和部分內臟,對狗狗而言卻是營養的大餐,正好搶攻疫情期間的寵物商機。

    而高知的商業高中,還有所謂的「野味社團」,致力推銷在地山產料理。除了拍照PO網,還自力開發新產品。野味鹿肉富含鐵質、高蛋白、以及維他命,對銀髮族和小朋友,都是相當好的補充品。肺炎病毒來襲,在地傳統飲食也意外找到新的出路。

    生物多樣性
    國際新聞
    日本
    野味
    武漢肺炎
    動物與大環境變遷

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

    【其他文章推薦】

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

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

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

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

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

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

  • 上次被目擊是1913年!消失百年「沃茲考氏變色龍」現蹤

    摘錄自2020年11月1日自由時報報導

    這真的是百年一見!科學家在非洲島國馬達加斯加西北部,發現難為世人所見的變色龍「沃茲考氏變色龍」(Voeltzkow’s chameleon),上一次這種變色龍被目擊的紀錄,是在100多年前。

    馬達加斯加和德國的研究人員10月30日宣佈這項發現,他們2018年在馬達加斯加西北部探察時,發現了幾隻活「沃茲考氏變色龍」。巴伐利亞自然歷史陳列館(ZSM)的科學家,在期刊「蠑螈」(Salamandra)發表的報告說,基因分析確認,這些物種是拉波德氏變色龍(Labord’s chameleon)的近親。

    上一次發現沃茲考氏變色龍是在1913年,而且,之前也從未有關於雌性「沃茲考氏變色龍」的紀錄。研究人員說,雄性的沃茲考氏變色龍外觀為綠色,相比之下,母變色龍就繽紛得多。研究人員相信,這兩種變色龍都只在雨季生活:孵化、迅速成長、與競爭者較勁,然後交配、死亡,這些過程都在短短幾個月內完成。ZSM爬蟲和兩棲動物典藏研究員格勞(Frank Glaw)說,「這些動物基本上是脊椎動物中的浮游類」。現今大規模森林砍伐正威脅牠們的棲地。

    生物多樣性
    國際新聞
    變色龍
    瀕危物種

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

    【其他文章推薦】

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

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

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

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

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

  • 日本香川縣養雞場爆禽流感 將撲殺33萬隻雞

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

    日本香川縣三豊市的一處養雞場從11月1日到4日突然有約3800隻雞死亡,經檢驗後驗出H5型禽流感病毒,該養雞場將撲殺約33萬隻雞。

    香川縣政府今天上午召開對策本部會議,決定養雞場飼養的約33萬隻雞將進行撲殺。

    日本的養雞場上次發生禽流感疫情,是2018年1月香川縣讚岐市的養雞場驗出H5型禽流感病毒。

    日本首相菅義偉今天上午聽取報告後,指示相關單位要提醒家禽業者對此高度警戒,並輔導與支援業者預防、收集現場情報;農林水產省與相關部會緊密合作,迅速進行防疫措施,以及對國民盡速提供正確的防疫資訊。

    國際新聞
    日本
    禽流感

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

    【其他文章推薦】

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

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

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

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

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

    ※超省錢租車方案

  • 突變冠狀病毒株恐降疫苗效力 丹麥全面撲殺水貂

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

    丹麥總理佛瑞德里克森今(4日)表示,在水貂身上的突變冠狀病毒傳染給人類之後,對未來可能研發出來的疫苗造成風險,因此境內多達1700萬隻水貂將遭全面撲殺。

    丹麥為全世界最大的水貂毛皮生產地,雖然當局自6月以來一再撲殺遭感染的水貂,但境內水貂農場疫情仍持續蔓延。

    佛瑞德里克森(Mette Frederiksen)在記者會上表示,衛生當局發現人體病毒株與水貂身上的病毒株,顯示對抗體的敏感度已降低,有可能影響未來疫苗的效力。

    國際新聞
    丹麥
    水貂

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

    【其他文章推薦】

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

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

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

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

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

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

  • 研究:全球氣溫升高 孕婦早產與死產風險俱增

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

    研究人員今(3日)表示,暴露於高溫和熱浪的孕婦,有較高的早產或死產風險。

    法新社報導,「英國醫學期刊」(BMJ)的研究報告指出,這項結果與貧窮有密切關聯,尤其是熱帶地區。隨著全球暖化問題加劇,特別是熱浪頻繁且強烈的期間,這個問題會更加嚴重。

    世界衛生組織統計,每年有1500萬名嬰兒早產,這是導致5歲以下幼兒死亡的主因,而死亡率主要集中在發展中國家,特別是非洲國家。

    為量化氣溫升高對懷孕結果的影響,南非約翰尼斯堡金山大學生殖健康暨愛滋病毒研究所(Wits Reproductive Health and HIV Institute)研究人員契爾斯奇(Matthew Chersich)領導的國際團隊,檢視70篇經同儕審視的相關研究,內容涵蓋27個富裕、貧窮與中間所得國家。

    研究發現,在47篇關於早產的研究中有40篇表示,溫度升高後早產的現象更為常見。

    根據這項新發現,平均而言,氣溫每上升攝氏1度,早產風險就會增加5%;而在熱浪侵襲期間,早產風險更是增加16%。

    氣候變遷
    國際新聞
    升溫
    孕婦
    早產

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

    【其他文章推薦】

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

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

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

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

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

  • 美大選隔日正式退出巴黎協定 「氣候選戰」勝負未決

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

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

    【其他文章推薦】

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

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

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

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

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

  • 動力更強,更好開還更省油,以後可以買到這些車

    動力更強,更好開還更省油,以後可以買到這些車

    以前總說手動擋車型省油,但現在不少自動變速箱與發動機的匹配愈發爐火純青,油耗也持續往下走,有些自動擋車型的油耗數據完全不輸手動擋。曾經我認為四缸是一台車的底線,沒想到現在三缸機已經越來越普遍。最經典的就是寶馬1系,連一向對發動機輸出有苛刻要求的寶馬都推出了1。

    隨着我國經濟的飛速發展,不少人民的錢包變得越來越鼓。近幾年,我國汽車的人均汽車保有量在迅速攀升,銷量已經連續幾年位居世界第一。各國的廠商已經越來越重視中國市場,甚至有不少車型都是為中國市場量身定做的。

    這十幾年中國汽車市場的變化還是挺大的,但這些變化我個人認為並不能說都是好事,只能說是一種對現實的妥協,下面就來和大家談談那些變化。

    在08年左右的時候,自然吸氣發動機的車還是大行其道,那時候對排放沒有捉得這麼嚴,所以各路廠家都喜歡推出自吸車。我自己家裡也有一輛1.6L老世嘉,一腳油門下去時,加速力雖然不是很猛,但循序漸進的感覺確實美妙。

    到了現在2018年,自吸車雖然不至於說退出歷史舞台,但是佔比已經愈來愈低,渦輪車的普及程度越來越高。早些年的時候,渦輪還是比較容易壞的。不過經過這麼多年的發展,渦輪的耐用性得以大幅提升。

    連一向崇尚自吸的日系車都大力推渦輪,就知道這個趨勢已經不可逆轉。不過日系車的渦輪車普遍體驗還是不錯的,像1.5T的思域、2.0T的漢蘭達都給消費者帶來了良好的駕乘質感。自吸這條路,目前也只有日產和馬自達等寥寥無幾的車企在苦苦支撐。

    在過去的時候,雖然也有自動擋,但普及程度沒有現在這麼高。現在感覺10台車裡面有9台都是自動擋的,而大多數人估計拿了駕駛證以後就沒有再開過手動擋,也有不少女生是直接考了個C2駕照。

    自動擋車型的門檻越來越低,這對於廣大消費者來講絕對是一件好事,畢竟不是所有人都喜歡開車這件事。以前總說手動擋車型省油,但現在不少自動變速箱與發動機的匹配愈發爐火純青,油耗也持續往下走,有些自動擋車型的油耗數據完全不輸手動擋。

    曾經我認為四缸是一台車的底線,沒想到現在三缸機已經越來越普遍。最經典的就是寶馬1系,連一向對發動機輸出有苛刻要求的寶馬都推出了1.5T三缸發動機來搶佔更多的市場份額。

    雖然現在的三缸機在抖動控制方面已經做得相當不錯,在車內如果不是仔細體會,還真不容易感覺出來。不過也有一些汽修人員指出,三缸機在老化以後,抖動要比四缸機明顯不少,這也是不少人擔心的地方。

    儘管如此,隨着汽車技術的不斷髮展,三缸機的技術也會得到進一步優化。就像別克的英朗、閱朗和GL6已經全面三缸化,未來相信會有越來越多的車型加入其中。

    在各種政策的大力鼓勵下,各種電動車企業像雨後春筍般湧現出來,不少品牌連我們都不大認識。毫無疑問電動車會是下一片紅海,很多企業都想從中分一杯羹。不過就目前來看,自願買電動車的人還是少數。

    一直以來困擾電動車發展的兩大難題是充電速度和續航里程,前者的話,蔚來已經提出了換電服務,這算是頗為便捷的一個解決方式;後者的話,經過這幾年的發展,不少電動車的理論續航里程都能達到450km以上,未來我相信能持續增多。

    我曾經駕駛過特斯拉,無可否認,那種一點就有的加速確實不錯。但沒有了引擎和排氣的聲音,感覺整個駕駛參与度不夠高,就像關了聲音看恐怖片般索然無味。這也不是無法彌補,現在有不少汽車都有聲浪彌補功能,可根據駕駛員踩踏油門的深度來模擬出引擎和排氣的聲音,但假的真不了。

    總結

    這幾個汽車的變化,到底是好還是壞,不同的人有不同的看法。這些轉變就像青春期的愛情變為工作后的愛情,前者是單純懵懂的,後者則是現實清晰的。更為關鍵的是,汽車和愛情都是不可逆轉的,而我們唯一能做的就是珍惜和享受眼前的汽車生活。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

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

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

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

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

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

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