入門
本文適用于熟悉 UNIX®、mySQL 和其他開源技術(shù)的程序員。您將通過為 Consolidated Powerworks Company 構(gòu)建一個簡單的應(yīng)用程序來學(xué)習(xí) Moonlight 的基本知識,這是一家小型的虛擬公用事業(yè)公司,需要為 10 萬家客戶預(yù)測未來 20 年的月度需求。在讀完本文之后,您將會了解到以下內(nèi)容:
- 傳統(tǒng) Web 應(yīng)用程序的限制
- Moonlight 的優(yōu)勢
- 如何在 Free BSD UNIX 上安裝 Moonlight
- 如何使用 Moonlight 構(gòu)建和運行應(yīng)用程序
傳統(tǒng) Web 應(yīng)用程序的限制
Consolidated Powerworks 使用 Easy Demand 為其 10 萬家客戶追蹤和預(yù)測月度需求。這是 10 年前內(nèi)部開發(fā)的。使用 Easy Demand 的公司運營人員有著實際的業(yè)務(wù)需求,需要在設(shè)計可用能源生成時能看到客戶 20 年所有的月度需求。從頁面點擊到下一頁根本就不可行。他們需要在一個會話中看到所有 20 年的月度需求以找出趨勢,從而幫助他們合理設(shè)計客戶的需求。
事實已證明,Easy Demand 很難實現(xiàn)這一點。公司運營人員能在 Easy Demand 中輕松看到一、二,甚至是三年的月度需求數(shù)據(jù);但從查看 4 年的數(shù)據(jù)開始,Easy Demand 性能就降低了,如果查看 10 年或以上的數(shù)據(jù),性能就會大打折扣,通常需要花費幾分鐘。盡管操作人員需要查看 20 年的數(shù)據(jù),但 Easy Demand 實現(xiàn)不了,他們只好放棄嘗試了。他們的解決方法是每次將五年數(shù)據(jù)導(dǎo)入電子表格。幾年來,Consolidated Powerworks 的運營部門一直要求能夠提供一種更快速的數(shù)據(jù)處理方法。直到不久之前,IT 部門還反駁說處理大數(shù)據(jù)集(大于 10,000 行 x 50 列)時出現(xiàn)性能下降是很多 Web 應(yīng)用程序的常見現(xiàn)象。現(xiàn)在 Consolidated Powerworks 的 IT 部門對于 Easy Demand 的性能問題有了應(yīng)對之策,即名為 Moonlight 的新工具。
Moonlight 的優(yōu)勢
Moonlight 是由 Mono Project 開發(fā)的,這是一個由 Novell 贊助的開源軟件平臺。Mono Project 為使用 .NET 框架實現(xiàn)的 Linux® 開發(fā)社區(qū)提供尖端的開發(fā)解決方案。Moonlight 是免費的,可以在 Linux、BSD UNIX 和其他很多 UNIX 平臺上運行。
Moonlight 在設(shè)計時已經(jīng)考慮到對于數(shù)據(jù)和存儲密集型 Web 應(yīng)用程序的處理。它不僅能夠平穩(wěn)處理大數(shù)據(jù)集(大于 10,000 行 x 50 列),而且能集成多媒體和圖形。Moonlight 也讓編程變得更輕松。在本文后續(xù)部分您將看到,構(gòu)建一個簡單的數(shù)據(jù)庫應(yīng)用程序只需要八個步驟。在不遠的未來,Moonlight 將會出現(xiàn)在 Linux 桌面上,與 Web 瀏覽器配合使用。Moonlight 當前版本為 2.0,支持 Silverlight 2.0 以及一些 Silverlight 3.0 特性。Moonlight 3.0 預(yù)覽版在 2010 年 2 月發(fā)布。
如果您用的是 Chrome 或 Firefox,那非常幸運。有一些插件能讓 Moonlight 與這些瀏覽器配合使用(請參閱本文結(jié)尾部分的 參考資料,了解更多相關(guān)信息)。
在 Free BSD UNIX 上安裝 Moonlight
在構(gòu)建新的 Moonlight 應(yīng)用程序(我們稱為 Easier Demand for Consolidated Powerworks)之前,我們需要安裝 Moonlight 以及開發(fā)工具 monodevelop。需要以下六個步驟:
- 下載 Mono Project 源代碼
- 解壓縮源文件
- 確認安裝
- 安裝 Mono Project 開發(fā)工具
- 安裝 Moonlight
- 安裝 monodevelop
第 1 步:下載 Mono Project 源代碼
Mono Project 源代碼對公眾開放。使用瀏覽器,導(dǎo)航到 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 目錄下的文件。
- 開發(fā)工具
- 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 來構(gòu)建應(yīng)用程序:
- 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
- 其他
所有需要的文件都已下載,接下來安裝它們。
第 2 步:解壓縮源文件
您也許注意到了,所有下載的文件名擴展名都是 .tar.bz2。這意味著所有文件都用 tar 工具存檔,都用 bzip2 程序壓縮過了。您需要按照以下四個步驟在 BSD 命令行中解壓縮所有的下載文件:
- 解壓縮文件
- 要解壓縮 mono-2.8.2.tar.bz2:bzip2 -d mono-2.8.2.tar.bz2
- 將存檔分離成獨立的文件
- 要分離存檔文件 mono-2.8.2.tar:tar -xvf mono-2.8.2.tar.bz2
- 用 cd 命令進入所有解壓后的目錄
- 運行 make && 在所有解壓的目錄下安裝
第 3 步:確認安裝
現(xiàn)在已經(jīng)安裝了 Mono Project 源文件,接下來您需要確認安裝是否正確。您可以通過在 BSD 命令行輸入以下命令來完成此任務(wù):
pkg-config --modversion silverdesktop |
如果您是在 Linux 上運行 Firefox 或 Chrome,您可能還要安裝 Moonlight 插件(請參閱 參考資料 中的鏈接)。
第 4 步:安裝 Mono Project 開發(fā)工具
現(xiàn)在已經(jīng)準備好安裝下列 Mono Project 開發(fā)工具,這些工具將會在以后構(gòu)建應(yīng)用程序時用到。在 mono 和 mono-basic 目錄下能找到這些工具。
monomono-basicmoscow_m1moshmozartmpdmtascmungernawknbcnekonesasmnewlispmhc98nicklevm14fb8# |
要安裝 mono 目錄下的工具,需要在命令行輸入 清單 1 中的命令。
清單 1. 安裝 mono 目錄下的工具
cd /usr/ports/monomake && make install && make clean |
要安裝 mono-basic 目錄下這些工具,需要在命令行輸入 清單 2 中的命令。
清單 2. 安裝 mono-basic 目錄下的工具
cd /usr/ports/mono-basicmake && make install && make clean |
第 5 步:安裝 Moonlight
要安裝 Moonlight,需要在命令行輸入 清單 3 中的命令。
清單 3. 安裝 Moonlight
cd /usr/ports/multimedia/moonlightmake && make install && make clean |
以下內(nèi)容顯示,安裝文件都已得到正確安裝。
Moonlightmotionmp3cdmp4splitmpegmpeg2codec/usr/ports/multimediavm14fb8# cd moonlight/vm14fb8# lsMakefile distinfo filesvm14fb8# pwd/usr/ports/mulitmedia/moonlight |
現(xiàn)在能夠使用 Moonlight 來運行應(yīng)用程序了。僅僅剩下一項配置任務(wù),即安裝 monoDevelop。
第 6 步:安裝 monodevelop
Monodevelop 是我們用來構(gòu)建應(yīng)用程序的 Moonlight 開發(fā)工具。要安裝 monodevelop,需要在命令行輸入 清單 4 中的命令。
清單 4. 安裝 monodevelop
cd /usr/ports/devel/monodevelopmake && make install && make clean |
以下內(nèi)容顯示,monodevelop 文件都已得到正確安裝。
vm14fb8# pwd/usr/ports/devel/monodevelopvm14fb8# lsMakefile distinfo files pkg-decr pkg-plistvm14fb8# |
環(huán)境已搭建并配置完畢,現(xiàn)在可以開始構(gòu)建應(yīng)用程序了。
使用 Moonlight 構(gòu)建和運行應(yīng)用程序
已經(jīng)安裝好了 Moonlight,現(xiàn)在就可以構(gòu)建先進的 Web 應(yīng)用程序 Easier Demand for Consolidated Powerworks,該程序會訪問 mySQL 數(shù)據(jù)庫。將執(zhí)行下列八個步驟:
- 安裝 mySQL Version 5.1
- 創(chuàng)建 mySQL 數(shù)據(jù)庫和表
- 復(fù)制 CSV 文件
- 填充表
- 啟動 monodevelop
- 創(chuàng)建一個項目
- 定制項目文件
- 運行應(yīng)用程序
安裝 mySQL Version 5.1
請遵循本文結(jié)尾部分 參考資料 中關(guān)于 mySQL 鏈接的指南。
創(chuàng)建 mySQL 數(shù)據(jù)庫和表
現(xiàn)在 mySQL 已經(jīng)可以使用,接下來創(chuàng)建本應(yīng)用程序所需的數(shù)據(jù)庫和表。在 BSD 命令行中,登錄到 mySQL 并執(zhí)行 清單 5 的語句來創(chuàng)建數(shù)據(jù)庫。
清單 5. 創(chuàng)建數(shù)據(jù)庫
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); |
復(fù)制 CSV 文件
現(xiàn)在數(shù)據(jù)庫和表已建好,可以將本文所用到的數(shù)據(jù)填充進去,這些數(shù)據(jù)在 CSV 文件中。將 Consolidated Powerworks Seed Data (Cons_Pow.csv) 復(fù)制到 mySQL 執(zhí)行的目錄(參見 圖 1)。
圖 1. Consolidated Powerworks seed data
填充表
現(xiàn)在可以填充表了。在 BSD 命令行,執(zhí)行以下語句以加載 Cust 表:
LOAD DATA INFILE './ConsPow.csv' INTO TABLE Cust; |
記住一定要給文件名加上點斜杠(./)的前綴,以告知 mySQL 在其當前執(zhí)行的目錄下查找文件。
啟動 monodevelop
您現(xiàn)在只要在 BSD 命令行輸入 monodevelop 就可以啟動 monodevelop。
創(chuàng)建一個項目
從命令行啟動 Monodevelop 之后,就會出現(xiàn) IDE(參見 圖 2)。IDE 讓創(chuàng)建新項目變得很容易。
選擇 Create New Project,項目類型為 Moonlight Application Project。將項目命名為 Main, 然后單擊 OK。
圖 2. Monodevelop IDE
Consolidated Powerworks 應(yīng)用程序很簡單,只是頁面上的一個網(wǎng)格。網(wǎng)格是一個矩陣,它能夠緩存、分頁、集成 web 頁面上的字段,并且與非常流行的 Web 技術(shù) AJAX 很好地集成(請參閱 參考資料 中關(guān)于 AJAX 的信息)。
定制項目文件
項目一旦創(chuàng)建,就會生成兩個文件。第一個文件, Main.xam,定義了用戶界面。它用 XAML 這一流行的標記語言進行編碼。進而將自動生成的文件內(nèi)容替換成 清單 6 中的代碼。
清單 6. Main.xam
<UserControl x:Class="ConsolidatedPowerworks.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns ="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 esignHeight="860" d esignWidth="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 ataGrid 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® 創(chuàng)建,用于初始化對象值。創(chuàng)建 Moonlight 應(yīng)用程序后,就會產(chǎn)生 XAML 文件。表面上,XAML 不起眼;但是一旦在頁面布局中創(chuàng)建并添加組件,XAML 就成了關(guān)鍵之處。本例中,我們在頁面中添加一個 DataGrid。在 XAML 文件頂部,包含了我們所需的相關(guān) XML 標記/控件的命名空間。您會注意到,DataGrid 封裝在如 清單7 所示的 XML 標記中。
清單 7. 封裝的 DataGrid
<data ataGrid AutoGenerateColumns="True" Height="552" HorizontalAlignment="Left" Margin="52,59,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="892" DataContext="{Binding}" ItemsSource="{Binding}" /> |
數(shù)據(jù)命名空間來自下列程序集:System.Windows.Controls.Data.Input。我們用到的是 DataGrid 元素的 DataContext 和 ItemsSource屬性。這些屬性意味著我們將會對 DataGrid 進行綁定,這毫無疑問。綁定在 .cs (code-behind) 文件中完成。
我們不關(guān)心代碼后置文件。此處的重點是使用下列語句對 DataGrid 進行綁定:
dataGrid1.ItemsSource = getDataFromMySql(); |
因為已將 DataGrid 命名為 dataGrid1,因此后置代碼就能直接通過名稱引用網(wǎng)格,并且將 ItemSource 設(shè)置為從 MySql 返回的表。雖然這些語句很簡單,但其實后臺發(fā)生了很多事情。首先,DataGrid 會自動生成從 SQL select 語句返回的所有列。其次,DataGrid 不需要您額外編寫代碼就可以處理相應(yīng)的顯示/分頁。
第二個文件名為 Main.xaml.cs,它是 C# Implementation File,它將用戶界面和業(yè)務(wù)邏輯聯(lián)系在一起。請注意 .cs 后綴把文件標識為 C# 文件。進而將自動生成的文件內(nèi)容替換成 清單 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(); } }} |
運行應(yīng)用程序
替換文件后,按 F5 運行應(yīng)用程序。該 Web 頁面將會顯示一個預(yù)先填充的網(wǎng)格(參見 圖 3)。
圖 3. Consolidated Powerworks Web 頁面
Consolidated Powerworks 現(xiàn)在已經(jīng)有了 Web 應(yīng)用程序 Easier Grid,它會為 100,000 個客戶顯示 20 年的月度預(yù)測數(shù)據(jù)。在標準 Web 技術(shù)下,這么大的網(wǎng)格(240 列 x 10,000 行)的性能不會很好。但用了 Moonlight,效果很好。
結(jié)束語
10 年之前,先進的 Web 應(yīng)用程序也有限制。它們只能處理很少的數(shù)據(jù),而一些存儲密集的功能,如動畫和多媒體,也難以實現(xiàn)。有了 Moonlight 后,一切都發(fā)生了改變。大量數(shù)據(jù)(240 列 x 10,000 行)很容易處理,而且存儲密集型功能也很容易實現(xiàn)。
Aaron Olds 于 2004 年畢業(yè)于波特蘭州立大學(xué),并獲得計算機科學(xué)理學(xué)碩士學(xué)位。多年以來,他曾經(jīng)在多個財富 500 強公司中擔任大型復(fù)雜企業(yè)應(yīng)用的系統(tǒng)工程師職位。
Sam Boucot 于 1986 年畢業(yè)于加利福尼亞大學(xué),并獲得數(shù)學(xué)理學(xué)學(xué)士學(xué)位。多年以來,他曾經(jīng)在多個財富 500 強公司中擔任大型復(fù)雜 ERP 應(yīng)用方面的業(yè)務(wù)系統(tǒng)分析師職務(wù)。
http://www.ibm.com/developerworks/cn/aix/library/au-moonlightbsd/index.html