AVX instructions are not correctly used

I have a intel CPU that supports a number of AVX features, but most of them are not picked up when using ollama.  Below is the llama.log file:
system info: AVX = 1 | AVX2 = 0 | AVX512 = 0 | AVX512_VBMI = 0 | AVX512_VNNI = 0 | FMA = 0 | NEON = 0 | ARM_FMA = 0 | F16C = 0 | FP16_VA = 0 | WASM_SIMD = 0 | BLAS = 0 | SSE3 = 1 | SSSE3 = 1 | VSX = 0 |
However, when I look at lscpu, I see that avx512 and avx512_vnni are actually supported.
I'm running on Manjaro Linux with Ollama installed from official repos.  It's an Intel Core i7-1065G7 with Iris Plus G7 onboard iGPU. (the iGPU works very well with ncnn vulkan inference)

These settings are compiled into the Ollama binary at build time.  We build a number of variants for CPU based use https://github.com/ollama/ollama/blob/main/llm/generate/gen_linux.sh#L69-L115 and then select from these based on what we detect at runtime.
What we've found when testing is AVX compared to no vector feature gives a ~400% speed boost.  AVX2 adds another ~10% on top of that, and when we tried the AVX512 flags, performance wasn't improved on our test systems.
If you build from source, we've added a mechanism to set the flags at build time with OLLAMA_CUSTOM_CPU_DEFS which is described here https://github.com/ollama/ollama/blob/main/docs/development.md#advanced-cpu-settings
Each variant we add adds complexity and size to the system, so we're trying to make sure each one adds enough value to justify.  I'm going to close this ticket for now as "working as designed" however, if you have a system where you're able to demonstrate a significant performance improvement by setting a different combination of compile flags, please re-open with more details on CPU model, and the performance benefit and we can consider adding a 4th CPU variant.

Hello @dhiltgen , thanks for your quick reply and detailed explanation.
As you suggested, I recompiled ollama from source (it was really easy!) with the following flags:
OLLAMA_CUSTOM_CPU_DEFS="-DLLAMA_AVX=on -DLLAMA_AVX2=on -DLLAMA_AVX512=on -DLLAMA_FMA=on -DLLAMA_AVX512_VBMI=on -DLLAMA_AVX512_VNNI=on"
The inference time with llava went down from approximately 8 minutes to less than 2 minutes!  This is a major improvement in performance.
Is it not possible to compile these with all the flags enabled, and then at runtime perform a check to see what the cpu supports?

That's significant!
So just to clarify, before making this change, on your system we load the "cpu_avx2" variant, and your llava scenario took 8 minutes.  With this refined set of custom CPU flags, the same scenario on CPU took 2 minutes.  Correct?
If that's all correct, please share some more info so we can attempt to repro.  What type of CPU are you using?  What was your prompt?

That's significant!
So just to clarify, before making this change, on your system we load the "cpu_avx2" variant, and your llava scenario took 8 minutes. With this refined set of custom CPU flags, the same scenario on CPU took 2 minutes. Correct?
If that's all correct, please share some more info so we can attempt to repro. What type of CPU are you using? What was your prompt?

Hello @dhiltgen , yes that's exactly right.
I was originally using the ollama version from the manjaro repos.  Just to exclude any funny business happening  (maybe they compiled it wrong?), let me run a rigorous benchmark to see how different flags affect the runtime.  Are there any flag combinations I should test?

I'd recommend checking out an unmodified HEAD from main, compile that as is, and run a test.  Set OLLAMA_DEBUG=1 for extra verbosity in the server logs, and make sure it's loading cpu_avx2. Then run a model with /set verbose so you can see TPS, and send a single prompt to get your baseline performance number.
Then build with your custom CPU flags, and repeat the experiment with the same model and prompt.
With the debug flag set, you'll see a line in the server log that looks something like this which will also help confirm everything got set up the way you intended.
[1706381855] system info: AVX = 1 | AVX_VNNI = 0 | AVX2 = 0 | AVX512 = 0 | AVX512_VBMI = 0 | AVX512_VNNI = 0 | FMA = 0 | NEON = 0 | ARM_FMA = 0 | F16C = 0 | FP16_VA = 0 | WASM_SIMD = 0 | BLAS = 0 | SSE3 = 1 | SSSE3 = 1 | VSX = 0 |

I conducted all tests with the Bakllava model here: https://ollama.ai/library/bakllava, using the same seed=100.
Details are below. The magic seems to be in VNNI.  AVX512 helps a little, but it's not a gamechanger.  VNNI makes a huge improvement.  I don't know much about it, a very short search found this blog: https://community.intel.com/t5/Blogs/Tech-Innovation/Artificial-Intelligence-AI/Deep-Learning-Performance-Boost-by-Intel-VNNI/post/1335670
An unrelated issue is that removing FMA flag gives very cryptic compile errors and I could not get it working without FMA.  That's why there is no test without FMA.  Let me know if I should open a new issue for that.
The version from the Manjaro repos is even slower than my v1 version.  I'll follow up on that separately with the manjaro folks to see what's going on.  (maybe the difference is that my v1 has FMA but the default flags do not)
v1: OLLAMA_CUSTOM_CPU_DEFS="-DLLAMA_AVX=on -DLLAMA_AVX2=on -DLLAMA_FMA=on"
v2: OLLAMA_CUSTOM_CPU_DEFS="-DLLAMA_AVX=on -DLLAMA_AVX2=on -DLLAMA_FMA=on -DLLAMA_AVX512=on"
v3: OLLAMA_CUSTOM_CPU_DEFS="-DLLAMA_AVX=on -DLLAMA_AVX2=on -DLLAMA_FMA=on -DLLAMA_AVX512=on -DLLAMA_AVX512_VBMI=on"
v4: OLLAMA_CUSTOM_CPU_DEFS="-DLLAMA_AVX=on -DLLAMA_AVX2=on -DLLAMA_AVX512=on -DLLAMA_FMA=on -DLLAMA_AVX512_VBMI=on -DLLAMA_AVX512_VNNI=on"
v1:<PHONE_NUMBER>929291 seconds
v2:<PHONE_NUMBER>0841675 seconds
v3:<PHONE_NUMBER>2892456 seconds
v4:<PHONE_NUMBER>16568 seconds
System info:
from inxi -F
CPU Info: quad core model: Intel Core i7-1065G7 bits: 64 type: MT MCP cache: L2: 2 MiB
This is an Ice Lake generation laptop CPU
from lscpu
    Flags:               fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pd
                         pe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmul
                         qdq dtes64 monitor ds_cpl vmx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsa
                         ve avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb ssbd ibrs ibpb stibp ibrs_enhanced tpr_shadow flexpriority ept vpid ept_
                         ad fsgsbase tsc_adjust sgx bmi1 avx2 smep bmi2 erms invpcid avx512f avx512dq rdseed adx smap avx512ifma clflushopt intel_pt avx512cd
                         sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves split_lock_detect dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_e
                         pp hwp_pkg_req vnmi avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg avx512_vpopcntdq rdpid sgx_
                         lc fsrm md_clear flush_l1d arch_capabilities

@dhiltgen , let me know if you need more tests or additional information.

If you build from source, we've added a mechanism to set the flags at build time with OLLAMA_CUSTOM_CPU_DEFS which is described here https://github.com/ollama/ollama/blob/main/docs/development.md#advanced-cpu-settings

Oh I wish I'd known about this! I made a shell script to do this but the location kept moving in the source tree and had to use rgrep to find it... Then one day I forgot to cd into the Ollama source folder and my script committed suicide by running sed on itself 😁

@ddpasa this sounds promising.   I've tried to reproduce, and haven't had luck yet.  I'm sending a "why is the sky blue" prompt to llama2 with the ollama CLI and /set verbose set.  I've tried on both a recent Intel and AMD system.
My baseline which is our current cpu_avx2 variant on a 11th Gen Intel(R) Core(TM) i7-11700K @ 3.60GHz
[1706476798] system info: AVX = 1 | AVX_VNNI = 0 | AVX2 = 1 | AVX512 = 0 | AVX512_VBMI = 0 | AVX512_VNNI = 0 | FMA = 1 | NEON = 0 | ARM_FMA = 0 | F16C = 1 | FP16_VA = 0 | WASM_SIMD = 0 | BLAS = 0 | SSE3 = 1 | SSSE3 = 1 | VSX = 0 |

yields:
eval rate:            8.43 tokens/s

My test which I believe I configured the same as your experiment 4
[1706477370] system info: AVX = 1 | AVX_VNNI = 0 | AVX2 = 1 | AVX512 = 1 | AVX512_VBMI = 1 | AVX512_VNNI = 1 | FMA = 1 | NEON = 0 | ARM_FMA = 0 | F16C = 1 | FP16_VA = 0 | WASM_SIMD = 0 | BLAS = 0 | SSE3 = 1 | SSSE3 = 1 | VSX = 0 |

yields:
eval rate:            8.45 tokens/s

Are you only seeing the performance improvement on multimodal models?

Hello @dhiltgen

Are you only seeing the performance improvement on multimodal models?

I ran inference with the Phi-2 model here and I think you're right!  The v4 version with vnni is still faster than v1 with optimizations only up to avx2, but just marginally so.  I don't see the same dramatic improvement I see in Bakllava.
v1: (only up to avx2)
39.85 ms per token,    25.09 tokens per second
v4: (with vnni)
36.60 ms per token,    27.32 tokens per second
For multimodel models like Llava and Bakllava the image encoding part is pretty expensive.  Maybe it's helping there?

That's a good datapoint.  Let me explore multimodal performance a bit more.

AMD

Might be able to help with regard to both AMD AVX512 and the no improvement over AVX2 on some systems. Lets start with AMD because I've been eager to have someone try this on some AMD hardware. I moved the longer boring bits to the end, feel free to skip if you want to just give it a try.
For improved AMD cpu perf (using llama.cpp int his case as its blas/lapack friendly, for now) on inference you can try https://www.amd.com/en/developer/aocl.html#downloads   either the package or the tar ball. Unsure about where the package will place them but the install.sh updates the libs and other env vars if on linux. Then in the root of a checkout of the llama.cpp git run (if previouslly used, make clean or otherwise remove CMakeCache.txt and CMakeFiles first)
cmake . -DLLAMA_BLAS_VENDOR=AOCL-mt -DLLAMA_BLAS=ON
if it doesn't find the libs add
-DBLAS_LIBRARIES=/lib/libblis-mt.so
on win replace
libblis-mt.so with LibBlis-Win-MT-dll.dll
no not a typo. it really has -dll in the file name just before the extension. if it cant find the includes add
-DBLAS_INCLUDE_DIRS=<path to install location/include>
if testing in the presence of an AMD or NVIDIA GPU you should likely add
-DLLAMA_HIPBLAS=OFF or -DLLAMA_CUBLAS=OFF just to ensure you get the AOCL-BLAS results when you run 'benchmark' from the 'bin' dir, default to single thread so you may want to ramp that up and observe if there is any change here as well. Finally build it.
cmake --build . --config Release  .

Simply put regarding AVX512 being no more performant or even slow than AVX2 in some systems complicated. The most common reason is the lower end chips just fused two 256 width  register together to get the 512 width. High end xeon and the top range on the 2017-~2019 X Series aka SkylakeX 10+ core models not only have a 512 width unit but two of them per core
Going back to why AMD chips tend to not end up utilizing their AVX instruction sets most often its due to Intel MKL which bundles a bunch of kernels in compiled code then leverages the CPUID instruction to pick the "best" one. For Intel branded chips this more or less works nicely. For none they get the "most compatible" kernel, read "basic" "slow" . MKL Obviously isn't the only way for something to leverage the instruction sets it's one of the easiest. This is especially true if underlying components wrap around BLAS/LAPACK . Much of llamacpp does, however 'main' no longer does but 'server' does. Likewise 'benchmark' which should make it easy to figure out if we're on the right track.
Enter 'AMD Optimizing CPU Libraries' aka AOCL.
https://www.amd.com/en/developer/aocl.html
There's quite a few but for improving cpu only and proving a benefit to the AMD AVX512 instructions we're gonna need an optimized routine to do matrix-matrix multiplication and other ops. A BLAS/BLIS implementation will generally  include this and AMD's AOCL-BLAS has what should be a compliant a/z/s/gemm routine.
https://www.amd.com/en/developer/aocl/dense.html

All that said, the matmul routines in llama.cpp aren't bad at all, other than when I can leverage 2x512 registers and the like the stock mkl as blas vs builtin are on par gflop wise but the built in routine tended to have lower overhead. Using the same as above, setting the BLAS_VENDOR and using https://cmake.org/cmake/help/latest/module/FindBLAS.html as a reference you can play around with various libs, variations and options if so inclined.
Hope that helps! I'm very eager to see if AOCL delivered anything meaningful :)

@itsdotscience I've tried compiling it with AOCL but the build fails immediately. I'm on Windows 11 running this on a Ryzen 7840U.
On installing the libraries, I see there are ILP64 and LP64 variants, I wasn't sure which one to choose but both resulted in the same error.
I generated the build files with this command: cmake .. --fresh -DLLAMA_BLAS_VENDOR=AOCL-mt -DLLAMA_BLAS=ON -DBLAS_LIBRARIES="C:\Program Files\AMD\AOCL-Windows\amd-blis\lib\ILP64\AOCL-LibBlis-Win-MT-dll.dll" -DBLAS_INCLUDE_DIRS="C:\Program Files\AMD\AOCL-Windows\amd-blis\include\ILP64"
D:\source\llama.cpp\build>cmake --build . --config Release
MSBuild version 17.8.5+b5265ef37 for .NET Framework

  build_info.vcxproj -> D:\source\llama.cpp\build\common\build_info.dir\Release\build_info.lib
  ggml.c
D:\source\llama.cpp\ggml.c(358,6): error C2371: 'ggml_guid_matches': redefinition; different basic types [D:\source\llama.cpp\build\ggml.vcxproj]
  D:\source\llama.cpp\ggml.h(683,19):
  see declaration of 'ggml_guid_matches'

D:\source\llama.cpp\ggml.c(2183,6): error C2371: 'ggml_is_numa': redefinition; different basic types [D:\source\llama.cpp\build\ggml.vcxproj]
  D:\source\llama.cpp\ggml.h(696,22):
  see declaration of 'ggml_is_numa'

D:\source\llama.cpp\ggml.c(2263,16): error C2371: 'ggml_is_quantized': redefinition; different basic types [D:\source\llama.cpp\build\ggml.vcxproj]
  D:\source\llama.cpp\ggml.h(723,32):
  see declaration of 'ggml_is_quantized'

D:\source\llama.cpp\ggml.c(2293,6): error C2371: 'ggml_is_scalar': redefinition; different basic types [D:\source\llama.cpp\build\ggml.vcxproj]
  D:\source\llama.cpp\ggml.h(731,29):
  see declaration of 'ggml_is_scalar'

D:\source\llama.cpp\ggml.c(2299,6): error C2371: 'ggml_is_vector': redefinition; different basic types [D:\source\llama.cpp\build\ggml.vcxproj]
  D:\source\llama.cpp\ggml.h(732,29):
  see declaration of 'ggml_is_vector'

D:\source\llama.cpp\ggml.c(2305,6): error C2371: 'ggml_is_matrix': redefinition; different basic types [D:\source\llama.cpp\build\ggml.vcxproj]
  D:\source\llama.cpp\ggml.h(733,29):
  see declaration of 'ggml_is_matrix'

D:\source\llama.cpp\ggml.c(2311,6): error C2371: 'ggml_is_3d': redefinition; different basic types [D:\source\llama.cpp\build\ggml.vcxproj]
  D:\source\llama.cpp\ggml.h(734,29):
  see declaration of 'ggml_is_3d'

D:\source\llama.cpp\ggml.c(2377,16): error C2371: 'ggml_is_transposed': redefinition; different basic types [D:\source\llama.cpp\build\ggml.vcxproj]
  D:\source\llama.cpp\ggml.h(728,29):
  see declaration of 'ggml_is_transposed'

D:\source\llama.cpp\ggml.c(2381,16): error C2371: 'ggml_is_contiguous': redefinition; different basic types [D:\source\llama.cpp\build\ggml.vcxproj]
  D:\source\llama.cpp\ggml.h(729,29):
  see declaration of 'ggml_is_contiguous'

D:\source\llama.cpp\ggml.c(2400,16): error C2371: 'ggml_is_permuted': redefinition; different basic types [D:\source\llama.cpp\build\ggml.vcxproj]
  D:\source\llama.cpp\ggml.h(730,29):
  see declaration of 'ggml_is_permuted'

D:\source\llama.cpp\ggml.c(2415,6): error C2371: 'ggml_are_same_shape': redefinition; different basic types [D:\source\llama.cpp\build\ggml.vcxproj]
  D:\source\llama.cpp\ggml.h(737,19):
  see declaration of 'ggml_are_same_shape'

D:\source\llama.cpp\ggml.c(2625,6): error C2371: 'ggml_get_no_alloc': redefinition; different basic types [D:\source\llama.cpp\build\ggml.vcxproj]
  D:\source\llama.cpp\ggml.h(750,22):
  see declaration of 'ggml_get_no_alloc'

D:\source\llama.cpp\ggml.c(2629,56): warning C4028: formal parameter 2 different from declaration [D:\source\llama.cpp\build\ggml.vcxproj]
D:\source\llama.cpp\ggml.c(4097,61): warning C4028: formal parameter 4 different from declaration [D:\source\llama.cpp\build\ggml.vcxproj]
D:\source\llama.cpp\ggml.c(5414,31): warning C4028: formal parameter 6 different from declaration [D:\source\llama.cpp\build\ggml.vcxproj]
D:\source\llama.cpp\ggml.c(5435,31): warning C4028: formal parameter 15 different from declaration [D:\source\llama.cpp\build\ggml.vcxproj]
D:\source\llama.cpp\ggml.c(5647,26): warning C4028: formal parameter 10 different from declaration [D:\source\llama.cpp\build\ggml.vcxproj]
D:\source\llama.cpp\ggml.c(5945,31): warning C4028: formal parameter 5 different from declaration [D:\source\llama.cpp\build\ggml.vcxproj]
D:\source\llama.cpp\ggml.c(6010,31): warning C4028: formal parameter 6 different from declaration [D:\source\llama.cpp\build\ggml.vcxproj]
D:\source\llama.cpp\ggml.c(15782,6): error C2371: 'ggml_hash_contains': redefinition; different basic types [D:\source\llama.cpp\build\ggml.vcxproj]
  D:\source\llama.cpp\ggml-impl.h(248,8):
  see declaration of 'ggml_hash_contains'

D:\source\llama.cpp\ggml.c(16885,115): warning C4028: formal parameter 4 different from declaration [D:\source\llama.cpp\build\ggml.vcxproj]
D:\source\llama.cpp\ggml.c(16940,53): warning C4028: formal parameter 2 different from declaration [D:\source\llama.cpp\build\ggml.vcxproj]
D:\source\llama.cpp\ggml.c(16948,89): warning C4028: formal parameter 3 different from declaration [D:\source\llama.cpp\build\ggml.vcxproj]
D:\source\llama.cpp\ggml.c(18740,57): warning C4133: 'function': incompatible types - from 'bool *' to 'bool *' [D:\source\llama.cpp\build\ggml.vcxproj]
D:\source\llama.cpp\ggml.c(18831,61): warning C4133: 'function': incompatible types - from 'bool *' to 'bool *' [D:\source\llama.cpp\build\ggml.vcxproj]
D:\source\llama.cpp\ggml.c(18973,65): warning C4133: 'function': incompatible types - from 'bool *' to 'bool *' [D:\source\llama.cpp\build\ggml.vcxproj]
D:\source\llama.cpp\ggml.c(19116,61): warning C4133: 'function': incompatible types - from 'bool *' to 'bool *' [D:\source\llama.cpp\build\ggml.vcxproj]
D:\source\llama.cpp\ggml.c(19702,6): error C2371: 'ggml_quantize_requires_imatrix': redefinition; different basic types [D:\source\llama.cpp\build\ggml.vcx
proj]
  D:\source\llama.cpp\ggml.h(2166,19):
  see declaration of 'ggml_quantize_requires_imatrix'

D:\source\llama.cpp\ggml.c(20583,6): error C2371: 'gguf_get_val_bool': redefinition; different basic types [D:\source\llama.cpp\build\ggml.vcxproj]
  D:\source\llama.cpp\ggml.h(2233,27):
  see declaration of 'gguf_get_val_bool'

I'd like to provide some extra data points.
All my tests have been conducted on Ubuntu 22.04.4, kernel 6.5.0-1016-gcp. The underneath hardware is a GCP C3 instance using Intel Sapphire Rapids, specifically Xeon 8481C while the machine type is a c3-standard-8, translation: 8 vCPU / 4 pCores, SMT enabled, and 32GB of memory.
AVX512 and AMX are available:
fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single ssbd ibrs ibpb stibp ibrs_enhanced fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid rtm avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves avx_vnni avx512_bf16 arat avx512vbmi umip avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg avx512_vpopcntdq la57 rdpid cldemote movdiri movdir64b fsrm md_clear serialize amx_bf16 avx512_fp16 amx_tile amx_int8 arch_capabilities

All deps were installed through apt / snap:
# gcc --version
gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

# cmake --version
cmake version 3.22.1

# go version
go version go1.22.1 linux/amd64

Last but not least, ollama was compiled from main commit 7ed3e94 and I've used the Gemma 7B model.
Taking @ddpasa four versions, here the results:
* **v1** `189.14 ms per token,     5.29 tokens per second`

* **v2** `188.88 ms per token,     5.29 tokens per second`

* **v3** `189.26 ms per token,     5.28 tokens per second`

* **v4** `188.99 ms per token,     5.29 tokens per second`

As you can see the throughput is the same across all four iterations. Checking system info, it shows that AVX512 and VNNI were not used:
* **v1** `system info: AVX = 1 | AVX_VNNI = 0 | AVX2 = 1 | AVX512 = 0 | AVX512_VBMI = 0 | AVX512_VNNI = 0 | FMA = 1 | NEON = 0 | ARM_FMA = 0 | F16C = 1 | FP16_VA = 0 | WASM_SIMD = 0 | BLAS = 0 | SSE3 = 1 | SSSE3 = 1 | VSX = 0 | MATMUL_INT8 = 0 |`

* **v2** `system info: AVX = 1 | AVX_VNNI = 0 | AVX2 = 1 | AVX512 = 0 | AVX512_VBMI = 0 | AVX512_VNNI = 0 | FMA = 1 | NEON = 0 | ARM_FMA = 0 | F16C = 1 | FP16_VA = 0 | WASM_SIMD = 0 | BLAS = 0 | SSE3 = 1 | SSSE3 = 1 | VSX = 0 | MATMUL_INT8 = 0 |`

* **v3** `system info: AVX = 1 | AVX_VNNI = 0 | AVX2 = 1 | AVX512 = 0 | AVX512_VBMI = 0 | AVX512_VNNI = 0 | FMA = 1 | NEON = 0 | ARM_FMA = 0 | F16C = 1 | FP16_VA = 0 | WASM_SIMD = 0 | BLAS = 0 | SSE3 = 1 | SSSE3 = 1 | VSX = 0 | MATMUL_INT8 = 0 |`

* **v4** `system info: AVX = 1 | AVX_VNNI = 0 | AVX2 = 1 | AVX512 = 0 | AVX512_VBMI = 0 | AVX512_VNNI = 0 | FMA = 1 | NEON = 0 | ARM_FMA = 0 | F16C = 1 | FP16_VA = 0 | WASM_SIMD = 0 | BLAS = 0 | SSE3 = 1 | SSSE3 = 1 | VSX = 0 | MATMUL_INT8 = 0 |`

I then did the following patch:
diff --git a/gpu/cpu_common.go b/gpu/cpu_common.go
index 3b299e4..607a19e 100644
--- a/gpu/cpu_common.go
+++ b/gpu/cpu_common.go
@@ -7,6 +7,10 @@ import (
 )

 func GetCPUVariant() string {
+       if cpu.X86.HasAVX512 {
+               slog.Info("CPU has AVX512")
+               return "avx512"
+       }
        if cpu.X86.HasAVX2 {
                slog.Info("CPU has AVX2")
                return "avx2"

At this point, across the four versions, AVX512 was recognized according to system info: system info: AVX = 1 | AVX_VNNI = 0 | AVX2 = 1 | AVX512 = 1 | AVX512_VBMI = 1 | AVX512_VNNI = 1 | FMA = 1 | NEON = 0 | ARM_FMA = 0 | F16C = 0 | FP16_VA = 0 | WASM_SIMD = 0 | BLAS = 0 | SSE3 = 1 | SSSE3 = 1 | VSX = 0 | MATMUL_INT8 = 0 |.
Throughout wise, whether compiled with or without AVX512/VNNI, it yields the very same outcome, although ~6% slower:
* **v1** `199.59 ms per token,     5.01 tokens per second`

* **v2** `200.23 ms per token,     4.99 tokens per second`

* **v3** `200.55 ms per token,     4.99 tokens per second`

* **v4** `200.37 ms per token,     4.99 tokens per second`

The last thing done was creating a new AVX512 CPU target:
diff --git a/llm/generate/gen_linux.sh b/llm/generate/gen_linux.sh
index 591fc80..2af1c2d 100755
--- a/llm/generate/gen_linux.sh
+++ b/llm/generate/gen_linux.sh
@@ -115,6 +115,15 @@ if [ -z "${OLLAMA_SKIP_CPU_GENERATE}" ]; then
             build
             compress_libs
         fi
+
+        if [ -z "${OLLAMA_CPU_TARGET}" -o "${OLLAMA_CPU_TARGET}" = "cpu_avx512" ]; then
+            init_vars
+            CMAKE_DEFS="${COMMON_CPU_DEFS} -DLLAMA_AVX=on -DLLAMA_AVX2=on -DLLAMA_AVX512=on -DLLAMA_AVX512_VBMI=on -DLLAMA_AVX512_VNNI=on -DLLAMA_FMA=on -DLLAMA_F16C=on ${CMAKE_DEFS}"
+            BUILD_DIR="${LLAMACPP_DIR}/build/linux/${ARCH}/cpu_avx512"
+            echo "Building AVX512 w/ VNNI CPU"
+            build
+            compress_libs
+        fi
     fi
 else
     echo "Skipping CPU generation step as requested"

Ollama was compiled with OLLAMA_CPU_TARGET="cpu_avx512" go generate ./... and now when serving it reports Dynamic LLM libraries [cpu_avx2 cpu_avx512 cpu_avx cpu], despite that, the TPS is kinda low: 188.85 ms per token, 5.30 tokens per second.
What's your take? To me it feels like either Gemma doesn't take advantage of AVX512/VNNI or something else is going on with ollama / llama.cpp preventing to speed up inference.
All tests were done using the same prompt and seed:
# curl http://localhost:11434/api/generate -d '{"model": "gemma:7b", "prompt": "Why is the sky blue?",  "stream": false, "options": {"seed": 100}}'

Hello @m4r1k , can you retry with a multimodal model, such as llava or bakllava?  I think our conclusion is that VNNI instuctions make a huge difference in processing the image, which is why we see an improvement in multimodal models.  But they don't make any difference with text only language models.

Hey @ddpasa, follows some tests with both LLaVA 1.6 7b and BakLLaVA latest version 7b.
In terms of prompts, I asked the ollama's API sample with an image as well as the usual "Why the sky is blue?".
Follows the results for LLaVA:

V1: 143.73 ms per token, 6.96 tokens per second for the question (generation eval time), and 59850.81 ms per token, 0.02 tokens per second for the image recognition (prompt eval time)
V4: 140.75 ms per token, 7.10 tokens per second for the question (generation eval time), and 59161.23 ms per token, 0.02 tokens per second for the image recognition (prompt eval time)

Follows the results for BakLLaVA:

V1: 143.05 ms per token, 6.99 tokens per second for the question (generation eval time), and 60477.51 ms per token, 0.02 tokens per second for the image recognition (prompt eval time)
V4: 139.94 ms per token, 7.15 tokens per second for the question (generation eval time), and 59392.86 ms per token, 0.02 tokens per second for the image recognition (prompt eval time)

Common aspects:

V1 system info: AVX = 1 | AVX_VNNI = 0 | AVX2 = 1 | AVX512 = 0 | AVX512_VBMI = 0 | AVX512_VNNI = 0 | FMA = 1 | NEON = 0 | ARM_FMA = 0 | F16C = 1 | FP16_VA = 0 | WASM_SIMD = 0 | BLAS = 0 | SSE3 = 1 | SSSE3 = 1 | VSX = 0 | MATMUL_INT8 = 0 |
V4 system info: AVX = 1 | AVX_VNNI = 1 | AVX2 = 1 | AVX512 = 1 | AVX512_VBMI = 1 | AVX512_VNNI = 1 | FMA = 1 | NEON = 0 | ARM_FMA = 0 | F16C = 1 | FP16_VA = 0 | WASM_SIMD = 0 | BLAS = 0 | SSE3 = 1 | SSSE3 = 1 | VSX = 0 | MATMUL_INT8 = 0 |
System and tags same as former post
Stream disabled
Seed 100
In the v4 case I did not apply my customer patches

Perhaps I'm making some sort of mistakes but I cannot find large differences..

If you find little or no difference when testing, please check if your CPU is throttling due to a temperature that is too high.  AVX instructions increase the CPU's temperature.  There is even a BIOS setting to reduce CPU frequency when AVX instructions are used.  The motherboard may have this off, but it might be throttling the CPU if the cooler can't handle the load.
With the release build of Ollama I have been struggling with keeping the CPU cool.
With just handling thermal.
Multimodel mixtral:8x7b goes from ~10.7 TPS to ~13.7 TPS  (generation)
command-r:35b goes from ~4.74 TPS  to ~6.00 TPS (generation)

Does the CPU instruction flags like  OLLAMA_CUSTOM_CPU_DEFS="-DLLAMA_AVX=on -DLLAMA_AVX2=on -DLLAMA_F16C=on -DLLAMA_FMA=on" have an affect on the libraries it is compiled with like BLAS and LAMMAFILE?
When a model is split between a GPU and CPU what build is it running to execute the model?  Is the GPU build the runner that is executing both the GPU and CPU or does the CPU offloaded layers execute with one of the dedicated CPU builds?

AMD

Might be able to help with regard to both AMD AVX512 and the no improvement over AVX2 on some systems. Lets start with AMD because I've been eager to have someone try this on some AMD hardware. I moved the longer boring bits to the end, feel free to skip if you want to just give it a try.
For improved AMD cpu perf (using llama.cpp int his case as its blas/lapack friendly, for now) on inference you can try https://www.amd.com/en/developer/aocl.html#downloads either the package or the tar ball. Unsure about where the package will place them but the install.sh updates the libs and other env vars if on linux. Then in the root of a checkout of the llama.cpp git run (if previouslly used, make clean or otherwise remove CMakeCache.txt and CMakeFiles first)
cmake . -DLLAMA_BLAS_VENDOR=AOCL-mt -DLLAMA_BLAS=ON
if it doesn't find the libs add
-DBLAS_LIBRARIES=/lib/libblis-mt.so
on win replace
libblis-mt.so with LibBlis-Win-MT-dll.dll
Going back to why AMD chips tend to not end up utilizing their AVX instruction sets most often its due to Intel MKL which bundles a bunch of kernels in compiled code then leverages the CPUID instruction to pick the "best" one. For Intel branded chips this more or less works nicely. For none they get the "most compatible" kernel, read "basic" "slow" . MKL Obviously isn't the only way for something to leverage the instruction sets it's one of the easiest. This is especially true if underlying components wrap around BLAS/LAPACK . Much of llamacpp does, however 'main' no longer does but 'server' does. Likewise 'benchmark' which should make it easy to figure out if we're on the right track.
Enter 'AMD Optimizing CPU Libraries' aka AOCL.
https://www.amd.com/en/developer/aocl.html
There's quite a few but for improving cpu only and proving a benefit to the AMD AVX512 instructions we're gonna need an optimized routine to do matrix-matrix multiplication and other ops. A BLAS/BLIS implementation will generally include this and AMD's AOCL-BLAS has what should be a compliant a/z/s/gemm routine.
https://www.amd.com/en/developer/aocl/dense.html

Hope that helps! I'm very eager to see if AOCL delivered anything meaningful :)

only differenc is that AOCL-mt use all cores in preprocesing phase 8 realones and 8 HT cores, official ollama build use only 8 cores.
Drives:
Local Storage: total: 931.51 GiB used: 547.62 GiB (58.8%)
ID-1: /dev/nvme0n1 vendor: Smart Modular Tech. model: SHPP41-1000GM
size: 931.51 GiB
Partition:
ID-1: / size: 291.98 GiB used: 75.36 GiB (25.8%) fs: btrfs
dev: /dev/nvme0n1p2
ID-2: /boot/efi size: 998 MiB used: 584 KiB (0.1%) fs: vfat
dev: /dev/nvme0n1p1
ID-3: /home size: 291.98 GiB used: 75.36 GiB (25.8%) fs: btrfs
dev: /dev/nvme0n1p2
ID-4: /var/log size: 291.98 GiB used: 75.36 GiB (25.8%) fs: btrfs
dev: /dev/nvme0n1p2
Swap:
ID-1: swap-1 type: partition size: 66.68 GiB used: 0 KiB (0.0%)
dev: /dev/nvme0n1p3
Sensors:
System Temperatures: cpu: 36.9 C mobo: N/A gpu: amdgpu temp: 34.0 C
Fan Speeds (rpm): N/A
Info:
Memory: total: 96 GiB note: est. available: 93.1 GiB used: 6.42 GiB (6.9%)
Processes: 407 Uptime: 36m Shell: Bash inxi: 3.3.34
TESTS

ollama version is 0.1.34
ollama run llama3:70b-instruct --verbose
article sumarization
total duration:       11m33.722657067s
load duration:        803.251µs
prompt eval count:    1521 token(s)
prompt eval duration: 6m45.393753s
prompt eval rate:     3.75 tokens/s
eval count:           371 token(s)
eval duration:        4m48.219751s
eval rate:            1.29 tokens/s
ollama from git repo date of 08.03.2024
./ollama run llama3:70b-instruct --verbose
OLLAMA_CUSTOM_CPU_DEFS="-DLLAMA_BLAS_VENDOR=AOCL-mt -DLLAMA_BLAS=ON -DBLAS_LIBRARIES=/usr/lib/libblis-mt.so -DBLAS_INCLUDE_DIRS=/usr/include/blis -DLLAMA_AVX=on -DLLAMA_AVX2=on -DLLAMA_AVX512=on -DLLAMA_FMA=on -DLLAMA_AVX512_VBMI=on -DLLAMA_AVX512_VNNI=on"
"system_info":"AVX = 1 | AVX_VNNI = 0 | AVX2 = 1 | AVX512 = 1 | AVX512_VBMI = 1 | AVX512_VNNI = 1 | FMA = 1 | NEON = 0 | ARM_FMA = 0 | F16C = 1 | FP16_VA = 0 | WASM_SIMD = 0 | BLAS = 1 | SSE3 = 1 | SSSE3 = 1 | VSX = 0 | MATMUL_INT8 = 0 | LLAMAFILE = 1 | "
article sumarization
total duration:       12m1.363525552s
load duration:        844.333µs
prompt eval count:    1517 token(s)
prompt eval duration: 8m24.139798s
prompt eval rate:     3.01 tokens/s
eval count:           281 token(s)
eval duration:        3m37.077587s
eval rate:            1.29 tokens/s

ollama version is 0.1.34
ollama run phi3 --verbose
article sumarization
total duration:       1m5.838295646s
load duration:        1.177418ms
prompt eval count:    2004 token(s)
prompt eval duration: 35.807216s
prompt eval rate:     55.97 tokens/s
eval count:           413 token(s)
eval duration:        29.933218s
eval rate:            13.80 tokens/s
ollama from git repo date of 08.05.2024
./ollama run phi3 --verbose
OLLAMA_CUSTOM_CPU_DEFS="-DLLAMA_BLAS_VENDOR=AOCL-mt -DLLAMA_BLAS=ON -DBLAS_LIBRARIES=/usr/lib/libblis-mt.so -DBLAS_INCLUDE_DIRS=/usr/include/blis -DLLAMA_AVX=on -DLLAMA_AVX2=on -DLLAMA_AVX512=on -DLLAMA_FMA=on -DLLAMA_AVX512_VBMI=on -DLLAMA_AVX512_VNNI=on"
"system_info":"AVX = 1 | AVX_VNNI = 0 | AVX2 = 1 | AVX512 = 1 | AVX512_VBMI = 1 | AVX512_VNNI = 1 | FMA = 1 | NEON = 0 | ARM_FMA = 0 | F16C = 1 | FP16_VA = 0 | WASM_SIMD = 0 | BLAS = 1 | SSE3 = 1 | SSSE3 = 1 | VSX = 0 | MATMUL_INT8 = 0 | LLAMAFILE = 1 | "
article sumarization
total duration:       1m32.598432218s
load duration:        874.609µs
prompt eval count:    2004 token(s)
prompt eval duration: 48.579079s
prompt eval rate:     41.25 tokens/s
eval count:           616 token(s)
eval duration:        43.917537s
eval rate:            14.03 tokens/s

ollama version is 0.1.34
ollama run llava-llama3:latest --verbose
screnshoot description
total duration:       44.579711139s
load duration:        5.358803ms
prompt eval duration: 19.443385s
prompt eval rate:     0.00 tokens/s
eval count:           246 token(s)
eval duration:        24.950062s
eval rate:            9.86 tokens/s
ollama from git repo date of 08.05.2024
./ollama run llava-llama3:latest --verbose
OLLAMA_CUSTOM_CPU_DEFS="-DLLAMA_BLAS_VENDOR=AOCL-mt -DLLAMA_BLAS=ON -DBLAS_LIBRARIES=/usr/lib/libblis-mt.so -DBLAS_INCLUDE_DIRS=/usr/include/blis -DLLAMA_AVX=on -DLLAMA_AVX2=on -DLLAMA_AVX512=on -DLLAMA_FMA=on -DLLAMA_AVX512_VBMI=on -DLLAMA_AVX512_VNNI=on"
"system_info":"AVX = 1 | AVX_VNNI = 0 | AVX2 = 1 | AVX512 = 1 | AVX512_VBMI = 1 | AVX512_VNNI = 1 | FMA = 1 | NEON = 0 | ARM_FMA = 0 | F16C = 1 | FP16_VA = 0 | WASM_SIMD = 0 | BLAS = 1 | SSE3 = 1 | SSSE3 = 1 | VSX = 0 | MATMUL_INT8 = 0 | LLAMAFILE = 1 | "
screnshoot description
total duration:       32.495976862s
load duration:        5.25242ms
prompt eval duration: 31.126234s
prompt eval rate:     0.00 tokens/s
eval count:           13 token(s)
eval duration:        1.186779s
eval rate:            10.95 tokens/s

ollama run phi3:3.8b-mini-instruct-4k-fp16 --verbose
article sumarize
total duration:       3m35.789563621s
load duration:        925.737µs
prompt eval count:    1999 token(s)
prompt eval duration: 37.907926s
prompt eval rate:     52.73 tokens/s
eval count:           1107 token(s)
eval duration:        2m57.780921s
eval rate:            6.23 tokens/s
ollama from git repo date of 08.05.2024
./ollama run llava-llama3:latest --verbose
OLLAMA_CUSTOM_CPU_DEFS="-DLLAMA_BLAS_VENDOR=AOCL-mt -DLLAMA_BLAS=ON -DBLAS_LIBRARIES=/usr/lib/libblis-mt.so -DBLAS_INCLUDE_DIRS=/usr/include/blis -DLLAMA_AVX=on -DLLAMA_AVX2=on -DLLAMA_AVX512=on -DLLAMA_FMA=on -DLLAMA_AVX512_VBMI=on -DLLAMA_AVX512_VNNI=on"
"system_info":"AVX = 1 | AVX_VNNI = 0 | AVX2 = 1 | AVX512 = 1 | AVX512_VBMI = 1 | AVX512_VNNI = 1 | FMA = 1 | NEON = 0 | ARM_FMA = 0 | F16C = 1 | FP16_VA = 0 | WASM_SIMD = 0 | BLAS = 1 | SSE3 = 1 | SSSE3 = 1 | VSX = 0 | MATMUL_INT8 = 0 | LLAMAFILE = 1 | "
article sumarize
total duration:       2m11.17614835s
load duration:        871.753µs
prompt eval count:    2004 token(s)
prompt eval duration: 49.166916s
prompt eval rate:     40.76 tokens/s
eval count:           504 token(s)
eval duration:        1m21.911449s
eval rate:            6.15 tokens/s

Does this mean that building ollama from source will automatically enable avx512_vnni if it is available?  vnni makes a huge difference on visual models.


Update wcstombs-wcstombs-l.md

Starting in Windows 10 version 1803 (10.0.17134.0), the Universal C Runtime supports using a UTF-8 code page. Two bytes for every wide character may not be enough,best to use wcstombs (NULL, wcstr, 0) to get the size correctly.

@tylermsft
Can you review the proposed changes?
When the changes are ready for publication, add a #sign-off comment to signal that the PR is ready for the review team to merge.
#label:"aq-pr-triaged"
@MicrosoftDocs/public-repo-pr-review-team


Mouse up event in code editor.

Version: 1.35.1(1.35.1)
Hash: c7d83e57cd18f18026a8162d042843bda1bcf21f

I has some question about mouse event in code editor.
I developed VSGesture
When I click mouse right button in code editor.

Windows VSCode: Show context menu when mouse up.
Mac VSCode: Show context menu when mouse down.

Why is it difference?

@powerumc This is just an OS difference that we maintain. Try right clicking the desktop wallpaper on mac and windows and you should see the same difference.


Type of Marker Query

Hello,
I just had 2 quick questions relating to markers.
Firstly, can one only use the hiro and kanji markers or can one use a custom image as a marker? If so, how would I go about incorporating this on the marker-camera preset?
Also, can one add a pre-rigged and animated model (from TurboSquid for example) and if so, how would I do this? Would the files need to be converted to JSON in Blender or something?

on adding a model, use the usual three.js/aframe technic - ar.js doesnt enter in this
to learn a new markers, see

marker generator http://jeromeetienne.github.io/AR.js/three.js/examples/markerGenerator/examples/generator.html
detail https://artoolkit.org/documentation/doku.php?id=3_Marker_Training:marker_training

to change the preset=''.

remove the preset=''
add type='pattern' and patternUrl='http://your/markers'

i hoipe this helps

http://jeromeetienne.github.io/AR.js/three.js/examples/markerGenerator/examples/generator.html
The link is not working

where did you get it ?
On Thu, Jun 1, 2017 at 1:21 PM curtello<EMAIL_ADDRESS>wrote:

http://jeromeetienne.github.io/AR.js/three.js/examples/markerGenerator/examples/generator.html
The link is not working
—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub
https://github.com/jeromeetienne/AR.js/issues/67#issuecomment-305477081,
or mute the thread
https://github.com/notifications/unsubscribe-auth/AAPcIlVMnR2LmmWS9qRM2Z7eV6TJIah0ks5r_qy1gaJpZM4NhelH
.

You have just used it when you commented up there on this issue

oh ok my bad. Stuff are moving fast, so backward compatibility isnt easy. i always try to maintain the proper links in the README.md tho, in the examples section
here is the new location for marker training https://jeromeetienne.github.io/AR.js/three.js/examples/marker-training/examples/generator.html


[req] Eliminate unknown-spring-boot fallback in jaeger.service-name

The current behavior In JaegerConfigurationProperties.java#L45 is to fallback to a dummy value if the name property is not set correctly.
Instead, I would like to see an error issued regarding the library being misconfigured instead. Or perhaps disabling any reporting spans. Or an assertion. Possibly anything other than a valid but dummy value that hides the application in tracing.
If opentracing.jaeger.enabled is enabled, we should require a valid value to be set for the application name
In our infrastructure, we end up seeing spans with these unknown-spring-boot entries that developers are unaware are misconfigured. There is a disconnect between the developer wiring their application, and the actual issue being recorded in tracing. There is no (obvious to me) indication that an application was misconfigured and is emitting these garbage application names to tracing. This makes follow-up with the owners very difficult and usually involves a lot of really frustrating chasing.
Thank you!
Possibly related issues:

#73

We could add a configuration property that disables this fallback.
Would you like to contribute this?
On Sat, Mar 6, 2021, 00:27 Daniel Kimsey<EMAIL_ADDRESS>wrote:

The current behavior In JaegerConfigurationProperties.java#L45
https://github.com/opentracing-contrib/java-spring-jaeger/blob/a83e391a7f78fdf3d88094b7ed0e4854cd0a68fa/opentracing-spring-jaeger-starter/src/main/java/io/opentracing/contrib/java/spring/jaeger/starter/JaegerConfigurationProperties.java#L45
is to fallback to a dummy value if the name property is not set correctly.
Instead, I would like to see an error issued regarding the library being
misconfigured instead. Or perhaps disabling any reporting spans. Or an
assertion. Possibly anything other than a valid but dummy value that hides
the application in tracing.
If opentracing.jaeger.enabled is enabled, we should require a valid
value to be set for the application name
In our infrastructure, we end up seeing spans with these
unknown-spring-boot entries that developers are unaware are
misconfigured. There is a disconnect between the developer wiring their
application, and the actual issue being recorded in tracing. There is no
(obvious to me) indication that an application was misconfigured and is
emitting these garbage application names to tracing. This makes follow-up
with the owners very difficult and usually involves a lot of really
frustrating chasing.
Thank you!
Possibly related issues:

#73
https://github.com/opentracing-contrib/java-spring-jaeger/issues/73

—
You are receiving this because you are subscribed to this thread.
Reply to this email directly, view it on GitHub
https://github.com/opentracing-contrib/java-spring-jaeger/issues/122,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/ABBMDP2KQWLMHONOXQ46MGLTCFLDPANCNFSM4YV7TL3A
.

Well, a configuration to disable the fallback leads us to the same issue. The out of the box defaults will produce bad traces. I believe the library should be more strict with it's default configuration. In essence, it should require a valid name be set if it's enabled.
Right now, I'm chasing down multiple applications that are generating unknown traces and it's not fun trying to find out where or who is generating them!
I could try to contribute it. But I'm not a Java developer. If the change is simple enough, I may be able to do it. And if not, I'll ask a favor of a coworker! But first, I think agreeing on a solution would be ideal.

I don't really want to change the default behavior as it had been around since the inception of the library and folks haven't complained.
Opting in to being more strict sounds like the best way to go to me.
The change should be simple to make.

The issue we've found with an opt-in behavior is that simply put, we haven't fixed anything. If the client is misconfigured (never declared a service name), how is adding another flag to require the name flags be set going to address the root cause?
I've got hundreds of deployed instances from many different teams at different revisions. Tracking down these "unknown-spring-boot" instances is an operational nightmare and worse, not something I can fix. I then have to track down the application owners and point them to the docs and convince them to fix it. It's frustrating to say the least since it introduces bad data to the tracing system and isn't an error that's obvious to the developer.
Is there a precedence for this behavior (a dummy service name default?). I checked other languages' jaeger libraries and none of them appear to insert dummy values for the service name (my search was not exhaustive).
The go library requires a service name be set.
The java library requires a service name be set.
The python library requires a service name be set.
This leads me to believe it's this library is setting a bad default, and the behavior should be removed in favor of an appropriate fatal error.


Failed to set namespaced invokable controller as route action using ::class notation

Laravel Version: 5.3.22
PHP Version: 7.0
Database Driver & Version: any

Description:
As description said:  setting namespaced invokable controller as route action using ::class notation causes Invalid route action exception when that controller class imported in routes.php using use statement and then controller name retrieved using ::class notation.
To keep track classes usage and to enable type analysis in IDE to be able to utilizing IDE refactoring features (rename/move) in PHPStorm we import controller classes and use ::class notation. Having App\Http\Controllers\Test controller but referencing it as Test breaks this approach, as well as IDE types analysis (but not limited to IDEs only). While there are a lot of nice workarounds from swapping with own Route facade root to patching laravel/framework and using own fork, I decided to discuss it here as I'm pretty sure I'm not the one who faces with this issue (I hit it with 5.1 initially, if I recall it right).
Steps To Reproduce:

Create namespaced controller with __invoke() method.
Set controller as route action, e.g. Route::get('/login', App\Http\Controllers\Test::class).
Request any http url or run any artiasn command to see the error.

The issue reside in \Illuminate\Routing\Router::prependGroupUses() method when we doubl-prepend controllers namespace specified in \App\Providers\RouteServiceProvider::$namespace.

It looks like probing whether controller name already namespaced before appending it with strpos($uses, $group['namespace'].'\\') !== 0 condition solves the issue.
    /**
     * Prepend the last group uses onto the use clause.
     *
     * @param  string  $uses
     * @return string
     */
    protected function prependGroupUses($uses)
    {
        $group = end($this->groupStack);

        return isset($group['namespace']) && strpos($uses, '\\') !== 0 && strpos($uses, $group['namespace'].'\\') !== 0 ? $group['namespace'].'\\'.$uses : $uses;
    }

Are we OK with this sort of changes? If so, I will PR immediately.

I tested here and it works as expected:
Laravel 5.3.21
PHP 7.0.8
Route::get('/', HomeController::class)->name('home');

You're most likely defining that route inside the default Route group which already has a namespace App\Http\Controllers defined, try to pass only Test::class instead of App\Http\Controllers\Test::class:
Route::get('/login', Test::class);

@brunogaspar to keep track on classes usage I explicitly import class and use ::class notation. Having App\Http\Controllers\Test controller but referencing it as Test breaks type analysis in IDE which leads to issues during utilizing IDE refactoring features (rename/move) in PHPStorm at least. While there are a lot of nice workarounds from swapping with own Route facade root to patching laravel/framework and using own fork, I decided to discuss it here as I'm pretty sure I'm not the one who faces with this issue (I hit it with 5.1 initially, if I recall it right).

Ah makes sense. But you should mentioned that on the OP :)
But seems a bug though, nice catch.

Meh, it's really a bug in the route registration. The web.php routes file is already loaded with a namespace prefix but you are still passing the full controller class name. Fixing this "bug" would just open up another one where I can't have a controller with a namespace that matches the root namespace.


gclient sync landmines error after upgrade to python 3.7

Description:
The failure happens when executing gclient sync.
Error:
________ running 'python3 src/build/landmines.py' in '/Users/aaclarke/dev/engine'
Clobbering due to:
--- old_landmines	Mon Jul 19 15:25:21 2021
+++ new_landmines	Mon Aug  9 11:25:26 2021
@@ -1 +1 @@
-Lets start a new landmines file.
+b"Let's start a new landmines file."
Traceback (most recent call last):
  File "src/build/landmines.py", line 135, in <module>
    sys.exit(main())
  File "src/build/landmines.py", line 129, in main
    clobber_if_necessary(landmines)
  File "src/build/landmines.py", line 80, in clobber_if_necessary
    clobber.clobber(out_dir)
  File "/Users/aaclarke/dev/engine/src/build/clobber.py", line 99, in clobber
    delete_build_dir(path)
  File "/Users/aaclarke/dev/engine/src/build/clobber.py", line 60, in delete_build_dir
    shutil.rmtree(build_dir)
  File<EMAIL_ADDRESS>line 504, in rmtree
    onerror(os.path.islink, path, sys.exc_info())
  File<EMAIL_ADDRESS>line 502, in rmtree
    raise OSError("Cannot call rmtree on a symbolic link")
OSError: Cannot call rmtree on a symbolic link
Error: Command 'python3 src/build/landmines.py' returned non-zero exit status 1 in /Users/aaclarke/dev/engine
Clobbering due to:
--- old_landmines	Mon Jul 19 15:25:21 2021
+++ new_landmines	Mon Aug  9 11:25:26 2021
@@ -1 +1 @@
-Lets start a new landmines file.
+b"Let's start a new landmines file."
Traceback (most recent call last):
  File "src/build/landmines.py", line 135, in <module>
    sys.exit(main())
  File "src/build/landmines.py", line 129, in main
    clobber_if_necessary(landmines)
  File "src/build/landmines.py", line 80, in clobber_if_necessary
    clobber.clobber(out_dir)
  File "/Users/aaclarke/dev/engine/src/build/clobber.py", line 99, in clobber
    delete_build_dir(path)
  File "/Users/aaclarke/dev/engine/src/build/clobber.py", line 60, in delete_build_dir
    shutil.rmtree(build_dir)
  File<EMAIL_ADDRESS>line 504, in rmtree
    onerror(os.path.islink, path, sys.exc_info())
  File<EMAIL_ADDRESS>line 502, in rmtree
    raise OSError("Cannot call rmtree on a symbolic link")
OSError: Cannot call rmtree on a symbolic link

Platform:
macOS 11.5.1
Note:
python3.7 is required to run the luci.py script.

ping @cbracken, https://github.com/flutter/buildroot/pull/495 is likely the cause.

Taking a look -- thanks for the heads-up.

Can we just remove landmines.py and the associated .landmines? We don't use these and its an unnecessary gclient step.

Yeah was just looking and a diff here nukes the file but we never actually write these. Sending a patch.

Closed by flutter/engine#27967


[BUG] Changing pagination limit doesn't update stats properly

I noticed that if for any reason the new pagination limit set using `mixer.paginate()' is a string (which happens quite often with jQuery's val() function) the endPageAt variable in the pagination stats will not be updated properly.
It's simple to fix it by making sure that the value passed is actually a number but perhaps an additional parseInt() somewhere in the mixitup pagination code when setting a new limit wouldn't be a bad idea?

It's a bit more difficult than that because the .paginate() API method is very flexible. For example, all of the following calls are valid:
.paginate(1);

.paginate('next');

.paginate({
   page: 3,
   limit: 10
});

.paginate(anchorElement);

Therefore a blanket parseInt() won't work. I could call parseInt and then check for isNaN, but then that's just another layer of duck typing that would have to be applied to all input types, on top what's already there. So I think it's probably best if the consumer just validates their input first.

I finally got around to looking into this, but I was unable to recreate any issue relating to sending a number in string form to the .paginate() method. I will close for now, but this is still an issue, or you have specific steps to recreate, please let me know and I will reopen.


implement PrepareDistortedPix as part of DegradeImage

Fixes https://github.com/tesseract-ocr/tesseract/issues/1052

Shree, I don't think mixing the distort & degrade methods is right.
Basically, the distort method should be directly called from text2image.cpp.

0 (50% percents of images inverted).
Is that a realistic expectation of the types of images which will be OCRed?

Generally no, but...
If you want good accuracy for inverted images, you should train with enough samples.

If you want good accuracy for inverted images, you should train with enough samples.

OK, that makes sense. I will change it to 0.
Thanks!

Thanks!

Thank you too :-)


[common] Add controller type none

Description of the change

Add controller type none
Benefits

Support charts that do not deploy pods such as the zalando-postgres-cluster
Possible drawbacks

Another version bump
Applicable issues

fixes NA

Additional information

Checklist

[x] Chart version bumped in Chart.yaml according to semver.

Change looks good, but looks like there are merge conflicts on the README files :(


Updated dependencies' versions #12

Codecov Report
Base: 73.70% // Head: 72.29% // Decreases project coverage by -1.41% :warning:

Coverage data is based on head (687d4e5) compared to base (ee0bc07).
Patch coverage: 75.00% of modified lines in pull request are covered.

Additional details and impacted files
@@            Coverage Diff             @@
##             main      #13      +/-   ##
==========================================
- Coverage   73.70%   72.29%   -1.42%
==========================================
  Files          11       11
  Lines         483      462      -21
==========================================
- Hits          356      334      -22
- Misses        127      128       +1

Impacted Files
Coverage Δ

tests/test_standalone_app.py
91.11% <72.72%> (-8.89%)
:arrow_down:

...amples/central_system/standalone/central_system.py
66.66% <100.00%> (+12.49%)
:arrow_up:

ocpp_asgi/router.py
70.46% <0.00%> (-5.37%)
:arrow_down:

ocpp_asgi/app.py
58.51% <0.00%> (-1.49%)
:arrow_down:

Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here.

:umbrella: View full report at Codecov.
:loudspeaker: Do you have feedback about the report comment? Let us know in this issue.


Changing blend mode in newly added layer breaks the shaders in the sandbox example

How to replicate -
in the sandbox example with Suzanne (https://4tdfb.sse.codesandbox.io/) - Just add a new layer and change the blend mode.
I see also that the blend modes are all CAPITAL letters in contrast with the existing layers. so it is maybe a lead to culprit.
Attaching a file with the console error log.
4tdfb.sse.codesandbox.io-1644904640442.log

That is probably an outdated sandbox, the latest Configurator example is here


Build failure after upgrading Gem dependency

Hi there, I noticed when bumping unf_ext versions I'm now seeing the following crash when building this Gem:
23:46:24 Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
23:46:24
23:46:24 current directory:
23:46:24 /home/user/foo/vendor/bundle/ruby/3.0.0/gems/unf_ext-0.0.9/ext/unf_ext
23:46:24 /home/user/.rvm/rubies/ruby-3.0.2/bin/ruby extconf.rb
23:46:24 checking for -lstdc++... yes
23:46:24 creating Makefile
23:46:24
23:46:24 current directory:
23:46:24 /home/user/foo/vendor/bundle/ruby/3.0.0/gems/unf_ext-0.0.9/ext/unf_ext
23:46:24 make DESTDIR\= sitearchdir\=./.gem.20231114-28669-3tit6o
23:46:24 sitelibdir\=./.gem.20231114-28669-3tit6o clean
23:46:24
23:46:24 current directory:
23:46:24 /home/user/vendor/bundle/ruby/3.0.0/gems/unf_ext-0.0.9/ext/unf_ext
23:46:24 make DESTDIR\= sitearchdir\=./.gem.20231114-28669-3tit6o
23:46:24 sitelibdir\=./.gem.20231114-28669-3tit6o
23:46:24 compiling unf.cc
23:46:24 unf.cc:39:3: sorry, unimplemented: non-trivial designated initializers not
23:46:24 supported
23:46:24    };
23:46:24    ^
23:46:24 unf.cc:39:3: sorry, unimplemented: non-trivial designated initializers not
23:46:24 supported
23:46:24 Makefile:212: recipe for target 'unf.o' failed
23:46:24 make: *** [unf.o] Error 1
23:46:24
23:46:24 make failed, exit code 2

Closing as a duplicate of https://github.com/knu/ruby-unf_ext/issues/74


Throw error when use rgb/rgba functions with css variables

NPM version (6.14.5):
Node version (v14.4.0):
node-sass version (4.14.1):

Example
.button {
 --primary-color: 33, 150, 243;
}

.button--primary {
   background-color: rgb(var(--primary-color));
}

Expected outcome:
.button--primary {  background-color: rgb(var(--primary-color)) }
Actual outcome:
SassError: Function rgb is missing argument $green.
I saw many issue like this but I think this issue not handled yet.
I don't expect SASS resolve css variable however this input should not throw.
Thanks

when use RGB function with uppercase node-sass not throw error but I don't want use function names uppercase this is looks so ugly

try this hacky workaround
@function rgb($args...) {
  @return r#{g}#{b}(#{$args})
}

https://sass-lang.com/blog/libsass-is-deprecated

try this hacky workaround
@function rgb($args...) {
  @return r#{g}#{b}(#{$args})
}

https://sass-lang.com/blog/libsass-is-deprecated

Hi, where are you placing this function?

Switching from the deprecated node-sass to dart-sass fixes this.


Added by triptic1412

I resolved your marge conflict and marged in to main please do follow me on Github and Linkedin happy to connect with you.

Thank you for helping a beginner with this repository. I'll surely follow them.


Update Issue - 25169810

default description
URL tested: http://ci.bsstag.com/welcome
Open URL on Browserstack

Property
Value

Browser
Chrome 73.0

Operating System
Windows 7

Resolution
1024x612

Screenshot Attached
Screenshot URL

Click here to reproduce the issue on Browserstack

Updated Screenshot Attached


Add Ies Martinez Montañes

@Jojo1542 First stage of verification passed, official domain is iesmartinezm.es as far as I verified. This is just an informational note. Pull request is still in the review. I appreciate your patience while waiting for the final decision.

@Jojo1542 Thank you for your patience while waiting for a review and processing your request. Pull request merged.


when to call connection.release() in pool

Hello - Doug?
I have this:
var mysql = require('mysql');
var poolCluster	= null;

exports.getStatus = function(octet,callback) {
  var sys_conns = {
     INFO : {
	host: '192.168.3.'+octet,
	user: 'user',
	password: 'pass',
	database:'INFO'
      }
  }
   poolCluster = mysql.createPoolCluster();
   poolCluster.add('INFO', sys_conns.INFO);

   getConn (octet,function(err, connection) {
	if(connection){
		callback(connection);
	} else {
		callback('no connection');
	}
   });
}

function getConn (octet,callback) {
    poolCluster.getConnection(function (err, connection) {
	if(err) {console.log(err); callback(err);}
	if(connection){
		connection.query("SELECT something as status FROM table;", function(err, rows) {
			callback(err,rows);
	        connection.release(); // either here
            });
		connection.release(); // or here - neither work
	} else {
		callback('callback: '+err);
	}
    });
}

the problem is the connection just sleeps after executing the query - it does not seem to get released and upon refresh, the connections build up until I restart the app.
any ideas?  Thanks!

Hi @phpmydev you're using a connection pool -- releasing a connection does not close it, but leaves it sleeping until you use it again. https://en.wikipedia.org/wiki/Connection_pool

I'm not sure what you mean. "ow to pass in the octet in the ip address" what does that mean, can you show an example?

I'm just getting the last octet from app.js which gets it from the index page javascript
all I really need iis a way to connect to the db at <IP_ADDRESS> let's say using the dynamic octet (12, 15,.etc)
I really appreciate your attention Doug!

You can specify the host when you create a new connection: https://github.com/mysqljs/mysql#establishing-connection

Great! Thank you, I sometimes wish I knew how to search better!

It's no problem at all :)


http plugin ignores spaces in URI

Describe the bug
After upgrading from 0.126.4 to 0.126.6 my http plugin to read my power meter via a tasmota sensor is not working anymore. There is a decoded space in the URI which seems to be parsed incorrectly after upgrading.
Here is the correct answer from Tasmota:
{   "StatusSNS": {     "Time": "2024-06-06T14:40:43",     "LK13BE": {       "total": 9737.9067,       "total_1d": 2.9,       "total_7d": 24.2,       "total_30d": 110.3,       "total_365d": 3720.8,       "current": -1938,       "total_out": 31763.1502     }   } }
This is the answer of a GET request to http://<IP_ADDRESS>/cm?cmnd=Status (without %208) in the end -> this is also logged in trace mode, evcc ignores %208:
{   "Status": {     "Module": 1,     "DeviceName": "Tasmota",     "FriendlyName": [       "Tasmota"     ],     "Topic": "/tasmota",     "ButtonTopic": "0",     "Power": 0,     "PowerOnState": 3,     "LedState": 1,     "LedMask": "FFFF",     "SaveData": 1,     "SaveState": 1,     "SwitchTopic": "0",     "SwitchMode": [       0,       0,       0,       0,       0,       0,       0,       0     ],     "ButtonRetain": 0,     "SwitchRetain": 0,     "SensorRetain": 0,     "PowerRetain": 0,     "InfoRetain": 0,     "StateRetain": 0,     "StatusRetain": 0   } }
Steps to reproduce

create a custom meter with http source including a uri with %20 as space
run evcc in tracing mode

Configuration details
meters:
- type: custom # IR-Lesekopf Tasmota
  name: grid1
  power:
    source: http
    uri: http://<IP_ADDRESS>/cm?cmnd=Status%208
    method: GET
    headers:
        - content-type: application/json
    jq: .StatusSNS.LK13BE.current

Log details
[http  ] TRACE 2024/06/06 15:31:50 GET http://<IP_ADDRESS>/cm?cmnd=Status 8

[http  ] TRACE 2024/06/06 15:31:50 {"Status":{"Module":1,"DeviceName":"Tasmota","FriendlyName":["Tasmota"],"Topic":"/tasmota","ButtonTopic":"0","Power":0,"PowerOnState":3,"LedState":1,"LedMask":"FFFF","SaveData":1,"SaveState":1,"SwitchTopic":"0","SwitchMode":[0,0,0,0,0,0,0,0],"ButtonRetain":0,"SwitchRetain":0,"SensorRetain":0,"PowerRetain":0,"InfoRetain":0,"StateRetain":0,"StatusRetain":0}}

[site  ] ERROR 2024/06/06 15:31:50 grid meter: strconv.ParseFloat: parsing "<nil>": invalid syntax

What type of operating system are you running?
Docker container
Version
0.126.6

https://github.com/evcc-io/evcc/issues/14175
is fixed in Nightly

Oh great, didn‘t find this issue. Thanks!

Oh great, didn‘t find this issue. Thanks!


The effect of varying the width of Browser Window

[X] This is a question about using the theme.
[X] I have updated all gems with bundle update.
[X] I have tested locally with bundle exec jekyll build.
[X] I have not modified assets in such a way that will affect the width of any element

Environment Information

Minimal Mistakes version: 3.2.10
github-pages or jekyll gem version: 3.1.6
Operating system: Ubuntu

Hi Michael,
I have studied a bit a similar issue that was posted almost two years ago and then discussed again recently. In one of your comments there you mentioned that "you are working on a complete rewrite of the theme which should make customizing things a bit easier". This is version 3.2.10 of the theme, therefore I decided to open a new issue and ask a similar question.

This is a 1275x684 image captured from my Browser. My desktop background can be seen at the vertical edges of the image. You can measure the left and right margin of the images grid using a screen ruler and find that it is 2x120pixels = 240pixels. The total length of the browser window is about 1240pixes wide and therefore subtracting the margins we are left with a content area width of about 1000pixels.
My question is what are the theme files I should modify and where exactly to increase the content area width, i.e. decrease the left and right margin of the browser window ?
To make things a bit more interesting, let us put in the game the sidebar.

The width of the image captured from my Browser is the same and the width of the browser window has not been modified. If we measure again the right margin from the edge of the browser window, we find that it is 300 pixels ! I am not sure what is the width of the sidebar, it will be nice to help me put a background color, but If I measure from the point the social media images start I get 120pixels. This is the same margin I had without the side bar.
This indicates that somehow when you add the sidebar, the width of the content area is shrinked because the right margin has been increased ! How is it possible to fix the right margin, e.g. 120 pixels in this example ?
You may also consider that If you experiment with even larger sizes of a browser window, e.g. 1900px then you get a right margin of about 520px wide and a left margin of about 300px !
Thanks in advance for any effort to solve that problem and to answer my question.
PS: I think you will greatly assist your users if you can write some documentation on how you applied Susy responsive framework, especially how do you modify width of content area and sidebar and how is that affected by changing the width of the browser window ?

To start I'd suggest you fire up the web developer tools in whatever browser you're using. This will allow you to inspect any element on the page to get a class name and CSS declarations.

Once you do that it's a lot easier to see what's going on. Essentially the content is wrapped in a div #main that is centered on the page and has a max width of 1024 - 1280px depending on your screen size.

Inside of that is the .sidebar and .page containers. Each of those have various widths so they can adapt at various screen sizes. You'll want to play with those values.

.page has some padding on the right to keep it from spilling out completely and accomodate the optional table of contents list that can be added to posts/pages.
The CSS for these are mostly in assets/_scss/_page.scss. You'll see I'm using Susy mixins the determine the width of these elements. There are also some prefix and suffix mixins from Susy used to add space before and after.
.page {
  @include breakpoint($large) {
    @include span(10 of 12 last);
    @include prefix(0.5 of 12);
    @include suffix(2 of 12);
  }

  .page__inner-wrap {
    @include full();

    .page__content,
    .page__meta,
    .page__share {
      @include full();
    }
  }
}

Any of these values can be changed you'll just have to make sure they add up to 12 or else things will break and not line-up. Susy is really powerful so I'd suggest you read their docs to fully understand what's going on and how to use the mixins.

Good morning Michael,
I am aware of the css box model but I have not played with sass and the sussy responsive framework. Before diving into the details of scss files, let me recapitulate the problem I have with the single page layout of your theme.

If you examine the metrics pane on this captured image you will see that the padding-right of article.page element is 167px but the padding-left is only 42px. If you compare this with article-splash' element on your splash layout there is no padding at all defined. I cannot understand the logic behind this large padding-right. As a result of this, there is hardly any resize of  section.page__content` in  a large screen.

Therefore If I am right MY problem is how to disable or reduce that padding-right margin, right ? How is that related with the columns of sussy framework ?

Here's the logic.
.page has padding applied to the right while .splash and .archive do not.
This is done to "visually center" it so things look more pleasing if the sidebar is disabled. It also helps reduce the line-length of the text which is good for readability. Long lines of text are harder to read as the eye can have problems tracking position. It is a good rule of thumb to limit characters to around 60-70 for a better experience.

The how. .page has 3 Susy mixins applied. span dictates it's width. prefix the padding before it (small green box on it's left) and suffix the padding after (the larger green box on the right).
You can change any of those values to get the widths you want. The keyword last on @include span(10 of 12 last); removes the margin on the right so things don't overflow.
If you read through Susy's documentation it will all make much more sense. There really is no magic to Susy.

Super, your explanation make things far more clear regarding to the Sussy magic ;-)
Indeed, in order to increase or decrease the padding-right (larger green box on the right) you may vary the @include suffix (2 of 12);
In your previous comment you also mentioned that:

Any of these values can be changed you'll just have to make sure they add up to 12 or else things will break and not line-up.

Could you please also clarify what are the elements and their corresponding column values that they add up to 12, the size of div #main, for the two layouts you included, i.e. single and splash ? That will be great.

Sure.
#main holds all of the main content (sidebar, center column, etc.). This uses Susy's container mixin which essentially gives it a max-width to keep it controlled. This value is set in assets/_variables.scss with this line:
container: $large

$large is a SCSS variable that maps to 1280px. So after compiling #main will have a declaration of max-width: 1280px;. Meaning it will never be larger than 1280px.
It also has a 12 column grid applied to it. If you turned on the debugger in Susy you'd see 12 blue columns across that container. These are the 12 that I use to align and size the .sidebar and .page.

If I simplify the CSS you essentially have this: a 2 column sidebar and a 10 column page declared with the @include span(x of x) mixin. 2 + 10 = 12
.sidebar {
  @include span(2 of 12);
}

.page {
  @include span(10 of 12 last);
}

The prefix and suffix stuff applies padding which you can view as "internal" spacing that doesn't count towards the 12 column stuff.
If for example you wanted to make the sidebar even thinner you could do:
.sidebar {
  @include span(1 of 12);
}

.page {
  @include span(11 of 12 last);
}

Being mindful to add up to 12 so the math works out. 1 + 11 = 12.

Closing as I believe I've addressed and answered the question. If that's not the case feel free to re-open the issue.

See #2093


Update Get-SPProjectEnterpriseProjectTaskSync.md

Filled in missing text

:white_check_mark: Validation status: passed

File
Status
Preview URL
Details

sharepoint/sharepoint-ps/sharepoint-server/Get-SPProjectEnterpriseProjectTaskSync.md
:white_check_mark:Succeeded
View (sharepoint-ps)

For more details, please refer to the build report.
Note: If you changed an existing file name or deleted a file, broken links in other files to the deleted or renamed file are listed only in the full build report.


Merge exit code fixes from PR#432 and PR#430 to Xcode 11.2 branch

This PR is to merge the exit code fixes/improvements from https://github.com/linkedin/bluepill/pull/432 and https://github.com/linkedin/bluepill/pull/430 in to xcode-11.2 branch with Xcode 11.2 support.
\cc @ob @oliverhu @chenxiao0228 @RainNapper

Thank you Oscar for the approval. 👍


Upgrading to 0.19.14 breaks listener- and supabase-types.

Describe the bug
I am trying to update wxt from 0.19.13 to 0.19.14.
I am getting errors in some listener types:
class SyncProductsManager {
  private static instance: SyncProductsManager | null = null;
  private accountStatusListenerRef?: (details: WebRequest.OnBeforeRequestDetailsType) => void;

    // Static method to provide the singleton instance
  public static getInstance(): SyncProductsManager {
    if (!SyncProductsManager.instance) {
      SyncProductsManager.instance = new SyncProductsManager();
    }
    return SyncProductsManager.instance;
  }

  //This method is called in the background script
  public attachListeners() {
    if (!this.accountStatusListenerRef) {
      this.accountStatusListenerRef = this.accountStatusListener.bind(this);
      browser.webRequest.onBeforeRequest.addListener(
        this.accountStatusListenerRef,// gives me the following error : Argument of type '(details: OnBeforeRequestDetailsType) => void' is not assignable to parameter of type '(details: OnBeforeRequestDetailsType) => BlockingResponseOrPromise | undefined'.
        {
          urls: [
            'https://merch.amazon.com/api/ng-amazon/coral/com.amazon.gearaccountservice.GearAccountService/GetAccountStatus',
          ],
        },
        ['requestBody'],
      );
    }
  }

  accountStatusListener(details: WebRequest.OnBeforeRequestDetailsType) {
      //...

      browser.webRequest.onBeforeRequest.removeListener(this.accountStatusListenerRef);// gives me the following error : Argument of type '(details: OnBeforeRequestDetailsType) => void' is not assignable to parameter of type '(details: OnBeforeRequestDetailsType) => BlockingResponseOrPromise | undefined'.
      this.accountStatusListenerRef = undefined;
    }
  }
}

it also "destroys" my supabase types that I am generating with pnpx supabase gen types so there is no more intellisense for my tables for example and basically every property on any table "does not exist".
do you have any idea of what is going on?
In discord you asked me to run a few commands
so pnpm why @types/chrome returns
devDependencies:
wxt 0.19.13
└── @types/chrome 0.0.269

and pnpm why @types/webextension-polyfill
devDependencies:
wxt 0.19.13
└── @types/webextension-polyfill 0.10.7

Reproduction
.
Steps to reproduce
No response
System Info
System:
    OS: Windows 10 10.0.19045
    CPU: (16) x64 AMD Ryzen 7 5800X 8-Core Processor
    Memory: 13.65 GB / 31.93 GB
  Binaries:
    Node: 20.15.0 - C:\Program Files\nodejs\node.EXE
    npm: 10.8.1 - C:\Program Files\nodejs\npm.CMD
    pnpm: 9.4.0 - ~\AppData\Roaming\npm\pnpm.CMD
  Browsers:
    Edge: Chromium (130.0.2849.68)
    Internet Explorer: 11.0.19041.4355
  npmPackages:
    wxt: ^0.19.16 => 0.19.16

Used Package Manager
pnpm
Validations

[X] Read the Contributing Guidelines.
[X] Read the docs.
[X] Check that there isn't already an issue that reports the same bug to avoid creating a duplicate.
[X] Check that this is a concrete bug. For Q&A open a GitHub Discussion or join our Discord Chat Server.
[X] The provided reproduction is a minimal reproducible example of the bug.

Please run the same why commands when WXT 0.19.14 is installed. Likely a mismatch between two different versions of the same package type. Simple fix: delete your lockfile and re-install.
More complex fix, identify which packages depend on each version of the types package and make sure only one version is installed. Could be as simple as pnpm i @types/webextension-polyfill@latest && pnpm rm @types/webextension-polyfill of the types package, or running the pnpm update @types/webextension-polyfill.

So with 0.19.14 installed
pnpm why @types/chrome
logs
devDependencies:
wxt 0.19.14
└── @types/chrome 0.0.280

and
pnpm why @types/webextension-polyfill
logs
devDependencies:
wxt 0.19.14
└── @types/webextension-polyfill 0.12.1

These are the dependencies:
  "devDependencies": {
    "@sentry/vite-plugin": "^2.22.6",
    "@sveltejs/vite-plugin-svelte": "^3.1.2",
    "@tsconfig/svelte": "^5.0.4",
    "autoprefixer": "^10.4.20",
    "svelte": "^4.2.19",
    "svelte-check": "^3.8.6",
    "tailwindcss": "^3.4.15",
    "tslib": "^2.8.1",
    "typescript": "^5.6.3",
    "wxt": "^0.19.14"
  },
  "dependencies": {
    "@podsuite/components": "workspace:*",
    "@podsuite/types": "workspace:*", //internal types package that also contains the generated types from the supabase cli
    "@sentry/svelte": "^8.39.0",
    "@supabase/supabase-js": "^2.46.1",
    "@webext-core/messaging": "^2.1.0",
    "@webext-core/storage": "^1.2.0",
    "lucide-svelte": "^0.460.1"
  }

Hmm, interesting. Seems like there were just some breaking changes to the types that effected you. Did you try updating your code to fix the type errors?
For Argument of type '(details: OnBeforeRequestDetailsType) => void' is not assignable to parameter of type '(details: OnBeforeRequestDetailsType) => BlockingResponseOrPromise | undefined'.
- private accountStatusListenerRef?: (details: WebRequest.OnBeforeRequestDetailsType) => void;
+ private accountStatusListenerRef?: (details: WebRequest.OnBeforeRequestDetailsType) => WebRequest.BlockingResponseOrPromise | undefined;

- accountStatusListener(details: WebRequest.OnBeforeRequestDetailsType) {
+ accountStatusListener(details: WebRequest.OnBeforeRequestDetailsType): WebRequest.BlockingResponseOrPromise | undefined {

Not sure why, but TS does consider undefined and void return types different.

I'm not familiar with supabase, so I can't comment on how to fix the issues with your type generation. Seems unrelated to the type changes of the polyfill.

Ok I think I found the issue with at least the supabase part
I was initializing my supabase client like this:
const storageAdapter = {
  getItem: async (key: string) => {
    const result = await browser.storage.local.get(key);
    return result[key];
  },
  setItem: async (key: string, value: string) => {
    await browser.storage.local.set({ [key]: value });
  },
  removeItem: async (key: string) => {
    await browser.storage.local.remove(key);
  },
};

export const supabase = createClient<Database>(
import.meta.env.VITE_SUPABASE_URL
import.meta.env.VITE_SUPABASE_ANON_KEY,
  {
    global: { fetch: fetch.bind(globalThis) },
    auth: { storage: storageAdapter },
  },
);

but after the wxt-update to 0.19.14 it complained about a type mismatch so I had to turn the adapter into:
const storageAdapter = {
  getItem: async (key: string): Promise<string | null> => {
    const result = await browser.storage.local.get(key);
    return result[key] ? String(result[key]) : null;
  },
  setItem: async (key: string, value: string): Promise<void> => {
    await browser.storage.local.set({ [key]: value });
  },
  removeItem: async (key: string): Promise<void> => {
    await browser.storage.local.remove(key);
  },
};

which made the types resolve. Probably because of the @types/chrome update because I didn't update supabase-js?

As for the listeners, updating the return types as you suggested fixed most of the typescript errors but there is one thing left:
  accountStatusListener(details: WebRequest.OnBeforeRequestDetailsType): WebRequest.BlockingResponseOrPromise | undefined {
    if (this.accountStatusListenerRef && details.method === 'POST' && details.requestBody?.raw) {
      const raw = details.requestBody.raw[0].bytes;
      const textDecoder = new TextDecoder('utf-8');
      const decodedString = textDecoder.decode(new Uint8Array(raw)); //the raw object is of type "unknown"
      try {
        const jsonData = JSON.parse(decodedString);
        extensionStorage.setItem('amazonAccountId', jsonData.ContentOwnerId);
      } catch (e) {
        console.error('Failed to parse JSON:', e);
      }

      browser.webRequest.onBeforeRequest.removeListener(this.accountStatusListenerRef);
      this.accountStatusListenerRef = undefined;
      return; //returning because of the "undefined" return type
    }
  }

as you can see in the comments, the raw object is of type unknown. Do I just cast it as array buffer?
Also please let me know if I should return anything else from the return statement at the bottom

I don't know the specifics of the webrequest API, never used it. Glad you got it working. Just an FYI, in the next major version, 0.20.0, WXT is dropping the polyfill and you'll have to update the types again :/ but that should be the last time. You can get ahead of this by disabling the polyfill now. Might provide better types than the polyfill, like the buffer type.
https://wxt.dev/guide/essentials/extension-apis.html#disabling-the-polyfill


Allow newer patches to symfony/http-foundation

Change the composer symfony/http-foundation PATCH version to allow newer patches. Right now we can not install it in our Symfony application due to a version number mismatch.

The build fails for the PHP nightly version. It seems like PHPUnit 6 dropped support for PHPUnit_Framework_TestCase:
https://github.com/sebastianbergmann/phpunit/wiki/Release-Announcement-for-PHPUnit-6.0.0#backwards-compatibility-issues
Any tips about this?

Thank you!
We were explicitly fixing http-foundation to 2.7.10 because 2.7.11 was introducing a dependency to symfony/polyfill-mbstring that we wanted to avoid. But it might be time to move forward with that.

Also, recently, PHP nightly started to fail for the reason you mentioned. As I have not found a simple fix, for now we will stop testing that.


Added Additional Hint for Processing Parts of a Date

Hint for time.Parse alone is not helpful. Even minor changes can render the time incorrect. This could be frustrating for learners.

The link that André provided at the top contains exactly the information you saw in the source code, you only need to scroll down a bit (after the code block). It is generated from the source code that is why the information is the same. Please change the PR to use the link suggested above instead of a link to the source code. Copying some parts is not necessary. Learning to read the official docs is a good thing as part of the learning process on Exercism.

Official docs for the time package constants contains a lot more info than whats asked in the exercise. Even minor formatting changes will produce a completely different time output. That's why I think relevant sections from the official documentation should be a part of the instruction.
I have updated the link, but don't think it is a good idea.
Learning to read the official docs is a good thing, but it would be appropriate to expect learners to go through the official docs in the next iteration of a learning exercise based on time.


B #5859: Sunstone wrong font-color on cloud view and admin view vm in…

…statiate network
Signed-off-by: Kristian Feldsam<EMAIL_ADDRESS>

closed as explained on: https://github.com/OpenNebula/one/pull/5956#issuecomment-1296804316


Turbolinks crashes when elements in head change.

We at sofatutor.com just discovered a bug in turbolinks (as we currently think), which makes our page crash once a DOM element in the head section of the page changes slightly.
We discovered this due to an external script which was adding data attributes to every DOM element in the head. So now when we add for example an async='true' attribute (or some data attribute) to an arbitrary script tag in the head, the whole page crashes when opening the next turbolinks enabled page. I would at least have expected a DOM change in the head triggering a full turbolinks reload. Unfortunately it is first reloading the body js and then the scripts in the head which leads to a lot of Uncaught TypeError: Cannot read property '...' of undefined errors.
Feel free to point me to a solution if the error is actually on our side. Thanks for you help!

Hi @mfittko, which version of Turbolinks are you using? and are you able to create a minimal demo of this?

@domchristie It's turbolinks 5.1.1. I tried to dive into the internals and I saw that elements in the head are stored in a key value store where the html of the tags are the keys. So it's kinda clear why turbolinks decides to re-add these dom elements when their signature changes. try to do the demo later when I'm on a mac :)


Generating a sitemap

How would you suggest handling XML sitemap generation?
There seem to be a lot of NPM packages for this https://www.npmjs.com/search?q=sitemap+generator
Does anyone have a recommended way of doing this?

You have all the information you need in collection to create a sitemap. Just need to print it out properly. Or you can just use the RSS feed generating feature. With Google Webmaster tool, you can submit a RSS feed for sitemap.

I guess we can add this like for the rss feed, and later extract this as a package when handling #598.
This would have to be added here https://github.com/MoOx/phenomic/blob/2b44e19bfa095d2a4bb512c122dbb24380a83ef1/src/phenomic-loader/index.js#L86

@thangngoc89 having informations is one thing, being able to do it without pain is another, we need to provide options to make this super easy. It's very a basic requirement.

I suggest extracting the rss and sitemap logic from the loader and put it into the plugin.

baby steps ;) For now it's easy to add this here.

So, how do I go about adding a sitemap?
The problem I see is:
<Route component={ LayoutContainer }>
    <Route path="/sitemap.xml" component={SiteMap} />
    <Route path="*" component={ PageContainer } />
</Route>

So how do I define an additional "/sitemap.xml" route that does not use LayoutContainer?

In theory, this should work (for any html url), but the problem is that pages generated are wrapped into an Html component.
My suggestion is to use something else and not rely on phenomic (eg: https://www.npmjs.com/package/simple-sitemap)

But I need the sitemap to be available at /sitemap.xml, not just submit it to google.
I guess I could write a script to generate it and copy it to the build folder on deploy though.

The package I mentionned allow to write to disk, so yeah you should call it after the build (eg: npm "postbuild" hook) and this should do the trick.

This should be easy now, but still require some works.
You can take a look at Loader Feed Webpack Plugin and make a similiar Plugin (Loader Sitemap Webpack Plugin)
Use sitemap to generate sitemap.xml from list of urls.

Wrote this custom script to handle this for me in the meantime:
Note: The node-dir npm package is super handy for dealing with markdown manipulation as well. Just an FYI (see: https://github.com/serverless/site/blob/master/scripts/blog/update-blog-yaml.js )
// generate script
var dir = require('node-dir')
var sm = require('sitemap')
var path = require('path')
var distPath = path.join(__dirname, '..', 'dist') // path to built dist

function getAllUrls (filePath, callBack) {
  dir.readFiles(filePath, {
    match: /.html$/,
    //exclude: /^\./
  }, function (err, content, filename, next) {
    if (err) throw err
    next()
  },
    function (err, files, test) {
      if (err) {
        callBack(err)
      }
      var urls = files.map(function(file, i) {
          return {
            url: file.split('dist')[1].replace('index.html', ''),
          }
      })
      console.log(urls)
      callBack && callBack(null, urls)
    }
  )
}

getAllUrls(distPath, function(err, urls) {
  if (err) {
    console.log(err)
    return false
  }
  var options = {
    hostname: 'http://serverless.com',
    cacheTime: 600000,  // 600 sec cache period
    urls: urls
  }
  // Creates a sitemap object given the input configuration with URLs
  var sitemap = sm.createSitemap(options);
  // Generates XML with a callback function
  sitemap.toXML( function(err, xml){ if (!err){ console.log(xml) } });
  // Gives you a string containing the XML data
  var xml = sitemap.toString();
  // write sitemap to file
  console.log('sitemap', xml)
})

@DavidWells when do you launch your script ? I did not see any npm postbuild hook related to sitemap for your site

I just open a PR about this #907

The script is here https://github.com/serverless/site/blob/master/scripts/sitemap.js
I actually disabled it because right when I generated it in postbuild we started seeing a huge google analytics drop off.
I can't confirm it was the site map but I'm scared to toggle it back on =P
After about 2-3 weeks of the sote page being toggled off, the site traffic was back to normal.
Very very strange and I still can't explain why this happen (or if it was directly related to adding the site map.xml)

On Nov 26, 2016, at 2:52 AM, Cédric Delpoux<EMAIL_ADDRESS>wrote:
@DavidWells when do you launch your script ? I did not see any npm postbuild hook related to sitemap for your site
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub, or mute the thread.

Ok, thank you for your feedback. I saw the script but I did not see how the script is automatically run. But I understand now

@xuopled no problem.
I'd be curious if you see a similar thing when you toggle on a sitemap.


downloader: Improve exception handling in downloadPomArtifact()

URL.readBytes() can throw an IOException, so instead of catching the
specific FileNotFoundExceptoin and MalformedURLException catch their
parent IOException. Also check if the POM URL is empty before trying
to download it to use a more precise exception message in this case.

This change is

Nit, maybe say "catch their parent IOException and pass along the cause."

@sschuberth Done.

Just found a commit message typo in FileNotFoundExceptoin.


Enable both logx and logy

Thanks, looks good. Can merge asap, although log axis support we have to work on more in general.

Tests have passed, merging. Thanks again!


UWP Sample Client

I'd like to request a UWP sample client that call the same API for this solution. I think that would be really helpful.

Thanks for your suggestion! Unfortunately right now a UWP sample is not something we have time to build. If you'd like to contribute one, we'd be happy to feature it. 😄


Invisible warnings from bower-json package

The bower-json package will only alert you if there are errors in your bower.json file.
Using the code from the readme, to either read or parse the json file, neither method will display any warning messages.
For example, if my bower.json file was completely valid except that I linked the "main" entry to a minimized file...
{
  "name": "my-library",
  "main": "lib/index.min.js",
  "ignore": [
    "/node_modules",
    "/bower_components"
  ]
}

No error, or warning would be shown.
Within the validate function, an error is thrown only if there are issue.errors. Nothing is done with the issue.warnings values.
It might be easiest to have the validate function display any warnings in the console.

Additionally, I didn't think I needed to open another issue for these...

The validate portion of the readme is malformed and the validate entry itself is included in the code block of the deprecated .getIssues(json) entry.
The npm module page - https://www.npmjs.com/package/bower-json - links to https://github.com/bower/json - which doesn't exist.

This issue got invalid because Bower is deprecated and we don't encourage creating new Bower packages anymore


Any calls like this in console don't work

flux.augur.getNumEventsToReport(1010101, 13)
Object {error: 500, message: "transaction failed", bubble: TypeError: syncRequest is not a function
at Object.call (https://augur.net/app.js:181178:23)
…, tx: Object}

Yeah I scrubbily have not added in browser synchronous request support for
etherscan yet.  If you add a callback function it should work.  Just define
a function:
function mycallback(x) { console.log(x); }
then pass mycallback as the last argument to the augur method and it should
print out the result!
On Mar 23, 2016 12:28 PM, "Joseph Krug"<EMAIL_ADDRESS>wrote:

flux.augur.getNumEventsToReport(1010101, 13)
Object {error: 500, message: "transaction failed", bubble: TypeError:
syncRequest is not a function
at Object.call (https://augur.net/app.js:181178:23)
…, tx: Object}
—
You are receiving this because you are subscribed to this thread.
Reply to this email directly or view it on GitHub
https://github.com/AugurProject/augur/issues/531

etherscan gone


Fixing the issue of compute nodes not connecting the slurm head node

Installation scripts add a host entry to the head node in the compute images and the original scripts assume the eth0 is the relevant network interface. But it is not true for Exosphere spawned VMs. So it is better to filter the ip from a subnet prefix.

Thanks @DImuthuUpe! Great catch.


InvalidCastException when trying to get string array from ApplicationData

Describe the bug
When building the app with PublishAot=true, getting a string array from ApplicationData.Current.LocalSettings and casting it to the string[] type I get:
System.InvalidCastException: 'Unable to cast object of type 'WinRT.IInspectable' to type 'System.String[]'.'
Steps to reproduce the bug
Set in csproj:
<PublishAot>true</PublishAot>
ApplicationData.Current.LocalSettings.Values["test"] = new string[] { "a", "b", "c" };
var array = (string[])ApplicationData.Current.LocalSettings.Values["test"];

Expected behavior
No crash
Screenshots

NuGet package version
Windows App SDK 1.6.0: 1.6.240829007
Packaging type
Packaged (MSIX)
Windows version
Windows 11 version 22H2 (22621, 2022 Update)
IDE
Visual Studio 2022
Additional context
Example project: Test.zip

I think I met the same/related issue on another example (WASDK v1.6, AOT enabled):
SelectionChangedEventArgs args = new([], []);

Throws invalidcastexception: "specified cast is not valid".

@manodasanW Does this look related to the collection expression marshaling issue?


Add name attribute to date field

Thanks for merging the previous PR.  This one adds a name attribute to the date field as well.
Closes #7
I've also bumped the version number hoping that you'd be so kind as to push a new release to pypi at your  next convenience.
Thanks

Hi @fatboystring, thanks for all your PR. This is a good work.
I will continue to merge your PR but if you want, I can add you as a contributor of the repo.
For the package on pypi, I prefer that you download the package directly from github: https://www.reddit.com/r/Python/comments/2crput/how_to_install_with_pip_directly_from_github/

Hi @florent1933 understood about installing directly from github. Thanks for the heads up.  If you're happy to add me as a contributor to the repo that'd be splendid.
Thanks

I sent you an invitation to be a contributor.


Navigating to end of tab list breaks lazy logic

Current behaviour
I have a large list of tabs:
<TabView
                lazy
                lazyPreloadDistance={1}
                key={this.key}
                navigationState={this.state}
                tabBarPosition="bottom"
                renderScene={this.handleRenderScene}
                onIndexChange={this.navigateToTab}
                renderTabBar={this.handleRenderTabBar}
                initialLayout={INITIAL_LAYOUT}
                onSwipeEnd={this.handleSwipe}
            />

Navigating to the end of tab list renders all scenes
Expected behaviour
Navigating to the end of tab list renders two last scenes
What have you tried
I created local patch disabling handleEnter
https://github.com/react-native-community/react-native-tab-view/blob/master/src/SceneView.tsx#L76
Your Environment

software
version

ios or android
iOS

react-native
0.60.5

react-native-tab-view
2.10.0

react-native-gesture-handler

react-native-reanimated

node
12.6.0

npm or yarn
npm

Has this issue been resolved ? Is there a fix ?

@viventus That's how this library works from the beginning. I don't think it's gonna be changed to work as you expect anytime soon, because it requires a lot of effort and probably core logic redesign and reimplementation.


Replace hard-coded messages with slot-based customization

Currently, we have hard-coded texts, and HTML structure for presenting messages at https://github.com/PuppetJs/puppet-polymer-client/blob/gh-pages/puppet-client.html#L72
Due to i18n, a11y, customization, theming, cheeper maintenance, etc. those should be customizable.
In my opinion the best way to do so is to use <slot>, we can provide fallback content inside, but tu CE consumer could simply write his/her own:
<puppet-client>

Łączę ponownie

</puppet-client>

So we will no longer have to bother about how to show the message for the mobile, in different language, in different context, etc.
//cc @warpech @Mnosek

Do you think we should still do this for palindrom-error-catcher?

I think it could be useful. But not with such priority.

I agree with @tomalec, I will move it to some other milestone.

Moved to https://github.com/Palindrom/palindrom-error-catcher/issues/2


Text strings must be rendered within a  component

If you pass children with prop title inside Swiper you will get this error Text strings must be rendered within a <Text> component. That because of this terrible line of code https://github.com/leecade/react-native-swiper/blob/master/src/index.js#L702
It is just so wrong solution to reserve prop title for a package assuming that people are not using prop title in items that they pass to to the package, because this is very common property name to use.
I face this crash once a half of year and every time forget about this terribly written line of code. Leaving this issue here in case I forget again, of anyone else face it

Likewise. Have spent the last hour wondering why my code only started breaking because I changed the structure of the types. Thankyou!

Thanks @sintylapse !
You shouldn't have close the issue, it need a PR :)

Thank you so much! :)

Seriously this issue is so weird, so Changing the title prop name solved the issue. Why is that?

this issue still exists, @sintylapse i think its better to re-open this, because i think a lot of people are face the same issue and waste a lot of time without even knowing what it is. For me, a single child with prop "title" is not giving any issue, but multiple children with prop "title" is throwing this issue. Fixing this issue, or atleast keeping it open would be helpful, i guess (y)

@JayantJoseph sure

Thanks from Brazil. Took me a good 30 minutes to find this one.

OMG, thx for that bro

Thank you for saved my debugging time

Cheers mate!

Thank you for saving my time

Thanks for saving my time 🫶🏻

@sintylapse Thanks a lott for saving my ass😥 have been wondering over this issue for the past two days.


Feature/boyscout

Pull Request Test Coverage Report for Build 18

31 of 31 (100.0%)  changed or added relevant lines in 3 files are covered.
No unchanged relevant lines lost coverage.
Overall coverage remained the same at 100.0%

Totals

Change from base Build 17:
0.0%

Covered Lines:
80

Relevant Lines:
80

💛  - Coveralls


Fix project page to work on top of new metrics marts

What is it?
Some of the models broke with the latest updates

This is good to go now!


[WFLY-11197] Add capability to bean-validation; use it in JSF and JPA…

… to make module dependency optional
https://issues.jboss.org/browse/WFLY-11197

@bstansberry Are we still doing the capability registry for all these?


Internalize [2 of 4]

What this does
Coverts unnecessarily public methods to internal.
Relies on #13

Failures look legit 😕


Add annotations_pb and openapiv1_pub to allow gRPC client to load

resolves #6
When trying to require the Flipt gRPC service, the client will crash due to annotations.proto's ruby representation not being checked in.
This PR adds the pb files generated from the flipt project itself.
❯ grpc_tools_ruby_protoc -I ./rpc --ruby_out=$HOME/workspace/flipt-grpc-ruby/lib --grpc_out=$HOME/workspace/flipt-grpc-ruby/lib ./rpc/**/*.proto

Also updating the example's Gemfile to allow it to work with Linux as well.

Hey, sorry I never saw this PR and issue, however I just release v0.4.0 which fixes this


Work around to get working with South Migrations

./manage.py syncbd will fail for fresh DB syncs if a model is
using seo & the model's schema is being managed by south migrations.
This is because the model's DB table will not be created by the syncdb
command (but rather a subsequent ./manage.py migrate command).
TODO: South emits it's own signals (http://south.aeracode.org/docs/signals.html#post-migrate) & the management could hook into these also.

Thanks for the pull request, Jesse.