advertisement
javaboutique
Search Tips
Articles  |   Tutorials  |   Reviews  |   Tools  |   by Category  |   by Date  |   by Name  |   Submit  |   Source  |   Forums  |  
javaboutique
Browse DevX


Partners & Affiliates











advertisement

gb2



/* gb2.java

 *

 * Version 2.0

 * Copyright(C) 1996 by Bill Giel

 *

 * E-mail: rvdi@usa.nai.net

 * WWW: http://www.nai.net/~rvdi/home.htm

 *

 ***************************************************************************

 * Abstract

 * --------

 * A simple SMTP mail sender with a guest book interface.

 *

 * Version 2.0a adds preferredSize and minimumSize Methods to logoPanel class

 *

 ***************************************************************************

 * THE AUTHOR MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY

 * OF THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED

 * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A

 * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. THE AUTHOR SHALL NOT BE LIABLE

 * FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR

 * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.

 ***************************************************************************/



/* Documentation addendum from Version 1

 *

 * NOTE: TO RECEIVE GUEST BOOK ENTRIES, YOU MUST SPECIFY YOUR E-MAIL

 *       ADDRESS AS THE 'RECEIVER' PARAMETER IN THE APPLETS HTML TAG.

 *

 *       YOUR LOCAL HOST MUST SUPPORT SMTP MESSAGES ON PORT 25

 *

 *

 * ADDENDUM TO DOCUMENTATION (7 Feb 1996) - Some of you have been

 * unable to get your guestbook applets to work on your own home

 * pages, while others have been successful.

 *

 * If you have a chance to study the code of the mailMessage method

 * of  the 'send' class, you'll see that guestbook first establishes

 * a socket with the 'mailhost' at port 25, in accordance with

 * TCP/SMTP specs (see RFC 821).

 *

 * Then, guestbook waits for the 220 'service ready' message transmission

 * over the socket. After successfully receiving 220, it then obtains the

 * 'helohost' domain name from the server and transmits the HELO <domain>

 * command over the socket. If accepted, the receiver-SMTP returns a 250

 * (OK) reply.

 *

 * Following that , guestbook sends MAIL FROM: <sender>, then  RECPT TO:

 * <receiver>, expecting 250 replies after each. Note that in guestbook,

 * the sender and receiver addresses are the same.

 *

 * It then sends the DATA command, and expects 354 intermediate reply from

 * the SMTP server. All that follows DATA is the standard text message in

 * the format defined in RFC 822, with a standard 'Subject:' field, followed

 * by a blank line. What follows the blank line is the actual text (your guest's

 * optional name, optional email address and comments or suggestions.)

 *

 * After the message is transmitted, guestbook transmits a single '\r\n . \r\n',

 * signifying end of message, waits for a 250 (OK) reply, then transmits a final

 * QUIT command, and anticipates receipt of 221, indicating the server is closing

 * the SMTP channel.

 *

 * The mailMessage method then closes the socket before returning true, only if

 * all of the above were successful. mailMessage returns false on any errors, or

 * if the receiver parameter is null.

 *

 * Guestbook should work just fine on your homepage, so long as your www host

 * supports the above SMTP protocol. You may otherwise have to experiment

 * to get guestbook to work with custom settings. That could actually be

 * fun... but since guestbook works as-is on my www server, I have no need

 * to mess with it :-(

 *

 * Please let me know if you manage to get guestbook working by revising it

 * for conditions other than those it is designed for.

 *

 * I hope this additional information is helpful.

 * ----------------------------------------------------------------------------

 * smtpSend class built up from code demonstated in sendmail.java

 * by Godmar Back, University of Utah, Computer Systems Lab, 1996

 * (a simple applet that sends you mail when your page is accessed)

 * ----------------------------------------------------------------------------

 */



import java.applet.*;

import java.awt.*;

import java.io.*;

import java.net.*;

import java.util.*;



class smtpSend

{

    static final short PORT = 25;



    String 		lastline;

    DataInputStream in;

    PrintStream p;



    String mailhost, receiver,  sender;

    TextArea scroller = null;

    Socket socket = null;



    smtpSend( String mailhost, String receiver)

    {

   		this.mailhost = mailhost;

   		this.receiver = receiver;

   		this.sender   = receiver;

    }



    public void setScroller(TextArea scroller)

    {

        this.scroller = scroller;

    }



	void expect(String expected, String errorMsg)

	    throws Exception

    {

		lastline = in.readLine();



        if (!lastline.startsWith(expected))

            throw new Exception("Error: " + errorMsg + " (Expected " + expected + ")");



		while (lastline.startsWith(expected + "-"))

		    lastline = in.readLine();

    }



    private void scrollOK()

    {

        scroller.appendText("OK");

    }





    private void openSocket()

        throws Exception

    {



        display("Connecting to " + mailhost + "...");



        try{

             socket = new Socket(mailhost, PORT);

        } catch (Exception e){

            throw new Exception("Socket Error: Can't connect!");

        }

        scrollOK();

    }



    private void openInputStream()

        throws Exception

    {

        display("Opening input stream" + "...");

        try{

            in = new DataInputStream(socket.getInputStream());

        }catch (Exception e){

            throw new Exception("Connection Error: Cannot open for input.");

        }

        scrollOK();

    }



    private PrintStream openOutputStream()

        throws Exception

    {



        display("Opening output stream" + "...");

        try{

            p = new PrintStream(socket.getOutputStream());

        }catch (Exception e){

            throw new Exception("Connection Error: Cannot open for output.");

        }

        scrollOK();

        return p;

    }



    private String getHeloHost()

        throws Exception

    {

        String helohost;



        display("Getting Local Host Name" + "...");

        try{

            helohost = InetAddress.getLocalHost().toString();

        }catch (Exception e){

            throw new Exception("Network Error: Unknown Local Host.");

        }

        scrollOK();

        display("Local Host: " + helohost + "\r\n");

        return helohost;

    }



    private void display(String string)

    {

        if (null != scroller)

            scroller.appendText("\r\n" + string);



        System.out.println(string);

    }



    private void sendData(String subject, String message)

        throws Exception

    {

        try{

	    	String helohost = getHeloHost();



	    	p.print("HELO " + helohost + "\r\n");

	    	expect("250", "HELO");



	   	    int pos;

	   	    String hello = "Hello ";

	   	    if ((pos = lastline.indexOf(hello)) != -1) {

	   		    helohost = lastline.substring(pos + hello.length());

	   		    helohost = helohost.substring(0, helohost.indexOf(' '));

		    }



		    p.print("MAIL FROM: " + sender + "\r\n");

		    expect("250", "MAIL FROM:");



	    	p.print("RCPT TO: " + receiver + "\r\n");

		    expect("250", "RCPT TO:");



		    p.print("DATA\r\n");

	    	expect("354", "DATA");



		    p.print("Subject: " + subject);

			p.print(" (" + helohost + ")");



	    	p.print("\r\n\r\n");



	    	DataInputStream is = new DataInputStream(new StringBufferInputStream(message));

		    while (is.available() > 0) {

				String ln = is.readLine();

				if (ln.equals("."))

			    ln = "..";

		    	p.println(ln);

		    }



		    p.print(new Date().toGMTString());



            p.print("\r\n.\r\n");

            expect("250", "end of data");



	    	p.print("QUIT\r\n");

		    expect("221", "QUIT");



		}catch(Exception e){

		    throw e;

		}

	}



    public void mailMessage(String subject,String message)

        throws Exception

    {



	    if(null==receiver)throw new Exception("Parameter Error: No RECEIVER");



        try{

         	openSocket();

	    	openOutputStream();

	    	openInputStream();



	    	expect("220", "No greeting");



	    	display("Sending message via SMTP...");

	    	sendData(subject,message);



		} catch(Exception e){

		    throw e;

		}finally{

		    try {

	    		    if(socket != null)socket.close();

	    	} catch(Exception e){}

    	}



    	scrollOK();

    	display("Message Sent - Thank You!");

    	display("Press 'Quit' to close this window.");

    }



}



class logoPanel extends Canvas

{

    Image image   = null;

    boolean threeD;



    int iWidth, iHeight;



    logoPanel(Image image, boolean threeD)

    {

        this.image = image;

        this.threeD = threeD;

        if(null != image){

            iWidth=image.getWidth(this);

            iHeight=image.getHeight(this);

        }

        else{

            iWidth=400;

            iHeight=100;

        }



        if(threeD)

            resize(iWidth+4,iHeight+4);

        else

            resize(iWidth,iHeight);

    }



    public void paint(Graphics g)

    {

        int x,y;

        g.setColor(Color.lightGray);

        if(threeD){

            x=y=2;

            g.fill3DRect(0,0,size().width,size().height,false);

        }

        else{

            x=y=0;

            g.fillRect(0,0,size().width,size().height);

        }



        if(null != image)

            g.drawImage(image,x,y,this);

    }



    public Dimension minimumSize()

    {

        if(threeD)

            return(new Dimension(iWidth+4,iHeight+4));

        else

            return(new Dimension(iWidth,iHeight));

    }



    public Dimension preferredSize()

    {

        return this.minimumSize();

    }





}





class gbFrame extends tFrame

{

    static final String COPYRIGHT = "Guestbook II Copyright (C) 1996 by Bill Giel";



    TextField tf1,tf2;

    TextArea ta1, ta2;

    tButton sendButton;

    smtpSend smtp;



    gbFrame(String title, smtpSend smtp, Image image, boolean threeD)

    {



        super(title);



        this.smtp=smtp;



        setFont(new Font("System",Font.PLAIN,14));



        GridBagLayout gridbag=new GridBagLayout();

       	GridBagConstraints c=new GridBagConstraints();

       	setLayout(gridbag);



        if(null != image){

            c.insets=new Insets(5,5,8,5);

            c.weightx=1;c.weighty=1;

            c.fill=GridBagConstraints.NONE;

            c.gridwidth=GridBagConstraints.REMAINDER;

            logoPanel lp=new logoPanel(image, threeD);

       	    gridbag.setConstraints(lp,c);

       	    add(lp);



       	}



        c.weightx=1;c.weighty=1;

        c.insets=new Insets(3,5,0,0);

        c.gridwidth=1;

        c.fill=GridBagConstraints.NONE;

        c.anchor=GridBagConstraints.EAST;

        Label label = new Label(" Your Name (optional): ");

        gridbag.setConstraints(label,c);

       	add(label);



        c.insets=new Insets(3,0,0,5);

        c.fill=GridBagConstraints.NONE;

        c.anchor=GridBagConstraints.WEST;

        c.gridwidth=GridBagConstraints.REMAINDER;

        tf1=new TextField("",32);

       	gridbag.setConstraints(tf1,c);

       	add(tf1);



        c.insets=new Insets(3,5,0,0);

        c.gridwidth=1;

        c.fill=GridBagConstraints.NONE;

        c.anchor=GridBagConstraints.EAST;

        label = new Label(" Your Email (optional): ");

        gridbag.setConstraints(label,c);

       	add(label);



        c.insets=new Insets(3,0,0,5);

        c.gridwidth=GridBagConstraints.REMAINDER;

        c.fill=GridBagConstraints.NONE;

        c.anchor=GridBagConstraints.WEST;

        tf2=new TextField("",32);

       	gridbag.setConstraints(tf2,c);

       	add(tf2);







        c.insets=new Insets(8,5,0,5);

        c.gridwidth=GridBagConstraints.REMAINDER;

        c.fill=GridBagConstraints.NONE;

        c.anchor=GridBagConstraints.CENTER;

        label = new Label(" Any comments or suggestions are welcome! ");

        gridbag.setConstraints(label,c);

       	add(label);



       	c.insets=new Insets(3,5,3,5);

        c.gridwidth=GridBagConstraints.REMAINDER;;

        c.fill=GridBagConstraints.BOTH;

        ta1=new TextArea("",6,66);

       	gridbag.setConstraints(ta1,c);

       	add(ta1);



        c.insets=new Insets(3,5,3,0);

        c.gridwidth=2;

        c.fill=GridBagConstraints.HORIZONTAL;

        sendButton =new tButton("Send");

       	gridbag.setConstraints(sendButton,c);

       	add(sendButton);



        c.insets=new Insets(3,0,3,0);

        tButton b=new tButton("Clear");

       	gridbag.setConstraints(b,c);

       	add(b);



        c.insets=new Insets(3,0,3,5);

       	c.gridwidth=GridBagConstraints.REMAINDER;

        b=new tButton("Quit");

       	gridbag.setConstraints(b,c);

       	add(b);



      	c.insets=new Insets(3,5,3,5);

        c.gridwidth=GridBagConstraints.REMAINDER;;

        c.fill=GridBagConstraints.BOTH;

        ta2=new TextArea("Ready.",3,66);

       	gridbag.setConstraints(ta2,c);

       	add(ta2,false);

       	ta2.setEditable(false);



       	validate();



       	smtp.setScroller(ta2);



       	setBackground(Color.lightGray);



        System.out.println(COPYRIGHT);

    }



    private void clearText()

    {

        tf1.setText("");

        tf2.setText("");

        ta1.setText("");

        ta2.setText("Ready.");

    }









    public void show()

    {

        pack();

        //resize(preferredSize());

        sendButton.enable();

        clearText();

        Dimension screenSize = getToolkit().getScreenSize();

        move((screenSize.width - size().width)/2,

                       (screenSize.height - size().height)/2);

        super.show();

    }





    public boolean action(Event e, Object arg)

    {

        String NOT_SENT = "Message NOT sent.";

        String NO_DATA  = "Nothing to send.";



		if(arg.equals("Quit")){

			hide();

	  		return true;

        }

        else if(arg.equals("Clear")){

            clearText();

            return true;

        }

        else if (arg.equals("Send")){

            if(tf1.getText().length() + tf2.getText().length() + ta1.getText().length() == 0){

        	    ta2.appendText("\r\n" + NO_DATA);

        	    System.out.println(NO_DATA);

        	}

        	else{

        	    sendButton.disable();

	        	String message="Guest: " + tf1.getText() + "\n" +

        			           "Address: " + tf2.getText() + "\n\n" +

        	    		       ta1.getText() ;

                try{

        	        smtp.mailMessage("Guestbook Entry!",message);

                }catch (Exception exception){

                    String errMsg=exception.toString();

                    ta2.appendText("\r\n" + errMsg.substring(errMsg.indexOf(":")+2, errMsg.length()));

                    System.out.println(errMsg.substring(errMsg.indexOf(":")+2, errMsg.length()));

                    ta2.appendText("\r\n" + NOT_SENT);

                    System.out.println(NOT_SENT);

                    sendButton.enable();

                }

           	}

        }

        return false;

    }

}





public class gb2 extends Applet

{

    static final String COPYRIGHT  = "(C) 1996 by W.Giel";

    static final String IMAGE_LOAD = "Loading Images...wait.";

    static final String VERSION    = "Guest Book II v2.0a (4 July 1996)";

    static final String TITLE      = "Guest Book II";

	int width,height;



	tFrame window=null;



	smtpSend smtp = null;



	String szButton;

	String szReceiver;

	String szTitle;



	String szAppletImage;

	String szLogoImage;

	int imageCount = 0;

	imageLoader il=null;

	Image images[];

	boolean threeD;



	Color bgColor;

	Color fgColor;





	Button button;





	public void init()

	{

	    String szColor;



        szReceiver = getParameter("receiver");



		if(null==(szTitle=getParameter("title")))

			szTitle=TITLE;



		if(null==(szButton=getParameter("button")))

			szButton=TITLE;



		if(null==(szColor=getParameter("bgcolor")))

			bgColor=Color.lightGray;

	    else bgColor = parseColorString(szColor);





		if(null==(szColor=getParameter("fgcolor")))

			fgColor=Color.black;

	    else fgColor = parseColorString(szColor);



	    String param=getParameter("3d_logo");

	    if(null != param && Integer.valueOf(param).intValue() > 0)threeD=true;

	    else threeD=false;





	    add (button=new Button(szButton));

		width=size().width; height=size().height;

        button.move((width-button.size().width)/2,

						(width-button.size().width)/2);







		if(null != (szAppletImage = getParameter("applet_image")))imageCount++;

		if(null != (szLogoImage = getParameter("logo_image")))imageCount++;



		if(imageCount > 0){

		    int index=0;

    		String szImage[] = new String[imageCount];

    		if(null != szAppletImage)szImage[index++]=szAppletImage;

    		if(null != szLogoImage)szImage[index]=szLogoImage;

    		il=new imageLoader(this, szImage, imageCount, null);

    		il.start();

    		images=new Image[imageCount];

    	}







 	}





    private Color parseColorString(String colorString)

    {

        if(colorString.length()==6){

            int R = Integer.valueOf(colorString.substring(0,2),16).intValue();

            int G = Integer.valueOf(colorString.substring(2,4),16).intValue();

            int B = Integer.valueOf(colorString.substring(4,6),16).intValue();

            return new Color(R,G,B);

        }

        else return Color.lightGray;

    }





	public void paint(Graphics g)

	{

		Color color=g.getColor();



		FontMetrics fm=g.getFontMetrics();



	    if(il != null){

	        g.drawString(IMAGE_LOAD,(size().width-fm.stringWidth(IMAGE_LOAD))/2,size().height-fm.getMaxDescent()-3);

	        while(null == (images = il.retrieveImages()));

	        il.stop();

	        il=null;

	    }



	    g.setColor(bgColor);

		g.fill3DRect(0,0,size().width,size().height,true);

		g.setColor(fgColor);





	    if(null != szAppletImage && null != images)

			    g.drawImage(images[0], (size().width-images[0].getWidth(this))/2, button.size().height

				    +(size().height-images[0].getHeight(this)-button.size().height)/3,this);







        g.drawString(COPYRIGHT,(size().width-fm.stringWidth(COPYRIGHT))/2,size().height-fm.getMaxDescent()-3);

        g.setColor(color);





	}



    public boolean action(Event evt, Object arg)

    {

		if(arg.equals(szButton)){



		    if (null == smtp)

		        smtp=new smtpSend(getCodeBase().getHost(),szReceiver);

            if(null == window)

                window=new gbFrame(szTitle, smtp, (null != szLogoImage && null != images)? images[imageCount-1] : null, threeD);

            window.show();

			return true;

        }

		else return false;

    }





	///////////////////////////////////////////////////

	//Applet parameters - pretty much self-explanatory

	///////////////////////////////////////////////////

    public String[][] getParameterInfo()

    {

		String[][] info = {

            {"width","int","width of the applet, in pixels"},

            {"height","int","height of the applet, in pixels"},

            {"receiver","string","SMTP 'RCPT TO:' parameter <null>"},

            {"applet_image","string","GIF file to display on applet panel <null>"},

            {"logo_image","string","GIF file to display on message dialog <null>"},

            {"3d_logo","int","Non-zero produces an inletted logo image <0>"},

            {"bgcolor","String","RGB hex triplet for applet panel background <lightGray>"},

            {"fgcolor","String","RGB hex triplet for applet panel foreground <black>"},

            {"title","string","title for popup window <Guest Book II>"},

            {"button","string","Label to appear in applet's button <Guest Book II>"}

        };

        return info;

    }



	/////////////////////////////////////

    //Applet name, author and info lines

    /////////////////////////////////////

    public String getAppletInfo()

    {

        return (	VERSION + " - simulates a guest log\n" +

        			"by E-mailing guest data to page owner, by Bill Giel\n" +

        			"http://www.nai.net/~rvdi/home.htm  or  rvdi@usa.nai.net\n" +

        			"Copyright 1996 by William Giel.");

    }





}






Back to the gb2 applet page.

How to Add Java Applets to Your Site

New on the Java Boutique:

New Review:

Time Management Made Easy with the Quartz Enterprise Job Scheduler
Why not just use the Java timer API? This open source scheduling API boasts simplicity, ease-of-integration, a well-rounded feature set, and it's free!

New Applet:

Reverse Complement
Reverse Complement is a simple applet that converts DNA or RNA sequences into three useful formats.

Elsewhere on internet.com:

WebDeveloper Java
Lots of Java information on webdeveloper.com

WDVL Java
Thorough Java resource at the Web Developer's Virtual Library.

ScriptSearch Java
Hundreds of free Java code files to download.

jGuru: Your View of the Java Universe
Customizable portal with online training, FAQs, regular news updates, and tutorials.

 DevX Skillbuilding from IBM developerWorks
 Avaya DevConnect Center
 Intel Go Parallel Portal
 Internet.com eBook Library
 Microsoft RIA Development Center
 Destination .NET
XML error: not well-formed (invalid token) at line 48
advertisement
Receive Articles via our XML/RSS feed
Receive Articles via our XML/RSS feed

JavaBytes
Internet Cyclone
This powerful, easy-to-use, internet optimizer is for Windows 95, 98, ME, NT, 2000 and XP. It's designed to automatically optimize your Windows settings, boosting your Internet connection up to 200%.

SugarCRM's Latest is 'SaaS in a Box'
Apple Details iPhone-Mac Developer Event
RIM Ups Ante With Mobile Software Push
Novell Readies Silverlight Clone for Linux
Yahoo Pitches The 'Next Generation of Search'
Alfresco's Latest ECM: Prying Open a Sector?
SaaS Tool Offers Custom Database Development
Microsoft’s Automated Agent: Can We Talk?
Borland Finally Sells CodeGear
Red Hat Heads for the JON 2.0

Keeping Up with the Joneses: Windows Mobile 6.1's New Upgrades
Nine Silverlight 2 Features Not to Be Missed
How Does Microsoft Use Team Foundation Server?
OpenSocial: The Power of Social Networks in Your Applications
Managing the Modern Network
Virtual Earth?What's New in the Latest Release
Everything You Need to Know About Your iPhone
PerformancePoint 2007: Installing Planning Server
Create Secure Java Applications Productively, Part 1: Use Rational Application Developer and Data Studio
.NET Building Blocks: Custom User Control Fundamentals

Advertising Info  |   Member Services  |   Contact Us  |   Help  |   Feedback  |   Site Map  |   Network Map  |   About



JupiterOnlineMedia

internet.comearthweb.comDevx.commediabistro.comGraphics.com

Search:

Jupitermedia Corporation has two divisions: Jupiterimages and JupiterOnlineMedia

Jupitermedia Corporate Info


Legal Notices, Licensing, Reprints, & Permissions, Privacy Policy.

Advertise | Newsletters | Tech Jobs | Shopping | E-mail Offers

Solutions
Whitepapers and eBooks
Microsoft Article: Will Hyper-V Make VMware This Decade's Netscape?
Microsoft Article: 7.0, Microsoft's Lucky Version?
Microsoft Article: Hyper-V--The Killer Feature in Windows Server 2008
Avaya Article: How to Feed Data into the Avaya Event Processor
Microsoft Article: Install What You Need with Windows Server 2008
HP eBook: Putting the Green into IT
Whitepaper: HP Integrated Citrix XenServer for HP ProLiant Servers
Intel Go Parallel Portal: Interview with C++ Guru Herb Sutter, Part 1
Intel Go Parallel Portal: Interview with C++ Guru Herb Sutter, Part 2--The Future of Concurrency
Avaya Article: Setting Up a SIP A/S Development Environment
IBM Article: How Cool Is Your Data Center?
Microsoft Article: Managing Virtual Machines with Microsoft System Center
HP eBook: Storage Networking , Part 1
Microsoft Article: Solving Data Center Complexity with Microsoft System Center Configuration Manager 2007
MORE WHITEPAPERS, EBOOKS, AND ARTICLES
Webcasts
Intel Video: Are Multi-core Processors Here to Stay?
On-Demand Webcast: Five Virtualization Trends to Watch
HP Video: Page Cost Calculator
Intel Video: APIs for Parallel Programming
HP Webcast: Storage Is Changing Fast - Be Ready or Be Left Behind
Microsoft Silverlight Video: Creating Fading Controls with Expression Design and Expression Blend 2
MORE WEBCASTS, PODCASTS, AND VIDEOS
Downloads and eKits
Sun Download: Solaris 8 Migration Assistant
Sybase Download: SQL Anywhere Developer Edition
Red Gate Download: SQL Backup Pro and free DBA Best Practices eBook
Red Gate Download: SQL Compare Pro 6
Iron Speed Designer Application Generator
MORE DOWNLOADS, EKITS, AND FREE TRIALS
Tutorials and Demos
How-to-Article: Preparing for Hyper-Threading Technology and Dual Core Technology
eTouch PDF: Conquering the Tyranny of E-Mail and Word Processors
IBM Article: Collaborating in the High-Performance Workplace
HP Demo: StorageWorks EVA4400
Intel Featured Algorhythm: Intel Threading Building Blocks--The Pipeline Class
Microsoft How-to Article: Get Going with Silverlight and Windows Live
MORE TUTORIALS, DEMOS AND STEP-BY-STEP GUIDES