Training results and issues

@sayakpaul  @MorganR
Please find training logs in the shared editor.
https://codeshare.io/xvvmrN
For now, we are using only geometric augmentations.
Trained ImageNette on AdamW and SGDW. Key insights:

Using SGDW, the maximum val accuracy was around 43%. The model overfits the training data (87% training accuracy on the same epoch).
Using AdamW , the val accuracy was more random. Or perhaps the training data was already overfitted very early on.

Further trials:

Both optimizers using all augmentations on ImageNette.
Changing the learning rate to a lower value for Adam. (The repo doesn't do this, but we can try)
Any other things that I should try?

There was some minor issue with serializing the history object. I have resolved it and I'll share a graph instead of these lengthy logs from next time.

Since we are only operating on a small chunk of the dataset, this result is somewhat expected. If we are able to completely overfit this small training set I'd think there are no obvious implementation bugs in the dataset.

@sayakpaul
Sorry for the delay, here are the plots for today's AdamW run on ImageNette.
Important points:

Max val accuracy was 0.6 in the entire run. Train accuracy was 0.98 at its peak
Top 5 val accuracy was >0.9 for most part of training.

accuracy
loss
LR
/cc @MorganR

Given the data we have, I think this is somewhat expected. What training configuration was used for this one?
Also, it's generally a good idea to scale your learning rate as you are operating in a distributed manner. Typically, we multiply the number of workers with the LRs. This is because when we distribute the copies of the model and optimizer across workers they receive the intended base LR.
To give an example, let's say your base LR is 0.01 and if you're using a TPU v3-8 hardware then the LR should ideally be 0.01 * 8. See this notebook for a more involved example.

What training configuration was used for this one?

200MF.  I'll try with 400MF and 600MF today.
Got it. I'll make relevant changes to the LR config.

But as a disclaimer, we should not base our configurations based on these training runs. I guess the purpose of these runs was to verify if the implementation was correct enough. I guess the purpose is solved.

I think until we get access to TPUs, we can only do these small experiments to make sure that everything's okay. Other than that, we can finalize our code.
If it works both on Kaggle and Colab, then we can be sure it will work on Cloud TPUs, right? Just need pass the TPU address to the cluster resolver.

Yeah, correct. Once your machine is attached to a TPU that can be automatically detected by TPU Resolver. So, that's another plus.
Also, just to clarify, by "configurations" I meant hyperparameter settings.

Also, just to clarify, by "configurations" I meant hyperparameter settings.

Oh, sorry I thought model config. Here are the hyperparameters I used yesterday. As you said earlier, I'm using the same values as in the paper or pycls.
optimizer="adamw",
base_lr=0.001,
warmup_epochs=5,
warmup_factor=0.1,
total_epochs=100,
weight_decay=5e-4,
momentum=0.9,
lr_schedule="half_cos",

Today I'm using:
optimizer="sgd",
base_lr=0.1 * strategy.num_replicas_in_sync,
warmup_epochs=5,
warmup_factor=0.1,
total_epochs=100,
weight_decay=5e-4,
momentum=0.9,
lr_schedule="half_cos",

I'd also keep this notebook handy since it shows how effective can Data Augmentation be as a regularization method. Comes from this paper. Even though the results and experiments in that paper are presented w.r.t to Vision Transformers but my intuition says that they should generally be a good recipe for enhancing performance.

What training configuration was used for this one? I'd also try to increase the model capacity now to check if it's having intended outcomes (higher accuracy).

From the runs today, I can confirm this. 200MF had 40% val accuracy, whereas 400MF has 65 - 68% (has a lot of noise). One of the 400MF runs even had 21% error.
Now trying with 600MF.

whereas 400MF has 65 - 68% (has a lot of noise). One of the 400MF runs even had 21% error.

Could you elaborate this a bit more? It seems to have produced a straight 20% increase in the scores (which is good?). Also, since we now have increased the parameters, the hyperparameter configuration may need to be slightly modified as well.
Also, did you run it for a couple of times to confirm the noisy behavior?

Could you elaborate this a bit more? It seems to have produced a straight 20% increase in the scores

Frankly, I'm confused, too. Because I'm training 600MF now, resulting in about the same scores as 400MF.
Let me explain my observations: (accuracy means validation set accuracy)

I did multiple runs yesterday, with 200MF only. All of them had around 40% accuracy, give or take.
Today, 400MF with SGDW gave 58-60% accuracy.
Adam topped it even more to 65-66%, and on the run I've attached below it reached 78% accuracy or 21% error(!).

The last run was mostly a fluke, I think. But the results are inconsistent with the general principles.
I will do the following: train all 4 models on ImageNette, each with two configs as in the above comment. And we'll then take those results as reference for discussion.

Also, did you run it for a couple of times to confirm the noisy behavior?

Yes I ran it twice. Attached are the plots of the best run. (this is about 400MF)
logs_history_07_18_2021_07h10m_loss
logs_history_07_18_2021_07h10m_accuracy
I think it would probably best to maintain a shared Google Sheet to record these, to avoid confusion henceforth.

With just the model and no fancy augmentation and regularization, I'd take these scores to be good enough as baselines.

I think it would probably best to maintain a shared Google Sheet to record these, to avoid confusion henceforth.

Or you can use Weights and Biases to generate such stuff automatically. This will reduce your cognitive load substantially and will help you to focus on what's truly important.
For reference, I'd also train a ResNet50V2 or MobileNetV3 on this dataset and see how much performance gap is there.

Or you can use Weights and Biases to generate such stuff automatically.

Okay.
I'll train a ResNet50V2 and let you know the results.

Here's the W&B project. I've made it public so you can see all the runs.

But these make very little sense. I mean, after all ImageNette is a complete dataset, right? I'm not saying that we should find a reason for this, but that makes it difficult to do any improvement.

Did not get your point.

Nothing, just expected more consistent results, since ImageNette is an easy-to-classify subset of ImageNet. Still, the
Yes, it is definitely a good improvement. Just one thing, the 400MF regnety has worse performance than 200MF. Maybe because the ImageNette curve is way more sparse than ImageNet and it may not be completely interpolatable. But that's just a guess

Here, you can find the recipes folks have tried to achieve SoTA on ImageNette and compare them to what we are doing to get a more compact idea.

Yes, it is definitely a good improvement. Just one thing, the 400MF regnety has worse performance than 200MF. Maybe because the ImageNette curve is way more sparse than ImageNet and it may not be completely interpolatable. But that's just a guess

IMO, this is a classic example of parameter efficiency and the number of examples we have as the training set. Sometimes, having a larger dataset itself can act as a regularizer. Works like Big Transfer are evidence of that.

@sayakpaul @MorganR
What do we want to do with steps_per_epoch? We're currently dropping the remainder (ref). They've done the same in pycls.

We can do the same too I guess that will save some time in the overall training runs.

As of now, we're randomly sampling one batch for validation (shuffled dataset, take one batch). Do we want to keep this as it is or  do we want to initially set aside out a single TFRecord (which has exactly one batch of data) before training? So that all models are evaluated on a particular predefined set of images. This is not clear in the ViT paper.
Just wanted to ask this so if needed we can rollback to an earlier version of  imagenet.py.

I think it's fine to set that aside beforehand so that the results are more deterministic.

As of now, we're randomly sampling one batch for validation (shuffled dataset, take one batch). Do we want to keep this as it is or do we want to initially set aside out a single TFRecord (which has exactly one batch of data) before training? So that all models are evaluated on a particular predefined set of images. This is not clear in the ViT paper.

I'm a bit confused by this. Is there not an existing validation split on the dataset? We should never been training on the set of images we use for validation; this should be consistent.

For validation, we are separating out 1% (will be maintained throughout) of the actual training data instead of the validation set. This is followed in all the recent literature. Here's one such example.

@sayakpaul @MorganR
I was able to run a Jupyter notebook on a TPUv3-8 instance. Here are some important observations:

The time required for one epoch (~9000 images, training+ validation) is around 20 sec. This is the same as Kaggle or Colab. This indicates that the input pipeline is the bottleneck and removing the heavy geometric augmentations (like rotate and flip) reduces this to 9 seconds.
I started a run with the actual ImageNet dataset. After exactly 222 batches in the first epoch, I would get this error message:
(I'm not sure, but possible causes may include OOM on TPU host or Tensorboard/ WandB writer error.)

# Long error trace..
tensorflow.python.framework.errors_impl.InternalError: Could not append to the internal temporary file.
Flushing first event.
	Could not initialize events writer.

# I tried converting the images to float16, but the error still occurs at the same spot. I also tried to exclude the
# TensorBoard callback, but the error still persists.

Assuming we require the same time for final training, each run will take around 70 hours (~3 days). In that case, should I spin up multiple TPU nodes (I am allowed 5 v3 nodes) so that we can concurrently train multiple models? It is clear that the actual training time of the TPU is very low compared to our preprocessing time and thus all variants will take the same time.

Assuming we require the same time for final training, each run will take around 70 hours (~3 days). In that case, should I spin up multiple TPU nodes (I am allowed 5 v3 nodes) so that we can concurrently train multiple models? It is clear that the actual training time of the TPU is very low compared to our preprocessing time and thus all variants will take the same time.

I am not sure if it'd be beneficial doing this. However, if you had something specific in your mind do let us know.
About the error, what happens when we discard anything related to serialization i.e. W&B, TensorBoard, ModelCheckpoint, etc.?

I tried converting the images to float16, but the error still occurs at the same spot.

TPUs already make use of bfloat16 internally. This is why I wouldn't recommend modifying the default precision we are operating with.
I must say it's hard to decouple what's causing this issue given we have identical settings for ImageNette and ImageNet. Could this be the input pipeline? Also, I'd play around with the steps_per_epoch trick we discussed a couple of days back to see if that improves the per epoch timing.

I am not sure if it'd be beneficial doing this. However, if you had something specific in your mind do let us know.

Essentially, I wanted to run multiple models at the same time (on different nodes) after we resolve the errors.

Could this be the input pipeline?

From what I could understand from the docs, the preprocessing occurs on their "Cloud TPU Servers", which means that we have no control over which machines to be used for preprocessing. So that part is fixed, and we can just work to optimize the code.

Also, I'd play around with the steps_per_epoch ... to see if that improves the per epoch timing.

I'll try that.

This is the full error trace. The error persists even when I remove WandB callback
Epoch 1/100
    223/Unknown - 310s 1s/step - loss: 7.0427 - accuracy: 0.0019 - top-5-accuracy: 0.0088 - top1error: 0.9981Traceback (most recent call last):
  File "./regnety/regnety/train.py", line 97, in <module>
    callbacks=callbacks
  File "/opt/conda/lib/python3.7/site-packages/tensorflow/python/keras/engine/training.py", line 1185, in fit
    context.async_wait()
  File "/opt/conda/lib/python3.7/site-packages/tensorflow/python/eager/context.py", line 2409, in async_wait
    context().sync_executors()
  File "/opt/conda/lib/python3.7/site-packages/tensorflow/python/eager/context.py", line 644, in sync_executors
    pywrap_tfe.TFE_ContextSyncExecutors(self._context_handle)
tensorflow.python.framework.errors_impl.InternalError: 9 root error(s) found.
  (0) Internal: {{function_node __inference_train_function_54153}} Could not append to the internal temporary file.
	 [[{{node MultiDeviceIteratorGetNextFromShard}}]]
	 [[RemoteCall]]
	 [[IteratorGetNext_6]]
	 [[cluster_train_function/_execute_2_0/_59]]
  (1) Cancelled: {{function_node __inference_train_function_54153}} Function was cancelled before it was started
  (2) Internal: {{function_node __inference_train_function_54153}} Could not append to the internal temporary file.
	 [[{{node MultiDeviceIteratorGetNextFromShard}}]]
	 [[RemoteCall]]
	 [[IteratorGetNext_6]]
  (3) Cancelled: {{function_node __inference_train_function_54153}} Function was cancelled before it was started
  (4) Cancelled: {{function_node __inference_train_function_54153}} Function was cancelled before it was started
  (5) Cancelled: {{function_node __inference_train_function_54153}} Function was cancelled before it was started
  (6) Cancelled: {{function_node __inference_train_function_54153}} Function was cancelled before it was started
  (7) Cancelled: {{function_node __inference_train_function_54153}} Function was cancelled before it was started
  (8) Cancelled: {{function_node __inference_train_function_54153}} Function was cancelled before it was started
0 successful operations.
0 derived errors ignored.

I found a related issue here: https://github.com/tensorflow/tensorflow/issues/37132.
Following my previous comment:

About the error, what happens when we discard anything related to serialization i.e. W&B, TensorBoard, ModelCheckpoint, etc.?

I did mention ModelCheckpoint. So, I suspect this issue is likely stemming from that.

I did mention ModelCheckpoint. So, I suspect this issue is likely stemming from that.

Right now, there is no callback other than LR schedule. We are not serializing anything for the moment.

If this exact setup does not fail with ImageNette then I'm immediately not sure what could be the possible reason causing this issue honestly.

Running out of host memory can be a potential cause. Not sure how can we avoid that. Will let you know if I find something concrete.

Then we could decrease the batch size in a way such that it still remains a multiple of 8.

I don't think that'll resolve the error. This is my take on what's happening:

Training starts, the runtime begins to read from GCS and parse subsequently.
We have a ds.cache(...) call right after reading the TFRecords. This should ideally cache to a GCS bucket.
But instead of that, the cache is first being written to the TPU host memory, and only after the epoch is over, the cache is moved to GCS for later access. (source).
Thus, the cache is too big for the memory, since one epoch essentially means the whole dataset.

What happens when we remove caching?

Didn't try that yet. Will do in a moment and let you know.

I bumped up the instance to n2-standard-32 and removed caching. The whole thing works as expected. Turns out I was completely wrong about this:

which means that we have no control over which machines to be used for preprocessing.

Here's the output of the first epoch (couldn't copy paste the text for some reason). The validation accuracy is more than the training one in the screenshot, I'll just check whether we're not evaluating on the training data.

Here's the output of the first epoch (couldn't copy paste the text for some reason). The validation accuracy is more than the training one in the screenshot, I'll just check whether we're not evaluating on the training data.

In case you didn't know about this phenomenon.

@sayakpaul @MorganR
I ran the model for a bit on the TPUs, here are the observations:

We'll use SavedModel for intermediate checkpoints, and h5 format for saving the final model. There will also be a copy of the same in SavedModel format due to the two callbacks. For some reason, we are not able to store checkpoints in h5 format.
The time required for one epoch (with all augmentations) is around 25 - 30 minutes. This means that the training will take 45 - 50 hours for one full run.
The time required for one epoch (with only random crop) is around 6 - 7 minutes. The training in this case will take 10 - 12 hours for one full run.

That brings me to this:

should I spin up multiple TPU nodes (I am allowed 5 v3 nodes)

I want to spin up 2 nodes, so that we can start training, say, 200MF on one node and 400MF on the other. I think using v2-8 will also suffice, as the TPU usage never crosses 3%.
Also, I intend to train two variants of each model. One with all augmentations which we decided, and one with only random crop, because this is the setup they used in the paper.
Fortunately, we still have time to try out things like this and fix anything if needed.
Please share your thoughts on the same.

The plans looks good to me.

@sayakpaul  @MorganR
The first run of 200MF without augmentations is over. You can see the run stats here.
Final stats (all values at best preforming epoch):

Training accuracy: 0.7446
Validation accuracy: 0.691
Test accuracy:

0.65482 (at the epoch having least loss 91)
0.652608 (at the epoch having most validation accuracy 90)

There was something weird (for me) in the accuracy logs:

All metrics took a sharp dip after epoch 93.
Future steps:

Investigate what's happening in the above image
Add mixup.
Increase weight decay to 5e-4
(If all of the above things don't work) Using the stock training setup in the paper. (SGDW)

Please share your thoughts on the same.

Thanks for sharing the results!
Investigating why there's a sharp dip after Epoch 93 is a good idea to me.
A couple of questions:

What is test accuracy (validation split) when we use the model from 100th epoch?
The run name is Final_07_25_2021_11h58m_200MF. Why does it say 11 hours? Or is it a bug?

Thoughts:

The model capacity is already pretty low, so increasing weight decay regularization won't be that beneficial IMO.
Definitely try mixUp with alpha set to 0.2. When using it don't add label smoothing.

What is test accuracy (validation split) when we use the model from 100th epoch?

It's  0.63686.

The run name is Final_07_25_2021_11h58m_200MF. Why does it say 11 hours? Or is it a bug?

The run name is as expected. 11h58m denotes the GMT time at which the run started, and not the duration.
I'll add mixup.

All metrics took a sharp dip after epoch 93.

Are there any potential reasons as to why this is occurring?

Are there any potential reasons as to why this is occurring?

Like most of the things in ML, there's no free lunch to this too. My guess is that the data regime is going beyond the model capacity which is why it starts to underperform.

The run with mixup takes 10 minutes per epoch (even with batched augs). That means it'll take around 16 hours to train completely. That's slower than the no-augs crop-only run of 5 hours, but let's see if it gives some good accuracy boosts.
The reason for this is we need 3 extra cast ops (which I think are very expensive).
Also, a potential reason for the sudden drop may be a high momentum value. If this behavior is also seen in the ongoing runs, then I will reduce the momentum to 0.85 or 0.8.  If needed, I will explore changing beta1 and beta2 values of AdamW as a last resort.

I see. So, the augmentations used for the results you just reported consist of geometric augs, right?
Could you also provide a snippet of the mixup code? I'd like to take a look.

I see. So, the augmentations used for the results you just reported consist of geometric augs, right?

The ones I reported last night? No, they had no augs except random crop. Not even rotate or flip.

Could you also provide a snippet of the mixup code? I'd like to take a look.

Sure, here's the code: (this is the code without any other augmentation, and is exactly what I'm executing right now)
def _mixup(self, entry1: Tuple,
                    entry2: Tuple) -> Tuple:
        """
        Function to apply mixup augmentation. To be applied after
        one hot encoding and before batching.

        Args:
            entry1: Entry from first dataset. Should be one hot encoded.
            entry2: Entry from second dataset. Should be one hot encoded.

        Returns:
            Tuple with same structure as of the entries.
        """
        image1,label1 = entry1
        image2,label2 = entry2

        image1 = tf.cast(image1, tf.float32)
        image2 = tf.cast(image2, tf.float32)

        alpha = [0.2]
        dist = tfd.Beta(alpha, alpha)
        l = dist.sample(1)[0][0]

        img = l * image1 + (1 - l) * image2
        lab = l * label1 + (1 - l) * label2

        return img, lab

def make_dataset(self) -> Type[tf.data.Dataset]:
        """
        Function to apply all preprocessing and augmentations on dataset using
        tf.data.dataset.map().

        If `augment_fn` argument is not set to the string "default", it should be set to
        a callable object. That callable must take exactly two arguments: `image` and `target`
        and must return two values corresponding to the same.

        Args: None.

        Returns:
            tf.data.Dataset instance having the final format as follows:
            (image, target)
        """
        ds = self._read_tfrecs()

        ds = ds.map(
                self._one_hot_encode_example,
                num_parallel_calls=AUTO
            )

        if self.default_augment:

            ds =  ds.map(
                self.random_crop,
                num_parallel_calls=AUTO
            )
            if self.mixup:
                ds1 = ds.shuffle(10)

                ds2 = ds.shuffle(1)

                ds = tf.data.Dataset.zip((ds1, ds2))

                ds = ds.map(
                    self._mixup,
                    num_parallel_calls=AUTO
                )

        elif self.val_augment:
            ds = ds.map(
                self.center_crop,
                num_parallel_calls=AUTO
            )

        else:
            ds = ds.map(
                self.augment_fn,
                num_parallel_calls=AUTO
            )

        return ds

Let's use a simpler batched implementation.

The ones I reported last night? No, they had no augs except random crop. Not even rotate or flip.

Oh, then we have many options to try and test.

@sayakpaul
We are in 22nd epoch of training for the mixup model. If you see the charts, you'll see that mixup is performing a tad bit worse on validation accuracy. In fact, if we compare all the three runs, we'll see that the most augmented one is performing relatively poorly, whereas the least augmented one performed the best of the three.
Based on this trend, I'd like to do a run where we apply no augmentations. Just resize to 224 and train.
A stronger argument is that we cannot expect the model to learn abstract patterns out of difficult, augmented images if the model simply doesn't have the capacity to retain that knowledge. It is known that this is a very lightweight model, so perhaps it may be able to only retain so much information before "breaking down". This may also be the reason why the all metrics went haywire in the last 6-7 epochs yesterday.
Of course, this argument stays valid for the 200 or at most the 400 MF models.
I may be completely wrong about this one. Please share your thoughts on this.
/cc @MorganR

Check the plots of this work. It's kind of a bit erroneous to comment on the effectiveness of the approaches early on when we are using regularization.
However, your arguments are good and to the point. You are welcome to run that thought experiment but I'd also let the mixUp experiment run till completion.

@sayakpaul
The mixup run ended early today. The test accuracy is 0.6498 on the best val accuracy epoch.
Also, to track all the runs and the things we're trying, I've made a Google Sheet. You can find it here.
Here's the runs I've started today:

Random crop + random horizontal flip.
Randcrop + weight decay 5e-4. I know that you said it won't be beneficial, but I just wanted to try it as it's the setting from the paper.

Apart from this, should I start training the bigger ones? In case we get intended results on those, we can come back to this one later.

Apart from this, should I start training the bigger ones?

Sure!

Nope. The one with no augmentations was performing very poorly, so I stopped it. Others with any kind of augmentation or regularization are executed for 100 epochs.

I expect you're mostly being limited by the model size. How did the model
of this size perform in the paper? How far off are you?
As for the augmentations, let's try a larger model with your different
setups. This model seems quite limited, so it's hard to tell how it's
doing.
Glad you resolved the caching issue.
On Tue, 27 Jul 2021, 08:40 Aditya Kane, @.***> wrote:

Nope. The one with no augmentations was performing very poorly, so I
stopped it. Others with any kind of augmentation or regularization are
executed for 100 epochs.
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub
https://github.com/AdityaKane2001/regnety/issues/10#issuecomment-887253191,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/ABZIOLGKMC74SWJP3AHOUULTZZIEDANCNFSM5AQZACPQ
.

I expect you're mostly being limited by the model size. How did the model of this size perform in the paper? How far off are you?

Yes, we're falling short on the 200MF model. The paper has 70.3% accuracy, and we're at 65.48%. So that's a 4.8% difference.

As for the augmentations, let's try a larger model with your different setups.

Sure.

@sayakpaul @MorganR
Did a couple of things:

I was going through the code again and saw that there was an extra relu. So made that change and ran the model.
Here's the earlier YBlock:

x = self.conv1x1_1(inputs)
x = self.bn1x1_1(x)
x = self.relu1x1_1(x)

x = self.conv3x3(x)
x = self.bn3x3(x)
x = self.relu3x3(x)

x = self.se(x)

x = self.conv1x1_2(x)
x = self.bn1x1_2(x)
x = self.relu1x1_2(x) ### not here

if self.skip_conv is not None:
    skip_tensor = self.skip_conv(inputs)
    skip_tensor = self.bn_skip(skip_tensor)
    skip_tensor = self.relu_skip(skip_tensor) ### not here

else:
    skip_tensor = inputs

x = x + skip_tensor

return x

but it should be
x = self.conv1x1_1(inputs)
x = self.bn1x1_1(x)
x = self.relu1x1_1(x)

x = self.conv3x3(x)
x = self.bn3x3(x)
x = self.relu3x3(x)

x = self.se(x)

x = self.conv1x1_2(x)
x = self.bn1x1_2(x)

if self.skip_conv is not None:
    skip_tensor = self.skip_conv(inputs)
    skip_tensor = self.bn_skip(skip_tensor)

else:
    skip_tensor = inputs

x = self.relu(x + skip_tensor)  ### only here

return x

I was going through the papers and found that they didn't use the 1% minival split. pycls follows the same. So, just trained on the whole training set and validated in the validation set. Both of these changes resulted in 1% gain. The best val accuracy is now
66.42%.

@sayakpaul @MorganR
Current best model gives 67.22% val set accuracy. We want to train this model for 200 epochs, which will hopefully bump up the accuracy.
How exactly should I restart the training?
Currently what I'm doing is I take the best epoch (say 90) and resume training from there, assuming the model was running for 200 epochs. Here's the code that I'm using:
#regnety/regnety/train.py

#Everything takes total epochs value from train_cfg. Thus, changing it first.
train_cfg = get_train_config(
    ...
    total_epochs=200,
    ...
)

with strategy.scope():
    model = tutil.make_model(flops, train_cfg)
    model.load_weights("gs://.../all_model_epoch_90_val_loss_1.36")

callbacks = tutil.get_callbacks(train_cfg)

count = 90 * 1250
callbacks[0].count = count #callbacks[0] means LR scheduler callback. Thus the LR scheduler knows that the model was supposed to run for 200 epochs.

I'm not sure if this is the right approach. Could you please correct me?

I would just load the model checkpoint from the 100th epoch, compile it, and start training from there. I am not very sure you set up the configurations given the codebase is a bit large to immediately comment on. But the following idea should hold:

I would just load the model checkpoint from the 100th epoch, compile it, and start training from there.

What should the LR schedule it look like in that case? Same as normal (magenta in the above image)?
I thought that'd be a bad idea since the accuracy is dropping suddenly at around 94-95th epoch. And then restarting the model will essentially mean that were getting out of the minima and again going back in it.

We need to start with the LR at 100the epoch and apply Cosine decay on it.
As a sanity check, I'd run the original schedule (warmup + cosine) for 100 epochs and record the values after 100 epochs.
Then I'd run the schedule I mentioned at the very beginning of this comment. The values from these two settings.   should match.

You could also run a single training run for 200 epochs, right? Or am I missing something?

@MorganR
Sure, will do it after the ongoing ones are over.

@MorganR

You could also run a single training run for 200 epochs, right? Or am I missing something?

This didn't perform as good as the AdamW one. (66.74% vs 67.22%)
400MF with best settings had 70.03% val acc.
From the 400MF results, it is clear that it's not only the 200MF that's underperforming. So I'll keep experimenting with 200MF, and parallelly train larger models using the best config that we've found, which is
AdamW: 0.001 base LR
5e-5 WD
Half cos LR schedule with warmup
0.9 momentum
Inception style crop + light color jitter
PCA jitter
Random horizontal flip
/cc @sayakpaul

Did the authors also use two types of jittering?

Is the base LR the same as the original one? Also, are we multiplying the base LR with the number of replicas?

What happens when using a higher decay i.e. 1e-5?

Just to verify, your LR schedule roughly looks like the following right? What is the number of steps we are warming up for?

To further solidify the grounds for apples-to-apples comparison, I would now compare the library default values and see if there's something off in our implementation in those regards.

No, they used only PCA jitter. But using light jitter gives better accuracy.

No, since we're using AdamW. 0.1 is used in paper with SGDW and we're using 0.001 with AdamW. Yes, we are multiplying with num_replicas.

Not tried with 1e-5, but 5e-4 had inferior results. But I will try this with the new setup.

Yes, it is similar. Here's ours. We're using 5 warmup epochs.

Yes, doing that.

Here's another suggestion. Since the warmup step setting is based on SGDW originally (I am assuming), I think this should also change with AdamW. I would warm it up for 10 more epochs.

we're using 0.001 with AdamW.

My hunch says it's probably a bit too low. I would also try with a bit larger one - 0.003. Or did you try with larger rates already?

Nope, didn't try.

@sayakpaul
Regarding library defaults issues:

We have discussed this once before, but it may be a potential problem. PyTorch has weight decay option in its Adam optimizer implementation. Thus we used AdamW. But the paper(s) uses weight decay and L2 regularization interchangably and rather loosely. So do we want to try with kernel_regularization='l2' in all of our conv blocks? In that case we'll use plain Adam.
The repo uses custom initialization functions, as opposed to the default 'glorot_uniform' in TF. Do we want to give that a shot?

As suggested by you, I think it'd be worthwhile to spend some time on finding these flaws, as IMO, we have a good idea which set of augmentations work the best.
/cc @MorganR

We have discussed this once before, but it may be a potential problem. PyTorch has weight decay option in its Adam optimizer implementation. Thus we used AdamW. But the paper(s) uses weight decay and L2 regularization interchangably and rather loosely. So do we want to try with kernel_regularization='l2' in all of our conv blocks? In that case we'll use plain Adam.

The use of weight decay inside Adam (in PyTorch) is different from how weight decay is treated in AdamW and SGDW. AdamW achieves better results by decoupling the weight decay from gradient updates. This is not the same as using L2 regularization using the plain variants of optimizers like SGD and Adam. You can know more about this in Decoupled Weight Decay Regularization. Based on all the evidence I have I think we may be better off with AdamW. But if you want to conduct the thought experiment i.e. introducing kernel_initializer for decay while keeping the optimizer to plain Adam, I am fine with that.

pycls uses custom initialization functions, as opposed to the default 'glorot_uniform' in TF. Do we want to give that a shot?

Yes, please.

As suggested by you, I think it'd be worthwhile to spend some time on finding these flaws, as IMO, we have a good idea which set of augmentations work the best.

Agreed.

Yup, the bias thing is taken care of.

Also, what about other layers like Batch Norm and Group Norm, especially their learnable params?

pycls doesn't use GroupNorm anywhere. BatchNorm initialization is the same, gamma=1 and beta=0 in both cases, and both have the same momentum. (0.1 and 0.9, due to different implementations)

Alright. I forgot about the Group Norm part, sorry for the confusion.

@sayakpaul
I am going to train all of the models once more. This is because the older ones were ran on randomly initialized weights and also there were some minor changes in the architecture (one extra use_bias=False added). These models will be the ones which I will submit in the TFHub PR.
Sorry about the notebook, there were some issues related to loading the model and group convs. Most of it is done and I'll share it with you as soon as it's done.
The EMA run didn't perform as good as the AdamW ones. With that, I want to freeze my implementation here. Here are the final accuracies we could achieve:
1744       200MF. AdamW. New initializers. Inception, randflip, pca	0.6726
1730	400MF. AdamW. Inception crop, randflip	                         0.7003
0335	600MF. New Inits. Inception, randflip, pca. NO FAST JITTER	0.7277
0339	800MF. New Inits. Inception, randflip, pca. NO FAST JITTER	0.7289
/cc @MorganR

@sayakpaul
About the grouped conv issue, would it be best to specify this as a limitation in the README and/or in the notebook? As in the comment, it works with batch size 1 on CPU from 2.6.0rc1. Works fine on GPU or TPU.

I am going to train all of the models once more. This is because the older ones were ran on randomly initialized weights and also there were some minor changes in the architecture (one extra use_bias=False added). These models will be the ones which I will submit in the TFHub PR.

SGTM.

About the grouped conv issue, would it be best to specify this as a limitation in the README and/or in the notebook? As in the comment, it works with batch size 1 on CPU from 2.6.0rc1. Works fine on GPU or TPU.

SGTM.


Create a Transition / Session End Page & Redirect to it after Question Page

Preferably have a basic version of this to communicate that all questions are complete for sprint 5, anything else is optional and may be added afterwards.

TODO: add basic stats

Currently just a basic list of login info and number of complete questions,


FinancialStatementService - get FCF

This service should:

get tickers from the URL
get and parse information from SEC EDGAR (4 fields)
compute parsed data from SEC EDGAR and compute the FCF

Optional: Export this feature as a Node module or a npm library, preferentially, the latter.

Done! The FCF is being computed and served on an endpoint. The data is also being cached for further use.


Recommended checkpoint for real-world images

Hi, thank you for your great work.
I want to test the GMA on real-world images (ie, not synthetic ones). Could you tell me which one of the four checkpoints (chairs, kitti, sintel, things) is expected to generalize well on real-world images?

I would try Sintel.


Update IAM policy

Updated IAM policy to allow the service to write objects in S3

CI: No IaC security warnings found


Each time a tile is placed on the wall, the points are calculated: If there are no adjacent tiles on the wall, gain 1 point. If there are horizontally adjacent tiles, gain points according to how wide the row is (if there are 3 tiles, gain 3 points). Afterwards, do the same for vertically adjacent tiles

Implemented the scoring function in commit https://github.com/sopra-fs22-group-34/server/commit/4c5ae122590e23e57fda001220841d7c0c62dd81


feat: Adding "CORS" policy to opentrons APP

Overview
We are trying to interact with the opentrons API remotely and were already very successful with sending requests through python. Now we would like to integrate the API into the openflexure server system using the imjoy.io plugin environment. Wei, the creator of ImJoy and I tried creating a simple toggle-button plugin:

to remote control the opentrons within the plugin. The relevant code snippet is this here (a javascript post request as a ImJoy plugin):
<docs lang="markdown">
[TODO: write documentation for this plugin.]
</docs>
<config lang="json">
{
  "name": "OpentronsDemo",
  "type": "window",
  "tags": [],
  "ui": "",
  "version": "0.1.2",
  "api_version": "0.1.5",
  "description": "This is a backbone plugin for using Vue.js in ImJoy",
  "icon": "extension",
  "inputs": null,
  "outputs": null,
  "env": "",
  "requirements": [
      "https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.22/vue.min.js",
      "https://static.imjoy.io/spectre.css/spectre.min.css",
      "https://static.imjoy.io/spectre.css/spectre-exp.min.css",
      "https://static.imjoy.io/spectre.css/spectre-icons.min.css"
  ],
  "dependencies": [],
  "defaults": {"w": 20, "h": 10},
  "runnable": true,
  "base_frame": "http://<IP_ADDRESS>:5000/baseframe.html"
}
</config>

<window lang="html">

{{title}}

    <button class="btn" @click="toggleLight()">Toggle Light</button>

</window>

When executing the plugin and sending the POST, we get the following error:
baseframe.html:1 Access to fetch at 'http://<IP_ADDRESS>:31950/robot/lights' from origin 'http://<IP_ADDRESS>:5000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.

Implementation details
Wei suggested to implement the following fix inside the app.py (opentrons/robot-server/robot_server/service/app.py):
import logging
import traceback

from fastapi.middleware.cors import CORSMiddleware
from opentrons import __version__
from fastapi import FastAPI, APIRouter, Depends
from fastapi.exceptions import RequestValidationError
from starlette.responses import Response, JSONResponse
from starlette.requests import Request
from starlette.exceptions import HTTPException as StarletteHTTPException
from starlette.status import (
    HTTP_422_UNPROCESSABLE_ENTITY
)

from .logging import initialize_logging
from robot_server.service.legacy.models import V1BasicResponse
from .errors import V1HandlerError, \
    transform_http_exception_to_json_api_errors, \
    transform_validation_error_to_json_api_errors, \
    consolidate_fastapi_response, BaseRobotServerError, ErrorResponse, \
    build_unhandled_exception_response
from .dependencies import (
    get_rpc_server, get_protocol_manager, get_hardware_wrapper,
    verify_hardware, get_session_manager, check_version_header)
from robot_server import constants
from robot_server.service.legacy.routers import legacy_routes
from robot_server.service.session.router import router as session_router
from robot_server.service.pipette_offset.router import router as pip_os_router
from robot_server.service.labware.router import router as labware_router
from robot_server.service.protocol.router import router as protocol_router
from robot_server.service.system.router import router as system_router
from robot_server.service.tip_length.router import router as tl_router
from robot_server.service.notifications.router import router as \
    notifications_router

log = logging.getLogger(__name__)

app = FastAPI(
    title="Opentrons OT-2 HTTP API Spec",
    description="This OpenAPI spec describes the HTTP API of the Opentrons "
                "OT-2. It may be retrieved from a robot on port 31950 at "
                "/openapi. Some schemas used in requests and responses use "
                "the `x-patternProperties` key to mean the JSON Schema "
                "`patternProperties` behavior.",
    version=__version__,
)

# disable CORS
app.add_middleware(
    CORSMiddleware,
    allow_origins=[
        "https://lib.imjoy.io",
        "http://<IP_ADDRESS>:5000",
    ],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["Content-Type", "Authorization"],
)

in order to disable CORS.
Do you think this is possible? Or is this a very user-specific case?
Design

Acceptance criteria
Solved, if we can remote control the opentrons through an ImJoy plugin.

@beniroquai I think you noticed this issue right at the same time we noticed! We believe HTTP API should be interactable from any origin; the lack of CORS middleware was on oversight.
#7632 includes your requested change with an allow_origins value of *. We may be able to get this into the upcoming 4.3 release, but it'll certainly by 4.4

One more update on this issue (just for brevity).
We were able to use ImJoy inside the Opentrons Jupyter notebook:

With this you can use all kinds of machine learning plugins :-)
Closing the issue for now (or was already closed..nice!:)


SymmetricMatrixConstantCoefficient::Eval is ambiguous if DenseMatrix is the first argument

I am reporting an error which I saw on Github MacOS runner. This is from build log of PyMFEM and bit messy. But, what it is saying is
that there are two candidate for  (arg1)->Eval(*arg2,*arg3,(mfem::IntegrationPoint const &)*arg4) .
Here arg1 is SymmetrixMatrixConstantCoefficient abd  args2, arg3, arg4 are DenseMatrix, ElementTrandformation, and IntegrationPoint, respectively.
Apparently, the compiler thinks there are two candidates. One is coefficient.hpp:945, which is MatrixCoefficient::Eval and
coefficient.hpp:1331, which is SymmetricMatrixCoefficient::Eval. The first one is defined as =0, it looks strange to my
eyes, but it is also true that there is using MatrixCoefficient::Eval in line 1351.
2023-01-04T20:22:52.3787910Z coefficient_wrap.cxx:19522:15: error: call to member function 'Eval' is ambiguous
2023-01-04T20:22:52.3789130Z       (arg1)->Eval(*arg2,*arg3,(mfem::IntegrationPoint const &)*arg4);
2023-01-04T20:22:52.3789850Z       ~~~~~~~~^~~~
2023-01-04T20:22:52.3790920Z /Users/runner/hostedtoolcache/Python/3.9.16/x64/lib/python3.9/site-packages/mfem/external/ser/include/mfem/fem/coefficient.hpp:945:17: note: candidate function
2023-01-04T20:22:52.3792350Z    virtual void Eval(DenseMatrix &K, ElementTransformation &T,
2023-01-04T20:22:52.3792960Z                 ^
2023-01-04T20:22:52.3795440Z /Users/runner/hostedtoolcache/Python/3.9.16/x64/lib/python3.9/site-packages/mfem/external/ser/include/mfem/fem/coefficient.hpp:1331:17: note: candidate function
2023-01-04T20:22:52.3796340Z    virtual void Eval(DenseMatrix &K, ElementTransformation &T,
2023-01-04T20:22:52.3796930Z                 ^

Thanks. However, somehow it didn't resolve the issue. The log of action is here FYI.
https://github.com/mfem/PyMFEM/actions/runs/3850182864
I am not sure what is going on. I will try another thing in the wrapper recipe.

Whoops, there was one more using statement that should have been deleted. Just pushed another commit. Can you try again?

It works  (https://github.com/mfem/PyMFEM/actions/runs/3851489275/jobs/6562719908)

It works (https://github.com/mfem/PyMFEM/actions/runs/3851489275/jobs/6562719908)

Great! PR created: #3394

Discussion continued in #3394.


WebSockets are not patched in WebWorker

WebSocket patching has gotten mixed in with property description patching, which does not run on a WebWorker. As such WebSockets aren't patched in a Worker even though the API is available.

Reopening because I reverted the commits. See #257


Feature Request: OpenTextDocument with content

#12283 added an api overload to open a new, untitled text document with an optional language mode.
It would be great if this could be augmented to accept content.
Use case: I have an extension that ships with examples. Currently I have to do one of the following:

Open the "source" file directly which would allow users to clobber it
Copy the file to a temp file and open that and then remember to clean it up. Users would still have to "save as" to save it in a location that is useful to them
Use the new overload to open an untitled, empty text document and then use an edit to populate the contents.

The last one is the most viable but seems unnecessary. I would like to see openTextDocument(options?: {language: id, content: text}) so I could do something like
openTextDocument(exampleUri).then(exampleDocument => { const exampleText = exampleDocument.getText(); openTextDocument({language: LANG_ID, content: exampleText})

@hoovercj why are steps 1 and 2 needed if all you need is the content of a file?

Sorry @bpasero for the poorly worded issue, I've updated it to clarify that those were 3 distinct options.

@hoovercj nothing prevents you from opening an untitled file and then setting the content, right?

@bpasero I didn't see a way to set the content without doing an insert textedit which would allow the user to undo the text which goes against the spirit of the "open example" command that I've exposed and the "open untitled document with content" that I've  proposed.
From the user perspective, "open example" should be a discrete step. If they make some modifications and want to quickly get back to the original document they can't blindly press "undo" right now because they would get back to a blank page and then have to press "redo" and hope they don't accidentally press a button and then lose the document and need to "open example" again.
Of course, if there is a different way that I've missed to set the document content that doesn't result in an undo, I might be able to use that instead

Ok, good point about the undo.

@jrieken fyi
I think we would be open to a PR here if you are willing to look into it.

Yeah, would be straight forward to pass on a string when calling the open function

@jrieken please verify

Any chance this could be revised so that openTextDocument takes the language/contents option as a separate parameter, instead of inplace of uriOrFileNameOrOptions?: vscode.Uri or string?  I have a similar use case as the original story for this issue, but I also need to name the file.


"make vars" now shows the variables introduced in 929360375e18e73

See also https://github.com/epfl-idevelop/jahia2wp/pull/31#issuecomment-334991002

Hi @domq ,
I also added this one in the feature-bonus branch :)
I am not sure I will be the one to corresponding PR #33, and I guess it will generate a conflict if I merge yours first. What would you say ?

Sure, I'll wait for feature-bonus to be merged onto master.


Make it possible to use as a library.

Describe the issue

Make it possible to use Super-Rag as a Python library. Preferable syntax would be:
from super_rag import SuperRag

client = SuperRag(config)

# Create index
client.ingest(payload)

# Query index
client.query(payload)

# Delete embeddings
client.delete(payload)

Is it like SDK with API? or a standalone library?

Is it like SDK with API? or a standalone library?

SDK


extracting the files

Hi all,
I am using Tabula program and it is amazing. The preview of the exported tabular data looks great. However, for some reason when I click the export bottom nothing happens, and so I cannot export and save the exported tabular.
Is there any reason for that? Do I make something wrong here?
Many thanks for your help in advance!

Hi @lindnera, thanks a lot for reporting the issue.
What you describe is a known issue with Tabula 1.0.0, which will be resolved in our next bugfix release. The workaround, for now, is to use Tabula through Firefox instead of Chrome or Safari.

Fixed in version 1.0.1 — https://github.com/tabulapdf/tabula/releases/tag/v1.0.1


Expedition balance pass

About the PR

people bitch out the ass about these all the time, how about they actually try to do some balancing.
a bunch of misc changes to expeditions to hopefully remove some of the more offensive balance aspects.
the changes:

only 3 missions are available at a time (although each mission is a unique difficulty, so you can't get 3 extreme missions)
missions are now shorter (around 10 minutes)
"rush" missions are even shorter (7:00 to 7:45)
the raw weapons have been removed outright from the lootpool
weapon crates moved up into epic (since they sell pretty well and are generally really strong)
rare rewards changed to remove ballistics in exchange for shields and melees.

I doubt that this is the end-all-be-all of expedition balance, but i think this will help with some of the most blatant issues.


Question: How Isomorphic Works

Let me start by saying: thank you so much for this library! I just used it and it works like a charm with my NextJS implementation. I just don't understand why (and that hurts 😄 ), so, I admit this is mostly just my lack of understanding around how this is working, but if you'll entertain me...
Am I right in the following understanding of how this library works:

function r(m){return m && m.default || m;} returns the default export if available, else just whatever m is (i.e. a module)
We export global.DOMPurify if it exists (meaning global exists, meaning we're in node)... or
typeof process === undefined meaning we're not in node (is this not redundant?) and so we can return just dompurify since we don't need jsdom on the client-side, else
we are in node, so we need to use JSDOM to initialize a virtual(?) DOM with JS for DOMPurify server-side?

function r(m){return m && m.default || m;}
module.exports = global.DOMPurify = global.DOMPurify || (
	typeof process === 'undefined' ? r(require('dompurify')) : (function() {
    const DOMPurifyInitializer = r(require('dompurify'));
    const { JSDOM } = r(require('jsdom'));
    const { window } = new JSDOM('<!DOCTYPE html>');
    return DOMPurifyInitializer(window);
	})()
);

For reference, here's me confirming that process would be defined in node
$ node
Welcome to Node.js v12.16.2.
Type ".help" for more information.
> typeof process
'object'

@stephencweiss Thanks for your kind words and the question.
Let's start from not using "virtual DOM" term in this context because it can be confused with the virtual DOM which is used in React and other modern frontend frameworks. As I understand, JSDOM has a different purpose and implementation.
To be honest, I didn't change much in the skeleton code which is provided by the Isomorphic Unfetch because it worked for me well enough and I didn't find anything suspicious in it at that time.
But I'm open to improve the code, so please give me some time to check my assumptions to provide a more detailed answer.

First, let's ignore r(m) function because its purpose is more or less clear and it doesn't add any significant complexity.
I can't give you 100% answers but can share my considerations...

In the Node environment, this piece of code module.exports = global.DOMPurify = [some code] allows us both:

const DOMPurify = require('isomorphic-dompurify');
DOMPurify.sanitize('Iframe!');

and
require('isomorphic-dompurify');
DOMPurify.sanitize('Iframe!');

My guess is that module.exports = global.DOMPurify = global.DOMPurify || [init logic] was aimed as a caching mechanism (sort of a singleton), so that if you would import the module twice, it would execute the init logic only once:

require('isomorphic-dompurify');
require('isomorphic-dompurify');

but modern versions of Node cache multiple imports of the same module anyway, so it can be redundant.

I was thinking about why we have both conditions for checking whether it's Node: global.DOMPurify and typeof process === 'undefined'. But then I confirmed that


Merge devops/1-Automated-NuGet-publish into develop

Wait until I was able to test this on my other library.


Remove unexpected " #" from link text

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

@kendaleiv thanks again for the help! #sign-off


"git branches" raised an error on Windows (Anaconda Python)

I am using Python 2.7.14 :: Anaconda custom (64-bit) , git version 2.15.1.windows.2 and pip show legit return
Name: legit
Version: 0.4.1
Summary: Git for Humans.
Home-page: https://github.com/kennethreitz/legit
Author: Kenneth Reitz
Author-email<EMAIL_ADDRESS>License: BSD
Location: k:\anaconda2\lib\site-packages
Requires: packaging, smmap2, six, GitPython, appdirs, clint, pyparsing, gitdb2, args
The command git branches returned the following error for one of my repos.
Traceback (most recent call last):
File "k:\anaconda2\lib\runpy.py", line 174, in _run_module_as_main
"main", fname, loader, pkg_name)
File "k:\anaconda2\lib\runpy.py", line 72, in run_code
exec code in run_globals
File "K:\Anaconda2\Scripts\legit.exe_main.py", line 9, in
File "k:\anaconda2\lib\site-packages\legit\cli.py", line 48, in main
command.call(args)
File "k:\anaconda2\lib\site-packages\legit\cli.py", line 502, in call
return self.fn(*args, **kw_args)
File "k:\anaconda2\lib\site-packages\legit\cli.py", line 286, in cmd_branches
display_available_branches()
File "k:\anaconda2\lib\site-packages\legit\cli.py", line 369, in display_available_branches
branches = get_branches()
File "k:\anaconda2\lib\site-packages\legit\scm.py", line 265, in get_branches
for b in remote.refs:
File "k:\anaconda2\lib\site-packages\git\remote.py", line 527, in refs
out_refs.extend(RemoteReference.list_items(self.repo, remote=self.name))
File "k:\anaconda2\lib\site-packages\git\util.py", line 932, in list_items
out_list.extend(cls.iter_items(repo, *args, **kwargs))
File "k:\anaconda2\lib\site-packages\git\refs\symbolic.py", line 592, in _iter_items
for sha, rela_path in cls._iter_packed_refs(repo):  # @UnusedVariable
File "k:\anaconda2\lib\site-packages\git\refs\symbolic.py", line 92, in _iter_packed_refs
raise TypeError("PackingType of packed-Refs not understood: %r" % line)
TypeError: PackingType of packed-Refs not understood: '# pack-refs with: peeled fully-peeled sorted'
Is any more information required?

I am seeing the same error on OSX High Sierra:
k@mpb ~/code/backend legit --version
legit v0.4.1
 k@mpb ~/code/backend git branches
Traceback (most recent call last):
  File "/usr/local/bin/legit", line 11, in <module>
    sys.exit(main())
  File "/usr/local/lib/python3.6/site-packages/legit/cli.py", line 48, in main
    command.__call__(args)
  File "/usr/local/lib/python3.6/site-packages/legit/cli.py", line 502, in __call__
    return self.fn(*args, **kw_args)
  File "/usr/local/lib/python3.6/site-packages/legit/cli.py", line 286, in cmd_branches
    display_available_branches()
  File "/usr/local/lib/python3.6/site-packages/legit/cli.py", line 369, in display_available_branches
    branches = get_branches()
  File "/usr/local/lib/python3.6/site-packages/legit/scm.py", line 265, in get_branches
    for b in remote.refs:
  File "/usr/local/lib/python3.6/site-packages/git/remote.py", line 527, in refs
    out_refs.extend(RemoteReference.list_items(self.repo, remote=self.name))
  File "/usr/local/lib/python3.6/site-packages/git/util.py", line 932, in list_items
    out_list.extend(cls.iter_items(repo, *args, **kwargs))
  File "/usr/local/lib/python3.6/site-packages/git/refs/symbolic.py", line 592, in _iter_items
    for sha, rela_path in cls._iter_packed_refs(repo):  # @UnusedVariable
  File "/usr/local/lib/python3.6/site-packages/git/refs/symbolic.py", line 92, in _iter_packed_refs
    raise TypeError("PackingType of packed-Refs not understood: %r" % line)
TypeError: PackingType of packed-Refs not understood: '# pack-refs with: peeled fully-peeled sorted'

duplicated by #225
@volf52 @kennell  Until a new release publishes to pypi, you have to install legit from the git repository (branch develop, see README for instructions, basically just clone the repo and install via setup.py) or roll back to an old version of git.


App Studio is auto-converting my app to Schema 1.9, and the failing to install it into Teams

Issue:
App studio auto converting the schema as 1.9.
Workaround:
Upload the manifest directly by updating the schema to 1.5
Reference:
https://stackoverflow.com/questions/66121113
https://stackoverflow.com/questions/66120464
Internal Bug Tracker: 1529546
Please continue to follow this issue for updates/progress/questions.

How do you upload the manifest directly to 1.5?
I'm developing a new Teams app and I tried downloading the package, changing it manually and reimporting it, but in the "App Manifest (preview)" tab it keeps changing to 1.8 (before was 1.9).
When I try to start my application locally I get this error:
arg0:{message: '', status: 400, errorCode: 'UnsupportedManifestVersion'}

Bug is fixed.


[package_info_plus] add support for chrome-extensions

Description
dart:core's Uri.origin does not support schemes other than http and https. This PR adds a workaround by catching the exception thrown by Uri.origin for chrome-extensions:// and return the origin by combining Uri.scheme and Uri.authority.
This will enable ONLY chrome-extensions other than http and https, nothing else, going along the same lines as dart sdk authors did by preventing anything other than http and https. If there is some other use case, adding support for that will be trivial.
Related Issues
Fixes #1134
Checklist
Before you create this PR confirm that it meets all requirements listed below by checking the relevant checkboxes ([x]).
This will ensure a smooth and quick review process.

[x] I read the Contributor Guide and followed the process outlined there for submitting PRs.
[x] My PR includes unit or integration tests for all changed/updated/fixed behaviors (See Contributor Guide).
[x] All existing and new tests are passing.
[x] I updated the version in pubspec.yaml and CHANGELOG.md.
[x] I updated/added relevant documentation (doc comments with ///).
[x] The analyzer (flutter analyze) does not report any problems on my PR.
[x] I read and followed the Flutter Style Guide.
[x] I am willing to follow-up on review comments in a timely manner.

Breaking Change
Does your PR require plugin users to manually update their apps to accommodate your change?

[ ] Yes, this is a breaking change (please indicate a breaking change in CHANGELOG.md and increment major revision).
[x] No, this is not a breaking change.

I don't have the necessary web-dev knowledge to review this, asking the rest of maintainers/community if they can chip in

I don't have the necessary web-dev knowledge to review this

Same here.

@werainkhatri is there maybe another workaround except catching the StateError?
Thanks for adding tests 🙂

is there maybe another workaround except catching the StateError?

i have instead created sort of a replica of the Uri.origin function, without the checks. this seems to me, a better work-around.

Nice!
If we replicate origin, shouldn't we replicate the other checks, too?

origin() is only used in this library, correct? Then it should be private.
Or, what about an extension?
extension _UriOrigin on Uri {
  String get _origin { // or a better name
    if (isScheme('HTTP') || isScheme('HTTPS')) {
      return origin;
    } else if (port == 0) {
      // some comment what port == 0 means
      return '$scheme://$host';
    } else {
      return '$scheme://$host:$port';
    }
  }
}

buildSignature: Uri.parse(window.document.baseUri!)._origin,

I had this doubt initially. if we anyway wish to support "only" chrome extensions for now, might as well add a check specifically for it and rest be handled by Uri.origin.
extension _UriOrigin on Uri {
  String get _origin {
    if (isScheme('chrome-extension')) {
      return '$scheme://$host:$port';
    }
    return origin;
  }
}

@werainkhatri just more one small comment for improving the docs
From my side it's ready to go, good job! 💪🏽


Move the VSkeletonGrid.vue styles to the template

Description

VSkeletonGrid.vue uses style to set the Tailwind styles.
https://github.com/WordPress/openverse/blob/04a36fcb320063aa8b42ea703c8059d7254d6990/frontend/src/components/VSkeleton/VGridSkeleton.vue#L64-L80
The nesting is used incorrectly here (@screen md should wrap the masonry class styles instead of the other way around). This causes errors when CSS is built for production (or it will cause errors after we migrate to Nuxt 3).
We should move all of the styles to the template classes instead. Here are some corresponding Tailwind classes:
column-count: 1 -> columns-1
column-gap: 1rem -> gap-x-4
So, the column-related classes would be columns-2 gap-x-4 md:columns-3 lg:columns-5
aspect-ratio: 1 / 1 -> aspect-square
Additional context

Found this while testing Nuxt 3 migration.

Hi, @YashGaur000! #2636 fixed this issue, but we didn't close it. Could you please find a different issue?

Okay, its alright but it was not nested correctly, was it?


Fixes #9220: Accept environment names consisting only of integers.

See #9220 for motivations behind this pull-request

Can one of the admins verify this patch?

 Thank you for your submission! We really appreciate it. Like many open source projects, we ask that you all sign our Contributor License Agreement before we can accept your contribution.1 out of 2 committers have signed the CLA.:white_check_mark: joshcooper:x: saimonnYou have signed the CLA already but the status is still pending? Let us recheck it.

Hi @saimonn have you had a chance to review my comments? We'd welcome a pull request if you can incorporate those changes, thanks!

Hi @joshcooper, thanks for the reminder!
I don't have enough time nor ruby knowledge to dig further on this PR.
We ended by prefixing our branches/environment names with letters as a workaround.
You can close this PR unless you find someone else with resources to address it.

Ok, thanks for letting us know. I'm going to close this for now.


ddns check interval minimum value (seemingly) too high

Currently the smallest check interval is set to 5 minutes that is hard-coded in the code [1], [2] of luci-app-ddns.
I thought it should be possible to check for the IP change every second or even faster than that for these reasons:

It's a low cost operation for the router to check if it's WAN IP has changed or not
The point of DDNS (for me) is to eliminate downtime in case of a forced IP reallocation from my ISP so in the event of an IP change, I would hope to have the cut-over time as small as possible and 5 minutes seems way too long when I can configure DNS TTLs of 2 minutes in my DNS provider for example.

[1]
https://github.com/openwrt/luci/blob/879a71dc2dacf4ae4ff8ba738d000562ed42d728/applications/luci-app-ddns/htdocs/luci-static/resources/view/ddns/overview.js#L970
[2]
o.validate = function(section_id, formvalue) {
  var unit = this.section.children.filter(function(o) { return o.option == 'check_unit' })[0].formvalue(section_id),
	  time_to_sec = _this.time_res[unit || 'minutes'] * formvalue;

  if (formvalue && time_to_sec < 300)
	  return _('Values below 5 minutes == 300 seconds are not supported');

  return true;
};

See my misunderstanding explained here: https://github.com/openwrt/luci/pull/4676#issuecomment-749168465


Missing values in tox21 dataset

How did you handle NaN target values in the tox21 dataset?
Thank you.

We replaced the positions of the NaN labels with -1 and filtered these positions in the loss calculation, refer to here.

Thanks!


dns_search option for docker_service is not written correctly

I've added a docker_service:
docker_service 'default' do
  action [:create, :start]
  dns_search ['first.domain', 'second.domain']
end

The docs say that dns_search is supposed to be of type String, Array, but when I use an array (such as in the example above), the cookbook writes the docker command line as:
/usr/bin/docker -d --dns-search=["first.domain", "second.domain"] ...

when it should have been
/usr/bin/docker -d --dns-search=first.domain --dns-search=second.domain ...

which leads to docker not starting since ["first.domain", is not a valid domain name. If I try to use a simple string, chef fails with Option dns_search must be a kind of Array!
I'm running version 0.40.3 of this cookbook.

Hello!!
Thanks for reporting this... this should be fixed up in master and will be shipped in 1.0.0
-s


Different severity name based on device width

Hello,
thank you for this beautiful card.
I noticed some inconsistency with the card name based on the device width.
If I look into entity itself, data is shown as Event: Moderate Low temperature Warning, Severity: Moderate, but in certain scenarios it's shown as extreme.
I think it's best to explain in screenshots.

Phone portrait

Phone landscape

Computer, Chrome, narrow window
Seems inconsistent to me. Is it a bug?
Thanks for looking into it.
System (please complete the following information):

Card version: 1.13
Integration type: meteo-alarm core
Installation type: HACS

Hey @slovenec88 this issue doesn't follow the bug report issue template and tus doesn't contain the system information
**System (please complete the following information):**
 - Card version: e.g. 1.1.0 ("latest" is not valid)
 - Integration type: Core / xlcnd / DWD / Meteo-France
 - Installation type: HACS / Manual

Please do fill up your report with that section

Hey, the message that is showing up on larger screens Moderate Low temperature Warning is the event title provided by the integration while the Extreme low temperature is just the name of the event type. This behaviour is international and helps with scaling cards for all screens sizes.
The other thing is Extreme low temperature was an official event name used by meteoalarm but it seems that this has been changed to just Low temperature  and that's need to be reflected in the card so i will keep this open


Table Top Defined - New Features and adjustments

Submission Checklist
Required

[X] The pull request title clearly contains the name of the sheet I am editing.
[X] The pull request title clearly states the type of change I am submitting (New Sheet/New Feature/Bugfix/etc.).
[X] The pull request makes changes to files in only one sub-folder.
[X] The pull request does not contain changes to any json files in the translations folder (translation.json is permitted)

Changes / Description
Features

Die-type input fields have been changed to selections to simplify use
Added a Resource field to the abilities so it's easier to mark when an ability uses a resource instead of per-day

CSS Changes

Many CSS changes made to make spell and ability cards pop more

Character Sheet Info Roll20 Internal Use only.


Support: What triggers the extension to connect to the cluster?

Hi all,
Firstly, let me say thank you for maintaining this awesome extension!
I use the Kubernetes extension mostly for checking helm charts we are editing, and I really do like it... however it aggressively tries to connect to whatever Kubernetes cluster is the current context in my kubeconfig whenever I have my Puppet control-repo open (I am sure there are other folders, but this is the one I notice most). Our K8s clusters use OIDC authentication, with the https://github.com/int128/kubelogin setup, so that they will open a browser tab whenever the session is expired and you try to connect. Immediately upon opening VSCode with my Puppet control-repo, I get two authentication tabs. Additionally, if I wander off for the weekend and leave VSCode open, it will open several authentication attempts. I know it is a minor annoyance, but I'd like to make it stop. So....

Can I make it less aggressive? (i.e. wait for authentication to complete before kicking off multiple commands)
I have not clicked on the Kube extension window, why is it even trying to connect? (hence the what triggers...)

Except for some yaml files (Puppet Hieradata), I don't even think there are any files in the control-repo that the kubernetes extension would care about. There is also a kubernetes.yaml and a kubernetes folder (as we use puppet to manage our vK8s cluster nodes).

Wow, I was sortof hoping someone would have some advice as to why VSCode thinks it needs to connect to the Kubernetes cluster, when it is not even being used (vscode is running in the background).

2. I have not clicked on the Kube extension window, why is it even trying to connect?

I assume the extension attempts to use your active kubectl context to update the status bar, which is why it requires a connection. Have you tried debugging the extension to determine the cause?

Immediately upon opening VSCode with my Puppet control-repo, I get two authentication tabs.

That is a mystery to me... Do you have another extension installed attempting to establish a connection with Kubernetes?

Additionally, if I wander off for the weekend and leave VSCode open, it will open several authentication attempts.

Glancing at https://github.com/Azure/vscode-kubernetes-tools/issues/402, it is possible that the authenticator tool used with your kubernetes cluster is issuing the refresh request. In your case, kubelogin. It is possible that kubelogin is running in the background re-issuing login requests. The kubernetes extension interfaces with kubectl - none of the login logic is handled by the extension itself.

Note: the status bar can be disabled with the vs-kubernetes.disable-context-info-status-bar option.

disclaimer: not a maintainer of the project. Just chiming in here with what I know.

I have not clicked on the Kube extension window, why is it even trying to connect?

I assume the extension attempts to use your active kubectl context to update the status bar, which is why it requires a connection. Have you tried debugging the extension to determine the cause?

The status bar does display the "current" context, which should just be reading a yaml file or kubectl config current-context ... Neither requires authentication.  (I will have to look into the debugging thing, to see if I can do it) :)

Immediately upon opening VSCode with my Puppet control-repo, I get two authentication tabs.

That is a mystery to me... Do you have another extension installed attempting to establish a connection with Kubernetes?

$ code --list-extensions
4ops.packer
adamhartford.vscode-base64
bbenoist.vagrant
bierner.markdown-mermaid
bpruitt-goddard.mermaid-markdown-syntax-highlighting
casualjim.gotemplate
chrislajoie.vscode-modelines
CoenraadS.bracket-pair-colorizer
coolbear.systemd-unit-file
DavidAnson.vscode-markdownlint
dawhite.mustache
eamodio.gitlens
formulahendry.vscode-mysql
GitLab.gitlab-workflow
golang.go
googlecloudtools.cloudcode
hashicorp.terraform
jakebathman.mysql-syntax
janjoerke.jenkins-pipeline-linter-connector
jetmartin.bats
jinhyuk.replace-curly-quotes
jlcs-es.x509-parser
jmMeessen.jenkins-declarative-support
magicstack.MagicPython
mindaro-dev.file-downloader
ms-azuretools.vscode-docker
ms-kubernetes-tools.vscode-aks-tools
ms-kubernetes-tools.vscode-kubernetes-tools
ms-mssql.mssql
ms-ossdata.vscode-postgresql
ms-python.python
ms-python.vscode-pylance
ms-toolsai.jupyter
ms-vscode-remote.remote-containers
ms-vscode-remote.remote-ssh
ms-vscode-remote.remote-ssh-edit
ms-vscode.azure-account
ms-vscode.powershell
ms-vsliveshare.vsliveshare
oderwat.indent-rainbow
puppet.puppet-vscode
rebornix.ruby
redhat.java
redhat.vscode-commons
redhat.vscode-yaml
secanis.jenkinsfile-support
selcuk-usta.code-complexity-report-generator
shardulm94.trailing-spaces
VisualStudioExptTeam.vscodeintellicode
vscjava.vscode-java-debug
vscjava.vscode-java-dependency
vscjava.vscode-java-pack
vscjava.vscode-java-test
vscjava.vscode-maven
vscode-icons-team.vscode-icons
vscoss.vscode-ansible
wengerk.highlight-bad-chars
wingrunr21.vscode-ruby
wwm.better-align

good lord, there are a lot of them #238
Perhaps there is an unintended interaction between a couple of them?

Additionally, if I wander off for the weekend and leave VSCode open, it will open several authentication attempts.

Glancing at #402, it is possible that the authenticator tool used with your kubernetes cluster is issuing the refresh request. In your case, kubelogin. It is possible that kubelogin is running in the background re-issuing login requests. The kubernetes extension interfaces with kubectl - IIRC none of the login logic is handled by the extension itself.

hmmm...

@TJM Not much to add to what @bacongobbler said except to apologise for not getting you a response sooner - I am a maintainer and I should have got to it quicker!
The list of things that cause the extension to load is in package.json at https://github.com/Azure/vscode-kubernetes-tools/blob/455a188c0a32e786a8b64bf306fb4b88c866ffe2/package.json#L27 - most are explicit commands or views, so the main thing I can think of that you might not expect is YAML files (because we need to see if they are Kubernetes manifests).
The extension does connect in the background as soon as it is activated, even if the thing that activated it doesn't need auth.  This is to get things like the cluster version and resource schemas so that it can be ready for files to open, preload the right version of kubectl, etc.  Normally this is invisible to the user but obviously that's not the case for you!
I'm not quite sure how to resolve this in a way that is going to work for you without losing those advantages for other users.  We could perhaps allow a cluster to be marked as "connecting to this requires user intervention," and we could defer connecting to such clusters until truly needed.  But I'm not sure how easy it would be to distinguish "truly needed" from background.  Although we have already made some steps in that direction so maybe it would be okay.
Apologies again for the slow reply on my part, and thanks for your patience.

That would make sense as to why my puppet control-repo is "activating" as it has a bunch of yaml files in it. I might also be able to set some sort of workspace-level parameter that sets the context to something like minikube or kind or whatever so that it doesn't bother me. The things that you say about checking version and what not make sense, as I also noticed that it "activates" when the kubectl changes, for example changing the current context.

@RikuXan I totally agree that this sounds pretty annoying.
Here's an idea:
Set vs-kubernetes.kubeconfig and the vs-kubernetes.knownKubeconfigs array in your vscode user settings, so that you can use the > Kubernetes: Set Kubeconfig command to switch between one that contains your kubelogin enabled clusters and one that does not have clusters with any interactive auth.
Doing this at the user level keeps it disabled by default most of the time, but you'd always have the option to turn it on.
For projects that are specific to your clusters, you can override the default kubeconfig, so that the discovery API fetches the schema doc and version info and you're prompted with the auto-login immediately, but you can always turn it off by switching kubeconfigs.
@TJM I think this behavior is why you get two separate login prompts:

I can see at least kubectl cluster-info and kubectl api-resources in Process Explorer) are executed for all kubeconfig clusters, not only the currently selected one.

I'm guessing you had two kubelogin enabled clusters in your kubeconfig.


Message Signing for SEGWIT Broken

When attempting to sign a message for a BTC Segwit address, the address is changed to a BTC Legacy address during the signing process.
To reproduce:

Choose Segwit address to sign: 3LzocuLiqXo9HKGyBBpXddhRBWqshBnMay
Add message: This is an example of a signed message.
Confirm hash on device.
Notice signed message:
-----BEGIN BITCOIN SIGNED MESSAGE-----
This is an example of a signed message.
-----BEGIN SIGNATURE-----
1PEanNSQUjfisevAdBU6YztuuUEGxLyHCA
INezEhuL57gx13q+kX1saVQcWab+XAVo58BS1/GakRFTVjJP5ieWgtjGmARrNFpPdCaYH+6AZID47fvbT//adnU=
-----END BITCOIN SIGNED MESSAGE-----

Using any available VERIFY tool (for some reason Ledger doesn't include one???) One can see that the signature and message validate for the address starting with "1", the legacy address, and not the Segwit "3" address.

Same issue for LTC Segwit. 'M' addresses are changed back to 'L' and messages are signed with the 'L' address.


Fix [Bug] process definition json worker group convert #2794

BUG fix process definition json worker group convert #2794

Codecov Report

Merging #2795 into dev-1.3.0 will increase coverage by 0.00%.
The diff coverage is 27.60%.

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


Boardwalk not launching on kindle fire hdx 7

Version of Boardwalk: 1.0.7
Version of Android: Android 4.4.2/Fire OS 4.5.2
Device model: Kindle fire hdx 7 3rd generation
Description of the problem: When I click launch minecraft it takes me back to the kindle launcher I have tried reinstalling it but that didn't fix it. It does not come up with the gui it just closes and there is no crash report file

I just found out it only works on boardwalk 1.0.6 but not on 1.0.7


Issue with back button gesture on Nokia (maybe bug maybe feature)

Hi. First of all thanks to your work. Plugin is awesome.
But I noticed some issue which leads to poor user experience.
I have Android Nokia phone, which does not have back button, instead it uses swipes from the edge of screen to navigate back.
So when I want for example to go back and try to swipe from left to right and start swiping close to the left screen edge, builtin Nokia swipe detection activates and this plugin also begin to swipe.
And this leads to double back and application closes. I think the solution here is will be to specify how far from edge the swipe must begin to activate navigation.
Porosal
Something like that can help
return SwipeablePageRoute(
    builder: (context) => SomePageWIdget(),
    canOnlySwipeFromEdge: true,
    backGestureDetectionWidth: 150,
    minEdgeOffset: 50 // imaginary param
);

This gives some imaginary vertical line which starts at 50 from left, have width of  100 and ends at 150 from left.
And this will prevent simultaneous activation of builtin back button and this plugin.

See this link for description
https://developer.android.com/training/gestures/gesturenav

Thanks for filing this issue (and creating the PRs!) and sorry for the delayed response.
I tried to reproduce this issue on my OnePlus phone where I also swipe from the edge to go back in every app but wasn't able to reproduce this problem. When swiping from the edge, the OS detects this gesture directly and Flutter doesn't receive pointer events at all, hence only one back navigation is performed.
I can still include the suggested minEdgeOffset parameter, but it should be used with care: Its value has to precisely match the OS configuration to avoid the problem you mentioned while not creating a gap between the OS's and app's gesture detection areas. Also, the behavior apparently differs between devices…

This is really strange. I my nokia I have stock android. Maybe your phone have another implementation of this feature... I will try to make a video of this issue


Improve developer documentation in readme

Also adds a stub page in the documentation for contributors to use as a starting point.

Coverage remained the same at 88.494% when pulling 1c53bc4c882c431a262308f91ff60f368506a2cf on abutterworth/development-doc-update into a1b66265ac99d3523fce9b32994513f7365f4a43 on master.


Please add Lynnwood, WA

Email addresses:
<EMAIL_ADDRESS><EMAIL_ADDRESS><EMAIL_ADDRESS><EMAIL_ADDRESS><EMAIL_ADDRESS><EMAIL_ADDRESS><EMAIL_ADDRESS><EMAIL_ADDRESS>Message:
Dear Lynnwood City Leadership,
My name is [YOUR NAME] and I am a resident of [YOUR DISTRICT]. I am writing to demand that the City Council adopt a People’s Budget that prioritizes community wellbeing and redirects funding away from the police.
We are in the midst of widespread upheaval over the systemic violence of policing, embodied by the well documented history of police murdering Black people. I will no longer accept empty gestures and suggestions of “reform.” I am  demanding that my voice be heard now, and that real change be made to the way this city allocates its resources.
In the 2019-2020 annual budget, the Lynnwood Police Department was granted $43,868,774, with an adopted budget of $22,811,762 in 2020. In contrast, community development was allocated a total of $3,611,495. Further, diversity efforts were not properly funded in the 2019-2020 budget, as a total of $50,000 was allocated to be split amongst the Parks and Recreation board, History and Heritage, and the Diversity, Equity, and Inclusion Commission.
This pandemic has had severe economic consequences including high unemployment causing many people to be unable to pay rent.  Support for communities in need is necessary now, more than ever. In order to address this, funds must be diverted from the police department, as this money can be spent in other ways that are proven to be more effective in improving community safety and wellness.
I demand that the City Council reduce the budget allocated to the Lynnwood Police Department. I join the calls of those across the country to defund the police. I demand a budget that adequately and effectively meets the needs of those who are at risk in Lynnwood. I demand a budget that supports community wellbeing, rather than empowers the police forces that tear them apart.
Thank you for your time,
[YOUR NAME]
[YOUR ADDRESS]
[YOUR EMAIL]
[YOUR PHONE NUMBER]

Thank you for submitting your city to defund12.org! Your request is now in the queue for review and publishing. We’ll reply here if we have any questions.

Edited Email Copy
Made one slight grammatical edit.

Email addresses:
<EMAIL_ADDRESS><EMAIL_ADDRESS><EMAIL_ADDRESS><EMAIL_ADDRESS><EMAIL_ADDRESS><EMAIL_ADDRESS><EMAIL_ADDRESS><EMAIL_ADDRESS>Message:
Dear Lynnwood City Leadership,
My name is [YOUR NAME] and I am a resident of [YOUR DISTRICT]. I am writing to demand that the City Council adopt a People’s Budget that prioritizes community wellbeing and redirects funding away from the police.
We are in the midst of widespread upheaval over the systemic violence of policing, embodied by the well-documented history of police murdering Black people. I will no longer accept empty gestures and suggestions of “reform.” I am demanding that my voice be heard now, and that real change be made to the way this city allocates its resources.
In the 2019-2020 annual budget, the Lynnwood Police Department was granted $43,868,774, with an adopted budget of $22,811,762 in 2020. In contrast, community development was allocated a total of $3,611,495. Further, diversity efforts were not properly funded in the 2019-2020 budget, as a total of $50,000 was allocated to be split amongst the Parks and Recreation board, History and Heritage, and the Diversity, Equity, and Inclusion Commission.
This pandemic has had severe economic consequences including high unemployment causing many people to be unable to pay rent. Support for communities in need is necessary now, more than ever. In order to address this, funds must be diverted from the police department, as this money can be spent in other ways that are proven to be more effective in improving community safety and wellness.
I demand that the City Council reduce the budget allocated to the Lynnwood Police Department. I join the calls of those across the country to defund the police. I demand a budget that adequately and effectively meets the needs of those who are at risk in Lynnwood. I demand a budget that supports community wellbeing, rather than empowers the police forces that tear them apart.
Thank you for your time,
[YOUR NAME]
[YOUR ADDRESS]
[YOUR EMAIL]
[YOUR PHONE NUMBER]

This is ready for pr

on it


Initial pass at persisting events

TODO

[x] Persist events for Mysteries
[ ] Persist events for World Explore
[ ] Implement reset button for Mystery events
[ ] Implement reset button for World Explore events
[ ] Error handling
[ ] Support un-authenticated participation / do not persist events for non-authed users

Re-opening for auto-prs


Compilation issues

Seqence:
go mod vendor
go mod vendor: pattern ng/dist/ng: no matching files found

the reason is that the vendor/github.com/fullstack-lang/gong is empty and therefore ng build cannot process
there is a circular dependency:

availability of vendor/github.com/fullstack-lang/gong depends on correct execution of go mod vendor
go mod vendor depends on correct execution of ng build
ng build depends on availability of vendor/github.com/fullstack-lang/gong

go mod vendor can be executed  with -e

Not at all, the problem was that gongdoc did not import correctl
_ "github.com/fullstack-lang/gong/"

instead of
_ "github.com/fullstack-lang/gong/ng"


some error with package electron-store

link1
Hello, There are some error when  package with electron-store like  above,how can i fix it?Thanks.

https://github.com/chentsulin/electron-react-boilerplate/issues/1323#issuecomment-349220401