Feeds:
文章
留言

Archive for 2006 年 03 月

 
初期使用還真的相當不錯 ,不過預設只有4各虛擬桌面,不知道是不是還可以手動增加… 目前尚未找到選項…
 

原文出處:ToGet電子報
超強又免費的虛擬桌面軟體:Dexpot

軟體:Dexpot(版本:1.3)
類別:桌面管理
性質:Freeware(1.68 MB)

【編輯/王國淵】

當你所開啟的視窗越多,那麼你的桌面就會變得更雜亂。一般電腦桌面的解析度就只有 1024×768 ,可以同時擺放下幾個工作視窗呢?相信一般人都是一個視窗就佔住了整個桌面。這個時候如果要切換到別的工作視窗,就必須要從那窄小的工作列中去尋找了。這個時候許多用過 Linux 的使用者就會想起那方便的多重桌面,讓你能夠將不同的工作視窗開啟在不同的桌面當中,並且透過滑鼠快速切換所想要使用的桌面。如果這麼方便的工具也能夠出現在 Windows 上,那該有多好呢?其實是有的,筆者接下來要介紹的 Dexpot 就是這樣的一款工具。

Dexpot 是一款免費提供給個人使用者使用的虛擬桌面工具(作為商業使用時需要付費購買),它能夠讓使用者建立 20 個獨立的虛擬桌面,讓你把不同的工作放到不同的桌面當中,並且提供方便的滑鼠與熱鍵切換功能,讓使用者能夠在不同的虛擬桌面之間進行快速地切換。

除了創建多個桌面外,Dexpot 還能夠讓使用者將特定的視窗放置到指定的虛擬桌面中,方便你的工作分類。而彈性的熱鍵定義功能,則能夠幫助使用者將 Dexpot 的各項功能指定到自己熟悉的組合鍵當中,加速你的工作效率。如此一來,即使是聊天聊到一半,也不必擔心老闆突然出現而讓你措手不及囉!

下載:
http://toget.pchome.com.tw/intro/utility_desktop/utility_desktop_virtual/24795.html
對這個軟體有意見/疑問想提出來?請來toget討論區發表~
http://toget.pchome.com.tw/BBS/index2nd.php?cl1st=utility&cl2nd=utility_desktop

Read Full Post »

今天在上班的時候為了處理 virtual host 的問題弄的我昏頭轉向,因為當時不知道如何去追蹤連線時的相關資訊,後來發現MSDN上有提供利用 Configuration 方式進行程式的追蹤,方法相當的簡便,以我的程式來說
// ConsoleApplication5.cs
using System;
using System.Net;
namespace ConsoleApplication5 {
    class Program {
        static void Main(string[] args) {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://arick/index.php");
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                System.IO.StreamReader sr = new System.IO.StreamReader(response.GetResponseStream());
                string content = sr.ReadToEnd();           
        }
    }
}
我要追蹤 System.Net 的狀態,可以在執行檔的目錄下建立檔名為  ConsoleApplication5.exe.config (也就是執行檔加上.config) ,內容為XML如下

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
 <system.diagnostics>
  <trace
   autoflush="true"
   indentsize="4"
  />
  <sources>
   <source name="System.Net">
    <listeners>
     <add name="System.Net"/>
    </listeners>
   </source>
  </sources>
  <sharedListeners>
   <add
    name="System.Net"
    type="System.Diagnostics.TextWriterTraceListener"
    initializeData="System.Net.trace.log"
    traceOutputOptions = "DateTime"
   />
  </sharedListeners>
  <switches>
   <add name="System.Net" value="Verbose" />
  </switches>
 </system.diagnostics>
</configuration>

 接著執行 ConsoleApplication5.exe 之後就會發現目錄中多了一個 System.Net.trace.log 檔案,ㄏㄏ裡面就是我要的追蹤資訊,摘錄其中一段我要的資訊如下
 
System.Net Information: 0 : [6116] HttpWebRequest#28068188 – Request: GET /index.php HTTP/1.1
    DateTime=2006-03-27T18:56:54.7031250Z
System.Net Information: 0 : [6116] ConnectStream#35567111 – Sending headers
{
Host: arick
Connection: Keep-Alive
}.
 
天啊… 這麼簡單的東西為什麼我今天在公司搞了一天還弄不出來…… 頭真是痛
 
補充一下,.Net Framework 不只是可以追蹤 System.Net,詳細的訊息可以參考
/.Net Development/.Net Framework SDK/General Reference/Configuration File Schema

Read Full Post »

[C#] C#使用 Javascript的 code

最近接了一個程式開發案,目前還在研究部分可用的技術,最近發現 .Net Framework 支援 JScript.Net,突發奇想何不將公司許多的 Javascript 製作成 .Net DLL 使用,於是開始找尋資料,發現要製作還真的不難,舉例來說,網路上下載下來的 base64.js (sorry, 我不知道原始的下載網址)
我只在原來的程式碼加上兩層包裝,第一層是 Namespace 宣告為 ChuiWenChiu.JS,第二層是類別名稱宣告為 JBase64。(實際上我還將原來未明確宣告的變數進行宣告,未指定初始值的進行初始化)
 
// base64.js
package ChuiWenChiu.JS {
    public class JBase64{

        /* Copyright (C) 2001 Donald J Bindner.
         * This program is free software; you can redistribute it and/or
         * modify it under the terms of the GNU Lesser General Public
         * License as published by the Free Software Foundation; either
         * version 2 of the License, or (at your option) any later version.
         */
        var b64chr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
        function arrayToBase64( arr ) {
            /* Converts an array of values to a base64 string */
            var i;
            var str = new String();
            var l = 0;
            for( i = 0; i < arr.length – (arr.length%3); i += 3 ) {
            str += b64chr.charAt( arr[i]>>2 );
            str += b64chr.charAt( ((arr[i]&3)<<4) + (arr[i+1]>>4) );
            str += b64chr.charAt( ((arr[i+1]&15)<<2) + (arr[i+2]>>6) );
            str += b64chr.charAt( arr[i+2]&63 );
            l += 4;
            if( l >= 60 ) {
                str += "n";
                l = 0;
            }
            }
            i = arr.length-(arr.length%3);
            if( arr.length%3 == 1 ) {
            str += b64chr.charAt( arr[i]>>2 );
            str += b64chr.charAt( (arr[i]&3)<<4 );
            str += "==";
            } else if( arr.length %3 == 2 ) {
            str += b64chr.charAt( arr[i]>>2 );
            str += b64chr.charAt( ((arr[i]&3)<<4) + (arr[i+1]>>4) );
            str += b64chr.charAt( (arr[i+1]&15)<<2 );
            str += "=";
            }
            return str;
        }
        function stringToBase64( str ) {
            /* Returns the base64 representation of a string
             * Crude: converts the string to an array and then calls arrayToBase64()
             */
            var arr = new Array( str.length );
            for( var i = 0; i < str.length; i++ ) arr[i] = str.charCodeAt(i);
            return arrayToBase64( arr );
        }
        function base64ToArray( str ) {
            /* Decodes a base64 string to an array of values */
            var arr = new Array;
            var l = 0;
            var pad = 0;
            var a= 0, b =0, c =0, d= 0;
   
            for( var i = 0; i < str.length; ) {
            while( i<str.length  &&  b64chr.indexOf( str.charAt(i)) == -1 ) i++;
            if( i >= str.length ) break;
            if( str.charAt(i) == "=" ) break;
            a = b64chr.indexOf( str.charAt( i++ ));
            while( i<str.length  &&  b64chr.indexOf( str.charAt(i)) == -1 ) i++;
            if( i >= str.length ) break;
            if( str.charAt(i) == "=" ) break;
            b = b64chr.indexOf( str.charAt( i++ ));
            while( i<str.length  &&  b64chr.indexOf( str.charAt(i)) == -1 ) i++;
            if( i >= str.length ) break;
            if( str.charAt(i) == "=" ) {
                pad = 2;
                c = d = 0;
                break;
            }
            c = b64chr.indexOf( str.charAt( i++ ));
            while( i<str.length  &&  b64chr.indexOf( str.charAt(i)) == -1 ) i++;
            if( i >= str.length ) break;
            if( str.charAt(i) == "=" ) {
                pad = 1;
                d = 0;
                break;
            }
            d = b64chr.indexOf( str.charAt( i++ ));
            arr[l++] = ((a<<2) + (b>>4)) & 0xFF;
            arr[l++] = ((b<<4) + (c>>2)) & 0xFF;
            arr[l++] = ((c<<6) + d) & 0xFF;
            }
            if( pad == 2 ) {
            arr[l++] = ((a<<2) + (b>>4)) & 0xFF;
            } else if( pad == 1 ) {
            arr[l++] = ((a<<2) + (b>>4)) & 0xFF;
            arr[l++] = ((b<<4) + (c>>2)) & 0xFF;
            }
            return arr;
        }
        function base64ToString( str ) {
            /* Decodes a base64 tring to a regular string
             * Crude: calls base64ToArray() and converts it back to a string
             */
            var arr = base64ToArray( str );
            var rstr = new String;
            for( var i = 0; i < arr.length; i++ ) rstr += String.fromCharCode(arr[i]);
            return rstr;
        }
    }
}


如果有安裝.Net Framework 2.0 SDK,以我的 Window XP 為例,C:WINDOWSMicrosoft.NETFrameworkv2.0.50727 內有 jsc.exe,此為 JScript.Net 編譯器,使用上和 csc.exe (C#編譯器)類似,要建立只需要使用下面的命令
 
jsc /t:library /out:ChuiWenChiu.JS.dll base64.js
 
/t:library 表示產生  DLL
/out:ChuiWEnChiu.JS.dll 表示輸出的檔案名稱


在 C# 中使用上和一般的 DLL 無異
 
 // jsTest.cs
// csc /t:exe /r:Microsoft.JScript.dll,ChuiWenChiu.JS.dll jsTest.cs
using System;
using ChuiWenChiu.JS; 
namespace ChuiWenChiu {
    class Program {
        static void Main(string[] args) {
            JBase64 base64 = new JBase64();
           
string enc = base64.stringToBase64("ABCDEFGHJIKLMNOPQRSTUVWXYZ0123456789").ToString() ;
            Console.WriteLine(enc);
            string dec = base64.base64ToString( enc ).ToString() ;
            Console.WriteLine(dec );            
        }
    }
}
 
 
 

Read Full Post »


 

C# 範例
using System;
using System.Xml;
using NMatrix.Schematron; // 引入 Validator 所屬的 Namespace

class Program{
  public static void Main(string[] args){
    try{
     Validator validator = new Validator(); // 宣告一個XML驗證器
     validator.AddSchema("books.xsd");  // 加入一個 XML Schema
     validator.Validate(new XmlTextReader("books.xml")); // 驗證 XML

        }catch (ValidationException ex){

           // 驗證例外
        }catch(Exception e){
            Console.WriteLine(e);
    }
  }
}

Read Full Post »

C# 3.0 ~ @_@ 天啊

想不到 C# 2.0 的功能還沒摸全,C# 3.0 就出來了,不過新增功能還在討論,有興趣的人可以參考下面的連結
http://msdn.microsoft.com/vcsharp/future/default.aspx
 

Read Full Post »

資料來源:ToGet 軟體報
 
 
微軟反間諜、反木馬免費程式:Microsoft Windows Defender
軟體:Microsoft Windows Defender(版本:1.1.1051 Beta 2)
類別:網路工具
性質:Freeware(6.4 M)
【編輯/王國淵】
新聞媒體上近來經常報導一些使用者因為資料被竊取,然後導致財產上的損失的消息,相信各位也都是時有所聞,而同樣是經常在網路上瀏覽的各位難道一點都不擔心嗎?尤其是經常喜歡安裝一些由網路上隨便下載軟體安裝的使用者們,如此無疑是為駭客們打開了自己電腦的大門,將木馬與間諜軟體送進自己的電腦中!如此危險的網路環境,就讓 Microsoft Windows Defender 來為你把關吧!
Microsoft Windows Defender 是由微軟所發行的一套反間諜、木馬程式的免費軟體,它能夠幫助使用者掃瞄自己的電腦中是否含有間諜程式或是木馬等會造成使用者資料外洩的源頭,幫助使用者將這些危險的因素一一移除,還給使用者一個安全的使用環境。
由於網路的使用已經變成了生活中的一部份,因此網路安全的重要性越來越被重視,而現在由軟體界的龍頭老大-微軟親自發行的一款免費反間諜軟體,你能不試試馬上就它的威力嗎?
註:欲下載的使用者必須先通過微軟的正版軟體驗證機制方可下載。

Read Full Post »

[Javascript] 列舉自己

今天研究 ecmaunit 這個 javascript unit test Library 時,在 TestCase Class 中發現一段有趣的程式碼,如下
  for (var attr in this) {
            if (attr.substr(0, 4) == ‘test’) {
    // do somthing
            };
        };
這段程式碼有趣的地方在於,TestCase 利用列舉本身物件具有的屬性開頭是否有 test 字串來判別是否為一個需要測試的單元。也就是透過設計前的規範,使得 TestSuit 能夠找出每個 TestCase 中不等數量的測試案例。原來還有這種寫法,又學到一招。

Read Full Post »

 
今天small問了我一個 AP 裡面蠻常見的功能如何寫,也就是按下一個按鈕後會開啟一個視窗,然後在視窗關閉之後將值回傳回去給原來視窗,可是這個功能要在網頁上呈現卻不太容易,如果說只要在 IE 上實作那還不太難,只要父視窗用 window.showModalDialog 開啟子網頁視窗,然後子網頁視窗只要在關閉前設定 window.returnValue,父視窗就可以接到處理結果(window.returnValue)。有於這個過程算是同步的,所以沒什麼問題。可是 firefox 基於安全理由(http://forums.mozine.org/lofiversion/index.php/t2569.html)不支援 showModalDialog,所以,目前我只知道透過 window.open 來實作,雖然不太相同,但仍然可以模擬出效果。程式如下:
parent.htm
————————————————-
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<body>
<form id = ‘frmMain’ name = ‘frmMain’>
 <button onclick = ‘getValue();’>getValue</button>
 <input type = ‘textbox’ value = "" id = ‘txtValue’ name = ‘txtValue’ style = ‘display: none’/>
 <button id = ‘btnReturn’ name = ‘btnReturn’ onclick = ‘returnValue();’ style = ‘display: none’></button>

</form>
<script type = ‘text/javascript’>
<!–//
 var winHandler = null;
 function getValue(){
  winHandler = window.open("child.htm", "child");
 }
 
 function returnValue(){  
  alert( document.getElementById(‘txtValue’).value );  
 }

//–>
</script>
</body>
</html>
 
child.htm
————————————————-
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<body>
<button onclick = ‘btnClose_Click();’>close</button>
<input type = ‘textbox’ id = ‘txtInput’ value = “/>
<script type = ‘text/javascript’>
<!–//
 var winHandler = null;
 function btnClose_Click(){
  if (window.opener != null){
   var txt = window.opener.document.frmMain.txtValue;   
   var btn = window.opener.document.frmMain.btnReturn;
   if (txt != null){
    txt.value = document.getElementById(‘txtInput’).value;
   }
   btn.click();
  }
  self.close();
 }
//–>
</script>
</body>
</html>
如果眼尖的人應該會發現我透過 btnReturn 和 txtValue 以非同步方式來取得回傳值,因為就目前所知似乎沒有其他辦法可以讓 window.open 以同步方式呈現,所以只能以這種怪異方式取得….. @_@

Read Full Post »

寫這個程式的目的一來是測試簡單的 web service,這個 web service 利用 Get 方式取得亂數產生的身分證字號,二來是想整理一下之前一直不太懂得 PHP 中 DOMXML 的 XPath 使用方式….
 
整個範例程式如下:
<?php
/**
 * 檔名:php_client.php
 *
 * 測試環境:
 *  [1] Windows XP Professional
 *  [2] PHP 5.1.2 for Windows, CGI mode
 *  [3] pecl-5.1.2 for Win32
 *
 * 執行:
 *  php-cgi.exe -q php_client.php
 *
 * 設計者:Chui-Wen Chiu
 *
 * 開發日誌:
 *  2006/03/12 建立
 *
 **/
 set_time_limit(0);
 function display($msg) {
  echo "$msgn";
 }
    /**
     * 連接服務
     **/
    function httpRequest($url){
        $fp = fopen($url, ‘r’);
        if(!$fp){
            die(‘連不上指定網址’);
        }
        display("1) 資料接收中…");
        $buffer = “;
        $buffser_size = 8192;
        $content = “;  
        while (!feof($fp)) {
            $content .= fread($fp, $buffser_size);
        } 
        fclose($fp);
        return $content;
    }
    /**
     * print_r( selectNodes($doc, "/return/data") );
     *
     **/
    function selectNodes($doc, $xpath){
        $xpathObj = $doc->xpath_new_context();
        $xpresult = xpath_eval($xpathObj, $xpath);
        $node_list = $xpresult->nodeset;     
        if (count($node_list) <= 0){
            return null;
        }       
        return $node_list[0]->child_nodes();
    }
    /**
     * 利用 XPath 取得第一個指定節點
     *
     * @param   $doc        DomDocument
     * @param   $xpath      string
     * @return  null        無任何節點
     *          DomNode    
     **/
    function selectSingleNode($doc, $xpath){
        $xpathObj = $doc->xpath_new_context();
        $xpresult = xpath_eval($xpathObj, $xpath);
        $node_list = $xpresult->nodeset;     
        if (count($node_list) <= 0){
            return null;
        }       
        return $node_list[0]->first_child();
    }
    /**
     * 萃取命令參數
     *
     *
     **/
    function ExtractParam($argv){
        if (count($argv) >=2){
            $area_code = $argv[1];
            $sex = $argv[2];
        }else{
            die(‘參數錯誤’);
        }
        if ( in_array($area_code, range(‘A’, ‘Z’)) === false ){
            die(‘區碼錯誤’);
        }
        if ( in_array($sex, range(0, 1)) === false ){
            die(‘性別錯誤’);
        }
        if ( count($argv) > 3 ){
            $url = $argv[3];   
        }else{
            $url = "http://61.221.176.159:2527/webservices/gen_pid.php";
        }
        return array($url, $area_code, $sex);
    }
// MAIN ———————————————-
    list($url, $area_code, $sex) = ExtractParam($argv);
 $url = "{$url}?area_code={$area_code}&sex={$sex}";
 display("0) 連線…{$url}");
    $content = httpRequest($url);
   
    $doc = domxml_open_mem( $content );    
    $node = selectSingleNode($doc, "/return/value");
    if ($node == null){
        die("格式錯誤");
    }
    $value = $node->content;
    $node = selectSingleNode($doc, "/return/data");
    if ($node == null){
        die("格式錯誤");
    }
    $data = $node->content;
    if ($value == 1){
        echo $data;
    }else{
        echo "失敗] ", $data;
    }
?>

Read Full Post »

記憶遊戲

Read Full Post »

Older Posts »