No sound after clean install.

Bug
No sound.
Reproduce
After a clean installation with:
cargo install daktilo

and run it simply as:
daktilo

it's not working, no sound at all.
Expected Behaviour
Normally, last night, I first install it on another device with almost same configuration. And it simply worked.
Log
~ Zacian* ❮ daktilo -c daktilo.toml -p musicbox -v > daktilo.log                                  15:24:59

2024-04-11T12:25:30.888671Z  INFO daktilo: Starting...
2024-04-11T12:25:30.889414Z DEBUG daktilo: Config {
    sound_presets: [
        SoundPreset {
            name: "default",
            key_config: [
                KeyConfig {
                    event: KeyPress,
                    keys: Regex(
                        "Return",
                    ),
                    files: [
                        AudioFile {
                            path: "ding.mp3",
                            volume: Some(
                                1.0,
                            ),
                        },
                    ],
                    strategy: None,
                    variation: None,
                },
                KeyConfig {
                    event: KeyPress,
                    keys: Regex(
                        ".*",
                    ),
                    files: [
                        AudioFile {
                            path: "keydown.mp3",
                            volume: Some(
                                1.0,
                            ),
                        },
                    ],
                    strategy: None,
                    variation: Some(
                        SoundVariation {
                            volume: Some(
                                (
                                    0.1,
                                    0.1,
                                ),
                            ),
                            tempo: Some(
                                (
                                    0.05,
                                    0.05,
                                ),
                            ),
                        },
                    ),
                },
                KeyConfig {
                    event: KeyRelease,
                    keys: Regex(
                        ".*",
                    ),
                    files: [
                        AudioFile {
                            path: "keyup.mp3",
                            volume: Some(
                                1.0,
                            ),
                        },
                    ],
                    strategy: None,
                    variation: Some(
                        SoundVariation {
                            volume: Some(
                                (
                                    0.1,
                                    0.1,
                                ),
                            ),
                            tempo: Some(
                                (
                                    0.05,
                                    0.05,
                                ),
                            ),
                        },
                    ),
                },
            ],
            disabled_keys: None,
            variation: None,
        },
        SoundPreset {
            name: "basic",
            key_config: [
                KeyConfig {
                    event: KeyPress,
                    keys: Regex(
                        "Return",
                    ),
                    files: [
                        AudioFile {
                            path: "newline.mp3",
                            volume: None,
                        },
                    ],
                    strategy: None,
                    variation: None,
                },
                KeyConfig {
                    event: KeyPress,
                    keys: Regex(
                        ".*",
                    ),
                    files: [
                        AudioFile {
                            path: "keystroke.mp3",
                            volume: None,
                        },
                    ],
                    strategy: None,
                    variation: None,
                },
            ],
            disabled_keys: Some(
                [
                    UpArrow,
                    DownArrow,
                    LeftArrow,
                    RightArrow,
                    Backspace,
                ],
            ),
            variation: None,
        },
        SoundPreset {
            name: "musicbox",
            key_config: [
                KeyConfig {
                    event: KeyPress,
                    keys: Regex(
                        ".*",
                    ),
                    files: [
                        AudioFile {
                            path: "mbox1.mp3",
                            volume: None,
                        },
                        AudioFile {
                            path: "mbox2.mp3",
                            volume: None,
                        },
                        AudioFile {
                            path: "mbox3.mp3",
                            volume: None,
                        },
                        AudioFile {
                            path: "mbox4.mp3",
                            volume: None,
                        },
                        AudioFile {
                            path: "mbox5.mp3",
                            volume: None,
                        },
                        AudioFile {
                            path: "mbox6.mp3",
                            volume: None,
                        },
                        AudioFile {
                            path: "mbox7.mp3",
                            volume: None,
                        },
                        AudioFile {
                            path: "mbox8.mp3",
                            volume: None,
                        },
                    ],
                    strategy: Some(
                        Random,
                    ),
                    variation: None,
                },
            ],
            disabled_keys: None,
            variation: None,
        },
        SoundPreset {
            name: "ducktilo",
            key_config: [
                KeyConfig {
                    event: KeyPress,
                    keys: Regex(
                        "Return",
                    ),
                    files: [
                        AudioFile {
                            path: "quack2.mp3",
                            volume: None,
                        },
                    ],
                    strategy: None,
                    variation: None,
                },
                KeyConfig {
                    event: KeyPress,
                    keys: Regex(
                        ".*",
                    ),
                    files: [
                        AudioFile {
                            path: "quack1.mp3",
                            volume: Some(
                                10.0,
                            ),
                        },
                    ],
                    strategy: None,
                    variation: None,
                },
            ],
            disabled_keys: None,
            variation: None,
        },
        SoundPreset {
            name: "drumkit",
            key_config: [
                KeyConfig {
                    event: KeyPress,
                    keys: Regex(
                        ".*",
                    ),
                    files: [
                        AudioFile {
                            path: "kick.mp3",
                            volume: None,
                        },
                        AudioFile {
                            path: "hat.mp3",
                            volume: None,
                        },
                        AudioFile {
                            path: "snare.mp3",
                            volume: None,
                        },
                        AudioFile {
                            path: "kick.mp3",
                            volume: None,
                        },
                        AudioFile {
                            path: "hat.mp3",
                            volume: None,
                        },
                        AudioFile {
                            path: "kick.mp3",
                            volume: None,
                        },
                        AudioFile {
                            path: "snare.mp3",
                            volume: None,
                        },
                        AudioFile {
                            path: "hat.mp3",
                            volume: None,
                        },
                    ],
                    strategy: Some(
                        Sequential,
                    ),
                    variation: None,
                },
            ],
            disabled_keys: None,
            variation: None,
        },
        SoundPreset {
            name: "sparks",
            key_config: [
                KeyConfig {
                    event: KeyPress,
                    keys: Regex(
                        "Backspace",
                    ),
                    files: [
                        AudioFile {
                            path: "derase.mp3",
                            volume: None,
                        },
                    ],
                    strategy: Some(
                        Random,
                    ),
                    variation: None,
                },
                KeyConfig {
                    event: KeyPress,
                    keys: Regex(
                        ".*",
                    ),
                    files: [
                        AudioFile {
                            path: "dspark1.mp3",
                            volume: None,
                        },
                        AudioFile {
                            path: "dspark2.mp3",
                            volume: None,
                        },
                        AudioFile {
                            path: "dspark3.mp3",
                            volume: None,
                        },
                        AudioFile {
                            path: "dspark4.mp3",
                            volume: None,
                        },
                        AudioFile {
                            path: "dspark5.mp3",
                            volume: None,
                        },
                        AudioFile {
                            path: "dspark6.mp3",
                            volume: None,
                        },
                    ],
                    strategy: Some(
                        Random,
                    ),
                    variation: None,
                },
            ],
            disabled_keys: None,
            variation: None,
        },
    ],
    disable_easter_eggs: false,
}
2024-04-11T12:25:30.889623Z DEBUG daktilo_lib: [
    SoundPreset {
        name: "musicbox",
        key_config: [
            KeyConfig {
                event: KeyPress,
                keys: Regex(
                    ".*",
                ),
                files: [
                    AudioFile {
                        path: "mbox1.mp3",
                        volume: None,
                    },
                    AudioFile {
                        path: "mbox2.mp3",
                        volume: None,
                    },
                    AudioFile {
                        path: "mbox3.mp3",
                        volume: None,
                    },
                    AudioFile {
                        path: "mbox4.mp3",
                        volume: None,
                    },
                    AudioFile {
                        path: "mbox5.mp3",
                        volume: None,
                    },
                    AudioFile {
                        path: "mbox6.mp3",
                        volume: None,
                    },
                    AudioFile {
                        path: "mbox7.mp3",
                        volume: None,
                    },
                    AudioFile {
                        path: "mbox8.mp3",
                        volume: None,
                    },
                ],
                strategy: Some(
                    Random,
                ),
                variation: None,
            },
        ],
        disabled_keys: None,
        variation: None,
    },
]
2024-04-11T12:25:30.947837Z DEBUG daktilo_lib::app: Using output device: MacBook Pro Speakers
``

## SW information

- Operating system: MacOS Sonoma 14.4.1 (23E224)
- Rust version: rustc 1.78.0-nightly (878c8a2a6 2024-02-29)
- Project version: daktilo 0.6.0

## Additional

I simply began to question my ability to debugging Rust applicaitons. I believe it simply can't catch the key presses. It bizarre since I already gave the permission it needs.

Solution
Removing the application from the permission list (of monitoring input) and re-adding it.

Sorry to bother with this MacOS sh*t.

Solution
Removing the application from the permission list (of monitoring input) and re-adding it.

Sorry to bother with this MacOS sh*t.

Sorry to bother with this MacOS sh*t.

No worries lol


Additional Portuguese translations

There are a few new Portuguese translations left to do.
In https://github.com/thomaspark/flexboxfroggy/blob/gh-pages/js/messages.js:

"Reset"
"Are you sure you want to reset the game?\n\nYour saved progress will be lost and you'll be sent to the start of the game."

@mvtenorio, mind helping out with these? :smile:

Done! :smile:

Thank you!


new type property to change button type (HTML)

fixes #121

@RickCardoso And do not think it could be better : type=" $attrs.type " you could check if it works as it should and thank you very much for the contribution
or remove the type =" button " property of the component and by default this is not
I say it so as not to create a property that confuses the user in that sense

I don't understand, do you already have another solution in mind?
I believe that vs-type was a well-intended choice for the property, but it was not a good choice, because type has a meaning other the "style" of the button. The ideal here it would be to have a property such as vs-type to define the type of the button (button, submit, reset) and a vs-button or vs-style property for filled, outline, relief, etc.
But that's not a good change to make right now, because it will break the users' apps.

You have the absolute best reason to change the property to vs-style and leave the type property to be binded by default to the button with : type

Please, you could close this PR and make another with only the required changes, thank you very much


Refactor throw delegate functions to google/cloud

With this change the storage/ and bigtable/ libraries share the functions to raise exceptions.
As a reminder, we use these functions (e.g. google::cloud::RaiseRuntimeError) to raise
an exception or call std::abort() depending on whether the code is compiled with
exceptions enabled or disabled, respectively.

@houglum ping, can you take a look?


remove drop_fields

Simplifying the extractor a bit, cleaning up a bit of technical debt here to make it easier to hack on.

Yes, the purge_unknown field does this for us already here: https://github.com/cds-snc/nrcan_api/blob/master/etl/src/energuide/extractor.py#L66
And we're testing that this is in fact the case here: https://github.com/cds-snc/nrcan_api/blob/master/etl/tests/test_extractor.py#L118


Support the ActiveModel::Type API when available

Another take to fix #1342, building on top of #1398.
We now favour the ActiveModel::Type API when available (Rails 5+), and still support the column objects from earlier versions. Our test models now implement the type_for_attribute API, but I discussed once with @rafaelfranca about adding an end to end test case based on ActiveRecord (+ sqlite) to provide better feedback on this integration.

Amazing. :shipit:


Email scope for google access not set

We are not recoding any more users' email addresses. The scope when doing Google authentication needs to be fixed.

The correct scope is:
https://www.googleapis.com/auth/plus.profile.emails.read
instead the app is currently using:
profile

This is critical, we cannot go 1.0.0 without it.

Changed, can you check if it's working fine? @bettiolo


mini.bracketed: treesitter movements for ]t broken and ]T,[T behavior not helpful without working C-i,C-o

Contributing guidelines

[X] I have read CONTRIBUTING.md
[X] I have read CODE_OF_CONDUCT.md
[X] I have updated 'mini.nvim' to latest version

Module(s)
mini.bracketed
Description
Man page says
                                                    *MiniBracketed.treesitter()*
                `MiniBracketed.treesitter`({direction}, {opts})
Tree-sitter node

Go to end/start of current tree-sitter node and its parents (except root).

Unfortunately this does not clarify what "first, go backwards, go forward and go last" means, because a tree can be walked forwards backwards, but also upwards and downwards.
Only ]T and [T appear to work reliably and only for global file scope.
c++ movements dont work at all, but are likely not focus as one can follow along the brackets for navigation (except when strings contain brackets { and }.

Neovim version
NVIM v0.10.0-dev-64+g37bb40701
Steps to reproduce

nvim -nu minimal.lua including nvim-treesitter with parsers for python and c++.
Try both example files with ]t,[t,]T,[T and compare with ]m, [m, ]M, [M:

class c1:
  def t1(self):
    print(1)
    print(1)
    print(1)
    return 1
    def nested_t1():
      print(1)
      print(1)
      return 1

class c2:
  def t2(self):
    print(2)
    print(2)
    return 2

    def nested_t2():
      print(2)
      return 2
  def t3(self):
    print(2)
    print(2)
    return 2
    def nested_t3():
      print(2)
      return 2

class c3:
  def t2(self):
    print(2)
    print(2)
    return 2

For completeness (not discussed):
struct s1 {
    struct t1 {
        int testfn1() {
            return 0;
        }
        int a1;
        int a2;
    };

    struct t2 {
        int testfn1() {
            return 0;
            return 0;
            return 0;
        }

        int a1;
        int a2;
    };
};

struct s2 {
    struct t1 {
        int testfn2() {
            return 0;
        }

        int a1;
        int a2;
    };

};

int main() {
    return 0;
}

Expected behavior

From class c1 ]t as well as ]T unconditionally jump to last and innermost scope, but only ]T should do that.
]t should jump to end of function.

From end of innermost scope (     return 1 in nested_t1()), [thas expectable behavior, but feels inconsistent as its no reverse operation to]t` with first jumping to start of statement and then to first statement of block before jumping to end of previous block etc.

[T works.

The other big problem is that C-i and C-o do not work. Try on a scope [T and C-o. I would expect that for big movements intermediate jump points would be stored, since they also work from in the mid of class objects.

(Personal opinion) Since huge blocks are very common in python classes (but also other languages), I find the behavior for [T and ]T not helpful and instead "moving one scope up or down" sounds like the better alternative (although inconsistent with the other movements).

Actual behavior
In Summary: 1. ]t, 2. C-i, 3. C-o, should work 4. [T,]T is not very useful

Unfortunately this does not clarify what "first, go backwards, go forward and go last" means, because a tree can be walked forwards backwards, but also upwards and downwards.

There is also text after that:

Direction "forward" moves cursor forward to node's end, "backward" - backward to node's start.

Directions "first" and "last" work differently from most other targets for performance reasons. They are essentially "backward" and "forward" with very big n_times option.

As mentioned in the help file, 'treesitter' target moves based on tree created with tree-sitter. Logic is as follows:

Get smallest node under cursor.
Move to its start ([t) or end (]t).
If cursor didn't move or current n_times is bigger than 1, move to start/end of its direct parent.
Repeat previous two steps.

As you are on Neovim>=0.9, I highly recommend calling :InspectTree and exploring behavior of ]t along it.

1. From `class c1` `]t` as well as `]T` unconditionally jump to last and innermost scope, but only `]T` should do that.
   `]t` should jump to end of function.

Yes, because when cursor is on class, the smallest node is the whole class. Moving to its end means moving towards the last character inside its definition (which happens to be end of inner-most def in your example).

2. From end of innermost scope (     return 1 in nested_t1()), [thas expectable behavior, but feels inconsistent as its no reverse operation to]t with first jumping to start of statement and then to first statement of block before jumping to end of previous block etc.

I don't entirely understand what you mean here, but pressing [t from return 1 in nested_t1() moves to start of parent's node because current node is an integer 1 itself (thus moving to its start doesn't move cursor).

4 The other big problem is that C-i and C-o do not work. Try on a scope [T and C-o. I would expect that for big movements intermediate jump points would be stored, since they also work from in the mid of class objects.

Yeah, adding an option whether previous position should be added to jumplist was on the table but I forgot to add it during beta-testing. I've create #298 for that. Thanks!

5. (Personal opinion) Since huge blocks are very common in python classes (but also other languages), I find the behavior for `[T` and `]T` not helpful and instead "moving one scope up or down" sounds like the better alternative (although inconsistent with the other movements).

Consistency here is more important in my opinion.

In Summary: 1. ]t, 2. C-i, 3. C-o, should work 4. [T,]T is not very useful

In Summary: 1. ]t works as expected (if not - that is to blame author of tree-sitter grammar), 2-3. Created #298, 4. That is subject and because of consistency.

Closing this as most of the points seem to be expected and there is #298 to track adding to jumplist. If you disagree, feel free to add to this issue.

@matu3ba, I've pushed new feature to 'mini.bracketed' which adds add_to_jumplist to relevant targets. Now you can set it inside require() call and <C-o> should now work (keep in mind that it only works if jump was on different line):
require('mini.bracketed').setup({
  treesitter = { options = { add_to_jumplist = true } },
})

Cool, thanks alot!


Add online listing to highscores

Highscores module should detect if the query module is installed and if so, show player status

This has already been added


Create application.json

Add more Chinese translations

Closing as this has been already merged on a different pull request. Thanks!


Update to logo, colors, and links to chat and repos

Updated the logo and colors across Imba.io as much as I could.
There is a lot of clean up that needs to be done in regards to colors.
There's a lot of styles overwriting other styles in the cascade.

@scanf  Not sure if I squashed properly. I'm not very good at git.

@iamtirado courtesy ping, how is it going?

In the future please open up small related pull requests so it is easier for us to review.
I have rebased and merged your changes into the master branch, please review it and anything I missed.
I opted to drop the favicon changes since they were not complete and the color changes have been reverted. The yellow is too strong and the other color changes make the text harder to read.
Thanks.


Text not displayed in code completion window when AvalonEdit used from F# code

Everything seems to work fine, as if the code completion text was there, it is just not displayed.
The same behaviour observed on a version of AvalonEdit from 2013 and on the last one.

The minimalistic F# code for using AvalonEdit follows. (Program.fs, Gui.fs, CompletionData.fs, Gui.xaml).
These References are sufficient for running the code:

Program.fs:
//Imported modules/namespaces:
    // System:
open System
    // Project:
open Gui

[<EntryPoint>]
[<STAThread>]
let main _ =
    Osdeui().Run()

Gui.fs:
module Gui

open FSharp.Data
open System
open System.Net
open System.Runtime
open System.Windows
open System.Windows.Controls
open ICSharpCode.AvalonEdit
open ICSharpCode.AvalonEdit.CodeCompletion
open System.Windows.Input

open CompletionData

let appname = "codeCompletionTest"

// Load GUI from URI
//   appname .. name of application
//   xamlName .. name of XAML file
let createWindow appname xamlName =
    let uriString = sprintf "/%s;component/%s" appname xamlName
    let uri = System.Uri(uriString, System.UriKind.Relative)
    Application.LoadComponent(uri) :?> Window

let (?) (window : Window) name =
    window.FindName name
    |> unbox

let inline (+=) (event : IEvent<_, _>) handler =
    (event :> Microsoft.FSharp.Control.IDelegateEvent<_>).AddHandler(RoutedEventHandler(handler))

type Osdeui (xaml : Window) as this = class

    let exit : Button = xaml?exit
    let textEditor : TextEditor = xaml?txtEditor

    // code completion
    let completionWindow = new CompletionWindow(textEditor.TextArea)

    do
        exit.Click += this.exitClick
        textEditor.TextArea.TextEntering.AddHandler(TextCompositionEventHandler this.textEditor_TextArea_TextEntering)
        textEditor.TextArea.TextEntered.AddHandler(TextCompositionEventHandler this.textEditor_TextArea_TextEntered)

    new () = Osdeui (createWindow appname "Gui.xaml")

    member this.exitClick (_ : obj) (_ : RoutedEventArgs) =
        Application.Current.Shutdown()

    member this.textEditor_TextArea_TextEntering (sender : obj) (e : TextCompositionEventArgs) =
        if (e.Text.Length > 0 && completionWindow <> null) then
            (
                if (not (Char.IsLetterOrDigit (e.Text.[0]))) then (
                    // Whenever a non-letter is typed while the completion window is open,
                    // insert the currently selected element.
                    completionWindow.CompletionList.RequestInsertion(e)
                ) else ()
            ) else ()

    member this.textEditor_TextArea_TextEntered (sender : obj) (e : TextCompositionEventArgs) =
         (
            if (e.Text = " ") then (
                // Open code completion after the user has pressed space:
                let completionWindow = new CompletionWindow(textEditor.TextArea)
                let data = completionWindow.CompletionList.CompletionData;
                let items = ["Item1"; "Item2"; "Item3"]
                List.iter (fun x -> data.Add(new MyCompletionData(x))) items

                completionWindow.Show();

                completionWindow.Closed.AddHandler(EventHandler (fun _ _ -> (completionWindow.Close())))
            ) else ()
        )

    member this.Run () =
        (new Application()).Run xaml

end

CompletionData.fs:
module CompletionData

open ICSharpCode.AvalonEdit.CodeCompletion
open System
open System.Windows.Media.Imaging

/// Implements AvalonEdit ICompletionData interface to provide the entries in the
/// completion drop down.
type MyCompletionData (text:string) =
    let _text = text

    interface ICompletionData with

        member this.Complete (textArea, completionSegment, insertionRequestEventArgs) =
            textArea.Document.Replace(completionSegment, ((this :> ICSharpCode.AvalonEdit.CodeCompletion.ICompletionData).Text: string));

        // Use this property if you want to show a fancy UIElement in the list.
        member this.Content
            with get () = (this :> ICSharpCode.AvalonEdit.CodeCompletion.ICompletionData).Text :> obj

         member this.Description
            with get () = ("Description for " + (this :> ICSharpCode.AvalonEdit.CodeCompletion.ICompletionData).Text ) :> obj

        member  this.Image
            with get () = null

        member this.Priority
            with get () = 1.0

        member this.Text = _text

Gui.xaml:
<Window
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:avalonEdit="clr-namespace:ICSharpCode.AvalonEdit;assembly=ICSharpCode.AvalonEdit"
  xmlns:forms="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
  Width="1018.944" Height="360" Title="OSLC">
    <StackPanel HorizontalAlignment="Left" Height="329" VerticalAlignment="Top" Width="1009">
        <StackPanel Height="28" Orientation="Horizontal">
            <Button x:Name="exit" Content="exit" Width="75" HorizontalAlignment="Right" HorizontalContentAlignment="Center"/>
        </StackPanel>
        <StackPanel Height="277">
            <avalonEdit:TextEditor x:Name="txtEditor" Height="262" FontFamily="Consolas" FontSize="10pt"/>
        </StackPanel>

    </StackPanel>
</Window>

I noticed in C# if I implemented ICompletionData explicitly in the code the data wouldn't display in the window.   If I implemented the ICompletionData implicitly, it would work fine.   I believe all interfaces in F# are only explicitly implemented.   EX:
In C# this worked:
public object Content
{
	get { return DisplayText; }
}

This didn't work which I believe is similar what F# would generate
object ICompletionData.Content
{
	get { return DisplayText; }
}

@jerhon: Good catch.
Is it possible to tell WPF data binding to use the interface instead? Otherwise we should probably just document this behavior.

@widc did you find a solution or workaround for this in F# ?

does this help?

The most direct workaround is to define it as an explicit property (and the interface implementation can just refer to the main property):

http://stackoverflow.com/questions/15476046/databinding-a-f-viewmodel

This can be solved as described here:
http://stackoverflow.com/questions/15476046/databinding-a-f-viewmodel

The most direct workaround is to define it as an explicit property (and the interface implementation can just refer to the main property)

this now works:
    type MyCompletionData (text:string) =
        let _text = text

        member this.Text = text

        member this.Complete (textArea:TextArea, completionSegment, insertionRequestEventArgs) =
                textArea.Document.Replace(completionSegment, ((this :> ICSharpCode.AvalonEdit.CodeCompletion.ICompletionData).Text: string));

        member this.Content = (this :> ICSharpCode.AvalonEdit.CodeCompletion.ICompletionData).Text :> obj

        member this.Description = ("Description for " + (this :> ICSharpCode.AvalonEdit.CodeCompletion.ICompletionData).Text ) :> obj

        member  this.Image = null

        member this.Priority = 1.0

        interface ICompletionData with

            member this.Complete (textArea, completionSegment, insertionRequestEventArgs) =
                this.Complete (textArea, completionSegment, insertionRequestEventArgs)

            // Use this property if you want to show a fancy UIElement in the list.
            member this.Content = this.Content

            member this.Description = this.Description

            member  this.Image = this.Image

            member this.Priority = this.Priority

            member this.Text = this.Text

I think this issue can be closed.


Same key name in nested folders

Why can't there be multiple keys with the same key name in nested folders?
Even the example here: https://leva.pmnd.rs/?path=/story/misc-folders--nested-folders
doesn't show 'Third Collapsed Folder' at all under the GUI since it violates that rule. Is this intended? Can think of many situations where there would be same key names under nested folders...

The example is flawed, I will correct it.
The reason is pretty simple and is by design: since the hook returns the flattened schema, there can't be identical keys in a hook and the lib should throw a warning.
You can have identical nested keys in the panel, but just not in the same hook.
// don't do this

@dbismut I see. Is there a way to programatically call useControls? Say I have an deeply nested object with arbitrary number of data that can have the same keys, how would I structure that?

Unfortunately there's no simple way to do this I'm afraid. You can try asking the question on the pmndrs discord linked from the Readme badges.


sound files

Hi, Paul
We should start thinking about what we are using to vet sound files. When we run make, for instance, we get this warning:
python3 test_text_Halkomelem.py
/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/scipy/io/wavfile.py:273: WavFileWarning: Chunk (non-data) not understood, skipping it.
WavFileWarning)
This is a response to a file that the Hul'q'mi'mun folks were using for one of their texts. Other problems we had in Duncan were:

the app rejects files with 16 and 24 bit rates, but ELAN wants these and can't handle 32 bit rate files under at least some conditions
the app seems to choke on very large sound files (I have one in the Golden Eagle folder in the testTextPyData folder)

I'll set up a test module for various problems of this type, but maybe you could tell me something about /scipy/io/ and sound file evaluation in general? Are there other packages you are familiar with that we could be using? It seems to me that maximum flexibility is best and we should limit our checks to making sure that X is a soundfile and that we can carve it up as needed.
David

Hi David,
In order to keep both code and capabilities well-separated:

adopt a single supported sound format (say, 16-bit wav).
process any proposed sound file into that format, with error checking and reporting
processing would be by a stand-alone slexil class which would grow in capability over time,
adding support for (and conversions for) more formats - like mp3

With this approach, we don’t complicate webapp.py.
I picked /scipy/io from a quick web search.  There may be better sound libraries.

Paul

On Aug 18, 2019, at 9:15 AM, David Beck<EMAIL_ADDRESS>wrote:
Hi, Paul
We should start thinking about what we are using to vet sound files. When we run make, for instance, we get this warning:
python3 test_text_Halkomelem.py
/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/scipy/io/wavfile.py:273: WavFileWarning: Chunk (non-data) not understood, skipping it.
WavFileWarning)
This is a response to a file that the Hul'q'mi'mun folks were using for one of their texts. Other problems we had in Duncan were:
• the app rejects files with 16 and 24 bit rates, but ELAN wants these and can't handle 32 bit rate files under at least some conditions
• the app seems to choke on very large sound files (I have one in the Golden Eagle folder in the testTextPyData folder)
I'll set up a test module for various problems of this type, but maybe you could tell me something about /scipy/io/ and sound file evaluation in general? Are there other packages you are familiar with that we could be using? It seems to me that maximum flexibility is best and we should limit our checks to making sure that X is a soundfile and that we can carve it up as needed.
David
—
You are receiving this because you are subscribed to this thread.
Reply to this email directly, view it on GitHub, or mute the thread.

Hi, Paul
I’m not sure how well it would go over with our users if we messed around with the sampling rates of their recordings—though, that said, it looks to me like AudioExtractor logs the sampling rate and outputs at the same rate when it makes the line-by-line files anyway.
I’m having good luck with the built in soundfile module (formerly PySoundfile). We might have to install it manually on the Linux VM, but other than that it has the IO functions we need and doesn’t choke on 24-bit recordings. I need to do some more testing over the next week or so, but this might solve our problem. Or the ones that have come up so far.
Cheers,
David

On Aug 18, 2019, at 10:39 AM, Paul Shannon<EMAIL_ADDRESS>wrote:
/scipy/io

PySoundFile - bravo!
Should be no trouble to install on the VM.
Can you just swap it into AudioExtractor, and all the tests pass?

Paul

On Aug 18, 2019, at 4:18 PM, David Beck<EMAIL_ADDRESS>wrote:
Hi, Paul
I’m not sure how well it would go over with our users if we messed around with the sampling rates of their recordings—though, that said, it looks to me like AudioExtractor logs the sampling rate and outputs at the same rate when it makes the line-by-line files anyway.
I’m having good luck with the built in soundfile module (formerly PySoundfile). We might have to install it manually on the Linux VM, but other than that it has the IO functions we need and doesn’t choke on 24-bit recordings. I need to do some more testing over the next week or so, but this might solve our problem. Or the ones that have come up so far.
Cheers,
David

On Aug 18, 2019, at 10:39 AM, Paul Shannon<EMAIL_ADDRESS>wrote:
/scipy/io

—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub, or mute the thread.

I expect so, but I want to try it against a set of sound files of various types that aren’t part of our test suite first. We had several issues with files of different types in Duncan and I’d like to make sure that we don’t have to try something even more sophisticated like librosa, which seems to be popular but looks like overkill to me.
David

On Aug 18, 2019, at 9:04 PM, Paul Shannon<EMAIL_ADDRESS>wrote:
PySoundFile - bravo!
Should be no trouble to install on the VM.
Can you just swap it into AudioExtractor, and all the tests pass?

Paul

On Aug 18, 2019, at 4:18 PM, David Beck<EMAIL_ADDRESS>wrote:
Hi, Paul
I’m not sure how well it would go over with our users if we messed around with the sampling rates of their recordings—though, that said, it looks to me like AudioExtractor logs the sampling rate and outputs at the same rate when it makes the line-by-line files anyway.
I’m having good luck with the built in soundfile module (formerly PySoundfile). We might have to install it manually on the Linux VM, but other than that it has the IO functions we need and doesn’t choke on 24-bit recordings. I need to do some more testing over the next week or so, but this might solve our problem. Or the ones that have come up so far.
Cheers,
David

On Aug 18, 2019, at 10:39 AM, Paul Shannon<EMAIL_ADDRESS>wrote:
/scipy/io

—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub, or mute the thread.

—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub https://github.com/paul-shannon/slexil/issues/47?email_source=notifications&email_token=AKN4HBTFRUHRIOQFOZIJ3QLQFIESLA5CNFSM4IMTNQG2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOD4RRWRA#issuecomment-522394436, or mute the thread https://github.com/notifications/unsubscribe-auth/AKN4HBUDFX25NDKKKUZXBFDQFIESLANCNFSM4IMTNQGQ.


Feature/nw/rollup lwc  feb 24 sprint add test dlrs rollups

Critical Changes
Add Snowfakery as Sample dataset
Add sample DLRS Rollups into unpackaged for testing
Changes
Issues Closed
#1407
#1411

This pull request has everything we worked on the Feb 24 Sprint and more.
The key items are added to the Unpackaged/QA folder

Fields and DLRS Rollups to run test scenarios
Page Layouts with new fields for testing purposes
Snowfakery data to run test scenaios
Add Snowfakery to cumulus.yml file to run task
Apex Classes and Tests for new DLRS Rollups

There is a good amount of files with an API version change.  I think this was due to creating the org in Metecho.  And some other files that look to be for DLRS, but would like to be ignored.

Ideally this would be merged into master so we can get our test plans in place for the latest release.

@mkolodner more of an FYI than anything, but we went crazy on snowfakery and test DLRS rollups at the Feb 2024 Sprint.  The work is based on this spreadsheet we created: https://docs.google.com/spreadsheets/d/1acareyNRNxlsS93-9H5OlSgIIvlNzg0sBQS8neMtZU0/edit


Initial commit

Initial set of acceptance test criteria.
This PR is meant for review to decide:

Whether the acceptance criteria aids in understandability of various features
Gherkin is suitable for writing down "executable" acceptance test criteria from the POV of the entire team
Split acceptance criteria for user stories/features based on walking skeleton and project backlog
Split feature files based on feature areas
Map out how to write the test implementation:

Choice of language (Golang vs any other)
Choice of framework (Godog vs goconvey vs any other)

Please don't merge this. I'm opening this for review cc @aslakknutsen @ldimaggi

I started a little GoDog experiment during the weekend. Essentially testing the /api/status endpoint via the client lib defined as a feature spec; https://github.com/aslakknutsen/almighty-core/commit/9c46604f58f27b25f1b902952b4ffb4b5667753a

Initial comments follow below (I will attach finer-grained comments to the individual files):

Whether the acceptance criteria aids in understandability of various features
------> Agreed, this looks good.

Gherkin is suitable for writing down "executable" acceptance test criteria from the POV of the entire team
------> +1, better to use this than to define an entirely new syntax

Split acceptance criteria for user stories/features based on walking skeleton and project backlog
------> +1, within the context of the progress made in each sprint

Split feature files based on feature areas
------> +1, this is a good approach to organizing this

Map out how to write the test implementation:

Choice of language (Golang vs any other)

Choice of framework (Godog vs goconvey vs any other)

------> Not sure on this - I have not yet used Go....yet.

@aslakknutsen That's useful!
There are a few tests that may require browser-based tests to be implemented. I'm currently working on the criteria for iteration planning and backlog management, and a few scenarios involving moving WIs across iterations may require browser based tests. Will point those out as soon as I have finished committing and pushing them.

1) Global comments:

It's not yet a defined story, but when we go on-premises, we will have to define the means by which users can administer an entire RHD server.
Will you add the issue numbers to all the features/scenarios?
I saw your comment regarding the need to use a browser for some tests. In order to be a full test for the API and the UI, wouldn't we want to verify each scenario both through the API, and through the UI? The UI accesses the core services through the API, but it must be able to process, present, manipulate core services data in the UI.
In terms of implementing the acceptance tests, yes - I volunteer to help.   ;-)

2) Comments on specific files:
a) agile/backlog-mgmt/backlog-mgmt.feature
Line 3 - Scenario: Add work items to backlog - The newly created work item will have its create date/time set to the current date/time. What about the status value of the new workitem? Will it be set to "new" or will it have no value?
Line 11 - Scenario: Rank work items in sprint - Just to confirm - A workitem can be assigned a ranking in a sprint or any other iteration, or only in a sprint?
b) build/project-build.feature
Line 26 - What does it mean for a build pipeline to be "linked" to a project? Does the build pipeline appear in the project's list of assets, and/or what else?
Line 39 - Is the manual build started from within the ALM UI?
Line 48 - Will a specific string in the comment trigger the pull request?
Line 102-111 - Will the user be able to re-run/re-start the failed build after the build error is resolved, or must he/she start a new build?
c) collaboration/work-item-collab.feature
Line 7 - How does a user become a team member? Is this always self-service, or is the user assigned to a project?
d) program-mgmt/project-mgmt/project-mgmt.feature
Line 14 - Must the title be unique? Or must a combination of title+description be unique?
Line 63 - Can Deactivated users be re-activated?
e) user-team-mgmt/github-login.feature
f) user-team-mgmt/redhat-login.feature
What happens if a user's account in github/Red Hat is closed?


branch 3-0-stable

There is a minor bug in "overrides/pages_in_header.rb". Instead of

Deface::Override.new(:virtual_path => "spree/shared/_main_nav_bar",
:name => "pages_in_header",
:insert_bottom => "#main-nav-bar",
:partial => "spree/static_content/static_content_header",
:disabled => false)

it should be

:insert_bottom => "#main-nav-bar ul:first"

or

:insert_bottom => "#main-nav-bar ul:first-child"

Could you please submit a PR?

Sure.


JS Recipes has a dead domain.

Was browsing this repo and found : JS Recipes - JavaScript tutorials for backend and frontend development. Clicking the link revealed that the website is gone?
Just wanted to let you guys know.

The domain has expired and I decided not to renew it, but it is still alive at http://sahatyalkabov.com/jsrecipes/


Remove Realm.domain from populate_db.py.

Fixes #2286.

Automated message from Dropbox CLA bot
@rishig, it looks like you've already signed the Dropbox CLA. Thanks!

Merged all but the last commit, which I think is wrong; it doesn't update existing_users as it goes which is a change in behavior that could break some ways we might want to use this function.

Hmm, actually, it's possible that this means the previous conversion of existing_users to be a frozenset is buggy.

I guess it's just the second-to-last commit that introduces that.  OK, merged all but the last 2 commits.

I think the final state is correct, but broke it up into commits incorrectly :/. Maybe just squash the final two commits?

You should also update the commit message to clarify that it's making a functional change -- no longer is it possible to pass multiple users with the same email to this function.

done

Merged (after adding the commit message note I suggested), thanks @rishig!

fwiw, the functionality is actually removed in the parent commit (commit 671d64d above). Though may not be worth changing.

No, that commit removed the "multiple realms" functionality.  This commit removed the ability to pass a list of users that contained duplicates and have something reasonable happen.

ah, got it :).


Add LA design for FUSE key prov.

This PR adds a local attestation protocol design for FUSE key provisioning.

@bigdata-memory Could you merge the 3 commits into single one?

@mythi @jodh-intel Please ack this PR. Thanks.

LGTM but the diagram still talks about "FUSE".

@bigdata-memory one more open question from my side: to my knowledge, ttrpc has no secure transport so is the comms between the two libOSes transparently secured?

@mythi @jodh-intel Please ack this PR. Thanks.

LGTM but the diagram still talks about "FUSE".

Thanks for point it out, and will fix it up.

@bigdata-memory one more open question from my side: to my knowledge, ttrpc has no secure transport so is the comms between the two libOSes transparently secured?

Yes, there is no secure transport configured between ttrpc endpoints in our case, and the LibOSes need to validate and check integrity of what they have received. With regard to the secret in transit, it was designed to be wrapped by shared key.

@bigdata-memory one more open question from my side: to my knowledge, ttrpc has no secure transport so is the comms between the two libOSes transparently secured?

Yes, there is no secure transport configured between ttrpc endpoints in our case, and the LibOSes need to validate and check integrity of what they have received. With regard to the secret in transit, it was designed to be wrapped by shared key.

I think we could add this sentence in the doc too.

@bigdata-memory one more open question from my side: to my knowledge, ttrpc has no secure transport so is the comms between the two libOSes transparently secured?

Yes, there is no secure transport configured between ttrpc endpoints in our case, and the LibOSes need to validate and check integrity of what they have received. With regard to the secret in transit, it was designed to be wrapped by shared key.

I think we could add this sentence in the doc too.

Done, thank you for this advice.

@bigdata-memory Could you merge the 3 commits into single one?

Done, thanks.

@mythi @kailun-qin @jodh-intel If you don't have further comments, I will merge this PR.

@mythi @kailun-qin @jodh-intel If you don't have further comments, I will merge this PR.

I think this ask from you is still missing:

@bigdata-memory I suggest to add such a comment to explain why the key id is not mentioned in flow chart.

@mythi @kailun-qin @jodh-intel If you don't have further comments, I will merge this PR.

@jiazhang0  Sorry for late feedback.. I added my thoughts in #3 since that's where the sealing discussion had started.

@mythi @kailun-qin @jodh-intel If you don't have further comments, I will merge this PR.

I think this ask from you is still missing:

@bigdata-memory I suggest to add such a comment to explain why the key id is not mentioned in flow chart.

Done, Thank you for reminding me.

Thanks @bigdata-memory @jiazhang0 for the PR, few questions,

Based on the figure it looks like, the goal is to mutually attest the agent and app enclave. But without a trusted third party(TTP) or MRenclave how do you identify the app enclave? There is no unique id that is specific to the app enclave. Any other enclave running on the same host could pretend to be the app enclave.
If TTPs are being used, can you clarify which entity acts as the TTP?
Also, how do the agent and app enclaves connect to this TTP? Would both agent and app need to do a RA with the TTP?

Thanks @bigdata-memory @jiazhang0 for the PR, few questions,

Based on the figure it looks like, the goal is to mutually attest the agent and app enclave. But without a trusted third party(TTP) or MRenclave how do you identify the app enclave? There is no unique id that is specific to the app enclave. Any other enclave running on the same host could pretend to be the app enclave.
If TTPs are being used, can you clarify which entity acts as the TTP?
Also, how do the agent and app enclaves connect to this TTP? Would both agent and app need to do a RA with the TTP?

Hi Vijay,
To my understanding, the agent enclave has been attested by RA, so app enclave can trust the agent enclave.  And agent enclave also can verify the payload receiver and LA client together by ttrpc LA(Payload receiver and LA client will have a fixed mrenclave)

Thanks @bigdata-memory @jiazhang0 for the PR, few questions,

Based on the figure it looks like, the goal is to mutually attest the agent and app enclave. But without a trusted third party(TTP) or MRenclave how do you identify the app enclave? There is no unique id that is specific to the app enclave. Any other enclave running on the same host could pretend to be the app enclave.
If TTPs are being used, can you clarify which entity acts as the TTP?
Also, how do the agent and app enclaves connect to this TTP? Would both agent and app need to do a RA with the TTP?

Thanks @YangLiang3, Let me add one more point for your reference. As using ECDHE algorithm, with the pub keys (G_a, G_b) the Agent can distinguish app enclave instance from others.

Thanks @YangLiang3. So how does the agent know the MRenclave of the app enclave? Who provides it this information? From the figure this is not clear to me. And also how does the app enclave know that the agent is remotely attested and is not a malicious enclave.
From the report, we can check the MRsigner and can prove that the enclaves are indeed running on Intel SGX hardware but the identity verification is not clear to me without a TTP.

Thanks @bigdata-memory @jiazhang0 for the PR, few questions,
1. Based on the figure it looks like, the goal is to mutually attest the agent and app enclave. But without a trusted third party(TTP) or `MRenclave` how do you identify the app enclave? There is no unique id that is specific to the app enclave. Any other enclave running on the same host could pretend to be the app enclave.

2. If TTPs are being used, can you clarify which entity acts as the TTP?

3. Also, how do the agent and app enclaves connect to this TTP? Would both agent and app need to do a RA with the TTP?

The essential logic here is that the LibOS components are deployed already by CSP prior to the deployment of workload from application container image, so once RA is established triggered by the initial attestation in order to get the container image decryption key from remote relying party, the mrenclave and other associated evidence claims are sent to remote relying party to be authenticated. The remote relying party will check against mrenclave reflecting the integrity of deployed LibOS and associated configurations to see whether it is trusted. This model is already applied to VM-based (e.g, tdx and sev and so on) confidential containers. This approach will de-couple the deployment of LibOS and app, and mrenclave will not reflect the integrity of app. The app itself is protected by container ecosystem security tools like container image signing and encryption scheme. In summary, the agent-enclave is unverified until the initial remote attestation occurs and then the relying party successfully authenticates it. After that agnet-enclave will decrypt and unpack the encrypted container image and then transfer the filesystem encryption key over LA channel. During the handshake of establishment the LA channel, app-enclave will additionally verify the identity of agent-enclave. I think you are focusing on the last piece of the whole story right? @vijaydhanraj

During the handshake of establishment the LA channel, app-enclave will additionally verify the identity of agent-enclave

Yes, how does app-enclave verify the agent-enclave? Will a trusted third party give the agent's MRenclave to the app-enclave so that it can compare against the report?
Also, another thing: From the proposed design there is nothing preventing a malicious app-enclave running on the same hardware to start the attestation/handshake mechanism to get the fuse key. Is this possible?
Is there a trusted third party that provides the MRenclave of the app-enclave to the agent-enclave?

@vijaydhanraj I have updated the document to address your concern you raised in meeting. thanks.

Thanks @bigdata-memory. Could you also please update the figure so that it becomes more clear?

Thanks @bigdata-memory. Could you also please update the figure so that it becomes more clear?

This has been covered as the steps of check identity against policy on both sides in the figure, Thanks.

This is very ambiguous and while reviewing I had many questions. If this is not explicitly captured it will lead to confusion in the future. So as discussed can you please add some text and update the figure saying there will be a trusted third party that validates the MRenclave of the other party? or whatever is the policy that we plan to incorporate to attest the enclaves between each other.

This is very ambiguous and while reviewing I had many questions. If this is not explicitly captured it will lead to confusion in the future. So as discussed can you please add some text and update the figure saying there will be a trusted third party that validates the MRenclave of the other party? or whatever is the policy that we plan to incorporate to attest the enclaves between each other.

The detailed method to archive identity verification is an implementation-specific so it is not documented in this PR. I think it is reasonable because this design focuses on protocol itself not covering the engineering details and how it will be implemented.
For me, a possible way to verify the peer identity is to use the mrenclave, assuming app-enclave and agent-enclave are hosted by the same version of libos and thus the mrenclave value are same between peers. Another possible way may be TTP as you mentioned. I think this info can be added when the implementation of this protocol is submitted by then. Do it make sense to you?

Please word wrap at 100 characters.

detailed method to archive identity verification is an implementation-specific so it is not documented in this PR.

No, not a detailed method but at least a high-level policy for identification of the other enclave should be incorporated into the design. In attestation evaluating the identity of the other enclave is key and just saying check agent/app against policy feels a little insufficient. This is what I wanted to highlight.

For me, a possible way to verify the peer identity is to use the mrenclave, assuming app-enclave and agent-enclave are hosted by the same version of libos and thus the mrenclave value are same between peers

Don't get this fully as even with same version of libos agent-encalve and app-enclave will have different code flows resulting in different mrenclave and not sure how mrenclave can be used. Or did you mean mrsigner?

Done, thanks.

detailed method to archive identity verification is an implementation-specific so it is not documented in this PR.

No, not a detailed method but at least a high-level policy for identification of the other enclave should be incorporated into the design. In attestation evaluating the identity of the other enclave is key and just saying check agent/app against policy feels a little insufficient. This is what I wanted to highlight.

For me, a possible way to verify the peer identity is to use the mrenclave, assuming app-enclave and agent-enclave are hosted by the same version of libos and thus the mrenclave value are same between peers

Don't get this fully as even with same version of libos agent-encalve and app-enclave will have different code flows resulting in different mrenclave and not sure how mrenclave can be used. Or did you mean mrsigner?

I meant mrenclave exactly. This discussion happens in https://github.com/confidential-containers/enclave-cc/issues/3#issuecomment-1214284752

Thanks for the pointer. I have responded in that thread.

detailed method to archive identity verification is an implementation-specific so it is not documented in this PR.

No, not a detailed method but at least a high-level policy for identification of the other enclave should be incorporated into the design. In attestation evaluating the identity of the other enclave is key and just saying check agent/app against policy feels a little insufficient. This is what I wanted to highlight.

+1, I don't think we are in a rush to get this merged until these design opens are clarified. It sounds the app enclave would have to provide additional info in the report identifying the container rootfs it tries to access and the agent enclave instance would only accept it if the container rootfs matches to what it has processed.

Thanks @hdxia for comments on this diagram.

Thanks @hdxia for comments on this diagram.

Are they available somewhere?

Thanks @hdxia for comments on this diagram.

Are they available somewhere?

They are meeting comments so that's why no Github's comments here. thanks.


Use karma for browser unit tests

Rather than use our demo interface to manually run unit tests in each browser, we can use Karma to launch multiple browsers and run unit tests in a single grunt command.
All we need to do is write an adapter from our unit tests to an existing JavaScript unit test framework (e.g. Jasmine), and then Karma does the rest.
Once we do this, we can separate our demo code from the Doppio repository!

This isn't working for me, yet. It runs all the tests in the browser, but hangs afterward. Also, it reports that 29/64 tests failed, but doesn't show the diffs for any of them (unless I view the console in the karma window).

All output should be in the console window. The browser(s) configured in the gruntfile launch in the background, letting you nest the console window underneath your text editor and watch test results live as they happen.

You can see the desired workflow in this screencast (I've linked to the appropriate time):
https://www.youtube.com/watch?v=MVw8N3hTfCI#t=228

Fair enough, though I don't think our use-case works very well with the test-on-save workflow: the full test suite takes about 1 minute and 30 seconds to run, and that's after re-building doppio. Also, I tried editing a file after running the test suite, and karma didn't do anything on save.
Also, only one diff ever appears in the console output, even though many tests fail: http://pastebin.com/zpsbrge0

Yeah, I think there's some weird stuff going on that I'll need to check.

Fair enough, though I don't think our use-case works very well with the test-on-save workflow: the full test suite takes about 1 minute and 30 seconds to run, and that's after re-building doppio.

Agreed. It will get better when Doppio can run in a WebWorker.

Whatever changed, it seemed to fix things. The karma tests now pass 62/64 tests, only failing the FileOps test (fails check that /tmp is writeable) and the CatchingClinitException test (not sure why).


Storybook-ify this thing!

This gets storybook up and running. Because this is run on node all stories are dynamically picked up (yay!). NOTE: fun-dog looks really odd in the storybook story. I am not sure if he is just that way normally or if something is messed up. I didn't invest any time into figuring that out just yet.


The gear icon (used for "Configure Mumble") should be in SVG

https://github.com/mumble-voip/mumble-theme/blob/9c68c1453837b82f69e93d7df2dbdd086d96f27d/config_basic.png is the icon that represents the "Configure Mumble" action.
The other icons in the toolbar are all in SVG.

@xpoke, do you have an SVG file for the gear icon?

Hey - all missing SVG files should be found in the "exported" folder
https://github.com/mumble-voip/mumble-theme/tree/9c68c1453837b82f69e93d7df2dbdd086d96f27d/exported


mempery

When using the infer code from inference.py, if you want to run the inference step multiple times, script will completely fill up memory in a few minutes.

import torch
from PIL import Image
import psutil
import os
import datetime
import numpy as np

def generate_embeddings():
    model = load_pretrained_model('ir_50')
    test_image_path = 'face_alignment/test_images'
    filename= []
    embedding_list = []
    data = [embedding_list, name_list]
    save_dataset = (str(datetime.date.today())+'_dataset.pt')
    for fname in sorted(os.listdir(test_image_path)):
        path = os.path.join(test_image_path, fname)
        aligned_rgb_img = align.get_aligned_face(path)
        bgr_tensor_input = to_input(aligned_rgb_img)
        encoding, _ = model(bgr_tensor_input)
        embedding_list.append(encoding)
        name_list.append(fname)
        print("Processing: ", fname)
        memory= psutil.virtual_memory()[2]
        print(memory)

    torch.save(data, save_dataset)

I am using adaface to create a database of embeddings, which can then be used in 1-many face recognition.
I've noticed that when creating my database it fills up my memory (32GB) and crashes.
I pinpointed this to this function which the loads the pretrained model:
def load_pretrained_model(architecture='ir_50'):
# load model and pretrained statedict
assert architecture in adaface_models.keys()
model = net.build_model(architecture)
statedict = torch.load(adaface_models[architecture],map_location=torch.device('cpu'))['state_dict']
model_statedict = {key[6:]:val for key, val in statedict.items() if key.startswith('model.')}
model.load_state_dict(model_statedict)
model.eval()
return model
The embeddings are then obtained and saved in a file along with the photo arrays, as follows:
def embed():
model = load_pretrained_model('ir_50')
test_image_path = 'face_alignment/test_images'
name_list = [] # list of names corrospoing to cropped photos
embedding_list = [] # list of embeding matrix after conversion from cropped faces to embedding matrix using resnet
photo_arrays = [] #list of photo arrays
data = [embedding_list, name_list,photo_arrays]
save_dataset = (str(datetime.date.today())+'_dataset.pt')
#enc(save_dataset)
for fname in sorted(os.listdir(test_image_path)):
    path = os.path.join(test_image_path, fname)
    aligned_rgb_img = align.get_aligned_face(path)
    bgr_tensor_input = to_input(aligned_rgb_img)
    encoding, _ = model(bgr_tensor_input)
    embedding_list.append(encoding)
    name_list.append(fname)
    photo_arrays.append(cv2.imread(path))
    print("Processing: ", fname)
torch.save(data, save_dataset) #saving data.pt file

I initially thought the photo arrays being saved in memory were causing the issue, but I took that line out and it made no difference.
I suspect that somehow the model is being loaded into memory on every embedding creation, and then not cleared from memory. I have used this type of embedding generation with other face recognition models and this has not previously been an issue, so I'm not too sure how to get around it.
I modified the inference.py file to generate a list of embeddings from a set of photos and save them as a .pt file.
The complete script:
import net
import torch
import os
from face_alignment import align
import numpy as np
import cv2
import datetime
import psutil
adaface_models = {
'ir_50':"pretrained/adaface_ir50_ms1mv2.ckpt",
}
def load_pretrained_model(architecture='ir_50'):
# load model and pretrained statedict
assert architecture in adaface_models.keys()
model = net.build_model(architecture)
statedict = torch.load(adaface_models[architecture],map_location=torch.device('cpu'))['state_dict']
model_statedict = {key[6:]:val for key, val in statedict.items() if key.startswith('model.')}
model.load_state_dict(model_statedict)
model.eval()
return model
def to_input(pil_rgb_image):
np_img = np.array(pil_rgb_image)
brg_img = ((np_img[:,:,::-1] / 255.) - 0.5) / 0.5
tensor = torch.tensor([brg_img.transpose(2,0,1)]).float()
return tensor
def embed():
model = load_pretrained_model('ir_50')
test_image_path = 'face_alignment/test_images'
name_list = [] # list of names corrospoing to cropped photos
embedding_list = [] # list of embeding matrix after conversion from cropped faces to embedding matrix using resnet
photo_arrays = [] #list of photo arrays
data = [embedding_list, name_list,photo_arrays]
save_dataset = (str(datetime.date.today())+'_dataset.pt')
#enc(save_dataset)
for fname in sorted(os.listdir(test_image_path)):
    path = os.path.join(test_image_path, fname)
    aligned_rgb_img = align.get_aligned_face(path)
    bgr_tensor_input = to_input(aligned_rgb_img)
    encoding, _ = model(bgr_tensor_input)
    embedding_list.append(encoding)
    name_list.append(fname)
    photo_arrays.append(cv2.imread(path))
    print("Processing: ", fname)
    memory= psutil.virtual_memory()[2]
    print(memory)
torch.save(data, save_dataset) #saving data.pt file

The way around this memory leak is to run this line
encoding, _ = model(bgr_tensor_input)
using with torch.no_grad()
Does doing this affect the inference results in any way?

I used another way, using Loky library to excute like this:
from loky import get_reusable_executor
executor = get_reusable_executor(max_workers=1,timeout=100,kill_workers=False)
try:
  del model, feature, norm, features
except:
  print ("sin variables")
gc.collect(generation=2)
gc.collect(generation=1)
gc.collect(generation=0)
gc.collect()
model = load_pretrained_model('ir_101')
test_image_path = '/content/imgs'
features = []
counter=0
def _execute(path:str, model) -> None:
  feature, _ = model(to_input(align.get_aligned_face(path)))
  return feature
def runingEX(test_image_path:str ,file_names: list[str],model) -> None:
  counter=0
  features = []
  for fname in tqdm(file_names):
    path = os.path.join(test_image_path, fname)
    feature= executor.submit(_execute, path, model).result()
    features.append(feature)
    counter+=1
  return features

features=runingEX(test_image_path,sorted(os.listdir(test_image_path)),model)


Dockerfile: update libbpf-source linux version

update the linux version to match the changes in https://github.com/sustainable-computing-io/kepler/commit/f1a8267b6dea1795124bb4d9827d507f5d3f6ec9
It seems this was missed in the checks for https://github.com/sustainable-computing-io/kepler/pull/1408 - only found it today when running make build_image

Note that CI is red on #1418 and #1419 and I believe that will be fixed by this PR.

so... which means we bumped up linux kernel version? to be specific, which means when kepler running on a kube node, the linux kernel version should be bump up accordingly with this PR? @rootfs / @marceloamaral


Synthesis failed for Google.Cloud.Dataproc.V1

Hello! Autosynth couldn't regenerate Google.Cloud.Dataproc.V1. :broken_heart:
Here's the output from running synth.py:
Cloning into 'working_repo'...
Switched to a new branch 'autosynth-Google.Cloud.Dataproc.V1'
Cloning into '/tmpfs/tmp/tmpw211rgj1/googleapis'...
Note: checking out '81a9b8eb87df2bc14a029141a783aa6337ea15fb'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at 81a9b8eb8 For Secret Manager v1 and v1beta1, noted Secret ID character limitations.
Note: checking out '75047719f704d61f405cac6d7439637ab36c1232'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at 75047719 fix Dataproc: add missing `REQUIRED` annotation.
Switched to a new branch 'autosynth-Google.Cloud.Dataproc.V1-24'
Running synthtool
['/tmpfs/src/git/autosynth/env/bin/python3', '-m', 'synthtool', '--metadata', 'synth.metadata', 'synth.py', '--']
2020-04-01 22:38:40,948 synthtool > Executing /tmpfs/src/git/autosynth/working_repo/apis/Google.Cloud.Dataproc.V1/synth.py.
Skipping microgenerator fetch/build: already built, and running on Kokoro
Building existing version of Google.Cloud.Dataproc.V1 for compatibility checking
Generating Google.Cloud.Dataproc.V1
Building new version of Google.Cloud.Dataproc.V1 for compatibility checking

Changes in Google.Cloud.Dataproc.V1:
Diff level: Identical

2020-04-01 22:39:00,554 synthtool > Wrote metadata to synth.metadata.
Changed files:
M apis/Google.Cloud.Dataproc.V1/Google.Cloud.Dataproc.V1/AutoscalingPolicies.cs
 M apis/Google.Cloud.Dataproc.V1/Google.Cloud.Dataproc.V1/AutoscalingPolicyServiceClient.g.cs
 M apis/Google.Cloud.Dataproc.V1/synth.metadata
[autosynth-Google.Cloud.Dataproc.V1-24 2320db756] ignored
 3 files changed, 62 insertions(+), 61 deletions(-)
Switched to branch 'autosynth-Google.Cloud.Dataproc.V1'
Previous HEAD position was 75047719 fix Dataproc: add missing `REQUIRED` annotation.
HEAD is now at 7be2811a fix: Update gapic-generator version to pickup discogapic fixes
Note: checking out '98024617efce32982bd763ad14f00c9bc0819bea'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at 98024617e Touch all the synth.metadata files again
Switched to a new branch 'autosynth-Google.Cloud.Dataproc.V1-0'
Running synthtool
['/tmpfs/src/git/autosynth/env/bin/python3', '-m', 'synthtool', '--metadata', 'synth.metadata', 'synth.py', '--']
2020-04-01 22:39:01,122 synthtool > Executing /tmpfs/src/git/autosynth/working_repo/apis/Google.Cloud.Dataproc.V1/synth.py.
Skipping microgenerator fetch/build: already built, and running on Kokoro
Building existing version of Google.Cloud.Dataproc.V1 for compatibility checking
Generating Google.Cloud.Dataproc.V1
git detects no change in Google.Cloud.Dataproc.V1; skipping compatibility checking
2020-04-01 22:39:08,744 synthtool > Wrote metadata to synth.metadata.
Changed files:
M apis/Google.Cloud.Dataproc.V1/synth.metadata
Switched to branch 'autosynth-Google.Cloud.Dataproc.V1'
Note: checking out '81a9b8eb87df2bc14a029141a783aa6337ea15fb'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at 81a9b8eb8 For Secret Manager v1 and v1beta1, noted Secret ID character limitations.
Previous HEAD position was 7be2811a fix: Update gapic-generator version to pickup discogapic fixes
HEAD is now at a62857d2 fix: add proto_package to the artman config of dataproc v1beta2 to make artman smoketest pass.
Switched to a new branch 'autosynth-Google.Cloud.Dataproc.V1-12'
Running synthtool
['/tmpfs/src/git/autosynth/env/bin/python3', '-m', 'synthtool', '--metadata', 'synth.metadata', 'synth.py', '--']
2020-04-01 22:39:09,245 synthtool > Executing /tmpfs/src/git/autosynth/working_repo/apis/Google.Cloud.Dataproc.V1/synth.py.
Skipping microgenerator fetch/build: already built, and running on Kokoro
Building existing version of Google.Cloud.Dataproc.V1 for compatibility checking
Generating Google.Cloud.Dataproc.V1
git detects no change in Google.Cloud.Dataproc.V1; skipping compatibility checking
2020-04-01 22:39:17,190 synthtool > Wrote metadata to synth.metadata.
Changed files:
M apis/Google.Cloud.Dataproc.V1/synth.metadata
Switched to branch 'autosynth-Google.Cloud.Dataproc.V1'
Note: checking out '81a9b8eb87df2bc14a029141a783aa6337ea15fb'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at 81a9b8eb8 For Secret Manager v1 and v1beta1, noted Secret ID character limitations.
Previous HEAD position was a62857d2 fix: add proto_package to the artman config of dataproc v1beta2 to make artman smoketest pass.
HEAD is now at 7be2811a fix: Update gapic-generator version to pickup discogapic fixes
Switched to a new branch 'autosynth-Google.Cloud.Dataproc.V1-6'
Running synthtool
['/tmpfs/src/git/autosynth/env/bin/python3', '-m', 'synthtool', '--metadata', 'synth.metadata', 'synth.py', '--']
2020-04-01 22:39:17,763 synthtool > Executing /tmpfs/src/git/autosynth/working_repo/apis/Google.Cloud.Dataproc.V1/synth.py.
Skipping microgenerator fetch/build: already built, and running on Kokoro
Building existing version of Google.Cloud.Dataproc.V1 for compatibility checking
Generating Google.Cloud.Dataproc.V1
git detects no change in Google.Cloud.Dataproc.V1; skipping compatibility checking
2020-04-01 22:39:25,863 synthtool > Wrote metadata to synth.metadata.
Changed files:
M apis/Google.Cloud.Dataproc.V1/synth.metadata
Switched to branch 'autosynth-Google.Cloud.Dataproc.V1'
HEAD is now at 7be2811a fix: Update gapic-generator version to pickup discogapic fixes
Note: checking out '38fb38aeb841fb08e12ff366c2159fb6669b45d8'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at 38fb38aeb Touch synth.metadata to get SecretManager APIs building
Switched to a new branch 'autosynth-Google.Cloud.Dataproc.V1-3'
Running synthtool
['/tmpfs/src/git/autosynth/env/bin/python3', '-m', 'synthtool', '--metadata', 'synth.metadata', 'synth.py', '--']
2020-04-01 22:39:26,333 synthtool > Executing /tmpfs/src/git/autosynth/working_repo/apis/Google.Cloud.Dataproc.V1/synth.py.
Skipping microgenerator fetch/build: already built, and running on Kokoro
Building existing version of Google.Cloud.Dataproc.V1 for compatibility checking
Generating Google.Cloud.Dataproc.V1
git detects no change in Google.Cloud.Dataproc.V1; skipping compatibility checking
2020-04-01 22:39:33,820 synthtool > Wrote metadata to synth.metadata.
Changed files:
M apis/Google.Cloud.Dataproc.V1/synth.metadata
Switched to branch 'autosynth-Google.Cloud.Dataproc.V1'
HEAD is now at 7be2811a fix: Update gapic-generator version to pickup discogapic fixes
Note: checking out '0c88ce0da0e66910735643832b237c9f873b05e6'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at 0c88ce0da Add a new AuthorizationType for Data Source Definition.
Switched to a new branch 'autosynth-Google.Cloud.Dataproc.V1-1'
Running synthtool
['/tmpfs/src/git/autosynth/env/bin/python3', '-m', 'synthtool', '--metadata', 'synth.metadata', 'synth.py', '--']
2020-04-01 22:39:34,283 synthtool > Executing /tmpfs/src/git/autosynth/working_repo/apis/Google.Cloud.Dataproc.V1/synth.py.
Skipping microgenerator fetch/build: already built, and running on Kokoro
Building existing version of Google.Cloud.Dataproc.V1 for compatibility checking
Generating Google.Cloud.Dataproc.V1
git detects no change in Google.Cloud.Dataproc.V1; skipping compatibility checking
2020-04-01 22:39:41,966 synthtool > Wrote metadata to synth.metadata.
Changed files:
M apis/Google.Cloud.Dataproc.V1/synth.metadata
Switched to branch 'autosynth-Google.Cloud.Dataproc.V1'
On branch autosynth-Google.Cloud.Dataproc.V1
nothing to commit, working tree clean
Traceback (most recent call last):
  File "/home/kbuilder/.pyenv/versions/3.6.9/lib/python3.6/runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "/home/kbuilder/.pyenv/versions/3.6.9/lib/python3.6/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/tmpfs/src/git/autosynth/autosynth/synth.py", line 484, in <module>
    main()
  File "/tmpfs/src/git/autosynth/autosynth/synth.py", line 334, in main
    return _inner_main(temp_dir)
  File "/tmpfs/src/git/autosynth/autosynth/synth.py", line 431, in _inner_main
    branch,
  File "/tmpfs/src/git/autosynth/autosynth/synth.py", line 202, in synthesize_loop
    patch_merge_version(young)
  File "/tmpfs/src/git/autosynth/autosynth/synth.py", line 171, in patch_merge_version
    or flat_source_versions[flat_version_index].version.get_comment()
  File "/tmpfs/src/git/autosynth/autosynth/git.py", line 95, in commit_all_changes
    subprocess.check_call(["git", "commit", "-m", message])
  File "/home/kbuilder/.pyenv/versions/3.6.9/lib/python3.6/subprocess.py", line 311, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['git', 'commit', '-m', 'Add a new AuthorizationType for Data Source Definition.\n\nhttps://github.com/googleapis/google-cloud-dotnet/commit/0c88ce0da0e66910735643832b237c9f873b05e6\ncommit 0c88ce0da0e66910735643832b237c9f873b05e6\nAuthor: yoshi-automation<EMAIL_ADDRESS>  Wed Apr 1 02:27:58 2020 -0700\n\n    Add a new AuthorizationType for Data Source Definition.\n    \n    https://github.com/googleapis/googleapis/commit/17cfae00f2bb51cb1683f017da7e295a1b0f01a8\n    commit 17cfae00f2bb51cb1683f017da7e295a1b0f01a8\n    Author: Google APIs<EMAIL_ADDRESS>  Date:   Tue Mar 31 10:21:11 2020 -0700\n    \n        Add a new AuthorizationType for Data Source Definition.\n    \n        PiperOrigin-RevId: 303992863']' returned non-zero exit status 1.

Google internal developers can see the full log here.

Autosynth passed, closing! :green_heart:


Fix storage class default flag

Proposed changes
Fix setting the default flag on a storage class if the model doesn't already have an annotations object.
Types of changes
Bugfix
Linked Issues
rancher/rancher#15097

@vincent99 FYI the build is failed


add multi account and save date profile

add multi accounts/bearer save in bearer.txt and save info profile in profile.txt auto update add feature number 3 for check update profile data after tip


fix: include wallets exports alias directory in npm bundle

fix #788

Thanks for fixing this! I just manually applied this fix to a standalone project and it works as expected.


Added the dependency to angular so that sequencing is done correctly …

…on gulp builds
Changed dependency version.

Thank you!


[Bug]: Unknown named parameter $to

What happened?

How to reproduce the bug
When i add the points needed to level up to the next level i get this.
             $amount = 200;
             $Pointsamount = 400;

        $user->coins += $amount;
        $user->addPoints($Pointsamount);

Package Version
^1.2.3
PHP Version
8.2.7
Laravel Version
^10.0
Which operating systems does with happen with?
Linux
Notes
No response

I cannot recreate this...
Are you sure you're on a version of PHP that supports named arguments?
You could overwrite the levelUp method on your Model and remove the named argument and see if that works.
Sorry couldn't be more help.

I am on php 8.2.7, as I remember this version supports named arguments.
how may I go about overwriting it.

Yeah that should support it... very odd.
In your Model (where you use the GiveExperience trait, add the levelUp method from the Trait and remove the named argument.
Or, if you want to clean things up, you could create a Trait and extend the GiveExperience trait and add it in there.

Ok i'll try that. Thank you so much for the help

oh there is one thing that could be causing this.
I don't know how to use the level facade so i seeded the database.
<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;

class LevelSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run() : void
    {
        $baseExperience = 250;
        $levels = [];

        // Add level 1 with null next_level_experience
        $levels[] = [
            'level' => 1,
            'next_level_experience' => null,
        ];

        // Loop through levels starting from 2 (skip level 1)
        for ($level = 2; $level <= 200; $level++) {
            $experience = round($baseExperience + (0.3 * ($level - 1)));
            $baseExperience = $experience;

            $levels[] = [
                'level' => $level,
                'next_level_experience' => $experience,
            ];
        }

        // Insert all levels in a single batch for efficiency
        DB::table('levels')->insert($levels);
    }
}

Argh... sorry, I've given you some bad info (long day...)
It is the PointsIncreasedListener where you got the error, but I'm unsure how you'd overwrite that... seems a lot of work for something that technically isn't a bug in the first place.
A Level can be added with the facade:
Level::add([
    'level' => 2,
    'next_level_experience' => 200,
]);

Argh... sorry, I've given you some bad info (long day...)
It is the PointsIncreasedListener where you got the error, but I'm unsure how you'd overwrite that... seems a lot of work for something that technically isn't a bug in the first place.
A Level can be added with the facade:
Level::add([
    'level' => 2,
    'next_level_experience' => 200,
]);

No Worries. But i do wonder how to fix this.

Argh... sorry, I've given you some bad info (long day...)
It is the PointsIncreasedListener where you got the error, but I'm unsure how you'd overwrite that... seems a lot of work for something that technically isn't a bug in the first place.
A Level can be added with the facade:
Level::add([
    'level' => 2,
    'next_level_experience' => 200,
]);

oh but how so in my case. i want to make 200 levels seeded with a linear curve in exp so that i can automate it.

I'm not 100% what you mean, but some kind of loop I imagine in a Seeder.
I'm gonna close the issue now as it isn't something I can help further with or fix.
Good luck with your journey.

I'm not 100% what you mean, but some kind of loop I imagine in a Seeder.
I'm gonna close the issue now as it isn't something I can help further with or fix.
Good luck with your journey.

thank you


Button + Ripple initialization race condition

I discovered a bug, but haven't been able to reduce this to a minimal test case. I'll dig into this again in the next days, but perhaps this is already helpful.
When dynamically adding an mdl-button with ripple effect, it is possible to end up in a state where the mdl-button__ripple-container and its mdl-ripple are added, but rippleElement_ inside MaterialRipple is uninitialized. When triggering a ripple, it causes an exception in this line:
MaterialRipple.prototype.upHandler_ = function(event) {
  'use strict';

  // Don't fire for the artificial "mouseup" generated by a double-click.
  if (event && event.detail !== 2) {
    // **Uncaught TypeError: Cannot read property 'classList' of null**
    this.rippleElement_.classList.remove(this.CssClasses_.IS_VISIBLE);
  }
};

(Source)
Most other places in the file guard against this.element_ being null, but adding a fix here would only mask the underlying problem that the initialization is incomplete. The DOM, however, looks like this:

I'll try to narrow this down further, I think there's a very small window when the component handler races against the initial render of my layout, which happens via virtual-dom materialization.

+1

@samosfator Could you elaborate on your "+1"? Are you running into this issue, and if so, could you provide more details?


Add support for logging in to micro.blog

Currently you can only log into Indigenous with a hosted micro.blog site that supports IndieAuth.
This issue adds support for logging in to micro.blog for accounts that either don't support IndieAuth.
Logging in to micro.blog will begin if the user:

During the website authentication, it contains a micro.blog hosted micropub endpoint.

If the user enters https://micro.blog/username as their domain, rather than their hosted micro.blog, it should present an information screen explaining that they need to provide the URL for their hosted micro.blog or IndieAuth compatible website.

If a user uses this method, it should put the micro.blog token both into the micropub token position but also the micro.blog token position, allowing the user to both post to their hosted micro.blog micropub endpoint but also read their micro.blog timeline.

Logging in to Micro.blog will only use IndieAuth


The request suddenly stops working and returns empty result today.
Update:
The request works again. Sorry for the trouble

Ok cool, maybe the backend failed :)


Example Moveit-setup fails...

Hey everyone,
lately i was trying to use the example moveit-setup to test the driver, but unfortunately it does not work. I followed the given instructions in "Getting started" without any problems. Then connected the robot with my laptop successfully. Then I started the driver with the following command:
$ ros2 launch ur_bringup ur_control.launch.py ur_type:=ur3e robot_ip:=<IP_ADDRESS> launch_rviz:=false
Then in another terminal:
fams-projekt-mosim2@FAMS-PROJEKT-MOSIM2:~/workspace_0/ros_ur_driver_0$ ros2 launch ur_moveit_config ur_moveit.launch.py ur_type:=ur3e launch_rviz:=true
[INFO] [launch]: All log files can be found below /home/fams-projekt-mosim2/.ros/log/2022-04-26-10-18-43-806004-FAMS-PROJEKT-MOSIM2-11488
[INFO] [launch]: Default logging verbosity is set to INFO
Task exception was never retrieved
future: <Task finished name='Task-2' coro=<LaunchService._process_one_event() done, defined at /opt/ros/galactic/lib/python3.8/site-packages/launch/launch_service.py:226> exception=PackageNotFoundError("package 'warehouse_ros_mongo' not found, searching: ['/home/fams-projekt-mosim2/workspace_0/ros_ur_driver_0/install/ur_calibration', '/home/fams-projekt-mosim2/workspace_0/ros_ur_driver_0/install/ur_robot_driver', '/home/fams-projekt-mosim2/workspace_0/ros_ur_driver_0/install/ur_controllers', '/home/fams-projekt-mosim2/workspace_0/ros_ur_driver_0/install/ur_msgs', '/home/fams-projekt-mosim2/workspace_0/ros_ur_driver_0/install/ur_moveit_config', '/home/fams-projekt-mosim2/workspace_0/ros_ur_driver_0/install/ur_bringup', '/home/fams-projekt-mosim2/workspace_0/ros_ur_driver_0/install/ur_description', '/home/fams-projekt-mosim2/workspace_0/ros_ur_driver_0/install/ur_dashboard_msgs', '/opt/ros/galactic']")>
Traceback (most recent call last):
File "/opt/ros/galactic/lib/python3.8/site-packages/ament_index_python/packages.py", line 50, in get_package_prefix
content, package_prefix = get_resource('packages', package_name)
File "/opt/ros/galactic/lib/python3.8/site-packages/ament_index_python/resources.py", line 48, in get_resource
raise LookupError(
LookupError: Could not find the resource 'warehouse_ros_mongo' of type 'packages'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/opt/ros/galactic/lib/python3.8/site-packages/launch/launch_service.py", line 228, in _process_one_event
await self.__process_event(next_event)
File "/opt/ros/galactic/lib/python3.8/site-packages/launch/launch_service.py", line 248, in __process_event
visit_all_entities_and_collect_futures(entity, self.__context))
File "/opt/ros/galactic/lib/python3.8/site-packages/launch/utilities/visit_all_entities_and_collect_futures_impl.py", line 45, in visit_all_entities_and_collect_futures
futures_to_return += visit_all_entities_and_collect_futures(sub_entity, context)
File "/opt/ros/galactic/lib/python3.8/site-packages/launch/utilities/visit_all_entities_and_collect_futures_impl.py", line 45, in visit_all_entities_and_collect_futures
futures_to_return += visit_all_entities_and_collect_futures(sub_entity, context)
File "/opt/ros/galactic/lib/python3.8/site-packages/launch/utilities/visit_all_entities_and_collect_futures_impl.py", line 45, in visit_all_entities_and_collect_futures
futures_to_return += visit_all_entities_and_collect_futures(sub_entity, context)
[Previous line repeated 2 more times]
File "/opt/ros/galactic/lib/python3.8/site-packages/launch/utilities/visit_all_entities_and_collect_futures_impl.py", line 38, in visit_all_entities_and_collect_futures
sub_entities = entity.visit(context)
File "/opt/ros/galactic/lib/python3.8/site-packages/launch/action.py", line 108, in visit
return self.execute(context)
File "/opt/ros/galactic/lib/python3.8/site-packages/launch_ros/actions/node.py", line 484, in execute
ret = super().execute(context)
File "/opt/ros/galactic/lib/python3.8/site-packages/launch/actions/execute_process.py", line 837, in execute
self.__expand_substitutions(context)
File "/opt/ros/galactic/lib/python3.8/site-packages/launch/actions/execute_process.py", line 681, in __expand_substitutions
cmd = [perform_substitutions(context, x) for x in self.__cmd]
File "/opt/ros/galactic/lib/python3.8/site-packages/launch/actions/execute_process.py", line 681, in
cmd = [perform_substitutions(context, x) for x in self.__cmd]
File "/opt/ros/galactic/lib/python3.8/site-packages/launch/utilities/perform_substitutions_impl.py", line 26, in perform_substitutions
return ''.join([context.perform_substitution(sub) for sub in subs])
File "/opt/ros/galactic/lib/python3.8/site-packages/launch/utilities/perform_substitutions_impl.py", line 26, in
return ''.join([context.perform_substitution(sub) for sub in subs])
File "/opt/ros/galactic/lib/python3.8/site-packages/launch/launch_context.py", line 197, in perform_substitution
return substitution.perform(self)
File "/opt/ros/galactic/lib/python3.8/site-packages/launch_ros/substitutions/executable_in_package.py", line 76, in perform
package_prefix = super().perform(context)
File "/opt/ros/galactic/lib/python3.8/site-packages/launch_ros/substitutions/find_package.py", line 79, in perform
result = self.find(package)
File "/opt/ros/galactic/lib/python3.8/site-packages/launch_ros/substitutions/find_package.py", line 96, in find
return get_package_prefix(package_name)
File "/opt/ros/galactic/lib/python3.8/site-packages/ament_index_python/packages.py", line 52, in get_package_prefix
raise PackageNotFoundError(
ament_index_python.packages.PackageNotFoundError: "package 'warehouse_ros_mongo' not found, searching: ['/home/fams-projekt-mosim2/workspace_0/ros_ur_driver_0/install/ur_calibration', '/home/fams-projekt-mosim2/workspace_0/ros_ur_driver_0/install/ur_robot_driver', '/home/fams-projekt-mosim2/workspace_0/ros_ur_driver_0/install/ur_controllers', '/home/fams-projekt-mosim2/workspace_0/ros_ur_driver_0/install/ur_msgs', '/home/fams-projekt-mosim2/workspace_0/ros_ur_driver_0/install/ur_moveit_config', '/home/fams-projekt-mosim2/workspace_0/ros_ur_driver_0/install/ur_bringup', '/home/fams-projekt-mosim2/workspace_0/ros_ur_driver_0/install/ur_description', '/home/fams-projekt-mosim2/workspace_0/ros_ur_driver_0/install/ur_dashboard_msgs', '/opt/ros/galactic']"
I tried apt updating and building the workspace new. When i am right, there is a problem with the warehouse_mongo package?
Any help on solving my problem is appreciated!

have you execute rosdep install inside your workspace? It is very obvious that the package warehouse_ros_mongo is missing.

Yes, I did. As stated in the getting started part.
$rosdep install --ignore-src --from-paths src -y -r
Any suggestions what else could be the reason why the warehouse_ros_mongo package is missing?

A quick grep in my workspace shows that indeed warehouse_ros_mongo is needed, but not defined as a dependency
grep -r warehouse_ros_mongo
Universal_Robots_ROS2_Driver/ur_moveit_config/launch/ur_moveit.launch.py:        package="warehouse_ros_mongo",
Universal_Robots_ROS2_Driver/ur_moveit_config/launch/ur_moveit.launch.py:            {"warehouse_plugin": "warehouse_ros_mongo::MongoDatabaseConnection"},
``


Add support for transitions when properties is changed

It would be great to support animated transitions on changed properties.
The main idea is as follows: when property is changed in UpdateIncremental we should check if any transitions is attached to this property. If transition is attached to the property then we should invoke transition callback instead of modifying property value directly.
Take a look at small example:
type ITransition =
  abstract member Property: BindableProperty
  abstract member Execute: (View * obj * obj) -> unit

let transition<'a> property fn =
  { new ITransition with
      member x.Property = property
      member x.Execute(view, fromValue, toValue) =
        fn view (unbox fromValue) (unbox toValue) }

View.Frame(
  translationX = model.TranslationX,
  transitions = [
    transition<float> View.TranslationXProperty (fun view fromValue toValue ->
        Animation((fun v -> view.TranslationX <- v), fromValue, toValue, Easing.CubicOut)
          .Commit(view, "MyAnimation", 16u, 200u))
  ]
)

@TimLariviere Will this still be possible with v2? It seems like an excellent way to work with animations

I still don't know exactly how to incorporate animations in Fabulous. The issue with having functions inside the widgets is that we need to evaluate them all the time because we can't compare functions like we compare values.
This would require a mechanism to synchronize animations to avoid restarting an animation on each update.


Bug: accordion headers do not support more than one line

accordion headers (.collapsible-header) cannot handle text over one line

Yeah it support it, but also I find another bug
https://codepen.io/fega/pen/XMwzmK

Fixed in aae7e6fd


Migrations that update index field types will drop the index and not recreate

Bug description
Changing the types of fields that are part of an index will implicitly drop the index but not recreate it.
How to reproduce
Step 1: create a model with an index.
model Event {
  id              Int      @id @default(autoincrement())
  aggregateType   String?
  aggregateId     String?
  @@index([aggregateType, aggregateId])
}

Step 2: create and apply a migration
Step 3: update the model by changing one of the types used in the index
model Event {
  id              Int      @id @default(autoincrement())
  aggregateType   String?
  aggregateId     Int?
  @@index([aggregateType, aggregateId])
}

Step 3: create and apply a new migration.  Notice that the migration drops and recreates the changed column. Implicitly the index will also be dropped. So after applying the migration the index is missing.
-- AlterTable
ALTER TABLE "event" DROP COLUMN "aggregate_id",
ADD COLUMN     "aggregate_id" INTEGER;

The problem will be picked up the next time that a migration is created. Prisma will think the index is new and add it. But until the next migration is created the index is missing, and the prisma schema is not in sync with the database schema.
Expected behavior

Prisma should probably explicitly drop and recreate indexes in migrations when any of the fields used by the index are modified.
Prisma information
datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

Environment & setup

OS: Mac OS
Database: PostgreSQL
Node.js version: v14.16.0
Prisma version:

prisma               : 2.19.0
@prisma/client       : 2.19.0
Current platform     : darwin
Query Engine         : query-engine c1455d0b443d66b0d9db9bcb1bb9ee0d5bbc511d (at node_modules/@prisma/engines/query-engine-darwin)
Migration Engine     : migration-engine-cli c1455d0b443d66b0d9db9bcb1bb9ee0d5bbc511d (at node_modules/@prisma/engines/migration-engine-darwin)
Introspection Engine : introspection-core c1455d0b443d66b0d9db9bcb1bb9ee0d5bbc511d (at node_modules/@prisma/engines/introspection-engine-darwin)
Format Binary        : prisma-fmt c1455d0b443d66b0d9db9bcb1bb9ee0d5bbc511d (at node_modules/@prisma/engines/prisma-fmt-darwin)
Studio               : 0.358.0

I can confirm this with  2.20.0-dev.11. Thanks for the detailed report.