特斯拉自駕車晶片 傳將改由三星代工

三星搶攻車用晶片商機再下一成,產業界消息傳出,三星電子成功打入特斯拉電動車供應鏈,雙方已簽署特殊應用晶片(ASIC)代工合約。

按照合約內容,三星將按特斯拉的特殊規格,量身設計、生產客製化系統單晶片(SOC),將應用於無人駕駛車上。據估計,三星從晶片開發到量產,須要約三年時間。(韓國經濟日報)

此前,特斯拉自駕車晶片都是由以色列Mobileye所提供,但今年五月特斯拉電動車主在自駕模式出了意外身亡,才讓特斯拉動了尋找替代供應商的念頭。

另外,三星正在考慮將旗下系統LSI部門分拆成設計與代工兩個事業單位,原因是顧慮到特斯拉擔心三星可能將晶片設計應用在自家產品上。

(本文內容由 授權提供。照片來源: shared by CC 2.0)

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

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

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

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

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

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

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

聚甘新

鼓勵民眾採用電動車,台延長免稅優惠五年

台灣現行的買電動車免徵貨物稅優惠原將於2017年一月底到期,但為推動民眾繼續採購電動車,政府通過修正草案,將貨物稅免徵優惠延長五年,希望能來5,000輛以上的採購。

現行的電動車免徵貨物稅優惠適用於於純電動車。只要民眾購買純電力電動小客車且完成登記,該車輛在新台幣140萬元以下部分的貨物稅可享有免徵優惠,超過的部分則依照比例課稅。

財政部推估,電動車貨物稅免徵推估可在2017~2022年的五年之間帶動5,939輛電動汽車、15萬輛電動機車的銷售量,將帶來24億元新台幣的稅損;但因銷售預期將增加,營業稅等稅收預計會增加43億元新台幣,一來一往下可創造新台幣19.55億元的稅收,並帶動943.99億元的相關產值。

不過,立委對於財政部的推算並不樂觀。有立委表示,經濟部先前針對自用客車、中型巴士與大型巴士所推出的電動車免貨物稅措施,達成率不到2成。而目前台灣只有765輛電動汽車,5年免徵貨物稅優惠的目標,相當於需增加5,174輛才能達成。

經濟部次長沈榮津回應,許多國家都對電動車有優惠扶植措施,台灣也順應此一潮流。成效不如預期的主因是車用電池的供應狀況仍不夠穩定,希望能透過稅務優惠帶動電動車需求成長,拉動電池產業。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

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

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

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

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

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

聚甘新

最新研究:全球「水塔」面臨多重威脅 喜馬拉雅列亞洲最脆弱

摘錄自2019年12月10日中新網北京報導

據中國科學院青藏高原研究所消息,括中國科學家在內的全球科學家對被稱為「水塔」—地球78個高山冰川水系統的最新研究評估顯示,全球「水塔」正面臨氣候變化、人口增長、水資源管理不善、其他地緣政治因素等多重威脅,形勢岌岌可危。

這項最新評估研究由全球32位科學家合作撰寫,獲得中科院院士、冰川學家姚檀棟牽頭的中科院專項資助,並發表於《自然》期刊。

地球78個基於高山冰川的水系統被稱為高山「水塔」,其通過冰川、積雪、湖泊和河流來儲藏與運送水,為全球19億人(約佔全球總人口的1/4)提供水資源。亞洲以印度河「水塔」受依賴度最高也最為脆弱,它由喜馬拉雅山脈的廣大地區組成,覆蓋阿富汗、中國、印度和巴基斯坦部分地區。

姚檀棟提醒說,如果全球氣溫升幅超過攝氏2度,亞洲「水塔」氣溫則會劇增至4度,到2060-2070年會出現更大規模的冰川退卻。冰川消減後,以季節性冰川融水補給為主的河流能夠提供的淡水量也會隨之減少,下游地區人口可能會面臨淡水資源減少的問題。

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

【其他文章推薦】

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

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

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

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

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

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

龍芯團隊完成CoreCLR MIPS64移植,已在github開源

國產龍芯的軟件生態之中.NET不會缺席,畢竟 C# 與 .NetCore/Mono 也是全球幾大主流的編程語言和運行平台之一,最近一段時間聽到太多的鼓吹政務領域不支持.NET, 大家都明白這是某些人為了自己的利益打壓使用.NET技術的公司,我今天寫這篇文章就是想通過龍芯團隊的行動告訴更多人一起來推動.NET技術在中國的發展。希望龍芯廠商、支持龍芯的國產操作系統廠商能高度重視這個問題,主動加入 .Net Core 社區,加入.NET基金會,积極貢獻代碼,儘快做好適配工作。

龍芯團隊一直在做net core的mips64移植工作,2020年6月18日完成了里程碑性的工作,在.NET Core 3.1分支上完成了MIPS64 的移植工作,目前已經在github上開源,開源地址:https://github.com/gsvm/coreclr 。具體說明可以參見 https://github.com/dotnet/runtime/issues/38069。 龍芯團隊正在做移植后的測試工作,已經完成了 9500 多項測試,ASP.NET Core示例程序 FlightFinder 已經可以在MIPS64 上正常運行,具體可以參看 https://github.com/dotnet/runtime/issues/4234。

龍芯團隊還在github上面為龍芯.NET 建立了一個倉庫 https://github.com/gsvm/loongson-dotnet,用於關於龍芯的.NET信息,工作和下載,開源協議採用和.NET Core一樣的MIT協議。 根據這個倉庫的信息,龍芯團隊將在不久的將來發布.NET Core 3.1版本,然後升級到https://github.com/dotnet/runtime ,也就是.NET 5了。目前這項工作正在緊鑼密鼓的進行,非常歡迎大家的積极參与貢獻,包括issue或者PR,如果您有任何問題或需要任何支持,請隨時提交問題或通過电子郵件:aoqi@loongson.cn 與龍芯團隊聯繫。

在文章的最後,我向你分享一個龍芯團隊成員 xiangzhai 在這個 https://github.com/xiangzhai/mono/issues/2 提到了指令集相關的編程的一些相關知識:

OpenJDK、CorelCLR、mono都太大了,比較小的虛擬機例子可以看看PSP模擬器: https://github.com/xiangzhai/ppsspp-jit-mips64/commits/mips64-port-dev

CoreCLR官方的文檔不錯:下降、寄存器分配、代碼生成 https://github.com/dotnet/runtime/blob/master/docs/design/coreclr/jit/ryujit-overview.md

CoreCLR代碼生成常用調試方法: dotnet/runtime#606

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

【其他文章推薦】

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

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

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

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

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

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

Thunk函數的使用

Thunk函數的使用

編譯器的求值策略通常分為傳值調用以及傳名調用,Thunk函數是應用於編譯器的傳名調用實現,往往是將參數放到一個臨時函數之中,再將這個臨時函數傳入函數體,這個臨時函數就叫做Thunk 函數。

求值策略

編譯器的求值策略通常分為傳值調用以及傳名調用,在下面的例子中,將一個表達式作為參數進行傳遞,傳值調用以及傳名調用中實現的方式有所不同。

var x = 1;

function s(y){
    console.log(y + 1); // 3
}

s(x + 1);

在上述的例子中,無論是使用傳值調用還是使用傳名調用,執行的結果都是一樣的,但是其調用過程不同:

  • 傳值調用:首先計算x + 1,然後將計算結果2傳遞到s函數,即相當於調用s(2)
  • 傳名調用:直接將x + 1表達式傳遞給y,使用時再計算x + 1,即相當於計算(x + 1) + 1

傳值調用與傳名調用各有利弊,傳值調用比較簡單,但是對參數求值的時候,實際上還沒用到這個參數,有可能造成沒有必要的計算。傳名調用可以解決這個問題,但是實現相對來說比較複雜。

var x = 1;

function s(y){
    console.log(y + 1); // 3
}

s(x + 1, x + 2);

在上面這個例子中,函數s並沒有用到x + 2這個表達式求得的值,使用傳名調用的話只將表達式傳入而並未計算,只要在函數中沒有用到x + 2這個表達式就不會計算,使用傳值調用的話就會首先將x + 2的值計算然後傳入,如果沒有用到這個值,那麼就多了一次沒有必要的計算。Thunk函數就是作為傳名調用的實現而構建的,往往是將參數放到一個臨時函數之中,再將這個臨時函數傳入函數體,這個臨時函數就叫做Thunk 函數。

var x = 1;

function s(y){
    console.log(y + 1); // 3
}

s(x + 1);

// 等同於

var x = 1;

function s(thunk){
    console.log(thunk() + 1); // 3
}

var thunk = function(){
    return x + 1;
}

s(thunk);

Js中的Thunk函數

Js中的求值策略是是傳值調用,在Js中使用Thunk函數需要手動進行實現且含義有所不同,在Js中,Thunk函數替換的不是表達式,而是多參數函數,將其替換成單參數的版本,且只接受回調函數作為參數。

// 假設一個延時函數需要傳遞一些參數
// 通常使用的版本如下
var delayAsync = function(time, callback, ...args){
    setTimeout(() => callback(...args), time);
}

var callback = function(x, y, z){
    console.log(x, y, z);
}

delayAsync(1000, callback, 1, 2, 3);

// 使用Thunk函數

var thunk = function(time, ...args){
    return function(callback){
        setTimeout(() => callback(...args), time);
    }
}

var callback = function(x, y, z){
    console.log(x, y, z);
}

var delayAsyncThunk = thunk(1000, 1, 2, 3);
delayAsyncThunk(callback);

實現一個簡單的Thunk函數轉換器,對於任何函數,只要參數有回調函數,就能寫成Thunk函數的形式。

var convertToThunk = function(funct){
  return function (...args){
    return function (callback){
      return funct.apply(this, args);
    }
  };
};

var callback = function(x, y, z){
    console.log(x, y, z);
}

var delayAsyncThunk = convertToThunk(function(time, ...args){
    setTimeout(() => callback(...args), time);
});

thunkFunct = delayAsyncThunk(1000, 1, 2, 3);
thunkFunct(callback);

Thunk函數在ES6之前可能應用比較少,但是在ES6之後,出現了Generator函數,通過使用Thunk函數就可以可以用於Generator函數的自動流程管理。首先是關於Generator函數的基本使用,調用一個生成器函數並不會馬上執行它裏面的語句,而是返回一個這個生成器的迭代器iterator 對象,他是一個指向內部狀態對象的指針。當這個迭代器的next()方法被首次(後續)調用時,其內的語句會執行到第一個(後續)出現yield的位置為止,yield后緊跟迭代器要返回的值,也就是指針就會從函數頭部或者上一次停下來的地方開始執行到下一個yield。或者如果用的是yield*,則表示將執行權移交給另一個生成器函數(當前生成器暫停執行)。

function* f(x) {
    yield x + 10;
    yield x + 20;
    return x + 30;
}
var g = f(1);
console.log(g); // f {<suspended>}
console.log(g.next()); // {value: 11, done: false}
console.log(g.next()); // {value: 21, done: false}
console.log(g.next()); // {value: 31, done: true}
console.log(g.next()); // {value: undefined, done: true} // 可以無限next(),但是value總為undefined,done總為true

由於Generator函數能夠將函數的執行暫時掛起,那麼他就完全可以操作一個異步任務,當上一個任務完成之後再繼續下一個任務,下面這個例子就是將一個異步任務同步化表達,當上一個延時定時器完成之後才會進行下一個定時器任務,可以通過這種方式解決一個異步嵌套的問題,例如利用回調的方式需要在一個網絡請求之後加入一次回調進行下一次請求,很容易造成回調地獄,而通過Generator函數就可以解決這個問題,事實上async/await就是利用的Generator函數以及Promise實現的異步解決方案。

var it = null;

function f(){
    var rand = Math.random() * 2;
    setTimeout(function(){
        if(it) it.next(rand);
    },1000)
}

function* g(){ 
    var r1 = yield f();
    console.log(r1);
    var r2 = yield f();
    console.log(r2);
    var r3 = yield f();
    console.log(r3);
}

it = g();
it.next();

雖然上邊的例子能夠自動執行,但是不夠方便,現在實現一個Thunk函數的自動流程管理,其自動幫我們進行回調函數的處理,只需要在Thunk函數中傳遞一些函數執行所需要的參數比如例子中的index,然後就可以編寫Generator函數的函數體,通過左邊的變量接收Thunk函數中funct執行的參數,在使用Thunk函數進行自動流程管理時,必須保證yield后是一個Thunk函數。
關於自動流程管理run函數,首先需要知道在調用next()方法時,如果傳入了參數,那麼這個參數會傳給上一條執行的yield語句左邊的變量,在這個函數中,第一次執行next時並未傳遞參數,而且在第一個yield上邊也並不存在接收變量的語句,無需傳遞參數,接下來就是判斷是否執行完這個生成器函數,在這裏並沒有執行完,那麼將自定義的next函數傳入res.value中,這裏需要注意res.value是一個函數,可以在下邊的例子中將註釋的那一行執行,然後就可以看到這個值是f(funct){...},此時我們將自定義的next函數傳遞后,就將next的執行權限交予了f這個函數,在這個函數執行完異步任務后,會執行回調函數,在這個回調函數中會觸發生成器的下一個next方法,並且這個next方法是傳遞了參數的,上文提到傳入參數後會將其傳遞給上一條執行的yield語句左邊的變量,那麼在這一次執行中會將這個參數值傳遞給r1,然後在繼續執行next,不斷往複,直到生成器函數結束運行,這樣就實現了流程的自動管理。

function thunkFunct(index){
    return function f(funct){
        var rand = Math.random() * 2;
        setTimeout(() => funct({rand:rand, index: index}), 1000)
    }
}

function* g(){ 
    var r1 = yield thunkFunct(1);
    console.log(r1.index, r1.rand);
    var r2 = yield thunkFunct(2);
    console.log(r2.index, r2.rand);
    var r3 = yield thunkFunct(3);
    console.log(r3.index, r3.rand);
}

function run(generator){
    var g = generator();

    var next = function(data){
        var res = g.next(data);
        if(res.done) return ;
        // console.log(res.value);
        res.value(next);
    }

    next();
}

run(g);

每日一題

https://github.com/WindrunnerMax/EveryDay

參考

https://www.jianshu.com/p/9302a1d01113
https://segmentfault.com/a/1190000017211798
http://www.ruanyifeng.com/blog/2015/05/thunk.html

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

【其他文章推薦】

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

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

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

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

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

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

Spring中基於xml的AOP

1、Aop 全程是Aspect Oriented Programming 即面向切面編程,通過預編譯方式和運行期動態代理實現程序功能的同一維護的一種技術。Aop是oop的延續,是軟件開發中的 一個熱點,也是Spring框架中一個重要的內容。是函數式編程的一個衍生範例,利用Aop可以對業務邏輯各個部分進行分割,從而使得業務邏輯各部分之間的耦合度降低,提高程序的可重用行,提高了開發效率。簡單的說就是把我們程序中的重複代碼抽取出來,在需要執行的時候,使用動態代理的技術,在不修改源碼的基礎上已有的方法進行增強,(使用動態代理的方式實現)

相關術語

JoinPoint:鏈接點 那些被攔截到的點,在spring中,這些點指的是方法,因為spring只支持方法類型的連接點

Pointcut:切入點   是指我們要對哪些JoinPont進行攔截的定義

Advice:通知/增強  攔截到Joinpoint之後所要做的事情就是通知

通知類型:前置通知、後置通知、異常通知、最終通知、環繞通知

Introduction:引介   是一種特殊的通知,在不修改類代碼的前提下,Introduction可以在運行期為類動態的添加一些方法或field

Target:目標對象,代理的目標對象

Weaving 織入   是指把增強應用到目標對象來創建新的代理對象的過程,spring採用動態代理織入,而AspectJ採用編譯期織入和類裝載期織入

Proxy:代理,一類類被Aop織入增強后,就產生一個結果代理類

Aspect:切面   是切入點和通知(引介)的結合

在 spring 中,框架會根據目標類是否實現了接口來決定採用哪種動態代理的方式。

基於XMl的AOP步驟

1、創建Maven項目引入spring坐標

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.mingqi</groupId>
    <artifactId>SpringIOC</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.8.7</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

2、創建業務層接口:

package com.mingqi.services;
public interface IAccountService {
    /**
     * 模擬登陸賬戶
     */
    void saveAccount();

    /**
     * 模擬更新賬戶
     * @param id
     */
    void updateAccount(int id);

    /**
     * 模擬刪除賬戶
     * @return
     */
    int deleteAccount();

}

3.創建業務層實現類

package com.mingqi.services.impl;
import com.mingqi.services.IAccountService;
public class AccountServicesImpl implements IAccountService {
    public void saveAccount() {
        System.out.println("執行了保存");
    }

    public void updateAccount(int id) {
        System.out.println("執行了更新"+id);
    }

    public int deleteAccount() {
        System.out.println("執行了刪除");
        return 0;
    }
}

4、創建工具類

package com.mingqi.utils;
import org.aspectj.lang.ProceedingJoinPoint;
/**
 * 用戶記錄日誌的工具類,裏面提供公共的代碼
 */
public class Logger {
    /**
     * 用於打印日誌:計劃讓其在切入點方法執行前執行(切入點方法就是業務層方法)
     */
    public  void beforePrintLog(){
        System.out.println("Logger類中的pringLog方法開始記錄日誌了。。。");
    }
    public  void afterReturningPrintLog()
    {
        System.out.println("後置通知Logger類中的beforePrintLog方法開始記錄日誌了。。。");
    }
    /**
     * 異常通知
     */
    public void afterThrowingPrintLog()
    {
        System.out.println("異常通知Logger類中的afterThrowingPrintLog方法開始記錄日誌了。。。");

    }
    /**
     * 最終通知
     */
    public void afterPrintLog()
    {
        System.out.println("最終通知Logger類中的afterPrintLog方法開始記錄日誌了。。。");
    }

    /**
     * 環繞通知
     * 問題  當我們配置了環繞通知以後,切入點方法沒有執行,而通知方法執行了
     * 分析: 通過對比動態代理中的環繞通知代碼,發現動態代理中的環繞通知有明確的切入點方法調用,而我們的代碼中沒有
     * 解決: Spring 框架為我們提供了一個接口:ProceedingJoinPoint。該接口有一個方法proceed(),此方法就相當於明確調用切入點的方法
     *        該接口可以作為環繞通知的參數方法,在程序執行時,spring框架會為我們提供該接口的實現類供我們使用
     * spring中的環繞通知
     *      他是spring框架為我們提供的一種可以在代碼中手動控制增強方法何時會執行的方式
     * @param pjp
     * @return
     */
    public Object aroundPringLog(ProceedingJoinPoint pjp){
        Object rtValue = null;
        try{
            Object[] args = pjp.getArgs();//得到方法執行所需的參數

            System.out.println("Logger類中的aroundPringLog方法開始記錄日誌了。。。前置");

            rtValue = pjp.proceed(args);//明確調用業務層方法(切入點方法)

            System.out.println("Logger類中的aroundPringLog方法開始記錄日誌了。。。後置");

            return rtValue;
        }catch (Throwable t){
            System.out.println("Logger類中的aroundPringLog方法開始記錄日誌了。。。異常");
            throw new RuntimeException(t);
        }finally {
            System.out.println("Logger類中的aroundPringLog方法開始記錄日誌了。。。最終");
        }
    }
}

4、創建bean配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">
       <!-- 配置spring的IOC,把service對象配置進來-->
       <bean id="accountSevice" class="com.mingqi.services.impl.AccountServicesImpl"></bean>
       <!-- spring 中基於xml的Aop配置步驟
         1、把通知Bean也交給spring來管理
         2、使用aop:config標籤表名開始aop的配置
         3、使用aop:aspect標籤表明配置切面
             id屬性:是給切面提供一個唯一標識
             ref屬性:是指定通知類的id
         4、在aop:aspect標籤的內部使用對應的標籤來配置通知的類型
             我們現在的示例是讓printlog方法在切入點方法執行之前執行,所以是前置通知
             aop:before:標識前置通知
                method屬性: 用於指定Logger類中的方法哪個是前置通知
                pointcut屬性: 用於指定切入點表達式,該表達式的含義指的是對業務層中的哪些方法增強
                切入點表達式的寫法:
                   關鍵字:execution(表達式)
                   表達式:  訪問修飾符 返回值 包名.包名.包名....類名.方法名(參數列表)
                   標準的寫法: public void com.mingqi.service.impl.AccountServiceImpl.saveAccount()
                   訪問修飾符可以省略:void com.mingqi.service.impl.AccountServiceImpl.saveAccount()
                   返回值可以使用通配符,標識任意返回值:* com.mingqi.service.impl.AccountServiceImpl.saveAccount()
                   包名可以使用通配符,表示任意包,但是有幾級包就需要寫幾個*  *.*.*.*.*.AccountServiceImpl.saveAccount()
                   包名可以使用..代表當前包及其子包:* *.AccountServiceImpl.saveAccount()
                   類名和方法名都可以使用*來實現統配 * *..*.*();
                   參數列表: 可以直接寫數據類型:
                                 基本類型直接寫名稱:int
                                 引用類型寫包名.類名的方式: java.lang.String
                                可以使用通配符來標識任意類型,單必須有參數
                                可以使用..標識有無參數均可,有參數可以是任意類型

                      全通配寫法:
                    * *..*.*(..)
                   實際開發中 切入點表達式的通常寫法:
                          切到業務層實現類的所有方法,* com.mingqi.service.impl.*.*(..);
         -->
       <!-- 配置Logger類-->
       <bean id="logger" class="com.mingqi.utils.Logger"></bean>
       <!--使用aop:config標籤表名開始aop的配置-->
       <aop:config>
              <aop:pointcut id="pt1" expression="execution(* com.mingqi.services.impl.*.*(..))"></aop:pointcut>
              <!--使用aop:aspect標籤表明配置切面-->
              <aop:aspect id="LogAdvice" ref="logger">
                     <!-- 配置前置通知:在切入點方法執行之前執行
                     <aop:before method="beforePrintLog" pointcut-ref="pt1"></aop:before>-->

                     <!-- 配置後置通知:在切入點方法正常執行之後值。它和異常通知永遠只能執行一個
                          <aop:after-returning method="afterReturningPrintLog" pointcut-ref="pt1"></aop:after-returning>-->
                     <!-- 配置異常通知:在切入點方法執行產生異常之後執行。它和後置通知永遠只能執行一個
                         <aop:after-throwing method="afterThrowingPrintLog" pointcut-ref="pt1"></aop:after-throwing>-->
                     <!-- 配置最終通知:無論切入點方法是否正常執行它都會在其後面執行
                        <aop:after method="afterPrintLog" pointcut-ref="pt1"></aop:after>-->
                     <!-- 配置環繞通知 詳細的註釋請看Logger類中-->
                        <aop:around method="aroundPringLog" pointcut-ref="pt1"></aop:around>
                    </aop:aspect>
             </aop:config>
       </beans>

6、創建測試類

package com.mingqi.test;
import com.mingqi.services.IAccountService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringIoc {
    @Test
    public void TestAccount()
    {
        ApplicationContext ac= new ClassPathXmlApplicationContext("beam.xml");
        IAccountService accountService=(IAccountService) ac.getBean("accountSevice");
        accountService.saveAccount();
        accountService.updateAccount(22);
        accountService.deleteAccount();
    }
}

 

 

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

【其他文章推薦】

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

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

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

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

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

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

Gogoro升級iQ System 智慧系統3.1,搭載韌體升級FOTA新功能

Gogoro Smartscooter 智慧雙輪的車主們,將能再度感受到,他們擁有的不僅是一台電動機車,而是一部不斷進化的雙輪電腦!Gogoro 於16 日正式推出搭載最新功能的「iQ System 智慧系統3.1」,包含空中韌體升級FOTA(Firmware-Over-The-Air)服務。這項科技可讓車主自行利用智慧型手機及Gogoro App 進行遠程升級,只要有穩定的網路訊號,車主都可以DIY 自行操作,無需再花時間返回服務中心。

Gogoro 產品企劃經理王光祖表示:「Gogoro 擁有最先進、穩定、安全的技術, 也是目前台灣二輪車市場中,唯一運用空中韌體升級FOTA 的品牌。Gogoro 的車主不但可以透過韌體更新,感受智慧雙輪的聰明程度,更可隨著技術與功能的改進而持續升級,時時感受車子越騎越新的快感。」

這是繼Gogoro 去年11月初發表「iQ System 智慧系統3.0」後,更進一步的升級版本。重點在於提供更直覺、方便、有感的使用體驗,包括更長時間的高速騎乘,更充沛的爬坡動力,以及從容地面對天氣變化,是第一台可以針對嚴寒或酷熱的氣候有動態調配溫度保護機制的二輪機車。其中在爬坡動力的改進,目前已經有車主在臉書分享經驗。游先生提到:「一路到山頂都是以前從來沒有過的充沛動力感!」網友Alex Yeh 則表示:「車速感覺不會掉太多,還是會有充沛的動力上山!」

此外,因應部分Gogoro 車主曾發生不小心將手機或智慧鑰匙鎖在置物廂中的問題,之前在「iQ System 智慧系統3.0」時,便已在Gogoro App 中增加「車廂開關設定」的選項,置物箱打開後若在90 秒內關上時,就可以自動解鎖。 此次更新則更加優化了這個貼心的功能,即使在交換電池後,只要在放回電池的90 秒內關上座墊,一樣會自動解鎖,不需再次掏出智慧鑰匙即可上路,讓交換電池的過程更加流暢。

(合作媒體:。圖片出處:Gogoro)

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

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

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

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

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

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

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

linux環境下搭建Jenkins持續集成(Jenkins+git+shell+maven+tomact)

準備環境

  jenkins.war包 ,jdk1.8  ,tomact , maven,git

1.Jenkins  war包,下載地址https://jenkins.io/zh/download/  ,當然你可以通過wget 下載, 也可以通過xftp遠程傳輸

2. jdk1.8   配置方法步驟詳見 https://www.cnblogs.com/xinhua19/p/12708493.html

3.tomact包   下載地址  https://tomcat.apache.org/download-90.cgi

 

 

 4.git包, 安裝配置方法詳情見 https://www.cnblogs.com/xinhua19/p/12721342.html

5.maven包    https://maven.apache.org/download.cgi

 

 

 

 

 

1,準備環境準備完畢

解壓縮JAVA包,存放在/usr目錄

解壓縮tomact包 ,存入/usr目錄

啟動tomact成功后,停止tomact          ./catalina.sh run    ./start.sh          sh shutdown.sh

將jenkins.war包存放在tomact下webapps的目錄中 

啟動tomact

 

IP+端口號/Jenkins   訪問jenkins

部署tomact后啟動jenkins  

2.初次啟動時 準備所需插件比較慢 需要等待很久

 

 

 

 

 

 

全部準備完成后

 這一步是Jenkins的漢化

 

 

 

 

 

 

Jenkins搭建成功啦,現在剩下的就是Jenkins的各個配置

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

【其他文章推薦】

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

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

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

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

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

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

南京金龍加碼純電動物流車 四款新品將在振威新能源汽車展亮相

近年來,在電子商務快速發展的強勢需求拉動下,中國電商物流繼續保持快速增長。在環境壓力較大的當下,物流行業推行新能源汽車也成了改善環境,治理霧霾的一個重要手段。

在新能源物流車形勢一片大好的情況下,新能源客車產品在細分市場銷量第二把交椅的南京金龍自然也不會錯過這一片藍海。據瞭解,南京金龍將於2017上海國際新能源汽車產業博覽會上推出四款新品純電動物流車。展會由振威展覽股份、中國土木工程學會城市公共交通學會、廣東省新能源汽車產業協會、廣東省充電設施協會及充電設施線上網聯合舉辦,將於2017年8月23-25日在上海新國際博覽中心舉行。

據瞭解,本次南京金龍四款純電動物流車型分別為開沃D07、開沃D09、開沃D10和開沃D11。此四款物流車涵蓋3.9-5.9米的中小型物流車,且秉承其一貫的強勁續航能力,滿載續航均在220-260公里,是名副其實的續航之王。其中開沃D07為微型純電動物流車,主要用於城市內的快遞派送。作為“最後一公里”快遞配送專家,其載貨空間達3.4立方米,載貨量可達600KG,完美滿足市網點到客戶的快遞配送。開沃D09、D10為輕型純電動物流車,載貨空間分別在6立方米和8立方米,載重分別為750kg和1000kg,主要用作城市間的物流配送“貨的”。

開沃D7純電動物流車

去年,南京金龍就推出了素有“快遞王”之稱的開沃E7,“物流王”開沃D11,早已以其380公里左右的高續航、1.55噸的高載重、12.3個立方的高容量等特點,4小時繞北京五環三圈贏得了新能源物流車界的良好口碑。D11作為城市大空間長續航的物流王更是經受市場考驗超過3年、以好品質得到客戶認可和擁護的車型,輕鬆勝任城市間的物流運輸。

3月1日,工信部官網正式公佈了《新能源汽車推廣應用推薦車型目錄(2017年第2批)》主要車型及參數。此次發佈的目錄涉及新能源乘用車、新能源客車及新能源專用車共有40家企業201款車型進入目錄。其中,南京金龍開沃牌NJL5040XXYBEV1純電動廂式運輸車入圍本次目錄。

資料顯示,2016年純電動物流車產量達5.78萬輛,且2017年剛開始,工信部就給電動物流車行業一個驚喜。首批新能源汽車推薦目錄發佈,以電動物流車為代表的專用車型共有36款,占總比19%。“新能源物流車正成為新能源商用車發展的一大亮點。”全國乘聯會秘書長崔東樹也指出,新能源物流車使用費用低,維(護)修簡單,從國家政策的扶持以及城市空氣污染的角度來看,新能源物流車急劇增長是必然的,也是長期的發展趨勢。

據不完全統計,北京、上海、廣東、天津等37省市出臺的新能源汽車政策裡都有提及純電動物流車的相關政策。隨著政策的明朗,行業逐漸趨於理性,純電動物流車市場迎來健康發展,其也將迎來真正的發展元年。業界普遍認為,2017年電動物流車行業預計將實現10萬輛左右的銷量,同比增速超過100%。

南京金龍市場負責人表示,本次展會的召開是一個很好的契機,南京金龍開沃純電動物流車憑藉靈活多變的空間及穩定的滿負荷續航里程,將極大地改變我國新能源物流車產業發展格局。未來,南京金龍憑藉產品技術優勢,不斷開拓物流、快遞行業需求,為全面實現“零排放物流”的行業大計而持續努力。

組委會聯繫方式:+86 20-83953286
連絡人:黃俊鵬
官方微信公眾號:nevechina

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

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

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

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

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

※回頭車貨運收費標準

編碼的道與禪

該文章發布在github中,如果您覺得寫的還不錯的話,可以 star 一下進行支持,傳送門:TechShare。

Bob 大叔在《代碼整潔之道》一書的前言打趣着說,當你寫的代碼在經受代碼審查時,如果審查者憤怒的吼道“What the fuck is this shit?”等言辭激烈的詞語時,那說明你寫的是 Bad Code;如果審查者只是漫不經心的吐出幾個“What the fuck?”,那說明你寫的是 Good Code。這就是衡量代碼質量的唯一標準——每分鐘罵出“What the fuck?”的頻率。

想寫出整潔的代碼很難,有一部分原因在於糟糕的代碼太容易編寫。想快點完成任務時,考慮不周全時,忽略安全時,隨意命名時,參數過多時,嵌套太深時,未及時更改註釋時,違反法則時,重複你自己時等等情形,我們有太多的機會來製造糟糕的代碼。只有嚴肅對待自己的代碼,了解哪些事情會使我們的代碼變味,才有可能寫出整潔的代碼。

寫代碼和寫文章在某種程度上有相似之處,好的文章一定有好的可讀性,寫代碼也一樣,只有優美乾淨的代碼才能具有良好的可讀性。編寫具有可讀性的代碼不光是保持有意義的命名就行,如果你想成為一名更好的程序員,寫代碼時你需要注意的有很多,比如:

  1. 規範本地變量的位置
  2. 使函數盡量短小
  3. 調用者盡可能放在被調用者上面
  4. 保持代碼擁有良好的格式
  5. 編寫只做一件事的函數
  6. 函數參數不要超過三個
  7. 暴露時序耦合
  8. 使用異常代替返回錯誤碼

除此之外,你還須牢記眾多設計原則,如:

  1. 開放封閉原則(OCP)
  2. 迪米特法則
  3. 依賴倒置原則(DIP)
  4. 單一職責原則(SRP)
  5. 里氏替換原則(LSP)
  6. 不要重複(DRY)
  7. 你不會需要它(YAGNI)

當然僅有這些是不夠的,這不是騎自行車,學寫整潔代碼得花許多功夫,必須不斷實踐,從失敗中提取代碼的壞味道並從中得到啟發。

編寫整潔代碼,你需要牢記並遵守很多東西,但這並不是循規蹈矩和刻板,而是對簡單之美、代碼之美的追求。代碼整潔之道,是編寫優秀代碼的一種方法,其核心是儘力使代碼保持簡單——Keep It Simple, Stupid。判斷一個人寫的代碼的好壞,不是看它的代碼寫的有多複雜,而是看他有沒有把複雜的事物抽象出來並用簡單的方式去描述它,此外這個人對代碼的態度也至關重要,大多數時候我們並不能從一開始就把代碼寫的很完美,當我們需要快速做出一個原型,或者一開始代碼看起來不錯,但新的需求使現有的設計無法滿足,如果不對設計進行改動的話,那麼代碼就會變的醜陋,如果你熱愛自己正在做的事情,崇尚代碼之美,那麼你就會有足夠的動力去重構它、完善它,而不是破壞結構使代碼腐爛。

保持簡單、追求簡單,我想這就是編碼之中的禪意,一種追求本真的境界。這種禪在 Python 的設計哲學中體現的淋漓盡致,讓我們在 Python 解釋器中輸入“import this”,來看看經典的 Python 之禪。

  • Beautiful is better than ugly.
    優美勝於醜陋。
  • Explicit is better than implicit.
    顯式勝於隱式。
  • Simple is better than complex.
    簡單勝於複雜。
  • Complex is better than complicated.
    複雜勝於難懂。
  • Flat is better than nested.
    扁平勝於嵌套。
  • Sparse is better than dense.
    分散勝於密集。
  • Readability counts.
    可讀性應當被重視。
  • Special cases aren’t special enough to break the rules. Although practicality beats purity.
    儘管實用性會打敗純粹性,特例也不能凌駕於規則之上。
  • Errors should never pass silently. Unless explicitly silenced.
    除非明確地使其沉默,錯誤永遠不應該默默地溜走。
  • In the face of ambiguity, refuse the temptation to guess.
    面對不明確的定義,拒絕猜測的誘惑。
  • There should be one– and preferably only one –obvious way to do it.
    用一種方法,最好只有一種方法來做一件事。
  • Although that way way not be obvious at first unless you’re Dutch.
    雖然一開始這種方法並不是顯而易見的,但誰叫你不是Python之父呢。
  • Now is better than never. Although never is often better than right now.
    做比不做好,但立馬去做有時還不如不做。
  • If the implementation is hard to explain, it’s a bad idea.
    如果實現很難說明,那它是個壞想法。
  • If the implementation is easy to explain, it may be a good idea.
    如果實現容易解釋,那它有可能是個好想法。
  • Namespaces are one honking great idea – let’s do more of those!
    命名空間是個絕妙的想法,讓我們多多地使用它們吧!

道着重於方法,禪着重於態度,讓我們把這兩者相結合,做一個有追求的程序員,為成為軟件匠人而奮鬥吧。

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

【其他文章推薦】

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

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

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

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

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

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