又LAG隨性筆記
  • 關於我
  • 作品集
  • 生活隨筆
  • 與我聯絡
  • 隨手扎

隨手扎

January 15, 2020

【心得筆記】設計模式:可覆用物件導向軟體基礎

1月9號把一本經典的書籍給看完了,這麼說其實也不太對,因為我幾乎略過所有程式相關的部份,至於原因待會會提到。個人並不是非常推薦這本書– 設計模式:可覆用物件導向軟體基礎 ,就連已經看過「深入淺出設計模式」的我,都認為其中有些描述有點難懂。不過,設計模式本就有其應用的環境(context),如過無法沈浸在其環境,就難裡理解為什麼使用這個模式。比較不好的是,有人反而為了使用模式,而用模式,沒有考慮到其環境是否適合。這本書我認為的價值,是可以釐清模式的價值,與一些被人捧上天的錯誤想法。

推薦指數:★★☆☆☆
(應該可以多給半顆拉!反正都是我的主觀判斷www)

January 5, 2020

表示無限大。運算與比較(Python)

前言

在做LeetCode題目。然後因為我思考邏輯的關係,會需要使用到無限大(Inf)的概念,所以首先自幹的一個:

class Inf(numbers.Number):
    def __gt__(self, n: numbers.Number):
        return True
    def __eq__(self, n: numbers.Number):
        if isinstance(n, Inf): return True
        else: return False

遺憾的是,這雖然可以處理Inf() > int(1),卻無法處理int(1) > Inf()的問題。無法輕易直接修改內置類型int,要是在多包一層感覺有些彆扭。所以找找看Python有沒有像EMCAScript內有Infinity的東西。可是…我第一個看的卻是日文內容。

image.png

Google中文第一個查到的也是簡體中文。要不就是Numpy的東西。

image.png

於是乎,這篇簡單的分享就出來了。

※ 最開始,我還有在numbers裡面找,無果。

January 2, 2020

【筆記】第一次打CTF就放棄(BambooFox CTF的快速紀錄筆記)

第一次打CTF就放棄

(BambooFox CTF的快速紀錄筆記)

去年到今年,打了人生中第一個CTF。(其實也就2019/12/31~2020/01/01)

打完感想:「想打?我還早一百年😭」

還好有大神朋友Carry討論,要不然我都想打電腦了(物理)

有人可以一起討論的感覺真的很好~

※ 本篇主要修改自我分享給朋友的筆記。內容不涉及朋友補充的Reverse題形。主要原因還是因為我是想重新整理一下感覺,如果有興趣…可以去找找看我分享在那。

BambooFox CTF 在2019/12/31 18:00 ~ 2020/1/1 18:00期間舉辦,共計24小時。包含以下題形(中文參考字這篇文章):

  • General
    送分
  • Web
    網頁
  • Crypto
    加解密
  • Reverse
    逆向工程
  • Pwn
    弱點或漏洞分析
  • OnlineJudge
    題目
  • Misc
    綜合
December 31, 2019

什麼是IIFE(Immediately Invoked Function Expression)

前言

這原本我是在Facebok一篇貼文的回應,因為覺得還蠻清楚的,所以修改過來這裡紀錄一下。(當然也可能我有理解錯誤就是)

什麼是IIFE

根據MDN是這樣寫的:

It is a “design pattern” which is also known as a Self-Executing Anonymous Function
(他又稱為 Self-Executing Anonymous Function,也是一種常見的"設計模式”)

注意 設計模式(design pattern)
這不是特指某一種技術、特性。而是思想、設計。竟然是想法,實現有差異、認知有差異可以理解的。

所以按照中文定義( 定義完馬上就執行 ),淺層廣義的來看:

function f(){};
f();

確實也是定義後執行

撰寫風格上OK,只是益處不大。

(f = function(){})() // execute first
f() // execute second

也是一樣。(這再js是合法的,之後還可以在執行f()) 但就語法上就更精簡許多


從狹義、技術來看,是看是不是有附值(函式命名也是),然後才執行。 如此剛題的兩個,都是命名後才執行,狹義不算是IIFE 不過這終究只是一種設計模式,實現方式沒有一定。

function f(){};
f();

如果上面的形式,編譯器可以做優化,而直接忽略f,那他也可能是狹義的定義。

(另外這裡廣義、狹義只是我片面的解讀)

此外,在維基百科這麼寫到:

“立即呼叫函式表達式” 最早稱為「自執行(匿名)函式」 但是立即執行的函式不一定是匿名的。 ECMAScript 5的 strict mode 禁止arguments.callee 因此,這個術語不夠準確。

這或許也側面證明我的想法。

December 31, 2019

關於Python Lambda那些可能不知道的三兩事

lambda本質和function無異

def f():
    pass

type(lambda : None) # => <type 'function'>
type(f) # => <type 'function'>
lambda :None # => <function <lambda> at 0x7ffa6d343650>
f # => <function f at 0x7ffa6d349dd0>

lambda和function的型態都是function,並沒有區分開來。

一個是語句、一個是表達式

差別在於def是關鍵字形成的語句(statement),lambda是表達式(expression)。他們差別在於,能出現在程式碼的不同位置。

※ Note: 表達是(expression)也是一種語句(statement)。為了簡單來看,接下來都會區分開來。

內建有多個函式可以接受函式參數

因為lambda和function本質差無異,所以不會有函式只可以接受lambda,不可以接受function。

filter(lambda parameter: expression, iterable)
filter(function, iterable) # more correct

比起使用lambda描述filter,用function更正確。reduce等也是這樣。

lambda多行的寫法

通常看到lambda都只有一行,正常情況下也都是這樣。不過先來看看文件怎麼描述lambda的語法:

lambda_expr        ::=  "lambda" [parameter_list] ":" expression
lambda_expr_nocond ::=  "lambda" [parameter_list] ":" expression_nocond

相當於:

def <lambda>(parameters):
    return expression
December 31, 2019

【微更】你可能沒看過得Python - Callable(續)

【微更】Callable的實現

之前我實現了Callable Class,當時對於CallableWrapper的實現如下:

class CallableWrapper:
    def __init__(self, wrap):
        self.wrap = wrap
    def __call__(self, f=None, *args):
        if f == None:
            return self.wrap
        return CallableWrapper(f(self.wrap, *args))

這個實現有一些缺憾,CallableWrapper的__call__回傳值,也是CallableWrapper。而CallableWrapper本身預期被呼叫,這導致結果不能直接使用,需要多給一次空呼叫(result())。舉例來說:

arr = CallableWrapper([1,2,3,4,5,6,])
arr # => <__main__.CallableWrapper object at 0x7f2102f00668>
# arr(sum) + 10 # You can't do this, because CallableWrapper can't add integer
arr(sum)() + 10

上例中,並不能直接寫arr(sum) + 10,要寫arr(sum)() + 10。這感覺有點脫褲子放屁阿…

基於此想法,我改寫成:

  • ««
  • «
  • 1
  • 2
  • 3
  •  … 
  • 23
  • 24
  • 25
  •  … 
  • 34
  • »
  • »»
© 又LAG隨性筆記 2025