Distributed Objects

Final Project Options

Web Resources:

Linux Tutorials eclipse Code Project SysInternals Best SysInternals Tools Dr. Dobb's Journal Windows Forms COM at MSDN IDL Language base MIDL types OLE data types IDL attributes MIDL data types MIDL Language Reference

Content:

Here we discuss content of the Final Projects.
  1. Syllabus
    Describes topics to be covered, reading material for you to digest before coming to class, and due dates for the assigned projects.
  2. Project #1, Final Projects, Final Project Choices
  3. Student Presentations:
  4. Project Topics:

    Most of these projects use interesting technology and/or interesting ideas that relate, in some way, to our focus areas in Distributed Objects this semester, e.g., Components, Distributed Systems, and Cross-Platform Development. You will do one of these to complete project requirements for this course.

    Note that some of the projects listed below have associated Project Statements, linked from the title, and some do not. Some projects are described in a fair amount of detail, some only have brief descriptions. You are expected to fill in the details.

    You may also discuss with me a project not listed here. Please do that only if it is interesting, rich in content, and has material for you to learn and demonstrate.

    Work on one of the following:

    1. Display Graphics with C++ and JavaScript Libraries:

      This project explores the use of Graphics libraries with C++ and Javascript. The purpose is to develop a cross-platform facility for technical drawing and for constructing tools that present results in a graphics format. One of our prime interests is in drawing graphs, e.g., a collection of vertices and edges used to display relationships like the dependency between files.

      Samples of interesting things to do with Graphics:
      ArcGIS, GoJs
      These are commercial products. They have free trial periods, but I would prefer you to use one of the open source libraries cited below. I've included these links to show you some of the interesting things that can be done with graphics displays.

      Here are some open-source frameworks that you will want to explore:

      And here are frameworks for drawing on the HTML5 Canvas using JavaScript:

      Finally, here are some tutorials and examples of drawing with HTML5:

      Although not cross-platform, you can do some interesting graphics work with WPF using C++\CLI. Here's a tutorial artical and some sample code I wrote for the Software Modeling and Analysis class two years ago.

      You are to pick a technology/library and demonstration project that illustrates what you have learned, and to provide a tutorial for the rest of us. You are welcome to select a demonstration that interests you, but may elect to do one of these:
      • Draw dependency graphs in a window, using some routing strategy that makes the graph easy to understand. I will discuss a couple of ideas for routing in class.
      • Build a UML diagrammer, providing templates for the basic diagram types. You will need to support drag-and-drop for this demo.
      • Create a designer for laying out basic shapes with text. Here too you will need to support drag-and-drop.

      Why? Enable building high performance cross-platform graphics applications for tools and information management systems.

    2. Tiny HttpClient & HttpServer

      Your C++ code implements HTTP message-based communication between distributed applications. Will add custom message headers to support application needs. One important goal is to make the core HTTP-Client and HTTP-Server as small and light weight as can be reasonably done and still provide useful functionality. You will be required to implement in C++ for both ip4 and ip6 sockets on Windows and Linux. You may start with the Sockets package provided on the college server if you wish.

      You may pick some distributed application that interests you to demonstrate your message-passing communication channel. If you wish you may elect to re-implement a WCF project you implemented in CSE681 - Software Modeling and Analysis using your communication facilities.

      Why? Enable simple inter-process, inter-machine, and inter-technology communication between possibly different platforms.

    3. Code Analysis using Compiler front-ends

      Two well know compilers provide developer access to, and interaction with, their analyses:

      CLang Static Analyzer, libcLang
      libclang provides programmatic access to the clang compiler's abstract syntax tree, supporting static code analysis for C and C++.

      Roslyn .Net Compiler Platform, Taking a Tour of Roslyn, Roslyn for the Rest of Us - Channel9 video
      The Roslyn project gives programmatic access to the .Net C# and VB abstract syntax trees.

      These compiler APIs should give us an interesting alternate to the Parser on the College server for building code analysis tools. With this project you will implement a static code analysis you developed in either CSE681 - Software Modeling and Analysis or CSE687 - Object Oriented Design.

      The idea is to simply replace the analysis engine based on our parser with that of libclang or Rosylyn. You will be expected to meet all requirements of the class project and to describe to the rest of us how you used the compiler front-end.

      Why? Explore a potentially effective way of building static code analysis. Also, this experience should look good on a resume'.

    4. Asynchronous, Possibly Remote, Tasks

      Asynchronous tasks imply communication that may be: one-way, return a promised value, or trigger a callback to return results. This project requires you to implement spawning of tasks across process, machine, and technology boundaries, supporting each of these three communication modes. You will be required to do some performance comparisons between your implementations and platform specific methods of asynchronous programming. Kenny Kerr has a nice series of articles in MSDN Magazine that cover the many flavors of asynchronous programming on Windows.

      For this project you may use the Tiny HttpClient and HttpServer of the previous project or use existing .Net and Java classes to support cross platform communication. Note that this project is related to the Asynchronous Communication components provided for CSE681 - SMA Project #4, Fall 2013. You will find demo code here: Project4HelpF13.

      Why? This provides an extensible infrastructure for building complex distributed systems.

    5. Cross-platform GUI

      Uses tiny HttpServer serving one or more HTML5 pages and Chrome browser to build Graphical User Interfaces. Develop a demo application that runs on both Windows and Linux.

      Why? To provide a process for building GUIs that is identical for both Windows and Linux.

    6. Cross-platform distributed application

      Uses standard GUI framework to build a user interface on one platform that talks via HTTP to a set of libraries hosted in a dispatching application or service (daemon) on the other side. Thus we could build a GUI using Java/Swing on the Linux side talking to C++ libraries on the Windows side. Or, reverse that and have C#/WPF talk to Linux C++ libraries. The intent is that you use the results of the Tiny HttpClient and HttpServer for the communication link. Alternately you may explore the use of .Net HTTP classes on Windows and Apache HttpComponents on Linux.

      Why? It's interesting, useful, and would make good conversation at an interview. It would be interesting to build in a RESTful style.

    7. Virtual Server

      Develop a pluggable, message-passing infrastructure in C++ for building complex servers and their clients. This could use some or all of the helper code developed for Project #4 in Software Modeling and Analysis, Spring 2013: AbstractCommunicator and AbstractDispather, to build a platform for easily installing functionality into servers and their clients as needed. Virtual servers must also implement a cloning facility that supports creating a clone of an existing virtual server at some other endpoint with a subset of the original's contents.

      Why? Cloneable servers using message-passing communication are great ways to build flexible distributed systems that are scalable and useful in a variety of settings.
      Note: This project is closely related to the ideas we discussed for Projects #4 and #5 in CSE681 - Software Modeling and Analysis, Fall 2013.

    8. Cross-Platform Testbed

      Use Windows Hyper-V or Virtual Box to run a Windows application concurrently with a Linux Application, each in its own guest OS. The idea is to provide some infrastructure to support testing cross-platform applications. So each side has a data generator - might send lines from a file or messages randomly picked from a collection, and a logger that can write to a file or to a seperate console window. Use the Tiny HTTP client and server from the first project. to communicate between platforms.

      Why? Interesting and useful and will make a nice project to discuss during interviews.
      Note: You may use a private network between two demo machines instead of a virtual machine.

    9. WebSocket Communication

      Use Windows 8 facilities to establish bilateral communication in a Web Application using IE11 and IIS. Alternately, Your C++ code implements Server-Side WebSockets and JavaScript implements client:
      WebSockets-Wikipedia, API, Protocol, and examples

      Why? Provide a mechanism for asynchronous two-way communication between Chrome or IE11 and a Web Application.

    10. Explore technologies based on Server-side JavaScript and WebSockets:

      node.js, socket.io, and express.js are new JavaScript Frameworks for HTTP communication and for building slim websites.

      node.js is a particularly interesting technology - check out the Ryan Dahl video on node.js.

      You can write a detailed survey report with lots of little demos and one modest application.

      Why? These are very interesting new technologies that promise to make network communication almost trivial.

    11. REST = REpresentational State Transfer

      The three REST projects, itemized below, develop a Web API based on RESTful principles, each using a different technology (you will only implement one of them). They provide an opportunity for anyone taking CSE691 - Android Programming with Dr. Du this Spring to develop an Android client in in that class that consumes a web service you build in this project. Here are some ideas for services:

      • A simple code repository that supports uploading files, building metadata (XML) descriptions, and downloading files, as well as viewing a list of files, structured as projects. You will be expected to provide a desktop client that uses all of the features of the service. If you are taking CSE691 you will build an android client for navigating through the directory structure and viewing file text and metadata. Note that "simple" means that you do not need to support versioning, branches, etc.
      • A tutorial service that provides a set of tutorials on topics that interest you, e.g., C++11 features, C# concurrency, android programming model, etc. (you can choose any set of tutorials you find interesting). These don't need to be complete, but they do need to be big enough to show that the service could be useful. Each tutorial will have some text, some code, and some diagrams to show that you can gracefully handle those things. As part of this project you will provide a desktop client that can add new tutorials, update existing materials, and view tutorials a page at a time. If you are taking CSE691 you will build an android client for viewing the tutorials as well.
      • A resume' service that provides a list of peoples names that have stored resume's and supports viewing each resume' by clicking on the appropriate name. The service should also provide a means for viewers to comment on the resume' or offer interviews. These comments would be accessible only to the owner of the resume, via a userid and password authentication by the owner. You will provide a desktop client that uses all features of the service. If you are taking CSE691 you will also provide an Android client that uses all features of the service.

      Each of the three projects below will provide a Web API service for machine consumption and also a Website for consumption with a browser.

      1. REST using Asp.Net MVC or Restful WCF

        Develop a RESTful application using Asp.Net MVC. Look at these links:
        truly RESTful using WebApi, Getting Started with WebApi, REST with Asp.Net WebApi, haacked, Implementing REST - CodeProject, REST via HttpHandlers, REST with C#, Create and Consume REST, REST client library

        the main idea behind rest is to use the http methods, get, post, put, delete, ... as verbs with urls that are the nouns representing resources being manipulated. alternately you could develop a client for one of the restful apis provided by google or amazon.

        Why? There is a lot of interest in REST as a cross-platform technology to simplify web applications and make them more maintainable.

      2. REST via Apache and php or Java Server Pages

        Develop a RESTful application using php or Java Server Pages. Otherwise similar to the project described above.

        Why? Helps you develop some marketable skills and supports interesting comparisons with the project described above.

      3. REST via the Tiny Webserver described in the second project.

        Why? Develops what may be an excellent way to support inter-process and inter-machine communication for distributed applications, e.g., we aren't developing web applications, we're hijacking this web technology to build a simple internet communication mechanism on platforms that may have no installed web server.

    12. Go Programming Language

      Go is an interesting language, developed by Google, with roots in C. However, it is very different from C in concept and structure. It is designed to directly support concurrency through message passing and has a library that includes facilities for network programming, reflection, garbage collection, and parsing Go.

      In this Project you will explore the Go programming language, providing tutorials for the rest of us, and build a project you've implemented in CSE681 - Software Modeling and Analysis or CSE687 - Object Oriented Design, but here, entirely in Go. Please pick a source project that uses network communication, e.g., a Project #4 from the earlier course.

      You will compare the Go implementation to your C# or C++ implementation, focusing on structure, and code statistics, e.g., how many types, average number of functions, average function size, etc.. Finally you will draw conclusions about the Go language and its suitability for mainstream programming.

      References:

      Keynote talk on Go by Rob Pike, one of the three creators of Go
      Go standard packages
      Go package index

    13. Query library

      Develop a native C++ library to supply common LINQ-like queries into XML, mySQL, and SQL Server. Write several small demos.

      Why? Port an approximation of the nice C# facility to C++ and therefore make available cross-platform.

    14. Big Data

      Big Data refers to database structures designed to support massive amounts of data. They do not follow the Relational Model, but rather use other forms of storage like indexed documents, key/value pairs, or distributed tables. You are expected to do a significant amount of research, select an open-source "Big Data" database and implement some interesting project.

      Why? You will learn about some interesting technology that may eventually become as much of the developer's toolkit as Relational Databases.

    15. Cloud Computing

      Use the open-source Ubuntu Cloud which wraps OpenStack in a Ubuntu wrapper, or OpenStack Cloud directly to set up a demo cloud and develop a simple demo application. Alternately use Microsoft Azure via a developer account to set up and explore a cloud application.

      Why? This is System Programming in the large, and helps you build marketable skills.

    Summary:

    You may have noticed that there is some overlap between some of these projects. You are welcome to form groups of two or three participants that will work on a couple of these projects to build something bigger or more useful.

    With these projects you will do some research, then study the details of your platform, develop an interesting application, and make three fairly brief presentations with powerpoint and code resources.

  5. Project Options:
    • What is required for the Final Projects?

      1. Explore the resources I've provided with links above and on the Project Statements, if provided, find more yourself and study those, then make a presentation about your topic technology and the demonstration project you plan to implement.
      2. Download and setup the technology platform if that is appropriate. Next, create some small experimental prototypes with your platform, then make a presentation showing the rest of the class how to set up the platform and/or how things work.

        For example, with the tiny HttpClient and HttpServer there is no platform to download. Instead, you will write draft HttpClient and HttpServer classes. The HttpServer will have a socket listener, so you can try starting that and directing your browser to its port, e.g., localhost:port, to see if you can get replies. Then send requests from the HttpClient and see if you still get replies.

      3. Complete your project and make a final presentation demonstrating your running project.
      4. Merge your presentations into a handout for use in following years (your name will stay on the handout so you'll be famous).
    • Final Project Mechanics:

      1. Since this is a relatively large graduate class, all these presentations will take far too long without forming up groups and doing group presentations. Please talk among yourselves about collaborating. I'll pass out a sign-up sheet at the next class. The groups ideally will each have three members, and no group will be allowed to have more than four.
      2. Notice that there are several projects that are related. Each member of your group could take one project, then when you present you make comparisons with the work of other members of the group. If you don't find others you want to collaborate with, see me and we will figure out how to handle that.
      3. In order to evaluate your work, each group member must be very clear and explicit about the part of the project they are working on. In some cases I may feel that an individual may not be developing enough content and I will assign additional things to look at and do.
  6. Final Project Presentations Schedule:
    Schedule
    • Platform Survey
    • Installation and probing examples
    • Presentation of Results and Conclusions