Tuesday, July 31, 2007

Very Good Morning.

நலக்குரியார் யாரெனின் நாமநீர் வைப்பின்
பிறற்குரியாள் தோள்தோயா தார்.
 
Is it asked, "who are those who shall obtain good in this world surrounded by the terror-producing sea ?" Those who touch not the shoulder of her who belongs to another.
_______________________________________________________

ஆபல் பரிசு..  ஆமாங்க.. ஆபல்தான்.. நோபல் பரிசு போல...

"கணிதத்துக்கான நோபல் பரிசு' என்று மதிப்புடன் குறிப்பிடப்படும் ஆபல் பரிசு, கணிதத்தில் தனிப்பெரும் சாதனை புரியும் மேதைகளுக்கு ஆண்டுதோறும் வழங்கப்படுவதாகும். நோபல் பரிசு போலவே மிக உயர்ந்த பரிசுத் தொகை (ரூ.4.5 கோடி) கொண்டது.

நார்வே நாட்டு கணித மேதை நீல்ஸ் ஹென்ரிக் ஆபலின் நினைவாக, ஆண்டுதோறும் ஆபல் பரிசு வழங்கப்படும் என 2001-ல் நார்வே அரசு அறிவித்தது. 2003-ம் ஆண்டு முதன் முதலில் ஆபல் பரிசு வழங்கப்பட்டது.

நீல்ஸ் ஹென்ரிக் ஆபல் (1802-1829), நமது நாட்டு மேதை ராமானுஜத்தைப் போலவே, மிக இளம் வயதிலேயே கணிதத்தில்  பல சாதனைகள் புரிந்தவர். ராமானுஜத்தைப் போலவே மிக இளம் வயதிலேயே காச நோயால் தாக்கப்பட்டு உயிரைப் பறிகொடுத்தவர். அபிலியன் சார்பு, அபிலியன் குலம், அபிலியன் தேற்றம் போன்றவை கணிதத்துக்கு ஆபலின் குறிப்பிடத்தக்க பங்களிப்புகள்.

கணிதத்துக்கு நோபல் பரிசு வழங்கப்போவதில்லை என்ற தகவல் வெளியானதை அடுத்து, சுமார் 100 ஆண்டுகளுக்கு முன்னரே "ஆபல் பரிசு' உருவாக்கும் திட்டம் முன்வைக்கப்பட்டது. இரண்டாம் ஆஸ்கர் என்ற மன்னர் அதற்கான நிதியுதவி செய்ய முன்வந்தார். ஆனால் நார்வே மற்றும் சுவீடன் நாடுகளுக்கு இடையிலான உறவில் சிக்கல் ஏற்பட்டதை அடுத்து 1905-ல் ஆபல் பரிசுத் திட்டம் கைவிடப்பட்டது. அதன் பின்னர் நீல்ஸ் ஹென்ரிக் ஆபலின் இருநூறாவது ஆண்டை முன்னிட்டு, நார்வே "ஆபல் பரிசை' அறிவித்தது. உலகளவில் அங்கீகாரம் பெற்ற 5 கணித மேதைகள் கொண்ட குழு, நார்வே அறிவியல் கழகத்தின் சார்பில் பரிசுக்குரியவர்களைத் தேர்ந்தெடுக்கிறது. 2007-ம் ஆண்டுக்கான ஆபல் பரிசைப் பெற்றவர் சென்னையில் பிறந்த, அமெரிக்க வாழ் கணிதப் பேராசிரியர் ஸ்ரீநிவாசா எஸ் வரதன்."ஃபீல்ட்ஸ் மெடல்' எனும் பரிசும் கூட, கணிதத்துக்கான நோபல் பரிசு எனக் குறிப்பிடப்படுகிறது. ஆனால், அது 4 ஆண்டுகளுக்கு ஒரு முறை, 40 வயதுக்கும் குறைவானவர்களுக்கே வழங்கப்படுவதாகும். இதேபோல், சுவீடன் அரச கழகம் 1982 முதல் வழங்கி வரும் "கிராஃபூர்டு பரிசு', 2004 முதல் வழங்கப்பட்டு வரும் "ஷா பரிசு' போன்றவையும் கணிதத்துக்கான நோபல் பரிசு என்றே வர்ணிக்கப்படுகின்றன.
_______________________________________________________

இன்றைய நகைச்சுவை
--------------------------------------
இப்படி இருந்தால் நிச்சயம் நீங்கள் தமிழன்தான்..!TAKE IT EASY :)

1. எந்தப் பொருள் வாங்கினாலும், ரொம்ப நாளைக்கு அதைச் சுத்தி இருக்கற ஜவ்வு பேப்பரைக் கிழிக்கவே மாட்டீங்க..!

2. உங்க சமையலில் உப்பு, புளி, மிளகாய் சேராமல் எந்த உணவும் இருக்காது..!

3. உங்களுக்கு வந்த அன்பளிப்புப் பொருட்களில், பால் குக்கரும், அஜந்தா சுவர்க் கடிகாரமும் நிச்சயம் இடம் பிடிச்சிருக்கும்..! ரொம்பப் பேரு தங்களுக்கு வந்ததை அடுத்தவங்க தலையில் [அன்பளிப்பாதான்] கட்டிவிட திட்டம் போட்டுகிட்டு இருப்பாங்க..!

4. வெளிநாட்டுக்குப் போயிட்டு வந்தீங்கன்னா, ஒரு மெகா சைஸ் சூட்கேஸோடதான் ஊருக்குத் திரும்புவீங்க..!

5. எந்த நிகழ்ச்சிக்குப் போனாலும் 1 மணி நேரம் தாமதமாப் போவீங்க. அதுதான் சரியா இருக்கும்ன்னு மனசார நம்புவீங்க..!

6. மளிகைப் பொருட்களின் பாலிதீன் உறைகளை பத்திரமா எடுத்து வைப்பீங்க. பின்னாடி உதவும்ங்கற தொலைநோக்குப் பார்வையோடு..!

7. உங்களுக்கு வரும் கடிதங்களில் எல்லா ஸ்டாம்பிலும் சீல் விழுந்திருக்கான்னு பார்ப்பீங்க. தப்பித்தவறி சீல் விழாம இருந்தா, அந்த ஸ்டாம்பை கவனமா பிரிச்சு எடுத்து எங்கேயாவது வச்சுட்டு, அப்புறம் சுத்தமா மறந்துடுவீங்க.

8. சினிமா தியேட்டரோ, விரைவுப் பேருந்தோ.. இருக்கையின் இருபக்க கை வைக்கும் இடத்துக்கும் சொந்தம் கொண்டாடுவீங்க..!

9. ரெட்டைப் பிள்ளைகள் இருந்தா, ஒரே மாதிரி ட்ரெஸ் தச்சுக் கொடுப்பீங்க. ரைமிங்கா பேர் வைப்பீங்க.. [ரமேஷ், மகேஷ். அமிர்தா,சுகிர்தா..]

10. ஏ.சி. திரையரங்குன்னா முட்டை போண்டா எடுத்துட்டுப் போய் நாறடிப்பீங்க.. ஏ.சி. கோச்சுன்னா, கருவாட்டுக் குழம்பை கீழே ஊற்றி கப்படிக்க வைப்பீங்க.!

--
Regards,
Rajesh Prabhu. R

"There is no future in any job. The future lies in the man who holds the job." - George Crane
"A busy man has time for everything and a lazy man has time for nothing."

Monday, July 30, 2007

Very Good Morning.

பிறன்மனை நோக்காத பேராண்மை சான்றோர்க்கு
அறனொன்றோ ஆன்ற வொழுக்கு.
 
That noble manliness which looks not at the wife of another is the virtue and dignity of the great.
________________________________________________

சில உண்மைகள்:

1. வெங்காயம் நறுக்கும் போது, சூயிங்கம் சாப்பிட்டால் கண்ணீர் வராது.

2.குழந்தைகள் 6 மாதம் வரை ஒரே நேரத்தில் மூச்சு விடவும், முழுங்கவும் முடியும்.

3.புது பேனாவை எழுத கொடுத்தால், 97% மக்கள் தங்கள் பெயரை எழுதுவார்கள்.

4. ஆண் கொசுக்கள் கடிக்காது. பெண் கொசுக்கள் தான் கடிக்கும். ( கொசுக்களிலுமா?)

5. சராசரி மனிதனின் விழிகள் 200 டிகிரி வரை திரும்பும்.

6. 40 டிகிரி வெப்பத்தில், 14.4 கலோரிகள் ஒரு மனிதன் இழ்ப்பான்.

7. கனடா நாட்டவர், தங்களின் புகைபடத்தை ஸ்டாம்பாக பயன் படுத்த முடியும்.

8. 8 மாதம் வரை குழந்தைகள் அழும் போது கண்ணீர் வராது.

9. சகாரா பாலைவனத்தில் பனி மழை 1979 பிப்ரவரியில் பெய்தது.

10. செடிகளுக்கு, மித சுடான தண்ணீர் ஊற்றினால், விரைவாக வளரும்.

11. இயர் போன் ஒரு மணி நேரம் அணிந்தால், 700 முறை பாக்டீரியா வளரும்.

12. திராட்சையை மைக்ரோ ஓவனில் சூடு படுத்தினால், வெடிக்கும்.

13. கண்கள் தான் பிறந்ததில் இருந்து வளராமல் அப்படியே இருக்கும்.

14. எல்லாருடைய நாக்கு ரேகைகள், கை ரேகைகள் போல வேறு விதமாக இருக்கும்.
________________________________________________

இன்றைய நகைச்சுவை
--------------------------------------
என் புருஷன் திட்டிகிட்டே புடவை வாங்கி கொடுத்தார்.

நீ என்ன செய்தாய்?

வாங்கிக் கட்டிக்கிட்டேன்.

--
Regards,
Rajesh Prabhu. R

"There is no future in any job. The future lies in the man who holds the job." - George Crane
"A busy man has time for everything and a lazy man has time for nothing."

Friday, July 27, 2007

Robotic fly

Traditional robots are slow, heavy, fragile. What nature builds is light, fast, robust. Inspired by the elegant aerodynamics of flying insects, UC Berkeley engineers, working with the Center for Information Technology Research in the Interest of Society (CITRIS), have created a tiny wing that flaps and generates lift. Their goal: a flying robot weighing less than a paper clip — one that could be used in search, rescue, monitoring, and reconnaissance.
http://www.berkeley.edu/news/media/releases/2002/06/fearing/home.html

Very Good Morning.

அறனியலான் இல்வாழ்வான் என்பான் பிறனியலாள்
பெண்மை நயவா தவன்.
 
He who desires not the womanhood of her who should walk according to the will of another will be praised as a virtuous house-holder.
_______________________________________________________________________

ஞாபக சக்தி

இரு கண்களுக்கு நடுவில் நெற்றிப் பொட்டில் அவ்வப்பொழுது விரல்களால் அழுத்துவதால் நினைவாற்றல் அதிகரிக்கும். மறந்து போன விஷயங்களை ஞாயபகத்துக் கொண்டு வர இது உதவும். இந்த இடத்தில் தான் நினைவாற்றலுக்கான அக்குப்புள்ளிகள் உள்ளன. இதனால் தான் மறந்த விஷயங்களை நினைவுக்கு கொண்டு வர நெற்றியில் விரல் வைத்துத் தட்டுகிறார்களோ!
 
 
ஆயுளுக்கு ஆறு

மனிதனின் ஆயுளை வளர்ப்பவை கீழ்க்காணும் ஆறு.அவை

1.சந்தேகம் இல்லாத முழு நம்பிக்கை
2.அன்பான மனைவி
3.மாலை வெயில்
4.ஓமப்புகை
5.அருவி நீர்
6.இரவில் பால் சாதம்
_______________________________________________________________________
 
இன்றைய நகைச்சுவை
----------------------------------------
 
மிஸ்டர் மொக்கை ஒரூமுறை பெட்ரோல் செலவைக் குறைக்க சைக்கிள் ஒன்றைப் புதிதாக வாங்கினார்..ஆனால் தொடர்ந்து காரிலேயே அலுவலகம் வந்தார்.. நண்பன் கேட்டான்..

என்ன மொக்ஸ்..? சைக்கிள் வாங்கினே போல.. ஆனா கார்லேயே சுத்திகிட்டு இருக்கே..?

அதை ஏன் கேட்கிறே.. அந்த சைக்கிள்ல ஏதோ கோளாறு இருக்கு..சீட்டுல ஏறி உக்காந்ததுமே பொத்'துன்னு கீழே விழுந்துடுது.. கார் மாதிரி ஸ்டெடியா நிக்க மாட்டுது..!

--
Regards,
Rajesh Prabhu. R

"There is no future in any job. The future lies in the man who holds the job." - George Crane
"A busy man has time for everything and a lazy man has time for nothing."

Thursday, July 26, 2007

C# Tips

1.How to Write debug string in C# ?

Using System.Diagnostics.Debug.Writeline() fn, we can write the debug string

2.How do we play default window sounds in C# ?
in .NET 2.0,

System.Media namespace is available. To play for example the classical beep sound, you could use the following code:

System.Media.SystemSounds.Beep.Play();
Similarly, you could play the “Question” sound with this code:
System.Media.SystemSounds.Question.Play();
The System.Media namespace is defined in System.dll, so there are no new DLLs you would need to add to your project’s references to use the above code.
3.What does the /target: command line option do in the C# compiler?
All the /target: options except module create .NET assemblies. Depending on the option, the compiler adds metadata for the operating system to use when loading the portable executable (PE) file and for the runtime to use in executing the contained assembly or module.
module creates a module. The metadata in the PE does not include a manifest. Module/s + manifest make an assembly - the smallest unit of deployment. Without the metadata in the manifest, there is little the runtime can do with a module.
library creates an assembly without an entry point, by setting the EntryPointToken of the PE's CLR header to 0. If you look at the IL, it does not contain the .entrypoint clause. The runtime cannot start an application if the assembly does not have an entry point.
exe creates an assembly with an entry point, but sets the Subsystem field of the PE header to 3 (Image runs in the Windows character subsystem - see the _IMAGE_OPTIONAL_HEADER structure in winnt.h). If you ILDASM the PE, you will see this as .subsystem 0x0003. The OS launches this as a console app.
winexe sets the Subsystem field to 2. (Image runs in the Windows GUI subsystem). The OS launches this as a GUI app.


4.What is the difference between const and static readonly?
The difference is that the value of a static readonly field is set at run time, and can thus be modified by the containing class, whereas the value of a const field is set to a compile time constant.
In the static readonly case, the containing class is allowed to modify it only
in the variable declaration (through a variable initializer)
in the static constructor (instance constructors, if it's not static)
static readonly is typically used if the type of the field is not allowed in a const declaration, or when the value is not known at compile time.
Instance readonly fields are also allowed.
Remember that for reference types, in both cases (static and instance) the readonly modifier only prevents you from assigning a new reference to the field. It specifically does not make immutable the object pointed to by the reference.
class Program
{
public static readonly Test test = new Test();
static void Main(string[] args)
{
test.Name = "Program";
test = new Test(); // Error: A static readonly field cannot be assigned to (except in a static constructor or a variable initializer)
}
}
class Test
{
public string Name;
}
On the other hand, if Test were a value type, then assignment to test.Name would be an error.

5.How do I get and set Environment variables?
Use the System.Environment class.Specifically the GetEnvironmentVariable and SetEnvironmentVariable methods.Admitedly, this is not a question specific to C#, but it is one I have seen enough C# programmers ask, and the ability to set environment variables is new to the Whidbey release, as is the EnvironmentVariableTarget enumeration which lets you separately specify process, machine, and user.
Brad Abrams blogged on this way back at the start of this year, and followed up with a solution for pre-Whidbey users.


6.Preprocess Win32 Messages through Windows Forms
In the unmanaged world, it was quite common to intercept Win32 messages as they were plucked off the message queue. In that rare case in which you wish to do so from a managed Windows Forms application, your first step is to build a helper class which implements the IMessageFilter interface. The sole method, PreFilterMessage(), allows you to get at the underlying message ID, as well as the raw WPARAM and LPARAM data. By way of a simple example:
public class MyMessageFilter : IMessageFilter
{
public bool PreFilterMessage(ref Message m)
{
// Intercept the left mouse button down message.
if (m.Msg == 513)
{
MessageBox.Show("WM_LBUTTONDOWN is: " + m.Msg);
return true;
}
return false;
}
}
At this point you must register your helper class with the Application type:
public class mainForm : System.Windows.Forms.Form
{
private MyMessageFilter msgFliter = new MyMessageFilter();

public mainForm()
{
// Register message filter.
Application.AddMessageFilter(msgFliter);
}

}
At this point, your custom filter will be automatically consulted before the message makes its way to the registered event hander. Removing the filter can be accomplished using the (aptly named) static Application.RemoveMessageFilter() method.


7.Be aware of Wincv.exe :


When you install the .NET SDK / VS.NET, you are provided with numerous stand alone programming tools, one of which is named wincv.exe (Windows Class Viewer). Many developers are unaware of wincv.exe, as it is buried away under the C:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Bin subdirectory (by default).
This tool allows you to type in the name of a given type in the base class libraries and view the C# definition of the type. Mind you, wincv.exe will not show you the implementation logic, but you will be provided with a clean snapshot of the member definitions.


8.What is the equivalent to regsvr32 in .NET?
Where you once used Regsvr32 on unmanaged COM libraries, you will now use Regasm on managed .NET libraries.
“Regsvr32 is the command-line tool that registers .dll files as command components in the registry“
“Regasm.exe, the Assembly Registration tool that comes with the .NET SDK, reads the metadata within an assembly and adds the necessary entries to the registry, which allows COM clients to create .NET Framework classes transparently. Once a class is registered, any COM client can use it as though the class were a COM class. The class is registered only once, when the assembly is installed. Instances of classes within the assembly cannot be created from COM until they are actually registered.“ If you want to register an assembly programmatically, see the RegistrationServices class and ComRegisterFunctionAttribute

Very Good Morning.

பகைபாவம் அச்சம் பழியென நான்கும்
இகவாவாம் இல்லிறப்பான் கண்.
 
Hatred, sin, fear, disgrace; these four will never leave him who goes in to his neighbour's wife.
___________________________________________________________________________

நம் தாய்மொழி தமிழ், வளமை குன்றாத ஐந்து பழம்பெரும் மொழிகளில் ஒன்று. இந்த மொழி உலகிலுள்ள 60 நாடுகளில் பேசப்படுகிறது.

தமிழ்நாடு இந்தியாவில் 11வது பெரிய மாநிலம்; இந்தியாவின் மொத்தப் பரப்பளவில் 4 சதவிகிதம் கொண்டது.

தமிழ்நாடு பழம்பெரும் சரித்திரப் பெருமை வாய்ந்தது. இதன் வரலாறு 6000 ஆண்டுகள் பழமையானது. இந்தியாவில் திராவிடக் கலாச்சாரம் பரவியது பெரிதும் தமிழ்நாட்டில் தான்.

சென்னை நீளமான சாலைகளுக்கும் பெயர்பெற்றது. இந்தியாவின் மொத்தத் தயாரிப்பில் 40% மோட்டார் உதிரி பாகங்களும் வாகனங்களும் சென்னையில் தயாரிக்கப்படுகின்றன. எனவே சென்னையை இந்தியாவின் டெட்ராய்ட் என்று அழைக்கிறார்கள்.

இந்தியாவிலுள்ள நான்கு பெரிய நகரங்களில் சென்னையும் ஒன்று.

பரத நாட்டியக்கலை பிறந்தது தமிழ்நாட்டில்தான்.

சென்னையிலுள்ள பெசன்ட் தோட்டத்தில்தான் (Beasant Gardens) மேடம் பிலாவட்ஸ்கியும், கர்னல் ஆல்காட்டும் துவங்கிய Theosophical Society யின் தலைமையிடம் இருக்கிறது. இந்தியாவிலேயே இரண்டாவது மிகப் பெரிய ஆலமரம் இங்குதான் இருக்கிறது.

கிண்டி தொழிற்கல்லூரி என்று அழைக்கப்படும் அண்ணா பல்கலைக்கழகம் 1794ல் கட்டக் கலைக்கான பள்ளியாக ஆரம்பிக்கப்பட்டது. இன்று அது உலகிலேயே இரண்டாவது பழம்பெரும் தொழிற்கல்லூரியாக விளங்குகிறது.

ரியோ டி ஜெனரோவிலுள்ள கோபகாபனா கடற்கரைக்குப் பிறகு இரண்டாவது பெரிய கடற்கரை நமது மெரீனா கடற்கரை.

சென்னை மருத்துவக்கல்லூரிதான் இந்தியாவின் பழமை வாய்ந்த மருத்துவக் கல்லூரி.

சுகாதார வசதிகளில் முதலாவதாகவும், கல்வி வசதிகளில் இரண்டாவதாகவும் Outlook பத்திரிக்கை 2003ல் சென்னையைத் தேர்வு செய்திருக்கிறது.

வண்டலூர் மிருகக்காட்சி சாலைதான் இந்தியாவின் முதல் மிருகக் காட்சி சாலை(1855). இது தெற்கு ஆசியாவிலேயே மிகப் பெரியது.

வேடந்தாங்கல் பறவைகள் சரணாலயத்தில்தான் உலகிலேயே அதிக எண்ணிக்கையில் பறவைகள் வருகின்றன.
___________________________________________________________________________

இன்றைய நகைச்சுவை
---------------------------
வீட்டுக்கு வந்தா கூட ஆபீஸ் நினைவாவே இருக்கு கலா.

உண்மைதாங்க.. என் பேரு மாலா, உங்க ஆபிஸ் ஸ்டெனோ பேருதானே கலா.


--
Regards,
Rajesh Prabhu. R

"There is no future in any job. The future lies in the man who holds the job." - George Crane
"A busy man has time for everything and a lazy man has time for nothing."

Wednesday, July 25, 2007

Effective C# mechanisms

Effective C# mechanisms:

1. Use 'as' and 'is' keywords instead of casting.

the ‘as' and ‘is' keywords instead of casting. It's true that those keywords let you test runtime type information without writing try / catch blocks or having exceptions thrown from your methods. It's also true that there are times when throwing an exception is the proper behavior when you find an unexpected type. But the performance overhead of exceptions is not the whole story with these two operators. The as and is operators perform run time type checking, ignoring any user defined conversion operators. The type checking operators behave differently than casts.
runtime performance as one justification for choosing among different language constructs, it's worth noting that very few Effective Items are justified strictly based on performance. The simple fact is that low-level optimizations aren't going to be universal. Low level language constructs will exhibit different performance characteristics between compiler versions, or in different usage scenarios. In short, low-level optimizations should not be performed without profiling and testing.

2.String Concatenation is expensive
string concatenation is an expensive operation. Whenever you write code that appears to modify the contents of a string, you are actually creating a new string object and leaving the old string object as garbage.

3.Checking the Length property is faster than an equality comparison
Some people have commented that this idiom:
if ( str.Length != 0 )
is preferable to this one:
if ( str != "" )
The normal justification is speed. People will tell you that checking the length of the string is faster than checking to see if two string are equal. That may be true, but I really doubt you'll see any measurable performance improvement.

4.String.Equal is better than == ( Refer gnana prakash anna's article)
5.Boxing and Unboxing are bad

This is true, boxing and unboxing are often associated with negative behaviors in your program. Too many times, the justification is performance. Yes, boxing and unboxing cause performance issues.

Very Good Morning.

எளிதென இல்லிறப்பான் எய்துமெஞ் ஞான்றும்
விளியாது நிற்கும் பழி.
 
He who thinks lightly of going into the wife of another acquires guilt that will abide with him imperishably and for ever.
 
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW

* சமவெளியை விட மலைப் பகுதிகளில் டென்னிஸ் பந்து உயரமாக மேலெழும்புகிறது. சமவெளி பகுதியை விட மலைப் பகுதிகளில் புவியீர்ப்பு விசை குறைவாக இருப்பதே இதற்கு காரணம் ஆகும்.

* அமெரிக்க விண்வெளி வீரர் மைக்கேல் காலின்ஸ் வான்வெளியில் உள்ள அதிசயங்களை `ஹாசல் பிளாட்' என்னும் கேமிராவின் உதவியால் படம் பிடித்துக்கொண்டிருந்தார். அப்போது எதிர்பாராத விதமாக கேமிராவை தவறவிட்டுவிட்டார். அன்றிலிருந்து அது வான வெளியில் பூமியின் பாதையில் எப்போதும் சுற்றிக்கொண்டே இருக்கிறது.

* விஞ்ஞான கருவிகளுக்கு எட்டிய விண்மீன்களில் மிகத் தொலைவில் உள்ள விண்மீன்களிலிருந்து பூமிக்கு ஒளிக்கதிர் வந்து சேர சுமார் ஐம்பது கோடி ஆண்டுகள் ஆகுமாம். சூரியனிடமிருந்து புறப்படும் கதிரின் ஒளி சுமார் எட்டே நிமிடங்களில் பூமியை அடைந்து விடுகிறது.

* தெளிவான வானத்தில் ஒருவர் ஒரு மணி நேரத்தில் பத்து எரிகற்களுக்குக் குறையாமல் காணலாம். பூமியின் மீது ஒரு நாள் முழுவதும் 7,00,00,000 எரிகற்கள் விழுகின்றன. அதனால், பூமியின் எடை சுமார் ஐந்து டன் அதிகரிப்பதாக விஞ்ஞானிகள் கணக்கிட்டுள்ளனர்.

WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW

இன்றைய நகைச்சுவை
--------------------------------------
இந்த ஏரியாவுல ஜொள்ளுப் பேர் வழிகள் அதிகமா?

எப்படி கண்டுபிடிச்சீங்க?

அடிக்கடி ஈவ் டீசிங் நடை பெறும் இடம் பெண்கள் மாற்றுப் பாதையில் செல்லவும் என்று போர்டு வச்சுருக்குதே.

--
Regards,
Rajesh Prabhu. R

"There is no future in any job. The future lies in the man who holds the job." - George Crane
"A busy man has time for everything and a lazy man has time for nothing."

Tuesday, July 24, 2007

STL sample with pointers

Today I developed the STL map pointer spike application...


#include <map>
using namespace std;

typedef map <int,int* > IntMap;
typedef map < int,int* >::iterator IntIter;
void MapPtrTesting()
{
IntMap m_Map;
IntIter iter;

int *p = new int();
*p = 10;
m_Map[0] = p;
iter = m_Map.find(1);
if( iter == m_Map.end())
{
printf("\n Invalid Search...");
return;
}
printf("\n Find the values :%d", *(iter->second));
for(iter = m_Map.begin(); iter != m_Map.end(); iter++)
{
printf( " Value of %d at ",(*iter).first);
printf(" Value is %d",*((*iter).second));
delete (*iter).second;
}
m_Map.clear();
}
int main (int argc, char* argv[])
{
printf("Hello World!\n");
MapPtrTesting();
return 0;
}


STL List sample application :


#include "stdafx.h"
#include <list >
using namespace std;

typedef list<int* > IntegerPtr;
list<int*>::iterator listIter;
void IntegerPtrTesting()
{
IntegerPtr *m_pIntegerPtr = new IntegerPtr();
int* p = new int();
*p = 10;
m_pIntegerPtr->insert(++m_pIntegerPtr->begin(),p);

for(listIter = m_pIntegerPtr->begin(); listIter != m_pIntegerPtr->end(); ++listIter)
{
printf("Value is %d",*(*listIter));
}
for(listIter = m_pIntegerPtr->begin(); listIter != m_pIntegerPtr->end(); ++listIter)
{
delete (*listIter);
*listIter = NULL;
}
m_pIntegerPtr->clear();
if(m_pIntegerPtr)
{
delete m_pIntegerPtr;
m_pIntegerPtr = NULL;
}

}


int main(int argc, char* argv[])
{

printf("Hello World!\n");


IntegerPtrTesting();
return 0;
}

Generics

C# Generics :



Generics are a new feature in version 2.0 of the C# language and the common language runtime (CLR). Generics introduce to the .NET Framework the concept of type parameters, which make it possible to design classes and methods that defer the specification of one or more types until the class or method is declared and instantiated by client code.
It is like a C++ template.



VC++.NET 2005 supports both generics and templates..NET generics differ from C++ templates.
difference is that specialization of a .NET generic class or method occurs at runtime whereas specialization occurs at compile time for a C++ template.

Key differences between generics and C++ templates:


Generics are generic until the types are substituted for them at runtime. Templates are specialized at compile time so they are not still parameterized types at runtime


The common language runtime specifically supports generics in MSIL. Because the runtime knows about generics, specific types can be substituted for generic types when referencing an assembly containing a generic type. Templates, in contrast, resolve into ordinary types at compile time and the resulting types may not be specialized in other assemblies.


Generics specialized in two different assemblies with the same type arguments are the same type. Templates specialized in two different assemblies with the same type arguments are considered by the runtime to be different types.


Generics are generated as a single piece of executable code which is used for all reference type arguments (this is not true for value types, which have a unique implementation per value type). The JIT compiler knows about generics and is able to optimize the code for the reference or value types that are used as type arguments. Templates generate separate runtime code for each specialization.


Generics do not allow non-type template parameters, such as





template C {}. Templates allow them.


Generics do not allow explicit specialization (that is, a custom implementation of a template for a specific type). Templates do.


Generics do not allow partial specialization (a custom implementation for a subset of the type arguments). Templates do.


Generics do not allow the type parameter to be used as the base class for the generic type. Templates do.


Generics do not allow type parameters to have default values. Templates do.


Templates support template-template parameters (e.g.

template class X> class MyClass ), but generics do not.

Very Good Morning.

எனைத்துணையர் ஆயினும் என்னாம் தினைத்துணையும்
தேரான் பிறன்இல் புகல்.
 
However great one may be, what does it avail if, without at all considering his guilt, he goes unto the wife of another?
 
---------------------------------------------------------------------------------------
மனிதர்கள் சராசரியாக படுத்த ஏழு நிமிடத்தில் தூங்க ஆரம்பிக்கிறார்கள்.

'#' என்ற இந்தக் குறியீடு 'ஆக்டோதோர்ப்' என்றழைக்கப்படுகிறது!

பைபிளில் குறிப்பிடப்படாத ஒரே வீட்டு விலங்கு, பூனை!

கண்களைத் திறந்து கொண்டே நம்மால் தும்ம முடியாது!

ஒரு கரப்பான் பூச்சியால் 10 நாட்கள் தலை இல்லாமலும் உயிருடன் வாழ முடியும்!

மெக்ஸிகோ நகரம் வருடத்திற்கு 10 அங்குலம் கடலில் மூழ்குகிறது!

மனித மூளை, டிவி பார்க்கும்போது இருப்பதைவிட, தூங்கும்போது சுறுசுறுப்பாக இயங்குகிறதாம்!

உலகின் மக்கள்தொகையைவிட, கோழிகளின் எண்ணிக்கை அதிகம்!

ஐஸ்லேண்ட் நாட்டில், நாய் வளர்ப்பது சட்டப்படி குற்றம்!

நம் கையின் கட்டைவிரல் நகம்தான் மிகவும் மெதுவாக வளர்கிறதாம். வேகமாக வளர்வது நடுவிரல் நகம்!
---------------------------------------------------------------------------------------

இன்றைய நகைச்சுவை
--------------------------------------
உங்கள் பையனின் ஜhதகப்படி புது கட்டிடத்தில் குடிபோகவேண்டிய யோகம் இருக்கிறது.

ஆமாம் அவனை சென்னை மத்திய சிறையில் இருந்து புழல் புதிய சிறைக்கு மாற்றிட்டாங்க.

--
Regards,
Rajesh Prabhu. R

"There is no future in any job. The future lies in the man who holds the job." - George Crane
"A busy man has time for everything and a lazy man has time for nothing."

Monday, July 23, 2007

Cross thread operation failure in .NET 2.0

Cross thread operation failure in .NET 2.0 :

within the user created thread , if we tried to add or update the control, that will cause the Cross thread operation failure .

Description of the problem :

During Runtime, .NET CLR checks whether the control is accessed at the thread where it is created. otherwise .NET CLR will display the Cross thread operation failure.

For Example if we added the list box to the form, within the user created thread, if we add item to the list box , this will produce
cross thread operation failure error.

How to solve the cross thread operation failure problem :

All the controls are derived from Control class.

Thread Safety
Only the following members are safe for multithreaded operations: BeginInvoke, EndInvoke, Invoke, InvokeRequired, and CreateGraphics.

For other methods, the developer is responsible for thread safe.(The developer has to write code to make it as thread safe..)

How I solved the problem:
-------------------------------------

By calling the Invoke() method, I solved the problem...

Note : BeginInvoke() or Invoke() blocks the thread until it updates the data to the control.




delegate void UpdateControl(string text);

void UpdateList(string text)
{


if(listbox1.InvokeRequired)
{
UpdateControl updateCtl = new UpdateControl( UpdateList);
listbox1.Invoke(updateCtl, text);
}
else
{
listbox1.Items.Add(text); // Add item to the list box...
}
}


void ThreadProc () // Cross thread's operation failure
{
UpdateList( "Sundar");
}



InvokeRequired member is true, if the cross thread operation execution takes place. ( this will be done by the framework by comparing the thread instance)




Full sample application with code:



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace CrossThreadInvoke
{
public partial class Form1 : Form
{

private Thread thread1 = null;
private ThreadStart threadStart1 = null;
delegate void UpdateControl (string text);


public Form1()
{
InitializeComponent();
threadStart1 = new ThreadStart(ThreadProcedure);
thread1 = new Thread(threadStart1);


}
private void UpdateList(string text)
{
if (listBox1.InvokeRequired)
{
UpdateControl m_UpdateControl = new UpdateControl(UpdateList);
listBox1.Invoke(m_UpdateControl, text);
}
else
{
listBox1.Items.Add(text);
}
}

private void ThreadProcedure()
{
int i = 0;
while (true)
{
if (i > 10)
{
break;
}

UpdateList("Sundar");
i++;
}

thread1.Abort();
}
private void btnStart_Click(object sender, EventArgs e)
{
thread1.Start();
}

private void btnStop_Click(object sender, EventArgs e)
{
thread1.Abort();
}
}
}


BeginInvoke() :

it is working in the same way as Invoke() fn...

Check the following sample application :


BeginInvoke() Sample application :

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;


namespace CrossThread
{
public partial class Form1 : Form
{
private Thread thread1 = null;
private ThreadStart threadStart1 = null;

public delegate void UpdateList(string text);
public UpdateList m_UpdateList = null;



public Form1()
{
InitializeComponent();
m_UpdateList += new UpdateList(SetToList1);
threadStart1 = new ThreadStart(AddToList1);
thread1 = new Thread(threadStart1);

}


public void SetToList1(string text)
{
listBox1.Items.Add(text);
}


private void AddToList1()
{
try
{
int i = 10;
while (true)
{
if (i <= 0) break;
listBox1.BeginInvoke(m_UpdateList, "sundar");
i--;
Thread.Sleep(1000);
}

}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());

}
}



Invoke() fns are thread safe.



In case of Invoke() fn what happens ...


void UpdateList(string text)
{
if( listbox1.InvokeRequired )
{
UpdateControl m_UpdateControl = new UpdateControl(UpdateList);
listbox1.Invoke( m_UpdateControl, text);
}
else
{
listbox1.Items.Add( text);
}
}


How this code works ...

Main thread is available to the C# application until we closes the application.
Application.Run() method in C# begins running a standard application message loop in the Form's main thread.
Each and Every thread has its own message queue for messages. if any event occurs in the thread will be added to the corresponding thread's message queue.


while we are accesing the listbox from cross thread, the thread instance is checked ...

For Cross thread, InvokeRequired field is set to true.


Invoke() fn executes a delegate on the thread that owns the control's underlying window handle.
The delegate is executed in the thread which the control is created . Until the completion of the delegate execution,
the current thread is blocked .

This is also same to BeginInvoke() fn . At which scenario we will use Invoke() and BeginInvoke()...

Normally for UI update we will use Invoke() method.
For UI data updation, we will use BeginInvoke() method.

For Example Updating the text to the list box we can use BeginInvoke() method.
For Example adding controls to the tab controls we may go for Invoke() fn. BeginInvoke() fn execution is much faster than Invoke() fn.

Very Good Morning.

விளிந்தாரின் வேறல்லர் மன்ற தெளிந்தாரில்
தீமை புரிந்து ஒழுகு வார்.
 
Certainly they are no better than dead men who desire evil towards the wife of those who undoubtingly confide in them.
______________________________________________________________

* உருளைக்கிழங்கு, பாதாம்பருப்பு இரண்டையும் சேர்த்து அரைத்து கண்களுக்கு கீழே பூசிவர கருவளையம் காணாமல் போகும்.

* கோதுமை மாவு சிறிதளவு எடுத்து அதில் பாலும் தேங்காய் எண்ணெயும் சேர்த்து குழைத்து கால்களில் பூசி அரைமணி நேரம் கழித்து குளித்தால் ஒரு வாரத்தில் கால்களில் உள்ள மாசு மரு நீங்கி கால்கள் பளபளப்பாகி விடும்!

* பருக்களால் ஏற்பட்ட தழும்புகள் மறைய வெள்ளைப் பூண்டின் சாறை தழும்புகள் உள்ள இடத்தில் தடவி பத்து நிமிடங்கள் கழித்து ஈரத்துணியால் துடைத்து எடுங்கள். வாரம் ஒருமுறை இப்படி செய்து வந்தால் நாளடைவில் தழும்புகள் மறைந்து விடும்.

* ஆபரணங்கள் அணிவதால் சில பெண்களுக்கு கழுத்துப் பகுதியில் கறுப்பாக காணப்படும். இதைப் போக்குவதற்கு பயித்தம் மாவு, கஸ்தூரிமஞ்சள் இவற்றைக் கலந்து தடவி வந்தால் கறுப்பு நிறம் நீங்கிவிடும்.

*  வெயில் காலம் வந்தாலே கூடவே வேர்க்குருக்களும், வேணல் கட்டிகளும் வந்துவிடும். நுங்கைப் பிளந்து அதன் சதைப் பற்றான பகுதியை வேர்க்குரு உள்ள பகுதியில் நன்கு தேய்த்து 30 நிமிடங்கள் ஊற விடவும். வேர்க்குருக்கள் நான்கைந்து நாட்களில் மறைந்துவிடும்.

* லிப்ஸ்டிக் கறையைப் போக்க யூகலிப்டஸ் ஆயில் பயன்படுத்தலாம்.

* பத்துப் பதினைந்து செம்பருத்தி இலைகளை அம்மியில் வைத்து விழுதாக அரைத்து ஒரு மேசைக் கரண்டி சீயக்காய்த் தூளைக் கலந்து நீராடினால் தலைமுடி 'பளபள'.

* இளைஞர்களின் இளநரை மறைய, வாரம் இருமுறை மலைவேம்பு இலைகளை அரைத்து தலைக்குத் தடவி, பத்து நிமிடங்கள் கழித்து குளித்து வந்தால் நாள்பட முடி கருமை அடையும்.

* வெண்டைக்காய்ப் பிஞ்சை அரைத்துத் தலையில் தேய்த்துக் குளித்தால் பொடுகு நீங்கும்.
______________________________________________________________

இன்றைய நகைச்சுவை
_______________________

புற்றுக்கு வெளியே நாகராஜன்னு நேம் போர்டு இருக்கே. ஏன்?

எந்தப் புற்றுல எந்தப் பாம்பு இருக்குமோன்னு யார்க்கும் சந்தேகம் வந்துடக்கூடாது பாருங்க அதற்குத்தான்..

--
Regards,
Rajesh Prabhu. R

"There is no future in any job. The future lies in the man who holds the job." - George Crane
"A busy man has time for everything and a lazy man has time for nothing."

Friday, July 20, 2007

Difference between Delegate and Delegate With event

Is there any difference between the delegate and delegate with event ?...

Yes... See the sample



delegate void UpdateControl( string text);
UpdateControl m_UpdateControl = null;
private event UpdateControl m_EventUpdateControl = null;


m_UpdateControl += new UpdateControl( UpdateListCtrl);
m_EventUpdateControl += new UpdateControl( UpdateListCtrl);

private void UpdateListCtrl()
{
listSent.items.Add("Test" + listSent.items.count);
}




we can create the object as follows :

m_UpdateControl = new UpdateControl(UpdateListCtrl); // will work properly

But the following code will not work properly...

m_EventUpdateControl = new UpdateControl(UpdateListCtrl);

we have to change it as

m_EventUpdateControl += new UpdateControl(UpdateListCtrl);

This implies...
we can set the delegate object as null as follows in anywhere like during initialization or within any fn.


m_UpdateControl = null;


But for Event with delegate object, we will not be able to initialize it as null , it affects the other client's delegates also.

m_EventUpdateControl = null; // Exception : we can initialize null for the event with delegate object during initialization.


what it means is that if we use the event keyword no client class can set it to null. This is very important. Multiple clients can use the same delegate. After multiple client have added a function to listen to the callback of the delegate. But now one of the client sets the delegate to null or uses the = sign to add a new call back. This means that the previous invocation list will not be used any more. Hence all the previous client will not get any of the callback even if they have registered for the call back.

Hence we can say that the even keyword adds a layer of protection on the instance of the delegate. The protection prevents

any client to reset the delegate invocation list. They can only add or remove the target from the invocation list.

Very Good Morning.

அறன்கடை நின்றாருள் எல்லாம் பிறன்கடை
நின்றரின் பேதையார் இல்.
 
Among all those who stand on the outside of virtue, there are no greater fools than those who stand outside their neighbour's door.
 
-----------------------------------------------------------------------------
* சாஞ்சி ஸ்தூபிகள் எங்கு அமைந்துள்ளது? - மத்திய பிரதேசம்

* தென்னிந்தியாவின் பனாரஸ் என எந்த நகரை அழைக்கிறார்கள்? - ராமேஸ்வரம்

* திருக்குட மூக்கு என்பது தமிழ் நாட்டின் எந்த பிரபல ஊரின் பெயர்? - கும்பகோணம்

* இந்தியாவின் நைல் நதி என்று எதனை அழைக்கிறார்கள்? - சிந்து நதி

* மேற்கு வங்க மாநிலத்தின் பிரபல துறைமுகங்கள்? - கொல்கத்தா, ஹால்டியா

* நமது நாட்டின் மிகப்பெரிய இரட்டை நகரங்கள்?- ஹைதராபாத் - செகந்திராபாத்

* இந்தியாவின் முதல் அருங்காட்சியகம் எந்த மாநிலத்தில் அமைக்கப்பட்டது? - கொல்கத்தா (1857-ம் ஆண்டு)

* இந்தியாவின் முதல் பஞ்சு மில் எங்கு ஆரம்பிக்கப்பட்டது? - மும்பை (1854-ம் ஆண்டு)

* கொல்கத்தா நகரம் எத்தனை பெரிய கிராமங்களின் இணைப்பாகும்? அவற்றின் பெயர்? - மூன்று (சுசாந்தி, கோவிந்தப்பூர், கொல்கத்தா)

* நமது நாட்டில் முதன் முதலாக எங்கு, எப்போது ஆப்பிள் பயிரிடப்பட்டது? - சிம்லா, 1887-ம் ஆண்டு

* வால்மீகி ராமாயண காவியத்தை எந்த இடத்தில் எழுதியதாக கூறப்படுகிறது? - பித்தூர் (உ.பி.)

* நமது நாட்டின் முதல் கடற்படை பயிற்சி தளம் எங்கு துவக்கப்பட்டது? - கொச்சி (1969-ம் ஆண்டு)

* இந்தியாவிலிருந்து வெளியான முதல் நாளிதழ்? - மும்பை சமாச்சார் (கி.பி. 1822)

* இங்கிலாந்தை எதிர்ப்பதற்கு ஜெர்மனியின் துணையோடு இந்திய சேவைப்படை என்னும் அமைப்பை உருவாக்கியவர்? - செண்பகராமன் பிள்ளை
-----------------------------------------------------------------------------

இன்றைய நகைச்சுவை
--------------------------------------
அரசியல்ல இதெல்லாம் சாதார்ணம்ப்பா..!

எங்கள் தலைவர் சரியாகக் கணக்குப் பார்க்காமல் எல்லா ஸீட்டுகளையும் தோழமைக் கட்சிகளுக்கே கொடுத்துவிட்டதால், கடைசியில் எங்களுக்கு ஸீட் இல்லாமல் போய்விட்டது. எனவே, தோழமைக் கட்சிகள் தலா இரண்டு ஸீட்டுகளைத் திரும்ப எங்களிடம் ஒப்படைக்குமாறு தாழ்மையுடன் கேட்டுக்கொள்கிறேன்.

--
Regards,
Rajesh Prabhu. R

"There is no future in any job. The future lies in the man who holds the job." - George Crane
"A busy man has time for everything and a lazy man has time for nothing."

Thursday, July 19, 2007

Softwarism ( Interesting.........)

Chandrababuism

You have two cows in Vijayawada. You hook them to internet and milk them from Hyderabad .

Jayalalithaism

You have two cows. You teach them to cry,"Ammaaaaaaa..."

and fall at your feet.

 

Karunanidhiism

 You have two cows. You give one to your son and the other to your another son ..

 

Gandhism

You have two cows. But you drink goat's milk.

 

Indiraism

You have two bulls. You adamantly consider them as cows.

 

Lalooism

 You have two cows. You buy Rs. 900 Crore worth of cattlefeed for them.

 

Rajnikantism

You have two cows. You throw them into air and catch their milk in your mouth.

 

Rajivism

 You have two cows. You paint them both to get colourful milk.

 

Softwarism: (Ultimate....)

Client has 2 cows and u need to milk them.

1 . First prepare a document when to milk them (Project kick off)

2 . Prepare a document how long you have to milk them (Project plan)

 3 . Then prepare how to milk them (Design)

 4 . Then prepare what other accessories are needed to milk them

(Framework)

5 . Then prepare a 2 dummy cows (sort of toy cows) and show to client

the way in which u will milk them (UI Mockups & POC)

 6 . If client is not satisfied then redo from step 2

7 You actually start milking them and find that there are few problem

with accessories. (Change framework)

8 . Redo step 4

 9 . At last milk them and send it to onsite. (Coding over)

 10. Make sure that cow milks properly ( Testing)

 11. Onsite reports that it is not milking there.

 12. You break your head and find that onsite is trying to milk from

bulls

 13. At last onsite milk them and send to client (Testing)

14. Client says the quality of milk is not good. (User Acceptance Test)

 15. Offsite then slogs and improves the quality of milk

 16. Now the client says that the quality is good but its milking at slow

rate (performance issue)

 17. Again you slog and send it with good performance.

18. Client is happy???

By this time both the COWs aged and cant milk. (The software got old and

get ready for next release repeat from step 1) !!!!!

மென் பொருள் துறையில் தொழில் மற்றும் வேலை வாய்ப்புகள் - சில எண்ணங்கள்

'அப்படி என்னதான் செய்யறீங்க? இத்தனை ஆயிரம் கோடி ஏற்றுமதி என்கிறாங்க, இத்தனை லட்சம் படிச்ச பசங்க வேலை பார்க்கிறாங்க. இன்னும் பல ஆண்டுகளுக்கு இது வளர்ந்து கொண்டே போகும் என்கிறாங்க. மென் பொருள்னா என்னங்க?'

'பொதுவா ஒரு பொருளை, சேவையை உருவாக்கி ஒருத்தருக்குக் கொடுத்து காசு சம்பாதிக்கிறோம். மென்பொருள் துறையில் என்ன நடக்குது, இவ்வளவு வளர்ச்சி என்று புரியவில்லை'

என்று நண்பர் ஒருவர் கேட்டார். வேதித் தொழில் நுட்பம் படித்து வளைகுடா நாடு ஒன்றில் பெரிய வேலையில் இருக்கிறார்.

நாமெல்லாம் கையால், விலங்குகளின்் ஆற்றலால் செய்து வந்த வேலைகளை இயந்திரங்களால் செய்ய ஆரம்பித்தது தொழில் புரட்சி போல, மனித மூளையில் நடந்து வந்த வேலைகளை கணினிகளால் செய்து கொள்வது தகவல் தொழில் நுட்பப் புரட்சி. நாம் இப்போது இருப்பது அந்தப் புரட்சியின் ஆரம்பக் கட்டங்களில்.
 
  • எங்கெல்லாம் திரும்பத் திரும்ப நடக்கும் கணக்குகள் போட வேண்டுமோ,
  • எங்கெல்லாம் தகவல்களைத் திரட்டி வைத்துக் கொண்டு பின்னர் பயன்படுத்த வேண்டியிருக்கிறதோ,
  • எங்கெல்லாம் புதிய கருவிகளில் சிந்திக்கும் வேலை செய்ய வடிவமைக்க வேண்டுமோ
அங்கெல்லாம் மனித சிந்தனையை முழுமையாகவோ, பகுதியாகவோ மாற்றிக் கொள்ள கணினிகள் பயன்படுத்தப்படுகின்றன. கணினிகளை இயக்க தேவைப் படும் உயிர்ப் பொருள்தான் மென்பொருள்.

அதுக்கு ஏன் இவ்வளவு மதிப்பு?

ஒரு நிறுவன மேலாண்மையை எடுத்துக்குவோம். சின்னக் கடை என்று வைத்துக் கொள்வோம். மொத்தமாக நொறுக்குத் தீனிகள் வாங்கி சின்ன அளவில் பொதிந்து கடைகளுக்கு அனுப்பி வைக்கும் பணி. வேலை செய்ய ஆறு பேர், தின்பண்டங்களை வழங்குபவர்கள் 10-15 இடங்கள், வாடிக்கையாளராக சில்லறை விற்பனைக் கடைகளுக்கு வினியோகிக்கும் பணி செய்பவர்கள் 10-12 பேர்.

இந்தத் தொழிலில் கையாள வேண்டிய விபரங்கள்,
  • யாரிடமிருந்து என்ன விலைக்கு, எந்தப் பொருளை வாங்குகிறோம்,
  • அவருக்குப் பணம் கொடுக்க வேண்டிய கொடுத்த தகவல்கள்,
  • வேலை பார்ப்பவர்கள் தினமும் வந்த விபரம், விடுமுறை எடுத்த விபரம்,
  • போட்ட பொதிகளின் எண்ணிக்கை அளவு வாரியாக,
  • யார் எத்தனை பொதிகள் எடுத்துச் சென்றார்கள், யார் எவ்வளவு பணம் தர வேண்டும்,
  • கைவசம் விற்காமல் சரக்கு எவ்வளவு மீதி இருக்கிறது
என்று வரவு செலவு கணக்கு போட வேண்டும்.
  • எந்த விற்பனையாளரிடமிருந்து வாங்கிய பொருளில் குறைபாடுகள் தென்பட்டன,
  • எந்த பொருளுக்கு விற்பனை அதிகரிக்கிறது, எதற்குக் குறைகிறது.
  • புதிதாக என்ன விற்க ஆரம்பிக்க வேண்டும்
என்று எதிர்காலத் திட்டமிடல்களும் வேண்டும்.

கணினி காலத்துக்கு முன்பு இத்தகைய தொழிலில் உரிமையாளர் ஒரு சின்ன நோட்டுப் புத்தகத்தில் விபரங்களைத் தனக்குப் புரியும் படிக் குறித்து வைத்துக் கொள்ளலாம், பணம் வர வேண்டிய விபரம், கையிருப்பு இரண்டையும் பார்த்துக் கொண்டால் போதுமானது.

இன்னும் நுணுக்கமாக தகவல் சேகரிக்க, குறித்து வைக்க அதை அலசிப் பார்க்க ஆரம்பித்தால் அவருக்கு அதற்குத்தான் நேரம் சரியாக இருக்கும் அல்லது புதிதாக ஆள் போட வேண்டும். பெரிய நிறுவனங்களில் கணினிகள் வரும் முன்னரே இது போன்று தகவல் திரட்டுவதற்காக சிலரை வைத்திருப்பார்கள்.

ஆனாலும் மனித மூளையைப் பயன்படுத்தி சில வேலைகளை செய்வதில் அளவு இருக்கிறது. பெருவாரியான தகவல்களை சேமித்த வைத்தல், சிக்கலான கணக்குகளைப் போடுதல் போன்ற பணிகளுக்கு நமது மூளை அவ்வளவு திறமுடையது இல்லை. அந்த வேலைகளுக்கு மின்னணுக் கருவிகளைப் பயன்படுத்துவதுதான் கணினித் துறை.

நீராவி எந்திரத்தை மனித ஆற்றலுக்கும், கால்நடைகளின் உழைப்புக்கும் மாற்றாகப் பயன்படுத்த ஆரம்பித்த பிறகு அது வரை முடியாத பலப் பல சாத்தியங்கள் தோன்றின. தரையில் வேகமாகப் போக இயந்திரங்களை பயன்படுத்தும் போது, கிடைத்த கூடுதல் வேகத்தைப் பயன்படுத்தி பறக்கும் விமானங்களை உருவாக்க முடிந்தது. இதே போல நூற்றுக் கணக்கான, ஆயிரக் கணக்கான சிறிதும் பெரிதுமான கண்டுபிடிப்புகள் தோன்றி மனித வாழ்க்கையை மாற்றி அமைத்தன.

இவ்வளவு இருந்தாலும் 'இயந்திரம் என்ன வேலை செய்ய வேண்டும், எப்போது செய்ய வேண்டும்' என்று திட்டமிட்டு, தீர்மானித்து அதை இயக்குவது மனிதக் கைகளால்தான் நடந்தது.

அதே போல நமது மூளையால், முடிந்த வரை செய்து வந்த வேலையைக் கணினிகளுக்கு தள்ளி விட்டு வேகமாக துல்லியமாக முடிக்கும் வசதி உருவானவுடன் புதிய புதிய கண்டுபிடிப்புகளும் சாத்தியமாகின்றன.

எவ்வளவுதான் நடந்தாலும் கணினிகளைப் பயன்படுத்துவது, வடிவமைப்பது, இயக்குவது மனிதர்களாகத்தான் இருக்கிறது.

இப்படியாக வழக்கமான தொழில்களின் தகவல் திரட்டல், அலசுதல், பழைய கருவிகளை இயக்குதல், புதிய கண்டுபிடிப்புகளுக்கு உயிர் கொடுத்தல் என்று கணினிகள் பயன்படுத்தப்படும் எல்லா இடங்களிலும் மென்பொருட்கள் எனப்படும் கணினியின் உயிர்ப்பொருட்கள் பயன்படுகின்றன.

இத்தகைய மாற்றங்களில் பெரும் பகுதி அமெரிக்கா, ஐரோப்பா, ஜப்பான் போன்ற வளர்ந்த நாடுகளில்தான் நடக்கின்றன.

நம்ம ஊரில் ரயில்வே துறையில் பயண முன்பதிவு, வங்கிகளில் கணினி மயமாக்கம், தொலை தொடர்பு நிறுவனங்களில் கணினி மயமாக்கம் என்று இருப்பது போல ஒவ்வொரு துறையிலும் கணினிகளைப் பயன்படுத்த ஆரம்பித்து விட்ட முன்னேறிய நாடுகளில்தான் மென்பொருள் தேவை பெரிய அளவில் இருக்கிறது.
  • மருத்துவர் ஒருவர் தான் பார்த்த நோயாளியைப் பற்றிய விபரங்களைச் சேமிக்க கணினிகள் பயன்படுத்தப் படுகின்றன.
  • தொழில் நிறுவனங்கள் தமது வாங்கல், விற்றல், சரக்கு கையிருப்பு, ஊழியர்களை கையாளுதல் போன்றவற்றுக்குக் கணினிப் பயன்பாடுகளைப் பயன்படுத்துகின்றன.
  • புதிது புதிதாகக் கண்டுபிடிப்புகள் தோன்றி அவற்றை இயக்க மென்பொருட்கள் தேவைப் படுகின்றன.
நாம் மென்பொருள் துறையில் வல்லரசு, இந்தியாவை நம்பித்தான் மேலை நாடுகள் இயங்குகின்றன, இந்தியா ஒளிருகிறது என்று பேசிக் கொள்வதில் முற்றிலும் உண்மை இல்லை.

மென் பொருள் பயன்படுத்துவது, அதன் மூலம் வாழ்க்கைத் தரம் உயர்வது, புதிய கண்டுபிடிப்புகள் நடப்பது எல்லாம் வேறு இடங்களில்தான். அதனால் அங்கு இருக்கும் வல்லுநர்கள் என்ன மென்பொருள் தேவை, அது எப்படி வடிவமைக்கப்பட வேண்டும், அதற்கு என்ன செலவு செய்யலாம் என்று திட்டமிட்டு அதை உருவாக்கும், பராமரிக்கும் பணியை நம் பக்கம் தள்ளி விடுகிறார்கள். அதைத்தான் நமது இளைஞர்கள் மாய்ந்து மாய்ந்து செய்கிறோம்.

இந்த நமது பணிக்கு ஆண்டுக்கு 50,000 கோடி வருமானம் கிடைக்கிறது என்றால் இந்தப் பணியைப் பயன்படுத்தும் சமூகங்களுக்கு அதை விட இரண்டு மடங்காவது நன்மை கிடைக்கும் அல்லவா?

மென்பொருள் என்பது ஒரு வீடு கட்டவது போல என்று வைத்துக் கொள்ளலாம்.

ஒருவருக்கு வசிக்க வீடு வேண்டும். அந்தக் குடும்பத்தில் எத்தனை பேர், யார் யார் என்ன செய்கிறார்கள், எவ்வளவு பெரிதாக இருக்க வேண்டும், என்னென்ன வசதிகள் இருக்க வேண்டும் என்று அலசி ஆராய்வது முதல் படி.

இரண்டாவதாக இந்தத் தேவையை எப்படி செயல் படுத்த முடியும் என்று படம் வரைவது, தொழில் நுட்பச் சாத்தியங்கள், செலவுகள் முதலியவற்றைக் கருத்தில் கொண்டு திட்டம் ஒன்றை உருவாக்குவது இரண்டாவது படி.

அதை வாடிக்கையாளர் ஏற்றுக் கொண்டால், திட்டத்தை எப்படிச் செயல்படுத்துவது என்று நடைமுறை வேலைகளைப் பார்ப்பது மூன்றாவது படி.

இந்த மூன்றாவது படி வேலைகளைத்தான் வெளிநாடுகளுக்கு மென்பொருள் சேவையை ஏற்றுமதி செய்யும் இந்திய நிறுவனங்கள் செய்கின்றன. ஜாவா, டாட் நெட் என்ற படித்து விட்டு வேலைக்குச் சேர்ந்தால் செய்யும் பணி கட்டிடம் கட்டும் வேலையில் செங்கல் அடுக்குவது, சாந்து குழைப்பது போன்ற வேலைகள்தான்.

அடுத்த படியில் உருவாக்கிய மென்பொருளைப் பராமரித்தல், பயன்படுத்தும் போது ஏற்படும் குறைகளை நிவர்த்தித்தல், பயனர் புதிதாகக் கேட்கும் மேம்பாடுகளை உருவாக்குதல் என்று முடிவில்லாமல் பணிகள் உள்ளன. வீட்டை தினமும் கூட்டிப் பெருக்க வைக்க நேரமும், ஆட்களும் இல்லாத நாடுகள் தகவல் தொழில் நுட்பப் புரட்சியின் சாத்தியங்களால் அந்த வேலைகளை வெளிநாடுகளில் செய்து வாங்கிக் கொள்ள முடிகிறது.

வேலை வாய்ப்பு என்று பரவலாகக் கிடைப்பது மேலே விளக்கியது போன்ற குறைந்த மதிப்பிலான பணிகள்தாம். அதனால் அவற்றைக் குறைத்து மதிப்பிட வேண்டியதில்லை. மென்பொருள் துறை இந்தியாவில் வளர்ந்ததால் பல்லாயிரக் கணக்கான பேருக்கு முன்பு நினைத்துப் பார்க்க முடியாத அளவுக்கு வருமானம் கிடைக்கிறது. அந்தப் பணம் வரியாக அரசாங்கத்துக்குப் போய் நலப் பணிகளில் பயன்படுகிறது. மென்பொருள் துறையில் பணிபுரிபவர்களின் குடும்பங்களை தளைக்கின்றன. தொழில் வாய்ப்புகள் பெருகுகின்றன.

ஆனால், இவை எல்லாவற்றையும் விடப் பல மடங்கு மதிப்புள்ள சாத்தியங்கள் மென்பொருள் துறையில் உள்ளன. கணினிகளை நம் ஊர் பணிகளுக்கு செயல்படுத்தும் பெரும் பணி காத்திருக்கிறது. அதைச் செய்ய பெருமளவிலான முயற்சிகள் நடப்பதில்லை. பெரிய நிறுவனங்கள் கூட அமெரிக்க ஐரோப்பிய பணிகளை மட்டுமே எடுப்பது என்று கொள்கை முடிவுடன் இயங்குகின்றன.

வேலை வாய்ப்பு என்று சொன்னால், அத்தகைய நிறுவனங்களில் திறமையான, படித்த, பயிற்சி பெற்ற இளைஞர்களுக்கு வேலைக்குப் பஞ்சமே இல்லை.

ஆனால் பெரும் புதையல் காத்திருப்பது உள்ளூர் பொருளாதாரத்தில். பேருந்தில் போகும் போது சீட்டு கொடுத்த பிறகு ஒரு சின்ன அட்டையில் கணக்குகளை எழுதிக் கொள்கிறார் நடத்துனர், பெங்களூரூவில் இருப்பது போல ஒரு குட்டிக் கணினியைக் கையில் வைத்துக் கொண்டு, அதில் விபரங்களை ஒத்தி சீட்டு அச்செடுத்துக் கொடுத்தால் விபரங்கள் தானாகவே பதிவாகி பணி முடிந்ததும் மையக் கணினியில் ஒப்படைத்து விடலாம். நடத்துனரின் பணி பல மடங்கு எளிதாகி விடும்.

எந்த தடத்தில் எந்த நேரத்தில் எந்த பருவத்தில் கூட்டம் அதிகமாக வருகிறது என்று ஆராய்ந்து பார்க்க, அதிக முயற்சி இல்லாமல், கணினியில் பதிக்கப்பட்ட விபரங்களைப் பயன்படுத்தி அறிக்கை உருவாக்கிக் கொள்ளலாம். அதற்கு சில நிமிடங்கள்தான் பிடிக்கும். அதைப் பொறுத்து முடிவுகளை எடுத்து பயணிகளுக்கு சேவையை மேம்படுத்தலாம்.

வளர்ந்த நாடுகளில் இந்த வேலைகளைச் செய்ய போதுமான பணியாளர்கள் கிடைக்காததால் அவை இந்தியா போன்ற நாடுகளில் செய்து பெறப்படுகின்றன.
 

ASP.NET Orcas: Quiet Revolution

A few months ago, Microsoft released Beta 1 .NET Framework 3.5 and Visual Studio 2008 codename Orcas (http://www.tinyurl.com/269434 ). Microsoft made the version a bit whacky for this release cycle and if you haven't been paying close attention you wonder whether you somehow missed ASP.NET 3.0 along the way. You didn't. Microsoft didn't make an ASP.NET 3.0 update. The .NET 3.0 release cycle focused on add-on libraries that run on top the .NET runtime 2.0. The 3.0 updates brought Windows Presentation Foundation (WPF), Windows Workflow (WF), and Windows Communication Foundation (WCF), and they all consisted entirely of new libraries that run on top of the 2.0 runtime, which itself wasn't updated by the 3.0 release. For ASP.NET this means that .NET 3.0 really had no effect on the existing feature set and functionality. Daniel Moth sums up the confusing runtime arrangements from 2.0 to 3.5 (http://www.tinyurl.com/ywdp92) in a blog post.

.NET 3.5 will be the next major release of the .NET runtime and it does change the base libraries as well as add a number of new libraries to the core runtime. However, even with these updates, changes to ASP.NET 3.5 are relatively minor. Most of the key feature enhancements in .NET 3.5 are related to core runtime and language enhancements, especially those that relate to Language Integrated Query (LINQ) and its supporting features.

A Different Kind of Update

When Microsoft released ASP.NET 2.0, they made some pretty major changes from version 1.1. Microsoft changed almost every aspect of the HTTP runtime and the core ASP.NET engine changed including a whole new compilation model and new project types. Although you could run 1.x applications with very few (if any) changes, making these applications into full blown 2.0 applications required a host of changes and updates. ASP.NET 2.0 introduced a tremendous amount of new functionality-new controls, many new HTTP runtime features, provider models for many aspects of the runtime. It's probably not an overstatement to say that Microsoft's release of ASP.NET 2.0 had huge changes that many of us are still digesting one and half years later.

ASP.NET 3.5, on the other hand, looks to be a much less heavy-handed update and most of the changes are evolutionary rather than revolutionary. In fact, as far as pure runtime features are concerned, not much will change at all. A good number of enhancements that the ASP.NET team will roll into the Orcas release have to do with more tightly integrating technologies that are already released and in use. This includes direct integration of the ASP.NET AJAX features into the runtime and full support for IIS 7's managed pipeline (which by its own right could have been ASP.NET 3.0!).

For you as a developer, this means that moving to Visual Studio 2008 and ASP.NET 3.5 is probably going to be a lot less tumultuous than the upgrade to 2.0. I, for one, am glad that this is the case as the change from 1.1 to 2.0 involved a lot of work for conversion. In my early experimentation with Orcas Beta 1 I've migrated existing applications painlessly to .NET 3.5 and could immediately start adding new 3.5 features without that horrible "legacy" feeling about my code that typically comes with a major .NET version upgrade.

That isn't to say that .NET 3.5 will not have anything new or the potential for making you *want* to rewrite your applications, but getting a raw 2.0 application running and compiling properly under Visual Studio 2008 either for .NET 2.0 or 3.5 will be very easy.

ASP.NET 3.5: Minimal Changes

ASP.NET 3.5 doesn't include a ton of new features or controls. In fact, looking through the System.Web.Extensions assembly I found only two new controls: ListView and DataPager.

The ListView control is a new data-bound list control that is a hybrid of a GridView and Repeater. You get the free form functionality and templating of a Repeater with the data editing, selection, and sorting features of a data grid, but without being forced into a tabular layout. The ListView supports layout for table, flow layout, and bullet list layout so it offers a lot of flexibility and some built-in smarts for the type of layout used. All of this provides more flexibility and more control over your layout than either the GridView or the Repeater has on its own. The DataPager control works in combination with a ListView to provide custom paging functionality with the DataPager acting as behavior for the ListView.

The System.Web.Extensions assembly contains all of the new functionality for ASP. System.Web.Extensions and should be familiar since it also contains the ASP.NET AJAX features that Microsoft has already made available as part of the ASP.NET AJAX distribution. With .NET 3.5, System.Web.Extensions becomes a native part of .NET 3.5 so you don't have to make a separate installation to use ASP.NET AJAX features. Unfortunately it looks like you must still make the ugly configuration settings required by the AJAX features for web.config-I had hoped that the ASP.NET team could have moved these settings into the machine-wide web.config settings.

In addition to these core features that Microsoft will add to System.Web.Extensions already, Microsoft has indicated additional pending features in the ASP.NET Futures CTP code (http://www.asp.net/downloads/futures/default.aspx). The ASP.NET Futures release includes code for a host of features, some of which may or may not make it into the actual framework distribution. It includes a number of additional ASP.NET AJAX Client library features, a host of XAML and Silverlight support features, and an interesting dynamic data framework called Dynamic Data Controls ( http://www.tinyurl.com/2ktlzw) which is a Rails-like tool to quickly generate a full data manipulation interface to a database. Microsoft has not indicated which of these features of the Futures release will make it into the shipping version of .NET 3.5, but some will undoubtedly make the cut.

The Real Change Maker Is LINQ

While ASP.NET itself may not make a huge wave of changes, that doesn't mean there won't be plenty of new stuff for developers to learn. To me, the biggest change in .NET 3.5 is clearly the introduction of Language Integrated Query (LINQ) and I bet that this technology, more than anything else, will have an effect on the way developers code applications, much in the way Generics affected .NET 2.0 coding. Like Generics, LINQ will require a little bit of experimenting to get used to features, but once you 'get' the core set of LINQ functionality, LINQ will be hard to live without.

In a nutshell, LINQ provides a new mechanism for querying data from a variety of "data stores" in a way that is more intuitive and less code-intensive than procedural code. With strong similarities to SQL, LINQ uses query parsing techniques within the compiler to reduce the amount of code you have to write for filtering, reordering, and restructuring data. With LINQ you can query any IEnumerable-based list, a database (LINQ to SQL http://www.tinyurl.com/34bnwh) and XML (LINQ to XML http://www.tinyurl.com/2lrofy). You can also create new providers so, in theory, LINQ can act as a front end for any data store that publishes a LINQ provider.

LINQ generally returns an IEnumerable-based list of data where the data is specific to the data you are querying. What's especially nice is that the returned data can be in an inferred format so that you can get strongly-typed data returned from what is essentially a dynamic query. LINQ can either run query results into dynamically constructed types that the compiler generates through type inference, or by explicitly specifying an exact type that matches the query result signature.

LINQ makes it possible to use a SQL-like syntax to query over various types of lists. While this may not sound all that exciting, take a minute to think about how you often deal with list data in an application in order to reorganize the data by sorting or filtering that data. While it's not too difficult to do this using either raw code with a foreach loop or using .NET 2.0 predicate syntax on the generic collection types, it's still pretty a pretty verbose process that often splits code into multiple code sections. LINQ instead provides a more concise and dynamic mechanism for re-querying and reshaping data. I have no doubt it will take some time to get used to the power that LINQ offers languages like C# and Visual Basic, but I bet it will end up making a big change in the way that developers write applications.

For example, think of simply querying a list of objects (List<Customer> in this case) for a query condition like this:

var CustQuery =
    from in Customers
    where c.Entered >
       DateTime.Now.AddDays(-1) &&
        c.Company.Contains("Wind")
    select new { c.Name, c.Company, 
       Date =  c.Entered };

LINQ queries are actually just the definition of the actual query. Nothing actually executes the query to retrieve the data until the data is selected or otherwise accessed. Internally LINQ uses a .Select() extension method on a collection to cause the data to be retrieved and served.

The actual result is a dynamically typed IEnumerable List<AnonymousType> through which you can simple run through with foreach:

foreach (var in CustQuery) 

   Response.Write(c.Company + " - " + 
                  c.Name + " - " + 
                  c.Date.ToString() + 
                  " <hr>");
}

Microsoft has made the LINQ syntax a lot more compact than similar procedural code and, to me at least, easier to understand just looking at that code block. What takes a bit of getting used to is just how many things you can actually apply LINQ to as it works with just about any kind of list.

If you look at the small bit of code above you see quite a few new features of the C# language (Visual Basic has most of these same features), which may seem a little unnerving. In order for LINQ to work, Microsoft needed to make a number of modifications to the language compilers and the core runtime. These features that make LINQ work require language features that rely on type inference and the ability to easily shortcut certain verbose language statements like object initialization and delegate-based expression evaluation. Here's a quick run through of some of the more important language-related features in C# that are related to LINQ but useful in their own right.

Anonymous Types and Implicit Typing

Anonymous types are types that are created without explicitly specifying each one of the member types attached to it. They are basically a shortcut for object creation in which the compiler figures out the type of the specified member based on the value assigned to it.

This is a crucial feature of LINQ which uses it to construct dynamic result types based on the query's result fields that are chosen. You construct anonymous types like this:

var Person = new 
    Name = "Rick Strahl", 
    Company = "West Wind", 
    Entered = DateTime.Now 
};

The var type is an anonymous type that is compiler-generated and has local method scope. The type has no effective name and can't be constructed directly, but it is returned only as the result of this anonymous type declaration. The type is generated at compile time, not at runtime, so it acts just like any other type with the difference that it's not visible outside of the local method scope.

Var types are most commonly used with objects, but they can also be used with simple types like int, bool, string etc. You can use a var type in any scenario where the compiler can infer the type:

var name = "Ken Dooit";

Here the compiler creates a string object and any reference to name is treated as string.

By itself this feature sounds like a bad idea-after all, strong typing and compiler safety is a feature of .NET languages that most of us take for granted. But it's important to understand that behind the scenes the compiler still creates strongly typed objects simply by inferring the type based on the values assigned or parameters expected by a method call or assignment.

I doubt I would ever use this feature with normal types in a method, but it really becomes useful when passing objects as parameters-you can imagine many situations where you create classes merely as message containers in order to pass them to other methods. Anonymous types allow you to simply declare the type inline which makes the code easier to write and more expressive to read.

This is important for LINQ which can return results from a query as a var result and often needs to create types and result values dynamically based on the inputs specified. With LINQ, a query result is var IEnumerable<A> where A is the anonymous type. The type works as if it were a normal .NET type and Visual Studio 2008 is smart enough to even provide you IntelliSense for the object inference. So you can have code like the following (assuming Customer is a previously defined class):

List<Customer> Customers = new 
List<Customer>();
Customers.Add(new Customer { 
Name="Rick Strahl", 
     Company = "West Wind", 
     Entered = 
     DateTime.Now.
     AddDays(-5) } ); 
Customers.Add(new 
Customer { Name = 
   "Markus Egger", 
   Company = "EPS", 
     Entered = DateTime.Now });
… add more here

var CustQuery =  from in Customers
                where c.Entered > 
                      DateTime.
                      Now.AddDays(-1)
                 select new { c.Name, 
                      c.Company, 
                      Date = 
                      c.Entered };

foreach (var in CustQuery) 

    Response.Write (c.Company + " - " 
    + c.Name + 
    " - " + c.Date.ToString() + " 
    <hr>");
}

You'll notice the var result, which is an IEnumerable of an anonymous type that has Name, Company, and Entered properties. The compiler knows this and fixes up the code accordingly, so referencing c.Company resolves to the anonymous type's Company field which is a string.

It's important to understand one serious limitation of this technology: Anonymous types are limited to local method scope, meaning that you can't pass the type out of the method and expect to get full typing semantics provided outside of the local method that declared the var. Once out of the local method scope, a var result becomes equivalent to an object result with access to any of the dynamic properties available only through Reflection. This makes dynamic LINQ results a little less useful, but thankfully you can also run results into existing objects. So you could potentially rewrite the above query like this:

IEnumerable<Customer> CustQuery = 
        from  in Customers
        where  c.Entered > 
               DateTime.Now .
               AddDays(-1) && 
               c.Company.
               Contains("Wind") 
        select new Customer { 
               Name= c.Name, 
               Company=c.Company };

Notice that the select clause writes into a new Customer object rather than generating an anonymous type. In this case you end up with a strong reference to a Customer object and IEnumerable of Customer. This works because the constructor is essentially assigning the values that the new object should take and you end up essentially mapping properties from one type of object to another. So if you have a Person class that also has a Name and Company field, but no Address or Entered field, you can select new Person() and get the Name and Company fields filled.

IEnumerable<Person> CustQuery = 
        from in  Customers
        where  c.Entered > 
          DateTime.Now.AddDays (-1) &&
               c.Company.Contains(
               "Wind") 
        select new Person { 
        Name=c.Name, 
        Company=c.Company  };

You can then pass values returned with this sort of strong typing out of methods because they are just standard .NET classes.

Object Initializers

In the last queries above, I used object initialization syntax to assign the name and company in the Person class. Notice that I could simply assign any property value inside of the curly brackets. It's a declarative single statement way of initializing an object without requiring a slew of constructors to support each combination of property assignment parameters. In the code above the object is initialized with the values of the object that is currently being iterated-c or a Customer instance in this case.

This is a great shortcut feature that makes for more compact code, but it's also crucial to get the compact syntax required in LINQ to make property assignments work in the select portion of a LINQ query. Object initializers, in combination with an anonymous type, effectively allow you create a new type inline of your code, which is very useful in many coding situations.

Extension Methods

Extension methods allow extension of existing in-memory objects through static methods that have a specific syntax. Here's an extension method that extends the string with an IsUpper function in C#:

public static class StringExtensions
{
    public static bool IsUpper(
       this string s)
    {
        return s.ToUpper() == s; 
    }
}

This syntax assigns the extension method to a string object by way of the implicit this parameter and the type of the first parameter. The first parameter is implicit and it's always an instance of the type specified in the first parameter. To use the IsUpper function on the any string instance you have to ensure that the namespace is visible in the current code and, if it is, you can use the extension method like this:

string s = "Hello World";
bool Result = s.IsUpper();

The extension method is scoped to the string class by way of the first parameter, which is always passed to an extension method implicitly. The C# syntax is a little funky and Visual Basic uses an <Extension()> attribute to provide the same functionality. Arguably I find the Visual Basic version more explicit and natural-that doesn't happen often.

Behind the scenes, the compiler turns the extension method into a simple static method call that passes this-the current instance of the class-as the first parameter. Because the methods are static and the instance is passed as a parameter you only have access to public class members.

This seems like a great tool to add behaviors to existing classes without updating the existing classes. You can even extend sealed classes in this way, which opens a few new avenues of extension.

Lambda Expressions

Lambda expressions (http://preview.tinyurl.com/37n9ll) are a syntactic shortcut for anonymous method declarations, and they are what make LINQ filtering and sorting work. In the LINQ code I showed above, I used expressive syntax, which is actually parsed by the compiler and turned into lower level object syntax that chains together the various statement clauses into a single long expression.

One of the sections of a LINQ query deals with the expression parsing for the where clause (or more precisely the .where() and .sort() methods). So this code:

IEnumerable<Customer>  custs1= 
    from in  Customers
    where c.Entered > 
       DateTime.Now.AddDays(-1) 
    select c;

is really equivalent to:

IEnumerable<Customer> custs1 = 
    Customers.Where( c => c.Entered >
    DateTime.Now.AddDays(-1));

which is also equivalent to:

IEnumerable<Customer> custs2 = 
                    Customers.Where(
  delegate(Customer c) 
                    {  return 
c.Entered > 
   DateTime.Now.AddDays(-1); });

So you can think of a lambda expression as a shortcut to an anonymous method call where the left-most section is the parameter name (the type of which is inferred). Lambda expressions can be simple expressions as above, or full code blocks which are wrapped in block delimiters ({ } in C#).

Behind the scenes, the compiler generates code to hook up the delegate and calls it as part of the enumeration sequence that runs through the data to filter and rearrange it.

Lambda expressions can be presented as delegates which is the functional aspect and deals with how they actually get executed. However, you can also assign them as an Expression<Func<>> object which makes it possible to parse the LINQ expression. This low-level feature can be used to implement custom LINQ providers that can do things like LINQ to SQL and LINQ to XML. These technologies take the inbound expressions and translate them into parsing completely separate data stores like a SQL database (in which case the LINQ is translated into SQL statements) or LINQ to XML (in which case XPATH and XmlDocument operations are used to retrieve the data).

It's a very powerful feature to say the least, but probably one that's not going to be used much at the application level. Lambda expressions are going to be primarily of interest for framework builders who want to interface with special kinds of data stores or custom generated interfaces. There are already custom interfaces springing up such a LINQ provider for LDAP ( http://www.tinyurl.com/3e5bqv) and nHibernate (http://www.tinyurl.com/2udq9a).

LINQ and SQL

One of the major aspects of LINQ is its ability to access database data using this same LINQ-based syntax. Using SQL syntax natively, as opposed to SQL strings coupled with the inferred typing and IntelliSense support that LINQ provides, makes it easier to retrieve data from a database. It also helps reduce errors by providing type checking for database fields to some degree.

LINQ to SQL

You can use LINQ with a database in a couple of ways. The first tool, LINQ to SQL, provides a simplified entity mapping toolset. LINQ to SQL lets you map a database to entities using a new LINQ to SQL designer that imports the schema of the database and creates classes and relationships to build a simple object representation of the database. The mapping is primarily done by class attributes that map entity fields to table fields, and child objects via foreign keys and relations.

Visual Studio 2008 will ship with a LINQ to SQL designer that lets you quickly select an entire database or individual tables and lets you graphically import and map your database.

By default the entire database is imported and the mappings are one to one where each table gets to be a class and each field a property. Relationships are mapped as child collections or properties depending on whether it's 1 to 1 or 1 to many. You can also choose to import either an entire database or selected tables from the database.

Once the mapping's been done, the schema is available for querying using standard LINQ syntax against the object types that the mapper creates. The objects are created as partial classes that can be extended and these entity classes are used as the schema that enforces the type safety in the query code.

LINQ to SQL is a great tool for providing a very quick CRUD access layer for a database to provide for simple insert/update/delete functionality using entity objects. It also provides for the strong typing in LINQ queries against the database which means better type safety and the ability to discover what database tables and fields are available right in your code. LINQ to SQL works through a DataContext object, which is a simplified OR manager object. You can also use this object to create new object instances and add them to the database or load and update individual items for CRUD data access. Since CRUD data access often amounts to a large part of an application, this is a very useful addition.

To me, LINQ to SQL is a big improvement over a strongly-typed dataset (if you are using them). It provides much of the functionality that a strongly-typed dataset provides in a more lightweight package and more intuitive manipulation format.

But there's probably not enough here to make pure Object Relational Mapper diehards happy. The attribute-based model and the nature of the current generator that doesn't do non-destructive database refreshes for entities are somewhat limiting, but still it's a great tool to quickly generate a data layer and address the 60-80% of data access scenarios that deal with CRUD operations.

ADO.NET Entity Framework - LINQ to Entities

For those more diehard ORM folks, Microsoft is also working on a more complete object relational framework called ADO.NET Entity Framework (http://www.tinyurl.com/2jbxo2). The Entity framework sports a more complete mapping layer that is based on XML map files. Several map files are used for the physical and logical schema and a mapping layer that relates the two. The Entity framework also integrates more tightly with ADO.NET using familiar ADO.NET objects such as EntityConnection, EntityCommand, and EntityReader to access data. You can query Entity framework data in a number of ways including using LINQ as well as a custom language called Entity Sql, which is a T-SQL-like language for retrieving object data. I'm not quite clear on why you'd need yet another query language beyond raw SQL and beyond the LINQ mapping to confuse the lines even more but it seems to me that LINQ would be the preferred mechanism to query data and retrieve it. The Entity framework also utilizes a data context that LINQ can use for database access so Entity framework objects are directly supported through LINQ.

The Entity Framework provides more control over the object relational mapping process, but it's also a bit more work to set up and work with. Microsoft will ship the framework with Orcas but it appears that rich design-time support will not arrive until sometime after Orcas is released. Currently there's a one-time wizard that you can run to create your schemas and mapping layers but after that you have to manually resort to managing the three XML files that provide the entity mapping. It'll be interesting to keep an eye on the toolset and see how it stacks up against solutions like nHibernate.

Major Visual Studio Changes

Finally, let's not forget Visual Studio 2008 for the Orcas release cycle. I am happy to see that this version of Visual Studio is not a complete overhaul of the entire environment. Microsoft will add many new features, but the way that projects work will basically stay the same. Visual Studio 2008 also uses the same add-in model as previous versions so most of your favorite plug-ins, templates, and IntelliSense scripts should continue to work in Visual Studio 2008.

Nevertheless there are also some major changes under the hood for ASP.NET.

New Html Editor

I don't think I know anybody who actually likes the ASP.NET HTML designer in Visual Studio 2005. It's slow as hell and has a number of issues with control rendering. For me it's become so much of a problem that I rarely use the designer for anything more than getting controls onto a page. I then spend the rest of my time using markup for page design. It's not that I don't want to use a visual designer, but it's tough when the designer is so slow and unpredictable.

Visual Studio 2008 introduces a brand spanking new designer based on the designer used in Expression Web. Microsoft completely redesigned the editor and, more importantly, they didn't base it on the slow and buggy HTML edit control. The new editor provides a host of new features including a much more productive split pane view that lets you see both markup and WYSIWYG displays at the same time in real time. You can switch between the panes instantly for editing and see the changes in both and there's no hesitation when moving between them. The editor's rendering appears to be more accurate than the old one and maybe-even more important-the editor is considerably faster at loading even complex pages. Considerably faster! Even complex pages that contain master pages and many controls render in less than a second as opposed to 10+ seconds in Visual Studio 2005. Further, because you have split view that shows both design time and markup, you rarely need to switch view modes.

The property sheet now also works in markup view when your cursor is hovering over a control, which also makes markup view more usable. Microsoft added this feature in Visual Studio 2005 SP1 and it didn't work reliably there, but it works perfectly in Visual Studio 2008 including the ability to get to the event list from markup.

There's also much deeper support for CSS, which starts with the editor giving you a list of all styles available from all inline styles and external style sheets. The list shows a preview of each style. A CSS properties page also lets you examine which CSS classes are applied to a given HTML or control element and lets you then quickly browse through the styles to see which attributes apply and are overridden. The CSS tools are a little overwhelming because they live on three different windows and have several options to give different views. It takes a little experimenting to figure out all that is available and which of the windows you actually want to use, but it's well worth the effort.

Improved JavaScript

One highly anticipated feature of Visual Studio 2008 is the improved JavaScript support. With the advent of AJAX, developers will write a lot more JavaScript code in the context of ASP.NET applications and Visual Studio 2008 provides a number of new editor features that will help the minimal JavaScript that Visual Studio has supported.

Visual Studio 2008 provides improved IntelliSense support. Visual Studio supported IntelliSsense for JavaScript prior to Visual Studio 2008 but it is extremely limited-it basically worked for a few known document objects with some static and incomplete member lists. Visual Studio 2008's support for JavaScript is a more dynamic and can understand JavaScript functions defined in the page or in external JavaScript files that are referenced either via the <script src> tag or by using an ASP.NET AJAX ScriptManager control to add the scripts. JavaScript (.js) files can reference other scripts by using special syntax at the top of the .js file to reference another .js source file.

While the JavaScript IntelliSense works well enough with local functions and reasonably well with the ASP.NET AJAX libraries that are documented and follow the exact ASP.NET AJAX guidelines, I've had no luck at all getting the new IntelliSense features to work with other libraries. For example, opening Prototype.js as a related .js file on a page results in no IntelliSense whatsoever on Prototype's functionality. None of the classes, or even static functions, show up in IntelliSense. It appears that Visual Studio 2008's IntelliSense only follows the exact guidelines that ASP.NET AJAX requires for class definitions in order to show up in IntelliSense. I sincerely hope that some of these issues get addressed because as it stands currently in Beta 1, the new IntelliSense features in Visual Studio 2008 don't help me at all with my JavaScript development.

I'm also disappointed that Visual Studio still does not offer support for some sort of JavaScript function/class browsing utility. I frequently look at rather large JavaScript library files and there's just no good way to browse through the content short of raw text view and using Find. A class/function browser that shows all functions or better yet objects and members (which is more difficult) would certainly make navigating a large library file much easier. No such luck.

On a more positive note, Microsoft directly integrated JavaScript into the ASP.NET debugging process. You can now set breakpoints in JavaScript code in the IDE without having to sprinkle debugger; keywords throughout your code. Running the project will now automatically respect your JavaScript breakpoints in HTML, ASPX pages, and any .js files that are part of the project. The Locals and Watch windows also provide more useful and organized information on objects with class members sorted by type (methods and fields). The debugging experience is seamless so you can debug both client- and server-side code in a single session. This is a great improvement for JavaScript debugging and has made me go back to using Visual Studio script debugging recently. While I won't throw out my copy of FireBug just yet, I find that for logic debugging the experience is much smoother when directly integrated in Visual Studio 2008.

Multi-Targeting

I want to mention one Visual Studio feature that is not specific to ASP.NET but it's one of the more prominent features that I think will make the transition to Visual Studio 2008 much easier. Visual Studio 2008 supports targeting multiple versions of the .NET Runtime so you're not tied to a particular version. You can create projects for .NET 2.0, 3.0, and 3.5, and when you choose one of these project types Visual Studio will automatically add the appropriate runtime libraries to your project. You can also easily switch between versions so you can migrate a Visual Studio 2005 project to Visual Studio 2008 with .NET 2.0, work on that for a while, and then at a later point in time decide to upgrade to .NET 3.5.

This should make it much easier to take advantage of many of the new features of Visual Studio-the new editor and the JavaScript improvements for example-even if you continue to build plain .NET 2.0 applications for some time to come.

Closing Thoughts

I've been running Visual Studio 2008 Beta 1 since Microsoft released it in February and I find its overall performance and stability pleasantly surprising. Yes there are parts that are a little unstable, but unlike previous .NET and VS.NET betas, the Visual Studio 2008 beta feels decidedly solid; Visual Studio 2008 is not only usable, but more usable in many ways than Visual Studio 2005. Visual Studio 2008 as a whole feels snappier. The new HTML and markup editor alone is worth the trouble. While Visual Studio 2008 Beta 1 still has some issues, most are minor and outright crashes very rare-in fact, I haven't crashed Visual Studio 2008 any more than I crash Visual Studio 2005. Even many of the new designers, such as LINQ to SQL Entity designer, work well at this point.

I'm excited about many features in Visual Studio 2008 and although, so far, this release of .NET 3.5 and Visual Studio 2008 has not received the same hype that Visual Studio 2005 received (thankfully), I think this release is turning out to be solid and it brings many new practical features to the framework-as well as improved tools support all in a way that isn't overwhelming. Personally I prefer this more moderate update approach and so far it's working out great in that I can use the new technology today with my .NET 2.0 projects while at the same time being able to experiment with the new features for .NET 3.5.

As of the beginning of July I'm still using Beta 1 of .NET 3.5 and Visual Studio 2008. Microsoft has hinted that Beta 2 is on its way before the end of the month and there's likely to be a go-live license included so you can start thinking about using .NET 3.5 and getting some code out on the Web for real if you choose. Final release has just been announced for February 27th of 2008 with release to manufacturing expected at the end of this year. Given the relative stability of the features and functionality it looks like all of this might actually happen on time too. I'm often critical of the way things are pushed out of the Microsoft marketing machine, but I think this time around Microsoft has struck a good balance and rolled things out at a pace that's actually works well. Right on!