Feeds:
文章
迴響

Archive for 2009 年 08 月

拖了這麼多天才寫 T_T

這次講員依然是董大偉老師,主題是"Silverlight 3 新功能實務應用範例講座"內容相當的精彩,本次重點著重在 Silverlight 3 新功能上面,在這當中我最感興趣的兩個功能是 OOB(Out Of Browser) 和 .NET RIA Services,OOB 我之前已經有作過一些資料收集,不過仍有不少疑問,透過這次研討會有機會親自問問老師關於 OOB 的技術細節,先說結論吧,OOB 沒有我想像中的這麼好,我原以為他脫離 Browser 之後可以像 AIR 一樣,其實不然,他只是網頁中間那塊 XAP 移到內嵌 Browser 的獨立 APP 執行,如果你的程式除了 XAP 之外,還有透過 JS/HTML 進行一些互動,很抱歉執行 OOB 之後你的程式就殘廢了。所以,目前 OOB 僅適用於獨立的 XAP 運作模式。如:遊戲、小時鐘。

再來就是 OOB 有跨網域問題,原來在網頁上的不會有網域問題,可是獨立到 App 後,網域和原來 Server 是不同的,因此要能夠順利運作,必須在 Server 定義 cross-domain.xml。其他限制還有

  • 無法設為 AUTORUN
  • 無法設為 TrayIcon
  • 無法定義 OOB 的視窗外觀,如:視窗不能縮放
  • 無法透過簽章取得較高的權限

再來說說 .NET RIA Services,從 DEMO 看來總是超方便的,透過開發工具將資料表拉出來自動產生資料來源程式碼,然後 Silverlight 透過 DataGrid, DataPager 接收資料呈現,簡簡單單不用寫程式就可以完成資料表的呈現,而且還具有基本的 CRUD、排序、過濾等功能,真是太強了。不過….. 也不是這麼美好,目前資料庫我詢問只支援 MS SQL Server,另有一個專案支援 Oracle,但是我們公司目前用的 MySQL 是不支援的。所以剛剛說得拖拉資料表的美景就破滅了。

然後是 Table Join,只要是 ORM 都匯遇到 Join 問題,.NET RIA Services 也不例外,可以作但需要花點成本。再來是比較麻煩的問題,也是我目前覺得該技術還不適合用的原因是"驗證",如何進行身份驗證,雖然可以快速的將資料庫來源呈現在用戶端,可是我並不希望資料讓每個使用者看到,我希望通過授權的使用者才能取得,這時就會相當麻煩。

簡言之 .NET RIA Services 在繼續觀察後續發展。

除了剛剛說得兩個主題之外,其實 Silverlight 的 3D 功能也相當不錯,簡簡單單就能夠呈現 3D 效果,如下是沿著X軸旋轉的範例:

[MainPage.xaml]

<UserControl x:Class="SilverlightApplication1.MainPage"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml&quot;

    xmlns:d="http://schemas.microsoft.com/expression/blend/2008&quot; xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 

    mc:Ignorable="d" d:DesignWidth="640" d:DesignHeight="480">

    <UserControl.Resources>

        <Storyboard x:Name="Storyboard1">

            <DoubleAnimationUsingKeyFrames 

                BeginTime="00:00:00"

                Storyboard.TargetName="img"

                Storyboard.TargetProperty="(UIElement.Projection).(RotationX)"

                RepeatBehavior="Forever">

                <SplineDoubleKeyFrame KeyTime="00:00:00" Value="0"/>

                <SplineDoubleKeyFrame KeyTime="00:00:02" Value="360"/>

            </DoubleAnimationUsingKeyFrames>

        </Storyboard>

    </UserControl.Resources>

    <Grid x:Name="LayoutRoot">

        <Image Source="logo.jpg" x:Name="img">

            <Image.Projection>

                <PlaneProjection RotationX="0"></PlaneProjection>

            </Image.Projection>

        </Image>

    </Grid>

</UserControl>

[MainPage.xaml.cs]

namespace SilverlightApplication1 {

    public partial class MainPage : UserControl {

        public MainPage() {

            InitializeComponent();

this.Storyboard1.Begin();

        }

    }

}

重點只有紅色標記那幾行,其他只是動畫效果讓他沿著 X 軸的0度轉到360度然後一直重複。簡單幾行就可以呈現 3D 效果。不過他的3D是模擬出來的,因此沒有陰影、網格等特性。另外他使用 GPU 進行運算不會使用到 CPU 資源。

以上就是這次研討會關於 Silverlight 部份的心得,雖然缺點比我想像的多,不過他的還是有其應用場合優勢也不少,另外他也具有主場優勢,如果 Windows7 成功,Silverlight 的佔有率也會水漲船高不可忽視。還有如果你也曾關注過 Adobe Flex/AIR,你會發現與 Silverlight/OOB  技術上有極大對應關係 ^^ 競爭意謂十足

如果你對研討會內容有興趣,也可以下載投影片回去讀。如果沒有辦法讀 pptx 我也有將投影片丟一份到 SideShare 如下網址,可以直接閱讀

http://www.slideshare.net/cwchiu/sl30-beta

http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=sl30beta-090827180718-phpapp02&stripped_title=sl30-beta

Read Full Post »

在“ClickOnce 心得”文章中我層提到可透過 Process.Start 來驅動需要系統管理權限的程式,其實這個作法有很多其他用途,我第一個想到的就是將電腦中小型可透過 Copy 方式來佈署的程式製作成 ClickOnce ,這樣我到任何一台電腦只要簡單的 Click 一下就可以執行我要得程式,很不錯吧 ^^

作法也很簡單,如果只是把 ClickOnce 當作一個載入器,可在 Main 程式中加入下述程式碼

String fn = Path.Combine(Application.StartupPath, "Everything-1.2.1.371.exe");
Process proc = new Process();
ProcessStartInfo si = new ProcessStartInfo(fn);
si.UseShellExecute = true;
proc.StartInfo = si;
proc.Start();
Application.Exit();

當 ClickOnce 程式啟動後就會驅動指定程式,如果需要系統管理者權限,就會出現 UAC 視窗,如下 Windows 7 的提示

image

允許之後,程式就會執行,覺得挺不錯的吧 ^^

image

透過這個方式,我可以統一在一個地方升級程式,任何地方我只要執行就可以執行最新的程式而不用手動更新,超讚的

找個時間把我電腦常用的可攜軟體封裝一下,如果可以去除安裝 .NET Fx 就更方便了~

 

測試網址:http://cwchiu.chuiwenchiu.tu2.ru/portable/publish.html

Read Full Post »

在“ClickOnce 心得”文章中我層提到可透過 Process.Start 來驅動需要系統管理權限的程式,其實這個作法有很多其他用途,我第一個想到的就是將電腦中小型可透過 Copy 方式來佈署的程式製作成 ClickOnce ,這樣我到任何一台電腦只要簡單的 Click 一下就可以執行我要得程式,很不錯吧 ^^

作法也很簡單,如果只是把 ClickOnce 當作一個載入器,可在 Main 程式中加入下述程式碼

String fn = Path.Combine(Application.StartupPath, "Everything-1.2.1.371.exe");
Process proc = new Process();
ProcessStartInfo si = new ProcessStartInfo(fn);
si.UseShellExecute = true;
proc.StartInfo = si;
proc.Start();
Application.Exit();

當 ClickOnce 程式啟動後就會驅動指定程式,如果需要系統管理者權限,就會出現 UAC 視窗,如下 Windows 7 的提示

image

允許之後,程式就會執行,覺得挺不錯的吧 ^^

image

如果可以去除安裝 .NET Fx 就更方便了~

Read Full Post »

ClickOnce 心得

最近開發一個小工具,因為工具簡單、檔案也不大也不需要特別系統權限,嘗試使用 ClickOnce 方式進行佈署,真的是相當便利,只要簡單的發布,使用者就可以在啟動時取得最新的版本。

不過開發上仍遇到一個困擾很久的問題,因為我的開發環境是 VS2008 繁體中文環境,如果用戶端電腦沒有 .NET Fx 時,安裝程式會自動下載安裝真是很便利,不過這個工具是要給日本客戶使用,因此安裝 .NET Fx 應該要使用日文語系套件,可是內建於 VS2008 的只有繁體中文套件。解法方法有兩個,其一[1]是手動代換內建繁體中文的 eula 成日文版本,可從 dotnetfx.exe 中取得,其二是透過自訂轉散發套件,自訂一個日文語系版本。

另外以前我一直認為 ClickOnce 無法存取檔案和登錄檔,這次剛好把微軟論壇與 ClickOnce 相關的討論看過一遍,發現其實有辦法在 ClickOnce 程式存取系統檔案。作法就是將需要較高權限的程式獨立到 ClickOnce 程式之外,並在該程式 manifest 設定需要管理者權限,然後透過附加檔案方式將相關檔案加入 ClickOnce 程式,ClickOnce 則透過 Process.Start( ) 方式驅動需要管理者權限的程式,因此在 Vista 或 Windows 7 等環境會詢問使用者賦予較高的權限來執行,如果允許就可以進行檔案和登錄檔的存取。

還有 Firefox 也可透過安裝Microsoft .NET Framework Assistant 1.1 支援 ClickOnce。目前我在 Firefox 3.5.2 測試可行。

ClickOnce 雖然好用,缺點也不是沒有,如IE6支援的不是很好,檔案太大我覺得也不適用。不過他還是有很多應用的地方,希望 Microsoft 未來能夠持續改善。

測試用 ClickOnce 程式(檔案、登錄檔讀寫)
展示頁面

參考資料
[1] http://tlcheng.spaces.live.com/blog/cns!145419920BFD55A7!4185.entry

Read Full Post »

Ajaxplorer 的 Action 機制

今天為了修改 Ajaxplorer 無法建立中文目錄的問題,居然在前端網頁找不到建立目錄的關鍵字,再次看看這個 Project 到底是怎麼寫得,把這個操作流程隱藏起來了。研究了一天終於搞清楚他的設計,原來他為了擴充方便,將 UI 上面的操作(稱之為 Action)定義在 XML,當UI主要載入完成之後,再向系統取得目前可使用的 Action List,然後動態建立相關的 Action 和 UI,當使用者透過 UI 觸發 Action 執行定義操作,上述流程整理成如下:

image

所以簡單來說,前端是一個Action XML 的 Render Engine。這樣規劃我想就之前說得為了擴充方便,如果你現在要支援 Google Storage,你只要定義對應的 Action XML 然後餵給前端,前端 UI 就可以使用 Google Storage。題外話 Learnning Agent 也是採用這種方式建立 Plugin 機制。

Read Full Post »

今天開始研究 Ajaxplorer 這個 Open Source Project,結果令人傻眼的居然將關鍵的 ajaxplorer.js 給編碼了,他採用的是 Dran Edwards 所提供的編碼方式,還好[1] 提供了解碼方式,我將他稍微修改整理成如下步驟(我用 FF3.5)

  1. 連線到 http://dean.edwards.name/packer/
  2. 將 javascript:for%20(i=0;i<document.forms.length;++i)%20{for(j=0;j<document.forms[i].elements.length;++j){document.forms[i].elements[j].removeAttribute(%22readonly%22);document.forms[i].elements[j].removeAttribute(%22disabled%22);}} 貼到網址列並執行
  3. 將編碼的 js 複製到下方的文字方塊並執行「Decode」
  4. 複製下方解碼厚的內容
  5. 連線到 http://tool.chinaz.com/Tools/JsFormat.aspx
  6. 將解碼後的程式碼貼在文字方塊
  7. 執行格式化
  8. 複製格式化結果
  9. 完成

備註:[1] 有使用 Javascript Tidy 進行後處理,可是我的測試結果是會導致 js 錯誤

 

2013/1/30 更新

新版混淆方式破解可參考 [2],可將 “while(c–){if(k[c]){p=p.replace(new egExp(‘\\b’+e(c)+’\\b’,’g’),k[c])}}return p"片段的 return p 改為 console.log(p) 即可取得 source code, 在透過 jsFormat 就可完全還原

 

參考資料
[1] http://www.red-root.com/code/decompressing-packed-javascript-files/
[
2] http://www.cnblogs.com/wangchunming/archive/2012/04/01/2429455.html

Read Full Post »