jlquinn / xbows-driver Goto Github PK
View Code? Open in Web Editor NEWLicense: GNU Lesser General Public License v3.0
License: GNU Lesser General Public License v3.0
Debian 11 user here. After wrestling a bit with #16, I compiled hdapi from its github repository, and was then able to compile x-bows driver/executables without errors. However when I run kdbtest2 (or kdbtest) I get: ERROR: Failed to enumerate xbows keyboard device
When the keyboard is connected, dmesg gives about a dozen lines for the usb device, xinput recognizes it (both as a keyboard and mouse(?)), and the keyboard works fine. It looks like the driver should be able to find the usb device as described in xbows.cc comment around line 85.
Is there something I'm missing? Perhaps a conflict between the system version of hdapi and the 'local' one?
Thanks
Anyone found a way to map a key to switch layer permanently (as if by using Fn+F10/F11/F12?)
This works fine to switch layer while the key is pressed:
Control_L:
layer: 3
This seems to be possible in the windows driver, called "Layer toggle":
(Can't confirm it actually works, the windows driver software is flaky for me and isn't detecting my keyboard right now)
I tried defining a macro with steps: [ Fn down, 5 ms, F10 down, ...]
but it didn't work
I tried to highlight some keys with a different color and noticed that I cannot change the color of the left key. Could it have the wrong id? I am using a nordic keyboard layout (setxkbmap se). I am using a X-Bows Nature (2020). Here is the yml file:
lights:
animation:
- all
pattern:
- color: [00,00,00]
type: monochrome
keys: [Escape,F1,F2,F3,F4,F5,F6,F7,F8,F9,F10,F11,F12,Delete,PrintScreen,
BackQuote,1,2,3,4,5,6,7,Equal,Minus,BackSpace_R,
Tab,Q,W,E,R,T,Y,P,LeftBracket,RightBracket,BackSlash,PageUp,
CapsLock,A,S,D,F,G,H,BackSpace_M,Semicolon,Quote,Enter_R,PageDown,
Shift_L,Z,X,C,V,B,Enter_M,Slash,Shift_R, Up, Left, Down, Right,
Control_L,Windows,Alt_L,Space_L,Control_M,Shift_M,Alt_R,Fn,Control_R]
- color: [22,22,ff]
type: monochrome
keys: [XBows,8,9,0,U,I,O,J,K,L,N,M,Comma,Period,Space_R]
The extra key for less than on a nordic keyboard is not available for remapping. I have however figured out the keycode for it (and some others). (I have successfully remapped and verified them by replacing the keycodes in keymap.cc). Here is a list of keycodes that I have verified:
47 Pause
48 Scroll Lock
49 Insert
4a Home
4d End
64 < (Additional key on nordic keyboards, "<> |" )
65 Menu
66 XF86PowerOff
67 KP_Equal
68 XF86Tools
Running kbdtest2 once with a configuration file results in that keyboard remappings work for a few seconds and then gets reset. I noticed that if I run kbdtest2 with the same configuration file twice in a row (with no delay in between), then the remappings stick in the keyboard memory. Here is a short sample configuration file that I use:
layer: custom 2
keymap:
layer: 2
Q: A
W: B
E: C
I am using a X-Bows Nature from 2020. The OS is Ubuntu 20.04.5 LTS. I used the hidapi from the hidapi folder as I do not have a cmake configuration file in the hidapi system library.
Hello, I was wondering whether there is support for RGB animations on keystrokes, such as the ones that appear on the keyboard when pressing Fn+F6 on the standard layer. I have not seen it anywhere on the docs, but I may have missed it.
In case there isn't at the moment, would this fit in the project's priorities, or would it even be possible? According to the staff at X-Bows, there's no support for doing this on the official Windows driver software.
In order to make this properly compile on NixOS, I use the following changes:
libcrc
and hidadpi-supercollider
outside of the driver using the same commit referenced as submodules.CMakeLists.txt
(see below) that will make cmake look for the 2 libraries mentioned above instead of using the vendored versions.substituteInPlace
is a sed wrapper that handles escaping paths and the likes and ${netpbm}
is a reference to netpbm from where we get the rgb.txt
.Replace CMakeLists.txt with this:
cmake_minimum_required(VERSION 3.5)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
find_library(HIDAPI_LIBRARY hidapi-libusb)
find_library(CRC_LIBRARY crc)
find_library(YAML_LIBRARY yaml-cpp)
add_subdirectory(src)
And the patches:
for f in kbdtest.cc kbdtest2.cc xbows.hh ; do
substituteInPlace src/$f --replace '<hidapi' '<hidapi/hidapi'
done
substituteInPlace src/driver_parse.cc \
--replace /usr/share/X11/rgb.txt ${netpbm}/share/netpbm/misc/rgb.txt
sed -i src/CMakeLists.txt \
-e '/crap/d'
I can't assign media keys like MediaPlay
or MediaPause
in custom layers. I think it has something to do with 03 suffix needs to be added (
Line 34 in 31664d4
kbdtest2
hangs when trying to program a non-LED keyboard presumably because it is trying to do something with the lights.
Sending this file with kbdtest2 -v file.yaml
makes kbdtest2 hang at the first "RECEIVING PACKET".
---
layer: custom 3
keymap:
U: 7
I: 8
O: 9
J: 4
K: 5
L: 6
M: 1
Comma: 2
Period: 3
Space_R: 0
If I invoke it with -n
so nothing is actually sent, you will see that the first part after "RECEIVING PACKET" is Sending light program DONE
which leads me to assume it's trying to do something with lighting which is what makes it hang.
This is the output when invoked with -n
:
DEVICE:
path: 0005:0004:00
vendprod: 7847 2311
release: 768
mfgstr: SEMITEK
prodstr: USB-HID Gaming Keyboard
usagepg: 0
usage: 0
interface: 0
DEVICE:
path: 0005:0004:01
vendprod: 7847 2311
release: 768
mfgstr: SEMITEK
prodstr: USB-HID Gaming Keyboard
usagepg: 0
usage: 0
interface: 1
DEVICE:
path: 0005:0004:02
vendprod: 7847 2311
release: 768
mfgstr: SEMITEK
prodstr: USB-HID Gaming Keyboard
usagepg: 0
usage: 0
interface: 2
Sending packets now...
SENDING PACKET
Packet:
0c 00 00 00 00 00 a7 0d 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
RECEIVING PACKET
Sending light program DONE
Sent program in 102 ms
Sending packets now...
SENDING PACKET
Packet:
0b 05 00 00 00 00 57 6a 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
RECEIVING PACKET
SENDING PACKET
Packet:
01 09 00 00 00 00 94 84 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
RECEIVING PACKET
SENDING PACKET
Packet:
21 04 01 00 00 00 be 55 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
RECEIVING PACKET
SENDING PACKET
Packet:
22 04 00 00 38 00 f1 b3 ff ff ff ff ff ff ff ff
01 00 00 02 02 00 00 02 04 00 00 02 08 00 00 02
10 00 00 02 20 00 00 02 40 00 00 02 ff ff ff ff
00 04 00 02 00 05 00 02 00 1f 00 02 00 22 00 02
RECEIVING PACKET
SENDING PACKET
Packet:
22 04 38 00 38 00 1f 00 00 25 00 02 00 23 00 02
00 0a 00 02 00 0b 00 02 00 25 00 02 00 21 00 02
00 22 00 02 00 23 00 02 00 1e 00 02 00 11 00 02
00 26 00 02 00 13 00 02 00 14 00 02 00 26 00 02
RECEIVING PACKET
SENDING PACKET
Packet:
22 04 70 00 38 00 aa 99 00 21 00 02 00 17 00 02
00 24 00 02 00 19 00 02 00 24 00 02 00 1e 00 02
00 1c 00 02 00 1d 00 02 00 1e 00 02 00 1f 00 02
00 20 00 02 00 21 00 02 00 22 00 02 00 23 00 02
RECEIVING PACKET
SENDING PACKET
Packet:
22 04 a8 00 38 00 6a ec 00 24 00 02 00 25 00 02
00 26 00 02 00 27 00 02 00 28 00 02 00 29 00 02
00 2a 00 02 00 2b 00 02 00 27 00 02 00 2d 00 02
00 2e 00 02 00 2f 00 02 00 30 00 02 00 31 00 02
RECEIVING PACKET
SENDING PACKET
Packet:
22 04 e0 00 38 00 64 5c 00 33 00 02 00 34 00 02
00 35 00 02 00 1f 00 02 00 20 00 02 00 38 00 02
00 39 00 02 00 3a 00 02 00 3b 00 02 00 3c 00 02
00 3d 00 02 00 3e 00 02 00 3f 00 02 00 40 00 02
RECEIVING PACKET
SENDING PACKET
Packet:
22 04 18 01 38 00 eb 12 00 41 00 02 00 42 00 02
00 43 00 02 00 44 00 02 00 45 00 02 00 46 00 02
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
00 4b 00 02 00 4c 00 02 ff ff ff ff 00 4e 00 02
RECEIVING PACKET
SENDING PACKET
Packet:
22 04 50 01 38 00 dc 34 00 4f 00 02 00 50 00 02
00 51 00 02 00 52 00 02 ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
RECEIVING PACKET
SENDING PACKET
Packet:
22 04 88 01 38 00 b4 1c ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
RECEIVING PACKET
SENDING PACKET
Packet:
22 04 c0 01 20 00 e8 43 00 2a 00 02 00 28 00 02
01 00 00 02 20 00 00 02 00 27 00 02 ff ff ff ff
ff ff ff ff ff ff ff ff 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
RECEIVING PACKET
SENDING PACKET
Packet:
21 04 04 00 00 00 33 d1 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
RECEIVING PACKET
SENDING PACKET
Packet:
25 04 00 00 00 00 49 67 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
RECEIVING PACKET
SENDING PACKET
Packet:
21 04 05 00 00 00 ef aa 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
RECEIVING PACKET
SENDING PACKET
Packet:
26 04 00 00 38 00 52 eb ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
RECEIVING PACKET
SENDING PACKET
Packet:
26 04 38 00 38 00 99 42 ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
RECEIVING PACKET
SENDING PACKET
Packet:
26 04 70 00 08 00 94 32 ff ff ff ff ff ff ff ff
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
RECEIVING PACKET
SENDING PACKET
Packet:
21 04 06 00 00 00 8b 26 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
RECEIVING PACKET
SENDING PACKET
Packet:
27 04 00 00 00 38 76 1a 00 02 00 00 00 00 00 00
00 02 00 00 00 00 00 00 ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
RECEIVING PACKET
SENDING PACKET
Packet:
27 04 38 00 00 38 31 6f ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
RECEIVING PACKET
SENDING PACKET
Packet:
27 04 70 00 00 38 4d 85 ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
RECEIVING PACKET
SENDING PACKET
Packet:
27 04 a8 00 00 38 e8 ab ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
RECEIVING PACKET
SENDING PACKET
Packet:
27 04 e0 00 00 38 94 41 ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
RECEIVING PACKET
SENDING PACKET
Packet:
27 04 18 01 00 38 ee bc ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
RECEIVING PACKET
SENDING PACKET
Packet:
27 04 50 01 00 38 92 56 ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
RECEIVING PACKET
SENDING PACKET
Packet:
27 04 88 01 00 38 37 78 ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
RECEIVING PACKET
SENDING PACKET
Packet:
27 04 c0 01 00 38 4b 92 ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
RECEIVING PACKET
SENDING PACKET
Packet:
27 04 f8 01 00 08 83 a2 ff ff ff ff ff ff ff ff
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
RECEIVING PACKET
SENDING PACKET
Packet:
0b 04 00 00 00 00 ab 79 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
RECEIVING PACKET
Sending light program DONE
Sent program in 65 ms
Sending packets now...
SENDING PACKET
Packet:
0c 00 00 00 00 00 a7 0d 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
RECEIVING PACKET
Sending light program DONE
Sent program in 102 ms
With the below test file, only "Z" (macro 0) works, pressing A and Q does nothing (no output in evtest
or xev
).
Or am I misunderstanding how they're meant to work?
layer: custom 3
keymap:
Z: { macro: 0 }
A: { macro: 1 }
Q: { macro: 2 }
macros:
- id: 0
mode: once
steps:
- X down
- 5 ms
- X up
- id: 1
mode: once
steps:
- C down
- 5 ms
- C up
- id: 2
mode: once
steps:
- V down
- 5 ms
- V up
I have X-Bows Nature Ergonomic Mechanical Keyboard & Debian 10. After command build/src/kbdtest2 share/test-driver-layer.yaml I have this error 'ERROR: Failed to enumerate xbows keyboard device'. Any hints?
Thank You for your hard work & sharing.
After pulling the repository and initializing the submodules, cmake ..
produces the following error:
CMake Error at CMakeLists.txt:10 (find_package):
By not providing "FindHIDAPI.cmake" in CMAKE_MODULE_PATH this project has
asked CMake to find a package configuration file provided by "HIDAPI", but
CMake did not find one.
Could not find a package configuration file provided by "HIDAPI" with any
of the following names:
HIDAPIConfig.cmake
hidapi-config.cmake
Add the installation prefix of "HIDAPI" to CMAKE_PREFIX_PATH or set
"HIDAPI_DIR" to a directory containing one of the above files. If "HIDAPI"
provides a separate development package or SDK, be sure it has been
installed.
System info: Arch Linux on x86_64
Since this isn't super clear--does this project support the Knight as well as the Nature?
I didn't found in the docs if it was possible to dump the current config of the keyboard. I don't know either if it's possible, but it could be useful in case somone already did some changes using the windows drivers.
I have tried with the new hidapi from libusb (the new maintained upstream) at v0.9.0, instead of the SuperCollider fork and it works fine. You may want to change that dependency.
Just running kbdtest2
causes a segfault.
Backtrace from gdb
:
Reading symbols from bin/kbdtest2...
(No debugging symbols found in bin/kbdtest2)
(gdb) run
Starting program: /nix/store/ackf67gjzqbiw12fhxkki7lbn4bqam5p-xbows-driver-unstable-20191030/bin/kbdtest2
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/nix/store/1ncwrl8bplq3xhmj8pxfkx4y0i90vmnx-glibc-2.30/lib/libthread_db.so.1".
terminate called after throwing an instance of 'std::runtime_error'
what(): Bad line format
Program received signal SIGABRT, Aborted.
0x00007ffff7a8e15a in raise () from /nix/store/1ncwrl8bplq3xhmj8pxfkx4y0i90vmnx-glibc-2.30/lib/libc.so.6
(gdb) bt
#0 0x00007ffff7a8e15a in raise () from /nix/store/1ncwrl8bplq3xhmj8pxfkx4y0i90vmnx-glibc-2.30/lib/libc.so.6
#1 0x00007ffff7a78548 in abort () from /nix/store/1ncwrl8bplq3xhmj8pxfkx4y0i90vmnx-glibc-2.30/lib/libc.so.6
#2 0x00007ffff7e12643 in ?? () from /nix/store/ikp2dbb5cwvr41yvx5anq8cf8ddifz12-gcc-9.2.0-lib/lib/libstdc++.so.6
#3 0x00007ffff7e1e066 in ?? () from /nix/store/ikp2dbb5cwvr41yvx5anq8cf8ddifz12-gcc-9.2.0-lib/lib/libstdc++.so.6
#4 0x00007ffff7e1e0b1 in std::terminate() () from /nix/store/ikp2dbb5cwvr41yvx5anq8cf8ddifz12-gcc-9.2.0-lib/lib/libstdc++.so.6
#5 0x00007ffff7e1e2e4 in __cxa_throw () from /nix/store/ikp2dbb5cwvr41yvx5anq8cf8ddifz12-gcc-9.2.0-lib/lib/libstdc++.so.6
#6 0x00007ffff7f77023 in load_colornames() [clone .cold] () from /nix/store/ackf67gjzqbiw12fhxkki7lbn4bqam5p-xbows-driver-unstable-20191030/lib/libxbows.so
#7 0x00007ffff7f7e103 in init_xbows() () from /nix/store/ackf67gjzqbiw12fhxkki7lbn4bqam5p-xbows-driver-unstable-20191030/lib/libxbows.so
#8 0x00000000004011c2 in main ()
Hello,
I was going to try to use this project ton make some remapping on my x-bows, but I didn't really understood where to start.
Is it possible to add a minimal Readme.md that contains a list of command to copy-paste. I was expecting to do something like git clone && git submodule init && git submodule update
, then mkdir build && cd build && cmake ..
and finally ./xbows --help
then probably ./xbows ../share/default-prog1.yaml
.
Unfortunately when doing cmake ..
, I got the following error:
CMake Warning (dev) in CMakeLists.txt:
No project() command is present. The top-level CMakeLists.txt file must
contain a literal, direct call to the project() command. Add a line of
code such as
project(ProjectName)
near the top of the file, but after cmake_minimum_required().
CMake is pretending there is a "project(Project)" command on the first
line.
This warning is for project developers. Use -Wno-dev to suppress it.
-- The C compiler identification is GNU 9.0.1
-- The CXX compiler identification is GNU 9.0.1
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
crc /include
-- Configuring done
CMake Error at CMakeLists.txt:18 (add_executable):
Cannot find source file:
crap.cc
Tried extensions .c .C .c++ .cc .cpp .cxx .cu .m .M .mm .h .hh .h++ .hm
.hpp .hxx .in .txx
CMake Error at CMakeLists.txt:18 (add_executable):
No SOURCES given to target: crap
CMake Generate step failed. Build files cannot be regenerated correctly.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.