[Go]取得實體網卡的IPv4網路遮罩(Get device network mask)

##前言

最近在研究一些Golang在UDP上的處理,主要是要抓取網路遮罩(network mask)做一些進階使用.就發現要取得正確的網路遮罩,其實是蠻困難的.由於是無法直接使用到裝置上面的網卡設定.

這邊介紹一下相關的流程:

###先來抓取IPv4

這邊先顯示抓取IP的方式:

func GetIP() net.IP {

	ifaces, err := net.Interfaces()
	// handle err
	if err != nil {
		log.Println("No network:", err)
		return nil
	}

	for _, i := range ifaces {
		//只抓取網路卡名稱為"en0", "en1"...
		if strings.Contains(i.Name, "en") {
			addrs, err := i.Addrs()
			// handle err
			if err != nil {
				log.Println("No IP:", err)
				return nil
			}

			for _, addr := range addrs {
				var ip net.IP
				switch v := addr.(type) {
				case *net.IPNet:
					log.Println("IPNET")
					ip = v.IP
				case *net.IPAddr:
					log.Println("IPAddr")
					ip = v.IP
				}
				
				//這裡會抓取兩種IP,分別是IPv4與IPv6
				if ip[0] == 0 {
					//第一個byte是0為IPv4
					log.Println("Get device:", i.Name)
					return ip
				}
			}
		}
	}

	return nil
}

透過這個方式可以列舉所有的網路卡並且把第一張具有IPv4資料的net.IP傳回來.

###再來找Network Mask

其實透過官方的API,原本就有一個IP.DefaultMask()函式可以使用.不過抓來的Network Mask是透過計算而來的,而不是跟網卡拿的.透過以下的範例:

 package main

 import (
         "fmt"
         "net"
 )

 func main() {
         addr := net.ParseIP("192.168.1.1")
         mask := addr.DefaultMask()
         fmt.Printf("Address : %s \n Network : %s \n", addr.String(), mask)
        //Mask 255, 255, 255, 0
 
         addr = net.ParseIP("172.16.110.123")
         mask = addr.DefaultMask()
         fmt.Printf("Address : %s \n Network : %s \n", addr.String(), mask)
        //Mask 255, 255, 0, 0
}

這邊可以看到,如果你的內部網路不是設定192.168.XXX.XXX的話,你抓到的mask都會是255.255.0.9.這樣的結果跟你在網路卡上面查到的可能會完全不相同.

###跟網卡拿取資料

比較好也比較不容易有問題的方式,就是直接透過系統的指令(console)去跟OS拿取網卡的資料.這裡貼上兩種方式:

Windows 版本(目前Go 1.5.2 broken,預計Go 1.6會修好)

網路上搜尋到的應該都是透過這個方式,不過在Go 1.5.2似乎broken了,聽說Go 1.6會修好. 可以參考這個Go: issue 12551

Mac OSX的版本,透過Ipconfig指令來抓取

這是我自己尋找的,透過Mac OS X的命令列來抓取資料,其實是比較簡單也比較方便的.不會因為版本有太大的問題. 使用方式就是call GetNetMask("en0")

###結論:

要抓取IP可以透過net package來抓取,但是需要IPv4的網路遮罩,還是得要跟實體設備直接抓取比較妥當. 不過之後都要使用IPv6了,就不用那麼麻煩啦.

參考練結:

程式設計週記[2016/01/08]: 再爛的政局也要去投票,再糟的架構也要寫測試

(image from twitter)

這是什麼?

程式週記主要內容如下:

  • Gihub project 介紹:
    • 主要會貼一些github,但是會盡量寫上一些有用的評語(或是我容易想到的關鍵詞)幫助以後查詢
  • 網路文章心得:
    • 會寫些心得,強迫自己閱讀.

“程式週記”並且定期週期性更新.

本週摘要

本週想研究iOT傳輸協定中使用UDP的CoAP(Constrained Application Protocol),看了挺久的RFC還是沒有很了解.先寫一些簡單的應用來試著了解.

iOS/MacOSX

  • iOS崩溃调试的使用和技巧总结
    • 如何來抓取iOS App crash log? 這裡有三個建議方式:
      • 使用第三方的Crash log ( 這裡是講百度)
      • 自己寫crash log然後上傳server
      • XCode-Device裡面查看(如果機器在你那邊)
      • 使用Apple Xcode自帶功能 Window->Organizer->Crashes

Python

Go

  • pubnative/mysqldriver-go: GC optimized MySQL driver
    • 原本的Go build-in的MySQL driver由於使用到太多的heap會造成GC頻繁的產生,而這個是 GC optimized 過的 Golang MySQL driver,大量減少heap的產生,進而減少GC的發生次數.讓系統效能能夠更好.
    • Heap size與Heap的使用率是GC發生的基本參數(參考這篇Go GC: Latency Problem Solved).雖然透過GOGC可以調整heap的數量(GOGC越高heap上限變得更高,但是記憶體更消耗.反之記憶體比較低,但是GC會很常發生.)

網路文章

有聲書心得

IT公論#185-「很多 longform 是没有什么深度的。」

  • 主要是請到Huffington Post的華人編輯周宗珉來談談美國新聞媒體的一些近況,Huffington Post是一個全世界最大的網路新聞媒體,主要內容以政治新聞為主.相當的驚訝該媒體竟然相當的擁抱科技,並且會要求每個編輯要學程式與網頁編輯.
  • 這邊有簡單分類網頁廣告的類別:
    • Banner: 第一代的廣告上面有橫幅的廣告頁面.
    • Programatic Advertise: 透過機器來廣告,也是Adblock主要在封鎖的部分.
    • Native Advertise: 指的是鎖定在文章裡面的廣告,不是第一代的廣告的
  • 關於Adblock有一個特別的想法是會安裝adblock的人原本就是不會去點廣告的(就算廣告有出現),所以沒有裝adblock(據說現在有安裝比例大概是10%)的人就是主要的廣告群眾.而廣告主也省去了無效顯示的數字.這個想法很有趣.

網站介紹

  • [Free C++ Books TFE Times 36本免費c++電子書](https://tfetimes.com/free-c-books/)
    • 有需要就拿吧… 不少Hacker與基本知識的C++電子書
  • “智由博集”
(以下部分引自 http://www.proguidescreen.com/?p=2278)
專利特有的『屬地主義(即專利權僅在核准專利之該國有效)』,更白話講一點,
中國專利僅在中國擁有專利權,想要拿去美國對他人提出訴訟,那可是門都沒有!
經筆者檢索後,發現騰訊根本沒有把這個技術拿到其他地區做專利申請(如在台灣,就沒有找到該件專利)

本週專案

這邊會寫一些我的Project 52的成果.

本週主要開始研究CoAP (一個輕量化在IoT上的通訊協定),這裡有簡單的整理比較:

Protocol CoAP XMPP RESTful HTTP MQTT
Transport UDP TCP TCP TCP
Messaging Request/Response Publish/Subscribe Request/Response Request/Response Publish/Subscribe
LLN Suitability (1000s nodes) Excellent Excellent Excellent Excellent
Success Storied Utility Field Area Networks Remote management of consumer white goods Smart Energy Profile 2 (premise energy management/home services) Extending enterprise messaging into IoT applications

本週透過CoAP的Client/Server架構來試著完成Pub/Sub的機制的Client/Server.接下來會更深入的研究他的RFC

https://github.com/kkdai/CoapPubsub A PubSub client/server using CoAP protocol

程式設計週記[2015/12/31]: The year of Go

這是什麼?

程式週記主要內容如下:

  • Gihub project 介紹:
    • 主要會貼一些github,但是會盡量寫上一些有用的評語(或是我容易想到的關鍵詞)幫助以後查詢
  • 網路文章心得:
    • 會寫些心得,強迫自己閱讀.

“程式週記”並且定期週期性更新.

本週摘要

由於週五剛好是元旦,這個禮拜只有四天.剛好上週拿到了來自拍賣的Eddystone Beacon,就先玩了一下也順便把Eddystone Beacon Scanner寫好. 2016即將來臨,應該要給自己一些不同的期許與挑戰.

iOS/MacOSX

  • Flickr’s experience with iOS 9
    • Flickr在iOS9上的經驗談,想要用”Spotlight Search”, “Universal Links”, “Deep linking into the app” 跟”3D Touch”一定要仔細閱讀這一篇.

Python

Ruby

  • Portus:CLAIM CONTROL OF YOUR DOCKER IMAGES
    • 不想要使用公開的Docker Hub? 想要使用私有的Docker Registry.但是又怕無法有良好的權限控管與被人家修改你的Docker Registry? Suse提供一個良好的機制來管理,並且連網頁介面都有了.

Go

  • chai2010/tensorflow: tensorflow for Go
    • tensorflow 的Golang wrapper
  • dobyrch/termboy-go: Another Game Boy emulator for your terminal
    • 可以在terminal上面玩GBA. 恩.. 你沒有看錯.. 是terminal不過可惜的是只有Linux可以用,還不支援Mac OSX.底層透過他自己寫的terminal display library: libtermboy與參考gba模擬器.另外一個terminal display library可以參考termUI,他是跨平台.
  • “Handwritten Parsers & Lexers in Go”
    • 這篇教學文章,首先先教導了在Parser裡面的一些基本概念,不論是Lexer或是AST.最後在教導如何寫出自己的Lexer跟Parser. 挺好的文章.簡單概念整理一下:
      • 範例 SELECT * from Mytable 就是一個句子,如何把他掃成有意義的內容變成AST(Abstract Syntax Tree) 類似 Fileds []stringtable string
      • 首先要把句子透過Lexer Analysis也就是一個一個字掃描.並且將你需要的部份放入該AST裡面.

Java/Android

網路文章

  • [心得] 我在 Github 上學習 Open Source / [心得] 我在 GitHub 上的微型創業
    • 這兩篇文章都是同一個作者huei90在Ptt Soft_Job的文章.如果對於Open Source有興趣的人,其實很推薦大家來看. 這兩篇文章主要就是介紹作者在Github上面的專案angular-validation的創始過程與維護的心得. 把Open Source的專案當成微型創業來思考其實是很有趣的點子,不過套句c9s常講的話”要有獲利才重要啊”. 不過裡面對於Github PR的態度處理與對於維護使用者忠誠度的幾個面向有不少著墨.
  • What every computer science major should know
    • 這一篇主要是在講解每一個想要成為電腦科學家的學生應該要知道的一些事情,我挑幾個我覺得很重要的出來:
      • “Portfolio versus resume”: 這邊提的是比起履歷,你應該要重視你過去時間所投資的時間所在的專案.你可以放一個列表來放你每個專案的時間,或是放一個清單講解你這幾年忙的專案或是教學. 甚至直接放上Github都是一個很好的方式.
      • “Technical communication”: 孤狼在電腦科學裡面已經是逐漸要消失的族群.如何良好的與其他的人做有效的technical communication,不論你使用Power Point或是Latex都一個將你的點子書寫與分享的方式.
      • “An engineering core”: 主要是提醒你要有工程師的內心,要能夠去思考並且拆解每件事情的方法與流程.
  • Curation and Algorithms - Stratechery by Ben Thompson
    • 講解一些策展(curation)的相關演算法.

有聲書心得

  • “IT公論” 184: 「苹果的硬件必须等 2.0,软件必须等 3.0。」
    • 裡面有請到iOS的個人App開發者Moke, Tweeet, and Voodo的作者王凌(blog)來節目討論關於Sina Weibo Api的一些問題
    • Voodo的作者王凌:
      • Sina Weibo 的API是有分權限的,每個API的申請者可以碰觸的權限不一定一樣.但是其實這還好, Weibo API最大的問題是,他們開放的API SDK並不是自己使用的那套.也就是說他們給大家使用的API並不是內部使用的API.也就是俗稱的”沒有吃自己的狗食”,這樣會有很大問題是,當API發生錯誤.是沒有任何Weibo內部人員會發現的.
      • 並且有討論到一開始加入先行的Apple Watch的開發者行列中,遇到不少Apple Watch本身硬體的問題.所以他建議Apple 的硬件要等2.0,但是軟件要等3.0.
      • 也有討論Voodo本身的產品定位與市場差別,當要支援Cloud Kit與 Google Canlendar 要雙支援的時候會造成設計與使用者使用的混淆.討論中也有考量到要不要把產品分開成兩個軟體分開來銷售,但是又擔心遇到之前廣大用戶的反彈.
      • 最後王凌也有提到,他寫App都是因為自己想要用.最後努力開發變成大家都想要用的好App.

網站介紹

本週專案

這邊會寫一些我的Project 52的成果.

本週專案Eddystone Beacon Scanner

由於之前在掏寶買了支援EddystoneBeacon所以才方便寫出這個Eddystone Beacon Scanner.

程式設計週記[2015/12/25]: 聽說Swift很好玩.. 連我都忍不住想再學一次

某人的寶貝女兒設定檔 (Daughter YAML refer from Ansible)

(pic from: https://twitter.com/chrisnuber/status/679069190377066497)

這是什麼?

程式週記主要內容如下:

  • Gihub project 介紹:
    • 主要會貼一些github,但是會盡量寫上一些有用的評語(或是我容易想到的關鍵詞)幫助以後查詢
  • 網路文章心得:
    • 會寫些心得,強迫自己閱讀.

“程式週記”並且定期週期性更新.

本週摘要

Go 出了1.6 beta 1,讓大家在聖誕節感受到HTTP/2的威力.Swift持續在熱頭上,到處都是Swift的討論文章.程式語言的討論第一名也不是開玩笑的.本週開始想一些演算法與現實社會的應用,希望可以把之前寫過的專案來想想有沒有實作可以弄.

iOS/MacOSX

Python

Go

Java

  • GovernmentCommunicationsHeadquarters/Gaffer: A large-scale graph database
    • Gaffer是用Java寫出來的大型圖學資料庫(Graph Database),可用來分析不同資料之間的內部關係,相較於圖學處理系統(Graph Processing System),Gaffer特別優化了在特定節點上的資料檢索能力。使用者可以將資料整批上傳或是持續地將資料匯入,這個軟體有能力識別出大批電話記錄中的一組通話者是誰,或針對單一對象進行資料蒐集與分析,也可以透過API來進一步檢索或篩選出所需的資料。(摘自: IThome)
  • A-Frame: Building blocks for the virtual reality web
    • Mozilla出的framework,主要針對WebGL跟WebVR的部分.可以讓你的網站在瀏覽器上馬上看到3D效果(當然是指Firefox).
  • SECCON 2015 CTF精选:一道400分的Android APK逆向题.
    • 學一下如何逆向android.幾個流程快速紀錄一下:
      • 拿到APK後,使用dex2jar反組譯
      • 如此一來可以看到大部分的source code如果要Hack就必須要製造假的server來傳遞資料.
      • 由於溝通有AES加密,這個範例要加上了製造假的AES key
  • Youtube: 15 tricks to master Chrome Developer Tools Console
    • 前端相關的programming一直是我的罩門,尤其是JS跟jquery.只知道怎麼用卻沒有一個好方式來debug.這一篇教學可以直接使用Chrome Web Console來debug. 果真是前端深似海….

網路文章

  • IBM Focused on 3 Major Languages: Java, Node.js and Swift
    • Apple將Swift開源之後,就跟IBM合作.讓IBM將Swift使用在商業應用上.這是一個很棒的開始.
  • Semantic method naming
    • 這一篇主要是探討在method命名上的討論,主要的建議如下.
      • 少使用”Get”
      • 不要每個都加上”do”
      • 當是回傳boolean的時候,不一定要使用isXXX或是hasXXX當命名.
      • 根據物件來推導出你的method名稱.
        • 回過頭來Method跟Function的不同是什麼? Method 是物件(Object)可以執行的方法.而Function不綁訂於任何物件.
        • 所以,如果Message物件的Method不要使用sendMessage而直接使用send
      • 不要將命名套用在參數上.
        • 個人認為這段值得討論,因為objc 的method很長使用 initWithNib 或是 initWithFormat 由於objc第一個參數無法詳細定義名稱.這個可能要討論.
  • 推薦每個軟體工程師最具影響力的書籍
    • .每本都是經典, 推薦給大家. 也記得要有空拿出來複習一下…
  • “为什么有些大公司技术弱爆了?”
    • 來自知乎的整理,裡面有著初生之犢與職場老將的對話.充分顯示出軟體工程上理想與現實的天人交戰.
    • 在職場工作十多年後,真的能夠瞭解一個在持續出貨與營利的公司是很難有著”完美”的軟體建置.不過並不是代表建置有問題,是因為每一個流程,每一段程式碼都有著他的故事.不論是已經出貨在舊的機器(或是產品)導致無法修改,或是其實有許多過渡性的問題.
    • 蠻建議大家看看.. 工作有一定資歷的一定都心有戚戚焉
  • Algorithms in the Real World: Host Matching
    • 大家都說演算法,但是卻很少在現實生活中會用到.作者透過協辦聚會所衍生出來的遊客住宿問題.(主辦方提供當地願意提供住宿的民眾登記類似沙發衝浪機制,而提供住宿的人可以獲得協會贈與的充氣床墊一個)
    • 由於需要住宿的人有他的需求,提供房間的人有他的條件.兩者的配對就成了兩兩配對的問題類似(biclustering).
    • 最後作者參考了Edmonds-KarpHopcroft-Karp兩個演算法來解決問題,不過這很可惜的並沒有解釋太多其中的方法論.
  • CI 怎樣帶你遠離平庸?
    • William Yeh大大的好文,主要是因為他身為Ansible推動者.寫了幾個Role受到官方的推薦.受到許多注目,也收到許多人送來的PR跟issue.要能夠快速檢驗每隔PR的是否會損害程式本身,就是得要透過CI.透過CI可以讓許多PR跨平台的驗證變得更簡單.

有聲書心得

  • IT公論: 巴西封禁 WhatsApp 背后的故事
    • 這一集還挺有趣的,因為有請到在巴西當地的華人贾儒來講講為何WhatApp在巴西被官方封閉.這段訪談也聽到了巴西本地的WhatApp主要是一般民眾與黑幫在使用,以及巴西官方雖然封閉但是封鎖WhatApp前還是會有官方公告,並且也在政壇掀起波瀾. 這個訪談也能了解一些巴西當地支付與對於網路通訊的一些特例.
    • 這集也討論到Apple Pay即將進入China的觀點.當然China已經不缺任何行動支付方案,但是二維條碼的安全性令人質疑(偷刷),但是行動支付所帶來的方便性就相當令人期待,當然台灣Apple Pay還是得等,不過等到行動支付都來了,接下來就是各家行動支付所帶來的優惠與折扣大戰.

網站介紹

這邊會寫一些我的Project 52的成果.

本週專案React-Diff,主要是透過React Element Diff的原理,將他實現在Binary Tree的Diff上面.

React-Diff具有以下特點:

  1. 支援三種Difference Option (INSERT, MOVE, REMOVE)
  2. 達到O(n)的時間複雜度.
  3. 支援Graphviz繪圖輸出樹狀結構

[iOS] 把舊專案換到XCode7與iOS9上面會出現上下黑條(Application appears with black bars on top and bottom)

##問題:

主要是心血來潮把自己就的App”粉絲相簿“想拿出來改版(終於). 結果發現上下邊有黑條.這裡有個示意圖:

不過,我的App明明就是使用系統預設的UITableViewController,NavigationController跟UITabBar而已. 趕緊來找找解決方法.

##主要原因:

根據iOS 9 Xcode 7 - Application appears with black bars on top and bottom這邊的解答,是說由於你沒有” LaunchScreen.storyboard”在你的App,所以XCode會”預設”而把你的App變成比較能夠跑的狀況(類似iPhone4 App跑在 iPhone6 Plus一樣).

這樣其實很不好,因為有上下邊黑條還有擴大的效果.

##解決方式:

根據http://stackoverflow.com/a/32614526/1316907這邊的解釋,進行以下的方式可以解決這樣的問題:

  • 更改”Launch Image Source” 成 “Brand Assets”
  • 不過由於我還是有問題,我必須還要修改”Launch Screen File”成MainStoryBoard

這裡有個修改後示意圖:

打完收工,本來想加新功能,卻踩一堆舊Bug.不過這樣也學了一課.. 真棒…

##相關鏈結:

程式設計週記[2015/12/18]:大家都是秋生萬

這是什麼?

程式週記主要內容如下:

  • Gihub project 介紹:
    • 主要會貼一些github,但是會盡量寫上一些有用的評語(或是我容易想到的關鍵詞)幫助以後查詢
  • 網路文章心得:
    • 會寫些心得,強迫自己閱讀.

“程式週記”並且定期週期性更新.

本週摘要

幾經思考決定(好像只是之前偷懶),決定把之前的“工作上的一些雜事筆記“改一下名字,並且持續努力的改成每週更新.

碎念一下: 其實之前停止是因為在忙著上coursera,不過我發現我既然還是都會寫一些twitter就應該要繼續更新我的部落格.

論壇與研討會

網路文章

iOS/MacOSX

Python

Go

一些網站

本週專案

這邊會寫一些我的Project 52的成果本週專案是https://github.com/kkdai/youtube A Youtube download package in Golang

其實方法很簡單,紀錄一下:

  • 分析你輸入的網址,找出Youtube ID
  • 透過http://youtube.com/get_video_info?video_id=來找出影片下載網址與簽章(下載用)
  • 由於找出影片資訊有數個(不同解析度)挑出你需要的
  • 下載影片 url + sig