[Bug]: Chroma process killed, possibly due to insufficient RAM

What happened?
I have a collection with 2548000 (2.5 million) embeddings. Each vector has 768 dimensions.
I'm running Chroma in a container locally, using docker compose.
When I limit the RAM available to the container to 4Gb, the instance crashes as soon as I do collection.query with a single question.
The only thing I see in logs is that the worker was killed.
chroma_bench-chroma-1  | INFO:     [29-09-2023 22:17:52] Application startup complete.
chroma_bench-chroma-1  | INFO:     [29-09-2023 22:17:52] Uvicorn running on http://<IP_ADDRESS>:8000 (Press CTRL+C to quit)
chroma_bench-chroma-1  | INFO:     [29-09-2023 22:18:00] <IP_ADDRESS>:60590 - "POST /api/v1/collections HTTP/1.1" 200
chroma_bench-chroma-1  | /docker_entrypoint.sh: line 6:    12 Killed                  uvicorn chromadb.app:app --workers 1 --host <IP_ADDRESS> --port 8000 --proxy-headers --log-config chromadb/log_config.yml

I'm trying to see if we can use Chroma in our project, so I need to be aware of scaling implications, which is why I'm testing these things.
At 1 million entries, the data_level0.bin file was taking around 3Gb, and limiting RAM to 2Gb resulted in the first query being very slow (30 seconds), but all subsequent queries were fast. And the API kept on working. In the docs it says that Chroma needs at least 2 Gb or RAM, so I didn't want to limit the RAM amount any further.
After that I added more entries, and now at 2.5 mil entries the results are:

3Gb - Killed
4Gb - Killed
5Gb, 6Gb, 7Gb - First query takes 110 seconds, subsequent queries (for the same question) take <0.3 seconds
8Gb - First query takes 13 seconds, subsequent queries take <0.3 seconds
9Gb - First query takes 12 seconds, subsequent queries take <0.3 seconds

I'm wondering if there's anything I can do about this? Did I miss some configuration settings somewhere? Is WSL or Docker to blame?
Is there a specific known amount of RAM that's required for running Chroma with X Gb of embeddings without the process getting killed? Does it depend on the size of the data_level0.bin file?
Versions
Docker image: ghcr.io/chroma-core/chroma:0.4.13
Docker is running on Windows, using WSL2
The dataset I'm ingesting from is https://huggingface.co/datasets/Cohere/wikipedia-22-12-en-embeddings, so each entry is a paragraph from Wikipedia.
The query I use for testing is a short string: "what are some of the most famous cello concertos?"
My docker compose file:
services:
  chroma:
    image: ghcr.io/chroma-core/chroma:0.4.13
    volumes:
      - chroma_persistent_dir:/chroma/chroma
    environment:
      - IS_PERSISTENT=TRUE
    ports:
      - "8000:8000"
    deploy:
      resources:
        limits:
          cpus: '2'
          memory: 4gb

volumes:
  chroma_persistent_dir:
    driver: local

Relevant log output
root@5577030e0b15:/chroma# ls -lah chroma
drwxr-xr-x 2 root root 4.0K Sep 28 18:20 495bc58c-0b8b-40b9-b337-892632dc05c3
drwxr-xr-x 2 root root 4.0K Sep 28 16:15 a185f6c8-a035-40cb-8d2e-f436883d424e
drwxr-xr-x 2 root root 4.0K Sep 29 11:31 aec31602-9c5f-4457-a676-2aaed82c5aeb
-rw-r--r-- 1 root root  21G Sep 29 20:10 chroma.sqlite3

root@5577030e0b15:/chroma# ls -lah chroma/aec31602-9c5f-4457-a676-2aaed82c5aeb/
-rw-r--r-- 1 root root 7.7G Sep 29 20:10 data_level0.bin
-rw-r--r-- 1 root root  100 Sep 29 20:10 header.bin
-rw-r--r-- 1 root root  84M Sep 29 20:10 index_metadata.pickle
-rw-r--r-- 1 root root 9.8M Sep 29 20:10 length.bin
-rw-r--r-- 1 root root  21M Sep 29 20:10 link_lists.bin

sqlite> select count(*), topic from embeddings_queue group by topic;
2729|persistent://default/default/99756a45-2ebe-4f5a-b481-e42f62dfd7dc
2548000|persistent://default/default/b100887e-24a9-47b5-b277-e91f588c445e
109204|persistent://default/default/b437c4ae-1290-4bd9-b1f5-8949c7dd3c13

The cohere embeddings you are using are 786 dimensional, for a million records 768 dims/vector * 4 bytes/dim * 1,000,000 vectors is ~3gb for embeddings alone. The reason the first query is slower is because the dataset has to be loaded in. We are working on better tooling for estimating resource consumption but fundamentally there is no bug here, you need the amount of RAM being consumed since the index lives in RAM.

Going to close this out, as its not a bug, but feel free to reopen if needed. And we can continue to discuss here

Thanks for the response, Hammad.
I agree that there is no bug in terms of getting a super-slow query response when you don't provide enough RAM.
I sort of do think that having degraded performance is better than the process being killed outright without any explanation, so I'd say that the process being killed without even a hint in the logs could possibly count as a bug.
I do, of course, understand that there's no way to completely go around the RAM requirement, but maybe just adding an appropriate error message in the logs (when the process is killed), or maybe adding a warning message (when available RAM is less than the size of the dataset) could be a simple (naive) way to provide some feedback to the user.
As another question, does the index not play nice with swapping? I'm just wondering if there's some way to avoid the process being killed and just getting the degraded performance instead?


Documentation for 0.8.0 release

[x] Postgres - HA setup, wal-g
[x] Elasticsearch - authN, 5.0.x
[x] MySQL
[x] Mongo
[x] Redis
[x] Memcached

https://github.com/kubedb/cli/releases/tag/0.8.0-beta.2


[FEATURE] Appsec and Stream/Live mode together.

Is it possible to have both modes concurrently with this plugin?

Hi @loukaniko85,
Yes it is possible, you can enable streamMode and appsec with the following conf:
      # Choose stream mode
      - "traefik.http.middlewares.crowdsec.plugin.bouncer.crowdsecmode=stream"
      # Enable AppSec
      - "traefik.http.middlewares.crowdsec.plugin.bouncer.crowdsecappsecenabled=true"
      # Define AppSec host and port informations
      - "traefik.http.middlewares.crowdsec.plugin.bouncer.crowdsecappsechost=crowdsec:7422"

The crowdsecmode=appsec, only intend to use appsec blocking feature and not the log analysis/blocking feature that you get with live and stream mode.
Our example on appsec can give you some hints:
https://github.com/maxlerebourg/crowdsec-bouncer-traefik-plugin/tree/main/examples/appsec-enabled

Thank you! I obviously missed this when the WAF feature was implemented.


brittanyCmd not working

environemt:
$ stack --version
Version 1.7.0, Git revision 066e7ce0c0f82dbc914a3e7be51fc356b42df737 (5606 commits) x86_64 hpack-0.20.0

$ stack exec -- ghc --version
The Glorious Glasgow Haskell Compilation System, version 8.2.2

$ stack exec -- hie --version
Version <IP_ADDRESS>, Git revision 0f2bb49606c7903b97949d82e08ddcd07b58ecb2 (1160 commits) x86_64

Run formatting, get this error:
[Error - 19:36:39] Request textDocument/formatting failed.
  Message: IdeError {ideCode = PluginError, ideMessage = "brittanyCmd: HsSpliceE{}\nHsSpliceE{}\nHsSpliceE{}\n", ideInfo = Null}
  Code: -32603

Is there any way to fix?

I'm sorry for being late. It is all right now. Thank you.


Verbatim spans

We'll need these eventually.  Silly example:

\`|content goes in here|`/

with the number of backticks variable and only restriction being that the content cannot contain the literal |`/ token and must respect any layout scopes. Would require a small addition to the state to hold the number of backticks, though maybe we could have a verbatim scope to handle that.

(2) has been implemented in 47af02ccc553a253b54e056e0eea126e421dadfd, which is sufficient for the moment


Fix error messages translated twice

Messages cannot be translated after the printf() has been applied.  It needs to happen on the string with the % items.
If it is tried to translate again, there will not be a match and nothing happens.  It's just a tiny bit of overhead.


Show sidebar in case the user is not logged in

ask the user to log in if he selects

portal
solutions
contracts

also disable the user balance in calculator in case the user is not logged in

The sidebar is now shown even if not logged in but used can navigate to certain pages. PR is ready for review.

Now calculator is broken because the grid is not defined. Will look for a fix tom.

Blocked on https://github.com/threefoldtech/tfgrid-sdk-ts/issues/996

The issue is Blocked on #966 as mentioned in the previous comment. However, as a temporary solution, we can either hide the calculator from the menu for now till it's no longer blocked or copy the same calculator module in the playground which I don't recommend.

WIP:
Implementing calculator methods inside Playground for now. They'll be removed once the #966 is done.

Work completed:
Applied implemented calculator in resources pricing. The calculator can now be used with or without login.

environment used :devnet
verified calculator now can be used with or without login
Screencast from 12-18-2023 02:10:14 PM.webm
same for all of the dashboard components
but he asks only for to log in with wallets to process anything more
testlodge :https://app.testlodge.com/a/26076/projects/40893/suites/234374?expand_section=422331#case_4155946

Verified:

Devnet
000eea2


[Question] Parallel dynamic tree/graph search in Rayon

What is the idiomatic way to do the following in Rayon:

Starting at a given state
A function that, given a state, generates additional states
Generate all states in parallel, collecting them (e.g. into a vector).

The simplest way is to use an Arc<RwLock<Vec<State>>> and use a ThreadPoolBuilder.install(|| reach_state(first_state)), where reach_state will generate the sub-states, then par_iter on each generated sub-state, pushing it into the vector and recursively invoke reach_state on it.
This works. However, this consumes large amounts of stack stack due to the recursive calls to reach_state.
Is there an idiomatic way to setup a queue of items, and tell Rayon to process items in parallel from the queue, where this processing may add new items to the queue? This pattern is common in graph algorithms (basically, parallel variants of Dijkstra's algorithm, with either an explicit input graph or a graph that is being built dynamically as it is being searched).
The underlying libraries (e.g. crossbeam) can obviously do this, but with nothing like Rayon's ease of use.

hi,
here is one:
use rayon::iter::plumbing::{bridge_unindexed, Folder, UnindexedConsumer, UnindexedProducer};
use rayon::prelude::*;
use std::collections::VecDeque;
use std::fmt::Debug;
use std::iter::once;
use std::marker::PhantomData;

struct TreeProducer<'b, S, B, I> {
    to_explore: VecDeque<Vec<S>>, // invariant: no one is empty here
    seen: Vec<S>,
    breed: &'b B,
    phantom: PhantomData<I>,
}

impl<'b, S, B, I> UnindexedProducer for TreeProducer<'b, S, B, I>
where
    S: Send + Debug,
    B: Fn(&S) -> I + Send + Sync,
    I: Iterator<Item = S> + Send,
{
    type Item = S;
    fn split(mut self) -> (Self, Option<Self>) {
        // explore while front is of size one.
        while self
            .to_explore
            .front()
            .map(|f| f.len() == 1)
            .unwrap_or(false)
        {
            let front_node = self.to_explore.pop_front().unwrap().pop().unwrap();
            self.to_explore
                .push_back((self.breed)(&front_node).collect());
            self.seen.push(front_node);
        }
        // now take half of the front.
        let f = self.to_explore.front_mut();
        let right_children = f.map(|f| {
            let n = f.len() / 2;
            let mut c = Vec::with_capacity(n);
            for _ in 0..n {
                c.push(f.pop().unwrap());
            }
            c
        });
        let right = right_children.map(|c| TreeProducer {
            to_explore: once(c).collect(),
            seen: Vec::new(),
            breed: self.breed,
            phantom: PhantomData,
        }); //TODO: if nothing we could split seen
        (self, right)
    }
    fn fold_with<F>(self, mut folder: F) -> F
    where
        F: Folder<Self::Item>,
    {
        // start by consuming everything seen
        for s in self.seen {
            folder = folder.consume(s);
            if folder.full() {
                return folder;
            }
        }
        // now do all remaining explorations
        for mut e in self.to_explore {
            while let Some(s) = e.pop() {
                e.extend((self.breed)(&s));
                folder = folder.consume(s);
                if folder.full() {
                    return folder;
                }
            }
        }
        folder
    }
}

struct TreeIter<S, B, I> {
    initial_state: S,
    breed: B,
    phantom: PhantomData<I>,
}

impl<S, B, I> ParallelIterator for TreeIter<S, B, I>
where
    S: Send + Debug,
    B: Fn(&S) -> I + Send + Sync,
    I: Iterator<Item = S> + Send,
{
    type Item = S;
    fn drive_unindexed<C>(self, consumer: C) -> C::Result
    where
        C: UnindexedConsumer<Self::Item>,
    {
        let producer = TreeProducer {
            to_explore: once(vec![self.initial_state]).collect(),
            seen: Vec::new(),
            breed: &self.breed,
            phantom: PhantomData,
        };
        bridge_unindexed(producer, consumer)
    }
}

fn descendants<S, B, I>(root: S, breed: B) -> TreeIter<S, B, I>
where
    S: Send,
    B: Fn(&S) -> I + Send + Sync,
    I: Iterator<Item = S> + Send,
{
    TreeIter {
        initial_state: root,
        breed,
        phantom: PhantomData,
    }
}

fn main() {
    let v: Vec<u32> = descendants(10, |e| {
        once(e / 2).chain(once(e / 2 + 1)).filter(|&e| e > 2)
    })
    .collect();
    eprintln!("v: {:?}", v);
}

note that you don't necessarily need to collect. if you do it also could be more efficient to fold into Vec and collect into LinkedList<Vec>

@wagnerf42 - thanks for the code. This got complex pretty fast... Especially compared to "replace iter with par_iter" :-)
I don't suppose there's some crate somewhere that has something similar to:
fn par_deque<T>(first: T, task: Fn(T, &RwLock<VecDeque<T>>);

So I could write something along the lines of:
par_deque(first_data, |data, pending| {
    ... do stuff with the data ...
    pending.write().unwrap().push_back(... more data ...);
    ... do stuff with the data ...
    pending.write().unwrap().push_back(... even more data ...);
    ... etc. ...
});

The built-in way to do something like a par_deque is to use a scope and then spawn work into the queue. These can be nested, where one spawned job also adds further spawn calls, without being directly recursive. (Indirectly, they may still be layered on the stack due to work stealing.) That doesn't offer a way to collect though, so at the moment you would have to use your own synchronized means.
It would be interesting to think about something within the ParallelIterator API though, so you could collect. The current par_bridge might be a decent starting point for this, being something that does manage its own queue, only it would be different in the way new stuff gets queued.

@wagnerf42 - thanks for the code. This got complex pretty fast... Especially compared to "replace iter with par_iter" :-)

well. the inner workings are not easy but the use is easy.
here is an example with a tree traversal.
(i fixed a bug btw)
If you look at the main it's just a call to descendant in order to get the parallel iterator.
the descendant function is literally what you wanted.
use rayon::iter::plumbing::{bridge_unindexed, Folder, UnindexedConsumer, UnindexedProducer};
use rayon::prelude::*;
use std::collections::VecDeque;
use std::fmt::Debug;
use std::iter::once;
use std::marker::PhantomData;

struct TreeProducer<'b, S, B, I> {
    to_explore: VecDeque<Vec<S>>, // invariant: no one is empty here
    seen: Vec<S>,
    breed: &'b B,
    phantom: PhantomData<I>,
}

impl<'b, S, B, I> UnindexedProducer for TreeProducer<'b, S, B, I>
where
    S: Send + Debug,
    B: Fn(&S) -> I + Send + Sync,
    I: Iterator<Item = S> + Send,
{
    type Item = S;
    fn split(mut self) -> (Self, Option<Self>) {
        // explore while front is of size one.
        while self
            .to_explore
            .front()
            .map(|f| f.len() == 1)
            .unwrap_or(false)
        {
            let front_node = self.to_explore.pop_front().unwrap().pop().unwrap();
            let next_to_explore: Vec<_> = (self.breed)(&front_node).collect();
            if !next_to_explore.is_empty() {
                self.to_explore.push_back(next_to_explore);
            }
            self.seen.push(front_node);
        }
        // now take half of the front.
        let f = self.to_explore.front_mut();
        let right_children = f.map(|f| {
            let n = f.len() / 2;
            let mut c = Vec::with_capacity(n);
            for _ in 0..n {
                c.push(f.pop().unwrap());
            }
            c
        });
        let right = right_children.map(|c| TreeProducer {
            to_explore: once(c).collect(),
            seen: Vec::new(),
            breed: self.breed,
            phantom: PhantomData,
        }); //TODO: if nothing we could split seen
        eprintln!("right: {}", right.is_some());
        (self, right)
    }
    fn fold_with<F>(self, mut folder: F) -> F
    where
        F: Folder<Self::Item>,
    {
        // start by consuming everything seen
        for s in self.seen {
            folder = folder.consume(s);
            if folder.full() {
                return folder;
            }
        }
        // now do all remaining explorations
        for mut e in self.to_explore {
            while let Some(s) = e.pop() {
                e.extend((self.breed)(&s));
                folder = folder.consume(s);
                if folder.full() {
                    return folder;
                }
            }
        }
        folder
    }
}

struct TreeIter<S, B, I> {
    initial_state: S,
    breed: B,
    phantom: PhantomData<I>,
}

impl<S, B, I> ParallelIterator for TreeIter<S, B, I>
where
    S: Send + Debug,
    B: Fn(&S) -> I + Send + Sync,
    I: Iterator<Item = S> + Send,
{
    type Item = S;
    fn drive_unindexed<C>(self, consumer: C) -> C::Result
    where
        C: UnindexedConsumer<Self::Item>,
    {
        let producer = TreeProducer {
            to_explore: once(vec![self.initial_state]).collect(),
            seen: Vec::new(),
            breed: &self.breed,
            phantom: PhantomData,
        };
        bridge_unindexed(producer, consumer)
    }
}

fn descendants<S, B, I>(root: S, breed: B) -> TreeIter<S, B, I>
where
    S: Send,
    B: Fn(&S) -> I + Send + Sync,
    I: Iterator<Item = S> + Send,
{
    TreeIter {
        initial_state: root,
        breed,
        phantom: PhantomData,
    }
}

#[derive(Debug)]
struct Node {
    content: u32,
    left: Option<Box<Node>>,
    right: Option<Box<Node>>,
}

fn main() {
    let t = Node {
        content: 10,
        left: Some(Box::new(Node {
            content: 3,
            left: None,
            right: None,
        })),
        right: Some(Box::new(Node {
            content: 14,
            left: None,
            right: Some(Box::new(Node {
                content: 18,
                left: None,
                right: None,
            })),
        })),
    };
    let v: Vec<&Node> = descendants(&t, |r| {
        r.left
            .as_ref()
            .into_iter()
            .chain(r.right.as_ref())
            .map(|n| &**n)
    })
    .collect();
    eprintln!("v: {:?}", v);
}

@cuviper - ah, scope seems to do almost exactly what I need (with a few lines of code). I'll give it a try. Thanks!

Was too quick to announce success.
I can make this work nicely using global functions. However I failed to make it work with method:
use core::marker::PhantomData;
use rayon::scope;
use rayon::Scope;
use rayon::ThreadPoolBuilder;

// Works
pub fn global_launch() {
    ThreadPoolBuilder::new().build().unwrap().install(|| {
        scope(|parallel_scope| {
            global_use(parallel_scope);
        })
    });
}

// Works
pub fn global_use(parallel_scope: &Scope) {
    parallel_scope.spawn(|same_scope| global_use(same_scope));
}

struct Plain;

impl Plain {
    pub fn plain_launch(&self) {
        ThreadPoolBuilder::new().build().unwrap().install(|| {
            scope(|parallel_scope| {
                self.plain_use(parallel_scope);
            })
        });
    }

    // Fails to compile
    pub fn plain_use(&self, parallel_scope: &Scope) {
        parallel_scope.spawn(|same_scope| self.plain_use(same_scope));
    }
}

struct Annotated<'a> {
    _phantom: PhantomData<&'a i32>,
}

impl<'a> Annotated<'a> {
    pub fn annotated_launch(&'a self) {
        ThreadPoolBuilder::new().build().unwrap().install(|| {
            scope(|parallel_scope| {
                self.a_is_b(parallel_scope);
                self.b_is_a(parallel_scope);
            })
        });
    }

    // Fails to compile
    pub fn a_is_b<'b>(&'a self, parallel_scope: &'b Scope<'b>)
    where
        'a: 'b,
    {
        parallel_scope.spawn(|same_scope| self.a_is_b(same_scope));
    }

    // Fails to compile
    pub fn b_is_a<'b>(&'a self, parallel_scope: &'b Scope<'b>)
    where
        'b: 'a,
    {
        parallel_scope.spawn(|same_scope| self.b_is_a(same_scope));
    }
}

I'm obviously missing something subtle about the lifetime annotations here. Is there a way to use method calls which spawn more tasks inside a parallel scope?

Let's look at the signature for Scope::spawn:
    pub fn spawn<BODY>(&self, body: BODY)
    where
        BODY: FnOnce(&Scope<'scope>) + Send + 'scope,

The first thing (which isn't apparent) is that Scope is invariant in its lifetime 'scope. This is because Scope is accepting arbitrary closures (like BODY) that we will guarantee to be completed before 'scope ends. If we had variance that allowed it to act like Scope<'smaller_scope>, it would then implicitly accept closures with shorter lifetimes, but would still let them run until the actual end of scope -- potentially with expired borrows (dangling references). So the 'scope must be fixed from the initial scope(...) call, which is where it waits for every spawn completion before returning.
The second thing is that when you see an anonymous lifetime in a Fn argument, this is effectively a higher-ranked trait bound (HRTB), which roughly means the function must accept any lifetime there. It's implicitly the same as BODY: for<'any> FnOnce(&'any Scope<'scope>), and we only know 'scope: 'any to be well-formed. (i.e. 'scope outlives 'any, because the object must be alive for its reference to be valid.) You're never given matching lifetimes like &'a Scope<'a>, and its invariance means a Scope<'scope> can't "shrink" to match &'a either.
So if we look at your first example:
    pub fn plain_use(&self, parallel_scope: &Scope) {
        parallel_scope.spawn(|same_scope| self.plain_use(same_scope));
    }

You omitted the lifetime in Scope, which might be ok, but your closure still has to outlive that to meet BODY: 'scope. It was fine in global_use because that closure didn't capture anything, but here you are capturing &self which has an unrelated lifetime, so the BODY: 'scope requirement cannot be met. Thus the error:
   |
30 |     pub fn plain_use(&self, parallel_scope: &Scope) {
   |                      -----                   -----
   |                      |
   |                      these two types are declared with different lifetimes...
31 |         parallel_scope.spawn(|same_scope| self.plain_use(same_scope));
   |                        ^^^^^ ...but data from `self` flows into `parallel_scope` here

Furthermore, closures capture by reference when possible, so that captured type is actually an unwieldy &&Self tied to the local stack frame. You can avoid that with move to capture the direct type &Self. Here is the simplest way I would correct it:
    pub fn plain_use<'a>(&'a self, parallel_scope: &Scope<'a>) {
        parallel_scope.spawn(move |same_scope| self.plain_use(same_scope));
    }

Here is a very explicit form with lifetimes on everything:
    pub fn plain_use<'ref_self, 'ref_scope, 'scope>(
        &'ref_self self,
        parallel_scope: &'ref_scope Scope<'scope>,
    ) where
        'ref_self: 'scope,
        'scope: 'ref_scope,
    {
        parallel_scope.spawn(move |same_scope| self.plain_use(same_scope));
    }

I hope that's enough for you to figure out what's wrong with your Annotated, but feel free to ask further questions!

Wow, thanks for the great and detailed reply!
I understand the need to ensure the lifetimes nest properly, but I am obviously still clueless when it comes to comminicating it to the compiler. The explicit form was a great help. The top about the move is also great - I haven't considered that it would use &&Self. My intuition about these things still has a long way to go.
At any rate, with the additional annotations along the lines you described everything works perfectly now. Thanks again!


Reorganize benchmark to include fairer comparisons

This reorganizes the benchmark to make the comparisons more fair. Either all tokenizers in a test use pre-tokenization, or none do.
Code changes:

The bpe-openai crate now includes a Tokenizer type that has a similar interface as other tokenization crates. It implements pre-tokenization and thus produces exactly the same results as tiktoken.
The benchmarks are now their own crate, so I could depend on the bpe-openai crate without introducing a cyclic dependency.

Another thought on pretokenization...
I would probably argue that using pretokenization should be used to train the BPE encoding, i.e. for building the dictionary.
But afterwards, I'm very doubtful that it is actually needed. It's probably done because nobody thought about doing dropping this step JUST for encoding 🤷
Reasoning is: if you don't have tokens in the dictionary which cross certain character boundaries, then BPE won't generate those anyways. There might be a subtle difference in what BPE outputs compared to regex. But, it is just so much simpler to have only ONE algorithm defining your output than two nested ones... Essentially this crate proves that if you simplify your requirements you can actually improve performance further (and get some additional benefits).


Very Very difficult tutorial 😭 no Link

Please work hard on this ❤❤❤ and make it easier

Any new progress? and updateS?


Extension consumes all api quota making requests for variables in GHES 3.7

Describe the bug
Opening a Workspace in VSCode with the GitHub Actions extension enabled connected to a GHES 3.7 will quickly consume all the quota available because the extension performs hundreds of failing attempts to get Variables (404 not found). This is because the Variables support was introduced on GHES 3.8. Therefore, all requests to get Variables will return 404.
To Reproduce
Steps to reproduce the behavior:

Log into a GitHub Enterprise server version 3.7 in VSCode
Open any workspace with workflows
Open the vscode-github-actions logs in VS Code
See several 404 errors trying to reach https://<ghes_url>/api/v3/repos/<user>/<repo>/actions/variables

Expected behavior
In one of my tests, the extension made 154 attempts to get Variables just by opening the workspace. I guess it's ok to try to get it once and stop. Or try to check if the server version has Variables available before making the request.
Screenshots
Here you can see one of the attempts of the log (sensitive data hidden by ***)
Failure to retrieve variables:  Cs [HttpError]: Not Found
    at /home/***/.vscode-server/extensions/github.vscode-github-actions-0.26.2/dist/server-node.js:2:2786513
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async Object.next (/home/***/.vscode-server/extensions/github.vscode-github-actions-0.26.2/dist/server-node.js:2:2792020)
    at async /home/***/.vscode-server/extensions/github.vscode-github-actions-0.26.2/dist/server-node.js:2:2863050
    at async wa.get (/home/***/.vscode-server/extensions/github.vscode-github-actions-0.26.2/dist/server-node.js:2:2869053)
    at async /home/***/.vscode-server/extensions/github.vscode-github-actions-0.26.2/dist/server-node.js:2:2862965
    at async /home/***/.vscode-server/extensions/github.vscode-github-actions-0.26.2/dist/server-node.js:2:2862914
    at async Object.getContext (/home/***/.vscode-server/extensions/github.vscode-github-actions-0.26.2/dist/server-node.js:2:2862568)
    at async oi (/home/***/.vscode-server/extensions/github.vscode-github-actions-0.26.2/dist/server-node.js:2:2735467)
    at async yn (/home/***/.vscode-server/extensions/github.vscode-github-actions-0.26.2/dist/server-node.js:2:2761083) {
  status: 404,
  response: {
    url: 'https://***/api/v3/repos/***/***/actions/variables?per_page=100',
    status: 404,
    headers: {
      'access-control-allow-origin': '*',
      'access-control-expose-headers': 'ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset',
      'content-encoding': 'gzip',
      'content-security-policy': "default-src 'none'",
      'content-type': 'application/json; charset=utf-8',
      date: 'Wed, 10 Apr 2024 16:41:09 GMT',
      'referrer-policy': 'origin-when-cross-origin, strict-origin-when-cross-origin',
      server: 'GitHub.com',
      'strict-transport-security': 'max-age=31536000; includeSubdomains',
      'transfer-encoding': 'chunked',
      'x-accepted-oauth-scopes': 'repo',
      'x-content-type-options': 'nosniff',
      'x-frame-options': 'deny',
      'x-github-enterprise-version': '3.7.5',
      'x-github-media-type': 'github.v3; format=json',
      'x-github-request-id': '***',
      'x-oauth-client-id': '***',
      'x-oauth-scopes': 'repo, workflow',
      'x-ratelimit-limit': '5000',
      'x-ratelimit-remaining': '4982',
      'x-ratelimit-reset': '1712767559',
      'x-ratelimit-resource': 'core',
      'x-ratelimit-used': '18',
      'x-runtime-rack': '0.033786',
      'x-xss-protection': '0'
    },
    data: {
      message: 'Not Found',
      documentation_url<EMAIL_ADDRESS>    }
  },
  request: {
    method: 'GET',
    url: 'https://***/api/v3/repos/***/***/actions/variables?per_page=100',
    headers: {
      accept: 'application/vnd.github.v3+json',
      'user-agent': 'VS Code GitHub Actions (0.26.2) octokit-rest.js/19.0.7 octokit-core.js/4.1.0 Node.js/18.18.2 (linux; x64)',
      authorization: 'token [REDACTED]'
    },
    request: { hook: [Function: bound bound e] }
  }
}

Extension Version
v0.26.2
Additional context
It looks like the request attempts are even more aggressive when using SSH, e.g. using WSL. Typing an if statement in a workflow made almost 500 requests. Tested on GHES v3.7.5.
Might be related to #192
I hope this can be easily fixed. The extension is amazing and I'd be really happy to use it at its full potential :)

GHES is unfortunately not officially supported, and it is not currently on our roadmap. I'm closing this, because without robust GHES version handling we probably can't effectively handle this case.


Subregion spacing

I am trying to create a pure C++ version of a DIC application using ncorr coming from one running on Matlab. One parameter of the DIC analysis that does not seem to appear in the C++ version is the spacing between subregions.
How does it work in the C++ version? Does it have a default value? Or is it present under another name / type of configuration?

@odesenfans I believe I called it "scalefactor" instead of subset spacing in the c++ port... I don't remember why but I think at one point I had a reason. If you look ncorr_test.cpp it should be clear where this value is. I'd suggest modifying this parameter and running it a few times to check to make sure it does indeed reduce computation time.
Thanks,
-Justin


Pre-trained model

Trained on ImageNet with the default settings. Looks like I should've read the paper more carefully first though, there are some details to the training I messed up: weight decay was set wrong, batch size was too small, learning rate schedule was wrong.
Details:

Trained for 90 epochs, best results were at epoch 83.
Batch size was 256.
Learning rate 0.1, schedule was multiply by 0.1 at epoch 30 and epoch 60.
Momentum 0.9.
Weight decay 1e-4.
Took about a week on a single Titan X.

I'll probably start it training again with (closer to) the correct settings.

@gngdb Thanks for the PR! I'll test it out tomorrow and merge it in if it's all good.


Execution failed for task ':app:transformDexArchiveWithDexMergerForDebug'

System:
    OS: macOS Mojave 10.14.6
    CPU: (4) x64 Intel(R) Core(TM) i3-3110M CPU @ 2.40GHz
    Memory: 161.06 MB / 8.00 GB
    Shell: 5.3 - /bin/zsh
  Binaries:
    Node: 10.16.3 - /usr/local/bin/node
    Yarn: 1.19.1 - /usr/local/bin/yarn
    npm: 6.12.1 - /usr/local/bin/npm
    Watchman: 4.9.0 - /usr/local/bin/watchman
  SDKs:
    iOS SDK:
      Platforms: iOS 12.4, macOS 10.14, tvOS 12.4, watchOS 5.3
    Android SDK:
      API Levels: 16, 23, 27, 28, 29
      Build Tools: 28.0.3, 29.0.2
      System Images: android-16 | Intel x86 Atom, android-23 | Intel x86 Atom, android-23 | Google APIs Intel x86 Atom, android-27 | Google APIs Intel x86 Atom
  IDEs:
    Android Studio: 3.5 AI-191.8<IP_ADDRESS>91312
    Xcode: 10.3/10G8 - /usr/bin/xcodebuild
  npmPackages:
    react: 16.8.6 => 16.8.6
    react-native: 0.60.5 => 0.60.5
  npmGlobalPackages:
    react-native-cli: 2.0.1

I have App written with react-native  and it's work very fine previously
but when I install RN async-storage

I Don't change anything in native android code

I got an error when running the app
I'm trying to remove it and rebuild my app BUT the issue still I don't know why!!
I'm tried to run these command
rm -rf node_modules
npm install

then
cd android && gradlew clean

and it's building successfully without any error
but after run
react-native run-android
I got

What went wrong: Execution failed for task ':app:transformDexArchiveWithDexMergerForDebug'.

com.android.build.api.transform.TransformException: java.lang.RuntimeException: java.lang.RuntimeException:
com.android.builder.dexing.DexArchiveMergerException: Error while
merging dex archives:    The number of method references in a .dex
file cannot exceed 64K.   Learn how to resolve this issue at
https://developer.android.com/tools/building/multidex.html

SO how can I solve it? please it's important "I'm in deadline" :V

Have you tried following the instructions at the following URL?

Learn how to resolve this issue at
https://developer.android.com/tools/building/multidex.html

@sa2812  yes, but I can't re-build the app I got the same error !

The error is caused because there at more than 64K methods in your app (including all of your dependencies).
In your android/app/build.gradle, add the following (I'm assuming that you're using AndroidX since you're on RN 0.60.5:
android {
    defaultConfig {
        ...
        minSdkVersion 15
        targetSdkVersion 28
        multiDexEnabled true
    }
    ...
}

and
dependencies {
    ...
    def multidex_version = "2.0.1"
    implementation 'androidx.multidex:multidex:$multidex_version'
}

Then, in your MainApplication.java add the following import at the top
import androidx.multidex.MultiDexApplication;

and replace this
public class MainApplication extends Application implements ReactApplication {

with this
public class MainApplication extends MultiDexApplication implements ReactApplication {

For reference or more questions, look at this answer on StackOverflow.
After you run your build you shouldn't get this same error again

Hope it's Help
https://medium.com/@tiwarishani/task-app-transformdexarchivewithdexmergerfordebug-failed-in-react-native-6d03bc4655af

just add this in android/app/build.gradle
android{
defaultConfig{
  .......
 multiDexEnabled true
  }
}

Yes.!!!  Worked for me

Hello Guys again,
I've faced the same error but Execution failed for task ':app:transformDexArchiveWithDexMergerForRelease'. when releasing an APK.
I follow all answers here but not works for me :(

Same here an anastely mentiond, did you find any solution?

Am having the same project after upgrading from 0.59.3 to 0.59.9 . please any solution to this.?


feat: issuer onboarding with multiuse invite on trust registry

closes #252
Signed-off-by: Moriarty<EMAIL_ADDRESS>

@TimoGlastra Do you have any feedback for this?

Code looks good. Could you add some tests for this flow?

Sure. Do you have anything more specific in mind. I added some tests to check whether this is actually written to the trust registry

Ah totally missed those test files 😊

Ah totally missed those test files 😊

ahhhh ok, cool.


Use rel="noopener" on target="_blank" links

I don't think this is high priority
Blocked by https://github.com/grommet/grommet/issues/5537
Related to https://github.com/oasisprotocol/oasis-wallet-web/issues/181
For security of older browsers it is best practice to use target="_blank" with rel="noopener"
https://web.dev/external-anchors-use-rel-noopener/
This appears in ValidatorMediaInfo:
https://github.com/oasisprotocol/oasis-wallet-web/blob/1603e07dfc9a85ec438c52619a0f1e662c6717ff/src/app/pages/StakingPage/Features/ValidatorMediaInfo/index.tsx#L38

I was not aware of this issue, good catch.

Unblocked :)

Oops, almost unblocked, needs a new grommet release

grommet v2.18.0 is out

Found that eslint-plugin-react already detects this on <a href>, and has configuration for custom components https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/jsx-no-target-blank.md#custom-link-components

oh ok nice


Workshop 3 - Checklist

Part 1 (unit testing)

[x]  Has a unit test.
[x] Has several unit tests of different features and modules.
[x] Tests are passing on master/main branch.
[ ] README with instructions of how to run the unit tests.
[ ] README with instructions of how to generate code coverage information for your unit tests.
[ ] README with instructions of how to run a linter for your project.
[ ] If you are using assets found online as part of your project, please explicitly list  these on the README.

@Akbar-163, @zakariyams, @AdeptiC, @Jakobloula, and @Zeruxe
Keep going!
Please complete the items by the next workshop on April 26. Also, mention the corresponding issue/commit for each item, so that I can follow up.


Errors when trying to add vector basemap

Getting errors when trying to add vector basemap when following this exercise
geodev-hackerlabs/design/apply_vector_basemap/lab.md
Error
The layer, World Street Map (Night - WGS84), can not be added to the map because its coordinate system or tiling scheme can't be adjusted to align properly with the basemap.
Got the same error when trying other vector basemaps

@cybersea Thanks for the heads-up. We'll need to update this exercise.
For now adjust your search parameters to world street map night vector mature. That map has the correct projection and will work with the exercise.
The issue is the original map we provide for the exercise uses a different coordinate system from the supplied vector base maps.

@andygup why are we directing folks to load 'mature' vector basemaps? it seems like it would be better to have them load the latest and greatest.

@jgravois As noted that's a temporary suggestion. If you know where the latest and greatest reside then drop a note here for when the lab gets updated in the next few days.
As a general note, I'm also unclear on the meaning behind this statement (DO NOT CLICK ADD!) > Add to Map?

If you know where the latest and greatest reside...

down the line, the vector basemaps will be included in the basemap gallery widget, but in the meantime i'd suggest using this as the search term in the lab: owner:esri type:tile layer

I'm also unclear on the meaning behind this statement...

agreed.  totally confusing.


fix(core): restart cannot handle binary name change on macOS

Tauri v2 changed the default binary name of the bundled apps (no longer follows the productName, just uses the default name from Cargo instead). This breaks the restart function, which expects the current binary path to match the new one.
Due to this change, the restart() function for macOS is broken - the .app is correctly replaced even if the productName changed, but the restart() function cannot handle the new binary path. This change adds a simple check on macOS to read the Contents/MacOS folder and if it only contains a single binary, we use it to restart instead. This inference cannot be used if there's sidecars, so in this case we just let the existing implementation run and if it fails to restart, we do not panic but only warn and exit instead.
AppImage updates are not affected by this, and the Windows installer is responsible for restarting, so this change is only applied to macOS binaries.

Closes https://github.com/tauri-apps/plugins-workspace/issues/1746


Fix errors in Variant to RID conversion

The dangling Variants fix failed to control conversion to RID when the Object is null from the beginning. This PR fixes that.

This code is generously donated by IMVU.

I believe the same is also needed for master?

Not for master, because this logic is part of the dangling Variants fix specific to 3.2.

Thanks!


Merge pull request #1 from google/master

Latest from Google

My apologies, I was trying to pull from the master into mine.


Skip over images with non-existent @2x @3x versions

any ideas on how to do this best @ArtemGoldsmith and @noudadrichem

@eliwilliamson not sure, I am not using this for some time but your package will be useful later for me

You could make a recursive loop over the folder with node. I'll check that later, it's a good idea!


Tooltip don't disappear on mobile

If you click on a marker with a tooltip, it will not erase the previous tooltip.
Tested with Leaflet 1.0.0-rc2, under Android 6.0.1, with Chrome 51 and Firefox 47
Small demo here: https://mercantour.info/leaftest.html

Thanks for the report! cc @yohanboniface


move otel-cli to an equinix-branded github org

When I started otel-cli, we still had not worked out inside Metal how we would handle open source tools like it. That has recently been sorted out and I'm working with internal folks to select the right org, that will be otel-cli's permanent home.
Most of my work on this repo was done on Equinix time so I feel ok keeping it in an Equinix-branded org. That said, I also wouldn't be opposed to putting it in a CNCF org, but have no idea how much work that is.

@matoszz I'm feeling equinix-labs but can be convinced otherwise

All done, thanks @matoszz !!


Updated install instructions to use bunzip2

I've corrected the install instructions to use bunzip2 (which replaces bunzip). Also added a chown step.

Thanks @compuguy :)


Use the quay.io version of fedora for CI tests

We hit an error when quay was building a new version of our image:
Could not pull base image: API error (500): toomanyrequests:
You have reached your pull rate limit. You may increase the
limit by authenticating and upgrading:
https://www.docker.com/increase-rate-limit

So docker hub was throttling quay and killing our build. So switching to
the quay.io version of the same image will keep everything inside of quay
and avoid throttling.

+1 LGTM


Rails 6.0.0.beta1 support

Thank you @damianlegawiec , i will release a prerelease version on Monday.


Fixed splice methods and added tests for ImmutableJS splice.

Splice methods didn't use to add the value you passed them into the
value array. Fixed this logical issue for both plain and immutable
structures.
Fixes #1490.

Hey @erikras any chance you can have a look at this? I added tests for the logic I added and all the tests are passing.
I'm going to have to publish a fork today or tomorrow if this doesn't get merged and published because I need this feature for my production app.
I built my branch and copied over the build into my app and I've been testing with it as well and it's working as intended.

Good work. Thanks! 👍

Thanks!

Published in v6.0.0-rc.5.


Enhancement: Document installation with vanilla docker (podman)

Contact Details
<EMAIL_ADDRESS>What features would you like to see added?
I don't use docker (or Docker Desktop), and instead typically opt for install scripts that will create the container locally and then allow me to do what I wish with it. I use podman, the libre alternative to docker, which supports 99% of the OCI commands that docker does.
In the case of the docker instructions, they are heavily geared towards using docker-compose - which isn't something every user who using using a container based installation will have or want to use, due to the extra overhead.
I'm going to be doing this myself, and I'll be making a PR that's referring to this issue - but essentially:

Make a PR that adds podman/docker instructions (for both the local git repo, but also for the image you've added to the docker hub)

More details
I will be working on this issue, likely over the next few days.
Which components are impacted by your request?
Other
Pictures
No response
Code of Conduct

[X] I agree to follow this project's Code of Conduct

Awesome, thank you for bringing this up. If it's worthwhile to you, you should look at Dockerfile.multi as well, which creates a leaner docker image (sub 700 mb) and is the main strategy for deploy-compose.yml.
Thanks again, and look forward to seeing and learning from this.

Ended up using the local image build instead of documenting the docker hub one as it's not as up to date as source.

Dockerhub is no longer used in favor of GitHub containers, unless you meant that one!


Performance comparison with Pillow-simd

Hi, I really appreciate your effort to share some valuable code.
My only question is whether using OpenCV is faster than Pillow-SIMD. I have read articles from the web that Pillow is surely slower than OpenCV, but referring to pages like https://python-pillow.org/pillow-perf/, there may be some cases when Pillow-SIMD is faster than OpenCV.
Have you tried using Pillow-SIMD instead of plain Pillow? If so, have you done any comparison between OpenCV and Pillow-SIMD on video datasets like Kinetics?
Thanks again.

Hey Sean,
I haven't done that exact comparison, but if you wanted to do the
comparison and compare to opencv, feel free to submit a pull request!
Best,
Jim
On Sun, Jun 9, 2019, 4:41 AM Sean Cha<EMAIL_ADDRESS>wrote:

Hi, I really appreciate your effort to share some valuable code.
My only question is whether using OpenCV is faster than Pillow-SIMD. I
have read articles from the web that Pillow is surely slower than OpenCV,
but referring to pages like https://python-pillow.org/pillow-perf/, there
may be some cases when Pillow-SIMD is faster than OpenCV.
Have you tried using Pillow-SIMD instead of plain Pillow? If so, have you
done any comparison between OpenCV and Pillow-SIMD on video datasets like
Kinetics?
Thanks again.
—
You are receiving this because you are subscribed to this thread.
Reply to this email directly, view it on GitHub
https://github.com/jbohnslav/opencv_transforms/issues/4?email_source=notifications&email_token=AEHW2Y2L677IZQJFT6MDILDPZS62ZA5CNFSM4HWI7DE2YY3PNVWWK3TUL52HS4DFUVEXG43VMWVGG33NNVSW45C7NFSM4GYNTP3Q,
or mute the thread
https://github.com/notifications/unsubscribe-auth/AEHW2Y6CVAUMGYQ43DGX2M3PZS62ZANCNFSM4HWI7DEQ
.

It's a good idea to compare with Pillow-SIMD.


Reject Invalid/Unknown Filter Fields

Object list filtering in Nautobot (either in the UI, such as https://demo.nautobot.com/dcim/devices/?q=&site=ams01&foobar=baz, or in the REST API, such as https://demo.nautobot.com/api/dcim/devices/?foobar=baz&limit=5) currently ignores any query parameters that it doesn't understand.
If we want in 2.0 to be able to make breaking changes to our FilterSet fields (renaming fields, etc.) then this current behavior would be undesirable as it would result in existing saved queries silently returning unexpected data (e.g, if we split the has_primary_ip filter into separate has_primary_ip4 and has_primary_ip6 filters, a query for /dcim/devices?has_primary_ip=false will start returning all devices, instead of only those that lack an assigned primary IP).
The proposal here is to change our filtering behavior now so that unknown query parameters will begin to be rejected as an invalid query, which will make it so that on migration to 2.0, any queries that rely on no-longer-supported filter parameters will fail noisily and obviously instead of silently returning the wrong data.

Quick proof of concept:
diff --git a/nautobot/core/views/generic.py b/nautobot/core/views/generic.py
index 533f707ec..b9558d659 100644
--- a/nautobot/core/views/generic.py
+++ b/nautobot/core/views/generic.py
@@ -191,7 +191,15 @@ class ObjectListView(ObjectPermissionRequiredMixin, View):
         content_type = ContentType.objects.get_for_model(model)

         if self.filterset:
-            self.queryset = self.filterset(request.GET, self.queryset).qs
+            filterset = self.filterset(request.GET, self.queryset)
+            if filterset.is_valid():
+                self.queryset = filterset.qs
+            else:
+                messages.error(
+                    request,
+                    mark_safe(f"Invalid filters were specified: {filterset.errors}"),
+                )
+                self.queryset = filterset.qs.none()

         # Check for export template rendering
         if request.GET.get("export"):
diff --git a/nautobot/dcim/filters.py b/nautobot/dcim/filters.py
index 69e5b1e70..94f120542 100644
--- a/nautobot/dcim/filters.py
+++ b/nautobot/dcim/filters.py
@@ -709,7 +709,7 @@ class DeviceFilterSet(NautobotFilterSet, TenancyFilterSet, LocalContextFilterSet
     device_bays = has_device_bays
     tag = TagFilter()

-    class Meta:
+    class Meta(BaseFilterSet.Meta):
         model = Device
         fields = [
             "id",
diff --git a/nautobot/utilities/filters.py b/nautobot/utilities/filters.py
index 95817e8e9..6bb25a033 100644
--- a/nautobot/utilities/filters.py
+++ b/nautobot/utilities/filters.py
@@ -461,6 +461,18 @@ class BaseFilterSet(django_filters.FilterSet):
         return filters

+    class Meta:
+        class StrictForm(forms.Form):
+            def is_valid(self):
+                result = super().is_valid()
+                for extra_key in set(self.data.keys()).difference(set(self.cleaned_data.keys())):
+                    self.add_error(None, f'Unknown filter field "{extra_key}"')
+                    result = False
+                return result
+
+        form = StrictForm
+
+
 class NameSlugSearchFilterSet(django_filters.FilterSet):
     """
     A base class for adding the search method to models which only expose the `name` and `slug` fields

(moving PR comment here for potential discussion)
I like and agree with this, but is it not a breaking change? Consider I have a script which calls the API and has a typo in a filter field name. I get a response today and that might be perfectly fine.
Take for example (specifically one that I know about) in which a client is making an API call to populate a dropdown in another system. The query contains an invalid filter field but the client still gets a valid response because if the filter had worked, the query would have just been a subset of current result set. This is a safe behavior because we are only populating a drop down, not launching nukes; the only negative impact is the user has more choices to look at.
I will conceded this should probably be considered a bug, but I do feel it is a breaking change in behavior that has downstream impact. To that end, if no one else feels strongly about this, I am okay with this going in 1.4.

Implemented for 1.4 by #1794.


[Feature request] Add readonly prop

There is currently a disabled prop but there should be a support for the readonly prop as well, basically doing the same but setting the html attribute readonly on the input

Available in v4.4.0


Fix Fedora build

This should resolve the issues with the Fedora build

I'm closing this in favor of the clean up PR


Add instructions on operationalizing in commercial environment

While this is an open topic, place holder here on informing users that:

How to implement a metrics mechanism to understand API usage (current thought is App Insights).
How to add security to the endpoint
Scaling to meet demand

Current thought is that these will be covered in some other repo (maybe related to this one, maybe not). Topic at least needs to be discussed that the end result is not viable for commercial use as is (for most enterprise use cases). Final destination for this content to be decided in September.
(Topic valid for all Real Time Endpoints)

Yep, we can add caveat to the readme along those lines. Then at a later date when those instructions are available link to them.


Ensure output is displayed by tee

Fixes error observed with molecule where pipe argument got -1 value, causing tee functionality to not work.
Adds functional testing for subprocess-tee when used from inside molecule.
Fixes: #46

It seems that due to https://github.com/jazzband/pip-tools/issues/333 i will need to remove locking of test dependencies.


crash report when creating first app on VS code

Steps to Reproduce

Hello there,
im having trouble when creating my first app on Visual Studio.
is there anyone could help?
thank you
regards
Zai
Logs

[first_app] flutter create first_app
Waiting for another flutter command to release the startup lock...
Creating project first_app...
first_app.gitignore (created)
Oops; flutter has exited unexpectedly.
Sending crash report to Google.
Crash report sent (report ID: 14a761dad3f39ee6)
Crash report written to C:\Users\LIVEW\AppData\Local\Temp\flutter_07.log;
please let us know at https://github.com/flutter/flutter/issues.
exit code 1

```[first_app] flutter create first_app
Waiting for another flutter command to release the startup lock...
Creating project first_app...
  first_app\.gitignore (created)

Oops; flutter has exited unexpectedly.
Sending crash report to Google.
Crash report sent (report ID: 14a761dad3f39ee6)
Crash report written to C:\Users\LIVEW\AppData\Local\Temp\flutter_07.log;
please let us know at https://github.com/flutter/flutter/issues.
exit code 1

@ndlive could you include the log that shows the error message and your flutter version?

Hello Jonah,
thank you for your reply.
the problem solved, it was blocked by windows firewall.
but the flutter doctor still can not detect VS code (ss attached)
thank you
best wishes
Olivia
On Sun, Jun 24, 2018 at 2:04 PM Jonah Williams<EMAIL_ADDRESS>wrote:

@ndlive https://github.com/ndlive could you include the log that shows
the error message and your flutter version?
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub
https://github.com/flutter/flutter/issues/18762#issuecomment-399734593,
or mute the thread
https://github.com/notifications/unsubscribe-auth/Amp7pV3zTufOKT5FtI8iZvVKtTk4PUE0ks5t_znngaJpZM4U1BF6
.

@ndlive have you also installed the Flutter plugin besides DartCode? this is now necessary to get detected

@ndlive If you can still reproduce the first issue, it would be great to see what's in the log file mentioned in the error message (C:\Users\LIVEW\AppData\Local\Temp\flutter_07.log in the case above). Even if the issue is caused by Windows Firewall, we shouldn't crash like that, we should provide a better error message to the user.

but the flutter doctor still can not detect VS code (ss attached)

As @escamoteur says, you need the Flutter plugin; but there's also a bug in the current beta channel that generates an incorrect report here. The fix will be in an future update.
(Closing this since issues ares resolved, but please do still post a log for the crash if you can).


warn users if use RHS-only as dynamic index

This fixes issue #951.

@perrydv @danielturek would either of you like to look at this before I merge?

LGTM.  Thanks for the chance to review.

@perrydv just a ping to see if you want to take a look at this.


Restricted to gmail.com domain addresses only?

The article implies, but doesn't explicitly state that this only works with users who have an @gmail.com address - custom G Suite domain don't currently work I don't think, is that correct?

Document Details
⚠ Do not edit this section. It is required for docs.microsoft.com ➟ GitHub issue linking.

ID: 6ed01893-a5cd-28bd-b865-e7ebe5870567
Version Independent ID: b3d96be0-1470-eb2c-ea5b-cea0a5cc44a1
Content: Add Google as an identity provider for Azure Active Directory B2B
Content Source: articles/active-directory/b2b/google-federation.md
Service: active-directory
GitHub Login: @msmimart
Microsoft Alias: mimart

@stmccartney
Thanks for your feedback! We will investigate and update as appropriate.

Hey @MarileeTurscak-MSFT
Sorry to zombie this thread but the article you linked is for enabling Azure AD accounts to auth users to GSuite - which is the opposite way around of what we're trying to achieve using Google Federation (we want GSuite identities to authenticate users to Azure).
Can we assume then that this means there is no way to use G Suite accounts (non-gmail) to authenticate to Azure AD?
Is this on the roadmap for the Google Federation feature?


Add more specificity to the CSS selectors for Critical Hit/Fumble Journals

More specificity to the CSS selectors added so the more generic CRB Journal Styles in Dorako UI do not override the look and feel of Critical Hit/Fumble cards.
Also allows the System to specify CSS for Journals without overriding the these specific types of journal entries.
Before:

After:

Why would we alter CSS to escape a module's restyling instead of requesting that the module simply not break it?

To be fair, the current styling is too unspecific, kinda to the point of absurdity. Would it work to instead change journal/_index.scss to import the critical fumble deck stuff from inside of .journal-page-content?

Sure, that's a more concise fix.

To answer the why first, @CarlosFdez already basically covered it. It was less to "fix" a module issue and more to "allow" modules to override journal styling, but also in the future, let the system also add journal styling without clobbering the cards. The style of the cards will probably never match the CRB type styling and need to stand on their own so adding specificity helps here.
For the solution, I've never messed with scss before, but this seems to work? I needed both levels .journal-entry-page && .journal-page-content specified, so I just moved the content block under the new page block. It doesn't seem to affect the tinymce css (which also seems deprecated?)
Is this ok or is there a better way?
.journal-entry-page {
    .journal-page-content {
        @include tinymce-system-specific;
        @import "critical-fumble-deck";
    }
}

Yeah, that works.


Feature Request: Unfold All

Feature Requested
If you've folded a bunch of stuff it can be a pain to unfold everything, It would be nice to have a command :UnfoldAll or function to unfold everything on the current buffer or current context.
Relevant Screenshot
No response
Checklist

[X] The feature would be useful to more users than just me.

There is already a built-in vim command for that: https://neovim.io/doc/user/fold.html#zR


Other servers looking for nodeinfo/serverinfo in wrong places

Quick summary
I activated the plugin recently to toy around with it and now my server constantly receives info requests from other Fediverse servers it can't answer.
Steps to reproduce

Install and activate the plugin in your Wordpress
Access the URLs in the log excerpt

What you expected to happen
JSON content with the relevant info gets returned
What actually happened
A 404 page gets retruned
Impact
One
Available workarounds?
No but the platform is still usable
Logs or notes
"GET /.well-known/x-nodeinfo2 HTTP/1.1" 200 278 "-" "Friendica 'Giant Rhubarb' 2023.01-1502; https://[some friendica server]"
"GET /api/v1/directory?limit=1 HTTP/1.1" 404 31561 "-" "Friendica 'Giant Rhubarb' 2023.01-1502; https://[some friendica server]"
"GET /poco HTTP/1.1" 404 31561 "-" "Friendica 'Giant Rhubarb' 2023.01-1502; https://[some friendica server]"
"GET /api/v1/instance/activity HTTP/1.1" 404 31561 "-" "Friendica 'Giant Rhubarb' 2023.01-1502; https://[some friendica server]"
"GET /nodeinfo/2.1 HTTP/1.1" 404 31561 "-" "curl/7.81.0"
"GET /nodeinfo/2.0 HTTP/1.1" 404 31561 "-" "curl/7.81.0"
"GET /api/v1/instance HTTP/1.1" 404 31561 "-" "curl/7.81.0"
"GET /api/v1/config HTTP/1.1" 404 31561 "-" "curl/7.81.0"
"GET /api/nodeinfo HTTP/1.1" 404 31561 "-" "curl/7.81.0"
"GET /api/v3/federated_instances HTTP/1.1" 404 31561 "-" "curl/7.81.0"
"GET /wp-json/nodeinfo/2.1 HTTP/1.1" 404 114 "-" "curl/7.81.0"

Hey @carbeck there are a lot of APIs that try to help identify the server and some to get some meta data about the server. Friendi.ca and others are trying to find one of these endpoints.
The ActivityPub plugin currently only supports NodeInfo, which is the most common and open format out there.
The /api/v1/* URLs are Mastodon specific API endpoints and not part of ActivityPub.
You can see an example of the NodeInfo endpoint here: https://notiz.blog/.well-known/nodeinfo


Any available units?

Before I go and purchase all the equipment to create these devices, I'd like to see if anyone has 8 of these.  I have 8x LCN097HV4 indoor cassettes that I need to be able to remote control.
Please let me know if you have some of these available and what you would want for them.
Thank you!

@pinhao @katshup @florianbrede-ayet @JanM321
I've gone ahead and purchased some units, but I'm wondering since the LMCN077HV is on the list of supported devices if anyone could drop me a picture of what the connection looks like on the indoor unit so I know if I should get some sort of connectors such as the JST connectors?

How did you mange to order them? I'm looking for 2 of these.

I ordered them through JLCPB using these instructions.
https://docs.easyeda.com/en/PCB/Order-PCB/
One of the parts wasn't available so we had to swap out a part.

I can tell you on my ceiling cartridges they have this little yellow connection block.  My plan is to connect right into that block with these connected to the boards.  https://www.amazon.com/dp/B0D4M6MTFT?ref=ppx_yo2ov_dt_b_fed_asin_title&th=1

Mine looks like this. Not sure where to plug the cable. The Amazon link you provided, I can't find the same thing in my area. Only cables with a plug on one end and loose wires on the other. I'm not into soldering or something. Plug & play would be nice. :-)

I've received the 5 units.
I'm going to use 2, and keep 1 as spare.
Still waiting on my ESP's and need to figure out on how to connect it to my AC board... (see above) anyone have tip?
If anyone is interested in either of the additional units I have, let me know.
Note tested, no ESP included, no cabling), just the unit itself.
Price: Not looking to make a profit on them. You pay what I paid for a single unit + shipping to whereever you are.


"Touch" value on ADM-OSC

Hello everyone, I am Julien and I would like to work with you on organizing this ADM OSC Standard with a multi-brand user perspective.
My first request is to propose the value of Touch with an argument of 0 or 1 to define who takes control over the OSC. Some of you have already proposed this natively, but I would really like this message to appear in the ADM OSC to simplify the looping issues.

The best practice would be to create a dedicated parameter for this value with an argument of 0 or 1.

What do you think about this ?

Hello Julien, welcome !
Is it the same issue as #10 ? Should we merge them, or did you see this as another Issue ?
As ADM to be agnostic is describing the result instead of transmitting parameters, or specific controller action ("touch" sounds very specific from iPad Touchscreen ?) : please, it would be useful to describe your use case with more details.
What is the purpose of this ? You said "who takes control" :

Who is taking control ? I guess, production engineer, artist, listener... Would it be useful to define different users, with priority management ?
Control what ? I guess we need at least object number (could it be several ?) and parameter (eg. XY position)
Why ? I guess, to take over recorded automation, eg. going from "read" to "write" in a DAW plugin ? Or override a setting ?

Indeed, this requires further clarification:
I'm not specifically referring to the iPad or touch screens, but rather to the description: I'm touching this value; we're clearly describing what I'm doing.
For me, the 'touch' value mainly functions to enable bi-directionality of OSC information, facilitating the relay of information to communicating devices. It is also crucial for determining who writes the automation in the DAW.
Of course, this parameter must appear with an object number for all ADM-OSC parameters.
Actually  :
Meyer-sound use : /Console/obj/xy/touch INT(0/1)
FLUX/ Nuendo / Ovation use :
(/source/obj/xyz) STRING(touch)
(/source/obj/xyz) FLOAT(0.36842108) FLOAT(0.052631617)
(/source/obj/xyz) STRING(release)
It is up to us to decide whether this value should be integrated into the messages or separated :
Exemple for XYZ
/adm/obj/()/XYZ/Touch INT(0/1)
or
(/adm/obj/()/xyz) STRING(touch)
(/adm/obj/()/xyz) FLOAT FLOAT FLOA
(/adm/obj/()/xyz) STRING(release)

In ADM, there could be already several interactive parts, like changing foreground/background levels, languages or storylines. cf https://adm.ebu.io
The renderer don't need to know "how" user change this (touching a button or a fader, of course is a use case, but may be not the only one).
It sounds very interesting to document what could be interactions on objects during production.

A couple of thoughts on this.
Personally, I find it a bit confusing to have something in the /adm/... namespace that doesn't translate to an possible message in the ADM standard. It isn't clear what "touch" actually means, although I agree it could be useful.
I would prefer not to have to find the type of the OSC arguments to figure out what the message means.  So, differentiating between STRING and FLOAT is an extra layer of sorting that could be taken care of in the address.  Something like:
/ctrl/obj/<object number>/touch INT 0/1
would be the most clear for me, as an engineer implementing these things.

Can somebody clarify if touch/release is sent only once when a user touch/release a controller, or if it has to be transmitted along all positional data's ?
In the first case, seems dangerous as UDP packets may be lost.
In the second case also, as there is no warranty that the messages arrive in the same order as emitted, or that some other messages cannot be received in between.
Why just sending positions when controller is touched, stop sending those when controller is release isn't sufficient feature ?
As there can be several ADM OSC transmitters (typically here I can imagine the DAW playback + controller), how the receiver should knows which one is "touched", by IP filtering ?
Thank you so much to help everybody understand this feature.

Welcome @JPagnier


fix: Fix typos, improve localStorage handling, and clean up imports

Fixed typos in custom.css: Corrected minor spelling errors and removed duplicate properties for improved readability and reduced redundancy.

Improved localStorage handling in matomo.jsx: Replaced localStorage.clear() with localStorage.removeItem("matomoConsent") to prevent unintended data clearance and ensure only consent data is removed.

Removed unused import in index.js: Cleaned up by removing the CSSProperties import, which was not being used in the file.

Corrected typo in index.js comment: Changed classNamees to classNames for clarity and accuracy.

These changes aim to improve code readability, prevent potential issues with localStorage, and ensure consistency across the codebase.

@TomAFrench Hi! When you have a moment, could you please review my pull request? Your input would be greatly appreciated. Thanks in advance!

Closing as this is basically just whitespace changes.


Add DotNetListReference alias for dotnet list reference command

dotnet list reference - Lists project-to-project references.
The dotnet list reference command provides a convenient option to list project references for a given project.
Docs: https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-list-reference

Please assign the issue to me

@Marusyk issue assigned to you.


check packet lenght

Interesting. Do you have a reproduction where this might happen?

Hi, I'm just tried connect to incorrect port, not mssql server and get panic tokio-runtime-worker at "split_to out of bounds"


Mark field mapping properties that are deprecated or removed in 5.0

Made Obsolete descriptions consistent in relation to Elasticsearch version representations
Fixed build warnings

Closes #2346

Much better 👍

Nice!


SS4-beta3: TreeDropdownField loses value after re-save

When editing a field with a TreeDropdownField, the selected value is "lost" once the page is re-saved (the form doesn't display the saved value as selected). The value is in fact initially stored correctly in the database and physically reloading the page will pre-populate the TreeDropdownField correctly with the stored value as the selected field, but if the form is saved when the glitch happens, the value is lost/reset.
This means that if you click the save button twice (once an object has been created) - ie: create & save, then save again - the stored value is lost.

This has been fixed in the latest 1 branch with https://github.com/silverstripe/silverstripe-admin/pull/252
Please feel free to re-open this if it is still happening for you after updating :)


Reply to this email directly, view it on GitHub
https://github.com/KristijanCetina/payingCustomer/issues/91, or
unsubscribe
https://github.com/notifications/unsubscribe-auth/ABIKDXWOCJXVM2QWHY6QARLS24LZ3ANCNFSM4WLB6SNQ
.

ja jesam :-D
On Wed, 20 Jan 2021 at 19:08, Marko Tomljanović<EMAIL_ADDRESS>wrote:

@IvanaPolonijo https://github.com/IvanaPolonijo da i ja nešto naredim 😁
[image: 1]
https://user-images.githubusercontent.com/56721240/105216249-94fd3480-5b52-11eb-805f-09e5f58daa5b.PNG
—
You are receiving this because you are subscribed to this thread.
Reply to this email directly, view it on GitHub
https://github.com/KristijanCetina/payingCustomer/issues/91, or
unsubscribe
https://github.com/notifications/unsubscribe-auth/ABIKDXWOCJXVM2QWHY6QARLS24LZ3ANCNFSM4WLB6SNQ
.


Complete annotations support in Ballerina

Description:
At the moment, annotations can be attached to structs, functions, services, connectors. But the Ballerina grammar allows your annotation even package level variables, function parameters, return values etc. Ballerina compiler simply ignores these annotations at the moment.

@MaryamZi Please verify this. I think we can close this issue now.

@MaryamZi Please verify this. I think we can close this issue now.

Yes, these are not ignored now.
Will close this issue since the pending tasks with the new annotation syntax are being tracked in https://github.com/ballerina-platform/ballerina-lang/issues/14352.


Optional multi-core archiving (pigz)

About issue #284
I've implemented the availability test you suggested: If not found use normal 'tar.gz' and log a warning. And when available use pigz.

Thanks for PR.
Merging to release_v1.5.3 branch.


Segfault when loading a file with axis widget after showing a volume without axis widget

Describe the bug
F3D (VTK) segfaults when loading a file that shows with axis widget thanks to a config file
To Reproduce
Steps to reproduce the behavior:

Open the file using f3d --config=src/resource/config.json src/testing/data/multi -> volume show up with axis
Press X to remove axis
Press right to load next file -> segfault

FIxed by #395


Update docs v0.33

I was guided by the following [options for BrowserWindow constructor] (https://github.com/atom/electron/blob/master/docs/api/browser-window.md#new-browserwindowoptions).
In 0.33 version options for BrowserWindow constructor require "width" and "height" props. Also "icon" property must be NativeImage.

Actually width and height are not required, they have default values, we probably need to fix the descriptions in the docs. Also the icon can be a String, it will be automatically converted to NativeImage, this behavior is documented in NativeImage's docs.
But still thanks for help improving the docs!

@zcbenz thanks!
Once I started, I can correct as necessary :)


chore(deps): upgrade configuration

Upgrades project dependencies. See details in workflow run.

Automatically created by projen via the "upgrade-configuration-2.x" workflow

⚪ Backport skipped
The pull request was not backported as there were no branches to backport to. If this is a mistake, please apply the desired version labels or run the backport tool manually.
Manual backport
To create the backport manually run:
backport --pr 2878

Questions ?
Please refer to the Backport tool documentation


dnscrypt-proxy update

dnscrypt-proxy 2.0.43 is out , i don't know if you auto update to last version , if not i just wanted to let you know

2.0.44 out now

3 months have passed by since the latest release of dnscrypt-proxy. I wonder if this project is abandoned?

@AdKiller no it has not been given up, I have very little time at the moment. I will try to publish an update as soon as possible.
Sorry

@bitbeans that's understandable. looking forward to the update. thanks for the ping back.


ServiceProvider support

I'd like to inject services into commands. Is this currently possible or do I need to pass the configured ServiceProvider into the commands as an argument?

This is now supported with v1.6.2:

Added dependency injection support. When the source generator detects that your project has reference
to Microsoft.Extensions.DependencyInjection, it will generate extension methods for supporting dependency injection.
For example, you can now add your services with the extension method Cli.Ext.ConfigureServices:
using DotMake.CommandLine;
using Microsoft.Extensions.DependencyInjection;

Cli.Ext.ConfigureServices(services =>
{
    services.AddTransient<TransientClass>();
    services.AddScoped<ScopedClass>();
    services.AddSingleton<SingletonClass>();
});

Cli.Run<RootCliCommand>();

Then let them be injected to your command class automatically by providing a constructor with the required services:
[CliCommand(Description = "A root cli command with dependency injection")]
public class RootCliCommand
{
    private readonly TransientClass transientDisposable;
    private readonly ScopedClass scopedDisposable;
    private readonly SingletonClass singletonDisposable;

    public RootCliCommand(
        TransientClass transientDisposable,
        ScopedClass scopedDisposable,
        SingletonClass singletonDisposable
    )
    {
        this.transientDisposable = transientDisposable;
        this.scopedDisposable = scopedDisposable;
        this.singletonDisposable = singletonDisposable;
    }

    [CliOption(Description = "Description for Option1")]
    public string Option1 { get; set; } = "DefaultForOption1";

    [CliArgument(Description = "Description for Argument1")]
    public string Argument1 { get; set; }

    public void Run()
    {
        Console.WriteLine($@"Handler for '{GetType().FullName}' is run:");
        Console.WriteLine($@"Value for {nameof(Option1)} property is '{Option1}'");
        Console.WriteLine($@"Value for {nameof(Argument1)} property is '{Argument1}'");
        Console.WriteLine();

        Console.WriteLine($"Instance for {transientDisposable.Name} is available");
        Console.WriteLine($"Instance for {scopedDisposable.Name} is available");
        Console.WriteLine($"Instance for {singletonDisposable.Name} is available");
        Console.WriteLine();
    }
}

public sealed class TransientClass : IDisposable
{
    public string Name => nameof(TransientClass);

    public void Dispose() => Console.WriteLine($"{nameof(TransientClass)}.Dispose()");
}

public sealed class ScopedClass : IDisposable
{
    public string Name => nameof(ScopedClass);

    public void Dispose() => Console.WriteLine($"{nameof(ScopedClass)}.Dispose()");
}

public sealed class SingletonClass : IDisposable
{
    public string Name => nameof(SingletonClass);

    public void Dispose() => Console.WriteLine($"{nameof(SingletonClass)}.Dispose()");
}

Fantastic. Thank you!

This is using ServiceProvider, rather than IServiceProvider. Is it possible to use the latter? We can then utilise other containers such as Autofac.

Hi,
This is now possible with v1.8.1:

Added support for other dependency injection containers (e.g. Autofac) when
only Microsoft.Extensions.DependencyInjection.Abstractions package (version >= 2.1.1) is added to the project.
You can set your custom service provider with the extension method Cli.Ext.SetServiceProvider.
In previous version, this method already existed but accepted a ServiceProvider parameter, instead of
IServiceProvider parameter which allows 3rd party implementations other than the default one in Microsoft.Extensions.DependencyInjection.
using DotMake.CommandLine;
using Autofac.Core;
using Autofac.Core.Registration;

var cb = new ContainerBuilder();
cb.RegisterType<object>();
var container = cb.Build();

Cli.Ext.SetServiceProvider(container);

Cli.Run<RootCliCommand>();

Reduced minimum version requirement for Microsoft.Extensions.DependencyInjection from 6.0.0 to 2.1.1
so that you don't need to update it in legacy projects. Added Cli.Ext.GetServiceCollection and
Cli.Ext.GetServiceProviderOrDefault extension methods.

That is awesome! Thanks @calacayir !


fix: cater for case of zero cols in mm_createdataset.sas

:tada: This PR is included in version 4.27.4 :tada:
The release is available on:

npm package (@latest dist-tag)
GitHub release

Your semantic-release bot :package::rocket:


Scaling down routes not scaling down memory usage

          ### Metrics

Test Name
Envoy Gateway Memory (MiB)
Envoy Gateway CPU (s)
Envoy Proxy Memory (Avg) (MiB)
Envoy Proxy CPU (Avg) (s)

scale-up-httproutes-10
107.11
0.74
25.85
30.44

scale-up-httproutes-50
136.46
1.42
31.97
60.84

scale-up-httproutes-100
136.98
2.75
38.13
91.64

scale-up-httproutes-300
141.98
14.64
60.31
124.75

scale-up-httproutes-500
157.41
26.76
80.52
158.63

scale-up-httproutes-1000
179.77
57.89
130.77
197.64

scale-down-httproutes-500
164.67
85.83
130.91
233.84

scale-down-httproutes-300
152.14
96.66
131.07
266.26

scale-down-httproutes-100
146.73
106.85
127.11
298.33

scale-down-httproutes-50
161.01
107.92
127.04
329.02

scale-down-httproutes-10
202.45
108.52
126.36
359.48

Originally posted by @arkodg in https://github.com/envoyproxy/gateway/issues/4287#issuecomment-2430569347

is this an issue with the measurement or with EG ?
cc @shawnh2

imo. we should  provide routes  with different services or  backend for benchmark.
nowly, just  for one service, the  EG metrics report show the minimal scene

The resource cached many resources. Any resource that changes will send a signal, and runners will subscribe to the change message. There are many DeepCopy.
I think that we should provide a global cache resource mapping, and the runners subscribe to the simple change signal. in the HandleSubscription function or Translator gets the resource in the global cache.


Sudo Python3 setup.py isnt working

every time i try using it when i get to the first part which is the installation, i get stuck because every time i use sudo python3 setup.py install it says this

Traceback (most recent call last):
File "setup.py", line 3, in
from setuptools import setup, find_packages, Command
ModuleNotFoundError: No module named 'setuptools'

can i get help please

Install the package python3-setuptools

pip3 install setuptools should do the job.


feat: support alert rules

Issue
Closes #88.
Solution
mimirtool is a binary from Grafana that can be pointed at a Mimir cluster, allowing us to easily set alert rules that are then persisted in s3. If the worker loses a pod, gets scaled to 0, if a new worker joins the cluster, the alert rules are propagated automatically by Mimir itself. mimirtool provides both a holistic and a delta approach; in this PR, I'm following what we do in Prometheus: replace holistically (regenerate the source of truth from relation data), but only if there are changes (compute the SHA and check before replacing).
The coordinator charm can gather alert rules via facilities from the remote_write library, and then save it to disk under /etc/mimir-alerts/rules. Those are then sent to the cluster via mimirtool, which is copied over from the charm container to the workload container.
This PR also adds the integration with alertmanager, allowing to juju relate the coordinator to it, and correctly configuring the alertmanager urls in Mimir so that the alerts go through correctly.
Passing fixes
The meta-roles definition was wrong: the role all did not, in fact, include all roles, but only a subset. I adjusted the recommended deployment accordingly. I also removed alertmanager from the recommended deployment, as we decided to use the external one.
Testing Instructions
Deploy the Mimir HA solution with the coordinator from this PR. Also deploy avalanche-k8s and alertmanager-k8s, and relate them to the coordinator.

Everything has been tested manually: you can see the alerts appearing in the Mimir datasource in Grafana:

The relation with alertmanagere is also working as intended:


Add methods for manipulating neighborlists

Due to my latest work with neighbor lists, I think three additional methods could be useful
def remove_neighbor_list(self, options: NeighborListOptions):
   """remove a list from a `System` based on the provided `options`"""
   ...

def slice_neighborlist(
   self,
   options: NeighborListOptions,
   new_options: NeighborListOptions,
   axis: str,
   labels: Labels,
):
   """Create a new sub list from an already present list."""
   ...

def split_neighborlist(
   self,
   options: NeighborListOptions,
   new_options: List[NeighborListOptions],
   axis: str,
   grouped_labels: List[Labels],
):
   """Create multiple sublists based on a present list."""
   ...

The last two should work similar to the slice/split operation that we have on a TensorBlock.
Background: If you have hybrid model that works on top of classic force field that already defines fixed pairs for bonds/angle/dihedral interactions, it might be useful to exclude these fixed pairs in your model because interactions are already well parametrized with these fixed pairs.

I don't see how new_options for slice_neighborlist and split_neighborlist would be different from the options.
For handling excluded pairs, you would want to replace the existing NL with a new one containing only a subset, so the new_options would be the same.

For the slice_neighborlist I agree, but for the split you will get two or more lists and they can't have the same NeighborListOptions, right?


Example for v2 refers to v1

The example on https://godoc.org/gopkg.in/alecthomas/kingpin.v2 contains
"gopkg.in/alecthomas/kingpin.v1"

. Should probably be
"gopkg.in/alecthomas/kingpin.v2"

FYI you can edit files in GitHub to create a PR. With this method you could create a PR as quickly as writing an issue.


the method 'gettranslations' does not exist

I know that this is for fields and maybe not so much gridfields and their dataobjects, but I currently receive this error:
the method 'gettranslations' does not exist
when using the module on a dataobject which holds my fields.
ERROR [User Error]: Uncaught Exception: Object->__call(): the method 'gettranslations' does not exist
on 'Dealers'
IN POST /admin/pages/edit/EditForm/field/Dealers/item/3/ItemEditForm?Locale=nl_NL
Line 739 in D:\XAMPP\htdocs\framework\core\Object.php
Source
730: 				default :
731: 					throw new Exception (
732: 						"Object->__call(): extra method $method is invalid on $this->class:"
733: 							. var_export($config, true)
734: 					);
735: 			}
736: 		} else {
737: 			// Please do not change the exception code number below.
738: 			$class = get_class($this);

739: 			throw new Exception("Object->__call(): the method '$method' does not exist on '$class'", 2175
);
740: 		}
741: 	}
742:
743: 	//
--------------------------------------------------------------------------------------------------------------
744:
745: 	/**

Trace
Object->__call(getTranslations,Array)
UntranslatableFields.php:54
Dealers->getTranslations()
UntranslatableFields.php:54
UntranslatableFieldsExtension->onAfterWrite(,,,,,,)
Object.php:978
Object->extend(onAfterWrite,)
DataObject.php:1115
DataObject->onAfterWrite()
DataObject.php:1393
DataObject->write()
GridFieldDetailForm.php:547
GridFieldDetailForm_ItemRequest->doSave(Array,Form,SS_HTTPRequest)
Form.php:462
Form->httpSubmission(SS_HTTPRequest)
RequestHandler.php:288
RequestHandler->handleAction(SS_HTTPRequest,httpSubmission)
RequestHandler.php:200
RequestHandler->handleRequest(SS_HTTPRequest,DataModel)
RequestHandler.php:222
RequestHandler->handleRequest(SS_HTTPRequest,DataModel)
GridFieldDetailForm.php:102
GridFieldDetailForm->handleItem(GridField,SS_HTTPRequest)
GridField.php:963
GridField->handleRequest(SS_HTTPRequest,DataModel)
RequestHandler.php:222
RequestHandler->handleRequest(SS_HTTPRequest,DataModel)
RequestHandler.php:222
RequestHandler->handleRequest(SS_HTTPRequest,DataModel)
Controller.php:157
Controller->handleRequest(SS_HTTPRequest,DataModel)
LeftAndMain.php:451
LeftAndMain->handleRequest(SS_HTTPRequest,DataModel)
AdminRootController.php:93
AdminRootController->handleRequest(SS_HTTPRequest,DataModel)
Director.php:385
Director::handleRequest(SS_HTTPRequest,Session,DataModel)
Director.php:149
Director::direct(/admin/pages/edit/EditForm/field/Dealers/item/3/ItemEditForm,DataModel)
main.php:184

Sorry, I have had not enough time to test and develop this module, so it might be quite unstable now. I'm not sure what you mean about that this module would not be for DataObjects that are managed with a GridField. The design is quite universal and simple and does not rely upon the user interface that makes changes to DataObjects. So in theory, it should work :), but there might be a bug somewhere.
I think the getTranslations() method should be provided by the Translatable module as an extension to all of the DataObjects that are configured to use Translatable as an extension. I know this is a really basic thing to ask, but I just want to make sure. Do you have this configuration in any of your yml config files?
Dealers:
  extensions:
    - Translatable

Does regular translations work without any issues if you disable or remove the untranslatablefields module?
Can you provide your Dealers class code here? You can simplify it and remove any confidential info/code from it as you wish. Also any YAML/PHP configuration regarding that class can be helpful.
Also, thank you for pointing out this issue! Testing and bug reports are always welcome as this module unfortunately is not mature yet.

It doesn't seem to copy the data from one language to another.
I didnt have the following:
Dealers:   extensions:     - Translatable
But adding it didn't seem to make a difference.
DealersPage.php
`<?php
class DealersPage extends Page {
private static $has_many = array (
    'Dealers' => 'Dealers' //change to singular "Dealer"
);

public function getCMSFields() {

	$fields = parent::getCMSFields();
	$fields->removeFieldFromTab("Root.Main","Content");
	$fields->addFieldToTab("Root.Main", GridField::create('Dealers','Overzicht van dealers', $this->Dealers(), GridFieldConfig_RecordEditor::create()));

	return $fields;

}

}
class DealersPage_Controller extends Page_Controller {
}
?>`
Dealers.php
`<?php
class Dealers extends DataObject {
private static $db = array (

	'Naam' => 'Varchar(256)',
    'Straat' => 'Varchar(256)',
    'Huisnummer' => 'Varchar',
    'Postcode' => 'Varchar',
    'Stad' => 'Varchar(256)',
    'Land' => 'Varchar',
    'Telefoon' => 'Varchar',
    'Website' => 'Varchar(256)',
	'Lengtegraad' => 'Decimal(9,7)',
    'Breedtegraad' => 'Decimal(9,7)'
);

private static $has_one = array (
    'DealersPage' => 'DealersPage' //left is relationship name right is dataobject name
);

static $summary_fields = array (
    'Naam' => 'Naam',
    'Straat' => 'Straat',
    'Huisnummer' => 'Huisnummer',
    'Stad' => 'Stad',
    'Land' => 'Land'
 );

public function getCMSFields() {

    $fields = parent::getCMSFields();

    $fields->addFieldToTab('Root.Main', TextField::create('Naam'));
    $fields->addFieldToTab('Root.Main', TextField::create('Straat'));
    $fields->addFieldToTab('Root.Main', TextField::create('Huisnummer'));
    $fields->addFieldToTab('Root.Main', TextField::create('Postcode'));
    $fields->addFieldToTab('Root.Main', TextField::create('Stad'));
    $fields->addFieldToTab('Root.Main', CountryDropdownField::create('Land'));
    $fields->addFieldToTab('Root.Main', TextField::create('Telefoon')->setRightTitle('Vergeet landcode niet, bijv. +31'));
    $fields->addFieldToTab('Root.Main', TextField::create('Website'));
    $fields->addFieldToTab('Root.Main', NumericField::create('Breedtegraad')->setRightTitle('(Latitude) Achterhalen via http://www.mapseasy.com/adress-to-gps-coordinates.php'));
    $fields->addFieldToTab('Root.Main', NumericField::create('Lengtegraad')->setRightTitle('(Longitude) Achterhalen via http://www.mapseasy.com/adress-to-gps-coordinates.php'));

    return $fields;
}

public function getTitle() {

    return $this->Naam;

}

}
_config.ymlDirector:
environment_type: 'dev'
i18n:
common_locales:
nl_NL:
name: Dutch
native: Nederlands
fr_FR:
name: French
native: Francais
en_US:
name: English
native: English
de_DE:
name: German
native: Deutsch
Dealers:
extensions:
- TranslatableDataObject  `
untranslatablefields.yml
UntranslatableFields:   fields:     Dealers:       - Naam       - Straat       - Huisnummer       - Postcode       - Stad       - Land       - Telefoon       - Website       - Breedtegraad       - Lengtegraad   add_attributes_to_cms:     - data-untranslatable: yes     - title: "This field can't be translated separately. Changes to this field are saved across all existing translations."

Ah, now I understand. Sorry, I did not know that Translatable does not work directly for pure DataObjects and that TranslatableDataObject is used for this instead.
TranslatableDataObject is designed in a different way than Translatable in that it does not create a new record for each DataObject, but instead creates new columns in the database to the tables of the translated DataObjects.
Now that I look at the documentation of the translatable-dataobjects module, it seems that you can configure which fields of your DataObject class it translates. So is it actually so that this module is actually not needed when translating DataObjects using translatable-dataobjects?
With this YAML config, you should be able to leave out all the fields you do not wish to translate:
MyDataObject:
  extensions:
    - TranslatableDataObject
  translatable_fields:
    - Content
    - Title

The above is from the readme of the translatable-dataobject module, so please refer to it's documentation for more information.
I haven't used the translatable-dataobjects module, so perhaps I'm missing out something here. The module seems to be just what I need for one of my projects, so I'm glad that it came out in this discussion. When I have time, I will spend more time on getting familiar with the translatable-dataobjects module and see if there's anything that my module could offer on top of that.
If you still think there's an issue with this module, please let me know and I will look at it again. Otherwise I will close this issue after some time.

If I remove
Dealers:
  extensions:
    - TranslatableDataObject

The data is also not copied across languages.
I guess what I am asking is can I use the untranslatable module to copy data from the english gridfield to say the french gridfield?
So that the same data is shown in each and regardless of which language the customer is on, they see the same info.
Is that something the untranslatable module can do and if so, why does my setup not work?

Umm, I think you should be able to do that using this module. Then it would require you to use the Translatable module like so:
mysite/_config.php:
Dealers::add_extension('Translatable');

Personally I have had problems with using Translatable for pure DataObjects (instead of objects derived from SiteTree). At least one problem was that a databse record did not get a correct locale value (i.e. 'en_US' or 'fi_FI') when writing a dataobject in a different language than what was to site's default language. From this conversation I have finally realized that I should try the translatable-dataobjects module.
So, to summarize it, you should be able to use this module to copy the same data on specific fields across all the different gridfields, BUT you will run into other problems because the Translatable module does have issues with pure DataObjects for some reason.
If I had understood correctly, to make everything work ,you should change your data structure design so that you will use translatable-dataobjects and instead of having multiple records per Dealer (= one record per translation), your data structure would be so that one database record contains all the translations for one Dealer. Is there any issues with this kind of setup? I think the translatable-dataobjects module work so that it does not create language specific columns for those fields that you decide to omit from the translation, meaning that the same values in those fields will be displayed no matter what language you use in the gridfield.

All sorted now Taitava.
You were right, it was not to do with your module.
I was able to use the translatable-dataobjects module and create a master list which all dataobjects are saved to.
Then I can pull the master list into the template.
It was all in the readme you linked through (Under "The DataObject (Testimonial)"):
https://github.com/bummzack/translatable-dataobject/blob/master/README.md
Thanks again for everything.

Nice to hear that it is all settled now :).


Unable to connect to DT3010

After downloading this project and running npm run start and going to the url provided in the terminal I clicked Connect and nothing happens.  I get the error in the console screenshot below.

Am I running this application correctly?
I'm on Ubuntu 20.04 with the distro versions of node and npm installed.  I can see the DT3010 in the list of bluetooth devices and can connect from the OS.  I tested atorch-console both connected from the OS and not.
Thanks for your help!

Enable chrome://flags/#enable-experimental-web-platform-features and restart Chrome.


Shopware recipe always updates all plugins

I've noticed that the "sw:plugin:update:all" task for the Shopware recipe is always updating all plugins, not taking into account the "upgradeVersion" field correctly. Whenever this field is set to a null value, the update is still triggered.
https://github.com/deployphp/deployer/blob/a8a16c755ea5062510f6b519f0e63123a5abd1ea/recipe/shopware.php#L117

That sounds like a shopware problem to me and the command should be fixed in the core :-)

Shopware has prepared a shopware/deployment-helper, which could render that custom code of the recipe obsolet, see the demo code by @shyim.


Enable CORS for "app://obsidian.md"

Hello,
I am a developer creating plugins for Obsidian, a popular knowledge management and note-taking software. I believe that enabling CORS for app://obsidian.md would significantly enhance the functionality and integration possibilities of Obsidian plugins with Ollama models.
Obsidian uses a custom protocol app://obsidian.md which I think is secure and used exclusively within the Obsidian environment. Allowing CORS for this protocol does not introduce significant security risks as it is a controlled environment, primarily dealing with local files and user-initiated actions. This environment ensures that enabling CORS would not expose Ollama to unwanted cross-origin requests in a way that compromises security.
By enabling CORS, developers can seamlessly integrate Ollama's advanced modeling capabilities directly into Obsidian, enhancing the user experience and providing advanced features directly within the application.
I dont know if I express myself properly, but I just ask, if it would be possible to put app://obsidian.md in OLLAMA_ORIGINS to avoid using * in this case.
Thank you for considering this enhancement. I appreciate the fantastic work you've done with Ollama and fully respect any decision you make regarding this request. Your efforts in developing such a powerful tool are greatly appreciated by the community.
Best regards,
Pegasus Themis

@pegasusthemis I am curious if you got this working on Mac? this looks like the linux way to set the env variable.

haha fun seeing you here :) is this for development or are you using a
program? i think when i used lm studio i had an option to disable cors in
server settings and it fixed the issue? i do not fully remember though
On Tue, Apr 30, 2024, 8:38 a.m. TfTHacker @.***> wrote:

@pegasusthemis https://github.com/pegasusthemis I am curious if you got
this working on Mac? this looks like the linux way to set the env variable.
—
Reply to this email directly, view it on GitHub
https://github.com/ollama/ollama/issues/3827#issuecomment-2085706760,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/ATIO6ZIHJCL5PMPU6AJDFGLY763GLAVCNFSM6AAAAABGTC4VA2VHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDAOBVG4YDMNZWGA
.
You are receiving this because you are subscribed to this thread.Message
ID: @.***>

TfTHacker: Nope I configured this on a Windows 11 machine using the Environment Variables GUI. For setting it up across multiple Windows systems, I employed the command line as admin, with the following syntax: SETX /M OLLAMA_ORIGINS "app://obsidian.md*" which applies the setting system-wide.
I've noticed that you are also developing plugins for Obsidian, with AI. I'm excited to try out your plugin and see how it does. Best luck with your development. Looking forward to see more of your work!
Ransurf: I develop a plugin for Obsidian, already fix the CORS problems with Ollama, but I am having a little bit of a headache with the Claude API CORS
Warm regards,
Pegasus Themis #

@Ransurf: I develop a plugin for Obsidian, already fix the CORS problems with Ollama, with the previous cmd, but right now I am having a little bit of an issue with the Claude API CORS. Thank you for your help.

@ransurf Yes that's right. My newest plugin "AI for templater". Works great with most OpenAI compatible engines, like lM studio, llama.cpp, but not with Ollama. On mac I can't get it to work.