#[swift_bridge(already_declared)] fails when wrapping an enum in Optional

Minimal reproduction:

#[swift_bridge::bridge]
mod ffi_1 {
    enum SomeTransparentEnum {
        Variant,
    }
}

use ffi_1::SomeTransparentEnum;

fn some_function() -> Option<SomeTransparentEnum> {
    Some(SomeTransparentEnum::Variant)
}

#[swift_bridge::bridge]
mod ffi_2 {
    #[swift_bridge(already_declared)]
    enum SomeTransparentEnum {}

    extern "Rust" {
        fn some_function() -> Option<SomeTransparentEnum>;
    }
}

This fails to compile due to:

cannot find type __swift_bridge__Option_SomeTransparentEnum in this scope

Thanks for reporting this.
Problem
We generate a __swift_bridge__Option_MyEnumName type in the module that declares the enum.
The #[already_declared] module is trying to make use of that type, but it isn't visible.
https://github.com/chinedufn/swift-bridge/blob/832498a8a822690e2ef61e5929a05d713ba2fbe8/crates/swift-bridge-ir/src/codegen/codegen_tests/transparent_enum_codegen_tests.rs#L184-L219
https://github.com/chinedufn/swift-bridge/blob/53b93f47cc32d605377194a43f3164745cea6dd6/crates/swift-bridge-ir/src/codegen/generate_rust_tokens/shared_enum.rs#L204-L237
Solution
The module that contains the #[already_declared] enum needs to look for __swift_bridge__Option_MyEnumName in the super:: module.
Here are steps to solve this:

Read the #[already_declared] enum test to get a sense of how we handle #[already_declared] enums.
https://github.com/chinedufn/swift-bridge/blob/ecd3b974754e32fc951b8bc4098ecef84e974821/crates/swift-bridge-ir/src/codegen/codegen_tests/already_declared_attribute_codegen_tests.rs#L168-L232

Add a new #[already_declared] codegen test module for an extern "Rust" function that returns an Option<AlreadyDeclaredEnum>
Similar to this but for an Option<SomeEnum> https://github.com/chinedufn/swift-bridge/blob/ecd3b974754e32fc951b8bc4098ecef84e974821/crates/swift-bridge-ir/src/codegen/codegen_tests/already_declared_attribute_codegen_tests.rs#L168-L232

Add an integration test for calling a Rust function that returns an Option<AlreadyDeclaredEnum>.
Similar to:
https://github.com/chinedufn/swift-bridge/blob/4fbd30f81085dc366bda3c0303eac66345de3ed9/SwiftRustIntegrationTestRunner/SwiftRustIntegrationTestRunnerTests/SharedEnumAttributeTests.swift#L24-L32
https://github.com/chinedufn/swift-bridge/blob/4fbd30f81085dc366bda3c0303eac66345de3ed9/crates/swift-integration-tests/src/enum_attributes/already_declared.rs#L35-L37

Update the codegen to use super::__swift_bridge__Option_SomeTransparentEnum when the enum is already_declared.
https://github.com/chinedufn/swift-bridge/blob/53b93f47cc32d605377194a43f3164745cea6dd6/crates/swift-bridge-ir/src/bridged_type/shared_enum.rs#L55-L62
/// __swift_bridge__Option_SomeEnum
pub fn ffi_option_name_tokens(&self) -> TokenStream {
	let maybe_super = if self.already_declared {
        "super::"
	} else {
	    ""
	};

    let name = Ident::new(
        &format!("{maybe_super}{}Option_{}", SWIFT_BRIDGE_PREFIX, self.name),
        self.name.span(),
    );
    quote! { #name }
}


Performance Fix - Locking in Update

Description of Changes
Describe what has been changed, any new features or bug fixes

Fixes a performance issue which was introduced by acquiring a lock in Update()

API

[ ] This is an API breaking change to the SDK

If the API is breaking, please state below what will break
Requires SpacetimeDB PRs
List any PRs here that are required for this SDK change to work

This seems to have been caused by an issue in bitcraft, this code doesn't actually fix anything


fix: peerDependencies wrong v. of Bunyan

The version required is not even released... Please refer to: https://www.npmjs.com/package/bunyan

@andreieuganox Hey Andrei, I see v2.x versions both in npm and in bunyan github releases. Closing, but feel free to open another issue with specific problems in regards to the v2.x bunyan dependency, if you have any. Thanks!

@gyfis 2.0.5 is Beta and is the only one. So stating >=2.0.0 makes it sound like only Beta can be used and then >=2.0.5.
I would not recommend using that beta version at all. And to be honest, nobody uses it. Apart from that - it works with lower versions, so why introduce this in the dependency graph at all...


src_dir is deprecated

Coveralls throws errors when src_dir is set.

Merged to develop for release with 2.9.0.


Space added inside do and end during --auto-correct when replacing a { }

Unfortunately I can't give the full code, but in loop with nokogiri (4/5 imbrications) I had the following change made with --auto-correct :

   foo.each{

   }

   foo.each d  o

   en  d

With a space in "do" and "end".

Here is an example of the problem. We can see that the rubocop add 2 spaces near the end instead of indenting for two spaces.
Before :
def my_function(xml)
xml['spams'].violations(:toolname => @spams.violations.toolname(),
:version => @spams.violations.version()){
@spams.violations.get_violating_files.each { |file|
xml['violations'].file(:path => file){
violations = @spams.violations.violations(file)
violations.each{ |violation|
xml['violations'].violation(:column => violation.column ,
:key => violation.key,
:line => violation.line,
:message => violation.message,
:severity => violation.severity)
}
}
}
}
return xml
end
What rubocop output :
def my_function(xml)
xml['spams'].violations(toolname: @spams.violations.toolname(),
version: @spams.violations.version()) do
@spams.violations.get_violating_files.each do |file|
xml['violations'].file(path: file) d  o
violations = @spams.violations.violations(file  )
violations.each do |violation  |
xml['violations'].violation(column: violation.column   ,
key: violation.key  ,
line: violation.line  ,
message: violation.message  ,
severity: violation.severity  )
en  d
end
end
end
return xml
end
Can run :
def my_function(xml)
xml['spams'].violations(toolname: @spams.violations.toolname(),
version: @spams.violations.version()) do
@spams.violations.get_violating_files.each do |file|
xml['violations'].file(path: file) do
violations = @spams.violations.violations(file)
violations.each do |violation|
xml['violations'].violation(column: violation.column,
key: violation.key,
line: violation.line,
message: violation.message,
severity: violation.severity)
end
end
end
end
return xml
end
Better :
def my_function(xml)
xml['spams'].violations(toolname: @spams.violations.toolname,
version: @spams.violations.version) do
@spams.violations.get_violating_files.each do |file|
xml['violations'].file(path: file) do
violations = @spams.violations.violations(file)
violations.each do |violation|
xml['violations'].violation(column: violation.column,
key: violation.key,
line: violation.line,
message: violation.message,
severity: violation.severity)
end
end
end
end
xml
end

Here is an example of the problem. You have before, after rubocop, a modification so that it runs again and the expected output.
Before :
def my_function(xml)
xml['spams'].violations(:toolname => @spams.violations.toolname(),
:version => @spams.violations.version()){
@spams.violations.get_violating_files.each { |file|
xml['violations'].file(:path => file){
violations = @spams.violations.violations(file)
violations.each{ |violation|
xml['violations'].violation(:column => violation.column ,
:key => violation.key,
:line => violation.line,
:message => violation.message,
:severity => violation.severity)
}
}
}
}
return xml
end
What rubocop output :
  def my_function(xml)
    xml['spams'].violations(toolname: @spams.violations.toolname(),
                            version: @spams.violations.version()) do
      @spams.violations.get_violating_files.each do |file|
        xml['violations'].file(path: file) d  o
        violations = @spams.violations.violations(file  )
        violations.each do |violation  |
          xml['violations'].violation(column: violation.column   ,
                                      key: violation.key  ,
                                      line: violation.line  ,
                                      message: violation.message  ,
                                      severity: violation.severity  )
        en  d
      end
      end
    end
    return xml
  end

Can run :
  def my_function(xml)
    xml['spams'].violations(toolname: @spams.violations.toolname(),
                            version: @spams.violations.version()) do
      @spams.violations.get_violating_files.each do |file|
        xml['violations'].file(path: file) do
        violations = @spams.violations.violations(file)
        violations.each do |violation|
          xml['violations'].violation(column: violation.column,
                                      key: violation.key,
                                      line: violation.line,
                                      message: violation.message,
                                      severity: violation.severity)
        end
      end
      end
    end
    return xml
  end

Better :
  def my_function(xml)
    xml['spams'].violations(toolname: @spams.violations.toolname,
                            version: @spams.violations.version) do
      @spams.violations.get_violating_files.each do |file|
        xml['violations'].file(path: file) do
          violations = @spams.violations.violations(file)
          violations.each do |violation|
            xml['violations'].violation(column: violation.column,
                                        key: violation.key,
                                        line: violation.line,
                                        message: violation.message,
                                        severity: violation.severity)
          end
        end
      end
    end
    xml
  end

Here is an example of the problem. You have before, after rubocop, a modification so that it runs again and the expected output.
Before :
def my_function(xml)
xml['spams'].violations(:toolname => @spams.violations.toolname(),
:version => @spams.violations.version()){
@spams.violations.get_violating_files.each { |file|
xml['violations'].file(:path => file){
violations = @spams.violations.violations(file)
violations.each{ |violation|
xml['violations'].violation(:column => violation.column ,
:key => violation.key,
:line => violation.line,
:message => violation.message,
:severity => violation.severity)
}
}
}
}
return xml
end
What rubocop output :
  def my_function(xml)
    xml['spams'].violations(toolname: @spams.violations.toolname(),
                            version: @spams.violations.version()) do
      @spams.violations.get_violating_files.each do |file|
        xml['violations'].file(path: file) d  o
        violations = @spams.violations.violations(file  )
        violations.each do |violation  |
          xml['violations'].violation(column: violation.column   ,
                                      key: violation.key  ,
                                      line: violation.line  ,
                                      message: violation.message  ,
                                      severity: violation.severity  )
        en  d
      end
      end
    end
    return xml
  end

Can run :
  def my_function(xml)
    xml['spams'].violations(toolname: @spams.violations.toolname(),
                            version: @spams.violations.version()) do
      @spams.violations.get_violating_files.each do |file|
        xml['violations'].file(path: file) do
        violations = @spams.violations.violations(file)
        violations.each do |violation|
          xml['violations'].violation(column: violation.column,
                                      key: violation.key,
                                      line: violation.line,
                                      message: violation.message,
                                      severity: violation.severity)
        end
      end
      end
    end
    return xml
  end

Better :
  def my_function(xml)
    xml['spams'].violations(toolname: @spams.violations.toolname,
                            version: @spams.violations.version) do
      @spams.violations.get_violating_files.each do |file|
        xml['violations'].file(path: file) do
          violations = @spams.violations.violations(file)
          violations.each do |violation|
            xml['violations'].violation(column: violation.column,
                                        key: violation.key,
                                        line: violation.line,
                                        message: violation.message,
                                        severity: violation.severity)
          end
        end
      end
    end
    xml
  end

Here is an example of the bug. First the code before, the code after rubocop,
a code that run after correcting rubocop, and what I think is the expected output.
Before :
def my_function(xml)
xml['spams'].violations(:toolname => @spams.violations.toolname(),
:version => @spams.violations.version()){
@spams.violations.get_violating_files.each { |file|
xml['violations'].file(:path => file){
violations = @spams.violations.violations(file)
violations.each{ |violation|
xml['violations'].violation(:column => violation.column ,
:key => violation.key,
:line => violation.line,
:message => violation.message,
:severity => violation.severity)
}
}
}
}
return xml
end
What rubocop output :
  def my_function(xml)
    xml['spams'].violations(toolname: @spams.violations.toolname(),
                            version: @spams.violations.version()) do
      @spams.violations.get_violating_files.each do |file|
        xml['violations'].file(path: file) d  o
        violations = @spams.violations.violations(file  )
        violations.each do |violation  |
          xml['violations'].violation(column: violation.column   ,
                                      key: violation.key  ,
                                      line: violation.line  ,
                                      message: violation.message  ,
                                      severity: violation.severity  )
        en  d
      end
      end
    end
    return xml
  end

Can run :
  def my_function(xml)
    xml['spams'].violations(toolname: @spams.violations.toolname(),
                            version: @spams.violations.version()) do
      @spams.violations.get_violating_files.each do |file|
        xml['violations'].file(path: file) do
        violations = @spams.violations.violations(file)
        violations.each do |violation|
          xml['violations'].violation(column: violation.column,
                                      key: violation.key,
                                      line: violation.line,
                                      message: violation.message,
                                      severity: violation.severity)
        end
      end
      end
    end
    return xml
  end

Better :
  def my_function(xml)
    xml['spams'].violations(toolname: @spams.violations.toolname,
                            version: @spams.violations.version) do
      @spams.violations.get_violating_files.each do |file|
        xml['violations'].file(path: file) do
          violations = @spams.violations.violations(file)
          violations.each do |violation|
            xml['violations'].violation(column: violation.column,
                                        key: violation.key,
                                        line: violation.line,
                                        message: violation.message,
                                        severity: violation.severity)
          end
        end
      end
    end
    xml
  end

Here is an example of the bug. First the code before, the code after rubocop,
a code that run after correcting rubocop, and what I think is the expected output.
Before :
def my_function(xml)
xml['spams'].violations(:toolname => @spams.violations.toolname(),
:version => @spams.violations.version()){
@spams.violations.get_violating_files.each { |file|
xml['violations'].file(:path => file){
violations = @spams.violations.violations(file)
violations.each{ |violation|
xml['violations'].violation(:column => violation.column ,
:key => violation.key,
:line => violation.line,
:message => violation.message,
:severity => violation.severity)
}
}
}
}
return xml
end
What rubocop output :
  def my_function(xml)
    xml['spams'].violations(toolname: @spams.violations.toolname(),
                            version: @spams.violations.version()) do
      @spams.violations.get_violating_files.each do |file|
        xml['violations'].file(path: file) d  o
        violations = @spams.violations.violations(file  )
        violations.each do |violation  |
          xml['violations'].violation(column: violation.column   ,
                                      key: violation.key  ,
                                      line: violation.line  ,
                                      message: violation.message  ,
                                      severity: violation.severity  )
        en  d
      end
      end
    end
    return xml
  end

Can run :
  def my_function(xml)
    xml['spams'].violations(toolname: @spams.violations.toolname(),
                            version: @spams.violations.version()) do
      @spams.violations.get_violating_files.each do |file|
        xml['violations'].file(path: file) do
        violations = @spams.violations.violations(file)
        violations.each do |violation|
          xml['violations'].violation(column: violation.column,
                                      key: violation.key,
                                      line: violation.line,
                                      message: violation.message,
                                      severity: violation.severity)
        end
      end
      end
    end
    return xml
  end

Better :
  def my_function(xml)
    xml['spams'].violations(toolname: @spams.violations.toolname,
                            version: @spams.violations.version) do
      @spams.violations.get_violating_files.each do |file|
        xml['violations'].file(path: file) do
          violations = @spams.violations.violations(file)
          violations.each do |violation|
            xml['violations'].violation(column: violation.column,
                                        key: violation.key,
                                        line: violation.line,
                                        message: violation.message,
                                        severity: violation.severity)
          end
        end
      end
    end
    xml
  end

Here is an example of the bug. First the code before, the code after rubocop,
a code that run after correcting rubocop, and what I think is the expected output.
Before :
def my_function(xml)
xml['spams'].violations(:toolname => @spams.violations.toolname(),
:version => @spams.violations.version()){
@spams.violations.get_violating_files.each { |file|
xml['violations'].file(:path => file){
violations = @spams.violations.violations(file)
violations.each{ |violation|
xml['violations'].violation(:column => violation.column ,
:key => violation.key,
:line => violation.line,
:message => violation.message,
:severity => violation.severity)
}
}
}
}
return xml
end
What rubocop output :
  def my_function(xml)
    xml['spams'].violations(toolname: @spams.violations.toolname(),
                            version: @spams.violations.version()) do
      @spams.violations.get_violating_files.each do |file|
        xml['violations'].file(path: file) d  o
        violations = @spams.violations.violations(file  )
        violations.each do |violation  |
          xml['violations'].violation(column: violation.column   ,
                                      key: violation.key  ,
                                      line: violation.line  ,
                                      message: violation.message  ,
                                      severity: violation.severity  )
        en  d
      end
      end
    end
    return xml
  end

Can run :
  def my_function(xml)
    xml['spams'].violations(toolname: @spams.violations.toolname(),
                            version: @spams.violations.version()) do
      @spams.violations.get_violating_files.each do |file|
        xml['violations'].file(path: file) do
        violations = @spams.violations.violations(file)
        violations.each do |violation|
          xml['violations'].violation(column: violation.column,
                                      key: violation.key,
                                      line: violation.line,
                                      message: violation.message,
                                      severity: violation.severity)
        end
      end
      end
    end
    return xml
  end

Better :
  def my_function(xml)
    xml['spams'].violations(toolname: @spams.violations.toolname,
                            version: @spams.violations.version) do
      @spams.violations.get_violating_files.each do |file|
        xml['violations'].file(path: file) do
          violations = @spams.violations.violations(file)
          violations.each do |violation|
            xml['violations'].violation(column: violation.column,
                                        key: violation.key,
                                        line: violation.line,
                                        message: violation.message,
                                        severity: violation.severity)
          end
        end
      end
    end
    xml
  end

This was corrected in #2086. Merged to master but not released as a gem version yet.


chore: Fix warnings in tests

What does this PR do?

Change the way to set up a State Machine in Jest tests so this warning won't be printed when we run npm test:

Pass a required Datadog prop nodeLayerVersion so this error-level log won't be printed:

Motivation

Testing Guidelines
Run npm test. The output is now clean:

Additional Notes

Types of Changes

[ ] Bug fix
[ ] New feature
[ ] Breaking change
[x] Misc (docs, refactoring, dependency upgrade, etc.)

Check all that apply

[x] This PR's description is comprehensive
[ ] This PR contains breaking changes that are documented in the description
[ ] This PR introduces new APIs or parameters that are documented and unlikely to change in the foreseeable future
[ ] This PR impacts documentation, and it has been updated (or a ticket has been logged)
[ ] This PR's changes are covered by the automated tests
[ ] This PR collects user input/sensitive content into Datadog

/merge


Kubernetes image pull fails with the qa-catalog

Rancher Version:: v1.1.0-dev5-rc4
Environment Type: (Cattle/Kubernetes/Swarm/Mesos): Kubernetes
Steps to Reproduce:

Create a Kubernetes environment with  https://github.com/rancher/qa-catalog/
Kubernetes does not start successfully .

Image Pull gives the following error :
Image [rancher/k8s:v1.2.4-fake] failed to pull: Tag v1.2.4-fake not found in repository docker.io/rancher/k8s

please re-test against rc5. rc-4 release didn't include the fix for that.

Tested with v1.1.0-dev5-rc5.


chrome keeps giving me net::ERR_CONNECTION_REFUSED  after livereload

It doesn't happen every time, but happens 40-50% which is quite annoying. Any idea what is happening??

Install bower install livereload-js --save-dev, update with npm -install and runt the task grunt serve working.
Regards

The problem was the livereload chrome extension I have sitting in my browser. I haven't used it in so long and I realized that it was injecting the script tag.. that tag would appear a moment after the rest of the dom loads. So I just uninstalled it and I no long have this issue and I don't have to spend another 100 hours trying to get BrowserSync to work instead. :)


test: update to latest postresql module version

Description
Update the default example to latest postgresql module version that contains provider fix.
Due to a deprecation of certain ICD parameters in the IBM provider, the older versions of these examples will fail always. Skipping this upgrade test as it is expected to fail.
Release required?

[x] No release
[ ] Patch release (x.x.X)
[ ] Minor release (x.X.x)
[ ] Major release (X.x.x)

Release notes content

Run the pipeline
If the CI pipeline doesn't run when you create the PR, the PR requires a user with GitHub collaborators access to run the pipeline.
Run the CI pipeline when the PR is ready for review and you expect tests to pass. Add a comment to the PR with the following text:
/run pipeline

Checklist for reviewers

[ ] If relevant, a test for the change is included or updated with this PR.
[ ] If relevant, documentation for the change is included or updated with this PR.

For mergers

Use a conventional commit message to set the release level. Follow the guidelines.
Include information that users need to know about the PR in the commit message. The commit message becomes part of the GitHub release notes.
Use the Squash and merge option.

/run pipeline

:tada: This PR is included in version 3.2.0 :tada:
The release is available on GitHub release
Your semantic-release bot :package::rocket:


Why my code get better f1_score on older versions

Click to expand!
Issue Type
Bug
Source
binary
Tensorflow Version
2.10.0 , 2.7.0, 2.4.0
Custom Code
No
OS Platform and Distribution
No response
Mobile device
No response
Python version
3.7.10
Bazel version
No response
GCC/Compiler version
No response
CUDA/cuDNN version
No response
GPU model and memory
No response
Current Behaviour?
Hi, I adopt different tensorflow and keras versions with my code. But it return better f_1 Score on older versions. The reproduction results are as follows:

Tensorflow
Keras
F1 Score

2.7.0
2.7.0
0.29846938775510207

2.4.0
2.4.0
0.7376928728875827

I also test it with TensorFlow 2.10.0, and the f_1 score is 0.6031746031746031.
Standalone code to reproduce the issue
I post the code on colad.click me to reproduce
Relevant log output
No response

Your code is not accessible.
Please can you try also with the last stable version TF 2.10?

Thanks for your quick reply! I modified the access permission. colab code
Besides, I test it with TF 2.10 and the F1 score is  0.6031746031746031.

Hi!

[x] refactor the colab with the new imports
[x] upload datset
Download dataset

Please don't import Keras directly. Import it from TF e.g.from tensorflow.keras.models..
Can you refactor the colab with the new imports? Also please share your input file to reproduce the results.

It is hard to compare results between TF version with you notebook as if you see your code gives different results with the same TF version across multiple runs.
Other then seeds you need probably to remove other random sources for a reproducible experiment.
When you will reproduce the same results across multiple run on the same TF version we could check if there is really a numerically relevant difference.

Hello, I try to set the random seed using this approach.
https://github.com/keras-team/keras/issues/2743#issuecomment-904169662
import random
random.seed(2022)
np.random.seed(2022)
tf.random.set_seed(2022)

I added shuffle = False in model.fit(). And I executed the code five times with TF 2.10 but it gave the same result which is 0.5364372469635627.
It' s weird why the results of your tests are inconsistent. Can you run it several times to see if there are still inconsistent results.I will also continue to test it .
Thanks!!!

Ok,  now I see the difference with 2.4.0.
I got very similar results also with TF 2.10 and TF Nightly (f1_score:  0.5369807497467073)
I think that you can reopen this ticket in the Keras repo   https://github.com/keras-team/keras.

hi, I post this issue on keras#17217.
Thanks for your reply!

Thanks


Setup GitHub actions

Fantastic! I was planning on doing this myself. Now I don't have to 😄 Thanks!


Lipo battery connector not working

HI
I am just setting up my new ttgo t-display. It works just fine on usb power but when i connect a new fully loaded lipo 1s to the battery connector nothing happens.
On usb the little blue led is blinking quickly, but when i connect lipo and usb the blue led is very bright and not blinking.
It it broken already? Or what is wrong?

I'm in the same problem, and it will be quite hot nearing the led after I connect an usb cable or a battery.


Netflow import

Support for import of externally sourced flow data into Arkime so that it can be factored into network investigations and visualizations. Ideally support would be flexible in allowing an administrator to configure support for alternate flow export formats (v5, v9, flexible, sFlow, csv, etc...). This should be a script that reads the files and creates sessions2 records.
More ideas from @philhagen:

receive netflow 5, 7, 9; ipfix; sflow
index alongside SPI data with the limited fields available (so FPC-originated SPI can be queried at the same time as NF-originated SPI)
de-duplicate FPC-originated and NF-originated SPI (i suspect this is going to be a bit tricky because timestamps will not be precisely identical)
de-duplicate NF-originated records seen at multiple exporters (even more tricky due to timing AND possibly byte count disparities)
probably tag or otherwise indicate that a record is NF-originated
ability to configure multiple-to-numerous exporters from the config file and/or UI (dozens to hundreds)

+1! I would really like this option see implemented.

Ideally this is not strictly a file import but serve as a NetFlow collector as well.
If a collector is not in the cards can we get a watch folder option at least.
I've been dreaming of this being built-in for a long time (https://github.com/arkime/arkime/issues/1160)

I'd say live collector is the only way to go - there are countless formats of at-rest storage of NetFlow and choosing any one (or ten) will just leave too many people without the ability to use it.  A live collector means just a handful of formats to cover.
One additional requirement ported over from Slack:

stitch together the typically unidirectional flow records into a session-based accounting.

I'd say live collector is the only way to go - there are countless formats of at-rest storage of NetFlow and choosing any one (or ten) will just leave too many people without the ability to use it. A live collector means just a handful of formats to cover.

I disagree. We use Arkime to analyse pre recorded (historic) network traffic both from wiretaps or netflow from switches where we cannot get an Arkime monitor.
So for our use case we rely on the import functionality of Netflow data.

I guess the question would then become which of the dozens/hundreds of formats should be supported by the importer?

I'd say live collector is the only way to go - there are countless formats of at-rest storage of NetFlow and choosing any one (or ten) will just leave too many people without the ability to use it. A live collector means just a handful of formats to cover.

I disagree. We use Arkime to analyse pre recorded (historic) network traffic both from wiretaps or netflow from switches where we cannot get an Arkime monitor.
So for our use case we rely on the import functionality of Netflow data.

Would using a separate tool (e.g. nfreplay/flow-to-if) be a viable option to replay files into a collector? Then Arkime does not have to support all the storage formats.

I think the replay path is a great one! That puts the onus on the collector software/platform to handle their own format(s).  I could also see a path using a direct conversion script that reads the existing files and restructures records to match Arline's schema, inserting them directly to the OS/ES index.


Removed max_length validation until later review after release

Removed max_length validation until later review after release

@rosskarchner
@kurtw
@richaagarwal

You know what? Nobody gets max_lengths. It's over.

How I imagine @kave doing this. :+1:

@kurtw lmao exactly


Create new docker images and push them to the registry

We need to build new docker images and push them to hub.docker.com.
Maybe we should also evaluate quay.io because prometheus themselves are pushing there too.

Any progress on this ? Where could we find those docker images ?

Nothing so far, sorry. We didn't release anything ourselves yet and that's why we still don't have any docker images.

Looks like the state of master branch is already usable. Even if there plenty of good ideas  / documentation/dashboards/examples to provides like you did on sql_exporter, releasing it would allow users / community to give you feedback ( see the release early, release often paradigm => https://en.wikipedia.org/wiki/Release_early,_release_often).
You could then  build incrementally documentation features with a better feedback loop.
My 2 cents.
Meanwhile is there anything we can do to help you ?

Released 0.3.1. Sorry for the delay.

in short:
Is there now a docker-hub or quai.io repos containing latest builds? ( I couldn't find, nor in the Doc, nor googling)
longer story:
after 1 hour of research to find the 'best' avalable elasticsearch_exporter and up2date public docker images for it, I found >3 exporters (interestingly in 3 diff. major prg-langs java, python and go (this one!) )
but disappointed by not finding either a dockerhub nor quai.io repos that contains the latest builds for this/justwatchcom one.
A quick web search yielded 2 docker-hub repositories of images, coming from 2 different (+diverging) forks of this exporter:

https://hub.docker.com/r/lowstz/elasticsearch_exporter/
https://hub.docker.com/r/echocat/elasticsearch_exporter/

and on quai.io found following image, based on this one, but strangely has latest tag 0.5.0:
https://quay.io/repository/traum-ferienwohnungen/elasticsearch_exporter/image/1dc406bcc9dbe89cf4481a3ae6c411bb58e3ed9c6d1666cf2c9b85df3aac8ba0

We push our builds to justwatch/elasticsearch_expprter. It's linked from the README. We'll try to make this clearer.


Add FAQ: The Office 365 CDN does not support tenants with custom domains

According to the CDN engineering team, tenants with custom domains cannot currently use the Office 365 CDN. I am updating the Office 365 CDN topics to reflect this with a note at the top of the article "Use the Office 365 Content Delivery Network (CDN) with SharePoint Online" (https://review.docs.microsoft.com/en-us/Office365/Enterprise/use-office-365-cdn-with-spo?branch=kvice-cdn). It probably makes sense to add a note about that here as well.

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

ID: 6dc99803-4432-cd7c-4747-0953276298d9
Version Independent ID: 1d7554f1-8b1c-dd3a-18e6-1106ad2b3bcb
Content: Domains FAQ
Content Source: Office365-Admin/setup/domains-faq.md
Service: o365-administration
GitHub Login: @pebaum
Microsoft Alias: pebaum

@officedocsbot assign @mypil

@kelleyvice-msft - Thank you for submitting feedback.
I will get this issue over to the O365ITPro writing team for investigation.
Thank you for reporting and making the docs better. Much appreciated.
I made a note to request the team to update this when the work is complete.

@kelleyvice-msft We have added a note on top of the article via PR https://github.com/MicrosoftDocs/OfficeDocs-O365ITPro/pull/486

@msbemba - Thanks very much!

@officedocsbot reopen

@kelleyvice-msft - I'm reopening this issue since the PR content has not been merged yet. I will close this and notify you as soon as the doc owner approves and merges the content. Thank you.

@kelleyvice-msft - the PR created was closed by the doc owner @pebaum.

@officedocsbot close


Make user info optional

Change-type: minor

Do you think we could remove it completely?
I can confirm it's not used on the device side for any analytics purposes.

done @roman-mazur

@roman-mazur any thoughts on how to trace such changes to the analytics side? (besides looking up the right places manually) Will the holistic-specs framework address this as well?

Hard question @gelbal
I don't have an answer today.

No worries @roman-mazur. I was just curious if you had ideas brewing on that front. Data Lineage is becoming an important concept in the world of analytics during the past years. I don't know of any good tools addressing that need.


Check level up widget to update fishing status

closes #10900
In render method, provide additional check to see if WidgetInfo.LEVEL_UP widget is loaded.

This solution works in all cases whereupon leveling up Fishing does NOT unlock new fish.
In the cases where you do unlock fish, there is a second dialogue describing which new fish you can catch. If you click through the level up dialogue, the fishing status will resolve to "Fishing" as if the second dialogue wasn't there. For other skills (Cooking, Mining) when you unlock something upon leveling up, a widget with groupId DIALOG_SPRITE_GROUP_ID, 193, is loaded, which would enable checking against presence of WidgetInfo.DIALOG_SPRITE to determine if player was in 'unlock new stuff' dialogue. However, when unlocking Fishing, the loaded groupId is 11, which is not assigned to anything in WidgetID.java, and a WidgetInfo.DIALOG_SPRITE widget is never present while leveling up Fishing.
If this solution isn't satisfactory, I can provide an additional check against the player's animationId versus an immutable set of all fishing animations, which would work, but it's just a little heavy-handed.
Brandt

This is probably the wrong way to approach the problem since any interface will stall the fishing, not just level up. I would either not fix it or make it also timeout if the fishing anim hasn't played recently.

Updated to check if current animation is fishing

Has someone tested with this all of the fishing spots? I know when we tried something similar with MLM the mining anim there actually stops for a time when you are still mining

Also the set of anims the idle notifier acts on is different, does that matter?
			case FISHING_CRUSHING_INFERNAL_EELS:
			case FISHING_CUTTING_SACRED_EELS:
			case FISHING_BIG_NET:
			case FISHING_NET:
			case FISHING_POLE_CAST:
			case FISHING_CAGE:
			case FISHING_HARPOON:
			case FISHING_BARBTAIL_HARPOON:
			case FISHING_DRAGON_HARPOON:
			case FISHING_INFERNAL_HARPOON:
			case FISHING_CRYSTAL_HARPOON:
			case FISHING_OILY_ROD:
			case FISHING_KARAMBWAN:
			case FISHING_BAREHAND:

The idle notifier has some animations which aren't actually fishing animations. (crushing infernal eels, cutting sacred eels)


Configure Azure Pipelines

This pipeline configuration builds the application and produces a build for the Release configuration.

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


Ollie: Watch 01329 609 260

Ollie requests the watch of the watch_number 01329 609 260. See the MS search here and the Stack Exchange search in text, in URLs, and in code.

Approved by Spevacus in Charcoal HQ


Wiki - add considerations for managing LZs for Terraform

Overview/Summary
Add a page describing considerations when using Terraform to manage landing zones.
Specifically use of deny subnet without NSG policies as well as use of DINE/modify effects on LZs managed by Terraform.
Created as draft for review
As part of this Pull Request I have

[x] Checked for duplicate Pull Requests
[ ] Associated it with relevant issues, for tracking and closure.
[x] Ensured my code/branch is up-to-date with the latest changes in the main branch
[ ] Performed testing and provided evidence.
[x] Updated relevant and associated documentation.
[ ] Updated the "What's New?" wiki page (located in the Enterprise-Scale repo in the directory: /docs/wiki/whats-new.md)

@krowlandson @jtracey93 I think this info is useful to document, is here the right place?


single char with single quotes

Hello.
Prettier autoformats '/' to "/".
It make more sens for me than single char should have single quotes.
How to control when using single quotes or double quotes?.
Thank you for your help

There is an option for strings singleQuote:boolean
But if I understand correctly you would like to have something like:
const URI = "root" + '/' + "path"

There are no options to do so. It seems to me eslint has no such options either.
IMHO this is misleading as there is no char type in javascript. They all have the same type (string)

There might be confusing with the Java programming language where '/' is a char and "/" is a string (array of chars). But like @CiGit said in JavaScript they are all string types.

ok thank you for the explanation


Error installing RealmSwift

Realm framework version: ???
Realm Object Server version: ???
Xcode version: 12.0
iOS/OSX version: OS X 11.0 Beta BigSur
Dependency manager + version: 1.9.3
When running pod install getting the issue:
[!] Error installing RealmSwift
[!] Failed to download 'RealmSwift': [!] /usr/bin/git -C /var/folders/12/gkl91qgs1wz7731nbbvf3f9w0000gn/T/d20200925-2721-mas67c submodule update --init --recursive
Submodule path 'Realm/ObjectStore': checked out 'e29b5515df8b8adfe2454424b78878bb63879307'
Submodule 'Realm/ObjectStore' (https://github.com/realm/realm-object-store.git) registered for path 'Realm/ObjectStore'
Cloning into '/private/var/folders/12/gkl91qgs1wz7731nbbvf3f9w0000gn/T/d20200925-2721-mas67c/Realm/ObjectStore'...
Submodule 'external/catch' (https://github.com/catchorg/Catch2) registered for path 'Realm/ObjectStore/external/catch'
Cloning into '/private/var/folders/12/gkl91qgs1wz7731nbbvf3f9w0000gn/T/d20200925-2721-mas67c/Realm/ObjectStore/external/catch'...
error: RPC failed; curl 18 transfer closed with outstanding read data remaining
fatal: the remote end hung up unexpectedly
fatal: clone of 'https://github.com/catchorg/Catch2' into submodule path '/private/var/folders/12/gkl91qgs1wz7731nbbvf3f9w0000gn/T/d20200925-2721-mas67c/Realm/ObjectStore/external/catch' failed
Failed to clone 'external/catch'. Retry scheduled
Cloning into '/private/var/folders/12/gkl91qgs1wz7731nbbvf3f9w0000gn/T/d20200925-2721-mas67c/Realm/ObjectStore/external/catch'...
error: RPC failed; curl 18 transfer closed with outstanding read data remaining
fatal: the remote end hung up unexpectedly
fatal: clone of 'https://github.com/catchorg/Catch2' into submodule path '/private/var/folders/12/gkl91qgs1wz7731nbbvf3f9w0000gn/T/d20200925-2721-mas67c/Realm/ObjectStore/external/catch' failed
Failed to clone 'external/catch' a second time, aborting
Failed to recurse into submodule path 'Realm/ObjectStore'

Same error is raised when installing using Xcode 12 and SwiftPM

Same error when installing using Xcode 11.7 and SwiftPM.

Facing the same issue with Xcode 12 GM and SwiftPM

The catch folder is empty in Realm's resolved dependencies. If you download catch (https://github.com/catchorg/Catch2) and copy the contents of the single_include/catch2 folder it will work, but this is REALLY BAD

Same error with Xcode 12.0.1 (12A7300). Deleting the derived data folder and changing the global git http.postBuffer size did not fixed the problem.

This is a strange one. We had the same issue, and could reproduce the error both in Carthage and SwiftPM!
It looks to be an issue during the "git submodule update -v --init --recursive", were we get a "RPC failed; curl 18 transfer closed with outstanding read data remaining" error. This issue have been seen before with large repos. Not sure who to "blame" here but I do actually not think this is a bug in Realm!
The most common suggestion to solve this to do a shallow clone, which is not possible in these cases.
But another suggestion is to use SSH instead of HTTPS! So what we did to solve it (as a temporary fix) was to change all git commands from HTTPS to SSH by adding the following to the global git config!
git config --global url."git@github.com:".insteadOf https://github.com/
This will force git to use SSH instead of HTTPS for GitHub, and that resolved the issue for us.
Remember to remove this config again later, to avoid possible problems later. Do not see this as a permanent fix 😉

same error on pod 'Realm'

git config --global url."git@github.com:".insteadOf https://github.com/

Thanks @mir-dawn! I was able to install Realm using SwiftPM althought I had to tweak the command a bit to avoid breaking installation of other dependencies:
git config --global url."git@github.com:catchorg/Catch2".insteadOf https://github.com/catchorg/Catch2

git config --global url."git@github.com:".insteadOf https://github.com/

Thanks @mir-dawn! I was able to install Realm using SwiftPM althought I had to tweak the command a bit to avoid breaking installation of other dependencies:
git config --global url."git@github.com:catchorg/Catch2".insteadOf https://github.com/catchorg/Catch2

Hello! I tried this, but get errors:

[!] Error installing Realm
[!] /usr/bin/git -C /var/folders/6f/yw_vww5s7zl_s_kscnx25f6h0000gn/T/d20200925-55137-1pndacv submodule update --init --recursive

Submodule path 'Realm/ObjectStore': checked out '7ad03b857ddc0ef29779caeb93ad5a6d9cef44af'
Submodule 'Realm/ObjectStore' (https://github.com/realm/realm-object-store.git) registered for path 'Realm/ObjectStore'
Cloning into '/private/var/folders/6f/yw_vww5s7zl_s_kscnx25f6h0000gn/T/d20200925-55137-1pndacv/Realm/ObjectStore'...
Submodule 'external/catch' (https://github.com/catchorg/Catch2) registered for path 'Realm/ObjectStore/external/catch'
Cloning into '/private/var/folders/6f/yw_vww5s7zl_s_kscnx25f6h0000gn/T/d20200925-55137-1pndacv/Realm/ObjectStore/external/catch'...
<EMAIL_ADDRESS>Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
fatal: clone of 'https://github.com/catchorg/Catch2' into submodule path '/private/var/folders/6f/yw_vww5s7zl_s_kscnx25f6h0000gn/T/d20200925-55137-1pndacv/Realm/ObjectStore/external/catch' failed
Failed to clone 'external/catch'. Retry scheduled
Cloning into '/private/var/folders/6f/yw_vww5s7zl_s_kscnx25f6h0000gn/T/d20200925-55137-1pndacv/Realm/ObjectStore/external/catch'...
<EMAIL_ADDRESS>Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
fatal: clone of 'https://github.com/catchorg/Catch2' into submodule path '/private/var/folders/6f/yw_vww5s7zl_s_kscnx25f6h0000gn/T/d20200925-55137-1pndacv/Realm/ObjectStore/external/catch' failed
Failed to clone 'external/catch' a second time, aborting
Failed to recurse into submodule path 'Realm/ObjectStore'

@eofs Cool, this is maybe a better approach! I tested the other with Carthage and SwiftPM in the terminal, and there they worked. But I can see that they do not work in Xcode 12, But you approach do! :)

@MeGaPk looks like you are missing a SSH key.
https://docs.github.com/en/github/authenticating-to-github/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent

Hello! I tried this, but get errors:
<EMAIL_ADDRESS>Permission denied (publickey).
fatal: Could not read from remote repository.

You need to generate necessary keys and setup your GitHub account for SSH access. See following documentation how to set it up: https://docs.github.com/en/github/authenticating-to-github/connecting-to-github-with-ssh

@MeGaPk looks like you are missing a SSH key.
https://docs.github.com/en/github/authenticating-to-github/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent

Hello! I tried this, but get errors:
<EMAIL_ADDRESS>Permission denied (publickey).
fatal: Could not read from remote repository.

You need to generate necessary keys and setup your GitHub account for SSH access. See following documentation how to set it up: https://docs.github.com/en/github/authenticating-to-github/connecting-to-github-with-ssh

thanks it works now

Thanks @mir-dawn! I was able to install Realm using SwiftPM althought I had to tweak the command a bit to avoid breaking installation of other dependencies:
git config --global url."git@github.com:catchorg/Catch2".insteadOf https://github.com/catchorg/Catch2

I'm getting this error now
`[!] /bin/bash -c
set -e
sh build.sh cocoapods-setup
core is not a symlink. Deleting...
Downloading dependency: sync 4.9.0 from https://static.realm.io/downloads/sync/realm-sync-cocoa-4.9.0.tar.xz
mv: rename core to sync-4.9.0/core: Directory not empty`

Thanks @mir-dawn! I was able to install Realm using SwiftPM althought I had to tweak the command a bit to avoid breaking installation of other dependencies:
git config --global url."git@github.com:catchorg/Catch2".insteadOf https://github.com/catchorg/Catch2

I'm getting this error now
set -e
sh build.sh cocoapods-setup

core is not a symlink. Deleting...
Downloading dependency: sync 4.9.0 from https://static.realm.io/downloads/sync/realm-sync-cocoa-4.9.0.tar.xz
mv: rename core to sync-4.9.0/core: Directory not empty

try rm -fr ~/.cocoapods maybe will help

After generating and adding ssh, works even without git config --global url."git@github.com:catchorg/Catch2".insteadOf https://github.com/catchorg/Catch2.

Facing the same problem using xcode 12 + SPM with Realm v4.x.x (latest v4).
Not being able to use ssh (continuous integration over a server with not enough ssh rights), this still remains an issue.
I hope the Realm team can fix this quickly 🤞

From the documentation:
If you’re using Xcode 12, add the following to your Podfile:
Copy to clipboardpost_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['EXCLUDED_ARCHS[sdk=iphonesimulator*]'] = 'arm64'
end
end
end
This is a temporary workaround for until CocoaPods 1.10 is released.

From the documentation:
If you’re using Xcode 12, add the following to your Podfile:
Copy to clipboardpost_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['EXCLUDED_ARCHS[sdk=iphonesimulator*]'] = 'arm64'
end
end
end
This is a temporary workaround for until CocoaPods 1.10 is released.

It doesn't solve the problem

@MeGaPk
Thanks for response, this helped me!
https://github.com/realm/realm-cocoa/issues/6285#issuecomment-538560001

I installed the previous version:
pod 'RealmSwift', '~> 5.4.0'

I installed the previous version:
pod 'RealmSwift', '~> 5.4.0'

i tried to install 4.3.0 but have same error

git config --global url."git@github.com:".insteadOf https://github.com/

Thanks @mir-dawn! I was able to install Realm using SwiftPM althought I had to tweak the command a bit to avoid breaking installation of other dependencies:
git config --global url."git@github.com:catchorg/Catch2".insteadOf https://github.com/catchorg/Catch2

I've tried replacing the url but I am getting this error
Showing Recent Messages terminated(1): HOME=/Users/heshamkalil TMPDIR=/var/folders/p6/2fh359351hxcd0xjlq7w9c5w0000gp/T/ GIT_SSH_COMMAND=ssh -oBatchMode=yes __CF_USER_TEXT_ENCODING=0x1F6:0x0:0x2 XPC_FLAGS=0x0 PATH=/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin XPC_SERVICE_NAME=com.apple.dt.Xcode.31968 GIT_TERMINAL_PROMPT=0 SHELL=/bin/zsh CA_DEBUG_TRANSACTIONS=1 USER=heshamkalil SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.sXI8yidakz/Listeners LOGNAME=heshamkalil MallocNanoZone=0 LD_LIBRARY_PATH=/Applications/Xcode.app/Contents/Developer/../SharedFrameworks/ CA_ASSERT_MAIN_THREAD_TRANSACTIONS=1 /Applications/Xcode.app/Contents/Developer/usr/bin/git -C /Users/heshamkalil/Library/Developer/Xcode/DerivedData/Selfapy-iOS-cqrotptjafzmhgbbxctbyabjesux/SourcePackages/checkouts/realm-cocoa submodule update --init --recursive output:
I've tried deleting the DerivedData, also deleting realm and downloading it again but nothing helped out.
I am on Xcode 12 and using SPM.

@MohammedBadr20s you can do it through this command
git config --global --unset url."git@github.com:".insteadOf https://github.com/
or you can try git config --global --edit to edit your global git config and delete it manually.

Does anyone care in this company, that we need to work with this crap???

We do not have the power to fix github's server issues.

We are looking into this issue– it seems to have to do with Catch. One user as provided a workaround. Xcode 12 has come with a number of issues that we are working to solve.

I am just wondering if this would be a GitHub server issue than why RealmSwift is the only library that I cannot install. Every other (around 20 different one) GitHub hosted/related libraries are loading without any problem. Please make some usable solution here, because the git config --global url."git@github.com:catchorg/Catch2".insteadOf https://github.com/catchorg/Catch2 patch is not working. Thanks!

It's back 🎉🎉🎉🎉🎉

I agree with @Kalzem. The issue looks to be resolved. I do not see any changes in the projects, so I still believe it was a GitHub issue. Anyone know if anything has changed?

Closing as this is Github related & also looks to be resolved.

I found another work around if you use the instructions at https://github.com/realm/realm-cocoa#building-realm. If you tell git to use protocol version 2 it doesn't fail when checking out the Catch2 submodule.
git -c protocol.version=2 submodule update --init --recursive

I'm not sure how to do the same thing with carthage (which had the same error according to https://github.com/realm/realm-cocoa/issues/6807) without updating that project so I opened https://github.com/Carthage/Carthage/pull/3062.

Next steps
After several days of trying I still haven't been able to replicate the problem we see in garage/prod in my development environment. The strongest lead we have is https://github.com/github/babeld/issues/962#issuecomment-701607648, that Apple compiles git with their own crypto library and we're not handling some edge case in how data gets chunked up.
Here's what we know right now:

We can replicate the bug with this one liner: rm -rf realm-cocoa && /usr/bin/git clone https://garage.github.com/jonmagic/realm-cocoa && cd realm-cocoa && /usr/bin/git -cprotocol.version=2 submodule update -f --init --recursive && cd .. where /usr/bin/git is the version of git Apple ships with MacOS. In my case that would be git version 2.24.3 (Apple Git-128)
This only occurs when the submodules are configured to use the http protocol
The bug goes away if we specify protocol v2: /usr/bin/git -c protocol.version=2
We haven't been able to replicate in development even when we put babeld behind an https reverse proxy
Only one customer wrote in to complain about the issue (and I went ahead and commented on their repo with an alternate fix https://github.com/realm/realm-cocoa/issues/6806#issuecomment-702448003 in case we decide to push forward without fixing)

I'm at the point where I need help:

Improving my debugging abilities, which likely means getting access to more parts of the stack, namely the git daemon that babeld talks to.
More pairing time.

Alternatively, we could start ramping the feature back up as is and actively work with customers that experience this edge case to update their git commands to use protocol v2, or recommend they try the ssh protocol.
@iageoghe your thoughts?

Apologies for the comment I left that was supposed to be on an internal debugging thread at github 🙏  I've deleted my comment here and I apologize for any confusion.


GLTF Loading

We must ensure that all processing heavy logic runs on the background thread

https://pixel.engineer/posts/gltfast-parallel-jobs/

If necessary find and isolate pieces that can run on the main thread only
Evaluate if we can reuse ECS Logic for the loading itself
The loaded asset (root?) must end up in the ECS component so it can be caught up by the Optimization/LOD systems

"UNITY_JOBS" makes GLTF use "IJobParallelForBatch", this interface is defined in "com. unity.collections" 2.x


De-crufting the build directory

I assume there is a better way to do this, but I don't like how the /prod directory gets filled with unnecessary/unlinked JS files after running the build script. This pull request overcomes that by putting all of the clientside JS (other than the tests) in a single /public directory---I assume this is actually against your plans, but I thought I'd open a pull request to see if you knew an alternative way to prevent the build script from crufting things up.

This PR seems pretty stale. Closing it out.


docs: fix typo in README.md

Thank you for all your hard work on this project.
I found a typo in README.md and corrected craete to create.

Thx!


Setup full configuration, each config could be setup from environment

Mostly is update the gRPC client configuration

I remember you used to add k8s service discovery, do I remember wrongly or something?

OK, then, please make the config more clear about how to activate k8s upstream service discovery.


Allow @link to reference objects in other files

In @type (and other type defining tags) it's possible to reference external JS objects by using import("./relative/path").objectName.
This should also be possible in @link both to avoid importing unexecuted code, and to avoid errors in common tools & frameworks regarding the unused imports.
Input code
/**
 * @see {@link import("./file.js").objectName} this thing may be of interest for reasons
 */
/* ... */

Expected behavior
The @link inline tag should provide a reference to the exported objectName in ./file.js
Current behavior
The @link tag does not provide any reference, and (at least when using VSCode to render) shows up as the plaintext import("./file.js").objectName instead of a clickable link
Your environment

Software
Version

JSDoc
(supplied with VSCode 1.67)

Node.js
18.2.0

npm
8.9.0

Operating system
Linux (Pop OS 21.10)

Why this functionality matters
I use TypeScript for pretty much everything I write at this point. I want my JS output to be the absolute minimum it needs to be, because my DTS will do all the in-editor documentation; I set removeComments = true for JS and = false for DTS.
However, because I have to import the objects I want to reference in @link, and because TypeScript is "helpful" and treeshakes unused imports, they've been removed by the time my DTS files are generated with JSDoc preserved. However, this now means that my @link tags no longer work.
There is a TypeScript issue to add support for @link targets being treated as "used" values, however it could be useful in many cases for JSDoc to support the import(file).member syntax in @link as well as TypeScript fixing it's own behavior.

If this is supposed to be possible, and is just VSCode not rendering JSDoc correctly, let me know and I'll bring up this issue over there instead

bump?

I have the same problem.


feat(productTypesExport): Export boolean values as a true/false strings

Summary
Resolves #18

Tests

[x] Unit
[ ] Integration
[ ] Acceptance

[x] Documentation

Codecov Report

Merging #20 into master will not change coverage.
The diff coverage is 100%.

@@          Coverage Diff          @@
##           master    #20   +/-   ##
=====================================
  Coverage     100%   100%
=====================================
  Files           3      3
  Lines         238    239    +1
=====================================
+ Hits          238    239    +1

Impacted Files
Coverage Δ

src/io/writer.js
100% <100%> (ø)
:arrow_up:

Continue to review full report at Codecov.

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


Static extensions do not extend to values in anonymous data structures.

Just a TODO for myself.

Good because I don't understand what you mean.

Is this true? I mean static extensions could be used on any kind of type right? Interfaces, typedefs, primitives, even anons? As long as the first argument  of the static function has that type?

@markknol it didn't work when I tried using it on a field within an anonymous data structure:
anon.stringfield.staticMethod();

The staticMethod declared a string parameter and I checked the anon.stringfield type before attempting to access it.

Can you make an example of that? I wonder if it's a bug or something that should be documented.

@markknol Here you go:
using Test.IntExtender;
import haxe.Json;

class IntExtender {
  static public function triple(i:Int) {
    return i * 3;
  }
}

class Test {
  static public function main() {
      var json = {
        'value': 10
    };
    var anon = Json.parse(Json.stringify(json));
      trace(anon.value); //10
    trace(anon.value.triple()); //Uncaught TypeError: anon.value.triple is not a function,
  }
}

Just creating an anonymous structure isn't enough, I suspect that the compiler is annotating type information. Haxe could inspect anonymous structures as they are passed but you would still have to worry about external manipulation of the anonymous structure.

That behavior is already documented here http://haxe.org/manual/types-dynamic.html

Indeed

I have expertise in technical documentation and we know that people don't read documentation as if it were a book.   They spend ~5 minutes looking for a sections they think is most relevant to the issue at hand.   I spent a few minutes Googling and found the page on static extensions which is where I assumed I would find an answer.  That's a survey sample size of one, but I see no problem with adding a cross reference in this section.
Furthermore, the section on static extensions is factually incorrect:

There are three requirements for this:

Both the literal 12 and the first argument of triple are of type Int.
The class IntExtender is brought into context through using Main.IntExtender.
Int does not have a triple field by itself (if it had, that field would take priority over the static extension).

I specifically tested an anonymous field's type before attempting to use a static extension and it failed.
Finally, please do not close my tickets without soliciting my input.

I don't see a problem in the static extension part of the manual.
What you seem to be missing is that you are working with a Dynamic in your example (well, a unknown type because the compiler won't ever unify with a Dynamic without you telling it explicitly) which basically means "hey compiler, I know what I'm doing so don't bug me with your nonsense" and, as far as I can see, you don't really know what you are doing :sweat_smile:

@indolering the problem in that try.haxe.org example is not with static extensions, but with the fact that Json.parse returns Dynamic type.

Oh, @mrcdk was faster.

Here is how I would solve the problem on your example http://try.haxe.org/#0D9fe As you can see, you have to tell the compiler that the field is an Int so it can work its magic

sigh You are basically complaining that it's users who don't understand the typing system.  God forbid the documentation spends a few lines trying to help users understand when a static extension won't work.

¯\_(ツ)_/¯

¯_(ツ)_/¯

I consider myself an A-grade usability engineer but a C-grade programmer.  The fact that I'm not very good at programming is a valuable asset because I can provide a different perspective.  I have a different skillset that I'm trying to use to make your documentation better.
But insulting me and shutting down my tickets?

I'm not sure about the whole "insulting" thing, but this particular issue is plain wrong (just look at its title) and is therefore closed as there's nothing to do here.
If you think there's something to be documented to make people not make that mistake you did, that should go to section about Dynamic anyway, but there's already this statement that explains the reason perfectly IMO:

The compiler can no longer type-check assignments, function calls and other constructs where specific types are expected.

How about changing

Both the literal 12 and the first argument of triple are of type Int.

slightly so that it reminds the user that types are a compile time thing and that there are rules to type inference:

Both the literal 12 and the first argument of triple are known to be of type Int?

You are basically complaining that it's users who don't understand the typing system. God forbid the documentation spends a few lines trying to help users understand when a static extension won't work.

The issue is how to achieve this friendless without restating everywhere all the user should know about the type system.  Yes, many users just skip to a particular section, but the assumption that this behaviour should yield an equally precise understanding of how the language works is absurd.
Actually, if every section just restated all the context to it, readers would then shift to skipping to subsections they perceived most relevant...

But insulting me and shutting down my tickets?

The end read "Fuck this community" originally.  Please don't do act like that.
Yes, it would be marginally more polite and desirable to check if your problem had been solved before closing the issue.  On the other hand, static extensions DO work with values in anonymous data structures, and the manual does not suggest otherwise; everything after your misconception has been explained is a discussion to see how could we prevent it from happening again in the future.

Both the literal 12 and the first argument of triple are known to be of type Int

This is a nice change IMO, we should add it

Thanks for this addition!

The end read "Fuck this community" originally. Please don't do act like that.

I changed that immediately because it was too harsh, but that's exactly how I felt.

slightly so that it reminds the user that types are a compile time thing and that there are rules to type inference:

That's where this ticket was headed from the beginning except that I wrote "anonymous" instead of "dynamic".

Both the literal 12 and the first argument of triple are known to be of type Int

But in my case I actually checked the type of the field at runtime, so it has to be known at compile time.

How it "has to" be known at compile time if you're dealing with result of String->Dynamic function which is Json.parse? The type of result is bound to a monomorph (unknown type) so static extensions cannot be applied.

I don't really like the wording of the proposed change, known by whom? the compiler? the runtime? the user?... as we can see, it is still not clear to @indolering. I actually prefer the old version because it doesn't add that uncertainty and specify that both, 12 and the first argument of triple(), have to be typed as Int.
Now, @indolering. Static extensions are a compile-time feature, they will do their magic at compile time and not at runtime. This means that, even if you are sure that the runtime type of the anon.value is Int if the compiler can't infer it by you explicitly telling it that the type is Int or by itself, static extensions won't work. The compiler will check the type of anon.value but it will find that it's unknown so it won't apply the static extension magic.
Why the compiler can infer the type of anon.value to Int? Well, the type of anom.value is unknown to the compiler because Dynamic is in the middle of your example by the use of Json.parse() http://api.haxe.org/haxe/Json.html#parse (Notice how the function returns a Dynamic) As we know, from the first link I posted ( http://haxe.org/manual/types-dynamic.html ), Dynamic is a special type. As I posted before, Dynamic is telling the compiler: "hey compiler, I (the developer) know what I'm doing so don't bug me with your nonsense" so the compiler won't apply any optimization, won't check the type, won't catch typos at compile time,...
Also, you aren't checking the type at runtime, you are checking the value which really doesn't tell anything about the type. In your example it can be an Int or a Float or even a String just printing the value isn't enough.
The issue was closed without your input because what you stated in the title and the body of it isn't true. You found a "special case" without really understanding the special part of the case. The "special case" is, of course, the usage of Dynamic. If we have to warn the reader that Dynamic has unexpected results when using it with static extensions, we may as well add a huge header on every section of the manual with that warning because, yes, if you use Dynamic with anything else in the language you will have unexpected results and problems at runtime if you aren't careful.

I don't really like the wording of the proposed change, known by whom? the compiler? the runtime? the user?

@mrcdk I was having second thoughts myself, "known to be of type Int" is indeed too vague.
The original wording from the manual is quite precise, but assumes an attentive reader that  remembers how the Haxe type system works; even more, a reader that has some experience with typed languages and that does understand the word "type" as a compile time thing.
So...  I still think it's valid to leave some breadcrumbs around that remind users other than these to read (or at least think about) what "is of type Int" means.  Perhaps something like:

Both the literal 12 and the first argument of triple are known by the compiler to be of type Int.

In fact, I think the manual already employs similar constructions in other places to remind readers of possible difficulties.
In my opinion, if we can find a simple change that @indolering thinks could have prevented his confusion, it would be nice to add it.

Hey, I wanted to apologize for my language and abrasive attitude.  I'll get back to contributing once the docs have been converted to markdown.

Oh, that reminds me we should actually do that :)


[Feature Request] Generate normal-mapped sprites

Hello!
Currently I'm working on a 2d fixed-viewpoint isometric project and some months ago had been exploring voxels for sprite-based characters.  I found spotvox and bookmarked it because it looked really helpful for exporting 2d, but forgot about it after attempting to import and render voxels at runtime instead.  Since my 3d knowledge and experience is extremely limited, I would still very much like to use baked 2d images for sprite data, and in that time I noticed some much-appreciated added functionality to generate angles and turntables for voxel art added to spotvox.
In my engine, I have been testing using normal mapped tiles to simulate realtime lighting.  I was also able to extend this to voxel models by having a render pass with a shader that displayed faces based on their normal.  The result was somewhat blocky due to how a voxel is represented in-engine, but mitigated with a cheap smoothing technique (rendering at slightly higher resolution and then scaling down):

My request is that I would like for a slightly better option if spotvox is able to support it -- One-to-one representation of each voxel as a single color representing the averaged contribution of the visible surface normals when viewed from the camera's position, using whatever scaling technique is currently used by spotvox for upscaled versions to interpolate.  I don't know how voxels are represented internally, so this may not be trivial to implement, but I'm assuming that the result would be much better detailed than my above attempt using any technique other than simply rendering voxels as cubes and shading the individual surface normals.
Really appreciate this tool existing and the work you've put into it, and thanks for reading this whole thing :)
P.S.  Any chance of being able to specify the camera pitch for games using slightly different angles?  (30° dimetric, variants of trimetric and oblique, etc)

This sounds very cool to support, though I really have very little idea what I'm doing with some 3D concepts (still), such as normals. If you have a shader you can share, or just links to how these types of shader are implemented, that would really help, since it would allow me to verify that the normals actually are correct. The example you have looks great currently, so if I can help improve it that would be nice!
Internally, each voxel in the .vox model corresponds to 1 screen pixel, and typically 2 layers of voxels deep are visible at some angles (where the voxels on the surface don't quite cover up the one beneath them). To ensure the interior has a reasonable color, the exterior is "soaked" down into the interior voxels, which isn't a perfect operation at corners. The size where the voxels are drawn unscaled is tiny, so I usually use 2x scale with some simple smoothing on the shapes (forming slopes instead of staircases, etc). The slopes are still made of voxels that get rendered as single pixels, and currently they don't have their own normal data.
The lighting is a whole set of tricks that seem to work reasonably well but aren't exactly based in real physical lighting. There's tracking for which voxels have only open space above them (they can "see the sky"), and also which voxels have only open space along the y-axis (the pink/magenta axis in your lighting gif above). Where a voxel can see the y-axis lighting, it gets some light, where it can see the sky it gets much more light, and where both are lighting a voxel the refraction is used to determine how shiny a small area is (becoming much brighter). Using normals for this would be very powerful, I just haven't figured out how it would work yet.
As for the P.S., that's much more doable in the short term! I'm very happy with how the 1-pixel-per-voxel approach works with alternate camera angles.
I'll try to get the pitch configurable tonight, or soon at least. The normals would have to be a longer-term project, and I might need some help from your side to get the renderer to look as you have it.

This alternate pitch, sort-of, can be produced now. I think other desirable viewing angles can be produced like this. There are some parameters for this. --horizontal-xy is how many pixels apart a single x or y voxel difference makes horizontally. Likewise, --vertical-xy affects how many vertical pixels apart an x or y voxel difference moves the screen pixel. --vertical-z determines how many vertical pixels a z voxel difference moves the screen pixel. The parameters should usually be between 1 and 4, inclusive.

Hi again,
Here's the shader I wrote, in Godot's shader language.  It is close to GLSL, which provides surface normals automatically in 3d vertex shaders:
const float deg30 = 0.26;  //30 degrees

mat3 rotation3dY(float angle) {
  float s = sin(angle);
  float c = cos(angle);

  return mat3(
    vec3(c, 0.0, -s),
    vec3(0.0, 1.0, 0.0),
    vec3(s, 0.0, c)
  );
}
vec3 rotateY(vec3 v, float angle) {
  return rotation3dY(angle) * v;
}

mat4 rotation3d(vec3 axis, float angle) {
  axis = normalize(axis);
  float s = sin(angle);
  float c = cos(angle);
  float oc = 1.0 - c;

  return mat4(
    vec4(oc * axis.x * axis.x + c,           oc * axis.x * axis.y - axis.z * s,  oc * axis.z * axis.x + axis.y * s,  0.0),
    vec4(oc * axis.x * axis.y + axis.z * s,  oc * axis.y * axis.y + c,           oc * axis.y * axis.z - axis.x * s,  0.0),
    vec4(oc * axis.z * axis.x - axis.y * s,  oc * axis.y * axis.z + axis.x * s,  oc * axis.z * axis.z + c,           0.0),
    vec4(0.0,                                0.0,                                0.0,                                1.0)
  );
}

void fragment() {  //The part where pixels get shaded
	vec3 n = NORMAL;
	n = normalize(rotateY(n, deg30));

	ALBEDO = n;
}

The rotation functions are just for rotating the normal vector around to match whatever orientation is necessary, since OpenGL/Vulkan and DirectX have different canonical Up axis and handedness and different game engines handle normal map assets differently as well.
In my use case though, I don't need to do any rotation except to rotate 30 degrees to align the normals with the pitch everything in the 2d part of the game is rendered at, like seen in this example:

As for normal mapping itself, this article really helped me a lot when developing a lighting shader that leveraged normal maps. In my example each voxel is rendered as a cube with 6 surfaces, which means it doesn't really average out when the surface albedo (color basically) is shaded mapping XYZ to RGB.  Instead you get that color flickering and "mostly" the result of the surface most parallel to the screen.
I'm hoping to get output that's closer to the image example above for 2d isometric normal mapping, which seems like it would be easier to calculate, perhaps by estimating angle from a unit sphere to each voxel point, or from the reflection of individual spheres for voxels, or a marching cube wrapped surface or something.  I'm not so sure myself!
Great job so far and thank you for the incredibly fast work on adjusting the pitch angle :)

I'm getting somewhere! I've implemented the Sobel and Scharr operators, which can be used to get from a heightmap (which the program already has internally) to a normal map. I attached 128 standard renders and their corresponding 128 normal maps; I can switch the left-right and up-down directions easily if you need a different set. These normal maps aren't perfect and should probably be blurred before using; they're just a rough draft for now.
normal-map-voxels.zip
The next step is probably to add a mode that does no lighting at all, so the normal maps can handle all of it.

Fascinating example, I didn't think it would be possible to see edge contrast at a depth of 1px for surfaces directly facing the camera!  Do these edge detection methods operate in 3d space?  The effect appears to be convincing on first glance (I haven't tried plugging the output into a lighting renderer yet); the pixel colors seemingly able to reflect at least one axis of the expected normal (I'm observing the brick faces as the character spins).  I'll have to look into how you came to the conclusion to use those methods, if you have any reading material I could take a peek at :)

Sure! I think I got the idea to use Sobel from https://arxiv.org/pdf/2212.09692v1.pdf . The code I loosely based the Sobel operator/filter on is here, https://gamedev.stackexchange.com/questions/165575/calculating-normal-map-from-height-map-using-sobel-operator but I found the Scharr operator worked better https://en.wikipedia.org/wiki/Sobel_operator#Alternative_operators . Getting the normalization right was tricky; it is important to the result though. I have the height map available internally and I can potentially make it available as an option to users; the results look like this:

OK, now I have an option to eliminate the automatic lighting (or increase its intensity, if you want), which might be handy if your lighting is coming purely from the normal map. I've attached 128 un-shaded voxel renders and their (blurred with sigma=1.0, which makes the blur effect fairly strong) normal maps. I hope the normal maps will work as-is, but they might need to be regenerated with a lower sigma. I can generate these in under a minute, so the workflow isn't bad at all.
normal-map-unshaded-voxels.zip

Will the blur be adjustable?  I was curious how it's going to look, so I took both examples you posted and imported and lit them up with 3 strong lights:

Honestly, whatever baked-in shading was done to the "hard" edge copy before applying the normal map looks pretty great, even if the normals in that version have too obvious a look of being passed through an edge detection algo (the embossed looking edges give it away). So, while relying purely on runtime lights is cool and all, I think it looks even better with the softened normal map against the shaded sprites from the first example:

(The left one is the one mixing and matching soft normals with pre-shaded sprites.)
This is looking like it's going to work really well!

Wow, that does look nice! Yes, blur is adjustable already and the strength of shading can be turned up or down, not just on or off. Outlines can also be disabled, which might be good here since I don't know how outlines interact with the normal map (do outlines even have normals?). I think I'll push a release so you can try this, it might be a pre-release while this is still in progress.
Regarding the frame of reference, right now that would be a challenge, but I could rather easily re-enable the roll/pitch/yaw rotation modifiers, so the monster on the green wall would cast a shadow downwards rather than against the wall. I don't know how you want to handle shadows cast on things outside the sprite and its normal map; I've wanted to export shadows separately for a while, but I'm not entirely sure how I would do that.
Also, a thought occurred to me -- you might not need to rotate the normals with these, since a pure-blue normal (pointing directly at the camera) is already pointing up about 30 degrees.
It would be really nice if you could write up the technical side of your lighting/normal system in any level of detail, so other people can make use of the normal maps feature! Anything from a blog post to a link dump would be really helpful.

I don't imagine outlines would have normals, as one of the techniques used to generate them in 3d I know used to be to create a backfaced-hull offset by the desired amount and to disable lighting on those surfaces to get hard edges.  No clue what that would look like if the normal were flipped for those (perhaps a reverse-embossed effect).  Might be worth experimenting with but I imagine if it's not completely unlit, alternatively they might be the color of the vector parallel to the camera (monitor screen).  That might produce something weird too, I don't really know to be honest xD
I use two systems to generate lights for testing purposes currently, the first is Godot 3.x's Light2D system, but that system breaks down due to render order issues when compositing gets too complex, so I also have a custom lighting shader I intended to use for production, which currently works with 1 light and you might be able to play around with in whatever engine you're most comfortable with:
shader_type canvas_item;

uniform bool enabled=true;
uniform sampler2D lightTexture;
uniform vec3 lightSource;
uniform vec4 color : hint_color = vec4(1.0);
uniform float width_ratio : hint_range(0.0, 1.0, 0.05) = 0.5;
uniform bool invert_green;

uniform float specularStrength : hint_range(0.0, 5.0, 0.01);
uniform float energy : hint_range(0.0, 16.0, 0.1) = 1.0;
uniform float attenuation : hint_range(0.1, 32.0, 0.1) = 1.0;

const int DIRECTIONAL_LIGHT = 0;
const int POINT_LIGHT = 1;
const int SPOTLIGHT = 2;

void fragment()
{
	if (enabled){
	//Retreive surface normal
	vec3 n = textureLod(NORMAL_TEXTURE, UV, 0).rgb;
	if(invert_green) n.g = 1.0- n.g;

	//Transform normal vector to range [-1, 1]
	n = normalize(n * 2.0 - 1.0);

	//Normalize the lighting offset from 2d coordinates to ones in shader space
	vec3 ls = lightSource;
	vec2 sz = TEXTURE_PIXEL_SIZE;
	vec2 sz2 = normalize(TEXTURE_PIXEL_SIZE).yx;  //Apply aspect ratio correction for non-square surfaces.
	ls.xy *= sz;
	ls.xy *= sz2;

	//Determine how far UV is from the light source
	vec2 ratio = vec2(1.0-width_ratio, width_ratio) * 2.0;
	float intensity = max(0.0,(1.0-min(pow(distance(UV*sz2,ls.xy * ratio), 1.0/attenuation), 1.0)) * energy);

//	float intensity = 1.0;

	ls.xy -= UV*sz2; //Move the light source relative to the texel being sampled.
	ls.y = -ls.y;  //Flip the coordinate system for Y-axis
	ls.xy *=ratio;
	ls = normalize(ls);

	//Apply lambertian reflection
	float reflectionCoef = dot(n, ls);
	vec3 shadeColor = color.rgb * reflectionCoef * color.a ;

	vec3 specular = shadeColor * pow(max(reflectionCoef, 0.0), 32) * specularStrength;

	COLOR = texture(TEXTURE, UV);
	COLOR.rgb = max(COLOR.rgb, intensity*(specular+shadeColor * COLOR.rgb) + COLOR.rgb);
//	COLOR.rgb = vec3(distance(ls.xy, vec2(0.0)));

	} else /* disabled */ {
		COLOR = texture(TEXTURE,UV);
	}
}

The reason you might want to rotate the normals would be for when the base sprite is rotated at runtime;  The normals in this case would rotate with them but since their colors are precomputed, the lighting would reflect an understanding that the canonical "up" axis in worldspace is also rotated.  So, it wouldn't just be helpful for different types of projection, but also for baking normal maps for sprites that are also expected to be displayed rotated at runtime.

OK, I'm probably understanding some of this wrong, but I re-enabled roll/pitch/yaw rotation options. That can get sprites that look like:

If I rotated it how you had it on the green wall, there would still be soft shadows cast from the implicit light from the left.
I think I will push a pre-release next, so you can play with the different options and tell me what's working and what's completely broken, haha. I'll try to document some common combinations of options here, because I don't want them in the README.md file if the options are likely to change.
-n 0.8 or -n 1.0 seem to both make decent blurs on the normal map. -n 0.5 seems too weak, and looks almost identical to -n 0.0. -n -1.0 will avoid generating a normal map at all (the default).
-R -90 or -P -90 will rotate the model so its base faces against a northwest or northeast wall (not sure which goes against which wall).
--vertical-xy 2 will stretch the projection vertically, so instead of the top of a cube rendering as a wide rhombus, it renders as a 45-degree-rotated square.

If you want to try making some of these renders from your own models, you can try https://github.com/tommyettinger/spotvox/releases/tag/v0.0.7-b1 now. I hope it works!

Thanks!  I'll see if I can give it a shot during the week and will let you know if I run into any issues.

Sorry it took so long to get back to you!  It's not a bad effect to be honest.  Not as convincing when the light needs to be on a lower Y position than the sprite (perhaps calculated height of the light matters), but it looks pretty good.

Left:  Smoothing 0.5,  Right:  Smoothing 1.0

Woah! It looks like you figured out the distort parameters just fine, since you have it spinning from a side view, that's reassuring to me. And the smoothed version looks great from where I'm standing! Like it's still pixel/voxel art, but with advanced 3D lighting. I like how the light color affects the outline color, too. The smoothing looks really good at 1.0, and I wonder if higher values would look better or worse...
If you're intending to delve really deep into the asset production code, it might be worth taking a look at (and maybe forking) Isonomicon, which is what SpotVox is based on, and they share lots of code. I haven't brought over the normal maps yet, but the amount of code that required changes was rather small, and mostly copy+pasting code from other codebases of mine. Isonomicon can render everyday PNGs like SpotVox can, but it can also do some specialized rendering that allows preserving material info in each pixel of an image, and when rendering you can change the color entirely based on the palette and that material. I'm wondering if having the material info would be useful for supporting reflective objects. Materials can use lots of custom properties defined in code in Isonomicon, which I use to do things like make fire transition to smoke over an animation. The normal maps are based entirely on the height map/depth map, so that part should be unchanged between SpotVox and Isonomicon.
Somewhat related, I'm playing Triangle Strategy now on the Switch, and this looks like a higher-detail version of its art. With a lot more rotations, hooray!

Great, I'll close this. Feel free to ask any questions you have here or in Isonomicon's issues; I'll try to bring over the features I added for the purposes of this issue into Isonomicon.
Also, yes, there is a state machine in Isonomicon's materials, but it isn't the only thing they do -- I added a bunch of unusual properties like allowing negative emission (darkening, rather than lighting) and swirling between frames in a loop:

That's an approach that's really heavily targeted at palette swapping sprites to reduce the amount of assets a game needs, and is somewhat unorthodox since you "draw with materials" rather than "draw with colors." If you want your game to have switchable skin, hair, and clothing color for the same base model, this might be useful. It also acts a little like asset obfuscation if someone only has access to the textures pre-shading, since they don't look like they will in the final product.
When you have a demo or something out, I'd be happy to link to it as a "Games Using SpotVox" in a gallery or something on the main README. Cheers!


[Feature] CI/CD Pipeline Should Support Pull-Requests

Is your feature request related to a problem? Please describe.
Currently the CI only support master build, but it should support pull-requests as well.
Describe the solution you'd like
N/A
Describe alternatives you've considered
N/A
Additional context
N/A

Resolved by b4721727e1b70294248214bce2b6de557710ff9c


Suggestion: "Chinese" isn't profane.

alex flags any usage of the word "Chinese" as profane.
I don't think it is, but there is always the chance that I'm wrong.
If it isn't, it is probably best to remove "Chinese" from the profanity list.

Agreed! 👍
I recently included a list of profane words and it’s overly sensitive. I’m currently in the process of rating how big the chance is that those words are or aren’t profane, and adjust messages accordingly.
It’s a lot of work so it will take a while though, thanks for your patience :)

Fair! Is there any way I can help?

Seems I just lost the work ’till now, but the project is here: https://github.com/wooorm/cuss. If you’re interested in helping, fork it, and rate the phrases in data/index.json (0, 1, or 2). See the readme for more info and examples! :)

The message for Chinese is now Be careful with “Chinese”, it’s profane in some cases, which I believe covers several uses of the phrase correctly.


[FEATURE] STEP_6_AVBYTB-3: as a user, I want to view all ads of certain car brand or model

implement /search command, to get ability to find all ads of certain car brand or model and get links to them.
implement /back command, to get ability for return into main menu.
Acceptance criteria:
– /search command working
– /back command working
– displaying links to certain ads

solved in https://github.com/Donyelll/av.by-telegrambot/pull/16


Resolution depends on empty extra

On linux with with uv 0.2.27, the resolution of the pyproject.toml below depends on whether onnx = [] is present. The resolution should be robust to adding or removing empty extras, even more the resolution should not care about empty extras at all.
With onnx:
$ rm -f uv.lock && uv lock --upgrade --preview -v 2> a.txt && wc -l uv.lock && uv lock --preview -v 2>b.txt && wc -l uv.lock
2028 uv.lock
1949 uv.lock

Without onnx:
$ rm -f uv.lock && uv lock --upgrade --preview -v 2> a.txt && wc -l uv.lock && uv lock --preview -v 2>b.txt && wc -l uv.lock
1936 uv.lock
1936 uv.lock

[project]
name = "transformers"
version = "4.39.0.dev0"
description = "State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow"
requires-python = ">=3.9.0"

dependencies = [
  "filelock",
  "huggingface-hub>=0.19.3,<1.0",
  "numpy>=1.17",
  "packaging>=20.0",
  "pyyaml>=5.1",
  "regex!=2019.12.17",
  "requests",
  "tokenizers>=0.14,<0.19",
  "safetensors>=0.4.1",
  "tqdm>=4.27",
]

[project.optional-dependencies]
onnx = []
tf-cpu = [
  "onnxconverter-common",
]
flax = [
  "jaxlib>=0.4.1,<=0.4.13",
  "flax>=0.4.1,<=0.7.0",
  "optax>=0.0.8,<=0.1.4"
]
onnxruntime = ["onnxruntime>=1.4.0", "onnxruntime-tools>=1.4.2"]
ray = ["ray[tune]>=2.7.0"]

deepspeed-testing = [
  "dill<0.3.5",
  "datasets!=2.5.0",
]

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"

What do you mean "depends on"? Just that it varies?

Yes, we get different lockfiles depending on whether empty extra is present or not. No idea why this is happening, i was looking for an MRE for the transformers resolution instability but than found this.

Ok, thanks.


[BUG]

Tasks don't get saved if 2 windows are opened.
To Reproduce 🐣
Steps to reproduce the behavior:

Open 2 separate windows of Dooit and leave one of them on the welcome screen (sometimes it works even if you are not on the welcome screen).
Add a task to the other one.
Close the window that you add the task to first.

Expected behavior  🤔
the task now is not in the other window, when you close it and reopen it the task won't be there either.
Screenshots 🧐

Desktop (please complete the following information):  🤖

OS: Fedora linux
Version 36
Additional context 📝
Kitty terminal emulator

I'm sorry but this will result in complications...
I saw that task-warrior has this functionality but dooit has nested todos/topics which will cause strange behaviour.
Also, Running two instances at a time seems like a very very rare situation.Therefore, I'll not be implementing this feature.

Running two instances is a rare thing but it's often by mistake, I had one opened on another workspace and I forgot about it, so if it's easy to have an indicator that tells you "there's an instance already opened" or something, that will fix the issue

it's easy to have an indicator that tells you "there's an instance already opened" or something

Well that is something i can do i guess... I'll look into it :)


Start article with template -- aimed at JOSS?

JOSS seems to suggest an MD template: https://joss.readthedocs.io/en/latest/submitting.html
Compilation is via a GH action: https://joss.readthedocs.io/en/latest/submitting.html#github-action
Perhaps @mmcky might kick this process off?

This is fixed in #4. To view the draft paper on CI:

Click on Actions tab.
Select the GH action run for commit you want to view.
Scroll at the bottom once the CI passes where you can find paper.zip.


Feature 426

Hi Max,
Adding str() fixed the issue thanks.
Here is the PR for issue #426 with that addition and the method renamed
The created request is almost empty, only method and url are set by default, but everything else can be added using the flow editor.
just let me know if you think more data needs to be precreated.
Regards.
Marcelo

Hey Marcelo,
great work - thanks. Three issues left:

parse_url doesn't throw a ValueError (it probably should, but if we wanted to change that, we shouldn't do it in this PR :wink: )

Traceback (most recent call last):
  File "/media/sf_git/mitmproxy/libmproxy/console/__init__.py", line 628, in run
    self.ui.run_wrapper(self.loop)
  File "/usr/local/lib/python2.7/dist-packages/urwid/raw_display.py", line 268, in run_wrapper
    return fn()
  File "/media/sf_git/mitmproxy/libmproxy/console/__init__.py", line 848, in loop
    self.prompt_execute()
  File "/media/sf_git/mitmproxy/libmproxy/console/__init__.py", line 773, in prompt_execute
    msg = p(txt, *args)
  File "/media/sf_git/mitmproxy/libmproxy/console/flowlist.py", line 269, in new_request
    scheme, host, port, path = http.parse_url(url)
TypeError: 'NoneType' object is not iterable

I think you forgot including ServerConnection and  ClientConnection in this PR. They are strictly mandatory though, i.e. try to Duplicate a artificial flow.
We should keep the phrasing similar to the rest of the ui (see comments)

Thanks!
Max

Excellent. Once the SNI is in, we're done here. :smiley:

Great. :+1:


Add available locales for Gujarati and Punjabi

this adds the iso code gu and pa for supporting translations in those languages.

superseded by #5872


Give 20% Winter Discount

In this feature, the user gets a 20% discount if the season is winter. A photo from unsplash shows below the title Singh Catering Services with the text Winter Season 20% Discount.
The following functions were added in this pull request:
Helper Functions
showDiscountPicture()
Order
findSeason()
giveDiscount()

Documented here: https://github.com/KnowledgeableKangaroo/order.js/wiki/Changelog/_edit#21519


Add link to dashboard from homepage header

Many users dont find a way to access dashboard, we should have a link on the homepage perhaps with Sign up | Log in.

We can have it full screen like that:

@pareshUD do you have the topnav for the homepage?

This a user connected view. We also need the right top nav when the user is not connected please.
Thanks !

What you showed is when a user is already logged in SteemConnect.
We need the design when a new user is coming for the first time for instance. The login button or text

When user is not logged in

Closing this issue it's not relevant for the new version.


Add dartpy

Checklist

[x] Used a personal fork of the feedstock to propose changes
[x] Bumped the build number (if the version is unchanged)
[x] Reset the build number to 0 (if the version changed)
[x] Re-rendered with the latest conda-smithy (Use the phrase @conda-forge-admin, please rerender in a comment in this PR for automated rerendering)
[x] Ensured the license file is being packaged.

Adding dartpy, following these instructions: https://conda-forge.org/docs/maintainer/knowledge_base/#multi-output-recipes

@conda-forge-admin, please rerender

@conda-forge-admin, please rerender

Sorry @jslee02, I was a bit late on this. I guess we need to add a:
     run_exports:
        - {{ pin_subpackage('dartsim-cpp', max_pin='x.x') }}

also to dartsim, or we should change all the recipes that depend on dartsim to depend on dartsim-cpp.

@traversaro Oh, it doesn't get propagated. Thank you for catching that! https://github.com/conda-forge/dartsim-feedstock/pull/93