Saturday, 10 August 2019

'Memory Map'.

... there are abstraction levels, high & low.

High abstraction levels are useful to plan, to experiment, to prototype, to handle complexity, ... to implement as well.

Low abstraction levels are useful foundation, allow to use hardware extremely efficiently, but usually costs are too extreme, costs measured in time, money & other resources.

... years ago a friend borrowed me 'Atari ST Memory Map'. More than list of memory adressess, where to put which digit so certain results can be achieved.

... if i remember correctly, it was a lot of theory and graphical models, not only 'electronic circuits', also theoretical-scientific models, explaining theory that resulted in many electronic circuits, and many other solutions - both hardware and software.

'High abstraction level approach to low abstraction level solutions'.

... why i inform about this on Project Wraithstar?

... it's just an idea to consider - should we - including me, or without me - serve society that way, as well?

Saturday, 3 August 2019

Objects Graph, Complete Model of a Program.

Object Graphs.

Directed Objects Graph / pl: 'Skierowany Graf Obiektów' / can be a complete model of a program, that can be executed. Or it can be a data model as well.

Values of Objects' references/pointers/handles/etc ... are also a part of state, as any variable's value is, as well.

In a Directed Graph / pl: 'Graf Skierowany' / we have 'dots & arrows', 'nodes & arrows'.

In a directed object graph, objects are 'dots/nodes', references/etc are 'arrows'.

Graphs can be either 'directed' or 'undirected', but in this article we don't need to use 'undirected graphs'.


Resources.

Classes are 'objects blueprints', a part of application's static resources.

After Classes are written & ready, objects can be created.

Other resources as graphic image files, dvd iso files, localization text files, etc ... are also a part of application's static configuration, can be used in objects graph as a part/whole of objects graph's initial state.


Graphs, Construction & Program's Execution.

I call objects graph's construction, including initial state's set-up: 'Configuration', 'Application Configuration', 'Object Graph Configuration'.

Different versions of application are just different objects graphs, with different initial state. Different versions sometimes do not need to be backward-compatible, sometimes are wholly different software - more than functionality reductions and new functionality additions. Code should be reusable, usable in many projects.

Objects graph configuration can be done manually - in one of 'entry points' to application, or tools as Java's
'Spring Framework' with it's 'xml configuration' can be used.

After objects graph is configured, we can 'launch' a proper entry point / for example: one of main(...) methods /, so application starts.


We can have many 'entry points', and many 'root objects' ... but eventually we might need to choose which 'entry point' to use at that moment, which 'application/version' to run this time.


Summarizing, object-oriented application's development & launch goes through following phases:
1. Write Classes,
2. Construct Objects Graph, setting-up initial state using 'hardcoded' data and 'static resources' as well.
3. Launch one of Entry Points, providing values to arguments if neccessary.
4. Application starts, can enter 'Dynamic Initialization Phase' - if needed,
5. Applicaion switches to 'Running Phase', starts doing it's job,
6. ...

Monday, 29 July 2019

Linda as Database Management System.

Database is data, Database Management System / DBMS / is software that keeps and manipulates database.

There are many Database Management Systems, from Relational Database Management Systems / RDBMS /, to Object Oriented Database Management Systems / OODMBS /, to Hierarchical Database Management Systems, perhaps more.

SQL, language-interface with RDBMS is so holy, as RDBMS have STRONG Roots in Mathematics, Relational Algebra.

... in a way it's powerful, but still complex and unelegant, i think.

... there are Views / pl: Widoki /, PL/SQL, Events - Triggers / pl: Zdarzenia - Wyzwalacze /, Transactions, / pl: Transakcje /, ACID properties, Transaction Isolation Levels / pl: Poziomy Izolacji Transakcji /, Normal Forms at various 'levels' / Pierwsza Postać Normalna, Druga Postać Normalna, ... /, ... Database Tuning / pl: Strojenie Baz Danych / , ... far more.

... i even heard a complaint that someone preferred to store 'XML files in database' instead of proper handling data in relation tables, as a consequence of software-database operations complexity & frustration.

... i am very far from Database Admin expertise levels - it's quite Ambitious & Unappreciated Way ... but still ... it's not my way.

... i don't know anything about Data Warehousing / pl: Hurtownie Danych /, BIG DATA, Data Mining, etc.

... i think Database Tuning is optimization, of either whole Database/DBMS, or it's parts. There are many aspects to optimize - optimizing one/few things at cost of other thing(s).


There are important abstractions over RDBMS, as Java's Hibernate - for example - important bridge between 'Object Oriented Solutions' and RDBMS.

... but i think 'bridge' is not enough, we need simpler ways.


Linda has potential for being new DBMS tool as well, among it's other uses - perhaps many other uses.

Both Linda, as well as Relational Database Management Systems use the idea of a Tuple / pl: Krotka /.

... i think it's important to emphasize that without Transactions Support, any of Database Management Systems is lacking, not good enough to be used commercially ... so Linda also needs Transactions Support if it is to be used as DBMS.

Compared with RDBMS systems, Linda is far simpler, and has very elegant & nice, scientific notation - which can motivate computer programmers, can make their work easier, more enjoyable, quicker.


... in my approach to Linda implementation, Tuples can contain nested / pl: zagnieżdżone / Tuples as well, at theoretically any depth(s) - thanks to that it can store object graphs, with precisely defined state ... and can have many other uses as well.

... but let's not lay / lie so lazily in that 'nest', anyway. ;)

... is including 'lazy evaluation' so lazy?


... i think we should consider both cyclic and acyclic objects graphs if we want this idea to be realized - an idea of using Linda as DBMS.

Perhaps cyclic graphs should have sorted map data structure 'attached', data structure where object names are keys and references to objects are values. That way, as we 'search' through objects graph, we can 'store aside' information about names of objects visited - and avoid proceeding into infinite loop.


Considering Linda-based DBMS requirements - to be able to store object graphs correctly - abstraction, concretization, and inheritance hierarchy issues should be considered as well.


... i think 'read' operation should be fast, it should be one of most important, or perhaps even the most important objective ... then search operation speed can be quite fast.

... is avoiding/defeating data redundancy / pl: redundancja danych, powielanie danych / more important than read/search speed?

... what is more important - addressing 'data redundancy' or addressing 'single point of failure' issues? ... are solutions to these issues mutually exclusive?

... what other needs people require from this 'project'? ... i am open to wishes, suggestions, requests - not only from computer scientists & engineers.

... by serving people that way, i'll try to create market needs - so don't worry about asking, i'll benefit from that as well.

... let's be wary about 'abuses', 'unneccessary intermediaries', 'poisonous people', 'non-symbiotic parasites', etc, ... however.


... see also, if You wish, need, ... : Linda & Tuple Space.

Friday, 17 May 2019

Success Metrics & Risk Management in Software Development.

Software projects are considered success when:
1. Completed on time,
2. Without exceeding resources budget.

In software development there are many unknown factors.

Developers do not know which software parts work well with which software/hardware parts.

In theory, anything can be done - but at differing time/resource costs.

Worst risks to time/resources should be addressed first:
1. Business/Development Team should organize a meeting and consider dangers/risks - not only from technological/scientific perspective,
2. Dangers/Risks should be analyzed and prioritized, from worst to least,
3. Unknown factors are risks as well, the less we know - the worse risk/danger potential,
4. Research & Prototyping are tools for assessing whether something can be done within given time/resources budget costraints. This should be one of the first phases of development.

Without these steps, unhandled risks can backfire in form of excess of resources needed, and/or in form of software development time exceeding the deadline(s).

As time flows, reality changes and customer requirements might change as well.

This is also risk, usually handled by extra time and resources allocation to project's total costs - as well as by adopting iterative development methods / as opposed to outdated 'waterfall' model, in which customers' requirement changes are not allowed by business contract /.

High quality projects should also offer 'limited warranty' time - where bugfixing and minor corrections are included in project's cost, for a given time - after closing the project.

Software quality procedures allow for faster and less expensive changes - both bugfixing and functionality changes - but customers usually do not know how to assess software's quality, and prefer to not overinvest in quality procedures they can't understand.


Sunday, 24 March 2019

'Immobilizer' Software Protection Method.

... i got a hint of this secret high-tech project during my professional career.

Basics of making it work are:
- Connection to server(s). Without it software/hardware 'freezes' and activity is logged in persistent memory.
- Part of code downloading from server.
- Cooperation with a detective agency, in case of suspicious activity detected by AI.

Breaking it is hard, requires reverse-engineering and provides only a 'snapshot' of software, denying updates.

Perhaps using Events is a good idea for decoupling objects and propagating lockdown state across parts of the protected application.


--
Obfuscators are also good tools that help to protect software.

Wednesday, 5 September 2018

Linda & Tuple Space.

Introduction.

Linda & tuple space are work of Gelernter.

Linda is name derived from porn actress: Linda Lovelace, who later became 'a born again Christian' and a spokeswoman for the anti-pornography movement.




-=- Linda Lovelace. -=-



Linda is a language or notation that is used with tuple spaces, a mechanism that has uses in processes concurrency & synchronization.

There's one big and global tuple space. Processes communicate with each other by putting in the tuple space messages, and by retrieving from tuple space.

Processes are isolated, do not need to know anything about each other, processes do not need to exist at the same time. This helps to decouple objects, increasing software's quality.


'Tuple Space' has uses in the 'Token Game' - for modelling 'places', where tokens are stored, as well. Token Game uses Petri Nets idea, abstracted & concretized different way. Petri Nets are also called P/T Nets or Places / Transition Nets.


Tuple Type, Signature & State.

Tuple's signature is ordered list of data types stored in a tuple.

Tuple has statically determined length.

Tuple's state is it's values written in a binary format, concatenated.

In original work of Gelernter, tuple wasn's a type so a tuple could not contain tuples within. For 'Project Wraithstar's' purposes, tuple is a type.


Simple operations on the tuple space.

* Output(t)

Because of Linda being distributed asynchronous mechanism with the buffer of unlimited size, operation that puts a tuple into space is a nonblocking operation.

Tuple Space should be treated as a Multi-Set, that allows for putting multiple tuples of the same signature and state.

Operation Output(t) puts a tuple into a tuple space. If a tuple t is already present in the tuple space, another copy of t is put in the tuple space.


* Input(s)

A blocking operation that removes a tuple from space. Argument for this method is tuple's signature, for example:

Input(x: int32, c: char) / exact syntax in 'Ola' Programming Language is to be determined still /

If at a given moment there's no tuple with a given signature in the tuple space, then a process performing Input is blocked until requested tuple appears in the tuple space.

In original work of Gelernter, if tuple space contains many tuples with a given signature, then a choice of removed tuple is nondeterministic. There's a rule of fairness in original work as well, but for purpose of 'Project Wraithstar' - we'll assume that tuples with a given signature are put and removed as in a FIFO queue. Similarly processess that attempt to remove a tuple should use a timestamp associated with a request, as a part of UUID / Universally Unique ID /.


* Read(s)

Similar to Input(s), Read(s) retrieves a tuple with it's data from the tuple space - but does not remove it from tuple space.

Read(s) is a blocking operation, and depending on timestamps & UUIDs processess removing or retrieving tuple might be awakened in varying orders & amounts.


* Try_Input(s) and Try_Read(s).

Nonblocking versions of Input(s) and Read(s) methods.


Selective Choice.

There's option of specifying values of tuple's selected elements, of a tuple we wish to remove / retrieve from a tuple space.

For example we can remove a tuple with a signature (int32, char, int32) whose first value is 3. Appropriate instruction looks as follows:

Input(3, c: char, x: int32)


There are differencies between instruction semantics:
- Input (x, c)
- Input (x: int32, c)
- Input (x, c: char)
- Input (x: int32, c: char)


Gaps.

Linda has one more extension. In the tuple space, there can be stored tuples with 'gaps'.

'Gap' is a 'value' of a specified type, that 'matches' to any value of this type.

Gaps are noted as a star with a type.

For example, a tuple:

(3, * : char, 'a', * : int32)

Is a tuple with a signature:

(int32, char, char, int32)

Containing two gaps: on a second and fourth position.


Such tuple can be retrieved or removed from a tuple space, by performing any of given operations:

Input (3, 'c', x: char, 8)
Input (i: int32, x: char, 'a', j: int32)


Let's notice that every 'gap' has a strictly given type.


For putting gapped tuples into space, method Output can be used. In a gap-place we'll just write a type with a variable name, but variable name has no meaning here.

Output (3, c: char)

Will put into tuple space a tuple, that on a second coordinate has a type and is a gap.


Links.
- Linda as Database Management System,
- A written lecture about Linda, in a polish language,
- Linda & Concurrency,
- Tuple Data Type.

Sunday, 15 July 2018

Software Development & Quality.

Introduction.

There are many methods for ensuring that software development proceeds smoothly, and there are methods for ensuring and measuring software artifacts' quality.

Artifacts are documents:
- design model,
- application code,
- automated tests code,
- documentation,
- configuration files,
- resource files as art or other data,
- ...


Code's Quality.

For a code quality's practices, see if You wish:
- A few thoughts on code quality...


Teamwork vs. Showoff.

Teamwork is Professional, needless showoff is NOT Professional.

Code should be written & documented in a simple way, so other co-workers can understand it with ease.

This friendly approach - of making teamwork easier helps the most newcomers - either beginner programmers, or programmers who worked with different Programming Language(s), Tools, Ecosystem, Technology(-ies).


Automated Testing.

For automated testing article, see if You wish:
- Automated Tests.


Design & Modelling.

Software models, often presented in a graphical way, are tools to look at software's design from a 'bird's view', to grasp whole picture.

Software modelling and design's goal is to abstract & simplify project.

Designs should be as simple and as abstract as possible - as this allows for easier code modifications as reality and customer's needs change.

... but of course modelling a single object with name 'idea' is too unreasonable interpretation of above words.

There are 'views' of a model as well - each view serves a purpose - each of views is a transformed model, both reduced and filled with details, to emphasize it's purpose.

For example we can have model consisting of every of car's parts, then we can produce a view of engine - fuel interaction. Unneccessary parts for this view are omitted, and more details about heat, and other aspects can be provided in view's documentation.

Models and views can be more or less exhaustive and detailed, and always should be unambiguous.