獨步全球 盧森堡大眾運輸免費解決塞車困擾

摘錄自2020年3月11日公視報導

歐洲富裕小國盧森堡,推出全國大眾運輸工具免費政策,鼓勵人們減少開車,多利用大眾運輸工具,也減少長期以來的塞車困擾。

盧森堡決定把原定3月1號上路的全國交通免費政策,提前一天上路,政府這麼大方,是為了解決嚴重塞車的問題,希望民眾都願意使用大眾運輸工具。盧森堡人民大部分出門都自己開車,此外,47%的人開車是因為商旅需求,71%的人開車是為了休閒運輸。

目前在盧森堡境內的電車,每趟車資兩歐元,相當於台幣67塊錢,之前車票銷售佔了營運成本5億歐元的8%。不收費之後,將由國庫填補這塊缺口。儘管售票機都已經撤走,不過售票櫃台仍會繼續營運,因為國際線車次以及頭等艙座位,仍須付費。

交通運輸
生活環境
國際新聞
盧森堡
大眾運輸工具
開車
塞車

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

【其他文章推薦】

台北網頁設計公司這麼多,該如何挑選?? 網頁設計報價省錢懶人包”嚨底家”

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

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

小三通海運與一般國際貿易有何不同?

小三通快遞通關作業有哪些?

寶馬i品牌第三款車型i5將會是一台電動車

據悉,寶馬高層最新證實,i品牌的第三款車型i5將會是一台電動車,而非之前所傳聞的燃料電池車或者是插電式混合動力車。不過他也表示,i5除了純電動版本,也會像i3那樣擁有一款增程車型。


寶馬全新i5假想圖

至於i5的車身形式目前仍然是一個迷,但從各方消息以及寶馬高層的暗示來看,這是一台家庭定位的車型,所以它選擇SUV造型的可能性應該是最大的。

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

【其他文章推薦】

台北網頁設計公司這麼多,該如何挑選?? 網頁設計報價省錢懶人包”嚨底家”

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

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

小三通海運與一般國際貿易有何不同?

小三通快遞通關作業有哪些?

麥格納攜手格特拉克將亮相第六屆中國國際新能源汽車論壇2016

由希邁商務諮詢(上海)有限公司主辦的2016年第六屆中國國際新能源汽車論壇即將於4月20日-4月22日在上海隆重舉行。此次論壇獲得了亞太電動車學會、中國國家新能源機動車產品品質監督檢驗中心、上海交大密西根學院、賽迪顧問及中國綠色能源產業技術創新戰略聯盟的大力支持。截止3月14日,論壇已經確認40位演講嘉賓出席本次論壇並做高品質學術演講。演講嘉賓分別來自菲律賓電動車協會、國家新能源機動車產品品質監督檢驗中心、美國國家能源局、中國工程院等在內的政府單位與研究機構,以及包括寶馬、通用汽車、特斯拉、長安汽車、宇通客車、奇瑞、比亞迪戴姆勒、上汽、北汽、觀致等在內的多個知名整車商,將在論壇上共同研討新能源汽車行業政策趨勢、技術路線及難點、基礎設施建設、商業模式,延續以往的豐碩成果,繼續為新能源汽車行業作出貢獻。

作為全球首屈一指的汽車零部件供應商,麥格納旗下動力總成事業部此次將攜手格特拉克成為本屆論壇的鉑金贊助商,不僅會分享電子驅動和混合驅動控制及新能源汽車熱管理研究的技術報告,還將同期展示新能源汽車領域的前沿產品。麥格納動力總成是全球領先的汽車動力總成系統供應商,集傳動系統設計、研發、試驗和製造能力為一體,以世界級的製造水準不斷實現產品和工藝的創新,為國內外客戶傳遞卓越價值。

本屆論壇相比歷屆舉辦規模最大的第六屆新能源汽車論壇,涉及主論壇及三個分論壇、考察活動、頒獎典禮和交流晚宴。屆時將誠邀全球範圍內的整車製造商、電網電力公司、電池廠商、零部件供應商、核心技術提供商和政府官員近500位行業人士一起,對新能源汽車產業面臨的挑戰,機遇與對策各方面進行為期三天更深層次並具有建設和戰略性的探討。

如需更多詳情,請諮詢:
大會連絡人:Hill ZENG(曾先生)
聯繫電話:0086 21-6045 1760 或郵箱
我們期待與貴單位一起出席於2016年4月20-22日在上海舉辦的第六屆中國國際新能源汽車論壇2016,以利決策!

 

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

【其他文章推薦】

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

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

大陸寄台灣空運注意事項

大陸海運台灣交貨時間多久?

※避免吃悶虧無故遭抬價!台中搬家公司免費估價,有契約讓您安心有保障!

Unity – Cinemachine實現相機抖動

普通相機抖動腳本較易實現,但在使用cinemachine相機下,其Transform組件不可被代碼修改,那麼Cinemachine的相機抖動如何實現呢?本文結合實際項目,對實現相機抖動的三大步驟進行系統講解:

  • 項目地址:

配置流程

項目背景:一款2D像素動作遊戲,我們操控着Player(必須帶有Collider組件),遊戲相機為Cinemachine 2DCamera(關於其配置方法此處不做贅述,推薦文章在末尾參考處)

1. 在相機上添加監聽腳本

在我們使用的虛擬相機 CM vcam1 上添加組件:AddComponent->CinemachineImpulse Listener

  • CinemachineImpulse Listener監聽腳本內震動信號(方法調用),使得抖動在此相機上發生
    • Channel Mask:通道遮罩,此處最好默認為EveryThing
    • Gain:可獲得震動信號的數目,0為屏蔽,1表示某時段僅能進行一個抖動運動
    • Use 2D Distance:用於2D遊戲,忽略相機Z軸的抖動

2. 在震動信號發生物體上添加腳本

震動信號發生物體(調用震動函數的物體)為Player,因此需要在Player上添加組件:AddComponent->Cinemachine Collision Impulse Source(注:必須掛到含Collider的物體上),然後在Raw Signal右側齒輪->New Noise Settings 添加震動配置器,默認名CM vcam1 Raw Signal

  • Cinemachine Collision Impulse Source:含有抖動函數震動配置器的關鍵腳本
    • Raw Signal:震動配置器,配置震動參數的關鍵部件,我們打開剛上面新建的CM vcam1 Raw Signal,可看到震動方式的各類參數。我們以Position Y,即上下抖動為例,添加Components后可設置其Frequency震頻Amplitude震幅,並且勾選右側方框可將其設置為正弦波
    • Attack:抖動開始的變化曲線及時間
    • Sustain Time:抖動的持續時間
    • Decay:抖動衰退的變化曲線及時間

3. 調用震動方法:

在Player內引用震動核心腳本,並在合適位置調用震動方法

private Cinemachine.CinemachineCollisionImpulseSource MyInpulse;

private void Start()
{
    MyInpulse = GetComponent<Cinemachine.CinemachineCollisionImpulseSource>();
}

private void Update()
{
    //按下右鍵產生相機抖動,抖動方式依照上面CM vcam1 Raw Signal內配置信息
    if (Input.GetMouseButtonDown(1))
        MyInpulse.GenerateImpulse();       
}

至此,我們在遊戲內操控Player,按下右鍵即可實現相機抖動。當然除了上面無參的GenerateImpulse()方法,還有兩個帶參的方法:

//假若使用傳遞velocity的方法,其震動方式為velocity和CM vcam1 Raw Signal的混合
public void GenerateImpulse(Vector3 velocity);
public void GenerateImpulse(Vector3 position, Vector3 velocity);

此外,還有可能出現bug:還尚未調用震動函數,遊戲開始時就自動產生抖動。其產生原因博主尚未在對應腳本內發現,但解決方式為關閉Player上的Cinemachine Collision Impulse Source腳本

總述

Cinemachine中實現相機抖動的基本流程:

  • 在虛擬相機上添加監聽腳本 CinemachineImpulse Listener
  • 在Player上添加震動核心腳本Cinemachine Collision Impulse Source,並添加、設置震動配置器
  • Player腳本合適位置調用震動函數

本例僅介紹了單Position方向上的抖動,讀者可按需配置抖動的Position、Rotation、發生時間、維持時間、衰退時間等,實現自己想要的效果

參考

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

台北網頁設計公司這麼多,該如何挑選?? 網頁設計報價省錢懶人包”嚨底家”

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

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

小三通海運與一般國際貿易有何不同?

小三通快遞通關作業有哪些?

花了幾個小時總結了一些容易出錯的 Java 知識點!

本文已經收錄自 (61k+Star!【Java學習+面試指南】 一份涵蓋大部分Java程序員所需要掌握的核心知識。歡迎 Star!歡迎騷擾!)
原文地址:https://javaguide.cn/2019/08/20/java/java%E5%9F%BA%E7%A1%80/Java%E7%96%91%E9%9A%BE%E7%82%B9/

1. 基礎

1.1. 正確使用 equals 方法

Object的equals方法容易拋空指針異常,應使用常量或確定有值的對象來調用 equals。

舉個例子:

// 不能使用一個值為null的引用類型變量來調用非靜態方法,否則會拋出異常
String str = null;
if (str.equals("SnailClimb")) {
  ...
} else {
  ..
}

運行上面的程序會拋出空指針異常,但是我們把第二行的條件判斷語句改為下面這樣的話,就不會拋出空指針異常,else 語句塊得到執行。:

"SnailClimb".equals(str);// false 

不過更推薦使用 java.util.Objects#equals(JDK7 引入的工具類)。

Objects.equals(null,"SnailClimb");// false

我們看一下java.util.Objects#equals的源碼就知道原因了。

public static boolean equals(Object a, Object b) {
        // 可以避免空指針異常。如果a==null的話此時a.equals(b)就不會得到執行,避免出現空指針異常。
        return (a == b) || (a != null && a.equals(b));
    }

注意:

Reference:

  • 每種原始類型都有默認值一樣,如int默認值為 0,boolean 的默認值為 false,null 是任何引用類型的默認值,不嚴格的說是所有 Object 類型的默認值。
  • 可以使用 == 或者 != 操作來比較null值,但是不能使用其他算法或者邏輯操作。在Java中null == null將返回true。
  • 不能使用一個值為null的引用類型變量來調用非靜態方法,否則會拋出異常

1.2. 整型包裝類值的比較

所有整型包裝類對象值的比較必須使用equals方法。

先看下面這個例子:

Integer x = 3;
Integer y = 3;
System.out.println(x == y);// true
Integer a = new Integer(3);
Integer b = new Integer(3);
System.out.println(a == b);//false
System.out.println(a.equals(b));//true

當使用自動裝箱方式創建一個Integer對象時,當數值在-128 ~127時,會將創建的 Integer 對象緩存起來,當下次再出現該數值時,直接從緩存中取出對應的Integer對象。所以上述代碼中,x和y引用的是相同的Integer對象。

注意:如果你的IDE(IDEA/Eclipse)上安裝了阿里巴巴的p3c插件,這個插件如果檢測到你用 ==的話會報錯提示,推薦安裝一個這個插件,很不錯。

1.3. BigDecimal

1.3.1. BigDecimal 的用處

《阿里巴巴Java開發手冊》中提到:浮點數之間的等值判斷,基本數據類型不能用==來比較,包裝數據類型不能用 equals 來判斷。 具體原理和浮點數的編碼方式有關,這裏就不多提了,我們下面直接上實例:

float a = 1.0f - 0.9f;
float b = 0.9f - 0.8f;
System.out.println(a);// 0.100000024
System.out.println(b);// 0.099999964
System.out.println(a == b);// false

具有基本數學知識的我們很清楚的知道輸出並不是我們想要的結果(精度丟失),我們如何解決這個問題呢?一種很常用的方法是:使用使用 BigDecimal 來定義浮點數的值,再進行浮點數的運算操作。

BigDecimal a = new BigDecimal("1.0");
BigDecimal b = new BigDecimal("0.9");
BigDecimal c = new BigDecimal("0.8");
BigDecimal x = a.subtract(b);// 0.1
BigDecimal y = b.subtract(c);// 0.1
System.out.println(x.equals(y));// true 

1.3.2. BigDecimal 的大小比較

a.compareTo(b) : 返回 -1 表示小於,0 表示 等於, 1表示 大於。

BigDecimal a = new BigDecimal("1.0");
BigDecimal b = new BigDecimal("0.9");
System.out.println(a.compareTo(b));// 1

1.3.3. BigDecimal 保留幾位小數

通過 setScale方法設置保留幾位小數以及保留規則。保留規則有挺多種,不需要記,IDEA會提示。

BigDecimal m = new BigDecimal("1.255433");
BigDecimal n = m.setScale(3,BigDecimal.ROUND_HALF_DOWN);
System.out.println(n);// 1.255

1.3.4. BigDecimal 的使用注意事項

注意:我們在使用BigDecimal時,為了防止精度丟失,推薦使用它的 BigDecimal(String) 構造方法來創建對象。《阿里巴巴Java開發手冊》對這部分內容也有提到如下圖所示。

1.3.5. 總結

BigDecimal 主要用來操作(大)浮點數,BigInteger 主要用來操作大整數(超過 long 類型)。

BigDecimal 的實現利用到了 BigInteger, 所不同的是 BigDecimal 加入了小數位的概念

1.4. 基本數據類型與包裝數據類型的使用標準

Reference:《阿里巴巴Java開發手冊》

  • 【強制】所有的 POJO 類屬性必須使用包裝數據類型。
  • 【強制】RPC 方法的返回值和參數必須使用包裝數據類型。
  • 【推薦】所有的局部變量使用基本數據類型。

比如我們如果自定義了一個Student類,其中有一個屬性是成績score,如果用Integer而不用int定義,一次考試,學生可能沒考,值是null,也可能考了,但考了0分,值是0,這兩個表達的狀態明顯不一樣.

說明 :POJO 類屬性沒有初值是提醒使用者在需要使用時,必須自己顯式地進行賦值,任何 NPE 問題,或者入庫檢查,都由使用者來保證。

正例 : 數據庫的查詢結果可能是 null,因為自動拆箱,用基本數據類型接收有 NPE 風險。

反例 : 比如显示成交總額漲跌情況,即正負 x%,x 為基本數據類型,調用的 RPC 服務,調用不成功時,返回的是默認值,頁面显示為 0%,這是不合理的,應該显示成中劃線。所以包裝數據類型的 null 值,能夠表示額外的信息,如:遠程調用失敗,異常退出。

2. 集合

2.1. Arrays.asList()使用指南

最近使用Arrays.asList()遇到了一些坑,然後在網上看到這篇文章: 感覺挺不錯的,但是還不是特別全面。所以,自己對於這塊小知識點進行了簡單的總結。

2.1.1. 簡介

Arrays.asList()在平時開發中還是比較常見的,我們可以使用它將一個數組轉換為一個List集合。

String[] myArray = { "Apple", "Banana", "Orange" }; 
List<String> myList = Arrays.asList(myArray);
//上面兩個語句等價於下面一條語句
List<String> myList = Arrays.asList("Apple","Banana", "Orange");

JDK 源碼對於這個方法的說明:

/**
 *返回由指定數組支持的固定大小的列表。此方法作為基於數組和基於集合的API之間的橋樑,與           Collection.toArray()結合使用。返回的List是可序列化並實現RandomAccess接口。
 */ 
public static <T> List<T> asList(T... a) {
    return new ArrayList<>(a);
}

2.1.2. 《阿里巴巴Java 開發手冊》對其的描述

Arrays.asList()將數組轉換為集合后,底層其實還是數組,《阿里巴巴Java 開發手冊》對於這個方法有如下描述:

2.1.3. 使用時的注意事項總結

傳遞的數組必須是對象數組,而不是基本類型。

Arrays.asList()是泛型方法,傳入的對象必須是對象數組。

int[] myArray = { 1, 2, 3 };
List myList = Arrays.asList(myArray);
System.out.println(myList.size());//1
System.out.println(myList.get(0));//數組地址值
System.out.println(myList.get(1));//報錯:ArrayIndexOutOfBoundsException
int [] array=(int[]) myList.get(0);
System.out.println(array[0]);//1

當傳入一個原生數據類型數組時,Arrays.asList() 的真正得到的參數就不是數組中的元素,而是數組對象本身!此時List 的唯一元素就是這個數組,這也就解釋了上面的代碼。

我們使用包裝類型數組就可以解決這個問題。

Integer[] myArray = { 1, 2, 3 };

使用集合的修改方法:add()remove()clear()會拋出異常。

List myList = Arrays.asList(1, 2, 3);
myList.add(4);//運行時報錯:UnsupportedOperationException
myList.remove(1);//運行時報錯:UnsupportedOperationException
myList.clear();//運行時報錯:UnsupportedOperationException

Arrays.asList() 方法返回的並不是 java.util.ArrayList ,而是 java.util.Arrays 的一個內部類,這個內部類並沒有實現集合的修改方法或者說並沒有重寫這些方法。

List myList = Arrays.asList(1, 2, 3);
System.out.println(myList.getClass());//class java.util.Arrays$ArrayList

下圖是java.util.Arrays$ArrayList的簡易源碼,我們可以看到這個類重寫的方法有哪些。

  private static class ArrayList<E> extends AbstractList<E>
        implements RandomAccess, java.io.Serializable
    {
        ...

        @Override
        public E get(int index) {
          ...
        }

        @Override
        public E set(int index, E element) {
          ...
        }

        @Override
        public int indexOf(Object o) {
          ...
        }

        @Override
        public boolean contains(Object o) {
           ...
        }

        @Override
        public void forEach(Consumer<? super E> action) {
          ...
        }

        @Override
        public void replaceAll(UnaryOperator<E> operator) {
          ...
        }

        @Override
        public void sort(Comparator<? super E> c) {
          ...
        }
    }

我們再看一下java.util.AbstractListremove()方法,這樣我們就明白為啥會拋出UnsupportedOperationException

public E remove(int index) {
    throw new UnsupportedOperationException();
}

2.1.4. 如何正確的將數組轉換為ArrayList?

stackoverflow:https://dwz.cn/vcBkTiTW

1. 自己動手實現(教育目的)

//JDK1.5+
static <T> List<T> arrayToList(final T[] array) {
  final List<T> l = new ArrayList<T>(array.length);

  for (final T s : array) {
    l.add(s);
  }
  return (l);
}
Integer [] myArray = { 1, 2, 3 };
System.out.println(arrayToList(myArray).getClass());//class java.util.ArrayList

2. 最簡便的方法(推薦)

List list = new ArrayList<>(Arrays.asList("a", "b", "c"))

3. 使用 Java8 的Stream(推薦)

Integer [] myArray = { 1, 2, 3 };
List myList = Arrays.stream(myArray).collect(Collectors.toList());
//基本類型也可以實現轉換(依賴boxed的裝箱操作)
int [] myArray2 = { 1, 2, 3 };
List myList = Arrays.stream(myArray2).boxed().collect(Collectors.toList());

4. 使用 Guava(推薦)

對於不可變集合,你可以使用類及其與工廠方法:(參數不能為空)

List<String> il = ImmutableList.of("string", "elements");  // from varargs
List<String> il = ImmutableList.copyOf(aStringArray);      // from array

對於可變集合,你可以使用類及其工廠方法:

List<String> l1 = Lists.newArrayList(anotherListOrCollection);    // from collection
List<String> l2 = Lists.newArrayList(aStringArray);               // from array
List<String> l3 = Lists.newArrayList("or", "string", "elements"); // from varargs

5. 使用 Apache Commons Collections

List<String> list = new ArrayList<String>();
CollectionUtils.addAll(list, str);

2.2. Collection.toArray()方法使用的坑&如何反轉數組

該方法是一個泛型方法:<T> T[] toArray(T[] a); 如果toArray方法中沒有傳遞任何參數的話返回的是Object類型數組。

String [] s= new String[]{
    "dog", "lazy", "a", "over", "jumps", "fox", "brown", "quick", "A"
};
List<String> list = Arrays.asList(s);
Collections.reverse(list);
s=list.toArray(new String[0]);//沒有指定類型的話會報錯

由於JVM優化,new String[0]作為Collection.toArray()方法的參數現在使用更好,new String[0]就是起一個模板的作用,指定了返回數組的類型,0是為了節省空間,因為它只是為了說明返回的類型。詳見:

2.3. 不要在 foreach 循環里進行元素的 remove/add 操作

如果要進行remove操作,可以調用迭代器的 remove方法而不是集合類的 remove 方法。因為如果列表在任何時間從結構上修改創建迭代器之後,以任何方式除非通過迭代器自身remove/add方法,迭代器都將拋出一個ConcurrentModificationException,這就是單線程狀態下產生的 fail-fast 機制

fail-fast 機制 :多個線程對 fail-fast 集合進行修改的時,可能會拋出ConcurrentModificationException,單線程下也會出現這種情況,上面已經提到過。

java.util包下面的所有的集合類都是fail-fast的,而java.util.concurrent包下面的所有的類都是fail-safe的。

開源項目推薦

作者的其他開源項目推薦:

  1. :【Java學習+面試指南】 一份涵蓋大部分Java程序員所需要掌握的核心知識。
  2. : 適合新手入門以及有經驗的開發人員查閱的 Spring Boot 教程(業餘時間維護中,歡迎一起維護)。
  3. : 我覺得技術人員應該有的一些好習慣!
  4. :從零入門 !Spring Security With JWT(含權限驗證)後端部分代碼。

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

【其他文章推薦】

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

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

大陸寄台灣空運注意事項

大陸海運台灣交貨時間多久?

※避免吃悶虧無故遭抬價!台中搬家公司免費估價,有契約讓您安心有保障!

研究:極地冰蓋以1990年代六倍速融化 每年將有4億人受洪災影響

環境資訊中心綜合外電;姜唯 編譯;林大利 審校

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

【其他文章推薦】

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

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

台灣海運大陸貨務運送流程

兩岸物流進出口一站式服務

丁磊透露樂視超級汽車2016戰略目標

日前,樂視在北京舉行了汽車生態戰略會議。樂視超級汽車聯合創始人、全球副董事長丁磊帶領各業務線負責人對2015年進行了總結,並提出了2016年樂視汽車生態的幾大核心戰略目標。據透露,2016年樂視超級汽車將實現“關鍵技術研發取得突破、生產製造體系全球頂尖、打造互聯網智慧電動車第一品牌和世界一流的O2O行銷銷售服務體系”的目標。

超級汽車進入生產準備期

丁磊同時宣佈,在即將到來的北京車展上,樂視不僅將帶來超級汽車的首款概念樣車,還將運用樂視生態獨具的顛覆性思維,打造一屆前所未有的生態車展。而樂視的戰略合作夥伴,來自矽谷的智慧互聯網電動汽車新貴FF也將首度來華,“踢館”北京車展。

相比生態合作和資本合作方面的高調傳播,有關超級汽車的研發進展,樂視卻一直秘而不宣。在這次戰略會上,丁磊透露,樂視汽車已經完成了第一代產品的定義及核心研發工作,進入了漫長而艱難的生產準備過程。

據悉,超級汽車項目將採取自建工廠和代工的模式進行,而且超級汽車的工廠將不是一個單純的汽車製造廠,“將被打造成涵蓋生產、展示、體驗、服務和休閒等多項功能的汽車生態產業園,成為當地的遊覽勝地和地標性建築。”

“北上廣深等一線城市都在選擇範圍中。”據樂視內部人士透露,誰將成為這樣一個全新概念的汽車生態園的最終選址,成為中國版的沃爾夫斯堡,答案也將在2016年揭曉。

打造互聯網智慧電動車第一品牌

打造品牌是樂視超級汽車在2016年的重點工作,也是樂視超級汽車在產品面世前的最重要的鋪墊。按照官方說法,樂視希望以互聯網技術為核心實現打造一個垂直整合的生態系統,打破產業邊界,實現跨界創新。汽車生態作為樂視生態系統的重要一環,樂視超級汽車品牌有著天然的生態基因,承擔著變革汽車產業,改善人類生存環境的使命。

在樂視控股集團創始人、董事長兼CEO賈躍亭的構想中,未來汽車將不再是簡單的出行工具,而將提供全新的交通生活場景;汽車產業鏈也將不再是上下游的線條型結構,而是一個融合了多個產業的開放的汽車生態。簡言之,樂視造的不是車,而是由車承載的垂直整合了互聯網、科技和文化產業的交通生活場景。
 

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

【其他文章推薦】

台北網頁設計公司這麼多,該如何挑選?? 網頁設計報價省錢懶人包”嚨底家”

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

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

小三通海運與一般國際貿易有何不同?

小三通快遞通關作業有哪些?

碎片化的時代,如何學習

今天周末,和大家聊聊學習這件事情。

在如今這個社會,我們的時間被各類 APP 撕的粉碎。

刷知乎、刷微博、刷朋友圈;

看論壇、看博客、看公號;

等等形形色色的信息和知識獲取方式一個都不錯過。

貌似學了很多,但是卻感覺沒什麼用。

要解決上面這些問題,首先要分清楚一點,什麼是信息,什麼是知識。

  • 那什麼是信息呢?

你一切聽到的、看到的,都是信息,比如微博上的明星出軌、微信中的表情大戰、抖音上的段子視頻。

  • 那什麼是知識呢?

就是指那些被驗證過的、正確的、被人們相信的概念、規律、方法論。

概念是什麼很好理解,我們上學的時候做的最多的一件事情就是背概念。

規律是事物背後的運行法則,例如當市場上某一種貨物供應量減少后,就會導致價格的上升。

方法論俗稱【套路】,解決某一類問題的時候,有效的解決方案。

信息有真假,有時效,而知識有積累、有迭代。我們要學習的是知識,而不是信息。

時間複利

再說一個概念,複利

這個大家都應該知道,比較多的應該是在銀行存錢或者是購買理財產品的時候,比如下圖的銀行複利增長曲線:

或者是下面這個公式:

1.01^365 = 37.8

隨公式還附贈一句雞湯:

如果一個人每天都能進步 1%,一年之後他的能力會提升 38 倍。

這句話雖然聽起來很雞湯,但是卻想不到有什麼問題,對吧?

反過來想一下這句話的前提,一個人都想要每天都能進步 1% ,這可能么?當然排除一些極端情況,對於看到我文章的大多數人來說,這是一件不可能的事情。

每天會形形色色的事情去阻止我們進步這 1% ,比如:

  • 今天上班被領導批了,心情不好,不想學習了
  • 今天工作太忙了,下班后時間都比較晚了,想要休息了
  • 今天和朋友一起出去玩了,玩的很開心

等等,然後我們看到身邊優秀的人的時候:

  • 看到他們隨隨便便就考試考出來好成績
  • 看到他們隨手寫的文章就是網絡爆文
  • 看到他們對於某一項技術非常精通的時候

是不是會有一種無力感,好像他們平時和我們一樣,該吃吃該喝喝該玩玩,但是人家就是很厲害的樣子。

於是,就產生了強烈的焦慮感,要學習,要提高自己,開始看更多的信息,關注更多的學習圈子,焦慮感加重,負向循環開始了。

但是,如果你肯相信時間複利的效應,就不會焦慮。

Why?

你現在看到身邊的人的成績,看到他輕輕鬆松做到的事情,即使你拼盡全力也不可能做到。

從一開始你就錯了,他們已經完成了自己的原始積累,他們已經到達了這件事情的複利拐點

什麼是複利拐點?

圖中這個小人站的位置就是複利拐點,

如果一個人到達複利拐點(圖中小人站的地方),那他的收益,會急劇增長,可能比之前所有時間的收益總和還要多。

這裏的收益可以是錢,是能力,是認知。

知識

上面我們介紹了如何區分信息和知識,這裏再分享一個個人理解,有效知識。

判斷一個知識是否有效,就要看這個知識和你之前的已有的知識是否能產生聯繫。

如果可以產生聯繫,那麼你對這個新的知識理解速度會非常的快。

就好比編程語言,小編的本職工作是一名 Java 軟件工程師,但是當小編去學習 Python 的相關基礎知識的時候,速度是非常快的,用旁人的視角看起來就好像小編的學習效率非常的高效。

當然,我們不可能只學習和自己已有知識相關方向的知識,可能會接觸一些完全陌生的領域,那麼這個時候如何還能保持效率較高的學習?

在進入一個新的領域的時候,所有的知識都是一個點一個點的,好像是散落在沙子里的石頭,中間是毫無關聯的,這個時間段的學習是非常痛苦的,小編一般稱為原始積累階段。

很多人在原始積累的階段因為過程過於痛苦,就慢慢的放棄了。

在痛苦的原始積累階段,很多時候看不到盡頭,之前的學習感覺都學過,但是仔細一想,又好像什麼都沒學。

這時,我們可以藉助工具去加強知識之間的關聯和加深自己的記憶——思維導圖。

這個工具小編也經常在用的,比如很多人可能都見過我的公眾號上小編自己整理的 Java 進階相關的思維導圖。

當學習一個新的領域的時候,每當一些基礎的概念能產生聯繫的時候,就可以去畫這麼一張思維導圖,思維導圖能讓我們更清晰直觀的理解不同的事物之間的內在聯繫。

長時間的原始積累太過痛苦怎麼辦?

這個是所有人都會遇到的問題,做一件事情,尤其是學習,當我們無法取得一些成果的時候,對興趣和自信的打擊都會非常的大。

首先在做這件事情之前,你需要為自己找到足夠開始這件事情的理由,也就是要有強大的內驅力。

就好比考研這件事情,如果是身邊的人要考,所以你也要考,那麼我覺得你到底要不要考研這件事情值得再思考一下。

但如果是說你想通過考研,來改變自己的人生軌跡,想要獲得更高的起點,那麼,我覺得這個事兒十有八九你是能堅持下去的。

好比學習 Python ,好像身邊的人都在學,那我也要了解一下,和那種我想要學 Python 來換一份工作,擺脫目前的工作狀態,獲取更高的薪水。

大家可能看着沒什麼感覺,但是想一想,自己的人生中,到底有沒有過堅持某一件事情,並最終獲得了一個還不錯的結果,最後收穫的這份快感,是不是無與倫比的。

當然,除了強大的內驅力以外,小編還可以友情提供一點小技巧。

獲取階段性的正向反饋。

如果一件事情需要耗費較長的時間,那麼再大的內驅力也可能會被時間的流逝給磨平了。

靜靜思考下放棄的原因,沒有獲得成就感。

還是拿考研舉例子,一般考研需要準備大半年到一年左右的時間,很多人都堅持不過半年時間就放棄掉了,為什麼,因為他們看不到成效,看不到曙光。但是高三的高考很多人還是能堅持下來的,為什麼?

因為高三有月考啊,每次月考完,都能準確的知道自己的水平提升了多少,自己一個月的努力是沒有白費的,自己一個月的努力是真真實實的化成了卷子上的分數。

所以,做一件需要長時間奮戰的事情,最好能提前為自己設定一些階段性的成果檢驗方式。

時間管理

時間管理是一個繞不開的話題,這裏小編其實也沒資格談這件事情,因為小編本身的時間管理也做的並不好,小編也是人,加完班也會感覺到累,回到家也會只想着休息,人非聖賢,對吧。

還是分享一些經驗吧。

嘗試將自己一天做的事情和耗費的時間列一個表格出來(小編之前列舉過,時間有些久遠,找不到了,這裏就不放圖了)。

當這個表格列出來以後,不管多麼自律的人,肯定會發現,一天之中,有相當部分的時間是被浪費掉的,比如刷朋友圈,刷抖音,刷微博。

在生活中,肯定會經常性的出現這樣事情。

“再玩5分鐘手機就睡覺!”

結果12點了還在玩手機。

周末早晨起來,“先玩一局遊戲,在做xxx”。

結果就是玩到了下午。

相信我,那些墮落的人,並不是一開始就想墮落的。

他們只是在被生活中形形色色的誘惑給誘惑到了,因為現在的社會,各個 APP 在掏空了心思去搶佔用戶的留存時長,它們費勁心力的去討好用戶,讓用戶用最簡單最不需要付出的方式去獲得這種毫無意義的低成本的快樂。

所以,開始記錄自己的時間,是做時間管理的第一步。

當然,並不是要我們完全的放棄娛樂時間,這不可能,人不是機器,不可能是只要有電,就能工作,人也是需要休息的,記錄時間只是為了讓我們在面臨選擇的時候,做出正確的選擇。

第一次寫這種長篇內容分享,有內容不當的地方請各位同學海涵。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

台北網頁設計公司這麼多,該如何挑選?? 網頁設計報價省錢懶人包”嚨底家”

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

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

小三通海運與一般國際貿易有何不同?

小三通快遞通關作業有哪些?

計算機網絡原理超詳解

計算機網絡重磅來襲——一文讓你撥開迷霧,直擊網絡原理

前言

為了保持學習網絡編程的連貫性和系統性,我在之前已經更新了《》《》,我只能說寫的確實很詳細,能讓你全盤吸收,不過你要沒看也不要緊,我會在此篇再來一個前情回顧,不會像上兩篇那樣詳細,但也能讓你理解。

一、前情回顧——計算機網絡概述

時代不同了,大家現在生活都好了,家家戶戶都有電腦了,而且我們都習慣了使用電腦辦公,打打遊戲,聊聊天。那我們來想一個事兒:如果沒有了網絡,我們是不是就不能使用電腦進行聊天了啊。那網絡到底是如何幫助我們來完成網絡聊天的?此篇我就跟大家繼續聊計算機網絡到底是怎麼回事兒。

這回我和以往反着來,先說官方定義,再解釋:

計算機網絡是由通信介質地理位置不同的且相互獨立的計算機連接起來,實現數據通信資源共享

我們知道兩個獨立且毫不相關的計算機,一台在青海,一台在河南,想要進行數據傳輸(聊天),沒網是不行的。這個網指的就是互聯網(Internet)。這個Internet它是一個通信協議。什麼是協議?打個比方,就好比我們打電話,在中國,中國有十幾億人,地大物博,全國各地都有自己的方言,還有些地方使用自己的民族語言,這時候想要良好的溝通就必須使用統一的一個標準,就是普通話。大家都講普通話,溝通起來就沒有問題了。那如果是不同國家進行溝通呢?我們可以選擇使用英語進行交流,那英語就是全世界國家通用的一個標準,計算機就好比是分佈在全世界各個角落的人,計算機之間通話也要找一個統一的標準,這個標準就是Internet標準,又叫做Internet協議。

二、網絡介紹及分類之隔壁老王的故事

先給大家講一個虛構版隔壁老王的故事:
有一個人叫隔壁老王,他有一個愛好就是看電影。有一天,這個隔壁老王想看一部電影,可是電腦裏面存儲的電影太多了,他費了老大勁才从里面找到,覺得很不爽。於是他想,我能不能把所有電影做個分類,把同一種類型的電影放在同一個文件夾下,然後把所有的文件夾整合在一起,自己寫個瀏覽器軟件,把文件夾信息放到瀏覽器上,到時候找電影的時候就好找了,只要找到相應的文件夾直接點進去就能找到電影了,老王說干就干,沒多久就把所有的文件夾整理好了,然後把所有文件夾放到同一個頁面上,到時候他想點哪個就點哪個,So easy!(那些網站可能就是這樣來的)。

這回出來一個新人物,就叫小王吧,不是小王八,老王就是住在小王隔壁,有一天小王看到老王電腦上有那麼多電影,就跟老王商量,能不能在他電腦上也弄個跟老王一樣的,讓他也看看。老王也不是個小氣的人,好東西就是要分享的嘛,想都沒想就答應了,給小王說在你電腦上插根線接到我電腦上,然後下載我這個軟件,直接訪問我的電腦就行了。小王很高興,他馬上回家按老王說的做,沒多久他的電腦上也能看老王電腦上的東西了。有了小王,就還會有小張,小李,互相插根網線,他們都能互相共享電影了。這樣,局域網也就產生了,就比如在一個公司或者一個學校用的網絡,都稱為局域網。那學校有很多呀,不同的學校用的局域網是不同的,不同城市的有不同的局域網,以局域網為單位,散布在一個區或一個城市的各個局域網加一起叫城域網,然後全世界所有城市的城域網加一起就叫廣域網

過了一段時間,老王去小王家,看到小王電腦里的電影比自己的還多,而且還好看,然後老王跟小王說,把你的這些電影給我一份吧,我也想看看。不用想,小王肯定立馬答應了,說你自己弄吧,想看哪個隨便看。姜還是老的辣,老王想到一個好辦法,他跟小王說,我再找一台電腦,把我倆電腦上的資源全部放到那台電腦里,我倆只要在那個電腦上插根線連到自己電腦上,就都能訪問那電腦上的東西了,這樣豈不是很方便。小王一拍腦門,呀!我咋就沒想到,那還不趕緊的。老王另外找了一台電腦,然後他倆把自己的電腦和那台電腦用線連起來,再把自己電腦里的所有資源全傳進那台電腦中,最後他倆就能共享資源了。(那台電腦就是服務器)(附加內容)

總結一下就是:

 

網絡按地域分類:根據參照物不同、類型不同分為

  • 局域網:一個公司、一個家庭、一個學校······
  • 城域網:一個地區、一個城市······
  • 廣域網:一個國家、全世界······

三、互聯網協議是如何分佈和設計的

我在上面說了Internet協議,互聯網協議按照功能的不同,分為osi七層tcp/ip五層tcp/ip四層協議。如下圖:

osi的七層協議體繫結構的概念清楚,理論也比較完善,但它既複雜又不實用,ISO制定的osi協議參考模型的過於龐大、複雜招致了許多批評。於此對照,由技術人員自己開發的TCP/IP協議獲得了更為廣泛的應用。因此,我們只需要弄明白TCP/IP五層協議就能了解和明白計算機最底層的通信是怎麼回事。

 

四、TCP/IP五層協議

如圖,從最下方的物理層到最上方的應用層,對於我們用戶而言,最直接的是應用層。從上到下每一層都依賴於下一層,所以我從最下一層開始給大家講解:

 

注意:每一層都運行着一個特定的協議,共同組合成互聯網協議

一、物理層

物理層主要是由雙絞線光纜電纜無線電波組成,其作用很簡單,就是連接不同的計算機,並傳遞底層電信號,高電壓:1,低電壓:0。

二、數據鏈路層

我們從物理層上接收或者發送單純的0、1是沒有意義的,為什麼呢?想想哈,我想給女朋友發送一句話:“你好漂亮”,那我們要把“你好漂亮”轉換成01之後,交給網卡,網卡就懵逼了,發給誰???不知道。那怎麼辦?必須要確定數據發給誰。就像我們的快遞一樣,是不是在外層包裝上有商家地址和個人地址,這樣我們不管是還是,都能準確定位了。網絡傳送數據也一樣,我們就在數據前面加上目標地址,為了能接收到回信,也要把自己的地址也加上。但是,如果數據和地址放在一起,又亂了,比如,我給你一堆01,1010101000101010101,你也分不清哪裡是數據,哪裡是地址。這時我們就要對要發送的01進行分組,規定前面xxx位是地址,後面xxx位是數據,並且,大家想互相都能通信,就必須都遵守這樣的規則(協議),這個協議叫以太網協議。在以太網協議出現之前,各個公司都有自己的分組規則,後來都統一使用以太網協議了。

以太網協議規定:一組電信號構成一個數據包,叫,每一幀分為報頭(head)和數據(data)兩部分。


報頭(head):固定18個字節

發送者/
源地址: 6個字節

接收者/
目標地址: 6個字節


數據類型:6個字節


數據(data):最短46個字節,最長1500字節

數據包的具體內容(發送給女朋友的話/快遞貨物)

 

以太網協議中的地址叫MAC地址,MAC地址是每台計算機唯一的物理地址,是被寫在網卡上的。以太網協議規定,每一台接收和發送數據的設備必須要裝有網卡,負責發送和接收數據的設備,發送端和接收端的地址,指的就是網卡的地址,即MAC地址

MAC地址

MAC地址是每個網卡在出廠的時候,由各個廠商直接燒錄在網卡上的,而且,這個地址必須是全世界唯一的。
MAC地址是由12位16進制的數字錶示(前六位是廠商編號,后六位是流水線號),這樣不同的廠商之間就不會產生衝突了,自己生產自己的就好了。

交換機

在這給大家介紹一個東西,我們說兩個電腦要通信要先連根線,但是如果電腦多了之後,電腦間通信連的線也就多了,這樣太亂了,我介紹的這個東西就是交換機,它是負責組件局域網,研究的是MAC地址,它有什麼用你看下面圖片中的接口就知道了

有了MAC地址,以太網就可以進行工作了.理論上講,我們可以和世界上的每一台連接了互聯網的計算機進行通信了,此時通信的方案是:廣播

廣播

廣播又是怎麼一回事?其實廣播的方式很原始,基本通信就是靠吼。就像你想跟女朋友求婚一樣,你會大喊:“xxx,嫁給我吧”,旁邊能聽到這句話的人有很多,但是只有你女朋友會回復你。其他人會把你當傻逼一樣看待。
沒錯,廣播就是這樣進行通信的。首先組織好了一個數據包之後,把這個數據包通過電信號發出去,這時整個網絡上所有的人都會收到你發的這條數據,然後看看這個數據是不是自己的。如果不是就當他不存在,如果是,就接收。雖然效率低點,但畢竟能通信了。

廣播帶來什麼問題呢?如果是在一個小的網絡環境里。比方說,你們宿舍幾個人,一起玩CS,沒問題,你喊一嗓子,你室友也能回應你,也就效率低點。但是如果你連接到全世界的互聯網上,還使用廣播的方式來通信,就不是效率問題了,而是一個巨大的通信災難。全世界60多億人,每個人吼一嗓子,每個人發送一條信息,那每個人都會收到60多億條信息,網絡瞬間癱瘓,這種問題被稱為廣播風暴,那如何解決呢?

三、網絡層

首先,我們要了解一個事情,世界大網絡(廣域網)是由一個一個的互相隔離的小型局域網(子網)組成的,不同的局域網之間使用路由來連接。

 

路由器

上面說的交換機是負責組建局域網,研究的是MAC地址,而路由器是負責組件廣域網,研究的是IP地址,這個IP地址下面我再解釋。

剛才說的廣播,只能在一個局域網內進行通信,不可以在大網絡上進行廣播,有了路由器,就避免了廣播風暴的問題。每個局域網被稱為一個廣播域,局域網和局域網之間使用路由的方式進行通信(向不同的廣播域/子網發送數據包),用路由器把一個局域網裡的所有計算機劃分成一個個子網。

 

現在大家先想一想生活中,如果是之前說的廣播,就相當於在一間教室里你正在上課,你要給某個女孩傳紙條,那你要在紙條外面寫上你和你要傳的女孩的名字,再在裏面寫上你要寫的話,寫好后折起來,你和女孩的名字在外,內容在內,然後讓同學一個一個幫你傳,每個同學在傳的時候都會看外面寫的名字,如果不是他,就繼續傳,直到傳到的人是你寫的那個女孩為止。那這間教室就相當於一個局域網。好,現在我們要實現局域網和局域網之間的通信,比如此時位於青海的你要給河南的朋友送東西,你不可能用廣播的方式了,你只能快遞,這個青海和河南以及還有很多不同的省份是我國的土地劃分,每一個省也可以看作是一個個局域網,那在網絡中,我國就相當於廣域網,那不同的局域網是如何劃分的呢?MAC地址是沒辦法區分的,因為MAC地址上只有廠商的流水號,這就引出我要說的網絡層,網絡層引出了一套新的地址來區分不同的局域網/子網,這一套地址就是網絡地址。

規定網絡地址的協議叫IP協議,它定義的地址叫IP地址。其實跟我國的省份名差不多,繼續說送快遞,你要把送的東西包裝好,在外面寫上你自己的地址和省份地址,還有朋友的地址和省份地址,交給青海的快遞公司,然後青海的快遞公司轉交給河南的快遞公司,最後由河南的快遞公司分配給你朋友,你朋友就收到快遞了。在這有兩點需要注意:

  • 你要同時寫兩個地址,自己的地址(MAC地址)和省份地址(IP地址),這樣就能確定所要接收和發送人的具體的位置了。
  • 青海的快遞公司和河南的快遞公司就相當於路由器
子網掩碼

在這給大家普及一下子網掩碼,我們上面說有了IP地址MAC地址,我們就能讓任何計算機之間進行通信了,那現在再想想,如果我要用我的計算機給另外一台計算機實現通信,我是不是要判斷要通信的計算機是否和我的計算機在同一個IP地址中,相當於上面例子中我和我要送東西的朋友是否在一個省,這個時候就需要用子網掩碼,我拿着我的IP地址和對方的子網掩碼通過計算,判斷是否在同一個IP地址下,如果在同一個IP地址下,我可以用廣播的形式進行通信,如果不在同一個IP地址下,我可以先把數據傳給我方的路由器,再由我方的路由器把數據傳給對方的路由器,最後由對方的路由器把數據傳給要接收數據的計算機。這樣說,再聯繫上面已經說過的,我想不難理解了。

IP地址

目前我們普遍使用的是IPV4,它規定,一個網絡地址由32位二進制組成,把32位平均分成四份,每一份8位,8位最大能表示的數據是255,所以IP地址的範圍:0.0.0.0-255.255.255.255.

一個IP地址分為兩部分,分別是網絡位主機位
網絡位用來標識不同的子網
主機位用來標識子網下主機的編號

為什麼要分兩部分呢?很簡單,就好比你想寫信給你的女朋友,假設你女朋友的地址是西寧市平安路128號,那麼網絡位就會直接找到西寧市,主機位幫你找到你的女朋友。

網絡位和主機位是如何劃分的?使用子網掩碼來劃分。子網掩碼和IP地址差不多,都是由32位二進制數來表示,子網掩碼也分為網絡部分主機部分,網絡部分由1組成,主機部分由0組成。

那說了這麼多,IP協議是如何發送數據的?協議規定,IP協議使用IP數據包進行發送數據。IP數據包同樣把數據分為了兩部分,headdata,並且在發送數據的時候,直接用IP數據包直接裝載以太網的data部分。

head:長度為20到600字節
data:最長為65515字節
而以太網數據包的“數據”部分,最長只有1500字節,因此,如果IP數據包超過了1500字節,它就需要分割成幾個以太網數據包,分開發送了。

 

再回顧一下啊,以太網的頭是包含了自己的MAC地址目標MAC地址的,那如何查找目標MAC地址呢?前輩們弄了一個叫ARP協議的東西專門來解析目標MAC地址。它是如何工作的?首先,它是數據鏈路層的東西,在我們發送一個數據包的時候是包含着對方的IP地址的。例如我(172.13.4.58)想發送一條數據給女朋友(172.13.4.90),首先,我得先拿到女朋友的MAC地址才可以通信。此時,我們會先計算一下我和女朋友是否在一個子網內(子網掩碼)

  • 在一個子網內,直接廣播發送一個數據包

    子網內的計算機發現了這個包之後會返回一個數據包並且帶有MAC地址,這樣就通過IP地址找到了目標主機的MAC地址,接下來就可以進行數據傳輸了。

  • 不在一個子網內,單純的用廣播就不行了,因為廣播只是針對自己內網而言。那怎麼辦,此時會把數據包發給網關,由網關發給其它路由,這樣在整個萬維網裡就可以找到你想要的那個計算機的MAC地址了。
總結
  • ARP就是通過IP地址來查找MAC地址的一套固定協議,它是數據鏈路層的內容。
  • 網絡層的意義:定義了子網, 區分各個局域網
  • IP地址:網絡地址
  • 子網掩碼:計算是否是同一個子網

四、傳輸層

到目前為止,前三層內容已經可以進行數據傳輸了。但是,我們的一台計算機上可以一次性運行多個網絡應用程序,比如,QQ、微信、LOL三個軟件一起運行,都要進行網絡傳輸,但是就前面學習的這三層內容,是沒辦法區分開數據是要發送給哪一個軟件的。那怎麼辦?引入第四層,傳輸層,傳輸層定義了端口的概念,每一個網絡應用程序佔用一個網絡端口,不同的程序就用端口把數據隔離,兩兩互相不影響。

  • 端口:應用程序和網卡的關聯編號
  • 傳輸層:建立端口到端口的通信。
  • 傳輸層有兩種協議:TCPUDP
TCP協議

TCP協議:可靠傳輸,TCP數據包沒有長度限制,理論上可以無限長,但是為了保證網絡的效率,通常TCP數據包的長度不會超過IP數據包的長度,以確保單個TCP數據包不必再分割。

TCP頭放的主要是
源端口
目標端口

 

UDP協議

UDP協議:不可靠傳輸,“報頭”部分一共只有8個字節,總長度不超過65535字節,正好放進一個IP數據包。

其實和郵信是一樣的,寫好地址,寫好接收人,直接裝進信封里,丟進郵箱里就不用你管了,對方什麼時候收,收沒收到,你不知道。

 

五、應用層

用戶使用的都是應用程序,均工作於應用層,大家都可以開發自己的應用程序,數據多種多樣,必須規定好數據的組織形式。對於用於而言最直觀的就是應用層。

  • 應用層:規定應用程序的數據格式

:TCP協議可以為各種各樣的程序傳遞數據,比如Email、WWW、FTP等,那麼,必須有不同協議規定电子郵件、網頁、FTP數據的格式,這些應用程序協議就構成了“應用層”。

總結

以上是對TCP/IP5層協議的解讀,總結一下:

發送數據其實就是一個封裝數據的過程

最後從物理層發出,對方接收到了之後再自下而上一層一層打開拿到數據,以上內容就是一個網絡傳輸的大致過程,其中還有好多細節沒有闡述,但大家知道和了解以上內容,對開發而言足夠了。

 

結束

本來還想加上TCP協議的三次握手四次斷開,奈何考慮到篇幅過大,對讀者不利,權衡再三,決定單獨去寫這部分。

看完有收穫?那麼希望老鐵別吝嗇你的三連擊哦
1、點個推薦,讓更多的人看到這篇文章
2、關注我的原創微信公眾號【泰斗賢若如】,第一時間閱讀我的文章
3、歡迎關注我的博客

 【原創聲明】:本人原創:

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

【其他文章推薦】

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

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

大陸寄台灣空運注意事項

大陸海運台灣交貨時間多久?

※避免吃悶虧無故遭抬價!台中搬家公司免費估價,有契約讓您安心有保障!

[ASP.NET Core 3框架揭秘] 文件系統[2]:總體設計

在《》中,我們通過幾個簡單的實例演示從編程的角度對文件系統做了初步的體驗,接下來我們繼續從設計的角度來進一步認識它。這個抽象的文件系統以目錄的形式來組織文件,我們可以利用它讀取某個文件的內容,還可以對目錄或者文件實施監控並及時得到變化的通知。由於IFileProvider對象提供了針對文件系統變換的監控功能,在.NET Core下里類似的功能大都利用一個IChangeToken對象來實現,所以我們在對IFileProvider進行深入介紹之前有必要先來了解一下IChangeToken。

一、IChangeToken

從字面上理解的IChangeToken對象就是一個與某組監控數據關聯的“令牌(Token)”,它能夠在檢測到數據改變的時候及時地對外發出一個通知。如果IChangeToken關聯的數據發生改變,它的HasChanged屬性將變成True。我們可以調用其RegisterChangeCallback方法註冊一個在數據發生改變時可以自動執行的回調,該方法會返回一個IDisposable對象,我們通過用其Dispose方法解除註冊的回調。至於IChangeToken接口的另一個屬性ActiveChangeCallbacks,它表示當數據發生變化時是否需要主動執行註冊的回調操作。

public interface IChangeToken
{
    bool HasChanged { get; }
    bool ActiveChangeCallbacks { get; }
    IDisposable RegisterChangeCallback(Action<object> callback, object state);
}

.NET Core提供了若干原生的IChangeToken實現類型,我們最常使用的是一個名為CancellationChangeToken的實現。CancellationChangeToken的實現原理很簡單,它基本上就是按照如下的形式藉助我們熟悉的CancellationToken對象來發送通知。

public class CancellationChangeToken : IChangeToken
{
    private readonly CancellationToken _token;
    public CancellationChangeToken(CancellationToken token)  => _token = token;
    public bool HasChanged  => _token.IsCancellationRequested; 
    public bool ActiveChangeCallbacks  => true;    
    public IDisposable RegisterChangeCallback(Action<object> callback, object state)  => _token.Register(callback, state);
}

除了CancellationChangeToken,有時也我們也會使用到一個名為CompositeChangeToken的實現。顧名思義,CompositeChangeToken代表由多個IChangeToken組合而成的複合型IChangeToken對象。如下面的代碼片段所示,我們在調用構造函數創建一個CompositeChangeToken對象的時候,需要提供這些IChangeToken對象。對於一個CompositeChangeToken對象來說,只要組成它的任何一個IChangeToken發生改變,其HasChanged屬性將會變成True,而註冊的回調自然會被執行。至於ActiveChangeCallbacks屬性,只要任何一個IChangeToken的同名屬性返回True,該屬性就會返回True。

public class CompositeChangeToken : IChangeToken
{
    public bool  ActiveChangeCallbacks { get; }
    public IReadOnlyList<IChangeToken>  ChangeTokens { get; }
    public bool  HasChanged { get; }
   
    public CompositeChangeToken(IReadOnlyList<IChangeToken> changeTokens);   
    public IDisposable RegisterChangeCallback(Action<object> callback, object state);   
}

我們可以直接調用IChangeToken提供的RegisterChangeCallback方法來註冊在接收到數據變化通知后的回調操作,但是更常用的方式則是直接調用靜態類型ChangeToken提供的如下兩個OnChange方法重載來進行回調註冊,這兩個方法的第一個參數需要被指定為一個用來提供IChangeToken對象的Func<IChangeToken>委託。

public static class ChangeToken
{
    public static IDisposable OnChange(Func<IChangeToken> changeTokenProducer,  Action changeTokenConsumer) ;
    public static IDisposable OnChange<TState>(Func<IChangeToken> changeTokenProducer,  Action<TState> changeTokenConsumer, TState state) ;
}

二、IFileProvider

在了解了IChangeToken是怎樣一個對象之後,我們將關注轉移到文件系統的核心接口IFileProvider上,該接口定義在NuGet包“Microsoft.Extensions.FileProviders.Abstractions”中。我們在《》做了幾個簡單的實例演示,它們實際上體現了文件系統承載的三個基本功能,而這三個基本功能分別體現在IFileProvider接口如下所示的三個方法中。

public interface IFileProvider
{    
    IFileInfo GetFileInfo(string subpath);
    IDirectoryContents GetDirectoryContents(string subpath);
    IChangeToken Watch(string filter);
}

三、IFileInfo

雖然文件系統採用目錄來組織文件,但是不論是目錄還是文件都通過一個IFileInfo對象來表示,至於具體是目錄還是文件則通過IFileInfo的IsDirectory屬性來確定。對於一個IFileInfo對象,我們可以通過只讀屬性Exists判斷指定的目錄或者文件是否真實存在。至於另外兩個屬性NamePhysicalPath,它們分別表示文件或者目錄的名稱和物理路徑。屬性LastModified返回一個時間戳,表示目錄或者文件最終一次被修改的時間。對於一個表示具體文件的IFileInfo對象來說,我們可以利用屬性Length得到文件內容的字節長度。如果我們希望讀取文件的內容,可以藉助於CreateReadStream方法返回的Stream對象來完成。

public interface IFileInfo
{
    bool Exists { get; }
    bool  IsDirectory { get; }
    string Name { get; }
    string PhysicalPath { get; }
    DateTimeOffset LastModified { get; }
    long Length { get; }

    Stream CreateReadStream();
}

IFileProvider接口的GetFileInfo方法會根據指定的路徑得到表示所在文件的IFileInfo對象。換句話說,雖然一個IFileInfo對象可以用於描述目錄和文件,但是GetFileInfo方法的目的在於得到指定路徑返回的文件而不是目錄(我個人不太認同這種令人產生歧義的API設計)。一般來說,不論指定的文件是否存在,該方法總會返回一個具體的IFileInfo對象,因為目標文件的存在與否是由該對象的Exists屬性來確定的。

四、IDirectoryContents

如果希望得到某個目錄的內容,比如需要查看多少文件或者子目錄包含在這個目錄下,我們可以調用IFileProvider對象的GetDirectoryContents方法並將所在目錄的路徑作為參數。目錄內容通過該方法返回的IDirectoryContents對象來表示。如下面的代碼片段所示,一個IDirectoryContents對象實際上是一組IFileInfo對象的集合,組成這個集合的所有IFileInfo自然就是對包含在這個目錄下的所有文件和子目錄的描述。和GetFileInfo方法一樣,不論指定的目錄是否存在,GetDirectoryContents方法總是會返回一個具體的IDirectoryContents對象,它的Exists屬性會幫助我們確定指定目錄是否存在。

public interface IDirectoryContents : IEnumerable<IFileInfo>
{
    bool Exists { get; }
}

五、監控目錄或者文件更新

如果我們希望監控IFileProvider所在目錄或者文件的變化,我們可以調用它的Watch方法,當然前提是對應的IFileProvider對象提供了這樣的監控功能。這個方法接受一個字符串類型的參數filter,我們可以利用這個參數指定一個針對“文件匹配模式(File Globing Pattern)”表達式(以下簡稱Globing Pattern表達式)來篩選需要監控的目標目錄或文件。

Globing Pattern表達式比正則表達式簡單多了,它只包含“*”一種“通配符”,如果硬說它包含兩種通配符的話,那麼另一個通配符是“**”。Globing Pattern表達式體現為一個文件路徑,其中“*”代表所有不包括路徑分隔符(“/”或者“\”)的所有字符,而“**”則代表包含路徑分隔符在內的所有字符。下錶給出了幾個典型的Globing Pattern表達式和它們代碼的文件匹配語義。






















Globing Pattern表達式

匹配的文件

src/foobar/foo/settings.*

 

子目錄“src/foobar/foo/”(不含其子目錄)下名為“settings”的所有文件,比如settings.jsonsettings.xmlsettings.ini等。

src/foobar/foo/*.cs

 

子目錄“src/foobar/foo/”(不含其子目錄)下的所有.cs文件。

src/foobar/foo/*.*

子目錄“src/foobar/foo/”(不含其子目錄)下所有文件。

src/**/*.cs

子目錄“src”(含其子目錄)下的所有.cs文件。

一般來說,不論是調用IFileProvider對象的GetFileInfo或GetDirectoryContents方法所指定的目標文件或目錄的路徑,還是調用Watch方法指定的篩選表達式,都是一個針對當前IFileProvider對象映射根目錄的相對路徑。指定的這個路徑可以採用“/”字符作為前綴,但是這個前綴是不必要的。換句話說,如下所示的這兩組程序是完全等效的。

路徑不包含前綴“/”

var dirContents = fileProvider.GetDirectoryContents("foobar");
var fileInfo = fileProvider.GetFileInfo("foobar/foobar.txt");
var changeToken = fileProvider.Watch("foobar/*.txt");

路徑包含前綴“/”

var dirContents = fileProvider.GetDirectoryContents("/foobar");
var fileInfo = fileProvider.GetFileInfo("/foobar/foobar.txt");
var changeToken = fileProvider.Watch("/foobar/*.txt");

總的來說,以IFileProvider對象為核心的文件系統在設計上看是非常簡單的。除了IFileProvider接口之外,文件系統還涉及到其他一些對象,比如IDirectoryContents、IFileInfo和IChangeToken等,下圖所示的UML展示了這些接口以及它們之間的關係。

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

【其他文章推薦】

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

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

大陸寄台灣空運注意事項

大陸海運台灣交貨時間多久?

※避免吃悶虧無故遭抬價!台中搬家公司免費估價,有契約讓您安心有保障!