北冥神功与六脉神剑(一)

北冥神功与六脉神剑

言念及此,登时心下坦然,默默祷祝:“神仙姊姊,你吩咐下来的事,段誉当然一定遵行不误,但愿你法力无边,逍遥派弟子早已个个无疾而终。”战战兢兢的打开绸包,里面是个卷成一卷的帛卷。
  展将开来,第一行写着“北冥神功”。字迹娟秀而有力,便与绸包外所书的笔致相同。其后写道:
  “《庄子》‘逍遥游’有云:‘穷发之北有冥海者,天池也。有鱼焉,其广数千里,未有知其修也。’又云:‘且夫水之积也不厚,则其负大舟也无力。覆杯水于坳堂之上,则芥为之舟;置杯焉则胶,水浅而舟大也。’是故本派武功,以积蓄内力为第一要义。内力既厚,天下武功无不为我所用,犹之北冥,大舟小舟无不载,大鱼小鱼无不容。是故内力为本,招数为末。以下诸图,务须用心修习。”

以上段落摘自金庸先生的天龙八部“玉壁月华明”。记不得阅读过多少次这些经典小说了,新冠病毒肆虐的今天,得益于祖国的强大,我们得以享受一份难得的安宁,是国家之福,程序员之福。的确,我们今天还可以欣赏、品味这些脍炙人口的作品,实乃人间的幸事。印象中第一次读天龙八部大概是1984年,那个时候是大三,由于是几个人轮流阅读,根本品味不出小说的精华,经常被下一位同学催促着,囫囵吞枣的就去读下一卷了,今天想起来,仿佛就是昨天的事情,那个时代的大学宿舍这一幕经常发生……。脑海之中经常浮现那些栩栩如生的人物,那些鲜活的个性、那些荡气回肠……。金庸先生的小说,其很多主题都建立在博大精深的中华文化基础之上,使人回味无穷。

若干年之后,无意之中开始考虑“北冥神功”、“六脉神剑”、“独孤九剑”、“乾坤大挪移”……,或许开始对软件编程做深入的思考,有意无意之间在琢磨“修行”究竟是什么……。说实话,我不是科班出身的程序员,骨子里还是觉得自己的出身是基础数学,所以许多方面的认知与科班出身的程序员有巨大的差异。年轻时候,我知道很多数学名家都是金庸迷,包括陈省身先生在内,金庸先生的很多粉丝都是科学界有影响力的人物,这一点是不争的事实。随着岁月的流逝,逐步对“内功深厚”有了一些肤浅的感受,编程方面似乎开始有了一些“套路”……。

当下将帛卷又展开少些,见下面的字是:“北冥神功系引世人之内力而为我有。北冥大水,非由自生。语云:百川汇海,大海之水以容百川而得。汪洋巨浸,端在积聚。此‘手太阴肺经’为北冥神功之第一课。”下面写的是这门功夫的详细练法。
  最后写道:“世人练功,皆自云门而至少商,我逍遥派则反其道而行之,自少商而至云门,拇指与人相接,彼之内力即入我身,贮于云门等诸穴。然敌之内力若胜于我,则海水倒灌而入江河,凶险莫甚,慎之,慎之。本派旁支,未窥要道,惟能消敌内力,不能引而为我用,犹日取千金而复弃之于地,暴殄珍物,殊可哂也。”

上面两段非常有意思,“反其道而行之”,说明了北冥神功创建者的独到之处,正向练功的典范,莫过于金庸“侠客行”之中的两位“岛主”,那两位高人,穷尽一生的精力,才得以窥视“侠客行”最高境界,认证了“朝闻道,夕死可矣”。另辟蹊径,也是侠客行的独到构思,石破天得以领悟侠客行,是因为其“不识字”,这一点的确让人唏嘘不已。

桌面客户端,是一个非常有意思的领域,这一段时间一直在CSDN各个论坛上转悠,在唱衰客户端编程的声音之下,这个领域的确很萧条,看看论坛的热度就知道这一点“绝非虚言”。事实上,真正意义下的客户端编程,一直是生机勃勃的,我们不能否认,互联网浏览器就是一款“客户端”,不管怎样,那些巨头公司,他们自己都是非常重视“客户端”开发,然而他们在客户端之上建立起规范之后,他们就会鼓励他们的用户群体遵守“基于实力的规则”以维护他们的秩序。

对Windows客户端开发而言,COM技术.NET技术Web技术Java技术C++技术以及Office互操作技术,是典型的六种主流开发技术,这里枚举的6个脉络,差不多涵盖了桌面开发的绝大多数主题。我们联想起什么?当我们仔细的考察以上6个方面,我们相信,一个理性的开发者,几乎很难染指所有提到的6个领域,或许是一种天方夜谭……

开发者是靠键盘讨生活的群体,用键盘去驾驭我们提到的6个脉络,毫无疑问是在修习一种六脉神剑,想起来是不是非常“微妙”? 段誉与虚竹,是天龙八部之中两个精彩的角色,他们不同的际遇,最终差不多同宗同源,这两个人对绝世武功看得都很淡,甚至逃避。最终他们都不同程度的参悟到北冥神功的精髓,其中当然得益于金庸的妙笔生花。北冥神功非常的难,与金庸笔下的葵花宝典的相似的地方是,入门环节不是一般人可以做到的,的确,独孤九剑的入门也非常难,用王语嫣的话说,天龙八部里面最终可能天下无敌的是“段誉”,究其原因是,段誉同时拥有北冥神功以及六脉神剑。

         多少年来,一直有一个愿望:打造一款客户端技术,与海外的主流客户端系统做一番较量,随着岁月的流逝,这个心愿逐渐的淡了,想想这个心愿有些不甘心,还存留那么一点同场竞技的心思,一时的冲动,泛起了一丝丝的涟漪……

         【内力既厚,天下武功无不为我所用,犹之北冥,大舟小舟无不载,大鱼小鱼无不容。是故内力为本,招数为末。】。这一段说明,北冥神功不是武功的招数,差不多相当于“基础设施、储备”,没有积累,就做不到“内力既厚”,吸收别人的内力为己用,在武学领域是自私、阴损的,在软件开发领域则是“软件复用”,换个领域,有一些思维是需要大力提倡的。从客户端角度看,Java有自己的加载器:java.exe,Java技术提供了一个规范,用于开发类似Java.exe之类的应用,用于处理各种java package,著名的类似系统有Eclipse,互联网浏览器也类似,事实上Web浏览器就是通过一个客户端应用来加载开发者按照规则写的html;.NET Framework也一样……,桌面客户端的领域,就是被这些彼此不同的“加载器、Launcher”强制的划分成不同的群体,看上去杂乱无章。“大舟小舟无不载,大鱼小鱼无不容”是一种境界,也是一种格局,从一个角度看,海纳百川,是华夏文明博大精深的精要所在……

         当我们仔细的分析Chromium、Eclipse、Electron等著名的项目,我们发现,每一个项目都在支撑着一类软件生态,海纳百川意味着一种广泛的包容,所以我们需要一个客户端领域的“北冥神功”、需要属于程序员的“六脉神剑”,将那些主流的客户端技术为你所用,想到这些,似乎有一些“豁然开朗”。在Windows平台上,让天下几乎所有的客户端组件资源为你所用,这个构思就是“北冥神功”。为此,我们需要改变观念,我们不需要“武林称雄”那样的诡异的葵花宝典,但我们的确需要“一切好的东西为我所用”的“北冥神功”,我们也需要能够自如驾驭“COM、.NET、Java、Web、C++、Office”等众多资源的六脉神剑。

万事开头难,准备重新开始

那老人抓住他手腕,向他上上下下的细细打量。突然虚竹只觉脉门上一热,一股内力自手臂上升,迅速无比的冲向他的心口,不由自主的便以少林心法相抗。那老人的内力一触即退,登时安然无事。虚竹知他是试探自己内力的深浅,不由得面红过耳,苦笑道:“小僧平时多读佛经,小时又性爱嬉戏,没好好修练师父所授的内功,倒教前辈见笑了。”
  不料那老人反而十分欢喜,笑道:“很好,很好,你于少林派的内功所习甚浅,省了我好些麻烦。”他说话之间,虚竹只觉全身软洋洋地,便如泡在一大缸温水之中一般,周身毛孔之中,似乎都有热气冒出,说不出的舒畅。
  过得片刻,那老人放开他手腕,笑道:“行啦,我已用本门‘北冥神功’,将你的少林内力都化去啦!  

虚竹大吃一惊,叫道:“什……什么?”跳了起来,双脚落地时膝盖中突然一软,一屁股坐在地下,只觉四肢百骸尽皆酸软,脑中昏昏沉沉,望出来犹如天旋地转一般,情知这老人所说不假,霎时间悲从中来,眼泪夺眶而出,哭道:“我……我……和你无怨无仇,又没得罪你,为什么要这般害我?“

构造一款动态、运行时支持“COM技术、.NET技术、Web技术、Java技术、C++技术以及Office互操作技术”的桌面客户端软件,您需要一个入口,这个入口奠定所有以上6各方面支持的全部基础,人口环节非常关键,段誉没有任何武功基础,所以修习北冥神功最容易,虚竹由于功夫低微,所以也是机缘巧合。从软件复用的角度看,软件开发不同于那些上乘武功,观念上接受软件复用,那么掌握所谓的“北冥神功”是非常容易的。也就是说,您需要的第一步,完全是观念的更迭,与技术基础几乎没有关系,即使没有无崖子也无妨。

新起点从构造一个exe开始

笑傲江湖是从拥有神秘色彩的“辟邪剑谱”开始的。由于江湖传闻,大家只知道其天下无敌,想据为己有者趋之若鹜,所以很多角色纷纷登场,各种阴谋,各种不择手段层出不穷。然“毒蛇出没之处,三步之内必有克制其蛇毒的草药”,贯穿全书的却是一套大道至简的“独孤九剑”,跌宕起伏的线索之中,上演着正邪纠缠的一幕幕沧桑,最终是笙箫和谐,成就一段姻缘。我们的设想是从C#开始,之所以这样是出于我对C#的一种偏爱,同时也是表达对经典的致敬,当然,我们也可以从其他的应用架构开始,其结果一定是殊途同归。

无论是岳不群,还是东方不败,他们得到的都是“葵花宝典“的”残本“,或许是金庸想塑造一些扭曲的人格,将小说纳入了一个”是非纷争“的场景。编程世界应该是没有是非的,基于此,我们打造一个开源项目(https://github.com/TangramDev/OpenUniverse),这个项目的初衷就是开放,进而形成有价值的软件生态。有了这个开源项目,对不同的开发者,都会找到合适的起点。进而开始自己的工作。用单一的框架同时支持6个(COM、.NET、Java、Web、C++、Office)软件技术生态,是一个充满挑战的构想,如果能够得以成立,毫无疑问,这个架构就是面向开发者的“北冥神功、六脉神剑”的融合技术。

如果我们非常明确的考虑六个方面:COM、.NET、Java、Web、C++、Office,那么我们的目标就是基于以上“6个维度”考虑一个软件生态系统,这个目标就是我们需要考虑的exe基本结构。

第一个C#工程

        关于第一个C#工程,是一个非常简单的C# WinForm工程,该工程的全部细节请参考:

第一个C#互联网客户端

FirstApp源代码

小荷初露尖尖角:第一次运行FirstApp.exe

        为了看到最简单的运行效果,我们在Form1上增加一个label对象,并调整一下Form1的背景色(红色):

 (调整Form背景色,增加Label对象) 

编译之后,我们需要创建一个FirstApp.index.html文件,这是一个Web页面,是启动程序的第一个关联文件:

<!DOCTYPE html>

<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <title>欢迎您进入一个全新的.NET世界, 我是您的朋友WebRuntime</title>
    <link rel="icon" href="webpage/app.png" sizes="32x32">
</head>
<body>
    <cosmos>
        <!-- Define new DOM elements -->
        <define tagName="mainWindow"></define>
        <define tagName="application"></define>
        <!-- End Define new DOM elements -->
        <!-- The "application" element is required, it can provide application-level configuration. -->
        <application>
            <ntp>
                <winNucleus>
                    <xobj id='grid' rows='1' cols='2' width='350,350,' splitterwidth='6'>
                        <xobj objid="FirstApp.Form1,host"></xobj>
                        <xobj objid="nucleus"></xobj>
                    </xobj>
                </winNucleus>
            </ntp>
        </application>
        <mainWindow objid="FirstApp.Form1,host" caption="The Universe" width="2400" height="1600" id="mainForm">
        </mainWindow>
    </cosmos>
</body>
</html>

将这个html文件(firstapp.index.html)放置在firstapp.exe所在的文件夹,启动firstapp.exe,我们会看到如下窗体:

(FirstApp.exe创建的第一个Form,看上去平淡无奇,事实上……) 

 的确,我们没有看到什么惊奇,然而,当你启动第二个实例(不要关闭刚刚创建的Form,找到FirstApp.exe,双击可执行文件启动第二个实例),惊奇的一幕发生了:

 (双击FirstApp.exe)

(运行第二个实例,我们看到完全不一样的场景)

第二次运行FirstApp.exe

我们不对FirstApp这个工程做任何修改,现在,我们写第二个Web页面,具体文件如下:

<!-- This is "index.html". Normally, it is named "ProjectName.index.html". This webpage is the real entry point of the HTML-driven App. -->
<!DOCTYPE html>

<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <title>欢迎您进入一个全新的.NET世界, 我是您的朋友WebRuntime</title>
    <link rel="icon" href="webpage/app.png" sizes="32x32">
</head>
<body>
    <cosmos>
        <define tagName="webViewport"></define>
        <webViewport>
            <winNucleus>
                <xobj rows="1" cols="3" width="750,300,200," id="xxx">
                    <xobj objid="FirstApp.Form1,host" id="navCtrl">
                    </xobj>
                    <xobj objid="nucleus" id="mainClient">
                    </xobj>
                    <xobj objid="FirstApp.Form1,host" id="navCtrl2">
                    </xobj>
                </xobj>
            </winNucleus>
        </webViewport>
    </cosmos>
    <strong style="font-size:32px; color:black">欢迎<i style="color:fuchsia">您来到</i><i style="color:blue">The Universe的 </i><b style="color:coral">.NET桌面编程世界</b>!</strong>
</body>
</html>

将上述html保存为"c:\testpage.html",启动FirstApp.exe,然后启动第二个实例打开内置浏览器:

 地址栏里面输入“c:\testpage.html”,然后回车,我们看到如下场景:

 我们看到,内置浏览器显示的内容是由两个Form与标准页面“合成”的。当然,我们可以写出更多的类似的html页面。

到了告一段落的阶段了

        我们看到了几个与原有开发不一样的环节

(一)主函数Main

        与常规的工程不同,主函数Main里面没有实例化Form对象,应用是从Web页面“ExeName.index.html”开始的,这一点意味着一个明显的变化,也就是说,不同的初始化页面,应用的主窗体应该完全不一样,我们很快会看到,这里的变化与常规的设计完全不一样。

(二)每个如上方式构造的应用系统,有一个“内置”的WebBrowser

这个全功能的浏览器,兼容标准浏览器的同时,给出了基于“应用”的Web页面,虽然刚刚露出一丝端弥,但是非常值得期待……

(三)支持任意多个内置浏览器窗体

因此可以打开任意多个应用页面,应用系统的内容空间被放大了,从第二个Web页面看,事实上,页面里面不应该只包含一个Form对象,甚至可以想象到,UserControl对象也应该是Web页面的“元素”……

(四)WinForm集成

初始化页面FirstApp.index.html可以实例化一个Form对象,这一点意味着,每个其他Web页面也应该可以创建弹出式的Form对象,也就是说,Web页面应该可以实例化任意多个独立的Form窗体,这一点非常类似于Office之中的VBA Form集成……

(五)动态Form

我们在第一个工程之中,Form上的内容几乎就是“空的”,可以期待Webpage对每一个Form窗体有更深层的挖掘潜力……

大舟小舟无不载:第三次运行FirstApp.exe

        大舟小舟无不载,应该是一种格局的体现,一个简单的FirstApp,事实上背后隐藏了很多的积累,当您的第一个FirstApp构造完毕之后,相当于虚竹无意之中破解了“珍龙棋局”,从此或许会开启一段新的软件之旅,后续究竟如何只能拭目以待……

        如果您愿意,您可以下载一个最新版本的Eclipse,具体的地址:Eclipse下载

(我们下载的是RCP版本,当然也可以是其他版本) 

下载完毕之后,将其解压:

(解压缩之后的Eclipse文件夹,您需要确保正确安装64位的JVM) 

我们看看接下来的事情,首先,您需要将FirstApp.index.html修改一下: 

<!-- This is "index.html". Normally, it is named "ProjectName.index.html". This webpage is the real entry point of the HTML-driven App. -->
<!DOCTYPE html>

<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <title>欢迎您进入一个全新的.NET世界, 我是您的朋友WebRuntime</title>
    <link rel="icon" href="webpage/app.png" sizes="32x32">
</head>
<body>
    <cosmos>
        <!-- Define new DOM elements -->
        <define tagName="mainWindow"></define>
        <define tagName="application"></define>
        <!-- End Define new DOM elements -->
        <!-- The "application" element is required, it can provide application-level configuration. -->
        <application>
            <ntp>
                <winNucleus>
                    <xobj id='grid' rows='1' cols='2' width='350,350,' splitterwidth='6'>
                        <xobj objid="FirstApp.Form1,host"></xobj>
                        <xobj objid="nucleus"></xobj>
                    </xobj>
                </winNucleus>
            </ntp>
            <defaultworkbench>
                <winNucleus>
                    <xobj id='grid' rows='1' cols='2' width='350,350,' splitterwidth='6'>
                        <xobj objid="FirstApp.Form1,host"></xobj>
                        <xobj objid="nucleus"></xobj>
                    </xobj>
                </winNucleus>
           </defaultworkbench>
        </application>
        <mainWindow objid="FirstApp.Form1,host" caption="The Universe" width="2400" height="1600" id="mainForm">
        </mainWindow>
    </cosmos>
</body>
</html>

我们注意到,页面之中增加了一个元素: 

            <defaultworkbench>
                <winNucleus>
                    <xobj id='grid' rows='1' cols='2' width='350,350,' splitterwidth='6'>
                        <xobj objid="FirstApp.Form1,host"></xobj>
                        <xobj objid="nucleus"></xobj>
                    </xobj>
                </winNucleus>
           </defaultworkbench>

 这个时候,我们需要第二个文件,是一个xml文件,其文件名为“firstapp.eclipse”,目前我们在FirstApp.exe所在的文件夹之中需要这个xml文件,里面包含的xml数据保留以后使用,现阶段只要是符合命名规则即可。

        当如上步骤完成之后,我们再启动FirstApp.exe,我们看到惊奇的一幕:

如此配置之后,一个全新的场景,内置互联网浏览器、集成.NET技术的Eclipse环境!) 

 事实上,我们得到一个这样的环境,一个内置浏览器、集成了.NET GUI的Eclipse,原则上,这是一个集Web、.NET、Java于一体的解决方案,我们选择Eclipse RCP版本,其中的含义值得品味……

       所谓“大舟小舟无不载”,有多种理解,然而其中心的设想应该是一种“海纳百川”的包容,我们如此设计,是考虑到.NET、Java、Web是软件开发的三个重要脉络,或者是相当于“六脉神剑”中的三个“经脉”,就现象上看,一个宿主Exe,同时接纳.NET、Java、Web三方面的内容,应该充分照顾了三个领域之中的人力资源(开发者群体)、技术资源(基于Web页面整合.NET/Java组件资源),当一个具体的应用,客观上可以集成这里提到的三条脉络,通过内置浏览器支撑应用页面,内置.NET WinForm系统,使得开发者如同采用Office VBA类似的方式对待其应用本身,应该体现出对“大舟小舟无不载”的一种诠释……

        我们需要注意的是初始页面FirstApp.index.html之中的application这个元素,其中的两个节点:

            <ntp>
                <winNucleus>
                    <xobj id='grid' rows='1' cols='2' width='350,350,' splitterwidth='6'>
                        <xobj objid="FirstApp.Form1,host"></xobj>
                        <xobj objid="nucleus"></xobj>
                    </xobj>
                </winNucleus>
            </ntp>
            <defaultworkbench>
                <winNucleus>
                    <xobj id='grid' rows='1' cols='2' width='350,350,' splitterwidth='6'>
                        <xobj objid="FirstApp.Form1,host"></xobj>
                        <xobj objid="nucleus"></xobj>
                    </xobj>
                </winNucleus>
            </defaultworkbench>

第一个子元素:是ntp,其完整名字:New TabPage,其实就是内置浏览器的“新页面”初始结构;第二个子元素:defaultworkbench,顾名思义,当Eclipse做为一个“子系统”纳入FirstApp.exe,那么这个节点事实上就是定义了Eclipse Workbench的初始结构,由于是基于Web的描述,各种结构的定义取决于具体的应用属性。

        我们回到Program.cs的主函数:

namespace FirstApp
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Universe.Cosmos.Run();
        }
    }
}

我们没有具体的指定程序的初始Form,取而代之的是一个初始化web页面,这个考虑值得注意,绝大多数情况下,我们不知道具体程序的主窗口究竟是什么对象,甚至不见得是一个Form对象,所以让web决定是一个灵活的弹性极大的处理模式,这个设计不同于Electron等流形的架构,我们将选择权留给具体的应用场景。

更多的信息……

        北冥神功与六脉神剑(二)   

        随着我们逐步展开我们的设想,我们希望更多的可以期待的事情,帷幕刚刚拉开,更多的细节非常值得期待……(待续……)

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AIGC Browser

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值