Feeds:
文章
迴響

Archive for 2009 年 12 月

這真是太厲害了,看完還是不懂他為什麼會動….. 

零件截圖

1. 水感測器,可用來偵測是否接觸倒水…

image

2. 大腦,二進位記步器,可計算走過幾步

image

3. 鼻子,可偵測暴風雨來臨

image

Read Full Post »

今天遇到一個正規表示法問題,我將問題簡化成如下:

有一個字串為 xyz_cwchiu ,請問我要怎麼透過正規表示法轉換成 /c/w/cwchiu

如果是你會怎麼作呢?

一開始我想的方向並沒有錯,就是 /xyz_(([a-z]{1})([a-z]{1})[a-z]+)/,可是我的疑問是 ( ) 被包在 ( ) 裡面,哪第一個 group 是那一個呢?

這就是我對 regex 運作不熟悉的地方,來看 javascript 的測試

alert( ‘xyz_cwchiu’.replace(/xyz_(([a-z]{1})([a-z]{1})[a-z]+)/, ‘/$2/$3/$1’) );

Python 呢?

re.sub(‘xyz_(([a-z]{1})([a-z]{1})[a-z]+)’, r’/2/3/1′, ‘xyz_cwchiu’)

C# 呢?

Console.WriteLine( Regex.Replace("xyz_cwchiu", "xyz_(([a-z]{1})([a-z]{1})[a-z]+)", "/$2/$3/$1") );

PHP 呢?

echo preg_replace(‘/xyz_(([a-z]{1})([a-z]{1})[a-z]+)/’, ‘/$2/$3/$1‘, ‘xyz_cwchiu’);

看來不用在測下去,結論是正規表示法確實可以作到,而且他的規則是由外而內,由左而右開始解析出要帶換的 group。

依據這個規則,如果表示式改成整個在加上一層 ( ) 如下:

alert( ‘xyz_cwchiu’.replace(/(xyz_(([a-z]{1})([a-z]{1})[a-z]+))/, ‘$1=>/$3/$4/$2′) );

結果會是什麼呢?如果你看懂上面的結論,應該不難猜出上述的執行結果~

ps. 如果真的看不出結果,在前面加上 javascript: 放到瀏覽器的網址列執行吧 XDDDD

Read Full Post »

如果你用過 Google Sites 應該會發現,目前插入 Docs 文件中不包含 PDF,之前沒有使用 Apps 的 Google Sites 時,我都用偷懶方式直接挖取原始中的 iframe 的 url ,並利用我之前寫得 insert-frame Gadget 來加入。

可是這個方式並無法有效用於分享給其他人,也有人遇到類似的問題,不過他採用一張圖片和超連結以另開新視窗方式解決,如下:

 

不過這個方式就不能在 Sites 裡面預覽挺不方便,於是我在他的基礎上,寫了一個 insert-pdf-to-site Gadget,簡單的說就是擁 iframe + docs viewer + 共用連結來完成。操作流程如下:

1. 開啟共用連結

image

image

2. 複製下載連結

image

3. 插入一個 Gadget,網址輸入 http://hosting.gmodules.com/ig/gadgets/file/115743901477621206857/insert-pdf-to-site.xml

image

4. 貼上剛剛複製的 PDF 下載連結

image

5. 然後你就會看到漂亮的成果 ^_____^

image

 

如果你的 Sites 大量使用 PDF 我建議建立一個文件範本,可以更方便~

Read Full Post »

今天看了一場精彩的 TED 演講:Pranav Mistry- 第六感的驚人潛力,我想你看了之後會覺得,目前市面上的手機、相機、電子書或觸控螢幕應該是過時產品。

這個影片是第二部讓我非常喜歡的 TED 演講(第一部當然是”教育扼殺創意”),Pranav Mistry 真的是一位非常棒的發明家,他有一些發常棒的想法,如消除數位與真實世界的分界,把科技從實驗室帶到大眾市場,最重要的是他把所想的實現了。如果你對他的研究有興趣,因為他打算開放研究的原始碼,你可到他的個人網站找尋,其中有一個專案區連結。

一些專案摘要

SixthSense 
這個是演講中談論最多的專案,利用 camera + 4 個手指不同顏色的紙套 + 視訊處理演算法實作比目前的看得到的點子產品都還棒。可用來照相、畫圖、整理照片、打電話、看影片、看天氣、掃描數上的物品、聽取書籍在網路上的書評、打電動、查出班機時刻…用你的想像力~

image image

image image image

image image image

image

 

inktuitive
一支可畫出立體圖形的筆
inktuitive2

QUICKiES
這個專案我也很喜歡,可在一張紙便條紙寫上備忘,然後電腦上會有一份同樣的備忘。可用來傳送 SMS 或同步到行事曆。

quickies2

真期待這些產品的出現~

Read Full Post »

今天看到一篇好文章“.NET 4.0新功能介紹:In Process Side By Side” 真想給他好好的推一推,主要是在談論 .NET 4.0 的新功能,簡單的說他可以讓程式當中同時運行多個 CLR,不過這個功能在 .NET4.0 才開始加入,所以只能讓 CLR 4.0 與 CLR 1.1 或 CLR 2.0 擇一搭配運行。不過未來 CLR 都會支援這個功能,因此未來一個程式可能同時有多個 CLR 在運作。

效能上不說了,一定不會比單一 CLR 好,但這樣的功能有什麼好處?

就如同那篇文章提到的場景,常常開發一個新元件之後可能不再維護或更新,可是主要程式還是在繼續開發,此時就會遇到需要將舊元件需要修改升級到較新的版本,如果你的元件很多或是維護人員不在了,那每次升級都是一個頭痛的問題。

但是現在引入這個 In-Proc SxS 功能後,舊元件就運行在舊的執行環境,主程式運行在新的執行環境,這樣就可以免除軟體升級的陣痛,真是一個相當好得功能。不知道 Java 有沒有提供類似的功能呢?

Read Full Post »

玩玩開心農場瀏覽器

這個工具剛出來時我覺得並沒有什麼特別,不就是內嵌一個 Browser,後來發現他有支援一些特別的功能,比如自動收割(雖然我用 v0.3 無法正確執行)引起我的好奇。所以,想看看他怎麼作,首先遇到的第一個問題是程式被混淆了。透過檢測發現他是使用 .NET Reactor 進行混淆。至於怎麼反混淆… 就不說了。

這個程式主要用到模擬滑鼠和鍵盤事件方式來達到自動化功能。不過我覺得比較辛苦的地方在於要事先知道功能圖示座標位置,進而送出 MouseClick 訊息即可。以下是一段自動澆水的片段

private void waterTimer_Tick(object sender, EventArgs e)
{
    if ((this.actionMode != 2) || this.isAuto)
    {
        this.checkDogAlert();
        WinAPI.MouseClickMessage(this.flashs.get_Item(0), FarmData.LandPoint[(FarmData.LandPoint.Length - this.doLands) - 1]);
        this.doLands++;
        if (this.doLands >= this.farmobject.Lands)
        {
            this.doLands = 0;
            if ((this.actionMode == 0) || (this.actionMode == 2))
            {
                if (this.checkBox6.get_Checked())
                {
                    WinAPI.MouseClickMessage(this.flashs.get_Item(0), this.ACTION_POINT[2]);
                    this.grassTimer.Start();
                }
                else if (this.checkBox7.get_Checked())
                {
                    WinAPI.MouseClickMessage(this.flashs.get_Item(0), this.ACTION_POINT[3]);
                    this.bugTimer.Start();
                }
                else
                {
                    this.isRun = false;
                    if (this.actionMode == 2)
                    {
                        this.autoClickFriendList();
                    }
                    else
                    {
                        this.clickFirendList();
                    }
                }
            }
            else if (this.actionMode == 1)
            {
                if (this.checkBox10.get_Checked())
                {
                    WinAPI.MouseClickMessage(this.flashs.get_Item(0), this.ACTION_POINT[2]);
                    this.grassTimer.Start();
                }
                else if (this.checkBox9.get_Checked())
                {
                    WinAPI.MouseClickMessage(this.flashs.get_Item(0), this.ACTION_POINT[3]);
                    this.bugTimer.Start();
                }
                else
                {
                    this.isRun = false;
                    if (this.actionMode == 2)
                    {
                        this.autoClickFriendList();
                    }
                    else
                    {
                        this.clickFirendList();
                    }
                }
            }
            this.waterTimer.Stop();
        }
    }
}

另一個有趣的地方是透過透過顏色比對方式來確認功能是否開啟,如下:

private void checkFriendList()
{
    if (!this.backModeChk.get_Checked())
    {
        using (ColorCompare compare = new ColorCompare(this.getWebBrowserImage(this.webBrowser1)))
        {
            if (compare.Compare(new Rectangle(FarmData.FriendListClose.get_X() - 6, FarmData.FriendListClose.get_Y(), 10, 3), this.friednListColor, true))
            {
                WinAPI.MouseClickMessage(this.flashs.get_Item(0), FarmData.FriendListClose);
            }
        }
    }
}

 

基本上目前我看到的 v0.3 版本就是依據這兩個混搭出所有自動功能~

Read Full Post »

Chrome 的 WebSocket 測試

最後更新時間:2012/8/8

最近需要測試 WebSocket, 利用這篇文章來複習一下,我的環境為 Python2.7.2+Win7+Chrome 21.x+pywebsocket r656

取得 pywebsocket 目錄構如下

└─src
│ COPYING
│ MANIFEST.in
│ README
│ setup.py

├─build
│ └─lib
│ └─mod_pywebsocket
│ │ common.py
│ │ dispatch.py
│ │ extensions.py
│ │ headerparserhandler.py
│ │ http_header_util.py
│ │ memorizingfile.py
│ │ msgutil.py
│ │ mux.py
│ │ standalone.py
│ │ stream.py
│ │ util.py
│ │ _stream_base.py
│ │ _stream_hixie75.py
│ │ _stream_hybi.py
│ │ __init__.py
│ │
│ └─handshake
│ draft75.py
│ hybi.py
│ hybi00.py
│ _base.py
│ __init__.py

├─example
│ bench_wsh.py
│ close_wsh.py
│ console.html
│ echo_client.py
│ echo_wsh.py
handler_map.txt
│ origin_check_wsh.py
│ pywebsocket.conf

├─mod_pywebsocket
│ │ common.py
│ │ dispatch.py
│ │ extensions.py
│ │ headerparserhandler.py
│ │ http_header_util.py
│ │ memorizingfile.py
│ │ msgutil.py
│ │ mux.py
│ │ standalone.py
│ │ stream.py
│ │ util.py
│ │ _stream_base.py
│ │ _stream_hixie75.py
│ │ _stream_hybi.py
│ │ __init__.py
│ │
│ └─handshake
│ draft75.py
│ hybi.py
│ hybi00.py
│ _base.py
│ __init__.py

└─test ~ 略

執行方式如下圖

 

 

 

 

 

 

 

 

 

 

 

 

 

HTML測試程式沒有變動~

 

——–

今天看到消息才知道 Chrome 4.0.249.0 已經支援 WebSocket,所以稍微嘗鮮一下,我的測試環境是

  • Windows Vista
  • Python 2.6
  • Chrome 4.0.266.0

首先 取得支援 WebSocket 的 Server – pywebsocket

svn checkout http://pywebsocket.googlecode.com/svn/trunk/ pywebsocket-read-only

然後安裝

python setup.py install

啟動 WebSocket Server

python standalone.py -p 3344 -w ..\example

執行結果應該類似這樣

image

然後是 Javascript 測試程式如下:

<html>
<head>
  <title> Chrome WebSocket Test #1 </title>
  <meta name="author" content="Chui-Wen Chiu"/>
</head> 
<body>
    <script>
    var ws = new WebSocket("ws://localhost:3344/echo");  

    ws.onopen = function(){
        alert('open');
        ws.send("hello");
    };

    ws.onmessage = function (evt) {        
        var received_msg = evt.data; 
        alert('receive: '+ received_msg);
    };  

    ws.onclose = function() { 
        // websocket is closed. 
        alert('close');
    };  

  </script>
</body>
</html>

執行結果

image

第二個測試

<html>
 <head>
  <title> Chrome WebSocket Test #2 </title>
  <meta name="author" content="Chui-Wen Chiu"/>
 </head>

 <body>
    <script>
    var ws = new WebSocket("ws://localhost:3344/echo");  

    ws.onopen = function(){
        document.getElementById('btnSend').disabled = false;
    };

    ws.onmessage = function (evt) {         
        var received_msg = evt.data; 
        document.getElementById('result').innerHTML += '<div>' + received_msg + '</div>';
    };  

    ws.onclose = function() { 
        document.getElementById('btnSend').disabled = true;
        alert('close');

    };  

    function btnSend_click(){
        var v = document.getElementById('txt').value;
        if (v.length > 0){
            ws.send(v);
        }
    }
  </script>
  <div>Input: <input type="text" id="txt"><button id="btnSend" onclick="btnSend_click()" disabled>Send</button></div>
  Receive:<div id="result"></div>
 </body>
</html>

執行結果:

image

如果輸入 Goodbye 就會結束連線

image

Read Full Post »

Older Posts »