• Java and OpenJFX or JavaScript and WHATWG?

    From Mild Shock@janburse@fastmail.fm to comp.lang.prolog on Tue Jun 17 10:47:07 2025
    From Newsgroup: comp.lang.prolog

    Somebody wrote:

    noticeable lag waiting for completion candidates

    A lag wouldn’t be a problem. I guess the problem
    is that the GUI gets blocked, right? If your GUI
    has tasks and timers, you could try the follow:

    - Debouncing Timer: To start ghost after lets
    say 1000 ms, the debouncing is to assure that
    the ghost appears after the last edit and not
    after the first edit.

    - Abortable Task: The ghost is then computed
    asynchronously via a task. But this task is
    again tied to the debouncing, means the task
    gets aborted if the end-user shows impatience.

    I checked a couple of GUI tools to do that. Had
    rather bad experience with Java and OpenJFX, so I
    am returning back to the JavaScript and WHATWG
    with my ongoing research.

    SVG tags were not working out the box https://wiki.openjdk.org/display/OpenJFX/Main

    No runLater(), any task can any time modify the DOM!
    https://whatwg.org/

    But maybe there are other GUI frameworks which
    can do it. If tasks are also used for highlighting
    I belive they can be also run asynchronously without
    explicitly juggling with some queues,

    just await the asynchrous routine that the task
    would execute, in a instrumentation loop, and ignore
    the aborts, since an abort is now good news and not
    bad news, it only indicates that

    the end user did an edit and that the task
    will be restartet.
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Mild Shock@janburse@fastmail.fm to comp.lang.prolog on Tue Jun 17 10:49:36 2025
    From Newsgroup: comp.lang.prolog


    The restart maybe explains why IntelliJ has a
    Power Safe mode, but I am not 100% sure about
    the details. But if the end-user behaviour is
    not compatible with the chosen delays, he might

    tear down the tasks again and again. This could
    use compute power. Some incremental tasks or tasks
    that block (i.e. the "lag") could be a solution.
    Incremental tasks that do only small work and

    not big work, are less perceived as blocking
    (i.e. the lag). But a ghost text that maybe
    involves calling an Artificial Intelligence API
    is probably in nature not a small work task,

    in the sense that it would occupy a short work
    time, the Artificial Intelligence API server
    might be busy and cause a task slow down.

    Disclaimer: I am doing some brain writing here...

    Mild Shock schrieb:
    Somebody wrote:

    noticeable lag waiting for completion candidates

    A lag wouldn’t be a problem. I guess the problem
    is that the GUI gets blocked, right? If your GUI
    has tasks and timers, you could try the follow:

    - Debouncing Timer: To start ghost after lets
      say 1000 ms, the debouncing is to assure that
      the ghost appears after the last edit and not
      after the first edit.

    - Abortable Task: The ghost is then computed
      asynchronously via a task. But this task is
      again tied to the debouncing, means the task
      gets aborted if the end-user shows impatience.

    I checked a couple of GUI tools to do that. Had
    rather bad experience with Java and OpenJFX, so I
    am returning back to the JavaScript and WHATWG
    with my ongoing research.

    SVG tags were not working out the box https://wiki.openjdk.org/display/OpenJFX/Main

    No runLater(), any task can any time modify the DOM!
    https://whatwg.org/

    But maybe there are other GUI frameworks which
    can do it. If tasks are also used for highlighting
    I belive they can be also run asynchronously without
    explicitly juggling with some queues,

    just await the asynchrous routine that the task
    would execute, in a instrumentation loop, and ignore
    the aborts, since an abort is now good news and not
    bad news, it only indicates that

    the end user did an edit and that the task
    will be restartet.

    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Mild Shock@janburse@fastmail.fm to comp.lang.prolog on Tue Jun 17 16:17:17 2025
    From Newsgroup: comp.lang.prolog

    Hi,

    The fukkers stole my name:

    Jan - Local AI Assistant
    https://github.com/menloresearch/jan

    Bye

    P.S.: Meanwhile I am struggling with Quantum Paper
    whille doing a dark/light CSS. Look my light olive turned dark
    olive, that is somewhere near chocolate or is it dog shit?

    P.P.S.: Just figured out yesterday that some browser defaults
    are more Motif/OSF than Material/Google, aka Quantum Paper.

    Mild Shock schrieb:

    The restart maybe explains why IntelliJ has a
    Power Safe mode, but I am not 100% sure about
    the details. But if the end-user behaviour is
    not compatible with the chosen delays, he might

    tear down the tasks again and again. This could
    use compute power. Some incremental tasks or tasks
    that block (i.e. the "lag") could be a solution.
    Incremental tasks that do only small work and

    not big work, are less perceived as blocking
    (i.e. the lag). But a ghost text that maybe
    involves calling an Artificial Intelligence API
    is probably in nature not a small work task,

    in the sense that it would occupy a short work
    time, the Artificial Intelligence API server
    might be busy and cause a task slow down.

    Disclaimer: I am doing some brain writing here...

    Mild Shock schrieb:
    Somebody wrote:

    noticeable lag waiting for completion candidates

    A lag wouldn’t be a problem. I guess the problem
    is that the GUI gets blocked, right? If your GUI
    has tasks and timers, you could try the follow:

    - Debouncing Timer: To start ghost after lets
       say 1000 ms, the debouncing is to assure that
       the ghost appears after the last edit and not
       after the first edit.

    - Abortable Task: The ghost is then computed
       asynchronously via a task. But this task is
       again tied to the debouncing, means the task
       gets aborted if the end-user shows impatience.

    I checked a couple of GUI tools to do that. Had
    rather bad experience with Java and OpenJFX, so I
    am returning back to the JavaScript and WHATWG
    with my ongoing research.

    SVG tags were not working out the box
    https://wiki.openjdk.org/display/OpenJFX/Main

    No runLater(), any task can any time modify the DOM!
    https://whatwg.org/

    But maybe there are other GUI frameworks which
    can do it. If tasks are also used for highlighting
    I belive they can be also run asynchronously without
    explicitly juggling with some queues,

    just await the asynchrous routine that the task
    would execute, in a instrumentation loop, and ignore
    the aborts, since an abort is now good news and not
    bad news, it only indicates that

    the end user did an edit and that the task
    will be restartet.


    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Mild Shock@janburse@fastmail.fm to comp.lang.prolog on Thu Jun 19 14:04:03 2025
    From Newsgroup: comp.lang.prolog

    Hi,

    Somebody wrote:

    Right, but what I’m saying is that with the
    current implementation as a separate process,
    running independently of the editor and only
    communicating over the channel defined by the
    protocol, the ability to have fine-grained
    asynchronous communication is limited.

    Not my problem not seeking the state of the art. You
    need of course a Prolog system that is all flesh
    and blood cooperative multitasking. If you want

    to do a GUI in Prolog similar like JavaScript
    does it now, or a native GUI adapter. And I don't
    count Tau-Prolog, although they showed amazing

    stuff. But not amazing enough, still based
    on continuations, and not based on promises. Or then
    async/await. I am not sure what SWI WASM now delivers?

    SWI Tinker shows me errors talking about threads when
    I use the query background execution feature and if I
    abort. But people from cooperative multitasking tend

    to not use the terminology "thread", they prefer to
    talk about "tasks". Ciao Playground doesn't count either,
    since their channels to a background worker can even

    not process an interrupt correctly.

    Bye

    Mild Shock schrieb:
    Hi,

    The fukkers stole my name:

    Jan - Local AI Assistant
    https://github.com/menloresearch/jan

    Bye

    P.S.: Meanwhile I am struggling with Quantum Paper
    whille doing a dark/light CSS. Look my light olive turned dark
    olive, that is somewhere near chocolate or is it dog shit?

    P.P.S.: Just figured out yesterday that some browser defaults
    are more Motif/OSF than Material/Google, aka Quantum Paper.
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Mild Shock@janburse@fastmail.fm to comp.lang.prolog on Thu Jun 19 14:11:40 2025
    From Newsgroup: comp.lang.prolog

    Hi,

    When did the quantum leap happen in Dogelog Player?
    Well very early on: The first binary release was here:

    ANN: Dogelog Player 0.9.7
    The new version 0.9.7 of the Dogelog
    player now masters DCG.
    Admin User, created 09/06/2025

    And '$YIELD'/1 stuff came 9 months (sic!) later:

    ANN: Dogelog Player 0.9.8
    The Dogelog Player supports a new interpreter
    that can relinquish control.
    Admin User, created 21/03/2022

    See for your self:

    https://www.xlog.ch/izytab/doclet/home/12_news/package.html

    9 months, like Homo sapiens gestation period. (*)

    LoL

    Bye

    (*) To be frank, it was the perfect pass time during
    the COVID-19 pandemic.

    Mild Shock schrieb:
    Hi,

    Somebody wrote:

    Right, but what I’m saying is that with the
    current implementation as a separate process,
    running independently of the editor and only
    communicating over the channel defined by the
    protocol, the ability to have fine-grained
    asynchronous communication is limited.

    Not my problem not seeking the state of the art. You
    need of course a Prolog system that is all flesh
    and blood cooperative multitasking. If you want

    to do a GUI in Prolog similar like JavaScript
    does it now, or a native GUI adapter. And I don't
    count Tau-Prolog, although they showed amazing

    stuff. But not amazing enough, still based
    on continuations, and not based on promises. Or then
    async/await. I am not sure what SWI WASM now delivers?

    SWI Tinker shows me errors talking about threads when
    I use the query background execution feature and if I
    abort. But people from cooperative multitasking tend

    to not use the terminology "thread", they prefer to
    talk about "tasks". Ciao Playground doesn't count either,
    since their channels to a background worker can even

    not process an interrupt correctly.

    Bye

    Mild Shock schrieb:
    Hi,

    The fukkers stole my name:

    Jan - Local AI Assistant
    https://github.com/menloresearch/jan

    Bye

    P.S.: Meanwhile I am struggling with Quantum Paper
    whille doing a dark/light CSS. Look my light olive turned dark
    olive, that is somewhere near chocolate or is it dog shit?

    P.P.S.: Just figured out yesterday that some browser defaults
    are more Motif/OSF than Material/Google, aka Quantum Paper.

    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Mild Shock@janburse@fastmail.fm to comp.lang.prolog on Thu Jun 19 14:26:49 2025
    From Newsgroup: comp.lang.prolog


    I wasted a half dozen months with simulated
    “threads” by using CheerpJ. This was a very
    interesting experience, I could run formerly
    Jekejeke Prolog written in Java inside JavaScript.

    Main problem a simulation of “threads” cannot
    use certain GUI programming patterns from
    JavaScript. Because then you have still pre-emptive
    yield, like if you do it with auto-yield.

    But in JavaScript you have critical regions
    for free, just between two awaits, there will
    be no yield. Such properties might impact how
    you model your “concurrent” logic.

    This puts some weight on having a shield/1
    primitive. The CheerpJ threads were not that
    bad, I added auto yield, but shield/1 is a
    later invention from Dogelog Player.

    Mild Shock schrieb:
    Hi,

    When did the quantum leap happen in Dogelog Player?
    Well very early on: The first binary release was here:

    ANN: Dogelog Player 0.9.7
    The new version 0.9.7 of the Dogelog
    player now masters DCG.
    Admin User, created 09/06/2025

    And '$YIELD'/1 stuff came 9 months (sic!) later:

    ANN: Dogelog Player 0.9.8
    The Dogelog Player supports a new interpreter
    that can relinquish control.
    Admin User, created 21/03/2022

    See for your self:

    https://www.xlog.ch/izytab/doclet/home/12_news/package.html

    9 months, like Homo sapiens gestation period. (*)

    LoL

    Bye

    (*) To be frank, it was the perfect pass time during
    the COVID-19 pandemic.

    Mild Shock schrieb:
    Hi,

    Somebody wrote:

    Right, but what I’m saying is that with the
    current implementation as a separate process,
    running independently of the editor and only
    communicating over the channel defined by the
    protocol, the ability to have fine-grained
    asynchronous communication is limited.

    Not my problem not seeking the state of the art. You
    need of course a Prolog system that is all flesh
    and blood cooperative multitasking. If you want

    to do a GUI in Prolog similar like JavaScript
    does it now, or a native GUI adapter. And I don't
    count Tau-Prolog, although they showed amazing

    stuff. But not amazing enough, still based
    on continuations, and not based on promises. Or then
    async/await. I am not sure what SWI WASM now delivers?

    SWI Tinker shows me errors talking about threads when
    I use the query background execution feature and if I
    abort. But people from cooperative multitasking tend

    to not use the terminology "thread", they prefer to
    talk about "tasks". Ciao Playground doesn't count either,
    since their channels to a background worker can even

    not process an interrupt correctly.

    Bye

    Mild Shock schrieb:
    Hi,

    The fukkers stole my name:

    Jan - Local AI Assistant
    https://github.com/menloresearch/jan

    Bye

    P.S.: Meanwhile I am struggling with Quantum Paper
    whille doing a dark/light CSS. Look my light olive turned dark
    olive, that is somewhere near chocolate or is it dog shit?

    P.P.S.: Just figured out yesterday that some browser defaults
    are more Motif/OSF than Material/Google, aka Quantum Paper.


    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Mild Shock@janburse@fastmail.fm to comp.lang.prolog on Thu Jun 19 14:38:43 2025
    From Newsgroup: comp.lang.prolog

    Hi,

    Threads are just a variant of processes that
    share a heap, which can be the bottleneck. Processes
    are good for time sharing systems. Some history:

    How it started, support small CPUs:

    TRIPOS (TRIvial Portable Operating System)
    https://en.wikipedia.org/wiki/TRIPOS

    How it is going, more small CPUs excitement:

    The Origins of Linux—Linus Torvalds https://www.youtube.com/watch?v=WVTWCPoUt8w

    But what about GUI programming, or even web
    servers database access? Threads have massively
    fallen back with other models mainly through

    JavaScript, in the GUI via the browser and
    on the server via node.js. So don't be fooled
    by multi-threading Prolog systems,

    could be a complete nonsense...

    Mild Shock schrieb:

    I wasted a half dozen months with simulated
    “threads” by using CheerpJ. This was a very
    interesting experience, I could run formerly
    Jekejeke Prolog written in Java inside JavaScript.

    Main problem a simulation of “threads” cannot
    use certain GUI programming patterns from
    JavaScript. Because then you have still pre-emptive
    yield, like if you do it with auto-yield.

    But in JavaScript you have critical regions
    for free, just between two awaits, there will
    be no yield. Such properties might impact how
    you model your “concurrent” logic.

    This puts some weight on having a shield/1
    primitive. The CheerpJ threads were not that
    bad, I added auto yield, but shield/1 is a
    later invention from Dogelog Player.

    Mild Shock schrieb:
    Hi,

    When did the quantum leap happen in Dogelog Player?
    Well very early on: The first binary release was here:

    ANN: Dogelog Player 0.9.7
    The new version 0.9.7 of the Dogelog
    player now masters DCG.
    Admin User, created 09/06/2025

    And '$YIELD'/1 stuff came 9 months (sic!) later:

    ANN: Dogelog Player 0.9.8
    The Dogelog Player supports a new interpreter
    that can relinquish control.
    Admin User, created 21/03/2022

    See for your self:

    https://www.xlog.ch/izytab/doclet/home/12_news/package.html

    9 months, like Homo sapiens gestation period. (*)

    LoL

    Bye

    (*) To be frank, it was the perfect pass time during
    the COVID-19 pandemic.

    Mild Shock schrieb:
    Hi,

    Somebody wrote:

    Right, but what I’m saying is that with the
    current implementation as a separate process,
    running independently of the editor and only
    communicating over the channel defined by the
    protocol, the ability to have fine-grained
    asynchronous communication is limited.

    Not my problem not seeking the state of the art. You
    need of course a Prolog system that is all flesh
    and blood cooperative multitasking. If you want

    to do a GUI in Prolog similar like JavaScript
    does it now, or a native GUI adapter. And I don't
    count Tau-Prolog, although they showed amazing

    stuff. But not amazing enough, still based
    on continuations, and not based on promises. Or then
    async/await. I am not sure what SWI WASM now delivers?

    SWI Tinker shows me errors talking about threads when
    I use the query background execution feature and if I
    abort. But people from cooperative multitasking tend

    to not use the terminology "thread", they prefer to
    talk about "tasks". Ciao Playground doesn't count either,
    since their channels to a background worker can even

    not process an interrupt correctly.

    Bye

    Mild Shock schrieb:
    Hi,

    The fukkers stole my name:

    Jan - Local AI Assistant
    https://github.com/menloresearch/jan

    Bye

    P.S.: Meanwhile I am struggling with Quantum Paper
    whille doing a dark/light CSS. Look my light olive turned dark
    olive, that is somewhere near chocolate or is it dog shit?

    P.P.S.: Just figured out yesterday that some browser defaults
    are more Motif/OSF than Material/Google, aka Quantum Paper.



    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Mild Shock@janburse@fastmail.fm to comp.lang.prolog on Thu Jun 19 14:54:20 2025
    From Newsgroup: comp.lang.prolog

    Hi,

    I find fewer and fewer use cases for threads.
    Here some fun with <parallel> Ant Task:

    <target name="dogelog_transpile">
    <parallel>
    <ant dir="../player/cross"
    antfile="run.xml"/>
    <ant dir="../playerpy/cross"
    antfile="run.xml"/>
    <ant dir="../playerj/cross"
    antfile="run.xml"/>
    </parallel>
    </target>

    Transpiling Dogelog Player in parallel. Except
    for a totally broken Ant log file, works
    smooth and shows a solid speed up. Although everything

    is heavily forked and possibly processes. I assume
    Ant offers tries to use threads, back from the time
    Java people were proud of their threads,

    but it nowadays with high speed solid state disks
    and large memory capacity, it doesn't make a dent anymore.

    LoL

    Bye

    P.S.: No GitHub Actions nonsense allowed here. Although
    matrix build looks interesting. Its possibly to uniform
    paralleliz. Unfortunately I have cases where I mix <parallel>

    with <sequential> in ant task. And for the lazy ones there
    is <macrodef> . What I didn't try yet is a better logger,
    it seems Gradel would provide that? One could have a DOM

    as Log datastructure, before the log gets committed.
    Simulating the mailboxes of SWI-Prolog message system.
    But the idea of "mailboxes" already indicate messages would

    leave process borders. Thank god I have delegated everything
    to Ant, don't need to make my hands dirty here.


    Mild Shock schrieb:
    Hi,

    Threads are just a variant of processes that
    share a heap, which can be the bottleneck. Processes
    are good for time sharing systems. Some history:

    How it started, support small CPUs:

    TRIPOS (TRIvial Portable Operating System) https://en.wikipedia.org/wiki/TRIPOS

    How it is going, more small CPUs excitement:

    The Origins of Linux—Linus Torvalds https://www.youtube.com/watch?v=WVTWCPoUt8w

    But what about GUI programming, or even web
    servers database access? Threads have massively
    fallen back with other models mainly through

    JavaScript, in the GUI via the browser and
    on the server via node.js. So don't be fooled
    by multi-threading Prolog systems,

    could be a complete nonsense...

    Mild Shock schrieb:

    I wasted a half dozen months with simulated
    “threads” by using CheerpJ. This was a very
    interesting experience, I could run formerly
    Jekejeke Prolog written in Java inside JavaScript.

    Main problem a simulation of “threads” cannot
    use certain GUI programming patterns from
    JavaScript. Because then you have still pre-emptive
    yield, like if you do it with auto-yield.

    But in JavaScript you have critical regions
    for free, just between two awaits, there will
    be no yield. Such properties might impact how
    you model your “concurrent” logic.

    This puts some weight on having a shield/1
    primitive. The CheerpJ threads were not that
    bad, I added auto yield, but shield/1 is a
    later invention from Dogelog Player.

    Mild Shock schrieb:
    Hi,

    When did the quantum leap happen in Dogelog Player?
    Well very early on: The first binary release was here:

    ANN: Dogelog Player 0.9.7
    The new version 0.9.7 of the Dogelog
    player now masters DCG.
    Admin User, created 09/06/2025

    And '$YIELD'/1 stuff came 9 months (sic!) later:

    ANN: Dogelog Player 0.9.8
    The Dogelog Player supports a new interpreter
    that can relinquish control.
    Admin User, created 21/03/2022

    See for your self:

    https://www.xlog.ch/izytab/doclet/home/12_news/package.html

    9 months, like Homo sapiens gestation period. (*)

    LoL

    Bye

    (*) To be frank, it was the perfect pass time during
    the COVID-19 pandemic.

    Mild Shock schrieb:
    Hi,

    Somebody wrote:

    Right, but what I’m saying is that with the
    current implementation as a separate process,
    running independently of the editor and only
    communicating over the channel defined by the
    protocol, the ability to have fine-grained
    asynchronous communication is limited.

    Not my problem not seeking the state of the art. You
    need of course a Prolog system that is all flesh
    and blood cooperative multitasking. If you want

    to do a GUI in Prolog similar like JavaScript
    does it now, or a native GUI adapter. And I don't
    count Tau-Prolog, although they showed amazing

    stuff. But not amazing enough, still based
    on continuations, and not based on promises. Or then
    async/await. I am not sure what SWI WASM now delivers?

    SWI Tinker shows me errors talking about threads when
    I use the query background execution feature and if I
    abort. But people from cooperative multitasking tend

    to not use the terminology "thread", they prefer to
    talk about "tasks". Ciao Playground doesn't count either,
    since their channels to a background worker can even

    not process an interrupt correctly.

    Bye

    Mild Shock schrieb:
    Hi,

    The fukkers stole my name:

    Jan - Local AI Assistant
    https://github.com/menloresearch/jan

    Bye

    P.S.: Meanwhile I am struggling with Quantum Paper
    whille doing a dark/light CSS. Look my light olive turned dark
    olive, that is somewhere near chocolate or is it dog shit?

    P.P.S.: Just figured out yesterday that some browser defaults
    are more Motif/OSF than Material/Google, aka Quantum Paper.




    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Mild Shock@janburse@fastmail.fm to comp.lang.prolog on Thu Jun 19 17:47:18 2025
    From Newsgroup: comp.lang.prolog

    Corr.: wrong date, should read 2021 here:

    ANN: Dogelog Player 0.9.7
    The new version 0.9.7 of the Dogelog
    player now masters DCG.
    Admin User, created 09/06/2025

    The date was this:

    Admin User, created 09/06/2021

    Mild Shock schrieb:
    Hi,

    When did the quantum leap happen in Dogelog Player?
    Well very early on: The first binary release was here:

    ANN: Dogelog Player 0.9.7
    The new version 0.9.7 of the Dogelog
    player now masters DCG.
    Admin User, created 09/06/2025

    And '$YIELD'/1 stuff came 9 months (sic!) later:

    ANN: Dogelog Player 0.9.8
    The Dogelog Player supports a new interpreter
    that can relinquish control.
    Admin User, created 21/03/2022

    See for your self:

    https://www.xlog.ch/izytab/doclet/home/12_news/package.html

    9 months, like Homo sapiens gestation period. (*)

    LoL

    Bye

    (*) To be frank, it was the perfect pass time during
    the COVID-19 pandemic.

    Mild Shock schrieb:
    Hi,

    Somebody wrote:

    Right, but what I’m saying is that with the
    current implementation as a separate process,
    running independently of the editor and only
    communicating over the channel defined by the
    protocol, the ability to have fine-grained
    asynchronous communication is limited.

    Not my problem not seeking the state of the art. You
    need of course a Prolog system that is all flesh
    and blood cooperative multitasking. If you want

    to do a GUI in Prolog similar like JavaScript
    does it now, or a native GUI adapter. And I don't
    count Tau-Prolog, although they showed amazing

    stuff. But not amazing enough, still based
    on continuations, and not based on promises. Or then
    async/await. I am not sure what SWI WASM now delivers?

    SWI Tinker shows me errors talking about threads when
    I use the query background execution feature and if I
    abort. But people from cooperative multitasking tend

    to not use the terminology "thread", they prefer to
    talk about "tasks". Ciao Playground doesn't count either,
    since their channels to a background worker can even

    not process an interrupt correctly.

    Bye

    Mild Shock schrieb:
    Hi,

    The fukkers stole my name:

    Jan - Local AI Assistant
    https://github.com/menloresearch/jan

    Bye

    P.S.: Meanwhile I am struggling with Quantum Paper
    whille doing a dark/light CSS. Look my light olive turned dark
    olive, that is somewhere near chocolate or is it dog shit?

    P.P.S.: Just figured out yesterday that some browser defaults
    are more Motif/OSF than Material/Google, aka Quantum Paper.


    --- Synchronet 3.21a-Linux NewsLink 1.2