發表文章

[短談] 部落格文章搬移計劃

過了一個寒假,我的 新部落格:skyblog   終於完成啦~ 接下來我會慢慢地把原本部落格(這裡)的文章搬到那邊,主要的目標是一些技術性的文章或翻譯,一些日常閒聊的就看我心情了(笑)。 不過今年可能會比以往還忙,所以還不知道會不會正常更新(藉口)。或許我可以在等 model train 好的過程中來寫個文章,不然每次都呆呆地盯著他跑也是很浪費時間。 好了,廢話講太多了,這次就這樣吧XD 應該不會被發現上面這些文字幾乎都是從新部落格複製來的。 還請舊雨新知(好老的詞)們來新的部落格逛逛(笑)

[Python] Name Mangling 的大範圍攻擊

早安,真是好久不見了,這學期快忙翻,而這一篇文只是確認生存用的,所以並不會太長。 Name Mangling  在 Python 中撰寫 class 時,只要在屬性名字的前面加上兩個底線(如 __spam),這個屬性的名字最後就會被重組成 _Cls__spam 這樣的形式,這項技術稱作 Name Mangling,提供了類似其他語言的私用屬性。  但要注意的是,就如前面所提到的,類別外部的實例依舊可用重組後的名稱來存取該屬性,所以這並不能做為防止有心人士修改重要資料的方法;事實上,Name Mangling 的存在是為了避免外界對特定屬性的意外存取,或不小心覆寫了父類別的屬性、方法。 class MyClass: def __init__(self): self.__bar = 1 m = MyClass() print(m._MyClass__bar) # 1  但其實,Name Mangling 有個鮮為人知的 陰謀 ... 哪些東西會被 Mangling?  「這話是什麼意思?不就是兩個底線開頭的屬性嗎?」看到標題後,有些人應該會這麼問。的確,像上例的 __bar 會是重組的目標,但其實,還有一些 東西 也是。  根據 Python 官方文件表示: When an identifier that textually occurs in a class definition begins with two or more underscore characters and does not end in two or more underscores , it is considered a private name of that class.  ...  This transformation is independent of the syntactical context in which the identifier is used .  前面的粗體字說明了被重組的名稱必須以 2 個或以上的底線所開頭,且結尾最多只有一個底線;而後面的粗體則是說,這個 mangling 轉換並不侷限於特定的語境(syntactical context),亦即不只有 self.__spam 這裡的 _

[短談] Lua 筆記是否已棄坑?以及接下來的規劃

 應該沒人發現 Lua 默默地沒在更新了,原因除了自己懶癌發作之外,還有在內容安排上的調整,我想把他寫成能輕鬆入門的,但這卻增加了撰寫的難度;再加上我有了新的進度要趕(明明就還是暑假 QQ),所以就漸漸地沒繼續寫了。  雖然手上目前還有第五章寫到一半的稿子,但近期內估計也是不會有下文了。  不過,人們總是反覆地在挖抗與棄坑間來回 (?),所以接下來肯定還會有新的系列,只是應該不會是入門導向,因為我發現入門導向的文章寫起來很累 ˊˇˋ 先這樣吧,大概學期中會再見面的。 啊對了,今天哆啦A夢生日,生日快樂!

[Lua] 敘述-Lua 新手村 (4)

還記得我們曾經在新手村 (1) 提到 chunk(組塊)這個詞嗎?當時還提到,所謂 chunk 是由很多 statement(敘述)組合在一起的,而那時我對敘述的解釋是,一行程式碼就是一個敘述,但其實,這個說法不太精確,而我們這一篇文章將會來談談 Lua 中有哪些敘述。 敘述 Statement  敘述又稱作 陳述式 ,所有敘述都會造成一個效果,而這個效果要視我們使用了哪一種敘述而定。在 Lua 中,敘述分為:指定、local 宣告、block、控制結構、函式宣告及呼叫,還有 return、break 敘述 1 。  而控制結構裡包含了 if、while、repeat、for 等敘述,是我們這篇的主角。  註1 :Lua 5.2 裡還多了 goto 敘述。 指定 Assignment  指定又稱 指派 ,是改變變數值最基本的方法。普通的指定我們已經看過很多了,接著來看看 Lua 裡所謂的「多重指定」: a, b = 12, 78 a 12 b 78  我們可以一次把多個值指定(分配)給多個變數,像上例這樣。我們可以利用這個特性,寫出簡潔有力的兩變數交換: a, b = 12, 78 a, b = b, a print(a, b) 78 12  當然,也可以對 table 的欄位(field)進行這樣的操作: ary = { hi=19, sky=36 } ary['hi'], ary['sky'] = ary['sky'], ary['hi'] ary['hi'] 36 ary['sky'] 19  不過,如果左方變數跟右邊值的數量不一樣的話呢? a, b = 1, 2, 3, 4 -- 3、4 被丟棄 (discard) print(a, b) 1 2 a, b, c, d = 7, 8 -- c、d 補 nil print(a, b, c, d) 7 8 nil nil  多出來的值被丟棄,多出來的變數被補 nil,請牢牢記住這個規則,這在我們之後講到函式時很重要。 Local 宣告與區塊(Block)  我們之前所使用的變數都是屬於全域(global)變數,也就

[Lua] 運算式-Lua 新手村 (3)

在上一章我們看到了很多種型別以及他們的值,但是我們該如何運用他們呢?一個方法就是透過即將要介紹的各種運算子來組合成更複雜的值,也就是所謂的「運算式」。 運算式 Expression  運算式又稱作 表示式 ,他代表了值,在 Lua 中,運算式可以是簡單的值、變數、包含運算符號的式子,以及函式的呼叫,甚至是函式定義和 table 的建構,在這篇文章裡,我們會提到上述除了 函式定義之外的運算式類型。 簡單的值  這個分類是我為了讓讀者容易理解而使用的分類,只要是上一篇文提到的值都算在此類。舉凡 nil、true、false、各種 number,以及字串實字(Literal),也就是由單雙引號或雙中括號包起來的字串。 變數  變數我們在上一篇文已經看過很多了,變數自己是一個運算式,而他也可以透過下面要介紹的運算符號來組成更複雜的運算式。 運算子 Operator  運算子也就是我們熟悉的運算符號,像是 +、-、*、/ 之類的,不過在 Lua 裡,還有更多種運算子。 算數(Arithmetic)運算子  算數運算子包含以下數種: + (加) - (減) * (乘) / (除) % (模除) ^ (指數) - (負數)  我們來簡單看看要怎麼使用他們: 12 + 75 87 36 - 19 17 3 * 5 * 7 105 9 / 3 3 2 / 7 0.2857142857142857 8 % 5 3 -79 % 4 1 6 ^ 2 36 (-4) ^ 3 -64  注意「%」這個運算子的作用,他是由下面這條等式所定義的,其中 math.floor(x) 這個函式可以取得不大於 x 的最大整數: a % b == a - math.floor(a/b)*b  特別的是,% 也可以用在整數以外的運算: math.pi 3.1415926535... math.pi % 1 0.1415926535... math.pi % 0.01 0.0015926535... p = math.pi print(p - p % 0.01) 3.14  如果你有仔細看,會發現上面有一條等式裡使用了「==」,這跟一個等於 = 差在哪呢?這就是我們接下來的主題:關係運算子。 關係(

[Lua] 型別與值-Lua 新手村 (2)

接下來要談談 Lua 裡的資料型別還有所謂的「值」。由於 Lua 是個動態語言,所以變數本身並不帶有型別資訊。嗯?這是什麼意思? 動態語言  不過這篇文畢竟是新手村,所以不會講得太深入,有興趣的讀者可以自行深入了解。  所謂的動態語言就是,同一個變數裡的資料可以現在是一個數字,等一下又是一個字串,這樣能夠動態地轉換型別的語言就叫做動態語言。不過剛剛提到的變數 (Variable) 跟型別 (Type) 到底是什麼? 變數、型別與值  簡單的說,變數就像一個紙箱,並沒有規定裡面要裝什麼,可以裝任何你想裝的物品,而「值(Value)」就是能被裝入變數這個箱子的物品,那麼這個物品的類型就是型別。  舉個例子,如果我有一個紙箱(變數),然後我把香蕉裝進去,那麼這個香蕉就是「值」,而他的類型(型別)就是水果。而且,我可以之後把裡面的香蕉換成白菜,如此一來,值就變成了白菜,而型別就變成了蔬菜,不過紙箱(變數)還是 同一個 。  而在 Lua 中要把一個值給一個變數,只要這樣寫就好: box = 1024 這行中間的等於「=」就是所謂的指定,也就是把右邊的值放到左邊的變數裡面,這裡的變數叫做「box」,而值是「」1024」 Lua 中的型別  Lua  中的資料型別只有 8 種,分別是 nil(無)、 boolean ( 布林 )、 number ( 數字 )、 string ( 字串 )、 function ( 函式 )、 table ( 表 )、 thread ( 執行緒 )、 userdata ( 使用者資料 ),接下來會大致講解每種型別。 nil  nil 是一個很重要的型別,而且我們在上一篇也遇過他,代表著「什麼都沒有」。屬於 nil 這個型別的值只有一個,就是nil。 boolean、number、string  boolean 型別是拿來表示條件 1 的型別,只有兩個值:true 和 false,但這不代表只有這兩個值可以拿去當作條件式使用:在 Lua 中,除了 false 和 nil 代表 false(條件的假)之外,其他值都是 true (條件的真) ,包括 0 和空字串。  註1 :關於條件,會在下幾篇文章進行更深入的解說。  number 就是一般數值的型別,無論是整數

[Lua] 踏入新手村-Lua 新手村 (1)

圖片
踏入新手村第一件事就是要有個新手裝備,也就是幫助我們寫 Lua 的工具,這裡我建議下載 ZeroBrane Studio 這個 IDE,因為他已經包含了 5.1 ~ 5.3 版的 Lua,甚至還有跟像是 Corona SDK 之類的工具做整合,所以非常推薦使用,不過這個系列會以 5.1 版為主。 ZeroBrane Studio 介面介紹  上方紅色那列是工具列,左方黃色是專案 / 目錄管理,而中右方藍色則是主要編輯器,最後下方的綠色是執行結果或互動模式,其中互動模式非常方便,本系列文章會經常使用到。接著讓我們仔細瞧瞧工具列中有什麼:  左半邊的應該很容易懂,中間框起來的是執行、Debug、Live Coding,這三種的運用就看個人造化了(欸)。而 Zerobrane 官網有很多實用的文件,有興趣的讀者就去查查看吧。 開始學 Lua 吧! 組塊 Chunks   我覺得組塊這個名詞並沒有翻得很好,但 我找不太到更好的翻譯了,所以就將就一下吧。  什麼是組塊?任何可執行的程式碼片段就是一個 Chunk;或者,從更程式的定義來看:一連串的敘述(Statement)拼在一起,就是一個 Chunk。  咦?剛剛好像提到了另一個名詞:敘述,這又是什麼?敘述是程式有效果的最小單位,基本上就是一行程式碼。不像 C 或 C++ 需要分號來代表一個指令的結束, Lua  只要有換行,就代表了一個敘述的結束,如果你想在一行之中塞兩個 Statement,你會需要在第一個敘述末端加上分號。  事實上,我剛剛撒了一個小謊,其實敘述的分隔只要一個空白就夠了,連換行都不用,但我們都不應該這麼做,因為這會讓我們的程式碼可讀性下降,所以,若一定要放在同一行,至少加個分號吧。 Hello World 以及互動模式  來看看在 Lua 中要怎麼寫出 Hello World: print("Hello World")  對,就只有這樣!那我們可以來看看  ZeroBrane Studio 中的 互動模式要怎麼使用了: print("Hello World") Hello World print(3 + 4) 7 6 - 2 4 9 * 5 45 print(10 / 4) 2.5  應該很