維護筆記

我打算離開 Wordpress

自從我開始用 GitBookWbridge5 叫牌書,我就開始考慮要離開 Wordpress。從本站的冷清就可以知道,我不太需要留言功能。而且我另有留言版。結構化、類似書籍的內容,應該要交給 GitBook。剩下的只有部落格,應該交給 Jekyll

最近又發生 Wordpress 4.7 的安全性漏洞,讓我慎重考慮 CMS 的安全性。此外,我也不喜歡 Wordpress 的 2017 佈景主題。我已經開始把 2016 佈景主題移植到 Jekyll 上。

學生計算機年會的介紹下,我跳槽到 Gandi。除了價格便宜外,居然還附贈信箱!

╰(⊙-⊙)╮佛心公司╭(⊙-⊙)╯

我用 Let’s Encrypt 獲取已認證的 TLS 證書,因此也以 301 重定向HSTS 強制全站必須加密連線以確保用戶安全。

因為 SHA-1 被 Marc Stevens 破解了,所以本站提早更新 TLS 金鑰。

我在 GoDaddy 用 415 元敗了 jdh8.org 了,所以網址就移過來噢!

因應 Heartbleed 臭蟲,本站提早更新 TLS 金鑰。

TWBBS.orgDNS 伺服器異常,導致本站域名無法解析。因此我決定把本站又重定向回 jdh8.no-ip.org 以求穩定。

此外,本站的 oEmbed 服務乏人問津。為了保持整潔,很遺憾地我決定停止服務。

給所有不翻牆的朋友

轉貼本文,作為對中國以防火長城封鎖 VPN 的抗議。

作者/佚名

当 Youtube 被封的时候,我淡定,因为我们有优酷,而且 Youtube 的英文视频我也看不懂;当 Facebook 被封的时候,我淡定,因为我们有人人,而且我也没有多少国外朋友;当 Google 被封的时候,我淡定,因为我们有百度,而且百度更懂中文;当 Twitter 被封的时候,我淡定,因为我们有微博,而且 Twitter 远没有微博功能强大;当 Wordpress 被封的时候,我淡定,因为我们有博客,而且 Wordpress 的各种插件我不用也罢。

当 Dropbox 被封的时候,我有点不淡定了,因为国内同类服务做的像坨屎;当 Gmail 被封的时候,我有点不淡定了,因为 Gmail 几乎没有垃圾广告;当 Google Docs 被封的时候,我有点不淡定了,因为国内没有在线协作平台;当 Google Reader 被封的时候,我有点不淡定了,因为国内 RSS 订阅整合和分享功能远没有 Reader 优秀;当 Picasa 被封的时候,我有点不淡定了,因为国内没有在线相册。

这时候,我突然想起来 Youtube 有即时翻译功能,而且里面每天都会产生大量优秀视频;这时候,我突然想起来 Facebook 有各种有趣应用,甚至可以整合到 Outlook 里面;这时候,我突然想起来 Google 有 scholar search,还有各种个性化的服务;这时候,我突然想起来 Twiiter 各种神奇,甚至可以用来估算龙卷风带来的损失;这时候,我突然想起来 Wordpress 可以做简易的网站,可以很轻松的定制个性化服务。于是,我想到墙外看看,却发现——我得不到他们,我自由获取信息的权利被默默的剥夺了。

更加恐怖的是:全世界都用 Twitter,只有我们用微博。我们和他们生活在不同的维度,我们使用的永远是劣质的山寨品,甚至还要承担比正品更高的价格。当我们断绝了与外界的联系,当我们只能获得经过别人筛选过的信息,无知者无畏将是我们唯一的宿命。比起在各种“异端邪说”中艰难寻找真理,对无知的恐惧更让我胆战心惊。

给所有不翻墙的朋友:

你可以说我在墙内得到的信息足够了,翻墙出去完全没有必要。但请记得,终究有一天,你想看看外面的世界,但却发现,由于当初的漠不关心,我们现在已经生活在信息的牢笼中,再也出不去了。

在 C++98 模擬 enum class

使用巢狀類別 (nested class) 可以達到類似的效果。因為我們不需要這些類別的實例 (instance),所以只需要宣告 (declaration),不需要定義 (definition)。

struct Color
{
	class Red;
	class Green;
	class Blue;
};

template<typename ColorType>
struct hex;

template<>
struct hex<Color::Red>
{ enum { value = 0xff0000 }; };

template<>
struct hex<Color::Green>
{ enum { value = 0x00ff00 }; };

template<>
struct hex<Color::Blue>
{ enum { value = 0x0000ff }; };

貼圖討論版開張

目前我提交的多已匯入 vichan 主線。請下載官方版以獲得其他人的本月貢獻。

在同學的慫恿下,我架了貼圖討論版源碼擺在 GitHub 讓全世界幫我備份,XD。

它有 HTTPS,但我是自簽憑證的窮光蛋,所以瀏覽器會跳警告。請先安裝 TLS 憑證

[同學……等等,你不是唸醫學系嗎?先承認你就是你同學!] [阿就真的偶同學咩!]

技術細節

它採用 vichan,是一款高效能的貼圖討論版程式。它的特點是在伺服器上產生靜態的網頁、資源,因此能應付高流量。

目前中文化已進入 beta 階段,也就是已完成,但還可能有些 bugs.

而為了好好利用 nginx 的 gzip_static 模組,我在 inc/functions.php 加了一段程式碼,讓它在寫檔的時候順便產生 .gz 檔。

此外,為了在行動裝置上有較好的表現,我在內建佈景中設定 viewport.

Tinyboard/vichan 的特點

Tinayboard 給閱聽人跑的程式只有 post.php 一支,給職員的只有 mod.php 一支,其他都是靜態資源。他們只在閱聽人貼文及職員修改設定時重建 (rebuild) 網站——重新產生靜態網頁。職員在修改設定時,可能因為網站未重建,新設定尚未生效。職員可於 GET /mod.php?/rebuild 的頁面中重建網站,讓閱聽人看見更新的資源。

位元處理大全

本文翻譯、改寫自 Sean Eron AndersonBit Twiddling Hacks 一文。為了方便直接把代碼貼到程式裡,我盡量把長的算式寫成函數,短的算式就只列出。

本文在計算運算量時,一個 C 運算子計作一次運算。中途指派 (intermediate assignments) 因為不須寫入 RAM,所以不計。當然,這樣的計量方法只是機器指令數與 CPU 時間的估計值。所有的指令都假設消耗相同時間,與實況不符,但近來 CPU 的確朝這個方向發展。有許多微擾也決定了系統執行程式會跑得多快,像是快取大小、記憶體頻寬指令集等。倒頭來,評測 (benchmarking) 才是判斷某方法是否比另一方法快的正途,所以請把以下的手法視為在你的目標架構上的評測單元。

基本運算

本章主要探討符號、大小相關的議題,並在分支很慢的硬體上尋找替代方案。

計算數的符號

(v > 0) - (v < 0)

雖然本文是位元處理大全,但這個對浮點數也能奏效。

判斷兩整數是否異號

(x ^ y) < 0

計算整數的絕對值,不用分支

為了簡潔,這裡採用 C++函數模板

template<typename T>
T abs(T v)
{
	T mask = v < 0;
	return (v + mask) ^ mask;

//	有專利的變體
//	return (v ^ mask) - mask;
}

有些 CPU 沒有計算整數絕對值的指令,或編譯器可能無法利用它。在分支較慢的機器上,以上的函數會跑得比 v < 0 ? -v : v 快。

找出兩整數中較小的或較大的,不用分支

#define min(x, y) (y ^ ((x ^ y) & -(x < y)))
#define max(x, y) (x ^ ((x ^ y) & -(x < y)))

快速骯髒版

如果你確定 xy 不會溢位,則你也可以採用以下的作法處理有號整數。為了簡潔,此處用 C++ 的寫法。對於有號整數,std::numeric_limits<T>::digits == sizeof(T) * CHAR_BIT - 1,其中 CHAR_BIT 定義在 limits.h 中。

#include <climits>
#define bitsof(T) (sizeof(T) * CHAR_BIT)

template<typename T>
T min(T x, T y)
{
	T z = x - y;
	return y + (z & (z >> std::numeric_limits<T>::digits));
}

template<typename T>
T max(T x, T y)
{
	T z = x - y;
	return x + (z & (z >> std::numeric_limits<T>::digits));
}

注意 C 並未規定負數右移的結果,所以這可能無法移植。

判斷整數是否為 2 的整數次方

如果你確定參數 v 非零,就可以用

v & (v - 1) == 0

注意當 v 是零,上述表達式仍為真。否則就得用

v && !(v & (v - 1))

符號擴展

對於 char, int 等內建類別,符號擴展是自動的。但假設你有一個有號二補數 x,只想耗費 b 位元儲存。甚者,假設你要把 x 轉成較大的 int。當 x 非負,只需要簡單的複製;但如果是負數,則負號需要擴展。例如若我們只用 4 位元儲存 −3,那麼 −3 在二進制中就是 1101。若我們有 8 位元,則 −3 在二進制中就是 11111101。在 4 位元表示中的最高位複製、填滿了目的地中多出來的、更高的 4 位。

固定寬度的符號擴展

在 C 中,固定寬度的符號擴展是平凡的,因為在 structunion 的定義當中可以指定位段 (bit field)。以下的程式把 5 位元的整數轉成 int

int x;  /* 只有最低 5 位有資料 */
int r;  /* 結果儲存在這裡 */
struct { signed int x: 5; } s;
r = s.x = x;

以下是 C++ 的模板函數,利用語言特性能以一次運算就把 b 位元的整數填滿類別 T

template<typename T, int b>
T signExtend(T x)
{
	struct { T x: b; } s;
	return s.x = x;
}

int result = signExtend<signed int, 5>(x);

變動寬度的符號擴展

有時候我們需要符號擴展,但事先不知道寬度;抑或我們用其他語言寫程式,沒有位段可用。

template<typename T>
T signExtend(T x, int b)
{
	T m = (T)1 << (b - 1);
	x &= ((T)1 << b) - 1;  // 若 x 的高位已為零可略過
	return (x ^ m) - m;
}

這需要四次運算,但當寬度是已知時,若高位已填零,則只需要二次運算。

還有另一個稍快,也不需要把高位填零,但不見得可移植的方法。

#include <climits>

template<typename T>
T signExtend(T x, int b)
{
	int m = sizeof(T) * CHAR_BIT - b;
	return (x << m) >> m;
}

移植性的問題在於 C 並未規定負數右移的結果,不過當代系統大多選擇實作算術移位。此外,若你對 limits.h 很不滿的話,可以試著寫 int m = -b,可能管用。

位元陣列

整數類別除了可以進行整數運算外,還可以當位元陣列使用。一個 n 位元的整數可以視為長度為 n 的位元陣列,其中的第 k 位就是陣列的 k 號單元。

雖然 C++ 中有 std::bitset 和 std::vector<bool>,但它們的實作仍仰賴整數。

依條件設定多個位元,不用分支

template<typename T>
T setBits(T word, T mask, bool flag)
{
	return flag ? word | mask : word & mask;
}

我們可以避免分支。但要特別注意一點,就是 flag 的類型必須是 bool,或者你要事先把所有真值轉成 1,因為我們利用了 -1 == ~0。

word ^ ((-flag ^ word) & mask)

而在超純量架構上,還有另一種算法。

(word & ~mask) | (-flag & mask)

依條件給出負值,不用分支

若你想在條件為真時拿到負值,這樣做可以避免分支。

(v ^ -fNegate) + fNegate

反之,若要在條件為假時拿到負值,就用這個。

(fDontNegate ^ (fDontNegate - 1)) * v

遮罩合併兩值

明顯的作法是

(a & ~mask) | (b & mask)

但是以下的作法可以節省一次運算。

a ^ ((a ^ b) & mask)

不過如果遮罩是常數,則兩者沒有差異。

漢明重量

漢明重量常簡稱為 popcount,是二進位整數中 1 的數量。

樸素方法

template<typename T>
int popcount(T v)
{
	int c;
	for (c = 0; v; v >>= 1)
		c += v & 1;
	return c;
}

這樸素方法每次迭代只走一位元,直到更高位的位元都為零為止。所以若輸入 1 << 31 則要迭代 32 次。

查表法

template<typename T>
int popcount(T v)
{
	static const unsigned char PopcountTable[256] =
	{
#		define B2(n) n,	 n+1,	 n+1,	 n+2
#		define B4(n) B2(n), B2(n+1), B2(n+1), B2(n+2)
#		define B6(n) B4(n), B4(n+1), B4(n+1), B4(n+2)
		B6(0), B6(1), B6(1), B6(2)
	};

	unsigned char *p = reinterpret_cast<unsigned char*>(&v);
	int c = 0;

	// sizeof 在編譯期已知,編譯器能展開迴圈。
	for (int k = 0; k < sizeof(T); ++k)
		c += PopcountTable[p[k]];

	return c;
}

Brian Kernighan 計算漢明重量的方法

template<typename T>
int popcount(T v)
{
	int c;
	for (c = 0; v; ++c)
		v &= v - 1;
	return c;
}

跟樸素法相比。此方法只為已設立(為一)的位元迭代。

以 64 位元指令計算 14 位元的漢明重量

int popcount14(unsigned int v)
{
	return (v * 0x200040008001ull & 0x111111111111111ull) % 0xf;
}

這要有 64 位元的 CPU 與快速的模除才會快,只要 3 次運算。如果要計算更多位元,可以利用位移與遮罩。

int popcount28(unsigned long v)
{
	return popcount14(v & 0x3fff) + popcount14(v >> 14);
}

int popcount42(unsigned long long v)
{
	return popcount28(v & 0xfffffff) + popcount14(v >> 28);
}

解說

popcount(v & 0x1111) == (v & 0x1111) % 0xf
popcount(v & 0x2222) == (v << 15 & 0x11110000ul) % 0xf
popcount(v & 0x4444) == (v << 30 & 0x111100000000ull) % 0xf
popcount(v & 0x888) == (v << 45 & 0x111000000000000ull) % 0xf

乍看之下好像可以求 15 位元,但別忘了除以 15 的餘數不可能是 15,所以 0x7fff 就杯具了。

平行計算漢明重量

對於 32, 64, 128 位元的整數類別 T,計算漢明重量的最佳作法如下。

#include <climits>

template<typename T>
int popcount(T v)
{
	v = v - ((v >> 1) & ~(T)0/3);
	v = (v & ~(T)0/5) + ((v >> 2) & ~(T)0/5);
	v = (v + (v >> 4)) & ~(T)0/17;
	return (T)(v * (~(T)0/255)) >> (sizeof(T) - 1) * CHAR_BIT;
}

此法需要 12 次運算,與 32 位元的查表法相同,但使用較少的記憶體並避免了快取失效

解說

我們利用除法在編譯期就製造好需要的遮罩。

~0
全滿
...1111111111111111 = 0x...ffff
~0/3
偶數位為一,奇數位為零。
...0101010101010101 = 0x...5555
~0/5
4k 與 4k + 1 位為一,其他為零。
...0011001100110011 = 0x...3333
~0/17
8k 至 8k + 3 位為一,其他為零。
...0000111100001111 = 0x...0f0f
~0/255
8k 位為一,其他為零。
...0000000100000001 = 0x...0101

有興趣的人可以證明 8n 位元的 ~0 是 255 的倍數。對了,255 = 3 · 5 · 17。

奇偶性

本章所要探討的,是計算位元陣列的奇偶函數值。

樸素方法

template<typename T>
bool parity(T v)
{
	bool p = false;
	while (v)
	{
		p = !p;
		v &= v - 1;
	}
	return p;
}

這跟上述 Brian Kernighan 計算漢明重量的方法非常類似,並耗費相當的時間。

查表法

#include <stdint.h>  /* C99 */

int parity8(uint8_t v)
{
	static const char ParityTable[256] =
	{
#		define P2(n) n, n^1, n^1, n
#		define P4(n) P2(n), P2(n^1), P2(n^1), P2(n)
#		define P6(n) P4(n), P4(n^1), P4(n^1), P4(n)
		P6(0), P6(1), P6(1), P6(0)
	};
	return ParityTable[v];
}

int parity16(uint_fast16_t v)
{
	return parity8(v ^ v >> 8);
}

int parity32(uint_fast32_t v)
{
	return parity16(v ^ v >> 16);
}

int parity64(uint_fast64_t v)
{
	return parity32(v ^ v >> 32);
}

利用 64 位元乘法與模除計算八位元組的奇偶性

((byte * 0x0101010101010101ull & 0x8040201008040201ull) % 0x1ff) & 1

這個方法只需要 4 次運算,但只對八位元組管用。

利用乘法計算奇偶性

template<typename T>
bool parity(T v)
{
	const T mask = ~(T)0/15;
	v ^= v >> 1;
	v ^= v >> 2;
	v = (v & mask) * mask;
	return (v >> sizeof(T) * CHAR_BIT - 4) & 1;
}

此法無論如何都運算 8 次。

平行計算奇偶性

(0x6996 >> ((byte ^ byte >> 4) & 0xf)) & 1

0x6996 以二進位表示為 0110 1001 1001 0110,是 4 位元的奇偶性表。

交換

沒錯,這章要談的就是大名鼎鼎的 swap。如果你有 C++ 可以用就別鬧了,快去用 std::swap

以 XOR 交換

a ^= b; b ^= a; a ^= b;

這個是不耗費額外空間進行交換的老哏了。注意 ab 不可指向同一變數,否則這個變數會變成 0。

一般來說,在現代的處理器架構上,多操作一個暫存器比這樣快多了。不過這個演算法擴展後有其他用途。

以 XOR 交換位元陣列的位元

以下的演算法可以交換連續的幾個位元。

template<typename T>
T swapBits(T v, int i, int j, int n)
{
	T x = ((v >> i) ^ (v >> j)) & ((T)1 << n) - 1;
	return v ^ ((x << i) | (x << j));
}

假設我們有 v = 001011112,要交換連續 n = 3 個位元,位於 i = 1 與 j = 5 的位置,則結果為 111000112

反轉

就是把高位跟低位對調。

樸素方法

template<typename T>
T reverse(T v)
{
	T r = v;
	int s = sizeof(v) * CHAR_BIT - 1;

	for (v >>= 1; v; v >>= 1)
	{
		r <<= 1;
		r |= v & 1;
		--s;
	}
	return r << s;
}

全文未完

給 nginx 和 php-fpm 的 AppArmor 設定檔

[English version]

AppArmor 是 Ubuntu 預設的 MAC 模組。不像傳統 Unix 的 DAC,AppArmor 設定檔列出什麼是行程存取的。處於強制模式 (enforced) 的行程只能存取已列舉的路徑。處於抱怨模式 (complaining) 的行程存取未列舉的路徑會發出警告。

然而 nginxphp-fpm 沒有預設的設定檔。為了避免網頁伺服器遭駭造成系統性感染,自己的設定檔自己寫!我們有 aa-genprof 這個有用的工具完成大部份的工作,但是它還是會遺漏一些路徑,特別是 sockets。因此我把我的設定檔放上來作為他山之石。

以下是 nginx 的設定檔。

#include <tunables/global>

/usr/sbin/nginx {
    #include <abstractions/apache2-common>
    #include <abstractions/base>
    #include <abstractions/nis>

    capability dac_override,
    capability net_bind_service,
    capability setgid,
    capability setuid,

    /etc/nginx/** r,
    /etc/ssl/openssl.cnf r,
    /proc/*/auxv r,
    /run/nginx.pid rw,
    /run/nginx.pid.oldbin w,
    /run/php5-fpm.sock rw,
    /srv/www/** r,
    /usr/sbin/nginx mr,
    /var/log/nginx/* w,
}

以下是 php-fpm 的設定檔。

#include <tunables/global>

/usr/sbin/php5-fpm {
    #include <abstractions/base>
    #include <abstractions/nameservice>
    #include <abstractions/php5>

    capability kill,
    capability setgid,
    capability setuid,

    /etc/php5/** r,
    /proc/*/auxv r,
    /proc/sys/kernel/ngroups_max r,
    /run/mysqld/mysqld.sock rw,
    /run/php5-fpm.pid rw,
    /run/php5-fpm.sock w,
    /srv/www/** r,
    /srv/www/html/wp-content/** rw,
    /srv/www/html/wp-content/cache/** rwk,
    /srv/www/magento/media/** rw,
    /srv/www/magento/var/** rwk,
    /tmp/ r,
    /tmp/** rwk,
    /usr/sbin/php5-fpm mrix,
    /var/log/php5-fpm.log* w,
}

北醫網路除錯

以下的數據雖然拿去統會顯著,但是我們並未精確控制變因。我無法分身,只能到處趕場,所以並非同時測得。即使同時測得,Wi-Fi 的效能也很容易隨熱點使用人數影響。

DNS 評測

評測失敗。在 2104 教室內 10.31.13.97 從 被封鎖至 12:00,在資訊處咖啡廳 10.1.1.73 從 被封鎖至 14:00。一個 move 手動輸入 IP 位址繼續活命。

UDP_IP

據網路管理系統記錄,您的電腦連續密集使用 UDP 連線多個不同 IP,疑似有 P2P 之行為。

解決方法:

請停止使用 P2P 之不當行為。

  1. 你™ 不知道 53/udp 是什麼埠嗎?
  2. 你™ 不覺得UDPP2PBitTorrent → 盜版滑坡嗎?

各位還是可以參考我在 civics.tmu.edu.tw 評測的結果結果讓我嚇了一大跳,不看可惜!

Ping flood

不間斷地 ping 本站 1000 下,觀察封包回傳的狀況。以下指令需要 root 權限,還需要我把本站防火牆的抗 DDoS 功能關掉。

ping -fc1000 jdh8.no-ip.org

公網

公民素養陶塑計畫,civics.tmu.edu.tw (203.71.84.36):

PING jdh8.no-ip.org (36.231.93.48) 56(84) bytes of data.
  
--- jdh8.no-ip.org ping statistics ---
1000 packets transmitted, 1000 received, 0% packet loss, time 19379ms
rtt min/avg/max/mdev = 17.216/19.986/40.303/1.618 ms, pipe 2, ipg/ewma 19.399/20.862 ms

不知為何總耗時特別長。

校內

資訊處咖啡廳,有線 10.1.1.100/24:

PING jdh8.no-ip.org (36.231.93.48) 56(84) bytes of data.
       
--- jdh8.no-ip.org ping statistics ---
1000 packets transmitted, 1000 received, 0% packet loss, time 13752ms
rtt min/avg/max/mdev = 17.635/27.883/85.722/5.378 ms, pipe 7, ipg/ewma 13.766/31.092 ms

資訊處咖啡廳,無線 10.31.12.26/22:

PING jdh8.no-ip.org (36.231.93.48) 56(84) bytes of data.
..........                       
--- jdh8.no-ip.org ping statistics ---
1000 packets transmitted, 990 received, 1% packet loss, time 14732ms
rtt min/avg/max/mdev = 17.607/47.166/328.994/40.608 ms, pipe 24, ipg/ewma 14.746/31.790 ms

2104 教室,有線 10.31.13.94/22

PING jdh8.no-ip.org (36.231.93.48) 56(84) bytes of data.
    
--- jdh8.no-ip.org ping statistics ---
1000 packets transmitted, 1000 received, 0% packet loss, time 15065ms
rtt min/avg/max/mdev = 16.889/18.219/52.221/2.457 ms, pipe 4, ipg/ewma 15.080/20.145 ms

2104 教室,無線 10.31.4.180/22

PING jdh8.no-ip.org (36.231.93.48) 56(84) bytes of data.
...............................................................................................................................                                 
--- jdh8.no-ip.org ping statistics ---
1000 packets transmitted, 878 received, 12% packet loss, time 15054ms
rtt min/avg/max/mdev = 17.557/131.652/737.979/138.960 ms, pipe 41, ipg/ewma 15.069/395.624 ms

自學中心,無線 10.0.11.243/24

PING jdh8.no-ip.org (36.231.93.48) 56(84) bytes of data.
.................................................................................................        
--- jdh8.no-ip.org ping statistics ---
1000 packets transmitted, 908 received, 9% packet loss, time 15126ms
rtt min/avg/max/mdev = 17.125/47.984/218.984/38.533 ms, pipe 13, ipg/ewma 15.141/24.578 ms

拇山學苑,無線 10.31.4.180/22

PING jdh8.no-ip.org (36.231.93.48) 56(84) bytes of data.
........................       
--- jdh8.no-ip.org ping statistics ---
1000 packets transmitted, 976 received, 2% packet loss, time 14852ms
rtt min/avg/max/mdev = 17.369/27.841/144.850/23.006 ms, pipe 10, ipg/ewma 14.867/20.384 ms

Traceroute

網際協議 (IP) 的骨幹是路由器。Traceroute 逐步增加封包的存活時間 (TTL),利用路由器遇到 TTL 為 0 的封包時會丟棄它並回傳 ICMP Time Exceeded 封包,藉機獲取路上每個路由器的 IP 位址。

本章使用以下指令測試,需要 root 權限。

nmap -sn --traceroute [目的]

Nmap 會把本地時區誤判為 CST。為了紀錄的完整,我不更改,請各位看倌腦補成 Asia/Taipei

外網

從本站連往 civics.tmu.edu.tw 所經過的路由器:

Starting Nmap 6.40 ( http://nmap.org ) at 2014-03-10 20:10 CST
Nmap scan report for 203.71.84.36
Host is up (0.021s latency).

TRACEROUTE (using port 443/tcp)
HOP RTT      ADDRESS
1   5.28 ms  192.168.0.1
2   20.40 ms h254.s98.ts.hinet.net (168.95.98.254)
3   19.53 ms h74.s25.ts.hinet.net (168.95.25.74)
4   19.89 ms SNUH-3202.hinet.net (220.128.5.230)
5   20.44 ms SNUH-3202.hinet.net (220.128.5.178)
6   18.59 ms TCHN-3112.hinet.net (220.128.2.1)
7   18.04 ms 211-22-226-185.HINET-IP.hinet.net (211.22.226.185)
8   19.94 ms 192.192.12.151
9   20.20 ms 10.254.0.66
10  17.50 ms 10.0.0.2
11  28.04 ms 203.71.84.36

Nmap done: 1 IP address (1 host up) scanned in 2.98 seconds

從 civics.tmu.edu.tw 連往本站所經過的路由器:

Starting Nmap 5.21 ( http://nmap.org ) at 2014-03-10 20:20 CST
Nmap scan report for jdh8.no-ip.org (36.231.79.223)
Host is up (0.019s latency).
rDNS record for 36.231.79.223: 36-231-79-223.dynamic-ip.hinet.net

TRACEROUTE (using proto 1/icmp)
HOP RTT      ADDRESS
1   8.14 ms  gate84.tmu.edu.tw (203.71.84.254)
2   8.35 ms  10.0.0.1
3   8.64 ms  10.254.0.65
4   8.61 ms  192.192.12.190
5   8.73 ms  TPDB-4903.hinet.net (211.20.43.62)
6   8.97 ms  TPDT-3012.hinet.net (220.128.2.2)
7   8.96 ms  SNUH-3202.hinet.net (220.128.2.173)
8   9.07 ms  220-128-5-253.HINET-IP.hinet.net (220.128.5.253)
9   8.92 ms  h73.s25.ts.hinet.net (168.95.25.73)
10  19.14 ms 36-231-79-223.dynamic-ip.hinet.net (36.231.79.223)

Nmap done: 1 IP address (1 host up) scanned in 0.23 seconds

校內

我在 2104 教室內使用 TMU-WLAN,拿到 10.31.13.200/22,閘道是 10.31.15.254。

我連往本站所經過的路由器:

Starting Nmap 6.40 ( http://nmap.org ) at 2014-03-11 10:44 CST
Nmap scan report for jdh8.no-ip.org (36.231.93.48)
Host is up (0.029s latency).
rDNS record for 36.231.93.48: 36-231-93-48.dynamic-ip.hinet.net

TRACEROUTE (using port 80/tcp)
HOP RTT      ADDRESS
1   49.24 ms 10.31.7.254
2   56.71 ms 36-231-93-48.dynamic-ip.hinet.net (36.231.93.48)

Nmap done: 1 IP address (1 host up) scanned in 1.30 seconds

我連往 civics.tmu.edu.tw 所經過的路由器:

Starting Nmap 6.40 ( http://nmap.org ) at 2014-03-11 10:44 CST
Nmap scan report for 203.71.84.36
Host is up (0.012s latency).

TRACEROUTE (using proto 1/icmp)
HOP RTT      ADDRESS
1   ...
2   12.92 ms 203.71.84.36

Nmap done: 1 IP address (1 host up) scanned in 4.16 seconds

從 civics.tmu.edu.tw 連過來所經過的路由器:

Starting Nmap 5.21 ( http://nmap.org ) at 2014-03-11 10:56 CST
Nmap scan report for 10.31.13.200
Host is up (0.022s latency).

TRACEROUTE (using proto 1/icmp)
HOP RTT     ADDRESS
1   ...
2   9.93 ms 10.31.13.200

Nmap done: 1 IP address (1 host up) scanned in 3.06 seconds

由此可見,針對內網,我們有防刺探措施。有線網路也有類似的情況。以下是以線路連接資訊處咖啡廳網路插孔的結果。

我連往本站所經過的路由器:

Starting Nmap 6.40 ( http://nmap.org ) at 2014-03-11 12:26 CST
Nmap scan report for 203.71.84.36
Host is up (0.0088s latency).

TRACEROUTE (using proto 1/icmp)
HOP RTT     ADDRESS
1   0.55 ms 10.1.1.254
2   9.96 ms 203.71.84.36

Nmap done: 1 IP address (1 host up) scanned in 1.49 seconds

我連往 civics.tmu.edu.tw 所經過的路由器:

Starting Nmap 6.40 ( http://nmap.org ) at 2014-03-11 12:26 CST
Nmap scan report for 203.71.84.36
Host is up (0.0088s latency).

TRACEROUTE (using proto 1/icmp)
HOP RTT     ADDRESS
1   0.55 ms 10.1.1.254
2   9.96 ms 203.71.84.36

Nmap done: 1 IP address (1 host up) scanned in 1.11 seconds

從 civics.tmu.edu.tw 連過來所經過的路由器:

Starting Nmap 5.21 ( http://nmap.org ) at 2014-03-11 12:37 CST
Nmap scan report for 10.1.1.73
Host is up (0.0071s latency).

TRACEROUTE (using proto 1/icmp)
HOP RTT     ADDRESS
1   ...
2   9.84 ms 10.1.1.73

Nmap done: 1 IP address (1 host up) scanned in 3.08 seconds

The Day We Fight Back

本文翻譯並改寫自 The Day We Fight Back 官網。

親愛的網路使用者:

在 2012 年一月,我們以史上最大的網路抗議行動阻止美國 SOPAPIPA 的立法。如今,我們又面臨了一個破壞網際網路且掏空我們生活在真正自由的社會的重大威脅:大規模審查 (mass surveillance)。

為了慶祝二年前我們對 SOPAPIPA 的勝利,並追憶其領導者之一,Aaron Swartz,我們計畫在抗議大規模審查。

我們一同向監視、收集、分析我們數位動態的霸權說不。我們表明,此舉與民主法治不相容。總之,若我們堅持到底,就會贏得這場戰鬥。

我們會在做什麼:

若你在美國
本站連同全球四千多個網站會顯示一張橫幅,催促人們打電話或寄電郵給美國國會。我們要求議員反對 FISA Improvements Act ,支持美國自由法案 (USA Freedom Act),並制定對非美國人的保護措施。
若你不在美國
我們會催促閱聽人採取適當措施保護隱私。

參與活動:這是屬於你的時刻

SOPAPIPA 的抗議能成功正是因為我們整個網路社群動起來。正如 Aaron Swartz 所說,每個人都是自己的故事中的英雄。我們可以制定日期,但我們需要你們,也就是網路使用者,讓它成為一場運動。

現在就採取行動吧!

在你的個人網站加入橫幅

就像本站一樣。點選此處觀看源碼。

告訴全世界你的參與

分享訊息
更換你的大頭貼
Ben Franklin quote about privacy and security Lebowski is against surveillance too This person is in for The Day We Fight Back We're protecting you - keep browsing
分享圖片到 Facebook

參與 Reddit 上的討論

展現你的創意

這一刻是我們這些關心網際網路存亡的人所構成的廣泛社群創造的。張貼關於美國國安局的迴響。製作、分享漫畫等訊息 (meme)。架設網站。組織活動。

然後知會主辦單位,讓我們可以宣揚你的作品。