網路程式開發者所需要的網路知識 ( Concepts for a network programmer )

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

身為一個網路程式開發者所需要的網路知識可能如下:
  • 網路工具的使用。
  • 網域名稱與主機位址。
  • 通訊協定。
  • 網路封包。

網路工具的使用

在Linux Ubuntu上可利用下面指令來安裝網路工具:
sudo apt-get install netcat-openbsd tcpdump traceroute mtr
請在Linux下試試底下的指令:
ip addr show eth0
ip route show
ping -c3 8.8.8.8ip route show default
netstat -nr
host -t aaaa google.com
host -t mx tw.yahoo
tcpdump -n -c5 -i eth0 port 22traceroute tw.yahoo.com
mtr tw.yahoo.com
printf 'HEAD / HTTP/1.1\r\nHost: tw.yahoo.com\r\n\r\n' | nc tw.yahoo.com 80

在Windows系統下,有 netstat 與 ping 指令可以用來檢查電腦的網路狀態。此外若需要分析封包時,可用Wireshark這套軟體來協助。

檢測電腦 IPv6 的功能網頁:http://test-ipv6.com/

網域名稱與主機位址。

網域名稱(Domain Name)是用來辨識網路上某一台電腦,以Google為例, www.google.com 剛好是Google的網域名稱與搜尋引擎網址的名稱,每一個網域名稱通常會有至少一組的 IP位址(住址),這可用 ping 的指令來查詢到,而 www.google.com 所對應的IP可能為108.177.97.106。
【那這IP是從何而來的?】透過網路上的 Domain Name System所存放的網域名稱與IP對應表,一個網域名稱所對應的IP就可被查詢到了。

另外,現存的主機位址有 32 bits 的 IPv4 與 128 bits 的 IPv6。此外也需要分清楚私有網路與公開網路以及實體IP、虛擬IP、固定IP、子網路(Subnetwork)等觀念。

通訊協定。

現今有很多軟體會透過網路進行資料傳輸,如閱讀網頁的瀏覽器(Browsers)、檔案傳輸、遊戲、遠端登入等,這些軟體之間的溝通方式需要統一,所用的方式就是透過建立每一種服務的通訊協定,目前已有很多的通訊協定已制定好了,如網頁服務的HTTPHTTPS,檔案傳輸的FTP。除了這些已制定好的通訊協定外,還有自訂的通訊協定,例如遊戲公司所開發的網路遊戲所使用的資料傳輸格式就會是開發團隊所定義的協定。下圖以網頁為例:

圖的左邊為瀏覽器(Firefox、IE、Chrome等),右邊為網頁伺服器,兩者之間透過 HTTP/HTTPS來統一溝通的方式;若是檔案傳輸服務時,左邊就變成請求服務的FTP Client,右邊變成提供服務的 FTP Server,中間的箭頭變成FTP協定了。若是遊戲公司所開發的線上遊戲會是怎麼回事呢?

在程式語言中,圖中的箭頭通常是由 socket 相關的 API 所建立的,可參考 Java 官方的教學文件:What Is a Socket ?

網路封包

須了解網路封包的格式、順序、為什麼封包會遺失等觀念,網路封包的格式會根據不同的通訊協定而有差異,請參考各自的通訊協定的規範,例如網頁 ==> HTTP 或 HTTPS。在網路上,資料的傳輸順序不一定是依序的,會依據網路狀況與軟體的設計方式而有所不同,在多工的系統上就會更混亂了。

以一個團體在討論議題時為例,可能的情況:甲對主席提問,同時乙跟丙也對主席提問,三人都只顧自己發言,不等人發言完再發言。這時主席有辦法了解甲乙丙三人的問題嗎?伺服器的情況跟主席一樣,若有太多資料要處理時,伺服器有可能就當掉了,這是網路封包會掉的原因之一,當然還有其他的原因,就請讀者慢慢體會了。

以上幾點的詳細內容可參考Udacity上的免費課程:Networking for Web Developers

希望有幫助到讀者建立學習的方向。

如何學好物件導向程式設計

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

本文為延續如何學好程式語言一文,要來說明學習物件導向程式設計需要的學習目標有哪些:
  • 物件(Objects)
  • 類別(Classes)
  • 繼承(Inheritance)
  • 多型(Polymorphism)
  • 封裝(Encapsulation)


物件(Objects)

所有的東西都是物件。(Everything is an object.)
這句話是什麼意思呢?舉凡看的到、摸的到、看不到、摸不到、聞的到的東西等,只要說得出名稱的都可以稱為物件,所以「看到鬼了!」這句話中的「鬼」是個無形的物件(嗎?)。鉛筆、原子筆等就是有形的物件。在程式碼中的變數名稱就是程式語言中的物件,例如下面程式碼:
int grade;
String studentName;
grade 可能是用來表示「成績」這個物件。
studentName可能是用來表示「學生姓名」這個物件。

在程式碼中物件的宣告(定義)方式如下,
Object objName;
Object是物件的型態,有可能為基本型別:int, float, char, ...etc,或是類別(Class)型別。談到類別的話,就請往類別一小節閱讀。

每個物件都有行為與特徵,例如人這個物件會跑、說、走、跳等行為,人有身高、體重、膚色等特徵,行為在程式語言裡常用成員函式(Member functions)來實現,而特徵常用類別的成員資料(Member data)來表示。

類別(Classes)

因為程式語言內建的基本型別只能記錄少許的資訊,例如int型別就只能記錄整數部分,於是在C語言中有strcut的出現,可用來記錄不同型別的資訊例如:
struct Computer{
   int product_id;
   char *cpuType;
   int*ram;
   float price;
};
上述例子Computer紀錄了四筆資料,但這樣還不能描述物件的行為。於是電腦科學的專家們想出classes這個觀念出來,用類別來表示物件的藍圖(積木),於是【將現實生活中的物件變成程式語言中的軟體物件】這一過程叫做資料抽象化。物件與類別的圖文說明可參考此文:Objects and Classes in Java

繼承(Inheritance)

繼承這觀念和生物界的繁殖有些關係,因為生物會繼承上一代的特徵,但程式碼本身不會主動繁殖,導致繼承的觀念出現在OOP的世界裡,不同的程式語言有不一樣的繼承語法,例如Java, php是用extends,C++與C#是用英文冒號 : 。繼承的主要目的是重複使用程式碼與擴充程式功能。

多型(Polymorphism)

有了繼承之後,若遇到下列情況時,該怎麼辦?
在程式中用Pen當作基礎類別建立了五種筆:鉛筆、鋼筆、毛筆、水彩筆、墨水筆。
每一種筆都有畫線這個動作,藉由多型就可以做類似下面的程式碼:
Pen[] myPens = { 
 new Pencil(),
 new FountainPen(),
 new Brush(),
 new WatercolorPen(),
 new InkPen()
};

myPen[index].drawLine();
此例中,myPens[index]會根據陣列索引的不同而去呼叫對應的畫線動作,例如:
myPens[0].drawLine(); 會呼叫 Pencil的畫線動作。
myPens[2].drawLine(); 會呼叫 Brush的畫線動作。
以上是簡易說明多型的用法,詳細的圖文說明可參考此文:Java Inheritance & Polymorphism

封裝(Encapsulation)

資料抽象化是要弄清楚一個類別需要有什麼功能,而封裝是要知道如何達到類別所需要的功能,也就是說在抽象化的時候,可能會設計出下面的類別:
public class Student{
   String name;
   int age;
   String nickName;

   void run() {
   }

   void hungry() {
   }

   void sleeping() {
   }
}
但在封裝的過程裡,就會將權限修飾子(Access Modifiers)與函式內的程式碼給補齊,Student類別有可能變成:

public class Student{
   private String name;
   protected int age;
   protected String nickName;
   public void run() { System.out.println("run");  }
   public void hungry() {  System.out.println("hungry"); }
   protected void sleeping() {  System.out.println("sleeping"); }
}

結語

以上五點是入門物件導向程式設計的基礎觀念,若熟悉之後,可進一步研究Software Design Pattern,雖然Software Design Pattern不限定一定要用OOP來實現,但用OOP來寫Design Pattern比較容易些。此外,學習物件導向程式設計時,可以同時學習物件導向系統設計來相輔相成。

如何學好程式語言

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

本文不提如何自學程式設計,而是說明「決定要學程式語言時,要如何學好它」,大致上有下面幾點需要學習的:
  • 如何使用變數。
  • 如何運用陣列。
  • 如何運用判斷敘述。
  • 如何運用重複結構。
  • 如何定義函式。
  • 如何使用函式庫 libraries 。
  • 如何除錯 debug。
以上幾點若能熟練的話,對於小程式來說是足夠的。底下會根據各點分別說明。

如何使用變數

此部分包含需要知道變數的型態,以及這個變數可以用來做什麼,例如此行程式碼
 int sum;
是代表用來做整數的加總嗎?這可不一定,那下面一行程式碼的變數應該就是用來做整數的加總了吧!
 int sumOfIntegers;
或許是吧!以上兩例的變數是為了要說明變數命名的重要性,變數命名就好像在取人名一樣,取的好,看程式碼的人就容易了解,也有助於程式碼的可讀性。此外,變數範圍(Variable Scope)也需要了解。

如何運用陣列

陣列英文為Array,為資料結構的一種,此部分包含如何定義一個陣列、如何賦值給陣列、一維陣列、二維陣列、尋找陣列中的元素、陣列元素的排序等。


如何運用判斷敘述

需活用if-then-else、switch的判斷敘述,以及比較運算子與邏輯運算子,再來就是巢狀判斷敘述的運用。

如何運用重複結構

需了解所學的程式語言有哪些loops 迴圈敘述語法,例如C語言有 for、while、do/while等重複結構,重複結構的目的是讓某一段程式碼重複執行,就像我們每天早上會吃早餐、刷牙、洗臉等,這些早上做的事一年會重複好幾次,而程式語言就是用重複結構來做類似的事。

如何定義函式

函式在不同的程式語言裡有不一樣的英文名稱,在Java叫做 Method,C/C++叫做Function,Visual Basic叫做Procedure等。函式和數學函數有相同的地方:都是用來運算用的。只不過函數是數學運算,而函式是告訴CPU處理器做一些事情。了解如何定義函式後,也須學習如何使用函式,更進階一點還需要瞭解遞迴函式(Recursion)

如何使用函式庫 libraries 

「除非必要,否則別從頭打造積木。」在現今的軟體開發裡,很少有人自己從頭打造軟體積木了,因為很多的軟體積木已經被打造出來了,例如要做影音處理的話,可用OpenCV函式庫;要做手機程式開發,可用Android SDK或是iOS SDK等;用Java開發軟體的話,請善用JDK。(註:SDK是Software Development Kit,JDK是Java Development Kit,恩,就是一堆DK開發工具讓軟體開發人員使用。)

如何除錯 debug

「程式結果不如預期?!」「程式當掉了!」
當還在學習階段的時候,遇到以上等情況時,其實是增加自己程式能力的時候,因為找到bug,也就是找到問題所在了,不過除錯過程總是很辛苦的,若有資深的人指導時,幫助會更大。

結言

以上只是軟體開發入門而已,因為除了以上幾點之外,若要開發專案的話,就會遇到如何管理程式碼等問題了,這時就需要了解程式碼管理、程式碼版本控制等;若要考慮程式效能的話,就需要挑選演算法與資料結構的設計。若要開發網路程式,就須了解電腦網路運作的原理。總之,軟體開發包含許多學問在裏頭的。

螢幕白板筆 Pointofix 介紹

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

筆者從網路上找到這套用來桌面塗鴉的軟體,剛好有繁體中文的介面可以使用,於是筆記一下。官網:http://www.pointofix.de/download.php

中文化方式見下圖:

用免安裝版本就可以帶著跑了。