西門子聯手法雷奧打造電動汽車動力總成領域的全球領導企業

西門子日前與法雷奧集團簽訂協定,雙方將共同組建一家從事高壓動力總成業務的合資企業,從而在創新和經濟型高壓元件及系統業務領域佔據全球領導地位。該合資企業的產品可搭載於各類電動汽車——包括混合動力、插電式混合動力和全電動汽車。在得到相關部門許可後,該合資公司預計將於 2016 年第四季度投入運營。

法雷奧將向合資公司注入包括其動力總成系統集團(PTS)旗下的高壓電力電子業務部門的 200 名員工,其中 90 人位於法國。西門子方面則由其電動汽車動力傳動業務部門為合資公司調配 500 名員工,其中 370 人位於德國,130 人在中國。合資公司將全權負責開發、銷售和生產電氣化乘用車和輕型商用車所需的 60 V以上的高壓電機和電力電子產品。合資公司能提供更加廣泛的產品線,從混合動力傳動模組和解決方案(包括電機、增程器、DC/DC 變流器、逆變器和充電器),到全電氣化動力系統等。

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

【其他文章推薦】

※專營大陸空運台灣貨物推薦

台灣空運大陸一條龍服務

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

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

前後端分離,我怎麼就選擇了 Spring Boot + Vue 技術棧?

前两天又有小夥伴私信松哥,問題還是職業規劃,Java 技術棧路線這種,實際上對於這一類問題我經常不太敢回答,每個人的情況都不太一樣,而小夥伴也很少詳細介紹自己的情況,大都是一兩句話就把問題拋出來了,啥情況都不了解,就要指出一個方向,這實在是太難了。

因此今天我想從我學習 Spring Boot + Vue 這套技術棧的角度,來和大家聊一聊沒有人指導,我是如何一步一步建立起自己的技術體系的。

線上大家看我經常寫文章,線下我其實比較宅,跟人交流比較少,我也很少問別人職業規劃或者技術規劃這些問題,因為這種學什麼的問題,我喜歡自己把握,我不太喜歡被別人牽着走。

Rome was not built in a day,剛開始接觸 Spring Boot + Vue 時,我甚至都沒有一個明確的想法,只是覺得該學點什麼,不能讓時間浪費,沒有告訴我 Spring Boot 要火了,也沒有人告訴我 Vue 要超過 React 了,都是我自己一直在摸索摸索,一步一步,直到構建起這套技術大廈。

Spring Boot

先說說 Spring Boot 吧,三年前差不多也是這個時候,是我第一次接觸 Spring Boot ,那個時候我的正式身份還是一名 Android 工程師,那段時間在研究 Android7 的源碼,還寫了一些博客:

但是那個時候 Android 的行情在慢慢下滑,而我剛畢業 1 年多,未來還有更加豐富的技術人生,我不願意這麼早就把技術棧定死,而且還定在一個行情日漸下滑的技術棧上。所以我打算學一點新的東西。

Python、Go、前端 和 Java 都是備選的方向,但是最終還是選擇繼續做 Java,有三個原因:

  • 做 Java 當時可以在公司內部轉崗,做 Python 或者 Go 的話,可能就得換工作了,技術棧切換,一切從頭開始,當時心裏還是沒底,於是就選擇繼續做 Java
  • 剛好大學的時候也有 JavaEE 的底子,重新撿起來 JavaEE 相關的技術點倒也不是啥難事
  • 第三點也是最重要的一點,我一直希望能夠獨立接點私活,這樣有一天賺錢能夠不受工作地點的限制,基於這樣的初衷,我一直希望走全棧的路線,用 Python 和 Go 雖然也可以做企業級應用,但是在目前的技術環境下,這並不算是主流方案,主流方案依然是 Java ,雖然它被被多人吐槽

基於以上三點,我決定還是走 Java 的方向吧。

2016 年那會,CSDN 幾乎每個月送我一本技術圖書,10 月份的圖書我就和夢鴿美女要了一本 Spring Boot 相關的書,書到了之後,一直在忙各種事情沒時間看,到了當年 12 月份的時候,公司安排我去深圳出差,出差的話,每天下班后時間就比較充裕了,於是我就帶上了書,每天下班回到酒店,就開始搞 Spring Boot。

一開始我就發現這玩意相比我大學時候搞得 XML 配置的 SSM 太好用了,還是 SSM 那套東西,但是有了自動化配置,不用再去寫讓人頭大的 XML 配置了,可以基於 Spring Boot 快速搞一個 SSM 應用出來。不過剛開始學的時候我還不知道 Spring Boot 在 Java 領域如此火爆,當我寫了幾篇博客之後,我發現每篇博客的閱讀量都暴漲,遠遠高於其他博客的閱讀,我隱隱約約感覺到這次稀里糊塗的技術棧切換,算是沒走錯路。

不過老實說,Spring Boot 技術棧其實不算難,都是 SSM 那一套東西,只是多了自動化配置(當然,Spring Boot 也有不少自己的東西,不過整體上基於 SSM 這點應該沒啥爭議),我剛開始搞 Spring Boot 的時候,有時候會有一些東西看的雲里霧裡,後來發現問題出在 Spring + SpringMVC 上,好幾年不寫 JavaEE,這些東西有一點點生疏了,後來又花了一些時間把 SSM 這些東西系統過了一遍,然後再去看 Spring Boot 就順暢多了。

所以有一些小夥伴問松哥能不能跳過 SSM 直接學習 Spring Boot,這個我不建議,大家在 Spring Boot 中見到的很多神奇的自動化配置大部分都是基於 Spring 現有功能實現的,要是不懂實現原理,你會發現 Spring Boot 用得時候雖然好用,但是出了問題,你就束手無策了。

就這樣,跳入了 Spring Boot 的坑裡了。Spring Boot 學完沒多久,工作上,馬上要從 Android 切換到 JavaEE 了,亟需一個項目練練手,當時我的上司給我介紹了一個西藏大學的項目,我使用 Spring Boot+EasyUI 的技術棧花了不到一個禮拜做完了,從此就算是叩開了 JavaEE 的大門,那會是 2017 年。

當時前端選擇 EasyUI 也是沒辦法,甲方催得緊,而我來不及搞其他的前端框架,當時只有 EasyUI 熟悉一些,不用花時間學,直接就能用,於是就選擇了 EasyUI,但是 EasyUI 太丑了,所以在做完西藏大學的項目后,我就一直思量着再整一個專業的前端框架,這樣以後再有私活,我就可以獨立做出來一個好看的後端管理系統了。

就這樣,在綜合對比了 Vue、React 以及 Angular 之後,決定跳入 Vue 的坑。

Vue

前端其實還算接觸的比較早,最早的 jQuery Mobile,PhoneGap 上大學的時候就玩過,我的第一本 NodeJS 的書是在 2013 年買的,那個時候 NodeJS 還算是一個比較新的事物。當我還是一名 Android 工程師的時候,我就玩過 React 和 ReactNative,RN 是當時比較流行的一個跨平台解決方案。但是在我比較這三個技術棧的時候,我發現 Vue 更加好用,生態也更加豐富,而且大有超過 React 的架勢(當時 Vue 在 GitHub 上的 star 數還沒超過 React),於是我就選擇了 Vue。其實當時我心裏想,大不了學完 Vue 再學 React,反正我才剛畢業兩年多,沒必要這麼早就鎖定技術棧停止學習。

Vue 的學習確實不費啥事,花了兩三天時間刷了一遍官網,然後就開始做項目,但是要去深入學習,又是一個漫長的過程了。

Vue 有很多漂亮的 UI 庫,像 ElementUI 等都算是做的比較好的,這些東西只要會用其中一個,其他的就可以手到擒來。

到 2018 年初,Spring Boot+Vue 技術棧基本上已經熟悉了,兩個開源項目 V 部落()和微人事()也受到小夥伴們的歡迎,常規的企業級應用可以一個人獨立完成了,5 月份的時候,經朋友介紹,接了哈爾濱工程大學一位老師的項目,毫無疑問我就使用了最擅長的 Spring Boot+Vue 技術棧來做了,前後端都是自己做,沒人扯皮,美滋滋。

再後來,就是寫書(),業餘繼續搞點項目用 Spring Boot + Vue 來做,這些以前都和大家聊過我就不再多說了,業餘接點項目來做這塊倒是有一些經驗,以後和小夥伴們細聊。

就這樣,沒有任何人的指引,我慢慢構建了 Spring Boot + Vue 這套技術體系,這個過程中,最大的學習經驗就是要寫博客,做筆記,寫博客不僅僅是記錄,也是總結提煉,在寫的過程中,融入自己的思考,加深對技術的理解。 掌握了這套技術棧之後,我覺得我離全棧又更近了一步,離賺錢不受工作地點的限制這個目標也更近一步了。

結語

有前輩大佬的指引,你可能走得快,自己摸索,走的踏實。其實從我第一天自學 Java 開始,基本上都是一直在摸索。大學時候一個 BUG 折騰兩三天才解決,但是一旦自己想明白解決了,以後類似的錯誤不會再犯,這是我的感受。

好了,一點點學習經驗,和小夥伴們分享,要是覺得有啟發,歡迎轉發哦。

掃碼關注松哥,公眾號後台回復 2TB,獲取松哥獨家 超2TB 學習資源

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

【其他文章推薦】

※專營大陸空運台灣貨物推薦

台灣空運大陸一條龍服務

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

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

為讓包裝環保可回收 民眾寄洋芋片空包裝施壓

摘錄自2018年9月27日自由時報報導

綜合外媒報導,21日一名英國環保人士艾希克羅(Geraint Ashcroft)表示,英國人每年吃下60億包袋裝的洋芋片,且洋芋片的包裝是一次性不可回收,對環境會造成非常嚴重的損害,於是在推特上發起將洋芋片包裝寄回洋芋片公司的活動,許多民眾紛紛響應,將寄回洋芋片的照片放上推特,希望讓百事公司的洋芋片子公司「Walkers」正視環保問題。

「Walkers」發言人出面回應,表示的確收到許多民眾郵寄的空包裝,也意識到塑料包裝會造成環境問題,公司目前已將收到的空包裝用於研究其他包裝的可回收性,總公司並承諾道「2025年所有包裝將可100%回收、堆肥或生物分解」。

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

【其他文章推薦】

※專營大陸空運台灣貨物推薦

台灣空運大陸一條龍服務

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

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

駱駝集團8億元進軍新能源汽車動力電池領域

近日,駱駝集團股份有限公司公開發行可轉換公司債券預案,本次公開發行可轉換公司債券募集資金總額不超過 90,000 萬元,扣除發行費用後,募集資金用於以下項目:

駱駝集團此次5.5億用於建設年產7億Wh動力電池生產線可以看作是駱駝集團進軍電動汽車動力電池領域的信號。

早在今年三月,駱駝集團動力電池專案就已經正式開工建設,總投資高達20億元人民幣,預計建成後年產能達到50億瓦時鋰離子電池,並將大量供應給新能源汽車主機廠。不僅於此,駱駝集團還先後於2015年佈局了充電設施建設、新能源汽車租賃業務等新能源配套產業鏈。可見,駱駝集團在新能源汽車領域已籌畫多時,此次轉換公司債券預案的發佈只是一個開端,下一步還將會有新能源動力電池方面的大動作。

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

【其他文章推薦】

※專營大陸空運台灣貨物推薦

台灣空運大陸一條龍服務

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

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

SpringBoot系列教程JPA之指定id保存

原文鏈接:

前幾天有位小夥伴問了一個很有意思的問題,使用 JPA 保存數據時,即便我指定了主鍵 id,但是新插入的數據主鍵卻是 mysql 自增的 id;那麼是什麼原因導致的呢?又可以如何解決呢?

本文將介紹一下如何使用 JPA 的 AUTO 保存策略來指定數據庫主鍵 id

I. 環境準備

實際開始之前,需要先走一些必要的操作,如安裝測試使用 mysql,創建 SpringBoot 項目工程,設置好配置信息等,關於搭建項目的詳情可以參考前一篇文章

下面簡單的看一下後續的代碼中,需要的配置 (我們使用的是 mysql 數據庫)

1. 表準備

沿用前一篇的表,結構如下

CREATE TABLE `money` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL DEFAULT '' COMMENT '用戶名',
  `money` int(26) NOT NULL DEFAULT '0' COMMENT '錢',
  `is_deleted` tinyint(1) NOT NULL DEFAULT '0',
  `create_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',
  `update_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間',
  PRIMARY KEY (`id`),
  KEY `name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

2. 項目配置

配置信息,與之前有一點點區別,我們新增了更詳細的日誌打印;本篇主要目標集中在添加記錄的使用姿勢,對於配置說明,後面單獨進行說明

## DataSource
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/story?useUnicode=true&characterEncoding=UTF-8&useSSL=false
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=
## jpa相關配置
spring.jpa.database=MYSQL
spring.jpa.hibernate.ddl-auto=none
spring.jpa.show-sql=true
spring.jackson.serialization.indent_output=true
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

II. Insert 教程

首先簡單的看一下,我們一般使用默認的數據庫自增生成主鍵的使用方式,以便後面的自定義主鍵生成策略的對比

對於 jpa 的插入數據的知識點不太清楚的同學,可以看一下之前的博文:

1. 自增主鍵

首先我們需要定義 PO,與數據庫中的表綁定起來

@Data
@DynamicUpdate
@DynamicInsert
@Entity
@Table(name = "money")
public class MoneyPO {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Integer id;

    @Column(name = "name")
    private String name;

    @Column(name = "money")
    private Long money;

    @Column(name = "is_deleted")
    private Byte isDeleted;

    @Column(name = "create_at")
    @CreatedDate
    private Timestamp createAt;

    @Column(name = "update_at")
    @CreatedDate
    private Timestamp updateAt;
}

注意上面的主鍵生成策略用的是 GenerationType.IDENTITY,配合 mysql 的使用就是利用數據庫的自增來生成主鍵 id

/**
 * 新增數據
 * Created by @author yihui in 11:00 19/6/12.
 */
public interface MoneyCreateRepositoryV2 extends JpaRepository<MoneyPO, Integer> {
}

接下來保存數據就很簡單了

private void addWithId() {
    MoneyPO po1 = new MoneyPO();
    po1.setId(20);
    po1.setName("jpa 一灰灰 1x");
    po1.setMoney(2200L + ((long) (Math.random() * 100)));
    po1.setIsDeleted((byte) 0x00);
    MoneyPO r1 = moneyCreateRepositoryV2.save(po1);
    System.out.println("after insert res: " + r1);
}

強烈建議實際的體驗一下上面的代碼執行

首次執行確保數據庫中不存在 id 為 20 的記錄,雖然我們的 PO 對象中,指定了 id 為 20,但是執行完畢之後,新增的數據 id 卻不是 20

Hibernate: select moneypo0_.id as id1_0_0_, moneypo0_.create_at as create_a2_0_0_, moneypo0_.is_deleted as is_delet3_0_0_, moneypo0_.money as money4_0_0_, moneypo0_.name as name5_0_0_, moneypo0_.update_at as update_a6_0_0_ from money moneypo0_ where moneypo0_.id=?
Hibernate: insert into money (is_deleted, money, name) values (?, ?, ?)
after insert res: MoneyPO(id=104, name=jpa 一灰灰 1x, money=2208, isDeleted=0, createAt=null, updateAt=null)

上面是執行的 sql 日誌,注意插入的 sql,是沒有指定 id 的,所以新增的記錄的 id 就會利用 mysql 的自增策略

當我們的 db 中存在 id 為 20 的記錄時,再次執行,查看日誌發現實際執行的是更新數據

Hibernate: select moneypo0_.id as id1_0_0_, moneypo0_.create_at as create_a2_0_0_, moneypo0_.is_deleted as is_delet3_0_0_, moneypo0_.money as money4_0_0_, moneypo0_.name as name5_0_0_, moneypo0_.update_at as update_a6_0_0_ from money moneypo0_ where moneypo0_.id=?
Hibernate: update money set create_at=?, money=?, name=?, update_at=? where id=?
after insert res: MoneyPO(id=20, name=jpa 一灰灰 1x, money=2234, isDeleted=0, createAt=null, updateAt=null)

大膽猜測,save 的執行過程邏輯如

  • 首先根據 id 到數據庫中查詢對應的數據
  • 如果數據不存在,則新增(插入 sql 不指定 id)
  • 如果數據存在,則判斷是否有變更,以確定是否需要更新

2. 指定 id

那麼問題來了,如果我希望當我的 po 中指定了數據庫 id 時,db 中沒有這條記錄時,就插入 id 為指定值的記錄;如果存在記錄,則更新

要實現上面這個功能,自定義主鍵 id,那麼我們就需要修改一下主鍵的生成策略了,官方提供了四種

取值 說明
GenerationType.TABLE 使用一個特定的數據庫表格來保存主鍵
GenerationType.SEQUENCE 根據底層數據庫的序列來生成主鍵,條件是數據庫支持序列
GenerationType.IDENTITY 主鍵由數據庫自動生成(主要是自動增長型)
GenerationType.AUTO 主鍵由程序控制

從上面四種生成策略說明中,很明顯我們要使用的就是 AUTO 策略了,我們新增一個 PO,並指定保存策略

@Data
@DynamicUpdate
@DynamicInsert
@Entity
@Table(name = "money")
public class AutoMoneyPO {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "myid")
    @GenericGenerator(name = "myid", strategy = "com.git.hui.boot.jpa.generator.ManulInsertGenerator")
    @Column(name = "id")
    private Integer id;

    @Column(name = "name")
    private String name;

    @Column(name = "money")
    private Long money;

    @Column(name = "is_deleted")
    private Byte isDeleted;

    @Column(name = "create_at")
    @CreatedDate
    private Timestamp createAt;

    @Column(name = "update_at")
    @CreatedDate
    private Timestamp updateAt;
}

採用自定義的生成策略,需要注意,@GenericGenerator(name = "myid", strategy = "com.git.hui.boot.jpa.generator.ManulInsertGenerator")這個需要有,否則執行會拋異常

這一行代碼的意思是,主鍵 id 是由ManulInsertGenerator來生成

/**
 *  自定義的主鍵生成策略,如果填寫了主鍵id,如果數據庫中沒有這條記錄,則新增指定id的記錄;否則更新記錄
 *
 *  如果不填寫主鍵id,則利用數據庫本身的自增策略指定id
 *
 * Created by @author yihui in 20:51 19/11/13.
 */
public class ManulInsertGenerator extends IdentityGenerator {

    @Override
    public Serializable generate(SharedSessionContractImplementor s, Object obj) throws HibernateException {
        Serializable id = s.getEntityPersister(null, obj).getClassMetadata().getIdentifier(obj, s);

        if (id != null && Integer.valueOf(id.toString()) > 0) {
            return id;
        } else {
            return super.generate(s, obj);
        }
    }
}

具體的主鍵生成方式也比較簡單了,首先是判斷 PO 中有沒有主鍵,如果有則直接使用 PO 中的主鍵值;如果沒有,就利用IdentityGenerator策略來生成主鍵(而這個主鍵生成策略,正好是GenerationType.IDENTITY利用數據庫自增生成主鍵的策略)

接下來我們再次測試插入

// 使用自定義的主鍵生成策略
AutoMoneyPO moneyPO = new AutoMoneyPO();
moneyPO.setId(20);
moneyPO.setName("jpa 一灰灰 ex");
moneyPO.setMoney(2200L + ((long) (Math.random() * 100)));
moneyPO.setIsDeleted((byte) 0x00);
AutoMoneyPO res = moneyCreateRepositoryWithId.save(moneyPO);
System.out.println("after insert res: " + res);

moneyPO.setMoney(3200L + ((long) (Math.random() * 100)));
res = moneyCreateRepositoryWithId.save(moneyPO);
System.out.println("after insert res: " + res);

moneyPO = new AutoMoneyPO();
moneyPO.setName("jpa 一灰灰 2ex");
moneyPO.setMoney(2200L + ((long) (Math.random() * 100)));
moneyPO.setIsDeleted((byte) 0x00);
res = moneyCreateRepositoryWithId.save(moneyPO);
System.out.println("after insert res: " + res);

上面的代碼執行時,確保數據庫中沒有主鍵為 20 的數據,輸出 sql 日誌如下

# 第一次插入
Hibernate: select automoneyp0_.id as id1_0_0_, automoneyp0_.create_at as create_a2_0_0_, automoneyp0_.is_deleted as is_delet3_0_0_, automoneyp0_.money as money4_0_0_, automoneyp0_.name as name5_0_0_, automoneyp0_.update_at as update_a6_0_0_ from money automoneyp0_ where automoneyp0_.id=?
Hibernate: insert into money (is_deleted, money, name, id) values (?, ?, ?, ?)
after insert res: AutoMoneyPO(id=20, name=jpa 一灰灰 ex, money=2238, isDeleted=0, createAt=null, updateAt=null)

# 第二次指定id插入
Hibernate: select automoneyp0_.id as id1_0_0_, automoneyp0_.create_at as create_a2_0_0_, automoneyp0_.is_deleted as is_delet3_0_0_, automoneyp0_.money as money4_0_0_, automoneyp0_.name as name5_0_0_, automoneyp0_.update_at as update_a6_0_0_ from money automoneyp0_ where automoneyp0_.id=?
Hibernate: update money set create_at=?, money=?, update_at=? where id=?
after insert res: AutoMoneyPO(id=20, name=jpa 一灰灰 ex, money=3228, isDeleted=0, createAt=null, updateAt=null)

# 第三次無id插入
Hibernate: insert into money (is_deleted, money, name) values (?, ?, ?)
after insert res: AutoMoneyPO(id=107, name=jpa 一灰灰 2ex, money=2228, isDeleted=0, createAt=null, updateAt=null)

注意上面的日誌輸出

  • 第一次插入時拼裝的寫入 sql 是包含 id 的,也就達到了我們指定 id 新增數據的要求
  • 第二次插入時,因為 id=20 的記錄存在,所以執行的是更新操作
  • 第三次插入時,因為沒有 id,所以插入的 sql 中也沒有指定 id,使用 mysql 的自增來生成主鍵 id

II. 其他

0. 項目&博文

  • 工程:
  • module:

1. 一灰灰 Blog

盡信書則不如,以上內容,純屬一家之言,因個人能力有限,難免有疏漏和錯誤之處,如發現 bug 或者有更好的建議,歡迎批評指正,不吝感激

下面一灰灰的個人博客,記錄所有學習和工作中的博文,歡迎大家前去逛逛

  • 一灰灰 Blog 個人博客
  • 一灰灰 Blog-Spring 專題博客

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

【其他文章推薦】

※專營大陸空運台灣貨物推薦

台灣空運大陸一條龍服務

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

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

Gogoro騎進中台灣!台中據點開幕,市府再祭補助措施

台灣智慧雙輪電動機車Gogoro持續開疆拓土,正式啟用台中門市與維修中心。在6月4日的啟用典禮同時,台中市府也表示將繼續推出相關補助措施,積極鼓勵民眾改用綠能載具,打造智慧低碳城市。

繼CITY POWER、EZ SWAP之後,Gogoro是第三家進駐大台中市的電池交換型電動機車系統,除開設門市與維修中心外,預計將在六月底前於台中設置近30座電池交換站,方便騎士使用。

打造智慧城市,Gogoro積極拓點

Gogoro致力於以「智慧雙輪」產品打造智慧城市,並從台北開始,透過成立服務據點、電池交換站等,陸續打開市場規模。去年11月、12月間,Gogoro先與超商業者取得合作,在部分台北超商門市設置電池交換據點GoStation,之後也在桃、竹設點,啟用電池交換站,把服務範圍擴大到整個雙北市、桃竹地區。

目前,Gogoro在全台已有接近8,000位車主,服務據點15處,電池交換站超過200座。

Gogoro執行長暨共同創辦人陸學森表示,截至6月4日為止已有超過2,000為台中市民參加Gogoro試乘活動,且已有200多位消費者搶先預購。未來,Gogoro將積極在台中佈建GoStation電池交換站,六月底前預計將建置30處交換據點。此外,7-Eleven、萊爾富與全家都將成為超商合作夥伴。

台中市民享早鳥優惠、市府補貼

Gogoro表示,六月底前下定的台中市車主將可獲得Gogoro提供的早鳥三好禮──後擋泥板、防滑踏墊、清潔組,價值新台幣2,300元。此外,全台各地的六月新車主只要選用599元的能源服務方案,前六個月可享有1,200公里的免費里程。

對於Gogoro進軍台中,台中市府表示也將持續推動綠能交通,繼續在市府洽公處、大專院校等公共空間設置電動機車電池交換站,或者透過增加電動機車專屬停車格等方式來鼓勵電動機車的使用。

此外,台中市府已通過〈臺中市公私場所管制生煤及禁用石油焦自治條例〉,四年內目標減少生煤使用量40%,以及相關減碳措施。針對電動機車,台中市府除上述增加電池交換點等措施外,也將繼續提供換車、購車補貼。市府經發局長呂曜志表示,凡台中市民汰換二行程改購重型電動機車者,市府環保局就補助新台幣一萬元,中央政府環保署也將補助新台幣7,000元。

(照片來源:Gogoro官網)

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

【其他文章推薦】

※專營大陸空運台灣貨物推薦

台灣空運大陸一條龍服務

TCP time_wait close_wait問題(可能是全網最清楚的例子)

背景

公司群里,運維發現一個問題,task服務報錯(如下)

The stream or file \"/data/logs/adn_task/offer_service.log\" could not be opened:
failed to open stream: Too many open files

測試老大看到了,根據經驗就推測是應該是文件句柄使用完了,應該有TCP連接很多沒釋放,果真發現是很多CLOSE_WAIT的狀態

簡單認知

短鏈接,一次鏈接就會佔用一個端口,一個端口就是一個文件描述符;
文件描述符 又稱 句柄,linux系統最大的句柄數是65535,可以通過ulimit -a 查看

三次握手

TCP建立連接需要經過三次握手;
通俗版本:
A: 你好,你能聽見我說話嗎?
B: 能聽到,你能聽到我說話嗎?
A:我也能聽到,我們開始通信吧

專業版本:
建立TCP連接時,需要客戶端和服務器共發送3個包。

  • 第一次:客戶端發送初始序號x和syn=1請求標誌
  • 第二次:服務器發送請求標誌syn,發送確認標誌ACK,發送自己的序號seq=y,發送客戶端的確認序號ack=x+1
  • 第三次:客戶端發送ACK確認號,發送自己的序號seq=x+1,發送對方的確認號ack=y+1

四次揮手

TCP連接斷開需要經過四次揮手;
通俗版本:
前提A和B在通話
A:好的,我的話就說完了(FIN);
B:哦哦,我知道你說完啦(ACK),我還有說兩句哈;A: (沒說話,一直聽着)
B:哦了,我也說完了(FIN)
A:好的,我也知道你說玩了(ACK),掛電話吧

專業版本:

  • 第一次揮手:客戶端發出釋放FIN=1,自己序列號seq=u,進入FIN-WAIT-1狀態
  • 第二次揮手:服務器收到客戶端的后,發出ACK=1確認標誌和客戶端的確認號ack=u+1,自己的序列號seq=v,進入CLOSE-WAIT狀態
  • 第三次揮手:客戶端收到服務器確認結果后,進入FIN-WAIT-2狀態。此時服務器發送釋放FIN=1信號,確認標誌ACK=1,確認序號ack=u+1,自己序號seq=w,服務器進入LAST-ACK(最後確認態)
  • 第四次揮手:客戶端收到回復后,發送確認ACK=1,ack=w+1,自己的seq=u+1,客戶端進入TIME-WAIT(時間等待)。客戶端經過2個最長報文段壽命后,客戶端CLOSE;服務器收到確認后,立刻進入CLOSE狀態。

狀態流轉圖

實際例子

建立連接

linux上起了一個redis服務

本地起的6379端口

還是同一台機器上,通過python腳本連接該redis服務:

此時網絡連接如下:

關注這兩個網絡連接,第一個是redis-server的,第二是python腳本的,此時都是ESTABLISHED狀態,表示這兩個進程建立了連接

TIME_WAIT情況

現在斷掉python

之前的python的那個連接,是TIME_WAIT狀態
客戶端(主動方)主動斷開,進入TIME_WAIT狀態,服務端(被動方)進去CLOSE狀態,就是沒有显示了

等待2MSL(1分鐘)后,如下:

TIME_WAIT狀態的連接也消失了,TIME_WAIT回收機制,系統ing過一段時間會回收,資源重利用

CLOSE_WAIT情況

先建立連接,如下:

關掉redis服務,service redis stop

之前的redis-server的45370端口連接 進入了FIN_WAIT2狀態,而python端(被動關閉方)就進去了CLOSE_WAIT狀態

等待30s后,在看連接

只有python的那條CLOSE_WAIT

再次操作python端的腳本,再次get

關於6379端口(redis端口)的網絡連接都沒有了

TCP參數設置

如何快速回收TIME_WAIT和FIN_WAIT
/etc/sysctl.conf 包含以下配置項
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
root權限 執行/sbin/sysctl -p使之生效

經驗之談

個人經驗,不一定對,如有錯誤,請指正

  1. 當出現了CLOSE_WAIT大概率是業務代碼問題,代碼中沒有處理服務異常的情況,如上面的例子,python再次請求redis的時候,發現redis掛了,就會主動幹掉CLOSE_WAIT狀態
  2. 出現大量TIME_WAIT的情況,一般是服務端沒有及時回收端口,linux內核參數需要調整優化

參考資料

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

【其他文章推薦】

※專營大陸空運台灣貨物推薦

台灣空運大陸一條龍服務

[ch01-03]神經網絡基本原理

系列博客,原文在筆者所維護的github上:,
點擊star加星不要吝嗇,星越多筆者越努力。

前言

For things I don’t know how to build, I don’t understand.

如果我不能親手搭建起來一個東西,那麼我就不能理解它。 — 美國物理學家理查德·費曼

在互聯網發達的今天,很多知識都可以從網絡上找到,但是網絡上的博客、文章的質量參差不齊,或者重點不明確,或者直接把別人的博客抄襲過來。這種狀況使得廣大的初學者們學習起來很困難,甚至誤入歧途,增加了學習曲線的陡峭程度。當然也有很多博主非常非常負責任,文章質量很高,只是連續度不夠,正看得過癮的時候,沒有後續章節了,無法形成知識體系。

初學者也可以選擇看一些教材或者理論書籍,但是,一個雞生蛋蛋生雞的問題出現了:如果你不懂,那麼看完了理論你還是不會懂;如果你懂了,那麼你就沒必要看理論。這也是很多教材或者理論書籍的缺憾。

筆者也看過吳恩達老師的課,理論知識講得由淺入深,還是非常清楚的,雖然代碼示例基本沒有,但仍然強烈建議大家去看。筆者的心得是:視頻可以事先緩存在手機中,利用一些時間片段就可以學習了。

社會上還有一些網課,在線講解深度學習的知識,筆者也參加了幾個團購,老師和助教一般都很負責任,最後可以回看錄像,下載PPT課件。這些課程一般偏重於工程項目,講解深度學習框架和工具的使用,即教大家如何使用工具建模、訓練等等,也是很有幫助的。但對於初學者來說,理解一個新概念可能需要前面很多個已有知識點的支撐,門檻過高,一下子就變得很沮喪。或者是知其然而不知其所以然,最後淪為調參工程師,職業發展受到了限制。

還是應了那句古話:授人以魚不如授人以漁。經歷了以上那些學習經歷,程序員出身的筆者迫切感覺到應該有一種新的學習體驗,在“做中學”,用寫代碼的方式把一些基礎的理論復現一遍,可以深刻理解其內涵,並能擴充其外延,使讀者得到舉一反三的泛化能力。

筆者總結了自身的學習經歷后,把深度學習的入門知識歸納成了9個步驟,簡稱為9步學習法:

  1. 基本概念
  2. 線性回歸
  3. 線性分類
  4. 非線性回歸
  5. 非線性分類
  6. 模型的推理與部署
  7. 深度神經網絡
  8. 卷積神經網絡
  9. 循環神經網絡

筆者看到過的很多書籍是直接從第7步起步的,其基本假設是讀者已經掌握了前面的知識。但是對於從零開始的初學者們,這種假設並不正確。

在後面的講解中,我們一般會使用如下方式進行:

  1. 提出問題:先提出一個與現實相關的假想問題,為了由淺入深,這些問題並不複雜,是實際的工程問題的簡化版本。
  2. 解決方案:用神經網絡的知識解決這些問題,從最簡單的模型開始,一步步到複雜的模型。
  3. 原理分析:使用基本的物理學概念或者數學工具,理解神經網絡的工作方式。
  4. 可視化理解:可視化是學習新知識的重要手段,由於我們使用了簡單案例,因此可以很方便地可視化。

原理分析和可視化理解也是本書的一個特點,試圖讓神經網絡是可以解釋的,而不是盲目地使用。

還有一個非常重要的地方,我們還有配套的Python代碼,除了一些必要的科學計算庫和繪圖庫,如NumPy和Matplotlib等,我們沒有使用任何已有的深度學習框架,而是帶領大家從零開始搭建自己的知識體系,從簡單到複雜,一步步理解深度學習中的眾多知識點。

對於沒有Python經驗的朋友來說,通過閱讀示例代碼,也可以起到幫助大家學習Python的作用,一舉兩得。隨着問題的難度加深,代碼也會增多,但是前後都有繼承關係的,最後的代碼會形成一個小的框架,筆者稱之為Mini-Framework,可以用搭積木的方式調用其中的函數來搭建深度學習的組件。

這些代碼都是由筆者親自編寫調試的,每章節都可以獨立運行,得到相關章節內所描述的結果,包括打印輸出和圖形輸出。

另外,為了便於理解,筆者繪製了大量的示意圖,數量是同類書籍的10倍以上。一圖頂萬字,相信大家會通過這些示意圖快速而深刻地理解筆者想要分享的知識點,使大家能夠從真正的“零”開始,對神經網絡、深度學習有基本的了解,並能動手實踐。

對於讀者的要求:

  1. 學過高等數學中的線性代數與微分
  2. 有編程基礎,可以不會Python語言,因為可以從示例代碼中學得
  3. 思考 + 動手的學習模式

可以幫助讀者達到的水平:

  1. 可以判斷哪些任務是機器學習可以實現的,哪些是科學幻想,不說外行話
  2. 深刻了解神經網絡和深度學習的基本理論
  3. 培養舉一反三的解決實際問題的能力
  4. 得到自學更複雜模型和更高級內容的能力
  5. 對於天資好的讀者,可以培養研發新模型的能力

符號約定

符號 含義
\(x\) 訓練用樣本值
\(x_1\) 第一個樣本或樣本的第一個特徵值,在上下文中會有說明
\(x_{12},x_{1,2}\) 第1個樣本的第2個特徵值
\(X\) 訓練用多樣本矩陣
\(y\) 訓練用樣本標籤值
\(y_1\) 第一個樣本的標籤值
\(Y\) 訓練用多樣本標籤矩陣
\(z\) 線性運算的結果值
\(Z\) 線性運算的結果矩陣
\(Z1\) 第一層網絡的線性運算結果矩陣
\(\sigma\) 激活函數
\(a\) 激活函數結果值
\(A\) 激活函數結果矩陣
\(A1\) 第一層網絡的激活函數結果矩陣
\(w\) 權重參數值
\(w_{12},w_{1,2}\) 權重參數矩陣中的第1行第2列的權重值
\(w1_{12},w1_{1,2}\) 第一層網絡的權重參數矩陣中的第1行第2列的權重值
\(W\) 權重參數矩陣
\(W1\) 第一層網絡的權重參數矩陣
\(b\) 偏移參數值
\(b_1\) 偏移參數矩陣中的第1個偏移值
\(b2_1\) 第二層網絡的偏移參數矩陣中的第1個偏移值
\(B\) 偏移參數矩陣(向量)
\(B1\) 第一層網絡的偏移參數矩陣(向量)
\(X^T\) X的轉置矩陣
\(X^{-1}\) X的逆矩陣
\(loss,loss(w,b)\) 單樣本誤差函數
\(J, J(w,b)\) 多樣本損失函數

1.3 神經網絡的基本工作原理簡介

1.3.1 神經元細胞的數學模型

神經網絡由基本的神經元組成,圖1-13就是一個神經元的數學/計算模型,便於我們用程序來實現。

圖1-13 神經元計算模型

輸入 input

(x1,x2,x3) 是外界輸入信號,一般是一個訓練數據樣本的多個屬性,比如,我們要預測一套房子的價格,那麼在房屋價格數據樣本中,x1可能代表了面積,x2可能代表地理位置,x3可能朝向。另外一個例子是,假設(x1,x2,x3)分別代表了(紅,綠,藍)三種顏色,而此神經元用於識別輸入的信號是暖色還是冷色。

權重 weights

(w1,w2,w3) 是每個輸入信號的權重值,以上面的 (x1,x2,x3) 的例子來說,x1的權重可能是0.92,x2的權重可能是0.2,x3的權重可能是0.03。當然權重值相加之後可以不是1。

偏移 bias

還有個b是怎麼來的?一般的書或者博客上會告訴你那是因為\(y=wx+b\),b是偏移值,使得直線能夠沿Y軸上下移動。這是用結果來解釋原因,並非b存在的真實原因。從生物學上解釋,在腦神經細胞中,一定是輸入信號的電平/電流大於某個臨界值時,神經元細胞才會處於興奮狀態,這個b實際就是那個臨界值。亦即當:

\[w_1 \cdot x_1 + w_2 \cdot x_2 + w_3 \cdot x_3 >= t\]

時,該神經元細胞才會興奮。我們把t挪到等式左側來,變成\((-t)\),然後把它寫成b,變成了:

\[w_1 \cdot x_1 + w_2 \cdot x_2 + w_3 \cdot x_3 + b >= 0\]

於是b誕生了!

求和計算 sum

\[ \begin{aligned} Z &= w_1 \cdot x_1 + w_2 \cdot x_2 + w_3 \cdot x_3 + b \\ &= \sum_{i=1}^m(w_i \cdot x_i) + b \end{aligned} \]

在上面的例子中m=3。我們把\(w_i \cdot x_i\)變成矩陣運算的話,就變成了:

\[Z = W \cdot X + b\]

激活函數 activation

求和之後,神經細胞已經處於興奮狀態了,已經決定要向下一個神經元傳遞信號了,但是要傳遞多強烈的信號,要由激活函數來確定:

\[A=\sigma{(Z)}\]

如果激活函數是一個階躍信號的話,會像繼電器開合一樣咔咔的開啟和閉合,在生物體中是不可能有這種裝置的,而是一個漸漸變化的過程。所以一般激活函數都是有一個漸變的過程,也就是說是個曲線,如圖1-14所示。

圖1-14 激活函數圖像

至此,一個神經元的工作過程就在電光火石般的一瞬間結束了。

小結

  • 一個神經元可以有多個輸入。
  • 一個神經元只能有一個輸出,這個輸出可以同時輸入給多個神經元。
  • 一個神經元的w的數量和輸入的數量一致。
  • 一個神經元只有一個b。
  • w和b有人為的初始值,在訓練過程中被不斷修改。
  • 激活函數不是必須有的,亦即A可以等於Z。
  • 一層神經網絡中的所有神經元的激活函數必須一致。

1.3.2 神經網絡的訓練過程

單層神經網絡模型

這是一個單層的神經網絡,有m個輸入 (這裏m=3),有n個輸出 (這裏n=2)。在神經網絡中,\(b\) 到每個神經元的權值來表示實際的偏移值,亦即\((b_1,b_2)\),這樣便於矩陣運算。也有些人把 \(b\) 寫成\(x_0\),其實是同一個效果,即把偏移值看做是神經元的一個輸入。

  • \((x_1,x_2,x_3)\)是一個樣本數據的三個特徵值
  • \((w_{11},w_{21},w_{31})\)\((x_1,x_2,x_3)\)\(n1\)的權重
  • \((w_{12},w_{22},w_{32})\)\((x_1,x_2,x_3)\)\(n2\)的權重
  • \(b_1\)\(n1\)的偏移
  • \(b_2\)\(n2\)的偏移

圖1-15 單層神經網絡模型

從圖1-15大家可以看到,同一個特徵 \(x_1\),對於\(n1、n2\)來說,權重是不相同的,因為\(n1、n2\)是兩個神經元,它們完成不同的任務(特徵識別)。我們假設\(x_1,x_2,x_3\)分別代表紅綠藍三種顏色,而 \(n1,n2\) 分別用於識別暖色和冷色,那麼 \(x_1\)\(n1\) 的權重,肯定要大於 \(x_1\)\(n2\) 的權重,因為\(x_1\)代表紅色,是暖色。

而對於\(n1\)來說,\(x_1,x_2,x_3\)輸入的權重也是不相同的,因為它要對不同特徵有選擇地接納。如同上面的例子,\(n1\) 對於代表紅色的 \(x_1\),肯定是特別重視,權重值較高;而對於代表藍色的 \(x_3\),盡量把權重值降低,才能有正確的輸出。

訓練流程

從真正的“零”開始學習神經網絡時,我沒有看到過任何一個流程圖來講述訓練過程,大神們寫書或者博客時都忽略了這一點,圖1-16是一個簡單的流程圖。

圖1-16 神經網絡訓練流程圖

前提條件

  1. 首先是我們已經有了訓練數據;
  2. 我們已經根據數據的規模、領域,建立了神經網絡的基本結構,比如有幾層,每一層有幾個神經元;
  3. 定義好損失函數來合理地計算誤差。

步驟

假設我們有表1-1所示的訓練數據樣本。

表1-1 訓練樣本示例

Id x1 x2 x3 Y
1 0.5 1.4 2.7 3
2 0.4 1.3 2.5 5
3 0.1 1.5 2.3 9
4 0.5 1.7 2.9 1

其中,x1,x2,x3是每一個樣本數據的三個特徵值,Y是樣本的真實結果值:

  1. 隨機初始化權重矩陣,可以根據高斯分佈或者正態分佈等來初始化。這一步可以叫做“猜”,但不是瞎猜;
  2. 拿一個或一批數據作為輸入,帶入權重矩陣中計算,再通過激活函數傳入下一層,最終得到預測值。在本例中,我們先用Id-1的數據輸入到矩陣中,得到一個A值,假設A=5;
  3. 拿到Id-1樣本的真實值Y=3;
  4. 計算損失,假設用均方差函數 \(Loss = (A-Y)^2=(5-3)^2=4\)
  5. 根據一些神奇的數學公式(反向微分),把Loss=4這個值用大喇叭喊話,告訴在前面計算的步驟中,影響A=5這個值的每一個權重矩陣,然後對這些權重矩陣中的值做一個微小的修改(當然是向著好的方向修改,這一點可以用數學家的名譽來保證);
  6. 用Id-2樣本作為輸入再次訓練(goto 2);
  7. 這樣不斷地迭代下去,直到以下一個或幾個條件滿足就停止訓練:損失函數值非常小;準確度滿足了要求;迭代到了指定的次數。

訓練完成后,我們會把這個神經網絡中的結構和權重矩陣的值導出來,形成一個計算圖(就是矩陣運算加上激活函數)模型,然後嵌入到任何可以識別/調用這個模型的應用程序中,根據輸入的值進行運算,輸出預測值。

1.3.3 神經網絡中的矩陣運算

圖1-17是一個兩層的神經網絡,包含隱藏層和輸出層,輸入層不算做一層。

圖1-17 神經網絡中的各種符號約定

\[ z1_1 = x_1 \cdot w1_{1,1}+ x_2 \cdot w1_{2,1}+b1_1 \]
\[ z1_2 = x_1 \cdot w1_{1,2}+ x_2 \cdot w1_{2,2}+b1_2 \]
\[ z1_3 = x_1 \cdot w1_{1,3}+ x_2 \cdot w1_{2,3}+b1_3 \]

變成矩陣運算:

\[ z1_1= \begin{pmatrix} x_1 & x_2 \end{pmatrix} \begin{pmatrix} w1_{1,1} \\ w1_{2,1} \end{pmatrix} +b1_1 \]

\[ z1_2= \begin{pmatrix} x_1 & x_2 \end{pmatrix} \begin{pmatrix} w1_{1,2} \\ w1_{2,2} \end{pmatrix} +b1_2 \]

\[ z1_3= \begin{pmatrix} x_1 & x_2 \end{pmatrix} \begin{pmatrix} w1_{1,3} \\ w1_{2,3} \end{pmatrix} +b1_3 \]

再變成大矩陣:

\[ Z1 = \begin{pmatrix} x_1 & x_2 \end{pmatrix} \begin{pmatrix} w1_{1,1}&w1_{1,2}&w1_{1,3} \\ w1_{2,1}&w1_{2,2}&w1_{2,3} \\ \end{pmatrix} +\begin{pmatrix} b1_1 & b1_2 & b1_3 \end{pmatrix} \]

最後變成矩陣符號:

\[Z1 = X \cdot W1 + B1\]

然後是激活函數運算:

\[A1=a(Z1)\]

同理可得:

\[Z2 = A1 \cdot W2 + B2\]

注意:損失函數不是前向計算的一部分。

1.3.4 神經網絡的主要功能

回歸(Regression)或者叫做擬合(Fitting)

單層的神經網絡能夠模擬一條二維平面上的直線,從而可以完成線性分割任務。而理論證明,兩層神經網絡可以無限逼近任意連續函數。圖1-18所示就是一個兩層神經網絡擬合複雜曲線的實例。

圖1-18 回歸/擬合示意圖

所謂回歸或者擬合,其實就是給出x值輸出y值的過程,並且讓y值與樣本數據形成的曲線的距離盡量小,可以理解為是對樣本數據的一種骨架式的抽象。

以圖1-18為例,藍色的點是樣本點,從中可以大致地看出一個輪廓或骨架,而紅色的點所連成的線就是神經網絡的學習結果,它可以“穿過”樣本點群形成中心線,盡量讓所有的樣本點到中心線的距離的和最近。

分類(Classification)

如圖1-19,二維平面中有兩類點,紅色的和藍色的,用一條直線肯定不能把兩者分開了。

圖1-19 分類示意圖

我們使用一個兩層的神經網絡可以得到一個非常近似的結果,使得分類誤差在滿意的範圍之內。圖1-19中那條淡藍色的曲線,本來並不存在,是通過神經網絡訓練出來的分界線,可以比較完美地把兩類樣本分開,所以分類可以理解為是對兩類或多類樣本數據的邊界的抽象。

圖1-18和圖1-19的曲線形態實際上是一個真實的函數在[0,1]區間內的形狀,其原型是:

\[y=0.4x^2 + 0.3xsin(15x) + 0.01cos(50x)-0.3\]

這麼複雜的函數,一個兩層的神經網絡是如何做到的呢?其實從輸入層到隱藏層的矩陣計算,就是對輸入數據進行了空間變換,使其可以被線性可分,然後在輸出層畫出一個分界線。而訓練的過程,就是確定那個空間變換矩陣的過程。因此,多層神經網絡的本質就是對複雜函數的擬合。我們可以在後面的試驗中來學習如何擬合上述的複雜函數的。

神經網絡的訓練結果,是一大堆的權重組成的數組(近似解),並不能得到上面那種精確的數學表達式(數學解析解)。

1.3.5 為什麼需要激活函數

生理學上的例子

人體骨關節是動物界里最複雜的生理結構,一共有8個重要的大關節:肩關節、
肘關節、腕關節、髖關節、膝關節、踝關節、頸關節、腰關節。

人的臂骨,腿骨等,都是一根直線,人體直立時,也是一根直線。但是人在骨關節和肌肉組織的配合下,可以做很多複雜的動作,原因就是關節本身不是線性結構,而是一個在有限範圍內可以任意活動的結構,有一定的柔韌性。

比如肘關節,可以完成小臂在一個二維平面上的活動。加上肩關節,就可以完成胳膊在三維空間的活動。再加上其它關節,就可以擴展胳膊活動的三維空間的範圍。

用表1-2來對比人體運動組織和神經網絡組織。

表1-2 人體運動組織和神經網絡組織的對比

人體運動組織 神經網絡組織
支撐骨骼 網絡層次
關節 激活函數
肌肉韌帶 權重參數
學習各種運動的動作 前向+反向訓練過程

激活函數就相當於關節。

激活函數的作用

看以下的例子:

\[Z1=X \cdot W1 + B1\]

\[Z2 = Z1 \cdot W2 + B2\]

\[Z3 = Z2 \cdot W3 + B3\]

展開:

\[ \begin{aligned} Z3&=Z2 \cdot W3 + B3 \\ &=(Z1 \cdot W2 + B2) \cdot W3 + B3 \\ &=((X \cdot W1 + B1) \cdot W2 + B2) \cdot W3 + B3 \\ &=X \cdot (W1\cdot W2 \cdot W3) + (B1 \cdot W2 \cdot W3+B2 \cdot W2+B3) \\ &=X \cdot W+B \end{aligned} \]

\(Z1,Z2,Z3\)分別代表三層神經網絡的計算結果。最後可以看到,不管有多少層,總可以歸結到\(XW+B\)的形式,這和單層神經網絡沒有區別。

如果我們不運用激活函數的話,則輸出信號將僅僅是一個簡單的線性函數。線性函數一個一級多項式。線性方程是很容易解決的,但是它們的複雜性有限,並且從數據中學習複雜函數映射的能力更小。一個沒有激活函數的神經網絡將只不過是一個線性回歸模型罷了,不能解決現實世界中的大多數非線性問題。

沒有激活函數,我們的神經網絡將無法學習和模擬其他複雜類型的數據,例如圖像、視頻、音頻、語音等。這就是為什麼我們要使用人工神經網絡技術,諸如深度學習,來理解一些複雜的事情,一些相互之間具有很多隱藏層的非線性問題。

圖1-20 從簡單到複雜的擬合

圖1-20展示了幾種擬合方式,最左側的是線性擬合,中間的是分段線性擬合,右側的是曲線擬合,只有當使用激活函數時,才能做到完美的曲線擬合。

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

【其他文章推薦】

※專營大陸空運台灣貨物推薦

台灣空運大陸一條龍服務

在校生如何面向面試地學習Java,匹馬行天下之思維決定高度篇——大學再努力,培訓機構做兄弟,你的簡歷能幫你爭取到面試機會嗎

    最近我在博客園裡,看到不少在校的同學在學java,而且,在我最近舉辦的一次直播活動中,也有不少在校生同學來提問,java該怎麼學。

    對於那些已經工作的同學,哪怕才工作不久,畢竟也能從項目實踐里總結和探索java的學習途徑和相關方法。但在校生同學由於沒機會接觸實際項目,在學習內容、進階途徑和學成標準這些方面都是兩眼一抹黑,而大學里的內容可能偏重於理論,講述的技術往往也和軟件公司里常用的技術不匹配。

    這就導致了很多上心的在校生,雖然很努力,但到畢業時,才發現自己起早貪黑學成的技能並不能幫他們找到工作。在本文里,就將結合我面試實習生和畢業生的標準,專門給在校生這個群體一些學習Java方面的建議。

1 明確目標,先說下公司面試應屆生的標準

    我最近可能都在大公司,到畢業季,會到一些學校去校招,校招的標準描述起來很簡單:Java方面能幹活,或者能經短期幫帶后能幹活,具體標準如下。

    1 Web框架方面,需要以全棧的形式,了解SSM,或Spring Boot或Spring Cloud從前端到後端的基本語法,至少能在項目經理短期幫助下,能照着別人的例子寫代碼。應屆生候選人只要能講清楚相關框架的語法點和流程即可,最多再附帶說明下mybatis等組件的用法,至於redis,dubbo,根本沒要求。

    2 數據庫方面,能會基本的增刪改查即可,外帶一些基本概念,比如事務怎麼處理,JDBC里批處理怎麼處理。

    3 Java語法(也就是核心方面),其實如果能講清楚SSM等Web框架技能,這塊只要刷題就能過,比如就問些ArrayList和LinkedList的差別,以及多線程等的概念。

    4 人看上去聽話,想法少,學習能力強,責任心強,不是刺頭,這塊其實大多數人都可以達標。

    以上不要求有商業項目經驗,當然如果有,絕對是加分項,而且這還是大公司的面試應屆生的標準。至於一些小公司,或者是一些外包公司,有時候能招到人就阿彌陀佛了(至於有些能力比較強的一本的應屆生願不願意去還難說)。有些在招收應屆生的時候,不少小公司甚至在“項目經驗”方面沒要求,哪怕沒學習項目經驗也不要緊,只會問些網上比較大路的面試題,能說上來即可。

2 面試中大多數應屆生的實際表現

    從面試官角度來看,招收應屆生的標準其實是很低的,對應的,在招初級開發時,多少都需要有商業項目經驗。從這個角度來看,應屆生最好在校期間就找到工作,畢業后兩三個月找不到工作問題還不怎麼大,但如果半年後再找不到工作,那麼到時候被面試的標準就高於“應屆生”的標準了。

    這裏我無意貶低應屆生的水平,畢竟我們都是從這個階段過來的,但從面試情況來看,至少有將近一半的應屆生達不到標準,下面列些具體的表現。

    1 沒有框架開發的經驗,這裏最低要求是能自行搭建個SSM項目,但不少同學根本沒有。

    2 數據庫方面,就知道理論上的增刪改查,甚至不會在MySQL, Oracle和SQL Server平台上運行過SQL語句。

    3 Java核心方面,掌握了一大堆項目里一定不會用的,比如Swing之類的界面編程技術,但該掌握的多線程集合等,一些常用的概念也不清楚。

    論動手能力,有些同學甚至沒有在Eclipse等IDE上運行通Java代碼,或者出了基本的語法錯誤不知道如何自行解決,至於沒有debug調試經驗的,就更加見怪不怪了,而在代碼里需要加必要的try…catch異常處理語句,這就更加鳳毛麟角了。

    在一些一本大學里,理論和實際操作能力較差的同學雖然不多,但也有,就更別提其它大學和大專了。我也和一些大學老師打過交道,也看過一些大學里用的Java和數據庫等編程方面的教材,再結合諸多應屆生在面試時的表現,我的感受是,或許大學階段更會培養學生的理論素養,但大學生朋友在讀大學階段,一定要提升實際的編程能力,包含但不限於(SSM)框架的編程能力,數據庫實際操作能力和Java核心部分代碼的開發和調試能力 。 

3 哪些大學里學到的知識點面試大概率不問(根本不用太費精力看的技術有哪些)

     前幾天我看到篇大學生朋友寫的文章,,或許很多大學生朋友也知道上進,平時也在不斷看各種資料,但可能苦於方法不當,可能有些大學老師也沒真在公司里干過,也沒法給出合適的學習建議,所以導致最終畢業找工作時,能力沒達到基本的期望要求。

    也就是說,大學教育和公司面試需求之間存在差距,這就給一些培訓機構帶來了商機。但培訓機構收的錢也不便宜,而培訓班也不是一定能保證學生能找到工作,關鍵要靠自己。從這裏開始,就將給出有實際操作性的學習建議。

    我最近接觸到不少大學生朋友,發現他們努力正在學的知識,面試時未必會問,也就是說,這些點白學了。之前已經提到了面試的標準,這裏就將結合具體的知識點,列出面試時需要掌握的最低技能標準,除此之外,大概率不會問的。

    1  Java核心方面,集合,多線程,異常處理,IO,JDBC,面向對象技能,大概率會問到,其它的沒提到的,比如圖形化界面,NIO,Socket網絡編程,甚至Applet之類的,不會問到。

    2 數據庫方面,會寫增刪改查的SQL語句,知道存儲過程之類的概念,會通過索引優化查詢條件,會建表,會些諸如子查詢,group by,having,表關聯查詢等基本SQL技能,這裏請注意,至少得用過一種商業化數據庫。

    3 框架方面,需要有Spring+Spring MVC+mybatis框架的實際操作能力(不是商業項目開發能力),至於有Spring Boot或Spring Cloud,那更好了。

    4 綜合技能方面,能知道基本的數據結構知識(線性表外帶排序外帶一些樹的技能),基本的操作系統知識(一般僅限於線程進程概念),基本網絡通訊知識(一般僅限於網絡通訊模型和tcp udp協議),但這僅僅是“需要知道”而已。

     大家其實也可以通過看各種職位描述和招聘需求,看下哪些技能實際上是不會問的,對於這些知識,就不用學,從而把精力用到學實際Java相關技能上。

     這裏需要說明,在大學階段學的很多知識,不能說沒用。比如網絡通訊里的tcp底層通訊細節,這些技能或者要等到工作5年後升級到高級開發或架構師的時候才會用到,而且以高級開發視角觀察需要掌握的通訊協議細節知識,絕對要比大學階段要複雜。

    換句話說,很多技能,在大學階段也就“需要了解有這事”,以在大學階段的經歷,再多用時間學,估計也無法達到“實際項目的需求”,而且等到有實際項目經驗時,再學這類技能也就是一兩周的事情。兩廂一對比,結論就很明確了:在校階段應該更多積累實際開發能力,因為更得靠這個找工作。 

4 用一個月的時間了解Java核心部分的內容

    通過上文,大家大致可以了解到畢業時找工作的目標,如果再不了解,可以實際看下招聘要求,甚至直接多去參加招聘會和面試,總之優先考察實際的開發能力,具體在Java核心部分,該如何高效學習呢?

    1 在電腦上裝jdk,eclipse,別用editplus之類的工具,最好再用eclipse的自動編譯功能。這方面,其實是鍛煉自己的動手搭建環境的能力,工作后,開發是一方面,搭建環境的能力同樣重要。

    2 剛開始,一定得去找兩三本Java入門書,先通過運行現有代碼,理解代碼的含義。別光看書不運行,開始階段,也多運行別人的代碼,別自己敲代碼。這裏建議直接找書,因為相比一些視頻教材,畢竟書上的知識很系統,而且能正式出版的書一般沒代碼問題,能直接運行。不建議自己敲代碼,是因為自己敲代碼時,多少會遇到問題,遇到問題后延誤學習進度是小,因為一直得不到解決從而影響學習信心,甚至終止學習了,事情就大了。

    3 如果找到兩三本Java入門書,一般其中涵蓋的知識系統大多很相似,大家可以先運行一遍所有代碼,這樣就能大致掌握代碼結構和基本知識點,而且由於書上代碼一般問題不大,而且質量也不會低,至少不會有太大的阻礙性問題。

    4 當運行好以後,着重觀察集合,面向對象,多線程,IO處理,JDBC,異常處理相關章節,這個階段,是以掌握API用法為主,在這基本上再看下諸如接口,抽象類,異常處理流程,垃圾回收之類的高級知識點。 

    在上述基礎上,如果可以通過資料的幫助,用Java實現堆棧,鏈表,隊列,散列表,樹等的數據結構,同時操練各種排序算法,這對找工作也有些幫助。

5 用半個月的時間,以MySQL為例,了解數據庫的大致操作

    在數據庫方面,最好也去找本書,同時在MYSQL上實踐。為什麼選MYSQL?因為這比較輕,相比Oracle而言,好安裝,當然如果有條件裝SQL Server之類的,那就更好了。 

    1 在MySQL數據庫上,實踐各種增刪改查的SQL語句,實踐建表,建索引能技巧,同時實踐一下諸如子查詢,with as等等複雜的SQL語句。

    2  用JDBC連同MYSQL,在Java代碼里做各種增刪改查的操作。

    3  在此基礎上,了解諸如索引,範式和鎖等概念,這時候雖然認識也會很膚淺,但至少不會一頭霧水了。

    這樣,在數據庫方面,好歹有實際操作經驗了,這為之後的項目實踐,能打下很好的基礎。

6 用一個月的時間,了解基於Spring的web框架

    面試時更看重的是框架經驗,這塊學習的建議如下。

    1 先通過運行代碼,了解Spring里IOC, AOP,這時應該注意各種配置。

    2 熟悉Spring的基本概念后,可以嘗試跑一個SSM的小例子,這個例子可以非常簡答,就一個頁面也行,但要包含Spring MVC和Mybatis諸多要素,這樣大家好歹能知道框架的構成,在這個基礎上,可以繼續擴展,加些必要的業務,從而進一步了解這個框架。

    在這個階段,還是最好看書上的例子,因為書上的例子一定能通,而且還會帶部署和運行的步驟,還是不建議自己敲代碼,因為SSM框架相對複雜,在這個階段如果自己敲,很有可能會因為問題太多而放棄。

    3 在自己機器上跑通SSM框架的案例后,可以網上找個帶業務的系統,比如圖書管理系統等,從中看些前端和後端交互數據的流程,同時,結合業務看Mybatis里的ORM過程,以及Spring里的常用註解。     

7 在學習過程中,可以避免的誤區

    Java方面,本人按照上述步驟輔導過不少在校的同學,只要肯上心練習,效果不會太差,不過很多同學在實踐過程中會走彎路,這裏列些普遍存在的問題,請大家在操練的過程中盡量避免。

    1 別鑽牛角尖,先面再點。比如有同學對一個知識點不理解,或者一段代碼運行有問題,就會在這個點上耗費很多時間,不解決就不繼續。其實在這個過程中,首先需要全方位掌握SSM框架、Java技術和數據庫,個別點如果有問題,可以跳過,或者一個案例運行不通可以運行其它類似的,總之別在一個點上花費太多的時間。

    2 再啰嗦一下,最好先照着書上代碼運行,開始階段的學習方法是“複製粘貼運行理解”,在自己已經有一定的基礎后,再嘗試自己寫代碼。

    3 在操練SSM項目時,有些同學會照着視頻上提到步驟做,如果有些視頻步驟不對,這樣就會有問題,所以還是建議照着書做。

    4 工具要選對,剛開始就eclipse,或者Idea,別用editplus或命令行。

    上述是方法上的誤區,其實最大的問題出在態度上,上述學習過程持續時間不會短,快則兩三個月,慢則半年,如果中途因為效果不明顯而放棄,那就很可惜了。 

8 有學習項目經驗后,爭取找些商業項目的實踐機會

    按照上述步驟,讓自己擁有最基本的SSM以及其它Java和數據庫相關技能后,要做的絕不是繼續積累學習項目經驗,而是盡可能去找實習的機會,以積累商業項目的經驗。在找實習經驗方面,大家可以參照如下的建議。

    1 在我之前的博文里也提到,大三時,打聽計算機學院里哪些老師和外面公司有合作,一般碩導都有這樣的項目,然後直接去找老師,剛開始不要錢,只求經驗,或許對各位在校生同學而言,這種方式是比較可行的,本人第一個商業項目經驗也是由此得到的。

    2 一般學校里都會安排實習,實習的過程中,一定要重視,這個是實打實的商業項目經驗。

    3 寒暑假,找軟件公司,這可能會比較艱辛,因為在校階段自己非常難找相關實習機會,但要去找。

    4 這個大家根據自己的實際情況自己斟酌:如果報培訓班,多少能積累些項目經驗,但這僅僅是學習項目經驗,不過在培訓班裡,可以找相關老師推薦實習的機會。

    5 如果實在找不到實習的機會,那麼盡可能通過各種渠道,去找商業項目經驗的案例,我知道有些網站有,但不做廣告。雖然靠這種方式積累的商業項目經驗質量就打折扣了,但好歹聊勝於無,而且畢竟很多畢業生,連學習項目經驗都沒。 

    不少在校的同學發現,哪怕實際只幹了三個月的商業項目經驗,自己的技能也會很大程度提升,而且實際的商業項目經驗,會讓大家掌握書本上根本不會多提但項目里一定會用的技能,比如JVM內存調優或多線程併發。從這意義上來講,只要有條件,大學生朋友應該擠破頭去找商業項目的經驗,而不是悠哉游哉地坐在機房裡敲代碼。只要你有商業項目的經驗,哪怕就三個月,找工作時你就有代差優勢。

9 畢業生準備簡歷的要點

    按照上述步驟,大家在畢業時,多少會有些商業項目經驗,再不濟也能有學習項目經驗,請記住,在招聘畢業生時,第一看項目經驗,第二看項目里包含的技能,第三再問算法和理論問題,至於邏輯題和情商題,只供參考。

     對此,畢業生在簡歷中,一定得突出做過的項目經驗,優先挖掘商業項目經驗,實在沒有學習項目也行。如果沒任何項目經驗,那麼找工作時會吃力很多。本文的重點是講學習方法,準備簡歷的技能只是稍微提到。這塊可以參考的之前寫的博文,。如果有時間的話,或許我會再專門針對畢業生朋友,寫篇文章講在java方面,如何準備簡歷和面試,以及如何找工作。 

10 總結:最多堅持半年,技能就會大變樣

    我記得兩年前,我的Python能力僅限於寫hello world,我運行代碼看文檔,辛苦堅持了半年,自認為就達到了出版書的地步,再過了半年,果真就從出版社接到了一本以股票案例講述Python技術的選題,並自認為寫的內容不會誤人子弟。

    我持續關注了一位大學生網友的公眾號,也就是寫了半年多博客,他技術看上去就更專業多了。能堅持不懈地上進,這種精神值得提倡,雖然我工作很久了,但也得時刻警惕,不能懈怠,這也是我肯推薦該公眾號的原因,不僅推薦其內容,更提倡這種精神。

    不光是這位同學,經我培訓的其它很多大學生,也只要肯上心學,最多半年,最短三個月,就能從小白進階到能實際幹活的水平,而且還真能面試進軟件公司幹活。 

    本文雖然長,但其中也是盡我所能,給出大學生朋友若干有實際操作性的學習建議,其實對於其它初學者,本文給出的建議同樣適用。希望本文能幫到大家,最後感謝大家能讀完此文。

版權說明:

    如果要轉載本文,請先徵得本人同意。

 

 

 

 

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

【其他文章推薦】

※專營大陸空運台灣貨物推薦

台灣空運大陸一條龍服務