[Java] Support GraalVM Native Java Build

Is your feature request related to a problem? Please describe.
Java works but compile to native java doesn't work.
Native Java:
https://www.graalvm.org/
Describe the solution you'd like
Add native java support by adding classes that need reflection to meta files.
Additional context
Exception when run in native java.
java.lang.RuntimeException: java.lang.UnsupportedOperationException: java.lang.NoSuchMethodException: java.util.concurrent.ConcurrentSkipListSet.(java.util.Comparator)
at com.aigens.api.TestApi.hello(TestApi.java:85)
at com.aigens.api.TestApi$quarkusrestinvoker$hello_a988a40893ff99606bf40d6c00ea871031f3749c.invoke(Unknown Source)
at org.jboss.resteasy.reactive.server.handlers.InvocationHandler.handle(InvocationHandler.java:29)
at io.quarkus.resteasy.reactive.server.runtime.QuarkusResteasyReactiveRequestContext.invokeHandler(QuarkusResteasyReactiveRequestContext.java:141)
at org.jboss.resteasy.reactive.common.core.AbstractResteasyReactiveContext.run(AbstractResteasyReactiveContext.java:145)
at io.quarkus.vertx.core.runtime.VertxCoreRecorder$14.runWith(VertxCoreRecorder.java:576)
at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2513)
at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1538)
at org.jboss.threads.DelegatingRunnable.run(DelegatingRunnable.java:29)
at org.jboss.threads.ThreadLocalResettingRunnable.run(ThreadLocalResettingRunnable.java:29)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base@17.0.5/java.lang.Thread.run(Thread.java:833)
at com.oracle.svm.core.thread.PlatformThreads.threadStartRoutine(PlatformThreads.java:775)
at com.oracle.svm.core.posix.thread.PosixPlatformThreads.pthreadStartRoutine(PosixPlatformThreads.java:203)
Caused by: java.lang.UnsupportedOperationException: java.lang.NoSuchMethodException: java.util.concurrent.ConcurrentSkipListSet.(java.util.Comparator)
at io.fury.serializer.CollectionSerializers$SortedSetSerializer.(CollectionSerializers.java:521)
at io.fury.serializer.CollectionSerializers$ConcurrentSkipListSetSerializer.(CollectionSerializers.java:707)
at io.fury.serializer.CollectionSerializers.registerDefaultSerializers(CollectionSerializers.java:918)
at io.fury.resolver.ClassResolver.addDefaultSerializers(ClassResolver.java:309)
at io.fury.resolver.ClassResolver.initialize(ClassResolver.java:297)
at io.fury.Fury.(Fury.java:128)

@aigens Thanks for submitting this issue. This is an interesting topic, Fury does not support graalvm yet, maybe we should add support for it, considering it's starting to become popular.
Could you share more details about your solution?

As microservice and serverless getting more popular, people are switching to lighter frameworks that uses less memory and have quicker startup time.
We are switching to native java for higher efficiency. Goal of using native java align very well with what Fury trying to achieve. I believe supporting it will further make Fury more modern and developer friendly.
Framework that we are using that support compiling to native java with Graalvm:
https://quarkus.io
Looking forward to Fury!

@aigens I see, Fury should support graalvm. But I'm not sure whether graalvm can load bytecodes into class dynamically, Fury will generate serializers class dynamically. Graalvm native image seems doesn' support it?

Also we should build reflection table for graalvm too.

Disclaimer: I am a member of the Quarkus team

But I'm not sure whether graalvm can load bytecodes into class dynamically, Fury will generate serializers class dynamically. Graalvm native image seems doesn' support it?

This is not supported in GraalVM (and to the extent of my knowledge, never will be as it is antithetical to the whole closed-world principle that GraalVM is based on).
The typical way something like this would be handled is to have the serializers generated at build time (this is actually what Kotlin serialization does). Depending on what exactly you want to achieve, there  are various ways to do this.
The Quarkus specific way would be to have a Quarkus extension that simply integrates with Fury in order to generate the serializes at build time. Obviously this would require the library to be modular that there exist some SPIs that would be used to determine the classes in need of serialization and a backend part of how to actually write the new bytecode.
An alternative would be to have an annotation processor which has the advantage of being framework agnostic, but also carries the downside of needing a different solution for Kotlin source ode.

Hi @ennerf @geoand thanks for your inputs, it's very valuable.
If I understand right, there are two ways to support native image:

Fury provide a group of annotation and a annotation processor. Then users use annotation to mark their class. The annotation processor will invoke fury jit api to generate Java code. And generate graalvm refection config for those classes and generated serializer. In this way, those class will not be cropped by graal. And Fury can load those classes at runtime.
Fury provide the Java code/bytecode generation api to Quarku. And Fury define a spi to let the users list all classes in need of serialization. Then Quarkus invoke fury at build time to generate serializer code and register instanse of generated serializer into fury?

@geoand Fury supports generate Java code or bytecode. If we generate Java code, will it affect kotlin build?

Generating source code would also be problematic for Kotlin projects AFAIK.
I don't know how important it is for the project to support Kotlin, I am just mentioning it for completeness as we have a lot of Kotlin usage in Quarkus.

@geoand It would be great if fury can integrate with Quarku. Quarkus is an amazing Project Integration with it will make fury reach for more users. And hopefully make Quarkus further faster.
I don't have much graalvm experience. It may take some time before I can start this work.

👍🏼

Generating source code would also be problematic for Kotlin projects AFAIK.
I don't know how important it is for the project to support Kotlin, I am just mentioning it for completeness as we have a lot of Kotlin usage in Quarkus.

Fury will support All common Jvm languages like kotlin/scala/groovy/etc. I believe those languages are supportted now in traditional jdk. Maybe still some optimization such as #765 . So we do need to support kotlin

You can manually generate all the reflection configurations if you first run everything with the graal agent and then compile against that
The problem I am facing is that fury tries to create hidden classes, which are not possible at run time
Initializing fury at build time also doesn't work, as it then tries to do file operations, which are not possible at build time

create hidden classes,

@Ran-Mewo Fury uses MethodHandle to generate lambda to reduce reflection cost for method getter and constructor, is this the place where hidden classes are created? If so, we can fallback to reflection/unsafe for this.
But for initializing fury at build time, I'm not sure whether graal allow us to invoke fury to generate java code at build time.

I suppose so? Due to me seeing the class io.fury.util.unsafe._JDKAccess.makeGetterFunction. And I am not sure wether if graal would allow generating code at build time, but if I had to take a guess, then I think it'd probably allow generating Java code at build time, which the compiler will compile down to native, but everything is locked up at run time and no more new classes are expected to be generated.
Have both of the stacktraces for run time and build time
Initializing at run time:
java.lang.InternalError: com.oracle.svm.core.jdk.UnsupportedFeatureError: Defining hidden classes at runtime is not supported.
	at java.base@17.0.9/java.lang.invoke.InnerClassLambdaMetafactory.generateInnerClass(InnerClassLambdaMetafactory.java:500)
	at java.base@17.0.9/java.lang.invoke.InnerClassLambdaMetafactory.spinInnerClass(InnerClassLambdaMetafactory.java:402)
	at java.base@17.0.9/java.lang.invoke.InnerClassLambdaMetafactory.buildCallSite(InnerClassLambdaMetafactory.java:315)
	at java.base@17.0.9/java.lang.invoke.LambdaMetafactory.metafactory(LambdaMetafactory.java:341)
	at io.fury.util.unsafe._JDKAccess.makeGetterFunction(_JDKAccess.java:283)
	at io.fury.util.function.Functions.makeGetterFunction(Functions.java:84)
	at io.fury.util.function.Functions.makeGetterFunction(Functions.java:71)
	at io.fury.serializer.Serializers.getBuilderFunc(Serializers.java:179)
	at io.fury.serializer.Serializers.access$000(Serializers.java:58)
	at io.fury.serializer.Serializers$AbstractStringBuilderSerializer.<init>(Serializers.java:200)
	at io.fury.serializer.Serializers$StringBuilderSerializer.<init>(Serializers.java:246)
	at io.fury.serializer.Serializers.registerDefaultSerializers(Serializers.java:557)
	at io.fury.resolver.ClassResolver.addDefaultSerializers(ClassResolver.java:324)
	at io.fury.resolver.ClassResolver.initialize(ClassResolver.java:314)
	at io.fury.Fury.<init>(Fury.java:131)
	at io.fury.config.FuryBuilder.newFury(FuryBuilder.java:297)
	at io.fury.config.FuryBuilder.lambda$buildThreadLocalFury$0(FuryBuilder.java:327)
	at io.fury.util.LoaderBinding.setClassLoader(LoaderBinding.java:93)
	at io.fury.util.LoaderBinding.setClassLoader(LoaderBinding.java:65)
	at io.fury.ThreadLocalFury.lambda$new$1(ThreadLocalFury.java:47)
	at java.base@17.0.9/java.lang.ThreadLocal$SuppliedThreadLocal.initialValue(ThreadLocal.java:305)
	at java.base@17.0.9/java.lang.ThreadLocal.setInitialValue(ThreadLocal.java:195)
	at java.base@17.0.9/java.lang.ThreadLocal.get(ThreadLocal.java:172)
	at io.fury.ThreadLocalFury.<init>(ThreadLocalFury.java:53)
	at io.fury.config.FuryBuilder.buildThreadLocalFury(FuryBuilder.java:327)
	at io.fury.config.FuryBuilder.buildThreadSafeFury(FuryBuilder.java:317)
	at me.ran.rumi.serializers.Serializers.<clinit>(Serializers.java:26)

Initializing at build time
Error: No instances of java.io.FilePermission are allowed in the image heap as this class should be initialized at image runtime. Object has been initialized through the following trace:
	at java.io.FilePermission.<init>(FilePermission.java:489)
No instances of java.io.FilePermission are allowed in the image heap as this class should be initialized at image runtime. Object has been initialized through the following trace:

	at sun.net.www.protocol.file.FileURLConnection.getPermission(FileURLConnection.java:234)
	at java.net.URLClassLoader.getPermissions(URLClassLoader.java:725)
	at java.security.SecureClassLoader$1.apply(SecureClassLoader.java:226)
	at java.security.SecureClassLoader$1.apply(SecureClassLoader.java:222)
	at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1740)
	at java.security.SecureClassLoader.getProtectionDomain(SecureClassLoader.java:222)
	at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150)
	at java.net.URLClassLoader.defineClass(URLClassLoader.java:524)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:427)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:421)
	at java.security.AccessController.executePrivileged(AccessController.java:807)
	at java.security.AccessController.doPrivileged(AccessController.java:712)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:420)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:587)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:520)
	at jdk.internal.loader.Loader.loadClass(Loader.java:564)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:520)
	at java.lang.Class.forName0(Unknown Source)
	at java.lang.Class.forName(Class.java:467)
	at com.oracle.svm.hosted.ImageClassLoader.forName(ImageClassLoader.java:307)
	at com.oracle.svm.hosted.ImageClassLoader.forName(ImageClassLoader.java:303)
	at com.oracle.svm.hosted.ImageClassLoader.forName(ImageClassLoader.java:312)
	at com.oracle.svm.hosted.NativeImageClassLoaderSupport$LoadClassHandler.handleClassFileName(NativeImageClassLoaderSupport.java:784)
	at com.oracle.svm.hosted.NativeImageClassLoaderSupport$LoadClassHandler$1.lambda$visitFile$0(NativeImageClassLoaderSupport.java:713)
	at com.oracle.svm.hosted.NativeImageClassLoaderSupport$LoadClassHandler$1$$Lambda$280/0x00000007c0451718.run(Unknown Source)
	at com.oracle.svm.hosted.ImageClassLoader$1.lambda$execute$0(ImageClassLoader.java:94)
	at com.oracle.svm.hosted.ImageClassLoader$1$$Lambda$254/0x00000007c02cfc78.run(Unknown Source)
	at java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1395)
	at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:373)
	at java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1182)
	at java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1655)
	at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1622)
	at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:165)
.  To fix the issue mark java.io.FilePermission for build-time initialization with --initialize-at-build-time=java.io.FilePermission or use the the information from the trace to find the culprit and --initialize-at-run-time=<culprit> to prevent its instantiation.

Detailed message:
Trace: Object was reached by
  reading field java.util.concurrent.ConcurrentHashMap$Node.val of constant
    java.util.concurrent.ConcurrentHashMap$Node@6abb07c: I:\packages\gradle\caches\modules-2\files-2.1\com.google.guava\guava\32.1.2-jre\...
  indexing into array java.util.concurrent.ConcurrentHashMap$Node[]@3715bd62: [Ljava.util.concurrent.ConcurrentHashMap$Node;@3715bd62
  reading field java.util.concurrent.ConcurrentHashMap.table of constant
    java.util.concurrent.ConcurrentHashMap@7e665f2: {I:\packages\gradle\caches\modules-2\files-2.1\com.google.guava\guava\32.1.2-jre...
  reading field java.io.FilePermissionCollection.perms of constant
    java.io.FilePermissionCollection@512c1a76: java.io.FilePermissionCollection@512c1a76 (
 ("java.io.FilePermission" "I:\packa...
  reading field java.util.concurrent.ConcurrentHashMap$Node.val of constant
    java.util.concurrent.ConcurrentHashMap$Node@7728c4f8: class java.io.FilePermission=java.io.FilePermissionCollection@512c1a76 (
 ("java...
  indexing into array java.util.concurrent.ConcurrentHashMap$Node[]@75d8a377: [Ljava.util.concurrent.ConcurrentHashMap$Node;@75d8a377
  reading field java.util.concurrent.ConcurrentHashMap.table of constant
    java.util.concurrent.ConcurrentHashMap@63d6a948: {class java.io.FilePermission=java.io.FilePermissionCollection@512c1a76 (
 ("jav...
  reading field java.security.Permissions.permsMap of constant
    java.security.Permissions@37f22a09: java.security.Permissions@37f22a09 (
 ("java.io.FilePermission" "I:\packages\gra...
  reading field java.security.ProtectionDomain.permissions of constant
    java.security.ProtectionDomain@10178780: ProtectionDomain  (file:/I:/packages/gradle/caches/modules-2/files-2.1/com.googl...
  reading field java.lang.invoke.MethodHandles$Lookup.cachedProtectionDomain of constant
    java.lang.invoke.MethodHandles$Lookup@25de25ca: /trusted
  reading field java.util.concurrent.ConcurrentHashMap$Node.val of constant
    java.util.concurrent.ConcurrentHashMap$Node@157b751e: class com.google.common.collect.ImmutableMap$Builder=/trusted
  reading field java.util.concurrent.ConcurrentHashMap$Node.next of constant
    java.util.concurrent.ConcurrentHashMap$Node@5c07a258: interface java.util.List=/trusted
  indexing into array java.util.concurrent.ConcurrentHashMap$Node[]@d0642f2: [Ljava.util.concurrent.ConcurrentHashMap$Node;@d0642f2
  reading field java.util.concurrent.ConcurrentHashMap.table of constant
    java.util.concurrent.ConcurrentHashMap@51100a93: {class java.util.ImmutableCollections$Map1=/trusted, class com.google.common.col...
  reading field java.lang.ClassValue.values of constant
    io.fury.util.unsafe._JDKAccess$1@1d2bbf7d: io.fury.util.unsafe._JDKAccess$1@1d2bbf7d
  scanning root io.fury.util.unsafe._JDKAccess$1@1d2bbf7d: io.fury.util.unsafe._JDKAccess$1@1d2bbf7d embedded in
    io.fury.util.unsafe._JDKAccess._trustedLookup(_JDKAccess.java:105)
  parsing method io.fury.util.unsafe._JDKAccess._trustedLookup(_JDKAccess.java:105) reachable via the parsing context
    at io.fury.util.ReflectionUtils.getCtrHandle(ReflectionUtils.java:127)
    at io.fury.serializer.MapSerializers$SortedMapSerializer.<init>(MapSerializers.java:849)
    at com.oracle.svm.core.code.FactoryMethodHolder.MapSerializers$ConcurrentSkipListMapSerializer_constructor_95ea8caa5afeea9f9ba7929729219556d4305e3b(generated:0)
    at io.fury.serializer.MapSerializers.registerDefaultSerializers(MapSerializers.java:1109)
    at io.fury.resolver.ClassResolver.addDefaultSerializers(ClassResolver.java:328)
    at io.fury.resolver.ClassResolver.initialize(ClassResolver.java:314)
    at io.fury.Fury.<init>(Fury.java:131)
    at com.oracle.svm.core.code.FactoryMethodHolder.Fury_constructor_8d9383daf664f347d2d9fc4d58d7bb75b66b39f7(generated:0)
    at io.fury.config.FuryBuilder.newFury(FuryBuilder.java:297)
    at io.fury.config.FuryBuilder$$Lambda$325/0x00000007c1997258.apply(Unknown Source)
    at io.fury.util.LoaderBinding.setClassLoader(LoaderBinding.java:104)
    at io.fury.ThreadLocalFury.lambda$new$1(ThreadLocalFury.java:47)
    at io.fury.ThreadLocalFury$$Lambda$327/0x00000007c19976b0.get(Unknown Source)
    at java.lang.ThreadLocal$SuppliedThreadLocal.initialValue(ThreadLocal.java:305)
    at java.lang.ThreadLocal.setInitialValue(ThreadLocal.java:195)
    at java.lang.ThreadLocal.get(ThreadLocal.java:172)
    at jdk.internal.math.FloatingDecimal.getBinaryToASCIIBuffer(FloatingDecimal.java:986)
    at jdk.internal.math.FloatingDecimal.getBinaryToASCIIConverter(FloatingDecimal.java:1782)
    at jdk.internal.math.FloatingDecimal.toJavaFormatString(FloatingDecimal.java:70)
    at java.lang.Double.toString(Double.java:769)
    at root method.(Unknown Source)

(Also yes I know it said to do --initialize-at-build-time=java.io.FilePermission but doing so gives another error where it basically says that initializing this class is impossible due to it breaking JNI access)

@Ran-Mewo  For first exception Defining hidden classes at runtime is not supported, maybe we can update io.fury.util.function.Functions.makeGetterFunction to catch up error and return an implementation based on Unsafe/Reflection.

@Ran-Mewo For first exception Defining hidden classes at runtime is not supported, maybe we can update io.fury.util.function.Functions.makeGetterFunction to catch up error and return an implementation based on Unsafe/Reflection.

Well at this point we'll just have to try it and see

@Ran-Mewo I'll try it tomorrow and give the feedbacks to you.

You will not be able to generate and execute bytecode at runtime without a JIT. Afaik GraalVM provides an option to bundle a JIT within a native image (Espresso), but that adds extra overhead and sort of defeats the purpose of AOT.
Your best bet is probably to generate the classes at compile time, which seems to be what everyone else is doing.

Your best bet is probably to generate the classes at compile time, which seems to be what everyone else is doing

+1

Generate all classes at build time seems feasible, but one of the last thing remained is Unsafe offset:

https://www.graalvm.org/latest/reference-manual/native-image/dynamic-features/Reflection/#unsafe-accesses

https://www.graalvm.org/latest/reference-manual/native-image/metadata/Compatibility/#unsafe-memory-access
It seems that the offset is subject to change between build time and runtime

The doc https://build-native-java-apps.cc/developer-guide/substitution/ demonstrat how to substitute unsafe offset. But introduce extra graalvm depdency and extra complexities.

Your best bet is probably to generate the classes at compile time, which seems to be what everyone else is doing.

@ennerf You mean generate the classes at graal image build time? Or generate classes ahead before pass to graal for compilation.

I try to generate serializer code at build time, but got following error:
com.google.common.collect.Platform was unintentionally initialized at build time. io.fury.graalvm.Hello caused initialization of this class with the following trace:
        at com.google.common.collect.Platform.<clinit>(Platform.java:35)
        at com.google.common.collect.Sets.newConcurrentHashSet(Sets.java:275)
        at io.fury.collection.MultiKeyWeakMap.<clinit>(MultiKeyWeakMap.java:43)
        at io.fury.codegen.CodeGenerator.<clinit>(CodeGenerator.java:72)
        at io.fury.codegen.Expression$Invoke.doGenCode(Expression.java:961)
        at io.fury.codegen.Expression.genCode(Expression.java:103)
        at io.fury.codegen.CodegenContext.addField(CodegenContext.java:515)
        at io.fury.codegen.CodegenContext.addField(CodegenContext.java:500)
        at io.fury.builder.BaseObjectCodecBuilder.<init>(BaseObjectCodecBuilder.java:150)
        at io.fury.builder.ObjectCodecBuilder.<init>(ObjectCodecBuilder.java:87)
        at io.fury.builder.CodecUtils.loadOrGenObjectCodecClass(CodecUtils.java:39)
        at io.fury.serializer.CodegenSerializer.loadCodegenSerializer(CodegenSerializer.java:45)
        at io.fury.resolver.ClassResolver.lambda$getObjectSerializerClass$2(ClassResolver.java:954)
        at io.fury.resolver.ClassResolver$$Lambda$374/0x0000000931eec210.call(Unknown Source)
        at io.fury.builder.JITContext.registerSerializerJITCallback(JITContext.java:132)
        at io.fury.resolver.ClassResolver.getObjectSerializerClass(ClassResolver.java:952)
        at io.fury.resolver.ClassResolver.getSerializerClass(ClassResolver.java:907)
        at io.fury.resolver.ClassResolver.getSerializerClass(ClassResolver.java:810)
        at io.fury.resolver.ClassResolver.createSerializer(ClassResolver.java:1168)
        at io.fury.resolver.ClassResolver.getOrUpdateClassInfo(ClassResolver.java:1106)
        at io.fury.resolver.ClassResolver.getSerializer(ClassResolver.java:781)
        at io.fury.graalvm.Hello.<clinit>(Hello.java:14)

make the package com.google.common.collect also be intiailized at build time

make the package com.google.common.collect also be intiailized at build time

I get following error finally:
com.oracle.svm.core.util.UserError$UserException: Classes that should be initialized at run time got initialized during image building:
 io.fury.util.Platform was unintentionally initialized at build time. io.fury.graalvm.Hello caused initialization of this class with the following trace:
        at io.fury.util.Platform.<clinit>(Platform.java:36)
        at io.fury.util.ReflectionUtils.getFieldOffset(ReflectionUtils.java:310)
        at io.fury.util.ReflectionUtils.getFieldOffset(ReflectionUtils.java:315)
        at io.fury.serializer.StringSerializer.<clinit>(StringSerializer.java:77)
        at io.fury.resolver.ClassResolver.addDefaultSerializers(ClassResolver.java:326)
        at io.fury.resolver.ClassResolver.initialize(ClassResolver.java:319)
        at io.fury.Fury.<init>(Fury.java:131)
        at io.fury.config.FuryBuilder.newFury(FuryBuilder.java:317)
        at io.fury.config.FuryBuilder.build(FuryBuilder.java:332)
        at io.fury.graalvm.Hello.<clinit>(Hello.java:11)

        at org.graalvm.nativeimage.builder/com.oracle.svm.core.util.UserError.abort(UserError.java:73)
        at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.classinitialization.ProvenSafeClassInitializationSupport.checkDelayedInitialization(ProvenSafeClassInitializationSupport.java:277)
        at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.classinitialization.ClassInitializationFeature.duringAnalysis(ClassInitializationFeature.java:164)
        at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGenerator.lambda$runPointsToAnalysis$10(NativeImageGenerator.java:770)
        at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.FeatureHandler.forEachFeature(FeatureHandler.java:86)
        at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGenerator.lambda$runPointsToAnalysis$11(NativeImageGenerator.java:770)
        at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.AbstractAnalysisEngine.runAnalysis(AbstractAnalysisEngine.java:179)
        at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGenerator.runPointsToAnalysis(NativeImageGenerator.java:767)
        at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGenerator.doRun(NativeImageGenerator.java:582)
        at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGenerator.run(NativeImageGenerator.java:539)
        at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGeneratorRunner.buildImage(NativeImageGeneratorRunner.java:408)
        at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGeneratorRunner.build(NativeImageGeneratorRunner.java:612)
        at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGeneratorRunner.start(NativeImageGeneratorRunner.java:134)
        at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGeneratorRunner.main(NativeImageGeneratorRunner.java:94)
------------------------------------------------------------------------------------------------------------------------

Added sun.misc.Unsafe,io.fury.util.unsafe._JDKAccess to build time init doesn't work

I read the main graalvm doc. One of the last thing remained is Unsafe offset:  https://www.graalvm.org/latest/reference-manual/native-image/dynamic-features/Reflection/#unsafe-accesses
 https://www.graalvm.org/latest/reference-manual/native-image/metadata/Compatibility/#unsafe-memory-access
It seems that the offset is subject to change between build time and runtime. I didn't find the doc explain why the offset change between build time and runtime, it's just a relative offset.
Fury inline such offsets in the generated code, need to change to a compile-time constant of the generated class.

Found a blog for Unsafe offset in graalvm native image: https://developers.redhat.com/articles/2022/05/09/using-unsafe-safely-graalvm-native-image .

@ennerf You mean generate the classes at graal image build time? Or generate classes ahead before pass to graal for compilation.

generate classes beforehand via e.g. an annotation processor
The field offset issue seems to apply only if some fields are not used and get eliminated. If you use an annotation processor you can additionally generate an exclusion that specifies to keep all fields of that class (although serialization should already use everything anyways), and add an assertion at initialization that things behave correctly.

@ennerf I see, thanks, generate code to capture all fields and assert is a good suggestion, I'll give it a try. About generating code at build time or compile time, I will do more experimentation. The compile time codegen is more predicable but doesn't work for thirdparty libs objects.

Error: No instances of java.io.FilePermission are allowed in the image heap as this class should be initialized at image runtime. Object has been initialized through the following trace:
at java.io.FilePermission.(FilePermission.java:489)
No instances of java.io.FilePermission are allowed in the image heap as this class should be initialized at image runtime. Object has been initialized through the following trace:

@Ran-Mewo For this error, Fury can be updated to don't hold strong reference as static variable too address this error.
Currently most reference comes from ClassValue cache in fury. We can replace it by a no cache implementation for graalvm

@ennerf You mean generate the classes at graal image build time? Or generate classes ahead before pass to graal for compilation.

generate classes beforehand via e.g. an annotation processor
The field offset issue seems to apply only if some fields are not used and get eliminated. If you use an annotation processor you can additionally generate an exclusion that specifies to keep all fields of that class (although serialization should already use everything anyways), and add an assertion at initialization that things behave correctly.

The field offset seems still different between graalvm build time and runtime. For example, for String class, the runtime offsets for fields are:
value: 4
coder: 12
hash: 8
hashIsZero: 13

but build time offsets are:
value: 20
coder: 16
hash: 12
hashIsZero: 17

@ennerf Do you know how to make the offset consistent between build time and runtime? If the offsets can't be consistent between processes, I must make the FURY codegen generate VarHandle instead, and make the Fury source code support  UnsafeAutomaticSubstitutionProcessor too, which won't be easy.

@ennerf @Ran-Mewo @geoand I managed make Fury generate code at build time, if I fixed the Unsafe offset, I think the Fury graalvm support will come soon.

@ennerf Do you know how to make the offset consistent between build time and runtime?

Sorry, I don't. I expected potential compression of fields due to the omission of unused fields, and I'm quite surprised to see that the fields are in a different order too.

@ennerf Do you know how to make the offset consistent between build time and runtime?

Sorry, I don't. I expected potential compression of fields due to the omission of unused fields, and I'm quite surprised to see that the fields are in a different order too.

The  different field order surprised me too. I'll generate Unsafe offset static constant to work around this.

Hi @aigens @geoand @ennerf @Ran-Mewo , I just supported fury in graalvm native image in #1143, it would be great if you can help review this PR? You have more knowlege and experience in this field.  The experience and inputs would be invalueable to us.

I've noticed two things
.withAsyncCompilation(true) doesn't work
and for me I need to add this to my resource config
{
    "pattern":"\\Qfury/blacklist.txt\\E"
}

I've noticed two things .withAsyncCompilation(true) doesn't work and the error message was very vague, took me hours to realize this was causing the issue and also for me I need to add this to my resource config

@Ran-Mewo Sorry for our insufficiently detailed doc and vague error messages.
AsyncCompilation is not supported for graalvm native image, all the fury compilation must happen and finished at graalvm build time. AsyncCompilation will delay it to the runtime, and load bytecode is not supported by graalvm native image.
Fury should add a AsyncCompilation=falsecheck for graalvm build by check it in FuryBuilder#finish.  Or just set it to false and issue an warning for it, so the config will take effect for other JDK without change your serialization code.
If you disabled AsyncCompilation, do you still need to add blacklist.txt?

If you disabled AsyncCompilation, do you still need to add blacklist.txt?

Yeah seems like I do

@chaokunyang It looks good to create a quarkus extension for fury and please check Getting an extension onboarded.
Feel free to contact me or @gastaldi if you have any problem.

@chaokunyang It looks good to create a quarkus extension for fury and please check Getting an extension onboarded.
Feel free to contact me or @gastaldi if you have any problem.

Great, thanks for share this guideline. I will follow it and try to create a quarkus extension in next weeks

FYI @chaokunyang I also create https://issues.apache.org/jira/browse/CAMEL-21396 to introduce a camel-fury component to get fury to integrate with the apache camel framework.

FYI @chaokunyang I also create https://issues.apache.org/jira/browse/CAMEL-21396 to introduce a camel-fury component to get fury to integrate with the apache camel framework.

This is awesome! Looking forward to it.

Hi @chaokunyang
I create a propsal for quarkus-fury extension and do you mind to lead this project?

Hi @chaokunyang
I create a propsal for quarkus-fury extension and do you mind to lead this project?

Yeah, I'd like to add fury support for quarkus

Perfect! I added you in the Team Members in the proposal.


Module compiled with Swift 4.1 cannot be imported by the Swift 4.2 compiler

Moya 11.0.2, built with Carthage. I set xcode-select to Xcode 10 and ran carthage build Moya but error still occurs. Is there going to be release of Moya with support of Xcode 10 and Swift 4.2?

Are you installing Moya/ReactiveSwift ?

Yeah; can you share your Cartfile.resolved by chance, @stfnhdr?

I have yet to try running Moya, RxMoya, or ReactiveMoya on Swift 4.2. I'm guessing we need to update the minimum version of RxSwift to 4.2 and ReactiveSwift to 4.0?
We're ready to do a Moya 12 release once we're certain things work on Swift 4.2

@BasThomas
github "AFNetworking/AFNetworking" "3.2.1" github "Alamofire/Alamofire" "4.7.3" github "ReactiveCocoa/ReactiveCocoa" "7.2.0" github "ReactiveCocoa/ReactiveSwift" "3.1.0" github "ReactiveX/RxSwift" "4.2.0" github "SVProgressHUD/SVProgressHUD" "2.2.5" github "aloco/SimpleButton" "3.0.1" github "antitypical/Result" "3.2.4" github "aschuch/StatefulViewController" "3.0.1" github "gunterhager/ReactiveCodable" "1.1.1" github "jdg/MBProgressHUD" "1.1.0" github "jonkykong/SideMenu" "83f8e461e103d2caacb328c3050fcbb4980cbc83" github "kishikawakatsumi/KeychainAccess" "v3.1.1" github "mbuchetics/DataSource" "5.2.0" github "moya/Moya" "11.0.2" github "oliverkrakora/DataSource" "25535d5adef53a7a476f82e37b332add7993c65b" github "scinfu/SwiftSoup" "1.7.2" github "weichsel/ZIPFoundation" "0.9.6" github "wokalski/Diff.swift" "0.5.3"

Any solution to this problem?

We'll be releasing a Moya 12.0.0-beta.1 shortly which will resolve the issues with your Carthage dependency

@SD10 Any thoughts on exact date? I'm awaiting this as well, wondering where to hold off on Swift 4.2 Upgrade

#1753 👍


Allow only post connection to sql url

cargo clippy && cargo fmt

(and feel free to push directly to that branch)


Update package on ES6 syntax

Warning: ReactTelephoneInput: React.createClass is deprecated and will be removed in version 16. Use plain JavaScript classes instead.

@Pave91 Will add to list of next release. Thanks!

related to React upgrade will be, Accessing PropTypes via the main React package is deprecated. Use the prop-types package from npm instead.

@mukeshsoni do you have an ETA on the next release? Thanks.

I was trying to change the build and publish process some time back and I want to finish that before making the next release.
I will try and make a release in the next 2 weeks. Fingers crossed.

Awesome, thanks for the update. appreciated.

Let me know if I can help with anything! This package fits perfectly with a project I'm doing at work.

@newswim Thanks for the offer! You can try and take a lot into any of the open issues and send me a PR

The lasest version has taken care of the deprecation warnings.


Devcontainer error

2023-11-08 07:47:54.341Z: Creating container...
2023-11-08 07:47:54.410Z: $ devcontainer up --id-label Type=codespaces --workspace-folder /var/lib/docker/codespacemount/workspace/scrapfly-apps --mount type=bind,source=/.codespaces/agent/mount/cache,target=/vscode --user-data-folder /var/lib/docker/codespacemount/.persistedshare --container-data-folder .vscode-remote/data/Machine --container-system-data-folder /var/vscode-remote --log-level trace --log-format json --update-remote-user-uid-default never --mount-workspace-git-root false --omit-config-remote-env-from-metadata --skip-non-blocking-commands --skip-post-create --expect-existing-container --config "/var/lib/docker/codespacemount/workspace/scrapfly-apps/.devcontainer/devcontainer.json" --override-config /root/.codespaces/shared/merged_devcontainer.json --default-user-env-probe loginInteractiveShell --container-session-data-folder /workspaces/.codespaces/.persistedshare/devcontainers-cli/cache --secrets-file /root/.codespaces/shared/user-secrets-envs.json
2023-11-08 07:47:54.624Z: @devcontainers/cli 0.52.1. Node.js v18.17.1. linux 6.2.0-1015-azure x64.
2023-11-08 07:48:07.208Z: Shell server terminated (code: 137, signal: null)
2023-11-08 07:48:07.208Z: ␄
2023-11-08 07:48:07.209Z: {"outcome":"error","message":"An error occurred setting up the container.","description":"An error occurred setting up the container.","containerId":"9b0c4b8f597c25d51ebe7ab8d8bb64fa69a7ce7b8dd8b80a33619ae85ed731df"}
2023-11-08 07:48:07.210Z: Error: An error occurred setting up the container.
2023-11-08 07:48:07.211Z:     at EAA (/usr/lib/node_modules/@devcontainers/cli/dist/spec-node/devContainersSpecCLI.js:462:1260)
2023-11-08 07:48:07.212Z:     at kK (/usr/lib/node_modules/@devcontainers/cli/dist/spec-node/devContainersSpecCLI.js:462:1002)
2023-11-08 07:48:07.212Z:     at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
2023-11-08 07:48:07.213Z:     at async NAA (/usr/lib/node_modules/@devcontainers/cli/dist/spec-node/devContainersSpecCLI.js:479:3660)
2023-11-08 07:48:07.214Z:     at async vC (/usr/lib/node_modules/@devcontainers/cli/dist/spec-node/devContainersSpecCLI.js:479:4775)
2023-11-08 07:48:07.215Z:     at async etA (/usr/lib/node_modules/@devcontainers/cli/dist/spec-node/devContainersSpecCLI.js:613:10941)
2023-11-08 07:48:07.215Z:     at async AtA (/usr/lib/node_modules/@devcontainers/cli/dist/spec-node/devContainersSpecCLI.js:613:10682)
2023-11-08 07:48:07.217Z: devcontainer process exited with exit code 1

Looks like this was created by accident, closing. If needed, feel free to reopen with more details, thank you!


Strange behaviour with Date.now()

I keep last operation time in miliseconds in db.
Everything is fine however when i monitor the process through node-inspector timestamp is right but when it is saved into db it turns into this value<PHONE_NUMBER>
Which is equal to Sun Jan 25 1970 23:31:23 GMT+0300 (MSK)
Column is formatted as int(20) i cant understand why it happens this way

The number<PHONE_NUMBER> is the maximum positive value for a 32-bit signed binary integer. Date.now() currently returns<PHONE_NUMBER>761, which is bigger. You need to use a BIGINT to store something larger than an integer.

ah thank you


Crosslink NX support

There will soon be LiteX support for the Crosslink/Certus NX. https://github.com/enjoy-digital/litex/issues/618
It would be nice to extend ecpprog to support these chips. This shouldn't bee too difficult as the JTAG engine on these parts is quite similar. Additionally the Crosslink-NX Eval board already features an FTDI connection.
Two issues have been identified:

[x] IDCODEs not present for NX parts
[x] FLASH verify fails after first sector (4096 bytes)

@gregdavill Should I send a PR adding the codes that David listed at https://github.com/enjoy-digital/litex/issues/618#issuecomment-679342816?
The output that I pasted in https://github.com/enjoy-digital/litex/issues/618#issuecomment-679355808 shows my incorrect code -- I added the code for LICCL-40-ES, but describe it in text as "LICCL-40".   I would fix that and add the other codes.
If you'd rather fix everything in this issue in one go, that makes sense too.

I have branch where I'm pushing changes to: https://github.com/gregdavill/ecpprog/tree/nx_support
It has some changes but I'm still yet to test with a LiteX bitstream, waiting on a licence file for Radiant.

Let me know if I can assist in any way -- I have the NX eval board with LICCL-40-ES, and Radiant 2.0.    (I installed Radiant 2.1 first before realizing that it won't generate a bitstream for NX parts.)
I think I just had to make an account with Lattice to get a license -- no fee.

I found the slowing the JTAG/SPI clock allowed ecpprog to verify flash content. It also solve several other weird problems.

Interesting, thanks for poking around with that.
I wonder if this is a general issue with the NX parts, or if it's a problem with the Eval board.

It could well be a limitation of the JTAG/SPI bridge on the NX. Maybe on non-ES parts it will be better?
I am now curious about why programming takes ~1 minute per MB.

I printed the flash and file data to see what is going on with the verification failure. It seems like there is an off-by-one-bit error; this starts from the first byte and the printing is misleading as to which sector is defective - in the output read data is left and file data is right (this is just random data for test purposes, not a real bitstream):
at 0x000000 d7 != af
at 0x000001 f4 != e9
at 0x000002 2e != 5d
at 0x000003 e5 != ca
at 0x000004 dc != b8
at 0x000005 0c != 19
at 0x000006 0f != 1f
at 0x000007 06 != 0c
at 0x000008 04 != 08
at 0x000009 0e != 1c
at 0x00000a fd != fb
at 0x00000b ed != db
at 0x00000c 0f != 1e
at 0x00000d 1a != 34
at 0x00000e dd != bb
at 0x00000f 17 != 2f
at 0x000010 fe != fc
at 0x000011 0d != 1a
at 0x000012 21 != 43
at 0x000013 f6 != ed
at 0x000014 fc != f9
at 0x000015 e7 != cf
at 0x000016 da != b5
at 0x000017 cb != 97
at 0x000018 21 != 42
at 0x000019 07 != 0e
at 0x00001a fc != f8
at 0x00001b d5 != ab
at 0x00001c 09 != 12
at 0x00001d d2 != a5
at 0x00001e 09 != 12
at 0x00001f 2d != 5b

The logic analyser output (0=tck, 3=tdo) matches the file if you sample on the falling edge:

With the following patch to sample using the negedge, programming and verification seems reliable for me:
diff --git a/ecpprog/jtag_tap.c b/ecpprog/jtag_tap.c
index 9aa1608..400c228 100644
--- a/ecpprog/jtag_tap.c
+++ b/ecpprog/jtag_tap.c
@@ -203,7 +203,7 @@ static void jtag_shift_bytes(

-       data[0] = MC_DATA_OUT | MC_DATA_IN | MC_DATA_LSB | MC_DATA_OCN;
+       data[0] = MC_DATA_OUT | MC_DATA_IN | MC_DATA_LSB | MC_DATA_OCN | MC_DATA_ICN;
        data[1] = (byte_count - 1);
        data[2] = (byte_count - 1) >> 8;
        memcpy(data + 3, input_data, byte_count);

Thanks for looking into this @daveshah1!
This is useful info.

I've tried the patch you've suggested It seems to work in conjunction with -k 2 Which I think is a 3MHz SCLK rate.
With no -k value I get the same verification errors.

Has anyone been able to get "LSC_REFRESH" working?
With a board powered up on my bench, I can press PROGRAMN, and see it re-configure itself from FLASH. My understanding is that "LSC_REFRESH" is supposed to also do this, but I can't seem to get it work.
I'd like to boot into the bitstream that we just loaded into FLASH, without the requirement of power cycling.

Not sure if this is related: with the LIFCL-40-EVN board, I was not able to get LSC_REFRESH to work. There was another weirdnesses too - the PROGRAMN button put the device into a state where it was waiting (presumably for JTAG) and I had to power cycle the board to get it to read Flash at all.I reported to Lattice and they told me it was a problem with this particular product (though I was unclear whether it was the board or the early silicon).
I have been working around it by programming to flash, and then reprogramming the bitstream in SRAM, at which point the configuration phase completes and the bitstream starts running.

Thanks! That sounds similar to what I'm seeing. (I'm also using the LIFCL-40-EVN for these tests).
Usually the PROGRAMN button works for me, but I have been able to put the device into a zombie state before.
It's probably worth implementing the FLASH->SRAM sequence you've mentioned if we detect an NX-ES part.

@tcal-x scripted this for us, but a command line switch to "double program" might be useful for others, especially people new to the board.
fwiw, in my use cases, I have been using ecpprog to program other content to the flash too (mostly risc-v programs). Automatically uploading the same content into SRAM would be unhelpful (!)

I've merged the basic NX support that was in the nx_support branch into main, since it appears to mostly be working.
Feel free to open up issues if there are features that aren't working exactly right with NX support.


Add a convenient makefile target in order to install specified lib types.

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

THank you for your contribution. Merged by 43d8b46.


Multiple linked sets of channels

Hello, just want to say your bot is working great so far with syncing multiple channels together!
However, I was wondering, is there a way to link multiple sets of channels? For example:
Server1: #fortnite
Server2: #fortnite
Server3: #fortnite
Server1: #minecraft
Server2: #minecraft
Server3: #minecraft
I'm not sure the .json file accepts multiple "guilds":{ } fields, and was wondering if there was a built in way I missed or if I'd need to run multiple instances of the bot to do that.

Hello,
You are right and there are currently no way to have multiple channels network on the same bot instance.
This could be added, but the original purpose of this bot was really to be a standalone application for one network of channels. This in order to prevent a too huge amount of traffic + too many request to discord on the same bot instance.
You are just fine running a second instance of the bot if you want atm.
Now we can still argue about whereas it's a good idea to add this feature or not. I'm not closed to this possibility!

Thank you for the reply! It would be cool to see, though if it's too much work, you can probably get away with just listing a tutorial on how to run duplicate instances and still call it a feature. I think the folders are only 27MB, and I'm currently doing it by ( cd [channelname] ; npm start ) & [repeat first chunk for each instance]

Updating on this as well.
Since this bot seems to get more success than i thought, this could come in a v2.
This is no where soon though, but it could be something I would envisage. As adding more features clutter the script in the current design, this bot could use a rewrite.
We coud definitely make this a working bot to serve multiple channel network.

@coffeebank https://top.gg/bot/683004822202351927

Thanks, will check out 👀


Error login !!

When you use a email as Uid, always take the first result from the database, and the first password, doesnt work with another users, if you try to login with other email, but ussing the password of first user on database, this allow login !!

I solved, only need puts the right uids on the provider xD

/**
 * Config source: https://git.io/JY0mp
 *
 * Feel free to let us know via PR, if you find something broken in this config
 * file.
 */

import { AuthConfig } from '@ioc:Adonis/Addons/Auth'
import Env from '@ioc:Adonis/Core/Env'

/*
|--------------------------------------------------------------------------
| Authentication Mapping
|--------------------------------------------------------------------------
|
| List of available authentication mapping. You must first define them
| inside the `contracts/auth.ts` file before mentioning them here.
|
*/
const authConfig: AuthConfig = {
  guard: 'api',
  guards: {
    /*
    |--------------------------------------------------------------------------
    | OAT Guard
    |--------------------------------------------------------------------------
    |
    | OAT (Opaque access tokens) guard uses database backed tokens to authenticate
    | HTTP request. This guard DOES NOT rely on sessions or cookies and uses
    | Authorization header value for authentication.
    |
    | Use this guard to authenticate mobile apps or web clients that cannot rely
    | on cookies/sessions.
    |
    */
    api: {
      driver: 'oat',

      /*
      |--------------------------------------------------------------------------
      | Tokens provider
      |--------------------------------------------------------------------------
      |
      | Uses SQL database for managing tokens. Use the "database" driver, when
      | tokens are the secondary mode of authentication.
      | For example: The Github personal tokens
      |
      | The foreignKey column is used to make the relationship between the user
      | and the token. You are free to use any column name here.
      |
      */
      tokenProvider: {
        type: 'api',
        driver: 'database',
        table: 'api_tokens',
        foreignKey: 'user_id',
      },

      provider: {
        /*
        |--------------------------------------------------------------------------
        | Driver
        |--------------------------------------------------------------------------
        |
        | Name of the driver
        |
        */
        driver: 'lucid',

        /*
        |--------------------------------------------------------------------------
        | Identifier key
        |--------------------------------------------------------------------------
        |
        | The identifier key is the unique key on the model. In most cases specifying
        | the primary key is the right choice.
        |
        */
        identifierKey: 'id',

        /*
        |--------------------------------------------------------------------------
        | Uids
        |--------------------------------------------------------------------------
        |
        | Uids are used to search a user against one of the mentioned columns. During
        | login, the auth module will search the user mentioned value against one
        | of the mentioned columns to find their user record.
        |
        */
        uids: ['email'],

        /*
        |--------------------------------------------------------------------------
        | Model
        |--------------------------------------------------------------------------
        |
        | The model to use for fetching or finding users. The model is imported
        | lazily since the config files are read way earlier in the lifecycle
        | of booting the app and the models may not be in a usable state at
        | that time.
        |
        */
        model: () => import('App/Models/User'),
      },
    },
    jwt: {
      driver: 'jwt',
      publicKey: Env.get('JWT_PUBLIC_KEY', '').replace(/\\n/g, '\n'),
      privateKey: Env.get('JWT_PRIVATE_KEY', '').replace(/\\n/g, '\n'),
      persistJwt: true,
      jwtDefaultExpire: '12h',
      refreshTokenDefaultExpire: '12h',
      refreshTokenRememberExpire: '12h',
      tokenProvider: {
        type: 'api',
        driver: 'database',
        table: 'jwt_tokens',
        foreignKey: 'user_id',
      },
      provider: {
        driver: 'lucid',
        identifierKey: 'id',
        uids: ['email'],
        model: () => import('App/Models/User'),
      },
    },
  },
}

export default authConfig


Observatory: cannot print protected fields of superclass (even when in method of that class)

I have two classes MemGraph and GraphBase, where the former extends the latter (they aren't in the same library). GraphBase has a field "_observers".
If I step the debugger into a MemGraph instance, then I get an error when I type "print _observers".  This occurs even if I step the debugger into a GraphBase method that uses _observers (in other words, "_observers" appears in the stack frame I'm looking at, but I can't print it).
Here is a stack trace, where GraphBase._notifyInternal() uses "_observers".
$ print _observers
Unhandled exception:
Class 'MemGraph' has no instance getter '_observers'.
NoSuchMethodError: method not found: '_observers'
Receiver: Instance of 'MemGraph'
Arguments: []
#0      Object._noSuchMethod (dart:core-patch/object_patch.dart:42)
#1      Object.noSuchMethod (dart:core-patch/object_patch.dart:45)
#2      MemGraph.Eval (evaluate:source:1:16)
#3      GraphBase._notifyInternal (package:modular/graph/graph_base.dart:77:50)
#4      GraphBase.notifyGraphChanged (package:modular/graph/graph_base.dart:54:5)
#5      MemGraph.privateAddNode (package:modular/graph/mem_graph.dart:58:5)

87e8bc2c96d2a90ae701d10fa986fcb63a1f102e


Add libctx to x931 keygen.

Added coverage test that failed without the change.

Checklist

[ ] documentation is added or updated
[x] tests are added or updated

This is inside a deprecated function - but we may as well run a test while the code exists still.

CI is relevant

This is adding libctx support to a deprecated call. I am not even sure it is relevant. Please note that these functions are not even called internally and to utilize this you'll have to use internal ossl_rsa_new_with_ctx(). Anyway, I have no problem with merging this although I am not even sure this is a bug fix in a strict sense.

This is adding libctx support to a deprecated call. I am not even sure it is relevant. Please note that these functions are not even called internally and to utilize this you'll have to use internal ossl_rsa_new_with_ctx(). Anyway, I have no problem with merging this although I am not even sure this is a bug fix in a strict sense.

I don't think it hurts, it should at least be running a test for the code until the code is deleted..

This PR is in a state where it requires action by @openssl/committers but the last update was 30 days ago

This PR is in a state where it requires action by @openssl/committers but the last update was 61 days ago

This PR is in a state where it requires action by @openssl/committers but the last update was 92 days ago

This PR is in a state where it requires action by @openssl/committers but the last update was 123 days ago

This PR is in a state where it requires action by @openssl/committers but the last update was 154 days ago

Anybody willing to review this?
@openssl/committers

Merged to master. Thank you.


/sys/stone/dirs and /sys/stone/repos should be based on loaded projects only?

Right now both of these nodes are based on project entries in the /projects node, whether or not the project is actually loaded in the image ... this means that the github repos are all downloaded upon the first login into a stone ... which can be quite long ... I don't think that there is value to being able to look at the directory structure of projects that are not yet loaded ... perhaps if you've done something like Browse>baseline in the project list there might be value ...

Don't forget to change the tode release notes for 0.0.3 if/when you make a change


[#4022] Throwing Generic Exceptions - LanguageGeneration

Addresses # 4022
Description
This PR replaces all 39 generic exceptions found within the libraries Dialogs.Debugging, Dialogs.Declarative, LanguageGeneration, Configuration, Connector, and Parsers.LU with proper exceptions according to the Standard Exception Types.
Specific Changes

Replaces all 39 generic exceptions within:

libraries\Microsoft.Bot.Builder.Dialogs.Debugging\
libraries\Microsoft.Bot.Builder.Dialogs.Declarative\
libraries\Microsoft.Bot.Builder.LanguageGeneration\
libraries\Microsoft.Bot.Configuration\
libraries\Microsoft.Bot.Connector\
libraries\Parsers\Microsoft.Bot.Builder.Parsers.LU\

Updates test ConfigurationLoadAndSaveTests, TemplatesTest, TemplateDiagnosticTest, and LGGeneratorTests to comply with the changes

Testing
Here's a screenshot of the tests for these files working correctly with the changes applied:

Promoted to MS in # 4954


fix: add media queries to jss

Before submitting the PR:

[x] Does your PR reference an issue? If not, please chat to the team on Discord or GitHub before submission.
[x] Did you update and run tests before submission using npm run test?
[x] Does your branch follow our naming convention? If not, please amend the branch name using branch -m new-branch-name
[x] Did you update documentation related to your new feature or changes?

What does your PR address?
Fixes  https://github.com/skeletonlabs/create-skeleton-app/issues/29
In development mode, we add an extra "intellisense plugin" to tailwind that redeclares our CSS. This essentially appends a new copy of our styles in the generated style sheet. However, media queries are currently not being included in this "intellisense plugin". The result is that the appended styles override the original media queries (in CSS media queries must be ordered after the base styles for them to work). The end result is that media queries will fail in development mode.
In addition to making media queries work consistently, this PR also adds the media queries to intellisense.
Before:

After:

@AdrianGonz97 implemented this originally so I'll kindly ask him to review this. FYI I'm usually away on weekends so it'll be Monday at the earliest before I circle back to this. Seems interesting though, thanks!

@waynetee This works amazingly! Thank you!


No logs for ios?

Hi!
I'm using the latest version of this library and i'm trying to get logs for ios in my bug reports. Android works great (all the logcat data i could want)
Do i need to replace my console.logs with some function that sends this data off to instabug for ios? or am i not setting something up properly?
edit: i should note i'm using ios 10, i see in the ios specific version of this library that there is some extra work for logging in that verison. I'm new to ios development and i'm not sure exactly how this all works.

strangely, further tests are showing all the logs i could want!
closing the ticket.


Animation (CGTransform) Issue

Which version of the WSTagsField are you using?
3.1.0
On which platform does the issue happen?
iOS 11.2.1, Simulator
Which version of Xcode are you using?
Xcode 9.2
What did you do?
When selecting any tag for the first time it's tag label gets truncated I guess due to layer's transform? You may notice that in the beginning of video I've provided in #85

@own2pwn Thanks for the issue! Sorry, I didn't noticed what you explained. Could you share a screenshot?

Please reopen this if it still happens. Thanks.


Drop list entries get truncated if TACL icon is on left end of toolbar

My suggestion here may be somewhat related to issue https://github.com/ettoolong/TextareaCache/issues/11 - but not exactly.
Would it be possible to show part or all of the URL or site name with each entry?

Maybe in a tooltip style, when hover entries that are truncated in the drop list?
Also, because some TACL drop list entries include (some) of the site's name.  Other entries don't show any of the site name.

If TACL's icon is placed on left side of bookmarks toolbar or URL bar, then the drop list has plenty of room, as it then expands to the right of the icon.

Another part of a solution would be when TACL's icon is at the right side of the screen, have the saved entries container expand as far to the left, as it expands when the icon is on the screen's left side.

That doesn't solve the issue of some entries currently not including a site name or URL.

Hi @bendover22 ,
I have make some change in ba390de.
Here is the preview of it:

you could see the whole url titile when you hover on items in drop-down selector. ( yeah tooltips :D )
btw, I also hide the serial number in the end of website title. I think it it not important for users.
Will this solve your problem? This will happen in v2.3.3.


Pixel Camera Services

Package name
com.google.android.apps.camera.services
Hash(es)
22:6B:B0:43:9D:6B:AE:AA:5A:39:7C:58:6E:70:31:D8:AD:DF:AE:C7:3C:65:BE:21:2F:4A:5D:BF:BF:62:1B:92
Source code link (Optional)
https://play.google.com/store/apps/details?id=com.google.android.apps.camera.services

As of now, contributing through issues won't be accepted. Please check the updated https://github.com/soupslurpr/AppVerifier/blob/master/CONTRIBUTING.md for instructions. Thanks.


Validate slices of structs

Hi, it seems this use case isn't supported yet. I ran into an error when trying this out. Sharing the recreation below.
On a similar note, does the zog/zhttp package support nested objects & arrays as well?

package main

import (
	"fmt"

	z "github.com/Oudwins/zog"
)

type User struct {
	Name string
}

type Team struct {
	Users []User
}

var userSchema = z.Struct(z.Schema{
	"name": z.String().Required(),
})

var teamSchema = z.Struct(z.Schema{
	"users": z.Slice(userSchema),
})

var data = map[string]interface{}{
	"users": []interface{}{
		map[string]interface{}{
			"name": "Jane",
		},
		map[string]interface{}{
			"name": "John",
		},
	},
}

func main() {
	var team Team

	errsMap := teamSchema.Parse(z.NewMapDataProvider(data), &team)
	if errsMap != nil {
		fmt.Println("Errors:")
		for key, value := range errsMap {
			fmt.Println(key, value)
		}
	}

	fmt.Println("\nTeam:")
	fmt.Println(team)
}

$ go version
go version go1.22.6 darwin/arm64
$ go run main.go
Errors:
$first [failed to validate field]
users.0 [failed to validate field]
users.1 [failed to validate field]

Team:
{[{} {}]}

No worries!
I took a look and noticed that for slice, when you process each item, the item passed to the struct is not a pointer but a map instead. That's what I've found but don't know how to make it work just yet.

@alexluong Actually I was wrong. This was not implemented. I have just implemented it & all tests are passing. If you need it I can merge it now.

@Oudwins that would be great, but I can also pull your code locally and run my project against that branch if you prefer more time to polish.
Do you know if the zog/zhttp package can support it as well?

The zhttp package is literally 10 lines of code. It will support it yes.
Here is the PR, it would probably be fine to merge. But I am thinking some refactoring is in order to better support this use case: https://github.com/Oudwins/zog/pull/10
Do note that the zhttp package only has a provider for form data & query params currently. A provider for json is actually already done. I just haven't had the time to properly test it.
This would be the code if you want to use it:
func NewJsonDataProvider(r *http.Request) (p.DataProvider, error) {
	var data map[string]any
	decod := json.NewDecoder(r.Body)
	err := decod.Decode(&data)
	if err != nil {
		return nil, err
	}
	return z.NewMapDataProvider(data), nil
}

@Oudwins thanks, I'll give it a try and let you know how it goes.
Also I'm testing this for nested structs within slices for FormData, which seems to be a bit tricky so that's why I'm a bit concerned with the zhttp package. Will let you know how it goes. If you have an example HTML setup or something to test that would be great too.

@alexluong, Damm. Actually, I don't think it will work. Could you give me an example of what you are trying to do?

Yeah for sure. So imagine you build a form that can accept an array of objects. Say you want to invite multiple users at once.
The expected payload should be
type Payload struct {
  Users []struct {
    Email string
  }
}

How would you approach this? I don't think this is an anti-pattern or anything, would it?
To be honest, I'm more of a SPA / REST person so this is usually pretty simple. I'm trying to embrace the web standard with FormData, so trying a simple Go x HTMX project and this is what I'm struggling with atm 😅

Why are you not doing this:
type Payload struct {
  UserEmails: []string
}

I am struggling to imagine what you expect the form data to look like for this:
type Payload struct {
  Users []struct {
    Name string
    Email string
  }
}

If not using a struct doesn't work. We can think about if there is a clean way of implementing this. Otherwise you can take a look at the zhttp data provider and make your own.
It shouldn't be very difficult

@Oudwins that's because this is a simplified example. In the real use case, the struct may go a bit deeper, with the possibility of having more nested struct of its own. I try not to go too deep but I've come across this pattern a few times. Just wondering how other folks solve this problem.

I haven't ever come across something like this for form data. With json yes of course all the time. If you show me an example of what the form data looks like before it is parsed by one of the js /rails libraries. I can look into it. Otherwise you just have to make a function that will convert the form data into something like this
{
 Users: []Map[string]any
}

This is one good discussion from the JS side on how to solve this problem: https://github.com/remix-run/remix/discussions/1541
For Ruby, Rack server has a built-in helper to parse nested objects like this: https://github.com/rack/rack/blob/main/lib/rack/query_parser.rb
Hope that helps. I'm trying to figure out what Go folks do for now and probably write a custom data provider here.

I think the FormData looks something like this
{
  "users[][name]": ["John", "Jane"],
  "users[][email]"<EMAIL_ADDRESS><EMAIL_ADDRESS>}

Okay, yea @alexluong, that makes sense. Its what I was thinking. Does remix support this out of the box?
I think this might make sense for a framework but I'm hesitant to add something that forces your form data to conform to a specific naming scheme in a library. I would need to think about this. If you want you can write a custom provider and we can go from there.
i think the syntax that would make most sense is something like
<!-- User 1 -->
<input name="users[].name" />
<input name="users[].email" />
<!-- User 2 -->
<input name="users[].name" />
<input name="users[].email" />

because go already parses form data into a map[string][]string
This is assuming that form data comes with a guaranteed order, if it doesn't that syntax wouldn't work

Actually. Reading more about it, this is something that they do support under the remix-validated-form
as per the docs:
      <MyInput name="firstName" label="First Name" />
      <MyInput name="lastName" label="Last Name" />
      <MyInput name="address.street" label="Street" />
      <MyInput name="address.city" label="City" />
      <MyInput name="phones[0].type" label="Phone 1 Type" />
      <MyInput name="phones[0].number" label="Phone 1 Number" />
      <MyInput name="phones[1].type" label="Phone 2 Type" />
      <MyInput name="phones[1].number" label="Phone 2 Number" />

I would be willing to add this to the zhttp package if you want to make a PR. Ignore my previous idea though, I think it would make sense to keep the same API.

Yup, I've used remix-validated-form in the past for this use case.
Yeah, I can look more into it. I haven't messed around with struct tag and reflection much, so probably will need your help finalizing it but happy to spend some time on this.

@alexluong, I happy to help, but you actually don't need any struct tag reflection, that is handled inside zog automatically for you.
Just make a function that builds a map[string]any and pass that into the NewMapDataProvider() function.
So:

Iterate over all keys in url.Values (the type in r.Form)
For each key based on some heuristics add values to a map recursively

So for example, if you get something like this
map[string][]string{
"todo[0].name": []string{"alex"}
}

You want to make a slice of any & place this map at the 0s position:
map[string]any{
"name": "alex",
}

Does that make sense? We are creating a lot of garbage. But I don't think there is another reasonable way of getting the dx you want.

I have been thinking about this. I think there will probably be a way of supporting this use case in a much simpler way without having to create the data structure I was suggesting. But I need to think about the architecture quite a bit more, it will probably take same weeks for it to be done.

That's alright, in that case I'll write a helper to parse form data into map and use NewMapDataProvider to make it work for now?

Sure, let me show you what we will do in the future though in case it helps inform the interface. Basically, Zog is already calculating the path of the current value for returning usable errors. Which means if we can give the data provider access to the current path it can use that to resolve the query.
Here is an example of the error paths generated for the code example from before:

@Oudwins gotcha, so you'll come up with some sort of logic to deduce the path for this case and the data provider will use that logic to construct the map accordingly?

Sooo I haven't quite got this to work just yet, but I'm gonna call it for right now. I'm not 100% sure if I'll continue exploring this, given you're going to come up with an alternative approach anyway. For the time being, I'll handle this from the client side and make a JSON request to the server and use z.NewMapDataProvider() for it.
Leaving my WIP here in case anyone want to take it and run with it. I got some support from Mr.ChatGPT but I think there may be a fundamental error in the approach so I may have to rewrite quite a bit 😅. But anyway, this is the test file, I got deep struct to work, just need to support slices via TestParseSlices.

Code
package parse

import (
	"fmt"
	"regexp"
	"strconv"
	"strings"
	"testing"

	"github.com/stretchr/testify/assert"
)

func TestParseStruct(t *testing.T) {
	var formData = map[string]string{
		"user.email"<EMAIL_ADDRESS>		"user.name":  "John",
	}

	fmt.Println(formData)
	data := Parse(formData)

	user, ok := data["user"].(map[string]interface{})
	if !ok {
		t.Errorf("Expected user to be a map, got %v", user)
	}

	assert.Equal(t<EMAIL_ADDRESS>user["email"])
	assert.Equal(t, "John", user["name"])

	fmt.Println(data)
	fmt.Print("\n\n\n")

	// deep struct map
	formData = map[string]string{
		"user.email"<EMAIL_ADDRESS>		"user.name.first": "John",
		"user.name.last":  "Doe",
	}

	fmt.Println(formData)
	data = Parse(formData)

	user, ok = data["user"].(map[string]interface{})
	if !ok {
		t.Errorf("Expected user to be a map, got %v", user)
	}
	name, ok := user["name"].(map[string]interface{})
	if !ok {
		t.Errorf("Expected name to be a map, got %v", user)
	}

	assert.Equal(t, user["email"]<EMAIL_ADDRESS>	assert.Equal(t, name["first"], "John")
	assert.Equal(t, name["last"], "Doe")

	fmt.Println(data)
	fmt.Print("\n\n\n")

	// 3 level deep
	formData = map[string]string{
		"user.email"<EMAIL_ADDRESS>		"user.name.first.legal":    "John",
		"user.name.first.nickname": "Jonny",
		"user.name.last":           "Doe",
	}

	fmt.Println(formData)
	data = Parse(formData)

	fmt.Println(data)

	user, ok = data["user"].(map[string]interface{})
	if !ok {
		t.Errorf("Expected user to be a map, got %v", user)
	}
	name, ok = user["name"].(map[string]interface{})
	if !ok {
		t.Errorf("Expected name to be a map, got %v", user)
	}
	first, ok := name["first"].(map[string]interface{})
	if !ok {
		t.Errorf("Expected first to be a map, got %v", name)
	}

	assert.Equal(t<EMAIL_ADDRESS>user["email"])
	assert.Equal(t, "John", first["legal"])
	assert.Equal(t, "Jonny", first["nickname"])
	assert.Equal(t, "Doee", name["last"])
}

func TestParseSlice(t *testing.T) {
	var formData = map[string]string{
		"users[0]": "John",
		"users[1]": "Jane",
	}

	data := Parse(formData)

	users, ok := data["users"].([]string)
	fmt.Println(data["users"])
	fmt.Println(users)
	if !ok {
		t.Errorf("Expected user to be a slice of string, got %v", users)
	}

	assert.Equal(t, users[0], "John")
	assert.Equal(t, users[1], "Jane")
}

func TestParseKeys(t *testing.T) {
	tests := []struct {
		input    string
		expected []string
	}{
		{"users[0].name", []string{"users", "[0]", "name"}},
		{"users[1].address.street", []string{"users", "[1]", "address", "street"}},
		{"items[0].details[1].info", []string{"items", "[0]", "details", "[1]", "info"}},
		{"simpleKey", []string{"simpleKey"}},
		{"simpleKey.simpleProperty", []string{"simpleKey", "simpleProperty"}},
	}

	for _, test := range tests {
		result := parseKeys(test.input)
		assert.Equal(t, test.expected, result, "parseKeys(%q) should return %v", test.input, test.expected)
	}
}

func TestIsArrayKey(t *testing.T) {
	tests := []struct {
		input    string
		expected bool
	}{
		{"[0]", true},
		{"[123]", true},
		{"users[0]", false},
		{"[0].name", false},
		{"simpleKey", false},
	}

	for _, test := range tests {
		result := isArrayKey(test.input)
		assert.Equal(t, test.expected, result, "isArrayKey(%q) should return %v", test.input, test.expected)
	}
}

func TestParseArrayIndex(t *testing.T) {
	tests := []struct {
		input    string
		expected int
	}{
		{"[0]", 0},
		{"[123]", 123},
		{"users[0]", -1},
		{"[0].name", -1},
		{"simpleKey", -1},
	}

	for _, test := range tests {
		result := parseArrayIndex(test.input)
		assert.Equal(t, test.expected, result, "parseArrayIndex(%q) should return %v", test.input, test.expected)
	}
}

// Parse function to convert map[string]string to map[string]interface{}
func Parse(formData map[string]string) map[string]interface{} {
	result := make(map[string]interface{})
	for key, value := range formData {
		keys := parseKeys(key)
		nestedMap(result, keys, value)
	}
	return result
}

// Helper function to parse keys and handle array indices
func parseKeys(key string) []string {
	re := regexp.MustCompile(`(\[\d+\])|(\.)`)
	parts := re.Split(key, -1)
	matches := re.FindAllString(key, -1)
	var keys []string
	for i, part := range parts {
		if part != "" {
			keys = append(keys, part)
		}
		if i < len(matches) && matches[i] != "." {
			keys = append(keys, matches[i])
		}
	}
	return keys
}

// Helper function to check if a key is an array key
func isArrayKey(key string) bool {
	return strings.HasPrefix(key, "[") && strings.HasSuffix(key, "]")
}

// Helper function to parse array index from a key
func parseArrayIndex(key string) int {
	if !isArrayKey(key) {
		return -1
	}
	re := regexp.MustCompile(`\[(\d+)\]`)
	matches := re.FindStringSubmatch(key)
	if len(matches) > 1 {
		index, _ := strconv.Atoi(matches[1])
		return index
	}
	return -1
}

// Helper function to handle nested maps and arrays
func nestedMap(currentMap map[string]interface{}, keys []string, value interface{}) {
	fmt.Println(currentMap, keys, value)

	if len(keys) == 0 {
		return
	}

	key := keys[0]
	if isArrayKey(key) {
		parentKey := key[:len(key)-3] // Remove the "[0]" part
		index := parseArrayIndex(key)
		if index == -1 {
			fmt.Printf("Invalid array index for key: %s\n", key)
			return
		}

		var slice []interface{}
		if existing, ok := currentMap[parentKey]; ok {
			slice, ok = existing.([]interface{})
			if !ok {
				fmt.Printf("Existing value for key %s is not a slice: %v\n", parentKey, existing)
				return
			}
		} else {
			slice = make([]interface{}, 0)
		}

		for len(slice) <= index {
			slice = append(slice, nil)
		}

		if len(keys) == 1 {
			slice[index] = value
		} else {
			if slice[index] == nil {
				slice[index] = make(map[string]interface{})
			}
			nestedMap(slice[index].(map[string]interface{}), keys[1:], value)
		}

		currentMap[parentKey] = slice
	} else {
		if len(keys) == 1 {
			currentMap[key] = value
		} else {
			if _, ok := currentMap[key]; !ok {
				currentMap[key] = make(map[string]interface{})
			}
			nestedMap(currentMap[key].(map[string]interface{}), keys[1:], value)
		}
	}
}

@alexluong Yes something like that. The issue is that currently zog builds the path based on the input data. Meaning it might actually be impossible (or require a large rewrite) to use that path to index into the form data map. I'll need to think more about this. It won't be a priority for now but I would like to support it if possible.
Thanks for sharing your WIP. Probably the most complex part of this approach is handling slices so good place to put it down hahaha

@alexluong Not sure if you are still playing around with this. But if you are I have found this library: https://github.com/go-playground/form
You should be able to use it to parse into a map[string]any and use that as the data. Again we are parsing twice which is not ideal but a solution for this will come eventually just not yet


Mob coding session 2022-09-20

Note:

'TODO:' marks areas that cannot be merged as is

Co-authored-by: Will Da Silva<EMAIL_ADDRESS>Co-authored-by: Edgar R. M<EMAIL_ADDRESS>Co-authored-by: Cody J. Hanson<EMAIL_ADDRESS>Co-authored-by: Reina Feather<EMAIL_ADDRESS>Deploy Preview
In Scope:

[ ] #784 - @WillDaSilva
[ ] #792 - @aaronsteers

may be a partial solve

[ ] #779 - @edgarrmondragon
[ ] #773 - @rwfeather
[ ] #778 - @cjohnhanson

Build error:
TypeError: Cannot read properties of undefined (reading 'keywords')

that's on my changes most likely. Looking...

@rwfeather @aaronsteers it looks like since preflight makes headings and lists unstyled by default, our rended markdown for things like next_steps doesn't get styled and looks a little rough. Any ideas on a quick-ish fix for this? I have two not-so-great ideas for high-effort fixes that we could do, but was hoping there's an easier way. My bad ideas:

Rewrite all of our markdown in plugin definitions as html with proper styling. This will also make contributing new plugins to the hub more difficult
Try to standardize things like next_steps in plugin definitions so that we can add the styles inline ourselves. e.g. we might have steps: as a child key of next_steps and then we'd v-for through each step and add a styled list element for it.

Thanks, @cjohnhanson. Moving forward with merge.
@cjohnhanson, @rwfeather, @edgarrmondragon, @tayloramurphy, @WillDaSilva:
Markdown pages will now be automatically rendered to html if in paths like /static/markdown/**/*.md. The path will match the relative path from /static/markdown/. Markdown rendering is performed by the MarkdownDocs template.
More info and developer instructions for markdown rendering have been added to CONTRIBUTING.md.

Known issues as of now with markdown page rendering:

[ ] Syntax highlighting for code blocks does not appear to be working as of yet.
[ ] The content div is left-aligned, wheras it should instead be either full-width or centered with a border on either side.
[ ] We should add back borders as/when we're able.
[ ] We should add back the right-hand TOC nav as/when we're able.


Added support for custom font awesome icons collection

Ref #136

Nice. Thank you :+1:
I will use this as a starting point.


docs: Add error messages to the book

This allows us to show and test error messages in the book, and adds an initial example.
Unfortunately the initial example doesn't have a great error message! So that's something we could work on.
It also updates the docs to add late binding — now functions support that!

The size of the diff is unfortunately because of our enumerating of snapshots. Now we force delete them, we could change this to be a hash, so adding one example didn't cause a big diff.


Fix cargo doc in nightly

warning: `[spawn]` cannot be resolved, ignoring it...
  --> src/scoped.rs:16:28
   |
16 | /// [`std::thread::spawn`][spawn]:
   |                            ^^^^^ cannot be resolved, ignoring
   |
   = note: #[warn(intra_doc_link_resolution_failure)] on by default
   = help: to escape `[` and `]` characters, just add '\' before them like `\[` or `\]`

warning: `[spawn]` cannot be resolved, ignoring it...
  --> src/scoped.rs:16:28
   |
16 | /// [`std::thread::spawn`][spawn]:
   |                            ^^^^^ cannot be resolved, ignoring
   |
   = help: to escape `[` and `]` characters, just add '\' before them like `\[` or `\]`

warning: `[spawn]` cannot be resolved, ignoring it...
  --> src/scoped.rs:61:36
   |
61 | /// Because [`std::thread::spawn`][spawn] doesn't know about this scope, it requires a
   |                                    ^^^^^ cannot be resolved, ignoring
   |
   = help: to escape `[` and `]` characters, just add '\' before them like `\[` or `\]`

$ rustc --version
rustc 1.28.0-nightly (01cc982e9 2018-06-24)

Would you please release a new version of crossbeam-deque?

Thanks!


numericPrecision option added to pws-current files

Per issue #8, added numericPrecision option to allow decimal results for various values returned by the API request.

@jimison  - this patch looks great. Thank you!
I'm testing it. Re-reading the docs at https://ibm.co/v2PWSCC
What is your use case for extra precision?

Valid Parameter Definitions

Parameter Name
Valid Parameter Value
Description

numericPrecision
decimal
Optional parameter.  Set to ‘decimal’ to ensure data is returned in decimal format when needed.  Will return integers if this value is not used.

I'm comparing temperatures from various sources, including RPi's and
DB18S20 sensors (https://datasheets.maximintegrated.com/en/ds/DS18S20.pdf)
for actionable events and notifications. I want the extra precision as long
as there's not a polling time trade-off. This API is super handy since my
Weather Station posts updates every 5 seconds.
On Mon, Mar 28, 2022 at 9:53 AM John Walicki @.***>
wrote:

@jimison https://github.com/jimison - this patch looks great. Thank you!
I'm testing it. Re-reading the docs at https://ibm.co/v2PWSCC
What is your use case for extra precision?
—
Reply to this email directly, view it on GitHub
https://github.com/johnwalicki/node-red-contrib-twc-weather/pull/10#issuecomment-1080823892,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/AEVUISTSD7MU552GDE5UD23VCHIXTANCNFSM5RZPWUMQ
.
You are receiving this because you were mentioned.Message ID:
@.***>

Without &numericPrecision=decimal
{"temp":-1,"heatIndex":-1,"dewpt":-17,"windChill":-6,"windSpeed":14,"windGust":18,"pressure":998.71,"precipRate":0,"precipTotal":0,"elev":37}

With &numericPrecision=decimal
{"temp":-1.2,"heatIndex":-1.2,"dewpt":-16.2,"windChill":-3.9,"windSpeed":7.2,"windGust":11.1,"pressure":998.92,"precipRate":0,"precipTotal":0,"elev":36.9}

Thanks for reading the TWC docs and adding this optional parameter.
Merging the PR
I will update the changelog, spin a new release, push it to NPM.  Good reason to rebase any outdated dependencies too.

@jimison  - I am testing v0.5.0 before I npm publish
I am not seeing the expected behavior of msg.twcparams.precision overriding the node edit properties.
Holding on the release until I can debug some more.

I've got a fix.

node-red-contrib-twc-weather:0.5.0 is available on npm

https://flows.nodered.org/node/node-red-contrib-twc-weather
https://www.npmjs.com/package/node-red-contrib-twc-weather

Up and running. 😎
On Mon, Mar 28, 2022 at 12:29 PM John Walicki @.***>
wrote:

node-red-contrib-twc-weather:0.5.0 is available on npm

https://flows.nodered.org/node/node-red-contrib-twc-weather
https://www.npmjs.com/package/node-red-contrib-twc-weather

—
Reply to this email directly, view it on GitHub
https://github.com/johnwalicki/node-red-contrib-twc-weather/pull/10#issuecomment-1080998354,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/AEVUISRNJ2SWRCZGSRKMBHLVCH3BXANCNFSM5RZPWUMQ
.
You are receiving this because you were mentioned.Message ID:
@.***>


Link to API docs from Moonstream.to frontend

Docs available at https://api.moonstream.to/docs

docs are availible on https://moonstream.to/docs


Scan for Kit: removal of custom kits

Brief Issue Summary
The documentation states that
To prevent custom kits from being overwritten, give them unique names. CMake Tools will not
delete entries from cmake-kits.json, only add and update existing ones.

This feature seems to be supported partially. I'm trying to set up toolchains for TI microcontroller build and noticing some of its compiler settings removed after rescan. (Now should I set it as compiler or toolchain kit is whole another question that I'll need to look into later but I think my observation stands regardless of kit type.)
Expected:
My customized cmake-kits.json file before rescan:
[
  {
    "name": "MSP430 GCC <IP_ADDRESS>",
    "compilers": {
      "CC": "C:/ti/ccsv7/tools/compiler/ti-cgt-msp430_16.9.6.LTS/bin/cl430.exe",
      "CXX": "C:/ti/ccsv7/tools/compiler/ti-cgt-msp430_16.9.6.LTS/bin/cl430.exe"
    }
  },
  {
    "name": "MSP430 GCC <IP_ADDRESS>",
    "compilers": {
      "CC": "C:/ti/ccsv7/tools/compiler/msp430-gcc-<IP_ADDRESS>_win32/bin/msp430-elf-gcc.exe",
      "CXX": "C:/ti/ccsv7/tools/compiler/msp430-gcc-<IP_ADDRESS>_win32/bin/msp430-elf-g++.exe"
    }
  },
  {
    "name": "MSP430 TI 4.4.8",
    "compilers": {
      "CC": "C:/ti/ccsv7/tools/compiler/ti-cgt-msp430_4.4.8/bin/cl430.exe",
      "CXX": "C:/ti/ccsv7/tools/compiler/ti-cgt-msp430_4.4.8/bin/cl430.exe"
    }
  },
  {
    "name": "MSP430 TI 15.12.4",
    "compilers": {
      "CC": "C:/ti/ccsv7/tools/compiler/ti-cgt-msp430_15.12.4.LTS/bin/cl430.exe",
      "CXX": "C:/ti/ccsv7/tools/compiler/ti-cgt-msp430_15.12.4.LTS/bin/cl430.exe"
    }
  },
  {
    "name": "MSP430 TI 16.9.7",
    "compilers": {
      "CC": "C:/ti/ccsv7/tools/compiler/ti-cgt-msp430_16.9.7.LTS/bin/cl430.exe",
      "CXX": "C:/ti/ccsv7/tools/compiler/ti-cgt-msp430_16.9.7.LTS/bin/cl430.exe"
    }
  },
  {
    "name": "Visual Studio Build Tools 2017 - amd64",
    "visualStudio": "4fdde432",
    "visualStudioArchitecture": "amd64",
    "preferredGenerator": {
      "name": "Visual Studio 15 2017",
      "platform": "x64"
    }
  },
  {
    "name": "Visual Studio Build Tools 2017 - x86",
    "visualStudio": "4fdde432",
    "visualStudioArchitecture": "x86",
    "preferredGenerator": {
      "name": "Visual Studio 15 2017"
    }
  }
]

All entries have different names and compiler paths, so I expect rescanning for kits to make no changes to the list.
Apparent Behavior:
After rescan, I get
[
  {
    "name": "MSP430 GCC <IP_ADDRESS>",
    "compilers": {
      "CC": "C:/ti/ccsv7/tools/compiler/ti-cgt-msp430_16.9.6.LTS/bin/cl430.exe",
      "CXX": "C:/ti/ccsv7/tools/compiler/ti-cgt-msp430_16.9.6.LTS/bin/cl430.exe"
    }
  },
  {
    "name": "MSP430 GCC <IP_ADDRESS>",
    "compilers": {
      "CC": "C:/ti/ccsv7/tools/compiler/msp430-gcc-<IP_ADDRESS>_win32/bin/msp430-elf-gcc.exe",
      "CXX": "C:/ti/ccsv7/tools/compiler/msp430-gcc-<IP_ADDRESS>_win32/bin/msp430-elf-g++.exe"
    }
  },
  {
    "name": "MSP430 TI 16.9.7",
    "compilers": {
      "CC": "C:/ti/ccsv7/tools/compiler/ti-cgt-msp430_16.9.7.LTS/bin/cl430.exe",
      "CXX": "C:/ti/ccsv7/tools/compiler/ti-cgt-msp430_16.9.7.LTS/bin/cl430.exe"
    }
  },
  {
    "name": "Visual Studio Build Tools 2017 - amd64",
    "visualStudio": "4fdde432",
    "visualStudioArchitecture": "amd64",
    "preferredGenerator": {
      "name": "Visual Studio 15 2017",
      "platform": "x64"
    }
  },
  {
    "name": "Visual Studio Build Tools 2017 - x86",
    "visualStudio": "4fdde432",
    "visualStudioArchitecture": "x86",
    "preferredGenerator": {
      "name": "Visual Studio 15 2017"
    }
  }
]

The older TI compilers (4.8.4 and 15.12.4) disappear.
CMake/Build Log
[kit] Found Kit: Visual Studio Build Tools 2017 - x86
[kit] Found Kit: Visual Studio Build Tools 2017 - amd64
[kit] Successfully loaded 5 kits from C:\Users\tikuma\AppData\Roaming\CMakeTools\cmake-kits.json

Nothing is logged on log.txt for this action.
Platform and Versions
[[For issues, fill out the following. Otherwise delete this section.]]

Operating System: Windows 7
CMake Version: 3.11.1
VSCode Version: 1.22.2
CMake Tools Extension Version: 0.11-beta.5
Compiler/Toolchain: Visual C++ 2017 + TI CCS supplied compilers

Thanks for the details. It'll make reproducing the case easier. I'll look at this and ping back if I need any additional details.

@hokiedsp does this seem the same as #451? It's possible that the file-watcher isn't loading your kits in time for CMake Tools to know about them.

I'll mark this closed from #452. It'll be fixed in 1.0.1, but re-open if it continues to occur after that.


Apply git-related fixes to .expeditor/update_acc.sh

Ensure we fetch tags
Execute the merge with the --no-edit option to accept the
auto-generated message
Use the proper refs/tags/* syntax as we can't assume all tags are
annotated

Signed-off-by: Seth Chisamore<EMAIL_ADDRESS>

I'm unsure why github isn't showing this as passing travis, it appears as if it passed in the travis ui.


[Enhancement](inverted index) apply inverted index when has any #41547

cherry pick from #41547

run buildall

run buildall


Create a Script Element stays a red X error

Challenge http://www.freecodecamp.com/challenges/waypoint-learn-how-script-tags-and-document-ready-work has an issue. Please describe how to reproduce it, and include links to screenshots if possible.
I put in the script tag and the jQuery function, but the instructions continued to say "Create a script element." It wouldn't go away.
The code works, when "Run Code" button is hit; however, the red X image remains next to "Create a script element."

Hello @4CesliV
You code is incorrect. Remove the src attribute.
see: http://stackoverflow.com/questions/19987269/script-tag-src-attribute
And in the future please follow these steps. https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/How-to-get-help-when-you-get-stuck
Happy Coding!


Allow writing Binary data in Parquet

This depends on https://github.com/rapidsai/cudf/pull/11556

build

build

build

build


Add RouterDevice Specification

+ADD: Certificate Generation Service for RouterDevices

@Frank-Wiebeler please have a look at the implementation proposal.

@Frank-Wiebeler any thoughts?

@saschadoemer I like that you try to use DRY principle. For a bit more convenience for the developers I've added a small overriding function to have a RouterDevice-To-Certificate-Function. Is that OK with you?


When accessing both text and html the text is reversed?!

I do @change="updateEditor($event, 'field')", in the method I console log e.text, e.html and both strings are reversed.
When I only use e.text or e.html it works properly. Please fix this!

Fixed it, something went wrong syncing data.


Demonstration Primarily For NNH At PyRenew Meeting

A demonstration at the November 5th community meeting might consist of the following

A utilities diagram discussion (utilities which are current or in progress).
The sequence of steps from model → idata → dateframe (from idata w/ dates) → hub submission.
The sequence of steps from model → idata → dateframe (from idata w/ dates) → ScoringUtils ready object.

This will take the form of a Quarto notebook, likely following from the FluSight vignette.

Considerations for this issue:

Is the Nov. 5 community meeting occurring?
Conditional on (1), is forecasttools-py still expected to be demo'd?
Conditional on (1, 2), what should the demo consist of?

For (3), in addition to https://github.com/CDCgov/forecasttools-py/issues/31#issue-2609761653, I can imagine, with respect to forecasttools-py

Discussing the addition of dates to az.InferenceData.
Pondering the future of forecasttools-py (with reference to the utilities diagram, see here).

Following STF Daily Standup 2024-11-04:

pyrenew-hew ED visits forecasts will be discussed at 2024-11-05 community meeting.
forecasttools-py can be demo'd at some future data, depending on maturity and extent of the utilities it provides.

As such, I am changing the priority of this issue from Medium to Low and the milestone. Comments from colleagues would be appreciated.
https://github.com/CDCgov/forecasttools-py/issues/31#issuecomment-2454911557 has been updated to reflect the meeting.

Some brief notes:

A render Quarto notebook will be the medium.
The author ought to send DHM a copy before 10AM EST 2024-11-19.

The author closes this issue, since the community meeting occurred. The PR associated with this issue remains to be merged, as it depends on the merging of the "time representations" PR, i.e. PR 35.


enhance: add timeout for kind-e2e github actions tests

Ⅰ. Describe what this PR does
Add a timeout (default: 180s) to each e2e test case in Github Actions.
Ⅱ. Does this pull request fix one issue?

NONE
Ⅲ. List the added test cases (unit test/integration test) if any, please explain if no tests are needed.
Ⅳ. Describe how to verify it
Ⅴ. Special notes for reviews

@TrafalgarZZZ please take a look at the why E2E is failed.


Could not create task ':react-native-device-number:compileDebugJavaWithJavac'.

FAILURE: Build failed with an exception.

What went wrong:
Execution failed for task ':tasks'.

Could not create task ':react-native-device-number:compileDebugJavaWithJavac'.
In order to compile Java 9+ source, please set compileSdkVersion to 30 or above

"react": "18.2.0",
"react-native": "0.72.3",
"react-native-device-number": "^1.0.7",

Fixed in v1.0.9


Slick Slider goes blank on safari

short description of the bug / issue, provide more detail below.
On somre resolutions my 3 row slick goes blank (Primarily on safari).
When you scroll down to the slider you can see all the content fine, then sometimes it goes blank.

====================================================================
[  paste your jsfiddle link here  ]
use this jsfiddle to reproduce your bug:
http://jsfiddle.net/xy34gwcp/
those are my settings but I cant reproduce it.
====================================================================
What is the expected behaviour?
The expected behavior is that the content within slick is visible.
====================================================================
What is observed behaviour?
slick slider suddenly goes blank
====================================================================
More Details

Which browsers/versions does it happen on?
newest Safari on zoom out.
Which jQuery/Slick version are you using?
I am using the latest version of slick.
jquery version v1.12.4

how you found a workaround for this ?

@weestack - how'd you resolve the issue?

I don't know if that's the case, but I had a slick with two slides, and the second slide was flickering and the content was disappearing in safari browsers.
I used useTransform: false solution, that was commented in this issue and it resolved!
Hope that helps! :)

I've actually found that the content gets crazy padding in safari, the
entire width of the carousel with all the pictures in padding as well, so I
disabled padding in the css for the slider and it fixed it in my case.
On Tue, 2 Nov 2021, 20:18 Luiza Munk, @.***> wrote:

I don't know if that's the case, but I had a slick with two slides, and
the second slide was flickering and the content was disappearing in safari
browsers.
I used useTransform: false solution, that was commented in this
https://github.com/kenwheeler/slick/issues/1890#issuecomment-367859723
issue and it resolved!
Hope that helps! :)
—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub
https://github.com/kenwheeler/slick/issues/3719#issuecomment-958094925,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/AJ5HKTZJFV3VNR5PJ224RH3UKA2RFANCNFSM4GYOUE5A
.
Triage notifications on the go with GitHub Mobile for iOS
https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675
or Android
https://play.google.com/store/apps/details?id=com.github.android&referrer=utm_campaign%3Dnotification-email%26utm_medium%3Demail%26utm_source%3Dgithub.


WFLY-5422 SSO is not destroyed after session timeout period of  app

https://issues.jboss.org/browse/WFLY-5422
This PR modifies our distributable session manager to delegate expiration events to undertow session listeners (including SingleSignOnAuthenticationMechanism's SessionInvalidationListener) rather than notifying the application listeners directly.
Includes the test case contained in https://github.com/wildfly/wildfly/pull/8210

@pferraro can someone on your team review this? This is a very large change late in the release cycle so someone with more familiarity with the code in question should look at it.
I've started 5 tests each of this branch on master-ignore Linux and master-ignore Windows.

@rhusar @rachmatowicz Please review.
@stuartwdouglas Can you review this as well? since this change involves improving compliance with Undertow's SessionManager contract.

The 10 custom test runs came back clean.

This fix isn't complete - closing for now.