新年快樂

| Comments

新晨慵起,霧霾盈天,白露為霜。2016終於走了,我一點兒也不懷念它。

微軟識花和形色

| Comments

由於微軟的名氣,「微軟識花」剛推出的時候就眾所周知。很好用的App,我成功地用它識別出了母上的長春花:

不過我養的主要是觀葉植物,只能識別花對我來說意義不大。直到最近發現了「形色」。識別率還不錯,對特徵不明顯的植物容易誤報,比如我的空鳳就被識別成了吊蘭……

這就是「微軟識花」狡猾的地方。

小確幸,用Vim編輯當前命令行

| Comments

修改很長的命令是件痛苦的事,在Linux下,可以通過快捷鍵Ctrl+X Ctrl+E調用$EDITOR快速編輯當前命令行的內容,保存退出後,結果會呈現在光標下。

不過在Mac OS的iTerm2下,似乎是因為Ctrl+X被佔用而不能生效。誤打誤撞地發現了另外一個方法,使用oh-my-zsh並且開啓了vi mode的話,先進入vi mode,然後輸入v,同樣可以實現這樣的功能。

用銳速加速Shadowsocks

| Comments

各種VPS加速方案一般都是重復發包的原理,也就是用流量換速度。

先嘗試了kcptun,因為據說資源佔用很低,不過部署後打不開網頁。然後試了一下銳速,用一鍵腳本安裝,很方便,而且不像kcptun,不需要客戶端。部署前在Youtube只能看最低清晰度,現在在網絡條件好的情況下,720p也不卡,效果很明顯。

不過銳速不支持OpenVZ,所以搬瓦工用不了,我用的 Vultr 東京機房的基礎配置。

參考

關於李陵的更多細節

| Comments

上次聊了李陵敗降的細節。在此之後,還發生了幾件有意思的事。

第一個細節,是武帝並沒有馬上殺掉李陵全家,甚至在第二年,還派一支軍隊營救他。

畢竟累世將門,李陵的軍事才能武帝是很欣賞的,況且對於李廣的死,武帝不能沒有一點愧疚。五千步兵深入匈奴,仗打成這個樣子已經是雖敗尤勝了,這一點,武帝自己是知道的,之所以遷怒司馬遷,主要是因為李陵沒有死,而是降了。

在這次戰役中,武帝本來給李陵安排的任務是給李廣利作後勤保障,是李陵自己不乾,非要率五千步兵涉單于庭。按武帝的想法,李陵真要打贏也行,畢竟事關生死存亡,再不濟也得戰死沙場。領導給安排的活你不乾,你自己吹那麼大的牛又沒做到,最後還投降了,這是武帝生氣的主要原因。

不過武帝還是惜才的,所以第二年就派了一支軍隊去救李陵。不過這支軍隊轉了一圈沒撈著匈奴人的影子,只帶回來一個傳聞——李陵在教匈奴人對付漢軍的方法。武帝隨即大怒,並處決了李陵一家。

後來,漢朝有人出使匈奴,李陵趁機問漢使:「我自問戰功不負朝廷,為什麼殺我全家?」漢使就說出了這個傳聞。李陵大恨,說這事是一個叫李緒的乾的。李緒也是一個漢朝的降將,因為這件事,李陵痛恨李緒,就派人把他刺殺了。可能李緒是大閼氏的人,所以大閼氏就要殺李陵。因為匈奴有濃重的母系氏族的風俗殘留,所以大閼氏的勢力很大,連單于也要讓三分。於是單于只能把李陵藏到很遠的地方,直到後來大閼氏死了,才敢接回來。

第二個細節,是霍光曾經試圖策反李陵。

李陵在漢朝的時候跟霍光私交不錯,所以武帝死後,霍光輔政,就想著把李陵接回來,於是以出使的名義派人到匈奴和李陵接頭。李陵沈吟良久,說了一句話:「大丈夫不能再次受辱。」最終拒絕了。

李陵的決定是正確的,作為一個有污點的人,回到漢朝縱然有權臣罩著,一旦靠山倒了,覆巢之下也無完卵。何況至親已死,在漢朝已無牽掛,哪比得上在那天高原闊的地方做一個部落王。


本文最早发布在公众号:两司马门下走狗

哪個時代都看臉

| Comments

漢書卷四十二:

蒼當斬,解衣伏質,身長大,肥白如瓠,時王陵見而怪其美士,乃言沛公,赦勿斬。

高曉松特喜歡說一句話——這是個看臉的時代。其實哪個時代都看臉,所以張蒼因為高胖白,撿了一條命。

昨天讀漢書司馬相如傳,講到撩妹那段(以琴心挑之),後面緊接著就是:

相如時從車騎,雍容閒雅,甚都。

翻譯成人話就是:相如經常開著跑車,逼格滿滿,很帥。所以你以為光琴彈得好就行了麼,想想貝多芬的《獻給愛麗絲》。

看臉本無可厚非,有意思的是看臉的規律:因時而異,因境而異。

先說後者。家世好的喜瘦,苦出身的喜肥。所以楚王好細腰,宮人多餓死。所以趙飛燕能作掌中舞,於是漢成帝死在趙合德的床上。所以屌絲出身的劉邦和王陵饒了張胖子一命。

因時而異。亂世尚剛,治世尚柔。季世喪亂,生存是第一命題,社會的整體審美一定是趨於陽剛的,最好臉上再有道疤,活活美死。而由亂入治,公共審美一定趨於女性化。最典型的就是魏晉南北朝,這時期的男人,要剃須、薰香、塗胭脂,甚至頭上還插花。

有個南北互飈花美男的故事。大致的情節是這樣的:南方派了一個花美男出使北方,結果都城萬人空巷,北方朝廷一看,心說不能讓人給比下去啊,就也挑了一個小鮮肉出使南方,於是南方都城裡也萬頭攢動。

這個故事我不記得出處了,不過《世說新語》的《容止》篇里隨便挑一條,都不忍直視:

王丞相見衛洗馬曰:「居然有羸形,雖復終日調暢,若不堪羅綺。」

不堪羅綺,羨殺韓國歐巴和國產小鮮肉們。


本文最早发布在公众号:两司马门下走狗

李陵是作死的

| Comments

漢書卷五十四:

陵對:「無所事騎,臣願以少擊眾,步兵五千人涉單於庭。」上壯而許之……

關於李陵的遭遇,多數人從司馬遷身上多少都是知道的:祖上是追殺燕太子丹的秦將李信,祖父是飛將軍李廣,出身將門世家的李陵自然驍武憑陵,以五千步兵力戰十萬匈奴精騎,最後矢盡援絕,不得已才投降。即便對於信仰「文死諫,武死戰」的中國人,多數也是同情的。

然而這個故事主要來自於史記,這就尷尬了。從某種意義上說,李陵是給史記定下基調的人。這就決定了它展示給讀者的不會是故事的全貌。比如很多年前,我第一次看到這個故事的時候就想不明白一個問題:用五千步兵孤軍遠徵遊牧的匈奴,傻子都知道勝算很小,劉徹和李陵的智商同時下線了?

最近讀到漢書的李陵傳,發現了更多有趣的細節。

天漢二年,武帝命二師將軍李廣利出兵三萬攻打在天山的匈奴右賢王,想讓李陵監押輜重。如果把武帝的軍事史濃縮成一句話,那就是劉徹和他的小舅子們。李廣利就是因為裙帶關係上位的,所以將門世家的李陵恥於為其搞後勤,就跟武帝說:「我本部的軍隊都是精銳,希望能單獨出兵一路,這樣可以迫使匈奴人分兵,二師將軍那邊的壓力也會輕一些。」武帝多精啊,一眼就識破李陵的小九九,說:「這次我出兵很多,沒有富余的騎兵給你。」

於是李陵就開始作了,就有了本文開頭的那句話。以少擊眾、步兵打騎兵、孤軍深入,哪一條都是兵家大忌,估計李陵說這句話時頭皮都是硬的。

當然李陵也不是完全沒有資本,漢軍的戰鬥力是超過匈奴人的。硬碰硬的正規戰爭,匈奴人敗多勝少。因為戰爭打的是綜合實力,無論是經濟實力、人口、技術,漢朝都遠超匈奴,即使三歲騎馬五歲彎弓的匈奴人的單兵素質超過漢朝的民兵。

後來的戰事就證明了這一點。首戰浚稽山,匈奴人就損失數千人,漢軍步兵還追著騎兵打。主要原因就是經濟和技術水平的落差太大。匈奴人主要裝備的是弓箭,箭頭是用獸骨和石頭磨成的片狀,漢軍裝備的是連弩,箭頭是金屬質三稜狀,無論在射速、穿透力還是精准度上,前者都遠遠落後於後者。所以轉戰上千里,堅持很多天,直到最後漢軍的箭用完了,匈奴人才在距離邊境五十公里的地方吃掉這支孤軍。換句話說,如果箭量充足,十萬匈奴騎兵都打不過五千漢軍步兵,這個戰力的對比,很明顯吧。

最後不服從領導安排的李陵還是敗了,敗在距離邊境只有五十公里的地方。據說最後的日子里,他還單獨出營一次,理由是想刺殺單于,搞個斬首行動,回來後就徹底喪失了戰鬥意志。我覺得這又是個疑點,是不是想溜啊。


本文最早发布在公众号:两司马门下走狗

改用Bear記筆記

| Comments

再次證明我是後知後覺的。

曾經對印象筆記不屑一顧,因為對所見即所得的偏見和印象筆記對技術人員的不友好。所以這些年一直用DokuWiki。

DW的編輯模式不是傳統的所見即所得,自己的wiki標記簡潔好用。能針對段落進行修改。可以列出大綱。插件和主題較多。使用文件存儲數據,方便同步。平台無關,對Linux友好。

不過DW自身也存在一些問題。比如需要搭建服務、自行處理同步、移動端訪問不便、編輯和查看操作有割裂感。

最近開始琢磨記筆記的最佳實踐。考慮到用DW的痛點,感覺對於記筆記最重要的是是否方便記錄和查看。在這點上,所見即所得的確有優勢。所以我嘗試轉換到這類工具上。

選擇Bear而不是印象筆記的原因主要是:

  • 支持代碼語法高亮
  • 支持導出Markdown格式
  • 極簡風和多種主題

代碼語法高亮是剛需,沒什麼可說的。導出Markdown格式可以方便寫博客,這樣就不需要Cmd Markdown了。極簡的風格和包括Solarized在內的多種主題很毒我。

不過Bear也有不少問題:

  • 標籤只支持兩級,大量標籤不好管理
  • 不支持掃描
  • 對Linux不友好

用標籤替代分類的方式我很喜歡,不過兩級的限制讓筆記分類很傷腦筋,而且容易造成標籤太多、難以管理。掃描也是剛需,印象筆記的掃描就很好用,Bear目前沒有這個功能,只能用掃描全能王暫補,割裂感很強,而且還增加了APP。

希望Bear盡快變得更好用。

JSON是對象還是字符串?

| Comments

前兩天,一個前端跟我爭論說JSON是對象。我在接口文檔里的數據格式寫的是JSON,結果對方真就傳了個對象過來。

要搞清楚JSON是什麼,先得知道JSON是為瞭解決什麼問題的。維基百科里的定義是:

JSON(JavaScript Object Notation)是一種由道格拉斯·克羅克福特構想設計、輕量級的數據交換語言,以文字為基礎,且易於讓人閱讀。儘管JSON是Javascript的一個子集,但JSON是獨立於語言的文本格式,並且採用了類似於C語言家族的一些習慣。

所以說,JSON是為瞭解決語言之間數據交換的一種文本格式,體現在數據上,JSON就是字符串類型。那麼為什麼需要為數據交換制訂一種通用的文本格式呢?可以做一個簡單的試驗:

用JavaScript建立一個到PHP的WebSocket併發送一個對象:

1
2
var ws = new WebSocket('ws://127.0.0.1:4759');
ws.send({name:"hello"});

PHP接收並打印對象:

1
2
3
4
5
6
use Workerman\Worker;
$worker = new Worker('websocket://0.0.0.0:4759');
$worker->onMessage = function($connection, $data) {
        var_dump($data);
}
Worker::runAll();

得到的結果是:

[object Object]

所以,一種語言的對象的實例以二進制形式直接傳遞給另一種語言是無法識別的,因此需要把對象數據用文本描述之後再行傳遞。

此外,相對於XML等其它格式,JSON有可讀性上的優勢,如果是對象,二進制的數據哪來的可讀性?