<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8931614446266229542</id><updated>2011-11-28T09:10:34.614+08:00</updated><category term='Python'/><category term='SIP'/><category term='voip'/><category term='Vim'/><category term='XML'/><category term='Video Conference'/><category term='Java'/><category term='Linux'/><category term='dotNet'/><category term='C/C++'/><category term='Data Mining'/><title type='text'>kenan</title><subtitle type='html'>A C/C++/Python Programmer's Blog. Information about C/C++, Python, Vim, XML, Linux, etc.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://kenanlee.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://kenanlee.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Nan Li</name><uri>http://www.blogger.com/profile/02756910278237685893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>33</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8931614446266229542.post-2031337954667807110</id><published>2007-09-13T20:44:00.000+08:00</published><updated>2007-09-13T20:45:21.712+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SIP'/><category scheme='http://www.blogger.com/atom/ns#' term='voip'/><category scheme='http://www.blogger.com/atom/ns#' term='dotNet'/><title type='text'>VoIP SIP SDK for .NET and Win32 COM 1.0</title><content type='html'>VoIP SIP SDK - A powerful and highly versatile VoIP SDK to accelerate development of SIP applications. Our brand-new SIP SDK provides a powerful and highly versatile solution to add quickly SIP (Session Initiation Protocol) based dial and receive phone calls features in your software applications. It accelerates the development of SIP/ RTP compliant soft phone with a fully-customizable user interface and brand name. The conaito VoIP SIP SDK contains a high performance VoIP conferencing client capable of delivering crystal clear sound even for both low and high-bandwidth users and SIP compatible devices (hardware and software). It enables a worldwide communication over the internet or intern networks either by speaking and/or by text messages and delivers superior voice quality by integrating advanced configurable digital voice processing features including auto gain controller, acoustic echo cancellation, noise cancellation, reverb cancellation and Voice activity detection. Here is a list of the main features of the conaito VoIP SIP client: * Easily make and receive SIP (Session Initiation Protocol) based phone calls through any SIP gateway or SIP compliant IP-Telephony service provider * VoIP conferencing with crystal clear sound even for both low and high-bandwidth users (G711 A-Law, G711 U-Law and iLBC Codec). * Registration on SIP Server (SIP Registrar). * Instant text messaging. * Microphone and Speaker Visualization support. * Microphone and Speaker Volume with Mute support. * Audio device selection. * Fully-customizable user interface. * Packetloss resistant (by using iLBC codec). * Supports OLE Automation (scripting) by providing IDispatch interface and custom interfaces for C/C++ developers. * Works with all kind of Internet connections. * Royalty free licensing * No Yearly/Monthly fee * Very easy to incorporate * VAD (Voice activity detection), Reverb, Echo and Noise cancellation or suppression, AGC (auto gain controller).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8931614446266229542-2031337954667807110?l=kenanlee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenanlee.blogspot.com/feeds/2031337954667807110/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8931614446266229542&amp;postID=2031337954667807110' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/2031337954667807110'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/2031337954667807110'/><link rel='alternate' type='text/html' href='http://kenanlee.blogspot.com/2007/09/voip-sip-sdk-for-net-and-win32-com-10.html' title='VoIP SIP SDK for .NET and Win32 COM 1.0'/><author><name>Nan Li</name><uri>http://www.blogger.com/profile/02756910278237685893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8931614446266229542.post-7429695429926396638</id><published>2007-09-13T20:41:00.000+08:00</published><updated>2007-09-13T20:42:29.684+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C/C++'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Building Hybrid Systems with Boost.Python</title><content type='html'>Python and C++ are in many ways as different as two languages could be: while C++ is usually compiled to machine-code, Python is interpreted. Python's dynamic type system is often cited as the foundation of its flexibility, while in C++ static typing is the cornerstone of its efficiency. C++ has an intricate and difficult compile-time meta-language, while in Python, practically everything happens at runtime.&lt;br /&gt;&lt;br /&gt;Yet for many programmers, these very differences mean that Python and C++ complement one another perfectly. Performance bottlenecks in Python programs can be rewritten in C++ for maximal speed, and authors of powerful C++ libraries choose Python as a middleware language for its flexible system integration capabilities. Furthermore, the surface differences mask some strong similarities:&lt;br /&gt;&lt;br /&gt;'C'-family control structures (if, while, for...) &lt;br /&gt;Support for object-orientation, functional programming, and generic programming (these are both multi-paradigm programming languages.) &lt;br /&gt;Comprehensive operator overloading facilities, recognizing the importance of syntactic variability for readability and expressivity. &lt;br /&gt;High-level concepts such as collections and iterators. &lt;br /&gt;High-level encapsulation facilities (C++: namespaces, Python: modules) to support the design of re-usable libraries. &lt;br /&gt;Exception-handling for effective management of error conditions. &lt;br /&gt;C++ idioms in common use, such as handle/body classes and reference-counted smart pointers mirror Python reference semantics. &lt;br /&gt;Given Python's rich 'C' interoperability API, it should in principle be possible to expose C++ type and function interfaces to Python with an analogous interface to their C++ counterparts. However, the facilities provided by Python alone for integration with C++ are relatively meager. Compared to C++ and Python, 'C' has only very rudimentary abstraction facilities, and support for exception-handling is completely missing. 'C' extension module writers are required to manually manage Python reference counts, which is both annoyingly tedious and extremely error-prone. Traditional extension modules also tend to contain a great deal of boilerplate code repetition which makes them difficult to maintain, especially when wrapping an evolving API.&lt;br /&gt;&lt;br /&gt;These limitations have lead to the development of a variety of wrapping systems. SWIG is probably the most popular package for the integration of C/C++ and Python. A more recent development is SIP, which was specifically designed for interfacing Python with the Qt graphical user interface library. Both SWIG and SIP introduce their own specialized languages for customizing inter-language bindings. This has certain advantages, but having to deal with three different languages (Python, C/C++ and the interface language) also introduces practical and mental difficulties. The CXX package demonstrates an interesting alternative. It shows that at least some parts of Python's 'C' API can be wrapped and presented through a much more user-friendly C++ interface. However, unlike SWIG and SIP, CXX does not include support for wrapping C++ classes as new Python types.&lt;br /&gt;&lt;br /&gt;The features and goals of Boost.Python overlap significantly with many of these other systems. That said, Boost.Python attempts to maximize convenience and flexibility without introducing a separate wrapping language. Instead, it presents the user with a high-level C++ interface for wrapping C++ classes and functions, managing much of the complexity behind-the-scenes with static metaprogramming. Boost.Python also goes beyond the scope of earlier systems by providing:&lt;br /&gt;&lt;br /&gt;Support for C++ virtual functions that can be overridden in Python. &lt;br /&gt;Comprehensive lifetime management facilities for low-level C++ pointers and references. &lt;br /&gt;Support for organizing extensions as Python packages, with a central registry for inter-language type conversions. &lt;br /&gt;A safe and convenient mechanism for tying into Python's powerful serialization engine (pickle). &lt;br /&gt;Coherence with the rules for handling C++ lvalues and rvalues that can only come from a deep understanding of both the Python and C++ type systems. &lt;br /&gt;The key insight that sparked the development of Boost.Python is that much of the boilerplate code in traditional extension modules could be eliminated using C++ compile-time introspection. Each argument of a wrapped C++ function must be extracted from a Python object using a procedure that depends on the argument type. Similarly the function's return type determines how the return value will be converted from C++ to Python. Of course argument and return types are part of each function's type, and this is exactly the source from which Boost.Python deduces most of the information required.&lt;br /&gt;&lt;br /&gt;This approach leads to user guided wrapping: as much information is extracted directly from the source code to be wrapped as is possible within the framework of pure C++, and some additional information is supplied explicitly by the user. Mostly the guidance is mechanical and little real intervention is required. Because the interface specification is written in the same full-featured language as the code being exposed, the user has unprecedented power available when she does need to take control.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8931614446266229542-7429695429926396638?l=kenanlee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenanlee.blogspot.com/feeds/7429695429926396638/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8931614446266229542&amp;postID=7429695429926396638' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/7429695429926396638'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/7429695429926396638'/><link rel='alternate' type='text/html' href='http://kenanlee.blogspot.com/2007/09/building-hybrid-systems-with.html' title='Building Hybrid Systems with Boost.Python'/><author><name>Nan Li</name><uri>http://www.blogger.com/profile/02756910278237685893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8931614446266229542.post-6598880668043714107</id><published>2007-05-26T01:43:00.001+08:00</published><updated>2007-05-26T01:43:14.878+08:00</updated><title type='text'>What can the VoipCenter SIP App Server be used to deliver?</title><content type='html'>CCXML has been used by Voxeo's customers to create any call control application imaginable, including: Back to Back SIP User Agents (B2BUA), SIP redirect servers, SIP load balancers, Virtual or "hosted" IP-PBX and call-center / ACD solutions, click-to-dial SIP call launchers, follow-me-find me applications, and more. &lt;br /&gt;&lt;br /&gt;When combined with our VoipCenter SIP Mediaserver, our customers have also used CCXML to deliver speech driven conferencing, call recording platforms, emegency notification / audio broadcast services, auto-attendant applications, telephone surveys, unified messaging platforms, bill payment solutions, voice broadcasting services, emergency notification services, and general speech or touch-tone driven IVR.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8931614446266229542-6598880668043714107?l=kenanlee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenanlee.blogspot.com/feeds/6598880668043714107/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8931614446266229542&amp;postID=6598880668043714107' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/6598880668043714107'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/6598880668043714107'/><link rel='alternate' type='text/html' href='http://kenanlee.blogspot.com/2007/05/what-can-voipcenter-sip-app-server-be.html' title='What can the VoipCenter SIP App Server be used to deliver?'/><author><name>Nan Li</name><uri>http://www.blogger.com/profile/02756910278237685893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8931614446266229542.post-6669971857440236310</id><published>2007-05-26T01:42:00.001+08:00</published><updated>2007-05-26T01:42:50.293+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='voip'/><category scheme='http://www.blogger.com/atom/ns#' term='XML'/><title type='text'>What is CCXML?</title><content type='html'>CCXML is the call control application standard from the World Wide Web Consortium (W3C), the same standards body that delivered HTTP and HTML -- arguably the two most successful applicaton development standards ever created. CCXML gives VOIP developers total control over how phone calls are placed, answered, transfered, conferenced, routed, and more. CCXML works hand-in-hand with any web application server or platform to enable dynamic, intelligent control over all VOIP calls.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8931614446266229542-6669971857440236310?l=kenanlee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenanlee.blogspot.com/feeds/6669971857440236310/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8931614446266229542&amp;postID=6669971857440236310' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/6669971857440236310'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/6669971857440236310'/><link rel='alternate' type='text/html' href='http://kenanlee.blogspot.com/2007/05/what-is-ccxml.html' title='What is CCXML?'/><author><name>Nan Li</name><uri>http://www.blogger.com/profile/02756910278237685893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8931614446266229542.post-1725318420335561506</id><published>2007-05-26T01:41:00.000+08:00</published><updated>2007-05-26T01:42:15.020+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='voip'/><category scheme='http://www.blogger.com/atom/ns#' term='XML'/><title type='text'>VoipCenter SIP Application Server Software</title><content type='html'>The VoipCenter SIP Application Server software is built on Voxeos proven Call Control XML (CCXML) engine and has routed over one billion calls since its first production deployment in early 2002. CCXML lets any company create intelligent, dynamic SIP applications that can screen, route, transfer, and initiate SIP VOIP calls - including SIP redirect, proxy, and Back-to-Back User Agent (B2BUA) applications. The VoipCenter SIP Application Server also supports least-cost and multi-network call routing with the ENUM route directory standard.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8931614446266229542-1725318420335561506?l=kenanlee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenanlee.blogspot.com/feeds/1725318420335561506/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8931614446266229542&amp;postID=1725318420335561506' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/1725318420335561506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/1725318420335561506'/><link rel='alternate' type='text/html' href='http://kenanlee.blogspot.com/2007/05/voipcenter-sip-application-server.html' title='VoipCenter SIP Application Server Software'/><author><name>Nan Li</name><uri>http://www.blogger.com/profile/02756910278237685893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8931614446266229542.post-1369802245685221572</id><published>2007-05-26T01:38:00.000+08:00</published><updated>2007-05-26T01:41:06.600+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='voip'/><category scheme='http://www.blogger.com/atom/ns#' term='XML'/><title type='text'>Performance Evaluation of an XML-Based Conference Control Protocol for Centralized VoIP Conference</title><content type='html'>For communication between heterogeneous conference systems, it is important to build a conference control protocol independent from signaling protocols. We simulate an XML-based conference control that is under consideration as a standard mechanism. We describe the framework and operations for easy implementation in heterogeneous conference systems. The simulation results show that the proposed control protocol provides a consistent service for an increasing number of conferences and participants in small to mid-size centralized conferencing&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8931614446266229542-1369802245685221572?l=kenanlee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenanlee.blogspot.com/feeds/1369802245685221572/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8931614446266229542&amp;postID=1369802245685221572' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/1369802245685221572'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/1369802245685221572'/><link rel='alternate' type='text/html' href='http://kenanlee.blogspot.com/2007/05/performance-evaluation-of-xml-based.html' title='Performance Evaluation of an XML-Based Conference Control Protocol for Centralized VoIP Conference'/><author><name>Nan Li</name><uri>http://www.blogger.com/profile/02756910278237685893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8931614446266229542.post-2259614936755081453</id><published>2007-05-26T01:37:00.000+08:00</published><updated>2007-05-26T01:38:51.687+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='voip'/><title type='text'>Microsoft partners with VoIP suppliers</title><content type='html'>15 phone suppliers support Microsoft software&lt;br /&gt;Nancy Gohring&lt;br /&gt;&lt;br /&gt;Microsoft is launching a qualification programme for phones that are compatible with its unified communications products. &lt;br /&gt;&lt;br /&gt;On Monday, Microsoft will show off 15 phones made by a variety of vendors including Samsung, LG-Nortel, NEC, Plantronics, Asus, GN, Polycon, Tatung and Vitelix that will carry a sticker alerting customers that they are certified for use with Microsoft Office Communications Server 2007 and Microsoft Office Communicator 2007. &lt;br /&gt;&lt;br /&gt;The Microsoft communications software is available to users that are part of a public beta programme. Combined with other Microsoft programmes, they unify email, instant messaging and video conferencing functions so that users can do things like click on an email message to make a VoIP (voice over IP) call to its sender. The software also supports standard desk phone features. &lt;br /&gt;&lt;br /&gt;Microsoft designed the software to be compatible with phones already on the market. The new qualification programme is meant to assure buyers that devices will work out of the box with Microsoft's unified communications products. &lt;br /&gt;&lt;br /&gt;In order to qualify for the certification, handsets must include wideband audio support, comply with a wide range of VoIP codecs and include specific user interface elements, said Eric Swift, senior director of unified communications product management for Microsoft. &lt;br /&gt;&lt;br /&gt;Some of the new phones connect directly to a USB (Universal Serial Bus) port so that mobile workers can bring the phone with them and use it along with their laptop to access features typically only support on desk phones, like call forwarding and conferencing. &lt;br /&gt;&lt;br /&gt;Other new phones include Bluetooth and video capabilities. &lt;br /&gt;&lt;br /&gt;"We're looking to ignite partner innovation to bring software economics to what has been proprietary," said Swift. Microsoft hopes that the communications software and the qualification program will make it easier for hardware developers to create innovative new phone products in a phone industry that he describes as remaining stagnant for many years. &lt;br /&gt;&lt;br /&gt;Microsoft's Office Communications Server competes with VoIP products from networking giants like Cisco and Avaya. Microsoft hopes to establish an edge against them by integrating its server with widely used products such as Exchange 2007 and enabling unified services. &lt;br /&gt;&lt;br /&gt;Microsoft planned to make the announcement about the new phones and the qualification programme today at WinHEC (Windows Hardware Engineering Conference).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8931614446266229542-2259614936755081453?l=kenanlee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenanlee.blogspot.com/feeds/2259614936755081453/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8931614446266229542&amp;postID=2259614936755081453' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/2259614936755081453'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/2259614936755081453'/><link rel='alternate' type='text/html' href='http://kenanlee.blogspot.com/2007/05/microsoft-partners-with-voip-suppliers.html' title='Microsoft partners with VoIP suppliers'/><author><name>Nan Li</name><uri>http://www.blogger.com/profile/02756910278237685893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8931614446266229542.post-1537883111631355763</id><published>2007-05-21T23:25:00.001+08:00</published><updated>2007-05-21T23:25:44.321+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Video Conference'/><title type='text'>VIDEO CONFERENCING</title><content type='html'>Video conferencing is a powerful communications tool in the modern business world. The ability to share important business discussions with body language and facial expressions delivers enormous benefits compared to any other conferencing media. In many ways, video conferencing has truly become “the next-best thing to being there.”&lt;br /&gt;&lt;br /&gt;Many Fortune 500 companies are frequent users of video conferencing solutions based on Video MCU (Multimedia Conferencing Unit) technology along with ISDN-based networks and video terminals. However, the expense of these systems often limits the deployment of conferencing technology to room-based systems in each corporate location. Video MCU products are typically tight, proprietary integrations of a conferencing application and video processing hardware. Video MCU solutions limit third-party feature enhancements, and also limit the reuse of the video processing resources with other applications. The result is a relatively expensive single-service solution with limited flexibility and scalability.&lt;br /&gt;&lt;br /&gt;RadiSys Convedia Media Servers are bringing video application development into the Internet era. Convedia Media Servers are purpose-built to economically deliver the DSP-intensive video media processing capabilities essential in next-generation IP video conferencing solutions. Service providers and application developers, using familiar Internet technologies such as SIP and XML scripts, can now develop video conferencing applications to control Convedia’s advanced video bridging, streaming, and transcoding features, including multi-image display options and continuous presence. This “best-of-breed” approach not only reduces the overall costs for a video conferencing solution, but also facilitates the reuse of Convedia’s media processing capabilities across any IP-based audio or video telephony application.&lt;br /&gt;Video codecs supported: H.263, MPEG-4* &lt;br /&gt;Video bridging, switching, and mixing &lt;br /&gt;Video conference recording and playback &lt;br /&gt;Video transcoding and rate matching* &lt;br /&gt;Advanced continuous presence* &lt;br /&gt;External video media storage &lt;br /&gt;Open standards-based control interface based on SIP and MSML/MOML facilitates integration with videomail application servers &lt;br /&gt;Software-only upgrade to existing RadiSys Convedia Media Server platforms &lt;br /&gt;Interoperability with existing ISDN-based terminals or emerging 3G-H324M mobile video terminals can be achieved through appropriate video gateway devices. When deployed with any QoS-enabled IP network (such as an IP VPN or an MPLS backbone network), video conferencing quality is comparable to existing ISDN-based solutions, at a fraction of the initial capital and ongoing operational expense. The result is an improved ROI, which will drive the economic migration and service benefits of video conferencing solutions out of the conference rooms and towards desktops and 3G mobile phones.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8931614446266229542-1537883111631355763?l=kenanlee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenanlee.blogspot.com/feeds/1537883111631355763/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8931614446266229542&amp;postID=1537883111631355763' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/1537883111631355763'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/1537883111631355763'/><link rel='alternate' type='text/html' href='http://kenanlee.blogspot.com/2007/05/video-conferencing.html' title='VIDEO CONFERENCING'/><author><name>Nan Li</name><uri>http://www.blogger.com/profile/02756910278237685893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8931614446266229542.post-1780376357539961946</id><published>2007-05-21T23:15:00.001+08:00</published><updated>2007-05-21T23:16:21.649+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XML'/><title type='text'>New XML Interface for Web Conferencing Development</title><content type='html'>WiredRed Software says that they are now offering an XML-based web services software interface for its e/pop Web Conferencing software. e/pop Web Conferencing offers features that include multi-party audio and synchronous video conferencing, remote control, plus desktop, application/document sharing and dynamic PowerPoint presentation sharing. &lt;br /&gt;&lt;br /&gt;The interface will allow developers to build web conferencing solutions and integrate this functionality into a variety of applications such as workflow, document and content management, customer-facing CRM solutions, web portals, and ASP offerings. &lt;br /&gt;&lt;br /&gt;The ability to integrate web conferencing and communications into traditional business applications and ASP offerings built on the .NET, XML and web services architecture enable organizations to eliminate the cost of expensive service-based web conferencing offerings while leveraging existing network investments. &lt;br /&gt;&lt;br /&gt;NetSalon Software Development Corporation, a provider of software applications for the direct sales industry, chose WiredRed's e/pop Web Conferencing SDK to add web conferencing, desktop sharing with remote control, and multi-party video conferencing to its contact management and sales automation services. &lt;br /&gt;&lt;br /&gt;The e/pop Web Conferencing SDK allows developers to build a scalable enterprise product with industry standard security. The resulting conferencing app will let users control video and audio settings and includes full-screen video with 640 x 480 resolution. In addition, conference hosts can change all of the video properties, including screen size and quality either conference-wide or on an individual viewing basis. &lt;br /&gt;&lt;br /&gt;e/pop Web Conferencing is based on the XML standard to provide RPC remote procedure calls from virtually any development environment or platform. Its WSDL-compatible interface supports most development platforms, including C++, C#, Java, and also many platforms, such as Windows, Linux, Solaris and Unix. &lt;br /&gt;&lt;br /&gt;e/pop Web Conferencing is compatible with standard audio-visual peripherals including microphones, headsets and USB web cameras. It also supports industry standard algorithms for both audio and video codecs. This ensures that the web conferencing platform is both cost-effective and reliable. &lt;br /&gt;&lt;br /&gt;Supported video standards include H263, H264+ and MPEG4 and audio codes G7.x, PCM, ADPCM, VCELP and LPC. The e/pop Web Conferencing API provides support for the highest security standards for encryption and authentication. Security options include: SSL/TLS, RC4, DES, 3DES, AES and RSA.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8931614446266229542-1780376357539961946?l=kenanlee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenanlee.blogspot.com/feeds/1780376357539961946/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8931614446266229542&amp;postID=1780376357539961946' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/1780376357539961946'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/1780376357539961946'/><link rel='alternate' type='text/html' href='http://kenanlee.blogspot.com/2007/05/new-xml-interface-for-web-conferencing.html' title='New XML Interface for Web Conferencing Development'/><author><name>Nan Li</name><uri>http://www.blogger.com/profile/02756910278237685893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8931614446266229542.post-8589297742058394313</id><published>2007-05-21T23:12:00.000+08:00</published><updated>2007-05-21T23:13:42.646+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XML'/><title type='text'>XML Integration in ADO.NET</title><content type='html'>The objective of this session is to introduce developers to leveraging the XML features and support in ADO.NET. &lt;br /&gt;&lt;br /&gt;These are some of the key topics that will be covered in this presentation: &lt;br /&gt;Accessing the output of executing ADO.NET commands as XML streams &lt;br /&gt;Persisting ADO.NET datasets as XML &lt;br /&gt;Using XML data to populate ADO.NET datasets &lt;br /&gt;Using the Microsoft .NET Framework XmlDataDocument class to &lt;br /&gt;manipulate the data in an ADO.NET dataset using XML &lt;br /&gt;DOM properties and methods &lt;br /&gt;Synchronizing an XmlDataDocument object with an ADO.NET dataset &lt;br /&gt;Practical applications of XML features implemented in ADO.NET &lt;br /&gt;The code samples presented in the slides of this presentation will be written using Microsoft Visual Basic .NET. &lt;br /&gt;&lt;br /&gt;Presentation to be given by: &lt;br /&gt;Karthik Ravindran: Karthik has been with Microsoft for more than two years. He is a Developer Support Professional in the XML Web Database team, and is the PSS MSXML Beta Product Lead. He holds a master's degree in Information Technology, and the MCSD &amp; MCP+SB (Site Builder) certifications. &lt;br /&gt;Karthikeyan Ponnusamy: Karthi has been with Microsoft for two years. He is a Developer Support Professional in the XML Web database team, and is currently the PSS Web Database Content Lead. He holds a master's degree in Engineering, and MCSD certification.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8931614446266229542-8589297742058394313?l=kenanlee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenanlee.blogspot.com/feeds/8589297742058394313/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8931614446266229542&amp;postID=8589297742058394313' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/8589297742058394313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/8589297742058394313'/><link rel='alternate' type='text/html' href='http://kenanlee.blogspot.com/2007/05/xml-integration-in-adonet.html' title='XML Integration in ADO.NET'/><author><name>Nan Li</name><uri>http://www.blogger.com/profile/02756910278237685893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8931614446266229542.post-6141081147376842014</id><published>2007-05-18T23:07:00.000+08:00</published><updated>2007-05-18T23:09:26.908+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XML'/><category scheme='http://www.blogger.com/atom/ns#' term='Data Mining'/><title type='text'>Data, text and structure mine XML and relational data with XML Miner</title><content type='html'>&lt;div&gt;&lt;span style="font-family:helvetica;"&gt;&lt;strong&gt;XML Miner &lt;/strong&gt;is a system and class library for  mining data and text expressed in XML, extracting knowledge and re-using that  knowledge in products and applications in the form of fuzzy logic expert system  rules. XML Miner can also be used as a full featured, low cost Business Rules  system. &lt;/span&gt;&lt;ul&gt;&lt;span style="font-family:helvetica;"&gt;&lt;li&gt;Use it to predict numeric values, categorise and classify data, infer the  relevance and topics in text, and to mine the structure of XML documents. &lt;/li&gt;&lt;li&gt;XML data is everywhere, can be easily generated from any data source, but  can be unstructured and sparse. XML miner is the first data mining tool to mine  any data that can be expressed in XML. &lt;/li&gt;&lt;li&gt;XML Miner is configured via XML, reads XML, and creates results in XML using  our Metarule schema.  &lt;/li&gt;&lt;li&gt;XML Miner performs both &lt;em&gt;Supervised&lt;/em&gt; &lt;em&gt;learning&lt;/em&gt; of numeric,  categorical, structural or textual values to a given numeric or categorical  output and &lt;em&gt;Association&lt;/em&gt; &lt;em&gt;learning&lt;/em&gt;, where a data set is searched  for all useful relationships between data or structural values.    &lt;/li&gt;&lt;li&gt;You can convert Metarule to easily understood English language if...then  rules using an XSL transform we supply, so you can see what's been discovered. &lt;/li&gt;&lt;li&gt;You can apply Metarule rules to new data, either supplied directly or  embedded in an XML document and have the results available for use in your  programs or embedded into a copy of the source XML. &lt;/li&gt;&lt;li&gt;XML Miner is standards-based and compatible with other standards-based  tools. &lt;/li&gt;&lt;li&gt;XML Miner comes with development tools easily used with Visual Studio  .Net&lt;sup&gt;&lt;span style="font-size:78%;"&gt;TM&lt;/span&gt;&lt;/sup&gt; or any Java&lt;sup&gt;&lt;span style="font-size:78%;"&gt;TM&lt;/span&gt;&lt;/sup&gt; development environment &lt;/li&gt;&lt;li&gt;XML Miner integrates text mining seamlessly so that blocks of embedded text  can be handled at the same time as numeric and categorical data. &lt;/li&gt;&lt;li&gt;XML Miner is implemented as .Net and Java class libraries. You can create  products for any platform&lt;/li&gt;&lt;/span&gt;&lt;/ul&gt; &lt;p&gt;&lt;span style="font-family:helvetica;"&gt; &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-family:helvetica;"&gt;&lt;b&gt;XML Miner&lt;/b&gt; is a completely new development in data mining systems.  Although it can perform the same kind of processing as other data mining  systems, it is the first and only product that can also mine semi-structured  data sources such as XML. It unifies into a single system a variety of different  functions:&lt;br /&gt;&lt;br /&gt;First of all, it data, text and structure mines  semi-structured data expressed in XML, all at the same time.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;blockquote&gt;&lt;span style="font-family:helvetica;"&gt;&lt;em&gt;You can specify nodes in a document for text mining, nodes for  conventional numeric data mining, and structural elements - and then mine them  all at once so that the resulting model combines knowledge found in all those  diferent ways. &lt;/em&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-family:helvetica;"&gt;Secondly, XML Miner describes the result of the  data mining, the model of what it has found, as fuzzy logic &lt;em&gt;if..then&lt;/em&gt;  rules using our language Metarule.&lt;br /&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-family:helvetica;"&gt;&lt;em&gt;Using our editor or a simple transform we supply these can be  displayed and edited as English language rules - so that the relationships  discovered can be clearly understood. &lt;/em&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-family:helvetica;"&gt;Thirdly, we supply a  run-time processor as part of Xml Miner that you can use to evaluate new data,  whether supplied in XML, or programmatically, and which you can build in to your  applications.&lt;br /&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-family:helvetica;"&gt;&lt;em&gt;The metarule language, as well as supporting the output of the  data and text mining algorithms, has full support for fuzzy logic inference,  fuzzy arithmetic, algebraic functions and text handling functions. With the  editor and the runtime processor it makes a fully functioning, emeddable  business rules system.&lt;/em&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-family:helvetica;"&gt;Fourthly, the rule sets, whether created  by the user or by Xml Miner, can be tested for coverage by our consistency  checker called &lt;em&gt;Lacuna.&lt;br /&gt;&lt;/em&gt;&lt;em&gt;&lt;br /&gt;&lt;/em&gt; &lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-family:helvetica;"&gt;&lt;em&gt;A report is generated detailing any lacunae, i.e. any  combinations of input values that result in the rule set not generating an  output value, so that the users can be sure that the rule set covers all the  circumstances that can arise.&lt;br /&gt;&lt;/em&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-family:helvetica;"&gt;Finally, we supply an  integrated development environment that permits you to do all the above via a  simple user interface. You can display source XML, locate via XPath expressions  the data nodes you want to mine, train the sytem to create rule sets, test the  rule sets on your own data, create your own rule sets, and load and store rule  sets and data files.&lt;br /&gt;&lt;br /&gt;The same IDE can be used to run demo examples,  process data remotely on our web service, or process data locally. You can  choose the level of performance you want and purchase the appropriate license.  &lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8931614446266229542-6141081147376842014?l=kenanlee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenanlee.blogspot.com/feeds/6141081147376842014/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8931614446266229542&amp;postID=6141081147376842014' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/6141081147376842014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/6141081147376842014'/><link rel='alternate' type='text/html' href='http://kenanlee.blogspot.com/2007/05/data-text-and-structure-mine-xml-and.html' title='Data, text and structure mine XML and relational data with XML Miner'/><author><name>Nan Li</name><uri>http://www.blogger.com/profile/02756910278237685893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8931614446266229542.post-744283350813486779</id><published>2007-05-18T22:25:00.001+08:00</published><updated>2007-05-18T22:26:44.158+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XML'/><category scheme='http://www.blogger.com/atom/ns#' term='C/C++'/><title type='text'>XML-RPC For C and C++</title><content type='html'>&lt;p&gt;&lt;a href="http://www.xmlrpc.com/"&gt;XML-RPC&lt;/a&gt; is a quick-and-easy way to make  procedure calls over the Internet. It converts the procedure call into XML  document, sends it to a remote server using HTTP, and gets back the response as  XML.&lt;/p&gt; &lt;p&gt;This library provides a modular implementation of XML-RPC for C and C++.&lt;/p&gt; &lt;p&gt;XML-RPC For C and C++ is designed for Unix and is most tested on unix. As far  as we know, it works on any reasonably standard unix.  &lt;/p&gt;&lt;p&gt;There is also lots of code to make it work on Windows, but the fact is that  it probably won't work out-of-the-box on your Windows system. &lt;a href="http://www.blogger.com/windows.php"&gt;Here is the Windows story.&lt;/a&gt;  &lt;/p&gt;&lt;p&gt;[&lt;a href="http://www.blogger.com/downloading.php"&gt;&lt;/a&gt;&lt;a href="http://www.xmlrpc.com/"&gt;XML-RPC protocol&lt;/a&gt; ]&lt;/p&gt; &lt;p&gt;There is a Perl module to interface to XML-RPC for C and C++. Look in &lt;a href="http://www.blogger.com/cpan.org/modules"&gt;CPAN&lt;/a&gt; for &lt;tt&gt;RPC::Xmlrpc_c&lt;/tt&gt;.  &lt;/p&gt;&lt;p&gt;For information on using XML-RPC with other languages, see the &lt;a href="http://www.xmlrpc.com/"&gt;XML-RPC Web site&lt;/a&gt; and the Linux &lt;a href="http://tldp.org/HOWTO/XML-RPC-HOWTO/index.html"&gt;XML-RPC Howto&lt;/a&gt;.&lt;/p&gt;&lt;!-- &lt;h2&gt;&lt;a name="competitors"&gt;XML-RPC vs. CORBA, DCOM, Sun RPC, etc.&lt;/a&gt;&lt;/h2&gt;  &lt;p&gt;XML-RPC is simpler, easier-to-implement and more portable than other RPC protocols.  It's an excellent way to make web applications scriptable, and one can use it via most popular programming languages.&lt;/p&gt;  &lt;p&gt;On the other hand, XML-RPC also does less than other RPC protocols. It has a less elaborate security model, and tends to be somewhat slower when run on local networks.&lt;/p&gt;  &lt;p&gt;If you're happy with the features and performance of XML-RPC, it's the perfect, no-headache solution to your RPC needs.&lt;/p&gt; --&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8931614446266229542-744283350813486779?l=kenanlee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenanlee.blogspot.com/feeds/744283350813486779/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8931614446266229542&amp;postID=744283350813486779' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/744283350813486779'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/744283350813486779'/><link rel='alternate' type='text/html' href='http://kenanlee.blogspot.com/2007/05/xml-rpc-for-c-and-c.html' title='XML-RPC For C and C++'/><author><name>Nan Li</name><uri>http://www.blogger.com/profile/02756910278237685893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8931614446266229542.post-3935740018985100627</id><published>2007-05-18T22:21:00.000+08:00</published><updated>2007-05-18T22:23:46.989+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XML'/><title type='text'>XML in C</title><content type='html'>&lt;p class="first"&gt;XML is a base-language for expressing arbitrary structured data  in text form. It consists of several modules: core syntax, meta-syntax, linking,  style-bindings, and maybe more. Of these only the core syntax is common to all  XML applications. Applications can choose to omit the other modules if they  don't need them.&lt;/p&gt; &lt;p&gt;This text describes one possible core syntax, using flex/bison  specifications. The most important additions relative to the &lt;a href="../../../TR/WD-xml-lang" shape="rect"&gt;XML-lang draft of 30 June 1997&lt;/a&gt;  include: automatically ignored newlines, attribute defaults, and boolean  attributes.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8931614446266229542-3935740018985100627?l=kenanlee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenanlee.blogspot.com/feeds/3935740018985100627/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8931614446266229542&amp;postID=3935740018985100627' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/3935740018985100627'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/3935740018985100627'/><link rel='alternate' type='text/html' href='http://kenanlee.blogspot.com/2007/05/xml-in-c.html' title='XML in C'/><author><name>Nan Li</name><uri>http://www.blogger.com/profile/02756910278237685893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8931614446266229542.post-8923421761563932815</id><published>2007-05-18T22:20:00.000+08:00</published><updated>2007-05-18T22:21:29.932+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XML'/><title type='text'>Mining association rules from XML data using XQuery</title><content type='html'>&lt;p class="abstract"&gt;In recent years XML has became very popular for representing  semistructured data and a standard for data exchange over the web. Mining XML  data from the web is becoming increasingly important. Several encouraging  attempts at developing methods for mining XML data have been proposed. However,  efficiency and simplicity are still a barrier for further development. Normally,  pre-processing or post-processing are required for mining XML data, such as  transforming the data from XML format to relational format. In this paper, we  show that extracting association rules from XML documents without any  pre-processing or post-processing using &lt;i&gt;XQuery&lt;/i&gt; is possible and analyze  the XQuery implementation of the well-known &lt;i&gt;Apriori&lt;/i&gt; algorithm. In  addition, we suggest features that need to be added into XQuery in order to make  the implementation of the Apriori algorithm more efficient.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p class="abstract"&gt;http://portal.acm.org/citation.cfm?id=976466&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8931614446266229542-8923421761563932815?l=kenanlee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenanlee.blogspot.com/feeds/8923421761563932815/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8931614446266229542&amp;postID=8923421761563932815' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/8923421761563932815'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/8923421761563932815'/><link rel='alternate' type='text/html' href='http://kenanlee.blogspot.com/2007/05/mining-association-rules-from-xml-data.html' title='Mining association rules from XML data using XQuery'/><author><name>Nan Li</name><uri>http://www.blogger.com/profile/02756910278237685893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8931614446266229542.post-8474631541807154346</id><published>2007-05-18T22:15:00.000+08:00</published><updated>2007-05-18T22:19:38.395+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XML'/><title type='text'>XML: Designing XML Internet Applications</title><content type='html'>Designing XML Internet ApplicationsAuthors: Michael Leventhal, David Lewis, and Matthew Fuchs&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;Designing XML Internet Applications. By Michael Leventhal, David Lewis, and Matthew Fuchs; with contributions from Stuart Culshaw and Gene Kan. The Charles F. Goldfarb Series on Open Information Management. [Subseries:] The Definitive XML Series from Charles F. Goldfarb. Upper Saddle River, NJ: Prentice Hall PTR, [May] 1998. Extent: xxxii + 582 pages, CD-ROM. ISBN: 0-13-616822-1. Price: $44.95 U.S./$63.00 Canada. See also: the main bibliography entry and the Prentice Hall SGML Series Page.&lt;br /&gt;--------------------------------------------------------------------------------&lt;br /&gt;Volume Description[Provided by the authors.]&lt;br /&gt;Designing XML Internet Applications is divided into five parts.&lt;br /&gt;In the first part we will introduce you to the XML universe. Here you will find a discussion of the role of XML in the internet and a quick-start on the XML recommendation and XML tools. We don't assume prior knowledge of either XML or SGML but our task here is not to provide an extended tutorial or reference on the language syntax. What we do do is develop the perspective of the XML internet application designer and provide any background that is needed to comprehend the subsequent chapters.&lt;br /&gt;The next three parts consist of a series of projects using XML in actual internet applications. Working through the projects the reader will gain concrete experience in the design of XML applications, DTDs, and programming. We also delve into standards related to XML and the internet wherever relevant.&lt;br /&gt;The first project spans five chapters as the construction of several types of components is involved including a bulletin board, forms processing tools, a search engine, and transformation filters.&lt;br /&gt;Most of the work is done in Perl and the approach is less rigorous than that used in subsequent projects. Our intention here is to introduce XML programming in the most simple and "exposed" form possible.&lt;br /&gt;We have chosen to use Perl in this first part for various reasons. It is the closest thing we know of to a lingua franca for internet programmers, it is extremely compact allowing us to construct complete examples in relatively few lines of code, and, most significantly, Perl is the most versatile XML scripting language.&lt;br /&gt;The second project implements SGML/XML email and digs into the topics of entity management, catalogs, MIME, and full- scale SGML/XML parsing. Code is presented in Perl and C++.&lt;br /&gt;Lest the reader think we are Perl bigots the third project plunges us into Java and XML, building an application based on the Document Object Model and making use of a Java XML parser API. Java is the language in which most of the new XML internet infrastructure is being built.&lt;br /&gt;The fifth and final section of the book takes a rigorous, formal look at the role of XML in software architectures and agents based on the paradigm of negotiation.&lt;br /&gt;Full source code for all the projects has been included on the CD-OM as have all the public domain tools used in the book.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8931614446266229542-8474631541807154346?l=kenanlee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenanlee.blogspot.com/feeds/8474631541807154346/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8931614446266229542&amp;postID=8474631541807154346' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/8474631541807154346'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/8474631541807154346'/><link rel='alternate' type='text/html' href='http://kenanlee.blogspot.com/2007/05/xml-designing-xml-internet-applications.html' title='XML: Designing XML Internet Applications'/><author><name>Nan Li</name><uri>http://www.blogger.com/profile/02756910278237685893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8931614446266229542.post-139260154942349046</id><published>2007-05-03T23:50:00.001+08:00</published><updated>2007-05-03T23:50:44.757+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='voip'/><category scheme='http://www.blogger.com/atom/ns#' term='XML'/><title type='text'>Accessing VoIP Destinations</title><content type='html'>&lt;h1&gt;&lt;span style="font-size:85%;"&gt;Accessing VoIP Destinations&lt;/span&gt;&lt;/h1&gt; &lt;span style="font-size:85%;"&gt;As the proliferation of VoIP phones has skyrocketed, there is ample reason to consider the market for outbound and inbound VoIP access when designing IVR applications. From the start, Voxeo has been ready. Herein, we will walk you through the process for dialing to and from a VoIP phone to access your XML applications, and detail the offerings that have been tested to work with the Voxeo platform.&lt;br /&gt;&lt;br /&gt;Bear in mind, there are some rather important caveats to using the Voxeo SIP services that you should be aware of before you begin.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;span style="font-size:85%;"&gt;&lt;li&gt;All Voxeo platforms, (Motorola Voicexml2.1, CCXML, Callxml), support the SIP protocol for bridged transfers&lt;/li&gt; &lt;li&gt;Token-triggered outbound calls via HTTP are enabled for SIP calls.&lt;/li&gt; &lt;li&gt;Any 'true' SIP phone can dial the Voxeo network.&lt;/li&gt; &lt;li&gt;&lt;b&gt;The Voxeo outbound dialing feature is not enabled for all SIP phones/providers.&lt;/b&gt;&lt;/li&gt; &lt;/span&gt;&lt;/ul&gt; &lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;h2&gt;&lt;span style="font-size:85%;"&gt;Softphones&lt;/span&gt;&lt;/h2&gt; &lt;span style="font-size:85%;"&gt;Voxeo has found that the  easiest to use softphone on the market is the Pulver Communicator. The Communicator's setup and configuration is much less cantankerous than other free softphones, and its integration with instant messenging clients, along with a full arsenal of other features, (video, multiparty conferencing, and phone number blacklisting, to name a few) makes the &lt;a href="http://communicator.pulver.com/download/" target="_blank"&gt;Pulver Communicator&lt;/a&gt; a natural choice. Voxeo has partnered with Free World Dialup, the network residing beneath the Pulver Communicator, allowing for easy application access from anywhere on the globe&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;h2&gt;&lt;span style="font-size:85%;"&gt;Inbound VoIP Dialing&lt;/span&gt;&lt;/h2&gt; &lt;span style="font-size:85%;"&gt;Each application provisioned through the &lt;a href="http://evolution.voxeo.net/" target="_blank"&gt;Evolution Site&lt;/a&gt; site can be SIP-enabled, by clicking on the application detail screen, and selecting "Add 800+PIN/VoIP Number". This will bring up a new subsection to the application detail titled "calling from VoIP", where a new number will be added that looks something like this:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;**00001111222222&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;As easy as that, you can plug this destination number into yourPulver Communicator softphone to ring the voxeo application. This start sequence is specific to the Pulver Communicator/FWD. However, any SIP softphone can call Voxeo development applications by dialing:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt; (application PIN)@sip.voxeo.net&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Obviously, you will want to ensurethat the proper firewall rules are in place for these calls to function correctly.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;h2&gt;&lt;span style="font-size:85%;"&gt;Outbound VoIP Dialing&lt;/span&gt;&lt;/h2&gt; &lt;span style="font-size:85%;"&gt;When making an outbound PSTN call, either HTTP token based, or via a 'transfer' or 'call' element, the default syntax assumes a PSTN bridged transfer.However, when placing a SIP call, we need to change our syntax appropriately, and add a 'sip' prefix to the string:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;h4&gt;&lt;span style="font-size:85%;"&gt;CallXML&lt;/span&gt;&lt;/h4&gt; &lt;span style="font-size:85%;"&gt;&lt;b&gt;PSTN:&lt;/b&gt; &lt;code&gt;&lt;call value="2223334444"&gt;&lt;/code&gt;&lt;br /&gt;&lt;b&gt;SIP:&lt;/b&gt; &lt;code&gt;&lt;call value="&lt;span color="&gt;sip:&lt;/span&gt;**00001111222222@fwd.voxeo.net"/&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;h4&gt;&lt;span style="font-size:85%;"&gt;VoiceXML&lt;/span&gt;&lt;/h4&gt; &lt;span style="font-size:85%;"&gt;&lt;b&gt;PSTN:&lt;/b&gt; &lt;code&gt;&lt;transfer dest="tel:2223334444"&gt;&lt;/code&gt;&lt;br /&gt;&lt;b&gt;SIP:&lt;/b&gt; &lt;code&gt;&lt;transfer dest="&lt;span color="&gt;sip:&lt;/span&gt;**00001111222222@fwd.voxeo.net"&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;h4&gt;&lt;span style="font-size:85%;"&gt;CCXML&lt;/span&gt;&lt;/h4&gt; &lt;span style="font-size:85%;"&gt;&lt;b&gt;PSTN:&lt;/b&gt; &lt;code&gt;&lt;createcall dest="'2223334444'" name="line_1"&gt; &lt;/code&gt;&lt;br /&gt;&lt;b&gt;SIP:&lt;/b&gt; &lt;code&gt;&lt;createcall dest="'&lt;span color="&gt;sip:&lt;/span&gt;**00001111222222@fwd.voxeo.net'" name="line_1"/&gt; &lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Predictably enough, this applies to token-based calls as well, regardless of the platform:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;http://session.voxeo.net/VoiceXML.start?&lt;br /&gt;      numbertodial=&lt;span style="color:#990000;"&gt;sip:&lt;/span&gt;**00001111222222@fwd.voxeo.net&amp;&lt;br /&gt;      tokenid=yourTokenIDhere&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;As this offering is still relatively new, Voxeo has not tested all services and providers with our VoIP offering. As such, results may vary upon your initial efforts to place an outbound call to your SIP phone from a Voxeo application. However, if you do encounter problems with a particular service, just &lt;a href="mailto:support@voxeo.com" target="_blank"&gt;let us know!&lt;/a&gt; If we can, we will help out where possible.&lt;br /&gt;&lt;br /&gt;We can say for certain that most of the services that work with Free World Dialup, (X-10 softphone,and the Pulver Communicator), work smashingly with the Voxeo platforms, and shouldn't encounter any errors. If you are calling a non-Pulver softphone/network, then you will likely need to change the prefix::&lt;br /&gt;&lt;br /&gt;Using the "sip:any-fwd-number@fwd.voxeo.net" works just dandy to connect to the FWD network.  Furthermore, FWD has a Vonage interconnect, as well as many more using a ** nomenclature.  Just as **869 will get you from FWD to Voxeo, **2431+any-vonage-number will get you to Vonage,  **8981+any-packet8-number will get you to Packet8, etc. If you are using another provider, you would do well to check out the &lt;a href="http://www.freeworlddialup.com/content/view/full/333/" target="_blank"&gt;listing of these interconnects&lt;/a&gt; to see what prefix you will need.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;h2&gt;&lt;span style="font-size:85%;"&gt;Local International Numbers&lt;/span&gt;&lt;/h2&gt; &lt;span style="font-size:85%;"&gt;In addition to providing free softphone access for our developers, voxeo has recently unvelied a new offering that is bound to prove useful to our Community Members. Thats right, voxeo now offers local access numbers to a broader spectrum of players in the worldwide market. This means that instead of dialing an 800+PIN code to access your applications, you can dial a free *local* number to access our application PIN system!&lt;br /&gt;&lt;br /&gt;Voxeo currently has local access numbers deployed on a trial basis for the following markets for our 800+PIN system:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;table class="docTable"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="docTH"&gt;Local Access Number&lt;/td&gt; &lt;td class="docTH"&gt;Locale&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt;  &lt;td class="docTD"&gt;+44-20-7043 7144&lt;/td&gt;  &lt;td class="docTD"&gt;London, UK&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt;  &lt;td class="docTD"&gt;+34-93-2395107&lt;/td&gt;  &lt;td class="docTD"&gt;Barcelona, Spain&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt;  &lt;td class="docTD"&gt;+39-06-43408608&lt;/td&gt;  &lt;td class="docTD"&gt;Roma, Italy&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt;  &lt;td class="docTD"&gt;+972-2-649 9751&lt;/td&gt;  &lt;td class="docTD"&gt;Jerusalem, Israel&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt;  &lt;td class="docTD"&gt;+372-6-976953&lt;/td&gt;  &lt;td class="docTD"&gt;Tallinn, Estonia&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt;  &lt;td class="docTD"&gt;+55-21-3523 4238&lt;/td&gt;  &lt;td class="docTD"&gt;Rio de Janeiro, Brazil&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt;  &lt;td class="docTD"&gt;+1-617-507 7122&lt;/td&gt;  &lt;td class="docTD"&gt;Boston, USA&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Throughout the rest of the year, we will be adding additional direct-dial numbers for different locales available on the system, so remember: whichever locales receive the most requests will be first in line; make your voice heard!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8931614446266229542-139260154942349046?l=kenanlee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenanlee.blogspot.com/feeds/139260154942349046/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8931614446266229542&amp;postID=139260154942349046' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/139260154942349046'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/139260154942349046'/><link rel='alternate' type='text/html' href='http://kenanlee.blogspot.com/2007/05/accessing-voip-destinations.html' title='Accessing VoIP Destinations'/><author><name>Nan Li</name><uri>http://www.blogger.com/profile/02756910278237685893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8931614446266229542.post-6318306826736604195</id><published>2007-05-03T23:44:00.000+08:00</published><updated>2007-05-03T23:49:14.910+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='voip'/><category scheme='http://www.blogger.com/atom/ns#' term='XML'/><title type='text'>VOIP: What is CCXML?</title><content type='html'>&lt;a href="http://www.voxeo.com/library/ccxml.jsp" class="hover"&gt;&lt;span class="ivr_title"&gt;What is CCXML?&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt; &lt;p&gt;     CCXML - or Call Control XML - is the W3C standard markup language for controlling how phone     calls are placed, answered, transfered, conferenced, and more. CCXML works hand-in-hand     with VoiceXML to provide a 100% standards and XML based solution for any telephony application. &lt;/p&gt;  &lt;p&gt;     Voxeo supports CCXML in all of our VoiceCenter and VoipCenter  products.  Voxeo also sells an OEM C++ source code CCXML engine.  Our CCXML products have routed over 1 billion calls since commercial introduction in 2002. &lt;/p&gt;  &lt;p&gt;     Below you will find a great &lt;a href="http://www.voxeo.com/library/ccxml.jsp#ccxml-intro" title="IVR"&gt;introduction to CCXML&lt;/a&gt; by RJ Auburn, Voxeo's CTO - who is also     the editor and chair of the CCXML standard.    In addition, you'll find a &lt;a href="http://www.voxeo.com/library/ccxml.jsp#ccxml-exec" title="IVR"&gt;CCXML executive     briefing&lt;/a&gt; that details the benefits of CCXML.       Finally, you can review Voxeo's complete CCXML reference guide     and tutorials      &lt;a href="http://www.ccxml-guide.com/" title="IVR"&gt;here.&lt;/a&gt; &lt;/p&gt;  &lt;hr class="dotted"&gt;  &lt;anull name="ccxml-intro" title="IVR"&gt; &lt;br /&gt;&lt;/anull&gt;&lt;h2&gt;Introduction to CCXML&lt;/h2&gt;  &lt;p&gt;     &lt;b&gt;     RJ Auburn&lt;br /&gt;    Chief Technology Officer, Voxeo Corporation&lt;br /&gt;    Editor and Chair, W3C CCXML working group&lt;br /&gt;    &lt;/b&gt; &lt;/p&gt;  &lt;p&gt; As editor of the new CCXML specification I am proud to report that the W3C has just released the first working draft of CCXML, a language to provide Call Control support for telephone applications. &lt;/p&gt; &lt;br /&gt;&lt;h2&gt;What is Call Control?&lt;/h2&gt; &lt;p&gt;Newton's Telecom Dictionary, 16th edition, defines Call Control as "the term used by the telephone industry to describe setting up, monitoring, and tearing down telephone calls". Fundamentally, Call Control is session control for telephone calls. &lt;/p&gt; &lt;br /&gt;&lt;h2&gt;What is CCXML?&lt;/h2&gt; &lt;p&gt;Traditionally, Call Control has required interaction with and understanding of telephony API's which often change from one platform to another. &lt;/p&gt;  &lt;p&gt;CCXML is the "Call Control eXtensible Markup Language". It is an XML based language that can control the setup, monitoring, and tear down of phone calls. CCXML allows the industry to leverage the strength of Web platforms and technologies to intelligently control calls on and off the telephone network. Additionally, CCXML will create a high-level industry standard for Call Control that can run over any telephony platform. &lt;/p&gt; &lt;br /&gt;&lt;h2&gt;Why not build Call Control into VoiceXML?&lt;/h2&gt; &lt;p&gt;VoiceXML was never designed to support advanced Call Control features - it was designed to be a dialog control language and it does that quite well. While VoiceXML does support basic Call Control features via the &lt;transfer&gt; tag, those features are in fact too basic for many telephony applications. Because of this limitation, vendors looked at adding Call Control to VoiceXML using several different approaches. Some companies added robust Call Control support by extending VoiceXML while others created their own Call Control languages such as CallXML from Voxeo. While these solutions provided enhanced Call Control support they were incompatible with each other and did not address all of the Call Control scenarios reviewed by the W3C. &lt;/p&gt;  &lt;p&gt;VoiceXML controls the presentation of media inside of calls. It uses a model based on forms and transactions that occur in a linear fashion - a model that works very well for user driven voice interfaces. Call Control uses a model based on events and commands that can occur at any time. The fundamental differences in these models made it very difficult - if not impossible - to deliver robust Call Control inside of VoiceXML itself. &lt;/p&gt;  &lt;p&gt;Additionally, many W3C members and telephone industry leaders wanted a language that could be used outside of VoiceXML itself. While only some phone calls require automated voice interaction, every phone call requires Call Control. As a result, CCXML could end up being used and supported by everything from PBX's to the telephone switches that run the phone network itself. Many of these telephony platforms have no need or support for the things VoiceXML itself can do. &lt;/p&gt; &lt;br /&gt;&lt;h2&gt;What does CCXML allow you to do?&lt;/h2&gt; &lt;p&gt; There are a number of features that VoiceXML currently can't supply that CCXML will: &lt;/p&gt; &lt;ul&gt;&lt;li&gt;Support for multi-party conferencing, plus more advanced conference and audio control. Any telephone conferencing application requires such features.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; The ability to give each active line in a voice application its own dedicated VoiceXML interpreter. Currently, many VoiceXML platforms initiate a second call or "call leg" to transfer a call from an automated VoiceXML platform to another telephone user. The second leg of a transferred call on these platforms lacks a VoiceXML interpreter of its own, limiting the scope of possible applications that can occur on that second leg.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; Sophisticated multiple-call handling and control, including the ability to place outgoing calls at any time, initiated outside of the VoiceXML platform.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; Handling for richer and more asynchronous events. Advanced telephony operations involve substantial signaling, status events, and message-passing. VoiceXML does not currently have a way to integrate these asynchronous "external" events into its event-processing model.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; An ability to receive events and messages from systems outside of the CCXML or VoiceXML platform. Interaction with an outside call center platform, calls started asynchronously from the VoiceXML platform, and communication between multiple "clustered" VoiceXML or CCXML platforms all require event interaction from one platform to another. &lt;/li&gt;&lt;/ul&gt; CCXML allows developers to write advanced applications that require these features. Examples of such applications include &lt;ul&gt;&lt;li&gt;"Follow me, Find me" applications that find the person you are trying to call by dialing their cell phone, home phone, and office phone in parallel.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; Call center applications that intelligently gather information from the caller and then pass that information on to the call center agent. &lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;The W3C Voice Browser Working Group decided to tackle Call Control and came up with a set of comprehensive requirements that address the Call Control needs of almost all voice applications. After reviewing those requirements several proposals were submitted. CCXML is the result of those proposals. &lt;/p&gt; &lt;br /&gt;&lt;h2&gt;What does CCXML bring to VoiceXML?&lt;/h2&gt; &lt;p&gt;CCXML adds robust Call Control support to VoiceXML. However CCXML could also be used with other dialog systems such as a traditional IVR (Interactive Voice Response) platforms created before VoiceXML was available. &lt;/p&gt;  &lt;p&gt;One critical thing to understand is that CCXML is not a media/dialog language like VoiceXML. It only provides support to move calls around and connect them to dialog resources. CCXML does not provide any dialog resources on its own. (Note: A dialog resource is anything that interacts with a caller via voice, such as a VoiceXML platform or even a second caller at another location.) &lt;/p&gt; &lt;br /&gt;&lt;h2&gt;What does CCXML look like?&lt;/h2&gt; &lt;p&gt; Let's create a CCXML application. The following example was  written on the Voxeo CCXML platform implementation.  You can access Voxeo CCXML platform for free by signing  up at &lt;a href="http://community.voxeo.com/" title="IVR"&gt;http://community.voxeo.com&lt;/a&gt;.  &lt;/p&gt;  &lt;h3&gt;The First Step&lt;/h3&gt; &lt;p&gt; Lets  start with the equivalent of a hello world application  that conditionally answers the phone based on your caller  id, plays a VoiceXML dialog and then hangs up. Being  able to conditionally answer a call is one of the new  features that CCXML brings to VoiceXML applications.  &lt;/p&gt;  &lt;p&gt;   To  start off we create a XML tag and a &lt;ccxml&gt; tag  for the document. These are required in all CCXML documents. &lt;/p&gt;                             &lt;pre class="code"&gt;&lt;?xml version="1.0"encoding="UTF-8"?&gt;&lt;br /&gt;&lt;ccxml version="1.0"&gt;&lt;br /&gt;&lt;/ccxml&gt;   &lt;br /&gt;&lt;/pre&gt; &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Event Handlers&lt;/h3&gt; &lt;p&gt;     CCXML is based on a state machine model. &lt;/p&gt;  &lt;p&gt; In general, a state machine is any program that stores  the status of something at a given time and can operate  on input (ie: telephony events) to change the state  of the "machine" and can optionally cause  an action to occur. State machines are used to develop  and describe specific device or program interactions. &lt;/p&gt;  &lt;p&gt; To summarize, a state machine can be described as: &lt;/p&gt;  &lt;ul&gt;&lt;li&gt;An      initial state or record&lt;/li&gt;&lt;li&gt;A      set of possible input events&lt;/li&gt;&lt;li&gt;A      set of new states that may result from the input&lt;/li&gt;&lt;li&gt;A      set of possible actions or output events that result      from a new state&lt;br /&gt;    &lt;/li&gt;&lt;/ul&gt;    &lt;p&gt; In their book Real-time Object-oriented Modeling, Bran Selic  &amp; Garth Gullekson view a state machine as: &lt;/p&gt;  &lt;ul&gt;&lt;li&gt;A      set of states&lt;/li&gt;&lt;li&gt;A      description of the initial state&lt;/li&gt;&lt;li&gt;A      set of input events&lt;/li&gt;&lt;li&gt;A      set of output events&lt;/li&gt;&lt;li&gt;A      function that maps states and input to output&lt;/li&gt;&lt;li&gt;A      function that maps states and inputs to states called      a state "transition" &lt;/li&gt;&lt;/ul&gt;  &lt;p&gt; There  are a number of ways to represent state machines, from  simple tables, to C switch and case statements, to graphical  design tools. CCXML uses XML tags to represent the state  machine which will control one or more telephone calls. &lt;/p&gt;  &lt;p&gt; The  CCXML &lt;eventhandler&gt; tag contains all the event  handlers, or "transitions" for our call-control  application. In CCXML you write an event handler for  your application and then the handlers transition tags  will receive all the matching events that occur during  a call. &lt;/p&gt;  &lt;pre class="code"&gt;&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;br /&gt;&lt;ccxml version="1.0"&gt;&lt;br /&gt;  &lt;eventhandler&gt;&lt;br /&gt;&lt;br /&gt;    &lt;!-- Lets handle the incoming call --&gt;&lt;br /&gt;    &lt;transition event="connection.CONNECTION_ALERTING" name="evt"&gt;&lt;br /&gt;      &lt;log expr="'The caller ID is ' + evt.callerid + '.'"&gt;&lt;br /&gt;      &lt;if cond="evt.callerid == '8315551234'"&gt;&lt;br /&gt;        &lt;accept/&gt;&lt;br /&gt;      &lt;else/&gt;&lt;br /&gt;        &lt;reject/&gt;&lt;br /&gt;      &lt;/if&gt;&lt;br /&gt;    &lt;/transition&gt;&lt;br /&gt;  &lt;/eventhandler&gt;&lt;br /&gt;&lt;/ccxml&gt;&lt;br /&gt;&lt;/pre&gt; &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;We Are Now Connected &lt;/h3&gt; &lt;p&gt; Next we add a &lt;transition&gt; tag for the call that  we just answered. We are looking for the "connection.CONNECTION_CONNECTED"  event. This event will only come into the CCXML platform  once the call has been connected. &lt;/p&gt;  &lt;pre class="code"&gt;&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;br /&gt;&lt;ccxml version="1.0"&gt;&lt;br /&gt;  &lt;eventhandler&gt;&lt;br /&gt;&lt;br /&gt;    &lt;!-- Lets handle the incoming call --&gt;&lt;br /&gt;    &lt;transition event="connection.CONNECTION_ALERTING" name="evt"&gt; &lt;br /&gt;      &lt;log expr="'The caller ID is ' + evt.callerid + '.'"&gt;&lt;br /&gt;      &lt;if cond="evt.callerid == '8315551234'"&gt;&lt;br /&gt;        &lt;accept/&gt;&lt;br /&gt;      &lt;else/&gt;&lt;br /&gt;        &lt;reject/&gt;&lt;br /&gt;      &lt;/if&gt;&lt;br /&gt;    &lt;/transition&gt;&lt;br /&gt;&lt;br /&gt;    &lt;!-- Lets handle the call being answered --&gt;&lt;br /&gt;    &lt;transition event="connection.CONNECTION_CONNECTED"&gt;&lt;br /&gt;    &lt;/transition&gt;&lt;br /&gt;  &lt;/eventhandler&gt;&lt;br /&gt;&lt;/ccxml&gt;&lt;br /&gt;&lt;/pre&gt; &lt;br /&gt;&lt;br /&gt;                    &lt;h3&gt;Running a Dialog&lt;/h3&gt; &lt;p&gt; Let's start a VoiceXML dialog script from the connected  call event handler on the call we are connected to.  We do this with the &lt;dialogstart&gt; tag and by  specifying the URL source of the VoiceXML document  we want to run. Once we do this the CCXML platform  will connect the call to a VoiceXML resource and play  the script to the caller. &lt;/p&gt;                              &lt;pre class="code"&gt;&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;br /&gt;&lt;ccxml version="1.0"&gt;&lt;br /&gt;  &lt;eventhandler&gt;&lt;br /&gt;&lt;br /&gt;    &lt;!-- Lets handle the incoming call --&gt;&lt;br /&gt;    &lt;transition event="connection.CONNECTION_ALERTING" name="evt"&gt; &lt;br /&gt;      &lt;log expr="'The caller ID is ' + evt.callerid + '.'"&gt;&lt;br /&gt;      &lt;if cond="evt.callerid == '8315551234'"&gt;&lt;br /&gt;        &lt;accept/&gt;&lt;br /&gt;      &lt;else/&gt;&lt;br /&gt;        &lt;reject/&gt;&lt;br /&gt;      &lt;/if&gt;&lt;br /&gt;    &lt;/transition&gt;&lt;br /&gt;&lt;br /&gt;    &lt;!--  Lets answer the call --&gt;&lt;br /&gt;    &lt;transition event="connection.CONNECTION_CONNECTED"&gt;&lt;br /&gt;      &lt;log expr="'Call was answered. We are going to start a dialog.'"&gt;&lt;br /&gt;      &lt;dialogstart src="'hello.vxml'"&gt;&lt;br /&gt;    &lt;/transition&gt;&lt;br /&gt;  &lt;/eventhandler&gt;&lt;br /&gt;&lt;/ccxml&gt;&lt;br /&gt;&lt;/pre&gt;                          &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Here is the content of hello.vxml:&lt;/h3&gt; &lt;pre class="code"&gt;&lt;?xml version="1.0"?&gt;&lt;br /&gt;&lt;!DOCTYPE vxml PUBLIC '-//Nuance/DTD VoiceXML&lt;br /&gt;1.0//EN' 'http://voicexml.nuance.com/dtd/nuancevoicexml-1-2.dtd' &gt;&lt;br /&gt;&lt;vxml version="1.0"&gt;&lt;br /&gt;  &lt;form id="Form"&gt;&lt;br /&gt;     &lt;block&gt;&lt;br /&gt;        Hello World.&lt;br /&gt;        &lt;exit/&gt;&lt;br /&gt;     &lt;/block&gt;&lt;br /&gt;   &lt;/form&gt;&lt;br /&gt;&lt;/vxml&gt;&lt;br /&gt;&lt;/pre&gt; &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Ending a Dialog&lt;/h3&gt; &lt;p&gt; We now add the &lt;transition&gt; tag to catch the event  that indicates the VoiceXML dialog has ended. We do  this by catching the "dialog.exit" event.  &lt;/p&gt;&lt;pre class="code"&gt;&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;br /&gt;&lt;ccxml version="1.0"&gt;&lt;br /&gt;  &lt;eventhandler&gt;&lt;br /&gt;&lt;br /&gt;  &lt;!-- Lets handle the incoming call --&gt;&lt;br /&gt;    &lt;transition event="connection.CONNECTION_ALERTING" name="evt"&gt;&lt;br /&gt;      &lt;log expr="'The caller ID is ' + evt.callerid + '.'"&gt;&lt;br /&gt;      &lt;if cond="evt.callerid == '8315551234'"&gt;&lt;br /&gt;        &lt;accept/&gt;&lt;br /&gt;      &lt;else/&gt;&lt;br /&gt;        &lt;reject/&gt;&lt;br /&gt;      &lt;/if&gt;&lt;br /&gt;    &lt;/transition&gt; &lt;br /&gt;&lt;br /&gt;    &lt;!-- Lets handle the call being answered --&gt;&lt;br /&gt;    &lt;transition event="connection.CONNECTION_CONNECTED"&gt;&lt;br /&gt;      &lt;log expr="'Call was answered. We are going to start a dialog.'"&gt;&lt;br /&gt;      &lt;dialogstart src="'hello.vxml'"&gt;&lt;br /&gt;    &lt;/transition&gt;&lt;br /&gt;    &lt;transition event="dialog.exit"&gt;&lt;br /&gt;    &lt;/transition&gt;&lt;br /&gt;  &lt;/eventhandler&gt;&lt;br /&gt;&lt;/ccxml&gt;&lt;br /&gt;&lt;/pre&gt; &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Disconnecting&lt;/h3&gt; &lt;p&gt;                             Next we add the &lt;disconnect&gt; tag to the dialog exit  handler to disconnect the caller from the CCXML platform.  We will also write to the log using Voxeo's &lt;log&gt; tag. &lt;/p&gt;                              &lt;pre class="code"&gt;&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;br /&gt;&lt;ccxml version="1.0"&gt;&lt;br /&gt;  &lt;eventhandler&gt;&lt;br /&gt;&lt;br /&gt;  &lt;!-- Lets handle the incoming call --&gt;&lt;br /&gt;    &lt;transition event="connection.CONNECTION_ALERTING" name="evt"&gt;&lt;br /&gt;    &lt;log expr="'The caller ID is ' + evt.callerid + '.'"&gt;&lt;br /&gt;      &lt;if cond="evt.callerid == '8315551234'"&gt;&lt;br /&gt;        &lt;accept/&gt;&lt;br /&gt;      &lt;else/&gt;&lt;br /&gt;        &lt;reject/&gt;&lt;br /&gt;      &lt;/if&gt;&lt;br /&gt;    &lt;/transition&gt;&lt;br /&gt;&lt;br /&gt;    &lt;!-- Lets handle the call being answered --&gt;&lt;br /&gt;    &lt;transition event="connection.CONNECTION_CONNECTED"&gt;&lt;br /&gt;      &lt;log expr="'Call was answered. We are going to start a dialog.'"&gt;&lt;br /&gt;      &lt;dialogstart src="'hello.vxml'"&gt;&lt;br /&gt;    &lt;/transition&gt;&lt;br /&gt;&lt;br /&gt;    &lt;transition event="dialog.exit"&gt;&lt;br /&gt;      &lt;log expr="'We got a dialog.exit event.'"&gt;&lt;br /&gt;      &lt;disconnect/&gt;&lt;br /&gt;    &lt;/transition&gt;&lt;br /&gt;  &lt;/eventhandler&gt;&lt;br /&gt;&lt;/ccxml&gt;&lt;br /&gt;&lt;/pre&gt; &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Ending the Call&lt;/h3&gt; &lt;p&gt; We are almost done with our first CCXML script. We only  need to add some clean up code to exit the CCXML interrupter.  We do this by adding a &lt;transition&gt; tag to catch  the "call.CALL_INVALID" event: &lt;/p&gt;                   &lt;pre class="code"&gt;                           &lt;br /&gt;&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;br /&gt;&lt;ccxml version="1.0"&gt;&lt;br /&gt;  &lt;eventhandler&gt;&lt;br /&gt;&lt;br /&gt;    &lt;!-- Lets handle the incoming call --&gt;&lt;br /&gt;    &lt;transition event="connection.CONNECTION_ALERTING" name="evt"&gt;&lt;br /&gt;      &lt;log expr="'The caller ID is ' + evt.callerid + '.'"&gt;&lt;br /&gt;      &lt;if cond="evt.callerid == '8315551234'"&gt;&lt;br /&gt;        &lt;accept/&gt;&lt;br /&gt;      &lt;else/&gt;&lt;br /&gt;        &lt;reject/&gt;&lt;br /&gt;      &lt;/if&gt;&lt;br /&gt;    &lt;/transition&gt;&lt;br /&gt;&lt;br /&gt;    &lt;!-- Lets handle the call being answered --&gt;&lt;br /&gt;    &lt;transition event="connection.CONNECTION_CONNECTED"&gt;&lt;br /&gt;      &lt;log expr="'Call was answered. We are going to start a dialog.'"&gt;&lt;br /&gt;      &lt;dialogstart src="'hello.vxml'"&gt;&lt;br /&gt;    &lt;/transition&gt;&lt;br /&gt;    &lt;transition event="dialog.exit"&gt;&lt;br /&gt;      &lt;log expr="'We got a dialog.exit event.'"&gt;&lt;br /&gt;      &lt;disconnect/&gt;&lt;br /&gt;    &lt;/transition&gt;&lt;br /&gt;&lt;br /&gt;    &lt;!-- Lets clean up the call --&gt;&lt;br /&gt;    &lt;transition event="call.CALL_INVALID"&gt;&lt;br /&gt;    &lt;/transition&gt;&lt;br /&gt;  &lt;/eventhandler&gt;&lt;br /&gt;&lt;/ccxml&gt;&lt;br /&gt;&lt;/pre&gt; &lt;br /&gt;&lt;br /&gt;              &lt;h3&gt;The End Is Nigh&lt;/h3&gt; &lt;p&gt; Finally we add a handler for the call_invalid event that occurs  when a call ends, including an &lt;exit&gt; tag to  leave the CCXML platform: &lt;/p&gt;  &lt;pre class="code"&gt;&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;br /&gt;&lt;ccxml version="1.0"&gt;&lt;br /&gt;  &lt;eventhandler&gt;&lt;br /&gt;&lt;br /&gt;    &lt;!-- Lets handle the incoming call --&gt;&lt;br /&gt;    &lt;transition event="connection.CONNECTION_ALERTING" name="evt"&gt;&lt;br /&gt;      &lt;log expr="'The called ID is ' + evt.calledid + '.'"&gt;&lt;br /&gt;      &lt;if cond="evt.callerid == '8315551234'"&gt;&lt;br /&gt;        &lt;accept/&gt;&lt;br /&gt;      &lt;else/&gt;&lt;br /&gt;        &lt;reject/&gt;&lt;br /&gt;      &lt;/if&gt;&lt;br /&gt;    &lt;/transition&gt;&lt;br /&gt;&lt;br /&gt;    &lt;!-- Lets handle the call being answered --&gt;&lt;br /&gt;    &lt;transition event="connection.CONNECTION_CONNECTED"&gt;&lt;br /&gt;      &lt;log expr="'Call was answered. We are going to start a dialog.'"&gt;&lt;br /&gt;      &lt;dialogstart src="'hello.vxml'"&gt;&lt;br /&gt;    &lt;/transition&gt;&lt;br /&gt;    &lt;transition event="dialog.exit"&gt;&lt;br /&gt;      &lt;log expr="'We got a dialog.exit event.'"&gt;&lt;br /&gt;      &lt;disconnect/&gt;&lt;br /&gt;    &lt;/transition&gt;&lt;br /&gt;&lt;br /&gt;    &lt;!-- Lets clean up the call --&gt;&lt;br /&gt;    &lt;transition event="call.CALL_INVALID"&gt;&lt;br /&gt;      &lt;log expr="'The End is Nigh!.'"&gt;&lt;br /&gt;      &lt;exit/&gt;&lt;br /&gt;    &lt;/transition&gt;&lt;br /&gt;  &lt;/eventhandler&gt;&lt;br /&gt;&lt;/ccxml&gt;&lt;br /&gt;&lt;/pre&gt; &lt;br /&gt;&lt;p&gt;                       Congratulations, you have now written your very first  CCXML application! If you would like to learn more  about CCXML there are a number of tutorials that will  help get you up to speed on of CCXML that you can  access at &lt;a href="http://community.voxeo.com/" title="IVR"&gt;http://community.voxeo.com&lt;/a&gt; &lt;/p&gt;                     &lt;hr class="dotted"&gt; &lt;br /&gt;&lt;anull name="ccxml-exec" title="IVR"&gt;  &lt;/anull&gt;&lt;h3&gt;CCXML Executive Briefing&lt;/h3&gt; &lt;p&gt;     Companies are recognizing the important role that advanced call control     functionality plays in effectively communicating with customers, employees     and partners.  The challenge is finding a cost-effective method that leverages     existing Web and data systems investments to delight customers and deliver     significant returns.  Using a band-aid approach to upgrade older      generation, proprietary Interactive Voice Response (IVR) and contact     center systems is very expensive and ineffective in the long run.     Widely popular, open standards VoiceXML solutions are a big step in the     right direction...  &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8931614446266229542-6318306826736604195?l=kenanlee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenanlee.blogspot.com/feeds/6318306826736604195/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8931614446266229542&amp;postID=6318306826736604195' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/6318306826736604195'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/6318306826736604195'/><link rel='alternate' type='text/html' href='http://kenanlee.blogspot.com/2007/05/voip-what-is-ccxml.html' title='VOIP: What is CCXML?'/><author><name>Nan Li</name><uri>http://www.blogger.com/profile/02756910278237685893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8931614446266229542.post-6581163904497078078</id><published>2007-04-29T13:40:00.000+08:00</published><updated>2007-04-29T13:41:28.726+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Windows to Ubuntu Transition Guide</title><content type='html'>From  &lt;a href="http://www.pcmech.com/show/os/917/"&gt;http://www.pcmech.com/show/os/917/&lt;/a&gt;&lt;b mryed="2"&gt;&lt;br /&gt;&lt;/b&gt;&lt;span name="KonaBody" dyyzf="true" mryed="2"&gt;&lt;p mryed="2"&gt;&lt;b mryed="2"&gt;Preface&lt;/b&gt;&lt;/p&gt; &lt;p mryed="2"&gt;Alright, so you have successfully &lt;a href="http://www.pcmech.com/show/os/903/" target="132" mryed="2"&gt;installed Ubuntu  Linux&lt;/a&gt;, but now what do you do with it? You are in the right place. I am  going to get you started with a guide on how to use your new Ubuntu system. This  transition guide is targeted at existing Windows users and will show you how to  do program installations, a little system configuration, but primarily highlight  some Windows "replacement" programs for common applications you can't live  without. This guide's intent is to introduce you to equivalent programs to what  you are accustomed to and, hopefully, to cover a good amount of what you might  want in a new install. I am basing the content on what I have personally  experienced, email feedback from my installation article, questions from the &lt;a href="http://forum.pcmech.com/" target="132" mryed="2"&gt;PC Mech Forums&lt;/a&gt;, and  common topics from the &lt;a href="http://www.ubuntuforums.org/" target="132" mryed="2"&gt;Ubuntu Forums&lt;/a&gt;. Hopefully this will answer a lot of questions you  may have before you ever have them.&lt;/p&gt; &lt;p mryed="2"&gt;There is no prior Linux experience needed to follow anything I will  go over, however I am going to make the assumption you have at least played  around in Ubuntu for a bit. I am not going to be covering the basics on how to  use the interface, as it is quite similar to Windows. Here is a quick breakdown  of the topics I will be covering:  &lt;/p&gt;&lt;ul mryed="2"&gt;&lt;li mryed="2"&gt;Configuring and using Synaptic Package Manager to install  applications  &lt;/li&gt;&lt;li mryed="2"&gt;Installing common packages with Automatix  &lt;/li&gt;&lt;li mryed="2"&gt;Essential desktop, office, and Internet applications  &lt;/li&gt;&lt;li mryed="2"&gt;Playing movies and music  &lt;/li&gt;&lt;li mryed="2"&gt;Games  &lt;/li&gt;&lt;li mryed="2"&gt;Digital cameras, printing, and burning  &lt;/li&gt;&lt;li mryed="2"&gt;Installing a PHP and MySQL enabled Apache web server  &lt;/li&gt;&lt;li mryed="2"&gt;Development tools  &lt;/li&gt;&lt;li mryed="2"&gt;Installing and configuring a firewall  &lt;/li&gt;&lt;li mryed="2"&gt;Setting up remote desktop connection  &lt;/li&gt;&lt;li mryed="2"&gt;Setting up a &lt;a class="kLink" id="KonaLink0" href="#" target="_top"&gt;&lt;span style="font-weight: 400; font-size: 12px; color: blue ! important; font-family: arial,verdana,helvetica,sans-serif; position: static;color:blue;" &gt;&lt;span class="kLink" style="font-weight: 400; font-size: 12px; color: blue ! important; font-family: arial,verdana,helvetica,sans-serif; position: relative;"&gt;streaming  &lt;/span&gt;&lt;span class="kLink" style="font-weight: 400; font-size: 12px; color: blue ! important; font-family: arial,verdana,helvetica,sans-serif; position: relative;"&gt;music&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;  server&lt;/li&gt;&lt;/ul&gt;  &lt;p mryed="1"&gt;Since this article's intent is to be a beginner's guide to Ubuntu  Linux, I am going to be using the graphical interface for pretty much  everything. As experienced Linux users may know, and you will soon find out,  everything we are going to be doing can be done much quicker through the command  line. Of course, this is not very user friendly, and a very un-Windows way to do  things, so again, we will be sticking to the Ubuntu GUI (Graphical User  Interface).&lt;/p&gt; &lt;p mryed="1"&gt;As you are reading, please bear in mind that &lt;a href="http://linux.oneandoneis2.org/LNW.htm" target="_blank" mryed="1"&gt;Linux is  not Windows&lt;/a&gt;. At a high level they appear to operate basically the same, but  they are fundamentally different. Just keep an open mind and I promise learning  Ubuntu Linux will be well worth your time.&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8931614446266229542-6581163904497078078?l=kenanlee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenanlee.blogspot.com/feeds/6581163904497078078/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8931614446266229542&amp;postID=6581163904497078078' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/6581163904497078078'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/6581163904497078078'/><link rel='alternate' type='text/html' href='http://kenanlee.blogspot.com/2007/04/windows-to-ubuntu-transition-guide.html' title='Windows to Ubuntu Transition Guide'/><author><name>Nan Li</name><uri>http://www.blogger.com/profile/02756910278237685893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8931614446266229542.post-4485289290046219968</id><published>2007-04-29T13:30:00.000+08:00</published><updated>2007-04-29T13:35:44.296+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Windows and Ubuntu on One PC-By setting up your PC to dual-boot, you can easily take Linux for a test-drive.</title><content type='html'>&lt;p&gt;"Linux rocks!" "No, it's lame--stick with Windows!" Visit any Web site or  online forum where impassioned computer users debate the relative merits of  operating systems, and you'll find endless disagreement. The only way to  determine which operating system fits your needs is to run both on the same PC,  configured for dual-booting. You also need to be able to access your data files  from either OS, which is the trickiest part of the process. &lt;/p&gt; &lt;p&gt;Creating a dual-boot setup on a Windows machine is as easy as selecting that  option when you install Ubuntu. As you switch between the two operating systems  in your day-to-day work, you'll be able to assess for yourself the killer  features, incompatibilities, and showstopping flaws that make one a better  choice than the other. &lt;/p&gt; &lt;p&gt;On a dual-boot system, Linux and Windows reside on separate disk partitions,  each of which is formatted differently. Even though the file systems are  incompatible, most recent versions of Linux can at least read files on Windows  XP's NTFS partitions, though this may not be enabled by default. Few Linux  distributions can write files to an NTFS partition right out of the box, and the  reliability of this function hasn't yet been proven, so trust it at your data's  peril. In addition, the software required to write files from Linux to NTFS  drives is difficult to download and install. &lt;/p&gt; &lt;p&gt;Windows, conversely, lacks the native ability to read and write files on any  of the several Linux file systems. The nifty and free &lt;a href="http://find.pcworld.com/55672"&gt;Ext2 Installable File System for  Windows&lt;/a&gt; permits Windows XP to read and write in the Ext2 and Ext3 file  systems many Linux distributions use (it doesn't work with the ReiserFS file  system, however). While this is handy, especially if you spend most of your time  using Linux and you keep your files there, I recommend another option: creating  a separate partition for your data that uses the older FAT32 file system, which  both Linux and Windows XP can read from and write to. In fact, FAT32 has been  included with every version of Windows since 95's Service Release 2. &lt;/p&gt; &lt;p&gt;FAT32 lacks the user-access security features of Linux's Ext2/3 and Windows'  NTFS, but creating a separate FAT32 partition for your data allows you to  install or upgrade your operating systems without having to back up or restore  your data files. It also lets you read and write that data with minimal add-on  downloading and configuration. If you need some assistance in resizing your  existing partitions to create a new FAT32 partition, look no further than the  free &lt;a href="http://find.pcworld.com/55673"&gt;Partition Logic&lt;/a&gt; utility.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8931614446266229542-4485289290046219968?l=kenanlee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenanlee.blogspot.com/feeds/4485289290046219968/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8931614446266229542&amp;postID=4485289290046219968' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/4485289290046219968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/4485289290046219968'/><link rel='alternate' type='text/html' href='http://kenanlee.blogspot.com/2007/04/windows-and-ubuntu-on-one-pc-by-setting.html' title='Windows and Ubuntu on One PC-By setting up your PC to dual-boot, you can easily take Linux for a test-drive.'/><author><name>Nan Li</name><uri>http://www.blogger.com/profile/02756910278237685893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8931614446266229542.post-5652606650825128219</id><published>2007-04-28T21:43:00.000+08:00</published><updated>2007-04-28T21:45:27.961+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Vim'/><title type='text'>Basic vi Commands</title><content type='html'>&lt;table class="table" border="1" cellpadding="3"&gt; &lt;caption style="font-weight: bold;" class="table"&gt;&lt;a class="title" name="VI6-CH-2-TAB-0"&gt;Edit  Commands&lt;/a&gt;&lt;/caption&gt; &lt;thead class="thead"&gt; &lt;tr class="row" valign="top"&gt; &lt;th class="entry" align="left"&gt;Text Object&lt;/th&gt; &lt;th class="entry" align="left"&gt;Change&lt;/th&gt; &lt;th class="entry" align="left"&gt;Delete&lt;/th&gt; &lt;th class="entry" align="left"&gt;Copy&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt; &lt;tbody class="tbody"&gt; &lt;tr class="row" valign="top"&gt; &lt;td class="entry"&gt;1 word&lt;/td&gt; &lt;td class="entry"&gt;&lt;code class="literal"&gt;cw&lt;/code&gt;&lt;/td&gt; &lt;td class="entry"&gt;&lt;code class="literal"&gt;dw&lt;/code&gt;&lt;/td&gt; &lt;td class="entry"&gt;&lt;code class="literal"&gt;yw&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr class="row" valign="top"&gt; &lt;td class="entry"&gt; &lt;p class="para"&gt;2 words, not counting punctuation&lt;/p&gt;&lt;/td&gt; &lt;td class="entry"&gt;&lt;code class="literal"&gt;2cW&lt;/code&gt; or &lt;code class="literal"&gt;c2W&lt;/code&gt;&lt;/td&gt; &lt;td class="entry"&gt;&lt;code class="literal"&gt;2dW&lt;/code&gt; or &lt;code class="literal"&gt;d2W&lt;/code&gt;&lt;/td&gt; &lt;td class="entry"&gt;&lt;code class="literal"&gt;2yW&lt;/code&gt; or &lt;code class="literal"&gt;y2W&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr class="row" valign="top"&gt; &lt;td class="entry"&gt;3 words back&lt;/td&gt; &lt;td class="entry"&gt;&lt;code class="literal"&gt;3cb&lt;/code&gt; or &lt;code class="literal"&gt;c3b&lt;/code&gt;&lt;/td&gt; &lt;td class="entry"&gt;&lt;code class="literal"&gt;3db&lt;/code&gt; or &lt;code class="literal"&gt;d3b&lt;/code&gt;&lt;/td&gt; &lt;td class="entry"&gt;&lt;code class="literal"&gt;3yb&lt;/code&gt; or &lt;code class="literal"&gt;y3b&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr class="row" valign="top"&gt; &lt;td class="entry"&gt;1 line&lt;/td&gt; &lt;td class="entry"&gt;&lt;code class="literal"&gt;cc&lt;/code&gt;&lt;/td&gt; &lt;td class="entry"&gt;&lt;code class="literal"&gt;dd&lt;/code&gt;&lt;/td&gt; &lt;td class="entry"&gt;&lt;code class="literal"&gt;yy&lt;/code&gt; or &lt;code class="literal"&gt;Y&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr class="row" valign="top"&gt; &lt;td class="entry"&gt;To end of line&lt;/td&gt; &lt;td class="entry"&gt;&lt;code class="literal"&gt;c$&lt;/code&gt; or &lt;code class="literal"&gt;C&lt;/code&gt;&lt;/td&gt; &lt;td class="entry"&gt;&lt;code class="literal"&gt;d$&lt;/code&gt; or &lt;code class="literal"&gt;D&lt;/code&gt;&lt;/td&gt; &lt;td class="entry"&gt;&lt;code class="literal"&gt;y$&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr class="row" valign="top"&gt; &lt;td class="entry"&gt;To beginning of line&lt;/td&gt; &lt;td class="entry"&gt;&lt;code class="literal"&gt;c0&lt;/code&gt;&lt;/td&gt; &lt;td class="entry"&gt;&lt;code class="literal"&gt;d0&lt;/code&gt;&lt;/td&gt; &lt;td class="entry"&gt;&lt;code class="literal"&gt;y0&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr class="row" valign="top"&gt; &lt;td class="entry"&gt;Single character&lt;/td&gt; &lt;td class="entry"&gt;&lt;code class="literal"&gt;r&lt;/code&gt;&lt;/td&gt; &lt;td class="entry"&gt;&lt;code class="literal"&gt;x&lt;/code&gt; or &lt;code class="literal"&gt;X&lt;/code&gt;&lt;/td&gt; &lt;td class="entry"&gt;&lt;code class="literal"&gt;yl &lt;/code&gt;or &lt;code class="literal"&gt;yh&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr class="row" valign="top"&gt; &lt;td class="entry"&gt;Five characters&lt;/td&gt; &lt;td class="entry"&gt;&lt;code class="literal"&gt;5s&lt;/code&gt;&lt;/td&gt; &lt;td class="entry"&gt;&lt;code class="literal"&gt;5x&lt;/code&gt;&lt;/td&gt; &lt;td class="entry"&gt;&lt;code class="literal"&gt;5yl&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;a class="indexterm" name="AUTOID-2792"&gt;&lt;/a&gt;&lt;a class="indexterm" name="AUTOID-2794"&gt;&lt;/a&gt;&lt;br /&gt;&lt;table class="table" border="1" cellpadding="3"&gt; &lt;caption style="font-weight: bold;" class="table"&gt;&lt;a class="title" name="VI6-CH-2-TAB-1"&gt;Movement&lt;/a&gt;&lt;/caption&gt; &lt;thead class="thead"&gt; &lt;tr class="row" valign="top"&gt; &lt;th class="entry" align="left"&gt;Movement&lt;/th&gt; &lt;th class="entry" align="left"&gt;Commands&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt; &lt;tbody class="tbody"&gt; &lt;tr class="row" valign="top"&gt; &lt;td class="entry"&gt;&lt;img alt="&lt;-" src="../chars/larr.gif" /&gt;,&lt;img alt="-v" src="../chars/darr.gif" /&gt;,&lt;img alt="-^" src="../chars/uarr.gif" /&gt;, &lt;img alt="" /&gt;" src="../chars/rarr.gif"&gt;&lt;/td&gt; &lt;td class="entry"&gt; &lt;p class="para"&gt;&lt;code class="literal"&gt;h&lt;/code&gt;, &lt;code class="literal"&gt;j&lt;/code&gt;, &lt;code class="literal"&gt;k&lt;/code&gt;, &lt;code class="literal"&gt;l&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr class="row" valign="top"&gt; &lt;td class="entry"&gt;To first character of next line&lt;/td&gt; &lt;td class="entry"&gt;&lt;code class="literal"&gt;+&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr class="row" valign="top"&gt; &lt;td class="entry"&gt;To first character of previous line&lt;/td&gt; &lt;td class="entry"&gt;&lt;code class="literal"&gt;-&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr class="row" valign="top"&gt; &lt;td class="entry"&gt;To end of word&lt;/td&gt; &lt;td class="entry"&gt;&lt;code class="literal"&gt;e&lt;/code&gt; or &lt;code class="literal"&gt;E&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr class="row" valign="top"&gt; &lt;td class="entry"&gt;Forward by word&lt;/td&gt; &lt;td class="entry"&gt;&lt;code class="literal"&gt;w&lt;/code&gt; or &lt;code class="literal"&gt;W&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr class="row" valign="top"&gt; &lt;td class="entry"&gt;Backward by word&lt;/td&gt; &lt;td class="entry"&gt;&lt;code class="literal"&gt;b&lt;/code&gt; or &lt;code class="literal"&gt;B&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr class="row" valign="top"&gt; &lt;td class="entry"&gt;To end of line&lt;/td&gt; &lt;td class="entry"&gt;&lt;code class="literal"&gt;$&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr class="row" valign="top"&gt; &lt;td class="entry"&gt;To beginning of line&lt;/td&gt; &lt;td class="entry"&gt;&lt;code class="literal"&gt;0&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;table class="table" border="1" cellpadding="3"&gt; &lt;caption style="font-weight: bold;" class="table"&gt;&lt;a class="title" name="VI6-CH-2-TAB-2"&gt;Other  Operations&lt;/a&gt;&lt;/caption&gt; &lt;thead class="thead"&gt; &lt;tr class="row" valign="top"&gt; &lt;th class="entry" align="left"&gt;Operations&lt;/th&gt; &lt;th class="entry" align="left"&gt;Commands&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt; &lt;tbody class="tbody"&gt; &lt;tr class="row" valign="top"&gt; &lt;td class="entry"&gt;Place text from buffer&lt;/td&gt; &lt;td class="entry"&gt;&lt;code class="literal"&gt;P&lt;/code&gt; or &lt;code class="literal"&gt;p&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr class="row" valign="top"&gt; &lt;td class="entry"&gt;Start &lt;kbd class="command"&gt;vi&lt;/kbd&gt;, open file if specified&lt;/td&gt; &lt;td class="entry"&gt;&lt;code class="literal"&gt;vi&lt;/code&gt; &lt;code class="replaceable"&gt;&lt;i&gt;file&lt;/i&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr class="row" valign="top"&gt; &lt;td class="entry"&gt;Save edits, quit file&lt;/td&gt; &lt;td class="entry"&gt;&lt;code class="literal"&gt;ZZ&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr class="row" valign="top"&gt; &lt;td class="entry"&gt;No saving of edits, quit file&lt;/td&gt; &lt;td class="entry"&gt;&lt;code class="literal"&gt;:q!&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;a class="indexterm" name="AUTOID-2872"&gt;&lt;/a&gt;&lt;br /&gt;&lt;table class="table" border="1" cellpadding="3"&gt; &lt;caption style="font-weight: bold;" class="table"&gt;&lt;a class="title" name="VI6-CH-2-TAB-3"&gt;Text Creation  and Manipulation Commands&lt;/a&gt;&lt;/caption&gt; &lt;thead class="thead"&gt; &lt;tr class="row" valign="top"&gt; &lt;th class="entry" align="left"&gt;Editing Action&lt;/th&gt; &lt;th class="entry" align="left"&gt;Command&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt; &lt;tbody class="tbody"&gt; &lt;tr class="row" valign="top"&gt; &lt;td class="entry"&gt;Insert text at current position&lt;/td&gt; &lt;td class="entry"&gt;&lt;code class="literal"&gt;i&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr class="row" valign="top"&gt; &lt;td class="entry"&gt;Insert text at beginning of line&lt;/td&gt; &lt;td class="entry"&gt;&lt;code class="literal"&gt;I&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr class="row" valign="top"&gt; &lt;td class="entry"&gt;Append text at current position&lt;/td&gt; &lt;td class="entry"&gt;&lt;code class="literal"&gt;a&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr class="row" valign="top"&gt; &lt;td class="entry"&gt;Append text at beginning of line&lt;/td&gt; &lt;td class="entry"&gt;&lt;code class="literal"&gt;A&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr class="row" valign="top"&gt; &lt;td class="entry"&gt;Open new line below cursor for new text&lt;/td&gt; &lt;td class="entry"&gt;&lt;code class="literal"&gt;o&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr class="row" valign="top"&gt; &lt;td class="entry"&gt;Open new line above cursor for new text&lt;/td&gt; &lt;td class="entry"&gt;&lt;code class="literal"&gt;O&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr class="row" valign="top"&gt; &lt;td class="entry"&gt;Delete line and substitute text&lt;/td&gt; &lt;td class="entry"&gt;&lt;code class="literal"&gt;S&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr class="row" valign="top"&gt; &lt;td class="entry"&gt;Overstrike existing characters with new text&lt;/td&gt; &lt;td class="entry"&gt;&lt;code class="literal"&gt;R&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr class="row" valign="top"&gt; &lt;td class="entry"&gt;Join current and next line&lt;/td&gt; &lt;td class="entry"&gt;&lt;code class="literal"&gt;J&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr class="row" valign="top"&gt; &lt;td class="entry"&gt;Toggle case&lt;/td&gt; &lt;td class="entry"&gt;&lt;code class="literal"&gt;~&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr class="row" valign="top"&gt; &lt;td class="entry"&gt;Repeat last action&lt;/td&gt; &lt;td class="entry"&gt;&lt;code class="literal"&gt;.&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr class="row" valign="top"&gt; &lt;td class="entry"&gt;Undo last change&lt;/td&gt; &lt;td class="entry"&gt;&lt;code class="literal"&gt;u&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr class="row" valign="top"&gt; &lt;td class="entry"&gt;Restore line to original state&lt;/td&gt; &lt;td class="entry"&gt;&lt;code class="literal"&gt;U&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8931614446266229542-5652606650825128219?l=kenanlee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenanlee.blogspot.com/feeds/5652606650825128219/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8931614446266229542&amp;postID=5652606650825128219' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/5652606650825128219'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/5652606650825128219'/><link rel='alternate' type='text/html' href='http://kenanlee.blogspot.com/2007/04/basic-vi-commands.html' title='Basic vi Commands'/><author><name>Nan Li</name><uri>http://www.blogger.com/profile/02756910278237685893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8931614446266229542.post-3878602529182637629</id><published>2007-04-28T17:50:00.000+08:00</published><updated>2007-04-28T17:53:20.114+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Vim'/><title type='text'>Hot Vim Plugins</title><content type='html'>See &lt;a href="http://www2.blogger.com/See%20http://www.newsmth.net/bbscon.php?bid=731&amp;id=24898&amp;amp;ftype=11"&gt;http://www.newsmth.net/bbscon.php?bid=731&amp;id=24898&amp;amp;ftype=11&lt;/a&gt; for details.&lt;br /&gt;&lt;br /&gt;In Chinese!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8931614446266229542-3878602529182637629?l=kenanlee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenanlee.blogspot.com/feeds/3878602529182637629/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8931614446266229542&amp;postID=3878602529182637629' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/3878602529182637629'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/3878602529182637629'/><link rel='alternate' type='text/html' href='http://kenanlee.blogspot.com/2007/04/hot-vim-plugins.html' title='Hot Vim Plugins'/><author><name>Nan Li</name><uri>http://www.blogger.com/profile/02756910278237685893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8931614446266229542.post-5909079600707890875</id><published>2007-04-28T17:33:00.000+08:00</published><updated>2007-04-28T17:41:14.152+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Vim'/><title type='text'>Vim 实用技术</title><content type='html'>From:  &lt;a href="http://www.ibm.com/developerworks" target="_blank"&gt;http://www.ibm.com/developerworks&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.ibm.com/developerworks/cn/linux/l-tip-vim1/index.html" target="_blank"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Vim 实用技术，第 1 部分: 实用技巧&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;本系列文章分三部分详细阐述了 Vim 的使用技巧、插件、定制。第一部分主要是深入分析了 Vim 的使用。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ibm.com/developerworks/cn/linux/l-tip-vim2/index.html" target="_blank"&gt;&lt;span style="font-weight: bold;"&gt;Vim 实用技术，第 2 部分: 常用插件&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;第一部分介绍了一些基本的 Vim 使用技巧。掌握这些技巧可以很大地提高编辑效率，但是 Vim 的强大功能并不仅限于此。Vim 还可以通过“插件”来进行功能扩展。精确地说，是通过脚本来进行扩展，脚本类型有插件、语法加亮、配色方案、文件类型检测等多种。大部分的脚本都是由 Vim 的用户写的，解决了用户身边的问题，使 Vim 变得更加有用。本章将介绍最常用的一些脚本，其中除了一个属于“语法加亮”脚本外，其它都属于“插件”类型。关于如何写脚本的一些基础知识将在下一部分进行一些介绍。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ibm.com/developerworks/cn/linux/l-tip-vim3/index.html" target="_blank"&gt;&lt;span style="font-weight: bold;"&gt;Vim 实用技术，第 3 部分: 定制 Vim&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;前面两部分讲的都是如何使用现有的 Vim 系统，本部分则会通过实例来讲如何定制 Vim 的行为。良好的定制可以让使用 Vim 变得更为得心应手；同时，在掌握了基本的定制之后，也许你就会想进一步写一些自己的 Vim 脚本，从而真正地成为一个 Vim 专家。&lt;br /&gt;&lt;br /&gt;[Please Click the links to see the details...]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8931614446266229542-5909079600707890875?l=kenanlee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenanlee.blogspot.com/feeds/5909079600707890875/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8931614446266229542&amp;postID=5909079600707890875' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/5909079600707890875'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/5909079600707890875'/><link rel='alternate' type='text/html' href='http://kenanlee.blogspot.com/2007/04/vim.html' title='Vim 实用技术'/><author><name>Nan Li</name><uri>http://www.blogger.com/profile/02756910278237685893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8931614446266229542.post-4569346028769790613</id><published>2007-04-28T17:19:00.000+08:00</published><updated>2007-04-28T17:28:39.539+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='C/C++'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>C++ vs Java vs Python vs Ruby : a first impression</title><content type='html'>&lt;h2 style="font-weight: normal;"&gt;&lt;span style="font-size:100%;"&gt;FROM:   &lt;a href="http://www.dmh2000.com/cjpr/"&gt;http://www.dmh2000.com/cjpr/&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2 style="font-weight: bold;"&gt;&lt;span style="font-size:100%;"&gt;Executive Summary&lt;/span&gt;&lt;/h2&gt; &lt;p&gt;&lt;span style="font-size:100%;"&gt;I am a language agnostic journeyman programmer. I am not a fan of a  particular language (I almost said 'fanboy') but thats a bit inflammatory). I  just want to write useful programs and have fun doing it. I know C++ and Java  pretty well. I did some beginner work in Python and Ruby. I then came up with  the following conclusions. But before you flame, read the whole article.&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;C++ vs Java&lt;br /&gt;Java garbage collection is the big productivity gain&lt;br /&gt;Java is significantly slower than C++&lt;br /&gt;C++ is (much) harder to code  correctly than any of the others  &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Java vs Python/Ruby&lt;br /&gt;Python/Ruby interpreted execution and dynamic typing  are big productivity gains over Java.&lt;br /&gt;Python/Ruby are slower than Java&lt;br /&gt;Python/Ruby programs need less extraneous scaffolding (cleaner code)&lt;br /&gt;There are two important tradeoffs : [interpreted vs. compiled] and [static  vs. dynamic typing]  &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Python vs. Ruby&lt;br /&gt;nearly equivalent &lt;/span&gt;&lt;/li&gt;&lt;/ul&gt; &lt;h3&gt;&lt;span style="font-size:100%;"&gt;intro&lt;/span&gt;&lt;/h3&gt; &lt;p&gt;&lt;span style="font-size:100%;"&gt;When running various distributions of Linux, I always ran into the choice of  KDE or GNOME. There are plenty of advocates on both sides, but there was no  overriding authority. Then recently Linus Torvalds came out with a definitive  opinion. He took the unequivocal position that KDE is best. Not that he is  necessarily the final arbiter of user interfaces, but at least he provides a  strong datapoint, and since he is smarter than me and since all the other  opinions seem to come from biased sources, I can now pick KDE and feel better  about it. Paraphrasing the old IBM criteria, 'no one was ever fired for  following a Linus directive'. Heh, after all that it turned out that I wanted to  use Ubuntu which works best with GNOME so I ended up with that for now. So 'most  practical' won out over 'best'. &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size:100%;"&gt;In the meantime I realized I needed to learn a new language and the current  buzz is Python and Ruby. Again I couldn't find a definitive answer of which one  is best. From all the buzz, I came up with a vague impression that Ruby is more  pure and is set to win in the long run, but that Python is currently more  practical for now. And Google uses Python, which is a significant datapoint.  They aren't idiots over there. &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size:100%;"&gt;To see what I could figure out myself, I decided to code up something in  Java, then port it to Python and Ruby and see how I felt about each, and try to  identify where the big wins are for each language. &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size:100%;"&gt;One caveat. If something significant is missing from a language, like garbage  collection, then I don't want to hear a response that says "well, if you use XYZ  unsupported library, or you do ABC convoluted technique, then you can do the  same thing in [put language name here]". I am trying to evaluate the STANDARD  here, since of course you can probably do anything in any language including  assembler if you work hard enough. And the problem with using a nonstandard  library is not just the extra integration work, it's that you are basing your  code on something that may fall by the wayside later on and then you are stuck.  Sometimes it's worth it but that has to be proven on a case-by-case basis as far  as I am concerned. &lt;/span&gt;&lt;/p&gt; &lt;p&gt; &lt;/p&gt;&lt;h3&gt;&lt;span style="font-size:100%;"&gt;history&lt;/span&gt;&lt;/h3&gt; &lt;p&gt;&lt;span style="font-size:100%;"&gt;I started in C in 1985, learned C++ in 1990 (Zortech C++) and have been using  it ever since. I learned Java in the mid-90's when it was first coming out, and  found three big win's for Java over C++: Garbage collection, portability and  simplicity. Garbage collection and simplicity created big productivity gains,  and portability is portability. Not having done a garbage collected language  before, the productivity gain was readily apparent. The simplicity of Java over  C++ was really nice. When coding C++, I needed Meyer's Effective C++ on my desk  at all times to be sure I wasn't invoking some weird type coercion or copy  constructor/assignment operator anomaly. And don't even start with templates.  With Java I never needed that because it is just simpler. And the Java libraries  were more comprehensive and string handling was easier. So in general I was more  productive coding away in Java. I still liked C++ but it seems that when  programming C++, the fun is in figuring out the language and library , like  solving a puzzle. That leaves less time to spend on solving the application  domain problem. &lt;/span&gt;&lt;/p&gt; &lt;h3&gt;&lt;span style="font-size:100%;"&gt;the code&lt;/span&gt;&lt;/h3&gt; &lt;p&gt;&lt;span style="font-size:100%;"&gt;The attached code samples are implementations of a Red-Black tree algorithm  adapted from descriptions in "Algorithms in C++", Sedgewick and "Introduction To  Algorithms",Cormen/Leiserson/Rivest. I picked this because it was short but had  some complexity. &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size:100%;"&gt;code notes and disclaimers:  &lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;commenting is sparser than usual to avoid obscuring code  &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;I probably made some convention errors in Python and Ruby due to ignorance  of the proper idioms  &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;all these programs compile and/or run without warnings and output the same  result  &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;I believe the programs to be correct. there may be bugs but if so they are  in all 3 versions  &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Java 5.0 SDK,Python 2.4, Ruby 1.8.3, C++ Microsoft Visual C++ 2005  &lt;/span&gt;&lt;/li&gt;&lt;/ul&gt; &lt;ul&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;&lt;a href="http://www.dmh2000.com/cjpr/cmpframe.html"&gt;Compare side by side&lt;/a&gt;&lt;/span&gt;  &lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;&lt;a href="http://www.dmh2000.com/cjpr//RBJava.html"&gt;Java implementation&lt;/a&gt;&lt;/span&gt;  &lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;&lt;a href="http://www.dmh2000.com/cjpr/RBPython.html"&gt;Python implementation&lt;/a&gt;&lt;/span&gt;  &lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;&lt;a href="http://www.dmh2000.com/cjpr/RBRuby.html"&gt;Ruby implementation&lt;/a&gt;&lt;/span&gt;  &lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;&lt;a href="http://www.dmh2000.com/cjpr/RBCpp.html"&gt;C++ implementation&lt;/a&gt;&lt;/span&gt;  &lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;&lt;a href="http://www.dmh2000.com/cjpr/prj.zip"&gt;the source zip file&lt;/a&gt;&lt;/span&gt; &lt;/li&gt;&lt;/ul&gt; &lt;h3&gt;&lt;span style="font-size:100%;"&gt;porting&lt;/span&gt;&lt;/h3&gt; &lt;p&gt;&lt;span style="font-size:100%;"&gt;It was surprisingly easy to port the Java code to Python and then port the  Python to Ruby. A lot of it was regular expression search and replace, getting  some naming conventions right and adapting to a few language differences. During  the porting process, the two big gotchas I ran into were Python block indenting  errors and Ruby's horrible compiler diagnostics. &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size:100%;"&gt;Porting the Java code to C++ was much more a hassle. I attempted to make use  of as much static type checking mechanisms as I could. In Java I used generics  for the tree, and in C++ I used templates for the container and 'const' where  appropriate. The big gotchas on porting to C++ were: &lt;/span&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;The dichotomy between primitive types and objects in C++ is much more  pronounced even than Java (and Java is worse off than Python or Ruby). This  dichotomy makes it hard to write a class that supports both primitives and  objects. My implementation might need some fixups to work with objects rather  than 'int'.  &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Java,Ruby and Python all use a consistent reference only scheme to refer to  objects which are always on the heap or equivalent. In C++, you can have a  statically declared objects, a pointer to an object, or a reference to an  object, each with features and limitations. A C++ 'reference' is not the same  thing as a reference in the other languages. C++ really wants you to use  pointers. These alternatives means that when you write something in C++ you have  to come up with a consistent strategy for using the 3 types of object access,  and your strategy might not be the same as what others prefer. There is 'more  than one way to do it'.  &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;The lack of built-in mechanisms or even just conventions for operations that  should be common across types means you have to make things up. Like converting  a type to string representation. All the other languages have support of one  kind or another but in C++ you have to make up your own convention  &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Maybe its just me, but C++ always leaves you wondering what you might have  done wrong. Its hard to tell. If you read Meyer's Effective C++ you see that  there are numerous detailed infrastructure things like constructors and  assignment operators that you have to get exactly right or things fail at  runtime. C++ is really hard to get right, and I never feel totally secure that I  did it properly &lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:100%;"&gt;In my opinion (and I have written a lot of C++), use  C++ only where you have to for compatibility or performance reasons, or where  you arbitrarily decide that you would rather use C++ because its more fun  because its harder. As Tom Cargill (a noted C++ guy) said, &lt;i&gt;"If you think C++  is not overly complicated, just what is a protected abstract virtual base pure  virtual private destructor and when was the last time you needed one?".&lt;/i&gt;&lt;/span&gt;  &lt;h4&gt;&lt;span style="font-size:100%;"&gt;python block indenting&lt;/span&gt;&lt;/h4&gt; &lt;p&gt;&lt;span style="font-size:100%;"&gt;It took me a while to get my editor (JEdit) happy with Python and getting to  not use tabs. Fortunately I never screwed up the file so bad that the code  didn't work but I always had an unpleasant uncertainty about the indentation  simmering in the background. Some (or all) of this may be prejudice. I really  liked braces better than either Ruby Do-End or Python indenting, at least when I  was coding. On the other hand, a properly indented Python file looks much much  cleaner and is easier to read than any of the others because you don't need all  the block closing symbols. However the explicit 'self' argument makes it look  less clean than it could. &lt;/span&gt;&lt;/p&gt; &lt;h4&gt;&lt;span style="font-size:100%;"&gt;ruby syntax errors&lt;/span&gt;&lt;/h4&gt; &lt;p&gt;&lt;span style="font-size:100%;"&gt;Many of the compiler diagnostics I got during the Ruby porting simply said  "syntax error" and gave the line number for the last line in the file. Great. I  spent a lot of time doing binary searches on my code to find the error source.  &lt;/span&gt;&lt;/p&gt; &lt;h4&gt;&lt;span style="font-size:100%;"&gt;The visitor pattern&lt;/span&gt;&lt;/h4&gt; &lt;p&gt;&lt;span style="font-size:100%;"&gt;One thing I did differently in each language was try to adapt a 'Visitor'  pattern (for traversing the tree) to the preferred idiom for each language. You  could of course simply code up a Visitor class that is nearly identical for each  language, but instead I did the following. &lt;/span&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Java : one scheme : an anonymous class implementing a predefined interface.  &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Python : two schemes : a named class similar to Java and just a named  function passed in as a parameter.  &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Ruby : two schemes : a lamba anonymous function, and a Ruby block  implementation &lt;/span&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;span style="font-size:100%;"&gt;The Java and C++ approaches give you static type checking but takes a lot  more cruft to get going. I found the Python named function parameter very  convenient. But it doesn't carry any state so if you need state then you use a  class. Surprisingly, I found the Ruby lambda easier to understand and implement  than the Ruby 'block'. That is because my traversal algorithm is recursive, and  the lambda just gets passed around as a parameter (like the python named  function parameter). I didn't exploit the full potential of a lambda closure.  &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size:100%;"&gt;The Ruby block scheme (pun not intended) requires some tricky syntax in the  recursive calls, and I could not find a good explanation of how to handle  recursive use of blocks in the Ruby documentation. I found a single web hit with  an example and after fiddling with it I got it to work. I think I understand  them now but it is still a bit fuzzy. I mean, I know what to do now but it takes  some concentration to figure out what exactly is happening and why the code  looks like it does. I found that viewing a Ruby block as a co-routine (per the  documentation) and not as a subroutine to be the best way to understand the  whole thing. &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size:100%;"&gt;All that said about the Visitors, I am a Python/Ruby novice so possibly I did  things the hard way :) &lt;/span&gt;&lt;/p&gt; &lt;h3&gt;&lt;span style="font-size:100%;"&gt;interpreted vs. compiled&lt;/span&gt;&lt;/h3&gt; &lt;p&gt;&lt;span style="font-size:100%;"&gt;There has always been this tradeoff. In fact, the Python/Ruby vs. Java  performance controversy sounds a lot like the C/Assembler/Forth discussions in  the embedded systems world of the early 1980's. Forth was interpreted, it didn't  need a compile cycle and it had (supposedly) productivity enhancing features  that C didn't have. Development cycles were much shorter with Forth. Performance  was not as fast as C or assembler but was close. The drawback of Forth was the  weirdness of the language. C won out and Forth went to the dark corner of mostly  forgotten languages. &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size:100%;"&gt;Interpreted languages give you a much quicker development cycle, especially  on big programs. There is no doubting that. Its simply a tradeoff of execution  speed vs. productivity. Some applications need the speed. I think it is a  premature optimization to say the "I like C/Java better than Python/Ruby because  they execute faster". Interpreted is better if you can get it. When I was  testing the code I experienced the advantage of interpreted. I didn't really  measure performance but other sources show the differences. But since  Python/Ruby seem to interface to C/C++ pretty readily, I would be very  comfortable working in the interpreted world and descending into the netherworld  of compiled C/C++ when required. Yes, Python is actually compiled for a VM but  you don't have an explicit compile operation so it acts to the user like an  interpreted language. &lt;/span&gt;&lt;/p&gt; &lt;h3&gt;&lt;span style="font-size:100%;"&gt;static vs. dynamic type checking&lt;/span&gt;&lt;/h3&gt; &lt;p&gt;&lt;span style="font-size:100%;"&gt;Ok, I like the productivity increase provided by dynamic typing because it  eliminates a lot of scaffolding. I found it quite interesting to see errors pop  out at runtime that would normally be compile time in C++/Java. These runtime  errors were obviously influenced by the paths taken in the test program (or how  far it got before it barfed). For a given run, I clearly wasn't seeing all the  instances of this class of errors as I would have with static type checking.  &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size:100%;"&gt;Coming from a statically typed language background, my gut says that dynamic  typing creates a risk. The Python/Ruby bloggers say that if you just unit test  properly, then there is no problem. &lt;a href="http://www.mindview.net/WebLog/log-0025"&gt;Brucke Eckel has a well reasoned  essay on the issue&lt;/a&gt;. I would argue that expecting unit test to catch typing  errors has two issues: &lt;/span&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;in a really big system, its hard to test exhaustively  &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;testing for type correctness makes the programmer do the work that a  computer could do &lt;/span&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;span style="font-size:100%;"&gt;We static typers may be wrong. I had a similar experience moving from PVCS to  &lt;a href="http://subversion.tigris.org/"&gt;Subversion version control&lt;/a&gt;. Oh, My,  God, no locking? The code will be completely ruined in a week. But it turned out  to be a non-issue and Subversion added so much less friction to the development  cycle that productivity was improved maybe 10%. The collective good experience  overrode the predjudice based theoretical 'proof'. The same argument can be made  for dynamic vs. static typing. &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size:100%;"&gt;I wouldn't mind a separate 'lint' tool for Python/Ruby (is it possible?). I  use lint for C/C++ religiously. The whole compiled language community is moving  towards more static type checking (Java Generics, for example) rather than less.  Are they all idiots? (don't answer that)&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size:100%;"&gt;My conclusion is that dynamic 'duck' typing is more productive, more  pleasant, gives cleaner looking code but it incurs a risk that you will get a  runtime type exception in your application at some later date. The risk is  there, quit denying it. &lt;/span&gt;&lt;/p&gt; &lt;h3&gt;&lt;span style="font-size:100%;"&gt;the results&lt;/span&gt;&lt;/h3&gt; &lt;p&gt;&lt;span style="font-size:100%;"&gt;These results are meant to cover issues I noticed in the porting/testing I  did. Not an overall evaluation. If I mention stuff that I didn't run into first  hand, then throw that out.&lt;/span&gt;&lt;/p&gt; &lt;h4&gt;&lt;span style="font-size:100%;"&gt;C++ vs Java&lt;/span&gt;&lt;/h4&gt; &lt;ol&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Garbage collection is THE big win for Java.  &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Java simplicity over C++ complexity is a big win for Java.  &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;C++ is much harder to write and get right than Java or any of the other  choices  &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;C/C++ is way faster than Java  &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Language scaffolding requirements are similar for both  &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;C/C++ is the only way to go for low level systems programming. &lt;/span&gt;&lt;/li&gt;&lt;/ol&gt; &lt;h4&gt;&lt;span style="font-size:100%;"&gt;Java vs Python/Ruby&lt;/span&gt;&lt;/h4&gt; &lt;ol&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;interpreted vs. compiled is a big productivity win for Python/Ruby  &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;dynamic typing is a big productivity win for Python/Ruby  &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Java is way faster than Python or Ruby  &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;minimal scaffolding is a big productivity win for Python/Ruby. Makes  programming more pleasant not to have to build all the infrastructure.  &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;mostly first class functions a big win for Python/Ruby.  &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;built-in lists/arrays and hashes/dictionaries a big win over Java [] and  library based collections. Java 5.0 fixes some of this but in Java collections  still seem tacked on rather than integrated.  &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;dynamic code loading in Python/Ruby is a big win. Yes you can do it in Java  but again, the cruft.  &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Ruby OO completeness over Java dichotomy between primitive types vs. objects  is a big win for Ruby, less so for Python.  &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;There is some weirdness in Python and Ruby lexical scoping of names. The  documentation for each has several warnings about edge cases where names don't  bind in the expected way. This gives me a queasy feeling although in practice it  may not matter. Another win for static type checking.  &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Java 'Comparable' interface ugly compared to Python/Ruby built in comparison  mechanisms that require only that a single function be implemented to get the  full set of comparison operators. An example of excess Java scaffolding.  &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;lack of multiline comments in Python/Ruby was annoying  &lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-size:100%;"&gt;&lt;bold&gt;TRADEOFFS&lt;/bold&gt;&lt;/span&gt;  &lt;ol&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;static typing is a correctness win for Java, especially with Generics in  5.0. The C++/Java trend is toward stronger static type checking, not less  &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;dynamic typing is a productivity win for Python/Ruby at the cost of some  risk  &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;interpreted vs. compiled trades off execution speed for shorter development  cycles. &lt;/span&gt;&lt;/li&gt;&lt;/ol&gt; &lt;h4&gt;&lt;span style="font-size:100%;"&gt;Python vs Ruby&lt;/span&gt;&lt;/h4&gt; &lt;p&gt;&lt;span style="font-size:100%;"&gt;none of these are that important&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size:100%;"&gt;&lt;bold&gt;PYTHON WINS&lt;/bold&gt;&lt;/span&gt;  &lt;ol&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Ruby's compiler/runtime error messages were mostly 'syntax error' with no  help. in many cases almost useless  &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Why does Ruby use rescue/ensure when the rest of the world has settled on  try/catch/finally? I mean, its an arbitrary choice so why not follow the general  convention?  &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Once the indentation is correct, a Python program is the cleanest looking  &lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-size:100%;"&gt;&lt;bold&gt;RUBY WINS&lt;/bold&gt;&lt;/span&gt;  &lt;ol&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;somewhat uneasy over Python indenting vs. Ruby explicit 'end'. probably a  predjudice.  &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Python requirement for explicit 'self' parameter to methods and instance  variable access is very annoying  &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Ruby OO completeness is a win over Python. &lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-size:100%;"&gt;&lt;bold&gt;EQUIVALENT&lt;/bold&gt;&lt;/span&gt;   &lt;ol&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Ruby blocks/lambda/yield seemed more or less equivalent (to me) to Python's  named class or function. Didn't seem a big win to be able to write an anonymous  function inline. In fact, one could argue that anonymous  classes/functions/lambdas reduce testability because they can't be tested  independently of the containing code. But on the other hand I wasn't using  lambdas in the most complete sense, in which they can act on the containing  environment in a way that a named function can't. &lt;/span&gt;&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;&lt;span style="font-size:100%;"&gt;A final thought on C++. To me the C++ Standard Template Library is  distinguished from the other language libraries in that it seems to be much more  mathematically thought out. The containers and algorithms in the STL all have  explicit runtime complexity guarantees. There seems to be much more computer  science in the STL than in the other language libraries. Java is sort of like  that, whereas Ruby and Python libraries seem much more ad-hoc. That probably has  a lot to do with their open community driven approach to libraries. I really  like how the STL was thought out and designed. &lt;/span&gt;&lt;/p&gt; &lt;h3&gt;&lt;span style="font-size:100%;"&gt;conclusion&lt;/span&gt;&lt;/h3&gt; &lt;p&gt;&lt;span style="font-size:100%;"&gt;Java is more productive than C/C++. Use C/C++ only when speed or bare metal  access is called for. Python/Ruby is more productive than Java and more pleasant  to code in. There is a big question on static vs. dynamic typing. I contend that  static typing has to be better for the purposes of program correctness, but the  required cruft reduces productivity. If actual practice in large systems shows  that in fact runtime typing errors don't occur often and are worth the  productivity tradeoff, then I will bow to dynamic typing. I can't come up with a  definitive answer to Python vs. Ruby. They seem very equivalent. Would choose  based on practicality in a given situation. My general feeling was that Python  annoyed me in ways that Ruby didn't, but I think those annoyances would  disappear if I was using Python all the time. &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size:100%;"&gt;Crap, the whole point was to pick Python or Ruby, but I am back where I  started. &lt;/span&gt;&lt;/p&gt;&lt;span style="font-size:100%;"&gt;&lt;bold&gt;Ok, FLAME ON&lt;/bold&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8931614446266229542-4569346028769790613?l=kenanlee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenanlee.blogspot.com/feeds/4569346028769790613/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8931614446266229542&amp;postID=4569346028769790613' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/4569346028769790613'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/4569346028769790613'/><link rel='alternate' type='text/html' href='http://kenanlee.blogspot.com/2007/04/c-vs-java-vs-python-vs-ruby-first.html' title='C++ vs Java vs Python vs Ruby : a first impression'/><author><name>Nan Li</name><uri>http://www.blogger.com/profile/02756910278237685893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8931614446266229542.post-2319323770472573375</id><published>2007-04-28T17:14:00.000+08:00</published><updated>2007-04-28T17:15:13.108+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>30+ Basic Linux Commands</title><content type='html'>Here are some basic Linux commands. Some are well known and some aren't. I am  not a Linux&lt;br /&gt;Wizard...far from it...but I am learning some basic linux  commands and thought I would&lt;br /&gt;share some with other newbies so they to  can get more familiar with the terminal command&lt;br /&gt;line. These work on my  Mandrake 8.1 system.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;xkill&lt;/b&gt; Kills a running program&lt;br /&gt;&lt;b&gt;exit&lt;/b&gt;  Exits the terminal&lt;br /&gt;&lt;b&gt;reboot&lt;/b&gt; Reboots the system&lt;br /&gt;&lt;b&gt;halt&lt;/b&gt; Shutsdown  the computer&lt;br /&gt;&lt;b&gt;startx&lt;/b&gt; Starts xwindows from terminal&lt;br /&gt;&lt;b&gt;man&lt;/b&gt;  man(command)shows help files&lt;br /&gt;&lt;b&gt;info&lt;/b&gt; info(command) shows help  files&lt;br /&gt;&lt;b&gt;--help&lt;/b&gt; (command)--help shows help files&lt;br /&gt;&lt;b&gt;su&lt;/b&gt; Allow you  to login as Super User&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ls&lt;/b&gt; "Lists" the contents of the  directory&lt;br /&gt;&lt;b&gt;pwd&lt;/b&gt; Displays "present working directory"&lt;br /&gt;&lt;b&gt;cd&lt;/b&gt; cd  (name) change directory TO:(name)&lt;br /&gt;&lt;b&gt;mkdir&lt;/b&gt; mkdir (name) Makes new  directory&lt;br /&gt;&lt;b&gt;rmdir&lt;/b&gt; rmdir (name) Removes directory&lt;br /&gt;&lt;b&gt;clear&lt;/b&gt; Clears  the terminal window&lt;br /&gt;&lt;br /&gt;&lt;b&gt;date&lt;/b&gt; Displays current date and  time&lt;br /&gt;&lt;b&gt;cal&lt;/b&gt; Displays a calander&lt;br /&gt;&lt;b&gt;uptime&lt;/b&gt; Displays time since last  reboot&lt;br /&gt;&lt;b&gt;df&lt;/b&gt; Displays the disk usage on partitions&lt;br /&gt;&lt;b&gt;du&lt;/b&gt; Displays  disk usage of directory&lt;br /&gt;&lt;br /&gt;&lt;b&gt;id &lt;/b&gt;Displays your identification to  system&lt;br /&gt;&lt;b&gt;groups&lt;/b&gt; Displays groups of current user&lt;br /&gt;&lt;b&gt;ulimit -a&lt;/b&gt;  Displays users limits&lt;br /&gt;&lt;b&gt;uname&lt;/b&gt; Displays name of machine logged  into&lt;br /&gt;&lt;b&gt;who&lt;/b&gt; Displays "who" is logged on the system&lt;br /&gt;&lt;b&gt;w&lt;/b&gt; Similar to  "who"&lt;br /&gt;&lt;br /&gt;&lt;b&gt;wall&lt;/b&gt; Sends message to all logged in users&lt;br /&gt;&lt;b&gt;top&lt;/b&gt;  Displays cpu processes memory etc&lt;br /&gt;&lt;b&gt;ps&lt;/b&gt; Displays current running  processes&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8931614446266229542-2319323770472573375?l=kenanlee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenanlee.blogspot.com/feeds/2319323770472573375/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8931614446266229542&amp;postID=2319323770472573375' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/2319323770472573375'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/2319323770472573375'/><link rel='alternate' type='text/html' href='http://kenanlee.blogspot.com/2007/04/30-basic-linux-commands.html' title='30+ Basic Linux Commands'/><author><name>Nan Li</name><uri>http://www.blogger.com/profile/02756910278237685893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8931614446266229542.post-7166146309582761030</id><published>2007-04-28T17:01:00.000+08:00</published><updated>2007-04-28T17:04:25.843+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XML'/><category scheme='http://www.blogger.com/atom/ns#' term='C/C++'/><title type='text'>Tools advice for C and C++ programmers ramping up on XML</title><content type='html'>From &lt;a href="http://www-128.ibm.com/developerworks/xml/library/x-ctlbx.html"&gt;http://www-128.ibm.com/developerworks/xml/library/x-ctlbx.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Designed for C and C++ programmers who are new to XML development, this article  gives an overview of tools to assemble in preparation for XML development. Tool  tables outline generic XML tools like IDEs and schema designers, parsers, XSLT  tools, SOAP and XML-RPC libraries, and other libraries either usable from or  actually written in C and/or C++. The article includes advice for installing  open-source libraries on Windows, Unix, and Linux, plus a brief glossary of key  XML terms.&lt;br /&gt;&lt;br /&gt;see more. please click the link above.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8931614446266229542-7166146309582761030?l=kenanlee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenanlee.blogspot.com/feeds/7166146309582761030/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8931614446266229542&amp;postID=7166146309582761030' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/7166146309582761030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/7166146309582761030'/><link rel='alternate' type='text/html' href='http://kenanlee.blogspot.com/2007/04/tools-advice-for-c-and-c-programmers.html' title='Tools advice for C and C++ programmers ramping up on XML'/><author><name>Nan Li</name><uri>http://www.blogger.com/profile/02756910278237685893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8931614446266229542.post-2879626688759696255</id><published>2007-04-28T16:55:00.000+08:00</published><updated>2007-04-28T16:59:13.099+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C/C++'/><title type='text'>STRUCTURE OF A GOOD 'C/C++' PROGRAM</title><content type='html'>There are certain basic aspects that should be kept in mind; such as the format  of the code, indentation, comments, smart variables etc..&lt;br /&gt;As for the  basic layout, here is a tip:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;1&gt; Documentation:&lt;br /&gt;&lt;div style="text-align: center;"&gt;This should contain the objective of the  program, the creator's name and date if neccessary and other details about the  program. It should be in the form of a multi-line comment.&lt;br /&gt;&lt;/div&gt;Example:  /* Program to add two numbers.&lt;br /&gt;created on: 22 sept-2005, by:urjit  */&lt;br /&gt;&lt;br /&gt;2&gt;Linking of files and Inclusion:&lt;br /&gt;This section should be  used to link to all header files, external files and the library functions.  Macros could also be placed in this section.&lt;br /&gt;Example: #include&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;div style="text-align: justify;"&gt;&lt;conio.h&gt;#include&lt;iostream.h&gt;&lt;br /&gt;define PI 3.14&lt;br /&gt;&lt;br /&gt;3&gt;Main  program:&lt;br /&gt;This section should ideally contain the classes (in case of  C++), global variables, filestreams, and the body of the main( ) function,  containing all the sub-functions, local variables, objects  etc..&lt;br /&gt;&lt;br /&gt;4&gt;Functions and extra comments:&lt;br /&gt;This section  should contain the extra information and notes about debugging if required  (untill the code is perfected), other functions that are to be used in the main  program (for defining the functions here, they have to be declared above their  control entry; i.e., generally above main).&lt;br /&gt;&lt;/iostream.h&gt;&lt;/conio.h&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8931614446266229542-2879626688759696255?l=kenanlee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenanlee.blogspot.com/feeds/2879626688759696255/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8931614446266229542&amp;postID=2879626688759696255' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/2879626688759696255'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/2879626688759696255'/><link rel='alternate' type='text/html' href='http://kenanlee.blogspot.com/2007/04/structure-of-good-cc-program.html' title='STRUCTURE OF A GOOD &apos;C/C++&apos; PROGRAM'/><author><name>Nan Li</name><uri>http://www.blogger.com/profile/02756910278237685893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8931614446266229542.post-5880114675440176785</id><published>2007-04-28T16:43:00.000+08:00</published><updated>2007-04-28T16:46:05.090+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C/C++'/><title type='text'>C++ Book Recommendations</title><content type='html'>&lt;div id="post_message_525849"&gt;&lt;span style="font-size:100%;"&gt;&lt;b&gt;&lt;u&gt;Accelerated C++&lt;/u&gt; by Koenig and Moo&lt;/b&gt;: Beginners book that teaches C++ style C++, one of if not the most commonly recommended beginner C++ books. Slightly more advanced and/or accelerated than other beginners books.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;C++ Primer, Fourth Edition&lt;/u&gt; (or later) by Lippman, Lajoie and Moo&lt;/b&gt;: Comprehensive guide to C++ language.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Thinking in C++&lt;/u&gt; by Eckel&lt;/b&gt;: Freely available online book for beginner/intermediate programmers.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;The C++ Programming Language, Third Edition&lt;/b&gt;&lt;/u&gt;&lt;b&gt; (or Special Edition) by Stroustrup&lt;/b&gt;: The definitive language reference by the language creator. Not particularly suitable for beginners.&lt;/span&gt;     &lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;C++ Coding Standards&lt;/u&gt; by Sutter and Alexandrescu&lt;/b&gt;: Compilation and guide to C++ best practices. Must have for intermediate C++ programmers.&lt;br /&gt;&lt;br /&gt;Anything from Stroustrup's C++ In-Depth series or referenced by C++ Coding Standards, including:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Design Patterns&lt;/u&gt; by Gamma, Helm, Johnson and Vlissides&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Effective C++&lt;/u&gt;, &lt;u&gt;More Effective C++&lt;/u&gt; and &lt;u&gt;Effective STL&lt;/u&gt; by Meyers&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Exceptional C++&lt;/u&gt; and &lt;u&gt;More Exceptional C++&lt;/u&gt; by Sutter&lt;/b&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8931614446266229542-5880114675440176785?l=kenanlee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenanlee.blogspot.com/feeds/5880114675440176785/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8931614446266229542&amp;postID=5880114675440176785' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/5880114675440176785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/5880114675440176785'/><link rel='alternate' type='text/html' href='http://kenanlee.blogspot.com/2007/04/c-book-recommendations.html' title='C++ Book Recommendations'/><author><name>Nan Li</name><uri>http://www.blogger.com/profile/02756910278237685893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8931614446266229542.post-653767105048675436</id><published>2007-04-28T12:10:00.000+08:00</published><updated>2007-04-28T12:12:04.633+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Vim'/><title type='text'>Tips: Making Vim easy</title><content type='html'>Vim's flexibility and countless features are a major asset for experienced users, but a challenge for newbies. If you've always wanted to try Vim but were put off by your first attempts, you can start off gradually by getting to know Vim's GUI and easy mode. This article is a primer for those who haven't used Vim much and want to wade in gradually.&lt;br /&gt;&lt;br /&gt;If you're new to Vim and vi-like editors, the Vim GUI is probably the best way to get started. You can perform the operations you're familiar with using Vim's keybindings, but when you get stuck, you can use the mouse and the gVim menus to get things done quickly and efficiently.&lt;br /&gt;&lt;br /&gt;Even better, when there is a keybinding for a command, it's usually displayed in the gVim menu -- so if you keep performing the same operation, you'll probably pick up the keybinding through repetition and eventually be able to go mouseless -- if that's your goal, of course.&lt;br /&gt;&lt;br /&gt;There's little, if anything, you can do using gVim that you can't do in the standard version of Vim, and many operations are easier or more intuitive when you have menus and icons to deal with.&lt;br /&gt;&lt;br /&gt;Staring gVim&lt;br /&gt;&lt;br /&gt;To start gVim, run gvim or vim -g. If you want to edit a file with gVim right away, you can launch gVim with gvim filename or vim -g filename .&lt;br /&gt;&lt;br /&gt;As with Vim, you can also launch gVim with the +n option, where n is the line number you want to start on. So, for instance, gvim +10 filename will bring up gVim with filename loaded and the cursor on line 10.&lt;br /&gt;&lt;br /&gt;Another trick is to load gVim at the first instance of a search term. Let's say you want to start editing at the first instance of the word foobar. Use:&lt;br /&gt;&lt;br /&gt;gvim +/foobar filename&lt;br /&gt;&lt;br /&gt;Once you start gVim, you'll notice that it looks more or less like any other GUI text editor. Like any other editor, it provides several menus, a scrollbar on the right-hand side of the window (which can be moved, or done away with, if desired), and a toolbar at the top of the window for quick access to common functions like Save, Undo, and Search.&lt;br /&gt;&lt;br /&gt;Easy Vim&lt;br /&gt;&lt;br /&gt;Vim also has an "easy" mode, which isn't touched on too often in Vim tutorials and docs, since it really goes against what most users are looking for from Vim. Vim, as you know if you've used it much, is a "modal" editor, based on Bill Joy's classic vi. Vim has an insert mode, a command mode, a visual mode, and (depending on whom you ask) a few additional modes. Once you get the hang of it, the modal nature of Vim is extremely useful. However, until you get used to it, Vim can be a hassle when trying to figure out simple operations like searching and replacing text.&lt;br /&gt;&lt;br /&gt;Easy mode is actually a collection of various Vim options that tell Vim to act like any standard text editor. Instead of using y to "yank" (copy) text, and then pasting text using p or P in normal mode, Vim's easy mode lets you use the standard Ctrl-c to copy text and Ctrl-v to paste text. Anybody who has use Notepad or Microsoft Word for a week or two will be familiar with these shortcuts, and emulating them makes Vim more intuitive for the average user. Check Vim's help for more on easy mode to find out exactly what Vim's doing behind the scenes.&lt;br /&gt;&lt;br /&gt;Why would you want to use Vim without access to its modes? Well, Vim still includes a number of spiffy tools and features that aren't dependant on its vi-like modes -- macros, syntax highlighting, sessions, and other Vim goodness that you might not find in an editor like Kate or gedit.&lt;br /&gt;&lt;br /&gt;Easy mode also enables a context menu, which isn't present in standard Vim/gVim. When you right-click in the gVim window, you'll see a menu that will allow you to select text by the word, sentence, paragraph, line, or all text in the buffer. You can also use the context menu to copy, cut, delete, and paste text, and to undo operations.&lt;br /&gt;&lt;br /&gt;If you like the context menu, but don't want to run Vim in easy mode, you can simply set the mouse behavior using this command:&lt;br /&gt;&lt;br /&gt;:behave mswin&lt;br /&gt;&lt;br /&gt;Then you'll have the context menu, even when you're not in easy mode.&lt;br /&gt;&lt;br /&gt;By default, pressing Esc in easy mode will not put you in command mode. If you decide you want to start using gVim in regular mode, you can go to Edit -&gt; Global Settings -&gt; Toggle Insert Mode, which will put you into command mode. After running this, you'll be able to switch between easy mode and normal gVim/Vim modes. If you want to drop back exclusively to easy mode, toggle it with the menu or run :set im! in command mode.&lt;br /&gt;&lt;br /&gt;The rest of this article will assume that you're using gVim in normal mode, but I wanted to point out the easy gVim mode for users who might like to get started with Vim is the friendliest manner possible.&lt;br /&gt;&lt;br /&gt;By default, gVim will start with a conservative color scheme of black text on a white background. If you prefer something a bit more interesting, gVim has several color schemes available. Go to the Edit menu and select Color Scheme. You should see about a dozen choices, including blue, darkblue, and peachpuff.&lt;br /&gt;&lt;br /&gt;Working in gVim&lt;br /&gt;&lt;br /&gt;This probably goes without saying, but since gVim is designed as a GUI text editor, you can select text using the mouse in addition to Vim's usual text selection methods. This means that all you need to do to highlight a letter, word, or sentence is to grab the mouse and highlight the text that you'd like to select. You can also place the cursor anywhere on the screen just by moving the mouse. (You can also enable this in regular Vim running in an xterm or other terminal emulator, but it requires mouse support being built in and is not on by default.)&lt;br /&gt;&lt;br /&gt;However, don't forget that the mouse is a clumsy tool compared to Vim's normal selection capabilities. Using v you can start the visual mode for selecting by character, V to select by lines, and Ctrl-v to select text blocks.&lt;br /&gt;&lt;br /&gt;It's also worth noting that you have two clipboards in gVim. There's the current selection, which means any text that's highlighted, and there's text copied to the clipboard, which persists after you've selected new text. For example, if you use the mouse to select a sentence and then click the middle button, you'll paste the text that you just selected. But if you select text and use Vim's Edit menu to copy text, it will be stored in the clipboard even when you select new text. This can be useful if you have a string that you'll be pasting several times (say, a letter template) and need to use the standard selection method for other text.&lt;br /&gt;&lt;br /&gt;I've written about Vim's viewports before, but viewports are much easier to manage in gVim. You can use the normal Vim keybindings to open a viewport, or you can just go to Window -&gt; New to create a new viewport so you can edit a new file, Window -&gt; Split to split the window using the same file that's already open, or Window -&gt; Split Vertically to divide the viewport vertically instead of horizontally. Using Ctrl-w will move you from viewport to viewport, or you can use the Window menu to move to another viewport, or just click the left mouse button in the viewport you want the cursor to be in.&lt;br /&gt;&lt;br /&gt;The really nice thing about viewports in gVim, though, is that you can easily resize them with the mouse. In standard Vim, you need to use Ctrl-w - and Ctrl-w + to resize the windows, but in gVim you can resize them using the mouse or the standard Vim keybindings, depending on which you find easier to use.&lt;br /&gt;&lt;br /&gt;Even though gVim is a GUI-based program, the shell is never far away. To get to a shell from a gVim session, just :sh; type exit when you want to get out of the shell. Note that gVim's terminal emulation may leave something to be desired in terms of screen refresh, so you probably want to stick to a regular terminal emulator for most of your work.&lt;br /&gt;&lt;br /&gt;gVim's file explorer&lt;br /&gt;&lt;br /&gt;You can use gVim to edit remote files almost as easily as using Vim in a remote shell. I usually edit files on my server by using SSH to get a shell on the remote machine and then editing a file, but you can do the equivalent using gVim (or regular Vim) from your local session.&lt;br /&gt;&lt;br /&gt;To open a remote file using secure copy (scp), do the following:&lt;br /&gt;&lt;br /&gt;:e scp://user@remote.host.net/path/to/file&lt;br /&gt;&lt;br /&gt;This will open a secure connection on the remote machine as the user specified. If you have an SSH key set up, you can log in without a password. If you don't have a key set up, you will be prompted for a password each time you save the file, which can be a bit of an annoyance.&lt;br /&gt;&lt;br /&gt;Note that this will work with several protocols, so you could substitute sftp, ftp, rsync, and other methods. See the Vim help guide for the complete list.&lt;br /&gt;&lt;br /&gt;What if you don't know the name of a remote file, or the exact path? Leave off the filename and you'll be dropped into Vim's file browser:&lt;br /&gt;&lt;br /&gt;:e scp://user@remote.host.net/&lt;br /&gt;&lt;br /&gt;You can browse through the directories and find whatever file you need to edit. Press Enter once the file you want is highlighted and start editing.&lt;br /&gt;&lt;br /&gt;Finally, I would be remiss if I didn't mention gVim's spelling features. If you turn on behave mswin and turn on spellchecking, you can use the context menu to add a word to the dictionary, accept an alternate spelling, or ignore a word for spellchecking purposes. To turn on the spellcheck feature, go to Tools -&gt; Spelling -&gt; Spell Check On. You'll probably need to turn syntax highlighting off for the spellcheck to work properly; you can do that from the Syntax menu.&lt;br /&gt;&lt;br /&gt;If you've never used Vim, or if you've used Vim and found it too difficult, try gVim for a few days. It has all of the amenities that you'd want from a boring old text editor, but with all of Vim's features lurking below the surface where you can unleash them at your leisure.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8931614446266229542-653767105048675436?l=kenanlee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenanlee.blogspot.com/feeds/653767105048675436/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8931614446266229542&amp;postID=653767105048675436' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/653767105048675436'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/653767105048675436'/><link rel='alternate' type='text/html' href='http://kenanlee.blogspot.com/2007/04/tips-making-vim-easy.html' title='Tips: Making Vim easy'/><author><name>Nan Li</name><uri>http://www.blogger.com/profile/02756910278237685893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8931614446266229542.post-4000078188834874273</id><published>2007-04-27T20:46:00.000+08:00</published><updated>2007-04-27T21:05:08.959+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C/C++'/><title type='text'>Publications by C++ experts</title><content type='html'>Articles by experts are saught after the most. Therefore, here are the links to the articles written by some of my favorite authors.&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.research.att.com/%7Ebs/papers.html" target="_blank"&gt;Bjarne Stroustrup&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a target="_blank" href="http://www.aristeia.com/publications_frames.html"&gt;Scott Meyers&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a target="_blank" href="http://www.semantics.org/"&gt;Steve Dewhurst&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.moderncppdesign.com/" target="_blank"&gt;Andrei Alexandrescu&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a target="_blank" href="http://www.cs.wustl.edu/%7Eschmidt/report.html"&gt;Douglas Schmidt&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a target="_blank" href="http://www.gotw.ca/publications/index.htm"&gt;Herb Sutter&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a target="_blank" href="http://www.curbralan.com//"&gt;Kevlin Henney&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a target="_blank" href="http://www.synesis.com.au/articles.html"&gt;Matthew Wilson&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a target="_blank" href="http://www.embedded.com/columns/pp"&gt;Dan Saks&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a target="_blank" href="http://www.objectmentor.com/resources/omi_reports_index.html"&gt;Robert C. Martin&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.freshsources.com/" target="_blank"&gt;Chuck Allison&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.acceleratedcpp.com/authors/koenig" target="_blank"&gt;Andrew Koenig&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cantrip.org/" target="_blank"&gt;Nathan Myers&lt;/a&gt;  &lt;/li&gt;&lt;li&gt;&lt;a href="http://users.rcn.com/jcoplien/" target="_blank"&gt;James Coplien&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.research.ibm.com/designpatterns/publications.htm" target="_blank"&gt;John Vlissides&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.informit.com/guides/guide.asp?g=cplusplus&amp;amp;rl=1" target="_blank"&gt;Danny Kalev&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.angelikalanger.com/Articles/Topics.html#CPP" target="_blank"&gt;Angelika Langer&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8931614446266229542-4000078188834874273?l=kenanlee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenanlee.blogspot.com/feeds/4000078188834874273/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8931614446266229542&amp;postID=4000078188834874273' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/4000078188834874273'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/4000078188834874273'/><link rel='alternate' type='text/html' href='http://kenanlee.blogspot.com/2007/04/publications-by-c-experts.html' title='Publications by C++ experts'/><author><name>Nan Li</name><uri>http://www.blogger.com/profile/02756910278237685893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8931614446266229542.post-4373077985181826908</id><published>2007-04-27T20:16:00.000+08:00</published><updated>2007-04-28T12:01:21.544+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Vim'/><category scheme='http://www.blogger.com/atom/ns#' term='C/C++'/><title type='text'>c.vim for VIM : C/C++ -IDE</title><content type='html'>&lt;span style="font-weight: bold;"&gt;created by&lt;/span&gt;&lt;br /&gt;Fritz Mehner&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;description&lt;/span&gt;&lt;br /&gt;**   Statement oriented editing of  C / C++ programs&lt;br /&gt;**   Speed up writing new code considerably.&lt;br /&gt;**   Write code und comments with a professional appearance from the beginning.&lt;br /&gt;**   Use code snippets&lt;br /&gt;&lt;br /&gt;- insertion of various types of comments   (file prologue, function descriptions, file section headers&lt;br /&gt;   keyword comments, date, time, ...  )&lt;br /&gt;- insertion of empty control statements   (if-else, while, do-while, switch, ... )&lt;br /&gt;- insertion of various preprocessor directives&lt;br /&gt;- insertion of C-idioms   (enum+typedef, loops, complete main, empty function, file open dialogs, ... )&lt;br /&gt;- insertion of C++ -idioms   ( frames for simple classes and template classes, try-catch blocks, file open dialogs, output manipulators, ios flags, ... )&lt;br /&gt;- use and organize your own collection of code snippets&lt;br /&gt;- compile / link / run support for one-file projects   (without a makefile)&lt;br /&gt;- run buffer through splint&lt;br /&gt;- personalization of comments   (name, email, ... )&lt;br /&gt;- menus can be switched on and off   (Tools menu)&lt;br /&gt;&lt;br /&gt;Here are some screen shots : http://lug.fh-swf.de/vim/vim-c/screenshots-en.html&lt;br /&gt;&lt;br /&gt;The help file online :   http://lug.fh-swf.de/vim/vim-doc/csupport.html&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Documentation&lt;/span&gt;&lt;br /&gt;_____________&lt;br /&gt;This plugin comes with a help file (csupport.txt). Read it with&lt;br /&gt;&lt;br /&gt;:h csupport&lt;br /&gt;&lt;br /&gt;install details&lt;br /&gt;Copy the zip archive  cvim.zip to $HOME/.vim/ and run&lt;br /&gt;     unzip cvim.zip&lt;br /&gt;If you have already an older version of this plugin and you have modified the template files you may want to save your templates first or copy the files from the&lt;br /&gt;archive by hand. See also the file README.csupport within the zip file.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8931614446266229542-4373077985181826908?l=kenanlee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenanlee.blogspot.com/feeds/4373077985181826908/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8931614446266229542&amp;postID=4373077985181826908' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/4373077985181826908'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/4373077985181826908'/><link rel='alternate' type='text/html' href='http://kenanlee.blogspot.com/2007/04/cvim-for-vim-cc-ide.html' title='c.vim for VIM : C/C++ -IDE'/><author><name>Nan Li</name><uri>http://www.blogger.com/profile/02756910278237685893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8931614446266229542.post-4131669382289013586</id><published>2007-04-27T20:09:00.000+08:00</published><updated>2007-04-27T20:14:28.926+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C/C++'/><title type='text'>The difference between pointers and arrays</title><content type='html'>1) A pointer is a place in memory that keeps address of another place inside, while an array is a single, preallocated chunk of contiguous elements (all of the same type), fixed in size and location.&lt;p&gt;2) Array like pointers can't be initialized at definition like arrays.&lt;/p&gt;&lt;p&gt;3) When we allocate memory for a pointer to use it as a dynamic array. The memory can be resized or freed later. But this is not the case for arrays.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8931614446266229542-4131669382289013586?l=kenanlee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenanlee.blogspot.com/feeds/4131669382289013586/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8931614446266229542&amp;postID=4131669382289013586' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/4131669382289013586'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/4131669382289013586'/><link rel='alternate' type='text/html' href='http://kenanlee.blogspot.com/2007/04/difference-between-pointers-and-arrays.html' title='The difference between pointers and arrays'/><author><name>Nan Li</name><uri>http://www.blogger.com/profile/02756910278237685893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8931614446266229542.post-8083771343011400598</id><published>2007-04-27T19:56:00.001+08:00</published><updated>2007-04-27T19:59:05.089+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C/C++'/><title type='text'>History of C++</title><content type='html'>During the 60s, while computers were still in an early stage of development, many new programming languages appeared. Among them, ALGOL 60, was developed as an alternative to FORTRAN but taking from it some concepts of structured programming which would later inspire most procedural languages, such as CPL and its succesors (like C++). ALGOL 68 also influenced directly in the development of data types in C. Nevertheless ALGOL was an unspecific language and its abstraction made it little practical to solve most commercial tasks.&lt;br /&gt;&lt;br /&gt;In 1963 the CPL (Combined Programming language) appeared with the idea of being more specific for concrete programming tasks of that time than ALGOL or FORTRAN. Nevertheless this same specificity made it a big language and, therefore, difficult to learn and implement.&lt;br /&gt;&lt;br /&gt;In 1967, Martin Richards developed the BCPL (Basic Combined Programming Language), that signified a simplification of CPL but kept the most important features the language offered. Although it continued being an abstract and somewhat large language.&lt;br /&gt;&lt;br /&gt;In 1970, Ken Thompson, immersed in the development of UNIX at Bell Labs, created the B language. It was a port of BCPL for a specific machine and system (DEC PDP-7 and UNIX), and was adapted to his particular taste and necessities. The final result was an even greater simplification of CPL, although dependent on the system. It had great limitations like it did not compile to executable code but threaded-code, which generates slower code in execution, and therefore was inadequate for the development of an operating system. Reason why from 1971, Denis Ritchie, from the Bell Labs team, began the development of a B compiler which, among other things, was able to generate executable code directly. This "New B", finally called C, introduced in addition, some other new concepts to the language like data types (char).&lt;br /&gt;&lt;br /&gt;In 1973, Denis Ritchie, had developed the bases of C. The inclusion of types, its handling, as well as the improvement of arrays and pointers, along with later demonstrated capacity of portability without becoming a high-level language, contributed to the expansion of the C language. It was established with the book "The C Programming Language" by Brian Kernighan and Denis Ritchie, known as the White Book, and that served as de facto standard until the publication of formal ANSI standard (ANSI X3J11 committee) in 1989.&lt;br /&gt;&lt;br /&gt;In 1980, Bjarne Stroustrup, from Bell labs, began the development of the C++ language, that would receive formally this name at the end of 1983, when its first manual was going to be published. In October 1985, the first commercial release of the language appeared as well as the first edition of the book "The C++ Programming Language" by Bjarne Stroustrup.&lt;br /&gt;&lt;br /&gt;During the 80s the C++ language was being refined until it became a language with its own personality. All that with very few losses of compatibility with the code with C, and without resigning to its most important characteristics. In fact, the ANSI standard for the C language published in 1989 took good part of the contributions of C++ to structured programming.&lt;br /&gt;&lt;br /&gt;From 1990 on, ANSI committee X3J16 began the development of a specific standard for C++. In the period elapsed until the publication of the standard in 1998, C++ lived a great expansion in its use and today is the preferred language to develop professional applications on all platforms.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8931614446266229542-8083771343011400598?l=kenanlee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenanlee.blogspot.com/feeds/8083771343011400598/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8931614446266229542&amp;postID=8083771343011400598' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/8083771343011400598'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/8083771343011400598'/><link rel='alternate' type='text/html' href='http://kenanlee.blogspot.com/2007/04/history-of-c.html' title='History of C++'/><author><name>Nan Li</name><uri>http://www.blogger.com/profile/02756910278237685893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8931614446266229542.post-8865514942780280632</id><published>2007-04-27T19:17:00.000+08:00</published><updated>2007-04-27T19:18:19.118+08:00</updated><title type='text'>Begin Now!</title><content type='html'>It is my blog on blogspot!&lt;br /&gt;Begin Now!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8931614446266229542-8865514942780280632?l=kenanlee.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kenanlee.blogspot.com/feeds/8865514942780280632/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8931614446266229542&amp;postID=8865514942780280632' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/8865514942780280632'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8931614446266229542/posts/default/8865514942780280632'/><link rel='alternate' type='text/html' href='http://kenanlee.blogspot.com/2007/04/begin-now.html' title='Begin Now!'/><author><name>Nan Li</name><uri>http://www.blogger.com/profile/02756910278237685893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
