2020年6月1日 星期一

好書 : WORD 排版藝術

這本書是電腦書作家侯捷的著作, 我自 2004 年買來至今只看了前三章便停住了, 當時是想要將讀研究所時寫的小書 "PRAAT 初學者使用手冊" 重新排版, 以及寫一本 AutoIt 實戰書籍而研究 WORD 排版技巧, 但要忙的事情很多, 都擱下沒完成 (應該是專案執行力太低吧).


Source : 金石堂


最近想要幫二哥整理物聯網教材, 加上我筆電的 Win10 預載 OFFICE 365 試用版最近在同事協助申請下以公司帳號註冊成功, 終於可以編輯 DOCX 檔案了, 所以上週又找出這本書來研究排版問題. 其實我原本想用 Google 文件來做, 但幾經折騰終於了解文件排版還是用微軟的 WORD 最妥當.

雖然這本侯捷的書很舊了, 但那只是 WORD 版本差異而已, 排版的觀念本身沒甚麼變, 但操作上要去找出同樣功能新版要在哪裡設定卻得費些工夫. 此書試閱參考 Google :

WORD 排版藝術試閱 (碁峰)

以下是這幾天看書整理的筆記 :
  1. 文字處理 (word processing) 與排版 (typesettings) 的差別 :
    文字處理 : 字型, 大小, 顏色, 字距, 行距, 特殊效果等.
    排版 : 除了文字處理外還包括版式設定, 例如頁邊, 天地, 頁碼, 頁眉, 目錄, 索引等.
  2. 用 WORD 排版的弱點在於分色能力較差, 以及頁面尺寸受限, A3 以上不適合. WORD 的色彩模式為 RGB, 適合在電腦螢幕顯示, 而不適合印刷品的彩色排版, 印刷的色彩模式為 CYMK. 但在以文字內容為主, 非美工專業或彩印方面的書籍製作來說, WORD 絕對夠好且容易使用. 
  3. 出版界以開數來描述書籍尺寸, 印刷廠的標準用紙有全開 (31*43 英吋) 與菊開 (24.5*34.5 英吋) 兩種, 將全開紙裁成 16, 18, 25, 32 等分稱為 16 開, 18 開, 25 開與 32 開, 除此之外的尺寸必須請印刷廠抄紙 (即準備特規尺寸的紙) 才行. 
  4. 台灣電腦書籍傳統尺寸為 18 開 (17*23 公分), 英文電腦書籍則採國際 18 開 (大 18 開, 18.5*23 公分). 一般小說散文通常採用 25 開 (15*21 公分), 此尺寸剛好是菊版 (24.5*34.5 英吋) 的 1/16, 又稱為菊 16 開.  
  5. 為什麼要用 WORD 寫作? 因為寫作過程需要不斷修改, 增刪, 與搬移文字, 而科學技術類書籍又有許多交互參照之處, 參照點會隨寫作過程動態地變化, WORD 會為每一個參照點編號並自動修正參照位置. 另外, WORD 還可以為頁碼, 章節, 圖表, 註腳, 書籤等功能之編號自動化. 目錄可以用 WORD 自動化產生, 但不會自動更新.  
  6. WORD 寫作平台相關的功能 :
    功能變數 fields
    範本 templates
    巨集 macros
    標號 captions
    多層次大綱編號 multi-level outlines numbering
    交互參照 cross reference
    追蹤修訂 track changes
    註解 comments
    書籤 bookmarks
  7. 用 WORD 排版的第一件事是進入 "版面配置" 中設定紙張大小與邊界, 這樣就把頁面尺寸, 版芯位置, 天地等等都確定下來 (天是頁首以上的留白, 地是頁尾以下的留白, 通常天大於地的視覺效果較好), 接著就是節 (sections) 與各種樣式設定. 
  8. 節 (sections) 是文件中各自獨立的排版單元, 如果略過節的設定, 則整份文件就變成單一個節, 這是最容易被忽略的排版概念. 寫作之前應該為每個文件單元 (序言, 目錄, 致謝, 各章等) 設定各自獨立的節, 這樣每個節就可以設成從奇數頁開始, 讓文前 (序言, 目錄, 致謝等) 以羅馬數字編頁; 讓正文 (各章) 與文後 (附錄, 索引) 以阿拉伯數字編頁, 設定好之後存成範本 (templates, 副檔名為 dotx) 以備後用.
  9. 樣式是用來呈現 "特定頁面元素" (例如大標題, 小標題, 內文, 圖表, 程式碼等) 的一組格式. 樣式是所有排版作業的靈魂, WORD 的每一個自動化功能都是依據使用者事先規劃的樣式來完成. WORD 的內建樣式設定雖然多半不適合我們使用, 需要手動修改, 但卻是進行高階排版作業的依據, 例如 WORD 會收集標題 1 到標題 9 樣式的文字組成多達 9 層的目錄; 也會收集文件內的索引項目, 並以索引 1 到索引 9 樣式組成多達 9 層的索引.   
  10. 99% 的 WORD 使用者只是將它當作是文字編輯器來用, 沒有認識到它處理大型文件的正規排版能力. 學會 WORD 排版設定, 創作就從 "白了少年頭" 的繁瑣工作變成只需關心創作內容的愉快過程. 
  11. 想成為優秀的作家必須學會排版, 因為一個優秀的作家一定關心自己的作品最後長得怎樣. 學術界公認最好的排版軟體 TeX 的作者 Donald Knuth (圖靈獎得主) 就是為了讓自己的著作達到滿意的版面而跳下來開發自己的排版軟體. 
  12. WORD 排版作業的最佳模式 : 文件引導框 + 整頁模式. WORD 左方的文件引導框顯示文件中所有標題的階層結構, 每個標題都是超連結, 點擊後右方視窗就會顯示對應之內文位置可直接編輯, 非常方便. 整頁模式的特點是可忠實呈現所有頁面元素於製版與印刷時得實際呈現, 在右視窗的整頁模式對標題做任何修改會立即反應到左視窗的文件導引框, 注意, 文件引導框只能檢視無法編輯.   
參考 :

以Word做數位排版
這些Word的技能可以省下你99%的時間
Paperback Manuscript Templates
不專業教學 | 製作一本書的流程 (排版→設計→印刷)
GOOGLE DOC 排版-段落第一行空兩格

2020年5月31日 星期日

2020 年第 22 周記事

又來到月底了, 今年陰曆閏四月, 現在是第二個四月, 再過三周就端午節, 姊姊的高鐵票昨天終於搞定, 但回高雄那張大學生票沒搶到.

前陣子豪雨加強降雨, 所種的大陸妹全部陣亡, 只有空心菜存活, 今天去種子行時也只剩下 36 株空心菜苗, 買 30 株剩六株很奇怪, 所以我全部都買下來, 因為接下來的颱風季就要靠這 60 多株空心菜以及地瓜葉了. 老闆娘說這陣子不育苗了

最近因為想要先整理 MicroPython on ESP8266/ESP32 教材給二哥暑假學習, 所以花了一些時間回頭複習之前的筆記, 突然覺得, 人失去記憶真是可怕的一件事, 重看自己的筆記居然有一部分不記得自己曾經這樣寫過, 海馬迴真的漸漸壞掉了.

下午到頂樓重新丈量了一下太陽能板支架尺寸, 決定 300 公分的角鋼需要 4 支, 各部分尺寸設計如下 :




角鋼每支 300 元需花 1200 元. 下午 4 點半正要去五金行剪角鋼, 剛好來採收波蘿蜜的人車子停在大門口擋住去路, 想想似乎時間有點趕, 只好下周再去買了. 

2020年5月30日 星期六

好站 : 雅技資訊日誌

前天向 momo 買的一本資安書籍 :

Kali Linux滲透測試工具 第二版 (碁峰, 陳明照, 2015)


Source : 博客來


我在博客來的書籍介紹中看到作者陳明照的部落格, 拜訪之後覺得是非常優質的資安教學網站, 值得好好來學習 :

http://atic-tw.blogspot.com/

不過這本書我買錯了, 現在已出第三版, 我第二天發現就已辦理退貨, 其實此書第二本市圖就有, 要買就買 2020 第三版.

夢幻筆電 LG GRAM 17 吋 17Z990

今天在 momo 看到去年曾列入新筆電購買候選名單的 LG Gram Z90N, 現在居然 42000 就買得到耶! 去年還要 50000 元, 我覺得太貴所以改買更輕但續航力較不足的 Swift5 :




LG Gram 現在也有更大的 17 吋 (適合越來越老花的我) :

【LG 樂金】Gram 17吋 17Z990 極緻輕薄筆電(i7-8565U/16G/512G SSD/Win10) $53900




續航力近 20 小時, 還大容量 DRAM 16GB, 簡直是夢幻款, 但問題是背包要夠大.

【大锤开箱】LG gram 20 款 17 英寸更进一步!




新款 Gram 最吸引我的除超大螢幕外, 還有 4 個 USB 插槽, 其中一個支援 USB PD (可用 PD 行動電源對筆電充電), 而且具備 Micro SD 讀卡機, DRAM 與 SSD 也可擴充, 看完這個介紹, 有股 "買吧!" 的衝動! 參考 :

開箱評測 LG gram 17″- 世界最輕17吋筆電,續航19.5小時 (這是舊款 17 吋)

新銳 Python 網頁框架 : Masonite

最近注意到一個名為 Masonite 新興的開放原始碼 Python 網頁框架, 其在 GitHub 的熱度 (Star) 已超過 1300, 或許不久的未來將與已成熟的 Flask 與 Django 一樣成為廣受歡迎的網頁框架.

Masonite 在結構上參考了 Laravel (一個優異的 PHP 框架) 的許多先進設計, 例如服務提供者與服務容器等等, 而且提供了命令列與 ORM 工具, 具有簡單高效, 測試覆蓋率高等優點, 參考 :

https://pypi.org/project/masonite/ (套件下載)
https://docs.masoniteproject.com/ (教學文件)
https://github.com/MasoniteFramework/masonite (開放原始碼)

強國的社群有人發起教學文件中文化翻譯 (進行中) :

Masonite 中文文档

目前市面上 Masonite 的書籍只找到一本, 作者是 Masonite 的開發者 Joe Mancuso :

The Definitive Guide to Masonite: Building Web Applications with Python


Source : Amazon


Google 圖書有提供試閱, 參考 :

# Google Book : The Definitive Guide to Masonite: Building Web Applications with Python

此書作者之一 Joe Mancuso 有在 Youtube 發布 Masonite 簡介影片:

# #233 The Masonite Python Web Framework




很多人可能跟我一樣, 覺得 Django 已經很好用了, 為什麼還要學一種新的框架? 作者 Joe Mancuso 在下面這篇 Medium 的文章中比較了 Masonite 與 Django 的差異, 並對於為什麼 Masonite 是最適合初學者與專家的框架, 提出了極有說服力的愛用理由 :

Masonite 2.0 and Django

重點摘要如下 :
  • Masonite 是一個以開發者為中心的框架 (developer-centric), 專為網頁開發者而設計, 不像 Django 最初是為了建立新聞網站, 而 Flask 則看起來像是愚人節玩具 (好酸啊). 
  • Masonite 是為了想讓網頁應用成為 SaaS 雲端軟體而設計, 也是為那些周末戰士的專案 (Weekend Warrior Projects, 即只有周末才有空做的個人專案) 而開發. 
  • Masonite 採用 MVC (Model-View-Controller) 架構; 而 Django 則是採用 MTV (Model-Template-View) 架構, 這是兩者最大的不同. 雖然達成的效果一樣, 但架構不同就表示做事的方式不同. 
  • Django 將單一的應用程式分解成多個 App, 這對於將功能複雜的應用邏輯抽象化確實有其意義, 但對於許多開發者來說卻不知該如何拆解應用程式功能, 導致因為盲目分拆而讓應用程式的邏輯架構更加複雜. Masonite 不是這樣, 它是真正的 MVC 架構, 它將應用邏輯分拆成位於不同模組的多個控制器, Masonite 提供多種控制器類別可將應用邏輯以清楚與符合實際的方式抽象化. 
  • Mashonite 採用 Service Provide 與 Service Container 增添第三方應用程式 (例如郵件服務) 來擴充 Masonite 網站的功能, 此方式可加速網站的反應速度, 因為它不需要去後端 (backend) 去檢查是否有此服務. Django 的第三方服務是在後端 INSTALLED_APPS 設定中以字串格式列舉服務的位置與功能.
  • Django 的設定全部放在單一的 settings.py 與 settings_local.py 裡面, 有些人覺得這沒甚麼不好, 但其實全部放在一起有點混亂. Masonite 則是將設定以功能特性進行區分, 將其分割成多個設定檔.  
Masonite 怎麼用? 可參考下面這篇初體驗用 Masonite 來快速建立一個網頁應用程式 :

Python:masonite初体验TodoList

最近要抽空來玩玩看.

明儀買書一本 : 深度學習的數學地圖:用 Python 實作神經網路的數學模型

今天在博客來看到旗標剛出的新書, 詢問明儀確定有書, VIP 85 折 :

深度學習的數學地圖:用 Python 實作神經網路的數學模型


Source : 博客來


這本是從日文翻譯過來的, 日本人最擅長知識整理, 旗標的書品質又很不錯. 我的數學不太好, 所以在邁向 AI 路途中需要補腦一下.

2020年5月28日 星期四

momo 會員日購書 4 本 (Python/Kali Linux/tensorFlow)

今天 momo 會員日最後一天, 我挑了四本打 69 折的書 :

Python自學聖經:從程式素人到開發強者的技術與實戰大全
行動裝置上的AI:使用TensorFlow on iOS Android及樹莓派
Python最強入門邁向數據科學之路-王者歸來
Kali Linux滲透測試工具第二版

四本書總價 3060 元, 折扣後 2131 元, 約打 69.6 折, 加購 Sandisk 64GB 卡 :

【SanDisk 晟碟】Ultra microSD UHS-I 64GB 加價購 $199




全部總價 3060+199=3259, 折扣後 2131+199=2330, 扣掉 momo 幣 75 元, 用 momo 卡實付  2255, 約 69.2 折.

2020-05-29 補充 :

因為沒注意到 Kali Linux 滲透測試工具已經出第三版, 早上通知 momo 想換貨, 但客服機器人真的無三小路用, 看不懂我寫的句子, 只好全部退貨, 殘念 ~~~

Nvidia Jetson Nano 測試筆記 (五) : 安裝 Python 3

二月初把 Jetson Nano 的 Ubuntu 作業系統 Linux4Tegra (v18.04) 架起來之後, 因為忙別的事就暫停下來了. 這幾天整理完樹莓派 Pi Zero/A+/Pi 3A+ 等幾塊板子後, 想起 Jetson Nano 已塵封許久, 便找出來繼續安裝軟體部分, 主角當然就是以 Python 為主的機器學習生態系.

本系列測試文章參考索引 :

Nvidia Jetson Nano 測試筆記索引

Jetson Nano 的 Ubuntu 18.04 只預載了 Python 2.7.15, 沒有 Python 3, 用 python -V 或 python --version 指令可查詢 Python 2 的版本 :

tony1966@jetson-nano-tony1966:~$ python -V     
Python 2.7.15+
tony1966@jetson-nano-tony1966:~$ python --version 
Python 2.7.15+

因為機器學習套件要用到 Python 3, 必須自行安裝, 作法參考下列文章 :

在Linux上安装Python 3
How To Install Python 3.7 On Ubuntu 18.04
How to Install Python 3.8 on Ubuntu 18.04
Ubuntu 安裝 Python 3 (IDLE)
如何在Ubuntu 18.04上安装Python 3并建立本地编程环境
如何在Ubuntu 16.10上為Python 3.6安裝pip?
Ubuntu 環境下安裝 pip & python3


1. 更新套件清單 :   

tony1966@jetson-nano-tony1966:~$ sudo apt update   


2. 安裝支援軟體 software-properties-common 套件 : 

此套件會可讓我們添加個人套件庫 (PPA, Personal Package Archive), 可增進我們對套件管理員的控制 :

tony1966@jetson-nano-tony1966:~$ sudo apt install software-properties-common 
[sudo] password for tony1966: (輸入登入密碼後按 Enter, 密碼不會顯示)

此指令需按 Y 才會繼續安裝 :

是否繼續進行 [Y/n]? [Y/n] Y


3. 新增名為 deadsnakes 的 PPA : 

tony1966@jetson-nano-tony1966:~$ sudo add-apt-repository ppa:deadsnakes/ppa 

此指令需按 Enter 才會繼續安裝 :

Press [ENTER] to continue or Ctrl-c to cancel adding it.  (按 Enter 鍵)


4. 再更新套件清單 :   

tony1966@jetson-nano-tony1966:~$ sudo apt update   

接下來就可以安裝 Python 3 了, 目前最新版本是 Python 3.8 : 


5. 安裝 Python 3.8 : 

tony1966@jetson-nano-tony1966:~$ sudo apt install python3.8    

此指令需按 Y 才會繼續安裝 :

是否繼續進行 [Y/n]? [Y/n] Y

安裝完成後必須用 python3.8 指令檢查版本 :

tony1966@jetson-nano-tony1966:~$ python3.8 --version 
Python 3.8.3
tony1966@jetson-nano-tony1966:~$ python3.8 -V 
Python 3.8.3

如果用 python 或 python3 會出現錯誤 :

tony1966@jetson-nano-tony1966:~$ python ––version 
python: can't open file '––version': [Errno 2] No such file or directory
tony1966@jetson-nano-tony1966:~$ python3 ––version 
python3: can't open file '––version': [Errno 2] No such file or directory
tony1966@jetson-nano-tony1966:~$ python –V 
python: can't open file '–V': [Errno 2] No such file or directory

輸入 python3.8 進入 Python Shell 介面 :

tony1966@jetson-nano-tony1966:~$ python3.8 
Python 3.8.3 (default, May 14 2020, 20:11:43)
[GCC 7.5.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> print('Hello World!') 
Hello World!

這樣就安裝好 Python 3 了, 接下來要即可安裝 Python 機器學習套件.


參考 :

Change the Python3 default version in Ubuntu
How to make 'python' program command execute Python 3?
Configure Python 3 as default on Ubuntu

2020年5月27日 星期三

ACER Swift 5 筆電鍵盤維修

今天下午將列印出來的維運技術資訊塞入透明夾後, 隨手就放在辦公桌的書堆上, 沒想到竟然滑下來敲到 Swift 筆電鍵盤的括號鍵 (" 鍵), 結果它的上方蓋就翹起來了, 取下來一瞧, 似乎是裡面微小的塑膠桿斷裂, 沒辦法固定鍵蓋了. 打電話給建國路的 ACER 維修中心, 我問說可否只換一個鍵? 工程師說他們是經銷商只能換整個鍵盤, 建議我去九如路的直營維修中心看看有沒有單一零件可換 : 高雄市三民區九如二路595號 07-3232585.

晚飯後天氣仍然晴朗無雨, 騎過去問櫃台, 說是要留機, 明天再通知取回. 結果剛回到家就接到工程師電話說已經好了, 所以又再跑一趟, 因在兩年保固內 (2019 年 1 月買的), 所以是免費更換. 經此事件, 我才發覺原來鍵盤每個鍵底下結構居然那麼精細, 所以不要在筆電上方附近放容易墜落之物, 走開不用時要闔上蓋子.


2020-05-30 補充 :

我現在每天學習讀書做測試都少不了這台 ACER Swift5 筆電, 所以必須好好愛惜, 讓它長久耐用提高 CP 值才行, 畢竟去年 1 月花了 36000 買來的, 不便宜啊! 用到現在近 1 年半, 基本上對寫程式上網等效能還算滿意.

好書 : Nanobrain: The Making of an Artificial Brain from a Time Crystal

今天在亞馬遜看到一本很吸睛的書 :

Nanobrain: The Making of an Artificial Brain from a Time Crystal


Source : Amazon


人造大腦? 時間晶體? 是科學怪人的狂想曲嗎? 時間晶體我是第一次聽到, 經過 Google 一番後找到如下資料 :

# 維基 : 時間晶體
# In Search of Time Crystal
A new, theoretical type of time crystal could run without outside help

原來時間晶體還是一個相當新的物理學理論, 源自麻省理工學院教授維爾切克 (Frank Anthony Wilczek, 2004 年諾貝爾物理學獎得主) 於 2012 所提出的概念, 目前已有實驗團隊發表成功創造出時間晶體的研究報告刊登於自然等期刊.

一般晶體中的原子在空間結構中依某種特定規則呈週期性重複排列, 時間晶體與此類似, 但不同的是, 時間晶體是在時間上呈週期性重複. 一般晶體是三維的物體; 而時間晶體則是四維以上的晶體, 具有時空的週期性結構, 而且因為處於最小能量狀態, 遵守能量守恆定律, 隨著時間推進無法與環境取得熱平衡, 因此將呈現永動狀態. 換言之, 時間晶體是一種不消耗能量的自發震盪, 參考 :

# 沒有摩擦的自發振蕩「永動機」- 量子時間晶體

以前永動機概念被物理學家斥為不可能, 因為它違反熱力學定律, 現在時間晶體卻可以? 其實時間晶體只是符合永動的定義而已, 其能量似乎無法利用 (需加入額外能量), 已知的應用之一是量子時鐘, 至於拿來建造人工大腦, 嗯, 就要看看此書作者怎麼說了. 作者 Anirban Bandyopadhyay 是印度人, 目前是茨城縣日本國立材料科學研究所的高級研究員.

購買 AOC 20E1H 19.5 吋 LED 螢幕 (HDMI)

為了在我的五斗櫃實驗桌上測試樹莓派與 Jetson Nano方便, 打算買一個有 HDMI 輸入介面的液晶螢幕, 經過搜尋露天賣場, 找到下面這款 AOC 的 19 吋螢幕很可以 :

【酷3C】全新 AOC 20E1H 19.5吋 HDMI 螢幕 螢幕 LED螢幕 $2050
【子震科技】AOC 20E1H(1A1H/1億/5ms/TN)20吋LCD螢幕 $2250
福利品 非宜花東/偏遠加價地區可免運 含稅 艾德蒙 AOC 20E1H 20型不閃屏 螢幕 $1800




此螢幕尺寸 38(高)*46(寬)*20(深) cm (含底座高度), 實際螢幕尺寸約 44(寬)*24(高)*2(深) cm, 剛好可以用壁掛方式鎖在五斗櫃上方以節省空間, 壁掛架上周已買, 參考 :

購買液晶螢幕壁掛架

2020-05-30 補充 :

已在牆壁上定位四個鑽孔點, 下周要從鄉下帶電鑽來施工.

2020年5月26日 星期二

購買 Kinyo 藍芽無線滑鼠

最近覺得去年四月買的 Logitech 藍芽滑鼠用起來怪怪的, 主要是壓住左鍵標記文字想複製時會跑掉, 要在尖端用力按住才行, 可能接觸開關已經兩光了. 雖然除了標記障礙外其實還能用, 但還是上露天買個新的 :

全新原廠保固一年KINYO藍芽3.0智能省電無線滑鼠(GBM-1800) $248

含運 248+60=308 元.




我以為羅技的可以用很久, 沒想到才一年就 GG 了, 看來是消耗品所以改買 Kinyo 的.

2020-05-29 補充 :

今天取貨回來測試, 按照說明書指示, 在 Win10 中新增藍芽裝置 (滑鼠), 然後按住滑鼠底板的按鈕 3~5 秒使其配對, 但試了好幾次都沒出現 Bluetooth Mouse, 去還書回來再試就 OK 了, 奇怪. 與羅技的藍芽滑鼠比起來, 按鈕聲音較大些, 價差一半也不要太苛求啦, 反正消耗品用得順就好, 可能較厚的關係, 握起來手感不錯, 滑起來也很靈敏.

2020年5月25日 星期一

Nvidia Jetson Nano 測試筆記索引

今年二月初突然想起 2019 年中買的輝達 Jetson Nano 開發板尚未裝機, 就抽了點時間下載 Ubuntu 映像檔來安裝, 但僅僅做了初步設定就忙別的而暫停. 今天在書上看到 Ubuntu 想起來, 回家找出主機擦拭一番, 並將之前的測試筆記整理索引如下 :

Nvidia 推出 99 美元的迷你 AI 電腦
輝達 Jetson Nano 開箱
Nvidia Jetson Nano 測試筆記 (一) : 安裝設定
Nvidia Jetson Nano 測試筆記 (二) : 安裝 VNC 伺服器
Nvidia Jetson Nano 測試筆記 (三) : 用 WIN10 遠端桌面連線存取桌面
Nvidia Jetson Nano 測試筆記 (四) : 安裝機殼
# Nvidia Jetson Nano 測試筆記 (五) : 安裝 Python 3


~進行中~

PS : 因為也是 HDMI 介面, 看來是改買個 HDMI 介面的壁掛液晶螢幕了.

2020年5月24日 星期日

PHP 學習筆記索引

我大約是在 2009 年初開始棄 ASP 轉學 PHP 的, 之後也搭配 jQuery UI 寫了一個自用的簡易 CMS 系統, 然後使用 PHP 撰寫爬蟲, 但近年來因為學習 Python 之故改用 Django 架站, PHP 就較少用了, 只有在維護租用的 Hostinger 虛擬主機時偶而用到而已.

雖然不常用, 還是將過去零零星星撰寫的 PHP 相關筆記整理如下, 方便要用到時複習 :

測試 jQuery 的 Ajax 方法 load()
顯示原始碼的 PHP 程式
產生 jQuery UI 日期選取器的 PHP 函式
產生 jQuery UI 按鈕與訊息盒的 PHP 函式
產生 jQuery UI 日期時間選取器的 PHP 函式
產生 jQuery UI DataTables 表格套件的 PHP 程式
用 PHP 計算複利與年金終值
MySQL 模擬 SELECT TOP 20 PERCENT * 指令的方法
網頁資料擷取易容術
PHP 從日期字串求星期幾的方法
判斷 MySQL 是否找到紀錄的方法
如何讓網頁不會被 cache
PHP 計算日期差距的方法
變異係數與標準差
年複合成長率
用 PHP 求線性迴歸方程式
用 PHP 計算樣本相關係數
PHP 與 Javascript 變數的 Scope
phpMyAdmin 如何設定自動增量主鍵
PHP 行動裝置偵測
如何將 Javascript 的陣列轉換為 PHP 陣列
如何取得 MySQL 聚合函數 (Aggregate) 的傳回值
用 PHP 計算移動平均線 MA 與指數移動平均線 EMA 的方法
# PHP 的 $_GET, $_POST, 與 $_REQUEST 測試
Easyui 測試 : Combobox 下拉式選單
關於 MySQL 中使用 AVG 聚合函數與 LIMIT 的問題
從 IP 查來源國家 (一)
從 IP 查來源國家 (二)
EasyUI Datagrid 中超連結的編輯問題
擷取期交所小型台指期 (MTX) 每日行情的方法
PHP 日期字串格式轉換方式整理
EasyUI Datagrid 表格內容為超連結時的編輯問題
# 如何剖析不標準的網頁
撰寫 PHP 網頁爬蟲程式的注意事項
如何比對 PHP 陣列的元素
Hostinger 主機運算資源限制與 PHP 效能優化
如何更改 Easyui Datagrid 的分頁選單 pageList 設定
在樹莓派上架設 PHP+MySQL 網站伺服器
在樹莓派上利用 sSMTP 傳送郵件的方法
PHP 陣列出現 Notice : Undefined offset 警告的解決辦法
證交所上市櫃股票列表
證交所信用額度總量管制餘額表
phpMyAdmin 載入資料庫逾時問題
安裝 XAMPP PHP 架站工具包
XAMPP 最大執行時間 (max_execution_time) 問題
PHP Curl 出現 Notice: Undefined index 警告問題
PHP 學習筆記 : 自訂函數
申請免費 PHP 虛擬主機 000a.biz 與 000webhost.com
網頁技術速學筆記 (五) : PHP 動態網頁 (1)
PHP 學習筆記 (一) 變數
順勢操作的停損線向上移動法
樹莓派安裝 Apache2+MySQL+PHP7
測試 jQuery 的 Ajax 函數 $.ajax()
jQuery 的工具函數測試
jQuery 的 Ajax 捷徑函數測試

~進行中~

2020 年第 21 周記事

本周雨彈來襲, 雖然現在都開車上班載菁菁上學, 但雨勢大時上下車還是會被淋濕, 週五早上菁菁還說想請豪雨假, 我說不要隨便請假, 結果臉臭臭的去上學; 我到公司一下車被雨淋到褲管半濕, 突然覺得好像應該請休一天才對.

豪雨災情慘重, 國中同學的木瓜園造大水, 木瓜樹倒了不少, 每年都要蒙受損失, 務農看天吃飯實在無奈. 昨天回鄉路過岳父的農舍, 進去才發現兩棵多產的木瓜樹倒了一棵, 被岳父鋸掉了, 樹根雖歪斜所幸還連著土壤, 復活再抽芽的機會頗高. 從鋸開的樹身我才知道原來木瓜樹裡面居然是空心的.

水稻災情也很慘, 再過一兩周就是收割時節, 卻被狂風暴雨摧折而倒地, 早上一大早就有農會的人騎車進來曬穀場照相, 應該是查證農損情況. 還好今天放晴了, 有些人家已迫不及待先收割再說, 不然下周另一波來襲恐怕血本無歸.

前幾天在露天買的 14 個不鏽鋼保鮮盒周六到貨帶回鄉下, 本周起就不再幫爸滷冬瓜封了, 改成配冷凍生菜, 爸午晚餐直接用電鍋蒸熟即可, 這樣不僅可變換菜色, 而且所花的時間更少, 以前製作冬瓜封要花掉一整個下午.

常用配菜 :
  1. 蘆筍
  2. 南瓜
  3. 地瓜
  4. 洋蔥
  5. 娃娃菜
  6. 玉米筍
  7. 秋葵
  8. 水煮蛋
  9. 刺瓜
  10. 水餃
  11. 胡瓜
  12. 彩椒
  13. 茄子
  14. 苦瓜
原本計畫今天要安裝太陽能板支架, 但氣候不穩, 所以下午先去小漢五金買了 L 型鋼片, 並詢問角鋼價格, 買 10 尺 220 元的亞角鋼就可以了, 雖然基本上是不鏽鋼, 但保險起見還是要上油漆. 兩塊能板 (167*100 cm) 併在一起需用掉四條 10 尺亞角鋼裁切為如下四條 :
  1. 170*2條
  2. 200*2條
裁切後分別剩下 130*2條與 100*2 條, 前者可用來裁成 65*2 條支柱, 後者可用來裁成四條上方固定條.

市圖還書 2 本 (LinkedIn/易經)

本周到期還書兩本 :
  1. 我用LinkedIn找到高薪國外工作 .2018個人品牌升級版
  2. 易經與命理全是自然科學
最近才從館員口中得知一般會員借書已放寬為 30 本, 家庭卡 60 本, 好是好, 但這樣一來我會越借閱多,

2020年5月23日 星期六

好書 : Arduino Cookbook 第三版

歐萊禮這本經典好書從 2011 年發行第一版以來就被視為 Arduino 學習的聖經, 我剛開始學 Arduino 就是從圖書館借這本書的中譯本開始的, 書中的程式碼都是可以發揮即戰力的實用參考範例, 我大部分都有實際跑過. 好消息是此書已在四月份推出了第三版 :

# Arduino Cookbook, 3rd Edition


Source : Oreilly


從目錄來看, 雖然整體還是維持 18 章不變, 但此版增修了非常多內容, 其中的亮點是在第 15 章新增了便宜的 WiFi 模組 ESP8266 的用法, 可見 ESP8266 已經奠定了低成本物聯網模組的關鍵地位. 此外此版也改寫或刪除了許多章節, 例如早已被併購的 Pachube 服務, 也增添了越來越火紅的 MQTT 協定等.

雖然說在物聯網終端模組的選擇上我早已改用 ESP32, 但 Arduino 在價格與教學上仍然具有其優勢, 尤其是 Arduino IDE 開發工具也可以用來開發 ESP8266/ESP32 應用就非常棒, 因為裡面內建了非常多範例可以直接套用修改, 只是 C 語言對於非科班的人來說還是形成一道障礙, 如果未來 Arduino IDE 可以做到 C/MicroPython 雙重支援的話那就無敵了.

ESP8266 WiFi 遙控滑翔機

今天在搜尋固定翼無人機資料時找到下面這篇文章, 讓我有股馬上動手做的衝動 :

# ESP8266-based WiFi-controlled DIY Model Airplane

這篇文章是印度電子工程師 Ravi Butani 用不到 15 美金, 以 ESP8266 自製的固定翼滑翔機 (park flyer), 以安裝於 Android 手機上的 App 透過 WiFi 遙控, 所用之鋰電池可讓飛機在空飛行 15 分鐘. 因為 ESP8266 使用電路板天線, 故遙控距離為 70 米以內. 原文發布於 Instructable :

DIY WiFi Controlled Tiny Plane <15$


Source : Youtube


安裝於 Android 手機之 App 利用 WiFi 的信號強度指標值 (RSSI) 來監督飛行距離, 當 RSSI 低於 -95 dBm 時手機會震動, 提醒操作者讓飛機返航. 其次, 當鋰電池電壓低於 3.7v 時, 手機也會震動提醒盡快讓飛機落地以免墜機. 此 App 設計採體感操控, 亦即手機朝左右偏斜時飛機也分別朝左右轉向.

此飛機的電路設計非常簡單, 沒有使用電變, 而是直接由 ESP8266 透過 GPIO 以 PWM 控制兩個馬達的推力, 因此整個飛控核心是放在 ESP8266 程式上. ESP8266 需燒錄名為 wifiplane_esp8266_esp12e.bin 的飛控韌體 :

wifiplane_esp8266_esp12e.bin

而手機則需安裝名為 wifiplane.apk 之 App :

wifiplane.apk

不過目前還沒有時間玩, 先記錄下來備查.

2020年5月22日 星期五

好站 : 到日本當軟體工程師的入門指南系列

今天在找 ESP32 的藍芽資料時偶然看到陳小熊在 iT 邦幫忙鐵人賽寫的系列文章, 讀完後覺得可以推薦給二哥參考 :

# 到日本當軟體工程師的入門指南系列

二哥這幾天有跟我討論未來工作型態的問題, 例如恩智浦, 台積電這種公司可能要輪三班; 走資工研發則是要加班, 我其實比較傾向軟體 IT 方向, 寧可加班也不要輪班. 雖然過去以代工為主的產業型態, 軟體人才待遇與歐美比起來遠遠不如, 但隨著產業朝智慧與自動化升級, 將來 IT 人才會供不應求.

由於我第一份工作是 ASIC 設計工程師, 在設計後期為了 post simulation 必須去日本三菱電機出差, 那時在大阪前後生活了半年左右, 覺得還蠻喜歡在日本工作的感覺, 甚至還曾計畫考松下或交流協會獎學金去日本讀書哩! 今天讀了陳小熊的文章後, 那時的日本印象頓時又鮮活起來.

要在日本生活與工作當然要懂一點日文, 我在學校時對日文就特別用心, 日語對話馬馬虎虎, 在大阪工作的半年裡, 我大部分都是用英文跟三菱電機的工程師溝通, 下了班去超市買東西才會用到簡單的日文. 後來我也去地球村學過日文, 考過舊日檢四級, 作者大三就考到 N1 實在太厲害了.

Garmin nuvi 4592R 軟體與地圖更新問題

我在 2016 年底用福利社購物金買的 Garmin nuvi 4592R 使用至今非常滿意, 經常上網更新圖資的話, 導航與超速照相警告提示精確度都還蠻高的, 但昨天在車上用手機連網進入應用程式 "下載中心" 欲進行更新時, 按下確定鍵卻毫無動作 :





打電話給 Garmin 客服 (02)2642-9199, 說可能主機 WiFi 信號較弱, 建議我在電腦安裝 Garmin Express 軟體, 透過電腦安裝應無問題. 軟體下載網頁 :

https://www.garmin.com/zh-TW/software/express/windows/ (約 114 MB)

安裝好 Garmin Express 好將導航機直接連接到 PC 的 USB 插槽 (不要透過 USB 分享器), 然後執行 Garmin Express, 新增裝置並註冊後即自動下載軟體與圖資, 參考按照下面這個影片 :

https://www.youtube.com/watch?v=pmR0_oBZgCo






這樣就完成更新了.

2020年5月21日 星期四

購買樹莓派用的無線網卡 EW-7811Un

這幾天在測試新版樹莓派 Raspbian Buster 作業系統時, 發現之前用來給 Pi Zero 連網用的迅捷 FW150US (強國製) 沒辦法使用, 用 wget 安裝驅動程式的網址已不存在, 雖然有找到之前備份的驅動程式檔案 8188eu-20160305.tar.gz, 但在 Raspbian Buster 系統下安裝會出現錯誤 (下 insmod 指令時), 參考 :

樹莓派的 Wifi 設定 : 使用迅捷 FW150US

我手邊有兩塊 Pi Zero 與一塊 Pi A+, 如果沒有無線網卡連網的話就沒辦法用而近乎報廢了 (單機有啥意思呢). 需要安裝驅動的設備實在太麻煩, 我想有沒有樹莓派 Raspbian 內建就已支援, 不需安裝驅動即插即用的網卡呢? 我在台灣樹莓派找到這款信舟 EDIMAX 的 EW-7811Un 據說是可以的, 想買來試試 :

無線網路卡 – EW-7811Un

"EW-7811Un,其效能、樣式簡直像是專為 Raspberry Pi 而生,將 EW-7811Un 置入樹莓派,完全相容、免驅動、裝上就能用、低耗電、高速11n,好處多多,更別說EW-7811Un全球最小體積,鍍金接口和極簡的樹莓派有多麼地相襯。"

但 288 元有點小貴, 我在露天找到這賣家的一顆才 100 元 :

EDIMAX 高效能隱形USB無線網路卡(EW-7811Un)V1.0A_2013年出廠_已過保_低價出售 $100

我只要買 3 顆給兩片 Pi Zero 與一片 Pi A+ 用即可, 含運 360 元.




參考 :

How to Set up the Edimax EW-7811Un USB WiFi Adapter on Your Raspberry Pi
RPi USB Wi-Fi Adapters


2020-05-24 補充 :

今天到貨領回來測試 OK, 在 Raspbian Buster 2020.1 版上直接插到樹莓派自動就找到網卡, 不需安裝驅動程式, 這張卡實在太棒了.

2020-05-25 補充 :

雖然 FW150US 沒辦法在 Raspbian 即插即用, 但今日在輝達 Jetson Nano 的 Ubuntu 上卻可以, 可見這是作業系統有沒有內建其驅動程式的問題.

2020年5月20日 星期三

關於樹莓派 Pi 3A+ no wireless interface found 問題

上週在 Pi Zero W 上順利安裝了 Raspbian Buster, 因為此板內建 WiFi, 因此初次開機設定重啟後, 按右上角的無線連線 wlan0 即可選擇無線基地台. 但今天拿出去年買來卻一直未開機測試的 Pi 3A+, 燒錄同樣的 Buster 映像檔重開機後, 點右上角的無線連線 icon 卻顯示 "no wireless interface found", 無線網卡沒起來, 根本無法選擇基地台.




開啟終端機, 用 ifconfig 查詢網路介面, 只有 loopback (lo) 而已, 沒有 wlan0 :

pi@raspberrypi:~ $ ifconfig 
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 9  bytes 524 (524.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 9  bytes 524 (524.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

花了一整晚研究這問題, 測試了網上各種解決辦法都沒有效, 奇怪, Buster 在 Pi Zero W 上沒問題, 難道這是 P3 A+ 板子的問題? 我找到下面這篇台灣樹莓派論壇的教學文章, 說 2018 年新版 Raspbian 作業系統的無線網路設定檔 /etc/wpa_supplicant/wpa_supplicant.conf 中拿掉了 WiFi 的國家設定 :

[教學] 啟用 Pi 3B+的WiFi

我檢視此檔原始內容只有兩行 :

pi@raspberrypi:~ $ sudo cat /etc/wpa_supplicant/wpa_supplicant.conf 
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

進入桌面系統的 "偏好設定/Raaspberry Pi 設定" :




切到最右邊 "在地化", 按 "設定 WiFi 國家", 在下拉式選單中選擇國家為台灣, 按確定即可 :




也可以在終端機下 sudo raspi-config 去設定 :

pi@raspberrypi:~ $ sudo raspi-config

選 "Localization Options" : 




選 "Change WiFi Country" :




選擇 "TW Taiwan" 按確定即可 :




再次檢查 /etc/wpa_supplicant/wpa_supplicant.conf 就會出現國家設定了 :

pi@raspberrypi:~ $ sudo cat /etc/wpa_supplicant/wpa_supplicant.conf 
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=TW 

然後還要去修改網路介面設定檔 /etc/network/interfaces, 加入 wlan0 設定, 其原始內容為 :

pi@raspberrypi:~ $ sudo cat /etc/network/interfaces 
# interfaces(5) file used by ifup(8) and ifdown(8)

# Please note that this file is written to be used with dhcpcd
# For static IP, consult /etc/dhcpcd.conf and 'man dhcpcd.conf'

# Include files from /etc/network/interfaces.d:
source-directory /etc/network/interfaces.d
auto lo
iface lo inet loopback

要加上如下內容 :

allow-hotplug wlan0
auto wlan0
iface wlan0 inet manual
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

pi@raspberrypi:~ $ sudo nano /etc/network/interfaces
pi@raspberrypi:~ $ sudo cat /etc/network/interfaces   
# interfaces(5) file used by ifup(8) and ifdown(8)

# Please note that this file is written to be used with dhcpcd
# For static IP, consult /etc/dhcpcd.conf and 'man dhcpcd.conf'

# Include files from /etc/network/interfaces.d:
source-directory /etc/network/interfaces.d
auto lo
iface lo inet loopback

allow-hotplug wlan0
auto wlan0
iface wlan0 inet manual
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

存檔後重開機就可以看到 wlan0 了, 可以在桌面右上角選取無線基地台, 設定 SSID 與密碼, 也可以參考下面這篇去修改無線網路設定檔 /etc/wpa_supplicant/wpa_supplicant.conf, 在 network 參數中加入 ssid 與 psk 密碼  :

Raspberry Pi 3 'No Wireless Interface Found'

pi@raspberrypi:~ $ sudo nano /etc/wpa_supplicant/wpa_supplicant.conf 
pi@raspberrypi:~ $ sudo cat /etc/wpa_supplicant/wpa_supplicant.conf 
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=TW

network={
ssid="TonyNote8"
psk="123456"
}

參考 :

[教學] 啟用 Pi 3B+的WiFi
RPI 3 B+ No wireless interfaces found
Raspberry Pi 的基礎 - 使用 Wi-Fi 無線網卡連上網路
Raspberry Pi Wi-Fi & Bluetooth Setup - How to Configure your Pi 4 Model B, 3 Model B and 3 Model B+ Connectivity

2020年5月19日 星期二

好書 : Introduction to Programming in Python: An Interdisciplinary Approach

Python 的入門書目前可說汗牛充棟, 但下面這本 Addison-Wesley 出版的 "跨學科" (interdisciplinary) Python 入門書與眾不同, 書中範例涵蓋材料, 航太, 生物科學, 網路系統等領域, 目的是強化一個概念 : 數學, 科學, 工程, 以及運算這四個領域是緊密關聯在一起的. 在上一個千禧年時代, 基礎教育是以培養 "閱讀, 寫作, 算術" 能力為學科目標, 但作者認為現在必須改為 "reading, writing, and computing", 這裡的 computing 是指運用程式進行計算的能力.


Source : Amazon


此書三個作者都是普林斯頓資工系教授, 書中附有大量習題, 除了可作為大一新生的程式寫作教科書外也適合自學. 此書最大的亮點是作者附加了演算法概念以及提示語法應用上可能的盲點. 書中範例可從此書網站下載 :

https://introcs.cs.princeton.edu/python/home/

購買不鏽鋼保鮮盒

因為上周菁菁說阿公每天吃燉滷的菜會吃膩, 所以我打算不滷菜了, 改幫爸準備不同配置的冷凍生鮮菜魚肉等, 每餐用電鍋蒸熟即可, 容器則是用不鏽鋼保鮮盒, 經過在露天比價市調後, 決定向台南 mami 的魔法廚房購買 :

韓版加厚正304不鏽鋼保鮮盒 便當盒 密封保鮮盒 烤模*通過SGS檢驗*可當內鍋.烤模*mami的魔法廚房 長方形 550ml : $95*14=1330+65=1395

https://www.youtube.com/watch?v=OozbkM6p3bA




Youtube 有許多楊桃文化上船的電鍋料理做法可參考.

2020年5月18日 星期一

免費電子書 : Kalman and Bayesian Filters in Python

最近對卡爾曼濾波器很感興趣, 因為在飛航控制的應用非常多. 今天找到很棒的卡爾曼濾波器 Python 實作資料, 是矽谷工程師 "Roger Labbe" 寫的一本如何用  Python 實現卡爾曼濾波器的免費電子書, 下載網址如下 :

Kalman and Bayesian Filters in Python

Roger Labbe 將許多濾波器包含卡爾曼全都寫成 FilterBy 類別, 教學文件如下 :

https://filterpy.readthedocs.io/en/latest/kalman/KalmanFilter.html

程式碼寄存於 GitHub :

https://github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python

還有人為此書寫下讀書筆記, 參考 :

读书笔记-学习《Kalman-and-Bayesian-Filters-in-Python》

要好好來探索一下 FilterBy 的用法, 數學原理可以慢慢研究沒關係, 希望早點應用到樹莓派無人機的飛行控制上.


2020 年第 20 周記事

上上週過了立夏之後天氣馬上明顯變熱, 晚上都得打赤膊睡覺, 但早上起來還是滿身大汗得再沖一次澡. 天氣熱對疫情應該也有幫助, 到本周陳部長已吃石斑魚矣. 但疫情一趨緩, 一大堆人就迫不及待擠景點與賣場, 竟然還很多人不戴口罩, 真以為天下太平了是嗎? 猴急最容易出錯.

上週四晚上打電話回鄉下時響很久爸都沒接, 由手機連線客廳監視器燈有開, 但外面四支監視器卻無法連上, 一直到八點多打給小舅, 想問看看是不是有請爸去他家吃晚飯, 小舅說沒有, 但他可以過去看看, 結果原來爸跟鄰居在外面曬穀場聊天沒聽到電話鈴聲. 監視器主機故障問題必須趕快解決. 週日早上接到婷婷電話, 說阿旺哥要去她家估價, 因小舅家的主機也故障了, 所以順便請阿旺哥中午來家裡檢視一下. 結果主機真的壞了, 換上三年前買的海康 SD-7208 主機後可看到監視影像, 但網路連線問題卻卡在密碼無效而停住. 後來問小安才進入 admin, 但我忙了一個下午還是無解, 下周再研究看看用 virtual sever 是否可行. 但至少監視器恢復正常錄影了.

上週種植的 30 株大陸妹經過上周三的狂風暴雨摧殘只剩下約 1/3 存活, 我發現天氣變熱之後大陸妹越來越難種, 鎮上種子行的老闆娘也說月底後就不育苗了, 要等秋天. 所以本周就改買 30 株空心菜以及五株秋葵來種, 因為夏秋是雨季, 這個時節只有空心菜與地瓜葉最不怕雨, 雨水多反而長得越嫩. 空心菜採收時只要留下根部, 雨水一來又會重新長出葉子來.

爸說下個月夏季電費要來了, 我的太陽能板何時才會完成? 這件事最近都擱下來, 一定要有點進度才行, 週日下午上去頂樓勘查地形, 順便量板子大小以決定支架要怎麼做. 這兩塊能板尺寸是 167*100*4 cm, 打算參考旁邊太陽能熱水器支撐架設計 :







方位角朝正南方 10 度以內均可, 傾斜角取 23 度, 因高雄市緯度北緯 23.28 度, 緯度 25 度以內傾斜角等於緯度, 參考 :

如何巧用方位角和傾斜角增大光伏發電量?

柱高=167*sin(23)=65.25 cm

上週看完 "謗法" 之後由 "夫婦的世界" 接檔, 本周已看到第十集, 這部真的超級灑狗血, 可說是韓版的 "炮仔聲" (但緊湊精緻些), 難怪打敗 "天空之城", 登上新的韓國電視收視率冠軍紀錄寶座. 此劇探索的元素很多, 謊言, 婚姻, 外遇, 報復, 政商勾結, ... 令人不得不繼續往下看.

2020年5月17日 星期日

卡爾曼濾波器應用之相關論文

前幾天有網友留言說卡爾曼濾波器看來可以應用在股票預測, 我上碩博士論文網站找到民國 100 年以來有如下幾篇金融商管應用相關之論文, 發現股票方面並不如想像的多, 或許民國 100 年以前較多也說不定 (這有意味著甚麼嗎) :

以Kalman濾波器研究股票市場之應用 (無)
使用觀測器 / 卡爾曼濾波器識別法線上預測台灣金融股票
以Kalman濾波器研究股票市場之應用 (無)
金融保險公司之匯率曝險的研究:Kalman Filter模型之應用 (紙本)
本國銀行總要素生產力之衡量─狀態空間KalmanFilter模型

但卡爾曼濾波器在工程應用方面的論文數卻頗可觀, 主要是在定位, 軌跡追蹤, 以及通訊, 電化學方面, 以下是民國 100 年以來之相關論文, 大部分均提供電子檔下載 :

基於卡爾曼濾波器的輔助之四旋翼機建置SLAM地圖 (無)
基於傅立葉轉換和卡爾曼濾波之室內定位機制
以擴展卡爾曼濾波器融合雙眼視覺與慣性里程計於室內定位 
# 採用Kalman Filter 改善以Beacon 佈署的室內展場定位 (20210723)
# 一種適用於移動式無線感測器網路之結合RSSI更新擴展式卡爾曼濾波器定位法 (20230815)
幾何未知轉角偵測結合卡爾曼濾波器演算模式在機動目標追蹤上的應用
基於卡爾曼濾波器與機器學習之低功耗藍芽裝置室內定位準確度強化技術 (無)
聯邦無跡卡爾曼濾波器於雙頻紅外線搜索與追蹤感測器網路之應用研究
整合擴展型卡爾曼濾波器與 PID 控制於智慧型機器人之自主式避障
利用卡爾曼濾波器設計自主穩定四旋翼空拍機 (紙本)
利用卡爾曼濾波器以及結構化支持向量機的追蹤演算法 (20210728)
基於擴增式卡爾曼濾波器的四旋翼無人飛行載具之模糊分散滑動模式軌跡追蹤控制
基於低耗電藍牙裝置使用卡爾曼濾波器與支持向量機之室內定位
應用卡爾曼濾波器與適應性模糊推論系統 於室內定位之研究

這裡面我對機器人與無人空拍機的飛行軌跡控制最有興趣.

有些論文設定數年後才解除下載限制, 我認為可能原因是 :
  1. 指導教授或研究生認為論文具有商業價值, 或者有打算申請專利
  2. 提交論文時預設就是校外不開放
學術的本質是成果宣告與知識交流, 應該不會有人覺得自己論文可能有瑕疵而不想公開吧?

2020年5月15日 星期五

學習筆記總索引

這是為了方便找到各筆記索引頁用的, 目前已有的筆記整理如下 :

PHP 學習筆記索引
Python 學習筆記索引
Node.js 學習筆記索引
R 語言學習筆記索引
# 樹莓派 Raspberry Pi 文章列表
# Arduino 學習筆記索引
MicroPython on ESP8266 學習筆記索引
MicroPython on ESP32 學習筆記索引
jQuery EasyUI 系列文章索引
EasyUI 學習筆記索引
jQuery UI 學習筆記索引
ExtJS 學習筆記索引
AutoIt 學習筆記索引
邏輯設計筆記索引
Django 2 學習筆記索引
GCP (GAE) 學習筆記索引
網頁設計速學筆記索引
Bootstrap 4 學習筆記索引
Git 學習筆記索引
AWS 學習筆記索引

~ 進行中 ~

市圖還書 1 本 (Javascript 演算法)

本周還書一本 :
  1. JavaScript資料結構及演算法實作

前陣子突然想學演算法借的, 有人預約就先還了, 演算法 ... 等有空再玩好了.

樹莓派燒錄 Raspbian Buster

樹莓派官方 Linux 散佈版 Raspbian 源自 Debian, 由於 Debian 於 2019-07-06 發布了名為 Buster 的穩定版本 Debian 10, 因此 Raspbian 也推出了 Raspbian Buster 版本. 今天我下載了 2020-02-13 發布的映像檔燒錄在 16 GB 的 MicroSD 卡上, 放進 Pi Zero W 板子上測試看看有甚麼不同.

關於 Debian 版本參考 :

https://www.debian.org/releases/index.zh-tw.html




我開始接觸樹莓派時的版本是 "wheezy". 樹莓派 Raspbian 下載點 :

https://www.raspberrypi.org/downloads/raspbian/




這卡裡面原先是 2019 年燒錄的舊版 Raspbian, 放進 PC 讀卡機後會出現兩個 Drive (我的情況是名稱為 boot 的 D 與無名稱的 F), 如果用 Win10 的格式化程式分別將這兩個 Drive 格式化的話, 燒錄時會出現 Error, 所以我還是乖乖用 SD memory card formatter 程式去格式化, 然後用 Win32 Disk Imager 燒錄映像檔.

由於 Pi Zero 只有兩個 MicroUSB 接口, 一個接電源, 另一個如果接鍵鼠組的話就沒辦法接 WiFi 了, 所以買 Pi Zero 真的有點不方便, 應該直接買內建 WiFi 的 Pi Zero W 才對. 玩過各種樹莓派板子後, 考量成本與接線方便性, 我覺得只要買 Pi 3A+ 這塊板子當作測試母板即可, 因為它與 Pi 3B 差別只是 DRAM 少一半 (512MB) 而已, 因為內建 WiFi, 因此唯一的 USB 插槽可用來插鍵鼠組方便操作設定.

燒錄好映像檔後取出插入樹莓派開機, 需進行幾個簡單設定 :

首先是國家, 語系, 以及時區設定 :




修改預設帳號 pi 的密碼 (預設 raspberry)  :




設定螢幕, 如果四周有黑邊才勾選 :




按 "Skip" 跳過軟體新, 因無線網路還沒設好, 且更新要很久 :




這樣就完成了, 重開機 :




重開機後按左上角樹莓派標誌點選 "偏好設定/Raspberry Pi 設定" :




將 SSH 與 VNC 開啟 :




重新開機就大功告成啦!

2020年5月14日 星期四

關於卡爾曼濾波器

曾在一本機器學習與 OpenCV 影像處理書籍中看到卡爾曼濾波器, 最近在關於機器人控制的文章中又讀到這名詞, 所以就花了點時間了解一下, 發現它的應用非常廣泛, 而且一個甲子過去了還是歷久彌新, 連自駕車與無人車也用上了, 參考 :

機器人運動估計算法卡爾曼濾波
卡爾曼濾波在機器人視覺領域的應用(一)
卡爾曼濾波在機器人視覺領域的應用(二)
自動駕駛基礎之——如何寫卡爾曼濾波器?

摘要如下 :

卡爾曼濾波器演算法是一種自回歸 (自適應) 預測方法, 只需要前一時刻狀態之預測值以及目前狀態之觀測值即可計算當前狀態的預測值, 不需要大量的歷史資料學習即可進行預測. 由於它能根據一組包含雜訊的不完全觀測值預測動態系統之狀態, 效率比倒傳遞神經網路高, 被廣泛應用在機器人, 信號處理, 軌跡預測, 航空器導航, 金融與計量經濟學, 以及自動控制系統等, 例如阿波羅計畫的太空船導航電腦即使用了卡爾曼濾波器.

卡爾曼濾波器以其主要貢獻者匈牙利裔的美國數學家卡爾曼  (Rudolf E. Kalman) 博士命名, 他被譽為系統理論之父 (the father of system theory). 他在 1960 年提出的兩篇論文中以狀態空間描述時變動態系統, 卡爾曼濾波器演算法的雛形於焉誕生, 不過藍德公司 (RAND) 公司的雷達專家 Peter Swerling 在 1958 年也提出過類似的演算法. 此演算法基本上就是一個帶有雜訊項的一階遞迴預測器. 首次實作出卡爾曼濾波器的是 NASA 太空專家 Stanley F. Schmidt, 並於後來的阿波羅登月計畫中被用來預測太空船之行進軌道.

卡爾曼濾波器的原理建築在線性代數與隱藏式馬可夫模型上, 所觀測的對象基本上是用一個被高斯雜訊所干擾的動態系統來描述 (稱為 first-order Gause-Markov model), 而此動態系統則可用一個隱藏式馬可夫鏈表示. 與其他濾波器不同的是, 卡爾曼濾波器是一種純粹的時域濾波器, 可在實時 (real-time) 系統中運作, 在實作上不需要先在頻域設計好後再轉換成時域, 而且除了前一狀態量外, 不需要儲存歷史資料, 適合在記憶體很小的嵌入式設備中實現, 例如 Arduino 控制器, 參考 :

一階/二階/卡爾曼濾波比較
卡尔曼滤波学习笔记
Arduino讀取MPU6050陀螺儀數據——卡爾曼濾波算法實踐
https://github.com/regishsu/arduino/blob/master/balance5/balance5.ino

卡爾曼濾波器是一個遞迴估計 (recursive estimator) 演算法, 其運作包括預測 (prediction) 與更新 (update) 這兩個步驟, 根據信號與雜訊的狀態空間模型, 在預測階段, 濾波器使用前一狀態預測值計算 (加權) 當前狀態預測值; 而在更新階段則以當前狀態的觀測值優化在預測階段獲得的預測值以獲得一個更精確的新預測值, 亦即, 卡爾曼濾波器任一時間點的預測值只與前一個預測值以及高斯雜訊項有關. 所以卡爾曼濾波器其實就是透過觀測值來重構系統的狀態向量, 不斷地進行 "預測-觀測-更新" 迭代, 根據觀測值來消除隨機雜訊干擾, 使系統從被雜訊汙染的狀態中回復本來面目.

參考 :

# 維基 : 魯道夫卡爾曼
卡爾曼濾波 (Kalman Filter)
什麼是卡爾曼濾波
使用觀測器 / 卡爾曼濾波器識別法線上預測台灣金融股票

2020-05-14 補充 :

我在一般 DSP 書上找不到卡爾曼濾波器的資料 (是因為它不是頻域濾波器的原因嗎?), 只在下面這本書的第六章找到 Kalman filter 的介紹 :

Learning Approaches in Signal Processing (參考 Table of Content)




不過在 OpenCV 的書上倒是看到蠻多應用的.

2020-05-15 補充 :

CRC 出版的 "Handbook of Signal Processing in Acoustics" 的 3.4.1 節也有介紹.

2020-05-18 補充 :

北卡羅來納州立大學的兩位資工系教授為了授課撰寫了一本卡爾曼濾波器的小書, 從機率統計開始扼要講述基本原理, 到線性卡爾曼與擴展卡爾曼濾波器, 很值得參考 :

http://www.cs.unc.edu/~tracker/media/pdf/SIGGRAPH2001_CoursePack_08.pdf

他們還整理了卡爾曼濾波器的參考資料於下列網頁 :

http://www.cs.unc.edu/~welch/kalman/

另外母校有一本原文書也不錯 :

The Kalman filter in finance

下面這篇最吸引我興趣, 介紹無人機飛航控制 (MATLAB) :

Introduction to Aerial Robotics-States Estimates and Coding Examples

下面這篇則是以實例解釋卡爾曼濾波器應用 :

Kalman Filter Applications

下面這篇以 Python 語法實作卡爾曼濾波器 :

Kalman Filters: A step by step implementation guide in python

2020年5月13日 星期三

好書 : Higher Engineering Mathematics

今天在搜尋工程數學公式時找到下面這個印度政府人力資源部 FOSSEE 專案網站中的工程數學書籍 "Higher Engineering Mathematics" 範例程式下載網頁 :

https://tbc-python.fossee.in/book-details/856/




此書範例程式同時也放在 GitHub :

https://github.com/FOSSEE/Python-Textbook-Companions/tree/master/Higher_Engineering_Mathematics_by_B._S._Grewal

印度理工與數學能力很強, 矽谷聽說有非常多來自印度的工程師, 美國科技書籍也有很多作者是印度人, 不過印度出版品在台灣卻不常見. 作者 B.S. Grewal 是印度軍事工程學院應用數學系教授, 他還有下列兩本著作 :

Numerical Methods in Engineering and Science (C, C++, and MATLAB)
Advanced Engineering Mathematics

購買液晶螢幕壁掛架

為了測試樹莓派方便 (有 HDMI 輸入), 打算買個壁掛架將液晶螢幕掛在牆上, 這樣就不會占用桌面空間了, 我在 PCHome 找到下面這款 :

Mountor固定式嵌入型壁掛架/螢幕架ML1010-適用28吋以下LED $220

中鋼製鋼板品質不錯, 但價格就比較貴. 在露天找到下面幾款, 應該都是強國製 :

14-27 盒裝 液晶電視壁掛架 液晶 螢幕壁掛架 螢幕支架 液晶架 璧掛架 螢幕架 電視架 $40
螢幕壁掛架14"~24"適用 螢幕支架 LCD支架 壁掛支架 喇叭架 $40*4+60=220
【子震科技】竣 Eversun CW-203 13吋~30吋超薄液晶電視螢幕壁掛架 $105
14-24吋 螢幕壁掛架 螢幕支架 電視壁掛架 液晶螢幕壁掛架 $70

決定跟板橋這家買 4 個, 含運共 220 元, 平均每個 55 元.




2018 年在露天買的這個 15.6 吋螢幕經檢視後方 HDMI 插孔方向為朝牆壁不適合, 因為壁掛架深度約 2 公分, HDMI 若朝牆壁會突出太多而無法掛上去, 應該買 HDMI 插孔朝下的才好, 不過背板中間有一個小平台用來放樹莓派倒是不錯 :

寬屏15.6寸液晶屏高清VGA / HDMI/超薄壁掛顯示器 PS3/PS4/XBOX/樹莓派/戶外監控便攜式1080P $1780





例如下面這款就是 HDMI 朝下, 且輸出入介面完整可當電視用 (附遙控器, 解析度 1366*768, 內建喇叭) :

# 【三不五時】15.6吋LED寬螢幕(16:9)1080P液晶電視/HDMI/USB/AV/PC/NTSC-TV $2050

 另外下面這款 AOC 的尺寸較大 (19.5 吋), HDMI 插槽也是朝下, 是純粹的顯示器 (無內建喇叭) :

【酷3C】全新 AOC 20E1H 19.5吋 HDMI 螢幕 螢幕 LED螢幕 電腦螢幕 液晶螢幕 $2050

尺寸 : 38(高)*46(寬)*20(深), 解析度 1600*900

同樣價格, 若只做顯示幕我覺得 AOC 的較優.

2020年5月12日 星期二

用視覺思考與溝通

今天看到下面這篇文章 :

結合Google Analytics製作圖表的神器!Google Data Studio教學

文中作者引述的一段話很值得參考的 :

"在《打造圖像腦 - 學會擊敗90%職場競爭者的視覺思考工作術》這本書提及:「人腦有2/3在處理圖像,卻有超過90%的人不會用圖像思考與溝通。 把所想所說變成簡潔圖像,才能釐清資訊,進而瞬間打動人心!」"

這本 "打造圖像腦" 市圖有, 已調借 :


Source : 博客來


人腦結構主要是基於圖樣識別 (pattern recognition) 而非計算 (computation) 為目的而設計的. 論數值計算能力, 人腦遠遠不能與電腦相比; 但在語音與圖像處理能力方面, 電腦可就遠遠不能與人腦相比了. 即使近年 AI 在這方面突飛猛進, 刷臉與語音辨識能力大有進步, 但若要在反應速度上與人腦相匹敵, 得配備高效能高耗能的 GPU 才行.

理解人是用視覺思考的動物對溝通非常重要. 所謂 "一圖抵千言", 視覺傳達的吸睛效果遠比文字敘述要強大, 但真正有說服力的溝通是以簡短的文字標題搭配能傳遞核心想法的圖像, 瞬間讓閱聽者產生共鳴. 因為幫孫正義撰寫簡報而成為軟銀董事的前田謙利在他寫的一系列簡報書中不斷強調在簡報中正確使用圖片的重要性, 參考 :

最強企業簡報講師:結尾沒講這2件事,做再好都沒說服力
不准用條列PPT、10分鐘就是聽眾極限

2020 年第 19 周記事

本周疫情仍保持零確診, 好消息但還不能掉以輕心. 台股回到 1 萬 1 千點上, 但美國變成最大受害國, 至今確診超過 137 萬人, 死亡超過 8 萬人, 四月份失業率來到 14%, 離 11/3 美國大選不到半年, 選情被打趴的川普絕對不會坐以待斃, 中美角力大亂鬥是隱隱待發的金融隱憂.

本周 matplotlib 學研無進度, 因為暫時停下來在樹莓派上測試了 Kali Linux. 上周中油被駭事件讓我對資安突然重視起來 (特別是物聯網設備據說最容易遭到攻擊), 剛好買了 Python 資安書籍就趁熱來玩玩看, 反正我的 Pi Zero W 買來閒置也很久了.

週日是母親節, 姊姊週六下午回到高雄, 傍晚一起回鄉下, 菁菁則與水某周日才搭小姨子車直接到岳父農舍. 連日的酷熱真令人受不了, 所以周日下午我特地去西角的泉成買四果冰帶過去. 母親仙遊已六年, 母親節對我而言只有思念.

昨天發現部落格到訪人數已超過 500 萬, 沒想到我的學習流水帳雜記簿居然有這麼多人來看 :




事實上如果不記錄的話, 我的記憶只能往前回溯兩個星期而已.

本周看完韓劇謗法, 昨晚開始看最近火紅的 "夫婦的世界", 此劇搞外遇的男主角朴海俊很面熟, 查維基原來他演過 "我的大叔" 裡的朴東勳好友, 那個很會讀書卻當了和尚的謙德; 而演最正小三的韓素希則演過 "百日的郎君" 裡的王后金素慧.

2020年5月10日 星期日

市圖還書 3 本

本周市圖到期還書 3 本 :
  1. 工程數學 :微分方程
  2. AI世代生存哲學大思考 : 人人都必須了解的「新AI學」
  3. 美中開戰與台灣的未來 : 為什麼美中開戰, 戰場必然在台灣?
第三本書乃五位國內學者與戰略專家合寫, 剖析自從川普發動貿易戰以來所牽動的美中台關係演變, 探討在美國新的印太戰略與中國一帶一路擴張全球影響力的衝突之下, 萬一美中開戰台灣的自處之道, 值得一讀 (此書係 2019 年出版, 2020 武漢肺炎的爆發恐怕已對整個局勢產生關鍵的改變).

2020年5月8日 星期五

Kali Linux 學習筆記 (二) : Nmap 套件測試

前幾天在 Micro SD 卡上燒錄了 Kali Linux v2020.1 映像檔後插入 Raspberry Pi Zero W 板子進行開機測試, 只要開啟 ssh 服務與設定 WiFi 連網, 就可以在筆電上用 Putty 連線 Pi Zero W, 利用 Kali Linux 進行安全性滲透測試了, 對象是我這台同樣連線手機基地台的 ACER Swift 5 筆電. 以後也可以用這方式對 ESP32 等物聯網終端進行資安滲透測試.





前一篇測試參考 :

Kali Linux 學習筆記 (一) : 樹莓派 Zero W 燒錄 Kali Linux 作業系統

本篇是閱讀 "不會C也是資安高手:用Python和駭客大戰三百回合(第二版)" 第四章後在 Pi Zero W 的 Kali Linux 上進行 Nmap 實測之紀錄.

Nmap 是 Network Mapper (網路對映器) 的簡寫, 是一款優秀的網路掃描與資安稽核之自由軟體, 也是駭客手邊的必備工具, 為美國資安專家 Gordon Lyon 以 C 與 Lua 語言開發. 通常駭客使用 Nmap 蒐集目標主機之網路設定, 應用服務與作業系統資訊, 建構出一張網路的架構圖, 並從中找到可能的安全漏洞, 其基本功能如下 :
  • 掃描主機 :
    向目標主機發送封包, 根據其反應判斷是否有開機與連網.
  • 掃描通訊埠 :
    向目標主機的特定通訊埠 (預設是常用的 1660 個埠) 發送封包, 根據其反應取得這些埠之狀態 (例如是否有開啟).
  • 檢查應用程式服務類型與版本 :
    向目標主機的特定通訊埠發送封包, 根據其反應取得與此埠對映之應用程式之服務類型與版本.
  • 偵測作業系統版本 :
    向目標主機發送封包, 根據其反應取得主機類型, 作業系統類型與版本, 
此外, Nmap 具有偽造掃描者身分 (例如 IP 與 MAC 位址偽裝) 進行隱蔽掃描, 以及避開防火牆對系統進行安全性漏洞檢查等高級稽核技術, 其 NSE (Nmap Scripting Engine) 指令碼功能可用 Lua 語言自行替 Nmap 添加功能模組以擴充 Nmap 的功能, 目前指令碼已超過 350 個. 參考 :

https://zh.wikipedia.org/wiki/Nmap

Kali Linux 內建了非常多的資安滲透工具, Nmap 就是其中之一. 其他 Linux 分散版本一般未內建 Nmap, 對 Debian 系列 Linux 系統可用下列指令安裝 :

sudo apt-get install nmap 

登入 Kali Linux 後在終端機介面下 nmap 就會顯示其指令說明 :

root@kali:~# nmap   
Nmap 7.80 ( https://nmap.org )
Usage: nmap [Scan Type(s)] [Options] {target specification}
TARGET SPECIFICATION:
  Can pass hostnames, IP addresses, networks, etc.
  Ex: scanme.nmap.org, microsoft.com/24, 192.168.0.1; 10.0.0-255.1-254
  -iL <inputfilename>: Input from list of hosts/networks
  -iR <num hosts>: Choose random targets
  --exclude <host1[,host2][,host3],...>: Exclude hosts/networks
  --excludefile <exclude_file>: Exclude list from file
HOST DISCOVERY:
  -sL: List Scan - simply list targets to scan
  -sn: Ping Scan - disable port scan
  -Pn: Treat all hosts as online -- skip host discovery
  -PS/PA/PU/PY[portlist]: TCP SYN/ACK, UDP or SCTP discovery to given ports
  -PE/PP/PM: ICMP echo, timestamp, and netmask request discovery probes
  -PO[protocol list]: IP Protocol Ping
  -n/-R: Never do DNS resolution/Always resolve [default: sometimes]
  --dns-servers <serv1[,serv2],...>: Specify custom DNS servers
  --system-dns: Use OS's DNS resolver
  --traceroute: Trace hop path to each host
SCAN TECHNIQUES:
  -sS/sT/sA/sW/sM: TCP SYN/Connect()/ACK/Window/Maimon scans
  -sU: UDP Scan
  -sN/sF/sX: TCP Null, FIN, and Xmas scans
  --scanflags <flags>: Customize TCP scan flags
  -sI <zombie host[:probeport]>: Idle scan
  -sY/sZ: SCTP INIT/COOKIE-ECHO scans
  -sO: IP protocol scan
  -b <FTP relay host>: FTP bounce scan
PORT SPECIFICATION AND SCAN ORDER:
  -p <port ranges>: Only scan specified ports
    Ex: -p22; -p1-65535; -p U:53,111,137,T:21-25,80,139,8080,S:9
  --exclude-ports <port ranges>: Exclude the specified ports from scanning
  -F: Fast mode - Scan fewer ports than the default scan
  -r: Scan ports consecutively - don't randomize
  --top-ports <number>: Scan <number> most common ports
  --port-ratio <ratio>: Scan ports more common than <ratio>
SERVICE/VERSION DETECTION:
  -sV: Probe open ports to determine service/version info
  --version-intensity <level>: Set from 0 (light) to 9 (try all probes)
  --version-light: Limit to most likely probes (intensity 2)
  --version-all: Try every single probe (intensity 9)
  --version-trace: Show detailed version scan activity (for debugging)
SCRIPT SCAN:
  -sC: equivalent to --script=default
  --script=<Lua scripts>: <Lua scripts> is a comma separated list of
           directories, script-files or script-categories
  --script-args=<n1=v1,[n2=v2,...]>: provide arguments to scripts
  --script-args-file=filename: provide NSE script args in a file
  --script-trace: Show all data sent and received
  --script-updatedb: Update the script database.
  --script-help=<Lua scripts>: Show help about scripts.
           <Lua scripts> is a comma-separated list of script-files or
           script-categories.
OS DETECTION:
  -O: Enable OS detection
  --osscan-limit: Limit OS detection to promising targets
  --osscan-guess: Guess OS more aggressively
TIMING AND PERFORMANCE:
  Options which take <time> are in seconds, or append 'ms' (milliseconds),
  's' (seconds), 'm' (minutes), or 'h' (hours) to the value (e.g. 30m).
  -T<0-5>: Set timing template (higher is faster)
  --min-hostgroup/max-hostgroup <size>: Parallel host scan group sizes
  --min-parallelism/max-parallelism <numprobes>: Probe parallelization
  --min-rtt-timeout/max-rtt-timeout/initial-rtt-timeout <time>: Specifies
      probe round trip time.
  --max-retries <tries>: Caps number of port scan probe retransmissions.
  --host-timeout <time>: Give up on target after this long
  --scan-delay/--max-scan-delay <time>: Adjust delay between probes
  --min-rate <number>: Send packets no slower than <number> per second
  --max-rate <number>: Send packets no faster than <number> per second
FIREWALL/IDS EVASION AND SPOOFING:
  -f; --mtu <val>: fragment packets (optionally w/given MTU)
  -D <decoy1,decoy2[,ME],...>: Cloak a scan with decoys
  -S <IP_Address>: Spoof source address
  -e <iface>: Use specified interface
  -g/--source-port <portnum>: Use given port number
  --proxies <url1,[url2],...>: Relay connections through HTTP/SOCKS4 proxies
  --data <hex string>: Append a custom payload to sent packets
  --data-string <string>: Append a custom ASCII string to sent packets
  --data-length <num>: Append random data to sent packets
  --ip-options <options>: Send packets with specified ip options
  --ttl <val>: Set IP time-to-live field
  --spoof-mac <mac address/prefix/vendor name>: Spoof your MAC address
  --badsum: Send packets with a bogus TCP/UDP/SCTP checksum
OUTPUT:
  -oN/-oX/-oS/-oG <file>: Output scan in normal, XML, s|<rIpt kIddi3,
     and Grepable format, respectively, to the given filename.
  -oA <basename>: Output in the three major formats at once
  -v: Increase verbosity level (use -vv or more for greater effect)
  -d: Increase debugging level (use -dd or more for greater effect)
  --reason: Display the reason a port is in a particular state
  --open: Only show open (or possibly open) ports
  --packet-trace: Show all packets sent and received
  --iflist: Print host interfaces and routes (for debugging)
  --append-output: Append to rather than clobber specified output files
  --resume <filename>: Resume an aborted scan
  --stylesheet <path/URL>: XSL stylesheet to transform XML output to HTML
  --webxml: Reference stylesheet from Nmap.Org for more portable XML
  --no-stylesheet: Prevent associating of XSL stylesheet w/XML output
MISC:
  -6: Enable IPv6 scanning
  -A: Enable OS detection, version detection, script scanning, and traceroute
  --datadir <dirname>: Specify custom Nmap data file location
  --send-eth/--send-ip: Send using raw ethernet frames or IP packets
  --privileged: Assume that the user is fully privileged
  --unprivileged: Assume the user lacks raw socket privileges
  -V: Print version number
  -h: Print this help summary page.
EXAMPLES:
  nmap -v -A scanme.nmap.org
  nmap -v -sn 192.168.0.0/16 10.0.0.0/8
  nmap -v -iR 10000 -Pn -p 80
SEE THE MAN PAGE (https://nmap.org/book/man.html) FOR MORE OPTIONS AND EXAMPLES

可見 Kali Linux 2020.1 版搭載的是最新的 Nmap 7.8 版. 

使用 nmap 指令以 TCP 半連接方式 (收到 SYN+ACK 後不回送 ACK, 沒有完成三向握手稱為半連接, 此為隱蔽模式, 參數 -sS) 對主機進行埠掃描之指令如下 : 

root@kali:~# nmap -oX - -p 1-500 -sS 192.168.43.14    
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE nmaprun>
<?xml-stylesheet href="file:///usr/bin/../share/nmap/nmap.xsl" type="text/xsl"?>
<!-- Nmap 7.80 scan initiated Sat May  9 01:33:29 2020 as: nmap -oX - -p 1-500 -sS 192.168.43.14 -->
<nmaprun scanner="nmap" args="nmap -oX - -p 1-500 -sS 192.168.43.14" start="1588988009" startstr="Sat May  9 01:33:29 2020" version="7.80" xmloutputversion="1.04">
<scaninfo type="syn" protocol="tcp" numservices="500" services="1-500"/>
<verbose level="0"/>
<debugging level="0"/>
<host starttime="1588988009" endtime="1588988095"><status state="up" reason="arp-response" reason_ttl="0"/>
<address addr="192.168.43.14" addrtype="ipv4"/>
<address addr="1C:1B:B5:xx:xx:xx" addrtype="mac" vendor="Intel Corporate"/>
<hostnames>
<hostname name="DESKTOP-QUTGKxx" type="PTR"/>
</hostnames>
<ports><extraports state="filtered" count="500">
<extrareasons reason="no-responses" count="500"/>
</extraports>
</ports>
<times srtt="169689" rttvar="169689" to="848445"/>
</host>
<runstats><finished time="1588988096" timestr="Sat May  9 01:34:56 2020" elapsed="87.24" summary="Nmap done at Sat May  9 01:34:56 2020; 1 IP address (1 host up) scanned in 87.24 seconds" exit="success"/><hosts up="1" down="0" total="1"/>
</runstats>
</nmaprun>

掃描結果會以 XML 格式傳回, 裡面有 192.168.43.14 這台主機的電腦名稱 (hostname), MAC 位址 (address), 以及 CPU 製造商 (vender) 等資訊. 更多的 nmap 指令用法參考 : 

資工專家 Alexsandre Norman 把 Nmap 打包整合成名為 python-nmap 的 Python 套件, 讓熟悉 Python 的程式員可利用此 API 調用 Nmap 進行安全性滲透測試, 但是 Kali Linux 預設並未搭載此套件, 需自行安裝. 參考 :

https://pypi.org/project/python-nmap/
https://github.com/alexandrenorman


1. 安裝 pyhton-nmap 套件 : 

root@kali:~# pip3 install python-nmap 
Collecting python-nmap
Building wheels for collected packages: python-nmap
  Running setup.py bdist_wheel for python-nmap ... done
  Stored in directory: /root/.cache/pip/wheels/bb/a6/48/4d9e2285291b458c3f17064b1dac2f2fb0045736cb88562854
Successfully built python-nmap
Installing collected packages: python-nmap
Successfully installed python-nmap-0.6.1

可見目前最新是 0.6.1 版. 安裝完成就可以進入 Python shell 將 nmap 模組匯入 :

root@kali:~# python3 
Python 3.7.5 (default, Oct 27 2019, 15:43:29)
[GCC 9.2.1 20191022] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import nmap          #匯入 nmap 模組
>>> dir(nmap)
['ET', 'PortScanner', 'PortScannerAsync', 'PortScannerError', 'PortScannerHostDict', 'PortScannerYield', 'Process', '__author__', '__builtins__', '__cached__', '__doc__', '__file__', '__last_modification__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '__version__', 'convert_nmap_output_to_encoding', 'csv', 'io', 'nmap', 'os', 're', 'shlex', 'subprocess', 'sys']

可見此模組本身使用了 csv, io, re, sys 等內建模組, 主角是 PortScanner (同步) 與 PortScannerAsync (非同步) 等類別. 不過這是套件結構中的捷徑, 實際的類別放在下一層的 nmap.nmap 中 :

>>> dir(nmap.nmap) 
['ET', 'PortScanner', 'PortScannerAsync', 'PortScannerError', 'PortScannerHostDict', 'PortScannerYield', 'Process', '__author__', '__builtins__', '__cached__', '__doc__', '__file__', '__get_last_online_version', '__last_modification__', '__loader__', '__name__', '__package__', '__scan_progressive__', '__spec__', '__version__', 'convert_nmap_output_to_encoding', 'csv', 'io', 'os', 're', 'shlex', 'subprocess', 'sys']

與上面 dir(nmap) 結果是一樣的. 接下來就可以呼叫 PortScanner 類別的建構子 PortScanner() 進行通訊埠掃描測試了.


2. 掃描通訊埠 : 

呼叫 nmap.PortScanner() 函數可掃描指定主機的通訊埠, 其參數格式如下 :

nmap.PortScanner('主機網址', '通訊埠範圍', arguments='掃描類型參數')

這三個參數都是字串, 其中通訊埠範圍用 'from-to' 表示, 例如 '1-500' 表示掃描通訊埠 1~500. arguments 為下面是從 Pi Zero W 掃描我的筆電的結果 :

>>> nm=nmap.PortScanner()   
>>> type(nm) 
<class 'nmap.nmap.PortScanner'>
>>> nm.scan('192.168.43.14', '1-500', '-sS') 
{'nmap': {'command_line': 'nmap -oX - -p 1-500 -sS 192.168.43.14', 'scaninfo': {'tcp': {'method': 'syn', 'services': '1-500'}}, 'scanstats': {'timestr': 'Fri May  8 07:00:00 2020', 'elapsed': '24.98', 'uphosts': '1', 'downhosts': '0', 'totalhosts': '1'}}, 'scan': {'192.168.43.14': {'hostnames': [{'name': 'DESKTOP-QUTGKxx', 'type': 'PTR'}], 'addresses': {'ipv4': '192.168.43.14', 'mac': '1C:1B:B5:xx:xx:xx'}, 'vendor': {'1C:1B:B5:xx:xx:xx': 'Intel Corporate'}, 'status': {'state': 'up', 'reason': 'arp-response'}}}}

可見呼叫 PortScanner() 會傳回一個 PortScanner 物件, 而呼叫此物件的 scan() 方法會送出對應的 Nmap 指令, 並將 Nmap 回應之 XML 資料轉成一個字典傳回來, 其中鍵 command_line 之值即 python-nmap 套件送出的真正 Nmap 指令, 這指令也可以呼叫 command_line() 方法取得 :

>>> nm.command_line() 
'nmap -oX - -p 1-500 -sS 192.168.43.14'

用 dir() 指令可查詢 PortScanner 物件的方法

>>> dir(nm) 
['_PortScanner__process', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_nmap_last_output', '_nmap_path', '_nmap_subversion_number', '_nmap_version_number', '_scan_result', 'all_hosts', 'analyse_nmap_xml_scan', 'command_line', 'csv', 'get_nmap_last_output', 'has_host', 'listscan', 'nmap_version', 'scan', 'scaninfo', 'scanstats']

摘要如下表 :


 PortScanner 物件之方法 說明
 scan(ip, ports, arguments) 掃描主機之通訊埠, 傳回字典
 command_line() 傳回對應之 Nmap 指令字串
 csv() 傳回以分號隔開的 csv 格式掃描回應字串
 scaninfo() 傳回掃描資訊 (字典), 例如 tcp/udp, 半連接等
 hostname() 傳回主機名稱 (字串)
 all_hosts() 傳回被掃瞄之主機 IP (串列)
 has_host(ip) 檢查是否有主機之掃描結果 (True/False)


例如 :

>>> nm.scan('192.168.43.14', '1-500', '-sS') 
{'nmap': {'command_line': 'nmap -oX - -p 1-500 -sS 192.168.43.14', 'scaninfo': {'tcp': {'method': 'syn', 'services': '1-500'}}, 'scanstats': {'timestr': 'Sat May  9 04:57:29 2020', 'elapsed': '13.29', 'uphosts': '1', 'downhosts': '0', 'totalhosts': '1'}}, 'scan': {'192.168.43.14': {'hostnames': [{'name': 'DESKTOP-QUTGKxx', 'type': 'PTR'}], 'addresses': {'ipv4': '192.168.43.14', 'mac': '1C:1B:B5:xx:xx:xx'}, 'vendor': {'1C:1B:B5:xx:xx:xx': 'Intel Corporate'}, 'status': {'state': 'up', 'reason': 'arp-response'}}}}
>>> nm.all_hosts() 
['192.168.43.14']
>>> nm.csv() 
'host;hostname;hostname_type;protocol;port;name;state;product;extrainfo;reason;version;conf;cpe\r\n'
>>> nm.has_host('192.168.43.14') 
True
>>> nm.has_host('192.168.43.15') 
False
>>> nm.scaninfo() 
{'tcp': {'method': 'syn', 'services': '1-500'}}
>>> nm.all_hosts() 
['192.168.43.14']
>>> nm.nmap_version() 
(7, 80)
>>> nm.listscan() 
['127.0.0.1']
>>> nm.scanstats() 
{'timestr': 'Sat May  9 05:44:45 2020', 'elapsed': '0.01', 'uphosts': '0', 'downhosts': '1', 'totalhosts': '1'}
>>> nm.get_nmap_last_output()
'<?xml version="1.0" encoding="UTF-8"?>\n<!DOCTYPE nmaprun>\n<?xml-stylesheet href="file:///usr/bin/../share/nmap/nmap.xsl" type="text/xsl"?>\n<!-- Nmap 7.80 scan initiated Sat May  9 05:44:45 2020 as: nmap -oX - -sL 127.0.0.1 -->\n<nmaprun scanner="nmap" args="nmap -oX - -sL 127.0.0.1" start="1589003085" startstr="Sat May  9 05:44:45 2020" version="7.80" xmloutputversion="1.04">\n<verbose level="0"/>\n<debugging level="0"/>\n<host><status state="unknown" reason="user-set" reason_ttl="0"/>\n<address addr="127.0.0.1" addrtype="ipv4"/>\n<hostnames>\n<hostname name="kali" type="PTR"/>\n</hostnames>\n</host>\n<runstats><finished time="1589003085" timestr="Sat May  9 05:44:45 2020" elapsed="0.01" summary="Nmap done at Sat May  9 05:44:45 2020; 1 IP address (0 hosts up) scanned in 0.01 seconds" exit="success"/><hosts up="0" down="1" total="1"/>\n</runstats>\n</nmaprun>\n'
>>>

上面傳入 '-sS' 掃描類型參數表示對目標主機進行半開通訊埠掃描, 回應資料包括了電腦名稱與 MAC 位址等主機資訊. 可用的掃描類型參數如下表 :


 掃描類型參數 說明
 '-sP' 對目標主機進行 ping 掃描
 '-PR' 對目標主機進行 ARP 掃描
 '-sS' 對目標主機進行半連接 TCP 通訊埠掃描
 '-sT'  對目標主機進行全連接 TCP 通訊埠掃描
 '-sU' 對目標主機進行 UDP 通訊埠掃描
 '-sV' 掃描目標主機所安裝之網路服務軟體版本
 '-O' 掃描目標主機之作業系統資訊


測試結果如下 :

>>> nm.scan('192.168.43.14', '1-500', '-sV') 
{'nmap': {'command_line': 'nmap -oX - -p 1-500 -sV 192.168.43.14', 'scaninfo': {'tcp': {'method': 'syn', 'services': '1-500'}}, 'scanstats': {'timestr': 'Fri May  8 15:43:21 2020', 'elapsed': '19.16', 'uphosts': '1', 'downhosts': '0', 'totalhosts': '1'}}, 'scan': {'192.168.43.14': {'hostnames': [{'name': 'DESKTOP-QUTGKxx', 'type': 'PTR'}], 'addresses': {'ipv4': '192.168.43.14', 'mac': '1C:1B:B5:66:xx:xx'}, 'vendor': {'1C:1B:B5:66:xx:xx': 'Intel Corporate'}, 'status': {'state': 'up', 'reason': 'arp-response'}}}}
>>> nm.scan('192.168.43.14', '1-500', '-PR') 
{'nmap': {'command_line': 'nmap -oX - -p 1-500 -PR 192.168.43.14', 'scaninfo': {'tcp': {'method': 'syn', 'services': '1-500'}}, 'scanstats': {'timestr': 'Fri May  8 15:46:01 2020', 'elapsed': '12.33', 'uphosts': '1', 'downhosts': '0', 'totalhosts': '1'}}, 'scan': {'192.168.43.14': {'hostnames': [{'name': 'DESKTOP-QUTGKxx', 'type': 'PTR'}], 'addresses': {'ipv4': '192.168.43.14', 'mac': '1C:1B:B5:66:xx:xx'}, 'vendor': {'1C:1B:B5:66:xx:xx': 'Intel Corporate'}, 'status': {'state': 'up', 'reason': 'arp-response'}}}}
>>> nm.scan('192.168.43.14', '1-500', '-sT')   
{'nmap': {'command_line': 'nmap -oX - -p 1-500 -sT 192.168.43.14', 'scaninfo': {'tcp': {'method': 'connect', 'services': '1-500'}}, 'scanstats': {'timestr': 'Fri May  8 15:47:02 2020', 'elapsed': '12.26', 'uphosts': '1', 'downhosts': '0', 'totalhosts': '1'}}, 'scan': {'192.168.43.14': {'hostnames': [{'name': 'DESKTOP-QUTGKxx', 'type': 'PTR'}], 'addresses': {'ipv4': '192.168.43.14', 'mac': '1C:1B:B5:66:xx:xx'}, 'vendor': {'1C:1B:B5:66:xx:xx': 'Intel Corporate'}, 'status': {'state': 'up', 'reason': 'arp-response'}}}}
>>> nm.scan('192.168.43.14', '1-500', '-sP')   
{'nmap': {'command_line': None, 'scaninfo': {'error': ['You cannot use -F (fast scan) or -p (explicit port selection) when not doing a port scan\nQUITTING!\n', 'You cannot use -F (fast scan) or -p (explicit port selection) when not doing a port scan\nQUITTING!\n']}, 'scanstats': {'timestr': 'Fri May  8 15:47:57 2020', 'elapsed': '0.01', 'uphosts': '0', 'downhosts': '0', 'totalhosts': '0'}}, 'scan': {}}
>>> nm.scan('192.168.43.14', '1-500', '-sU') 
{'nmap': {'command_line': 'nmap -oX - -p 1-500 -sU 192.168.43.14', 'scaninfo': {'udp': {'method': 'udp', 'services': '1-500'}}, 'scanstats': {'timestr': 'Sat May  9 04:43:45 2020', 'elapsed': '35.95', 'uphosts': '1', 'downhosts': '0', 'totalhosts': '1'}}, 'scan': {'192.168.43.14': {'hostnames': [{'name': 'DESKTOP-QUTGKxx', 'type': 'PTR'}], 'addresses': {'ipv4': '192.168.43.14', 'mac': '1C:1B:B5:xx:xx:xx'}, 'vendor': {'1C:1B:B5:xx:xx:xx': 'Intel Corporate'}, 'status': {'state': 'up', 'reason': 'arp-response'}, 'udp': {137: {'state': 'open', 'reason': 'udp-response', 'name': 'netbios-ns', 'product': '', 'version': '', 'extrainfo': '', 'conf': '3', 'cpe': ''}}}}}
>>> nm.scan('192.168.43.14', arguments='-O')
{'nmap': {'command_line': 'nmap -oX - -O 192.168.43.14', 'scaninfo': {'tcp': {'method': 'syn', 'services': '1,3-4,6-7,9,13,17,19-26,30,32-33,37,42-43,49,53,70,79-85,88-90,99-100,106,109-111,113,119,125,135,139,143-144,146,161,163,179,199,211-212,222,254-256,259,264,280,301,306,311,340,366,389,406-407,416-417,425,427,443-445,458,464-465,481,497,500,512-515,524,541,543-545,548,554-555,563,587,593,616-617,625,631,636,646,648,666-668,683,687,691,700,705,711,714,720,722,726,749,765,777,783,787,800-801,808,843,873,880,888,898,900-903,911-912,981,987,990,992-993,995,999-1002,1007,1009-1011,1021-1100,1102,1104-1108,1110-1114,1117,1119,1121-1124,1126,1130-1132,1137-1138,1141,1145,1147-1149,1151-1152,1154,1163-1166,1169,1174-1175,1183,1185-1187,1192,1198-1199,1201,1213,1216-1218,1233-1234,1236,1244,1247-1248,1259,1271-1272,1277,1287,1296,1300-1301,1309-1311,1322,1328,1334,1352,1417,1433-1434,1443,1455,1461,1494,1500-1501,1503,1521,1524,1533,1556,1580,1583,1594,1600,1641,1658,1666,1687-1688,1700,1717-1721,1723,1755,1761,1782-1783,1801,1805,1812,1839-1840,1862-1864,1875,1900,1914,1935,1947,1971-1972,1974,1984,1998-2010,2013,2020-2022,2030,2033-2035,2038,2040-2043,2045-2049,2065,2068,2099-2100,2103,2105-2107,2111,2119,2121,2126,2135,2144,2160-2161,2170,2179,2190-2191,2196,2200,2222,2251,2260,2288,2301,2323,2366,2381-2383,2393-2394,2399,2401,2492,2500,2522,2525,2557,2601-2602,2604-2605,2607-2608,2638,2701-2702,2710,2717-2718,2725,2800,2809,2811,2869,2875,2909-2910,2920,2967-2968,2998,3000-3001,3003,3005-3007,3011,3013,3017,3030-3031,3052,3071,3077,3128,3168,3211,3221,3260-3261,3268-3269,3283,3300-3301,3306,3322-3325,3333,3351,3367,3369-3372,3389-3390,3404,3476,3493,3517,3527,3546,3551,3580,3659,3689-3690,3703,3737,3766,3784,3800-3801,3809,3814,3826-3828,3851,3869,3871,3878,3880,3889,3905,3914,3918,3920,3945,3971,3986,3995,3998,4000-4006,4045,4111,4125-4126,4129,4224,4242,4279,4321,4343,4443-4446,4449,4550,4567,4662,4848,4899-4900,4998,5000-5004,5009,5030,5033,5050-5051,5054,5060-5061,5080,5087,5100-5102,5120,5190,5200,5214,5221-5222,5225-5226,5269,5280,5298,5357,5405,5414,5431-5432,5440,5500,5510,5544,5550,5555,5560,5566,5631,5633,5666,5678-5679,5718,5730,5800-5802,5810-5811,5815,5822,5825,5850,5859,5862,5877,5900-5904,5906-5907,5910-5911,5915,5922,5925,5950,5952,5959-5963,5987-5989,5998-6007,6009,6025,6059,6100-6101,6106,6112,6123,6129,6156,6346,6389,6502,6510,6543,6547,6565-6567,6580,6646,6666-6669,6689,6692,6699,6779,6788-6789,6792,6839,6881,6901,6969,7000-7002,7004,7007,7019,7025,7070,7100,7103,7106,7200-7201,7402,7435,7443,7496,7512,7625,7627,7676,7741,7777-7778,7800,7911,7920-7921,7937-7938,7999-8002,8007-8011,8021-8022,8031,8042,8045,8080-8090,8093,8099-8100,8180-8181,8192-8194,8200,8222,8254,8290-8292,8300,8333,8383,8400,8402,8443,8500,8600,8649,8651-8652,8654,8701,8800,8873,8888,8899,8994,9000-9003,9009-9011,9040,9050,9071,9080-9081,9090-9091,9099-9103,9110-9111,9200,9207,9220,9290,9415,9418,9485,9500,9502-9503,9535,9575,9593-9595,9618,9666,9876-9878,9898,9900,9917,9929,9943-9944,9968,9998-10004,10009-10010,10012,10024-10025,10082,10180,10215,10243,10566,10616-10617,10621,10626,10628-10629,10778,11110-11111,11967,12000,12174,12265,12345,13456,13722,13782-13783,14000,14238,14441-14442,15000,15002-15004,15660,15742,16000-16001,16012,16016,16018,16080,16113,16992-16993,17877,17988,18040,18101,18988,19101,19283,19315,19350,19780,19801,19842,20000,20005,20031,20221-20222,20828,21571,22939,23502,24444,24800,25734-25735,26214,27000,27352-27353,27355-27356,27715,28201,30000,30718,30951,31038,31337,32768-32785,33354,33899,34571-34573,35500,38292,40193,40911,41511,42510,44176,44442-44443,44501,45100,48080,49152-49161,49163,49165,49167,49175-49176,49400,49999-50003,50006,50300,50389,50500,50636,50800,51103,51493,52673,52822,52848,52869,54045,54328,55055-55056,55555,55600,56737-56738,57294,57797,58080,60020,60443,61532,61900,62078,63331,64623,64680,65000,65129,65389'}}, 'scanstats': {'timestr': 'Sat May  9 00:17:08 2020', 'elapsed': '165.53', 'uphosts': '1', 'downhosts': '0', 'totalhosts': '1'}}, 'scan': {'192.168.43.14': {'hostnames': [{'name': 'DESKTOP-QUTGKxx', 'type': 'PTR'}], 'addresses': {'ipv4': '192.168.43.14', 'mac': '1C:1B:B5:xx:xx:xx'}, 'vendor': {'1C:1B:B5:xx:xx:xx': 'Intel Corporate'}, 'status': {'state': 'up', 'reason': 'arp-response'}, 'tcp': {5357: {'state': 'open', 'reason': 'syn-ack', 'name': 'wsdapi', 'product': '', 'version': '', 'extrainfo': '', 'conf': '3', 'cpe': ''}}, 'portused': [{'state': 'open', 'proto': 'tcp', 'portid': '5357'}], 'osmatch': [{'name': 'AVtech Room Alert 26W environmental monitor', 'accuracy': '87', 'line': '9077', 'osclass': [{'type': 'specialized', 'vendor': 'AVtech', 'osfamily': 'embedded', 'osgen': None, 'accuracy': '87', 'cpe': []}]}, {'name': 'Microsoft Windows XP SP2', 'accuracy': '87', 'line': '81128', 'osclass': [{'type': 'general purpose', 'vendor': 'Microsoft', 'osfamily': 'Windows', 'osgen': 'XP', 'accuracy': '87', 'cpe': ['cpe:/o:microsoft:windows_xp::sp2']}]}, {'name': 'FreeBSD 6.2-RELEASE', 'accuracy': '86', 'line': '27364', 'osclass': [{'type': 'general purpose', 'vendor': 'FreeBSD', 'osfamily': 'FreeBSD', 'osgen': '6.X', 'accuracy': '86', 'cpe': ['cpe:/o:freebsd:freebsd:6.2']}]}, {'name': 'FreeBSD 10.3-STABLE', 'accuracy': '85', 'line': '26140', 'osclass': [{'type': 'general purpose', 'vendor': 'FreeBSD', 'osfamily': 'FreeBSD', 'osgen': '10.X', 'accuracy': '85', 'cpe': ['cpe:/o:freebsd:freebsd:10.3']}]}]}}}

另外也可以用 nm 字典鍵擷取資訊 :

>>> nm['192.168.43.14'].all_protocols()   
[]
>>> nm['192.168.43.14'].state() 
'up'
>>> nm['192.168.43.14'].hostname()   
'DESKTOP-QUTGKxx'
>>> nm['192.168.43.14']['tcp'].keys() 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'tcp'
>>> nm['192.168.43.14'].all_tcp()   
[]
>>> nm['192.168.43.14'].all_udp()   
[]
>>> nm['192.168.43.14'].all_sctp() 
[]
>>> nm['192.168.43.14'].has_tcp(22) 
False

但以下這幾個不知為何有錯誤 :

>>> nm['192.168.43.14']['tcp'][22] 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'tcp'
>>> nm['192.168.43.14'].tcp(22)   
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.7/dist-packages/nmap/nmap.py", line 975, in tcp
    return self['tcp'][port]
KeyError: 'tcp'
>>> nm['192.168.43.14']['tcp'][22]['state']   
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'tcp'
>>>


參考 :

黑客終極網絡掃描工具Zenmap使用方法