Possible solution for hierarchical design

Hi, after last update I would like to point out one possible solution for hierarchical design but I would need your help.
I found really good tutorial here:
https://www.alyne.com/en/blog/tech-talk/using-webcola-and-d3-js-to-create-hierarchical-layout/
Here are the steps I took:
1.Changed diagram.ts
a) import * as _ from 'lodash';
b)
initCola(): any {  // eslint-disable-line @typescript-eslint/no-explicit-any         return cola.d3adaptor()             .avoidOverlaps(true)             .handleDisconnected(false)             .symmetricDiffLinkLengths(100)             .linkDistance(100)             .size([this.options.width, this.options.height]);     }
c) inside render function I added this
`const levelGroups = _.groupBy(nodes, "level");
console.log(levelGroups)
for (const level of Object.keys(levelGroups)) {
const nodeGroup = levelGroups[level];
const constraint = {
type: "alignment",
axis: "y",
offsets: [],
};
let prevNodeId = "none";
for (const node of nodeGroup) {
constraint.offsets.push({
node: _.findIndex(nodes, (d) => d.name === node.name),
offset: 0,
});
              if (prevNodeId !== "none") {
                console.log(_.findIndex(nodes, (d) => d.name === prevNodeId));
                console.log(_.findIndex(nodes, (d) => d.name === node.name));

                constraints.push({
                  axis: "x",
                  left: _.findIndex(nodes, (d) => d.name === prevNodeId),
                  right:_.findIndex(nodes, (d) => d.name === node.name),
                  gap: 50,
                });
              }

              prevNodeId = node.name;
              console.log(prevNodeId);
            }

            constraints.push(constraint);
        }

this.cola.nodes(nodes)
            .links(links)
            **.constraints(constraints)**
            .groups(groups);
        this.setDistance(this.cola);`

d) in node.ts I added level property
in NodeDataType - level: number,
in Node Class - public level: number;
in constructor - this.level = data.level;
e) in package.json in dependencies I added
"@types/lodash": "^4.14.168",
"lodash": "^4.17.20",
JSON here - you can see I added level property:
{   "nodes": [     {       "level":1,       "name": "testPERMANENT-<IP_ADDRESS>",       "meta": {         "tenant-ip": "<IP_ADDRESS>"       },       "icon": "/static/images/router.png"     },     {       "level":1,       "name": "testPERMANENT-<IP_ADDRESS>",       "meta": {         "tenant-ip": "<IP_ADDRESS>"       },       "icon": "/static/images/router.png"     },     {       "level":2,       "name": "INTERNET",       "icon": "/static/images/router.png"     },     {       "level":3,       "name": "AZ1-testpermanent-123-muc-vpn1",       "meta": {         "name": "vpn1"       },       "icon": "/static/images/router.png"     },     {       "level":3,       "name": "AZ2-testpermanent-123-muc-vpn2",       "meta": {         "name": "vpn2"       },       "icon": "/static/images/router.png"     },     {       "level":4,       "name": "AZ1-testpermanent-muc-rs1",       "meta": {         "name": "rs1"       },       "icon": "/static/images/router.png"     },     {       "level":4,       "name": "AZ1-testpermanent-muc-rs2",       "meta": {         "name": "rs2"       },       "icon": "/static/images/router.png"     },     {       "level":4,       "name": "AZ2-testpermanent-muc-rs3",       "meta": {         "name": "rs3"       },       "icon": "/static/images/router.png"     },     {       "level":4,       "name": "AZ2-testpermanent-muc-rs4",       "meta": {         "name": "rs4"       },       "icon": "/static/images/router.png"     },     {       "level":5,       "name": "<IP_ADDRESS>/24"     },     {       "level":5,       "name": "<IP_ADDRESS>/24"     },     {       "level":6,       "name": "POD1-FCIPOCLEAF101",       "meta": {         "name": "FCIPOCLEAF101"       },       "icon": "/static/images/router.png"     },     {       "level":7,       "name": "POD1-FCIPOCLEAF102",       "meta": {         "name": "FCIPOCLEAF102"       },       "icon": "/static/images/router.png"     },     {       "level":6,       "name": "POD2-FCIPOCLEAF202",       "meta": {         "name": "FCIPOCLEAF202"       },       "icon": "/static/images/router.png"     },     {       "level":7,       "name": "POD2-FCIPOCLEAF201",       "meta": {         "name": "FCIPOCLEAF201"       },       "icon": "/static/images/router.png"     }   ],   "links": [     {       "source": "<IP_ADDRESS>/24",       "target": "AZ1-testpermanent-muc-rs1"     },     {       "source": "<IP_ADDRESS>/24",       "target": "AZ1-testpermanent-muc-rs2"     },     {       "source": "<IP_ADDRESS>/24",       "target": "POD1-FCIPOCLEAF102"     },     {       "source": "<IP_ADDRESS>/24",       "target": "POD1-FCIPOCLEAF101"     },     {       "source": "<IP_ADDRESS>/24",       "target": "POD2-FCIPOCLEAF201"     },     {       "source": "<IP_ADDRESS>/24",       "target": "POD2-FCIPOCLEAF202"     },     {       "source": "<IP_ADDRESS>/24",       "target": "AZ2-testpermanent-muc-rs3"     },     {       "source": "<IP_ADDRESS>/24",       "target": "AZ2-testpermanent-muc-rs4"     },     {       "source": "<IP_ADDRESS>/24",       "target": "POD1-FCIPOCLEAF102"     },     {       "source": "<IP_ADDRESS>/24",       "target": "POD1-FCIPOCLEAF101"     },     {       "source": "<IP_ADDRESS>/24",       "target": "POD2-FCIPOCLEAF201"     },     {       "source": "<IP_ADDRESS>/24",       "target": "POD2-FCIPOCLEAF202"     },     {       "source": "INTERNET",       "target": "AZ1-testpermanent-123-muc-vpn1"     },     {       "source": "INTERNET",       "target": "AZ2-testpermanent-123-muc-vpn2"     },     {       "source": "INTERNET",       "target": "testPERMANENT-<IP_ADDRESS>"     },     {       "source": "INTERNET",       "target": "testPERMANENT-<IP_ADDRESS>"     },     {       "source": "<IP_ADDRESS>/24",       "target": "AZ1-testpermanent-123-muc-vpn1"     },     {       "source": "<IP_ADDRESS>/24",       "target": "AZ2-testpermanent-123-muc-vpn2"     }   ] }
I think it works but not 100% because in the link I provided the generated graph is topdown but for example here LEVEL 1 is displayed at the bottom. And for example if I have groups, one node is displayed at the same level even though its one level lower.  So I think it has to do something with groups and constraints.
JSON to image below:
vpns are level 1
internet is level 2
etc. but if you look at LEAFS which are aligned with RS this should not be like that because they have different levels but grouping is a problem maybe

you can see without groups it works better but still not great

Added also step where nodes are sorted by levels when initiating simulation
            let preSortedNodes = data.nodes ? _.sortBy(data.nodes, "level") : [];             console.log(preSortedNodes)             const nodes = preSortedNodes.map((n, i) => new Node(n, i, this.options.meta, this.options.color, this.options.tooltip !== undefined));

Further testing is showing me, its not reliable that the topology will show top down every time ... just small change will result in complete rebuild of topology, totally ignoring top down layout and inverting it or moving left to right, etc.

Thanks for the steps explained. Let me try to reproduce in my environment and investigate why inet-henge ignores levels defined in json.

Thanks for the steps explained. Let me try to reproduce in my environment and investigate why inet-henge ignores levels defined in json.

Thanks, its not ignoring levels completely because If you drag one node, you are automatically moving all other nodes at that level, levels are just not aligned vertically. I tried different approaches and not sure what is causing it (maybe translate function ?) because I dont understand what can be difference between the approach I posted in link and my adjusted changed.
E.g. I added new node above VPN nodes with LEVEL 5 all the way at the top and it messed up completely and showed first half of levels at the bottom.
Keep me updated, I will try work on this too :)

Any update ?
I was looking at this, tried many different things and I found one solution. SetCola js
Look at this - https://uwdata.github.io/setcola/ and choose kruger-foodWeb its perfectly aligned and top down and
I have created CodePen with WebCola + SetCola here https://codepen.io/marhyno/pen/xxRrLYZ and its working perfectly fine items are aligned top down and next to each other and you can create connections between the lowest level to the top without topology to change design. Can you look at it ? :)

I got the topology you mentioned finally.

source code: 598ba2f...4850f7f
A problem I found is that some of the constraints don't work, even they look valid to me. I'm looking into webcola now.
0: {type: "alignment", axis: "y", offsets: Array(2)}
1: {type: "alignment", axis: "y", offsets: Array(1)}
2: {type: "alignment", axis: "y", offsets: Array(2)}
3: {type: "alignment", axis: "y", offsets: Array(4)}
4: {type: "alignment", axis: "y", offsets: Array(2)}
5: {type: "alignment", axis: "y", offsets: Array(2)}
6: {type: "alignment", axis: "y", offsets: Array(2)}
7: {axis: "x", left: 0, right: 1, gap: 50}
8: {axis: "x", left: 3, right: 4, gap: 50}
9: {axis: "x", left: 5, right: 6, gap: 50}
10: {axis: "x", left: 6, right: 7, gap: 50}
11: {axis: "x", left: 7, right: 8, gap: 50}
12: {axis: "x", left: 9, right: 10, gap: 50}
13: {axis: "x", left: 11, right: 13, gap: 50}
14: {axis: "x", left: 12, right: 14, gap: 50}
15: {axis: "y", left: 0, right: 2, gap: 50, left_name: "testPERMANENT-<IP_ADDRESS>", …}
16: {axis: "y", left: 2, right: 3, gap: 50, left_name: "INTERNET", …}
17: {axis: "y", left: 3, right: 5, gap: 50, left_name: "AZ1-testpermanent-123-muc-vpn1", …}

// Something wrong
18: {axis: "y", left: 5, right: 9, gap: 50, left_name: "AZ1-testpermanent-muc-rs1", …}
19: {axis: "y", left: 9, right: 11, gap: 50, left_name: "<IP_ADDRESS>/24", …}
20: {axis: "y", left: 11, right: 12, gap: 50, left_name: "POD1-FCIPOCLEAF101", …}

Hi, thank you very much, we found something like when it reaches certain level e.g. level 5 or 6 it stops using levels, and we dont know why. Bu thanks, maybe setcola would be helpful

So do you mean SetCola ( without inet-henge ) works for you? Or inet-henge can work along with SetCola? I'm just curious.

Inet henge can work along set cola, if you look at the codepen I created you can see that WebCola works with SetCola so I think it can work together with inet henge :)
The only thing which might cause problems is the setPosition function and translates, because if you look at the codepen, I did not use translate and nodes are perfectly aligned horizontally and vertically

Sounds great :tada: But yes, setPosition, translate or something like auto-layout stuff may conflict with SetCola.
I'll read your codepen anyways. Thanks!

Sounds great 🎉 But yes, setPosition, translate or something like auto-layout stuff may conflict with SetCola.
I'll read your codepen anyways. Thanks!

Thanks, as always I will work on this too and provide results if any :)

So far I have tried to remove .attr('transform', (d) => d.transform()); from group, node and link
Added setCola to diagram.ts
Added preprocessing by setCola in render function:
	var result = setcola
            .nodes(data.nodes)        // Set the graph nodes
            .links(data.links)       // Set the graph links
            .constraints(data.constraints)  // Set the constraints
            .gap(100)
            .layout();

            const nodes = result.nodes ?
            result.nodes.map((n, i) => new Node(n, i, this.options.meta, this.options.color, this.options.tooltip !== undefined)) : [];
            const links = result.links ?
            result.links.map((l, i) => new Link(l, i, this.options.meta, this.getLinkWidth)) : [];
            const groups = Group.divide(nodes, this.options.groupPattern, this.options.color);
            const tooltips = nodes.map((n) => new Tooltip(n, this.options.tooltip));

The json I use - added constraints
{
  "nodes": [
  ],
  "links": [
  ],
  "constraints":[
    {
      "name": "leveled",
      "sets": {"partition": "level"},
      "forEach": [
        { "constraint": "order", "axis": "x", "by": "level", "gap": 150 },
        { "constraint": "align", "axis": "x" }
     ]
    },
    {
      "sets": ["leveled"],
      "forEach": [{
        "constraint": "order",
        "axis": "y",
        "by": "level",
        "gap": 100,
        "order": ["carnivore", "herbivore", "plant"]
      }]
    }
  ]
}

But so far the generated topology looks like this
https://pasteboard.co/JPSXqnX.png

Anything new ? :)

Hi, coming to you with working solution I think :)
After days of digging into cola, webcola, setcola, I finally managed to get it working.
Magic lied in this line - this.cola.start(this.options.initialTicks,0, 0, 0);
After adding setcola, including constraints into json, topology still looked somehow wrong. I compared it with the example I provided in codepen and found out ticks are the problem. If you leave it like above at 0,0,0 it generates random dynamic view. If you specify higher number, look below I put there 50,50,50 it generates nice looking perfectly aligned horizontal and vertical view. So I think you can include option into Diagram class if user wants to have hierarchical design, he needs to add TRUE so the ticks are different, and in json he must include constraints according to setCola page or look at the example at the bottom of this comment. Also as pointed in the earlier comment node.ts must also include level property to read it from json file. At the end of try catch part there is jQuery loop to remove additional nodes which are created by setcola and for end user are useless so I remove them.
var result = setcola
            .nodes(data.nodes)        // Set the graph nodes
            .links(data.links)       // Set the graph links
            .constraints(data.constraints)  // Set the constraints
            .gap(100)
            .layout();

            const nodes = result.nodes ?
            result.nodes.map((n, i) => new Node(n, i, this.options.meta, this.options.color, this.options.tooltip !== undefined)) : [];

            const links = result.links ?
            result.links.map((l, i) => new Link(l, i, this.options.meta, this.getLinkWidth)) : [];

            const groups = Group.divide(nodes, this.options.groupPattern, this.options.color);
            const tooltips = nodes.map((n) => new Tooltip(n, this.options.tooltip));

            this.cola.nodes(nodes)
                .links(links)
                .groups(groups)
                .constraints(result.constraints);
            this.setDistance(this.cola);

            // Start to update Link.source and Link.target with Node object after
            // initial layout iterations without any constraints.
            this.cola.start(50, 50, 50);

            const groupLayer = this.svg.append('g').attr('id', 'groups');
            const linkLayer = this.svg.append('g').attr('id', 'links');
            const nodeLayer = this.svg.append('g').attr('id', 'nodes');
            const linkLabelLayer = this.svg.append('g').attr('id', 'link-labels');
            const tooltipLayer = this.svg.append('g').attr('id', 'tooltips');

            const [link, path, label] = Link.render(linkLayer, linkLabelLayer, links);

            const group = Group.render(groupLayer, groups).call(
                this.cola.drag()
                    .on('dragstart', this.dragstartCallback)
                    .on('drag', () => {
                        if (this.options.bundle) {
                            Link.shiftBundle(link, path, label);
                        }
                    })
            );

            const node = Node.render(nodeLayer, nodes).call(
                this.cola.drag()
                    .on('dragstart', this.dragstartCallback)
                    .on('drag', () => {
                        if (this.options.bundle) {
                            Link.shiftBundle(link, path, label);
                        }

                        Tooltip.followNode(tooltip);
                    })
            );

            // without path calculation
            this.configureTick(group, node, link);

            this.positionCache = PositionCache.load(data, this.options.groupPattern);
            if (this.options.positionCache && this.positionCache) {
                // NOTE: Evaluate only when positionCache: true or 'fixed', and
                //       when the stored position cache matches pair of given data and pop
                Group.setPosition(group, this.positionCache.group);
                Node.setPosition(node, this.positionCache.node);
                Link.setPosition(link, this.positionCache.link);
            } else {
                this.ticksForward();
                this.positionCache = new PositionCache(data, this.options.groupPattern);
                this.savePosition(group, node, link);
            }

            this.hideLoadMessage();

            // render path
            this.configureTick(group, node, link, path, label);

            if (this.options.bundle) {
                Link.shiftBundle(link, path, label);
            }

            path.attr('d', (d) => d.d()); // make sure path calculation is done
            this.freeze(node);

            const tooltip = Tooltip.render(tooltipLayer, tooltips);

            this.dispatch.rendered();

            // NOTE: This is an experimental option
            if (this.options.positionCache === 'fixed') {
                this.cola.on('end', () => {
                    this.savePosition(group, node, link);
                });
            }

            $('.node.rect').each(function(){
                console.log($(this));
                if ($(this).attr("id").indexOf("_set0_") > -1){
                    $(this).remove();
                }
            });

Add constrains from the code below in your json file which is loaded by inet-henge. These constraints are aligning items from top to bottom based on their level, levels are aligned ascended
{
  "nodes": [
      {
          "level": 4,
          "name": "AZ1-testpermanent-muc-rs1",
          "meta": {
              "name": "rs1",
              "hostname": "testpermanent-muc-rs1"
          },
          "icon": "/static/images/ios-xe.png"
      },
      {
          "level": 5,
          "name": "AZ1-testpermanent-muc-rs2",
          "meta": {
              "name": "rs2",
              "hostname": "testpermanent-muc-rs2"
          },
          "icon": "/static/images/ios-xe.png"
      },
      {
          "level": 4,
          "name": "AZ2-testpermanent-muc-rs3",
          "meta": {
              "name": "rs3",
              "hostname": "testpermanent-muc-rs3"
          },
          "icon": "/static/images/ios-xe.png"
      },
      {
          "level": 5,
          "name": "AZ2-testpermanent-muc-rs4",
          "meta": {
              "name": "rs4",
              "hostname": "testpermanent-muc-rs4"
          },
          "icon": "/static/images/ios-xe.png"
      },
      {
          "level": 8,
          "name": "ACI-FCIPOCLEAF101",
          "group": "POD1",
          "meta": {
              "capabilities": ""
          },
          "icon": "/static/images/nexus9k.png"
      },
      {
          "level": 8,
          "name": "ACI-FCIPOCLEAF102",
          "group": "POD1",
          "meta": {
              "capabilities": ""
          },
          "icon": "/static/images/nexus9k.png"
      },
      {
          "level": 8,
          "name": "ACI-FCIPOCLEAF202",
          "group": "POD2",
          "meta": {
              "capabilities": ""
          },
          "icon": "/static/images/nexus9k.png"
      },
      {
          "level": 8,
          "name": "ACI-FCIPOCLEAF201",
          "group": "POD2",
          "meta": {
              "capabilities": ""
          },
          "icon": "/static/images/nexus9k.png"
      },
      {
          "level": 7,
          "name": "<IP_ADDRESS>/24"
      },
      {
          "level": 7,
          "name": "<IP_ADDRESS>/24"
      },
      {
          "level": 3,
          "name": "AZ1-testpermanent-123-muc-vpn1",
          "meta": {
              "name": "vpn1",
              "hostname": "testpermanent-123-muc-vpn1"
          },
          "icon": "/static/images/vpn.png"
      },
      {
          "level": 3,
          "name": "AZ2-testpermanent-123-muc-vpn2",
          "meta": {
              "name": "vpn2",
              "hostname": "testpermanent-123-muc-vpn2"
          },
          "icon": "/static/images/vpn.png"
      },
      {
          "level": 1,
          "name": "testPERMANENT-<IP_ADDRESS>",
          "meta": {
              "tenant-ip": "<IP_ADDRESS>"
          },
          "icon": "/static/images/vpn.png"
      },
      {
          "level": 1,
          "name": "testPERMANENT-<IP_ADDRESS>",
          "meta": {
              "tenant-ip": "<IP_ADDRESS>"
          },
          "icon": "/static/images/vpn.png"
      },
      {
          "level": 2,
          "name": "INTERNET",
          "icon": "/static/images/internet.png"
      }
  ],
  "links": [
      {
          "source": "<IP_ADDRESS>/24",
          "target": "AZ1-testpermanent-muc-rs1"
      },
      {
          "source": "<IP_ADDRESS>/24",
          "target": "AZ1-testpermanent-muc-rs2"
      },
      {
          "source": "<IP_ADDRESS>/24",
          "target": "ACI-FCIPOCLEAF102"
      },
      {
          "source": "<IP_ADDRESS>/24",
          "target": "ACI-FCIPOCLEAF101"
      },
      {
          "source": "<IP_ADDRESS>/24",
          "target": "ACI-FCIPOCLEAF201"
      },
      {
          "source": "<IP_ADDRESS>/24",
          "target": "ACI-FCIPOCLEAF202"
      },
      {
          "source": "<IP_ADDRESS>/24",
          "target": "AZ2-testpermanent-muc-rs3"
      },
      {
          "source": "<IP_ADDRESS>/24",
          "target": "AZ2-testpermanent-muc-rs4"
      },
      {
          "source": "<IP_ADDRESS>/24",
          "target": "ACI-FCIPOCLEAF102"
      },
      {
          "source": "<IP_ADDRESS>/24",
          "target": "ACI-FCIPOCLEAF101"
      },
      {
          "source": "<IP_ADDRESS>/24",
          "target": "ACI-FCIPOCLEAF201"
      },
      {
          "source": "<IP_ADDRESS>/24",
          "target": "ACI-FCIPOCLEAF202"
      },
      {
          "source": "INTERNET",
          "target": "AZ1-testpermanent-123-muc-vpn1"
      },
      {
          "source": "INTERNET",
          "target": "AZ2-testpermanent-123-muc-vpn2"
      },
      {
          "source": "INTERNET",
          "target": "testPERMANENT-<IP_ADDRESS>"
      },
      {
          "source": "INTERNET",
          "target": "testPERMANENT-<IP_ADDRESS>"
      },
      {
          "source": "<IP_ADDRESS>/24",
          "target": "AZ1-testpermanent-123-muc-vpn1"
      },
      {
          "source": "<IP_ADDRESS>/24",
          "target": "AZ2-testpermanent-123-muc-vpn2"
      }
  ],"constraints":[
    {
      "name": "leveled",
      "sets": {"partition": "level"},
      "forEach": [
        { "constraint": "order", "axis": "x", "by": "name", "reverse": true, "gap": 150 },
        { "constraint": "align", "axis": "x", "reverse":true}
     ]
    },
    {
      "sets": ["leveled"],
      "forEach": [{
        "constraint": "order",
        "axis": "y",
        "by": "level",
        "gap": 100,
        "reverse": true
      }]
    }
  ]

}

Really nice looking topology - here

Thanks! This is awesome :tada:

So I think you can include option into Diagram class

Yes, that's the last thing we have to do.  I'd like to introduce a switch to plug setCola stuff into the original inet-henge, so that users can choose expected behavior - note that injecting constraints will cause extra CPU load in each calculation tick.
Besides that, we need to examine the magic number 50, 50, 50 is reasonable for other layouts. Or we should make them configurable maybe.

By the way, in your diagram mentioned here, do three groups overlap each other at the bottom, don't they?

By the way, in your diagram mentioned here, do three groups overlap each other at the bottom, don't they?

Hi, yes they overlap only because I used both grouping and inner groups. This could also be solvable by changing behavior slightly be adding margin so we can see header of groups


ldap user as admin can not see disk space usage

v1.1.2-656-g4b05c9e
set a ldap user as administrator, and login the user, will get a

permission error and can not see disk space usage.

Fixed by #3014 .


K9 almost stuck on 5.1

On both my Cyanogen devices (Nexus 7 2013 and Motorola G2 2015) K9 5.10x versions are almost stuck when it come to display or to scroll the list of messages.
Typical symptoms includes 'progress swirl' freezes for tenths of seconds before the list of messages is visible, scrolling the list bynswiping can take similar time to actually start scrolling
I've been able to go back untile 5.104 with the same behavior. Stable branch still not tested but will do soon
Any ideas how to debug the issue?

Is this the same as #747 ?


When container is deleted UI doesn't return to containers list view

User is left at an empty container view, not very nice of us.

PR: https://github.com/crosbymichael/dockerui/pull/163


Added OPSWAT Account Deletion to sites.json

Title is explanotary.

Hello @Pers-Pluto
This repo has been abandoned for years. We keep an active version of it here https://github.com/jdm-contrib/jdm , feel free to contribute there!


Address Rubocop Style/SpaceAroundKeyword

Awesome @DuskyPrawn !  Thank you!

@DuskyPrawn Ignore the rubocop errors here as they are unrelated to your changes.

Gaprindashvili backport details:
$ git log -1
commit 354cf347e2ca30327d7d8e3256a86a88953a93e9
Author: Brandon Dunne<EMAIL_ADDRESS>Date:   Tue Oct 31 08:29:34 2017 -0400

    Merge pull request #16355 from DuskyPrawn/patch-1

    Address Rubocop Style/SpaceAroundKeyword
    (cherry picked from commit e656bb83e95252ce9e825641912d73b710b7ba14)


Document adding a new runtime kind.

Description
We have received contributions to add PHP, Go, Ruby (#3725) and on the Apache dev list a new runtime for Ballerina.
This PR documents the steps required to add a new runtime to this repo so that it is available to the OpenWhisk deployment. Comments appreciated and welcome, particularly from those who have contributed runtimes recently (@sciabarracom @remore @akrabat).
cc @csantanapr
I'm happy to accept additional improvements to this write up via pull requests and all contributions will receive due credit.
Related issue and scope

[ ] I opened an issue to propose and discuss this change (#????)

My changes affect the following components

[ ] API
[ ] Controller
[ ] Message Bus (e.g., Kafka)
[ ] Loadbalancer
[ ] Invoker
[ ] Intrinsic actions (e.g., sequences, conductors)
[ ] Data stores (e.g., CouchDB)
[ ] Tests
[ ] Deployment
[ ] CLI
[ ] General tooling
[x] Documentation

Types of changes

[ ] Bug fix (generally a non-breaking change which closes an issue).
[ ] Enhancement or new feature (adds new functionality).
[ ] Breaking change (a bug fix or enhancement which changes existing behavior).

Checklist:

[x] I signed an Apache CLA.
[x] I reviewed the style guides and followed the recommendations (Travis CI will check :).
[ ] I added tests to cover my changes.
[ ] My changes require further changes to the documentation.
[x] I updated the documentation where necessary.

Codecov Report

Merging #3837 into master will increase coverage by 0.01%.
The diff coverage is n/a.

@@            Coverage Diff             @@
##           master    #3837      +/-   ##
==========================================
+ Coverage   73.77%   73.78%   +0.01%
==========================================
  Files         138      138
  Lines        6455     6455
  Branches      409      409
==========================================
+ Hits         4762     4763       +1
+ Misses       1693     1692       -1

Impacted Files
Coverage Δ

...rc/main/scala/whisk/common/ForcableSemaphore.scala
88.46% <0%> (+3.84%)
:arrow_up:

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update b288435...41860e1. Read the comment docs.

In add tion to this addition proposal, I have one more thing I have to add here: although I believe the current Ruby Runtime should be functionally acceptable (as test suites including canonical test suite passed), however I still don't fully figure out how to handle following input variables to /run endpoint except for the "value" key even at this stage:
# An example input values to /run endpoint
  {
    "activation_id":    "91f9fa332a424e35b9fa332a423e35fd",
    "action_name":      "/guest/myAction",
    "deadline":         "1526980345727",
    "api_key":          "23bc46b1-71f6-4ed5-8c54-816aa4f8c502:123zO3xZCLrMN6v2BKK1dXYFpXlPkccOFqm12CdAsMgRU4VrNZ9lyGVCGuMDGIwP",
    "value":            {\"message\":\"hello\"},
    "namespace":        "guest"
  }

Any pointer or reference for this might be also helpful for anyone new to here like me. Except for this, I don't think there is any missing parts necessary for runtime development.

@remore take a look at the latest commits - do they help?

@rabbah It looks more than perfect to me. Thank you for this definitive and informative write-up. This will for sure give us decent understanding to get started to develop language runtime.


[BUG] Rework of Post-Sync Extraction and Database Storage of contractAgreementIds

As a developer,
I want to extract and save contractAgreementIds for data consumption into the database after each data sync via IRS,
so that the data remains up-to-date and accurate without needing to restart the application.
Hints / Details

Currently, contractAgreementIds are only loaded during application startup.
The extraction and saving process should occur after each data synchronization via IRS.
Ensure that the database is updated correctly with the new contractAgreementIds.
Consider potential performance impacts and handle any possible errors during the extraction and saving process.

Acceptance Criteria
Backend

[x] The application no longer relies on startup to load contractAgreementIds.
[x] After each data sync via IRS, the contractAgreementIds are extracted and saved into the database.
[x] The database reflects the most current contractAgreementIds without requiring a restart.
[x] Appropriate error handling is implemented for the extraction and saving process.

Frontend

[x] Execution of action "View parts" will also work if a part already has a new contractAgreementId since it was updated.

Out of Scope

Changes to the IRS data sync process itself.
Modifications to the application startup process other than removing the contractAgreementIds loading.
Any user interface updates related to contractAgreementIds.

Frontend will have a globalAssetId in the contractTable and therefore the navigation to the part needs to be adapted as discussed.

Hi @ds-mwesener, I adjusted the frontend to navigate to id in globalAssetId field with chore/#1105-fe-adjust-contract-asset-reference

Tested on E2E-A:
Contracts are updated after parts sync.
Links from contracts to notification work.
But the links to some of the parts do not work. Newly created contracts link to their parts without issue, but older contracts don't link to parts that have been resynced anymore. A frontend error happens without any indication to the user:

Please take another look. Thanks!

Please validate again.

Has been reworked and tested. Please check (can be done on association environment)

Tested on INT: Links from contracts to the respective parts work now. Links from contracts to quality notifications work too.
Both contract types are shown and can be filtered as expected.
Ready for review.

LGFM. PO acceptance in behalf of @jzbmw .


Add concurrency groups to workflow files

Summary
https://linear.app/elementl/issue/CLOUD-1774/fix-race-condition-on-gh-action
Test Plan
Testing on this branch...

Current dependencies on/for this PR:

main

PR #5   👈

This comment was auto-generated by Graphite.


Bug: Chrome logger does not work.

Describe the bug
Plain and simple, doesn't work. I think the framework changed significantly since the code was first written. The event that was to send the headers doesn't exist any longer.
I discovered this some time ago and devised a fix but never made a PR on it.
Feel free to assign this one to me. It might take a little while to get time for it. I mostly need to devise some unit tests.

Appreciate that you offered to look into it. I don’t use Chrome so I’m pretty unfamiliar with the structure but... any ideas why the tests are passing even if this has been broken for a while?

I knew at one point, but have forgotten now.

I refreshed my memory about the issue because I know y'all are curious why it passes the unit test but fails in the real world.
The unit test method calls ChromeLoggerHandler::sendLogs() which puts the required header into a response object. The test then checks the current response object for the head. It's there all right. Assertion true and we're in the green.
However.  here is how ChromeLoggerHandler is set up to call sendLogs()
Events::on('post_controller', [$this, 'sendLogs'], EVENT_PRIORITY_HIGH);
Except there isn't an event named 'post_controller', and a non-existent event won't be triggered. Obviously.

 Good catch. I’d say just try switching to post_controller_constructor and see if that magically fixes it?

I actually have... er, that is, had a solution. I've made a mess of my local repo and cannot find the final working commit. It's in there somewhere.
It would be nice to find since I tackled the @todo and worked out some fancy object formatting which users should appreciate. I also added logic so that the ChromeLogger cannot be instantiated in the production environment. We would be quite negligent to allow that to happen.
I'm on it though.

Fabulous. ;) I trust it to you


Deleting an article shows up as a creation event on Slack

Obviously a wee bit of a bug there.

It looks like the :created state was getting sent over to the Speakerphone object, which sends "New article" over to Slack.
It should be working with:


Is there a Comma missing?

Hi,
is there a comma at the readme.md file missing? https://github.com/bnomei/kirby3-feed#usage-sitemap
After I added the comma, my PHP file didn't crash anymore.
Code with correction:
...     'modified' => time(),     'snippet' => 'feed/sitemap',     'mime' => null, ...
Best Regards
ET

@engineerTrooper yes there is a comma missing


Very good job. It seems that it can be migrated to other segmentation datasets

Yes, we are doing so. Please look forward to it :)

Yes, we are doing so. Please look forward to it :)

Very good job. It seems that it can be migrated to other segmentation datasets

Yes, we are doing so. Please look forward to it :)

Very good job. It seems that it can be migrated to other segmentation datasets

Yes, we are doing so. Please look forward to it :)


Rubygems and bundler

Hello again - I had some success running Ruby code in an online page,
as you can see on ://ruby.assembled.app.
This is good progress, and I'm now curious if there is an approach
for requiring ruby gem libraries inside the .wasm package,
so my code can use helpers such as 1.second and "hello".titlecase,
among others.
I recognize some libraries including C extensions, such as Nokogiri,
are unlikely to be runnable inside .wasm unless specially compiled.
For non-C gems, I'm curious if there is a non-compilation approach,
though if compiling a new .wasm binary is necessary, I'd be glad for directions.

I've been working on a couple of different approaches to this, if you'd like to talk about it more, feel free to dm me (on twitter, in bio).
Basically, I've made it (kind of) work by building from source after adding gems to the default gems in 'ruby-wasm32-wasi/usr' as mounted to '/usr' which is kind of clunky 🙈 , and that's why I am also trying to find a more elegant solution.
I would guess the maintainers here have some better thoughts on how to approach this 😄 .

It still needs some hacks, but here is how to use bundler and rubygems on Wasm.
https://gist.github.com/kateinoigakukun/5caf3b83b2732b1653e91b0e75ce3390
The main important points are:

Tell the location of Gemfile by BUNDLE_GEMFILE
Call Bundler.setup instead of bundle exec

@kateinoigakukun - can you also lend some direccions on running C-compiled libraries?
Nokogiri especially could be really usable in online pages.

And looks like your branch #15 merged;
does your approach change much?

I'm not well familiar with nokogiri, but it seems using mkmf. So what needs to be done to support wasm target are:

Support cross-compilation with mkmf and RubyGems builder
Figure out a way to link the compiled extension library with pre-compiled ruby.wasm (wasm doesn't support dynamic linking, so it would be difficult). Or provide an easy way to link 3rd party ext libraries while building. It would be done by generalizing how ruby.wasm links js interop library.

And looks like your branch https://github.com/ruby/ruby.wasm/pull/15 merged;
does your approach change much?

I updated the instruction, but not much changed 👍

I began running your recipe using a couple changes:
I cloned today's release of 3.2.0-dev:
curl -LO https://github.com/ruby/ruby.wasm/releases/download/2022-07-05-a/ruby-head-wasm32-unknown-wasi-full.tar.gz
tar xfz ruby-head-wasm32-unknown-wasi-full.tar.gz
rbenv local 3.2.0-dev

I prepared an example running a simpler rubygem,
ox xml parser.
bundle init
bundle add ox

I added a simple program:
require 'bundler/setup'
require 'net/http'
require 'ox'

Ox.default_options = { mode: :generic, effort: tolerant, smart: true, }

page = Ox.parse Net::HTTP.get URI.parse 'http://example.com'
puts page.locate('*/a')[0].attributes['href']

And some helper code in ./run.sh:
#!/bin/bash

run() {
  wasmtime run \
    --mapdir /usr::./head-wasm32-unknown-wasi-full/usr \
    --mapdir /root::./ \
    --mapdir /dev::/dev \
    --env BUNDLE_GEMFILE=/root/Gemfile \
    head-wasm32-unknown-wasi-full/usr/local/bin/ruby -- \
    "$@"
}

run --version
run '-e' 'puts Dir.glob("/root/vendor/bundle/ruby/3.2.0+1/gems/*")'
run /root/ox.rb

I seemed prepared enough, only by some quirk my rubygems had gone missing.
[grace@chesapeake ruby]$ ./run.sh
ruby 3.2.0dev (2022-07-06) [wasm32-wasi]
/root/vendor/bundle/ruby/3.2.0+1/gems/ox-2.14.11
Could not find ox-2.14.11 in any of the sources
Run `bundle install` to install missing gems.

Perhaps in a side discussion, can you explain the socket error I see
as I load net/http inside wasmtime?
[grace@chesapeake ruby]$ run -e "require 'net/http'"
Ignoring debug-1.5.0 because its extensions are not built. Try: gem pristine debug --version 1.5.0
Ignoring rbs-2.6.0 because its extensions are not built. Try: gem pristine rbs --version 2.6.0
<internal:/usr/local/lib/ruby/3.2.0+1/rubygems/core_ext/kernel_require.rb>:85:in `require': cannot load such file -- socket (LoadError)
        from <internal:/usr/local/lib/ruby/3.2.0+1/rubygems/core_ext/kernel_require.rb>:85:in `require'
        from /usr/local/lib/ruby/3.2.0+1/net/protocol.rb:22:in `<top (required)>'
        from <internal:/usr/local/lib/ruby/3.2.0+1/rubygems/core_ext/kernel_require.rb>:85:in `require'
        from <internal:/usr/local/lib/ruby/3.2.0+1/rubygems/core_ext/kernel_require.rb>:85:in `require'
        from /usr/local/lib/ruby/3.2.0+1/net/http.rb:23:in `<top (required)>'
        from <internal:/usr/local/lib/ruby/3.2.0+1/rubygems/core_ext/kernel_require.rb>:85:in `require'
        from <internal:/usr/local/lib/ruby/3.2.0+1/rubygems/core_ext/kernel_require.rb>:85:in `require'
        from -e:1:in `<main>'

@c4lliope It looks like ox gem has a native extension. You need to manage to build extensions as wasm object files and link  them with CRuby statically.

I had been guessing my problem is misaligned ruby version numbers;
e.g. the rubygems path /root/vendor/bundle/ruby/3.2.0+1/gems/*
is unrecognized by the 2022-07-05a release of ruby.wasm?

@c4lliope You can see which paths are in the search path by:
wasmtime run \
  --mapdir /usr::./head-wasm32-unknown-wasi-full/usr \
  --mapdir /root::./ --mapdir /dev::/dev \
  --env BUNDLE_GEMFILE=/root/Gemfile \
  head-wasm32-unknown-wasi-full/usr/local/bin/ruby -- -e 'require "bundler/setup"; puts $:'

And you will see /root/vendor/bundle/ruby/3.2.0+1/gems/* is recognized well.
Also you can see more verbose log by replacing require "bundler/setup" by require "bundler"; Bundler.setup and add --env DEBUG=1, then you will see:
$ wasmtime run \
  --mapdir /usr::./head-wasm32-unknown-wasi-full/usr \
  --mapdir /root::./ --mapdir /dev::/dev \
  --env BUNDLE_GEMFILE=/root/Gemfile --env DEBUG=1 \
  head-wasm32-unknown-wasi-full/usr/local/bin/ruby -- /root/my_app.rb

Found no changes, using resolution from the lockfile
Source locally installed gems is ignoring #<Bundler::StubSpecification name=ox version=2.14.11 platform=ruby> because it is missing extensions
/usr/local/lib/ruby/3.2.0+1/bundler/definition.rb:486:in `materialize': Could not find ox-2.14.11 in any of the sources (Bundler::GemNotFound)
        from /usr/local/lib/ruby/3.2.0+1/bundler/definition.rb:191:in `specs'
        from /usr/local/lib/ruby/3.2.0+1/bundler/definition.rb:239:in `specs_for'
        from /usr/local/lib/ruby/3.2.0+1/bundler/runtime.rb:18:in `setup'
        from /usr/local/lib/ruby/3.2.0+1/bundler.rb:151:in `setup'
        from /root/my_app.rb:2:in `<main>'

Please note that Source locally installed gems is ignoring #<Bundler::StubSpecification name=ox version=2.14.11 platform=ruby> because it is missing extensions
Again, ox has C extension library and it's not compiled in your build script. That's why it fails.

Hello! I'm seeing some progress, and some remaining errors.
I had an example going with the simple and dependency-less colorize gem.
The approach described in @kateinoigakukun 's gist had been good background.
I began seeing an odd error with the gem he chose as an example, though - syntax_tree.
$ wasmtime run \
  --mapdir /usr::3_2-wasm32-unknown-wasi-full/usr \
  --mapdir /src::./src \
  --env BUNDLE_GEMFILE=/src/Gemfile \
  ruby.wasm -- /src/tree.rb
Could not find fiddle-1.1.1 in locally installed gems
Run `bundle install` to install missing gems.

Looking closer, the fiddle gem appears to be a "default" gem,
and is therefore packaged inside the 3.2.0 ruby installation.
$ bundle install
Using bundler 2.4.1
Using colorize 0.8.1
Using fiddle 1.1.1
Using prettier_print 1.2.0
Using syntax_tree 5.3.0
Bundle complete! 3 Gemfile dependencies, 5 gems now installed.
Bundled gems are installed into `./bundle`
$ bundle show syntax_tree
/home/grace/src/ruby-wasm/src/bundle/ruby/3.2.0/gems/syntax_tree-5.3.0
$ bundle show fiddle
/home/grace/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/fiddle-1.1.1

Since my Ruby versions are the same, I'd imagine fiddle should be a "default" gem in ruby.wasm also:
$ ruby -v
ruby 3.2.0 (2022-12-25 revision a528908271) [x86_64-linux]
$ wasmtime ruby.wasm -- -v
ruby 3.2.0 (2022-12-25 revision a528908271) [wasm32-wasi]

Sadly, no fiddle in ruby.wasm:
$ ls 3_2-wasm32-unknown-wasi-full/usr/local/lib/ruby/gems/3.2.0/gems/
abbrev-0.1.1           etc-1.4.2          net-pop-0.1.2       psych-5.0.1           singleton-0.1.1
base64-0.1.1           fcntl-1.0.2        net-protocol-0.2.1  racc-1.6.2            stringio-3.0.4
benchmark-0.2.1        fileutils-1.7.0    net-smtp-0.3.3      rake-13.0.6           strscan-3.0.5
bigdecimal-3.1.3       find-0.1.1         nkf-0.1.2           rbs-2.8.2             syntax_suggest-1.0.2
bundler-2.4.1          forwardable-1.3.3  observer-0.1.1      rdoc-6.5.0            tempfile-0.1.3
cgi-0.3.6              getoptlong-0.2.0   open3-0.1.2         readline-0.0.3        test-unit-3.5.7
csv-3.2.6              ipaddr-1.2.5       openssl-3.1.0       reline-0.3.2          time-0.2.1
date-3.3.3             irb-1.6.2          open-uri-0.3.0      resolv-0.2.2          timeout-0.3.1
debug-1.7.1            json-2.6.3         optparse-0.3.1      resolv-replace-0.1.1  tmpdir-0.1.3
delegate-0.3.0         logger-1.5.3       ostruct-0.5.5       rexml-3.2.5           tsort-0.1.1
did_you_mean-1.6.3     matrix-0.4.2       pathname-0.2.1      rinda-0.1.1           typeprof-0.21.3
digest-3.1.1           minitest-5.16.3    power_assert-2.0.3  rss-0.2.9             un-0.2.1
drb-2.1.1              mutex_m-0.1.2      pp-0.4.0            ruby2_keywords-0.0.5  uri-0.12.0
english-0.7.2          net-ftp-0.2.0      prettyprint-0.1.1   securerandom-0.2.2    weakref-0.1.2
erb-4.0.2              net-http-0.3.2     prime-0.1.2         set-1.0.3             yaml-0.2.1
error_highlight-0.5.1  net-imap-0.3.4     pstore-0.1.2        shellwords-0.1.0      zlib-3.0.0

Here are the gems in my normal Ruby 3.2.0:
$ ls ~/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/
abbrev-0.1.1           getoptlong-0.2.0              ostruct-0.5.5         ruby2_keywords-0.0.5
addressable-2.8.1      io-console-0.6.0              pathname-0.2.1        rubygems-update-3.4.5
base64-0.1.1           io-nonblock-0.2.0             power_assert-2.0.3    securerandom-0.2.2
benchmark-0.2.1        io-wait-0.3.0                 pp-0.4.0              set-1.0.3
bigdecimal-3.1.3       ipaddr-1.2.5                  prettyprint-0.1.1     shellwords-0.1.0
bundler-2.4.1          irb-1.6.2                     prime-0.1.2           singleton-0.1.1
bundler-2.4.5          json-2.6.3                    pry-0.14.2            stringio-3.0.4
capybara-3.38.0        logger-1.5.3                  pstore-0.1.2          strscan-3.0.5
cgi-0.3.6              matrix-0.4.2                  psych-5.0.1           syntax_suggest-1.0.2
coderay-1.1.3          method_source-1.0.0           public_suffix-5.0.1   syslog-0.1.1
csv-3.2.6              mini_mime-1.1.2               racc-1.6.2            tempfile-0.1.3
date-3.3.3             minitest-5.16.3               rack-<IP_ADDRESS>          test-unit-3.5.7
debug-1.7.1            mutex_m-0.1.2                 rack-test-2.0.2       time-0.2.1
delegate-0.3.0         net-ftp-0.2.0                 rake-13.0.6           timeout-0.3.1
did_you_mean-1.6.3     net-http-0.3.2                rbs-2.8.2             tmpdir-0.1.3
digest-3.1.1           net-imap-0.3.4                rdoc-6.5.0            torch-rb-0.12.0
drb-2.1.1              net-pop-0.1.2                 readline-0.0.3        torch-rb-0.12.1
english-0.7.2          net-protocol-0.2.1            readline-ext-0.1.5    tsort-0.1.1
erb-4.0.2              net-smtp-0.3.3                regexp_parser-2.6.2   typeprof-0.21.3
error_highlight-0.5.1  nkf-0.1.2                     reline-0.3.2          un-0.2.1
etc-1.4.2              nokogiri-1.14.0-x86_64-linux  resolv-0.2.2          uri-0.12.0
fcntl-1.0.2            observer-0.1.1                resolv-replace-0.1.1  weakref-0.1.2
fiddle-1.1.1           open3-0.1.2                   rexml-3.2.5           xpath-3.2.0
fileutils-1.7.0        openssl-3.1.0                 rice-4.0.4            yaml-0.2.1
find-0.1.1             open-uri-0.3.0                rinda-0.1.1           zlib-3.0.0
forwardable-1.3.3      optparse-0.3.1                rss-0.2.9

There's much ruby.wasm can do alone, though real adoption can only happen
once people can add and use gems as easily as on their base machine.
If we can agree on these 'default' gems included in each distribution,
this could be a good launchpad for more gem access on wasm.

In short, fiddle is unavailable on the WASI platform due to a lack of runtime dynamic linking. I know it's one of the most crucial library to get real-world adoption, so we should have a way to mitigate this situation. But I think it will be happened after supporting extension libraries in RubyGems

I tried the example in your gist without success, in fact I'm not sure I even understand it (shouldn't it need to build with the vfs first?). Anyway, I attached my experience to that. Has anyone actually managed to do this at all, or should I just inline code (pure ruby only, obviously) to add additional libraries?
FYI the lib I was trying with was a pure-ruby msgpack gem.

I added a simple CLI tool to package gems into .wasm https://github.com/ruby/ruby.wasm/pull/358. It supports pure Ruby gems and very simple extension libraries at this moment.
We can support more complex extension libraries like nokogiri after dynamic linking support.

I just wrote a FAQ entry query, for gem support. I did not know this thread exists before.

I added an experimental CLI tool to package gems into .wasm https://github.com/ruby/ruby.wasm/pull/358. It supports pure Ruby gems and very simple extension libraries at this moment.

Hey there kateinoigakukun - could you add a FAQ entry perhaps, and simple usage example, at the least for a simple gem? Perhaps one day more complex gems work but for me I'd be happy to just have small gems that do things be supported. I want to find out how many of my gems I can make work via wasm.ruby, and that includes super-simple gems like hello world or perhaps a bit more complicated ones. Also, if anyone has time, it would be nice to show limitations; I assume we can not create directories or files via a .html file that has ruby.wasm? If so it would be GREAT, but if not then I understand it, the browser is a limited environment. The FAQ could mention this though - I desperately need documentation. I am really bad at figuring out things on my own (except for a bit of trial and error, and reading other people's examples; that would also be nice to have for ruby.wasm, examples by other people so we can learn from that).


Create a plugin for Jetbrains

I'm sure there are a large number of users who would love to have a plugin for Jetbrains IDEs in addition to VSCode.

https://github.com/terrastruct/d2/issues/747


{   "detail-type": ["customer_account_created", "customer_account_updated", "consumer_created", "consumer_updated"],   "source": ["ssrm"],   "data": {     "consumer": [{       "my_id": {         "!": "null"       }     }]   } }

Contact Details
No response
Runtime
Java
Language
English
Language
SAM
Application Code
/src/app.py
Unit Test Code
/src/app.py
Integration Test Code
/src/app.py

Looks like this may have been created by accident. Closing for now.


What I mean by "coreboot", is with an good selection of common chromebooks, it is possible to replace the BIOS with an standard UEFI/CSM based Bios (known as "coreboot") so that normal operating systems can be easily installed (in my case I installed arch linux)

how would I make it so that when I press ctrl+alt it defaults back to standard function keys?

[main]
f1 = back
f2 = forward
f3 = refresh
# etcetera

[control+alt]
f1 = f1
f2 = f2
f3 = f3
# etcetera

also is it possible to make these configs not affect TTY's?

keyd knows nothing about the graphical environment it runs (or doesn't run) in, so no, I don't think so. You could potentially use keyd-application-mapper, though.

THat way of mapping presses didnt really work right for what I needed

What didn't work?

the [_]]] key,

What do you mean? Is that the leftmeta key?

# cant consistently get to work
[leftmeta]
f1 = f1
f2 = f2

That's because leftmeta, by default, refers only to a key, not a layer that is activated by anything. You should either override the meta layer instead, or create the leftmeta layer and assign it to leftmeta, like so:

[main]
leftmeta = layer(leftmeta)

[leftmeta:M]
f1 = f1
f2 = f2

while that fixes things, now when I use my tilingwm's hotkeys, it no work (meta+d is supposed to open a runbox, now it only presses D on the keyboard
replacing leftmeta with meta in the config I had before however, does work just fine

I figured it out, you were correct with the leftmeta being the wrong grouping, and now it works as intended,
going with your suggestion for just A-tab for now for F3,
[ids]
*

## Chromebook function keys
[main]
f1 = back
f2 = forward
f3 = refresh
f4 = print
f5 = A-tab
f6 = brightnessdown
f7 = brightnessup
f8 = mute
f9 = volumedown
f10 = volumeup

## Allow F1-10 access through meta+fnX
[meta]
f1 = f1
f2 = f2
f3 = f3
f4 = f4
f5 = f5
f6 = f6
f7 = f7
f8 = f8
f9 = f9
f10 = f10

## Allow TTY access
[control+alt]
f1 = C-A-f1
f2 = C-A-f2
f3 = C-A-f3
f4 = C-A-f4
f5 = C-A-f5
f6 = C-A-f6
f7 = C-A-f7
f8 = C-A-f8
f9 = C-A-f9
f10 = C-A-f10

Check out https://github.com/WeirdTreeThing/cros-keyboard-map.
It generates a specific layout for the specific chromebook (not all chromebooks have the same layout)

I based mine off the fact that if you were to plug any regular old keyboard into a chromebook, F1-10 all serve damn near the same functions,
Also why does the one you linked reference vivaldi specifically? thats an special web browser


[Bug] After the geo3d configuration displays the label, the mouse moves into the block and it is not highlighted

Version
5.4.2
Link to Minimal Reproduction
https://codesandbox.io/s/heuristic-dream-98wqzb?file=/src/index.js
Steps to Reproduce

Configure display label
Move the mouse into the map
The block is not highlighted when the mouse moves into it

Current Behavior
The block is not highlighted when the mouse moves into it
Expected Behavior
Move the mouse into the corresponding block to highlight
Environment
- OS:windows10
- Browser:111.0.5563.147（正式版本） （64 位）
- Framework:vue3.2.45

Any additional comments?
No response

duplicate of #14151
As I said already in your other post #18485, map3D has problems with tooltip and emphasis.
Please review the issues links there.


internal: Check for derive attributes by item path, not derive identifier

Prior we only checked if an attribute is the exact derive identifier and nothing else to collect derive attributes. That means when we encounter the following:
#[::core::macros::builtin::derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct ModPath {
    pub kind: PathKind,
    segments: Vec<Name>,
}

We won't actually expand the derive attributes, but instead we just expand the derive attribute with our dummy identity expander.
The changes here make it so we actually lookup the attribute path, check if it is the derive attribute and then collect the derives.

bors r+


Minor fix to location of metadata box

This fix seems to work more reliably with iPhone HEIC files. May not be perfect still.
FYI @jim-liu

@drbrownman The 3971 number was based on the HEIC file structure from https://cheeky4n6monkey.blogspot.com/2017/10/monkey-takes-heic.html. I have seen a few files taken by an iPhone Xs that have a different EXIF offset, but this fix doesn't seem to parse them correctly either. Do you have a sample that works with this fix but not the original?

Good to know @jim-liu
I tested it off files from iPhone 7. Here is a sample file.
If you can, send a iphoneX heic file sample.

Tested with some iPhone 8 files I could get my hands on. Looks like some of those files had a EXIF metadata as well as a XMP metadata section. New fix seems to work for those files.

Thanks for the new fix. I will test it with the files I have tomorrow. In the mean time, these were taken with an iPhone Xs and have issues with the original and your first fix.

Try with the most recent fix. Seems to pass for all the HEIC files i am testing with at the moment.

Thanks! I tested a few different HEIC files (iPhone 6s, SE, 8 and Xs) and they all worked! Also tested the findEXIFinJPEG method against some JPEG files taken by iPhones and Windows Phones and all worked as well.
I cleaned up the code a bit. If it looks good to you I will merge the PR.

All good. Go for it.


Limit command just block devices not limiting the speed

limit command just block devices " no internet " not limiting network speed , i tested that on 2 devices with different OS , from the router wifi and the access point wifi  even with different speed .. same results although the device on the terminal is limited .
Linux Mint 19.1

When you limit a device, can you try to capture network traffic coming from the limited device?
Are you sure IP forwarding is enabled (sysctl net.ipv4.ip_forward should output 1 when limiting)?

the old output :
net.ipv4.ip_forward = 1
net.ipv4.ip_forward_use_pmtu = 0
sysctl: reading key "net.ipv6.conf.all.stable_secret"
sysctl: reading key "net.ipv6.conf.anbox0.stable_secret"
sysctl: reading key "net.ipv6.conf.default.stable_secret"
sysctl: reading key "net.ipv6.conf.enp9s0.stable_secret"
sysctl: reading key "net.ipv6.conf.lo.stable_secret"
sysctl: reading key "net.ipv6.conf.wlp8s0.stable_secret"

the new output after using
sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1 :

is
net.ipv4.ip_forward = 1

so it is enabled, i tested limiting again but same results, i will upload a log from wireshark ARP protocol .. ( the target device , router . Linux device " )
tell me if other info is required
LOG.tar.gz
thanks

IP forwarding is enabled and the ARP traffic log looks good to me.
Could you capture any TCP traffic that was dedicated to or sent by the limited device? If not, there is a probabling with forwarding the traffic.
Do you have some kind of special / different subnet? Are you connected to dLAN or a repeater by any chance?

One more thing:
Try to run EvilLimiter with the --flush flag. Maybe there are firewall rules that drop forwarded traffic.

first i can say the problem solved but limiting not working as i expected not sure if that normal so i have some questions
but first the details:
Do you have some kind of special / different subnet? Are you connected to dLAN or a repeater by any chance?
i am using custom DNS on Linux device not the ISP/the router DNS, the ironic side i was thinking about that at the beginning but at that i saw the DNS was automatic and i can see the default DNS included so i hesitated and then i just ignored that. but any way after deleting the custom DNS i think limiting worked but i have some questions.
1- first time it worked as i remember the speed was more than the "limited if limited" for example 400-900kbit the speed  on the deicemaybe  2-3 mbit **sometimes it goes to more than that near to "MAX speed" ** some time at the range is that normal ?
2-  i found " no internet" on the device after period of time but after reconnecting the device and rescan on evillimiter that was fixed is that normal ?
but anyway i did not have much time to test that more at the time of posting this post so i might update that before your reply
thanks

final update : the limiting only work when i use WIFI from the router not from the access point (linked to the router)  and with the default DNS .. and when i am using the router WIFI on evillimter sometimes you need to scan more than one time to show all hosts but with using the access point the scan is more efficient but that is not the problem here.
so what is your comment on that ? and the questions above.
if that required i might upload logs of all protocols using wireshark using the router and the access point.

1- first time it worked as i remember the speed was more than the "limited if limited" for example 400-900kbit the speed on the device maybe 2-3 mbit sometimes more than that near to "MAX speed" sometime at the range is that normal ?
2- i found " no internet" on the device after period of time but after reconnecting the device and rescan on evillimiter that was fixed is that normal ?

That is definitely not normal. Usually the rate should be either below or just slightly above the limitation.How did you measure the speed? It should be measured over a longer period of time (5-6s at minumum) to get an average.That's because there is something called a burst, where traffic can be sent at max. speed but just over a very short time, until the limitation kicks in (depending on the burst size).

By "no internet", do you mean the traffic was blocked or did you fully disconnect from your network? However, either of those should not happen.

Unfortunately, I'm not able to reproduce the issues you listed.

when i am using the router WIFI on evillimter sometimes you need to scan more than one time to show all hosts but with using the access point the scan is more efficient

I noticed that myself. Sometimes hosts are missing, because of the sloppy scan. The faster the scan, the sloppier the results.Soon you will be able to specify the scan accuracy (either fast and unaccurate or slow and accurate).

scan point:
i think i have explanation for the scan point maybe because the router single is weaker than access point beside i noticed as i remember the delay is with devices that using the access point but that is not the problem here and it can be fixed by rescan.
not internet point :  i think that was temporary or not a problem that i will face this  about the router not the access point the limiting using the access point not working at all
limiting and speed point :
i just tested again " limiting" using the router WIFI and custom DNS with automatic option the limiting worked and that is strange because i tried that before and did not work and after changing that it worked so i do not know how or maybe after enabling IP forwarding but if because that only i tested limiting after that and did not work .. so i am not sure what step exactly fixed it
but just to keep the facts and taking step forward : the limiting works  and i think in less than minute the speed goes down even more lower than than " limited speed" and i made sure the device is effected by the " attack or limiting " by freeing it  immediately ..
the access point point :
at least for the points above the results not that bad at least for me but for the access point
why blocking working fine but limiting not working ?

Update : No internet / The access point / Limiting / issues are fixed even the speed (test) the result is logical.
after using !  sudo evillimiter --flush sorry that i did not test that earlier even sorry for myself.
Thanks

I never thought about that ;).
I'm going to include an admin-check, so that will never happen again.
Issue will be closed after the fix.
Thank you!


Add a  to the runtime artifacts´ pom.xml

The generated metadata is reusing the <description> from the parent pom. It should have its own:
    {
      "name": "Quarkus jOOQ - Runtime",
      "description": "Parent POM for Quarkiverse projects that includes the default release and artifact publishing related\n    configuration",
}

@gastaldi hopefully this addressed by this commit: https://github.com/quarkiverse/quarkus-jooq/commit/7d0b4410a3503faf41fb4864ee5fa6b1d72d385c

@angrymango it does, it should be okay in the next extension release. Thank you!


Process killed while training

I execute:
facenet_train_classifier.py with mostly default params:

--logs_base_dir
~/work/dataset_logs/
--models_base_dir
~/work/dataset_models/
--data_dir
~/work/dataset_aligned/
--image_size
160
--model_def
models.inception_resnet_v1
--optimizer
RMSPROP
--learning_rate
-1
--max_nrof_epochs
80
--keep_probability
0.8
--random_crop
--random_flip
--learning_rate_schedule_file
/home/cranfan/work/facenet/data/learning_rate_schedule_classifier_casia.txt
--weight_decay
5e-5
--center_loss_factor
1e-4
--center_loss_alfa
0.9

Dataset aligned and prepared for training. When I start it I got next output:
Model directory: /home/cranfan/work/dataset_models/20170410-151416
Log directory: /home/cranfan/work/dataset_logs/20170410-151416
Total number of classes: 10
Total number of examples: 30
Building training graph
Running training
Backend TkAgg is interactive backend. Turning interactive mode on.

While execute next line (facenet_train_classifier.py line 303):
err, _, step, reg_loss, summary_str = sess.run([loss, train_op, global_step, regularization_losses, summary_op], feed_dict=feed_dict)
I got next error:
Process finished with exit code 137 (interrupted by signal 9: SIGKILL)
I have not idea what cause of this error. May be someone faced previously with similar issue. Will appreciate any help on this issue. Thanks!

Same here: while following the wiki for training the facenet model and executing facenet_train_classifier, the process gets killed.
Here's the output from the python script execution:
svitlana@ubuntu:/ir/facenet/facenet$ python3 src/facenet_train_classifier.py --logs_base_dir /tmp/logs/facenet/ --models_base_dir /tmp/models/facenet/ --data_dir /ir/image_samples/megamind_aligned/ --image_size 160 --model_def models.inception_resnet_v1  --optimizer RMSPROP --learning_rate -1 --max_nrof_epochs 80 --keep_probability 0.8 --random_crop --random_flip --learning_rate_schedule_file data/learning_rate_schedule_classifier_casia.txt --weight_decay 5e-5 --center_loss_factor 1e-4 --center_loss_alfa 0.9 Model directory: /tmp/models/facenet/20170402-085804 Log directory: /tmp/logs/facenet/20170402-085804 Total number of classes: 2 Total number of examples: 13 Building training graph W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE3 instructions, but these are available on your machine and could speed up CPU computations. W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.1 instructions, but these are available on your machine and could speed up CPU computations. W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.2 instructions, but these are available on your machine and could speed up CPU computations. W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use AVX instructions, but these are available on your machine and could speed up CPU computations. W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use AVX2 instructions, but these are available on your machine and could speed up CPU computations. W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use FMA instructions, but these are available on your machine and could speed up CPU computations. Running training Killed
There are no problems indicated in the logs. Event log is interrupted pretty much mid-sentence.
Same exact setup on another machine has successfully proceeded to counting down epochs.
Is there a problem with the amount of resources available? How does one debug this situation?
Thanks in advance for your help!

Having the same issue. last lines in the log are
9InceptionResnetV1/Block8/Branch_1/Conv2d_0b_1x3/weights:0^R>InceptionResnetV1/Block8/Branch_1/Conv2d_0b_1x3/weights/Assign^Z>InceptionResnetV1/Block8/Branch_1/Conv2d_0b_1x3/weights/read:0
�^A
@InceptionResnetV1/Block8/Branch_1/Conv2d_0b_1x3/BatchNorm/beta:0^REInceptionResnetV1/Block8/Branch_1/Conv2d_0b_1x3/BatchNorm/beta/Assign^ZEInceptionResnetV1/Block8/Branch_1/Conv2d_0b_1x3/BatchNorm/beta/read:0
�^A
GInceptionResnetV1/Block8/Branch_1/Conv2d_0b_1x3/BatchNorm/moving_mean:0^RLInceptionResnetV1/Block8/Branch_1/Conv2d_0b_1

My command is
python src/facenet_train_classifier.py --logs_base_dir ~/logs/facenet/ --models_base_dir ~/models/facenet/ --data_dir /tf_files/star_wars/CASIA-maxpy_mtcnnpy_182 --image_size 160 --model_def models.inception_resnet_v1 --lfw_dir /tf_files/star_wars/myset_mtcnnpy_182 --optimizer RMSPROP --learning_rate -1 --max_nrof_epochs 80 --keep_probability 0.8 --random_crop --random_flip --learning_rate_schedule_file data/learning_rate_schedule_classifier_casia.txt --weight_decay 5e-5 --center_loss_factor 1e-4 --center_loss_alfa 0.9
Hope someone can help.

Hi @fedyunin,
When I have gotten error code 137 it have mostly been due to out of memory.

Thanks all for reply. This is just Out of memory issue.

Hi,
How did you solve the problem?

I run this code in the Virtualbox. I added more memory for virtual machine.
probably need figure out how to optimize code for decrease memory usage,
but I think this is other issue.
On Tue, Apr 25, 2017 at 10:47 AM, LiWei<EMAIL_ADDRESS>wrote:

Hi,
How did you solve the problem?
—
You are receiving this because you modified the open/close state.
Reply to this email directly, view it on GitHub
https://github.com/davidsandberg/facenet/issues/236#issuecomment-296876964,
or mute the thread
https://github.com/notifications/unsubscribe-auth/AD-VLPmD-t2lcMFLBOwS-7WnWwbmXw8sks5rzV6ogaJpZM4M5cxD
.

--
Best Regards, Fedyunin Alexey


Wrong order with httpObjectAggregator and HttpResponseEncoder

I catch a exception message:unsupported message type: DefaultFullHttpResponse(expected: ByteBuf, FileRegion)
I know if a message(not ByteBuf or FileRegion) write to AbstractNioByteChannel without Encoder, it will throw exception,but a add the HttpResonseEncoder to the ChannelPipeline. so i read the source find the code in MessageAggregator at line 227,
final ChannelFuture future = ctx.writeAndFlush(continueResponse).addListener(listener);
write a message with ChannelHandlerContext, it's will back from this ChannelHandler, but my HttpResponseEncoder is after HttpObjectAggregator,
So, I think it must be final ChannelFuture future = ctx.channel().writeAndFlush(continueResponse.addListener(listener));
sorry for bad english from a Chinese Programmer

@okou19900722 thats an error in your ChannelPipeline setup.  You need to put HttpResponseEncoder before HttpObjectAggregator. Its even stated in the javadocs:
https://github.com/netty/netty/blob/4.1/codec-http/src/main/java/io/netty/handler/codec/http/HttpObjectAggregator.java#L43


[network][metrics] record # dialer vs. listener connections

To help debug NAT / connectivity issues where, e.g., nobody can dial my validator we should:

Add a label to the connected peers metric, "origin", that can be either "dialer" or "listener".
When a new connection opens and successfully negotiates, I will increment the "dialer" label if I am the dialer and the "listener" label if I am the listener.
On the graphana dashboard, we can show "dialer" + "listener" for the total connected peers and then a stacked area graph or something to show # "dialer" vs # "listener" connections.

If other validators can't dial us, it should show # "listener" = 0 and # "dialer" = # connected. Likewise, if there is a problem listening for connections, it should show # "dialer" = 0.
That's not to say there are no false-positives/-negatives, but it will probably help us debug some connectivity issues.
Relevant code:
https://github.com/libra/libra/blob/master/network/src/peer_manager/mod.rs#L611

We now do this as inbound and outbound connections!


Installation Failing on Step 1 in Ubuntu 14.04

Following the directions here:
Step 1.a. Suggests installing debian packages. When I get to librealsense2-utils, I get the following error:
The following packages have unmet dependencies:  librealsense2-utils : Depends: librealsense2 (= 2.10.3-0~realsense0.66) but it is not going to be installed                        Depends: libglfw3 (>= 3.1) but it is not installable E: Unable to correct problems, you have held broken packages.
Perhaps that option may only apply to 16.04...
Step 1.b. Suggests installing by following instructions here. When I run the script ./scripts/patch-realsense-ubuntu-xenial.sh , I get the error:
Handle uvcvideo : Applying the patched module ... modprobe: ERROR: could not insert 'uvcvideo': Invalid argument Failed to insert the patched module. Operation is aborted, the original module is restored Verify that the current kernel version is aligned to the patched module version modprobe: ERROR: could not insert 'uvcvideo': Invalid argument
Should I be using a specific kernel? I have had different errors returned when running the patch script with different kernels (4.4.0-109, 4.4.0-116, etc).

Hello @rkeatin3 ,
The debian packages for LibRealSense are built and tested with Ubuntu 16.0.X LTS (currently kernels 4.4,4.10 and 4.13) 64bit. If you're running a different distribution/Ubuntu version then the packages may not be fully compatible.
Patching the kernel with script is an alternative route (you cannot have the kernel driver patched both by the manual script and DKMS), and is not recommended as a general rule:

Relatively high maintenance "cost" as you have to rebuild the kernel modules each time the kernel is upgraded.
The patch requires to user to update the kernel to the latest version of the LTS line, e.g. for 4.4.- kernels 4.4.0-109, 4.4.0-112, and 4.4.0-119 you'll have to run 4.4.0-119, otherwise it is not guaranteed to succeed.

With all that said I'd suggest to stick to the debian packages if you're running Ubuntu LTS 64bit.
As for libglfw3 error - please see the answer to a similar question on LibRealSense forum #722.

To clarify, I'm on Ubuntu 14.04.
Anyway, I didn't mean to imply I had did both steps concurrently; I tried both separately.
I did use the script to install glfw3, but apt-get still complains that the dependency is missing when I try to install the LibRealSense packages. Maybe that's because it gets installed in /usr/local/lib instead of /usr/lib; I don't know apt-get manages dependencies with packages installed from source.
I tried using apt-get download to sidestep this problem, but that still requires me to use the argument --ignore-depends libglfw3 when installing the deb with dpkg. That seemed okay, but once I had installed librealsense2 and librealsense2-utils, librealsense2-dkms complained that it didn't have dkms. In trying to use apt-get to install it, I see that it also needs glfw3. I decided to stop here because we're subverting the whole purpose of these package management tools, but I ended up having to go through the process of installing dkms just to remove librealsense2-dkms because post-removal script was failing without dkms installed.
Perhaps I'm missing something here, but I don't think it's unreasonable to put the onus on you for more detailed installation instructions that work with the Ubuntu distributions that you support.

Is the installation of the original librealsense still supported? I would prefer to use that version anyway, as I have a bunch of code written by a coworker that uses the older library.

Hi! I also encountered this problem and I have solved it in this way:

Download this install script for trusty: libfreenect2
Enter to the ./debs folder, use sudo dpkg -i libglfw3*deb
 sudo apt-get install -f

Then the unmet dependency problem can be solved and you can install librealsense2-utils on your ubuntu 14.04.

[Please Ignore - RealSense system comment]


feat: add a loading indicator to the overview page

Is your feature request related to a problem? Please describe.
I took a look at the overview page - for several seconds (while the data was loading/rendering), I only saw a white screen - I assumed that the data wasn't loading and went to turn off my adblocker until it finally appeared.
Describe the solution you'd like
It'd probably be a good idea to add a loading indicator. It doesn't have to be anything fancy - some bolded text would suffice.
Describe alternatives you've considered
It might also be a good idea to try and speed up the loading process a bit, although I appreciate that this might not be easy/feasible.

I haven't exactly fixed this, but I've stopped creating all the tiny dots for the CJK Unified Ideographics, which is what was taking up all the time.


Research ways to map from obs/var to scenes

One of the query patterns we want to support is accessing/querying Scenes from an ExperimentAxisQuery that filters on obs and var axes. This task is to research the options for retrieving the scene IDs from the query.
[sc-48287]

This is a non-sprint task


pull request for e2e test at 12/24/2016 03:15:06

:white_check_mark: Validation status: passed
For more details, please refer to the build report.
Note: If you changed an existing file name or deleted a file, broken links in other files to the deleted or renamed file are listed only in the full build report.


Is MHD in spherical coordinates actually supported?

Athena, as advertised, can run in spherical coordinates, even when the poles are included in the computation domain. Nice!
E.g. Sedov explosion (aka hydro blast):

https://github.com/leftaroundabout/athena-public-version/commit/656ed8ae65580de807448ce1ba5ae711c295a743#diff-996f90439ea6a4a98a169d70ffde9f4d
Maybe that's a bit of a trivial case because the isotropy means we don't actually have any vectors pointing in ϑ direction, which might explain why we don't see any problems at the pole (mind, other codes already have problems with this test!)
Making it an MHD blast, unfortunately, also leads to trouble in Athena:

All I've changed here (perhaps naïvely) was turning on the magnetic field.
https://github.com/leftaroundabout/athena-public-version/commit/4a0f1687e4a6edf67c75363fbe4825ae4e5988c1#diff-996f90439ea6a4a98a169d70ffde9f4d
This time, the singularity at the pole is impossible to miss. The code still runs ok for a while, until around t = 2·10-2 the CFL slows it down ever more, more or less converging to a complete standstill.
Have I merely missed some configuration option that would be necessary to get this working, or is there actually a fundamental problem for MHD at the poles? This would hardly be surprising – neither Flash or Pluto can actually do MHD in spherical coordinates, in fact I know no code that manages it without correction tricks (computation in two 90° rotated systems). But Athena seems to rather emphasize its coordinate-system flexibility, so it would be interesting to know whether it is actually up to the task.

Thank you for the report. Actually, the code itself supports MHD in spherical coordinates even with the poles, but that particular problem generator (blast wave) does NOT support magnetic fields in spherical coordinates. In order to run the MHD blast wave in spherical coordinates, you need to initialize the magnetic fields accordingly using the vector potential. I'm sorry it's a bit confusing. We should add a proper initial condition, or at least add a trap to warn the user.
Instead, to demonstrate the MHD in spherical coordinates including the poles, you can try the field_loop_pole test (please configure the code with -b and --prob field_loop_pole, and then run it with inputs/mhd/athinput.field_loop_poles). This is a standard B-field loop advection test, but the loop goes across the pole.
Also, please note that a singularity is a singularity anyway - here "support" means it does not crash or does not behave badly, but please do not expect it is very accurate around the poles. It may still cause numerical problems such as short timesteps.

The blast wave problem generator will better support MHD in curvilinear coordinates in future releases of the code.
For the present version, the code is assigning
B1 = B0 cos(ψ)
B2 = B0 sin(ψ)
B3 = 0
for some angle ψ, typically 30 degrees. This was done whether the components were Cartesian, cylindrical, or spherical, and in spherical coordinates this field is poorly behaved near the pole (in fact it has a magnetic monopole density that diverges there). In order for the curvilinear fields to match the Cartesian field, the components should be changed to
Br = B0 (cos(ψ) cos(φ) - sin(ψ) sin(φ))
Bφ = -B0 (sin(ψ) cos(φ) + cos(ψ) sin(φ))
Bz = 0
in cylindrical coordinates and
Br = B0 |sin(θ)| (cos(ψ) cos(φ) - sin(ψ) sin(φ))
Bθ = B0 cos(θ) (cos(ψ) cos(φ) - sin(ψ) sin(φ))
Bφ = -B0 (sin(ψ) cos(φ) + cos(ψ) sin(φ))
in spherical coordinates.
With these changes, the code at least runs with a relatively constant timestep.

Thanks for the replies. I should have noticed that the initial magnetic field was not homogeneous.
By properly transforming the initial field (https://github.com/leftaroundabout/athena-public-version/commit/c6c1c9a330e3430a05a9abe20d35b8065ba1e2b8), I was indeed able to run the simulation with relatively constant time step.
https://github.com/leftaroundabout/athena-public-version/tree/fde7abef3a2e3327936b976a8eb44dbecaff3df3
Sure enough, there are notable artifacts at the poles

but in the equatorial plane the result essentially corresponds to what the MHD blast also does in cartesian coordinates.

(I would attribute the discrepancy more to the omitted “planet interior” region in the middle, than to the pole issues. Of course it's not a conclusive test anyway, at such low resolution etc..)
@c-white I wonder, did you just use a different sign convention for orientation of the angle ψ in the above equations, or is this something Athena-specific I should be aware of? When I transformed the original homogeneous B-field, I ended up with
Br = B0 · |sin(θ)| · (cos(ψ) · cos(φ) + sin(ψ) · sin(φ))
Bθ = B0 · cos(θ) · (cos(ψ) · cos(φ) + sin(ψ) · sin(φ))
Bφ = B0 · (sin(ψ) · cos(φ) − cos(ψ) · sin(φ))
which corresponds to your equation with ψ ↦ -ψ.
Also, what it the advantage to taking the absolute-value of sin(θ), which should in the domain be non-negative anyway?
Again, thank you!

Indeed the sign of ψ should be flipped in what I wrote above.
As for the absolute value, you're right that changes nothing here. It's just a habit of mine from considering the volume element as r2 |sin(θ)| dr dθ dφ. This is important for dealing with the ghost zones across the pole, since they are in the sin(θ) < 0 part of the coordinate system but internally the code chooses the convention that volumes there are still positive.


🐛 Bug: UI issue in active navigation link in dark mode

Bug Report Checklist

[X] I have searched for related issues and found none that matched my issue.
[X] This is the appropriate issue form for the bug I would like to report.

Expected
The link should be properly visible with good color contrast
Actual
Black-colored text on a dark background isn't that readable

Accessibility dev tools (on Firefox):

Seems fine in light mode though:

Additional Info
No response

👍 definitely a bug - thanks for reporting!


Change secret volume plugin reference to name

Changes the secret volume plugin to use only the name of a secret instead of a full object reference as discussed in #4954

@erictune @smarterclayton @derekwaynecarr @mfojtik PTAL

Does this mean we should change the volume claim to be the same?  @markturansky

LGTM except compat breakage and just agreement that this is the right path forward

@thockin volume claims already use "name", if that's what you mean.  I have "ClaimName" (formerly ClaimRef) while Paul has "Target" instead of "SecretName".
I prefer the latter.  What is a "target"?  Requires parsing and thought.  "SecretName" is a secret's name.

@thockin I'm pretty confident that no one is depending on this functionality but I'm okay keeping the beta[12] apis compatible and making a conversion.  In the beta[12] APIs you will not have to set the namespace.
I really do think this is a much better API

@markturansky I will change v1beta3 and internal to use SecretName; I had thought about changing the name of the field but wanted to see what others thought

+1 to v1b[12] compat and to name change.

@thockin @erictune feedback addressed; PTAL

LGTM but for json tag

@thockin fixed

Just waiting for green

Shippable keeps flaking.  One more try.

@markturansky care to offer your imprimatur on this?

There we go @googlebot, what took you so long?

LGTM

@thockin light is green, trap is clean :ghost:


Streamline code.

--copy repo, create a new one.
--refine code to testable functions.

Copied.  Will refine after completing the Udacity course.