分類:Programming

在 macOS 中安装 PyGTK 之 2016 版

如果你有機會在看到落落長的官網 Building GTK-OSX 或是 2015 版的 在Mac OS X中安装PyGTK 之前看到我這篇,那只需要簡短的

brew install gtk-mac-integration
python /usr/local/lib/pygtk/2.0/pygtk-demo.py

收工 -_-

廣告
鏈結

The Development of Chez Scheme

前情提要:Chez Scheme 的传说
http://blog.sina.com.cn/s/blog_5d90e82f0101jscn.html

Version 1
1. 做 PhD 研究的時候用 Scheme 寫模擬,當時用的 Scheme 實作都太慢了,就自己寫一個。
2. 變更常見設計,Create closure 時間與已有的數量成正比,access closure 時間是常數,原來是反過來的。
3. 做一做發現做這個比較有意思,又可以給更多人用,研究就轉向了。
4. 看到 ML 的 interactive, incremental compiler 覺得很帥,但是這需要自己寫 assembler和 linker,就下去做了,開始的時候覺得是巨大的挑戰,最後的結果是簡單明瞭。
5. 第一個版本是 BSD on VAX
6. 現在上課會告訴學生「最佳化」和「不笨」是有差的,第一個版本在高階設計用的技法只是不笨。大部份做的是低階部分的最佳化。成果是比別人快別人穩,附加 type & boundary check。

Version 3
7. 移植到 MC88800 的時候, 硬體 / OS / Compiler 全都還在開發中,非常困難,碰到一個硬體的 bug,造成子程序返回的時候不是返回父程序,是返回父程序的父程序。
8. 用 C 寫的部分都改成用 Scheme 寫了,結果跑得更快。

9. “Many programmers still use Chez Scheme with emacs, and true power users like me use it with vi"

Version 4~7 的部分我就跳過不寫了,主要再講加了哪些高階最佳化和語言功能的發展。

Quote of the Day

 

Are there still people that have code in their source repository that doesn’t compile? That’s probably the most strictly enforced rule around here.

Jasper Bekkers on November 1, 2007 02:42 AM

I have loads of code in my source repository that doesn’t compile- comes with the territory if you’re using scripting languages most of the time.

Ben Moxon on November 1, 2007 02:45 AM

 

via comments in The F5 Key Is Not a Build Process 

Nearly All Binary Searches and Mergesorts are Broken

每個 Programmer 都寫過既常用又簡單的 Binary Search,真的簡單嗎? From Google Research Blog

1946 年,第一個 Binary Search 演算法
1962 年,第一個 “正確" 的 Binary Search 演算法,最前面十八個都錯了.
1986 年,Jon Bentley 在課堂上和 Programming Pearls 這本書中,說明了這麼簡單的演算法(1962版)可以犯下多少的 bug.
2006 年,書中那個大眾引用的程式被抓到 integer overflow bug.

Tim Bray: (推這篇)

“If we can’t get binary search right, what chance do we have with real software?"

Minimizing Memory Usage for Creating Application Subprocesses

Minimizing Memory Usage for Creating Application Subprocesses 講解為甚麼要用 posix_spawn() 取代  fork() + exec() 跑外部程式,牽涉兩個問題。

第一個是 VM out of memory,舉例來說,一個 6G 的 process 要跑 /bin/ls,fork() 時也要用到 6G VM,由於 Solaris 不像 Linux 會 memory over comit,swap 開的不夠大就會 out of memory。

第二個是效能問題, fork() 要 copy 一堆資料結構,這點 BSD 用 vfork() 解決,vfork() 不會 copy 那堆資料結構。然而在 multi-thread 時,vfork() 又會造成 parent 和 child 間 dead lock,詳情參照原文。

posix_spawn() 避免了 fork() 要另外佔用 VM 的問題,另外有個好處,就是傳統上發生在 fork() 和 exec() 間一些動作,posix_spawn() 可以做精細的設定,像是 change user and group ID, signal mask, scheduling class, file descripter, shell redirect, etc.

後面提到 Linux  memory over commit 的優缺點,主要的缺點是發生 out of memory 的時機不確定(因為你跟系統要多少,系統都跟你說有,根本無法檢查),等到 VM 真的用完 OOM killer  會隨機挑/試著選 一個 process 砍掉,這在企業系統上是不允許的。

Technorati Tags: