{'fraction_non_alphanumeric': 0.030685161832702815, 'fraction_numerical': 0.0025220680958385876, 'mean_word_length': 5.346666666666667, 'pattern_counts': {'":': 0, '<': 0, '<?xml version=': 0, '>': 0, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
Interoperation with network services

The success of the Web and the emergence of ubiquitous computing (the embedding of computation and networking in the physical environment) has led to the re-emergence of the network service paradigm. A network service is a software component (e.g. a search engine) or a device (e.g. a media player) that exports a well-defined, network-accessible programmatic interface. The purpose of the network services paradigm is to provide a standard mechanism for discovering and accessing resources in the network. Two fundamental problems arise in this context: (1) how do (human) users discover and interact with services? and (2) how do applications discover and interact with services? 
Concerning user discovery and interaction, existing service frameworks have several drawbacks. First, most existing service frameworks limit users to accessing services from a specific platform (e.g., a Web browser) or modality (e.g., graphical user interfaces). Second, users are usually limited to interacting with one service at a time, making it tedious to accomplish tasks involving multiple services. Third, as users access similar services from different providers, they are likely to see different user interfaces, leading to an inconsistent user experience. In this thesis, we present the design and implementation of a service framework called ICrafter that addresses these limitations. We evaluated our contributions by deploying ICrafter in the iRoom, our testbed laboratory, and testing it on a number of iRoom services. 
Concerning application discovery and interaction, a major drawback of existing service frameworks is that changes to service interfaces, such as might occur due to versioning and extensions, break interoperability with existing applications in unpredictable ways. To remedy this, we first show how to automatically determine which changes to a service interface affect a given application written to that interface. Second, we show how these application-relevant changes can be “resolved” and interoperation re-enabled. We implemented these contributions in a system called AMIBA. Experimental results indicate that (typically) resolving 20% of the changes is sufficient to enable interoperation (because 80% of the changes are typically not relevant to a given application), thus demonstrating the utility of our approach.