Invocation: change TestFrame to use a dedicated header
Change data layout to place a metadata record ''behind the'' payload data, and add a checksum to allow for validating dummy calculations and also detect data corruption on data modified after initial generation. By virtue of a marker data word, the presence of a valid metadata record can be confirmed.
This commit is contained in:
parent
4ca9eb8d46
commit
204e2f55d0
4 changed files with 200 additions and 93 deletions
|
|
@ -33,7 +33,7 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* storage for a Lumiera unique ID,
|
* storage for a Lumiera unique ID,
|
||||||
* based on a 128bit random number
|
* based on a 128bit random number
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -18,12 +18,13 @@
|
||||||
|
|
||||||
#include "lib/error.hpp"
|
#include "lib/error.hpp"
|
||||||
#include "lib/random.hpp"
|
#include "lib/random.hpp"
|
||||||
|
#include "lib/hash-standard.hpp"
|
||||||
|
#include "lib/hash-combine.hpp"
|
||||||
#include "steam/engine/testframe.hpp"
|
#include "steam/engine/testframe.hpp"
|
||||||
#include "lib/nocopy.hpp"
|
#include "lib/nocopy.hpp"
|
||||||
#include "lib/util.hpp"
|
#include "lib/util.hpp"
|
||||||
|
|
||||||
#include <climits>
|
#include <climits>
|
||||||
#include <cstring>
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
|
@ -33,10 +34,8 @@ namespace steam {
|
||||||
namespace engine {
|
namespace engine {
|
||||||
namespace test {
|
namespace test {
|
||||||
|
|
||||||
using lib::HashVal;
|
using util::unConst;
|
||||||
using std::vector;
|
using std::vector;
|
||||||
using std::memcpy;
|
|
||||||
using lib::rani;
|
|
||||||
|
|
||||||
/** @note using a random-congruential engine to generate the payload data */
|
/** @note using a random-congruential engine to generate the payload data */
|
||||||
using PseudoRandom = lib::RandomSequencer<std::minstd_rand>;
|
using PseudoRandom = lib::RandomSequencer<std::minstd_rand>;
|
||||||
|
|
@ -69,14 +68,16 @@ namespace test {
|
||||||
HashVal dataSeed{drawSeed(lib::entropyGen)};
|
HashVal dataSeed{drawSeed(lib::entropyGen)};
|
||||||
|
|
||||||
/** @internal helper for generating unique test frames.
|
/** @internal helper for generating unique test frames.
|
||||||
* This "discriminator" is used as a random seed when filling the test frame data buffers.
|
* This »discriminator« is used as a random seed when filling the test frame data buffers.
|
||||||
* It is generated to be very likely different on adjacent frames of the same series,
|
* It is generated to be very likely different on adjacent frames of the same series,
|
||||||
* as well as to differ to all nearby neighbouring channels.
|
* as well as to differ to all nearby neighbouring channels.
|
||||||
|
* @note the #dataSeed hash is limited by #SEQUENCE_SPREAD to prevent „risky“ families;
|
||||||
|
* the extreme case would be dataSeed+family ≡ 0 (all frames would be equal then)
|
||||||
* @param seq the sequence number of the frame within the channel
|
* @param seq the sequence number of the frame within the channel
|
||||||
* @param family the channel this frame belongs to
|
* @param family the channel this frame belongs to
|
||||||
*/
|
*/
|
||||||
uint64_t
|
uint64_t
|
||||||
generateDistinction(uint seq, uint family)
|
generateDiscriminator(uint seq, uint family)
|
||||||
{
|
{
|
||||||
// use the family as stepping
|
// use the family as stepping
|
||||||
return (seq+1) * (dataSeed+family);
|
return (seq+1) * (dataSeed+family);
|
||||||
|
|
@ -99,6 +100,15 @@ namespace test {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/** @return a stable characteristic memory marker for the metadata record */
|
||||||
|
HashVal
|
||||||
|
stampHeader()
|
||||||
|
{
|
||||||
|
static const HashVal MARK = lib::entropyGen.hash()
|
||||||
|
| 0b1000'1000'1000'1000'1000'1000'1000'1000;
|
||||||
|
return MARK;
|
||||||
|
}
|
||||||
|
|
||||||
/** @internal build a PRNG starting from the referred fixed seed */
|
/** @internal build a PRNG starting from the referred fixed seed */
|
||||||
auto
|
auto
|
||||||
buildDataGenFrom (uint64_t const& anchor)
|
buildDataGenFrom (uint64_t const& anchor)
|
||||||
|
|
@ -225,43 +235,68 @@ namespace test {
|
||||||
|
|
||||||
/* ===== TestFrame class ===== */
|
/* ===== TestFrame class ===== */
|
||||||
|
|
||||||
|
TestFrame::Meta::Meta (uint seq, uint family)
|
||||||
|
: _MARK_{stampHeader()}
|
||||||
|
, checksum{0}
|
||||||
|
, distinction{generateDiscriminator (seq,family)}
|
||||||
|
, stage{CREATED}
|
||||||
|
{ }
|
||||||
|
|
||||||
TestFrame::~TestFrame()
|
TestFrame::~TestFrame()
|
||||||
{
|
{
|
||||||
stage_ = DISCARDED;
|
header_.stage = DISCARDED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
TestFrame::TestFrame(uint seq, uint family)
|
TestFrame::TestFrame (uint seq, uint family)
|
||||||
: distinction_(generateDistinction (seq,family))
|
: header_{seq,family}
|
||||||
, stage_(CREATED)
|
|
||||||
{
|
{
|
||||||
ASSERT (0 < distinction_);
|
ASSERT (0 < header_.distinction);
|
||||||
buildData();
|
header_.checksum = buildData();
|
||||||
|
ENSURE (CREATED == header_.stage);
|
||||||
|
ENSURE (isPristine());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
TestFrame::TestFrame (TestFrame const& o)
|
TestFrame::TestFrame (TestFrame const& o)
|
||||||
: distinction_(o.distinction_)
|
: header_{o.header_}
|
||||||
, stage_(CREATED)
|
|
||||||
{
|
{
|
||||||
memcpy (buffer_, o.buffer_, BUFFSIZ);
|
data() = o.data();
|
||||||
|
header_.stage = CREATED;
|
||||||
}
|
}
|
||||||
|
|
||||||
TestFrame&
|
TestFrame&
|
||||||
TestFrame::operator= (TestFrame const& o)
|
TestFrame::operator= (TestFrame const& o)
|
||||||
{
|
{
|
||||||
if (DISCARDED == stage_)
|
if (not isAlive())
|
||||||
throw new error::Logic ("target TestFrame is already dead");
|
throw new error::Logic ("target TestFrame already dead or unaccessible");
|
||||||
if (not util::isSameAdr (this, o))
|
if (not util::isSameAdr (this, o))
|
||||||
{
|
{
|
||||||
distinction_ = o.distinction_;
|
data() = o.data();
|
||||||
stage_ = CREATED;
|
header_ = o.header_;
|
||||||
memcpy (buffer_, o.buffer_, BUFFSIZ);
|
header_.stage = CREATED;
|
||||||
}
|
}
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
TestFrame::Meta&
|
||||||
|
TestFrame::accessHeader()
|
||||||
|
{
|
||||||
|
return header_;
|
||||||
|
}
|
||||||
|
TestFrame::Meta const&
|
||||||
|
TestFrame::accessHeader() const
|
||||||
|
{
|
||||||
|
///////////////////////OOO detect if valid header present and else throw
|
||||||
|
return unConst(this)->accessHeader();
|
||||||
|
}
|
||||||
|
|
||||||
|
TestFrame::StageOfLife
|
||||||
|
TestFrame::currStage() const
|
||||||
|
{
|
||||||
|
///////////////////////OOO detect if valid header present and then access
|
||||||
|
}
|
||||||
|
|
||||||
/** @note performing an unchecked conversion of the given
|
/** @note performing an unchecked conversion of the given
|
||||||
* memory location to be accessed as TestFrame.
|
* memory location to be accessed as TestFrame.
|
||||||
|
|
@ -301,47 +336,74 @@ namespace test {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
HashVal
|
||||||
|
TestFrame::buildData()
|
||||||
|
{
|
||||||
|
auto gen = buildDataGenFrom (accessHeader().distinction);
|
||||||
|
for (uint i=0; i<BUFFSIZ; ++i)
|
||||||
|
data()[i] = char(gen.i(CHAR_MAX));
|
||||||
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
TestFrame::verifyData() const
|
TestFrame::verifyData() const
|
||||||
{
|
{
|
||||||
auto gen = buildDataGenFrom (distinction_);
|
auto gen = buildDataGenFrom (accessHeader().distinction);
|
||||||
for (uint i=0; i<BUFFSIZ; ++i)
|
for (uint i=0; i<BUFFSIZ; ++i)
|
||||||
if (data()[i] != char(gen.i(CHAR_MAX)))
|
if (data()[i] != char(gen.i(CHAR_MAX)))
|
||||||
return false;
|
return false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
HashVal
|
||||||
TestFrame::buildData()
|
TestFrame::computeChecksum() const
|
||||||
{
|
{
|
||||||
auto gen = buildDataGenFrom (distinction_);
|
HashVal hash{0};
|
||||||
for (uint i=0; i<BUFFSIZ; ++i)
|
////////////////////////////////////////////OOO actually compute it
|
||||||
data()[i] = char(gen.i(CHAR_MAX));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
TestFrame::hasValidChecksum() const
|
||||||
|
{
|
||||||
|
////////////////////////////////////////////OOO actually compute checksum and verify
|
||||||
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
TestFrame::isAlive() const
|
TestFrame::isAlive() const
|
||||||
{
|
{
|
||||||
return (CREATED == stage_)
|
return (CREATED == currStage())
|
||||||
|| (EMITTED == stage_);
|
|| (EMITTED == currStage());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
TestFrame::isDead() const
|
TestFrame::isDead() const
|
||||||
{
|
{
|
||||||
return (DISCARDED == stage_);
|
return (DISCARDED == currStage());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
TestFrame::isSane() const
|
TestFrame::isSane() const
|
||||||
{
|
{
|
||||||
return ( (CREATED == stage_)
|
return ( (CREATED == currStage())
|
||||||
||(EMITTED == stage_)
|
||(EMITTED == currStage())
|
||||||
||(DISCARDED == stage_))
|
||(DISCARDED == currStage()))
|
||||||
&& verifyData();
|
&& verifyData();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
TestFrame::isValid() const
|
||||||
|
{
|
||||||
|
return isSane()
|
||||||
|
and hasValidChecksum();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
TestFrame::isPristine() const
|
||||||
|
{
|
||||||
|
return isSane()
|
||||||
|
and hasValidChecksum();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}}} // namespace steam::engine::test
|
}}} // namespace steam::engine::test
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,7 @@ namespace steam {
|
||||||
namespace engine {
|
namespace engine {
|
||||||
namespace test {
|
namespace test {
|
||||||
|
|
||||||
|
using lib::HashVal;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Mock data frame for simulated rendering.
|
* Mock data frame for simulated rendering.
|
||||||
|
|
@ -58,14 +59,24 @@ namespace test {
|
||||||
|
|
||||||
static constexpr size_t BUFFSIZ = 1024;
|
static constexpr size_t BUFFSIZ = 1024;
|
||||||
using _Arr = std::array<char,BUFFSIZ>;
|
using _Arr = std::array<char,BUFFSIZ>;
|
||||||
|
|
||||||
uint64_t distinction_;
|
struct Meta
|
||||||
StageOfLife stage_;
|
{
|
||||||
|
HashVal _MARK_;
|
||||||
|
HashVal checksum;
|
||||||
|
uint64_t distinction;
|
||||||
|
StageOfLife stage;
|
||||||
|
|
||||||
|
Meta (uint seq, uint family);
|
||||||
|
};
|
||||||
|
|
||||||
/** inline storage buffer for the payload media data */
|
/** inline storage buffer for the payload media data */
|
||||||
alignas(uint64_t)
|
alignas(uint64_t)
|
||||||
std::byte buffer_[sizeof(_Arr)];
|
std::byte buffer_[sizeof(_Arr)];
|
||||||
|
|
||||||
|
/** Metadata record located behind the data buffer */
|
||||||
|
Meta header_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/** discard all cached #testData and recalibrate data generation */
|
/** discard all cached #testData and recalibrate data generation */
|
||||||
static void reseed();
|
static void reseed();
|
||||||
|
|
@ -86,9 +97,11 @@ namespace test {
|
||||||
* an already destroyed TestFrame instance */
|
* an already destroyed TestFrame instance */
|
||||||
static bool isDead (void* memLocation);
|
static bool isDead (void* memLocation);
|
||||||
|
|
||||||
bool isAlive() const;
|
bool isAlive() const;
|
||||||
bool isDead() const;
|
bool isDead() const;
|
||||||
bool isSane() const;
|
bool isSane() const;
|
||||||
|
bool isValid() const;
|
||||||
|
bool isPristine() const;
|
||||||
|
|
||||||
bool operator== (void* memLocation) const;
|
bool operator== (void* memLocation) const;
|
||||||
|
|
||||||
|
|
@ -102,7 +115,12 @@ namespace test {
|
||||||
private:
|
private:
|
||||||
bool contentEquals (TestFrame const& o) const;
|
bool contentEquals (TestFrame const& o) const;
|
||||||
bool verifyData() const;
|
bool verifyData() const;
|
||||||
void buildData ();
|
HashVal buildData();
|
||||||
|
Meta& accessHeader();
|
||||||
|
Meta const& accessHeader() const;
|
||||||
|
StageOfLife currStage() const;
|
||||||
|
HashVal computeChecksum() const;
|
||||||
|
bool hasValidChecksum() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -17766,9 +17766,7 @@
|
||||||
</html></richcontent>
|
</html></richcontent>
|
||||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1664546786666" ID="ID_418065847" MODIFIED="1664546893122" TEXT="links-Klick">
|
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1664546786666" ID="ID_418065847" MODIFIED="1664546893122" TEXT="links-Klick">
|
||||||
<richcontent TYPE="NOTE"><html>
|
<richcontent TYPE="NOTE"><html>
|
||||||
<head>
|
<head/>
|
||||||
|
|
||||||
</head>
|
|
||||||
<body>
|
<body>
|
||||||
<p>
|
<p>
|
||||||
Ja, wir wollen das alte Blender-Modell: Selektion mit rechts, Aktion mit links
|
Ja, wir wollen das alte Blender-Modell: Selektion mit rechts, Aktion mit links
|
||||||
|
|
@ -18605,9 +18603,7 @@
|
||||||
<icon BUILTIN="button_ok"/>
|
<icon BUILTIN="button_ok"/>
|
||||||
<node CREATED="1664031831907" ID="ID_701574899" MODIFIED="1664031980972" TEXT="Problem: reaktiv getriggert">
|
<node CREATED="1664031831907" ID="ID_701574899" MODIFIED="1664031980972" TEXT="Problem: reaktiv getriggert">
|
||||||
<richcontent TYPE="NOTE"><html>
|
<richcontent TYPE="NOTE"><html>
|
||||||
<head>
|
<head/>
|
||||||
|
|
||||||
</head>
|
|
||||||
<body>
|
<body>
|
||||||
<p>
|
<p>
|
||||||
Bedingt durch das Aufrufschema können wir nicht zu Beginn steuernd eingreifen, sondern wir können nur erkennen, wenn das Sub-Widget (aus welchen Gründen auch immer) den extension-constraint verletzt. Und wir bekommen keine direkten Wirkfaktoren in die Hand (weil sich die Ausdehnung aus einem komplexen Zusammenspiel von Font, Pixelgröße und Styles ergibt)
|
Bedingt durch das Aufrufschema können wir nicht zu Beginn steuernd eingreifen, sondern wir können nur erkennen, wenn das Sub-Widget (aus welchen Gründen auch immer) den extension-constraint verletzt. Und wir bekommen keine direkten Wirkfaktoren in die Hand (weil sich die Ausdehnung aus einem komplexen Zusammenspiel von Font, Pixelgröße und Styles ergibt)
|
||||||
|
|
@ -18907,9 +18903,7 @@
|
||||||
</node>
|
</node>
|
||||||
<node COLOR="#33565a" CREATED="1664725271351" HGAP="38" ID="ID_1918462068" MODIFIED="1664727540441" TEXT="erfüllt(cW)?" VSHIFT="-10">
|
<node COLOR="#33565a" CREATED="1664725271351" HGAP="38" ID="ID_1918462068" MODIFIED="1664727540441" TEXT="erfüllt(cW)?" VSHIFT="-10">
|
||||||
<richcontent TYPE="NOTE"><html>
|
<richcontent TYPE="NOTE"><html>
|
||||||
<head>
|
<head/>
|
||||||
|
|
||||||
</head>
|
|
||||||
<body>
|
<body>
|
||||||
<p>
|
<p>
|
||||||
BEDINUNG: cW > aktuelleWeite
|
BEDINUNG: cW > aktuelleWeite
|
||||||
|
|
@ -19247,9 +19241,7 @@
|
||||||
</node>
|
</node>
|
||||||
<node CREATED="1664836501374" ID="ID_915287836" MODIFIED="1672764716013" TEXT="Kein Problem: Layout-Handling-Code läuft vor dem nächsten DRAW">
|
<node CREATED="1664836501374" ID="ID_915287836" MODIFIED="1672764716013" TEXT="Kein Problem: Layout-Handling-Code läuft vor dem nächsten DRAW">
|
||||||
<richcontent TYPE="NOTE"><html>
|
<richcontent TYPE="NOTE"><html>
|
||||||
<head>
|
<head/>
|
||||||
|
|
||||||
</head>
|
|
||||||
<body>
|
<body>
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
|
|
@ -20064,9 +20056,7 @@
|
||||||
</node>
|
</node>
|
||||||
<node COLOR="#435e98" CREATED="1665972100310" ID="ID_1747925228" MODIFIED="1666285341589" TEXT="seltsam? in den bisherigen Experimenten war das nie ein Problem">
|
<node COLOR="#435e98" CREATED="1665972100310" ID="ID_1747925228" MODIFIED="1666285341589" TEXT="seltsam? in den bisherigen Experimenten war das nie ein Problem">
|
||||||
<richcontent TYPE="NOTE"><html>
|
<richcontent TYPE="NOTE"><html>
|
||||||
<head>
|
<head/>
|
||||||
|
|
||||||
</head>
|
|
||||||
<body>
|
<body>
|
||||||
<p>
|
<p>
|
||||||
...denn ich ging von der Annahme aus, daß dieser Code erst im nachfolgenden draw()-Event aufgerufen wird; und diese Annahme hatte sich bisher stets bestätigt, obwohl im ctor von ElementBox direkt ein show_all() aufgerufen wird
|
...denn ich ging von der Annahme aus, daß dieser Code erst im nachfolgenden draw()-Event aufgerufen wird; und diese Annahme hatte sich bisher stets bestätigt, obwohl im ctor von ElementBox direkt ein show_all() aufgerufen wird
|
||||||
|
|
@ -21315,9 +21305,7 @@
|
||||||
</node>
|
</node>
|
||||||
<node CREATED="1575221690053" ID="ID_391530319" MODIFIED="1575221756022" TEXT="genau diese Info aber brauche ich">
|
<node CREATED="1575221690053" ID="ID_391530319" MODIFIED="1575221756022" TEXT="genau diese Info aber brauche ich">
|
||||||
<richcontent TYPE="NOTE"><html>
|
<richcontent TYPE="NOTE"><html>
|
||||||
<head>
|
<head/>
|
||||||
|
|
||||||
</head>
|
|
||||||
<body>
|
<body>
|
||||||
<p>
|
<p>
|
||||||
denn der Display/Manager bzw Canvas ist zwar "quasi global", aber eben nicht wirklich, denn er ist für eine Timeline zuständig. Also genau die Art Relation, für die man typischerweise DI macht
|
denn der Display/Manager bzw Canvas ist zwar "quasi global", aber eben nicht wirklich, denn er ist für eine Timeline zuständig. Also genau die Art Relation, für die man typischerweise DI macht
|
||||||
|
|
@ -24059,9 +24047,7 @@
|
||||||
</node>
|
</node>
|
||||||
<node CREATED="1565273005475" ID="ID_1081606131" MODIFIED="1576282358075" TEXT="aber sinnvoll zum Triggern">
|
<node CREATED="1565273005475" ID="ID_1081606131" MODIFIED="1576282358075" TEXT="aber sinnvoll zum Triggern">
|
||||||
<richcontent TYPE="NOTE"><html>
|
<richcontent TYPE="NOTE"><html>
|
||||||
<head>
|
<head/>
|
||||||
|
|
||||||
</head>
|
|
||||||
<body>
|
<body>
|
||||||
<p>
|
<p>
|
||||||
Es ist sinnvoll, die Feststellung einer Änderung vom Berechnen der neuen Werte zu trennen.
|
Es ist sinnvoll, die Feststellung einer Änderung vom Berechnen der neuen Werte zu trennen.
|
||||||
|
|
@ -39574,9 +39560,7 @@
|
||||||
</node>
|
</node>
|
||||||
<node COLOR="#338800" CREATED="1621011086402" ID="ID_1715852739" MODIFIED="1621013328247" TEXT="dann müssen diese aber auch auf das ClipWidget-Interface">
|
<node COLOR="#338800" CREATED="1621011086402" ID="ID_1715852739" MODIFIED="1621013328247" TEXT="dann müssen diese aber auch auf das ClipWidget-Interface">
|
||||||
<richcontent TYPE="NOTE"><html>
|
<richcontent TYPE="NOTE"><html>
|
||||||
<head>
|
<head/>
|
||||||
|
|
||||||
</head>
|
|
||||||
<body>
|
<body>
|
||||||
<p>
|
<p>
|
||||||
letztlich kein Problem.
|
letztlich kein Problem.
|
||||||
|
|
@ -41915,9 +41899,7 @@
|
||||||
</body>
|
</body>
|
||||||
</html></richcontent>
|
</html></richcontent>
|
||||||
<richcontent TYPE="NOTE"><html>
|
<richcontent TYPE="NOTE"><html>
|
||||||
<head>
|
<head/>
|
||||||
|
|
||||||
</head>
|
|
||||||
<body>
|
<body>
|
||||||
<p>
|
<p>
|
||||||
Wir nutzen explizit aus, daß das Ergebnis durch truncating quantisiert wird (Integer-Division). Daher können wir erst den ersten Dividenden (die Zeitspanne) aufteilen, und zwar erst mal in den Sekunden-Anteil, dann den Rest, und dann den Rest vom Rest
|
Wir nutzen explizit aus, daß das Ergebnis durch truncating quantisiert wird (Integer-Division). Daher können wir erst den ersten Dividenden (die Zeitspanne) aufteilen, und zwar erst mal in den Sekunden-Anteil, dann den Rest, und dann den Rest vom Rest
|
||||||
|
|
@ -43225,9 +43207,7 @@
|
||||||
<node CREATED="1670718042479" ID="ID_1099895360" MODIFIED="1670718073999" TEXT="⟹ dd/dn < 1e-9 wird gefärlich">
|
<node CREATED="1670718042479" ID="ID_1099895360" MODIFIED="1670718073999" TEXT="⟹ dd/dn < 1e-9 wird gefärlich">
|
||||||
<node CREATED="1670718077402" ID="ID_1523825947" MODIFIED="1670718152194" TEXT="der Vorfaktor ist minimal 1.1 (bzw 2 für ganze Pixel)">
|
<node CREATED="1670718077402" ID="ID_1523825947" MODIFIED="1670718152194" TEXT="der Vorfaktor ist minimal 1.1 (bzw 2 für ganze Pixel)">
|
||||||
<richcontent TYPE="NOTE"><html>
|
<richcontent TYPE="NOTE"><html>
|
||||||
<head>
|
<head/>
|
||||||
|
|
||||||
</head>
|
|
||||||
<body>
|
<body>
|
||||||
<p>
|
<p>
|
||||||
minimale Pixel-Zahl 1px. Mit 1/10 Band dann 1.1, mit 1px-Band 2
|
minimale Pixel-Zahl 1px. Mit 1/10 Band dann 1.1, mit 1px-Band 2
|
||||||
|
|
@ -44003,9 +43983,7 @@
|
||||||
<icon BUILTIN="button_ok"/>
|
<icon BUILTIN="button_ok"/>
|
||||||
<node COLOR="#338800" CREATED="1668474155145" ID="ID_132764069" MODIFIED="1668474234849" TEXT="ein Beispiel mit Nenner nahe INT_MAX">
|
<node COLOR="#338800" CREATED="1668474155145" ID="ID_132764069" MODIFIED="1668474234849" TEXT="ein Beispiel mit Nenner nahe INT_MAX">
|
||||||
<richcontent TYPE="NOTE"><html>
|
<richcontent TYPE="NOTE"><html>
|
||||||
<head>
|
<head/>
|
||||||
|
|
||||||
</head>
|
|
||||||
<body>
|
<body>
|
||||||
<p>
|
<p>
|
||||||
Rat poison = (MAXI-88)/(MAXI/7);
|
Rat poison = (MAXI-88)/(MAXI/7);
|
||||||
|
|
@ -45687,9 +45665,7 @@
|
||||||
</node>
|
</node>
|
||||||
<node CREATED="1541552832731" ID="ID_346770424" MODIFIED="1576282358021" TEXT="bricht die Subsidiarität">
|
<node CREATED="1541552832731" ID="ID_346770424" MODIFIED="1576282358021" TEXT="bricht die Subsidiarität">
|
||||||
<richcontent TYPE="NOTE"><html>
|
<richcontent TYPE="NOTE"><html>
|
||||||
<head>
|
<head/>
|
||||||
|
|
||||||
</head>
|
|
||||||
<body>
|
<body>
|
||||||
<p>
|
<p>
|
||||||
...denn dann müßte das Attribut
|
...denn dann müßte das Attribut
|
||||||
|
|
@ -46019,9 +45995,7 @@
|
||||||
</node>
|
</node>
|
||||||
<node CREATED="1523019770144" ID="ID_435980488" MODIFIED="1557498707234">
|
<node CREATED="1523019770144" ID="ID_435980488" MODIFIED="1557498707234">
|
||||||
<richcontent TYPE="NODE"><html>
|
<richcontent TYPE="NODE"><html>
|
||||||
<head>
|
<head/>
|
||||||
|
|
||||||
</head>
|
|
||||||
<body>
|
<body>
|
||||||
<p>
|
<p>
|
||||||
(GlobalCtx)->WindowLocator-><b>UIComponentAccessor</b>
|
(GlobalCtx)->WindowLocator-><b>UIComponentAccessor</b>
|
||||||
|
|
@ -46219,9 +46193,7 @@
|
||||||
</node>
|
</node>
|
||||||
<node CREATED="1448078473068" ID="ID_510866826" MODIFIED="1576282358017" TEXT="zerstören">
|
<node CREATED="1448078473068" ID="ID_510866826" MODIFIED="1576282358017" TEXT="zerstören">
|
||||||
<richcontent TYPE="NOTE"><html>
|
<richcontent TYPE="NOTE"><html>
|
||||||
<head>
|
<head/>
|
||||||
|
|
||||||
</head>
|
|
||||||
<body>
|
<body>
|
||||||
<p>
|
<p>
|
||||||
heißt: Element deregistriert sich am UI-Bus
|
heißt: Element deregistriert sich am UI-Bus
|
||||||
|
|
@ -46334,9 +46306,7 @@
|
||||||
<icon BUILTIN="pencil"/>
|
<icon BUILTIN="pencil"/>
|
||||||
<node CREATED="1448078811895" ID="ID_1266803050" MODIFIED="1518487921085">
|
<node CREATED="1448078811895" ID="ID_1266803050" MODIFIED="1518487921085">
|
||||||
<richcontent TYPE="NODE"><html>
|
<richcontent TYPE="NODE"><html>
|
||||||
<head>
|
<head/>
|
||||||
|
|
||||||
</head>
|
|
||||||
<body>
|
<body>
|
||||||
<p>
|
<p>
|
||||||
Nachricht an <i>irgend ein</i> Wurzel-Element
|
Nachricht an <i>irgend ein</i> Wurzel-Element
|
||||||
|
|
@ -56799,6 +56769,40 @@
|
||||||
</node>
|
</node>
|
||||||
<node COLOR="#338800" CREATED="1731900530433" ID="ID_1117088425" MODIFIED="1731900545903" TEXT="den Basis-Seed mit einem minimal-Spread aufbauen">
|
<node COLOR="#338800" CREATED="1731900530433" ID="ID_1117088425" MODIFIED="1731900545903" TEXT="den Basis-Seed mit einem minimal-Spread aufbauen">
|
||||||
<icon BUILTIN="button_ok"/>
|
<icon BUILTIN="button_ok"/>
|
||||||
|
<node CREATED="1731943389399" ID="ID_39230986" MODIFIED="1731943552546">
|
||||||
|
<richcontent TYPE="NODE"><html>
|
||||||
|
<head/>
|
||||||
|
<body>
|
||||||
|
<p>
|
||||||
|
Diskriminator-ID ≔ (<font color="#592cc8">seq</font>+1) * (<font color="#6c433b">dataSeed</font>+<font color="#6f0ed0">family</font>)
|
||||||
|
</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
</richcontent>
|
||||||
|
</node>
|
||||||
|
<node CREATED="1731943561624" ID="ID_1209671030" MODIFIED="1731943647377">
|
||||||
|
<richcontent TYPE="NODE"><html>
|
||||||
|
<head/>
|
||||||
|
<body>
|
||||||
|
<p>
|
||||||
|
Erläuterung: jede »family« hat ein eigenes<i> Stepping</i>
|
||||||
|
</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
</richcontent>
|
||||||
|
</node>
|
||||||
|
<node CREATED="1731943679360" ID="ID_1740781453" MODIFIED="1731943717151" TEXT="es kann trotzdem zu Kollisionen kommen — das ist aber für kleine seq-Nr unwahrscheinlich"/>
|
||||||
|
<node CREATED="1731943742648" ID="ID_594247384" MODIFIED="1731943827486" TEXT="gefährlich wäre DataSeed sehr klein oder nahe Max-uint">
|
||||||
|
<richcontent TYPE="NOTE"><html>
|
||||||
|
<head/>
|
||||||
|
<body>
|
||||||
|
<p>
|
||||||
|
...weil es dann passieren könnte, daß für bestimmte Familien die Frames sich nicht mehr unterscheiden
|
||||||
|
</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
</richcontent>
|
||||||
|
</node>
|
||||||
</node>
|
</node>
|
||||||
<node COLOR="#338800" CREATED="1731900560669" ID="ID_553408936" MODIFIED="1731900581648" TEXT="diesen aber ansonsten aus dem default / oder entropy-Generator ziehen">
|
<node COLOR="#338800" CREATED="1731900560669" ID="ID_553408936" MODIFIED="1731900581648" TEXT="diesen aber ansonsten aus dem default / oder entropy-Generator ziehen">
|
||||||
<icon BUILTIN="button_ok"/>
|
<icon BUILTIN="button_ok"/>
|
||||||
|
|
@ -56822,6 +56826,12 @@
|
||||||
<linktarget COLOR="#5b9aaa" DESTINATION="ID_1432722861" ENDARROW="Default" ENDINCLINATION="63;7;" ID="Arrow_ID_1569718697" SOURCE="ID_1990276915" STARTARROW="None" STARTINCLINATION="61;0;"/>
|
<linktarget COLOR="#5b9aaa" DESTINATION="ID_1432722861" ENDARROW="Default" ENDINCLINATION="63;7;" ID="Arrow_ID_1569718697" SOURCE="ID_1990276915" STARTARROW="None" STARTINCLINATION="61;0;"/>
|
||||||
<icon BUILTIN="button_ok"/>
|
<icon BUILTIN="button_ok"/>
|
||||||
</node>
|
</node>
|
||||||
|
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1731944016612" ID="ID_1328551493" MODIFIED="1731944033914" TEXT="definiere Metadaten-Header">
|
||||||
|
<icon BUILTIN="flag-yellow"/>
|
||||||
|
</node>
|
||||||
|
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1731944023419" ID="ID_799758026" MODIFIED="1731944033915" TEXT="lege diesen hinter die Nutzdaten">
|
||||||
|
<icon BUILTIN="flag-yellow"/>
|
||||||
|
</node>
|
||||||
</node>
|
</node>
|
||||||
<node COLOR="#338800" CREATED="1728787025826" ID="ID_1972770219" MODIFIED="1730835694593" TEXT="Accessor und Iteration">
|
<node COLOR="#338800" CREATED="1728787025826" ID="ID_1972770219" MODIFIED="1730835694593" TEXT="Accessor und Iteration">
|
||||||
<icon BUILTIN="button_ok"/>
|
<icon BUILTIN="button_ok"/>
|
||||||
|
|
@ -56864,8 +56874,24 @@
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
|
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1731947552403" ID="ID_604836518" MODIFIED="1731947561332" TEXT="im Header hinterlegen">
|
||||||
|
<icon BUILTIN="flag-yellow"/>
|
||||||
|
</node>
|
||||||
|
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1731947702842" ID="ID_745455518" MODIFIED="1731947715463" TEXT="prüfen">
|
||||||
|
<icon BUILTIN="flag-yellow"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node CREATED="1728786979373" ID="ID_772580400" MODIFIED="1728786987393" TEXT="Metadaten-Erkennung">
|
||||||
|
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1731947576264" ID="ID_767046037" MODIFIED="1731947717471" TEXT="Header-Stamp">
|
||||||
|
<icon BUILTIN="flag-yellow"/>
|
||||||
|
</node>
|
||||||
|
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1731947640352" ID="ID_122461720" MODIFIED="1731947717470" TEXT="Header lokalisieren">
|
||||||
|
<icon BUILTIN="flag-yellow"/>
|
||||||
|
</node>
|
||||||
|
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1731947651342" ID="ID_1504134040" MODIFIED="1731947717470" TEXT="Plausibilitätsprüfung">
|
||||||
|
<icon BUILTIN="flag-yellow"/>
|
||||||
|
</node>
|
||||||
</node>
|
</node>
|
||||||
<node CREATED="1728786979373" ID="ID_772580400" MODIFIED="1728786987393" TEXT="Metadaten-Erkennung"/>
|
|
||||||
<node CREATED="1728786988308" ID="ID_103079985" MODIFIED="1728786992576" TEXT="Prädikate">
|
<node CREATED="1728786988308" ID="ID_103079985" MODIFIED="1728786992576" TEXT="Prädikate">
|
||||||
<node CREATED="1728779817892" ID="ID_882765451" MODIFIED="1728779971755" TEXT="isSane">
|
<node CREATED="1728779817892" ID="ID_882765451" MODIFIED="1728779971755" TEXT="isSane">
|
||||||
<richcontent TYPE="NOTE"><html>
|
<richcontent TYPE="NOTE"><html>
|
||||||
|
|
@ -90423,8 +90449,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
||||||
irgendwie binden wir hier einen Handler ein, der »hinten rum« am Lib-Plugin hängt und dafür einen (privaten) Datentyp konstruiert ⟹ <b>diese</b>  Info muß in den Prototyp eingehen
|
irgendwie binden wir hier einen Handler ein, der »hinten rum« am Lib-Plugin hängt und dafür einen (privaten) Datentyp konstruiert ⟹ <b>diese</b>  Info muß in den Prototyp eingehen
|
||||||
</p>
|
</p>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html></richcontent>
|
||||||
</richcontent>
|
|
||||||
<linktarget COLOR="#df0449" DESTINATION="ID_373306612" ENDARROW="Default" ENDINCLINATION="-44;-51;" ID="Arrow_ID_937144137" SOURCE="ID_1126512651" STARTARROW="None" STARTINCLINATION="151;7;"/>
|
<linktarget COLOR="#df0449" DESTINATION="ID_373306612" ENDARROW="Default" ENDINCLINATION="-44;-51;" ID="Arrow_ID_937144137" SOURCE="ID_1126512651" STARTARROW="None" STARTINCLINATION="151;7;"/>
|
||||||
<icon BUILTIN="messagebox_warning"/>
|
<icon BUILTIN="messagebox_warning"/>
|
||||||
</node>
|
</node>
|
||||||
|
|
@ -92295,14 +92320,13 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
||||||
wirft auch den internen Daten-Cache weg und re-seeded den Basis-Hash, auf dem die Distinction-ID dann aufbaut
|
wirft auch den internen Daten-Cache weg und re-seeded den Basis-Hash, auf dem die Distinction-ID dann aufbaut
|
||||||
</p>
|
</p>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html></richcontent>
|
||||||
</richcontent>
|
|
||||||
</node>
|
</node>
|
||||||
<node CREATED="1731900805220" ID="ID_1253309363" MODIFIED="1731900819630" TEXT="diese reseed() zieht aus dem defaultGen"/>
|
<node CREATED="1731900805220" ID="ID_1253309363" MODIFIED="1731900819630" TEXT="diese reseed() zieht aus dem defaultGen"/>
|
||||||
<node CREATED="1731900821242" ID="ID_1140389439" MODIFIED="1731900831764" TEXT="den kann man somit vorher gezielt seeden"/>
|
<node CREATED="1731900821242" ID="ID_1140389439" MODIFIED="1731900831764" TEXT="den kann man somit vorher gezielt seeden"/>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1728781144210" ID="ID_51267004" MODIFIED="1728781989516" TEXT="Standard Generator-Sequenzen auf jeder Stufe sind unabhängig hierarchisch">
|
<node COLOR="#338800" CREATED="1728781144210" ID="ID_51267004" MODIFIED="1731943356338" TEXT="Standard Generator-Sequenzen auf jeder Stufe sind unabhängig hierarchisch">
|
||||||
<richcontent TYPE="NOTE"><html>
|
<richcontent TYPE="NOTE"><html>
|
||||||
<head/>
|
<head/>
|
||||||
<body>
|
<body>
|
||||||
|
|
@ -92311,7 +92335,10 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
||||||
</p>
|
</p>
|
||||||
</body>
|
</body>
|
||||||
</html></richcontent>
|
</html></richcontent>
|
||||||
<icon BUILTIN="flag-yellow"/>
|
<icon BUILTIN="button_ok"/>
|
||||||
|
<node COLOR="#435e98" CREATED="1731943358292" ID="ID_619750163" MODIFIED="1731943374281" TEXT="ließ sich mit dem neuen »Baukasten« leicht realisieren">
|
||||||
|
<icon BUILTIN="ksmiletris"/>
|
||||||
|
</node>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
|
|
@ -92826,9 +92853,9 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
||||||
</node>
|
</node>
|
||||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1728786385349" ID="ID_442258905" MODIFIED="1731890736163" TEXT="Umbau TestFrame">
|
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1728786385349" ID="ID_442258905" MODIFIED="1731890736163" TEXT="Umbau TestFrame">
|
||||||
<arrowlink COLOR="#713558" DESTINATION="ID_257931093" ENDARROW="Default" ENDINCLINATION="-2466;135;" ID="Arrow_ID_121875527" STARTARROW="None" STARTINCLINATION="-2154;-229;"/>
|
<arrowlink COLOR="#713558" DESTINATION="ID_257931093" ENDARROW="Default" ENDINCLINATION="-2466;135;" ID="Arrow_ID_121875527" STARTARROW="None" STARTINCLINATION="-2154;-229;"/>
|
||||||
|
<linktarget COLOR="#911932" DESTINATION="ID_442258905" ENDARROW="Default" ENDINCLINATION="-554;-1251;" ID="Arrow_ID_1343565956" SOURCE="ID_127090859" STARTARROW="None" STARTINCLINATION="-195;12;"/>
|
||||||
<linktarget COLOR="#77313e" DESTINATION="ID_442258905" ENDARROW="Default" ENDINCLINATION="381;-48;" ID="Arrow_ID_1047269362" SOURCE="ID_936086670" STARTARROW="None" STARTINCLINATION="-36;80;"/>
|
<linktarget COLOR="#77313e" DESTINATION="ID_442258905" ENDARROW="Default" ENDINCLINATION="381;-48;" ID="Arrow_ID_1047269362" SOURCE="ID_936086670" STARTARROW="None" STARTINCLINATION="-36;80;"/>
|
||||||
<linktarget COLOR="#6f2328" DESTINATION="ID_442258905" ENDARROW="Default" ENDINCLINATION="366;-47;" ID="Arrow_ID_1067356199" SOURCE="ID_683548249" STARTARROW="None" STARTINCLINATION="5;52;"/>
|
<linktarget COLOR="#6f2328" DESTINATION="ID_442258905" ENDARROW="Default" ENDINCLINATION="366;-47;" ID="Arrow_ID_1067356199" SOURCE="ID_683548249" STARTARROW="None" STARTINCLINATION="5;52;"/>
|
||||||
<linktarget COLOR="#911932" DESTINATION="ID_442258905" ENDARROW="Default" ENDINCLINATION="-554;-1251;" ID="Arrow_ID_1343565956" SOURCE="ID_127090859" STARTARROW="None" STARTINCLINATION="-195;12;"/>
|
|
||||||
<icon BUILTIN="pencil"/>
|
<icon BUILTIN="pencil"/>
|
||||||
<node COLOR="#338800" CREATED="1730900637026" ID="ID_1500320757" MODIFIED="1731890421828" TEXT="brauche Einfluß auf den PRNG">
|
<node COLOR="#338800" CREATED="1730900637026" ID="ID_1500320757" MODIFIED="1731890421828" TEXT="brauche Einfluß auf den PRNG">
|
||||||
<richcontent TYPE="NOTE"><html>
|
<richcontent TYPE="NOTE"><html>
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue