前言

Pyinstaller 是很多人打包 Python 程式執行檔的第一選擇,但單純使用 Pyinstaller 打包的執行檔很容易被反編譯,如果要保護辛苦寫的程式碼不被輕易看光,可以搭配 Cython 將程式預先編譯成二進制檔案 (pyd),如此一來反編譯的難度會提升不少。

程式調整

  1. 由於 Pyinstaller 必須要指定一個 py 檔開始打包,這表示主程式會是明碼的,這時候可以再多建一個入口程式,由入口程式去 import 並執行主程式
  2. Pyinstaller 會自動解析 py 程式 import 的套並打包,但無法解析 pyd 檔,所以可以直接在入口程式 import 所有被使用到的套件,包括各程式彼此間的 import

下面舉個簡單的例子:

閱讀全文 »

maze

Eller’s Algorithm 算法介紹

Eller’s Algorithm 是一種神奇動態迷宮生成算法,可以在線性時間內逐行生成迷宮,用我自己的理解來說,算法的精神就是:

每個格子一開始都是被分隔開的「區域」,隨機打通格子間的牆壁使區域間可以相通。

閱讀全文 »

前言

MRT event

台北捷運最近推出了一個很瘋狂的集章全制霸活動,集滿5條捷運路線(不含環狀線),總共109個車站,就可以抽大獎,到底有誰會閒閒沒事想參加這個活動? 啊,我女朋友剛剛問我要不要參加,沒事沒事,真是個好活動! 問題來了,該如何用最短的時間集齊所有車站並回到出發地呢?

本文將使用 Held Karp 算法來計算從台北車站出發,遍歷 109 個車站,並在最後回到台北車站所需花費的最短時間與路徑,不想看過程的人也可以直接到最後面看結果。XD

閱讀全文 »

Java Stream

Java Stream

Stream 是一個元素形成的隊列,其來源 (Source) 可以是集合或數組,Stream 本身並不會存儲元素,其操作也不會影響到原始來源,單純以數據流的方式來處理數據,依性質可以分為兩類:

  • 中間操作 (Intermediate Operations)
    Stream 的中間步驟,一個 Stream 可以有多個中間操作,會返回一個新的 stream,屬於惰性求值 (Lazy Evaluation),意思是不會馬上計算結果,而是等到終端操作時才一併計算。
  • 終端操作 (Terminal Operations)
    Stream 的最後一步,一個 stream 只能有一個終端操作,會產生一個新的集合或值。
閱讀全文 »

Java 自學筆記 07 - Concurrent Queue 中我們使用 concurrent queue 來實作 Producer Consumer Problem,將生產者產出的 task 丟給 queue,消費者一有空閒就會去 queue 中拿新的 task 出來,實際上這就是 Thread Pool 的概念,不過過程中我們是自己去創建與管理 thread 和 queue,而 Java 其實提供了許多跟 Thread Pool 有關的介面,讓我們能夠更簡單的實現這些功能。

ExecutorService

Executor Service

閱讀全文 »
0%