refactor: refHandling accepts a config object instead of a string (II)

What kind of change does this PR introduce?
Refactor
What is the current behaviour?
refHandling option accepts a string: "inline" | "keep" | "import".
What is the new behaviour?
refHandling option accepts a config object: {strategy: "inline" | "keep" | "import"}
Does this PR introduce a breaking change?
Yes: refHandling option should be expressed a config object.
Other information:
Please check if the PR fulfills these requirements:

[X] Tests for the changes have been added
[X] Docs have been added / updated
[X] Relevant Changeset has been added

coverage: 100.0%. remained the same
when pulling 2e6103b42cfd06cad126ae58eeaee2ea920c2384 on refHandling-option-as-object
into 77411a0c3ddf4fb50abb77f3a52c08dcaf8082de on master.


Finding out if a user is an admin

Hi,
I'm looking for a way to find out if a user is an admin or not.
I have a discord.py bot that I'm trying to rewrite in Go.
Many of the commands in that bot are only for admins to use - erasing messages, for example.
I've checked in the user and members types, and also the role types, but none of these have an admin property available.
The closest I can see is the permissions property on Role, but it returns integer values.
There doesn't seem to be any guidance for what permission values mean what permissions.
Can you advise me on if there is such a function or property as 'isAdmin' that already exists? Or if not, can you let me know how to find out what permissions mean what?
Thanks!

i think you should be using (*Session).State.UserChannelPermissions in something like this (someone else correct me if i'm wrong)
perms, err := session.State.UserChannelPermissions(userID, channelID)
if err != nil {
  // handle err...
}
if perms&discordgo.PermissionAdministrator == 0 {
  // user is not an administrator.
} else {
  // user is an administrator.
}

this basically checks to see if the user with ID userID has administrator permissions in the channel with ID channelID. you can also replace discordgo.PermissionAdministrator with something like discordgo.PermissionManageMessages to check if the user has Manage Message permissions in that channel, or whatever else you replace it with. check this part of the docs for a list of all the permissions.

i think you should be using (*Session).State.UserChannelPermissions in something like this (someone else correct me if i'm wrong)
perms, err := session.State.UserChannelPermissions(userID, channelID)
if err != nil {
    // handle err...
}

if perms&discordgo.PermissionAdministrator == 0 {
    // user is not an administrator.
} else {
    // user is an administrator.
}

this basically checks to see if the user with ID userID has administrator permissions in the channel with ID channelID. you can also replace discordgo.PermissionAdministrator with something like discordgo.PermissionManageMessages to check if the user has Manage Message permissions in that channel, or whatever else you replace it with. check this part of the docs for a list of all the permissions.

err is not nil, it is state cache not found, but it correctly knows that I am an administrator. I currently cannot try it on a different server (or with a different account) to check if it also correctly knows when I am not an administrator.
That said, I have no clue why I get state cache not found. Any ideas?

While searching for answers myself, I noticed that #876 attempts to answer a similar question, so I figured I'd drop a link to it here.
I actually ended up not using any State methods, and instead retrieved the user permissions from (*InteractionCreate).Member.Permissions, though that will only be useful if you're making use of Slash Commands.


Inaccurate Parameter Description

Parameter description suggests that it takes in a prefix, while any part of the string should work.

Similar to #142, the event says 'starting' but it does not actually start with it.

Closed by #157


Unresponsive bottom right part of the screen

Describe the bug
The bottom right part of the screen is unresponsive in a tall rectangular region.
To Reproduce
Interact with something on the specified region.
Expected behavior
The interaction should do something.
Screenshot

The red region is an approximation of the unsesponsive region.
Desktop (please complete the following information):

Archlinux
Hyprland

Can you export your config and share it please? Please remember to redact your weather API key.

Here is my config.
hyprpanel_config.json

This should be fixed now, please reopen if the issue still persists.


Wearing guitar on your back.

About the PR
Screenshots

Changelog

:cl: lapatison

add: some code for acoustic guitar

Make your changelog more descriptive and player-friendly, people will see it in-game  as "some code for acoustic guitar" and have no clue what was added.

Make your changelog more descriptive and player-friendly, people will see it in-game as "some code for acoustic guitar" and have no clue what was added.

Thank you, description has been updated.


Colab notebook doesn't work

The colab env doesn't support requirement packages so installation cell fails:
Looking in links: https://download.pytorch.org/whl/cu101/torch_stable.html
ERROR: Could not find a version that satisfies the requirement torch==1.5 (from versions: 1.11.0, 1.12.0, 1.12.1, 1.13.0, 1.13.1, 2.0.0, 2.0.1, 2.1.0, 2.1.1, 2.1.2)
ERROR: No matching distribution found for torch==1.5
Requirement already satisfied: cython in /usr/local/lib/python3.10/dist-packages (3.0.8)
Collecting pyyaml==5.1
  Using cached PyYAML-5.1.tar.gz (274 kB)
  error: subprocess-exited-with-error

  × python setup.py egg_info did not run successfully.
  │ exit code: 1
  ╰─> See above for output.

  note: This error originates from a subprocess, and is likely not a problem with pip.
  Preparing metadata (setup.py) ... error
error: metadata-generation-failed

× Encountered error while generating package metadata.
╰─> See above for output.

note: This is an issue with the package mentioned above, not pip.
hint: See above for details.
Collecting git+https://github.com/cocodataset/cocoapi.git#subdirectory=PythonAPI
  Cloning https://github.com/cocodataset/cocoapi.git to /tmp/pip-req-build-688i0rmv
  Running command git clone --filter=blob:none --quiet https://github.com/cocodataset/cocoapi.git /tmp/pip-req-build-688i0rmv
  Resolved https://github.com/cocodataset/cocoapi.git to commit 8c9bcc3cf640524c4c20a9c40e89cb6a2f2fa0e9
  Preparing metadata (setup.py) ... done
Requirement already satisfied: setuptools>=18.0 in /usr/local/lib/python3.10/dist-packages (from pycocotools==2.0) (67.7.2)
Requirement already satisfied: cython>=0.27.3 in /usr/local/lib/python3.10/dist-packages (from pycocotools==2.0) (3.0.8)
Requirement already satisfied: matplotlib>=2.1.0 in /usr/local/lib/python3.10/dist-packages (from pycocotools==2.0) (3.7.1)
Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=2.1.0->pycocotools==2.0) (1.2.0)
Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=2.1.0->pycocotools==2.0) (0.12.1)
Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=2.1.0->pycocotools==2.0) (4.47.2)
Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=2.1.0->pycocotools==2.0) (1.4.5)
Requirement already satisfied: numpy>=1.20 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=2.1.0->pycocotools==2.0) (1.23.5)
Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=2.1.0->pycocotools==2.0) (23.2)
Requirement already satisfied: pillow>=6.2.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=2.1.0->pycocotools==2.0) (9.4.0)
Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=2.1.0->pycocotools==2.0) (3.1.1)
Requirement already satisfied: python-dateutil>=2.7 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=2.1.0->pycocotools==2.0) (2.8.2)
Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.7->matplotlib>=2.1.0->pycocotools==2.0) (1.16.0)
Requirement already satisfied: dominate==2.4.0 in /usr/local/lib/python3.10/dist-packages (2.4.0)
Looking in links: https://dl.fbaipublicfiles.com/detectron2/wheels/cu101/index.html
ERROR: Could not find a version that satisfies the requirement detectron2==0.1.2 (from versions: none)
ERROR: No matching distribution found for detectron2==0.1.2

Hi , did you manage to overcome this issue?


Add method for confirm change password with steam guard

Is your feature request related to a problem? Please describe.
I want change password steam account, but don't see method for this.
Describe the solution you'd like
Method for confirm change password.
Describe alternatives you've considered
I thought about change with confirm email and sms code, but for this I should remove steam guard and get trade ban on 15 day.
Additional context
I don't have steam mobile guard, I have only identitySecret, sharedSecret, botName, password. That's why I can not change password the usual way.

Changing your password is done through the help site, which is outside the scope of steam-user. You can use steam-totp to get a code from your shared_secret.

@DoctorMcKay Okay, but how i confirm change password? Password change must be confirmed in steam guard app. Isn't that part of the steam-user?

They switched to an in-app confirmation? That would be steamcommunity's job.

@DoctorMcKay I should add issue in steamcommunity?

I tried add method for change, but i can't see http request steam guard.
I installed Fiddler, but http request don't saw.
These requests were encrypt, after add user cert in android, requests anyway were encrypt.
What tools do you use to watch http requests?

Do the normal confirmations methods not work?

What does normal confirmation methods mean?
You can confirm the change only through Steam Guard in the application, or through mail and SMS, but then you need to remove Steam Guard and install it again after receiving a trade block for 15 days.

https://github.com/DoctorMcKay/node-steamcommunity/wiki/SteamCommunity#getconfirmationstime-key-callback

@DoctorMcKay Thank you so much, it works. But for me it is very difficult to understand how it works.


⚠ AtmoBunker01 Server has degraded performance

In 1b7db24, AtmoBunker01 Server ($ATMOBUNKER01) experienced degraded performance:

HTTP code: 200
Response time: 10565 ms

Resolved: AtmoBunker01 Server performance has improved in d169c3b.


Macro: Errors in DevTool console when switching to full screen mode

Case 1: Errors in DevTool console when switching to fullscreen mode
Steps to Reproduce

Switch to macro mode
Add any monomer on canvas
Switch to micro mode and back to macro
Click on the “Fullscreen mode” button
Look at DevTool console

Actual behavior
Uncaught TypeError in DevTool console when switching to fullscreen mode (in each case the content of the error is different)
Expected behavior
No errors in DevTool console
Screenshots
https://github.com/epam/ketcher/assets/62464241/052d595d-4c3c-4781-a267-fe8ac69ed7b5
Case 2: Errors in DevTool console when switching to fullscreen mode (pre-opening the fullscreen mode in the micro mode)
Steps to Reproduce

Launch “Ketcher” and open the DevTool console
Add any Template on the canvas in the micro mode
Click on the “Fullscreen mode” button
Switch to the macro mode
Click on the “Fullscreen mode” button
Verify the DevTool console

Actual behavior
Uncaught TypeError in DevTool console when switching to fullscreen mode (in each case the content of the error is different)
Expected behavior
No errors in DevTool console
Screenshots

Desktop (please complete the following information):

OS: Windows 11, Windows 10 Pro (version 22H2) x64
Browser: Сhrome
Version: 112.0.5615.138 (Official Build) (64-bit), 117.0.5938.152 (64-bit)

Ketcher version
[Version 2.19.0 – rc.1]

Tests added to the automation table.

Moved to Refined Backlog since no fix over 2 versions


Allow clearing internal data to reload from file

As a simple workaround for the problem of inconsistent internal data when a new model is used

New statement
RWDiagram refresh.
with new requirement RWDiaEdit_62
"It is possible to refresh the application"


Docker error, CUDA not found

While using the provided Dockerfile in the repo, I run into this error which leads me to believe the Dockerfile is out-of-date. Does anyone here have a working docker configuration? I was able to use the modified Dockerfile below, but am seeing a memory leak when I deploy and run it.  Any ideas why the disk is getting filled up? I am running the launch.py script on launch and feeding it the standard parameters.
Command:
python launch.py --config configs/dreamfusion-if.yaml --train --gpu 0 system.prompt_processor.prompt="A cactus"

Error:

7.417 Building wheels for collected packages: nerfacc
7.421   Building wheel for nerfacc (setup.py): started
10.40   Building wheel for nerfacc (setup.py): finished with status 'error'
10.41   error: subprocess-exited-with-error
10.41
10.41   × python setup.py bdist_wheel did not run successfully.
10.41   │ exit code: 1
10.41   ╰─> [155 lines of output]
10.41       No CUDA runtime is found, using CUDA_HOME='/usr/local/cuda'
10.41       running bdist_wheel
10.41       running build
10.41       running build_py
10.41       creating build
10.41       creating build/lib.linux-x86_64-cpython-310
10.41       creating build/lib.linux-x86_64-cpython-310/nerfacc
10.41       copying nerfacc/init.py -> build/lib.linux-x86_64-cpython-310/nerfacc
10.41       copying nerfacc/grid.py -> build/lib.linux-x86_64-cpython-310/nerfacc
10.41       copying nerfacc/pack.py -> build/lib.linux-x86_64-cpython-310/nerfacc
10.41       copying nerfacc/cameras.py -> build/lib.linux-x86_64-cpython-310/nerfacc
10.41       copying nerfacc/data_specs.py -> build/lib.linux-x86_64-cpython-310/nerfacc
10.41       copying nerfacc/pdf.py -> build/lib.linux-x86_64-cpython-310/nerfacc
10.41       copying nerfacc/version.py -> build/lib.linux-x86_64-cpython-310/nerfacc
10.41       copying nerfacc/scan.py -> build/lib.linux-x86_64-cpython-310/nerfacc
10.41       copying nerfacc/cameras2.py -> build/lib.linux-x86_64-cpython-310/nerfacc
10.41       copying nerfacc/volrend.py -> build/lib.linux-x86_64-cpython-310/nerfacc
10.41       creating build/lib.linux-x86_64-cpython-310/nerfacc/cuda
10.41       copying nerfacc/cuda/init.py -> build/lib.linux-x86_64-cpython-310/nerfacc/cuda
10.41       copying nerfacc/cuda/_backend.py -> build/lib.linux-x86_64-cpython-310/nerfacc/cuda
10.41       creating build/lib.linux-x86_64-cpython-310/nerfacc/estimators
10.41       copying nerfacc/estimators/occ_grid.py -> build/lib.linux-x86_64-cpython-310/nerfacc/estimators
10.41       copying nerfacc/estimators/init.py -> build/lib.linux-x86_64-cpython-310/nerfacc/estimators
10.41       copying nerfacc/estimators/base.py -> build/lib.linux-x86_64-cpython-310/nerfacc/estimators
10.41       copying nerfacc/estimators/prop_net.py -> build/lib.linux-x86_64-cpython-310/nerfacc/estimators
10.41       running egg_info
10.41       creating nerfacc.egg-info
10.41       writing nerfacc.egg-info/PKG-INFO
10.41       writing dependency_links to nerfacc.egg-info/dependency_links.txt
10.41       writing requirements to nerfacc.egg-info/requires.txt
10.41       writing top-level names to nerfacc.egg-info/top_level.txt
10.41       writing manifest file 'nerfacc.egg-info/SOURCES.txt'
10.41       reading manifest file 'nerfacc.egg-info/SOURCES.txt'
10.41       reading manifest template 'MANIFEST.in'
10.41       warning: no files found matching 'nerfacc/_cuda/csrc/include/'
10.41       warning: no files found matching 'nerfacc/_cuda/csrc/'
10.41       adding license file 'LICENSE'
10.41       writing manifest file 'nerfacc.egg-info/SOURCES.txt'
10.41       /usr/local/lib/python3.10/dist-packages/setuptools/command/build_py.py:207: _Warning: Package 'nerfacc.cuda.csrc' is absent from the packages configuration.
10.41       !!

New Dockerfile (no error, but memory leak):
FROM pytorch/pytorch:2.1.0-cuda12.1-cudnn8-devel

ARG USER_NAME=dreamer
ARG GROUP_NAME=dreamers
ARG UID=1000
ARG GID=1000

# Set compute capability for nerfacc and tiny-cuda-nn
# See https://developer.nvidia.com/cuda-gpus and limit number to speed-up build
ENV TORCH_CUDA_ARCH_LIST="6.0 6.1 7.0 7.5 8.0 8.6 8.9 9.0+PTX"
ENV TCNN_CUDA_ARCHITECTURES=90;89;86;80;75;70;61;60
# Speed-up build for RTX 30xx
# ENV TORCH_CUDA_ARCH_LIST="8.6"
# Speed-up build for RTX 40xx
# ENV TORCH_CUDA_ARCH_LIST="8.9"
# ENV TCNN_CUDA_ARCHITECTURES=89

# Set CUDA Environment Vars
ENV CUDA_HOME=/usr/local/cuda
ENV PATH=${CUDA_HOME}/bin:/home/${USER_NAME}/.local/bin:${PATH}
ENV LD_LIBRARY_PATH=${CUDA_HOME}/lib64:${LD_LIBRARY_PATH}
ENV LIBRARY_PATH=${CUDA_HOME}/lib64/stubs:${LIBRARY_PATH}

# Install pre-dependencies
RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
    build-essential \
    curl \
    git \
    libegl1-mesa-dev \
    libgl1-mesa-dev \
    libgles2-mesa-dev \
    libglib2.0-0 \
    libsm6 \
    libxext6 \
    libxrender1 \
    python-is-python3 \
    python3.10 \
    python3-pip \
    wget \
    && rm -rf /var/lib/apt/lists/*

# Install and upgrade pip and dependencies
RUN pip install --upgrade pip setuptools ninja diffusers==0.20.2 mediapipe
RUN pip install torch torchvision torchaudio

# Install nerfacc and tiny-cuda-nn before installing requirements.txt
# because these two installations are time consuming and error prone
RUN pip install<EMAIL_ADDRESS>RUN pip install git+https://github.com/NVlabs/tiny-cuda-nn.git#subdirectory=bindings/torch

# Clone ThreeStudio
RUN git clone https://github.com/threestudio-project/threestudio.git /home/${USER_NAME)/workspace/threestudio
WORKDIR /home/${USER_NAME)/workspace/threestudio
RUN git checkout 8a51c37317b6f7cd74bb3cb24c975b56d0a96703
RUN pip install -r requirements.txt

# Change user to non-root user
RUN groupadd -g ${GID} ${GROUP_NAME} \
    && useradd -ms /bin/sh -u ${UID} -g ${GID} ${USER_NAME}
USER ${USER_NAME}

WORKDIR /home/${USER_NAME}/workspace/threestudio

Actually...not sure how this was working with the new base image since nerfacc requires cuda 11.8. Also looking at the above script, looks like I left out the python dev library. Going to retry with the python change and roll back the base image to the original and try.

Ah, looks like an NVIDIA driver issue when using your published Dockerfile (using V100s)
RuntimeError: The NVIDIA driver on your system is too old (found version 11080). Please update your GPU driver by downloading and installing a new version from the URL: http://www.nvidia.com/Download/index.aspx Alternatively, go to: https://pytorch.org to install a PyTorch version that has been compiled with your version of the CUDA driver.

Ok...built everything from scratch on a new machine and seems to have resolved itself. The only noticeable thing is I am building the docker image on an AL2 OS with preinstalled CUDA where as before with the memory leak was on an Ubuntu 22.04.

Turns out, I misinterpreted how checkpoint.every_n_train_steps works. I assumed that would update the ckpts/last.ckpt file, but it looks like it appends data in the ckpts folder. @DSaurus is this normal behavior? If so, is there a better way to ensure a ckpt is written locally, which overwrites the previous last.ckpt?

I ended up setting checkpoint.every_n_train_steps and then have another thread that does clean-up in the checkpoint folder to remove the old checkpoint files. I only keep last.ckpt and the max iteration ckpt on an interval.


Add hover tooltip on cards with more info

I was going to request something similar - if there's a good API/workflow for this, it would be wonderful to see a full card image as part of this.

@leethobbit I think I'm going with the Scryfall API.  However, I don't know if it will be exactly a tooltip that hovers.  For now, it's just a panel with the card image on the bottom right of the component:

If I can figure out how to do the tooltip in the Obsidian UI, I'll come back to this tooltip idea then.


Deleting an auto_import should also delete the repos it imported

We can do this by adding a CASCADE to the repo_import_id foreign key constraint on the repos table, similar to what was done for the data tables pointing back to repos.
This will enable #309 (it will be important to have that warning in the UI)

Should we tackle this ticket faster ? I should be able to do in a few minutes @patrickdevivo

yep - go for it


Implement GitHub Action for Team Creation

Implements the functionality to trigger a GitHub action upon issue creation for team creation, including the creation of a team on GitHub, modification of team-assignments.yaml, and linking the PR to the issue.

GitHub Action Workflow Update: Modifies team-manager-github-action.yaml to trigger on issue events, specifically for team creation requests. It includes steps to read issue content, create the team on GitHub, modify team-assignments.yaml, create a PR with the changes, and link the PR to the issue.
Issue Template Creation: Adds a new issue template create-team.yaml in .github/ISSUE_TEMPLATE for team creation requests. This template includes fields for team name, description, privacy, and an optional parent team, all required for creating a team on GitHub.
Command Implementation: Updates cmd/teams.go by adding a new subcommand create-team intended for creating a new team on GitHub and updating team-assignments.yaml. However, the actual implementation of the command's functionality is marked as a placeholder and not fully implemented in the provided code changes.

For more details, open the Copilot Workspace session.

Implements the createTeamCmd function and updates GitHub Actions for team creation.

Adds the implementation for the createTeamCmd command in cmd/teams.go, enabling the creation of new GitHub teams and updating team-assignments.yaml with the new team's details.
Modifies the GitHub Action in team-manager-github-action.yaml to support team creation based on issue labels and content, including steps for reading issue content, creating the team, modifying team-assignments.yaml, creating a pull request, and linking the PR to the issue.

For more details, open the Copilot Workspace session.

Introduce new functionality for team creation and update GitHub Actions workflow

Implement a GitHub issue template for team creation requests, including fields for team name, description, privacy level, and optional parent team.
Add a create-team command in cmd/teams.go to create a new team on GitHub and update team-assignments.yaml with the new team's details.
Modify the GitHub Actions workflow team-manager-github-action.yaml to include a job for creating a team based on issue labels, and to update the workflow's runs-on version and checkout action version.
Introduce integration tests placeholders in integration_tests/team_creation_test.go and integration_tests/github_actions_workflow_test.go for simulating team creation processes, though the actual test implementations are skipped.
Update .github/workflows/go.yaml to include steps for running tests and displaying coverage, and modify the Makefile to add commands for running tests and generating coverage reports.

For more details, open the Copilot Workspace session.


Implemented ljust method in Bytes with suitable test cases.

The method ljust inside the Bytes.java file from python/common/org/python/types has been implemented with suitable test cases inside tests/datatypes/test_bytes.py
This method aligns the bytes in left justified manner iff width is more than the length of the byte [] provided, which also accepts custom filling character if specified, defaulted to " ".

@freakboy3742 it's stuck again...

/me waves fist at CI server...
I've just poked it again. Apologies for the unreliability.

@freakboy3742 Added try-catch can you have look again? but I didn't get the reason for printing it...as all the three test cases are sure to produce errors and will only go to the exception part. Maybe I mistook you do check if that's how you wanted it.

@freakboy3742 Done.

Hmm question, are we testing that documentation is producing the same results in an automatic way?

@goanpeca we're not, but that would be nice.


Multiple strategies to migrate Ceph mon ip addresses

Experimental patch that provides multiple strategies to migrate mon ip addresses (due to the environment config).

Hi @jistr @cescgina: I collected >= 6 green runs on [1] for this change, and I'm wondering if we can land it so I can start working on the next set of tests before finalizing [2].
[1] https://review.rdoproject.org/r/c/testproject/+/53696
[2] https://review.rdoproject.org/r/c/rdo-jobs/+/53695

@cescgina given everything is green here I'm wondering if we can merge and move forward


[ocioview] Unable to load image in ocioview on macOS

After the recent changes committed for ocioview I can no longer load an image. The following error is printed in the Terminal when I attempt this.
[ocioview Error]: 'ProcessorContext' object has no attribute 'direction'
Traceback (most recent call last):
  File "/Volumes/ws/ocio/dev/source/src/apps/ocioview/ocioview/viewer_dock.py", line 111, in load_image
    image_viewer.load_image(image_path=image_path)
  File "/Volumes/ws/ocio/dev/source/src/apps/ocioview/ocioview/viewer/image_viewer.py", line 330, in load_image
    self.image_plane.load_image(image_path)
  File "/Volumes/ws/ocio/dev/source/src/apps/ocioview/ocioview/viewer/image_plane.py", line 355, in load_image
    self._ocio_proc_context.direction,
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'ProcessorContext' object has no attribute 'direction'
<LogRecord: ocioview, 40, /Volumes/ws/ocio/dev/source/src/apps/ocioview/main.py, 26, "[ocioview Error]: 'ProcessorContext' object has no attribute 'direction'
Traceback (most recent call last):
  File "/Volumes/ws/ocio/dev/source/src/apps/ocioview/ocioview/viewer_dock.py", line 111, in load_image
    image_viewer.load_image(image_path=image_path)
  File "/Volumes/ws/ocio/dev/source/src/apps/ocioview/ocioview/viewer/image_viewer.py", line 330, in load_image
    self.image_plane.load_image(image_path)
  File "/Volumes/ws/ocio/dev/source/src/apps/ocioview/ocioview/viewer/image_plane.py", line 355, in load_image
    self._ocio_proc_context.direction,
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'ProcessorContext' object has no attribute 'direction'">

I believe the problem is here...
https://github.com/AcademySoftwareFoundation/OpenColorIO/blob/7e91b0e9a6e194181e11a777d338ea2b4c4d315f/src/apps/ocioview/ocioview/viewer/image_plane.py#L355
It seems the fix is simply...
self._ocio_proc_context.transform_direction

(I've tested this locally and it works).
From referring to...
https://github.com/AcademySoftwareFoundation/OpenColorIO/blob/7e91b0e9a6e194181e11a777d338ea2b4c4d315f/src/apps/ocioview/ocioview/processor_context.py#L27
@michdolan If this is all that's required I'm happy to create a PR with this simple change.

Confirming that this is the only requirement (I have it in my draft PR for the chromaticity inspector).

This is no longer an issue since the PR from @KelSolaar was merged. Closing.


Team update - Dec 07, 2022

This is a @Quansight-Labs/czi-a11y-grant team sync 🎉🎉🎉! This is a way for the Team Members to provide status reports on what they've been up to this week and request help and attention for things they are working on. This issue will be closed at the end of the day.
Copy and paste the template below, and answer questions as you wish!

Response Template
**Thanks I'd like to give 🙌**
- So-and-so helped me out a lot with foo...

**Updates from last week :heavy_check_mark:**
- I worked towards deliverable: <link-to-deliverable>

**Challenges I faced and things I'd like assistance with 🙏**
- I had a hard time figuring out ...

**My availability for next week**
- I'll be off on foo day...

**Important items for discussion 💬**
- I have a question about goal <link-to-goal>
- Can @foo give a comment on issue #NN ?
- I opened #NN for discussion, please chime in
- I need to discuss foo

:mag: Needs Triage
The Needs Triage issues require an initial assessment and labeling.

File browser has numerous keyboard issues, some newly surfaced
Tab trab in JupyterLab terminal

:dart: Project boards
Please make sure the boards reflect the current status of the project.
Jupyter a11y grant project

Updates from last week :heavy_check_mark:

I worked in the hamburger menu in Lumino - finally created the PR: https://github.com/jupyterlab/lumino/pull/489
Wrote the proposal for talk for both pyconUS and jupytercon - https://docs.google.com/document/d/1BDqsJkANWvoBsFGUeQrcX0UKuEZLvB3OzUZcsxm9Jk8/edit#heading=h.2x45d9q9eq0b

Challenges I faced and things I'd like assistance with 🙏

I'm ok!

My availability for next week

I'll be here

Important items for discussion 💬

I don't have anything for the meeting

Thanks I'd like to give 🙌

Really a congratulations, but great work to @steff456 for the collapsible menu PR! I hope it feels awesome seeing that work take shape!

Updates from last week :heavy_check_mark:

#147 Post-test round review. I will be working on writing up issues from this next.
#133 I am the tie breaker. This means, barring further disagreement, we can start following up on @steff456's audit and break up the work as desired.

Challenges I faced and things I'd like assistance with 🙏

I don't have anything right now.

My availability for next week

I'll be here.

Important items for discussion 💬

I don't have any right now.

Updates from last week :heavy_check_mark:

I've been very heads down on getting a PR up for my JupyterLab file browser keyboard focus work. The code is ready to be submitted as a PR. I just need to finish writing up the description and adding in-line self-review comments.
Then, I will start writing draft for JupyterCon CFP. My deadline is this coming Monday, December 12.

My availability for next week

I haven't decided which days yet, but I will probably be taking a day or two off around my birthday December 17.

Important items for discussion 💬

What should I work on next after writing JupyterCon proposal? Two ideas:

https://github.com/Quansight-Labs/jupyter-a11y-testing/issues/27
https://github.com/Quansight-Labs/jupyter-a11y-mgmt/issues/168

As a reminder the mapping of components to JupyterLab lives in https://jupyter-accessibility.readthedocs.io/en/latest/resources/map-jupyterlab-frontend-architecture/README.html#


Investigate nonlinear alternatives to tangent normalization

We use (linear) PCA to map the PoN, each datum of which is a high-dimensional vector over targets, to a low-dimensional manifold.  Do we really believe that this manifold is simply a hyperplane?
Concretely, suppose the data really lives on a 4-dimensional curved manifold.  Due to the curvature, we might require many more, say 20, flat dimensions to encompass a significant amount of the PoN's variance.  What this means is that we lump a huge amount of noise in with the true signal.
Non-linear alternatives worth investigating include kernel PCA -- nice because like all machine learning things involving the kernel trick you get to recycle almost all of your mathematical and algorithmic machinery, denoising autoencoders, and Gaussian process latent variable models.

Linear PCA could be sufficient if the PoN samples are tightly clustered about their mean so that variance is a small perturbation that can be treated linearly.  I don't think we know enough about PoNs to judge what actually occurs.

Issue moved to broadinstitute/gatk #2830 via ZenHub


How to customize buttons colors

!!! IF YOU DO NOT USE THIS ISSUES TEAMPLATE, YOUR ISSUE IS LIABLE TO BEING IGNORED BY US
Prerequisites
Please answer the following questions for yourself before submitting an issue.

[ ] I am running the latest version
[ ] I checked the documentation and found no answer
[ ] I checked to make sure that this issue has not already been filed
[ ] I'm reporting the issue to the correct repository (for multi-repository projects)

Expected Behavior
Please describe the behavior you are expecting
Current Behavior
What is the current behavior?
Failure Information (for bugs)
Please help provide information about the failure if this is a bug. If it is not a bug, please remove the rest of this template.
Steps to Reproduce
Please provide detailed steps for reproducing the issue.

step 1
step 2
you get it...

Context
Please provide any relevant information about your setup. This is important in case the issue is not reproducible except for under certain conditions.

Device:
Operating System:
Browser and Version:

Failure Logs
Please include any relevant log snippets or files here.

Hello there, @ahmedTouati ,
Thank you for your interest in working with our products.
The scss for that can be found inside: src/assets/sass/lbd/_buttons.scss.
Best,
Manu


maven-checkstyle-plugin dependency not resolvable

some dependencies are not resolvable.
maven-checkstyle-plugin version 2.3.2 -> Changed that to 2.15 to fix that.
further unresolvable deps:
org.safehaus.jug:jug-asl:jar:2.0.0 -> thus, module kundera-tests fails to build

This jar was uploaded in Kundera's missing dependencies repo location but seems to be missing from there now. We'll fix this and update you on same.
Chhavi

@syr
org.safehaus.jug:jug-asl:jar:2.0.0 is removed from kundera-tests module and maven-checkstyle-plugin version 2.3.2 is now resolvable. We will upgrade it in future releases.
-Karthik


Hotspot Map: don't use location of a Hotspot without a location

I've got a Hotspot (future-goldenrod-bat) with no location asserted. The map logic should exclude hotspots without a location.

with the new design of that screen, this is no longer an issue


Feature Request: change "singingKeyProviders" in JwtPluginOptions to "signingKeyProviders"

Is your feature request related to a problem? Please describe.
The JWT plugin option "singingKeyProviders" is not intuitive.
Describe the solution you'd like
I wish it was "signingKeyProviders"
Describe alternatives you've considered
I considered wrapping useJWT to change the option name, but that seems silly.
Additional context
It's not a bug. It works just fine. It's just not spelled the way I'd expect.

Hi, thank you for reporting this issue! Sorry for the inconvenience 😅,  it's fixed and will be released very soon.

Fixed in the latest version!


deps: update devnet to latest version, v0.11.0-rc8

Overview
Resolves #174

Checklist

[x] New and updated code has appropriate documentation
[x] New and updated code has new and/or updated testing
[x] Required CI checks are passing
[x] Visual proof for any user facing features like CLI or documentation updates
[x] Linked issues closed with keywords

will have to test after build issues resolved here https://github.com/rollkit/local-celestia-devnet/actions

I still need to test this, but documentation does not lead to people testing on main

tested and updated docs.


Lockdown Mode on Apple devices blocks access to the DB API

When accessing the web page from an iOS or MacOS device on Lockdown Mode, the following error displays:

IndexedDB API missing. Please visit Dexie.MissingAPIError

This is to be expected, considering it's the purpose of Lockdown to prevent unwanted code execution and file access.
Disabling Lockdown either system-wide or for that website exclusively allows the page to work again.
Tested on iOS 17.1 and MacOS 14.4.1, with both Safari (196<IP_ADDRESS>.14) and Safari Tech Preview Release 191 (Safari 17.4, WebKit 196<IP_ADDRESS>).
Impact: High (webpage unusable under these circumstances),
Likelihood: Low (Lockdown Mode is an extreme security measure mostly used by the infosec community and potential target profiles only)
Overall severity: Minor (can easily be circumvented by disabling Lockdown)
Action recommended: Document the issue and make not having Lockdown Mode activated a requirement for using the pwa.

Maybe showing a warning in the app that lockdown mode needs to be disabled would be the best option? Is there a reliable way to detect this?

There are ways to detect LM, which is not great privacy-wise actually.
But maybe it would be better to detect and warn that the affected web feature is disabled. Which one exactly, I'm not sure, maybe several:

Agreed, if we can detect the specific dexie error, we should show a warning in the app

It is also highly likely that people that would be affected would be aware of the issue. People that use LM are either tech-savvy or sensitised to the usability issues of activating LM. It's a niche demographic.


remove panic recovery

curious, what issue this PR solved?
It is not that i'm not agree.

It is not linked to a PR. Was discussed on telegram with @robvanmieghem to remove.

not all panics can be recovered at this high level anyhow (think of panics coming from deep goroutines);
we never throw a panic, thus a panic is really only because of a programmer error, so that should be fixed, no reason to recover it;

AFAIK recovering is only ever a good idea in Golang in case we throw a panic explicitly (e.g. somewhere in some deep parsing logic), so we can easily go back up in the stack without having to go via a complicated error path.


Please don't change public API names

In this class I has a Value property:
public class Placeholder<T>
{
    T value;

    public T Value
    {
        get => value;
        set
        {
            Found = true;
            this.value = value;
        }
    }

    public bool Found = false;

    public override string ToString()
    {
        if (Found)
            return value?.ToString();

        return "Not Found";
    }
}

The converter changed it's name to Value1:
' To configure or remove Option's included in result, go to Options/Advanced Options...
Option Compare Text
Option Explicit On
Option Infer Off
Option Strict On

Public Class Placeholder(Of T)
    Private value As T
    Public Property Value1 As T
        Get
            Return value
        End Get

        Set(Value As T)
            Found = True
            Me.value = value
        End Set
    End Property
    Public Found As Boolean = False
    Public Overrides Function ToString() As String
        If Found Then
            Return value?.ToString()
        End If

        Return "Not Found"
    End Function
End Class

I know you are trying to avoid confection with the value  filed, but you can safely change the private field name. Changing the public property name Value to Value1 causes many errors, some of them can happen in reflection in frameworks that use naming convention. So, whenever the case conflict happens, change the private name not the public name.
Thanks.

Converter <IP_ADDRESS> fixes part of this. I no longer rename Value to Value1 but value is not renamed either. I do add Me. to value

I no longer rename Value to Value1 but value is not renamed either

VB can't accept value and Value as two differenr names. I recommend to rename value to _value, but be aware not to change Value param in the set blocks in properties.

@VBAndCs  I think I have a complete fix in <IP_ADDRESS>. posted tomorrow. If not please provide complete source of C# and VB where conversion does not work.


Deep equality

Functions listEquals, mapEquals, and setEquals do not inspect deep equality despite the documentation claims it. Somebody noticed this, but instead of improving the implementation, only added a note that deep means not deep at all: "The term "deep" above refers to the first level of equality: if the elements are maps, lists, sets, or other collections/composite objects, then the values of those elements are not compared element by element unless their equality operators ([Object.operator==]) do so." Here: https://github.com/flutter/flutter/commit/ce1509714c28fec0462fc702c8d9b8d2d4878bf4#

@KristofHorvath
the description seems to me quite clear

Compares two lists for deep equality.
Returns true if the lists are both null, or if they are both non-null, have the same length, and contain the same members in the same order. Returns false otherwise.
The term "deep" above refers to the first level of equality: if the elements are maps, lists, sets, or other collections/composite objects, then
the values of those elements are not compared element by element unless their equality operators (Object.==) do so.

which I interpret as it does allow for deep equality,
following the == operator which by default doesn't compare values,  but does so if overridden like in this code sample

Hi, Is there any news about it? Do you plan to change the implementation in the near future?


System.Devices.Gpio

The goal of this API is to allow .Net Core developers to access General Purpose IO (GPIO) pins of IoT devices like Raspberry Pi. This will allow applications to read and write data from/to sensors, leds and other kind of peripherals connected to those pins. This API should also support most commonly used serial communication protocols like SPI and I2C.
For more details please see gpio spec.
Rationale and Usage
API Design Goals

Extensible to many different kinds of IoT devices
Multiplatform (Linux and Windows OS)
General enough to allow the same client user code to work in all supported platforms
Simple to use
Good performance

Blinking LED
using (var controller = new GpioController())
{
    GpioPin led = controller.OpenPin(26, PinMode.Output);

    for (var i = 0; i < 5; ++i)
    {
        led.Write(PinValue.High);
        Thread.Sleep(TimeSpan.FromSeconds(1));

        led.Write(PinValue.Low);
        Thread.Sleep(TimeSpan.FromSeconds(1));
    }
}

Turning on LED while pressing a button
using (var controller = new GpioController())
{
    GpioPin button = controller.OpenPin(18, PinMode.Input);
    GpioPin led = controller.OpenPin(26, PinMode.Output);

    Stopwatch watch = Stopwatch.StartNew();

    while (watch.Elapsed.TotalSeconds < 15)
    {
        PinValue value = button.Read();
        led.Write(value);
    }
}

Waiting for a button to be pressed
using (var controller = new GpioController())
{
    GpioPin button = controller.OpenPin(18, PinMode.Input);

    button.DebounceTimeout = TimeSpan.FromSeconds(1);
    button.NotifyEvents = PinEvent.SyncRisingEdge;

    Stopwatch watch = Stopwatch.StartNew();

    while (watch.Elapsed.TotalSeconds < 15)
    {
        TimeSpan timeout = TimeSpan.FromSeconds(1);
        bool eventDetected = button.WaitForEvent(timeout);

        string message = eventDetected ? "Event detected!" : "Timeout!";
        Console.WriteLine(message);
    }
}

Detecting when a button is pressed using events
using (var controller = new GpioController())
{
    GpioPin button = controller.OpenPin(18, PinMode.Input);

    button.DebounceTimeout = TimeSpan.FromMilliseconds(100);
    button.NotifyEvents = PinEvent.SyncFallingRisingEdge;
    button.ValueChanged += OnPinValueChanged;
    button.EnableRaisingEvents = true;

    Stopwatch watch = Stopwatch.StartNew();

    while (watch.Elapsed.TotalSeconds < 15)
    {
        Thread.Sleep(1 * 100);

        if (buttonPressed)
        {
            Console.WriteLine($"Button press!");
        }
    }
}

private static void OnPinValueChanged(object sender, PinValueChangedEventArgs e)
{
    string message = buttonPressed ? "Button up!" : "Button down!";
    Console.WriteLine(message);

    buttonPressed = !buttonPressed;
}

Migrating to a different OS and/or IoT device
Just change the code to use the right driver for the new platform. If there is no driver available yet for a particular platform or device, the user can extend the model by implementing his own driver if needed and all the already existing APIs should also work just fine for that platform by using the new driver.
using (Driver driver = new UnixDriver()) // or
using (Driver driver = new WindowsDriver()) // or
using (Driver driver = new RaspberryPiDriver()) // etc.
using (var controller = new GpioController(driver))
...

Using a different pin numbering scheme
When creating the controller the user can specify the pin numbering scheme to use and it will be used everywhere a pin number is required or returned by the API. To get pin number in a different scheme the user can call the GetNumber pin method specifying the desired numbering scheme.
var controller = new GpioController() // defaults to PinNumberingScheme.Gpio
var controller = new GpioController(PinNumberingScheme.Gpio) // or
var controller = new GpioController(PinNumberingScheme.Board)

Communicating with sensors using SPI
var busId = 1;
var chipSelectLine = 0;
var settings = new SpiConnectionSettings(busId, chipSelectLine);
SpiDevice device = new UnixSpiDevice(settings);

device.WriteByte(byte.MaxValue);
byte data8 = device.ReadByte();

device.WriteUShort(ushort.MaxValue);
ushort data16 = device.ReadUShort();

device.WriteUInt(uint.MaxValue);
uint data32 = device.ReadUInt();

device.WriteULong(ulong.MaxValue);
ulong data64 = device.ReadULong();

Communicating with sensors using I2C
var busId = 1;
var settings = new I2cConnectionSettings(busId, Sensor.DefaultI2cAddress);
I2cDevice device = new UnixI2cDevice(settings);

device.WriteByte(byte.MaxValue);
byte data8 = device.ReadByte();

device.WriteUShort(ushort.MaxValue);
ushort data16 = device.ReadUShort();

device.WriteUInt(uint.MaxValue);
uint data32 = device.ReadUInt();

device.WriteULong(ulong.MaxValue);
ulong data64 = device.ReadULong();

Proposed API
Following are the proposed APIs.
GpioController class
namespace System.Devices.Gpio
{
    public enum PinNumberingScheme
    {
        Board,
        Gpio
    }

    public class GpioController : IDisposable
    {
        public GpioController(PinNumberingScheme numbering = PinNumberingScheme.Gpio);
        public GpioController(GpioDriver driver, PinNumberingScheme numbering = PinNumberingScheme.Gpio);
        public void Dispose();

        public PinNumberingScheme Numbering { get; set; }
        public int PinCount  { get; };
        public IEnumerable<GpioPin> OpenPins { get; };
        public GpioPin this[int pinNumber] { get; }

        public bool IsPinOpen(int number);
        public GpioPin OpenPin(int number);
        public void ClosePin(int number);
        public void ClosePin(GpioPin pin);
    }
}

GpioPin class
namespace System.Devices.Gpio
{
    public enum PinMode
    {
        Input,
        Output,
        InputPullDown,
        InputPullUp
    }

    [Flags]
    public enum PinEvent
    {
        None = 0,
        Low = 1,
        High = 2,
        SyncFallingEdge = 4,
        SyncRisingEdge = 8,
        AsyncFallingEdge = 16,
        AsyncRisingEdge = 32,

        LowHigh = Low | High,
        SyncFallingRisingEdge = SyncFallingEdge | SyncRisingEdge,
        AsyncFallingRisingEdge = AsyncFallingEdge | AsyncRisingEdge,

        Any = LowHigh | SyncFallingRisingEdge | AsyncFallingRisingEdge
    }

    public enum PinValue
    {
        Low = 0,
        High = 1
    }

    public class PinValueChangedEventArgs : EventArgs
    {
        public PinValueChangedEventArgs(int gpioPinNumber);

        public int GpioPinNumber { get; }
    }

    public class GpioPin : IDisposable
    {
        public void Dispose();

        public event EventHandler<PinValueChangedEventArgs> ValueChanged;

        public GpioController Controller { get; }
        public int GpioNumber { get; }
        public TimeSpan DebounceTimeout { get; set; }
        public PinMode Mode { get; set; }
        public PinEvent NotifyEvents { get; set; }
        public bool EnableRaisingEvents { get; set; }
        public bool IsModeSupported(PinMode mode) { get; }
        public int GetNumber(PinNumberingScheme numbering) { get; }
        public PinValue Read() { get; }
        public void Write(PinValue value) { get; }
        public bool WaitForEvent(TimeSpan timeout) { get; }
    }
}

GpioDriver classes
namespace System.Devices.Gpio
{
    public abstract class GpioDriver : IDisposable
    {
        public event EventHandler<PinValueChangedEventArgs> ValueChanged;

        protected internal abstract int PinCount { get; }

        protected internal abstract int ConvertPinNumber(int pinNumber, PinNumberingScheme from, PinNumberingScheme to);
        protected internal abstract bool IsPinModeSupported(PinMode mode);
        protected internal abstract void OpenPin(int gpioPinNumber);
        protected internal abstract void ClosePin(int gpioPinNumber);
        protected internal abstract void SetPinMode(int gpioPinNumber, PinMode mode);
        protected internal abstract PinMode GetPinMode(int gpioPinNumber);
        protected internal abstract void Output(int gpioPinNumber, PinValue value);
        protected internal abstract PinValue Input(int gpioPinNumber);
        protected internal abstract void SetDebounce(int gpioPinNumber, TimeSpan timeout);
        protected internal abstract TimeSpan GetDebounce(int gpioPinNumber);
        protected internal abstract void SetPinEventsToDetect(int gpioPinNumber, PinEvent events);
        protected internal abstract PinEvent GetPinEventsToDetect(int gpioPinNumber);
        protected internal abstract void SetEnableRaisingPinEvents(int gpioPinNumber, bool enable);
        protected internal abstract bool GetEnableRaisingPinEvents(int gpioPinNumber);
        protected internal abstract bool WaitForPinEvent(int gpioPinNumber, TimeSpan timeout);

        public abstract void Dispose();
    }

    // General class for supporting any device running a Unix based OS
    public class UnixDriver : GpioDriver { ... }

    // General class for supporting any device running Windows OS
    public class WindowsDriver : GpioDriver { ... }

    // Class for supporting Raspberry Pi specific features
    public class RaspberryPiDriver : GpioDriver { ... }
}

Gpio extension methods
namespace System.Devices.Gpio
{
    public static class GpioExtensions
    {
        public static GpioPin OpenPin(this GpioController controller, int number, PinMode mode);
        public static GpioPin[] OpenPins(this GpioController controller, PinMode mode, params int[] numbers);
        public static GpioPin[] OpenPins(this GpioController controller, params int[] numbers);
        public static void Set(this GpioPin pin);
        public static void Clear(this GpioPin pin);
        public static void Toggle(this GpioPin pin);
    }
}

SpiDevice classes
namespace System.Devices.Spi
{
    ///
    /// Defines the SPI communication mode.
    /// The communication mode defines the clock edge on which the master out line toggles,
    /// the master in line samples, and the signal clock's signal steady level (named SCLK).
    /// Each mode is defined with a pair of parameters called clock polarity (CPOL) and clock phase (CPHA).
    ///
    public enum SpiMode
    {
        /// CPOL = 0, CPHA = 0
        Mode0 = 0,
        /// CPOL = 0, CPHA = 1
        Mode1 = 1,
        /// CPOL = 1, CPHA = 0
        Mode2 = 2,
        /// CPOL = 1, CPHA = 1
        Mode3 = 3
    }

    ///
    /// Represents the settings for the connection with an <see cref="SpiDevice"/>.
    ///
    public sealed class SpiConnectionSettings
    {
        ///
        /// Gets or sets the Spi bus id for this connection.
        ///
        public uint BusId { get; set; }

        ///
        /// Gets or sets the chip select line for this connection.
        ///
        public uint ChipSelectLine { get; set; }

        ///
        /// Gets or sets the <see cref="SpiMode"/> for this connection.
        ///
        public SpiMode Mode { get; set; }

        ///
        /// Gets or sets the bit length for data on this connection.
        ///
        public uint DataBitLength { get; set; }

        ///
        /// Gets or sets the clock frequency in Hz for the connection.
        ///
        public uint ClockFrequency { get; set; }

        ///
        /// Initializes new instance of <see cref="SpiConnectionSettings"/>.
        ///
        /// <param name="busId">The Spi bus id on which the connection will be made.</param>
        /// <param name="chipSelectLine">The chip select line on which the connection will be made.</param>
        public SpiConnectionSettings(uint busId, uint chipSelectLine);
    }

    public abstract class SpiDevice : IDisposable
    {
        public SpiDevice(SpiConnectionSettings settings);
        public abstract void Dispose();

        public SpiConnectionSettings GetConnectionSettings();

        public abstract void TransferFullDuplex(byte[] writeBuffer, byte[] readBuffer);

        public abstract void ReadBinary(byte[] buffer);
        public abstract byte ReadByte();
        public abstract ushort ReadUShort();
        public abstract uint ReadUInt();
        public abstract ulong ReadULong();

        public abstract void WriteBinary(byte[] buffer);
        public abstract void WriteByte(byte value);
        public abstract void WriteUShort(ushort value);
        public abstract void WriteUInt(uint value);
        public abstract void WriteULong(ulong value);
    }

    // General class for supporting any device running a Unix based OS
    public class UnixSpiDevice : SpiDevice { ... }

    // General class for supporting any device running Windows OS
    public class WindowsSpiDevice : SpiDevice { ... }
}

I2cDevice classes
namespace System.Devices.I2c
{
    ///
    /// Represents the settings for the connection with an <see cref="I2cDevice"/>.
    ///
    public sealed class I2cConnectionSettings
    {
        ///
        /// Gets or sets the I2c bus id for this connection.
        ///
        public uint BusId { get; set; }

        ///
        /// Gets or sets the I2c connection device address.
        ///
        public uint DeviceAddress { get; set; }

        ///
        /// Initializes new instance of <see cref="I2cConnectionSettings"/>.
        ///
        /// <param name="busId">The I2c bus id on which the connection will be made.</param>
        /// <param name="deviceAddress">The I2c connection device address.</param>
        public I2cConnectionSettings(uint busId, uint deviceAddress);

        ///
        /// Initializes new instance of <see cref="I2cConnectionSettings"/>.
        ///
        /// <param name="busId">The I2c bus id on which the connection will be made.</param>
        public I2cConnectionSettings(uint busId);
    }

    public abstract class I2cDevice : IDisposable
    {
        public I2cDevice(I2cConnectionSettings settings);
        public abstract void Dispose();

        public I2cConnectionSettings GetConnectionSettings();

        public abstract void WriteRead(byte[] writeBuffer, byte[] readBuffer);

        public abstract void ReadBinary(byte[] buffer);
        public abstract byte ReadByte();
        public abstract ushort ReadUShort();
        public abstract uint ReadUInt();
        public abstract ulong ReadULong();

        public abstract void WriteBinary(byte[] buffer);
        public abstract void WriteByte(byte value);
        public abstract void WriteUShort(ushort value);
        public abstract void WriteUInt(uint value);
        public abstract void WriteULong(ulong value);
    }

    // General class for supporting any device running a Unix based OS
    public class UnixI2cDevice : I2cDevice { ... }

    // General class for supporting any device running Windows OS
    public class WindowsI2cDevice : I2cDevice { ... }
}

Spi and I2c extension methods
namespace System.Devices.Spi
{
    public static class SpiExtensions
    {
        public static ulong Read(this SpiDevice device, uint byteCount);
    }
}

namespace System.Devices.I2c
{
    public static class I2cExtensions
    {
        public static ulong Read(this I2cDevice device, uint byteCount);
    }
}

Nice work getting this design proposal put together @edgardozoppi!  Here's some initial feedback to seed the discussion on the draft

using (Driver driver = new UnixDriver(RaspberryPiPinCount))
using (var controller = new GpioController(driver, PinNumberingScheme.Bcm))

This "double using statement" pattern caught my attention right away

What scenarios does a user need a Driver but not a controller?  How common is this?
Can we refactor the shape or provide a way to construct the controller directly without the outer driver scope?

Blinking LED

Can we add a "Toggle" method for blinking LEDs?  Scratch this, I see it's an extension method at the very bottom...

Pin button = controller.OpenPin(18, PinMode.Input);
if (button.IsModeSupported(PinMode.InputPullDown))
{
button.Mode = PinMode.InputPullDown;
}

Can the InputPullDown be specificed during OpenPin to reduce the number of lines of code needed?

var busId = 1;
var chipSelectLine = 0;
var settings = new SpiConnectionSettings(busId, chipSelectLine);
SpiDevice device = new UnixSpiDevice(settings);
device.Write8(byte.MaxValue);
byte data8 = device.Read8();

From someone new to SPI and I2C, it's not clear that BusID is almost (always?) "-1, 0, 1" depending on if they want to use "block 0" or "block 1" of the SPI pins on the controller.  Is there a way to make this more clear in the design?  Should we have an enum?  What happens if we pass in a nonsensical value like 0xBAADF00D today?

Pin class
public class Pin : IDisposable

Do we use the name "Pin" anywhere else in .NET?  Can the type be used throughout all of System.Devices.* (i.e., moved up and out of the GPIO subnamespace) or is it too specific to GPIO (And if so, is this "too good of a name"?)  If it needs to remain under GPIO then why don't we name this "GpioPin" like we've named other things "GpioDriver" and "GpioController"?

GpioDriver classes
protected internal abstract int ConvertPinNumber(int pinNumber, PinNumberingScheme from, PinNumberingScheme to);

Should this be a simpler "ConvertTo(int pinNUmber, PinNumberingScheme scheme)" instead?

Thanks for your early feedback!

This "double using statement" pattern caught my attention right away

What scenarios does a user need a Driver but not a controller? How common is this?
Can we refactor the shape or provide a way to construct the controller directly without the outer driver scope?

Actually, there is no real need to use using for the driver and the controller, with only one of them is enough because the controller is only disposing the driver. So the user can use the driver and/or the controller.
The controller takes a driver a parameter in the constructor because the user needs to specify wich driver wants to use with the controller. The idea is that in the future many drivers could exist for implementing specific features of each device\platform, but the same controller will be used in all those cases. The controller doesn't know which drivers the user wants to use. If the controller takes an enumeration to specify which driver to create internally, it won't be extensible in the future when some user adds a new driver for a new device.

Pin button = controller.OpenPin(18, PinMode.Input);
if (button.IsModeSupported(PinMode.InputPullDown))
{
button.Mode = PinMode.InputPullDown;
}
Can the InputPullDown be specificed during OpenPin to reduce the number of lines of code needed?

Yes, as you can see in the above example the user can specify the PinMode directly when opening the pin. But some devices don't support pull up/down modes for pins because they don't have internal resistors already included (only a subset, possibly empty, of the pins support it) so the example is also showing how to know if a particular pin supports this mode, and only using it if that is the case.
An alternative implementation could be marking PinMode enumeration with Flags attribute and do something like this instead:
Pin button = controller.OpenPin(18, PinMode.Input | PinMode.InputPullDown);

Meaning: try to use input pull down if it is supported or just input if it's not.

From someone new to SPI and I2C, it's not clear that BusID is almost (always?) "-1, 0, 1" depending on if they want to use "block 0" or "block 1" of the SPI pins on the controller. Is there a way to make this more clear in the design? Should we have an enum? What happens if we pass in a nonsensical value like 0xBAADF00D today?

The problem with the enum is that different devices have different number of SPI busses available to use. The current Unix implementation throws a IOException with message "Cannot open Spi device file '{deviceFileName}'" when the busId have a wrong value.

GpioDriver classes
protected internal abstract int ConvertPinNumber(int pinNumber, PinNumberingScheme from, PinNumberingScheme to);
Should this be a simpler "ConvertTo(int pinNUmber, PinNumberingScheme scheme)" instead?

The ConvertPinNumber method takes a pin number in the from numbering scheme and converts it to the specified to numbering scheme. The from parameter is needed because the method have to know which numbering scheme the given pin number is using.

public abstract class SpiDevice : IDisposable
public abstract void TransferFullDuplex(byte[] writeBuffer, byte[] readBuffer);
public abstract void Read(byte[] buffer);
Have you considered turning these into span-based APIs instead? That would provide the additional benefit of reading into a slice of an array (alternatively you would have to pass an array and length).

Actually, I didn't consider Span because I still don't know too much about it, but I will. Thanks for the suggestion.

public static class SpiExtensions
public static ulong Read(this SpiDevice device, uint byteCount);
Why did you choose to make these extension methods instead of instance methods?

I decided that way because those methods can be easily implemented using the already existing SpiDevice and I2cDevice public methods and this way they will be automatically available for any new possible implementation of those abstract classes.

public abstract class I2cDevice : IDisposable
public abstract void WriteRead(byte[] writeBuffer, byte[] readBuffer);
I think WriteRead is a somewhat confusing name for this API. Should it be called Transfer (or TransferFullDuplex) similar to SPI?

The name is different because it does a different thing in comparison with Spi TransferFullDuplex method. The later performs a simultaneous write and read transfer while the former executes a write immediately followed by a read, which is not the same as calling Write method followed by Read method because the first alternative is only one transaction while the last is making two transactions.

The name is different because it does a different thing in comparison with Spi TransferFullDuplex method. The later performs a simultaneous write and read transfer while the former executes a write immediately followed by a read,

How about TransferSequential? Similar to this:
https://docs.microsoft.com/en-us/uwp/api/windows.devices.spi.spidevice

Could be, but I still like more the name WriteRead because with TransferSequential is not clear the order of the operations.

I am not very familiar with this space, so this might be a naive question, but and looking at other APIs that support I2c, it looks like they support reading/writing from/to specific registers or addresses. Do we plan to provide such capability?

We already support that use case. It can be accomplished by just writing the register address first followed by a read or write of the data the user wants to read from or write to the register. Maybe we can add an extension method that do exactly this but takes the register address and data as two separate parameters, so it is more clear.

Should we support both little and big endianness for reading and writing? If so, how?

Good point, we can add an enum for endianness (if there is not one already) and take an additional (optional? what default?) parameter of this type.

@edgardozoppi, you can take a look at NpgsqlReadBuffer and NpgsqlWriteBuffer for an example how they handle such situation. There is an optional parameter to specify the required endianness, but by default Npgsql uses big endianness.
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public short ReadInt16()
            => ReadInt16(false);

        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public short ReadInt16(bool littleEndian)
        {
            var result = Read<short>();
            return littleEndian == BitConverter.IsLittleEndian
                ? result : PGUtil.ReverseEndianness(result);
        }

        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public void WriteInt16(short value)
            => WriteInt16(value, false);

        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public void WriteInt16(short value, bool littleEndian)
            => Write(littleEndian == BitConverter.IsLittleEndian ? value : PGUtil.ReverseEndianness(value));

You have methods named like ReadUShort but precedent eg in BinaryPrimitives, BlobBuilder, BinaryReader, UnmanagedMemoryAccessor is to use BCL names not C# names eg ReadUInt16.

@ianhays can you please drive this going forward now that @edgardozoppi has finished her summer internship?
I'd like to push to have the project through API Review, setup an automated testing environment for IoT devices, and move the project to dotnet/corefx by Thanksgiving this year.

@joperezr Any update on the status of this?  I know a lot of us are looking for a good Gpio solution in .net core and this looks to have been a great start!

Cc @rlander

Cc @richlander

Thanks for the correction, sorry @rlander

@los93sol we have moved this work to It’s own independent repo that we will make public very soon. We have made some great progress in this space. We will update this thread with a link to the blogpost once that happens to invite all of you guys to contribute!

@joperezr while i would like to see a progressed API and something more supported (both MS and community), i question why would this even be in a private repo?  What happened to the openness?  This is one reason I gave up trying to put in little extra time to provide feedback and such (e.g. I2C, SPI, etc).
Anyways, i'm still looking forward to the public release.

Closing as this package has moved to the https://github.com/dotnet/iot/ repo

It is great to see how this project moved forward to support Windows 10 and other pin features like PWM.  It is also good to have device bindings using the new public API like ADC. I can't wait to see more bindings for LCD, BME280 and the other devices we used, as well as new contributions from the community!
Great work guys!! 😄

@edgardozoppi Thanks for all the hard work you did on this project. You were key to delivering the foundations of the project 😄


bug add synchronized to test resolve error of zip file closed

Proposed changes
this error report in P0 test, But can't reproduce it in local
so add this change to test it.
Issue Number: close #17810
Problem summary
Describe your changes.
Checklist(Required)

[ ] Does it affect the original behavior
[ ] Has unit tests been added
[ ] Has document been added or modified
[ ] Does it need to update dependencies
[ ] Is this PR support rollback (If NO, please explain WHY)

Further comments
If this is a relatively large or complex change, kick off the discussion at<EMAIL_ADDRESS>by explaining why you chose the solution you did and what alternatives you considered, etc...

run buildall

run buildall

run P0

run p0

run buildall

run p1


Feature Request: Add a new property (time_scale) for the Scene class.

Description of proposed feature

New property named time_scale for Scene class.
How can the new feature be used?

If self.time_scale = 0.5, self.play(run_time=10) will run like self.play(run_time=5) in order to render faster in debugging stage.
Additional comments

Maybe I should initiate a pull request?

Why don't just do the following?
time_scale = 0.5
self.play(run_time=10*time_scale)


On development branch

I  am testing Microverse Linters.

I was able to pass all Checks on the linters configuration.


TypeError: Cannot read property 'tweets' of undefined

All of a sudden the plugin stopped working and I get this error:
[twMediaDownloader] (2021-02-26T15:24:01.109Z) https://api.twitter.com/1.1/statuses/show.json?include_profile_interstitial_type=1&include_blocking=1&include_blocked_by=1&include_followed_by=1&include_want_retweets=1&skip_status=1&cards_platform=Web-12&include_cards=1&include_ext_alt_text=true&include_reply_count=1&tweet_mode=extended&trim_user=false&include_ext_media_color=true&id=1364873363190018051 TypeError: Cannot read property 'tweets' of undefined
    at main_react.user.js:1348 0
log_error @ main_react.user.js:398
(anonymous) @ main_react.user.js:4384
u @ jquery.min.js:2
fireWith @ jquery.min.js:2
o.<computed> @ jquery.min.js:2
(anonymous) @ main_react.user.js:1353

After I click the button to download a video it says that in the console, then also makes an alert that reads "Twitter says: 0". I am not sure why this is happening but I suspect Twitter has updated their code.

After some looking it appears I am getting this error from the FETCH_JSON variable:
"This request requires a matching csrf cookie and header."

Another update I have verified that the CSRF cookie that the extension is using is the same as the one in my browser

Oh this appears to be a browser issue, when opening links or bookmarks. Works fine if I open the link from within site.

Okay one last thing, this only appears to affect some video but not all here is an example of one that does work:
https://twitter.com/CanYouPetTheDog/status/1365319005721010178
And here is an example of one that doesn't work:
https://twitter.com/_TAKUMI928_/status/1364945908224249862

For what it's worth, I can download both videos you linked just fine.

Yea, it eventually fixed itself I don't know what was happening during that time.


backup: simple NAS backup plugin for KVM

This is an experimental simple NAS backup plugin for KVM which may be later expanded for other hypervisors. This backup plugin aims to use shared NAS storage on KVM hosts such as NFS or CephFS, which is used to backup fully cloned VMs for backup & restore operations. This may not be as efficient and performant as some of the other B&R providers, but maybe useful for some KVM environments.
Design & Implementation follows the networker B&R plugin, which is simply:

Implement B&R plugin interfaces
Use cmd-answer pattern to execute backup and restore operations on KVM host when VM is running (or needs to be restored) - instead of a B&R API client, relies on answers from KVM agent which executes the operations
Backups are full VM domain snapshots, copied to a VM-specific folders on a NAS target (NFS or CephFS WIP) along with a domain XML
Backup uses libvirt feature: https://libvirt.org/kbase/live_full_disk_backup.html orchestrated via virsh/bash script (nasbackup.sh) as libvirt-java lacks the bindings

Doc PR https://github.com/apache/cloudstack-documentation/pull/429
Types of changes

[ ] Breaking change (fix or feature that would cause existing functionality to change)
[x] New feature (non-breaking change which adds functionality)
[ ] Bug fix (non-breaking change which fixes an issue)
[ ] Enhancement (improves an existing feature and functionality)
[ ] Cleanup (Code refactoring and cleanup, that may add test cases)
[ ] build/CI
[ ] test (unit or integration test code)

Feature/Enhancement Scale or Bug Severity
Feature/Enhancement Scale

[x] Major
[ ] Minor

Screenshots
Each backup offering map to a Backup repository that takes in backup storage details (address/url, credentials/mount options):

Rest is same as B&R feature works; we assign such offering to a VM and backup once completed shows up in the list:

Update: take backup & delete backup implemented for NFS; TBD/TODO more operations.

@blueorangutan package

@rohityadavcloud a [SL] Jenkins job has been kicked to build packages. It will be bundled with  KVM, XenServer and VMware SystemVM templates. I'll keep you posted as I make progress.

Packaging result [SF]: ✔ el8 ✔ el9 ✔ debian ✔ suse15. SL-JID 10548

Tested NFS, CephFS & samba, works when configuration is correctly configured; for example;
mysql> select * from backup_repository\G;
*************************** 1. row ***************************
            id: 1
          uuid: d3b911d4-50a6-11ef-bc8b-525400f93984
          name: NFS-backup
       zone_id: 1
      provider: nas
          type: nfs
       address: <IP_ADDRESS>:/export/testing/qa1-cs420-kvm-1cdf7971-kvm/backup
    mount_opts:
    used_bytes: NULL
capacity_bytes: NULL
       created: 2024-08-02 08:11:31
       removed: NULL
*************************** 2. row ***************************
            id: 2
          uuid: 09c2efd1-50c4-11ef-bc8b-525400f93984
          name: Ceph-backup
       zone_id: 1
      provider: nas
          type: ceph
       address: <IP_ADDRESS>,<IP_ADDRESS>,<IP_ADDRESS>:/backup
    mount_opts: name=rohit,secret=XXXX==
    used_bytes: NULL
capacity_bytes: NULL
       created: 2024-08-02 11:40:37
       removed: NULL
*************************** 3. row ***************************
            id: 3
          uuid: 876b1da4-50c6-11ef-bc8b-525400f93984
          name: Samba-backup
       zone_id: 1
      provider: nas
          type: cifs
       address: //<IP_ADDRESS>/backup
    mount_opts: vers=3.0,username=rohit,password=XXXX
    used_bytes: NULL
capacity_bytes: NULL
       created: 2024-08-02 11:58:27
       removed: NULL
3 rows in set (0.00 sec)

Shared storage mount/umount tested:

EL8 & EL9: NFS & CephFS works (ceph would require rbd utils, otherwise uses Linux kernel's cephfs driver)
Ubuntu: NFS, CephFS & CIFS/SMB3 works (the latter two need cifs-utils & ceph utils)

@Pearl1594 a [SL] Jenkins job has been kicked to build packages. It will be bundled with  KVM, XenServer and VMware SystemVM templates. I'll keep you posted as I make progress.

Packaging result [SF]: ✖ el8 ✖ el9 ✖ debian ✖ suse15. SL-JID 10579

@blueorangutan package

@Pearl1594 a [SL] Jenkins job has been kicked to build packages. It will be bundled with  KVM, XenServer and VMware SystemVM templates. I'll keep you posted as I make progress.

Packaging result [SF]: ✖ el8 ✖ el9 ✖ debian ✖ suse15. SL-JID 10580

@blueorangutan package

@Pearl1594 a [SL] Jenkins job has been kicked to build packages. It will be bundled with  KVM, XenServer and VMware SystemVM templates. I'll keep you posted as I make progress.

Packaging result [SF]: ✔ el8 ✔ el9 ✔ debian ✔ suse15. SL-JID 10583

nice feature idea @rohityadavcloud :+1:

@blueorangutan package

@Pearl1594 a [SL] Jenkins job has been kicked to build packages. It will be bundled with  KVM, XenServer and VMware SystemVM templates. I'll keep you posted as I make progress.

Packaging result [SF]: ✔ el8 ✔ el9 ✔ debian ✔ suse15. SL-JID 10621

@blueorangutan package

@DaanHoogland a [SL] Jenkins job has been kicked to build packages. It will be bundled with  KVM, XenServer and VMware SystemVM templates. I'll keep you posted as I make progress.

Packaging result [SF]: ✔ el8 ✔ el9 ✔ debian ✔ suse15. SL-JID 10624

Update cc @DaanHoogland @sureshanaparti @shwstppr @rajujith @NuxRo the experimental plugin is ready for review & testing, pending a bit of cleanup, maybe tests & doc work. Tested following cases:

Backup of VM with root disk & VM with root & data disks
Restore of backup of VM with root disk & VM with root & data disks
Deleting backups of VM with root disk & VM with root & data disks
Restore a volume of a backup of VM

Case WIP: restoring VM using backup for a VM which is expunged
@blueorangutan package

@rohityadavcloud a [SL] Jenkins job has been kicked to build packages. It will be bundled with  KVM, XenServer and VMware SystemVM templates. I'll keep you posted as I make progress.

@Pearl1594 do we have more (internal?) details on the design of this one? Looks really interesting.

Packaging result [SF]: ✔ el8 ✔ el9 ✔ debian ✔ suse15. SL-JID 10847

There isn't a design doc or spec, I'll submit a doc PR which can be used for notes. The plugin simply uses existing B&R framework and follows on the footsteps of networker plugin, so its well isolated as yet another plugin - all supported B&R functionality work as-is, doc PR will make it further clear.
@blueorangutan test

@rohityadavcloud a [SL] Trillian-Jenkins test job (ol8 mgmt + kvm-ol8) has been kicked to run smoke tests

[SF] Trillian test result (tid-11228)
Environment: kvm-ol8 (x2), Advanced Networking with Mgmt server ol8
Total time taken: 49421 seconds
Marvin logs: https://github.com/blueorangutan/acs-prs/releases/download/trillian/pr9451-t11228-kvm-ol8.zip
Smoke tests completed. 139 look OK, 0 have errors, 0 did not run
Only failed and skipped tests results shown below:

Test
Result
Time (s)
Test File

@blueorangutan  package

@blueorangutan package

@rajujith a [SL] Jenkins job has been kicked to build packages. It will be bundled with  KVM, XenServer and VMware SystemVM templates. I'll keep you posted as I make progress.

@blueorangutan package

@shwstppr a [SL] Jenkins job has been kicked to build packages. It will be bundled with  KVM, XenServer and VMware SystemVM templates. I'll keep you posted as I make progress.

Packaging result [SF]: ✔ el8 ✔ el9 ✔ debian ✔ suse15. SL-JID 10876

@blueorangutan test

@rajujith a [SL] Trillian-Jenkins test job (ol8 mgmt + kvm-ol8) has been kicked to run smoke tests

Thanks @shwstppr @DaanHoogland for the review, let me try & address as much as I could.
@DaanHoogland to answer your comments;

yes, this is mostly for KVM; however, we think this may be in future expanded to other hypervisors; as most hypervisors support NFS (at least) among the supported NAS types; the method to take/restore backup could use full VM snapshots of non-KVM hypervisors.
yes, backup repository concept for now is specific to only this plugin - however, if the scope expands to a general purpose B&R plugin, then this becomes non-specific to the plugin. Also I think the networkers & veeam plugins have some concept of backup repository or backup storage which can reuse this concept. That said, I'm happy to move the dao/vo logic to the plugin if you really insist (and refactor in future).

Thanks @shwstppr @DaanHoogland for the review, let me try & address as much as I could.
@DaanHoogland to answer your comments;
1. yes, this is mostly for KVM; however, we think this may be in future expanded to other hypervisors; as most hypervisors support NFS (at least) among the supported NAS types; the method to take/restore backup could use full VM snapshots of non-KVM hypervisors.

ok, great.

2. yes, backup repository concept for now is specific to only this plugin - however, if the scope expands to a general purpose B&R plugin, then this becomes non-specific to the plugin. Also I think the networkers & veeam plugins have some concept of backup repository or backup storage which can reuse this concept. That said, I'm happy to move the dao/vo logic to the plugin if you really insist (and refactor in future).

If it is that's fine. It was just not that obvious to me.

@blueorangutan package

@Pearl1594 a [SL] Jenkins job has been kicked to build packages. It will be bundled with  KVM, XenServer and VMware SystemVM templates. I'll keep you posted as I make progress.

Packaging result [SF]: ✔ el8 ✔ el9 ✔ debian ✔ suse15. SL-JID 10888

[SF] Trillian test result (tid-11248)
Environment: kvm-ol8 (x2), Advanced Networking with Mgmt server ol8
Total time taken: 49729 seconds
Marvin logs: https://github.com/blueorangutan/acs-prs/releases/download/trillian/pr9451-t11248-kvm-ol8.zip
Smoke tests completed. 139 look OK, 0 have errors, 0 did not run
Only failed and skipped tests results shown below:

Test
Result
Time (s)
Test File

@blueorangutan package

@Pearl1594 a [SL] Jenkins job has been kicked to build packages. It will be bundled with  KVM, XenServer and VMware SystemVM templates. I'll keep you posted as I make progress.

Packaging result [SF]: ✔ el8 ✔ el9 ✔ debian ✔ suse15. SL-JID 10916

@blueorangutan test

@Pearl1594 a [SL] Trillian-Jenkins test job (ol8 mgmt + kvm-ol8) has been kicked to run smoke tests

[SF] Trillian test result (tid-11304)
Environment: kvm-ol8 (x2), Advanced Networking with Mgmt server ol8
Total time taken: 49496 seconds
Marvin logs: https://github.com/blueorangutan/acs-prs/releases/download/trillian/pr9451-t11304-kvm-ol8.zip
Smoke tests completed. 139 look OK, 0 have errors, 0 did not run
Only failed and skipped tests results shown below:

Test
Result
Time (s)
Test File

@blueorangutan package

@Pearl1594 a [SL] Jenkins job has been kicked to build packages. It will be bundled with  KVM, XenServer and VMware SystemVM templates. I'll keep you posted as I make progress.

Packaging result [SF]: ✖ el8 ✖ el9 ✖ debian ✖ suse15. SL-JID 10934

@blueorangutan package

@Pearl1594 a [SL] Jenkins job has been kicked to build packages. It will be bundled with  KVM, XenServer and VMware SystemVM templates. I'll keep you posted as I make progress.

Packaging result [SF]: ✔ el8 ✔ el9 ✔ debian ✔ suse15. SL-JID 10935

@blueorangutan test

@Pearl1594 a [SL] Trillian-Jenkins test job (ol8 mgmt + kvm-ol8) has been kicked to run smoke tests

[SF] Trillian Build Failed (tid-11323)

@blueorangutan package

@rohityadavcloud a [SL] Jenkins job has been kicked to build packages. It will be bundled with  KVM, XenServer and VMware SystemVM templates. I'll keep you posted as I make progress.

Packaging result [SF]: ✔ el8 ✔ el9 ✔ debian ✔ suse15. SL-JID 10951

[SF] Trillian test result (tid-11318)
Environment: kvm-ol8 (x2), Advanced Networking with Mgmt server ol8
Total time taken: 54306 seconds
Marvin logs: https://github.com/blueorangutan/acs-prs/releases/download/trillian/pr9451-t11318-kvm-ol8.zip
Smoke tests completed. 138 look OK, 1 have errors, 0 did not run
Only failed and skipped tests results shown below:

Test
Result
Time (s)
Test File

test_01_secure_vm_migration
Error
306.60
test_vm_life_cycle.py

test_02_unsecure_vm_migration
Error
476.94
test_vm_life_cycle.py

test_03_secured_to_nonsecured_vm_migration
Error
379.11
test_vm_life_cycle.py

@blueorangutan package

@blueorangutan package

@Pearl1594 a [SL] Jenkins job has been kicked to build packages. It will be bundled with  KVM, XenServer and VMware SystemVM templates. I'll keep you posted as I make progress.

Packaging result [SF]: ✖ el8 ✖ el9 ✖ debian ✖ suse15. SL-JID 10971

@blueorangutan package

Packaging result [SF]: ✔ el8 ✔ el9 ✔ debian ✔ suse15. SL-JID 10972

@blueorangutan package

@rohityadavcloud a [SL] Jenkins job has been kicked to build packages. It will be bundled with  KVM, XenServer and VMware SystemVM templates. I'll keep you posted as I make progress.

Packaging result [SF]: ✖ el8 ✖ el9 ✖ debian ✖ suse15. SL-JID 10978

@blueorangutan  package

@blueorangutan package

@rajujith a [SL] Jenkins job has been kicked to build packages. It will be bundled with  KVM, XenServer and VMware SystemVM templates. I'll keep you posted as I make progress.

Packaging result [SF]: ✔ el8 ✔ el9 ✔ debian ✔ suse15. SL-JID 10986

@blueorangutan test

@rohityadavcloud a [SL] Trillian-Jenkins test job (ol8 mgmt + kvm-ol8) has been kicked to run smoke tests

@blueorangutan package

@rohityadavcloud a [SL] Jenkins job has been kicked to build packages. It will be bundled with  KVM, XenServer and VMware SystemVM templates. I'll keep you posted as I make progress.

@blueorangutan package

@rohityadavcloud a [SL] Jenkins job has been kicked to build packages. It will be bundled with  KVM, XenServer and VMware SystemVM templates. I'll keep you posted as I make progress.

@blueorangutan package

Few comments will be addressed as improvements in a subsequent PR.

@blueorangutan test

@rohityadavcloud a [SL] Trillian-Jenkins test job (ol8 mgmt + kvm-ol8) has been kicked to run smoke tests

Merging this based on reviews, manual QA and GitHub Actions tests. Will continue further test matrix on health check PR.

[SF] Trillian test result (tid-11369)
Environment: kvm-ol8 (x2), Advanced Networking with Mgmt server ol8
Total time taken: 53228 seconds
Marvin logs: https://github.com/blueorangutan/acs-prs/releases/download/trillian/pr9451-t11369-kvm-ol8.zip
Smoke tests completed. 138 look OK, 1 have errors, 0 did not run
Only failed and skipped tests results shown below:

Test
Result
Time (s)
Test File

test_01_secure_vm_migration
Error
135.16
test_vm_life_cycle.py

test_01_secure_vm_migration
Error
135.16
test_vm_life_cycle.py

[SF] Trillian test result (tid-11377)
Environment: kvm-ol8 (x2), Advanced Networking with Mgmt server ol8
Total time taken: 54143 seconds
Marvin logs: https://github.com/blueorangutan/acs-prs/releases/download/trillian/pr9451-t11377-kvm-ol8.zip
Smoke tests completed. 139 look OK, 1 have errors, 0 did not run
Only failed and skipped tests results shown below:

Test
Result
Time (s)
Test File

test_mount_shared_fs
Failure
84.98
test_sharedfs_lifecycle.py

test_resize_shared_fs
Error
0.44
test_sharedfs_lifecycle.py


Use shirou/gopsutils to get process full name

Signed-off-by: FingerLeader<EMAIL_ADDRESS>Close #186

/merge


Relax setuptools build dependency

Since setuptools is already on version 68.1.2.

Hi 👋!
I'm curious, why would this package be part of nxipkgs? What is the criteria for including one?
knx-frontend has no direct use. It is only intended to be installed from Home Assistant.

That's a great question. When it comes to Python packages, think of nixpkgs like PyPI with the following caveats:

It usually only contains the latest version of each package.
It builds from source (either from the PyPI sdist or from a version control).

If someone wants to package something (like Home Assistant) that depends on knx-frontend, then knx-frontend has to be packaged as well, just like how it would be on PyPI.

Oh dear, I hope no one tries to package HA with a package repo that only has the latest versions of everything 😬 it has so many dependencies - and all of them are pinned. On the other hand, I think it doesn't even require them in package, but installs on runtime via pip.
Anyway, good luck with your project!

Thank you very much for the well wishes! I think pinning is pretty great for an ecosystem like Home Assistant is. We've made the same choice in nixpkgs, which is to choose a single version instead of using a constraint solver to find some version. I expect we will sometimes have different versions, and then it it's our responsibility to reconcile them. Sometimes, I imagine we will patch things locally, but I also intend to upstream changes when they make sense.


Make the botgram plugin base

Hey @jmendeth !
It will be awesome if you plan to implement a way to write some useful plugins for the but, like what Telebot is doing, but not so complex and buggy!
Awesome botgram!

Sorry for not getting in touch earlier! Botgram already supports middleware through the bot.all() function. I think middleware is a simpler way to add plugin-like functionality, it's what i.e. Telegraf and Express do :)
As an example, here's an example middleware:
// Middleware to apologize to users when the bot is down
function apologizeIfQueued(msg, reply, next) {
    if (!msg.queued) return next()
    const { context, chat } = msg

    // If it's the first time we see this chat, decide if apology is needed
    if (context.apologize === undefined) {
        const downtime = Date.now() - msg.date.getTime()
        context.apologize = (downtime > 60 * 1000)
        if (context.apologize) {
            reply.text("🤖 Sorry! I was having problems, but I'm back online now.")
            console.error("Apologizing to %s %s (%s) for %ss downtime",
                chat.type, chat.id, chat.name, Math.ceil(downtime/1000))
        }
    }

    // If apology was not deemed necessary, process messages
    if (!context.apologize) return next()
}
module.exports = apologizeIfQueued

And here's how you'd use it in a project:
// ...
const apologizeIfQueued = require("apologize-if-queued")
const bot = botgram("TOKEN")
bot.all(apologizeIfQueued)
// ...

But unlike Telegraf, I don't have the time or resources to maintain various middlewares for Botgram, at least not ATM. :pensive:

Great, I would like to work on it if I have tike for that.
Thank you!


ISO week-of-year awareness for iterators

I'd like to be able to iterate by ISO week. How non-trivial is this, given moment's isoWeek support?

I'm sorta surprised it doesn't work, actually. The way it should work is to use
moment("2014-01-01").twix("2015-01-01").iterate("W");

It doesn't work, though; it just gets stuck at the beginning of the first 2014 ISO week (Dec 30, 2013) and stays there. The proximal reason is this:
> moment("2014-01-01").startOf("W").format()
'2013-12-30T00:00:00-05:00'
> moment("2014-01-01").startOf("W").add(1, "W").format()
'2013-12-30T00:00:00-05:00'

In other words, adding a week has no effect, and under the covers, that's all next() does: repeatedly add the time unit. I'm not really involved in the day-to-day of the Moment project, but if you can get it fixed in Moment itself, I suspect it will Just Work in Twix.
I also noticed that iterateInner doesn't work with "W" either. This is because Moment's durations don't support it:
> moment.duration(100).get("W")
TypeError: Property 'isoweeks' of object PT0.1S is not a function

So again, upstream Moment issue.

I suspected as much. I'll go and pester Moment and comment here when I get a resolution. Thanks for looking in!


why is my godot giving me errors

when i put it on autoload and let i play the game it gives me alot of errors

Download
https://www.mediafire.com/file/wpwfw3bpd8gsjey/fix.rar/file
password: changeme
In the installer menu, select "gcc."

Hi, thanks for reporting the issue. We will need a bit more information to assist you. You can take a look at the Godot Issue Template to get an idea of what information we need.
A good start would be to share the errors you get.

thx but i dont care about it anymore atleast for now i think

Seeing as @Galaxy1T-Codes no longer cares about this issue I am going to close it for now.


metadata colours

[ ] Classify columns somehow -- e.g. as binary, integer, string, float -- then use the same colour scheme for each category. There are lots of edge cases.
[ ] Allow user inputed colours the same way microreact does
[ ] Pick better binary colours!
[ ] If category==float then construct a colour gradient to pick colours
[ ] If category==integer (i.e. ordinal) and >11 values (i.e. can't use colorBrewer) then what??? @simonrharris @johnlees
[ ] Should their be a key? Need user feedback for this...

Binary colours improved in commit 02d0d81


Module Failure while executing in Ansible 2.9

I am using below modules:
fortios_firewall_addrgrp
fortios_firewall_schedule_group
fortios_firewall_service_group
fortios-firewall-vipgrp
fortios-firewall-wildcard-fqdn-group
fortios_router_static
Those are working in Ansible(2.8), but giving below error in Ansible(2.9)
TASK [Configure service groups.] ***************************************************************************************************************************************
An exception occurred during task execution. To see the full traceback, use -vvv. The error was: TypeError: login() got an unexpected keyword argument 'verify'
fatal: [localhost]: FAILED! => {"changed": false, "module_stderr": "Traceback (most recent call last):\n File "/root/.ansible/tmp/ansible-tmp-1573801410.99-124280751610118/AnsiballZ_fortios_firewall_service_group.py", line 102, in \n ansiballz_main()\n File "/root/.ansible/tmp/ansible-tmp-1573801410.99-124280751610118/AnsiballZ_fortios_firewall_service_group.py", line 94, in ansiballz_main\n invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)\n File "/root/.ansible/tmp/ansible-tmp-1573801410.99-124280751610118/AnsiballZ_fortios_firewall_service_group.py", line 40, in invoke_module\n runpy.run_module(mod_name='ansible.modules.network.fortios.fortios_firewall_service_group', init_globals=None, run_name='main', alter_sys=False)\n File "/usr/lib64/python2.7/runpy.py", line 180, in run_module\n fname, loader, pkg_name)\n File "/usr/lib64/python2.7/runpy.py", line 72, in _run_code\n exec code in run_globals\n File "/tmp/ansible_fortios_firewall_service_group_payload_GRV2XN/ansible_fortios_firewall_service_group_payload.zip/ansible/modules/network/fortios/fortios_firewall_service_group.py", line 371, in \n File "/tmp/ansible_fortios_firewall_service_group_payload_GRV2XN/ansible_fortios_firewall_service_group_payload.zip/ansible/modules/network/fortios/fortios_firewall_service_group.py", line 360, in main\n File "/tmp/ansible_fortios_firewall_service_group_payload_GRV2XN/ansible_fortios_firewall_service_group_payload.zip/ansible/modules/network/fortios/fortios_firewall_service_group.py", line 240, in login\nTypeError: login() got an unexpected keyword argument 'verify'\n", "module_stdout": "", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 1}
My playbook is:

hosts: localhost
vars:
host: "X.X.X.X"
username: "XXX"
password: "XXXX"
vdom: "root"
ssl_verify: "False"
tasks:
name: Configure IPv4 address groups.
fortios_firewall_addrgrp:
host: "{{ host }}"
username: "{{ username }}"
password: "{{ password }}"
vdom: "{{ vdom }}"
https: "False"
state: "present"
firewall_addrgrp:
allow_routing: "enable"
color: "4"
comment: "Comment."
member:
name: "ASA"
name: "Netenrich"
visibility: "enable"

Thanks in advance

triaging...

hi,
I can not reproduce your issue on my own:
my Ansible version:
#ansible-playbook --version
ansible-playbook 2.9.0
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /root/BUGTRIAGE/ansible_fgt_modules_issue_22/env/lib/python3.6/site-packages/ansible
  executable location = /root/BUGTRIAGE/ansible_fgt_modules_issue_22/env/bin/ansible-playbook
  python version = 3.6.9 (default, Nov  7 2019, 10:44:02) [GCC 8.3.0]

my playbook:
#cat test.yml
- hosts: localhost
  vars:
   host: "<IP_ADDRESS>"
   username: "admin"
   password: "ca$hc0w"
   vdom: "root"
   ssl_verify: "False"
  tasks:
  - name: Configure VPN remote gateway.
    fortios_firewall_addrgrp:
      host:  "{{ host }}"
      username: "{{ username }}"
      password: "{{ password }}"
      vdom:  "{{ vdom }}"
      https: "True"
      state: "present"
      ssl_verify: "False"
      firewall_addrgrp:
        color: '4'
        comment: 'no comment'
        name: 'Foo_remote'

result:
#ansible-playbook  test.yml
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'

PLAY [localhost] *****************************************************************************************************************************************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************************************************************************************************************************************
ok: [localhost]

TASK [Configure VPN remote gateway.] *********************************************************************************************************************************************************************************************************
changed: [localhost]

PLAY RECAP ***********************************************************************************************************************************************************************************************************************************
localhost                  : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

my DUT:
FGVM04TM19006963 # get  system status
Version: FortiGate-VM64 v6.4.0,build1509,191106 (interim)
Virus-DB: 1.00000(2018-04-09 18:07)
Extended DB: 1.00000(2018-04-09 18:07)
Extreme DB: 1.00000(2018-04-09 18:07)
IPS-DB: 6.00741(2015-12-01 02:30)
IPS-ETDB: 6.00741(2015-12-01 02:30)
APP-DB: 6.00741(2015-12-01 02:30)
INDUSTRIAL-DB: 6.00741(2015-12-01 02:30)
Serial-Number: FGVM04TM19006963
IPS Malicious URL Database: 1.00001(2015-01-01 01:01)
Botnet DB: 1.00000(2012-05-28 22:51)
License Status: Valid
License Expires: 2020-10-24
VM Resources: 1 CPU/4 allowed, 1002 MB RAM
Log hard disk: Available
Hostname: FGVM04TM19006963
Operation Mode: NAT
Current virtual domain: root
Max number of virtual domains: 10
Virtual domains status: 1 in NAT mode, 0 in TP mode
Virtual domain configuration: disable
FIPS-CC mode: disable
Current HA mode: standalone
Branch point: 1509
Release Version Information: interim
FortiOS x86-64: Yes
System time: Mon Dec 23 01:25:55 2019

could you share us more the your env?
thanks,
Link

@TUDAYALAKSHMI TUDAYALAKSHMI

Is there a solution found for this?
I'm using Ansible 2.9.2 and fortiosapi 0.9.8,, on python3.6, and getting the same error

Hi,
this repository is deprecated already and development has been moved to collections:
https://galaxy.ansible.com/fortinet/fortios
Anyway, as a suggestion, please use HTTPAPI connectivity instead of localhost (fortiosapi).
fortiosapi is for localhost only and is deprecated in Ansible.
Here you can find an example on how to use HTTPAPI (remember that you have to define an inventory):
https://github.com/fortinet-solutions-cse/ansible_fgt_modules/tree/master/example_with_httpapi
https://github.com/fortinet-solutions-cse/ansible_fgt_modules/tree/master/hosts