Add maxlag kw for limited cross correlation window size to correlate/convolve functions

I am learning numpy/scipy, coming from a MATLAB background. The xcorr function in Matlab has an optional argument "maxlag" that limits the lag range from –maxlag to maxlag. This is very useful if you are looking at the cross-correlation between two very long time series but are only interested in the correlation within a certain time range. The performance increases are enormous considering that cross-correlation is incredibly expensive to compute.
In numpy/scipy it seems there are several options for computing cross-correlation. numpy.correlate, numpy.convolve, scipy.signal.fftconvolve. If someone wishes to explain the difference between these, I'd be happy to hear, but mainly what is troubling me is that none of them have a maxlag feature. This means that even if I only want to see correlations between two time series with lags between -100 and +100 ms, for example, it will still calculate the correlation for every lag between -20000 and +20000 ms (which is the length of the time series). This gives a 200x performance hit! Is it possible that I can contribute this feature?

I'm just a scipy user (not a dev), but I definitely agree that this has been a issue in many of my analyses. My usual solution is to just roll my own functions that implement maxlag limits. For example, to cross-correlate spike-train data, I use something like this.
A similar sliding window approach could be used for continuous time series. However, that kind of data (dense, as opposed to spike timing) would probably benefit from a lower-level implementation using something like scipy.weave.

Just a tip, recode your spike-train data to a series of 0s and 1s by assuming your spike-train is a sum of delta functions (look up Koch and Segev, "Methods in Neuronal Modelling", an old book but still just as relevant). Then use rfft to compute the cross-correlation. That is usually faster than doing those summations, Also, if you use a fast FFT library (MKL, FFTW, Apple Accelerate) it will also be multi-threaded and fast as hell. :)

It would be interesting to see some performance comparisons between fft and a simple loop for a few correlation/lags, to see where the threshold is.

At the risk of veering OT since @bringingheavendown is probably considering continuous data, there are problems with the conventional FFT method for spiking data. The necessary binarization (@sturlamolden's "recoding") can only ever approximate a summation of delta functions, so either you use more memory for your binary vectors (and correspondingly longer FFT wall time) as you try to combat binning noise with smaller bins or you simply deal with increasingly inaccurate correlations. Binning noise is compounded by the FFT convolution since it operates across the entire duration of the recording data and becomes a real problem when your bins are too large. In contrast, the windowed loop implementation is based on exact (well, floating point) subtraction of timestamps (i.e., precise to 1/32,000 second) which at least gives you accurate lag counts in the resulting correlograms. If we consider the number of bins in the resultant correlogram as a parameter that the user of the cross-correlation function should be able to control, then using the FFT method also requires rebinning to the specified number of bins and range of lags based on the maxlag parameter, and this can introduce even more aliasing noise.
I did a quick comparison (Mid-2012 Retina Macbook Pro, 2.6Ghz) and found that computing the 1-second maxlag autocorrelation of a random 10 Hz spike train of 200-second duration takes about 0.35 seconds for the loop implementation I posted above compared to about 19 seconds for an FFT convolution with 0.0005-second binarization and correlogram rebinning. Even with these tiny binarization bins, you can see a fair amount of variance in the noise floor of the FFT result relative to the loop result:

To get the two methods to run in about the same wall time, I increased the FFT bin size to 1 ms, producing the correlation in about 0.48 seconds. However, the variance in the noise floor increased substantially (including an apparent upward bias, which I'm not sure about):

Here's the code for the comparison. This could be extended to sweep across (e.g.) firing rate to see the crossing point for the two methods, as suggested by @josef-pkt. Regardless, I've used an IPython.parallel version of the looped algorithm to compute autocorrelations of spike trains with 100,000s of spikes across several hours of recording in just a few seconds. This performance is pretty ok with me. There are different considerations for continuous data, which are already natively sampled, but windowed algorithms can be more efficient and accurate at least for point-processes like spiking or other sparse data sets. It would be nice see functionality addressing this in Scipy, but it could get confusing given all the correlate/convolve/fft functions already there.

You need to low-pass filter before you bin the spike train, for the same reason you have an anti-alias filter before the ADC.

Ah you could've mentioned that in your simple FFT recipe

If data has been collected it is already after the ADC, so filtering/decimation just loses precision again in the name of efficiency. In the end, this all depends on the goals of the particular data and analysis.

Well, this is getting totally OT :) Anyway, a spike-train coded as a sum of delta functions is an analog signal. So when you bin the signal into rate or count histograms you will introduce aliasing, and your binning noise is the aliasing. The theory is explained in the classical French  and Holden (1971) paper, though it is uncommon to use their "exact" anti-alias filter for reasons of efficiency. The easiest solution is to convolve each delta-function spike with a short FIR low-pass filter before you sample the spike train. http://link.springer.com/article/10.1007/BF00291117

I take all this to mean that a maxlag parameter should only be implemented the way it is in matplotlib.Axes.xcorr which is just np.correlate(..., mode=2) followed by slicing out the maxlag window. I poked around in Matlab and can't find any evidence that the maxlag argument affects the length of computation anyway, only the size of the results. Thanks for the reference. :)

It depends on the implementation in Matlab. But having a maxlag should improve the performance. The complexity is O(nn) for a cross-correlation of two signals of length n. With maxlag of m it should be O(nm), which can be much smaller.

Travis failure on Pyhton 2.6 is because I forgot to conditionally define NPY_UNLIKELY().

Right, I just thought you were saying there was no point to implementing windowed correlation. The reduction in complexity is the entire reason for this issue I think, so that is understood. It would be nice to have a core C code implementation available as an np.correlate/np.convolve mode or similar, but not sure how critical that would be given the various workarounds.

I think NumPy code is supposed to be "lean and mean", so anything with extra features belongs more naturally in SciPy.

Here is my concrete proposal:

Add maxlags as an additional argument to numpy.correlate.  This will automatically add the functionality to numpy.convolve, as it calls numpy.correlate for the heavy lifting.
Change scipy.signal.correlate and scipy.signal.convolve so that they call numpy.correlate for the heavy lifting because there is no reason to have two independent implementations of the exact same function.
After this is done, performance analysis will be done to determine the vector lengths at which correlate with maxlags is faster than fftconvolve, and that information will be added to the documentation.
The other similar functions (scipy.signal.convolve2d, scipy.signal.correlate2d, scipy.ndimage.filters.convolve, scipy.ndimage.filters.convolve1d, scipy.ndimage.filters.correlate, scipy.ndimage.filters.correlate1d) will have to wait for some other time as they are not immediately interchangeable with numpy.correlate.
Can you all let me know how this sounds and what the process would be for going about this?
Thank you.

On Mon, Jun 8, 2015 at 3:55 PM, bringingheavendown<EMAIL_ADDRESS>
wrote:

Here is my concrete proposal:

Add maxlags as an additional argument to numpy.correlate. This will
automatically add the functionality to numpy.convolve, as it calls
numpy.correlate for the heavy lifting.

Most numpy devs read this mailing list too, but if you want to change
numpy, you will need to discuss it in the numpy list as well.

Change scipy.signal.correlate and scipy.signal.convolve so that they
call numpy.correlate for the heavy lifting because there is no reason to
have two independent implementations of the exact same function.

I believe signal's convolve and correlate functions do multidimensional
convolution/correlation, while numpy only does 1-D, so they are really not
interchangeable.

After this is done, performance analysis will be done to determine the
vector lengths at which correlate with maxlags is faster than fftconvolve,
and that information will be added to the documentation.
The other similar functions (scipy.signal.convolve2d,
scipy.signal.correlate2d, scipy.ndimage.filters.convolve,
scipy.ndimage.filters.convolve1d, scipy.ndimage.filters.correlate,
scipy.ndimage.filters.correlate1d) will have to wait for some other time as
they are not immediately interchangeable with numpy.correlate.
Can you all let me know how this sounds and what the process would be for
going about this?

Send a pull request to numpy, preferably after discussing the details over
there, they are always welcome...
Jaime
--
(__/)
( O.o)
( > <) Este es Conejo. Copia a Conejo en tu firma y ayúdale en sus planes
de dominación mundial.

As @jaimefrio said, they are not identical. Another thing is that scipy.ndimage should perhaps be left alone because of GSoC.

By the way, Matlab's xcorr function uses the fft trick, so it's maxlag parameter doesn't save much time.  Matplotlib.pyplot.axes.xcorr also only uses maxlag for sizing the output, but doesn't actually change the computation at all.
I implemented my own xcorr_maxlag function for continuous data, and even in straight python, it gives a 50x speedup on my data compared to numpy.correlate (although it is still slightly slower than fftconvolve).  I am using maxlag 10, time series length 21000.  numpy.correlate takes 0.336 s, my xcorr_maxlag takes 0.006 s and fftconvolve takes 0.005 s.
I'm assuming that x and y are the same length here.  I'm not sure what the appropriate way to deal with different sized vectors is.

Different sized arrays is what you e.g. have in a matched filter.

Would any of you guys be able to explain the difference between the three functions OP talked abouy (numpy.correlate, numpy.convolve, scipy.signal.fftconvolve)?
Also, why is xcorr talked in the same breath as correlate and convolute? Don't they give fairly different results?
Excuse my ignorance in this, I've only been dabbling in DSP for about a month or so.

Also, why is xcorr talked in the same breath as correlate and convolute? Don't they give fairly different > results?

Cross-correlation is what you use to implement a matched filter. It is basically convolution without time-reversal of the filter kernel. A cross-correlogram in statistical signal analysis is a particular case of matched filtering. But it is not the one use case.

Would any of you guys be able to explain the difference between the three functions OP talked about (numpy.correlate, numpy.convolve, scipy.signal.fftconvolve)?

numpy.correlate does a cross-correlation of a one-dimensional signal and a one-dimensional  template.
numpy.convolve does a convolution of a one-dimensional signal and a one-dimensional kernel.
scipy.signal.correlate does a cross-correlation of an N-dimensional signal and a N-dimensional  template.
scipy.signal.convolve does a convolution of an N-dimensional signal and an N-dimensional kernel.
scipy.signal.fftconvolve is the same as scipy.signal.convolve but computes the convolution using FFT.

@sturlamolden , thank you!

I have now implemented this functionality in numpy.correlate() and numpy.convolve(). https://github.com/bringingheavendown/numpy. The files that were edited are:
numpy/core/src/multiarray/multiarraymodule.c
numpy/core/numeric.py
numpy/core/tests/test_numeric.py
Please look over the code, my design decisions, and the unit tests I have written. This is my first time contributing, so I am not confident about any of these and welcome feedback.

Which branch? (Don't work in your master branch. I once did, and its stupid.)
If you post a WIP PR it is easier to compare the changes to the current NumPy.

No // comments in ANSI C.

I have a feeling that what you really want is a function that computes cross-correlograms, the way they are used in statistical signal analysis. You are messing with functions which are actually about filtering, for which this "maxlag" and "lagstep" thing makes no sence, nor the "lagvec" output.
(Not to mention that inplace modification is not the way we return optional output arrays.)
It would be more appropriate to implement a function in scipy.signal that returns a cross-correlogram. It should return two arrays, correlations and time lags, and should allow multiple forms of normalisations.

If you want to plot a cross-correlogram, matplotlib.pyplot.xcorr will do what you want. It also returns the correlations and the time-lags. A similar function in SciPy should not do any plotting.
This would not be the first case of overlap between SciPy and matlplotlib, though. There is another one between scipy.signal.welch and matplotlib.pyplot.psd.
http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.xcorr

I do want a function that computes cross-correlograms, however the implementation is exactly the same for cross-correlograms as convolution.  Not only that, is the numpy.correlate() function not for computing cross-correlograms?  Maxlag and lagstep still make sense in the context of convolution.  Say you have a time series (this is not the best example) of rain amounts and you have a kernel for plant growth given rain in the recent past.  Your time series is the entire year, but you are only interested in the plant growth during the months of April through August.  Not only that, you do not need daily readout of plant growth; weekly resolution is enough for your needs.  You wouldn’t want to compute the convolution for the entire time series, instead you would do: numpy.convolve(rain, growth_kernel, (april, september, 7), lagvec) and get lagvec back with the indices of the sundays in april through august, and a return vector with the amount of plant growth on those days.
I am happy to change the return of lagvec; I wasn’t sure how to return optional output arrays.  It didn’t seem that returning both was appropriate because if you called the function with a single output argument, you would still get a tuple of arrays, which you would then have to unpack.  Please let me know what would be better.
My intention is to eventually also implement normalization as an option in this function.  Perhaps also the fft shortcut to computation of correlation/convolution as another option.  Right now, the maxlag option is what I am working on.
I don’t really want to add an entirely new function to scipy.signal.  It was already hard enough as a new user trying to figure out which of the five seemingly identical functions in numpy, scipy, and matplotlib that I should be using.  Besides, if all of these functions are essentially doing the same computation, there should only be a single base implementation that they all use, so that 1) the learning curve is decreased and 2) that any optimizations be passed on to all of the functions instead of having to be independently reimplemented several times.  So, even if we do decide that scipy.signal should have a new correlogram command, it should be a wrapper for numpy.correlate.  But why wouldn't one just use scipy.signal.correlate for the 1d case as well?
As for matplotlib.pyplot.xcorr, it is simply a wrapper for numpy.correlate.  As I described at the start of this conversation, the maxlag functionality gives great performance improvements, but matplotlib.pyplot.xcorr's maxlag option doesn’t actually give this performance improvement.  It actually calculates the entire cross-correlogram and then only returns part of it.
In conclusion, I do think that this enhancement should be added to numpy.correlate.  I do hope that you give suggestions as to how to improve the interface in terms of parameters and outputs.

Here are the specific issues that could use attention in this implementation:
How to deal with the optional lagvec output array?
Is it ok that this implementation breaks the previous undocumented behavior of mode=0, 1, or 2 returning the correlation for mode='valid', 'same', or 'full' respectively?  If not, how should maxlag input be passed?
Should the checks that are included in convolve() be added to correlate()?
Is it ok that I used INT_MAX to represent requests for a default argument in the C code?
Do I need to check for "default arguments" at all, given that the calling functions should now always call _pyarray_correlate with the appropriate number of arguments?  I kind of feel there is some legacy behavior I should be maintaining, but I'm not 100% sure.
Is the error message in _pyarray_correlate "PyErr_SetString(PyExc_ValueError, "mode must be 0, 1, 2, or 3")" still valuable?  What should it be replaced with?
Are there other error checks I should add to the code at this or other points?
Could you all clean up the unit tests/add some new ones to be absolutely sure that it deals properly with weird combinations of input array sizes and lag inputs?  I couldn't figure out how to run all the same unit tests with the order of input arrays switched.

You would use an optional input parameter which indicates whether to return lagvec. It should default to False. If it is True you return a tuple of two arrays ibstead of just one array.

INT_MAX is not ok because we have 64 bit systems. You need to use an invalid value.

Why does 64 bit systems matter for using INT_MAX?  What invalid value would I use?  (int)NULL=0 and (int)void throws an error.
I used INT_MAX as the default values of minlag, maxlag, and lagstep in array_correlate2 in multiarraymodule.c, which is the function called directly by python.  Those are currently optional arguments, but both convolve() and correlate() do actually pass those.  INT_MAX gets passed through functions until it gets to _pyarray_correlate in multiarraymodule.c, which is the function that actually implements the cross-correlation.  It checks for INT_MAX values, but it's kind of awkward because if we got that far without calculating minlag etc. then something else is wrong.

Because INT_MAX is the maximum value of an int, which accirding to the ANSI C standard is at least 0x7FFF, usually 0x7FFFFFFF on contemporary systems. On a 64 bit system the maximum value of an npy_intp is 0x7FFFFFFFFFFFFFFF. Since npy_intp is what we use to store an array size, you must use an invalid value for a maxlag instead of something that can be as small as 0x7FFF. If negative values of maxlag is disallowed (I haven't cared to look) you can e.g. use -1.

Unfortunately, negative values of lags are allowed: for example, if you want to look at the correlation only for lags for which the second vector is to the left of the first vector.

Then you must e.g. increase the number of arguments to the C function and have one with boolean bitflags or whatever.

Amazing!  Thank you!

The size of an array of 0x7FFFFFFF C double is only about 16 GB. There are people running NumPy on much larger computers than this.

You could use a silly value like NPY_MAX_INTP. It would never overflow with an array of double. Or to be pedantic you can just disallow this integer value before calling C.

The problem is that I can't figure out how to get bitflags to work with PyArg_ParseTupleAndKeywords.  I have to pass in a variable that it either modifies or doesn't modify.  I still have to initialize the variable with some value that I check to see if PyArg_ParseTupleAndKeywords changed.  I'll go with NPY_MAX_INTP instead of INT_MAX.

I am not sure I understood. You cannot figure out how to pass an integer from Python to C?

I can't figure out how to check in the C code if an integer was passed from the python caller without using a default value.  Eg.
    int mode = 0, maxlag = NPY_MAX_INTP, minlag = NPY_MAX_INTP, lagstep = NPY_MAX_INTP;
    static char *kwlist[] = {"a", "v", "mode", "minlag", "maxlag", "lagstep", NULL};

    if (!PyArg_ParseTupleAndKeywords(args, kwds, "OO|iiii", kwlist,
                &a0, &shape, &mode, &minlag, &maxlag, &lagstep)) {
        return NULL;
    }

int mode = 0, maxlag = NPY_MAX_INTP, minlag = NPY_MAX_INTP, lagstep = NPY_MAX_INTP;

Integer overflow.

so i want
npy_intp  mode = 0, maxlag = NPY_MAX_INTP, minlag = NPY_MAX_INTP, lagstep = NPY_MAX_INTP;

?

    int mode = 0;
    npy_intp maxlag = NPY_MAX_INTP, minlag = NPY_MAX_INTP, lagstep = NPY_MAX_INTP;
    static char *kwlist[] = {"a", "v", "mode", "minlag", "maxlag", "lagstep", NULL};
    if (!PyArg_ParseTupleAndKeywords(args, kwds, "OO|innn", kwlist,
                &a0, &shape, &mode, &minlag, &maxlag, &lagstep)) {
        return NULL;
    }

(But I still think you should avoid using default values for maxlag like this.)

so what do you recommend?

I am not sure.

    #define HAS_MAXLAG 1
    #define HAS_MINLAG 2
    #define HAS_LAGSTEP 4

    int mode = 0;
    int flags=0;
    npy_intp maxlag, minlag, lagstep;
    PyObject *tmp;
    static char *kwlist[] = {"a", "v", "mode", "minlag", "maxlag", "lagstep", NULL};

    tmp = PyDict_GetItemString(kwds, "maxlag");
    if (tmp != NULL) flags |= HAS_MAXLAG;
    Py_XDECREF(tmp);

    tmp = PyDict_GetItemString(kwds, "minlag");
    if (tmp != NULL) flags |= HAS_MINLAG;
    Py_XDECREF(tmp);

    tmp = PyDict_GetItemString(kwds, "lagstep");
    if (tmp != NULL) flags |= HAS_LAGSTEP;
    Py_XDECREF(tmp);

    if (!PyArg_ParseTupleAndKeywords(args, kwds, "OO|innn", kwlist,
                &a0, &shape, &mode, &minlag, &maxlag, &lagstep)) {
        return NULL;
    }

where do the #define's go?

Just ignore it. You have a layer of Python between the C function and the user. Set the fag there and parse it as an int.

That is already taken care of.  The python code that I have written only ever calls this C function with values included for maxlag etc.  What I was trying to deal with is the possibility that at some point someone else writes a python function in numpy that doesn't use these optional arguments when calling the C function.  Should I just assume that they will do their due diligence and not do that?

Then just give them default values which retains the current behaviour and do not break backwards compatibility.
What would that be? Perhaps -NPY_MAX_INTP for minlag and NPY_MAX_INTP for maxlag? (I haven't checked your code, so I'm not sure.)

I don't quite understand what you are saying.  Is it possible to talk on skype or something similar? Is that against protocol here?

will this be implemented in scipy.fftconvolve, too?  Would it just be truncation of the output in that case?  Eventually we'd like to include fftconvolve functionality inside convolve/correlate:  https://github.com/scipy/scipy/issues/2651

lag modes would have to be independently implemented in scipy.fftconvolve.  My original intention was to include the fft option in numpy.correlate, but it has taken too long to get the lag mode into numpy.correlate altogether that i don’t really have time any more.  lag modes could either truncate fft convolve output or could be used as an alternative.  performance tradeoffs between using lag modes and fft depend on the lengths of the vectors being convolved and the number of lags of interest.

On Nov 9, 2015, at 10:39 PM, endolith<EMAIL_ADDRESS>wrote:
will this be implemented in scipy.fftconvolve, too? Would it just be truncation of the output in that case? Eventually we'd like to include fftconvolve functionality inside convolve/correlate: #2651 https://github.com/scipy/scipy/issues/2651
—
Reply to this email directly or view it on GitHub https://github.com/scipy/scipy/issues/4940#issuecomment-155274610.

yes, the goal of https://github.com/scipy/scipy/issues/2651 would be to have a method= with 'auto' as default that would choose whichever implementation works best for the input types and sizes.

Since this discussion is related to scipy.signal functionality let's keep it open, but current discussion/review is ongoing in gh-5978. Once that PR is merged, let's come back to this one - we'd like the API addition in the exact same format as will be added to numpy I'd think.

Just wanted to +1 this.

This is also related to a stalled NumPy PR, for some reason also numbered 5978.
https://github.com/numpy/numpy/pull/5978


Bring back Pantheon Greeter

Due to #29, we had to ditch Pantheon Greeter in favor of LightDM GTK Greeter. However, now that we have more up-to-date packages its time we moved back to Pantheon Greeter for f37+.

Hm, we're encountering the same issues as before. Clearly something is missing. 🤔


"Identity or token does not match" even if a correct enrolment ID/secret is used.

Description

REST API call to /registrar returns an error  which says "Identity or token does not match" even if a correct enrolment ID/secret is used.
Describe How to Reproduce

An easy way to reproduce:

set up a blockchain network with multiple (e.g., four) validating peers, with security enabled.
access one peer's /registrar as an enrolment ID/secret (e.g., test_user0)
access another peer's /registrar using the same enrolment ID/secret (e.g., test_user0)
then the second attempt fails with the error mentioned above.

Is this intended by design? A problem is there seems to be no way to allow the user to access to validating peers, or switch from one to another.
In addition, the same problem seems to occur when a validating peer crashes and rebooted. The enrolment ID that was used before can never be used.

Hi @sachikoy,
The enrollmentID and enrollmentSecret pair that is used to perform the enrollment with the membership service server is indeed a one-time-use set of credentials. Once you have performed the enrollment one time on one peer, it will fail on subsequent enrollments. This is elaborated on here:
https://github.com/hyperledger/fabric/blob/master/docs/API/SandboxSetup.md#note-on-security-functionality
If you must you send your transaction to one of the other peer IP addresses, not the original peer IP that performed the user enrollment, that second peer will not have the appropriate user cert/tokens to transact. The current approach to transacting through multiple peers was to configure the application and peer nodes to replicate the location of the stored crypto among themselves. This was the approach that was discussed quite some time ago. @adecaro and @elli-androulaki, I assume that is still the suggested approach at this time?
Though I appreciate you bringing this issue back up to our attention as we need to document a more straight forward way of actually going through the procedure above.

Hi @angrbrd
So I think the current design assumes that when a user performed enrolment on one peer, the peer is trusted by the user, and maintains the security tokens (especially the private key of Ecert) for the user, retrieve Tcerts and sign transaction using the Tcert keys.
But on the other hand, when one access the REST API, he can easily impersonate another user by specifying the enrolment ID in the REST request.
I raised the issue before. https://github.com/hyperledger/fabric/issues/1459
I still cannot understand what is the best practice for using the REST API with security.

@sachikoy The REST API is not secure.  You should use the new node SDK API.  This will keep the ecert's private key in the local KeyValStore, which means it doesn't matter which peer you connect to.  See fabric/sdk/node/README.md for more info.

`
kishan@kishan-Inspiron-3542:~/composer-sample-app/scripts$ rm -rf node_modules && npm cache clean && npm install

<EMAIL_ADDRESS>preinstall /home/kishan/composer-sample-app

composer --version || { echo 'Please first run npm install -g composer-cli'; exit 1;}

composer-cli                   v0.7.2
composer-admin                 v0.7.2
composer-client                v0.7.2
composer-common                v0.7.2
composer-runtime-hlf           v0.7.2

<EMAIL_ADDRESS>install /home/kishan/composer-sample-app

scripts/download-hyperledger.sh && scripts/start-hyperledger.sh && npm run deployNetwork

Grab the current directory.
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )/.." && pwd )"
cd "$( dirname "${BASH_SOURCE[0]}" )/.." && pwd
dirname "${BASH_SOURCE[0]}"
Shut down the Docker containers that might be currently running.
cd "${DIR}"/scripts
docker-compose kill && docker-compose down
Killing scripts_membersrvc_1 ... done
Removing scripts_vp0_1 ... done
Removing scripts_membersrvc_1 ... done
TODO change this to alter the default profile which is, by convention, a local running hyperledger fabric
rm -rf ~/.composer-connection-profiles/defaultProfile/*
rm -rf ~/.composer-credentials/*
delete all existing containers and images
This is not used in general usage but this might
#read -p "Press y to delete all docker containers images" -n 1 -r
#echo    # (optional) move to a new line
#if [[ $REPLY =~ ^[Yy]$ ]]
#then
docker rm $(docker ps -a -q) -f
docker rmi $(docker images -q) -f
#fi
Pull and tag the latest Hyperledger Fabric base image.
docker pull hyperledger/fabric-baseimage:x86_64-0.1.0
x86_64-0.1.0: Pulling from hyperledger/fabric-baseimage
Digest: sha256:ac6a2784cfd028ae62f5688f4436f95d7a60eeacd8506eb303c9c6335328c388
Status: Image is up to date for hyperledger/fabric-baseimage:x86_64-0.1.0
docker tag hyperledger/fabric-baseimage:x86_64-0.1.0 hyperledger/fabric-baseimage:latest
Grab the current directorydirectory.
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )/.." && pwd )"
cd "$( dirname "${BASH_SOURCE[0]}" )/.." && pwd
dirname "${BASH_SOURCE[0]}"

cd "${DIR}"/scripts
Start up the Hyperledger Fabric
docker-compose up -d --build
Creating scripts_membersrvc_1 ...
Creating scripts_membersrvc_1 ... done
Creating scripts_vp0_1 ...
Creating scripts_vp0_1 ... done
Wait for the Hyperledger Fabric to start.
while ! nc localhost 7051 </dev/null; do sleep 1; done
while ! nc localhost 7053 </dev/null; do sleep 1; done
while ! nc localhost 7054 </dev/null; do sleep 1; done
sleep 5

<EMAIL_ADDRESS>deployNetwork /home/kishan/composer-sample-app

composer archive create --archiveFile digitalproperty-network.bna --sourceType module --sourceName digitalproperty-network && composer network deploy --archiveFile  digitalproperty-network.bna  --enrollId admin --enrollSecret Xurw3yU9zI0l

Creating Business Network Archive
Node module search path :
undefined
Not found in main node_module search path, trying current directory :/home/kishan/composer-sample-app/node_modules/digitalproperty-network
Looking for package.json of Business Network Definition in /home/kishan/composer-sample-app/node_modules/digitalproperty-network
Found:
Description:Digital Property Network
Name:digitalproperty-network
<EMAIL_ADDRESS>Written Business Network Definition Archive file to digitalproperty-network.bna
Command completed successfully.
Command succeeded
Deploying business network from archive: digitalproperty-network.bna
Business network definition:
Identifier<EMAIL_ADDRESS>
Description: Digital Property Network

events.js:160
  throw er; // Unhandled 'error' event

  ^

Error
at ClientDuplexStream._emitStatusIfDone (/home/kishan/.nvm/versions/node/v6.10.3/lib/node_modules/composer-cli/node_modules/grpc/src/node/src/client.js:189:19)

at ClientDuplexStream._readsDone (/home/kishan/.nvm/versions/node/v6.10.3/lib/node_modules/composer-cli/node_modules/grpc/src/node/src/client.js:158:8)

at readCallback (/home/kishan/.nvm/versions/node/v6.10.3/lib/node_modules/composer-cli/node_modules/grpc/src/node/src/client.js:217:12)

npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR<EMAIL_ADDRESS>deployNetwork: composer archive create --archiveFile digitalproperty-network.bna --sourceType module --sourceName digitalproperty-network && composer network deploy --archiveFile  digitalproperty-network.bna  --enrollId admin --enrollSecret Xurw3yU9zI0l
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the<EMAIL_ADDRESS>deployNetwork script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
npm ERR!  Exit status 1
npm ERR!
npm ERR! Failed at the<EMAIL_ADDRESS>install script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
npm ERR! A complete log of this run can be found in:
npm ERR!     /home/kishan/.npm/_logs/2017-05-23T09_10_01_589Z-debug.log
`

@angrbrd @sachikoy
I am also getting the same error(dentity or token does not match) even though I am using correct enrollID and enrollSecret. I have gone through all the discussion here and also https://github.com/hyperledger-archives/fabric/issues/2004, but I am not able to figure out how to rectify this.
You can see the error https://gist.github.com/kishansag/42449916f431827e0c70650bb62014b4.
Also @angrbrd https://github.com/hyperledger/fabric/blob/master/docs/API/SandboxSetup.md#note-on-security-functionality link does not exist.


Pulumit tailscale contacts tailscale service without a reason

What happened?
Seems that tailscale provider contacts tailscale even if there is no need to. That means no "refresh". It validates tokens, even if in theory those should not be in use.
The use case is important if pulumi controls full dependency tree and not everyone have access to  all admin keys. Right now the only workaround is to call pulumi with --target.
Example
Running:
TAILSCALE_API_KEY=tskey-api-abc  pulumi --cwd infrastructure/pulumi --stack "production" up --diff

with simple resource:
tailscale.Acl(
        "tailscale-acl",
        acl=tailscale_acl_path.read_text(),
        opts=p.ResourceOptions(protect=True),
    )

Causes tailscale provider to contact tailscale service. At least it fails with:
API token invalid (401)

and while the key is invalid, the provider should never need to know about it, because it was not told to refresh the state.
I would expect tailscale provider validate the pulumi state only and work kind of "offline" if  nothing changed.
Output of pulumi about
pulumi output:
CLI
Version      3.106.0
Go Version   go1.22.0
Go Compiler  gc

Host
OS       debian
Version  trixie/sid
Arch     x86_64

Additional context
pulumi plugin ls | grep tailscale                                                    0.315s (deploy) 11:40
tailscale     resource  0.15.0   39 MB   1 day ago     36 seconds ago
tailscale     resource  0.14.0   39 MB   1 week ago    36 seconds ago
tailscale     resource  0.13.4   38 MB   4 weeks ago   36 seconds ago

Contributing
Vote on this issue by adding a 👍 reaction.
To contribute a fix for this issue, leave a comment (and link to your pull request, if you've opened one already).

Hi @nierob. This is pretty common behavior for cloud providers. In your specific scenario, tailscale/terraform-provider-tailscale (which this provider is based on) validates that the ACL is valid as part of deciding if an action should be taken. This requires a valid token.

Hi @nierob. This is pretty common behavior for cloud providers. In your specific scenario, tailscale/terraform-provider-tailscale (which this provider is based on) validates that the ACL is valid as part of deciding if an action should be taken. This requires a valid token.

But that is the point, as long pulumi state is the only source of information, ACL validation is influential. I could understand the behavior if I would call pulumi up --refresh, then sure ACL needs to be validated and generally the service needs to be contacted, but it happens without the refresh flag.

I agree in spirit, however this provider is based on a provider authored by tailscale, so my bias is to respect what they do. They are the authority in their product.
If they change where ACL validation happens, we will follow their lead.

Ok, I will try to bring it there.


[mixed time-series]can not add chart to the dashboard

See video for repro steps and error.
https://user-images.githubusercontent.com/67837651/126843874-76f6da5d-d067-409a-9a46-37a6c5140897.mov

@villebro 🙏

I am unable to reproduce at the latest mater branch.
https://user-images.githubusercontent.com/2016594/127093000-358d4e92-0244-43ae-8e94-98ac72bd0fda.mov

I am also not able to repro (did the exact same steps as in the recording). Did "See more" on the error message say anything of value?

https://user-images.githubusercontent.com/67837651/127339692-597d7c00-7f6f-49e1-bf3e-b61cceef2fde.mov
still seeing the error from my end :(

@junlincc what feature flags are you running with? And also just to make sure, have you reset docker and pulled the master branch?

I tried this with the main flags we're testing (ENABLE_EXPLORE_DRAG_AND_DROP, DASHBOARD_NATIVE_FILTERS, and DASHBOARD_CROSS_FILTERS ) and was unable to reproduce. Added in DASHBOARD_NATIVE_FILTERS_SET and DASHBOARD_FILTERS_EXPERIMENTAL as @junlincc pictured, and still couldn't reproduce. Tempted to close this one.

I'm getting this error in 1.3.0 with async and cache on. I didn't seeing anything in CHANGELOG.md about a fix pertaining to this, but have not tested on master yet.
I'm noticing flip-flopping API calls to 2 different endpoints to get the chart data. It seems to only be affecting this mixed time-series chart from what I've tested so far.
It will make a call using the /api/v1/chart/data?form_data={{sliceID}} endpoint
This succeeds. It returns an object with result property and then the data for the chart

It also makes a call using the /api/v1/chart/{{sliceID}} endpoint
This one fails. It returns an object that has a result property, but doesn't contain the data needed.

@rwspielman @junlincc Any updates for this issue? I experiencing similar issue. #16834


HTML output of input with frontmatter strip first newline in first paragraph

I have markdown files with frontmatter that I convert to HTML using to_html_with_options.  If the first item after the frontmatter is a paragraph, there's a missing newline in the HTML output.
Here's a failing test to show what I mean:
#[test]
fn to_html() {
    let opt: Options = Default::default();
    let opt_with_frontmatter = Options {
        parse: ParseOptions {
            constructs: Constructs {
                frontmatter: true,
                ..Default::default()
            },
            ..Default::default()
        },
        compile: Default::default(),
    };

    let input = "one.\ntwo.\nthree.\nfour.";
    let output = to_html_with_options(&input, &opt).unwrap();
    assert_eq!(output, "
one.\ntwo.\nthree.\nfour.
"); // No frontmatter. This passes.

    let output = to_html_with_options(&input, &opt_with_frontmatter).unwrap();
    assert_eq!(output, "
one.\ntwo.\nthree.\nfour.
"); // Frontmatter in config but not in the markdown. This passes.

    let input = "---\nnumber: 0\n---\none.\ntwo.\nthree.\nfour.";
    let output = to_html_with_options(&input, &opt_with_frontmatter).unwrap();
    assert_eq!(output, "
one.\ntwo.\nthree.\nfour.
"); // This fails 💥
}

which outputs
---- test::to_html stdout ----
thread 'test::to_html' panicked at src/lib.rs:190:9:
assertion `left == right` failed
  left: "
one.two.\nthree.\nfour.
"
 right: "
one.\ntwo.\nthree.\nfour.
"
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

The test was ran on 4ad5342156cf5f5256fc452c4583be99a3e80412.

Interesting, PR welcome!


fix: Resolve schedule inconsistencies with master spreadsheet

We're still waiting on some information about the opening ceremony.

Add check in close/ late registration close

Fix walk-in registration time end to before the opening ceremony

Why is the closing ceremony on Saturday

Remove snacks

Debrief is not a social

Also in speakers tab there are 2 cards of the same speaker

📝 Changed routes:

/calendar

(view full size)

Commit d72c966b8fe33176222f0dd3507a974cd861c454 (https://hackportal-hackutd-oxz4e2ckr-acmutd.vercel.app).

Opening ceremony only 30 mins?

Also, 2x speaker bug reintroduced


Moving api_management(7) resources to v1beta1 version

api_management 7

[ ]  azurerm_api_management_api_tag_description
[ ]  azurerm_api_management_gateway_api
[ ]  azurerm_api_management_gateway_certificate_authority
[ ]  azurerm_api_management_gateway_host_name_configuration
[ ]  azurerm_api_management_global_schema
[ ]  azurerm_api_management_group_user
[ ]  azurerm_api_management_product_tag

azurerm_api_management_api_tag_description fails with incorrect id (config is IdentifyFromProvider)
    apiTagId: /subscriptions/038f2b7c-3265-43b8-8624-c9ad5da610a8/resourceGroups/apitagdescription-rg/providers/Microsoft.ApiManagement/service/apitagdescription-mngmnt/tags/apitagdescription-tag
cannot run refresh: refresh failed: ID was missing the
      `apis` element:


Backport istioctl experimental analyze into 1.3

This PR backports istioctl experimental analyze into 1.3.
Notes from an email thread by @ozevren :

The change is introducing a new command to istioctl for analyzing Istio configuration. It can be pointed to on-disk config, or in-cluster config. It can also do a combination of both so that user can see what will be the result of applying the config to the cluster. It doesn't change the behavior of any of the existing functions. We want to get this in, so that we can get early user feedback.
The implementation will mainly consist of libraries that are currently hosted in Galley and are used to implement a new code-path in Galley that is turned-off by default in 1.3. The new code is segregated from the current/active code pretty well, so it is easy to spot any changes that might accidentally change Galley behavior  (there is only one touchpoint between them, and that is where the flag enables the code).
The PRs that will need to land for this will, touch 3 main places:

Changes to the NEW core framework code in Galley that is off-by-default, hidden behind a flag. These are being changed, to make necessary changes to create the analysis framework.
Addition of code for new analysis rules. This is completely new code.
Changes to the Istioctl: This will add a new command that will call directly into the core framework to run the analyzers. It will not change any existing commands.

This backports the following PRs into 1.3:

https://github.com/istio/istio/pull/16350
https://github.com/istio/istio/pull/16833
https://github.com/istio/istio/pull/16909
https://github.com/istio/istio/pull/17034
https://github.com/istio/istio/pull/17064
https://github.com/istio/istio/pull/17160
https://github.com/istio/istio/pull/17192
https://github.com/istio/istio/pull/17214
https://github.com/istio/istio/pull/17243

In addition, there are a couple of minor patch commits that:

Backport a helper function that didn't make the 1.3 cutoff. (Backporting the entire PR that included it would be excessive).
Disable part of one analyzer that doesn't yet provide a good user experience and needs more iteration.

[X] Configuration Infrastructure
[ ] Docs
[ ] Installation
[ ] Networking
[ ] Performance and Scalability
[ ] Policies and Telemetry
[ ] Security
[ ] Test and Release
[X] User Experience
[ ] Developer Infrastructure

@sushicw: The following test failed, say /retest to rerun them all:

Test name
Commit
Details
Rerun command

lint_istio_release-1.3
19af57f1f3990b76ca1b747983ad4a80e2dd4d5b
link
/test lint

Instructions for interacting with me using PR comments are available here.  If you have questions or suggestions related to my behavior, please file an issue against the kubernetes/test-infra repository. I understand the commands that are listed here.

@sushicw: The following tests failed, say /retest to rerun them all:

Test name
Commit
Details
Rerun command

lint_istio_release-1.3
19af57f1f3990b76ca1b747983ad4a80e2dd4d5b
link
/test lint

unit-tests_istio_release-1.3
19af57f1f3990b76ca1b747983ad4a80e2dd4d5b
link
/test unit-tests

Instructions for interacting with me using PR comments are available here.  If you have questions or suggestions related to my behavior, please file an issue against the kubernetes/test-infra repository. I understand the commands that are listed here.

@sushicw: The following tests failed, say /retest to rerun them all:

Test name
Commit
Details
Rerun command

lint_istio_release-1.3
19af57f1f3990b76ca1b747983ad4a80e2dd4d5b
link
/test lint

unit-tests_istio_release-1.3
19af57f1f3990b76ca1b747983ad4a80e2dd4d5b
link
/test unit-tests

racetest_istio_release-1.3
19af57f1f3990b76ca1b747983ad4a80e2dd4d5b
link
/test racetest

Instructions for interacting with me using PR comments are available here.  If you have questions or suggestions related to my behavior, please file an issue against the kubernetes/test-infra repository. I understand the commands that are listed here.

@sushicw: The following tests failed, say /retest to rerun them all:

Test name
Commit
Details
Rerun command

lint_istio_release-1.3
19af57f1f3990b76ca1b747983ad4a80e2dd4d5b
link
/test lint

unit-tests_istio_release-1.3
19af57f1f3990b76ca1b747983ad4a80e2dd4d5b
link
/test unit-tests

racetest_istio_release-1.3
19af57f1f3990b76ca1b747983ad4a80e2dd4d5b
link
/test racetest

codecov_istio_release-1.3
19af57f1f3990b76ca1b747983ad4a80e2dd4d5b
link
/test codecov

Instructions for interacting with me using PR comments are available here.  If you have questions or suggestions related to my behavior, please file an issue against the kubernetes/test-infra repository. I understand the commands that are listed here.

@sushicw: The following tests failed, say /retest to rerun them all:

Test name
Commit
Details
Rerun command

lint_istio_release-1.3
19af57f1f3990b76ca1b747983ad4a80e2dd4d5b
link
/test lint

unit-tests_istio_release-1.3
19af57f1f3990b76ca1b747983ad4a80e2dd4d5b
link
/test unit-tests

racetest_istio_release-1.3
19af57f1f3990b76ca1b747983ad4a80e2dd4d5b
link
/test racetest

codecov_istio_release-1.3
19af57f1f3990b76ca1b747983ad4a80e2dd4d5b
link
/test codecov

integ-mixer-k8s-tests_istio_release-1.3
19af57f1f3990b76ca1b747983ad4a80e2dd4d5b
link
/test integ-mixer-k8s-tests

Instructions for interacting with me using PR comments are available here.  If you have questions or suggestions related to my behavior, please file an issue against the kubernetes/test-infra repository. I understand the commands that are listed here.

@sushicw: The following tests failed, say /retest to rerun them all:

Test name
Commit
Details
Rerun command

lint_istio_release-1.3
19af57f1f3990b76ca1b747983ad4a80e2dd4d5b
link
/test lint

unit-tests_istio_release-1.3
19af57f1f3990b76ca1b747983ad4a80e2dd4d5b
link
/test unit-tests

racetest_istio_release-1.3
19af57f1f3990b76ca1b747983ad4a80e2dd4d5b
link
/test racetest

codecov_istio_release-1.3
19af57f1f3990b76ca1b747983ad4a80e2dd4d5b
link
/test codecov

integ-mixer-k8s-tests_istio_release-1.3
19af57f1f3990b76ca1b747983ad4a80e2dd4d5b
link
/test integ-mixer-k8s-tests

pilot-multicluster-e2e_istio_release-1.3
19af57f1f3990b76ca1b747983ad4a80e2dd4d5b
link
/test pilot-multicluster-e2e

Instructions for interacting with me using PR comments are available here.  If you have questions or suggestions related to my behavior, please file an issue against the kubernetes/test-infra repository. I understand the commands that are listed here.

Please fix the test failures. Those are not flakes:
FAIL	istio.io/istio/galley/pkg/config/analysis/analyzers	2.161s

etc.

@sushicw: The following tests failed, say /retest to rerun them all:

Test name
Commit
Details
Rerun command

unit-tests_istio_release-1.3
19af57f1f3990b76ca1b747983ad4a80e2dd4d5b
link
/test unit-tests

racetest_istio_release-1.3
19af57f1f3990b76ca1b747983ad4a80e2dd4d5b
link
/test racetest

codecov_istio_release-1.3
19af57f1f3990b76ca1b747983ad4a80e2dd4d5b
link
/test codecov

integ-mixer-k8s-tests_istio_release-1.3
19af57f1f3990b76ca1b747983ad4a80e2dd4d5b
link
/test integ-mixer-k8s-tests

pilot-multicluster-e2e_istio_release-1.3
19af57f1f3990b76ca1b747983ad4a80e2dd4d5b
link
/test pilot-multicluster-e2e

lint_istio_release-1.3
6c0fdf73b4907c46e34abf7bf416b6e0945b0b08
link
/test lint

Instructions for interacting with me using PR comments are available here.  If you have questions or suggestions related to my behavior, please file an issue against the kubernetes/test-infra repository. I understand the commands that are listed here.

@sushicw: The following tests failed, say /retest to rerun them all:

Test name
Commit
Details
Rerun command

codecov_istio_release-1.3
19af57f1f3990b76ca1b747983ad4a80e2dd4d5b
link
/test codecov

integ-mixer-k8s-tests_istio_release-1.3
19af57f1f3990b76ca1b747983ad4a80e2dd4d5b
link
/test integ-mixer-k8s-tests

pilot-multicluster-e2e_istio_release-1.3
19af57f1f3990b76ca1b747983ad4a80e2dd4d5b
link
/test pilot-multicluster-e2e

lint_istio_release-1.3
6c0fdf73b4907c46e34abf7bf416b6e0945b0b08
link
/test lint

racetest_istio_release-1.3
6c0fdf73b4907c46e34abf7bf416b6e0945b0b08
link
/test racetest

Instructions for interacting with me using PR comments are available here.  If you have questions or suggestions related to my behavior, please file an issue against the kubernetes/test-infra repository. I understand the commands that are listed here.

@sushicw please add at least one item into the 1.3.1 release note draft, if you haven't already.

Done.

@sushicw: The following tests failed, say /retest to rerun them all:

Test name
Commit
Details
Rerun command

codecov_istio_release-1.3
19af57f1f3990b76ca1b747983ad4a80e2dd4d5b
link
/test codecov

integ-mixer-k8s-tests_istio_release-1.3
19af57f1f3990b76ca1b747983ad4a80e2dd4d5b
link
/test integ-mixer-k8s-tests

pilot-multicluster-e2e_istio_release-1.3
19af57f1f3990b76ca1b747983ad4a80e2dd4d5b
link
/test pilot-multicluster-e2e

racetest_istio_release-1.3
6c0fdf73b4907c46e34abf7bf416b6e0945b0b08
link
/test racetest

lint_istio_release-1.3
8356ba254a9c60ebb0b3d297bb2cff5e5bfe959e
link
/test lint

Instructions for interacting with me using PR comments are available here.  If you have questions or suggestions related to my behavior, please file an issue against the kubernetes/test-infra repository. I understand the commands that are listed here.

@sushicw: The following tests failed, say /retest to rerun them all:

Test name
Commit
Details
Rerun command

pilot-multicluster-e2e_istio_release-1.3
19af57f1f3990b76ca1b747983ad4a80e2dd4d5b
link
/test pilot-multicluster-e2e

lint_istio_release-1.3
8356ba254a9c60ebb0b3d297bb2cff5e5bfe959e
link
/test lint

integ-mixer-k8s-tests_istio_release-1.3
8356ba254a9c60ebb0b3d297bb2cff5e5bfe959e
link
/test integ-mixer-k8s-tests

Instructions for interacting with me using PR comments are available here.  If you have questions or suggestions related to my behavior, please file an issue against the kubernetes/test-infra repository. I understand the commands that are listed here.

@sushicw: The following tests failed, say /retest to rerun them all:

Test name
Commit
Details
Rerun command

pilot-multicluster-e2e_istio_release-1.3
19af57f1f3990b76ca1b747983ad4a80e2dd4d5b
link
/test pilot-multicluster-e2e

integ-mixer-k8s-tests_istio_release-1.3
7d69ee6f1a6e29ddcb41f45ef8e8ea99cc3dfdaf
link
/test integ-mixer-k8s-tests

Instructions for interacting with me using PR comments are available here.  If you have questions or suggestions related to my behavior, please file an issue against the kubernetes/test-infra repository. I understand the commands that are listed here.


LOGIN page functionality

Thanks @Natgho. Please see my comment on https://github.com/Tijani-Dia/dj-tracker/pull/27.

A few thoughts/comments:

I think we may want to make the user test configurable. Currently, this uses staff_member_required but I suspect other use cases may arise; for example user_is_authenticated or user is in group 'x'.
This implementation assumes one has an authentication system in place (See notes on login_required decorator). If we continue this route, we'll need to document it somewhere and also update the configuration docs


Rework symbols of example collapse / expand and add a new menu

The symbols for example collapse / expand should be triangle right and triangle down.
Then we can use the elipse icon to implement a new menu that includes advanced actions on examples such as:

open in printbugger
directly start in debugger

Added a "debug" method and menu entry in 302b4f529b.
Adding SVG-based symbols will be a new feature in 0.7


i just need the hacktoberfest tshirt :)

The Pull Request resolves Issue #[Issue-Number]
Description:
A brief description about the addition or edits made.
Notes: Delete all the text including this!

The #[Issue-Number] should be replaced with the specific Issue being referenced.

This won't work, buddy. Please be genuine.


Class injection on subclass causes build failure

Versions affected
4.3.0
Description
Replacing a subclass DataObject via injection will cause a build error.
The generation of a table for a DataObject occurs in the following steps in SilverStripe\ORM\DatabaseAdmin->doBuild:

All tables are identified by ClassInfo::subclassesFor(DataObject::class);
Code singleton($dataClass) generates a singleton based on each subclass. This will call the injector and return the injected class.
Replacement subclass table will be generated, original subclass table is not generated.

An error occurs in SilverStripe\ORM\DatabaseAdmin->updateLegacyClassNames

updateLegacyClassNames is called for all subclasses using ClassInfo::subclassesFor(DataObject::class);
updateLegacyClassNames calls DataObject::get()  with the subclass name, which is chained with count(). This executes a query on the original subclass table name.
Subclass table does not exist, causing the query to fail.

Steps to Reproduce

Start a new project
Create a DataObject BaseClass with database fields
Create a DataObject ExtendedClass with database fields
Create a DataObject InjectedClass with database fields
Add an Injector.yml

---
Name: AnInjector
After:
  - '#requestprocessors'
  - '#coresecurity'
---

SilverStripe\Core\Injector\Injector:
  ExtendedClass:
    class: InjectedClass

Run a dev/build
Result
Couldn't run query: SELECT DISTINCT count(DISTINCT "ExtendedClass"."ID") AS "Count" FROM "ExtendedClass" WHERE ("ExtendedClass"."ClassName" = ?)
Possible fix
Replacing
singleton($dataClass)
in SilverStripe\ORM\DatabaseAdmin->doBuild with
new $dataClass
ensures a table is generated for the replaced subclass. I am not that familiar with the conventions / code in the core so am not sure whether this would be sufficient.

I'd say Injector is the preferred way of getting an instance so it would rather be a fix at that end, not using new.

Does InjectedClass extend ExtendedClass?
What's the table_name configuration for your InjectedClass?
What's the rest of the error reported by your SQL engine?

It might be that the existing table_name is used because it's still checking configuration on ExtendedClass and not InjectedClass.

To be clear on what is going on:

the injector process in doBuild stops the table for ExtendedClass from being generated
the classname remapping process attempts to re-map the table for ExtendedClass

@ScopeyNZ

Occurs both when InjectedClass extends ExtendedClass and when it doesn't
I omitted table_name and namespaces in the reproduceable steps for simplicity, but have seen no difference in a project that uses both namespaces and table_name.
The table does not exist - Uncaught SilverStripe\ORM\Connect\DatabaseException: Couldn't run query: SELECT DISTINCT count(DISTINCT "ExtendedClass"."ID") AS "Count" FROM "ExtendedClass" WHERE ("ExtendedClass"."ClassName" = ?) 42S02-1146: Table 'ss_test.extendedclass' doesn't exist
It is unclear whether the fields or relations on the classes have any impact

Basic example for reproduction:
diff --git a/app/_config/Injector.yml b/app/_config/Injector.yml
new file mode 100644
index 0000000..c3e8688
--- /dev/null
+++ b/app/_config/Injector.yml
@@ -0,0 +1,10 @@
+---
+Name: AnInjector
+After:
+  - '#requestprocessors'
+  - '#coresecurity'
+---
+
+SilverStripe\Core\Injector\Injector:
+  ExtendedClass:
+    class: InjectedClass
diff --git a/app/src/DataObjects/BaseClass.php b/app/src/DataObjects/BaseClass.php
new file mode 100644
index 0000000..cc5da7b
--- /dev/null
+++ b/app/src/DataObjects/BaseClass.php
@@ -0,0 +1,18 @@
+<?php
+
+use SilverStripe\ORM\DataObject;
+
+class BaseClass extends DataObject
+{
+
+    private static $db = [
+        'Title'    => 'Varchar(255)',
+        'Content'  => 'HTMLText',
+        'LinkHref' => 'Varchar(255)',
+        'LinkText' => 'Varchar(255)',
+               'SortOrder' => 'Int'
+    ];
+
+    private static $default_sort = 'SortOrder';
+
+}
diff --git a/app/src/DataObjects/ExtendedClass.php b/app/src/DataObjects/ExtendedClass.php
new file mode 100644
index 0000000..bad2b27
--- /dev/null
+++ b/app/src/DataObjects/ExtendedClass.php
@@ -0,0 +1,14 @@
+<?php
+
+use SilverStripe\ORM\DataObject;
+
+class ExtendedClass extends DataObject
+{
+
+    private static $db = [
+        'Field'    => 'Varchar(255)'
+    ];
+
+    private static $default_sort = 'SortOrder';
+
+}
diff --git a/app/src/DataObjects/InjectedClass.php b/app/src/DataObjects/InjectedClass.php
new file mode 100644
index 0000000..f032b70
--- /dev/null
+++ b/app/src/DataObjects/InjectedClass.php
@@ -0,0 +1,14 @@
+<?php
+
+use SilverStripe\ORM\DataObject;
+
+class InjectedClass extends DataObject
+{
+
+    private static $db = [
+        'FieldTwo'    => 'Varchar(255)'
+    ];
+
+    private static $default_sort = 'SortOrder';
+
+}

Triaged as a bug - but it seems really low impact to me. Overriding a class like that instead of just using a DataExtension seems odd.

You'd need to build a brand new "replaces" config, so that the replacement class itself knew which class to replace.
Code which enumerated hierarchy (e.g. ClassInfo::ancestry()) would need to be rewritten to respect this, so that the parent/child pair (child replaces a parent in the hierarchy) only existed once (ideally, the replaced class).
Since the parent class is essentially ignored, you'd probably need to duplicate all configs (e.g. db / has_ones) in the subclass, since Config() uses uninherited search.
Long story short, supporting this is a huge amount of work and risk for little benefit. I would recommend extensions for any case this would otherwise be used.


fix inputs.version for shared create-clusters workflow

Looks like cut-rc + closed milestone does not pass correctly the github.event.inputs context as expected.
The inputs context of the called workflow should contain the version that forms part of the cluster name.

Thanks for fixing Tom!


Option to only generate new snapshots

Trying to add this into a pipeline process. I would like to add a step that creates and commits new snapshots as a discrete step to comparing snapshots. Is this possible as is or is this a feature request?

Hi @mildfuzz,
I'm afraid that I might have not understood your issue. From the docs:

When function is executed it has following side effects:

In absence of a previous snapshot file it converts pdf to an image, saves it as a snapshot and returns true
If there is a snapshot, then pdf is converted to an image and gets compared to the snapshot:

if they differ function returns false and creates next to the snapshot image two other versions with suffixes new and diff. new one is the current view of the pdf as an image, where diff shows the difference between the snapshot and new images
if they are equal function returns true and in case there are new and diff versions persisted it deletes them

Could you elaborate a bit more please?

Just to confirm: an option to run and fail a test in the absence of an existing snapshot instead of creating one will be sufficient, right?

Don't think so, would also need an option to do the reverse and only create new ones. Don't run tests.

Let's see if I understand this correctly after rereading your first post. 🤦
Some context:

There are existing tests with known snapshots.
A new test is added without a snapshot.
Meanwhile, a change to the code causes one of the tests from the first point to fail.

You want the ability to run tests so that all those with existing snapshots are skipped, meaning the test from the third point won't fail. At the same time, any new tests that were added, such as the one from the second point, should generate a new snapshot.
Then you want to run all the tests again, and they should behave as they do now.
Are we getting closer? 😅

Yeah, we're close. I think the language is difficult here, as you refer to producing new snapshots as tests, but that's not how I see it. They're more an initialisation step.

A step that ONLY produces new snapshots where required (for new tests). Does not fail snapshots that have changed (doesn't actually need to do any comparison, but this is an implementation detail)
A step that ONLY runs existing snapshots. Does not produce new one

As a stretch, it might be handy if the second step failed when it found missing snapshots, but this is not a requirement

A new optional prop snapshotMode could be added to the comparePdfToSnapshot compareImageOpts argument:
  snapshotMode?:
    | 'compare-snapshots-or-create-new-reference' // current behaviour
    | 'only-create-new-references' // A step that ONLY produces new snapshots where required (for new tests). Always returns `true`
    | 'compare-snapshots'  // A step that ONLY runs existing snapshots. When a reference is missing returns `true` without creating one.
    | 'compare-snapshots-fail-on-missing-reference' // A step that ONLY runs existing snapshots. When a reference is missing returns `false` without creating one.

A new optional property snapshotMode can be added to the comparePdfToSnapshot function's compareImageOpts argument:
snapshotMode?:
    | 'compare-snapshots-or-create-new-reference' // Current behaviour: compares existing snapshots or creates a new reference.
    | 'only-create-new-references' // Only creates new snapshots when required for new tests. Always returns `true`.
    | 'compare-snapshots' // Only runs existing snapshots. Returns `true` when a reference is missing without creating a new one.
    | 'compare-snapshots-fail-on-missing-reference' // Only runs existing snapshots. Returns `false` when a reference is missing without creating a new one.

snapshotMode?:
| 'compare-and-generate-reference' // Current behavior: compares existing snapshots or generates new references if missing.
| 'create-new-references-only' // Only creates new snapshots where required for new tests. Always returns true.
| 'compare-only' // Only compares existing snapshots. Returns true if a reference is missing but doesn't create a new one.
| 'compare-and-fail-on-missing' // Only compares existing snapshots. Returns false if a reference is missing, without creating a new one.

A new optional prop snapshotMode could be added to the comparePdfToSnapshot compareImageOpts argument:
snapshotMode?:
    | 'compare-or-generate-reference' // Default behaviour: compares existing snapshots or generates new references if missing.
    | 'create-new-references-only' // Only creates new snapshots where ones are missing. Always returns `true`.
    | 'compare-only' // Only compares existing snapshots. Returns `true` if a reference is missing but doesn't create a new one.
    | 'compare-and-fail-on-missing' // Only compares existing snapshots. Returns `false` if a reference is missing, without creating a new one.

I'm not sure how much value this will add. It shouldn't be that big of a cost to support, but it will add some complexity. I guess then it will be up to you to use for example some env variables to set that prop and achieve the behaviour that you desire.
Nevertheless I wonder, wouldn't you want during development, when adding new test to run them and review that the reference image generated is the one that you want and commit it together with the new test?

Sorry for not coming back to this sooner.
It's about being able to use this to catch changes during a release cycle. In a pipeline, Jenkins (or whatever you're using) would create a snapshot, presume it's truthiness and the stage will pass. The new snapshot would not be committed unless we added that to the stage and therefore, this stage would continue to pass until someone runs it locally and commits.
I actually think the creation of snapshots should not be the default, for the above reason, as it presumes a pass when no snapshots exist, but I be fine to just be able to turn this off in specific contexts.

Something like this?
https://github.com/moshensky/pdf-visual-diff/pull/60

I appreciate this has differed slightly from the original title, but I think this ACTUALLY is closer to what I need to make this safe.

Hi @mildfuzz, I have a look later today or tomorrow.

@mildfuzz I've left a couple of comments in the PR.

New functionality published under latest version: https://github.com/moshensky/pdf-visual-diff/blob/master/CHANGELOG.md#0120--2024-09-26


Update Expensify-Chat-Playbook-for-Conferences.md

Details

Minor grammar and format updates to Expensify Chat Playbook for Conferences
Fixed Issues

$
PROPOSAL:
Tests

[ ] Verify that no errors appear in the JS console

Offline tests

QA Steps

[ ] Verify that no errors appear in the JS console

PR Author Checklist

[ ] I linked the correct issue in the ### Fixed Issues section above
[ ] I wrote clear testing steps that cover the changes made in this PR

[ ] I added steps for local testing in the Tests section
[ ] I added steps for the expected offline behavior in the Offline steps section
[ ] I added steps for Staging and/or Production testing in the QA steps section
[ ] I added steps to cover failure scenarios (i.e. verify an input displays the correct error message if the entered data is not correct)
[ ] I turned off my network connection and tested it while offline to ensure it matches the expected behavior (i.e. verify the default avatar icon is displayed if app is offline)
[ ] I tested this PR with a High Traffic account against the staging or production API to ensure there are no regressions (e.g. long loading states that impact usability).

[ ] I included screenshots or videos for tests on all platforms
[ ] I ran the tests on all platforms & verified they passed on:

[ ] Android / native
[ ] Android / Chrome
[ ] iOS / native
[ ] iOS / Safari
[ ] MacOS / Chrome / Safari
[ ] MacOS / Desktop

[ ] I verified there are no console errors (if there's a console error not related to the PR, report it or open an issue for it to be fixed)
[ ] I followed proper code patterns (see Reviewing the code)

[ ] I verified that any callback methods that were added or modified are named for what the method does and never what callback they handle (i.e. toggleReport and not onIconClick)
[ ] I verified that the left part of a conditional rendering a React component is a boolean and NOT a string, e.g. myBool && <MyComponent />.
[ ] I verified that comments were added to code that is not self explanatory
[ ] I verified that any new or modified comments were clear, correct English, and explained "why" the code was doing something instead of only explaining "what" the code was doing.
[ ] I verified any copy / text shown in the product is localized by adding it to src/languages/* files and using the translation method

[ ] If any non-english text was added/modified, I verified the translation was requested/reviewed in #expensify-open-source and it was approved by an internal Expensify engineer. Link to Slack message:

[ ] I verified all numbers, amounts, dates and phone numbers shown in the product are using the localization methods
[ ] I verified any copy / text that was added to the app is grammatically correct in English. It adheres to proper capitalization guidelines (note: only the first word of header/labels should be capitalized), and is approved by marketing by adding the Waiting for Copy label for a copy review on the original GH to get the correct copy.
[ ] I verified proper file naming conventions were followed for any new files or renamed files. All non-platform specific files are named after what they export and are not named "index.js". All platform-specific files are named for the platform the code supports as outlined in the README.
[ ] I verified the JSDocs style guidelines (in STYLE.md) were followed

[ ] If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
[ ] I followed the guidelines as stated in the Review Guidelines
[ ] I tested other components that can be impacted by my changes (i.e. if the PR modifies a shared library or component like Avatar, I verified the components using Avatar are working as expected)
[ ] I verified all code is DRY (the PR doesn't include any logic written more than once, with the exception of tests)
[ ] I verified any variables that can be defined as constants (ie. in CONST.js or at the top of the file that uses the constant) are defined as such
[ ] I verified that if a function's arguments changed that all usages have also been updated correctly
[ ] If a new component is created I verified that:

[ ] A similar component doesn't exist in the codebase
[ ] All props are defined accurately and each prop has a /** comment above it */
[ ] The file is named correctly
[ ] The component has a clear name that is non-ambiguous and the purpose of the component can be inferred from the name alone
[ ] The only data being stored in the state is data necessary for rendering and nothing else
[ ] If we are not using the full Onyx data that we loaded, I've added the proper selector in order to ensure the component only re-renders when the data it is using changes
[ ] For Class Components, any internal methods passed to components event handlers are bound to this properly so there are no scoping issues (i.e. for onClick={this.submit} the method this.submit should be bound to this in the constructor)
[ ] Any internal methods bound to this are necessary to be bound (i.e. avoid this.submit = this.submit.bind(this); if this.submit is never passed to a component event handler like onClick)
[ ] All JSX used for rendering exists in the render method
[ ] The component has the minimum amount of code necessary for its purpose, and it is broken down into smaller components in order to separate concerns and functions

[ ] If any new file was added I verified that:

[ ] The file has a description of what it does and/or why is needed at the top of the file if the code is not self explanatory

[ ] If a new CSS style is added I verified that:

[ ] A similar style doesn't already exist
[ ] The style can't be created with an existing StyleUtils function (i.e. StyleUtils.getBackgroundAndBorderStyle(themeColors.componentBG))

[ ] If the PR modifies code that runs when editing or sending messages, I tested and verified there is no unexpected behavior for all supported markdown - URLs, single line code, code blocks, quotes, headings, bold, strikethrough, and italic.
[ ] If the PR modifies a generic component, I tested and verified that those changes do not break usages of that component in the rest of the App (i.e. if a shared library or component like Avatar is modified, I verified that Avatar is working as expected in all cases)
[ ] If the PR modifies a component related to any of the existing Storybook stories, I tested and verified all stories for that component are still working as expected.
[ ] If a new page is added, I verified it's using the ScrollView component to make it scrollable when more elements are added to the page.
[ ] If the main branch was merged into this PR after a review, I tested again and verified the outcome was still expected according to the Test steps.
[ ] I have checked off every checkbox in the PR author checklist, including those that don't apply to this PR.

Screenshots/Videos

Web

Mobile Web - Chrome

Mobile Web - Safari

Desktop

iOS

Android

@MonilBhavsar there were a ton of checks listed in the PR template, but for minor copy updates I didn't think much was needed. Let me know if anything is absolutely necessary and I'm happy to do that!

@jamesdeanexpensify we need to do that anyways to pass the checks. You can simply check everything and mark N/A for screenshots.

Looks like you also need to sign the CLA -
You can comment recheck and then
I have read the CLA Document and I hereby sign the CLA

RE: You can simply check everything and mark N/A for screenshots.
Do you know where I would find the items to check again? Sorry!

I updated all the op, please check it all and feel free to add N/A to screenshots. I'll test on dev though.
Also, looks like we conflicts to resolve

recheck

I have read the CLA Document and I hereby sign the CLA

Thanks for the help @MonilBhavsar! Did I....do everything right now? Damn, that's a lot of work for a few text/grammar updates haha. Is this the only process we have right now for minor updates like these? I feel like it could be much easier.

Reviewer Checklist

[ ] I have verified the author checklist is complete (all boxes are checked off).
[ ] I verified the correct issue is linked in the ### Fixed Issues section above
[ ] I verified testing steps are clear and they cover the changes made in this PR

[ ] I verified the steps for local testing are in the Tests section
[ ] I verified the steps for Staging and/or Production testing are in the QA steps section
[ ] I verified the steps cover any possible failure scenarios (i.e. verify an input displays the correct error message if the entered data is not correct)
[ ] I turned off my network connection and tested it while offline to ensure it matches the expected behavior (i.e. verify the default avatar icon is displayed if app is offline)

[ ] I checked that screenshots or videos are included for tests on all platforms
[ ] I included screenshots or videos for tests on all platforms
[ ] I verified tests pass on all platforms & I tested again on:

[ ] Android / native
[ ] Android / Chrome
[ ] iOS / native
[ ] iOS / Safari
[ ] MacOS / Chrome / Safari
[ ] MacOS / Desktop

[ ] If there are any errors in the console that are unrelated to this PR, I either fixed them (preferred) or linked to where I reported them in Slack
[ ] I verified proper code patterns were followed (see Reviewing the code)

[ ] I verified that any callback methods that were added or modified are named for what the method does and never what callback they handle (i.e. toggleReport and not onIconClick).
[ ] I verified that the left part of a conditional rendering a React component is a boolean and NOT a string, e.g. myBool && <MyComponent />.
[ ] I verified that comments were added to code that is not self explanatory
[ ] I verified that any new or modified comments were clear, correct English, and explained "why" the code was doing something instead of only explaining "what" the code was doing.
[ ] I verified any copy / text shown in the product is localized by adding it to src/languages/* files and using the translation method
[ ] I verified all numbers, amounts, dates and phone numbers shown in the product are using the localization methods
[ ] I verified any copy / text that was added to the app is grammatically correct in English. It adheres to proper capitalization guidelines (note: only the first word of header/labels should be capitalized), and is approved by marketing by adding the Waiting for Copy label for a copy review on the original GH to get the correct copy.
[ ] I verified proper file naming conventions were followed for any new files or renamed files. All non-platform specific files are named after what they export and are not named "index.js". All platform-specific files are named for the platform the code supports as outlined in the README.
[ ] I verified the JSDocs style guidelines (in STYLE.md) were followed

[ ] If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
[ ] I verified that this PR follows the guidelines as stated in the Review Guidelines
[ ] I verified other components that can be impacted by these changes have been tested, and I retested again (i.e. if the PR modifies a shared library or component like Avatar, I verified the components using Avatar have been tested & I retested again)
[ ] I verified all code is DRY (the PR doesn't include any logic written more than once, with the exception of tests)
[ ] I verified any variables that can be defined as constants (ie. in CONST.js or at the top of the file that uses the constant) are defined as such
[ ] If a new component is created I verified that:

[ ] A similar component doesn't exist in the codebase
[ ] All props are defined accurately and each prop has a /** comment above it */
[ ] The file is named correctly
[ ] The component has a clear name that is non-ambiguous and the purpose of the component can be inferred from the name alone
[ ] The only data being stored in the state is data necessary for rendering and nothing else
[ ] For Class Components, any internal methods passed to components event handlers are bound to this properly so there are no scoping issues (i.e. for onClick={this.submit} the method this.submit should be bound to this in the constructor)
[ ] Any internal methods bound to this are necessary to be bound (i.e. avoid this.submit = this.submit.bind(this); if this.submit is never passed to a component event handler like onClick)
[ ] All JSX used for rendering exists in the render method
[ ] The component has the minimum amount of code necessary for its purpose, and it is broken down into smaller components in order to separate concerns and functions

[ ] If any new file was added I verified that:

[ ] The file has a description of what it does and/or why is needed at the top of the file if the code is not self explanatory

[ ] If a new CSS style is added I verified that:

[ ] A similar style doesn't already exist
[ ] The style can't be created with an existing StyleUtils function (i.e. StyleUtils.getBackgroundAndBorderStyle(themeColors.componentBG)

[ ] If the PR modifies code that runs when editing or sending messages, I tested and verified there is no unexpected behavior for all supported markdown - URLs, single line code, code blocks, quotes, headings, bold, strikethrough, and italic.
[ ] If the PR modifies a generic component, I tested and verified that those changes do not break usages of that component in the rest of the App (i.e. if a shared library or component like Avatar is modified, I verified that Avatar is working as expected in all cases)
[ ] If the PR modifies a component related to any of the existing Storybook stories, I tested and verified all stories for that component are still working as expected.
[ ] If a new page is added, I verified it's using the ScrollView component to make it scrollable when more elements are added to the page.
[ ] If the main branch was merged into this PR after a review, I tested again and verified the outcome was still expected according to the Test steps.
[ ] I have checked off every checkbox in the PR reviewer checklist, including those that don't apply to this PR.

Screenshots/Videos

Web

Mobile Web - Chrome

Mobile Web - Safari

Desktop

iOS

Android

Did I....do everything right now?

Yes, looks good now! 😅

Damn, that's a lot of work for a few text/grammar updates haha. Is this the only process we have right now for minor updates like these? I feel like it could be much easier.

Yeah unfortunately I think it's the only process we have at the moment, agree it's a fair amount of overhead for copy updates

:hand: This PR was not deployed to staging yet because QA is ongoing. It will be automatically deployed to staging after the next production release.

🚀 Deployed to staging by https://github.com/amyevans in version: 1.3.44-0 🚀

platform
result

🤖 android 🤖
success ✅

🖥 desktop 🖥
success ✅

🍎 iOS 🍎
success ✅

🕸 web 🕸
success ✅


Yaw angle displaces turbine.

Dear community,
I am running a model with FASTFarm v3.5.0. on Windows 10. I want to visualize the transversal (y and z) flow in the wake of a wind turbine model (D=1.2m). It is a very simple model because all DOF are deactivated. Everything is working fine but when I change the yaw to something other than 0 my yawed turbine ends up in a different y-position (see picture). The y-position gets more off the higher the yaw and also changes direction with a negative yaw angle.
5deg NacYaw:

10deg NacYaw:

0 deg NacYaw:

WTM_D1d2_T1_6mps.txt .fst
WTM_D1d2_ElastoDyn_T1.txt .dat
WTM_D1d2_2T5D.txt .fstf
I don't understand where this is coming from.  I don't use Servodyn at all.
I would be very grateful for any help, I really don't know what else to do.
All the best,
Sara

Dear @lusoalman,
There have been several issues showing arising in FAST.Farm during the ongoing rework of the InflowWind module released in OpenFAST v3.5.  Hopefully these issues will be fixed with the release of upcoming release of OpenFAST v3.5.1.  Before then, can you rerun your model in FAST.Farm within OpenFAST v3.4 and verify the issue goes away?
Best regards,

Dear @jjonkman,
Thanks a lot for the reply! Unfortunately running it with v3.4 did not change anything.
It looks like the y-coordinate is somehow linked to the yaw angle... is there another possible origin for the unwanted shift?
Thank you and best regards,
Sara

Dear @lusoalman,
OK, thanks for checking FAST.Farm within OpenFAST v3.4.
I believe I now understand what the problem is.  I see that you are using DEFAULT settings for the horizontal wake-deflection correction parameters in FAST.Farm.  The DEFAULT values of C_HWkDfl_OY and C_HWkDfl_xY were calibrated for the NREL 5-MW baseline wind turbine, but your wind turbine is much smaller (presumably a model-scale wind turbine).  My guess is that these DEFAULT values are not valid at model scale, specifically the DEFAULT value of C_HWkDfl_OY = 0.3 m/deg.  I would suggest disabling the horizontal wake-deflection correction (by setting C_HWkDfl_O = C_HWkDfl_OY = C_HWkDfl_x = C_HWkDfl_xY = 0) or recalibrate the values for your model.
Best regards,

Dear @jjonkman,
I'm sorry for the late reply.
This did the trick!! Thank you so much. I would not have found it myself.
All the best,
Sara


Publish Build Artifact from Linux Agent

Question, Bug, or Feature?
Type: Feature
Enter Task Name: Publish build artifacts
Hi team,
at the time of this writing the Publish build artifacts task only supports Windows agents when used in the file share mode. Is there any plan to support the scenario also for Linux agents?

Is there any feedback on this feature request?
While I see the bot has closed due to lack of activity it would be nice to find out if it's something been considered?

Hi @Valks current implementation uses robocopy for file share as a target which is not supported on Linux - it will require some additional time to investigate acceptable solution for this platform.
We are working on more prioritized requests/features at the moment - so will be get back to this later to proceed on it further.


Emacs gets stuck in infinite loop when using Tab autocompletion

Hi,
I don't know how to properly report this bug but sometimes when I try to use autocomplete with tab in emacs, I lose access to my emacs session and I have to restart emacs. Is this a known bug? Is there some log file I should upload? I'm on Ubuntu 14.04, using the ppa.

I've also experienced this on occasion, but I've never been able to reproduce it. You haven't noticed anything that triggers this, have you?

My assumption is that it happens when the autocomplete is likely to yield a huge amount of answers, for example after typing one letter or accidentally hitting space before hitting tab. One other (possibly unrelated) thing that happens is that after a while in a Lean session, tab stops working and I have to restart.

This is a known problem which I was not able to fix completely. It'd be great if you can provide a way to reproduce the problem.

One other (possibly unrelated) thing that happens is that after a while in a Lean session, tab stops working and I have to restart.

This one can be quickly fixed by restarting the Lean server process. M-x lean-server-restart-process (or there's a shortcut that I don't remember off the top of my head, C-c C-r maybe?).

Unfortunately I have little experience in how to reproduce bugs, but I will try.

This one can be quickly fixed by restarting the Lean server process.

This is a relatively simple workaround but not a real fix..

Unfortunately I have little experience in how to reproduce bugs, but I will try.

Thanks!

When I do the restart lean process command I see a message "menu-bar Lean Restart lean process" in the minibuffer but it does not seem like anything is actually happening, how could I check that?

When I do the restart lean process command I see a message "menu-bar Lean Restart lean process" in the minibuffer but it does not seem like anything is actually happening, how could I check that?

That should be it. But in the background, you have a fresh Lean server process running.

Yes, I also experience this quite often. It usually happens to me after a while of work (and usually after a while of work it happens), but I haven't found something specific which triggers it. M-x lean-server-restart-process does fix it (but maybe you have to make 1 change in the file so that the current file is recompiled again).

Also run into this using Aquamacs on Mac OS X.

When autocompletion freezes for me, I can usually abort it via C-g (I
think?). It even completes on the second try most times.
On Tue, Jun 28, 2016, 4:52 AM Sean Leather<EMAIL_ADDRESS>wrote:

Also run into this using Aquamacs on Mac OS X.
—
You are receiving this because you are subscribed to this thread.
Reply to this email directly, view it on GitHub
https://github.com/leanprover/lean/issues/1079#issuecomment-229027105,
or mute the thread
https://github.com/notifications/unsubscribe/AAGqRnpy7c6yJ9gh_FZFjguVa1nv_4pnks5qQQrhgaJpZM4I_9VY
.

Yes I just noticed that actually.

--server option has been deleted from the lean3 branch. All lean-server-* emacs commands were also deleted. Autocompletion will be eventually reimplemented in the lean3 branch using a much simpler architecture suggested by Clément Pit.


comments & single line answer review, display & analysis process

Decision points on.

what needs to go through review process

what needs to be shown in the public comment listing page

What should be the visualisation

what needs to be submitted to ML for sentiment/tone analysis


AIR-MOT dataset

Can you give the unconverted AIR-MOT dataset file structure?

Can you share the air-mot dataset

For questions related to the AIR-MOT dataset, please consult the original author.
Some friends wanted to know my train-test split, so I showed the first frame of the testset I used:

How to get 46 test videos and 106 training videos from raw data ？