在 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 }; };

位元處理大全

本文翻譯、改寫自 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

全文未完

給 nginx 和 php-fpm 的 AppArmor 設定檔

[There is also 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,
}

防攻堅措施

佔領國會行動只有二種結果:退場或被清場。我們要有最壞打算,以不進醫院為目標。以下來自外島三棲部隊的特工指點。

防身

準備全罩式安全帽,不解釋。帶口罩、蛙鏡部份削弱催淚瓦斯的攻擊,有阿拉伯之春等級的防禦當然更好。此外,攻堅時很可能會進行區域性斷電,所以要帶手電筒。

鋼鐵人式防禦

準備厚紙板或四個以上寶特瓶,用封箱膠帶綁在前臂、小腿上。這樣在推擠、抵抗時比較不會受傷。當對方揮舞棍棒時,就可以安心用已保護的前臂阻擋了。

攻擊

《槍砲彈藥刀械管制條例》§4 想想有哪些武器未受管制棍棒類。齊眉棍與棒球棒是你的好朋友。此外,棍棒類的武器也有防身效果。

知進退為英雄,識時務為豪傑。

藍黨無理、學生無罪、協議可商、大陸無聊

出處已河蟹,感謝切開提供備份

作者/Masao Syo

原作者基于文中逻辑对于后来冲击行政院的学生表示无法赞同。

原文

简要给这次的事件定个性,就是蓝党无理、学生无罪、协议可商、大陆无聊。

今天的主要内容有:

  1. 服贸协议弊大于利,但对陆外交应容忍两害相权;
  2. 国民党违法回避审查,操纵两院唱双簧践踏民主程序引发祸端;
  3. 民进党充分履行在野监督义务,学生以各自觉悟自发维护法治宪政;
  4. 大陆网民百步笑五十步嘲讽正常民主纠错过程,其中部分已经拉低知乎的智商。

下面请看详细内容

被践踏的立法程序

如果写专栏的话我会严格按照以上 1234 的顺序,但既然回答的是为什么反对,那自然就从周一立法院发生矛盾的具体情节入手。

如果部分答主连以下几则详细情况都没有了解到,我不认为你们有资格对这个问题发泄自己廉价的大国自豪。

首先,根据国际法和国际商法的惯例,贸易类协定的缔结有签署批准两步,为的就是兼容大多数民主国家外交立法分权,国民党执政,因此国民党指派的外交人员有权签署,但是回到国内是否作为国内法规落实,要看整个立法系统(含国民党内支持/反对人士、民进党、第三方利益集团)的逐条审查、转为国内法才能实现其效力。

这个程序是万万省不得的

从可能性上,如果国民党内对签署协定的意见是 60% 对 40%,那么这个协议是签署得下来的,而回到立法院内,国民党占 58% 的席位,民进党占 35%,那么民进党内只要有 66% 以上的人投反对,就足以令协定签署而不通过。

从结果上来说,涉及国家核心利益以及体制的议案中,迫于外交考量签署而不在国内立法落实的情况比比皆是,我给你讲个笑话:大陆地区是人权两公约(《公民与政治权利国际公约》和《经济社会文化权利国际公约》)的缔约方。

中华民国立法院议事法明确规定立法需要经过立法院开会讨论表决通过。

因此,在协定送到立法院时,民进党第一时间要求召开公听会,随后进行实质审查。公听会共 20 场,然而国民党立委张庆忠曾在己方 10 场开完,民进党只开 4 场的情况下强行单边拉入审查,最终在各方指责不了了之。民进党的公听会于 3 月 10 日结束,党民交流也取得了卓著的效果,70% 民众认为协定需要逐条重审。趁热打铁,民进党立委陈其迈于 12 日根据议事法抢排议程开始审查,本来,正常的民主争论应当开始。

但是,又是这个法盲立委张庆忠,在周一的会议中公然践踏议事程序,拿个麦克风在角落里宣布审查已经通过了

去年六月送立法院,两党协商开了 20 场公听会,七成民众都赞成要逐条审查,刚刚开始实质审查的议程,突然来个超过三个月视为通过,其掩耳盗铃程度只有大陆的对日政策堪与一比。

而追溯其原因,其本人的说法是篡改协定性质,划进民国法规分类宪法、法律、命令中的行政命令一级,无需审查。可是缔约类文件一律应以法律落实,甚至对于民国这样的小国生死攸关的贸易协定,依宪法重要性进行审查表决也不为过,作为以不违背宪法法律为条件的命令是绝对达不到的。还且不说协定既然为对大陆外交的产物,如果成了对全体国民的行政命令,难道马英九吴伯雄认为民国政府是大陆地区政权的下属机关?

说起来,国民党这次事件中所表现的嘴脸的确越来越有大陆地区官场的范儿了 :

newtalk

因此部分学生没有逐字阅读服贸协议并不构成我们嘲讽此事的理由,他们关注的是民主本身。

不用管你服贸协议是什么,践踏民主程序就该斩立决,你把民国作大陆,我教蓝党变匪军。

少年自由则国自由

在民主监督程序遭到践踏,国贼当道,法治延续岌岌可危的情况下,今日民国的学生,表现出了五四、五卅前辈们风范,毅然挑起了发出社会呼声,关注家国天下的重任。

而他们远远不是抗议人群的全部,不是被一小撮别有用心的不法分子挑东西起来的群氓。

事实上,这只是民进党筹备的周五全民包围立法院行动的前奏,在民调已经多数倾向审查的情况下,立法院内的国民党立委并无任何民主的说辞可以依赖。民进党固然需要对前来的群众进行帮扶、组织。但这都是国民群众最为正常的表达行为,是生而为人的固有权利,当然,不排除一些大陆人认为自己没有。

值得注意的是,直接许可了示威活动继续存在的,并非学生的所谓暴力,而是立法院方面的默许。其实民国政府在治安方面的强制力并不比大陆地区差太多,只是行政机关及所属治安单位不能主动干涉立法机关的分权原则。立法程序出了问题遭遇示威,这是立法院与国民的自家事,只有立法院主动请求的时候才会有治安协助。但是这次,立法院长王金平沉默了。沉默的理由我想很简单:立委违法,引火烧身,曲在己。

而在现场的示威学生,并不如大陆媒体断章取义所认为的那样极端,他们成立了 150 人的治安队,并且对前一天部分同学激愤之下砸匾的行为进行了反思。很多对零星几张视频新闻截图就津津乐道台湾学生的脑残民粹的围观者,我只能建议你们去把所在视频源找出来看完,树立个完整的印象,哪怕多看几帧呢?

糾察隊員中原大學財經系學生陳亮廷接受 TVBS 訪問時,說「破壞設備當然是不對的。」
攻佔立法院抗議行動進入第 3 天,學生團體,化衝動為祥和,成立糾察隊,維持現場秩序,由於先前攻入議場,部分學生喝啤酒拍照,甚至破壞麥克風沙發等國會公物,一度引發外界非議,擔心抗議活動,被模糊焦點,現場招募,成立 150 人糾隊,幫忙發水,物資及維持秩序,糾察隊表示,20 日上午採取靜坐,場面平和、破壞公物的確不對,有糾察隊員為此出面鞠躬致歉。

因此,这次事件在一个正常的旁观者眼中,是一个完全地、由立法委员违法为合理起因的,大学生凭自身觉悟执行民主程序、行使民主权利、通过非暴力不合作坚决捍卫程序正义和国家利益的正常事件,对于民国这个地缘政治复杂、宪政落实严格的国家来说实乃司空见惯的正常政治事件,是梁启超少年自由则国自由的根本体现。

服贸协议送委至今朝野相争半年多大学生也作壁上观,他们偏偏在立委的违法行为触及法治宪政底线的当口才占领立委,这种经过头脑的理性敏感远非大陆奉旨上街的抗日游行可比。

到场的原大陆学生运动人士吾尔开希评价说学生能够在历史的关头能站出来,说明台湾岛是有希望的,民国是有希望的。

大陆地区的希望,又在哪里?

与虎谋皮的服贸协定

看到回答列表里如此之多他们根本没好好读服贸协定。因此虽然在第一条里已经阐明了抗议与协定本身关系不大,我还是当仁不让地逐条读完了作为理科生本不必读的服贸协定全文。

于是我知道了,这些叫嚣别人逐条读完的人才是真没有读过服贸协定。

因为协定正文的每一条,都是服贸总协定上逐条抄下来的屁话,基本可以用除了另有规定的以外我啥也不管来概括。民国、大陆均是WTO成员,不可能违反服贸总协定的最低标准、原则上也断然不会让出一点点标准以外的利益。

这群五十步们应该叫人逐条读的是服贸协定承诺表,这张表才是服贸协定所需要落实的细节,也是大学生要求逐条重审的利益关系本身。双方承诺表的新华社标准稿在此

由于并非商法专业人士,对于这两张承诺表只能从国际法和比较法的角度作出一些结论:

  1. 国民党并不愧为民国执政党,做事还算有底线。在事关民国的经济、交通、金融市场安全方面的几个命门的持股问题上毫不松手。主要体现在海运、路桥、通讯业不允许大陆具有控制力。当然,大陆方面也如此做,双方各将核心事业的对方持股比例压在50%以下,金融上民国因经济体总量小,几乎不允许大资金干涉,金融承诺卡得更小些这也是国际惯例;
  2. 双方一致规避低素质务工人群跨境流动,也不鼓励台胞长期定居大陆。这至少从客观上避免了大陆农民工涌入台湾然后过几十年玩克里米亚公投的最恶性情况,这件事谈得也比较到位;
  3. 总体要价上来看,民国处于严重劣势,新的服贸协定并不能帮助民国发挥高精尖优势,反而会进一步加大大陆的廉价服务成本对民国服务贸易的不正常冲击,助长大陆人已然习惯的大陆养活了台湾偏见。在一部分具体条文上,国民党很明显是无牌可打,吃了大亏,比如非常重要的关于批发经销的条文:

    大陸對配銷的承諾

    大陆敢于冒天下之大不韪,直接对跨境交付不做承诺。而且限制台湾品牌在大陆的影响力,65% 与 30 家的限制就是要么不许做大,要么变成国企。

    (这可是自由商品贸易的核心,批发——零售啊!)

    台灣對配銷的承諾

    反观台湾,对大陆批发零售企业一路绿灯,门户洞开。当然这也是迫于劳动力价格的无奈,8 块钱一包的张君雅小妹妹和 1 块 5 一包的小浣熊竞争起来,限不限制又有什么意义呢?但是长此以往,大陆愤青动辄大陆卖给台湾吃的喝的养活了他们的呼声可要愈演愈烈咯~

综上,弊大于利是那是肯定的,但不一定就不能签,这中间很多的弊端是小国面对巨大经济体的马太效应造成的。是眼前的钱重要还是国家的前途重要,还是说眼前多赚点钱对国家的前途也重要,这过程中就需要民主的商讨,因此只要国民党接受对话合作,回到民主政治的轨道上来,以民国的国民素质并不会因为一纸条约而唾弃之——李鸿章也是忠臣啊!

当然对于某些沾染了一身大陆气的腐烂官僚来说,哪个重要是显而易见的,学生们砸他的牌坊并不冤枉。什么你说于右任提写的牌坊?——他们配吗?

张庆忠与抽屉里的陆商名片
违法当事人、张庆忠抽屉里搜出的陆商名片

自以为富有的乡下佬

我是看到 @yolfilm 的回答以及他最近顶着无脑反对的坎坷才关注到这个问题的,在此我再次见识到了知乎群体素质的下滑和祖国全新的政治正确。因为这与陆台关系和大陆媒体近几年的强势息息相关所以我就放在结尾说说无妨。

这次立法院事件正如克里米亚事件一样,墙内墙外完全不是一个氛围,大陆媒体论证民主无能独裁万岁似乎变得比二十年前强有力多了,玩的手段也越发花样百出,现在的砸牌照片啊,视频截图自配字幕啊等等看起来也有图有真相了很多。这也助长了大陆愤青玩双重标准打压对岸的勇气,比如 yol 叔就针对普遍的大陆人自豪过度现象讽刺了两句就受到了足以令之哭笑不得的睁眼瞎指责:

yol 叔:

「咋不能感谢大陆的善意呢?」

「感谢呀,谢主隆恩,万岁万岁万万岁。」

评论里马上有人揪着跟进了

@林川

大陆人很少听到什么让台湾谢主隆恩的心态,台湾却总以抵制这种心态来标榜自己,仅小窥心态这一点上,恐怕攻守之势互异也

还拿了 111 个赞呢,那让我们来看看单这些回答里多少人有这心态:

台灣的經濟的確已經沒有退路,唯有依存大陸才能不再原地踏步。
日本玩高端,韩国中端,东南亚低端。你屁大的地方玩中端可是现在的不容乐观,韩国抢的差不多只剩内衣了(个人觉得这还是乐观看法,我打算写裤衩来着!)除了依附大陆这个庞大的经济体我真的看不到还有啥办法了!!
这种人上着大陆的网络,靠在大陆打工生存也就罢了,整天言语之间显示着优越感

还有这位直接辱骂 yol 叔的 @Kouji Minamoto 同学:

還有關於台灣人他們的心態,島國心態比較多啊,和你吵,吵不過就無理取鬧要不然就不說話了,顯得是你去惹他,這樣的人知乎某位來自寶島的大大就是,而且很典型,你有理有據,拉黑你;你無理取鬧反而會留在那裡顯示出他的優越。呵呵,Y大大好生厲害

本来人身攻击什么的不归我管,可是我记得你还问过一个问题:

kouji

自以为富有的乡下穷人——
啧啧,我正想给你们个概括呢,不客气拿走了。