divverent / aaaaxy Goto Github PK
View Code? Open in Web Editor NEWA nonlinear 2D puzzle platformer taking place in impossible spaces.
License: Apache License 2.0
A nonlinear 2D puzzle platformer taking place in impossible spaces.
License: Apache License 2.0
I took that idea from another game, and to support gamepads without a start button better (e.g. MS SideWinder), but still... might not be right.
Will think about this later, writing down now to track.
Instead of touchForce, these systems should use a "touchPrefer" that I have to implement.
touchPrefer works like the opposite of default mode: touch controls are shown by default, unless "any other input method" was recently used.
Also, may want to remove the timer based touch overlay by default, and just go with inputMap, and just deciding on an OS dependent default if inputMap is NoInput.
I.e. no more touchPadFrames logic, but instead:
Based on the current user base, French is a language worth adding to the game.
This can be done here:
https://transifex.com/aaaaxy/aaaaxy
As I do not speak French, I am filing this issue as an invitation to contribute.
We have a translator for Arabic on Transifex, however some preparations need to be done to display it correctly.
We already can record and playback demos that just contain input state.
Would be nice if we could make every demo frame contain a game state hash or similar info so we can detect during playback if the game state ever diverges.
Suggesting to use the following data:
This alone should actually suffice; every action that changes the "world" will either cause a savegame to be written or the player position will diverge.
Also, a headless demo playback mode so we can run it on e.g. Travis CI. I know Ebiten doesn't really support headless, so to support true headless, we'd need to factor out all use of Ebiten calls (easy) and types (omghard if we do not want to decrease performance). However, just skipping all render processing alone will already do a lot and we can run the rest in Xdummy or similar.
(Android F-droid 1.3.524)
l i changed settings from maximum to minimum and back.
now it periodically freezes for 5 seconds unless I set graphics to minimum.
it's unplayable.
newer version runs slower overall too
https://gitlab.com/fdroid/fdroiddata/-/issues/2809
Seems like what this takes is:
On Android, after switching to streched screen, pressing the jump button triggers the background button and I have to press to the right of the button to jump.
In this file:
aaaaxy/internal/menu/settings.go
Line 93 in 73946f9
why??? and can you fix this?
While holding a gamepad button, touching the screen causes the button to remain pressed even if actually released.
Cause yet unknown.
GO_FLAGS should be suppliable by the user because it tells Go what homedir is, etc.
Test results:
Still need to test on macOS, if that's good too, I will make the Ebitengine 2.5 build the default and create a branch with the API changes to Ebitengine 2.5 rolled back so one can still use it to build for 2.4.
When built with -tags=embed
the build breaks:
licenses/embed.go:24:12: pattern */[^_]*: no matching files found
*** Error code 1
OS: FreeBSD 13
For debugging and TASsing, maybe have a HUD showing current player velocity and position?
https://gist.github.com/UnmatchedBracket/e66dd05f8f23cbe5e8d86b58ffbf1ae8 has some ideas for this.
Should be enabled in the integration test runs so the screenshots for failures contain this info.
Seems like the engine/world's Draw function has no timing.Section calls. Let's fix that for better self profiling.
In Shepard Tone, the sounded note pitches are 3 semitones lower than the expected keyboard pitch.
E.g. the note A (shepard_00.ogg
) is sounded when the player triggers the note C on the keyboard.
It should be shepard_03.ogg
that is sounded for the note C.
It seems, under certain conditions, platforms can travel trough walls. This is not reproducible during normal gameplay, but it has happened to me multiple times.
However, this also seems to happen when holding action key when joining the level, in which case the platforms noclip through the dividers which also breaks the level.
I have aaaaxy 1.2.331-1 installed from AUR on Arch Linux with Kernel 5.19.8-zen1-1-zen and I run aaaaxy via xwayland 22.1.3-1.
From https://libregamewiki.org/Libregamewiki:Suggested_games#2022
AAAAXY (*) - small-scale 2D non-euclidian puzzle platformer, originally released in 2021. This game seems libre, but I'm not sure about aaaaxy-1.2.280/AndroidStudioProjects/AAAAXY/gradle/wrapper/gradle-wrapper.jar and I haven't checked any build-time-downloaded-dependencies yet.
Wonder if we really need to include this file, or if we can replace this by using a locally installed gradle or do a runtime download when building for Android. The file is free software under Apache 2.0 license, so legally we're fine, but compiled binaries don't belong in a git repo. Debian's gradle package does NOT suffice, but it's a really old version.
At the very least, this file doesn't affect building for any non-Android platforms.
When leaving the Reset or Edit Touch Controls menus, the selected entry becomes Main Menu.
This is unexpected - normally menus open with the topmost entry selected. Cause not known yet, but also far from critical, so releasing anyway for now.
https://rm.cloudns.org/aaaaxy/current/aaaaxy.html
Performs substantially worse than a local build. Should figure out why.
May have a common cause with #168, as both WebGL and Android use OpenGL ES APIs, not desktop OpenGL.
Android needs gamepad support most as touch input isn't so great. Right now only gamepads supported by SDL_GameControllerDB are supported - however Android APIs already provide a standard layout mapping natively.
I filed hajimehoshi/ebiten#2557 for this, but it seems resources are lacking to implement this on Ebitengine side - thus, filing this bug so I'll look into it myself to see what it takes to make this work.
Looking for androidKeyToSDL it seems like we already have a 1:1 mapping from Android buttons to SDL names, which seems close to standard layout. We'd need the same for axes. As part of the SDL ID, we already provide info about axis and button existence, as well. For buttons it seems rather clean which are transmitted 1:1 to Go, for axes not so much as they're remapped in the Java code. Probably should move the remapping into Go and then we also have a trivial standard layout mapping.
Since the most recent update (from 1.3.263+20230205.2728.57c67f41 to 1.3.303+20230212.2768.bfe2720d), the game is very slow on Android, often even unplayably slow, especially after a minute or two.
After a sudo snap refresh
, I lose all save games.
Appears to be because XDG_DATA_HOME and XDG_CONFIG_HOME points into SNAP_USER_DATA, which is not preserved across releases.
Try using SNAP_USER_COMMON.
Hello i can't install on samsung a7 (2018) with android 10, why?
Windows 7, x86, application crashed while run
>aaaaxy-windows-386.exe
2022/02/10 01:52:40 [INFO] could not find path for folder0/config.json: The handle is invalid.
2022/02/10 01:52:40 [INFO] requested logical scale factor: 0
2022/02/10 01:52:40 [INFO] device scale factor: 1
2022/02/10 01:52:40 [INFO] screen size: 1920x1200
2022/02/10 01:52:40 [INFO] max size: 1792x1072
2022/02/10 01:52:40 [INFO] max physical scale factors: 2.8, 2.977777777777778
2022/02/10 01:52:40 [INFO] requested physical scale factor: 2.8
2022/02/10 01:52:40 [INFO] chosen physical scale factor: 2
2022/02/10 01:52:40 [INFO] chosen logical pixel scale factor: 2
2022/02/10 01:52:40 [INFO] chosen window size: 1280x720
2022/02/10 01:52:40 [INFO] AAAAXY 1.1.112+20220207.1825.4f803d6a
Exception 0xc0000005 0x8 0x0 0x0
PC=0x0
runtime.cgocall(0x463b10, 0x26a73dc)
runtime/cgocall.go:156 +0x58 fp=0x1456da48 sp=0x1456da30 pc=0x403958
syscall.Syscall6(0x7355451e, 0x6, 0x14689f58, 0xffffffff, 0x13c8b950, 0x464bc4, 0x0, 0x30000)
runtime/syscall_windows.go:493 +0xbb fp=0x1456da64 sp=0x1456da48 pc=0x460e4b
golang.org/x/sys/windows.(*Proc).Call(0x1468d0e0, {0x13c8b968, 0x6, 0x6})
golang.org/x/[email protected]/windows/dll_windows.go:180 +0x3bf fp=0x1456dae0 sp=0x1456da6
4 pc=0x5d2f3f
golang.org/x/sys/windows.(*LazyProc).Call(0x13c900d8, {0x13c8b968, 0x6, 0x6})
golang.org/x/[email protected]/windows/dll_windows.go:348 +0x58 fp=0x1456db04 sp=0x1456dae0
pc=0x5d3c58
github.com/hajimehoshi/oto/v2.waveOutOpen(0x13c8b950, 0x464bc4)
github.com/hajimehoshi/oto/[email protected]/winmm_windows.go:136 +0xad fp=0x1456db40 sp=0x1456db04 pc=0x612b0d
github.com/hajimehoshi/oto/v2.newContext(0xac44, 0x2, 0x2)
github.com/hajimehoshi/oto/[email protected]/driver_windows.go:111 +0x175 fp=0x1456db84 sp=0x1456db40 pc=0x61012
5
github.com/hajimehoshi/oto/v2.NewContext(0xac44, 0x2, 0x2)
github.com/hajimehoshi/oto/[email protected]/driver.go:88 +0x35 fp=0x1456dbac sp=0x1456db84 pc=0x60fcb5
github.com/hajimehoshi/ebiten/v2/audio.newContext(...)
github.com/hajimehoshi/ebiten/[email protected]/audio/player_notjs.go:25
github.com/hajimehoshi/ebiten/v2/audio.(*playerFactory).initContextIfNeeded(0x146a6840)
github.com/hajimehoshi/ebiten/[email protected]/audio/player.go:102 +0x98 fp=0x1456dbdc sp=0x1456dbac pc=0x615518
github.com/hajimehoshi/ebiten/v2/audio.(*player).ensurePlayer(0x13c40450)
github.com/hajimehoshi/ebiten/[email protected]/audio/player.go:116 +0x28 fp=0x1456dbf8 sp=0x1456dbdc pc=0x615618
github.com/hajimehoshi/ebiten/v2/audio.(*player).Play(0x13c40450)
github.com/hajimehoshi/ebiten/[email protected]/audio/player.go:144 +0x63 fp=0x1456dc18 sp=0x1456dbf8 pc=0x6157f3
github.com/hajimehoshi/ebiten/v2/audio.(*Player).Play(...)
github.com/hajimehoshi/ebiten/[email protected]/audio/audio.go:352
github.com/divVerent/aaaaxy/internal/audiowrap.Init()
github.com/divVerent/aaaaxy/internal/audiowrap/player.go:80 +0x64 fp=0x1456dc30 sp=0x1456dc18 pc=0x6fcaa4
github.com/divVerent/aaaaxy/internal/aaaaxy.(*Game).InitStep.func2(0x13cf0288)
github.com/divVerent/aaaaxy/internal/splash/splash.go:124 +0x1c fp=0x1456dc3c sp=0x1456dc30 pc=0x76186c
github.com/divVerent/aaaaxy/internal/splash.(*State).Enter(0x13cf0288, {0x7ff954, 0x12}, {0x806a03, 0x1a}, 0x1456dcd0)
github.com/divVerent/aaaaxy/internal/splash/splash.go:109 +0x111 fp=0x1456dc8c sp=0x1456dc3c pc=0x690301
github.com/divVerent/aaaaxy/internal/aaaaxy.(*Game).InitStep(0x13cf0180)
github.com/divVerent/aaaaxy/internal/aaaaxy/init.go:175 +0x176 fp=0x1456dd14 sp=0x1456dc8c pc=0x761246
github.com/divVerent/aaaaxy/internal/aaaaxy.(*Game).Update(0x13cf0180)
github.com/divVerent/aaaaxy/internal/aaaaxy/game.go:138 +0xab fp=0x1456dd34 sp=0x1456dd14 pc=0x75d96b
github.com/hajimehoshi/ebiten/v2.(*imageDumper).update(0x13c9c720)
github.com/hajimehoshi/ebiten/[email protected]/imagedumper_desktop.go:111 +0x42 fp=0x1456dde4 sp=0x1456dd34 pc=0x609502
github.com/hajimehoshi/ebiten/v2.(*imageDumperGame).Update(0x13c90840)
github.com/hajimehoshi/ebiten/[email protected]/run.go:117 +0x80 fp=0x1456ddf4 sp=0x1456dde4 pc=0x60d580
github.com/hajimehoshi/ebiten/v2.(*uiContext).updateFrameImpl(0x26a6f20, 0x0)
github.com/hajimehoshi/ebiten/[email protected]/uicontext.go:187 +0xab fp=0x1456de78 sp=0x1456ddf4 pc=0x60ee7b
github.com/hajimehoshi/ebiten/v2.(*uiContext).updateFrame(0x26a6f20, 0x0)
github.com/hajimehoshi/ebiten/[email protected]/uicontext.go:159 +0x6f fp=0x1456de90 sp=0x1456de78 pc=0x60ed5f
github.com/hajimehoshi/ebiten/v2.(*uiContext).UpdateFrame(0x26a6f20)
github.com/hajimehoshi/ebiten/[email protected]/uicontext.go:138 +0x2b fp=0x1456dea4 sp=0x1456de90 pc=0x60ec4b
github.com/hajimehoshi/ebiten/v2/internal/uidriver/glfw.(*UserInterface).loop(0x26a2e40)
github.com/hajimehoshi/ebiten/[email protected]/internal/uidriver/glfw/ui.go:1103 +0x185 fp=0x1456dee4 sp=0x1456dea4 pc=
0x600a55
github.com/hajimehoshi/ebiten/v2/internal/uidriver/glfw.(*UserInterface).Run(0x26a2e40, {0x22d380c, 0x26a6f20})
github.com/hajimehoshi/ebiten/[email protected]/internal/uidriver/glfw/run_singlethread.go:42 +0xfd fp=0x1456defc sp=0x1
456dee4 pc=0x5fcb2d
github.com/hajimehoshi/ebiten/v2.RunGame({0x22d26ec, 0x13cf0180})
github.com/hajimehoshi/ebiten/[email protected]/run.go:160 +0xdf fp=0x1456df2c sp=0x1456defc pc=0x60d77f
main.runGame(0x13cf0180)
github.com/divVerent/aaaaxy/main.go:51 +0x6a fp=0x1456df7c sp=0x1456df2c pc=0x7627ba
main.main()
github.com/divVerent/aaaaxy/main.go:83 +0xe6 fp=0x1456dfc8 sp=0x1456df7c pc=0x762c26
runtime.main()
runtime/proc.go:255 +0x23a fp=0x1456dff0 sp=0x1456dfc8 pc=0x438d4a
runtime.goexit()
runtime/asm_386.s:1319 +0x1 fp=0x1456dff4 sp=0x1456dff0 pc=0x462da1
goroutine 20 [sync.Cond.Wait]:
sync.runtime_notifyListWait(0x1454cbe8, 0x0)
runtime/sema.go:513 +0x175
sync.(*Cond).Wait(0x1454cbe0)
sync/cond.go:56 +0xa0
github.com/hajimehoshi/oto/v2.(*players).wait(0x146a6870)
github.com/hajimehoshi/oto/[email protected]/player_notjs.go:55 +0x6e
github.com/hajimehoshi/oto/v2.(*players).loop(0x146a6870)
github.com/hajimehoshi/oto/[email protected]/player_notjs.go:62 +0x3b
created by github.com/hajimehoshi/oto/v2.newPlayers
github.com/hajimehoshi/oto/[email protected]/player_notjs.go:37 +0xbf
eax 0x1
ebx 0x0
ecx 0x0
edx 0x73553af0
edi 0x2affa0
esi 0x3bb
ebp 0x0
esp 0x12fcd0
eip 0x0
eflags 0x10202
cs 0x1b
fs 0x3b
gs 0x0
For now, I got a set of regression test demos, and found:
Only seems to be one screen in the game with nothing else in reach, assuming there is at least one more screen then you need to moderate the level design to meet players half way. Current state of the game is unplayable to none mind readers....
While the 1.3.359 release on fdroid was perfect, updating to 1.3.367 made the game so slow that I can't play it anymore. I have an old phone (OnePlus 1) but it was working just perfect until the last release.
It is run from another script but it doesn't have execute permissions so the build fails with Bourne shell.
That option should only reduce performance by not calling text.CacheGlyphs(), but it's actually breaking all font rendering.
This issue was apparently introduced in 91a0526 which updated Ebitengine:
- github.com/hajimehoshi/ebiten/v2 v2.1.4
+ github.com/hajimehoshi/ebiten/v2 v2.2.0-alpha.11.0.20210817032719-12350e2fee5d
This issue becomes more relevant now as glyph precaching no longer works in Ebitengine 2.5 due to better font hinting support.
Hello divVerent,
aaaaxy is really awesome, I enjoyed its non-linear gameplay with a lot of surprises! Thank you for making it open source! :)
Can I "buy you a coffee"? ;-)
I have a generic NES-like controller branded "retro power" that the game interprets as always holding down left. The controller works fine in AntiMicroX and Taisei, but for some reason AAAAXY seems to misread the controller. I tried running `./AAAAXY-x86_64.AppImage --gamepad_override "0300000079000000110000001001000012117,Retrolink SNES Controller,platform:Linux,a:b2,b:b1,x:b3,y:b0,back:b8,start:b9,leftshoulder:b4,rightshoulder:b5,dpup:a1,dpleft:a0,dpdown:a1,dpright:a0," (I got the gamepad override string from AntiMicroX. The gamepad doesn't really have that many buttons.), but that seemed to have no effect. Actually, I just now noticed it says "[INFO] gamepad mappings from --gamepad_override applied" regardless of whether I actually use the "--gamepad_override" option.
I have tried "AAAAXY 1.2.280+20220822.2294.9ff4b8b7" and "AAAAXY 1.2.321+20220905.2335.e05b1efe", both via the AppImage, and I am using Trisquel GNU/Linux Nabia (10.0.1) as my operating system. Unfortunately, I could not find a controller that actually works with AAAAXY. I have another controller that came with the NES-like one, and it has a similar problem, and I have a couple of Wii remotes, which do not have the holding-down-left problem, but the D-pad is rotated and none of the buttons jump or pause. The Wii remote D-pad controls the entire operating system for some reason though, so I think the D-pad rotation is a operating system problem or something (Actually, the way the D-pad is rotated would make sense if I held the Wii remote like a TV remote.).
Based on the current user base, Spanish is a language worth adding to the game.
This can be done here:
https://transifex.com/aaaaxy/aaaaxy
As I do not speak Spanish, I am filing this issue as an invitation to contribute.
I saw this on f-droid and it has been a lot of fun.
However, the platforming is a bit difficult. It would be more comfortable if the B button was closer to the A button. Perhaps there should be an option on mobile to allow the user to move the on-screen controls.
I recently updated the game, and it now isn't launching, instead it give this log (from terminal output, also I censored my name):
2023/07/25 16:46:31.242812 [INFO] requested logical scale factor: 0
2023/07/25 16:46:31.242820 [INFO] device scale factor: 1
2023/07/25 16:46:31.242841 [INFO] screen size: 1920x1080
2023/07/25 16:46:31.242843 [INFO] max size: 1792x952
2023/07/25 16:46:31.242847 [INFO] max physical scale factors: 2.8, 2.6444444444444444
2023/07/25 16:46:31.242851 [INFO] requested physical scale factor: 2.6444444444444444
2023/07/25 16:46:31.242853 [INFO] chosen physical scale factor: 2
2023/07/25 16:46:31.242856 [INFO] chosen logical pixel scale factor: 2
2023/07/25 16:46:31.242858 [INFO] chosen window size: 1280x720
2023/07/25 16:46:31.242861 [INFO] starting early initialization
2023/07/25 16:46:31.242867 [INFO] configs will be written to /home/[name]/.config/AAAAXY/*
2023/07/25 16:46:31.242873 [INFO] save games will be written to /home/[name]/.local/share/AAAAXY/*
2023/07/25 16:46:31.243530 [INFO] asset search path: [dat:aaaaxy.dat(.->/)]
2023/07/25 16:46:31.244940 [INFO] detected language English (not translating)
2023/07/25 16:46:31.245004 [INFO] font pinning coverage: 100%
2023/07/25 16:46:31.245012 [INFO] charset pinned: !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\134]^_`abcdefghijklmnopqrstuvwxyz{|}~©¾àãéöπτ
2023/07/25 16:46:31.248000 [INFO] AAAAXY 1.4.39+20230725.3058.087fe586
2023/07/25 16:46:31.248007 [INFO] finished early initialization
goroutine 1 [running, locked to thread]:
runtime/debug.Stack()
runtime/debug/stack.go:24 +0x65
runtime/debug.PrintStack()
runtime/debug/stack.go:16 +0x19
github.com/divVerent/aaaaxy/internal/log.Fatalf({0x5650540be21b, 0x1d}, {0xc00049df48, 0x1, 0x1})
github.com/divVerent/aaaaxy/internal/log/log.go:101 +0x3c
main.main()
github.com/divVerent/aaaaxy/main.go:125 +0x24d
2023/07/25 16:46:31.264193 [FATAL] RunGame exited abnormally: VersionUnavailable: GLX: Failed to create context: BadValue (integer parameter out of range for operation)
I am working on also releasing AAAAXY for iOS.
A first test build is available here:
https://testflight.apple.com/join/bQC1sOev
Note that it currently stores savegame and config data in a Documents folder so users can get them out or back in as a means to investigate or backup/restore - I may not keep it that way for an actual release, but if I change that, I will make sure that there is at least some way to transfer this data to a new (more hidden) location. I do kinda like though that using the Documents folder means I get a setting to enable/disable iCloud syncing of the savegame data.
Feedback welcome!
Devices I am testing on (intentionally got some older ones for this so I can ensure great performance for everyone):
In all shaders but the CRT shader, we can simply use an adjusted GeoM and all will fall into place.
In the CRT shader, the GeoM scales the output, and thus in pan and stretch modes needs to be a GeoM that scales the input to fullscreen size. Further transformation needs to be done in shader code.
Suggest I first think of a way to generalize this transform as needed by the shader code, and then apply the same to all places equivalently.
Cause is here:
https://github.com/golang/go/blob/master/src/time/zoneinfo_ios.go#L43
Fix will be similar to what we did for Android: detect time zone in Objective C code and send it to Go.
The loading screen on the 32bit build on a 64bit machine takes very long. The game also lags out for about half a second when touching the Leap of Faith checkpoint.
The main things taking long seem OggVorbis related, and I can not see any suspicious activity in ProcessMonitor.
Issue exists in current build and is unchanged in Ebitengine 2.5.
Currently, Close() can leave a sound in an ugly state, causing clicking.
Let's move the fade out logic from music/ to audiowrap/ and run it on EVERY Close() of a still playing sound at nonzero volume.
Should be OK performance wise as Close() isn't called that often; one-shot sounds don't need it. Also, maybe make it an explicit FadeOut(d time.Duration)
even.
While at it, we could even kill music multitrack fading logic entirely; may still want to ensure time between tracks though.
Let's add sounds for:
Goal is to have enough sounds to make a blind playthrough not too hard. Although quite some places are probably blind-impossible - still would be nice to have a blind playthrough route. Pretty sure the ending of the game is possible that way, but not sure if any of the three Anti-Hub sections is playable blindly.
This seems good:
https://pkg.go.dev/golang.org/x/text/message
For menu and game code strings, we can use p.Sprint() directly and the extractor should just work; for in-game stuff, however, we need to write a custom extractor that gets the translatable strings out of the .tmx file.
Seems very feasible though. Do need to figure out how to make it auto extractable from source; if this doesn't seem feasible, we may need a different approach. Support for a website like Transifex would be nice, although not required.
Running on Android, acquired from F-Droid.
I have gotten to a room that gives you gloves to hold platforms, but while I can grab and place the platform in that room, I can't stand on it. I fall straight through. It seems clear that you're intended to stand on them, since there's an exit at the top of the room that can only be reached by doing so.
Web version works
Maybe unflip JUST the button descriptions and the logo on there?
Just seen in in my log that "Reached ... at ..." messages were often duplicated. Cause not known yet.
It seams to be impossible to generate a demo file when playing on android. One way this could be possible is by putting demo files with the date and time in /sdcard/Android/data/io.github.divVerent.aaaaxy/files/demos
if the user enables an option to do so. A better way would be to make this directory configurable.
As another related suggestion, it would be nice to be able to enable the timer in android.
These things would be useful for speedrunning on android without recording the screen.
Great game by the way!
On Android, from F-Droid.
I paused the game so I could make the other github issue I made, but it did not pause the timer, and it has no way to return to the game without teleporting somewhere, making pausing effectively a fail-state.
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.