For review only

Codecov Report

Merging #389 into master will decrease coverage by 0.06%.
The diff coverage is 66.66%.

@@             Coverage Diff              @@
##             master     #389      +/-   ##
============================================
- Coverage     79.88%   79.81%   -0.07%
- Complexity      476      478       +2
============================================
  Files            66       66
  Lines          1546     1551       +5
  Branches        234      234
============================================
+ Hits           1235     1238       +3
- Misses          173      175       +2
  Partials        138      138


Observing Global Position, Pivot Changes

I'm looking for a strategy to observe position/pivot/bounds of display objects - globally. I have a feeling that this won't be easy but wanted to ask. I did see ObservablePoint but it doesn't look like listeners can be added into an ObservablePoint later. Can I wrap one ObservablePoint with another?
The basic premise is that when a display object moves or resizes on the screen, any HTML elements floating above could be adjusted to follow along.
I am already doing my own layout management and so I think I might be able to make something work. However, one caveat I see perhaps pertains to when I tween pivots. Is there a way to hook into listen to pivot changes so I can react in my HTML layer? Or maybe I'll just have to "wrap" pivot changes and just react...

---------- Thư đã chuyển tiếp ---------
Từ: Philip Weaver<EMAIL_ADDRESS>Ngày: CN, 24 thg 9, 2017 lúc 16:09
Chủ đề: [pixijs/pixi.js] Observing Global Position, Pivot Changes (#4326)
Tới: pixijs/pixi.js<EMAIL_ADDRESS>CC: Subscribed<EMAIL_ADDRESS>I'm looking for a strategy to observe position/pivot/bounds as display
objects - globally. I have a feeling that this won't be easy but wanted to
ask. I did see ObservablePoint but it doesn't look like listeners can be
added into an ObservablePoint later. Can I wrap one ObservablePoint with
another?
The basic premise is that when a display object moves or resizes on the
screen, any HTML elements floating above could be adjusted to follow along.
I am already doing my own layout management and so I think I might be able
to make something work. However, one caveat I see perhaps pertains to when
I tween pivots. Is there a way to hook into listen to pivot changes so I
can react in my HTML layer? Or maybe I'll just have to "wrap" pivot changes
and just react...
—
You are receiving this because you are subscribed to this thread.
Reply to this email directly, view it on GitHub
https://github.com/pixijs/pixi.js/issues/4326, or mute the thread
https://github.com/notifications/unsubscribe-auth/AYFnhgxkibdBm2LctLoWPsv6THSXPewGks5slhw8gaJpZM4Ph07x
.
NGUYEN VAN CONG
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.22 (GNU/Linux)
iEYEARECAAYFAlnFJ00ACgkQ4J/vJdlkhKxCsQCfRO0X5aR3Gh6WmAosf9Vfr8yr
aucAnjZtuL6rOFswq07PmXMlEQ4LbRKd
=AUTX
-----END PGP SIGNATURE-----

I decided to basically wrap updateTransform for this particular DisplayObject. Is that going to be the best solution to watch for position/pivot changes?

transform has is tracking everything through version ID's: https://github.com/pixijs/pixi.js/blob/dev/src/core/display/TransformStatic.js#L117
As for runtime observe, you can extend TransformStatic, put different onChange in its prototype: https://github.com/pixijs/pixi.js/blob/dev/src/core/display/TransformStatic.js#L64

Super cool info. Ivan and Mat, I hope you don't mind too much if I treat Pixi Issues like a mailing list. Peace out.

That's what we use instead of mailing lists.


Arrange deployment into 4 groups when multi-region is enabled

Needs an updated Arch diagram.

Shared resources group: Security
Shared resources group: Storage
Primary resources group: Primary resources (serves web traffic)
Secondary resources group: Secondary resources (does not serve traffic)

migrated to 1852537


Fix crosstool-ng builds

Since the move to 18.04 the crosstool-ng docker image won't build. Plus we (probably) need to upgrade crosstool-ng too.

@grooverdan fixed this with some awesome patch-fu

It was backport of a more complicated patch upstream. Probably should push crosstool-ng to do another release.


0.10.0 release request

Add support for optional MSI installation directory parameter for downloaded windows installation file.
The requirements modules has been updated for puppet-labs-apt module, This update changed the depencies requirement version of this module from >= 2.3.0 < 5.0.0 version to >= 2.3.0 < 8.0.0. And for puppetlabs-stdlib module, the requirements version has been updated from >= 4.2.0 < 5.0.0 version to >= 4.2.0 < 7.0.0.

 Thank you for your submission! We really appreciate it. Like many open source projects, we ask that you sign our Contributor License Agreement before we can accept your contribution.You have signed the CLA already but the status is still pending? Let us recheck it.

Thank you @claassistantio, I have signed the contributor license agreement as requested.

 All committers have signed the CLA.


Sidebar menu with multiple columns

Is there an option to convert the simple sidebar menu into a multicolumn mega menu?

Currently, AdminLTE only supports single column sidebars. Sorry for the inconvenience.


fixed to #921 - Add params argument to DbContextActivator.CreateInstance...

this PR addresses #921. I have to add it as an overload method because of AddScoped method.
In addition, a test seems to require all public api arguments must have [NotNull]attribute?

@divega Can you take a look at this since it is your enhancement request that it resolves?

@RickyLin could you add a test?

@divega I have added a test.

Hey All,
Just a quick note to let you know that we will be merging contributions from folks outside the EF team here at Microsoft shortly. We just need to hold off for a little longer while we branch for our next release. There is some process around shipping external contributions with Visual Studio, so we need to branch for our next pre-release before taking any further contributions.
~Rowan

@RickyLin, Thanks for signing the contribution license agreement so quickly! Actual humans will now validate the agreement and then evaluate the PR.
Thanks, DNFBOT;

As I mentioned in a comment I think we should leave the existing overload of CreateInstance<TContext>() the way it was, but otherwise :shipit:

I have reverted the default CreateInstance<TContext> method.

@RickyLin Can you please squash your changes into one commit?

Why I didn't get the notification.
Anyway, @ajcvickers, I have squashed the changes into one commit.


Turn off multiprocessing in Reader.from_strs()

Hi,
Thanks for the helpful tool! I've been getting good use out of it recently.
I'm wondering if there's a way to instantiate a reader without using multiprocessing? My work is already multi-threaded, and when I was using ReaderFixed.from_strs() on single CHAT strings, my computer was overwhelmed with new python processes.
If there isn't already a way to load a single CHAT from a string, maybe it could only use multiprocessing when there is more than one string to parse?
class Reader:

    def _parse_chat_strs(self, strs: List[str], file_paths: List[str]) -> None:
        if len(strs) == 1:
            self._files = [self._parse_chat_str(strs[0], file_paths[0])]
        else:
            with cf.ProcessPoolExecutor() as executor:
                self._files = collections.deque(
                    executor.map(self._parse_chat_str, strs, file_paths)
                )

Or perhaps it could be optional? (I might even suggest the default to be off — I had a pretty hard time figuring out where these processes were coming from.)
class Reader:

    def _parse_chat_strs(self, strs: List[str], file_paths: List[str], use_multiprocessing) -> None:
        if use_multiprocessing:
            with cf.ProcessPoolExecutor() as executor:
                self._files = collections.deque(
                    executor.map(self._parse_chat_str, strs, file_paths)
                )
        else:
            self._files = [self._parse_chat_str(s, f) for s, f in zip(strs, file_paths)]

    @classmethod
    def from_strs(cls, strs: List[str], ids: List[str] = None, use_multiprocessing=False) -> "Reader":
        # ...
        reader = cls()
        reader._parse_chat_strs(strs, ids, use_multiprocessing=use_multiprocessing)
        return reader

Thanks for giving it some thought, and thanks again for a great package.
Best,
Robert

Glad to hear you have something working in your case!

I thought you might like to know about my experience.

I'm always interested in any user feedback. Thank you again for taking the time to study the pylangacq source code, devising your own solution, and writing it all up on GitHub here!

I figure you probably had some specific motivation for multiprocessing there, but in my particular case, the overhead of new processes hurt more than helped.

Indeed, I'd expect that most users would use pylangacq to read CHILDES/TalkBank data from the CHILDES/TalkBank website, either by using the read_chat function for convenience or by one of the Reader methods {from_zip, from_dir, from_files} depending on circumstances. Because there are almost certainly multiple CHAT data files to deal with, and because all these calls ultimately reach the from_strs method, it's reasonable to parallelize the CHAT string parsing within from_strs.
If your use case has CHAT data coming straight from memory and that your application is already multi-threaded as you've mentioned, then I definitely understand that you wouldn't want further parallelization from Reader.from_strs to complicate things. I'm seriously considering an option to allow the user to turn off multiprocessing, as you've suggested, though I need to think more about the specifics -- I'll keep you posted!

Hi @rcgale, I decided to not drag too long on this -- I've just made a new release of pylangacq 0.14.0. This release has a new optional bool argument parallel for Reader.from_strs(). Now Reader.from_strs(your_strs, parallel=False) does not parallelize, pretty much along the lines you've suggested above. (I chose parallel as the arg name for it being shorter and also covering both the thread-based from_files and process-based from_strs parallel code -- I've decided to go with a single arg to let the user toggle parallelization on/off for all the from_X methods.)
Thank you again for sharing your experience with me!

Very nice! And I'll readily admit I have a habit of making my variable names too long :)
I'll probably pull that into my work tomorrow, it'll clean things up very nicely for me. Thanks!


[feature] Add a BitSet implementation based on RoaringBitmap

SUMMARY
Add a BitSet implementation based on RoaringBitmap to make users could migrate BitSet to RoaringBitmap easier.
Automated Checks

[x] I have run ./gradlew test and made sure that my PR does not break any unit test.
[x] I have run ./gradlew checkstyleMain or the equivalent and corrected the formatting warnings reported.

@dao-jun Please have a look at my proposals.

@lemire Thanks for your review, addressed

Running tests.

I like it, but I'd love to have feedback from others. Note that the instances will have additional dead-weight overhead because you need to carry the BitSet class around... but I am not sure how of a concern that is.
@richardstartin : any opinion?
Anyone else?

I like it, but I'd love to have feedback from others. Note that the instances will have additional dead-weight overhead because you need to carry the BitSet class around... but I am not sure how of a concern that is.
@richardstartin : any opinion?
Anyone else?

Yes, RoaringBitSet extends BitSet, one single RoaringBitSet instance may consume extra serval bytes, but it also comes one benefit: users almost takes no changes when migrate BitSet to RoaringBitSet.
Anyway, it's a trade, extends BitSet or not do have its reason.

no opinion, it's an imperfect solution because of the constraints, but it's useful.

I am going to merge it. Thanks @richardstartin

@lemire Hi, I don't find the 1.1.0 release in maven central repo, it there something goes wrong?

(Note that releases do not appear immediately. The maven repository is quite slow. It often takes a few days if not more.)

I was just wandering if the dist published to maven central repo.
Seems it's maven's issue, thanks for your explain, I got it.

Yes, our releases are uploaded to the maven repository using sonatype tooling.

I made a follow-up PR #727 to properly implement RoaringBitSet.get(int fromIndex, int toIndex) without relying on java.util.BitSet implementation for get(int fromIndex, int toIndex). Please review!


New version: Mozilla.Firefox.ESR.sk version 128.4.0

Created by 🥟 Dumplings.
Microsoft Reviewers: Open in CodeFlow

@wingetbot run


PWA-821 extend e2e tests

Pull Request Test Coverage Report for Build 1642

0 of 91 (0.0%)  changed or added relevant lines in 6 files are covered.
5 unchanged lines in 2 files lost coverage.
Overall coverage decreased (-0.7%) to 37.715%

Changes Missing Coverage
Covered Lines
Changed/Added Lines
%

e2e/helper/cart.js
0
2
0.0%

e2e/integration/functional/ProductPage.js
0
9
0.0%

e2e/integration/functional/SearchPage.js
0
9
0.0%

e2e/integration/functional/FilterPage.js
0
17
0.0%

e2e/integration/functional/CartPage.js
0
19
0.0%

e2e/integration/functional/FavoritesPage.js
0
35
0.0%

Files with Coverage Reduction
New Missed Lines
%

e2e/integration/functional/SearchPage.js
2
0.0%

e2e/integration/functional/ProductPage.js
3
0.0%

Totals

Change from base Build 1641:
-0.7%

Covered Lines:
1509

Relevant Lines:
3991

💛  - Coveralls


Sending Unicode strings as QSTRING type

On Python 2.7: I'm trying to send non-ASCII (utf-8) data to a q process. It works fine when sending the data as a QSYMBOL (using str.encode('utf-8')), but always fails when trying to send the data as a QSTRING.
If I send the data as a unicode string I get:
QWriterException: Unable to serialize type: <type 'unicode'>
in line 119 of qwriter.py.
If I convert the unicode string to a str type (using str.encode('utf-8')) I get:
UnicodeDecodeError: 'ascii' codec can't decode byte [...]: ordinal not in range(128).
in line 167 of qwriter.
Setting encoding to 'utf-8' when initialising the connection doesn't help either.
Do I need to write a custom _write_string override to get this to work properly?

Q internal-process communication doesn't support Unicode, only strings coded in ASCII. Using QSYMBOL as a solution is not supported workaround, which can fail and provide partial information.
You may try to encode string into an UTF-8 byte array in Python and send it to a q process. Then decode the string on a q side. In order to send byte list use type QBYTE_LIST available in qPython.

Okay, that fixed my problem. Didn't realise IPC doesn't support unicode! Cheers


Aram

Hello, I was trying to make it work in aram.
I could change the id_lobby. But the bot is trying to select champs in the list.
Any way to make to not selec champs?
Or make it for ARAM mode?

PD: The bot work perfect, just want to know if is possible to play aram with it

No, sorry, the bot is only designed for bots. Playing aram is too likely to get the account banned.


<EMAIL_ADDRESS>hash check failed

I use Ubuntu 24.04 over WSL2 and I keep getting from this input:
scoop install lmstudio
this output:
WARN  Purging previous failed installation of lmstudio.
ERROR 'lmstudio' isn't installed correctly.
Removing older version (0.2.16).
'lmstudio' was uninstalled.
Installing 'lmstudio' (0.2.16) [64bit] from 'okibcn_ScoopMaster' bucket
LM-Studio-0.2.16-Setup.exe (402,4 MB) [=======================================================================] 100%
Checking hash of LM-Studio-0.2.16-Setup.exe ... ERROR Hash check failed!
App:         okibcn_ScoopMaster/lmstudio
URL:         https://releases.lmstudio.ai/windows/0.2.16/latest/LM-Studio-0.2.16-Setup.exe#/dl.7z
First bytes: 4D 5A 90 00 03 00 00 00
Expected:    1acf631c47fe6efb4ecfbd388554393139c62413ec4d6ad8a2692597b67bbf01
Actual:      12db3436c62b3a73d944e7b11bc0c84ff3d198d3adf367ff2c9aceb30c046fa8

the output is the same, when i use Kali Linux over WSL2


HBASE-28224 ClientSideRegionScanner appears not to shutdown MobFileCache

What
This PR updates ClientSideRegionScanner to close its instances of the MobFileCache and the BlockCache. In normal region server operation, the shutdown of these resources is typically handled by RegionServerServices which isn't present in the ClientSideRegionScanner. Since the ClientSideRegionScanner instantiates these resources, it should handling shutting them down as well to avoid resource leaks.
Testing
I've verified that this works locally with some debug breakpoints. I'd love to write some automated test behavior for this, but unsure how to proceed there. Would appreciate any pointers.
HBASE-28224

:confetti_ball: +1 overall

Vote
Subsystem
Runtime
Comment

+0 :ok:
reexec
0m 32s
Docker mode activated.

@Apache9 any chance you have an idea on when this PR will be merged? Not urgent, I just don't want this PR to get lost

@Apache9 any chance you have an idea on when this PR will be merged? Not urgent, I just don't want this PR to get lost

Sorry, forgot this one.
Let me merge and cherry-pick to other branches.


Handle deprecated rules (closes #112)

Deprecated rules should be added conditionally.
See https://github.com/prettier/eslint-config-prettier/issues/112

@lydell Let's continue the discussion here.

Let’s take indent-legacy as an example. It was deprecated in some ESLint version X. But it’s still around. People might take their time to upgrade to the new indent rule, but still update ESLint. Then they start adding Prettier to their project, piece by piece. Then wouldn’t they want eslint-config-prettier to disable indent-legacy for them?

Let’s take indent-legacy as an example. It was deprecated in some ESLint version X. But it’s still around. People might take their time to upgrade to the new indent rule, but still update ESLint. Then they start adding Prettier to their project, piece by piece. Then wouldn’t they want eslint-config-prettier to disable indent-legacy for them?

Ok, looks like I misunderstood the deprecation process. I thought that deprecated rules are removed and don't work when you upgrade, but it turns out they stick around and will work indefinitely, as mentioned in the ESLint Rule Deprecation guidelines.
So now let me rethink this.
Let's try another example...

Using an old ESLint version (e.g. v3.0.0)
Adding the rule no-spaced-func
Upgrading to latest ESLint, keeping the rule in .eslintrc
Adding Prettier
Formatting files with Prettier
Linting with ESLint

In this case, there's actually no conflict as Prettier is aligned with the expected behavior of no-spaced-func, but assuming Prettier could theoretically change the behavior (as they did with Arrow Functions parameters braces when there's only one parameter), then it could actually conflict and ESLint would yell at the user.
This is where adding eslint-config-prettier would be expected to solve the problem, by turning no-spaced-func off.
This means that we can't rely on the ESLint version as users may still use the deprecated rules.
Let me define my original challenge...

I'd like to keep my ESLint configs up to date, without any deprecated rule, as those are not maintained and may not work properly for future code.
I'd like to have an automated process to fail a project lint process or CI process when deprecated rules are found
ESLint doesn't warn when using deprecated rules, it only adds a list of usedDeprecatedRules in the Node API results, which is accessible only after running ESLint on some files (https://github.com/eslint/eslint/pull/10953)
So I'm using eslint-find-rules to error on used deprecated rules
This works, but when using eslint-config-prettier, eslint-find-rules errors since we turn off some rules that are deprecated

Thoughts

Ideally this could be handled in eslint-find-rules to find only user defined rules and ignore plugin/extends rules (not so easy but might be possible as I mentioned https://github.com/sarbbottam/eslint-find-rules/issues/188#issuecomment-539719817)
We could still support this use case in eslint-config-prettier without breaking anything.

Two options come to mind, inspired by your suggestions:

Support an environment variable, if exists, don't add the deprecated rules, e.g.

ESLINT_CONFIG_PRETTIER_EXCLUDE_DEPRECATED=1 npx eslint-find-rules -d .eslintrc

Support a mirrored config that doesn't include deprecated rules

prettier/no-legacy
prettier/react-no-legacy

I'm leaning towards 1 since it's much simpler and fits well with the use case of running a CLI command to lint for deprecated rules.
I'll update the PR with that solution.


remove times lap from songs bar

remove this unnecessary times lap from main container align the rest of the things properly

@samratghosh291 Can I work on this?

No @Judge-Paul you cannot work on it as akashpambhar already assigned in it.
You can raise another issue and asking for assigning.


Remove use_auth_token

use_auth_token is no more needed
https://github.com/huggingface/diffusers/releases/tag/v0.4.0

The recently released version of huggingface-hub automatically uses your access token if you are logged in, so you don't need to put it everywhere in your code. All you need to do is authenticate once using huggingface-cli login in your terminal and you're all set.

Hey, I was testing and added them in a commit. So closing this PR.


fix type error on createTheme/createGlobalTheme on TypeScript 4.5.0

TypeScript 4.5.0 added "Template String Types as Discriminants", type string is not assignable to type CSSVarFunction( var(--${string}) | var(--${string}, ${string | number})) anymore, which caused an type error when use createTheme/createGlobalTheme with contract(Here's the simple reproduction):

This PR fixed this issue by change tokens param type in createTheme/createGlobalTheme from MapLeafNodes<ThemeContract, string> to MapLeafNodes<Record<keyof ThemeContract, string>, string>
fixes #483
fixes #484

Closing in favour of #489


Compatibility of task rescheduling with blockid

Context of use
I am setting blockid to tasks to be able to create links to the the given tasks.
I use it to pull linked to tasks within a Kanban, and be able to move tasks (links to tasks indeed) between columns
Please refer to https://help.obsidian.md/Linking+notes+and+files/Internal+links#Link+to+a+block+in+a+note.
Reference to blocks are automatically created with a alphanumerical index prefixed by caret (^)
Describe the bug
When a scheduled task is moved from one timing to another, the ending block id (^followed by a reference given by Obsidian) is moved backward in the sequence of data in the task line. This breaks the links to the block, as the reference shall be ending the block, which is not the case in the current implementation of TimeRuler I guess.
To Reproduce
Steps to reproduce the behavior:

Create a reference to a task (to the one-line block consisting in the task)
Set a Scheduled Date and Starting Time for the task
Launch command: Copy Block Link: Copy embed to current block or heading -- this creates the reference (caret followed by Obsidian given alphanumerical code)
Paste the link to the task (one-line block indeed) wherever you want
Reschedule the task in Time Ruler to another timing and/ or day
Come back to the pasted task embedded link
See it broken

Nota:

in the task full line, you can see the reference (caret followed by alphanum code) is no more latest on line.
if you move the "caret followed by alphanum code" to the end of the task/ one line block -- ensuring there is no black space after the block reference -- the pasted link is restored
It is cumbersome to have to clean up the task line at each rescheduling

Expected behavior
Keep block reference unchanged in tasks(events likely though not tested), by letting it at end of task/ event, without ending spaces
Obsidian Version:

1.4.6 Windows Desktop

Additional context
Add any other context about the problem here.

Thanks for the issue, I'll add support for block formatting soon.

Block references are supported in 1.2.0


feat: #1145 use cached access for applications list

Only do "refreshCachedUserAccess" to update access when user login.
Refactor on AuthService.ts to migrate user related content to FamLoginUserState.ts
Quick addition on showing user access levels on ProfileSideBar.
Read "applicationsUserAdministers" from cached FamLoginUserState for display on ManagePermission page.
Read "applicationOptions" from cached FamLoginUserState for display on GrantApplicationAdmin page.
Remove "fetchApplications" from route and from "fetchData", no need anymore.

Thanks Ian! Looks great! Just some small comment for simplify and clarification. Also maybe Nick @NickSaglioni if you want to check on this pr, Ian is getting the application options inside the component now instead of preparing it in the router handler, just regarding of your question this morning. Thanks so much!


possible bug: possibly with nbsp, or multiple refs in a row.

Hello David,
Fantastic Add on!  I love it and have been using it for years.
First time ever I've hit a bug: it is with Figure 12 of this doc: https://docs.google.com/document/d/1Hsad2v3xXqyoPO-3eQBEKJD7GOhD_DLYdCrFaNqCGf0/edit#
If you want to try to make edits, just ask for edit permissions, and in the meantime you can make suggestions and then note here that they have beenmade.
When I run the "Update Doc"
I get:
"One of your paragraphs contains more than one label.
Paragraphs may contain multiple references, but only one label.
You probably meant to insert a reference. The last label in
the paragraph has been highlighed in red."
But that is not what is happening as far as I can tel. I've even tried new lable names, redoing it inthe paragraph above, etc.
Any suggestions?
Thanks,
John

looks like I am going to have to label all the figures the old fashioned way... sigh.

Hi John, sorry for the late reply. Can you give me edit permission (davidrowthorn@gmail.com)?

Thanks David!  OK you should have edit permissions now.  And, this is a
forked version of the doc, not the actual one now.  So feel free to make
major changes/tests
John Gallo, Ph.D.
Senior Scientist
Conservation Biology Institute https://consbio.org/people/staff/john-gallo
136 SW Washington Avenue, Suite 202
Corvallis, OR 97333
Remote Office: Inglenook, CA
Phone:<PHONE_NUMBER>
Twitter: @johnagallo https://twitter.com/johnagallo
Updates: Action Research Newsletter
https://consbio.us9.list-manage.com/subscribe?u=3dea159e4cbe0a0ff3b43eadd&id=e3bd82fd81
On Fri, Aug 28, 2020 at 9:52 PM David Rowthorn<EMAIL_ADDRESS>wrote:

Hi John, sorry for the late reply. Can you give me edit permission (
davidrowthorn@gmail.com)?
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub
https://github.com/davidrthorn/cross_reference/issues/48#issuecomment-683236724,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/AD7CJ2Y5OQZJG6VGNZN4VGDSDCCR7ANCNFSM4QJU5GOA
.

I've had a play with the document and it look like a straight up bug to me. I'm on the verge of releasing a significant overhaul, so I'm going to put my efforts into that and hope that it resolves this issue, since there has been some change in how errors are handled.

ok, thanks for taking a look. I fixed things manually and will publish. Great to hear about the continued development. Thanks so much!


@last element in nested each refers to the parent item ( C# )

I try to dump array with objects to csv file. Each object is a row with values.
{{#unless @last}};{{/unless}} block in nested loop is interpreted as a last parent element.
There is a code for LinqPad:
void Main()
{
	string template = "{{#each header}}{{this}}{{#unless @last}};{{/unless}}{{/each}}\n{{#each rows}}{{#each this}}{{this}}{{#unless @last}};{{/unless}}{{/each}}\n{{/each}}\n\n\n\n\n\n";

			var data = new
            {
                header = new string [] { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" },
                rows = new item [] { new item(), new item(), new item(), new item(), new item(), new item(), new item() }

			};

	var handlebarsInstance = Handlebars.Create(new HandlebarsConfiguration {TextEncoder = new CsvEncoder()});
	Console.WriteLine(handlebarsInstance.Compile(template).Invoke(data));
}

public class CsvEncoder : ITextEncoder
{
    public string Encode(string value)
    {
        return value;
    }
}

public class item
{
	public string val1 {get; set;} = "A";
	public string val2 {get; set;} = "B";
	public string val3 {get; set;} = "C";
	public string val4 {get; set;} = "D";
	public string val5 {get; set;} = "E";
	public string val6 {get; set;} = "F";
	public string val7 {get; set;} = "G";
}

result is:
Sun;Mon;Tue;Wed;Thu;Fri;Sat
A;B;C;D;E;F;G;
A;B;C;D;E;F;G;
A;B;C;D;E;F;G;
A;B;C;D;E;F;G;
A;B;C;D;E;F;G;
A;B;C;D;E;F;G;
ABCDEFG

I expect this result:
Sun;Mon;Tue;Wed;Thu;Fri;Sat
A;B;C;D;E;F;G
A;B;C;D;E;F;G
A;B;C;D;E;F;G
A;B;C;D;E;F;G
A;B;C;D;E;F;G
A;B;C;D;E;F;G
A;B;C;D;E;F;G

Is this error in my handlebars template or bug in handlebars parser/composer for .net?
https://stackoverflow.com/questions/48424658/last-element-in-nested-each-handlebars-c-sharp

In Handlebars.js,  @last is not set when iterating an object. As the documentation says: "When iterating over an object only the @first is available."
If the data is an array (or list), this works as expected.
var rowData = new [] {"A","B","C","D","E","F","G"};
var data = new
{
	header = new string[] { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" },
	rows = Enumerable.Repeat(rowData, 7)
}

Maybe @last should be explicitly unset somehow, instead of having the parent value? So that it was always false? But that wouldn't solve the authors problem anyway.

Bug is located in Iterate method: https://github.com/rexm/Handlebars.Net/blob/a37a08b28469feec565304e27dabac64c554ff51/source/Handlebars/Compiler/Translation/Expression/IteratorBinder.cs#L239
I'd try to find some time and create a PR.


Selection1D and RangeXY callback support in plotly backend

Overview
This PR adds support the Selection1D and RangeXY streams in the plotly backend. Comments welcome, and this is obviously intended for consideration after the feature freeze 🙂
I believe that it is working well, though I've only tested it manually on Points elements so far.
Implementation
This implementation approach differs a bit from the Bokeh backend approach because plotly.py doesn't really have a notion of attaching a JavaScript callback to a plotly.js element.  Instead, the trace UID's are used to provide a mapping between traces and comms, and the renderer is responsible for producing all of the necessary callbacks to handle the active streams.
Examples
Selection1D
Here is an example of displaying a red point at the mean of the selected points
import numpy as np
import holoviews as hv
from holoviews.streams import Stream, Selection1D, RangeXY
import param
hv.extension('plotly')

data = np.random.multivariate_normal((0, 0), [[1, 0.1], [0.1, 1]], (100,))
points = hv.Points(data).options(color='gray')

sel = Selection1D(source=points)
rangexy = RangeXY(source=points)

def mean_point(index):
    if index:
        means = data[index, :].mean(axis=0)
        pts1 = hv.Points([means]).options(size=12, color='red')
    else:
        pts1 = hv.Points([])

    return pts1

mean_sel = hv.DynamicMap(mean_point, kdims=[], streams=[sel])
points*mean_sel

RangeXY
And here's an example of displaying a blue dot at the mean of all of the points in the RangeXY viewport.
import numpy as np
import holoviews as hv
from holoviews.streams import Stream, Selection1D, RangeXY
import param
hv.extension('plotly')

data = np.random.multivariate_normal((0, 0), [[1, 0.1], [0.1, 1]], (100,))
points = hv.Points(data).options(color='gray')

sel = Selection1D(source=points)
rangexy = RangeXY(source=points)

def mean_point(x_range, y_range):

    if x_range and y_range:
        inds = np.logical_and(np.logical_and(x_range[0] <= data[:, 0], data[:, 0] <= x_range[1]),
                              np.logical_and(y_range[0] <= data[:, 1], data[:, 1] <= y_range[1]))
        x_mean = np.mean(data[inds, 0])
        y_mean = np.mean(data[inds, 1])

        print(x_mean, y_mean)
        pts2 = hv.Points([[x_mean, y_mean]]).options(size=12, color='blue')
    else:
        pts2 = hv.Points([])

    return pts2

mean_rangexy = hv.DynamicMap(mean_point, kdims=[], streams=[rangexy])
points*mean_rangexy

Both Selection1D and RangeXY
Now with both streams active in the same overlay element
import numpy as np
import holoviews as hv
from holoviews.streams import Stream, Selection1D, RangeXY
import param
hv.extension('plotly')

data = np.random.multivariate_normal((0, 0), [[1, 0.1], [0.1, 1]], (100,))
points = hv.Points(data).options(color='gray')

sel = Selection1D(source=points)
rangexy = RangeXY(source=points)

def mean_point(index, x_range, y_range):
    if index:
        means = data[index, :].mean(axis=0)
        pts1 = hv.Points([means]).options(size=12, color='red')
    else:
        pts1 = hv.Points([])

    if x_range and y_range:
        inds = np.logical_and(np.logical_and(x_range[0] <= data[:, 0], data[:, 0] <= x_range[1]),
                              np.logical_and(y_range[0] <= data[:, 1], data[:, 1] <= y_range[1]))
        x_mean = np.mean(data[inds, 0])
        y_mean = np.mean(data[inds, 1])

        print(x_mean, y_mean)
        pts2 = hv.Points([[x_mean, y_mean]]).options(size=12, color='blue')
    else:
        pts2 = hv.Points([])

    return pts1*pts2

mean_sel = hv.DynamicMap(mean_point, kdims=[], streams=[sel, rangexy])
points*mean_sel

And in a Layout (rather than Overlay) configuration
points+mean_sel

Testing
There isn't any yet, do you have any suggestions here?  I have't really dug into the bokeh testing code to know if there's an existing approach to testing interactive callbacks.

Cool!

Is this now sufficient to support Datashader-backed Plotly-rendered HoloViews plots?

@philippjfr, I'm going to try to pick this one up again.  I think I'll take a look at refactoring pyviz_comms.JS_CALLBACK to see how much of the JavaScript code can be taken from there.  Please let me know if you have any other thoughts/concerns on the general approach here.  Thanks!

We are currently debating how much of HoloViews we will end up rewriting on top of panel. This would basically give us comms for free by building on top of Plotly bokeh model. We'd just have to extend that model to allow attaching callbacks to the rendered bokeh plot. I'd be very happy to hear/discuss that plan with you though. It is perhaps at least a little bit weird to reimplement plotly on top of bokeh but getting free comms, the ability to deploy the plots on bokeh server, binary transfers of data arrays and a unified rendering and deployment architecture is a pretty strong draw.

Yeah, I can see how that approach would be appealing.  So HoloViews' own comms would go away then? (or be the same as panel's).  And I guess it might make sense then to use panel for widgets instead of the built-in HoloViews widgets.  I'll take a look at the implementation of the Plotly bokeh model (and yes, that is a bit of an odd sentence at this point :slightly_smiling_face:).  Are there any simple reference examples of models that support callbacks?

Are there any simple reference examples of models that support callbacks?

There are, have a look at the panel/models/vtk.ts and the way it syncs camera state. I also just had a look at the plotly.py's BaseFigureWidget, a lot of code could basically be reused in an equivalent bokeh model. There are definitely issues with that though, apart from being somewhat crazy, so a more minimal approach may be better.

@jonmmease I assume this will all be superceded by the panel based code?

Yes, I'll close this out.  The new one should be ready soon!


add a set_policy function to albatross

/cc @PizieDust we need this to set the policies, since we need to adjust our local cache, and then issue any command with the new policy

@hannesm Thank you. merging now.


Icons for Sensors

Can we have an option to upload icons and assign icons to sensors. Adding icons help in quickly identifying the sensor.

@sureshmali Thank you for the request!
0.0.2-alpha5 has big changes in GUI as well as in back-end. Lets see icon is really needed after 0.0.2-alpha5 release

Great, thanks. Eagerly waiting for next release.


Unclear instructions on how to use the extension

How is this extension supposed to work? It is not clear from the description.
If I disable Test Explorer UI, its language specific extensions (e.g. Python Test Explorer for Visual Studio Code) get disabled automatically and then the test tab disappears.
How can I use this extension to have for example the test tab for python tests?

You can use it by toggling the setting testExplorer.useNativeTesting on!

Thanks I managed to get it working. I am still confused by the instructions

This is an extension that converts from the Test Explorer UI API into native VS Code testing. When using this, you will likely want to disable the test explorer UI components

Basically with this extension installed, I still need to have the Test Explorer UI extension installed but I do not need to install the language specific test adapters?

The Test Explorer UI components are now disabled automatically. I'll update the readme.


Support node name != hostname

When a new node appears in the cluster, https://github.com/equinix/cloud-provider-equinix-metal/blob/7e3189de8abd08dcae35cf052b45326c29f79b7b/metal/devices.go#L212 right now (only) does a match of the hostname, and checks if it finds something in Equinix Metal, then maps it to that node.
Node names are not necessarily equal to the hostname configured in Equinix Metal.
For example, I want to use k3s with the --with-node-id parameter, which appends a (random) id to the node name on registration. This causes the node to be not recognized by Equinix Metal CCM at all.
Instead of doing a simple hostname match, it should probably look at some of the data the node reports on itself (external IP maybe?) to do the matching.

What errors are created by the CCM? Just wondering if it's something similar to #193 ?

Reading through the code, it simply returns cloudprovider.InstanceNotFound, and doesn't consider it an EQXM node - which causes other problems further down the line, of course.

It is called in 4 places, all of which are part of the cloud provider API, passing it the node name, and expecting it to find information about the node, where the node name should be sufficient to find it.
Are you proposing that the node name still is sufficient to find the unique cloud provider device, but instead of a name-to-hostname match, it uses the node name to get the node object from k8s, then uses info on the k8s node object to discover the actual device?
I am not 100% certain that the node is a full k8s object when some of these are called, although AWS's cloud provider here does just what you suggested, while GCP here does make the node name = cloud provider name.
The above does assume that provider ID is populated correctly in the first place, which I cannot recall. If it depends on nodename-to-provider-ID, then we will have a catch-22. If the providerID is populated independently of the name (how?) then it could work.
I am hoping @detiber or @displague might know how the initial provider ID is populated, which call in the cloud provider gets it?

In my case, I invoke the k3s installation setting INSTALL_K3S_EXEC="--node-ip $private_ipv4 --node-external-ip $public_ipv4 --with-node-id" - these values come from a call to the metadata server.
If these two ips are already present in the Node object when the EQXM CCM gets to see it, yes, looking up the Node object by the name passed in, and in case there's not a clear hostname match, trying to match on the IPs should work.
Personally, I'd even think a matching nodes' external ip is a way stronger marker than just a matching hostname ;-)

Personally, I'd even think a matching nodes' external ip is a way stronger marker than just a matching hostname ;-)

I wouldn't disagree. But the cloud provider interface in lots of places does "by node name", which seems to assume that node names match. Then again, as I linked to above, that isn't true across all providers; some assume node name match, others use it to get the k8s node object, and then use the provider ID in there to get the node.
If we can be confident that provider-ID is populated correctly, I am comfortable changing this to use the above-described algorithm: node name -> node object -> provider ID -> EQXM device. Awaiting @detiber or @displague commenting.

Digging a little deeper, when the AWS cloud-provider tries to look up the instance ID by node name, if it fails (e.g. it doesn't have providerID set yet), it actually calls this function, which treats the node name as the private DNS name rather than the hostname.
Either way, as far as I can tell, k8s cloud provider throughout requires that there has to be some inherent mapping between k8s node name and cloud-provider name. That is the lowest level of mapping.

btw, @flokli what is your Kubernetes workspace Slack ID?

I'm flokli in eqix-metal-community.slack.com ;-)

Node name limitations based on the cloud-provider interface seems to be the gift that just keeps on giving 😂.
I'm a huge +1 on removing any matching based on name wherever possible, however as @deitch has already mentioned, it'll be difficult to do in the case where the providerID has not yet been populated (since we are responsible for populating it) and there is some baked in expectations to the cloud provider interface that the node name will match some attribute within the cloud provider's api.

For AWS, this is the private dns name as @deitch mentioned
For OpenStack, it's the instance "name"
And we've used the "hostname" attribute

Unfortunately, I think this is one place where the out-of-tree cloud providers are at a disadvantage. In the old/in-tree model, the kubelet could interrogate the cloud provider API and choose a different node name and set the providerID prior to creating it's own Node resource. In that model, we'd be able to query the metadata service or leverage local cloud-init provided data to "do the right thing".
In the out-of-tree model, the kubelet creates the Node resource prior to the "cloud provider" being involved, falling back to local Node naming semantics by default (I believe it first attempts to use a DNS lookup of the IP associated with the default route, falling back to a simple hostname lookup) and applying a taint to the Node. It is then up to the out-of-tree cloud-provider implementation to set the providerID (and any other additional info), and remove the taint.
I haven't been following much of the upstream discourse around the migration of in-tree providers to out-of-tree, but I suspect that this is also going to be a frustration that is faced by the other providers as their out-of-tree implementations are adopted as well.

So however you play it, node name is the linchpin around which the cloud provider is expected to identify the node. It would be great if there were a way to override that - e.g. if, when launching kubelet, I could tell it, "here is the provider ID you should use", or at least some identifier that would get passed to the CCM - but I don't think that exists?
I sort of thought --hostname-override might do it, but then we are forcing the user to use the cloud provider (EQXM) designated hostname instead of their desired one, which brought us here in the first place.
@flokli is there any reason why you cannot do both?

when creating the EQXM device, set the desired hostname
when launching the kubelet, pass it --hostname-override=<that desired hostname>

I don't think the above would work with the k3s --with-node-id option, as you do not know the nodename until it runs.
In the end, there has to be some common identifier between the cloud provider device and the k8s node.

So, it is possible to specify the provider-id directly to the kubelet (through the --provider-id command line argument). We actually do this in the tinkerbell provider for cluster-api (https://github.com/tinkerbell/cluster-api-provider-tink) to work around the lack of cloud-provider implementation that we currently have.
I'm not sure how setting that field would impact deployments where cloud-provider=remote is configured, though.

@deitch I still think there should be a distinction between a nodes network hostname (provided by EQXM), and how that node registers itself to k8s - The CCM not being able to find nodes that have a different k8s node name is what this bug is about.
The k3s --with-node-id is one way to ensure nodes have unique names. Without it, there's all kinds of issues of new nodes suddenly "coming back" with an old, previously used node name. Think of (local) persistent volumes still with nodeAffinity to that  node name, but which never were created on that box, rook-ceph crush map node entries, …
@detiber so, to make sure I understand that correctly, I could manually set the provider id, by passing the --provider-id to kubelet, with a value like equinixmetal://$uuid-from-metadata-server?
How would the rest of the CCM behave? Would all the labelling still work? Or are there more calls to the API looking up a node with it's node name as hostname (what you referred to with "I'm a huge +1 on removing any matching based on name wherever possible")?
I could imagine setting the provider id manually, and only using the CCM to provide the rest of the information, assuming it would work that way.
Stretching this a bit further…
Let's say we removed all name-based lookups (to use the provider id when populated), except when initially determining the provider id - which facts does the "fresh" Node resource already have populated that could help us find a corresponding EQXM instance, (as a fallback, if there's no strict hostname match)?
On a cluster without the CCM deployed, I see the status.addresses list filled (unfortunately only the private IP). Maybe we could do a prefix match, in case the private IP matches.
If we are a bit creative and not too late for that, some CNIs also label nodes with public addresses before the node.cloudprovider.kubernetes.io/uninitialized taint is removed (like flannel.alpha.coreos.com/public-ip for example)

I'm moderately fine with having a distinct k8s node name from EQXM (and network) hostname. As above, no one else does it - aws is closest, but it just use the private FQDN instead of just the hostname - but everyone else is using the hostname or some variant.
We cannot get rid of the lookups by node name; the entire cloud-provider api to ccm is built around it. We can use that to get some info from k8s, and then use that info to get the device, as you suggested.
My concerns are:

How do we initially get it populated? We need a process that works for everyone (default case), without burdening them to have to lookup and set the provider id on startup. The most common use case must work.
How do we link it? Using --provider-id works, but is less than optimal. Even the slightest error would break things. I would sooner see us do something like setting a tag on the EQXM device, or something else, but that would have the same issue you described above. Perhaps an annotation on the node? We can do that on kubelet startup, can we not @detiber ? Or is just using --provider-id, and telling users, "you break it, you own it", better?

Either way, whatever we do for the second issue must work with the first.

How do we initially get it populated? We need a process that works for everyone (default case), without burdening them to have to lookup and set the provider id on startup. The most common use case must work.
How do we link it? […]

The way I understand this is that the provider id is allocated once, either provided by the node (via --provider-id arg), or done by the EQXM CCM (if the provider id isn't already set).
We can keep the node name == hostname assumption when doing that lookup.
Maybe be a bit more forgiving, and also bind if there's some prefix match with a machine in EQXM whose ip address also matches.
But the rest of the code implementing the cloud-provider api (everything except the lookup) should always look at the Node object, and the provider id in there - not treat the Node object as a hostname.

The way I understand this is that the provider id is allocated once, either provided by the node (via --provider-id arg), or done by the EQXM CCM (if the provider id isn't already set).

Correct.

We can keep the node name == hostname assumption when doing that lookup.

I would like to get more power out of this, and @detiber started an interesting conversation with the maintainers on Slack, but that is a ways off. So for now, it has to stay that way.

But the rest of the code implementing the cloud-provider api (everything except the lookup) should always look at the Node object, and the provider id in there - not treat the Node object as a hostname

What does it buy us? If the match of node name and host name was true when provider ID was set, it will stay the same. What do we gain?

But the rest of the code implementing the cloud-provider api (everything except the lookup) should always look at the Node object, and the provider id in there - not treat the Node object as a hostname

What does it buy us? If the match of node name and host name was true when provider ID was set, it will stay the same. What do we gain?

Because the match could not have been true when the ProviderID was set via --provider-id.
Then the rest just breaks, cause it can't find the node name as an equinix metal hostname.

Oh, I think that makes sense. It narrows the area of question.
OK, let's go for this.

@deitch The original issue with Juju has been resolved. I'm able to have the kubelets to run with the IP addresses registered at the Metal side, so the controller can match them and the Equinix nodes.
The root cause was related to the fact that the internal subnets are being exposed through the API of Equinix are 10.X.X.X/25 while the node is being assigned with the address of 10.x.x.x/31. The code of Juju wasn't smart enough to realize the address' subnet on the node is a subset of the provider's subset hence was filtering it out.
We made a change of the code that is performing this comparison, now it explicitly checks if the address is in the subset of the provider's subnet and it all works.

Good to hear. I think we still should follow your recommendations, though. Good practice.

I believe the initial issue reported here was addressed by #185
https://github.com/equinix/cloud-provider-equinix-metal/blob/b5695ddaebffa3a5b12f4a61461b6325a51a4423/metal/devices.go#L58-L60
The provider id is the source of truth, falling back to other means.

I can't validate this anymore, as I don't have machines running in EQXM with that setup anymore.
Let's close this, if someone realizes this is still an issue it can be reopened.


Fix missing sync of timer ENABLE bit

Summary
I stumbled across some unexpected behaviour when changing the period of a TC-based PWM. When changing the PWM frequency in a loop, only every other change of the frequency was accepted. After some digging, I found that the setting and clearing of the ENABLE bit of the peripheral was not synchronized in many cases.
Adding the synchronization fixes the issue, at least on my hardware (ATSAMD51P20A). I inserted the sync to all places where the peripherals get enabled or disabled, for both D5x and D11 chips. Hope, I haven't overlooked something.
It would be nice, if someone could test it on the D11/D21 platforms, since I haven't done that.

Okay, seems like the D11 tests fail. Should have checked that before

Okay, I didn't expect the synchronization to work slightly different on D11 and D21 for TC peripherals. TCC work as for D5x chips...
I don't think, though, that I introduced the remaining errors with my changes 😅

Thanks, do you have an example to test this out on D11/D21 platforms?
Also, could you make the syncing a method? Would make it just a little easier to read. :)

Thanks, do you have an example to test this out on D11/D21 platforms?

I came up with the following example for an ItsyBitsy M0 Express. It lets the red LED blink between max and half power using different frequencies. But to be honest: The D21 does not seem to care about this patch. It works no matter using the current crates-io version or my patched one, if I didn't mess anything up...
#![no_std]
#![no_main]

use panic_reset as _;

use cortex_m_rt::entry;
use hal::{
    clock::GenericClockController,
    delay::Delay,
    ehal::delay::DelayNs,
    fugit::RateExtU32 as _,
    gpio,
    pac::{CorePeripherals, Peripherals},
    prelude::_embedded_hal_Pwm,
    pwm,
};

#[entry]
fn main() -> ! {
    let mut peripherals = Peripherals::take().unwrap();
    let core = CorePeripherals::take().unwrap();

    let mut clocks = GenericClockController::with_internal_32kosc(
        peripherals.gclk,
        &mut peripherals.pm,
        &mut peripherals.sysctrl,
        &mut peripherals.nvmctrl,
    );
    let mut delay = Delay::new(core.SYST, &mut clocks);
    let pins = gpio::Pins::new(peripherals.port);

    let _pin: gpio::Pin<_, gpio::AlternateF> = pins.pa17.into();

    let gclk0 = clocks.gclk0();
    let mut pwm = pwm::Pwm0::new(
        &clocks.tcc0_tcc1(&gclk0).unwrap(),
        1_000.Hz(),
        peripherals.tcc0,
        &mut peripherals.pm,
    );
    let channel = pwm::Channel::_3;

    loop {
        for i in 2..6 {
            pwm.set_period(i.kHz());
            let max = pwm.get_max_duty();
            pwm.set_duty(channel, max);
            delay.delay_ms(500);

            pwm.set_period(500.Hz());
            let max = pwm.get_max_duty();
            pwm.set_duty(channel, max / 4);
            delay.delay_ms(500);
        }
    }
}

Also, could you make the syncing a method? Would make it just a little easier to read. :)

I definetly see why you would like to put the syncing into a method. However, there are also other registers that need syncing, which are also not inside a separate method. That would make it a bit inconsitent, wouldn't it?

Right, after reading the module's code, I didn't expect to see so much syncing all across the implementation. Ideally all of these little tasks would be broken into their own methods (ie, enable() -> set ENABLE bit, then wait for syncing, and so on). I get what you're saying as far as consistency.

At the moment, to be honest, I would prefer if you could merge it as is. Maybe creating an issue for refactoring would be an option, so that it doesn't get lost?

No worries. It's really not a big deal, just something we'll want to consider if that module eventually gets refactored.


[Wave 5 - Remove Free Workspace Creation] Update Notifications in OldDot

Coming from the design doc section here (further instructions in the doc)

Update the message that is posted in this #admins room that comes from the guide
Update the params for Notification_Share_CreateInvitedAccountSharePolicy to include different from and replyTo values
Update Concierge messages

Upwork Automation - Do Not Edit

Upwork Job URL: https://www.upwork.com/jobs/~01cefb307b6a228c34
Upwork Job ID:<PHONE_NUMBER>917881344
Last Price Increase: 2024-02-23

I'll grab this for tomorrow 😁

@tgolen, should we also update _libfop.php SInviteUsers() to no longer send notifications from newDot or is that covered in a different issue?

Yeah. I did a small update to the design doc (I think yesterday) to include that. I would use the design doc as the source of truth for what to do. I didn't want to copy everything from the design doc into this issue, so the issue description was only meant to be an overview of what needs to happen. Let me know if you have more questions after reading the design doc. I see you in there now.

Yeah. I did a small update to the design doc (I think yesterday) to include that. I would use the design doc as the source of truth for what to do. I didn't want to copy everything from the design doc into this issue, so the issue description was only meant to be an overview of what needs to happen. Let me know if you have more questions after reading the design doc. I see you in there now.

All good! Thanks!

This is done and deployed


Travis CI: Run on Node.JS 12

Node.JS 12 is current LTS release.
Related-to: HARP-7844

Codecov Report

Merging #1097 into master will not change coverage.
The diff coverage is n/a.

@@           Coverage Diff           @@
##           master    #1097   +/-   ##
=======================================
  Coverage   46.13%   46.13%
=======================================
  Files         238      238
  Lines       22279    22279
  Branches     5013     5013
=======================================
  Hits        10278    10278
  Misses      12001    12001

Continue to review full report at Codecov.

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


Add translations for MetaDeploy

This adds a top-level metadeploy folder with the translations for NPSP's MetaDeploy installation plans, from the Localization team. These will be updated in MetaDeploy when the installer for the next release is published.
Critical Changes
Changes
Issues Closed
Community Ideas Delivered
New Metadata
Deleted Metadata

@davisagli Pretty cool. Does MetaDeploy use the language of the machine/browser to determine which language to display?

@force2b yeah, it tries to use the preferred language based on the Accept-Language HTTP request header sent by the browser.

Is it testable now, or does it need to merge and then wait for the next MetaDeploy release to be available?

@force2b the translations will be added to MetaDeploy's database the next time the installers are published after this is merged.

Thanks @davisagli. Approved.


[HOLD #399936] Unable to delete newly created workspace in new account

If you haven’t already, check out our contributing guidelines for onboarding and email<EMAIL_ADDRESS>to request to join our Slack channel!

Version Number: 1.4.68-0
Reproducible in staging?: Yes
Reproducible in production?: Yes
If this was caught during regression testing, add the test name, ID and link from TestRail:
Email or phone of affected tester (no customers):
Logs: https://stackoverflow.com/c/expensify/questions/4856
Expensify/Expensify Issue URL:
Issue reported by: @Puneet-here
Slack conversation: https://expensify.slack.com/archives/C049HHMV9SM/p1714499352473189
Action Performed:

Created a new account in staging.new.expensify.com
Create a new workspace
Select the created workspace
Click three dot menu and delete the workspace

Expected Result:
Workspace deleted
Actual Result:
Unable to delete workspace and "Looks like you're on an annual subscription. Please downgrade your account from your account settings before trying again" error
Workaround:
Unknown
Platforms:

Which of our officially supported platforms is this issue occurring on?

[ ] Android: Native
[ ] Android: mWeb Chrome
[ ] iOS: Native
[ ] iOS: mWeb Safari
[X] MacOS: Chrome / Safari
[X] MacOS: Desktop

Screenshots/Videos

https://github.com/Expensify/App/assets/38435837/729b33b0-6485-4708-a5b6-100dde9f2e54
Add any screenshot/video evidence

View all open jobs on GitHub
Upwork Automation - Do Not Edit

Upwork Job URL: https://www.upwork.com/jobs/~01fc08a6832d88aa3c
Upwork Job ID:<PHONE_NUMBER>359610880
Last Price Increase: 2024-05-22

Issue OwnerCurrent Issue Owner: @carlosmiceli

I ran into this myself today.

I was able to delete the same workspace on OldDot, but not NewDot.
I checked I was still in the 7-day free trial window

Logs are here (internal only, sorry).
Throw ExpException - a8948deec2009297362f103209a7a026 ~~ message: '401 Can't delete last policy under a yearly subscription' exceptionMessage: 'Auth DeletePolicy returned an error' exceptionFile: '/git/releases/expensify.com/64247c4/lib/Auth.php' exceptionLine: '125' exceptionCode: '401'

I'm hitting this block when I don't think I should be: https://github.com/Expensify/Auth/blob/01554c45bd48e4cae90b02a23e96f943cb90698c/auth/lib/Policy.cpp#L2755-L2761
So I think somehow NewDot isn't recognising that the workspace I'm trying to delete is on a free trial and it's throwing this error.

Sending external for more eyes.

Looks like a backend issue, i'll try to reproduce and confirm.

@getusha did we confirm?

I am unable to reproduce, @m-natarajan is there a prerequisite for the account?
https://github.com/Expensify/App/assets/75031127/d2a9efad-5f9b-4fb2-bbe4-71433a72a2c7

bump @m-natarajan

@dylanexpensify This is still reproducible on our side. Applause Automation team reported seeing this issue ~2 hours ago

ah interesting, @MitchExpensify a collect workspace on a free trial be able to delete, right? Asking given your work with free trials

Yep, and the bug is on NewDot only weirdly.

a collect workspace on a free trial be able to delete, right?

Correct

I think it's better to make this internal. @dylanexpensify

Moving internal.

Internal, not overdue

Still waiting

same

Commenting to follow and see if I can pick this one up soon.

@carlosmiceli let us know!

waiting to confirm if Carlos can pick up

Not yet, still have some stuff on my plate, but will continue to follow to see i i can pick up early next week.

Feel free to unassign me and add hot-pick if it makes sense!

Ok, should be able to get started tomorrow 💪

Nice! Let's get it @carlosmiceli!

@dylanexpensify @trjExpensify starting to work on this and get familiar with the code... Just so I understand, what's the expected behavior here? If the user is within the free trial he should be able to delete that last workspace, but not if trial is over? Or are there other subtleties to keep in mind? Because if it's simply the free trial check, I can add that here so it makes the exception during the free trial.

@carlosmiceli the conditions for when you're able to delete a workspace should already exist in the code somewhere for a complete reference, as this is an action you can take on OldDot. It seems like the bug is on NewDot only when I ran into this: https://github.com/Expensify/App/issues/41357#issuecomment-2088612639

@trjExpensify Good point, but is it a BE issue then? If it's strictly FE, shouldn't this be External? I can still try to fix, but just to clarify.

First quick finding is that we are using different methods: PolicyAPI::delete in OD and PolicyAPI::deleteWorkspace in ND.

@trjExpensify Good point, but is it a BE issue then? If it's strictly FE, shouldn't this be External? I can still try to fix, but just to clarify.

I don't think so necessarily, it's just a bug that seems to only be happening on NewDot. Sounds like it's the diff you found here:
PolicyAPI::delete in OD and PolicyAPI::deleteWorkspace in ND.

@carlosmiceli nice work getting PR up! Mind giving an ETA on merge?

@dylanexpensify My fix was actually not a good enough fix, there's more work to be done than I realized at first. I've been working on it but there's some things I still haven't figured out (asking for help here), so not sure ETA yet 🙏

cc @dylanexpensify fyi, this is looking quite more complex, will keep you posted as I understand the best way to proceed: https://expensify.slack.com/archives/C03TQ48KC/p1719335935006529

Hey @dylanexpensify it seems like this issue will have to be put on hold because it depends on missing functionality that's supposedly being built (I'll ask and confirm). Conversation: https://expensify.slack.com/archives/C03TQ48KC/p1719335935006529

Sounds good, thanks Carlos!

I don't think there'll be an update for a while because it depends on this to be complete before we can properly know if it's a bug, a missing feature, or what exactly: https://github.com/Expensify/Expensify/issues/368528

We merged the PR today to rollout the new subscription page btw.

Subscription page hit prod yesterday, so taking the hold off. 👍

Nice! @carlosmiceli mind giving us an idea of when you'll be able to prioritize this?

Prioritizing the work for the Aug 1 deadline and some 1:1:1 refactoring these days, but I imagine  that this would come right after that! 🙏

Hopefully can start late this week or early next week.

We looking likely to kickstart this one this week, Carlos?

Nice nice, sounds good! Thanks for the update :)
On Mon, Aug 5, 2024 at 3:27 PM Carlos Miceli @.***>
wrote:

Correct, that's the aspiration! Still need to wrap up some higher priority
issues but if nothing major breaks down, I'm hoping to get this one started.
—
Reply to this email directly, view it on GitHub
https://github.com/Expensify/App/issues/41357#issuecomment-2269212992,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/AOKVCAEEE2EHFZVRJIWDNDLZP6DUTAVCNFSM6AAAAABHA6B7BWVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDENRZGIYTEOJZGI
.
You are receiving this because you were mentioned.Message ID:
@.***>

@carlosmiceli how we looking here my man?

If things go really well, maybe I can start at the end of the week, but otherwise the second phase of the new homepage and some bugs we found in phase one are still priority... Sorry about that, obviously fine if someone with more bandwidth wants to take over in the meantime! If not this is my first thing after homepage is done. 🙏

Getting started with this!

Will need to pause to deal with some fixes for the homepage. Will pick up again as soon as I'm done with those if no one grabbed it.

Sounds good, we're hoping this will be done by EOW though for onshore goal. cc @garrettmknight

Yeah, I actually checked with him first because I wasn't sure what I should prioritize and he suggested what I said above. I'm gonna work on Saturday too anyway so hoping I still get to it (what else am I gonna do in the airport for a trillion hours?).

Still trying to get to it this week, as soon as the homepage bugs/improvements are done.

Getting started now!

This is looking like it's going to go back on HOLD until this project is complete (which would most likely take care of the issue in the process). Will confirm soon, here's the ongoing conversation for context.

Commented in the thread, but I agree that this issue should be held on the completion of the downgrades project... I also think it'd be great if @carlosmiceli led the detailed section of that project. 🙂

Cool, sounds good. Let's stick a hold in the title and move it to be tracked with that downgrades project.

@trjExpensify Is that the right way to put the hold to the tracking issue?

@garrettmknight let me talk it out with Tim during my mentor session today and report back to see if it'd be a good idea, I ended up needing some help to craft the design doc for the landing page and that was a simpler project with a less urgent deadline, so I want to see what he thinks 🙏

I'm not so sure that the downgrade project will be very complex. Give the pre-design a look, but I think it's mostly FE work + updating the downgrade command to be 1:1:1.

@trjExpensify Is that the right way to put the hold to the tracking issue?

Yep, that does it! We can then downgrade this issue to weekly to check in on it until unblocked. Also, @garrettmknight @dylanexpensify prolly going to want to move this to #wave-control. I've put it in the project, but feel free to move it where it needs to be.

@garrettmknight Ok, I'm in! Read a bit yesterday, talked it out with @tgolen, and if we can talk it out a bit, I'm hoping I can rise to the challenge :)
Just need to make sure I wrap up the homepage project nicely. Will DM you to discuss further.

Pending Carlos to dig in!

To make sure we're on the same page, @dylanexpensify , this issue is now pending on this project.

We've decided that this issue (reunification of Downgrading User to Free account) will not be in the scope for the Workspace Downgrades project (explanation). It will be tackled in a separate follow-up project instead.
I'll move this to Monthly for now, and we can review each month if there's a project in the works to cover this, or if we should prioritize it and start one that month. cc @trjExpensify @dylanexpensify

I'm confused what we're talking about, really. I think on OldDot we just look for whether you've paid us or not yet when you delete a workspace. If you haven't, we just let you delete the workspace without error. On NewDot, which I'm assuming is a different command, that hasn't been accommodated.

From the OP, it looks like there was no way to change the subscription when this bug was created. Now that we have subscriptions in app, I don't think that's the case. In my video above, it shows that you can change subscriptions and delete the workspace... So I think this is 'solved' even if it's not super smooth or perfect.

There's a workaround in NewDot now yeah, but it's not the expected result really. That being, when you click Delete workspace and you haven't subscribed to anything yet/paid, we just delete your workspace instead of throwing an error.

Yeah, I agree with a workaround existing. @trjExpensify @carlosmiceli @garrettmknight are we good to move forward with getting this done instead of closing it, yeah?

I think Carlos is prioritising DowngradeToTeam first.

Reassigning as I head to parental leave next week! Thanks Al!

Weekly Update: Noted! I'll keep an eye out.

Weekly Update: On hold for internal 399936

Weekly Update: On hold

Weekly Update: 399936 is moving along but no update yet

Moving this to #convert, per here.

I asked a question in the Slack 🧵 to confirm the Hot Pick status.

Just unassigned myself @alexpensify, if it's still happening when I'm done with a few issues I can take it back, but hopefully someone will fix it sooner :)

I'll call it out for hot picks this week!

Weekly Update: Hot Pick

I'll take this.

Sorry for unassigning, the github assignee dropdown played some weird tricks on me.

Allowing the policy to be deleted if it's during the free trial is pretty easy. But should there be any additional criteria?
What should happen to the subscription afterwards (it's automatically set to yearly when on a free trial), should it be cancelled or stay as is? Are there any edge cases that we should think about here?

@mjasikowski hello sir, can you confirm that your fix would solve this issue?

@carlosmiceli Can't confirm yet. I'll let you know when I figure out the complete workflow.

@garrettmknight @carlosmiceli I made some changes to my draft PR. Let me know if the following solution works for you in principle:

When running the DeletePolicy command, auth.policy.validateCanDelete no longer will return an error when you are deleting the last paid policy while on the yearly plan, but only if the following conditions are met:

remaining policy has no items that should be billed (shouldBillLastPolicy)
the allowDowngrade function param is set to true (defaults to false, but will be true just for the DeletePolicy command)
account has no purchases (Account::canDowngrade(db, accountID))

If the above conditions are met, subscription type will be downgraded from yearly to monthly, and the policy will be deleted

There's no condition for free trials here, because free trial is triggered only if a billable action was made in a policy.
If you agree with the above process, I'll submit the PR to review.

Pulled into slack for some thoughts.

@mjasikowski—I'm back from Holiday and catching up. I reviewed the Slack conversation, and it looks like we are all set to continue here. Is there any update on when the PR will be ready? Thanks!

@alexpensify the PR is already merged!

Whoops, sorry I missed it. Can you share the PR link here? I don't see one associated with this GH. Thanks!

Sure thing, it's https://github.com/Expensify/Auth/pull/13280

@mjasikowski - since the PR was merged, can we close this one or are we waiting for another update? Thanks!

@alexpensify let's close it!


added example testing

I drafted this example of using XCTest with hummingbird app

Hi, you're right a testing example would be useful.
I'm planning to write a template project for a hummingbird project. It'd be great once that is up if you could follow that template. I'll be changing all the other examples to follow it once it is up. It won't be far off what you've built here. A server executable and an app library.
One thing your example will need to make clear and provide for is the different test frameworks. embedded using the EmbeddedChannel doesn't run a server it just tests the routes and because it is using an EmbeddedChannel cannot interact with other threads or services. The live setup starts up a local server to do testing and can test everything. In most cases I imagine people would be using live because they will be interacting for other services eg databases, redis.

@adam-fowler sounds great. Please ping me when that template is ready. I'll make the other changes now. M

@mcritz https://github.com/hummingbird-project/template

Great! I can rewrite as much as needed to match the template.

@adam-fowler Looks like the template is accomplishing everything I set out to in this PR. Going to close.

@mcritz I think it is still worthwhile adding an example with a more complex setup. Maybe trying to get across the difference between using HBApplication(testing: .embedded) and HBApplication(testing: .live)


Update f-string errors, handle != in f-string.

This pull request addresses #1770.
It correctly handles != inside of f strings, as well as f"{!a}" not returning an EmptyExpression error.
This also adds an error for conversion flags not being followed by brace characters, which would otherwise be a token error, unlike the Python implementation.
It also changes the print out for UnopenedRbrace / UnclosedLbrace to correctly print braces instead of brackets.
I've also included tests for expected brace characters and not equals operations inside of braces, as well as the expected EmptyExpression errors for f"{!a}".

It looks like something weird happened with the second to last commit 4bebc19e5b1c2f87d5906bf05120cc7ec3680d7f, do you think you'd be able to try undoing and redoing the changes so that git doesn't rewrite the entire file?

I seem to have done something wrong - I'll open this pull request one more time.


update sigmaGV based on the update to FeynmanDiagram.jl

Codecov Report
Attention: 7 lines in your changes are missing coverage. Please review.

Comparison is base (78292e1) 34.02% compared to head (105f442) 33.99%.

:exclamation: Your organization needs to install the Codecov GitHub app to enable full functionality.
Additional details and impacted files
@@            Coverage Diff             @@
##           master      #28      +/-   ##
==========================================
- Coverage   34.02%   33.99%   -0.03%
==========================================
  Files          32       32
  Lines        2275     2277       +2
==========================================
  Hits          774      774
- Misses       1501     1503       +2

Files
Coverage Δ

src/sigma/sigma.jl
1.20% <ø> (ø)

src/sigma/sigmaGV.jl
0.00% <0.00%> (ø)

:umbrella: View full report in Codecov by Sentry.
:loudspeaker: Have feedback on the report? Share it here.


Create License.txt

Added license: https://github.com/christopherdro/react-native-calendar/issues/63

:) Thanks!


Quotes with headings on markdown not rendering properly

Type: Bug
Does this issue occur when all extensions are disabled?: Yes

VS Code Version: Code 1.85.1 (0ee08df0cf4527e40edc9aa28f4b5bd38bbff2b2, 2023-12-13T09:49:37.021Z)
OS version: Windows_NT x64 10.0.22621

Steps to Reproduce:

Open VS Code and make a .md file
Type "> #### Text"

The background box does not adjust to the font size of the headings
Expected result:

Actual result:

Can confirm
# h1
> # h1
## h2
> ## h2
### h3
> ### h3
#### h4
> #### h4
normal
> normal

Even in the markdown preview of the comments here the quotes with headings works good. The bug is in VS Code

Test

still seeing a problem here but instead it looks a little different from the previous result

@eleanorjboyd I think the issue was about the markdown preview. Take a look at the header size in the preview now compared to before


Fix table spacing and cursor

Added margin-right to filter icon
Added iui-actionable class for cursor: pointer
Formatting fixes

 Thank you for your submission! We really appreciate it. Like many open source projects, we ask that you sign our Contributor License Agreement before we can accept your contribution.You have signed the CLA already but the status is still pending? Let us recheck it.


Intergrate HastyStyles/HastyScribe into LiteStore

Use HastyScribe in LiteStore to render Markdown pages to HTML adding optional footer and sidebar (this simulates GitHub Wiki).
I couldn't find a way to use the HastyScribe as a library (I've just started using nim language) so I embedded the required code inside LiteStore repository as git sub-module and I removed not needed files.
Because of multithreaded nature of LiteStore I had to modify HastyScribe constructor and fields initiatlization procedure. The {.gcsafe.} was not accepted because of calls to procedures stored as field values. I changed the dynamic nature of the fields to static mapping to string values. It is a limitation but I didn't see other way of doing it.

Err woah.. ok, that's a lot of stuff rearranged. Will need to take a proper look.
HastyScribe should be useable as a library... I do in HastySite for example (ok, with the help of Nifty, but normal nimble dependency should work too!)

Yes, fully agree. I had some issues initially to install the HastyScribe as
nimble package. I think it was because of my lack of familiarity with the
tool. I tried it again now and it worked so I will rewrite my changes and
keep them minimal.
I saw that you embed the CSS in producer HTML. It makes sense for rendering
of standalone pages but for a server I think it is better to have the CSS
available for download. It may be also easier to replace the styles without
recompiling the application.
Piotr
On Mon, 29 Mar 2021, 22:15 Fabio Cevasco, @.***> wrote:

Err woah.. ok, that's a lot of stuff rearranged. Will need to take a
proper look.
HastyScribe should be useable as a library... I do in HastySite for
example (ok, with the help of Nifty, but normal nimble dependency should
work too!)
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub
https://github.com/h3rald/hastyscribe/pull/76#issuecomment-809681853,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/AK42NEJL6XWRWVBWPAVWEX3TGDUYZANCNFSM4Z7M3FCA
.

Indeed, by default HastyScribe creates a standalone document embedding all resources... however, there's a public library method called compileFragment that you can use to compile just a markdown document fragment!
...That's what I am using in HastySite, my static site generator.

Hmm, if you it and make a template of my desired html page myself then I
don't need to modify anything in HastyScribe. I think this may work well. I
will focus on changing the LiteStore only.
Thanks for the advice Fabio,
Piotr
On Tue, 30 Mar 2021, 13:55 Fabio Cevasco, @.***> wrote:

Indeed, by default HastyScribe creates a standalone document embedding all
resources... however, there's a public library method called
compileFragment
https://github.com/h3rald/hastyscribe/blob/8ac9afc750354133311c4020209f8c377187e073/src/hastyscribe.nim#L372
that you can use to compile just a markdown document fragment!
...That's what I am using
https://github.com/h3rald/hastysite/blob/f24b31790152ab5b9be87deeca9580086c22c0ca/hastysite.nim#L430
in HastySite https://hastysite.h3rald.com/, my static site generator.
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub
https://github.com/h3rald/hastyscribe/pull/76#issuecomment-810159895,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/AK42NEMHKO565D7YQYHL2GDTGG32NANCNFSM4Z7M3FCA
.


ref(scheduler): logs in scheduler does not appear to be used anymore

I can not spot where it is used. Potentially it got accidentally refactored out but can't see where that would be

Yeah I think this was refactored out in favor of deis/logger. Probably some tech preview cruft that was left over See https://github.com/deis/workflow/blob/master/rootfs/api/models/app.py#L463-L487 for how it's used now.
:+1: for more code removal


Add code for Fujitsu AR-REF1E

Added code for Fujitsu AR-REF1E and updated the climate configuration variables by adding it to a table.

Hi,
Have you had a chance to look at this?


Towards unified image builders

tl;dr
NixOS has many image builders that build an image file from a NixOS configuration, such as image.repart, system.build.isoImage, system.build.sdImage. Not only do these inconsistent interfaces create a bad UX (options being named differently but doing the same, etc.), they also make it hard to introduce new features for all of those builders due to duplication. With this, I propose to shift towards a unified image builder using systemd-repart. (i.e. the existing image.repart builder, with abstractions and default options that enable convenient builds of regularly built image types, such as the existing system.build.isoImage and system.build.sdImage). In addition to this proposition I'd like this issue to be a place for discussion on how such an interface should look like, ideally leading to an RFC.
The Status Quo
We currently have (at least) 3 different publicly exposed builders that will emit a NixOS image based on a NixOS configuration:

image.repart: Arguably, this is the state-of-the-art builder, as it's the most configurable one and allows for the easiest attribute-based customizations. It can build almost any sort of image and is especially well-suited for immutable appliance images. It currently lacks support for image pre- and post-processing, for example to insert a ISO9660 (El Torito) boot record for making CD-ROM images. Furthemore, it's the only builder supporting discoverable disk images (DDIs), which are the de-facto standard of systemd nowadays.
system.build.isoImage: The most popular builder for "desktop" installers and users that want an image that "just boots" and resembles closely what they are used to from other distributions. It did earn quite a lot of configurability over the years and has quite many options now. Uses an imperative script to build the actual image and lacks support for declarative partitioning, which is to be done after first boot in this scenario.
system.build.sdImage: Quite similar to the ISO image builder, this one, again, has a new build script. It's the most popular choice for building tiny images, e.g. for embedded devices, as it has support for minimizing the partition sizes at first boot and writes a special /boot/firmware directory with custom bootloader contents. It lacks configurability for the actual partitions though, as root is always ext4, and /boot/firmware is always VFAT.

Other than that, there also are private builders such as lib/make-disk-image.nix, which are used throughout nixpkgs, e.g. to build VM images. Most of them are very use-case specific, but also encode a lot of logic.
Why is this an Issue?
Maintaining multiple builders doing similar things is tedious, especially if their work can also be done by other builders. Furthermore, all builders have wildly different configuration interfaces, making it hard for users to find which knobs they need to turn to get what they want, and even finding the correct builder for the use-case in the first place can be a hassle. Furthermore, there are features which would be great to implement for all NixOS image builders, such as build-time execution of activation scripts, making image-based appliances more immutable by not requiring a writable root filesystem.
What is desirable?
Part of this should be discussed within this issue. Personally, I propose a unified interface for building images (e.g. build.image) that should cover all current use-cases. The builder should be based on the current image.repart, as it provides the most configurability, and declarative partitioning. It also blends in very well with other systemd components, such as systemd-cryptsetup. There should still be convenience targets (think a system.build.isoImage, but based on the unified builder interface), which should be compatible with the current builder interface. For continuous development of such a unified interface, a first step could port a basic builder, and then the exisiting builders (e.g. system.build.isoImage) could be ported from their existing build scripts to the unified builder, maintaining compatibility. This would be a huge step for both installation- as well as image-based NixOS, increasing nixpkgs-internal development velocity on these topics, many of which are very desirable for NixOS in enterprise use-cases.

Unifying 3+ interfaces that do the same thing sounds pretty uncontroversial, doubt it needs an rfc :) Thanks for raising this.

Unifying 3+ interfaces that do the same thing sounds pretty uncontroversial, doubt it needs an rfc :) Thanks for raising this.

Yes, I think this part is out of question.
The "RFC" part I was referring to rather meant a "discussion with an outcome" about how that new interface should look like

Other than that, there also are private builders such as lib/make-disk-image.nix, which are used throughout nixpkgs, e.g. to build VM images. Most of them are very use-case specific, but also encode a lot of logic.

I think more unification between disk-builders is a good idea as well. One thing that comes to mind, is that unless I am mistaken systemd-repart doesn't really support ZFS and such (yet)?
Ideally a generic solution would support that to be usable in vm tests and such, but for the same reason focusing on system.build.{isoImage,sdcard} first sounds good IMO.
(I added the significant label to give this more visibility. Please remove if its not appropriate here. I believe there's at least one older issue on this topic but wasn't able to find it)

is that unless I am mistaken systemd-repart doesn't really support ZFS and such (yet)?

Correct. I should've probably mentioned that in the initial post, but didn't think of it. repart does, however, support btrfs, which should be able to handle most ZFS use-cases too. It would also not be impossible to add a custom "post-processor" that populates a blank repart partition with a ZFS. I think it should be quite easy actually.
My implementation plan is to create the general new interface (i.e. build.image) first, then migrate existing builders one-by-one, with enough of a waiting period in between to catch potential hiccups.
Thanks for adding the label!

make-disk-image.nix seems to be in a little bit of rough shape. I'm running into flakiness due to its use of cptofs https://github.com/NixOS/nixpkgs/issues/345492
Given all uses of make-disk-image.nix inside of nixpkgs all use ext4 I'm curious if we can unify it with other stuff.
Idealy I'd switch to repart but I'd need some features added on top of repart:
Support grub in hybrid  mode (needed for cloud images) as they don't support UEFI boot often.
In general; unified support for "installing" a bootloader.
I wonder if the quickest way for this would be to write a tiny runInLinuxVM wrapper that calls NIXOS_INSTALL_BOOTLOADER=1 switch-to-configuration boot.
It's not ideal (we can probably install bootloaders without needing a VM) but we know it works.

No MBR/hybrid MBR support means we can't use repart generated images on older SBCs that do not support booting from GPT, like the Raspberry Pi 02w and 3B+, without additional post-processing. As far as I can tell it's on the TODO.

Hybrid support shouldn't be too hard I think? It's a matter of creating a grub partition
https://github.com/systemd/mkosi/blob/main/mkosi/__init__.py#L2993
And then we need to install grub in the final image (Could e.g. be done using a runInLinuxVM)

Hybrid support shouldn't be too hard I think? It's a matter of creating a grub partition
https://github.com/systemd/mkosi/blob/main/mkosi/__init__.py#L2993
And then we need to install grub in the MBR in the final image (Could e.g. be done using a runInLinuxVM)

Interesting, I may need to experiment with this. But isn't the resulting image still GPT? For the purposes of getting SBCs that can't boot from GPT to boot from GPT, just creating a hybrid MBR is easy enough with a configurable post-process stage IMO. From my understanding, if you mess with the partition table afterwards (resizing/adding partitions?), it can break in unexpected ways if not done correctly (so it can be brittle). Ideally we wouldn't need hybrid MBRs in the first place.

Yes this was the primary purpose it was developed for in the first place! If you pass it an image with --image that already has a GPT; it will just do purely additive operations. We could perhaps add an option to add a base image to the module?

This would be awesome to have and would probably solve my gripes with hardcoded u-boot offsets mentioned earlier.

Interesting, I may need to experiment with this. But isn't the resulting image still GPT?

It's specific to grub I think.   You put (part of) GRUB in the MBR;   that code the loads the rest of the GRUB bootloader from the GRUB partition.  And then the grub bootloader reads the kernels and initrds from the ESP
https://en.wikipedia.org/wiki/BIOS_boot_partition

@msanft If you're actually able to figure out El Torito, we wouldn't mind supporting that in repart itself (directly, no xorisso or similar tools allowed)


Test 802 sends unexpected token in header

I was testing out my micropub server and noticed that after I fixed and stopped handling multiple tokens (in header and body) from 805, 802 started failing.
Checking my server logs it seems like 802 is sending the token in the header even though it doesn't show up that way on the frontend.
I believe this is caused by:
https://github.com/aaronpk/micropub.rocks/blob/eeac57ad4b38e6a6cc0a31d6a4fe2bca2794f791/views/server-tests/802.php#L70-L85
Where line 85 should pass in true to skipauth like 801 does since we're sending in the access_token in the body for this test case.

I encountered this failure as well


Heroku demo is down?

I've been trying to go to https://realtimemarkdown.herokuapp.com/ and get an error message saying that the site owner should check their logs.  Is there another demo site anywhere?

I'll be moving this to AWS soon but this demo should work - https://node-markdown.herokuapp.com/

In the meantime would you update the README to point to this new URL?

For sure!


tokenizer training

Check before submitting issues

[X] Make sure to pull the latest code, as some issues and bugs have been fixed.
[X] I have read the Wiki and FAQ section AND searched for similar issues and did not find a similar problem or solution
[X] Third-party plugin issues - e.g., llama.cpp, LangChain, text-generation-webui, we recommend checking the corresponding project for solutions

Type of Issue
Model training and fine-tuning
Base Model
Chinese-LLaMA-2 (7B/13B)
Operating System
Linux
Describe your issue in detail
hey there ive been trying to use your code and reproduce the same for indian languages, but i havent been able to understand how to train the tokenizer, i genrally follow along the spm tokenizer training here. but i wasnt so sure about how to add special tokens etc to make the tokenizer compliant to the Lamma-2 tokenizer and similar to how you guys have trained the tokenizer.
i just dont want to end up being stuck in training the tokenizer in a wrong way.
could you please let me know on the detailed instructions on how you trained the tokenizer ?
Dependencies (must be provided for code-related issues)
No response
Execution logs or screenshots
No response

The Chinese tokenizer was trained with the sentencepiece in the standard way.
In our Chinese-LLaMA-Alpaca repo there is a script demonstrating how to merge the trained Chinese tokenizer with the original llama tokenizer
https://github.com/ymcui/Chinese-LLaMA-Alpaca/tree/main/scripts/merge_tokenizer


Open a specific folder in my Mac?

I would like to open a specific folder that already contains markdown files. Is this already possible?
Thanks for the great work!

You can open the settings directly and select the storage location.

Ah very cool! Great work on this @tw93, absolutely love it.

Welcome to recommend it to your friends. At the same time, you can set up a nice English font in it.

I actually love LXGW WenKai Lite, looks super sharp. 谢谢！

Haha, me too. I like this font very much, so I took it as the default font.

It's absolutely awesome. I don't expect you to add any of these features! But would love if this app also had:

vim bindings
some sort of automatic naming of new notes, zettlekasten style

Awsome work on this @tw93  :) Excited to see where you take it!

Thanks for your feedback. The vim will be put into the plan. For the second one, try the format option in the menu bar to see if it can meet your needs


Setup github workflow build and automatic push to nuget.

Setup github workflow build and automatic push to nuget.
Update README.md with license bade and CI build status
You need to add NUGET_TOKEN to repo secrets to have nuget builds being automatically pushed (skip if exists)
You need to update version to have new nuget release

Cheers!

Thanks, this looks good! Will look into merging when I'm home tonight.

Nice, after I'll submit PR to properly handle native libraries inside nuget package!


failed to retrieve local environment - STS 2.24.1

Before you start please confirm the following.

[X] Yes, I've searched similar issues on GitHub.
[X] Yes, I've checked whether this issue is covered in the Portainer documentation or knowledge base.

Problem Description
Docker Swarm 27.3.1 cluster (1 master, 4 workers). everything seems to be working but I keep getting the message: "failed to retrieve local environment"

Expected Behavior
I would like to understand where the error comes from.
Actual Behavior
as said before everything seems to work, but I still have this problem. also AppArmor is disabled
Steps to Reproduce
docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:2.24.1
Portainer logs or screenshots
No response
Portainer version
2.24.1
Portainer Edition
Business Edition (BE/EE) with 5NF / 3NF license
Platform and Version
Docker Swarm 27.3.1
OS and Architecture
Ubuntu 24.04 x64
Browser
No response
What command did you use to deploy Portainer?
2024/12/08 05:53PM WRN docker/local.go:79 > failed to clean up updater stack | error="failed to retrieve local environment: failed to find local environment" retry time=1

    at cleanUpGhostUpdaterStacks.ScanAndCleanUpGhostUpdaterContainers.func1 (local.go:21)

    at Retry (local.go:74)

    at cleanUpGhostUpdaterStacks (main.go:412)

    at goexit (asm_amd64.s:1700)

2024/12/08 05:54PM WRN docker/local.go:79 > failed to clean up updater stack | error="failed to retrieve local environment: failed to find local environment" retry time=2

    at cleanUpGhostUpdaterStacks.ScanAndCleanUpGhostUpdaterContainers.func1 (local.go:21)

    at Retry (local.go:74)

    at cleanUpGhostUpdaterStacks (main.go:412)

    at goexit (asm_amd64.s:1700)

2024/12/08 05:54PM WRN portainer/main.go:413 > unable to clean up ghost updater stack | error="failed to retrieve local environment: failed to find local environment"

    at cleanUpGhostUpdaterStacks.ScanAndCleanUpGhostUpdaterContainers.func1 (local.go:21)

    at Retry (local.go:74)

    at cleanUpGhostUpdaterStacks (main.go:412)

    at goexit (asm_amd64.s:1700)

Additional Information
No response

Hi @simonepittis So you are running Portainer within your Swarm? The command you have is our standalone deployment of Portainer. If you are wanting to run Portainer within your Swarm please see our documentation for this - https://docs.portainer.io/2.24/start/install-ce/server/swarm/linux


GetHits always returns 0 for string values

When getting the hits from an IFacetResult, it always returns 0 when the value is a string: results.GetFacet("creatorName").GetHits("Administrator").
Looking at the code, this is probably because it uses an object reference comparison:
https://github.com/callumbwhyte/examine-facets/blob/19015e114765f5b489d764a0f91ab32bf4e8b0c1/src/Examine.Facets/FacetResult.cs#L17-L19
I can confirm this, as results.GetFacet("creatorName").FirstOrDefault(v => v.Value == "Administrator") shows a compiler warning: Possible unintended reference comparison; to get a value comparison, cast the left hand side to type 'string' and doesn't return a match.
Using results.GetFacet("creatorName").FirstOrDefault(v => v.Value.Equals("Administrator")) will return the right facet value though.

Hey @ronaldbarendse!
Firstly, thanks for giving Examine Facets a whirl!
Great find with this issue. I will graciously accept a pull request with a fix, or look at this myself in the near future.
Cheers,
Callum

Hey @ronaldbarendse!
Thanks for fixing this, I've merged the PR and it will be released shortly in v1.1.0! H5YR!
Callum


Fix stylesheets_directory path

app/assets/stylesheets/ was the old path from v1.x
As of 2.0, the path where the Neat library lives is core/

This was causing the neat install command from Neat’s CLI to install a neat/ directory without any of the library files in it.

Good catch gatch

@whmii This might be worthy of a quick Beta 3 release.


527: Fixing wrong displayed payee name

Issue: https://github.com/secureapigateway/secureapigateway/issues/527
Description: Fixed the wrong displayed payee name for all Payment APIs. Also, removed the "payee name" field for the File Payment Consent since the consent response object doesn't have the creditorAccount field.

Please delete the debtorAccount from mocks, because this object is optional, and the accounts displayed in the RCS-ui comes from other object, doesn't make sense have this in the mocks.
The same for remittanceInformation.

Removed debtorAccount & remittanceInformation from payment consent mocks.