VMs: More tweaks, matching IPs, Auth checks

Verification steps for istio-auth-node-agent
Minor clarification on the main machineSetup script
Using host instead of dig as the output is simpler/straightforward

Jenkins job istio.github.io/presubmit passed

Jenkins job istio.github.io/presubmit passed

Jenkins job istio.github.io/presubmit passed

/lgtm
/approve

@wattli in this repo, one needs github approve (well not technically, I can merge it anyway)
https://github.com/istio/istio.github.io/pull/665/files -> review -> approve

well, it's interesting that we have different set up for different repos.

yes I know, it’s one of the many annoyance of multi repos


QC Section - too many cylinder shapes - bloats the diagram unnecessarily

Regarding the "QC Settings" section.. (call distribution/yellow block), all the settings could all be rendered in one shape; prefer a rectangle not the cylinder.
Music On Hold
Conference Mode Enabled
Agent Opt-Out Allowed
Presence Based Routing
etc..
Keep the Routing Method, Alert-time and Timeout as they are.. they work really well with the relationships.

What do you think about this?
The cylinder shape is described as "Database" in Mermaid. So I figuered it's best suited because it stores/displays the value of the settings. Also I think it looks best like this.

You can always fork it or create a pull request. For now, I was just making it to my liking. It's only been published and gaining traction for a few weeks now. I haven't thought about working with other contributors just yet.
Like I said, cylinders represent databases in Mermaid. Since they store the CQ properties I just thought they suit best. You can see all the available node shapes here: https://mermaid-js.github.io/mermaid/#/flowchart?id=node-shapes
So if you want other node shapes, you have to replace the existing syntax inside the script. But some node shape syntax is also linked to If conditions so a general search + replace might break the code...
Right now, it's only possible to define custom colors for all the nodes fill. But in theory it would be possible to make each node a different color. This would get very complex, I suppose.
I'm glad it helps you save time.

Absolutely respect you taking caution with contributions. I’ll consider forking at a later date, when am not under pressure for other projects at work.
So; do mermaid nodes have a class attribute that can be set; usually that’s how colours/sizes etc can be set centrally (think CSS)?  I’ll do some further reading.
Have you considered doing the file-push straight to mermaid.live and automatically outputting the PNG to disk ?  Saving the user doing this manually?  Diagrams could then be orchestrated via a scheduled task of some kind.

On 13 Jan 2022, at 06:54, martin heusser @.***> wrote:

You can always fork it or create a pull request. For now, I was just making it to my liking. It's only been published and gaining traction for a few weeks now. I haven't thought about working with other contributors just yet.
Like I said, cylinders represent databases in Mermaid. Since they store the CQ properties I just thought they suit best. You can see all the available node shapes here: https://mermaid-js.github.io/mermaid/#/flowchart?id=node-shapes
So if you want other node shapes, you have to replace the existing syntax inside the script. But some node shape syntax is also linked to If conditions so a general search + replace might break the code...
Right now, it's only possible to define custom colors for all the nodes fill. But in theory it would be possible to make each node a different color. This would get very complex, I suppose.
I'm glad it helps you save time.
—
Reply to this email directly, view it on GitHub, or unsubscribe.
Triage notifications on the go with GitHub Mobile for iOS or Android.
You are receiving this because you authored the thread.

I have no idea about web development technologies tbh. It was all just trial and error so far. I think mermaid does support css but I don't know how it works. I figured out, that you can set a theme inside markdown by adding the following:
%%{init: {'theme': 'default', "flowchart" : { "curve" : "basis" } } }%%
above the flowchart TB in a markdown file. "default" can also be dark, neutral or forest, these are supported.
But you can also customize it if you leave this line out. When you use -Theme custom with my script, you can specify color codes for node fill, border, font color, link color and link text. This adds the following after the diagram:
classDef customTheme fill:#87bd40,stroke:#ffffff,stroke-width:3px,color:#ffffff
You then add another line class nodeid1, nodeid2 customTheme. This means that the custom colors will get applied to nodeid1 and nodeid2. Link colors are a little bit trickier because they are only using numbers. So if you want to color just one link differently you have to know which exact number (starting at 0) it has in the diagram. This is nearly impossible to do because each diagram can have a different amount of links in it based on the callflow connections in M365.
I suggest you try to run the script with -Theme default and -Theme custom and compare the Markdown outputs to see how it works.
Regarding the PNG output. It seems like it doesn't work very well with PNG because there is a lot of blank content added on top and below the diagram. If it's a complex call flow, the png is bearely readable. SVG works much better. But I have not found a way to directly export to SVG. I was trying mermaid CLI but I always got errors. I don't think it supports flowchart yet. Only Graph but with Graph, I couldn't draw the diagram as I liked / it is now.
Do you think it's possible to do an API call to Mermaid.live with the scripts output? I haven't seen a way to do that yet.
The best I was able to achieve is to output directly to *.htm file instead of Markdown or Mermaid. This was added in V 2.4 and can be used with -ExportHtml $true. This way, you'll also get an htm file which can be opened in any modern browser.
With the "helper script" AllTopLevelVoiceAppsToMarkdown.ps1" (also in the Repo) I can now loop through all Voice Apps which have a Phone Number assigned and automatically generate Markdown and htm files for 1 customer. I need markdown because this will be included in a DocFx Documentation site. I need htm so a user can click on it and view it larger if the diagram is too small within DocFx. The htm file can also be right clicked and downloaded.
Please see the attached example of an htm output file. Maybe that helps too? (Since it can be opened by anyone with a modern browser and no coding skills or manual steps (copy/paste) are required.
PS_Test_CQ_CallFlow.zip

HTML looks good.
Plz merge "Routing Method" and "Agent Alert Time" into the first CQ Settings shape.
Looks mermaid.live supports styling.. am happy to play with that later.
You have a shape (diamond) where it reads "Call Connected" > Yes/No.  The YES action should proceed to "End", not "Call Connected".
Check the name in your last shape, you may want to remove that ZIP from the previous post.
Feel free to mark this as resolved.

Yeah no worries, this is all from my Test/Demo Tenant. "Axe Cap" is a fictional firm from the TV Show Billions. All my test users are also named after characters from there. It's much easier to work with names instead of Test User 1,2 etc. in Test environments imo.

You have a shape (diamond) where it reads "Call Connected" > Yes/No. The YES action should proceed to "End", not "Call Connected".

I disagree. If an Agent Takes a call, the caller is connected on the phone. To me, "End" only applies in scenarios, where an AA or a CQ would terminate a call after e.g. a greeting message has been played back. From my POV if a call enters a call flow, there are only 3 outcomes: Disconnect, Connected to Agent or forwarded to External PSTN and I think that should be reflected in the graph.
Currently, each "sub call flow" or even descicions in sub call flows have their own End/Connected nodes. I thought about interlinking all of them into one, as it's now the case with users, AAs, CQs, external numbers (except for the holiday graphs). But I suppose this would create way too much links and link overlapping which would make the diagram much more difficult to read...
I will close the issue, feel free to contact me on twitter or LinkedIn for further discussions. I appreciate the feedback.

One more thing, I want to keep the agent alert time a separate node for now. I might add support for serial routing at some point. For this I would insert an Agent Alert Time Node between every agent.


Change SQLite to use Optimistic Locking and WAL

By default, SQLite doesn't allow for multiple concurrent writers to the same database because SQLite just uses a file to store the data. It has been discovered that SQLite can actually support higher concurrency by enabling the Write-Ahead-Log and uses Optimistic Locking. Optimisitic Locking brings the transaction semantics in line with Rocksdb - essentially when the transaction commits, SQLite will check if any of the same pages have been touched by other transactions, and if they have both modified the same page, the transaction is aborted. Enabling the WAL is a prerequisite for using optimisitic locking.
This will enable the Fedimint client to work better in concurrent environments and potentially also allow the same client to store multiple federation configurations inside the same database.

Well, this is somewhat of a bummer. I didn't realize that the documentation I was looking at was actually for a branch of Sqlite from 2019. https://www.sqlite.org/src/doc/begin-concurrent/doc/begin_concurrent.md
We should still enable WAL and see how much that helps with concurrency. It occurred to me we can also get the same semantics as Rocksdb (failing at commit time) just by implementing it in fedimint-sqlite.

I'd assume that whatever was present in 2019 is still supported by SQLite? It's known for its stability after all. Does this sound like what we might want: https://www.sqlite.org/wal.html ?

It unfortunately hasn't been merged to their main branch yet. I tried using BEING CONCURRENT with our version of Sqlite and it does not work.
We should definitely turn on WAL though.

@m1sterc001guy Closing this since we removed sqlite


upgrade to faststream 0.5.1

updating to FastStream 0.5.1 -- this was the only error I encountered but someone who knows taskiq better should definitely do a once-over

Sorry, I already uploaded 0.1.8 with such fix


Remove dependency on bundler

When I install npm-ruby it appears to have a dependency on the node-bundler module. Is this really necessary?

That's right. We ship node-bundler built in to provide backwards compatibility for older applications that are in-transition state.


Fixes "Javascript uses use" typos

closes #3339

@avastu, verified and merged, thanks!

In the future, please name branches using the convention fix/some-bug or feature/add-cool-thing. see contributing
Thanks and Happy Coding.


397 correct epidata test fail: correction for Eisenach not anymore in county table

Merge Request - GuideLine Checklist
Guideline to check code before resolve WIP and approval, respectively.
As many checkboxes as possible should be ticked.
Checks by code author:

[x] There is at least one issue associated with the pull request.
[x] The branch follows the naming conventions as defined in the git workflow.
[x] New code adheres with the coding guidelines
[x] Tests for new functionality has been added
[ ] A local test was succesful
[ ] There is appropriate documentation of your work. (use doxygen style comments)
[ ] If new third party software is used, did you pay attention to its license? Please remember to add it to the wiki after successful merging.
[ ] If new mathematical methods or epidemiological terms are used, has the glossary been updated ? Did you provide further documentation ?
is present or referenced. Please provide your references.
[ ] The following questions are addressed in the documentation*:  Developers (what did you do?, how can it be maintained?), For users (how to use your work?), For admins (how to install and configure your work?)
For documentation: Please write or update the Readme in the current working directory!

Checks by code reviewer(s):

[ ] Is the code clean of development artifacts e.g., unnecessary comments, prints, ...
[ ] The ticket goals for each associated issue are reached or problems are clearly addressed (i.e., a new issue was introduced).
[ ] There are appropriate unit tests and they pass.
[ ] The git history is clean and linearized for the merge request.
[ ] Coverage report for new code is acceptable.

Closes #397

Hope that it now goes through. Please have a look at this soon @patricklnz


Add route to retrieve campaign details.

Changes

Adds a route to show campaign details. References #98.

I renamed the previous show method to index, since it's listing a bunch of campaigns, and implemented this as a campaign route rather than a signup object, since that's the REST noun we're using to store this data. Totally up for discussion if anyone thinks there's a better way of handling.
For review: @angaither @jonuy

I think that makes sense. :+1:


feat: support validating and installing provisioner files by uri

Installing provisioners by copying yaml files around is not a great UX and makes things unecessarily multi-step.
This PR improves this by adding a --provisioner <URI> flag which downloads a provisioner file using either http, git, or local filesystems and adds it into the .score-compose state directory at the top of the stack.

@mathieu-benoit good point, fixed up and added a test :)


Improve standardisation of multiple footprints - Zarr uniform chunk

Is your feature request related to a problem?
When trying to standardise multiple files at once, a chunk size error is sometimes raised. The files have to be standardised one by one which seems less efficient (and less user friendly).
Standardisation attempt :
from glob import glob
from openghg.standardise._standardise import standardise_footprint

standardise_footprint(filepath=glob(f'/group/chemistry/acrg/LPDM/fp_NAME/EUROPE/HPB-130magl/rn/*'),
                      site= 'HPB',
                      inlet= '130magl',
                      model= 'NAME',
                      met_model= 'UKV',
                      domain= 'EUROPE',
                      species='rn',
                      source_format= 'paris',
                      store= 'ad_test_zarr',
                      period= None,
                      continuous= True)

Error message :
Traceback (most recent call last):
  File "/user/home/bq24992/workingDir/PARIS/Footprints/test.py", line 25, in <module>
    standardise_footprint(**kwargs)
  File "/user/home/bq24992/openghg/openghg/standardise/_standardise.py", line 621, in standardise_footprint
    return standardise(
           ^^^^^^^^^^^^
  File "/user/home/bq24992/openghg/openghg/standardise/_standardise.py", line 51, in standardise
    result = dc.read_file(filepath=filepath, **kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/user/home/bq24992/openghg/openghg/store/_footprints.py", line 416, in read_file
    datasource_uuids = self.assign_data(
                       ^^^^^^^^^^^^^^^^^
  File "/user/home/bq24992/openghg/openghg/store/base/_base.py", line 367, in assign_data
    datasource.add_data(
  File "/user/home/bq24992/openghg/openghg/store/base/_datasource.py", line 155, in add_data
    return self.add_timed_data(
           ^^^^^^^^^^^^^^^^^^^^
  File "/user/home/bq24992/openghg/openghg/store/base/_datasource.py", line 245, in add_timed_data
    self._store.add(version=version_str, dataset=data, compressor=compressor, filters=filters)
  File "/user/home/bq24992/openghg/openghg/store/storage/_localzarrstore.py", line 178, in add
    dataset.to_zarr(
  File "/user/home/bq24992/.local/lib/python3.12/site-packages/xarray/core/dataset.py", line 2520, in to_zarr
    return to_zarr(  # type: ignore[call-overload,misc]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/user/home/bq24992/.local/lib/python3.12/site-packages/xarray/backends/api.py", line 1846, in to_zarr
    dump_to_store(dataset, zstore, writer, encoding=encoding)
  File "/user/home/bq24992/.local/lib/python3.12/site-packages/xarray/backends/api.py", line 1386, in dump_to_store
    store.store(variables, attrs, check_encoding, writer, unlimited_dims=unlimited_dims)
  File "/user/home/bq24992/.local/lib/python3.12/site-packages/xarray/backends/zarr.py", line 667, in store
    self.set_variables(
  File "/user/home/bq24992/.local/lib/python3.12/site-packages/xarray/backends/zarr.py", line 714, in set_variables
    encoding = extract_zarr_variable_encoding(
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/user/home/bq24992/.local/lib/python3.12/site-packages/xarray/backends/zarr.py", line 284, in extract_zarr_variable_encoding
    chunks = _determine_zarr_chunks(
             ^^^^^^^^^^^^^^^^^^^^^^^
  File "/user/home/bq24992/.local/lib/python3.12/site-packages/xarray/backends/zarr.py", line 135, in _determine_zarr_chunks
    raise ValueError(
ValueError: Zarr requires uniform chunk sizes except for final chunk. Variable named 'particle_locations_n' has incompatible dask chunks: ((372, 372, 336, 336, 372, 372, 360, 360, 372, 372, 360, 360, 372, 372, 372, 372, 360, 360, 372, 372, 360, 360, 372, 372), (10, 10), (196, 195)). Consider rechunking using `chunk()`.

Describe the solution you'd like
Would it be possible to simply rechunk the dataset?
In my case, the solution that I put below is working. Replacing https://github.com/openghg/openghg/blob/3eca7392b0f170508509be2fbad46a6eaec2dd86/openghg/store/storage/_localzarrstore.py#L162C1-L170C14 by :

            try:
                dataset.to_zarr(
                    store=self._stores[version],
                    mode="w",
                    encoding=encoding,
                    consolidated=True,
                    compute=True,
                    synchronizer=zarr.ThreadSynchronizer(),
                )
            except ValueError as v:
                if ('Zarr requires uniform chunk sizes except for final chunk.' in str(v)) \
                    and dataset.attrs['time_period']=='1 hour':
                    dataset.chunk({'time':'M'}).to_zarr(
                        store=self._stores[version],
                        mode="w",
                        encoding=encoding,
                        consolidated=True,
                        compute=True,
                        synchronizer=zarr.ThreadSynchronizer(),
                    )
                    pass
                else :
                    raise v

I'm not sure how much this correction and the condition that I put (dataset.attrs['time_period']=='1 hour') are sensible as I don't really know how are the others circonstances in which this function is called.
Describe alternatives you've considered
No response
Additional context
No response

Can you run this through a debugger and check the chunk sizes? I'm away until Friday, but could look into it then.
The data should be rechunked after open mfdataset is called. If this is a new datasource maybe the chunks aren't being set correctly. (They should be...)

Hum your right a chunking should have been done also at the previous line. I'm checking that


Terminal expands when npm script run

Issue Type: Bug

Use 'npm scripts' to run a task that does not exit (ie webpack-dev-server)

Split the terminal into two

Restart the npm script

The terminal covers the split view

VS Code version: Code 1.33.1 (51b0b28134d51361cf996d2f0a1c698247aeabd8, 2019-04-11T08:27:14.102Z)
OS version: Windows_NT x64 10.0.17134

System Info

Item
Value

CPUs
Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz (8 x 3408)

GPU Status
2d_canvas: enabledchecker_imaging: disabled_offflash_3d: enabledflash_stage3d: enabledflash_stage3d_baseline: enabledgpu_compositing: enabledmultiple_raster_threads: enabled_onnative_gpu_memory_buffers: disabled_softwarerasterization: enabledsurface_synchronization: enabled_onvideo_decode: enabledwebgl: enabledwebgl2: enabled

Memory (System)
15.88GB (10.05GB free)

Process Argv

Screen Reader
no

VM
0%

Extensions (12)

Extension
Author (truncated)
Version

Bookmarks
ale
10.4.3

npm-intellisense
chr
1.3.0

vscode-eslint
dba
1.8.2

githistory
don
0.4.6

EditorConfig
Edi
0.13.0

vscode-npm-script
eg2
0.3.5

rainbow-csv
mec
1.0.0

dotenv
mik
1.0.1

vscode-typescript-tslint-plugin
ms-
1.0.0

vetur
oct
0.18.1

RustyCode
sav
0.19.1

sort-lines
Tyr
1.8.0

(1 theme extensions excluded)

Behaviour is the same without 'vscode-npm-script' installed.

This is what I tried:

Start a script that doesn't exit from the NPM Scripts view
Split the terminal that the script is running in.
Run the Restart Running Task command from the command palette.

What I saw was that the task was killed (good), and then the task was started in a new terminal (also good). Since the task was killed, the terimal it was running it was killed, forcing the task to run in a new terminal. This is correct and by desgin.


Only helm release on Chart.yaml changes

separated docker and helm release, helm now only triggers when a merge to main includes a change to the Chart.yaml

You can see the result here


Consider scrapping data from webpage for current week rather than doing API request

Given that I have 14 calendars, this requires 14 API requests for each week. This is inefficient.
Instead, should consider scrapping the data from the webpage - may be bug prone, but would be good enough for several features:

https://github.com/maxpatiiuk/calendar-plus/issues/228
https://github.com/maxpatiiuk/calendar-plus/issues/220
https://github.com/maxpatiiuk/calendar-plus/issues/76

Spent a few hours prototyping this.
Going to look like https://gist.github.com/maxpatiiuk/f315cd3cdafa4a68cdd9838a4d70e05d, but much more robust and production ready.
Faced a challenge - the script above was parsing out event details out of the accessible event label.
That works somewhat reliably for EN (somewhat because event names and locations may include commas, which would break the parsing)
But, there is also AM/PM to account for - quite doable.
But then, the accessible event label is quite different for each language (and Google Calendar supports 74 for now)
Thus, considering parsing out event details from the DOM preview rather than accessible label.
This makes the design a bit more fragile to DOM changes, but, I will still keep the API request code so that it can seemlesly fallback if DOM parsing fails (the API request code will be needed anyway since DOM parsing would only work for day, custom days and week views)
Calendar name id is present inside of a jslog attribute on each event name. Hopefully they don't change this much, but yes, this will be a bit fragile. Alternatively, I can try to parse the event name out of the accessible label - going to be tricky though since calendar names in the DOM don't always match what the API responds with (your main calendar is named after your email address in the API, but after your preferred name in the UI. the Birthdays calendar is also named differently depending on the UI language). Alternatively, could parse out the event node color (which is in RGB, so convert that to hex) and find the nearest calendar with that color. Since there is a limited number of colors to choose from, reliable rgb->hex conversion will be easy - but, the tricky part is that multiple calendars can share a color, so you would still need to do some matching of "possible calendar names" to what's included in the accessible label.
I also thought of intercepting the network requests that Google Calendar makes so that I don't need to redundantly fetch from them API but can reuse theirs. Even beyond the question of whether I have the ability to intercept network requests (which is questionable since ad blockers complained about that feature missing in mw3), there are some challenges:

they are using an internal-only API that is distinct from the public one. The internal API responds as a nested array, not an object, so keys are missing, and so them adding/removing a field, could shift all by one, causing issues for me.
I would also have to keep track of events being added/removed/edited during the page lifecycle to update my internal store based on that - this could prove tricky to get right.

Going back to DOM parsing then. There are DOM nodes for event name, event location (which I ignore) and event time. Seemed simple until I realized that the event time sometimes only includes the event start time, not the end time. And, this is not just for 15minute events - sometimes 30 minute and even 45 min events don't include the end time, only the start. The end time is consistently present in the accessible event name, but that could differ too much between the locales.
I compared the DOM notes to see if there is any other hint to dictate if this is a 15/30 or 45min event. There is a "height" attribute. But, besides the reliability concerns between screen sizes and UI settings, I found that the height is a bit different for CJK languages than EN, so I totally can't really on it safely. Looking at the extension stats, it's being used in more than several dozen of languages, so these are the cases I should support.
The DOM nodes have class names that indicate some of these things. Besides the class names common to all events on the page, there are 7 that indicate some specific parts (whether it's occupying only part of the column width due to overlap, whether the event is occurring today, whether event has a handle, whether event should be grayed out, and etc). However, these class names are minified, so might not be very stable (though, Google Calendar seems to hash them rather than minify so they don't change too often, but still). I found a class name string that reliably indicates 15 minute events, though I didn't find ones for 30 or 45 mins events, thus this probably isn't going to work. Putting class name parsing into an ice box for now.

Google Calendar's JS Code that determines the class name string:
b.attr("class", "GTG3wb ChfiMc rFUW1c " + e + (d ? " F262Ye" : "") + (_.A3(c.getStyle()) ? " Sb44q" : "") + (_.D3(c.getStyle()) && !_.K6(c) ? " KKjvXb" : "") + (_.B3(c.getStyle()) ? " oMTcIc" : "") + (_.oe(c, 3, !1) ? " Hrn1mc" : "") + (_.oe(c, 18, !1) ? " MmaWIb" : "") + (_.C3(c.getStyle()) ? " UflSff" : "") + (_.se(c.getStyle(), 12) ? " pZRd0d" : "") + (_.se(c.getStyle(), 13) ? " JpY6Fd" : "") + (_.se(c, 22) ? " TuXzcb" : "") + (_.z3(c.getStyle()) === 4 ? " uBfZ1b" + (_.se(c.getStyle(), 14) ? " sKK0ee" : "") + (_.se(c.getStyle(), 11) ? " MIxzAd" : "") + (_.Oh(c, 21) === 0 ? " FxGsse" : "") : "") + (_.G3(c.getStyle()) ? " wYv2Ye" : "") + (_.K6(c) ? " BS4SQb" : "") + (_.se(c, 19) || _.se(c, 17) ? " afiDFd" : ""));

Thus, it seems that the only reliable place in the DOM from where I can get the event end time is the accessible label string, which looks like this in EN:
// regular event
10:00 to 13:00, Controllers, Calendar: Esri, No location, June 10, 2024
// multi-day event:
June 9, 2024 at 22:15 to June 10, 2024 at 06:30, Sleep, Calendar: Critical, No location, Color: Graphite,
// am-pm:
10am to 13:15pm, Controllers, Calendar: Esri, No location, June 11, 2024
// event that doesn't have an end-date visible in the UI (but present in accessible label), and has location:
19:30 to 20:15, WWDC24 Apple Keynote, Max Patiiuk, Location: https://www.apple.com/apple-events/, June 10, 2024

For personal use, my script has been reliably parsing out these accessible labels since 2021 - the label format for EN did not change in that time. The only issue I had was when event name included a comma, thus I avoided the commas in my event names.
But the real challenge with parsing accessible labels is going to be the internationalization.
Here is Chinise for example:
19:15至 19:30，Charge Apple<EMAIL_ADDRESS>下午7:15至 下午7:30，Charge Apple<EMAIL_ADDRESS>
And to add fun, here is Myanmar, with non-Arabic numbers
၁၉:၁၅ မှ ၁၉:၃၀၊ Charge Apple Watch၊ ပြက္ခဒိန်-<EMAIL_ADDRESS>နေရာ ထည့်မထားပါ၊ ၂၀၂၄၊ ဇွန် ၁၆
ညနေ ၇:၁၅ မှ ညနေ ၇:၃၀၊ Charge Apple Watch၊ ပြက္ခဒိန်-<EMAIL_ADDRESS>နေရာ ထည့်မထားပါ၊ ၂၀၂၄၊ ဇွန် ၁၆

To minimize the need to deal with parsing the locale-specific string, I will go with this:

Get event name from the visible DOM node (would also bypass the comma issues). Doesn't seem like long event names get trimmed in the DOM, so that's good
Get calendar ID from the jslog attribute on the event node
Get times from the visible DOM node

If the visible time node only includes the start time, only then look for it in the accessible string

More details on the step 3:
Since there is a lot of variation in the time format in the accessible label string, having one regex handle them all would be fragile and probably performance poor.
Instead I will:

Try to look for front-end Google Calendar code that builds the accessible string to see what variations of it are possible in each language
If can't find that, then manually switch Google Calendar UI to each of 71 languages and record the accessible strings (for regular event, and a multi-day event, and each of these in 24hr and 12hr time format)
Once I get the variations, write a runtime code that will get the accessible label for the first event and try to guess the language and am/pm match from it. I am naively hoping that this doesn't have to be sophisticated - i.e for 24hr clock, the /\d\d:\d\d/gu format would work for majority of languages - I don't need to differentiate between those languages as long as this regex matched one of them. For 12hr, /\d{1,2}(?::\d\d)[ap]m)/gu would work for a few languages. Though the am/pm part is translated differently in most languages (下午 in Chinese, пн in Ukrainian). Once I find a regex that matched the accessible string for the first event successfully, I apply it to parsing all the other events on the page.

Note, I have to concern myself with parsing the am/pm part because otherwise
the number in 8am and January 8 would be confused. As simple as
\d{1,2}\B won't work because:

\B only works for a-z. I.e breaks with Cyrilic 8пн. There may be a more unicode-aware matcher like \p{Separator}, but it would be slower, and still won't handle the next problem:
Doesn't handle CJK where am/pm indicator is before the number, not after

I am hesitant to persist the resolved language code & am/pm in cache as language can be changed on the fly (this causes page reload though), and am/pm changes on the fly (this doesn't cause page reload, but does re-create DOM nodes)
Verify if it is safe to assume for each language that the first number is the starting time and 2nd number is the ending time. I don't care about event date, only time because I can know the current date from the column I am in. For multi-day events, the event will be duplicated in each column it spans, so parsing can consider just one column at a time.

No need to parse out the date from the UI, only time as I already have the code to get date from the URL, to watch the URL changes and to resolve a URL date to a date range that is currently displayed in the UI.

At any point as soon I as any step fails to parse reliably, bail out quick, log warning to the console and fallback to using the API. In that case, disable the features that rely on DOM parsing for performance reasons? And hopefully I that it broke quickly enough and have time to fix it? (or never if the error only occurs for a language I am not using?). https://github.com/maxpatiiuk/calendar-plus/issues/236 would be really useful here. Otherwise, some sort of crash analytics.

 It is ambiguous. See https://en.wikipedia.org/wiki/12-hour_clock#Confusion_at_noon_and_midnight
Implementation details:

Have a DOM mutation listener with 1s timeout (leading edge) to reparse events on DOM change (i.e. event being added or weeks changing). In my benchmarking the code for parsing EN accessible labels alone takes 1-3ms.

(optional) only run the mutation listener if there is a feature active that needs access to the events? (i.e Calendar Plus is open, or badges are enabled)

I was a bit afraid that the accessible label code would be on the back-end, but no, it is all on the front-end.
The format can differ between languages.

"{TIME_PERIOD}, {TITLE}, {CALENDAR}, {DATE}"

There is also special logic for tasks, reminders, scheduled slots, proposed events without rsvp, with rsvp, denied event, etc...
I think if I don't find the calendar ID, I should just bail out of parsing that event (rather than bail out of parsing the entire page, unless failed to find calendar id for any event) so as to exclude all these non-event entities

I also found that their DOM elements have a property with virtual dom data. I was excitedly looking if that would contain the calendar event data, but no, it just contains the DOM attribute data that I could already access via direct DOM APIs (which would also be more stable than accessing internal data structures)

But, much better, there is a global gcal object that contains on it every JS module of the page, including the date formats:
> gcal.mvd.EL
'{START_DATE_TIME} – {END_DATE_TIME}'
> gcal.kvd.EL
'{FULL_DATE}, {TIME}'
> gcal.LDd.EL
'{DATE}, {START_TIME} to {END_TIME}'

Useful util for exploring the global object:
// Convert a complex object to JSON
stringifyJson = (data,short=true,seen=new Set())=>JSON.stringify(data, (_key, value)=>{
  if(value == null || typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean')
    return value;
  else if(seen.has(value)) return short ? undefined : '[RECURSIVE]';
  seen.add(value);
  if(typeof value ==='object') {
    const result = {};
    for (const key in value) {
      if (Object.prototype.hasOwnProperty.call(value, key)) {
        try {
          const objectValue = value[key];
          objectValue.constructor;
          result[key] = objectValue === globalThis ? short ? undefined : '[GLOBAL_THIS]' : objectValue;
        } catch (err) {
          result[key] = short ? undefined : `[ERROR: ${err.message}]`;
        }
      }
    }
    return result;
  }
  else if(short && typeof value === 'function') return undefined;
  else return value.toString()
})
// Convert gcal object to a string
stringifyJson(gcal);
// Copy the resulting string into an editor, pretty-print it as JSON, and explore!

And then also this to quickly find interesting keys and values in the resulting object:
resultingObject= {...}
a = new Set()
d = j=>Object.entries(j).forEach(([k,v])=>{
  if(k.length > 10) a.add(k);
  if(typeof v === 'string' && v.length > 4) a.add(v)
  if(Array.isArray(v)) v.forEach(d)
  if(typeof v === 'object' && v !== null) d(v);
})
d(resultingObject)
Array.from(a).sort()

And then this to find a path to a string in a deeply nested object:
resultingObject= {...}
l = (j,f,p=[])=>Object.entries(j).forEach(([k,v])=>{
  if(v === f) { console.log([...p,k].join('.')); }
  else if(typeof v === 'object' && v !== null) l(v,f,[...p,k]);
})
l(resultingObject,"Charge Apple Watch")

Some findings:

Found definition of all the calendars the user has

Path: gcal.dc.ka.ma.n73qwf.0.ma.__wizmanager.ha.3458.__jsmodel.v6ikb.Sz.Fa.3.1

All time-zones:

Path: gcal.dc.ka.ma.n73qwf.0.ma.__wizmanager.ha.3.closure_lm_675541.ha.keydown.4.handler.source.nL.Du.Qya.qa.qa.ka.208.0

Formatting settings for current locale

Path: gcal.Jx

Feature flag names
Calendar settings

Path: gcal.dha

Fetched event names

Path: gcal.dc.ka.ma.n73qwf.0.ma.__wizmanager.ha.3.closure_lm_675541.ha.keydown.4.handler.source.ma.source.PO.ji.kE.Ab.history.ma.ka.ha.ma.bi.0.__jscontroller.Sz.QG.ka.ha.ma.0.6.Cq.1.5

While it has a lot of information I would love to have access to in the extension, as you can see, some of the property access paths are very long, making any reliance on these super fragile.
It seems like many of these keys are hashed rather that simply randomly minified, giving them some form of persistence, but still, it would be too fragile to relly on these.
Still, this is going to be helpful here:

To fetch JS bundles, Google makes a request like this:
https://calendar.google.com/calendar/_/web/calendar-static/_/js/k=calendar-web.matasync.en.kiV42_DT6Uo.2020.O/am=QAICIAA7Ek8CAAAI/d=0/rs=ABFko3_cKNOcL2ZJoL-KJZ1fYcDgE694mA/m=syw9,syw8,xDNx2e,KHdXW,ZDBS7d,jjykEd,sy19u,sy19v,IiAxCb,s0ef2c,Hkkrld,synd,ws9Tlc,siKnQd,UAyYnd,sy2a,sy2b,ndDKmb,UItRMc,yqBu4c,zWPBS,qadpGd,rIjGQb,gCKuke,WMXaid,wzzigb,NmJjzb,beFWRb,Cc7Sob,RtZYV,B78tCd,ayMid,o83wje,C8yvoe,bUUOIe,sy1lt,KEohkb,EZnnmd,bAxIgb,sy1h2,ttg67c,I8m4he,SzkWee,lQR3Hd,bqZpcb,sy1a7,e8v9gb,MpJwZc,n73qwf,MtLh9c,...... very long string like this continues

in the above, the en in web.matasync.en denotes the language - changing those two letters could return the JS bundle for a different language (with formatting strings for that language - quite helpful for my research)
edit: turns out some other parts of the URL like kiV42_DT6Uo also chance with language, so it's not as simple 😢
The 5-6 letter parameters at the end of the URL denote which files to include in the bundle. Removing each of these from the URL removes a bit of code from the resulting .js file - very interesting!

After a bit of experimentation, I see that the bundle that includes the time formats are the following:
https://calendar.google.com/calendar/_/web/calendar-static/_/js/k=calendar-web.matasync.en.kiV42_DT6Uo.2020.O/am=QAICIAA7Ek8CAAAI/d=0/rs=ABFko3_cKNOcL2ZJoL-KJZ1fYcDgE694mA/m=keU3Q,tXMUsb,ndDKmb
this.gcal=this.gcal||{};(function(_){var window=this;
try{
_.B("tXMUsb");
var KDd,FDd;_.GDd=function(a,b){return b?FDd.format({GREGORIAN_DATE:a,ALTERNATE_DATE:b}):a};_.KL.prototype.va=function(a,b,c){return c?_.QCd(_.YCd(this,a.month),a.qb):_.QCd(_.XCd(this,a.month),a.qb)};_.ZCd.prototype.va=function(a){return _.aDd(this,a)};_.bDd.prototype.va=function(a){return _.dDd(a)};_.HDd=function(a,b,c){return _.Vx(_.G(a.ha,_.Ox,23),[b,c])};_.IDd=function(a,b){if(!a.ka||!a.ha)return"";b=a.ha(b);return a.ka.ka(b,!0)};_.JDd=new _.Sx("{START_TIME} to {END_TIME}");KDd=new _.Sx("{START_DATE} at {START_TIME} to {END_DATE} at {END_TIME}");
_.LDd=new _.Sx("{DATE}, {START_TIME} to {END_TIME}");FDd=new _.Sx("{GREGORIAN_DATE}, {ALTERNATE_DATE}");_.ML=function(a){_.U.call(this,a.Ha);this.ha=a.service.tb;this.Uq=a.service.Uq;this.vi=a.service.vi};_.N(_.ML,_.U);_.ML.Ga=_.U.Ga;_.ML.Ea=function(){return{service:{Uq:_.LL,vi:_.Sud,tb:_.bx}}};_.NL=function(a,b,c=!1,d=!1){c=c?_.Wud(a.vi,b):_.Uud(a.vi,b);d&&(a=a.Uq,a.ka&&a.ha?(b=a.ha(b),b=a.ka.va(b)):b="",c=_.GDd(c,b));return c};_.MDd=function(a,b,c=!1){return c?_.Vud(a.vi,b):_.Tud(a.vi,b)};
_.NDd=function(a,b){return a.ha.nS()?_.avd(a.vi,b):b.minute===0?_.Zud(a.vi,b):_.$ud(a.vi,b)};_.ODd=function(a,b,c){return KDd.format({START_DATE:_.Tud(a.vi,b.Cb()),START_TIME:_.NDd(a,b.ae()),END_DATE:_.Tud(a.vi,c.Cb()),END_TIME:_.NDd(a,c.ae())})};_.Ct(_.kv,_.ML);
_.C();
}catch(e){_._DumpException(e)}
///// trimmed...
})(this.gcal);
// Google Inc.

Now, I can find the bundle for each of the other formatting strings that comprises the accessible event label and then fetch those for each language
Found the function that formats time:
    _.NDd = function(a, b) {
/// if 24hr clock format enabled then do 6:30
      return a.ha.nS() ? _.avd(a.vi, b) :
// else if 0 minutes, do 6am
b.minute === 0 ? _.Zud(a.vi, b) :
// else do 6:30am
_.$ud(a.vi, b)
    }

Also, interesting that I found code like this: _.Qud = new Set(['ja', 'ko', 'zh_CN', 'zh_TW']).has('en');.
That indicates that the language code is substituted into the code after the minifier is run.
I guess they wanted to keep the build fast, so the bundle is build once, but then parts of it are substituted on the fly when it is time to serve it?

Google Calendar languages:
{
  "af": "Afrikaans",
  "az": "azərbaycan",
  "id": "Bahasa Indonesia",
  "ca": "Català",
  "cy": "Cymraeg",
  "da": "Dansk",
  "de": "Deutsch",
  "en_GB": "English (UK)",
  "en": "English (US)",
  "es": "Español",
  "es_419": "Español (Latinoamérica)",
  "eu": "euskara",
  "fil": "Filipino",
  "fr": "Français",
  "fr_CA": "Français (Canada)",
  "gl": "galego",
  "hr": "Hrvatski",
  "zu": "isiZulu",
  "it": "Italiano",
  "sw": "Kiswahili",
  "lv": "Latviešu",
  "lt": "Lietuvių",
  "hu": "Magyar",
  "ms": "Melayu",
  "nl": "Nederlands",
  "no": "Norsk (bokmål)",
  "pl": "Polski",
  "pt_BR": "Português (Brasil)",
  "pt_PT": "Português (Portugal)",
  "ro": "Română",
  "sk": "Slovenčina",
  "sl": "Slovenščina",
  "fi": "Suomi",
  "sv": "Svenska",
  "vi": "Tiếng Việt",
  "tr": "Türkçe",
  "is": "íslenska",
  "cs": "Čeština",
  "el": "Ελληνικά",
  "be": "беларуская",
  "bg": "Български",
  "mn": "монгол",
  "ru": "Русский",
  "sr": "Српски",
  "uk": "Українська",
  "kk": "қазақ тілі",
  "hy": "Հայերեն",
  "iw": "עברית",
  "ar": "العربية",
  "ur": "اُردُو",
  "fa": "فارسی",
  "ne": "नेपाली",
  "mr": "मराठी",
  "hi": "हिन्दी",
  "bn": "বাংলা",
  "pa": "ਪੰਜਾਬੀ",
  "gu": "ગુજરાતી",
  "ta": "தமிழ்",
  "te": "తెలుగు",
  "kn": "ಕನ್ನಡ",
  "ml": "മലയാളം",
  "si": "සිංහල",
  "th": "ภาษาไทย",
  "lo": "ລາວ",
  "my": "မြန်မာ",
  "ka": "ქართული",
  "am": "አማርኛ",
  "km": "ខ្មែរ",
  "zh_HK": "中文 (香港)",
  "zh_CN": "中文（简体）",
  "zh_TW": "中文（繁體）",
  "ja": "日本語",
  "ko": "한국어"
}

Looks like besides the language code, some other language-specific parameters are specified in the URL:
https://calendar.google.com/calendar/_/web/calendar-static/_/js/k=calendar-web.matasync.en.kiV42_DT6Uo.2020.O/am=QAICIAA7Ek8CAAAI/d=0/rs=ABFko3_cKNOcL2ZJoL-KJZ1fYcDgE694mA/m=keU3Q,tXMUsb,ndDKmb
The request for the HTML home page returns a script tag with those parameters included in the URL. Let's extract them:
await fetch("https://calendar.google.com/calendar/u/0/r/week?pli=1", {"headers": {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:127.0) Gecko/20100101 Firefox/127.0"},}).then(t=>t.text()).then(r=>{
l='<script id="base-js" src="/calendar/_/web/calendar-static/_/js/k=calendar-web.matasync.';
s=r.slice(r.indexOf(l)+l.length);
return s.slice(0,s.indexOf('/m=base"')).replace('d=1','d=0');
});

Changing settings for each language and extracting that language-specific url part:
[
  "af.fGjYHqi3siQ.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko38t2kWSQxCgHMYs21szC-klpIN-Zw",
  "az.O9dsS0mL00k.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko3-GhVrGf7jBQ5RIhiPfOr6qnUv7mg",
  "id.aZIa6c4zhPM.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko380p-O1HnMkmfop-u74FXjI_zuBTg",
  "ca.O-_1HH8FjL8.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko39LoBjXJDwlJ1l8nRa5YWkI5WJAyA",
  "cy.q5BBAITHbDs.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko38QxBSQisieYXEpfbifjf1FMPZLxQ",
  "da.ZjXJzpTk2NQ.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko38w7wwVS6vy0FSshnTFRFnaY_-dNw",
  "de.2OZiqpfWTHw.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko3-_aa3qMTXDzk4moqM4tM7XaLgbkw",
  "en_GB.KYHrsBTODfk.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko3_YfrVPQQ7-ugqib4_v0wTk60Oqig",
  "en.kiV42_DT6Uo.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko39lIyVIeFOxM6CrUuDmwE5CXKPeVw",
  "es.WogQQhrZn6E.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko3_hzhp-cmiD6H-fKZGu-CqL53exkQ",
  "es_419.4WrUvkTfE7E.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko38XXUigONuWBtjcm3AyGFsIexgWSg",
  "eu.FVyXvyQ-vBk.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko39lBysf7io9wObOyT8OmBWkucpwFA",
  "fil.ZG0z2n6Utsk.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko3-t2s8VG9NZD6Vosz20v0ou0H1gSw",
  "fr.NeL94Vwnkkk.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko39_YAnfYSOb96ct-wV94vbSeNaF9Q",
  "fr_CA.yDuZVdev-2c.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko38VJsMZyrH7O7Boj7BY1cy-NbN1WA",
  "gl.m4lqE4mGoLA.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko3-3-tUHefVRfhBrkw3urg8pNDiobw",
  "hr.f_13jldKXQU.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko38wFyLVcEIG5Pw2jkVRe48PHmUrAw",
  "zu.-Ndbezb-QjE.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko38T-CKmgnsz3ZrtPnM0Kc_77ujR-Q",
  "it.8xr9VoJDSVQ.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko39EMB15h7Uf-WQ0xgELh-fDvwLCsw",
  "sw.K_fsoydgg-k.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko3_-iLzAnxNNypnD8axQnKhqSDC3Bw",
  "lv.8beiVA8-HfI.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko38Bbob8EJLaffNMqXVlOetbGdt7VQ",
  "lt.POBohtPFRKc.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko39dNttPvcsiVp1VyO6nwDiUzQC0wg",
  "hu.Z45PzMZCOYs.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko3_RvbhZiA_-yqO1iJfLbYoJj3tqLA",
  "ms.iY6PmE8PJw0.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko3_urRPMNmJVgaAbPkf_h3JGjFW5Eg",
  "nl.Wfd3wg2oLAg.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko39eKT9DEYKyZROZLmP-mVl0mPDKkQ",
  "no._UH1m-jairc.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko3_2Q01On91v7SPmlSxwNzrXqPk84Q",
  "pl.HoTxzj70m44.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko387q6BCo_p4xmzsrpFdRYXNOUzeZw",
  "pt_BR.yPVb0sWPdB8.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko3_2iipauXn_cofC3bPPKJGAs2ADyQ",
  "pt_PT.M40ScvnltBc.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko3-1yyAdr1_yLh2_DAHAzcKvZ1kO1Q",
  "ro.o-J6YJwXM_Y.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko3-7FuKKra7twKFgP7PYjfl13VRkPQ",
  "sk.O_XlP1I57Is.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko3_xzfE5Q5cT9dGECG9K6FuIX9-7nA",
  "sl.iVc6mkEVHYE.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko3_F49K5WjbHkbPQgqywoiK4wIYeyA",
  "fi.u4jLcFduYtA.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko383sOE93juaPXTKHbhv4HyFVUeVuQ",
  "sv.NZYxm4-5grE.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko3-cRb50wPQHIRJ4dAzQY6l6WZHxYg",
  "vi.jDliExU6ZZc.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko3-7j_NRqcfBnRm8OdXONu-4_eKZgA",
  "tr.YBgq_f4fsAs.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko38BGabY2dw0GmHWlefnVzAAfch6iQ",
  "is.8qGrdxsnvuA.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko3-QPANWC2JKRRJhAj757jH-ClfXfA",
  "cs.xENm3_vyrB0.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko3_voHJz8EMeHCYOpulB2SnEKBSAEw",
  "el._wUNKxcYJc0.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko39SSwcrlGtBeBLsM7raY8Y39bbcbw",
  "be.KqarmVCCkNE.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko38KE6sQG8SBLfKzMU8b6_K-NtVpoQ",
  "bg.TNjdIY1ZhxE.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko3_zZaCjReXnqgCHwp1NqDOGIK-yag",
  "mn.M5V9EhgLRPw.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko38UD8OeeMIw0zHIihoR-PBmmx0Csg",
  "ru.JM2QQSAXLtM.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko39mWI4tqJ2VKFbpk91yLzn30335qQ",
  "sr.IAZvMlFG9B0.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko38JBKny69eqkRrwLQfYFm4iXSse4A",
  "uk.T3edqZOotJc.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko38BvNB5B4EE9gP_oY9NFc1yisZX3A",
  "kk.dSk0-wa9tpo.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko3_pvVerfXbVWKNiWrIEAoNIhPwNaw",
  "hy.FfLUK2mnymg.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko3-F98XiXCuizpat1r8O398JTxsJog",
  "iw.lPRGc4QfCK0.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko39t-lljHsElqM_xSa_R-pnjQmOEDA",
  "ar.n7y-oa7O2zo.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko385XGuSt2zpkzb84j7MftY3vM5Dbg",
  "ur.hKhfKhqQ738.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko381I65m_-hdJIjKzY0Eq3Q6V_diVQ",
  "fa.geNz2OVQpOY.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko399Zg4iV-cYBXO1vpO47s6zSrkdSQ",
  "ne.EcGx837Lpp4.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko38z64qGvu9I41bOCtvs8ir8A2HZsw",
  "mr.K0sef7tGL9I.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko3-whkOOYFwRV0YuLARrYU9QSh5heA",
  "hi.WenmEHoVQr0.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko38FQq2hjlcIHfy8Z4PU4YTjQY37mw",
  "bn.Wov9pdgoJoE.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko3-ji-RDFUY-waVtOT4-Q_ICEyjRVQ",
  "pa.8c7rkc9tc5s.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko38yS8NeN4zyH-Kcb2PUSzMCpKqs6w",
  "gu.rL2XGee_j98.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko38ePxUJmwyZ3fFqpq8BkjFFEt-1CQ",
  "ta.97lPW3Dw-jk.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko39LdleOjtQSUJx1CfNVkdhvMvLJzQ",
  "te.dcyfQzF_UF4.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko38W5zlRXPfKwXSMzm297mW4ZisXuQ",
  "kn.zHgUSeh1vOk.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko39ih84cJ2WFl1CnSupT_FsQQpoaiw",
  "ml.6OxWWkPNjzI.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko38XISnQNXKkU0zXRrisP05JS2323A",
  "si.wtLZozlWq5I.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko3_d0cdzuK1-ncLdp7TTypnsv9-4rg",
  "th.hZ4ZlMcBHEw.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko3-7dTPSxa-cS3Zdp0CbKHLm50LN0g",
  "lo.yq1i_m3Dfzc.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko39xwaGqdjxuomgsJICyTzyDRPuQZg",
  "my.KnBiGO1WoOc.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko3-0H-R5e6La5iRfKmCyzA6dqhQbWg",
  "ka.2TtkghregFM.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko38eAq0Sl8Qcv2OJoAFKj7omFQAxaw",
  "am.9IRwIRcj-uw.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko3-Qogi8tVhTPCo6z5Y01qJFEyOzhQ",
  "km.l-4sjqqxBdY.2020.O/am=QAICAAArEk8CAAAI/d=0/rs=ABFko38A8e4XHgrE3DtOevCYw8XetVZRsA",
  "zh_HK.Cq4_R4Oqa8c.2020.O/am=QAICAAArEk8CAAAE/d=0/rs=ABFko38iW_FtC5whx39xQTbzElvVG_W1kA",
  "zh_CN.37fgdVobyrM.2020.O/am=QAICAAArEk8CAAAE/d=0/rs=ABFko3_vfz9WqfSlyyv061gvr_AFSrcNng",
  "zh_TW.K7JItRhZf3s.2020.O/am=QAICAAArEk8CAAAE/d=0/rs=ABFko38r62uPGXG9Dj8CZfuB_mlunf53SA",
  "ja.GIKsEBuWpIE.2020.O/am=QAICAAArEk8CAAAE/d=0/rs=ABFko3_vXk3Mt69gwOJzP_WILuq-LdTt0A",
  "ko.tKvKcd-IL0I.2020.O/am=QAICAAArEk8CAAAE/d=0/rs=ABFko3-apa7LgjbDQq0_LqcLfMkjga5awA"
]

Found that the page makes this request when I re-open the tab after it being in the background:

https://calendar.google.com/calendar/u/0/hello?cwuik=10

which responds with: hello
a cute active status indicator)

Rather than reading the JavaScript source code for each language to see what formatting it uses, I saw in the code what kind of changes to expand in formatting between languages, and simply scrapped the aria labels and dom times for every one of Google Calendar's 72 languages and for each in the am/pm and 24 clock style.
A few edge cases to handle:

Some languages don't use arabic numbers - need to run a normalization pass on the scrapped data
There may be non-event entities on the calendar (tasks, schedules, etc) - handling those by trying to find a calendar id for an even, and if can't then it's not an event

Then, I had a great observation - I don't actually need to know if a given date is am or pm! That's because I have access to the DOM and so I can infer the following from the DOM:

Does event touch the top of the current day (meaning it's start time should be 0, even if the label says otherwise because event spanned from the previous day)
Does event touch the bottom of the current day (meaning it's end time should be 24, even if the label says otherwise because it spans to the next day)
Is the top of the event above the midpoint of the day? Then the start time must be in am
Is the bottom of the event above the midpoint of the day? Then the end time must be in am

With this, the task is simplified to merely "finding numbers in strings", rather than "finding times, that could be written in am/pm in any one of 72 languages and more languages could be added at any point without notifying you causing your extension to break"
Still a bit tricky because:

The dom time may only have the start time
The event label string has many numbers - one or 2 day numbers (which can definitely be confused for time in am/pm style  - 2 AM 2 Jan) and a year number (which, fortunately is unambiguous)

I deal with it by knowing that the dom time node will always have the start time. So if dom time only has the start time, I find that start time in the event label string and exclude it from the consideration. Then, I also exclude from the consideration  the day number for the day that this event is from. And if event spans to next or previous day, I also exclude that day number

The event label also includes event summary and calendar summary, which may include numbers in them

But, in all languages calendar summary appears after event summary. And, I have event summary from the dom node. So I simply ignore everything in the event label after the last occurrence of the event summary substring.

In RTL languages, the start time in the string may occur after the end time

But that doesn't matter because after I exclude all other matches from the event string (start time and day numbers), the only remaining number must be the end time

With this, I am able to parse all event label string in all languages even in am/pm with almost 0 reliance on locale specific behavior. In particular, I am making two small assumptions:

Event summary in all languages will continue to appear after event start and end times in the event label string. And calendar summary is always after event summary
In some languages from 9 to 10 am is shown as 9–10am. My regex for detecting an individual number (<number><not number><number><number> i.e 9:10 or 9.10) needed to be modified to say that the <not number> part is <not number and not - and not  –). My assumption is that the going forward, only - and – characters will need to be excluded like this. But to be sure, having continuous UI tests in multiple languages would be great

All of this is supplemented with test cases that verify parsing is correct in every one of 72 languages in am/pm. The only risk now is that Google will change formatting on their side. But for that, and other things I need https://github.com/maxpatiiuk/calendar-plus/issues/236 anyway, and that would be crucial in making my extension more stable.
The other change I did today is that on my machine only, if extension logs any warning/error, it will also be printed on the screen. So if any bug occurs while I am just passively using the extension rather than developing it, I will still notice that it happened (i.e if dom parsing will start failing, I will be notified quickly, at least in case of en, but my parsing is now pretty much language-independent)
In any case still, as soon as failure occurs, I fallback to API calls for the duration of the session.
All of the above is now implemented and functioning well. With some refactoring, it weights 1000 lines of code total. Plus 5.3k of lines of text fixtures.
Though, I now plan on simplifying my event duration calculation, caching and cache invalidation logic to simplify it, while also improving performance.


Fix sidebar layout

Fixes the sidebar being overlapped by the story river.
Before:

After:

Brilliant thanks a lot


[AMORO-3365]The table is always in committing state

Why are the changes needed?

Close #3365.

Codecov Report
Attention: Patch coverage is 37.50000% with 5 lines in your changes missing coverage. Please review.

Project coverage is 27.48%. Comparing base (243d289) to head (3fcc6ac).
Report is 15 commits behind head on master.

Files with missing lines
Patch %
Lines

...pache/amoro/server/optimizing/OptimizingQueue.java
37.50%
4 Missing and 1 partial :warning:

Additional details and impacted files
@@             Coverage Diff              @@
##             master    #3366      +/-   ##
============================================
+ Coverage     21.59%   27.48%   +5.89%
- Complexity     2309     3511    +1202
============================================
  Files           426      593     +167
  Lines         39719    48310    +8591
  Branches       5624     6234     +610
============================================
+ Hits           8577    13280    +4703
- Misses        30414    34096    +3682
- Partials        728      934     +206

Flag
Coverage Δ

core
27.48% <37.50%> (?)

trino
?

Flags with carried forward coverage won't be shown. Click here to find out more.

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

Thanks for the contribution!
Here are my thoughts:

The commits on the Iceberg table and the commits in the database are two separate processes. This issue is somewhat similar to a distributed transaction problem.
If the commit on the Iceberg table is successful but the database commit fails, we should attempt to retry until the database write is successful.
We should avoid making duplicate commits on the Iceberg table, as some repeated commits may lead to data duplication issues.

So the question arises:

when re-entering the commit process, how do we determine whether the commit on Iceberg has already been completed?

I am afraid the current implementation will fail when the AMS restart.


ClassAttributesSeparationFixer - Option to add blank lines only before items with PHPDocs

I'd like to have a new option for class_attributes_separation rule that makes it add blank lines before items with PHPDocs only, e.g.:
 class Foo
 {
     private $foo;
     private $bar;
 }

 class Bar
 {
     /**
      * @var int
      */
     private $foo;
+
     /**
      * @var int
      */
     private $bar;
 }

instead of:
 class Foo
 {
     private $foo;
+
     private $bar;
 }

 class Bar
 {
     /**
      * @var int
      */
     private $foo;
+
     /**
      * @var int
      */
     private $bar;
 }

Maybe the format of this option should mimic the format of option elements as one might not want to enable the new behavior for all kinds of element. I would make it default to constants and properties.
WDYT?

Not sure about the default, but it is an option requested multiple times so :+1:  for adding it.
Which new configuration format do you propose for this?

it is an option requested multiple times

I was pretty sure we already discussed something similar a while ago but I couldn't find it before opening this issue. I tried harder and just found https://github.com/FriendsOfPHP/PHP-CS-Fixer/pull/3098#discussion_r145252212.
I would still propose this solution actually, maybe with one more possible value: ignore. So:
[
    'const' => 'ignore | no_blank_line | single_blank_line | single_blank_line_if_phpdoc',
    'property' => 'ignore | no_blank_line | single_blank_line | single_blank_line_if_phpdoc',
    'method' => 'ignore | no_blank_line | single_blank_line | single_blank_line_if_phpdoc',
]

Though #4001 requests an option to set the number of blank lines added, so maybe not the best solution.

ah that is fine with me as well :)


query:thanos-query adaptive downsample by max_source_resolution

[ ] I added CHANGELOG entry for this change.
[ ] Change is not relevant to the end user.

Changes
here is a case: when user don't know how thanos downsample datas comes such as [raw,5m,1h]. And they may use a not suitable duration parameter [15s] like：
rate(foo[15s]& max_source_resolution=1h,
the result may be empty or only a little raw data of latest time.  because the promql funcrate must need two datas accross duration time,  max_source_resolution=1h, means there is only one data in 1h, the final result of rate will fail or loss data.
So , we add an adaptive method, it check the real duration time, and compared with max_source_resolution, if less than max_so.., the duration time will be changed to a suitable value.
Verification
in our systerm, we test it  by set :
a: rate(foo[15s]&start1627913400&end=1628086200&step=600&max_source_resolution=1h,
b:rate(foo[15s]&start1627913400&end=1628086200&step=600&max_source_resolution=5m,
a->a1:rate(foo[2h]&start1627913400&end=1628086200&step=600&max_source_resolution=1h,
b->b1:rate(foo[10m]&start1627913400&end=1628086200&step=600&max_source_resolution=5m,
the  result datas of a1 and b1 are in expectation than previous version of thanos-query.

yes，you are definitely right.
but i wonder there is no check of duration and max_source now. may i change the request by only return the error？
------------------ Original ------------------
From: Bartlomiej Plotka @.>
Date: Fri,Aug 6,2021 6:29 PM
To: thanos-io/thanos @.>
Cc: Jupiter @.>, Author @.>
Subject: Re: [thanos-io/thanos] query:thanos-query adaptive downsample by max_source_resolution (#4526)
@bwplotka requested changes on this pull request.
Thanks for this!
Unfortunately, this is by design. You want to control your vector range. Normally you don't want something to change your vector range suddenly - this may surprise everyone: Suddenly you do rate over 1h not 5m. If you do increase that changes "units" kind of too.
Also, imagine you don't have downsampling but you have just long scrape interval (e.g 5m) and then you do 4m - you will also hit same issue. Also what about dynamic resolution.
What about something different: It would be nice to return error in such cases potentially (why not) if max resolution is set and unrealistic vector range is set. WDYT?
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub, or unsubscribe.
Triage notifications on the go with GitHub Mobile for iOS or Android.

hi @bwplotka , i closed this request and submit a new one
https://github.com/thanos-io/thanos/pull/4529.
thanks.


[python] Fix and test over-indexing semantics

Issue and/or context:
#900
Changes:
Notes for Reviewer:

@bkmartinjr second thoughts -- we already decided we would not accept negative indices: #519


Convert Tachyon utility classes to consolidated component classes

Description
The Tachyon utility classes are convenient but cause class bloat. It would be cleaner to abstract them to component/module classes.

Formed new opinions about using utility CSS over module based CSS after listening to this Full Stack Radio episode.
Sticking with Tachyons for now 👍


disk_size is ignored when using source_vm_name

I have an image catalina-base with disk size 25G. I want to build a second image based on the first one, but with a larger disk size. I tried the following config file:
{
  "builders": [{
    "type": "veertu-anka",
    "disk_size": "50G",
    "source_vm_name": "catalina-base",
    "vm_name": "larger-catalina"
  }]
}

I would expect the new image to have disk_size 50G, but it is the same size as the previous image (25G)
$ anka show larger-catalina
+----------------+--------------------------------------+
| uuid           | 43112be1-302a-4598-86f7-60bfef72a6a1 |
+----------------+--------------------------------------+
| name           | larger-catalina                      |
+----------------+--------------------------------------+
| created        | 30 seconds ago                       |
+----------------+--------------------------------------+
| cpu_cores      | 2                                    |
+----------------+--------------------------------------+
| ram            | 2G                                   |
+----------------+--------------------------------------+
| display        | 1                                    |
+----------------+--------------------------------------+
| hard_drive     | 25Gi (23.7Gi on disk)                |
+----------------+--------------------------------------+
| addons_version | <IP_ADDRESS>                            |
+----------------+--------------------------------------+
| status         | suspended 24 seconds ago             |
+----------------+--------------------------------------+

This is intended or it's a bug?

@alephao Altering disk size is currently only implemented for newly created VMs
Thanks for reporting

@NivKeidan is this feature in the roadmap by any chance?

@alephao it's being put in product pipeline to discuss.

@alephao , thanks for your patience with this. We've released the fix for this in https://github.com/veertuinc/packer-builder-veertu-anka/releases/tag/v1.5.0


docs: double the word on Plugins section

Hi, A little grammar error there:

It can be fixed easily just removing the duplicated the word in the file docs/latest/concepts/plugin.md:83:29

Just in case, i tried to open a pr, but i couldn't due a git error (permission denied)

@Iuriiiii The way Pull Requests work in GitHub or elsewhere is that you fork the repository, push your changes to a branch in your fork and the create a pull request from your fork that targets the original repository. The permission error you're seeing means that you tried to push the branch into this repository instead of your fork. Create a fork first.

@Iuriiiii The way Pull Requests work in GitHub or elsewhere is that you fork the repository, push your changes to a branch in your fork and the create a pull request from your fork that targets the original repository. The permission error you're seeing means that you tried to push the branch into this repository instead of your fork. Create a fork first.

JAJAJAJAJA You're right!! So sorry, long time ago since I done a PR to a open source project, my bad 😬


Jailbreak + Untether succeeded, but Restore rootfs in a few seconds after boot

After tapping "Reboot now", it reboots again after a few seconds.
When I open the Fugu14 app again, it is back to "Jailbreak + Untether" display.

iPhone XR ,14.4.2

Fixed!

tap “Jailbreak + Untether”
reboot safemode directry
run “irecovery -s” on pc terminal
run "setenv boot-args x" and "reboot"
open Fugu14 app, and tap "Update Untether"
Enjoy


svelte-language-server: 0.17.0 -> 0.17.5

Fixes #355121
Things done

Built on platform(s)

[x] x86_64-linux
[ ] aarch64-linux
[ ] x86_64-darwin
[ ] aarch64-darwin

For non-Linux: Is sandboxing enabled in nix.conf? (See Nix manual)

[ ] sandbox = relaxed
[ ] sandbox = true

[ ] Tested, as applicable:

NixOS test(s) (look inside nixos/tests)
and/or package tests
or, for functions and "core" functionality, tests in lib/tests or pkgs/test
made sure NixOS tests are linked to the relevant packages

[ ] Tested compilation of all packages that depend on this change using nix-shell -p nixpkgs-review --run "nixpkgs-review rev HEAD". Note: all changes have to be committed, also see nixpkgs-review usage
[x] Tested basic functionality of all binary files (usually in ./result/bin/)
25.05 Release Notes (or backporting 24.11 and 25.05 Release notes)

[ ] (Package updates) Added a release notes entry if the change is major or breaking
[ ] (Module updates) Added a release notes entry if the change is significant
[ ] (Module addition) Added a release notes entry if adding a new NixOS module

[x] Fits CONTRIBUTING.md.

Add a :+1: reaction to pull requests you find important.

@wegank
Sorry to ping you. I noticed that you closed the last PR regarding this package. So, if you could review this one as well, that would be great. Thanks!


Stream statistics

Would be nice to be able to get information/stats about the streams that are currently published:
Video/audio codec, bitrate, resolution, bytes sent/received, fps
Something similar to this:
https://github.com/illuspas/Node-Media-Server#streams-stats
It would be nice to have this as an HTTP endpoint, but any way of getting it programatically would be OK as well.

Hi @datagutt
The audio/video statistic information can be queried now using HTTP api, you can try the new feature and make some suggestions if you wish..


Losing themes are reload

I have installed and setup the solorized theme but if I close out of powershell and reopen its not showing that theme and I need to re-run the config command

This is for concfg right? Make sure you sudo concfg import solarized and choose 'Yes' when it asks
overrides in the registry and shortcut files might interfere with your concfg settings.
would you like to find and remove them? (Y/n):

The registry and .lnk file that you use to start Powershell can have their own settings so doing it this way should clear them out.

@jrock2004 Were you able to resolve this?


Maximize/zoom editor pane - menu or button on editor tab

I have looked at relevant related issues

and yes, related issues already exist. But none of them satisfy exactly nor have closed with this aspect properly addressed, so here goes:

My favourite linux terminal is Tilix, formerly known as Terminix, and it is similar to Terminator, but styled along Gtk+-3, but both terminals have multi-panel terminals with the ability to zoom one panel to fill the window's total content area.
There is one button on the header bar for the terminal panes that appears when not in maximised state, and when it is clicked, this panel becomes the sole panel in the group, with a button to minimise it.
I realise there is commands that do somewhat similar things, such as the view menu's 'Editor Layout -> Single', which joins all of the editor panes into one, merging their component tabs into a single view, but this can't be reversed, which means you can't 'maximize' and then reverse what you did.
(yes, maybe if this editor view region state data had an undo log this would also satisfy the brief)
As to the implementation, the way I see it working is that it switches all other editor panes display attribute to 'none' and adds a node on the right of the panel's tab bar (in menu or a separate button) that reverses this and reverts to the previous state.
It doesn't have to hide the other tabs within the maximised pane, specifically one wants the total state of the editor panel region to retain its non-maximised state information, but make it inaccessible until you revert the maximization to the prior state.
I should note that a journal of the editor state would also satisfy this feature request, but that I believe such an addition is far more complex and would still have the problem of less accessibility of the feature, hiding in related but deep-embedded parts of the existing interface, when it would make more sense to implement it as I described - something like the maximize state used for windows in almost every window manager.

fyi @sbatten

I also want this is a big way

I too would love this. The common use case is i have a hierarchy of files open that have parent child relationships in my react tree and I want all 4-5 of them open, with the ability to "zoom" into anyone of them and then back out while maintaining that list.


Pass full local files to OpenAI API

Describe the feature
One of the important limitations that I have in the current implementation is that I would like to pass json/csv files of input data and expected output data to OpenAI API and ask it to generate a function or method to perform the transformation. VSCode has access to all files in the current workspacefolder and being able to pass them to OpenAI API would be very helpful

You can already do this with "Editor selection".
But, I'll leave this issue open for an easier way to select (multiple) files. The thing is adding entire files is a quick way to max out token count. But, the nice thing about CSVs is that you can just give it the header row, and maybe a couple real data rows, and usually that's all it needs, so providing the whole data file is often not needed.

I understand this ask is partly coming from expectations that ChatGPT Reborn do a lot of the same things that the ChatGPT Web UI can do, so I'll look for ways to make the UI feel more familiar to ChatGPT Web UI users.

Hi @Christopher-Hayes , I read that chromadb supports a Javascript Client. I am not experienced with vscode exstensions, do you think we could integrate it in ChatGPT Reborn? The usecase would be: on button press embedd a set of (supported) local files and the open a chat panel to chat with them.
My only concern is that iusing a local model for embedding is tassative on cpu while using remote services like chatgpt is expensive...
https://github.com/chroma-core/chroma

@raphael2692 yeah looks possible. The db seems like the easier part, the harder part is knowing when to use text embeddings and making work in a way that isn't confusing for the end user.

Marking planned, but this extension needs to support the "Assistants API" first. So, that needs to come first, once we support it, uploading files to the assistant should easy.


[Grouping&Mapping] Add custom calculation formula validation

Adds custom calculation formula validation in the UI. Now the formula is being validated client side, so the user should be getting specific error messages describing what is wrong with the formula

because you're adding the validation into the package itself, I have to ask.. is the validation possible via REST API?
assuming we have an API available for other parties to use, wouldn't they need a similar check? and then if they do, do we really need to have it client side too (as opposed to making an API call)?

because you're adding the validation into the package itself, I have to ask.. is the validation possible via REST API? assuming we have an API available for other parties to use, wouldn't they need a similar check? and then if they do, do we really need to have it client side too (as opposed to making an API call)?

The API returns a generic error that the formula is wrong and does not provide any explanation. This is the main reason why it needs to be checked client side.


dx12: Adopt BAL approch

PoC for switching towards the BAL concept suggested in #2249

New /src structure:

- /bal
--- /dx12 (gfx-bal-dx12)
- /hal
--- /dx12 (gfx-hal-dx12)
--- /src (gfx-hal)

backend/dx12 moved to hal/dx12
hal/dx12 has a new dependency on bal/dx12

Source code from HAL will be gradually refactored into the corresponding BAL backend in order to slim down the HAL implementation and move 'unsafe' portions into BAL (ie zero cost wrappers over d3d12 structs)
Upcoming PR should be a rustfmt as the backend code doesnt seem to be formatted at all (?)

Hmm, I'm not sure it's worth it for us to split the backends into HAL/BAL sections. It would introduce longer dependency chains for us and clients. Couldn't the backend crates just provide both? Assuming HAL implementation is mostly just wrapping around BAL primitives.

The native part is moved out into the d3d12-rs crate.
The transition of the current HAL backend is partially done in https://github.com/gfx-rs/gfx/pull/2374
Moving out common pieces like blitting will done in a separate PR.


[Bug]: docker: 'compose' is not a docker command.

Description
Just installed coolify on an aws ec2 instance, but somehow the proxy will not start and throws this error: docker: 'compose' is not a docker command.
Minimal Reproduction (if possible, example repository)
Install coolify v4 beta 297
install Docker version 25.0.3
install Docker Compose version v2.27.2

Exception or Error
error: docker: 'compose' is not a docker command.
Version
v4 beta 297

Perhaps the install script should be improved, to check if the docker compose call works.

Any suggestions how i should debug it? :)

@Manubi Yes, reinstall docker in a way that docker compose just works fine.

I changed from the Amazon linux to ubuntu and it works.... guess just stay with the stuff that works. :)

Can you close the issue? That will help clean up the big list a bit. Unfortunately, it seems maintainer does not have time to manage all issues (@Manubi )


python312Packages.py3status: Fix typelib

cannot import name GLib, introspection typelib not found
Closes https://github.com/NixOS/nixpkgs/issues/324796

Things done

Built on platform(s)

[ ] x86_64-linux
[ ] aarch64-linux
[ ] x86_64-darwin
[ ] aarch64-darwin

For non-Linux: Is sandboxing enabled in nix.conf? (See Nix manual)

[ ] sandbox = relaxed
[ ] sandbox = true

[ ] Tested, as applicable:

NixOS test(s) (look inside nixos/tests)
and/or package tests
or, for functions and "core" functionality, tests in lib/tests or pkgs/test
made sure NixOS tests are linked to the relevant packages

[ ] Tested compilation of all packages that depend on this change using nix-shell -p nixpkgs-review --run "nixpkgs-review rev HEAD". Note: all changes have to be committed, also see nixpkgs-review usage
[ ] Tested basic functionality of all binary files (usually in ./result/bin/)
25.05 Release Notes (or backporting 24.11 and 25.05 Release notes)

[ ] (Package updates) Added a release notes entry if the change is major or breaking
[ ] (Module updates) Added a release notes entry if the change is significant
[ ] (Module addition) Added a release notes entry if adding a new NixOS module

[ ] Fits CONTRIBUTING.md.

Add a :+1: reaction to pull requests you find important.

Just out of curiosity looked whole list of depenencies and found out that pydbus can be removed from list, because at py3status 3.60 we stopped using pydbus.
Found it in two lists:
https://github.com/NixOS/nixpkgs/blob/47e0d37b8ad949319ff261d750baed7d4b500971/pkgs/development/python-modules/py3status/default.nix#L16
and https://github.com/NixOS/nixpkgs/blob/47e0d37b8ad949319ff261d750baed7d4b500971/pkgs/development/python-modules/py3status/default.nix#L43

Just out of curiosity looked whole list of depenencies and found out that pydbus can be removed from list, because at py3status 3.60 we stopped using pydbus. Found it in two lists:
https://github.com/NixOS/nixpkgs/blob/47e0d37b8ad949319ff261d750baed7d4b500971/pkgs/development/python-modules/py3status/default.nix#L16
and
https://github.com/NixOS/nixpkgs/blob/47e0d37b8ad949319ff261d750baed7d4b500971/pkgs/development/python-modules/py3status/default.nix#L43

The package was still at 3.59, updated it and removed the dep


A question about why bin/kafka-consumer-groups.sh can print the lag but burrow can't

There is a question that I can use bin/kafka-consumer-groups.sh  --zookeeper xxx:2181 xxx:2181 xxx:2181  --describe --group group-demo to check the lag ,but using curl -s http://<IP_ADDRESS>:8000/v3/kafka/local/consumer/group-demo/lag can't print the lag,it prints "{"error":false,"message":"consumer status returned","status":{"cluster":"local","group":"group-demo","status":"NOTFOUND","complete":1,"partitions":[],"partition_count":0,"maxlag":null,"totallag":0},"request":{"url":"/v3/kafka/local/consumer/group-demo/lag","host":"newsclient-kafka-mq178v11-taiji"}}"
I want konw why and how to resolve it,thank you.

https://github.com/linkedin/Burrow/issues/71
I find this answer may be useful


I can't start the game after I updated to v<IP_ADDRESS>

I also installed .net framework 7.0 and latest  visual C++ distributable (both x64 and x84 ). But when I start the game after mounting the virtual disc and this shows up "Unknown error when launching the game: The process cannot access the file 'c:\games\final fantasy vii\7thWrapperProxy.runtimeconfig.json' because it is being used by another process." I already tried what i can but it didn't fix the issue.  Please help me with this issue

There has been an announcement on the Discord channels about this. But long story short see the instructions here: https://github.com/tsunamods-codes/7th-Heaven#install
I personally suggest to use the installer we provide as it is the easy path.


how to run app after run command "npm run deploy:prod" ?

open index page in browser as static site on local file system or hosted on nginx - fact is working,
but current route render to
Please show me fix this trouble

http-server dist/

Hi @dark4eg,
You can run node ./bin/server.js.
This will boot up express server with connect-history-api-fallback (This is probably what you need for running a SPA).
If you check ./server/main.js#L42-L55 which is required by ./bin/server.js script, you'll see that the express server will boot up using ./dist folder as a static folder.
This should work as what you need.
If you want to start it with special NODE_ENV, you can do it by running:
NODE_ENV=production node ./bin/server.js
...or even better you can add npm run server script to your package.json.
It could look something like this:
...
    "scripts:: {
        ...
        "server": "better-npm-run server"
        ...
    },
   ...
   "betterScripts": {
        ...
        "server": {
            "command": "node ./bin/server.js",
            "env": {
                "NODE_ENV": "production",
                "DEBUG": "app:*"
            }
        },
        ...
   }
...

Hope this helps ;)
PS: Maybe it would be good to add similar script to the kit.
@davezuko What do you think?
Regards,

@bulicmatko yes, thanks)


Unlock the cheat code of the universe

Huge performance boost

Why backend/web/? I find it confusing with web/ folder. Otherwise, seems good to me!

Hmmm pcq c'est le http server. Maybe http instead?


add datasource name to alert

What this PR does / why we need it (변경 내용 / 필요성):
멀티 데이터소스에 대한 alert 기능을 지원함에 따라...
alert에도 데이터소스 정보를 포함시킬 필요성이 생겼고 이를 구현하였습니다.
Which issue(s) this PR fixes (관련 이슈):

#98

Special notes for your reviewer (리뷰어에게 하고 싶은 말):
리뷰 감사합니다.
Additional documentation, usage docs, etc. (기타 관련 문서, 사용법 등):
없음

Codecov Report
Patch coverage: 72.65% and project coverage change: +25.61% :tada:

Comparison is base (6fa8f8c) 40.76% compared to head (2243ce7) 66.37%.
Report is 39 commits behind head on main.

:exclamation: Your organization is not using the GitHub App Integration. As a result you may experience degraded service beginning May 15th. Please install the Github App Integration for your organization. Read more.
Additional details and impacted files
@@             Coverage Diff             @@
##             main      #99       +/-   ##
===========================================
+ Coverage   40.76%   66.37%   +25.61%
===========================================
  Files          19       32       +13
  Lines         628     1264      +636
===========================================
+ Hits          256      839      +583
- Misses        341      369       +28
- Partials       31       56       +25

Files Changed
Coverage Δ

pkg/handler/api/error.go
0.00% <0.00%> (ø)

pkg/handler/config.go
50.00% <0.00%> (ø)

pkg/handler/handle_spa.go
33.33% <ø> (ø)

pkg/handler/auth.go
2.15% <6.06%> (+0.24%)
:arrow_up:

pkg/mocker/client/client.go
6.45% <6.45%> (ø)

pkg/handler/datasource.go
15.38% <15.38%> (ø)

main.go
28.00% <30.00%> (ø)

pkg/service/user/user.go
23.68% <30.00%> (ø)

pkg/handler/dashboard.go
50.00% <50.00%> (ø)

pkg/service/discovery/kubernetes/kubernetes.go
61.42% <50.00%> (ø)

... and 22 more

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


Reclaim disk space in an initial step while running the CI jobs

Description of your changes

Relevant PR: https://github.com/upbound/uptest/pull/188
This PR enables the disk clean-up step in the CI workflow to fix the failing check-diff, unit-tests & local-deploy jobs in this branch. For more context, please refer to https://github.com/upbound/uptest/pull/188. Please also see this comment.
I have:

[x] Run make reviewable test to ensure this PR is ready for review.

How has this code been tested

Via the job run here.

Please note that the publish-artifacts is expected to fail when consuming the reusable workflow from ulucinar/upbound-provider-aws, because Gtihub does not allow self-hosted runners to be used across different organizations.


Deduplicate Librispeech code

Right now the two Librispeech Jax workloads have some duplicate components, we should have deepspeech import the conformer versions.
We should also clearly document in the data pipeline and in multiple places in the workload that the paddings are inverted so that submitters are less confused.

I refactored part of the Deepspeech code to fix a bug where Deepspeech where Deepspeech was unintentionally inheriting some Conformer workload properties. Won't fix any further.


Subprocess Popen sometimes blocking resources and crashing ETLs

After instituting the new Popen loop for transforming files I observed the following error during the transform step of a large ETL (15K files).
Encountered exception during execution:
Traceback (most recent call last):
  File "/usr/local/lib/python3.10/dist-packages/prefect/engine.py", line 1581, in orchestrate_task_run
    result = await call.aresult()
  File "/usr/local/lib/python3.10/dist-packages/prefect/_internal/concurrency/calls.py", line 181, in aresult
    return await asyncio.wrap_future(self.future)
  File "/usr/local/lib/python3.10/dist-packages/prefect/_internal/concurrency/calls.py", line 194, in _run_sync
    result = self.fn(*self.args, **self.kwargs)
  File "/etls/prefect/etl_methods.py", line 26, in transform
    raise e
  File "/etls/prefect/etl_methods.py", line 23, in transform
    manager.transform()
  File "/usr/local/lib/python3.10/dist-packages/zarr_etl_tools/dataset_manager.py", line 197, in transform
    self.prepare_input_files()
  File "/usr/local/lib/python3.10/dist-packages/zarr_etl_managers/ETL.py", line 323, in prepare_input_files
    self.fils_to_nc4s(input_dir, keep_originals)
  File "/usr/local/lib/python3.10/dist-packages/zarr_etl_managers/prism.py", line 342, in fils_to_nc4s
    self.parallel_subprocess_files(fils, command_text, '.nc', keep_originals)
  File "/usr/local/lib/python3.10/dist-packages/zarr_etl_tools/utils/zarr_methods.py", line 206, in parallel_subprocess_files
    processes = [ Popen(command) for command in commands ]
  File "/usr/local/lib/python3.10/dist-packages/zarr_etl_tools/utils/", line 206, in <listcomp>
    processes = [ Popen(command) for command in commands ]
  File "/usr/lib/python3.10/subprocess.py", line 969, in __init__
    self._execute_child(args, executable, preexec_fn, close_fds,
  File "/usr/lib/python3.10/subprocess.py", line 1778, in _execute_child
    self.pid = _posixsubprocess.fork_exec(
BlockingIOError: [Errno 11] Resource temporarily unavailable

This crashes the ETL in question.
To investigate

What causes the issue?
Can it be resolved just by waiting, and if so, how to wait?
Would assigning additional resources to Popen resolve the issue?

Our working assumption is that the for loop spawns all len(processes) processes at once, overwhelming available resources. By forcing it to only process 100 at a time we hope to address this issue via #21 .
Passes local tests, awaiting testing in prod

Passes tests in prod, addressed by #25


feat(game): added money mechanic

Added MoneyManager class and implemented betting mechanic.

Needs commenting in code. PR pending.


Node name prefix

Is there any particular reason the node driver has a defaultNodeNamePfx for each node?
Thanks!

I don't believe there was a functional reason for it, no. The prefix was more about making it easier to identify which instances were created by the docker-machine.

Node name prefix removed in version v1.2.0

Oh, got it. However, I think Rancher already assigns a name to the machine based on the node pool name.
Thank you for the quick fix!


Generalise from Aff to MonadAff

Unfortunately there needs to be a MonadEff constraint jammed in there too to make it work out, I think...

Disregard that, I found a way around it by lifting and internal Eff into an Aff and then lifting that into MonadAff eff m.

Looks good, but would it be simpler to add produce' = hoist liftAff <<< produce instead?

:see_no_evil:
Yes it would, but that would involve applying common sense. I'll revise accordingly.

How's this? Or would you rather have produce and produce' varieties?

I think I'd like to keep them separate, just because I'm concerned about type inference.

Done

Good stuff. Also, now it's a minor version bump :smile:


how to store url preview in a cache memory , any reference ?

Hi @abraraltaf92 what do you mean by cache memory? We provide a callback which returns fetched preview data, what you do with it we don't care, but you need to provide saved preview data to the LinkPreview widget in order for the widget to work correctly. The most obvious way to store the data is local state, but it can be whatever you want.

Gotcha! thanks


BT VFS SPP should use errno 'EWOULDBLOCK'

Is your feature request related to a problem?
I'm using the Bluetooth Classic SPP profile provided by esp-idf bluedroid, in VFS mode.
The VFS mode allows the user to mak non-blocking calls to read() write() and close() functions.
I expected the interface to behave just like fd streams or sockets opened with the O_NONBLOCK flag, but this is not the case.
Assume the call "len = read(fd, ...);"
Expected:
if the user disconnected: len=0
if there's no data available: len=-1 and errno=EWOULDBLOCK
BT SPP VFS:
if the user disconnected: nothing
if there's no data available: len=0
This divergence divergence doesn't allow SPP fds to be used like normal fds.
In my current project, for example, I use both TCP sockets and SPP fds in two separate arrays.
Since they work differently, I need to have some almost duplicate code to treat the inputs.
Describe the solution you'd like.
The bluetooth SPP VFS should set len=-1 and errno=EWOULDBLOCK when no data is available.
It would also be interesting to have a VFS blocking mode for the SPP API.
Describe alternatives you've considered.
No response
Additional context.
No response

Thanks for reporting.


v1.13.0 broke some styles

Renderer
v3
Browser
Chrome
Operating System
Windows
What happened?
I had some quick headers was used inside a common line of text as global styles that now no longer work. For example, a tag like this
A black text, <h7>a red text</h7> and a black text again

with a simple CSS like
h7 {color: red}

It used to work fine, but now it seems that they are no longer recognized as headers and don't appear colored.
I don't know if there is a way to revert this change if this is a bug, or if there is a better way to define quick styles for texts inside a paragraph without requiring a lot of code.
Code
No response

The preferred way to do this is with the curly bracket syntax:
Here is {{myCustomStyle some text}}.

And then the CSS:
.myCustomStyle {
  color: red;
}

Or even:
Here is {{color:red some text}}.

However, your approach should still work. We will look into this.

H7 is not a standard html element. Headings are h1 thru to h7.
That said, unrecognised html elements would normally be treated the same as span elements as far as { display: inline; }.
Looking at the html that is rendered into the preview ... and there is no trace of the <h7>.
The unrecognised html has been stripped out. This release has DOMPurify active, which I suspect is causing this.

Yeah, my use of headers was useful before on legacy cause typing a header with an autocomplete was quick, but I think using curly brackets is even faster and I keep using the correct standards.
Thanks all for the help and the care in explaining how it works.

Reopening this to track the actual issue described in the new title


Make CI green

CI is red.
Make CI green.

"development" is failing.
Fix "development".

remove implements Dynamic
CI happy


181 migrate pandas usage to copy on write and remove copy arg from transforms

Set pd.options.mode.copy_on_write = True. This will become default in pandas 3.0.0 so it is recommended to turn it on now to get the benefits & ensure code is compliant with the upcoming changes (https://pandas.pydata.org/docs/dev/user_guide/copy_on_write.html). CoW stops making copies of the entire df unecessarily, instead just copying columns that change. It also prevents the original df changing when a view of the object is altered (see link for more info) & should limit the incorrect setwithcopy warnings. However it will still alter the original df in the following snippet, as it is not creating a view of the original df df_temp = df. Therefore, to prevent this I have enforced views to make use of CoW with the following: df = df[df.columns]
As the copy argument is no longer needed, I have added a warning to the copy argument of the base transformer, informing that it will soon be deprecated and updated the tests to drop this argument. I have not updated the example nbs as the notebooks were already generating errors and needed updating with the latest changes - I will open up a separate issue for this.
CoW was only added as optional in pandas 1.5.0 so I have also updated the requirements for tubular enforcing this new lower limit.
Profiling of updated changes (using same approach as in pyarrow tubular benchmarking repo)
Current results:

Proposed results:

There is a very marginal increase in the overall time to transform the df, however making these changes will allow us to implement faster options going forward e.g. polars

There are some merge conflicts with main now - and importantly CI with ruff rather than black/bandit. ruff format . or ruff . --fix should sort most things out.
I had a look through the repo - where is profile_tubular.py? I think it interesting that the profiling script went up - my naive play with a couple of transformers and setting the copy flag to false cut compute time in roughly half and decreased memory allocations by 70% or so. It might be worth kicking more thorough profiling to #182?

I have not updated the example nbs as the notebooks were already generating errors and needed updating with the latest changes - I will open up a separate issue for this.

Consider hooking into #191?

I've pulled in the latest changes and fixed the merge conflicts with main. I've also included the profiling scripts. The above screenshots are from me pulling down the code and running profiling as it was easier to compare to the current main branch. But I've included it here in order to see what is being tested. I don't know if we want to include these files going forward or not

Very nice - any puts us in a good place to tackle #185


etcd-rejoin uses wrong service name

Description
When rkt was removed, the etcd service got renamed from etcd-member to etcd but the etcd-rejoin script was not updated to use the new name. (cc @surajssd)
Impact
Recreating a broken controller node does not work, making an HA control plane cluster not really HA.
Environment and steps to reproduce
Delete a controller node and create it again through cluster apply --skip-pre-update-health-check
Error log:
Feb 16 20:22:59 controller2.lokomotive etcd-rejoin[18701]: grep: /etc/systemd/system/etcd-member.service.d/40-etcd-cluster.conf: No such file or directory
Feb 16 20:22:59 controller2.lokomotive etcd-rejoin[18555]: /opt/etcd-rejoin: line 39: /etc/systemd/system/etcd-member.service.d/40-etcd-cluster.conf: No such file or directory

lokoctl health output:
etcd-1    False     Get "https://controller2.lokomotive:2379/health": dial tcp <IP_ADDRESS>:2379: connect: connection refused
etcd-0    True    {"health":"true"}
etcd-2    True    {"health":"true"}

Expected behavior
Additional information

There are many places where etcd-member is still used (grep for it), also in the docs, they all need to be updated to etcd.service.

Ah, and instead of the drop-in which set up the environment now there is an env file /etc/kubernetes/etcd.env

Even with updating these parts I still run into this error:
Feb 16 21:23:28 controller2.lokomotive docker[37136]: 2021-02-16 21:23:28.238069 C | etcdmain: cannot access data directory: open /var/lib/etcd/.touch: permission denied

After the existing folder is moved, I added commands to create a new folder with the right settings.


[MINOR] Add Text in powered_by

Tips

Thank you very much for contributing to Apache Hudi.
Please review https://hudi.apache.org/contributing.html before opening a pull request.

What is the purpose of the pull request
Add text in powered_by page.
cc @lamber-ken @vinothchandar

@lamber-ken Thanks for your review, merging.


Add 3OMB pools

@AABeely could you get in contact with Zapmore, may be possible that 3omb would launchpool again?


ic-push-url not working

In this case, the ic-push-url not working
 <input type="text" name="text" ic-push-url="true" ic-get-from="/get_url" ic-trigger-on="keyup changed"
                           ic-target=".wraper-list" ic-trigger-delay="500ms" placeholder="Enter Some Text"/>

How to make GET parameters passed in the address bar of the browser?

In this case the best option would be to use the X-IC-PushURL response header in the response from the server to push only the parameters you want into the browser bar.  The problem is that intercooler sends up all sorts of parameters, so you need to specify which ones in particular should be part of the pushed URL.
Make sense?


Error:Execution failed for task ':apk:processTargetSdk22NormalMapEditorDebugGoogleServices'. > File google-services.json is missing. The Google Services Plugin cannot function without it.

I build the project and it show :
`Error:Execution failed for task :apk:processTargetSdk22NormalMapEditorDebugGoogleServices.

File google-services.json is missing. The Google Services Plugin cannot function without it.
Searched Location:
/home/lizhenxin/AndroidStudioProject/iosched-master/apk/src/targetSdk22NormalMapEditor/debug/google-services.json
/home/lizhenxin/AndroidStudioProject/iosched-master/apk/src/debug/targetSdk22NormalMapEditor/google-services.json
/home/lizhenxin/AndroidStudioProject/iosched-master/apk/src/targetSdk22NormalMapEditor/google-services.json
/home/lizhenxin/AndroidStudioProject/iosched-master/apk/src/debug/google-services.json
/home/lizhenxin/AndroidStudioProject/iosched-master/apk/google-services.json`

I have read the Build instructions in README.md, but I canot find the items in step 3(Tools > Android SDK Platform-tools - Tools > ............) . I only install the Google Play services in SDK Manager > SDK Tools but It is wrong yet.

Obsolete after the 2018 version rewrite.

its fine https://github.com/google/iosched/blob/master/shared/google-services.json commited in version control?


Rebasline RealLifeAndroidStudioPerformanceTest

To accept a 2~3% regression

@bot-gradle test and merge

Your PR is queued. See the queue page for details.

OK, I've already triggered a build for you.


Throw exception "cannot read properties of null" when using xReadGroup

Description
Here is the exception:
"TypeError: Cannot read properties of null (reading 'length')\n    at transformTuplesReply  ***
 at transformStreamMessageReply (*** )\n    at Array.map (<anonymous>)\n    at transformStreamMessagesReply (***)\n    at ***@redis/client/dist/lib/commands/generic-transformers.js:95:19\n    at Array.map (<anonymous>)\n    at Object.transformStreamsMessagesReply

The function transformTuplesReply  of  generic-transform.js  didn't handle the null raw reply from the stream api.
// in generic-transform.js
function transformTuplesReply(reply) {
    const message = Object.create(null);
    for (let i = 0; i < reply.length; i += 2) {
        message[reply[i].toString()] = reply[i + 1];
    }
    return message;
}

Node.js Version
v20.16.0
Redis Server Version
6.2.6
Node Redis Version
<EMAIL_ADDRESS>Platform
MacOS, Linux
Logs
"TypeError: Cannot read properties of null (reading 'length')\n    at transformTuplesReply  ***
 at transformStreamMessageReply (*** )\n    at Array.map (<anonymous>)\n    at transformStreamMessagesReply (***)\n    at ***@redis/client/dist/lib/commands/generic-transformers.js:95:19\n    at Array.map (<anonymous>)\n    at Object.transformStreamsMessagesReply

Additional, I found another situation that stream read will return null.

By design, Redis doesn't prevent the deletion of entries that are present in the stream's PELs. When this happens, the PELs retain the deleted entries' IDs, but the actual entry payload is no longer available. Therefore, when reading such PEL entries, Redis will return a null value in place of their respective data.
https://redis.io/docs/latest/commands/xreadgroup/


Make it possible to set empty password

Hey,
I've been using your Image for quite some time, so thanks for making it!
It's only been running locally, so entering a password was always a hurdle for me to access the wiki.
Because of Bash substitution, so far it was not possible to set an empty password, and spaces inside password or username would mess with the command execution unless specifically wrapped with escaped quotes.
I decided to leave in the old replacement for usernames (meaning empty turns to default), as an empty username would possibly mess with TiddlyWiki.
Unless it's planned that way, the proposed changes here take those things into account.

Thanks and sorry for the late response! Looks good.