-gMIS 吉密斯 升级:增加缓存,按时间快捷检索和全局SessionId等

这是 -gMIS 吉密斯 发布以来比较大范围的更新的一次,这篇文章也前后写了三周,一是忙,二是要记录的内容多,分别有如下几点:增加客户端、服务器端的缓存,增加压缩输出进行页面加载的提速,增加全局Session进行独立会话管理,增加新式的图形验证码方式,增加按照时间字段进行快速检索的功能等。备忘如下并分述之。

0. 提速:增加缓存支持,默认开启
0.1. 前端/客户端缓存
通过HTTP的Cache字段将页面中不经常修改的资源文件缓存在客户端,从而实现更快速的页面加载,这些资源文件包括JavaScript、CSS和图片Icon文件等。例如,在 HTTP Response 中增加这样的设置。
        Cache-Control: max-age=604800
0.2. 网络层缓存(CDN)
通过将服务器端端页面内容缓存在距离终端用户较劲端ISP端的网络层,从而实现较快的访问,这超出编程的范围,将在另外的篇章讨论。
03. 后端/服务器端缓存
服务器端缓存是将从第三方资源提供方获得端资源缓存在本地,以内存热备的方式使得第二次同样资源可以较快方式获得。第三方资源包括读取文件系统、数据库系统、其他在线资源等。
-gMIS 的服务器端缓存,主要依靠 -GWA2 的缓存接口实现,其中的实现细节描述在 “-GWA2 更新缓存调用built-in cache方法”( -R/r2SH )。
-gMIS 服务器端端缓存主要缓存一些辅助设置端查询,如动态菜单、路径导航、对象表结构描述、select选项等不会即时改变,也不需要实时显示修改状态等数据,对于当前对象表的数据则不能进行缓存,这由于 -gMIS 管理信息系统的性质所决定的,增删改的动作需要即时反应出来。
页面缓存及提速的思维导图可以描述为下图所示。

(页面缓存及提速方式方法)
上述设置分别在 inc/config.class 中进行开关设置,默认开启,可以进行在线开启或关闭。

1. 优化:按时间检索快捷方式
增加按日期滚动的快捷检索方式。对于具有时间属性的对象表,此前提供了按月滚动管理的功能,也即总是按一定规则显示当前月份的数据表,而且在功能区增加对过去三个月的链接。
本次修改,进一步地对具有时间属性的对象表,提供针对时间属性的快捷检索方式,如按天的“今天”,“昨天”,“本周”和“上周”。
区分处理日期/时间戳。对于时间属性是按天或者按小时,按分钟的情况分别进行特别处理。
‘rotatespan’=>’rotatespan’, # table names contains variable datetime, e.g. _201412, _201501, Mon Jan  5 15:31:29 CST 2015
‘searchbytimefield’ => ‘searchbytimefield’ # provide timebased search buttons

2. 优化:增加自我独立Session的实现
减掉对外部/第三方session管理的依赖。经过多方实验,最终选择使用自身提供了一种使用全局携带sessionId(sid)的访问鉴权方式来实现安全认证及会话管理。由于目前需要动态管理的用户信息并不多,主要是当前用户端User Id,可以不依赖第三方会话Session进行管理。
在此之前,-gMIS 一直是临时使用PHP的内置Session进行会话管理,也即在页面的Header部分启用
       session_start();
这种方式在单机实验阶段会运行良好,但在实际生产环境中或者在多个应用服务器组成的负载均衡中却无法使用,需要真实的第三方Session服务会话进行管理。
这次使用一种全局携带Session Id的方式实现Session 会话管理,这种方式在此前的应用中进行过部署,可以穿越各种网络环境,甚至是那种不能透传Cookie的网络环境,其健壮性较好。同时,也提供了基于Cookie的复用。
这样的改动,几乎需要在所有的页面所有的链接中修改增加Session Id,因此改动较大,同时修改后还需要逐个功能点点实际测试,涉及到的工作量挺多的。

3. 优化:探索使用基于单向Hash的图形验证码方式
不再依赖第三方存储信息的方式提供图形验证码服务。这个思路与上一点类似,想彻底摆脱对外部第三方Session会话的管理。传统地对人机验证作为会话管理的一部分,需要先生成问题/答案,存储在Session会话服务器上,然后进一步地等待用户回答,然后进行比对判断。
本次尝试实现一种全新的,基于消息摘要的人机验证方式,后续会继续整理完善成一种可以复制的应用,形成一篇安全类研究文章。
基于消息摘要的人机验证方法不需要第三方Session会话服务器进行问题/答案的存储,减少对第三方的依赖,供应链越短,质量越容易保证。

4. 提速:增加内容压缩后传输
在内容输出前进行压缩,然后再前转交给HTTP Server进行发送,实现传输内容最小化,从而达到页面加载提速的目标。根据在0节的图示描述,页面提速一方面是进行缓存,另一方面是减少页面尺寸(压缩),还有就是将要更新的内容进行局部分割,只更新需要修改的地方,后者已经通过Ajax实现。
这次的主要改动是根据Request中的压缩支持信息进行相应的对内容进行压缩后传输。
如 HTTP Request,
        Accept-Encoding: gzip, deflate, sdch
则HTTP Response
        Content-Encoding: gzip
        Vary: Accept-Encoding

5. Bugfixings and Imprvs
javscript –> javascript
首页底部信息更加丰富
首页定时自动更新
pagenavi, getCondition兼容含有%的oppnsk

经过上述优化和提速,在普通网络环境下,-gMIS 的普通页面请求在服务器端可以做到0.0xx秒完成请求处理,服务器端的每次数据库查询次数减少约80%;页面传送到客户端并展现出来可以做到1秒以内,网络层传输内容压缩比约60%左右。

-gMIS 是一种基于 -GWA2 的通用管理信息系统软件,具有可配置的输入和输出接口。
可以在其上构建各种管理应用软件系统,如
内容管理系统(CMS),客户资源管理(CRM),  企业资源计划管理(ERP),
办公自动化系统(OA)等, 以及各种行业应用管理系统软件,如
人力资源管理系统(HR),学生管理,档案管理,旅游管理,图书管理,
商品管理及业务运营支撑系统等等。
实现零代码开发、搭建各种管理信息系统(MIS).

Lower Costs, 降低成本;  Better Productivity, 提高效率.

发表在 -gMIS, -GWA2, 编程技术, 计算机技术 | 标签为 , , | 3条评论

得力彩色铅笔油性彩铅学生用专业手绘48色水溶性彩铅笔24色画画笔36色小学生安全无毒水溶款绘画素描儿童铅笔医用外科口罩一次性医疗专用口罩防尘透气成人三层防护透气医生插座保护套儿童防触电插孔安全塞防护盖宝宝婴幼儿插头插座孔插板床上电脑桌大学生宿舍上铺懒人可折叠小桌子家用寝室简约学习书桌

GWA2-Perl Warning: Reference found where even-sized list expected

“Reference found where even-sized list expected” 这是个恼人的 -Perl 编程中的Warnings信息。在实现 -GWA2 的Perl版本时遇到这个问题,而且走了弯路,兹分析及备忘如下。

这个字面意思翻译为在期望为偶数元素列表的地方,发现了引用类型数据。

之所以恼人可能是由于debug时,需要弄清楚函数/方法调用时的pass by value 和pass by reference的异同,而这个细节在越来越“高级”的编程环境中变得不常见,所以真正遇到了,就可能一时糊涂走弯路。
这个 pass by value /call by value 和 pass by reference / call by reference 可以单独开一篇讲,兹简记如下:

“When a parameter is passed by reference, the caller and the callee use the same variable for the parameter. If the callee modifies the parameter variable, the effect is visible to the caller’s variable.

When a parameter is passed by value, the caller and callee have two independent variables with the same value. If the callee modifies the parameter variable, the effect is not visible to the caller.”
pass-by-reference-vs-pass-by-value-animation.gif (500×270)
-R/j2SL

0. 背景知识,Perl中的Hash及Reference
%hash
Instantiating it: %list = (“steve”=>23, “fred”=>38);
Instantiating a reference to it: $ref = {“steve”=>23, “fred”=>38};
Referencing it: $ref = \%list
Dereferencing it: %{$ref}
Accessing an element: ${$ref}{“steve”} or $ref->{“steve”}
–> -R/n2SI

1. 问题
在 GWA2 的设计中,数据及资源的流转需要经过对象object –> 父类webapp –> filea/ dba –> filedriver/dbdriver –> 实际行为及数据。
gwa2-perl-drafting-dba.20170101.jpg (1142×1073)

这个流转过程中,一个较好地承载数据结构是Hash,Key/Value组对,而在Perl的对象和方法等参数传递过程中,是不支持Hash等,如果将一个Hash作为参数进行传递,则该Hash等key/value会被顺序铺列到一个默认的@_数组中,也即如果期望是这样的:
mysub(my %myhash=(‘k1’=>’v1’, ‘k2’=>’v2’));
而实际运行的结果会等同于这样的:
mysub(my @myarray=(‘k1’, ‘v1’, ‘k2’, ‘v2’));
于是,理想的参数传递就不能使用常规的pass by value, 而要使用pass by reference, 也即,
my %myhash = (‘k1’=>’v1’, ‘k2’=>’v2’);
mysub(\%myhash);
魔鬼般的细节就在这里,产生了类似
Reference found where even-sized list expected
这样的错误,其只是一个warning,但在追求完美的coding style中,warnings是不可接受的。

2. 解决方法
问题的本质是在赋值等号的两边,出现了value和对应的reference时,就会报这样的warning,这是输入方面出现不一致,还是输出方面产生的不一致,排解起来容易走弯路。
warn on ($s,%h) = (1,{}) as on %h = {}
–> -R/v2SJ
问题重现:
my %hash = ();
my $hashref = {};
%hash = $hashref;  #  Reference found where even-sized list expected

由于Perl遵循 no unnecessary constraints, 所以在对方法和函数的传值时,既可以pass by value 也可以pass by reference, 两者都是允许的,用起来也很随意,因此一不留神可能就会将reference赋值给hash,进而产生警告。在稍微复杂点系统中,debug变得有些恼人。正确的使用方式示例:

sub mysub($){
    my %result = ();
    ….
    return \%result;
}

my %hash = (‘k1’=>’v1’, ‘k2’=>’v2’);
my $hashref = {};

$hashref = mysub(\%hash);
%hash = %{$hashref};

3. 扩展
Evaluation Stratragy/求值策略: -R/x12SK 

-R/92SI

gwa2-logo-201606.v2.png (300×300)

gwa2-roadmap-201611.jpg (1224×703)

-GWA2 是一套通用网络应用(软件程序)架构系统,基于 -GWA2 可以轻便构建各种网络应用程序, 包括复杂的在线购物商城、 旅游交易平台、社群或者社交网站和新闻资讯网站等, 也包括各种企事业单位网上门户,在线交互及服务作业系统等. 还可以包括为NativeApp做服务器端支持, 甚至是WebApp的全部。

发表在 -GWA2, 编程技术, 计算机技术 | 标签为 , , | 留下评论

山羊绒围巾女冬英伦百搭围脖双面格子加厚保暖披肩显白黑茶色蓝黑色板栗色中国电信 电信流量5G卡手机卡京东制作

-Base62x 新增JavaScript版本及C/Java/PHP版本的完善

b62x-icon-201306.png (50×50)

Base62x-design-201702.v2.jpg (1025×557)
-Base62x 設計圖

-Base62x 在過去的2016年得到更多的部署和應用,也日漸穩定和成熟。在完成C/Java/PHP開發語言版本的基礎上,日前完成了JavaScript版本的移植,實現了在這四種開發語言中直接引用相關類庫即可應用。
C/C++:   base62x.c
Java:   Base62x.class.jsp
PHP:   base62x.class.php
JavaScript:   Base62x.class.js
相應的源碼已經開源發佈在 -github 上,地址為: -R/a2SM . 
同時也提供了針對各個語言版本的測試程序。

base62x.java_.php_.javascript.manual.201702.jpg (721×377)
OOP編程方式的調用Base62x方法

base62x.c.manual.201702.jpg (771×449)
函數式編程調用Base62x方法

簡而言之,Base62x, 作爲無符號版本的Base64, 可以用在數字進制轉換,字符串編碼兩個方面,其中字符串編碼又進一步地細分為ASCII字符串和非ASCII字符串編碼

這次升級更新主要有如下幾點,備忘于此。

1. Base62x.class.js
增加JavaScript版本的Base62x的實現方法,在JavaScript的編程中可以直接調用該類庫進行編碼,更安全地傳輸非打印字符,如替換内置函數escape/uescape.

2. Base62x.class.jsp
完善對數字進制轉換的相關功能。
Base62x.encode(input, ibase);
Base62x.decode(input, obase);

3. base62x.class.php
完善和修正不等長數組處理函數的一處bug.
_decodeByLength

4. base62x.c
完善和修正了輸出數組聲明時的長度估算策略:
目標進制的字符串長度 = 源字符串長度 * log[源進制] / log[目標進制]

一些個Base62x的部署場景和應用實例。
a. URL4P:   -R/52SJ
b. MobXPc:   -R/92SH
c. gMIS:   -gMIS, FileName Encoding && Login Redirect

d. GWA2:   GWA2, Zea.class, encoding after Zip
e. iAD:    -R/72SH  , Url Redirect
f. ToolBar:   -R/u2SI , Url Encoding

g. Dot-Base62x:   -R/X2SH  
h. URLEncode:   -R/U2SI

上面各種短地址中的ID部分就是使用的Base62x進行編碼的數字.

发表在 Base62x, 编程技术, 计算机技术 | 标签为 , , | 留下评论

彩染发剂植物纯自己在家染头发膏女2021流行色显白天然冰糖雪梨膏儿童宝宝砀山慈梨膏山羊绒围巾女冬英伦百搭围脖双面格子加厚保暖披肩显白黑茶色蓝黑色板栗色

新春愉快!GWA2 in Perl 初版发布

新春愉快!2017年农历新年第一天,GWA2的Perl版本完成首个版本。

距离我们开始在2016年11月份开始筹划GWA2的Perl版本,大约2个月的时间过去了,这期间,我们对GWA2的软件编程框架设计进行再梳理,在继续完善GWA2 in PHP 和 GWA2 in Java的同时,开发了GWA2的Perl版本。逐渐形成了GWA2的发展路线图。


(GWA2的发展路线图)

GWA2 in Perl 的首个版本支持使用Perl在CLI模式下对数据库的操作,这是一种常见的应用场景。其驱动力仍是像此前描述的那样:

“此前在开发人民网的一套新闻转载发现系统时就多次有念头要对perl的代码进行封装和重用。最近又遇到新的使用perl的开发,居然还要从dbi写起,这太低效率了。PHP版本的gwa2的命令行模式的成功部署和运行很诱人,于是就有了perl的gwa2的实现。显然,这只是个开始。….”

在进行Perl版本的GWA2的实现时,也有很多挑战。-Perl 是一门古老而有年轻的编程语言,距今已有29年的历史,发展历程可谓漫长,而且Perl是松散的,提倡多态和丰富,推崇一个问题总有多个解决办法的文化(TMTOMTD)。Perl对面向对象(Object-Orienatied)支持并不是很好,首先对一个问题是是否引用第三方OO的类库,比如MOOSE,开始之后还有更多的支持与选择,近30年的Perl的发展,使其一方面有大量的成熟的类库,另一方面也有一些历史的遗留问题。

对于这些,GWA2的Perl版本只好保守地从基本功能做起,面向需求驱动,预留和开放相应接口,点滴积累,以其有所成,为Perl社区添砖加瓦,为Perl开发提供一个全心的视角。

Perl6正雄心勃勃地走来,对比太老的Perl5系列,Perl6又显得太年轻。在这个节骨眼上推进GWA2的Perl版本,忐忑和纠结是常有的,不过我们还是提供了一个Tutorial供开发者参考。

Programs Written in GWA2 with Perl

0. data
create table prefix_dummytbl(
    id int(12) not null auto_increment,
    iname char(255) not null default ”,
primary key (id),
unique index uk1(iname));

1. object
mod/DummyModule.pm
use parent ‘inc::WebApp’;

2. controller
ctrl/dummy.pl
use mod::DummyModule;
    $act=listen
    $act=speak
    $act=remember
….

3. view
view/default/dummy.html

4. routing
/path/to/perl /path/to/project/index.pl “?mod=dummy&act=listen&fmt=json”

-GWA2 是一套通用网络应用(软件程序)架构系统,基于 -GWA2 可以轻便构建各种网络应用程序, 包括复杂的在线购物商城、 旅游交易平台、社群或者社交网站和新闻资讯网站等, 也包括各种企事业单位网上门户,在线交互及服务作业系统等. 还可以包括为NativeApp做服务器端支持, 甚至是WebApp的全部。

发表在 -GWA2, 计算机技术 | 标签为 , , | 一条评论

书皮纸自粘透明磨砂加厚包书皮小学生一二三四年级上册上学期书膜全套课本书本保护套16k封面外壳防水a4彩染发剂植物纯自己在家染头发膏女2021流行色显白天然冰糖雪梨膏儿童宝宝砀山慈梨膏山羊绒围巾女冬英伦百搭围脖双面格子加厚保暖披肩

-gMIS更新:数据透视和hasId等

 

接續上月對 -gMIS 的更新,繼續完善和豐富 -gMIS 的相關功能與特色。這次主要更新包括實現一種聯機分析處理(OLAP)的數據分析透視功能,另外還有實現了對hasId的擴展,以及其他一些細節完善。

按慣例先關心環保,北京的天氣依然是霧霾重重,而且漸次嚴重,2016Dec17,北京霧霾紅色預警,汽車單雙號限行,中小學停課,預計此次空氣污染將持續5天左右。

1. 數據透視及統計分析,pivot table

聯機分析處理(OLAP, Online Analaytical )是與OLTP對應的一種術語。它與數據分析、數據統計密切相關的應用程序或系統。通常情況下,管理信息系統(MIS)關注的更多的是OLTP(聯機處理程序)如作業的流轉、目標系統的管控等。OLAP本身有專業的數據分析及處理程序來做,比如SPSS,Tableau等,也能夠在通用軟件入 Microsoft Office Excel中看到透視表的功能(Pivot table)。

此前,我們在操作中曾經遇到過需要處理100萬條數據的複雜統計分析,這種數量級,在Excel中就比較吃力,甚至在Windows的作業環境下,文本文件處理程序如 NotePad, Notepad++等,打開這樣的文件也有困難。-Ufqi-dev 曾經列過類似軟件開發計劃。

 

本次更新中,我們在 -gMIS 中增加了依托書庫查詢的數據分組查詢與透視功能。可以實現簡易的分組聚合,排序等數據分析的基本功能。能夠替代多數數據統計系統,實現部分OLAP的功能,與業務支撐系統相集合,可以提供更加簡便的決策支持。

gMIS的透視統計分析設計原型參考了Microsoft Office Excel中的 Pivot table,實現效果類似如下圖。

 

在 gMIS 部署實例中的透視功能截圖。

 

遵循 Microsoft Office Excel中關於透視表的相關設置,減少用戶學習成本,同時進一步的減少了列項設置,變寬表為長表,降低了調用的複雜度,用戶使用時更容易入手。

對比Excel的四個步驟,gMIS透視減縮為兩步三塊的設計:1)在pagenavi中根據高級檢索功能,篩選出結果集,然後在結果集頁面上,點擊“透視”;2)在透視界面上,選擇分組項,求值項和排序項,然後遞交可形成長表。兩步是先篩選,后分組。

2. hasId擴展

hasId 是 -gMIS中 的一個全局變量,用於標識某個被管理的數據表/數據對象是否有全局唯一字段/鍵值。 按良好的設計規範,數據表應該有全局唯一的字段或鍵值。然而世界不總是“良好”的,有些時候gMIS接管的項目,不是從一開始,所以需要面臨沒有良好設計的數據對象。

比如一個常見的流水表,如果有唯一Id號,可以輕易地獲取某條就的詳細信息,或者修改、打印、刪除等操作,而如果沒有唯一Id號,事情就變得有些災難,如果設置了唯一鍵值,比如多個字段的組合,可以依照這些組合條件檢索到目標記錄;而如果沒有唯一鍵值,要找到目標記錄,幾乎需要用到所有字段作爲約束條件,即便是這樣,也很難保證就是目標要命中的記錄(考慮到有重複的情況)。

hasId模塊儅檢測到目標數據表沒有Id時,此前無法進行針對單條記錄進行操作的清空,取而代之的是報告一項錯誤,請管理員、開發人員增加一個id字段,或者通過xml配置文件,指定某一個字段履行唯一id字段的職責,通過myId來傳遞。

今次改進,即是兼容和擴展了這種可能,儅沒有id,也沒有通過xml指定myId,hasId模塊試圖去探測primary key和unique key,儅獲得相應的字段或者字段列表時,轉為hasId的情況。最糟糕的情況是檢測 primary key/unique key失敗,這樣, hasId模塊仍將繼續,取xml配置文件listcount指定的前n個字段作爲 unique key的字段,如果沒有xml配置文件指定,則使用默認的 listcount 值,也即前n=7.

簡而言之,目標數據表是否有良好設計(有無id),是否通過xml配置文件指定id,是否有primary key/unique key等情況,均被cover上,hasId擴展模塊獎對這些情況進行智能處理,系統robust更多一些。

one more thing, 智能再多一些,如果hasId知道了目標數據對象的unique key,那麽再檢索的時候,如果同時使用了unique key的字段,還有其他補充字段的條件,則其他補充字段條件就可以省略不計。 比如使用id查詢,如果再給定狀態,形成 id+istate的查詢,則istate應該自動被丟棄,如果id是unique key,就不同時存在兩狀態的同一個unique key的記錄。

3. 其他調整與完善

繼續完善和調整了首頁面顯示導航;

繼續完善了工作流相關模塊;

默認inserttime/updatetime為UI錄入時為只讀狀態,也即這些字段顯示后有系統自動生成。
也可以通過xml配置文件的readonly做控制。

增加filterReplace功能,與輸入validator不同的是,filterReplace是將輸入的内容使用給定的匹配模式(主要是正則表達式)進行替換,比如一個id期望值是數字1234,如果輸入了a1234,則validator會警告說不合法,中止流程並請用戶修正,而filterReplace則會“粗魯地”匹配出1234進行繼續,丟棄a,不提示,不中斷流程。這個有些類似與搜索引擎的智能修正。

 

gmis-logo-201606

-gMIS 是一种基于 -GWA2 的通用管理信息系统软件,具有可配置的输入和输出接口。
可以在其上构建各种管理应用软件系统,如
内容管理系统(CMS),客户资源管理(CRM), 企业资源计划管理(ERP),
办公自动化系统(OA)等, 以及各种行业应用管理系统软件,如
人力资源管理系统(HR),学生管理,档案管理,旅游管理,图书管理,
商品管理及业务运营支撑系统等等。
实现零代码开发、搭建各种管理信息系统(MIS).

Lower Costs, 降低成本; Better Productivity, 提高效率.

发表在 -gMIS, 计算机技术 | 标签为 , , , , , | 4条评论

得力彩色铅笔油性彩铅学生用专业手绘48色水溶性彩铅笔24色画画笔36色小学生安全无毒水溶款绘画素描儿童铅笔医用外科口罩一次性医疗专用口罩防尘透气成人三层防护透气医生插座保护套儿童防触电插孔安全塞防护盖宝宝婴幼儿插头插座孔插板床上电脑桌大学生宿舍上铺懒人可折叠小桌子家用寝室简约学习书桌

为什么火烧圆明园,不烧紫禁城

最近一直在看近代史,徐中约先生的《中国近代史》,唐德刚先生的《晚清七十年》,张鸣老师的《重说中国近代史》,端木赐香老师的《这一次我们又挨打了》。袁腾飞老师说过一句话:中国的历史教科书上,真实性不超过5%。以前我还不信,看过这些书后我发觉,袁老师说的这个数字有些乐观了。

就拿近代史上这件最让中国人恼火的事情来说吧:为什么圆明园会被烧?

在历史教科书上,中国的形象是一个清纯脱俗的少女,外面的英法美日都是些风骚贱货,整天欺负我们,亡我之心不死。1860年,英法联军打进了北京,烧毁了圆明园。这件事就是表明他们风骚贱货的最好例子。

这件事中国人一说起来都咬牙切齿,它被当成国耻写进了历史书里。然而,有一个问题我们好像忽略了:为什么英法联军打进北京后,烧的是圆明园,而不是紫禁城?

按理来说,紫禁城是皇宫,是大清权力的象征, 既然要放火,那应该放在这里才对。而且圆明园在今天的海淀,清朝时还是北京城的郊区,坐地铁过去都要十几个站。联军都打到紫禁城门下了,为什么不顺带烧了紫禁城,却要拐弯绕到郊区去烧一个皇帝的私人休闲娱乐场所?

在历史书上,这段历史没有细讲。十几年前张铁林、刘晓庆演了一个电影《火烧圆明园》,电影里也没有讲为什么要烧圆明园,好像圆明园莫名其妙地就被烧了。圆明园被烧的真实原因,好像被我们有意地隐藏了起来,有些不好开口的地方。那么英法联军为什么要烧圆明园而不烧紫禁城呢?

事情说起来其实也不复杂。鸦片战争后,中英签订了《南京条约》,十二年后,英国人又跑来找事了,要求修约。什么是修约呢?英国人觉得,《南京条约》都签十几年了,大清应该明白了自由贸易的好处吧?那么第一次开放的广州、厦门、福州、宁波、上海这五个通商口岸就显得不够了,英国人希望大清能把全国都开放了,实在不行的话,沿海大城市、长江沿岸城市都开放也可以。

而且《南京条约》规定,英国人只能在这五个城市活动,中国其余城市都不能去,英国人希望这回能在全中国畅行无阻。还有,两国最好能互派公使,我派个大使驻北京, 你派个大使驻伦敦,方便两国搞外交。另外,英国人还希望能向大清皇帝亲递政府公文,英国人以前想和大清最高领导人搞搞交流会晤,根本就没门,大清皇帝根本就不见, 各级官员也都踢皮球,没人理,英国人因为这事身子都掏空了。

这些就是修约的主要内容,按近代史大家蒋廷黻先生的归纳就是:“公使驻京,内地游行,长江通商,这是双方争执的中心。”站在国际角度来看,这是很正常的事,无论是今天还是在一百年的国际,这些早就成了共识。但问题是,英国人面对的大清,是一个自大自负、目中无人的政府。大清从来都认为自己是天下共主,是天下所有人的爸爸,英法美什么的都是海外藩属国,是咱儿子,儿子就要好好孝敬爹,好好低头做人,闹点事也不用当真。这就是鸦片战争后清政府根本没有吸取教训的原因。

而这几条里,大清最抵制的一条是公使驻京、亲递国书,因为英国人坚决不磕头,你要亲递国书还不磕头,做梦去吧。千万不要小看这一条,这一条可以说就是后来导致战争的起因。为什么清政府必须要洋人磕头呢,因为磕头已经不仅仅是一个动作了,它是大清皇恩浩荡的体现,是执政合法性的基础。洋人本来就是海外藩国,见到天下共主没有不跪之理。而且我天朝百姓磕头磕了几百年了,要是你们洋人不磕头,被我们老百姓看到,老百姓都觉醒了怎么办?清政府要求洋人不仅要磕头,还必须是标准的的三跪九叩,弯腰度数不够的不算。其它条款都可以商量,唯独这一条清政府坚持两百年不动摇。

所以事情会怎么发展已经很明显了。英国人跑来要求修约,清政府说,这个外务嘛,我们都是由两广总督处理,你们去广东吧。到了广东,广东大员说,哎呀,这么大的事要中央说话才行啊,你们去中央吧。在这之间,皇上和广东大吏们整天就在演戏对台词。踢皮球是中国人最拿手的事,广东踢到北京,北京踢到广东,英国人就在中间转,转来转去转了几年,快转出脑溢血了,英国人忍无可忍,决定出兵了。

用英国的头号中国通小斯当东的话说就是:“中国听不懂自由贸易的语言,只能听懂炮火的语言。”

用蒋廷黻先生的话说:“总而言之,外人简直无门可入。他们知道要修改条约,只有战争一条路了”。

于是英法联军就带兵来了,打到天津大沽口炮台,以四百人的伤亡占领了大沽口,清军阵亡两千。清军统帅叫僧格林沁,一向牛逼哄哄,认为英军火炮没什么可怕的。这下虽然输了,僧格林沁觉得没什么,不是武器装备落后的问题,是我们操作不够犀利,战术不够正确,走位不够风骚。

僧王不信邪,要死战到底。咸丰急了,跟僧格林沁说,老僧啊,别打了,“以国家依赖之身,与丑夷拼命,太不值矣”。

咸丰还说了句搞笑的话:“天下根本不在海口,实在京师”,意思是提醒僧王,天下之根本不在天津海口啊,是在京师啊,因为我在京师啊,你别搞错了,赶紧回来吧。

僧王一听,有道理,撤了。就这一场战役,就能看出大清君臣对自己和世界的知识水平。

天津守不住了,千万别让洋人打到北京啊,大清赶紧派人到通州跟洋人认怂,行行行,我们愿意谈判。于是两拨人就在通州坐下谈判。

谈判什么呢?呵呵,还是前面那几条,很明显这又是一次对牛弹琴的谈判。咸丰给前线谈判的大臣桂良说,你这一条不能同意,那一条也不能同意,别胆小,大不了再和洋人干一仗,怕个毛!

一个国家最高领导人是这样的智商,如何不悲剧?

英国人发现这完全是在对牛弹琴,果断不谈了,要求直接进京。咸丰一听,这还得了,这帮人胆子不小。于是跟前方的怡亲王说,英国人要是敢进京,你就把他们扣下来。

就是这么一个用屁股做出的决定,直接导致圆明园被烧。

1860年9月18日,也是一个九一八。这一天还在谈判,英国谈判团的团长巴夏礼跟怡亲王说,公使驻京,亲递国书,这一条我们是不会改的,你们看着办吧。说完后,跃身上马,扬尘而去,动作很潇洒。

怡亲王看着巴夏礼,卧槽,这么装逼啊,太嚣张了。于是跟僧格林沁说,皇上说了,他们要是太嚣张,谈判搞不定的话就把他们扣了。僧王姿势水平也不高,听从指挥,就把英国谈判团全都逮起来了,一共39个人。

最搞笑的大清给巴夏礼定的罪名——谋反。

说咸丰的这个决定是屁股做出来的一点也不为过。即使不说世界,说中国历朝历代,从来都是两军相争不斩来使,这在千年前就已经是国际法则了,哪怕野蛮的少数民族都是遵守的,这种例子举不胜举。而到了19世纪,人类已经大幅进步到文明社会的时候,竟然还发生这样的事,这让清政府的声誉和形象在西方国家严重下降。虽然清政府的形象本来也已经够烂了。

但是大清本来就是无视国际规则的,大清眼里也没有什么国际,所以咸丰还很开心,逮了人家的使者,觉得扬眉吐气了一回。僧格林沁抓着巴夏礼很高兴,妈的打仗你有火炮你牛,现在看你还怎么办。僧格林沁强行按着巴夏礼的头,让他磕了几个响头,满足了大清历届皇帝的梦想:终于看见洋人磕头了。

咸丰一看,擒贼先擒王,现在王已经擒了,咱们现在好好教训一下洋人那些小兵。清军出兵了,出兵的名义也很有意思——讨逆。

在通州八里桥,3万9千清朝骑兵出发,冲向2万5千英法联军。天真的大清准备趁着英法联军群龙无首,一举A平敌人。过程就不说了,说下结果:英法联军5死46伤,清方几乎全军覆没。

后来英国人在查看清军的军营时发现清军还在用弓箭和盾牌,说了一句话:“一个发明了火药的国家,竟然还在用弓箭作战。”

联军进了北京,马上就去解救那39个人。巴夏礼和秘书关在刑部大牢里,其他37人关在圆明园。联军在圆明园把这些人解救出来后,发现只剩下了19人,有20个已经被整死了。而且有些人的尸体被大卸八块,砍掉胳膊的,砍掉腿的,惨不忍睹。

后来有个幸存者回忆说:被逮的人里面有个叫的鲍尔比的《泰晤士报》记者,被抓起来后第四天就被整死了,尸体被扔到野地里喂野狗,吃光了。还有个安德森中尉,手脚被重度捆绑生了蛆,蛆一直蔓延到全身,精神错乱狂叫三天,死了。还有一个法国人,身上也生了蛆,蛆爬的他嘴巴、耳朵、鼻子里全都是,痛苦而死。这个幸存者还说,他在狱中数蛆,每天能繁殖1000只。

看到了这些场景,联军怒不可遏,对大清的野蛮忍无可忍。联军的总司令额尔金表示,必须要给清朝一个惨痛的教训。因为这些俘虏是在圆明园内被虐待而死的,所以要烧了这个园子。

当时,法国有个将军叫孟托班,他建议烧紫禁城。孟托班说,圆明园不设防,不算交战区,烧这里不好,要让清政府好好记住这个教训,那就烧皇宫,让他们更疼,才能记住。

但额尔金不同意。额尔金说:烧皇城,相当于烧北京,北京百姓又没惹咱们,为啥跟人家百姓过不去呢?圆明园是个私人园林,还是虐待我们俘虏的地方,就烧这里吧。

于是,圆明园就这么被烧了。烧之前,额尔金在北京城贴了张告示说:“任何人,无论贵贱,都要为自己的欺诈行为受到惩罚,18日将火烧圆明园,以此作为对皇帝的惩罚。与此无关人员不受此行动影响,唯清政府为其负责。”

清朝有个自媒体人叫汪康年,他写了个书叫《记英法联军焚劫圆明园事》,里面记载了一件好玩的事。英法联军在圆明园准备放火,却发现没有点火的东西,“各军并无火器,唯有水桶、水锅而已”。听说联军遇到了困难,附近海淀百姓纷纷带上火盆、秸秆赶来,助洋人一臂之力。汪康年记载,英法联军放火后,中国人跟在后面“到处引火延烧”,让火势扩大。这些清朝百姓完全不觉得圆明园跟自己有什么关系,最大的愿望是能跟老外一起多抢点宝贝出来。

这就是圆明园被烧的大致情况。皇帝为了自己不受屈辱,引来了一场战争,再因为自己的野蛮无知付出了圆明园被烧的代价,可以说这场战争是中国近代史上最无聊的一场战争。

但是,一百年多年过去,有些奇怪的事情却发生了:皇帝家的私人地盘被烧了,人家自己的老百姓跟着去打砸抢烧,一点不心痛,我们后人却恨得咬牙切齿;当年清朝皇帝本人的屈辱,突然变成了人民的屈辱,国家的屈辱,民族的屈辱。这是个不太好笑的笑话。

我们的历史书没有讲过这段历史。历史书的作用是培养我们记住圆明园被烧的仇恨,而不是让我们知道圆明园被烧的教训。这是比圆明园被烧更可怕的事情。


2016-12-10 夜深人静读历史

作者:李红豪
来源:李红小豪

-R/B2SI ,    -R/r2SJ

发表在 社会生活 | 标签为 , , , , | 留下评论

电热蚊香液套装无味婴儿孕妇家用补充液插电式灭蚊液护发素发膜正品修复干枯免洗家用护发补水顺滑女士发热焗油膏书皮纸自粘透明磨砂加厚包书皮小学生一二三四年级上册上学期书膜全套课本书本保护套16k封面外壳防水a4彩染发剂植物纯自己在家染头发膏女2021流行色显白天然