怎样的社会才是好的社会呢

不知道这篇文章会不会被封掉:独子回家父母已亡:疑14年未从沪回浙 见尸首笑了。读完之后,有深深的无力感。读得很难过,却也理解其中的每一个人。

在中国这个复杂的社会里,每日都会发生很多事情。这些事情,大多数时候,我们都看不见。偶尔有记者窥伺一二,就直刺到人心深处,如这篇文章。可作一公务员考试申论题目:你觉得政府应如何帮助解决养老问题?

中国社会的特色是效率优先。就像下岗一样,牺牲一批弱者(虽然弱者必有可恨之处),成就今天的强大国力。但是你我要用什么样的良心来面对呢?所以可以理解,台湾香港宁愿不要大陆带来的经济发展。所以也可以理解,西藏并不希望受到现代文明的侵袭,宁愿贫穷而幸福。

只是这个理论没法无限外推。如果要公平、道德优先,不说均贫富的共产主义理想了,就说身边所见,墨西哥偷渡美国的人也是很可怜的。但是要不要放他们进来给他们绿卡,花着白人和亚裔中产的纳税养他们一辈子,拉低美国的竞争力和平均教育水平呢(奥巴马移民改革的一赢多输)?

其实古代更惨。饥荒来了饿死人,《浮生六记》里的浪漫,得病依然也是等死的节奏。但是为什么没人质疑社会不公呢?因为古人相信中国古代社会已经和谐到了极致了么?毕竟任何社会都会有穷富之分,贵贱之别,这是不可避免的。在这个前提下,怎样的社会才是好的社会呢?

想来想去,或许只有轮回转世,死后入天堂的理论,才是真正能解脱人痛苦的么?底层人民可以有个来生的盼望,不必畏死;贵族们也心安理得,不必像未成佛的释迦牟尼那样承受内心的煎熬,不知道如何解释世界上无尽的苦。每个人都各得其所。只是在理性、科学、现代民主文明的作用下,这似乎已是不可能的了。

即使不考虑社会公义,那么作为个人,如何面对自己的良心,在这个充满不公和苦难的世界上安心享受相对舒适的生活?安慰自己说,人生来就是要受苦的。还有,这个社会,毕竟是在逐渐进步的。实在不行就说:这个制度太不好了,但这并非我所能改变的。继续努力工作,改进fb的app好了~帮助建造这个可以给人类带来更多欢乐,只有“赞”的完美世界,应该是一件善事吧。

Posted in 学而思 | Leave a comment

PonyDebugger Tutorial: Debugging iOS Apps using Chrome

Pony debugger is a great debugging tool for iOS network traffic and beyond. I’ve met so many pitfalls to get it work, so here is a tutorial summarizing the steps.

Install:

curl -s https://cloud.github.com/downloads/square/PonyDebugger/bootstrap-ponyd.py \
  | python - --ponyd-symlink=/usr/local/bin/ponyd ~/Library/PonyDebugger
source ~/Library/PonyDebugger/bin/activate
pip install -U -e git+https://github.com/square/PonyDebugger.git#egg=ponydebugger \
  --allow-external pybonjour --allow-unverified pybonjour
ponyd update-devtools

Notes:

  • See https://github.com/square/PonyDebugger/blob/master/README_ponyd.rst

  • A copy of src will be at /Users/zxp/Library/PonyDebugger/src/ponydebugger/

  • The real server is at /Library/Python/2.7/site-packages/ponyd-1.0-py2.7.egg/ponyd/

  • ponyd update-devtools downloads http://storage.googleapis.com/chromium-browser-continuous/Mac/152100/devtools_frontend.zip to /usr/local/src/devtools. This will loaded by http://localhost:9000/devtools/devtools.html?host=localhost:9000&page=2

Run

  • Run ponyd serve -v, and then open http://localhost:9000.

  • Open the test app ~/Library/PonyDebugger/src/ponydebugger/Examples/PDTestApp/PDTestApp.xcodeproj

  • In Xcode choose scheme to ‘PDTestApp’, and run it.

  • Now you should see the app connected in http://localhost:9000.

  • Click it to open the debugger: http://localhost:9000/devtools/devtools.html?host=localhost:9000&page=1

Using PonyDebugger in your project

  • Install CocoaPod
$ sudo gem install cocoapods
$ pod setup
  • Create a ‘PodFile’ in the project folder, with following content:
platform :ios, '5.0'
pod 'PonyDebugger', '~> 0.4.0’ 
  • Run pod install

  • This creates a ‘xcworkspace’ file. Open this xcworkspace file, not the xcodeporj file!

[14:10:37] zxp@Xiangpengs-McAir-7:~/dev/iOS/Beginning-iOS6-Dev_sourcecode/Chapter_08/08 - Cells $ ll
total 32
drwxr-xr-x@  9 zxp  staff   306 11 16 14:10 .
drwx------@  5 zxp  staff   170  7  7 22:29 ..
-rw-r--r--@  1 zxp  staff  6148  7  7 23:39 .DS_Store
drwxr-xr-x@ 13 zxp  staff   442  7  7 22:39 Cells
drwxr-xr-x@  5 zxp  staff   170  7  7 22:38 Cells.xcodeproj
drwxr-xr-x   3 zxp  staff   102 11 16 14:10 Cells.xcworkspace
-rw-r--r--   1 zxp  staff    52 11 16 14:09 PodFile
-rw-r--r--   1 zxp  staff   275 11 16 14:10 Podfile.lock
drwxr-xr-x   9 zxp  staff   306 11 16 14:10 Pods

[14:11:29] zxp@Xiangpengs-McAir-7:~/dev/iOS/Beginning-iOS6-Dev_sourcecode/Chapter_08/08 - Cells $ cat PodFile 
platform :ios, '5.0'
pod 'PonyDebugger', '~> 0.4.0'
  • Now add these code to your AppDelegate.m, and enable ENABLE_PONYDEBUGGER as described in the comment. You have to do this. Uncomment the #if doesn’t work.

#if ENABLE_PONYDEBUGGER
#import <PonyDebugger/PonyDebugger.h>
#endif
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Don't use PonyDebugger unless we have ENABLE_PONYDEBUGGER enabled.
    // When ENABLE_PONYDEBUGGER is enabled -lSocketRocket -lPonyDebugger
    // should be added to "Other linker flags" settings.
    // Release builds should not use PonyDebugger

#if ENABLE_PONYDEBUGGER

    PDDebugger *debugger = [PDDebugger defaultInstance];

    // Enable Network debugging, and automatically track network traffic that comes through any classes that implement either NSURLConnectionDelegate, NSURLSessionTaskDelegate, NSURLSessionDataDelegate or NSURLSessionDataDelegate methods.
    [debugger enableNetworkTrafficDebugging];
    [debugger forwardAllNetworkTraffic];

    // Enable Core Data debugging, and broadcast the main managed object context.
    [debugger enableCoreDataDebugging];
    // zxp: Check example app to enable this properly
    // [debugger addManagedObjectContext:self.managedObjectContext withName:@"PonyDebugger Test App MOC"];

    // Enable View Hierarchy debugging. This will swizzle UIView methods to monitor changes in the hierarchy
    // Choose a few UIView key paths to display as attributes of the dom nodes
    [debugger enableViewHierarchyDebugging];
    [debugger setDisplayedViewAttributeKeyPaths:@[@"frame", @"hidden", @"alpha", @"opaque", @"accessibilityLabel", @"text"]];

    // Connect to a specific host
    [debugger connectToURL:[NSURL URLWithString:@"ws://localhost:9000/device"]];
    // Or auto connect via bonjour discovery
    //[debugger autoConnect];
    // Or to a specific ponyd bonjour service
    //[debugger autoConnectToBonjourServiceNamed:@"MY PONY"];

    // Enable remote logging to the DevTools Console via PDLog()/PDLogObjects().
    [debugger enableRemoteLogging];
#endif
  • Finally!

How it works

  • ponyd is a Tornado web server which uses WebSocket to communicate to the device and to Chrome. It registers itself as a Bonjour service ‘Pony Gateway’, so that an iOS device can easily discover the server. The server acts as a bridge between these two clients, forwarding messages back-and-forth.

    • Bonjour is a framework created by Apple for service discovery
    • WebSocket is a bi-directional communication protocol via JSON over HTTP
  • The device communicate to the server via ‘/device’ endpoint. Here is an example of network messages, and the definition can be found at https://developer.chrome.com/devtools/docs/protocol/0.1/network#events

    {"method":"Network.requestWillBeSent","params":{"documentURL":"http:\/\/corner.squareup.com\/images\/ponydebugger\/icon.png","loaderId":"","requestId":"A346E01D-D247-4D92-B551-0832F6C3DB51-2","frameId":"","request":{"url":"http:\/\/corner.squareup.com\/images\/ponydebugger\/icon.png","method":"GET","headers":{"Accept-Encoding":"gzip, deflate","Accept-Language":"en-us","Accept":"*\/*"}},"timestamp":1416210440.562284}}    

    {"method":"Network.responseReceived","params":{"loaderId":"","type":"Image","response":{"statusText":"no error","status":200,"requestHeaders":{"Accept-Encoding":"gzip, deflate","Accept-Language":"en-us","Accept":"*\/*"},"headers":{"Etag":"\"87f76cc58c10ba60a067bb8ce11e7bc1\"","Last-Modified":"Fri, 07 Feb 2014 20:22:54 GMT","x-amz-request-id":"FCA78F2A33F51058","Server":"AmazonS3","x-amz-id-2":"CmkoMPfxmlot6YYxPo9ZEXrR8jd5n\/DmII6Le6Trj+q3Xqzpcn1TbfbwNxY5qKuL","Content-Type":"image\/png","Content-Length":"17339","Date":"Sun, 16 Nov 2014 22:01:48 GMT"},"url":"http:\/\/corner.squareup.com\/images\/ponydebugger\/icon.png","mimeType":"image\/png"},"requestId":"A346E01D-D247-4D92-B551-0832F6C3DB51-2","frameId":"","timestamp":1416210440.562592}}    

    {"method":"Network.dataReceived","params":{"dataLength":17339,"requestId":"A346E01D-D247-4D92-B551-0832F6C3DB51-2","timestamp":1416210440.563106,"encodedDataLength":17339}}    

    {"method":"Network.loadingFinished","params":{"timestamp":1416210440.563705,"requestId":"A346E01D-D247-4D92-B551-0832F6C3DB51-2"}}  
  • On receiving device data, the server forwards it to Chrome via write_message() to ‘/devtools’ endpoint. Since WS protocol is bi-directional, the server can write to the client browser.

  • The server also receives Chrome’s message, e.g.

    {"method":"Debugger.supportsSeparateScriptCompilationAndExecution","id":2}  

Such messages will be forwarded to the device.

  • The device registration process:
    # Dev tools connecting to device 68B552FA-4A62-4B65-86E8-63272A3634D9   

    devtoolshandler {"method":"Debugger.causesRecompilation","id":1}    
    devtoolshandler {"method":"Debugger.supportsSeparateScriptCompilationAndExecution","id":2}  
    devtoolshandler {"method":"Profiler.causesRecompilation","id":3}    
    devtoolshandler {"method":"Profiler.isSampling","id":4} 
    devtoolshandler {"method":"Profiler.hasHeapProfiler","id":5}    
    devtoolshandler {"method":"Timeline.supportsFrameInstrumentation","id":6}   
    devtoolshandler {"method":"Page.canOverrideDeviceMetrics","id":7}   
    devtoolshandler {"method":"Page.canOverrideGeolocation","id":8} 
    devtoolshandler {"method":"Page.canOverrideDeviceOrientation","id":9}   
    devtoolshandler {"method":"CSS.getSupportedCSSProperties","id":10}  

    device! {"id":1,"error":"unknown domain Debugger"}  
    device! {"id":2,"error":"unknown domain Debugger"}  
    device! {"id":3,"error":"unknown domain Profiler"}  
    device! {"id":4,"error":"unknown domain Profiler"}  
    device! {"id":5,"error":"unknown domain Profiler"}  
    device! {"id":6,"error":"unknown domain Timeline"}  
    device! {"id":7,"error":"Error Domain=PDErrorDomain Code=100 \"Unknown or unimplemented method name: Page.canOverrideDeviceMetrics\" UserInfo=0x7a67dba0 {NSLocalizedDescription=Unknown or unimplemented method name: Page.canOverrideDeviceMetrics}"} 
    device! {"id":8,"error":"Error Domain=PDErrorDomain Code=100 \"Unknown or unimplemented method name: Page.canOverrideGeolocation\" UserInfo=0x7beca020 {NSLocalizedDescription=Unknown or unimplemented method name: Page.canOverrideGeolocation}"} 
    device! {"id":9,"error":"Error Domain=PDErrorDomain Code=100 \"Unknown or unimplemented method name: Page.canOverrideDeviceOrientation\" UserInfo=0x7a686fe0 {NSLocalizedDescription=Unknown or unimplemented method name: Page.canOverrideDeviceOrientation}"} 
    device! {"id":10,"error":"unknown domain CSS"}  

    devtoolshandler {"method":"Network.enable","id":11} 
    devtoolshandler {"method":"Page.enable","id":12}    
    devtoolshandler {"method":"Network.enable","id":13} 
    devtoolshandler {"method":"Page.getResourceTree","id":14}   
    devtoolshandler {"method":"CSS.enable","id":15} 

    device! {"id":11,"error":null}  
    device! {"id":12,"error":null}  
    device! {"id":13,"error":null}  
    device! {"id":14,"error":null,"result":{"frameTree":{"frame":{"name":"Root","id":"0","securityOrigin":"com.squareup.PDTestApp","loaderId":"0","url":"\/Users\/zxp\/Library\/Developer\/CoreSimulator\/Devices\/FC39E0A1-11D1-4475-B993-2D66CA5904EF\/data\/Containers\/Bundle\/Application\/E1F5A2F5-2BCB-4CEC-B8B9-4487B12E2D1D\/PDTestApp.app"}}}}    
    device! {"id":15,"error":"unknown domain CSS"}  

    devtoolshandler {"method":"Network.canClearBrowserCache","id":16}   
    devtoolshandler {"method":"Network.canClearBrowserCookies","id":17} 
    device! {"id":16,"error":null,"result":{"result":false}}    
    device! {"id":17,"error":null,"result":{"result":false}}    

    devtoolshandler {"method":"Worker.enable","id":18}  
    device! {"id":18,"error":"unknown domain Worker”} 

    devtoolshandler {"method":"Debugger.canSetScriptSource","id":19}    
    devtoolshandler {"method":"Debugger.enable","id":20}    
    device! {"id":19,"error":"unknown domain Debugger"} 
    device! {"id":20,"error":"unknown domain Debugger”}   

    devtoolshandler {"method":"Profiler.enable","id":21}    
    devtoolshandler {"method":"Console.enable","id":22} 
    devtoolshandler {"method":"Inspector.enable","id":23}   
    devtoolshandler {"method":"Database.enable","id":24}    
    device! {"id":21,"error":"unknown domain Profiler"} 
    device! {"id":22,"error":null}  
    device! {"id":23,"error":null}  
    device! {"id":24,"error":"unknown domain Database"} 

    devtoolshandler {"method":"DOMStorage.enable","id":25}  
    devtoolshandler {"method":"Page.setTouchEmulationEnabled","params":{"enabled":false},"id":26}   
    device! {"id":25,"error":"unknown domain DOMStorage"}   
    device! {"id":26,"error":"Error Domain=PDErrorDomain Code=100 \"Unknown or unimplemented method name: Page.setTouchEmulationEnabled\" UserInfo=0x7b97a1e0 {NSLocalizedDescription=Unknown or unimplemented method name: Page.setTouchEmulationEnabled}"}    
  • After the registration, the device can send the traffic data like the network messages above, following Chrome RDP.

  • To debug the process, add print() code in on_message() functions here:

     /Library/Python/2.7/site-packages/ponyd-1.0-py2.7.egg/ponyd $ sudo vi [gateway.py](http://gateway.py/) 

Chrome Remote Debugging Protocol

Posted in Android & iOS | Leave a comment

在美二年

来美国快两年了。再往前算算,毕业已经六年了,豆瓣注册都九年了……朋友在豆瓣上说,写点什么吧。想想也是。

字写得越来越少。因为忙,又怕写不出什么新意,记记流水账而已,偶尔带点言不达意,过犹不及的小清新,一不小心就酸得自己都不忍再读。写博客不如写微博轻松,写微博不如朋友圈发照片轻松,发原创不如转载轻松。如何尽可能少费自己的工夫,就能被大家点上很多的赞,满足下无穷尽的虚荣心,这是一个研究课题。

书倒是读得多了。除了专业书,社会科学,经济管理,这种“有用”的书读得越来越多,“无用”的小说越来越像是一种奢侈品,在海边度假晒太阳的时候,也要带上一本《团队协作的五大障碍》,吹着海风喝着冰镇啤酒读这本书,寓教于乐,心里有深深的满足感,觉得自己没有虚度光阴,觉得自己是个行为艺术家。

去年曾经一度很抑郁,在美国缺乏归属感,犹疑不决不知该怎么走。今年不再为这些问题发愁。英语忽然开了窍,解决了沟通问题,很多工作上的事情才能成为可能。曾经跟前同事吐槽转型的痛苦,同事说要坚持啊。还好,坚持下来了。然后,路就宽了很多。

写字画画弹琴这些“老年爱好”,工作忙起来肯定要靠边站的。虽然略有遗憾,但现在的时间开支比例更合理。有时间多研究下怎么码程序吧,只有这个爱好可以养家糊口啊。这么写下来,心里还是有点不乐意,所以,抽空还是要继续写字画画弹琴的。

某人评价我写东西语言缺乏原创性,很多都能看出来是模仿谁谁的。这个批评我承认。在哪儿呆上几年,我说话的口音就带上哪儿的口音;看完同一个作家的几本小说再写字,就不自觉地带上人家的语气,我就是这么随风倒啊,不愧是双子座啊>_<。不想那么多,写,总比不写强。说不定哪天我就融会贯通,形成赵老师风格了呢。

最后,最近经历的事情反复证明,世间的痛苦不会增减,能改变的,永远都只有自己的心。

Posted in 心情 | 4 Comments

太浩湖记

安静的太浩湖可算是美国西岸风景的代表。

天是安静的。松树是安静的。群山环绕,没有多少风,极少的水鸟很仔细地排成一排,在清冷的空气里飞过去,阵型丝毫不乱。湖自然也是安静的。纯净的清澈的宝蓝色,石子在水中清清楚楚。水波纹慢悠悠地从远方荡过来,是那种很细腻的纹路,悄无声息的。两道波纹的间隙出乎意料的大,不是雨滴打在水中的那种胶着的密纹,也不是风起时那种会让小船晃动的三角形波浪,更不是掺杂着泡沫发出嘈杂的哗哗声的海浪。如果一定要形容的话,大概像是油画里常见做背景的大块蓝幕布,通体都是顺畅的,只是偶尔有几个弯曲的褶边,好让布料显出明暗不同的光泽,炫耀画家的技术。

湖边没有在海边常见的水草和碎贝壳,也没有海风的腥味。倒是有些巨大的白石头,可以爬上去照相。湖里见不到船,岸边也几乎没有人,因此笑声可以传得很远,于是更显得寂静。因为去的时候是感恩节,收费站都下班了。救生员的大椅子空着,爬上去,体验了下独自看守太阳和湖面的责任感。太阳落得很快,夕阳斜照,随便拍拍就可以很美,甚至觉得照片不太真实。太安静了,安静得让人有点不安,我们似乎是误入了这个纯粹的国度,破坏了这宁静。或许应该打坐下来,与这片寂静融为一体,才会觉得自在?忽然想,月亮上,应该也是这样的吧。

夜里停车在路边看星空。闪光的碎钻石镶了满满一裙子,从未见过这么多星星。给人惊喜的程度甚至超过了白天看湖。第一次看到了猎户座完整的弓,也终于对着星空地图找到了双子座,原来我们双子座有几颗很明亮的星呢。灰暗的银河从天顶流下来,一直连接到远方的山峰上。湖面依然是安静的,冰凉地沉着地对着繁星伸展开怀抱,“我的征途是星辰大海”。比起慢吞吞的太阳,星星们是有灵气的闪着光的,让人忘记了寒冷。这黑暗中的景色是无法用相机记录的,更叫人想把这景色刻在心里,让回忆多存在一会儿也好。

至于Heavenly滑雪、Reno赌场、men’s club之类,与湖本身相比,都是不足道的了。

Posted in 未分类 | 3 Comments

如何活着

一页页重温了这几年来所写博客。读书时简单的快乐和烦恼,逐渐成长为种种复杂而细微的感受;以至于记录这些感受时,常常力求真实而难至。深夜无眠,斟酌着写下这些字句,但愿无违我心。

人之自心如何能存在着,本是件神奇的事,如诗人说,That I exist is a perpetual surprise which is life. 在十几岁的某一天,忽然意识到这个,惊异而惊喜。“我”既能存在,世界怎能轻易用唯物主义解释呢。只是后来很快就不再想这件“小事”了,上学是唯一的,明确的目的,不必疑虑。

未工作以前,二十岁以后,闲暇时间不少,想得也不少,只是读书太少。生活的目的仍然是明确地指向毕业,然而毕业并不是件容易的事。独处而心焦之时,了解了些许哲学和宗教。虽然只见皮毛,亦深感其精深,于是以此为锚为舵,以为读懂了就可以解决问题,解决心中隐藏的无方向感。然而并不能轻易想明白。例如,若相信神,是否也要相信地狱?哲学家穷其一生也不可能想明白这些问题的答案,实则这些问题本不是人所能回答的?无论如何,至少觉得有些新鲜空气和光亮从书中透出来。将问题放在一旁,先毕业再说。

工作后,存在的意义和问题一下子被放大了。生存既已无忧,工作与生活如何平衡才是合理的?生命为何有痛苦?“成功”是否是真正有价值的,值得追求的?虽然工作之外时间不多,但是毕竟这是真正的闲,不像上学时周末也是在工作状态的。因此,必须找寻一个新的目的,一个真正的目的。于是继续看书,同时补完各类艺术爱好。简单地说,艺术之美是接近完美的。如果宗教与无神论同样不容易被证实,我们内心至少可以感知的到,艺术是接近完美的神性的;因此,沉溺于艺术似乎是一个稳妥的选择。如果说这几年除了工作之外,我有什么成长,那就是渐懂了些诗书画印。那一片在这世界上存在已久的美丽的新大陆,如今我亦已踏足。

或许这样已够了,甚至太多了——过日子,应该是柴米油盐,无需折腾这些。想太多,终是无益,徒添烦恼。只是已经回不去了。从小到大打了十多年的电子游戏后,终于觉得厌了;现在这个我已经有点看不进去动作片、肥皂剧了。唯有研究“艺术”这种“非主流”的东西觉得有乐趣——还好,写程序也有其乐趣;只是自然科学之乐趣与其精巧、冷酷的美,似乎永远都比不上一首诗,一卷画来得温暖和动心。

但艺术是否是一个终极的归宿呢?此地虽美,却终非完美。如同美酒,短暂沉浸之后,总要回归充满痛苦和问题的人世。那么,只有宗教可以解决问题。既然因信生义做不到,佛学似乎是唯一解脱。

解脱之道,简言之,“心无挂碍”,则“无有恐怖”。放下,在经历了种种苦难之后,是个好选择。默诵经文,心神奇地安定下来……久违的安定感觉啊。能除一切苦,真实不虚。

但是仍有一件事情不妥。我是否变成了一个消极厌世的人?沉浸在自己的小世界之中,故作“高雅”。心底直觉说,人生的责任感是不可逃避的。不可简单地轻松地走开,虽然要承认,我有些向往“轻”的生活,逃避“重”的倾向。

昨夜重新打开《论语》,程子言:如读论语,未读时是此等人,读了后又只是此等人,便是不曾读。一直厌倦道德文章的我很有些触动。再忆起老师的话来:读孔孟,总不至于行偏的。虽不能确认哪一条道路是唯一的正确道路。温厚的圣人处世之道,或许是现在这个我更需要追寻的。

或许应认定一条道走下去?但我总要看过,试过,才能坚定。或可用古人的作风安慰自己,独善其身与兼济天下不妨统一。逍遥时逍遥,拯救——这个词太重,换做“稳重”吧——稳重时稳重。有些人很快就成熟稳重起来,而我似乎总要自误几回,绕个大圈子,看遍了所有的可能性,才能说服自己。担起担子。收拾心性。立起身,稳步前行。

—————————————————————————–

司败问:昭公知礼乎。孔子曰:知礼。孔子退。揖巫马期而进之曰:吾闻君子不党,君子亦党乎。君取于,为同姓,谓之吴孟子。君而知礼,孰不知礼。巫马期以告。子曰:也幸,苟有过,人必知之。

〇 巫馬姓,期字,孔子弟子,名施。司敗揖而進之也。相助匿非曰黨。禮不娶同姓,而魯與吳皆姬姓。謂之吳孟子者,諱之使若宋女子姓者然。

〇 孔子不可自謂諱君之惡,又不可以娶同姓為知禮,故受以為過而不辭。

〇 吳氏曰:“魯蓋夫子父母之國,昭公,魯之先君也。司敗又未嘗顯言其事,而遽以知禮為問,其對之宜如此也。及司敗以為有党,而夫子受以為過,蓋夫子之盛德,無所不可也。然其受以為過也,亦不正言其所以過,初若不知孟子之事者,可以為萬世之法矣。”

Posted in 学而思, 未分类 | 7 Comments

2013

2013了。有微博,有facebook以后,写博客的人,逐渐变成了一种史前动物。

写非技术博客的目的,无非娱人或娱己。要说记录生活,如今有了timeline这样图文并茂的方式,比翻看博客里若干年前的文章舒服方便无压力。读大块文字的时间越来越少了,别说码上去,读起来都嫌累。谁家的kindle不是在积灰呢?

但是还是喜欢这样安静地整理思路的感觉。踏实的感觉。哪怕听起来有点老,有点装。

搬来加州也有一月了,生活逐渐上了道。虽然在洗澡的时候还会想:我就到了这么一个遥远的地方来了?生活在另一个完全不同的世界?虽然住的房间很大,但装饰并不多,还有那么一点点旅馆的感觉。看那些扎根下来,有家有口的老硅谷们在网上晒照片,也有点艳羡那种祥和的气氛,和眼神里透出的归属感。

但是转念一想,其实一生也就这么一次体会到进入新大陆的感觉。就像一生只有一次离开家门去另一个城市上学的感觉一样。老员工们都说,我们赶上了好时候。跟在美国读完五年博士就业的同学比,我们是少吃了不少苦。回想起07年来UCSB的时候,现在的生活是舒适多了。应该知足了。

下午的阳光撒进屋子,投在墙上的影子里偶尔有松鼠的敏捷踪迹。要是乐乐在,肯定激动坏了吧。院子里偶尔有猫路过,但跟松鼠比起来就很少见了。

前几天去了下红木森林州立公园。所谓公园,其实就是一座山。选了条trail走了一下午,大概跟香山差不多,只是路程稍多一点。风景是纯粹美式的:湛蓝天空,纯白云朵,威严的杉树林间透着渺渺的雾气。四处都能看到湿厚的青苔,圆软的蘑菇。小溪清脆地流淌,得踩着石头和厚厚的落叶,小心跨过去。未见到什么动物,也没有水流以外的声音,只有些自然倾倒的树干,或是雷电烧焦的树根,在这静寂的画面中显出一些变化。

忍不住要想,还是我们中式的山林好。深绿的山间隐约出现一红色小亭,或是青石上刻一二个字,即可给这自然带来生气,教人有亲切的感觉,而非敬畏这自然之力。在我们眼里,这山还是冷峻了些。树木高耸如神灵,小径幽凉无人迹,并不太有坐下来野餐或读本小说的情趣,只适合一身户外装备暴走半日。路上遇到一位目测五六十岁的白人老太太,手持登山杖,一副运动员身材,轻快地走过来,开心地跟我们打招呼,祝贺新年;这才是美国人。

从山路开车回来,吃到正宗的中餐,我们中国人终于开心啦。这菜的水准不比国内的差嘛。我们湾区还是很适合中国人居住滴。祖国人民,快再多来一些吧~

Posted in 心情, 旅途 | 1 Comment

所谓硅谷

说起来,这个地方的地名也可以很浪漫:山景城,阳谷县,梦洛园——Mountain View, Sunnyvale, Menlo Park。最后一个地名是我瞎译的。

只是大多数事情都在意料之中。毕竟,如今已经没有初来美国的新鲜感了。意料之中的孤单;大街上总是看不见人,习惯了国内生活的人初来乍到,恐怕会担心这里闹鬼。意料之中的食物,商店,以及建筑;Facebook的食堂还是远不比Google啊。路过Safeway, Nordstrom, Macy’s, Apple Store, 就连斯坦福庄园城堡一般的校舍,感觉也就是“那么回事”,“理应如此”。甚至还冒出一个念头:如果以后带人来参观的话,好像会有点没意思啊。

也有意外的好地方——斯坦福购物中心真不错。路两边是干净优雅的商铺,路中间可以当个小公园。池底散落着硬币的小喷泉上做了几尾青铜的鱼儿,一条拱廊上绕着青藤和花草,小朋友好奇地看着在溪水里捞叶子的墨西哥工人,还有摇着尾巴被主人抱着逛商场的小狗。Apple Store和Microsoft Store里拥挤吵闹的人群反而让我挺开心,找回了一点国内的感觉。:)

比起斯坦福来,还是中国超市好。见到各种久违的食材(其实也就刚来了三天而已),心情相当激动。花椒!金针菇!豆角!莲藕!还有各类港台零食,以及奇怪的物品,比如,八卦镜。看见满眼的中文标签,听到亲切的中文叫卖声,虽然是柔柔的台湾腔,心里暗想,起码父母过来不至于没地方去了。

硅谷一大特色,就是随处可见的著名IT公司,这是西雅图、洛杉矶见不到的。前天夜晚在Palo Alto某商业街上路过一个绿叶子标志的房子,透明的大窗户里有一排排大显示器和若干加班的苦逼人群;这不是商店,是MongoDB。再比如今天在去超市的路上瞎转,随便便就碰见了Symantec,还有Zynga。Facebook总部周五亦已去探过了,感觉非常像大学:大长条桌子,四下都是人,墙上有涂鸦,还到处施工,装修新房子。里头遇见排成一队,有领队带着的一群参观者,跟我一样好奇地四处打量,不免叫人回忆起了北大暑假里常见的少年儿童旅游团。总的来说,办公条件肯定比不上每人一单间办公室的Redmond,大致跟北京微软差不多。等以后再去寻找Google和Apple总部吧。

下周开始上班。期望值放低,准备好好干活,学习。

 

Posted in 旅途 | 7 Comments

总有些睡不着觉的夜晚

然而孤独也是享受。

读周国平《守望的距离》,很喜欢这段话:“人生也面临种种二律背反,爱与孤独便是其中之一。莫洛亚引用了拉伯雷《巨人传》中的一则故事。巴奴越去向邦太葛吕哀征询关于结婚的意见,他在要不要结婚的问题上陷入了两难的困境:结婚吧,失去自由,不结婚吧,又会孤独。其实这种困境不独在结婚问题上存在。个体与类的分裂早就埋下了冲突的种子,个体既要通过爱与类认同,但又不愿完全融入类之中而丧失自身。绝对的自我遗忘和自我封闭都不是幸福,并且也是不可能的。在爱之中有许多烦恼,在孤独之中又有许多悲凉。另一方面呢,爱诚然使人陶醉,孤独也未必不使人陶醉。当最热烈的爱受到创伤而返诸自身时,人在孤独中学会了爱自己,也学会了理解别的孤独的心灵和深藏在那些心灵中的深邃的爱,从而体味到一种超越的幸福。”

九华山归来,青山已忘了,庙庵风貌亦忘得差不多了。所记最清的,是观音殿里对联一副:如不回头,谁为你救苦救难!若能转念,何须我大慈大悲!

细说起来,还有在阳台坐观山间明月清风的小欢乐,水塘边听年轻喇嘛说他想遍访四大名山的小故事,随摇摇晃晃的缆车悬停松风深渊之上的小胆怯,敬闻山寺深院里目不斜视的僧团晚课钟磬齐鸣不绝于耳的小感动。凡在名山古刹,常有出离世间的恍惚感。

然而又常被拉回现实。——“还不快参拜?”僧人催促着下跪的一家人,应该是为他们专场作的法事吧,我想。或许是因为没有跟着参拜,才有后面骨折的事迹?

落魄江湖载拐行
双杖纤细杵地轻
倏忽风雨梦黄山
依稀烟波罹南京
轻烟淡墨徽州路
转念回头地藏经

妙灵九华山

记得高中的时候家里有这么一枚IC卡。在网上搜了下,竟然找到了。

 

Posted in 旅途 | 5 Comments

风雨登黄山

依我说,“黄山归来不看画”。

山岩清奇如仙人,松针遒劲如笔墨。巨石切削出山崖的形状,青色的,微黄的,沾染了苔痕水迹,直探云海之底。阵阵云雾在空中随山势起霓裳之舞。老根抱紧了山石,松枝扎在黑鳞驳驳的枝干上,饱含力量地伸展出去,微弯地托起一簇簇绿蜡。细观之,如苏轼《寒食帖》笔法般顿挫有致——竟是可以借之悟书道的。

山上有画家悠闲地坐着写生,一笔笔描画山石,山松。画得如何且在其次,只见两人都是很快乐的样子,叫人看得也手痒了。

午后,风雨云雾齐至,四下不见。摸着湿漉漉带着小水珠的青黑色松针,望着“排云”,“听涛”的匾额,恨不得手掌长大如铁扇,扇尽这无穷雾气,好教这山现出真面目来;这时心里倒还有几分豪气呢,哪里想得见下山时的辛苦。

然后就是漫长的山夜。风雨交加,在小屋中安坐,几乎忘了自己在山上,却又有疼痛的双脚提醒这山的威力。

翌日,风雨更盛,连缆车也都停了。出门见到旅馆外有好多帐篷,真不知他们这一夜是怎么过来。穿上雨衣,撑起拐棍,走路下山吧。十四里山路,待我一步步丈量过。

雨到处,小瀑布生了出来。山顶上温柔的小小涓流,逐渐长成奔马,从身边掠过;以至于变为猛虎怪兽,咆哮着拍在前方的青石路上,冒着气泡,浸过脚面,再猛地跳下山崖,奔向无止境的未知。

路狭草木长,白浪逐人归。十里吞云下,五尺语不闻。

山边的松枝逐渐化成绿叶,云雾也淡了些。抬头远远望去,依稀可见“仙人指路”的奇松石悬在天间。每处景致都值得静静独坐,对山细细赏玩;只是走了如此一路,已开始头晕腿软——罢了,不歇了,继续走吧,天黑前得下山。再不下山,那渐渐灰暗下去的山峦就要变成张着大嘴的精灵鬼怪了。

待到见到片片绿竹,可以松口气,到山脚啦。上了公交车,天刚黑下来。躺在最后一排座上,听着雨声,亮起车灯,饮一杯太平猴魁,飞往文明世界。

Posted in 旅途 | 2 Comments

轮回的选择:生命中不能承受之轻

一生。小说不长,但生命中最细微,最难以言说的那些感触,感受,都写清楚了。那些不清不楚的选择,真实生命中的,轻,重,选择,承担,结束。

好像成为了他,经历了一次生命一样。

并不能解决任何现实问题。选择轻还是选择重?依然没有答案。但是我们已随着托马斯多经历了一次轮回。今生看往生,今生看来生,有了这么多的经验和经历,在下一次紧要选择的关头,我们该如何去做?

 

Posted in 学而思 | Leave a comment