docs: Add roadmap, update READMEs and contributing guide

I had some time this weekend to start working on readmes and add a roadmap. Here are my notes from the meeting where we identified this problem:

the primary theme that kept emerging is we need to be more transparent about our roadmap and our motivations. we have a lot of ideas and features that we have signaled interest in, but it's time to put out clear signals about what we're aiming for this year, what would be nice to have community support for, and what we are not going to do. I'm taking it as my task to update the readme and get this started.

I also took the time to add a readme to the wasi package. Mainly to document how it works but also document our plans for it.
I'm at a conference this week but should be able to continue improving this through the week. Feel free to drop comments or ideas in this draft state.

I think this is in a good merging spot. There are some things we can maybe follow up on, so feel free to edit the table and docs in follow up PRs. Consider all of this as a living doc.


Event Handler Removal Can Cause Issues for other registered handlers

Events like selectstart and eventdrag have handlers added to the document body. They are then removed on close. If other scripts have registered handlers on the document for selectstart etc then removing them will break those scripts. It would be safer to ensure that removing handlers for events added to the document doesn't effect any other handlers.
Namespacing the events would make the plugin more robust. Happy to do PR to change.

Hey!
Sadly I don't have time to maintain this project, in fact, I would happily hand it over to someone who would take care of it.
Anyways, if you would do a PR it would be nice!


Gallery code consistency

Minor PR to:

Tidy up imports on gallery code
Remove old init.py

@tkknight Thanks for this...
However, in terms of imports we've adopted the following style to group imports into the following blocks:

import Python builtin modules i.e., those modules that ship with Python e.g., collections, datetime etc
import third-party modules i.e., those modules that are not part of iris nor Python e.g., cftime, matplotlib, numpy etc
import iris specific modules i.e., those modules that are part of iris e.g., iris.coord, iris.cube, iris.plot etc

The blocks of imports are separated by blank lines, and within each block the modules are listed alphabetically

@tkknight Awesome, thanks :+1:


Experhash-0.1.1/priv/experhash_port: Syntax error: word unexpected (expecting ")")

Experhash is working fine locally, but in production I am getting an error. I'm using Distillery 2 and Docker to make releases on Ubuntu 16.04. Imagemagick is installed on both the docker image and on the production server, and mix compile runs during the build.
Genserver times out, but I believe that is just a symptom.
experhash-0.1.1/priv/experhash_port: Syntax error: word unexpected (expecting ")")
Phoenix 1.4.3
Elixir 1.8.1
Distillery 2.0 using the new Elixir provider
11:07:51.097 request_id=FZXvw-ylKvX9vlEAAADx [debug] Processing with DistanceWeb.DocumentController.new/2
  Parameters: %{}
  Pipelines: [:browser]
11:07:51.098 request_id=FZXvw-ylKvX9vlEAAADx [info] Sent 200 in 3ms
11:08:02.951 request_id=FZXvxq9fFd2k4d0AAAEB [info] POST /documents
11:08:02.955 request_id=FZXvxq9fFd2k4d0AAAEB [debug] Processing with DistanceWeb.DocumentController.create/2
  Parameters: %{"_csrf_token" => "RysAfnR6Yk4BenoDIB0KAgxlDDU8JgAA3n//DH7xH77LcEr0EP8EVQ==", "_utf8" => "✓", "document" => %{"file" => %Plug.Upload{content_type: "image/png", filename: "a028.png", path: "/tmp/plug-1555/multipart-1555412882-15036320304116-1"}}}
  Pipelines: [:browser]
/home/deploy/lib/experhash-0.1.1/priv/experhash_port: 1: /home/deploy/lib/experhash-0.1.1/priv/experhash_port: Syntax error: word unexpected (expecting ")")
11:08:12.959 request_id=FZXvxq9fFd2k4d0AAAEB [info] Converted exit {:timeout, {GenServer, :call, [#PID<0.1680.0>, {:command, {:hash, :dd, "media/1555412882-15036320304116-1-a028-orig.png", 8}}, 10000]}} to 500 response
11:08:12.961 request_id=FZXvxq9fFd2k4d0AAAEB [error] Process #PID<0.1678.0> terminating
** (exit) an exception was raised:
    ** (ErlangError) Erlang error: {{:timeout, {GenServer, :call, [#PID<0.1680.0>, {:command, {:hash, :dd, "media/1555412882-15036320304116-1-a028-orig.png", 8}}, 10000]}}, {DistanceWeb.Endpoint, :call, [%Plug.Conn{adapter: {Plug.Cowboy.Conn, :...}, assigns: %{}, before_send: [], body_params: %Plug.Conn.Unfetched{aspect: :body_params}, cookies: %Plug.Conn.Unfetched{aspect: :cookies}, halted: false, host: "redacted", method: "POST", owner: #PID<0.1678.0>, params: %Plug.Conn.Unfetched{aspect: :params}, path_info: ["documents"], path_params: %{}, port: 80, private: %{}, query_params: %Plug.Conn.Unfetched{aspect: :query_params}, query_string: "", remote_ip: {127, 0, 0, 1}, req_cookies: %Plug.Conn.Unfetched{aspect: :cookies}, req_headers: [{"accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"}, {"accept-encoding", "gzip, deflate, br"}, {"accept-language", "en-US,en;q=0.5"}, {"connection", "upgrade"}, {"content-length", "30026"}, {"content-type", "multipart/form-data; boundary=---------------------------7719490031198181894888934539"}, {"cookie", "_distance_key=SFMyNTY.g3QAAAABbQAAAAtfY3NyZl90b2tlbm0AAAAYdEUvUTAyVTZJTU1PQ1h4Mkk1NHBqdz09.Ojpdcrhb9AN8xoU4Sjxl5rR-uCsb6wFd-FJlt6vuz4Y"}, {"host", "redacted"}, {"referer", "https://redacted/documents/new"}, {"upgrade-insecure-requests", "1"}, {"user-agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:68.0) Gecko/20100101 Firefox/68.0"}, {"x-cluster-client-ip", "<IP_ADDRESS>"}, {"x-forwarded-for", "<IP_ADDRESS>"}], request_path: "/documents", resp_body: nil, resp_cookies: %{}, resp_headers: [{"cache-control", "max-age=0, private, must-revalidate"}], scheme: :http, script_name: [], secret_key_base: nil, state: :unset, status: nil}, []]}}
(phoenix) lib/phoenix/endpoint/cowboy2_handler.ex:49: Phoenix.Endpoint.Cowboy2Handler.init/2
(cowboy) /redacted/distance/deps/cowboy/src/cowboy_handler.erl:41: :cowboy_handler.execute/2

Interesting!
Something makes the system not recognize that experhash_port is an executable. Instead, it tries to run it as a shell script, which of course fails spectacularly.
I did some googling and found this thread on the Elixir Forum: https://elixirforum.com/t/experhash-0-1-1-priv-experhash-port-syntax-error-word-unexpected-expecting/21666. I'm guessing you are the same jpinnix, so it looks like you found a workaround at least. Sounds like the Makefile is wonky, which is not surprising considering I don't really know make. I'll take a look at it when I have some spare time.
(Sorry for the late answer, I've been away on vacation. And yes, I'm not actively working on this project, but I do want to fix any errors people find.)

I don't know make either, haha.
Let me know if I can help. And no worries about the delay. I hope you had a restful vacation!

Good news: I found out that there is a ready-made make compile task for mix now: https://github.com/elixir-lang/elixir_make. With the environment variables it adds, it'll make it easier to put build output where it belongs. (It is also more polished than my custom task)

Nice!
On Sat, Apr 27, 2019 at 2:00 PM Ookami<EMAIL_ADDRESS>wrote:

Good news: I found out that there is a ready-made make compile task for
mix now: https://github.com/elixir-lang/elixir_make. With the environment
variables it adds, it'll make it easier to put build output where it
belongs. (It is also more polished than my custom task)
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub
https://github.com/kemonomachi/experhash/issues/11#issuecomment-487311182,
or mute the thread
https://github.com/notifications/unsubscribe-auth/AAABCVF4RPCWOEZ4CTSU4QTPSSPDNANCNFSM4HGIGMDQ
.

Nice!

Have switched over to elixir_make now, will figure out the rest on Wednesday

@jpinnix I've shuffled things around a bit now. Could you try the latest master, to see if it works for you? I didn't leave any cleanup for the old location, so please run mix deps.clean experhash before updating.
I'm now placing all C++ output in the _build folder instead, in the proper location for whatever mix environment is set.

Absolutely. I’ll give it a whir. Thanks!

@kemonomachi This works perfectly! Thank you so much!


fixes #2469 typo correction

@definedrisk : Thanks for your contribution! The author(s) have been notified to review your proposed change.


Change the game's window resolution instead of the project's viewport resolution

If the goal is to test various resolutions for your game it should change the game's window resolution and not the project's viewport resolution.
The viewport resolution should stay the same during a project because it allows to decide the size needed for the art assets, especially in pixel art games. So it's better if the parameter is only accessible manually. While changing the game's resolution instead would allow to test the responsiveness of the UI and the resolution of the assets on different screen sizes and ratios.
There is a parameter in Project Settings > Display > Size which allows to target the resolution of the game's window:
Window Width Override & Window Height Override.
In ProjectResolution.gd you only have to change for these parameters in func _set_resolution(id)
		ProjectSettings.set_setting("display/window/size/window_width_override", res[0])
		ProjectSettings.set_setting("display/window/size/window_height_override", res[1])

Thanks for your suggestion. I updated the plugin to instead change the game's window resolution by default. I also added an option to Change Viewport Resolution.


some trial log files do not contain stimulus information

for example see:
2021-07-08_30_TEST_00020.csv

I believe this is a duplicate of #43


publicKey.encrypt is not a function

I got this error
privateKey.sign is not a function
in the below code:
var signature = crypt.signature(privateKey, text);
Also
publicKey.encrypt is not a function
in here:
var encrypted = crypt.encrypt(publicKey, text);
Does anyone know about this?

How did you generate your RSA key pair? Public and private keys must be RSA keys in PEM format. You can generate key pair following way:
// Initialize RSA-class
var rsa = new RSA();

// Generate RSA key pair, default key size is 4096 bit
rsa.generateKeyPair(function(keyPair) {
    // Callback function receives new key pair as a first argument
    var publicKey = keyPair.publicKey;
    var privateKey = keyPair.privateKey;
});

This is how I generate the keys:
var rsa = new RSA();
rsa.generateKeypairAsync().then(keypair => {
     var publicK = keypair.publicKey;
     var privateK = keypair.privateKey;
        console.log(publicK);
        console.log(privateK);
        AsyncStorage.setItem('publicKey', publicK);
        AsyncStorage.setItem('privateKey', privateK);
      });

here the keys get generated succesfuly and I saved them in the storage, at the next phase when I want to use the keys to encrypt the text, I get those errors.
      const publicKey= AsyncStorage.getItem('publicKey');
      const privateKey= AsyncStorage.getItem('privateKey');
      var signature = crypt.signature(privateKey, text);
      var encrypted=crypt.encrypt(publicKey, text, signature);

Error:
privateKey.signature is not a function

AsyncStorage.getItem is an asyncronous function and it returns promise. Use await keyword or resolve the promise to access actual key. This is not a problem with the Hybrid Crypto JS.

Even after I removed AsyncStorage call and changed the code to the sample in your repo, still I got the error:
return rsa.generateKeypairAsync().then(keys => {
          var signature = crypt.signature(keys.privateKey, 'Hello world');
          console.log("signature: ",signature);
          var encrypted = crypt.encrypt(keys.publicKey, 'Hello world', signature);
          console.log("encrypted: ",encrypted);
          var decrypted = crypt.decrypt(keys.privateKey, encrypted);
          console.log("decrypted: ",decrypted);
          var verify = crypt.verify(
            keys.publicKey,
            decrypted.signature,
            'Hello world',
          );
          console.log("verify: ",verify);
        }).catch(error => {
            console.log(error);
        });

TypeError: privateKey.signature is not a function
    at Crypt.signature (...\node_modules\hybrid-crypto-js\lib\crypt.js:85)
    at eval (eval at <anonymous> (...\node_modules\react-native\node_modules\metro\src\lib\bundle-modules\injectUpdate.js:71), <anonymous>:133:35)
    at tryCallOne (...\node_modules\promise\setimmediate\core.js:37)
    at ...\node_modules\promise\setimmediate\core.js:123
    at ...\node_modules\react-native\Libraries\Core\Timers\JSTimers.js:289
    at _callTimer (...\node_modules\react-native\Libraries\Core\Timers\JSTimers.js:146)
    at _callImmediatesPass (...\node_modules\react-native\Libraries\Core\Timers\JSTimers.js:194)
    at Object.callImmediates (...\node_modules\react-native\Libraries\Core\Timers\JSTimers.js:458)
    at MessageQueue.__callImmediates (...\node_modules\react-native\Libraries\BatchedBridge\MessageQueue.js:366)
    at ...\node_modules\react-native\Libraries\BatchedBridge\MessageQueue.js:135

Same code works for me when using latest version of the library (0.2.1). Are you running your code in Node environment or in browser?
Code:
var { Crypt, RSA } = require("hybrid-crypto-js");

var crypt = new Crypt({ md: "sha1" });
var rsa = new RSA({ keySize: 1024 });

rsa
  .generateKeypairAsync()
  .then(keys => {

    var signature = crypt.signature(keys.privateKey, "Hello world");
    console.log("signature: ", signature);

    var encrypted = crypt.encrypt(keys.publicKey, "Hello world", signature);
    console.log("encrypted: ", encrypted);

    var decrypted = crypt.decrypt(keys.privateKey, encrypted);
    console.log("decrypted: ", decrypted);

    var verify = crypt.verify(
      keys.publicKey,
      decrypted.signature,
      "Hello world"
    );
    console.log("verify: ", verify);
  })
  .catch(error => {
    console.log(error);
  });

Output:
signature:  {"signature":"QdbM1OaTne4iz4n53U1MzKQSWI7QMy9U2t/MpWTRO3oR5FYCgEZQY8vck+jaGkC84rCzNnDUaonSdS5z/aD1+0xFkpw9ULMDUBEuwqBlJRyUpXTyPc5YW4n+WLv20x2BlARh/nggIQo0ZK/9hrHDd7cvD/E0tTrEt34FvRctWlE=","md":"sha1"}
encrypted:  {"v":"hybrid-crypto-js_0.2.1","iv":"vR/n69rXG94h/mdKOmQKYoVYCnIT+mDPgsnEp6MvcM4=","keys":{"01:1e:5e:d3:3f:62:0e:02:5b:f6:37:51:3f:36:15:79:5b:9a:0b:1d":"caBUuV+kEHqVPCMRM9ouxMHgCYbTO7mT81E5pU2YUmSa5zXAZOU+f5JK9f1UD0ZEzCIKVPj6HuvSrFGehKaDUbddWctnxGrS43QNCLTOay7ZP3h4KDgtQkNFhB4XqCjAx5oZ+GKeq+qdAvNHnPabINNPHkKBYARPcxVQVvlwZ7Y="},"cipher":"p9cEtmB7oZa/dRF2Wm2yhQ==","signature":"{\"signature\":\"QdbM1OaTne4iz4n53U1MzKQSWI7QMy9U2t/MpWTRO3oR5FYCgEZQY8vck+jaGkC84rCzNnDUaonSdS5z/aD1+0xFkpw9ULMDUBEuwqBlJRyUpXTyPc5YW4n+WLv20x2BlARh/nggIQo0ZK/9hrHDd7cvD/E0tTrEt34FvRctWlE=\",\"md\":\"sha1\"}"}
decrypted:  { message: 'Hello world', signature: '{"signature":"QdbM1OaTne4iz4n53U1MzKQSWI7QMy9U2t/MpWTRO3oR5FYCgEZQY8vck+jaGkC84rCzNnDUaonSdS5z/aD1+0xFkpw9ULMDUBEuwqBlJRyUpXTyPc5YW4n+WLv20x2BlARh/nggIQo0ZK/9hrHDd7cvD/E0tTrEt34FvRctWlE=","md":"sha1"}' }
verify:  true

Yes, it is the latest one:
"hybrid-crypto-js": "^0.2.1"
I'm running the code in Node, it is React Native project. "react-native": "0.60.5"
Did you run this code in a new project or somewhere else?
I don't know where is my mistake?!
Thanks for your help

Can you post the output of your code above? Not just the error message but console loggings also.

TypeError: privateKey.signature is not a function
firebaseSDK.js:137
message:"privateKey.signature is not a function"
stack:"TypeError: privateKey.signature is not a function\n
at Crypt.signature (C:\Users\ZoeyRahimi\ReactNative\Gamma_Demo\.vscode\.react\index.bundle:154923:36)\n
at C:\Users\ZoeyRahimi\Demo\.vscode\.react\index.bundle:114677:35\n
at tryCallOne (C:\Users\ZoeyRahimi\Demo\.vscode\.react\index.bundle:46069:14)\n
at C:\Users\ZoeyRahimi\Demo\.vscode\.react\index.bundle:46170:17\n
at C:\Users\ZoeyRahimi\Demo\.vscode\.react\index.bundle:47043:21\n
at _callTimer (C:\Users\ZoeyRahimi\Demo\.vscode\.react\index.bundle:46932:9)\n
at _callImmediatesPass (C:\Users\ZoeyRahimi\Demo\.vscode\.react\index.bundle:46968:9)\n
at Object.callImmediates (C:\Users\ZoeyRahimi\Demo\.vscode\.react\index.bundle:47187:14)\n
at MessageQueue.__callImmediates (C:\Users\ZoeyRahimi\Demo\.vscode\.react\index.bundle:15638:16)\n
at C:\Users\ZoeyRahimi\Demo\.vscode\.react\ind...
__proto__:Error {constructor: , name: "TypeError", message: "", …}

I mean, can you post the console output of code you posted in this message https://github.com/juhoen/hybrid-crypto-js/issues/20#issuecomment-527725173 ?

Which tab of output do you mean?
the current output is empty!
Sorry, I'm new to react-native.

Your code snippet has some console logs. I would like to know on-run values of keys, signature, encrypted and decrypted to be able to figure out what happens.
var signature = crypt.signature(keys.privateKey, 'Hello world');
console.log("signature: ",signature);  // <-- I'd like know the output of this line
var encrypted = crypt.encrypt(keys.publicKey, 'Hello world', signature);
console.log("encrypted: ",encrypted);  // <-- And this
var decrypted = crypt.decrypt(keys.privateKey, encrypted);
console.log("decrypted: ",decrypted);  // <-- And this

Exactly at the first line, I get the error so I never see the log of signature!!
var signature = crypt.signature(keys.privateKey, 'Hello world');
for more clarity this is the code:
          console.log("PrivateKey: ",keys.privateKey);
          console.log("PublicKey: ",keys.publicKey);
          var signature = crypt.signature(keys.privateKey, "Hello world");

And here is output:
PrivateKey:  -----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQCIAwjU+wZEKsbAzSKPq/mvzoDm9iIuPa5ZN+iFM219HCtjg3m/
pre3uAkqnFl3aCl/4toZGIg44mpKor8zK+274uYyDmrBN3t5o98vfpzVA1azri0o
lFNlDH2QoOzDBtFBA77ghQJAKDUXGsJEgq3d2RM8btrfoFaxONxUAnI/sQIDAQAB
AoGAM/UQzSedw7Ghnmpevwqfxfi5hkFVWlvGvB9e7G9ybn4x1wCVJFDgUsbzfXsf
tD0uyUNUNI0KEMzxdNSJ/NbVqEeZrmsz7zAR/dJlvpFa2NQYvV6unpSReetHfYsp
trnfP1SoliSrHNBsrx7g0iqdWsxlV9kXGeRS29ls7hvMrLcCQQC8NDh/uSUSJB63
KY16bCPH6PKj3bQv4+Wj8WmIYHkYbdowIEI4GRvpeifaQliHWa001TC/ArGdqquK
NWRMcVmbAkEAuQHDmUYHXsVTgdejWDv6t9dov8mExYk+3h73g+HaBH786X4k7n26
a9HJvoeCNxTMS99QdtKU2p2+42mnm9a2owJBAKvWilej9oMP07OtDu5eWnUm7pRL
0z9+t6fuvkq0uxxhALy8V3ndAy00SbrwpOBAMvNwTCe7D+1DbYitozxgqk0CQQCM
+7Eo3lrDd7AZZFCP7rUy365taI4LUnlcH1ETaUsQ3gyxinVuYNVtUKNi1DUA8JJ2
xyi0Q+k3Z7qN5nfZpBftAkB9EfokxoLhXjpzLy7mxsMYgwgdvQanKejwr28M6SPT
iUvElzK3SIXhGh2OjDewS4MDLffaHHsliyxN7NV0lyli
-----END RSA PRIVATE KEY-----

C:\Users\ZoeyRahimi\ReactNative\Gamma_Demo\config\firebaseSDK.js:127 PublicKey:  -----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCIAwjU+wZEKsbAzSKPq/mvzoDm
9iIuPa5ZN+iFM219HCtjg3m/pre3uAkqnFl3aCl/4toZGIg44mpKor8zK+274uYy
DmrBN3t5o98vfpzVA1azri0olFNlDH2QoOzDBtFBA77ghQJAKDUXGsJEgq3d2RM8
btrfoFaxONxUAnI/sQIDAQAB
-----END PUBLIC KEY-----

C:\Users\ZoeyRahimi\ReactNative\Gamma_Demo\config\firebaseSDK.js:146 TypeError: privateKey.signature is not a function
    at Crypt.signature (C:\Users\ZoeyRahimi\ReactNative\Gamma_Demo\node_modules\hybrid-crypto-js\lib\crypt.js:85)
    at C:\Users\ZoeyRahimi\ReactNative\Gamma_Demo\config\firebaseSDK.js:128
    at tryCallOne (C:\Users\ZoeyRahimi\ReactNative\Gamma_Demo\node_modules\promise\setimmediate\core.js:37)
    at C:\Users\ZoeyRahimi\ReactNative\Gamma_Demo\node_modules\promise\setimmediate\core.js:123
    at C:\Users\ZoeyRahimi\ReactNative\Gamma_Demo\node_modules\react-native\Libraries\Core\Timers\JSTimers.js:289
    at _callTimer (C:\Users\ZoeyRahimi\ReactNative\Gamma_Demo\node_modules\react-native\Libraries\Core\Timers\JSTimers.js:146)
    at _callImmediatesPass (C:\Users\ZoeyRahimi\ReactNative\Gamma_Demo\node_modules\react-native\Libraries\Core\Timers\JSTimers.js:194)
    at Object.callImmediates (C:\Users\ZoeyRahimi\ReactNative\Gamma_Demo\node_modules\react-native\Libraries\Core\Timers\JSTimers.js:458)
    at MessageQueue.__callImmediates (C:\Users\ZoeyRahimi\ReactNative\Gamma_Demo\node_modules\react-native\Libraries\BatchedBridge\MessageQueue.js:366)
    at C:\Users\ZoeyRahimi\ReactNative\Gamma_Demo\node_modules\react-native\Libraries\BatchedBridge\MessageQueue.js:135

After i call signiture method , there is some issue inside the method in Crypt.js in the lib.
signature(privateKey, message) {
        // Create SHA-1 checksum
        const checkSum = this._getMessageDigest(this.options.md);
        checkSum.update(message, 'utf8');

        // Accept both PEMs and forge private key objects
        if (typeof privateKey === 'string')
            privateKey = pki.privateKeyFromPem(privateKey);

        const signature = privateKey.signature(checkSum);// here i get the error: privateKey.signature is not a function
        const signature64 = forge.util.encode64(signature);

        // Return signature in JSON format
        return JSON.stringify({
            signature: signature64,
            md: this.options.md,
        });
    }

It seems that, for a some reason, private key gets never casted into forge private key object. What's your output for console.log(typeof keys.privateKey) ? It would be nice to know what value privateKey has just before the line that causes the error.

I found the issue! it was my mistake that inside the Crypt.js I had changed the name of sign  method to signature !!
I'm so sorry for taking your time for such a bad mistake!
I got this:
signature:  {"signature":"G4ifUHNBNYHKCVL3vz+4FMDSQ3hYC6nr7C8O1NFtq8zCgkPD2004gDhxBaGssQ/JXVeq2kC3L6zZLkoGfT9mPwnK4ojsXYUgLVm/H12K4iCwftpQn2csmkcVLaP0HJB0eYJOJLc+5Hhpty5CVdfOZgLpyNr4cgajML4+ekE3Sj8=","md":"sha1"}
C:\Users\ZoeyRahimi\ReactNative\Gamma_Demo\config\firebaseSDK.js:135 encrypted:  {"v":"hybrid-crypto-js_0.2.1","iv":"sc+A7PjYNNTLUwuSX3OyrB67I/ZSk31k+N4Dd/CvbXE=","keys":{"f4:db:70:89:6d:c7:3b:1d:f8:26:f9:b4:a4:64:9e:f2:3f:b2:58:6e":"JKWsm72EwIWd+OTEqN2ngj8LGJOQmchpd7g7ow7NkkoiBCwupVSIXuWAiiHCMqWUfszk5LUy/pMewEgWC0OFQB82glrDK+jjVP7nj7cHRsOo7FMaoRAXQARVnIB6KaN8d5SdWQj6AxydCgECZfkcSwGOy+o3oTrEHjJf5wF9nzw="},"cipher":"cOkyOVyffrA9yxBKFLpCnw==","signature":"{\"signature\":\"G4ifUHNBNYHKCVL3vz+4FMDSQ3hYC6nr7C8O1NFtq8zCgkPD2004gDhxBaGssQ/JXVeq2kC3L6zZLkoGfT9mPwnK4ojsXYUgLVm/H12K4iCwftpQn2csmkcVLaP0HJB0eYJOJLc+5Hhpty5CVdfOZgLpyNr4cgajML4+ekE3Sj8=\",\"md\":\"sha1\"}"}
C:\Users\ZoeyRahimi\ReactNative\Gamma_Demo\config\firebaseSDK.js:137 decrypted:  {message: "Hello world", signature: "{"signature":"G4ifUHNBNYHKCVL3vz+4FMDSQ3hYC6nr7C8O…Hhpty5CVdfOZgLpyNr4cgajML4+ekE3Sj8=","md":"sha1"}"}
C:\Users\ZoeyRahimi\ReactNative\Gamma_Demo\config\firebaseSDK.js:143 verify:  true


dateLastEdited in CommentCard Action

Vineet Rawat (vineet_rawat on BitBucket) wrote:

Trello adds a property "dateLastEdited" for edited cards. It doest not change the Creation date.

i.e. If I create a comment then it will set the "date" attribute to the creation date. Next time if I edit the comment it will add "dateLastEdited" attribute to the time the comment was modified. The "dateLastEdited" is not shown for new comments.

Please see the attachment. The first comment is a new comment and the second one is edited.

Vineet Rawat (vineet_rawat on BitBucket) wrote:

The nuget version of packages:
.NET 4.0
Manatee.Json 3.1.4
Manatee.StateMachine 1.1.2
Manatee.Trello 1.7.0
Manatee.Trello.ManateeJson 1.3.10
Manatee.Trello.RestSharp <IP_ADDRESS>
RestSharp 105.1.0

Please upgrade to the following:

Manatee.Trello v1.8.0
Manatee.Trello.ManateeJson v1.4.0.

Feature implemented


Timilehin's quote

removed nickname and multiple professions

You have a conflicting file, please resolve

This PR has conflict with the base branch. Kindly resolve


Server plugin?

Will there be a server plugin version of this, so servers running Paper, Spigot, etc can disable chat reports for the entire server?

See #11 for discussion of that.


Create gempush.yml

Coverage decreased (-0.01%) to 97.89% when pulling ff87e34e5d802b402d14b50e0ed3c2672f4e265c on sgmelayu:master into 703875d59a82af924a2ebaf21737ff8a0f1306b5 on onelogin:master.


Feature Request: Overlay Icons in Solution Explorer

I'm using this extension for the first time.
There is any possibility to shown an overlay icon on each file/folder shown in the solution explorer?
In this way it's very easy to identify the changed/commit/unlocked files.

I hope you will like using this extension!
Please read this wiki about the overlay icons: Source Control Integration

Ok, thanks for the answer.
I'm using ankhsvn in the Visual Studio 2017 but unfortunately it's not available for Visual Studio 2019

I edited the vsixmanifest of AnkhSVN to include support for VS2109, might work, might not, give it a try.
https://drive.google.com/open?id=1Prc1GTwdfZpEkD0GDKFI1Zi4BPevQ0JE
And I'll see if I can include the overlay icons in the future...

Unfortunately the installation does not works.
I receive an exception (translated from Italian):
This extension cannot be installed because the following references are missing:
Microsoft.VisualStudio.Component.CoreEditor
-Microsoft.VisualStudio.Component.CoreEditor (Microsoft.VisualStudio.Component.CoreEditor)
in Microsoft.VisualStudio.ExtensionManager.EngineUtilities.EnsureNoMissingReferences(IEnumerable1 missingRefs)    in Microsoft.VisualStudio.ExtensionManager.PackageInstaller.PrepareEngineInstall(IDependencyGraph dGraph, IDependencyComparisonSeed seed, Component vsCompPkg, Boolean isProductComponent, Int32& totalInstallationSteps)    in Microsoft.VisualStudio.ExtensionManager.ExtensionEngineImpl.PerformSetupEngineInstall(InstallableExtensionImpl extension, Boolean installPerMachine, Boolean isPackComponent, IDictionary2 extensionsInstalledSoFar, List1 extensionsUninstalledSoFar, IInstalledExtensionList modifiedInstalledExtensionsList, IProgress1 progress, InstallFlags installFlags, AsyncOperation asyncOp, Version targetedVsVersion, IInstalledExtension& newExtension)
in Microsoft.VisualStudio.ExtensionManager.ExtensionEngineImpl.InstallInternal(InstallableExtensionImpl extension, InstallFlags installFlags, IDictionary2 extensionsInstalledSoFar, List1 extensionsUninstalledSoFar, IInstalledExtensionList modifiedInstalledExtensionsList, AsyncOperation asyncOp, IProgress`1 progress, Version targetedVsVersion)
in Microsoft.VisualStudio.ExtensionManager.ExtensionEngineImpl.BeginInstall(IInstallableExtension installableExtension, InstallFlags installFlags, AsyncOperation asyncOp, Version targetedVsVersion)
in Microsoft.VisualStudio.ExtensionManager.ExtensionEngineImpl.InstallWorker(IInstallableExtension extension, InstallFlags installFlags, AsyncOperation asyncOp)

I have found how fix the missing reference error.
It's necessary to update not only the extension.vsixmanifest file BUT also the catalog.json in the vsix archive.
I have changed the prerequisites to:
   <Prerequisite Id="Microsoft.VisualStudio.Component.CoreEditor" Version="[15.0,)" DisplayName="Visual Studio core editor" />
without specify the latest version supported.
The same in the catalog.json file:
from:
"Microsoft.VisualStudio.Component.CoreEditor":"[15.0,16.0)"}
to
"Microsoft.VisualStudio.Component.CoreEditor":"[15.0,)"}


Implement security

Support for OAuth2
Custom user database
Each user should have his own namesapce
Creating access keys
Support for LDAP (nice to have)

Worked around https://github.com/spring-projects/spring-boot/issues/5093 problem in #33
Todos left:

Basic Auth

[ ] Store users in database
[ ] Autogenerate admin account if users count == 0

SSO

[ ] First logged in user should be promoted to Admin
[ ] Create User data for each user that logs in

Internal

[ ] Dedicated table with worker type users
[ ] Generation of worker creadentials during startup (maybe bootstrap script in docs)

General

[ ] Implement namespaces along with concept of owner and member
[ ] Admin panel with user management
[ ] Docs


[Feature request] Telegram support

Telegram completely ignores the fixed embed and just shows a regular embed with videos as images. Is it possible to make this work with Telegram too?

I reckon it's possible to make embeds specific to any platform by checking against the useragent and serving a different page based on that, but I don't personally use telegram, so adding support for it is pretty low on my radar - I will look into it at some point though, if no one comes around to do a PR for it first

I made some tweaks to the code and got it working but I'm not the greatest coder and my code is a bit messy. Would it be ok to submit a pull request and have someone take a look?

Oh yes please do!

#14


TEX is not passing logged in user

If OMAG Server is setup with security, and one logs into the Egeria UI with user 'faith',
that userid is not passed to the OMAG server by TEX
The error on the server is
egeriacore_1  | 2019-09-04 09:23:58.460 DEBUG 1 --- [nio-8080-exec-4] o.o.o.c.m.f.OMAGServerInstanceErrorCode  : ==> OMAGServerInstanceErrorCode.getMessage([cocoMDS1, anon]): The OMAG Server cocoMDS1 is not available to service a request from user anon

This only occurs when metadata security is configured as per the 'metadata-server-config' notebook. If security is disabled (DELETE) then this error does not occur.

OK - sorry about that.
I thought I had got the userId all the way through - it gets from the browser to the app (automatically int he request context) and I pull it out of the request context in the TEX controller - but it looks like I should be adding the userId to the Connection immediately after getting the getDefaultLocalRepositoryRemoteConnection from the ConnectorConfigurationFactory and prior to calling the ConnectorBroker.
@mandy-chessell - Hi Mandy - Is that correct?

I think this is the userId that is passed on the each API call - eg
        public abstract TypeDefGallery getAllTypes(String  userId) throws ...

The userId that goes in the connection is the npa serverUserId that is used to secure the request.

OK - I think I am doing the former but not the latter. Presumably that is what's causing the effect that Nigel is seeing?

Ah - I have just looked at the debug statement that Nigel included - the problem is that TEX is using the deprecated get-metadata-collection-id() method.  This does not have a userId parameter and so the OMRS defaults the userId to anon.  The Coco Pharmaceuticals security module does not permit the anon userId.
There is a new version of the get-metadata-collection-id method that includes the userId.  This should resolve the problem.

Thank you - I seem to recall we discussed that a long time ago. Apologies - I had forgotten

Thanks for investigating - refer also to #1490 .
But to pick up on another point mandy made -- the connection from TEX to the backend server should be using the NPA userid for the connection itself. And presumably password?
ie in the notebooks the server is configured for
mdrServerUserId   = "cocoMDS1npa"
mdrServerPassword = "cocoMDS1passw0rd"
but the notes refer to only used for a TLS connection?
The UI currently offers no way to configure this at all?. (for all the UI components). At a minimum a property would be handy (as then it can be set for development or even in containers via the environment though)
This is addition to the userId passed in get-metadata-collection-id which is for the end user context (and will suffer until #1490 is addressed or ldap is used)

cc: @moyabrannan

I am not quite following the comment above.
Egeria only use the server userId and password together for adding userId/password to HTTP header.  The server userid is also used on calls to egeria apis initiated in the server - eg as a result of an inbound event.
This security information will need to go in the config docs for UI tenants - this is the work that David is doing.  The UI will work without it as long as the server is not requiring security info in the HTTP header.

I have added a quick fix to TypeExplorerController to pass the userId on getMetadataCollectionId.  This is an interim fix.  I need to create an OMRS Java client that can call both the local and enterprise repository services.  Then TEX does not need to use the OMRSRESTConnector.

The userId is coming through - the server is outputting this message:
Thu Sep 05 14:18:27 BST 2019 cocoMDS2 OPEN-METADATA-SECURITY-0006 User faith is not authorized to issue a request to server cocoMDS2

We just need the fix to #1490 to sync up the userIds in the UI with the userIds in the server's security module.

With regard to the NPA - TEX (and REX) will need to set the NPA in the connection, but I am not sure where a UI cpt can discover the NPA from. @bogdan-sava @davidradl - any ideas?

This will need to be in the UI configuration? Note: - this issue is closed, so may be best to open new issue to track. More generally the UI config needs refactoring in any case - for example the asset management UI uses spring properties to set the URl for omas (and only offers 1 - even though differing omass could be on different platforms) ad servername, whilst tex prompts (and in any case goes into omrs)

The NPA would be in the tenant's configuration document - just like the OMAGG server


client: update test

Old test fails occasionally when the second pd server doesn't become leader in time.

@siddontang @ngaut

LGTM

LGTM


[BUG] Worker threads may not be immediately stopped on SIGINT

Describe the bug
If a worker receives SIGINT during multithreaded execution, then cleanup for workers may not be called at all.
It happens because first, an event is yielded and then cleanup is called. If the consumer breaks the event loop on Interrupted, then the cleanup won't be called.
Note that when the main thread receives keyboard interrupt, then workers are stopped first, and then an event is yielded, so it works as expected.
To Reproduce
It is actually hard to provide a reliable code to reproduce the issue, but in nutshell:
# Schemathesis runner
def runner():
    event = "SIGINT"
    yield event
    if event == "SIGINT":
        print("cleanup")

# Consumer code
for event in runner():
    if event == "SIGINT":
        break

The "cleanup" string won't be printed, but it should be.
Expected behavior
Cleanup is called in any case. It doesn't matter what the client code looks like.
Additional context
It is pretty much is a corner case and likely won't affect many users, but for the sake of proper execution & cleanup in general, it will be nice to have it.
The fix is to move the check for the Interrupted event before yield and call stop_workers there directly rather than raising an exception.

Fixed by #1239


Upstream 1.5

Dear Everybody,
Here is a collection of single commits that can all be individually reviewed. They have accumulated over the past 1.5 years on our master branch. Most of them relate to simple things like compiler warnings and api calls in upgrading FreeRTOS to the v8/v9 API.
More noteably, the verbosity of some of the debug have been reduced. And a new callback have been added to for the purpose of connectionless and task-free sockets.

What is the reason for the close?

I didn't close it per say, it was closed when I deleted the release-1.5 branch. We get support questions about the release-1.5 branch, whether it is an official release or not. And it is not, e.g. CHANGELOG not updated, known bugs, etc. - so it seemed simpler to delete it and avoid the confusion.
We had the discussion about version 1.5 versus 1.6 a long time ago, where we agreed the next official version would be 1.6 - that's when the develop-.1.6 came about.
develop-1.6 is based on release-1.5, so the pull request can be done on develop-1.6 instead.
GomSpace will be pushing a number of pull requests very soon, with the hope of eventually merging develop-1.6 into master - hopefully before christmas :)


Typo Fix

Describe the bug
Typo fix

u should be small in Users.

Go ahead @PranotiPD

Hello @PranotiPD! Your issue #146 has been closed. Thank you for your contribution!

Minor issue


Your Browser is not Supported

This worked great until earlier this week, now launching it the window jusat shows
Your browser is not supported

Same issue here. The latest release was in 2020, it looks like icloud has been updated since then. Nothing new's gone on with the project, it probably was abandoned.


copy_and_paste: Fix quirks with some parts of toMarkdown.

Raw links don't use the proper markdown syntax and get pasted as is.
Text in Ordered List format are not escaped like in normal markdown.

Testing Plan:
Added some more node tests.

@sampritipanda this looks great!  I posted one small comment; once that's resolved, I think we can merge this (and then I'll test-deploy removing the development_environment check to chat.zulip.org so folks can play with it!)

There's a casper flake in the 3.4 circle build I guess.

Yeah, looks unrelated.  We need to track down that flake, but merged, thanks @sampritipanda!


Cleanup buildah from CLI

Remove --image since image is an argument
Remove --mount, since I don't see a case where you would not want to do this.

This also appears to be removing the option of specifying a container's name as a second argument?

@nalind Yes, you can do this via the --name option.  In our proposal we said the second argument is for mountpoint, but I am not sure that is a great idea.
Might rather just do
$ ctr=$(buildah from fedora)
$ buildah mount $ctr /mnt
$ dnf install httpd --installroot /mnt

I added back in the --mount option since it was blowing up the tests.  I think we need to consider how this should work.
If builder from Always mounts the image, then we would want
rootfs=$(builder mount $cid)
To succeed if the $cid is mounted and return the rootfs, as well as mount the object and return the rootfs.

 [Buildah] (8) buildah CLI overhaul

LGTM, pending CI tests.

@rh-atomic-bot r+ b8ab8aef63b24790e45cbca8a2c1e56b9a329512


Document edits from an extension and the Undo stack

VSCode Version: 0.10.11, 10.10 & 10.8
OS Version: Win 8.1

Steps to Reproduce:

In a document, type some text.
Invoke a command from an extension that makes an edit to the document. (With TextEditor.edit())
Press ctrl+z to undo

Would expect steps 1 & 2 to produce separate entries in the undo stack: the edit from (2) to be undone, and the text edit in (1) only with a further undo.
However the undo removes both the edit from (2) and the text from (1)
If, in between steps 1 & 2, you move the text cursor, then 2 separate entries to the undo stack are created, as expected.
Can provide a sample extension if necessary.

+1

+1


[FLINK-18233][tests] Increase test timeout to 20s for TaskExecutorSubmissionTest

What is the purpose of the change
Increase test timeout to 20s for TaskExecutorSubmissionTest.
Verifying this change
This change is a trivial rework / code cleanup without any test coverage.

Thanks for the review @rmetzger. Merging this PR now.


We need a DMAny type

When enforcing julia type annotations we create corresponding dmtypes and then create subtyping constraints.
The problem is if we have a julia type such as Vector, then we do not know which type to use for content, so we create a type variable.
But this means that this type variable simply stays in the subtyping constraint and is, in effect, not being solved.
Thus we want to introduce a DMAny type, which acts as top-element in the subtyping graph, such that we do not have to generate free type variables.

This is done in 47762d5c692ba33f39592dc51d9f98cc50a2c73b, 5ccdb0b1678109825b9da00853ffbec5808b8478, a5ab496ca2fc6651229ea68632fcb1edf2a3d7d7, f41bf05e78ca4557caab127e06a812ac546e0b7b.
The problem is that in this implementation we really integrate DMAny as a top element into the graph. Which means that the "structurality" of other rules changes, for example we can no longer say that DMReal is the top element of its level, and thus we cannot resolve constraints of the form DMReal <= a_0. Actually no rules can be left-structural now.
This (could) lead to unsolved constraints.

With the last commit (efea2121d785f95ce42a0e48fbe5a0c419428e2b), we have the following problem in our tests:
  test/Spec/Supremum.hs:11:13:
  1) supremum computes sup{Int[2.0], Int[1]} = Right Int[--]
       expected: Right Int[--]
        but got: Right DMAny

This happens probably because now 2 rules compete non deterministically for the same term-patterns when computing the supremum.


GL_NV_geometry_shader_passthrough extension

glslang does not expose vender specific opengl extensions by default, preventing to access them from krafix.
This could be solved by adding into the korefile.js:
project.addDefine('NV_EXTENSIONS');
project.addDefine('AMD_EXTENSIONS');

I tested with NV_EXTENSIONS, and the resulting binary raised about 50KB in size. Could we enable this by default? Any ideas on more solutions?
Related:
https://github.com/KhronosGroup/glslang/blob/master/CMakeLists.txt#L34

Closing in favor of https://github.com/KhronosGroup/SPIRV-Cross/issues/379.


Prompt to stand up, possibly during an existing break/schedule, and prompt to sit down (timed based on current industry/medical recommendations)

Hi @stantond , few similar requests have been made in past: remind to drink water every x hours, etc..
As I try to make Stretchly simple, I am reluctant to add those as it would complicate code and there are reminder/timers apps where user can set regular intervals that can do that better than Stretchly.

I'm not sure it makes sense to compare the two, depends on what problem you're trying to solve with this app...
If it's something like "As someone who works at my desk all day, I want to be reminded to move around, so that I don't develop health issues", then sure, drinking water is good, but it's got nothing to do with what your app is trying to solve, whereas the purpose of a sit-stand desk is to help solve exactly the same problem that you're also trying to solve.
Looking at some commercial offerings like RSI Guard, support for sit-stand is a fairly common feature used in tandem with rest breaks, ideally using a break to do the height adjustment.

Hey, I've hacked around this week and created https://github.com/hovancik/later-on which allows custom notifications. It's very alpha but might be also what you're looking for.

Hey, I've hacked around this week and created https://github.com/hovancik/later-on which allows custom notifications. It's very alpha but might be also what you're looking for.


Rename ConceptSearch to ItemSearch

The main difference between JSKOS Concept and JSKOS Item is the former can have hierarchical links (narrower, broader...). Searching does not require a hierarchy.

Technically inScheme is only a property for JSKOS Concepts, and we are searching inside a scheme. However, since we've been planning to adjust the component so that it is more flexible about how the results are fetched, we can rename it together with that change. We could then also provide an example on how to use ItemSearch to search for vocabularies in the BARTOC database, or something like that.

So, I already renamed ConceptSearch to ItemSearch (not yet pushed), and I would like to add two more props to the component. One that optionally indicates which kind of item we're dealing with (concepts or concept schemes) and one function parameter as an alternative to using a cocoda-sdk registry (my suggestion would be that it should be an async function that returns results in OpenSearch Suggest Format).
We might be able to do without the former prop by requiring scheme to be given when searching for concepts. This makes sense because we can't really use a concept without knowing which concept scheme it belongs to.  Would this be okay?
Also any suggestions for the function parameter? Maybe something like getResults?

One that optionally indicates which kind of item we're dealing with (concepts or concept schemes)

:-(

one function parameter as an alternative to using a cocoda-sdk registry (my suggestion would be that it should be an async function that returns results in OpenSearch Suggest Format).

:-)

We might be able to do without the former prop by requiring scheme to be given when searching for concepts. This makes sense because we can't really use a concept without knowing which concept scheme it belongs to. Would this be okay?

Yes, scheme is required to assign found concepts to its concept scheme, so this parameter indicates object type Concept. Otherwise we get object type Item.

Also any suggestions for the function parameter?

Just search?

Okay, I change the implementation accordingly. However, I noticed a few more question:

Otherwise we get object type Item.

What does that exactly mean? According to the JSKOS specs, there is no specific type for JSKOS Item. So just an object with property uri?
Also, currently we're focusing on suggestions (OpenSearch Suggest Format and using suggest/vocSuggest with jskos-server). However, the component is called ItemSearch and there might be APIs which do not support /suggest. Should we maybe change the component so that, instead of using OpenSearch Suggest Format, we use an array for the results?
One last thing: At the moment, if registry is given, but scheme is not, we're using vocSuggest for suggestions. Is that okay? In any case, I should clarify this in the documentation.
(The documentation was also updated with more examples: https://gbv.github.io/jskos-vue/dev/components/ItemSearch.html)

Some changes to ItemSuggest continued in #14.


Add funding key to package.json

This will add a notification about how to fund the package to the npmjs.com page (example from webpack):

See package-json#funding.

Thanks!


[WIP] [RFC] Adds experiment management using Hydra

This PR adds support for launching fpga-tool-perf benchmarks using Hydra.
fpga-tool-perf supports multiple benchmarks for multiple boards for multiple backends. There is a need for a tool that can compose configurations for any valid combination of these groups. In addition, launching them in parallel, running parameter sweeps, using search optimization strategies will become essential in speeding up the benchmarks. Hydra does it all:

It can dynamically create a hierarchical configuration by composition.
It provides built in support  for several different launchers: basic, joblib, slurm, ray etc.
It provides built in support for auto-tuning frameworks: optuna, ax, nevergrad etc.

While it provides a lot of benefits, some of the things hydra enforces might be off-putting (although you can really debate about it). For instance:

Hydra assumes that you will replace all your argparse code with the hydra configuration. As a result, the command line syntax looks a little different, and help message will have to be updated every time a new argument is added to the app.
You cannot pass a flag like you can in argparse. For instance --list-combinations is changed to list=combinations. The only way to pass a bool would be list-combinations=True which is a bit verbose (but list=combinations doesn't really sound/mean right but looks alright?)

My plan for this PR is to:

[x] Refactor fpgaperf.py to be more hydra friendly
[ ] Update readme to reflect changes
[ ] Merge exhuast.py functionality into fpgaperf.py since fpgaperf.py with hydra achieves the same functionality as exhaust.py
[ ] Replace run_config functionality with hydra experiment pattern
[ ] Demonstrate parameter sweep/auto-tuning on a cluster

Current Progress
You can run the fpgaperf.py tool locally on multiple cores or on a slurm cluster. I have tested this on a slurm-gcp and on my local machine. I have updated the example commands accordingly in the README.
Please feel free to comment on the PR and raise any concerns you have! I am more than willing to change something if you think things are not developer friendly!

cc: @mithro

@mithro Also here's a little more context to the changes:
The majority of the changes are related to changing json to yaml (hydra supports either yaml or python dataclasses (structured config) for composition). The board.json, project jsons, and toolchain dict are separated into their individual yaml files so that Hydra can compose an yaml from the individual yaml files. This is Hydra's model and based on this separation it can launch the processes in parallel. So for instance, when you specifiy board=arty,nexys, project=blinky,oneblink, it will launch four process for instance where each process is a going to get a pair of the configs. In the current code base, I can see how you can achieve the same functionality in exhaust.py but I thought the fixed cost of the refactor due to hydra is low enough for the built in features you are getting.

I /think/ the downsides to hydra are potentially deal breakers here. Ideally the default user should not have to understand or know that we are using something like hydra....

@syed-ahmed - I would be happy to have a quick video chat to see about the best way to move this forward. I am excited to see progress here!

@syed-ahmed - I would be happy to have a quick video chat to see about the best way to move this forward. I am excited to see progress here!

Sounds good! Sent you an email.

Closing this for now and will open an issue (may be in edalize) for further discussion on distributed runs.

Thanks so much @omry for the comments! Let me re-open this PR and will this as a prototyping/discussion space. We are currently evaluating a broader use case of a tool like hydra in the EDA community, where https://github.com/olofk/edalize would generate build/task workflows/possibly a DAG of tasks (that's why asked the question in the hydra channel) and a task runner (which could be hydra + ray, or CWL+airflow or gusty+hydra+airflow) would execute the workflow.
We had a really good experience using Hydra in our research group (ic.ese.upenn.edu) and are happy with everything it's providing for free. I would love to see this being used in the FOSS EDA community in some form!

@omry and also thanks for the review! I'll soon follow up on the changes.

@omry and also thanks for the review! I'll soon follow up on the changes.

Thanks so much @omry for the comments! Let me re-open this PR and will use this as a prototyping/discussion space. We are currently evaluating a broader use case of a tool like hydra in the EDA community, where https://github.com/olofk/edalize would generate build/task workflows/possibly a DAG of tasks (that's why asked the question in the hydra channel) and a task runner (which could be hydra + ray, or CWL+airflow or gusty+hydra+airflow) would execute the workflow.

So the idea is to use Hydra to compose the config for edalize, which in turn will generate the build steps?
This seems like a good match.
In particular, I can imagine multirun can be useful to build for multiple targets at the same time etc.
As for the DAG:
Hydra launching is simplistic right now and does not support full fledged GANS. you can use Hydra to launch the initial application (or multiple applications in multirun), which in turn can launch the DAG using something like Ray.
The configuration can still be composed by Hydra, you can either pass individual config nodes as you are launching the DAG, or compose new configs on demand using the Compose API.

We had a really good experience using Hydra in our research group (ic.ese.upenn.edu) and are happy with everything it's providing for free. I would love to see this being used in the FOSS EDA community in some form!

This is really great to hear. I would definitely love to see it getting adopted by more communities with high level of complexity like the EDA community.

Hi @omry,
I think the biggest issue currently with Hydra is the conflict between the combination of needing to "go all in" and "being opinionated". This makes me super cautious about adopting the project, the benefits need to large because the risks are large. The fact that @syed-ahmed has had success is the only reason it hasn't been an immediate no.
A project which you have to make a "big bet on" (aka "Go all in on") needs to allow multiple approaches and different opinions because otherwise a user is put in an impossible situation when they end up disagreeing with a particular approach or opinion in only one area.
A project which you can adopt incrementally or is modular is much more able to "be opinionated" because if you end up with a disagreement you don't have to adopt the parts you disagree on.
The fact that "Hydra assumes that you will replace all your argparse code with the hydra configuration" is a red flag to me.
Other things I'm looking at is around the number of current users and success stories. I will take a technically inferior project which has a thriving community and user base over a technically better solution that nobody seems willing to use. It is much harder to solve community problems than technical ones! The fact that Hydra might have decent adoption in the machine learning space is a good sign that I plan to investigate more.
Lastly, a lot of the work on SymbiFlow and related projects like VerilogToRouting is being funded by my employer (@Google) and hence we need solutions that work with Google Cloud Platform as it is easy to provide free resources to projects there.
Happy to look into Hydra more,
Tim '@mithro' Ansell

Hi Tim,
There are ways to benefit from Hydra incrementally, but your initial goal of integrating with SLURM - if done via Hydra - requires going all in.
Let's break things down a bit:
argparse
Hydra provide the ability to compose an hierarchical configuration dynamically and to override everything the resulting config object. Hydra is using argparse for some of it's things to allow it to differentiate between things that app needs and things Hydra needs (as an example --multirun to run with multiple configuration or --cfg to show the resulting config without running the app).
Everything else (things not starting with --) belongs to the app.
There are a few ways I can see around it (and I am not sure transparent SLURM launching would work with any of those solutions):

Put argparse on top and composing the config using the Compose API.

Create a second entry Hydra entry point for your app, keeping the existing one as legacy and starting to transition use cases.
This is the path fairseq took. I only recommend it if the cost of a breaking change is big, it's a harder path.

Wrap the existing cli with an Hydra and have the Hydra call use execute the current CLI as a subprocess. I would only consider this if any changes to the existing CLI are out of the questions. I think this will cause many difficulties.

Launching
Hydra does not provide an API for launching, it's done via the command line only.
However, launcher plugins can be implemented for various backends. We currently have 4 public launcher plugins (Joblib, Submitit (SLURM), Redis Queue, and Ray (AWS and more)).
At Facebook we have a second launcher for SLURM using an internal API, and a second launcher for an internal cluster.
Google can build the same launchers and host them internally.
Here is the example launcher. Implementing those correctly can be a bit tricky but there is a pretty solid test suite than ensures that the launcher plugins are compliant.
Hydra's launching and sweeping is "the cherry on the cake". About 80% of the value is coming from the flexible config composition. An app can use any launching API directly if it wants to.
For SLURM, you can even use sbatch directly but that's not fun at all and generates a lot of boilerplate scripts.
Success stories
Hydra is a new project, I open sourced it in October 2019 (a year and a half ago).
It got adopted at Facebook as the configuration platform for most future machine learning projects.
It also got significant adoption inside FAIR (Facebook AI Research).
As for public adoption:
Hydra crossed 4k stars recently and the number of public GitHub repositories with a dependency on Hydra is over 750.
Most of the projects are individual research projects, but there are some major frameworks like fairseq and NVidia NeMo that are using it.
It's getting a lot of traction with the deep learning community, which is where it originated.
I totally get reluctance of going all in on a project you have just heard of (Or even a project you heard of a lot but did not try for yourself).
One suggestion I have is play with it on a new lower risk project to get comfortable with it before attempting to port a big project.

Finally, another path to migrate to Hydra incrementally is to use OmegaConf as the internal config object without changing anything else.
OmegaConf is the lower level config library powering Hydra.  You can get a lot by switching to it before switching to Hydra.
This is the path mmf took. They will migrate to Hydra next.

argparse
Hydra provide the ability to compose an hierarchical configuration dynamically and to override everything the resulting config object.

This is a pretty typical way of doing things like this. Sounds pretty good.

Hydra is using argparse for some of it's things to allow it to differentiate between things that app needs and things Hydra needs (as an example --multirun to run with multiple configuration or --cfg to show the resulting config without running the app).
Everything else (things not starting with --) belongs to the app.

The thing that is confusing me a bit is why hydra needs the command line of the tasks being run to be modified? Ultimately hydra generates a bunch of runs which have a certain set of properties that end up changing the behaviour of each run in some way right? There doesn't seem to be any reason that these properties could not be passed to subtasks via command line arguments, environment variables, files or some combination around all these?
Handling the separate between a runners arguments and a sub-tasks arguments has two pretty "common" solutions.
One typical way is to use a "double dash" (--) which normally ends the current tools argument passing, leaving the remaining command line as a string which can be given to the internal tasks, I could imagine something like;
hydra_top.py --runner-arg1 --runner-arg2 --cmd-to-run=mytool -- --tool-extra-argument1 --tool-extra-argument2=$HYDRA_VALUE_B
mytool could still be run with mytool --tool-argument1 --tool-argument2="Hello everyone"?
Another option that is even built into argparse is the idea of subcommands which work like hydra_top.py -runner-arg1 --runner-arg2 --cmd-to-run=mytool run-experiment --tool-extra-argument1 --tool-extra-argument2=$HYDRA_VALUE_B. This is pretty commonly found in build systems too.

Lastly, a lot of the work on SymbiFlow and related projects like VerilogToRouting is being funded by my employer (@google) and hence we need solutions that work with Google Cloud Platform as it is easy to provide free resources to projects there.

With regards to GCP usage, I have been using the hydra slurm launcher on Google Cloud. Setting up a Slurm cluster using terraform (https://github.com/SchedMD/slurm-gcp) on GCP is pretty straightforward and by using slurm launcher in hydra, I was able to get rid of all the jinja generated sbatch scripts I was using! I experimented with the ray launcher on GCP as well and am willing to add a ray_gcp launcher to hydra (it's pretty much the same code as the ray_aws launcher). I believe there is also a "help wanted" for airflow launcher integration (https://github.com/facebookresearch/hydra/issues/221). I have briefly looked at airflow launcher support but it seems like it would be more work and am currently evaluating if airflow gives something that ray doesn't. Of course if a google cloud composer dev can add an cloud composer airflow launcher, that would be very beneficial for others :)

I haven't read it yet, but there seems to be some interesting analysis at https://dmtn-025.lsst.io/

Hydra provide the ability to compose an hierarchical configuration dynamically and to override everything the resulting config object.

This is a pretty typical way of doing things like this. Sounds pretty good.

Can you point to another system that provides similar capabilities? I am not aware of any.

The thing that is confusing me a bit is why hydra needs the command line of the tasks being run to be modified?

A Hydra application is launching itself from the same command line used for normal (local) execution.
Take a look at the SLURM example here, including the example application (Note that the Submitit related code in the example application is not required to launch to SLURM).
Taking a step back: Breaking away from the getopt standard was an early decision. I don't think using -- is providing any value beyond "this is how we have always done things".
Not supporting it sends a clear signal that Hydra is not compatible with getopt style argument parsers. Hydra is much more powerful and trying to provide such compatibility would only limit the design space of what can be done in the command line for no good reason.
An app using Hydra to the fullest have to let give up managing the command line in exchange for the flexibility Hydra is offering.

Ultimately hydra generates a bunch of runs which have a certain set of properties that end up changing the behaviour of each run in some way right?

@hydra.main is taking over many aspects of the application beyond the command line for it to be able to execute an application from on a remote cluster from it's own command line.
This includes working directory management and Python logging configuration.

Handling the separate between a runners arguments and a sub-tasks arguments has two pretty "common" solutions.

This is not about runners and subtask.
Hydra can configure multiple independent subsystems at the same time (e.g, Python logging, The Hydra Launcher, the Hydra Sweeper etc and the app itself, including any subsystems it may have). Those are all handled in the same way. All of them can be composed, any anything can be overridden from the command line.
This is about a very limited set of low level Hydra specific flags that are orthogonal to configuring the app and any subsystem.
Generally speaking, If Hydra is not a good match you should not use it. I am not open to making changes to Hydra for the sake of any individual project - I have to consider the entire eco-system.

I haven't read it yet, but there seems to be some interesting analysis at https://dmtn-025.lsst.io/

Thanks.
Out of the three systems there, I am only aware of airflow. Hydra is not an alternative to it (It could interface with it via a Launcher plugin if anyone makes that plugin).

Hydra provide the ability to compose an hierarchical configuration dynamically and to override everything the resulting config object.

This is a pretty typical way of doing things like this. Sounds pretty good.

Can you point to another system that provides similar capabilities? I am not aware of any.

There is some discussion around the whole topic of configuration languages at https://sre.google/workbook/configuration-design/ and https://sre.google/workbook/configuration-specifics/ -- The knowledge in the sre.google book mostly comes from dealing with an internal Google language which has a lot of the properties you are describing and is both loved and hated at the same time.
Google has a bit of "not invented here" syndrome so never really looked at any of the XML based solutions which have many similar properties and where heavily used back in the late 1990s / early 2000s.
Other tools which have large configuration systems like build tools like Bazel or system configuration tools like Chef / Puppet frequently end up with systems like this too.
I believe whoever designed OmegaConf at least has had some experience with this topic as it seems to have a decent of properties.

This is not about runners and subtask.
Hydra can configure multiple independent subsystems at the same time (e.g, Python logging, The Hydra Launcher, the Hydra Sweeper etc and the app itself, including any subsystems it may have). Those are all handled in the same way. All of them can be composed, any anything can be overridden from the command line.
This is about a very limited set of low level Hydra specific flags that are orthogonal to configuring the app and any subsystem.

From what I can see, the Hydra approach is to have tight integration between the job launcher / coordinator / control and the jobs actually being run which requires "taking over" the job. This is a valid design decision and it has both a large number of advantages and a large number of disadvantages.

Generally speaking, If Hydra is not a good match you should not use it.

That is very reasonable and the approach we will be taking and what this pull request is exploring. Start with understanding if Hydra is a good fit and thus if we should consider adopting it.
However, the fact that both a user has to go "all in" on Hydra and Hydra is strongly opinionated does raise the bar for adoption much higher. These two properties mean that even when Hydra is an excellent match if there is even just one area of disagreement it can be impossible to adopt the solution.
We will continue to explore what the options are here and if Hydra's benefits are worth the costs.
All the best with your project!

There is some discussion around the whole topic of configuration languages at https://sre.google/workbook/configuration-design/ and https://sre.google/workbook/configuration-specifics/ -- The knowledge in the sre.google book mostly comes from dealing with an internal Google language which has a lot of the properties you are describing and is both loved and hated at the same time.

Thanks, will go over those.

Google has a bit of "not invented here" syndrome so never really looked at any of the XML based solutions which have many similar properties and where heavily used back in the late 1990s / early 2000s.

Oh, XML is a disaster, let's not go there :).
I actually created a cute alternative to XML as a config language called Swush back at 2009. It never got any traction.

Other tools which have large configuration systems like build tools like Bazel or system configuration tools like Chef / Puppet frequently end up with systems like this too.
I believe whoever designed OmegaConf at least has had some experience with this topic as it seems to have a decent of properties.

My experience with chef/puppet and build systems is that those gravitate toward becoming a full fledged programming language, which can make things difficult on many dimensions.
OmegaConf is also my project (https://github.com/omry/omegaconf).
The story is that I needed a flexible configuration system for a new research project and could not find anything that fit the bill. I created OmegaConf, and it evolved side by side with the research project.
Hydra is a spinoff from that research project, that took the core concepts from it and made it a generic solution with all of the same properties (and more), but in a way that is easy to use for other projects.

This is not about runners and subtask.
Hydra can configure multiple independent subsystems at the same time (e.g, Python logging, The Hydra Launcher, the Hydra Sweeper etc and the app itself, including any subsystems it may have). Those are all handled in the same way. All of them can be composed, any anything can be overridden from the command line.
This is about a very limited set of low level Hydra specific flags that are orthogonal to configuring the app and any subsystem.

From what I can see, the Hydra approach is to have tight integration between the job launcher / coordinator / control and the jobs actually being run which requires "taking over" the job. This is a valid design decision and it has both a large number of advantages and a large number of disadvantages.

That's a pretty good characterization.
Since the config composition can be used in isolation from @hydra.main, one can integrate it with alternative designs.
(Building something like this is a significant investment though).

Generally speaking, If Hydra is not a good match you should not use it.

That is very reasonable and the approach we will be taking and what this pull request is exploring. Start with understanding if Hydra is a good fit and thus if we should consider adopting it.
However, the fact that both a user has to go "all in" on Hydra and Hydra is strongly opinionated does raise the bar for adoption much higher. These two properties mean that even when Hydra is an excellent match if there is even just one area of disagreement it can be impossible to adopt the solution.

Hydra is extremely flexible in most areas. Its using the same config composition principles it's preaching, making it easy to change its behavior to fit many scenarios.
There are of course some areas where it's not flexible at all (on principle or just because something is not supported yet). In practice most people that try it out stick with it even if it's not perfect for them because the value tradeoff is worth it.
Some people end up using straight OmegaConf as it gives them more control (at the loss of some higher level features Hydra is providing).

We will continue to explore what the options are here and if Hydra's benefits are worth the costs.

Awesome.
Happy to answer questions here or on the Hydra chat.

Thanks @omry and @mithro for taking the time for such detailed replies!


Allow passive event option to be set

The passive option is defined on the AddEventListenerOptions interface, not EventListenerOptions
Closes #325

Thanks for this PR! Unfortunately, we missed it before adding #357. This PR has a better fix and we've incorporated that into #357 which we'll merge instead of this only because it has a couple additional tests.


Can we put another "Save Scene" button also inside the 3D editor ?

Because when you make changes in Full screen, you have to exit full screen to save and then re-enter full screen to do more changes.

The saving mechanism takes into account the title and description too (it's a form). If we put another save button inside it, then the functionality has to differ, to save only object placement.


Error from implementing MaskedCouplingInferenceFunnel

I was trying to implement affine (surjective) masked coupling flow, with bijective layer  of MaskedCoupling and surjective layer of MaskedCouplingInferenceFunnel. I named the function as make_mcf, it is similar to make_spf except I use ScalarAffine as bijective function.
def make_mcf(
    n_dimension: int,
    n_layers: Optional[int] = 5,
    n_layer_dimensions: Optional[Iterable[int]] = None,
    hidden_sizes: Iterable[int] = (64, 64),
    activation: Callable = jax.nn.tanh,
) -> hk.Transformed:

    if isinstance(n_layers, int) and n_layer_dimensions is not None:
        assert n_layers == len(list(n_layer_dimensions))
    elif isinstance(n_layers, int):
        n_layer_dimensions = [n_dimension] * n_layers

    return _make_mcf(
        n_dimension=n_dimension,
        n_layer_dimensions=n_layer_dimensions,
        hidden_sizes=hidden_sizes,
        activation=activation,
    )

def _make_mcf(
    n_dimension,
    n_layer_dimensions,
    hidden_sizes,
    activation,
):

    def _bijector_fn(params):
        shift, log_scale = jnp.split(params, 2, axis=-1)
        return distrax.ScalarAffine(shift, jnp.exp(log_scale))

    def _decoder_fn(dims):
        def fn(z):
            params = surjectors_mlp(dims, activation=activation)(z)
            mu, log_scale = jnp.split(params, 2, -1)
            return distrax.Independent(distrax.Normal(mu, jnp.exp(log_scale)))
        return fn

    def _conditioner(n_dim):
        return hk.Sequential(
            [
                surjectors_mlp(
                    list(hidden_sizes) + [2 * n_dim],
                    activation=activation,
                ),
                hk.Reshape((n_dim, 2)),
            ]
        )

    @hk.transform
    def _flow(method, **kwargs):
        layers = []
        order = jnp.arange(n_dimension)
        curr_dim = n_dimension
        for i, n_dim_curr_layer in enumerate(n_layer_dimensions):
            # layer is dimensionality preserving
            if n_dim_curr_layer == curr_dim:
                layer = MaskedCoupling(
                    mask=make_alternating_binary_mask(curr_dim, i % 2 == 0),
                    conditioner=_conditioner(curr_dim),
                    bijector_fn=_bijector_fn,
                )

                order = order[::-1]

            elif n_dim_curr_layer < curr_dim:

                n_latent = n_dim_curr_layer
                layer = MaskedCouplingInferenceFunnel(
                    n_keep=n_latent,
                    decoder=_decoder_fn(
                        list(hidden_sizes) + [2 * (curr_dim - n_latent)]
                    ),
                    conditioner=surjectors_mlp(
                        list(hidden_sizes) + [2 * curr_dim],
                        activation=activation,
                    ),
                    bijector_fn=_bijector_fn,
                )
                curr_dim = n_latent

                order = order[::-1]
                order = order[:curr_dim] - jnp.min(order[:curr_dim])
            else:
                raise ValueError(
                    f"n_dimension at layer {i} is layer than the dimension of"
                    f" the following layer {i + 1}"
                )
            layers.append(layer)
            layers.append(Permutation(order, 1))
        chain = Chain(layers[:-1]) #Chain(layers[:-1])

        base_distribution = distrax.Independent(
            distrax.Normal(jnp.zeros(curr_dim), jnp.ones(curr_dim)),
            1,
        )
        td = TransformedDistribution(base_distribution, chain)
        return td(method, **kwargs)

    return _flow

It appears error: the shape of (100,8,1) and (100,8) is not compatible.
so I change the
def _bijector_fn(params):
        shift, log_scale = jnp.split(params, 2, axis=-1)
        return distrax.ScalarAffine(shift, `jnp.exp(log_scale))

as
    def _bijector_fn(params):
        shift, log_scale = jnp.split(params, 2, axis=-1)
        if shift.shape[-1] == 1:
            shift = jnp.squeeze(shift, axis=-1)
        if log_scale.shape[-1] == 1:
            log_scale = jnp.squeeze(log_scale, axis=-1)
        return distrax.ScalarAffine(shift, jnp.exp(log_scale))

Now, it works. I am not sure this is the best way to resolve this issue. If you find better way, please let me know.
Thanks!

Hello, I think the construction is not right. Is this what you are looking for: https://github.com/dirmeier/surjectors/blob/main/examples/coupling_inference_surjection.py?

Hello, I think the construction is not right. Is this what you are looking for: https://github.com/dirmeier/surjectors/blob/main/examples/coupling_inference_surjection.py?

Actually, this implementation is from the function of make_spf which uses spline network as bijective function and MaskedCouplingInferenceFunnel. I modified make_spf by changing spline network to ScalerAffine.


BLERemoteDescriptor::readValue() doesn't work, and here is why

The BLERemoteDescriptor::readValue() function doesn't work, i.e. it never returns, because it waits forever on the semaphore m_semaphoreReadDescrEvt.
I use this function for reading the descriptor 2902 (checking if notifications/indications are on on a BLE server characteristic).
I solved the issue by adding a gattClientEventHandler in the BLERemoteDescriptor class that handles the ESP_GATTC_READ_DESCR_EVT event. The BLERemoteCharacteristic class also needs a small change in its gattClientEventHandler : passing on the received event to the underlying BLERemoteDescriptor's from the m_descriptorMap
The code is in attached zipfile. I hope you find it useful to add to your library.
BLERemoteDescriptor.zip

I still have the error when read Descriptor after copying your files.
It cause the connection auto disconnecting.
(16683) BLERemoteCharacteristic: << readValue(): length: 20
D (16689) BLERemoteDescriptor: >> readValue: handle: 46, uuid: 00002901-0000-1000-8000-00805f9b34fb
D (16698) FreeRTOS: Semaphore taking: name: ReadDescrEvt (0x3ffdbec8), owner: <N/A> for readValue
D (16707) FreeRTOS: Semaphore taken:  name: ReadDescrEvt (0x3ffdbec8), owner: readValue
E (46716) BT: gatt_rsp_timeout disconnecting...
E (46718) BT: bta_gattc_conn_cback() - cif=3 connected=0 conn_id=3 reason=0x0016
D (46720) BLEDevice: gattClientEventHandler [esp_gatt_if: 3] ... ESP_GATTC_READ_DESCR_EVT
D (46727) BLEUtils: GATT Event: ESP_GATTC_READ_DESCR_EVT
D (46733) BLEDevice: gattClientEventHandler [esp_gatt_if: 3] ... ESP_GATTC_DISCONNECT_EVT
D (46741) BLEUtils: GATT Event: ESP_GATTC_DISCONNECT_EVT

You are trying to read descriptor 2901; is that supposed to be readable? https://www.bluetooth.com/specifications/gatt/viewer?attributeXmlFile=org.bluetooth.descriptor.gatt.characteristic_user_description.xml
Maybe you're trying an invalid operation, and that's why your device doesn't reply, and you get the timeout.
My BLE device doesn't have descriptor 2901 on any characteristic, so I can't repeat your case. My device has a descriptor 2902 on a few characteristics, and descriptor 2902 is read/write by specification, and it works ok.
A bit off topic, but how did you get the timing values in the debug output?
This is part of the output from a test sketch (with core debug level set to 'verbose') , with the ESP_GATTC_READ_DESCR_EVT event arriving correctly.
Characteristic: uuid: 00002a5b-0000-1000-8000-00805f9b34fb, handle: 16 0x10, props: broadcast: 0, read: 0, write_nr: 0, write: 0, notify: 1, indicate: 0, auth: 0
[D][BLERemoteDescriptor.cpp:115] readValue(): >> readValue: handle: 17, uuid: 00002902-0000-1000-8000-00805f9b34fb
[D][BLEDevice.cpp:140] gattClientEventHandler(): gattClientEventHandler [esp_gatt_if: 3] ... ESP_GATTC_READ_DESCR_EVT
[D][BLEUtils.cpp:1377] dumpGattClientEvent(): GATT Event: ESP_GATTC_READ_DESCR_EVT
[D][BLERemoteDescriptor.cpp:141] readValue(): << readValue(): length: 2

E (46718) BT: bta_gattc_conn_cback() - cif=3 connected=0 conn_id=3 reason=0x0016
reason 0x0016 means GATT_CONN_TERMINATE_LOCAL_HOST
timeout on a connection would be reason 0x0008 = GATT_CONN_TIMEOUT.
So not sure what's going on in your setup.


[DOC] - Add user personas to docs

Preliminary Checks

[X] This issue is not a question, feature request, RFC, or anything other than a bug report. Please post those things in GitHub Discussions: https://github.com/nebari-dev/nebari/discussions

Summary
We have a set of user personas that we put together a while back but they never made it onto the  public docs. These would be helpful for some folks when identifying potential users, or designing usability studies, etc.
Steps to Resolve this Issue
Copy the user personas from notion into public docs.

@pavithraes where should these go in the docs?


adding wait to the door passing action

This tackles https://github.com/strands-project/g4s_deployment/issues/84
It introduces a new action server door_wait_and_pass that waits for a predefined amount of time in front of a door when it is closed. If the door is open for more than 2 seconds, the robot speaks, saying he will go through and asking the person to keep holding the door.
The waiting time is defined via the param server, see https://github.com/bfalacerda/strands_apps/blob/indigo-devel/door_pass/scripts/door_wait_and_pass.py#L19
It also adds a stand-alone waiting node, to be used with the extended version of policy execution that is currently being developed for the TSC deployment. This has been tested for both the current and extended versions of policy execution.
Regardless, the only thing that needs to be done to use this is setting door_wait_and_pass instead of doorPassing as the nav action server between door edges in the topological map.

An excellent start, thanks. We're going to need to test this pretty thoroughly somehow, with non-experts. Any thoughts on that?

the UG floor has those fire doors, we can add some tasks that require going through them?

That's what I was thinking too, but I'm quite nervous about someone also letting the robot through to the top of the STAIRS.

that's why we have 2 of them?
Seriously, that would require the robot wanting to go to the wrong place and someone be willing to hold a door for him, I think it's quite safe. We can also add security with the magnetic strip and a forbidden topo node in that area.

It’s my job to be nervous about these things!

testing on LG? Falling up the stairs might be OK ;)
On Tue, 29 Mar 2016 at 09:52 Nick Hawes<EMAIL_ADDRESS>wrote:

It’s my job to be nervous about these things!
—
You are receiving this because you are subscribed to this thread.
Reply to this email directly or view it on GitHub
https://github.com/strands-project/strands_apps/pull/44#issuecomment-202783185

On 29 Mar 2016, at 10:13, Lars Kunze<EMAIL_ADDRESS>wrote:
testing on LG? Falling up the stairs might be OK ;)

Sometimes I feel pretty dumb,

I was thinking about UG because of the Sloman lounge, it's one of the most interesting places in the building for the robot. Also, the use of the doors in UG is more interesting because the robot can access the area behind them in 2 different ways.
Anyway, it's not that big of a deal, we can do it downstairs and use the lab doors for testing also.

On 29 Mar 2016, at 11:31, Bruno Lacerda<EMAIL_ADDRESS>wrote:
Also, the use of the doors in UG is more interesting because the robot can access the area behind them in 2 different ways.

I didn’t know that. Ultimately it’s your call Bruno.

I'm testing in LG. @hawesie are the doors in TSC double doors, and people only open one side to go through, or is it a single door?

It's a single door. Here are some photos. Both doors open inwards to the short corridor.


Add Testing

Add unit tests to the code as well as GitHub actions to run a testing suite.
Ideally, this should use pytest. Some sort of pelican in a box implementation needs to be run. This may require an image to be created which contains the latest pelican release for testing.

Did this as part of #39.


[Dask.order] Ignore data tasks when ordering

This may be a little controversial... However, there are frequently topologies (particularly in the array space) that have a dummy task at the bottom of the graph that includes some metadata (e.g. for zarr). In the xarray world, those are frequently embedded numpy arrays.
I believe we should special case such tasks since they can throw off otherwise fine heuristics.

They never have dependencies so we can schedule them whenever we want
There is no point in running their dependents more quickly than others trying to release them. We cannot release their data since the data is embedded in the graph/run_spec (even a released task currently holds on to their run_spec)
The data itself is typically very small, otherwise it would not be feasible to embed it into a graph

So, why is this controversial

With this, ordering would be different for say da.from_numpy(np.zeros(100), chunks=20) and da.zeros(100, chunk=20) since the first would literally embed the numpy array into the dask graph while the latter generates the data whenever needed. I'm not sure if this is such a bad thing. It may just be a little surprising but I don't think this will have negative effects.
Those dummy / data tasks would now run immediately. This could cause tasks to pile up on few workers in a scale-up cluster scenario although this is a problem that should be fixed elsewhere IMO. This downside is currently purely an implementation details since for simplicity I just scheduled those first. This could be changed but would require some non-trivial code in the ordering which is why I would only want to do this if necessary.

Closes https://github.com/dask/dask/issues/10618
xref https://github.com/dask/dask/pull/10535

In the xarray world, those are frequently embedded numpy arrays.

And wrappers around on-disk arrays like netcdf/hdf/Zarr!

Opened https://github.com/dask/dask/pull/10706 instead since it's a different implementation


Incorrect display of results

As seen in the screenshot above, the solution had only one 'n' in it, but the colors returned for attempts two and three suggest that the solution has two 'n's in it.

This is a duplicate of #13. The last letter of the four letter word is the same yellow tile as the second letter of your 3 letter word. However, I could change the game so that the crossing tile counts as two separate guesses.


[23.11] haskellPackages.llvm-ffi: unbreak by providing matching LLVM 16

We're opting for the strategy of providing the most up to date version llvm-ffi supports which works out well enough, as nixpkgs also tries to be quite up to date with its LLVM version (and also uses LLVM 16 as the default).
(cherry picked from commit aa4b7ce79daca93d9f95a6ea021595a6d74fe48a)
Description of changes

Things done

Built on platform(s)

[ ] x86_64-linux
[ ] aarch64-linux
[ ] x86_64-darwin
[ ] aarch64-darwin

For non-Linux: Is sandboxing enabled in nix.conf? (See Nix manual)

[ ] sandbox = relaxed
[ ] sandbox = true

[ ] Tested, as applicable:

NixOS test(s) (look inside nixos/tests)
and/or package tests
or, for functions and "core" functionality, tests in lib/tests or pkgs/test
made sure NixOS tests are linked to the relevant packages

[ ] Tested compilation of all packages that depend on this change using nix-shell -p nixpkgs-review --run "nixpkgs-review rev HEAD". Note: all changes have to be committed, also see nixpkgs-review usage
[ ] Tested basic functionality of all binary files (usually in ./result/bin/)
24.05 Release Notes (or backporting 23.05 and 23.11 Release notes)

[ ] (Package updates) Added a release notes entry if the change is major or breaking
[ ] (Module updates) Added a release notes entry if the change is significant
[ ] (Module addition) Added a release notes entry if adding a new NixOS module

[ ] Fits CONTRIBUTING.md.

Add a :+1: reaction to pull requests you find important.

cc @thielema


Better support for Timestamp

I think we should try to make com.thinkaurelius.titan.core.attribute.Timestamp the standard representation of time inside Titan rather than having users rely on Date, Calendar or what-have-ya. To that effect, we should:

Provide methods on Timestamp to convert to and from Date and Calendar
Extend TimestampSerializer to automatically convert to Timestamp from Date and Calendar (by implementing the convert() method of the interface which calls the methods on Timestamp)
Providing suitable test coverage

@mbroecheler
I think what this is saying is that all temporal data will be stored as titan.Timestamp internally, but that also when users retrieve that data they would get back a titan.Timestamp which they can then convert in to the appropriate format.
I'm not sure that this is such a good idea as Java already has so many different representations of Temporal data, and we don't really want to add another one to the mix.
As Titan09 is targeted at Java8 perhaps we should strip support for everything except Instant. The new java8 date time APIS are very good and we can then strip out some of our custom code that does the same stuff.
Thoughts?

Yes, that's a good idea. Is there also a class for duration now that we
could use instead of StandardDuration?
On Fri, Apr 24, 2015 at 2:45 AM Bryn Cooke<EMAIL_ADDRESS>wrote:

@mbroecheler https://github.com/mbroecheler
I think what this is saying is that all temporal data will be stored as
titan.Timestamp internally, but that also when users retrieve that data
they would get back a titan.Timestamp which they can then convert in to the
appropriate format.
I'm not sure that this is such a good idea as Java already has so many
different representations of Temporal data, and we don't really want to add
another one to the mix.
As Titan09 is targeted at Java8 perhaps we should strip support for
everything except Instant
https://docs.oracle.com/javase/8/docs/api/java/time/Instant.html. The
new java8 date time APIS are very good and we can then strip out some of
our custom code that does the same stuff.
Thoughts?
—
Reply to this email directly or view it on GitHub
https://github.com/thinkaurelius/titan/issues/1019#issuecomment-95873592
.

Yes there is duration support. Also serialisation and parsing to ISO formats is easy. Currently we have code that does this.
We can still have a converter that accepts date, calendar etc as per the original suggestion. It would be up to the user to convert from instant back to date or calendar if they wanted to. (They won't unless they are calling legacy code)


[Bug Report] Soundcloud links won't play

Describe the bug
When trying to play any soundcloud link it will spit out an error in the console
To Reproduce
Steps to reproduce the behavior:
!play https://soundcloud.com/ad-blokker/get-a-life-ian-anderson-bafbrein-warning-music
Expected behavior
Play some music from soundcloud
Screenshots
Console: https://hastebin.com/erejolisul.php
Discord output:

Version Info (please complete the following information):

Operating System: Debian 10
JMusicBot Version: 0.2.5

Additional context
Youtube and other services work just fine.

i think its because of token (@jagrosh ) can u update the code where we can enter our soundcloud and yt token

This seems to be a lavaplayer related issue & they are already on it. See sedmelluq/lavaplayer/pull/229

I think they fixed it, but its not working yet, can we have a quick update as soon as possible.

The lavaplayer version will be updated in the next release

Fixed!

I think this needs to be readdressed @Ad-Blokker. Is it just lavaplayer again?

[20:33:33] [INFO] [SoundCloudAudioSourceManager]: Updating SoundCloud client ID (current is 2t9loNQH90kzJcsFCODdigxfp325aq4z). [20:33:33] [INFO] [SoundCloudAudioSourceManager]: Updating SoundCloud client ID succeeded, new ID is LPqZxMy7VDZTQ0w9g4fuCdMNflDZEdIs. [20:33:33] [INFO] [NativeLibraryLoader]: Native library libmpg123-0: loading with filter com.sedmelluq.discord.lavaplayer.natives.ConnectorNativeLibLoader$$Lambda$136/1534345763@445469ab [20:33:33] [INFO] [NativeLibraryLoader]: Native library libmpg123-0: successfully loaded. [20:33:33] [INFO] [NativeLibraryLoader]: Native library connector: loading with filter null [20:33:33] [INFO] [NativeLibraryLoader]: Native library connector: successfully loaded. [20:33:34] [ERROR] [LocalAudioTrackExecutor]: Error in playback of 179685545 com.sedmelluq.discord.lavaplayer.tools.FriendlyException: Something broke when playing the track. 	at com.sedmelluq.discord.lavaplayer.tools.ExceptionTools.wrapUnfriendlyExceptions(ExceptionTools.java:43) 	at com.sedmelluq.discord.lavaplayer.track.playback.LocalAudioTrackExecutor.execute(LocalAudioTrackExecutor.java:102) 	at com.sedmelluq.discord.lavaplayer.player.DefaultAudioPlayerManager.lambda$executeTrack$1(DefaultAudioPlayerManager.java:349) 	at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 	at java.lang.Thread.run(Unknown Source) Caused by: java.lang.RuntimeException: Not success status code: 401 	at com.sedmelluq.discord.lavaplayer.tools.io.PersistentHttpStream.validateStatusCode(PersistentHttpStream.java:86) 	at com.sedmelluq.discord.lavaplayer.tools.io.PersistentHttpStream.attemptConnect(PersistentHttpStream.java:115) 	at com.sedmelluq.discord.lavaplayer.tools.io.PersistentHttpStream.connect(PersistentHttpStream.java:104) 	at com.sedmelluq.discord.lavaplayer.tools.io.PersistentHttpStream.internalRead(PersistentHttpStream.java:169) 	at com.sedmelluq.discord.lavaplayer.tools.io.PersistentHttpStream.read(PersistentHttpStream.java:185) 	at java.io.DataInputStream.readFully(Unknown Source) 	at com.sedmelluq.discord.lavaplayer.container.mp3.Mp3TrackProvider.skipIdv3Tags(Mp3TrackProvider.java:194) 	at com.sedmelluq.discord.lavaplayer.container.mp3.Mp3TrackProvider.parseHeaders(Mp3TrackProvider.java:75) 	at com.sedmelluq.discord.lavaplayer.container.mp3.Mp3AudioTrack.process(Mp3AudioTrack.java:33) 	at com.sedmelluq.discord.lavaplayer.track.DelegatedAudioTrack.processDelegate(DelegatedAudioTrack.java:27) 	at com.sedmelluq.discord.lavaplayer.source.soundcloud.SoundCloudAudioTrack.attemptLoadStream(SoundCloudAudioTrack.java:61) 	at com.sedmelluq.discord.lavaplayer.source.soundcloud.SoundCloudAudioTrack.process(SoundCloudAudioTrack.java:41) 	at com.sedmelluq.discord.lavaplayer.track.playback.LocalAudioTrackExecutor.execute(LocalAudioTrackExecutor.java:90) 	... 4 common frames omitted

@Djinnistorm can you share a copy of the output of the debug command, and also try some other soundcloud links?

I have tried a number of soundcloud links both new and old, none play. If they are in a queue with Youtube links they are skipped in favor of playing youtube links correctly. Here's that debug info:
debug_information.txt

@jagrosh Doesn't seem to have been temporary either, as it still doesn't work.

@jagrosh @Ad-Blokker I set up my bot on a different OS in a different location, still no good. I set up a fresh bot app with a fresh config file, still no good. Same error. Should this be a new ticket, or opening this one again?

No need to open a new issue just yet; I'll look into this for the next release and see if this is resolved in a lavaplayer update since the current release. If this issue, or issues similar to this, persist, I'll open a new issue consolidating information (like I've done for the ongoing youtube issues).


Fixed getting message properties map in Python client

Motivation
Fixes #3524. Message properties were not usable in Python client. Convert into a property dict from C++ wrapper.

run cpp tests

run cpp tests

run cpp tests


draggable: unset height on dragstop

Workaround for https://bugs.jqueryui.com/ticket/10725 until we upgrade.
jquery-ui sets an explicit height as it's dragging, which isn't great for things that have flexible/varying heights.
It looks like this was fixed in a later release, so we should be able to get rid of this code when we upgrade.

LGTM


fix(wasm): resolve jsr import with path correctly

This PR provides a possible implementation for #78

 Thank you for your submission! We really appreciate it. Like many open source projects, we ask that you sign our Contributor License Agreement before we can accept your contribution.You have signed the CLA already but the status is still pending? Let us recheck it.

Let me try undrafting this so someone notice it hopefully


[BugFix] superset-node fails due to superset-frontend absence

This seems to have been due to the recent change to prevent duplication of code in https://github.com/apache/incubator-superset/commit/291306392443a5a0d0e2ee0cc4a95d37c56d4589
The command to run by superset-node has been updated from
command: ["bash", "-c", "cd /app/superset/assets && npm install && npm run dev"]
to
command: ["bash", "-c", "cd /app/superset-frontend && npm install && npm run dev"]
but the directory that it expects - /app/superset-frontend is not available leading to docker-compose up to break with the error:
superset-node_1    | bash: line 0: cd: /app/superset-frontend: No such file or directory

This just adds the required volume mounts.
CATEGORY
Choose one

[x] Bug Fix
[ ] Enhancement (new features, refinement)
[ ] Refactor
[ ] Add tests
[ ] Build / Development Environment
[ ] Documentation

SUMMARY
docker-compose up breaks after https://github.com/apache/incubator-superset/commit/291306392443a5a0d0e2ee0cc4a95d37c56d4589. This is supposed to fix that
Note that docker-compose up succeeds, but when you open the UI, after login, nothing loads
BEFORE/AFTER SCREENSHOTS OR ANIMATED GIF

TEST PLAN
Run docker-compose up before and after the change

This seems to have been already solved, closing this

Codecov Report

Merging #9131 into master will decrease coverage by <.01%.
The diff coverage is n/a.

@@            Coverage Diff            @@
##           master   #9131      +/-   ##
=========================================
- Coverage    59.1%   59.1%   -0.01%
=========================================
  Files         372     372
  Lines       11920   11922       +2
  Branches     2917    2919       +2
=========================================
+ Hits         7045    7046       +1
- Misses       4693    4694       +1
  Partials      182     182

Impacted Files
Coverage Δ

superset-frontend/src/chart/chartAction.js
43.33% <0%> (+0.09%)
:arrow_up:

Continue to review full report at Codecov.

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


Detekt HTML report has invalid link to https://arturbosch.github.io/detekt (404 error page)

Expected Behavior

The bottom of the detekt.html file (the auto-generated report file) should have a link to the current live website, of either https://detekt.github.io/  or https://github.com/detekt/detekt
The text at the bottom of the file is "generated with detekt version x.x.x ...", which is where the link is.

Observed Behavior
The detekt.html (the auto-generated report file) has a link to the old website, of  https://arturbosch.github.io/detekt , which gives a 404 error page.
Steps to Reproduce

Integrate detekt into your gradle project file
Run the gradle task: ./gradlew detekt
View and open the html report file in /Path/to/YourProject/app/build/reports/detekt/detekt.html
Scroll to the bottom of the page, and observe the text and click the link

Context
Related Issue: https://github.com/detekt/detekt/issues/2805
Your Environment

Version of detekt used: 1.15.0 and also older versions like 1.7.1
Version of Gradle used (if applicable): Not applicable
Operating System and version: Any

This is a great catch. Fix is linked!

This is a great catch. Fix is linked!