Year: 2017

  • 全面竄改 git commit 歷史記錄

    全面竄改 git commit 歷史記錄

    最近遇到一個問題:「GitHub 上的 commit 記錄可以證明一定是某人 commit 的嗎?」。 這個問題的答案是:「NO」。 git commit 不似區塊鏈有能力做出無法偽造的記錄,透過不同的方式,我們可以全面的竄改 git commit 的歷史記錄,不論是作者、上傳者或是時間都有辦法可以修改,以下將一一介紹如何操作。 0. 前置作業 首先先在本機建立一個空的 git repo,接著隨意寫入空的檔案: $ mkdir git-test $ cd git-test $ git init $ touch README.md $ git add README.md 1. 基本 Git 設定 – 設定識別資料 根據 git 官方的資料,第一次使用 Git 必須要設定識別資料,而且識別資料會影響到提交的結果:「每次Git提交會使用這些資訊,而且提交後不能再被修改」 $ git config –global user.name “John Doe” $ git config…

  • 深入 GIL: 如何寫出快速且 thread-safe 的 Python – Grok the GIL: How to write fast and thread-safe Python

    深入 GIL: 如何寫出快速且 thread-safe 的 Python – Grok the GIL: How to write fast and thread-safe Python

    本文將會探討 Python 內部的 Global Interpreter Lock,以及學習其如何影響 multi-threaded 程式。  原作者:A. Jesse,Twitter: @jessejiryudavis 原文:Grok the GIL: How to write fast and thread-safe Python Louie Lu 經作者同意[1][2]翻譯為正體中文。 當我6歲時,我有一個音樂盒。我將他上緊發條,在上面的芭蕾舞者開始繞圈,而盒子內的機關開始敲打,發出「一閃一閃亮晶晶」的聲音。雖然這東西肯定很廉價,不過我喜歡這個音樂盒,而我想要知道他是怎麼運作的。總之,我打開了這個音樂盒,看到了裏面的裝置 ── 一個我拇指大小的金屬圓筒,安裝得當的讓他可以旋轉,透過凸起的牙齒與鋼梳撞擊後發出音符。 在程式設計師的特點中,關於事情如何運作的好奇心是必不可缺的。當我打開我的音樂盒觀看內部時,我展現我可能是一個 ── 如果不是一個頂尖程式設計師 ── 起碼也會是好奇的一個。 這很奇怪,我在對 Global Interpreter Lock (GIL) 誤解的情況下寫了 Python 程式這麼久,因為我還沒有足夠的好奇心來了解他是如何運作的。我遇到很多人跟我有著同樣的猶豫,以及無知。 該是時候把這個黑盒子翹開了。讓我們閱讀 CPython 原始碼來了解什麼是 GIL,為什麼 Python 會有,以及他是如何影響我們撰寫 multi-threaded 程式。我會給出一些範例來讓你了解 GIL。你會學到如何快速寫出 thread-safe 的 Python,以及如何在 threads 與 processes 之間選擇。…

  • 我對 PyCon US 2017 感興趣的 18 個 Talks

    我對 PyCon US 2017 感興趣的 18 個 Talks

    PyCon US 2017 即將在美國奧瑞岡開始,快速瀏覽了一下 talk list,真不愧是 PyCon US,每個題目都看起來非常的高大上而且紮實。以下是我挑選 18 個我有興趣的主題,記錄下來。 完整的 talk list 可以參考這邊: PyCon US 2017 Talks Schedule: https://us.pycon.org/2017/schedule/talks/ PyCon US 2017 Talks List: https://us.pycon.org/2017/schedule/talks/list/ 排列順序依照 Talks List 由上而下排列,順序不代表我對於主題的興趣多寡: aiosmtpd – A better asyncio based SMTP server Barry Warsaw Sunday 2:30 p.m.–3 p.m. in Oregon Ballroom 203–204 講關於 async 版本的 smtpd 實作。總之因為還沒有搞清楚 3.5 引入的 async / await,因此對於有關…

  • 開發人員的面試指南 – A developer’s guide to interviewing

    開發人員的面試指南 – A developer’s guide to interviewing

    另一個標題:如何面試一家公司。 原作者:Dave Smith,Twitter: @djsmith42 原文:A developer’s guide to interviewing Louie Lu 經作者同意翻譯為正體中文。 譯註:本文描述為美國之情況,不一定能直接套用於台灣環境。 你有沒有過,當你在面試的時候,面試官坐在桌子對面,雙眼注視著問你:「你還有其他問題嗎?」,而你回眼回去並說:「umm, 大概沒有了」。如果這曾經發生在你身上,你有很大的機率得到了一個單一面向的面試經驗。 作為一個應試者,可以想見你把目標放在一件事情上:取得工作職缺。但是別忘記,面試並不是一個單向的工作。如同面試官在面試你,你也必須要面試公司。 不過,你需要問他們什麼呢? 許多在尋找工作的開發者都問過我這個問題。在過去的 15 年內,我曾在 7 間公司工作 (包含兩個實習以及一個六個月的新創公司),並且面試過無數次。我最後決定寫下我在這些面試中問的問題,好幫助其他面試者,並且期望對他們會有所幫助。 我的目標是將這些資訊記錄下來。如果你有任何的建議,請透過 Twitter 讓我知道,我會將資訊列入,讓大家都能受惠。 你跟誰談話? 當你在面試的時候,通常會遇到下面三種不同的人。根據公司的規模,這有可能是一個人或多位人選: 軟體工程師 大頭 / 管理階層 (technical lead, middle manager, director) 公司領導階層 (VP, CTO, CEO, department manager) 下面的列表中,針對不同的人,我有不同的問題詢問他們。注意到,有些問題我會在不同人之間重複詢問,然後比較他們之間是如何回答。 這是一篇很長的文章。 比較像是一份 reference,而不是一篇拿來閱讀的文章。如果我今天正在面試,我會將這份指南帶在身上,然後 (謹慎的) 在面試中使用裡面的提問。 大部分的問題沒有所謂「對」或是「錯」的答案。它們被設計來讓你更了解整個公司的文化、流程以及組織架構。它們也能拿來當作一個對話的開頭,這在你的大腦因為面試而呆滯的時候會有些幫助。 基於禮貌,我通常會在面試開始時跟面試官說,希望留下時間來問問題。這能幫助面試官規劃如何面試。通常他們會把提問的時間放在面試的結尾,要對面試官的流程有認知,並且讓他們在早期就知道你的意向。每個問題結束後,詢問他們是否可以繼續詢問問題,以及還有多少面試時間。 針對軟體工程師的問題: 你如何知道你每天要做什麼? 這個問題的目的是要了解有無工作流程上的障礙 (dysfunction)。我會希望從…

  • The Fact: 國際標準化組織 ISO 的英文全稱

    The Fact: 國際標準化組織簡稱為「ISO」,但是全稱是「International Organization for Standardization」 Why: 參見 ISO About us: it’s all in the name: It’s all in the name Because ‘International Organization for Standardization’ would have different acronyms in different languages (IOS in English, OIN in French for Organisation internationale de normalisation), our founders decided to give it the short form ISO. ISO is…

  • Python Libs – Why “profile” can’t be context manager?

    Python Libs – Why “profile” can’t be context manager?

    Why Python standard library “profile” can’t be context manager like this import profile with profile.Profile(): fib(10)   Zero, what is “profile” module in Python? According to Python 3 Documentation: profile, a pure Python module whose interface is imitated by cProfile, but which adds significant overhead to profiled programs. If you’re trying to extend the profiler…

  • 閱讀英文

    閱讀英文

    從我有記憶以來,第一次英文閱讀有顯著增強的原因,是因為高一的時候要閱讀 documentation 跟外國論壇。那時候找資料下意識都會尋找中文資料而避開英文資源。有天想想,這樣不是辦法,很多資源都是英文的,就這樣強迫自己找資料要找英文的,搭配 Google translate 在旁邊一段一段翻譯。我記得很清楚,過一個禮拜之後,我就可以很順暢而不會排斥去找英文資料了。 第二次是因為玩遊戲。在電腦上玩了一系列共兩款的 PS2 英文 RPG 遊戲 (ArTonelico)。完成後閱讀能力再次增長。至少,閱讀 documentation 已經不是問題。 第三次,也就是現在,應該是在一口氣閱讀3年份的 python-committers mailing list 之後。對於大量閱讀人話開始熟悉。也能夠比較沒有負擔的看一整串的 mailing list 了。

  • 台灣公私立大專院校宿舍門禁/宵禁地圖與統計

    台灣公私立大專院校宿舍門禁/宵禁地圖與統計

    總表整理了全台灣公私立大專院校對於宿舍門禁 / 宵禁的狀況。包含宵禁時間,是否有女宿特別條款,以及資料來源 (宿舍網站,學校學務處法規等)。 宿舍門禁/宵禁統計總表網址:https://goo.gl/TIVgNc 地圖則整理成地圖方式,方便觀察是否有南北不平均,不同調的情況。從地圖可以發現中南部的宵禁學校遠多於北部。可能因為他們比較落後吧。 宿舍宵禁地圖:https://goo.gl/09wJ5T

  • Python 底層運作 02 – PyTokenizer_Get 分析

    當 Python 在讀入程式碼的時候, 第一步就是對程式碼 lexing,將程式碼拆解成 token,標記出每個元素的分類為何。 以下面的程式碼為例: bar = 12345 我們透過 tokenize module 來分析,會變成: $ ./python -m tokenize tests.py 0,0-0,0: ENCODING ‘utf-8’ 1,0-1,3: NAME ‘foo’ 1,4-1,5: OP ‘=’ 1,6-1,11: NUMBER ‘12345’ 1,11-1,12: NEWLINE ‘\n’ 2,0-2,1: NL ‘\n’ 3,0-3,1: NL ‘\n’ 4,0-4,0: ENDMARKER ” 我們可以看到 foo 被標記為 NAME,= 標記為 OP (operator),12345 則被標記為 NUMBER。 在 CPython 中,負責將程式碼標記成 token 的程式碼是 PyTokenizer_Get ,位於 Parser/tokenizer.c。PyTokenizer_Get…

  • Python 底層運作 01 – 虛擬機器與 Byte Code

    Python 底層運作 01 – 虛擬機器與 Byte Code

    你可曾想過這段 Python 程式碼是如何運作的? >>> a = 5 >>> b = 10 >>> c = a * b >>> c 50 Python 作為 interpreted language,其運作可以分為兩個大項,Compiler 以及 Virtual Machine。Compiler 負責將輸入的語法做分析,轉換成 AST (Abstract Syntax Tree),再轉換成 CFG,最後依照 CFG 輸出 bytecode,Code Object 等必要的物件。Virtual Machine 則根據 bytecode 來運行,最後輸出程式運行的結果。 我們可以透過 Python 的 dis 模組,來得知程式碼的 Byte Code 是什麼: ➜ cpython git:(master) ✗ cat tests.py a…