[Coursera][Automata] 自動機理論-Automata筆記-第二週: Regular Expression

image

前言與心得整理

進入到第二週,不知道會不會有更困難的主題出現.寫筆記寫著寫著,發現自己筆記內容比原本老師講的還要多,代表自己不懂得真的太多,需要不斷的補充資料來讓自己更清楚.

相關文章

第二週課程內容:

Regular Express 基本定義 與 運算

符號定義:

通常顯示E來表達一個regular expression,而L(E) 就表示一個regular expression 能表達出來的語言(language).

Language的運算: (Union/Concatenation/Kleene Star)

  • Union (U): 就是把兩個language做一個簡單的聯集.
    • ex: {01, 11, 101} U {10, 11, 101} = {01, 10, 11, 101}
  • Concatenaion (LM): 把兩個language做一個連接,但是注意這裡跟字串的concatenation是不同的.基本定義而顏,把語言L跟語言M連接在一起就稱為LM. LM = wx | w in L and x in M
    • ex:
      • L = { 01, 11}
      • M = { 10, 11}
      • LM = { 0110, 0111, 1110, 1111} 也就是 第一個L元素配上第一個M元素,第二個L元素配上第一個M元素.繼續類推.
  • Kleene Star (*): 就是regex裡面的*,表達任何子集合在L中與空集合或是一個以上的子集合的聯集. L* = {ε} U L U LL ...
    • ex: L = {01, 11} L*= {} or {01, 11} or {0101, 0111, 1101, 1111} ....

Regular Expression定義

  • a是一個symbol, 如果a是一個regular express(記作RE),則 L(A) = {a}
  • L{ε} = {ε}
  • L(empty set) = empty set

將Langugage的運算套用過來,其中E1E2代表兩個RE:

  • U運算: L(E1+ E2) = L(E1) U L(E2)
  • Concatenation: L(E1E2) = L(E1)L(E2)
  • Kleene Star (*) : L(E*) = (L(E))*

以下列出一些範例:

  • 基本定義: L(0) = {0}, L(01) = {01}
  • Union: L(01+0) = L(01) U L(0)= {01} U {0} = {01, 0}
  • Concatenation: L(0(1+0))= L(0)L(1+0) = {0}{1,0} = {01, 00}
  • Kleene Star: L(0*)={ε, 0, 00, 000, ... }
  • 複雜一點的綜合運算: L((0+10)*(ε+1)) = L((0+10)*) L(ε+1) = L({0, 10}*) L(1)
    • 根據以上得結果,所有的Language,不論是0開頭或是1開頭,1結尾,但是只要沒有兩個連續的1就符合.
    • ex: {01} {0001} {0101010101}
    • 連續兩個1不再其中,因為是 ({0} + {10})* U {1}

將RE用ε-NFA表示:

要將RE(Regular Expression)用ε-NFA來表示,基礎的概念如下:

    邊線(arc)代表一個symbol,而路徑可以表示成 a, ε, empty set

image

(image from coursera Automata Course)

套用基礎運算的上如下:

Union: 就是一個分支的圖形

image

(image from coursera Automata Course)

Concatenation: 就是一個連接的圖形

image

(image from coursera Automata Course)

Closure: (CL) 就是一個自己與自己迴圈的圖形(簡單來說 Kleene Star -> Closure)

image

(image from coursera Automata Course)

將RE用DFA表示

概念上就是依照以下的方式:

    狀態(state)也就是我們節點
    而邊線(arc)就是我們會出現的symbol
    所以DFA所能接受的路線(path)就是我們要的語言(language).

image

拿前一章節出現過的圖,舉例來說:

  • 這個DFA要表達的A->B 的Language可以是{11} 或是 {0011} 或是 {0001} 也可以說L(E)={1,01,0101...}
  • 所以這個RE可以表達為E=(0)*1+(10)*1 也就是說
    • 0可以出現一次或是無限次,但是最後一定要有一個1
    • 或是(01)可以出現一次或是無限次,但是最後一定要接著1

k-Path

這邊指的K-Path指的是要透過狀態i到達狀態j其中只能經過k(其中k代表1…k, 比如說k=2 也就是 0, 1, 2)能到達目的狀態的路線,先用簡單的DFA來舉例,舉例而言. 請注意所謂的 k-path不代表必須經過k,是可以不經過的.

image

由狀態A->B的k-path

  • 0-path 也就是A->B不經過任何其他狀態,結果1
  • A-path 也就是A->B可以經過狀態A,結果0*1+1,也就是可以走無限個0然後走到B或是直接走到B.
  • B-path 可以經過B,也可以經過A(這裏假設 A = B - 1),當然可以都不經過.所以推導出來也就是整個DFA的RE:也就是 0*1+(10)*1

關於 k-path的推導題

k-path通常指的是由狀態i 到狀態j 必須經過k狀態(其中k代表的是 0, 1, 2, … k).

    記作 R_ij^(k) (其中 ij 為下標,k為上標)

所以R_ij^(k) 也可以換成思考為:

  • 路徑由 i到j 不經過 k (k-path是可以不經過k,也代表經過k個數是0)
  • 或是:
    • 路徑由i到k
    • 路徑k走到過所有k-1的狀態回到k
    • 路徑由k走到j

如以下圖:

image

透過以上的圖示,可以推導出公式如下:

    R_ij^k = R_ij^(k-1) #也就是 i->j 不經過 k
            +  R_ik^(k-1)   R_kk^(k-1)*  R_kj^(k-1)   # 就是 i->k, k-k, k->j   

UNIX (REGEX) Regular Expression

接下來,課程談到介紹UNIX上面常使用的Regular Express.這邊大家應該比較熟悉,只把幾個常用符號整理一下:

  • [a-c] 指的是 a, b, c 都可以
  • [a-z] 同理可證,就是所有小寫字母.
  • “+” 指的是出現至少一次.
  • “*” 指的是零次或是以上.
  • “?” 指的是零或是一次.

還有一些跟RE與NFA跟DFA的轉換可以筆記一下:

  • UNIX RE 先轉換成 ε-NFA (並且擁有自己的final state)
  • 設定一個新的start state 並且將原本的ε-NFA 作為 ε-translations
  • 透過ε-translations就可以轉換成DFA
  • 透過DFA可以再度的轉換到RE去

詳細的轉換方式,可以參考以下圖片

image

Decision Properties of Regular Language

####定義:

Decision Properties of Regular Language指的是是一個演算法來作為正式敘述一個語言的方式.

舉例:

  • Is string w in language L?
  • Are those two language the same?

####The Emptiness Problem

指的是給予的Language是不是符合這個RE也就是說,假設是DFA給予的語言,能不能夠從start state 跑到 final state.

####The Infinitness Problem

指的是RE中是否有發生迴圈的圖形. 而檢查圖形是否為 Inifitness 最簡單的方法是:

    如果全部的狀態個數為n, 只要可以接受輸入language個數,而且 m >n.  代表就會有迴圈發生.

image

就會像是以上的圖形一樣.

Pumping Lemma

需要先定義一下,什麼是Pumping Lemma,根據wiki上面解釋如下:

    RE中一個長字串,其中有一段文字有出現超過一次以上.

簡單的說,Pumping Lemma 也就是上面圖形所呈現的狀態.

那接下來就要顯示.基礎定義:

  • 全部的狀態個數為n,輸入的語言為w
  • w = xyz
  • xz] <= n
    • 這邊解釋一下 xz 代表的是出現的alphabet個數,比如說 x=abca z=bcdb |xz|=abcd
  • y > 0
  • For all i>=0 xy^i z is in L

這幾個定義裡面,最重要的其實是|xz] <= n.因為找出y的方式不是在找出重複的,而是要確認|xz].以下舉一個例子:

Pumping Lemma 範例:

ex: 語言L他的狀態為1,2,3 輸入為{a, b, c} 輸入為 {abacca},他們的狀態變化是 1(a)->2(b)->3(a)->2(c)->1(c)->3(a)->2 找出他的w =xyz的pumping lemma

解法:

  • 首先試著去找出第一個重複的狀態.也就是1->2->3->2->…
  • 這時候抽出2->3的輸入{ba} 即為 y
  • 同理,可以分解出前面的x={a} z={cca}.同時驗證 xz = {ac} <= 3

如何驗證兩個DFA L與M 是否equivalence

要證明兩個DFA是否equivalence,需要透過以下方式:

  • 計算 L product M
  • 找出 w 滿足L也滿足M(滿足:accept 代表能由start state到final state)
  • 這樣就可以證明 L與M是 equivalence

接下來,要如何做 L product M方法如下:

  • 假設Q1 是 L的所有狀態, Q2是M的所有狀態
  • 找出Q1與Q2的start state [q1, q2]
  • 開始iterate 每一個transition function,並且找出product DFA
  • 透過最後的Product DFA找出一個w 可以由start state走到final state.
  • 即代表兩個DFA L與M是equivalence

image (image from coursera Automata Course)

範例:
  • 起始點為[A, C]
  • 走第一個transition input 0
    • [A, D]
  • 走第二個transuion input 1
    • [B, C]
  • 依照這個方式… 慢慢建構出所有的DFA如上圖右

Closure Properties of Regular Language

這裏主要是敘述定理,還有一些證明方式,主要定義如下:

  • L 跟 M 都是 Regular Language (可以使用regular expression表示出來)

進行以下的操作,並且證明結果都是屬於regular language:

  • Union: L U M 仍然是regular language (可以用regular expression來表示)
    • R是L的regular expression, S 是 M的regular expression.L U M = R + S.可以得知 `R + S仍然是regular expression (根據 union law)
  • Concatenation / Kleene Star: 根據以上的方式, RS (concatenation),及 R* , S* 仍然都符合regular expression (concatenation and kleene star law)
  • Intersection: L intersect M 代表裡面的 R S要找出交集的部分,使用的方式是將兩個圖形做 product 然後找出product的regular expression 即為 L intersect M.
  • Difference: L - M 也會是符合regular language. 根據上一則的方式,透過 product DFA LM 可以找出一個流程是 L 可以由start state跑到 final state但是 M不行. 由於該流程regular expression 是存在於L的其中一個,所以該流程也是符合regular expression. 所以 L - M 也符合regular langugage
  • Completement: completement in L = sigma(Σ)* - L sigma(Σ) 是regular languge 當然Σ* 也是regular languge根據剛剛的difference 定理 L - M 也符合regular langugage自然而然 Σ* - L 也是.
  • Reversal: L^R 表示Reversal 代表的是 L = {0, 01, 11} L^R = { 0^R, (01)^R, (11)^R}= { 0, 10, 00}
    • 需要注意的是 (0)^R = 0 同理可證 (1)^R = 1
    • 相關的Reversal Law:
      • (F+G)^R= F^R + G^R
      • (FG)^R = G^R F^R
      • ((F)*)^R = ((F)^R)*
    • 範例: E = 01* + 10* + 1 找出 E^R
      • E^R = (01*)^R + (10*)^R + 1^R
      • ` (1)^R 0^R + (0)^R 1^R + 1`
      • ` (1^R)* 0 + (0^R)* 1 + 1`
      • 1*0 + 0*1 + 1
  • Homomorphism: h(L)就是透過某些轉換是來把原先的alphabet做一個替換.
    • ex L = {0, 10, 11} h(0)->A, h(1)->B 則 h(L) = { A, BA, BB}
  • Inverse Homomorphism: h^-1(L)是將把透過 h(L2)的結果轉換回 L2. h(L) = L1, h^-1(L1)= L

相關程式

我也把NFA的概念加以實現成一個小工具.放在https://github.com/kkdai/nfa

原本根據定義是無法實現,但是我透過BFS還是可以做出來.只是還在思考是不是有遺漏的案例.

參考網址

[Golang]gomobile 讓你在iOS/Android上面使用Golang(更新:11/17)

前言

其實Go 1.5的正式公布後,最吸引人的就是與其他語言的相互合作.透過的可能是編譯成c-shared library.但是其實我個人最期待的,當然就是使用go mobile

最近他們把相關的範例跟工具都弄的差不多,並且有一了份相當詳細的教學在這裡

簡單流程:

由於教學寫得很清楚,我這裡簡單的把事情都跑過一次.注意:你需要有Go1.5


//抓取go mobile tool
go get golang.org/x/mobile/cmd/gomobile

//初始化gomobile,可能會花一點時間
gomobile init

//編譯gomobile裡面的範例
//這會在本地端直接編譯出 basic.app 只要透過xcode 複製到手機上即可(需要有開發者付費帳號)
gomobile build -target=ios golang.org/x/mobile/example/basic


//如果要把go package編譯成iOS可以用的framework
//這會在本地端編譯出一個hello.framework
cd $GOPATH/src/golang.org/x/mobile/example/bind
gomobile bind -target=ios golang.org/x/mobile/example/bind/hello

//直接在xcode拿來使用即可
open ios/bind.xcodeproj

來個iOS簡單範例 (11/17更新)

這裡提供一個簡單的範例,主要也是測試一下幾個主要的疑慮:

簡單的範例程式碼在這裡,這裡有直接的playgroud

package gomobile01

import (
	"fmt"
)

type Goomobile struct {
	Data string
}

//記得要有constructor 不然到時候你無法自行透過 NSObject init 來建立這個物件
func New() *Goomobile {
	return &Goomobile{Data: "Default test"}
}

func (g *Goomobile) GetData() string {
	fmt.Println("test go ")
	return g.Data
}

這時候建立這個iOS framework 指令是 (假設專案寫在kkdai/gomobile01)

$ gomobile bind -target=ios github.com/kkdai/gomobile01

然後會產生一個gomobile01.framework 把他拉進xcode專案. 以下提供如何使用的方式:


//載入該framework	
#import "gomobile01/Gomobile01.h"

這裡是使用的方式,切記要使用Constructor不要使用 [[xx alloc] init]

    GoGomobile01Goomobile *gb = GoGomobile01New();
    //Default data is @"Default test"
    [gb setData:@"Data...."];
    NSString * str = [gb GetData];
    //str = @"Data..."

已知可以支援的部分

  • 基礎的運算與簡單的資料格式當初參數 (int, string)
  • 支援structure跟method
  • 可以跑net/http但是記得別直接拿rpc.Client或是http.Client當作public

相關限制

目前試著編譯幾個有在使用的package發現有以下的問題,可能需要解決.

  • []slice, map, interface{} 比較進階的資料格式不支援 (可能也不能轉換到iOS)
    • 同理可證,一些package裡面的變數也不要放在parameter裡面.只支援基礎資料格式.
  • 即便是簡單的string, int不支援public global variable.
    • var TestVariable string 不被允許
    • 但是var testVariable string 是可以允許的
  • const目前還不支援 (gomobile: not yet supported, name for const)
  • structure need public: 如果要使用某些物件,要能夠在Objective C上面使用就必須要記得改成public (big-case)
    • 這會發生問題imported and not used: YOUR_PACKETGE
    • 一般而言,public寫法是正確的,但是把struct改成private其實也不是不可以.
  • 無法同時bind兩個package: 由於裡面的記憶體處理或是其他處理的問題.
    • 一般而言如果你跑了 gomobile bind target=ios A_PACKAGE 然後把a.framework拉近xcode在跑gomobile bind target=ios B_PACKAGE再把b.framework拉進專案,前面一個a.framework就會出現問題(不能跑). 詳細的解釋在這裡issue 12245.還沒有比較好的解法.
  • [11/17] 如果要在Structure 必須要建立相關的constructor (NewXXX()).

##參考文章

[iOS]使用iOS Xcode編譯static library一些筆記

image

####將所有m透過預設Object C++來編譯:

  • 設定->LLVM 7.0 -> Compile Source As -> Object-C++

這裏的設定比起單獨點選每個.m再來改成ObjectC++更有優先權.

設定額外的Include Path
  • 設定-> HEADER_SEARCH_PATHS (記得改HEADER_SEARCH_PATHS就好).
  • 記得要使用 $(PROJECT_DIR)/../../../include,而不是單純的 ../../../include不然會找不到.

避免發生 Undefined symbols for architecture x86_64

這是因為你嘗試要跑模擬器的編譯而你編譯出來的static library並沒有x86_64的選項.這邊的修改方式有幾個:

  • 增加x86_64 到”Build Setting”->”Artchitectures”跟”Valid Artchitectures”
  • 或是修改”Build Setting”->”Build Active Architecture Only”改成No

Bitcode enableing

Bitcode是xcode7新的功能.但是如果使用xcode新的專案都會遇到warning,關閉的方法就是在App去關閉,當然如果要使用這個功能,就得每個library都要打開bitcode.

[Coursera][Automata] 自動機理論-Automata筆記-第一週Finite Automata

image

前言

主要是因為有大師推薦,然後發現這堂課的教授就是所謂的Compiler恐龍課本的作者Jeffrey Ullman(Compiler Design的聖經). 加上自動機本身不僅僅實作牽扯到regular expression之外,更在分散式系統中的狀態機(state machine)扮有相當重要的部分. 所以需要來好好學習.

課程鏈結在這裡https://class.coursera.org/automata-004

相關文章

第一週課程

DFA(Deterministic Finite Automata)基本定義

  • alphabet:
    • 任何有限的符號集合. (可以是ASCII也可以是Unicode)
    • ex: {0,1} (binary alphabet), {a,b} {s,p} 都是alphabet
  • string:
    • 透過alphabet產生的list,其中每一個元素都要是該alphabet其中一個元素.
    • length代表的是該string有的個數.
      • ex alphabet {0, 1} 其 string {01} length=2
    • ε 代表是empty string其中他的length=0
  • language:
    • alphabedt產生出所有string的subset.
  • DFA: Deterministic Finite Automata: A formalism for defining languages.由以下組成:
    • 有限的狀態(states) 表示為 Q
    • 固定的input alphabet 表示為 Σ
    • 一個起始狀態 (start state) 表示為q0
    • 至少一個結束狀態 (final state) (這裏指的final state也是指可接受的狀態) 表示為 F
    • 一個transition function 表示為 δ(Q, A)其中 A 代表是一個輸入的 alphabet
      • transition function代表的是,一個輸入所要進入的一個狀態.
      • δ(Q, A) 代表是從狀態Q透過輸入A來計算下一個狀態會是哪裡.

範例:

{0, 1} 是一個alphabet

{0, 1}* = {ε, 0, 1, 00, 01, 10, 11, 010, …} 是alphabet {0,1}為可能出現的string組合,其中

  • {e} length=0
  • {0} length=1
  • {00} {01} {10} {11} length=2

如果要討論language,我們可以說 {ε, 0, 1,00,01,10,11} 是我們將要用到的language

image

(pic: from coursera automata course lecture)

以上的圖,代表一個簡單的DFA,其中:

  • 輸入alphabet為{0, 1}
  • final state為 B
  • dead state為 C (dead node: 也就是只走到C後不論怎麼輸入都無法到達final note)
  • start state為 A
  • transition function可以表示以下方式: A -> δ(B, 1) -> δ(C, 1)

根據以上的圖形,其實可以表示成另外一種表格方式(Transition Table):

image

(pic: from coursera automata course lecture)

左邊為所在的狀態節點,右邊為透過輸入0或是1將要到的狀態節點.

Transition Table 簡單範例

  • 在A狀態輸入0會回到A狀態,輸入1會到B狀態.
  • 狀態A輸入1, 1 會到狀態C。
Transitio Function 運算範例:
  • δ(B, 011) -> δ(δ(B, 01), 1) -> δ(δ(δ(B, 0), 1), 1) -> δ(δ(A, 1), 1) -> δ(B, 1) -> C
  • δ(A, 0) -> A

NFA(Nondeterministic Finite Automata)基本定義

NFA跟DFA有些許的不同,這裡先列出幾個幾本定義

  • NFA中,可以同時存在多個狀態中,也就是說δ(Q1, A)有可能出現不僅僅一個狀態Q2,而是δ(Q1, A)-> {Q2, Q3}.這代表這裡有路可以從Q1透過路線A可以到達Q2跟Q3
  • 跟DFA一樣,NFA一樣開始在一個start state
  • 跟DFA一樣,NFA一樣結束在一個以上的final state

image

(pic: from coursera automata course lecture)

    NFA 表現起來,比較像是棋盤式.每一個狀態(格子)同一個輸入有不僅僅一個可以走得下一步(狀態)

如何把NFA轉化成DFA

從基本定義可以看得出來,NFA跟DFA的差異最大的就是:

  • DFA: 每一次transition function會到唯一一個狀態,也就是: δ(Q1, A)-> Q2
  • NFA: 每一個transition function不一定只會指向一個狀態,所以: δ(Q1, A)-> {Q2, Q3, ...}

也就是說,我們可以說任何一個DFA也可以說是一個NFA,也就是說只要DFA收到同樣的語言(language)由於輸入會是一連串,也就是說輸出也會是不僅僅一個狀態.也可以說DFA透過同一個language input可以轉換成NFA.

    δD(Q1, A) -> P
    δN(Q1, A) -> {P} 可以視為 P 為 所有輸出集合的其中一個

那麼要如何反過來將NFA轉換成DFA呢?

先就定義上的轉換

其實某種角度來說,如果把NFA的結果當成一個language的話,其實就可以被視為是DFA. 也就是說:

    δD(Q1, A) -> P     //一般習慣的DFA表示方式
    δN(Q1, A) -> {P}   //一般習慣的NFA表示方式

如果把{p}當成是一種state而非是一群state,這樣就可以把NFA表示式看成是另外一種DFA。 只是那麼transition function與transition table要如何運算呢? 這時候就需要用到subset construction.

Subset construction

δD({q1, q2, q3, ... qk}, A) 為一個將NFA轉換成DFA的transition function,而結果就是將所有結果的聯集合(union) i = 1, 2, 3 … k是 δN(qi, A)

也就是

    δD({q1, q2, q3, ... qk}, A) = union(δN(qi, A))  其中 i = 1, 2, 3 ... k

Subset construction的範例

透過以下的方式,我們可以將NFA的transition table,轉換成DFA的.

image

以下將每個流程,用文字敘述:

  • 首先走到state {1} 這時候會透過 r 跟 b 走到 2,4 跟5 . 由於我們要取每個結果的聯集.所以 {2,4} {5} 會被當作是我們的一個State
  • 接下來先走到 {2,4}, 這時候要查看 {2} 與 {4}的結果,也就是 將 {4,6}{2,8}做聯集{2,4,6,8}為r的結果,而將{1,3,5}跟{1,5,7}做聯集{1,3,5,7}.
  • 並且將以上兩個結果當作新的state加入之後要走的路途
  • 接下來走 {1,3,5,7} 於是又繼續看 {1} {3} {5} {7}的結果.以此類推….

會得到以下結果

image

ε-NFA 的基本定義

對於NFA,其實是可以允許不需要任何輸入的情況下狀態(state)自己改變. 這時候我們可以說是輸入為ε (因為 ε為空字串,代表的是沒有輸入). 如此一來,所出現的NFA就稱為 ε-NFA.

image (pic: from coursera automata course lecture)

最後我們會導出一個定義是

    每一個NFA都是ε-NFA

Closure of States : CL(q)

這裏同時會有一個新的函式 CL(q) : 其中CL(q)代表的就是 q 狀態的closure 也就是說透過q 所有不需要input能夠到達的state.(換句話說,也就是透過q 能夠透過輸入 ε 來到達的狀態. 也就是說 CL(q) = δN(q, ε).

Example of Closure Starte

以上圖來說,這裡有一些Closure of States的範例:

  • CL(A) = {A} 因為沒有任何ε 的輸入可以到達的狀態.
  • CL(B) = {B, D} ,這裡δN(B, ε) -> D
  • CL(E) = {B, C, D, E}

更多在ε-NFA關於transition function 的運算

  • δ(q, w)在NFA中代表由狀態q開始透過輸入w,可以到達的狀態集合.
  • δ(q, ε) = CL(q) 也就是說由狀態q 在沒有輸入(也就是說輸入為空集合ε)可以到達的狀態.
  • δ(q, A) = δ(q, Aε) = δ(δ(q, A), ε) 所以可以推導出以下
  • δ(q, A) = δ(δ(q, A), ε)) = CL(δ(q, A)) = CL({E}) (假設δ(q, A)={E})

關於第一週作業

這次作業主要都是一些基本觀念跟圖形來推到transition function 的結果. 主要是多看幾次就會找出來其中的規律性.(似乎也沒有方法論可以快速找到).

相關程式

由於根據定義NFA與ε-NFA其實是無法去Implement的最後,我也把DFA的概念加以實現成一個小工具.放在https://github.com/kkdai/dfa

參考網址

[Docker] 再來玩玩Docker,在Windows上遇到的困難與筆記

image

##前言

其實Docker一直是我一個很想玩但是玩不起的技術.主要是因為我的MBA空間太小,隨便一個docker image 就有3~5G.小小128G MBA實在無法來順利成行. 最近有要跨平台跑東西的需求,決定弄幾個docker image可以幫助我處理一些令人討厭的設定.

這次主要是用到Windows桌機,裡面至少有足夠的硬碟空間可以讓我做這件事情.

Docker Windows 可能遇到的困難與筆記

####Docker Quickstart Terminal的console 顯示實在令人搖頭

Windows 上的Docker Quicktstart Terminal 使用MingW Console本來也是還好,但是在我電腦實在就有console顯示的問題. 建議使用ssh login來跑.

方法如下:

  • 跑”Docker Quickstart Terminal” 來將docker VM 跑起來
  • 你會看到 "default" machine with IP 192.168.99.100 (每個人IP不同)
  • 使用putty來登入SSH putty.exe -ssh [email protected]:2376 -pw tcuser 帳號跟密碼都是docker預設,沒有改過應該就可以正常跑.

把以上的指令弄成捷徑在桌面,就可以登入數個docker console

Docker Quickstart Terminal console 會遇到的 volume mount問題

Docker -v提供一個很好的方式可以讓本地端的檔案跟docker container去對應與操作.但是在Windows上面會遇到永遠找不到的路徑問題.(詳細可以參考這裡 還有這個)

    ##這樣在Windows boot2docker 跟 docker quickstart terminal 都會失敗
    docker run -v /c/Users/USER/TEST:/OUTPUT --rm=true DOCKER_IMAGE_NAME
    
    
    ##必須使用以下的指令  注意是"//c"  而非 "/c"
    docker run -v //c/Users/USER/TEST:/OUTPUT --rm=true DOCKER_IMAGE_NAME

這個問題在我剛剛提到使用SSH console是不會有這樣的問題的,所以我強烈建議各位使用docker SSH console.

建立Dockerfile

想要建立一個Docker Hub可以讓人家可以下載的Image或是 Dockerfile,其實不難.步驟以下:

  • 先建立一個github repository裡面只需要有Dockerfile (當然有README.md 更好 :) )
  • Docker Hub (記得要先註冊帳號) 的 Dashboard 選取 [Create] -> [Create Automated Build]
  • 輸入Github帳號去鏈結,選取剛剛建立的github repository
  • 他就會抓取Dockerfile自動跑

建立一些成果分享

Docker image for building OpenSSL for Android

其實會使用這些前提,如果你跟我一樣是:

  • 在Windows 上寫Android App
  • 極度討厭 Cygwin跟MinGW
  • 對於build module一向講求,build完就不需要那些環境

之前做法當然笨笨的使用VM建了一個超肥的VM裡面也裝了一堆不知道有什麼東西.來build一些需要的module. opencv ffmpeg都是如此.

這次我改成自己Dockerfile 參考這裡

[MBA]砍掉XCode的iPhone debug symbol 來節省MacBook Air的小SSD

##前言:

當初錯誤的決定,MBA 128GB 造就我很愛花時間找有沒有東西可以清, 分享一下我使用Mac Book Air 128G 尋找空間的心得.

查看每個程式佔多大空間

顯示隱藏資料夾

這邊需要console指令,方法為以下:

  • 開啟一個showHiddenFiles.sh vi showHiddenFiles.sh
  • 輸入以下指令:

      defaults write com.apple.finder AppleShowAllFiles TRUE
      killall Finder
    
  • 存擋,並且記得把權限打開chmod 660 showHiddenFiles.sh
  • 執行這個會把所有finder都關閉,但是可以之後可以顯示所有隱藏檔案 ( .git 也會出現)

恢復隱藏資料夾

反之,如果要把隱藏資料再次的隱藏起來,可以輸入以下的指令:

    defaults write com.apple.finder AppleShowAllFiles FALSE
    killall Finder

讓Finder裡面顯示資料夾空間

image

(圖片來自: http://www.iclarified.com/14356/how-to-display-folder-size-in-mac-os-x-finder)

主要的方式是到[Finder Menu]->[顯示方式: View]->[打開顯示方式選項: Show View Options]->[計算所有大小]

砍掉Xcode Debug Symbol

主要是參考這篇文章 提到的第四項可以清掉一些xcode debug symbol.每個OS版本也接近1G. 這樣清下去也有20~30G 空間 就算多砍也沒差,反正你手機接起來要debug又會把他都複製到電腦裡面了.

  • ~/Library/Developer/Xcode/iOS DeviceSupport/
  • 裡面會顯示許多版本的iPhone Debug Symbol (ex: 8.3 (12F70)… )
  • 移除掉比較舊的版本Debug Symbol

跟我一樣MBA SSD快爆的人來看看… 馬上又一條活龍…