removed dataforge
@ -1,29 +0,0 @@
|
|||||||
import React from "react"
|
|
||||||
import PropTypes from "prop-types"
|
|
||||||
|
|
||||||
import favicon from "../../images/dataforge/df_logo.png"
|
|
||||||
import Helmet from "react-helmet"
|
|
||||||
|
|
||||||
import SEO from "../../components/dataforge/seo"
|
|
||||||
import Header from "./header"
|
|
||||||
import Footer from "./footer"
|
|
||||||
import "../../styles/dataforge/docs.css"
|
|
||||||
|
|
||||||
const DocsLayout = ({children}) => (
|
|
||||||
<>
|
|
||||||
<Helmet>
|
|
||||||
<link rel="icon" href={favicon}/>
|
|
||||||
</Helmet>
|
|
||||||
<SEO PageTitle="Documentation |"/>
|
|
||||||
<Header id="df"/>
|
|
||||||
<main id="docs">{children}</main>
|
|
||||||
<Footer id="df"/>
|
|
||||||
</>
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
DocsLayout.propTypes = {
|
|
||||||
children: PropTypes.node.isRequired,
|
|
||||||
}
|
|
||||||
|
|
||||||
export default DocsLayout
|
|
@ -1,23 +0,0 @@
|
|||||||
import React from "react"
|
|
||||||
import "../../styles/dataforge/footer.css"
|
|
||||||
|
|
||||||
const Footer = () => (
|
|
||||||
<footer id="df">
|
|
||||||
<div class = "container">
|
|
||||||
<p>
|
|
||||||
© 2016
|
|
||||||
<a href="mailto:nozik@inr.ru"> Alexander Nozik </a> under
|
|
||||||
<a href="http://www.apache.org/licenses/LICENSE-2.0"> Apache 2.0 license </a>
|
|
||||||
| Built with
|
|
||||||
{` `}
|
|
||||||
<a href = "https://www.gatsbyjs.org">Gatsby framework</a>
|
|
||||||
{` `}
|
|
||||||
and
|
|
||||||
{` `}
|
|
||||||
<a href = "https://getbootstrap.com/">Bootstrap styles</a>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</footer>
|
|
||||||
)
|
|
||||||
|
|
||||||
export default Footer
|
|
@ -1,43 +0,0 @@
|
|||||||
import React from "react"
|
|
||||||
import { Link } from "@reach/router"
|
|
||||||
|
|
||||||
import logo from "../../images/dataforge/df_logo.png"
|
|
||||||
import "../../styles/dataforge/header.css"
|
|
||||||
import "../../styles/bootstrap.min.css"
|
|
||||||
import {Navbar, Nav} from "react-bootstrap"
|
|
||||||
|
|
||||||
const NavLink = props => (
|
|
||||||
<Link
|
|
||||||
{...props}
|
|
||||||
getProps={({ isCurrent }) => {
|
|
||||||
return {
|
|
||||||
style: {
|
|
||||||
color: isCurrent ? "white" : "rgb(230, 221, 221)"
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
|
|
||||||
const Header = () => (
|
|
||||||
<header id="df">
|
|
||||||
<Navbar expand="lg" fixed="top">
|
|
||||||
<div class="container">
|
|
||||||
<Navbar.Toggle aria-controls="basic-navbar-nav" />
|
|
||||||
<Navbar.Collapse id="basic-navbar-nav">
|
|
||||||
<Nav className="mr-auto">
|
|
||||||
<Navbar.Brand><Link to="/dataforge"><img src={logo} height="60px" width="65px" alt="dataforge logo" id="dflogo"/></Link></Navbar.Brand>
|
|
||||||
<Nav.Link><NavLink id="df" to="/dataforge/news">News</NavLink></Nav.Link>
|
|
||||||
<Nav.Link><NavLink id="df" to="/dataforge/docs">Documentation</NavLink></Nav.Link>
|
|
||||||
<Nav.Link><NavLink id="df" to="/dataforge/modules">Modules</NavLink></Nav.Link>
|
|
||||||
<Nav.Link><NavLink id="df" to="/dataforge/releases">Releases</NavLink></Nav.Link>
|
|
||||||
<Nav.Link><NavLink id="df" to="/dataforge/apps">Applications</NavLink></Nav.Link>
|
|
||||||
<Nav.Link><NavLink id="df" to="/dataforge/misc">See also</NavLink></Nav.Link>
|
|
||||||
</Nav>
|
|
||||||
</Navbar.Collapse>
|
|
||||||
</div>
|
|
||||||
</Navbar>
|
|
||||||
</header>
|
|
||||||
)
|
|
||||||
|
|
||||||
export default Header
|
|
@ -1,31 +0,0 @@
|
|||||||
import React from "react"
|
|
||||||
import PropTypes from "prop-types"
|
|
||||||
|
|
||||||
import favicon from "../../images/dataforge/df_logo.png"
|
|
||||||
import Helmet from "react-helmet"
|
|
||||||
|
|
||||||
import Header from "./header"
|
|
||||||
import Footer from "./footer"
|
|
||||||
import SEO from "./seo"
|
|
||||||
import "../../styles/dataforge/layout.css"
|
|
||||||
|
|
||||||
const Layout = ({children}) => (
|
|
||||||
<>
|
|
||||||
<Helmet>
|
|
||||||
<link rel="icon" href={favicon}/>
|
|
||||||
</Helmet>
|
|
||||||
<SEO title=" "/>
|
|
||||||
<Header id="df"/>
|
|
||||||
<div class = "container">
|
|
||||||
<main id="df">{children}</main>
|
|
||||||
</div>
|
|
||||||
<Footer id="df"/>
|
|
||||||
</>
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
Layout.propTypes = {
|
|
||||||
children: PropTypes.node.isRequired,
|
|
||||||
}
|
|
||||||
|
|
||||||
export default Layout
|
|
@ -1,28 +0,0 @@
|
|||||||
import React from "react"
|
|
||||||
import PropTypes from "prop-types"
|
|
||||||
import Helmet from "react-helmet"
|
|
||||||
|
|
||||||
const SEO = ({ lang, PageTitle }) => {
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Helmet
|
|
||||||
htmlAttributes={{
|
|
||||||
lang,
|
|
||||||
}}
|
|
||||||
title="DataForge"
|
|
||||||
pageTitle = {PageTitle}
|
|
||||||
titleTemplate={`${PageTitle} %s`}
|
|
||||||
/>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
SEO.defaultProps = {
|
|
||||||
lang: `en`,
|
|
||||||
}
|
|
||||||
|
|
||||||
SEO.propTypes = {
|
|
||||||
lang: PropTypes.string,
|
|
||||||
title: PropTypes.string.isRequired,
|
|
||||||
}
|
|
||||||
|
|
||||||
export default SEO
|
|
@ -1,30 +0,0 @@
|
|||||||
import React from "react"
|
|
||||||
import { Link } from "gatsby"
|
|
||||||
import { globalHistory as history } from '@reach/router'
|
|
||||||
import { push as Menu } from "react-burger-menu"
|
|
||||||
|
|
||||||
const SideBar = ( props ) => {
|
|
||||||
let curActive = [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '];
|
|
||||||
var { location } = history;
|
|
||||||
if (location.pathname === '/dataforge/docs/'){curActive[0] = 'active';}
|
|
||||||
if (location.pathname === '/dataforge/docs/meta'){curActive[1] = 'active';}
|
|
||||||
if (location.pathname === '/dataforge/docs/framework'){curActive[2] = 'active';}
|
|
||||||
if (location.pathname === '/dataforge/docs/data_flow'){curActive[3] = 'active';}
|
|
||||||
if (location.pathname === '/dataforge/docs/envelopes'){curActive[4] = 'active';}
|
|
||||||
if (location.pathname === '/dataforge/docs/storage'){curActive[5] = 'active';}
|
|
||||||
if (location.pathname === '/dataforge/docs/control'){curActive[6] = 'active';}
|
|
||||||
if (location.pathname === '/dataforge/docs/extensions'){curActive[7] = 'active';}
|
|
||||||
return(
|
|
||||||
<Menu {...props}>
|
|
||||||
<Link className="menu-item" id={`${curActive[0]}`} to="./dataforge/docs/">1 - How to read this documentation</Link>
|
|
||||||
<Link className="menu-item" id={`${curActive[1]}`} to="./dataforge/docs/meta">2 - Meta-data processor</Link>
|
|
||||||
<Link className="menu-item" id={`${curActive[2]}`} to="./dataforge/docs/framework">3 - Framework</Link>
|
|
||||||
<Link className="menu-item" id={`${curActive[3]}`} to="./dataforge/docs/data_flow">4 - Data flow</Link>
|
|
||||||
<Link className="menu-item" id={`${curActive[4]}`} to="./dataforge/docs/envelopes">5 - Envelopes</Link>
|
|
||||||
<Link className="menu-item" id={`${curActive[5]}`} to="./dataforge/docs/storage">6 - Storage plugin</Link>
|
|
||||||
<Link className="menu-item" id={`${curActive[6]}`} to="./dataforge/docs/control">7 - Control plugin</Link>
|
|
||||||
<Link className="menu-item" id={`${curActive[7]}`} to="./dataforge/docs/extensions">8 - Language extensions</Link>
|
|
||||||
</Menu>
|
|
||||||
)}
|
|
||||||
|
|
||||||
export default SideBar
|
|
Before Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 12 KiB |
@ -1,196 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
|
||||||
<!-- Generated by Microsoft Visio, SVG Export meta.svg Page-1 -->
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events"
|
|
||||||
xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="4.59173in" height="5.27184in"
|
|
||||||
viewBox="0 0 330.605 379.573" xml:space="preserve" color-interpolation-filters="sRGB" class="st13">
|
|
||||||
<v:documentProperties v:langID="1033" v:metric="true" v:viewMarkup="false">
|
|
||||||
<v:userDefs>
|
|
||||||
<v:ud v:nameU="msvSubprocessMaster" v:prompt="" v:val="VT4(Rectangle)"/>
|
|
||||||
<v:ud v:nameU="msvNoAutoConnect" v:val="VT0(1):26"/>
|
|
||||||
</v:userDefs>
|
|
||||||
</v:documentProperties>
|
|
||||||
|
|
||||||
<style type="text/css">
|
|
||||||
<![CDATA[
|
|
||||||
.st1 {fill:#ffffff;stroke:#ed7d31;stroke-width:0.75}
|
|
||||||
.st2 {fill:#ed7d31;font-family:Calibri;font-size:0.833336em}
|
|
||||||
.st3 {visibility:visible}
|
|
||||||
.st4 {fill:#5b9bd5;fill-opacity:0.25;filter:url(#filter_2);stroke:#5b9bd5;stroke-opacity:0.25}
|
|
||||||
.st5 {fill:#4f87bb;stroke:#40709c;stroke-width:0.75}
|
|
||||||
.st6 {fill:#feffff;font-family:Calibri;font-size:0.833336em}
|
|
||||||
.st7 {marker-end:url(#mrkr4-27);stroke:#5b9bd5;stroke-linecap:round;stroke-linejoin:round;stroke-width:1}
|
|
||||||
.st8 {fill:#5b9bd5;fill-opacity:1;stroke:#5b9bd5;stroke-opacity:1;stroke-width:0.28409090909091}
|
|
||||||
.st9 {fill:url(#grad0-36);stroke:#61973d;stroke-width:0.75}
|
|
||||||
.st10 {fill:#61973d;font-family:Calibri;font-size:0.833336em}
|
|
||||||
.st11 {fill:#ffffff;stroke:#70ad47;stroke-width:0.75}
|
|
||||||
.st12 {fill:#70ad47;font-family:Calibri;font-size:0.833336em}
|
|
||||||
.st13 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3}
|
|
||||||
]]>
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<defs id="Patterns_And_Gradients">
|
|
||||||
<linearGradient id="grad0-36" x1="0" y1="0" x2="1" y2="0" gradientTransform="rotate(60 0.5 0.5)">
|
|
||||||
<stop offset="0" stop-color="#ebf1e8" stop-opacity="1"/>
|
|
||||||
<stop offset="0.24" stop-color="#f5f8f4" stop-opacity="1"/>
|
|
||||||
<stop offset="0.54" stop-color="#feffff" stop-opacity="1"/>
|
|
||||||
</linearGradient>
|
|
||||||
</defs>
|
|
||||||
<defs id="Markers">
|
|
||||||
<g id="lend4">
|
|
||||||
<path d="M 2 1 L 0 0 L 2 -1 L 2 1 " style="stroke:none"/>
|
|
||||||
</g>
|
|
||||||
<marker id="mrkr4-27" class="st8" v:arrowType="4" v:arrowSize="2" v:setback="7.04" refX="-7.04" orient="auto"
|
|
||||||
markerUnits="strokeWidth" overflow="visible">
|
|
||||||
<use xlink:href="#lend4" transform="scale(-3.52,-3.52) "/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<defs id="Filters">
|
|
||||||
<filter id="filter_2">
|
|
||||||
<feGaussianBlur stdDeviation="2"/>
|
|
||||||
</filter>
|
|
||||||
</defs>
|
|
||||||
<g v:mID="0" v:index="1" v:groupContext="foregroundPage">
|
|
||||||
<v:userDefs>
|
|
||||||
<v:ud v:nameU="msvThemeOrder" v:val="VT0(0):26"/>
|
|
||||||
</v:userDefs>
|
|
||||||
<title>Page-1</title>
|
|
||||||
<v:pageProperties v:drawingScale="0.0393701" v:pageScale="0.0393701" v:drawingUnits="24" v:shadowOffsetX="8.50394"
|
|
||||||
v:shadowOffsetY="-8.50394"/>
|
|
||||||
<v:layer v:name="Connector" v:index="0"/>
|
|
||||||
<g id="shape1-1" v:mID="1" v:groupContext="shape" transform="translate(18.75,-260.958)">
|
|
||||||
<title>Rectangle</title>
|
|
||||||
<desc>Meta</desc>
|
|
||||||
<v:userDefs>
|
|
||||||
<v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
|
|
||||||
</v:userDefs>
|
|
||||||
<v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
|
|
||||||
<v:textRect cx="42.5197" cy="365.399" width="85.04" height="28.3465"/>
|
|
||||||
<rect x="0" y="351.226" width="85.0394" height="28.3465" class="st1"/>
|
|
||||||
<text x="31.69" y="368.4" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Meta</text> </g>
|
|
||||||
<g id="shape2-4" v:mID="2" v:groupContext="shape" transform="translate(139.222,-331.824)">
|
|
||||||
<title>Rectangle.2</title>
|
|
||||||
<desc>someValue</desc>
|
|
||||||
<v:userDefs>
|
|
||||||
<v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
|
|
||||||
</v:userDefs>
|
|
||||||
<v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
|
|
||||||
<v:textRect cx="42.5197" cy="365.399" width="85.04" height="28.3465"/>
|
|
||||||
<g id="shadow2-5" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
|
|
||||||
transform="matrix(1,0,0,1,0.345598,1.97279)" class="st3">
|
|
||||||
<rect x="0" y="351.226" width="85.0394" height="28.3465" class="st4"/>
|
|
||||||
</g>
|
|
||||||
<rect x="0" y="351.226" width="85.0394" height="28.3465" class="st5"/>
|
|
||||||
<text x="19.95" y="368.4" class="st6" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>someValue</text> </g>
|
|
||||||
<g id="shape3-10" v:mID="3" v:groupContext="shape" transform="translate(139.222,-303.477)">
|
|
||||||
<title>Rectangle.3</title>
|
|
||||||
<desc>otherValue[0]</desc>
|
|
||||||
<v:userDefs>
|
|
||||||
<v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
|
|
||||||
</v:userDefs>
|
|
||||||
<v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
|
|
||||||
<v:textRect cx="42.5197" cy="365.399" width="85.04" height="28.3465"/>
|
|
||||||
<g id="shadow3-11" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
|
|
||||||
transform="matrix(1,0,0,1,0.345598,1.97279)" class="st3">
|
|
||||||
<rect x="0" y="351.226" width="85.0394" height="28.3465" class="st4"/>
|
|
||||||
</g>
|
|
||||||
<rect x="0" y="351.226" width="85.0394" height="28.3465" class="st5"/>
|
|
||||||
<text x="14.26" y="368.4" class="st6" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>otherValue[0]</text> </g>
|
|
||||||
<g id="shape4-16" v:mID="4" v:groupContext="shape" transform="translate(223.845,-303.477)">
|
|
||||||
<title>Rectangle.4</title>
|
|
||||||
<desc>otherValue[1]</desc>
|
|
||||||
<v:userDefs>
|
|
||||||
<v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
|
|
||||||
</v:userDefs>
|
|
||||||
<v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
|
|
||||||
<v:textRect cx="42.5197" cy="365.399" width="85.04" height="28.3465"/>
|
|
||||||
<g id="shadow4-17" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
|
|
||||||
transform="matrix(1,0,0,1,0.345598,1.97279)" class="st3">
|
|
||||||
<rect x="0" y="351.226" width="85.0394" height="28.3465" class="st4"/>
|
|
||||||
</g>
|
|
||||||
<rect x="0" y="351.226" width="85.0394" height="28.3465" class="st5"/>
|
|
||||||
<text x="14.26" y="368.4" class="st6" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>otherValue[1]</text> </g>
|
|
||||||
<g id="shape5-22" v:mID="5" v:groupContext="shape" v:layerMember="0" transform="translate(61.2697,-289.304)">
|
|
||||||
<title>Dynamic connector</title>
|
|
||||||
<path d="M0 379.57 L0 322.88 L70.91 322.88" class="st7"/>
|
|
||||||
</g>
|
|
||||||
<g id="shape6-28" v:mID="6" v:groupContext="shape" v:layerMember="0" transform="translate(61.2697,-289.304)">
|
|
||||||
<title>Dynamic connector.6</title>
|
|
||||||
<path d="M0 379.57 L0 351.23 L70.91 351.23" class="st7"/>
|
|
||||||
</g>
|
|
||||||
<g id="shape7-33" v:mID="7" v:groupContext="shape" transform="translate(139.222,-210.101)">
|
|
||||||
<title>Rectangle.7</title>
|
|
||||||
<desc>childMeta[0]</desc>
|
|
||||||
<v:userDefs>
|
|
||||||
<v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
|
|
||||||
</v:userDefs>
|
|
||||||
<v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
|
|
||||||
<v:textRect cx="42.5197" cy="365.399" width="85.04" height="28.3465"/>
|
|
||||||
<rect x="0" y="351.226" width="85.0394" height="28.3465" class="st9"/>
|
|
||||||
<text x="16.42" y="368.4" class="st10" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>childMeta[0]</text> </g>
|
|
||||||
<g id="shape8-38" v:mID="8" v:groupContext="shape" transform="translate(139.222,-116.724)">
|
|
||||||
<title>Rectangle.8</title>
|
|
||||||
<desc>childValue</desc>
|
|
||||||
<v:userDefs>
|
|
||||||
<v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
|
|
||||||
</v:userDefs>
|
|
||||||
<v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
|
|
||||||
<v:textRect cx="42.5197" cy="365.399" width="85.04" height="28.3465"/>
|
|
||||||
<g id="shadow8-39" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
|
|
||||||
transform="matrix(1,0,0,1,0.345598,1.97279)" class="st3">
|
|
||||||
<rect x="0" y="351.226" width="85.0394" height="28.3465" class="st4"/>
|
|
||||||
</g>
|
|
||||||
<rect x="0" y="351.226" width="85.0394" height="28.3465" class="st5"/>
|
|
||||||
<text x="21.36" y="368.4" class="st6" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>childValue</text> </g>
|
|
||||||
<g id="shape9-44" v:mID="9" v:groupContext="shape" transform="translate(223.845,-116.724)">
|
|
||||||
<title>Rectangle.9</title>
|
|
||||||
<desc>grandChild</desc>
|
|
||||||
<v:userDefs>
|
|
||||||
<v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
|
|
||||||
</v:userDefs>
|
|
||||||
<v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
|
|
||||||
<v:textRect cx="42.5197" cy="365.399" width="85.04" height="28.3465"/>
|
|
||||||
<rect x="0" y="351.226" width="85.0394" height="28.3465" class="st11"/>
|
|
||||||
<text x="20.56" y="368.4" class="st12" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>grandChild</text> </g>
|
|
||||||
<g id="shape10-47" v:mID="10" v:groupContext="shape" transform="translate(223.845,-210.101)">
|
|
||||||
<title>Rectangle.10</title>
|
|
||||||
<desc>childMeta[1]</desc>
|
|
||||||
<v:userDefs>
|
|
||||||
<v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
|
|
||||||
</v:userDefs>
|
|
||||||
<v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
|
|
||||||
<v:textRect cx="42.5197" cy="365.399" width="85.04" height="28.3465"/>
|
|
||||||
<rect x="0" y="351.226" width="85.0394" height="28.3465" class="st9"/>
|
|
||||||
<text x="16.42" y="368.4" class="st10" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>childMeta[1]</text> </g>
|
|
||||||
<g id="shape11-51" v:mID="11" v:groupContext="shape" v:layerMember="0" transform="translate(61.2697,-260.958)">
|
|
||||||
<title>Dynamic connector.11</title>
|
|
||||||
<path d="M0 379.57 L0 416.26 L70.91 416.26" class="st7"/>
|
|
||||||
</g>
|
|
||||||
<g id="shape12-56" v:mID="12" v:groupContext="shape" v:layerMember="0" transform="translate(174.656,-210.101)">
|
|
||||||
<title>Dynamic connector.12</title>
|
|
||||||
<path d="M7.09 379.57 L7.09 437.56" class="st7"/>
|
|
||||||
</g>
|
|
||||||
<g id="shape13-61" v:mID="13" v:groupContext="shape" v:layerMember="0" transform="translate(259.278,-210.101)">
|
|
||||||
<title>Dynamic connector.13</title>
|
|
||||||
<path d="M7.09 379.57 L7.09 437.56" class="st7"/>
|
|
||||||
</g>
|
|
||||||
<g id="shape14-66" v:mID="14" v:groupContext="shape" transform="translate(223.845,-23.3478)">
|
|
||||||
<title>Rectangle.14</title>
|
|
||||||
<desc>grandChildValue</desc>
|
|
||||||
<v:userDefs>
|
|
||||||
<v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
|
|
||||||
</v:userDefs>
|
|
||||||
<v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
|
|
||||||
<v:textRect cx="42.5197" cy="365.399" width="85.04" height="28.3465"/>
|
|
||||||
<g id="shadow14-67" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
|
|
||||||
transform="matrix(1,0,0,1,0.345598,1.97279)" class="st3">
|
|
||||||
<rect x="0" y="351.226" width="85.0394" height="28.3465" class="st4"/>
|
|
||||||
</g>
|
|
||||||
<rect x="0" y="351.226" width="85.0394" height="28.3465" class="st5"/>
|
|
||||||
<text x="9.06" y="368.4" class="st6" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>grandChildValue</text> </g>
|
|
||||||
<g id="shape15-72" v:mID="15" v:groupContext="shape" v:layerMember="0" transform="translate(259.278,-116.724)">
|
|
||||||
<title>Dynamic connector.15</title>
|
|
||||||
<path d="M7.09 379.57 L7.09 437.56" class="st7"/>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 29 KiB |
Before Width: | Height: | Size: 20 KiB |
@ -1,100 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
|
||||||
<!-- Generated by Microsoft Visio, SVG Export naming.svg Page-1 -->
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
|
|
||||||
xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="8.60048in" height="2.35953in"
|
|
||||||
viewBox="0 0 619.235 169.886" xml:space="preserve" color-interpolation-filters="sRGB" class="st9">
|
|
||||||
<v:documentProperties v:langID="1033" v:metric="true" v:viewMarkup="false">
|
|
||||||
<v:userDefs>
|
|
||||||
<v:ud v:nameU="msvSubprocessMaster" v:prompt="" v:val="VT4(Rectangle)"/>
|
|
||||||
<v:ud v:nameU="msvNoAutoConnect" v:val="VT0(1):26"/>
|
|
||||||
</v:userDefs>
|
|
||||||
</v:documentProperties>
|
|
||||||
|
|
||||||
<style type="text/css">
|
|
||||||
<![CDATA[
|
|
||||||
.st1 {fill:none;stroke:none;stroke-width:0.25}
|
|
||||||
.st2 {fill:#5b9bd5;font-family:Calibri;font-size:1.5em}
|
|
||||||
.st3 {stroke:#5b9bd5;stroke-linecap:round;stroke-linejoin:round;stroke-width:1}
|
|
||||||
.st4 {fill:#ffffff;stroke:none;stroke-linecap:butt;stroke-width:7.2}
|
|
||||||
.st5 {fill:#4f87bb;font-family:Calibri;font-size:1.00001em}
|
|
||||||
.st6 {fill:#5b9bd5;font-family:Calibri;font-size:1.00001em}
|
|
||||||
.st7 {marker-end:url(#mrkr4-22);stroke:#5b9bd5;stroke-linecap:round;stroke-linejoin:round;stroke-width:1}
|
|
||||||
.st8 {fill:#5b9bd5;fill-opacity:1;stroke:#5b9bd5;stroke-opacity:1;stroke-width:0.28409090909091}
|
|
||||||
.st9 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3}
|
|
||||||
]]>
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<defs id="Markers">
|
|
||||||
<g id="lend4">
|
|
||||||
<path d="M 2 1 L 0 0 L 2 -1 L 2 1 " style="stroke:none"/>
|
|
||||||
</g>
|
|
||||||
<marker id="mrkr4-22" class="st8" v:arrowType="4" v:arrowSize="2" v:setback="7.04" refX="-7.04" orient="auto"
|
|
||||||
markerUnits="strokeWidth" overflow="visible">
|
|
||||||
<use xlink:href="#lend4" transform="scale(-3.52,-3.52) "/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<g v:mID="0" v:index="1" v:groupContext="foregroundPage">
|
|
||||||
<v:userDefs>
|
|
||||||
<v:ud v:nameU="msvThemeOrder" v:val="VT0(0):26"/>
|
|
||||||
</v:userDefs>
|
|
||||||
<title>Page-1</title>
|
|
||||||
<v:pageProperties v:drawingScale="0.0393701" v:pageScale="0.0393701" v:drawingUnits="24" v:shadowOffsetX="8.50394"
|
|
||||||
v:shadowOffsetY="-8.50394"/>
|
|
||||||
<v:layer v:name="Connector" v:index="0"/>
|
|
||||||
<g id="shape1-1" v:mID="1" v:groupContext="shape" transform="translate(18.25,-67.9383)">
|
|
||||||
<title>Sheet.1</title>
|
|
||||||
<desc>target::my.strange[2].path/otherTarget::simplePath/something</desc>
|
|
||||||
<v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
|
|
||||||
<v:textRect cx="291.367" cy="159.886" width="582.74" height="20"/>
|
|
||||||
<rect x="0" y="149.886" width="582.735" height="20" class="st1"/>
|
|
||||||
<text x="59.37" y="165.29" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>target::my.strange[2].path/otherTarget::simplePath/something</text> </g>
|
|
||||||
<g id="shape2-4" v:mID="2" v:groupContext="shape" transform="translate(269.331,271.833) rotate(180)">
|
|
||||||
<title>Bracket</title>
|
|
||||||
<desc>segment</desc>
|
|
||||||
<v:userDefs>
|
|
||||||
<v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
|
|
||||||
</v:userDefs>
|
|
||||||
<v:textBlock v:margins="rect(1,3,1,1)" v:tabSpace="42.5197"/>
|
|
||||||
<v:textRect cx="113.386" cy="155.713" width="70.87" height="70.8661" transform="rotate(180)"/>
|
|
||||||
<path d="M0 169.89 A4.01075 4.01075 0 0 1 3.54 166.34 L94.47 166.34 A4.01075 4.01075 -180 0 0 98.01 162.8 A4.01075 4.01075
|
|
||||||
-180 0 0 101.55 166.34 L189.05 166.34 A4.01075 4.01075 0 0 1 192.59 169.89" class="st3"/>
|
|
||||||
<rect v:rectContext="textBkgnd" x="-123.147" y="-162.913" width="42.1938" height="14.4001" transform="rotate(180)"
|
|
||||||
class="st4"/>
|
|
||||||
<text x="-123.15" y="-152.11" transform="rotate(180)" class="st5" v:langID="1033"><v:paragraph v:horizAlign="2"/><v:tabList/>segment</text> </g>
|
|
||||||
<g id="shape5-9" v:mID="5" v:groupContext="shape" transform="translate(132.601,-87.9383)">
|
|
||||||
<title>Bracket.5</title>
|
|
||||||
<desc>name</desc>
|
|
||||||
<v:userDefs>
|
|
||||||
<v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
|
|
||||||
</v:userDefs>
|
|
||||||
<v:textBlock v:margins="rect(1,3,1,1)" v:tabSpace="42.5197"/>
|
|
||||||
<v:textRect cx="54.7602" cy="155.713" width="70.87" height="70.8661"/>
|
|
||||||
<path d="M0 169.89 A4.01075 4.01075 0 0 1 3.54 166.34 L68.59 166.34 A4.01075 4.01075 -180 0 0 72.13 162.8 A4.01075 4.01075
|
|
||||||
-180 0 0 75.67 166.34 L138.19 166.34 A4.01075 4.01075 0 0 1 141.73 169.89" class="st3"/>
|
|
||||||
<rect v:rectContext="textBkgnd" x="59.5835" y="148.512" width="27.6097" height="14.4001" class="st4"/>
|
|
||||||
<text x="59.58" y="159.31" class="st5" v:langID="1033"><v:paragraph v:horizAlign="2"/><v:tabList/>name</text> </g>
|
|
||||||
<g id="shape11-14" v:mID="11" v:groupContext="shape" transform="translate(269.331,-131.636)">
|
|
||||||
<title>Sheet.11</title>
|
|
||||||
<desc>target</desc>
|
|
||||||
<v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
|
|
||||||
<v:textRect cx="76" cy="159.886" width="152" height="20"/>
|
|
||||||
<rect x="0" y="149.886" width="152" height="20" class="st1"/>
|
|
||||||
<text x="61.21" y="163.49" class="st6" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>target</text> </g>
|
|
||||||
<g id="shape13-17" v:mID="13" v:groupContext="shape" v:layerMember="0" transform="translate(340.197,-131.636)">
|
|
||||||
<title>Dynamic connector</title>
|
|
||||||
<path d="M0 169.89 L-24.52 207.68" class="st7"/>
|
|
||||||
</g>
|
|
||||||
<g id="shape14-23" v:mID="14" v:groupContext="shape" transform="translate(411.063,-18.25)">
|
|
||||||
<title>Sheet.14</title>
|
|
||||||
<desc>default target</desc>
|
|
||||||
<v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
|
|
||||||
<v:textRect cx="76" cy="159.886" width="152" height="20"/>
|
|
||||||
<rect x="0" y="149.886" width="152" height="20" class="st1"/>
|
|
||||||
<text x="42.47" y="163.49" class="st6" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>default target</text> </g>
|
|
||||||
<g id="shape16-26" v:mID="16" v:groupContext="shape" v:layerMember="0" transform="translate(481.929,-38.25)">
|
|
||||||
<title>Dynamic connector.16</title>
|
|
||||||
<path d="M0 169.89 L-11.14 146.55" class="st7"/>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 5.8 KiB |
Before Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 16 KiB |
@ -1,23 +0,0 @@
|
|||||||
---
|
|
||||||
content_type: "doc_control"
|
|
||||||
title: "Control plugin"
|
|
||||||
label: "control"
|
|
||||||
version: 1.0
|
|
||||||
date: 2016-02-08
|
|
||||||
published: true
|
|
||||||
order: 1
|
|
||||||
---
|
|
||||||
DataForge control subsystem defines a general api for data acquisition processes. It could be used to issue commands to devices, read data and communicate with storage system or other devices.
|
|
||||||
|
|
||||||
The center of control API is a `Device` class.
|
|
||||||
The device has following important features:
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
<strong>States:</strong> each device has a number of states that could be accessed by `getStatus` method. States could be either stored as some internal variables or calculated on demand. States calculation is synchronous!
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<strong>Listeners:</strong> some external class which listens device state changes and events. By default listeners are represented by weak references so they could be finalized any time if not used.
|
|
||||||
<li>
|
|
||||||
<strong>Connections:</strong> any external device connectors which are used by device. The difference between listener and connection is that device is obligated to notify all registered listeners about all changes, but connection is used by device at its own discretion. Also usually only one connection is used for each single purpose.
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
@ -1,11 +0,0 @@
|
|||||||
---
|
|
||||||
content_type: "doc_data"
|
|
||||||
title: "Push model"
|
|
||||||
ordering: [20,1]
|
|
||||||
label: "actions"
|
|
||||||
version: 1.0
|
|
||||||
date: 2015-08-27
|
|
||||||
published: true
|
|
||||||
order: 2
|
|
||||||
---
|
|
||||||
<img src="/images/dataforge/actions.png" width="800px" alt="push"/>
|
|
@ -1,11 +0,0 @@
|
|||||||
---
|
|
||||||
content_type: "doc_data"
|
|
||||||
title: "Data flow"
|
|
||||||
ordering: [20]
|
|
||||||
label: "data_flow"
|
|
||||||
version: 1.0
|
|
||||||
date: 2015-08-27
|
|
||||||
published: true
|
|
||||||
order: 1
|
|
||||||
---
|
|
||||||
One of the most important features of DataForge framework is the data flow control. Any
|
|
@ -1,11 +0,0 @@
|
|||||||
---
|
|
||||||
content_type: "doc_data"
|
|
||||||
title: "Tasks"
|
|
||||||
ordering: [20,2]
|
|
||||||
label: "tasks"
|
|
||||||
version: 1.0
|
|
||||||
date: 2015-08-27
|
|
||||||
published: true
|
|
||||||
order: 3
|
|
||||||
---
|
|
||||||
<img src="/images/dataforge/tasks.png" width="800px" alt="Pull data flow model"/>
|
|
@ -1,32 +0,0 @@
|
|||||||
---
|
|
||||||
content_type: "doc_env"
|
|
||||||
title: "Binary meta"
|
|
||||||
chapter: envelope
|
|
||||||
ordering: 50
|
|
||||||
label: "binary_meta"
|
|
||||||
published: false
|
|
||||||
order: 5
|
|
||||||
---
|
|
||||||
Binary meta format is made to limit size and simplify parsing to automatic messages. The notation for the node looks the following way (all numeric values use BigEndian encoding):
|
|
||||||
|
|
||||||
<br>
|
|
||||||
All strings are encoded in a following way: 2 bytes for string length, byte array of given length representing UTF-8 encoded string.
|
|
||||||
<br>
|
|
||||||
|
|
||||||
1. Meta name as string.
|
|
||||||
2. 2 bytes unsigned integer representing the number of values in the node. Could be zero.
|
|
||||||
3. For each of values an encoded name of the value and then:
|
|
||||||
* `0` for Null value.
|
|
||||||
* `T` for `TIME` value, followed by two unsigned long values representing epoch second and nanosecond adjustment.
|
|
||||||
* `S` for `STRING` value followed by encoded string.
|
|
||||||
* `D` for double based `NUMBER` followed by double (double encoding specified by [Java serialization](https://docs.oracle.com/javase/8/docs/api/java/io/DataOutput.html#writeDouble-double-)).
|
|
||||||
* `I` for integer based `NUMBER` followed by signed 4-bytes integer value.
|
|
||||||
* `B` for [`BigDecimal`](https://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.html) based `NUMBER` followed by 2-byte unsigned integer defining the number of bytes in representation, bytes themselves and 4-byte scale factor.
|
|
||||||
* `+` for boolean `true`.
|
|
||||||
* `-` for boolean `false`.
|
|
||||||
* `L` for list value and then 2-byte list size followed by sequence of values (as in item 3, but without a name).
|
|
||||||
4. 2 bytes unsigned integer representing the number of child nodes in this node. Could be zero.
|
|
||||||
5. For each of child nodes:
|
|
||||||
* child node name,
|
|
||||||
* 2-byte unsigned integer representing number of children with this name.
|
|
||||||
* The sequence of nodes with given name encoding like the root node, but without name.
|
|
@ -1,38 +0,0 @@
|
|||||||
---
|
|
||||||
content_type: "doc_env"
|
|
||||||
title: "Streaming envelope format"
|
|
||||||
chapter: envelope
|
|
||||||
ordering: 1
|
|
||||||
label: "envelope_format"
|
|
||||||
published: true
|
|
||||||
order: 2
|
|
||||||
---
|
|
||||||
|
|
||||||
The default envelope format is developed for storage of binary data or transferring data via byte stream. The structure of this format is the following:
|
|
||||||
|
|
||||||
* **Tag**. First 20 bytes of file or stream is reserved for envelope properties binary representation:
|
|
||||||
1. `#~` - two ASCII symbols, beginning of binary string.
|
|
||||||
2. 4 bytes - properties `type` field: envelope format type and version. For default format the string `DF02` is used, but in principle other envelope types could use the same format.
|
|
||||||
3. 2 bytes - properties `metaType` field: metadata encoding type.
|
|
||||||
4. 4 bytes - properties `metaLength` field: metadata length in bytes including new lines and other separators.
|
|
||||||
5. 4 bytes - properties `dataLength` field: the data length in bytes.
|
|
||||||
6. `~#` - two ASCII symbols, end of binary string.
|
|
||||||
7. `\r\n` - two bytes, new line.
|
|
||||||
|
|
||||||
The values are read as binary and transformed into 4-byte unsigned tag codes (Big endian).
|
|
||||||
|
|
||||||
* **Metadata block**. Metadata in any accepted format. Additional formats could be provided by modules. The default metadata format is *UTF-8* encoded *XML* (tag code 0x584d). *JSON* format is provided by storage module.
|
|
||||||
|
|
||||||
One must note that `metaLength` property is very important and in most cases is mandatory. It could be set to `0xffffffff` or `-1` value in order to force envelope reader to derive meta length automatically, but different readers do it in a different ways, so it strongly not recommended to do it if data block is not empty.
|
|
||||||
|
|
||||||
* **Data block**. Any other data. If `dataLength` property is set to `0xffffffff` or `-1`, then it is supposed that data block ends with the end of file or stream. It is discouraged to use infinite data length for streaming data. Data block does not have any limitations for its content. It could even contain envelopes inside it!
|
|
||||||
|
|
||||||
### Meta encoding
|
|
||||||
|
|
||||||
DataForge server supports following metadata encoding types:
|
|
||||||
|
|
||||||
1. **XML** encoding. The full name for this encoding is `XML`, the tag code is `XM`.
|
|
||||||
2. **JSON** encoding (currently supported only with `storage` module attached). The full name is `JSON`, the tag code is `JS`.
|
|
||||||
3. **Binary** encoding. DataForge own binary meta representation. The full name is `binary`, the tag code is `BI`.
|
|
||||||
|
|
||||||
To avoid confusion. All full names are case insensitive. All meta is supposed to always use **UTF-8** character encoding.
|
|
@ -1,19 +0,0 @@
|
|||||||
---
|
|
||||||
content_type: "doc_env"
|
|
||||||
title: "Envelope description"
|
|
||||||
chapter: envelope
|
|
||||||
ordering: 20
|
|
||||||
label: "envelope_description"
|
|
||||||
published: true
|
|
||||||
order: 4
|
|
||||||
---
|
|
||||||
Interpretation of envelope contents is basically left for user, but for convenience purposes there is convention for envelope description encoded inside meta block.
|
|
||||||
|
|
||||||
The envelope description is placed into hidden `@envelope` meta node. The description could contain following values:
|
|
||||||
|
|
||||||
- `@envelope.type` (STRING): Type of the envelope content
|
|
||||||
- `@envelope.dataType` (STRING): Type of the envelope data
|
|
||||||
- `@envelope.description` (STRING): Description of the envelope content
|
|
||||||
- `@envelope.time` (TIME): Time of envelope creation
|
|
||||||
|
|
||||||
Both envelope type and data type are supposed to be presented in reversed Internet domain name like java packages.
|
|
@ -1,20 +0,0 @@
|
|||||||
---
|
|
||||||
content_type: "doc_env"
|
|
||||||
title: "Envelopes"
|
|
||||||
chapter: envelope
|
|
||||||
label: "envelopes"
|
|
||||||
version: 1.0
|
|
||||||
date: 2016-02-08
|
|
||||||
published: true
|
|
||||||
order: 1
|
|
||||||
---
|
|
||||||
|
|
||||||
The DataForge functionality is largely based on metadata exchange and therefore the main medium for messages between different parts of the system is `Meta` object and its derivatives. But sometimes one needs not only to transfer metadata but some binary or object data as well. For this DataForge supports an 'Envelope' entity, which contains both meta block and binary data block. Envelope could be automatically serialized to or from a byte stream.
|
|
||||||
|
|
||||||
DataForge supports an extensible list of Envelope encoding methods. Specific method is defined by so-called encoding *properties* - the list of key-value pairs that define the specific way the meta and data are encoded. Meta-data itself also could have different encoding. Out of the box DataForge server supports two envelope formats and three meta formats.
|
|
||||||
|
|
||||||
<!-- In order to do so one should use an `Envelope` entity. It is a combined format for both text metadata and data in single block. An `Envelope` container consists of three main components: -->
|
|
||||||
|
|
||||||
<!-- 0. **Properties**. A set of key-value bindings defining envelope format: metadata format and length, data length and general envelope version. Properties in fact are not considered to be a part of envelope itself, but it is usually a part of envelope container. -->
|
|
||||||
<!-- 1. **Meta**. A text metadata in any supported format. -->
|
|
||||||
<!-- 2. **Data**. Ant binary or textual data. The rules to read this data could be derived either from properties header or from envelope meta. -->
|
|
@ -1,26 +0,0 @@
|
|||||||
---
|
|
||||||
content_type: "doc_env"
|
|
||||||
title: "Tagless envelope format"
|
|
||||||
chapter: envelope
|
|
||||||
ordering: 2
|
|
||||||
label: "tagless_format"
|
|
||||||
version: 1.0
|
|
||||||
published: true
|
|
||||||
order: 3
|
|
||||||
---
|
|
||||||
Tagless format is developed to store textual data without need for binary block at the beginning. It is not recommended to use it for binary data or for streaming. The structure of this format is the following:
|
|
||||||
|
|
||||||
|
|
||||||
1. **The header line**. `#~DFTL~#`. The line is used only for identify the DataForge envelope. Standard reader is also configured to skip any lines starting with # before this line, so it is compatible with [shebang](https://en.wikipedia.org/wiki/Shebang_(Unix)). All header lines in tagless format must have at least new line `\n` character after them (DOS/Windows new line `\r\n` is also supported).
|
|
||||||
|
|
||||||
2. **Properties**. Properties are defined in a textual form. Each property is defined in its own lined in a following way:
|
|
||||||
|
|
||||||
```#? <property key> : <property value>; <new line>```
|
|
||||||
|
|
||||||
Any whitespaces before `<property value>` begin are ignored. The `;` symbol is optional, but everything after it is ignored. Every property **must** be on a separate line. The end of line is defined by `\n` character so both Windows and Linux line endings are valid.
|
|
||||||
Properties are accepted both in their textual representation or tag code.
|
|
||||||
|
|
||||||
3. **Meta block start**. Meta block start string is defined by `metaSeparator` property. The default value is `#~META~#`. Meta block start could be omitted if meta is empty.
|
|
||||||
4. **Meta block**. Everything between meta block start and data block start (or end of file) is treated like meta. `metaLength` property is ignored. It is not recommended to use binary meta encoding in this format.
|
|
||||||
5. **Data start block**. Data block start string is defined by `dataSeparator` property. The default value is `#~DATA~#`. Data block start could be omitted if data is empty.
|
|
||||||
6. **Data block**. The data itself. If `dataLength` property is defined, then it is used to trim the remaining bytes in the stream or file. Otherwise the end of stream or file is used to define the end of data.
|
|
@ -1,10 +0,0 @@
|
|||||||
---
|
|
||||||
content_type: "doc_extensions"
|
|
||||||
title: "Language extensions"
|
|
||||||
chapter: extensions
|
|
||||||
label: "extensions"
|
|
||||||
version: 1.0
|
|
||||||
published: true
|
|
||||||
order: 1
|
|
||||||
---
|
|
||||||
DataForge also supports a number of language extensions inside JVM.
|
|
@ -1,13 +0,0 @@
|
|||||||
---
|
|
||||||
content_type: "doc_extensions"
|
|
||||||
title: "GRoovy INteractive Dataforge"
|
|
||||||
chapter: extensions
|
|
||||||
ordering: 1
|
|
||||||
label: "grind"
|
|
||||||
version: 1.0
|
|
||||||
published: true
|
|
||||||
order: 2
|
|
||||||
---
|
|
||||||
Grind is a thin layer overlay for DataForge framework written in dynamic Java dialect [Groovy](http://groovy-lang.org/). Groovy is a great language to write fast dynamic scripts with Java interoperability. Also it is used to work with interactive environments like [beaker](http://beakernotebook.com/).
|
|
||||||
|
|
||||||
GRIND module contains some basic extensions and operator overloading for DataForge, a DSL for building Meta. Also in separate modules is an interactive console using GroovyShell and some mathematical extensions.
|
|
@ -1,11 +0,0 @@
|
|||||||
---
|
|
||||||
content_type: "doc_extensions"
|
|
||||||
title: "KOtlin Dataforge EXtension"
|
|
||||||
chapter: extensions
|
|
||||||
ordering: 2
|
|
||||||
label: "kodex"
|
|
||||||
version: 1.0
|
|
||||||
published: true
|
|
||||||
order: 3
|
|
||||||
---
|
|
||||||
Kotlin is one of the best efforts to make a "better Java". The language is probably not the best way to write a complex architecture like the one used in DataForge, but it definitely should be used in end-user application. KODEX contains some basic DataForge classes extensions as well as operator override for values and metas. It is planned to also include a JavaFX extension library based on the great [tornadofx](https://github.com/edvin/tornadofx).
|
|
@ -1,17 +0,0 @@
|
|||||||
---
|
|
||||||
content_type: "doc_framework"
|
|
||||||
title: "Context"
|
|
||||||
label: "context"
|
|
||||||
version: 1.0
|
|
||||||
date: 2015-08-27
|
|
||||||
published: true
|
|
||||||
order: 1
|
|
||||||
---
|
|
||||||
|
|
||||||
The important part of DataForge architecture is the context encapsulation. One of the major problems hindering parallel applications development is existence of mutable global states and environment variables. One of the possible solutions to this problem is to run any process in its own personal sandbox carrying copies of all required values, another one is to make all environment values immutable. Another problem in modular system is dynamic loading of modules and changing of their states.
|
|
||||||
|
|
||||||
In DataForge all these problems are solved by `Context` object (the idea is inspired by Android platform contexts). Context holds all global states (called *context properties*), but could in fact be different for different processes. Most of complicated actions require a context as a parameter. Context not only stores values, but also works as a base for [plugin system](#plugin) and could be used as a [dependency injection](https://en.wikipedia.org/wiki/Dependency_injection) base. Context does not store copies of global values and plugins, instead one context could inherit from another. When some code requests value or plugin from the context, the framework checks if this context contains required feature. If it is present, it is returned. If not and context has a parent, then parent will be requested for the same feature.
|
|
||||||
|
|
||||||
There is only one context that is allowed not to have parent. It is a [singleton](https://en.wikipedia.org/wiki/Singleton_pattern) called `Global`. Global inherits its values directly form system environment. It is possible to load plugins directly to Global (in this case they will be available for all active context), though it is discouraged in large projects. Each context has its own unique name used for distinction and logging.
|
|
||||||
|
|
||||||
The runtime immutability of context is supported via *context locks*. Any runtime object could request to lock context and forbid any changes done to the context. After critical runtime actions are done, object can unlock context back. Context supports unlimited number of simultaneous locks, so it won't be mutable until all locking objects would release it. If one needs to change something in the context while it is locked, the only way to do so is to create an unlocked child context (*fork* it) and work with it.
|
|
@ -1,8 +0,0 @@
|
|||||||
---
|
|
||||||
content_type: "doc_shard"
|
|
||||||
title: "Framework"
|
|
||||||
ordering: [10]
|
|
||||||
label: "framework"
|
|
||||||
version: 1.0
|
|
||||||
published: true
|
|
||||||
---
|
|
@ -1,62 +0,0 @@
|
|||||||
---
|
|
||||||
content_type: "doc_framework"
|
|
||||||
title: "Providers and navigation"
|
|
||||||
ordering: [10,3]
|
|
||||||
label: "navigation"
|
|
||||||
version: 1.0
|
|
||||||
date: 2015-08-27
|
|
||||||
published: true
|
|
||||||
order: 3
|
|
||||||
---
|
|
||||||
### Providers
|
|
||||||
The navigation inside DataForge object hierarchy is done via `Provider` interface. A provider can give access to one of many *targets*. A target is a string that designates specific type of provided object (a type in user understanding, not in computer language one). For given target provider resolves a *name* and returns needed object if it is present (provided).
|
|
||||||
|
|
||||||
### Names
|
|
||||||
The *name* itself could be a plain string or consist of a number of name *tokens* separated by `.` symbol. Multiple name tokens are usually used to describe a name inside tree-like structures. Each of name tokens could also have *query* part enclosed in square brackets: `[]`. The name could look like this:
|
|
||||||
|
|
||||||
```
|
|
||||||
token1.token2[3].token3[key = value]
|
|
||||||
```
|
|
||||||
|
|
||||||
### Paths
|
|
||||||
|
|
||||||
A target and a name could be combined into single string using *path* notation: `<target>::<name>`, where `::` is a target separating symbol. If the provided object is provider itself, then one can use *chain path* notation to access objects provided by it. Chain path consists of path segments separated by `/` symbol. Each of the segments is a fully qualified path. The resolution of chain path begins with the first segment and moves forward until path is fully resolved. If some path names not provided or the objects themselves are not providers, the resolution fails.
|
|
||||||
|
|
||||||
<img src="/images/dataforge/naming.svg" alt="navigation"/>
|
|
||||||
|
|
||||||
### Default targets
|
|
||||||
|
|
||||||
In order to simplify paths, providers could define default targets. If not target is provided (either path string does not contain `::` or it starts with `::`), the default target is used. Also provider can define default chain target, meaning that this target will be used by default in the next path segment.
|
|
||||||
|
|
||||||
For example `Meta` itself is a provider and has two targets: `meta` and `value`. The default target for `Meta` is `meta`, but default chain target is `value`, meaning that chain path `child.grandchild/key` is equivalent of `meta::child.grandchild/value::key` and will point to the value `key` of the node `child.grandchild`.
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
|
|
||||||
**Note** The same result in case of `Meta` could be achieved by some additional ways:
|
|
||||||
|
|
||||||
* `child/meta:grandchild/key` utilizing the fact that each meta in the hierarchy is provider;
|
|
||||||
|
|
||||||
* `value::child.grandchild.key` using value search syntax.
|
|
||||||
|
|
||||||
Still the path `child.grandchild/key` is the preferred way to access values in meta.
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
|
|
||||||
### Restrictions and recommendations
|
|
||||||
|
|
||||||
Due to chain path notation, there are some restrictions on symbols available in names:
|
|
||||||
|
|
||||||
* Symbol `/` is not allowed in names.
|
|
||||||
|
|
||||||
* Symbols `[]` are restricted to queries
|
|
||||||
|
|
||||||
* Symbol `::` allowed in name only if target is explicitly provided. It is strongly discouraged to use it in name.
|
|
||||||
|
|
||||||
* Symbol `.` should be used with care when not using tree structures.
|
|
||||||
|
|
||||||
* DataForge uses `UTF-8` encoding, so it is possible to use any non-ASCII symbols in names.
|
|
||||||
|
|
||||||
|
|
||||||
### Implementation
|
|
||||||
|
|
||||||
<img src="/images/projects/math/gears_animated.gif" alt="in progress"/> This section is under construction
|
|
@ -1,26 +0,0 @@
|
|||||||
---
|
|
||||||
content_type: "doc_framework"
|
|
||||||
title: "Context plugins"
|
|
||||||
label: "plugins"
|
|
||||||
version: 1.0
|
|
||||||
published: true
|
|
||||||
order: 2
|
|
||||||
---
|
|
||||||
|
|
||||||
Plugin system allows to dynamically adjust what modules are used in the specific computation. `Plugin` is an object that could be loaded into the context. Plugins fully support *context inheritance* system, meaning that if requested plugin is not found in current context, the request is moved up to parent context. It is possible to store different instances of the same plugin in child and parent context. In this case actual context plugin will be used (some plugins are able to sense the same plugin in the parent context and use it).
|
|
||||||
|
|
||||||
Context can provide plugins either by its type (class) or by string tag, consisting of plugin group, name and version (using gradle-like notation `<group>:<name>:<version>`).
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
|
|
||||||
**Note:** It is possible to have different plugins implementing the same type in the context. In this case request plugin by type becomes ambiguous. Framework will throw an exception if two ore more plugins satisfy plugin resolution criterion in the same context.
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
|
|
||||||
A plugin has a mutable state, but is automatically locked alongside with owning context. Plugin resolution by default uses Java SPI tool, but it is possible to implement a plugin repository and use it to load plugins.
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
|
|
||||||
**Note:** While most of modules provide their own plugins, there is no rule that module has strictly one plugin. Some modules could export a number of plugins, while some of them could export none.
|
|
||||||
|
|
||||||
<hr>
|
|
@ -1,26 +0,0 @@
|
|||||||
---
|
|
||||||
content_type: "doc_main"
|
|
||||||
title: "How to read this documentation"
|
|
||||||
chapter: "howto"
|
|
||||||
label: "how_to_read"
|
|
||||||
version: 1.1
|
|
||||||
date: 2015-09-02
|
|
||||||
published: true
|
|
||||||
order: 1
|
|
||||||
path: /dataforge/docs/
|
|
||||||
---
|
|
||||||
An important feature of DataForge framework is ability to work with [meta-data](/dataforge/docs/meta).
|
|
||||||
This documentation is automatically generated by [gatsby](https://www.gatsbyjs.org/)
|
|
||||||
script from [markdown](https://en.wikipedia.org/wiki/Markdown) pages.
|
|
||||||
|
|
||||||
The meta-data of each page includes version of this precise shard last update date,
|
|
||||||
it's label for reference and ordering information.
|
|
||||||
|
|
||||||
Choose documentation section:
|
|
||||||
* [Meta-data processor](/dataforge/docs/meta)
|
|
||||||
* [Framework](/dataforge/docs/framework)
|
|
||||||
* [Data flow](/dataforge/docs/data_flow)
|
|
||||||
* [Envelopes](/dataforge/docs/envelopes)
|
|
||||||
* [Storage plugin](/dataforge/docs/storage)
|
|
||||||
* [Control plugin](/dataforge/docs/control)
|
|
||||||
* [Language extensions](/dataforge/docs/extensions)
|
|
@ -1,22 +0,0 @@
|
|||||||
---
|
|
||||||
content_type: "doc_meta"
|
|
||||||
title: "Configuration"
|
|
||||||
chapter: "meta"
|
|
||||||
ordering: 6
|
|
||||||
label: "configuration"
|
|
||||||
version: 1.0
|
|
||||||
date: 2015-08-27
|
|
||||||
published: true
|
|
||||||
order: 4
|
|
||||||
---
|
|
||||||
The configuration is a very important extension of basic [Meta](#meta_structure) class.
|
|
||||||
It is basically a mutable meta which incorporates
|
|
||||||
external observers. It is also important that while simple Meta knows its children knows its children,
|
|
||||||
but could be attached freely to any ancestor, configuration has one designated ancestor that is
|
|
||||||
notified than configuration is changed.
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
**Note** that putting elements or values to configuration follows the same naming convention as getting from it.
|
|
||||||
Meaning putting to `some_name.something` will actually create or put to the node `some_name` if it exists.
|
|
||||||
Otherwise, new node is created.
|
|
||||||
<hr>
|
|
@ -1,14 +0,0 @@
|
|||||||
---
|
|
||||||
content_type: "doc_meta"
|
|
||||||
title: "Hidden values"
|
|
||||||
chapter: "meta"
|
|
||||||
ordering: 10
|
|
||||||
label: "hidden_values"
|
|
||||||
version: 1.0
|
|
||||||
published: true
|
|
||||||
order: 5
|
|
||||||
---
|
|
||||||
|
|
||||||
Meta structure supports so-called *hidden* values and nodes. These values and nodes exist in the meta and could be requested either by user or framework, but are not shown by casual listing. These values and nodes are considered *system* and are not intended to be defined by user in most cases.
|
|
||||||
|
|
||||||
Hidden values and nodes names starts with symbol `@` like `@node`. Not all meta-data representations allow this symbol so in could be replaced by escaped sequence `_at_` in text format (`<_at_node/>` in XML).
|
|
@ -1,34 +0,0 @@
|
|||||||
---
|
|
||||||
content_type: "doc_meta"
|
|
||||||
title: "Meta-data processor"
|
|
||||||
chapter: "meta"
|
|
||||||
label: "meta"
|
|
||||||
version: 2.0
|
|
||||||
date: 2015-08-27
|
|
||||||
published: true
|
|
||||||
order: 1
|
|
||||||
---
|
|
||||||
The main and the most distinguishing feature of DataForge framework is a concept of data analysis as a meta-data processor.
|
|
||||||
First of all, one need to define main terms:
|
|
||||||
|
|
||||||
* **Data**. Any information from experiment or simulation provided by user. The data format is not governed by DataForge so it could be presented in any form. The important point concerning data is that data is by default immutable. Meaning the program could create its modified copies (which is not recommended), but could not modify initial input in any way.
|
|
||||||
|
|
||||||
* **Meta-data**. Meta-data contrary to data has a fixed internal representation provided by Meta object. Meta is simple [tree-like object](#meta_structure) that can conveniently store values and Meta nodes. Meta-data is either provided by user or generated in analysis process. Inside the analysis process Meta is immutable, but for some purposes, changeable meta nodes could be used during analysis configuration and results representation (see [Configuration](#configuration)).
|
|
||||||
|
|
||||||
The fundamental point of the whole DataForge philosophy is that every external input could be either data or meta-data. This point could seem dull at first glance, but in fact, it have a number of very important consequences:
|
|
||||||
|
|
||||||
* *No scripts*. DataForge encourages user not to use imperative code to manipulate data. Any procedure to be performed on data should be presented either by some hard-coded meta-data processor rule (the function that takes data and metadata and produces some output without any additional external information) or as declarative process definition in form of meta-data. Since the most of data analysis nowadays is made by different scripts, the loss of scripting capability could seem to be a tremendous blow to framework functionality, but in fact every thing one could do with script, one also can do with declaration and declaration processing rules. Also purely declarative description allows for easy error check and analysis scaling (via parallelism).
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
|
|
||||||
**Note:** Those, who still like scripting, can still either use DataForge as a library, or use [GRIND](#grind)
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
|
|
||||||
* *Automatic scaling*. Since particular analysis of some piece of data depends only on that piece and on it's meta-data, such analysis could be easily scaled for any number of such data pieces.
|
|
||||||
|
|
||||||
* *Meta composition*. Since the configuration of analysis and meta-data ara both have fixed representation, one could easily combine specific analysis configuration from different parts taken from different sources. For example, one could have a general configuration for the whole data set and specific changes for some specific point. One do not have to write a specific script to work with this particular point, just override its meta-data!
|
|
||||||
|
|
||||||
* *No global state*. Since neither data, nor meta-data account for global states, there are no global states! The closest to the global states as you get is context variables (see [context](#context)), which are used to connect analysis process to system environment, but these states are not used in the analysis itself.
|
|
||||||
|
|
||||||
* *Automatic data flow organisation*. Since user does not in general control the order and time of actions performed by the framework, the work of arranging data flow, result caching, etc. could be actually done by the framework itself.
|
|
@ -1,23 +0,0 @@
|
|||||||
---
|
|
||||||
content_type: "doc_meta"
|
|
||||||
title: "Meta-data composition"
|
|
||||||
chapter: "meta"
|
|
||||||
ordering: 5
|
|
||||||
label: "meta-layers"
|
|
||||||
version: 1.0
|
|
||||||
published: true
|
|
||||||
order: 3
|
|
||||||
---
|
|
||||||
|
|
||||||
An important part of working with meta is *composition*. Let us work with two use-cases:
|
|
||||||
|
|
||||||
1. There is a data supplied with meta and one needs modified version of the meta.
|
|
||||||
2. There is a list of data with the same meta and one needs to change meta only for one data piece.
|
|
||||||
|
|
||||||
DataForge provides instruments to easily modify meta (or, since meta is immutable, create a modified instance), but it is not a good solution. A much better way is to use instrument called `Laminate`. Laminate implements meta specification, but stores not one tree of values, but multiple layers of meta. When one requests a Laminate for a value ore meta, it automatically forwards request to the first meta layer. If required node or value is not found in the first layer, the request is forwarded to second layer etc. Laminate also contains meta descriptor, which could be used for default values. Laminate functionality also allows to use information from all of its layers, for example join lists of nodes instead of replacing them. Laminate layers also could be merged together to create classical meta and increase performance. Of course, in this case special features like custom use of all layers is lost.
|
|
||||||
|
|
||||||
Using Laminate in case 1 looks like this: if one needs just to change or add some value, one creates a Laminate with initial meta as second layer and override layer containing only values to be changed as first.
|
|
||||||
|
|
||||||
For case 2 the solution is even simpler: `DataNode` structures automatically uses laminates to define meta for specific data pieces. So one needs just to define meta for specific data, it will be automatically layered with node meta (or multiple meta elements if node data node structure has many levels).
|
|
||||||
|
|
||||||
The typical usage of data layering could be demonstrated on `Actions` (push data flow). Action has 3 arguments: `Context`, `DataNode` and `Meta`. The actual configuration for specific `Data` is defined as a laminate containing data meta layer, node meta layer(s) and action meta layer. Meaning that actual action meta is used only if appropriate positions are not defined in data meta (data knows best about how it should be analyzed).
|
|
@ -1,43 +0,0 @@
|
|||||||
---
|
|
||||||
content_type: "doc_meta"
|
|
||||||
title: "Meta-data object structure"
|
|
||||||
chapter: "meta"
|
|
||||||
ordering: 4
|
|
||||||
label: "meta_structure"
|
|
||||||
version: 1.1
|
|
||||||
date: 2015-08-27
|
|
||||||
published: true
|
|
||||||
order: 2
|
|
||||||
---
|
|
||||||
<table>
|
|
||||||
<tr style="height: 400px">
|
|
||||||
<td style="padding: 0; width: 400px">
|
|
||||||
<img src="../../../../../images/dataforge/meta.svg" alt="Meta structure"/>
|
|
||||||
</td>
|
|
||||||
<td style="padding: 0;">
|
|
||||||
<p>
|
|
||||||
The Meta object is a tree-like structure, which can contain other meta objects as branches (which are
|
|
||||||
called
|
|
||||||
elements) and <a href="#value">Value</a> objects as leafs.
|
|
||||||
Both Values and Meta elements are organized in String-keyed maps. And each map element is a list of
|
|
||||||
appropriate type. By requesting single Value or Meta element one is supposed to request first element of
|
|
||||||
this list.
|
|
||||||
</p>
|
|
||||||
<hr>
|
|
||||||
<p><strong>Note</strong> that such lists are always immutable. Trying to change it may cause a error.</p>
|
|
||||||
<hr>
|
|
||||||
<p>
|
|
||||||
While meta itself does not have any write methods and is considered to be immutable, some of its
|
|
||||||
extensions do have methods that can change meta structure. One should be careful not to use mutable meta
|
|
||||||
elements when one need immutable one.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
In order to conveniently edit meta, there is MetaBuilder class.
|
|
||||||
</p>
|
|
||||||
</td>
|
|
||||||
<tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
The naming of meta elements and values follows basic DataForge [naming and navigation](#navigation) convention.
|
|
||||||
Meaning that elements and values could be called like `child_name.grand_child_name.value_name`.
|
|
||||||
One can event use numbers as queries in such paths like `child_name.grand_child_name[3].value_name`.
|
|
@ -1,10 +0,0 @@
|
|||||||
---
|
|
||||||
content_type: doc_storage
|
|
||||||
title: File storage
|
|
||||||
published: true
|
|
||||||
order: 1
|
|
||||||
---
|
|
||||||
|
|
||||||
The `FileStorage` is the default implementation of storage API.
|
|
||||||
|
|
||||||
<img src="/images/projects/math/gears_animated.gif" alt="in progress"/> This section is under construction...
|
|
@ -1,112 +0,0 @@
|
|||||||
---
|
|
||||||
content_type: df-index
|
|
||||||
---
|
|
||||||
|
|
||||||
<h1> Welcome to the DataForge </h1>
|
|
||||||
|
|
||||||
### The Dataforge documentation and this site is currently under construction so please be patient and contact developers if you need information.
|
|
||||||
|
|
||||||
Source code could be found at <a href="https://bitbucket.org/Altavir/dataforge">BitBucket repository</a>.
|
|
||||||
|
|
||||||
Please use <a href="https://bitbucket.org/Altavir/dataforge/issues?status=new&status=open">Issue tracker</a> to report problems or request enhancements.
|
|
||||||
|
|
||||||
For questions no covered by <a href="http://npm.mipt.ru/dataforge/docs">documentation</a> please see our <a href="https://groups.google.com/d/forum/dataforge-dev">our Google group</a>.
|
|
||||||
|
|
||||||
<br/>
|
|
||||||
|
|
||||||
# Questions and Answers
|
|
||||||
In this section we will try to cover DataForge main ideas in the form of questions and answers.
|
|
||||||
|
|
||||||
|
|
||||||
## General
|
|
||||||
**Q:** I have a lot of data to analyze. The analysis process is complicated, requires a lot of stages and data flow is not always obvious. To top it the data size is huge, so I don't want to perform operation I don't need (calculate something I won't need or calculate something twice). And yes, I need it to be performed in parallel and probably on remote computer. By the way, I am sick and tired of scripts that modify other scripts that control scripts. Could you help me?
|
|
||||||
|
|
||||||
**A:** Yes, that is the precisely the problem DataForge was made to solve. It allows to perform some automated data manipulations with automatic optimization and parallelization. The important thing that data processing recipes are made in the declarative way, so it is quite easy to perform computations on a remote station. Also DataForge guarantees reproducibility of analysis results. <hr>
|
|
||||||
|
|
||||||
**Q:** How does it work?
|
|
||||||
|
|
||||||
**A:** At the core of DataForge lies the idea of **metadata processor**. It utilizes the statement that in order to analyze something you need data itself and some additional information about what does that data represent and what does user want as a result. This additional information is called metadata and could be organized in a regular structure (a tree of values not unlike XML or JSON). The important thing is that this distinction leaves no place for user instructions (or scripts). Indeed, the idea of DataForge logic is that one do not need imperative commands. The framework configures itself according to input meta-data and decides what operations should be performed in the most efficient way. <hr>
|
|
||||||
|
|
||||||
**Q:** But where does it take algorithms to use?
|
|
||||||
|
|
||||||
**A:** Of course algorithms must be written somewhere. No magic here. The logic is written in specialized modules. Some modules are provided out of the box at the system core, some need to be developed for specific problem. <hr>
|
|
||||||
|
|
||||||
**Q:** So I still need to write the code? What is the difference then?
|
|
||||||
|
|
||||||
**A:** Yes, someone still need to write the code. But not necessary you. Simple operations could be performed using provided core logic. Also your group can have one programmer writing the logic and all other using it without any real programming expertise. Also the framework organized in a such way that one writes some additional logic, he do not need to thing about complicated thing like parallel computing, resource handling, logging, caching etc. Most of the things are done by the DataForge. <hr>
|
|
||||||
|
|
||||||
## Platform
|
|
||||||
**Q:** Which platform does DataForge use? Which operation system is it working on?
|
|
||||||
|
|
||||||
**A:** The DataForge is mostly written in Java and utilizes JVM as a platform. It works on any system that supports JVM (meaning almost any modern system excluding some mobile platforms). <hr>
|
|
||||||
|
|
||||||
**Q:** But Java... it is slow!
|
|
||||||
|
|
||||||
**A:** <a href="https://stackoverflow.com/questions/2163411/is-java-really-slow/2163570#2163570">It is not</a>. It lacks some hardware specific optimizations and requires some additional time to start (due to JIT nature), but otherwise it is at least as fast as other languages traditionally used in science. More importantly, the memory safety, tooling support and vast ecosystem makes it №1 candidate for data analysis framework.
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
|
|
||||||
**Q:** Can I use my C++/Fortran/Python code in DataForge?
|
|
||||||
|
|
||||||
**A:** Yes, as long as the code could be called from Java. Most of common languages have a bridge for Java access. There are completely no problems with compiled C/Fortran libraries. Python code could be called via one of existing python-java interfaces. It is also planned to implement remote method invocation for common languages, so your Python, or, say, Julia, code could run in its native environment. The metadata processor paradigm makes it much easier to do so.
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
|
|
||||||
**Q:** Java is old and ugly. I want something modern. Functional programming, coroutines...
|
|
||||||
|
|
||||||
**A:** It is a question of perspective. In any case, you can use not only Java, but also any other language from JVM family like Scala or Clojure. The DataForge itself uses not only Java but also Groovy and Kotlin. When using Groovy it is recomended to use <a href="http://npm.mipt.ru/dataforge/docs#grind">GRIND</a> module which adds some interactiveness to the DataForge. <a href="http://npm.mipt.ru/dataforge/docs#kodex">KODEX</a> module contains some extensions to DataForge core classes for Kotlin language. It is planned to greatly expand Kotlin support in future. <hr>
|
|
||||||
|
|
||||||
## Features
|
|
||||||
|
|
||||||
**Q:** What other features does DataForge provide?
|
|
||||||
|
|
||||||
**A:** Alongside metadata processing (and a lot of tools for metadata manipulation and layering), DataForge has two additional important concepts:
|
|
||||||
|
|
||||||
* **Modularisation**. Contrary to lot other frameworks, DataForge is intrinsically modular. The mandatory part is a rather tiny core module. Everything else could be customized.
|
|
||||||
|
|
||||||
* **Context encapsulation**. Every DataForge task is executed in some context. The context isolates environment for the task and also works as dependency injection base and specifies interaction of the task with the external world.
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
|
|
||||||
**Q:** Does DataForge have visualization capabilities?
|
|
||||||
|
|
||||||
**A:** Yes, there is a <a href="http://npm.mipt.ru/dataforge/docs#plots">dataforge-plots</a> module that serves as an interface for different visualisation libraries and methods. The plots are configured in a very concise way using metadata approach.
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
|
|
||||||
**Q:** OK, but now I want to work directly with my measuring devices. How can I do that?
|
|
||||||
|
|
||||||
**A:** The <a href="http://npm.mipt.ru/dataforge/docs#control">dataforge-control</a> module provides interfaces to interact with the hardware. Out of the box it supports safe communication with TCP/IP or COM/tty based devices. Specific device declaration could be done via additional modules. It is also possible to maintain data storage with <a href="http://npm.mipt.ru/dataforge/docs#storage">datforge-storage</a> module.
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
|
|
||||||
**Q:** Declarations and metadata are good, but I want my scripts back!
|
|
||||||
|
|
||||||
**A:** We can do that. <a href="http://npm.mipt.ru/dataforge/docs#grind">GRIND</a> provides a shell-like environment called GrindShell. It allows to run imperative scripts with full access to all of the DataForge functionality. Grind scripts are basically context-encapsulated. Also there are convenient feature wrappers called helpers that could be loaded into the shell when new features modules are added.
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
|
|
||||||
Misc
|
|
||||||
**Q:** So everything looks great, can I replace my ROOT / other data analysis framework with DataForge?
|
|
||||||
|
|
||||||
**A:** One must note, that DataForge is made for analysis, not for visualisation. The visualisation and user interaction capabilities of DataForge are rather limited compared to frameworks like ROOT, JAS3 or DataMelt. The idea is to provide reliable API and core functionality. In fact JAS3 and DataMelt could be used as a frontend for DataForge mechanics. It is planned to add an interface to ROOT via JFreeHep AIDA.
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
|
|
||||||
**Q:** How does DataForge compare to cluster computation frameworks like Hadoop or Spark?
|
|
||||||
|
|
||||||
**A:** Again, it is not the purpose of DataForge to replace cluster software. DataForge has some internal parallelism mechanics and implementations, but they are most certainly worse then specially developed programs. Still, DataForge is not fixed on one single implementation. Your favourite parallel processing tool could be still used as a back-end for the DataForge. With full benefit of configuration tools, integrations and no performance overhead.
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
|
|
||||||
**Q:** Is it possible to use DataForge in notebook mode?
|
|
||||||
|
|
||||||
**A:** Yes, it is. DataForge can be used as is from <a href="http://beakernotebook.com/">beaker/beakerx</a> groovy kernel with minor additional adjustments. It is planned to provide separate DataForge kernel to beakerx which will automatically call a specific GRIND shell.
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
|
|
||||||
**Q:** Can I use DataForge on a mobile platform?
|
|
||||||
|
|
||||||
**A:** DataForge is modular. Core and the most of api are pretty compact, so it could be used in Android applications. Some modules are designed for PC and could not be used on other platforms. IPhone does not support Java and therefore could use only client-side DataForge applications.
|
|
||||||
|
|
||||||
<hr>
|
|
@ -1,16 +0,0 @@
|
|||||||
---
|
|
||||||
content_type: df-news
|
|
||||||
title: February site update
|
|
||||||
date: 2016-02-08
|
|
||||||
published: true
|
|
||||||
---
|
|
||||||
|
|
||||||
The site haven't been update for almost 6 months so it is time for some news.
|
|
||||||
|
|
||||||
First of all, the work on project is not stopped. The API's and core concepts are constantly updated. Last few months the main work was concentrated on refining the storage API and on new control architecture.
|
|
||||||
|
|
||||||
Second, sadly we failed to obtain a separate funding for the project in 2016, so it still will be developed mostly fro the purposes of "Troitsk nu-mass" experiment and in my free time (of which I sadly do not have much).
|
|
||||||
|
|
||||||
The work in near future will be concentrated on finalizing storage and control APIs and the main task is... tasks (the pull data flow model implementation).
|
|
||||||
|
|
||||||
The new [DataForge BitBucket repository](https://bitbucket.org/Altavir/dataforge/src/default/) is separated from "Troitsk nu-mass" code and therefore could be used as a standalone library. There is still quite a lot unsolved issues and a terrible shortage in documentation, but I am working on it.
|
|
@ -1,7 +0,0 @@
|
|||||||
---
|
|
||||||
content_type: df-news
|
|
||||||
title: Site update
|
|
||||||
date: 2017-08-02
|
|
||||||
published: true
|
|
||||||
---
|
|
||||||
Documentation and front update.
|
|
@ -1,8 +0,0 @@
|
|||||||
---
|
|
||||||
content_type: df-news
|
|
||||||
title: Poster talk on Lomonosov 2015 conference
|
|
||||||
date: 2015-08-16
|
|
||||||
published: true
|
|
||||||
---
|
|
||||||
|
|
||||||
The poster about DataForge was presented on Lomonosov 2015 conference on particle physics. The poster itself could be downloaded from [here](https://drive.google.com/file/d/0B9tlm5xMb9SdNjQwX0pncVpoYkk/view).
|
|
@ -1,7 +0,0 @@
|
|||||||
---
|
|
||||||
content_type: df-news
|
|
||||||
title: DataForge site launched
|
|
||||||
date: 2015-08-16
|
|
||||||
published: true
|
|
||||||
---
|
|
||||||
<img src="/images/dataforge/df_logo.png" alt="DataForge"/> This site is launched. The repository for site development is <a href="https://bitbucket.org/Altavir/dataforge-grain">here</a>.
|
|
@ -1,18 +0,0 @@
|
|||||||
import React from "react"
|
|
||||||
import Layout from "../../components/dataforge/layout"
|
|
||||||
import SEO from "../../components/dataforge/seo"
|
|
||||||
|
|
||||||
const AppPage = () => (
|
|
||||||
<Layout>
|
|
||||||
<SEO PageTitle="Applications |"/>
|
|
||||||
<h1>Troitsk nu-mass</h1>
|
|
||||||
<img src="http://www.inr.ru/~trdat/img/spectrometer900.jpg" alt="spectrometer"/>
|
|
||||||
<p>
|
|
||||||
The main aim of <a href="http://www.inr.ru/~trdat/">Troitsk nu-mass</a> is a search for masses of active and sterile
|
|
||||||
neutrinos in the beta-spectrum of tritium.
|
|
||||||
</p>
|
|
||||||
<hr/>
|
|
||||||
</Layout>
|
|
||||||
)
|
|
||||||
|
|
||||||
export default AppPage
|
|
@ -1,42 +0,0 @@
|
|||||||
import React from "react"
|
|
||||||
import { graphql } from "gatsby"
|
|
||||||
import DocsLayout from "../../../components/dataforge/docsLayout"
|
|
||||||
import SideBar from "../../../components/dataforge/sidebar"
|
|
||||||
import "../../../styles/dataforge/sidebar.css"
|
|
||||||
|
|
||||||
const DocsControlPage = ({ data }) => {
|
|
||||||
|
|
||||||
return (
|
|
||||||
<DocsLayout>
|
|
||||||
<div id="docs">
|
|
||||||
<SideBar pageWrapId={"page-wrap"} outerContainerId={"docs"} />
|
|
||||||
<div id="page-wrap">
|
|
||||||
{data.main.nodes.map(main => {
|
|
||||||
const title = main.frontmatter.title;
|
|
||||||
return(
|
|
||||||
<>
|
|
||||||
<h1 style={{marginTop: `25px`}}>{title}</h1>
|
|
||||||
<p style={{marginBottom: `40px`, marginTop: `0`}} dangerouslySetInnerHTML = {{__html: main.html,}}/>
|
|
||||||
</>
|
|
||||||
)
|
|
||||||
})}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</DocsLayout>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
export default DocsControlPage
|
|
||||||
|
|
||||||
export const query = graphql`
|
|
||||||
query {
|
|
||||||
main: allMarkdownRemark(filter: {frontmatter: {content_type: {eq: "doc_control"}, published: {eq: true}}},
|
|
||||||
sort: {fields: frontmatter___order, order: ASC}) {
|
|
||||||
nodes {
|
|
||||||
html
|
|
||||||
frontmatter {
|
|
||||||
title
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}`
|
|
@ -1,43 +0,0 @@
|
|||||||
import React from "react"
|
|
||||||
import { graphql } from "gatsby"
|
|
||||||
import DocsLayout from "../../../components/dataforge/docsLayout"
|
|
||||||
import SideBar from "../../../components/dataforge/sidebar"
|
|
||||||
import "../../../styles/dataforge/sidebar.css"
|
|
||||||
|
|
||||||
const DocsDataPage = ({ data }) => {
|
|
||||||
|
|
||||||
return (
|
|
||||||
<DocsLayout>
|
|
||||||
<div id="docs">
|
|
||||||
<SideBar pageWrapId={"page-wrap"} outerContainerId={"docs"} />
|
|
||||||
<div id="page-wrap">
|
|
||||||
{data.main.nodes.map(main => {
|
|
||||||
const title = main.frontmatter.title;
|
|
||||||
return(
|
|
||||||
<div style={{textAlign: `center`}}>
|
|
||||||
<h1 style={{marginTop: `25px`}}>{title}</h1>
|
|
||||||
<p style={{marginBottom: `40px`, marginTop: `0`}} dangerouslySetInnerHTML = {{__html: main.html,}}/>
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
})}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</DocsLayout>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
export default DocsDataPage
|
|
||||||
|
|
||||||
export const query = graphql`
|
|
||||||
query {
|
|
||||||
main: allMarkdownRemark(filter: {frontmatter: {content_type: {eq: "doc_data"}, published: {eq: true}}},
|
|
||||||
sort: {fields: frontmatter___order, order: ASC}) {
|
|
||||||
nodes {
|
|
||||||
html
|
|
||||||
frontmatter {
|
|
||||||
title
|
|
||||||
order
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}`
|
|
@ -1,42 +0,0 @@
|
|||||||
import React from "react"
|
|
||||||
import { graphql } from "gatsby"
|
|
||||||
import DocsLayout from "../../../components/dataforge/docsLayout"
|
|
||||||
import SideBar from "../../../components/dataforge/sidebar"
|
|
||||||
import "../../../styles/dataforge/sidebar.css"
|
|
||||||
|
|
||||||
const DocsEnvelopesPage = ({ data }) => {
|
|
||||||
|
|
||||||
return (
|
|
||||||
<DocsLayout>
|
|
||||||
<div id="docs">
|
|
||||||
<SideBar pageWrapId={"page-wrap"} outerContainerId={"docs"} />
|
|
||||||
<div id="page-wrap">
|
|
||||||
{data.main.nodes.map(main => {
|
|
||||||
const title = main.frontmatter.title;
|
|
||||||
return(
|
|
||||||
<>
|
|
||||||
<h1 style={{marginTop: `25px`}}>{title}</h1>
|
|
||||||
<p style={{marginBottom: `40px`, marginTop: `0`}} dangerouslySetInnerHTML = {{__html: main.html,}}/>
|
|
||||||
</>
|
|
||||||
)
|
|
||||||
})}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</DocsLayout>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
export default DocsEnvelopesPage
|
|
||||||
|
|
||||||
export const query = graphql`
|
|
||||||
query {
|
|
||||||
main: allMarkdownRemark(filter: {frontmatter: {content_type: {eq: "doc_env"}, published: {eq: true}}},
|
|
||||||
sort: {fields: frontmatter___order, order: ASC}) {
|
|
||||||
nodes {
|
|
||||||
html
|
|
||||||
frontmatter {
|
|
||||||
title
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}`
|
|
@ -1,42 +0,0 @@
|
|||||||
import React from "react"
|
|
||||||
import { graphql } from "gatsby"
|
|
||||||
import DocsLayout from "../../../components/dataforge/docsLayout"
|
|
||||||
import SideBar from "../../../components/dataforge/sidebar"
|
|
||||||
import "../../../styles/dataforge/sidebar.css"
|
|
||||||
|
|
||||||
const DocsExtensionsPage = ({ data }) => {
|
|
||||||
|
|
||||||
return (
|
|
||||||
<DocsLayout>
|
|
||||||
<div id="docs">
|
|
||||||
<SideBar pageWrapId={"page-wrap"} outerContainerId={"docs"} />
|
|
||||||
<div id="page-wrap">
|
|
||||||
{data.main.nodes.map(main => {
|
|
||||||
const title = main.frontmatter.title;
|
|
||||||
return(
|
|
||||||
<>
|
|
||||||
<h1 style={{marginTop: `25px`}}>{title}</h1>
|
|
||||||
<p style={{marginBottom: `40px`, marginTop: `0`}} dangerouslySetInnerHTML = {{__html: main.html,}}/>
|
|
||||||
</>
|
|
||||||
)
|
|
||||||
})}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</DocsLayout>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
export default DocsExtensionsPage
|
|
||||||
|
|
||||||
export const query = graphql`
|
|
||||||
query {
|
|
||||||
main: allMarkdownRemark(filter: {frontmatter: {content_type: {eq: "doc_extensions"}, published: {eq: true}}},
|
|
||||||
sort: {fields: frontmatter___order, order: ASC}) {
|
|
||||||
nodes {
|
|
||||||
html
|
|
||||||
frontmatter {
|
|
||||||
title
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}`
|
|
@ -1,42 +0,0 @@
|
|||||||
import React from "react"
|
|
||||||
import { graphql } from "gatsby"
|
|
||||||
import DocsLayout from "../../../components/dataforge/docsLayout"
|
|
||||||
import SideBar from "../../../components/dataforge/sidebar"
|
|
||||||
import "../../../styles/dataforge/sidebar.css"
|
|
||||||
|
|
||||||
const DocsFrameworkPage = ({ data }) => {
|
|
||||||
|
|
||||||
return (
|
|
||||||
<DocsLayout>
|
|
||||||
<div id="docs">
|
|
||||||
<SideBar pageWrapId={"page-wrap"} outerContainerId={"docs"} />
|
|
||||||
<div id="page-wrap">
|
|
||||||
{data.main.nodes.map(main => {
|
|
||||||
const title = main.frontmatter.title;
|
|
||||||
return(
|
|
||||||
<>
|
|
||||||
<h1 style={{marginTop: `25px`}}>{title}</h1>
|
|
||||||
<p style={{marginBottom: `40px`, marginTop: `0`}} dangerouslySetInnerHTML = {{__html: main.html,}}/>
|
|
||||||
</>
|
|
||||||
)
|
|
||||||
})}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</DocsLayout>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
export default DocsFrameworkPage
|
|
||||||
|
|
||||||
export const query = graphql`
|
|
||||||
query {
|
|
||||||
main: allMarkdownRemark(filter: {frontmatter: {content_type: {eq: "doc_framework"}, published: {eq: true}}},
|
|
||||||
sort: {fields: frontmatter___order, order: ASC}) {
|
|
||||||
nodes {
|
|
||||||
html
|
|
||||||
frontmatter {
|
|
||||||
title
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}`
|
|
@ -1,42 +0,0 @@
|
|||||||
import React from "react"
|
|
||||||
import { graphql } from "gatsby"
|
|
||||||
import DocsLayout from "../../../components/dataforge/docsLayout"
|
|
||||||
import SideBar from "../../../components/dataforge/sidebar"
|
|
||||||
import "../../../styles/dataforge/sidebar.css"
|
|
||||||
|
|
||||||
const DocsIndexPage = ({ data }) => {
|
|
||||||
|
|
||||||
return (
|
|
||||||
<DocsLayout>
|
|
||||||
<div id="docs">
|
|
||||||
<SideBar pageWrapId={"page-wrap"} outerContainerId={"docs"} />
|
|
||||||
<div id="page-wrap">
|
|
||||||
{data.main.nodes.map(main => {
|
|
||||||
const title = main.frontmatter.title;
|
|
||||||
return(
|
|
||||||
<>
|
|
||||||
<h1 style={{marginTop: `25px`}}>{title}</h1>
|
|
||||||
<p style={{marginBottom: `40px`}} dangerouslySetInnerHTML = {{__html: main.html,}}/>
|
|
||||||
</>
|
|
||||||
)
|
|
||||||
})}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</DocsLayout>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
export default DocsIndexPage
|
|
||||||
|
|
||||||
export const query = graphql`
|
|
||||||
query {
|
|
||||||
main: allMarkdownRemark(filter: {frontmatter: {content_type: {eq: "doc_main"}, published: {eq: true}}},
|
|
||||||
sort: {fields: frontmatter___order, order: ASC}) {
|
|
||||||
nodes {
|
|
||||||
html
|
|
||||||
frontmatter {
|
|
||||||
title
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}`
|
|
@ -1,42 +0,0 @@
|
|||||||
import React from "react"
|
|
||||||
import { graphql } from "gatsby"
|
|
||||||
import DocsLayout from "../../../components/dataforge/docsLayout"
|
|
||||||
import SideBar from "../../../components/dataforge/sidebar"
|
|
||||||
import "../../../styles/dataforge/sidebar.css"
|
|
||||||
|
|
||||||
const DocsMetaPage = ({ data }) => {
|
|
||||||
|
|
||||||
return (
|
|
||||||
<DocsLayout>
|
|
||||||
<div id="docs">
|
|
||||||
<SideBar pageWrapId={"page-wrap"} outerContainerId={"docs"} />
|
|
||||||
<div id="page-wrap">
|
|
||||||
{data.main.nodes.map(main => {
|
|
||||||
const title = main.frontmatter.title;
|
|
||||||
return(
|
|
||||||
<>
|
|
||||||
<h1 style={{marginTop: `25px`, }}>{title}</h1>
|
|
||||||
<p style={{marginBottom: `40px`, marginTop: `0`}} dangerouslySetInnerHTML = {{__html: main.html,}}/>
|
|
||||||
</>
|
|
||||||
)
|
|
||||||
})}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</DocsLayout>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
export default DocsMetaPage
|
|
||||||
|
|
||||||
export const query = graphql`
|
|
||||||
query {
|
|
||||||
main: allMarkdownRemark(filter: {frontmatter: {content_type: {eq: "doc_meta"}, published: {eq: true}}},
|
|
||||||
sort: {fields: frontmatter___order, order: ASC}) {
|
|
||||||
nodes {
|
|
||||||
html
|
|
||||||
frontmatter {
|
|
||||||
title
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}`
|
|
@ -1,42 +0,0 @@
|
|||||||
import React from "react"
|
|
||||||
import { graphql } from "gatsby"
|
|
||||||
import DocsLayout from "../../../components/dataforge/docsLayout"
|
|
||||||
import SideBar from "../../../components/dataforge/sidebar"
|
|
||||||
import "../../../styles/dataforge/sidebar.css"
|
|
||||||
|
|
||||||
const DocsStoragePage = ({ data }) => {
|
|
||||||
|
|
||||||
return (
|
|
||||||
<DocsLayout>
|
|
||||||
<div id="docs">
|
|
||||||
<SideBar pageWrapId={"page-wrap"} outerContainerId={"docs"} />
|
|
||||||
<div id="page-wrap">
|
|
||||||
{data.main.nodes.map(main => {
|
|
||||||
const title = main.frontmatter.title;
|
|
||||||
return(
|
|
||||||
<>
|
|
||||||
<h1 style={{marginTop: `25px`}}>{title}</h1>
|
|
||||||
<p style={{marginBottom: `40px`, marginTop: `0`}} dangerouslySetInnerHTML = {{__html: main.html,}}/>
|
|
||||||
</>
|
|
||||||
)
|
|
||||||
})}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</DocsLayout>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
export default DocsStoragePage
|
|
||||||
|
|
||||||
export const query = graphql`
|
|
||||||
query {
|
|
||||||
main: allMarkdownRemark(filter: {frontmatter: {content_type: {eq: "doc_storage"}, published: {eq: true}}},
|
|
||||||
sort: {fields: frontmatter___order, order: ASC}) {
|
|
||||||
nodes {
|
|
||||||
html
|
|
||||||
frontmatter {
|
|
||||||
title
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}`
|
|
@ -1,29 +0,0 @@
|
|||||||
import React from "react"
|
|
||||||
import SEO from "../../components/dataforge/seo"
|
|
||||||
import {graphql} from "gatsby"
|
|
||||||
import Layout from "../../components/dataforge/layout"
|
|
||||||
|
|
||||||
const DataforgePage = ({ data }) => (
|
|
||||||
<Layout id="df">
|
|
||||||
<SEO PageTitle=" "/>
|
|
||||||
{data.index.nodes.map(index=>{
|
|
||||||
return(<p
|
|
||||||
dangerouslySetInnerHTML = {{
|
|
||||||
__html: index.html,
|
|
||||||
}}
|
|
||||||
/>)
|
|
||||||
})}
|
|
||||||
</Layout>
|
|
||||||
)
|
|
||||||
|
|
||||||
export default DataforgePage
|
|
||||||
|
|
||||||
export const query = graphql`
|
|
||||||
query{
|
|
||||||
index: allMarkdownRemark (filter: {frontmatter: {content_type: {eq: "df-index"}}}){
|
|
||||||
nodes{
|
|
||||||
html
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
`
|
|
@ -1,78 +0,0 @@
|
|||||||
import React from "react"
|
|
||||||
import Layout from "../../components/dataforge/layout"
|
|
||||||
import SEO from "../../components/dataforge/seo"
|
|
||||||
|
|
||||||
import sms_logo from "../../images/dataforge/sms_logo.png"
|
|
||||||
|
|
||||||
const MiscPage = () => (
|
|
||||||
<Layout>
|
|
||||||
<SEO PageTitle="See also |"/>
|
|
||||||
<h1 id="about">About us...</h1>
|
|
||||||
|
|
||||||
<img width="150" src={sms_logo} style={{marginRight: `25px`}} alt="sms"/>
|
|
||||||
The DataForge is currently being developed in Sector for mathematical support of <a href="http://www.inr.ru/">Institute for Nuclear Research of Russian academy of Sciences </a>.
|
|
||||||
|
|
||||||
<p/>
|
|
||||||
<hr style={{height: `1px`}}/>
|
|
||||||
|
|
||||||
<h1>Other data analysis framework</h1>
|
|
||||||
<div class="col-lg-12">
|
|
||||||
|
|
||||||
<table>
|
|
||||||
<tr>
|
|
||||||
<a href="https://root.cern.ch/">
|
|
||||||
<img align="left" alt="root" style={{marginRight: `25px`, marginBottom: `0`, marginTop: `10px`}} width="150" src="https://root.cern.ch/root/htmldoc/guides/users-guide/pictures/rootlogo.png"/>
|
|
||||||
</a>
|
|
||||||
|
|
||||||
<p>Root is the most used data analysis framework in particle physics. The documentation for this
|
|
||||||
platform is extensive and it has good scientific community support. Its main problem is its
|
|
||||||
architecture which originates in 1980-s and holds a lot of legacy drawbacks of older FORTRAN
|
|
||||||
platforms. Also the general problem is C++. While being very flexible, C++ requires a lot of
|
|
||||||
programming expertise to write safe and consistent code. Sadly, physicists seldom are not very
|
|
||||||
good programmers. Nowadays Root hits the roof of its usability.</p>
|
|
||||||
|
|
||||||
<p>Additional information about Root criticism could be found <a href="https://en.wikipedia.org/wiki/ROOT#Criticisms">here</a>. </p>
|
|
||||||
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<hr style={{height: `1px`}}/>
|
|
||||||
<table>
|
|
||||||
<tr>
|
|
||||||
{/* <td><a href="http://jas.freehep.org/jas3/"> <img style={{marginRight: `25px`}} width="300" src="http://jas.freehep.org/jas3/images/jas3Title.png"/></a></td> */}
|
|
||||||
<td>
|
|
||||||
<p>The java analysis studio is quite advanced data visualization framework developed in Standford accelerator center. It is modular and has good object oriented design</p>
|
|
||||||
<p>It is intended to make an interface to integrate DataForge framework with JAS3 visualization via <a href="modules.html#aida">AIDA plugin</a></p>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<hr/>
|
|
||||||
<table>
|
|
||||||
<tr>
|
|
||||||
<td>
|
|
||||||
<a href="jwork.org/dmelt/">
|
|
||||||
<table>
|
|
||||||
<tr>
|
|
||||||
<img src="http://jwork.org/dmelt/data_dm/images/dm_logo125px.png" alt="dataMelt"/>
|
|
||||||
</tr>
|
|
||||||
<tr align="center"><h3>DataMelt</h3></tr>
|
|
||||||
</table>
|
|
||||||
</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<p>
|
|
||||||
DataMelt is huge collection of scientific libraries accompanied by visual framework which allows to
|
|
||||||
write analysis scripts in different JVM languages. It is a good memory-safe alternative to Root, but
|
|
||||||
sadly it inherits a lot of Root architectural drawbacks as well.
|
|
||||||
</p>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<hr/>
|
|
||||||
</div>
|
|
||||||
</Layout>
|
|
||||||
)
|
|
||||||
|
|
||||||
export default MiscPage
|
|
@ -1,76 +0,0 @@
|
|||||||
import React from "react"
|
|
||||||
import SEO from "../../components/dataforge/seo"
|
|
||||||
import Layout from "../../components/dataforge/layout"
|
|
||||||
|
|
||||||
const ModulesPage = () => (
|
|
||||||
<Layout id="df">
|
|
||||||
<SEO PageTitle="Modules |" />
|
|
||||||
<h1 id="core">dataforge-core</h1>
|
|
||||||
<ul>
|
|
||||||
<li>Meta-data processing tools.</li>
|
|
||||||
<li>Context encapsulation mechanism.</li>
|
|
||||||
<li>Basic data structures: Values, DataPoints, DataSets etc.</li>
|
|
||||||
<li>Actions (see "push" data flow model).</li>
|
|
||||||
<li>Tasks and workspaces (see "pull" data flow model).</li>
|
|
||||||
<li>Basic IO, Logging.</li>
|
|
||||||
<li>Naming, paths and navigation.</li>
|
|
||||||
</ul>
|
|
||||||
<hr/>
|
|
||||||
|
|
||||||
<h1 id="aida">dataforge-aida (planned)</h1>
|
|
||||||
<p>A connector to current data analysis software like JAS3 and ROOT.</p>
|
|
||||||
<hr/>
|
|
||||||
|
|
||||||
<h1 id="maths">dataforge-maths</h1>
|
|
||||||
<p>A simple wrapper for Apache Commons Math library (one of the most advanced mathematical libraries).
|
|
||||||
DataForge numerical integration API. Some minor utilities.</p>
|
|
||||||
<hr/>
|
|
||||||
|
|
||||||
<h1 id="fitting">dataforge-fitting</h1>
|
|
||||||
<ul>
|
|
||||||
<li>Models API and implementation (Spectra, Histograms etc.).</li>
|
|
||||||
<li>Basic DataForge fitting API (parameters, models, states etc.).</li>
|
|
||||||
<li>A unique implementation of Fyodor Tkachov's Quasi-Optimal Weights method (QOW).</li>
|
|
||||||
<li> A wrapper for Commons Math no-deriv procedures.</li>
|
|
||||||
<li>Bayesian tools to work with prior and posterior Likelihood functions.</li>
|
|
||||||
</ul>
|
|
||||||
<p>(addition) A refined version of JMINUIT is included in additional module.</p>
|
|
||||||
<hr/>
|
|
||||||
|
|
||||||
<h1 id="plots">dataforge-plots</h1>
|
|
||||||
<ul>
|
|
||||||
<li>General DataForge plotting API based on annotations.</li>
|
|
||||||
<li>Reference implementation based on JFreeChart library. JFreeChart is one of most rich library for graph plotting
|
|
||||||
ever made (not only in Java).
|
|
||||||
</li>
|
|
||||||
<li>Reference implementation based on JavaFX Charts.</li>
|
|
||||||
</ul>
|
|
||||||
<hr/>
|
|
||||||
|
|
||||||
<h1 id="storage">dataforge-storage</h1>
|
|
||||||
<ul>
|
|
||||||
<li>Advanced abstract storage API based on annotations.</li>
|
|
||||||
<li>Basic implementation for different storage systems (including direct file storage, relation databases and no-SQL
|
|
||||||
databases).
|
|
||||||
</li>
|
|
||||||
<li> Envelope format allowing combining binary data and text meta-data in one container.</li>
|
|
||||||
<li> Automatic logging and event system.</li>
|
|
||||||
<li> Remote storage implementation.</li>
|
|
||||||
</ul>
|
|
||||||
<hr/>
|
|
||||||
|
|
||||||
<h1 id="control">dataforge-control</h1>
|
|
||||||
<p>Alarms and device controls based on storage events.</p>
|
|
||||||
<hr/>
|
|
||||||
|
|
||||||
<h1 id="grind">Project GRINDStone(GRoovy INteractive Dataforge)</h1>
|
|
||||||
<ul>
|
|
||||||
<li>Scripting support with Groovy.</li>
|
|
||||||
<li> Command line interpreter using Groovy shell.</li>
|
|
||||||
<li> Both dynamic and static type systems.</li>
|
|
||||||
<li> Advanced tools for annotation, actions and tasks construction via Groovy DSL builders.</li>
|
|
||||||
</ul>
|
|
||||||
</Layout>
|
|
||||||
)
|
|
||||||
|
|
||||||
export default ModulesPage
|
|
@ -1,44 +0,0 @@
|
|||||||
import React from "react"
|
|
||||||
import SEO from "../../components/dataforge/seo"
|
|
||||||
import {graphql} from "gatsby"
|
|
||||||
import Layout from "../../components/dataforge/layout"
|
|
||||||
|
|
||||||
const NewsPage = ({ data }) => (
|
|
||||||
<Layout>
|
|
||||||
<SEO PageTitle="News |"/>
|
|
||||||
{data.posts.nodes.map(post => {
|
|
||||||
const title = post.frontmatter.title;
|
|
||||||
const date = post.frontmatter.date;
|
|
||||||
return(
|
|
||||||
<div class = "card" style={{marginBottom: `15px`, borderRadius: `0px`, boxShadow: `0 2px 2px #A2A2A2`}}>
|
|
||||||
<div class = "card-body">
|
|
||||||
<h2 class = "title">
|
|
||||||
{title}<span id="date">{date}</span>
|
|
||||||
</h2>
|
|
||||||
<p
|
|
||||||
dangerouslySetInnerHTML = {{
|
|
||||||
__html: post.frontmatter.description || post.html,
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
})}
|
|
||||||
</Layout>
|
|
||||||
)
|
|
||||||
|
|
||||||
export default NewsPage
|
|
||||||
|
|
||||||
export const query = graphql`
|
|
||||||
query {
|
|
||||||
posts: allMarkdownRemark(filter: {frontmatter: {content_type: {eq: "df-news"}, published: {eq: true}}},
|
|
||||||
sort: {fields: [frontmatter___date], order: DESC}) {
|
|
||||||
nodes{
|
|
||||||
html
|
|
||||||
frontmatter {
|
|
||||||
date(formatString: "DD.MM.YYYY")
|
|
||||||
title
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}`
|
|
@ -1,60 +0,0 @@
|
|||||||
import React from "react"
|
|
||||||
import SEO from "../../components/dataforge/seo"
|
|
||||||
import Layout from "../../components/dataforge/layout"
|
|
||||||
|
|
||||||
const ReleasesPage = () => (
|
|
||||||
<Layout>
|
|
||||||
<SEO PageTitle="Releases |"/>
|
|
||||||
<h2>Versioning</h2>
|
|
||||||
<p>DataForge uses <a href="https://docs.oracle.com/middleware/1212/core/MAVEN/maven_version.htm">Maven version</a> policy.</p>
|
|
||||||
<h2>Source code and documentation consistency</h2>
|
|
||||||
<p>Be warned that for SNAPSHOT versions source code and documentation could be slightly inconsistent due to not synchronized update of this site.</p>
|
|
||||||
|
|
||||||
<hr style={{height: `1px`}}/>
|
|
||||||
|
|
||||||
<table class="table table-bordered table-striped">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th class="release-table-block">Version</th>
|
|
||||||
<th class="release-table-block">Javadoc</th>
|
|
||||||
<th class="release-table-block">Release notes</th>
|
|
||||||
<th class="release-table-block">Info</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
<tr>
|
|
||||||
<td class="release-table-block">0.1.0</td>
|
|
||||||
<td class="release-table-block"></td>
|
|
||||||
<td class="release-table-block"></td>
|
|
||||||
<td></td>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
<td class="release-table-block">0.1.1</td>
|
|
||||||
<td class="release-table-block"></td>
|
|
||||||
<td class="release-table-block"></td>
|
|
||||||
<td>
|
|
||||||
<ul>
|
|
||||||
<li>Annotations are renamed to Meta.</li>
|
|
||||||
<li>Deprecated and removed Items from meta package and replaced by immutable lists.</li>
|
|
||||||
<li>TimeValue produces Instant instead of LocalDateTime since Instant is absolute while LocalDateTime is not.</li>
|
|
||||||
</ul>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
<td class="release-table-block">0.4.0 - SNAPSHOT</td>
|
|
||||||
<td class="release-table-block">
|
|
||||||
<a href="http://npm.mipt.ru/dataforge/docs/0.4.0 - SNAPSHOT/javadoc/index.html" type="text/html">HTML</a>
|
|
||||||
</td>
|
|
||||||
<td class="release-table-block"></td>
|
|
||||||
<td><p><strong>For list of features see documentation</strong></p></td>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
</Layout>
|
|
||||||
)
|
|
||||||
|
|
||||||
export default ReleasesPage
|
|
@ -1,32 +0,0 @@
|
|||||||
main#docs {
|
|
||||||
margin-top: 0;
|
|
||||||
font-family: Arial, Helvetica, sans-serif;
|
|
||||||
min-height: 85vh; }
|
|
||||||
|
|
||||||
main#docs p {
|
|
||||||
font-family: Arial, Helvetica, sans-serif;
|
|
||||||
font-size: 20px;
|
|
||||||
font-weight: 400; }
|
|
||||||
|
|
||||||
main#docs h1 {
|
|
||||||
font-size: 48px;
|
|
||||||
font-family: Arial, Helvetica, sans-serif;
|
|
||||||
font-weight: 500; }
|
|
||||||
|
|
||||||
main#docs h2 {
|
|
||||||
font-size: 43px;
|
|
||||||
font-family: Arial, Helvetica, sans-serif;
|
|
||||||
font-weight: 500; }
|
|
||||||
|
|
||||||
main#docs h3 {
|
|
||||||
font-size: 34px;
|
|
||||||
font-family: Arial, Helvetica, sans-serif;
|
|
||||||
font-size: 500; }
|
|
||||||
|
|
||||||
main#docs a { color: rgb(35, 133, 236); }
|
|
||||||
main#docs a:hover { color: rgb(35, 133, 236); text-decoration: underline; }
|
|
||||||
main#docs a:visited { color: rgb(35, 133, 236); }
|
|
||||||
|
|
||||||
main#docs ul li a { color: rgb(35, 133, 236); }
|
|
||||||
main#docs ul li a:hover { color: rgb(35, 133, 236); }
|
|
||||||
main#docs ul li a:visited { color: rgb(35, 133, 236); }
|
|
@ -1,11 +0,0 @@
|
|||||||
footer#df * {
|
|
||||||
text-align: left;
|
|
||||||
font-family: Arial, Helvetica, sans-serif;
|
|
||||||
left: 0;
|
|
||||||
bottom: 0; }
|
|
||||||
|
|
||||||
footer#df p { font-size: 18px; }
|
|
||||||
|
|
||||||
footer#df a { color: rgb(54, 117, 185); text-decoration: none; }
|
|
||||||
footer#df a:hover { color: rgb(39, 88, 141); text-decoration: underline; }
|
|
||||||
footer#df a:visited { color: rgb(54, 117, 185); }
|
|
@ -1,44 +0,0 @@
|
|||||||
header#df {
|
|
||||||
width: 100%;
|
|
||||||
height: 70px;
|
|
||||||
font-size: 20px; }
|
|
||||||
|
|
||||||
/* ----- navbar ----------------------------- */
|
|
||||||
header#df .navbar {
|
|
||||||
padding: 0;
|
|
||||||
height: 75px;
|
|
||||||
background-color: rgb(114, 111, 111);
|
|
||||||
border: none; }
|
|
||||||
|
|
||||||
a[aria-current="page"] img#dflogo { opacity: 1; background-color: rgb(114,111,111);}
|
|
||||||
|
|
||||||
header#df a.nav-link:hover { color: white; background-color: rgb(182, 188, 192); padding-top: 15px }
|
|
||||||
header#df a.nav-link { margin-top: 7px; }
|
|
||||||
header#df a.nav-link a#df { padding: 15px; }
|
|
||||||
a[aria-current="page"]#df {
|
|
||||||
background-color: rgb(182, 188, 192);
|
|
||||||
padding-top: 11px;
|
|
||||||
padding-bottom: 18px; }
|
|
||||||
|
|
||||||
header#df button.navbar-toggler.collapsed {
|
|
||||||
background-color: rgb(228, 228, 228);
|
|
||||||
margin-left: 10px;
|
|
||||||
margin-top: 0px; }
|
|
||||||
|
|
||||||
header#df button.navbar-toggler { background-color: rgb(228, 228, 228); }
|
|
||||||
|
|
||||||
header#df div.mr-auto.navbar-nav {
|
|
||||||
background-color: rgb(114, 111, 111);
|
|
||||||
height: 75px; }
|
|
||||||
|
|
||||||
/* ------------------------------------------------- */
|
|
||||||
|
|
||||||
/* ------ media ------------------------------------ */
|
|
||||||
@media (max-width: 769px){
|
|
||||||
header#df a.nav-link { margin-left: 40px; margin-right: 40px; padding: 15px; }
|
|
||||||
header#df img#dflogo { margin-left: 0px; margin-right: 0px; padding-left: 10px}
|
|
||||||
header#df div#basic-navbar-nav.navbar-collapse.collapse.show {
|
|
||||||
background-color: rgb(114,111,111);
|
|
||||||
padding-bottom: 450px; }
|
|
||||||
}
|
|
||||||
/* ------------------------------------------------- */
|
|
@ -1,37 +0,0 @@
|
|||||||
main#df { margin-top: 20px; min-height: 84vh; }
|
|
||||||
main#df * { font-family: Arial, Helvetica, sans-serif; }
|
|
||||||
main#df p { font-size: 20px; margin: 10px 0 10px 0; }
|
|
||||||
main#df h1 { font-size: 48px; font-weight: 500; }
|
|
||||||
main#df h2 { font-size: 43px; font-weight: 500; }
|
|
||||||
main#df h3 { font-size: 24px; }
|
|
||||||
main#df hr { margin: 20px 0 20px 0; border: none; }
|
|
||||||
main#df li { font-size: 20px; }
|
|
||||||
main#df a { color: rgb(54, 117, 185); text-decoration: none; }
|
|
||||||
main#df a:hover { color: rgb(40, 87, 138); text-decoration: underline; }
|
|
||||||
main#df a:visited { color: rgb(54, 117, 185); }
|
|
||||||
main#df div.post:last-of-type { margin-bottom: 150px; }
|
|
||||||
|
|
||||||
/* --------- news -------------- */
|
|
||||||
main#df span#date {
|
|
||||||
background-color: rgb(101, 141, 184);
|
|
||||||
border: none;
|
|
||||||
padding: 10px;
|
|
||||||
position: absolute;
|
|
||||||
right: 15px;
|
|
||||||
top: 15px;
|
|
||||||
margin: 10px;
|
|
||||||
}
|
|
||||||
/* ----------------------------- */
|
|
||||||
|
|
||||||
/* ----- media ---------------------------- */
|
|
||||||
@media (max-width: 769px) {
|
|
||||||
main#df span#date {
|
|
||||||
top: 0;
|
|
||||||
right: 0;
|
|
||||||
margin: 0px;
|
|
||||||
}
|
|
||||||
button#togglerButton.navbar-toggler.collapsed {
|
|
||||||
margin-top: 10px;
|
|
||||||
margin-left: 10px; }
|
|
||||||
}
|
|
||||||
/* ---------------------------------------- */
|
|
@ -1,52 +0,0 @@
|
|||||||
main#docs[style="overflow: hidden;"] div#docs div#page-wrap { margin-left: 20px; }
|
|
||||||
#docs {
|
|
||||||
margin-top: 4px;
|
|
||||||
font-family: sans-serif;
|
|
||||||
min-height: 100vh; }
|
|
||||||
|
|
||||||
.bm-overlay { background: rgba(255, 255, 255, 0) !important; }
|
|
||||||
.bm-menu {
|
|
||||||
background: rgb(48,48,48);
|
|
||||||
padding: 50px 0 0 0;
|
|
||||||
font-size: 1.15em;
|
|
||||||
color: white; }
|
|
||||||
|
|
||||||
.bm-item-list { color: #b8b7ad; }
|
|
||||||
main#docs a.bm-item.menu-item#active { color: white; background-color: rgb(36, 35, 35); }
|
|
||||||
main#docs a.bm-item.menu-item:hover { color: white; text-decoration: none; }
|
|
||||||
main#docs a.bm-item.menu-item:visited { color: #d1d1d1 }
|
|
||||||
main#docs a.bm-item.menu-item:visited:hover { color: white; }
|
|
||||||
main#docs a.bm-item.menu-item {
|
|
||||||
display: inline-block;
|
|
||||||
text-decoration: none;
|
|
||||||
padding: 20px;
|
|
||||||
color: #d1d1d1;
|
|
||||||
transition: color 0.2s;
|
|
||||||
outline: none; }
|
|
||||||
|
|
||||||
.bm-cross { background: #bdc3c7; }
|
|
||||||
.bm-cross-button { height: 30px; width: 24px; }
|
|
||||||
|
|
||||||
.bm-burger-bars { background: rgb(48,48,48); }
|
|
||||||
.bm-burger-button:active { outline: none; }
|
|
||||||
.bm-burger-button {
|
|
||||||
position: fixed;
|
|
||||||
width: 36px;
|
|
||||||
height: 30px;
|
|
||||||
left: 36px;
|
|
||||||
top: 36px;
|
|
||||||
margin-top: 70px;
|
|
||||||
outline: none; }
|
|
||||||
|
|
||||||
#page-wrap {
|
|
||||||
position: relative;
|
|
||||||
margin-left: 100px;
|
|
||||||
text-align: left;
|
|
||||||
overflow: auto; }
|
|
||||||
|
|
||||||
/* ----- media ------------------- */
|
|
||||||
@media(max-width: 769px){
|
|
||||||
.bm-burger-button { left: 20px; }
|
|
||||||
#page-wrap { margin-left: 80px; margin-right: 5px; }
|
|
||||||
main#docs h1 { font-size: 40px; }
|
|
||||||
}
|
|
16
static/_redirects
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
/dataforge / #сайт dataforge 200
|
||||||
|
/dataforge/news / # сайт dataforge/news 200
|
||||||
|
|
||||||
|
/dataforge/docs/ / # 1... 200
|
||||||
|
/dataforge/docs/meta / # 2... 200
|
||||||
|
/dataforge/docs/framework / # 3... 200
|
||||||
|
/dataforge/docs/data_flow / # 4... 200
|
||||||
|
/dataforge/docs/envelopes / # 5... 200
|
||||||
|
/dataforge/docs/storage / # 6... 200
|
||||||
|
/dataforge/docs/control / # 7... 200
|
||||||
|
/dataforge/docs/extensions / # 8... 200
|
||||||
|
|
||||||
|
/dataforge/modules / # 200
|
||||||
|
/dataforge/releases / # 200
|
||||||
|
/dataforge/apps / # 200
|
||||||
|
/dataforge/misc / # 200
|
Before Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 12 KiB |
@ -1,196 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
|
||||||
<!-- Generated by Microsoft Visio, SVG Export meta.svg Page-1 -->
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events"
|
|
||||||
xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="4.59173in" height="5.27184in"
|
|
||||||
viewBox="0 0 330.605 379.573" xml:space="preserve" color-interpolation-filters="sRGB" class="st13">
|
|
||||||
<v:documentProperties v:langID="1033" v:metric="true" v:viewMarkup="false">
|
|
||||||
<v:userDefs>
|
|
||||||
<v:ud v:nameU="msvSubprocessMaster" v:prompt="" v:val="VT4(Rectangle)"/>
|
|
||||||
<v:ud v:nameU="msvNoAutoConnect" v:val="VT0(1):26"/>
|
|
||||||
</v:userDefs>
|
|
||||||
</v:documentProperties>
|
|
||||||
|
|
||||||
<style type="text/css">
|
|
||||||
<![CDATA[
|
|
||||||
.st1 {fill:#ffffff;stroke:#ed7d31;stroke-width:0.75}
|
|
||||||
.st2 {fill:#ed7d31;font-family:Calibri;font-size:0.833336em}
|
|
||||||
.st3 {visibility:visible}
|
|
||||||
.st4 {fill:#5b9bd5;fill-opacity:0.25;filter:url(#filter_2);stroke:#5b9bd5;stroke-opacity:0.25}
|
|
||||||
.st5 {fill:#4f87bb;stroke:#40709c;stroke-width:0.75}
|
|
||||||
.st6 {fill:#feffff;font-family:Calibri;font-size:0.833336em}
|
|
||||||
.st7 {marker-end:url(#mrkr4-27);stroke:#5b9bd5;stroke-linecap:round;stroke-linejoin:round;stroke-width:1}
|
|
||||||
.st8 {fill:#5b9bd5;fill-opacity:1;stroke:#5b9bd5;stroke-opacity:1;stroke-width:0.28409090909091}
|
|
||||||
.st9 {fill:url(#grad0-36);stroke:#61973d;stroke-width:0.75}
|
|
||||||
.st10 {fill:#61973d;font-family:Calibri;font-size:0.833336em}
|
|
||||||
.st11 {fill:#ffffff;stroke:#70ad47;stroke-width:0.75}
|
|
||||||
.st12 {fill:#70ad47;font-family:Calibri;font-size:0.833336em}
|
|
||||||
.st13 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3}
|
|
||||||
]]>
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<defs id="Patterns_And_Gradients">
|
|
||||||
<linearGradient id="grad0-36" x1="0" y1="0" x2="1" y2="0" gradientTransform="rotate(60 0.5 0.5)">
|
|
||||||
<stop offset="0" stop-color="#ebf1e8" stop-opacity="1"/>
|
|
||||||
<stop offset="0.24" stop-color="#f5f8f4" stop-opacity="1"/>
|
|
||||||
<stop offset="0.54" stop-color="#feffff" stop-opacity="1"/>
|
|
||||||
</linearGradient>
|
|
||||||
</defs>
|
|
||||||
<defs id="Markers">
|
|
||||||
<g id="lend4">
|
|
||||||
<path d="M 2 1 L 0 0 L 2 -1 L 2 1 " style="stroke:none"/>
|
|
||||||
</g>
|
|
||||||
<marker id="mrkr4-27" class="st8" v:arrowType="4" v:arrowSize="2" v:setback="7.04" refX="-7.04" orient="auto"
|
|
||||||
markerUnits="strokeWidth" overflow="visible">
|
|
||||||
<use xlink:href="#lend4" transform="scale(-3.52,-3.52) "/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<defs id="Filters">
|
|
||||||
<filter id="filter_2">
|
|
||||||
<feGaussianBlur stdDeviation="2"/>
|
|
||||||
</filter>
|
|
||||||
</defs>
|
|
||||||
<g v:mID="0" v:index="1" v:groupContext="foregroundPage">
|
|
||||||
<v:userDefs>
|
|
||||||
<v:ud v:nameU="msvThemeOrder" v:val="VT0(0):26"/>
|
|
||||||
</v:userDefs>
|
|
||||||
<title>Page-1</title>
|
|
||||||
<v:pageProperties v:drawingScale="0.0393701" v:pageScale="0.0393701" v:drawingUnits="24" v:shadowOffsetX="8.50394"
|
|
||||||
v:shadowOffsetY="-8.50394"/>
|
|
||||||
<v:layer v:name="Connector" v:index="0"/>
|
|
||||||
<g id="shape1-1" v:mID="1" v:groupContext="shape" transform="translate(18.75,-260.958)">
|
|
||||||
<title>Rectangle</title>
|
|
||||||
<desc>Meta</desc>
|
|
||||||
<v:userDefs>
|
|
||||||
<v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
|
|
||||||
</v:userDefs>
|
|
||||||
<v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
|
|
||||||
<v:textRect cx="42.5197" cy="365.399" width="85.04" height="28.3465"/>
|
|
||||||
<rect x="0" y="351.226" width="85.0394" height="28.3465" class="st1"/>
|
|
||||||
<text x="31.69" y="368.4" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>Meta</text> </g>
|
|
||||||
<g id="shape2-4" v:mID="2" v:groupContext="shape" transform="translate(139.222,-331.824)">
|
|
||||||
<title>Rectangle.2</title>
|
|
||||||
<desc>someValue</desc>
|
|
||||||
<v:userDefs>
|
|
||||||
<v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
|
|
||||||
</v:userDefs>
|
|
||||||
<v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
|
|
||||||
<v:textRect cx="42.5197" cy="365.399" width="85.04" height="28.3465"/>
|
|
||||||
<g id="shadow2-5" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
|
|
||||||
transform="matrix(1,0,0,1,0.345598,1.97279)" class="st3">
|
|
||||||
<rect x="0" y="351.226" width="85.0394" height="28.3465" class="st4"/>
|
|
||||||
</g>
|
|
||||||
<rect x="0" y="351.226" width="85.0394" height="28.3465" class="st5"/>
|
|
||||||
<text x="19.95" y="368.4" class="st6" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>someValue</text> </g>
|
|
||||||
<g id="shape3-10" v:mID="3" v:groupContext="shape" transform="translate(139.222,-303.477)">
|
|
||||||
<title>Rectangle.3</title>
|
|
||||||
<desc>otherValue[0]</desc>
|
|
||||||
<v:userDefs>
|
|
||||||
<v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
|
|
||||||
</v:userDefs>
|
|
||||||
<v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
|
|
||||||
<v:textRect cx="42.5197" cy="365.399" width="85.04" height="28.3465"/>
|
|
||||||
<g id="shadow3-11" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
|
|
||||||
transform="matrix(1,0,0,1,0.345598,1.97279)" class="st3">
|
|
||||||
<rect x="0" y="351.226" width="85.0394" height="28.3465" class="st4"/>
|
|
||||||
</g>
|
|
||||||
<rect x="0" y="351.226" width="85.0394" height="28.3465" class="st5"/>
|
|
||||||
<text x="14.26" y="368.4" class="st6" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>otherValue[0]</text> </g>
|
|
||||||
<g id="shape4-16" v:mID="4" v:groupContext="shape" transform="translate(223.845,-303.477)">
|
|
||||||
<title>Rectangle.4</title>
|
|
||||||
<desc>otherValue[1]</desc>
|
|
||||||
<v:userDefs>
|
|
||||||
<v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
|
|
||||||
</v:userDefs>
|
|
||||||
<v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
|
|
||||||
<v:textRect cx="42.5197" cy="365.399" width="85.04" height="28.3465"/>
|
|
||||||
<g id="shadow4-17" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
|
|
||||||
transform="matrix(1,0,0,1,0.345598,1.97279)" class="st3">
|
|
||||||
<rect x="0" y="351.226" width="85.0394" height="28.3465" class="st4"/>
|
|
||||||
</g>
|
|
||||||
<rect x="0" y="351.226" width="85.0394" height="28.3465" class="st5"/>
|
|
||||||
<text x="14.26" y="368.4" class="st6" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>otherValue[1]</text> </g>
|
|
||||||
<g id="shape5-22" v:mID="5" v:groupContext="shape" v:layerMember="0" transform="translate(61.2697,-289.304)">
|
|
||||||
<title>Dynamic connector</title>
|
|
||||||
<path d="M0 379.57 L0 322.88 L70.91 322.88" class="st7"/>
|
|
||||||
</g>
|
|
||||||
<g id="shape6-28" v:mID="6" v:groupContext="shape" v:layerMember="0" transform="translate(61.2697,-289.304)">
|
|
||||||
<title>Dynamic connector.6</title>
|
|
||||||
<path d="M0 379.57 L0 351.23 L70.91 351.23" class="st7"/>
|
|
||||||
</g>
|
|
||||||
<g id="shape7-33" v:mID="7" v:groupContext="shape" transform="translate(139.222,-210.101)">
|
|
||||||
<title>Rectangle.7</title>
|
|
||||||
<desc>childMeta[0]</desc>
|
|
||||||
<v:userDefs>
|
|
||||||
<v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
|
|
||||||
</v:userDefs>
|
|
||||||
<v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
|
|
||||||
<v:textRect cx="42.5197" cy="365.399" width="85.04" height="28.3465"/>
|
|
||||||
<rect x="0" y="351.226" width="85.0394" height="28.3465" class="st9"/>
|
|
||||||
<text x="16.42" y="368.4" class="st10" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>childMeta[0]</text> </g>
|
|
||||||
<g id="shape8-38" v:mID="8" v:groupContext="shape" transform="translate(139.222,-116.724)">
|
|
||||||
<title>Rectangle.8</title>
|
|
||||||
<desc>childValue</desc>
|
|
||||||
<v:userDefs>
|
|
||||||
<v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
|
|
||||||
</v:userDefs>
|
|
||||||
<v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
|
|
||||||
<v:textRect cx="42.5197" cy="365.399" width="85.04" height="28.3465"/>
|
|
||||||
<g id="shadow8-39" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
|
|
||||||
transform="matrix(1,0,0,1,0.345598,1.97279)" class="st3">
|
|
||||||
<rect x="0" y="351.226" width="85.0394" height="28.3465" class="st4"/>
|
|
||||||
</g>
|
|
||||||
<rect x="0" y="351.226" width="85.0394" height="28.3465" class="st5"/>
|
|
||||||
<text x="21.36" y="368.4" class="st6" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>childValue</text> </g>
|
|
||||||
<g id="shape9-44" v:mID="9" v:groupContext="shape" transform="translate(223.845,-116.724)">
|
|
||||||
<title>Rectangle.9</title>
|
|
||||||
<desc>grandChild</desc>
|
|
||||||
<v:userDefs>
|
|
||||||
<v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
|
|
||||||
</v:userDefs>
|
|
||||||
<v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
|
|
||||||
<v:textRect cx="42.5197" cy="365.399" width="85.04" height="28.3465"/>
|
|
||||||
<rect x="0" y="351.226" width="85.0394" height="28.3465" class="st11"/>
|
|
||||||
<text x="20.56" y="368.4" class="st12" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>grandChild</text> </g>
|
|
||||||
<g id="shape10-47" v:mID="10" v:groupContext="shape" transform="translate(223.845,-210.101)">
|
|
||||||
<title>Rectangle.10</title>
|
|
||||||
<desc>childMeta[1]</desc>
|
|
||||||
<v:userDefs>
|
|
||||||
<v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
|
|
||||||
</v:userDefs>
|
|
||||||
<v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
|
|
||||||
<v:textRect cx="42.5197" cy="365.399" width="85.04" height="28.3465"/>
|
|
||||||
<rect x="0" y="351.226" width="85.0394" height="28.3465" class="st9"/>
|
|
||||||
<text x="16.42" y="368.4" class="st10" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>childMeta[1]</text> </g>
|
|
||||||
<g id="shape11-51" v:mID="11" v:groupContext="shape" v:layerMember="0" transform="translate(61.2697,-260.958)">
|
|
||||||
<title>Dynamic connector.11</title>
|
|
||||||
<path d="M0 379.57 L0 416.26 L70.91 416.26" class="st7"/>
|
|
||||||
</g>
|
|
||||||
<g id="shape12-56" v:mID="12" v:groupContext="shape" v:layerMember="0" transform="translate(174.656,-210.101)">
|
|
||||||
<title>Dynamic connector.12</title>
|
|
||||||
<path d="M7.09 379.57 L7.09 437.56" class="st7"/>
|
|
||||||
</g>
|
|
||||||
<g id="shape13-61" v:mID="13" v:groupContext="shape" v:layerMember="0" transform="translate(259.278,-210.101)">
|
|
||||||
<title>Dynamic connector.13</title>
|
|
||||||
<path d="M7.09 379.57 L7.09 437.56" class="st7"/>
|
|
||||||
</g>
|
|
||||||
<g id="shape14-66" v:mID="14" v:groupContext="shape" transform="translate(223.845,-23.3478)">
|
|
||||||
<title>Rectangle.14</title>
|
|
||||||
<desc>grandChildValue</desc>
|
|
||||||
<v:userDefs>
|
|
||||||
<v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
|
|
||||||
</v:userDefs>
|
|
||||||
<v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
|
|
||||||
<v:textRect cx="42.5197" cy="365.399" width="85.04" height="28.3465"/>
|
|
||||||
<g id="shadow14-67" v:groupContext="shadow" v:shadowOffsetX="0.345598" v:shadowOffsetY="-1.97279" v:shadowType="1"
|
|
||||||
transform="matrix(1,0,0,1,0.345598,1.97279)" class="st3">
|
|
||||||
<rect x="0" y="351.226" width="85.0394" height="28.3465" class="st4"/>
|
|
||||||
</g>
|
|
||||||
<rect x="0" y="351.226" width="85.0394" height="28.3465" class="st5"/>
|
|
||||||
<text x="9.06" y="368.4" class="st6" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>grandChildValue</text> </g>
|
|
||||||
<g id="shape15-72" v:mID="15" v:groupContext="shape" v:layerMember="0" transform="translate(259.278,-116.724)">
|
|
||||||
<title>Dynamic connector.15</title>
|
|
||||||
<path d="M7.09 379.57 L7.09 437.56" class="st7"/>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 29 KiB |
Before Width: | Height: | Size: 20 KiB |
@ -1,100 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
|
||||||
<!-- Generated by Microsoft Visio, SVG Export naming.svg Page-1 -->
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
|
|
||||||
xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="8.60048in" height="2.35953in"
|
|
||||||
viewBox="0 0 619.235 169.886" xml:space="preserve" color-interpolation-filters="sRGB" class="st9">
|
|
||||||
<v:documentProperties v:langID="1033" v:metric="true" v:viewMarkup="false">
|
|
||||||
<v:userDefs>
|
|
||||||
<v:ud v:nameU="msvSubprocessMaster" v:prompt="" v:val="VT4(Rectangle)"/>
|
|
||||||
<v:ud v:nameU="msvNoAutoConnect" v:val="VT0(1):26"/>
|
|
||||||
</v:userDefs>
|
|
||||||
</v:documentProperties>
|
|
||||||
|
|
||||||
<style type="text/css">
|
|
||||||
<![CDATA[
|
|
||||||
.st1 {fill:none;stroke:none;stroke-width:0.25}
|
|
||||||
.st2 {fill:#5b9bd5;font-family:Calibri;font-size:1.5em}
|
|
||||||
.st3 {stroke:#5b9bd5;stroke-linecap:round;stroke-linejoin:round;stroke-width:1}
|
|
||||||
.st4 {fill:#ffffff;stroke:none;stroke-linecap:butt;stroke-width:7.2}
|
|
||||||
.st5 {fill:#4f87bb;font-family:Calibri;font-size:1.00001em}
|
|
||||||
.st6 {fill:#5b9bd5;font-family:Calibri;font-size:1.00001em}
|
|
||||||
.st7 {marker-end:url(#mrkr4-22);stroke:#5b9bd5;stroke-linecap:round;stroke-linejoin:round;stroke-width:1}
|
|
||||||
.st8 {fill:#5b9bd5;fill-opacity:1;stroke:#5b9bd5;stroke-opacity:1;stroke-width:0.28409090909091}
|
|
||||||
.st9 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3}
|
|
||||||
]]>
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<defs id="Markers">
|
|
||||||
<g id="lend4">
|
|
||||||
<path d="M 2 1 L 0 0 L 2 -1 L 2 1 " style="stroke:none"/>
|
|
||||||
</g>
|
|
||||||
<marker id="mrkr4-22" class="st8" v:arrowType="4" v:arrowSize="2" v:setback="7.04" refX="-7.04" orient="auto"
|
|
||||||
markerUnits="strokeWidth" overflow="visible">
|
|
||||||
<use xlink:href="#lend4" transform="scale(-3.52,-3.52) "/>
|
|
||||||
</marker>
|
|
||||||
</defs>
|
|
||||||
<g v:mID="0" v:index="1" v:groupContext="foregroundPage">
|
|
||||||
<v:userDefs>
|
|
||||||
<v:ud v:nameU="msvThemeOrder" v:val="VT0(0):26"/>
|
|
||||||
</v:userDefs>
|
|
||||||
<title>Page-1</title>
|
|
||||||
<v:pageProperties v:drawingScale="0.0393701" v:pageScale="0.0393701" v:drawingUnits="24" v:shadowOffsetX="8.50394"
|
|
||||||
v:shadowOffsetY="-8.50394"/>
|
|
||||||
<v:layer v:name="Connector" v:index="0"/>
|
|
||||||
<g id="shape1-1" v:mID="1" v:groupContext="shape" transform="translate(18.25,-67.9383)">
|
|
||||||
<title>Sheet.1</title>
|
|
||||||
<desc>target::my.strange[2].path/otherTarget::simplePath/something</desc>
|
|
||||||
<v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
|
|
||||||
<v:textRect cx="291.367" cy="159.886" width="582.74" height="20"/>
|
|
||||||
<rect x="0" y="149.886" width="582.735" height="20" class="st1"/>
|
|
||||||
<text x="59.37" y="165.29" class="st2" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>target::my.strange[2].path/otherTarget::simplePath/something</text> </g>
|
|
||||||
<g id="shape2-4" v:mID="2" v:groupContext="shape" transform="translate(269.331,271.833) rotate(180)">
|
|
||||||
<title>Bracket</title>
|
|
||||||
<desc>segment</desc>
|
|
||||||
<v:userDefs>
|
|
||||||
<v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
|
|
||||||
</v:userDefs>
|
|
||||||
<v:textBlock v:margins="rect(1,3,1,1)" v:tabSpace="42.5197"/>
|
|
||||||
<v:textRect cx="113.386" cy="155.713" width="70.87" height="70.8661" transform="rotate(180)"/>
|
|
||||||
<path d="M0 169.89 A4.01075 4.01075 0 0 1 3.54 166.34 L94.47 166.34 A4.01075 4.01075 -180 0 0 98.01 162.8 A4.01075 4.01075
|
|
||||||
-180 0 0 101.55 166.34 L189.05 166.34 A4.01075 4.01075 0 0 1 192.59 169.89" class="st3"/>
|
|
||||||
<rect v:rectContext="textBkgnd" x="-123.147" y="-162.913" width="42.1938" height="14.4001" transform="rotate(180)"
|
|
||||||
class="st4"/>
|
|
||||||
<text x="-123.15" y="-152.11" transform="rotate(180)" class="st5" v:langID="1033"><v:paragraph v:horizAlign="2"/><v:tabList/>segment</text> </g>
|
|
||||||
<g id="shape5-9" v:mID="5" v:groupContext="shape" transform="translate(132.601,-87.9383)">
|
|
||||||
<title>Bracket.5</title>
|
|
||||||
<desc>name</desc>
|
|
||||||
<v:userDefs>
|
|
||||||
<v:ud v:nameU="visVersion" v:val="VT0(15):26"/>
|
|
||||||
</v:userDefs>
|
|
||||||
<v:textBlock v:margins="rect(1,3,1,1)" v:tabSpace="42.5197"/>
|
|
||||||
<v:textRect cx="54.7602" cy="155.713" width="70.87" height="70.8661"/>
|
|
||||||
<path d="M0 169.89 A4.01075 4.01075 0 0 1 3.54 166.34 L68.59 166.34 A4.01075 4.01075 -180 0 0 72.13 162.8 A4.01075 4.01075
|
|
||||||
-180 0 0 75.67 166.34 L138.19 166.34 A4.01075 4.01075 0 0 1 141.73 169.89" class="st3"/>
|
|
||||||
<rect v:rectContext="textBkgnd" x="59.5835" y="148.512" width="27.6097" height="14.4001" class="st4"/>
|
|
||||||
<text x="59.58" y="159.31" class="st5" v:langID="1033"><v:paragraph v:horizAlign="2"/><v:tabList/>name</text> </g>
|
|
||||||
<g id="shape11-14" v:mID="11" v:groupContext="shape" transform="translate(269.331,-131.636)">
|
|
||||||
<title>Sheet.11</title>
|
|
||||||
<desc>target</desc>
|
|
||||||
<v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
|
|
||||||
<v:textRect cx="76" cy="159.886" width="152" height="20"/>
|
|
||||||
<rect x="0" y="149.886" width="152" height="20" class="st1"/>
|
|
||||||
<text x="61.21" y="163.49" class="st6" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>target</text> </g>
|
|
||||||
<g id="shape13-17" v:mID="13" v:groupContext="shape" v:layerMember="0" transform="translate(340.197,-131.636)">
|
|
||||||
<title>Dynamic connector</title>
|
|
||||||
<path d="M0 169.89 L-24.52 207.68" class="st7"/>
|
|
||||||
</g>
|
|
||||||
<g id="shape14-23" v:mID="14" v:groupContext="shape" transform="translate(411.063,-18.25)">
|
|
||||||
<title>Sheet.14</title>
|
|
||||||
<desc>default target</desc>
|
|
||||||
<v:textBlock v:margins="rect(4,4,4,4)" v:tabSpace="42.5197"/>
|
|
||||||
<v:textRect cx="76" cy="159.886" width="152" height="20"/>
|
|
||||||
<rect x="0" y="149.886" width="152" height="20" class="st1"/>
|
|
||||||
<text x="42.47" y="163.49" class="st6" v:langID="1033"><v:paragraph v:horizAlign="1"/><v:tabList/>default target</text> </g>
|
|
||||||
<g id="shape16-26" v:mID="16" v:groupContext="shape" v:layerMember="0" transform="translate(481.929,-38.25)">
|
|
||||||
<title>Dynamic connector.16</title>
|
|
||||||
<path d="M0 169.89 L-11.14 146.55" class="st7"/>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 5.8 KiB |
Before Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 16 KiB |