在 BSD UNIX 上使用 Moonlight 构建可扩展的开源 Web 应用程序

您是否曾经由于想要显示太多行和列,而导致 Web 应用程序执行缓慢?Moonlight 是微软 Silverlight 技术的开源实现,它能让大型而又复杂的 Web 应用程序运行稳定,即使要处理或显示大量数据。本文将向您演示如何在 BSD UNIX 上安装 Moonlight ,以及如何使用 Moonlight 构建一个带有数百列、数千行的应用程序。不需要您具有 Moonlight 经验。

Aaron Olds, 系统工程师, 自由职业者

Aaron Olds 于 2004 年毕业于波特兰州立大学,并获得计算机科学理学硕士学位。多年以来,他曾经在多个财富 500 强公司中担任大型复杂企业应用的系统工程师职位。



Sam Boucot, 顾问和作者, 自由职业者

http://www.ibm.com/developerworks/i/p-sboucot.jpgSam Boucot 于 1986 年毕业于加利福尼亚大学,并获得数学理学学士学位。多年以来,他曾经在多个财富 500 强公司中担任大型复杂 ERP 应用方面的业务系统分析师职务。



2011 年 9 月 01 日

入门

先决条件

本文需要用到以下工具:

  • Free BSD UNIX
  • mySQL
  • Consolidated Powerworks Seed Data File (Consolidated_Powerworks.csv)
  • Moonlight

本文最后的 参考资料 一节中有这些技术的链接,以及 CSV 文件的 下载

本文适用于熟悉 UNIX®、mySQL 和其他开源技术的程序员。您将通过为 Consolidated Powerworks Company 构建一个简单的应用程序来学习 Moonlight 的基本知识,这是一家小型的虚拟公用事业公司,需要为 10 万家客户预测未来 20 年的月度需求。在读完本文之后,您将会了解到以下内容:

  • 传统 Web 应用程序的限制
  • Moonlight 的优势
  • 如何在 Free BSD UNIX 上安装 Moonlight
  • 如何使用 Moonlight 构建和运行应用程序

传统 Web 应用程序的限制

Consolidated Powerworks 使用 Easy Demand 为其 10 万家客户追踪和预测月度需求。这是 10 年前内部开发的。使用 Easy Demand 的公司运营人员有着实际的业务需求,需要在设计可用能源生成时能看到客户 20 年所有的月度需求。从页面点击到下一页根本就不可行。他们需要在一个会话中看到所有 20 年的月度需求以找出趋势,从而帮助他们合理设计客户的需求。

事实已证明,Easy Demand 很难实现这一点。公司运营人员能在 Easy Demand 中轻松看到一、二,甚至是三年的月度需求数据;但从查看 4 年的数据开始,Easy Demand 性能就降低了,如果查看 10 年或以上的数据,性能就会大打折扣,通常需要花费几分钟。尽管操作人员需要查看 20 年的数据,但 Easy Demand 实现不了,他们只好放弃尝试了。他们的解决方法是每次将五年数据导入电子表格。几年来,Consolidated Powerworks 的运营部门一直要求能够提供一种更快速的数据处理方法。直到不久之前,IT 部门还反驳说处理大数据集(大于 10,000 行 x 50 列)时出现性能下降是很多 Web 应用程序的常见现象。现在 Consolidated Powerworks 的 IT 部门对于 Easy Demand 的性能问题有了应对之策,即名为 Moonlight 的新工具。


Moonlight 的优势

Moonlight 是由 Mono Project 开发的,这是一个由 Novell 赞助的开源软件平台。Mono Project 为使用 .NET 框架实现的 Linux® 开发社区提供尖端的开发解决方案。Moonlight 是免费的,可以在 Linux、BSD UNIX 和其他很多 UNIX 平台上运行。

Moonlight 在设计时已经考虑到对于数据和存储密集型 Web 应用程序的处理。它不仅能够平稳处理大数据集(大于 10,000 行 x 50 列),而且能集成多媒体和图形。Moonlight 也让编程变得更轻松。在本文后续部分您将看到,构建一个简单的数据库应用程序只需要八个步骤。在不远的未来,Moonlight 将会出现在 Linux 桌面上,与 Web 浏览器配合使用。Moonlight 当前版本为 2.0,支持 Silverlight 2.0 以及一些 Silverlight 3.0 特性。Moonlight 3.0 预览版在 2010 年 2 月发布。

如果您用的是 Chrome 或 Firefox,那非常幸运。有一些插件能让 Moonlight 与这些浏览器配合使用(请参阅本文结尾部分的 参考资料,了解更多相关信息)。


在 Free BSD UNIX 上安装 Moonlight

在构建新的 Moonlight 应用程序(我们称为 Easier Demand for Consolidated Powerworks)之前,我们需要安装 Moonlight 以及开发工具 monodevelop。需要以下六个步骤:

  1. 下载 Mono Project 源代码
  2. 解压缩源文件
  3. 确认安装
  4. 安装 Mono Project 开发工具
  5. 安装 Moonlight
  6. 安装 monodevelop

第 1 步:下载 Mono Project 源代码

Mono Project 源代码对公众开放。使用浏览器,导航到 Novell Mono Project 源文件(请参阅 参考资料)。需要下载 Mono 和 XSP / mod_mono 目录中所有文件:

  • Mono
    • mono-2.8.2.tar.bz2
    • mono-basic-2.8.tar.bz2
    • libgdiplus-2.8.1.tar.bz2
    • gluezilla-2.6.tar.bz2
  • XSP/mod_mono
    • xsp-2.8.2.tar.bz2
    • mod_mono-2.8.2.tar.bz2

还要下载 Development Tools 和 tk# 2.12 目录下的所有文件。尽管我们不会直接用到每一个文件,但是必须先安装其中的一些文件,然后才能安装 MonoDevelop 目录下的文件。

  • 开发工具
    • mono-tools-2.8.tar.bz2
    • gecko-sharp-2.0-0.13.tar.bz2
    • gtksourceview-sharp-2.0-0.12.tar.bz2
    • boo-0.9.3.3457.tar.bz2
    • ikvmbin-0.42.0.6.zip
    • mono-debugger-2.8.1.tar.bz2
    • cocoa-sharp-0.9.5.tar.bz2
    • nant-0.90-src.tar.bz2
    • IPCE-r7.zip
    • mono-addins-0.5.tar.bz2
  • Gtk# 2.12
    • gtk-sharp-2.12.10.tar.bz2
    • gnome-sharp-2.24.1.tar.bz2
    • gnome-desktop-sharp-2.24.0.tar.bz2

先要下载 MonoDevelop 目录里所有下列文件,然后我们才能使用 MonoDevelop 来构建应用程序:

  • MonoDevelop
    • monodevelop-2.4.1.tar.bz2
    • monodevelop-boo-2.4.tar.bz2
    • monodevelop-database-2.4.tar.bz2
    • monodevelop-debugger-gdb-2.4.tar.bz2
    • monodevelop-debugger-mdb-2.4.tar.bz2
    • monodevelop-java-2.4.tar.bz2
    • monodevelop-vala-2.4.tar.bz2
  • 其他
    • webkit-sharp-0.3.tar.bz2

所有需要的文件都已下载,接下来安装它们。

第 2 步:解压缩源文件

您也许注意到了,所有下载的文件名扩展名都是 .tar.bz2。这意味着所有文件都用 tar 工具存档,都用 bzip2 程序压缩过了。您需要按照以下四个步骤在 BSD 命令行中解压缩所有的下载文件:

  1. 解压缩文件
    • 要解压缩 mono-2.8.2.tar.bz2:bzip2 -d mono-2.8.2.tar.bz2
  2. 将存档分离成独立的文件
    • 要分离存档文件 mono-2.8.2.tar:tar -xvf mono-2.8.2.tar.bz2
  3. 用 cd 命令进入所有解压后的目录
  4. 运行 make && 在所有解压的目录下安装

第 3 步:确认安装

现在已经安装了 Mono Project 源文件,接下来您需要确认安装是否正确。您可以通过在 BSD 命令行输入以下命令来完成此任务:

pkg-config --modversion silverdesktop

如果您是在 Linux 上运行 Firefox 或 Chrome,您可能还要安装 Moonlight 插件(请参阅 参考资料 中的链接)。

第 4 步:安装 Mono Project 开发工具

现在已经准备好安装下列 Mono Project 开发工具,这些工具将会在以后构建应用程序时用到。在 mono 和 mono-basic 目录下能找到这些工具。

mono
mono-basic
moscow_m1
mosh
mozart
mpd
mtasc
munger
nawk
nbc
neko
nesasm
newlisp
mhc98
nickle
vm14fb8#

要安装 mono 目录下的工具,需要在命令行输入 清单 1 中的命令。

清单 1. 安装 mono 目录下的工具
cd /usr/ports/mono
make && make install && make clean

要安装 mono-basic 目录下这些工具,需要在命令行输入 清单 2 中的命令。

清单 2. 安装 mono-basic 目录下的工具
cd /usr/ports/mono-basic
make && make install && make clean

第 5 步:安装 Moonlight

要安装 Moonlight,需要在命令行输入 清单 3 中的命令。

清单 3. 安装 Moonlight
cd /usr/ports/multimedia/moonlight
make && make install && make clean

以下内容显示,安装文件都已得到正确安装。

Moonlight
motion
mp3cd
mp4split
mpeg
mpeg2codec
/usr/ports/multimedia
vm14fb8# cd moonlight/
vm14fb8# ls
Makefile     distinfo     files
vm14fb8# pwd
/usr/ports/mulitmedia/moonlight

现在能够使用 Moonlight 来运行应用程序了。仅仅剩下一项配置任务,即安装 monoDevelop。

第 6 步:安装 monodevelop

Monodevelop 是我们用来构建应用程序的 Moonlight 开发工具。要安装 monodevelop,需要在命令行输入 清单 4 中的命令。

清单 4. 安装 monodevelop
cd /usr/ports/devel/monodevelop
make && make install && make clean

以下内容显示,monodevelop 文件都已得到正确安装。

vm14fb8# pwd
/usr/ports/devel/monodevelop
vm14fb8# ls
Makefile   distinfo   files   pkg-decr   pkg-plist
vm14fb8#

环境已搭建并配置完毕,现在可以开始构建应用程序了。


使用 Moonlight 构建和运行应用程序

已经安装好了 Moonlight,现在就可以构建先进的 Web 应用程序 Easier Demand for Consolidated Powerworks,该程序会访问 mySQL 数据库。将执行下列八个步骤:

  1. 安装 mySQL Version 5.1
  2. 创建 mySQL 数据库和表
  3. 复制 CSV 文件
  4. 填充表
  5. 启动 monodevelop
  6. 创建一个项目
  7. 定制项目文件
  8. 运行应用程序

安装 mySQL Version 5.1

请遵循本文结尾部分 参考资料 中关于 mySQL 链接的指南。


创建 mySQL 数据库和表

现在 mySQL 已经可以使用,接下来创建本应用程序所需的数据库和表。在 BSD 命令行中,登录到 mySQL 并执行 清单 5 的语句来创建数据库。

清单 5. 创建数据库
CREATE DATABASE ConsPow;
Then execute the following statements to create two tables:
CREATE TABLE Cust (id INT, name VARCHAR(50));
CREATE TABLE DemUsg(custId INT, mth DATE, dem float);

复制 CSV 文件

现在数据库和表已建好,可以将本文所用到的数据填充进去,这些数据在 CSV 文件中。将 Consolidated Powerworks Seed Data (Cons_Pow.csv) 复制到 mySQL 执行的目录(参见 图 1)。

图 1. Consolidated Powerworks seed data
Consolidated Powerworks seed data 的截屏

填充表

现在可以填充表了。在 BSD 命令行,执行以下语句以加载 Cust 表:

LOAD DATA INFILE './ConsPow.csv' INTO TABLE Cust;

记住一定要给文件名加上点斜杠(./)的前缀,以告知 mySQL 在其当前执行的目录下查找文件。

启动 monodevelop

您现在只要在 BSD 命令行输入 monodevelop 就可以启动 monodevelop。

创建一个项目

从命令行启动 Monodevelop 之后,就会出现 IDE(参见 图 2)。IDE 让创建新项目变得很容易。

选择 Create New Project,项目类型为 Moonlight Application Project。将项目命名为 Main, 然后单击 OK

图 2. Monodevelop IDE
monodevelop IDE 的截屏

Consolidated Powerworks 应用程序很简单,只是页面上的一个网格。网格是一个矩阵,它能够缓存、分页、集成 web 页面上的字段,并且与非常流行的 Web 技术 AJAX 很好地集成(请参阅 参考资料 中关于 AJAX 的信息)。

定制项目文件

项目一旦创建,就会生成两个文件。第一个文件, Main.xam,定义了用户界面。它用 XAML 这一流行的标记语言进行编码。进而将自动生成的文件内容替换成 清单 6 中的代码。

清单 6. Main.xam
<UserControl x:Class="ConsolidatedPowerworks.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"xmlns:dataInput="clr-namespace:System.Windows.
Controls;assembly=System.Windows.Controls.Data.Input" d:DesignHeight="860" 
d:DesignWidth="966" xmlns:data="clr-namespace:System.Windows.Controls;assembly=
System.Windows.Controls.Data">
    <Grid x:Name="LayoutRoot" Background="White" Height="746" Width="1003">
        <dataInput:Label Height="50" HorizontalAlignment="Center" 
Margin="12,12,0,0" Name="label1" VerticalAlignment="Top" Width="376" 
Content="Consolidated Powerworks" FontSize="28" />
        <data:DataGrid AutoGenerateColumns="True" Height="552" 
HorizontalAlignment="Left" Margin="52,59,0,0" Name="dataGrid1" 
VerticalAlignment="Top" Width="892" DataContext="{Binding}" 
ItemsSource="{Binding}" />
    </Grid>
</UserControl>

XAML 是一种基于 XML 的声明式语言,由 Microsoft® 创建,用于初始化对象值。创建 Moonlight 应用程序后,就会产生 XAML 文件。表面上,XAML 不起眼;但是一旦在页面布局中创建并添加组件,XAML 就成了关键之处。本例中,我们在页面中添加一个 DataGrid。在 XAML 文件顶部,包含了我们所需的相关 XML 标记/控件的命名空间。您会注意到,DataGrid 封装在如 清单7 所示的 XML 标记中。

清单 7. 封装的 DataGrid
<data:DataGrid AutoGenerateColumns="True" Height="552" HorizontalAlignment="Left" 
Margin="52,59,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="892" 
DataContext="{Binding}" ItemsSource="{Binding}" />

数据命名空间来自下列程序集:System.Windows.Controls.Data.Input。我们用到的是 DataGrid 元素的 DataContextItemsSource 属性。这些属性意味着我们将会对 DataGrid 进行绑定,这毫无疑问。绑定在 .cs (code-behind) 文件中完成。

我们不关心代码后置文件。此处的重点是使用下列语句对 DataGrid 进行绑定:

dataGrid1.ItemsSource = getDataFromMySql();

因为已将 DataGrid 命名为 dataGrid1,因此后置代码就能直接通过名称引用网格,并且将 ItemSource 设置为从 MySql 返回的表。虽然这些语句很简单,但其实后台发生了很多事情。首先,DataGrid 会自动生成从 SQL select 语句返回的所有列。其次,DataGrid 不需要您额外编写代码就可以处理相应的显示/分页。

第二个文件名为 Main.xaml.cs,它是 C# Implementation File,它将用户界面和业务逻辑联系在一起。请注意 .cs 后缀把文件标识为 C# 文件。进而将自动生成的文件内容替换成 清单 8 中的代码:

清单 8. Main.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;


namespace ConsolidatedPowerworks
{
    public partial class MainPage :UserControl
    {
        public MainPage()
        {            
            InitializeComponent();
            dataGrid1.ItemsSource = getDataFromMySql(); 
        }
    }
}

运行应用程序

替换文件后,按 F5 运行应用程序。该 Web 页面将会显示一个预先填充的网格(参见 图 3)。

图 3. Consolidated Powerworks Web 页面
Consolidated Powerworks Web 页面

Consolidated Powerworks 现在已经有了 Web 应用程序 Easier Grid,它会为 100,000 个客户显示 20 年的月度预测数据。在标准 Web 技术下,这么大的网格(240 列 x 10,000 行)的性能不会很好。但用了 Moonlight,效果很好。


结束语

10 年之前,先进的 Web 应用程序也有限制。它们只能处理很少的数据,而一些存储密集的功能,如动画和多媒体,也难以实现。有了 Moonlight 后,一切都发生了改变。大量数据(240 列 x 10,000 行)很容易处理,而且存储密集型功能也很容易实现。


下载

描述名字大小
文章源代码Consolidated_Powerworks.csv30KB

参考资料

学习

  • 了解更多关于 Silverlight 的内容,这是基于微软的 Silverlight 技术。
  • 阅读关于 Moonlight 调试 的优秀教程。
  • 获取 BSD 操作系统的 Mono Project 支持
  • 获取更多关于如何使用 Moonlight plugins for Chrome and Firefox 的信息。
  • 了解更多关于开源开发平台 Mono Project 的信息。
  • 找到更多关于 bunzip2 和其他 Linux 命令的信息。
  • 可在 FreeBSD Ports 目录 获取 Moonlight 第 1 版。
  • 什么是开源:开源软件对于想要节约 IT 预算的公司来说是个很有吸引力的选择。想要查找更多关于开源软件的内容,请阅读 ONLamp.com 上的文章。
  • 在 Wikipedia 上查找更多关于商用和开源 内容管理系统 的信息。
  • Five Ajax best practices(Nathan Good,developerWorks,2010 年 11 月):学习能用在每天的 Asynchronous JavaScript + XML (Ajax) 开发中的五项最佳实践。
  • A guide to writing unobtrusive JavaScript and Ajax (Joe Lennon,developerWorks,2010 年 11 月):学习如何采用技术,以低调的方式获取开发 Web 应用程序带来的收益。
  • MySQL 是最流行的开源数据库。了解更多信息,请查看 播客指南
  • developerWorks 中国网站开源技术专区:访问 developerWorks 开源专区,查看大量的 how-to 信息、工具和项目更新,以帮助您了解如何使用开源技术进行开发,以及如何同 IBM 产品相结合使用。
  • developerWorks 技术活动和网络广播:随时关注 developerWorks 技术活动和网络广播的最新进展。
  • AIX and UNIX 专区:developerWorks 的“AIX and UNIX 专区”提供了大量与 AIX 系统管理的所有方面相关的信息,您可以利用它们来扩展自己的 UNIX 技能。
  • AIX and UNIX 新手入门:访问“AIX and UNIX 新手入门”页面可了解更多关于 AIX 和 UNIX 的内容。
  • AIX and UNIX 专题汇总:AIX and UNIX 专区已经为您推出了很多的技术专题,为您总结了很多热门的知识点。我们在后面还会继续推出很多相关的热门专题给您,为了方便您的访问,我们在这里为您把本专区的所有专题进行汇总,让您更方便的找到您需要的内容。
  • AIX and UNIX 下载中心:在这里你可以下载到可以运行在 AIX 或者是 UNIX 系统上的 IBM 服务器软件以及工具,让您可以提前免费试用他们的强大功能。
  • IBM Systems Magazine for AIX 中文版:本杂志的内容更加关注于趋势和企业级架构应用方面的内容,同时对于新兴的技术、产品、应用方式等也有很深入的探讨。IBM Systems Magazine 的内容都是由十分资深的业内人士撰写的,包括 IBM 的合作伙伴、IBM 的主机工程师以及高级管理人员。所以,从这些内容中,您可以了解到更高层次的应用理念,让您在选择和应用 IBM 系统时有一个更好的认识。
  • developerWorks 播客:收听 IBM 技术专家谈话。

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=AIX and UNIX, Open source
ArticleID=755097
ArticleTitle=在 BSD UNIX 上使用 Moonlight 构建可扩展的开源 Web 应用程序
publish-date=09012011