奇怪的決戰

| Comments

前兩天讀史記王翦列傳,覺得秦楚的決戰很奇怪。

王翦果代李信擊荊。荊聞王翦益軍而來,乃悉國中兵以拒秦。王翦至,堅壁而守之,不肯戰。荊兵數出挑戰,終不出。王翦日休士洗沐,而善飲食撫循之,親與士卒同食。久之,王翦使人問軍中戲乎?對曰:「方投石超距。」於是王翦曰:「士卒可用矣。」荊數挑戰而秦不出,乃引而東。翦因舉兵追之,令壯士擊,大破荊軍。至蘄南,殺其將軍項燕,荊兵遂敗走。秦因乘勝略定荊地城邑。歲余,虜荊王負芻,竟平荊地為郡縣。

稍微有點軍事常識就知道,防守方最好的辦法是堅守不戰,在自己的地盤上,對方的後勤補給要比自己困難得多,一旦補給不繼,軍心必亂,勢必撤兵,這時候再追上去打,勝算很大,也就是所謂以逸待勞。比如秦趙長平之戰,一開始,廉頗先用小股部隊跟秦軍接觸,一看打不贏,馬上收縮防線,避免決戰,搞得秦軍進也不是、退也不是,軍力損耗極大,不得以只好用反間換掉廉頗。

所以戰爭中的進攻方是處於劣勢的,要扭轉不利的態勢,就要把主動權握在自己手裡,所以一般會用反客為主的辦法。雖然我是進攻方,但我不著急進攻你,讓你自己沈不住氣來打我,這時候攻守易形,我成了防守方,你成了進攻方,形勢就對我有利了。

所以王翦反客為主是正常的,項燕急著打就很奇怪了。老項家累世將門,項燕沙場宿將,不可能連常識都不懂。

也許唯一合理的解釋是楚國國力衰敗,撐不下去了。

以前秦國伐楚很困難,因為楚國西有江漢之險,北有諸夏扞蔽。不過自白起破鄢郢,江漢天險盡失;自三晉覆滅,中原逐鹿之勢已成。秦國伐楚,後勤補給已經不是問題。

另外,讓秦國擁有支持百萬級滅國戰役能力的,還有伐蜀的決策。自商君變法,秦國勢平地起飛,此後相當長的一段時間,秦國雖說是戰國首強,但也不能佔據壓倒性的優勢,直到秦滅六國前的三十年,還有信陵君收天下之兵扣關攻秦的事。戰爭不是戰鬥,決定成敗的主要還是國力。李信的二十萬大軍覆滅後,秦國可以馬上再把六十萬人送上前線,這個國力,不贏沒有天理。所以司馬錯論伐蜀,同時擁有關中、蜀中兩塊天府之國,是秦國國力質變的關鍵。

這個時候的楚國,已經是冢中枯骨。在秦國連年的攻勢下,大片國土淪喪,鄢郢破而遷陳,三晉亡而遷壽春,幾十年間,顛沛流離,沒有喘息的機會,靠吃戰略縱深的老本苟延殘喘。所以在這次決戰之前,可能國力已經難以為繼了,但是楚國自己也知道八百年國運繫於這一戰,所以不得不起傾國之兵應戰。空虛的國力和浩大的戰爭消耗最終迫使項燕選擇速戰速決,戰還有一線生機,不戰只能坐以待斃。

Alfred-pushbullet: Push a Text to Your Phone

| Comments

Pushbullet workflow for Alfred.

Features

  • Push a text to another device.

Installation

  1. Download the latest release and rename it to pushbullet.alfredworkflow.
  2. Double click it to import it into Alfred.
  3. Double click the “Run Script” button and replace “ACCESS_TOKEN” and “DEVICE_NAME” according to your pushbullet settings.
  4. Activate alfred and input “push blablabla”, then press enter.

Author

base64decode IkRvbmllIExlaWdoIiA8ZG9uaWUubGVpZ2hAZ21haWwuY29tPgo=

Download

https://github.com/xbot/alfred-pushbullet/

Linux下做Mac OSX安裝U盤的步驟

| Comments

假設U盤對應/dev/sdb1、OSX安裝包是osx.dmg。整個過程就是提取出一系列文件,然後複制到U盤裏。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 格式化U盤爲hfs+文件系統
sudo mkfs.hfsplus -v EICaptianInstall /dev/sdb1

# 提取和挂載第一個光盤鏡像
dmg2img -p 5 osx.dmg osx.img
mkdir raw && sudo mount -o loop osx.img raw

# 提取和挂載第二個光盤鏡像
dmg2img -p 5 raw/Install\ OS\ X\ El\ Capitan.app/Contents/SharedSupport/InstallESD.dmg InstallESD.img
mkdir esd && sudo mount -o loop InstallESD.img esd

# 提取和挂載第三個光盤鏡像
dmg2img -p 4 esd/BaseSystem.dmg BaseSystem.img
mkdir base && sudo mount -o loop BaseSystem.img base

# 挂載U盤
mkdir usb && sudo mount /dev/sdb1 usb

# 複制一系列文件
sudo cp -r base/* usb/
sudo rm usb/System/Installation/Packages
sudo cp -r esd/Packages usb/System/Installation/
sudo cp esd/BaseSystem.* usb/

注意dmg2img的參數-p表示提取dmg的第幾個分區,似乎不同的OSX版本提取哪個分區也不一樣,判斷方法就是先執行dmg2img osx.dmg,看哪個分區提取得最慢就選哪個。

FastFold:Vim折疊功能的救贖

| Comments

設置Vim的折疊規則爲syntax存在兩個問題。一是如果源碼中有大量折疊區域,在插入模式中輸入會變得很卡。二是剛輸入一個折疊區域的起始符号,後面所有的折疊都會被打開。

第一個問題是因爲Vim的syntax折疊規則處理過于低效。而後一個問題對于所有自動折疊規則都會存在,原因是Vim對折疊的更新過早。

傳統的解決辦法是将折疊規則置爲manual,并在合适的時機重置爲syntax或其它相應規則。但是工作繁複而且往往問題很多。

FastFold是遵循上面所說的方法解決這些問題的插件,不過默認會在所有與折疊相關的時機更新折疊,會導緻相關的操作變慢,例如zc和zo時都會有明顯的卡頓。鑒于其它時機對折疊的更新已經足夠及時,可以通過配置取消受在到明顯影響的時機更新折疊:

1
2
" FastFold隻在za/zA/zx/zX時更新折疊信息
let g:fastfold_fold_command_suffixes =  ['x','X','a','A']

FZF: 又一個文件模糊查詢工具

| Comments

fzf是個獨立的命令行工具,索引速度很快,可以通過fzf-vim配合使用。

特性

功能支持還是比較全的:

—————–+——————————————————————-
Command | List
—————–+——————————————————————-
Files [PATH] | Files (similar to :FZF )
GitFiles | Git files
Buffers | Open buffers
Colors | Color schemes
Ag [PATTERN] | {ag}{5} search result (ALT-A to select all, ALT-D to deselect all)
Lines | Lines in loaded buffers
BLines | Lines in the current buffer
Tags | Tags in the project ( ctags -R )
BTags | Tags in the current buffer
Marks | Marks
Windows | Windows
Locate PATTERN | locate command output
History | v:oldfiles and open buffers
History: | Command history
History/ | Search history
Snippets | Snippets ({UltiSnips}{6})
Commits | Git commits (requires {fugitive.vim}{7})
BCommits | Git commits for the current buffer
Commands | Commands
Maps | Normal mode mappings
Helptags | Help tags [1]
—————–+——————————————————————-

結論

fzf需要在終端中執行,在vim中使用時需要另外啓動一個xterm實例,UI的割裂感很強,而且xterm本身的操性你懂的。另外Tags模式需要兩次回車。所以暫不會用它取代ctrlp和unite。

Ctags vs Gtags vs Phpctags

| Comments

這兩天把源碼分析工具從ctags向gtags遷移,另外嘗試了一下phpctags。

之前用ctags有兩個問題,一個是如果同一tag有多個定義,按Ctrl+]隻能跳轉到第一處。另一個是用cscope查詢tag的調用記錄時,有些tag查不到結果。

幾年前接觸過gtags,因爲當時還不支持宇宙最好語言,所以沒用。這次測試了一下,前面兩個ctags的問題都可以解決。

安裝後需要手工拷貝gtags.vim和gtags-cscope.vim到vim的plugin目錄,然後配置如下:

1
2
3
4
5
6
7
let Gtags_Close_When_Single = 1
let Gtags_Auto_Update = 0
let g:cscope_silent = 1
au FileType php,python,c,cpp,javascript,go map <C-]> :Gtags<CR><CR>
au FileType php,python,c,cpp,javascript,go map <C-[> :Gtags -r<CR><CR>
nnoremap <leader><C-]> :execute 'Unite gtags/def:'.expand('<cword>')<CR>
nnoremap <leader><C-[> :execute 'Unite gtags/ref:'.expand('<cword>')<CR>

其它選項參見前面兩個文件裏的注釋。

另外嘗試了一下phpctags,據說和ctags兼容并對php做了優化。實際使用效果和ctags沒發現有什麽區别,不過tagbar-phpctags倒是比tagbar用ctags時效果更好。

CtrlP vs Unite vs Command-T vs FuzzyFinder

| Comments

簡述

Sublime在文件打開速度上的表現很驚豔,Vim有幾個擴展可以實現類似功能,本文對這些擴展做個對比。

雖然每個擴展都或多或少地實現了一些功能,我個人用得最多的也就文件、Tag、Buffer Tag的模糊查找這三個,像MRU、buffer之類的查找不覺得有多大用處,所以提高工作效率的工具一定是在熱度環節有很好表現,其餘偏門功能可以交給插件實現,在這點上CtrlP和Unite做得很好。所以下面針對最常用的這三個功能做下對比,更多功能的對比見下表:

文件模糊查找

Command-T的文件索引速度最快,各方面在這幾個擴展中的表現都是最好的。

CtrlP默認使用VIM自建的globpath(),需要手工配置使用ag以獲取更快的速度,據說使用find命令效率更高,實際感覺和ag差别不大。

Unite也需要手工設置使用ag,而且可以實現異步索引,在這一點的體驗上好于前兩個,但是在模糊匹配的排序上表現不好,比如輸入“php”,當然希望“/etc/php.ini”這樣的結果排在“/home/peter/host/tmp.txt”前面,實際往往不是這樣,Unite的幾個sorter裏,數rank的排序結果最接近于這個要求,但是表現仍然不如前兩個。

Tag模糊查找

三個擴展都是通過ctags實現,雖然Unite的排序問題仍然存在,對于Tag這麽簡短的東西,問題不大。

Buffer Tag模糊查找

CtrlP的表現是最好的。

Unite需要通過unite-outline這個source實現,但是隻能列出類和方法,無法定制列舉類型。而且默認選中排在第一位的類名,查詢方法時很不方便。

Command-T不支持此功能。

我的選擇

FuzzyFinder是該類擴展裏的老前輩,不過早已不維護,功能上不比其它幾個出彩。Command-T雖然在文件索引速度上表現最好,但是優勢并不很明顯,而且支持功能最少。所以排除這兩個。

在最常用的三個功能上,CtrlP的綜合表現是最均衡的,所以留下它。Unite本身是一種統一的交互方式和界面,很多擴展(source)可以實現五花八門的功能,像unite-outline雖然在Buffer Tag上表現不佳,對于Markdown和Vim文檔還是很有用的。

Update: 2016-02-01

FZF: 又一個文件模糊查詢工具

簡化Vim Addons Manager安裝擴展的操作

| Comments

相對Sublime的Package Control,VAM安裝和卸載擴展的操作很煩瑣。以下腳本在安裝完擴展後自動註冊,無須手工添加到vimrc,另外增加命令:UninstallAddons,從註冊表中刪除擴展。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
set runtimepath+=~/.vim/addons/vim-addon-manager
let active_addons = []
let s:vamRegistryFile = expand('~').'/.vim/vam_registry'
if filereadable(s:vamRegistryFile)
    let active_addons += readfile(s:vamRegistryFile)
endif
call vam#ActivateAddons(active_addons)
" Addon post-install hook.
fun! MyAddonPostActivateHook(info, repository, pluginDir, opts)
    if filereadable(s:vamRegistryFile)
        let regLines = readfile(s:vamRegistryFile)
        call add(regLines, a:repository.name)
        call sort(regLines)
        call uniq(regLines)
    else
        let regLines = [a:repository.name]
    endif
    call writefile(regLines, s:vamRegistryFile)
endfun
let g:vim_addon_manager.post_install_hook_functions = ['MyAddonPostActivateHook']
" Complete the addon name.
fun! MyDoActivatedAddonsCompete(...)
    let fullList = keys(g:vim_addon_manager.activated_plugins)
    call filter(fullList, 'v:val =~ ".*'.a:1.'.*"')
    return fullList
endfun
" Remove records of addons from the registry.
fun! MyUninstallAddons(...)
    if filereadable(s:vamRegistryFile)
        let regLines = readfile(s:vamRegistryFile)
    else
        echo "Registry is empty."
        return
    endif
    for addonName in a:000
        let idx = index(regLines, addonName)
        if idx >= 0
            call remove(regLines, idx)
            echo addonName.' is removed from the registry.'
        else
            echo addonName.' cannot be found in the registry.'
        endif
    endfor
    call writefile(regLines, s:vamRegistryFile)
endfun
command! -complete=customlist,MyDoActivatedAddonsCompete -nargs=* UninstallAddons :call MyUninstallAddons(<f-args>)

BiuBiu: A Chrome Extension Which Blocks AJAX Requests

| Comments

BiuBiu

BiuBiu is an extension for Google Chrome Browser which intends to make life easier for debugging and profiling.

For now, it only blocks AJAX requests made by JQuery, more features may be added in the future.

Features

  • Toggle to enable or disable BiuBiu.
  • Block requests made by JQuery by URL.

Author

1
Donie Leigh <donie.leigh at gmail.com>

Links

  • Project: https://github.com/xbot/chrome-biubiu

FAQ

Change Log

version 1.0.1 (2015-12-31)

  • Fix the complaining when there is no jQuery or jQuery.cookie.js loaded in the injected page.

version 1.0.0 (2015-12-30)

  • Initial release.

讀完《春秋左傳注》

| Comments

讀這本書,用了一年時間。前面讀《通鑑》,用了四年,平均一年五本書的節奏,讀盡相斫書的偉大理想不知道這輩子能不能實現了。漢以後的書都好讀,也不一定。

總結一下,主要有兩個心得吧。一個是梳理了一下春秋的脈絡,把以前知道的片斷都連了起來,抓住“蠻夷與戎狄交,中國不絕若線”的大背景,整個春秋時代大家都忙啥呢就清楚了,然後分成三段看,齊桓始霸、晉楚爭霸、吳越爭霸,比從五巨頭切入清晰。第二個是加深了對禮樂文化的認識,貴族時代幹啥都跟鬧著玩似的,反映出我們屌絲的世界太低俗,整本《詩經》就是貴族圈的黑話,搞得我老想叉開去讀《詩經原始》,剁手剁手,不然更看不完了。

讀《通鑑》算是用通史貫穿一下脈絡,《左傳》是第一本讀完的斷代史,本來想接著讀《戰國策》,看了一眼,文章寫得太爛,又是縱橫家的書,所以直接讀《史記》,司馬遷的小說寫得還是不錯的,遷兒哥,我來了!