Feeds:
文章
迴響

Archive for 2006 年 10 月

最近需要和 winsock 打交道,又深感知識的不足,恰巧找到一本"深入 Internet with winsock 設計",將我需要的相關內容摘錄到下面的連結,有興趣的人可以參考看看:

Chapter 4
Chapter 5
Chapter 6

Read Full Post »

* AS3.0 除了繼續支援 AS2.0 的 class 和 extend 之外,還加入存取權限控制 public/protected/private/internal 、 final 和 override 等關鍵字。

由於 AS3 支援 package 的概念,因此 AS2 將 pacakge 名稱與 class 名稱寫在一起,如下範例顯示兩者間的差異:

// ActionScript 2.0
class flash.display.BitmapData {}

// ActionScript 3.0
package flash.display {
  public class BitmapData {}
}

 類別修飾字

1. dynamic:允許執行階段新增屬性到物件實體,類似 Javascript 的 prototype。
2. final:指定類別無法再被繼承
3. internal(預設值):只有在同一個 package 才能看到此類別
4. public:任何地方都可以使用此類別

上述除了 internal 以外,其他的修飾字都必須明確的被指定。另外,AS3 不支援抽象類別,所以沒有提供 abstract 修飾字。也沒有提供類別層級的 protected 和 private 修飾字。

補充:
"提供類別層級的 protected 和 private 修飾字" 的意思是說下面的程式對於 AS3 來說是不合法的
package {
 public class Ex{
        // 語法錯誤:屬性 private 之後必須是定義關鍵字 (例如函數),而不是 static
  private static void a(){  
  }
  
  // 語法錯誤:屬性 private 之後必須是定義關鍵字 (例如函數),而不是 protected
  private protected void b(){  
  }
 }
}

相關範例….

類別主體 (Class Body)

類別主體用來定義類別的變數、常數和方法,且靜態和非靜態成員可以使用相同的名稱。如下範例:

// ClassBodyTest.as
package {
	import flash.display.Sprite; 	

	public class ClassBodyTest extends Sprite{		
		public function ClassBodyTest(){
			ClassBody.Method();		// Class Method Invoke
			trace( ClassBody.Message );		// static field
			trace( ClassBody.VERSION );		// 1.0

			var obj:ClassBody = new ClassBody();	// ClassBody constructor
			obj.Method();			// Object Method Invoke		
			trace( obj.Message );		// object field
			trace( obj.VERSION );		// 2.0
 		}
	}	
}

// ClassBody.as
package {
	public class ClassBody{		
		// 建構子
		public function ClassBody(){
			trace("ClassBody constructor");
 		}

		// 物件方法
		public function Method():void{
			trace("Object Method Invoke");
		}

		// 類別方法
		public static function Method():void{
			trace("Class Method Invoke");
		}

		// 類別欄位
		public static var Message:String = "static field";

		// 物件欄位
		public var Message:String = "object field";

		// 類別常數定義
		public static const VERSION:String = "1.0";

		// 物件常數定義
		public const VERSION:String = "2.0";
	}	
}

由下面範例可以更清楚看出 AS3 靜態成員和 C++/Java/C# 語言不同:

// ClassBodyTest2.as
package {
	import flash.display.Sprite; 	

	public class ClassBodyTest2 extends Sprite{		
		public function ClassBodyTest2(){
			ClassBody2.StaticMethod();		// Class Method Invoke
			trace( ClassBody2.StaticMessage );	// static field
			trace( ClassBody2.STATIC_VERSION );	// 1.0

			var obj:ClassBody2 = new ClassBody2();	// ClassBody constructor
			//obj.StaticMethod();		// Error: 方法未定義。
			//trace( obj.StaticMessage );	// Error: Access of possibly undefined property 
			//trace( obj.STATIC_VERSION );	// StaticMessage through a reference with 
							// static type ClassBody2

			obj.InstanceMethod();		// Object Method Invoke		
			trace( obj.InstanceMessage );	// object field
			trace( obj.INSTANCE_VERSION );	// 2.0
 		}
	}	
}

// ClassBody2.as
package {
	public class ClassBody2{		
		// 建構子
		public function ClassBody2(){
			trace("ClassBody constructor");
 		}

		// 物件方法
		public function InstanceMethod():void{
			trace("Object Method Invoke");
		}

		// 類別方法
		public static function StaticMethod():void{
			trace("Class Method Invoke");
		}

		// 類別欄位
		public static var StaticMessage:String = "static field";

		// 物件欄位
		public var InstanceMessage:String = "object field";

		// 類別常數定義
		public static const STATIC_VERSION:String = "1.0";

		// 物件常數定義
		public const INSTANCE_VERSION:String = "2.0";
	}	
}

由上述兩個範例的測試結果,我們可以得到兩個結論:
1. 物件實體不能使用透過 Object Reference 使用靜態成員
2. 靜態成員和非靜態成員是分屬於兩個完全不同的東西,所以,即便是名稱相同也沒關係

還有一個比較特別的語法但我還想不到用途是在 class body 中直接使用敘述(Statement),且這個敘述只會在第一個物件實體被建立時才觸發,其他後續建立的物件都不會執行該敘述,如下:

// ClassBodyStatementTest.as
package {
	import flash.display.Sprite; 	

	public class ClassBodyStatementTest extends Sprite{		
		public function ClassBodyStatementTest(){
			new ClassBodyStatement(); 
			new ClassBodyStatement();
			new ClassBodyStatement();
 		}
	}	
}

// ClassBodyStatement.as
package {
	public class ClassBodyStatement{
		public function ClassBodyStatement(){
			trace("constructor");
		}

		trace("this's statement");
	}	
}

執行結果:

未完….持續編修中

Read Full Post »

最新版本:http://docs.google.com/View?docid=dcxw59mr_858fm965n

* Iterator 物件

	var obj = {
		  name:"Jack Bauer"
		, username:"JackB"
		, id:12345
		, agency:"CTU"
		, region:"Los Angeles"
	};
	var it = Iterator(obj); // 產生 Iterator Object
	try {
	  while (true) {
		document.write(it.next() + "<BR>n"); // 使用 Iteartor 物件的 next 方式取得成員資訊
	  }
	} catch (err if err instanceof StopIteration) {// 迭代到資料尾端時
	  document.write("End of record.<BR>n");
	} catch (err) {
	  document.write("Unknown error: " + err.description + "<BR>n");
	}

* 陣列初始化 – 類似 python 的寫法


function range(begin, end) {
  for (let i = begin; i < end; ++i) {
    yield i;
  }
}

var ten_squares = [i * i for (i in range(0, 10))];
document.write( ten_squares.join(',')  + "<br/>");
// 0,1,4,9,16,25,36,49,64,81
var evens = [i for (i in range(0, 21)) if (i % 2 == 0)]; document.write( evens.join(',')+ "<br/>");
// 0,2,4,6,8,10,12,14,16,18,20

* let 敘述(statement):將變數的有效範圍侷限在 let 區域中

var x = 5;
var y = 0;

let (x = x+10, y = 12) {
  document.write(x+y + "<BR>n"); 
}
document.write(x+y + "<BR>n");

 

* let 運算式(expression):將變數的有效範圍侷限在 let 那一行

var y = 0;
document.write( let(x = x + 10, y = 12) x+y  + "<BR>n");
document.write(x+y + "<BR>n");

* let 定義(definition) :用於變數、常數和函數定義之前。實際用法不是很清楚

* for 語法中使用 let

for (let expr1; expr2; expr3) statement
for (let expr1 in expr2) statement
for each(let expr1 in expr2) statement

* 一次指定多個變數值 – 類似 python 語法

var a = 1;
var b = 3;
document.write( [a, b].join(‘,’)); // 1, 3
[a, b] = [b, a];
document.write( [a, b].join(‘,’)); // 3, 1
[a, b] = [1, 2, 3];
document.write( [a, b].join(‘,’)); // 1, 2
[a, b] = [1];
document.write( [a, b].join(‘,’)); // 1,

* for …in 用於物件,透過 [ ] 一次取得多個值

var obj = {
    width: 3
  , length: 1.5
  , color: "orange"
};
for (let[name, value] in obj) {
  document.write ("Name: " + name + ", Value: " + value + "<BR>n");
}

// output:
Name: width, Value: 3
Name: length, Value: 1.5
Name: color, Value: orange

* for …in 用於物件陣列,透過 {} 一次取得多個物件參數

var people = [
  {
    name: "Mike Smith",
    family: {
      mother: "Jane Smith",
      father: "Harry Smith",
      sister: "Samantha Smith"
    },
    age: 35
  },
  {
    name: "Tom Jones",
    family: {
      mother: "Norah Jones",
      father: "Richard Jones",
      brother: "Howard Jones"
    },
    age: 25
  }
];

for each (let {name: n, family: { father: f } } in people) {
  document.write ("Name: " + n + ", Father: " + f + "<BR>n");
}
//output:
Name: Mike Smith, Father: Harry Smith Name: Tom Jones, Father: Richard Jones

參考資料:

[1] "New in JavaScript 1.7", http://developer.mozilla.org/en/docs/New_in_JavaScript_1.7#Generators

Read Full Post »

最新版本:http://docs.google.com/View?docid=dcxw59mr_859dk6tx9

1. 為了使用 JavaScript 1.7 的新功能, 你需要在 HTML 或 XUL 程式碼中特別指定使用 JavaScript 1.7

<script type="application/javascript;version=1.7"/>
2. generator-iterator 語法:使用 yield 關鍵字

function fib() {
  var i = 0, j = 1; // a
  while (true) {	  // b
    yield i;	  // c
    var t = i;	  // d
    i = j;	  // e
    j += t;	  // f
  }
}

var g = fib();
for (var a = 0; a < 10; a++) {
  document.write(g.next() + "<BR>n"); // g
}
官方文件使用上述的程式碼來說明 Fibonacci 的計算(為了避免混淆將 for 迴圈的變數名稱改為 a)。上述程式的運作流程如下:
1. var g = fib(); // 回傳 generator-iterator 物件
2. 呼叫 g.next(); 依續執行 a, b, c 後將 i 回傳回去,列印出 0
3. 呼叫 g.next(); 依據執行 d, e, f, b, c 後將 i 回傳回去,列印出 1
4. 呼叫 g.next(); 依據執行 d, e, f, b, c 後將 i 回傳回去,列印出 1
5. 呼叫 g.next(); 依據執行 d, e, f, b, c 後將 i 回傳回去,列印出 2

* 重複上面流程直到執行 10 次的 for 迴圈跑完
 
你會發現上述步驟都會在 c 這個地方返回,有點類似 return i 的含意。不過這個語法可以用在何處,目前還沒想到,且這個語法 IE 6 並未支援,IE7並未測試過。
 
參考資料:

Read Full Post »

 將 Marshal.GetDelegateForFunctionPointer  封裝後可以簡單的如下使用 

    public delegate int MsgBox(int hwnd, string msg, string cpp, int ok);
    public delegate bool PlaySound(string pszSound, int hmod, int fdwSound);

    class Program {
        static void Main(string[] args) {

            DynamicNativeManager dnm = new DynamicNativeManager();
            mb = dnm.GetDelegate<MsgBox>("user32.dll", "MessageBoxA") as MsgBox;
            mb(0, "abc", "cde", 0);

            PlaySound ps = dnm.GetDelegate("winmm.dll", "PlaySoundA") as PlaySound;
            ps(@"C:WINDOWSMedianotify.wav", 0, 8);

            dnm.Dispose();                        
        }
    }


摘自 MSDN

Marshal.GetDelegateForFunctionPointer

將 Unmanaged 函式指標轉換成委派。

命名空間: System.Runtime.InteropServices
組件: mscorlib (在 mscorlib.dll 中)

C#
public static Delegate GetDelegateForFunctionPointer (
IntPtr ptr,
Type t
)

參數
ptr: System.IntPtr 型別,要轉換之 Unmanaged 函式指標的型別。

t: 要傳回的委派型别。
傳回值

委派執行個體,可轉型成適當的委派型別。

例外狀況

ArgumentException: t 參數不是委派。

ArgumentNullException: ptr 參數為 Null 參照或 t 參數為 Null 參照

 

備註

在 .NET Framework 1.0 和 1.1 版中,您可以將表示 Managed 方法的委派當做函式指標傳遞至 Unmanaged 程式碼,以便讓 Unmanaged 程式碼透過函式指標呼叫 Managed 方法。此外,Unmanaged 程式碼也可以將該函式指標傳遞回 Managed 程式碼,而且指標會正確解析成基礎 Managed 方法。

不過,您現在只要使用這個新方法 GetDelegateForFunctionPointer 和第二個新方法 GetFunctionPointerForDelegate,就可同時以兩種方向封送處理委派。透過 GetDelegateForFunctionPointer,ptr 就會當做 IntPtr 匯入。而藉由呼叫 GetFunctionPointerForDelegate 後,就可以取得 Managed 委派的 IntPtr,並當做參數傳遞。然後,您就可以從 Unmanaged 方法內部呼叫它。請注意,在 2.0 版中,參數封送處理器也可以將函式指標封送處理成委派。

注意事項

不過,您無法傳遞無效的函式指標至 GetDelegateForFunctionPointer。此外,您只能針對純 Unmanaged 函式指標使用這個方法。您無法將這個方法用於透過 C++ 或從 GetFunctionPointer 取得的函式指標。而且,您無法使用這個方法,從另一個 Managed 委派的函式指標建立委派。

 

.NET Framework 安全性

  • SecurityPermission  用於呼叫 Unmanaged 程式碼的使用權限。 相關聯的列舉型別:UnmanagedCode 安全性動作:LinkDemand

Read Full Post »

哇~ Hotmail 變 2GB

今天看到新聞說 hotmail 信箱空間升級為 2GB 空間,雖說很少使用這個空間,不過空間大一點也沒有什麼不好。

想要升級成 2GB ,如果你的語系為繁體中文則看不到試用按鈕,所以你要先將語系切換為 English 後,就會發現下圖的按鈕

 

經過上面的步驟就可以轉換成新版的 hotmail ,不過試用了一下並沒有什麼太大的不同,比不上 YAHOO 的新版信箱,不果個人還是覺得 GMail 比較順手,而且可以瀏覽 office 文件也支援掃毒。算了…反正當作一個免費暫存區也不錯….不過沒什麼地方顯示空間容量,也不知道是不是真有 2GB -_-

Read Full Post »

今天收到 Google 快訊寄來關於以前論文即將發表於 ICME(IEEE International Conference on Multimedia & Expo),想說碩士都畢業兩年多了,於是用 Google 查了一下,還真的有耶,http://www.icme2006.org/Papers/viewpapers.asp?papernum=1779


Paper:
MA2-P5.26

Session:
Media Signal Processing I

Time:
Monday, July 10, 10:50 – 11:50

Presentation:
Poster

Title:
MODIFIED LAPLACIAN FILTER WITH INTENSITY CORRECTION TECHNIQUE FOR IMAGE RESOLUTION ENHANCEMENT

Authors:
Day-Fann Shen; National Yunlin University of Science and Technology

Chui-Wen Chiu; National Yunlin University of Science and Technology

Pon-Jay Huang; National Yunlin University of Science and Technology

Abstract:
By analyzing the relationship between a high-resolution image sensor array and the corresponding degraded low-resolution image, a modified 3×3 Laplacian filter (MLF) and the intensity correction technique (IC) are proposed for properly restoring the frequency components attenuated in the degradation process, thus reveal more detailed contents. Extensive experiments show that the proposed MLF outperforms several recently developed algorithms both in perceptual quality (especially in the texture areas) and in objective quality in terms of PSNR. Theoretically, the proposed SR algorithm can be applied to any digital image for increased resolutions; in addition, the simplicity of proposed algorithm is quite desirable for many real-world applications.


雖然這篇 paper 與目前的工作沒有什麼相關性,不過對於碩士研究生活記憶又多了一筆也不錯 ^^

Read Full Post »

Older Posts »