Added note concerning use of client stat option

It is extremely important that we highlight the danger of using the "allow clients to submit statistics" option.

Did you mean to add me as a reviewer or someone else?
Caroline
From: Brendan Vanous<EMAIL_ADDRESS>Sent: Tuesday, July 14, 2020 10:26 AM
To: MicrosoftDocs/playfab-docs<EMAIL_ADDRESS>Cc: Caroline Cai<EMAIL_ADDRESS>Review requested<EMAIL_ADDRESS>Subject: Re: [MicrosoftDocs/playfab-docs] Added note concerning use of client stat option (#111)
@bvanoushttps://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fbvanous&data=02|01|Caroline.Cai%40microsoft.com|8e11c3cd00554df017e208d8281af941|72f988bf86f141af91ab2d7cd011db47|1|0|637303443603015728&sdata=72dAqE38zwyf8vShSAEb4f4fnNfRMiYa1rGsBHI%2FNWg%3D&reserved=0 requested your review on: #111https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2FMicrosoftDocs%2Fplayfab-docs%2Fpull%2F111&data=02|01|Caroline.Cai%40microsoft.com|8e11c3cd00554df017e208d8281af941|72f988bf86f141af91ab2d7cd011db47|1|0|637303443603025682&sdata=qxjgS5%2BpjVC0lNBHrRfBEmJhlk5k%2Bg%2F1tqJePm7pvOg%3D&reserved=0 Added note concerning use of client stat option.
—
You are receiving this because your review was requested.
Reply to this email directly, view it on GitHubhttps://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2FMicrosoftDocs%2Fplayfab-docs%2Fpull%2F111%23event-3545171346&data=02|01|Caroline.Cai%40microsoft.com|8e11c3cd00554df017e208d8281af941|72f988bf86f141af91ab2d7cd011db47|1|0|637303443603025682&sdata=Gz9y1vtzYBpFG6Zn4Bae%2FOyuamGEuQmZ2AiHhlVdYcI%3D&reserved=0, or unsubscribehttps://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fnotifications%2Funsubscribe-auth%2FAFLE275WOLWUIMLGZZE57P3R3SIKNANCNFSM4OZXMNZA&data=02|01|Caroline.Cai%40microsoft.com|8e11c3cd00554df017e208d8281af941|72f988bf86f141af91ab2d7cd011db47|1|0|637303443603035637&sdata=bJ4%2F7ZpnecPz1RuSlfr6EEhMrojZrhHjKJGgCua6ULo%3D&reserved=0.

Did you mean to add me as a reviewer or someone else?

You. You're listed as a contributor, and you're one of the only PMs I see on this.


Proposal for switching to a Virtual Bus

INTRO
In many situations, within the verifiable computation paradigm, one is interested, say for example in the context of zkVMs, in whether a certain, global over the execution trace, algebraic relation holds.  To prove that this latter algebraic relation has been computed correctly, the prover can use the AIR (or more precisely the RAP) in order to compute the global relation via a sequence of local (i.e., transition) constraints applicable to some intermediate values. These values then become part of the execution trace even though they are artificial with respect to the original, say, zkVM execution trace. From the perspective of both the prover and verifier, the intermediate values' sole purpose is to witness the correct computation/enforcement of the local steps used in computing/enforcing the global relation/constraint. Unfortunately, this comes at the cost of extra data that the prover needs to commit to, which might be problematic considering that the commitment cost is, as of today, still the dominant cost in verifiable computation.
A second option is to use a protocol that is more tailored to the situation we have at hand, namely evaluating a (global) algebraic relation without any extra commitments (e.g., to the intermediate results of the computation) beyond those already required for the original trace. GKR is an interactive proof protocol for proving correct evaluation of a layered circuit [^1] and is the ideal candidate for solving our stated problem. This idea was used recently in Lasso, in order to enforce a Grand-Product argument, and variations of the same principle appear in earlier works (e.g., Quarks).
LogUp
Consider the LogUp lookup argument. This is a protocol for proving that a certain set $\lbrace w(x_i)\rbrace$ is a subset of another $\lbrace t(x_i)\rbrace$. In its most basic form it can be written as the following global algebraic relation
$$\sum_{x\in\mathbb{H}} \frac{m(x)}{\alpha + t(x)} = \sum_{x\in\mathbb{H}} \frac{f(x)}{\alpha + w(x)}$$
where:

$\mathbb{H}$ is a multiplicative cyclic group enumerating the rows of the trace of size $|\mathbb{H}| = n$.
$t(x)$ is the value at the "x-th" row of table $t$.
$m(x)$ is the number of times the value $t(x)$ appears in the vector $\lbrace w(x): x \in \mathbb{H}\rbrace$ i.e., the multiplicity.
$w(x)$ is the value at the "x-th" row of table $w$.
$f(x)$ is a binary flag table used to indicate whether or not value $w(x)$ should be "looked-up" in table $t$

Miden VM uses the concept of a bus in order to enforce the above constraint. More precisely, it defines an extra column $p$ with the following constraints:

$p(x_0) = p(x_{n-1}).$
$p^{}(x_i) = p(x_{i-1}) + \frac{m(x_{i-1})}{\alpha + t(x_{i-1})} - \frac{f(x_{i-1})}{\alpha + w(x_{i-1})}$.

Notice here the issue discussed in the introduction, namely that LogUp introduces an extra witness $p$ that is in a sense extrinsic to the original statement.
Multivariate formulation
To describe the GKR-based solution to the previous issue, we need to formulate the problem in the language of multivariate polynomials instead of uni-variate ones. More precisely, we viewed the columns of the execution trace as maps from $\mathbb{H}\rightarrow \mathbb{F}_q$ where $\mathbb{F}_q$ is the base field. In the multivariate formulation, we look at each column now as a map from $\lbrace 0, 1\rbrace^{\nu}\rightarrow\mathbb{F}_q$ where $\nu = log_2(n)$ assuming $n$ is a power of $2$.[^2]
The next thing we need to do is extend functions  $f: \lbrace0, 1\rbrace^{\nu}\rightarrow\mathbb{F}_q$ to functions in $\mathbb{F}_q^{\nu}\rightarrow\mathbb{F}_q$ and this is done using the concept of (unique) multi-linear extension (MLE) polynomial. This is the unique multi-linear polynomial $\tilde{f}$ in $\mathbb{F}_q[X_0,\dots, X_{\nu - 1}]$ such that for any $x:= (x_0,\dots, x_{\nu-1}) \in \lbrace0, 1\rbrace^{\nu}$ we have $\tilde{f}(x) = f(x)$. One can show[^3] that the multi-linear extension is unique and it is given[^4] by
$$\tilde{f}(x) := \sum_{y\in\lbrace 0, 1\rbrace^{\nu}} f(y)\cdot\mathsf{EQ}(x, y)$$
where
$$\mathsf{EQ}(x, y) := \prod_{i=0}^{\nu - 1}\left(x_i\cdot y_i + (1-x_i)\cdot(1- y_i)\right)$$
Using the new formalism, we can write our constraint as
$$\sum_{x\in\lbrace 0, 1\rbrace^{\nu}} \frac{\tilde{m}(x)}{\widetilde{\left(\alpha + t\right)}(x)} = \sum_{x\in\lbrace 0, 1\rbrace^{\nu}} \frac{\tilde{f}(x)}{\widetilde{\left(\alpha + w\right)}(x)}$$
which is equivalent to the previous identity by virtue of the extension property of the MLEs.
This can be further simplified by defining
$$p(x_0,\dots, x_{\nu}) := (1 - x_0)\cdot \tilde{m}(x_1,\dots ,x_{\nu}) + x_0\cdot\left(-\tilde{f}(x_1,\dots ,x_{\nu})\right)$$
and
$$q(x_0,\dots, x_{\nu}) := (1 - x_0)\cdot \widetilde{\left(\alpha + t\right)}(x_1,\dots ,x_{\nu}) + x_0\cdot\left(-\widetilde{\left(\alpha + w\right)}(x_1,\dots ,x_{\nu})\right)$$
which are again multi-linear polynomials. Our constraint thus becomes
$$\sum_{x\in\lbrace 0, 1\rbrace^{\nu + 1}} \frac{p(x)}{q(x)} = 0$$
The reason for introducing MLE notion will become clear in the next sections. From now on, we will overload the notation and omit the $\quad\tilde{}\quad$.
Sum-check
Imagine our task was to prove the simpler relation
$$\sum_{x\in\lbrace 0, 1\rbrace^{\mu}} p(x) = 0$$
instead. The sum-check protocol solves exactly this and we now look at how it works. Assume the generalized problem
$$\sum_{x\in\lbrace 0, 1\rbrace^{\mu}} g\left(p_0(x),\dots,p_v(x)\right) = 0$$
where $p_i$ are multi-linear polynomials to which the verifier has oracle access to and $g$ is a polynomial of degree at most $d$ which the verifier can evaluate on its own.
The sum-check protocol in this case can be described as follows:

In the zeroth round the prover sends a uni-variate polynomial $s_0(X_0)$ claimed to be equal to $$\sum_{(x_1,\dots ,x_{\mu-1})\in\lbrace 0, 1\rbrace^{\mu}} g\left(p_0(X_0, x_1,\dots ,x_{\mu-1}),\dots,p_v(X_0,x_1,\dots ,x_{\mu-1})\right)$$
The verifier checks that $s_0$ is of degree at most $d$ and that $s_0(0) + s_0(1) = 0$.
The verifier draws a random $r_0$, sends it to the prover and they both agree on $s_0(r_0)$ as the new claim (instead of the previous claim i.e., $0$).
At round $j$ for $1\leq j\leq\mu-1$:

The prover sends a uni-variate polynomial $s_j(X_j)$ claimed to be equal to $$\sum_{(x_{j+1},\dots ,x_{\mu-1})\in\lbrace 0, 1\rbrace^{\mu}} g\left(p_0(r_0,\dots,r_{j-1},X_j, x_{j+1},\dots ,x_{\mu-1}),\dots,p_v(r_0,\dots,r_{j-1},X_j, x_{j+1},\dots ,x_{\mu-1})\right)$$
The verifier checks that $s_j(X_j)$ is of degree at most $d$ and that $s_j(0) + s_j(1) = s_{j-1}(r_{j-1})$
The verifier draws a random $r_j$, sends it to the prover and they both agree on $s_j(r_j)$ as the new claim.

At this point, the verifier queries the oracles $p_i$ at $(r_0,\dots,r_{\mu-1})$ and checks that $s_{\nu-1}(r_{\nu-1}) = g\left(p_0(r_0,\dots,r_{\mu-1}),\dots , p_{\nu-1}(r_0,\dots,r_{\mu-1})\right).$

To sum up, the sum-check protocol reduces the claim
$$\sum_{x\in\lbrace 0, 1\rbrace^{\mu}} g\left(p_0(x),\dots,p_v(x)\right) = 0$$
to the evaluation of $p_i$'s at a random point $(r_0,\dots,r_{\mu-1})$ which the verifier can check using one query to each of the oracles $p_i$ (as a multi-linear function).
GKR for sum of fractions
A Warm-Up
Recall that our main task was reduced to proving that
$$\sum_{x\in\lbrace 0, 1\rbrace^{\nu + 1}} \frac{p(x)}{q(x)} = 0$$
The prover and verifier will run a GKR IP protocol in order to prove the validity of the above constraint. To this end, we will construct a (layered) circuit in order to evaluate the left-hand side expression. To give some intuition, we start with a simple example in the case when $\nu + 1 = 2$.
In this case, the expression becomes:
$$\frac{p(0, 0)}{q(0, 0)} + \frac{p(0, 1)}{q(0, 1)} + \frac{p(1, 0)}{q(1, 0)} + \frac{p(1, 1)}{q(1, 1)}$$
which can be computed/reduced to an expression with half the number of terms
$$\frac{p^{'}(0)}{q^{'}(0)} + \frac{p^{'}(1)}{q^{'}(1)}$$
where
$$\frac{p^{'}(0)}{q^{'}(0)} = \frac{p(0, 0)\cdot q(0, 1) + p(0, 1)\cdot q(0, 0)}{q(0, 0)\cdot q(0, 1)}$$
and
$$\frac{p^{'}(1)}{q^{'}(1)} = \frac{p(1, 0)\cdot q(1, 1) + p(1, 1)\cdot q(1, 0)}{q(1, 0)\cdot q(1, 1)}$$
This can be written as
$$p^{'}(x) := \sum_{y\in\lbrace 0,1\rbrace}  \mathsf{EQ}(x, y)\cdot \left(p(y,0)\cdot q(y, 1) + p(y,1)\cdot  q(y, 0) \right)$$
$$q^{'}(x) := \sum_{y\in\lbrace 0,1\rbrace}  \mathsf{EQ}(x, y)\cdot \left(q(y,0)\cdot q(y, 1) \right)$$
We can now describe how the GKR protocol works in our simplified example. The GKR protocol runs in the opposite direction to that of the evaluation of the circuit i.e.,

The verifier receives $p^{'}(0), p^{'}(1), q^{'}(0), q^{'}(1)$ together with oracles (i.e., commitments) to the input layer i.e., $p$ and $q$.
The verifier draws randomness $r$ and reduces the claim on $4$ values to a claim on the values $p^{'}(r) = (1-r)\cdot p^{'}(0) + r\cdot p^{'}(1)$ and $q^{'}(r) = (1-r)\cdot q^{'}(0) + r\cdot q^{'}(1)$.
The prover and verifier engage in two sum-check protocols on claims $p^{'}(r)$ and $q^{'}(r)$ i.e., the prover engages in a protocol to convince the verifier that $$p^{'}(r) := \sum_{y\in\lbrace 0,1\rbrace}  \mathsf{EQ}(r, y)\cdot \left(p(y,0)\cdot q(y, 1) + p(y,1)\cdot  q(y, 0) \right)$$ $$q^{'}(r) := \sum_{y\in\lbrace 0,1\rbrace}  \mathsf{EQ}(r, y)\cdot \left(q(y,0)\cdot q(y, 1) \right)$$
In our simple example, we have only one variable in the summation and thus the prover will compute and send a polynomial $g_p$ claimed to satisfy $$g_p(z) = \mathsf{EQ}(r, z)\cdot \left(p(z,0)\cdot q(z, 1) + p(z,1)\cdot  q(z, 0) \right).$$ Since $g_p$ will be of degree at most $3$, the prover sends either $4$ coefficients or $4$ evaluations of $g_p$. The same happens for $g_q$.
The verifier checks that $g_p(0) + g_p(1) = p^{'}(r)$ and $g_q(0) + g_q(1) = q^{'}(r)$.
The verifier draws a random value $u$ and sends it the prover who responds with $p(u,0), p(u, 1), q(u, 0)$ and $q(u, 1)$.
The verifier computes $\mathsf{EQ}(r, u)$ on its own.
The verifier checks that $$g_p(u) =  \mathsf{EQ}(r, u)\cdot \left(p(u,0)\cdot q(u, 1) + p(u,1)\cdot  q(u, 0)\right)$$ and the same for $g_q(u)$.
The verifier draws a random value $v$, computes $p(u, v) = (1-v)\cdot p(u, 0) + v\cdot p(u, 1)$ and $q(u, v) = (1-v)\cdot q(u, 0) + v\cdot q(u, 1)$ and queries the oracles of $p$ and $q$ to check that the previous $q(u,v)$ and $p(u,v)$ values are correct.

The General Case
The circuit
The circuit we are interested in is composed of $\mu$ layers with the $\mu$-th layer being the input layer and is located at the bottom. The input layer feeds into the next layer above it, i.e., $\mu-1$, and this goes on until one reaches the $1$-st layer. More precisely:

For the $\mu$-th layer, there are $2^{\mu+1}$ input wires with the values $\lbrace p_{\mu}(x)\rbrace_{x\in\lbrace 0,1\rbrace^{\mu}}$ and  $\lbrace q_{\mu}(x)\rbrace_{x\in\lbrace 0,1\rbrace^{\mu}}$.
For the $\kappa$-th layer, there are $2^{\kappa+1}$ output wires $\lbrace p_{\kappa}(x)\rbrace_{x\in\lbrace 0,1\rbrace^k}$ and  $\lbrace q_{\kappa}(x)\rbrace_{x\in\lbrace 0,1\rbrace^k}$ where $$p_{\kappa}(x) = p_{\kappa + 1}(x, 0)\cdot q_{\kappa + 1}(x, 1) + p_{\kappa + 1}(x, 1)\cdot q_{\kappa + 1}(x, 0)$$ and $$q_{\kappa}(x) = q_{\kappa + 1}(x, 0)\cdot q_{\kappa + 1}(x, 1)$$
The first layer has output wires $p_1(0), p_1(1), q_1(0), q_1(1)$.

Notice that we can associate with each layer the following two MLEs
$$p_{\kappa}(x) = \sum_{y\in\lbrace 0,1\rbrace^k}  \mathsf{EQ}(x, y)\cdot\left( p_{\kappa + 1}(y, 0)\cdot q_{\kappa + 1}(y, 1) + p_{\kappa + 1}(y, 1)\cdot q_{\kappa + 1}(y, 0)\right)$$
$$q_{\kappa}(x) = \sum_{y\in\lbrace 0,1\rbrace^k}  \mathsf{EQ}(x, y)\cdot\left( q_{\kappa + 1}(y, 0)\cdot q_{\kappa + 1}(y, 1) \right)$$
and in particular we can can make sense of evaluating $p_{\kappa}$ and $p_{\kappa}$ at tuples in $\mathbb{F}_q$.
The protocol
The GKR protocol works from the output layer backwards and works essentially by reducing a claim about the output of one layer to a similar claim on the outputs of the layer feeding into it. This continues until one reaches the input layer (i.e., layer $\mu$) at which the verifier makes a query to the oracles it received at beginning of the interaction.
More precisely:

The prover sends commitments to the MLEs of $p_{\mu}$ and $q_{\mu}$ as well as the values of the output wires $p_1(0), p_1(1), q_1(0), q_1(1)$.
The verifier checks that $p_1(0)\cdot q_1(1) + p_1(1)\cdot q_1(0) = 0$ and that $q_1(0)\neq 0$ and $q_1(1) \neq 0$.

Round 1:

Verifier samples a random $r_1 = \gamma_1$, sends it to the prover and they both reduce the original claim to a claim on $p_1(r_1), q_1(r_1)$ where $p_1(r_1) = p_1(\gamma_1) = (1 - \gamma_1)\cdot p_1(0) + \gamma_1\cdot p_1(1)$ and $q_1(r_1) = q_1(\gamma_1) = (1 - \gamma_1)\cdot q_1(0) + \gamma_1\cdot q_1(1)$.

Round $k$ for $2 \leq \kappa \leq \mu - 1$:

The prover engages in a sum-check protocol to convince the verifier that the claims $p_{\kappa}(r_{\kappa})$ and $q_{\kappa}(r_{\kappa})$ satisfy $$p_{\kappa}(r_{\kappa}) = \sum_{y\in\lbrace 0,1\rbrace^{\kappa}}  \mathsf{EQ}(r_{\kappa}, y)\cdot\left( p_{\kappa + 1}(y, 0)\cdot q_{\kappa + 1}(y, 1) + p_{\kappa + 1}(y, 1)\cdot q_{\kappa + 1}(y, 0)\right)$$ and $$q_{\kappa}(r_{\kappa}) = \sum_{y\in\lbrace 0,1\rbrace^{\kappa}} \mathsf{EQ}(r_{\kappa}, y)\cdot\left( q_{\kappa + 1}(y, 0)\cdot q_{\kappa + 1}(y, 1) \right)$$
The sum-check protocol itself will reduce the claim in the previous point to an evaluation claim on the MLE of layer $\kappa +1$, namely a claim on $$p_{\kappa + 1}(\rho_0,\dots,\rho_{\kappa}, 0), p_{\kappa + 1}(\rho_0,\dots,\rho_{\kappa}, 1), q_{\kappa + 1}(\rho_0,\dots,\rho_{\kappa}, 0), q_{\kappa + 1}(\rho_0,\dots,\rho_{\kappa}, 1)$$
The verifier samples a random $\gamma_{\kappa +1}$, sends it the prover and they both reduce the previous claim to the new claim $$p_{\kappa + 1}(r_{\kappa + 1}), q_{\kappa + 1}(r_{\kappa + 1})$$ where $$r_{\kappa + 1} := \left( \rho_0,\dots,\rho_{\kappa}, \gamma_{\kappa+1} \right)$$

At this point the verifier is left with two claims $$p_{\mu}(r_{\mu}), q_{\mu}(r_{\mu})$$ and it just queries the oracles $p_{\mu}$ and $q_{\mu}$ at $r_{\mu}$ to check them.

In the context of our basic example of LogUp, the last point entails a claim on $t, m, f, w$ at $(r_{\mu , 1},\dots, r_{\mu, \mu})$ since $$p_{\mu}(r_{\mu}) = (1-r_{\mu , 0})\cdot m(r_{\mu , 1},\dots, r_{\mu, \mu}) - r_{\mu , 0}\cdot f(r_{\mu , 1},\dots, r_{\mu, \mu})$$ and $$q_{\mu}(r_{\mu}) = (1-r_{\mu , 0})\cdot (\alpha + t)(r_{\mu , 1},\dots, r_{\mu, \mu}) - r_{\mu , 0}\cdot (\alpha + w) (r_{\mu , 1},\dots, r_{\mu, \mu})$$ where we used $r_{\mu} := (r_{\mu , 0}, r_{\mu , 1},\dots, r_{\mu, \mu}).$
Simulating a Multi-linear Polynomial Commitment scheme
The remaining question now is implementing the final oracle query by the verifier at the random point resulting from the GKR protocol interaction. To be more precise, suppose $t$ is a column of the main trace, then the question is how can the prover compute $t(r_0,\dots,r_{\nu - 1})$ and convince the verifier that it has done so honestly.
First, let's go back to the dual view of $t$, i.e., both as a uni-variate and as a multivariate polynomial. Suppose $\mathbb{H} := \lbrace g^{i}: i\in\lbrace 0,\dots ,2^{\nu}-1\rbrace\rbrace$ for a primitive $2^{\nu}$-th root of unity. This means that for any $y = g^i\in\mathbb{H}$ we have $$y = g^i = g^{i_0 + i_1\cdot 2 +  \dots + i_{\nu-1}\cdot 2^{\nu - 1}}$$
which we can use to define the mapping (with notational overload) $$t(i_0,\dots ,i_{\nu -1}) = t(g^i) = t(y)$$
This then gives meaning to $$t(r_0,\dots ,r_{\nu -1}) =  \sum_{(i_0,\dots , i_{\nu - 1})\in\lbrace 0, 1\rbrace^{\nu}} \mathsf{EQ}\left((r_0,\dots ,r_{\nu -1}), (i_0,\dots , i_{\nu - 1})\right) t\left(g^{i_0 + i_1\cdot 2 +  \dots + i_{\nu-1}\cdot 2^{\nu - 1}}\right)$$
where $$\mathsf{EQ}((r_0,\dots ,r_{\nu -1}), (i_0,\dots , i_{\nu - 1})) = \prod_{j=0}^{\nu - 1}\left(r_j\cdot i_j + (1-r_j)\cdot(1- i_j)\right)$$
Thus, $t(r_0,\dots ,r_{\nu -1})$ is the inner product of two vectors and hence, given oracle access to the (uni-variates) $t$ and $\mathsf{c} := (c_i)_{0\leq i\leq 2^{\nu} - 1}$ where $$c_i := \mathsf{EQ}\left((r_0,\dots ,r_{\nu -1}), (i_0,\dots , i_{\nu - 1})\right)$$ for $i=i_0 + i_1\cdot 2 +  \dots + i_{\nu-1}\cdot 2^{\nu - 1}$, the verifier can assertain $t(r_0,\dots ,r_{\nu -1})$ using a uni-variate sum-check protocol. This can be done either as part of the auxiliary trace, at the cost of an extra column and a quadratic transition constraint, or outside using an additional protocol as in e.g., Aurora.
The Lagrange kernel oracle
As part of the auxiliary trace, and given the random values $(r_0,\dots ,r_{\nu -1})$, the column $\mathsf{c}$ satisfies the following sets of constraints:

It starts with $c_0 = (1 - r_0)\dots (1-r_{\nu-1})$.
For each ${\kappa}\in\lbrace 1,\dots, \nu\rbrace$:

Let $\mathbb{I}_{\kappa} := \lbrace j\cdot 2^{{\kappa}}: 0\leq j < 2^{\nu - {\kappa}} \rbrace$
For each $i\in\mathbb{I}_{\kappa}$, $c_{i + 2^{{\kappa}-1}} =\frac{r_{{\kappa}-1}}{1-r_{{\kappa}-1}}\cdot c_i$

The above can be encoded using:

The boundary constraint $c(X) - (1 - r_0)\dots (1-r_{\nu-1}) = 0$ at $X = 1$, i.e., on the sub-group $\mathbb{H}_0 := \lbrace 1\rbrace$.
Transition constraints:

Define $\mathbb{H}_{\kappa} = \lbrace g_{\kappa}^i: i\in\lbrace 0,\dots,2^{\kappa} - 1\rbrace\rbrace$ where $g_{\kappa} = g^{2^{\nu-\kappa}}$ and $g$ is as before, a primitive $2^\nu$-th root of unity.
For each  ${\kappa}\in\lbrace 1,\dots, \nu\rbrace$, $$(1 -r_{\kappa - 1})\cdot c(g_{{\nu - \kappa} + 1}\cdot X) - r_{{\kappa}-1}\cdot c(X) = 0$$ holds on $\mathbb{H}_{\nu - \kappa}$.

Description of the full protocol

The prover sends commitments to $m, f, t, w$.
The verifier sends the prover a random challenge $\alpha$.
The prover uses $\alpha, m, f, t$ and $w$ to evaluate the circuit in the GKR protocol and it responds with the output of the circuit i.e., $p_1(0), p_1(1), q_1(0), q_1(1)$.
The verifier checks that $q_1(0) \neq 0$, $q_1(1) \neq 0$ and $p_1(0)\cdot q_1(1) + p_1(1)\cdot q_1(0) = 0$.
The verifier draws a random $r_1=\gamma_1$ and sends it to the prover. Both parties compute the new claim $(q_1(r_1), p_1(r_1))$ (about the output of the circuit) as $p_1(r_1) = (1 - \gamma_1)\cdot p_1(0) + \gamma_1\cdot p_1(1)$ and $q_1(r_1) = (1 - \gamma_1)\cdot q_1(0) + \gamma_1\cdot q_1(1)$.
The prover and verifier engage in a sequence of sum-checks which culminate in a final claim $(p_{\nu + 1}(r_{\nu + 1}), q_{\nu + 1}(r_{\nu + 1}))$, where $r_{\nu + 1}$ is the randomness generated during the course of the final sum-check.
The prover will provide, as part of the last step of the final sum-check, the evaluations of the "original" oracles at $(r_{\nu,{1}},\dots ,r_{\nu , \nu - 1}, 0)$ and $(r_{\nu,{1}},\dots ,r_{\nu , \nu - 1}, 1)$ and the verifier will make sure that they satisfy the last check in the final sum-check protocol.
The prover constructs the column $\mathsf{c} = \left(c_i\right)_{0\leq i \leq \nu - 1}$ representing the Lagrange kernel oracle at $(r_{\nu,{1}},\dots ,r_{\nu , \nu })$ and sends its commitment to the verifier.
The verifier draws a random $\lambda$, sends it to the prover and proves to the verifier that $$l(x_0,\dots, x_{\nu-1}) :=  m(x_0,\dots, x_{\nu-1}) + \lambda f(x_0,\dots, x_{\nu-1}) + \lambda^2 t(x_0,\dots, x_{\nu-1}) + \lambda^3 w(x_0,\dots, x_{\nu-1})$$ evaluates to $$m(r_{\nu,{1}},\dots ,r_{\nu , \nu }) + \lambda f(r_{\nu,{1}},\dots ,r_{\nu , \nu }) + \lambda^2 t(r_{\nu,{1}},\dots ,r_{\nu , \nu }) + \lambda^3 w(r_{\nu,{1}},\dots ,r_{\nu , \nu })$$ at $$(r_{\nu,{1}},\dots ,r_{\nu , \nu })$$ using the Lagrange kernel oracle $$\mathsf{c}$$ and the uni-variate sum-check protocol.

Next Steps
The main points that need further considerations are:

Understanding the costs associated with the Lagrange kernel.
The optimal way to implement the ultimate sum-check.
Handling additional buses.

These will be discussed in future separate issues.
[^1]: Log-uniform circuits i.e., roughly circuits with a succinct description.
[^2]: Note that, contrary to the main work here, the boolean hypercube is chosen to be {0, 1} instead of {-1, 1}.
[^3]: Fact 3.5 in Proofs, arguments and zero-knowledge (PAZK) by Justin Thaler.
[^4]: Lemma 3.6 in PAZK.

I'd like to zoom in on the Lagrange kernel transition constraints, as it took me a bit of time to understand what was going on, and would like to make it easier for others. I also believe that they are currently incorrectly formulated; I will provide what I believe is the correct way to write them.
This writeup will use a motivating example with $\upsilon = 3$ (i.e. an 8-element trace). We will use the notation $r = (r_2, r_1, r_0)$, where $r_i$ denote the bit decomposition of $r$. That is, if $r=6$, then $r_2=1$, $r_1=1$, and $r_0=0$.
Problem recap
The so-called "Lagrange kernel" is the above-mentioned function
$$\mathrm{EQ}(x, y) = \prod_{i=0}^{\upsilon-1} x_i y_i + (1-x_i)(1-y_i).$$
We want to create a column $c$ such that $c_i = \mathrm{EQ}(i, r)$ for some random $r$.
Naive constraints
To ensure that c is properly built, we need 7 constraints:
$$
c_0 = \mathrm{EQ}(0, r) = (1-r_2)(1-r_1)(1-r_0)
$$
$$
c_1 = \mathrm{EQ}(1, r) = (1-r_2)(1-r_1)r_0
$$
$$
c_2 = \mathrm{EQ}(2, r) = (1-r_2)r_1(1-r_0)
$$
$$
c_3 = \mathrm{EQ}(3, r) = (1-r_2)r_1r_0
$$
$$
c_4 = \mathrm{EQ}(4, r) = r_2(1-r_1)(1-r_0)
$$
$$
c_5 = \mathrm{EQ}(5, r) = r_2(1-r_1)r_0
$$
$$
c_6 = \mathrm{EQ}(6, r) = r_2r_1(1-r_0)
$$
$$
c_7 = \mathrm{EQ}(7, r) = r_2r_1r_0
$$
Rewriting the naive constraints
Notice that we can rewrite the naive constraints in terms of one another:
$$
c_1 = \frac{r_0}{1-r_0}c_0
$$
$$
c_2 = \frac{r_1}{1-r_1}c_0
$$
$$
c_3 = \frac{r_0}{1-r_0}c_1
$$
$$
c_4 = \frac{r_2}{1-r_2}c_0
$$
$$
c_5 = \frac{r_2}{1-r_2}c_1
$$
$$
c_6 = \frac{r_2}{1-r_2}c_2
$$
$$
c_7 = \frac{r_2}{1-r_2}c_3
$$
Note that there are more than one way to write these constraints; any two rows can be written in terms of one another if their index differs by 1 bit (i.e. they have a Hamming distance of 1). Actually, the initial proposal writes them slightly differently. I chose this way specifically to serve the next section.
Introducing enforcement domains
A key identity in STARKs is $$x^n - 1 = \prod_{i=0}^{n-1} (x - g^i)$$, where $g$ is the generator of $\mathbb{F}_n$ (and $n$ is a power of 2). To make a long story short, if the enforcement domain of a transition constraint is $x^n - 1$, then the transition constraint applies to the domain points $\{g^0, g^1, ..., g^{n-1}\}$. We will make use of this identity to lower the number of constraints to $\log(n)$.
Specifically, I believe the transition constraint formula is as follows. For $k \in \{1, ..., \upsilon \}$,
$$
c(g^{2^{k-1}}x) = \frac{r_{k-1}}{1 - r_{k-1}}c(x)
$$
for $$x \in \{ g^0, ..., g^{2^{k-1}}\}$$
Let's build our intuition of why this works by going back to our $\upsilon = 3$ example.
For $k=1$, the enforcement domain is $\{g^0 \}$. If we plug in to the formula $x=g^0$ and $k=1$, we get
$$
c_1 = \frac{r_0}{1-r_0} c_0
$$
Notice that this is our first constraint defined in the previous section!
For $k=2$, the enforcement domain is $\{g^0, g^1 \}$. If we plug in to the formula $x=g^0$ and $k=2$, we get
$$
c_2 = \frac{r_1}{1-r_1} c_0
$$
and with $x=g^1$, we get
$$
c_3 = \frac{r_1}{1-r_1} c_1
$$,
our 2nd and 3rd constraints!
For $k=2$, the enforcement domain is $\{g^0, g^1, g^2, g^3 \}$; I'll leave it as an exercise to show that we recover our last 4 constraints.

Sometimes it may be useful to test summations different from $0$.  This means that instead of focusing on the relation $$\sum_{z\in\lbrace 0, 1\rbrace^{\nu}}\sum_{x\in\lbrace 0, 1\rbrace^{\mu}} \frac{f\left(z, p_0(x),\dots,p_v(x)\right)}{g\left(z, p_0(x),\dots,p_v(x)\right)} = 0$$
we look at
$$\sum_{z\in\lbrace 0, 1\rbrace^{\nu}}\sum_{x\in\lbrace 0, 1\rbrace^{\mu}} \frac{f\left(z, p_0(x),\dots,p_v(x)\right)}{g\left(z, p_0(x),\dots,p_v(x)\right)} = C$$
Examples of these are the virtual tables of stack overflow and kernel procedures. In the first example, the VM can accommodate programs which start with more than 16 field elements by initializing the stack overflow virtual table with these elements. Since this initialization is a function only of the (overflow) stack elements and their positions on the stack, the verifier can initialize the virtual table on its own and using randomness, say $\alpha$, collapse it into a single value, say $C\left(\alpha\right)$. For this more general relation, the analysis in the original post goes through unaltered except for the change to the summation value.
More precisely:

The prover sends commitments to the main trace columns.
The verifier sends the challenge vector $\alpha$ (to reduce global constraints to local constraints).
Both the prover and verifier compute the expected sum $C(\alpha)$
The prover engages with the verifier to convince him that $$\sum_{z\in\lbrace 0, 1\rbrace^{\nu}}\sum_{x\in\lbrace 0, 1\rbrace^{\mu}} \frac{f\left(z, p_0(x),\dots,p_v(x)\right)}{g\left(z, p_0(x),\dots,p_v(x)\right)} = C(\alpha)$$ using the GKR protocol for sums of fractions.

Note that, in the case of a universal bus, $C(\alpha)$ will in fact be the sum of many individual $C_i(\alpha)$ each corresponding to a particular bus i.e., in the case of the above examples, we will have $C_0(\alpha)$ for the overflow stack virtual table (bus), $C_1(\alpha)$ for the kernel procedures virtual table (bus) and $C(\alpha) = C_0(\alpha) + C_1(\alpha)$.


Question about reading 24-bit bmp files

I have a 24-bit bmp file that I want to get the rgb values for the pixels. I'm trying to use Jimp. If I open the image in GIMP and examine pixel 0,0 the rgb values are r: 45, g: 203, b: 203. However, if I use Jimp and the following code:
Jimp.read(fileToRead)
          .then(image => {
            console.log(Jimp.intToRGBA(image.getPixelColor(0,0)))
          })
          .catch(err => {
            console.log(err);
          })

I get { r: 173, g: 200, b: 150, a: 255 }
By eye, r: 45, g: 203, b: 203 is the correct color. So what am I doing wrong? Do I need to use some option to tell Jimp it's 24-bit? Can Jimp read 24-bit? Internally it's using node mod bmp-js which supposedly can decode 24 bit. Am I missing some basic knowledge about bmp format?
Thanks.

Can you provide and image?


Encourage the use of SRI

In order to avoid malwares from hacked CDNs, we can add an integrity check to update whenever the library is updated. This requires more housekeeping work to avoid issues from the script being rejected if we miss to update the file hash but it stays a recommendable check to perform and to encourage to users.
More here at MDN: Subresource
Integrity

I'm not sure about this.
While it sounds like a good idea to add, adding it to readme files is not correct approach because of automation issues. Manually updating hash is not usable, it should be automated, but issue is, what is actually hashed?
This is a monorepo with multiple packages, main branch is pushed whenever any package is updated. This might result in situation when built file in main branch and file in latest published version don't match. So if file in repository is hashed, it might not match content of file in URL, resulting in bad hash.
If remote file is fetched and hashed, it creates a different problem. Package is built and published on NPM before it is pushed on server. So when new version is published, there is no file to fetch and hash. This would require changing publishing order and I'm not sure required work is worth this.
Then issue is, is it actually useful? If it is served by third party CDN, then sure. It could be useful to make sure CDN isn't messing with content. But in this case domain is under control of project and is available in repository, hosted by GitHub Pages: https://github.com/iconify/code


When using with PowerShell.Create PowerShellLogging throws on all Write Output

We're using this module in some of our modules, and now someone's tried to call our module from C# with a PowerShell.Create (no host).
We expected the logs would still show up, but instead PowerShellLogging throws on any output.
A quick review of source shows that (almost) all the output methods are deliberately throwing when the host is null (as it is, presumably, in the case where we're using PowerShell.Create).
Proposal: (I will implement, if you're OK with this). I think that simply changing the methods to use the null check just to skip calling the host (rather than throwing) would:

Avoid breaking PowerShell when there's no host
Allow logging even when there's no a host

Sounds fine to me

On Jun 28, 2019, at 10:57 AM, Joel Bennett<EMAIL_ADDRESS>wrote:
We're using this module in some of our modules, and now someone's tried to call our module from C# with a PowerShell.Create (no host).
We expected the logs would still show up, but instead PowerShellLogging throws on any output.
A quick review of source shows that (almost) all the output methods are deliberately throwing when the host is null (as it is, presumably, in the case where we're using PowerShell.Create).
Proposal: (I will implement, if you're OK with this). I think that simply changing the methods to use the null check just to skip calling the host (rather than throwing) would:
Avoid breaking PowerShell when there's no host
Allow logging even when there's no a host
—
You are receiving this because you are subscribed to this thread.
Reply to this email directly, view it on GitHub, or mute the thread.


Download ahead causes page loading stutters on downloaded long strips.

Steps to reproduce
Enable download ahead
Download 2 consecutive chapters of any long strip that has a decent page count (count only makes it more noticeable)
Scroll between pages.
Expected behavior
Downloading new chapters in background shouldn't cause page loading stutters (like in 2.15.0)
Actual behavior
Stutters when scrolling between pages of already downloaded chapters
https://github.com/nekomangaorg/Neko/assets/34176510/b1785cec-9fc2-411b-a047-bca67ab77082
Crash logs
No response
Neko version
2.16.2
Android version
14
Device
Google Pixel 7 Pro
Other details
Repeatable across a fresh install on a Galaxy S22 (also A14), only changes from default are split pages (to make it more noticeable), and download ahead (set to 5)
Neither device does this with the same settings (as far as I can tell) on 2.15.0
I have a feeling this is caused by upstream, but I don't currently use Mihon and didn't see this reported there.
¯\_(ツ)_/¯
Acknowledgements

[X] I have searched the existing issues and this is a new ticket, NOT a duplicate or related to another open issue.
[X] I have written a short but informative title.
[X] I have updated the app to the newest version Latest.
[X] I have filled out all of the requested information in this form.

Less noticeable in the clip I had chosen, but it stutters at the same time the page number on bottom changes, scrolling either up or down.

Expected (2.15.0) behavior:
https://github.com/nekomangaorg/Neko/assets/34176510/77684f1a-c911-426d-8c7a-22a7a72baf4f

Still an issue it seems


add git requirement and note for environment variables

@satya164  @ide Sorry for my poor knowledge about git! Is this one a clean fork now?

LGTM


Update AZC0002 to look for RequestOptions as well

Since cancellation token can be passed through the RequestContext for protocol methods we need to update this check to account for that.
https://github.com/Azure/azure-sdk-for-net/pull/32466/files#diff-4af651fe17380560084e5cb68456401c225c9a3c3f511049bbe8144e8c4eae08R6

@m-nash I think the comment in the original suppression could be wrong. It should be RequestContext, not RequestOptions. @ShivangiReja Could you please confirm? Thanks.
We've already added RequestContext in AZC0002.

@archerzz  yes edited the original comment.


What is the correct syntax for multiple 'has_terms'?

From https://github.com/timber/timber/wiki/TimberPost#has_term I get the following but I want to use multiple terms.

{{post.title}}

{% if post.has_term('gallery') %}

Photo gallery by {{post.author.name}}

{% else %}

Article by {{post.author.name}}

{% endif %}

I've tried the following with no success.
{% if post.has_term('gallery','blog') %}
Could someone please advise on how this is done.
Thanks

Got the answer via @TimberWP.  Thanks.
{% if post.has_term('gallery') or post.has_term('blog') %}
Closing.


pkg-config install path should be fixed for FreeBSD

I've already talked about this in gitter chat.  The same thing should be done.
I create an issue never to forget to do.
https://patchwork.kernel.org/patch/9394235/

pkg-config from FreeBSD ports doesn't have ${prefix}/share/pkgconfig in the
default search path, fix this by having a PKG_INSTALLDIR variable that can
changed on a per-OS basis.
It would be best to use PKG_INSTALLDIR as defined by the pkg.m4 macro, but
sadly this also reports a wrong value on FreeBSD (${libdir}/pkgconfig, which
expands to /usr/local/lib/pkgconfig by default, and is also not part of
the default pkg-config search path).
This patch should not change the behavior for Linux installs.

Please see #499

Now pkg-config install path can be overridden by --with-pkgconfigdir option.


Kleros upgrades

Ideally we can make the Inhouse Safe different from Kleros'!!!
Went with least resistance path for now! (did require workarounds tho)


When customizing a plugin, how do I pass the current model customization options?

Custom a plugin:
class Plugin(BasePlugin):
    def initialize(self, plugin_config: Dict[str, Any]):
        pass

    def load(self, source_config: SourceConfig) -> pd.DataFrame:
        pass

    def store(self, target_config: TargetConfig):
        pass

how to get meta in method store:
models:
  - name: new_demo
    meta:
      custom: test

or to get custom:
-- ./models/new_demo.sql
{{ config(materialized="external", plugin="sql", custom="test") }}
select * from demo where status=1

I don't think I'm passing it in right now to the TargetConfig class, but I don't think it wouldn't be too hard to add it, let me take a look now...


Broken links in blog's sidebar

Our blog's sidebar references categories by their titles and not by the pages names thus forming broken URLs. For example, the category Inside the Plow referes to the page in the URL's path as "Inside the Plow" instead of "inside-the-plow". Also bear in mind that URLs on GitHub are case-sensitive.

It broke 3 days ago when GitHub upgraded to the latest version of Jekyll.

Please re-open in the website repo...

See https://github.com/snowplow/snowplow.github.com/issues/266


Option in Spike2io for grouping channel with same sampling rate

Option in Spike2io for grouping channel with same sampling rate

Hello @samuelgarcia! Thanks for opening this PR. We checked the lines you've touched for PEP 8 issues, and found:

In the file neo/rawio/spike2rawio.py:

Line 276:1: W293 blank line contains whitespace
Line 279:25: E265 block comment should start with '# '
Line 279:100: E501 line too long (117 > 99 characters)
Line 287:100: E501 line too long (115 > 99 characters)
Line 341:9: E265 block comment should start with '# '

In the file neo/test/iotest/test_spike2io.py:

Line 38:1: W293 blank line contains whitespace
Line 66:1: W293 blank line contains whitespace

Issue in tridesclous https://github.com/tridesclous/tridesclous/issues/105


Add safari dependency values

Using SFSafariViewController in the context of SwiftUI does not work well around navigation.
Therefore, using it in the context of UIKIt works better.
In other platform, EnvironmentValues().openURL is used same as @Dependency(\.openURL) .
cf: https://sarunw.com/posts/sfsafariviewcontroller-in-swiftui/

Thanks for the PR @d-date! You're packing your schedule quite a lot :smile:
Do you have a sample code showing the problem in UIKit using openURL? If there's a problem there I wonder if we should even update openURL itself.

Hi @stephencelis and @mbrandonw,
Your talk and workshop are really awesome! I'll work with you as a contributor 😄
I mean @Dependency(\.openURL) works well, but when somebody wants to use SFSafariViewController, they lost way without workaround. This PR save them.
You can check our PR and how we modified.
https://github.com/tryswift/trySwiftTokyoApp/pull/45


Remove the main NormalizeWhitespace call in favour of our own spacing

This can be reviewed, but again we need to decide how worth it this is.

I did have a quick glance at it, but I'm not a fan. This puts liability on anyone editing SilkTouch code to track whitespace. One of the most important reasons for us using ExpressionSyntax and friends everywhere is that it's a neat abstraction for anything, by design it's not intended to know in what context it's going to be used, so tracking whitespace is impossible / has to be very conservative with how it works. I also think the Roslyn team may do something about this, will raise with them again.

OK fair enough.


Support attachment of folders

Description
Currently only individual files could be attached to a user message.
However, it's useful for RAG-like application to accept the whole folders from the user workspace.
Attaching dozens of individual files could be very inconvenient.
Moreover, we want an easy way to identify collections of files for which RAG applications build indices. The specific folder in a user workspace could be such an identifier.
Whether application supports folder attachments or not, should be defined by a feature flag from the listing features.folder_attachments.
There is no MIME type for folders, but we have to provide one in attachments[*].type field.
The most appropriate type would be the catch-all type */*, since a folder may contain all types of files, or null.
Use case/motivation
No response
Related issues
Backend:

Support auto-sharing of folders: https://github.com/epam/ai-dial-core/issues/265
Feature flag in the core listing: https://github.com/epam/ai-dial-core/issues/266

Confidential information

[x] I confirm that do not share any confidential information

We are going to introduce new MIME type "application/vnd.dial.folder-metadata+json" and use it to attach folders (via PUT query) with url equals to path to the folder.
Same MIME type will be returned as a response when you are trying to do GET for same url for same folder and it will return to you folder metadata with all folder structure in it including all files (for now without pagination but pagination can be implemented in the future because we already have it designed for this kind of API).

Metadata MIME type proposal
The current proposal suggests to introduce a new MIME type for DIAL metadata calls: application/vnd.dial.metadata+json
Implications for chat completion attachment API

Attachment may point to a DIAL folder using the new MIME type.
Attachment may point to a DIAL files using the type too. Which gives us two ways to address a file:

by value (files/BUCKET/PATH + Document MIME type)
by reference (metadata/files/BUCKET/PATH + Metadata MIME type)
The first way is preferable, because it doesn't require addition call to get the file content type.

Implications for DIAL Chat
Chat should support folder attachments following this format:
{
  "type": "application/vnd.dial.metadata+json",
  "url": "metadata/files/BUCKET/foo/baz/folder/"
}

Whether an application supports folder attachments or not must be determined by inputAttachmentTypes field from the Core listing:
"inputAttachmentTypes": [
  "application/vnd.dial.metadata+json"
]

Implications for DIAL application developers

The DIAL application supporting folder attachments should be able to handle the new MIME type.
The DIAL application supporting file attachment should be able to support both ways of addressing a file.

In general, applications must perform input data validation and only accept attachment type, which they are able to handle and reject the rest.
Implications for DIAL Core

Metadata call should return Content-Type:application/vnd.dial.metadata+json for GET metadata/RESOURCE_TYPE/RESOURCE_ID calls.
Access control (auto-sharing) for files and folders must be adjusted to support DIAL metadata references.

Implications for DIAL Core config
inputAttachmentTypes field in the Core config declares which MIME types are supported by an application.
If an application supports folder attachments, it should include application/vnd.dial.metadata+json in the list:
"inputAttachmentTypes": [
  "application/vnd.dial.metadata+json"
]

Examples
File attachment via direct reference:
{
  "type": "text/plain",
  "url": "files/BUCKET/foo/baz/folder/doc.txt"
}

File attachment via metadata:
{
  "type": "application/vnd.dial.metadata+json",
  "url": "metadata/files/BUCKET/foo/baz/folder/doc.txt"
}

Folder attachment via metadata:
{
  "type": "application/vnd.dial.metadata+json",
  "url": "metadata/files/BUCKET/foo/baz/folder/"
}

Misc
Trailing slash matters for metadata calls
GET metadata/files/BUCKET/a/b/c
===
{
  "name": "c",
  "parentPath": "a/b",
  "bucket": "BUCKET",
  "url": "files/BUCKET/a/b/c/",
  "nodeType": "FOLDER",
  "resourceType": "FILE",
  "items": null
}

GET metadata/files/BUCKET/a/b/c/
===
{
  "name": "c",
  "parentPath": "a/b",
  "bucket": "BUCKET",
  "url": "files/BUCKET/a/b/c/",
  "nodeType": "FOLDER",
  "resourceType": "FILE",
  "items": [
    {
      "name": "d.txt",
      "parentPath": "a/b/c",
      "bucket": "BUCKET",
      "url": "files/BUCKET/a/b/c/d.txt",
      "nodeType": "ITEM",
      "resourceType": "FILE",
      "contentLength": 60,
      "contentType": "text/plain"
    }
  ]
}

Paging is not supported for files/folders
It's currently supported only for prompts and conversations resources.
There is no PUT request for folder upload
We upload files one at a time.
FAQ
Q: Why not use std MIME type application/json for metadata calls? After all GET metadata/files/... already returns Content-Type:application/json.
A: Wherever a diverse set of documents is expected to be handled in an uniform way, it is better to use a custom media type, so that the client can distinguish between different types of attachments and handle them accordingly. application/json is too generic, whereas, the custom type tells that the attachment represents DIAL folder and, thus, client may decide to render it a specific way.

@IlyaBondar  please look into it

It was verified and released in 0.11 version


Spurious build warning message: "WalletConnectRelay/PackageConfig.json' of type 'text.json' for architecture 'arm64'"

This message:

Build target WalletConnectSwiftV2
no rule to process file '/Pods/WalletConnectSwiftV2/Sources/WalletConnectRelay/PackageConfig.json' of type 'text.json' for architecture 'arm64'

closed with https://github.com/WalletConnect/WalletConnectSwiftV2/pull/672


Native notebooks does not ask for permission to download from the CDN

Reset all of your VS code settings
Run a notebook with a 3rd party widget in it
3rd party widget will not display
Run same code in interactive window
It will ask if you want to download from 3rd party site
Then widget will work

Validated:

After prompt widget is downloaded / shown.


Some properties have wrong (zero) values

Affects only some packages (I know about react and lodash) - humanDependents and jsDelivrHits are both zero.

humanDependents and dependents is actually broken probably because npm was down during the indexing and then we go back to the fallback value, which is 0. React still seems to have a good relevance because of downloads, so it doesn't seem to be a huge issue for now.
I'd still of course like to see this fixed! :)


easy install

goal
create an install magic to simplify adding packages to the docker image via different installers
installers (in this order)
apt, pip, conda, npm
example
instead of
apt-get update && apt-get install -y somepackage && rm-rf  #to clean up apt-get update

we want
%install apt somepackage

Implemented here


Multisig transaction signing error with Ledger on M1 Mac

Version details
M1 Mac @ Ventura 13.3.1
Ledger Nano S Plus

Firmware: 1.1.0
Bitcoin App: 2.1.1

Sparrow version: 1.7.6 (via Sparrow-1.7.6-aarch64.dmg)
Description
When we attempt to sign a PSBT for a 2-of-4 native segwit multisignature output, it fails.  Here are the steps:

Open Sparrow and relevant wallet
Open PSBT
Connect and unlock Ledger; enter Bitcoin App
Sign Transaction, Scan, Sign
Go through Register Wallet workflow
Drop back to Sparrow and see the error ('0xb007' , 'Error in <BitcoinInsType.REGISTER_WALLET:2> command' , ")

Where was the PSBT created? Can you reproduce this if Sparrow creates the PSBT?

Where was the PSBT created? Can you reproduce this if Sparrow creates the PSBT?

We used Sparrow 1.7.6 on Ubuntu 22.04 to create the PSBT.  I used Bitcoin Core's decodepsbt and analyzepsbt commands to inspect the PSBT and all expected fields are populated, including GLOBAL_XPUB.

Are all keystores using the default derivation path? m/48’/0’/0’/2’
Some hardware wallets are restrictive about which derivations they will allow.

Are all keystores using the default derivation path? m/48’/0’/0’/2’

In this particular instance, yes.

Is there any further information in the log file regarding the error? See Help menu to find the log.
Multisig signing using a Ledger is well tested (including registering a wallet) so this error is unusual, and seems to be related to the structure of this multisig setup.

Here are the relevant log lines.  I don't see anything illuminating, myself.
2023-04-26 12:55:57,969 ERROR [JavaFX Application Thread] c.s.s.c.DevicePane [null:-1] Signing Error: ('0xb007', 'Error in <BitcoinInsType.REGISTER_WALLET: 2> command', '')
com.sparrowwallet.sparrow.io.SignTransactionException: ('0xb007', 'Error in <BitcoinInsType.REGISTER_WALLET: 2> command', '')
	at com.sparrowwallet.sparrow@1.7.6/com.sparrowwallet.sparrow.io.Hwi.signPSBT(Unknown Source)
	at com.sparrowwallet.sparrow@1.7.6/com.sparrowwallet.sparrow.io.Hwi$SignPSBTService$1.call(Unknown Source)
	at com.sparrowwallet.sparrow@1.7.6/com.sparrowwallet.sparrow.io.Hwi$SignPSBTService$1.call(Unknown Source)
	at javafx.graphics@18/javafx.concurrent.Task$TaskCallable.call(Unknown Source)
	at java.base/java.util.concurrent.FutureTask.run(Unknown Source)
	at javafx.graphics@18/javafx.concurrent.Service.lambda$executeTask$6(Unknown Source)
	at java.base/java.security.AccessController.doPrivileged(Unknown Source)
	at javafx.graphics@18/javafx.concurrent.Service.lambda$executeTask$7(Unknown Source)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.base/java.lang.Thread.run(Unknown Source)

Just checking something obvious - you imported the Ledger as a keystore in this wallet prior to signing?
Also, can you verify in the Sparrow config file that the hwi variable is pointing to HWI 2.2.1? The version will be somewhere in the path, or you can execute hwi --version.

I am happy to report that one of the keystores was badly misconfigured.  Ordinarily, we set up wallets in Sparrow by setting the descriptor, then can sign with a ledger that matches the keystore even if we skip the import step.  When I had my user import their ledger it completely changed the keystore.  So I consider this particular issue resolved.
Do you have an opinion on BIP 129 and its suitability for Sparrow?  Having a first class workflow for setting up a multisig where the signers are all remote would make a big difference in my quality of life!

Good to hear you found the issue. BIP 129 is already implemented - when creating a multisig wallet and after importing a keystore, an Export button is shown on the keystore tab panel which exports a Round 1 BSMS file to share with other signers. The Round 2 BSMS file can be exported from the File > Export Wallet dialog after the multisig wallet setup is complete.

Wow!  That is a very nice surprise.  It is quite impressive how you are able to deliver such a huge feature set.  Keep up the good work @craigraw !

Playing around with the BSMS functionality, I have a few questions:

Is the Sparrow implementation of BSMS documented anywhere?
What is the coordinator supposed to do with the round 1 files?  It seems like it should be an option to import the file in the keystore setup panel.

I tried to use File > Import Wallet with the attached file and got an error:
Caused by: java.lang.IllegalArgumentException: Unrecognised extended key header for mainnet: 00
	at com.sparrowwallet.drongo/com.sparrowwallet.drongo.ExtendedKey$Header.fromExtendedKey(Unknown Source)
	at com.sparrowwallet.drongo/com.sparrowwallet.drongo.OutputDescriptor.getOutputDescriptor(Unknown Source)
	... 130 common frames omitted

bip39.bsms.txt
Is that supposed to work or should the Import Wallet workflow only succeed for round 2 documents?

You can import the Round 1 BSMS exports using the BSMS option in the Airgapped panel for keystore imports when setting up a multisig wallet.
And yes, this needs a guide - I'm planning on writing one :)

Ok cool.  It does make sense to have it as an Airgapped keystore, and that import flow worked for me.  Thanks for the help!


when nextToken is null data is fetched, but when i updated the token, it gives error

Before opening, please confirm:

[X] I have installed the latest version of the Amplify CLI (see above), and confirmed that the issue still persists.
[X] I have searched for duplicate or closed issues.
[X] I have read the guide for submitting bug reports.
[X] I have done my best to include a minimal, self-contained set of instructions for consistently reproducing the issue.
[X] I have removed any sensitive information from my code snippets and submission.

How did you install the Amplify CLI?
npm
If applicable, what version of Node.js are you using?
v16.16.0
Amplify CLI Version
9.2.1
What operating system are you using?
Mac
Did you make any manual changes to the cloud resources managed by Amplify? Please describe the changes made.
Yes, after i made changes in schema.graphql (i added one fields to the model). when i saw in dynamodb it didn't created new column for that field. and i tried to fetch the list query, but it was giving
Cannot return null for non-nullable type: 'String' within parent 'Device'
then i checked the dynamoDB, and i saw that there isn't any column created for newly added key, so i added empty string into it. by fetching all the ids from Device model...
Amplify Categories
api
Amplify Commands
push
Describe the bug
Before change,
type Device @model @auth(rules: [{ allow: public }]) {   <key>: <fields> }
After that, i added the one key name entryName
type Device @model @auth(rules: [{ allow: public }]) {   <key>: <fields>   entryName: String! }
then i used
amplify push
all things are updated the graphql folder is also updated.
now when i tried to use the list query it was giving me
"Cannot return null for non-nullable type: 'String' within parent 'Device' (/listDevices/items[0]/entryName)"
i thought that it was coming because dynamoDB didn't have column called entryName,
so i tried to add it by fetching all the ids, and then updating entryName:"" like this
const result = await API.graphql({
    query: listDevices,
  });
  // console.log(result.data.listDevices.items.length);
  for await (const item of result.data.listDevices.items) {
    const updateRow = await API.graphql({
      query: updateDevice,
      variables: {
        input: {
          id: item.id,
          entryName: "",
        },
      },
    });
    // console.log("data", updateRow.data.updateDevice);
  }

it successfully changed.
BUT
when i try to fetch the list again it just give me first 100 records and when i used received token as nextToken for next query it gives me error
  let token;
  do {
    const result = await API.graphql({
      query: listDevices,
      variables: {
        filter: {
          isDeleted: { ne: true },
        },
        limit: 100,
        nextToken: token ? token : null,
      },
    });
    token = result.data.listDevices.nextToken;
  } while (token);

and the error is
// on first iteration it give me first 100 records.
result {
  data: {
    listDevices: {
      items: [Array],
      nextToken: '***********'
    }
  }
}

// but when i reused the token in nextToken it gives me error
{
  data: { listDevices: { items: [Array], nextToken: null } },
  errors: [
    {
      path: [Array],
      locations: null,
      message: "Cannot return null for non-nullable type: 'String' within parent 'Device' (/listDevices/items[0]/entryName)"
    },
    {
      path: [Array],
      locations: null,
      message: "Cannot return null for non-nullable type: 'String' within parent 'Device' (/listDevices/items[1]/entryName)"
    },
    {
      path: [Array],
      locations: null,
      message: "Cannot return null for non-nullable type: 'String' within parent 'Device' (/listDevices/items[2]/entryName)"
    },
    {
      path: [Array],
      locations: null,
      message: "Cannot return null for non-nullable type: 'String' within parent 'Device' (/listDevices/items[3]/entryName)"
    },
    {
      path: [Array],
      locations: null,
      message: "Cannot return null for non-nullable type: 'String' within parent 'Device' (/listDevices/items[4]/entryName)"
    },
    {
      path: [Array],
      locations: null,
      message: "Cannot return null for non-nullable type: 'String' within parent 'Device' (/listDevices/items[5]/entryName)"
    },
    {
      path: [Array],
      locations: null,
      message: "Cannot return null for non-nullable type: 'String' within parent 'Device' (/listDevices/items[6]/entryName)"
    },
    {
      path: [Array],
      locations: null,
      message: "Cannot return null for non-nullable type: 'String' within parent 'Device' (/listDevices/items[7]/entryName)"
    },
    {
      path: [Array],
      locations: null,
      message: "Cannot return null for non-nullable type: 'String' within parent 'Device' (/listDevices/items[8]/entryName)"
    },
    {
      path: [Array],
      locations: null,
      message: "Cannot return null for non-nullable type: 'String' within parent 'Device' (/listDevices/items[9]/entryName)"
    },
    {
      path: [Array],
      locations: null,
      message: "Cannot return null for non-nullable type: 'String' within parent 'Device' (/listDevices/items[10]/entryName)"
    },
    {
      path: [Array],
      locations: null,
      message: "Cannot return null for non-nullable type: 'String' within parent 'Device' (/listDevices/items[11]/entryName)"
    },
    {
      path: [Array],
      locations: null,
      message: "Cannot return null for non-nullable type: 'String' within parent 'Device' (/listDevices/items[12]/entryName)"
    },
    {
      path: [Array],
      locations: null,
      message: "Cannot return null for non-nullable type: 'String' within parent 'Device' (/listDevices/items[13]/entryName)"
    },
    {
      path: [Array],
      locations: null,
      message: "Cannot return null for non-nullable type: 'String' within parent 'Device' (/listDevices/items[14]/entryName)"
    },
    {
      path: [Array],
      locations: null,
      message: "Cannot return null for non-nullable type: 'String' within parent 'Device' (/listDevices/items[15]/entryName)"
    },
    {
      path: [Array],
      locations: null,
      message: "Cannot return null for non-nullable type: 'String' within parent 'Device' (/listDevices/items[16]/entryName)"
    },
    {
      path: [Array],
      locations: null,
      message: "Cannot return null for non-nullable type: 'String' within parent 'Device' (/listDevices/items[17]/entryName)"
    },
    {
      path: [Array],
      locations: null,
      message: "Cannot return null for non-nullable type: 'String' within parent 'Device' (/listDevices/items[18]/entryName)"
    },
    {
      path: [Array],
      locations: null,
      message: "Cannot return null for non-nullable type: 'String' within parent 'Device' (/listDevices/items[19]/entryName)"
    },
    {
      path: [Array],
      locations: null,
      message: "Cannot return null for non-nullable type: 'String' within parent 'Device' (/listDevices/items[20]/entryName)"
    },
    {
      path: [Array],
      locations: null,
      message: "Cannot return null for non-nullable type: 'String' within parent 'Device' (/listDevices/items[21]/entryName)"
    },
    {
      path: [Array],
      locations: null,
      message: "Cannot return null for non-nullable type: 'String' within parent 'Device' (/listDevices/items[22]/entryName)"
    },
    {
      path: [Array],
      locations: null,
      message: "Cannot return null for non-nullable type: 'String' within parent 'Device' (/listDevices/items[23]/entryName)"
    },
    {
      path: [Array],
      locations: null,
      message: "Cannot return null for non-nullable type: 'String' within parent 'Device' (/listDevices/items[24]/entryName)"
    },
    {
      path: [Array],
      locations: null,
      message: "Cannot return null for non-nullable type: 'String' within parent 'Device' (/listDevices/items[25]/entryName)"
    },
    {
      path: [Array],
      locations: null,
      message: "Cannot return null for non-nullable type: 'String' within parent 'Device' (/listDevices/items[26]/entryName)"
    },
    {
      path: [Array],
      locations: null,
      message: "Cannot return null for non-nullable type: 'String' within parent 'Device' (/listDevices/items[27]/entryName)"
    },
    {
      path: [Array],
      locations: null,
      message: "Cannot return null for non-nullable type: 'String' within parent 'Device' (/listDevices/items[28]/entryName)"
    }
  ]
}

Expected behavior
it must give me the
result {
  data: {
    listDevices: {
      items: [Array],
      nextToken: '****'
    }
  }
}

This kind of response. on every iteration.
Reproduction steps

add any field with non-nullable character(!) i.e entryName : String!
use amplify push
update the dynamoDB by using below code

const result = await API.graphql({
    query: listDevices,
  });
  // console.log(result.data.listDevices.items.length);
  for await (const item of result.data.listDevices.items) {
    const updateRow = await API.graphql({
      query: updateDevice,
      variables: {
        input: {
          id: item.id,
          entryName: "",
        },
      },
    });
    // console.log("data", updateRow.data.updateDevice);
  }

try to fetch the updated listDevices query.

GraphQL schema(s)

# Put schemas below this line
type Device @model @auth(rules: [{ allow: public }]) {
  id: ID!
  entryName: String!
}

Project Identifier
No response
Log output

# Put your logs below this line

Additional information
No response

Hey @Manish-Kini-Solvative :wave: thanks for raising this! From your post it appears you will need to update all existing records to compensate for the new non-nullable field entryName. In your snippet to update all existing records, is that also using the nextToken to iterate and update the existing records to include an some string value?
If the update snippet is failing due to the default listDevices query attempting to select and retrieve entryName, which might be null for existing records, you can write a custom GraphQL query to fetch all records by ID, and update accordingly.

Hi 👋 Closing this as we have not heard back from you. If you are still experiencing this issue and in need of assistance, please feel free to comment and provide us with any information previously requested by our team members so we can re-open this issue and be better able to assist you.
Thank you!


Updated setup.py

Fixes #17

Coverage remained the same at 100.0% when pulling 7b73ce56030edc6e684e0fd5d7ae7ef64ab3e647 on setting-up into f35789f8c9dac78c735f607a714b1b9a28c6c909 on master.

Coverage remained the same at 100.0% when pulling 7b73ce56030edc6e684e0fd5d7ae7ef64ab3e647 on setting-up into f35789f8c9dac78c735f607a714b1b9a28c6c909 on master.

Coverage remained the same at 100.0% when pulling a33c595f9cf5a492eaad703fb715181b78b0e763 on setting-up into f35789f8c9dac78c735f607a714b1b9a28c6c909 on master.


Windows 8.1/10 support

https://technet.microsoft.com/en-ca/library/dn594399.aspx - WIMBoot Overview
https://technet.microsoft.com/en-ca/library/dn621983.aspx - Create WIMBoot Images

Windows image file boot (WIMBoot) lets you set up a PC so that it runs directly from a compressed Windows image file (WIM file).

Source: http://labalec.fr/erwan/?p=1078
With Windows 8.1/10, it's now possible to boot a full system from WIMBoot instead of just an install image. Seems like it might be possible to do this over a network as well.
Any thoughts/attempts yet?
Related: #8

Still need to test this before merging:
https://github.com/antonym/netboot.xyz/pull/105

Thanks for the update, this looks great!

This is now merged, hopefully this provides some usefulness.


chore(deps): update terraform-module

This PR contains the following updates:

Package
Type
Update
Change

terraform-ibm-modules/cos/ibm (source)
module
minor
7.3.2 -> 7.4.1

terraform-ibm-modules/resource-group/ibm (source)
module
patch
1.1.4 -> 1.1.5

terraform-ibm-modules/transit-gateway/ibm (source)
module
patch
2.4.1 -> 2.4.2

Release Notes

terraform-ibm-modules/terraform-ibm-cos (terraform-ibm-modules/cos/ibm)
v7.4.1
Compare Source
Bug Fixes

extend the required terraform version to < 1.7 (#541) (a75748c)

v7.4.0
Compare Source
Features

added new outputs bucket_region, cos_instance_name and cos_instance_crn (#540) (c6d7455)

terraform-ibm-modules/terraform-ibm-resource-group (terraform-ibm-modules/resource-group/ibm)
v1.1.5
Compare Source
Bug Fixes

extend the required terraform version to < 1.7 (#581) (5552c65)

terraform-ibm-modules/terraform-ibm-transit-gateway (terraform-ibm-modules/transit-gateway/ibm)
v2.4.2
Compare Source
Bug Fixes

extend the required terraform version to < 1.7 (#466) (bbd304a)

Configuration
📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.

[ ] If you want to rebase/retry this PR, check this box

This PR has been generated by Renovate Bot.

/run pipeline

/run pipeline

:tada: This PR is included in version 7.18.0 :tada:
The release is available on GitHub release
Your semantic-release bot :package::rocket:


fix: re-add accordion animation

Overview

Re-adds the animation to accordions opening & closing

PR Checklist

[x] Related to JIRA ticket: GM-136
[x] I have run this code to verify it works
[ ] This PR includes unit tests for the code change

🚀 Styleguide deploy preview ready!https://5fff26cc01c26b00ecf6ed4d--gamut-preview.netlify.appDeploy Logs

🚀 Styleguide deploy preview ready!https://5fff26cc01c26b00ecf6ed4d--gamut-preview.netlify.appDeploy Logs

📬Published Alpha Packages:@codecademy/gamut-illustrations@0.4.11-alpha.fec587.0@codecademy/gamut-labs@7.14.2-alpha.fec587.0@codecademy/gamut@19.11.7-alpha.fec587.0<EMAIL_ADDRESS>
📬Published Alpha Packages:@codecademy/gamut-illustrations@0.4.11-alpha.fec587.0@codecademy/gamut-labs@7.14.2-alpha.fec587.0@codecademy/gamut@19.11.7-alpha.fec587.0<EMAIL_ADDRESS>
🚀 Styleguide deploy preview ready!https://6011b60993030b8a74615386--gamut-preview.netlify.appDeploy Logs

🚀 Styleguide deploy preview ready!https://6011b60993030b8a74615386--gamut-preview.netlify.appDeploy Logs


'lab issue note' command fails with "{message: 404 Not found}"

'lab issue note' commands are failing with
[prarit@prarit kernel-test]$ ~/git-kernel/github/lab/lab issue note 1
2020/10/05 15:28:57 issue_note.go:56: POST https://gitlab.com/api/v4/projects/20544978/issues/1/notes: 404 {message: 404 Not found}
Bisect points me at:
[prarit@prarit lab]$ git bisect good
bb4aeefc9ef227dbcd9d8ad9068e22a2de1b1420 is the first bad commit
commit bb4aeefc9ef227dbcd9d8ad9068e22a2de1b1420
Author: Bruno Meneguele<EMAIL_ADDRESS>Date:   Mon Sep 28 12:29:14 2020 -0300

    root: fix default branch remote discovery

    The default branch (master) remote was never being actually set to
    'forkedFromRemote', since the conditional was not being met in the current
    code state.  This patch change the initialization value for that and also
    changes the order of things being set, so we have a clear precedence order.

    Signed-off-by: Bruno Meneguele<EMAIL_ADDRESS>
 cmd/root.go | 31 +++++++++++++++++++------------
 1 file changed, 19 insertions(+), 12 deletions(-)

This could be a fault of mine for the weird way I have my remotes labelled.  I'll switch to the normal gitlab standard of prarit & upstream and see what happens.

Yeah.  It's my fault.
P.


How to stop the server through code

Hi,
I want to know how to stop server by code?
Does it provide a function like stop ()?

Duplicate of https://github.com/pallets/werkzeug/issues/1752, see docs for how to manage a process https://werkzeug.palletsprojects.com/en/2.2.x/serving/#shutting-down-the-server


1.0.0 Release

follow serg's release instructions:

update requirements, maintainer names, python 3.7 classifier in setup.py and
add giddy and geopandas in requirements.txt
add and run gitcount.ipynb
create CHANGELOG.md
set version number to 1.0.0 in setup.py

Merging this in order to finish the release after all checks have passed.


Add Nginx Component for Service Forwarding

Description
Add Nginx Component for Service Forwarding
Issues
Customers needs: expose only one port on AWS server.
Type of change
List the type of change like below. Please delete options that are not relevant.

[ ] Bug fix (non-breaking change which fixes an issue)
[x] New feature (non-breaking change which adds new functionality)
[ ] Breaking change (fix or feature that would break existing design and interface)
[ ] Others (enhancement, documentation, validation, etc.)

Dependencies
None
Tests
Local tested.

Please add e2e test.

The test should be triggered in ChatQnA E2E test when the changed has been applied in ChatQnA.


Komoot geocode and reverse, osm reverse, multiple queries

Hi!
I added support for Komoot (https://photon.komoot.de/) which uses Photon and official OSM reverse.
I also added support for multiple results for Komoot, Mapzen, OSM, and ArcGIS.
It works as follows. This is the result of some experimentation and will be finalized and cleaned up. I setup a pull request so you can weigh in and track changes easier. Do not merge this yet!!:

You pass through "result" in each geocoder.XXX("London", result = 5). This returns the "5th" result only.
In each of the supported geocoders in the "geocode" direction, there's a "next" function which describes at which key of the result, how the multiple results are stored as a list.
The connection is made once, with the result number specified being returned.
Each result is iterated over. (Line 126 of base.py). If that cannot be done, it falls back to the old method for the unsupported geocoders.

Caveats:

"Debug" no longer works
Multiple queries are made against the geocoding service. Be aware of this. It works fine for low volume or local servers.
The iteration over each result can be slow. This will be changed so that only the last result will be fetched. It will be faster this way.

Reference to Travis CI testing, most of the error testing is Pep8 issues and not importing SQLAlchemy.
https://travis-ci.org/DenisCarriere/geocoder/jobs/89872112
To run local tests on your machine to do the following:
pip install -r requirements-dev.txt

py.test tests --doctest-modules --pep8 geocoder -v --cov geocoder --cov-report term-missing

Awesome, I have a few other tasks to attend to but I will definitely ensure Python 3 compatibility. And thanks for the heads up about the Travis testing.

No worries :) It's a good tool for testing, I use it all the time!


Pip install for the python client

Description
Make the python client "pip-installable"
Justification
Users should be able to easily pull down the python client for rapid testing and usage. This will also simplify the usage of the SILC python client within the infrastructure library.
Implementation Strategy
Most likely, there will need to be some custom build step for the silc client. We currently build the client through a command in the makefile make pyclient. This will need to be called during the pip install. For an example of how to do this, see how I did this for Arkouda https://github.com/mhmerrill/arkouda/pull/153

pip install done. Currently we have to do "manual" pip installs, so future work my be to automate the installation of dependencies.


metrics: Add remote networking jitter test

Add remote networking jitter test using swarm and iperf3.
Fixes #699
Signed-off-by: Gabriela Cervantes<EMAIL_ADDRESS>

@iphutch could you please review this? thanks

lgtm


Set up React js environment

Hello!
in this pull request, we just installed and prepared the environment ready for React js.
Kindly have a look and let us know if anything needs improvement.
best regards 🎊 .
Project requirements
First make sure that you have everything installed on your machine:

Getting Started With React On Linux
How to create a React application on Windows OS
Getting Started With React on MacOS - Steps
Installing React on WSL/UBUNTU
The easiest way to create a React application is using Create React App (CRA) and following the instructions in this guide.

The application should run in the browser without errors.

Hey
dear @vickymarz thanks alot for the great review.
I just made some updates in the file as requested.
best regards

hey, @vickymarz .
what's wront ?
I just changed the file as requested.
why do you keep send the same review ?

hey, @vickymarz . what's wront ?
I just changed the file as requested. why do you keep send the same review ?

Hi @chiztechnology kindly delete the contents of your current readme file and replace it with the contents on the following link  Microverse readme template >>. Also, remember to customize the content of your new readme file to your project.

Of course the readme file grows as the project grows too ! but I don’t
understand how you can set the project invalid without specifying why ?
This is the exact MICROVERSE readme template (missing only content table
and some unnecessary sections for this project ).
Thank you for your review; but I don’t find it detailed enough.
On Wed, 18 Jan 2023 at 23:30, Felix Ouma @.***> wrote:

hey, @vickymarz https://github.com/vickymarz . what's wront ?
I just changed the file as requested. why do you keep send the same review
?
[image: Screenshot 2023-01-18 at 22 52 03]
https://user-images.githubusercontent.com/68948316/213292412-732b8bb7-f0ff-4f34-af93-45d373cf9ffe.png [image:
Screenshot 2023-01-18 at 22 52 09]
https://user-images.githubusercontent.com/68948316/213292240-8f959645-2d2c-4036-91d8-56c3e91f18b5.png
Hi @chiztechnology https://github.com/chiztechnology kindly delete the
contents of your current readme file and replace it with the contents on
the following link Microverse readme template >>
https://github.com/microverseinc/readme-template. Also, remember to
customize the content of your new readme file to your project.
—
Reply to this email directly, view it on GitHub
https://github.com/chiztechnology/get-started-with-react/pull/2#issuecomment-1396112361,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/AQOBCXAGHT3M4XATLZ6SJGTWTBOHRANCNFSM6AAAAAAT7P2VPM
.
You are receiving this because you were mentioned.Message ID:
@.***>

@chiztechnology, before writing code, its very important for your GitHub repository to be professional.
A recruiter will check the professionalism of your GitHub repo even before checking your code, hence why you were taught how to make your repo professional in Microverse.
While creating a react app, react also creates a readme for you, but then, the readme is not profession, hence why microverse provided a highly professional readme template for you to use which is better than the react generated template.
All you need do was to delete all the content of the readme, and replace with the new microverse readme.
Of course before you embark on a project, you would have known the initial scope of your website so making it easy and compulsory to customize the template by adding your information as regards your project.
As your project grows, you can always edit your readme.

Hello dear !
Thank you for your email. Now I feel more comfortable writing code !
Sorry it’s also my fault I didn’t figure out that creating react all will
erase my origin readme file and replace it with the REACT readme file.
I’ll do my best to improve my project and take your suggestions into
consideration.
Best regards
On Thu, 19 Jan 2023 at 09:47, Victor Ebube Okoroji @.***>
wrote:

@chiztechnology https://github.com/chiztechnology, before writing code,
its very important for your GitHub repository to be professional.
A recruiter will check the professionalism of your GitHub repo even before
checking your code, hence why you were taught how to make your repo
professional in Microverse.
While creating a react app, react also creates a readme for you, but then,
the readme is not profession, hence why microverse provided a highly
professional readme template for you to use which is better than the react
generated template.
All you need do was to delete all the content of the readme, and replace
with the new microverse readme.
Of course before you embark on a project, you would have known the initial
scope of your website so making it easy and compulsory to customize the
template by adding your information as regards your project.
As your project grows, you can always edit your readme.
—
Reply to this email directly, view it on GitHub
https://github.com/chiztechnology/get-started-with-react/pull/2#issuecomment-1396562480,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/AQOBCXHOFR52XAMTM34A2XDWTDWSDANCNFSM6AAAAAAT7P2VPM
.
You are receiving this because you were mentioned.Message ID:
@.***>

@chiztechnology good luck 👍🏽

My pleasure. Again sorry about yesterday! I was not in good shape after
seeing multiple invalid reviews
On Thu, 19 Jan 2023 at 09:52, Victor Ebube Okoroji @.***>
wrote:

@chiztechnology https://github.com/chiztechnology good luck 👍🏽
—
Reply to this email directly, view it on GitHub
https://github.com/chiztechnology/get-started-with-react/pull/2#issuecomment-1396566467,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/AQOBCXDGEDDHDWM4CCUVJRDWTDXEBANCNFSM6AAAAAAT7P2VPM
.
You are receiving this because you were mentioned.Message ID:
@.***>

Hi @chiztechnology,
While you made a great effort in this project, unfortunately, I cannot proceed to review your code.
❌ Invalid Code Review Request
You have submitted a project, that does not check for linters, 😨, Kindly try to fix this issue and request a review again 🙏
Your Code Review Request will be marked as invalid in your Dashboard, so please submit a new one once you are ready 🙏
Cheers and Happy coding!👏👏👏
Feel free to leave any questions or comments in the PR thread if something is not 100% clear.
Please, remember to tag me in your question so I can receive the notification.
Please, do not open a new Pull Request for re-reviews. You should use the same Pull Request submitted for the first review, either valid or invalid unless it is requested otherwise.
Invalid Code Review Request does not count into the code reviews limit.


Reserved compressed instructions do not trigger illegal instruction exception

Describe the bug
When we hit the core with a reserved compressed instruction it doesn't trigger an illegal instruction exception.
This behavior in the RISCV spec is undefined/up to the implementer.
RISCV spec Vol I chapter 2.2.

From what I can gather from the non-compressed instruction behavior when the decoder hits reserved/unspecified space an illegal instruction exception is indeed triggered.
Hence the assumption that this is unintended behavior.
To Reproduce
This is the randomized code stream from riscvDV.
    42c2:	01a212a3          	sh	s10,5(tp) # 5 <_start+0x5>
    42c6:	00009e7d          	.word	0x00009e7d
                  .4byte 0x9e7d # kReservedCompressedInstr kReservedC1
                  lh           s11, -43(t1)
    42ca:	fd531d83          	lh	s11,-43(t1)

The ref vs dut comparison showing that the ref takes an illegal instruction trap, but the dut just rolls on and tries to execute the undefined instruction.
Warning (RISCV_UDEC) CPU 'refRoot/cpu' 0x000042c6 9e7d     undef: Undecoded instruction
Info (IDV) Instruction executed prior to mismatch '0x42c2(main_113_0_t+39e): 01a212a3 sh      x26,5(x4)'
Error (IDV) PC mismatch (HartId:0, PC:0x0000eed4 mtvec_handler+0):
Error (IDV) Mismatch 0>
Error (IDV)   . dut:0x000042c6 main_113_0_t+3a2
Error (IDV)   . ref:0x0000eed4 mtvec_handler+0
Error (IDV) Insn. bit pattern mismatch (HartId:0, PC:0x0000eed4 mtvec_handler+0):
Error (IDV) Mismatch 1>
Error (IDV)   . dut:9e7d     undef
Error (IDV)   . ref:12f1     addi    x5,x5,-4
Error (IDV) GPR register value mismatch (HartId:0, PC:0x0000eed4 mtvec_handler+0):
Error (IDV) Mismatch 2> GPR x5
Error (IDV)   . dut:0x0001cce4 (not updated)
Error (IDV)   . ref:0x0001cce0
Error (IDV) tb.riscv_tb.idv_trace2api.state_compare @ 1316380.00 ns: MISMATCH

Expected behavior
From the behavior of the rest of the core I would expect the reserved instruction to trip an illegal instruction, I could be wrong though.
Screenshots
NA
Environment:

OS: RHEL 7
GCC Version 13.2
Libraries used newlib

Hardware:

Hardware version (<IP_ADDRESS>) - patched with submitted bug fixes

Additional context
0x9E7D
1001_1110_0111_1101
OP: 01 -> CB, CI, CJ, or CS type instructions
funct3: 100 ->

c.srli, c.srai, c.andi  both are defined as funct3 100_x00/x01/x10
c.and/or/xor/sub which are defined as funct3 100_01111/01110/01101/01100
expanding funct3 to match the extended decoding we get:
100_111 where 111/11100 falls outside the 2 MSBs being x0 or 01 as the 2 MSBs are 11.

Looking at the compressed instruction decoder OP = "01" we get:
when others => -- 100: C.SRLI, C.SRAI, C.ANDI, C.SUB, C.XOR, C.OR, C.AND, reserved
In here we only check bits 11:10 ignoring bit 12
case ci_instr16_i(11 downto 10) is
From a quick handy decoder we get:

Where it seems that bit 12 for non c.srli/c.srai/c.andi we assume its an alu operation
when others => -- "11" = register-register operation
If we want to generate and illegal instruction here we should add:
                if (ci_instr16_i(12) = '1') then -- reserved instruction space
                  illegal <= '1';
                end if;

from the c.srli/c.srai decoding path.

I do have small local patch that fixes the issue that I can quickly create a PR for. Just want to be sure we agree on the expected behavior as it is undefined.

Hey @mikaelsky

Just want to be sure we agree on the expected behavior as it is undefined.

One of the core's core principles (😅) is the trapping on any kind of illegal, unsupported or malformed instruction words. So yeah, we should close this instruction decoding loophole.

I do have small local patch that fixes the issue that I can quickly create a PR for.

Your fix looks good. So, go for it! :+1:

PR created.

Note: the fix passes a couple of seeds of our randomly generated riscvDV undefined compressed instruction test so seems good.


Create cup.txt

Official website is https://www.cup.ac.kr/main.do
The email domain is student.cup.ac.kr

@andwecrawl 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.


I can't read the Value when use int8_t stream_sensor_data_forced_mode(struct bme280_dev *dev)

hello., when i use the func ( int8_t stream_sensor_data_forced_mode(struct bme280_dev *dev) ),it's allways retrun -1(BME280_E_NULL_PTR);but i init the sensor is ok. i can read out the calib_data, Can you help me?

Why are you using address 0xEC? No BME280 is shipped with that ID.
Are the calibration values you're getting anywhere near the attached image? Possible that you're reading data from a different sensor at address 0xEC?


verify_headless_installation error

Following every things for installation,  poping
AttributeError: 'NoneType' object has no attribute 'set_shader' error when running python -m metadrive.examples.verify_headless_installation

Ahh, it suggests that there is something wrong with your driver or OpenGL setting. Could you take a look at this question? It might be helpful: https://github.com/metadriverse/metadrive/issues/632

Ahh, it suggests that there is something wrong with your driver or OpenGL setting. Could you take a look at this two questions? they may be helpful: #632 and #334

Thx, I have checked multiple times, the problem can be narrowed down to something related to monitor (successful verfied on another machine with monitor). I'm wondering if ur guys can provide tutorials for those user develop on server without monitor, e.g. whats kind of dependencies are needed, or a docker version. That would help a lot :)


Crash when viewing full threads

The app keeps crashing when I drill into a thread.
Lumia Icon, Denim update.

I bet this is only happening when the app resumes back to a comment thread, right?

No. It occurred a few times when initially opening the full thread. I opened it, saw it flash and then the app crashed.
-----Original Message-----
From: "Nicholas Narsing"<EMAIL_ADDRESS>Sent: 3/28/2015 11:29 PM
To: "soren121/yodel"<EMAIL_ADDRESS>Cc: "Paul Summers"<EMAIL_ADDRESS>Subject: Re: [yodel] Crash when viewing full threads (#80)
I bet this is only happening when the app resumes back to a comment thread, right?
—
Reply to this email directly or view it on GitHub.

Okay, I just managed to reproduce that bug. I'll have it fixed in a few hours.
Sent from my Windows Phone
-----Original Message-----
From: "Paul Summers"<EMAIL_ADDRESS>Sent: 3/29/2015 8:20 AM
To: "soren121/yodel"<EMAIL_ADDRESS>Cc: "Nicholas Narsing"<EMAIL_ADDRESS>Subject: Re: [yodel] Crash when viewing full threads (#80)
No. It occurred a few times when initially opening the full thread. I opened it, saw it flash and then the app crashed.
-----Original Message-----
From: "Nicholas Narsing"<EMAIL_ADDRESS>Sent: 3/28/2015 11:29 PM
To: "soren121/yodel"<EMAIL_ADDRESS>Cc: "Paul Summers"<EMAIL_ADDRESS>Subject: Re: [yodel] Crash when viewing full threads (#80)
I bet this is only happening when the app resumes back to a comment thread, right?
—
Reply to this email directly or view it on GitHub.
—
Reply to this email directly or view it on GitHub.

Aaaaaand I haven't been able to reproduce it while attached to the debugger. Argh! I'll get it eventually.
How long have you been using Yodel? Did it crash before the most recent update, v<IP_ADDRESS> from last Wednesday?

Just installed it over the weekend. Haven't been using it a ton but this bug popped up pretty quickly.
-----Original Message-----
From: "Nicholas Narsing"<EMAIL_ADDRESS>Sent: 3/30/2015 1:09 PM
To: "soren121/yodel"<EMAIL_ADDRESS>Cc: "Paul Summers"<EMAIL_ADDRESS>Subject: Re: [yodel] Crash when viewing full threads (#80)
Aaaaaand I haven't been able to reproduce it while attached to the debugger. Argh! I'll get it eventually.
How long have you been using Yodel? Did it crash before the most recent update, v<IP_ADDRESS> from last Wednesday?
—
Reply to this email directly or view it on GitHub.

To help identify the issue, I added crash reporting to the app. You'll get an update in a couple hours that has this feature. Hopefully it'll help me figure out what's going on here!

There's a new update out, v<IP_ADDRESS>, that should fix this particular crash permanently. Can you test it out and report back in a day or so?

It hasn't come through yet but I'll start playing with it again once it does.
-----Original Message-----
From: "Nicholas Narsing"<EMAIL_ADDRESS>Sent: 3/31/2015 7:55 PM
To: "soren121/yodel"<EMAIL_ADDRESS>Cc: "Paul Summers"<EMAIL_ADDRESS>Subject: Re: [yodel] Crash when viewing full threads (#80)
There's a new update out, v<IP_ADDRESS>, that should fix this particular crash permanently. Can you test it out and report back in a day or so?
—
Reply to this email directly or view it on GitHub.

I got a couple of crashes this morning … but I was in the car and I think the network might have been spotty. I was actually just resuming the app, not necessarily going into a thread.
Sent from Windows Mail
From: Paul Sr
Sent: Tuesday, March 31, 2015 8:51 PM
To: soren121/yodel
It hasn't come through yet but I'll start playing with it again once it does.
From: Nicholas Narsing
Sent: 3/31/2015 7:55 PM
To: soren121/yodel
Cc: Paul Summers
Subject: Re: [yodel] Crash when viewing full threads (#80)
There's a new update out, v<IP_ADDRESS>, that should fix this particular crash permanently. Can you test it out and report back in a day or so?
—
Reply to this email directly or view it on GitHub.

Resume crashes are a separate thing that I'll be fixing today. I'm 99.99% sure I've fixed the particular crash that this report pertains to, though.


[Docs]: Displaying Data Rehaul

Is there an existing issue for this?

[X] I have searched the existing issues

Documentation Link
https://docs.appsmith.com/core-concepts/data-access-and-binding/displaying-data-read
Discord/slack/intercom Link
No response
Describe the problem and improvement.
Update content

@Pranay105 - Could you please add Sprint and estimates to the ticket?


Error: Cannot find module 'cookie-parser'

app (everything/anything) crashes upon start :(
I did a pull on main, did a "npm install", then "gulp dev" and got
[BS] Proxying: http://localhost:3001
[BS] Now you can access your site through the following addresses:
[BS] Local URL: http://localhost:3000
[BS] External URL: http://<IP_ADDRESS>:3000
module.js:338
    throw err;
          ^
Error: Cannot find module 'cookie-parser'
    at Function.Module._resolveFilename (module.js:336:15)
    at Function.Module._load (module.js:278:25)
    at Module.require (module.js:365:17)
    at require (module.js:384:17)
    at Object.<anonymous> (/Users/admin/git/loklak_webclient/server/index.js:5:20)
    at Module._compile (module.js:460:26)
    at Object.Module._extensions..js (module.js:478:10)
    at Module.load (module.js:355:32)
    at Function.Module._load (module.js:310:12)
    at Function.Module.runMain (module.js:501:10)
[22:41:01] [nodemon] app crashed - waiting for file changes before starting...

@Orbiter You need to do the npm install in two different location, firstly in the loklak_webclient folder and again in the server/ folder.

ah ok, please add such information to the README, just did that in https://github.com/loklak/loklak_webclient/commit/fab0e2eb125fe677e1db6c9f98bfa8faab1e0d20

Facing issues while initializing MEAN project with,
Error: Cannot find module 'cookie-parser'


Go tests are picking up API management test and failing due to dependency

Describe the bug: . Go tests are picking up API management test and failing due to dependency
Temporary fix will be to move the test into a temporary directory in the environment.  Once there is a release process and testing enhancements, the test will be moved back and fixed.

@andrebriggs @jmspring I think we can close this issue as the current APIM environment needs to be upgraded to terraform 0.12 and the latest provider 2.6

agreed


Stack Trace when refreshing token

When trying to retrieve an access token via the twitch callback I am getting a key error with the following stack trace.  Not sure where to go from here on this one (also the code has been redacted from the logs).
Environment:

Request Method: GET
Request URL: http://tau.sean.dev/twitch-callback/?code=[CODE]&scope=bits%3Aread+channel%3Aread%3Aredemptions+channel%3Aread%3Ahype_train+channel_subscriptions

Django Version: 3.1.7
Python Version: 3.8.10
Installed Applications:
('django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'constance.backends.database',
 'django_extensions',
 'corsheaders',
 'channels',
 'rest_framework',
 'rest_framework.authtoken',
 'django_filters',
 'tau.users',
 'tau.core.apps.CoreConfig',
 'tau.twitchevents.apps.TwitcheventsConfig',
 'tau.streamers.apps.StreamersConfig',
 'django_nose')
Installed Middleware:
('corsheaders.middleware.CorsMiddleware',
 'django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware')

Traceback (most recent call last):
  File "/usr/local/lib/python3.8/site-packages/asgiref/sync.py", line 458, in thread_handler
    raise exc_info[1]
  File "/usr/local/lib/python3.8/site-packages/django/core/handlers/exception.py", line 38, in inner
    response = await get_response(request)
  File "/usr/local/lib/python3.8/site-packages/django/core/handlers/base.py", line 233, in _get_response_async
    response = await wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/usr/local/lib/python3.8/site-packages/asgiref/sync.py", line 423, in __call__
    ret = await asyncio.wait_for(future, timeout=None)
  File "/usr/local/lib/python3.8/asyncio/tasks.py", line 455, in wait_for
    return await fut
  File "/usr/local/lib/python3.8/concurrent/futures/thread.py", line 57, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/usr/local/lib/python3.8/site-packages/asgiref/sync.py", line 462, in thread_handler
    return func(*args, **kwargs)
  File "/code/./tau/core/views.py", line 167, in process_twitch_callback_view
    config.TWITCH_ACCESS_TOKEN = response_data['access_token']

Exception Type: KeyError at /twitch-callback/
Exception Value: 'access_token'

This is happening right after TAU is attempting to get an access_token from the Twitch oauth2 endpoint.  The redirect page you were at right before this, required a Twitch App ID (or Client ID), a callback URI (which is properly being hit), and a scope (which is also being passed properly), so we know those values are all good.
The call to the API that is returning without an access_token requires the Twitch App Id, the code variable you redacted, and the TWITCH_CLIENT_SECRET value from your .env file.  So it appears that the most likely cause is either a missing, or a bad TWITCH_CLIENT_SECRET value in your .env file.  I'd recommend that you go to the twitch dev panel (where you originally set up the wwsean08-tau app), and regenerate your client secret, then paste that value back into your .env file.  Then run
docker-compose up --build to ensure the new environment variables are set.

Fixed- @wwsean08 was using and nginx reverse proxy, and had to tweak some port settings.

For anyone that looks into this later, because of my reverse proxy I needed to change tau/config/common.py commenting out the following lines:
    BASE_URL = f"{PROTOCOL}//{PUBLIC_URL}"

#    if BASE_PORT not in [80, 443]:
#        BASE_URL = BASE_URL + f":{BASE_PORT}"

by commenting out those 2 lines it fixed the issue.


RFC for a docs version selector

An idea how we could do versioning of docs that I think might be sustainable.

In the reference we have a version selector (design TBD)
sidebarReference.json can contain a version now to conditionally include entries
a <VersionCondidion /> component allows to conditionally include content in a doc when APIs change over time

Code quality is very rough. Would probably put the version into the path somewhere, but that needs some more changes.

Replaced by https://github.com/reactjs/react.dev/pull/6814


Request: Slightly more Shock rune automation

If it's possible to add Shock damage from crit as a separate roll for the sake of making dealing the same damage to other targets more streamlined, that would be amazing - I'm not sure how impossible it would be to read a specific roll result from a previous message, and then /r (result) to a new one with the tools available though

Just occurred to me so I'll add it here, the same mechanism would also allow for axe crit spec automation (only difference being the axe crit doesn't double the damage dice)


fix: fetching data from correct storage

Session storage was temporary storage in case of mobile App. Explicitly setting the sessionStorage in app will fix this.