[math] Matrtix multiplication is possibly incorrect

[x] I tested it on latest raylib version from master branch
[x] I checked there is no similar issue already reported
[x] My code has no errors or misuse of raylib

Issue description
I'm writing my own matrix implementation and checking it agains raylib's and I found inconsistency when trying to "unproject" vector. I narrowed it down to MatrixMultiply and did some small tests.
D (own implementation):
mat4 view = mat4.lookAt(vec3(0, 2, 5), vec3(1, 20, 1), vec3(0.5f, 1, 0));
mat4 proj = mat4.perspective(45, 9.0f / 16.0f, 2.0f, 125.0f);
mat4 vpnorm = (view * proj);

Outputs
[1.39, -0.39, -3.90, 3.55, 2.86, 0.08, 1.83, -1.78, -0.17, -1.75, -1.09, -0.88, 0.00, 0.00, -1.00, 0.00]

D raylib:
rl.Matrix view = rm.MatrixLookAt(rl.Vector3(0, 2, 5), rl.Vector3(1, 20, 1), rl.Vector3(0.5f, 1, 0));
rl.Matrix proj = rm.MatrixPerspective(45, 9.0f / 16.0f, 2.0f, 125.0f);
rl.Matrix vpnorm = rm.MatrixMultiply(view, proj);

Outputs
Matrix(1.39085, -0.695423, -2.78169, 15.2993, 1.60993, 0.0847334, 0.783783, -4.08838, 0.0559141, 1.00645, -0.223656, -4.95967, 0.054153, 0.974755, -0.216612, -0.866449)

C:
struct Matrix view = MatrixLookAt((Vector3) {0.0f, 2.0f, 5.0f}, (Vector3) {1.0f, 20.0f, 1.0f}, (Vector3) {0.5f, 1.0f, 0.0f});
struct Matrix proj = MatrixPerspective(45.0, 9.0f / 16.0f, 2.0f, 125.0f);
struct Matrix vpnorm = MatrixMultiply(view, proj);

Outputs
1.39 -0.70 -2.78 15.30
1.61 0.08 0.78 -4.09
0.06 1.01 -0.22 -4.96
0.05 0.97 -0.22 -0.87

My implementation output is different from Raylib's (both in D and C), but I've also tested it with online tools (by printing proj and view matrices and taking their values) and output is
	C1	C2	C3	C4
1	1.4036	-0.3938	-3.9039	3.5409
2	2.871	0.0895	1.8268	-1.7908
3	-0.1595	-1.7363	-1.0966	-0.8954
4	0	0	-1	0

Which is my lib's output with some float inconsistency.
I'm not sure if it's me doing something incorrectly or is it something else.

Have you taken a look at the raymath.h definition of MatrixMultiply(left, right)?  Instead of  (the traditional?) taking inner-products of rows from left and columns from right, it does the reverse.  With Matrix being 4 x 4, the reversal is easy to miss.  (I am assuming the statement that Matrix cells are number-named in column major order is everywhere accurate.)
The column-major scheme seems to be attractive with regard to the graphics geometry application.

its a GL thing... pita really but the thing i like about standards is there are soooo many to choose from....
https://en.wikipedia.org/wiki/Row-_and_column-major_order

Raylib internally stores matrices in row major and I did check raymath header
Row major and column major is only about memory and not how operations go, which should be same everywhere

https://github.com/raysan5/raylib/blob/ed2caa12775da95d3e19ce42dccdca4a0ba8f8a0/src/raylib.h#L220-L225
If you both would look right here you'll see that memory-wise matrix is row major, but naming-wise it's column major
https://github.com/raysan5/raylib/blob/ed2caa12775da95d3e19ce42dccdca4a0ba8f8a0/src/raymath.h#L1624-L1646
And this is the function that is used to pass data into OpenGL, which follows naming order and is column-major
https://github.com/raysan5/raylib/blob/ed2caa12775da95d3e19ce42dccdca4a0ba8f8a0/src/raymath.h#L1261-L1283
The thing itself is in here, but tbh my brain is already mush and I can't compare this function to mine since I have it templated

It's true that the labeling in struct Matrix  is presented in row order and that will be the physical sequence of those fields in the mapping of a Matrix to a linear sequence (a vector) of float cells.  We need to keep in mind that this is a struct and not an array.
The numeric progression of labels m0, m1, ..., m15 is column order.
And this is the alignment that MatrixToFloat() employs for communication with OpenGL, as noted above.
Now, looking at the unrolled computation of MatrixMultiply(left, right), you can see that each inner product m[4*i+j] is of the _i_th column from  left and the _j_th row from right using the column-major labeling.  The results happen to be listed in column major sequence according to the progression of labels, not storage.  In this respect, the use of left and right in computation is reversed from the well-known definition of matrix multiplication.  The question is, why is this choice made instead of the conventional one?
Yes, analyzing these unrolled iterations is hard on the brain.
Since everything seems to work in raylib, either this situation doesn't matter or there is no operation that conflicts with it (e.g., computing inverses and determinants, etc.).

First of all, what does data order has to do with math
Second, if you'd for a second check data I've posted you'd see that there's no similarities aside from [0,0]
Third, in all of my tests I'm printing row major, not column major, that's called consistency

raylib/raymath Matrix are effetively stored in memory in row-major order but all the maths operations are performed considering the matrices as "column-major" (independently of the "row-major" memory layout).
OpenGL expects to receive data as "column-major" and that's what MatrixToFloat() returns.
Afaik, matrix math is correct (computing data as "column-major") but feel free to let me know if you find some issue with OpenGL application.
I agree the comment on the Matrix structure is missleading, considering its row-major memory layout.

The only place i got inconsistency is Vectro3Unproject, haven't looked at opengl render stuff yet, but I'll be sure to do so. If i remember correctly opengl does it's own mat operations in shaders
(also why everyone is so concentrated on data order, it had nothing to do with it)

Vector3Unproject() is probably the most complex one and it has been reviewed several times. In raylib it is only used by GetMouseRay() to unproject mouse position, returning a Ray; it is used in models_mesh_picking example to detect ray collision with 3d meshes. Afaik, it works as expected...
OpenGL computes vertex positions in vertex shader using the provided MVP matrix (modelviewprojection), related code is located in rlgl module.

https://en.wikipedia.org/wiki/Matrix_multiplication#General_properties
Look at the example where, using the raylib notation, A is everywhere 0 except for m2 = 1 and B is 0 everywhere except m1 = 1.   Here, we have only m0, m1, m2 and m3.    (It happens that B is the transpose of A in this instance.)
The raylib MatrixMultiply(A, B) will yield C with 0 everywhere except m3 =1.   That is, it is the Wikipedia result for B x A, not A x B.
See what happens if you switch the order of the operands in your MatrixMultiply.
@al1-ce It is not so much about storage order but about the m_i_ index order and how the computation is expressed in terms of those indexes.  That linearization is column-major by design, no matter what the struct order happens to be.  The mapping from conventional a[i,j] (row index first) is to m[4*j+i] (a column-major mapping).

With all of the raymath matrix functions flattened, unwound, and de-vectored (via the struct labellings), it is difficult to verify that mathematical relationships have been preserved except with some well-crafted test vectors and matrices.  Since the identity matrix is its own transpose (and inverse), it takes more cleverness to expose disparities attributable to the non-commutativity of matrix multiplication.
On the other hand, a deficiency in MatrixMultiply() would not necessarily infect other raymath functions since none of the functions depend on the implementations of any of the others.
A bit messy.  I wonder if the expected performance improvement is noticeable these days.

@raysan5 sorry for tagging, but
I've ran some tests with different implementations and here's my results

Source code
#!/bin/env dub

/++dub.sdl:
name "mattest"
dependency "sily" version="~>1.5.1"
dependency "raylib-d" version="~>4.5.1"
dependency "dvec" version="~>0.0.7"
dependency "gfm" version="~>8.0.6"
dependency "zmath" version="~>0.9.1"
dependency "dlib" version="~>1.2.0"
libs "raylib"
+/

import std.stdio;
import sl = sily.matrix;
import dv = dvec.matrix;
import gf = gfm.math.matrix;
import zm = zmath.matrix;
import dl = dlib.math.matrix;
import rl = raylib;
import rm = raylib.raymath;

void main() {
    writeln("Matrix multiplication test");
    writeln("Libraries used:");
    writeln("    sily - row major, float[H][W]");
    writeln("    dvec - row major, float[H * W]");
    writeln("    gfm - row major, float[H * W]");
    writeln("    zm - row major, float[H][W]");
    writeln("    dlib - column major, float[H * W]");
    writeln("    raylib-d - data row major, names column major, m0-m15");
    float[16] a1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16];
    float[16] a2 = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];
    float[16] a3 = [3.19, 0.00, 0.00, 0.00, 0.00, 1.79, 0.00, 0.00, 0.00, 0.00, -1.03, -4.07, 0.00, 0.00, -1.00, 0.00];
    float[16] a4 = [0.44, -0.22, -0.87, 4.80, 0.90, 0.05, 0.44, -2.28, -0.05, -0.97, 0.22, 0.87, 0.00, 0.00, 0.00, 1.00];
    float[16] a5 = [0.36, 0.00, 2.64, 0.00, 0.00, -0.50, -4.00, 0.00, 0.00, 0.00, -1.08, -4.17, 0.00, 0.00, -1.00, 0.00];
    float[16] a6 = [0.18, 0.00, 0.00, -2.64, 0.00, -0.25, 0.00, 4.00, 0.00, 0.00, -0.04, -1.08, 0.00, 0.00, 0.00, 1.00];
    float[16] a7 = [0.4, -1.0, -12.6, -12.5, 1.8, -3.0, -26.4, -29.2, 3.2, -5.0, -40.1, -45.9, 4.7, -7.0, -53.9, -62.6];
    float[16] a8 = [-39.00, 0.20, 2.40, 0.00, 1.80, -31.12, 15.95, 0.00, 1.60, 16.05, -7.12, 0.00, 0.00, 0.00, 0.00, 1.00];
    writeln("----------------------------------------------------------");
    writeln("Printing basic sequence to check if everything is alligned");
    checkPrint(a1);
    writeln("----------------------------------------------------------");
    writeln("Printing arrays to be used to check multiplication");
    a1.print("a1");
    a2.print("a2");
    a3.print("a3");
    a4.print("a4");
    a5.print("a5");
    a6.print("a6");
    a7.print("a7");
    a8.print("a8");
    writeln("----------------------------------------------------------");
    writeln("a1 * a1");
    checkMat(a1, a1);
    writeln("----------------------------------------------------------");
    writeln("a1 * a2");
    checkMat(a1, a2);
    writeln("----------------------------------------------------------");
    writeln("a2 * a1");
    checkMat(a2, a1);
    writeln("----------------------------------------------------------");
    writeln("a2 * a2");
    checkMat(a2, a2);
    writeln("----------------------------------------------------------");
    writeln("a3 * a4");
    checkMat(a3, a4);
    writeln("----------------------------------------------------------");
    writeln("a4 * a3");
    checkMat(a4, a3);
    writeln("----------------------------------------------------------");
    writeln("a3 * a5");
    checkMat(a3, a5);
    writeln("----------------------------------------------------------");
    writeln("a7 * a8");
    checkMat(a7, a8);
    writeln("----------------------------------------------------------");
    writeln("a6 * a8");
    checkMat(a6, a8);
    writeln("----------------------------------------------------------");
    writeln("a8 * a3");
    checkMat(a8, a3);
    writeln("----------------------------------------------------------");
    writeln("a8 * a1");
    checkMat(a8, a1);
    writeln("----------------------------------------------------------");
    writeln("a1 * a6");
    checkMat(a1, a6);
    writeln("----------------------------------------------------------");
    writeln("a6 * a2");
    checkMat(a6, a2);
    writeln("----------------------------------------------------------");
    writeln("a1 * a5");
    checkMat(a1, a5);
}

void checkMat(float[16] mat1, float[16] mat2) {
    // sily = mat * mat
    // raylib = MatrixMultiply(mat, mat)
    // dvec = mat.mul(mat)
    // gfm = mat * mat
    // zmath = mat * mat
    // dlib = mat * mat

    sl.mat4 slmat1 = mat1;
    sl.mat4 slmat2 = mat2;
    sl.mat4 slout = slmat1 * slmat2;
    slout.buffer.print("sily");

    dv.Mat!(float, 4, 4) dvmat1 = dv.Mat!(float, 4, 4)(mat1);
    dv.Mat!(float, 4, 4) dvmat2 = dv.Mat!(float, 4, 4)(mat2);
    dv.Mat!(float, 4, 4) dvout = dvmat1.mul(dvmat2);
    dvout.data.print("dvec");

    gf.Matrix!(float, 4, 4) gfmat1 = gf.Matrix!(float, 4, 4)(mat1);
    gf.Matrix!(float, 4, 4) gfmat2 = gf.Matrix!(float, 4, 4)(mat2);
    gf.Matrix!(float, 4, 4) gfout = gfmat1 * gfmat2;
    gfout.v.print("gfm");

    zm.Mat4f zmmat1 = zm.Mat4f(mat1);
    zm.Mat4f zmmat2 = zm.Mat4f(mat2);
    zm.Mat4f zmout = zmmat1 * zmmat2;
    zmout.zmArr.print("zmath");

    dl.mat4 dlmat1 = mat1;
    dl.mat4 dlmat2 = mat2;
    dl.mat4 dlout = dlmat1 * dlmat2;
    dlout.dlArr.print("dlib");

    rl.Matrix4 rlmat1 = rlMatrix4(mat1);
    rl.Matrix4 rlmat2 = rlMatrix4(mat2);
    rl.Matrix4 rlout = rm.MatrixMultiply(rlmat1, rlmat2);
    rlout.rlArr.print("raylib");

}

void checkPrint(float[16] mat) {
    sl.mat4 slout = mat;
    slout.buffer.print("sily");

    dv.Mat!(float, 4, 4) dvout = dv.Mat!(float, 4, 4)(mat);
    dvout.data.print("dvec");

    gf.Matrix!(float, 4, 4) gfout = gf.Matrix!(float, 4, 4)(mat);
    gfout.v.print("gfm");

    zm.Mat4f zmout = zm.Mat4f(mat);
    zmout.zmArr.print("zmath");

    dl.mat4 dlout = mat;
    dlout.dlArr.print("dlib");

    rl.Matrix4 rlout = rlMatrix4(mat);
    rlout.rlArr.print("raylib");

}

rl.Matrix4 rlMatrix4(float[16] a) {
    return rl.Matrix(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]);
}

float[16] rlArr(rl.Matrix m) {
    return [
        m.m0, m.m4, m.m8,  m.m12,
        m.m1, m.m5, m.m9,  m.m13,
        m.m2, m.m6, m.m10, m.m14,
        m.m3, m.m7, m.m11, m.m15
    ];
}

float[16] dlArr(dl.mat4 m) {
    float[16] arr;
    float[16] darr = m.arrayof;
    foreach (y; 0..4)
        foreach (x; 0..4)
            arr[y * 4 + x] = darr[x * 4 + y];
    return arr;

}

float[16] zmArr(zm.Matrix!(float, 4) z) {
    float[16] arr = 0;
    foreach (y; 0..4)
        foreach (x; 0..4)
            arr[y * 4 + x] = z[y][x];
    return arr;
}

void print(float[16] arr, string owner) {
    writef("%*s [", 6, owner);
    for (int i = 0; i < 16; ++i) {
        if (i != 15) writef("%.1f, ", arr[i]);
        else writef("%.1f", arr[i]);
    }
    writeln("]");
}

Test results
Matrix multiplication test
Libraries used:
    sily - row major, float[H][W]
    dvec - row major, float[H * W]
    gfm - row major, float[H * W]
    zm - row major, float[H][W]
    dlib - column major, float[H * W]
    raylib-d - data row major, names column major, m0-m15
----------------------------------------------------------
Printing basic sequence to check if everything is alligned
  sily [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0]
  dvec [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0]
   gfm [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0]
 zmath [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0]
  dlib [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0]
raylib [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0]
----------------------------------------------------------
Printing arrays to be used to check multiplication
    a1 [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0]
    a2 [1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0]
    a3 [3.2, 0.0, 0.0, 0.0, 0.0, 1.8, 0.0, 0.0, 0.0, 0.0, -1.0, -4.1, 0.0, 0.0, -1.0, 0.0]
    a4 [0.4, -0.2, -0.9, 4.8, 0.9, 0.1, 0.4, -2.3, -0.1, -1.0, 0.2, 0.9, 0.0, 0.0, 0.0, 1.0]
    a5 [0.4, 0.0, 2.6, 0.0, 0.0, -0.5, -4.0, 0.0, 0.0, 0.0, -1.1, -4.2, 0.0, 0.0, -1.0, 0.0]
    a6 [0.2, 0.0, 0.0, -2.6, 0.0, -0.2, 0.0, 4.0, 0.0, 0.0, -0.0, -1.1, 0.0, 0.0, 0.0, 1.0]
    a7 [0.4, -1.0, -12.6, -12.5, 1.8, -3.0, -26.4, -29.2, 3.2, -5.0, -40.1, -45.9, 4.7, -7.0, -53.9, -62.6]
    a8 [-39.0, 0.2, 2.4, 0.0, 1.8, -31.1, 15.9, 0.0, 1.6, 16.0, -7.1, 0.0, 0.0, 0.0, 0.0, 1.0]
----------------------------------------------------------
a1 * a1
  sily [90.0, 100.0, 110.0, 120.0, 202.0, 228.0, 254.0, 280.0, 314.0, 356.0, 398.0, 440.0, 426.0, 484.0, 542.0, 600.0]
  dvec [90.0, 100.0, 110.0, 120.0, 202.0, 228.0, 254.0, 280.0, 314.0, 356.0, 398.0, 440.0, 426.0, 484.0, 542.0, 600.0]
   gfm [90.0, 100.0, 110.0, 120.0, 202.0, 228.0, 254.0, 280.0, 314.0, 356.0, 398.0, 440.0, 426.0, 484.0, 542.0, 600.0]
 zmath [90.0, 100.0, 110.0, 120.0, 202.0, 228.0, 254.0, 280.0, 314.0, 356.0, 398.0, 440.0, 426.0, 484.0, 542.0, 600.0]
  dlib [90.0, 100.0, 110.0, 120.0, 202.0, 228.0, 254.0, 280.0, 314.0, 356.0, 398.0, 440.0, 426.0, 484.0, 542.0, 600.0]
raylib [90.0, 100.0, 110.0, 120.0, 202.0, 228.0, 254.0, 280.0, 314.0, 356.0, 398.0, 440.0, 426.0, 484.0, 542.0, 600.0]
----------------------------------------------------------
a1 * a2
  sily [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0]
  dvec [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0]
   gfm [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0]
 zmath [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0]
  dlib [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0]
raylib [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0]
----------------------------------------------------------
a2 * a1
  sily [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0]
  dvec [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0]
   gfm [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0]
 zmath [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0]
  dlib [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0]
raylib [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0]
----------------------------------------------------------
a2 * a2
  sily [1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0]
  dvec [1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0]
   gfm [1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0]
 zmath [1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0]
  dlib [1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0]
raylib [1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0]
----------------------------------------------------------
a3 * a4
  sily [1.4, -0.7, -2.8, 15.3, 1.6, 0.1, 0.8, -4.1, 0.1, 1.0, -0.2, -5.0, 0.1, 1.0, -0.2, -0.9]
  dvec [1.4, -0.7, -2.8, 15.3, 1.6, 0.1, 0.8, -4.1, 0.1, 1.0, -0.2, -5.0, 0.1, 1.0, -0.2, -0.9]
   gfm [1.4, -0.7, -2.8, 15.3, 1.6, 0.1, 0.8, -4.1, 0.1, 1.0, -0.2, -5.0, 0.1, 1.0, -0.2, -0.9]
 zmath [1.4, -0.7, -2.8, 15.3, 1.6, 0.1, 0.8, -4.1, 0.1, 1.0, -0.2, -5.0, 0.1, 1.0, -0.2, -0.9]
  dlib [1.4, -0.7, -2.8, 15.3, 1.6, 0.1, 0.8, -4.1, 0.1, 1.0, -0.2, -5.0, 0.1, 1.0, -0.2, -0.9]
raylib [1.4, -0.4, -3.9, 3.5, 2.9, 0.1, 1.8, -1.8, -0.2, -1.7, -1.1, -0.9, 0.0, 0.0, -1.0, 0.0]
----------------------------------------------------------
a4 * a3
  sily [1.4, -0.4, -3.9, 3.5, 2.9, 0.1, 1.8, -1.8, -0.2, -1.7, -1.1, -0.9, 0.0, 0.0, -1.0, 0.0]
  dvec [1.4, -0.4, -3.9, 3.5, 2.9, 0.1, 1.8, -1.8, -0.2, -1.7, -1.1, -0.9, 0.0, 0.0, -1.0, 0.0]
   gfm [1.4, -0.4, -3.9, 3.5, 2.9, 0.1, 1.8, -1.8, -0.2, -1.7, -1.1, -0.9, 0.0, 0.0, -1.0, 0.0]
 zmath [1.4, -0.4, -3.9, 3.5, 2.9, 0.1, 1.8, -1.8, -0.2, -1.7, -1.1, -0.9, 0.0, 0.0, -1.0, 0.0]
  dlib [1.4, -0.4, -3.9, 3.5, 2.9, 0.1, 1.8, -1.8, -0.2, -1.7, -1.1, -0.9, 0.0, 0.0, -1.0, 0.0]
raylib [1.4, -0.7, -2.8, 15.3, 1.6, 0.1, 0.8, -4.1, 0.1, 1.0, -0.2, -5.0, 0.1, 1.0, -0.2, -0.9]
----------------------------------------------------------
a3 * a5
  sily [1.1, 0.0, 8.4, 0.0, 0.0, -0.9, -7.2, 0.0, 0.0, 0.0, 5.2, 4.3, 0.0, 0.0, 1.1, 4.2]
  dvec [1.1, 0.0, 8.4, 0.0, 0.0, -0.9, -7.2, 0.0, 0.0, 0.0, 5.2, 4.3, 0.0, 0.0, 1.1, 4.2]
   gfm [1.1, 0.0, 8.4, 0.0, 0.0, -0.9, -7.2, 0.0, 0.0, 0.0, 5.2, 4.3, 0.0, 0.0, 1.1, 4.2]
 zmath [1.1, 0.0, 8.4, 0.0, 0.0, -0.9, -7.2, 0.0, 0.0, 0.0, 5.2, 4.3, 0.0, 0.0, 1.1, 4.2]
  dlib [1.1, 0.0, 8.4, 0.0, 0.0, -0.9, -7.2, 0.0, 0.0, 0.0, 5.2, 4.3, 0.0, 0.0, 1.1, 4.2]
raylib [1.1, 0.0, -2.7, -10.7, 0.0, -0.9, 4.1, 16.3, 0.0, 0.0, 5.3, 4.4, 0.0, 0.0, 1.0, 4.1]
----------------------------------------------------------
a7 * a8
  sily [-37.6, -171.0, 74.7, -12.5, -117.8, -330.0, 144.4, -29.2, -198.0, -487.4, 213.4, -45.9, -282.1, -646.3, 283.4, -62.6]
  dvec [-37.6, -171.0, 74.7, -12.5, -117.8, -330.0, 144.4, -29.2, -198.0, -487.4, 213.4, -45.9, -282.1, -646.3, 283.4, -62.6]
   gfm [-37.6, -171.0, 74.7, -12.5, -117.8, -330.0, 144.4, -29.2, -198.0, -487.4, 213.4, -45.9, -282.1, -646.3, 283.4, -62.6]
 zmath [-37.6, -171.0, 74.7, -12.5, -117.8, -330.0, 144.4, -29.2, -198.0, -487.4, 213.4, -45.9, -282.1, -646.3, 283.4, -62.6]
  dlib [-37.6, -171.0, 74.7, -12.5, -117.8, -330.0, 144.4, -29.2, -198.0, -487.4, 213.4, -45.9, -282.1, -646.3, 283.4, -62.6]
raylib [-7.6, 26.4, 389.9, 371.5, -4.3, 11.8, 159.3, 154.1, 6.7, -14.1, -158.4, -161.9, 4.7, -7.0, -53.9, -62.6]
----------------------------------------------------------
a6 * a8
  sily [-7.0, 0.0, 0.4, -2.6, -0.4, 7.8, -4.0, 4.0, -0.1, -0.6, 0.3, -1.1, 0.0, 0.0, 0.0, 1.0]
  dvec [-7.0, 0.0, 0.4, -2.6, -0.4, 7.8, -4.0, 4.0, -0.1, -0.6, 0.3, -1.1, 0.0, 0.0, 0.0, 1.0]
   gfm [-7.0, 0.0, 0.4, -2.6, -0.4, 7.8, -4.0, 4.0, -0.1, -0.6, 0.3, -1.1, 0.0, 0.0, 0.0, 1.0]
 zmath [-7.0, 0.0, 0.4, -2.6, -0.4, 7.8, -4.0, 4.0, -0.1, -0.6, 0.3, -1.1, 0.0, 0.0, 0.0, 1.0]
  dlib [-7.0, 0.0, 0.4, -2.6, -0.4, 7.8, -4.0, 4.0, -0.1, -0.6, 0.3, -1.1, 0.0, 0.0, 0.0, 1.0]
raylib [-7.0, -0.1, -0.1, 101.2, 0.3, 7.8, -0.6, -146.5, 0.3, -4.0, 0.3, 67.7, 0.0, 0.0, 0.0, 1.0]
----------------------------------------------------------
a8 * a3
  sily [-124.4, 0.4, -2.5, -9.8, 5.7, -55.7, -16.4, -64.9, 5.1, 28.7, 7.3, 29.0, 0.0, 0.0, -1.0, 0.0]
  dvec [-124.4, 0.4, -2.5, -9.8, 5.7, -55.7, -16.4, -64.9, 5.1, 28.7, 7.3, 29.0, 0.0, 0.0, -1.0, 0.0]
   gfm [-124.4, 0.4, -2.5, -9.8, 5.7, -55.7, -16.4, -64.9, 5.1, 28.7, 7.3, 29.0, 0.0, 0.0, -1.0, 0.0]
 zmath [-124.4, 0.4, -2.5, -9.8, 5.7, -55.7, -16.4, -64.9, 5.1, 28.7, 7.3, 29.0, 0.0, 0.0, -1.0, 0.0]
  dlib [-124.4, 0.4, -2.5, -9.8, 5.7, -55.7, -16.4, -64.9, 5.1, 28.7, 7.3, 29.0, 0.0, 0.0, -1.0, 0.0]
raylib [-124.4, 0.6, 7.7, 0.0, 3.2, -55.7, 28.6, 0.0, -1.6, -16.5, 7.3, -4.1, -1.6, -16.0, 7.1, 0.0]
----------------------------------------------------------
a8 * a1
  sily [-16.4, -52.8, -89.2, -125.6, -10.2, -23.6, -37.0, -50.4, 17.8, 28.3, 38.8, 49.4, 13.0, 14.0, 15.0, 16.0]
  dvec [-16.4, -52.8, -89.2, -125.6, -10.2, -23.6, -37.0, -50.4, 17.8, 28.3, 38.8, 49.4, 13.0, 14.0, 15.0, 16.0]
   gfm [-16.4, -52.8, -89.2, -125.6, -10.2, -23.6, -37.0, -50.4, 17.8, 28.3, 38.8, 49.4, 13.0, 14.0, 15.0, 16.0]
 zmath [-16.4, -52.8, -89.2, -125.6, -10.2, -23.6, -37.0, -50.4, 17.8, 28.3, 38.8, 49.4, 13.0, 14.0, 15.0, 16.0]
  dlib [-16.4, -52.8, -89.2, -125.6, -10.2, -23.6, -37.0, -50.4, 17.8, 28.3, 38.8, 49.4, 13.0, 14.0, 15.0, 16.0]
raylib [-30.6, -13.9, 12.9, 4.0, -173.0, -73.4, 57.9, 8.0, -315.4, -132.9, 102.8, 12.0, -457.8, -192.3, 147.7, 16.0]
----------------------------------------------------------
a1 * a6
  sily [0.2, -0.5, -0.1, 6.1, 0.9, -1.5, -0.3, 11.2, 1.6, -2.5, -0.4, 16.4, 2.3, -3.5, -0.6, 21.5]
  dvec [0.2, -0.5, -0.1, 6.1, 0.9, -1.5, -0.3, 11.2, 1.6, -2.5, -0.4, 16.4, 2.3, -3.5, -0.6, 21.5]
   gfm [0.2, -0.5, -0.1, 6.1, 0.9, -1.5, -0.3, 11.2, 1.6, -2.5, -0.4, 16.4, 2.3, -3.5, -0.6, 21.5]
 zmath [0.2, -0.5, -0.1, 6.1, 0.9, -1.5, -0.3, 11.2, 1.6, -2.5, -0.4, 16.4, 2.3, -3.5, -0.6, 21.5]
  dlib [0.2, -0.5, -0.1, 6.1, 0.9, -1.5, -0.3, 11.2, 1.6, -2.5, -0.4, 16.4, 2.3, -3.5, -0.6, 21.5]
raylib [-34.1, -36.6, -39.1, -41.5, 50.8, 54.5, 58.2, 62.0, -14.4, -15.5, -16.6, -17.8, 13.0, 14.0, 15.0, 16.0]
----------------------------------------------------------
a6 * a2
  sily [0.2, 0.0, 0.0, -2.6, 0.0, -0.2, 0.0, 4.0, 0.0, 0.0, -0.0, -1.1, 0.0, 0.0, 0.0, 1.0]
  dvec [0.2, 0.0, 0.0, -2.6, 0.0, -0.2, 0.0, 4.0, 0.0, 0.0, -0.0, -1.1, 0.0, 0.0, 0.0, 1.0]
   gfm [0.2, 0.0, 0.0, -2.6, 0.0, -0.2, 0.0, 4.0, 0.0, 0.0, -0.0, -1.1, 0.0, 0.0, 0.0, 1.0]
 zmath [0.2, 0.0, 0.0, -2.6, 0.0, -0.2, 0.0, 4.0, 0.0, 0.0, -0.0, -1.1, 0.0, 0.0, 0.0, 1.0]
  dlib [0.2, 0.0, 0.0, -2.6, 0.0, -0.2, 0.0, 4.0, 0.0, 0.0, -0.0, -1.1, 0.0, 0.0, 0.0, 1.0]
raylib [0.2, 0.0, 0.0, -2.6, 0.0, -0.2, 0.0, 4.0, 0.0, 0.0, -0.0, -1.1, 0.0, 0.0, 0.0, 1.0]
----------------------------------------------------------
a1 * a5
  sily [0.4, -1.0, -12.6, -12.5, 1.8, -3.0, -26.4, -29.2, 3.2, -5.0, -40.1, -45.9, 4.7, -7.0, -53.9, -62.6]
  dvec [0.4, -1.0, -12.6, -12.5, 1.8, -3.0, -26.4, -29.2, 3.2, -5.0, -40.1, -45.9, 4.7, -7.0, -53.9, -62.6]
   gfm [0.4, -1.0, -12.6, -12.5, 1.8, -3.0, -26.4, -29.2, 3.2, -5.0, -40.1, -45.9, 4.7, -7.0, -53.9, -62.6]
 zmath [0.4, -1.0, -12.6, -12.5, 1.8, -3.0, -26.4, -29.2, 3.2, -5.0, -40.1, -45.9, 4.7, -7.0, -53.9, -62.6]
  dlib [0.4, -1.0, -12.6, -12.5, 1.8, -3.0, -26.4, -29.2, 3.2, -5.0, -40.1, -45.9, 4.7, -7.0, -53.9, -62.6]
raylib [24.1, 27.1, 30.1, 33.1, -38.5, -43.0, -47.5, -52.0, -63.9, -69.2, -74.4, -79.7, -9.0, -10.0, -11.0, -12.0]

Raylib passed on there tests:

a1 * a1
a1 * a2
a2 * a1
a2 * a2
Then it starts failing and returns back only in
a6 * a2

Imho this is very bad

What does it mean "this is very bad"?
Please, could you provide a real OpenGL use case example where raylib fails due to Matrix operations?
I don't doubt there could be some error on maths but it should be proved in an use-case scenario to be fixed.

It's less of opengl and more of common math problem
You intend to provide raymath as standalone header later (or already idk) and math is incorrect in it which is needed to be fixed no matter does it relate to opengl or not
Here's some use cases anyway:
Transformation matrix and operations on it
World to screen/screen to world vector transformations
Raycasting
I'm not saying it's super urgent issue to fix, but it is an issue nonetheless

Sorry, but with no use-case demostration I'm not changing the library. Afaik, it work as expected for its pourpose.
I think some user compared it in the past with GLM and both libraries were aligned in results.

Here's case with code where raylib fails.
Code to show that operations are same
    /* init()
    camera.position = rl.Vector3(0.0f, 2.0f, 0.0f);
    camera.target = rl.Vector3(1.0f, 2.0f, 0.0f);
    camera.up = rl.Vector3(0.0f, 1.0f, 0.0f);
    camera.fovy = 45.0f;
    camera.projection = rl.CameraProjection.CAMERA_PERSPECTIVE;
     */

    // draw()
    Matrix _view = MatrixLookAt(camera.position, camera.target, Vector3(0, 1, 0));
    Matrix _proj = MatrixPerspective(45.0 * rl.DEG2RAD, 16.0 / 9.0, 0.2, 100.0);

    mat4 view = mat4.lookAt(camera.position.rts, camera.target.rts, vec3.up);
    mat4 proj = mat4.perspective(45.0 * rl.DEG2RAD, 16.0 / 9.0, 0.2, 100.0);

    vec3 cp3 = camera.position.rts;
    // Position (0, 0, 0) relative to camera
    vec4 cp4 = vec4(-cp3.x, -cp3.y, -cp3.z, 1);
    // Transforming world position into screen one
    vec4 pp4 = (proj * view * cp4);
    // Mapping values to match screen
    vec2 pps = (((pp4.xy / pp4.z) * vec2(1, -1) + 1.0) / 2.0) * vec2(1280, 720);
    // vec2 to raylib.Vector2
    Vector2 pps1 = Vector2(pps.x, pps.y);

    // Same as above
    Vector3 cp32 = Vector3Scale(camera.position, -1);
    Vector3 pp42 = Vector3Transform(cp32, MatrixMultiply(_proj, _view));
    // A bit messy but 1 to 1 translation of `vec2 pps =` line
    Vector2 pps2 =
        Vector2Multiply(
                Vector2Divide(
                    Vector2AddValue(
                        Vector2Multiply(
                            Vector2Divide(
                                Vector2(pp42.x, pp42.y),
                                Vector2(pp42.z, pp42.z)
                            ),
                            Vector2(1, -1)
                        ),
                        1.0
                    ),
                    Vector2(2.0, 2.0)
                ),
                Vector2(1280, 720)
            )
        ;

    // Drawing circle, pps1 is my impl, pps2 is raylib
    DrawCircleV(pps1, 4.0f, Colors.GREEN);
    DrawCircleV(pps2, 4.0f, Colors.RED);

Screenshots

I'm performing most basic and standard transformations which are the same you'd use in OpenGL shader when doing hello triangle
gl_Position = m_projMatrix * m_viewMatrix * vec4(v_pos, 1.0);

I think some user compared it in the past with GLM and both libraries were aligned in results.
I mean, it doesn't fail all the time, that's why it might've worked in past

I'm sorry but I really can't see the problem with this sample, I just see two libraries with different conventions leading to different results. I will keep this issue open for some time in case someone with more expertise than me can confirm your assumptions.
Thanks for your time and your effort.

Hate to be a broken record but it doesn't work like that
Matrix operations are same everywhere and must produce same results. Yes they can be in different order due to how data is stored, but data is the same
1 2   5 6
3 4 * 7 8

Is always
19 22
43 50

Regardless of data order, conventions or absolutely anything
Please do keep this issue open, I know what I'm talking about and if you need second opinion then it shall be

From my reading of the matrix multiplication code it seems that the columns of the left matrix are dotted with the rows of the right matrix.
result.m0 = left.m0*right.m0 + left.m1*right.m4 + left.m2*right.m8 + left.m3*right.m12;

Where left.{m0,m1,m3,m4} is a column, and the respective fields of right represent a row.
This is the opposite of how matrix multiplication is defined mathematically, where the rows of the left matrix are dotted with the columns of the right.
Which essentially means that raymath seems to be multiplying the matrices in the wrong order.

Isn't the implementation of
rl.Matrix4 rlMatrix4(float[16] a) {
    return rl.Matrix(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]);
}

Incorrect?
Matrix4 is defined as:
typedef struct Matrix {
    float m0, m4, m8, m12;      // Matrix first row (4 components)
    float m1, m5, m9, m13;      // Matrix second row (4 components)
    float m2, m6, m10, m14;     // Matrix third row (4 components)
    float m3, m7, m11, m15;     // Matrix fourth row (4 components)
} Matrix;

So you have to change the order of the elements:
rl.Matrix4 rlMatrix4(float[16] a) {
    return rl.Matrix(a[0], a[4], a[8], a[12], a[1], a[5], a[9], a[13], a[2], a[6], a[10], a[14], a[13], a[17], a[11], a[15]);
}

@diwalkerdev no, raylib's matrix initialised by rows, not by columns
And I'm passing data by rows into it
But due to naming scheme you access it by columns order

@orcmid I can assure you that bindings are correct and raylib.matrix defined same as in raylib
Plus earlier in discussion I've posted tests where I used C with raylib which still produced wrong multiplication

@al1-ce @diwalkerdev
Is it being assumed that you can take a raylib Matrix and directly cast it to a float vector?
In raylib, vector mappings are  done carefully and element by element, not by any sort of casting/union.  It also wraps the vector in a struct but that's so it can be returned by value from a function.  And passed into functions with a nice strictness.

@orcmid if you're talking about D bindings then no, you can't cast it unless there's op overload, which in raylib-d there's none

@al1-ce

@orcmid ... earlier in discussion I've posted tests where I used C with raylib which still produced wrong multiplication

If you used raylib's MatrixMultiply(left, right) directly, did you take my advice and also try it with the operands interchanged?

@orcmid I was fiddling with it yesterday mostly when trying to figure out what was wrong
I do remember swapping left and right in my implementation which didn't make it same (which should've)

As pointed in raylib Discord, one user performed some tests to validate results and concluded raymath MatrixMultiply() behaves as expected.
Using Eigen linear algebra math library
    Matrix A;
    Matrix B;
    std::mt19937 gen(42);

    for(size_t i = 0;i < 1000;i++)
    {
        std::uniform_real_distribution<float> dis(-1.0f, 1.0f);

        for (int i = 0; i < 16; ++i)
        {
            ((float*)&A)[i] = dis(gen);
            ((float*)&B)[i] = dis(gen);
        }

        Eigen::Map<Eigen::Matrix<float, 4, 4>> eigenA((float*)&A);
        Eigen::Map<Eigen::Matrix<float, 4, 4>> eigenB((float*)&B);

        Matrix C = MatrixMultiply(A, B);

        Eigen::Map<Eigen::Matrix<float, 4, 4>> prodmap((float*)&C);

        std::cout << (eigenA * eigenB - prodmap).cwiseAbs().sum() << std::endl;
    }

Expected result is 0 and effectively it is 0.
Using GLM (OpenGL Mathematics) math library:
    Matrix A;
    Matrix B;
    std::mt19937 gen(42);

    for (size_t i = 0; i < 1000; i++)
    {
        std::uniform_real_distribution<float> dis(-1.0f, 1.0f);

        for (int i = 0; i < 16; ++i)
        {
            ((float*)&A)[i] = dis(gen);
            ((float*)&B)[i] = dis(gen);
        }

        glm::mat4 glmA = glm::make_mat4((float*)&A);
        glm::mat4 glmB = glm::make_mat4((float*)&B);
        glm::mat4 glmC = glmA * glmB;

        Matrix C = MatrixMultiply(A, B);

        float* glmCArray = glm::value_ptr(glmC);
        float* raylibCArray = (float*)&C;
        float sum = 0.0f;

        for (int i = 0; i < 16; ++i)
        {
            sum += std::abs(glmCArray[i] - raylibCArray[i]);
        }

        std::cout << sum << std::endl;
    }

And result is also 0, as expected.
It confirms MatrixMultiply() works as expected, maybe not following the expected conventions, but works as expected for raylib OpenGL maths.

@orcmid I've opened test file (one with several libs) and swapped left and right in raylib function
It worked, raylib is aligned now. Problem is exactly that raylib does right->left instead of left->right

Apparently the discrepancy is in that Raylib actually represents transformations as the transpose of how you'd consider them in ordinary mathematics. This ensures that the in-memory representation of the transformation is equivalent to that of a column-order OpenGL matrix.

@eutro Also, all math operations are cache friendly and no matrix transpositions are required when working with OpenGL.

@raysan5 if it's intended to be MatrixMultiply(right, left), then change it so
Coz in currect state either signature is incorrect or body is incorrect

Please, calm down. If you don't like it, just don't use it.


Transformer extend_step supports multi steps generation (2/2).

In MultiheadAttention.extend_step, logit_bias was hardcoded to have a length of 1.
This PR modified it to support multi-step inputs. This change also makes extend_step more aligned with forward, reducing the overall code complexity.

Could you take a look? From 901

Thank you for review!


Enforce persistence context timeout in application layer: Part 3

What changed?
Enforce persistence context timeout in shard context, execution context and execution cache

Note context timeout errors in some shard context methods may result in rangeID change and shard movement. To minimize the impact, all persistence APIs for renew shard rangeID will still use context.Background(), and a minimal context timeout (1s) will be enforced on shard context methods that may lead to shard movement.

Context.Background() is used in unit tests if the test is not testing timeout case.

Why?
#3519

How did you test it?
Integration test.

Potential risks
May result in more persistence context timeout, rangeID change more frequently and more shard movement when persistence latency is high.

Coverage increased (+0.02%) to 68.832% when pulling 9e0b30aa58f4569a172e0eaa8b713a1594e0aec8 on yycptt:app-level-ctx-3 into<PHONE_NUMBER>c2838a12723f97a4c8e1dac99ebce9 on uber:master.


[Bug]: updated json feature autunite

Mod Version
0.0.8
Mod Loader
NeoForge
Mod Loader Version
fabric
Describe the bug
updated ore gen percent and distribution across chunks.
updatedfeaturejsons.zip
To Reproduce

...

worldgen.zip
newly updated spawn values to increase rarity. This is the final version


UUID issue

Hi there, this seems to work fine as long as the ids of the paginated entities in questions are uints.
I've implemented a custom data-type similar to this medium article that stores a BINARY(16) value as the id and provides helper methods to convert a string uuid to a BINARY(16) and back.
This paginate lib seems to have an issue with the implementation and I'm not sure why. I've got it working beautifully with entities with an INT primaryKey, but I get the following panic error with a BinaryUUID primaryKey:
2021/04/26 16:03:58 http: panic serving <IP_ADDRESS>:61948: uuid: Parse(paginated): invalid UUID length: 9
goroutine 156 [running]:
net/http.(*conn).serve.func1(0xc0003c25a0)
        /usr/local/Cellar/go/1.15.2/libexec/src/net/http/server.go:1801 +0x147
panic(0x1ca1340, 0xc000786a80)
        /usr/local/Cellar/go/1.15.2/libexec/src/runtime/panic.go:975 +0x3e9
github.com/google/uuid.MustParse(0xc00024c52c, 0x9, 0x0, 0x0)

There is a ParseUUID function on the custom BinaryUUID data type defined as follows:
func ParseUUID(id string) BinaryUUID {
	fmt.Println("Attempting to parse: ", id)
	return BinaryUUID(uuid.MustParse(id))
}

And the panic throws right after this function logs: "Attempting to parse: pagination". So for some reason, the string "pagination" is being interpreted as the id field of the selected entities? I'm not sure I understand 100% what is going on though.

Have you tried getting a response without pagination?

Yep, Gorm calls work fine and automatically convert the binary(16) uuid into a string for the id field when JSON marshaled

I wonder what is inside the BinaryUUID and when is the ParseUUID function called?
if your goal is to find a way to store the value as uuid and serve it back as a string
please check these points:

Make sure field name, json name, property name must be the same (see reference).
I've implemented uuid in several projects with postgres but never saved it as binary(16). Maybe you can try with varchar.
I suggest using the BeforeCreate hook instead of UUID_TO_BIN(UUID()).
All filters params on paginate only work with string, number, boolean, null and array.
I think it will be your next problem (see reference).

I've tried a similar example btw. it works fine, but not with filters.
I hope the following snippets can help you.
package main

import (
    "encoding/json"
    "fmt"
    "log"
    "net/http"

    "github.com/google/uuid"
    "github.com/morkid/paginate"
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
    "gorm.io/gorm/logger"
)

// Movie struct
type Movie struct {
    ID   uuid.UUID `json:"id" gorm:"primary_key;type:varchar(36);column:id;unique;not null"`
    Title string    `json:"title"`
}

func (m *Movie) BeforeCreate(tx *gorm.DB) error {
    id, err := uuid.NewRandom()
    m.ID = id
    return err
}

func (Movie) TableName() string {
    return "movie"
}

func main() {
    dsn := "user:pass@tcp(<IP_ADDRESS>:3306)/mydb?charset=utf8mb4&parseTime=True&loc=Local"
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
        Logger: logger.Default.LogMode(logger.Info),
    })

    if nil != err {
        log.Fatal(err.Error())
        return
    }
    db.AutoMigrate(&Movie{})

    movies := []Movie{{Title: "The Hobbit"}, {Title: "Harry potter"}}

    tx := db.Begin()
    defer func() {
        if r := recover(); r != nil {
            tx.Rollback()
        }
    }()

    if err := tx.Create(&movies).Error; nil != err {
        tx.Rollback()
        log.Fatal(err.Error())
        return
    }

    if err := tx.Commit().Error; nil != err {
        tx.Rollback()
        log.Fatal(err.Error())
        return
    }

    pg := paginate.New()

    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        mod := db.Model(&Movie{})
        page := pg.With(mod).Request(r).Response(&[]Movie{})
        res, _ := json.Marshal(page)
        fmt.Fprintf(w, "%s", string(res))
    })

    log.Fatal(http.ListenAndServe(":8080", nil))
}

Example response:
{
    "items": [
        {
            "id": "05a036df-5c77-4711-8ea0-5320a806207e",
            "title": "The Hobbit"
        },
        {
            "id": "78ecc267-63d7-422c-ac16-484d5a786551",
            "title": "Harry potter"
        }
    ],
    "page": 0,
    "size": 10,
    "max_page": 1,
    "total_pages": 1,
    "total": 2,
    "last": false,
    "first": true,
    "visible": 2
}

Real data:
mysql> SELECT * FROM movie;
+--------------------------------------+--------------+
| id                                   | title        |
+--------------------------------------+--------------+
| 05a036df-5c77-4711-8ea0-5320a806207e | The Hobbit   |
| 78ecc267-63d7-422c-ac16-484d5a786551 | Harry potter |
+--------------------------------------+--------------+

I'm really sorry I can't help you so much for binary(16) conversion.
maybe I'll take some time for the next feature.

Thank you for the examples!! The benefit of using Binary(16) primary keys vs varchar(36) is that it is much, much faster to look for in the db. Looks like I may need to do a double check on filters before passing them to pagination to make sure they're converted into the right values. I'll do some more digging. Much appreciated!


Adding some new funky functions

Created the Join, JoinProjection, Range, SumMap, Zip functions, each function is documented with how it works and has a unit test or maybe more
Created a Tuple struct as some of the new functions require you to return a new slice with two fields which is the result of the new functions, i.e. Join and Zip

Amazing contribution! 🤩
I will review it immediately


publish maven dependency

This issue is about publishing HeFQUIN releases using GitHub Packages as a Maven repository. To use HefQUIN as dependency would then require something like:
<repositories>
    <repository>
        <id>github</id>
        <name>GitHub LiUSemWeb Repository</name>
        <url>https://maven.pkg.github.com/LiUSemWeb/HeFQUIN</url>
    </repository>
</repositories>

<dependencies>
    <dependency>
        <groupId>se.liu.ida.hefquin</groupId>
        <artifactId>hefquin-engine</artifactId>
        <version>x.y.z</version>
    </dependency>
</dependencies>

I'd suggest adding an action that is  triggered automatically whenever a new release is published.
Note: Maven releases are immutable also when using GitHub Packages.
@hartig

Good idea, but I have a few questions to better understand what this entails:
Would this mean that, if I do mvn deploy in my local copy of the repo, then the package will be uploaded and published at GitHub Packages? If yes, who else besides me would be able to do that?

No, doing mvn deploy on a local copy would not publish to GitHub Packages. Just like the publishing of gh-pages, this would be an action triggered by an event on the repo (release). Anyone with permissions to create a new release would in principle be able to indirectly trigger this.

Regarding the immutability that you speak of, does it mean doing mvn deploy a second time with the same version number would result in an error message?

Exactly, so when creating releases we should adhere to, e.g., semantic versioning.

Thanks for answering my questions. Sounds like a good idea then!

After a lot of experimentation I have a few things to add to this issue:

Artifact IDs should be lowercase (i.e., HefQUIN -> hefquin) to comply with Maven conventions (it's even a strict requirement in some systems). So to avoid issues in the future, we should change to lowercase.

It turns out that using GitHub Packages as a Maven repository requires authentication... I believe it has something to do with how GitHub handles public vs. private repos, but either way it is quite limiting to require users to authenticate to use and open source library. Interestingly, this is not the case when hosting docker images. Anyways, this means that it's probably better to publish to using Sonatype and the Maven Central Repository.

Sonatype is transitioning from to a new publishing system (see central portal vs. legacy OSSRH). In terms of functionality, the main difference seems to be that the new system currently does not support SNAPSHOT versions. We could use the legacy system but it seems like we would have to transition eventually anyways.

Maven Central Repository requires that a few extra details are added to the main pom.xml file (see requirements).

The process for starting to publish to the central repository is bit involved (see summary here). The basic steps would be:

Register an account on https://central.sonatype.org/
Claim the https://github.com/LiUSemWeb/HeFQUIN namespace
Generate and distribute GPG key
Add secrets in Github UI (for automation)
Setup the action/workflow

I was thinking that we could setup a common Maven Central account for the group LiUSemWeb, which we can manage as a group. That way the publishing steps will persist even if the group members change in future and we don't have to share any personal tokens etc. Also, an email can only be used to setup a single Sonatype account. If this sounds like a good idea, do we have some email address that could be used for this or should we setup a new one? What domain?
@hartig

Artifact IDs should be lowercase (i.e., HefQUIN -> hefquin) to comply with Maven conventions (it's even a strict requirement in some systems). So to avoid issues in the future, we should change to lowercase.

Okay, we can do that.
In this case, would it make sense to change the groupId from se.liu.ida.hefquin to se.liu.ida? Maybe not, or what do you think?

It turns out that using GitHub Packages as a Maven repository requires authentication [...] Anyways, this means that it's probably better to publish to using Sonatype and the Maven Central Repository.

Okay

Sonatype is transitioning from to a new publishing system (see central portal vs. legacy OSSRH). In terms of functionality, the main difference seems to be that the new system currently does not support SNAPSHOT versions. We could use the legacy system but it seems like we would have to transition eventually anyways.

We wouldn't publish SNAPSHOT versions anyways, would we?

Maven Central Repository requires that a few extra details are added to the main pom.xml file (see requirements).

Can you please create a PR with an initial version of these changes. Then, I can take a look and expand/adjust as I see fit. (The PR may also contain the change as per point 1 above)

I was thinking that we could set up a common Maven Central account for the group LiUSemWeb, which we can manage as a group. That way the publishing steps will persist even if the group members change in future and we don't have to share any personal tokens etc.

What do you mean by personal tokens?
I guess, among the (three senior) seniors in the group, the only one who would care about having the option to publish to Maven Central is me, and I am not planning to have my status as a group member change in the future ;-) So, in principle, we could also choose that I create the account with the understanding that this is the account for the group. But then, what would the personal tokens be?

Also, an email can only be used to register a single Sonatype account.

Is such an account then only for Maven packages for one project or can it be for multiple?

If this sounds like a good idea, do we have some email address that could be used for this or should we create a new one? What domain?

If we don't use my email address, then it should be one for the group, preferably with @liu.se. But as we don't have such an email address, I am afraid trying to get one may be more effort than simply using my LiU email address.

Artifact IDs should be lowercase (i.e., HefQUIN -> hefquin) to comply with Maven conventions (it's even a strict requirement in some systems). So to avoid issues in the future, we should change to lowercase.

Okay, we can do that.
In this case, would it make sense to change the groupId from se.liu.ida.hefquin to se.liu.ida? Maybe not, or what do you think?

It turns out that using GitHub Packages as a Maven repository requires authentication [...] Anyways, this means that it's probably better to publish to using Sonatype and the Maven Central Repository.

Okay

Sonatype is transitioning from to a new publishing system (see central portal vs. legacy OSSRH). In terms of functionality, the main difference seems to be that the new system currently does not support SNAPSHOT versions. We could use the legacy system but it seems like we would have to transition eventually anyways.

We wouldn't publish SNAPSHOT versions anyways, would we?

Maven Central Repository requires that a few extra details are added to the main pom.xml file (see requirements).

Can you please create a PR with an initial version of these changes. Then, I can take a look and expand/adjust as I see fit. (The PR may also contain the change as per point 1 above)

I was thinking that we could set up a common Maven Central account for the group LiUSemWeb, which we can manage as a group. That way the publishing steps will persist even if the group members change in future and we don't have to share any personal tokens etc.

What do you mean by personal tokens? I guess, among the (three senior) seniors in the group, the only one who would care about having the option to publish to Maven Central is me, and I am not planning to have my status as a group member change in the future ;-) So, in principle, we could also choose that I create the account with the understanding that this is the account for the group. But then, what would the personal tokens be?

Also, an email can only be used to register a single Sonatype account.

Is such an account then only for Maven packages for one project or can it be for multiple?

If this sounds like a good idea, do we have some email address that could be used for this or should we create a new one? What domain?

If we don't use my email address, then it should be one for the group, preferably with @liu.se. But as we don't have such an email address, I am afraid trying to get one may be more effort than simply using my LiU email address.

Your recent comment above is just quoting my previous comment. Was that a mistake?

Yes, that was a mistake.

Artifact IDs should be lowercase (i.e., HefQUIN -> hefquin) to comply with Maven conventions (it's even a strict requirement in some systems). So to avoid issues in the future, we should change to lowercase.

Okay, we can do that.
In this case, would it make sense to change the groupId from se.liu.ida.hefquin to se.liu.ida? Maybe not, or what do you think?

Jena uses Apache Jena uses jena as its artifact ID so maybe we can probably keep the groupId as is:
  <name>Apache Jena</name>
  <groupId>org.apache.jena</groupId>
  <artifactId>jena</artifactId>
  <packaging>pom</packaging>
  ...

Sonatype is transitioning from to a new publishing system (see central portal vs. legacy OSSRH). In terms of functionality, the main difference seems to be that the new system currently does not support SNAPSHOT versions. We could use the legacy system but it seems like we would have to transition eventually anyways.

We wouldn't publish SNAPSHOT versions anyways, would we?

I agree.

Maven Central Repository requires that a few extra details are added to the main pom.xml file (see requirements).

Can you please create a PR with an initial version of these changes. Then, I can take a look and expand/adjust as I see fit. (The PR may also contain the change as per point 1 above)

Will do.

I was thinking that we could set up a common Maven Central account for the group LiUSemWeb, which we can manage as a group. That way the publishing steps will persist even if the group members change in future and we don't have to share any personal tokens etc.

What do you mean by personal tokens? I guess, among the (three senior) seniors in the group, the only one who would care about having the option to publish to Maven Central is me, and I am not planning to have my status as a group member change in the future ;-) So, in principle, we could also choose that I create the account with the understanding that this is the account for the group. But then, what would the personal tokens be?

Okay. So maybe it's just overkill to automate the maven publishing step? We could instead just make sure that the process is properly documented and then you can authenticate by modifying ~/.m2/settings.xml locally on your machine. I'll look into the details and try it for my self in an example project and get back to you.

Also, an email can only be used to register a single Sonatype account.

Is such an account then only for Maven packages for one project or can it be for multiple?

Managing multiple projects with a single project is fine, but we can't create a dedicated LiUSemWeb account using our own email addresses.

If this sounds like a good idea, do we have some email address that could be used for this or should we create a new one? What domain?

If we don't use my email address, then it should be one for the group, preferably with @liu.se. But as we don't have such an email address, I am afraid trying to get one may be more effort than simply using my LiU email address.

Let's use yours then. I'll get back with details.

Sounds all good. I will wait for you to get back with details then.
(And we keep the the groupId as se.liu.ida.hefquin)

I've now finally managed to publish an example project using Maven Central! I was a bit taken aback by how complicated it actually was, but I've taken note of all the steps so next time should be much easier, and updated the Release-Logistics.
The key takeaways are the following:

We need to register a namespace. For example, using se.liu.ida.hefquin as the namespace would mean that we have to prove ownership of the subdomain hefquin.ida.liu.se (see https://central.sonatype.org/register/namespace/#adding-a-namespace).
As the owner or maintainer of a domain name, you can use any groupId starting with the reverse domain name and as many subsections as you desire. I.e., if we register a namespace for LiUSemWeb, we could publish under this one without having to add additional namespaces later on. E.g. we could register se.liu.ida.liusemweb and then publish HeFQUIN under se.ida.liu.liusemweb.hefquin.
Proving ownership on an LiU subdomain is not something we can do ourselves as far as I know, even if we had access to the subdomain right now. I've submitted a ticket to IT to see what the practice is. I asked about Maven library publishing in general, as well as the possibility of registering hefquin.ida.liu.se or liusemweb.ida.liu.se as namespaces. No reply yet.
We could also use the namespace io.github.liusemweb, and thus publish with, e.g., io.github.liusemweb.hefquin. The benefit would of course be that we can handle it all ourselves. If so, do we want to update our package names?

According to the Maven Central docs, multiple users should be able to share a namespace but there seems to be no way of adding users manually, so I think it's best that @hartig claims the namespace.
@hartig, perhaps we can schedule a time for setting it up on your computer once we now how to manage deal with namespace/subdomain question?

For testing purposes, I've published HeFQUIN in my own github namespace. The libs work as expected and the modules can be imported separately. E.g.:
  <dependency>
    <groupId>io.github.keski.hefquin</groupId>
    <artifactId>hefquin-cli</artifactId>
    <version>0.0.1</version>
  </dependency>

I've update the pom.xml file in https://github.com/LiUSemWeb/HeFQUIN/tree/365-publish-maven-dependency. Once we we have the namespace we should be ready to publish.

@keski any update on this one?

@hartig I got an update regarding this! If we want to use a subdomain directly under ida.liu.se we apparently need approval from the prefect at IDA. But another suggestion was to use the domain research.liu.se which is used for something similar in two other projects. We would then use something like semweb.research.liu.se. What do you think?

Thanks for investigating!
I assume that, instead of se.liu.research.semweb, we may also get se.liu.research.hefquin. Right?
If so, I would prefer that (but keep our Java packages named as they are). Can you please ask IT what we need to do have them help us set this up. In particular, as far as I understand the related part of the Sonatype documentation, they need to add a "DNS TXT record" for us where the value of this record is the verification key that we get from Sonatype in the process of verifying the namespace. Can you please confirm with IT that they would do that for us (feel free to include me in CC).

This matches my understanding as well. I've forwarded our request to IT.


Typescript to Babel sourcemap points to wrong file

I am trying to get the following workflow set up Typescript -> ES6 -> Babel -> ES5 (w sourcemaps)
With a gulp task that looks something like this
gulp.task('build', function () {
  return gulp.src('src/server/**/*.ts')
    .pipe(sourcemaps.init())
    .pipe(typescript({
      noImplicitAny: true,
      removeComments: true,
      preserveConstEnums: true,
      target: 'es6',
      typescript: require('typescript')
    }))
    .pipe(babel({
      presets: [ 'es2015' ]
    }))
    .pipe(sourcemaps.write('maps', { sourceRoot: getSourceDir }))
    .pipe(gulp.dest('build/server'));
});

And a directory structure like:
project
|__ gulpfile.js
|__ src
     |_ server
        |_ index.ts
        |_ one.ts
        |_ two.ts
        |_ up
           |_ three.ts
           |_ up2
              |_ four.ts

Now some examples of the sourcemaps that are generated:
src/server/up/up2/four.ts - No Babel
{
  "history": [ "/home/user/code/test/src/server/up/up2/four.js" ],
  "base": "/home/user/code/test/src/server/",
  "sourceMap": {
    "sources": ["up/up2/four.ts"],
    "file": "up/up2/four.js"
  }
}

src/server/up/up2/four.ts - With Babel
{
  "history": [ "/home/user/code/test/src/server/up/up2/four.js" ],
  "base": "/home/user/code/test/src/server/",
  "sourceMap": {
    "sources": ["four.js"],
    "file": "up/up2/four.js"
  },
  "babel": {
    "...": "..."
  }
}

Notice how when using babel the sourceMap.sources points to a .js file with no subdirectories, thus doesn't work.
However the sourcemaps for everything in the sourceroot src/server/{index.ts,one.ts,two.ts} the sourcemaps get generated and work just fine.
src/server/two.ts - With Babel
{
  "history": [ "/home/user/code/test/src/server/two.js" ],
  "base": "/home/user/code/test/src/server/",
  "sourceMap": {
    "sources": ["two.ts"],
    "file": "two.js"
  },
  "babel": {
    "...": "..."
  }
}

So as long as the files are not in a subdirectory the sourceMap.sources points to the proper .ts file.  Any insight would be great, thanks.

I incorrectly guessed that this was the fault of gulp-sourcemaps.  It appears to caused by gulp-babel the issue is here.


Change querystring on the url without reloading

Hey,
Not sure if this is the right channel for this, but here it goes..
I want to change the querystring on the URL while performing search (as you type) on my app localhost:3000/#/list?q=foo
I'm using hashHistory and I've tried doing this on my component:
this.context.router.push({
  query: Object.assign({}, this.context.router.location.query, {q: query})
});

Although it updates the URL as intended, it reloads the page twice. Is there any way to avoid reloading? or at least avoid reloading twice?
Thanks

This is a bug tracker, not a support system. For usage questions, please use Stack Overflow or Reactiflux. Thanks!


Bump version to 5.5.

Note that this breaks all the deprecations from 5.0. Unfortunately, I cannot look into that.

I don't feel like making the bot smarter...
I do like being reminded how important the bot thinks I am though!

@sheetalkamat last commit edits a test for project references with prepend to permit errors.

nice!!! I assume that a build size comparison will be made available when the v5.5 release blog post comes out!? Removing ES3 is long overdue 😄

Those are all test changes; the removal of ES3 is not likely to reduce the size of the package too much.

oh ok thanks for the info @jakebailey


Create a website policy page

It should contain details regarding what this website is all about.
Header, footer must be the same.
Page must follow website theme.

It should contain details regarding what this website is all about.
Header, footer must be the same.
Page must follow website theme.

Link the page with the footers of every page.

Can I work on this?

Can I work on this?

Under DCP or LGMSoC?

Sorry for the late reply. I'm not that experienced with GitHub yet. What's the difference between DCP and LGMoC? I read labels descriptions but it's still not very clear to me.

Sorry for the late reply. I'm not that experienced with GitHub yet. What's the difference between DCP and LGMoC? I read labels descriptions but it's still not very clear to me.

DCP and LGMSoC are 2 open-source contribution events and this project is a part of these programs.
So if you are a participant in any of these then tell.
Else no worries.
You can also participate in LGMSoC the registrations are still open. Click logo in readme file.

Can I work on this issue @QAZIMAAZARSHAD ? I can design a website policy with proper rules and regualtions

Can I work on this issue @QAZIMAAZARSHAD ? I can design a website policy with proper rules and regualtions

Solve other issues first.

@IwonaBaran any updates?


Add Nullability annotations for JobService to better support Kotlin

Current library JobService contains two methods:
@MainThread
public abstract boolean onStartJob(JobParameters job);

@MainThread
public abstract boolean onStopJob(JobParameters job);

Both are missing @NonNull annotation so when we use in Kotlin, it has no way of knowing of its nullability.

In April 2019 we announced that Firebase Job Dispatcher would be deprecated today, April 7th 2020.  For this reason we are going to close all open issues and archive the repository.  We will also stop supporting FJD for new app installations (such as those targeting sdk versions greater than Android Q).  Existing apps that rely on FJD should continue to function as usual.
While we will no longer work on FJD, we encourage you to migrate to Work Manager which is a superior tool and fully supported by the Android team.
Thank you for taking the time to try the library and provide this feedback.  We sincerely appreciate your effort and we apologize for not addressing it in time.


Issues with data types having more than 3 constructors

Hi Gabriel,
I've run into some weird issues when testing out your library. The following code works:
{-# LANGUAGE DeriveGeneric     #-}
{-# LANGUAGE OverloadedStrings #-}

import           Options.Generic
import           Data.Text (Text)

data CliCommands
  = ACmd Text
  | BCmd Text
  | CCmd Text
  deriving (Show, Generic)

instance ParseRecord CliCommands

main = do
  x <- getRecord "Triggers CLI"
  print (x :: CliCommands)

However, adding one more constructor seems to cause a fatal error:
{-# LANGUAGE DeriveGeneric     #-}
{-# LANGUAGE OverloadedStrings #-}

import           Options.Generic
import           Data.Text (Text)

data CliCommands
  = ACmd Text
  | BCmd Text
  | CCmd Text
  | DCmd Text
  deriving (Show, Generic)

instance ParseRecord CliCommands

main = do
  x <- getRecord "Triggers CLI"
  print (x :: CliCommands)

Error message:
Main.hs:16:10:
    No instance for (Options.Generic.GenericParseRecord
                       ((GHC.Generics.C1
                           Main.C1_0CliCommands
                           (GHC.Generics.S1 GHC.Generics.NoSelector (GHC.Generics.Rec0 Text))
                         GHC.Generics.:+: GHC.Generics.C1
                                            Main.C1_1CliCommands
                                            (GHC.Generics.S1
                                               GHC.Generics.NoSelector (GHC.Generics.Rec0 Text)))
                        GHC.Generics.:+: (GHC.Generics.C1
                                            Main.C1_2CliCommands
                                            (GHC.Generics.S1
                                               GHC.Generics.NoSelector (GHC.Generics.Rec0 Text))
                                          GHC.Generics.:+: GHC.Generics.C1
                                                             Main.C1_3CliCommands
                                                             (GHC.Generics.S1
                                                                GHC.Generics.NoSelector
                                                                (GHC.Generics.Rec0 Text)))))
    arising from a use of ‘Options.Generic.$gdmparseRecord’
    In the expression: Options.Generic.$gdmparseRecord
    In an equation for ‘parseRecord’:
        parseRecord = Options.Generic.$gdmparseRecord
    In the instance declaration for ‘ParseRecord CliCommands’

I've tested a few different things and it seems simply to be related to the constructor count being > 3.
If this is just something i'm doing wrong, sorry for the misunderstanding.
Thanks!

Also when I compile the first example with 3 constructors, it hangs indefinitely.. Works fine with 2 constructors.
I'm using ghc 7.10.3 on Mac OS X.

looks like a dupe of #9

I will close this one. I didn't notice the non-termination behavior until after I posted this.
Thanks!


vague error when running amplify status after fresh clone of project (before init/pull)

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?
pnpm
If applicable, what version of Node.js are you using?
18
Amplify CLI Version
10.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.
no
Amplify Categories
Not applicable
Amplify Commands
Not applicable
Describe the bug
Amplify CLI returns a vague error when attempting to run amplify status after a fresh git clone of an Amplify project
Name: Error : Message: File at path: '/Users/josef/path/to/myamplifyproject/amplify/backend/amplify-meta.json' does not exist

The error format is also worth mentioning:
Name: Error : Message: File at path: ...

Expected behavior
A helpful error message is returned with proper guidance
This project does not appear to be initialized. Have you ran `amplify init`?
https://docs.amplify.aws/cli/start/workflows/#amplify-init

or
File at path: '/Users/josef/path/to/myamplifyproject/amplify/backend/amplify-meta.json' does not exist
Has this project been initialized? Run `amplify init` to get started
https://docs.amplify.aws/cli/start/workflows/#amplify-init

Reproduction steps

create an Amplify project
push to git
in another directory, clone repository
run amplify status

GraphQL schema(s)

# Put schemas below this line

Project Identifier
No response
Log output

# Put your logs below this line

Additional information
No response

Observed vague message, marking this as a bug for improvements.


Release version 0.3.0

There are several to-do's/issues that once resolve, would warrant the release of a major version update. This issue will track their status:

[x] Argo netCDF file writing, output file must pass Argo FileChecker (#11)
[x] Retrieving gridded (2D array) variables from an Sprof file, rather than only 1D vectors (#16)
[ ] Exhaustive formatting and docstrings (#28, which was merged into #39)
[ ] Dealing with missing PPOX_DOXY variable in traj files for calculating in-air gain (#29)
[ ] Calculating gain including the carry-over factor (#33)
[ ] The package has grown and 1000+ line files are impractical, re-organize into folders with more files and __init__.py files (#39)
[ ] Retrieve optode type before calculating oxygen solubility (#40)

Closing this issue as it has been replaced with a milestone


Bug on plugin install

(Just documenting this from my Slack question)
I was just trying to pull and install the latest version of the archive plugin and got
RuntimeError: Model class archive_plugin.models.Version doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.

(full stack trace attached below)
for back content and pandoc, I hadn't needed to run makemigrations/migrate on copying their folders into plugins - do I need to do that with archive_plugin?
fyi I was doing this from the master branch so maybe you've fixed this in one of your dev branches already

Checking plugin back_content
Plugin Back Content Plugin installed.
Checking plugin archive_plugin
Plugin Archiving Plugin installed.
Checking plugin pandoc_plugin
Plugin Pandoc Plugin installed.
Checking plugin about
Checking plugin news
Checking plugin journals
Checking plugin preprints
Checking plugin carousel
Checking plugin featured
Checking plugin html
install for html
Checking plugin issue
Loaded URLs for back_content
Traceback (most recent call last):
  File "manage.py", line 11, in
    execute_from_command_line(sys.argv)
  File "/usr/local/lib/python3.6/site-packages/django/core/management/__init__.py", line 364, in execute_from_command_line
    utility.execute()
  File "/usr/local/lib/python3.6/site-packages/django/core/management/__init__.py", line 356, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/local/lib/python3.6/site-packages/django/core/management/base.py", line 283, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/usr/local/lib/python3.6/site-packages/django/core/management/base.py", line 327, in execute
    self.check()
  File "/usr/local/lib/python3.6/site-packages/django/core/management/base.py", line 359, in check
    include_deployment_checks=include_deployment_checks,
  File "/usr/local/lib/python3.6/site-packages/django/core/management/base.py", line 346, in _run_checks
    return checks.run_checks(**kwargs)
  File "/usr/local/lib/python3.6/site-packages/django/core/checks/registry.py", line 81, in run_checks
    new_errors = check(app_configs=app_configs)
  File "/usr/local/lib/python3.6/site-packages/django/core/checks/urls.py", line 16, in check_url_config
    return check_resolver(resolver)
  File "/usr/local/lib/python3.6/site-packages/django/core/checks/urls.py", line 26, in check_resolver
    return check_method()
  File "/usr/local/lib/python3.6/site-packages/django/urls/resolvers.py", line 254, in check
    for pattern in self.url_patterns:
  File "/usr/local/lib/python3.6/site-packages/django/utils/functional.py", line 35, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/usr/local/lib/python3.6/site-packages/django/urls/resolvers.py", line 405, in url_patterns
    patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
  File "/usr/local/lib/python3.6/site-packages/django/utils/functional.py", line 35, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/usr/local/lib/python3.6/site-packages/django/urls/resolvers.py", line 398, in urlconf_module
    return import_module(self.urlconf_name)
  File "/usr/local/lib/python3.6/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "", line 994, in _gcd_import
  File "", line 971, in _find_and_load
  File "", line 955, in _find_and_load_unlocked
  File "", line 665, in _load_unlocked
  File "", line 678, in exec_module
  File "", line 219, in _call_with_frames_removed
  File "/janeway/src/core/urls.py", line 32, in
    url(r'^(?P[-\w.]+)/', include('core.include_urls')),
  File "/usr/local/lib/python3.6/site-packages/django/conf/urls/__init__.py", line 50, in include
    urlconf_module = import_module(urlconf_module)
  File "/usr/local/lib/python3.6/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "", line 994, in _gcd_import
  File "", line 971, in _find_and_load
  File "", line 955, in _find_and_load_unlocked
  File "", line 665, in _load_unlocked
  File "", line 678, in exec_module
  File "", line 219, in _call_with_frames_removed
  File "/janeway/src/core/include_urls.py", line 212, in
    url(r'^plugins/{0}/'.format(plugin.best_name()), include('plugins.{0}.urls'.format(plugin.name))),
  File "/usr/local/lib/python3.6/site-packages/django/conf/urls/__init__.py", line 50, in include
    urlconf_module = import_module(urlconf_module)
  File "/usr/local/lib/python3.6/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "", line 994, in _gcd_import
  File "", line 971, in _find_and_load
  File "", line 955, in _find_and_load_unlocked
  File "", line 665, in _load_unlocked
  File "", line 678, in exec_module
  File "", line 219, in _call_with_frames_removed
  File "/janeway/src/plugins/archive_plugin/urls.py", line 2, in
    from plugins.archive_plugin import views
  File "/janeway/src/plugins/archive_plugin/views.py", line 8, in
    from plugins.archive_plugin import forms, plugin_settings, logic, transactional_emails
  File "/janeway/src/plugins/archive_plugin/logic.py", line 6, in
    from archive_plugin.models import Version
  File "/janeway/src/plugins/archive_plugin/models.py", line 18, in
    class Version(models.Model):
  File "/usr/local/lib/python3.6/site-packages/django/db/models/base.py", line 118, in __new__
    "INSTALLED_APPS." % (module, name)
RuntimeError: Model class archive_plugin.models.Version doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.
Loaded URLs for back_content
Traceback (most recent call last):
  File "manage.py", line 11, in
    execute_from_command_line(sys.argv)
  File "/usr/local/lib/python3.6/site-packages/django/core/management/__init__.py", line 364, in execute_from_command_line
    utility.execute()
  File "/usr/local/lib/python3.6/site-packages/django/core/management/__init__.py", line 356, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/local/lib/python3.6/site-packages/django/core/management/base.py", line 283, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/usr/local/lib/python3.6/site-packages/django/core/management/base.py", line 327, in execute
    self.check()
  File "/usr/local/lib/python3.6/site-packages/django/core/management/base.py", line 359, in check
    include_deployment_checks=include_deployment_checks,
  File "/usr/local/lib/python3.6/site-packages/django/core/management/base.py", line 346, in _run_checks
    return checks.run_checks(**kwargs)
  File "/usr/local/lib/python3.6/site-packages/django/core/checks/registry.py", line 81, in run_checks
    new_errors = check(app_configs=app_configs)
  File "/usr/local/lib/python3.6/site-packages/django/core/checks/urls.py", line 16, in check_url_config
    return check_resolver(resolver)
  File "/usr/local/lib/python3.6/site-packages/django/core/checks/urls.py", line 26, in check_resolver
    return check_method()
  File "/usr/local/lib/python3.6/site-packages/django/urls/resolvers.py", line 254, in check
    for pattern in self.url_patterns:
  File "/usr/local/lib/python3.6/site-packages/django/utils/functional.py", line 35, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/usr/local/lib/python3.6/site-packages/django/urls/resolvers.py", line 405, in url_patterns
    patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
  File "/usr/local/lib/python3.6/site-packages/django/utils/functional.py", line 35, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/usr/local/lib/python3.6/site-packages/django/urls/resolvers.py", line 398, in urlconf_module
    return import_module(self.urlconf_name)
  File "/usr/local/lib/python3.6/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "", line 994, in _gcd_import
  File "", line 971, in _find_and_load
  File "", line 955, in _find_and_load_unlocked
  File "", line 665, in _load_unlocked
  File "", line 678, in exec_module
  File "", line 219, in _call_with_frames_removed
  File "/janeway/src/core/urls.py", line 32, in
    url(r'^(?P[-\w.]+)/', include('core.include_urls')),
  File "/usr/local/lib/python3.6/site-packages/django/conf/urls/__init__.py", line 50, in include
    urlconf_module = import_module(urlconf_module)
  File "/usr/local/lib/python3.6/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "", line 994, in _gcd_import
  File "", line 971, in _find_and_load
  File "", line 955, in _find_and_load_unlocked
  File "", line 665, in _load_unlocked
  File "", line 678, in exec_module
  File "", line 219, in _call_with_frames_removed
  File "/janeway/src/core/include_urls.py", line 212, in
    url(r'^plugins/{0}/'.format(plugin.best_name()), include('plugins.{0}.urls'.format(plugin.name))),
  File "/usr/local/lib/python3.6/site-packages/django/conf/urls/__init__.py", line 50, in include
    urlconf_module = import_module(urlconf_module)
  File "/usr/local/lib/python3.6/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "", line 994, in _gcd_import
  File "", line 971, in _find_and_load
  File "", line 955, in _find_and_load_unlocked
  File "", line 665, in _load_unlocked
  File "", line 678, in exec_module
  File "", line 219, in _call_with_frames_removed
  File "/janeway/src/plugins/archive_plugin/urls.py", line 2, in
    from plugins.archive_plugin import views
  File "/janeway/src/plugins/archive_plugin/views.py", line 8, in
    from plugins.archive_plugin import forms, plugin_settings, logic, transactional_emails
  File "/janeway/src/plugins/archive_plugin/logic.py", line 6, in
    from archive_plugin.models import Version
  File "/janeway/src/plugins/archive_plugin/models.py", line 18, in
    class Version(models.Model):
  File "/usr/local/lib/python3.6/site-packages/django/db/models/base.py", line 118, in __new__
    "INSTALLED_APPS." % (module, name)
RuntimeError: Model class archive_plugin.models.Version doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.

Quick question @mdlincoln do you have the latest master of Janeway aswell or are you branched?

Merged dev branch into master.

At the moment, I've been testing my own dev environment on 1.3 as that was (I believe) the branch that was being used for CMESH production, and hence what @hackman104 had been working with.

Got this sorted last week.


Set protected status on production branch

Hello! This is your neighborhood secops team looking out for you!
The production branch on this repository is not protected against force pushes. This setting is recommended as part of Mozilla's Guidelines for a Sensitive Repository.
Anyone with admin permissions for this repository can correct the setting using this URL.
If you have any questions, or believe this issue was opened in error, please contact us and mention SOGH001-0 and this repository.
Thank you for your prompt attention to this issue.
--Firefox Operations Security team

Hello! This is your neighborhood secops team still looking out for you!
The production branch on this repository is still not protected against force pushes. If the repository's production branches are not set as the GitHub default, please fill out this form.
If you have any questions, or believe this issue was opened in error, please contact us and mention SOGH001-2 and this repository.
Thank you for your prompt attention to this issue.
--Firefox Operations Security team

master now protected


auto_paint filter not working | CraigslistForSale 'CTA' category

The filter, auto_paint, under the CTA (cars & trucks) category in CraigslistForSale is not working. I believe it is because the filter has been changed to 'paint color' on craigslist. I am a novice hobby coder so am unfamiliar with how to implement the change myself.

Hey @Quresh95, I submitted a PR to address this issue. You can clone this version and see if it works for your situation. Here's as short article on how to clone a PR.

This was fixed by @irahorecka's wonderful PR (#98) that was just merged. There's a new version on PyPI with this fix :)

Amazing thank you!


Added Student Email domain

Student mails follow the following pattern<EMAIL_ADDRESS>

@mrcpj1998 Thank you for your request. Could you please refer us to a web page where we can see that your college offers long-term (> 1 year) IT-related courses? I found many short-term IT-related courses, for example on the page http://www.tec.dk/kurser-og-efteruddannelse/kursusoversigt/netvaerk-og-data/ but for such courses it's just simpler to use trial versions of JetBrains tools, or classroom licenses. Thank you!

@mrcpj1998 Actually, tec.dk is already listed, and it means that all tec.dk subdomains (*.tec.dk) are recognized as eligible for getting free license too. Therefore, it's not necessary to merge this pull request separately. I close the request and appreciate if you give us the link to long-term course(s) description in the comment. Thank you!

Tec is an organisation dealing with multiple technical education centers. Both Gymnasier(Before university in Denmark) and vocational training.
The Gymnasier called H.C, Ørsted Gymnasiet, can be seen on this webpage, and there can be seen different studies on that page as well. Including Mat/it which is Math and IT on A-level


Fix typo in Ethos-U Makefile.

The core platform sources were overwritten by typo. I tested this patch by triggering the Cortex-M workflow manually, and it completed successfully. See the run here in my fork:
https://github.com/iabdalkader/tflite-micro/actions/runs/10113795223
Fixes  #2639

Thanks for sorting all of this out!


Changes to reenable streams & monitors in Genie

Assorted fixes

Pull Request Test Coverage Report for Build 1306

1 of 11 (9.09%)  changed or added relevant lines in 2 files are covered.
1 unchanged line in 1 file lost coverage.
Overall coverage increased (+0.001%) to 77.475%

Changes Missing Coverage
Covered Lines
Changed/Added Lines
%

lib/ast/expression2.ts
0
10
0.0%

Files with Coverage Reduction
New Missed Lines
%

lib/ast/expression2.ts
1
75.0%

Totals

Change from base Build 1305:
0.001%

Covered Lines:
10117

Relevant Lines:
12556

💛  - Coveralls


Add keywords to auto-completion list

If, as I commonly do, I type "do" followed (with a slight delay) by enter intended as a newline, I currently get a "dodgerblue" auto-completion inserted along with "import CSS (dodgerblue)"; hardly what I was hoping for.
I suspect including keywords in the auto-completion list would resolve the issue nicely.

I have the same problem.
adding keywords or templates would let me avoid pressing esc before hitting enter in many cases

Someone suggested they might add this but never came back. I'm torn as to whether to add this to this package or language-purescript (which claims to have snippets but does not).

Ahah, I noticed the false claim too ^^
My 2 cents: il would be more logical to have those in language-purescript, but quick and temporary workarounds are not necessarikly bad.
How about ading them in your package and offering language-purecript maintainer to move them in his package and open a PR to remove them from yours if he wants to ?

language-purescript now has snippets. Is there anything further to do here?

Fixed via snippets in language-purescript. If you have any issues with snippets for built-in keywords/syntax or want to contribute enhancements please raise an issue there https://github.com/purescript-contrib/atom-language-purescript


Create Restore Point Greyed out, yet I can manually create restore points

I'm unable to create a restore point in your app as the function is greyed out, but I AM able to create restore points manually.  Why is this happening and is there something I can do to fix it? I have attached a screenshot of my registry entry for [HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SystemRestore]

Thanks, fixed in the upcoming release.

Thanks!  When will the new release come out?

Right now.


bug: address page data does not update

if navigating to an address page via the search, and then navigating to other address pages from that page, when a user hits the back button, the data does not update correctly to reflect the correct address. this should be resolved by https://github.com/blockstack/explorer/issues/465

this can be tested in https://github.com/blockstack/explorer/pull/469

Test passed hence moving it to QA Done


feat: each generator having their own function

👨💻 Changes proposed

Giving pic-text it's own function
a function to check which generator was clicked and call the function accordingly

✔ Check List (Check all the applicable boxes)

[x] My code follows the code style of this project.
[x] This PR does not contain plagiarized content.
[x] The title of my pull request is a short description of the requested changes.

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


Update test module and test on neovim 0.10.0

Update test module and test on neovim 0.10.0.

I first remove it, but focus also support 0.7.0 and I didn't want to remove support right now.


feat(campfire): replace OpenSSL with Rust deps

Really didn't want to go through the hassle of getting OpenSSL to work on Windows, so I just replaced the logic with Rust equivalents. My Chrome starts up and connects to my <IP_ADDRESS> server OK. Need to test on the other platforms.

What happened here?
https://tenor.com/view/antman-what-the-hell-happened-here-avengers-gif-18240147
Line ending shenanigans?

What happened here?
https://tenor.com/view/antman-what-the-hell-happened-here-avengers-gif-18240147
Line ending shenanigans?

You didn't see anything 🙈

Yeah, no worries at all, the cert stuff can be quite scary. I worked for a 2FA startup as my first job, so I ended up learning a lot about certificates and crypto and enough to know I should leave it to the experts for the most part 😂


remove '--version' from 'helm repo add'

--version is not part of helm repo add
https://helm.sh/docs/helm/helm_repo_add/

@nicks @landism can you look at this bug fix?

This bug was introduced with #50

FYI @Tchoupinax

Thanks ! @KOGI


How to perform QR code analysis while displaying camera pictures

How to perform QR code analysis while displaying camera pictures，Now I can only display pictures or QR code, but they cannot work at the same time

Hi @geekeritcom,

Now I can only display pictures or QR code, but they cannot work at the same time

This is not true. You can display both image from webcam, and QR code. The problem is how you implement this :)
You can for example open camera in async mode so it does not block when you call getImage(), pass it to WebcamPanel, and use the very same Webcam instance in a separate Thread to read QR code from image. Both image display and analysis will be done here in parallel.
Another example would be have a custom WebcamImageTransformer which reads the code from image before it's returned from getImage(), but this solution will most likely drop effective FPS since QR code analysis time will be added to the getImage() execution time. QR code analysis and image display will be done here one after the other (and for every image)
Please take a look at this basic example. Here image from webcam id displayed in parallel to the QR code analysis:
https://github.com/sarxos/webcam-capture/blob/master/webcam-capture-examples/webcam-capture-qrcode/src/main/java/com/github/sarxos/example1/WebcamQRCodeExample.java
This example is the embodiment of the the first idea I described above.

Thank you very much for responding so fast. Yesterday I also found a solution by referring to the image of the network camera. I saw your reply code today. Thank you very much. In any case, thank you for your reply and such a great tool.
private static void runTask(Webcam webcam) {
        ExecutorService executorService = Executors.newSingleThreadExecutor();
        executorService.submit(() -> {
            webcam.setViewSize(WebcamResolution.VGA.getSize());

            WebcamPanel panel = new WebcamPanel(webcam);

            panel.setFPSDisplayed(true);
            panel.setDisplayDebugInfo(true);
            panel.setImageSizeDisplayed(true);
            panel.setMirrored(true);

            Thread thread = new Thread() {
                @Override
                public void run() {
                    while (true) {
                        if (!webcam.isOpen()) {
                            webcam.open(true);
                        }
                        BufferedImage image = webcam.getImage();
                        try {
                            ZxingUtil.decodeImg(image);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                        try {
                            TimeUnit.SECONDS.sleep(1);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            };
            thread.start();

            JFrame window = new JFrame("Test webcam panel");
            window.add(panel);
            window.setResizable(true);
            window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            window.pack();
            window.setVisible(true);
        });
    }


[warn] dropping dependency on node with no phase object: refchecks

I get this error when I try to generate scaladocs: [warn] dropping dependency on node with no phase object: refchecks
sbt doc

Interesting, scaladoc doesn't run the entire compilation process and so it doesn't hit the refchecks compiler phase (run scalac -Xshow-phases to see what I mean, but scaladoc -Xshow-phases just warns "Phases are restricted when using Scaladoc", but doesn't give a list). Linter adds its own compiler phase after refchecks, but the setting is just a plain string in the compiler plugin API - will have to check the docs if there's a way to list existing compiler phases before registering linter's compiler phases.
It's a warning and I think it shouldn't be causing any problems beyond printing this, but I'll check and try to fix when I find time.
One workaround would also be to limit linter in sbt to only the tasks where it's needed (I think in Compile and if you lint tests, in Test), but I don't know enough about that sbt feature to write the config: http://www.scala-sbt.org/0.13.5/docs/Detailed-Topics/Tasks.html

@HairyFotr It's a warning, but if you have "-Xfatal-warnings" turned on, it breaks the build. I hope a majority of people have that turned on so it's probably a bigger deal than it seems.

You're right, and knowing this does raise the priority of the issue. The fix will need to be disabling parts or maybe even the whole Linter if the required compiler phases are not available, so I think I'll still output something (but more informative than what the compiler spits out). And it will be info, not warn, so it will not break the build on -Xfatal-warnings.

@HairyFotr An info log would be great! Thanks for your attention to the issue!

@HairyFotr did you have a chance to look at this issue?

Glad to see this has been fixed! Is there any estimate for when this gets released?

I'd like to solve a few more issues, and I left my release signing keys at home... so, ~2 weeks

I, too, hate it when I leave my keys at home! 😉
Thanks for the estimate!


can't give argument to non-function not .Params.hidden

Build fail when using Hugo 0.71.1.
Related issue: #401

I have currently downgraded hugo in my dev and prod environments because if this issue -- if this PR fixes the problem, can it be merged? Are other problems expected?

Build fail when using Hugo 0.71.1.
Related issue: #401

Thank you for contributing the fix @qiwenmin

Fixes https://github.com/gohugoio/hugoThemes/issues/858


Grid layout with adaptive column width

I love the grid layout, but: it has fixed column width :-(
The standard (non grid) layout sets the width according to the column content and this is what I'd like grid layout could do. The option 'grid_default_col_width' is the only one I've found, but no success...
Any idea how to get it work?
Thanks a lot!
Michael

Unfortunately, it is currently one of the requirements to have fixed column widths for the grid-layout mode. I am afraid there is no easy work-around, this is what you could do:

Set grid_default_col_width to 'auto' and remove col_widths option if any
Subscribe to the initialized event and programmatically set the content table columns widths to the headers table columns:

    var tf = new TableFilter('your-table-id', yourConfigObject);
    tf.emitter.on(['initialized'], function(tf){
        var gridLayout = tf.feature('gridLayout');
        var headerTable = gridLayout.headTbl;
        var headerCols =  headerTable.getElementsByTagName('col');

        [].forEach.call(tf.tbl.rows[0].cells, function(cell, idx){
            headerCols[idx].style.width = cell.clientWidth + 'px';
        });
    });
    tf.init();

Thanks for the prompt reply! The solution was promising, but unfortunately the header looses the synchronization to the rest of the table. Means that header has now its own column widths and you cannot relate it to the data columns:

After applying column visibility extension you get this:

What I'd like to have actually is a table with a frozen header that does not scroll. Maybe there is another way to do this apart from using grid layout?

For both scenarii, try to import the main stylesheet filtergrid.css in page head or before the table element as mentioned in http://koalyptus.github.io/TableFilter/grid-layout.html demo.


podman unable to load container from tgz

When following documented instructions for load from tgz for offline installation an invalid manifest error is presented with no workaround.

:tada: This issue has been resolved in version 1.42.0-develop.1 :tada:
The release is available on GitHub release
Your semantic-release bot :package::rocket:

:tada: This issue has been resolved in version 1.43.0-develop.10 :tada:
The release is available on GitHub release
Your semantic-release bot :package::rocket:

:tada: This issue has been resolved in version 1.43.0 :tada:
The release is available on GitHub release
Your semantic-release bot :package::rocket:


Inverted bit values to show correct status

Bit mask values where inverted. Updated to show correct values.

I'll let you test the changes to bitfield before merging (or cancelling) this PR.


fullscreenER 1.1.1 buggy

I'm using fullscreenER 1.1.1 in OS X 10.10.5 (Yosemite), and it's making my open/save dialog boxes almost nonfunctional. They will not respond to any clicking by the mouse, although they will respond to keys typed on the keyboard, including (fortunately), the Esc key. It may be a dynamic with DefaultFolder X v5.1.1, which I am also using, but I did not have time to zero in on the possible interaction.

Probably not gonna fix specific interactions like that.


English (Upside Down) translations

i added translations for the upside down language option

please no more

Hi CodeClient Developers,
While I understand that you don't want bad-quality translations, I have to press the difficulty of typing upside-down chars.
I don't have a keyboard the size of a country, and I don't think I could afford one, or fit one in my house.


project and IDE settings are not there

https://grader.cs.hut.fi/static/studio2_k2021dev/projects/S2_2021_project_settings.zip
https://grader.cs.hut.fi/static/studio2_k2021dev/projects/S2_2021_ij_settings.zip
2020-12-16 19:34:01,099 [ 204251]  ERROR - ij.actions.CourseProjectAction - Failed to import IDE settings
fi.aalto.cs.apluscourses.model.UnexpectedResponseException: 404 Not Found

are now


Support custom number of columns

The actual # of columns setting code is trivial:
setenv("COLUMNS", "120", 1);

but in order to support this we'll need to bring option parsing to pm.

Of course, we also need a --version option.