Monday, December 13, 2004

developerWorks : Blogs

Microsoft and Domain Specific Languages

M$ just issued the concept of software factory and Domain Specific Languages that will be a big impact to some existed design language such as UML, the author of this article is one of 3 founder of UML & Rose, he said that he is quite disappointed with it.

Tuesday, November 30, 2004

systemwebmail.com
good site to introduce the webmail in .net framework

Sunday, November 28, 2004

Some delphi guys complain that there are no class reference in java and .net, such as

type
BaseClass = class
constructor Create; virtual;
...
end;

BaseClassRef = class of BaseClass

DerivedClass1 = class (BaseClass )

DerivedClass2 = class (BaseClass )

RegisterClass(DerivedClass1);
RegisterClass(DerivedClass2);
...
var
AClassRef : BaseClassRef ;
begin

//the class name can be stored in a configuration profile
AClassRef := BaseClassRef(FindClass('DerivedClass1'));
...
end;


Now, we could do the similar thing with a java IOC framework PicoContainer.

Interface BaseIntf

class DerivedClass1 implements BaseIntf

class DerivedClass2 implements BaseIntf

public void () {
MutablePicoContainer pico = createPicoContainer(null);
pico.registerComponentImplementation("DerivedClass1",DerivedClass1.class);
pico.registerComponentImplementation("DerivedClass2",DerivedClass2.class);
...

//the class name can be stored in a configuration profile
BaseIntf t = (BaseIntf) pico.getComponentInstance("DerivedClass2");
assertNotNull(t);
}


PicoContainer has .net portion too.

Tuesday, November 16, 2004

Spring.NET - Application Framework

http://www.springframework.net/doc/reference/index.html

This release contains a lightweight container with IoC / Dependency Injection functionality comparable to that found in the Java based Spring framework. Highlights include

  1. Constructor and Setter based Dependency Injection
  2. Factory method creation
  3. Inheritance of object definitions
  4. Support for .NET application configuration files
  5. Event wiring
  6. Autowiring of collaborators
  7. Singleton/Prototype creation modes

Friday, November 12, 2004

pinvoke.net: the interop wiki!
It is a site that attempts to address the difficulty of calling Win32 or other unmanaged APIs in managed code

Thursday, November 11, 2004

use IOCP in thread

use IOCP in socket

IOCP is most efficient method in Win32 thread and Socket programming, but it requires much more work.
Contexts in .NET: Decouple Components by Injecting Custom Services into Your Object's Interception Chain -- MSDN Magazine, March 2003

Aspect-Oriented Programming Enables Better Code Encapsulation and Reuse

ContextBoundObject is a nice way to implement AOP in DotNet, but it is a little expensive.
DHTML Menu 4 (WebFX)
version 3 allowed menus to cover windowed controls,
version 4 can be displayed outside the physical boundaries of the browser window.
MyXaml - Home
a Open source XAML framework, it is based on Winform.

Monday, November 08, 2004

URLDownloadToCacheFile

A very useful Windows platform API, it Downloads data into the Internet cache and returns the file name of the cache location for retrieving the bits. it is widely used by auto-upgrade of rich client application.
Manageability - Open Source Workflow Engines Written in Java

Sunday, November 07, 2004

ActiveWidgets :: dhtml grid, javascript tables, .net datagrid, asp controls, php widgets
This controls set includes a scrollable javascript grid that looks like win 32 grid, it could be used in open source project for free, but not in commercial project.

Thursday, November 04, 2004

Open-Source ADO.NET XML Provider -- WilsonXmlDbClient v1.0
Although the regular ADO.net DataSet has some methods such as ReadXml, WriteXml, but they are not good enough to handle complex XML document


SOA Editor from capescience.com
a tools to edit WSDL file, but it seems as if this tools doesn't support asp.net web service

Wednesday, October 27, 2004

Code Generation with Codesmith
I did a little bit survey about the Microsoft reporting service tools; Here is the detail.

1. This tools need a SQL server instance to store some application Meta data for internal use. But it can use oracle as data source for reporting. It is basically free if we have an sql server license.

2. This tools includes a simple query builder and a report layout designer, we could use report layout designer to visually adjust the report layout and some format stuffs such as the column width, Font. The report layout designer will generate a RDL (report definition language) script based on the outcome of designer GUI, the report query is embedded into RDL script too, and we could modify the RDL script manually or Programmatically.

3. This tools includes a report server that do the query&format based on the RDL script we made by report layout designer, the server will retrieve the data and format the report according the output type we specified, output type could be web page, excel or PDF.

4. This tools use RDL script as the interface between the report design GUI and report build&format engine, this way would improve and shorten the process of the design and creation of a brand new report.
But the RDL also bring some drawback, the first thing is that this tools only provide some basic RDL syntax, (RDL is a kind of extensible script, the different development tools vendor could add their own predefined syntax into it). So the reporting build&format engine can only recognize the syntax they have, if we have some complex reports that need some special format effect, this tools cann't accomplish it.
There are a simple workaround for this issue, we could use this tools to do the basic layout and simple formating, and develop another module to do the complex formatting based on the excel file built by this tools.

Introducing the Microsoft reporting service in MSDN TV

Reporting Services Programming

Monday, October 18, 2004

I figure out a way about getting the distinct store count from the summary table, and here is the detail.
We have a summary table like it


period_key	item_key	store_key

20030102 1 1
20030102 1 2
20030102 1 5
20030102 1 7
20030102 1 9
..
20030302 1 2
20030302 1 5
20030302 1 6
20030302 1 8



We normally use the following Query to run against the summary table and get the
distinct store count




Select count(distinct store_key) from [summary table]
Where period_key between ? and ?
And item_key = ?



If the summary table has lots of rows, this query would be running long time.

We only need to know the position of each store in store lookup table when we are calculating the distinct store count, so we could come out the following structure



Bit Position 1 2 3 4 5 6 7
Store key 1 2 5 6 7 8 9

{1,2,5,7,9} 1 1 1 0 1 0 1
{2,5,6,8} 0 1 1 1 0 1 0



The store lookup table doesn’t have too many records, so we could just use a
column which type is varchar2 to store the resulting bit string for store key.



period_key item_key store_key_raw
20030102 1 1110101
20030302 1 0111010



Once we need to get the distinct count of store, we could just do BIT_OR operation
on this column, and get the distinct store count by counting the amount of 1 bit inside the final bit string for store key. there are an existing Oracle function UTL_RAW.BIT_OR that could do BIT_OR operation to two strings, and it is quite fast, there are some code snippets.




PROCEDURE test_raw_or IS
lvc_cursor ref_cursor;
lvn_counter BINARY_INTEGER;
lvs_a VARCHAR2(4000);
raw_a RAW(4000);
raw_b RAW(4000);
raw_c RAW(4000);
BEGIN
-- get the bit string for store key
OPEN lvc_cursor FOR
SELECT store_key_raw
FROM store_bitmap;

-- use loop to do the bit_or for all of rows
lvn_counter := 0;
lvs_a := '';
LOOP
EXIT WHEN lvc_cursor%NOTFOUND;
lvn_counter := lvn_counter + 1;

FETCH lvc_cursor
INTO lvs_a;
raw_a := utl_raw.cast_to_raw(lvs_a);
IF lvn_counter > 1 THEN
raw_c := utl_raw.bit_or(raw_a, raw_b);
raw_b := raw_c;
ELSE
raw_b := raw_a;
END IF;

END LOOP;
CLOSE lvc_cursor;

-- get the final bit string for store key
INSERT INTO calc_store_bitmap
VALUES
(utl_raw.cast_to_varchar2(raw_c));

-- get the distinct store count by counting the amount of 1 bit inside the
final bit string for store key
....

End;



There are another problem raised that UTL_RAW.BIT_OR could only do the BIT_OR on
two strings, it couldn’t do the BIT_OR on a column in a table. It is not convenient for us to write SQL,

Fortunately oracle 9i has a great feature named as User defined aggregate functions, you could do any aggregate operation with it, just like the regular oracle aggregate functions such as sum or count. First all, we need to create a new oracle type that includes a set of oracle pre-defined member function. such as ODCIAggregateInitialize, ODCIAggregateiterate. Then we could write the code to override these functions. The following is code snippets.




-- define a temp variable to store the middle value
total raw(4000),
--override the function that is doing the Iteration
member function ODCIAggregateIterate(self IN OUT str_agg_type,
value IN raw )
return number
is
begin
self.total := utl_raw.bit_or(self.total, value);
return ODCIConst.Success;
end;
--override the function that returns the final result
member function ODCIAggregateTerminate(self IN str_agg_type,
returnValue OUT raw,
flags IN number)
return number
is
begin
returnValue := self.total;
return ODCIConst.Success;
end;




And I created two functions to get the distinct store count, the first one is a User
defined aggregate function raw_bit_or_agg(input varchar2) that is used to do the BIT_OR on a column in the table, this function is just like other aggregate function. Another is count_bit_in_str that could get the bit count from a string, so the Query that getting count will be like this,




SELECT count_bit_in_str(raw_bit_or_agg(p.store_bitmap))
FROM [summary table] p
WHERE p.period_key BETWEEN ? AND ?
And p. item_key = ?
ORDER BY p.period_key




I wrote a unit test app to compare the difference, the method using BIT_OR is

500 times faster than the one using count(distinct store_key).

Saturday, October 16, 2004

I did some survey on MS .net rich client automated upgrading solution recently, here is the detail

1 MS Updater Application Block
It is a open source framework that supports .net 1.1 framework and VS.2003, it includes a simple start app and a configuration file in the client side, the configuration file stores the address of file server that might be FTP, web, or shared file folder. There is a ServerManifest.xml that is located in the root folder of file server; this file includes all of files that need to be upgraded and their latest version number.
When the start app is launched, it will check the info inside the ServerManifest.xml, and compare with current application files in the client side, if the version # is not matched, and there are new version available, the start app will pop up a window to ask if you‘d like to upgrade the current application files, and the start app will do all of file downloading and replacing automatically if you client YES.

MS Updater Application Block

2 DotNet No-Touch Deployment (NTD)
DotNet No-Touch Deployment is a zero deployment application solution (smart client).
it supports .net 1.1 framework and VS.2003 too, it includes two methods.

the first method is that hosting the winform application into a web server, so user can lanuch it with a URL in IE or commend line. the app will be downloaded from web and setting into local internet cache, it doesn't require download every time unless there are new version in server side. and it could use the web service to connect with database, so the client side doesn't need install the oracle client. it requires a little changes in start section of winform app to make it work.

another method is embeding the .net winform coltrol into a web page, and put them to web server. it is similar to some original methods such as activex, but MS made some improvement, such as the size of control is much smaller than before.

DotNet No-Touch Deployment (NTD)



3 ClickOnce
ClickOnce is part of .net 2.0 framework, and supports VS.2005; it will be available in 2005.
It provides a home page for every application, the user could access the application by a URL inside this home page, you could choice to install the app in client machine or run the app in client cache, and it also support automated upgrading if you install the application in the client machine.

ClickOnce

4 Avalon
Avalon will be with the windows longhorn that was scheduled to be released in 2006, and it will support the Windows XP too. its start app is a XAML file that could be located in the client PC or server side such as a web server, this XAML file is similar to web page, but it doesn’t require IE, Avalon also support automated upgrading.

There are also some third party solutions available such as updated component suite; they are similar to MS Updater Application Block.
Walkthrough – Generating RDL Using the .NET Framework

Thursday, September 16, 2004

Java Function Programming
The difference among different DotNet data provider for oracle
There are three major data provider from Oracle, Misrosoft and Borland
1) if we run a query to return same amount of rows, the ODP.net would take the shortest time, while BDP.net would take the longest time.

2) All of three providers are based on ADO.NET, this means they have same basic classes and methods,
If we are going to replace MSDP.NET with ODP.NET, what we need to do is changing the library reference and the units in uses section,
But they also have some slightly difference, for instance, the oracle data type for ref cursor in MSDP is OracleType.cursor, and
the oracle data type for ref cursor in ODP is OracleDBType.RefCursor

3) All of three providers support Ref Cursors returned by Oracle stored proc

4) Both of MS data provider and Oracle data provider support database connection pooling, but Borland Data Provider doesn't support it

5) MS data provider offers an OracleLob object that handles all Oracle LOB database objects in the same fashion, while the Oracle data provide offers
specific objects for both Oracle BLOB and CLOB database objects. This means ODP.NET provides better support for these Oracle datatypes.
For instance, the OracleClob object overrides the read method to populate a char array. This feature is especially useful when dealing
with Unicode and other multibyte characters.

6) The MS data provider come with DotNet framework, and the DotNet framework is part of in windows XP professional and windows 2003 server .
whereas Oracle data provider or Borland Data Provider need to be installed separately

Sunday, September 12, 2004

Joel on Software - How Microsoft Lost the API War

I don't think the Web page will be instead of Win GUI, although some web pages are fancy enough, but please just take a look the JavaScript code, it is extremely long, and quite badly organized.

whereas I think that Avalon and Indigo will be instead of Web page if M$ could do their work well, what my desired GUI is that it has no round trip, no overall refresh, and no deployment.

the thing I worry about is M$ current GUI project strategy, WinForm semms as if to be stillborn. infopath, a very cool stuff, but nobody use. Avalon need to wait at least two years. why M$ can't focus on one thing.

Thursday, August 26, 2004

Saturday, August 21, 2004

Monday, July 26, 2004

Thursday, July 15, 2004

Sunday, July 11, 2004

Let’s see the history of java web development, there are four major steps,
1, Java Servlet - use java code to generate the all of html content, developers need to take a lot of time to do the coding for both of html content and server side business logic, and very hard to maintain the html content and java code.

2. Jsp – embed the java code into html content by using java bean that is used to generated the dynamic html content, it solve the problem of maintenance the static html content, and it bring some other problem, the java code is separated to everywhere, the presentation view and business logic are mixed together, it is easier to cause the system mass up when the system is getting bigger.

3.Struts framework – Java code do not generate the html content directly, and html content do not include the java code directly, it use html tag-lib to combine the code and content together, the html tag-lib permits java developers to boil down complex server-side behaviors into simple and easy-to-use elements that content developers can easily incorporate into their html pages
,html tags are capable to implement some simple programming logic such as branch (if else ) and loop(for), and the html tag-lib can be re-used and extended.
The struts separates the presentation view and business logic very well, so it meet the need of most of web system and become more and more popular, so far the problem for html tag-lib is the management and customizing, the content developers need to take some time adjust the properties of html tag to achieve the visual effect they want, and java developers are not easy to customize new html tag..

4. JSF (similar to asp.net) - it is the newest method to do the web development. It uses visual component technology to help java developers to customize the html tag, and the content developers could quickly and visually reference the html tag. It greatly increases the productivity of web development.
a chinese article about the web tech(fastm

Wednesday, June 16, 2004

I wrote a small copy file routine that support overlaped reading and writing, it suppose to has better performance.

procedure RSICopyFile(ASourceFileName, ADestFileName: string; ABuffSize: integer; AOverLaped: boolean);
const
MaxBufSize = 1024 * 1024 * 50; // 50mb
var
FReadhandle: THandle;
FWritehandle: THandle;
FBuffer: Pointer;
BufSize, FBytesInBuff, FFilePos, FBytesRead, FBytesWrite: Integer;
FFileSize: Integer;
FRead_os, FWrite_os: TOverlapped;
ErrorFlag: Dword;

begin
//open the source file
if not AOverLaped then
FReadhandle := CreateFile(PChar(ASourceFileName), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING
, FILE_ATTRIBUTE_NORMAL or FILE_FLAG_SEQUENTIAL_SCAN, 0)
else
begin
FReadhandle := CreateFile(PChar(ASourceFileName), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING
, FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED, 0);

FillChar(FRead_os, SizeOf(FRead_os), 0);
FRead_os.hEvent := CreateEvent(nil, True, False, nil);
FRead_os.Offset := 0;
FRead_os.OffsetHigh := 0;
end;

if FReadhandle = 0 then
begin
raise exception.create('Cannot open the readding file');
end;

// get the size of source file
FFileSize := GetFileSize(FReadhandle, 0);

//open the dest file, create anew one if not exist
if not AOverLaped then
FWritehandle := CreateFile(PChar(ADestFileName), GENERIC_READ or GENERIC_WRITE,
0, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0)
else
begin
FWritehandle := CreateFile(PChar(ADestFileName), GENERIC_READ or GENERIC_WRITE,
0, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED, 0);

FillChar(FWrite_os, SizeOf(FWrite_os), 0);
FWrite_os.hEvent := CreateEvent(nil, True, False, nil);
FWrite_os.Offset := 0;
FWrite_os.OffsetHigh := 0;
end;

if FWritehandle = 0 then
begin
raise exception.create('Cannot open the writting file ');
end;

//Set the buffer size
if ABuffSize > MaxBufSize then
BufSize := MaxBufSize
else
BufSize := Integer(ABuffSize);

FBuffer := VirtualAlloc(0, BufSize, Mem_ReServe or Mem_Commit, PAGE_READWRITE);
try
if FFileSize > 0 then
begin
if FFileSize > MaxInt then
FFilePos := MaxInt
else
FFilePos := FFileSize;
while FFilePos > 0 do
begin
if FFilePos > BufSize then FBytesInBuff := BufSize else FBytesInBuff := FFilePos;
//clean up before read
FillChar(FRead_os, SizeOf(FRead_os), 0);
//Read file to buff
if not AOverLaped then
begin
if not ReadFile(FReadhandle, FBuffer^, FBytesInBuff, LongWord(FBytesRead), nil) then
begin
raise exception.create('file cannot be read');
end;
end
else
begin
if not ReadFile(FReadhandle, FBuffer^, FBytesInBuff, LongWord(FBytesRead), @FRead_os) then
begin
ErrorFlag := GetLastError;

if ErrorFlag <> 0 then
begin
if ErrorFlag = ERROR_IO_PENDING then
begin
if WaitForSingleObject(FRead_os.hEvent, INFINITE) = WAIT_OBJECT_0 then
if not GetOverlappedResult(FReadhandle, FRead_os,
LongWord(FBytesRead), False) then
begin
ErrorFlag := GetLastError;
if ErrorFlag = ERROR_HANDLE_EOF then
begin
exit; // The end of the stream was hit.
end;
end;

end
else if ErrorFlag = ERROR_HANDLE_EOF then
begin
exit; // The end of the stream was hit.
end
else
begin
raise exception.create('file cannot be read');
end;
end;
end;
inc(FRead_os.Offset, FBytesRead);
end;


//Write buff to file
if not AOverLaped then
begin
if FBytesRead = 0 then
begin
exit; // The end of the stream was hit.
end;
if not WriteFile(FWritehandle, FBuffer^, FBytesInBuff, LongWord(FBytesWrite), nil) then
begin
raise exception.create('file cannot be written');
end;
end
else
begin

if not WriteFile(FWritehandle, FBuffer^, FBytesInBuff, LongWord(FBytesWrite), @FWrite_os) then
begin
ErrorFlag := GetLastError;
if ErrorFlag <> 0 then
begin
if ErrorFlag = ERROR_IO_PENDING then
begin
if WaitForSingleObject(FWrite_os.hEvent, INFINITE) = WAIT_OBJECT_0 then
if not GetOverlappedResult(FWritehandle, FWrite_os,
LongWord(FBytesWrite), False) then
begin
ErrorFlag := GetLastError;
if ErrorFlag = ERROR_HANDLE_EOF then
begin
exit; // The end of the stream was hit.
end;
end;
end
else if ErrorFlag = ERROR_HANDLE_EOF then
begin
exit; // The end of the stream was hit.
end
else
begin
raise exception.create('file cannot be writeen');
end;
end;
end;
Inc(FWrite_os.Offset, FBytesWrite);
end;

//Change the position
Dec(FFilePos, FBytesRead);
end;
end;
finally
VirtualFree(FBuffer, BufSize, Mem_DeCommit or Mem_Release);
CloseHandle(FReadhandle);
CloseHandle(FWritehandle);
end;

end;
lib kernel32.dll reference for Windows Api programming in C# , VB.NET, and VB6. Examples of P/Invoke and DllImport with Source code
overlapped

Sunday, May 30, 2004

CSDN_C#:Web Service exception handling
Handling and Throwing Exceptions in XML Web Services
3 Leaf: Web Services Resources
Encrypting one parameter on a WebMethod with WSE
Building Robust and Reliable Software
Web Services Developer Center: Web Services Enhancements (WSE): Programming with Web Services Enhancements 2.0 (Web Services Enhancements (WSE) Technical Articles)
Undocumented Delphi 8 property access specifiers Part 1
Integrating Help in Delphi 8
The Oracle at Delphi: Delphi Win32: Why packages are better than libraries.

Thursday, May 27, 2004

Wednesday, May 26, 2004

Some code shows how to manage transaction in multiple database system


we create a table test_log in remote database, and a procedure test_log_pkg.insert_log to insert log into this table

create or replace package body test_log_pkg is
procedure insert_log(pvs_log in varchar2) is
begin
insert into test_log values (pvs_log);
end;
end test_log_pkg;


we create a procedure test_dblink_pkg.insert_remote_log in local database which invoke the insert_log in remote database by database link. we added PRAGMA AUTONOMOUS_TRANSACTION in declaration section, and commit the insert at the end.

create or replace package body test_dblink_pkg is

procedure insert_remote_log(pvs_log IN varchar2) is
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
insert_log@remote_db(pvs_log);
commit;
END;

end test_link_pkg;

then we create a table test_log in local database, and we create a test procedure which insert log into test_log in local database, and
invoke insert_remote_log to insert log into test_log in remote database, at the end, we rollback all of operations.

procedure test(pvs_log IN varchar2) is
BEGIN
insert into test_log values(pvs_log);
insert_remote_log(pvs_log);
rollback;
END;

after we run test, test_log in remote database has a new record, but test_log in local database has nothing.
It shows that the transaction for local database is rolled back, but the transaction for remote database is commited




DBAsupport.com : Oracle 9i Central : Autonomous and Distributed Transactions in Oracle 8i/9i
DEV310: Top 10 Tricks for a Killer ASP.NET Web Application

Wednesday, May 12, 2004

Sunday, April 18, 2004

Making web forms easy with InfoPath and "InfoView"

Nice idea, the tools to converting the InfoPath XML form to be ASP.NET web form.
ASP.NET and Struts: Web Application Architectures

Good article, seems like the author prefer the ASP.net, but I have to say the struts is more suitable for large web site since the structure of java struts could help the developer be able to have a better feel to the entire sytem.
ObjectSpaces and Whidbey

ObjectSpace will be come later than Whidbey, the reason seems like that ObjectSpace use some new feature in WinFS, such as a new Query syntax(hybrid-SQL-and-XPath),
is that means ObjectSpace only for Sql Server because WinFS use Sql server
FTPOnline - VSLive! SF 2004 - Model Apps More Effectively

It is hard to keep the code and Model in synchronization. MS case tools is going to make it easy.
Unit Testing a Windows Forms or Console Application

Separating the business logic code with Winform units is the key

Friday, April 09, 2004

Java Studio Creator: An IDE to Create Web Applications

The JSF web developement IDE from sun, is it as easy as Asp.net?

Monday, April 05, 2004

Essential Delphi 8 for .NET

There are a preview chapter available for downloading.
Something I got from this charper,
1. Initialization in D.net become the Static Class Method and called from Class Constructors
2. sets in D.net become the enumeration class (marked as sealed) that inherits from System.Enum.
3. the difference between record with methods and class in D.net is the way the use memory, the record is in stack and the class is in heap, so the record is a little bit more efficient.
4. StringBuilder is for increasing the performance of string concatenation. it is much faster than common string concatenation.
5. the Direct type cast became more restrictive in D.net. Integer (anObject) is no longer allowed
6. protected symbols defined in another unit are accessible only within the same assembly/package, but not across package boundary
7. ECO framework use Class Helper too, the Class Helper in D.net looks like the partial class in c#
8. published property in D.net become the BrowsableAttribute in CLR
9. Any class needing resource clean-up should implement the Dispose method of the IDisposable interface,
and add the 'using' clause in c#. the VM will free the object and resource in the the score of 'using' clause, this way eliminate the delay of GC.
in D.net, the Destroy() method becomes an implementation to Dispose. nice
10. However the Delphi 8 compiler cannot impose the presence of a specific metaclass for classes not
compiled by Delphi but imported from assemblies written in other languages.


Saturday, April 03, 2004

Oracle Technical Interview Questions Answered - Part1

A Oracle DBA or developer must read this article
XP flow Chart
WinForms is dead misconceptions are misplaced

how soon will you have 100% Longhorn coverage? Here's my guess: 2012 to 2014. so learning the winform will keep your job up to 10 years.
MSDN TV: Windows Forms and Non-Rectangular Applications

Friday, April 02, 2004

The .NET Show: Longhorn and WinFS

WinFS intergrated the Hiberarchy Files System, Relational Database and Rank based web search engine togeather, it sounds excited, but I am not sure if M$ could make the entire system easy to use, even for common people who has no IT knowledge.
How to design good APIs and Why they matter

Good article, the author wrote the effective java before,
CS CODEDOM Parser
I might use CodeDom sometime in the furture, just keep this link as reference

Thursday, April 01, 2004

The Code Project - XButton control for .NET - C# Controls

there are some GDI+ function in the source code, such as making the gradient effect
java thread model

A chinese article about the synchronized, DCL, lacyload, it introduces some important idea to all of developers who even are not java guy

Wednesday, March 31, 2004

Continuous Integration

we are using the visual build professional right now, but the tools here are free.
To GAC or not to GAC?

it is not my first time seen such article, so getting away from GAC
FxCop Team Page
it is a tools that could make your dotnet code solider
Visual C# Home: C# 2.0: Create Elegant Code with Anonymous Methods, Iterators, and Partial Classes

Visual Studo 2005 and ASP.NET 2.0 made it simple ... way too simple

VS.Net is very easy to use comparing to other development tools such as java, but it also tied the developers with the MS's framework, is it good or bad?

Friday, March 26, 2004

Design Guidelines Update: Generics

introduce the generics deeply
Paging with Repeater control in ASP.NET

Repeater is a replacement of array or list in ASP.net, could it be used in somewhere else?
COCOON's Tech
some DotNet book download

Thursday, March 25, 2004

Exception Handling in C#

using clause is used to do the exception handling,
and the class inside the using clause have to implement the IDisposable interface
A Brief Synopsis of C# Class and Method Modifiers
microsoft effective functional specification-chinese version

Wednesday, March 24, 2004

Tuesday, March 23, 2004

ONJava.com: Effective Unit Testing with DbUnit [Jan. 21, 2004]

the good thing for DBUnit is that it could put the testing data into a XML file,
and use its API to load into database, so you could change the testing data
without changing code. there are another nice stuff called MockObject.
it has DotNet portion.
Changes to Functionality in Service Pack 2 for Microsoft Windows XP
How to Shoot Yourself in the Foot with Code Coverage? (Part I)

Writing the unit test case could eliminate the bugs? who can make sure the test case is correct, I only wrote test case when I think it is necessary,
striving for 100% code coverage is kind of time wasting.
and the unit testing is only for developer, it could not reduce the work load of QA.

Monday, March 22, 2004

Avoid the GAC
CLR Hosting
some link about CLR Hosting
Encrypting SOAP Messages Using Web Services Enhancements

chinese version

Feedroll...freshly rolled news feeds for your site

a free blog tools to show your Blog item list on the web page

Are memory mapped files (MMFs) always faster than normal file I/O techniques?


Danny wrote it, talking some compiler's I/O performance issue, very deep, worthy to read
TestRunner for NUnit
A nice thing for Nunit is that it could test a set of assembly togeather
Squaretwo.Blog - Avalon Performance Tip: Inheritable Properties, Resources, and Replacing Styles

it introduce the use of a configurable property trigger, it could replace the event handler and the changing the properties in code, the reason he metions is because setting inheritable properties is expensive. I didn't get the point, anyway, this method is flexible.
In love with InfoPath

the infopath is a new member of MS office, it make the web service more useful, and will be a big impact to web based application.
The .NET Show: Longhorn Indigo

WSE and remoting will be outdated, the change is just too quick and very hard to catch up
C# Team Bloggers
PermaLink
the demo about the Avalon and XAML, the future UI standard of windows.

Sunday, March 21, 2004

Tim Bray joins Sun, explains .NET's "three flaws"
A long thread about the DotNet Vs Java, I would say that it is a kind of time wasting, the success is not due to the technology but the money, just take a look the point of Nasdaq.

I really like some comment here. such as

Microsoft will lie, cheat, steal, or maybe just work very, very har. whatever it takes. That's the most intimidating realization of all for competitors.
QDocuments.net
it is a free chinese version Delphi IDE expert for generating the document based on the comment in the source code, just like JavaDoc in java, unfortunately the english version is not available.
Some chinese IT E-book
COM thread model
chinese article, simple and clean
ObjectDataSource Sample:

this articel shows how to bind the Business Object with Webform control by web config profile, nice way to separeate the presentation layer with domain layer
The Code Project - Multi Dimensional Arrays using Template Meta Programming - C++ / MFC
This code is written by c++, not c#, since the c# 2.0 supports generic programing, so understanding the template in C+ is good for understanding the generic in c#
The Code Project - Multi-monitor programming in C# - C# Programming

Saturday, March 20, 2004

which language feature in .net could be used in a OR mapping framework
1: Attribute, it is very good for creating the different database access adapter in the data access object.
2: partial class, it is good for separating the business logic code from Value Object code.
3: CodeDom, it could be used to generate the Value Object code according to the XML mapping file during the runtime. just like CGLib in hibernate.
divil.co.uk - Windows Forms Controls
A free library for WinForm
Sysinternals Freeware - Utilities for Windows NT and Windows 2000 - Process Explorer
A great tools for system administrator and developer, you could see the DLL and resource that are used by the system process, it could help you looking for the maliced threads who are concealing in some sytem process, or debuging the application.
Some interview question from M$ China
Installers for GIMP for Windows
A open source tools that is similar to photoshop, worthy to try it.
.NET Resource Generator: Home
AskTom "Running procedures dynamically."

Good article, I really need this kind of feature since we treat stored procedure as a major development method considering its performance, but the parameter of stored proc is always a problem for us to make the generic data access object class.
the method this acticle introduced bring some advantage but losing some benefit such as compiling time type checking. so the tradeoff is everywhere
Java "Beats .NET for Processing XML," Report Claims (SYS-CON)
I can't beceive it, the MSXML is simple enough for me.
The Code Project - Super Combo Box - combo-box with columns, colors and more - Combo and List Boxes
Awesome ASP.NET V2 tip: specifying the assembly name in web.config for custom HttpModules/HttpHandlers in Whidbey's /Code directory
Coding Best Practices Using DateTime in the .NET Framework
Export data in a web application to Excel including formulas for columns