Pages

Saturday, 31 December 2016

中国互联网企业比之美国的差距依然明显


近年来,互联网在中国发展迅速,2016年互联网行业收入依然保持了高速增长。据中国信息通信研究院的预测,今年中国互联网企业收入将达1.24万亿元,2017年有望达到1.76万亿元。而中国工业和信息化部本周发布的数据显示,2016年中国互联网行业收入增长超过40%,相比之下,我国电信业业务增长53%,但收入仅增长5.1%;软件和信息技术服务业收入仅增长15%。在“互联网+”以及网络强国战略等政策推动下,我国互联网行业实现了高速增长。但相较于美国互联网巨头来说,无论从收入,还是创新都存在一定的差距。首先,从全球互联网企业的市值来看,前三位分别是谷歌、FACEBOOK和亚马逊,均由美国包揽阿里巴巴、腾讯、百度、京东分别位列第四、第五、第七和第十。其次,从收入差距来看,美国互联网三巨头与中国互联网三巨头差距保持在五倍左右。此外,创新方面,我国互联网创新更多是以商业模式为主,信通院产业与规划研究所副所长刘高峰认为,部分原因是线下产业发展不健全,仍处于技术跟随阶段所致。值得一提的是,美国企业在人工智能、虚拟现实等众多新兴领域都有极强的核心技术积累。而高盛在前不久发布的一篇人工智能生态报告中曾指出,美国仍是人工智能的主导力量,而将中国、以色列、加拿大、印度等归结为高速成长的市场。目前中国互联网企业仍未扭转“重商业,轻研发”的形象。不过,技术研发只是第一战场,转化为生产力,突出商业化的应用,以及在消费型社会,如何满足更多个性化服务需求将是未来互联网发展争夺更为激烈的战场.

mechanic

Command-line tool to manage nginx-powered proxies for node apps. Static file delivery, load balancing, HTTPS, all that jazz with a clean interface.

Purpose

nginx is a popular reverse proxy server among node developers. It's common to set up one or more node apps listening on high-numbered ports and use nginx virtual hosting and reverse proxy features to pass traffic to node. nginx can also serve static files better than node can, and it has battle-testd round-robin load balancing features.
We've boiled down our favorite configuration recipes for nginx to a simple utility that takes care of spinning up and shutting down proxies for new node sites on a server. It can also handle load balancing, canonical redirects, direct delivery of static files and https configuration. It takes the place of manually editing nginx configuration files.

Install

Step One: install nginx on your Linux server.
Under Ubuntu Linux that would be:
apt-get install nginx
Make sure Apache isn't in the way, already listening on port 80. Remove it really, really thoroughly. Or reconfigure it for an alternate port, like 9898, and set it up as a fallback as described below.
Step Two:
npm install -g mechanic
NOTE: mechanic will reconfigure nginx after each command given to it. A strong effort is made not to mess up other uses of nginx. Mechanic's nginx configuration output is written to /etc/nginx/conf.d/mechanic.conf, where both Debian-flavored and Red Hat-flavored Linux will load it. No other nginx configuration files are touched. You can change the folder where mechanic.conf is written, see below.
Step Three:
Go nuts.
Let's add a single proxy that talks to one node process, which is listening on port 3000 on the same server (localhost):
All commands must be run as root.

Adding a site

mechanic add mysite --host=mysite.com --backends=3000
Replace mysite with a good "shortname" for your site— letters and numbers and underscores only, no leading digits.
mechanic will reconfigure and restart nginx as you go along and remember everything you've asked it to include.

Aliases: alternate hostnames

Next we decide we want some aliases: other hostnames that deliver the same content. It's common to do this in the pre-launch period. With the update command we can add new options to a site without starting from scratch:
mechanic update mysite --aliases=www.mysite.com,mysite.temporary.com

Canonicalization: redirecting to the "real name"

In production, it's better to redirect traffic so that everyone sees the same domain. Let's start redirecting from our aliases rather than keeping them in the address bar:
mechanic update mysite --canonical=true

Setting a default site

We've realized this site should be the default site for the entire server. If a request arrives with a hostname that doesn't match any --host or --aliases list, it should always go to this site, redirecting first if the site is canonical. We can do that with default:
mechanic update mysite --default=true
Warning: If your server came with a default website already configured, like the server block that appears in /etc/nginx/nginx.conf in CentOS 7, you will need to comment that out to use this feature. mechanic does not mess with the rest of your nginx settings, that is up to you.

Fast static file delivery

Let's score a big performance win by serving our static files directly with nginx. This is simple: if a file matching the URL exists, nginx will serve it directly. Otherwise the request is still sent to node. All we have to do is tell nginx where our static files live.
mechanic update mysite --static=/opt/stagecoach/apps/mysite/current/public
Browsers will cache the static files for up to 7 days. That's a good thing, but if you use this feature make sure any dynamically generated files have new filenames on each new deployment.

Serving index.html for bare directories

When using --static, you can optionally enable serving index.html automatically when a URL matches a directory name by using the --autoindex option.
mechanic update mysite --autoindex
As with all boolean options you can change your mind later:
mechanic update mysite --autoindex=false
In a typical proxy configuration, this makes it possible to use an index.html file as a cached static version of a resource with a "pretty URL" like /people that would normally hit your back end server.

Static websites

Although static websites will never be a primary use case for mechanic, you can set up a perfectly reasonable static webserver like this:
mechanic add mysite --host=mysite.com --static=/var/www/html/mysite --autoindex
The backends option is no longer mandatory when --static is present.
If you have more elaborate use cases that don't involve a reverse proxy, you should really create a separate nginx configuration file for that site.

Load balancing

Traffic is surging, so we've set up four node processes to take advantage of four cores. They are listening on ports 3000, 3001, 3002 and 3003. Let's tell nginx to distribute traffic to all of them:
mechanic update mysite --backends=3000,3001,3002,3003

Across two servers

This time we want to load-balance between two separate back-end servers, each of which is listening on two ports:
mechanic update mysite --backends=192.168.1.2:3000,192.168.1.2:3001,192.168.1.3:3000,192.168.1.3:3001
You can use hostnames too.

Secure sites

Now we've added ecommerce and we need a secure site:
mechanic update mysite --https=true
Now nginx will serve the site with https (as well as http) and look for mysite.cer and mysite.key in the folder /etc/nginx/certs.
See the nginx docs on how to handle intermediate certificates.

Redirecting to the secure site

Next we decide we want the site to be secure all the time, redirecting any traffic that arrives at the insecure site:
mechanic update mysite --https=true --redirect-to-https=true

Shutting off HTTPS

Now we've decided we don't want ecommerce anymore. Let's shut that off:
mechanic update mysite --https=false

Removing a site

Now let's remove the site completely:
mechanic remove mysite

Disabling options

You can disable any previously set option, such as static, by setting it to false or the empty string.

Falling back to Apache

If you also want to serve some content with Apache on the same server, first configure Apache to listen on port 9898 instead of 80, then set up a default site for mechanic that forwards traffic there:
mechanic add apache --host=dummy --backends=9898 --default=true
We still need a host setting even for a default site (TODO: remove this requirement).
Apache doesn't have to be your default. You could also use --host and set up individual sites to be forwarded to Apache.

Global options

There are a few global options you might want to change. Here's how. The values shown are the defaults.

conf: nginx configuration file location

mechanic set conf /etc/nginx/conf.d
This is the folder where the mechanic.conf nginx configuration file will be created. Note that both Red Hat and Debian-flavored Linux load everything in this folder by default.

restart: nginx restart command

mechanic set restart "nginx -s reload"
The command to restart nginx.
Don't forget the quotes if spaces are present. That's just how the shell works, but it bears repeating.

logs: webserver log file folder

mechanic set logs /var/log/nginx
If this isn't where you want your nginx access and error log files for each site, change the setting.

bind: bind address

mechanic set bind "*"
By default, mechanic tells nginx to accept traffic on all IP addresses assigned to the server. (* means "everything.") If this isn't what you want, set a specific ip address with bind.
If you reset this setting to `` make sure you quote it, so the shell doesn't give you a list of filenames.*

template: custom nginx template file

mechanic set template /etc/mechanic/custom.conf
You don't have to use our nginx configuration template.
Take a look at the file template.conf in the nginx npm module. It's just a nunjucks template that builds an nginx configuration based on your mechanic settings.
You can copy that template anywhere you like, make your own modifications, then use mechanic set template to tell mechanic where to find it.

Lazy overrides

If you don't want to customize our template, check out the convenience override files that mechanic creates for you:
/etc/nginx/mechanic-overrides/myshortname/top
/etc/nginx/mechanic-overrides/myshortname/server
/etc/nginx/mechanic-overrides/myshortname/location
/etc/nginx/mechanic-overrides/myshortname/proxy
top is loaded before any of mechanic's directives for that site. Use it when nothing else fits.
server is included inside the server block for the site, just before the location block, when redirect-to-https is not in effect. it is a good place to change a setting like client_max_body_size or access_log.
location is included inside the location block, and is a good place to add something like CORS headers for static font files.
proxy is loaded inside the proxy server configuration and is ideal if you need to override mechanic's proxy settings.
These files start out empty; you can add whatever you like.
Of course, if this isn't enough flexibility for your needs, you can create a custom template.

Refreshing your nginx configuration

Maybe you updated mechanic with npm update -g mechanic and you want our latest configuration. Maybe you edited your custom template. Either way, you want to rebuild your nginx configuration without changing any settings:
mechanic refresh

Resetting to the defaults

To completely reset mechanic, throwing away everything it knows:
mechanic reset
Warning: like it says, this will completely reset your configuration and forget everything you've done. Don't do that unless you really want to.

Listing your configuration settings

mechanic list
This gives you back commands sufficient to set them up the same way again. Great for copying to another server. Here's some sample output:
mechanic set restart "/usr/sbin/nginx -s reload"
mechanic add test --host=test.com --aliases=www.test.com --canonical=true --https=true
mechanic add test2 --host=test2.com --aliases=www.test2.com,test2-prelaunch.mycompany.com
If you want to wipe the configuration on another server before applying these commands there, use mechanic reset.

Custom nginx templates

You don't have to use our nginx configuration template.
Take a look at the file template.conf in the nginx npm module. It's just a nunjucks template that builds an nginx configuration based on your mechanic settings.

Storing the database in a different place

It's stored in /var/lib/misc/mechanic.json. That's one hundred percent correct according to the filesystem hierarchy standard, adhered to by all major Linux distributions and many other flavors of Unix. But if you absolutely insist, you can use the --data option to specify another location. You'll have to do it every time you run mechanic, though. That's why we only use this option for unit tests.
If necessary mechanic will create /var/lib/misc

from  https://github.com/punkave/mechanic

Friday, 30 December 2016

hs-bt-tracker- 基于haskell的UDP BitTorrent Tracker


Proof-of-concept UDP BitTorrent tracker written in Haskell. I get about 10k responses per second on my laptop (Intel i7-3820QM, 16GB RAM, macOS Yosemite).
Aims towards implementing the protocol available at http://www.libtorrent.org/udp_tracker_protocol.html.
Doesn't support black- or whitelisting.
This is more or less a refactored version of a tracker prototype I developed and later rewrote in Rust (https://github.com/greatest-ape/rs_bt_tracker). That one has more features, a lot better performance and better tests.
I might still make improvements to hs-bt-tracker, but the Rust project is my primary tracker project.

Setup

Install stack if you haven't already.
To build and start the server, run:
stack setup # Only necessary once
./scripts/build-and-run.sh
 
from https://github.com/greatest-ape/hs-bt-tracker

由socks proxy生成http proxy的工具:FWLite-cli(类似cow)

在mac/windows上,

git clone https://github.com/v3aqb/fwlite-cli

cd fwlite-cli

sudo python3 setup.py install

显示:

Password:

running install

running bdist_egg

running egg_info

writing fwlite_cli.egg-info/PKG-INFO

writing dependency_links to fwlite_cli.egg-info/dependency_links.txt

writing entry points to fwlite_cli.egg-info/entry_points.txt

writing requirements to fwlite_cli.egg-info/requires.txt

writing top-level names to fwlite_cli.egg-info/top_level.txt

reading manifest file 'fwlite_cli.egg-info/SOURCES.txt'

reading manifest template 'MANIFEST.in'

warning: no files found matching 'config/delegated-apnic-latest.ini'

warning: no files found matching 'config/gfwlist.ini'

writing manifest file 'fwlite_cli.egg-info/SOURCES.txt'

installing library code to build/bdist.macosx-10.12-x86_64/egg

running install_lib

running build_py

creating build/bdist.macosx-10.12-x86_64/egg

creating build/bdist.macosx-10.12-x86_64/egg/fwlite_cli

copying build/lib/fwlite_cli/__init__.py -> build/bdist.macosx-10.12-x86_64/egg/fwlite_cli

copying build/lib/fwlite_cli/__main__.py -> build/bdist.macosx-10.12-x86_64/egg/fwlite_cli

copying build/lib/fwlite_cli/apfilter.py -> build/bdist.macosx-10.12-x86_64/egg/fwlite_cli

copying build/lib/fwlite_cli/base_handler.py -> build/bdist.macosx-10.12-x86_64/egg/fwlite_cli

copying build/lib/fwlite_cli/config.py -> build/bdist.macosx-10.12-x86_64/egg/fwlite_cli

copying build/lib/fwlite_cli/connection.py -> build/bdist.macosx-10.12-x86_64/egg/fwlite_cli

copying build/lib/fwlite_cli/get_proxy.py -> build/bdist.macosx-10.12-x86_64/egg/fwlite_cli

copying build/lib/fwlite_cli/httputil.py -> build/bdist.macosx-10.12-x86_64/egg/fwlite_cli

copying build/lib/fwlite_cli/hxsocks2.py -> build/bdist.macosx-10.12-x86_64/egg/fwlite_cli

copying build/lib/fwlite_cli/parent_proxy.py -> build/bdist.macosx-10.12-x86_64/egg/fwlite_cli

copying build/lib/fwlite_cli/plugin_manager.py -> build/bdist.macosx-10.12-x86_64/egg/fwlite_cli

copying build/lib/fwlite_cli/port_forward.py -> build/bdist.macosx-10.12-x86_64/egg/fwlite_cli

copying build/lib/fwlite_cli/proxy_handler.py -> build/bdist.macosx-10.12-x86_64/egg/fwlite_cli

copying build/lib/fwlite_cli/redirector.py -> build/bdist.macosx-10.12-x86_64/egg/fwlite_cli

copying build/lib/fwlite_cli/resolver.py -> build/bdist.macosx-10.12-x86_64/egg/fwlite_cli

copying build/lib/fwlite_cli/ssocks.py -> build/bdist.macosx-10.12-x86_64/egg/fwlite_cli

copying build/lib/fwlite_cli/util.py -> build/bdist.macosx-10.12-x86_64/egg/fwlite_cli

byte-compiling build/bdist.macosx-10.12-x86_64/egg/fwlite_cli/__init__.py to __init__.cpython-38.pyc

byte-compiling build/bdist.macosx-10.12-x86_64/egg/fwlite_cli/__main__.py to __main__.cpython-38.pyc

byte-compiling build/bdist.macosx-10.12-x86_64/egg/fwlite_cli/apfilter.py to apfilter.cpython-38.pyc

byte-compiling build/bdist.macosx-10.12-x86_64/egg/fwlite_cli/base_handler.py to base_handler.cpython-38.pyc

byte-compiling build/bdist.macosx-10.12-x86_64/egg/fwlite_cli/config.py to config.cpython-38.pyc

byte-compiling build/bdist.macosx-10.12-x86_64/egg/fwlite_cli/connection.py to connection.cpython-38.pyc

byte-compiling build/bdist.macosx-10.12-x86_64/egg/fwlite_cli/get_proxy.py to get_proxy.cpython-38.pyc

byte-compiling build/bdist.macosx-10.12-x86_64/egg/fwlite_cli/httputil.py to httputil.cpython-38.pyc

byte-compiling build/bdist.macosx-10.12-x86_64/egg/fwlite_cli/hxsocks2.py to hxsocks2.cpython-38.pyc

byte-compiling build/bdist.macosx-10.12-x86_64/egg/fwlite_cli/parent_proxy.py to parent_proxy.cpython-38.pyc

byte-compiling build/bdist.macosx-10.12-x86_64/egg/fwlite_cli/plugin_manager.py to plugin_manager.cpython-38.pyc

byte-compiling build/bdist.macosx-10.12-x86_64/egg/fwlite_cli/port_forward.py to port_forward.cpython-38.pyc

byte-compiling build/bdist.macosx-10.12-x86_64/egg/fwlite_cli/proxy_handler.py to proxy_handler.cpython-38.pyc

byte-compiling build/bdist.macosx-10.12-x86_64/egg/fwlite_cli/redirector.py to redirector.cpython-38.pyc

byte-compiling build/bdist.macosx-10.12-x86_64/egg/fwlite_cli/resolver.py to resolver.cpython-38.pyc

byte-compiling build/bdist.macosx-10.12-x86_64/egg/fwlite_cli/ssocks.py to ssocks.cpython-38.pyc

byte-compiling build/bdist.macosx-10.12-x86_64/egg/fwlite_cli/util.py to util.cpython-38.pyc

creating build/bdist.macosx-10.12-x86_64/egg/EGG-INFO

copying fwlite_cli.egg-info/PKG-INFO -> build/bdist.macosx-10.12-x86_64/egg/EGG-INFO

copying fwlite_cli.egg-info/SOURCES.txt -> build/bdist.macosx-10.12-x86_64/egg/EGG-INFO

copying fwlite_cli.egg-info/dependency_links.txt -> build/bdist.macosx-10.12-x86_64/egg/EGG-INFO

copying fwlite_cli.egg-info/entry_points.txt -> build/bdist.macosx-10.12-x86_64/egg/EGG-INFO

copying fwlite_cli.egg-info/requires.txt -> build/bdist.macosx-10.12-x86_64/egg/EGG-INFO

copying fwlite_cli.egg-info/top_level.txt -> build/bdist.macosx-10.12-x86_64/egg/EGG-INFO

zip_safe flag not set; analyzing archive contents...

creating 'dist/fwlite_cli-0.3-py3.8.egg' and adding 'build/bdist.macosx-10.12-x86_64/egg' to it

removing 'build/bdist.macosx-10.12-x86_64/egg' (and everything under it)

Processing fwlite_cli-0.3-py3.8.egg

Removing /usr/local/lib/python3.8/site-packages/fwlite_cli-0.3-py3.8.egg

Copying fwlite_cli-0.3-py3.8.egg to /usr/local/lib/python3.8/site-packages

Adding fwlite-cli 0.3 to easy-install.pth file

Installing fwlite-cli script to /usr/local/bin


Installed /usr/local/lib/python3.8/site-packages/fwlite_cli-0.3-py3.8.egg

Processing dependencies for fwlite-cli==0.3

Searching for repoze.lru

Reading https://pypi.org/simple/repoze.lru/

Downloading https://files.pythonhosted.org/packages/b0/30/6cc0c95f0b59ad4b3b9163bff7cdcf793cc96fac64cf398ff26271f5cf5e/repoze.lru-0.7-py3-none-any.whl#sha256=f77bf0e1096ea445beadd35f3479c5cff2aa1efe604a133e67150bc8630a62ea

Best match: repoze.lru 0.7

Processing repoze.lru-0.7-py3-none-any.whl

Installing repoze.lru-0.7-py3-none-any.whl to /usr/local/lib/python3.8/site-packages

Adding repoze.lru 0.7 to easy-install.pth file


Installed /usr/local/lib/python3.8/site-packages/repoze.lru-0.7-py3.8.egg

Searching for hxcrypto

Downloading https://github.com/v3aqb/hxcrypto/archive/master.zip#egg=hxcrypto-0.0.3


error: Download error for https://github.com/v3aqb/hxcrypto/archive/master.zip#egg=hxcrypto-0.0.3: [Errno 60] Operation timed out


解决办法:

cd ~

git clone https://github.com/v3aqb/hxcrypto

cd hxcrypto

sudo python3 setup.py install


cd ~/fwlite-cli

nano config/config.ini

(启用proxy3 = socks5://127.0.0.1:1080

fwlite-cli -c config/config.ini


这样,就由socks5://127.0.0.1:1080生成了一个http proxy,地址为http://127.0.0.1:8118然后,Set browser's proxy setting to http proxy, 地址为127.0.0.1 ,端口为8118 ,浏览器即可翻墙。


项目地址:https://github.com/v3aqb/fwlite-cli

https://github.com/v3aqb/fwlite





张雪忠:绝望与希望

------------------------------------------------------------------------

自由从来都不是免费和可以靠施舍得来的。没有中国版的光州事件,雷洋还会更多更多。
freedom is never free. 自由从来不是免费的。

在日本的日子-含淚活著


首先,我真是佩服中国父母对子女的无私的奉献和负责精神。
其次,整个视频的配乐充满人文精神和气息,哪里看得到半点“军国主义”的气息?网上说,日本人比中国人更有人情味,更有互助精神,我绝对相信。那些被共匪洗脑的仇日份子/爱国贼该清醒清醒了。
该死的南京大屠杀,我也是很死了当年那帮禽兽般的日军。但是就像当年的唐朝军队也侵略过高句丽(朝鲜),难道今天的我们需要为唐朝的皇帝背黑锅吗?同样的道理,今天的普通日本人也不需要为当年的侵华日军背黑锅吧??
毕竟平头百姓和军人完全是两码事!平头百姓替军人背黑锅完全没有道理和说不通。

Thursday, 29 December 2016

跟hakyll相关的源码

http://hdiff.luite.com/cgit/?q=hakyll

搭建基于haskell的静态博客程序simonmar-blog

先安装stack和ghc.

cd /usr/local
git clone https://github.com/simonmar/blog simonmar-blog
cd simonmar-blog

root@AR:/usr/local/simonmar-blog# ghc --make site.hs
[1 of 1] Compiling Main             ( site.hs, site.o )
Linking site ...
root@AR:/usr/local/simonmar-blog#
root@AR:/usr/local/simonmar-blog# ls
bib               css     index.html  site     site.o
blog.cabal        deploy  pages       site.hi  stack.yaml
about.rst  contact.markdown  images  posts       site.hs  templates
(生成了可执行文件site)
root@AR:/usr/local/simonmar-blog# ./site rebuild
(会遇错:commitBuffer: invalid argument (invalid character) 
解决办法: 运行export LC_ALL=C.UTF-8即可。参见https://github.com/commercialhaskell/stack/issues/793)
root@AR:/usr/local/simonmar-blog# ./site rebuild
root@AR:/usr/local/simonmar-blog# ls
_cache     bib               css     index.html  site     site.o
_site      blog.cabal        deploy  pages       site.hi  stack.yaml
about.rst  contact.markdown  images  posts       site.hs  templates
(生成了_site目录)
root@AR:/usr/local/simonmar-blog# cd _site
root@AR:/usr/local/simonmar-blog/_site# ls
about.html    atom.xml  contact.html  images      pages
archive.html  bib       css           index.html  posts
root@AR:/usr/local/simonmar-blog/_site#
(可见 /usr/local/simonmar-blog/_site就是静态网站的根目录)

新建源帖:

root@AR:/usr/local/simonmar-blog/_site# cd ..
root@AR:/usr/local/simonmar-blog# cd posts
root@AR:/usr/local/simonmar-blog/posts# nano 2016-12-30-test-1.md
root@AR:/usr/local/simonmar-blog/posts# cat 2016-12-30-test-1.md
---
layout: post
title: 测试1

description: ""
category: misc
tags: [misc]
---


这是测试1.

看看如何?
root@AR:/usr/local/simonmar-blog/posts# cd ..
root@AR:/usr/local/simonmar-blog# export LC_ALL=C.UTF-8
root@AR:/usr/local/simonmar-blog# ./site rebuild

演示网站:http://smb.bright.biz.st/
项目地址:https://github.com/simonmar/blog

learnyouahaskell.com

http://learnyouahaskell.com/starting-out

Wednesday, 28 December 2016

龚楚——红军第一叛将的回忆

龚楚曾是红军创建人之一、高级将领,他是历史的见证人。《龚楚将军回忆录》很有价值,通过这部书,我们能够清晰地了解当年苏维埃政权是怎么回事,红军肃反有多么残酷。
毛泽东死后,国家主席杨尚昆作为瑞金时代的见证人,才敢于在小范围内承认龚楚这部回忆录的真实性。
红军代总参谋长
龚楚(1901~1995),粤北乐昌长来村人,15岁入广州巿立一中。16岁参加粤军,入滇军讲武堂韶关分校。1921年任粤军连长。1924年入团,1925年转党,回乡从事农运。宁汉分裂,1927年5月初在韶关任“北江工农讨逆军”总指挥,率部参加南昌暴动。1928年1月,与朱德、陈毅、王尔琢等发起湘南暴动。1928年5月,指定与朱毛组成前敌委员会,头颅也与朱毛同一价位——捉到两万大洋、击毙一万、报信五千。1929年12月参与百色起义,任红七军参谋长。此后历任红七军长、中央模范团长、粤赣军区司令、红军代总参谋长。1934年10月中旬,红军主力西撤后,任留守江西苏区的中央军区参谋长。最后一个职务为方面大员:湘粤桂边区中央分局书记兼该区红军总指挥。1935年5月2日,只身离队,留下一份“脱离声明”。
红军创建者之一的龚楚,为中共事业历尽艰辛,几入生死,左腿致残,加之身居高位,通缉匪首,按说只能死心塌地跟着走了,怎么会离开革命队伍呢?都熬挺11年了,怎么会自我否定呢?自然,龚楚之叛说来话长,有着主客观复杂因素,须稍展述。
被冤杀的林野夫妇
林野(1902~1934),福建龙岩人,中共党员,黄埔军校毕业生,参加北伐,宁汉合流后脱离汪部回闽西。1928年初参加朱德领导的湘南暴动,即任红四军军部少校参谋。但其家庭成分是地主,1929年朱德率部攻占龙岩,林野父母被当地农会在暴动中杀死,担心林野报复,当地共干要求朱德将林野交送地方处置,朱德不允,痛斥来要人的农会共干。红12军在福建成立后,林野出任军参谋长,工作中得罪军政委谭震林,调任红军军政学校四连连长,后任红军公略学校教育长、红军第二步兵学校校长。1934年秋,中央红军主力突围,林野任野战军(突围部队)总司令部参谋,随军行动,走了两天,因脚受过重伤,行走不便,朱德调他回中央军区(留守部队)工作。当林野回到瑞金,恰逢其妻(上海大夏大学毕业生)从福建跑到江西苏区来找他,最高浪漫的“革命+恋爱”,真是说不出的喜悦。
林野向西江(会昌县属)中央军区司令部报到的第二天,谭震林到龚楚办公室,细声对龚说:“报告参谋长!我们准备请林野回家去!”龚楚以为要林野回龙岩老家工作:“司令部正需要林野这种参谋人才,我看还是另外调人到龙岩去吧。”谭震林狞笑一声:“不是要他到龙岩去,是要他回老家!”龚楚一个寒噤,忙问:“林野同志是老党员,他并没有错误啊!”谭震林严厉而坚定地说:“我应该报告你的是,林野的思想向来不正确,立场也不坚定,而且又是一个反革命的地主阶级(按:指其家庭出身),中央早已对他怀疑。现在他回来了,在此艰苦斗争中,我们再也不能让他混在革命队伍中。我已报告了项英同志,并已得到他的同意。”
龚楚认为像林野这样年轻有为的同志,并无明显错误,仅仅怀疑就要杀掉,实在难以接受。谭震林虽然地位比龚低,却是“国家政治保卫分局长”,直属中央领导,操握留守红军全体人员的生杀大权。除了对高干动手须报告政治局,处决中下级干部与士兵平民,毋须任何机关核准,只要自己批准自己就行。龚楚深知谭震林为人刻薄冷酷无情,无法阻止,但寄望说服项英。龚找到项英:“林野究竟怎样处置?你有考虑吗?”项英很庄重地回答:“谭震林的意见很对,在这严重斗争的环境,为了革命的利益,我们顾不到私人的感情了!”龚见项处无望,去找住在附近的瞿秋白、阮啸仙,两人虽已失势,却是著名中共高干,且与龚私交颇深,尤其阮啸仙是广东农会时期的老同志(后任赣南军区政委),也许能救下林野。两人听后,互望一眼,瞿秋白说:“这件事,我同意龚同志的说法,不过我们现在不便说话了!”阮啸仙也说:“龚同志,我看这件事你也不要管了!我和瞿同志就快离开这里,你和谭同志共同工作的时间长着呢,何必因此而引起以后的不愉快?”
当天下午三点,项英通知林野,说是派他重赴红军学校任职并请他们夫妇吃饭。林野夫妇兴冲冲地赴约。下午四点开饭,特地为林野夫妇加了一碟炒蛋。陪餐的龚楚知道这是“最后的晚餐”,眼看这对恩爱夫妻笑意写在脸上,浑然不知,自己既无法援救更不能泄露天机,心如刀绞。他忽然想到至少应该救下无辜的林妻,便说:“林野同志,今晚去红军学校有15里路,天快黑了,此间有空房,让你太太暂住一晚,明天再派人送她去,好吗?”一旁项英、陈毅顿时领悟,附和道:“龚同志的意见很好,林嫂子明天去好!”可这对恩爱夫妇婉谢好意,他俩哪里会知道龚楚的真正用意呢?这对好不容易会面的青年夫妇,当然希望能有更多时间在一起。
事后,那两个在途中奉命动手的特务员,向龚楚报告经过:走了十里路,已入夜了,林野先行在前,林妻在后,一位黄同志拔出大刀去杀林,其妻大叫,双手拖住黄不放,林野发足狂奔,另一特务员立即赶上,举刀便砍,林一闪避,已中左肩。林野立即回身拼命,但因左肩负伤,又被劈中右肩,此时再想逃,被追上照头一刀,脑破两半。林妻也已被黄同志结果。那位特务员说完嘿嘿一笑:“这次若不是我们两人,恐怕给他跑掉了呢。”龚楚事后对谭震林说:“以后遇到这样的事,最好是痛痛快快的干掉,不必要再演这样的活剧了。”谭讽笑道:“参谋长还有一点温情主义的意识呢!哈哈!”1945年中共七大,追认林野为烈士。
令人胆寒的政治保卫局
1934年6月中旬,五次反围剿无法打破,白军包围日益缩小,红军最高领导层决定突围。为保证突围时没有逃跑及投降之类事件,政治保卫局进行严密整肃。政治保卫局权力无边,常常一句“保卫局请你去问话”,就将人带走。被传去者,多数就此“失踪”,毋须宣布任何理由与后续消息。这一时期,被撤职审查的干部士兵达数千人,不得不在瑞金附近设立十多个收容所。为处置这一大批“动摇干部”与“反对阶级”,在瑞金北面与云都交界的大山深密处,设立特别军事法庭,离开法庭150码,有一条二丈多宽的山涧,涧上有一小木桥,桥下便是“万人坑”。所谓审讯只是一句话:“你犯了严重的反革命错误,革命队伍里不能容许你,现在送你回去。”然后押着犯人到坑边,一刀一脚,完工齐活。更“艺术性”一点的,要犯人自挖墓坑,然后再动刀踢入或干脆活埋,省下挖坑的麻烦。“这种残酷的历史性大屠杀,直到红军主力突围西窜(所谓长征)一个月后,才告结束。”
据《龚楚回忆录》,红军撤退或在白区长途行军时,必派出由政治保卫局人员组成的收容队与后卫警戒部队同行,落伍官兵如无法抬运,“便毫不留情地击毙”,以免被俘泄密。红军中除了政委与政治部主任,各级长官不仅不知道政治保卫局的卧底,而且不知道身边警卫多数都是经过“政治保卫局”培训的特务,时刻监视,随时可对自己“动手”。百色起义主要领导人、红七军军长李明瑞(北伐虎将、广西国军最高长官),就是被跟随多年的心腹卫士林某击毙,林某就是奉命监视李明瑞的特务。政治保卫局内部也互监互督,没有人受到绝对信任。“不但中下级干部终日忧惧,不知死所,高级干部也人人自危。在这种恐怖的气氛笼罩下,怎能叫人生活下去呢?这时,我便暗萌去志。”更何况,龚楚已有“历史污点”。1933年5月下旬,周恩来主持高干会议宣布:“对龚楚在工作中所犯对革命前途灰心丧气,甚至发生动摇的右倾机会主义错误进行了严肃认真的批评教育,并给予开除党籍一年的处分,调红军大学上级训练队高级研究班受训。”随即在红军总部召开思想斗争大会,对龚楚围攻批判,提前经历“文革”。政治保卫局要收拾龚楚,也不是没有“历史依据”。
这一时期被“肃”的红军高干还有红五军团总指挥季振同。季乃1932年1月1日宁都暴动的主要领导人,带着26路军两万余人及众多弹械投红,出任红五军团总指挥。仅仅因为与参谋长赵博生(中共党员)在人事安排上有所龃龉,同年6月即以“读书”为名予以软禁,10月与部下另一将领黄宗岳同时被杀。1927~1934年间,毛泽东也被清算过“富农路线”,三次开除中委八次严重警告与留党察看。1932年初,萧劲光因“小资产阶级意识”差点不得出任五军团政委,5月又遭撤职与开除党籍处分。革命远未成功,革命者已在支付“必要的冤枉”(始于文革的中共高干流行语),交出去的是血淋淋的肉体与生命,抓住的则是干巴巴的抽象概念与教条。
人质与绑票
有饭吃,有衣穿,这是一支军队生存下去的基本条件。
早在井冈山斗争时期,有胆有识的毛泽东就开创了抓“人质”索钱粮和“借粮款”的经验。这对军队的生存和最终胜利意义重大。这一巨大功绩理所当然的应记在主席的功劳薄上。
根据毛泽东的战友、红军军官龚楚于1954年在香港出版的回忆录,其中记述了一桩红军抓人质索取光洋的具体见闻。
一天,龚楚经过瑞金附近的龚房,“因为天气炎热,到村里去找一间民房休息。这个龚房,居住的是姓龚的居民,我进入休息的是一栋很大的青砖平房,外面非常整洁。但等进大厅时,却意外地感到凄凉与萧条,因为屋子里的家具都没有了,只有一张烂方桌和一条长板凳,屋子里有两个中年妇人和一个老年妇人,还有三个小孩子,全穿着破烂衣服,形容憔悴,看见我带着四个携有手枪的特务员进来,非常惊恐,小孩更吓得哭了起来。”这时他们听到龚楚的姓,知道是同宗。于是一家六口跪在他面前,求他救他们的命。老太婆哭着说:“我家老头子是个读书人,两个儿子也读了点书,因为家里有十几亩田,两个儿子便在家里耕地,上半年老头子和两个儿子都被政府捕去,又打又吊,迫缴光洋二百五十元。我们到处张罗了一百二十块钱,并将女人家全部的首饰凑足起来,送去赎他们。但金钱缴了,老头子仍被吊死,两个儿子也被杀了,现在他们还逼我们缴五百光洋,否则我们六口人都要捉去坐牢。司令员呀,我们饭都没有吃,哪里还有五百光洋呢?求你念在同宗之情,替我们说句公道话,我家老头子在世的时候曾说过,有位红军军长是我们姓龚的,他很早就想去找你……司令员呀!你无论如何要救救我们!”说罢她便不住地磕起头来。她们两个媳妇和小孩也跟着磕起头、流泪。龚楚虽然答应替她们想办法,但他明白帮忙反会害了她们。“曾有个医生因缴不起捐款求他,他转告了当地政府,但十多天后当我由闽西再回到瑞金时,那位医生已被杀害,药店也被没收,他家的寡妇孤儿已沦为乞丐了。”
自一九三三年秋,中共实行消灭地主的农民政策后,农村阶级斗争更趋严重,清算接连清算,杀了一批又一批,甚至杀到红军干部的家属,如江西独立师师长杨遇春,他是瑞金武阳围人,父母叔伯都被捕去清算,家中屋宇财物全被没收,他以参加革命多年的结果,弄得家破人亡,迫得他冒险逃出苏区,向国军投降,掉转枪头,参加到反共的队伍中去。无产阶级出身的红十六军军长孔荷宠,也因不满现实,在红军大学高级研究班毕业后,也逃出苏区投降国军。其他红军中下级干部逃亡的更多,地方干部中逃亡的有石城、宁都的赤卫队长,许多县份的村、区赤卫队长,以及大批人民纷纷逃出苏区,走向吉安、赣州一带的国军区域去。
农村中处决地主的手段,是万分残酷的。他们在未杀以前,用各种严刑拷打,以勒索金钱;等到敲榨净尽,才加以屠杀。在“斩草除根”的口号下,被指为豪绅地主的家人连襁褓的婴孩也不免于死,所谓“人性”这个名词,在共产党的经典中,已经找不到了。
中共打着革命的旗帜,其目的,若从正常的路线来说,是在实行无产阶级专政以建设共产主义新社会。我曾经组织并策动过苏维埃运动,我深深地体验到,中共在苏维埃运动时的革命,并不是真正的无产阶级革命;中国的无产阶级,只是被愚弄,被欺骗的对象。中国的无产阶级——工人,及其同盟——农民,他们在数千年来的文化熏陶下,大家都是爱和平、重道德、敬业乐群、乐天知命的,对于中共的激烈斗争政策,并不感到兴趣。因此大多数的人们,都采取躲避观望的态度,只有地方上一般游手好闲的流氓地痞,却喜欢中共“打土豪、分田地”的政策;中共也看中了他们,认为他们是贫苦工农成份。其实,这些人早已脱离了生产,趁着“打土豪、分田地”的机会,来满足他们发财妄想。他们唯中共之命是听,并且还做得更为激烈以表示他们的忠实,于是,这些流氓地痞便被中共认为是革命的积极分子,更尽量的吸收到党里面来,不断的加以提拔,大胆地将他们捧上统治阶级的宝座。因此,这一批鸡呜狗盗,好吃懒做的坏蛋,便一跃而为新统冶阶级了。他们大多数成为地方苏维埃政府的重要人物,或农会工会的主席。一旦掌握了地方政权,或领导着民众组织,他们当然无法无天,胡作胡为了。第一、他们过去或者受过了善良人们的厌恶及歧视,现在便利用“翻身”的机会,吹毛求疵来报复泄愤。第二、他们过去穷困久了,打土豪是唯一的发财机会,可以不劳而获,坐事其成,所以在打完土豪之后,有将富农称为地主,中农称为富农,极尽其敲榨勒索的手段。第三、他们现在有钱有势,便藉着“男女平等”的口号,以提倡妇女参加革命工作为手段,将乡村中的年青貌美的妇女,任意凌辱与玩弄,如果她们反抗,便用种种罪名,加以迫害,许多农村女子,便在这种淫威之下惨遭蹂躏!而一生坚贞不屈的便牺牲了生命。有一个时期,中共也觉得这种情势非常严重,曾发出:“反贪污、反腐化、反保守报复的农民意识”的指示,在党内展开思想斗争,进行思想教育,企图纠正地方干部的错误。可是,这些流氓地痞的本质太坏,任你如何斗争、教育,都无法改过纠正。他们已变了新兴的统治阶级,成为苏维埃的骨干,如果没有他们,苏维埃便一无所有了。所以,揭穿了苏区内统治阶级的面幕,完全是一群贪污腐化、卑鄙龌龊的魔鬼在狂舞!像这样的无产阶级专政,怎不令纯洁的革命份子寒心呢?怎不令善良的工农人民受尽磨折呢!
当红军主力突围走了之后,这班流氓地痞,知道来日无多,有的是窃取公家财物逃出苏区,有的是拥着娇妻潜匿深山逃避斗争,有的更原形毕露,带着手枪藉借粮筹款供应红军之名,向稍有存粮存款的红军家属抢掠,甚至强奸红军家属妇女。这时,乡、区政府多数已找不到一个负责人,苏区社会已陷入无政府的恐怖状态。项英曾严饬各省级党政负责人消除这极严重现象,迅速恢复苏区秩序,但结果毫无办法,这就是最后苏区的状况。
这一系列的悲剧,促使龚楚逃离红军。龚本人于1990年90岁高龄时回国定居。毛死后,国家主席杨尚昆作为瑞金时代的见证人,才敢于在小范围内承认龚楚这部回忆录的真实性。
另据陈毅回忆,若捉住了豪绅家里的人固然可以定价赎取,这个办法比较难,因为红军声势浩大,土劣每每闻风而逃。此时只有贴条子一个办法,就是估量豪绅的房屋的价额,贴一张罚款的条子,如可值一万元则贴一百元,余类推,限两日内交款,不交则立予焚毁,每到期不交,则焚一栋屋以示威。这个方法很有效力,红军的经济大批靠这个方法来解决。(摘自《陈毅军事文选》,陈毅著,解放军出版社1996年3月第1版)
再读龚楚
龚楚被称为中共第一叛将,他当时在井冈山的排名仅在朱毛之下,“朱毛龚”更是当时中共公文里常出现的名字。他不但是红军的缔造者,一手创建了红四军和红七军,而且长于政治,是中共早期罕见的文武全才。
在读了他的《我与红军》后,又读了他的《龚楚将军回忆录》,后者比前者叙述得更详细些,但都到他脱离红军嘎然而止,对以后的身世经历没有一点交待。
龚楚的回忆录比较难得的是,因为没有什么顾忌,所以无论当时高层的人事关系,还是作战经历都以最原汁原味的方式曾现出来,比如毛的聪明绝顶与骄横跋扈,比如朱的温厚隐忍与笼络手段,比如周的刻薄寡恩与唯上是从,比如彭德怀的刚愎自负与推诿责任等等。
读了龚楚的回忆录,就可对后来发生的一些事情有更深的理解,比如毛的讨厌知识分子,并不是因为他在北大图书馆受人奚落,更重要的是他在井冈山作山大王作得风生水起好不得意时,来搅局的先是那些大城市跑来的知识分子,后来是从苏联跑来的知识分子,他受这些知识分子的打压和鸟气比北大时的奚落更甚。中国的知识分子一向是激情有余才干不足,败事有余成事不足,而这又恰恰被中国革命所证明了的。
彭德怀是一个好呈匹夫之勇的人,他对自己的军事才能非常自负,但他统筹规划,战场调控的能力很差,打了败仗还要推诿给人,也是龚在红军时期唯一与之有过摩擦闹过不愉快的人。彭的这种好呈能的性格也是促使他当年发起百团大战,勇挑抗美援朝重任的一个重要因素。
而周恩来唯上是从的个性也从最早的紧跟共产国际到最后的紧跟毛都没一点变过,可能唯一改变的就是本来冷酷嗜血的性格变得温和圆滑。
读龚楚的回忆录最大的感慨是,命不大的人不要去干革命,一干命就会没有。龚楚在红军的那段日子里,可谓九死一生,每次都差不多死了又给他逃过来,一次比一次惊险,他曾坐船仅仅因为没有和同行的人在一个船舱就逃过一劫,而另一个船舱的同志被捕后就被杀了,他曾和一队士兵被敌人俘虏,就在敌人要枪决他们时,他用广东话喊了一句“没想到我今日要命丧于此”,没想到同是广东人的国军营长就此给了他一条生路。
龚楚的叛变绝不是官方所说的意志薄弱受到诱惑,而是他的信仰和当时苏区执行的共产国际政策越行越远。周恩来到苏区后坚决执行共产国际的三光政策,不但把地主杀掉还把富农杀掉,苏区经济在重重盘剥之下迅速走向崩溃的同时,周对内部人也展开比毛更疯狂的清洗,大批中下层干部被杀,一点不亚于张国焘在四川搞的清洗。
龚一方面看到苏区人民的生活比过去更加悲惨,苏区政府干部的流氓化更加深了这种悲惨的生活,一方面看到优秀的部下被保卫局杀掉而无法阻止,再加上他曾因发展根据地经济而对地主富农采取温和态度背上开除党籍一年的处分,这种种都使他对中共革命产生失望以致于绝望,他说他是一个人道主义者,而共产主义不讲人道,不适合中国的国情。
在中央红军长征后,他留下和项英陈毅一同支撑残局,他主管军事。此后中央要他带最精干的24师去鄂赣粤创立根据地,他任军政一把手,他到了那里后找机会脱离了红军。
龚楚脱离红军,先回了老家乐昌,后加入余汉谋的部队负责剿共,若不是陈毅谨慎,项英陈毅差一点被他抓住。1949年龚楚在家乡向解放军投诚,后经叶剑英举荐去海南当说客,但他没去海南而在香港定居下来,蒋介石曾委派他在香港收编残部,但也被他所拒,从此远离政治。
1990年年逾90的龚楚重返故乡,1995年在故乡去世。
龚楚的一生只是那个时代的一个缩影,他一系列的选择很值得现代的我们再回顾一下,同时也对中国那段历史有更深的体会和认知。
2013-07
--------

共匪就是这德性,你斗我,我斗你。

梁启超:人要生活在趣味之中

凡人必常常生活于趣味之中,生活才有价值。若哭丧着脸挨过几十年,那么,生命便成沙漠,要来何用?我一年到头不肯歇息,问我忙什么?忙的是我的趣
我是个主张趣味主义的人,倘若用化学化分‌‌“梁启超‌‌”这件东西,把里头所含一种原素名叫‌‌“趣味‌‌”的抽出来,只怕所剩下的仅有个零了。我以为凡人必须常常生活于趣味之中,生活才有价值;若哭丧着脸挨过几十年,那么,生活便成沙漠,要他何用?中国人见面最喜欢用的一句话:‌‌“近来做何消遣?‌‌”这句话我听着便讨厌。话里的意思,好像生活得不耐烦了,几十年日子没有法子过,勉强找些事情来消他遣他。一个人若生活于这种状态之下,我劝他不如早日投海。我觉得天下万事万物都有趣味,我只嫌二十四点钟不能扩充到四十八点,不够我享用。我一年到头不肯歇息。问我忙什么,忙的是我的趣味,我以为这便是人生最合理的生活,我常常想动员别人也学我这样生活。
凡属趣味,我一概都承认他是好的。但怎么才算趣味?不能不下一个注脚。我说:‌‌“凡一件事做下去不会生出和趣味相反的结果的,这件事便可以为趣味的主体。‌‌”赌钱有趣味吗?输了,怎么样?吃酒,有趣味吗?病了,怎么样?做官,有趣味吗?没有官做的时候,怎么样……诸如此类,虽然在短时间内像有趣味,结果会闹到俗语说的‌‌“没趣一齐来‌‌”,所以我们不能承认他是趣味。凡趣味的性质,总是以趣味始,以趣味终。所以能为趣味之主体者,莫如下面的几项:一、劳作,二、游戏,三、艺术,四、学问。诸君听我这段话,切勿误会:以为我用道德观念来选择趣味。我不问德不德,只问趣不趣。我并不是因为赌钱不道德才排斥赌钱,因为赌钱的本质会闹到没趣,闹到没趣便破坏了我的趣味主义,所以排斥赌钱。我并不是因为学问是道德才提倡学问,因为学问的本质,能够以趣味始,以趣味终,最合于我的趣味主义条件,所以提倡学问。
学问的趣味,是怎么一回事呢?这句话我不能回答。凡趣味总要自己领略,自己未曾领略得到时,旁人没有法子告诉你。佛典说的:‌‌“如人饮水,冷暖自知。‌‌”你问我这水怎样的冷,我便把所有形容词说尽,也形容不出给你听,除非你亲自喝一口。我这题目:《学问之趣味》,并不是要说学问是如何如何的有趣味,只是要说如何如何便会尝得着学问的趣味。
诸君要尝学问的趣味吗?据我所经历过的,有下列几条路应走:
第一,无所为。趣味主义最重要的条件是‌‌“无所为而为‌‌”。凡有所为而为的事,都是以另一件事为目的而以这一件事为手段。为达目的起见,勉强用手段;目的达到时,手段便抛却。例如学生为毕业证书而做学问,著作家为版权而做学问,这种做法,便是以学问为手段,便是有所为。有所为虽然有时也可以为引起趣味的一种方法,但到趣味真发生时,必定要和‌‌“所为者‌‌”脱离关系。你问我‌‌“为什么做学问?‌‌”我便答道:‌‌“不为什么。‌‌”再问,我便答道:‌‌“为学问而学问。‌‌”或者答道:‌‌“为我的趣味。‌‌”诸君切勿以为我这些话是故弄玄虚,人类合理的生活本来如此。小孩子为什么游戏?为游戏而游戏。人为什么生活?为生活而生活。为游戏而游戏,游戏便有趣;为体操分数而游戏,游戏便无趣。
第二,不息。‌‌“鸦片烟怎样会上瘾?‌‌”‌‌“天天吃。‌‌”‌‌“上瘾‌‌”这两个字,和‌‌“天天‌‌”这两个字是离不开的。凡人类的本能,只要哪部分搁久了不用,它便会麻木,会生锈。十年不跑路,两条腿一定会废了。每天跑一点钟,跑上几个月,一天不跑时,腿便发痒。人类为理性的动物,‌‌“学问欲‌‌”原是固有本能之一种,只怕你出了学校便和学问告辞,把所有经管学问的器官一齐打落冷宫,把学问的胃口弄坏了,便山珍海味摆在面前也不愿意动筷了。诸君啊!诸君倘若现在从事教育事业或将来想从事教育事业,自然没有问题,很多机会来培养你的学问胃口。若是做别的职业呢,我劝你每日除本业正当劳作之外,最少总要腾出一点钟,研究你所嗜好的学问。一点钟哪里不消耗了,千万不要错过,闹成‌‌“学问胃弱‌‌”的征候,白白自己剥夺了一种人类应享之特权啊!
第三,深入的研究。趣味总是慢慢地来,越引越多,像倒吃甘蔗,越往下才越得好处。假如你虽然每天定有一点钟做学问,但不过拿来消遣消遣,不带有研究精神,趣味便引不起来。或者今天研究这样,明天研究那样,趣味还是引不起来。趣味总是藏在深处,你想得着,便要进去。这个门穿一穿,那个门张一张,再不曾看见‌‌“宗庙之美,百官之富‌‌”,如何能有趣味?我方才说:‌‌“研究你所嗜好的学问。‌‌”嗜好两个字很要紧。一个人受过相当教育之后,无论如何,总有一两门学问和自己脾胃相合,而已经懂得大概,可以作加工研究之预备的。请你就选定一门作为终身正业(指从事学者生活的人说),或作为本业劳作以外的副业(指从事其他职业的人说)。不怕范围窄,越窄越便于聚精神;不怕问题难,越难越便于鼓勇气。你只要肯一层一层的往里面钻,我保你一定被他引到‌‌“欲罢不能‌‌”的地步。
第四,找朋友。趣味比方电,越摩擦越出。前两段所说,是靠我本身和学问本身相摩擦,但仍恐怕我本身有时会停摆,发电力便弱了。所以常常要仰赖别人帮助。一个人总要有几位共事的朋友,同时还要有几位共学的朋友。共事的朋友,用来扶持我的职业,共学的朋友和共顽的朋友同一性质,都是用来摩擦我的趣味。这类朋友,能够和我同嗜好一种学问的自然最好,我便和他搭伙研究。即或不然,他有他的嗜好,我有我的嗜好,只要彼此都有研究精神,我和他常常在一块或常常通信,便不知不觉把彼此趣味都摩擦出来了。得着一两位这种朋友,便算人生大幸福之一。我想只要你肯找,断不会找不出来。
我说的这四件事,虽然像是老生常谈,但恐怕大多数人都不曾这样做。唉!世上人多么可怜啊!有这种不假外求,不会蚀本,不会出毛病的趣味世界,竟没有几个人肯来享受!古书说的故事‌‌“野人献曝‌‌”,我是尝冬天晒太阳滋味尝得舒服透了,不忍一人独享,特地恭恭敬敬的来告诉诸君,诸君或者会欣然采纳吧?但我还有一句话:太阳虽好,总要诸君亲自去晒,旁人却替你晒不来.

搭建基于haskell的静态博客程序ocharles-blog

先按此文http://briteming.blogspot.jp/2016/07/hakyll.html安装stack和ghc.

cd /usr/local
git clone https://github.com/ocharles/blog ocharles-blog
cd ocharles-blog

root@AR:/usr/local/ocharles-blog# ls
cabal.sandbox.config  default.nix  LICENSE        Setup.hs    templates
guest-posts  ocharles-blog.cabal    shell.nix
code              hakyll.hs    pages      
css              img       posts       
root@AR:/usr/local/ocharles-blog# stack init
root@AR:/usr/local/ocharles-blog# stack build
(这一步可能会遇到http://briteming.blogspot.com/2016/12/stack-install-wai-app-static.html文中所提到的错误,见https://github.com/ocharles/blog/issues/34。解决办法参考http://briteming.blogspot.com/2016/12/stack-install-wai-app-static.html)
会显示:
...
Linking .stack-work/dist/i386-linux/Cabal-1.24.0.0/build/ocharles-blog/ocharles-blog ...
ocharles-blog-1.0.0: copy/register
Installing executable(s) in
/usr/local/ocharles-blog/.stack-work/install/i386-linux/nightly-2016-12-23/8.0.1/bin
root@AR:/usr/local/ocharles-blog# .stack-work/dist/i386-linux/Cabal-1.24.0.0/build/ocharles-blog/ocharles-blog build (此即生成/更新静态网站的根目录的命令.此步会遇到错误提示,解决办法:把帖子的title的值加上英文单引号或双引号)
root@AR:/usr/local/ocharles-blog# ls
cabal.sandbox.config  default.nix  LICENSE        Setup.hs    templates
_cache              guest-posts  ocharles-blog.cabal    shell.nix
code              hakyll.hs    pages        _site
css              img       posts        stack.yaml
(生成了_site目录)
root@AR:/usr/local/ocharles-blog# cd _site
root@AR:/usr/local/ocharles-blog/_site# ls
css  guest-posts  img  index.html  pages  posts  posts.rss
root@AR:/usr/local/ocharles-blog/_site#
(可见 /usr/local/ocharles-blog/_site就是静态网站的根目录)

新建源帖:
root@AR:/usr/local/ocharles-blog/_site# cd ../posts
root@AR:/usr/local/ocharles-blog/posts# nano 2016-12-28-test-1.md
root@AR:/usr/local/ocharles-blog/posts# cat 2016-12-28-test-1.md
---
title: 测试1
---

这是测试1.

root@AR:/usr/local/ocharles-blog/posts#  cd ..
root@AR:/usr/local/ocharles-blog# .stack-work/dist/i386-linux/Cabal-1.24.0.0/build/ocharles-blog/ocharles-blog build

演示网站:http://ocb.bright.biz.st/, https://ocharles.org.uk/blog/(程序作者的博客)
项目地址:https://github.com/ocharles/blog
https://github.com/ocharles/blog/issues/34

华裔曾比黑人还受歧视,如今却在美国成为人生赢家

 2005年5月,伊利诺伊州芝加哥,华裔博物馆里展示的一份移民文件.

过去两百多年间,美国总是被视为“机会之地”。无论你来自哪里,无论你出身有多卑微,在美国都有可能成功。美国这块磁铁吸引了无数人——包括前赴后继的亚洲人。即使到了今天,大洋彼岸的亚洲人仍然络绎不绝地漂洋过海,寻找美国梦。

亚洲移民和他们的后代在美国取得了非凡成就。皮尤研究中心说,“亚裔美国人是收入最高、受教育程度最高、人数增长最快的种族群体”。

如果告诉那些还未动身的亚洲人——“亚裔美国人是美国梦的最佳代言人”,他们恐怕会按耐不住自己的冲动想直接游过太平洋。

在美国国家统计局的数据里,亚裔美国人也是人们的羡慕对象:2015年,亚裔家庭年收入中位数全美第一,比第二名白人多出1万多美元,比垫底的黑人多出整整一倍;2015年,美国出生的25岁以上的亚裔,有55%拥有学士及学士以上的学位。相比之下,白人这一数据不到40%,而黑人和拉丁裔更是只在20%左右徘徊。

可是在羡慕之余,我们对亚裔美国人又有太多的误解。是不是所有亚裔都这么出色?华裔是不是最厉害?亚裔的成功是因为他们勤奋刻苦?是因为亚洲文化对家庭传统的重视?是因为亚洲人“再穷也不能穷教育”

要解释这些问题,我们得先回到100多年前。

即便被歧视,也要去美国

亚洲移民最早来到美国,主要是受到了加州淘金热的召唤。第一批踏上美国土地的亚洲移民是华人。他们不是什么商人和银行家,只是普通的甚至是贫困的、没受过什么教育的华人劳工。

这些华人在美国农田、铁路等地方找活干,生活简朴,极其能吃苦,能够接受一般美国人无法接受的微薄薪水,再加上文化不同,因此也逐渐被美国人视为竞争对手。

华人随后遭遇到了几十年如一日的严重歧视。经济学家托马斯·索维尔(Thomas Sowell)在《美国种族简史》里提到:那些试图淘金的华人,都被西部淘金营地的白人赶跑了;1871年,加州洛杉矶,一伙白人歹徒一夜射杀绞死了17名华人;1885年怀俄明州一个煤矿,华人劳工因为罢工遭到屠杀;同样在1885年,加州一个华人社区,因为不堪暴力威胁与骚扰被迫搬家。

除了这种明目张胆的暴力袭击,美国政府还让华人伤透了心。1882年《排华法案》出炉,美国移民的大门基本上彻底对华人关闭,这项法案一直到1943年才废除

华人的悲惨遭遇基本是亚洲移民的缩影,日本人在1907年也享受到了类似待遇——美日政府通过《君子协定》,开始严格限制赴美的日本移民。

当时的法律宗旨就是赶走低端亚洲人口,欢迎高素质以及有钱的亚洲移民携妻儿来美国定居。讽刺的是,至少在加州,政府可从来没对黑人这么审查过。于是数以万计的中国人和日本人只能藏在火车车厢里,躲在船里,义无反顾地从加拿大、墨西哥、古巴、牙买加进入美国。

在美国本土,被逼无奈的亚洲移民也只能退缩到美国社会的小角落里,继续谋生。华人在唐人街之类的聚集区开起了中餐馆、洗衣店。就算是这样,法律的骚扰也在继续。在19世纪的旧金山,如果华人洗衣店不用轻便马车把洗好的衣服送还给顾客,就得征收更高的执照费。

而在1941年底日本偷袭美国珍珠港后,美国将境内数以万计的日本移民暂时转移到了军事拘留营,某种程度摧毁了他们的生计以及积累的财富。

包括托马斯·索维尔在内的众多学者,都认为二战结束前亚洲移民的境况实际上没有比黑人好到哪里去,甚至有些情况下遭遇了其他种族群体从未经历过的歧视。

教育很重要,父母更重要

曾经被视为落后的、不受待见的亚洲移民,曾经长期遭受毫不掩饰的歧视与暴力的亚洲移民,却上升到如今这样一个引人注目的地位,这中间究竟发生了什么奇迹?

1960年代开始,《纽约时报》等美国媒体将亚裔美国人描述为“模范少数族裔”,认为亚裔美国人的成功应该归功于亚洲文化与价值观,也就是“勤奋工作、家庭稳定、重视教育”。

不过加州大学欧文分校和洛杉矶分校的两位社会学教授有不同意见。珍妮弗·李(Jennifer Lee)和周敏(Min Zhou)的研究发现,文化确实很重要,但不是以人们想象的那种方式在影响亚裔美国人。

二战后,美国本土种族主义普遍退潮。到了1965年,美国又通过了《移民与国籍法案》,亚洲移民恢复了他们的赴美征程这时候的亚洲移民,和19世纪亚洲移民有着本质区别。二战后的亚洲移民虽然也有低技术劳工,也有没受过教育的农民,但同时更多的是受过高等教育的高技术人才

珍妮弗·李和周敏教授把重点放在了华人移民以及越南难民的子女身上,如今他们分别是美国第一和第四大亚裔群体。在加州洛杉矶,这些1.5代移民(不在美国出生,12岁之前来到美国)和2代移民(在美国出生)在学校表现优异。不为人所知的是,他们的父母在当年投向美国怀抱时,就拥有无与伦比的教育优势。

1.5代和2代华人移民的父亲,有61%拥有学士及以上学位;42%的母亲拥有学士及以上学位。越南难民后代略逊一筹,他们的父亲和母亲分别有32%和16%拥有学士及以上学位。

二战后来到美国的亚洲移民,受教育程度不仅远远超过母国的平均水平,也在美国平均水平之上。那种认为“亚裔原本处在不利地位,靠教育扭转了劣势”的看法是错误的,这时候亚洲移民已经站到了一个很高的教育起点上。

所以美国的亚洲移民家庭容易出超级优秀学生也就不足为奇了,毕竟研究已经证实,学霸父母的孩子往往也是学霸。一个反例就是西班牙的华人移民,他们不是高学历,只是普通人。西班牙的华人二代移民,有40%只期望自己上到中学十年级。西班牙华人后代不靠教育,靠的是从商。

那怎么解释那些来自贫穷或工薪家庭的亚洲移民后代,也能上美国常春藤名校?

上述受过良好教育的亚洲移民先辈,一手打造了课外教育体系,他们的子女可以从课后辅导班、大学预科课程、暑期训练营等有形资源中提升学业水平,也可以从口口相传的高中排名、名牌大学申请经验等无形资源中获益匪浅。课外教育体系向整个亚裔社区开放,即使你的家庭以刷盘子为生,也能接触到这些资源。

一代亚洲移民既相信美国社会能够向上流动,又担心子女可能遭到种族歧视,摸索出了一条可以遵循的成功之路——他们教育孩子在中学时加倍努力,尽可能成绩拿A,被名牌大学录取,毕业后专注科学、工程、医学和法律这四个领域。亚裔在美国发明的成功模式,你不能从亚洲移民的母国文化中找到


美国布鲁斯金学会也说,亚裔在教育上的成就解释起来很简单,也很枯燥:那就是他们更倾向于住在好学校旁边。特别是东亚移民,即使是穷人,也要不惜一切代价住进好学区。美国政策制定者一定喜欢这个结论,因为他们只需专注提升整体学校的水平就行了,不用关注虚无缥缈的“亚洲文化”。

美国梦的代言人

如果教育真的是亚洲移民成功的唯一秘笈,那故事讲到这里就结束了。教育固然重要,但假如没有美国社会的巨大进步,亚洲移民绝无可能仅靠教育就改变人生。

布朗大学经济学家纳桑尼尔希尔格(Nathaniel Hilger)解释了亚洲移民的收入是怎么赶上并且超过白人的。在1940年,加州出生的亚裔收入要低于加州出生的黑人,更低于白人。但是到了1970年,亚裔的收入开始与白人持平。到了1980年,加州出生的亚裔的收入全面超过了白人。许多亚裔家庭当然穷尽所有对孩子的教育进行投资,但教育投资带来的个人收入增长只是皮毛。

希尔格教授接着发现,美国社会对亚裔的歧视突然消失了。在1940年的加州,拥有同样文凭的亚裔、黑人,工资要比相同条件下的白人低得多。就算亚裔上了大学,赚的钱也远远比不上白人大学生。

但是到了1980年,黑人依然止步不前,亚裔则彻底甩开了黑人,并消灭了与白人之间的差距。比如在1980年,一个辍学的亚裔高中生和一个辍学的白人高中生,几乎拿着同样的薪水。同样辍学的黑人高中生,薪水就惨不忍睹。

亚裔开始被当做白人一样来看待(经济上),不是因为亚裔天生骄傲,黑人天生下贱。上文已经提到,1940年后,来到美国的亚洲移民——特别是华人、日本人,平均受教育程度碾压黑人,这使得亚洲移民的技能水平也在黑人之上。

由于经历了几个世代的奴役与歧视,黑人技能水平低下,更多地在劳动力市场上遭遇到“统计歧视”,雇主不招黑人也没什么损失。

而亚洲移民过去经历的大多是美国人对他们的刻板偏见,也叫“品味歧视”。随着美国种族歧视问题逐渐好转,雇主再以肤色为由拒绝合格的亚洲移民,再给亚洲移民开出不合理的低工资,是非常不明智的。在竞争性劳动力市场上,你不要有能力的员工,别人就会抢着要。


亚裔终于有机会能和真正的美国人平起平坐,只要努力,就能得到应得的收获。如果下次有人大谈什么儒家文化是亚洲移民成功的关键,你就能一笑置之了。

尽管亚裔还面对各种各样隐性歧视,但亚裔美国人确实是美国梦的代言人

stack install wai-app-static遇错的解决办法

我运行stack install wai-app-static,会遇到如下的错误。

root@AR:/usr/local# stack install wai-app-static
wai-app-static-3.1.6.1: configure
wai-app-static-3.1.6.1: build

--  While building package wai-app-static-3.1.6.1 using:
      /root/.stack/setup-exe-cache/i386-linux/Cabal-simple_mPHDZzA
J_1.24.0.0_ghc-8.0.1 --builddir=.stack-work/dist/i386-linux/Cabal-1.24.0.0 build --ghc-options " -ddump-hi -ddump-to-file"
    Process exited with code: ExitFailure 1
    Logs have been written to: /usr/local/yblog/.stack-work/logs/wai-app-static-3.1.6.1.log

    Configuring wai-app-static-3.1.6.1...
    Building wai-app-static-3.1.6.1...
    Preprocessing library wai-app-static-3.1.6.1...
    [1 of 9] Compiling WaiAppStatic.Types ( WaiAppStatic/Types.hs, .stack-work/dist/i386-linux/Cabal-1.24.0.0/build/WaiAppStatic/Types.o )
    [2 of 9] Compiling Util             ( Util.hs, .stack-work/dist/i386-linux/Cabal-1.24.0.0/build/Util.o )
    [3 of 9] Compiling WaiAppStatic.Listing ( WaiAppStatic/Listing.hs, .stack-work/dist/i386-linux/Cabal-1.24.0.0/build/WaiAppStatic/Listing.o )
   
    /tmp/stack21583/wai-app-static-3.1.6.1/WaiAppStatic/Listing.hs:67:34: warning: [-Wname-shadowing]
        This binding for ‘pieces’ shadows the existing binding
          bound at WaiAppStatic/Listing.hs:27:16
   
    /tmp/stack21583/wai-app-static-3.1.6.1/WaiAppStatic/Listing.hs:120:24: warning: [-Wunused-local-binds]
        Defined but not used: ‘isFile’
    [4 of 9] Compiling WaiAppStatic.Storage.Filesystem ( WaiAppStatic/Storage/Filesystem.hs, .stack-work/dist/i386-linux/Cabal-1.24.0.0/build/WaiAppStatic/Storage/Filesystem.o )
    [5 of 9] Compiling WaiAppStatic.Storage.Embedded.Runtime ( WaiAppStatic/Storage/Embedded/Runtime.hs, .stack-work/dist/i386-linux/Cabal-1.24.0.0/build/WaiAppStatic/Storage/Embedded/Runtime.o )
    [6 of 9] Compiling WaiAppStatic.Storage.Embedded.TH ( WaiAppStatic/Storage/Embedded/TH.hs, .stack-work/dist/i386-linux/Cabal-1.24.0.0/build/WaiAppStatic/Storage/Embedded/TH.o )
   
    /tmp/stack21583/wai-app-static-3.1.6.1/WaiAppStatic/Storage/Embedded/TH.hs:10:1: warning: [-Wunused-imports]
        The import of ‘Control.Applicative’ is redundant
          except perhaps to import instances from ‘Control.Applicative’
        To import instances alone, use: import Control.Applicative()
    [7 of 9] Compiling WaiAppStatic.Storage.Embedded ( WaiAppStatic/Storage/Embedded.hs, .stack-work/dist/i386-linux/Cabal-1.24.0.0/build/WaiAppStatic/Storage/Embedded.o )
    [8 of 9] Compiling Network.Wai.Application.Static ( Network/Wai/Application/Static.hs, .stack-work/dist/i386-linux/Cabal-1.24.0.0/build/Network/Wai/Application/Static.o )
    <command line>: can't load .so/.DLL for: /root/.stack/snapshots/i386-linux/lts-7.1/8.0.1/lib/i386-linux-ghc-8.0.1/random-1.1-54KmMHXjttlERYcr1mvsAe/libHSrandom-1.1-54KmMHXjttlERYcr1mvsAe-ghc8.0.1.so (/root/.stack/snapshots/i386-linux/lts-7.1/8.0.1/lib/i386-linux-ghc-8.0.1/random-1.1-54KmMHXjttlERYcr1mvsAe/libHSrandom-1.1-54KmMHXjttlERYcr1mvsAe-ghc8.0.1.so: undefined symbol: timezm1zi6zi0zi1_DataziTimeziClockziCTimespec_getCTimespec1_closure)
root@AR:/usr/local#
 
解决办法:
 很简单:
rm -rf /root/.stack/snapshots/i386-linux/*
( rm -rf /root/.stack/snapshots/x86_64-linux/*)
再次运行stack install wai-app-static就不会遇错了。