Custom data type history API usage in Python

Description

Using the History API that returns lists instead of data frames with Python custom data types was having two issues: returning empty lists and timing out when enumerating the result in Python.
These changes solve both issues by using the Slice.Get(Type) method instead of the generic Slice.Get<T>(), so that it can match the custom data in the slices to the actual Python class.
The timeout was being caused by a deadlock in the custom class readers data access, which is solved by wrapping Python custom data history requests results using WrapPythonDataHistory.
Related Issue

Closes #6927
Motivation and Context

Requires Documentation Change

How Has This Been Tested?

Unit and regression tests.
Types of changes

[x] Bug fix (non-breaking change which fixes an issue)
[ ] Refactor (non-breaking change which improves implementation)
[ ] Performance (non-breaking change which improves performance. Please add associated performance test and results)
[ ] New feature (non-breaking change which adds functionality)
[ ] Breaking change (fix or feature that would cause existing functionality to change)
[ ] Non-functional change (xml comments/documentation/etc)

Checklist:

[x] My code follows the code style of this project.
[x] I have read the CONTRIBUTING document.
[x] I have added tests to cover my changes.
[x] All new and existing tests passed.
[x] My branch follows the naming convention bug-<issue#>-<description> or feature-<issue#>-<description>

This bug probably affects python custom data research history requests too, would be nice to add a simple research notebook, like the added algorithm & make it part of the ResearchRegressionTests CI ✨


Fix getting started button link

Just noticed these lead to 404s. I believe an absolute link needs to be used for ButtonLinks (didn't notice any others in the ios docs)

🛠 Docs Preview Building...

Configuration
{
  "repoOverrides": {
    "apollographql/apollo-ios-dev@main": {
      "remote": {
        "owner": "Meschreiber",
        "repo": "apollo-ios-dev",
        "branch": "ms/fix-link"
      }
    }
  }
}

7b8e72219c6ca978827317d4b248d411da730726

!docs preview


Find LCA to detect commit differences

Creates a function to find the lowest common ancestor between two commits.
Fixes #2423

LGTM


Configuration details

Hi,
I'm confused what are the configuration details I need to add in order to add a godaddy reseller account.
Please can anyone can help me do it.
EPP Server Username
EPP Server Password
EPP Server Host
EPP Server Port
Registrar Prefix
SSL Certificate Path

Hello, As far as I know, Godaddy does not provide EPP for resellers. And this module is for EPP based servers only. But please check with them.


Override IMAGE_ROOTFS_EXTRA_SPACE

AGL sets this to 500MB to allow extra space in the default image.  Set it to 0
in the initramfs.

Thanks! Looks good to me. With this patch and the latest version of meta-agl (as of today) I am able to successfully complete the booting process of AGL with agl-sota on Raspberry Pi.
Btw some other known bugs with agl-sota remain. They are described in AGL SPEC-671 but they are not related to this patch.
Best regards,
Leon


CI: Disable Copy/Paste Detector in favor of Code Similarity Analyzer

Scrutinizer yelled
+==================================================================================+
| PHP Copy/Paste Detector and PHP Code Similarity Analyzer cannot both be used at |
| the same time. Please remove either one, f.e. by adding 'php_cpd: false'.       |
+=================================================================================+

Background: There is a new (2014 already, see [1]) Code Similarity Analyzer we are switching to now.

In PHP, Copy/Paste Detector so far could be used for detecting code clones. On Scrutinizer, it was enabled by default on all PHP projects. PHP Copy/Paste Detector operates on the token stream which is generated by PHP’s token_get_all function and uses string hashing techniques to find duplicates. This makes it quite good at detecting large literal code duplications. However, often developers modify copy/pasted code slightly which could then not be detected anymore.
To overcome the current shortcomings, we are happy to introduce a new tool for duplicated code detection, PHP Similarity Analyzer. PHP Similarity Analyzer is based on latest academic research combined with our in-depth practical experience. It has been evaluated against a range of open-source and closed-source projects and its results are already very promising. In contrast to PHP Copy/Paste Detector, it is robust against code modification and also finds smaller code fragments which make very good targets for refactoring. Besides, it not only detects copy/pasted code, but also semantically similar code.

[1] https://scrutinizer-ci.com/blog/introducing-new-duplicated-code-detection-for-php

Pull Request Test Coverage Report for Build 581687743

0 of 0   changed or added relevant lines in 0 files are covered.
No unchanged relevant lines lost coverage.
Overall coverage increased (+0.3%) to 87.952%

Totals

Change from base Build 501300685:
0.3%

Covered Lines:
292

Relevant Lines:
332

💛  - Coveralls

We should consider migrating to the new analyzer.

Unless I am missing something, we already migrated on behalf of another pull request.
https://github.com/crate/crate-dbal/blob/d3bd8bda8e8fec3b3acb37257e534e36ab985a29/.scrutinizer.yml#L44-L52


Huge speedup

I've been profiling zenbot (in simulation mode)
It was spending most of it's time in lolex doing Object key lookups.
I solved that by storing lolex timers in a queue instead of an Object, giving an over 10x speed increase.
However, after further review, it was still taking most of it's time handling "fake" setTimeouts to call checkorder again and again.
I replaced that mechanism with a .done() .fail() mechanism instead (required a small change to the sim exchange, instead of polling for an order to be done, the exchange calls the callback once the order is done), and now simulations that at the beginning of the day took over 30 seconds, now run in well under a second (they are seemingly instant).
I think there's some more I can do to improve still, but for the moment this is enough for my needs (ie make it fast enough for genetic optimization to be pratical/not take days).
The source is available to anyone who wants the speed upgrade, but isn't good enough for a PR yet (that's the plan though): I don't think the current code would work outside of simulations (ie trade/paper).

Can you share the commit?

This is the version of lolex adapted for tinyqueue:
"use strict";
const TINY_QUEUE = require('./tinyqueue.js');
function withGlobal(_global) {
var userAgent = _global.navigator && _global.navigator.userAgent;
var isRunningInIE = userAgent && userAgent.indexOf("MSIE ") > -1;
var maxTimeout = Math.pow(2, 31) - 1; //see https://heycam.github.io/webidl/#abstract-opdef-converttoint
// Make properties writable in IE, as per
// http://www.adequatelygood.com/Replacing-setTimeout-Globally.html
if (isRunningInIE) {
    _global.setTimeout = _global.setTimeout;
    _global.clearTimeout = _global.clearTimeout;
    _global.setInterval = _global.setInterval;
    _global.clearInterval = _global.clearInterval;
    _global.Date = _global.Date;
}

// setImmediate is not a standard function
// avoid adding the prop to the window object if not present
if (_global.setImmediate !== undefined) {
    _global.setImmediate = _global.setImmediate;
    _global.clearImmediate = _global.clearImmediate;
}

// node expects setTimeout/setInterval to return a fn object w/ .ref()/.unref()
// browsers, a number.
// see https://github.com/cjohansen/Sinon.JS/pull/436

var NOOP = function () { return undefined; };
var timeoutResult = _global.setTimeout(NOOP, 0);
var addTimerReturnsObject = typeof timeoutResult === "object";
var hrtimePresent = (_global.process && typeof _global.process.hrtime === "function");
var nextTickPresent = (_global.process && typeof _global.process.nextTick === "function");
var performancePresent = (_global.performance && typeof _global.performance.now === "function");
var performanceConstructorExists = (_global.Performance && typeof _global.Performance === "function");
var requestAnimationFramePresent = (
    _global.requestAnimationFrame && typeof _global.requestAnimationFrame === "function"
);
var cancelAnimationFramePresent = (
    _global.cancelAnimationFrame && typeof _global.cancelAnimationFrame === "function"
);

_global.clearTimeout(timeoutResult);

var NativeDate = _global.Date;
var uniqueTimerId = 1;

function isNumberFinite(num) {
    if (Number.isFinite) {
        return Number.isFinite(num);
    }

    if (typeof num !== "number") {
        return false;
    }

    return isFinite(num);
}

/**
 * Parse strings like "01:10:00" (meaning 1 hour, 10 minutes, 0 seconds) into
 * number of milliseconds. This is used to support human-readable strings passed
 * to clock.tick()
 */
function parseTime(str) {
    if (!str) {
        return 0;
    }

    var strings = str.split(":");
    var l = strings.length;
    var i = l;
    var ms = 0;
    var parsed;

    if (l > 3 || !/^(\d\d:){0,2}\d\d?$/.test(str)) {
        throw new Error("tick only understands numbers, 'm:s' and 'h:m:s'. Each part must be two digits");
    }

    while (i--) {
        parsed = parseInt(strings[i], 10);

        if (parsed >= 60) {
            throw new Error("Invalid time " + str);
        }

        ms += parsed * Math.pow(60, (l - i - 1));
    }

    return ms * 1000;
}

/**
 * Floor function that also works for negative numbers
 */
function fixedFloor(n) {
    return (n >= 0 ? Math.floor(n) : Math.ceil(n));
}

/**
 * % operator that also works for negative numbers
 */
function fixedModulo(n, m) {
    return ((n % m) + m) % m;
}

/**
 * Used to grok the `now` parameter to createClock.
 * @param epoch {Date|number} the system time
 */
function getEpoch(epoch) {
    if (!epoch) { return 0; }
    if (typeof epoch.getTime === "function") { return epoch.getTime(); }
    if (typeof epoch === "number") { return epoch; }
    throw new TypeError("now should be milliseconds since UNIX epoch");
}

function inRange(from, to, timer) {
    return timer && timer.callAt >= from && timer.callAt <= to;
}

function mirrorDateProperties(target, source) {
    var prop;
    for (prop in source) {
        if (source.hasOwnProperty(prop)) {
            target[prop] = source[prop];
        }
    }

    // set special now implementation
    if (source.now) {
        target.now = function now() {
            return target.clock.now;
        };
    } else {
        delete target.now;
    }

    // set special toSource implementation
    if (source.toSource) {
        target.toSource = function toSource() {
            return source.toSource();
        };
    } else {
        delete target.toSource;
    }

    // set special toString implementation
    target.toString = function toString() {
        return source.toString();
    };

    target.prototype = source.prototype;
    target.parse = source.parse;
    target.UTC = source.UTC;
    target.prototype.toUTCString = source.prototype.toUTCString;

    return target;
}

function createDate() {
    function ClockDate(year, month, date, hour, minute, second, ms) {
        // Defensive and verbose to avoid potential harm in passing
        // explicit undefined when user does not pass argument
        switch (arguments.length) {
            case 0:
                return new NativeDate(ClockDate.clock.now);
            case 1:
                return new NativeDate(year);
            case 2:
                return new NativeDate(year, month);
            case 3:
                return new NativeDate(year, month, date);
            case 4:
                return new NativeDate(year, month, date, hour);
            case 5:
                return new NativeDate(year, month, date, hour, minute);
            case 6:
                return new NativeDate(year, month, date, hour, minute, second);
            default:
                return new NativeDate(year, month, date, hour, minute, second, ms);
        }
    }

    return mirrorDateProperties(ClockDate, NativeDate);
}

function enqueueJob(clock, job) {
    // enqueues a microtick-deferred task - ecma262/#sec-enqueuejob
    if (!clock.jobs) {
        clock.jobs = [];
    }
    clock.jobs.push(job);
}

function runJobs(clock) {
    // runs all microtick-deferred tasks - ecma262/#sec-runjobs
    if (!clock.jobs) return;

    for (var i = 0; i < clock.jobs.length; i++) {
        var job = clock.jobs[i];
        job.func.apply(null, job.args);
        if (clock.loopLimit && i > clock.loopLimit) {
            throw new Error("Aborting after running " + clock.loopLimit + " timers, assuming an infinite loop!");
        }
    }
    clock.jobs = [];
}

function addTimer(clock, timer) {
    if (timer.func === undefined) {
        throw new Error("Callback must be provided to timer calls");
    }

    timer.type = timer.immediate ? "Immediate" : "Timeout";

    if (timer.hasOwnProperty("delay")) {
        if (!isNumberFinite(timer.delay)) {
            timer.delay = 0;
        }
        timer.delay = timer.delay > maxTimeout ? 1 : timer.delay;
        timer.delay = Math.max(0, timer.delay);
    }

    if (timer.hasOwnProperty("interval")) {
        timer.type = "Interval";
        timer.interval = timer.interval > maxTimeout ? 1 : timer.interval;
    }

    if (timer.hasOwnProperty("animation")) {
        timer.type = "AnimationFrame";
        timer.animation = true;
    }

    if (!clock.timers) {
        clock.timers = {};
    }

    timer.id = uniqueTimerId++;
    timer.createdAt = clock.now;
    timer.callAt = clock.now + (parseInt(timer.delay) || (clock.duringTick ? 1 : 0));
    // TODO:
    // clock.timers[timer.id] = timer;
    clock.timersq.push(timer);

    if (addTimerReturnsObject) {
        return {
            id: timer.id,
            ref: NOOP,
            unref: NOOP
        };
    }

    return timer.id;
}

/* eslint consistent-return: "off" */
function compareTimers(a, b) {
    // Sort first by absolute timing
    if (a.callAt < b.callAt) {
        return -1;
    }
    if (a.callAt > b.callAt) {
        return 1;
    }

    // Sort next by immediate, immediate timers take precedence
    if (a.immediate && !b.immediate) {
        return -1;
    }
    if (!a.immediate && b.immediate) {
        return 1;
    }

    // Sort next by creation time, earlier-created timers take precedence
    if (a.createdAt < b.createdAt) {
        return -1;
    }
    if (a.createdAt > b.createdAt) {
        return 1;
    }

    // Sort next by id, lower-id timers take precedence
    if (a.id < b.id) {
        return -1;
    }
    if (a.id > b.id) {
        return 1;
    }

    // As timer ids are unique, no fallback `0` is necessary
}

function firstTimerInRange(clock, from, to) {
    let timer = null;

    // TODO: Check if stopping after the first one ("continue/break") would work here or if we actually need to go through the entire loop for our seek here
    for(let id = 0;Â id < clock.timersq.data.length; id++){
        if (inRange(from, to, clock.timersq.data[id]) && (!timer || compareTimers(timer, clock.timersq.data[id]) === 1)) {
            timer = clock.timersq.data[id];
        }
    }
    return timer;

}

function firstTimer(clock) {
    let timer = clock.timersq.peek();
    return timer;

    // var timers = clock.timers;
    // var timer = null;
    // var id;

    // for (id in timers) {
    //     if (timers.hasOwnProperty(id)) {
    //         if (!timer || compareTimers(timer, timers[id]) === 1) {
    //             timer = timers[id];
    //         }
    //     }
    // }

    // return timer;
}

function lastTimer(clock) {
    let timer = null;
    for(let id = 0;Â id <= clock.timersq.data.length; id++){
        if (!timer || compareTimers(timer, clock.timersq.data[id]) === 1) {
            timer = clock.timersq.data[id];
        }
    }
    return timer;

    /* var timers = clock.timers;
    var timer = null;
    var id;
    for (id in timers) {
        if (timers.hasOwnProperty(id)) {
            if (!timer || compareTimers(timer, timers[id]) === -1) {
                timer = timers[id];
            }
        }
    }
    return timer; */
}

function callTimer(clock, timer) {
    if (typeof timer.interval === "number") {
        // TODO:
        // TODO:Â WHYÂ do we pop here ???
        clock.timerq.pop();
        // clock.timers[timer.id].callAt += timer.interval;
        clock.timersq.push(timer);
    } else {
        // delete clock.timers[timer.id];
        clock.timersq.pop();
    }

    if (typeof timer.func === "function") {
        timer.func.apply(null, timer.args);
    } else {
        /* eslint no-eval: "off" */
        eval(timer.func);
    }
}

function clearTimer(clock, timerId, ttype) {
    if (!timerId) {
        // null appears to be allowed in most browsers, and appears to be
        // relied upon by some libraries, like Bootstrap carousel
        return;
    }

    if (!clock.timers) {
        clock.timers = {};
    }

    // in Node, timerId is an object with .ref()/.unref(), and
    // its .id field is the actual timer id.
    if (typeof timerId === "object") {
        timerId = timerId.id;
    }

    if (clock.timers.hasOwnProperty(timerId)) {
        // check that the ID matches a timer of the correct type
        var timer = clock.timers[timerId];
        if (timer.type === ttype) {
            delete clock.timers[timerId];
        } else {
            var clear = ttype === "AnimationFrame" ? "cancelAnimationFrame" : "clear" + ttype;
            var schedule = timer.type === "AnimationFrame" ? "requestAnimationFrame" : "set" + timer.type;
            throw new Error("Cannot clear timer: timer created with " + schedule
                + "() but cleared with " + clear + "()");
        }
    }
}

function uninstall(clock, target, config) {
    var method,
        i,
        l;
    var installedHrTime = "_hrtime";
    var installedNextTick = "_nextTick";

    for (i = 0, l = clock.methods.length; i < l; i++) {
        method = clock.methods[i];
        if (method === "hrtime" && target.process) {
            target.process.hrtime = clock[installedHrTime];
        } else if (method === "nextTick" && target.process) {
            target.process.nextTick = clock[installedNextTick];
        } else if (method === "performance") {
            Object.defineProperty(target, method, {
                writeable: false,
                value: clock["_" + method]
            });
        } else {
            if (target[method] && target[method].hadOwnProperty) {
                target[method] = clock["_" + method];
                if (method === "clearInterval" && config.shouldAdvanceTime === true) {
                    target[method](clock.attachedInterval);
                }
            } else {
                try {
                    delete target[method];
                } catch (ignore) { /* eslint empty-block: "off" */ }
            }
        }
    }

    // Prevent multiple executions which will completely remove these props
    clock.methods = [];

    // return pending timers, to enable checking what timers remained on uninstall
    if (!clock.timers) {
        return [];
    }
    return Object.keys(clock.timers).map(function mapper(key) {
        return clock.timers[key];
    });
}

function hijackMethod(target, method, clock) {
    var prop;
    clock[method].hadOwnProperty = Object.prototype.hasOwnProperty.call(target, method);
    clock["_" + method] = target[method];

    if (method === "Date") {
        var date = mirrorDateProperties(clock[method], target[method]);
        target[method] = date;
    } else if (method === "performance") {
        Object.defineProperty(target, method, {
            writeable: false,
            value: clock[method]
        });
    } else {
        target[method] = function () {
            return clock[method].apply(clock, arguments);
        };

        for (prop in clock[method]) {
            if (clock[method].hasOwnProperty(prop)) {
                target[method][prop] = clock[method][prop];
            }
        }
    }

    target[method].clock = clock;
}

function doIntervalTick(clock, advanceTimeDelta) {
    clock.tick(advanceTimeDelta);
}

var timers = {
    setTimeout: _global.setTimeout,
    clearTimeout: _global.clearTimeout,
    setImmediate: _global.setImmediate,
    clearImmediate: _global.clearImmediate,
    setInterval: _global.setInterval,
    clearInterval: _global.clearInterval,
    Date: _global.Date
};

if (hrtimePresent) {
    timers.hrtime = _global.process.hrtime;
}

if (nextTickPresent) {
    timers.nextTick = _global.process.nextTick;
}

if (performancePresent) {
    timers.performance = _global.performance;
}

if (requestAnimationFramePresent) {
    timers.requestAnimationFrame = _global.requestAnimationFrame;
}

if (cancelAnimationFramePresent) {
    timers.cancelAnimationFrame = _global.cancelAnimationFrame;
}

var keys = Object.keys || function (obj) {
    var ks = [];
    var key;

    for (key in obj) {
        if (obj.hasOwnProperty(key)) {
            ks.push(key);
        }
    }

    return ks;
};

/**
 * @param start {Date|number} the system time
 * @param loopLimit {number}  maximum number of timers that will be run when calling runAll()
 */
function createClock(start, loopLimit) {
    start = start || 0;
    loopLimit = loopLimit || 1000;

    var clock = {
        now: getEpoch(start),
        hrNow: 0,
        timeouts: {},
        Date: createDate(),
        loopLimit: loopLimit,
        timersq: new TINY_QUEUE([], compareTimers),
    };

    clock.Date.clock = clock;

    function getTimeToNextFrame() {
        return 16 - ((clock.now - start) % 16);
    }

    clock.setTimeout = function setTimeout(func, timeout) {
        return addTimer(clock, {
            func: func,
            args: Array.prototype.slice.call(arguments, 2),
            delay: timeout
        });
    };

    clock.clearTimeout = function clearTimeout(timerId) {
        return clearTimer(clock, timerId, "Timeout");
    };
    clock.nextTick = function nextTick(func) {
        return enqueueJob(clock, {
            func: func,
            args: Array.prototype.slice.call(arguments, 1)
        });
    };
    clock.setInterval = function setInterval(func, timeout) {
        return addTimer(clock, {
            func: func,
            args: Array.prototype.slice.call(arguments, 2),
            delay: timeout,
            interval: timeout
        });
    };

    clock.clearInterval = function clearInterval(timerId) {
        return clearTimer(clock, timerId, "Interval");
    };

    clock.setImmediate = function setImmediate(func) {
        return addTimer(clock, {
            func: func,
            args: Array.prototype.slice.call(arguments, 1),
            immediate: true
        });
    };

    clock.clearImmediate = function clearImmediate(timerId) {
        return clearTimer(clock, timerId, "Immediate");
    };

    clock.requestAnimationFrame = function requestAnimationFrame(func) {
        var result = addTimer(clock, {
            func: func,
            delay: getTimeToNextFrame(),
            args: [clock.now + getTimeToNextFrame()],
            animation: true
        });

        return result.id || result;
    };

    clock.cancelAnimationFrame = function cancelAnimationFrame(timerId) {
        return clearTimer(clock, timerId, "AnimationFrame");
    };

    function updateHrTime(newNow) {
        clock.hrNow += (newNow - clock.now);
    }

    clock.runMicrotasks = function runMicrotasks() {
        runJobs(clock);
    };

    clock.tick = function tick(ms) {
        ms = typeof ms === "number" ? ms : parseTime(ms);
        var tickFrom = clock.now;
        var tickTo = clock.now + ms;
        var previous = clock.now;
        var timer, firstException, oldNow;

        clock.duringTick = true;

        // perform process.nextTick()s
        oldNow = clock.now;
        runJobs(clock);
        if (oldNow !== clock.now) {
            // compensate for any setSystemTime() call during process.nextTick() callback
            tickFrom += clock.now - oldNow;
            tickTo += clock.now - oldNow;
        }

        // perform each timer in the requested range
        timer = firstTimerInRange(clock, tickFrom, tickTo);
        let loop = 0;

        while (timer && tickFrom <= tickTo) {
            /*console.log([loop, clock.timersq.data.length]);
            loop++;
            if(loop > 1000){

            }*/
            //if (clock.timers[timer.id]) {
                updateHrTime(timer.callAt);
                tickFrom = timer.callAt;
                clock.now = timer.callAt;
                oldNow = clock.now;
                try {
                    runJobs(clock);
                    callTimer(clock, timer);
                } catch (e) {
                    console.log(e);
                    firstException = firstException || e;
                }

                // compensate for any setSystemTime() call during timer callback
                if (oldNow !== clock.now) {
                    tickFrom += clock.now - oldNow;
                    tickTo += clock.now - oldNow;
                    previous += clock.now - oldNow;
                }
            //}

            timer = firstTimerInRange(clock, previous, tickTo);
            previous = tickFrom;
        }

        // perform process.nextTick()s again
        oldNow = clock.now;
        runJobs(clock);
        if (oldNow !== clock.now) {
            // compensate for any setSystemTime() call during process.nextTick() callback
            tickFrom += clock.now - oldNow;
            tickTo += clock.now - oldNow;
        }
        clock.duringTick = false;

        // corner case: during runJobs, new timers were scheduled which could be in the range [clock.now, tickTo]
        timer = firstTimerInRange(clock, tickFrom, tickTo);
        if (timer) {
            try {
                clock.tick(tickTo - clock.now); // do it all again - for the remainder of the requested range
            } catch (e) {
                firstException = firstException || e;
            }
        } else {
            // no timers remaining in the requested range: move the clock all the way to the end
            updateHrTime(tickTo);
            clock.now = tickTo;
        }
        if (firstException) {
            throw firstException;
        }
        return clock.now;
    };

    clock.next = function next() {
        runJobs(clock);
        var timer = firstTimer(clock);
        if (!timer) {
            return clock.now;
        }

        clock.duringTick = true;
        try {
            updateHrTime(timer.callAt);
            clock.now = timer.callAt;
            callTimer(clock, timer);
            runJobs(clock);
            return clock.now;
        } catch(err){
            console.log(err);
        } finally {
            clock.duringTick = false;
        }
    };

    clock.runAll = function runAll() {
        var numTimers, i;
        runJobs(clock);
        for (i = 0; i < clock.loopLimit; i++) {
            if (!clock.timers) {
                return clock.now;
            }

            numTimers = clock.timersq.length;
            if (numTimers === 0) {
                return clock.now;
            }

            clock.next();
        }

        throw new Error("Aborting after running " + clock.loopLimit + " timers, assuming an infinite loop!");
    };

    clock.runToFrame = function runToFrame() {
        return clock.tick(getTimeToNextFrame());
    };

    clock.runToLast = function runToLast() {
        var timer = lastTimer(clock);
        if (!timer) {
            runJobs(clock);
            return clock.now;
        }

        return clock.tick(timer.callAt);
    };

    clock.reset = function reset() {
        clock.timers = {};
        clock.jobs = [];
        clock.now = getEpoch(start);
    };

    clock.setSystemTime = function setSystemTime(systemTime) {
        // determine time difference
        var newNow = getEpoch(systemTime);
        var difference = newNow - clock.now;
        var id, timer;

        // update 'system clock'
        clock.now = newNow;

        // update timers and intervals to keep them stable
        for (id in clock.timers) {
            if (clock.timers.hasOwnProperty(id)) {
                timer = clock.timers[id];
                timer.createdAt += difference;
                timer.callAt += difference;
            }
        }
    };

    if (performancePresent) {
        clock.performance = Object.create(_global.performance);

        if (performanceConstructorExists) {
            var proto = _global.Performance.prototype;

            Object
                .getOwnPropertyNames(proto)
                .forEach(function (name) {
                    if (Object.getOwnPropertyDescriptor(proto, name).writable) {
                        clock.performance[name] = proto[name];
                    }
                });
        }

        clock.performance.now = function lolexNow() {
            return clock.hrNow;
        };
    }
    if (hrtimePresent) {
        clock.hrtime = function (prev) {
            if (Array.isArray(prev)) {
                var oldSecs = (prev[0] + prev[1] / 1e9);
                var newSecs = (clock.hrNow / 1000);
                var difference = (newSecs - oldSecs);
                var secs = fixedFloor(difference);
                var nanosecs = fixedModulo(difference * 1e9, 1e9);
                return [
                    secs,
                    nanosecs
                ];
            }
            return [
                fixedFloor(clock.hrNow / 1000),
                fixedModulo(clock.hrNow * 1e6, 1e9)
            ];
        };
    }

    return clock;
}

/**
 * @param config {Object} optional config
 * @param config.target {Object} the target to install timers in (default `window`)
 * @param config.now {number|Date}  a number (in milliseconds) or a Date object (default epoch)
 * @param config.toFake {string[]} names of the methods that should be faked.
 * @param config.loopLimit {number} the maximum number of timers that will be run when calling runAll()
 * @param config.shouldAdvanceTime {Boolean} tells lolex to increment mocked time automatically (default false)
 * @param config.advanceTimeDelta {Number} increment mocked time every <<advanceTimeDelta>> ms (default: 20ms)
 */
function install(config) {
    if ( arguments.length > 1 || config instanceof Date || Array.isArray(config) || typeof config === "number") {
        throw new TypeError("lolex.install called with " + String(config) +
            " lolex 2.0+ requires an object parameter - see https://github.com/sinonjs/lolex");
    }
    config = typeof config !== "undefined" ? config : {};
    config.shouldAdvanceTime = config.shouldAdvanceTime || false;
    config.advanceTimeDelta = config.advanceTimeDelta || 20;

    var i, l;
    var target = config.target || _global;
    var clock = createClock(config.now, config.loopLimit);

    clock.uninstall = function () {
        return uninstall(clock, target, config);
    };

    clock.methods = config.toFake || [];

    if (clock.methods.length === 0) {
        // do not fake nextTick by default - GitHub#126
        clock.methods = keys(timers).filter(function (key) {return key !== "nextTick";});
    }

    for (i = 0, l = clock.methods.length; i < l; i++) {
        if (clock.methods[i] === "hrtime") {
            if (target.process && typeof target.process.hrtime === "function") {
                hijackMethod(target.process, clock.methods[i], clock);
            }
        } else if (clock.methods[i] === "nextTick") {
            if (target.process && typeof target.process.nextTick === "function") {
                hijackMethod(target.process, clock.methods[i], clock);
            }
        } else {
            if (clock.methods[i] === "setInterval" && config.shouldAdvanceTime === true) {
                var intervalTick = doIntervalTick.bind(null, clock, config.advanceTimeDelta);
                var intervalId = target[clock.methods[i]](
                    intervalTick,
                    config.advanceTimeDelta);
                clock.attachedInterval = intervalId;
            }
            hijackMethod(target, clock.methods[i], clock);
        }
    }

    return clock;
}

return {
    timers: timers,
    createClock: createClock,
    install: install,
    withGlobal: withGlobal
};

}
var defaultImplementation = withGlobal(global || window);
exports.timers = defaultImplementation.timers;
exports.createClock = defaultImplementation.createClock;
exports.install = defaultImplementation.install;
exports.withGlobal = withGlobal;

Hi, thanks for posting this. I am trying to run many simulations in parallel and am finding I am CPU bound once around 15-20 are running, even though I have quite a lot of power available. So this change is of interest to me ;)
I pasted your source code above over the contents of node_modules/lolex/src/lolex-src.js and also added tinyqueue.js in the same directory, with the contents pasted from here: https://raw.githubusercontent.com/mourner/tinyqueue/master/index.js
The simulation starts ok but after a short while I get this error;
UnhandledPromiseRejectionWarning: MongoServerSelectionError: Server selection timed out after 30000 ms
    at /home/zenbot/node_modules/mongodb/lib/core/sdam/topology.js:438:30
    at callTimer (/home/zenbot/node_modules/lolex/src/lolex-src.js:367:20)
    at Object.tick (/home/zenbot/node_modules/lolex/src/lolex-src.js:647:21)
    at withOnPeriod (/home/zenbot/lib/engine.js:779:17)
    at onTrade (/home/zenbot/lib/engine.js:950:7)
    at /home/zenbot/lib/engine.js:904:5
    at /home/zenbot/node_modules/async/dist/async.js:4011:13
    at Object.process (/home/zenbot/node_modules/async/dist/async.js:1674:21)
    at /home/zenbot/node_modules/async/dist/async.js:1532:23
    at /home/zenbot/node_modules/async/dist/async.js:74:45

I am not using localhost as my Mongo address so I wonder if that is the cause. Did you have to work through this error when you implemented this?
By the way, just so you know, there are funny characters in the signature of two for loops in the above
for(let id = 0;Â id < clock.timersq.data.length; id++)
for(let id = 0;Â id <= clock.timersq.data.length; id++)

I didn't have this error, but my mongo was on localhost.
If you really want to use zenbot (I'm now convinced it's not a viable
option for what we both are trying to do), I strongly recommend you
implement something where:

You take the k-lines/trades from mongo and write them to a file
You use that file instead of mongodb in zenbot when running a backtest
It should improve performance immensely, and will make sure you can't
have any mongodb error (the current mongodb code in zenbot is utter crap,
just look at how it does things...)
I actually changed a lot of how zenbot worked with mongo before I gave up
on it, but lots of my work broke parts of zenbot I don't use (like paper),
so I don't think it'd be helpful to others as-is.
FYI, I'm now using bbgo instead, and it works incredibly well, and it's
very actively developped (and supports grid, which is what I was adding to
zenbot). The only issue is it's lacking documentation at the moment.

On Sun, Jan 23, 2022 at 2:05 PM Geoff Clayton @.***>
wrote:

Hi, thanks for posting this. I am trying to run many simulations in
parallel and am finding I am CPU bound once around 15-20 are running, even
though I have quite a lot of power available. So this change is of interest
to me ;)
I pasted your source code above over the contents of
node_modules/lolex/src/lolex-src.js and also added tinyqueue.js in the
same directory, with the contents pasted from here:
https://raw.githubusercontent.com/mourner/tinyqueue/master/index.js
The simulation starts ok but after a short while I get this error;
UnhandledPromiseRejectionWarning: MongoServerSelectionError: Server selection timed out after 30000 ms
at /home/zenbot/node_modules/mongodb/lib/core/sdam/topology.js:438:30

at callTimer (/home/zenbot/node_modules/lolex/src/lolex-src.js:367:20)

at Object.tick (/home/zenbot/node_modules/lolex/src/lolex-src.js:647:21)

at withOnPeriod (/home/zenbot/lib/engine.js:779:17)

at onTrade (/home/zenbot/lib/engine.js:950:7)

at /home/zenbot/lib/engine.js:904:5

at /home/zenbot/node_modules/async/dist/async.js:4011:13

at Object.process (/home/zenbot/node_modules/async/dist/async.js:1674:21)

at /home/zenbot/node_modules/async/dist/async.js:1532:23

at /home/zenbot/node_modules/async/dist/async.js:74:45

I am not using localhost as my Mongo address so I wonder if that is the
cause. Did you have to work through this error when you implemented this?
By the way, just so you know, there are funny characters in the signature
of two for loops in the above
for(let id = 0;Â id < clock.timersq.data.length; id++)
for(let id = 0;Â id <= clock.timersq.data.length; id++)
—
Reply to this email directly, view it on GitHub
https://github.com/DeviaVir/zenbot/issues/2765#issuecomment-1019481398,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/AAA2SFLPRFNNJPEQU7LCZ2DUXP4JFANCNFSM5I4T7LUQ
.
Triage notifications on the go with GitHub Mobile for iOS
https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675
or Android
https://play.google.com/store/apps/details?id=com.github.android&referrer=utm_campaign%3Dnotification-email%26utm_medium%3Demail%26utm_source%3Dgithub.
You are receiving this because you authored the thread.Message ID:
@.***>

--
勇気とユーモア

Hi, thanks for the reply. Writing data to a file for Zenbot to read from sounds like a good idea. I already tried running Mongo with the inMemory storage engine to see if that would make a difference, but it made no difference at all.
My app is rather deeply integrated with Zenbot at this point so I am not going to give up on it just yeat. Though I may change the way in which I expect to use it to fit with the limitations on parallelisation. I did have a set up where I was using AWS Farscape with auto-scaling to handle parallelising up to hundreds of processes, and it worked quite well, but I was not keen on the costs.
I just had a look at bbgo and as far as I can see it is also limited to running one backtest at a time so would require similar tolling around it as I have built for Zenbot. I would need to do some analysis of resource usage of bbgo vs. Zenbot before committing to that route.
Much to think about!

On Sun, Jan 23, 2022 at 2:24 PM Geoff Clayton @.***>
wrote:

Hi, thanks for the reply. Writing data to a file for Zenbot to read from
sounds like a good idea. I already tried running Mongo with the inMemory
storage engine to see if that would make a difference, but it made no
difference at all.

Tried that too.

My app is rather deeply integrated with Zenbot at this point so I am not
going to give up on it just yeat.

That's called the "sunk cost fallacy", look it up, it cost me 3 weeks of
zenbot work...

Though I may change the way in which I expect to use it to fit with the
limitations on parallelisation. I did have a set up where I was using AWS
Farscape with auto-scaling to handle parallelising up to hundreds of
processes, and it worked quite well, but I was not keen on the costs.

That's my long-term plan. For now a server with 40 cores does the job,
though a bit slowly.

I just had a look at bbgo and as far as I can see it is also limited to
running one backtest at a time

But it's very cheap in terms of ressources, and very fast at starting/going
through it (insanely faster compared to zenbot). Especially after I
reported a whole bunch of bugs and asked for features that make this easier.
Currently, in my system, running a backtest on one day, takes under 0.1
second (starting, stopping, writing the report to disk as json, everything
included). Zenbot was at least several seconds.

so would require similar tolling around it as I have built for Zenbot. I
would need to do some analysis of resource usage of bbgo vs. Zenbot before
committing to that route.
Much to think about!
—
Reply to this email directly, view it on GitHub
https://github.com/DeviaVir/zenbot/issues/2765#issuecomment-1019485003,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/AAA2SFO2SLWZ35AHMQZPLVLUXP6RFANCNFSM5I4T7LUQ
.
Triage notifications on the go with GitHub Mobile for iOS
https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675
or Android
https://play.google.com/store/apps/details?id=com.github.android&referrer=utm_campaign%3Dnotification-email%26utm_medium%3Demail%26utm_source%3Dgithub.
You are receiving this because you authored the thread.Message ID:
@.***>

--
勇気とユーモア

I can see how the sunk cost fallacy applies here, but I have limited to spend on this stuff, so if my choices are either

Find a suitable use-case for the system I have already built
Do nothing

...then I think I'd go for option 1 :)
I wish there were an option 3: spend a bunch more time on it, but there is not...
I will take another look at bbgo though. I like the idea of making the underlying sim engine in my framework selectable from a variety.

On Sun, Jan 23, 2022 at 2:53 PM Geoff Clayton @.***>
wrote:

I can see how the sunk cost fallacy applies here, but I have limited to
spend on this stuff, so if my choices are either

Find a suitable use-case for the system I have already built
Do nothing

...then I think I'd go for option 1 :)
I wish there were an option 3: spend a bunch more time on it, but there
is not...
I will take another look at bbgo though. I like the idea of making the
underlying sim engine in my framework selectable from a variety.

That's how I started: I made my bot class a parent, made a zenbot and a
bbgo class that inherited it, rewrote the tests to run on both, and in a
couple of days I had it switchable from one to the other.
It was much easier than I first expected. Maybe give it a quick go/make
this a side project.

—
Reply to this email directly, view it on GitHub
https://github.com/DeviaVir/zenbot/issues/2765#issuecomment-1019490426,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/AAA2SFPGFOGDBR6CHWIKXA3UXQB3ZANCNFSM5I4T7LUQ
.
Triage notifications on the go with GitHub Mobile for iOS
https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675
or Android
https://play.google.com/store/apps/details?id=com.github.android&referrer=utm_campaign%3Dnotification-email%26utm_medium%3Demail%26utm_source%3Dgithub.
You are receiving this because you authored the thread.Message ID:
@.***>

--
勇気とユーモア


Type check bound @Outputs

From an internal user:

From what I see there is currently no type check, so if you have a widget doing:
  <foo (x)="do($event)">

in you code you can have do(AnyType event) and it will compile just fine. As we are now moving to compiled templates, could this be made into a typed interface that would cause actual type error if it doesn't match the widget @Output?

@leonsenft WDUT?

This was probably a Dartium issue as it won't compile in DDC.


Dataflow + Starboard?

Hi Alex,
I'm building Starboard Notebook (some demo noteboks on the frontpage here), a notebook system for the browser. Much like dataflow it also features notebooks which are defined as plaintext files that are easy-to-git (click view source on the top right on the Starboard homepage).
Different than this project however is that notebooks are entirely static: you don't need any server running at all. Your system would embed the notebook in an iframe (and talk to it to for instance inject any secrets).
Starboard is built around dynamic importing of functionality: you can arbitrarily add new "cell types". For instance it supports Python in the browser, and recently I managed to hack together talking to a remote Jupyter kernel.
It would be really cool to support a cell type that is "Observable", I would love to work together on this. What it will provide Dataflow is a runtime that is sandboxed by default: a Starboard notebook runs entirely on a different origin in an iframe (editor included!), as well as a live notebook environment with code editor (as opposed to editing the source text files) - so pretty similar to Observable!
Now imagine interop with Python in the browser.. A workflow could be: "Input CSV file" -> "run some Pandas code in Python through Pyodide" -> "Visualize using Observable cell"... Super powerful stuff!
I can ramble for a long time about why this would be great, but I'd love to hear your thoughts on perhaps adopting Starboard as the notebook "runtime" here. Happy to answer any questions as well of course! (happy to chat somewhere if its easier)

Hey @gzuidhof , this is a pretty cool idea, starboard seems awesome!
This should definitely be possible. Dataflow is just an opinionated wrapper + dev experience around the unofficial-observablehq-compiler. With that compiler, you're able to compile "Observable javascript" into vanilla javascript (an ES module), or you can interpret "Observable javascript" live in the browser.
Dataflow does both of these things: with dataflow run, it creates a dev server that "inteprets" the Observable javascript you write live in the browser. But, with dataflow export, it compiles the Observable javascript into a flat ES module, which can be used later with the Observable runtime to run a notebook natively.
So, for Starboard, I'd imagine you could use unofficial-observablehq-compiler to convert Observable javascript into "plain" javascript, and run it in an iframe (and just refresh the entire iframe when code updates). This is similar to what I did with atom-observable, which made the code pretty easy to implement, and didnt require a server or anything to run. You may not need to use Dataflow directly, since Dataflow sets up an entire devserver for it's own thing. Also, with Dataflow, when you update code, it surgically re-arranges the rendered notebook to optimize for not re-computing cells that don't need to be re-computed, but if you don't care, you can just refresh the entire page/notebook and be done with it much faster.
Another thing to consider is how you decide to render an Observable notebook in. Starboard itself. Since Observable code that looks like this:
width = 400

viewof color = html`<input type=color value="#ff0000">`

d3 = require("d3");

chart = {
   d3.create("svg").selectAll(....)
}

Would render 4 elements like this:

But starboard seems to only render the defined element/variable. But that kindof goes against Observable's "write your code in whatever order you like", but it's not too big of a deal to change around.
Another thing: I'm actively thinking about changing unofficial-observablehq-compiler in the near future, so I'd follow that issue to get updates!
Anyway, tldr is that this is definitely possible, working with unofficial-observablehq-compiler alone would be more helpful that Dataflow specifically, and if you want to talk about this more directly with me, feel free to email me directly!

Cool! Thank you for the reply :)
Thanks for explaining Dataflow more, it makes total sense. I suppose I misunderstood the goal of the project to be more in line of: a self hostable Observable editor (in which case Starboard would hopefully be able to save you a lot of work).
I am not super familiar with Observable. I come from more of a Jupyter background, which is much less pure and not reactive (run cells in any order, have internal state, etc).
My intention for Starboard was to build a general base that can power both types of paradigm, and the browser happens to be built with vanilla JS built-in, so that's the glue/base of everything. Any other runtimes or languages such as Python through Pyodide/WASM or Observable/Pluto.jl can be plugged in on demand.

But starboard seems to only render the defined element/variable. But that kindof goes against Observable's "write your code in whatever order you like", but it's not too big of a deal to change around.

You're right, it just renders the value you return (or something you print). But a cell type's implementation isn't bound to that: you just get a few HTML elements to mount on and anything is fair play from there. The Observable cell type should retain the "write your code in whatever order you like" behavior: that's what makes Observable so great! So for sure this cell will have to behave differently :). An existing example of such behavior is the CSS cell: it just applies on every change without a "run" button.
One thing I am a bit scared about is the runtime and exceptions. Observable's own editor has a crazy setup in which there is another iframe behind where you actually type the code, and the page "in front" has transparent bits to show the iframe. I wonder if the Observable runtime can ever get in such a terrible state that it crashes the entire thing. One way to find out I suppose :)
I'll see if I can get something going with your unofficial compiler, thank you again!

It's getting there. Let me know if you would rather have me create an issue in the compiler project instead (I figured I would post here first so I don't pollute it there)
I am not entirely fluent in Observable so there may be stuff I'm misunderstanding. Right now I'm doing this: I create a global runtime and module, which is shared between all cells in my notebook. Then for every cell I create a single observer into a local HTML element.
The above gif starts with the following notebook:
# %%--- [esm]
# properties:
#   run_on_load: true
# ---%%
import {registerObservable} from "http://localhost:8080/dist/starboard-observable.js";

registerObservable();

# %% [observable]
a = 1
# %% [observable]
b = "asdf"

Whenever a character is typed I define or redefine the cell with this logic:
try {
    if (!this.observableCell) { // The first time the cell is run this will be undefined
        this.observableCell = await compile.cell(this.cell.textContent);
        this.observableCell.define(main, this.observer);
    } else {
        this.observableCell = await compile.cell(this.cell.textContent);
        this.observableCell.redefine(main)
    }
} catch (e) {
    console.error(e);
    this.errorElement.innerText = e.toString();
}

This naive approach has the following limitations:

Cells can not be deleted. If I start of with a cell that states a=5 there will still be that value after I delete the cell. Do I need to wait for this PR? Anything I can do to push it over the finish line?
I have no idea whether to "redefine" or "define" a value whenever a new character is typed.
As you start typing abc = 123 it will define a variable a as that is the first character typed, and then it goes all wrong. Anonymous cells also don't work as they should always be "defined" instead of "redefined. Is there any way for me to know?
I guess I just need to know the name of the defined variable, or null in case of anonymous.

If you're curious about the code, here are the ~100 lines or so :).

Thinking about it a bit more it doesn't make sense to run on every keystroke as even Observable has a "run" button. But the two questions still stand :)

Have you read this?
https://observablehq.com/@observablehq/how-observable-runs
Basically, there is a tree of dependencies, like on excel, and it has to know which cells depend on which other cells, so when a cell is updated, the parent cells that depend on that cell are updated as well.

Since this thread is all about collaboration between projects, I wanted to draw your attention to another project that I saw start up recently and already seems to be picking up a lot of steam. One of the Jupyter maintainers (@jtpio) is working on a WASM/client side version of Jupyter called jupyterlite. Maybe there's an opportunity there?


[MM-37055] Remove commit hash from release builds generated by CircleCI

Summary
We don't want our final releases to contain a commit hash as it could be a bit confusing, so we're removing them from our release builds.
Ticket Link
https://mattermost.atlassian.net/browse/MM-37055
Release Note
NONE

Cherry pick is scheduled.

Error trying doing the automated Cherry picking. Please do this manually
fatal: No such remote 'upstream'

+++ Returning you to the master branch and cleaning up.

@devinbinnie I think this wasn't cherry-picked (in case it needs to be).

/cherry-pick release-5.0

Cherry pick is scheduled.


Hapi 17.2.0 support

please, add Hapi 17.2.0 support

@bohdan-romanchenko-axon right now I'm not 100% aware about changes in Hapi, but shouldn't be so difficult. If you can would be greate receiving a PR with those changes.


vCheckUtils.ps1 returning inconsistent "New version available" information

The vCheckUtils.ps1 is returning inconsistent "New version available" information.
PowerShell Version 5.1.14393 Revision 2189 (Windows Server 2016)
VMware PowerCLI <IP_ADDRESS>
This is the PowerShell result which says there is a new version of the "00 Connection Plugin for vCenter.ps1" available which is not correct.
Name        :
description :
author      :
version     : 1.20
category    : vSphere
status      : New Version Available - 1.3
location    : https://raw.github.com/alanrenouf/vCheck-vSphere/master/Plugins/00 Initialize/00 Connection Plugin for vCenter.ps1

MWalterDE, I run the plugin "118 Plugins Not up to date or installed.ps1" as part of my weekly vCheck scheduled task.  I can confirm that I have been seeing that incorrect new version available message for some time.
P.S., I don't think anyone is actually supporting vCheck anymore.  I entered a new "Issue" a month ago and no one has responded.

I guess the check is based on string formatting... and yeah, the plugin version xml probably hasn't been updated in ages.
I no longer work with VMware, so not really checking the project as much anymore.


Underutilized PaaS services like vCore SQL

Hi, please are you planning to add check for underutilized PaaS services, like Azure SQL vCore, MySql etc. ?

Document Details
⚠ Do not edit this section. It is required for docs.microsoft.com ➟ GitHub issue linking.

ID: b703202c-7c7d-7177-6496-d1c61dacf22b
Version Independent ID: f9ee0bcc-f74a-dbba-c9b9-f84bf7b800a7
Content: Reduce service costs using Azure Advisor - Azure Advisor
Content Source: articles/advisor/advisor-cost-recommendations.md
Service: advisor
GitHub Login: @saket-ms
Microsoft Alias: sagupt

Tagging @saket-ms for visibility and to provide insights and/or to help in tagging respective product team for an update on this.

SQL DB team currently have no plans for this. They are working on new auto-pilot feature and after that they will come to right-size SQL DB recommendations. For other PaaS services, there aren't any active conversations for recommendations.

This is a feature gap with third party tools such as CloudHealth and would be good to consider PaaS.

#please-close

#assign:rboucher

#please-close


commit 06722a2: Build problem?

Hi.
This comes up at commit 06722a2:
ui/main.c: In function 'UI_DisplayMain': ui/main.c:465:7: error: 'center_line_is_free' undeclared (first use in this function)   465 |   if (center_line_is_free)       |       ^~~~~~~~~~~~~~~~~~~ ui/main.c:465:7: note: each undeclared identifier is reported only once for each function it appears in make: *** [Makefile:240: ui/main.o] Fehler 1
Makefile is
`ENABLE_SWD                    := 0
ENABLE_OVERLAY                := 1
ENABLE_UART                   := 1
ENABLE_AIRCOPY                := 0
ENABLE_FMRADIO                := 0
ENABLE_NOAA                   := 0
ENABLE_VOICE                  := 0
ENABLE_ALARM                  := 0
ENABLE_BIG_FREQ               := 0
ENABLE_KEEP_MEM_NAME          := 1
ENABLE_CHAN_NAME_FREQ         := 1
ENABLE_WIDE_RX                := 1
ENABLE_TX_WHEN_AM             := 0
ENABLE_CTCSS_TAIL_PHASE_SHIFT := 0
ENABLE_MAIN_KEY_HOLD          := 1
ENABLE_BOOT_BEEPS             := 0
ENABLE_DTMF_DECODER           := 0
ENABLE_COMPANDER              := 0
#ENABLE_SINGLE_VFO_CHAN       := 1
#ENABLE_BAND_SCOPE            := 1`

Thank you very much vor having a look at it 👍👍👍👍👍

I think I've now fixed that for you. Let me know if any problem with it.

Thank you again!!! :)


rtgr

rr

rr

Hey @SloboZjalic, could you explain a bit what is this PR doing and rebase it with latest main branch?
Feel free to reopen this PR if you are still working on it. Thank you!


Does this genuinely require OCaml 5.1?

I haven't looked into it in detail, but I suspect this constraint is too aggressive. It is presently causing a minor inconvenience in Dream's examples and CI.

Unfortunately Melange has its own fork of OCaml compiler libs, and it's not trivial to support multiple versions of the OCaml compiler without breaking tooling like odoc or merlin/lsp, or adding a lot of maintenance overhead (there would need to be one version of Melange for each version of OCaml, e.g. melange-2.0-ocaml-4.14, melange-2.0-ocaml-5.0, melange-2.0-ocaml-5.1...
So Melange v2 is compatible with just OCaml 5.1. Most probably as we release new versions of Melange the range of OCaml versions supported will increase.
I am not sure what the fix can be. Probably have the Dream examples that depend on Melange only on 5.1...
cc @anmonteiro

Btw, on most recent releases of Melange libraries, I am leaving the dep on ocaml "float" on the library opam (no constraint), so that the constraint on ocaml is defined only on melange itself, see https://github.com/ocaml/opam-repository/pull/24643#discussion_r1366514968.

Yes. If the library doesn't use specific features of OCaml 5.1, it should have a relaxed constraint. It should be possible to use the library with the lowest versions of OCaml and Melange that is actually required by the code of the library itself, and let the package manager figure out what versions of these deps to install and what the constraints between them are. Unless therre is something in melange-webapi 5.1 that absolutely requires the latest OCaml, this constraint is too aggressive and prevents useful installations of the library that would have worked.

I don't think I was clear.
The version of melange-webapi does not use anything from OCaml 5.1, but it is only compatible with Melange v2, which included breaking changes on the way bindings are defined.
So removing the ocaml constraint on melange-webapi will not change anything really. The library is not usable from OCaml 5.0 or earlier versions, because Melange v2 is only compatible with OCaml 5.1.

I think this issue should be opened on Melange repository, not here.

I did understand that and looked at the change, thank you! The constraint here is only redundant and misleading, and I think there is no actual issue, netiher here nor in Melange :) Thanks again!

Just curious, how did you work around the issues in CI you were facing in Dream?
Fwiw, I removed the ocaml constraint in https://github.com/melange-community/melange-webapi/pull/15, so the next released version of melange-webapi in the opam repository won't include it.
Regarding the generic issue, it would be great if Melange could support a broader range of versions of the underlying OCaml compiler while supporting packages like odoc and merlin/lsp. Unfortunately, I am not sure we have figured out a way to do this though. I started an issue in https://github.com/melange-re/melange/issues/886.

I haven't worked around the issues yet, but I'll just make sure that the Melange example is not built in most of the CI rows. I'll add a 5.1 row.


Merge to main after spring cloud azure 5.15.0 released

Description
Merge to main after spring cloud azure 5.15.0 released
All SDK Contribution checklist:

[ ] The pull request does not introduce [breaking changes]
[ ] CHANGELOG is updated for new features, bug fixes or other significant changes.
[ ] I have read the contribution guidelines.

General Guidelines and Best Practices

[ ] Title of the pull request is clear and informative.
[ ] There are a small number of commits, each of which have an informative message. This means that previously merged commits do not appear in the history of the PR. For more information on cleaning up the commits in your PR, see this page.

Testing Guidelines

[ ] Pull request includes test coverage for the included changes.

API change check
API changes are not detected in this pull request.


[cleanup] removing print() artefacts

maybe related to: https://github.com/apache/incubator-superset/issues/3681

Coverage decreased (-0.01%) to 70.384% when pulling 24c25853671614f5572bbece45e30a80bc4086f3 on mistercrunch:fix_print into 08f09b47615937337f232bd39361632564a15f81 on apache:master.

Coverage decreased (-0.01%) to 70.384% when pulling 24c25853671614f5572bbece45e30a80bc4086f3 on mistercrunch:fix_print into 08f09b47615937337f232bd39361632564a15f81 on apache:master.

Coverage decreased (-0.01%) to 70.384% when pulling 24c25853671614f5572bbece45e30a80bc4086f3 on mistercrunch:fix_print into 08f09b47615937337f232bd39361632564a15f81 on apache:master.


chore: enable linter for tsx files

Enabled linter for .tsx files
Fixed linter errors
Removed no longer used prop-types dependency

Related to https://github.com/reduxjs/react-redux/issues/1737

Thanks!


Remove separate edit.html and use add.html for both add and edit

Code was duplicated except for title.

Pull Request Test Coverage Report for Build<PHONE_NUMBER>0
Details

0 of 0   changed or added relevant lines in 0 files are covered.
No unchanged relevant lines lost coverage.
Overall coverage remained the same at 89.599%

Totals

Change from base Build<PHONE_NUMBER>0:
0.0%

Covered Lines:
491

Relevant Lines:
548

💛  - Coveralls


[documentation] add backround knowledge about the summarizer algorithms

Issue #, if available:
Description of changes:

add backround knowledge about the summarizer algorithms
minor fixes

Merge Checklist
Put an x in the boxes that apply. You can also fill these out after creating the PR. If you're unsure about any of them, don't hesitate to ask. We're here to help! This is simply a reminder of what we are going to look for before merging your pull request.

[x] I have read the CONTRIBUTING doc
[ ] I used the commit message format described in CONTRIBUTING
[ ] I have added tests that prove my fix is effective or that my feature works (if appropriate)
[x] I have updated any necessary documentation (if appropriate)

By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.

RTD preview based on this PR: https://sagemaker-jumpstart-industry-pack--22.org.readthedocs.build/en/22/notebooks/index.html


[Question] Does gitea dump protect against data corruption when backing up live repos?

Feature Description
I have been reading about how to backup git repositories and there is some concern from 9 years ago that copying a repository mid-operation would lead to inconsistent data - difficulties in backing up live git repositories. I can't find any information about if this was changed, but I imagine not.
Does the gitea dump command protect against this type of issue when it copies repositories, or do I need to make sure users are not doing anything? (~shutting down gitea service while backing up)
Screenshots
No response

The answer is in code https://github.com/go-gitea/gitea/blob/main/cmd/dump.go
gitea dump just writes all the files under repos directory into the archiver, one by one. Shutting down gitea is the most safe way to do dump.
Personally I always use low-level methods to do backup & restore (eg: zfs snapshot), no stop time anymore.


syscall/js: copyBytesTo(Go|JS) could accept Uint8ClampedArray

syscall/js: copyBytesTo(Go|JS) could accept Uint8ClampedArray
When compiling Go to WebAssembly (with go 1.13) you can get a great help from syscall/js to interact with JS and web APIs.
One limitation is in reading and updating canvas pixel data with (get|put)ImageData, because we need an intermediary translation between Uint8ClampedArray and Uint8Array. Oderwise CopyBytesToGo panics, also we can't use a ImageData like object with Uint8Array data, or the putImageData will fail.
However, Uint8ClampedArray is just a sugary Uint8Array. I see no problem to make copyBytesTo(Go|JS) accepts that as a source or destiny.
What did you do?
// jsImgData = js.Value of Uint8ClampedArray
imgData := make([]uint8, jsImgData.Length())
// fill imgData with magic...
js.CopyBytesToJS(jsImgData, imgData)

What did you expect to see?
jsImgData filled to be puted in a canvas
What did you see instead?
The log syscall/js: CopyBytesToJS: expected dst to be an Uint8Array.

@neelance @cherrymui


Unit tests

Not necessarily testing how well it filters (let the js-xss library handle that), but test that it works as a showdown extension on both the client and server side.

I've written an article regarding XSS vulnerability. Might help creating some test cases.

https://github.com/showdownjs/showdown/wiki/Markdown's-XSS-Vulnerability-(and-how-to-mitigate-it)


Added Back To Index Link for all the sections to get a better readability

Description: This PR adds Back To Index to each section which redirects to index, (top of the page).

Thank you for taking the time to work on a Pull Request for this project!
To ensure your PR is dealt with swiftly please check the following:

[x] Your submissions are formatted according to the guidelines in the contributing guide
[x] Your additions are ordered alphabetically
[x] Your submission has a useful description
[ ] The description does not end with punctuation
[ ] Each table column should be padded with one space on either side
[ ] You have searched the repository for any relevant issues or pull requests
[ ] Any category you are creating has the minimum requirement of 3 items
[x] All changes have been squashed into a single commit

Thank you 😄 And sorry for the delay


feat: Add sns notification support to Parser utility #206

Issue #, if available:
Description of changes:

Checklist

[ ] Meet tenets criteria
[ ] Update tests
[ ] Update docs
[ ] PR title follows conventional commit semantics

Breaking change checklist

RFC issue #:

[ ] Migration process documented
[ ] Implement warnings (if it can live side by side)

By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice.

Codecov Report

Merging #207 (f6ccaa3) into develop (805ba53) will increase coverage by 0.00%.
The diff coverage is 100.00%.

@@           Coverage Diff            @@
##           develop     #207   +/-   ##
========================================
  Coverage    99.87%   99.88%
========================================
  Files           67       69    +2
  Lines         2499     2543   +44
  Branches       108      109    +1
========================================
+ Hits          2496     2540   +44
  Misses           3        3

Impacted Files
Coverage Δ

..._powertools/utilities/parser/envelopes/__init__.py
100.00% <100.00%> (ø)

...ambda_powertools/utilities/parser/envelopes/sns.py
100.00% <100.00%> (ø)

...bda_powertools/utilities/parser/models/__init__.py
100.00% <100.00%> (ø)

...s_lambda_powertools/utilities/parser/models/sns.py
100.00% <100.00%> (ø)

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 805ba53...f6ccaa3. Read the comment docs.


Implement OpticalFlow transform

See notebooks/design.ipynb for ideas.
Probably needs to be single process, because the daemonic worker processes can't spawn processes.
See this notebook for my last attempt at optical flow (using multiple processes): https://github.com/openclimatefix/predict_pv_yield_2/blob/master/notebooks/16_maxpool.ipynb

Duplicate of #96


Add Riverside City College Domain

domain address should be valid now, i had to change what JetBrains generated for me.
Computer Science @ RCC
Proof of Domain Existence

@saimdlx Thank you for your patience while waiting for a review and processing your request. Pull request merged. Please start applying for JetBrains educational subscription at https://www.jetbrains.com/shop/eform/students in an hour, to allow the changes to propagate through JetBrains systems.


Distributed package doesn't have NCCL built in

train_file_path :  D:\SD\webui\extensions\sd-webui-EasyPhoto\scripts\train_kohya/train_lora.py
cache_log_file_path: D:\SD\webui\outputs/easyphoto-tmp/train_kohya_log.txt
NOTE: Redirects are currently not supported in Windows or MacOs.
[W ..\torch\csrc\distributed\c10d\socket.cpp:601] [c10d] The client socket has failed to connect to [Xxxxx]:3456 (system error: 10049 - 在其上下文中，该请求的地址无效。).
[W ..\torch\csrc\distributed\c10d\socket.cpp:601] [c10d] The client socket has failed to connect to [Xxxxx]:3456 (system error: 10049 - 在其上下文中，该请求的地址无效。).
A matching Triton is not available, some optimizations will not be enabled.
Error caught was: No module named 'triton'
2023-10-25 05:41:18,772 - modelscope - INFO - PyTorch version 2.0.1+cu118 Found.
2023-10-25 05:41:18,782 - modelscope - INFO - TensorFlow version 2.14.0 Found.
2023-10-25 05:41:18,782 - modelscope - INFO - Loading ast index from C:\Users\Xxxxx\.cache\modelscope\ast_indexer
2023-10-25 05:41:19,444 - modelscope - INFO - Loading done! Current index file version is 1.9.3, with md5 7f80729d76bd3e75c98a156305e0f8df and a total number of 943 components indexed
[W ..\torch\csrc\distributed\c10d\socket.cpp:601] [c10d] The client socket has failed to connect to [Xxxxx]:3456 (system error: 10049 - 在其上下文中，该请求的地址无效。).
[W ..\torch\csrc\distributed\c10d\socket.cpp:601] [c10d] The client socket has failed to connect to [Xxxxx]:3456 (system error: 10049 - 在其上下文中，该请求的地址无效。).
Traceback (most recent call last):
  File "D:\SD\webui\extensions\sd-webui-EasyPhoto\scripts\train_kohya\train_lora.py", line 1467, in <module>
    main()
  File "D:\SD\webui\extensions\sd-webui-EasyPhoto\scripts\train_kohya\utils\gpu_info.py", line 178, in wrapper
    result = func(*args, **kwargs)
  File "D:\SD\webui\extensions\sd-webui-EasyPhoto\scripts\train_kohya\train_lora.py", line 826, in main
    accelerator = Accelerator(
  File "D:\SD\webui\venv\lib\site-packages\accelerate\accelerator.py", line 358, in __init__
    self.state = AcceleratorState(
  File "D:\SD\webui\venv\lib\site-packages\accelerate\state.py", line 720, in __init__
    PartialState(cpu, **kwargs)
  File "D:\SD\webui\venv\lib\site-packages\accelerate\state.py", line 192, in __init__
    torch.distributed.init_process_group(backend=self.backend, **kwargs)
  File "D:\SD\webui\venv\lib\site-packages\torch\distributed\distributed_c10d.py", line 907, in init_process_group
    default_pg = _new_process_group_helper(
  File "D:\SD\webui\venv\lib\site-packages\torch\distributed\distributed_c10d.py", line 1013, in _new_process_group_helper
    raise RuntimeError("Distributed package doesn't have NCCL " "built in")
RuntimeError: Distributed package doesn't have NCCL built in
ERROR:torch.distributed.elastic.multiprocessing.api:failed (exitcode: 1) local_rank: 0 (pid: 11164) of binary: D:\SD\webui\venv\Scripts\python.exe
Traceback (most recent call last):
  File "runpy.py", line 196, in _run_module_as_main
  File "runpy.py", line 86, in _run_code
  File "D:\SD\webui\venv\lib\site-packages\accelerate\commands\launch.py", line 989, in <module>
    main()
  File "D:\SD\webui\venv\lib\site-packages\accelerate\commands\launch.py", line 985, in main
    launch_command(args)
  File "D:\SD\webui\venv\lib\site-packages\accelerate\commands\launch.py", line 970, in launch_command
    multi_gpu_launcher(args)
  File "D:\SD\webui\venv\lib\site-packages\accelerate\commands\launch.py", line 646, in multi_gpu_launcher
    distrib_run.run(args)
  File "D:\SD\webui\venv\lib\site-packages\torch\distributed\run.py", line 785, in run
    elastic_launch(
  File "D:\SD\webui\venv\lib\site-packages\torch\distributed\launcher\api.py", line 134, in __call__
    return launch_agent(self._config, self._entrypoint, list(args))
  File "D:\SD\webui\venv\lib\site-packages\torch\distributed\launcher\api.py", line 250, in launch_agent
    raise ChildFailedError(
torch.distributed.elastic.multiprocessing.errors.ChildFailedError:
============================================================
D:\SD\webui\extensions\sd-webui-EasyPhoto\scripts\train_kohya/train_lora.py FAILED

Failed to obtain Lora after training, please check the training process.
开始训练后，出现上面的报错

同时，启用EasyPhoto后无法正常退出SD，退出时有报错：
C:\arrow\cpp\src\arrow\filesystem\s3fs.cc:2829:  arrow::fs::FinalizeS3 was not called even though S3 was initialized.  This could lead to a segmentation fault at exit

C:\arrow\cpp\src\arrow\filesystem\s3fs.cc:2829:  arrow::fs::FinalizeS3 was not called even though S3 was initialized.  This could lead to a segmentation fault at exit
这个问题可以忽略，无影响

确认一下你的机器只有一张GPU 是么？

C:\arrow\cpp\src\arrow\filesystem\s3fs.cc:2829: arrow::fs::FinalizeS3 was not called even though S3 was initialized. This could lead to a segmentation fault at exit
这个问题可以忽略，无影响

这个也不能说无影响，我在远程机器上开的SD，装了关闭的插件，不用的时候可以直接结束进程释放内存、现存资源。有这个报错后，进程无法结束，只能点击关闭cmd窗口才能释放资源。


Is eslintConfig from package.json considered?

When no path/to/eslint-config is passed to bin.js, it fallbacks to require('package.json').main.
Looks like, for example this eslintConfig, is not being taken care.
Does eslinttakes it into consideration by default?

Yes, eslint does. Can you show a specific reproduceable example where it's not?
This package was originally intended for config repos, which is why it defaults to the package.json.main.

In this repo, I see a difference in output between node bin.js package.json and node bin.js.
If I pass package.json it takes eslintConfig in the consideration, otherwise not.
Am I missing something?

To be perfectly honest, so much has happened to this repo I don't even know what should be happening anymore :sweat_smile: ¯\_(ツ)_/¯

It works as intended if the output differs, generally speaking and considering this repo, as this repo is not an ESLint config (the script referenced in package.json's main field does not contain any rule configurations)! It should output all available default rules.
When pointing towards any package.json directly, its eslintConfig field will be interpreted.

I marked this as "FAQ" and think we should leave this issue open until we somehow point out this behaviour more precisely within the docs.

Closing because this module is no longer maintained, please use https://github.com/sarbbottam/eslint-find-rules


fix: skip t1w file existence check if anat_derivatives are provided

Changes to allow processing dataset without T1w series if --anat_derivatives are provided.
See https://github.com/poldracklab/fmriprep/pull/2201

Hello @bpinsard, Thank you for updating!

In the file niworkflows/interfaces/nilearn.py:

Line 129:75: W504 line break after binary operator

In the file niworkflows/interfaces/tests/test_bids.py:

Line 152:5: E123 closing bracket does not match indentation of opening bracket's line

To test for issues locally, pip install flake8 and then run flake8 niworkflows.

@mgxd Should we target 1.3.0 or 1.2.7 with this?

I think this is fine for either, but since the behavior will not be included into the 20.1.x series of fmriprep, I'm leaning towards 1.3.0 - wdyt?

Sure. I just haven't kept up with the current status of dependencies. Merging into master.

oh, nevermind - it's in 😄

Suggestion LGTM. Feel free to patch on master.


Flow doesn't listen to block id embeds

e.g. ^iw3gxc
Instead loads the entire note to edit.

Thanks for reporting this, confirmed that the heading level is currently working but not block level. Will patch in next version.


[Metrics] Add original job definition name to pipeline metrics tags

When tracking pipeline metrics, we currently can only filter down by pipeline name, executor name and job id. There is currently no way of filtering them by job name.
I would even argue that we should maybe remove the jobId from the tags, because it has a very high cardinality.
I'm not sure i'm happy with adding this field right on the QueueItem. I wonder if we should have some sort of tags dictionary instead containing both the executor name and the job definition name?
Another avenue would be to leverage the job labels, but i feel like this might be mixing up some concepts.

Another avenue would be to leverage the job labels, but i feel like this might be mixing up some concepts.

I think it could make sense no? Kubernetes does it for a few fields. You can namespace label key such as saturn/job-definition-name=some-job-name

My main concern is that we already have all the job definition labels on it.
You would suggest adding a special key to that labels dict that we know we can recover later?

My main concern is that we already have all the job definition labels on it.
You would suggest adding a special key to that labels dict that we know we can recover later?

Could just simply add the label to the template here: https://github.com/Flared/saturn/blob/main/src/saturn_engine/worker_manager/config/declarative_job_definition.py#L34 ?

Updated the PR, i changed the approach so that we now simply add the job definition name as a default label on the QueueItem. Since we already collect all the labels in saturn.pipeline.message we will now also have the job name.
I also added the labels to saturn.pipeline.usage which was only adding the pipeline and executor as tags.


[WIP] MySql implementation for SqlStreamStore

Continuing on from #97 , opening PR to get CI feedback.

Just closing to clear the PR Q. Will re-open on a new PR when actively worked on.


[SPARK-15483][SQL] IncrementalExecution should use extra strategies.

What changes were proposed in this pull request?
Extra strategies does not work for streams because IncrementalExecution uses modified planner with stateful operations but it does not include extra strategies.
This pr fixes IncrementalExecution to include extra strategies to use them.
How was this patch tested?
I added a test to check if extra strategies work for streams.

Test build #59127 has started for PR 13261 at commit 1927321.

Test build #59127 has finished for PR 13261 at commit 1927321.

This patch passes all tests.
This patch merges cleanly.
This patch adds no public classes.

Test PASSed.
Refer to this link for build results (access rights to CI server needed):
https://amplab.cs.berkeley.edu/jenkins//job/SparkPullRequestBuilder/59127/
Test PASSed.

Merged build finished. Test PASSed.

This looks pretty good. @marmbrus

Thanks, merging to master and 2.0


validate mac format before embedding into ajax request

added __normalize_mac method, which raises a ValueError if the mac format isn't recognized


Invalid prop label supplied to InputGroup

Which package is this issue related to?
ffe-form-react
Describe your issue (screenshots welcome!)
I am getting an "Invalid prop label supplied to InputGroup" message when passing the exported Label component to the label prop of InputGroup
What is the expected behavior?
Since the documentation at https://design.sparebank1.no/styleguidist/index.html#!/InputGroup says I am allowed to pass a Label component I don't expect any console warnings.
What is the actual behavior?
I get console warnings.
Steps to reproduce
<InputGroup label={
    <Label>
        <strong className="ffe-strong-text">
            Label strong. So strong.
        </strong>
    </Label>
}>
    <Input name="foo" />
</InputGroup>

Do note that doing this in the actual designguide does not produce a warning, but doing it in a consuming application does (At least on 4.2.0).
Suggestion: Relax the prop-check to be node/string  rather than custom/string which it is today.

Here's your code in a Sandbox: https://codesandbox.io/s/x786o09k0q
No warnings there. Not sure how you're getting an error here - are you wrapping the Label component  in another component or something?
If we relax the prop types, we run the risk of somebody passing in a non-<label /> based component, which will then receive the htmlFor prop which is "magically" applied. That'll throw a warning about the "htmlFor" property not being supported for the given HTML node.

Great job on figuring out what the bug was!

I'll do this when I get around to it, hopefully before Yule.

Fixed in #530 and #531


Bug: cookie value may be empty.

When response cookie's value is empty, dart sdk will cause an exception.
cookie:
Set-Cookie: session=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT

Log
Unhandled exception:
DioError [DioErrorType.DEFAULT]: RangeError (index): Invalid value: Valid value range is empty: 0#0      _StringBase.[] (dart:core/runtime/libstring_patch.dart:237:55)
#1      _Cookie._validate (dart:_http/http_headers.dart:989:14)
#2      _Cookie._parseSetCookieValue (dart:_http/http_headers.dart:933:5)
#3      new _Cookie.fromSetCookieValue (dart:_http/http_headers.dart:849:5)
#4      new Cookie.fromSetCookieValue (dart:_http:1112:16)
#5      CookieManager.onResponse.<anonymous closure> (file:///Users/duwen/Documents/code/dio/example/cookie_jar.dart:29:37)
#6      MappedListIterable.elementAt (dart:_internal/iterable.dart:414:29)
#7      ListIterable.toList (dart:_internal/iterable.dart:219:19)
#8      CookieManager.onResponse (file:///Users/duwen/Documents/code/dio/example/cookie_jar.dart:29:62)
#9      Dio._onResponse.<anonymous closure>.<anonymous closure> (package:dio/src/dio.dart:744:54)
#10     Dio._executeInterceptors (package:dio/src/dio.dart:501:38)
<asynchronous suspension>
#11     Dio._onResponse.<anonymous closure> (package:dio/src/dio.dart:743:47)
#12     Dio._checkIfNeedEnqueue (package:dio/src/dio.dart:785:22)
#13     Dio._onResponse (package:dio/src/dio.dart:742:12)
#14     Dio._makeRequest (package:dio/src/dio.dart:622:18)
<asynchronous suspension>
#15     Dio._request.<anonymous closure>.<anonymous closure> (package:dio/src/dio.dart:532:15)
#16     _RootZone.runUnary (dart:async/zone.dart:1379:54)
#17     _FutureListener.handleValue (dart:async/future_impl.dart:129:18)
#18     Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:642:45)
#19     Future._propagateToListeners (dart:async/future_impl.dart:671:32)
#20     Future._complete (dart:async/future_impl.dart:476:7)
#21     _SyncCompleter.complete (dart:async/future_impl.dart:51:12)
#22     _AsyncAwaitCompleter.complete (dart:async/runtime/libasync_patch.dart:28:18)
#23     _completeOnAsyncReturn (dart:async/runtime/libasync_patch.dart:295:13)
#24     Dio._executeInterceptors (package:dio/src/dio.dart)
<asynchronous suspension>
#25     Dio._request.<anonymous closure> (package:dio/src/dio.dart:524:20)
#26     Dio._checkIfNeedEnqueue (package:dio/src/dio.dart:785:22)
#27     Dio._request (package:dio/src/dio.dart:523:9)
<asynchronous suspension>
#28     Dio.request (package:dio/src/dio.dart:453:12)
<asynchronous suspension>
#29     Dio.get (package:dio/src/dio.dart:74:12)
#30     main (file:///Users/duwen/Documents/code/dio/example/cookie_jar.dart:76:13)
<asynchronous suspension>
#31     _startIsolate.<anonymous closure> (dart:isolate/runtime/libisolate_patch.dart:289:19)
#32     _RawReceivePortImpl._handleMessage (dart:isolate/runtime/libisolate_patch.dart:171:12)

#0      Dio.reject.<anonymous closure> (package:dio/src/dio.dart:225:7)
#1      _RootZone.runUnary (dart:async/zone.dart:1379:54)
#2      _FutureListener.handleError (dart:async/future_impl.dart:147:20)
#3      Future._propagateToListeners.handleError (dart:async/future_impl.dart:654:47)
#4      Future._propagateToListeners (dart:async/future_impl.dart:675:24)
#5      Future._completeError (dart:async/future_impl.dart:494:5)
#6      Future._asyncCompleteError.<anonymous closure> (dart:async/future_impl.dart:542:7)
#7      _microtaskLoop (dart:async/schedule_microtask.dart:41:21)
#8      _startMicrotaskLoop (dart:async/schedule_microtask.dart:50:5)
#9      _runPendingImmediateCallback (dart:isolate/runtime/libisolate_patch.dart:115:13)
#10     _RawReceivePortImpl._handleMessage (dart:isolate/runtime/libisolate_patch.dart:172:5)

I have seen the source code, and find this line
https://github.com/dart-lang/sdk/blob/a9ad427ea22ad81c9a06c4c35c04c1ab029c08df/sdk/lib/_http/http_headers.dart#L989
value is not test whether is empty before using it.

ref: https://github.com/dart-lang/sdk/issues/35189

This bug is now fixed and the fix will appear in the next major Dart release (which I imagine would be 2.4.0).


tests: kernel: timer: starve: kernel.timer.starve hangs

Describe the bug
The tests/kernel/timer/starve/kernel.timer.starve hangs
Observed for

nrf5340dk_nrf5340_cpunet
nrf5340dk_nrf5340_cpuapp
nrf5340dk_nrf5340_cpuapp_ns
nrf9160dk_nrf9160
nrf9160dk_nrf9160_ns
nrf52dk_nrf52832
nrf52840dk_nrf52840

Occurrence: Always
To Reproduce
Steps to reproduce the behavior:

have nrf5340dk_nrf5340 connected
go to your zephyr dir
call ./scripts/twister -T tests/kernel/timer/starve -p nrf5340dk_nrf5340--device-testing --device-serial /dev/ttyACM2 -v --inline-logs
See console output with error

Expected behavior
Valid console output
Impact
Not clear
Logs and console output
[2022-11-08T00:23:59.574Z] ERROR   - *** Booting Zephyr OS build zephyr-v3.2.0-1303-g9cb1ff7fcee2 ***
[2022-11-08T00:23:59.574Z] Running TESTSUITE starve_fn
[2022-11-08T00:23:59.574Z] ===================================================================
[2022-11-08T00:23:59.574Z] START - test_starve
[2022-11-08T00:23:59.574Z] Cycle clock runs at 32768 Hz
[2022-11-08T00:23:59.574Z] There are 1 cycles per tick (32768 Hz ticks)
[2022-11-08T00:23:59.574Z] [     0.387] 1: still running, would pass at 3600 s
[2022-11-08T00:23:59.574Z] [    60.091] 594: still running, would pass at 3600 s
[2022-11-08T00:23:59.574Z]

Environment (please complete the following information):

OS: Ubuntu 20.04.1 LTS
Toolchain Zephyr SDK 0.14.1
Commit SHA or Version used: v3.2.0-1303-g9cb1ff7fcee2

The test does not hang. It just needs 60 minutes to complete (as the message says: "still running, would pass at 3600 s"). It is properly marked: https://github.com/zephyrproject-rtos/zephyr/blob/9b7d3657c9f715e2e47466c2a6e009e21688e43e/tests/kernel/timer/starve/testcase.yaml#L3 and when called with the command mentioned above, slightly corrected to:
./scripts/twister -T tests/kernel/timer/starve -p nrf5340dk_nrf5340_cpuapp --device-testing --device-serial /dev/ttyACM1 -v --inline-logs

the test is skipped, so I don't see an issue here that could be corrected in the Zephyr tree.
The problem seems to be a too short timeout (2 minutes?) used when the test is somehow forced to be executed.

I don't see an issue here that could be corrected in the Zephyr tree.

It looks like I was a bit too quick with making this statement and closing the issue. timeout: 3600 added in testcase.yaml could probably solve the problem. I'll create a PR with such patch.


JavaScript version is different on websites:  v1.0.2  vs  v1.1.1

I noticed the versions are different between websites for the JavaScript.
I found the latest though for JavaScript:

npm (1.1.1) : https://www.npmjs.com/package/hashids
Github (1.1.1) : https://github.com/ivanakimov/hashids.js/releases
website (1.0.2) : http://hashids.org/javascript/

Also, another idea:
I think it would be a great thing to coordinate the version numbers
for this code between all versions: PHP, Perl, Python, Ruby... v1.1.1
Just an idea. I am not sure if that is something that can be done or want,
but I wanted to suggest.  It is a great utility to me.  Thank you.
Daryl

Updated, thanks 👍
Re: versions, we're [somewhat] doing that already. Major version shows that ids are the same across implementations, minor differs, and patch always changes of course.


Add "klybeck" to meta keywords

closes https://github.com/renee-bar/renee-bar.github.io/issues/45

Oh I need to build it - no ruby installed - never mind.

I think it's ok, Github pages will build it.


Update EasyRSA

But updates the version of EasyRSA to one that doesn't require mcrypt (see https://github.com/paragonie/EasyRSA/compare/0.2.0...v0.4.0).
This is the last version that we can upgrade to, as it marks the current encryption method as legacy, and future versions remove the shim to decode legacy strings.

@indygriffiths Is this something that we can get merged in? Would love to be able to use PHP 7.2 instead of 7.1

https://scrutinizer-ci.com/g/silverstripeltd/frisp/inspections/12d186b9-87c1-4198-b7bd-fac25fd2ed3a/issues/files/Frisp/Reader.php?status=new&orderField=path&order=asc&honorSelectedPaths=0

@halkyon Good catch, was setting the ciphertext as the private key :man_facepalming:
@stojg Regarding your Slack message, have confirmed that the PHAR still works.
igriffiths@local:~# ./frisp  --bucket vault --vault my-cool-stack --region us-west-2 --assume-role "foo" write indy cool

root@remote:~# /usr/local/bin/frisp read indy --config env --assume-role "foo"
{
    "indy": "cool"
}

One thing worth highlighting is that secrets written with a newer version of Frisp cannot be read by older versions. For our use-case this shouldn't be a huge deal as the new version can still read older secrets


Syntax Error in REQUEST-922-MULTIPART-ATTACK

I am trying to configure ModSecurity for my web server.  I so far have the following:
<IfModule security2_module>
        # Default Debian dir for modsecurity's persistent data
        SecDataDir /var/cache/modsecurity

        # Include all the *.conf files in /etc/modsecurity.
        # Keeping your local configuration in that directory
        # will allow for an easy upgrade of THIS file and
        # make your life easier
        IncludeOptional /etc/modsecurity/*.conf

        # Include OWASP ModSecurity CRS rules if installed
        IncludeOptional /etc/apache2/modsecurity-crs/coreruleset/crs-setup.conf
        IncludeOptional /etc/apache2/modsecurity-crs/coreruleset/rules/*.conf
</IfModule>

When I run:
sudo apache2ctl -t
I get the error:
AH00526: Syntax error on line 43 of /etc/apache2/modsecurity-crs/coreruleset/rules/REQUEST-922-MULTIPART-ATTACK.conf:
Error creating rule: Unknown variable: &MULTIPART_PART_HEADERS
Action '-t' failed.
The Apache error log may have more information.

Any ideas?

From CRS 3.2.2, 3.3.3 and up, ModSecurity 2.9.6 or 3.0.8 (or versions with backported patches) are required due to the addition of new protections. We recommend upgrading your ModSecurity as soon as possible.
If your ModSecurity is too old, your webserver will refuse to start with an Unknown variable: &MULTIPART_PART_HEADERS error.
If you are in trouble, you can temporarily delete file rules/REQUEST-922-MULTIPART-ATTACK.conf as a workaround and get your server up, however, you will be missing some protections. Therefore we recommend to upgrade ModSecurity before deploying a new CRS release.

Thank you for your prompt reply.
I have the following version.
$ apt-cache show libapache2-mod-security2 | grep -E '(Version|Package)'
Package: libapache2-mod-security2
Version: 2.9.3-1
Off the top of your head, do you know a quick way to kick it up tp v2.9.6 on Ubuntu 20? I quickly looked at installing version 3.x but it seems I need to build it from source first.

hi @minoush82,
unfortunately Debian isn't picked up the patched version of mod_security2 for stable releases, therefore Ubuntu still haven't started to distribute it.
You have these options:

use Digitalwave's repository (I'm the maintainer)
grab the finalized source of package from Debian's Salsa; as you can see, the last commit is a patch for Debian 2.9.3 (I'm one of the maintainer too)


Bot will hang on "ENSURING LOGIN ON BING" after the account was unlocked by Microsoft

So recently on my other account, it was locked by Microsoft which caused it not to be able to log in so I added a phone number and unlocked the account and it still happens. Any trouble shooting ideas?

Your account is probably banned from ms rewards...

yeah but i can still login to it and still do the rewards myself tho.

plus i can still use bing with that account- so it cannot be banned.

So it's a country-language problem, make sure you are using an ip adress location matching your microsoft account country-language

I tried running this on an OVH-latest-Ubuntu-VPS and have the same issue. It works locally on Windows 10 but gets stuck on the step described above if using the VPS. The VPS and my home IP share the same country and I'm able to still collect rewards on Windows 10 if I use the VPS as a VPN tunnel via OpenVPN. I don't believe this is an IP or account issue but rather a Linux issue maybe?


Shop: don't get the subscription length if the subscription is free when adding extra citites

#288
Migration
def migrate_free_subscription_next_charge_date():
  from shop.migrations.update_free_subscription_next_charge_date import job
  job()

[ ] make a migration which sets all those free subscriptions their next charge date to next month instead of the year 9999, else they'll never be charged
[ ] Revert changes on client (javascript) as they won't be needed
[ ] Modify recurrent billing job so it can handle the free subscriptions

In case customer their subscription and other products does not cost anything (total amount == 0), do not create a new charge and just set the next charge date to next month
In case the customer does have a free subscription but has extra products (like extra cities), proceed with recurrent billing like it's implemented now (no extra changes required I think)

Should also resolve #276?


Use async/await in accountManagementService APIs

Many async APIs in accountManagementService are designed with traditional Promise<>.then() pattern.
We need to update code to use async/await all the way to references wherever applicable.
Since this change will affect lot of classes/tests, opening this issue to track this change independently.

FWIW it shouldn't actually result in any tests changing. You shouldn't be changing the return value for any of these functions - just how the code is organized within the function.


Update tabbar.html

Fix tab layouts and their contents

The tabs weren't selectable, and the content was totally different than the JS tutorial. I just made it consistent.

@arulths Thanks!


Prior working project now builds to a black screen using the Compatibility Renderer

Godot version
4.1 beta 3
System information
Windows 11
Issue description
Project builds and displays fine in all releases of Godot 4.x up until and including 4.1 beta 2.
When opening the project in 4.1 beta 3, it builds to a black screen, without crashing.
Switching from the Compatibility Renderer to Forward+ solves the issue.
Switching back to Compatibility breaks the build again
Reverting back to beta 2 also solves the issue, regardless of the renderer used.
Steps to reproduce

create a project in a version of Godot 4.x prior to beta 3, using the Compatibility renderer
open and build the project in Godot 4.1 beta 3
switch between different renderers to get the build to display

Minimal reproduction project
N/A

Could you run the project from the command line with the --verbose option (using the _console.exe binary so it properly shows output in the console), and paste the output here? Should be something like:
cd C:\path\to\project
C:\path\to\Godot_v4.1-beta3_win64_console.exe --verbose

Godot Engine v4.1.beta3.official.ada712e06 - https://godotengine.org
TextServer: Added interface "Dummy"
TextServer: Added interface "ICU / HarfBuzz / Graphite (Built-in)"
NVAPI: Init OK!
NVAPI: Disabled OpenGL threaded optimization successfully
Using "wintab" pen tablet driver...
Shader 'CanvasSdfShaderGLES3' SHA256:
72cda41890bce2f09217c172023d31e735a3fee605bad83c8e63f1a981a36a77
Shader 'SkeletonShaderGLES3' SHA256:
add3f03e6eebdffdf0073fae42195857307eddada333b82998642329511917a2
Shader 'ParticlesShaderGLES3' SHA256:
9bf432d37b0b4792d67aa9f577258845d4047e3f98e990aeca6fd20a868c4db2
Shader 'ParticlesCopyShaderGLES3' SHA256:
c778843b0cd1c7ce4c621fa2b924f703ac4001faef0555114b81a76c264a6908
Shader 'CopyShaderGLES3' SHA256:
b1bc5a355ed9bda23f291956f121e0535b4e81b54cdac398412d200e6133161f
Shader 'CanvasShaderGLES3' SHA256:
007cddfcf35f7d57b219cffec53f6a7d9fe7a1979be4db64c6450cfac6000053
Shader 'CanvasOcclusionShaderGLES3' SHA256:
968915a469db9a7d505be274e8060c8288c15a5865baeb8362b3b0e2cacb16f3
Shader 'SceneShaderGLES3' SHA256:
7757391c487ac94cfa6418166bd5fdacce470f09394c1a2a875e878c8c5d8596
Shader 'SkyShaderGLES3' SHA256:
1fe105946e63973aecf5198091930c2bdb17778012ef0253e325ade3a297e6c8
Shader 'CubemapFilterShaderGLES3' SHA256:
2b651c285a02b7d4221af1827e1613c03e73e600ebc40b9e6a0b22bb855bd75f
OpenGL API 3.3.0 NVIDIA 535.98 - Compatibility - Using Device: NVIDIA -
NVIDIA GeForce GTX 1080 Ti
WASAPI: Activated output_device using IAudioClient3 interface
WASAPI: wFormatTag = 65534
WASAPI: nChannels = 2
WASAPI: nSamplesPerSec = 48000
WASAPI: nAvgBytesPerSec = 384000
WASAPI: nBlockAlign = 8
WASAPI: wBitsPerSample = 32
WASAPI: cbSize = 22
WASAPI: mix_rate = 48000
WASAPI: fundamental_period_frames = 480
WASAPI: min_period_frames = 480
WASAPI: max_period_frames = 480
WASAPI: selected a period frame size of 480
WASAPI: detected 2 channels
WASAPI: audio buffer frames: 480 calculated latency: 10ms
TextServer: Primary interface set to: "ICU / HarfBuzz / Graphite
(Built-in)".
CORE API HASH: 141380681
EDITOR API HASH: 546665002
Loaded system CA certificates
On Fri, Jun 23, 2023 at 12:24 PM Rémi Verschelde @.***>
wrote:

Could you run the project from the command line with the --verbose option
(using the _console.exe binary so it properly shows output in the
console), and paste the output here? Should be something like:
cd C:\path\to\project
C:\path\to\Godot_v4.1-beta3_win64_console.exe --verbose
—
Reply to this email directly, view it on GitHub
https://github.com/godotengine/godot/issues/78608#issuecomment-1604067626,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/ACHSGBUX2GNBRRB6OUNLTPLXMVVGHANCNFSM6AAAAAAZRL2VUU
.
You are receiving this because you authored the thread.Message ID:
@.***>

Could you provide a bit more information about your project? For example, what node types you use. I am not seeing the same problem in my projects, but I may be missing some crucial element that is causing the issue.

Here is the basic project structure.
Levels are loaded in under the scene manager, but I cannot even get that far in beta 3. Other versions work fine.
Let me know if you need anything else.

@zapposh Is your SubViewportContainers filter mode set to nearest? I can reproduce a black screen with the following setup:

So long as the SubViewportContainer is using nearest filtering

Affirmative, Filter is set to Nearest.
On Fri, Jun 23, 2023 at 6:23 PM Clay John @.***> wrote:

@zapposh https://github.com/zapposh Is your SubViewportContainers
filter mode set to nearest? I can reproduce a black screen with the
following setup:
[image: image]
https://user-images.githubusercontent.com/16521339/248320715-a5133432-2b28-4785-896b-b6b4fb17ada4.png
So long as the SubViewportContainer is using nearest filtering
—
Reply to this email directly, view it on GitHub
https://github.com/godotengine/godot/issues/78608#issuecomment-1604514544,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/ACHSGBVBRLGY44X3NPJ6WMDXMW7J7ANCNFSM6AAAAAAZRL2VUU
.
You are receiving this because you were mentioned.Message ID:
@.***>

Okay, most likely a regression from https://github.com/godotengine/godot/pull/78285. Should be a quick fix