Archive for August, 2013

给小乐讲万历十五年之海瑞(五)

海瑞在每个人的印象中都是个大清官,不过清官也非完人,在《万历十五年》中也说到了海瑞的家庭八卦。

海瑞在被迫退休回到原籍闲居,如果有一个美好的家庭生活,也许还多少能排遣这空虚和寂寞。然而海瑞没有能在这方面得到任何安慰。他曾经结过三次婚,又有两个小妾。他的第一位夫人在生了两个女儿以后因为和婆婆不和而被休。第二位夫人刚刚结婚一月,也由于同样的原因而逐出家门。第三位夫人则于1569年在极为可疑的情况下死去。第三位夫人和小妾一人先后生过三个儿子,但都不幸夭折。按照传统观念,不孝有三,无后为大,这是海瑞抱恨终天的憾事之一。

海瑞是忠臣,又是孝子。他3岁丧父,孀居的母亲忍受着极大的困难把他教养成人。她是他的抚养者,也是他的启蒙者。在海瑞没有投师就读以前,她就对他口授经书。所以,历史学家们认为海瑞的刚毅正直,其中就有着他母亲的影子。(据说海瑞三四十岁还和母亲睡在一个房间)可见海太夫人又是造成这个家庭中种种不幸事故的重要因素。

当海瑞离开南直隶的时候,她已经度过了80寿辰。而出人意外的是,海瑞的上司只是呈请皇帝给予她以四品夫人的头衔,而始终没有答应给她以另外一种应得的荣誉,即旌表为节妇,是不是因为她的个性过强,以致使他的儿子两次出妻?又是不是她需要对1569年的家庭悲剧承担责任?海瑞虽然可以极容易地从伦常纲纪中找出为他母亲和他自己辩护的根据,然而这些根据却不会丝毫增加他家庭中的和睦与愉快。

离职的巡抚已经走到了生命中退无可退的最后据点。他必须忘却别人加之于他的侮辱,克服自己的寂寞和悲伤。他失望,然而没有绝望。他从孔子的训示中深深懂得,一个有教养的人必须抱有任重道远的决心。老骥伏枥,志在千里,他虽然闲居在贫瘠的乡村,屋子里挂着的立轴上,却仍然是“忠孝”二字。

海瑞在1585年被重新起用。他不加思索地接受这一任命,无疑是一个不幸的选择。这一次,他就真的走到了生命的终点和事业的最低点。在最后的两年间,万历皇帝亲自做出结论:“海瑞屡经荐举,故特旨简用。近日条陈重刑之说,有乖政体,且指切朕躬,词多迂戆,朕已优容。”

“迂戆”,海瑞由失望而终于绝望,7次提出辞呈,但每次都没被批准,国家还需要他摆摆样子。最后在接近1587年年底亦即万历十五年丁亥的岁暮,海瑞的死讯传出,无疑使北京负责人事的官员大大地松了一口气,因为他们再也用不着去为这位大众心目中的英雄——到处惹事生非的人物去操心作安排了。

===== 欢迎关注父与女[fuyunv] =====
欢迎分享给更多朋友,点击右上角,【发送给朋友】或【分享到朋友圈】。
新浪微博:xbin999
网站地址:http://xbin999.com

, ,

Leave a comment

学习一下git(一)

看ruby和写代码的时候,很难离得开git )和github,所以让自己也系统地看一下。

git )是一个分布式的版本控制和源代码管理系统,最开始是由Linus Torvalds为linux内核开发而设计实现的。

传统的版本控制管理,象CVS,SVN一般都会有一个中心服务器,本地check out代码,然后修改,提交合并代码,但这样的问题是依赖于中心服务器。而对于分布式版本控制系统则在本地都有完整的代码仓库,任何一台服务器发生故障,都可以使用镜像的本地仓库恢复。

git很大的一个特点是对于文件保存完整的数据,而非文件的增量差异,在不同版本时对于没有变化的文件不再保存,而仅做一个链接。

Git保存更新时的文件快照

由于其分布式的特点,每台机器上都是一个仓库,所以基本上操作都在本地,包括往库里提交修改、版本差异比较、查看更新日志等等。

对于git来说,任何一个文件流转过程中都存在三种状态:

  • 已提交(committed),表明文件已经提交到本地仓库中。
  • 已修改(modified),表明文件已经修改,但未提交。
  • 已暂存(staged),表明已修改的文件放在下次提交时要保存的清单中。

所以对于本地工作时,git有三个工作区域:git的工作目录,git本地仓库和暂存区域,一般在工作目录中会有一个.git目录,其中就保存了元数据和对象数据库,而暂存区域文件(index索引文件)也放在.git目录中。对于理解暂存区的作用,worldhello上有一篇很好的文章和一个图,引用一下:
git work area

如果我修改一个文件,增加一行”in stage”,然后使用git add 保存到暂存区,之后再增加一行”in work directory”,git status查看状态:


➜  /Users/yangbin/tmp/gittest git:(master) >git status -s
➜  /Users/yangbin/tmp/gittest git:(master) >git add yun.txt
➜  /Users/yangbin/tmp/gittest git:(master) ✗ >echo "in stage" >> yun.txt
➜  /Users/yangbin/tmp/gittest git:(master) ✗ >git status -s                        
M  yun.txt
➜  /Users/yangbin/tmp/gittest git:(master) ✗ >echo "in work directory" >> yun.txt
➜  /Users/yangbin/tmp/gittest git:(master) ✗ >git status -s
MM yun.txt

此时工作区、暂存区和本地仓库yun.txt文件的内容各不相同,可以使用:

  • git commit yun.txt 提交暂存区的内容到本地仓库,也就是增加“in stage”;
  • git rm — cached yun.txt 直接从暂存区删除内容,工作区不变;
  • git checkout . yun.txt 使用暂存区文件更新工作区文件;
  • git chekcout HEAD yun.txt 使用本地仓库文件更新工作区和暂存区文件。

当然我们要使用git一般都是从git init 和git clone开始的,这个下次再说。

, , ,

1 Comment

给小乐讲万历十五年之海瑞(四)

听说海瑞要来南直隶,南直隶的很多地方官就自动离职或请求他调。而缙绅之家也纷纷把朱漆大门改漆黑色,不要太炫人眼目。驻在苏州的一个宦官把他的轿夫由8人减至4人。新巡抚大人声势之迅猛,足以使人震慑。

海瑞下车伊始,就把他的“督抚条约”三十六款在所治各府县公布。条约规定:

  • 境内成年男子一律从速结婚成家,不愿守节的寡妇应立即改嫁,溺杀婴孩一律停止。(好猛啊!)
  • 巡抚出巡各地,府县官不得出城迎接,但巡抚可以传询耆老听取他们的控诉。
  • 巡抚在各府县逗留,地方官供给的伙食标准为每天纹银二钱至三钱,鸡鱼肉均可供应,但不得供应鹅及黄酒。(够细的)
  • 境内的公文,今后一律使用廉价纸张;过去的公文习惯上在文后都留有空白,今后也一律废止。(太节约了)
  • 自条约公布之日起,境内的若干奢侈品要停止制造,包括特殊的纺织品、头饰、纸张文具以及甜食。

这些规定有的太细,本来就会生问题,不过海瑞最后的垮台,是因为他干预了境内的农田所有权所致。

明朝中叶土地问题十分尖锐,高利贷者利用地方上的光棍青皮大量放款于自耕农,利率很高,被迫借款者大多不能偿还。一旦放款的期限已到而又无力偿还,其所抵押的土地即为放款者所占有。海瑞下决心改变这种状况,希望限制富户过多地占有土地、缩小贫富差别。这种冲动使他一往直前,义无反顾。因此,他毫不犹豫地接受了大批要求退田的申请。

海瑞卷入了大量这样的纷争之中,孤军奋斗,以个人而对抗强大的社会力量,加之在具体处理这些诉讼的时候又过于自信,既没有对地方上的情形作过周密的考察,也没有宣布法律的准则,更没有建立专门的机构去调查案情、听取申辩以作出公正的裁决,海瑞的不能成功已不待言而自明。

要求罢免海瑞的奏疏连续送达御前。吏部根据各种参劾的奏疏提出意见,说南直隶巡抚海瑞实为“志大才疏”,应该调任闲曹。一年之前没有人敢于非议这位朝廷上最正直的忠臣,一年之后他却成了众矢之的;一年之前文渊阁和吏部还因为海瑞的抗议,对他另眼相看,一年之后他们却建议皇帝让他去重新担任不负实际责任的官职。于是愤愤不平的海瑞终于在1570年春天被迫辞职回乡,在提出辞职的奏疏中,他痛斥“举朝之士,皆妇人也”。这也使他在文官集团中失去了普遍的同情。

欢迎订阅讲述我和小乐成长中故事的微信账号: fuyunv。 

, ,

Leave a comment

给小乐讲万历十五年之海瑞(三)

海瑞给皇帝上了个奏疏,把嘉靖皇帝狠狠地骂了一顿,一开始并没有受到惩罚。不过到了1566年2月底,嘉靖左思右想,气愤难平,终于下令锦衣卫把海瑞逮捕到东厂禁锢。

海瑞就在狱中住了10个月。有一天,狱中忽然设酒肴相待。海瑞以为这是临死前的最后一餐,他神色不变,饮食如常。结果提牢主事悄悄告诉他,皇帝业已升天,新君不日即位,你老先生乃是忠臣,一定会得到重用,海瑞听罢,立刻放声号哭;号哭之余,继以呕吐。

1567年年初隆庆皇帝登极,海瑞被释出狱。出来后,对他的安排倒是成了文渊阁大学士和吏部尚书的一个难题。一方面他的声望已为整个帝国所公认。他当然是极端的廉洁,极端的诚实,但另一方面也可能就是极端的粗线条,极端的喜欢吹毛求疵。你说该拿海瑞怎么办呢?比较稳妥的办法就是把他养着,让他升官却不让他负实际的责任。于是,在不长的时期内,他历任尚宝司丞、大理寺右寺丞、左寺丞、南京通政司右通政,官至正四品。

但象海瑞这样的人是闲不住的,于是1569年年初的京察,海瑞在奏折中说:陛下既然赦免了我的死罪,又对我破格擢升,在所有的文臣之中,没有一个人会比我更加迫切地要求报答陛下的恩典。接着,他谦虚地声称自己才浅识疏;又接着,他表示自己现任的职务只是专管查看呈奏给皇帝的文书,看罢以后原封发送,既无财政责任,又用不着下左右全局的决心,但是连这样的一个位置还不称所职,不如干脆把我革退算了。

问题是没人敢把海瑞罢免掉,无奈之下文渊阁和吏部终于向他低头。当年复天,海瑞被任命为南直隶巡抚,驻扎苏州。

“知道直隶是哪里吗?”

“不知道。”

印象中直隶是在北方,直隶其实是指直属京师之地。明朝洪武元年(1368年)建都「南京」(后改称京师,永乐初年复改南京。在今南京市),以应天府等府为直隶。永乐初年移都「北京」(今北京市)後,又称直隶于北京的地区为北直隶,简称北直,相当于今北京、天津两市、河北省大部和河南、山东的小部地区;直隶于南京的地区称为南直隶,简称南直,相当于今江苏、安徽、上海。民国十七年(1928年)改直隶省名为河北省。

欢迎订阅讲述我和小乐成长中故事的微信账号: fuyunv。 

, ,

Leave a comment

给小乐讲万历十五年之海瑞(二)

海瑞以举人出身而进入仕途,开始被委任为福建一个县的儒学教授,任期4年。到1558年升任浙江淳安知县的时候,他已经45岁。

而在淳安的时候有三个很有名的故事,或者说是轶事:

  • 一是说胡宗宪胡总督的儿子道经淳安,作威作福,结果被海瑞拘捕,押解至总督衙门。而海瑞在呈报总督的公文内声称此公子必属假冒,总督大人节望清高,不可能有这样的不肖之子,让总督吃了个哑巴亏。
  • 二是说海瑞对付钦差大臣鄢懋卿,当时钦差都是沽名钓誉,先发个通令,说什么本院“素性简朴,不喜承迎”,说的比唱的好听。海瑞倒是毫不含糊,钦差还没到淳安,海瑞的禀帖就送上了,把通令的内容先引用一遍,然后要求钦差大人要摒弃奢华的排场和搜刮,并且说,要不这样就无法做到公事公办,完成皇上委托的任务。据说,鄢懋卿接到禀帖以后,就没有敢进入淳安,而是绕道他去。
  • 第三个小乐最喜欢听了。我每次说的时候也是新闻特别播报。总督胡宗宪特别播报,特别播报,海瑞今天买了两斤猪肉。海瑞今天给老母做寿,大摆宴席,买猪肉啦!

这些小故事固然都很有名,但真正表现他胆略的是在1565年,当时嘉靖皇帝已经御宇40年,他的主要兴趣就是长生不死,炼丹。

“那海瑞经过了三个皇帝,嘉靖,隆庆和万历。”
“是的,两个还是特别长久的皇帝。”

阳历11月,海瑞向嘉靖递上了著名的奏疏。奏疏中指出,他是一个虚荣、残忍、自私、多疑和愚蠢的君主,举凡官吏贪污、役重税多、宫廷的无限浪费和各地的盗匪滋炽,皇帝本人都应该直接负责。皇帝陛下天天和方士混在一起,但上天毕竟不会说话,长生也不可求致,这些迷信统统不过是“系风捕影”。然而奏疏中最具有刺激性的一句话,还是“盖天下之人不直陛下久矣”,就是说普天下的官员百姓,很久以来就认为你是不正确的了。

这样的奏疏确乎是史无前例的。嘉靖皇帝读罢奏疏,其震怒的情状自然可想而知。传说他当时把奏折往地上一摔,嘴里喊叫:“抓住这个人,不要让他跑了!”

结果旁边一个宦官为了平息皇帝的怒气,就不慌不忙地跪奏:“万岁不必动怒。这个人向来就有痴名,听说他已自知必死无疑,所以他在递上奏本以前就买好一口棺材,召集家人诀别,仆从已经吓得统统逃散。这个人是不会逃跑的”。嘉靖听完,长叹一声,又从地上捡起奏本一读再读。

, ,

Leave a comment

brew,gem,rvm and bundler

brew,gem,rvm 和 bundler都是软件包的管理工具,搞过来搞过去,有点晕,需要理理。

brew是OS X上提供软件包的管理。Homebrew将软件包安装到单独的目录,然后符号链接到/usr/local 中,完全基于git和ruby。使用gem来安装你的gems,用brew来搞定他们的依赖包。brew的安装:


ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)"

RubyGems是一个包管理框架,提供了ruby社区gem的托管服务,用于方便地下载、安装和使用ruby软件包。ruby软件包被称为”gem”,包含了ruby应用或库。要升级到最新的RubyGems,运行:


$ gem update --system

如果没有安装RubyGems,则需要先下载安装包,然后解压开后运行ruby setup.rb。

gem常用的命令有search, install, list, uninstall。如果要看安装的gem文档,一是可以用ri,二是可以gem server启动一个web服务。详细的帮助参见RubyGems Guides

brew和gem不同,brew用于操作系统层面上软件包的安装,而gem只是管理ruby软件。

RVM(Ruby enVironment (Version) Manager)是一个命令行工具,提供在多个ruby环境中方便的安装、管理和工作,包括解释器和gem集合。rvm自己的安装通过curl命令执行,如:curl -L https://get.rvm.io | bash

RVM有一个非常灵活的gem管理系统,称为Gem Sets。RVM的’gemsets’管理横跨多个Ruby版本的gems包。

采用rvm安装ruby:


$ rvm list known
$ rvm install 1.9.3
$ rvm use 1.9.3

Bundler为ruby维持一个一致性的环境,跟踪应用代码和所需要的ruby gems,这样一个应用可以有所需要的精确的gems(和版本)。

$ gem install bundler

安装的顺序,先安装rvm,之后选择安装一个ruby版本,就可以提供一个完整的ruby运行环境。之后可以安装brew(brew虽然是管理os的,但基于ruby)和gem,分别管理操作系统和ruby的软件包。之后ruby重新编译的时候所依赖的包可以使用brew安装。有了gem之后,bundler只不过就是一个gem,直接通过gem install 即可。

, ,

Leave a comment

ruby p vs puts

代码的时候看到了 p “*” * 80 + “validated” ,心想这个p是啥玩意,为啥不用puts啊?

细看一下还有点讲究,p是个Kernel方法,p打印的是inspect方法,而不是to_s,更适合与调试。比如 1, “1” and “2\b1″的区别,用puts输出的全是1,而p则能输出内部结构


1.9.3p125 :055 > puts 1, "1", "2\b1"
1
1
1
 => nil 
1.9.3p125 :056 > p 1, "1", "2\b1"
1
"1"
"2\b1"
 => [1, "1", "2\b1"] 
 

What is “p” in Ruby?还说到了一个poetry mode,写Ruby方法调用参数时不使用括号,不是很理解。

优酷上有段视频“HASHES AND POETRY MODE
,”poetry mode”是指:

  • using hashes to pass “keyword-like” arguments
  • omit hash braces when last argument to function is hash
  • omitting parens around function arguments

主要的目的还是在不引起歧义的情况下,去掉hash的{}和函数参数的(),使得代码阅读更象句子。看示例就很清楚:


link_to("Edit", {:controller=>'students', :action=>'edit'})
link_to 'Edit', :controller=>'students', :action=>'edit
link_to 'Edit', controller: 'students', action: 'edit

(redirect_to(login_page)) and return() unless logged_in?
redirect_to login_page and return unless logged_in?

BTW. 还可以用”*” * 80,这个比我上次写(all-depth).times {print ” “} 就要优雅多了。

, ,

Leave a comment

xml-rpc

XML-RPC 是互联网上的一种远程过程调用协议,采用http+xml的方式。XML-RPC消息是一个HTTP-POST请求,请求报文是XML,而服务端调用返回的报文也采用XML格式。

XML-RPC支持的数据类型有:int, string, boolean, double, dateTime.iso8601, base64, array, struct。如果不指定类型,缺省为string。

返回报文正常情况都是200 OK,比如:


HTTP/1.1 200 OK
Connection: close
Content-Length: 158
Content-Type: text/xml
Date: Fri, 17 Jul 1998 19:55:08 GMT
Server: UserLand Frontier/5.1.2-WinNT

<?xml version=”1.0″?>
<methodResponse>
<params>
<param>
<value><string>South Dakota</string></value>
</param>
</params>
</methodResponse>
</code></pre>

Ruby 很好地提供了对XML-RPC的支持,直接require "xmlrpc",分别有clientserver。一个简单的例子:

server 端,new创建一个实例,并在指定端口侦听,serve在增加了处理器后启动服务,处理XML-RPC请求并响应。


require "xmlrpc/server"

s = XMLRPC::Server.new(7777)
s.add_handler("michael.add") do |a,b|
  a + b
end

s.serve

client 端采用call调用方法,第一个参数是方法名,之后跟着方法需要的参数。


require "xmlrpc/client"

server = XMLRPC::Client.new("localhost", "/RPC2", 7777)
begin
  param = server.call("michael.add", 4, 5)
  puts "4 + 5 = #{param}"
rescue XMLRPC::FaultException => e
  puts "Error:"
  puts e.faultCode
  puts e.faultString
end

WordPress提供了XML-PRC的支持,从WordPress 3.5起就默认支持XML-RPC功能,详细的API参见XML-RPC WordPress API,采用wp.接口取代了Blogger, MovableType和metaWeblog接口。

, ,

Leave a comment

列出数据量大的文件或目录

一不小心发现机器的磁盘空间差不多用满了,空间紧张啊,虽然可以用du查看各个目录占用的情况,再进行清理,但往往需要一层层去查找占用空间最大的目录,比较累人。所以用ruby练练手,写了个递归便利目录中大的文件和目录,可以设定参数如下:


Usage: mydu [options] directory
Specific options:
    -d, --depth [depth]              Search directories depth
        --dsize [dsize Mbyte]        Directory size limit to display
        --fsize [fsize Mbyte]        File size limit to display
    -h, --help                       Display this message

代码也比较简单,有几点注意的:

  • %x(du -sm \’#{dir}\’/*) 执行os命令,注意dir用引号引起,防止特殊字符,而/在引号外面,否则特殊字符也会使得目录名无效。
  • 把目录和大小丢进hash,直接sort.reverse即可倒序排。
  • line.split(‘ ‘, 2) 也是防止带空格的目录名,保证后面的都作为第二个元素,得到完整的目录名。

详细代码如下:


require 'optparse'

def du(dir, all, depth, dsize, fsize)
    return if depth = dsize
            (all-depth).times {print "  "}
            puts "[d], #{k}, #{v}"
            du("#{v}", all, depth - 1, dsize, fsize) 
        end
        if File.file?("#{v}") && k >= fsize
            (all-depth).times {print "  "}
            puts "[f], #{k}, #{v}"
        end
        size += k
    }
    (all-depth-1).times {print "=="}
    puts "#{dir} size is #{size}M."
end

options = {}
optparse = OptionParser.new do|opts|
    opts.banner = "Usage: mydu [options] directory"
    opts.separator "Specific options:"
    options[:depth] = 2
    opts.on( '-d', '--depth [depth]', Integer, 'Search directories depth' ) do|depth|
        options[:depth] = depth
    end
    options[:dsize] = 1024
    opts.on( '--dsize [dsize Mbyte]', Integer, 'Directory size limit to display' ) do|dsize|
        options[:dsize] = dsize
    end
    options[:fsize] = 200
    opts.on( '--fsize [fsize Mbyte]', Integer, 'File size limit to display' ) do|fsize|
        options[:fsize] = fsize
    end
    opts.on( '-h', '--help', 'Display this message' ) do
        puts opts
        exit
    end
end

optparse.parse!(ARGV)
du(ARGV[0], options[:depth], options[:depth], options[:dsize], options[:fsize])

, ,

1 Comment

给小乐讲万历十五年之海瑞(一)

周末回了趟老家,昨晚小乐问我:“爸爸,今天讲什么呀?”
我说:“继续讲万历。”
“你又没带书。”
“哈哈,咱有kindle呀!”

有kindle确实还是挺方便的,下一堆书,随时可以拿起翻看,基本我们在外面逛的时候都不用带什么书了。

“爸爸,那今天给我讲海瑞吧。”看来小家伙对海瑞情有独钟,最早讲万历十五年就是从说海瑞开始的,结合着去千岛湖的海公祠来说。不过在父与女中倒一直没怎么说海瑞的故事,这次分段说说。

海瑞从政20多年的生活,充满了各种各样的纠纷。他的信条和个性使他既被人尊重,也被人遗弃。这就是说,他虽然被人仰慕,但没有人按照他的榜样办事,他的一生体现了一个有教养的读书人服务于公众而牺牲自我的精神,但这种精神的实际作用却至为微薄。

小乐说:“海瑞是要给他封一个大官,但是又不让他做事的,因为他做事总是和别人…”

“不合拍。”

这里还是之前说的法律和道德的关系。海瑞充分重视法律的作用并且执法不阿,但是作为一个在圣经贤传培养下成长的文官,他又始终重视伦理道德的指导作用。他在著作中表示,人类的日常行为乃至一举一动,都可以根据直觉归纳于善、恶两个道德范畴之内。他说,他充当地方的行政官而兼司法官,所有诉讼,十之六七,其是非可以立即判定。只有少数的案件,是非尚有待斟酌,这斟酌的标准是:

“凡讼之可疑者,与其屈兄,宁屈其弟;与其屈叔伯,宁 屈其侄。与其屈贫民,宁屈富民;与其屈愚直,宁屈刁顽。 事在争产业;与其屈小民,宁屈乡宦,以救弊也。事在争言 貌,与其屈乡宦,宁屈小民,以存体也。”用这样的精神来执行法律,确实与“四书”的训示相符合。可是他出任文官并在公庭判案,上距“四书”的写作已经两千年,距本朝的开国也已近两百年。与海瑞同时的人所不能看清楚的是,这一段有关司法的建议恰恰暴露了我们这个帝国在制度上长期存在的困难:以熟读诗书的文人治理农民,他们不可能改进这个司法制度,更谈不上保障人权。法律的解释和执行离不开传统的伦理,组织上也没有对付复杂的因素和多元关系的能力。

所以海瑞的一生经历,就是这种制度的产物。其结果是,个人道德之长,仍不能补救组织和技术之短。

欢迎订阅讲述我和小乐成长中故事的微信账号: fuyunv。 

, ,

Leave a comment