From b4f7613f81f673b928eeecc0aa81420aaaf94eb4 Mon Sep 17 00:00:00 2001 From: Christian Thaeter Date: Thu, 10 Mar 2011 00:58:11 +0100 Subject: [PATCH 1/9] Asciidoced documentation for rfc.sh and put it into the docs --- admin/rfc.sh | 113 +++++++++++++++++++--------------- doc/technical/infra/index.txt | 2 +- doc/technical/infra/rfcsh.txt | 73 ++++++++++++++++++++++ 3 files changed, 138 insertions(+), 50 deletions(-) create mode 100644 doc/technical/infra/rfcsh.txt diff --git a/admin/rfc.sh b/admin/rfc.sh index 06f050613..0c2c37338 100755 --- a/admin/rfc.sh +++ b/admin/rfc.sh @@ -4,64 +4,79 @@ shopt -s extglob function usage() { - less <<"EOF" -Script to maintain Lumiera RFC's + less -F <<"EOF" +Lumiera RFC maintenance script +============================== + +// Note: the source of this documentation is maintained +// directly admin/rfc.sh in its usage() function +// edit it only there and then regenerate +// doc/devel/technical/infra/ with: +// ./admin/rfc.sh help >doc/technical/infra/rfcsh.txt + +Usage +----- -usage: ./admin/rfc.sh [options] -options: - title - Quoted string used as RFC title - rfc - Name of the RFC, smart matched, unique - rfcs - Name of the RFC, smart matched, multiple - regex - Regex matched against the content of a RFC - chapter - Heading of a section +Commands (with and [optional] parameters) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -commands (with and [optional] parameters): - find [regex] - List all matching RFC's (matching 'regex') - show [regex] - Read RFC's (matching 'regex') - create - Create a new RFC - edit <rfc> [chapter] - Edit RFC at chapter - asciidoc <rfc> - pass the rfc.txt to 'asciidoc' command - comment <rfc> - Add a new comment to a RFC - draft <rfc> - Change RFC to Draft state - final <rfc> - Change RFC to Final state - park <rfc> - Change RFC to Parked state - drop <rfc> - Change RFC to Dropped state - supersede <rfc> <new> - Supersede RFC with a new RFC - discard <rfc> - Delete an RFC - help - Show this help - process - Do automatic maintenance work - wrap <rfcs> - canonical reformatting + find <rfcs> [regex]:: List all matching RFC's (matching `regex`) + show <rfcs> [regex]:: Read RFC's (matching `regex`) + create <title>:: Create a new RFC + edit <rfc> [chapter]:: Edit RFC at chapter + asciidoc <rfc>:: pass the rfc.txt to `asciidoc` command + comment <rfc>:: Add a new comment to a RFC + draft <rfc>:: Change RFC to Draft state + final <rfc>:: Change RFC to Final state + park <rfc>:: Change RFC to Parked state + drop <rfc>:: Change RFC to Dropped state + supersede <rfc> <new>:: Supersede RFC with a new RFC + discard <rfc>:: Delete an RFC + help:: Show this help + process:: Do automatic maintenance work + wrap <rfcs>:: canonical reformatting -Smart matching: - RFC names don't need to be given exactly, they use a globbing pattern. - This is: - - case insensitive - - whitespaces are ignored - - '*' stands for any number of parameters - - '?' is any single character - - when starting with '/' they are matched against the begin of the name - - some regex operators work too - 'find' and 'show' can operate on many matches so the given rfc name doesn't - need to be unique. The other commands will complain when the RFC name given - doesn't resolve to one unique RFC. +Option types +~~~~~~~~~~~~ -Notes: - When less presents multiple files one can go forth and back with the ':n' - and ':p' commands. + title:: Quoted string used as RFC title + rfc:: Name of the RFC, smart matched, unique + rfcs:: Name of the RFC, smart matched, multiple + regex:: Regex matched against the content of a RFC + chapter:: Heading of a section - The tile for 'create' should be a normal document title. Possibly quoted - since it may contain spaces and not too long. The filename is this title - in CamelCase with all spaces and special characters removed. - Chapter machching single lines containing this word, special asciidoc - comments in the form '//word:.*' and asciidoc block attributes '[word.*]' - on a single line. When a chapter pattern is not unique, the last one is - picked. +Smart matching +-------------- - rfc.sh executes git add/rm/mv commands, but never commits. One should do a - commit as soon he finished editing. +RFC names don't need to be given exactly, they use a globbing pattern. +This is: + - case insensitive + - whitespaces are ignored + - `*` stands for any number of parameters + - `?` is any single character + - when starting with `/` they are matched against the begin of the name + - some regex operators work too +`find` and `show` can operate on many matches so the given rfc name doesn't +need to be unique. The other commands will complain when the RFC name given +doesn't resolve to one unique RFC. + +When `less` presents multiple files one can go forth and back with the `:n` +and `:p` commands. + +The tile for `create` should be a normal document title. Possibly quoted +since it may contain spaces and not too long. The filename is this title +in CamelCase with all spaces and special characters removed. + +Chapter machching single lines containing this word, special asciidoc +comments in the form `//word:.*` and asciidoc block attributes `[word.*]` +on a single line. When a chapter pattern is not unique, the last one is +picked. + +rfc.sh executes git add/rm/mv commands, but never commits. One should do a +commit as soon he finished editing. EOF } diff --git a/doc/technical/infra/index.txt b/doc/technical/infra/index.txt index f1c903af9..0f677e635 100644 --- a/doc/technical/infra/index.txt +++ b/doc/technical/infra/index.txt @@ -8,6 +8,6 @@ used for building and maintaining documentation and website. * see link:../build/index.html[separate page for the Buildsystem] * generating the link:MenuGen.html[navigation menu] for the website - + * how to use the link:rfcsh.html[rfc.sh] script for maintaining RFC's diff --git a/doc/technical/infra/rfcsh.txt b/doc/technical/infra/rfcsh.txt new file mode 100644 index 000000000..40732fed2 --- /dev/null +++ b/doc/technical/infra/rfcsh.txt @@ -0,0 +1,73 @@ +Lumiera RFC maintenance script +============================== + +// Note: the source of this documentation is maintained +// directly admin/rfc.sh in its usage() function +// edit it only there and then regenerate +// doc/devel/technical/infra/ with: +// ./admin/rfc.sh help >doc/technical/infra/rfcsh.txt + +Usage +----- + + ./admin/rfc.sh <command> [options] + +Commands (with <mandatory> and [optional] parameters) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + find <rfcs> [regex]:: List all matching RFC's (matching `regex`) + show <rfcs> [regex]:: Read RFC's (matching `regex`) + create <title>:: Create a new RFC + edit <rfc> [chapter]:: Edit RFC at chapter + asciidoc <rfc>:: pass the rfc.txt to `asciidoc` command + comment <rfc>:: Add a new comment to a RFC + draft <rfc>:: Change RFC to Draft state + final <rfc>:: Change RFC to Final state + park <rfc>:: Change RFC to Parked state + drop <rfc>:: Change RFC to Dropped state + supersede <rfc> <new>:: Supersede RFC with a new RFC + discard <rfc>:: Delete an RFC + help:: Show this help + process:: Do automatic maintenance work + wrap <rfcs>:: canonical reformatting + +Option types +~~~~~~~~~~~~ + + title:: Quoted string used as RFC title + rfc:: Name of the RFC, smart matched, unique + rfcs:: Name of the RFC, smart matched, multiple + regex:: Regex matched against the content of a RFC + chapter:: Heading of a section + + +Smart matching +-------------- + +RFC names don't need to be given exactly, they use a globbing pattern. +This is: + - case insensitive + - whitespaces are ignored + - `*` stands for any number of parameters + - `?` is any single character + - when starting with `/` they are matched against the begin of the name + - some regex operators work too +`find` and `show` can operate on many matches so the given rfc name doesn't +need to be unique. The other commands will complain when the RFC name given +doesn't resolve to one unique RFC. + +When `less` presents multiple files one can go forth and back with the `:n` +and `:p` commands. + +The tile for `create` should be a normal document title. Possibly quoted +since it may contain spaces and not too long. The filename is this title +in CamelCase with all spaces and special characters removed. + +Chapter machching single lines containing this word, special asciidoc +comments in the form `//word:.*` and asciidoc block attributes `[word.*]` +on a single line. When a chapter pattern is not unique, the last one is +picked. + +rfc.sh executes git add/rm/mv commands, but never commits. One should do a +commit as soon he finished editing. + From 7e17839c911d7b330966b961aacaef54ee545e8a Mon Sep 17 00:00:00 2001 From: Christian Thaeter <ct@pipapo.org> Date: Thu, 10 Mar 2011 01:31:44 +0100 Subject: [PATCH 2/9] Add some short description about the tools and scripts in the ./admin dir --- doc/technical/infra/index.txt | 58 +++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/doc/technical/infra/index.txt b/doc/technical/infra/index.txt index 0f677e635..a47abbf95 100644 --- a/doc/technical/infra/index.txt +++ b/doc/technical/infra/index.txt @@ -11,3 +11,61 @@ used for building and maintaining documentation and website. * how to use the link:rfcsh.html[rfc.sh] script for maintaining RFC's + +Other tools in the ./admin folder +--------------------------------- + +There are various other small tools and scripts in the admin folder which are +not yet fully documented (Read the Source!). + +.headercheck +This is a small tool which checks that all headers are sufficiently standalone +and include anything they need. In future we might extend this to find out +bogus includes by predefining (-D) headerguards they include, effectively +disableing this include for a test. + +.render_icon.py +used by the buildsystem to translate svg icons to bitmaps (png) + +.treeinfo.sh +Generates a report about the projects directory structure by parsing the +DIR_INFO files (which have to be maintained manually) + +A DIR_INFO is just a small text file where the first line shall give a short +summary about the purpose of this directory followed by arbitary text giving +more details. + +.git_hooks +A directory containing example git hooks for signing and pushing on commit. +Only use them when you know what you are doing. + +.lumiera_c_skeleton +A script which instantiates a new pair of .c/.h files. + +.vg-run.sh +convenience wrapper script to run an executable with valgrind +using "typical options"; output goes to a logfile, which is +fed to less afterwards. + +A valgrind suppression file is generated automatically, in +case there is an executable "vgsuppression" located in the same +directory as the target executable. + +.gnu-indent +call the "indent" tool with parameters suitable for our (GNU derrived) coding style + +.testrunner +Script driving make and running a test, possibly under valgrind. Works only +for autotools build. + +.vgsuppression_gen.sh +Use an existing 'vgsupression' executable to generate a valgrind supression file. + +Bitrot +------ + +Scripts which are not in use and need some makeover to be removed + + testfilter.sh + rsync_docs_to_lumieraorg.sh + From 5bb9250ddb649413003edcbced11ccbcc52ae589 Mon Sep 17 00:00:00 2001 From: Ichthyostega <prg@ichthyostega.de> Date: Sun, 13 Mar 2011 08:35:04 +0100 Subject: [PATCH 3/9] page to document the debian packaging and depot management --- doc/technical/infra/debianDepot.txt | 98 +++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 doc/technical/infra/debianDepot.txt diff --git a/doc/technical/infra/debianDepot.txt b/doc/technical/infra/debianDepot.txt new file mode 100644 index 000000000..555b0956f --- /dev/null +++ b/doc/technical/infra/debianDepot.txt @@ -0,0 +1,98 @@ +Lumiera Debian Package and Depot maintainance +============================================= +:Author: Hermann Voßeler deb@ichthyostega.de +:Date: 3/2011 + +//Menu: label Debian Depot + +This Debian-Depot is part of the Lumiera build infrastructure. +It is managed automatically, based on the link:http://mirrorer.alioth.debian.org/[reprepro] tool by Bernhard Link + +WARNING: Page under construction + +The Lumiera debian package +-------------------------- +As our whole infrastructure relies heavily on the Git version management tool, it's only natural +also to organise the (debian) packaging with the help of Git. Fortunatlely, there is a nifty tool +called link:https://honk.sigxcpu.org/piki/projects/git-buildpackage/[git-buildpackage], written +by Guido Günther exactly for this purpuse: It treats the _debianisation_ as a branch in the +Git repository, forking off the mainline at the release point. + +For Lumiera, this _debianisation branch_ is called 'deb' and can be found in the +link:http://git.lumiera.org/gitweb?p=lumiera/debian;a=summary[git:/git.lumiera.org/lumiera/debian] repository. + +To (re)build the debian package + +. +git clone git:/git.lumiera.org/lumiera/debian+ +. +mkdir pack.deb+ +. +cd debian+ +. +git-buildpackage --git-upstream-branch=+_RELEASE-TAG_ + +-- here _RELEASE-TAG_ denotes the point in the Git history, which should become +the reference source and be packaged into the *.orig.tar.gz. Usually, it's just +sufficient to use 'master' for that purpose. + + +Debian-Depot for installation via Apt +------------------------------------- +While it is easy just to build a debian package and then install it locally through ++dpkg -i+, if we want to support automated installation and upgrades using the Apt +package manager, we need to build up more infrastructure. The primary reason is that +for any source package, a multitude of binary packages might be built for different +architectures; moreover, we want to support several different distributions. +For this purpose,the Apt package manager requires a precisely defined folder structure, +accessible online via 'http:' or 'ftp:'. For maintaining this folder structure, there +are three concievable levels of complexy: + +minimal layout, manual maintainance:: + place everything in a single directory accessible online. Use only one pseudo-distribution + and call the (single) component \'.\' -- just dump packages into the directory and update + the packages list + +multiple distributions and components, pool directory:: + this setup is already a full-blown debian depot, just there are some limitations + on the flexibility: there might be only _one_ version of each package per distribution, + and all different distributions use a shared pool (and thus require different packages + to be labeled stringently) + +major distribution or mirror site:: + similar to the above, this is a complete debian depot, but it is backed by a database + and allows for much more flexible configuration and is highly automated. + + +For Lumiera, it seems the middle option is the right choice: while it still keeps the +infrastructure simple, it allows for multiple _distributions_ (Debian/stable, Ubuntu....) +and multiple _components_ (experimental, development, release). The mentioned 'reprepro' +tool provides this degree of functionality: Basically, this is a fixed directory structure +with some control files; the frontent is a commandline tool with a plethora of options +and quite some automation- and extension hooks. Internally, it uses an embedded BerkelyDB. + +Using 'reprepro', existing source, binary or comined packages can be _added_ (imported) +into the structure with a single command; the files comprising the package are then +added automatically to the pool directory and all the indices, directories and GPG +signatures are created and updated automatically. Previous versions of the same +package are purged, when not needed by any existing package anymore + +NOTE: *todo* show an configuraion example and list the most common handling commands + +Configuration +~~~~~~~~~~~~~ +The current configuration and the state of the Debian Depot index files is tracked +is a separate branch in the +link:http://git.lumiera.org/gitweb?p=lumiera/debian;a=shortlog;h=refs/heads/depot[lumiera/debian] +repository. (Note: this is a somewhat unconventional setup, insofar the 'depot' branch tracks +a directory tree completely separete from the main lumiera source tree tracked by the deb branch; +I choose this layout because of the marginal relevance of this depot management; I just didn't +want to create _yet another not so useful Git repository..._) + + * primary link:http://git.lumiera.org/gitweb?p=lumiera/debian;a=blob;f=conf/distributions;hb=refs/heads/depot[configuration] + * Logfile of imports: link:http://git.lumiera.org/gitweb?p=lumiera/debian;a=blob;f=log/lenny.log;hb=refs/heads/depot[for Lenny] + +current setup 3/2011 +^^^^^^^^^^^^^^^^^^^^ +While later we want to automate most of this packaging business, currently it's done semi-manual. +Mostly, Ichthyo builds the packages on his local PC (or a VM) and then adds/imports them to the +'reprepro' -- changes are then propagated to lumiera.org via rsync; as kind of a backup, the +index files are also pushed to Git. + + From 5e4d3a3ca08b2e7b10beab040afa3b906ca4ae18 Mon Sep 17 00:00:00 2001 From: Ichthyostega <prg@ichthyostega.de> Date: Mon, 14 Mar 2011 02:24:49 +0100 Subject: [PATCH 4/9] tutorial for building from a debian source package Signed-off-by: Ichthyostega <prg@ichthyostega.de> --- doc/user/tutorials/DebianBuilding.txt | 88 +++++++++++++++++++++++++++ doc/user/tutorials/index.txt | 3 + 2 files changed, 91 insertions(+) create mode 100644 doc/user/tutorials/DebianBuilding.txt diff --git a/doc/user/tutorials/DebianBuilding.txt b/doc/user/tutorials/DebianBuilding.txt new file mode 100644 index 000000000..1409e7b1a --- /dev/null +++ b/doc/user/tutorials/DebianBuilding.txt @@ -0,0 +1,88 @@ +building from source -- the Debian Way +====================================== +:Author: Ichthyostega +:Date: 3/2011 + +When you're using a Debian-based system (e.g. Ubuntu), instead of compiling +Lumiera from source in the classical (hard) way, you might prefer building +from the Debian source package. + +Why -- what are the benefits? + + * rely on the Debian/Ubuntu package manager for sorting out the library + and build dependencies + * install Lumiera as a first-class package, like all the other software + you're using regularily. This way, the package manager ``knows'' about + the library dependencies and can't mix up things due to a system upgrade. + +Under some circumstances, these very benefits might be a drawback, though. +Sometimes you don't want to install; or you might have a version of Lumiera +installed, but want to try out a (maybe newer / development) version... + +No problem -- basically it's allways possible to run Lumiera _without installation._ +It is deliberately made such as to find its components actively, within the standard +directory structure created by the buildsystem. While, thus, Lumiera can be just +run directly from such a folder tree, the software still relies on some other +libraries, which somehow need to be installed on your system. + + +anatomy of a debian source package +---------------------------------- + +NOTE: to be written.... give a short summary of the parts making up such a package + + +building from source package +---------------------------- +Generally speaking, operations which _modify_ the installation/configuration of your +linux system require root permissions. To the contrary, just _building_ a package +should _not_ be done as root. + +. add a suitable source line to your *Apt configuration* ('/etc/apt/sources.lst') ++ +---- +deb-src http://lumiera.org/debian/ lenny experimental +---- +. get all the *build dependencies* ++ +---- +sudo apt-get build-dep nobug-dev +sudo apt-get build-dep libgdl-lum-dev +sudo apt-get build-dep lumiera +---- +. *build* using the source package. ++ +---- +apt-get source --compile nobug-dev +---- + + * After building went through without error, it might happen that you're be + prompted for signing with your GPG key. But because you're not going to upload + the created binary packages anywhere, this step can be considered optional. + + * installing the created package. ++ +Finally, you'll find several new +*.deb+ packages in the directory where you started +the build. You need to _install_ these packages then using the basic debian package +manager 'dpkg' ++ +---- +sudo dpkg -i libnobug2_201008.1-1_i386.deb nobug-dev_201008.1-1_i386.deb +---- ++ +of course, the package names, versions and architecture will vary, depending on your +situation. + + * repeat those steps to work your way up to the +lumiera+ package; build and install + Nobug, build and install libgdl-lum and finally build and install Lumiera + +. clean up. ++ +You can delete the source tree used for compiling. If you never intend to +re-install the package, you could also delete the created package and source packge +components after installing it. But especially when trying out development versions +it might be a good idea to file those packages somewhere, as we're not keeping _every_ +package in the online Lumiera debian depot. While every package could be reproduced +exactly with a bit of Git knowledge, just keeping the +*.deb+ might be more convenient. + + diff --git a/doc/user/tutorials/index.txt b/doc/user/tutorials/index.txt index d8f4fd075..f878cf4bc 100644 --- a/doc/user/tutorials/index.txt +++ b/doc/user/tutorials/index.txt @@ -1,7 +1,10 @@ Tutorials ========= +//Menu: sort children + This page contains tutorials for beginners interested in Lumiera development. * link:building.html[Building Lumiera from source] + * link:DebianBuilding.html[Building from Debian source package] * link:contributing.html[Contributing to Lumiera] From 90caeaee6c87bada1a903263a0dc9ad7603026f5 Mon Sep 17 00:00:00 2001 From: Ichthyostega <prg@ichthyostega.de> Date: Mon, 28 Mar 2011 04:02:27 +0200 Subject: [PATCH 5/9] Create new section for architecture design docs Signed-off-by: Ichthyostega <prg@ichthyostega.de> --- .../architecture/ArchitectureSummary.txt | 34 +++++++++++++++++++ doc/design/architecture/index.txt | 13 +++++++ doc/design/index.txt | 9 +++++ 3 files changed, 56 insertions(+) create mode 100644 doc/design/architecture/ArchitectureSummary.txt create mode 100644 doc/design/architecture/index.txt diff --git a/doc/design/architecture/ArchitectureSummary.txt b/doc/design/architecture/ArchitectureSummary.txt new file mode 100644 index 000000000..c8ceff2af --- /dev/null +++ b/doc/design/architecture/ArchitectureSummary.txt @@ -0,0 +1,34 @@ +Lumiera Architecture: Executive Summary +======================================= +:Author: Hermann Voßeler +:Email: <Ichthyostega@web.de> +:Date: Sept 2010 + +.Three Layers +Besides the (obvious) separation in GUI frontend and render engine, editing core and application logic +are treated separately. Besides enforcing clearly defined interfaces, the ability for script driven +``headless'' operation and extensibility by plug-ins are deeply rooted in the overall design. + +.Strong Separation +High-level and low-level realm remain cleanly separated, relying on a compiler-like translation mechanism. +This way, each part can be optimised for its purpose. The GUI exposes a feature-rich session model close +to the problem domain, while the engine operates on a performance optimised render nodes graph. + +.Scheduling Micro Operations +High performance calculations in the engine are organised as micro tasks to be scheduled, +allowing for adaptation to current and future hardware, expected to operate increasingly parallelised. + +.Intelligent IO +The engine is backed by an sophisticated frame cache and self adjusting I/O manager for maximising throughput +and bandwidth use. + +.Stream Type System +Instead of relying on a single media framework, data streams are abstracted and classified, allowing to +handle most wiring, detection of possible connections and conversion automatically. + +.Rules Based Configuration +Rather than driven by hard wired default behaviour or tedious manual operation, control flow is guided by +a set of rules shaped configuration, which scales better to large and complicated projects. Queries are +issued at decision points, allowing to build up a work environment customised and tailored for the needs +of specific projects. + diff --git a/doc/design/architecture/index.txt b/doc/design/architecture/index.txt new file mode 100644 index 000000000..0d6996b8e --- /dev/null +++ b/doc/design/architecture/index.txt @@ -0,0 +1,13 @@ +Design Documents: Lumiera Architecture +====================================== + +This section will feature some rather high-level considerations regarding +the architecture of the application. + +.Executive Summary +See link:ArchitectureSummary.html[here] for a short summary of the core architecture +ideas of the envisioned Lumiera Application. + + + + diff --git a/doc/design/index.txt b/doc/design/index.txt index 8ff8a6a22..1b8114d54 100644 --- a/doc/design/index.txt +++ b/doc/design/index.txt @@ -1,6 +1,15 @@ Lumiera Design Documents ======================== +// Menu : prepend child design/backend +// Menu : prepend child engine +// Menu : prepend child model +// Menu : prepend child design/gui +// Menu : prepend child architecture + +// Menu : append child plugins +// Menu : append child workflow + The goal of Lumiera is to provide a professional tool for video editing on GNU/Linux systems. The vision of the development team defines a modern design for the core of a Non-Linear Editing software. One of the key aspect of Lumiera From ef4545bc55e906bfcf844f557f602bc5d886a4bf Mon Sep 17 00:00:00 2001 From: Ichthyostega <prg@ichthyostega.de> Date: Mon, 28 Mar 2011 07:01:12 +0200 Subject: [PATCH 6/9] augment the debian packaging and repository documentation --- doc/technical/infra/MenuGen.txt | 1 + doc/technical/infra/debianDepot.txt | 38 +++++++- doc/user/tutorials/DebianBuilding.txt | 128 ++++++++++++++++++++++++-- 3 files changed, 154 insertions(+), 13 deletions(-) diff --git a/doc/technical/infra/MenuGen.txt b/doc/technical/infra/MenuGen.txt index 7691f8528..060f178e4 100644 --- a/doc/technical/infra/MenuGen.txt +++ b/doc/technical/infra/MenuGen.txt @@ -204,6 +204,7 @@ supported placement directives commandline options ^^^^^^^^^^^^^^^^^^^ The behaviour of the +menugen+ script can be influenced by some options: + predefined:: using the built-in predefined nodes scan:: discover nodes debug:: dump data structure after discovery diff --git a/doc/technical/infra/debianDepot.txt b/doc/technical/infra/debianDepot.txt index 555b0956f..f599950b2 100644 --- a/doc/technical/infra/debianDepot.txt +++ b/doc/technical/infra/debianDepot.txt @@ -8,7 +8,6 @@ Lumiera Debian Package and Depot maintainance This Debian-Depot is part of the Lumiera build infrastructure. It is managed automatically, based on the link:http://mirrorer.alioth.debian.org/[reprepro] tool by Bernhard Link -WARNING: Page under construction The Lumiera debian package -------------------------- @@ -73,7 +72,20 @@ added automatically to the pool directory and all the indices, directories and G signatures are created and updated automatically. Previous versions of the same package are purged, when not needed by any existing package anymore -NOTE: *todo* show an configuraion example and list the most common handling commands +everyday usage +~~~~~~~~~~~~~~ + +import a package:: + +reprepro -V -C experimental include lenny lumiera_0.pre.01-1+maverick_i386.changes+ ++ +this adds the given binary lumiera package, together with all sources and the original +tarball to the 'lenny' repository, into the 'experimental' section + +dump out an entire repository:: + +reprepro -V export lenny+ ++ +this will __re__generate all of the indices, signatures and metadata of the 'lenny' repository + Configuration ~~~~~~~~~~~~~ @@ -88,11 +100,29 @@ want to create _yet another not so useful Git repository..._) * primary link:http://git.lumiera.org/gitweb?p=lumiera/debian;a=blob;f=conf/distributions;hb=refs/heads/depot[configuration] * Logfile of imports: link:http://git.lumiera.org/gitweb?p=lumiera/debian;a=blob;f=log/lenny.log;hb=refs/heads/depot[for Lenny] +[NOTE] +.some special details to note in our setup +======================================================================================================================= +- each block in the 'distributions' file defines a repository for a ``distribution'' (e.g. Lenny, Lucid, Maverick). + Within such a repo, there are sections named 'Components'. +- The _override_ files mentioned in the configuration allow to overwrite / replace arbitrary fields in the metadata of + all packages added to that distribution. +- In this setup, we enabled the 'tracking' function: thereby reprepro will keep track of the dependencies between + binary packages, signatures, debianisation patches and original upstream tarballs. Never packages overwirte older + ones -- _at any time there is at most one version of a package in the repository._ Parts not referred to anymore + are automatically discareded. In our configuration, they are moved into the 'morguedir' +- Please make sure the *gpg signing key* is in proper order, because it protects against evil spirited manipulations. + +======================================================================================================================= + + current setup 3/2011 ^^^^^^^^^^^^^^^^^^^^ While later we want to automate most of this packaging business, currently it's done semi-manual. Mostly, Ichthyo builds the packages on his local PC (or a VM) and then adds/imports them to the 'reprepro' -- changes are then propagated to lumiera.org via rsync; as kind of a backup, the -index files are also pushed to Git. - +index files are also pushed to link:http://git.lumiera.org/gitweb?p=lumiera/debian;a=shortlog;h=refs/heads/depot[Git]. +---- +rsync -rclvz --progress --partial --delete /local/filesys/path/to/Lumirep/depot/ ichthyo@www.lumiera.org:/var/local/www_debian +---- diff --git a/doc/user/tutorials/DebianBuilding.txt b/doc/user/tutorials/DebianBuilding.txt index 1409e7b1a..5e33957b6 100644 --- a/doc/user/tutorials/DebianBuilding.txt +++ b/doc/user/tutorials/DebianBuilding.txt @@ -19,19 +19,13 @@ Under some circumstances, these very benefits might be a drawback, though. Sometimes you don't want to install; or you might have a version of Lumiera installed, but want to try out a (maybe newer / development) version... -No problem -- basically it's allways possible to run Lumiera _without installation._ +No problem -- basically it's always possible to run Lumiera _without installation._ It is deliberately made such as to find its components actively, within the standard directory structure created by the buildsystem. While, thus, Lumiera can be just run directly from such a folder tree, the software still relies on some other libraries, which somehow need to be installed on your system. -anatomy of a debian source package ----------------------------------- - -NOTE: to be written.... give a short summary of the parts making up such a package - - building from source package ---------------------------- Generally speaking, operations which _modify_ the installation/configuration of your @@ -74,15 +68,131 @@ of course, the package names, versions and architecture will vary, depending on situation. * repeat those steps to work your way up to the +lumiera+ package; build and install - Nobug, build and install libgdl-lum and finally build and install Lumiera + Nobug, maybe build and install libgdl-lum and finally build and install Lumiera . clean up. + You can delete the source tree used for compiling. If you never intend to -re-install the package, you could also delete the created package and source packge +re-install the package, you could also delete the created package and source package components after installing it. But especially when trying out development versions it might be a good idea to file those packages somewhere, as we're not keeping _every_ package in the online Lumiera debian depot. While every package could be reproduced exactly with a bit of Git knowledge, just keeping the +*.deb+ might be more convenient. +Required and recommended Debian packages +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +What follows is a note about configuration for advanced users. You can safely skip and +ignore this section if in doubt. + +The Debian package manager stores for each package not only the required prerequisites, +but also some additional _recommended_ packages: Software likely to make using the given +package more convenient or improve the usage in some way. In addition, it also stores +a list of _suggested_ additional things to try. Now, since some time, the 'Apt' package +management tool by default automatically installs also the _recommended_ software, not +only the bare required prerequisites. + +While this is certainly fine for users not into the details of package management, it +has the downside of installing sometimes _a lot_ of additional software no one asked +about. Plus, all these installed packages are upgraded from time to time. An impressive +example of this kind of _bloat_ is the *asciidoc* package, which recommends to install +dockbook, an complete XML toolchain plus a TeX distribution, giving you an average of +additional 500MB to download and install. + +Of course, this behaviour can be changed. Just add the following line to your Apt configuration +---- +APT::Install-Recommends "false"; +---- +^_Disclaimer:_ please be sure you understand the consequences...^ + + +'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' +What follows are some more in-depth explanations and background informations + + +anatomy of a debian source package +---------------------------------- + +Debian source packages provide a standardised way of compiling software. These +packages are not intended to be _installed_ on your system; rather you just download +them and use them to build the software. + +Each Debian source package is based on an original _upstream_ tarball. In addition to +this '\*.orig.tar.gz', there is a '\*.diff.gz' which contains all the _modifications_ +done to the original upstream sources in order to compile it with Debian. Especially, +this so called ``debianisation patch'' adds a 'debian/' subdirectory to the source tree, +which then holds all the control files used by Debian package management. Finally, the +third part of each Debian source package is a _manifest_ file ('*.dsc'), which states +that this is a Debian package and contains the primary control informations, the +name and version number. Of course, these three files are named with a common name +prefix, which matches the 'official' package name and version. + +Quite frequently, a given source package generates several binary packages, e.g. the +main program, maybe a library and a documentation bundle. Because of this, often the +source package is named slightly different then the binary package, which can be a +problem sometimes. If in doubt, use the link:http://packages.debian.org[Debian package +search] or the link:http://packages.ubuntu.com[equivalent for Ubuntu] to locate packages, +versions, even individual files, or to get at the bug tracker for a package. + +interesting files in the debian subdirectory +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Most of the files in that subdirectory are relevant only for the people maintaining +the package. With the exception of the following: + +- the 'debian/control' file defines the properties and *metadata* of the package. Here you'll + find the definition of the prerequisites, the name of the packager, the explanatory text. +- the top entry in the 'debian/changelog' defines the *actual package name and version* +- the actual build process is conducted by invoking several pre defined targets in the + 'debian/rules' *makefile*. But modern debian packages often make use of the ``common + debian build system'' -- basically a set of macros allowing to write these 'rules' + in a very short and concise fashion + + +commands for handling source packages +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +For all package building tasks, you can use an arbitrary directory of your choice. +It is recommended to build with normal user permissions (not as root). + +- 'apt-get source' PACKAGENAME downloads the three parts of the source package. You may + use both the name of a binary or the source package in this command. After downloading, + the original tarball is extracted and the debianisation patch is applied. That is, + the tree is ready for building +- 'apt-get source \--compile' PACKAGENAME does even more: it starts off the build + of a binary package after downloading and preparing the sources... +- 'dpkg-source -x' SRCPACKAGE.dsc just extracts a source package and applies the diff +- 'sudo apt-get buld-dep' PACKAGENAME fetches and installs all the prerequisites + necessary for building the denoted package. (however, it does _not_ download the + source package itself) +- 'sudo dpkg -i' BIN-PACKAGE.deb finally installs the result of your building efforts. + Note, if several packages depend on each other, you need to give them all as list + in a single command invocation. + +After having prepared the sources thusly, you need to step into the root of the +source tree, if you want to build the whole package, or even want to tweak and +modify parts. + +- 'dpkg-checkbuilddeps' checks that all the requirements of the package are satisfied. + It just prints out what is missing; this is especially useful if the fully automated + install did not work entirely, so you have to fix / reinstall parts manually +- 'dpkg-buildpackage -rfakeroot' starts the full build. This includes re-generating + the source package (and especially the diff). If you only want to build the binary + package, you can skip the diff- / source-package generation with '-b' + +prerequisites for building +~~~~~~~~~~~~~~~~~~~~~~~~~~ +For performing any compiling and packaging tasks, you need some additional software, +which by default isn't installed on a desktop system -- most notably the GNU C compiler. +On any Debian based system, you get these basic tooling by +---- +sudo apt-get install build-essential +---- + +library development packages +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +When building software linked against some library, we need additional 'header files' +provided together with the library. Conventionally, these headers are packaged separately +from the library and shipped as a package with a name like 'LIBNAME-dev'. You can safely +__de__install these development packages when done with building. + + + From 8e15e1dec0c5117501167e826c277e048c687763 Mon Sep 17 00:00:00 2001 From: Ichthyostega <prg@ichthyostega.de> Date: Thu, 31 Mar 2011 19:53:56 +0200 Subject: [PATCH 7/9] update the compiling-from-source tutorial Signed-off-by: Ichthyostega <prg@ichthyostega.de> --- doc/user/tutorials/building.txt | 64 ++++++++++++++++++--------------- 1 file changed, 36 insertions(+), 28 deletions(-) diff --git a/doc/user/tutorials/building.txt b/doc/user/tutorials/building.txt index f7eb94bfc..0092da1cc 100644 --- a/doc/user/tutorials/building.txt +++ b/doc/user/tutorials/building.txt @@ -2,15 +2,26 @@ Building Lumiera from source ============================ Currently, after building the application, you can try out the Lumiera GUI -and you can run the test suite. +and you can run the test suite. This tutorial details the basic procedure +to compile Lumiera on a Linux (or comparable) system. We'll assume that +the reader has acquired basic _commandline survival skills_ and is able +to figure out the usage of the Git version management system from the +documentation (but we'll mention each actually required command +explicitly) -For building Lumiera, besides the GNU C/C++ compiler (Version 4.X), you will -need: +NOTE: just compiling Lumieara on a _Debian-based_ system (e.g. Ubuntu) + is much simpler using the Debian source package. See the separate + link:DebianBuilding.html[tutorial page] for this (or the general + link:/debian/[instructions for installing on Debian/Ubuntu]). + The purpose of this tutorial here is to show you the elementary + and generic steps to compile Lumiera from source. - * http://git-scm.com/[git] - * http://www.gnu.org/software/libtool/[libtool] - * http://www.boost.org/[Boost libraries] - * http://gmerlin.sourceforge.net/[GAVL library] +For building Lumiera, besides the GNU C/C++ compiler (Version 4.X), you will need: + + * link:http://git-scm.com/[Git VCS] + * link:http://www.scons.org/[SCons build system] + * link:http://www.boost.org/[Boost libraries] + * link:http://gmerlin.sourceforge.net/[GAVL library] * *NoBug* (see below) The GUI depends on: @@ -22,17 +33,17 @@ TIP: Generally speaking, when you want to build software, you need the _development_ version of the packages, containing the headers and pre-built libraries to link against. Usually, these packages are named `-devel` or `-dev` -For most Debian based systems, e.g. Ubuntu, you can install these dependencies -with: +For Debian based systems, e.g. Ubuntu, you can install these dependencies with: ------------------------------------------------------------- -sudo apt-get install build-essential autoconf git-core libboost-dev \ -libboost-program-options-dev libboost-regex-dev libgavl-dev libgdl-1-dev \ -libgtkmm-2.4-dev librsvg2-dev libtool libxv-dev scons valgrind ------------------------------------------------------------- +------------------------------------------------------------------------------------- +sudo apt-get install build-essential autoconf scons valgrind libtool git-core \ +libboost-dev libboost-program-options-dev libboost-regex-dev libboost-filesystem-dev \ +libgavl-dev libgdl-1-dev libgtkmm-2.4-dev librsvg2-dev libxv-dev +------------------------------------------------------------------------------------- Optionally, you may also want to install the *gtk2-engines* package. + Build directory --------------- @@ -85,8 +96,9 @@ Installing GDL The *GNOME Docking library* is generally available through your package manager, but we contributed some improvements, which are only available in the very -recent development versions of GDL. Thus, for now we created a special package, -which doesn't interfere with an existing (older) installation of GDL. +recent development versions of GDL. If your distribution provides a GDL >= 2.27, +you're fine. Otherwise we've created a special package, which doesn't interfere +with an existing (older) installation of GDL. Ubuntu 9.04 note:: intltool-update is not patched, you must add +/usr/share/intltool-debian/+ @@ -121,7 +133,7 @@ variable. Either way, check that all libraries are accessible and OK: ------------------------------------------------------------ -sudo ldconfig -v | grep 'gdl-lum\|nobug' +sudo ldconfig -v | grep 'nobug' ------------------------------------------------------------ and you should get a list of the libraries, part of which should look like this: @@ -132,7 +144,9 @@ and you should get a list of the libraries, part of which should look like this: libgdl-lum.so.0 -> /usr/local/lib/libgdl-lum.so.0.0.0 ------------------------------------------------------------ -or similar. If any if this libs are not listed, investigate why before continuing. +or similar. The same holds true for 'libgdl-lum.so.0' if you needed to build it +explicitly for your system. If any if these libraries are not listed, +investigate why before continuing. Building Lumiera @@ -175,20 +189,14 @@ maybe build and run the test suite by issuing `scons check` or `make check` This will take some time. -NOTE: you can not _install_ Lumiera currently. Do not try it, it will not work. -Just run it from the build directory. +NOTE: you do not need to _install_ Lumiera. It will find its required files +relative to the generated directory structure, which is freely relocatable +as a whole. Just invoke the +target/lumiera+ executable. The current +working directory is not relevant. After the build has finished successfully, you should be able to start Lumiera. Currently, this will bring up the GUI, without any further functionality - * for autotools build: issue `./lumiera` (from within the `build` subdirectory) - * for scons build: -+ -------------------- -cd bin -./lumiera -------------------- - You should see something like: image:{l}/images/lumiera_gui_small.png[Current Lumiera GUI Screenshot] From 012ed9ab36b8ae65919936d4d2de0c965951a0ee Mon Sep 17 00:00:00 2001 From: Ichthyostega <prg@ichthyostega.de> Date: Thu, 31 Mar 2011 20:44:03 +0200 Subject: [PATCH 8/9] update intro, fix image links Signed-off-by: Ichthyostega <prg@ichthyostega.de> --- doc/devel/images/lumiera_big_graph.png | Bin 0 -> 48959 bytes doc/user/intro/intro.txt | 132 ++++++++--------- doc/user/intro/lumiera_big_graph.svg | 195 +++++++++++++++---------- 3 files changed, 181 insertions(+), 146 deletions(-) create mode 100644 doc/devel/images/lumiera_big_graph.png diff --git a/doc/devel/images/lumiera_big_graph.png b/doc/devel/images/lumiera_big_graph.png new file mode 100644 index 0000000000000000000000000000000000000000..ec08d77fd102b64b6c138983619b130c5ddbbc05 GIT binary patch literal 48959 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 literal 0 HcmV?d00001 diff --git a/doc/user/intro/intro.txt b/doc/user/intro/intro.txt index 1bc008b7c..0e32a454b 100644 --- a/doc/user/intro/intro.txt +++ b/doc/user/intro/intro.txt @@ -119,7 +119,7 @@ Processing of Video (and audio) data can be generalized as graph processing (more precisely ``directed acyclic graphs''). Data flows on the edges of these graphs and is processed in the nodes. -image:lumiera_big_graph.svg[Example for a graph] +image:{imgd}/lumiera_big_graph.png[Example for a graph] When we look at this model we discover that we only need to build xref:builder[->] such graphs, the nodes themselves can be seen as black boxes @@ -162,7 +162,7 @@ The visible Universe Now its time to take a look at the prelimary Lumiera GUI: -image:lumiera_screenshot.png[Screenshot of Lumiera] +image:{l}/images/lumiera_gui_small.png[Current Lumiera GUI Screenshot] The GUI is a plugin by itself and only one way to work Lumiera, it will become possible to create special-purpose GUIs or control Lumiera in different ways, @@ -178,6 +178,7 @@ xref:screenconcept[->] to adapt to different workplaces and workflows. Viewer ~~~~~~ +[red]#to be written# // only one viewer type used for everything // how is audio integrated in the viewer @@ -194,21 +195,20 @@ Viewer Transport Controls ~~~~~~~~~~~~~~~~~~ -// current gui is not final (transport controls attached to the timeline) -// It is not finally decided where transport controls will be integrated -// possibly as its own gui element +The layout in current gui is rather preliminary -- it is not finally decided +where transport controls will be integrated; possibly as its own gui element -// This are devices either controlled by widgets or by some input device (midi -// etc) so their gui may look differently. -// Either way they connect to a Play Controler xref.. in the core which -// manages playing and cursor positioning. +This are devices either controlled by widgets or by some input device +(MIDI, control surface, etc) so their gui may look differently. +Either way they connect to a Play Controler xref.. in the core which +manages playing and cursor positioning. -// thus there will be some gui facility to attach Transport controls to Play -// Controllers. Transport controls are ganged when they attach to the same -// Play Controler. +thus there will be some gui facility to attach Transport controls to Play +Controllers. Transport controls are ganged when they attach to the same +Play Controler. -// just playing some footage for preview creates a simple internal timeline, -// no magic here. +just playing some footage for preview creates a simple internal timeline, +no magic here. // TODO: bit unrelated, think about how ganging controls in general should // work, also for faders, masks and so on @@ -220,12 +220,13 @@ Transport Controls Timeline View ~~~~~~~~~~~~~ -// hierarchical tracks, not just a stack +hierarchical tracks, not just a list + +Format Independent Timeline, one can put anything on the timeline. +the busses constrain what kind of data is pulled out and in turn the +builder creates a processing graph which does the necessary conversions and +stuff. -// Format Independent Timeline, one can put anything on the timeline. -// the busses constrain what kind of data is pulled out and in turn the -// builder creates a processing graph which does the necessary conversions and -// stuff. // Q: how to handle interaction, for example when some conversion can only be // done in a lossy way and some conversion node may or may not be inserted // (i mean gui wise)? @@ -241,19 +242,23 @@ Timeline View // a special case of a selection. -// Busses -// ~~~~~~ -// How will the gui define busses? +Busses +~~~~~~ +The GUI provides a separate _bus view_, showing the master busses (subgroups) +in a manner similar to an audio mixing desk. Any bus is just a means to collect +and sum up the output of a specific kind of media (video, audio, number of channels), +produced by various processing elements and other busses. Conceptionally, these global +busses are considered a part of the timeline Asset View ~~~~~~~~~~ -// Manages all assets available in one project. -// * source media/footage/soundfiles -// * prepared clips, known subprojects -// * all available effects and transitions -// * internal artefacts like sequences and automation data sets +Manages all assets available in one project. + * source media/footage/soundfiles + * prepared clips, known subprojects + * all available effects and transitions + * internal artefacts like sequences and automation data sets // First this will be simply implemented showing data loaded into the session // and all available plugins/effects @@ -272,18 +277,23 @@ Asset View // the contents of a clip bin can be played like a storyboard +'''''''' + Dark Matter ----------- -// coarse overview about things the user does not see but have some contact -// with, details later... +[red]#to be written# +coarse overview about things the user does not see but have some contact +with, details later... -Now lets take a look under the hood. Lumiera + +Now lets take a look under the hood. Session storage ~~~~~~~~~~~~~~~ +[red]#to be written# // not generateable data @@ -314,15 +324,19 @@ output destination, layering, fade control, audio pan,... Rendering Engine ~~~~~~~~~~~~~~~~ -// rendering +[red]#to be written# +rendering... [[builder]] +[red]#to be written# -// rules system - +rules system +[red]#to be written# I/O Subsystem ~~~~~~~~~~~~~ +[red]#to be written# + // file handling // vault, work, cache // repositories @@ -331,12 +345,16 @@ I/O Subsystem Configuration ~~~~~~~~~~~~~ +[red]#to be written# + // configuration system // serves defaults, actual data are stored in the session Plugins/Interfaces ~~~~~~~~~~~~~~~~~~ +[red]#to be written# + // explain whats it is // portability // versioning @@ -345,6 +363,7 @@ Plugins/Interfaces Rendering Video --------------- +[red]#to be written# // describe the flow of data to render a frame @@ -354,6 +373,7 @@ Rendering Video Pulling a Frame ~~~~~~~~~~~~~~~ +[red]#to be written# // special cases, // case studies, @@ -372,45 +392,19 @@ Pulling a Frame // show some case-studies that someone gets a feel how plugins work -[[pluginstack]] - -//Audio +[red]#TODO# Consider integrating the following things into the document above - -// TODO Following things need to be integrated into the document above - - -* [[plugins]] -* [[timeline]] -* [[demultiplexer]] -* [[multiplexer]] -* [[encoder]] -* [[pull]] -bus defines rendering format -* [[caching]] -* [[profiling]] -* [[rendernode]] -* [[frameserver]] -* [[screenconcept]] -* [[busses]] - -// gui/screen concepts -// perspectives - -// Automation - - - - -// 3 layered model - - -such as that we only need to pull exactly what we need, -posibly down to the pixel, this also allows efficient caching xref:caching[->] -for intermediate data, to be reused later. - +* plugins +* timeline +* pull +* bus defines rendering format +* caching +* frameserver +* screenconcept / perspectives +* automation +* 3 layered model diff --git a/doc/user/intro/lumiera_big_graph.svg b/doc/user/intro/lumiera_big_graph.svg index 67cf01f66..d995d913f 100644 --- a/doc/user/intro/lumiera_big_graph.svg +++ b/doc/user/intro/lumiera_big_graph.svg @@ -33,20 +33,21 @@ borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" - inkscape:zoom="1.0518407" - inkscape:cx="564.81009" - inkscape:cy="277.96054" + inkscape:zoom="1.4875274" + inkscape:cx="444.97376" + inkscape:cy="280.84291" inkscape:document-units="px" - inkscape:current-layer="layer2" + inkscape:current-layer="layer4" showgrid="true" - inkscape:window-width="1274" - inkscape:window-height="774" + inkscape:window-width="1668" + inkscape:window-height="1020" inkscape:window-x="0" inkscape:window-y="0" inkscape:window-maximized="0" inkscape:snap-to-guides="false" inkscape:snap-grids="true" - inkscape:snap-global="true"> + inkscape:snap-global="true" + gridtolerance="5"> <inkscape:grid type="xygrid" id="grid2854" @@ -63,8 +64,36 @@ <dc:format>image/svg+xml</dc:format> <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title /> + <dc:title>Lumiera Data Flow Overview</dc:title> + <cc:license + rdf:resource="http://creativecommons.org/licenses/by-sa/3.0/" /> + <dc:date>Summer 2010</dc:date> + <dc:creator> + <cc:Agent> + <dc:title>Christian Thäter</dc:title> + </cc:Agent> + </dc:creator> + <dc:publisher> + <cc:Agent> + <dc:title>Lumiera.org</dc:title> + </cc:Agent> + </dc:publisher> </cc:Work> + <cc:License + rdf:about="http://creativecommons.org/licenses/by-sa/3.0/"> + <cc:permits + rdf:resource="http://creativecommons.org/ns#Reproduction" /> + <cc:permits + rdf:resource="http://creativecommons.org/ns#Distribution" /> + <cc:requires + rdf:resource="http://creativecommons.org/ns#Notice" /> + <cc:requires + rdf:resource="http://creativecommons.org/ns#Attribution" /> + <cc:permits + rdf:resource="http://creativecommons.org/ns#DerivativeWorks" /> + <cc:requires + rdf:resource="http://creativecommons.org/ns#ShareAlike" /> + </cc:License> </rdf:RDF> </metadata> <g @@ -130,10 +159,10 @@ x="279.23798" y="309.81433" /> <rect - style="fill:#ffffff;stroke:#b3b3b3;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + style="fill:#ffffff;stroke:#b3b3b3;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" id="rect4737" width="110" - height="80" + height="94.736069" x="230" y="354.40942" /> <rect @@ -158,19 +187,16 @@ style="display:inline"> <path style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - d="m 502,426.40942 40,0" + d="M 500,424.40942 L 540,424.40942" id="path3467" /> - <path - style="fill:none;stroke:#b3b3b3;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - d="m 502,456.40942 40,0" - id="path3471" /> <path style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - d="m 502,486.40942 38.57143,-0.51948" - id="path3473" /> + d="M 500,464.40942 L 540,464.40942" + id="path3473" + sodipodi:nodetypes="cc" /> <path - style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:2, 2;stroke-dashoffset:0" - d="m 502,441.40942 40,0" + style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:2, 2;stroke-dashoffset:1;stroke-opacity:1" + d="M 500,444.40942 L 540,444.40942" id="path3475" /> <path style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:2, 2;stroke-dashoffset:0" @@ -272,6 +298,11 @@ d="M 365,74.580418 L 474.92023,194.40942" id="path2552" sodipodi:nodetypes="cc" /> + <path + id="path3336" + d="M 345,336.82264 L 475,289.40942 L 475,194.40942" + style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:2, 2;stroke-dashoffset:0" + sodipodi:nodetypes="ccc" /> </g> <g inkscape:label="Elements" @@ -668,10 +699,10 @@ <g style="display:inline" id="g3629-3" - transform="translate(15,140)"> + transform="translate(15,149.9825)"> <path transform="translate(0,527.95272)" - d="m 265,284.40942 a 15,5 0 1 1 -30,0 15,5 0 1 1 30,0 z" + d="M 265,284.40942 A 15,5 0 1 1 235,284.40942 A 15,5 0 1 1 265,284.40942 z" sodipodi:ry="5" sodipodi:rx="15" sodipodi:cy="284.40942" @@ -681,7 +712,7 @@ sodipodi:type="arc" /> <path transform="translate(0,527.95272)" - d="m 265,279.40942 a 15,5 0 1 1 -30,0 15,5 0 1 1 30,0 z" + d="M 265,279.40942 A 15,5 0 1 1 235,279.40942 A 15,5 0 1 1 265,279.40942 z" sodipodi:ry="5" sodipodi:rx="15" sodipodi:cy="279.40942" @@ -691,7 +722,7 @@ sodipodi:type="arc" /> <path transform="translate(0,527.95272)" - d="m 265,274.40942 a 15,5 0 1 1 -30,0 15,5 0 1 1 30,0 z" + d="M 265,274.40942 A 15,5 0 1 1 235,274.40942 A 15,5 0 1 1 265,274.40942 z" sodipodi:ry="5" sodipodi:rx="15" sodipodi:cy="274.40942" @@ -701,7 +732,7 @@ sodipodi:type="arc" /> <path transform="translate(0,527.95272)" - d="m 265,269.40942 a 15,5 0 1 1 -30,0 15,5 0 1 1 30,0 z" + d="M 265,269.40942 A 15,5 0 1 1 235,269.40942 A 15,5 0 1 1 265,269.40942 z" sodipodi:ry="5" sodipodi:rx="15" sodipodi:cy="269.40942" @@ -892,10 +923,10 @@ <g style="display:inline" id="g3629-3-2" - transform="translate(70,140)"> + transform="translate(70,149.9825)"> <path transform="translate(0,527.95272)" - d="m 265,284.40942 a 15,5 0 1 1 -30,0 15,5 0 1 1 30,0 z" + d="M 265,284.40942 A 15,5 0 1 1 235,284.40942 A 15,5 0 1 1 265,284.40942 z" sodipodi:ry="5" sodipodi:rx="15" sodipodi:cy="284.40942" @@ -905,7 +936,7 @@ sodipodi:type="arc" /> <path transform="translate(0,527.95272)" - d="m 265,279.40942 a 15,5 0 1 1 -30,0 15,5 0 1 1 30,0 z" + d="M 265,279.40942 A 15,5 0 1 1 235,279.40942 A 15,5 0 1 1 265,279.40942 z" sodipodi:ry="5" sodipodi:rx="15" sodipodi:cy="279.40942" @@ -915,7 +946,7 @@ sodipodi:type="arc" /> <path transform="translate(0,527.95272)" - d="m 265,274.40942 a 15,5 0 1 1 -30,0 15,5 0 1 1 30,0 z" + d="M 265,274.40942 A 15,5 0 1 1 235,274.40942 A 15,5 0 1 1 265,274.40942 z" sodipodi:ry="5" sodipodi:rx="15" sodipodi:cy="274.40942" @@ -925,7 +956,7 @@ sodipodi:type="arc" /> <path transform="translate(0,527.95272)" - d="m 265,269.40942 a 15,5 0 1 1 -30,0 15,5 0 1 1 30,0 z" + d="M 265,269.40942 A 15,5 0 1 1 235,269.40942 A 15,5 0 1 1 265,269.40942 z" sodipodi:ry="5" sodipodi:rx="15" sodipodi:cy="269.40942" @@ -1108,12 +1139,12 @@ <text xml:space="preserve" style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" - x="285" + x="296.88394" y="319.40942" id="text3434"><tspan sodipodi:role="line" id="tspan3436" - x="285" + x="296.88394" y="319.40942">Busses</tspan></text> <text xml:space="preserve" @@ -1128,73 +1159,74 @@ <text xml:space="preserve" style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" - x="374" + x="383.98251" y="364.40942" id="text3430-0"><tspan sodipodi:role="line" id="tspan3432-2" - x="374" + x="383.98251" + y="364.40942">Viewer</tspan></text> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial;text-anchor:start;text-align:start;writing-mode:lr;line-height:90%" + x="460" + y="174.40942" + id="text3434-2" + sodipodi:linespacing="90%"><tspan + sodipodi:role="line" + id="tspan2554">Switch-</tspan><tspan + sodipodi:role="line" + id="tspan2556">board</tspan></text> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="550" + y="304.40942" + id="text4506"><tspan + sodipodi:role="line" + id="tspan4508" + x="550" + y="304.40942">Data on Disk</tspan></text> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" + x="550" + y="364.40942" + id="text4510"><tspan + sodipodi:role="line" + id="tspan4512" + x="550" y="364.40942">Viewer</tspan></text> <text xml:space="preserve" style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" - x="460" - y="174.40942" - id="text3434-2"><tspan - sodipodi:role="line" - id="tspan3436-9" - x="460" - y="174.40942">Busses</tspan></text> - <text - xml:space="preserve" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" - x="548.41583" - y="296.5054" - id="text4506"><tspan - sodipodi:role="line" - id="tspan4508" - x="548.41583" - y="296.5054">Data on Disk</tspan></text> - <text - xml:space="preserve" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" - x="550.85516" - y="348.0954" - id="text4510"><tspan - sodipodi:role="line" - id="tspan4512" - x="550.85516" - y="348.0954">Viewer</tspan></text> - <text - xml:space="preserve" - style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" - x="545.9765" - y="397.85779" + x="545" + y="399.40942" id="text4514"><tspan sodipodi:role="line" id="tspan4516" - x="545.9765" - y="397.85779">Node/Plugin</tspan></text> + x="545" + y="399.40942">Node/Plugin</tspan></text> <text xml:space="preserve" style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" - x="549.39154" - y="426.15408" + x="545" + y="424.40942" id="text4518"><tspan sodipodi:role="line" id="tspan4520" - x="549.39154" - y="426.15408">Build Connection between Nodes</tspan></text> + x="545" + y="424.40942">Build Connection between Nodes</tspan></text> <text xml:space="preserve" style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" - x="549.39154" - y="442.74155" + x="545" + y="444.40942" id="text4522"><tspan sodipodi:role="line" id="tspan4524" - x="549.39154" - y="442.74155">Temporary Connection between node</tspan></text> + x="545" + y="444.40942">Temporary Connection between node</tspan></text> <text xml:space="preserve" style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" @@ -1208,12 +1240,21 @@ <text xml:space="preserve" style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial" - x="255" + x="290" y="109.40942" id="text4711"><tspan sodipodi:role="line" id="tspan4713" - x="255" + x="290" y="109.40942">Preprocessing</tspan></text> + <text + id="text3328" + y="464.40942" + x="545" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial;text-anchor:start;text-align:start;writing-mode:lr;line-height:125%" + xml:space="preserve" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan3332">External Connection</tspan></text> </g> </svg> From 7275720812d4092e258e59801ae4983fcc534962 Mon Sep 17 00:00:00 2001 From: Ichthyostega <prg@ichthyostega.de> Date: Thu, 31 Mar 2011 20:50:33 +0200 Subject: [PATCH 9/9] fix menu entry --- doc/design/architecture/ArchitectureSummary.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/design/architecture/ArchitectureSummary.txt b/doc/design/architecture/ArchitectureSummary.txt index c8ceff2af..4ddd3b4ba 100644 --- a/doc/design/architecture/ArchitectureSummary.txt +++ b/doc/design/architecture/ArchitectureSummary.txt @@ -4,6 +4,8 @@ Lumiera Architecture: Executive Summary :Email: <Ichthyostega@web.de> :Date: Sept 2010 +//Menu: label Summary + .Three Layers Besides the (obvious) separation in GUI frontend and render engine, editing core and application logic are treated separately. Besides enforcing clearly defined interfaces, the ability for script driven