2014年2月21日 星期五

在Windows 8上面執行Chrome OS

介紹在windows 8裡面可以重新啟動Metro的Chrome,
而且會以Chrome OS的模式出現,
所以就試試看囉.
    首先在Chrome的右邊選單選 "在windows 8模式中重新啟動Chrome",
    畫面就會跳到以Chrome OS模式出現的Chrome.

        Chrome OS模式

            接著來試試看OS該有的功能Chrome OS做了哪些,
            右下角Chrome的開始選單裡面放的是Chrome的extensions,
            並且這些extension app由於都是web技術為基礎的,
            因此儲存方式完全是走雲端功能.


              而該有的工作排程和多執行緒,Chrome也有做進去.
              我想最後會分不出來,現在執行的App到底是跑在Web Browser還是Native OS上面吧!



              而這次選測的App是Hobbit,
              看看Web based的App在3D圖形視覺效果的表現如何.
                Google極力扶持HTML5的技術,並且對這方面進行深入的分析
                而從瀏覽效果看起來似乎還不錯.
                我想因為視覺研究和攝影技巧的進步,
                光是平面圖片所創造出來的3D效果就已經有一定程度囉.

                    由於畫面是連續的,
                    就互動體驗來說想當不錯,
                    就擷取兩張圖片來示意一下.




                        結論: Google在Chrome投入的心力和技術已經慢慢成形了,
                        我想這真的是直接偷渡Chrome OS到Windows 8身上,
                        到時候Google真的很有可能因為一堆Cloud相關的產品,
                        而讓人直接在Windows 8上面跑Chrome OS,
                        Microsoft真的很令人擔心.

                        Native C++ and C# Bridge

                        C#有時候因為效能因素,需要和原生C++做溝通,這時候必須透過C++/Cli這個Bridge來做轉換,將受到Manage的Object轉換為Native的Object.
                        •  
                        如架構圖所示,C#可以透過C++/Cli的介面操作,而再由C++/Cli再將Manage的介面轉換為Native的介面.最後NativeC++再直接使用由C++/Cli所提供的Native介面 (此時C++/Cli所提供的Native介面就不能包含Manage的Code)
                        •  
                        下圖為架構圖:

                        Fig 1. 架構圖
                        而在實際的作法上,可以先使用C++/Cli Create一個Native的.h檔案,然後宣告一個無型別指標(Void*)用來存放C#的物件.再透過C++/Cli使用ManagePointer(^) new出一個C#的物件,並將Native Pointer(*)指向C# Object(^).
                        •  
                        這時候,不管Native C++要使用任何的C#function,只要先將NativePointer(*)轉換成ManagePointer(^)就可以操作C#了.
                        •  
                        而C#若要Send Event過去給Native C++,一樣需要先透過C++/Cli將C#的 EventHandle加入Manage的Event,然後在轉成Native的Event丟給Native C++.
                        •  
                        基本上轉換的過程中,都是透過ManagePointer和NativePointer互傳.
                        •  
                        下圖為運作架構圖:

                        Fig 2. 運作架構圖
                        最後附上簡易的 Bridge Sample Code
                        Sample Code
                        ------------------------Native C PlusPlus.h----------------------
                        define DECLSPECIFIER __declspec(dllexport)
                        define EXPIMP_TEMPLATE

                        typedef void(__stdcall *CallbackType)(void*, void*);
                        namespace NativeToMangeBridge
                        {
                             [event_source(native)]
                             class DECLSPECIFIER Bridge
                             {
                                  Public:
                                       void callCSfunction(std::stringmessage);
                                       __event void OnEventInvoke(CallbackType callback);
                                       void * m_ptr;
                             }
                        }
                        ----------------------------------------------------------------------

                        ------------------------Native/Cli.cpp-----------------------------
                        #include "Native C Plus Plus .h"
                        namespace NativeToMangeBridge
                        {
                              Bridge::Bridge()
                              {
                                      CSharpClass^ _CSInstances = gcnew CSharpClass();
                                      m_impl= GCHandle::ToIntPtr(GCHandle::Alloc(_CSInstances)).ToPointer();
                              }

                              voidBridge::callCSfunction(std::string message)
                             {
                                     GCHandle handle = GCHandle::FromIntPtr(IntPtr(m_ptr));
                                     CSharpClass^ _CSPtr = safe_cast<CSharpClass^>(handle.Target);
                                     String^ MgrMessage = gcnew String(message.c_str());
                                     _CSPtr->CSfunction(MgrMessage);
                             }
                        }
                        ----------------------------------------------------------------------

                        ------------------------Cli.cpp--------------------------------------
                        namespace NativeToMangeBridge
                        {
                             Cli::Bridge(Bridge _NativeCPlus)
                             {
                          _CSPtr->InfoChangeEvent += gcnew EventHandler<CSharpClass::EventHandler^>(this, &Cli::function);
                             }

                             Cli::function()
                             {
                                __raise NativeCPlus->OnEventInvoke(_Callbackfunction);
                             }
                        }
                        ----------------------------------------------------------------------

                        ChromeCast 分析 (2) – Launch and Play

                        在找到ChromeCast Device以後,
                        要Launch ChromeCast 內部的App (其實是一個Web),
                        所要做的通訊協定有以下四個步驟,如圖所示


                        在建立起Web Socket以後,
                        對於Multi-Media的控制狀態就由Web Socket來進行即時的雙向溝通
                        Receiver 所用到的Library
                        是放在google自己的空間裡,並且會定期更新和升級

                        而通訊協定的詳細內容與要傳送的資料,可以藉由WireShark這套網路封包分析軟體來擷取和觀察其中的資訊

                        最後,從整體架構來看,ChromeCast 是一個用於google 把數位內容輸出到TV的一個小型嵌入式系統,
                        根據http://www.androidcentral.com/chromecast-rooted-operating-system-detailed 所描述,ChromeCast裡面的OS是一個接近Android的系統
                        並且如果有USB OTG cable和flash的裝置,
                        可以把原本的OS燒入成有root權限的OS,
                        就可以直接透過Telnet連線
                        而ChromeCast所撥放的內容(web page)還是在其他Server上處理,
                        在ChromeCast OS上層應該還有一個類似Chrome的Browser,
                        負責瀏覽主要內容的網站


                        Chrome Cast 運作架構圖

                        ChromeCast 分析 (1) - Search

                        ChromeCast 介紹:
                        ChromeCast是一個USB大小的接收裝置,可以放在具有HDMI輸出的電視螢幕上.
                        它可以讓User從Client端選擇要播放的內容,像是影片或音樂,
                        也可以透過Chrome的Browser 鏡像映射畫面到ChromeCast的Device上.

                        ChromeCast 和 Chrome Browser 之間都是透過網頁的通訊協定再作溝通的.
                        我想是因為google是網頁技術起家的吧,而且透過Web的技術,
                        User experience 提升很多(在網路通順的情況下)

                        ChromeCast 硬體:

                        由於不論是成本或是架構,軟體和硬體的配合也很重要.
                        所以就順便看了一下ChromeCast 的硬體,
                        它是採用Marvell 88DE3005,但由於88DE3005 沒有公開的資訊,
                        因此可以拿88DE3100的架構圖來參考.


                        ChromeCast Browser:
                        ChromeCast本身是一個接收端,所以需要一個負責控制端,
                        如果選擇Chrome Browser當控制端,
                        需要另外下載Chrome extension才能使用

                        ChromeCast 模擬器(Android):
                        由於ChromeCast 在台灣還不容易買到,但上網搜尋了一下,
                        Android App 有模擬器可以用,叫做Cheapcast.
                        用起來跟實體的ChromeCast差不多,但Protocol接收的方式還是有些差別.
                        一開始可以先拿Cheapcast做開發測試.

                        ChromeCast protocol (DAIL):

                        搜尋一下ChromeCast 和 Chrome Broswer之間的通訊協定,
                        可以找到ChromeCast是使用一種叫做DAIL的通訊協定.
                        DIAL的全名叫做 DIscovery And Launch protocol specification,
                        從字義上來看,它是Chrome Broswer去搜尋和啟動ChromeCast的通訊協定.

                        DAIL通訊協定只負責到Launch 完ChromeCast裡面的APP就結束了.
                        剩下的控制部分是用Web Socket的RAMP協定做溝通.

                        DAIL是架構在SSDP (Simple Service Discovery Protocol)的基礎上,
                        在組合起來的通訊協定.
                        所以在一開始,Chrome Broswer是透過UPnP的M-Search做Broadcast,
                        透過Wi-Fi 對同網段的設備發出M-Search.

                        如果有ChromeCast的設備,在接收到M-search的封包時,
                        就會回應自身的資訊和IP位置給Chrome Broswer.回應的資訊裡面包含一些設備描述,和詳細資訊的XML檔案. Search的架構圖: 

                        M-Search的格式如下:

                        回應的XML描述如下:

                        這時候就完成對ChromeCast的搜尋,
                        並且可以得到ChromeCast的目標資訊,
                        接下來就是要Launch ChromeCast 內部的App.