Code Monkey home page Code Monkey logo

attribouter's Introduction

Open Source

I've written a wide range of software for various reasons - to suit my needs, experiment with new functionality, or just mess around for fun.

Much of it is buggy, inefficient, out of date, or otherwise incomplete - but I like to open source it regardless so anyone can see what I'm working on. Generally, it's a lot more interesting to interact with other people and collaborate on improving my work.

If you need help with the contributing process in any of my projects, have any questions or confusion, or want to get feedback before a contribution, please don't hesitate to get in touch!

Discord Twitch

Elsewhere

attribouter's People

Contributors

divadsn avatar fennifith avatar gcantoni avatar rroygit 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

attribouter's Issues

View Open Source Licences bug

Great library!

I found a bug with the following settings:

    <licenses
        overflow="0"
        showDefaults="false">
        <project repo="TheAndroidMaster/Attribouter" />
    </licenses>

the title of the section appears as "View @string/title_attribouter_licences".
The bug does not appear if I remove the overflow attribute.
I seems that for the translators section, for example, this bug does not appear if I set the overflow to 0.

Option to Remove Default Contributors/Libraries

The library currently adds all of the contributors to this repository and the libraries it uses by default, which would be nice if it didn't do that for all instances of the contributor/license tags. For example, if someone wanted more than one group of contributors, the contributors from this repository would be added to all of them regardless.

Improve Documentation

It might not be a great idea to place documentation for the ENTIRE project in one .md file. While this is great for smaller projects (like all of the other libraries that I have made so far), this one is quickly becoming cluttered and it might be worth finding a better method of documentation (like a wiki, for example, with just a basic overview in the README) instead.

freeze after updating from 0.0.8 to 0.1.0

When updating the library version and opening an Attribouter fragment, I get the following error:

W/System.err: java.lang.ClassNotFoundException: about W/System.err: at me.jfenn.attribouter.fragments.AboutFragment.onCreateView(AboutFragment.java:65) W/System.err: Caused by: java.lang.ClassNotFoundException: Didn't find class "about" on path: DexPathList[[zip file ... W/System.err: at me.jfenn.attribouter.fragments.AboutFragment.onCreateView(AboutFragment.java:65) W/System.err: at me.jfenn.attribouter.fragments.AboutFragment.onCreateView(AboutFragment.java:90) W/System.err: at me.jfenn.attribouter.fragments.AboutFragment.onCreateView(AboutFragment.java:90) W/System.err: at me.jfenn.attribouter.fragments.AboutFragment.onCreateView(AboutFragment.java:90) W/System.err: at me.jfenn.attribouter.fragments.AboutFragment.onCreateView(AboutFragment.java:90) W/System.err: at me.jfenn.attribouter.fragments.AboutFragment.onCreateView(AboutFragment.java:90) W/System.err: at me.jfenn.attribouter.fragments.AboutFragment.onCreateView(AboutFragment.java:90) W/System.err: at me.jfenn.attribouter.fragments.AboutFragment.onCreateView(AboutFragment.java:90)

Support for Twitter profiles or possibly other custom attributes

Support for adding twitter handles for users aswell as the project. It might actually be better to implement a way to add custom attributes instead before adding endless new attributes in the library.

Might work on something like this myself in the evening, will send a PR if it results in anything usable.

NPE while loading

This probably kind of goes hand in hand with #38. Because we have so much data in Attribouter it takes a while to load (noticable amount). If you already press on a memeber during that time a NPE is thrown.

Can get a stacktrace of this in the evening, just had to make the report when I finally remembered that I wanted to report this.

Overflow=0 not working with translators

image

Stacktrace when I click on the item:

05-07 19:04:22.497 9482-9482/ch.deletescape.lawnchair E/AndroidRuntime: FATAL EXCEPTION: main
                                                                        Process: ch.deletescape.lawnchair, PID: 9482
                                                                        java.lang.RuntimeException: java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
                                                                            at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:460)
                                                                            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
                                                                         Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
                                                                            at me.jfenn.attribouter.adapters.InfoAdapter.getItemCount(InfoAdapter.java:39)
                                                                            at android.support.v7.widget.RecyclerView.dispatchLayoutStep1(RecyclerView.java:3722)
                                                                            at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3527)
                                                                            at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:4082)
                                                                            at android.view.View.layout(View.java:19664)
                                                                            at android.view.ViewGroup.layout(ViewGroup.java:6075)
                                                                            at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1791)
                                                                            at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1635)
                                                                            at android.widget.LinearLayout.onLayout(LinearLayout.java:1544)
                                                                            at android.view.View.layout(View.java:19664)
                                                                            at android.view.ViewGroup.layout(ViewGroup.java:6075)
                                                                            at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
                                                                            at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
                                                                            at android.view.View.layout(View.java:19664)
                                                                            at android.view.ViewGroup.layout(ViewGroup.java:6075)
                                                                            at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1791)
                                                                            at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1635)
                                                                            at android.widget.LinearLayout.onLayout(LinearLayout.java:1544)
                                                                            at android.view.View.layout(View.java:19664)
                                                                            at android.view.ViewGroup.layout(ViewGroup.java:6075)
                                                                            at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
                                                                            at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
                                                                            at android.view.View.layout(View.java:19664)
                                                                            at android.view.ViewGroup.layout(ViewGroup.java:6075)
                                                                            at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1791)
                                                                            at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1635)
                                                                            at android.widget.LinearLayout.onLayout(LinearLayout.java:1544)
                                                                            at android.view.View.layout(View.java:19664)
                                                                            at android.view.ViewGroup.layout(ViewGroup.java:6075)
                                                                            at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
                                                                            at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
                                                                            at com.android.internal.policy.DecorView.onLayout(DecorView.java:761)
                                                                            at android.view.View.layout(View.java:19664)
                                                                            at android.view.ViewGroup.layout(ViewGroup.java:6075)
                                                                            at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2496)
                                                                            at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2212)
                                                                            at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1392)
                                                                            at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6752)
                                                                            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:911)
                                                                            at android.view.Choreographer.doCallbacks(Choreographer.java:723)
                                                                            at android.view.Choreographer.doFrame(Choreographer.java:658)
                                                                            at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:897)
                                                                            at android.os.Handler.handleCallback(Handler.java:790)
                                                                            at android.os.Handler.dispatchMessage(Handler.java:99)
                                                                            at android.os.Looper.loop(Looper.java:164)
                                                                            at android.app.ActivityThread.main(ActivityThread.java:6499)
                                                                            at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:450)
                                                                            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 

Incorrect URLs Cause Crashes

The GitHub API appears not to verify that URLs input into the 'blog' field are actually URLs, so if a url that doesn't start with either http:// or http:// is provided then Attribouter crashes whenever one is clicked (since it just throws the value directly into the ACTION_VIEW data without checking that it's valid). Ideally, it should be validated before the link is even created so that even if the URL is invalid for some other reason, it still doesn't cause an error.

GitLab Support

Support for GitLab's API would be a nice addition. Unsure how I would differentiate between GitHub and GitLab repos/logins though, maybe with a prefix like "gitlab:TheAndroidMaster" going to GitLab, and "github:TheAndroidMaster" or just "TheAndroidMaster" (for backwards compatibility) going to GitHub.

Replace CLI with a website

It'd be more accessible to users that aren't as familiar with the command line, would probably solve a lot of the existing formatting issues, and could also serve to document the library a little better than just a single README (related: #14).

I Can't Subwedge

A bunch of methods and classes (such as Wedge.addChildren(XmlResourceParser) and ContributorWedge.ViewHolder) are inaccessible from external classes/packages, making subwedging virtually impossible - even reflection doesn't work in some cases. This must be chaaaaaaaaaaaaanged.

Better dynamic theming support

The current implementation sort of requires you to implement the fragment in your own activity and call setTheme(int) yourself, recreating the activity on each theme change, which - while workable - doesn't really provide the best implementation for most projects. Proposed changes are to implement .withTheme(int) and .withDarkTheme(boolean) methods in Attribouter, along with improving how the activity handles its toolbar / icon colors.

ArithmeticException - LinkInfoData:138

Not sure what was different between usage and testing that caused this, but there is now apparently an ArithmeticException at LinkInfoData:138.

Full stack trace

06-03 17:27:44.187 14094-14094/me.jfenn.feedage E/AndroidRuntime: FATAL EXCEPTION: main
    Process: me.jfenn.feedage, PID: 14094
    java.lang.ArithmeticException: divide by zero
        at me.jfenn.attribouter.data.info.link.LinkInfoData.compareTo(LinkInfoData.java:138)
        at me.jfenn.attribouter.data.info.link.LinkInfoData$Comparator.compare(LinkInfoData.java:163)
        at me.jfenn.attribouter.data.info.link.LinkInfoData$Comparator.compare(LinkInfoData.java:153)
        at java.util.TimSort.countRunAndMakeAscending(TimSort.java:356)
        at java.util.TimSort.sort(TimSort.java:216)
        at java.util.Arrays.sort(Arrays.java:1523)
        at java.util.Collections.sort(Collections.java:238)
        at me.jfenn.attribouter.data.info.AppInfoData.bind(AppInfoData.java:130)
        at me.jfenn.attribouter.data.info.AppInfoData.bind(AppInfoData.java:36)
        at me.jfenn.attribouter.adapters.InfoAdapter.onBindViewHolder(InfoAdapter.java:29)
        at me.jfenn.attribouter.adapters.InfoAdapter.onBindViewHolder(InfoAdapter.java:12)
        at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6673)
        at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6714)
        at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5647)
        at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5913)
        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5752)
        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5748)
        at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2232)
        at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1559)
        at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1519)
        at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:614)
        at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3812)
        at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3529)
        at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:4082)
        at android.view.View.layout(View.java:17564)
        at android.view.ViewGroup.layout(ViewGroup.java:5656)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
        at android.view.View.layout(View.java:17564)
        at android.view.ViewGroup.layout(ViewGroup.java:5656)
        at android.support.design.widget.HeaderScrollingViewBehavior.layoutChild(HeaderScrollingViewBehavior.java:132)
        at android.support.design.widget.ViewOffsetBehavior.onLayoutChild(ViewOffsetBehavior.java:42)
        at android.support.design.widget.AppBarLayout$ScrollingViewBehavior.onLayoutChild(AppBarLayout.java:1361)
        at android.support.design.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:894)
        at android.view.View.layout(View.java:17564)
        at android.view.ViewGroup.layout(ViewGroup.java:5656)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
        at android.view.View.layout(View.java:17564)
        at android.view.ViewGroup.layout(ViewGroup.java:5656)
        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1741)
        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585)
        at android.widget.LinearLayout.onLayout(LinearLayout.java:1494)
        at android.view.View.layout(View.java:17564)
        at android.view.ViewGroup.layout(ViewGroup.java:5656)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
        at android.view.View.layout(View.java:17564)
        at android.view.ViewGroup.layout(ViewGroup.java:5656)
        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1741)
        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585)
        at android.widget.LinearLayout.onLayout(LinearLayout.java:1494)
        at android.view.View.layout(View.java:17564)
        at android.view.ViewGroup.layout(ViewGroup.java:5656)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
        at com.android.internal.policy.DecorView.onLayout(DecorView.java:755)
        at android.view.View.layout(View.java:17564)
        at android.view.ViewGroup.layout(ViewGroup.java:5656)
        at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2422)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2142)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1299)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6558)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:871)
        at android.view.Choreographer.doCallbacks(Choreographer.java:683)
        at android.view.Choreographer.doFrame(Choreographer.java:619)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:857)
        at android.os.Handler.handleCallback(Handler.java:751)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6316)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:872)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:762)

CLI to generate the config file

If it can be automated, it should be automated, right? Idk. It would definitely be possible to write a cli to generate most of the contents of the xml file from just the repository name though, so I might work on this sometime.

Better String Resource / Translation support

Currently, unless otherwise specified, all data specified in an app's config file is replaced with the versions of that data fetched from github unless otherwise specified. However, the github versions of that data cannot be translated (as I'm pretty sure the github api only provides information in one language at a time, and most people do not write their bios in more than one language). Ideally, there would be a way to only fetch data from github for one language, and use the translated strings for the rest. This would require some extremely weird syntax in the config file though. Maybe something like bio="^(lang != en)@strings/someone_bio" to specify that the string should only be overwritten if the current locale is set to en. The lang != part isn't necessarily needed, but it improves readability and I might need to use the same or similar syntax elsewhere in this project later on.

Custom links on AppInfo have highest priority

When adding a custom link to the AppInfo it will automatically have the highest priority and thus appear on the left side of the list. A work around for this would currently be to just set the priority to -1 but this isn't the cleanest solution.

XML file has to be explicitly provided when using toFragment

The README states that the xml only has to be explicitly provided if it has a different name than attribouter.xml. This is true when working with the activity, if it is not provided and you try to create a fragment an exception will be thrown because the res is not set. This is not a huge inconvenience but definitely a bug.

Hide AppWedge name if resource not found

I never thought this would be an issue when writing it, but apparently I need to add some behavior for what to do if an app using Attribouter does not have a label. Granted, it is entirely possible to only put labels on the launcher activity, and the end user will likely not notice a thing, but this is still a bad practice. Maybe it would find use in packages that exist only as helper components (an external plugin for another app, for example).

Regardless, this shouldn't cause a crash, and Attribouter should just hide the label in this case. See AppWedge:100.

Ability to remove 'play store url'

Unsure why I removed this option. Maybe I was planning on adding an option to 'hide' links based on their ids, but forgot to actually make it. Meh.

LicensesWedge force title as string resource

Hi,
Is something like this possible with the current implementation? Prefixing it with "^" didn't work.

<me.jfenn.attribouter.wedges.LicensesWedge
        title="@string/open_source_licences" 
...

Ability to Display Contributors from Multiple Repositories

Possibly by adding a "repo" attribute to the <contributors> tag that overrides the one on the <about> tag. Might need to do that to <appInfo> as well. Actually, let's just get rid of the tag on the root element entirely, and move it to the individual children instead. Less fragmentation is good.

Options to overflow lists of items into a separate dialog/screen

Unsure whether I should have them only show the first few items + an "expand" button to make them bigger, first few items with a "view more" button leading to a dialog or activity, ONLY show a "view" button (without the first few items), or some combination of the above.

Crash on interaction with contributor

Pretty sure this is just a case of an empty URL string being passed to the UrlClickListener class. Weird stack trace though.

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: me.jfenn.attriboutersample, PID: 20401
                  android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat= (has extras) }
                      at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1816)
                      at android.app.Instrumentation.execStartActivity(Instrumentation.java:1525)
                      at android.app.Activity.startActivityForResult(Activity.java:4317)
                      at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:767)
                      at android.app.Activity.startActivityForResult(Activity.java:4276)
                      at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:754)
                      at android.app.Activity.startActivity(Activity.java:4600)
                      at androidx.core.content.ContextCompat.startActivity(ContextCompat.java:248)
                      at androidx.browser.customtabs.CustomTabsIntent.launchUrl(CustomTabsIntent.java:263)
                      at me.jfenn.attribouter.utils.UrlClickListener.onClick(UrlClickListener.java:19)
                      at android.view.View.performClick(View.java:5623)
                      at android.view.View$PerformClick.run(View.java:22433)
                      at android.os.Handler.handleCallback(Handler.java:751)
                      at android.os.Handler.dispatchMessage(Handler.java:95)
                      at android.os.Looper.loop(Looper.java:154)
                      at android.app.ActivityThread.main(ActivityThread.java:6316)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:872)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:762)

Remove hardcoded prefix word in Licences and Translators wedges when overflow is 0

Hi,
Setting a custom title, I would expect to see that string without a prefix in front of it.

<me.jfenn.attribouter.wedges.LicensesWedge
    overflow="0"
    title="Open Source Licences"
    showDefaults="false">
    <me.jfenn.attribouter.wedges.LicenseWedge repo="TheAndroidMaster/Attribouter" />
</me.jfenn.attribouter.wedges.LicensesWedge>

will produce "View Open Source Licences".
Removing the overflow="0" will produce the desired string of "Open Source Licences".

Update Config at Build Time

Might need to write an extra module to do this, but it's worth it. Also, an option to disable all runtime network requests should be present if this is implemented.

Attribouter doesn't load profile data from github if no repo is defined

For Lawnchair I am not fetching Contributors from GitHub repo="" because as we have the entire AOSP version history there the number of contributors (mostly the ones with 1-3 commits) is just huge.

I would however still like to be able to simply specify login for our contributors from GitHub and have Attribouter fetch the data for me. This however currently doesn't seem to work if no repo is specified.

Multithreading

Multiple threads. Multithreading. The act of having more than one thread at a single point in time.

ItemData instance creation from XML

This will require extensive modifications to the CLI (or even just replacing it completely - see #36), but I essentially want the XML to be "inflated" similarly to a layout file, where the entire package name of each class is provided in the tag. Sub-tags, like "contributor" or "link" would be unaffected (or even replaced with an ambiguous name, like "item"), and would simply be passed to the constructor of each "main" item (or I could just continue passing an instance of the parser like I am now). This would allow users to add their own functionality to the about screen instead of only being able to override layout files.

Separate "translations" section

Creating this so I don't forget about it. Basically a table of all the individual languages that have been translated with each contributor listed inside them. An option to display these in a separate screen/dialog would also be nice.

Feature request: theme support

Overwriting @style/AttribouterTheme is an option but it has its limitations if you have multiple themes in your app which can be switched.
I tried creating a separate Activity and then attach an About fragment to it which is great because you can switch the theme in onCreate.

        if (savedInstanceState == null) {
            Fragment fragment = Attribouter.from(this).withFile(R.xml.about).toFragment();

            FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
            ft.replace(R.id.fragment, fragment);
            ft.commitAllowingStateLoss();
        }

Unfortunately the theme is not maintained to a section with overflow "0" which opens a new view.
Is there a solution for this?

Data Binding!

This would make overriding layout files a lot more configurable, and it would also make it really FUN because data binding is FUN

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.