'Computer'에 해당되는 글 568건

  1. 2008.04.21 XForms by 알 수 없는 사용자
  2. 2008.04.21 XPointer by 알 수 없는 사용자
  3. 2008.04.21 XML schema by 알 수 없는 사용자
  4. 2008.04.18 Binary search tree by 알 수 없는 사용자
  5. 2008.04.16 Smart Common Input Method by 알 수 없는 사용자
  6. 2008.04.16 Unified Modeling Language by 알 수 없는 사용자
  7. 2008.04.16 XPath by 알 수 없는 사용자
  8. 2008.04.16 XSL Transformations by 알 수 없는 사용자
  9. 2008.04.16 Document Type Definition by 알 수 없는 사용자
  10. 2008.04.16 Object-modeling technique by 알 수 없는 사용자

XForms

Computer/Terms 2008. 4. 21. 19:03

XForms is an XML format for the specification of a data processing model for XML data and user interface(s) for the XML data, such as web forms. XForms was designed to be the next generation of HTML / XHTML forms, but is generic enough that it can also be used in a standalone manner or with presentation languages other than XHTML to describe a user interface and a set of common data manipulation tasks.

XForms, much like XHTML 2.0 which is currently under development as of November 2006 and within which XForms will be embedded, differs from previous versions of XHTML. Because of this there is a learning curve for developers, but because XForms in general provides a large time savings for the development of enterprise quality web forms, it can be an attractive alternative for many uses.

XForms 1.0 (Third Edition) was published on 29 October 2007. The original XForms specification was made an official W3C Recommendation on 14 October 2003.

XForms 1.1, which introduces a number of improvements, reached the status of W3C Candidate Recommendation on 29 November 2007.

Reference:
http://en.wikipedia.org/wiki/Xform

Posted by 알 수 없는 사용자
,

XPointer

Computer/Terms 2008. 4. 21. 18:51

XPointer is a system for addressing components of XML based internet media.

At the present time (late 2002), XPointer is divided among four specifications: a "framework" which forms the basis for identifying XML fragments, a positional element addressing scheme, a scheme for namespaces, and a scheme for XPath-based addressing.

The XPointer language is designed to address structural aspects of XML, including text content and other information objects created as a result of parsing the document. Thus, it could be used to point to a section of a document highlighted by a user through a mouse drag action.

XPointer is covered by a technology patent held by Sun Microsystems.

Positional Element Addressing
The element() scheme introduces positional addressing of child elements. This is similar to a simple XPath address, but subsequent steps can only be numbers representing the position of a descendant relative to its branch on the tree.

For instance, given the following fragment:

<foobar id="foo">
  <bar/>
  <baz>
    <bom a="1"/>
  </baz>
  <bom a="2"/>
</foobar>


 
results as the following examples:

 xpointer(id("foo")) => foobar
 xpointer(/foobar/1) => bar
 xpointer(//bom) => bom (a=1), bom (a=2)
 xpointer(/1/2/1) => bom (a=1) (/1 descend into first element (foobar), descend into second child element (baz), select first child element (bom))



Reference:
http://en.wikipedia.org/wiki/Xpointer

Posted by 알 수 없는 사용자
,

XML schema

Computer/Terms 2008. 4. 21. 18:44

An XML schema is a description of a type of XML document, typically expressed in terms of constraints on the structure and content of documents of that type, above and beyond the basic syntax constraints imposed by XML itself. An XML schema provides a view of the document type at a relatively high level of abstraction.

There are languages developed specifically to express XML schemas. The Document Type Definition (DTD) language, which is native to the XML specification, is a schema language that is of relatively limited capability, but that also has other uses in XML aside from the expression of schemas. Two other very popular, more expressive XML schema languages are XML Schema (W3C) and RELAX NG.

The mechanism for associating an XML document with a schema varies according to the schema language. The association may be achieved via markup within the XML document itself, or via some external means.

Reference:
http://en.wikipedia.org/wiki/XML_schema

Posted by 알 수 없는 사용자
,

Binary search tree

Computer/Terms 2008. 4. 18. 15:46

In computer science, a binary search tree (BST) is a binary tree data structure which has the following properties:

- each node (item in the tree) has a value;
- a total order (linear order) is defined on these values;
- the left subtree of a node contains only values less than the node's value;
- the right subtree of a node contains only values greater than or equal to the node's value.

The major advantage of binary search trees over other data structures is that the related sorting algorithms and search algorithms such as in-order traversal can be very efficient.

Binary search trees can choose to allow or disallow duplicate values, depending on the implementation.

Binary search trees are a fundamental data structure used to construct more abstract data structures such as sets, multisets, and associative arrays.

Operations
Operations on a binary tree require comparisons between nodes. These comparisons are made with calls to a comparator, which is a subroutine that computes the total order (linear order) on any two values. This comparator can be explicitly or implicitly defined, depending on the language in which the BST is implemented.

Searching
Searching a binary tree for a specific value can be a recursive or iterative process. This explanation covers a recursive method.

We begin by examining the root node. If the value we are searching for equals the root, the value exists in the tree. If the value we are searching for is less than the root, it must be in the left subtree. Similarly, if it is greater than the root, then it must be in the right subtree.

This process is repeated on each subsequent node until the value is found or we reach a leaf node. If a leaf node is reached and the searched value is not found, then the item must not be present in the tree.

Here is the search algorithm in the Python programming language:

def search_binary_tree(node, key):
     if node is None:
         return None  # key not found
     if key < node.key:
         return search_binary_tree(node.left, key)
     elif key > node.key:
         return search_binary_tree(node.right, key)
     else:  # key is equal to node key
         return node.value  # found key

This operation requires O(log n) time in the average case, but needs O(n) time in the worst-case, when the unbalanced tree resembles a linked list (degenerate tree).

Insertion
Insertion begins as a search would begin; if the root is not equal to the value, we search the left or right subtrees as before. Eventually, we will reach an external node and add the value as its right or left child, depending on the node's value. In other words, we examine the root and recursively insert the new node to the left subtree if the new value is less than the root, or the right subtree if the new value is greater than or equal to the root.

Here's how a typical binary search tree insertion might be performed in C++:

/* Inserts the node pointed to by "newNode" into the subtree rooted at "treeNode" */
 void InsertNode(struct node *&treeNode, struct node *newNode)
 {
     if (treeNode == NULL)
       treeNode = newNode;
     else if (newNode->value < treeNode->value)
       InsertNode(treeNode->left, newNode);
     else
       InsertNode(treeNode->right, newNode);
 }

The above "destructive" procedural variant modifies the tree in place. It uses only constant space, but the previous version of the tree is lost. Alternatively, as in the following Python example, we can reconstruct all ancestors of the inserted node; any reference to the original tree root remains valid, making the tree a persistent data structure:

def binary_tree_insert(node, key, value):
     if node is None:
         return TreeNode(None, key, value, None)
 
     if key == node.key:
         return TreeNode(node.left, key, value, node.right)
     if key < node.key:
         return TreeNode(binary_tree_insert(node.left, key, value), node.key, node.value, node.right)
     else:
         return TreeNode(node.left, node.key, node.value, binary_tree_insert(node.right, key, value))

The part that is rebuilt uses Θ(log n) space in the average case and Ω(n) in the worst case (see big-O notation).

In either version, this operation requires time proportional to the height of the tree in the worst case, which is O(log n) time in the average case over all trees, but Ω(n) time in the worst case.

Another way to explain insertion is that in order to insert a new node in the tree, its value is first compared with the value of the root. If its value is less than the root's, it is then compared with the value of the root's left child. If its value is greater, it is compared with the root's right child. This process continues, until the new node is compared with a leaf node, and then it is added as this node's right or left child, depending on its value.

There are other ways of inserting nodes into a binary tree, but this is the only way of inserting nodes at the leaves and at the same time preserving the BST structure.

Deletion
There are several cases to be considered:

- Deleting a leaf: Deleting a node with no children is easy, as we can simply remove it from the tree.
- Deleting a node with one child: Delete it and replace it with its child.
- Deleting a node with two children: Suppose the node to be deleted is called N. We replace the value of N with either its in-order successor (the left-most child of the right subtree) or the in-order predecessor (the right-most child of the left subtree).

Once we find either the in-order successor or predecessor, swap it with N, and then delete it. Since both the successor and the predecessor must have fewer than two children, either one can be deleted using the previous two cases. A good implementation avoids consistently using one of these nodes, however, because this can unbalance the tree.

Here is C++ sample code for a destructive version of deletion. (We assume the node to be deleted has already been located using search.)

void DeleteNode(struct node * & node) {
     if (node->left == NULL) {
         struct node *temp = node;
         node = node->right;
         delete temp;
     } else if (node->right == NULL) {
         struct node *temp = node;
         node = node->left;
         delete temp;
     } else {
         // In-order predecessor (rightmost child of left subtree)
         // Node has two children - get max of left subtree
         struct node **temp = &node->left; // get left node of the original node
 
         // find the rightmost child of the subtree of the left node
         while ((*temp)->right != NULL) {
             temp = &(*temp)->right;
         }
 
         // copy the value from the in-order predecessor to the original node
         node->value = (*temp)->value;
 
         // then delete the predecessor
         DeleteNode(*temp);
     }
}

Although this operation does not always traverse the tree down to a leaf, this is always a possibility; thus in the worst case it requires time proportional to the height of the tree. It does not require more even when the node has two children, since it still follows a single path and does not visit any node twice.

Here is the code in Python:

def findSuccessor(self):
    succ = None
    if self.rightChild:
        succ = self.rightChild.findMin()
    else:
        if self.parent.leftChild == self:
            succ = self.parent
        else:
            self.parent.rightChild = None
            succ = self.parent.findSuccessor()
            self.parent.rightChild = self
        return succ
 
def findMin(self):
    n = self
    while n.leftChild:
        n = n.leftChild
    print 'found min, key = ', n.key
    return n
 
def spliceOut(self):
    if (not self.leftChild and not self.rightChild):
        if self == self.parent.leftChild:
            self.parent.leftChild = None
        else:
            self.parent.rightChild = None
    elif (self.leftChild or self.rightChild):
        if self.leftChild:
            if self == self.parent.leftChild:
                self.parent.leftChild = self.leftChild
            else:
                self.parent.rightChild = self.leftChild
        else:
            if self == self.parent.leftChild:
                self.parent.leftChild = self.rightChild
            else:
                self.parent.rightChild = self.rightChild
 
def binary_tree_delete(self, key):
    if self.key == key:
        if not (self.leftChild or self.rightChild):
            if self == self.parent.leftChild:
                self.parent.leftChild = None
            else:
                self.parent.rightChild = None
        elif (self.leftChild or self.rightChild) and (not (self.leftChild and self.rightChild)):
            if self.leftChild:
                if self == self.parent.leftChild:
                    self.parent.leftChild = self.leftChild
                else:
                    self.parent.rightChild = self.leftChild
            else:
                if self == self.parent.leftChild:
                    self.parent.leftChild = self.rightChild
                else:
                    self.parent.rightChild = self.rightchild
        else:
            succ = self.findSuccessor()
            succ.spliceOut()
            if self == self.parent.leftChild:
                self.parent.leftChild = succ
            else:
                self.parent.rightChild = succ
            succ.leftChild = self.leftChild
            succ.rightChild = self.rightChild
    else:
        if key < self.key:
            if self.leftChild:
                self.leftChild.delete_key(key)
            else:
                print "trying to remove a non-existant node"
        else:  
            if self.rightChild:
                self.rightChild.delete_key(key)
            else:
                print "trying to remove a non-existant node"

Traversal
Once the binary search tree has been created, its elements can be retrieved in order by recursively traversing the left subtree of the root node, accessing the node itself, then recursively traversing the right subtree of the node, continuing this pattern with each node in the tree as it's recursively accessed. The tree may also be traversed in pre-order or post-order traversals.

def traverse_binary_tree(treenode):
     if treenode is None: return
     left, nodevalue, right = treenode
     traverse_binary_tree(left)
     visit(nodevalue)
     traverse_binary_tree(right)

Traversal requires Ω(n) time, since it must visit every node. This algorithm is also O(n), and so it is asymptotically optimal.

Sort
A binary search tree can be used to implement a simple but inefficient sorting algorithm. Similar to heapsort, we insert all the values we wish to sort into a new ordered data structure — in this case a binary search tree — and then traverse it in order, building our result:

def build_binary_tree(values):
     tree = None
     for v in values:
         tree = binary_tree_insert(tree, v)
     return tree
 
 def traverse_binary_tree(treenode):
     if treenode is None: return []
     else:
         left, value, right = treenode
         return (traverse_binary_tree(left), [value], traverse_binary_tree(right))

The worst-case time of build_binary_tree is Θ(n2) — if you feed it a sorted list of values, it chains them into a linked list with no left subtrees. For example, build_binary_tree([1, 2, 3, 4, 5]) yields the tree (None, 1, (None, 2, (None, 3, (None, 4, (None, 5, None))))).

There are several schemes for overcoming this flaw with simple binary trees; the most common is the self-balancing binary search tree. If this same procedure is done using such a tree, the overall worst-case time is O(nlog n), which is asymptotically optimal for a comparison sort. In practice, the poor cache performance and added overhead in time and space for a tree-based sort (particularly for node allocation) make it inferior to other asymptotically optimal sorts such as quicksort and heapsort for static list sorting. On the other hand, it is one of the most efficient methods of incremental sorting, adding items to a list over time while keeping the list sorted at all times.

Reference:
http://en.wikipedia.org/wiki/Binary_search_tree

Posted by 알 수 없는 사용자
,

The Smart Common Input Method platform (SCIM) is an input method (IM) platform containing support for more than thirty languages (CJK and many European languages) for POSIX-style operating systems including Linux and BSD.

SCIM is a development platform to reduce development times of IM in software. It uses a clear architecture and provides a simple and powerful programming interface.

SCIM is a common IM platform written in the C++ language. It abstracts the input method interface into several classes and attempts to make the classes more simple and independent from each other. With the simpler and more independent interfaces, developers can write their own input methods in fewer lines of code.

SCIM is a modularized IM platform, and as such, components can be implemented as dynamically loadable modules, thus can be loaded during runtime at will. For example, input methods written for SCIM could be IMEngine modules, and users can use such IMEngine modules combined with different interface modules (FrontEnd) in different environments without rewrite or recompile of the IMEngine modules, reducing the compile time or development time of the project.

SCIM is a high level library, similar to XIM or IIIMF, however, SCIM claims to be simpler than either of those IM platforms. SCIM also claims that it can be used alongside XIM or IIIMF. SCIM can also be used to extend the input method interface of existing application toolkits, such as GTK+2 and Qt via IMmodules.

Reference:
http://en.wikipedia.org/wiki/Scim

Posted by 알 수 없는 사용자
,

In the field of software engineering, the Unified Modeling Language (UML) is a standardized visual specification language for object modeling. UML is a general-purpose modeling language that includes a graphical notation used to create an abstract model of a system, referred to as a UML model.

General description
UML is officially defined at the Object Management Group (OMG) by the UML metamodel, a Meta-Object Facility metamodel (MOF). Like other MOF-based specifications, the UML metamodel and UML models may be serialized in XML. UML was designed to specify, visualize, construct, and document software-intensive systems.

UML is not restricted to modeling software. UML is also used for business process modeling, systems engineering modeling and representing organizational structures. The Systems Modeling Language (SysML) is a Domain-Specific Modeling language for systems engineering that is defined as a UML 2.0 profiles.

UML has been a catalyst for the evolution of model-driven technologies, which include model-driven development (MDD), model-driven engineering (MDE), and model-driven architecture (MDA). By establishing an industry consensus on a graphic notation to represent common concepts like classes, components, generalization, aggregation, and behaviors, UML has allowed software developers to concentrate more on design and architecture.[citation needed]

UML models may be automatically transformed to other representations (e.g. Java) by means of QVT-like transformation languages, supported by the OMG.

UML is extensible, offering the following mechanisms for customization: profiles and stereotype. The semantics of extension by profiles have been improved with the UML 2.0 major revision.

Methods
UML is not a method by itself; however, it was designed to be compatible with the leading object-oriented software development methods of its time (for example OMT, Booch, Objectory). Since UML has evolved, some of these methods have been recast to take advantage of the new notation (for example OMT), and new methods have been created based on UML. The best known is Rational Unified Process (RUP). There are many other UML-based methods like Abstraction Method, Dynamic Systems Development Method, and others, designed to provide more specific solutions, or achieve different objectives.

Modeling
It is very important to distinguish between the UML model and the set of diagrams of a system. A diagram is a partial graphical representation of a system's model. The model also contains a "semantic backplane" — documentation such as written use cases that drive the model elements and diagrams.

UML diagrams represent three different views of a system model:

Functional requirements view

 Emphasizes the functional requirements of the system from the user's point of view.
 Includes use case diagrams.

Static structural view

 Emphasizes the static structure of the system using objects, attributes, operations, and relationships.
 Includes class diagrams and composite structure diagrams.

Dynamic behavior view

 Emphasizes the dynamic behavior of the system by showing collaborations among objects and changes to the internal states of objects.
 Includes sequence diagrams, activity diagrams and state machine diagrams.

UML models can be exchanged among UML tools by using the XMI interchange format.

Diagrams
UML 2.0 has 13 types of diagrams, which can be categorized hierarchically as follows:

Structure diagrams emphasize what things must be in the system being modeled:

- Class diagram
- Component diagram
- Composite structure diagram (added in UML 2.x)
- Deployment diagram
- Object diagram
- Package diagram

Behavior diagrams emphasize what must happen in the system being modeled:

- Activity diagram
- State Machine diagram
- Use case diagram

Interaction diagrams, a subset of behavior diagrams, emphasize the flow of control and data among the things in the system being modeled:

- Communication diagram
- Interaction overview diagram (added in UML 2.x)
- Sequence diagram
- Timing diagram (added in UML 2.x)

The Protocol State Machine is a sub-variant of the State Machine. It may be used to model network communication protocols.

UML does not restrict UML element types to a certain diagram type. In general, every UML element may appear on almost all types of diagrams. This flexibility has been partially restricted in UML 2.0.

In keeping with the tradition of engineering drawings, a comment or note explaining usage, constraint, or intent is always allowed in a UML diagram.

Concepts
UML uses many concepts from many sources. For a definitive list, consult the glossary of Unified Modeling Language terms. Notable concepts are listed here.

For structure

- Actor, attribute, class, component, interface, object, package.

For behavior

- Activity, event, message, method, operation, state, use case.

For relationships

- Aggregation, association, composition, dependency, generalization (or inheritance).

Other concepts

- Stereotype. It qualifies the symbol it is attached to.
- Multiplicity notation which corresponds to database modeling cardinality, e.g., 1, 0..1, 1..*
- Role

Criticisms
Although UML is a widely recognized and used modeling standard, it is frequently criticized for the following deficiencies:

- Language bloat. UML is often criticized as being gratuitously large and complex. It contains many diagrams and constructs that are redundant or infrequently used. This criticism is more frequently directed at UML 2.0 than UML 1.0, since newer revisions include more design-by-committee compromises.
- Problems in learning and adopting. The problems cited above can make learning and adopting UML problematic, especially when required of engineers lacking the prerequisite skills.
- Only the code is in sync with the code. Another perspective holds that it is working systems that are important, not beautiful models. As Jack Reeves succinctly put it, "The code is the design." Pursuing this notion leads to the need for better ways of writing software; UML has value in approaches that compile the models to generate source or executable code. This however, may still not be sufficient since it is not clear that UML 2.0's Action Semantics exhibit Turing completeness. "All models are wrong, but some models are useful."
- Cumulative Impedance/Impedance Mismatching. As with any notational system, UML is able to represent some systems more concisely or efficiently than others. Thus a developer gravitates toward solutions that reside at the intersection of the capabilities of UML and the implementation language. This problem is particularly pronounced if the implementation language does not adhere to orthodox object-oriented doctrine, as the intersection set between UML and implementation language may be that much smaller.
- Aesthetically Inconsistent. This argument states that the adhoc mixing of abstract notation (2-D ovals, boxes, etc) make UML appear jarring and that more effort could have been made to construct uniform and aesthetically pleasing representations.
- Tries to be all things to all programmers. UML is a general purpose modeling language, which tries to achieve compatibility with every possible implementation language. In the context of a specific project, the most applicable features of UML must be delimited for use by the design team to accomplish the specific goal. Additionally, the means of restricting the scope of UML to a particular domain is through a formalism that is not completely formed, and is itself the subject of criticism.
- Dysfunctional interchange format. While the XMI (XML Metadata Interchange) standard is designed to facilitate the interchange of UML models, it has been largely ineffective in the practical interchange of UML 2.x models. (A modeler can empirically verify this shortcoming herself by defining a UML 2.x model in one tool, and attempting to import it into another tool without loss of information.) This interoperability ineffectiveness is attributable to two reasons: First, XMI 2.x is large and complex in its own right, since it purports to address a technical problem more ambitious than exchanging UML 2.x models. In particular, it attempts to provide a mechanism for facilitating the exchange of any arbitrary modeling language defined by the OMG's Meta-Object Facility (MOF). Secondly, the UML 2.x Diagram Interchange specification lacks sufficient detail to facilitate reliable interchange of UML 2.x notations between modeling tools. Since UML is a visual modeling language, this shortcoming is substantial for modelers who don't want to redraw their diagrams.

Many modeling experts have written sharp criticisms of UML, including Bertrand Meyer's "UML: The Positive Spin", and a paper presented by Brian Henderson-Sellers at the MoDELS/UML conference in Genova, Italy in October 2006.

Reference:
http://en.wikipedia.org/wiki/Unified_Modeling_Language

Posted by 알 수 없는 사용자
,

XPath

Computer/Terms 2008. 4. 16. 13:27

XPath (XML Path Language) is a language for selecting nodes from an XML document. In addition, XPath may be used to compute values (strings, numbers, or boolean values) from the content of an XML document. The current version of the language is XPath 2.0, but because version 1.0 is still the more widely-used version, this article describes XPath 1.0.

The XPath language is based on a tree representation of the XML document, and provides the ability to navigate around the tree, selecting nodes by a variety of criteria. In popular use (though not in the official specification), an XPath expression is often referred to simply as an XPath.

Originally motivated by a desire to provide a common syntax and behavior model between XPointer and XSLT, XPath has rapidly been adopted by developers as a small query language, and subsets are used in other W3C specifications such as XML Schema and XForms.

Reference:
http://en.wikipedia.org/wiki/Xpath

Posted by 알 수 없는 사용자
,

XSL Transformations

Computer/Terms 2008. 4. 16. 13:24

Extensible Stylesheet Language Transformations (XSLT) is an XML-based language used for the transformation of XML documents into other XML or "human-readable" documents. The original document is not changed; rather, a new document is created based on the content of an existing one. The new document may be serialized (output) by the processor in standard XML syntax or in another format, such as HTML or plain text. XSLT is most often used to convert data between different XML schemas or to convert XML data into HTML or XHTML documents for web pages, creating a dynamic web page, or into an intermediate XML format that can be converted to PDF documents.

As a language, XSLT is influenced by functional languages, and by text-based pattern matching languages like SNOBOL and awk. Its most direct predecessor was DSSSL, a language that performed the same function for SGML that XSLT performs for XML. XSLT can also be considered as a template processor.

XSLT is Turing complete.

Reference:
http://en.wikipedia.org/wiki/Xslt

Posted by 알 수 없는 사용자
,

Document Type Definition (DTD) is one of several SGML and XML schema languages, and is also the term used to describe a document or portion thereof that is authored in the DTD language. A DTD is primarily used for the expression of a schema via a set of declarations that conform to a particular markup syntax and that describe a class, or type, of document, in terms of constraints on the structure of that document. A DTD may also declare constructs that are not always required to establish document structure, but that may affect the interpretation of some documents. XML documents are described using a subset of DTD which imposes a number of restrictions on the document's structure, as required per the XML standard (XML is in itself an application of SGML optimized for automated parsing).

DTD is native to the SGML and XML specifications, and since its introduction other specification languages such as XML Schema and RELAX NG have been released with additional functionality.

As an expression of a schema, a DTD specifies, in effect, the syntax of an "application" of SGML or XML, such as the derivative language HTML or XHTML. This syntax is usually a less general form of the syntax of SGML or XML.

In a DTD, the structure of a class of documents is described via element and attribute-list declarations. Element declarations name the allowable set of elements within the document, and specify whether and how declared elements and runs of character data may be contained within each element. Attribute-list declarations name the allowable set of attributes for each declared element, including the type of each attribute value, if not an explicit set of valid value(s).

Reference:
http://en.wikipedia.org/wiki/Document_Type_Definition

Posted by 알 수 없는 사용자
,

The object-modeling technique (OMT) is an object modeling language for software modeling and designing. It was developed circa 1991 by Rumbaugh, Blaha, Premerlani, Eddy and Lorensen as a method to develop object-oriented systems, and to support object-oriented programming.

OMT is a predecessor of the Unified Modeling Language (UML). Many OMT modeling elements are common to UML.

Reference:
http://en.wikipedia.org/wiki/Object-modeling_technique

Posted by 알 수 없는 사용자
,