發表文章

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

過了一個寒假,我的 新部落格: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.__s...

[短談] 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  應該很...

[Lua] 入學須知

我不知道這個標題是在寫什麼。 前言   其實本文就只是個前言,如果沒有興趣的話,可以直接跳過,況且我也不太會說故事(笑)。  知道 Lua 這個語言的人多半也都知道他是個「嵌入式」語言,基本上就是可以嵌入在別的語言中做為工具的角色,也因此,Lua 有以下這些特色: 可擴充性(Extensibility) 簡潔(Simplicity) 有效率(Ef ciency) 可攜性(Portability)  我就不一一說明了。另外,雖然 Lua 的生活大半都跟嵌入有關,但此筆記將以語法及 Libraries 為主,畢竟也是有只用 Lua 開發的應用程式。 學習階段(願景) 新手村:觀念及語法 初階:深入語法及觀念 中階:Table I - 初步運用 高階:Table II - 物件導向及其他高等技術 圖書館:Standard Libraries 希望我至少可以寫到中階(茶)。

[短談] [預告] 關於最近的進度(NULL)、未來的規劃(願景)

  早安,雖然時間不早了。關於最近幾乎(根本)是 0 的進度,我不太想多說什麼,就只是我快被功課海洋淹沒而已(笑)。雖說作業很多,但都很簡單,只是要花的時間很多而已;不過,我也不是只有在寫作業,一樣還是有在學一些新東西,比如我待會會提到的未來規劃、還有寫了一個新遊戲的...10% 而已吧 (笑) 。近況就談到這,接下來是這個 Blog 的規劃。 新的系列即將誕生??   是的,不過畢竟是願景,也就是說我可以隨便說說而不去實行也是可以的,高雄發大財。   新系列是以 Lua 語言為主,因為之前想用 Corona SDK 寫遊戲,但發現在不熟 Lua 的情況下,是很難有系統地設計出一款好遊戲的,所以我只好先學習 Lua 本身,而且我是看著原文書學的,所以想說透過寫筆記兼翻譯來增加印象。因此,新系列會是我學 Lua 時的筆記類文章,且編排與順序上也會參考這本書: Second edition of Programming in Lua ,同時這也是我學 Lua 時看的書。 就這樣吧,如果我沒有隨便說說的話應該暑假就會見面了XD

[Python] [網路爬蟲] 用 selenium 不用登入就能爬過 Facebook

圖片
因為某些原因決定來寫個爬蟲,可以計算 FB 某則貼文中某個關鍵字的數量,然後是可以在不登入的情況下使用的。這篇文章記錄了一些要處理、注意的東西,那麼我們就開始吧! 4/2 補 :因為 FB 網頁的原始碼有改動,所以程式碼有作更新,但內文還是舊的,因為重要的步驟都沒變,所以只更新文章底部放的程式碼。 使用 Selenium (搭配 Firefox driver )   首先來個 10 秒入門 Selenium: from selenium import webdriver driver = webdriver.Firefox(executable_path=r'<存放 Firefox driver 的路徑>') # 建立 driver 物件 driver.get(r'<你想爬的網頁>') # 連線至指定的網頁 driver.quit() # 關閉網頁並退出 driver   好的,這個範例應該挺淺顯易懂的,那我們要繼續下去了。 開始爬取 FB 貼文   當你在沒有登入的情況下開啟了一個 FB 貼文,過一小段時間會跳出這樣的畫面:   它擋住了我們要爬的文章!一定要想個辦法除掉 它。   ( 1/21 補 :現在的 FB 好像不會跳出這個大框框了,如果確定沒有的話,就可以跳過下一步) 尋找與等待:By、WebDriverWait   雖然我們迫不及待地想要按下那個「稍後再說」的按鈕,但這個大方塊並不是一開始就存在的,而是過了一段時間才會跳出來,那麼到底是多久呢?  不知道。   那我們要怎麼知道它已經出現了?幸好 selenium 有提供 WebDriverWait 物件,可以使用他來檢查某個條件是否已經達成,我們先看看程式碼: from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_condi...

[C++] RTTI(執行時期型態資訊)的 Demangling

圖片
挽救回不來的進度(?)  這些日子懶到只有發幾篇歌詞翻譯,連一點點的技術性文章都沒有產出,為了確認我還活著而且沒有轉職(??),想說發一篇不久前看到 C++ 裡一個好用的函式。 RTTI,執行期型態資訊   這個應該很多人都已經知道了,只要引入 <typeinfo> 標頭檔,再使用 typeid 運算子就可以得知目前某個變數的型態資訊,在多型與動態型別方面很有用。      而其中,有個 name() 成員函式可以取得型態的名稱,用法如下: #include <typeinfo> // 略... int i; cout << typeid(i).name() << endl; // 輸出: i   如果你是使用 gcc 的話就會看到輸出為單個字母:i,這不難理解,就是 int 嘛,但是這樣呢? char *c = new char; // 字元指標 int foo(float a); // 接受一個 float 並回傳 int 的函式 string s; // 字串 cout << typeid(c).name() << endl; cout << typeid(foo).name() << endl; cout << typeid(s).name() << endl; // 輸出: // Pc // FifE // NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE   第一個就是指向 char 的 Pointer 嘛,那接下來...「FifE」? 我是知道 Five 啦;「NSt7...... EEE」 ......??   我彷彿看到了許多黑人問號。   會出現這麼奇怪的名字是因為 C++ 有一個叫做 Name Mangling 的機制,簡單說就是把型態名加入一些特色並改寫成一個不會與其它名字重複的技術,但是經過 mangle 的名字對我們人類來說實在不好理解啊!所以我們要介紹一個很好用的函式:abi::__cxa_demangle() Dema...

[歌詞翻譯] 天宿り - After the Rain

我又拖稿惹,這篇早在6月中就翻好了但一直忘記要發,就變成這樣了XD 這次試著翻了一直以來都很喜歡的歌- 天宿り ,在聽專輯的 XFD 時就很想聽整首的了,後來無意間找到了這首的音檔,於是我跟這首歌才能相遇(?),而這篇翻譯也才能誕生(??) 天 あま 宿 やど り 作詞・作曲:まふまふ 歌:そらる 強 つよ がってばかりで   意地張 いじは ってばかりで 總是在逞強  總是一意孤行 背 せ は 小 ちい さいままで   夕焼 ゆうや け 空 ぞら    暮 く れていく 背影仍然渺小  晚霞中的夕日  逐漸西下 臆病 おくびょう なままだな   泣 な き 虫 むし なままだな 依舊懦弱  依舊是愛哭鬼 あぜ 道 みち でふざけた  あの 頃 ころ から 変 か わらない 鄉間小路的笑鬧  從那刻起就不曾改變 いけないこととわかっている 不被允許的事我一直都知曉 許 ゆる されないとわかっている 不被原諒的事我也一直都明白 それでも 今日 きょう は 雨 あめ が 降 ふ るから 縱然那樣  在今日這下著雨的日子 雨宿 あまやど りをしていこう 一起去避雨吧 ああ 啊啊 借 か り 物 もの としても 即使身為借來之物 今 いま はただ 貴方 あなた が 愛 いと しくて 此刻還是只愛著你啊 知 し りたいこと 以外 いがい    知 し らないから 想知道的事物以外  什麼都不知道 このままでいよう 就這樣吧 人気 ひとけ のない 小道 こみち を   言葉 ことば も 無 な く 歩 ある いた 杳無人跡的小徑  默不作聲地走過 信 しん じ 合 あ えたあの 頃 ころ のように 就如同還能互相信任的那些時日 数 かぞ えるほどの 幸 しあわ せに   誇 ...