PHP中foreach循环时使用引用的一个坑

记录一个广为流传的关于使用PHP引用的坑。

$arr = ['abc', 'ben', 'cam', 'day'];
foreach($arr as $key=>&$val){
    $val = strtoupper($val);
}
foreach($arr as $val){
    echo "$val\n";
    print_r($arr);

}
echo "===END===\n";
print_r($arr);

解释:

//第二次使用$val做foreach循环时,此时$val还是保持着对$arr数组里的最后一个元素($arr[3])的引用。
//所以对于这个foreach,
//1st ==> $arr[3]=’abc’
//2nd ==> $arr[3] = ‘ben’
//3rd ==> $arr[3] = ‘cam’
//4th ==> $arr[3] = ‘day’

所以正确的做法是在使用引用的foreach结束后马上unset($val)
或者干脆不用使用引用,foreach时使用$key=>$val格式,然后使用$arr[$key]方式修改变量并保存。

Wall Clock and Monotonic Clock

Wall clock(time) VS Monotonic clock(time)

Wall clock(time)就是我们一般意义上的时间,就像墙上钟所指示的时间。

Monotonic clock(time)字面意思是单调时间,实际上它指的是从某个点开始后(比如系统启动以后)流逝的时间,jiffies一定是单调递增的!

而特别要强调的是计算两个时间点的差值一定要用Monotonic clock(time),因为Wall clock(time)是可以被修改的,比如计算机时间被回拨(比如校准或者人工回拨等情况),或者闰秒( leap second),会导致两个wall clock(time)可能出现负数。(因为操作系统或者上层应用不一定完全支持闰秒,出现闰秒后系统时间会在后续某个点会调整为正确值,就有可能出现时钟回拨(当然也不是一定,比如ntpdate就有可能出现时钟回拨,但是ntpd就不会))

 

PHP 7.3新增了hrtime函数

hrtime ([ bool $get_as_number = FALSE ] ) : mixed

Returns the system’s high resolution time, counted from an arbitrary point in time. The delivered timestamp is monotonic and can not be adjusted.

<?php


while(true){
    var_dump(time());
//    $micro = microtime(true);
//    var_dump($micro);
//    echo PHP_EOL;

    //var_dump(hrtime());
    $nanosecond = hrtime(true);
    var_dump($nanosecond/1000/1000/1000);//nanosecond => second
    echo PHP_EOL;
    echo PHP_EOL;
    echo PHP_EOL;
    echo PHP_EOL;

    sleep(5);
}

执行此脚本,然后在过程中手动更改系统时间。执行结果如下

 

……

int(1554975423)

float(481987.58385405)

 

int(1554975428)

float(481992.58812)

 

int(1554975433)    ==>    北京时间:2019/4/11 17:37:13

float(481997.59318082)

 

int(1554889031)   ==>      北京时间:2019/4/10 17:37:11

float(482002.59569814)

 

int(1554889036)

float(482007.59825222)

……

 

hrtime()的返回值就是一直单调递增的,而time()的返回值就可能出现跳跃。所以在计算时间差时要用hrtime(),注意PHP版本至少要7.3 。

 

 

《重构 改善既有代码的设计》读书笔记

 

本书可以被看成是一本重构方法的手册。且因为本书成书较早,所以很多重构手段都被大家耳熟能详并从入门开始都被当成的编码规范。所以很大程度上阅读本书也算是温习。

  1. Kent Beck:我不是个伟大的程序员,我只是个有着一些优秀习惯的好程序员。
  2. (大多数时候)不需要专门安排时间重构,重构应该随时随地进行。你不应该为重构而重构,你之所以重构,是因为你先做别的什么事,而重构可以帮助你把那些事做好(比如效率更高,能容易扩展)。重构与编码总是伴随进行的。重构不是一劳永逸的,我们需要在系统发展中不断的进行,不断重构出适应未来的代码(而且这个未来往往也只能指未来一段时间,而非永远)。
  3. “三次法则,事不过三,三则重构。” 实际上,有了IDE的帮助,但第二次相同代码出现时,IDE就会提示需要重构了。
  4. 把未完成的重构工作形容为「债务」。
    Ward Cunningham对此有一个很好的看法。他把未完成的重构工作形容为「债务」。很多公司都需要借债来使自己更有效地运转。但是借债就得付利息,过于复杂的代码所造成的「维护和扩展的额外开销」就是利息。你可以承受一定程度的利息,但如果利息太高你就会被压垮。把债务管理好是很重要的,你应该随时通过重构来偿还一部分债务。
    如果项目己经非常接近最后期限,你不应该再分心于重构,因为己经没有时间了。不过多个项目经验显示:重构的确能够提高生产力。如果最后你没有足够时间,通常就表示你其实早该进行重构。
  5. 从重构联想到软件复用和技术传播
    Geoffrey Moore 把「技术的接纳过程」描述为一条钟型(bell-shaped )曲线:前段包括先行者(innovators )和早期接受者(early adopters),中部急剧增加的人群包括早期消费群体(early majority )和晚期消费群体( late majority),后段则是那些行动缓慢者(laggards)。一个思想或产品如果要成功,必须得到早期消费者和晚期消费者的广泛支持。另一方面,许多对于先行者和早期接受者很有吸引力的想法, 最终彻底失败,因为它们没能跨越鸿沟,让早期消费者和晚期消费者接纳它们。之所以有这样的鸿沟是因为,不同的消费人群有着不同的消费动机。先行者和早期接受者感兴趣的是新技术、「范式移转和突破性思想」的愿景(visions of paradigm shifts and breakthroughs)。早期和晚期消费群则主要关心成熟度、成本、支持,以及这种新思想或新产品是否被「与他们有着相似需求」的其他人成功套用。
    要打动并说服软件开发者,所需方式和打动并说服软件研究者是完全不同的。软件研究者通常是Moore 所说的「先行者」,软件开发者(尤其是软件经理)则往往属于早期或晚期消费者。如果想要让你的思想深入所有人心,了解这一差异是非常重要的。是的,无论软件复用或重构,要想打动软件开发者,这一点都至关重要。

 

《网络安全——输不起的互联网战争》读书笔记

  1. 作者认为,因为物理设备的多样性,网络攻击很难大面积展开。
  2. Buckshot Yankee
  3. 很难定位网络攻击的真实来源,即使定位了物理上的来源,但是由于来源设备可能存在被第三方入侵,所以不能代表设备拥有者的意图。当然有时攻击方也会利用这种情况否认己方发动了攻击。
  4. 作者认为现在网络的攻击的危害有限,当然他同时也告诫我们不能放松警惕。我是不太认同作者的这个观点的。作者说认为现在网络攻击对普通民众的日常生活的影响微乎其微,相比物理上的攻击危害(比如恐怖袭击、核弹……)也小很多。但是我认为现在互联网正在占领各个传统领域(被传统领域应用),比如国内的交通、支付、甚至日常工作……所以网络攻击的危害已经非常大了。

结合第一点,即使物理设备的多样性,但是由于单一种类设备的使用基数大(在不同场景下),那么攻击者还是愿意投入精力开发攻击软件的。另外,现在物理设备越来越智能化,能够运行小型的OS(Unix或Linux),也给攻击者提供了很多发挥的空间。

  1. 恢复能力、组织松散性

“即使在私营企业中,恢复能力与提高效率的目标也是矛盾的,因为冗余明显是一种浪费。”

“专家们注意到,哪些最具效率的企业其实很脆弱,而且受到适应变化能力差及创新能力不足的制约。这些企业缺少”组织松散性“,这种松散性往往能产生积极的文化,并促使企业成才。同样建立“恢复能力”的组织特征也有助于增强“组织松散性”。同样,充分进行安全评估,已经让员工了解企业的远期目标,有助于提高恢复能力.”

  1. 全球范围内,很难在网络安全领域达成一致的协议。很多国家都希望能够独立掌控本国范围内的网络,他们认为网络不存在“没有主权”的公共空间。

 

总的来说,网络安全对一个国家而言是十分重要的,虽然目前时间,网络攻击没有像真实武器那样危害深刻且明显,但是我们一定要在战略上予以重视。在战略层面搭建网络安全框架,与世界网络强国保持紧密联系,尝试与各国一起建立统一的网络安全规范,努力追求网络更高层次的安全。

 

stuxnet(震网病毒)

震网(Stuxnet),又称作超级工厂,是一种Windows平台上的计算机蠕虫,2010年6月首次被白俄罗斯安全公司VirusBlokAda发现,其名称是从代码中的关键字得来,它的传播是从2009年6月开始甚至更早,首次大范围报道的是Brian Krebs的安全博客。它是首个针对工业控制系统的蠕虫病毒,利用西门子公司控制系统(SIMATIC WinCC/Step7)存在的漏洞感染数据采集与监控系统(SCADA),能向可编程逻辑控制器(PLC)写入代码并将代码隐藏。

这是有史以来第一个包含PLC Rootkit的计算机蠕虫,也是已知的第一个以关键工业基础设施为目标的蠕虫。此外,该蠕虫的可能目标为伊朗使用西门子控制系统的高价值基础设施。据报道,该蠕虫病毒可能已感染并破坏了伊朗纳坦兹的核设施,并最终使伊朗的布什尔核电站推迟启动。不过西门子公司表示,该蠕虫事实上并没有造成任何损害。

赛门铁克安全响应中心高级主任凯文·霍根(Kevin Hogan)指出,在伊朗约60%的个人计算机被感染,这意味着其目标是当地的工业基础设施。俄罗斯安全公司卡巴斯基实验室发布了一个声明,认为Stuxnet蠕虫“是一种十分有效并且可怕的网络武器原型,这种网络武器将导致世界上新的军备竞赛,一场网络军备竞赛时代的到来。”并认为“除非有国家和政府的支持和协助,否则很难发动如此规模的攻击。”伊朗成为了真实网络战的第一个目标。

References:

https://zh.wikipedia.org/wiki/%E9%9C%87%E7%BD%91

《微信思维》读书笔记

在微信逐渐变成的臃肿、垄断、甚至有点烦人的今天,我们回头看看微信发展与成功,应该更深刻。

微信的成功之处在于连接,让商家和顾客通过微信这个平台实现了一对一的交流。然后通过微信支付,实现了线上流程从下单到支付的整个流程覆盖。对于日趋火爆的O2O行业来说,使用微信后,商家只需要提供线下服务即可,其他的皆可在微信上完成。

微信虽然有公众号和服务号,但是相比微博,服务号还是它的大杀器。商家和顾客一对一的交流形式,衍生了极大的操作空间。比如作为在线客服,线上服务(下单、支付、查询、售后、消费提醒……)……

本书在很多章节都在反复宣传一个观点:企业一定要有明确的自我定位,是想做宣传还是想做服务。想做宣传请使用公众号;要做服务,最好申请服务号。服务号的核心是提供服务,不要经常推送宣传文案打扰用户。

到了2018年再来看看微信,发现它已经是一个巨物了。一方面,微信作为腾讯的独家产品,有时候背负了整个公司的战略目标,比如打压竞争对手,扶持内部业务;另一方面,亲友交流、公司业务沟通、各种企业服务、各种企业推广都占据了你的微信,微信已经成为了信息洪水。不知道,在完成连接商家与顾客连接之后,下一步是不是减负?

紀念林奕含

馬上(4月27日)就是林奕含一週年祭,正好剛剛讀完《房思琪的初年樂園》,寫下一點紀念吧。

因為看書評說簡體版翻譯的比較爛,所以就直接買了繁體版,硬是啃完了全本。在看的過程中也意識到我以前的一個誤解:寫繁體字並不是一定要把“短信”寫成“簡訊“,繁體字也如其他文字一樣只是一種文化的展現形式,只是因為她更能展示文字的來源組成,所以值得多了解。明確了這個目的,那麼就明白了該如何學習、使用繁體字了。

最早知道林奕含應該就是在去年(2017年)4、5月份間,那時她剛剛結束了自己的生命。網絡上爆出了她的故事,她也成為了英雄,一個用書當武器與壞人抗爭的英雄。

先看一個網友的讀書筆記https://foolishbits.com/當房思琪遇上李國華-2b248fbfd2e0 ,我覺得這篇深入的分析文章能夠幫助我們很快的解除一些疑惑。最核心的,許伊紋、劉亦婷、房思琪都是代表某一面的想象,都是作者林奕含性格以及願望的某一面放大的展現。

關於網友下面的這句話,我覺得他文字描述的有點歧義的(我覺得不能說郭曉奇這個角色是房思琪本人,我覺得她是一個組合體,不能純粹說是作者本人,比如關於郭曉奇父母背景的介紹明顯就不是作者本人的情況)

郭曉奇:在小說裡是一個在房思琪之前同樣是受害者的同路人,後來決定在網路上po文揭穿李國華。我猜想,這個角色大概是房思琪本人,而非曉奇,小說裡的曉奇的遭遇或許只有一小部分是真正的曉奇本人的經歷,其他部分,可能全是房思琪自己的故事。例如,曉奇的父母,與李國華、李國華老婆攤開來談判曉奇與李國華的師生戀被發現了這件事。

但是我同意他的看法,就是郭曉奇這個書中人物,不簡簡單單是作者的自己的某一面,更是將一個真實的曉奇和自己本身中和后想象出來的人物。

書中情節上沒有太多好說,這裡主要是想聊一下性和性教育的內容。

整個社會羞於談性,看來這不是大陸特有的現象。我覺得房思琪的故事給我們有兩點教訓:

  1. 父母要營造良好的家庭氛圍,要家庭成員之前彼此信任,要有愛。

在飯桌上,思琪用麵包塗奶油的口氣對媽媽說:

『我們的家教好像什麼都有,就是沒有性教育。』

媽媽詫異地看著她,回答:

『什麼性教育?性教育是給那些需要性的人。所謂教育不就是這樣嗎?』

思琪一時間明白了,在這個故事中父母將永遠缺席,他們曠課了,卻自以為是還沒開學。

家庭對性教育的缺失。

…思琪在家一面整理行李,一面用天真的口吻對媽媽說:

「聽說學校有個同學跟老師在一起。」

「誰?」

「不認識。」

「這麼小年紀就這麼騷。」

思琪不說話了。她一瞬間決定從此一輩子不說話了。

加長自己思想的極端,對孩子的不關心,使他們自己本身也成為了幫兇。

另外,關於家長是否應該早點給與小孩性教育也是一個值得探討的問題。網絡上有一句言論:“你嫌性教育太早,坏人永远不会嫌你的孩子太小”。是的,這句話很對。但是另外一方面,如果性教育太早,尺度過大,是不是也會導致小孩過早的性意識覺醒,不利於身體發育成長。

  1. 任何關於性的暴力,都是整個社會遺棄完成的。

從父母到廣大吃瓜群眾,大家在用各自不同的方式幫助施暴者。真正的幫兇不僅僅是施暴當場的協助者,也包括事後進行猜疑、中傷、侮辱等二次傷害受害者行為的吃瓜群眾。看看知乎上的這篇文章:https://zhuanlan.zhihu.com/p/26871632,大家再想想即使在平時看到的新聞下方動不動就人身攻擊的的評論,在網絡的世界里,傷害一個人太容易了。所以我們看到的,很多受害者都是在事後受不了周邊人的眼光、言論等社會壓力才選擇放棄生命的。

 

PS:

順便分享下本書中學到的兩個成語:曹衣帶水(也有稱之曹衣出水) 和 吳帶當風

書中原文是李老師說的:你現在是曹衣帶水,我就是吳帶當風。看到此處時,我覺得書中的李老師的文學功底的確很牛,突然也能理解作者的某些痛苦了,現實和幻想,自我麻醉或者清醒。

一个关于PHP正则匹配汉字的问题

起因是一个网友提了一个问题:

$pattern='/^\w+$/';
$str="人1994";
$ret = preg_match($pattern, $str, $matches);

他想着\w是应该能够匹配到中文字符“人”的,但是实际执行结果却是不能匹配。网友们给了各种解释和解决方案,总结下来有两个可行方案:

  1. 使用/u模式修饰符[1]
  2. 在pattern中使用unicode编码表示两种方案可以解决如上问题。

代码及输出如下:

<?php


$pattern='/^\w+$/';


$str="人1994";


$ret = preg_match($pattern, $str, $matches);


var_dump($ret);


var_dump($matches);





$pattern='/^\w+$/u';


$str="人1994";


$ret = preg_match($pattern, $str, $matches);


var_dump($ret);


var_dump($matches);





//From PHP 7.0


$pattern='/^\w+$/u';


$str="\u{4eba}1994";//人 =>  \u4eba


$ret = preg_match($pattern, $str, $matches);


var_dump($ret);


var_dump($matches);








Output for hhvm-3.18.5 - 3.22.0, 7.1.0 - 7.2.4


int(0)


array(0) {


}





int(1)


array(1) {


[0]=>


string(7) "人1994"


}





int(1)


array(1) {


[0]=>


string(7) "人1994"


}








Output for 5.6.0 - 5.6.30


int(0)


array(0) {


}





int(1)


array(1) {


[0]=>


string(7) "人1994"


}





int(0)


array(0) {


}





注意:第三个例子中的语法从PHP 7.0开始支持。[2] [3]

还有一个网友提出了一个观点[4]

这个不是 PHP 的锅,而是 PCRE 库的配置导致,\w 的匹配官方文档是这么说的 

A “word” character is any letter or digit or the underscore character, that is, any character which can be part of a Perl “word”. The definition of letters and digits is controlled by PCRE’s character tables, and may vary if locale-specific matching is taking place. For example, in the “fr” (French) locale, some character codes greater than 128 are used for accented letters, and these are matched by \w.

也就是说, PCRE 库的 character tables 配置会影响到\w 的匹配

目前没有验证TA所说的是否正确。

 

目前来看最好的方式就在在写pattern时使用模式修饰符/u。

 

References:

[1]https://secure.php.net/manual/zh/reference.pcre.pattern.modifiers.php

 

[2] PHP 7.0 has introduced the “Unicode codepoint escape” syntax.

https://secure.php.net/manual/en/migration70.new-features.php#migration70.new-features.unicode-codepoint-escape-syntax

 

[3] To support large Unicode ranges (ie: [\x{E000}-\x{FFFD}] or \x{10FFFFF}) you must use the modifier ‘/u’ at the end of your expression.

https://secure.php.net/manual/en/function.preg-match.php#90771

 

[4] https://www.v2ex.com/t/262150

https://stackoverflow.com/questions/1330693/validate-username-as-alphanumeric-with-underscores

 

 

《青铜时代的鳄鱼战争》与《青铜时代的终结战争》读书笔记

鳄鱼战争,通过这个名字我们心里就会默默的想到一个词:凶恶。此时时间已经到了战国初年,从三家分晋开始(资治通鉴观点认为公元前403年三家分晋是战国的起点;维基百科上有提到:战国的起点也还有不少其他不同的说法)。战国时期平民阶层逐渐崛起,相对贵族阶层的重名,他们更重利。在他们的引领下,战争规模也越来愈大,频率也越来越高,过程也越来越残酷。

首先魏国在魏文侯时通过吴起变法,成为了战国首霸。可惜后来的魏武侯猜忌吴起,导致吴起奔楚,魏惠王时又迁都到中原大梁,以一国之力与各国混战导致国势日衰。

同样在魏惠王时期,秦国的秦孝公时期,秦国开始了商鞅变法。商鞅,卫国国君的后裔,姬姓,故称为卫鞅,又称公孙鞅。后因在河西之战中立功获封于商十五邑,号为商君,故称之为商鞅。商鞅变法开始了秦国的新篇章,此后秦国先后经历多轮变法,逐渐变成了战国首强。

再来说说秦国的战略,我们都知道战国时期有名的就是合纵连横两个策略。

维基百科:“纵”与“横”的来历,据说是因“南北向”称为“纵”,“东西向”称为“横”。“合纵”就是三晋和齐秦中一家合作攻击另一方; “连横”就特指秦国与山东六国中一些国家结盟。

作者潇水有一个很精彩的分析。到了战国中期,战国主要七国中,西秦东齐尤为强大,三晋、燕都相对弱些、楚国一方面国内卿大夫专权厉害,另一方面也吞越、扩展周边领土,较少参与六国战争。所以秦国执行了先近交远攻,再远交近攻的策略。通过连横的近交远攻,击败齐国(乐毅伐齐就是基于五国伐齐之后),然后再远交近攻,逐步吞噬相邻的三晋和楚国。先近交远攻的目的是削弱齐国,使之无力干预秦国后面的近攻策略。

而战国初中期,各国势力差距不大,相对均势,“齐秦不合,天下无忧”,所以纵横家得以有施展本领的舞台。到了战国后期秦独强,山东六国联合都不能胜之,纵横家就没有用武之地了。

 

孟子也在齐国留下过一段故事。孟子的思想被齐宣王认同,他本人被授予卿。他的仁者无敌没能阻止齐宣王发动吞燕战争,也没能约束齐军的军纪,导致燕人反叛。齐燕交恶也为齐国衰弱埋下了伏笔。

赵武灵王的胡服骑射,给赵国注入一股强心剂,但是随后贵族集团的反扑也让赵国日渐衰落了。

 

战国时期的各国的发展也是十分有趣。山东六国也先后有过各式各样的改革。但是到了后期基本又回到了贵族政治的老路。而秦国基本都是六国人过来担任相国依靠法家思想治国,在国家战略、经济发展方面取得决定性的优势。

然后要看看治国思想方面。儒家的很多先人都先后参与了六国的执政,但是他们给人感觉更多是理论,是大的方向,没有实际的精确的措施。而法家不同,他们制定详细的法律条文,可以执行的考核措施……

最近我又把罗辑思维的一期的视频节目《大国不能不识数》重新看了一遍,正好可以和儒家、法家的治国行为对比。一直讲仁、德,清廉、君臣父子……那不是治国,那是文学家,治国要讲究可以执行的具体条款。放到当今,就是工作生活上在办事时要将事情分解为一个一个可以执行的点。儒家治国就说要宽刑,减税、与民休戚;法家治国就说要实现经济每年百分之多少的增长,减什么税,减多少——大致就是儒家和法家给我的感觉。

 

潇水曰:秦昭王一声所做的事情就是与六国鏖战,晚年他最大的愿望应该就是吞并六国。这本来是有可能实现的,关键点就在于灭赵。只下邯郸,赵就灭了。赵灭了,天下也就土崩瓦解了,一统归秦了。然而,当邯郸被困的两年多漫长时间里,战神白起却偏偏称病不出,粉碎了秦昭王的统一计划。秦昭王功败垂成,愤怒是可想而知的。于是他在兵折将时刻,迁怒白起,把白起杀了,也不足奇怪。

秦昭王最大的败笔,就是没有协调好范雎和白起之间的关系。从前,范雎和白起和衷共事:范雎献反间计于后方,白起竭忠尽力于前线,终于获得长平大捷。可惜,范雎随后嫉妒白起战功,从此互不相能:范雎要攻邯郸,自起就是不从。俩人如果能够学习廉颇、蔺相精神,在凑国搞一个“将相和”,携起手束,一起把握时机,冥思苦想,不愁邯郸不破。一统华夏的梦想,在秦昭王晚年,不愁不能实现。可惜历史不能假设,中国统一的事情,被推迟了三十年,更多的战士的头颅,还要在随后的三十年里抛洒。

潇水又曰:白起,陕西宝鸡地区眉县人,早年起身贫寒,出十行伍,祖上据说是秦穆公时代的常败将军白乙丙(蹇叔的儿子,参加过城濮之战踢球的):白起从低级武官开始做起,一生戎马而我,终十东破三晋,南摧荆楚,威服燕齐,力震胡夷,终身大小七十余战,没有败绩,前后陷城七十多座,一生共歼灭六国军队约一百万,杀伤之多,冠于中外历史。有人统计过,秦国自孝公以来百年间,在各次战役中杀人总合计达一百六十五万(相当于现代淮海、平津、淮海(此处文章原文应该有错误)三大战役的总和),而白起的斩首占了这个数目的二分之一强。六国闻白起之名而胆寒。

秦昭王近半个世纪的主要我功,几乎全由白起一人创造,白起可谓中国历史上罕有的战神。但是他杀戮过重。当然,这和秦国以斩首为功、鼓励杀伤的战略总思想有关。到了长平之战,又杀降二十佘万,更是残忍;遂使六国军民的眼中,秦军被冠以了“暴”的形容词。众所周知,奉国的治制度明显地优越于腐朽的六国贵族政治,秦国来统一六国势在必行,但是“暴“这个字眼狠狠打了秦国的折扣。邯郸人民被围两年誓死不降,就是因为对秦军杀降的“暴“且怒且惧。白起可谓巧于战而拙于胜。公元前3世纪的上叶,伴随着白起的一生,也因此成为中国历史上空前惨烈的半个世纪。

到了随后的吕不韦主掌秦国内政外务以后,开始修改军事杀戮这种偏激的做法。吕不韦到处鼓吹“义兵”,于是秦军斩首纪录明减少,而土地的扩张速度反而加快。这无疑是一种策略上的进步,加速了秦国的统一进程。可惜,后来秦始皇建国后滥用刑罚,遂使人们又把“秦”与“暴“这个字眼联系起来了。秦国空有领先的政治制度,但是历史上前后两个时期“暴”的失误,使得它的统治终于不能稳固。秦国那代表着政治进步的、大有希望的华丽大夏,却因为这两个完全可以避免的洞,而倒塌了,亦是一件恨事也。

如今,长平地区的谷口村(也叫杀谷),有一种烘烤的豆腐,叫作“白起肉“。还有一种豆腐渣,叫作“白起脑”,各大餐馆有吃。当地人吃着这种东西,泄着心头之恨,也向我们诉说着在公元前3世纪上叶,统一六国的兼并战中,秦军所犯下的军事上的策略性错误。

 

说道战国,不得不提“战国四公子”,又称“战国四君子”。仔细看看这些公子们的事迹,你一定有一个疑虑,自己是不是对君子这个词又误解。我之前看到一个说法,说早期“君子”这个词是形容一个人的地位,而非品行。

 

作者对吕不韦被罢相有一个独特的解释。他认为吕不韦通过《吕氏春秋》展现了他的思想:提倡君臣合作共治。这个与秦王嬴政独裁的想法冲突,自然遭受了嬴政的打击。嬴政在独裁这条路上越走越远,直接导致了秦二世而亡的结局。

其实,吕不韦的死,并不关什么投机和冒险,他的死,有更深刻的原因:

吕不书认为,君主不能私有天下,这个思他反复在《吕氏春秋》一书中提出。虽然这见解很进步,却跟秦王政(后者更喜欢专揽权力)大唱反调。这就是吕不书必死的原因所在。

我觉得也不一定说吕不韦的思想就是先进,也可能他是想复古分封制,与秦王的郡县制的集权思想相冲突。

 

齐建实在是不懂地理,五百里什么概念啊?半个中原都被划拉进去了。区区共地怎么能有五百里啊?

他来到共地以后,秦人让他住在一块松树、柏树坡上。于是齐王建回到了共工时代,改穴居和巢居了。最倒霉是没有吃的。他随身带的金银财宝都不能顶饭吃,好在天上很快掉下来了馅饼——对不起,掉下来了雨水。于是齐王建在雨水里苦苦地地沤着。

我们很替齐王建叫屈。列国被灭亡以后,亡国之君都没有被砍头,也没有被关在雨地里饿毙的。齐王建侍奉秦国最谨,遭遇却最差。真是天道无常,常不与善人啊。

大约列国长年与秦交兵,已经地尽兵空了,不甚可惧。列国的土地是一点点输给秦国的,秦人已经逐步在新占区统治熟了,不怕造反,所以不妨留其亡国之君一个活命。唯齐国尚大,民间力量尚勇,齐国土地不曾残失给秦国,秦人在齐国属于新外来户,没有既有的统治基础。所以秦国不敢再让齐国的领导人活着,以防被民众拿去作反秦精神领袖。

所以,我们给亡国之君一个忠告:如果你是一点点亡的,那还可以最后保住一条命。敌人可以善待你。如果你是突然一下子整个亡的,那敌人肯定会敲掉你的脑袋。

所以最好不要一下子整个亡,要支撑着慢一点。

秦国统一六国后,建立郡县制。采用流官,重刑。结果步子迈得太大……后面看汉朝,在郡县制的基础上,还是保留了分封制的部分制度,稳健而行。

《青铜时代的蜥蜴战争》读书笔记

蜥蜴战争一共九章,前四章都在讲晋国。晋国在晋文公手里等到了极大的发展,从而奠定了长达一百多年的中原霸主地位(当然不是完全连续,中间也断断续续有过短暂的低谷)。

晋国在长时间的称霸环境下,国内卿大夫的实力得到了很大的发展,晋国国政大权也逐渐被卿大夫掌握,国君及公族的实力日益削弱。同时卿大夫之间斗争也越发的激烈和频繁。就如同作者说的,外宁内忧,没有了外部的敌人,内部的斗争就越发的激烈了。

晏子使晋时,和叔向有过一段交流:

叔向又接着为公族哀叹公室是国君本家,公族是历代晋国国君的亲戚受封得氏而形成的同性卿大夫家族,等于是国君的辅叶。叔向说:“我们的几家公族,栾、郤(“三郤”)、胥(胥臣到胥童家族)、原(先轸家族)、孤(孤偃家族)、续(续简伯家族)、庆(庆郑家族)、伯(伯宗家族),如今都完蛋了,子孙都沦落为了皂隶。我听说,公室要滑落,它的枝叶就先凋零。公族如今就剩我们家族等少数几个了。如今国家的政权,都在私门手里(即赵、韩、韩、中行、范、智等异姓六唧),老百无所依靠。国君也不知努力,而是用整天享乐来解自己的忧愁。公室的卑落,就近在眼前了。

晋景公时灭赵氏(遗留赵氏孤儿),晋厉公时“三郤“之难,晋平公时灭栾氏……

卿大夫家族互相夺权、灭族,导致最后只剩下了智、赵、魏、韩四家,再到后面的就只剩下了赵魏韩三家,然后分裂为三个诸侯国了。

 

楚国基本在和晋国争霸几十后就每况愈下。不断的被吴国骚扰,以至后面连国都被被吴国占领过一段时间,差点被灭国。同时楚国为了对抗晋国,经常与秦国联姻。历史上的秦晋之好也变成了秦楚之好。作者认为战国末年楚国一直对合纵对抗秦国都不热心,有部分原因就是因为之前秦楚之好留下的惯性思维在作怪。楚国没有以发展的眼光看秦国实力的发展,以前晋强秦弱,而战国末期秦国已经是超级强国了。

 

春秋末年家臣乍起。大多数诸侯国都是大全旁落,由公族或者外姓卿大夫掌权。孔子就是在这个时代这种环境下出生长大。所以孔子的毕生愿望就是恢复周朝初年礼仪,“君君、臣臣、父父、子子”,君臣父子要各有各的样子,国君要有国君的威仪,臣子要有自己的本分,而不是想当时鲁国那样,君权旁落,政出私门。

三桓掌权期间,鲁国还出了阳虎这一号人物。阳虎的失败告诉了我们很多东西。

  1. 春秋末年虽然各国卿大夫势力崛起,但是还没有发展到重视平民阶层的阶段,各国仍然是贵族集团政治,平民阶层还没有崛起。到了战国时代,君主为了对抗卿大夫阶层,开始重用平民阶层,到那时平民阶层才开始登上历史的舞台,我们才在历史资料里看到大量平民出生的英雄事迹。
  2. 孔子所处的时代还没有后世的皇权,所以他提倡的崇君是指尊重在分封制下君主相对卿大夫的君权,他的目的是指“维护和恢复周初以来既有贵族等级秩序的和谐”,他是一个贵族集团政治的坚定支持者。

 

《青铜时代的恐龙战争》读书笔记

本篇基本都是来自“附记”的摘抄。

春秋时代诸侯林立,诸侯国内卿大夫贵族又得到分封,自有封邑和民人,于是国君的权利就不是很大,被各级卿大夫所牵制和分权,于是当时虽是君主制,但是弱专制系统。于后代帝王的强专制系统不同。在这种弱专制系统下,卿大夫与民人的人格精神也高涨,颇有一种独立人格和名誉尊严意识。南宫长万博戏时被国君侮辱为“虏”,这事如果在未来的皇权时代,那也就自己忍忍算了,甚至匍匐在地满口自称该死该死。君叫臣死尚且不敢不死,何况侮辱一下。但在君权不甚强的春秋时代,就不同了,士可杀而不可辱,人权意识强烈,为人的尊严十分高涨,譬如南宫长万就是这样,干脆拍案而起,怒对君王。

于是我们感受到春秋人,极有一股子烈气,这和当时的分封社会结构有关,是卿大夫自有世袭封邑从而腰杆硬,不是仰人鼻息的奴才所导致的。这股子激烈之气、人性之刚阳,在后来的皇权专制社会一去不返了。后代皇权专制下,没有什么世袭封邑,人也就没有经济实力了,被专制体系控制着,读书人被迫以走仕路、拍马屁为生,人们少了春秋时代的个性张扬和人性完整,多了圆滑、世故和媚态。

要说一下春秋时期的姓氏。比如以楚国为例,楚武王熊彻,芈(mǐ )姓,熊氏,名彻。又如上一篇讲到的秦、赵的祖先伯益,就是嬴姓赵氏,名益。所以当时姓是一种族号,氏是姓的分支。周代的姓氏制度和封建制度、宗法制度有密切联系。贵族有姓氏,一般平民没有姓氏。贵族中女子称姓,男子称氏,这是因为氏是用来“明贵贱”的,姓是用来“别婚姻”的,二者的作用不同。

晋楚争霸的时期,晋国大力支援吴国以牵制楚国。

附记二:

二、阳樊和原城

晋文公重耳帮助周襄王把周的弟弟王子带杀死,勤王有功,周襄王就把八个城邑给了重耳,但是重耳去接收其中的阳樊和原城时,却遭到了抵抗,这就体现了分封制的问题。

所谓分封,有大分封,还有小分封。周天子把土地封给诸侯,这是大分封;诸侯国君会直接拥有若干城邑,而把另外许多城邑分给自己的儿子或功臣,这就成了卿大夫,其中卿得到的封邑较多,大夫也有封邑,所谓某邑大夫。现在我们的上千个县,当时是上千个城邑,被卿大夫阶层的人世袭拥有,比如温大夫、原大夫、韩大夫、阿大夫、高唐大夫等等,分别世代拥有温邑、原邑等等。

现在说说原邑。周天子下面有一个大夫“原伯贯”,是“原大夫”,也就是说,他的家族世代管理和拥有着原邑。这并不奇怪,就像晋文公下面的大夫拥有自己的封邑,周天子下面的大夫也会如此。这时候重耳要来接收他的原邑了,于是矛盾就产生了。如果换了郡县制,新的县长来接管,又是天子命令的,旧的县长也就乖乖地走了。但原大夫“原伯贯”的家族世代拥有着原邑,他的权力可也不是县长所能比的,自然就不会跟重耳那么痛快地交接了。所以重耳要和他发生战斗,最后重耳武力拿下了原邑,也就可以理解了。

随后重耳把这个原邑给了赵衰,让赵衰做了新的原大夫。原伯贯则被迁到山西一个小地方去蹲着。

阳樊的情况也是如此,这个城邑为一个姓樊的大夫所拥有,也是周天子封给他的,他是周天子的臣子。他自然也不想把自家城邑拱手交给重耳,于是打算带着原人迁走,被重耳军兵围住。城里的仓葛站在城头上发表了一通意见,使重耳折服,方才放出了阳樊人。

“阳樊大夫”和“原大夫”,居然可以不听周天子的指令,跟新来的主子重耳对抗,可见卿大夫凭借其封邑以及民人,势力是很可怕的。

由此看来,那时的国君就更像一种“帮主’而在诸侯国内,其实是一种国君和卿大夫家族的“贵族多家族联合体执政”,因此国君权力不是绝对的,还不敢像后代皇帝那么凶巴巴的,这是分封制的社会结构所决定的。这也是卿大夫们有着人格尊严和诸侯国君们经常被杀的原因。西方欧洲封建时代的国君和贵族之间的关系,也类似。

一旦天子成了皇帝,派官僚去治理一个个他所直控的县的时候,就不再是分封制,皇帝也从此变得凶巴巴了,乃至“伴君如伴虎”了。而这时候的官僚们,性质上也不同于春秋时代的卿大夫了,也没了春秋卿大夫的尊严和气度,而不过依附于皇帝的代理人 ― 从民众中选出的代理人罢了。谁乖就选谁。是谁扭动了分封制向皇权专制(郡县制)的转变,那就是后来战国时代的布衣平民,战国平民力量崛起,不喜欢贵人家族世袭为官,于是发明了法家思想,打击贵族,取缔分封,改为郡县,以便他们更多地有官职可做。而君主也觉得这样便于加强君权 ― 控制平民出来的流官,总比原大夫这种世袭封邑拥有者的卿大夫容易些。于是历史滚滚向前,贵人世袭社会于战国时代就已经转变成了平民官僚时代。战国的政体,其实已经和后代一样了。所以战国人的布衣气,与春秋人的贵族气,甚为不同。战国重智与利,春秋重德与礼。中国历史的分界点,其实在春秋与战国之间。

 

附记三:

三、县制与楚国的强大

中原诸侯灭掉某小国后,往往把这小国封给自己的功臣当封邑,比如晋献公灭掉魏国,就封给了自己的战车保镖毕万,毕万成了魏邑大夫,世代拥有该城。然后楚武王对于边境新占领区,却没授予大臣当封邑,而是设为“县“。譬如灭掉权国,他就设立了权县。显得长官当时叫“尹”,是择优聘任的,非世袭的。这种行政制度,相对于分封采邑制,有利于选拔人才,同时更有利于国家稳定。在分封制下,君主拥有若干直属城邑,其余分封给卿大夫家族。卿大夫还可以在封地上征发民众组成私属军队,虽然要经常随着国君的军队出征,但毕竟也可以对抗国君。楚国搞的县就不同了,县长归楚王直接管理,大印随时会被收回。县官还常常换,不会像卿大夫家族那样在封地坐大。

后来权县的县官斗缗造反,被楚武工一斧子就扑灭了,正说明了这一点。这种县官造反就是好镇压。如果是被分封的卿大夫据封邑造反,凭借着数代积累的人气和财富,就不易被扑火了。

既然县制这么好,楚武王乃至后面的楚王做的,就是不断把新占区设为县而不再封给卿大夫作封邑。比如申国被灭,成为申县,息国变为息县。县多了,楚王直接管控的地面就多了。

有人说,这我就不懂了,土地给了卿大夫家族,难道国家就受损吗?卿大夫不也是最终为国家服务的吗?不错,卿大夫是可以保家卫国,但他就像“尾巴”,俗话说,尾大不掉,卿大夫家族凭着世袭的封邑,势力越来越大,如同尾巴越来越粗。尾巴太粗大了,就不听你的使唤去摇晃了。

楚国出兵打仗,楚王调发军队,被分封的卿大夫也带封邑军队随征,县也调发军队随行,并且他们是直接听命于楚王。而中原诸侯,卿大夫封邑上的军队比重大,有时未必听话,比如之战就出现了诸卿大夫各自为是的情况。

所以说,楚武王选择了县制的推广,而不是延续中原分封制的传统老路,这是他的创举。楚国崛起成为百年不衰的春秋强国,打得那些走分封制老路的中原诸侯一筹莫展。楚国一直处于攻势,部分原因当在于县制帮他加强了王权。

PS:其实这里也有值得思考的地方,为什么楚国摸索出了一条自己的治国方略:置县。是否是由于楚国的特殊国情?

 

附记四:

四. 春秋版的“韩琪” —— 论贵族和平民的精神境界

最近在看电视《铡美案》,秦香莲母子三人进京认夫,但是陈士美不但不认,还派了一个家将韩琪去追杀她们。在破庙里,秦香莲就使劲哭,哭得客心都软了,最后刺客韩琪唱道:我如果放了你们母子,回去驸马一定饶不了我,要杀了我,罢罢罢,为了不遭驸马的毒手,我干脆自己死了吧。原词也记不很清了,大约是这个意思。

春秋时代,也有一个“韩琪”就是刺杀赵盾的鉭麂。细节是这样的。赵因为总是劝谏昔灵公,把晋灵公气着了。当然还有一些别的原因,于是晋灵公派猛士鉏麑去暗杀赵盾。天不亮潜入赵盾的家里。

赵盾因为怕上朝晚了,所以今天特意地早起。天上还是星星他就起来了,简直比半夜上班的刺客起得还早。赵盾生怕迟到了是对国君不敬,故宁可早早起,然后端端正正地穿好了朝服!

刺客看了,感叹道:“赵上卿不忘恭敬,民之主也。贼民之主,不忠,弃君之命,不信。有一如此,不如死也!”翻译过来就是:“赵盾不忘恭敬,是人民的主,贼杀人民的主,就是不忠,而弃掉从国君那里承接的命令就是不信,不忠不信这两样自己有一样,不如死去。”他有自己的原则,就是“忠”和“信”!既要守信于国君而去杀人,又不能杀害人民的“主”而不忠,左右为难,只有一死来解决,于是他就触愧树而死了。宁死也不欺骗和违背自己心中的原则。

然而我们看评剧《铡美案》里面的台词,韩琪的最后自杀,则是说不执行任务,回去驸马饶不了我,所以我自杀,是驸马逼死了韩琪。这就可以看韩琪与鉏麑的不同。鉏麑对自己所

奉行的“忠”和“信”的原则,看得比生命还宝贵,当“忠”和“信”两者之间出现矛盾,不能调节,他不愿意破坏其中任一原则,最后选择了死的出路。他的自杀,并不是因为怕回去国君饶不了他。而韩琪只是到马的惩罚这种利害关系逼得他死。一个为原则死,一个为利害死,就看出先秦古人和宋明古人的不同。

当然,韩琪迷们看到这里也许不服气,说这不过是戏剧家编的台同,韩琪未必就是真的这么说的。

是的,甚至《左传》上记录的鉏麑临死说的话,也未必是他的原话,而是书作者给他定的台词。

但是,为什么《左传》上会这么说,说到了精神层次,而《铡美案》上则只是势力相压的问题,纯是利害权衡。这不单单是作者的文化水平问题,更反映了两个时代的精神风貌,是

古典主义与现代主义的差别。

春秋时代的社会结构和后来秦汉唐宋明清社会结构最大的不同,就在于春秋时代的分封制模式。被分封的卿大夫家族们,有自己的封邑,可以世袭。卿大夫派家臣治理自己的封邑,封邑上的财富和征发的军队都是他家的,使得他家拥有不可小觑的军事力量和政治权力,于是这就形成一种分封制下的国君一族和唧大夫家族共享国家的“多家族联合体执政”,好处是限

制了君主独裁。而且,相对独立的政治经济军事基础,还带来另一个重大的好处,那就是人格独立。他们有精神追求,有自己纯粹的价值观和信仰,他们追求自由、尊严、荣誉耻辱心,对上级的忠,对朋友的信,对其他贵族的仁,以及义勇、孝等等。他们对贵族以下的阶层,譬如对平民,也许不讲究这些,但是他们在贵族阶层内部,是互相非常珍视和笃行这些价值观的。而这些东西客观可以维护其家族地位及其封邑产业的长期美好存在与发展。

鉏麑的故事感人,在于他不是贵族,但一样坚持了贵族“忠”和“信”的价值观。

后代皇权专制下,形势就不同了,整个帝国一草一木包括臣了官僚都是皇帝的私有品,没有哪里是贵族卿大夫的自有领地。官僚是皇帝用科举制从平民中选拔出来的、替皇上行走的办事员和代理人:这些官僚虽然也有田地,但田地没有一个几个城那么大,也没有田地上的行政权,不能跟封邑媲美。所以,官僚们不能等同于先秦卿大夫,虽然他们也号称自己是卿大夫。他们物质上不具备先秦卿大夫的经济领地仲立性,精神上也不能和春秋时代的卿大夫的气质尊严原则性等等精神风尚相提并论,虽然他们也是用先秦的书教着自己(往往出于应试目的)他们对长期的精冲道的和信义各种标谁其实相对淡漠,而看重的只是当下利益的争夺,宁可为此牺牲精神信条这就是为什么在先秦的书里,解释鋇的死,是捍卫保全精神原则而导致的死,而后代的戏里,描述韩琪的自杀,则是被有势力的大官逼死而已,只是可怜,并无精神内涵贵族的精神价值观,随着分封制的解体和皇权专制时代的到来,终于渐渐消逝于历史的视野.

人们说,历史是不断进步的,这在物质方面也是,在精神方面却未必是。

这几篇附记基本也反映上一篇笔记里说的:要回到历史环境中,站在当时人的角度去看待这些历史事件。去对比古今资料里的对类似“历史”事件的评价,也可以一窥资料完成时期的社会风貌。

References:

https://www.guokr.com/question/437513/