Understanding CODE:NEO
Transcription
Understanding CODE:NEO
Understanding CODE:NEO -1- EXECUTIVE SUMMARY ....................................................................................................... 4 THE FOLLOWING ARE SOME KEY BENEFITS CODE:NEO PROVIDES; ................................ 4 WITH CODE:NEO .......................................................................................................... 4 THE CODE:NEO SOLUTION CAN BE BROKEN INTO SEVERAL MAIN AREAS; ..................... 4 GENERAL OVERVIEW ......................................................................................................... 6 BENEFITS ............................................................................................................................ 7 REDUCES SOFTWARE DEVELOPMENT AND RECONFIGURATION AND COSTS AND SPEEDS TIME-TO-MARKET ........................................................................................................... 7 IMPROVES SITE PERFORMANCE, ENHANCING REVENUE GENERATION AND CUSTOMER SATISFACTION.................................................................................................................. 8 LOWERS INFRASTRUCTURE COSTS ................................................................................... 8 EASILY INTEGRATES WITH EXISTING DEVELOPMENT TOOLS ........................................... 9 LEVERAGES THE POWER OF C/C++.................................................................................. 9 CODE:NEO’S INTEGRATION WITH OTHER TECHNOLOGIES ........................................... 10 SERVER SIDE RESOURCES .............................................................................................. 10 PROVIDES EASY, ONLINE DEVELOPMENT ...................................................................... 11 PROTECTS INTELLECTUAL PROPERTY THROUGH ENHANCED SECURITY ........................ 11 BUSINESS OPPORTUNITY .................................................................................................. 13 BUSINESS CHALLENGES AND OPPORTUNITIES ............................................................... 13 INTERNET CHALLENGES AND OPPORTUNITIES ............................................................... 14 INTELLECTUAL PROPERTY CHALLENGES AND OPPORTUNITIES...................................... 15 CODE:NEO COMPETITIVE ADVANTAGE ...................................................................... 15 TECHNOLOGY ................................................................................................................... 17 OVERVIEW ..................................................................................................................... 17 HOW POWERFUL IS CODE:NEO? THIS POWERFUL;....................................................... 18 HOW SIMPLE IS CODE:NEO? ........................................................................................ 18 CODE:NEO FRAME WORK ........................................................................................... 19 THE CODE:NEO APPLICATION PROGRAMMERS INTERFACE (API)............................... 21 THE CODE:NEO SYSTEM ............................................................................................. 24 SELECTING C++ AS CODE:NEO’S CORE TECHNOLOGY .............................................. 25 CODE:NEO SHARED MEMORY .................................................................................... 26 THE CODE:NEO PROCESS ............................................................................................ 28 CODE:NEO – AN EFFICIENT DEVELOPMENT PROCESS ................................................ 30 WEB-BASED DEVELOPMENT.......................................................................................... 31 THE ADVANTAGE FOR DEVELOPERS .............................................................................. 32 WHAT IS UNIQUE ABOUT CODE:NEO?........................................................................ 32 THE SYSTEM ENVIRONMENT.......................................................................................... 33 THE CODE:NEO LANGUAGE ........................................................................................ 34 FREQUENTLY ASKED QUESTIONS .................................................................................... 36 ARE THEIR ANY SEVERE SHORTCOMINGS OF CODE:NEO?............................................ 36 CAN A NON-PROGRAMMER SCALE FROM BEGINNER TO ENTERPRISE LEVEL USING CODE:NEO?................................................................................................................. 36 DOES JAVA OR ANY OTHER LANGUAGE HAVE A BROADER USAGE BASE THAN C++?...... 36 IS CODE:NEO HARDER TO PROGRAM BECAUSE IT’S BASED ON C++?........................... 37 -2- HOW DO C++ POINTERS ENHANCE SOFTWARE AND HOW DOES IT AFFECT RELIABILITY AND COMPLEXITY?......................................................................................................... 38 IS CODE:NEO A ‘TAG BASED’ LANGUAGE?.................................................................. 40 HOW DOES CODE:NEO EFFECT PROJECT COST COMPARED TO PROGRAMMING IN COLD FUSION, JAVA OR ASP................................................................................................... 40 HOW DOES CODE:NEO PROTECT YOUR INTELLECTUAL PROPERTY? ............................ 41 HOW DOES CODE:NEO’S NEED FOR COMPILATION HELP DEVELOPERS? ....................... 41 CAN CODE:NEO SUPPORT ALL PLATFORMS, DEVICES AND BROWSERS? ...................... 42 DOES CODE:NEO COME WITH AN IDE (INTEGRATED DEVELOPMENT ENVIRONMENT)? ....................................................................................................................................... 42 DOESN’T THE FACT THAT SERVERS ARE LESS EXPENSIVE THAN PROGRAMMERS MEAN THAT WEB EXECUTION SPEED CAN ACHIEVED CHEAPER WITH BUYING MORE SERVERS THAN UTILIZING CODE:NEO? ...................................................................................... 43 HOW DEOS CODE:NEO COMPARE IN NUMBER OF SOURCE CODE LINES OR FILES TO ACCOMPLISH THE SAME TASKS AS JAVA, COLD FUSION OR ASP?.................................. 43 CODE:NEO APPLICATIONS ARE EASY TO DEBUG.......................................................... 44 HOW DOES CODE:NEO HANDLE COMMON INTEGRATION TECHNOLOGIES SUCH AS COM, CORBA, RMI, AND MQ SERIES ETC.? ........................................................................... 45 HOW DOES CODE:NEO HANDLE DATABASE SUPPORT? ................................................ 45 CODE:NEO IS A MATURE DEVELOPMENT ENVIRONMENT. ............................................ 45 BENCHMARKS ................................................................................................................... 47 PARTNERS ......................................................................................................................... 60 SOLUTIONS........................................................................................................................ 63 CODE:NEO CART OVERVIEW ...................................................................................... 63 HOME SEEKERS MTA CALCULATOR ............................................................................. 68 OPTICAL OUTLETS E-COMMERCE SYSTEM WALK THRU ............................................... 71 OPTICAL OUTLETS INTRANET REPORT AND UTILITIES SYSTEM WHITE PAPER ............. 77 BEST SECUIRTY INDUSTRIES CONTACT SYSTEM ............................................................ 96 EMPSTAT ONLINE PROCESSING APPLICATION ............................................................ 98 PENSACOLA REALESTATE PREMEIR LISTING SYSTEM .................................................... 99 MANAGEMENT & ADVISORY TEAM ............................................................................... 100 CONCLUSIONS ................................................................................................................. 102 CONTACT INFORMATION .............................................................................................. 102 -3- Executive Summary CODE:NEO is a system for creating powerful applications. It allows developers to program in the most powerful programming language available, C++, rapidly and efficiently. This allows companies utilizing CODE:NEO to save money, time, and increase revenue. This white paper’s intent is to introduce the reader to CODE:NEO technology, show the benefits CODE:NEO has and to allow a technology professional to have a solid understanding of what CODE:NEO can offer his or her business. The information in this document ranges from very technical to completely business oriented. It also varies in complexity from simple to extremely complex. And is generalized into two main areas, technological overview and business overview. If a specific topic is either to technical or not technical enough it’s likely expressed differently elsewhere. The following are some key benefits CODE:NEO provides; • • • • • • • • Allows C++ programming within HTML Brings C++ Applications to the Web Quickly Provides Libraries For Rapid Web Development Improves Site Performance, Enhancing Revenue Generation and Customer Satisfaction Lowers Infrastructure Costs Provides Easy, Online Development Protects Intellectual Property Through Enhanced Security Easily Integrates with Existing Development Tools With CODE:NEO • • • • Internet applications can run ten times faster than current applications. A company’s existing software is converted to Internet based applications. Potential customers save substantial conversion costs. Availability of programmers for Internet development projects increases. The CODE:NEO solution can be broken into several main areas; Application Server, the CODE:NEO application server is a web server add-on for Apache, IIS or other ISAPI / module compliant web server a shared memory -4- server and set of libraries for executing CODE:NEO applications. This currently runs on Win32 platforms such as 9x,NT, W2K as well as Linux, Solaris and soon FreeBSD/OpenBSD. The Development Tool is software, which assists a developer in creating a CODE:NEO application. These tools include a generator to turn pages, which include HTML and C++ into a specified format C++ file for compilation. These tools include the header files and API documentation as well as tutorials and examples to get the programmer started. The Application is actually the end result product of the development tool. This is the binary code that will actually be executed by the server’s processor natively instead of abstractly as is true of JAVA, ASP, .NET, J2EE, Etc. The benefits over these technologies are speed and power. As CODE:NEO allows programming to be done in C++ you do not have the limits of web languages like ASP, .NET and JAVA. From within a web page you have the power of C++. The application result files are assembled binary protecting the developer’s intellectual property rights. -5- General Overview The C programming language was created in 1971, over thirty years ago. C++, its object-oriented sibling, was released in 1983, and has since become the most powerful programming language available. Despite its prevalence of C++ in highend application development, the C++ language has not been associated with the development of web-based applications. CODE:NEO is a system for creating sophisticated web-enabled applications using both C and C++. Using the patent-pending Rivar CODE:NEO™ Application Server, both C and C++ based applications can be rapidly and efficiently deployed on the Internet. Once built, these applications frequently run over an order of magnitude faster than similar applications built using JSP or ASP. By creating an easy path for C/C++ developers to web-enable their code under both Windows and UNIX, CODE:NEO delivers the following key benefits: • • • • • • • • • Allows C++ programs to be embedded within HTML Allows companies to leverage existing capital investments in C/C++ development resources Brings C++ Applications to the Web quickly Provides libraries for rapid Web development Improves site performance, enhancing revenue generation and customer satisfaction Lowers infrastructure costs Provides easy online development environment Protects intellectual property through enhanced security Easily integrates with existing development tools -6- Benefits Reduces Software Development and Reconfiguration and Costs and Speeds Time-to-Market Many existing backend systems, databases and software applications are written in C++. CODE:NEO, reduces the complexity of programming C++ software applications for the web. CODE:NEO achieves this by seamlessly merging C++ with HTML, minimizing complex conversion processes for porting software applications to the web. Now, businesses can reduce software development costs by using existing C++ programmers to convert, rather than rewrite existing programs, eliminating the need for hiring specialized programmers. Businesses benefit from substantial savings for developing an integrated web presence by reusing existing code, reducing integration costs and increasing the source code longevity. Businesses also reap the rewards of a faster time-to-market. In addition, they can tap the huge, readily available base software written in C++ to easily develop new Internet applications without requiring staff to learn new programming languages for web development. C/C++ developers make up the largest pool of programmers available. C++ is a standard college courses for computer science majors and is recognized as the most common programming language used today. CODE:NEO allows using these existing programmers for web development through CODE:NEO’s ability to combine the power of the C++ programming language within HTML. Software development costs are greatly reduced when companies with CODE:NEO reuse existing code instead of redeveloping. This reused code can come in the form of software already written by the business, or from the thousands of existing libraries already available to the C++ programming language. CODE:NEO can reduce integration costs by allowing software applications already written in C++ to be used directly for web development. Other solutions such as Microsoft .NET, Java or ColdFusion require development budget be spent on both recreation of the user interface and development budget for encapsulation or redevelopment of existing systems. CODE:NEO reduces those development budgets by large margins. The value and longevity of code written for CODE:NEO is much greater than competing technologies because it based on the ISO/ANSI standardized language C++. Other technologies are proprietary and often obsolesced and ultimately unsupported such as Microsoft is doing today. Microsoft’s .NET is resulting in large redevelopment budgets as companies struggle to keep up with the latest change at Redmond. Alternatively developers can choose because of CODE:NEO -7- developing in the C++ programming language which is standardized and supported by many companies and organizations such as Sun Microsystems, Borland, KAI, GNU and others. Because existing backend software applications are not directly compatible with new web application languages, it typically takes a great deal of time and money to rewrite these applications for the Internet. CODE:NEO reduces the costs for bringing applications to the web because its foundation is in C++. Improves Site Performance, Enhancing Revenue Generation and Customer Satisfaction Many users leave a site before a transaction is completed due to performance bottlenecks. CODE:NEO solves this problem of poor site performance and recovers lost revenue by enabling a site to run at least 10 times faster than Cold Fusion, Microsoft .NET or Java. These speed gains improve performance for demanding applications such as transaction processing, interactive form generation, security and authentication procedures, and access to complex databases. CODE:NEO therefore helps eliminate bottlenecks, reduces the chance of overload and site crashes, resulting in a more satisfying user experience for customers when ordering products, filling out a form or querying a database. Lowers Infrastructure Costs CODE:NEO’s fast processing speeds allow a single server to handle many more customers than other solutions. With CODE:NEO, businesses can leverage existing equipment investments and reduce their total cost of ownership for deploying and supporting a web solution. CODE:NEO decreases overhead by reducing the number of servers a company must run to create a web presence with the necessary performance to insure customer satisfaction. Consider a business, which required ten web servers to run their corporate site; with CODE:NEO that site could be reduced to a couple of web server. By reducing the number of web servers, a company reduces hardware costs as well as the labor and material cost for maintaining each web server. This opportunity is inviting to hosting providers, which typically run many servers. This opportunity extends into large application service providers like, AOL, Yahoo, CNET, Ticket Master, etc. Who are faced with the challenges of maintaining massive costly data centers to operate their sites. CODE:NEO increases performance and allows for the addition of new features. -8- Easily Integrates with Existing Development Tools Many developers have tools that they prefer to use. CODE:NEO integrates easily with existing tools and enables developers to program by using their favorite design tool or inserting C/C++ code within Web page content. CODE:NEO can enhance existing Java, Perl, or ASP programs to execute and run at least ten times faster on a web server. This dramatic speed increase translates to a more satisfying end user experience. The client does not have to worry about costly staff retraining, or rewriting tested and stable applications because CODE:NEO can integrate smoothly. Leverages the Power of C/C++ CODE:NEO provides a classical approach to programming, which allows backend and front end systems to be developed and integrated together instead of the time consuming, common front-end to backend approach that web developers use. This classical approach to programming yields higher quality applications, longer source code longevity and thereby increases the value of the developer’s product. Operating systems are written in the C++ programming language; therefore, a software layer does not need to exist between the web application and the operating system. As a result, CODE:NEO can directly call any operating system instead of relying on the application server developer to support the feature that is needed. C++ allows object-oriented design, which decreases development cost, increases code reusability and software quality. C++ is a polymorphism software system. In object oriented software design polymorphism signifying that a single object can behave in many different but related ways, enabling a programmer to program the object once and the reuse it for many purposes. C++ allows pointers, which are objects used to access specific locations in memory. This enables CODE:NEO applications to directly access the computer’s memory, allowing communication with both hardware and software, which is not available in other web development solutions. Because existing backend software applications, systems and databases are written in C++, they are not directly compatible with new web application languages, it typically takes a great deal of time and money to rewrite these -9- applications for the Internet. CODE:NEO reduces the costs for bringing applications to the web because its foundation is in C++. Furthermore, businesses can reduce software development costs by using existing C++ programmers to convert, rather than rewrite existing programs, eliminating the need for hiring specialized programmers. Businesses benefit from substantial savings for developing an integrated web presence by reusing existing code, reducing integration costs and increasing the source code longevity. Businesses also reap the rewards of a faster time-to-market. In addition, they can tap the huge, readily available base software written in C++ to easily develop new Internet applications without requiring staff to learn new programming languages for web development. Other solutions such as Microsoft .NET, Java or ColdFusion require development budget be spent on both recreation of the user interface and development budget for encapsulation or redevelopment of existing systems. C/C++ developers make up the largest pool of programmers available. C++ is a standard college course for computer science majors and is recognized as the most common programming language used today. CODE:NEO allows using these existing programmers for web development through CODE:NEO’s ability to combine the power of the C++ programming language within HTML. CODE:NEO’s Integration with other Technologies CODE:NEO integrates tightly with many other languages and technologies because many options exist for integrating C++. Developers can directly use MQ Series, COM, CORBA, SQL, ODBC and many other technologies. This ability to integrate with other technologies stems from C/C++’s ability to abstract them through object oriented programming, and C/C++’s long programming history which has gained it a large support base in the computing world. Server Side Resources CODE:NEO’s technology enables complex sites to run at least ten times faster than current Internet languages such as Java. This speed increase allows more users per server, and limits the need for expensive, capital-intensive solutions, thereby lessening ownership costs for companies while providing greater functionality to users. CODE:NEO is designed so companies, web developers and programmers can easily and cost-effectively eliminate bottlenecks – both with existing sites and new sites – using software rather than expensive hardware. CODE:NEO’s -10- application server framework reduces site development time and cost, while allowing dramatic performance improvement of existing languages Java, Perl or application service provider websites. CODE:NEO improves interactive sites that cannot benefit from caching technologies. Many users leave a site before a transaction is completed due to performance bottlenecks. CODE:NEO solves this problem of poor site performance and recovers lost revenue by enabling a site to run significantly faster than Cold Fusion, Microsoft .NET or Java. These speed gains improve performance for demanding applications such as transaction processing, interactive form generation, security and authentication procedures, and access to complex databases. CODE:NEO therefore helps eliminate bottlenecks, reduces the chance of overload and site crashes, resulting in a more satisfying user experience for customers when ordering products, filling out a form or querying a database. Rivar’s CODE:NEO can capitalize on the need for need for efficient web solutions by enabling an increase in revenues, a decrease in overhead and on software costs as well as intellectual property protection. This opportunity extends into large application service providers like AOL, Yahoo, CNET, Ticket Master, etc., who are faced with the challenges of maintaining massive costly data centers to operate their sites. CODE:NEO increases performance and allows for the addition of new features. Provides Easy, Online Development Currently, web developers do not have an efficient online mechanism to create web solutions. They must develop the solution on a local machine, outside of the web environment and later migrate the programs to a web server. This dilemma restricts developers from obtaining the advantages of anytime, anywhere access, collaboration, real-time interaction with the web server and reliability when launching a new application or modifying an existing one. CODE:NEO is the only solution to offer online development. This feature minimizes programming problems, time, and costs by providing early diagnostic capabilities. In addition, CODE:NEO provides easier updates and minimizes ongoing support and maintenance requirements. Protects Intellectual Property Through Enhanced Security Software component developers that create programs for the web risk intellectual property theft because they cannot secure their products from reverse engineering before shipping them. With CODE:NEO, companies can distribute their products in a more secure fashion. -11- Software developers program in human readable code called source code. Different technologies take the human readable and understandable code and use it as instructions to run the computer in different ways. With technologies such as Java, ASP and Cold Fusion that source code is left in a state that can be easily read and understood by a software developer’s competitor. As a result, it is difficult for a company to protect its intellectual property (source code) because it is forced to “give it away”. When companies bundle their product with CODE:NEO, the compilation process helps protect the software product from intellectual property theft because CODE:NEO executables are pure binary code. This code is much harder to reverse engineer, and therefore provides better intellectual property security for Web software developers and development companies, insuring that clients return for updates and improvements to their website. By bundling their products with CODE:NEO, software component developers can release development libraries without being afraid of giving away trade secrets because overall site security is enhanced. -12- Business Opportunity Business Challenges and Opportunities As many established businesses move to a multi-channel strategy, the Internet becomes an important source for generating revenue and communicating with customers. Business sites have experienced challenges regarding performance issues, resulting in a frustrated customer base. Typically, web servers are designed to accept a set number of simultaneous users. Exceeding that number can prevent users from accessing all or a portion of a site. This is what occurs, for example, when many users arrive at a website to buy just-released concert tickets. As more customers attempt to access data-rich, dynamic content sites – to order products, fill out a form or query a database – the potential for bottlenecks increases. In the past, businesses have been forced to continuously expand their infrastructure by adding expensive additional hardware (servers) to overcome these performance problems. According to a May 2001 report from the market analysis firm Zona Research, Internet delays represent a lost opportunity of more than $25 billion in potential business, including over $21 billion per year lost when users abandon a Web site because of excessive delays in page downloads and about $4 billion due to transmission errors caused by Internet infrastructure. Businesses are also moving non-commerce related software programs for sales force automation, customer relationship management and other applications to the Internet. Because many existing backend software applications are written in C/C++, they are incompatible with the new web application platforms. It takes a great deal of time and money to rewrite these applications for the Internet, as “web enabling” the software often includes porting the entire code base from C/C++ to another language. For example, to build an e-commerce solution, a website must be integrated existing inventory software and an accounting system. This level of integration is very time consuming, requires expensive highly specialized human capital and extensive software reconfiguration. CODE:NEO quickly integrates with a company's existing hardware and software systems where key applications and data reside, including databases, directories and messaging servers. This allows the reuse of existing application code, leading to more stable web applications at lower development costs. Rivar’s CODE:NEO can capitalize on the need for need for efficient web solutions by enabling an increase in revenues, a decrease overhead and on software costs as well as, intellectual property protection. -13- Internet Challenges and Opportunities As many established business move to a multi-channel strategy, the Internet becomes an important source for generating revenue and communicating with customers. Business sites have experienced challenges regarding performance issues, resulting in a frustrated customer base. Typically, web servers are designed to accept a set number of simultaneous users. Exceeding that number can prevent users from accessing all or a portion of a site. This is what occurs, for example, when many users arrive at a website to buy just-released concert tickets. As more customers attempt to access data-rich, dynamic content sites - to order products, fill out a form or query a database - the potential for bottlenecks increase. In the past, businesses have been forced to continuously expand their infrastructure by adding expensive additional hardware (servers) to overcome these performance problems. According to a May 2001 report from the market analysis firm Zona Research, Internet delays represent a lost opportunity of more than $25 billion in potential business, including over $21 billion per year lost when users abandon a Web site because of excessive delays in page downloads and about $4 billion due to transmission errors caused by Internet infrastructure. Businesses are also moving non-commerce related software programs for sales force automation, customer relationship management and other applications to the Internet. Because many existing backend software applications are written in C/C++, they are incompatible with the new web application platforms. It takes a great deal of time and money to rewrite these applications for the Internet, as “web enabling” the software often includes porting the entire code base from C/C++ to another language. For example, to build an e-commerce solution, a website must be integrated existing inventory software and an accounting system. This level of integration is very time consuming, requires expensive highly specialized human capital and extensive software reconfiguration. Rivar’s CODE:NEO offers business an ideal solution to these costly problems. By speeding up websites without requiring costly reconfiguration, new hardware or specialized personnel, CODE:NEO enables companies to increase revenues, reduce overhead and reduce software development costs. With its foundation based in C++, CODE:NEO providing at least a 10 times speed gains in dynamic web site performance. CODE:NEO quickly integrates with a company's existing hardware and software systems where key applications and data reside, including databases, directories and messaging servers. CODE:NEO allows the reuse of existing application code, leading to more stable web applications at lower development costs. -14- Intellectual Property Challenges and Opportunities Theft of computer code and database information is becoming an increasingly global phenomenon, often pitting large software companies in North America and Europe against slick crime rings and sophisticated hackers in Russia, China, Southeast Asia, Israel and elsewhere. Source code is the basic building block of software--a jealously guarded secret at technology companies, where key assets are intellectual property. According to a study by the American Society for Industrial Security (ASIS) and consulting firm PricewaterhouseCoopers, Fortune 1000 companies sustained losses of more than $45 billion in 1999 from the theft of proprietary information-up from mid-'90s estimates from the FBI that pegged the cost at roughly $24 billion a year. Tech companies reported the majority of those incidents. The average tech firm reported nearly 67 individual attacks. The average theft was pegged at $15 million in lost business. However, software pirates don't need access to source code similar to that stolen from Microsoft; they usually copy the software directly from off-the-shelf products (CNET report Oct. 29, 2000). Rivar’s product, CODE:NEO, helps companies to protect their intellectual property when distributing their products by enhancing security. (See Intellectual property section under benefits). CODE:NEO Competitive Advantage CODE:NEO’s technology enables sites to run at least 10 times faster than current Internet languages such as Java. This speed increase will allow more users per server, and limit the need for expensive, capital-intensive solutions, thereby lessening ownership costs for companies while providing greater functionality to users. CODE: NEO gives a single web server the processing power of ten. It is designed so companies, web developers and programmers can easily and cost-effectively eliminate bottlenecks both with existing sites and new sites –– using software rather than expensive hardware. CODE:NEO’s application server framework reduces site development time and cost, while allowing dramatic performance improvement of existing languages Java, Perl or application service provider websites. CODE:NEO improves interactive sites that cannot benefit from caching technologies. Rivar’s patent pending product, CODE:NEO is a programming environment consisting of a development tool and application server software. C++ or web -15- developers can use the development tool to create dynamic websites for businesses. After the sites are created, CODE:NEO application sever software must be loaded on a web server in order run the site on the Internet. Customers receive the CODE:NEO web development software for free. However, businesses must pay a fee for the application server software, required to run a CODE:NEO enabled website on a web server for Internet access. -16- Technology Overview CODE:NEO represents a significant step forward for the C/C++ developer in terms of ease of use and speed of deployment in the Web services arena. Currently, C/C++ is very rarely the language of choice for developing dynamic web sites, even though the underlying operating system, Web server, and libraries are all themselves usually written in C/C++. This is because it has traditionally been very difficult to write scaleable applications in C/C++ that take advantage of the Web’s inherent distributed nature. Any programmer who developed such an application would typically be forced to develop large libraries of frequently used routines – that is, they would spend as much (or more) time developing the webrelated routines as they would actually developing the application they were building. Additionally, most web servers and applications are not C/C++ friendly – they do not provide the programmer with the support services needed to quickly and efficiently develop in C/C++. However, most companies have a large investment made in C/C++; thus, web enabling applications is difficult and costly, as companies frequently have to port software to another platform, costing time, additional resources, and money. CODE:NEO provides a solution to this problem. By allowing the programmer to directly embed traditional C/C++ code (including library calls and object instantiation) directly into HTML pages, web-enabling an application in C/C++ becomes a very quick and easy task, with a cleaner separation of the presentation layer and the business logic. The CODE:NEO system operates in an analogous way to JSP and Java in that the pages are preprocessed and converted into a machine-readable format before execution. However, unlike JSP and Java, the code is written entirely in C/C++, allowing companies to leverage their existing code bases, saving both time and money. Additionally, as code is often reused from existing and tested libraries, CODE:NEO can allow application development with fewer errors, because less recoding is required in order to web-enable an application. Finally, code can execute over ten times more quickly under CODE:NEO as the code is compiled, not interpreted. To create a CODE:NEO-based web solution, a programmer needs to create instructions for the processor to handle an incoming request. This is accomplished by directly embedding C/C++ code into an HTML page. Once this HTML/C++ page (which we call a Rivet) is translated into pure C++, it may be compiled and linked against developer libraries, third party libraries, system libraries and the CODE:NEO library. Through this linkage CODE:NEO can accomplish significant cost savings by reusing existing software for web development. -17- After this CODE:NEO binary object is created, it can be placed on a CODE:NEOenabled web server. When such a file is requested (for example, by an HTTP GET statement) the web server passes control to CODE:NEO Application Server, which performs the function of interfacing CODE:NEO applications to the web server. This server is offered in two basic forms: as an ISAPI extension for Microsoft IIS (or any other ISAPI compliant server) and as a module for Apache web server. The application server also provides other service functionality, such as logging and debugs systems, in order to aid development and increase product quality. The call to the application server occurs very quickly within the web server. Once execution is within the binary file (known as the “Joint”) the programmer is free to call any C++ or inline assembler instructions they wish, even printf, which will have the effect or printing to the console. If the programmer wishes, he can output data back to the web browser with the simple interface swritef, which uses the familiar ANSI C format string specification. How powerful is CODE:NEO? This powerful; <html><body><%Cn> __asm__ ("pushl %eax"); </Cn%></body></html> That code controls the processor with a single push instruction from the middle of a web page. This means that the programmer can program the execution of his processor an instruction at a time, the most powerful way of all. How simple is CODE:NEO? <html><body><%Cn> for(int x=1;x<11;x++) swritef("%d<br>\n",x); </Cn%></body></html> Counts to ten. If you want to count up to a specific number, replace x<11 with x<atoi(getArgument("count").c_str())+1 standard template library style. If you understand simple C++ you can begin creating powerful interactive C++ websites. With Microsoft Visual Studio you can create projects with our project wizard in seconds. On Linux you can even use tools like KDebug. Or work in familiar VI and makefiles. -18- With CODE:NEO you have the power to create because we have created our tool to supplement existing technology instead of reinventing it. CODE:NEO is a tool that you adds the power of C++ application servers to your arsenal. CODE:NEO Frame Work To program a CODE:NEO web solution, a program needs to create instructions for processor to handle an incoming request. Just like starting a car a list of steps are translated into a language the processor can understand. The developer writes these instructions in the programming language C++ for CODE:NEO. Other techniques exist such as JSP ASP and Java, but with C++ these instructions can be much more exact and are ultimately assembled into processor instructions, whereas those other language require software to read and execute the list of instructions the programmer provides. CODE:NEO accomplishes this through a process called generation which translates HTML pages mixed with C++ as seen above into an assemble program. See the binary object creation flowchart below. -19- Create Start Developers Libraries Source Code .CnSrc Third Party Libraries CODE:NEO Generator System Libaries Developers Native Compiler The Joint is a specification for a DLL or DSO which matches the application server. Joint (C++ File) Visual C++ GNU GCC Borland C++ CODE:NEO Libraries Object CODE Developers Native Linker CODE:NEO Binary Application Object (.CnBin) Goto Exec CODE:NEO Binary Object Creation Flowchart Once the HTML/C++ page, which we call a rivet, is translated into pure C++ it may be compiled and linked against developer libraries, third party libraries, system libraries and the CODE:NEO library. Through this linkage CODE:NEO can accomplish cost savings by reusing existing software for web development. The C programming language was created in 1971, thirty-one years ago. Code written over thirty years ago can still be utilized in CODE:NEO. C++ was released in 1983, twelve years ago and has since taken the role of the most powerful programming language available. So certainly it is clear that C++ can provide a huge base of technology to pull from. One of which is now web technology. After this CODE:NEO binary object is created, it can be placed as a document named. CnBin in the path of a web server. When the file xxxx. CnBin is requested, say with a HTTP GET statement, the web server begins executing code -20- within either a ISAPI extension for Internet Information Server or another ISAPI compatible web server or and Apache Module for Apache. This change in point of execution occurs very quickly within the web server. CODE:NEO creates a request object for this get request. For optimization the request object’s members are lazily initialized to the web server data structures (Lazy initialization is a programming pattern that saves time by only initializing data structures which are requested.). CODE:NEO then maps the xxxxx. CnBin file to a list of cached. CnBins and jumps point of execution into the. CnBins entry point. The CnBin entry point is actually a C++ class called CnJoint. The CnJoint is a C++ specification for a dynamic link library or a dynamic shared object depending on your platform. See the “Application Execution Flowchart”. CODE:NEO Binary Application Object (.CnBin) Apache IIS Orielly Etc.. if .CnBin Web Server Yes CODE:NEO Application Server Web Browser No Do Standard Processing CODE:NEO Application Execution Flowchart Once execution is within the CnJoint the programmer is free to call any C++ or inline assembler instructions they wish, even printf which will have the effect or printing to the console. If the programmer wished he can output data back to the web browser with the simple interface swritef, which uses the familiar ANSI C format string specification. The CODE:NEO Application Programmers Interface (API) The CODE:NEO API is a C++ Object Oriented interface used to access the application server, application requests and responses. The concept underlying the -21- API is to allow a programmer to rapidly carry out actions, which are common to most web applications. Its use can be as simple as the “getArgument” function call used in the previous section to retrieve a URL argument value passed in from a form submission. The CODE:NEO API is designed to enable the rapid deployment of C/C++-based SOAP services and other customized services, which rely on the HTTP transport mechanism to function. Thus, the web-specific code is already developed, allowing the programmer to concentrate on building the particular application at hand. The structure and architecture for CODE:NEO has been built upon of structure of creating an application server framework for new application server to be built. Look at the UML diagram of CnHttpServer and it’s parent objects, you can see the CnServer -> CnHttpServer relationship. In a CODE:NEO joint you will have access to the CnHttpRequest and will be executing as a subclass of CnHttpServer. Implementation of a SOAP, XML-RPC or other HTTP application server implementation would be a new subclass to CnHttpServer. You would name it MySoapImplementation and could create your own requests and responses from executing binary objects written in C++. CODE:NEO is able to execute any CnServer type objects given the correct request and response object pointers. CODE:NEO has an extensive development interface for supporting developers when creating web applications for communicating with the web browser, maintaining cookies and URL arguments, thereby simplifying programmers’ tasks and decreasing development costs. CODE:NEO’s development tools include interfacing to the developers existing C++ compiler, linker and tools. This automates development tasks and allows developers to continue using familiar and functioning tools so that they do not lose development time or have to port or convert existing code to a new system. -22- Example CODE:NEO API Hierarchy -23- The CODE:NEO System RIVET Source Code Web Server Plugin CODE:NEO Application Server Engine 1 6 Binary Joint Executor And Util Services 5 Joint Source Code CODE:NEO Application Technology 2 3 Binary Joint 4 CODE:NEO Developmet Tool Development Interfaces Joint Generator CODE:NEO System Diagram The CODE:NEO product can be logically divided into three different areas: • CODE:NEO Application Server which when installed on a server allows that server to run CODE:NEO applications. • CODE:NEO Application Technology, which is an actual application, developed by a developer using the CODE:NEO system. It is through that application technology being compiled into executable binary objects that CODE:NEO gains it speed and power. -24- • CODE:NEO Development Tool, which assists developers in creating the application technology that the CODE:NEO application server executes. CODE:NEO applications can consist of joints or rivets. CODE:NEO rivets are source code files that integrate C++ and HTML or other markup language. They use tags to denote where the boundary lies between C++ and HTML and the CODE:NEO development tool called the generator converts this file into a CODE:NEO joint. A CODE:NEO joint is a source code file which fits a specification that when compiled it can be executed by the application server. Alternatively, a developer may opt to write joints manually. This system is similar to the relationship Java JSP pages and Java servlets share. The CODE:NEO Application Server performs the function of interfacing the CODE:NEO Applications to the web server. It is offered in two varieties, an ISAPI extension for Microsoft IIS in addition to a module for Apache web server. The application server also provides service functionality such as logging and debug systems, in order to aid development and increase product quality. CODE:NEO has an extensive development interface for supporting developers creating web applications for communicating with the web browser, maintaining cookies, URL arguments, thereby simplifying programmers’ tasks and decreasing development costs. CODE:NEO’s development tools include interfacing to the developers existing C++ compiler, linker and tools. This automates development tasks and allows the developer to continue to use his familiar and functioning tools so that he does not loose development time or have to port or convert his existing code to a new system. Selecting C++ As CODE:NEO’s Core Technology Rivar Technologies selected C++ as CODE:NEO’s core language because it is the most powerful programming language available to developers today. C++ is the fastest language available for several reasons. It compiles into highly optimized native binary code, which requires no interpretation or software abstraction layer to be executed, thereby providing the fastest code that a processor can execute. C++ also creates fast solutions because the syntax of the language allows the developer to be extremely granular with in areas of the program which are highly speed sensitive; this flexible syntax allows both fast execution as well as, flexible utility. Another reason for selecting C++ is that it is commonly used for applications and back end systems. C++ is widely known by programmers and is a prerequisite -25- requirement for most computer engineering courses. Thus, there are a much higher number of developers skilled in these languages than in Java. C++ offers the largest base of pre existing source code available. The C programming language was first available in the 1970s; C++, an object-oriented offshoot of C, became available in 1985. As a result, the platform is both proven and readily supported by a large number of tools. Rivar also selected C++ because of its portability and it standardized syntax. This means that C++ is not a proprietary product and is supported on many platforms. C++’s standardized nature yields higher quality and longer longevity for businesses, very important factors in a rapidly changing world. CODE:NEO Shared Memory In a web server environment http connections themselves are session less. In order to save programming costs CODE:NEO can establish a session and link it to the sessions data stored directly in memory, instead of indirectly through a database. This functionality works cross platform on Windows 2000 and Linux and gives server authors the power to store data structures in memory across many web server connections and processes. CODE:NEO implements and offers developers the use of shared memory. Shared memory refers to sections of memory, which may be shared between processes. This means that one process can write data to a place in memory, and another process, either concurrent or subsequent, can read that data. This functionality offers means by which processes can communicate with one another (IPC: InterProcess Communication), as well as fast, persistent storage of data for a process or thread, which may come in and out of existence. An example of such a process is an HTTP server connected to a particular client. Each time the client makes a request of the server; it is associated with a new server process, which handles the request. In order to establish a 'session' between the client and the server, there must be some persistence of data between the server processes handling the client's requests. This requirement is fulfilled by the use of shared memory. In Code:Neo, a section of shared memory is referred to as a segment. Each segment may consist of one or more blocks, which are simply allocation units that comprise a segment. Blocks are used to define pieces of a segment and determine whether or not they are in use. For example, if a shared memory segment is being used like a heap, some blocks may contain data, while others do not. Mechanisms are provided to track this status, so the developer can acquire, or 'allocate' an unused block within a named segment. Likewise, a block that is no longer needed may be 'freed'. Another use of the block structure of a segment is for sharing. Blocks may be marked as shared or exclusive to allow or prevent read and write -26- operations on them. Shared blocks allow multiple threads and processes to read their data. On the other hand, when a thread requests an exclusive mode on a block, only that thread may read and write to the block until it is released back to shared mode. This prevents simultaneous write operations to the same block of data, while permitting reading on the rest of the segment. Web Server CODE:NEO Application Server Shared Memory CnBin ( Windows or Linux ) CnBin CnBin CnShmSrv Other Executable Using CODE:NEO Shared Memory CnShmMan Shared memory blocks may be virtually any size. The granularity to use is up to the developer. Finer granularity (i.e. - smaller blocks) offers greater control over which parts of the segment data are available, but at a performance cost. At the other end of the spectrum, a segment can consist entirely of one block, which offers no control at all, but requires fewer system resources. Generally speaking, though, the blocks in a multiple-block segment should be sized to align with the data they will contain. For example, if the developer is storing 32-bit integers in a segment, the block size should definitely be a multiple of 4 bytes (32 bits). As there is not likely any need to lock individual integers, something like 16 or 32 byte blocks (4 or 8 integers each) might be suitable in this example. -27- Segment Segment Segment Segment Segment Segment Segment Segment Segment Block Block Block Block Block Block Block Block Block Block Block Block Block Block Block CnShmSrv is a server process that handles allocation, persistence, and freeing of shared memory segments. Allocate and free requests are received by CnShmSrv via named pipes. CnShmMan, the Code:Neo Shared Memory Manager, acts as the client end in the program thread or process. Allocated segments are tracked by the server in the CnShmIndex The CODE:NEO Process C/C++ is the most widely popular programming language being used today, with over 69% more projects currently being worked on than its closest competitor, Java. The CODE:NEO Application Server provides a framework for C/C++ programs to be executed as Web applications. Written using the APIs specifications provided with Apache Server and Microsoft IIS, CODE:NEO directly handles the execution of .CnBin (CODE:NEO Binary) files, which are requested via. HTTP. These binary files are written in C/C++, and have a common interface for execution from the Application Server as DLLs. -28- The following diagram outlines the process by which a CODE:NEO binary file is requested, executed, and then how a response is sent back to the user. -29- CODE:NEO – An Efficient Development Process Rivar Technologies conducted internal proof of concept studies that verified at least a 10:1 or greater performance increase over competing technologies. The Company believes this speed allows more users per server, lessening equipment costs for companies while providing greater functionality to client users. Rivar is in the process of selecting an independent research organization to verify the performance studies. Rivar’s long-term goal is to develop, market and support Internet software products for companies building their businesses on the Web. Rivar anticipates a suite of products that enable customers to rapidly build, deploy, and manage sophisticated e-business Web sites that provide dynamic content, personalized interaction, and secure transactions. Based on open Internet technologies, the Rivar product provides a robust, secure, scalable foundation for building online applications that support online commerce, strengthen customer and partner relationships, publish and personalize content, and automate key business processes. With CODE:NEO: Internet applications run at least ten times faster than current applications. Developers can write Internet applications with C/C++. -30- Existing software can be converted to Internet based applications. Internet development resources increase due to availability of C/C++ programmers. Web-Based Development The Web Development Environment (WDE) is a web application that enables developers to create, modify, and build their own CODE:NEO web applications. Once the WDE is installed on a server, a developer may access it through a webbrowser. The developer can browse, open, and edit files. The developer can also create a WDE project, which is a combination of source files, compile settings, link settings, and so on. If the developer has created a project, the WDE can be used to compile and build the application. The WDE builds CODE:NEO binary executables (CnBins) from C/C++ source files as well as CODE:NEO rivets, which are HTML files with elements that contain C/C++ code. -31- The Advantage for Developers Developers benefit from CODE:NEO due to its added value, its simplicity, and its extensibility. Value is added to developing C/C++ applications for the web by using the CODE:NEO libraries. An application framework has been built so that development efforts are not begun “from the ground up”, but rather with a collection of C++ objects which provide the required facilities of every web application. These would include session handling and cookies, request and response structures, and buffer handling and parsing for GET and POST methods. The simplicity of using CODE:NEO can be understood by looking at its architecture. A main () is provided as the beginning point of execution for their application. This is a standard and is intuitive to C/C++ application developers as a whole. The Standard Template Library (STL) for C++ has been used within the CODE:NEO libraries to add an element of familiarity for programmers accustomed to using STL. Where appropriate, CODE:NEO’s classes either incorporate or inherit from classes provided in the STL. The extensibility of CODE:NEO has no limitations. The current Application Server is being touted as being an HTTP “add-on”, however the capability lies within the core libraries of CODE:NEO to support other application protocols such as XML-RPC or SOAP and middleware like CORBA or COM. CODE:NEO also works as a standalone, native application server for backend processing or fat, client applications. Future releases of CODE:NEO libraries will contain additional functionalities specific to these technologies. What Is Unique About CODE:NEO? The uniqueness of CODE:NEO is that it provides a framework for C/C++ applications to be written for the web. No other existing technology provides the value of C++ libraries that simplify this task. Standards such as ISAPI and CGI fall short of this by only providing a limited interface for further development of framework and support. This leaves the developer to not only build their specific solution, but also with the responsibility of developing additional code to manage HTTP applications. CODE:NEO has taken that requirement and fulfilled it for every C++ developer needing to write his or her code for the web. Rivar Technologies, through its Patent Counsel, Foley & Lardner of Tampa, Florida filed a provisional patent application with the United States Patent Office. Additional filings are expected. -32- The System Environment The following diagrams attempt to illustrate the overall system that CODE:NEO operates within. The web client (y.1), aka web browser (surfer) uses web browser software on his home machine to access web content just as he always has. HTTP encapsulates a request for information and TCP/IP protocol assists with providing transport of the requests to the CODE:NEO application server. The application server (y.2) uses a web server to receive these requests. The web server passes control to the CODE:NEO Application Server engine (x.1), which in turn passes control to the appropriate CODE:NEO ‘RIVET’ (x.2). CODE:NEO Application Server Hardware Archetecture CODE:NEO Application Server Software Archetecture y.1 Web Browser Client Web Client Modem HTTP Protocol TCP/IP Internet HTTP Protocol Web Server Web Server Plugin Method CSU/DSU Router CODE:NEO Application Server Engine x.1 y.2 Web / Application Server CODE:NEO Application Server Rivet x.2 diagram y diagram x -33- Patent for CODE:NEO Application Server Applies To These Block Items The CODE:NEO language As discussed above, CODE:NEO Rivets are source code files that integrate C++ and HTML or some other markup language. They use simple tags to denote where the boundary lies between the C++ and the HTML. When the programmer is ready, the CODE:NEO development tool called the generator converts this file into a CODE:NEO Joint. A CODE:NEO Joint is a source code file which fits a specification that when compiled it can be executed by the application server. Alternatively, a developer may opt to write Joints manually. This system is analogous to the relationship JSP pages and Java servlets share. The basic premise of the CODE:NEO language is that it enables the server side execution of embedded C and C++ calls from within standard HTML pages. For example, the following text is a fully working CODE:NEO page: <html><body><%Cn> for(int x=1;x<11;x++) swritef("%d<br>\n",x); </Cn%></body></html> This sample application simply counts to ten, outputting each integer to the screen. Should you want to count up to a specific number, the program can be easily modified by replacing x<11 with x<atoi(getArgument("count").c_str())+1. Another example is: <html><body><%Cn> __asm__ ("pushl %eax"); </Cn%></body></html> In this example, the code controls the processor with a single push instruction from the middle of a web page. This means that the programmer can program the execution of his processor an instruction at a time, ultimately, the most powerful way of all. This type of granularity is not found in other languages, and represents a powerful and understandable method for leveraging C/C++ development resources in a web environment. If a programmer understands simple C++, with CODE:NEO he can begin creating powerful interactive C++ websites. With Microsoft Visual Studio one can create projects with the CODE:NEO project wizard in seconds. On Linux, programmers can use tools like Kdebug, or use VI and makefiles. In a web server environment HTTP connections themselves are sessionless. In order to save programming costs, CODE:NEO can establish a session and link it to the session’s data stored directly in memory, instead of indirectly through a database. This functionality works cross platform on Windows 2000 and Linux -34- and gives programmers the power to store data structures in memory across many web server connections and processes. -35- Frequently Asked Questions Are their any severe shortcomings of CODE:NEO? There are no barriers to creating the fastest most powerful websites with CODE:NEO. Any perceived shortcomings come from a developers lack of understanding of computer languages or the CODE:NEO product itself. Anyone of any skill level can download and install the CODE:NEO application server and development tools and begin programming web solutions with immediately. Can a non-programmer scale from beginner to enterprise level using CODE:NEO? Individuals who either doesn’t know C++ or HTML will of course have a learning curve to begin to use the CODE:NEO technology. For example books boast being able to teach either C++ or Java in 21 days. In fact the book “Learn C in Three Days ISBN: 155622298X” coupled with the CODE:NEO getting started manual can get you programming CODE:NEO very fast because those things learned can be used directly in a web page very easily. CODE:NEO is a development tool, intended for use by programmers. In general it is anticipated that most CODE:NEO developers will already be C++ programmers as C++ is standard prerequisite for computer science degrees. CODE:NEO can scale easily to enterprise levels because of the inherent power of the C++ programming language. C++ is the most powerful programming language available and has constituted as the backbone of all current common operating systems since it creation in 1983 at Bell Labs. Does Java or any other language have a broader usage base than C++? Consider the fact that the C language was invented in 1969 and enhanced into C++ in 1983 giving C/C++ 33 years worth of development, improvement and experience. -36- All other ‘internet’ languages are far younger and far less developed. In fact any C code developed since the ANSI C standard in 1989 is directly usable in modern C++ compilers. Every common and most uncommon operating system has a C++ compiler for it as well as a host of embedded microcomputers used in everything from washing machines to wristwatches. At this time no data represents any programming language as having a larger base of programmers than C/C++. C/C++ has been chosen at least 2:1 against any other programming language. In fact sourceforge.com statistics as of October 31, 2002 show project language selections as follows; C C++ Java PHP Perl Python Visual Basic Assembly 9199 8615 6799 5157 3957 1938 1044 975 In fact you’ll notice that ASP, Cold Fusion do not even make the top ten in this list. Secondarily C++’s market dominance can easily been seen by search for jobs on dice.com or monster.com and comparing the results of number of jobs specifying C/C++ as a requirement as compared to another language. As of October 2002 at least a 2:1 margin existed compared to any other language requirement for offered positions. Is CODE:NEO harder to program because it’s based on C++? It is true that C++ is a more complicated programming language than some other simpler languages, however the learning curve is similar between the C++ language and other languages such as Java. Even the semantic syntax of Java and C++ are extremely similar. Java syntax is so similar that source code looks almost identical. /* A Java Hello World Console Application */ -37- public class Hello { public static void main (String args[]) { System.out.println ("Hello World!"); } } /* A C++ Hello World Console Application */ int main(int argc, char* argv[]){ printf("Hello World!\n"); } Thou in fact the C code in this example is more simple than the Java code, C++ can be taken by an advanced programmer to extremely complex levels using object oriented features such as templates which are not available within Java. It is this power of C++ which allows programmers at a beginner level to advance to an expert level as knowledge increases is one factor that will allow CODE:NEO programmers to excel over their peers using other technologies. Consider the fact that C++ is based on the simpler language C that does not have an object-oriented paradigm. To learn and use Java even at the simplest (see the ‘class’ definition in the hello world java example) level you must understand Object Oriented Programming whereas we have done our best with CODE:NEO to allow programmers to program CODE:NEO with only a basic knowledge of accessing object oriented objects and no knowledge of object oriented programming architecture. This ‘two layer’ C to C++ architecture makes CODE:NEO even easier to learn and program in some respects as compared to Java. How do C++ pointers enhance software and how does it affect reliability and complexity? Technology does not make software more or less reliable, people do. This basic aspect of C and C++ changes the facilities available to a programmer. Pointers are a common but not required aspect to programming C and C++. The majority of the time pointers are handled invisibly and safely by the compiler, but from time to time a programmer may choose to use pointers for several reasons. • To enhance the execution speed of the program. Having direct access to memory means that the CPU does not have to fix figure out where the data is stored. -38- • To reduce the memory usage of an application by dynamically and deliberately managing and linking memory. • To simplify algorithms by using advanced data structures which most closely link the data at hand. • To integrate to software and hardware, which may only by accessed by memory address and not by the CPU stack or internal registers. In terms of reliability C++ pointers operate your entire operating system day in and day out without fail. By using good C++ programming practice bugs related to pointers are entirely eliminated. However a sloppy programmer is likely to introduce more bugs into a C application when they use pointers than one written in other languages such as Java or Visual Basic which does not allow pointer use at all. However not being able to use pointers completely cripples a language for being able to be as efficient, elegant and simple as one written by a programmer skilled in the use of this extremely powerful tool. When a programmer chooses to use a pointer he/she must consider whether the usage is overall beneficial to the execution of the programmer. Most C++ programmers use pointers almost everyday because the advantages greatly outweigh any complexity. Java removes entirely the pointer paradigm from the programmer therefore removing the need for ‘good programming practices’ related to using pointers. However even a Java programmers can encounter errors in memory access because the virtual machine ultimately has to access memory directly and certain situations can be reached where the virtual machine calculates the wrong memory address to access, thou this situation is extremely uncommon. A pointer is simply an address in memory, or more simply it’s like a street address where the computer remembers information on a short-term basis. The CPU is responsible for insuring that only certain process are able to access these pointer addresses protecting the security of the system. In Java a programmer is not programming directly for the processor they are programming for a ‘virtual’ machine therefore the programmer is given no direct access to memory. The virtual machine is responsible to manage memory in such a way that the real address of storage is masked and protected from the programmer. -39- This is similar to C where you allocate variables from the heap. The programmer has the option to begin to use more complex algorithms such as pointers my allocating memory manually. Where the complexity comes in is that being able to access memory directly means that a programmer could request access to ‘any’ area of memory. If the programmer has programmed the software incorrectly than if he attempted to access memory outside of his permissible process space than a error will be generated or more dangerous is the incorrect memory access within the processes memory space which may lead to undetermined program behavior. Is CODE:NEO a ‘tag based’ language? CODE:NEO is not a tag-based language because tag based programming is restrictive and doesn’t allow for common programming practices. CODE:NEO utilizes tags only to denote the difference between HTML and C++ programming code. Tag based languages produce code, which is hard to maintain, redundant and quite often sloppy or completely un-maintainable. While tag based web languages can be understood simply by amateurs they are frustrating and inefficient to even beginner programmers not to mention they hold back intermediate and expert programmers. How does CODE:NEO effect project cost compared to programming in Cold Fusion, Java or ASP. CODE:NEO development in most cases can reduce or even eliminate development costs. In general C++ is not considered a rapid development language, however the lower long-term costs associated with software maintenance and longevity can easily be seen with the C++ programming language. In addition the ability to use existing C++ code for new web development projects further enhances the overall CODE:NEO value. -40- How does CODE:NEO protect your intellectual property? CODE:NEO not only allows you to use a wider variety of development tools, but it ensures that your code will be able to be run without the need for any single source vendor. In fact CODE:NEO allows application developers to bundle CODE:NEO with their products royalty free so that the end user does not even have to purchase or individually install or configure the application server itself. Whereas technologies such as Cold Fusion, Java and ASP and .Net where the individual end user must purchase a license for the application server individually adding cost and complexity to a developers product. In addition developers can choose from a number of different compilers such as Microsoft Visual C++, Borland C++ or EGCS known as GCC by GNU thereby increasing the longevity of your source code and lowering the By choosing to develop with a product such as .NET or Cold Fusion you lock yourself and your customers into supporting those companies and application servers. How does CODE:NEO’s need for compilation help developers? The need for compilation is one of the driving factors that helped the CODE:NEO development team choose a language and technology such as C++ to base it’s application server on. Compilation protects developers intellectual property because the source code does not have to appear on the web server for execution. Only a single binary file is needed to run a complete web application. Compilation can also help developers maintain customers because the source code is required to make changes to web applications delivered in binary form. This can greatly increase customer retention rate. Compilation also makes it possible for web component development because a developer can deliver binary components and include files, which allow programmers to utilize these binary files for inclusion in their own software without the component developer having to ship source code. Compilation also increases execution speed because at no time does the process have additional processing necessary to execute the binary CODE:NEO object. -41- Can CODE:NEO support all platforms, devices and browsers? Because CODE:NEO applications run from a server, a CODE:NEO application must never be ported to support a new device or browser. It also means that CODE:NEO supports 100% of web browsers immediately, whereas technologies like Macromedia Flash only support browsers who have special software installed such as the Macromedia Flash plugin. In the event that you want to change server platforms C++ has you covered because it is the most widely accepted programming language. C++ compilers exist for more platforms and devices than any other language, again from PC’s to refrigerators to palmtop PC’s. After having completed CODE:NEO for the windows platform the entire application server, development tools, shared memory manager, utility and server libraries where ported to the Linux operating system in less than 40 hours by a single developer. This was possible because C/C++ is extremely standardized and supported on such a huge number of systems and platforms. CODE:NEO current ships for Windows, Linux and Solaris and should work on your BSD derivate with native Linux support. Rivar Technologies, Inc. is eager to port our application server to many other platforms upon request. CODE:NEO was able to be ported to Solaris from Linux in only a few days after being requested by one of our customers. Because of the ease and speed of porting the product to other platforms it is likely that any single port request accompanied with a single license purchased will result in us porting to your platform of choice. Does CODE:NEO come with an IDE (Integrated Development Environment)? Yes, CODE:NEO comes with an IDE called the WDE (web development environment). This environment allows programmers to program CODE:NEO applications without installing any software by using their web browser to log into the server to develop. Unlike Java Servlets, CODE:NEO can also be developed using common IDE’s such as Microsoft Visual Studio, Allaire Dreamweaver, Etc. This ability to develop in many different modes makes CODE:NEO development versatile and powerful. Allowing web developers and graphic artists and C++ coders to all cooperate on programming projects. -42- Doesn’t the fact that servers are less expensive than programmers mean that web execution speed can achieved cheaper with buying more servers than utilizing CODE:NEO? Servers are not less expensive than programmers for several reasons. Servers require people to maintain, run, monitor and repair. Often computers need to be replaced every three years and cost valuable data center space with sophisticated air conditioning, fire suppression, battery backup and power generation. Programmers only need to be paid once to develop an application whereas servers are a very costly reoccurring expense. When was the last time you had to call a programmer at Microsoft to repair your software compared to calling your local hardware technician? Generally speaking servers running web applications cannot be enhanced enough to yield ten times execution speed as microprocessor speeds only increase incrementally. In addition C++ programs have been running for 33 years showing a tremendous longevity as compared to longevity of the hardware systems that it runs on. How deos CODE:NEO compare in number of source code lines or files to accomplish the same tasks as Java, Cold Fusion or ASP? CODE:NEO source code is comparable in number of lines to accomplish the same effort in ASP, Cold Fusion or Java. However CODE:NEO utilizes C++, which inherently generates through the compilation multiple files. This is of great advantage to programmers because this multi file approach is what allows the linking process to integrate programming for which you have the source code to programming for which you do not have the source code. In addition C++ allows for a high level of architectural separation between portions of programming so that a large pool of developers can collaborate on different portions of a project simultaneously without having to share the entire code base. C++ in its entirety is designed to be powerful and flexible. All CODE:NEO applications can either be a single file that the developers maintain or separated -43- into multiple files. Any files, which are required beyond the CODE:NEO .CnSrc file, are automatically generated and can be ignored completely by the developer. Should the developer design enhanced control over the project all files are available for them to alter for complete power over their projects. An excellent example of CODE:NEO programming lines comparison is the CODE:NEO benchmark applications. This benchmark does math, database access, logic, etc. making it a good point of comparison. Platform CODE:NEO Java Servlet ASP Cold Fusion Number Of Lines To Accomplish Benchmark 191* 188 171 148 From this you can see that the lines of code are comparable between all these languages. The variations are mostly layout and comment differences rather than for actually coding reasons. The benchmark codes where not optimized for number of lines or speed, they where programmed to produce output in a similar parallel fashion to make it a fair and comparable test. *In addition the CODE:NEO version of the benchmark implements some additional error handling not implemented in the other languages. Cold Fusion and ASP have fewer lines of code because those solutions have no procedural or object oriented framework, which are the major contributing factors why those languages are harder and more costly to maintain. CODE:NEO applications are easy to debug. CODE:NEO and C++ are easier to debug than Java, ASP or Cold Fusion because so many excellent debugging options exist! • • • Debugging with trace window Debugging with real-time debugger Debugging with logging Each of these options have specific advantages and disadvantages which are outlined in the getting started manual. In addition CODE:NEO’s ability to be debugged is enhanced by the availability of a number of excellent third party products which not only can help to diagnose -44- known bugs but also analyze the code to intercept bugs which have not been detected yet. These types of tools are available for C++ because of the long-term investment that the computer industry has made to C++ overall. How does CODE:NEO handle common integration technologies such as COM, Corba, RMI, and MQ Series Etc.? Attempting to include these technologies would be a waste of time because they all, as well as many others already support C++ and therefore are already supported within CODE:NEO. A third a third party such as Orbix, IBM, Oracle, Sun Microsystems and many others certainly can provide any integration need with C++ compatibility. In fact the majority of software products natively support C++ integration because they are written in C++ already and require no integration layer to be interfaced to within CODE:NEO for the web. How does CODE:NEO handle database support? To many great methods for database connectivity already come with C++ compilers. On the Windows platform ADO, DAO, ODBC are all extremely powerful! On UNIX ODBC and proprietary integration layers already support C/C++ database connectivity. In addition to database connectivity solutions which are based on standards and come already with database products and tremendous number of third party developers provide database connectivity solutions with specific intents such as ease of use, cross platform connectivity and high performance. It is beyond the scope of CODE:NEO to compete with these already successful and powerful connectivity solutions and we recommend to purchase or download the solutions that most closely meets your needs thereby increasing the value of the CODE:NEO solution overall. CODE:NEO is a mature development environment. In terms of the CODE:NEO product itself the product was released three years ago November 12, 2001 making the CODE:NEO, its first release won a Best Of Comdex and adopters have the opportunity to outpace their competitors. -45- CODE:NEO’s popularity is growing and gaining momentum, while Rivar Technologies developers are extending and expanding the products capabilities so that it can be coupled with C++ and whatever future C++ development will have over the next 33 years. However CODE:NEO’s value really stems from the larger user base of millions upon millions of C++ developers and consumers. -46- Benchmarks CODE:NEO is the fastest web application server available today. It derives its speed from the powerful C++ programming language that operating systems are written in. This C++ compiles down to efficient binary objects that execute at least ten times faster that Microsoft Active Server Pages, Microsoft .Net, Java or JSP, ColdFusion and BEA. CODE:NEO also speeds development by allowing C++ developers to reuse existing code for web solutions. According to Wired magazine ‘Internet C++’ is going forward and CODE:NEO can merge C++ and HTML for very rapid development. CODE:NEO developers also can reap the rewards of programming in an objectoriented way, further increasing development speed and reducing the costs of software maintenance. Because the execution speed of a application is so vital to web applications, the following simple benchmark tests where created to verify the academic theory that CODE:NEO was at least ten times faster than other competing technologies. -47- As this figure and the following figures show, the performance gain of using CODE:NEO is quite substantial. The results where verified and tested several ways including the use of Microsoft’s Web Application stress tool. CODE:NEO Benchmark Source Example <%Cn scope="global"> #include <math.h> #include <sqlext.h> // Determine if SQL API call was successful bool SqlFail(short Result) { if (Result == SQL_SUCCESS || Result == SQL_SUCCESS_WITH_INFO) return false; else return true; } </Cn%> <HTML> <HEAD> <TITLE>CODE:NEO Benchmark Test</TITLE> </HEAD> <BODY> <P ALIGN="center"> CODE:NEO Benchmark Test </P> <%Cn> CnString Test; double r, Reps, Stress; LARGE_INTEGER StartTm, EndTm, Res; Test = getArgument("test"); if (Test == "") Test = "all"; Stress = atof(getArgument("stress").c_str()); if (Stress == 0) Stress = 1; QueryPerformanceFrequency(&Res); QueryPerformanceCounter(&StartTm); </Cn%> <P ALIGN="center"> <%Cn> swritef("Test = %s<BR>\n", Test.c_str()); swritef("Stress = %.0f\n", Stress); </Cn%> </P> <%Cn> // MATH TEST if (Test == "all" || Test == "math") { double Result = 0; Reps = 500000 * Stress; for (r=1; r<=Reps; r++) { Result = Result + 1; Result = Result - 2; Result = Result * 3; Result = Result / 4; Result = pow(Result, 2); Result = pow(Result, .33); Result = (int)Result % 10; Result = Result - sin(r); Result = Result + cos(r); Result = Result - tan(r); } </Cn%> <P ALIGN="center"> <B>MATH TEST</B><BR> -48- The server started with a value of zero<BR> and performed the following mathematical computations on that value <%Cn>swritef("%.0f", Reps);</Cn%> times:<BR> ((((Value + 1 - 2) * 3 / 4) ^ 2 ^ .33) % 10) - Sin(i) + Cos(i) - Tan(i) </P> <P ALIGN="center"> The final result was <%Cn>swritef("%f", Result);</Cn%> </P> <%Cn> } // End Math Test // FILE TEST if (Test == "all" || Test == "file") { Reps = 20000 * Stress; CnString String = "The quick red fox jumps over the lazy brown dog. "; String String String String += += += += "The "The "The "The lazy brown dog barks at the sly orange cat. "; sly orange cat chases the little gray mouse. "; little gray mouse eats the round yellow cheese. "; round yellow cheese frightens the quick red fox.\r\n"; FILE* TestFile = fopen("C:\\CnBinTest.txt", "w"); for (r=0; r<=Reps; r++) fputs(String.c_str(), TestFile); fclose(TestFile); TestFile = fopen("C:\\CnBinTest.txt", "r"); for(r=1; r<=Reps*Stress; r++) fgets((char*)String.c_str(), String.length()+1, TestFile); fclose(TestFile); </Cn%> <P ALIGN="center"> <B>FILE TEST</B><BR> The server wrote the following string,<BR> "<I><%Cn scope="inline">swritef("%s", String.c_str());</Cn%></I>"<BR> to a file <%Cn>swritef("%.0f", Reps);</Cn%> times and then read the entire file </P> <%Cn> } // End File Test // DATABASE TEST if (Test == "all" || Test == "db") { Reps = 300 * Stress; long Length; char Buff[16]; void *EnvHnd, *ConHnd, *SqlHnd; CnString SqlStr, ZipCode, Plus4, FrLat, FrLon, ToLat, ToLon; // Connect to database SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &EnvHnd); SQLSetEnvAttr(EnvHnd, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0); SQLAllocHandle(SQL_HANDLE_DBC, EnvHnd, &ConHnd); SQLConnect(ConHnd, (unsigned char*)"HiZip", SQL_NTS, (unsigned char*)"", SQL_NTS, (unsigned char*)"", SQL_NTS); SQLAllocHandle(SQL_HANDLE_STMT, ConHnd, &SqlHnd); for (r=1; r<=Reps; r++) { // Prep query string SqlStr = "SELECT ZIP_CODE, PLUS_4, FROM_LAT, FROM_LONG, TO_LAT, TO_LONG FROM HI WHERE ID="; SqlStr += formatStr("%d", (((int)r - 1) % 96918) + 1); // Run query SQLExecDirect(SqlHnd, (unsigned char*)SqlStr.c_str(), SqlStr.length()); -49- SQLFetch(SqlHnd); SQLGetData(SqlHnd, ZipCode = Buff; SQLGetData(SqlHnd, Plus4 = Buff; SQLGetData(SqlHnd, FrLat = Buff; SQLGetData(SqlHnd, FrLon = Buff; SQLGetData(SqlHnd, ToLat = Buff; SQLGetData(SqlHnd, ToLon = Buff; 1, SQL_C_CHAR, Buff, 16, &Length); 2, SQL_C_CHAR, Buff, 16, &Length); 3, SQL_C_CHAR, Buff, 16, &Length); 4, SQL_C_CHAR, Buff, 16, &Length); 5, SQL_C_CHAR, Buff, 16, &Length); 6, SQL_C_CHAR, Buff, 16, &Length); // Free statement SQLFreeStmt(SqlHnd, SQL_CLOSE); } // Close connection SQLFreeHandle(SQL_HANDLE_STMT, SqlHnd); SQLDisconnect(ConHnd); SQLFreeHandle(SQL_HANDLE_DBC, ConHnd); SQLFreeHandle(SQL_HANDLE_ENV, EnvHnd); </Cn%> <P ALIGN="center"> <B>DATABASE TEST</B><BR> The server retrieved a record from a database of Hawaiian Zip Codes <%Cn>swritef("%.0f", Reps);</Cn%> times </P> <P ALIGN="center"> The final record retrieved was:<BR> <TABLE BORDER="1"> <TR> <TH ROWSPAN="2" ALIGN="center" VALIGN="middle">Zip Code</TH> <TH COLSPAN="2" ALIGN="center">Latitude</TH> <TH COLSPAN="2" ALIGN="center">Longitude</TH> </TR> <TR> <TH ALIGN="center">From</TH> <TH ALIGN="center">To</TH> <TH ALIGN="center">From</TH> <TH ALIGN="center">To</TH> </TR> <TR> <TD><%Cn scope="inline">swritef("%s-%s", ZipCode.c_str(), Plus4.c_str());</Cn%></TD> <TD><%Cn scope="inline">swritef("%s", FrLat.c_str());</Cn%></TD> <TD><%Cn scope="inline">swritef("%s", ToLat.c_str());</Cn%></TD> <TD><%Cn scope="inline">swritef("%s", FrLon.c_str());</Cn%></TD> <TD><%Cn scope="inline">swritef("%s", ToLon.c_str());</Cn%></TD> </TR> </TABLE> </P> <%Cn> } // End Database Test QueryPerformanceCounter(&EndTm); </Cn%> <P ALIGN="center"> The test took <%Cn>swritef("%.3f", (EndTm.QuadPart - StartTm.QuadPart) / (double)Res.QuadPart);</Cn%> seconds to process. </P> </BODY> </HTML> -50- <HTML> <HEAD> <TITLE>ASP Benchmark Test</TITLE> </HEAD> <BODY> <P ALIGN="center"> Active Server Page Benchmark Test </P> <% Dim r, Reps, Stress, Test Dim StartTm, EndTm Test = Request.QueryString("test") If Test = "" Then Test = "all" Stress = Request.QueryString("stress") If Stress = "" Then Stress = 1 StartTm = Timer %> <P ALIGN="center"> Test = <%=Test%><BR> Stress = <%=Stress%> </P> <% ' MATH TEST If Test = "all" Or Test = "math" Then Reps = 500000 * Stress Dim Result Result = 0 For r = 1 To Reps Result = Result + 1 Result = Result - 2 Result = Result * 3 Result = Result / 4 Result = Result ^ 2 Result = Result ^ .33 Result = fix(Result) Mod 10 Result = Result - Sin(r) Result = Result + Cos(r) Result = Result - Tan(r) Next %> <P ALIGN="center"> <B>MATH TEST</B><BR> The server started with a value of zero<BR> and performed the following mathematical computations on that value <%=Reps%> times:<BR> ((((Value + 1 - 2) * 3 / 4) ^ 2 ^ .33) % 10) - Sin(i) + Cos(i) - Tan(i) -51- </P> <P ALIGN="center"> The final result was <%=Result%> </P> <% End If ' Math Test ' FILE TEST If Test = "all" Or Test = "file" Then Reps = 20000 * Stress Dim String, FsObj, TestFile String = "The quick red fox jumps over the lazy brown dog. " & _ "The lazy brown dog barks at the sly orange cat. " & _ "The sly orange cat chases the little gray mouse. " & _ "The little gray mouse eats the round yellow cheese. " & _ "The round yellow cheese frightens the quick red fox." Set FsObj = CreateObject("Scripting.FileSystemObject") Set TestFile = FsObj.CreateTextFile("C:\AspTest.txt", True) For r = 1 To Reps TestFile.WriteLine(String) Next TestFile.Close() Set TestFile = Nothing Set TestFile = FsObj.OpenTextFile("C:\AspTest.txt", 1) For r = 1 To (Reps * Stress) String = TestFile.ReadLine() Next TestFile.Close() Set TestFile = Nothing %> <P ALIGN="center"> <B>FILE TEST</B><BR> The server wrote the following string,<BR> "<I><%=String%></I>"<BR> to a file <%=Reps%> times and then read the entire file </P> <% End If ' File Test ' DATABASE TEST If Test = "all" Or Test = "db" Then Reps = 300 * Stress Dim Conn, Rs Dim SqlStr, ZipCode, Plus4, FrLat, FrLon, ToLat, ToLon ' Connect to database Set Conn = Server.CreateObject("ADODB.Connection") Conn.Open("DSN=HiZip") For r = 1 To Reps ' Prep query string SqlStr = "SELECT ZIP_CODE, PLUS_4, FROM_LAT, FROM_LONG, TO_LAT, TO_LONG FROM HI " & _ "WHERE ID=" & (((r - 1) Mod 96918) + 1) ' Run query Set Rs = Conn.Execute(SqlStr) ZipCode = Rs(0) Plus4 = Rs(1) FrLat = Rs(2) FrLon = Rs(3) ToLat = Rs(4) ToLon = Rs(5) ' Close recordset -52- Rs.close Set Rs = Nothing Next ' Close connection Conn.close Set Conn = Nothing %> <P ALIGN="center"> <B>DATABASE TEST</B><BR> The server retrieved a record from a database of Hawaiian Zip Codes <%=Reps%> times </P> <P ALIGN="center"> The final record retrieved was:<BR> <TABLE BORDER="1"> <TR> <TH ROWSPAN="2" ALIGN="center" VALIGN="middle">Zip Code</TH> <TH COLSPAN="2" ALIGN="center">Latitude</TH> <TH COLSPAN="2" ALIGN="center">Longitude</TH> </TR> <TR> <TH ALIGN="center">From</TH> <TH ALIGN="center">To</TH> <TH ALIGN="center">From</TH> <TH ALIGN="center">To</TH> </TR> <TR> <TD><%=ZipCode%>-<%=Plus4%></TD> <TD><%=FrLat%></TD> <TD><%=ToLat%></TD> <TD><%=FrLon%></TD> <TD><%=ToLon%></TD> </TR> </TABLE> </P> <% End If ' Database Test EndTm = Timer %> <P ALIGN="center"> The test took <%=FormatNumber(EndTm - StartTm, 3)%> seconds to process. </P> </BODY> </HTML> -53- //benchmark.java import import import import import java.io.*; java.sql.*; java.text.*; javax.servlet.*; javax.servlet.http.*; public class Benchmark extends HttpServlet { public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException { PrintWriter output = response.getWriter(); output.print("<HTML>\n"); output.print("<HEAD>\n"); output.print("<TITLE>Java Benchmark Test</TITLE>\n"); output.print("</HEAD>\n\n"); output.print("<BODY>\n"); output.print("<P ALIGN=\"center\">\n"); output.print("Java Benchmark Test\n"); output.print("</P>\n"); double r, Reps, Stress; String Test; long StartTm, EndTm; DecimalFormat MilliFmt = new DecimalFormat(); if (request.getParameter("test") != null) Test = request.getParameter("test"); else Test = "all"; if (request.getParameter("stress") != null) Stress = Double.parseDouble(request.getParameter("stress")); else Stress = 1; MilliFmt.setMinimumFractionDigits(3); MilliFmt.setMaximumFractionDigits(3); StartTm = System.currentTimeMillis(); output.print("<P ALIGN=\"center\">\n"); output.print("Test = " + Test + "<BR>\n"); output.print("Stress = " + Integer.toString((int)Stress) + "\n"); output.print("</P>\n"); // MATH TEST -54- if (Test.equals("all") || Test.equals("math")) { Reps = 100000; double Result; Result = 0; for (r=1; r<=Reps*Stress; r++) { Result = Result + 1; Result = Result - 2; Result = Result * 3; Result = Result / 4; Result = Math.abs(Result); Result = Math.sqrt(Result); Result = Math.pow(Result, 3); Result = (int)Result % 10; Result = Result - Math.sin(r); Result = Result + Math.cos(r); Result = Result - Math.tan(r); } output.print("<P ALIGN=\"center\">\n"); output.print("<B>MATH TEST</B><BR>\n"); output.print("The server started with a value of zero.<BR>\n"); output.print("and performed the following mathematical computations on that value\n"); output.print(Integer.toString((int)Reps * (int)Stress) + "\n"); output.print("times:<BR>\n"); output.print("((((Value + 1 - 2) * 3 / 4) ^ .5 ^ 3) % 10) Sin(i) + Cos(i) - Tan(i)\n"); output.print("</P>\n"); output.print("<P ALIGN=\"center\">\n"); output.print("The final result was\n"); output.print(Result); output.print("</P>\n"); } // End Math Test // FILE TEST if (Test.equals("all") || Test.equals("file")) { Reps = 10000; String Fstring; Object TestFile; Fstring = new String("The quick red fox jumps over the lazy brown dog. "); Fstring = Fstring + "The lazy brown dog barks at the sly orange cat. "; Fstring = Fstring + "The sly orange cat chases the little gray mouse. "; Fstring = Fstring + "The little gray mouse eats the round yellow cheese. "; Fstring = Fstring + "The round yellow cheese frightens the quick red fox.\r\n"; TestFile = new FileWriter("C:\\ClassTest.txt"); ((FileWriter)TestFile).flush(); for (r=1; r<=Reps*Stress; r++) ((FileWriter)TestFile).write(Fstring.toCharArray()); ((FileWriter)TestFile).close(); TestFile = null; TestFile = new FileReader("C:\\ClassTest.txt"); for (r=1; r<=Reps*Stress; r++) ((FileReader)TestFile).read(Fstring.toCharArray(), 0, Fstring.length()); ((FileReader)TestFile).close(); TestFile = null; output.print("<P ALIGN=\"center\">\n"); output.print("<B>FILE TEST</B><BR>\n"); output.print("The server wrote the following string,<BR>\n"); -55- output.print("\"<I>" + Fstring + "</I>\"<BR>\n"); output.print("to a file\n"); output.print(Integer.toString((int)Reps * (int)Stress) + "\n"); } output.print("times and then read the entire file\n"); output.print("</P>\n"); // End File Test // DATABASE TEST if (Test.equals("all") || Test.equals("db")) { Reps = 20; Connection Conn; Statement Stmt; ResultSet Result; String SqlStr, ZipCode="", Plus4="", FrLat="", FrLon="", ToLat="", ToLon=""; try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); for (r=1; r<=Reps*Stress; r++) { // Prep query string SqlStr = "SELECT ZIP_CODE, PLUS_4, FROM_LAT, FROM_LONG, TO_LAT, TO_LONG FROM HI WHERE ID="; SqlStr = SqlStr + Integer.toString((((int)r - 1) % 96918) + 1); // Connect to database and run query Conn = DriverManager.getConnection("jdbc:odbc:HiZip"); Stmt = Conn.createStatement(); Result = Stmt.executeQuery(SqlStr); Result.next(); ZipCode = Result.getString("ZIP_CODE"); Plus4 = Result.getString("PLUS_4"); FrLat = Result.getString("FROM_LAT"); FrLon = Result.getString("FROM_LONG"); ToLat = Result.getString("TO_LAT"); ToLon = Result.getString("TO_LONG"); // Close connection Result.close(); Result = null; Stmt.close(); Stmt = null; Conn.close(); Conn = null; // End for (r) } } catch (ClassNotFoundException CnfEx) {} catch (SQLException SqlEx) {} output.print("<P ALIGN=\"center\">\n"); output.print("<B>DATABASE TEST</B><BR>\n"); output.print("The server retrieved a record from a database of Hawaiian Zip Codes\n"); output.print(Integer.toString((int)Reps * (int)Stress) + "\n"); output.print("times\n"); output.print("</P>\n"); output.print("<P ALIGN=\"center\">\n"); output.print("The final record retrieved was:<BR>\n"); output.print("<TABLE BORDER=\"1\">\n"); output.print("\t<TR>\n"); output.print("\t\t<TH ROWSPAN=\"2\" ALIGN=\"center\" VALIGN=\"middle\">Zip Code</TH>\n"); output.print("\t\t<TH COLSPAN=\"2\" ALIGN=\"center\">Latitude</TH>\n"); output.print("\t\t<TH COLSPAN=\"2\" ALIGN=\"center\">Longitude</TH>\n"); output.print("\t</TR>\n"); output.print("\t<TR>\n"); -56- output.print("\t\t<TH ALIGN=\"center\">From</TH>\n"); output.print("\t\t<TH ALIGN=\"center\">To</TH>\n"); output.print("\t\t<TH ALIGN=\"center\">From</TH>\n"); output.print("\t\t<TH ALIGN=\"center\">To</TH>\n"); output.print("\t</TR>\n"); output.print("\t<TR>\n"); output.print("\t\t<TD>" + ZipCode + "-" + Plus4 + "</TD>\n"); } output.print("\t\t<TD>" + FrLat output.print("\t\t<TD>" + ToLat output.print("\t\t<TD>" + FrLon output.print("\t\t<TD>" + ToLon output.print("\t</TR>\n"); output.print("</TABLE>\n"); output.print("</P>\n"); // End Database Test + + + + "</TD>\n"); "</TD>\n"); "</TD>\n"); "</TD>\n"); EndTm = System.currentTimeMillis(); output.print("<P ALIGN=\"center\">\n"); output.print("The test took\n"); output.print(MilliFmt.format((EndTm - StartTm) / (double)1000.000) + "\n"); output.print("seconds to process.\n"); output.print("</P>\n"); output.print("</BODY>\n"); output.print("</HTML>\n"); } } <HTML> <HEAD> <TITLE>Cold Fusion Benchmark Test</TITLE> </HEAD> <BODY> <P ALIGN="center"> Cold Fusion Benchmark Test </P> <CFSILENT> <CFIF IsDefined("URL.stress")> <CFSET Stress = URL.stress> <CFELSE> <CFSET Stress = 1> </CFIF> <CFIF IsDefined("URL.test")> <CFSET Test = URL.test> <CFELSE> -57- <CFSET Test = "all"> </CFIF> <CFSET StartTm = Now()> </CFSILENT> <P ALIGN="center"> Test = <CFOUTPUT>#Test#</CFOUTPUT><BR> Stress = <CFOUTPUT>#Stress#</CFOUTPUT> </P> <CFIF Test is "all" OR Test is "math"> <CFSILENT> <CFSET Reps = 500000 * #Stress#> <CFSET Result = 0> <CFLOOP INDEX="r" FROM="1" TO="#Reps#"> <CFSET Result = Result + 1> <CFSET Result = Result - 2> <CFSET Result = Result * 3> <CFSET Result = Result / 4> <CFSET Result = Result ^ 2> <CFSET Result = Result ^ 0.33> <CFSET Result = Result MOD 10> <CFSET Result = Result - Sin(r)> <CFSET Result = Result + Cos(r)> <CFSET Result = Result - Tan(r)> </CFLOOP> </CFSILENT> <P ALIGN="center"> <B>MATH TEST</B><BR> The server started with a value of zero.<BR> and performed the following mathematical computations on that value <CFOUTPUT>#Reps#</CFOUTPUT> times:<BR> ((((Value + 1 - 2) * 3 / 4) ^ .5 ^ 3) % 10) - Sin(i) + Cos(i) - Tan(i) </P> <P ALIGN="center"> The final result was <CFOUTPUT>#Result#</CFOUTPUT> </P> </CFIF> <CFIF Test is "all" OR Test is "file"> <CFSILENT> <CFSET Reps = 20000 * #Stress#> <CFSET String = "The quick red fox jumps over the lazy brown dog. "> <CFSET String = #String# & "The lazy brown dog barks at the sly orange cat. "> <CFSET String = #String# & "The sly orange cat chases the little gray mouse. "> <CFSET String = #String# & "The little gray mouse eats the round yellow cheese. "> <CFSET String = #String# & "The round yellow cheese frightens the quick red fox."> <CFFILE ACTION="delete" FILE="C:\CfmTest.txt"> <CFLOOP INDEX="r" FROM="1" TO="#Reps#"> <CFFILE ACTION="append" FILE="C:\CfmTest.txt" OUTPUT="#String#"> </CFLOOP> <CFFILE ACTION="read" FILE="C:\CfmTest.txt" VARIABLE="String2"> </CFSILENT> <P ALIGN="center"> <B>FILE TEST</B><BR> The server wrote the following string,<BR> "<I><CFOUTPUT>#String#</CFOUTPUT></I>"<BR> to a file <CFOUTPUT>#Reps#</CFOUTPUT> times and then read the entire file </P> </CFIF> -58- <CFIF Test is "all" OR Test is "db"> <CFSILENT> <CFSET Reps = 300 * #Stress#> <CFLOOP INDEX="r" FROM="1" TO="#Reps#"> <CFSET Id = ((r - 1) MOD 96918) + 1> <CFQUERY NAME="HiZip" DBTYPE="dynamic" CONNECTSTRING="DSN=HiZip"> SELECT ZIP_CODE, PLUS_4, FROM_LAT, FROM_LONG, TO_LAT, TO_LONG FROM HI WHERE ID=#Id# </CFQUERY> <CFOUTPUT QUERY="HiZip"> <CFSET ZipCode = ZIP_CODE> <CFSET Plus4 = PLUS_4> <CFSET FrLat = FROM_LAT> <CFSET FrLon = FROM_LONG> <CFSET ToLat = TO_LAT> <CFSET ToLon = TO_LONG> </CFOUTPUT> </CFLOOP> </CFSILENT> <P ALIGN="center"> <B>DATABASE TEST</B><BR> The server retrieved a record from a database of Hawaiian Zip Codes <CFOUTPUT>#Reps#</CFOUTPUT> times </P> <P ALIGN="center"> The final record retrieved was:<BR> <TABLE BORDER="1"> <TR> <TH ROWSPAN="2" ALIGN="center" VALIGN="middle">Zip Code</TH> <TH COLSPAN="2" ALIGN="center">Latitude</TH> <TH COLSPAN="2" ALIGN="center">Longitude</TH> </TR> <TR> <TH ALIGN="center">From</TH> <TH ALIGN="center">To</TH> <TH ALIGN="center">From</TH> <TH ALIGN="center">To</TH> </TR> <TR> <CFOUTPUT> <TD>#ZipCode#-#Plus4#</TD> <TD>#FrLat#</TD> <TD>#ToLat#</TD> <TD>#FrLon#</TD> <TD>#ToLon#</TD> </CFOUTPUT> </TR> </TABLE> </P> </CFIF> <CFSET EndTm = Now()> <P ALIGN="center"> The test took <CFOUTPUT>#NumberFormat(DateDiff("s", StartTm, EndTm), '0.000')#</CFOUTPUT> seconds to process. </P> </BODY> </HTML> -59- Partners 21C DIGITAL On the web; www.21cdigital.com 21CDigital is a new media developer who adopted the CODE:NEO technology to gain an edge on the competition. Atavia On the web; www.atavia.com Atavia is a CODE:NEO’s hosting provider. They focus on providing premier hosted solutions to optimize the value to the client. Cenetec On the web; www.cenetec.com Cenetec is a technology incubator in Boca Raton Florida. Deerfield On the web; www.deerfield.com Deerfield acquired the O’Reilly web site server software and is has enhanced it to make it more powerful and dependable. It represents a great alternative commercial web server to the Microsoft IIS web server. -60- Clients Aquamed On the web; www.aquamed.com Vescent On the web; vescent.com Optical Outlets On the web; opticaloutlets.com On the web; www.practas.com 21C DIGITAL On the web; www.21cdigital.com Home Seekers The Mostoller Group -61- Empstat Best Security Industries -62- Solutions CODE:NEO Cart Overview Rivar Contact; Vincent Risalvato, 813-368-1704, vince@rivar.com -63- Executive Summary Purpose The CODE:NEO cart implements a shopping cart for politics products through a direct C++ link to Verisign Credit Card Processing. This cart also supports partner product sales and two levels of integration, direct product integration and online link product integration. It features online product administration and a complete ability to be customized to meet customer needs. It also feature online accounting and automated invoice emails to partners, clients and server administrator. -64- -65- -66- -67- Home Seekers MTA Calculator Rivar Contact; Vincent Risalvato, 813-368-1704, vince@rivar.com -68- Executive Summary Purpose To create a versatile mortgage calculator. -69- -70- Optical Outlets E-Commerce System Walk Thru R1 December 28, 2002 Rivar Contact; Vincent Risalvato, 813-368-1704, vince@rivar.com -71- E-Commerce System Walk Thru New home page now has prominent “Order Contact Button” which now allows existing customers into the E-Commerce system to reorder contacts. Generally clients will reach out to the website to reorder contacts after they have received a postcard in the mail generated by the CODE:NEO recall generator. Optical Outlets will also introduce clients to the website during fitting so that they know they can reorder and in the future an system for new clients will be added to that a prescription can be added then the prescribing doctor called for verification for new clients not seen by and Optical Outlets doctor. -72- After clicking on order contacts user is placed within an information-gathering screen, which asks for a name and phone number to authenticate user. -73- In the event that the customer’s last eye exam has expired an error screen appears. -74- After the patients prescription is verified they are offered the products they have purchased in the past and the system automatically looks up discounts for the products they are offered. -75- The credit card information is then obtained from the user, verified charged and the user and Optical Outlets are sent confirmation emails. -76- Optical Outlets Intranet Report And Utilities System White Paper November 7, 2002 Rivar Contact; Vincent Risalvato, 813-368-1704, vince@rivar.com -77- Reporting System Infrastructure Requirements Optical Outlets is faced with having a computer system, which does not meet its current needs. Those needs included accessibility, accountability and interactivity of enterprise data. They rely upon several software packages based on the FoxPro Database Technology by Microsoft. Optical Outlets had to choose between developing our purchasing a new system or integrating to the current system. It was felt that by integrating to the existing system we could maximize positive effort by not having to retrain or expend the budget to do a complete systems change. We would accomplish the requirements through a phased approach that would eventually obsolete the old FoxPro technology. In general some main requirements where; • • • • • • Web based intranet approach Build using solid foundation of C++ Allows moving directly to extranet Allows integration of many systems Provides rapid development of further systems Ability to relate home office and lab system data -78- Patient History Lookup • • • • • • • • • • • Ability to look up a patient’s record and see it Specify ‘Like’ search which searches first name last name and full name fields plus ability to choose a criteria to narrow by if name is similar to other clients, I.E. phone number, address, SS#, these criteria are to be determined. Displays the patient history and retail history sorted by date (newest entry first) across stores grouped by procedure, with store they visited indicated Ability to look up a patient’s record and obtain rx from the intranet Specify ‘Like’ search which searches first name last name and full name fields Search by patient ID and Store Number (because ID are duplicated between stores) Displays the RX in the system Use algorithm to pull last exam date instead of pulling from database, which is wrong. Group purchases by left and right eyes Add store id to patient header Add right and left to OS / OD (do we need to switch?) Main Screen -79- Intermediate Screen Result Screen -80- Recall Generator • • • • 1. Report runs in a way that you specify which recall to do a. eyeglass exam recalls, b. contact exam recalls, c. contact refills 2. The onscreen results has check boxes for sending recalls, a button to 'check all', the results will not be paginated for print and viewing purposes. 3. Specifiable date range to run this report. a. the amount of time, which has passed since last exam/visit/purchase whatever from a specifiable date which defaults to today... 4. Generation of letters and envelopes. (not required at this time) 5. Ability to modify text used in verbiage. a. Recall process i. click on print postcards and they choose printer.... retrieves file contents of the blurb for that category which is then editable they submit that as is or with changes, if it's changed its saved back to the text file.... and then used for the printing.... the will use tags for dynamic fields.. we will define a small set of these fields for the first run, which can be extended later. b. Options Tags i. salutation ii. date of last doctor visit iii. date of last eye glasses exam iv. date of last contact exam v. date of last contacts purchase vi. store address last seen at vii. store name last seen at viii. store phone number last seen at. 6. Ability to mark that a recall letter has been sent. 7. Ability to resend recall letters that have already been sent. (Check box to override a run on a range already run) 8. Ability to print postcard a. Postcard print button, opens print dialog to print postcards and updated the tracking table... Print functionality to produce recall call list Algorithm to calculate when client runs out of product By vendor and by partial text criteria for description field Add patient history popup -81- Main Screen CODE:NEO Sales Comparison Report CODE:NEO offers incredible power and flexibility in producing web-based programming solutions. This capacity extends to database report generation scenarios. In the example of a Sales Comparison report, CODE:NEO allows the developer to create a database driven report, the output of which the user can sort “on the fly” at the client end of the application. Furthermore, the report will run considerably faster, and with more capability than in any other development technology. In the Sales Comparison report scenario, the client requires sales, receipts, and quantities data from two variable date ranges for all store locations, with percent increase/decrease calculations on each field. The user must be able to sort this -82- data on all fields, without having to re-run the report. In addition, the user must be able to print a business grade copy of the report from the server. The data source is a directory of free tables produced by a FoxPro application on a Win32 platform. The first thing the application must do is gather user input for the variable date ranges. A simple form such as the following satisfies this requirement: The next step in producing this solution is connecting to the data source. ODBC provides a low-overhead method of connecting to FoxPro .DBF files from C++, so this is the method of choice. In Win32 ODBC, a database connection requires an environment handle, and a connection handle. Once these are allocated, the simplest way to connect is via a DSN established with the Data Source Manager. Finally, a statement handle is allocated to support querying the data source. The code to achieve these tasks looks like the following: if (SqlFail(SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &EnvHnd)) || SqlFail(SQLSetEnvAttr(EnvHnd, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0)) || SqlFail(SQLAllocHandle(SQL_HANDLE_DBC, EnvHnd, &ConHnd)) || SqlFail(SQLConnect(ConHnd, (unsigned char*)"OOdata", SQL_NTS, (unsigned char*)"", SQL_NTS, (unsigned char*)"", SQL_NTS)) || SqlFail(SQLAllocHandle(SQL_HANDLE_STMT, ConHnd, &SqlHnd))) { Errors += "Unable to establish database connection<BR>\n"; } In the above example, the ODBC environment has also been set to use ODBC version 3. In addition, a simple function called SqlFail is used to test the return value of each call for success or failure, since a successful call can return either -83- SQL_SUCCESS or SQL_SUCCESS_WITH_INFO, and SQL_NO_DATA can be either a success or a failure, depending on the developer’s definition. As the data resides in multiple tables that do not support inner-joins, the application will have to collate the data internally in order to produce the result. The query is driven by the list of store locations, so the first logical step is to retrieve the number of locations and store details from the stores data file. The number of locations is retrieved with an SQL COUNT function: // Get record count SqlStr = "SELECT COUNT(SID) FROM STORES"; if (SqlFail(SQLExecDirect(SqlHnd, (unsigned char*)SqlStr.c_str(), SqlStr.length())) || SqlFail(SQLFetch(SqlHnd)) || SqlFail(SQLGetData(SqlHnd, 1, SQL_C_SLONG, &Count, 0, &Length))) { Errors += "Failed to retrieve count from STORES table<BR>\n"; GetSqlErr(Errors, SqlHnd); } The application has to manipulate the retrieved data and output it in several ways, which will be explained later, so the data is organized in an array of records. The store data is saved in this array in ascending order by store id. Thus, the store with the lowest id number is at index 0, the next store at index 1, and so on. In order to support client-end sorting, indexes of the data must also be built, so all of the fields are indexed while the report detail data is being collected. The indexes consist of arrays containing the field value to sort by, and the array index of the record. As each new value is added, it is sorted into the array in ascending order, along with the index of the corresponding record from the Records array. Thus, if the fifth record has the lowest Sales Range 1 figure, its index of 4 is stored in the Index array (along with the figure, for continued sorting). Here’s how this is done: // Function to sort a name into an index void IndexName(int Id, CnString& Name, NamIdx* Index, int Total) { for (int i=0; i<Total; i++) { // Find index where new value belongs if (Name.compare(Index[i].Name) < 0) break; } // Bump remaining values down for (int j=Id; j>i; j--) Index[j] = Index[j-1]; // Default to first unused position if value is last if (i == Total) i = Id; } // Add value to array Index[i].Id = Id; Index[i].Name = Name; -84- // Build data storage/index arrays Records = new Record[Count]; NameIdx = new NamIdx[Count]; // Get STORES data SqlStr = "SELECT SID, DMNAME FROM STORES ORDER BY SID"; if (SqlFail(SQLExecDirect(SqlHnd, (unsigned char*)SqlStr.c_str(), SqlStr.length()))) { Errors += "Failed to query STORES table<BR>\n"; GetSqlErr(Errors, SqlHnd); } else { // Bind columns to variables for data retrieval if (SqlFail(SQLBindCol(SqlHnd, 1, SQL_C_SLONG, &Sid, 0, &Length)) || SqlFail(SQLBindCol(SqlHnd, 2, SQL_C_CHAR, &Buff, BuffSz, &Length))) { Errors += "Failed to bind columns on STORES table<BR>\n"; GetSqlErr(Errors, SqlHnd); } } // Iterate through stores, fetching detail data for (i=0; i<Count; i++) { if (SqlFail(SQLFetch(SqlHnd))) break; Records[i].Sid = Sid; Records[i].Name = Buff; IndexName(i, Records[i].Name, NameIdx, Count); } SQLCloseCursor(SqlHnd); SQLFreeStmt(SqlHnd, SQL_UNBIND); // End if (exec STORES data) Next, the application iterates through the array, querying other tables to retrieve detail data in both user-specified date ranges for each store. This is carried out in the same manner as the retrieval of store data, shown above. The required percent changes are calculated, and all the data is stored in the Records array by store id. With this indexing method, presenting the records in ascending order by any particular field only requires iterating through the Index, and retrieving each record from the Records array with the index specified in the Index array. Likewise, iterating backwards through the Index array produces a descending sort on that column. For example, if the Records array looked like this: Array Index Id 0 1 2 3 4 001 002 003 004 005 Store Name Downtown Uptown East Side Smallville Suburbia Range 1 $217.42 $307.70 $266.80 $144.92 $251.73 Sales Range 2 $272.61 $488.75 $297.48 $175.05 $215.24 % Diff 25.38 58.84 3.72 20.79 14.50 -85- Range 1 $154.49 $229.17 $220.88 $118.09 $215.49 Receipts Range 2 $204.28 $359.59 $224.60 $149.70 $174.97 % Diff 32.23 56.91 1.68 26.76 18.80 Range 1 12 16 15 5 9 Qty. Range 2 17 27 15 6 9 % Diff 41.66 68.75 0.00 20.00 0.00 Then the Index of the Sales Range 1 data would look like this: Value $144.92 $217.42 $251.73 $266.80 $307.70 Index 3 0 4 2 1 So, an ascending order sort on Sales Range 1 would present the store records in this order: Smallville, Downtown, Suburbia, East Side, Uptown. At the client end, the values stored in the indices are no longer necessary, as they have already been sorted. This supports making one comprehensive Index for the entire table. In other words, the rows of the Index represent ascending sort order, and the columns represent the columns of the table to sort on. Such an Index for the example table above would look like this: Id 0 1 2 3 4 Store Name 0 4 1 2 3 Range 1 3 0 4 2 1 Sales Range 2 3 4 0 2 1 % Diff 4 2 3 0 1 Range 1 3 0 4 2 1 Receipts Range 2 3 4 0 2 1 % Diff 4 2 3 0 1 Range 1 3 4 0 2 1 Qty. Range 2 3 4 2 0 1 % Diff 4 2 3 0 1 Reading down the column representing the sort field produces an ascending sort, and reading up the column produces a descending sort. Once the data has been retrieved, organized, and indexed, it is saved on the server and sent to the client. The copy on the server is referenced if the client sends back a request for a printed copy. The client receives the Recordset and the comprehensive Index in the form of multidimensional JavaScript arrays, written by the server application. The application also writes a call to a JavaScript function, which will sort and write the output data when the page loads in the client browser. At this point, the processing is handed off to the client, but this client-side part of the solution is only viable because CODE:NEO has performed all of the background work on the server. This is especially true of the indexing process, which would take unacceptable amounts of time to process on the client machine. The client JavaScript function’s job is to generate the HTML output that displays the data passed to it. Each time it runs, it must re-write the page header, which contains the Records and Index arrays, as well as write the table of sorted data in the body. The column headers are written as hyperlinks, each of which call the function again when clicked, passing their column index as a parameter. Inside the function, the Index array is iterated, either forward for an ascending sort, or backwards for a descending sort, with the column index as the array’s second -86- dimension. In programming terms, referencing the example Index above, this would mean SortTable(2), which would be called by clicking the Sales Range 1 column header, would execute the following code: SortTable(ColIndex) { … for (r=0; r<RowCount; r++) { // Iterate through table rows RowIndex = Index[r][ColIndex]; // Get Records index from Index array Document.writeln(“<TR>”); // Start table row for (c=0; c<ColCount; c++) { // Iterate through table columns Document.writeln(“<TD>” + Records[RowIndex][c] + “</TD>”); } // Get column data from Records array, write cell Document.writeln(“</TR>”); // End table row } … } After this function runs, the output might look like this: -87- And clicking on the Sales Range 1 column header would produce this: At the bottom of the displayed table is a “Print” button. When this button is clicked, a custom print dialog box appears in a chromeless browser window, like below. This dialog allows the user to select a printer available to the server, and specify the sort criteria for the printed report. The selected printer is then passed back to the server, along with the index of the column and the sort order (ascending or descending). The server print application begins its process by connecting to the specified printer and establishing a GDI Device Context as follows: // Connect to printer -88- if (OpenPrinter((char*)PrintNm.c_str(), &Printer, 0)) { // Allocate buffer for printer context data GetPrinter(Printer, 2, 0, 0, &NeedSz); Pdata = (PRINTER_INFO_2*)new char[NeedSz]; PdatSz = NeedSz; // Get printer context if (GetPrinter(Printer, 2, (unsigned char*)Pdata, PdatSz, &NeedSz)) { // Set printer mode and job name Pdata->pDevMode->dmOrientation = DMORIENT_LANDSCAPE; Pdata->pDevMode->dmPaperSize = DMPAPER_LETTER; SetPrinter(Printer, 2, (unsigned char*)Pdata, 0); DocInfo.cbSize = sizeof(DocInfo); DocInfo.lpszDocName = ReptId.c_str(); // Get GDI Device Context and begin job PrintDC = CreateDC(Pdata->pDriverName, PrintNm.c_str(), 0, 0); StartDoc(PrintDC, &DocInfo); } } The application then iterates through the saved Index, much the same way the client did. For each record retrieved by its sorted index, the data is printed in a table row, formatted as per the client’s requirements: // Select GDI pen & font SelectObject(PrintDC, ThinPen); SelectObject(PrintDC, Arial); // Get font height & establish rectangle to print in GetTextExtentPoint32(PrintDC, " ", 1, &Size); Rect1.left = Bounds.left; Rect1.top = Rect1.bottom; Rect1.bottom = Rect1.top + (long)(Size.cy * 1.5); // Draw table rows for (i=0; i<Rows; i++) { // Get record index by sort order & column if (Ascend) IdxNum = Index[i][Sort]; else IdxNum = Index[Rows - i - 1][Sort]; // Draw table columns for (n=0; n<Cols; n++) { // Establish justification switch (Fields[n].Just) { case 'L': Format = " " + Records[IdxNum][n]; Position = DT_LEFT | DT_VCENTER | DT_SINGLELINE; break; case 'C': Format = Records[IdxNum][n]; -89- DT_SINGLELINE; Position = DT_CENTER | DT_VCENTER | break; case 'R': Format = Records[IdxNum][n] + " "; Position = DT_RIGHT | DT_VCENTER | DT_SINGLELINE; } // Adjust right edge of bounding rectangle Rect1.right = Rect1.left + ((Bounds.right Bounds.left) * Fields[n].Size / 100); // Draw formatted text and bounding rectangle DrawText(PrintDC, Format.c_str(), Format.length(), &Rect1, Position); Rectangle(PrintDC, Rect1.left, Rect1.top, Rect1.right, Rect1.bottom); } } // Set left edge of rectangle for next field Rect1.left = Rect1.right; // Prep bounding rectangle for next row Rect1.left = Bounds.left; Rect1.top = Rect1.bottom; Rect1.bottom = Rect1.top + (long)(Size.cy * 1.5); This method of printing gives the application complete control of the printed output, including scaling, page breaks, and footer information like page numbering. This is a significant advantage over printing from the client, where the web browser controls these parameters. This solution exemplifies how the power of CODE:NEO can be applied to real world scenarios, and provides unprecedented functionality in an HTTP client/server environment. The server application, written in C++, retrieves and indexes the data many times faster than any other technology could, and CODE:NEO API calls make it easy and convenient for the developer to embed the data in the server response. All together, this solution makes a seamless interface for the user to retrieve data from it’s source, visually sort it, and print a hard copy as if sitting at the server in person using a stand alone application. -90- Vendor Sales Lookup System The vendor sales lookup system implements a very elegant group by system by which we have combined the ability to choose three different levels of grouping which are supported by all criteria. The following example code demonstrates how simple complex tasks can be accomplished using CODE:NEO and C++. Notice our use of the CnString CODE:NEO string template used to simplify the complex usage of strings in CODE:NEO. Being able to use CnString allow rapid development of string manipulation. while (ByClerk || ByStore || ByPrice || ByProd) { // Build query string Select = "SELECT COUNT(*), T.VID, V.VENDOR, P.PRONAME"; Group = " GROUP BY T.VID"; Order = " ORDER BY T.VID"; if (ByClerk) { Select += ", T.TCLERK, E.FIRST, E.LAST"; Group += ", T.TCLERK"; Order += ", T.TCLERK"; } if (ByClerk || ByStore) { Select += ", T.SID"; Group += ", T.SID"; Order += ", T.SID"; } else if (ByPrice) { Group += ", M.PPRICE1"; Order += ", M.PPRICE1 DESC"; } Group += ", P.PRONAME"; Order += ", P.PRONAME"; if (ColorDetail) { Select += ", M.COLOR"; Group += ", M.COLOR"; Order += ", M.COLOR"; } if (SizeDetail) { Select += ", M.SIZE"; Group += ", M.SIZE"; Order += ", M.SIZE"; } if (BaseDetail) { Select += ", M.BCURVE"; Group += ", M.BCURVE"; Order += ", M.BCURVE"; } if (PowerDetail) { Select += ", M.PWR"; Group += ", M.PWR"; Order += ", M.PWR"; -91- } if (PriceDetail || (ByPrice && !ByClerk && !ByStore)) Select += ", M.PPRICE1"; From = " FROM TREAT AS T LEFT OUTER JOIN VENDORS AS V ON T.VID = V.VENDORID"; From += " LEFT OUTER JOIN MPRODUCT AS M ON T.TCODENUM = M.CODENUM"; From += " LEFT OUTER JOIN PRODNAME AS P ON T.TCODENUM = P.CODENUM"; if (ByClerk) From += " LEFT OUTER JOIN EMPLOYEE AS E ON T.TCLERK = E.NUM"; Where = " WHERE T.TCAT "; if (CatFilter == "") Where += "IN (\"F\", \"L\", \"C\", \"M\", \"U\", \"S\", \"P\")"; else Where += formatStr("= \"%s\"", CatFilter.c_str()); if (VidFilter == "") Where += " AND T.VID != \" \""; else Where += formatStr(" AND T.VID IN ( %s )", VidFilter.c_str()); if (Pdesc != "" && Pdesc != " Partial Matches OK") Where += formatStr(" AND P.PRONAME LIKE \"%%%s%%\"", Pdesc.c_str()); if (SidFilter != "000") Where += formatStr(" AND T.SID = \"%s\"", SidFilter.c_str()); if (FrPrice != "") Where += formatStr(" AND M.PPRICE1 >= %s", FrPrice.c_str()); if (ToPrice != "") Where += formatStr(" AND M.PPRICE1 <= %s", ToPrice.c_str()); Where += formatStr(" AND T.TDATE >= { d '%s' } AND T.TDATE <= { d '%s' }", FrDate.c_str(), ToDate.c_str()); SqlStr = Select + From + Where + Group + Order; ... // Run query ... } -92- • • • Vendor sales report grouped by clerkid with date range, Vendor description like clause and vendor drop down(like recall report) storeid selection with all stores option(again like recall report). -93- • • • Excludes credits and refunds and voids. Browser screen output is used for printing and look like the following. Sort products by high quantity Category Selection Criteria Drop Down This option will allow users to select which product category will be processed by the report. The categories are Lens, Misc, Frames, Contact and all categories. Add Price Range Criteria The user will be able to supply the price range for which the report selects. It will consist of two number fields, which specify a value greater than, less than and equal to. Add Group By Price Option This should group the results of the report by prices just like the other three current group criteria store, clerk and product. Enhance the Vendor Selection Criteria To benefit running reports this feature allows the user to select multiple vendors. This is accomplished by presenting a list box with the vendors in it, which allows ‘ctrl’, and ‘shift’ multi select. Frame Description Synchronization Because Optical Outlet imports the frame descriptions on a regular basis, maintaining the description table is problematic. Product table updating was initially discussed but mistakenly answered wrongly. Checkboxes for each; Group By Clerk _X_ Group By Store _X_ Group By Product _X_ Summarize X X X X Detail O O O O Color Size BaseC Power if the user selects to detail any of these then those columns appear in the group by lists --------------------------------------------------------- -94- VENDOR: VISTACON TOTAL: 50 CLERK: 111 STORE 1 2 DESC Acuvue2 Acuvue2 Color? Size? B 1 R 2 TOTAL QTY 6 6 12 CLERK: 112 STORE 1 2 DESC Acuvue2 Acuvue2 Color? Size? B 1 R 2 TOTAL QTY 6 6 12 CLERK: 113 STORE 1 2 DESC Acuvue2 Acuvue2 Color? Size? B 1 R 2 TOTAL QTY 6 6 12 TOTAL QTY 2 5 7 TOTAL QTY 2 5 7 STORE: 1 DESC COLOR Acuvue2 B Acuvue B STORE: 2 DESC COLOR Acuvue2 B Acuvue B Product: Acuvue2 Acuvue SIZE 1 1 SIZE 1 1 Color? Size? Qty: xx xx --------------------------------------------------------VENDOR: Boesch & L TOTAL: xx CLERK: 111 STORE 1 2 DESC OPTIMA FW OPTIMA 38 STORE: 2 DESC OPTIMA OPTIMAFW Product: Optima OptimaFW COLOR B B Color? Size? B 1 R 2 TOTAL QTY 6 6 12 SIZE 1 1 QTY 2 5 Color? Size? Qty: xx xx -95- Best Secuirty Industries Contact System Best Secuirties receives numerous contact submission on the website due to the success of their marketing program. To maintain this and manage those contacts, they wanted an online database management system to handle these contacts. They also knew that this contact management system could be most effectily used by exporting the data to a CSV format for use with the marketing campaign. Features - Login Security – single password - Delete Entry - Edit Entry - Add Entry - View results o Sorting columns by ascending or descending order o Column names included in columns - Output CSV with provided link o Include CSV header row - Auto response and admin response o Admin email contains submission information o Personalized auto response - Capture date upon form submission -96- -97- EMPSTAT Online Processing Application Online background check application. -98- Pensacola Realestate Premeir Listing System -99- Management & Advisory team Vincent Risalvato, CTO, Acting CEO Mr. Risalvato has a strong background in software development and Internet technologies and is the creator of CODE:NEO. Vincent Risalvato is acting CEO and Executive Vice President of the Company as well as Chief Technology Officer. While CIO at Digital Chainsaw he brought their RND Internet hosting environment into full production complete with automation and creating a Web development team. DigitalChainsaw was subsequently sold to a Paul Allen, Vulcan Ventures company. While at Price Waterhouse he created a redirection server that integrated their corporate and subsidiary worldwide Internet web servers and sites in over 50 countries in a seamless and instantaneous manner for their merger with Coopers and Lybrand, July 1st 1998 at GMT 0. Mr. Risalvato's technical expertise was utilized at Vision Twenty-One by building an enterprise health care claims processing center prior to their IPO. Mr. Risalvato has a strong background in software development and Internet technologies and is the inventor of CODE:NEO. He also was co-founder of NetConnect on of the first Intra Tampa Bay internet service providers in the Tampa/Florida area, 1995-1996. Joel E. Rodgers, CFO. Mr. Rodgers served as Vice President and General Manager of Engineered Solvents Systems of Allied Signal and previously was the President of Baron Blakeslee Inc, a $75 MM solvent distribution business. Scott Adams - Advisor The information superhighway intrigues many of us, however, few people have traveled that road as successfully as Cenetec Ventures President and Chief Strategist, Scott H. Adams, an Internet industry icon. In 1995, Mr. Adams founded Hiway Technologies, Inc., and in three short years, as its President and -100- CEO, he built Boca Raton-based Hiway into the world's largest web hosting company with 240 employees and 150,000 accounts in 135 countries. Adams is a participant in the birth of the Internet Coast, whose goal is to unite South Florida's high-tech companies and organizations for recognition as a worldwide Internet industry hub. A firm believer in the promotion of education, Adams launched the Internet Institute at Florida Atlantic University's College of Business which is an initiative aimed at spurring the growth of South Florida's Internet-based industries. Due to his remarkable achievements, the Greater Boca Raton Chamber of Commerce named Mr. Adams their 1997 Small Business Person of the Year and in 1998 Mr. Adams won the prestigious Ernst & Young Florida Entrepreneur of the Year Award. Richard Ford, Ph.D., - Advisor Cenetec Ventures's Chief Technology Officer Dr. Richard Ford is one of the nation's top Internet architecture experts and an internationally acknowledged computer security expert. Ford has lectured worldwide on the subject of computer security, and holds editorial positions for several virus and security related journals. He holds one patent and is widely published in the areas of both computer security and physics. Dr. Ford has served as Director of Research for the National Computer Security Association. He also spent a year at IBM Research's prestigious T.J. Watson Research Center, working in the Massively Distributed Systems group. Before being appointed Chief Technology Officer for Cenetec Ventures, Dr. Ford was the Director of Technology at Verio in Boca Raton. There he served as senior architect for the world's largest web hosting platform and was also responsible for the security of more than 200,000 web sites. Bruce M. Rodgers, Corporate Attorney Mr. Rodgers is corporate attorney practicing with Foley & Lardner. He represents a wide variety of developing companies primarily in technology-based industries. -101- Conclusions CODE:NEO solves many of the problems faced by companies who have a large investment in the C/C++ programming languages. By offering a robust and costeffective C/C++ platform for web-enabled applications, CODE:NEO addresses many of the key constraints in developing a successful web-enablement strategy. Not only does CODE:NEO facilitate the use of C/C++ on the web, but also security (though source code protection), interoperability (through the widespread availability of C/C++ libraries), speed and memory footprint are all improved dramatically. Thus, CODE:NEO has much to offer any company developing webenabled applications. CODE:NEO is available for evaluation online at www.rivar.com. During your evaluation period feel free to call us at 727-461-4555 during business hours. Or via email at support@rivar.com any time. Customers may choose to obtain 24x7 voice support with their purchase. CODE:NEO is available for evaluation online at www.rivar.com. During your evaluation period feel free to call us at 727-461-4555 during business hours. Or via email at support@rivar.com any time. Customers may choose to obtain 24x7 voice support with their purchase. Contact Information RIVAR Technologies, Inc. Telephone (727) 461-4555 Technology and Services - info@rivar.com Careers - hr@rivar.com Investor Relations - invest@rivar.com -102- -103-