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 »

最近在公司提議將文件搬移到 Google Sites 便於分享和查詢,而我是負責維護的人員,我面對的第一個問題是原始的 txt 文件如何轉入 Google Sites 呢?

其實在想這個需求之前,原本我是想利用 Chrome Extension + Google Sites 模擬我最喜歡的 Google Notepad 這個 Firefox 套件行為。可是測試發現導入 google ajax library 時會發生安全性問題,於是我決定先暫停改先從其他語言測試如何在 Google Sites 新增文章,所以我就選用容易上手的 Python,接著使用 Google 服務免不了要透過 GData,這個也有人實作了- GData Python Client,再來就如何透過 GData 使用 Sites 服務,還好 GData Python Client 提供了範例 sites_example.py 說明 Sites API 的使用,我就是依據這個寫了批次匯入功能。

完整程式碼可參考這裡,以下簡單說明如何使用

python docimport.py –name aaa –pwd bbbb –src f:MyExample*.txt

上述命令的 aaa 表示你的 gmail 帳號, bbbb 表示你的密碼,最後的 –src 表示你要匯入的文件目錄,目前只支援 txt 這類純文字格式。

執行確認身份後,會將檔名作為標題新增到"暫存文件"這篇文章之下。

寫這個程式遇到幾個問題

  • 檔案編碼(big5, utf-8, …)
  • 頁面的 url 不能為中文
  • 如何取得特定頁面的 feed

第一個問題我採用嘗試錯誤解決,先以 codesc.open 用 cp950 讀取,如果失敗再用 utf-8 來解決。

第二個問題如果是 Google Sites 提供的解法是將輸入的標題轉成羅馬拼音,而我沒有找到轉羅馬拼音的 module,所以我改用 GUID 來取代。另外,所以新增頁面要改成如下

new_entry = self.client.CreatePage(‘webpage’, title, content, uuid(), parent=parent)

title 是文章標題,content 是內文,uuid() 是自動產生 GUID 字串用來作為文章的 uri。

第三個問題是因為我不想讓新增的文章佈滿根節點,這樣以後要刪除這些暫存文件比較容易。這部份我是參考 C# 範例的作法,也就是利用 getContentFeed() 並採用 ?path= 參數取得特定路徑內容的 feed,取得 feed 之後就可放入上述 CreatePage 的 parent 參數,就可建立在指定文章之下的頁面。

以上就是這個程式遇到的一些問題和解決方式。

Read Full Post »

繼上次卡在第三關,得到同事柏輝的提示通過了,不過老實說我還是無法從題目、提示和圖片找出正確的 Pattern ,因為我原本猜測的 Pattern 應該是 "大大大小大大大"然後把小給挖出來拼出結果,可惜結果不是我要的~

image

解出第三題後,第四題就不難了,一切的提示都在原始碼

chainsaw

第五關需要花一點想像力,網頁上的提示是"pronounce it"我原以為是圖片裡面相關物品的發音,結果是了幾個都不對。於是打開原始碼找到另外一個提示

"peak hell sounds familiar ?"

英文不好這時候就看得出來 XD,我以為他是要我拼 hell 聽起來像是那個單字,哈哈,結果當然是錯得….

這裡的提示是 "peak hell" 發音聽起像是那一個 Python Module,用那個 Module 解開,原始碼的 <peakhell src="banner.p"/> 那個檔案密文,解開後並不是最終解,你還需要拼出答案,我在這邊被 Python 的 IDLE 害了,因為他的文字排版不太正確,建議輸出成檔案來看比較明顯。

peakhell

第六關網頁沒有任何"文字"提示,原始碼有兩個有趣的提示

1. 註解 <!– <– zip –>

2. 標題 <title>now there are pairs</title>

從提示 1 可以大概猜出應該是 zip() 函數或 zip 壓縮之類的解碼,但是要解碼的資料是什麼,我猜應該是圖片右上方那個箭頭所指的一串數字,因為提示 1 有個箭頭,不過這個要怎麼解我還在想 zip 要怎麼處理。至於提示2我完全沒有任何頭緒…. 有什麼好得建議嗎?

channel

Read Full Post »