Error with identifiers with '/'

Describe the bug
If the history is added to a model, which allows to have in his primary key a '/' this does store the history correctly in the database, but when trying to access the history of this through the Django administration panel if the object identifier has a '/' character it returns an error.
To Reproduce
Steps to reproduce the behavior:

Generate a model which allows us to add the value of the primary key and that it has a history. For example:

class Test(models.Model):
    id = models.CharField(max_length=256, null=False, primary_key=True)
    last_seen = models.DateTimeField(null=True)
    history = HistoricalRecords()

    def __str__(self):
        return str(self.machine_id)

Add the ability to display the history in the Django admin panel

admin_site.register(Test, SimpleHistoryAdmin)

Add an element which has a '/' in its id, for example: dsfSERGserfseRFSREE/DFEWdfawer34
Modify this element to generate a history.
Attempt to access the history and you get the error:

Internal Server Error: /admin/pr_test/test/dsfSERGserfseRFSREE_2FDFEWdfawer34/history/\n","stream":"stderr","time":"2024-01-19T10:51:46.594236044Z
Traceback (most recent call last):\n","stream":"stderr","time":"2024-01-19T10:51:46.594303279Z
  File \"/usr/local/lib/python3.8/site-packages/django/core/handlers/exception.py\", line 55, in inner\n","stream":"stderr","time":"2024-01-19T10:51:46.594311074Z
    response = get_response(request)\n","stream":"stderr","time":"2024-01-19T10:51:46.594318267Z
  File \"/usr/local/lib/python3.8/site-packages/django/core/handlers/base.py\", line 197, in _get_response\n","stream":"stderr","time":"2024-01-19T10:51:46.594324411Z
    response = wrapped_callback(request, *callback_args, **callback_kwargs)\n","stream":"stderr","time":"2024-01-19T10:51:46.594331416Z
  File \"/usr/local/lib/python3.8/site-packages/django/contrib/admin/options.py\", line 688, in wrapper\n","stream":"stderr","time":"2024-01-19T10:51:46.594337845Z
    return self.admin_site.admin_view(view)(*args, **kwargs)\n","stream":"stderr","time":"2024-01-19T10:51:46.594344355Z
  File \"/usr/local/lib/python3.8/site-packages/django/utils/decorators.py\", line 134, in _wrapper_view\n","stream":"stderr","time":"2024-01-19T10:51:46.594350491Z
    response = view_func(request, *args, **kwargs)\n","stream":"stderr","time":"2024-01-19T10:51:46.594356809Z
  File \"/usr/local/lib/python3.8/site-packages/django/views/decorators/cache.py\", line 62, in _wrapper_view_func\n","stream":"stderr","time":"2024-01-19T10:51:46.594362856Z
    response = view_func(request, *args, **kwargs)\n","stream":"stderr","time":"2024-01-19T10:51:46.594369347Z
  File \"/usr/local/lib/python3.8/site-packages/django/contrib/admin/sites.py\", line 242, in inner\n","stream":"stderr","time":"2024-01-19T10:51:46.594375418Z
    return view(request, *args, **kwargs)\n","stream":"stderr","time":"2024-01-19T10:51:46.59438185Z
  File \"/usr/local/lib/python3.8/site-packages/simple_history/admin.py\", line 96, in history_view\n","stream":"stderr","time":"2024-01-19T10:51:46.594387882Z
    return self.render_history_view(\n","stream":"stderr","time":"2024-01-19T10:51:46.594394433Z
  File \"/usr/local/lib/python3.8/site-packages/simple_history/admin.py\", line 223, in render_history_view\n","stream":"stderr","time":"2024-01-19T10:51:46.594400408Z
    return render(request, template, context, **kwargs)\n","stream":"stderr","time":"2024-01-19T10:51:46.59443811Z
  File \"/usr/local/lib/python3.8/site-packages/django/shortcuts.py\", line 24, in render\n","stream":"stderr","time":"2024-01-19T10:51:46.594444819Z
    content = loader.render_to_string(template_name, context, request, using=using)\n","stream":"stderr","time":"2024-01-19T10:51:46.594451161Z
  File \"/usr/local/lib/python3.8/site-packages/django/template/loader.py\", line 62, in render_to_string\n","stream":"stderr","time":"2024-01-19T10:51:46.594457263Z
    return template.render(context, request)\n","stream":"stderr","time":"2024-01-19T10:51:46.594468459Z
  File \"/usr/local/lib/python3.8/site-packages/django/template/backends/django.py\", line 61, in render\n","stream":"stderr","time":"2024-01-19T10:51:46.59447437Z
    return self.template.render(context)\n","stream":"stderr","time":"2024-01-19T10:51:46.594483292Z
  File \"/usr/local/lib/python3.8/site-packages/django/template/base.py\", line 175, in render\n","stream":"stderr","time":"2024-01-19T10:51:46.594489332Z
    return self._render(context)\n","stream":"stderr","time":"2024-01-19T10:51:46.594495627Z
  File \"/usr/local/lib/python3.8/site-packages/django/template/base.py\", line 167, in _render\n","stream":"stderr","time":"2024-01-19T10:51:46.594506403Z
    return self.nodelist.render(context)\n","stream":"stderr","time":"2024-01-19T10:51:46.594512874Z
  File \"/usr/local/lib/python3.8/site-packages/django/template/base.py\", line 1005, in render\n","stream":"stderr","time":"2024-01-19T10:51:46.594518863Z
    return SafeString(\"\".join([node.render_annotated(context) for node in self]))\n","stream":"stderr","time":"2024-01-19T10:51:46.594525465Z
  File \"/usr/local/lib/python3.8/site-packages/django/template/base.py\", line 1005, in \u003clistcomp\u003e\n","stream":"stderr","time":"2024-01-19T10:51:46.594531886Z
    return SafeString(\"\".join([node.render_annotated(context) for node in self]))\n","stream":"stderr","time":"2024-01-19T10:51:46.594538929Z
  File \"/usr/local/lib/python3.8/site-packages/django/template/base.py\", line 966, in render_annotated\n","stream":"stderr","time":"2024-01-19T10:51:46.594545255Z
    return self.render(context)\n","stream":"stderr","time":"2024-01-19T10:51:46.59456309Z
  File \"/usr/local/lib/python3.8/site-packages/django/template/loader_tags.py\", line 157, in render\n","stream":"stderr","time":"2024-01-19T10:51:46.59457142Z
    return compiled_parent._render(context)\n","stream":"stderr","time":"2024-01-19T10:51:46.594578125Z
  File \"/usr/local/lib/python3.8/site-packages/django/template/base.py\", line 167, in _render\n","stream":"stderr","time":"2024-01-19T10:51:46.594584301Z
    return self.nodelist.render(context)\n","stream":"stderr","time":"2024-01-19T10:51:46.594590697Z
  File \"/usr/local/lib/python3.8/site-packages/django/template/base.py\", line 1005, in render\n","stream":"stderr","time":"2024-01-19T10:51:46.594596619Z
    return SafeString(\"\".join([node.render_annotated(context) for node in self]))\n","stream":"stderr","time":"2024-01-19T10:51:46.594602818Z
  File \"/usr/local/lib/python3.8/site-packages/django/template/base.py\", line 1005, in \u003clistcomp\u003e\n","stream":"stderr","time":"2024-01-19T10:51:46.594609067Z
    return SafeString(\"\".join([node.render_annotated(context) for node in self]))\n","stream":"stderr","time":"2024-01-19T10:51:46.594615642Z
  File \"/usr/local/lib/python3.8/site-packages/django/template/base.py\", line 966, in render_annotated\n","stream":"stderr","time":"2024-01-19T10:51:46.594621793Z
    return self.render(context)\n","stream":"stderr","time":"2024-01-19T10:51:46.594628113Z
  File \"/usr/local/lib/python3.8/site-packages/django/template/loader_tags.py\", line 157, in render\n","stream":"stderr","time":"2024-01-19T10:51:46.594639962Z
    return compiled_parent._render(context)\n","stream":"stderr","time":"2024-01-19T10:51:46.594646541Z
  File \"/usr/local/lib/python3.8/site-packages/django/template/base.py\", line 167, in _render\n","stream":"stderr","time":"2024-01-19T10:51:46.59465251Z
    return self.nodelist.render(context)\n","stream":"stderr","time":"2024-01-19T10:51:46.59465887Z
  File \"/usr/local/lib/python3.8/site-packages/django/template/base.py\", line 1005, in render\n","stream":"stderr","time":"2024-01-19T10:51:46.594664857Z
    return SafeString(\"\".join([node.render_annotated(context) for node in self]))\n","stream":"stderr","time":"2024-01-19T10:51:46.59467116Z
  File \"/usr/local/lib/python3.8/site-packages/django/template/base.py\", line 1005, in \u003clistcomp\u003e\n","stream":"stderr","time":"2024-01-19T10:51:46.594678265Z
    return SafeString(\"\".join([node.render_annotated(context) for node in self]))\n","stream":"stderr","time":"2024-01-19T10:51:46.594684656Z
  File \"/usr/local/lib/python3.8/site-packages/django/template/base.py\", line 966, in render_annotated\n","stream":"stderr","time":"2024-01-19T10:51:46.594690906Z
    return self.render(context)\n","stream":"stderr","time":"2024-01-19T10:51:46.594698191Z
  File \"/usr/local/lib/python3.8/site-packages/django/template/loader_tags.py\", line 157, in render\n","stream":"stderr","time":"2024-01-19T10:51:46.594707931Z
    return compiled_parent._render(context)\n","stream":"stderr","time":"2024-01-19T10:51:46.594714342Z
  File \"/usr/local/lib/python3.8/site-packages/django/template/base.py\", line 167, in _render\n","stream":"stderr","time":"2024-01-19T10:51:46.594720984Z
    return self.nodelist.render(context)\n","stream":"stderr","time":"2024-01-19T10:51:46.594727348Z
  File \"/usr/local/lib/python3.8/site-packages/django/template/base.py\", line 1005, in render\n","stream":"stderr","time":"2024-01-19T10:51:46.594733256Z
    return SafeString(\"\".join([node.render_annotated(context) for node in self]))\n","stream":"stderr","time":"2024-01-19T10:51:46.594739582Z
  File \"/usr/local/lib/python3.8/site-packages/django/template/base.py\", line 1005, in \u003clistcomp\u003e\n","stream":"stderr","time":"2024-01-19T10:51:46.594745781Z
    return SafeString(\"\".join([node.render_annotated(context) for node in self]))\n","stream":"stderr","time":"2024-01-19T10:51:46.59475243Z
  File \"/usr/local/lib/python3.8/site-packages/django/template/base.py\", line 966, in render_annotated\n","stream":"stderr","time":"2024-01-19T10:51:46.594758504Z
    return self.render(context)\n","stream":"stderr","time":"2024-01-19T10:51:46.594764792Z
  File \"/usr/local/lib/python3.8/site-packages/django/template/loader_tags.py\", line 63, in render\n","stream":"stderr","time":"2024-01-19T10:51:46.594770615Z
    result = block.nodelist.render(context)\n","stream":"stderr","time":"2024-01-19T10:51:46.594776952Z
  File \"/usr/local/lib/python3.8/site-packages/django/template/base.py\", line 1005, in render\n","stream":"stderr","time":"2024-01-19T10:51:46.594782926Z
    return SafeString(\"\".join([node.render_annotated(context) for node in self]))\n","stream":"stderr","time":"2024-01-19T10:51:46.59479004Z
  File \"/usr/local/lib/python3.8/site-packages/django/template/base.py\", line 1005, in \u003clistcomp\u003e\n","stream":"stderr","time":"2024-01-19T10:51:46.594796172Z
    return SafeString(\"\".join([node.render_annotated(context) for node in self]))\n","stream":"stderr","time":"2024-01-19T10:51:46.594802738Z
  File \"/usr/local/lib/python3.8/site-packages/django/template/base.py\", line 966, in render_annotated\n","stream":"stderr","time":"2024-01-19T10:51:46.594808922Z
    return self.render(context)\n","stream":"stderr","time":"2024-01-19T10:51:46.594820218Z
  File \"/usr/local/lib/python3.8/site-packages/django/template/defaulttags.py\", line 321, in render\n","stream":"stderr","time":"2024-01-19T10:51:46.594826187Z
    return nodelist.render(context)\n","stream":"stderr","time":"2024-01-19T10:51:46.594832646Z
  File \"/usr/local/lib/python3.8/site-packages/django/template/base.py\", line 1005, in render\n","stream":"stderr","time":"2024-01-19T10:51:46.594838597Z
    return SafeString(\"\".join([node.render_annotated(context) for node in self]))\n","stream":"stderr","time":"2024-01-19T10:51:46.594844827Z
  File \"/usr/local/lib/python3.8/site-packages/django/template/base.py\", line 1005, in \u003clistcomp\u003e\n","stream":"stderr","time":"2024-01-19T10:51:46.594850999Z
    return SafeString(\"\".join([node.render_annotated(context) for node in self]))\n","stream":"stderr","time":"2024-01-19T10:51:46.594857525Z
  File \"/usr/local/lib/python3.8/site-packages/django/template/base.py\", line 966, in render_annotated\n","stream":"stderr","time":"2024-01-19T10:51:46.594863561Z
    return self.render(context)\n","stream":"stderr","time":"2024-01-19T10:51:46.594871037Z
  File \"/usr/local/lib/python3.8/site-packages/django/template/library.py\", line 278, in render\n","stream":"stderr","time":"2024-01-19T10:51:46.594877195Z
    return t.render(new_context)\n","stream":"stderr","time":"2024-01-19T10:51:46.594883577Z
  File \"/usr/local/lib/python3.8/site-packages/django/template/base.py\", line 177, in render\n","stream":"stderr","time":"2024-01-19T10:51:46.594889509Z
    return self._render(context)\n","stream":"stderr","time":"2024-01-19T10:51:46.594895776Z
  File \"/usr/local/lib/python3.8/site-packages/django/template/base.py\", line 167, in _render\n","stream":"stderr","time":"2024-01-19T10:51:46.594901789Z
    return self.nodelist.render(context)\n","stream":"stderr","time":"2024-01-19T10:51:46.594908202Z
  File \"/usr/local/lib/python3.8/site-packages/django/template/base.py\", line 1005, in render\n","stream":"stderr","time":"2024-01-19T10:51:46.594914084Z
    return SafeString(\"\".join([node.render_annotated(context) for node in self]))\n","stream":"stderr","time":"2024-01-19T10:51:46.59492026Z
  File \"/usr/local/lib/python3.8/site-packages/django/template/base.py\", line 1005, in \u003clistcomp\u003e\n","stream":"stderr","time":"2024-01-19T10:51:46.594926419Z
    return SafeString(\"\".join([node.render_annotated(context) for node in self]))\n","stream":"stderr","time":"2024-01-19T10:51:46.594932741Z
  File \"/usr/local/lib/python3.8/site-packages/django/template/base.py\", line 966, in render_annotated\n","stream":"stderr","time":"2024-01-19T10:51:46.594938893Z
    return self.render(context)\n","stream":"stderr","time":"2024-01-19T10:51:46.594945405Z
  File \"/usr/local/lib/python3.8/site-packages/django/template/defaulttags.py\", line 238, in render\n","stream":"stderr","time":"2024-01-19T10:51:46.594951335Z
    nodelist.append(node.render_annotated(context))\n","stream":"stderr","time":"2024-01-19T10:51:46.594957729Z
  File \"/usr/local/lib/python3.8/site-packages/django/template/base.py\", line 966, in render_annotated\n","stream":"stderr","time":"2024-01-19T10:51:46.594963697Z
    return self.render(context)\n","stream":"stderr","time":"2024-01-19T10:51:46.594969921Z
  File \"/usr/local/lib/python3.8/site-packages/django/template/defaulttags.py\", line 471, in render\n","stream":"stderr","time":"2024-01-19T10:51:46.594975724Z
    url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app)\n","stream":"stderr","time":"2024-01-19T10:51:46.594982098Z
  File \"/usr/local/lib/python3.8/site-packages/django/urls/base.py\", line 88, in reverse\n","stream":"stderr","time":"2024-01-19T10:51:46.594989168Z
    return resolver._reverse_with_prefix(view, prefix, *args, **kwargs)\n","stream":"stderr","time":"2024-01-19T10:51:46.594992871Z
  File \"/usr/local/lib/python3.8/site-packages/django/urls/resolvers.py\", line 828, in _reverse_with_prefix\n","stream":"stderr","time":"2024-01-19T10:51:46.594994852Z
    raise NoReverseMatch(msg)\n","stream":"stderr","time":"2024-01-19T10:51:46.594996882Z
django.urls.exceptions.NoReverseMatch: Reverse for 'pr_test_test_simple_history' with arguments '('dsfSERGserfseRFSREE/DFEWdfawer34', 2)' not found. 1 pattern(s) tried: ['admin/pr_test/test/([^/]+)/history/([^/]+)/$']\n","stream":"stderr","time":"2024-01-19T10:51:46.594998804Z
[19/Jan/2024 10:51:46] \"GET /admin/pr_test/test/dsfSERGserfseRFSREE_2FDFEWdfawer34/history/ HTTP/1.1\" 500 592490\n","stream":"stderr","time":"2024-01-19T10:51:46.59500174Z

Expected behavior
It is expected to display the history of elements, as it does for elements that do not have the '/' character.
Environment (please complete the following information):

OS: Ubuntu 22.04.3 LTS
Django Simple History Version: 3.4.0
Django Version: 4.2.7

Additional context
With elements that do not contain '/' it works without any problem.

This error occurs while rendering object URL with primary key in Change History view. This line causes the issue.
Since, primary key contains "/" which is a reserved character in URLs, somehow the object.pk needs to be URL encoded.
I was able to fix this issue using admin_urlquote filter on object.pk. However, it breaks history form view as it receives encoded value in object id and object does not exist with this value.


Allow user comments for wiki pages

Add the ability for users to place comments on wiki pages, in order to make the wiki a more 'collaborative' experience.
On the frontend, comments could be placed at the bottom of the page, under the 'Child Pages' section, perhaps.

Done for now.


Bring new "compare view" capability into KnowledgeVis repository

Bring the improvements to add a comparison view to this repository via PR.
These changes consist of two main components:

Updating the Vue code throughout to support loading multiple scans simultaneously.

Currently MIQA can display multiple views of the same image but not multiple views of different views.

The CompareScans view which provides the interface the end user interacts with.

Once the undergirding changes are made the CompareScans view is relatively straightforward.

This code already exists in https://github.com/davidshq/miqa. It just needs to be pulled into this repo. Ideally this would occur after we have completed merging of the dynamic settings code, see https://github.com/knowledgevis/miqa-annotate/issues/4

The branch for CompareScans is https://github.com/davidshq/miqa/tree/compare-view
The older branch from which this is pulled is https://github.com/davidshq/miqa/tree/ts-migrate-off-edit
The Vuex changes have been made as well as most other changes throughout. There is still a need for further refinement of CompareScans.
The branch on which CompareScans started had updated to the latest Vuetify components at the time. Unfortunately, some of the components that replaced deprecated components don't display quite the same and this causes significant layout shift. It is quite difficult to merge the overall code base with the Vuetify changes without significant risk.
At this point it's my recommendation that we stick with the Vuetify as it is in the other branches and then do a separate round of edits (with more Playwright testing to catch layout shifts) to update Vuetify.
The end result of all this is that the CompareScans as found in the compare-view branch uses the updated styling while the rest uses the older styling and this causes CompareScans to behave unexpectedly (e.g. right now once one selects a single scan the viewer fills the entire viewport).
Note: Vuetify has since released a major version upgrade (that requires Vue 3). The version the older branch updated was still on the previous release of Vuetify. It may be worthwhile looking at upgrading the entire project to Vue 3 and the latest Vuetify (or shifting to another framework if desired).


Mobile UI

Styling only works for desktop browser screen sizes just now, customers may wish to use on a mobile device browser

Not planned; project deprecated in favour of Operations Console


Must-run CHPs should be dispatchable with the remainder of their capacity

One (known) shortcoming of the way we currently treat must-run CHPs in the ETM is that they are completely dominated by their production profile. This profile describes the demand for heat (not explicitly modeled in the ETM).
In reality, however, must-run CHPs will produce electricity whenever they can make money (just like other dispatchable plants). The problem of not modeling this behavior is that the ETM under-estimates the available dispatchable capacity and Merit will calculate electricity 'prices' that are too high.
In other words, the must-run profiles should describe when the plant runs but not when it doesn't run.
@antw can you make an estimate of the complexity of implementing this and how much time it would take a brilliant developer (you) to do that?

@antw can you make an estimate of how much time would be needed?

Closing, no longer applicable now that CHPs are fully dispatchable in Merit


Question about ResNet pretrained model

Thank you for your research!
I have a question, when I look at the code, there are ResNet-50 pretrained weights for places dataset and gldv2 dataset, but which ResNet-50 pretrained backbone did you use for ResNet-50 + GeM (Ours w/o reranking) performance in the main paper table 6?

for training global retrieval model (ResNet-50 + GeM pool), the dimension of feature is 1024?

Can you directly run the code? The implementation of ResNet50+GeM is also included in the code. And the first stage training is based on the Geo-localization benchmark repo. Use backbone="resnet50" in the command.


WebSockets on Android

Hi!
I work for Crossbar.io, the main sponsor of Autobahn libraries. We are working on autobahn-java. For headless our autobahn-java is based on Netty's websocket APIs that works fine as it should.
For Android I want to know if Netty is the right choice i.e. is Netty's WebSocket implementation officially supported on Android ? I ask this because I found some old stackoverflow discussions that talked about issues of Netty on Android, though that was from 2014. How is the situtation today, is it recommended to base our work off Netty for Android ?
PS: I did do some basic testing and Netty's WebSocket seems to work fine on Android but some official words from the Netty project would be very assuring.

We generally don't target the Android platform, so I wouldn't say its officially supported. However we do get issues from time to time related to Netty on Android and when reasonable we fix them and may file issues if appropriate. We have a few contributors that maybe able to say more on the topic (/cc @ejona86 @carl-mastrangelo @nmittler).

I've seen it work without much hassle. Android is quite different from OpenJDK in terms of I/O, allocations, and TLS, so Netty is sort of tuned opposite of what is best for Android. It seems like WebSockets are supported with OkHttp; that's probably what I'd be more inclined to go with on Android.

Let me close this since this is not a Netty issue ... feel free to continue discussion though


Support codeAction kind documentation in CodeActionOptions

currently, CodeActionOptions only supports declaring code action kinds LS supports. - https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#codeActionOptions
but host such as vscode supports not only kinds, but also documentation per kind as you can see here
export interface CodeActionProviderMetadata {
    /**
     * List of {@link CodeActionKind CodeActionKinds} that a {@link CodeActionProvider} may return.
     *
     * This list is used to determine if a given `CodeActionProvider` should be invoked or not.
     * To avoid unnecessary computation, every `CodeActionProvider` should list use `providedCodeActionKinds`. The
     * list of kinds may either be generic, such as `[CodeActionKind.Refactor]`, or list out every kind provided,
     * such as `[CodeActionKind.Refactor.Extract.append('function'), CodeActionKind.Refactor.Extract.append('constant'), ...]`.
     */
    readonly providedCodeActionKinds?: readonly CodeActionKind[];

    /**
     * Static documentation for a class of code actions.
     *
     * Documentation from the provider is shown in the code actions menu if either:
     *
     * - Code actions of `kind` are requested by the editor. In this case, the editor will show the documentation that
     *   most closely matches the requested code action kind. For example, if a provider has documentation for
     *   both `Refactor` and `RefactorExtract`, when the user requests code actions for `RefactorExtract`,
     *   the editor will use the documentation for `RefactorExtract` instead of the documentation for `Refactor`.
     *
     * - Any code actions of `kind` are returned by the provider.
     *
     * At most one documentation entry will be shown per provider.
     */
    readonly documentation?: ReadonlyArray<{
        /**
         * The kind of the code action being documented.
         *
         * If the kind is generic, such as `CodeActionKind.Refactor`, the documentation will be shown whenever any
         * refactorings are returned. If the kind if more specific, such as `CodeActionKind.RefactorExtract`, the
         * documentation will only be shown when extract refactoring code actions are returned.
         */
        readonly kind: CodeActionKind;

        /**
         * Command that displays the documentation to the user.
         *
         * This can display the documentation directly in the editor or open a website using {@linkcode env.openExternal};
         *
         * The title of this documentation code action is taken from {@linkcode Command.title}
         */
        readonly command: Command;
    }>;
}

it would be nice to add this ability to LSP spec so other LS can do what LS such as TS does

Added to spec and node libs


@W-15621253 Initial Store Locator Implementation

Description
W-15621253
This is the initial Store Locator implementation, which is without pagination and linking of geolocation web API. The initial implementation includes:

the handling of manual geolocation input
default country and postal code and user specified store locator countries
the listing of corresponding stores sorted by distance away
mobile view
a store locator page, on top of the modal, that can be navigated to via URL for SEO

The PR will merge into a store locator base branch, to which subsequent PRs will be merged until the store locator is ready for shipping. Subsequent PRs will link the geolocation web API to the store locator and enable pagination for the store locator.
Types of Changes

[ ] Bug fix (non-breaking change that fixes an issue)
[x] New feature (non-breaking change that adds functionality)
[ ] Documentation update
[ ] Breaking change (could cause existing functionality to not work as expected)
[ ] Other changes (non-breaking changes that does not fit any of the above)

Breaking changes include:

Removing a public function or component or prop
Adding a required argument to a function
Changing the data type of a function parameter or return value
Adding a new peer dependency to package.json

Changes

(change1) Implemented initial store locator page and modal
(change2) Linked the existing store locator link in the footer to the page
(change3) Added store locator icon at the header

How to Test-Drive This PR

(step1) Ensure all tests pass with npm run test
(step 2) Go to https://aaa-jeremy-retail-react-app.mobify-storefront-staging.com/ and click on the store icon on the top right of the page to open store locator modal
(step 3) See that the list of stores are sorted by distance away
(step 4) See that clicking View More opens an accordion to view store hours, if specified
(step 4) Change location to Country: United States, Postal Code: 94086, and see that new stores are now listed
(step 5) Close the modal, and then change the language of the site by clicking on a new locale in the footer of the app, e.g. German
(step 6) Open the store locator again and see that the store locator is translated
(step 7) Go to https://aaa-jeremy-retail-react-app.mobify-storefront-staging.com/store-locator for the page version of the store locator

Checklists

General

[x] Changes are covered by test cases
[ ] CHANGELOG.md updated with a short description of changes (not required for documentation updates)

Accessibility Compliance
You must check off all items in one of the follow two lists:

[ ] There are no changes to UI

or...

[x] Changes were tested with a Screen Reader (iOS VoiceOver or Android Talkback) and had no issues
[ ] Changes comply with WCAG 2.0 guidelines levels A and AA
[ ] Changes to common UI patterns and interactions comply with WAI-ARIA best practices

Localization

[x] Changes include a UI text update in the Retail React App (which requires translation)

@jeremy-jung1 FYI I've left some comments. But I see that you've just made new code changes. I'll review them later at another time.

Before deleting the translations in this PR for professional translation, I took a screenshot of German locale store locator to show that the store locator is translatable.

Not a part of this ticket, but I would be interested in seeing how we handle saving the shopper's selected store in the future since it might have some implication on hybrid (ie. how do we share the selected store from PWA to SFRA?).
Could you loop me in once we get to that part of the epic?


Working with lists

In regard to the addition of JsonList and the following comment:

kochol commented on 5f7f50
I think maybe you should ask beefy about list problem maybe he knows a solution or add a solution to Beef

I will open a discussion on the Beef repository, maybe there's a reason for not giving reflection capabilities to corelib types.
The end goal is to be able to use any kind of type that derives from List or Array if possible. So with the language's evolution there might not be any more use for that JsonList class, hence why I will not add more functionalities to it. So it can be easily be swapped with the List class in the future.

Next versions of Beef should give better feature to add reflection to corelib types.

Reflection to List type have been added.


Atomic commit failed (pageflip): Invalid argument

Hi, I need help with an issue. I use swayidle to turn off the displays at idle. During the time when displays are turned off, I see "Atomic commit failed (pageflip): Invalid argument" being logged once per display every 5 seconds flooding the logs. When  displays are resumed, they turn on fine and the messages stop.
 If these needs to be from the same time interval, please let me know.

Can you do this from a TTY:
echo 0xFE | sudo tee /sys/module/drm/parameters/debug # Enable verbose DRM logging
sudo dmesg -C
dmesg -f >dmesg.log & # Continuously write DRM logs to a file
sway -d >sway.log 2>&1 # Reproduce the bug as fast as possible, ideally with a script called from the config file, then exit sway without moving the mouse
fg # Kill dmesg with Ctrl+C
echo 0x00 | sudo tee /sys/module/drm/parameters/debug

Yes, please find attached.
sway.log
dmesg.log
Note, I was getting error 'dmesg: option requires an argument -- 'f''. So, I changed this to be:
dmesg -w -f kern,user >dmesg.log &

If this does not have all the information you were looking to review, please let me know.

I think I'm also experiencing the same issue. This results in my entire file system becoming used up pretty quickly (I've had to delete log files three times this week).

None of the dmesg traces submitted have captured the cause of the failed atomic commits.

I might have a hunch over what is causing it, I'll try see if I can reproduce a minimal test case this weekend. Is there anything else I can take a look at to help out @emersion ?

See this page to obtain DRM logs: https://github.com/swaywm/wlroots/wiki/DRM-Debugging
Please try to repro using wlroots and Sway master.

Probably worth pointing out that I also have a Dell XPS 13, but a newer generation:
Dell XPS 13 9380
Intel(R) Core(TM) i7-8565U CPU @ 1.80GHz
Intel Corporation UHD Graphics 620 (Whiskey Lake)
However this might just be a coincidence since it a relatively popular laptop with developers who use linux.


The app may take an OpenTURNS Python model as input

This not a bug but a feature request. In the current app, the user provides a Python data structure which defines the physical model G and the input probabilistic model of the random vector X in the problem variable. This is done in plain Python. The probabilistic model is a Python dictionary. The physical model G is a Python function defined with def. This requires to check the validity of the input provided by the user, because an arbitrary Python script is not necessarily a valid app script. For example the number of random variables must match the number of inputs of G.
def function_of_interest(X):
    E, F, L, I = X
    Y = F * L**3 / (3 * E * I)
    return [Y]

# Problem definition for the cantilever beam model
problem = {
    'num_vars': 4,
    'names': ['E', 'F', 'L', 'I'],
    'distributions': [
        {'type': 'Beta', 'params': [0.9, 3.1, 2.8e7, 4.8e7]},  # E
        {'type': 'LogNormalMuSigma', 'params': [3.0e4, 9.0e3, 15.0e3]},  # F
        {'type': 'Uniform', 'params': [250., 260.]},  # L
        {'type': 'Beta', 'params': [2.5, 4, 310., 450.]}  # I
    ]
}

model = function_of_interest

OpenTURNS provides a language to define both G and the random vector X. Therefore, the app could take a model defined in the OpenTURNS language and consider it as a valid model. This removes the need to check the model for consistency within the app : OpenTURNS will generate an exception when required. Moreover, this would make it possible to increase the number of features at minimum cost: kernel smoothing, truncated distribution, copula, etc. The next script is adapted from the original cantilever_beam.py model.
import openturns as ot

def function_of_interest(X):
    E, F, L, I = X
    Y = F * L**3 / (3 * E * I)
    return [Y]

model = ot.PythonFunction(4, 1, function_of_interest)

# Problem definition for the cantilever beam
E = ot.Beta([0.9, 3.1, 2.8e7, 4.8e7])
E.setDescrition("E")
F = ot.LogNormal()  # in N
F.setParameter(ot.LogNormalMuSigma()([300.0, 30.0, 0.0]))
F.setDescrition("F")
L = ot.Uniform([250.0, 260.0)
L.setDescrition("L")
II = ot.Beta([2.5, 4, 310.0, 450.0)
II.setDescrition("I")

R = ot.CorrelationMatrix(4)
R[2, 3] = -0.2
copula = ot.NormalCopula(
    ot.NormalCopula.GetCorrelationFromSpearmanCorrelation(R)
)
problem = ot.JointDistribution([E, F, L, II], copula)

It is not more complicated than the previous script, but is more powerful.

Amazing suggestion - thanks! I’ve struggled somewhat with understanding how to scale the app effectively in terms of adding new distributions. I’ll prioritize working on this as soon as possible.


Elasticsearch startup fails with 'failed to obtain data locks'

I've been experimenting with the azure example and am getting the above issue.
Could be related to pires/kubernetes-elasticsearch-cluster#145
apiVersion: enterprises.upmc.com/v1
kind: ElasticsearchCluster
metadata:
  name: graylog-es
spec:
  client-node-replicas: 1
  master-node-replicas: 3
  data-node-replicas: 6
  network-host: <IP_ADDRESS>
  zones: []
  data-volume-size: 10Gi
  java-options: "-Xms256m -Xmx256m"
  snapshot:
    scheduler-enabled: false
    bucket-name: elasticsnapshots99
    cron-schedule: "@every 2m"
  storage:
    storage-class: default
  resources:
    requests:
      memory: 512Mi
      cpu: 500m
    limits:
      memory: 512Mi
      cpu: '1'

Thanks for any direction you might be able to give me.

Hey @dustinchilson, this is similar to #116. Just curious what version of k8s are you running?

I was attempting on v1.8.2. I built my cluster using Azure/acs-engine from source.
I have 3 Standard_D2_v2 VMs (2 Core, 7gb ram) for nodes.
I can try a 1.7 cluster if that helps.

I tried on a v1.7.9 cluster and received the same messages.
[2017-11-07T14:33:46,911][INFO ][o.e.n.Node               ] [6b9a5f86-238f-4479-b25c-276e74d9a66e] initializing ...
[2017-11-07T14:33:47,002][WARN ][o.e.b.ElasticsearchUncaughtExceptionHandler] [6b9a5f86-238f-4479-b25c-276e74d9a66e] uncaught exception in thread [main]
org.elasticsearch.bootstrap.StartupException: java.lang.IllegalStateException: failed to obtain node locks, tried [[/data/data/myesdb]] with lock id [0]; maybe these locations are not writable or multiple nodes were started without increasing [node.max_local_storage_nodes] (was [1])?
	at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:127) ~[elasticsearch-5.3.1.jar:5.3.1]
	at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:114) ~[elasticsearch-5.3.1.jar:5.3.1]
	at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:58) ~[elasticsearch-5.3.1.jar:5.3.1]
	at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:122) ~[elasticsearch-5.3.1.jar:5.3.1]
	at org.elasticsearch.cli.Command.main(Command.java:88) ~[elasticsearch-5.3.1.jar:5.3.1]
	at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:91) ~[elasticsearch-5.3.1.jar:5.3.1]
	at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:84) ~[elasticsearch-5.3.1.jar:5.3.1]
Caused by: java.lang.IllegalStateException: failed to obtain node locks, tried [[/data/data/myesdb]] with lock id [0]; maybe these locations are not writable or multiple nodes were started without increasing [node.max_local_storage_nodes] (was [1])?
	at org.elasticsearch.env.NodeEnvironment.<init>(NodeEnvironment.java:260) ~[elasticsearch-5.3.1.jar:5.3.1]
	at org.elasticsearch.node.Node.<init>(Node.java:262) ~[elasticsearch-5.3.1.jar:5.3.1]
	at org.elasticsearch.node.Node.<init>(Node.java:242) ~[elasticsearch-5.3.1.jar:5.3.1]
	at org.elasticsearch.bootstrap.Bootstrap$6.<init>(Bootstrap.java:242) ~[elasticsearch-5.3.1.jar:5.3.1]
	at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:242) ~[elasticsearch-5.3.1.jar:5.3.1]
	at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:360) ~[elasticsearch-5.3.1.jar:5.3.1]
	at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:123) ~[elasticsearch-5.3.1.jar:5.3.1]
	... 6 more
Caused by: java.io.IOException: failed to obtain lock on /data/data/nodes/0
	at org.elasticsearch.env.NodeEnvironment.<init>(NodeEnvironment.java:239) ~[elasticsearch-5.3.1.jar:5.3.1]
	at org.elasticsearch.node.Node.<init>(Node.java:262) ~[elasticsearch-5.3.1.jar:5.3.1]
	at org.elasticsearch.node.Node.<init>(Node.java:242) ~[elasticsearch-5.3.1.jar:5.3.1]
	at org.elasticsearch.bootstrap.Bootstrap$6.<init>(Bootstrap.java:242) ~[elasticsearch-5.3.1.jar:5.3.1]
	at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:242) ~[elasticsearch-5.3.1.jar:5.3.1]
	at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:360) ~[elasticsearch-5.3.1.jar:5.3.1]
	at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:123) ~[elasticsearch-5.3.1.jar:5.3.1]
	... 6 more
Caused by: java.io.IOException: Mount point not found
	at sun.nio.fs.LinuxFileStore.findMountEntry(LinuxFileStore.java:91) ~[?:?]
	at sun.nio.fs.UnixFileStore.<init>(UnixFileStore.java:65) ~[?:?]
	at sun.nio.fs.LinuxFileStore.<init>(LinuxFileStore.java:44) ~[?:?]
	at sun.nio.fs.LinuxFileSystemProvider.getFileStore(LinuxFileSystemProvider.java:51) ~[?:?]
	at sun.nio.fs.LinuxFileSystemProvider.getFileStore(LinuxFileSystemProvider.java:39) ~[?:?]
	at sun.nio.fs.UnixFileSystemProvider.getFileStore(UnixFileSystemProvider.java:368) ~[?:?]
	at java.nio.file.Files.getFileStore(Files.java:1461) ~[?:1.8.0_121]
	at org.elasticsearch.env.ESFileStore.getMatchingFileStore(ESFileStore.java:107) ~[elasticsearch-5.3.1.jar:5.3.1]
	at org.elasticsearch.env.Environment.getFileStore(Environment.java:351) ~[elasticsearch-5.3.1.jar:5.3.1]
	at org.elasticsearch.env.NodeEnvironment$NodePath.<init>(NodeEnvironment.java:108) ~[elasticsearch-5.3.1.jar:5.3.1]
	at org.elasticsearch.env.NodeEnvironment.<init>(NodeEnvironment.java:227) ~[elasticsearch-5.3.1.jar:5.3.1]
	at org.elasticsearch.node.Node.<init>(Node.java:262) ~[elasticsearch-5.3.1.jar:5.3.1]
	at org.elasticsearch.node.Node.<init>(Node.java:242) ~[elasticsearch-5.3.1.jar:5.3.1]
	at org.elasticsearch.bootstrap.Bootstrap$6.<init>(Bootstrap.java:242) ~[elasticsearch-5.3.1.jar:5.3.1]
	at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:242) ~[elasticsearch-5.3.1.jar:5.3.1]
	at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:360) ~[elasticsearch-5.3.1.jar:5.3.1]
	at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:123) ~[elasticsearch-5.3.1.jar:5.3.1]

I think a newer elastic image should work. I'm working on that right now. Will update very soon!

Just checking in, Has there been any progress on this.
Thanks

Yup I've got good progress. Using the newer elastic image fixes, I've got a big update to support 1.8 clusters since annotations moved.

@dustinchilson I think I've got this fixed up in #123 If you want to test sooner here are the relevant images:

upmcenterprises/elasticsearch-operator:0.0.10-beta
upmcenterprises/docker-elasticsearch-kubernetes:5.6.4_1

Also, I've had issues running in minikube, but this works fine in a regular cluster (AWS or Bare Metal)


Strange result while generating Bitcoin addresses with multithread

I am to check the performance of Bitcoin address generation with NBitcoin with following code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using NBitcoin;

namespace Multithread_Bitcoin_Address_Generation
{
    class Program
    {
        static void Main(string[] args)
        {
            int _num_of_threads = 16;

            Thread[] _address_generation_threads = new Thread[_num_of_threads];

            int _start_tick = Environment.TickCount;

            //Creating and starting Bitcoi address generation threads
            for (int i = 0; i < _num_of_threads; i++)
            {
                int _local_i = i;
                Address_Generation_Class _address_gen_cls = new Address_Generation_Class();
                _address_generation_threads[_local_i] = new Thread(() => _address_gen_cls.Generate_Many_Bitcoin_Addresses());
                _address_generation_threads[_local_i].Start();
            }
            //Waiting until all threads finished
            for (int i = 0; i < _num_of_threads; i++)
            {
                _address_generation_threads[i].Join();
            }
            int _end_tick = Environment.TickCount;

            Console.WriteLine("It took " + (_end_tick - _start_tick).ToString() + " miliseconds to generate " + (_num_of_threads * 50000).ToString() +
                " addresses with " + _num_of_threads.ToString() + " threads, means " +
                ((float)(_num_of_threads * 50000) / ((_end_tick - _start_tick) / 1000)).ToString() + " Bitcoin address per second.");
            Console.ReadKey();

        }

    }

    class Address_Generation_Class
    {
        public void Generate_Many_Bitcoin_Addresses()
        {
            byte[] _temp_byte_array = new byte[32];
            (new Random()).NextBytes(_temp_byte_array);

            for (int i = 0; i < 50000; i++)
            {
                Key _private_key = new Key(_temp_byte_array);
                //_private_key.FromBytes(_temp_byte_array);
                string _temp_bt_address_string = _private_key.PubKey.GetAddress(ScriptPubKeyType.SegwitP2SH, Network.Main).ToString();
            }
        }
    }
}

Only when I created 16 threads my 100% of CPU is consumed, but I got following results when I increased the threads:
It took 13860 miliseconds to generate 50000 addresses with 1 threads, means 3846.154 Bitcoin address per second.

It took 14563 miliseconds to generate 100000 addresses with 2 threads, means 7142.857 Bitcoin address per second.

It took 24484 miliseconds to generate 200000 addresses with 4 threads, means 8333.333 Bitcoin address per second.

It took 25562 miliseconds to generate 300000 addresses with 6 threads, means 12000 Bitcoin address per second.

It took 37968 miliseconds to generate 400000 addresses with 8 threads, means 10810.81 Bitcoin address per second.

It took 90266 miliseconds to generate 800000 addresses with 16 threads, means 8888.889 Bitcoin address per second.

It took 253547 miliseconds to generate 1600000 addresses with 32 threads, means 6324.111 Bitcoin address per second.

You can see from above results that address generation performance is at max when 6 threads is created while at 6 threads only 60% of CPU is consumed?

What's the question?

What's the question?

How can I generate as many as possible bitcoin addresses utilizing near 100% CPU with NBitcoin?

In the same way you can generate as many possible bitcoin addresses utilizing near 100% CPU with other libraries. This is not question about NBitcoin, this is about programming and threading.


Individual table data is reflecting in wrong div

Data from individual files are not reflecting the indented div, visualization

Issue addressed in #12


Changes to make drush functions compatible with 5.x and 7.x+ conventions

What / Why
A number of functions changed names in Drush 7+. This PR makes some backwards compatibility checks. So far verified by @jtwalters and @jkopel using Drush 6; verified by myself using Drush 8.

N/M, this is already fine with #20, let's merge that one in already.


Outside term

preconfigred vim ide for python and go, also able to be recomplied with scripts easily with other language support

forget about link problem with compiled version of vim, sorry

Actually this is by intention left for no such a thing as vim to be put into this docker to keep the container small. This is exactly why I'm working on outside terminal so that we don't need a terminal inside to enlarge the whole container.
The work flow that I personally recommend is to write something outside, use the /pwn shared directory to put it in, and debug inside the container.

I agree.
After put it everything for a great vim in, it's 1.96 GB with 16.04 and 2.16GB with 18.04.
But I use it because I'd like to use Windows 10 as my host system and use boot2docker in Virtualbox as docker's host system. So I do not have a nice environment for the container. I use WSL to provide the remote docker connection, Atom in windows to write code, WinSCP or rsync to transfer file. It seems an ugly things but it works and works well. It only cost 74 MB of memory or so. A larger image didn't bother me that much. After all, I don't download it every time. Don't build it every time either.
By the way, vim's link problem is easy to fix. I already fixed it.

well, virtualbox's share folder is a nice solution. I forgot that before.


Make all datasets persistent by default?

The idea is that generally users would rather have all their experiments saved by default, and only delete them (or make them non-persistent) on an opt-in basis.

This is a big discussion item.  If my opinion matters, the most I would support is the ability to configure an install to make datasets persistent by default (or the flop of it).


Add ability to list a collection's Headers without the document contents

Addresses #193.

Still WIP. Confused about what to implement next.

Ah, after running the CI, I see this error:
no method named `headers` found for struct `connection::List` in the current scope

This is telling you that you need to add a method named headers to connection::List. As per the linked issue, this should be implemented similarly to connection::List::count

I introduced a typo in commit message by mistake. It should be Write test for list_headers


SSL setup - Connection timed out

I'm trying to get nginx (docker-compose setup) to serve SSL for the following domains:
api.mydomain.com
www.mydomain.com
api.sandbox.mydomain.com
www.sandbox.mydomain.com
The first 2 worked like a charm. The sandbox ones don't seem to work. If I do a curl http://www.sandbox.mydomain.com, I do get a 301 - which is correct. If I do a curl https://www.sandbox.mydomain.com, it just hangs - "Connection timed out". There is nothing in the logs.
I then purchased a wildcard certificate: *.mydomain.com. Same thing: "Connection timed out".
Btw, all the certs are in the same folder (./certs), and I thought they interfere with each other, so I tried different combinations (all of them in certs folder, only the wild card one in the certs folder, only the sandbox ones in the certs folder, etc.).

note that a wildcard certificate for *.mydomain.com would not appy to www.sandbox.mydomain.com. If you need a certificate for that domain, you either need a regular certificate for www.sandbox.mydomain.com or a wildcard certificate for *.sandbox.mydomain.com.

Thanks for pointing that out. I deleted the *.mydomain.com, but I do indeed have a certificate for www.sandbox.mydomain.com - and that doesn't work. I thought that I might have accidentally mistyped a URL when creating the certificate request, but then I found several tools that confirm the correct spelling and the validity of the crt and the key.
I looked inside the default.conf on the container, and everything looks good. I compared that to my production default.conf and they are almost identical (without the word "sandbox" in them):
...
upstream api.sandbox.mydomain.com {         ## Can be connect with "satellite_default" network       # satellite_api_1       server <IP_ADDRESS>:8081; } server {   server_name api.sandbox.mydomain.com;   listen 80 ;   access_log /var/log/nginx/access.log vhost;   return 301 https://$host$request_uri; } server {   server_name api.sandbox.mydomain.com;   listen 443 ssl http2 ;   access_log /var/log/nginx/access.log vhost;   ssl_protocols TLSv1 TLSv1.1 TLSv1.2;   ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';   ssl_prefer_server_ciphers on;   ssl_session_timeout 5m;   ssl_session_cache shared:SSL:50m;   ssl_session_tickets off;   ssl_certificate /etc/nginx/certs/api.sandbox.mydomain.com.crt;   ssl_certificate_key /etc/nginx/certs/api.sandbox.mydomain.com.key;   add_header Strict-Transport-Security "max-age=31536000";   location / {     proxy_pass http://api.sandbox.mydomain.com;   } }
...

Oh... I had forgotten to enable port 443 on my router.


SEO

[ ] Pick terms to optimize

@tallent @JoryDJD looks like the spreadsheet is updated. What are next steps?
https://docs.google.com/spreadsheets/d/1U4NhpvYiEsGAyCGOqKAAYZBRR9jetNNeok1jiRw8l98/edit#gid=1792217737

In the Thoughts and Insights Tab, the 5-6 keywords for the dev site and com site have been highlighted.


Refactoring

@gotev Build passing, thanks for updating travis.

@yuripourre thanks for the PR! 🎉
Can you please explain the reasons of this refactoring and improvements it gives?

@gotev thanks for commenting, this PR only does small refactoring, my final goal was to completely separate UI and Log from the main logic since I don't need it for my projects. The next changes I am planning would break compatibility with the current structure then I decided to do in two steps.
I also opened a PR to know if the project is actively maintained. 😅

@yuripourre version 1.x is not actively maintained. During lockdown I started a complete redesign and rewrite in Kotlin for 2.0, using also coroutines. The whole rewrite is just at its start, then I haven't had more time to work on it. There's a first working implementation of the TTS engine. Speech-To-Text still needs to be implemented. In my opinion, 1.x is not worth refactoring. It just takes too much time and there are flawed design decisions which needs to be dropped. The plain is to make a coroutine wrapper of the system capabilities which is easy to use, modular and composable.

@gotev I see, thanks for the explanation and the invite. Seems promising but I am afraid I will not have enough time to help since it's kotlin, at least at the moment.
I will be working on the fork I made instead.
Feel free to close the PR.

@yuripourre I don't have much time either at the moment unfortunately, but I'm curious about your refactoring 😃. Who knows, 2.x may not be what I originally imagined, but that's the good part of this community! Ideas and different point of views are always welcome 😉. Feel free to continue your work in Java in your fork and don't be afraid to introduce non retro-compatible stuff. I'm available for design feedbacks, advice and code review.

@gotev what do you think about the current approach?
The way it is now, I can create my own SpeechRecognitionListener without logs nor UI
The next step will be extracting a listener to handle TTS

@yuripourre good job! Only thing I noticed by looking at the diff is this: https://github.com/gotev/android-speech/pull/42/files#r506967601
This goes in the same direction as I planned for 2.0, where you could use TTS only, Speech-To-Text only or both combined and orchestrated, without initializing unneeded stuff. Also, with your design you've now allowed subclassing. This opens for more customizations in how the TTS and Speech-To-Text are used.

@gotev Thank you for the feedback, just fixed your comment. Yes, I tried to make the library as flexible as possible (and now proguard can probably reduce the app size a bit as well).
Some names could be changed, I know, but it can be done later.
Do you think this PR should be merged?

@yuripourre given a more in depth look at the PR from a can it be merged as it is? perspective. As such you will notice I'm trying to reduce or eliminate the breaking changes with some proposals, to ease merging, release and adoption. From my point of view, a breaking change is needed only when there are fatal design decisions which we want to drop or to allow completely new features which wouldn't have been possible otherwise.
Didn't had time to clone and experiment with your code yet, but I wanted to give you a feedback as soon as I could, so we could talk and make some decisions together.
Feel free to comment and integrate. This is meant as a PR review dialogue in written form. Everything can be openly discussed and changed 😉 I treat code as a way to achieve a goal, not as a personal creation, so don't worry to criticize and propose stuff.
Breaking changes I noticed

SpeechRecognitionNotAvailableException: if this gets reverted back to its original name SpeechRecognitionNotAvailable, it will not be a breaking change
exceptions moved to exception package. It enhances code organization and it's good, but if the exceptions gets reverted to their original positions, this will not be a breaking change
the static init method in Speech now requires a third parameter. By adding an additional init without the third parameter required, this will not be a breaking change

Design decisions

The constructors situation is as follows:
private Speech(final Context context)
private Speech(final Context context, final String callingPackage)
public Speech(final Context context, final String callingPackage, TextToSpeech.OnInitListener onInitListener)
public Speech(final Context context, final String callingPackage, TextToSpeech.OnInitListener onInitListener, SpeechRecognitionListener speechRecognitionListener)
public Speech(final Context context, final String callingPackage, TextToSpeech.OnInitListener onInitListener, SpeechRecognitionListener speechRecognitionListener, TextToSpeechListener textToSpeechListener)

so we have 2 private constructors + 3 new public constructors + the static init which now has an additional required parameter (breaking change):
public static Speech init(final Context context, final String callingPackage, TextToSpeech.OnInitListener onInitListener)

so at this state of the art, one could either use the singleton Speech or create many new instances using the newly added constructors.
Although I'm no fan of Singletons at all, when I designed the library, I thought that since we have a single TTS engine and a single SpeechRecognizer on the system, I would honor that and act as a wrapper which could be called from whatever view I wanted, using a single instance. I would like to know more about your motivations.
At this moment I can see two ways in which this could go:

we leave Speech as a singleton, adding the required static init overloads and leaving only this constructor (this honors single instances and it's not a breaking change):public Speech(final Context context, final String callingPackage, TextToSpeech.OnInitListener onInitListener, SpeechRecognitionListener speechRecognitionListener, TextToSpeechListener textToSpeechListener)

we remove the singleton and leave all the constructors public. This is a breaking change, which allows one to create multiple instances, too.

SpeechRecognitionListener + TextToSpeechListener. Those are basically the interfaces extracted from BaseSpeechRecognitionListener and BaseTextToSpeechListener classes. Those two classes are not actually listeners. They contain the current TTS and TextToSpeech integration logic and so they need different names. I can see the potential in this. It allows customizations over the existing implementations and opens up for completely new implementations using also third party TTS and TextToSpeech implementations, making Speech a Facade.

Stopping at this point for now without going in further detail. We have some stuff to talk about 😉

Thank you so much for the feedback.
Thinking about the breaking changes, they are not really necessary, I will revert them.
Regarding Singleton while changing it I had the (crazy?) idea that would be cool to have multiple voices, I don't know if it is possible though.
About the names, yes, they should change they are not listeners at all.
I will try to re read your comments more carefully and answer them properly this weekend.

While waiting for your full comments, although you told me Kotlin is not your thing, I encourage you to take a look here: https://github.com/gotev/android-speech/tree/2.0/speech/src/main/java/net/gotev/speech/tts

Regarding Singleton while changing it I had the (crazy?) idea that would be cool to have multiple voices, I don't know if it is possible though.

In 2.0 branch I've already come to a point where I achieved multiple voices at once, by creating multiple instances of TextToSpeechEngine.kt. It's an experiment though, so some tests are needed. It goes against my initial thoughts and assumptions for 1.0: single TTS, single Text To Speech. It's also a way to find a proof by contradiction or completely sink the initial 1.x idea. If the experiments in 2.0 works, ideas and library design behind 1.0 are proven wrong and new path are open to be explored.
The main concept in 2.0 is to separate TTS from Speech To Text (both are called engines, so we have TextToSpeechEngine and SpeechToTextEngine) and be able to compose different engines at runtime to create rich dialogs and allow the user to interact with his voice as well, without this having to be a mess to develop for whom uses the library. I used the Kotlin concept of coroutines to express a function which takes some time to complete, but does not lock the thread and avoids complex callback-hell mechanisms, by returning the value asynchronously, but allowing you to still write imperative code. The concept is similar to that con C#'s async/await.

Hi @gotev! Thank you for the feedback, I followed your comments:

Rollback of logs and exceptions (naming and packages)
Renamed the "listeners" to engine (based on your idea for 2.0).
Made all constructors private and added a new init method

Regarding the constructors, I was so focused in do the refactoring that I didn't realize they were private.
I don't plan to change much more in this branch, since it currently meets my needs but I would really appreciate your thougths about what else could be changed so it could be merged.
PS: Thank you for mentioning coroutines, I will study it deeper.

@yuripourre great! There are only some minor things left to do before the merge can be done:

keep a single private constructor (the one with all the parameters) and inject default values in the static inits where needed
update gradle plugin and gradle to latest recommended version by Android Studio

I can take care of them if you allow me to make changes to this PR and then I will proceed with the merge.
Since this PR introduces some enhancements and does not break anything, the version is going to be 1.5.0.
I would like you to prepare the changelog, which I will then use in the release description + a mention to you and this PR.
Thank you for the contribution!

@gotev those are awesome news!
I always leave this option enabled, feel free to change it. The code is not exactly mine, btw.
I already removed the private constructors :D

@yuripourre awesome work

1.5.0 is now live 🎉

@gotev awesome! Can't wait to do some experiments.
I didn't realize that there was an issue to change the voice.

@yuripourre you can also update to 1.6.0 which has full Android 11 support now

@gotev so cool that now is possible to change the voice!

It was possible also before 1.5.0, but to get the available voices, some additional and not so pretty coding was required


mmio: Remove Virtio-over-MMIO support

Fixes #27
The code currently does not work and relies on hard-coded addresses.
Removing this code makes the remainder of the code easier to refactor
(by avoiding lifetime complexity). It also makes adding support for
new block devices easier (as we can assume all devices get discovered
via PCI).
Also adds an explicit "Halting.." log, making it clear the firmware is
intentionally hanging.
Signed-off-by: Joe Richey<EMAIL_ADDRESS>

The virtio-mmio stuff was originally added when initially developing against Firecracker before Cloud Hypervisor was started. It was originally my plan to parse the Linux kernel command line in order to extract the details. However I don't think anyone will want to do firmware boot with virtio-mmio with Cloud Hypervisor nor use the firmware with Firecracker.


cannot edit word files after entering jwt token

Hi
I'm using Onlyoffice <IP_ADDRESS> & Nextcloud 22.2.3 without issue.
I did a clean install of Onlyoffice version <IP_ADDRESS> on Ubuntu 18.4.5.
after installation the example worked fine.
I entered jwt security token in local.json file. In the example, when I wanted to open a file, I started getting the error "The document security token is not correctly formed".
local.json is :
`{
"services": {
"CoAuthoring": {
"sql": {
"type": "postgres",
"dbHost": "localhost",
"dbPort": "5432",
"dbName": "onlyoffice",
"dbUser": "onlyoffice",
"dbPass": "xxxxxxxxxxx"
},
"server": {
"token": {
"enable": true,
"secret": "xxxxxxxxxxxxxxxxxxxxxxxx",
"authorizationHeader": "AuthorizationJwt"
}
},
"token": {
"enable": {
"request": {
"inbox": true,
"outbox": true
},
"browser": true
},
"inbox": {
"header": "AuthorizationJwt"
},
"outbox": {
"header": "AuthorizationJwt"
}
},
"secret": {
"inbox": {
"string": "xxxxxxxxxxxxxxxxxxxxxxxx"
},
"outbox": {
"string": "xxxxxxxxxxxxxxxxxxxxxxxx"
},
"session": {
"string": "xxxxxxxxxxxxxxxxxxxxxxxx"
}
}
}
},
"rabbitmq": {
"url": "amqp://guest:guest@localhost"
}
}
`
When I do the Newtxloud integration, I can open and save Excel files without any problems.
When I open Word files I cannot make any changes and all controls seem to be disabled.
There is no way I haven't tried. I reinstalled onlyoffice multiple times according to the https://helpcenter.onlyoffice.com/installation/docs-community-install-ubuntu.aspx instructions.
There was no change when use this commands:
echo onlyoffice-documentserver onlyoffice/jwt-enabled boolean true | sudo debconf-set-selections
echo onlyoffice-documentserver onlyoffice/jwt-secret password xxxxxxxxxxxxxxxxxxxxxxxx | sudo debconf-set-selections
where am i doing wrong? please help me.

i forgot adding screenshots.

When I do the Newtxloud integration, I can open and save Excel files without any problems.
When I open Word files I cannot make any changes and all controls seem to be disabled.

This is very strange, since JWT mechanism should work for any files
Are you sure that you have no proxy setup that cached some info?
We can try to simplify the problem - try to enable DocumentServer integration example via http://docserver-url/welcome and open and edit files at an example - are those files correctly edited without any error?


Add DateTime: supporting standardized string date and time representations.

Port of cpprest's datetime. Closes #242.
I will not fix major but non-critical implementation feedback at this time, will backlog as work items instead. There are certain things that I would write differently, but the goal of this PR is to make DateTime available, and we know that cpprest's implementation is proven to an extent.

cc @BillyONeal  @CaseyCarter in case you have feedback on our port of the DateTime


Set the MutableColumn.table value in Kafka columns (two-way reference).

Here is a Pull Request where I am fixing the two-way reference from MutableColumn back to Table for the new Apache Kafka MetaModel project. I am trying to connect Kafka to the project DataCleaner, which use MetaModel a lot. and have built some initial code, but it right now is not working because something in there tries to reference the table using Column.getTable() and so on. This Pull Request should fix that.

LGTM! I like what you're doing to DataCleaner, too 😮 😃

I've created https://issues.apache.org/jira/browse/METAMODEL-1197 for this patch and will be merging in the change in a moment.


How do I access Kafka Broker on localhost in my tests?

Currently, I am trying to write integration tests using JUnit 5 and Kafka container.
As I can see, on line 69 of KafkaContainer class, broker is accessible only via randomly generated network alias:
withEnv("KAFKA_ADVERTISED_LISTENERS", "BROKER://" + networkAlias + ":9092" + "," + getBootstrapServers());

How can make broker visible on localhost?
To be more precise, I would like it to be something like below:
withEnv("KAFKA_ADVERTISED_LISTENERS", "BROKER://" + getContainerIpAddress() + getMappedPort(9092));

This way I can run tests locally on my machine as well as on GitLab CI

Hi @voplex95,
There is getBootstrapServers() method, you should use it.

@bsideup Thanks, it helped


'CIFAR10' object has no attribute 'train_data'

when I run bash experiments/run_cifar.sh in linux,the error are as follows:
Traceback (most recent call last):
File "train.py", line 35, in
dataloader = load_data(opt)
File "/home/z00377882/wangpengxiang/ganomaly/lib/data.py", line 60, in load_data
trn_img=dataset['train'].train_data,
AttributeError: 'CIFAR10' object has no attribute 'train_data'

This was fixed in the PR I've made - check #42 and it's corresponding PR.


Rmq provider

Add support for provider that uses RabbitMQ management HTTP API

Pull Request Test Coverage Report for Build<PHONE_NUMBER>

74 of 78 (94.87%)  changed or added relevant lines in 4 files are covered.
No unchanged relevant lines lost coverage.
Overall coverage increased (+1.1%) to 83.624%

Changes Missing Coverage
Covered Lines
Changed/Added Lines
%

app/status/external/rmq.go
62
66
93.94%

Totals

Change from base Build<PHONE_NUMBER>:
1.1%

Covered Lines:
720

Relevant Lines:
861

💛  - Coveralls


(NPUP-5) Refactor function dispatch to use type system.

This refactors function dispatch to make use of the Puppet type system to
describe the function signatures and validate argument types.  It
also makes the dispatcher dynamic in the sense that new functions can be
registered at runtime; this will be needed to implement functions written in
the Puppet language in the future.
The dispatcher now makes use of function descriptors: a descriptor represents a
single function and has dispatch descriptors that describe an overload's
signature and a callback to invoke if the signature matches.
Descriptors contain logic of finding a matching overload and invoking it.  If
the function call could not be dispatched, a check is done for invalid argument
counts, block parameter counts, or argument types and an exception is thrown. This
makes it so that individual functions don't have to do repetitive validating of
all their arguments.
Note that individual function implementations have transitioned from having to
visit their arguments so that desired overload can be deduced to simply having
dedicated callbacks for a particular overload.
This may be extended for operator dispatch in the future.

The last commit is going to be very difficult to review.  For the most part, the functions have been modified to move their visitor implementations into stand-alone functions that are simply invoked when the function is called (parameter validation happens before the callback is invoked now).  The meat of the change is lib/src/compiler/evaluation/functions/descriptor.cc that both describes a function and performs call validation before invoking an overload's callback.

I like the idea of extending this ad use it also for operator dispatch.

There was a pattern to the last commit, so not that bad to review as it first looked. (I obviously did not review the impl of each and every function as I expect that we later will have comprehensive test suite for all kinds of evaluation and each function in detail). Using the puppet type system makes it a lot more readable, and it looks like a reduction in code in the functions as well.
Merging.

Awesome, thanks for the review on this Henrick, as I know it was not an easy one.  I will probably put up a PR to refactor operator dispatch this week as well; I will endeavor to make it much easier to review.

:-) This is like learning a human language by deep immersion... "If you are hungry you better learn how to ask for food".

Regarding the missing newline. Was it supposed to be one there? In any case, no need to PR that change alone, just push it directly with a (maint) commit (or same PUP as this).


Mako

There should be an ophyd-async implementation of the mako detector in dodal. Useful for I22 and the test rigs.
Acceptance Criteria

Mako detector class written
Capable of configuring a mako for hardware or software triggered scans

We have multiple mako g-125 on i10, I could have a crack at this, if this still needed?

We now have an AravisDetector class in ophyd-async that should cover makos, however due to the variety of camera versions and IOC versions we often find ourselves having to update it to cope with a new version.
Try it out on the i10 cameras and see if it works, see example usage.

Try it out on the i10 cameras and see if it works, see example usage.

I do not really need it until I want to auto align the diffractometer pin which is something gda current does not do atm, but just for record keeping, AravisDetector does not current work on mako g-125 at i10 due to mismatch epicPv and enum.

Hmm, that might require an IOC update, I suggest sticking on the relevant controls engineer's backlog


Update to traefik 2.10

What does this PR do?
This PR:

Is based on https://github.com/traefik/mesh/pull/842 and will be rebased before merge
Update to traefik 2.10
Update direct dependencies (except k8s.io/api 0.26 because it's a traefik 2.10 requirement )
Update indirect dependencies (in a separate commit)
Adds one exclude to golangci-lint
Updates most versioned docker images
Updates doc toolchain (except Python and requirements.txt)
Does not update k3s to 1.25 (to stay in sync with docs)
Does not add or update servicemeshinterface (one alpha update is available for all APIs)
Does not add or update coredns (1.10 and 1.11 available)

How to test it

I ran integration tests against the "Update k3d to v5.4.4" commit from the v1.4 branch

Additional Notes
This PR is the preparation to update everything before the traefik 3 release.

Same remarks as https://github.com/traefik/mesh/pull/842#pullrequestreview-1678158139

This PR is the preparation to update everything before the traefik 3 release

Traefik v3 is in beta for now, there is not plan before the GA to update Mesh.

This PR should be closed in favor of #842

This PR is the preparation to update everything before the traefik 3 release

Traefik v3 is in beta for now, there is not plan before the GA to update Mesh.

I just saw that v3 is nearing GA and wanted Mesh to contain the latest v2.10 before that.


Check inside a chart if installed with helm v2 or v3 ?

Is there a recommended way for checking inside a chart if a release is installed using helm v2 or v3 ?
I have a chart with CRDs in templates and want to exclude them when using v3 but include them when using v2.
Thanks.

/kind question

@eddycharly If you use crd-install hooks then Helm v3 will ignore the CRD templates. Otherwise, you can pas skip-crds flag with Helm v3. Some more details in docs: https://helm.sh/docs/chart_best_practices/custom_resource_definitions/
Apart from that, I am not aware of any other ways of checking this.

@hickeyma i'm not using hooks yet, i do something like this:
{{- if .Values.customResourceDefinitions.create }}
{{- range $path, $bytes := .Files.Glob "crds/*.yaml" }}
{{ $.Files.Get $path }}
---
{{- end }}
{{- end }}

Thanks for the hooks suggestion, i will read about it.

@eddycharly Ok, let me know how you get on.

@hickeyma Adding the crd-install hook annotation works like a charm.
Thank you !


Rotating image in v10

Hey,
I am trying to upgrade to v10 and I like the simplification of rendering the image on my own. However, I don't think the rotation can be applied as proposed by the example. I took the example into a codesandbox to demonstrate: https://codesandbox.io/s/quizzical-shape-6sphb4?file=/src/App.js
It is very simple, there is a button to rotate the image by 90 degrees whenever you click on it.
Expected behaviour: When an image is rotated via transformation, it's displayed as "contain", so that the entire rotate image is still visible. A user can only select a crop within the rotated image.
Actual behaviour: The image is rotated around its center and the edges on the longer side of the image become invisible. But most importantly, it doesn't detect any overflow and if you select the visible portion of the image, the crop is calculated as if I was making a crop against the whole area. This makes CSS rotation totally unviable because it also means I can now make the crop outside of the rotated image (you can try rotating once in the sandbox and then selecting a crop "above" the image.
I've also checked the Advanced example here https://codesandbox.io/s/react-image-crop-demo-with-react-hooks-y831o and the same issue is reproducible. As soon as the image is rotated, parts of it become invisible and a crop can be selected outside of the image.
My feeling is that the release notes should instead point out that rotation is no longer possible (even if you have no rotate button, if you start with a rotated image, you get wrong behaviour), or go into more detail about how to do that. The v9 implementation was far from fully working[1], but saying it's as easy as adding CSS transformation in the changelog brings up false hopes.
Thanks

[1] in v9, it wasn't possible to select a crop by mouse after rotation, but if it gets created programatically, it can then be dragged and resized.

I actually found a decent workaround to this problem in my case which is to load the image into React Crop after it has already been rotated. This way React Crop will have the correct dimensions to show the image.
The code is as below, the relevant portions are the canvas manipulations.
Rotation is bounded between 0 and 360. In my application, I don't let the user rotate the image while cropping (they rotate it before). If you want to let them rotate while cropping then you may need to do the canvas manipulations ad hoc and then re-render the cropper.
    const getImage = async () => {
        const response = await axios.get(uncroppedMedia?.url, {
            responseType: "blob",
            withCredentials: false,
        });
        const blob = response.data;
        const image = await createImageBitmap(blob);
        const canvas = document.createElement("canvas");
        const ctx = canvas.getContext("2d");

        // Dimensions of canvas need to take rotation into account
        const rotatedWidth =
            Math.abs(Math.cos((rotation * Math.PI) / 180) * image.width) +
            Math.abs(Math.sin((rotation * Math.PI) / 180) * image.height);
        const rotatedHeight =
            Math.abs(Math.sin((rotation * Math.PI) / 180) * image.width) +
            Math.abs(Math.cos((rotation * Math.PI) / 180) * image.height);

        canvas.width = rotatedWidth;
        canvas.height = rotatedHeight;

        ctx.translate(rotatedWidth / 2, rotatedHeight / 2);
        ctx.rotate((rotation * Math.PI) / 180);
        ctx.translate(-image.width / 2, -image.height / 2);

        ctx.drawImage(image, 0, 0);
        return new Promise((resolve) => {
            canvas.toBlob((blob) => {
                resolve(blob);
            }, "image/jpeg");
        });
    };

    useEffect(() => {
        if (!show) return;

        getImage().then((blob) => {
            setBlob(URL.createObjectURL(blob as Blob));
        });
    }, [rotation, show]);

I did switch into Canvas as well, Konva JS to be more specific, because I use other filters (flipping, rotating, brightness, saturation, hue rotation, even sepia) and it made more sense in the long run because Canvas is more powerful in the long run. I also did the rotation of the crop using a custom function, but since my contsraints are:

only 90 deg clockwise rotation (if you want more, you can do it multiple times)
only using percent crop (to make it responsive)

the method ended up as simple as
export function rotateCrop(crop?: PercentCrop): PercentCrop | undefined {
  if (!crop) return crop

  const { x, y, width, height, unit } = crop
  return {
    y: x,
    x: 100 - (y + height),
    width: height,
    height: width,
    unit,
  }
}

I managed to upgrade to v10 after doing this change.


[Docs] Include all provider variables in config.toml

Since I started without those (XAI & GROQ) it was painful figuring it out.
Overloading the OPENAI vars with other keys didn't work.
I only found the CLI export examples after a few hours ;-/
Also, please include examples of calling providers from CLI as well as providers/model combo.
Note that some providers don't have a default fallback and need more specificity.

Overloading the OPENAI vars with other keys didn't work.

What do you mean?

Also, please include examples of calling providers from CLI as well as providers/model combo.

That existsat https://gptme.org/docs/providers.html. Which doc pages did you read? What exactly would you want changed?
Easiest would be if you submit a PR to https://github.com/ErikBjare/gptme/blob/master/docs/providers.rst

I'd rather not duplicate a bunch of examples, it's just env vars after all.

I hear you, however for first time setup and if you don't have one of the ones in the example, you fail to get started.

You think it's enough if we just link to the doc on providers?

That may help also, however for me it would have been best to have all the examples as comments in the config file to begin with.

Overloading the OPENAI vars with other keys didn't work.
What do you mean?

Many other projects had only OpenAI support, and if using a compatible API, one can simply replace the OAI API key with another service, adjusting the base URL to get things working.

Also, please include examples of calling providers from CLI as well as providers/model combo.
That exists at https://gptme.org/docs/providers.html. Which doc pages did you read? What exactly would you want changed?
Easiest would be if you submit a PR to https://github.com/ErikBjare/gptme/blob/master/docs/providers.rst

Yes it does exist there, just not explicitly. Hence the ask for clarity.
I don't have things working yet (gptme-server crashes), so I hesitate to edit with examples that worked for me before they do.

Many other projects had only OpenAI support, and if using a compatible API, one can simply replace the OAI API key with another service, adjusting the base URL to get things working.

Ah! I see how that is confusing.
I'll try to make the example in config.toml more complete.

gptme-server crashes

Logs? Is it just missing server extras? (if it fails to import flask)

I updated the docs for config.toml: https://gptme.org/docs/config.html and simplified the page on providers.

I updated the docs for config.toml: https://gptme.org/docs/config.html and simplified the page on providers.

config.toml looks good (nice addition for DeepSeek), however the providers page has a few issues:

the top example could be updated to echo the config changes
the reference to the config file mentions gptme.toml which doesn't exist (I think you mean ~/.config/gptme/config.toml)
the API key list could use DeepSeek too.
when the repo is cloned, it would help if the config.toml had these changes
a few examples of how to launch gptme with providers that have a working example model that will work without errors for validating the configuration file or launch parameters (Groq has so many models compared to Grok, etc)

As to the gptme-server, it doesn't seem to pick up the XAI_API_KEY in the config or the shell export ;-/


Add has trap for accurate in with stores and mutables

Summary
Fixes #1107 by adding has trap to Stores and Mutables, so that code like if ('prop' in store) store.prop() is properly reactive. In Discord it's also been requested that $TRACK in store should return true, so I also added support for that (and other node types, to match get — notably missing $NAME though).
How did you test this change?
I haven't tested this yet, sorry, in particular because I still can't build Solid and run tests locally. But hopefully it's still useful, at least as a proof of concept? Feel free to reimplement it...

Pull Request Test Coverage Report for Build<PHONE_NUMBER>

7 of 9 (77.78%)  changed or added relevant lines in 2 files are covered.
No unchanged relevant lines lost coverage.
Overall coverage decreased (-0.06%) to 88.828%

Changes Missing Coverage
Covered Lines
Changed/Added Lines
%

packages/solid/store/src/mutable.ts
4
5
80.0%

packages/solid/store/src/store.ts
3
4
75.0%

Totals

Change from base Build<PHONE_NUMBER>:
-0.06%

Covered Lines:
1261

Relevant Lines:
1347

💛  - Coveralls

Hmm.. in not tracking is something we've used to our advantage in the past I believe. I'd need to check. Also things like the JSX heuristic should take this into consideration perhaps.

Hmm.. in not tracking is something we've used to our advantage in the past I believe. I'd need to check.

I would have expected unwrap or untrack would be the way to avoid tracking. But should definitely check!
In core, I see that For, Index, Suspense, observable, from, and applyState use in, but I don't think the second argument can ever be a Store (e.g. it's props, an observer/producer, or an array).

Also things like the JSX heuristic should take this into consideration perhaps.

Could you elaborate? Does the JSX compiler output in tests in some cases? Or are you suggesting it should?

Im suggesting right now this would never be considered reactive according to our heuristic.
<Show when={"value" in store}>...</Show>

So if in is we need to change it.

Yeah that is all fine, just means it's probably a 1.5 sort of thing.

Thank you


Fix Windows CI failure

Works around https://github.com/msys2/MSYS2-packages/issues/1962.

Needs another review.

I'm still getting msys2 error messages (even with re-runs) with the Travis CI Windows build: https://travis-ci.org/github/UIUC-PPL/charm/jobs/689409487
Is this related?

I'm still getting msys2 error messages (even with re-runs) with the Travis CI Windows build: https://travis-ci.org/github/UIUC-PPL/charm/jobs/689409487
Is this related?

Yeah, there appear to be new issues in the original package (msys2/MSYS2-packages#1962). We should ignore the Windows CI build for now.


Docker build fails for desktop container

I'm trying to build a docker image based on ubuntu 20.04 desktop for use in Kasm Workspaces.
DISCLAIMER: I honestly do not believe this is an issue with SIFT and more an issue of my inexperience with building such docker containers.
If I try to build using sift-linux-cli it results in an issue with /etc/sift-version with the following output:
Error: Update returned exit code not zero
    at ChildProcess.<anonymous> (/snapshot/sift-cli/sift-cli.js:556:23)
    at ChildProcess.emit (events.js:400:28)
    at maybeClose (internal/child_process.js:1058:16)
    at Process.ChildProcess._handle.onexit (internal/child_process.js:293:5)`

My Dockerfile in that instance looks like:

`FROM kasmweb/core-ubuntu-focal:1.11.0
USER root

ENV HOME /home/kasm-default-profile
ENV STARTUPDIR /dockerstartup
ENV INST_SCRIPTS $STARTUPDIR/install
WORKDIR $HOME

######### Customize Container Here ###########

RUN  wget https://github.com/teamdfir/sift-cli/releases/download/v1.14.0-rc1/sift-cli-linux https://github.com/teamdfir/sift-cli/releases/download/v1.14.0-rc1/sift-cli-linux.sig https://github.com/teamdfir/sift-cli/releases/download/v1.14.0-rc1/sift-cli.pub https://github.com/sigstore/cosign/releases/download/v1.11.1/cosign_1.11.1_amd64.deb \
    && dpkg -i cosign_1.11.1_amd64.deb \
    && cosign verify-blob --key sift-cli.pub --signature sift-cli-linux.sig sift-cli-linux \
    && mv sift-cli-linux /usr/local/bin/sift \
    && chmod 755 /usr/local/bin/sift \
    && apt install sudo

######### End Customizations ###########

RUN chown 1000:0 $HOME
RUN $STARTUPDIR/set_user_permission.sh $HOME

ENV HOME /home/kasm-user
WORKDIR $HOME
RUN mkdir -p $HOME && chown -R 1000:0 $HOME

RUN sudo /usr/local/bin/sift install --user=kasm-user

USER 1000

With a pretty vanilla docker build:
sudo docker build -t sift-workstation:latest -f Dockerfile .
If I comment out the sift install line in the Dockerfile and then run that command inside a session of that running image I get the same issue.  It seems to be an issue with the use of timedatectl looking for init.  I get the following error message when I try to run timedatectl within the container:
System has not been booted with systemd as init system (PID 1). Can't operate. Failed to create bus connection: Host is down
If I set --mode=server the install process works fine however my analysts are looking for the desktop flavor.  (I'm not familiar with the intricacies of SIFT - just the guy who builds platforms/tools/solutions for analysts to use - but absolutely willing to learn.)
I also tried performing the manual install via SIFT from here: https://github.com/teamdfir/sift-saltstack
However, and I could be mistaken with my interpretation here, but it appears the instructions may be outdated as the repo URLs are no longer available - they have switched to something like "https://repo.saltproject.io/py3/ubuntu/20.04/amd64/3004/SALTSTACK-GPG-KEY.pub".  But when I try 3004, which SIFT 1.14.0-rc1 references in the diff between it and 1.13, I receive several errors which research indicates a version mismatch between SIFT and salt.
I feel like I'm close but scraping the bottom of the barrel and could use some assistance from someone who objectively know better than I.

Hi @joecasanova , I've actually got a sift Dockerfile created which you should be able to modify for your purposes, but I haven't updated it recently for Saltstack 3004. If you give me an hour I can have it finished for you. You can find it here when it's done. Alternatively, I also have one which has SIFT and REMnux as well here. I'll let you know when they're updated!

Hi @joecasanova , I was just re-reading your original message and realized I skipped over the error message you provided. The message occurs because the operating system within the docker container doesn't run with system level operation, and as such cannot run system-level commands such as timedatectl. Your best bet to set the timezone might be to set it manually using configuration files.
As for the errors between the two SIFT CLI versions, if you're still encountering those with the Dockerfile I provided, let me know and I'll help you out with resolving that as well.

Hi @joecasanova , just checking in to see how things have progressed with this.

Closing due to stale.


Fix parallelization

Currently async in dd_ml_estimation.cpp and dd_infer_parameters.cpp is far slower than the sequential execution.
Potential issue: shared parameter copying.

Fixing in progress:
[x] dd_recurrence_estimation
[ ] dd_automorphisms
[ ] dd_ml_estimation
[x] dd_temporal_bound (with GLPK)
[ ] dd_temporal_bound (with Gurobi)

OK, seems that main issue was the stack overflow - for example nauty uses arrays allocated on stack, which effectively prohibits parallelism when ulimit -s is set too low.

Note: there is also a multithreading issue in KOALA library. Solved by migration to SNAP.


auto recording?

Does it just display the record button or does it enable auto recording? If it records automatically, it would be great.

This does not add any added functionality to LineageOS. It just activates the call recording for all country. So it does not enables auto-recording.

You can use BCR if you want auto recording.

Thanks so much for your help


Adding US sections

This is a work in progress right now. I'm going to be adding more tests and improving the structure.

I think some helper functions would be good. Many of the fields are just Integers (usually parsed from two bits, though something like Version is 6 bits). The Bitfields are a bit different as they are arrays of integers where each entry represents a different value.

Added another pass at the decoding portion. Here I tried to simplify, where I'm trying to decode the bitstream in order but keeping the error as a reference so that it can stop parsing on the first error. This loses the field name in the error message however. Not sure if that is needed necessarily, but this at least makes the segments a bit cleaner. I will be adding more tests and sections next.

When you encounter an error in one of the Read functions, you just pass the error back up as is, without adding any context. This will make it difficult to debug the error messages generated. See the main GPP header parser, where each level adds context to the error being returned up the chain. Consider adding context so the message better indicates where the problem lies, and what was attempted to be read.

In regards to the GPC section, should that information be coming from the user-agent headers rather than the string itself?

In regards to the GPC section, should that information be coming from the user-agent headers rather than the string itself?

We cannot count on the header information existing. In server to server models in particular, headers can be lost. My read was that when talking to the CMP, the header should be there. It then gets saved as part of the GPP string in case the header information gets lost. Also, since only a CMP should create/edit a GPP string, we should not try to modify it. I think this should include adding info to the decoded copy of the string.

Rebase this PR and fixed the GPC usage. I realized that it is also expected to be available in a sub section in the section string, separated by a . character. I based the new behavior off of the TypeScript implementation here:
https://github.com/IABTechLab/iabgpp-es/blob/master/modules/cmpapi/test/encoder/section/UspCaV1.test.ts
Essentially, GPC should have a section type of 1 and then a section.GPC value of what's in the string. A default GPC object is used if the string is not available.


Gradient missed?

https://github.com/vvpisarev/CubicEoS.jl/blob/209a17af9a31ccd3f9e2d0b1962538ac049ff724/src/vt_split/state_idealidentity.jl#L122
Perhaps, there should be hessian_physical * (dV dalpha)^2 + grad_V * d2Vdalpha2

May be an issue for ratio variables too.

Second variable is zero in both cases. So, scale part with gradient is not needed. Sorry!


EF 6 CodeFirst Migrations Detecting changes that don't exist

I have been using EF Migrations for a while in my current project and all was working great, that is until today, the situation is as follows:

I made a small change of adding a string property
I called an API method and got an error that there are changes in the model
I ran the command "Add-Migration MigrationXYZ"
A new migration is created with extra changes that didn't happen

I ran the "Add-Migration MigrationXYZ -Force" to make sure its not a one thing issue, I dropped the DB, restarted VS(2015) but all the same
Another issue is that even if I apply the migration as done by the scaffolder, an error still returns saying "Unable to update database to match the current model because there are pending changes..."
After looking at these changes, they all but one are about having a string property with the [Required] attribute and the scaffolder need to make it nullable, below is a sample.
public partial class MigrationXYZ: DbMigration
{
    public override void Up()
    {
        AddColumn("dbo.Foos", "NewProperty", c => c.String());//<-- Expected Change
        AlterColumn("dbo.Bars", "Name", c => c.String());//<-- Unexpected Change
    }

    public override void Down()
    {
        AlterColumn("dbo.Bars", "Name", c => c.String(nullable: false));//<-- Unexpected Change
        DropColumn("dbo.Foos", "NewProperty");//<-- Expected Change
    }
}

public class Bar
{
    //This was not touched in ages, some even before adding the first migration
    [Required]
    public string Name { get; set; }
}

And now I am stuck and don't know how to fix this...Corruption in the Migration state
Edit
I have been trying to debug the Add-Migration command to understand why does EF see the model is different than it really is, but using EF source is not possible when you have dependencies like Identity which needs signed DLLs to work.
However additional research lead me to the answer here which leads to this blog post By @trailmax and the code to decipher the migrations hash, and with a little search in the EF source I made a small app to extract both the current model and the last migration model to compare side to side.
The code to get the current model representation in XML
//Extracted from EF Source Code
public static class DbContextExtensions
{
    public static XDocument GetModel(this DbContext context)
    {
        return GetModel(w => EdmxWriter.WriteEdmx(context, w));
    }

    public static XDocument GetModel(Action<XmlWriter> writeXml)
    {
        using (var memoryStream = new MemoryStream())
        {
            using (var xmlWriter = XmlWriter.Create(
                memoryStream, new XmlWriterSettings
                {
                    Indent = true
                }))
            {
                writeXml(xmlWriter);
            }

            memoryStream.Position = 0;

            return XDocument.Load(memoryStream);
        }
    }
}

        //In Program.cs
        using (var db = new DbContext())
        {
            var model = db.GetModel();
            using (var streamWriter = new StreamWriter(@"D:\Current.xml"))
            {
                streamWriter.Write(model);
            }
        }

The code to extract the model from the migration in XML
//Code from Trailmax Tech Blog
public class MigrationDecompressor
{
    public string ConnectionString { get; set; }

    public String DecompressMigrationFromSource(IMigrationMetadata migration)
    {
        var target = migration.Target;
        var xmlDoc = Decompress(Convert.FromBase64String(target));
        return xmlDoc.ToString();
    }

    public String DecompressDatabaseMigration(String migrationName)
    {
        var sqlToExecute = String.Format("select model from __MigrationHistory where migrationId like '%{0}'", migrationName);

        using (var connection = new SqlConnection(ConnectionString))
        {
            connection.Open();

            var command = new SqlCommand(sqlToExecute, connection);

            var reader = command.ExecuteReader();
            if (!reader.HasRows)
            {
                throw new Exception("Now Rows to display. Probably migration name is incorrect");
            }

            while (reader.Read())
            {
                var model = (byte[])reader["model"];
                var decompressed = Decompress(model);
                return decompressed.ToString();
            }
        }

        throw new Exception("Something went wrong. You should not get here");
    }

    /// <summary>
    /// Stealing decomposer from EF itself:
    /// http://entityframework.codeplex.com/SourceControl/latest#src/EntityFramework/Migrations/Edm/ModelCompressor.cs
    /// </summary>
    private XDocument Decompress(byte[] bytes)
    {
        using (var memoryStream = new MemoryStream(bytes))
        {
            using (var gzipStream = new GZipStream(memoryStream, CompressionMode.Decompress))
            {
                return XDocument.Load(gzipStream);
            }
        }
    }
}

        //Inside Program.cs

        var decompresser = new MigrationDecompressor
        {
            ConnectionString = "<connection string>"
        };

        var databaseSchemaRecord = decompresser.DecompressDatabaseMigration("<migration name>");
        using (var streamWriter = new StreamWriter(@"D:\LastMigration.xml"))
        {
            streamWriter.Write(databaseSchemaRecord);
        }

Unfortunately I still cannot find the issue, the only difference between the model and the one hashed with the last migration is the expected change of the added property, none of the unexpected changes show up, also after running the migration suggested by EF, then comparing the current model with the suggested migration, still the model doesn't match the changes, what should be not null is still not null in the model, while the suggested migration show it as nullable.
The expected changes show up
<Property Name="NewProperty" Type="String" MaxLength="Max" FixedLength="false" Unicode="true" />
.
.
.
<ScalarProperty Name="NewProperty" ColumnName="NewProperty" />
.
.
.
<Property Name="NewProperty" Type="nvarchar(max)" Nullable="true" />

Note: this was also posted on stackoverflow

Finally found the issue, the AssertThat attribute from ExpressiveAnnotations, commenting the attribute solves the issue, however why is that so, is this a bug?

@meywd There is nothing obvious that could cause an attribute that EF doesn't reason about to cause spurious differences in the model to appear. Have you had other changes made? E.g. did you upgrade to a newer version of .NET Framework, Visual Studio/C# compiler or the JIT compiler?
Regardless, now that you have identified an attribute which causes spurious operations, would it be possible for you to provide a minimal repro that we can test internally?

EF Team Triage: Closing this issue as the requested additional details have not been provided and we have been unable to reproduce it.