Coder Social home page Coder Social logo

tayx94 / graphy Goto Github PK

View Code? Open in Web Editor NEW
2.5K 58.0 213.0 24.16 MB

Graphy is the ultimate, easy to use, feature packed FPS counter, stats monitor and debugger for your Unity project.

License: MIT License

C# 95.26% ShaderLab 4.74%
unity-asset unity fps-counter stats-monitor stats-for-nerds

graphy's Introduction

Graphy - Ultimate FPS Counter - Stats Monitor & Debugger (Unity)

openupm License: MIT Unity 2019.4+

Open Issues Downloads Contributors Stars Forks

Chat Discord

Twitter

Links: Discord | Mail | Twitter | Asset store | Forum post | Donations

WINNER of the BEST DEVELOPMENT ASSET in the Unity Awards 2018.

Graphy Image

Graphy is the ultimate, easy to use, feature packed FPS Counter, stats monitor and debugger for your Unity project.

Main Features:

  • Graph & Text:
    • FPS
    • Memory
    • Audio
  • Advanced device information
  • Debugging tools

With this tool you will be able to visualize and catch when your game has some unexpected hiccup or stutter, and act accordingly!

The debugger allows you to set one or more conditions, that if met will have the consequences you desire, such as taking a screenshot, pausing the editor, printing a message to the console and more! Even call a method from your own code if you want!

Additional features:

  • Customizable look and feel
  • Multiple layouts
  • Custom Inspector
  • Hotkeys
  • Easy to use API (accessible from code)
  • Works on multiple platforms
  • Background Mode
  • Works from Unity 5.4 and up!
  • Well documented C# and Shader code included

Links:

Contact:

Installation

  1. The package is available on the openupm registry. You can install it via openupm-cli.
openupm add com.tayx.graphy
  1. You can add this package in Unity Package Manager by adding it to the Scoped Registries at Edit > Project Settings > Package Manager > Scoped Registries

Add a section on the left called package.openupm.com On the right, add Name: package.openupm.com URL: https://package.openupm.com Scopes: com.openupm com.tayx.graphy

image

Then in Window > Package Manager, you can select Packages: My Registry to see Graphy as a package to download image

  1. After step 2, you can also install via git url by adding this entry in your manifest.json
{
  "dependencies": {
    ...
    "com.tayx.graphy": "https://github.com/Tayx94/graphy.git",
    ...
  }
}
  1. You can also download it from the Asset Store

  2. Click here for old version that supports Unity 5.4+: Unity 5.4+

Development of Graphy

Maintainer and main developer: Martín Pane Twitter

Graphy is FREE to use, but if it helped you and you want to contribute to its development, feel free to leave a donation!

Contributing

Let's make Graphy the go-to for stats monitoring in Unity!

I would really appreciate any contributions! Below you can find a roadmap for future planned features and optimisations that you might be able to help out with. If you want to make a big pull request, please do it on the "dev" branch.

Create a GitHub issue if you want to start a discussion or request a feature, and please label appropriately.

You can also join the Discord for active discussions with other members of the community.

Roadmap

Planned features (No ETA):

  • Add GfxDriver stats to the RAM module.
  • Scale Canvas (GetComponent().scaleFactor *= multiplier;) -> If it changes, set again.
  • Make a template for a graph + text module so people can create their own easily.
  • Allow storing FPS for a predetermined time to allow benchmarks.
  • Dump all Graphy Data as a string to:
    • File.
    • Send to server.
    • Send mail.
  • Add a preprocessor key #GRAPHY to avoid adding the asset in builds.

License

Graphy is released under the MIT license. Although I don't require attribution, I would love to know if you decide to use it in a project! Let me know on Twitter or by email.

graphy's People

Contributors

0lento avatar andgeno avatar crillon avatar d3fau4 avatar dmitry1100 avatar electroball09 avatar haruma-k avatar kaladrius2trip avatar kortemey avatar manuelrauber avatar maxsun-xrspace avatar mosthated avatar mrgove10 avatar nuclearcookie avatar per-morten avatar pixiongames avatar qfsw avatar robyer1 avatar rockylars avatar scscgit avatar superpenguin avatar tayx94 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

graphy's Issues

FindAudioListener issue

I'm running 2020.3.4f1

Graphy v1.5.2 was working okay for me.

But after upgrading to v2.1.1 I'm getting the following errors which relate to the "AUDIO - Module".

My Boot scene only contains a GameManager and a Preloader.
The GameManager handles scene loading, plus various persistent prefabs, including a AudioManager singleton.

It was work okay v1.5.2, but something has changed.


NullReferenceException: Object reference not set to an instance of an object
Tayx.Graphy.Audio.G_AudioMonitor.FindAudioListener () (at Assets/Graphy - Ultimate Stats Monitor/Runtime/Audio/G_AudioMonitor.cs:181)
Tayx.Graphy.Audio.G_AudioMonitor.UpdateParameters () (at Assets/Graphy - Ultimate Stats Monitor/Runtime/Audio/G_AudioMonitor.cs:145)
Tayx.Graphy.Audio.G_AudioMonitor.Init () (at Assets/Graphy - Ultimate Stats Monitor/Runtime/Audio/G_AudioMonitor.cs:201)
Tayx.Graphy.Audio.G_AudioMonitor.Awake () (at Assets/Graphy - Ultimate Stats Monitor/Runtime/Audio/G_AudioMonitor.cs:70)

NullReferenceException: Object reference not set to an instance of an object
Tayx.Graphy.Audio.G_AudioMonitor.FindAudioListener () (at Assets/Graphy - Ultimate Stats Monitor/Runtime/Audio/G_AudioMonitor.cs:181)
Tayx.Graphy.Audio.G_AudioMonitor.UpdateParameters () (at Assets/Graphy - Ultimate Stats Monitor/Runtime/Audio/G_AudioMonitor.cs:145)
Tayx.Graphy.Audio.G_AudioManager.UpdateParameters () (at Assets/Graphy - Ultimate Stats Monitor/Runtime/Audio/G_AudioManager.cs:184)
Tayx.Graphy.Audio.G_AudioManager.Start () (at Assets/Graphy - Ultimate Stats Monitor/Runtime/Audio/G_AudioManager.cs:59)

Screen Shot 2021-04-17 at 2 18 34 pm

"InvalidOperationException: Collection was modified" when GraphyDebugger is used with "Execute Once" enabled

Using v1.4.3 (another small issue: the included pdf says it's v1.4.2)

InvalidOperationException: Collection was modified; enumeration operation may not execute.
System.ThrowHelper.ThrowInvalidOperationException (System.ExceptionResource resource) (at <ac823e2bb42b41bda67924a45a0173c3>:0)
System.Collections.Generic.List`1+Enumerator[T].MoveNextRare () (at <ac823e2bb42b41bda67924a45a0173c3>:0)
System.Collections.Generic.List`1+Enumerator[T].MoveNext () (at <ac823e2bb42b41bda67924a45a0173c3>:0)
Tayx.Graphy.GraphyDebugger.CheckDebugPackets () (at Assets/3rdParty/Tayx/Graphy - Ultimate Stats Monitor/Scripts/GraphyDebugger.cs:389)
Tayx.Graphy.GraphyDebugger.Update () (at Assets/3rdParty/Tayx/Graphy - Ultimate Stats Monitor/Scripts/GraphyDebugger.cs:182)

Can be fixed by changing foreach to for, which also allows the removal of .IndexOf in ExecuteOnce evaluations. I've also omitted the initial m_debugPackets.Count > 0 check, combined the two null checks and inverted the null check to reduce nesting.

The fixed method is available here:

private void CheckDebugPackets()
{
    if (m_debugPackets == null)
    {
        return;
    }
    
    for (var i = 0; i < m_debugPackets.Count; i++)
    {
        DebugPacket packet = m_debugPackets[i];
        if (packet != null && packet.Active)
        {
            packet.Update();
    
            if (packet.Check)
            {
                switch (packet.ConditionEvaluation)
                {
                    case ConditionEvaluation.All_conditions_must_be_met:
                        int count = 0;
    
                        foreach (var packetDebugCondition in packet.DebugConditions)
                        {
                            if (CheckIfConditionIsMet(packetDebugCondition))
                            {
                                count++;
                            }
                        }
    
                        if (count >= packet.DebugConditions.Count)
                        {
                            ExecuteOperationsInDebugPacket(packet);
    
                            if (packet.ExecuteOnce)
                            {
                                m_debugPackets[i] = null;
                            }
                        }
    
                        break;
    
                    case ConditionEvaluation.Only_one_condition_has_to_be_met:
                        foreach (var packetDebugCondition in packet.DebugConditions)
                        {
                            if (CheckIfConditionIsMet(packetDebugCondition))
                            {
                                ExecuteOperationsInDebugPacket(packet);
    
                                if (packet.ExecuteOnce)
                                {
                                    m_debugPackets[i] = null;
                                }
    
                                break;
                            }
                        }
    
                        break;
                }
            }
        }
    }
     
    m_debugPackets.RemoveAll((packet) => packet == null);
}

Hide Graphy in Game view when it will be disabled

If I add Graphy and set it to not be enabled on start, it still shows up in the Game Window in the Editor until I click Play.

Is it possible to hide it in the Game window until it is explicitly called by the script to be visible? It takes up a lot of screen estate and we still use that window when not in play mode to see camera shots, etc.

Thank you for the amazing plugin anyways!

Redesign of Singleton pattern

I would suggest to redesign the singleton pattern so when a GraphyManager is destroyed but recreated sometimes latter, the user can still access the Instance variable.

Unity asset store version out of date

Hi, thanks so much for this plugin. I just noticed the unity asset store version is out of date compared to this repo. Be handy if it stayed up to date for those of us that like to get alerted to version updates through the package manager.

Version control

Hi @Tayx94,

Thanks for making this awesome UPM package. I'm the creator of the OpenUPM platform, an open-source UPM registry, and continuous build service based on Git tags. It's hosting more than 200+ open-source UPM packages at the time of writing.

A folk submitted your packages to the platform which brings me here. https://openupm.com/packages/com.tayx.graphy/

It looks good, but OpenUPM still needs a valid Git Tag to work with. You already have GitHub releases (which created Git tags) based on the master branch. However, the upm branch is ahead of the master branch. So our build pipelines failed to locate the package.json from existing Git tags.

If this makes sense for you, please consider two solutions

  1. You can create an extra tag upm/x.y.z tag (based on the upm branch) along with the x.y.z tag (based on the master branch). Then I can set our pipelines to track tag with upm prefix only. This will be the easiest way to go. But you probably need a tool to automate the tagging.
  2. You can also merge the changes from the upm branch back to the master branch. Our pipelines can locate the position of the package.json. Then you just do regular GitHub release. You can keep the upm branch synced with Github Actions. This is a better way to go, you get auto-synced upm branch and you don't need to do extra tagging.

Domain / Scene Reloading off causing errors on Play

I've turned off Domain and Scene Reloading for ridiculously faster time to Play and exit Play mode in Unity. It's limits are that it does not reset static data. I get these errors / warnings after hitting Play a second time. It would be awesome if you could accomodate a fix for this using [InitializeOnLoad] to reinit the necessary data when not Domain or Scene reloading!
Screen_Shot_2021-09-12_at_10 48 50_AM

Not working in AssetBundles

What
AssetBundle with Scene A has an refrence to prefab [Graphy].

When this prefab (and all its assets) is bundled into the same AssetBundle as Scene A it does work.
When this prefab (and all its assets) is bundled into its own AssetBundle it does not work.

Cause
This seems to be connected to a limitation of unity, which causes it to be unable to load shaders at runtime from AssetBundles.

Solution
The shader fields on the prefab must be replaced with materials in order to be loaded at runtime (as far as I know)

I can work around this with including graphy into the main application but I'd love to use graphy as an optional module.

Alt tabbing back into Unity reopens Graphy

Steps:

  1. Hide Graphy
  2. Alt tab out of Unity
  3. Alt tab back in to regain focus
  4. Graphy will reopen on reload, yet it will still consider itself closed (so the hide key combo will need to be inputted twice to actually hide it again)

Shader issue with LWRP/Universal SRP (Didn't check HDRP, but chances are good it will be a similar result)

I was trying out the Universal SRP in 2019.3b and the LWRP in 2019.2 (same thing, new name) and noticed Graphy having a stroke. Looks like the FPS shader isn't too happy.

Here it is in normal mode: https://i.imgur.com/Uuuj3te.gifv
and here in light mode: https://i.imgur.com/PyuMnyh.gifv

I mentioned in Discord but will mention again in case it is lost in chat, with 19.3's release, LWRP/Universal RP will be default going forward and I don't believe there will be a non-SRP renderer.

Request: start hidden

I can't see a way to start off hidden. I had a go at adding this, but the way the separate managers are set up and enabled, means that starting them off disabled loses some of the setup (e.g. positions).

I think to do this nicely, the toggling needs to exist on a game object one level up from the overall manager.

Having an issue after adding Graphy to my project

Hey there,
I added Graphy to my project and now I can't get all these young beautiful women to leave me alone. Any suggestions? I need to be able to focus on my project, but they are everywhere.

<3

NullReferenceException in Editor after a Hot-Swap when Graphy is disabled

While in Editor, if Graphy is disabled (e.g. by default via Ctrl+H) and a Hot-Swap occurs (alt+tabbing into Unity after any script was modified), the OnApplicationFocus() calls UpdateParameters() on both FpsGraph and AudioGraph while their m_shaderGraph == null, throwing a NullReferenceException.

My solution is to simply return those functions if m_shaderGraph == null, so there should be some code review in order to make sure this doesn't cause any new issues. I noticed that in RamGraph, the UpdateParameters() calls Init() if any variable with a m_shaderGraph* prefix is null, so this may be possibly a better solution. Why are those classes even implemented differently, was it just an oversight?

My question is though, why are the Update* methods even getting called? If the Graphy is completely disabled, why does it even do anything, and why does it require any initialization? I've checked some of your README materials, and I don't see any "zero performance cost if disabled" stated anywhere. Does that mean this extension is unstable and shouldn't be used in production? Please make sure this isn't the case :)

Tested in Unity 2019.2.8f1

IndexOutOfRangeException when TimeScale is 0 (game paused)

Hi,

Whenever the TimeScale is 0, the console spits out:

[Exception] [Tayx/Graphy - Ultimate Stats Monitor/Scripts/Util/NumString.cs:76] [1251] (154) IndexOutOfRangeException: Index was outside the bounds of the array.

A possible solution is to change line 66 of FpsMonitor.cs to:

m_currentFps = 1 / unscaledDeltaTime;

Kind Regards,

  • David León

Issue with Average Frame Rate

Latest version on the asset store looks to have an issue with the average frame rate. When the samples are full just refreshes the last sample while even when slowing the app down the average stays the same.

        if (m_avgFpsSamplesCount < m_avgFpsSamplesCapacity)
        {
            m_avgFpsSamplesCount++;
        }
        else
        {
            m_avgFpsSamplesCount = 0;
        }

appeared to fix in the the g_fpsmonitor.cs line 88 but not sure if this is how it was intended to work

NullRef for EditorStyles.boldlabel

in LoadGuiStyles() (GraphyDebugEditor & GraphyManagerEditor).
Can be fixed by calling it once in OnGUI (as the editor styles are not initialized before the first OnGUI event)

Graphs only show up in one eye in VR

URP 2019.3.15f1 Single Pass Instanced
The graphs for FPS and RAM are only showing up in the right eye.

In GraphStandard.shader, there are 3 code blocks to assist with this issue.
Each is wrapped with

#if UNITY_2017_1_OR_NEWER
--code here
#endif

removing these preprocessor blocks I was able to see the graphs in both eyes.

I can see that I have the keyword UNITY_2017_1_OR_NEWER in other assets in my project.
Maybe these preprocessor blocks work in scripts but not in shaders?

UI.Text to TMPro.Text?

Idea:

Support a A prefab version of Graphy using Text Mesh Pro (as to be performance enhanced so not getting bogged down by the UI System string bloat issues).

Since it's free now with unity might be a great idea to incorporate. I can have a go if you like.

Editor throws "Index of ouf range" exception when plugin is imported via UPM

When distributing the plugin via UPM, the editor inspector will run into index out of range exceptions in the GraphyEditorStyle.cs file. Basically the code assumes that the plugin will be located in the assets folder, which is true as long as it is not imported via the UPM (in that case it is under Packages or Library/PackageCache folder).

GraphyEditorStyle.cs.cs

            path = GetPath();
            path = path.Split(new string[] { "Assets" },StringSplitOptions.None)[1]
                       .Split(new string[] { "Graphy" },StringSplitOptions.None)[0];

Automatic layout for UI

When I set certain settings, the RAM module is very far down from with the FPS module.
It would be cool if it was modular and automatically changed the margin between the two modules depending on what is the current setting is, and their contents are (you can see the FPS counter numbers are out of the gray box)

FPS: Module state: Basic
RAM: Module state: Basic
Audio: Module state: Off
Advanced Data: Module state: off

image

Graphy crashes after script saving while Unity is running

How to reproduce

  1. Run your unity game
  2. Go modify a script (even adding a comment)
  3. Go back to unity, wait for unity to compile the changes
  4. After unity has finished, graphy will throw :
NullReferenceException: Object reference not set to an instance of an object
Tayx.Graphy.Fps.G_FpsGraph.UpdateParameters () (at Assets/Imports/Graphy - Ultimate Stats Monitor/Scripts/Fps/G_FpsGraph.cs:72)
Tayx.Graphy.Fps.G_FpsManager.RefreshParameters () (at Assets/Imports/Graphy - Ultimate Stats Monitor/Scripts/Fps/G_FpsManager.cs:219)
Tayx.Graphy.GraphyManager.RefreshAllParameters () (at Assets/Imports/Graphy - Ultimate Stats Monitor/Scripts/GraphyManager.cs:705)
Tayx.Graphy.GraphyManager.OnApplicationFocus (System.Boolean isFocused) (at Assets/Imports/Graphy - Ultimate Stats Monitor/Scripts/GraphyManager.cs:368)
UnityEditorInternal.InternalEditorUtility:OnGameViewFocus(Boolean) (at ?)
UnityEditor.DockArea:OnEnable() (at ?)

Afer this, your game is still running but in a wierd buggy state (buttons don't work sor example)

Unity Version : 2019.3.0b6

GuiStyle is not cached. Why?

GraphyManagerEditor.zip

You dont cache guiStyles, leading to "create" them + "load them from disk" 6 times per update. YOU ARE INSANE = memory leak etc.
You should use static class initialization => method is evaluated exactly once.
Before 6 Loads per update. After: 1 load per compile / assembly reload.
All that done by moving the offensive code in the static class LoadStyle.
This way the static variables are initialized on first use = avoids unity screaming about order issue. Trust me. (This means if you read variable at OnInspectorGui/OnGui, etc, unity would be happy).
Another Benefit of static initialization is that you will never have to do a null check = even faster.
Also why is your folder not located in the Plugin folder? You are reducing my compilation speed = evil.
Here is bug fix : I fixed class GraphyManagerEditor, you should do the same with Graphy...Debugger.

    static class LoadStyle
    {
        public static Texture2D m_logoTexture;
        public static GUISkin m_skin;
        public static GUIStyle m_headerStyle1;
        public static GUIStyle m_headerStyle2;
        public static GUIStyle foldoutStyle;
        static LoadStyle()
        {
            Debug.Log("LoadStyles");
            var path = "Assets/Plugins/Graphy Ultimate Stats Monitor/";

            m_logoTexture = AssetDatabase.LoadAssetAtPath<Texture2D>
                (
                 path +
                 "Textures/Manager_Logo_" +
                 (EditorGUIUtility.isProSkin ? "White.png" : "Dark.png")
                );

            m_skin = AssetDatabase.LoadAssetAtPath<GUISkin>
                (
                 path +
                 "GUI/Graphy.guiskin"
                );

            if (m_skin != null)
            {
                m_headerStyle1 = m_skin.GetStyle("Header1");
                m_headerStyle2 = m_skin.GetStyle("Header2");

                SetGuiStyleFontColor
                    (
                     guiStyle:   m_headerStyle2,
                     color:      EditorGUIUtility.isProSkin ? Color.white : Color.black
                    );
            }
            else
            {
                m_headerStyle1 = EditorStyles.boldLabel;
                m_headerStyle2 = EditorStyles.boldLabel;
            }

            foldoutStyle = new GUIStyle(EditorStyles.foldout)
            {
                font            = m_headerStyle2.font,
                fontStyle       = m_headerStyle2.fontStyle,
                contentOffset   = Vector2.down * 3f //TODO: Maybe replace this with "new Vector2(0f, -3f);"
            };

            SetGuiStyleFontColor
                (
                 guiStyle:   foldoutStyle,
                 color:      EditorGUIUtility.isProSkin ? Color.white : Color.black
                );
        }
        static void SetGuiStyleFontColor(GUIStyle guiStyle, Color color) //TODO: Perhaps add a null check.
        {
            guiStyle.normal     .textColor = color;
            guiStyle.hover      .textColor = color;
            guiStyle.active     .textColor = color;
            guiStyle.focused    .textColor = color;
            guiStyle.onNormal   .textColor = color;
            guiStyle.onHover    .textColor = color;
            guiStyle.onActive   .textColor = color;
            guiStyle.onFocused  .textColor = color;
        }
    }

Graphy throws an error if no camera is present in the scene

Steps

  1. Add Graphy to a new project
  2. Remove the Camera
  3. Disable the Audio Module on Graphy
  4. Run the game

Behaviour
Throws the following error

NullReferenceException: Object reference not set to an instance of an object
Tayx.Graphy.Audio.G_AudioMonitor.FindAudioListener () (at Assets/Tayx/Graphy - Ultimate Stats Monitor/Scripts/Audio/G_AudioMonitor.cs:180)
Tayx.Graphy.Audio.G_AudioMonitor.UpdateParameters () (at Assets/Tayx/Graphy - Ultimate Stats Monitor/Scripts/Audio/G_AudioMonitor.cs:144)
Tayx.Graphy.Audio.G_AudioMonitor.Init () (at Assets/Tayx/Graphy - Ultimate Stats Monitor/Scripts/Audio/G_AudioMonitor.cs:187)
Tayx.Graphy.Audio.G_AudioMonitor.Awake () (at Assets/Tayx/Graphy - Ultimate Stats Monitor/Scripts/Audio/G_AudioMonitor.cs:74)

Expected
No error should be thrown, especially since we have the audio module disabled

A repro project has been included demonstrating it on Unity 2018.3.7f1
GraphyBugRepro.zip

[Suggestion] Rearange the repo so that we can use it as a submodule

Hi,
first of all great asset, I bought it a few month before you made it free and it's served me right on all my project since.

I like to use submodules on my projects so that if I'm reusing an asset I can have 1 separate repository for the asset. I would love to do this with graphy without having to use the asset store but since this repository contains all the unity project and not just the Graphy - Ultimate Stats Monitor folder I can't do it.

I would suggest only having this folder in the repository.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.