loading optimization for simulations with a lot of steps

In case you are loading a lot of steps, the lookup in the uuid cache (which grows as a function of the already loaded objects) might actually become the slower than loading an object twice.
Here is the code I use to successfully load 100_000 steps without a major slowdown
# Import the new storage with monkeypatches etc.
save_name = "test.sql"
backend = storage.sql_backend.SQLStorageBackend(save_name, mode='r', echo=False)
s = storage.ops_storage.OPSStorage.from_backend(backend=backend)
s.cache.fixed_cache = s.cache.cache # So all objects loaded at the start are put in the fixed_cache
s.cache.cache = {} # clean out the cache
print(s.summary())
start=0
nsteps=100_000
step_chunks = 1000
steps = []
while start < nsteps:
    stop = min(nsteps, start+step_chunks)
    steps += [s.steps[i] for i in range(start, stop)]
    s.cache.cache = {} # Clean the uuid cache
    start = stop
scheme = s.pathsimulators[0].move_scheme
scheme.move_summary(steps)

Another possible addition is the code to force sql to write an file that has a UUID index (just in case the uuid is not saved as an index).
import sqlalchemy
# Import the new storage with monkeypatching
save_name = "test.sql"
backend = storage.sql_backend.SQLStorageBackend(save_name, mode='r', echo=False)
uuids_table = backend.metadata.tables['uuid']
uuids_index = sqlalchemy.Index('uuids_index', *uuids_table.c, unique=True)
uuids_index.create(backend.engine)

Most recent commits should have fixed these issues.
I believe that the UUID table now has an index when built (the UUID is used as primary key).
Using the fixed_cache like that had always been the intent; I just hadn't gotten around to implementing it.
As for cache clearing, now it works like this: When you iterate over steps, you actually load a block of steps at a time (reducing the number of calls to the database). You can change the size of the block with storage.steps.iter_block_size = INTEGER; default is 100. Then after some number of blocks, you clear the cache. You can change that frequency with storage.steps.clear_cache_block_freq = INTEGER, default is 100. Note that with these defaults, you'll clear the cache every 100 * 100 =  10000 steps.
These default values were chosen arbitrarily. If theres a good reason to adjust them, I'm definitely willing to!
@sroet can you check if the implementation of everything as of https://github.com/openpathsampling/openpathsampling/pull/928/commits/bc371b11910b7355f55284b7123b878e2d853c90 fixes this for you? (In particular, removing the need for manual cache clearing.)
Note that this will only work when you loop as for step in storage.steps; it happens inside the __iter__ method, so you need to trigger that method for it to work. In particular, a loop like:
for step_num in range(len(storage.steps)):
    step = storage.steps[step_num]

will not get this benefit.
Also, going to mention the OPS PR https://github.com/openpathsampling/openpathsampling/pull/928 so there's a link from there to here, for anyone reading that conversation who wants the details that are here. Probably best to do that on all issues here, at least until the PR is merged.

@sroet can you check if the implementation of everything as of openpathsampling/openpathsampling@bc371b1 fixes this for you? (In particular, removing the need for manual cache clearing.)

Looking at this now, I don't see  a slowdown up till now (My custom method had the same order of speed, it might even have been a bit slower)
 10%|█         | 10101/100001 [07:30<1:24:37, 17.70it/s]

I will make another comment if this breaks some other part of the code.

I believe that the UUID table now has an index when built (the UUID is used as primary key).

I don't have the time to generate another 100_000 step toy model simulation in the near future in order to test this, but I expect other user complaints if it is not working as intended ;)

These default values were chosen arbitrarily. If theres a good reason to adjust them, I'm definitely willing to!

Seem to work for me :) maybe it would be good to add a bit to the examples on how to change these numbers?

I will make another comment if this breaks some other part of the code.

So, with the new caching:
<     steps = [step for step in tqdm.tqdm(s.steps)]
---
>     steps = []
>     while start < nsteps:
>         stop = min(nsteps, start+step_chunks)
>         steps += [s.steps[i] for i in tqdm.tqdm(range(start, stop))] #Minimal 3000 to get results
>         s.cache.cache = {}
>         start = stop

somehow now the network.rate_matrix(steps) fails (I know it is deprecated, but was still strange) with the following error:
  File "analysis_retis_sql_all_new.py", line 82, in <module>
    print(network.rate_matrix(steps, force=True))
  File "/home/sander/openpathsampling/openpathsampling/high_level/network.py", line 707, in rate_matrix
    rate = trans.rate(steps)
  File "/home/sander/openpathsampling/openpathsampling/high_level/transition.py", line 479, in rate
    force=force)
  File "/home/sander/openpathsampling/openpathsampling/high_level/transition.py", line 415, in conditional_transition_probability
    ctp = float(n_acc)/n_try
ZeroDivisionError: float division by zero

I will try again with my old code (that should not trigger the clear as it calls 1 index at a time) and see if it due to the new way of initializing or not...

Alright, so something also broke the code I was running before, checking now if me setting frozen_cache and manually cleaning the cache at the start has anything to do with it
I will comment out the following lines from the example above and try again:
s.cache.fixed_cache = s.cache.cache # So all objects loaded at the start are put in the fixed_cache
s.cache.cache = {} # clean out the cache

Do you have a record of what git hash you were using before? It's possible that something else broke in between. (Again, not enough tests here yet)

I did git pull, which gave back
Updating f80eb268..efbf0cb0
so it was f80eb268 before.
It also had include a couple of my hacks to make wham/sql working though:
 result of git diff

diff --git a/openpathsampling/experimental/storage/sql_backend.py b/openpathsampling/experimental/storage/sql_backend.py
index 7bb06289..9d7b790e 100644
--- a/openpathsampling/experimental/storage/sql_backend.py
+++ b/openpathsampling/experimental/storage/sql_backend.py
@@ -12,6 +12,8 @@ from .backend import extract_backend_metadata
 from .my_types import backend_registration_type
 from .serialization_helpers import import_class

+from itertools import zip_longest
+

 import logging
 logger = logging.getLogger(__name__)
@@ -216,13 +218,25 @@ class SQLStorageBackend(object):
         # this is not public API (assumes idx_list, which is reserved by not
         # guaranteed)
         table = self.metadata.tables[table_name]
-        or_stmt = sql.or_(*(table.c.idx == idx for idx in idx_list))
-        sel = table.select(or_stmt)
+
+        # Loop over max 1000 items at once
+        # taken from https://stackoverflow.com/a/434411
+        results = []
+        max_items = 1000
+        iter_list = [iter(idx_list)] * max_items
+        full_list = zip_longest(*iter_list)
         with self.engine.connect() as conn:
-            results = list(conn.execute(sel))
+            for sub_list in full_list:
+                or_stmt = sql.or_(*(table.c.idx == idx for idx in sub_list
+                                    if idx is not None))
+                sel = table.select(or_stmt)
+                sub_results = list(conn.execute(sel))
+                results.extend(sub_results)
         return results

+
+
     ### FROM HERE IS THE GENERIC PUBLIC API
     def register_schema(self, schema, table_to_class,
                         sql_schema_metadata=None):
diff --git a/openpathsampling/numerics/wham.py b/openpathsampling/numerics/wham.py
index cb439f7f..91319f69 100755
:
+        results = []
+        max_items = 1000
+        iter_list = [iter(idx_list)] * max_items
+        full_list = zip_longest(*iter_list)
         with self.engine.connect() as conn:
-            results = list(conn.execute(sel))
+            for sub_list in full_list:
+                or_stmt = sql.or_(*(table.c.idx == idx for idx in sub_list
+                                    if idx is not None))
+                sel = table.select(or_stmt)
+                sub_results = list(conn.execute(sel))
+                results.extend(sub_results)
         return results

+
+
     ### FROM HERE IS THE GENERIC PUBLIC API
     def register_schema(self, schema, table_to_class,
                         sql_schema_metadata=None):
diff --git a/openpathsampling/numerics/wham.py b/openpathsampling/numerics/wham.py
index cb439f7f..91319f69 100755
--- a/openpathsampling/numerics/wham.py
+++ b/openpathsampling/numerics/wham.py
@@ -46,7 +46,7 @@ class WHAM(object):
     sample_every : int
         frequency (in iterations) to report debug information
     """
-    def __init__(self, tol=1e-10, max_iter=1000000, cutoff=0.05,
+    def __init__(self, tol=10e-10, max_iter=1000000, cutoff=0.001,
                  interfaces=None):
         self.tol = tol
         self.max_iter = max_iter
@@ -126,14 +126,13 @@ class WHAM(object):
             cutoff = self.cutoff
         if tol is None:
             tol = self.tol
-
         # clear things that don't pass the cutoff
         hist_max = df.max(axis=0)
         raw_cutoff = cutoff*hist_max
         cleaned_df = df.apply(
             lambda s: [x if x > raw_cutoff[s.name] else 0.0 for x in s]
         )
-
+
         if self.interfaces is not None:
             # use the interfaces values to set anything before that value to
             # zero
@@ -153,6 +152,7 @@ class WHAM(object):
                     for i in range(len(s))
                 ]
             )
+
         else:
             # clear duplicates of leading values
             test_f = lambda val1, val2, val_max: (
@@ -464,8 +464,15 @@ class WHAM(object):

             col_data = cleaned_df[col]
             prev_data = cleaned_df[prev_col]
-
-            first_nonzero = col_data[col_data != 0.0].index[0]
+            try:
+                first_nonzero = col_data[col_data != 0.0].index[0]
+            except IndexError as e:
+                print("df:")
+                print(cleaned_df)
+                print("col_idx: {}".format(str(col_idx)))
+                print("col_data:")
+                print(col_data)
+                raise e
             if not prev_data[first_nonzero] > 0.0:
                 # use not and > to account for NaNs
                 raise RuntimeError(

I will comment out the following lines from the example above and try again:

This also failed now, so will go back to f80eb268 and make sure that one still works

Yeah, I had expected https://github.com/dwhswenson/openpathsampling/commit/f80eb2687ebf73085cb57eb7e2802375c66b3364 based on looking at the commit graph. By then I was working on the storable_functions branch, so not much was happening on storage until I got it ready for CI right before opening the PR.
I didn't see anything suspicious in git diff f80eb268..bc371b1 *.py (from the experimental/storage directory). It's all exactly the changes we've been discussing in this thread (plus a few completely new files).

This also failed now, so will go back to f80eb268 and make sure that one still works
f80eb26 + the patches still works

running for c9497c6+patches now

Can you open the file for reading, and then take a look at the contents of the cache? Specifically, storage.cache.fixed_cache? It's possible that things aren't getting cached. (Although I still don't see how that would cause the error)

Alright so the offending commit is https://github.com/dwhswenson/openpathsampling/commit/2c683565270d4341989dfde7280b2b2e82f8e487 . Will do a print of the two caches before and after loading the steps for the two commits

Alright running this (yeah I know there is a broken sentence there):
    backend = storage.sql_backend.SQLStorageBackend(save_name, mode='r', echo=False)
    s = storage.ops_storage.OPSStorage.from_backend(backend=backend)
    s.cache.fixed_cache = s.cache.cache
    print(f"fixed_cache before resetting cache: {s.cache.fixed_cache}")
    print(f"cache before resetting cache: {s.cache.cache}")
    s.cache.cache = {}
    print(f"fixed_cache after resetting cache: {s.cache.fixed_cache}")
    print(f"cache before after cache: {s.cache.cache}")
    print(s.summary())

on 2c68356:
fixed_cache before resetting cache: {}
cache before resetting cache: {}
fixed_cache after resetting cache: {}
cache before after cache: {}

on 0af4f7d4:
fixed_cache before resetting cache: { A LOT OF STUFF }
cache before resetting cache: { A LOT OF STUFF }
fixed_cache after resetting cache: {A LOT OF STUFF}
cache before after cache: {}

    s.cache.fixed_cache = s.cache.cache

Wait, were you doing this in everything? Don't do that... the fixed_cache is a generic term, but think of it as simulation_object_cache. When storage is loaded, you should already have all the simulation objects in the fixed_cache. The last added line in this diff creates a new MixedCache with simulation objects in fixed_cache and an empty cache.
diff --git a/openpathsampling/experimental/storage/storage.py b/openpathsampling/experimental/storage/storage.py
index d2d32a21..d363f0f0 100644
--- a/openpathsampling/experimental/storage/storage.py
+++ b/openpathsampling/experimental/storage/storage.py
@@ -63,13 +63,14 @@ class GeneralStorage(object):
         self._pseudo_tables['misc_simulation'] = PseudoTable()

         self._storage_tables = {}  # stores .steps, .snapshots
-        self._simulation_objects = self._cache_simulation_objects()
-        self.cache = MixedCache(self._simulation_objects)
         # self.serialization = Serialization(self)
         self.proxy_factory = ProxyObjectFactory(self, self.class_info)
         if self.schema is None:
             self.schema = backend.schema
+        self.cache = MixedCache({})  # initial empty cache so it exists
         self.initialize_with_mode(self.mode)
+        self._simulation_objects = self._cache_simulation_objects()
+        self.cache = MixedCache(self._simulation_objects)
         self._stashed = []

     def initialize_with_mode(self, mode):

I'm getting the simulation objects in the cache.fixed_cache when I reload on the current storage.

Alright, looking at the code I added print statements to this part of the commit
        self.initialize_with_mode(self.mode)
        self._simulation_objects = self._cache_simulation_objects()
        print(len(self._simulation_objects))
        print(len(self.cache.cache))
        self.cache = MixedCache(self._simulation_objects)
        print(len(self.cache.cache))
        self._stashed = []

prints
855
2133
0

So it looks like      self.cache = MixedCache(self._simulation_objects) is not working

Try print(len(self.cache.fixed_cache)). MixedCache.cache does not include MixedCache.fixed_cache. The search is always fixed_cache first, then cache.

Wait, were you doing this in everything? Don't do that... the fixed_cache is a generic term, but think of it as simulation_object_cache. When storage is loaded, you should already have all the simulation objects in the fixed_cache. The last added line in this diff creates a new MixedCache with simulation objects in fixed_cache and an empty cache.

I did try it without those lines in this comment, but without those lines the print in the test script indeed returns:
fixed_cache after resetting cache: {A LOT OF STUFF}
cache before after cache: {}
I will run it again without those lines to make sure it still fails on that commit

I will run it again without those lines to make sure it still fails on that commit

Now at least 2c68356 passes....

 And changes in https://github.com/dwhswenson/openpathsampling/commit/efbf0cb05859dab597a46bc8c43b6ad9ce28cfc7 are unused so far.

Fixed an obvious mistake (I wasn't checking clear_cache_block_freq, I was checking iter_block_size -- but since they're both 100 it shouldn't matter.)
My guess right now: I notice that this is reloading every time. And I wonder if there's something else in the analysis that is based on object identity, not UUID. Does the analysis work correctly if you use the tools in analysis.tis?

Alright, first:
https://github.com/dwhswenson/openpathsampling/commit/bc371b11910b7355f55284b7123b878e2d853c90 is broken
https://github.com/dwhswenson/openpathsampling/commit/2c683565270d4341989dfde7280b2b2e82f8e487 works
Secondly after adding a print statement to the clearing it got triggered a lot earlier than expected:
while running self.initialize_with_mode(self.mode) of the storage
It also triggers at the start of every __iter__ due to block_num % n is always 0 for block_num=0
If I add a condition and block_num != 0 it does not clear during the initialization and it works again...

Does the analysis work correctly if you use the tools in analysis.tis?

never used those before so i might need to debug their usage as well...

Does the analysis work correctly if you use the tools in analysis.tis?

never used those before so i might need to debug their usage as well...

The real question I was asking here was whether the problem might be in the old analysis. If I'm understanding correctly, the answer is no? It's with clearing when block_num == 0?
I had considered that case, but didn't think it would be a problem... will have to think to figure out why that is. But if that's the fix, feel free to make a recommended change on the PR so you can get commit credit for it.

Secondly after adding a print statement to the clearing it got triggered a lot earlier than expected:
while running self.initialize_with_mode(self.mode) of the storage

This is actually a different instance of the cache. Because we need the cache when loading, and we load the simulation objects to cache them, we start with an empty cache that gets replaced once we have the simulation objects.

The real question I was asking here was whether the problem might be in the old analysis.

I was trying to get that to work, but it is not easy to convert, current error is:
Traceback (most recent call last):
  File "analysis_retis_sql_all_5000_new.py", line 87, in <module>
    for t in network.sampling_transitions}
  File "/home/sander/openpathsampling/openpathsampling/analysis/tis/standard_analysis.py", line 184, in __init__
    hist_parameters=calc
  File "/home/sander/openpathsampling/openpathsampling/analysis/tis/crossing_probability.py", line 43, in __init__
    + "value of order parameter.")
RuntimeError: Can't identify function to determine max value of order parameter.

Now I also ran into another issue with slicing the steps:
Traceback (most recent call last):
  File "analysis_retis_sql_all_new.py", line 61, in <module>
    steps = [step for step in tqdm.tqdm(s.steps[:nsteps])]
  File "/home/sander/openpathsampling/openpathsampling/experimental/storage/storage.py", line 446, in __getitem__
    if not (-len_self <= item < len_self):

I was trying to get that to work, but it is not easy to convert, current error is:

My recommendation is that this is less to test the current code out (if it works with the old analysis, it should work with the new) but more for you to know, because the new analysis is more flexible and probably faster (and even includes tqdm to tell you its progress, if you have tqdm installed!)
My guess is that your interfaces weren't a VolumeInterfaceSet?
https://github.com/openpathsampling/openpathsampling/blob/7b59a7b38af852fce536f0df605e324076c9f90b/openpathsampling/analysis/tis/crossing_probability.py#L33-L43
If that's the case, you have to construct the construct the parts of the TIS analysis and feed them to the TISAnalysis object. You'll have to manually tell the TCP for each transition what the CV was (and actually, you need to give it a function that is the max of the CV) More on constructing the TIS analysis:

http://openpathsampling.org/latest/topics/tis_analysis.html
https://github.com/openpathsampling/openpathsampling/blob/7b59a7b38af852fce536f0df605e324076c9f90b/examples/toy_model_mstis/toy_mstis_A3_new_analysis.ipynb (especially "Assembling a TIS analysis from scratch")

Also, note that this allows you to change the WHAM parameters without needing to edit the code (one of the major reasons I wrote it).

Now I also ran into another issue with slicing the steps

Yeah, I was aware of that. I'm trying to figure out the best way to handle that, but it won't be in this first PR.

 That's probably another thing that needs some sort of monkey patch.

It's with clearing when block_num == 0?

The original error disappears if I add and block_num != 0

we load the simulation objects to cache them

The issue that I seem to find is that this temporary cache is cleared before it is converted to the new cache
Quick question, looking at this code block:
            loaded = self.storage.load(row_uuids)
            if block_num % self.iter_block_size == 0 and block_num != 0:
                self.storage.cache.clear()
            for obj in loaded:
                yield obj

What happens to obj? they are loaded but the cache is cleared before they are returned?
I might try swapping the order of the clear and load and see if that helps.

 That's probably another thing that needs some sort of monkey patch.

Yeah I had to set them too explicit None (before saving), don't know if that is recoverable...

What happens to obj if they are loaded but the cache is cleared before they are returned?

It should stay in loaded, which is a list. So it has a reference and won't be garbage-collected. However, it won't be cached at the start of the next block, and will need to be reloaded.

Yeah I had to set them too explicit None (before saving), don't know if that is recoverable...

You can always recreate them. In fact, if you're not saving them, they don't even have to be CVs (technically, PseudoAttributes in netcdfplus terms; StorableFunctions in SimStore). Something like:
InterfaceSet._cv_max_dict = {cv: lambda traj, cv: max(cv(traj)) for cv in storage.cvs}

should bring those back, and then you can use the StandardTISAnalysis. Compare with the code in interface_set.py. But you will miss the best part of the new analysis, which is that the max value of the CV for each trajectory is usually already pre-calculated and disk-cached. Once I can combine that with lazy-loading trajectories, imagine how much faster your analysis will be!

InterfaceSet._cv_max_dict = {cv: lambda traj: max(cv(traj)) for cv in storage.cvs}

So have tried to add
    for i in network.to_dict()['trans_info']:
        vs = i[1]
        vs._cv_max_dict = {cv: lambda traj: max(cv(traj)) for cv in s.cvs}

but it still raises the same error...

Alright I got the new analysis working, will test now to see if it also fails with the current head of the storage branch

I am happy to report that the new analysis does not fail on 65f71e16 (current HEAD of the storage branch)
while the old analysis errors out (at least for calculating the rate matrix), unless either
and block_num != 0 is added or the clear() of the cache is done before the loading of the objects...

Alright, I am running another 100_000 step simulation, and for the toy system the scaling does not look great (yet). At the start it was running at around 0.13 seconds per step.
Now at 28400 it is taking 0.39 second per step (on average)
Current prognosis is that is will be done in about 8 hours, so I will report back tomorrow with the final speed.

There might be a need for an example to clear the cache while running a long simulation. (That is why I am posting this here)

I will also run the analysis and make sure that the SQLIndex is fixed, but I will report my findings from that in the PR.

I would expect that that not clearing caches would be more likely to cause memory issues than a slow-down (although memory issues can manifest as a slow-down.
In any case, if that's the issue, it's easily fixed by running in smaller batches. (Although I need to add cache clearing during sampling anyway.) Also, continuing a run will be the easy way to check whether its related to caching (which gets reset) or the storage format (i.e., indexing).

I would expect that that not clearing caches would be more likely to cause memory issues than a slow-down (although memory issues can manifest as a slow-down.

Currently at cycle 36_200 with a current average speed of 0.48 seconds per step (still estimated to be done in 8 hours)
I am only using 2% of the 64 GB RAM available, with no other processes running (other than some OS deamons, but nothing that is chocking the 16 cores).
Running disk has 1.4 TB left, so that should also not lead to a slowdown.

Also, continuing a run will be the easy way to check whether its related to caching (which gets reset) or the storage format (i.e., indexing).

I will append another 5_000 or so steps after the current one is completed.

This morning at step 78_400 with an average time of 0.84 seconds per step, and an estimated 5 hours remaining
Keep in mind that this is an average (so including the faster earlier steps)
This seems to scale (surprisingly) linear with the number of steps. Will report back for the analysis and an append of 5000 steps after this simulation is done.

Alright, so the full 100_000 steps ran for:
Working on Monte Carlo cycle number 100000
Running for 1 day 4 hours 12 minutes 34 seconds -  1.02 seconds per step

First things first:

The sql-indexing seems to not be fixed (see this abisimal speed for the same analysis I run on the indexed sqls):

  0%|▏                                                          | 301/100001 [07:09<807:56:05, 29.17s/it]

after running the code in the first comment of this issue to add the index (took less than a minute), notice that above is s per it and below is it per s)
  1%|▋                                                           | 1201/100001 [00:33<1:33:05, 17.69it/s]

Restarting using esentially the code in this comment is failing with a traceback that I don't fully understand for now
Traceback (most recent call last):
  File "append_new_storage.py", line 48, in <module>
    calc.run(steps)
  File "/home/sander/openpathsampling/openpathsampling/pathsimulators/path_sampling.py", line 275, in run
    movepath = self._mover.move(self.sample_set, step=self.step)
  File "/home/sander/openpathsampling/openpathsampling/pathmover.py", line 2580, in move
    self.mover.move(sample_set),
  File "/home/sander/openpathsampling/openpathsampling/pathmover.py", line 1582, in move
    subchange = mover.move(sample_set)
  File "/home/sander/openpathsampling/openpathsampling/pathmover.py", line 1582, in move
    subchange = mover.move(sample_set)
  File "/home/sander/openpathsampling/openpathsampling/pathmover.py", line 613, in move
    change = self.move_core(samples)
  File "/home/sander/openpathsampling/openpathsampling/pathmover.py", line 659, in move_core
    accepted, acceptance_details = self._accept(trials)
  File "/home/sander/openpathsampling/openpathsampling/pathmover.py", line 703, in _accept
    return self.metropolis(trials)
  File "/home/sander/openpathsampling/openpathsampling/pathmover.py", line 540, in metropolis
    valid = ens(sample.trajectory, candidate=self._trust_candidate)
  File "/home/sander/openpathsampling/openpathsampling/ensemble.py", line 2848, in __call__
    & (self.cv_max(trajectory) > self.lambda_i)
  File "/home/sander/openpathsampling/openpathsampling/netcdfplus/chaindict.py", line 229, in __getitem__
    return self._post[items]
  File "/home/sander/openpathsampling/openpathsampling/netcdfplus/chaindict.py", line 260, in __getitem__
    return self._post[[items]][0]
  File "/home/sander/openpathsampling/openpathsampling/netcdfplus/chaindict.py", line 74, in __getitem__
    rep = list(self._post[nones])
  File "/home/sander/openpathsampling/openpathsampling/netcdfplus/chaindict.py", line 67, in __getitem__
    results = self._get_list(items)
  File "/home/sander/openpathsampling/openpathsampling/netcdfplus/chaindict.py", line 365, in _get_list
    results = [self._eval(obj) for obj in items]
  File "/home/sander/openpathsampling/openpathsampling/netcdfplus/chaindict.py", line 365, in <listcomp>
    results = [self._eval(obj) for obj in items]
  File "/home/sander/openpathsampling/openpathsampling/netcdfplus/attribute.py", line 404, in _eval
    return self.cv_callable(items, **self.kwargs)
TypeError: 'dict' object is not callable

@sroet : On the restart, are you using the loading monkey-patch? You'll need to. (If you save an old-style CV, you need to monkey patch for saving. If you load an old-style CV, you need to monkey patch for loading. There's a monkey_patch_all that does both.)

@sroet : On the restart, are you using the loading monkey-patch? You'll need to. (If you save an old-style CV, you need to monkey patch for saving. If you load an old-style CV, you need to monkey patch for loading. There's a monkey_patch_all that does both.)

The code is:
import openpathsampling as paths
from openpathsampling.experimental import storage, simstore
paths = storage.monkey_patch_all(paths)
import openpathsampling.engines.toy as toys
from openpathsampling.engines.toy.pes import PES
from openpathsampling.engines.toy.integrators import ToyIntegrator
from openpathsampling import RandomVelocities, DefaultScheme
from sjoelbak import (SjoelbakPES, SjoelbakLangevinIntegrator,
                      SjoelbakAnaliticalIntegrator,
                      SjoelbakAnaliticalSelector,
                      SjoelbakAnaliticalMover,
                      SjoelbakAnaliticalStrategy)
import numpy as np

# monkey patches

from openpathsampling.tests.test_helpers import (
    assert_items_almost_equal,
    make_1d_traj,
)
from itertools import product

save_name = "RETIS-0-analytical.sql"
backend = simstore.SQLStorageBackend(save_name, mode='a', echo=False)
s = storage.Storage.from_backend(backend=backend)

calc = s.pathsimulators[0]
calc.storage = s
calc.restart_at_step(s.steps[-1])
steps = 5000
calc.save_frequency = 100
calc.run(steps)
s.close()

Which should apply the patches, right?

Ah, I looked a little closer at the traceback:
  File "/home/sander/openpathsampling/openpathsampling/ensemble.py", line 2848, in __call__
    & (self.cv_max(trajectory) > self.lambda_i)

This is in TISEnsemble. When you made the ensemble, TISEnsemble.cv_max was a generalized CV (a PseudoAttribute). It takes a trajectory and returns the maximum value of a given CV along that trajectory. It looks like that inner CV isn't being recreated correctly. I'm not sure why this is, but should be able to fix this by manually setting cv_max to None for all your TIS ensembles (there's a backup code path when TISEnsemble doesn't have a cv_max defined). Easiest way is probably to loop over network.sampling_ensembles and checking for isinstance(ens, path.TISEnsemble).
Could you also tell me what it currently gives you? That is, what is the dictionary at network.sampling_ensembles[0].cv_max.callable_cv (or something like that)?

Could you also tell me what it currently gives you? That is, what is the dictionary at network.sampling_ensembles[0].cv_max.callable_cv (or something like that)?

It seems to be not reconstructed marshal dicts:
{'_marshal': {'__class__': 'bytes', '__module__': 'builtins', 'bytes': '4wIAAAAAAAAAAgAAAAMAAABTAAAAcwwAAAB0AHwBfACDAYMBUwApAU4pAdoDbWF4KQLaAXTaA2N2X6kAcgQAAAD6Si9ob21lL3NhbmRlci9vcGVucGF0aHNhbXBsaW5nL29wZW5wYXRoc2FtcGxpbmcvaGlnaF9sZXZlbC9pbnRlcmZhY2Vfc2V0LnB52gg8bGFtYmRhPigAAADzAAAAAA=='}, '_global_vars': [], '_module_vars': []}

The append speed on the non-indexed sql is, so that is still growing with file-size, not cache size:
Working on Monte Carlo cycle number 101500
Running for 45 minutes 24 seconds -  1.82 seconds per step

Appending is already better (2-3x) for the indexed sql:
Working on Monte Carlo cycle number 101800
Running for 20 minutes 38 seconds -  0.69 seconds per step

It seems to be not reconstructed marshal dicts:

Yeah, not surprised. That's the function that the generalized CV would have had, would have been something like: lambda traj: max(cv(traj)) (not that I can read the bytecode, just know what it would be 😆)

The append speed on the non-indexed sql is still quite slow, so that is still growing with file-size, not cache size:

Huh. That means that my approach to telling it that the UUIDs in the UUIDs table should be primary key didn't work, so I'll have to dig back into the SQLAlchemy docs.

Huh. That means that my approach to telling it that the UUIDs in the UUIDs table should be primary key didn't work, so I'll have to dig back into the SQLAlchemy docs.

Just for my lack of terminology here; would that be a different issue than the one that is fixed by creating an sqlalchemy.Index for the uuid table? (that came up in the analysis comment, where the loading is 500x faster after adding the index manually)?

I had hoped that making UUIDs a primary key would have the same effect as making the index. Creating an index basically creates another copy of the table: think of it as a dict with UUID as key -- so access is much faster, but there is some space used. (It's not exactly a dict, but same principle.) I thought that telling the table that the UUID was its primary key would have the same effect, but without creating a second table. Apparently not -- at least, what I did didn't have the desired effect!

I did some digging; it looks like sqlite only gets the really fast indexing if the primary key is an integer primary key (because then it becomes the internal ROWID). I'm treating UUIDs as strings. So the solution is to create an index. The commit I just pushed should do that automatically. I'm hoping that will fix it; could you give this a try, @sroet? (Looks like we can tell if performance is degrading by ~30k, so don't feel like you need to run 100k unless you just want the data!)

restarted, now at 1600 with an average running speed of 0.13 s/step

Ok I completed a new run:
Completed at 100_000 with and average speed of 0.45 s/step
The final average speed of this version (0.45 s/step) is already more than 2x the average speed of before  1.02 s/step.
Working on Monte Carlo cycle number 10000
Running for 29 minutes 36 seconds -  0.18 seconds per step
--
Working on Monte Carlo cycle number 20000
Running for 1 hour 9 minutes 40 seconds -  0.21 seconds per step
--
Working on Monte Carlo cycle number 30000
Running for 2 hours 3 minutes 14 seconds -  0.25 seconds per step
--
Working on Monte Carlo cycle number 40000
Running for 3 hours 3 minutes 21 seconds -  0.28 seconds per step
--
Working on Monte Carlo cycle number 50000
Running for 4 hours 16 minutes 47 seconds -  0.31 seconds per step
--
Working on Monte Carlo cycle number 60000
Running for 5 hours 37 minutes 18 seconds -  0.34 seconds per step
--
Working on Monte Carlo cycle number 70000
Running for 7 hours 5 minutes 29 seconds -  0.36 seconds per step
--
Working on Monte Carlo cycle number 80000
Running for 8 hours 39 minutes 29 seconds -  0.39 seconds per step
--
Working on Monte Carlo cycle number 90000
Running for 10 hours 41 minutes 45 seconds -  0.43 seconds per step
--
Working on Monte Carlo cycle number 100000
Running for 12 hours 33 minutes 34 seconds -  0.45 seconds per step

It is actually still growing linearly (on average), but at such a slow rate I think it is acceptable.
The if we look at the average time of the last 10_000  the speeds are (with slightly different rounding than above):

steps (x10000)
average
average last 10_000
diff last 10_000

1
0.18
0.18
-

2
0.21
0.24
0.06

3
0.25
0.33
0.09

4
0.28
0.37
0.04

5
0.31
0.43
0.06

6
0.34
0.49
0.06

7
0.37
0.55
0.06

8
0.40
0.61
0.06

9
0.43
0.67
0.06

10
0.46
0.73
0.06

This seems to indicate that the average time to add a step grows by 0.06 s for every 10_000 steps added. Given that this should still be sub-second for up to 130_000 steps , I am totally fine by this

Analysis runs as fast as you would expect with an indexed sql (36.38 it/s)

Appending seems to be as fast as before with an indexed sql (and in line with the last 10_000 speeds mentioned above)

Working on Monte Carlo cycle number 103100
Running for 38 minutes 24 seconds -  0.74 seconds per step
Estimated time remaining: 23 minutes 33 seconds

This current code handles all the mentioned issues, so I will close this.


Added Json format

Added the reporter option that allows to choose between xml and JSON.
Added extension checks to add proper extensions to files
Added global wrapper to JSON output for use when concatenating files

Thanks, do you mind fixing the errors first?

Yeah sorry.
A little new to pull requests.

If I understood your tests correctly. It seems to be fine now.

:(

Any news?

Any news?

Well, the change works, but the tests are failing because of a timeout on various tests. It seems to be random on each build. I get this error:
Error: timeout of 2000ms exceeded. Ensure the done() callback is being called in this test.```

Any news on this?


⚠ ClamAV has degraded performance

In a87ed9c, ClamAV (https://spamassassin.apache.org/) experienced degraded performance:

HTTP code: 200
Response time: 170 ms

Resolved: ClamAV performance has improved in b4ad2d8.


Implementing outside django-admin

In django admin works great. Is there any planning to implement using outside django-admin?

First, my apologies for a slow reply. I was on holiday.
This is a question about a feature that would be obvious. The question deserves an extended answer. Django has base code for form-building i.e https://docs.djangoproject.com/en/4.0/topics/forms/. But unlike other systems it has no "form-builder" e.g. a fully-abstracted .form-description meta-language.  Django also has no system of convention either,(maybe you would argue otherwise?) like I used to use ,for example, in Drupal 6. This means Django can be versatile when creating forms. But makes it more difficult to provide code that will work for everyone.
When I built this  module I had  my own issue. Wagtail's Streamfield implements a new approach to an old problem. I think the approach is wonderful, the answer everyone wants and needs. But the code is difficult---I think I've made that clear in the README. The Javascript is extensive, and tangled. The trigger code is difficult (and not well-documented). This is not a comment on Wagtail's standard of coding, only a note that a radical new idea has a tricky implementation. Which gives me a maintenance problem. Will Wagtail change their implementation in the future (I've not looked at all, given my situation during the virus curfews)? I found ways to extract the code that didn't interfere with the way Wagtail writes to storage.. This is what I care about---that people will not need to rebuild data, but that data will always be accessible.
But adding extra features troubles me. I was happy to add the ability to make list items as it will generate Wagtail-standard data, But extra code and/or API for forms would be an extension.  If I had commercial backing, a guarantee  that someone needed updates to work, so would back the module with code-time and personnel, then  I'd consider the feature. Even regard adding out-of-admin-forms as as an essential feature.  But my current position is that Wagtail's implementation may change in radical ways. At some time in the future, I may need to make a radical rebuild of this module. Fortunately I can rely on Django's policy of conservatism and stability, which means the module should work well for years (which it has done). But without a guarantee of resources for development, I won't add code that extends the module. This suggestion is a natural extension of the module, which I am sure many would welcome. However, it may create a maintenance issue, potentially a very big maintenance issue. Sadly, an issue I don't have the resources to cover.


Task5,Task6,Task7,Task8

@poojakolhe84
Task -5
Code verified. provide a annotations and change default  activity names
Task -6
Code verified. provide a annotations and change default  activity names
Task -7
Code verified. provide a annotations and change default  activity names
Task -8
Code verified. provide a annotations and change default  activity names
Task -9
Code verified. provide a annotations and change default  activity names
Task -10
Code verified. provide a annotations and change default  activity names
Note:
Provide annotations means the process done with code explain in step vice and change a activity names with use of activity in this process.


pull request for e2e test at 01/16/2017 07:56:16

:white_check_mark: Validation status: passed
For more details, please refer to the build report.
Note: If you changed an existing file name or deleted a file, broken links in other files to the deleted or renamed file are listed only in the full build report.


New Extension: Ethereum Gas Tracker

Description
A new extension to track the current gas price of Ethereum in the Menu Bar.
Screenshots

Checklist

[x] I read the extension guidelines
[x] I read the documentation about publishing
[x] I ran npm run build and tested this distribution build in Raycast
[x] I checked that files in the assets folder are used by the extension itself
[x] I checked that assets used by the README are placed outside of the metadata folder

LGTM. one thing i'd do is re-take the first screenshot with the updated icon. Needs approval by @pernielsentikaer

Indeed I completely forgot about that one, thanks!

OK, thanks @pernielsentikaer 👍


#852 I would like to implement the mobile responsive design for Proje…

…ct Page

Issues Identification
Closes: #852
Feature Project Section is not Responsive.
Summary
This pull request addresses the issue of the Feature Project Section not being responsive. It implements a mobile-responsive design to ensure that the section adapts seamlessly to different screen sizes, including mobile, tablet, and desktop. The changes are necessary to improve user experience, making the section more accessible, readable, and navigable on smaller screens, which will lead to better engagement and usability for all users.
Details
This pull request includes the following changes to make the Feature Project Section responsive:
Layout Enhancements:
Utilized CSS Flexbox/Grid to create a flexible layout that adapts to various screen sizes.
Implemented a multi-column layout for larger screens, which transitions to a single-column layout on smaller devices for improved readability.
Responsive Typography:
Applied media queries to adjust font sizes and spacing dynamically based on the screen width, ensuring that text remains legible and well-proportioned across devices.
Image Responsiveness:
Made all project images responsive by setting max-width: 100% and adjusting their height to maintain aspect ratios.
Introduced srcset attributes for images to serve appropriate sizes based on device resolution, enhancing performance and loading times.
Interactive Elements:
Ensured that buttons and links are adequately sized and spaced for touch interactions on mobile devices, improving usability.
Enhanced hover and active states for buttons to provide clear feedback to users.
Media Queries Implementation:
Defined breakpoints using media queries to apply specific styles at various screen widths (e.g., 320px, 768px, 1024px) to ensure a consistent experience across different devices.
Types of Changes
Please check the boxes that apply

[ ] Bugfix (non-breaking change that fixes an issue)
[X] New feature (non-breaking change that adds functionality)
[ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
[ ] Documentation update (Documentation content changed)
[ ] Other (please describe):

Checklist
Please check the boxes that apply

[x] My code follows the style guidelines of this project
[x] I have performed a self-review of my own code
[x] I have commented my code, particularly in hard-to-understand areas
[ ] I have made corresponding changes to the documentation
[x] My changes generate no new warnings
[x] My changes do not break the current system and pass all existing test cases
[ ] I have added tests that prove my fix is effective or that my feature works
[x] New and existing unit tests pass locally with my changes

Screenshots
https://github.com/user-attachments/assets/fffb6d71-2995-4e52-8bdf-541a4e8106aa
Additional Information
Please provide any other information that is relevant to this pull request.

Thank you for giving me the opportunity to contribute to your project sir @vivekvardhan2810

Hey, @ambarmishraa, don't worry you can contribute here, but a small advice.
once i merge the PR, then you can create the issue, after a day or 2 days
that's the only i am saying.
But you can contribute here also.
it's just an instructions provided by organisers for Project Admins.

Thank you sir for such a relief message. I will surely take care of your instruction.

And @ambarmishraa Again thank you for contributing to ML Fusion labs.


wifi: Include CRDA regulatory database

Motivation for this change
The WiFi regulatory database (CRDA) is a list, by country, of which frequencies are legal for use and how to use them. If it's missing, the kernel will use a global ruleset that might be just the intersection of what's legal in every country.
As many devices (e.g. phone hotspots) automatically apply the correct CRDA rules, it's possible for a hotspot to allocate a frequency band which is not globally legal. This is normally fine, as AP scans can be done passively and the beacons will include a country code for setting up CRDA on the client, but if the CRDA database is missing then the udev event will go unheeded.
In practice this means access points will either become impossible to connect to, or outright invisible. The problem is especially insidious because it's likely to occur during travel, when you may not have any other options for connecting to a network.
This commit enables CRDA if either wpa_supplicant or networkmanager is enabled, adding 264KiB to the closure size in either case.
There should be no documentation needed; it's entirely plug and play.
Things done

[x] Tested using sandboxing (nix.useSandbox on NixOS, or option sandbox in nix.conf on non-NixOS)
Built on platform(s)

[x] NixOS
[ ] macOS
[ ] other Linux distributions

[x] Tested via one or more NixOS test(s) if existing and applicable for the change (look inside nixos/tests)
[ ] Tested compilation of all pkgs that depend on this change using nix-shell -p nix-review --run "nix-review wip"
[x] Tested execution of all binary files (usually in ./result/bin/)
[x] Determined the impact on package closure size (by running nix path-info -S before and after)
[ ] Ensured that relevant documentation is up to date
[x] Fits CONTRIBUTING.md.

Can you split these commits like?
nixos/networkmanager: Include CRDA regulartory database
nixos/wpa_supplicant: ...

...other modules touched


feat: nervos-to-ethereum bugs fix and integration test

Codecov Report

Merging #312 (8a80662) into feature-nervos-to-ethereum (ae63e84) will decrease coverage by 3.70%.
The diff coverage is n/a.

:exclamation: Current head 8a80662 differs from pull request most recent head ebf2303. Consider uploading reports for the commit ebf2303 to get more accurate results

@@                      Coverage Diff                       @@
##           feature-nervos-to-ethereum     #312      +/-   ##
==============================================================
- Coverage                       42.66%   38.96%   -3.71%
==============================================================
  Files                              24       16       -8
  Lines                            1957     1699     -258
  Branches                           56        0      -56
==============================================================
- Hits                              835      662     -173
+ Misses                           1122     1037      -85

Impacted Files
Coverage Δ

...ules/eth-contracts/contracts/NervosMirrorToken.sol

...es/eth-contracts/contracts/libraries/SafeERC20.sol

...in-modules/eth-contracts/contracts/ForceBridge.sol

...n-modules/eth-contracts/contracts/AssetManager.sol

...ain-modules/eth-contracts/contracts/test/ERC20.sol

...ules/eth-contracts/contracts/libraries/Address.sol

...les/eth-contracts/contracts/libraries/SafeMath.sol

...th-contracts/contracts/libraries/MultisigUtils.sol

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 ae63e84...ebf2303. Read the comment docs.


Opening empty editor starts the LSP server in the CWD

It's loading everything I have in ~.

This should be already fixed since plugins activate on specific workspace settings


Will there be a new release?

We use InputSimulatorPlus in OptiKey, and we'd like the fix for LMENU that's in af96f2a453d48f632a5c98153a6aa87fb1a26012. Is there likely to be an official release to nuget or do we need to roll our own?
Thanks for all your work :)

FYI this is now released here: https://www.nuget.org/packages/InputSimulatorPlus2/1.0.9


Upgrade to 2.0.2 causes amr claim to default to external

[ X] I read and understood how to enable logging

Issue / Steps to reproduce the problem
To highlight, we have a project that hosts the identity server as well as an identity server admin API so to speak that allows us to create clients, api and identity resources with an angular app. So of the important code config tidbits are as follows:
services.AddAuthorization(options =>
{
    options.AddPolicy(Constants.AdminApiPolicy, policyBuilder => policyBuilder
        .RequireClaim(JwtClaimTypes.Role, Constants.AdminRole)
        .RequireClaim(JwtClaimTypes.AuthenticationMethod, OidcConstants.AuthenticationMethods.Password)
        .RequireScope("xactware.identityserver.adminclient")
        .AddAuthenticationSchemes(OidcConstants.AuthenticationSchemes.AuthorizationHeaderBearer));
});

services.AddAuthentication()
    .AddIdentityServerAuthentication(options =>
    {
        options.Authority = Configuration["idsrv:admin:authority"];
        options.RequireHttpsMetadata = false;
        options.JwtBearerEvents = new JwtBearerEvents
        {
            OnTokenValidated = async context =>
            {
                var adminRepo = context.HttpContext.RequestServices.GetService<AdminUserRepository>();
                var user = await adminRepo.FindUserById(context.Principal
                    .FindFirst(JwtClaimTypes.Subject)
                    .Value);
                if (user != null)
                {
                    context.Principal.AddIdentity(
                        new ClaimsIdentity(new[] {new Claim(JwtClaimTypes.Role, Constants.AdminRole)}));
                }
            }
        };
    });

We inject the admin role claim if the user is in a list we maintain. Other settings include adding identity server. So this all used to work with 2.0.1. With 2.0.2 we are getting the following in the logs. Changing the version of the AccessTokenValidation library doesn't have any effect. So it appears to be isolated to whatever changed with IdentityServer4 2.0.2.
Relevant parts of the log file
2017-11-09 22:10:52.914 -07:00 [Information] AuthenticationScheme: "BearerIdentityServerAuthenticationJwt" was successfully authenticated.
2017-11-09 22:10:52.915 -07:00 [Information] AuthenticationScheme: "Bearer" was successfully authenticated.
2017-11-09 22:10:52.922 -07:00 [Information] Authorization failed for user: "330".
2017-11-09 22:10:52.927 -07:00 [Information] Authorization failed for the request at filter '"Microsoft.AspNetCore.Mvc.Authorization.AuthorizeFilter"'.
2017-11-09 22:10:52.928 -07:00 [Information] Executing ForbidResult with authentication schemes (["Bearer"]).
2017-11-09 22:10:52.931 -07:00 [Information] AuthenticationScheme: "Bearer" was forbidden.

Hard to tell - simplify your authZ policy - have a look at the claims of the user.
That should give you more info.

OK, that helped. It looks like in 2.0.1, the amr claim is coming back as pwd, where as in 2.0.2 it is coming back as external. I'll go look at the sign-in to see what is happening there.

That would be a bug. I will also have a look

fixed in 2.0.3


BREAKING CHANGE: Use vim.ui.input API core

Neovim 0.6.0 added vim.ui.input. Could it be a good alternative to reduce dependencies

Yes, I know about it, but I decide against migrating to it, since for previous versions it would not be possible and for that component I would not receive the LSP response needed for setting the quickfix list and putting the cursor at the word end.
If you, or anyone for that matter, know by any chance how I could make that work I have nothing against it. Otherwise I will keep the current implementation.

Not sure if this helps, but here is what I'm doing for my personal config:

Defining a custom handler for setting qflist and nvim-notify (optional) here
Attaching this handler to lspconfig server setup options here

Wait, @axieax, it sends the response? This is new, I am pretty sure it didn't the first time vim.ui.input was added. My other concern is that it doesn't seem to be able to handle responsiveness very well. What happens when the width of the window is too small? What does it happen when the height is too small?
This would also make it kind of hard to maintain for Neovim < 0.6.0, I think :thinking:. What do you both think?

Forgot to mention, but I'm also using dressing.nvim for customising the look of my vim.ui.input. With this, it seems that the window content autoscrolls if it doesn't fit. But yeah this most likely wouldn't be supported by earlier versions haha

The thing is, if I want to style the UI, most likely I will still need to use plenary or another dependency. The only advantage I see is that I wouldn't need to make the LSP requests myself.
Honestly, it seems to bring too few advantages at the moment, when taking into account the effort needed (talking about docs and tests mostly). Will leave open, if anyone wants to take it upon themselves I can take a look and provide feedback, but I don't think it is worth it for me, personally, to put the effort in, when the existing solution works, has good docs (in my opinion) and a nice set of tests.

I am considering migrating to the Neovim 0.6.0 API, but I think I will wait a bit more, for more time to pass to ensure most people migrated to this Neovim version. If it proves to be a lot of work I might not implement it, since the current solution works perfectly in my opinion, but it might help with not needing to handle LSP requests myself.

After some thought, I think this approach is not good. vim.ui.select should be managed by plugins which change the default style by overriding the function, like https://github.com/rcarriga/nvim-notify does.
Feel free to close this issue.

Closing this as the new implementation I have written will not use the vim.ui.input method, since at the moment it seems more complex than needed, compared to what I have done in GH-122


AssertionError: Per-tensor support only currently

I convert the tflite model to int8 by tensorflow official doc, but it raises this error when i convert it to onnx.

Same issue:
assert(quant.ScaleAsNumpy().size == 1), "Per-tensor support only currently" AssertionError: Per-tensor support only currently


Add test to check is barrel slot's theta is degree or radian

Refactory of HitFinderTools, split it into separate functions for easier testing.
Also I added test, that checks is there is barrel slot with theta greater then 7(radians should be from 0 to 2PI)

Added fix for issue 909, also some refactoring and optimization. On 10000 events there is about 10% increase on speed.
New user option: HitFinder_Velocity_Calibration_File_Path_std::string with path to velocity calibration file

Also, change j-pet-framework to latest develop version


Wrong interpretation of vapour phase symbol

Currently the engine interprets the state of aggregation indicated with a v as a downward arrow for precipitation, i.e. \ce{H2O (v)} = H2O ↓, it should be H2O(v) instead. I think in general the usage of 'v' is not standard, it should be 'g' instead, it might be good to support states of aggregation as a special rule, given that they are set in parenthesis. See the Green Book (pdf) p. 54.

I am not sure how to help you there. You do yourself link to the definition of states of aggregations and 'v' is not among them. Furthermore, 'v' is the best substitute for downward arrow, a normal keyboard has. I wouldn't feel good to change the precipitate syntax (that has been around for a decade) for something nonstandard.

Yes it is not standard, but it had to come from somewhere, I stumbled upon it while editing some questions. In any case, I can find any reference back to that. I do not find any reference to those arrows either.
I guess in general I did not expect that constructs in parenthesis would be parsed in that specific way.


Catalog registration events ordering

I am currently running

SpongeVanilla version: 7.2

Issue Description
In the version 7.2 of sponge API, Catalog registrations are made in their own event. In my plugin I use 4 registrations event Keys, DataRegistration , CraftingRecipe and SmeltingRecipe.
I need these event to be fired in a particular order because crafts use ItemStack who have custom data manipulator.
Actually events are registered like bellow :
    @Listener
    public void onKeyRegistration(GameRegistryEvent.Register<Key<?>> event) {
        this.logger.info("key registration");
        ItemizerKeys.dummy();
        event.register(ItemizerKeys.ITEM_ID);
        event.register(ItemizerKeys.BASE_NAME);
    }
    @Listener
    public void onDataRegistration(GameRegistryEvent.Register<DataRegistration<?, ?>> event) {
        this.logger.info("data registration");
        final DataManager dataManager = Sponge.getDataManager();
        this.idDataRegistration = DataRegistration.builder()
                .name("Itemizer id")
                .id("item.id") // prefix is added for you and you can't add it yourself
                .dataClass(IdDataManipulator.class)
                .immutableClass(IdDataManipulator.Immutable.class)
                .builder(new IdDataManipulator.Builder())
                .build();
        this.basenameDataRegistration = DataRegistration.builder()
                .name("item base name")
                .id("item.basename")
                .dataClass(BaseNameDataManipulator.class)
                .immutableClass(BaseNameDataManipulator.Immutable.class)
                .builder(new BaseNameDataManipulator.Builder())
                .build();
        EventContext eventContext = EventContext.builder().add(EventContextKeys.PLUGIN, getInstance()).build();
        Cause cause = Cause.of(eventContext,getInstance());
        DataRegistrationCompleteEvent completeEvent = new DataRegistrationCompleteEvent(cause);
        Sponge.getEventManager().post(completeEvent);
    }

    @Listener
    public void onCraftRegistration(GameRegistryEvent.Register<CraftingRecipe> event) {
        getLogger().info("register crafting");
        int i = 0;
        for (ICraftRecipes recipeRegister : configurationHandler.getCraftList()) {
            if (!(recipeRegister instanceof Smelting)) {
                recipeRegister.register(event);
                i++;
            }
        }
        getLogger().info("registered {} crafting recipes",i);
    }
    @Listener
    public void onSmeltingRegistration(GameRegistryEvent.Register<SmeltingRecipe> event) {
        getLogger().info("register smelting");
        int i = 0;
        for (ICraftRecipes recipeRegister : configurationHandler.getCraftList()) {
            if (recipeRegister instanceof Smelting) {
                recipeRegister.register(event);
                i++;
            }
        }
        getLogger().info("registered {} smelting recipes",i);
    }

    @Listener
    public void onDataRegistrationComplete(DataRegistrationCompleteEvent event){
        configurationHandler.createItemizerDirectory();
        loadGlobalConfig();
        try {
            int size = configurationHandler.readAffixConfiguration();
                getLogger().info("{} affix loaded from configuration.", size);
        } catch (ObjectMappingException | IOException e) {
            Itemizer.getLogger().warn("Error while reading configuration 'affix'.", e);
        }
        try {
            int size = configurationHandler.readItemsConfiguration();
             getLogger().info("{} items loaded from configuration.", size);
        } catch (ObjectMappingException | IOException e) {
            Itemizer.getLogger().warn("Error while reading configuration 'items'.", e);
        }
        try {
            int size = configurationHandler.readPoolsConfiguration();
                getLogger().info("{} pools loaded from configuration.", size);
        } catch (ObjectMappingException | IOException e) {
            Itemizer.getLogger().warn("Error while reading configuration 'pools'.", e);
        }
        try {
            int size = configurationHandler.readCraftConfiguration();
            getLogger().info("{} crafting recipes loaded from configuration.", size);
            initRowCraft();
        } catch (ObjectMappingException | IOException e) {
            Itemizer.getLogger().warn("Error while reading configuration 'crafts'.", e);
        }
    }

And they are fired in this order :
[16:01:40 INFO] [itemizer]: register crafting
[16:01:40 INFO] [itemizer]: registered 0 crafting recipes
[16:01:40 INFO] [itemizer]: key registration
[16:01:40 INFO] [itemizer]: data registration
[16:01:40 INFO] [itemizer]: 1 affix loaded from configuration.
[16:01:40 INFO] [itemizer]: 4 items loaded from configuration.
[16:01:40 INFO] [itemizer]: 1 pools loaded from configuration.
[16:01:40 INFO] [itemizer]: 5 crafting recipes loaded from configuration.
[16:01:40 INFO] [itemizer]: register smelting
[16:01:40 INFO] [itemizer]: registered 1 smelting recipes

I would like a way to register craft after key and data.
I tried to add order to listener or changer the order in the code but output seems to order them randomly.
I hope it's enough clear, if you need precisions feel free to ask for more details.

Would it not be better to wait til everything is loaded, then query the registry?

I don't query the registry here. I just register keys, DataManipulators, craftingRecipe and smeltingRecipe. I need manipulators in my crafting recipe items. so I want to get them registered before.

Aha, misunderstood

@dualspiral my gut feeling is that it would make sense to require a
@RegistrationDependency({KeyRegistry.class, SpongeManipulatorRegistry.class}) being added to SpongeCraftingRecipeRegistry so that it gets prioritized to register after keys and data have been registered.
In API 8 this sort of thing is somewhat rendered irrelevant since registries use suppliers, which eliminates the chicken and egg situation of which types get registered when.


Refactor into a multi-project hierarchy

This moves the current java-sdk Maven project to a subdirectory and turns this repo into an multi-module Maven aggregator project. I envision the project hierarchy moving towards something like this
sdk-group

rest-client
server-sdk (depends on rest-client)
android-sdk (depends on rest-client)
research-stack-sdk (depends on android-sdk)

All these projects will be released together. This is useful because if we modify rest-client, we will also update/test/release server-sdk, android-sdk, and research-stack-sdk.
The simplest way to change the pom version for the entire set of projects is to use the versions plugin, e.g. mvn versions:set -DnewVersion=0.8-SNAPSHOT

What's the difference between rest-client and server-sdk? There's not much the SDK does right now besides wrap the REST API.

reviewer=alx


Support attributes metadata

Attributes metadata are defined in
http://docs.orioncontextbroker.apiary.io/#introduction/specification/terminology
This information is currently not saved in the DB, so it's lost in the dump/load.

question is, how to track what is metadata and what is not? separate table? prefix in the column name?

As a comment: in _get_time_index(payload): the time_index from metadata should have higher priority than dateModified

we need to understand if metadata typically changes throughout time or not. If not, we may find more efficient ways of treating static data. There's already a metadata table for each entity type, this could be a place to land metadata.

I would assume they may change over time.
Dr. FEDERICO MICHELE FACCA
CTO
0041 78 807 58 38
Martel Innovate  -  Professional support for innovation projects
Click to download our innovators' insights!
Follow Us on Twitter

Il giorno 27 nov 2018, alle ore 15:56, Tomas<EMAIL_ADDRESS>ha scritto:
we need to understand if metadata typically changes throughout time or not. If not, we may find more efficient ways of treating static data. There's already a metadata table for each entity type, this could be a place to land metadata.
—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub, or mute the thread.


web3 is not in the global scope of the console

truffle(development)> web3
ReferenceError: web3 is not defined
    at repl:1:1
    at REPLServer.defaultEval (repl.js:254:27)
    at bound (domain.js:287:14)
    at REPLServer.runBound [as eval] (domain.js:300:12)
    at REPLServer.<anonymous> (repl.js:417:12)
    at emitOne (events.js:90:13)
    at REPLServer.emit (events.js:182:7)
    at REPLServer.Interface._onLine (readline.js:211:10)
    at REPLServer.Interface._line (readline.js:550:8)
    at REPLServer.Interface._ttyWrite (readline.js:827:14)
truffle(development)>

I am aware that #58 addressed a similar issue (but also talked about availability of web3 in tests), but that fix has apparently not resolved the problem.

Fixed on master. Cheers!


[EPIC] Create a GitHub Actions trigger to call wf in another project

What is the expected behavior?
Create an Action who enable project to run their own test inside their own Actions tab and to make their submission directly in their own repo as well.
Tech needs
essentials :

Having a composite action who can be call using (from any project) :

- name: Add into Ecosystem
  uses: qiskit-community/ecosystem-actions
  with:
    project_name: "My super project"
    test_cmd: tox -epy39
    std_test: true
    stb_test: true
    dev_test: true
    submit_to_ecosystem: true
    ...

First part of the composite action should be able to :

Run given test so call standard tests
Run given test with latest qiskit version
Run given test with dev qiskit version
Give readable logs

Another part of this composite action should be able to send info about the project as well as test result to us. Some solutions possible :

Automatically create issue in Ecosystem repo (as today but probably the best way to do it and to keep clean history)
Launch Actions in Ecosystem repo (permission problem for external people)

Deploy the composite action into GitHub marketplace
On the Ecosystem repo we will need to create a new wf for update project info from data getting form external to do that we can use the same solution of the previous question (issue to be the best as well).
Documentations :

Actions step to copy and paste
Full Actions pipeline file to copy and paste

(optional) :

Having a docker image creating the perfect qiskit env to run checks inside and to make the actions faster

Why

Allow people to test their project whenever they want/need
Help people submit their project into Ecosystem
We wont force people to have tox or anything special to run their tests
We wont clone project and host actions processes

This would also allow us to keep the actual behaviour with the new one.
Today I don't know how to make all the actual projects migrate from actual process to this new one.

Thanks for this @mickahell! 🚀
Rather than a composite action, what do you think of a template that developers can copy and paste into their projects, and adjust as needed? It might be more flexible, and less maintenance on our end.

Another part of this composite action should be able to send info about the project as well as test result to us.

For now, I think we should remove this goal, as we're stopping the test results aspect of the project.

Rather than a composite action, what do you think of a template that developers can copy and paste into their projects, and adjust as needed? It might be more flexible, and less maintenance on our end.

Too much text and commande for someone who never use Actions ^^' create our own Action to upload to marketplace is the best. It has to stay as a single process and a single step for them.
And yes in the documentation we will provide full Action to copy and paste.

Another part of this composite action should be able to send info about the project as well as test result to us.

For now, I think we should remove this goal, as we're stopping the test results aspect of the project.

We still need to get back the info about the project to be able to add it to our database, even if we give up the test on our side.

Too much text and commande for someone who never use Actions

We can include comments to explain which bits to modify, for example:
  - name: Run tests
    run: |
      # Replace this with your testing commands
      tox -epy39

It should be similar work (i.e. make a new file in .github/workflows and add the correct commands). But the advantage is if they need to add an extra step beforehand (or after), then we don't need to add support for that in our action; they can just edit the workflow file.

We still need to get back the info about the project to be able to add it to our database, even if we give up the test on our side.

Do we? Or are you thinking they should make their initial submission issue through an action?

Ok i think we misunderstood each other ^^'
What I proposed is not to replace their own test, it's to add a step in // to their Actions to make sure they are running minimal test (with their cmd) and we could put whatever we want inside but it's not gonna replace their own test, lint, coverage ...
If we don't, they can just don't put any test at all and submit whatever they want and we could have a bunch list of unworking project without knowing.
For the 2nd part, what I think is they don't gonna fill any issue by hand, the actions gonna fill it for them. I don't think we can ask them to fill an issue and to create an action, it's too much stuff to do and that could allow us to receive update about their project.

...they can just don't put any test at all and submit whatever they want and we could have a bunch list of unworking project without knowing.

IMO the review process should check the project looks "serious" and part of this could include looking at their CI. Even if we require them to run certain commands, they can always put dummy code in the unit tests to "pass".

For the 2nd part, what I think is they don't gonna fill any issue by hand, the actions gonna fill it for them. I don't think we can ask them to fill an issue and to create an action, it's too much stuff to do and that could allow us to receive update about their project.

Are you suggesting projects should report back their test results to us through GitHub issues? If so: We don't plan to continue tracking test results; it doesn't seem like anyone looks at them, it involves a lot of automation, and we'd have to ask lots of projects to modify their CI, which I don't want to do until we have a very good reason.
(Sorry if I misunderstood)

IMO the review process should check the project looks "serious" and part of this could include looking at their CI. Even if we require them to run certain commands, they can always put dummy code in the unit tests to "pass".

Yes indeed and that's also a problem :/ and we have to establish check in knowing of most of the possibilities.

Are you suggesting projects should report back their test results to us through GitHub issues? If so: We don't plan to continue tracking test results; it doesn't seem like anyone looks at them, it involves a lot of automation, and we'd have to ask lots of projects to modify their CI, which I don't want to do until we have a very good reason.

I was meaning, projects should be submitted through their Actions and those Actions gonna send us every info we need (project name, url, maintainers, ...).

(Sorry if I misunderstood)

No problem at all ;)
With what you told me on slack, I thin we can pause the issue and waiting for the NFC to determine the form we want for the whole process after :)


expose untracked files

while comparing we want the projects to be as similar as possible, that's why we create the files that are missing. To accomplish more of that we need to also point out If any file is not on the originaldirectory, meaning that It can be removed.
There's two approaches to this, we can set a flag to enforce this delete on runtime or without the flag write in some kind of file the path of the untracked files.

This might take more resources than I expected, since It requires a different call to Compare from what the package already does, by passing the parameters inverted.
This way we'd have to check (by passing the info?) If It's inverted and then maybe delete the outdated files/directories or rename to something.old.


Add Ability to Use Output from a Previous Block in a New Command (re-pipe-able blocks)

(from youtube comments)

Also, the history should be reference-able and pipe-able, so I could pipe output of one of those blocks into some new command - this would make these blocks actually useful.

Not sure exactly how to do this and what the implementation could look like (is it just the text from the blocks, or should it include the formatting, or should it replay the entire pty stream with ANSI escapes?).  But the concept is interesting and something we can do.  Being able to reference a previous block and pipe it into a new command feels powerful.

For inspiration, Extra terminal emulator has this feature:
https://extraterm.org/features.html "Reusing Command Output"


Doesn't automatically load the values.

When I close LiveSplit and open it again, I have to manually set each value for to work. I dont have to change anything but I have to just click on each of the layout tile in the layout edit window to "activate it". Also, I can confirm that its possible to select the variables only when state is loaded as mentioned in #5 , I hoped this would be a one time setup so I didn't bother about it seems like its not.
I must also mention that I am using a later version of LiveSplit (1.8.16), maybe it works with the earlier version mentioned here but it would be nice to have support for the latest version nonetheless :)

Update: I just tested 1.6.8, still having the same issue. This is both good and bad because, seems like there is nothing extra to be done for the script to make it work for 1.8.16 (as the behavior is exact same), but I don't get even a temporary solution.

Thanks for the report @GMPranav. I haven't done much with LiveSplit in a long time unfortunately. If you have any suggestions or find a solution, feel free to open a PR.

Thats fair, I am nowhere near knowledgeable about this kind of coding. I found an alternative solution for my need, apparently its possible to display it directly by coding in the ASL nowadays. Thanks for taking your time to respond!


Don't dereference symlinks when copying files

This prevents FileNotFoundError exceptions on broken symlinks.
Symlinks in a repository should be relative anyway, so there is no
advantage to dereferencing them.

Coverage decreased (-0.1%) to 99.753% when pulling 91083f8e4aa55e004921697e37a0f4d5282a0794 on brechtm:copy_symlinks into 52096952a9844d89bdfb392a17546de9002a7a76 on Robpol86:master.

Coverage decreased (-0.1%) to 99.753% when pulling 91083f8e4aa55e004921697e37a0f4d5282a0794 on brechtm:copy_symlinks into 52096952a9844d89bdfb392a17546de9002a7a76 on Robpol86:master.

That keyword arg doesn't exist for .copy() in Python 2.7.

Fixed in 8dbff4efd821ef44ad01dc18f06061e994925b8c. Thanks for reporting this.


feat: csv exports

Added ability to export CSV file of transactions history and for comfortable loading added the ability to configure the number of items for the page(because we can't load all transactions, we can get transactions by query limit count according with API https://api.kaspa.org/).
Same logic for UTXOs, but this page can't configure the number of items for the page, because we can load all UTXOs, according to API https://api.kaspa.org/. In this case, we don't have any restrictions.

Could you dm me on discord or telegram? Thanks :-)

Could you give me your nickname in telegram?

@lamer11010

Could you check your telegram? - I sent a message to you.


test: Update test version to lwtnn v2.13

This PR updates the test version installed to v2.13 to ensure the latest version is being tested.

@dguest this is ready for review.

I guess CMake follows semantic versioning well enough that the old string still worked.
I'm sort of wondering if we should just drop the optional version number on find_package in this test, rather than having to increment this in one more place. If the the installation test is able to find another version something is broken anyway.

I guess CMake follows semantic versioning well enough that the old string still worked.
I'm sort of wondering if we should just drop the optional version number on find_package in this test, rather than having to increment this in one more place. If the the installation test is able to find another version something is broken anyway.

I'm sort of wondering if we should just drop the optional version number on find_package in this test, rather than having to increment this in one more place. If the the installation test is able to find another version something is broken anyway.

@dguest Yeah you make a good point, given the docs

If no [version] and/or component list is given to a recursive invocation inside a find-module, the corresponding arguments are forwarded automatically from the outer call (including the EXACT flag for [version]).

As this is also in the test suite then it should be testing what it can find anyway.
Let me change this to a removal and rebase it.


Multiple Shoutboxes on One Site

I love your plugin, and my very young community is finding it handy as well.  In this case we have 4-5 distinct groups of people who are looking for this exact functionality but would like to have 4-5 shoutboxes in the header of the site with different names for each.
BreakMeta
This is a League of Legends community and they want a shoutbox for each of the major player regions around the world like North America, EU, Korea, etc.
Thanks!

Thanks for your awesome work @Schamper .... Is shoutbox working fine with Nodebb 1.6  update? Can we have support for multiple shoutboxes ,emo support and uploading pics in public chat? Please...

Hey @faizanzahiddeloitte! You can install it on NodeBB 1.6 and report back if it works or not, and if there are any specific error messages you're seeing. As for all those features, feel free to submit a pull request and I'll gladly merge it into the main repo and publish it on npm. I currently don't have the time to work on such large features myself.


[20.09] qutebrowser: 1.13.1 -> 1.14.1

Motivation for this change
Updates qutebrowser to match with unstable. I hope I didn't forget anything?
Pinging @jagajaga @rnhmjoj @ebzzry
Things done

[ ] Tested using sandboxing (nix.useSandbox on NixOS, or option sandbox in nix.conf on non-NixOS linux)
Built on platform(s)

[X] NixOS
[ ] macOS
[ ] other Linux distributions

[ ] Tested via one or more NixOS test(s) if existing and applicable for the change (look inside nixos/tests)
[ ] Tested compilation of all pkgs that depend on this change using nix-shell -p nixpkgs-review --run "nixpkgs-review wip"
[ ] Tested execution of all binary files (usually in ./result/bin/)
[ ] Determined the impact on package closure size (by running nix path-info -S before and after)
[ ] Ensured that relevant documentation is up to date
[ ] Fits CONTRIBUTING.md.

Is there anything important from a security or bugfix perspective? I don't think we generally backport new minor releases of software unless there is a reason besides new features.

I expected qutebrowser to be in sync with unstable the same as it is the case with the other webbrowsers? But actually never knew what is the policy here. Besides that, no reason to upgrade from my side.

Usually the web browsers need to be updated in the stable branch for security reasons. Old versions of firefox or chromium rarely receive security updates and backporting everything would be a huge pain. With qutebrowser the main browser engine is in the qt5.qtwebengine and not in the qutebrowser package itself, which means that - if the qutebrowser version in stable is compatible with the latest qtwebengine version - this old qutebrowser release can still get security updates for the browser engine.
But actually this rarely happens because of the

I see, will close and start using qutebrowser from nixos-unstable then. I would be interested wether other maintainers also would advise against using qutebrowser on stable? Maybe this could be communicated better, e.g. by marking it as insecure?

If there's a good reason to update, I'm not against it. But without a good reason it's much more important to get qt5.qtwebengine 5.12.2. If any one of the maintainers has a different opinion then forget what I said.
If you want the latest features of the software you use, changing your whole system to nixos-unstable is a good idea in general. I use it every day and there are rarely issues related to running nixos-unstable (the naming is actually quite misleading, commits going into the master branch are reviewed as much as commits going into the release branches). You can imagine it a bit like the ArchLinux rolling release model, but thanks to Nix, we have easy rollbacks.

I'm aware what the unstable channel is, I just use the stable release to be able to contribute to it easier.

But actually this rarely happens for qutebrowser specifically, so I would advise against using qutebrowser as an everyday browser on NixOS stable because of the security situation.

I don't really agree with this idea of stable. Especially since qutebrowser is trivial to backport, I don't see what's the point of keeping it outdated and advising against using it. Why not just mark it as broken or something, then?

it's much more important to get qt5.qtwebengine 5.12.2

Yeah, but it shouldn't block qutebrowser from being updated, imho.
Anyway, I received the same criticism when I tried to backport qutebrowser before, but we didn't reach some kind of consensus so I just stopped opening backports PR.

I don't really agree with this idea of stable. Especially since qutebrowser is trivial to backport, I don't see what's the point of keeping it outdated and advising against using it. Why not just mark it as broken or something, then?

I am not advising against using the qutebrowser package because it is outdated, but because qtwebengine is outdated on stable. The best solution in my opinion would be to regularly backport security fixes of qtwebengine to stable and recommend people who want a stable experience to use qutebrowser+qtwebengine from the stable branch, which doesn't receive any new feature updates and thus is less likely to break.


Dumping objects outputs [object Object]

This project relies on chalk, which styles the output of the logs, adding colors. This assumes that all arguments passed to the logger will be strings. If you pass an object, it outputs [object Object] instead of the actual dump of that object.
If chalk fixes the issue on their end, it will be fixed in this project (might require an updated version of chalk, depending on if they do a minor or major version increment). But in the meantime, one solution could be to check the type of the argument, and only call chalk on it if it's a string.

Chalk has decided not to fix it on their end, and I can understand why, since they expect you to manually call chalk, passing the parameter you want to be colored. In that scenario, you would simply not call chalk on an object.
In this project, however, the user is not specifically calling chalk, they're just trying to log something, which may or may not be a string. So I think this is the correct place to fix the issue.


Allow kudos actions on 'view more' reportbacks

Reportback items rendered on the frontend after clicking view more need to have kudos options on them

This requires some API updates for the reportback-items endpoint to include the same kudos info that we're using on the initial gallery before the view more.

Might be easier then expected. I was getting confused since most of the items that are loaded via the view more just don't already have kudos on them...


PopupMenuButton icon splash radius is too large

Use case
No way to modify the splash radius for PopupMenuButton and it is vey large by default.

Proposal
add splash radius property

Hi @MuhammadUmair786, Thanks for filing the issue. This looks like a valid proposal to me.
PopupMenuButton(
    splashRadius: 24, ///expose SplashRadius property
    color: !toggle ? Colors.red : Colors.green,
    key: _menuKey,
    itemBuilder: (_) => <PopupMenuItem<String>>[
        const PopupMenuItem<String>(
        child: Text('Doge'), value: 'Doge'),
        const PopupMenuItem<String>(
         child: Text('Lion'), value: 'Lion'),
         ToggleMenuItem<String>(
            child: Text('ChangeColor'),
            onTap: () => setState(() => toggle = !toggle))
        ],
        onSelected: (String x) {
        setState(() {
        selected = x;
     });
  }),

Hi, @maheshmnj , don't you think splashradius should also be passed as parameter to inkwell?? As  passing gild will not be having property to change splash radius.

@dheerajv09, Yes you are right, I have pushed the update. If you have any further thoughts please feel free to add it in the PR comments.

Closing as duplicate of https://github.com/flutter/flutter/issues/90898 (fixed)


Calendar is not positioned correctly

There are a lot of space above the calendar but buttons don't fit to the page

Which version of the picker r u using?
I tested it, but it looked fine for me.

"ng-pick-datetime": "^6.0.10",

Thanks. I saw the issue.

Updated the picker to latest version.
Now the picker position has been optimised. And owl-date-time also has a new property [scrollStrategy] which accept ScrollStrategy object from angular/cdk.


Still time to apply

Trello card
https://trello.com/c/7NgTbMtM/3315-consider-still-time-to-apply-messaging-and-page
Context
Adding a message to let users know that they still have time to apply for teacher training and to direct them to an appropriate next step depending on which page they're on (and where they're likely at in their journey).
Changes proposed in this pull request
Guidance to review

Hi @EllieNodder would you mind taking a look at the banners I've added so far? They're not formatting properly, but not sure if that's the way they're built or if I've done something wrong. Any ideas?
Also, I'm just working through to see if there are any other pages we might want to add the banner to. If any spring to mind would you let me know please?

Hi @EllieNodder would you mind taking a look at the banners I've added so far? They're not formatting properly, but not sure if that's the way they're built or if I've done something wrong. Any ideas?
Also, I'm just working through to see if there are any other pages we might want to add the banner to. If any spring to mind would you let me know please?

So sometimes we format links exactly how you have done, i.e. [This is a link] (/link-here).
But sometimes that doesn't work and we have to format them differently (I've gone in and changed them now so you should be able to see what this looks like.)
Not entirely sure why or when this happens! (This is why VS Code comes in handy so you can see if the link renders properly straight away).

@GDW7 Always worth looking in the content guidance - there is a section on the inset text component that Ross added with guidance on formatting: https://github.com/DFE-Digital/get-into-teaching-app/blob/master/docs/content.md#inset-text
(The content.md does need a bit of an update with recent site changes though - ticket on the backlog which I will ask Ross to do in the next sprint or two)

@GDW7 also thinking, would it be worth adding this to the relevant blog posts about applying?

Looks good to me - any other pages you can think of @EllieNodder ?
We should make sure we track how many outbound clicks we get on these links (tagged up in GA automatically).

Thanks for reviewing. @EllieNodder adding to blog articles sounds like a good idea. I've done a bit of a search of the blog posts. Think these are the ones that would be most relevant:
https://getintoteaching.education.gov.uk/blog/how-to-apply-for-teacher-training
https://getintoteaching.education.gov.uk/blog/7-things-to-include-in-your-teacher-training-application
https://getintoteaching.education.gov.uk/blog/application-tips-from-a-teacher-training-provider
https://getintoteaching.education.gov.uk/blog/choosing-the-right-teacher-training-course-provider
https://getintoteaching.education.gov.uk/blog/getting-ready-to-apply
Are there any others you're aware of @EllieNodder?

Thanks for reviewing. @EllieNodder adding to blog articles sounds like a good idea. I've done a bit of a search of the blog posts. Think these are the ones that would be most relevant: https://getintoteaching.education.gov.uk/blog/how-to-apply-for-teacher-training https://getintoteaching.education.gov.uk/blog/7-things-to-include-in-your-teacher-training-application https://getintoteaching.education.gov.uk/blog/application-tips-from-a-teacher-training-provider https://getintoteaching.education.gov.uk/blog/choosing-the-right-teacher-training-course-provider https://getintoteaching.education.gov.uk/blog/getting-ready-to-apply
Are there any others you're aware of @EllieNodder?

Those sound good to me!


update events.js

not sure if JS changed, but I think it can be simplified now
should be a safe change

oh nevermind, I see you have to ignore the first argument


Allow unicode-display_width version < 2.0.0

Hmmfr, unfortunately since version 1.0.0 the unicode-display_width gem requires ruby >= 2.0.
Thus I do not think it is possible to use its 1.0.0 version with rubocop as long as rubocop supports ruby < 2.0.
Is dropping support for ruby < 2.0 on rubocop an option?


Reannotate fragments

I've updated the PR to the latest sphinx_doc branch and moved all functions to the .py files.
The tests stay in the nbdevb notebooks.
We can also merge the sphinx_doc branch first and then merge this PR with dev.

I just realised that nbdev_nbs/spectral_library/library_base.ipynb still hase some merge conflicts.. for some reason they did not show up locally in the notebook. Will fix.

Nice PR, merge now


yabai seems to ignore neovide when run from the command line

I ran into a weird issue with yabai.
If I run neovide from the command line, yabai seems to ignore the window. It doesn't snap into place or seem to know it exists.
I confirmed this by running yabai -m query --windows and the window doesn't appear in the list.
But if I run it from spotlight or from the dock - basically anywhere other than the terminal - it gets recognized and works just like any other window.
Is there a workaround to make yabai notice it?

I checked this same problem before, maybe this will help you [link].(https://github.com/neovide/neovide/issues/915#issuecomment-1198819067)

Thanks!
The --nofork flag actually does work. Super weird, but I can live with that workaround for now.


QNN support

Documentation:
https://docs.qualcomm.com/bundle/publicresource/topics/80-63442-50/converters.html
Examples:
mobilenetv2-12_net.json
qnn.serialized.bin.zip

UPDATE: This feature is still missing in Netron.
TL;DR: We want to visualize the QNN model (serialized.bin file) and not the QNN metadata (.json file). Is it possible to add support to visualize the serialized.bin file? Currently, I get the error "File contains undocumented QNN serialized context." when I try to open the file in Netron.
Reference:
There are 4 files generated when converting a model from TFLite to QNN. Let us take the Resnet model as an example. You can refer to the files here (TFLite and QNN models):
TFLite:

resnet.tflite: Can be visualized on Netron

QNN files:

resnet.serialized.bin (actual model): Cannot run on Netron
resnet.json: (not the model, just a JSON with a general model structure, fewer ops, etc): Can be visualized on Netron
resnet.cpp: (not relevant)
resnet.bin: (not relevant)

@MeghnaNatraj can you provide the documentation for content  the .serialized.bin format and send a pull request adding support.

@lutzroeder I've asked Qualcomm for details on the .serialized.bin format and will post an update here when I hear back.


Unable to compile @Ubuntu 16.04.3 LTS -> make: *** [obj/rpcrawtransaction.o] Error 1

typename boost::add_reference::type = const CScriptID&]' rpcrawtransaction.cpp:243:77: required from here
/usr/include/boost/variant/get.hpp:178:5: error: invalid application of 'sizeof' to incomplete type 'boost::STATIC_ASSER                                               TION_FAILURE'
BOOST_STATIC_ASSERT_MSG(
^
makefile.unix:187: recipe for target 'obj/rpcrawtransaction.o' failed
make: *** [obj/rpcrawtransaction.o] Error 1
@FIXED: https://github.com/bunnycoin/bunnycoin/commit/c877e21866299c302d993551f925ed467945e156

#5


bug: Error in WalletconnectConnector in 0.12.12

Is there an existing issue for this?

[X] I have searched the existing issues

Package Version
0.12.12
Current Behavior
In a Next.js app with WalletConnectConnector, I'm seeing:
TypeError: class heritage _walletconnect_types__WEBPACK_IMPORTED_MODULE_4__.IVerify is not an object or null

This does not occur with 0.12.11
Expected Behavior
No error
Steps To Reproduce
Install wagmi 0.12.12 on a Next.js app (haven't tried with other frameworks)
Link to Minimal Reproducible Example (StackBlitz, CodeSandbox, GitHub repo etc.)
No response
Anything else?
No response

I cannot seem to reproduce this. Can you please link us to a minimal reproducible example (can use https://new.wagmi.sh). Will re-open when one is provided.

This issue also reproduce in version: 1.3.9.

In console
Attempted import error: 'IVerify' is not exported from '@walletconnect/types' (imported as 'Zt').

In browser console,
9578.fda3393d854767ca.js:1 Uncaught (in promise) TypeError: Class extends value undefined is not a constructor or null
    at 49578 (9578.fda3393d854767ca.js:1:94449)
    at Function.s (webpack-e889ff643096189c.js:1:167)
    at async k.u (1236.b867ac4e24d92a7e.js:36:33433)
49578 @ 9578.fda3393d854767ca.js:1
s @ webpack-e889ff643096189c.js:1

I cannot reproduce in another env. but, I cannot track the error. no clue for this issue... @jxom


Added a validation against minimum  group size validation.

PT-798 Added the missing validation against minimum  group size validation. If the total count in under minimum required, same validation message will appear under both the study group count fields.
Issue: https://helsinkisolutionoffice.atlassian.net/browse/PT-798
Other validation cases here (in a linked task): https://helsinkisolutionoffice.atlassian.net/browse/PT-772?focusedCommentId=19250

Test shots from PR-server:

Must admit that this logic is hard to grasp but code can't always be simple. Fortunately we have good tests and this seems to work :D

I agree! :) All this could be changed to a simpler solution where there would only be same validation messages for both the fields about not met min or max group size. However, I think that it would not be as informative for the user. But that's my suggestion for the next iteration of this validation saga :D

Hopefully this validation is enough for now :D


When I use the domain name to access, I need to change the nodeport port and targerport on the ingress-gateway to be the same. Why? There is another problem. After modifying the nodeport, it can be accessed using the original nodeport. Is this a bug?

Describe the feature request
Describe alternatives you've considered
Additional context

Can you please fill out the issue template with how you installed, what commands you ran that failed, and what you changed that ddin't work as expected?

My installation method in k8s is "istioctl manifest apply --set profile = demo". When I modify the nodeport in the ingressgateway of svc, I find that the original nodeport can also be accessed. You can also access it after trying it with other computers to eliminate session problems

Can you please fill out the issue template with how you installed, what commands you ran that failed, and what you changed that ddin't work as expected?

My installation method in k8s is "istioctl manifest apply --set profile = demo". When I modify the nodeport in the ingressgateway of svc, I find that the original nodeport can also be accessed. You can also access it after trying it with other computers to eliminate session problems

I have same issue，https://github.com/istio/istio/issues/6319，istio‘s ingress does’t support that way,

I have same issue，https://github.com/istio/istio/issues/6319，istio‘s ingress does’t support that way,

thanks..  I take  a look

Can you add the config dump of the ingress and the request that failed? I suspect this is due to https://github.com/istio/istio/issues/25350
https://github.com/istio/istio/wiki/Troubleshooting-Istio for info on getting config dump

We don't have enough information to debug this. Please attach more info and reopen if this needs further investigation. Thanks!


Bump Dart SDK to 1.16.0-dev.3.0.

The new dev build gets us some new analyses, lint bug fixes, and perf improvement opportunities (in particular via dartanalyzers support for directory analysis). As of https://github.com/flutter/flutter/commit/798dfa2bc92f54e569928b3c8dee0354e32c44aa, flutter repo should analyze clean with these new bits.
Adding a bunch of folks to eyeball this in case someone has a compelling reason not to roll forward.
@devoncarew @Hixie @eseidel @abarth
Thanks!

LGTM