[WIP] Teach the haskell backend about -ddump-stg (to dump out the haskell IR)

Since I'm working on simplexhc, I want to use godbolt to show off the differences between my compiler and GHC. However, to do this, I need to be able to dump stg from ghc.
This patch is very rough, so I'll iterate on this. Do you have any initial feedback about how I'm doing this?

Also note that currently, the tests are failing. You can see why at the travis ci link, or by running make tests on your local machine
:)

make test dies for me with:
/usr/local/bin/node ./node_modules/.bin/jshint app.js lib/asm-cl.js lib/asm-docs-api.js lib/asm-docs.js lib/asm.js lib/aws.js lib/base-compiler.js lib/cfg.js lib/compilation-env.js lib/compile-handler.js lib/compilers/6g.js lib/compilers/argument-parsers.js lib/compilers/default.js lib/compilers/gcc.js lib/compilers/haskell.js lib/compilers/ispc.js lib/compilers/ldc.js lib/compilers/rust.js lib/compilers/swift.js lib/compilers/Wine-CL.js lib/compilers/WSL-CL.js lib/exec.js lib/logger.js lib/properties.js lib/restreamer.js lib/sources/browser.js lib/sources/builtin.js lib/utils.js static/alert.js static/asm-mode.js static/ast-view.js static/cfg-view.js static/colour.js static/compiler-service.js static/compiler.js static/components.js static/conformance-view.js static/cppp-mode.js static/d-mode.js static/diff.js static/editor.js static/fontscale.js static/haskell-mode.js static/hub.js static/ispc-mode.js static/loadSave.js static/local.js static/main.js static/monaco.js static/opt-view.js static/options.js static/output.js static/rison.js static/rust-mode.js static/settings.js static/sharing.js static/swift-mode.js static/themes.js static/toggles.js static/url.js static/urlshorten-google.js
/Applications/Xcode.app/Contents/Developer/usr/bin/make -C c-preload test
cat tests/testfile | ./compiler-wrapper g++ -std=c++0x -S -o /tmp/allowed -x c++ -
./compiler-wrapper: line 19: ulimit: virtual memory: cannot modify limit: Operation not permitted
cat tests/bad-includes | ./compiler-wrapper g++ -std=c++0x -S -o /tmp/allowed -x c++ - 2>&1 | grep denied
make[1]: *** [test] Error 1
make: *** [test] Error 2

@bollu Sorry for the missunderstanding, you're meant to run npm test, not make tests, as those test virtualization stuff. With npm, tests should now pass
:)

Yep, so now the tests pass. What next?

@RabsRincon @jaredwy Ping, could I have some help pushing this patch through, please?

Hello! Sorry for the radio silence, we've been busy around here.
We'll take a look "today" about merging this. Thanks for your patience!

@RabsRincon  thanks for all the help :) So, is there something blocking this?

Have you checked if this changes something else unintendedly? I'll also look into it but would be great to  hear if you've checked it (No worries if you haven't!)

(wasn't able to figure out how to reply right next to the comment)
So, this should not change anything, because (as far as I understand) in JS, extra parameters are safely ignored.

@RabsRincon I addressed the other comments. Could you please have another look?

Thanks again for your patience, I'm sorry to keep you witing every time.
I'd love to merge but we have a problem:
As @jaredwy mentioned, I'm not too sure about the global variable for the usedStg being there. What happens when:
1) One person A sends a compilation such that the value is true
2) Another person B compiles such that the value is set to false
3) A's compilation result arrives
Is A's value true or false? (My guess is that it is indeed false) If you can confirm that it's true that would be great, but if not, try not to use a global variable. Maybe pass the selected option from the filters object/user options/another relevant variable?

That's the question here. I'm not the sharpest today (Already confused this PR with the other one twice...) so it might be better for someone else to answer the question, even if I shoud know by now if it does or not! (Sorry!)
So @mattgodbolt: Will the global variable be an issue as I explained in https://github.com/mattgodbolt/compiler-explorer/pull/599#issuecomment-346621367?

Re: global variable, there's no separate instance per user. There's many instances of CE running on Amazon, so it's random which instance you'll get, but if you can't rely on global variables for two reasons:

Between compiles you might end up on a different node
Even on the same node there are multiple compiles going on at once and so if one compile sets the global variable it'll affect the other still running.

If not, I will indeed have to pass this state. Do you have a recommendation
about how I should pass this state?
Every step of the compilation gets some arguments to work with. You only need to find the ones that are shared between the moment you know that stg is being used, and the moment that you need to know if it has been used. I'm sorry that I can't be more specific, but hpefuly you get the general idea

Sorry for the delayed comment:
If that's the case that there are multiple instances, there are more serious problems with the patch:
The STG is written out to a separate file which is then read back in. If multiple users use the same instance, then it is quite possible that one user's output is overwritten by another.
Is there some way to unique a connection with the compiler instance? As in, I need the compile and postProcess step to be able to create a unique folder name per request, in some sense.

@bollu Within the processing of a single request, each request gets its own directory. I imagine the STG output will be in the same directory. This is fine.
One node processes many requests at once: we cannot have global variables. But we can have many requests, each with their own state, and own directory containing compiler output.
One request is processed by a single node. However a subsequent request may go to another node: a compilation output cannot be reused by a subsequent request.
Hopefully that helps clear up a little of the things that are shared and that are not.

@mattgodbolt Thank you, that does help. However, I am still confused about this: what is the granularity of a "request"? I would have assumed preProcess +  compile + postProcess as one "request".
If that intuition is right, then the question still stands: how do I share "state" between compile and postProcess? Right now, they are independent. I just want to share one bit of state (whether the compile was invoked with the -ddump-stg flag).

Hi @bollu
A request is a single request from a client (most often a web browser), asking to compile and annotate a single block of code. It takes the form of an HTTP POST request to an API endpoint (something like /api/compilers/g72/compile accepting a JSON document encoding the request. The response from the server is also a JSON document with the result of the compilation, plus any annotations etc.
The server is written in node.js which is very heavily asynchronous. Any blocking call (e.g. reading or writing data, executing a subprocess, sending or receiving network data) is disallowed, and instead asynchronous function calls are used.  These functions take either the form of Promises to return the data at a later point, or a function which accepts a "call this function when you're finished" parameter. For example, reading a file in node.js takes two parameters: the filename to read from and the function to call when the read has finished. This takes a little getting used to.
Of course, each individual server with the Compiler Explorer node is processing many requests simultaneously. These requests live in memory as a set of chained Promise calls, each keeping its state in the parameters and local variables stored in the closure they're defined in. (Closures are the set of variables available to a function - unlike C++ in garbage collected languages like node.js, one may refer safely to variables that otherwise fell out of scope).
In Compiler Explorer, the compiler class is an instance of a class that can compile using a particular compiler binary. Exactly one is instantiated per supported compiler type. So, if we have three compilers - gcc, clang and icc, there will be three instances of the compiler class.
Imagine a request comes in to build with GCC. A POST comes in to /api/compiler/gcc/compile and is handled by the compile-handler.js. This looks up the compiler class for this request, and then calls compiler.compile(source, options, backendOptions, filters).
Interestingly the compile function does not return the results of the compilation: that would require blocking until the compiler had finished. Node doesn't allow us to do this - the compile might take 10 seconds and we don't want the CE website to pause during this. Instead it returns a Promise, which is a deferred result.
The code in compile-handler.js calls the then method to chain what will happen when the compile finishes. The then accepts functions as parameters to call when the work is done. These functions will be called with the result of the compile Promise. In the case of the compile-handler they send the results back to the user.
In the mean time what happens? The compile handler returns immediately, and so node.js is able to continue serving other requests. In fact, another compile request may come in before the first has finished. The only state shared between these are the fields of the compiler class and any other "global" variable. The source, options etc and result are not shared as they were created on the "stack" (for want of a better word) each time. Again, this is not something one does in C++ very much. Think of all the locals as like shared_ptr<>s that you can safely copy and hold onto in the lambdas that are the function(){}s.
So, finally to get to the concrete part: if you need to share state between compile and postProcess I'd suggest placing that information in the asmResult object. You'll see the AST and gccDump passes do this. That asmResult is local to the request and so anything stashed there is available in postProcess.
If that doesn't seem to work, perhaps give me some file names and line numbers of your Pull Request to take a closer look. I'm sure the solution will be straightforward.

Thanks a lot for the incredibly detailed explanation :) It means a lot.
Yes, that makes the control flow much clearer. I think I now understand enough to code it up. I'll pass the state as you suggested and see what happens.
I want to add another options as well: -ddump-cmm which dumps the other IR in GHC (C--). I suspect that pull request will look very similar to this one.

Let us know if you have any other questions or if you need any help while implementing it

Hi! As part of our plans for February, we are trying to reduce our number of long standing pull requests. We would like to know if you are planning on working on this, or if we should try to finish it for you (Or close it in case we are unable to).
We don't want to push you into doing something you might not want to do/don't have the time right now, so we'll understand if you choose not to work on this. No hard feelings :). We are indeed grateful you took the time to try to improve CE.

Hi! I'm going to close this PR for the lack of activity. (No hard feelings, we're just cleaning our PR list up)
Please, reopen this if (Hopefuly "when"!) you get some time to finish this off, or if someone else wants to pick up the feature
:)


How to parse GET request

Hi,
I'm working on http server, and i want to know how the GET request is been parsed in boost.
Let say, below is the http GET request
http://localhost:8080/match/gt5jjdsc7juty/details?stuId=207&stuGroup=501&maxResults=20
I want to get,
string a = gt5jjdsc7juty, string b = details, int c = 207, int d = 501, int e = 20
Note:
But i can able to fetch integer values as in code. Also i want to get contents which are after &, ?, / and =
Sample Code block
server.resource["^/match/([0-9]+)$"]["GET"]=[](HttpServer::Response& response, shared_ptr<HttpServer::Request> request) {         string number=request->path_match[1];
Thanks in advance.

See #47 Closing as this is a duplicate of #47.

Hi,
Thanks for the quick response.
I got the integer values as said in the comment.
As i said before i couldn't able to get string value. (i.e. i need to get value after /match/ in the request below.)
http://localhost:8080/match/gt5jjdsc7juty/details?stuId=207&stuGroup=501&maxResults=20


Fix #2646: return empty responses to prevent JSON deserialization

Fixes: Issue #2646
On the Windows side we expect responses to be valid JSON messages
or empty. If empty, the status code determines if the call was successful
or not.
Due to a recent changes, the empty messages that were expected
were improved to return a message. While these messages aren't
user-facing this is unnecessary for now.

This patch still return the string response oppose to json one I think I would better go with json response which should be consistent with other api calls.

This patch still return the string response oppose to json one I think I would better go with json response which should be consistent with other api calls.

I agree this would be the better fix, but since the other end expects a valid response (but currently works as valid being empty) it might not work as a quick fix. This would be the improvement for the API in general and for the client to be changed for,

https://github.com/code-ready/crc/pull/2648

It got accidentally merged from a commit in vscode: a23b1283. This is just a rebase/merge to close the referenced PR.


Fix typo in flow aggregator manifest generation script

Signed-off-by: Yanjun Zhou<EMAIL_ADDRESS>

/skip-all


Add tenant level switch to disable telemetry

There are no current plans to work on the page transformation UI. The preferred option for doing page transformation is using PnP PowerShell or .Net. Check out the guidance at https://aka.ms/sppnp-pagetransformation.
This issue will be closed but can be re-opened if we restart the work on the page transformation UI.


upgrade netty for dubbo-all

What is the purpose of the change
Because dubbo use netty4 as the default transport, so upgrade netty dependency for dubbo-all
Brief changelog
dubbo-all/pom.xml
Verifying this change
XXXXX
Follow this checklist to help us incorporate your contribution quickly and easily:

[x] Make sure there is a GITHUB_issue filed for the change (usually before you start working on it). Trivial changes like typos do not require a GITHUB issue. Your pull request should address just this issue, without pulling in other changes - one PR resolves one issue.
[ ] Format the pull request title like [Dubbo-XXX] Fix UnknownException when host config not exist #XXX. Each commit in the pull request should have a meaningful subject line and body.
[ ] Write a pull request description that is detailed enough to understand what the pull request does, how, and why.
[ ] Write necessary unit-test to verify your logic correction, more mock a little better when cross module dependency exist. If the new feature or significant change is committed, please remember to add integration-test in test module.
[ ] Run mvn clean install -DskipTests & mvn clean test-compile failsafe:integration-test to make sure unit-test and integration-test pass.
[ ] If this contribution is large, please follow the Software Donation Guide.

Codecov Report

Merging #2123 into master will decrease coverage by 0.07%.
The diff coverage is n/a.

@@             Coverage Diff              @@
##             master    #2123      +/-   ##
============================================
- Coverage     54.19%   54.11%   -0.08%
+ Complexity     5085     5081       -4
============================================
  Files           559      559
  Lines         24922    24922
  Branches       4442     4442
============================================
- Hits          13506    13487      -19
- Misses         9380     9395      +15
- Partials       2036     2040       +4

Impacted Files
Coverage Δ
Complexity Δ

...he/dubbo/remoting/transport/netty/NettyClient.java
72.88% <0%> (-8.48%)
12% <0%> (-1%)

...ubbo/rpc/protocol/dubbo/ChannelWrappedInvoker.java
41.66% <0%> (-8.34%)
3% <0%> (ø)

...rpc/protocol/dubbo/telnet/InvokeTelnetHandler.java
51.89% <0%> (-3.8%)
11% <0%> (-2%)

...he/dubbo/remoting/transport/netty/NettyServer.java
67.85% <0%> (-3.58%)
8% <0%> (-1%)

...bo/remoting/transport/netty/NettyCodecAdapter.java
53.12% <0%> (-1.57%)
3% <0%> (ø)

...dubbo/rpc/protocol/dubbo/CallbackServiceCodec.java
77.2% <0%> (-1.48%)
29% <0%> (ø)

...apache/dubbo/rpc/protocol/dubbo/DubboProtocol.java
58.33% <0%> (-0.84%)
30% <0%> (-1%)

Continue to review full report at Codecov.

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


Display all data volumes for vm while destroying

If a root admin tries to destroy VM of different
domain then the data disks are not displayed and
hence they wont be destroyed.
Make sure that root admin can see all data disks
of a vm while destroying it
Steps to reproduce:

Login as domain admin and create a vm with two data disks
Now login as ROOT admin and try to destroy that vm

Expected result:
Root admin should see all two data disks
Actual result:
Root admin doesnt see any data disk
After fix:

@blueorangutan package

@blueorangutan package

@shwstppr a Jenkins job has been kicked to build primate packages. I'll keep you posted as I make progress.

@shwstppr a Jenkins job has been kicked to build primate packages. I'll keep you posted as I make progress.

Packaging result: :heavy_check_mark:centos :heavy_check_mark:debian :heavy_check_mark:archive.
QA: http://primate-qa.cloudstack.cloud:8080/client/pr/915 (JID-3802)

Packaging result: :heavy_check_mark:centos :heavy_check_mark:debian :heavy_check_mark:archive.
QA: http://primate-qa.cloudstack.cloud:8080/client/pr/915 (JID-3802)


feat(accountsdb): support index save/load

[!WARNING]
This pull request is not mergeable via GitHub because a downstack PR is open. Once all requirements are satisfied, merge this PR as a stack on Graphite.
Learn more

#388  👈
#386
#384
#382
#381
main

This stack of pull requests is managed by Graphite. Learn more about stacking.

Join @0xNineteen and the rest of your teammates on  Graphite


Removed rm from testing docs as no longer needed

What is this PR About?
Minor tweak to docs. the bats test already includes removing any data that might overlap:

https://github.com/redhat-cop/bats-library/blob/master/test/tests.sh#L7-L9

cc: @redhat-cop/bats-library

/approve

/approve

/lgtm

/lgtm


WIP introduce GET /api/workitem/:ID/relationships/links API

This change will introduce an endpoint for work item links that lives under the work item endpoint and automatically filters work item links associated with the work item on the backend.
There's only one action for this resource: list (in http: GET).
The returned links include links where the current work item is the source or target work item.
Also, the original list action for work item links as well as the new responses include the work item link types in the responses in the included top-level JSONAPI element.
Currently the UI has to do the filtering of links on a particular work item.
See also #307
TODOs
Tests

[ ] test with ListWorkItemRelationshipsLinksOK
[ ] test with ListWorkItemRelationshipsLinksBadRequest
[ ] test with ListWorkItemRelationshipsLinksInternalServerError
[ ] test with ListWorkItemRelationshipsLinksNotFound

Current coverage is 66.37% (diff: 26.66%)

Merging #525 into master will decrease coverage by 0.36%

@@             master       #525   diff @@
==========================================
  Files            62         63     +1
  Lines          3286       3316    +30
  Methods           0          0
  Messages          0          0
  Branches          0          0
==========================================
+ Hits           2193       2201     +8
- Misses          857        878    +21
- Partials        236        237     +1

Powered by Codecov. Last update 9bd5c82...b55718a

There's only one action for this resource: list (in http: GET).

Are you considering POST to this relation as well for Adding links to the WorkItem?
http://jsonapi.org/format/#crud-updating-relationships

Should we consider this PR the fix for #475 ?

Are you considering POST to this relation as well for Adding links to the WorkItem?
http://jsonapi.org/format/#crud-updating-relationships

I am considering POST but this PR is supposed to stay small and make its way into master quicker than the last one ;)

Should we consider this PR the fix for #475 ?

It is a part #475 but the workitems endpoint needs to include the relationships as well. That I want to do in another PR as well.

I am considering POST but this PR is supposed to stay small and make its way into master quicker than the last one ;)

Sure. hehe. Just didn't see any Task|Issue related to it, was just wondering.

Current coverage is 66.37% (diff: 26.66%)

Merging #525 into master will decrease coverage by 0.36%

@@             master       #525   diff @@
==========================================
  Files            62         63     +1
  Lines          3286       3316    +30
  Methods           0          0
  Messages          0          0
  Branches          0          0
==========================================
+ Hits           2193       2201     +8
- Misses          857        878    +21
- Partials        236        237     +1

Powered by Codecov. Last update 9bd5c82...b55718a

[test]

[test]

I would like to see include of source/target workitems (where source/target != this) as well, to avoid the UI having to do n backend calls per link to display the basic information like Title, State, ID.
Doesn't have to be part of this PR tho. Just in general :)

@aslakknutsen thanks for approving.

I would like to see include of source/target workitems (where source/target != this) as well, to avoid the UI having to do n backend calls per link to display the basic information like Title, State, ID.
Doesn't have to be part of this PR tho. Just in general :)

Yes, that's what I intended with this issue: "Include related resources by default in all actions and endpoints that deal with work item links." #533


fix(sideNav): implemented aria-hidden, implemented tab-index #229

Proposed changes
Desktop navbar and sidenav are basically 2 html components, as mentioned in issue [#229] this causes a web accessibility reduction in usability by screenreaders as both navigations are exposed to the accessibility API.
Who does this affect?

People who rely on keyboard control
People with dexterity impairments using voice control or a keyboard-like switch device
People with low vision who use screen magnification with keyboard control
People using a screen reader, including blind, low vision, and neurodivergent people
Neurodivergent people who use the keyboard
Older adults who use the keyboard

Codepen:
Codepen
Types of changes
Implemented aria-hidden and tab-index states to fix the duplicate exposure to the accessibility API. This ensures the WCAG standard Focus Visible (Level AA) that applies to SC 2.4.7 meets the requirements

[x] Bug fix (non-breaking change which fixes an issue).
[x] New feature (non-breaking change which adds functionality).
[ ] Breaking change (fix or feature that would cause existing functionality to change).

Checklist:

[x] I have read the CONTRIBUTING document.
[x] My commit messages follows the conventional commit format
[ ] My change requires a change to the documentation, and updated it accordingly.
[x] I have added tests to cover my changes.

[x] Test using the IBM Equal Access Accessibility Checker browser extension or integration testing module to identify issues detected for this requirement
[x] Check component keyboard interaction

[x] All new and existing tests passed.

The dist files have a conflict. We should add the dist directory to .gitignore i think.

It's ok, don't mind. Someone suggested to do this a while ago. So no problem, I fixed it. The dist files should be available via Release page, cdn or npm directly.


readme build instructions

I see this is a duplicate of https://github.com/Microsoft/python-language-server/issues/292 , but I had to spend a bunch of time looking around to find where the instructions where. Perhaps the main readme could indicate and link the contributing doc to make it more clear where the build instructions are.

Updated the readme


Timeline lifecycle methods

Hi,
I could not use lifecycle methods of timeline . I tried to understand the document but could not understand. For example when timeline is mounted, I would like to focus an item ( i.e invoke focus method of timeline). I tried code below but could not succeed.
<template>
     <timeline ref="timeline_ref"
         :items="items"  :groups="groups"  :options="options"
@items-mounted="focusTimeline"> </timeline>
</template>

<script>
 //...
    methods:{
      focusTimeline(){
        this.$refs.timeline_ref.focus(3);
      }
    }
 //...
</script>

Best regards.

I guess is because your $ref is not yet available (https://vuejs.org/v2/api/#ref)

Hi @alexcode, Thank you for your reply, I have solved it by @items-update event.


Fixed connection-mode show

connection mode was not showing the proper mode Git vs. Sftp.

Triple equals all the way, baby.

Tested and it fixes my problem. +1

Thanks @calevans


Testcases failed

Hi, thank you for sharing this interesting project.
I wanted to walk through these games before creating a customized one. But run into environment problems that I have no clues how to solve. I installed all dependencies such as pygame, gym-ple, PyGame-Learning-Environment, pillow, nose. However, when I run"tests/test_ple.py" I got the following output:
E.EEEEEEEE
ERROR: test_catcher (main.MyTestCase)
Traceback (most recent call last):
File "tests/test_ple.py", line 39, in test_catcher
from ple.games.catcher import Catcher
ModuleNotFoundError: No module named 'ple.games.catcher'
-------------------- >> begin captured stdout << ---------------------
pygame 1.9.5
Hello from the pygame community. https://www.pygame.org/contribute.html
couldn't import doomish
--------------------- >> end captured stdout << ----------------------
======================================================================
ERROR: test_flappybird (main.MyTestCase)
Traceback (most recent call last):
File "tests/test_ple.py", line 49, in test_flappybird
from ple.games.flappybird import FlappyBird
ModuleNotFoundError: No module named 'ple.games.flappybird'
======================================================================
ERROR: test_monsterkong (main.MyTestCase)
Traceback (most recent call last):
File "tests/test_ple.py", line 44, in test_monsterkong
from ple.games.monsterkong import MonsterKong
ModuleNotFoundError: No module named 'ple.games.monsterkong'
======================================================================
ERROR: test_pixelcopter (main.MyTestCase)
Traceback (most recent call last):
File "tests/test_ple.py", line 54, in test_pixelcopter
from ple.games.pixelcopter import Pixelcopter
ModuleNotFoundError: No module named 'ple.games.pixelcopter'
======================================================================
ERROR: test_pong (main.MyTestCase)
Traceback (most recent call last):
File "tests/test_ple.py", line 79, in test_pong
from ple.games.pong import Pong
ModuleNotFoundError: No module named 'ple.games.pong'
======================================================================
ERROR: test_puckworld (main.MyTestCase)
Traceback (most recent call last):
File "tests/test_ple.py", line 59, in test_puckworld
from ple.games.puckworld import PuckWorld
ModuleNotFoundError: No module named 'ple.games.puckworld'
======================================================================
ERROR: test_raycastmaze (main.MyTestCase)
Traceback (most recent call last):
File "tests/test_ple.py", line 64, in test_raycastmaze
from ple.games.raycastmaze import RaycastMaze
ModuleNotFoundError: No module named 'ple.games.raycastmaze'
======================================================================
ERROR: test_snake (main.MyTestCase)
Traceback (most recent call last):
File "tests/test_ple.py", line 69, in test_snake
from ple.games.snake import Snake
ModuleNotFoundError: No module named 'ple.games.snake'
======================================================================
ERROR: test_waterworld (main.MyTestCase)
Traceback (most recent call last):
File "tests/test_ple.py", line 74, in test_waterworld
from ple.games.waterworld import WaterWorld
ModuleNotFoundError: No module named 'ple.games.waterworld'

Ran 10 tests in 0.079s
FAILED (errors=9)

Hi, I think this is most probably because the test_ple file calls the games catcher, pong, monsterkong etc., which I have not included in my current repository (so that you only get the games we created). If you want to run codes on those games, then I recommend just installing PLE by itself without the current repo and running codes on the default PLE games. Hope this helps!


Update for user guide about DevOps section. - [closed]

In GitLab by @wknet123 on Mar 12, 2018, 01:10
Merges dev-devops -> dev-devops

In GitLab by @wknet123 on Nov 13, 2019, 10:35
the API Server Coverage is  %   UI Coverage is 38.11%   check console log

In GitLab by @wknet123 on Nov 13, 2019, 10:35
the it is failed check console log

In GitLab by @wknet123 on Nov 13, 2019, 10:35
the API Server Coverage is  %   UI Coverage is 38.11%   check console log

In GitLab by @wknet123 on Nov 13, 2019, 10:35
the it is failed check console log

In GitLab by @wknet123 on Nov 13, 2019, 10:35
the API Server Coverage is  %   UI Coverage is 38.11%   check console log

In GitLab by @wknet123 on Nov 13, 2019, 10:35
the it is failed check console log

In GitLab by @wknet123 on Nov 13, 2019, 10:35
closed


add PID rate controller

I have been using this controller to avoid timeouts during transactions; I suspect it will be useful for others too!
The controller mechanism acts to maintain a fixed level of backlog transactions, using a basic PID control mechanism to modify the driven transaction rate to achieve a fixed backlog. A user must prescribe control gains, as well as a starting TPS to seed the controller. There is an option to view controller output to assist tuning the controller for a specific system.
Contribution includes:
New rate controller with header description
Update of fixed-rate controller to add header description
Docs modification to indicate availability of controller
Signed-off-by: Nick Lincoln<EMAIL_ADDRESS>

Hi @nklincoln , I still don't understand how to set the targetLoad as well as P/I/D. And sorry I don't have time to investigate the code.
I tried to run the 'simple' test with a rate-control as {"type": "pid-rate", "opts": {"targetLoad": 5, "initialTPS": 100, "proportional": 0.2, "integral": 0.0001, "derrivative": 0.1, "showVars": true}} for 5000 txs, and got a result of 42 tps. Why the actual tps is that low?

Hi @haojun,
That is what I would have expected and I get the same results running locally on my machine. The aim of the control mechanism is to adjust the TPS to maintain a specified (and steady) number of unfinished transactions per client.
When I run the simple test with a fixed rate, the transaction backlog grows to a peak of approx 450. Whilst this means that the maximum possible throughput will be reached, if i was to run the test for 500000 txn, there would be a timeout at some point.
Bringing down the maximum number of backlog transactions prevents the issue of timeouts, but does reduce the overall TPS as there is a deliberate limitation on the placement of transactions to be completed.

OK, I see. But what's the purpose of restricting the number of backlogs?
There are several factors that may affect the number of backlogs:

SUT's processing capability. If the TPS is out of the capability, the number grows continuously. In this case, the TPS should be lowered.
Latency (network latency and processing latency). For example, if submitting txs at 200 tps while the e2e latency for each tx is 1 second, the number of backlogs may grows to 200 even if the actual processing capability is over 200 tps. But if the actual capability is over 200, the backlogs number should fluctuate around 200. In this case, a high backlogs number(200) looks normal.

Maybe maintaining a given e2e latency would be more appropriate here, if it's possible.

Sorry for the delay in response -
I'm not sure if I understand your point for item 2) above, but for 1) this is exactly why the rate controller should be used and is especially true for long running tests - for instance, how does a user know what TPS to lower it to when hitting a timeout, other than 'less than before'?
As you mention, there are many factors impacting the SUT performance, and the multiple factors will result in a highly non-linear system. Using a systematic approach, this can be overcome:

by running the tests with varying load, the output will be a curve of maximum tps for a given load, which should be highly repeatable.
through looking a the output graph, the highest TPS throughput can be determined (note that the highest throughput is not at the highest sustainable loading)

There is an additional benefit - since the controller will enable running performance tests for an extended time (which is not guaranteed from a pure TPS limit) it would be useful for possible extension of Caliper into a Performance and reliability tool in the future.

Hi,@nklincoln
I used pidrate.
According to the console logs, I found many logs like deal pid and compute  sleep time, like this:
Current P value:  -23.6
Current I value:  -0.8427249989642626
Current I value:  -2.873340714337511
Current D value:  -0.00005253275121500009
New sleep time:  1928.0171704039135
Current D value:  -0.000028708512638230602
New sleep time:  3520.160757388461
Current load error:  -169
Current P value:  -33.800000000000004
Current I value:  -2.814124828742096
Current D value:  -0.000029013484368045606
New sleep time:  3483.287387965611
and then deal txs, like this:
[Transaction Info] - Submitted: 20000 Succ: 10457 Fail:0 Unfinished:9543
[Transaction Info] - Submitted: 20000 Succ: 10489 Fail:0 Unfinished:9511
[Transaction Info] - Submitted: 20000 Succ: 10510 Fail:0 Unfinished:9490
[Transaction Info] - Submitted: 20000 Succ: 10521 Fail:0 Unfinished:9479
[Transaction Info] - Submitted: 20000 Succ: 10550 Fail:0 Unfinished:9450
[Transaction Info] - Submitted: 20000 Succ: 10597 Fail:0 Unfinished:9403
[Transaction Info] - Submitted: 20000 Succ: 10685 Fail:0 Unfinished:9315
[Transaction Info] - Submitted: 20000 Succ: 11200 Fail:0 Unfinished:8800
[Transaction Info] - Submitted: 20000 Succ: 12066 Fail:0 Unfinished:7934
[Transaction Info] - Submitted: 20000 Succ: 13108 Fail:0 Unfinished:6892
[Transaction Info] - Submitted: 20000 Succ: 13976 Fail:0 Unfinished:6024
[Transaction Info] - Submitted: 20000 Succ: 14487 Fail:0 Unfinished:5513
I am confused,
Isn't it that pidrate control changes sleeptime according to the results of txs？

Hi, yes - it should. There have been a few upstream changes that broke the Composer plugin - these should have been resolved with the latest PR that has been merged - would recommend that you try again ensuring that #122 is included in your code base

@nklincoln Hi, in  https://github.com/hyperledger/caliper/pull/122 Maybe the problem is resolved in composer, but my problem is occurring  in fabric

@nklincoln I use latest code , And the problem is still happened. I use Fabric network


yes/lib is throwing off libtool

Version: 0.4.1
If configured with jansson and/or openssl, there is a '-Lyes/lib' LD_FLAG that is added, that freaks out the libtool.
[vps@phoenix]~/src/cjose$ ./configure --prefix=/opt/soft/cjose --exec-prefix=/opt/soft/cjose
...
[vps@phoenix]~/src/cjose$ make -j
... <all OK> ...
[vps@phoenix]~/src/cjose$ ./configure --prefix=/opt/soft/cjose --exec-prefix=/opt/soft/cjose --with-jansson --with-openssl
...
[vps@phoenix]~/src/cjose$ make -j
...
/bin/sh ../libtool  --tag=CC   --mode=link gcc -std=gnu99 --pedantic -Wall -Werror -g -O2 -I../include -g -O2 -Iyes/include/ -Iyes/include/ -lm -Lyes/lib -Lyes/lib -o libcjose.la -rpath /opt/soft/cjose/lib libcjose_la-version.lo libcjose_la-util.lo libcjose_la-base64.lo libcjose_la-jwk.lo libcjose_la-jwe.lo libcjose_la-jws.lo libcjose_la-header.lo libcjose_la-error.lo  -ljansson -lcrypto
../libtool: line 7472: cd: yes/lib: No such file or directory
libtool:   error: cannot determine absolute directory name of 'yes/lib'
Makefile:438: recipe for target 'libcjose.la' failed
[vps@phoenix]~/src/cjose$ grep 'yes/lib' * 2>/dev/null
config.log:configure:14829: gcc -o conftest -g -O2 -Iyes/include/  -Iyes/include/  -Lyes/lib conftest.c -lcrypto   >&5
config.log:configure:14911: gcc -o conftest -g -O2 -Iyes/include/ -Iyes/include/  -Iyes/include/ -Iyes/include/  -Lyes/lib -Lyes/lib conftest.c -ljansson  -lcrypto  >&5
config.log:LDFLAGS=' -Lyes/lib -Lyes/lib'
config.status:S["LDFLAGS"]=" -Lyes/lib -Lyes/lib"
Makefile:LDFLAGS =  -Lyes/lib -Lyes/lib

The --with-jansson --with-openssl flags need a value that specifies where the respective libraries are found:
./configure --help | grep with
  --disable-option-checking  ignore unrecognized --enable/--with options
  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
  --with-pic[=PKGS]       try to use only PIC/non-PIC objects [default=use
  --with-aix-soname=aix|svr4|both
  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
  --with-sysroot[=DIR]    Search for dependent libraries within DIR (or the
  --with-openssl          Location where OpenSSL can be found
  --with-jansson          Location where Jansson can be found

I guess it should have said:
  --with-openssl[=DIR]          Location where OpenSSL can be found
  --with-jansson[=DIR]          Location where Jansson can be found

Right. It'd be cool if the use of those options without an argument is somehow prevented. Otherwise, configure, I guess, just gives them a "yes" value. Is there a particular reason to not use standard way of configure discovering the libraries?

I don't think there is...

There is PKG_CHECK_MODULES macro that uses pkg-config. Then it deals with all the flags as well. There will be a change to the configure syntax, because I don't see how you can provide custom path at the same time. But one can still provide custom path by adding necessary environment vars. I can post a PR if you're interested.

The flag choices were based on the state of autotools recommendations we could find when this project started.
I'm not sure what exactly the benefit this PR is supposed to add.  OpenSSL and Jansson are not optional dependencies.

IMHO, one would typically have OpenSSL/Jansson installed as devel packages. So one wouldn't use package paths, and just use /usr. Using pkg-config returns all kinds of cflags and ldflags that the maintainer wants you to use, not just -I/-L/-l.

We have users that need to be explicit about what instance (or API-compatible instance) of OpenSSL (and Jansson) they are using.  Maybe we could have gone with envars, but we didn't.


Add snake case test

Here is the test describing true snake case approach using for both path and nested object value values.
{op:"replace", path:"/nested_property", value:"{first_prop:1, second_prop:2}"}
PocoAdapter using snake case handling tries to convert snake_case_name to snake case again and then fails to find the property.

NET8 has no explicit PascalCase naming policy which is default (null). The condition above returns just a name which is sanka_case_name as it was passed and then fails to find the property.
I have tried to create PascalCase naming policy myself. It works for path and we can find the target property but it leads to fail during value application which is snake_case as well.
Test works for case when path has PascalCase and value has snake_case though:
{op:"replace", path:"/NestedProperty", value:"{first_prop:1, second_prop:2}"}
We have truly snake_case API where client uses snake_case for both path and value. And it works with Newtonsoft. What is the best way to make it work with SystemText?

Yep, this is bug, thanks for the test case will fix!


Not working with laravel 8

This is not working with new version of Laravel.
Also behat/mink-extension doesn't work with new symfony kernel.
I found solution for that, and used friends-of-behat/symfony-extension, but then this library returns me with
Class 'Symfony\Component\HttpKernel\Client' not found

How can I resolve this problem?

Solution for that was quitely easy, you just need to change class use Symfony\Component\HttpKernel\Client; into use Symfony\Component\HttpKernel\HttpKernelBrowser as Client;.
To do that, overwrite KernelDriver class using composer.
In composer add this:
"autoload": {
        "psr-4": {
            "App\\": "app/",
            "Database\\Factories\\": "database/factories/",
            "Database\\Seeders\\": "database/seeders/"
        },
        "files": [
            "behat-overwrite/KernelDriver.php"
        ]
    },

And create file behat-overwrite/KernelDriver.php with contents below:
<?php

namespace Laracasts\Behat\Driver;

use Behat\Mink\Driver\BrowserKitDriver;
use Symfony\Component\HttpKernel\HttpKernelBrowser as Client;
use Symfony\Component\HttpKernel\HttpKernelInterface;

class KernelDriver extends BrowserKitDriver
{

    /**
     * Create a new KernelDriver.
     *
     * @param HttpKernelInterface $app
     * @param string|null         $baseUrl
     */
    public function __construct(HttpKernelInterface $app, $baseUrl = null)
    {
        parent::__construct(new Client($app), $baseUrl);
    }

    /**
     * Refresh the driver.
     *
     * @param HttpKernelInterface $app
     * @return KernelDriver
     */
    public function reboot($app)
    {
        return $this->__construct($app);
    }

}

It will works then fine :)

#90

In the "require-dev" section of composer.json I found that I also needed to add the following:
"friends-of-behat/mink-browserkit-driver": "dev-master as 1.3.4",
"friends-of-behat/mink-extension":  "dev-master as 2.3.1",

Yes, but you dont need to do that If you are not using mink :)

This worked great, until I went to deploy this code to a non-local/testing environment. All my behat/mink stuff was in composer.json under require-dev, so on startup, I got the following error:

[Error]
Class "Behat\Mink\Driver\BrowserKitDriver" not found
Exception trace:
.../behat-overwrite/KernelDriver.php:9

Which points to:
use Behat\Mink\Driver\BrowserKitDriver;

So, if you have all of your behat/mink stuff in require-dev (as you should, since it's for testing), make sure you modify your composer.php to match:
"autoload-dev": {
    "psr-4": {
        "Tests\\": "tests/"
    },
    "files": [
        "behat-overwrite/KernelDriver.php"
    ]
},

@TimothyDLewis @MWL91 @Evoke-PHP @JeffreyWay in order to bring support for Behat as an option to write acceptance test in laravel I have created a new repository / behat-extension. Do you know anyone interested in supporting / helping / maintaining with me this component? The library its already updated but i just give support from PHP 8.0

Make it public 😉

@MWL91 Its already public :smile: Laravel Behat Extension


Replace tabs with spaces when saving

I would like to be able to configure that not only the spaces at the beginning and end are deleted when saving. I would also like to be able to configure that all tabs are replaced by spaces. I still have to do this by hand.
cu Oliver

There's a setting to auto-trim trailing whitespaces when saving a file :

This doesn't do leading whitespaces - but you might be able to find a VS Code extension that does that. Many VS Code extensions work in ADS as well so you can browse the marketplace for one that does what you need and then :

Download it from the marketplace page

This will download the VSIX.
2. Then open ADS and choose File -> Install Extension From VSIX Package
Not all extensions will work, but if you find one you like that does then I'd suggest reaching out to the author and seeing if they'd be willing to help support it in ADS as well (we'll gladly work with any extension authors to support their extension working in ADS as well)
For the replacing tabs with spaces (or vice versa) there's two commands you can use - Convert Indentation to Spaces and Convert Indentation to Tabs.

First of all many thanks for the tips.
I'm looking for an extension.
When I press TAB, it is already replaced by 4 spaces.
But my point is, if I don't just open my old projects or if other developers open the projects, that I replace all existing tabs with 4 spaces at once. Best when saving or I could somehow put this on key.

Did you look at the two commands I mentioned above? Those will replace all leading tabs/spaces in the document when ran.
There's no built-in functionality to replace ALL tabs/spaces in a document though directly as far as I know. I suppose you could use a regex replace or something do achieve that behavior though if you can't find an extension to do it for you though.

The two options are of course activated.
But my wish would be to replace all tabs with spaces.
I'll check the extensions right away.
But your idea with RegEx also sounds exciting.
What or how should I do this?
Can I put this on key?
Do I have to write a script for this?
Is there an example?
Thank you very much in advance.

If you open a document and press ctrl+F that will open the find/replace dialog. Then you can expand it and enter the character you want to replace and the character you want to replace it with. So if you wanted to replace all tabs with spaces it'd look like this :

(note the first box has a space in it and the regex button on the right is selected)
Then just click replace all and it'll replace all spaces in the documents with tabs. And to replace tabs with spaces just switch the characters in the text boxes.

Thank you very much.
Is there a way to put this on a " key"?
Tab -> Space.
And if I may make a suggestion, it would be great if I could set this in the settings when saving.


Arg container for validate data

This change is

Coverage decreased (-0.05%) to 70.027% when pulling 6d6327db6bc27238fe962752d6c5c8c4eb6c879d on vmotso:arg_container_for_validate_data into 0ee6b77b6a880a842601062ca5cfdd99f0fbc537 on openprocurement:ea_core_master.

Coverage decreased (-0.05%) to 70.027% when pulling 6d6327db6bc27238fe962752d6c5c8c4eb6c879d on vmotso:arg_container_for_validate_data into 0ee6b77b6a880a842601062ca5cfdd99f0fbc537 on openprocurement:ea_core_master.


Add unit test for strnstr

cmocka is not working when i am trying to build the whole test project. I don't know if is having conflicts with my cmock 1.1 installed on mac osx. But when i build with cmake on my mac as a standalone function it works. I have to figure out a way to build it with the whole project otherwise i can just push it and see the build results from the CI/Jenkins.


Index out of bound in rinex.py

when running with smartphone-decimeter-2022 test data for 2021-08-12-US-MTV-1/GooglePixel4
stack trace as follows:
/tmp/ipykernel_123/834946508.py in
140     # run sequentially, use for debug
141     for input in ppkIn:
--> 142         run_ppk(input[0],input[1],input[2],input[3],input[4])
/tmp/ipykernel_123/834946508.py in run_ppk(folder, rovfile, basefile, navfile, solfile)
93     # load nav data from rover obs
94     print('   Reading nav data...')
---> 95     rov.decode_nav(navfile, nav)
96
97     # calculate solution
/kaggle/working/rinex.py in decode_nav(self, navfile, nav)
170                     acc[1] = self.flt(line, 2)
171                     geph.frq = self.flt(line, 3)
--> 172                     nav.glofrq[sat - uGNSS.GPSMAX - 1] = int(geph.frq)
173
174                     line = fnav.readline() #11:14
IndexError: index 27 is out of bounds for axis 0 with size 27

oh.  I found that this is fixed in the gsdc_2022 branch. sorry for the trouble.


Add Inventory System

We have no way for the mouse to carry ingredients to the cooking station.
Have an array for ingredients to transfer to the cooking station once collected. Would be nice to add to the GUI later.

Added in commit 3f16bfe

Added in commit 3f16bfe


Tag a latest stable release so people can include the organisation case change

As discussed in #553 some ppl pin on a last stable release, but v0.11.5 is still pre case change in the name. This retains the naming issues.
Please release a latest stable from after the case change

thanks for releasing v1.0.0


feat(cli): Make versioned quickstart downloads

Add --unstable flag to pick up latest from head, but defaults to stable behaviour
Checklist

[ ] The PR conforms to DataHub's Contributing Guideline (particularly Commit Message Format)
[ ] Links to related issues (if applicable)
[ ] Tests for the changes have been added/updated (if applicable)
[ ] Docs related to the changes have been added/updated (if applicable). If a new feature has been added a Usage Guide has been added for the same.
[ ] For any breaking change/potential downtime/deprecation/big changes an entry has been made in Updating DataHub

Pending an update here.


Tile-based processing

Originated from #102:
@lforesta wrote here:

Suppose a group working on algorithms which are entirely scene based (i.e. processing rasters independently); with S2 they might be happy (or even prefer) that the output has the same CRS as the original raster, but with this approach, to achieve their goal they would need to submit one job for each CRS.

@m-mohr wrote:

There are no scenes (= granules) in the openEO world, but if a back-end gives users information on scenes and users would want to work on them individually, then I would expect that each scene is an individual data cube. That means crs doesn't need to be set in load_collection (1 scene = 1 crs) and they can work with the original crs until they want to merge and need to resample to a common crs. You can easily use multiple load_collection in a process graph and re-use algorithms with stored process graphs, so it's not necessarily one job for each crs.
The back-end only throws the error if the data requested hast multiple crs assigned. If you load data from a single crs although the collection has multiple crs assigned, you don't need to throw an error. Only if you load data over a region that has multiple crs assigned, you need to make clear what the target crs is. It just needs to be unambiguous.
I think this makes sense, no?

@lforesta wrote:

Ok never mind the scenes/granules. If my processing is pixel based (i.e. every pixel can be processed completely independently from others), it does not matter that my datacube has multiple CRS or one only. Clearly I'm thinking of a loose datacube, but I think there are people who work with applications of this type. For example, groups doing research on processors from L1 to L2, often they process data on a pixel level. Say I'm one such group and I want to create my S2-L2 product for an entire continent by using an openEO compliant back-end. I could do:
load_collection(S2, bbox=full-continent)
apply(my_UDF) # the UDF may be a set of standard processes
save_raster

If I'm forced to specify a unique CRS for this example, the back-end will have to reproject lots of data, although the group in this case is maybe happier to have the original UTM tile structure preserved (data like this is then used by other groups to do further processing, they will make sure it's all in the projection they want to use).
In this example, to achieve the same without reprojecting, either I create one job per CRS or within the same job I call load_collection multiple times with different bbox defined, right? This seems a lot of overhead for "keeping the original projection".
Anyway, maybe this is a corner case and in any case there are ways to create jobs where the original multiple CRSs are kept (paragraph above). I just wanted to point out example(s) where this PR may not be optimal.

@m-mohr wrote:

I'm not sure how your example would work with save_result. How would a data cube of a whole continent be stored? When saving, the save_result process doesn't know any longer the original files and thus can't save it to the original tile structure. Maybe some back-ends can do that, but user can't expect that to happen on all back-ends. So this use case doesn't even work without having this PR merged, I think. I don't think your use case can currently be tackled very well in openEO. I guess we would need a process that can load individual tiles into individual data cubes for that, e.g. load_tiles() which returns an array of data cubes and then we'd need an array_each process so you can apply a "callback" on each data cube and save them individually.

How would a data cube of a whole continent be stored? When saving, the save_result process doesn't know any longer the original files and thus can't save it to the original tile structure.

I think this depends on the implementation, in general a back-end should have knowledge about this. The back-end would save files in the way specified on the /output_files endpoint (we discussed this in another issue that I can't find at the moment). One common option would be to save one file per timestamp, which relates to individual input files usually.
About the process idea, are you thinking of UTM tiles? Or how would you specify the tile otherwise?

We also have this use case where users would like their output to be in the Sentinel-2 tiling grid.
I'm not there yet, but probably going to use some parameter in save_result to specify this. This is again a case that I'd like to try out in an implementation first before standardizing it.

@lforesta Not sure, weren't you speaking about the original granules as originally published on OpenSciHub etc? I was speaking about them, but maybe you are speaking about other things?

Yes I was thinking of those although if we define a process it could be more general (or have a more specific name).
But I agree with @jdries and maybe leave this for the moment. We can discuss this more in detail when we have some real cases in mind I guess.

That's why it is not part of the next milestone here. ;-)

I have the feeling that we have two fundamentally different views here on a data cube.
One approach is a loose representation of a (filtered) collection on which a processing steps can be applied. Clearly, there can be multiple CRS contained in a collection. The result is also a collection that can contain multiple CRS..
The other approach is a more strict definition of a data cube that has a well defined spatial and temporal resolution in a single CRS. My understanding was that after "load_collection" we would obtain such a data cube. In fact, I do not see the need for the "load_collection" in the first approach.
I can see the benefit of both approaches, and I do support them in our back-end if needed (clearly not all processes implemented yet).
In the first approach, I implement the processing steps as methods of a (filtered) Collection class (there is no need for load_collection). This is typically a file based processing. In the second approach, I first perform a load_collection and obtain a well defined data cube object (typically in memory, or in some Dask xarray representation). In this approach, processing steps are implemented as methods of the data Cube class.
Backends will each have their own approaches, but I think we need to agree on the terminology of a data cube. If we have different interpretations, our users will be lost (and we will loose our users).

Yes, I agree @kempenep. I designed API and processes based on your "strict definition of a data cube".

@kempenep do you also have (force?) a uniform resolution in time? Typically, EO data will be non-uniform in this dimension, no?

@lforesta good point. To my understanding a data cube should have indeed a regular grid in both space and time. Currently I represent the data cube as sparse in time. However, the grid parameters for time and space are member attributes of the data cube, so we can always explode the sparse matrix if needed.

@edzer Here are some points to consider for your data cube definition in the glossary. :-)

If we want to define the full grid of the datacube correctly from a mathematical standpoint, we need to define that for each dimension (whereas we tend to think about this only for the two spatial dimensions). Time is often sparse, spectral bands are as well, etc..
But if we want to define the whole grid (for each dimension), this becomes quite cumbersome for users I think. And it may introduce some interpolation/extrapolation if they define a regular grid for the time dimension without knowing yet which data is in the cube.
I'm not advocating for this, but if we don't do that I think the datacube will still be loosely rather than strictly defined.

Related to #98. Tile (identifier) could be a dimension.

For reference, this is how Sentinelhub allows output tiling grids to be defined:
https://docs.sentinel-hub.com/api/latest/api/batch/#tiling-grids
Problems here:

the resolution is part of the grid definition, whereas openEO defines it by resampling operations
the grids are referenced with simple numerical id's (0,1,2), maybe an actuall name is better?
We do however need to map this in openEO, because we want to be able to forward data from Sentinelhub, without requiring heavy reformatting. (That would incur an unneeded cost IMO).

We are mixing issues here, I think. This issue was meant to be for tile-based processing, but tiling for saving is a different topic, isn't it? While the processes can solve tile-based processing, the tiling on save has to be specified in /file_formats and is basically a back-end choice. We can and should probably agree on a common option that we expose via /file_formats, but that's better started off and discussed in Platform.

Stale, not part of openEO, I think.


Add XarrayDatasetEqualityComparator

Codecov Report
All modified and coverable lines are covered by tests :white_check_mark:

Comparison is base (16e1198) 100.00% compared to head (8113b56) 100.00%.

:exclamation: Current head 8113b56 differs from pull request most recent head 8b70684. Consider uploading reports for the commit 8b70684 to get more accurate results

Additional details and impacted files
@@            Coverage Diff            @@
##              main      #390   +/-   ##
=========================================
  Coverage   100.00%   100.00%
=========================================
  Files           63        63
  Lines         2206      2217   +11
  Branches       385       385
=========================================
+ Hits          2206      2217   +11

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


Use Transcript object in sync and async.

In the spirit of smaller PRs. I started switching sync to GAPIC again and I realized that this is required first.

Ok thanks! I changed the response check via your suggestion, added the length check and fixed my bug.
I also just squashed the commits.

Travis is green.  Merging.


exe-package expired

Hi, in the "How To Run", "Run EXE" says: "Download exe-package at the bottom (need to be logged in into github)", looks like this exe-package is expired, can you check? thank you

Huh, didn't know they could expire.
Here is one: https://github.com/skyte/relative-strength/actions/runs/3583792763


SASL GSSAPI support

I have implemented experimental SASL GSSAPI auth mechanism support. To enable this - add {sasl, {kerberos, Keytab, Principal}} to client config. Please, let me know if you found any bugs. I want to add automatic ticket renew in future

@ElMaxo nice, thanks! We'll take a look.

Чуть не забыл. Для работы SASL+GSSAPI нужна libsasl2 (cyrus sasl)
2017-05-19 14:13 GMT+03:00 Ivan Dyachkov<EMAIL_ADDRESS>
@ElMaxo https://github.com/elmaxo nice, thanks! We'll take a look.
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub
https://github.com/klarna/brod/pull/208#issuecomment-302676027, or mute
the thread
https://github.com/notifications/unsubscribe-auth/AFZL5XT314Lv8Uk-yDgu78M67rOB-Ajrks5r7XlBgaJpZM4NgY68
.

--
С уважением, Давиденко Максим

@ElMaxo Thank you for your contribution.
This adds more compile time dependency for the users who don't need this new auth support.
We'd like to have this supported in a more flexible way:

Put the nif code to a separate Erlang project.
Add a {auth_callback_module, ModuleName} client config (and maybe introduce a -behaviour module to define the callback specs)
Update README with info about how to enable SASL GSSAPI in a Erlang project.

@zmstone ok, I'll do it in some days and write you back

Covered by #210


python3Packages.typesystem: fix on python3.8 and python3.9

Motivation for this change
Fix this package on python3.8 and python3.9. Disabled one test which is failing because of a cosmetic change in python3.8 formatting of regular expression flags, which I also filed as a bug report upstream.
Things done

[X] Tested using sandboxing (nix.useSandbox on NixOS, or option sandbox in nix.conf on non-NixOS linux)
Built on platform(s)

[X] NixOS
[ ] macOS
[ ] other Linux distributions

[ ] Tested via one or more NixOS test(s) if existing and applicable for the change (look inside nixos/tests)
[X] Tested compilation of all pkgs that depend on this change using nix-shell -p nixpkgs-review --run "nixpkgs-review wip"
[ ] Tested execution of all binary files (usually in ./result/bin/)
[ ] Determined the impact on package closure size (by running nix path-info -S before and after)
[ ] Ensured that relevant documentation is up to date
[X] Fits CONTRIBUTING.md.

Result of nixpkgs-review pr 107659 run on x86_64-linux 1

1 package marked as broken and skipped:

python39Packages.orm

2 packages failed to build:

python37Packages.orm
python38Packages.orm

3 packages built:

python37Packages.typesystem
python38Packages.typesystem
python39Packages.typesystem

ERROR: Could not find a version that satisfies the requirement PyMySQL<=0.9.3,>=0.9 (from aiomysql)
ERROR: No matching distribution found for PyMySQL<=0.9.3,>=0.9
cannot build derivation '/nix/store/7r7728fr6pv0yvxg18prw0syj8a5k2q8-python3.8-databases-0.2.6.drv': 1 dependencies couldn't be built
cannot build derivation '/nix/store/ww60ghmwamkkmby2ndm0gfiq6vj2007p-python3.8-orm-0.1.5.drv': 1 dependencies couldn't be built

Result of nixpkgs-review pr 107659 run on x86_64-darwin 1

1 package marked as broken and skipped:

python39Packages.orm

2 packages failed to build:

python37Packages.orm
python38Packages.orm

3 packages built:

python37Packages.typesystem
python38Packages.typesystem
python39Packages.typesystem

This should be good to go:
Result of nixpkgs-review run on x86_64-linux 1

1 package marked as broken and skipped:

python39Packages.orm

5 packages built:

python37Packages.orm
python37Packages.typesystem
python38Packages.orm
python38Packages.typesystem
python39Packages.typesystem

This is a semi-automatic executed nixpkgs-review with nixpkgs-review-checks extension. It is checked by a human on a best effort basis and does not build all packages (e.g. lumo, tensorflow or pytorch).
If you have any questions or problems please reach out to SuperSandro2000 on IRC.
Result of nixpkgs-review pr 107659 run on x86_64-darwin 1

1 package marked as broken and skipped:

python39Packages.orm

5 packages built:

python37Packages.orm
python37Packages.typesystem
python38Packages.orm
python38Packages.typesystem
python39Packages.typesystem

This is a semi-automatic executed nixpkgs-review with nixpkgs-review-checks extension. It is checked by a human on a best effort basis and does not build all packages (e.g. lumo, tensorflow or pytorch).
If you have any questions or problems please reach out to SuperSandro2000 on IRC.
Result of nixpkgs-review pr 107659 run on x86_64-darwin 1

1 package marked as broken and skipped:

python39Packages.orm

5 packages built:

python37Packages.orm
python37Packages.typesystem
python38Packages.orm
python38Packages.typesystem
python39Packages.typesystem

This is a semi-automatic executed nixpkgs-review with nixpkgs-review-checks extension. It is checked by a human on a best effort basis and does not build all packages (e.g. lumo, tensorflow or pytorch).
If you have any questions or problems please reach out to SuperSandro2000 on IRC.
Result of nixpkgs-review pr 107659 run on x86_64-linux 1

1 package marked as broken and skipped:

python39Packages.orm

5 packages built:

python37Packages.orm
python37Packages.typesystem
python38Packages.orm
python38Packages.typesystem
python39Packages.typesystem


luci-proto-batman-adv: Add minimal support for batadv_vlan

Make so getDevice for the interface does not return null.
See https://github.com/onemarcfifty/luci-proto-batman-adv/issues/1

Anyone else use batman?

Actually looking at the other protocols getDevices returns null as well...


translated some field

@shonhor22 the PR must be in the localisation package.
Please take a look here:
https://github.com/laravel-enso/Localisation#contributing-translations-for-an-existing-language


Backport: add reviewers as participants

Backport for #8121
This PR add reviewers to the list of participants of an issue.
Currently, only users that add a plain comment (CommentTypeComment) are counted as participants. If a user adds a review/request changes (CommentTypeReview or CommentTypeCode) they are not considered participants.
Fixes #8122

@lafriks this should have milestone 1.9.4 - the other one should have 1.10.0

I already set so

I guess the build failing is a CI problem?

I think the swagger/gomod changes that were made to master, may need to be backported first.
cc: @sapk

That's a make vendor failed not swagger.

@lunny you can see that swagger command modifies go.mod, which causes make vendor to fail.


use update-alternatives  to provide multiple versions

Currently we override env with every tool version. Maybe a better alternative is to use ubuntu update-alternatives.
https://serverfault.com/questions/631447/how-to-use-update-alternatives-per-user/811377#811377

Superseeded by #101


Make offline feature optional

The feature can be enabled with mjs_offline_feature property in the
manifest.json file.
Fixes #61.

Hi @vjrantal, I'm your friendly neighborhood Microsoft Pull Request Bot (You can call me MSBOT). Thanks for your contribution!

It looks like you're a Microsoft contributor (Ville Rantala). If you're full-time, we DON'T require a Contribution License Agreement. If you are a vendor, please DO sign the electronic Contribution License Agreement. It will take 2 minutes and there's no faxing! https://cla.microsoft.com.

TTYL, MSBOT;

Hi @vjrantal ,
Thank you for the pull request.  From the code it looks like this would disable to offline page by default, I think we would want to enable by default and allow a parameter to turn it off if you don't want it.  right?

@boyofgreen: You are right that I initially changed the feature to be opt-in (ref: https://github.com/manifoldjs/ManifoldCordova/issues/61#issuecomment-211862291).
If it is preferred to be opt-out, I will amend the commit.
I guess I was just wondering how many would ship an app to production with the default offline page? Or, would it be that if someone wants to leverage this feature, they'd anyways do some tweaks for the offline page and it wouldn't maybe then be too bad to also add a custom manifest.json property (i.e., explicitly opt-in for the feature)?
Also, if someone wants to invest into good offline behavior, would they want to leverage Application Cache or Service Workers? If that would be the case, then the developer would always have to remember to disable the ManifoldJS offline feature first (in case it would be opt-out).

What you are saying is actually a good stratigy, but what I would like to do is start by adding it with it on, and get people use to the idea that there is a switch.  Then in a future release we can turn it off by default.  We need to do a bit of education first, honestly, most folks do just use the default (and sometimes dress it up a bit), and I don't ever want there to be a Manifoldjs app that gives a 404 to users :|   if you can make the adjustment, I would be greatful, we want to start testing this next release the week after next.
Thanks,
Jeff

also, can you do the pull request to the v0.3 branch.  Sorry about that.

@boyofgreen: What you say above makes sense. Will close this one and make the changes as proposed.


Add OUIA-ID for service account flow

What this PR does / why we need it:

Add OUIA-ID for service account flow

Which issue the PR resolves
https://issues.redhat.com/browse/MGDSTRM-8694

This looks good too. I made a small change to the OUIA-ID name for the table ... I changed it to "card-table" and "card-table-row" so it's consistent with the other tabs/pages.


Add clock skew support to AccessTokenProviderChain

This fixes #1909 and adds clock skew support to AccessTokenProviderChain. As with OAuth2RestTemplate the default clock skew is set to 30s.
Background: The fix for #1287 added a clock skew to OAuth2RestTemplate but there is another expiration check in AccessTokenProviderChain that does not take this into account which renders this fix useless when used in combination with AccessTokenProviderChain.

@akloeber Please sign the Contributor License Agreement!
Click here to manually synchronize the status of this Pull Request.
See the FAQ for frequently asked questions.

@akloeber Thank you for signing the Contributor License Agreement!

Thanks for this fix @akloeber ! This is now in master.

@jgrandja Sorry to bother you again, but what's the roadmap for the next 2.5.1 release? We want to consume this bugfix in our application landscape to stop these issues.

@akloeber I scheduled 2.5.1 for April 8.

@akloeber 2.5.1 is now available in Central


update StringResources.tr.xaml

To support localization, Turkish translation added.

Thank you. Would you like to add your name or nickname as the author of this update?

Thank you. Would you like to add your name or nickname as the author of this update?

That sounds great. But I didn't exactly understand that where I suppose to add my name.

That sounds great. But I didn't exactly understand that where I suppose to add my name.

You can tell me and I put it there.

You can tell me and I put it there.

Okay, then you can add my name as "Volkan Dağdelen". Thank you.

Okay, then you can add my name as "Volkan Dağdelen". Thank you.

Ok, I'll add it. Thanks.

Ok, I'll add it. Thanks.


Support AMS 0.10.x

I haven't added specs as the top level stuff doesn't have access to Rails and I didn't have time right now to figure out the spec/dummy stuff.

I'm going to close this for now. If you add specs and documentation, we can reopen it.


Images show nothing when first loaded even when the files are fully downloaded

current solution is to reload all post images every 30 seconds. Which results in random freezes and possibly more memory consumption.

Lesson learned.
close file after you're done with it :)


Fixes tests, related bugs and adds tests to CI

coverage: 83.068% (+80.6%) from 2.441%
when pulling ee2cb58cd1de8eca5e9467116080e95023dda5d1 on feature/add-new-tests-to-CI
into 6049a734ff608f31ff61840f52848e4b14dcaf4e on develop.


swayimg: 1.12 -> 2.0

Description of changes
changelog: https://github.com/artemsen/swayimg/releases/tag/v2.0
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

[x] 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/)
24.05 Release Notes (or backporting 23.05 and 23.11 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.

Result of nixpkgs-review pr 278552 run on x86_64-linux 1

1 package built:

swayimg


doc: Update ruby setup action so it works for 2.7.1

I tried to set up this action as it exists, but I got setup issues saying ruby version 2.7.1 was not available. Following a few google leads I found that the project is now ruby/setup-ruby.

Thank you for the contribution @arunv!


Add Alertsnitch integration

Following https://github.com/prometheus/alertmanager/issues/560#issuecomment-480790361
I'm adding Alertsnitch as a webhook receiver.

Looks like the DCO is missing for the second commit. git commit -s --amend should fix it.

Ooops, check now


Json creation in Standalone viewer

Hi
do you have a  script in order to create such json files , for example from a dicom query to the pacs ?
In order to create a package for a single real world study?
I mean something
createStudyJson.sh  aet[@host[:port]] -Accnum="MystudyAccnumb" -o Mystudy.json
Thank you
Paolo

Hi,
So, we've had the same issue in my company, in order to resolve this we make a little node.js server which is responsible in get a vector of dcms files and return the formated JSON. We put it in a server because it is used by more than one application, so we keep everything separate. I'll put the code of the parser, feel free to copy and modify.
We used the parseDicom from cornerstone to get the data from the dcm files. After this function, we sort the series and instances.
function parseAndInsertFile(content, url, finalJSON) {
	return new Promise(function(resolve, reject){
		var dataSet;
		//mount the JSON
		dataSet = ctrlParser.parseDicom(content);
		var fileJSON = {};
		fileJSON['transactionId'] = 'img';
		fileJSON['fileDate'] = dataSet.string('x00080012');
		fileJSON['fileTime'] = dataSet.string('x00080013');
		fileJSON['studies'] = [];
		var study = {};

		study['studyInstanceUid'] = dataSet.string('x0020000d');
		study['studyDescription'] = dataSet.string('x00081030');
		study['studyDate'] = dataSet.string('x00080020');
		study['studyTime'] = dataSet.string('x00080030');

		var patient = {}
		patient['patientName'] = dataSet.string('x00100010');
		var age = dataSet.string('x00101010');
		var units = ((age.slice(-1) == 'Y')? 'Anos': (age.slice(-1) == 'M')?'Meses':'Dias');
		patient['patientAge'] = age.slice(0,3) + ' ' + units;
		patient['patientAllergies'] = dataSet.string('x00102110')
		patient['patientBirthDate'] = dataSet.string('x00100030');
		patient['patientId'] = dataSet.string('x00100020');
		patient['patientSex'] = dataSet.string('x00100040');
		study['patient'] = patient;

		var equipament = {};
		equipament['manufacturer'] = dataSet.string('x00080070');
		equipament['model'] = dataSet.string('x00081090');
		equipament['stationName'] = dataSet.string('x00081010');
		equipament['AETitle'] = dataSet.string('x00020016');
		equipament['institutionName'] = dataSet.string('x00080080');
		equipament['softwareVersion'] = dataSet.string('x00181020');
		equipament['implementationVersionName'] = dataSet.string('x00020013');
		study['equipament'] = equipament;

		var physician = {}
		physician['name'] = dataSet.string('x00080090');
		physician['identification'] = dataSet.string('x00080092');

		study['physician'] = physician

		study['seriesList'] = [];
		var serie = {};
		serie['seriesDescription'] = dataSet.string('x0008103e');
		serie['seriesInstanceUid'] = dataSet.string('x0020000e');
		serie['seriesBodyPart'] = dataSet.string('x00180015');
		serie['seriesNumber'] = dataSet.string('x00200011');
		serie['seriesDate'] = dataSet.string('x00080021');
		serie['seriesTime'] = dataSet.string('x00080031');
		serie['seriesModality'] = dataSet.string('x00080060');
		serie['instances'] = [];

		var instance = {};
		instance['columns'] = dataSet.uint16('x00280011');
		instance['rows'] = dataSet.uint16('x00280010');
		instance['instanceNumber'] = (dataSet.string('x00200013'));
		instance['acquisitionNumber'] = dataSet.string('x00200012');
		instance['photometricInterpretation'] = dataSet.string('x00280004');
		instance['bitAllocated'] = dataSet.uint16('x00280100');
		instance['bitsStored'] = dataSet.uint16('x00280101');
		instance['pixelRepresentation'] = dataSet.uint16('x00280103');
		instance['samplesPerPixel'] = dataSet.uint16('x00280002');
		instance['pixelSpacing'] = dataSet.string('x00280030');
		instance['highBit'] = dataSet.uint16('x00280102');
		instance['rescaleSlope'] = dataSet.string('x00281053');
		instance['rescaleIntercept'] = dataSet.string('x00281052');
		instance['imageOrientationPatient'] = dataSet.string('x00200037');
		instance['imagePositionPatient'] = dataSet.string('x00200032');
		instance['imageType'] = dataSet.string('x00080008');
		instance['sopInstanceUid'] = dataSet.string('x00080018');
		url = url.replace('http', 'wadouri')
		instance['url'] = url;

		serie['instances'].push(instance);
		study['seriesList'].push(serie);
		fileJSON['studies'].push(study);
		//console.log(dataSetJSON);

		//Insert
		if(isEmpty(finalJSON)){
			//primeiro arquivo
			finalJSON = fileJSON;
			finalJSON['transactionId'] = finalJSON.studies[0].studyDescription;
		} else {
			//já foi inserido um estudo
			var isValid = validateFile(fileJSON, finalJSON);
			if (isValid){
				//Insere o DICOM na sua respectiva serie
				var fileStudy = fileJSON.studies[0];
				var fileSerie = fileJSON.studies[0].seriesList[0];
				var fileInstance = fileSerie.instances[0];

				var studyIndex = finalJSON.studies.findIndex(function(study, i){
					return study.studyInstanceUid === fileStudy.studyInstanceUid;
				})
				if (studyIndex >=0){
					//estudo já existe
					var serieIndex = finalJSON.studies[studyIndex].seriesList.findIndex(function(serie, i){
						return serie.seriesInstanceUid === fileSerie.seriesInstanceUid;
					});
					if (serieIndex >= 0 ){
						//já há instancias desta serie inclusas, incluindo mais uma
						finalJSON.studies[studyIndex].seriesList[serieIndex].instances.push(fileInstance);
					}else{
						//primeira instancia desta serie
						finalJSON.studies[studyIndex].seriesList.push(fileSerie);
					}
				} else {
					finalJSON.studies.push(fileStudy);
				}
			}
		}
		resolve(finalJSON);
	});
};

Hi
This is a very interesting approach.
I'll try to implement something like this .
Thank you for the code
Paolo

Hi guys,
The JSON approach was initially an experiment when the standalone viewer was created. I honestly didn't expect so many people to start using it. I think we want to move towards something more standard for launching the viewer, like the DICOM JSON response to WADO-RS RetrieveMetadata for example.
For example, if you run this (sorry @pieper for using your server):
curl -H 'Accept: application/json' quantome.org:8080/dcm4chee-arc/aets/DCM4CHEE/rs/studies/<IP_ADDRESS>.<IP_ADDRESS>.1402019790780585883468456314383507/metadata | python -m json.tool

(remove the | python stuff if you don't want it pretty-printed)
you will get the DICOM JSON example.
We might also consider supporting the "Normalized DICOM JSON" approach as well, since it's a bit less verbose than typical DICOM JSON. @pieper - I can't seem to find the live example for that, so if you have it feel free to post it.
Some open questions (up for discussion):

How do we make this transition? Just add another query string param? (?url = old format, ?dicomUrl= DICOM JSON format, nddUrl = Normalized DICOM format?)

Do we want to make the standalone viewer accept a DICOMWeb server URL instead (?server = quantome.org:8080&studyInstanceUids=XYZ,ABC,DEF)

How do we suggest users handle authentication?

The best option would be that we would look in the users localstorage/cookies for an existing token (e.g. from Keycloak) and use that when making all requests. For cases where no token is already present, it could be passed in the query parameters. The standalone viewer has no logic to do token refreshing, though. This might be fine temporarily, but it will be an issue if users need to save results.

@swederik no problem using the quantome.org server for demos (of course there's no uptime assurance for it!).
To get an idea of "NDD" format see here: https://github.com/pieper/dcmjs/wiki/NDD-Format
To try it on your data, you can drag and drop dicom files to this example page:
https://pieper.github.io/dcmjs/examples/display/index.html
(There's also a button to download sample data from a public server but if you click it be patient since it takes a minute or so to download).
By the way, it's been on my TODO list for a while to provide some node-based command line tools as part of the DCMJS npm package but I haven't had a chance to work on it.  PRs welcome 😄

Very interesting
Thank you
Paolo

And here's another one, which just adds the file stuff on top of @MuriloSchaefer's script: https://gist.github.com/swederik/b7901bd933e6497720783e532616eec0

Hi! I'm trying to run this script (https://gist.github.com/swederik/b7901bd933e6497720783e532616eec0) to generate the JSON file from my DICOM file but when trying to use it from the Standalone Viewer the following error is prompt in my browser:
Error: loadImageFromImageLoader: no image loader for imageId
at loadImageFromImageLoader (ohif_cornerstone.js?hash=b2d4f3d201840adb2975e3fbc1f00e4786b64831:6133)
at Module.loadAndCacheImage (ohif_cornerstone.js?hash=b2d4f3d201840adb2975e3fbc1f00e4786b64831:6199)
This is the JSON that I was able to generate from my DCM file using the above JS script
{
"transactionId": "study",
"studies": [
{
"studyInstanceUid": "1.2.8<IP_ADDRESS>80043.2.1208.154494870514920191158835635",
"studyDate": "20180817",
"studyTime": "080835.000000",
"patientName": "SANCHEZ MARIA DELIA",
"patientBirthDate": "20050226",
"patientId": "NO ID",
"patientSex": "F",
"seriesList": [
{
"seriesInstanceUid": "1.2.8<IP_ADDRESS>80043.2.1208.254494870514920191158835642",
"seriesBodyPart": "SPINE LUMBAR",
"seriesNumber": "0001",
"seriesDate": "20180817",
"seriesTime": "080835.000000",
"seriesModality": "OT",
"instances": [
{
"columns": 3610,
"rows": 4400,
"instanceNumber": "0001",
"photometricInterpretation": "MONOCHROME2",
"bitAllocated": 16,
"bitsStored": 12,
"pixelRepresentation": 0,
"samplesPerPixel": 1,
"highBit": 11,
"rescaleSlope": "1.00",
"rescaleIntercept": "0.00",
"imageType": "ORIGINAL\PRIMARY\OTHER",
"sopInstanceUid": "1.2.8<IP_ADDRESS>80043.2.1208.354494870514920191158835644",
"url": "file://Users/johannamussolini/code/Viewers/StandaloneViewer/StandaloneViewer/private/testData/examples/1.2.8<IP_ADDRESS>80043.2.1208.154494870514920191158835635/1.2.8<IP_ADDRESS>80043.2.1208.254494870514920191158835642/1.2.8<IP_ADDRESS>80043.2.1208.354494870514920191158835644.dcm"
}
]
}
]
}
]
}
Is there any problem with the DICOM image file? Is it not supported? How can I know the ImageId?
Any help would be really appreciated! thanks!

the protocol that you used in your url is 'file', try to use the 'dicomweb' protocol. So the file url would be something like:
'dicomweb://Users/johannamussolini/code...'

that's because my file is located locally and I'm running the Standalone viewer locally... do you think that's the issue? should I've to upload my images in the web so I can generate the JSON with an URL?

you can start a local server and then you can call the url like: "dicomweb:/localhost/folder1...".
this issue is related to the protocol that you're using.

oh ok, so I did that, started the server and updated the url parameter in my JSON file:
"url": "dicomweb:/localhost:5000/1.2.8<IP_ADDRESS>80043.2.1208.354494870514920191158835644.dcm"
, but now the error is:
"An error occurred when loading image: dicomweb:/localhost:5000/1.2.8<IP_ADDRESS>80043.2.1208.354494870514920191158835644.dcm
Details: [object: Object]"
So, I'm not sure, maybe the JSON was wrongly generated and for some reason the StandaloneViewer cannot display it?
Thanks again!

can you find out what these details are?

I've just figured out...It was a cosmetic issue in the url you sent me above,... my bad sorry:
the correct url has double / like this, and now the file was loaded:
dicomweb://localhost:5000/1.2.8<IP_ADDRESS>80043.2.1208.354494870514920191158835644.dcm
worked great! thanks so much for your help!

Just another concern... My DICOM files are generated under a folder which have this structure:
1.2.8<IP_ADDRESS>80043.2.1208.1544948705149201921111140813 (root folder)
-> 1.2.8<IP_ADDRESS>80043.2.1208.25449487051492019211111426
--> 1.2.8<IP_ADDRESS>80043.2.1208.35449487051492019211111427.dcm
-> 1.2.8<IP_ADDRESS>80043.2.1208.25449487051492019211111435
--> 1.2.8<IP_ADDRESS>80043.2.1208.35449487051492019211111435.dcm
and so on.... several others folders inside
When I was trying to use the script (https://gist.github.com/swederik/b7901bd933e6497720783e532616eec0) it seems that only takes DCM files under only one folder (maybe I did something wrong)... so I cannot get this script to generate the JSON correctly ...Anyway... what I tried to do is to put all DCM files under the root folder and ran the script to see how the JSON would be generated... however it generated only one serie per file and the frames are not displayed... so I'm not sure what I'm doing wrong.
Again, any guidance would be really appreciated.
Thanks!

@MuriloSchaefer: disregard,.. I was able to do it by using this:
const readdir = require('readdir-enhanced');
instead of fs.readdir and changing some code by:
readdir(testFolder, {filter: myFilter, deep: true, basePath: absPath}, function(err, files){
... script code here with some changes
}
function myFilter(stats) {
return stats.isFile() && (stats.path.replace(/^.*?.([a-zA-Z0-9]+)$/, "$1") === 'dcm');
}
by doing this I just get all .dcm files (which are under 'testFolder' and its subfolders recursively and I can just parse those files only).
Thanks for your help!

We're getting ready to formally announce version 2 of the OHIF Viewer. After the announcement, version 1 issues will receive lower priority support. As this issue is a bit stale, I'm going to close it for now.

Hi, So, we've had the same issue in my company, in order to resolve this we make a little node.js server which is responsible in get a vector of dcms files and return the formated JSON. We put it in a server because it is used by more than one application, so we keep everything separate. I'll put the code of the parser, feel free to copy and modify. We used the parseDicom from cornerstone to get the data from the dcm files. After this function, we sort the series and instances.
function parseAndInsertFile(content, url, finalJSON) {
	return new Promise(function(resolve, reject){
		var dataSet;
		//mount the JSON
		dataSet = ctrlParser.parseDicom(content);
		var fileJSON = {};
		fileJSON['transactionId'] = 'img';
		fileJSON['fileDate'] = dataSet.string('x00080012');
		fileJSON['fileTime'] = dataSet.string('x00080013');
		fileJSON['studies'] = [];
		var study = {};

		study['studyInstanceUid'] = dataSet.string('x0020000d');
		study['studyDescription'] = dataSet.string('x00081030');
		study['studyDate'] = dataSet.string('x00080020');
		study['studyTime'] = dataSet.string('x00080030');

		var patient = {}
		patient['patientName'] = dataSet.string('x00100010');
		var age = dataSet.string('x00101010');
		var units = ((age.slice(-1) == 'Y')? 'Anos': (age.slice(-1) == 'M')?'Meses':'Dias');
		patient['patientAge'] = age.slice(0,3) + ' ' + units;
		patient['patientAllergies'] = dataSet.string('x00102110')
		patient['patientBirthDate'] = dataSet.string('x00100030');
		patient['patientId'] = dataSet.string('x00100020');
		patient['patientSex'] = dataSet.string('x00100040');
		study['patient'] = patient;

		var equipament = {};
		equipament['manufacturer'] = dataSet.string('x00080070');
		equipament['model'] = dataSet.string('x00081090');
		equipament['stationName'] = dataSet.string('x00081010');
		equipament['AETitle'] = dataSet.string('x00020016');
		equipament['institutionName'] = dataSet.string('x00080080');
		equipament['softwareVersion'] = dataSet.string('x00181020');
		equipament['implementationVersionName'] = dataSet.string('x00020013');
		study['equipament'] = equipament;

		var physician = {}
		physician['name'] = dataSet.string('x00080090');
		physician['identification'] = dataSet.string('x00080092');

		study['physician'] = physician

		study['seriesList'] = [];
		var serie = {};
		serie['seriesDescription'] = dataSet.string('x0008103e');
		serie['seriesInstanceUid'] = dataSet.string('x0020000e');
		serie['seriesBodyPart'] = dataSet.string('x00180015');
		serie['seriesNumber'] = dataSet.string('x00200011');
		serie['seriesDate'] = dataSet.string('x00080021');
		serie['seriesTime'] = dataSet.string('x00080031');
		serie['seriesModality'] = dataSet.string('x00080060');
		serie['instances'] = [];

		var instance = {};
		instance['columns'] = dataSet.uint16('x00280011');
		instance['rows'] = dataSet.uint16('x00280010');
		instance['instanceNumber'] = (dataSet.string('x00200013'));
		instance['acquisitionNumber'] = dataSet.string('x00200012');
		instance['photometricInterpretation'] = dataSet.string('x00280004');
		instance['bitAllocated'] = dataSet.uint16('x00280100');
		instance['bitsStored'] = dataSet.uint16('x00280101');
		instance['pixelRepresentation'] = dataSet.uint16('x00280103');
		instance['samplesPerPixel'] = dataSet.uint16('x00280002');
		instance['pixelSpacing'] = dataSet.string('x00280030');
		instance['highBit'] = dataSet.uint16('x00280102');
		instance['rescaleSlope'] = dataSet.string('x00281053');
		instance['rescaleIntercept'] = dataSet.string('x00281052');
		instance['imageOrientationPatient'] = dataSet.string('x00200037');
		instance['imagePositionPatient'] = dataSet.string('x00200032');
		instance['imageType'] = dataSet.string('x00080008');
		instance['sopInstanceUid'] = dataSet.string('x00080018');
		url = url.replace('http', 'wadouri')
		instance['url'] = url;

		serie['instances'].push(instance);
		study['seriesList'].push(serie);
		fileJSON['studies'].push(study);
		//console.log(dataSetJSON);

		//Insert
		if(isEmpty(finalJSON)){
			//primeiro arquivo
			finalJSON = fileJSON;
			finalJSON['transactionId'] = finalJSON.studies[0].studyDescription;
		} else {
			//já foi inserido um estudo
			var isValid = validateFile(fileJSON, finalJSON);
			if (isValid){
				//Insere o DICOM na sua respectiva serie
				var fileStudy = fileJSON.studies[0];
				var fileSerie = fileJSON.studies[0].seriesList[0];
				var fileInstance = fileSerie.instances[0];

				var studyIndex = finalJSON.studies.findIndex(function(study, i){
					return study.studyInstanceUid === fileStudy.studyInstanceUid;
				})
				if (studyIndex >=0){
					//estudo já existe
					var serieIndex = finalJSON.studies[studyIndex].seriesList.findIndex(function(serie, i){
						return serie.seriesInstanceUid === fileSerie.seriesInstanceUid;
					});
					if (serieIndex >= 0 ){
						//já há instancias desta serie inclusas, incluindo mais uma
						finalJSON.studies[studyIndex].seriesList[serieIndex].instances.push(fileInstance);
					}else{
						//primeira instancia desta serie
						finalJSON.studies[studyIndex].seriesList.push(fileSerie);
					}
				} else {
					finalJSON.studies.push(fileStudy);
				}
			}
		}
		resolve(finalJSON);
	});
};

cloud you share me your full html/js files, thank you very much!
<EMAIL_ADDRESS>

Dear OHIF Viewer team,
I am currently using the OHIF Viewer in my web application and I am experiencing an issue with playing all frames of a DICOM file when loading studies through my ASP.NET Core API using JSON. While this functionality works fine in local mode, it seems to be malfunctioning when the studies are loaded via my API.
I have followed the official documentation of OHIF Viewer closely and cannot seem to identify the missing segment causing the issue.
I would greatly appreciate your guidance in resolving this matter. Could you please advise me on what I may be missing or what steps I can take to troubleshoot this issue?
Thank you for your assistance.

We recently added several recipes for implementing authentication with Keycloak in OHIF. You can find them here:
https://docs.ohif.org/deployment/user-account-control

这是来自QQ邮箱的假期自动回复邮件。

您好，我最近正在休假中，无法亲自回复您的邮件。我将在假期结束后，尽快给您回复。


Clarification on new willTransitionTo callback

I am upgrading to 0.12 and I am slightly confused about how to handle the upgrade from wait to callback. If I call transition.redirect during some asychronous behavior, do I need to call the callback or should I not? Here is a sample of what I am trying to upgrade:
authPromise.then(function () {
  if (!someCondition) {
    transition.redirect('other-route');
  }
}).catch(function (err) {
  SignIn.attemptedTransition = transition;

  transition.redirect('sign-in');
});

transition.wait(authPromise);

Do I need to call the callback in the catch of the promise? In the then handler should I call the callback in an else block of the if (!someCondition) or can I just call it all the time in that then handler?

You must to call the callback if you define this parameter (which you need for “waiting”).
Just chain it as last step:
authPromise.then(function () {
  if (!someCondition) {
    transition.redirect('other-route');
  }
}).catch(function (err) {
  SignIn.attemptedTransition = transition;

  transition.redirect('sign-in');
}).then(callback);

(You can also do .then(callback, callback) if you want navigation to occur regardless of failures in your code.)

So just to clarify, even if I redirect the transition away using transition.redirect, the callback should still be called.

Yes. It would be more error-prone if we were more forgiving and interpret transition methods as callback calls.

Closing as this appears to be resolved.

@gaearon I just realized that this ends up swallowing any errors that I have in my render methods of components that use this mixin. Do you have any suggestions about how to handle this?

I think you should be able to rethrow?
.catch(function (err) {
  SignIn.attemptedTransition = transition;
  transition.redirect('sign-in');
  throw err;
});

I tried this, and nothing appeared in the console:
.catch(function (err) {
  SignIn.attemptedTransition = transition;
  transition.redirect('sign-in');
}).then(callback).catch(function (err) {
  throw err;
});

However, if I console.log in that last catch it exists, but for some reason throw is not doing anything.

Depending on the promise library you're using (like es6-promise) a thrown error that isnt handled doesnt bubble up to window. I ended up switching to Q because of this.

Yea, I am using es6-promise so that explains why nothing was happening. There has to be some way to surface the error without every single error in render being swallowed.

You can use setTimeout:
.catch(function (err) {
  setTimeout(function(){
    throw err;
  }, 0);
});

Some libraries also provide a promise.done() for cases like this, but it's not part of the spec.

Seems so janky, but also will fix the issue. Thanks for the tip. This is why some days I just really don't like promises haha.

I tried this, and nothing appeared in the console:

This is not exactly what I wrote. You're rethrowing after first catch. This won't work because you're swallowing the error in the first catch. You need to rethrow there.

My original code wasn't right either; it seems that you want to fire callback before rethrowing. Hmm. What is that error you're catching? Can you check its type in catch and only rethrow unfamiliar errors?

In development, I had a SyntaxError in one of my render functions. What happened was that the error was being swallowed by the .then(callback).
If I place another catch after the transition callback the error exists in that catch when I use console.log. I've verified that the error exists, but throwing it does nothing. It seems that the reason is due to how es6-promise behaves as merk described above.


feat: enable bridge and update url

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

GitHub release
npm package (@latest dist-tag)

Your semantic-release bot :package::rocket:


[5.3] fix convenience accessors on CocoaError and URLError

fixes SR-13037 (https://bugs.swift.org/browse/SR-13037)

(previously merged to master in #2828)

@swift-ci test


Add -target flag to add command

Add a flag to be used for triggers called -target, in which the valid value is any string, and is used as the preset target for the default trigger buildfile. The default value is "Account", but if one is specified, it will be used instead.
dev add trigger testTrigger -target Contact

trigger testTrigger on Contact { ... }


Rework connected blocks to use a simpler built-in model generator

Named something like changed:builtin/connected_floor, the connected floor textures can be redone to reduce needless textures. Instead of using corner segments, the model will automatically select parts of these 5 textures.

Trying to make a model generator that'll populate variants for each state is proving to be a hassle, and may be incompatible with modernfix


Updated Spanner Dataflow connector samples

- testing dataflow/spanner-io
------------------------------------------------------------
[ERROR] src/main/java/com/example/dataflow/SpannerGroupWrite.java:[16] (whitespace) EmptyLineSeparator: 'package' should be separated from previous statement.
[ERROR] src/main/java/com/example/dataflow/SpannerGroupWrite.java:[26] (imports) AvoidStarImport: Using the '.*' form of import should be avoided - org.apache.beam.sdk.options.*.
[ERROR] src/main/java/com/example/dataflow/SpannerGroupWrite.java:[32] (sizes) LineLength: Line is longer than 100 characters (found 103).
[ERROR] src/main/java/com/example/dataflow/SpannerGroupWrite.java:[56] (whitespace) EmptyLineSeparator: 'METHOD_DEF' should be separated from previous statement.
[ERROR] src/main/java/com/example/dataflow/SpannerGroupWrite.java:[70] (sizes) LineLength: Line is longer than 100 characters (found 128).
[ERROR] src/main/java/com/example/dataflow/TransactionalRead.java:[29] (imports) AvoidStarImport: Using the '.*' form of import should be avoided - org.apache.beam.sdk.options.*.
[ERROR] src/main/java/com/example/dataflow/EstimateSize.java:[16] (whitespace) EmptyLineSeparator: 'package' should be separated from previous statement.
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-checkstyle-plugin:2.17:check (default) on project dataflow-spanner: You have 7 Checkstyle violations. -> [Help 1]

[ID: 8307783] Build finished after 113 secs, exit value: 1

Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.
Build script failed with exit code: 1

I've fixed checkstyle issues.

Please take a look, I've updated the tests and checked that the checkstyle passes