Git Product home page Git Product logo

wizardpager's People

Contributors

ddrboxman avatar rhodey avatar str4d 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

wizardpager's Issues

Cannot use strings in model

All strings are in wizardpager but we cannot use a conext with getString because the initialization of the wizardmodel is static, so the application is not created yet :(

Image duplication in ImageFragment

I found, that if you place in your wizard pager amount of ImagePage, so when you will startActivityForResult returned result will overwrite every your image. I found the way to avoid this:

Changing request codes to:

private final int GALLERY_REQUEST_CODE = Math.abs((short) (hashCode() ^ (hashCode() >>> 16)) - 0);
private final int CAMERA_REQUEST_CODE = Math.abs((short) (hashCode() ^ (hashCode() >>> 16)) - 1);

This will make every ImageFragment unique.
Later change onActivityResult for:

if(requestCode == CAMERA_REQUEST_CODE) {
            if (resultCode == Activity.RESULT_OK) {
                imageView.setImageURI(mNewImageUri);
                writeResult();
            }
        } else if(requestCode == GALLERY_REQUEST_CODE) {
            if (resultCode == Activity.RESULT_OK && data != null) {
                mNewImageUri = data.getData();
                imageView.setImageURI(mNewImageUri);
                writeResult();
            }
        }

java.lang.IllegalStateException: Recursive entry to executePendingTransactions when swap between branches

I'm trying to implement this library by changing the sample. Currently I just changed WizardModel but didn't touch anything in MainActivity. I get an exception, I tried to google and I found that I have to change getSupportFragmentManager() to getChildFragmentManager() but I ain't able to do this, because I'm inside activity. Here's stacktrace:

E/AndroidRuntime: FATAL EXCEPTION: main
E/AndroidRuntime: Process: me.cullycross.example, PID: 16709
E/AndroidRuntime: java.lang.IllegalStateException: Recursive entry to executePendingTransactions
E/AndroidRuntime:     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1544)
E/AndroidRuntime:     at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:545)
E/AndroidRuntime:     at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:163)
E/AndroidRuntime:     at android.support.v4.view.ViewPager.dataSetChanged(ViewPager.java:930)
E/AndroidRuntime:     at android.support.v4.view.ViewPager$PagerObserver.onChanged(ViewPager.java:2907)
E/AndroidRuntime:     at android.database.DataSetObservable.notifyChanged(DataSetObservable.java:37)
E/AndroidRuntime:     at android.support.v4.view.PagerAdapter.notifyDataSetChanged(PagerAdapter.java:276)
E/AndroidRuntime:     at me.cullycross.example.activities.OrderActivity.onPageDataChanged(OrderActivity.java:138)
E/AndroidRuntime:     at com.tech.freak.wizardpager.model.AbstractWizardModel.onPageDataChanged(AbstractWizardModel.java:52)
E/AndroidRuntime:     at com.tech.freak.wizardpager.model.Page.notifyDataChanged(Page.java:92)
E/AndroidRuntime:     at com.tech.freak.wizardpager.ui.TextFragment$1.afterTextChanged(TextFragment.java:97)
E/AndroidRuntime:     at android.widget.TextView.sendAfterTextChanged(TextView.java:7679)
E/AndroidRuntime:     at android.widget.TextView.setText(TextView.java:4056)
E/AndroidRuntime:     at android.widget.TextView.setText(TextView.java:3905)
E/AndroidRuntime:     at android.widget.EditText.setText(EditText.java:85)
E/AndroidRuntime:     at android.widget.TextView.setText(TextView.java:3880)
E/AndroidRuntime:     at android.widget.TextView.onRestoreInstanceState(TextView.java:3780)
E/AndroidRuntime:     at android.view.View.dispatchRestoreInstanceState(View.java:13621)
E/AndroidRuntime:     at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2893)
E/AndroidRuntime:     at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2893)
E/AndroidRuntime:     at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2893)
E/AndroidRuntime:     at android.view.View.restoreHierarchyState(View.java:13599)
E/AndroidRuntime:     at android.support.v4.app.Fragment.restoreViewState(Fragment.java:468)
E/AndroidRuntime:     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1053)
E/AndroidRuntime:     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1207)
E/AndroidRuntime:     at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738)
E/AndroidRuntime:     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1572)
E/AndroidRuntime:     at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:545)
E/AndroidRuntime:     at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:163)
E/AndroidRuntime:     at android.support.v4.view.ViewPager.populate(ViewPager.java:1106)
E/AndroidRuntime:     at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:552)
E/AndroidRuntime:     at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:514)
E/AndroidRuntime:     at android.support.v4.view.ViewPager.dataSetChanged(ViewPager.java:946)
E/AndroidRuntime:     at android.support.v4.view.ViewPager$PagerObserver.onChanged(ViewPager.java:2907)
E/AndroidRuntime:     at android.database.DataSetObservable.notifyChanged(DataSetObservable.java:37)
E/AndroidRuntime:     at android.support.v4.view.PagerAdapter.notifyDataSetChanged(PagerAdapter.java:276)
E/AndroidRuntime:     at me.cullycross.example.activities.OrderActivity.onPageTreeChanged(OrderActivity.java:150)
E/AndroidRuntime:     at com.tech.freak.wizardpager.model.AbstractWizardModel.onPageTreeChanged(AbstractWizardModel.java:61)
E/AndroidRuntime:     at com.tech.freak.wizardpager.model.BranchPage.notifyDataChanged(BranchPage.java:98)
E/AndroidRuntime:     at com.tech.freak.wizardpager.ui.SingleChoiceFragment.onListItemClick(SingleChoiceFragment.java:122)
E/AndroidRuntime:     at android.support.v4.app.ListFragment$2.onItemClick(ListFragment.java:58)
E/AndroidRuntime:     at android.widget.AdapterView.performItemClick(AdapterView.java:300)
E/AndroidRuntime:     at android.widget.AbsListView.performItemClick(AbsListView.java:1143)
E/AndroidRuntime:     at android.widget.AbsListView$PerformClick.run(AbsListView.java:3044)
E/AndroidRuntime:     at android.widget.AbsListView$3.run(AbsListView.java:3833)
E/AndroidRuntime:     at android.os.Handler.handleCallback(Handler.java:739)
E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:95)
E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:135)
E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5221)
E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method)

How to get the current object id from MultipleFixedChoicePage?

Hello i have multiple fixed choice like below:

((MultipleFixedChoicePage) mWizardModel.findByKey("Items"))
      .setChoices(names)
      .getAdapter().notifyDataSetChanged();

I cannot setId to each choice field. I just only can set the string name to display.

When i pass to bundle like this:
Bundle bundle = mWizardModel.save();

I get the selected string by:
List dealIdsString = bundle.getBundle("Items").getStringArrayList("_");

The problem is i cannot get the selected id (additional property that i wanted to add). Please help. Thanks.

Same title

I have a problem when I use the same title on 2 views, you use titles as keys in your implementation so there are in conflict

Material Design

would like to see this updated to support the new Google wizard style, see Google Docs for a great example.

gradle cannot find WizardPager-1.0.3.aar

Hi! I know, this project is too old, but maybe something could change?
Currently newest AS can not build project
Maybe someone knows, how to fix?
I tried to turn off jetify, added it to ignorelist, clean, invalidate.... but it doesn't help.

1: Task failed with an exception.
-----------
* What went wrong:
Execution failed for task ':app:dataBindingMergeDependencyArtifactsMyProjectDebug'.
> Could not resolve all files for configuration ':app:MyProjectDebugCompileClasspath'.
   > Failed to transform WizardPager-1.0.3.aar (com.github.TechFreak:WizardPager:1.0.3) to match attributes {artifactType=android-databinding, org.gradle.category=library, org.gradle.libraryelements=jar, org.gradle.status=release, org.gradle.usage=java-api}.
      > Could not find WizardPager-1.0.3.aar (com.github.TechFreak:WizardPager:1.0.3).
        Searched in the following locations:
            https://jitpack.io/com/github/TechFreak/WizardPager/1.0.3/WizardPager-1.0.3.aar

implementing WizaredPager in a fragment : how to fix "Activity must implement PageFragmentCallbacks" ?

I'am trying to use wizaredPager in a fragment, and i got "Activity must implement PageFragmentCallbacks" exception .
`

public class CollectionDonneesFragment extends Fragment implements
PageFragmentCallbacks, ReviewFragment.Callbacks, ModelCallbacks

{
    private ViewPager mPager;
    private MyPagerAdapter mPagerAdapter;

    private boolean mEditingAfterReview;

    private AbstractWizardModel mWizardModel = new NotificationWizardModel(getContext());

    private boolean mConsumePageSelectedEvent;

    private Button mNextButton;
    private Button mPrevButton;

    private List<Page> mCurrentPageSequence;
    private StepPagerStrip mStepPagerStrip;

    @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view =inflater.inflate(R.layout.fragment_collection_donnees, container, false);
        if (savedInstanceState != null) {
            mWizardModel.load(savedInstanceState.getBundle("model"));
        }

        mWizardModel.registerListener(this);

        mPagerAdapter = new MyPagerAdapter(getFragmentManager());
        mPager = (ViewPager) view.findViewById(R.id.pager);
        mPager.setAdapter(mPagerAdapter);
        mStepPagerStrip = (StepPagerStrip) view.findViewById(R.id.strip);
        mStepPagerStrip
                .setOnPageSelectedListener(new StepPagerStrip.OnPageSelectedListener() {
                    @Override
                    public void onPageStripSelected(int position) {
                        position = Math.min(mPagerAdapter.getCount() - 1,
                                position);
                        if (mPager.getCurrentItem() != position) {
                            mPager.setCurrentItem(position);
                        }
                    }
                });

        mNextButton = (Button) view.findViewById(R.id.next_button);
        mPrevButton = (Button) view.findViewById(R.id.prev_button);

        mPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
            @Override
            public void onPageSelected(int position) {
                mStepPagerStrip.setCurrentPage(position);

                if (mConsumePageSelectedEvent) {
                    mConsumePageSelectedEvent = false;
                    return;
                }

                mEditingAfterReview = false;
                updateBottomBar();
            }
        });

        mNextButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (mPager.getCurrentItem() == mCurrentPageSequence.size()) {
                    DialogFragment dg = new DialogFragment() {
                        @Override
                        public Dialog onCreateDialog(Bundle savedInstanceState) {
                            return new AlertDialog.Builder(getActivity())
                                    .setMessage("Envoyer vos données ? Activez la reception des notification et suivez toutes les nouveautés de votre opérateur")
                                    .setPositiveButton(
                                            "Envoyer vos données",
                                            null)
                                    .setNegativeButton(android.R.string.cancel,
                                            null).create();
                        }
                    };
                    dg.show(getFragmentManager(), "place_order_dialog");
                } else {
                    if (mEditingAfterReview) {
                        mPager.setCurrentItem(mPagerAdapter.getCount() - 1);
                    } else {
                        mPager.setCurrentItem(mPager.getCurrentItem() + 1);
                    }
                }
            }
        });

        mPrevButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mPager.setCurrentItem(mPager.getCurrentItem() - 1);
            }
        });

        onPageTreeChanged();
        updateBottomBar();
    return view;
}

    @Override
    public void onPageTreeChanged() {
        mCurrentPageSequence = mWizardModel.getCurrentPageSequence();
        recalculateCutOffPage();
        mStepPagerStrip.setPageCount(mCurrentPageSequence.size() + 1); // + 1 =
        // review
        // step
        mPagerAdapter.notifyDataSetChanged();
        updateBottomBar();
    }

    private void updateBottomBar() {
        int position = mPager.getCurrentItem();
        if (position == mCurrentPageSequence.size()) {
            mNextButton.setText("Finir");
            mNextButton.setBackgroundResource(R.drawable.finish_background);
            mNextButton.setTextAppearance(getContext(), R.style.TextAppearanceFinish);
        } else {
            mNextButton.setText(mEditingAfterReview ? R.string.review
                    : R.string.next);
            mNextButton
                    .setBackgroundResource(R.drawable.selectable_item_background);
            TypedValue v = new TypedValue();
            getActivity().getTheme().resolveAttribute(android.R.attr.textAppearanceMedium, v,
                    true);
            mNextButton.setTextAppearance(getContext(), v.resourceId);
            mNextButton.setEnabled(position != mPagerAdapter.getCutOffPage());
        }

        mPrevButton
                .setVisibility(position <= 0 ? View.INVISIBLE : View.VISIBLE);
    }





    @Override
    public AbstractWizardModel onGetModel() {
        return mWizardModel;
    }

    @Override
    public void onEditScreenAfterReview(String key) {
        for (int i = mCurrentPageSequence.size() - 1; i >= 0; i--) {
            if (mCurrentPageSequence.get(i).getKey().equals(key)) {
                mConsumePageSelectedEvent = true;
                mEditingAfterReview = true;
                mPager.setCurrentItem(i);
                updateBottomBar();
                break;
            }
        }
    }

    @Override
    public void onPageDataChanged(Page page) {
        if (page.isRequired()) {
            if (recalculateCutOffPage()) {
                mPagerAdapter.notifyDataSetChanged();
                updateBottomBar();
            }
        }
    }

    @Override
    public Page onGetPage(String key) {
        return mWizardModel.findByKey(key);
    }

    private boolean recalculateCutOffPage() {
        // Cut off the pager adapter at first required page that isn't completed
        int cutOffPage = mCurrentPageSequence.size() + 1;
        for (int i = 0; i < mCurrentPageSequence.size(); i++) {
            Page page = mCurrentPageSequence.get(i);
            if (page.isRequired() && !page.isCompleted()) {
                cutOffPage = i;
                break;
            }
        }

        if (mPagerAdapter.getCutOffPage() != cutOffPage) {
            mPagerAdapter.setCutOffPage(cutOffPage);
            return true;
        }

        return false;
    }

    public class MyPagerAdapter extends FragmentStatePagerAdapter {
        private int mCutOffPage;
        private Fragment mPrimaryItem;

        public MyPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int i) {
            if (i >= mCurrentPageSequence.size()) {
                return new ReviewFragment();
            }

            return mCurrentPageSequence.get(i).createFragment();
        }

        @Override
        public int getItemPosition(Object object) {
            // TODO: be smarter about this
            if (object == mPrimaryItem) {
                // Re-use the current fragment (its position never changes)
                return POSITION_UNCHANGED;
            }

            return POSITION_NONE;
        }

        @Override
        public void setPrimaryItem(ViewGroup container, int position,
                                   Object object) {
            super.setPrimaryItem(container, position, object);
            mPrimaryItem = (Fragment) object;
        }

        @Override
        public int getCount() {
            return Math.min(mCutOffPage + 1, mCurrentPageSequence == null ? 1
                    : mCurrentPageSequence.size() + 1);
        }

        public void setCutOffPage(int cutOffPage) {
            if (cutOffPage < 0) {
                cutOffPage = Integer.MAX_VALUE;
            }
            mCutOffPage = cutOffPage;
        }

        public int getCutOffPage() {
            return mCutOffPage;
        }
    }

}
and this is the logcat E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.ClassCastException: Activity must implement PageFragmentCallbacks
at com.tech.freak.wizardpager.ui.SingleChoiceFragment.onAttach(SingleChoiceFragment.java:106)
at android.support.v4.app.Fragment.onAttach(Fragment.java:1196)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1036)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1281)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:758)
at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:1627)
at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:637)
at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:166)
at android.support.v4.view.ViewPager.populate(ViewPager.java:1235)
at android.support.v4.view.ViewPager.populate(ViewPager.java:1083)
at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1609)
at android.view.View.measure(View.java:12865)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:822)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:563)
at android.view.View.measure(View.java:12865)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4712)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
at android.view.View.measure(View.java:12865)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4712)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
at android.view.View.measure(View.java:12865)
at android.support.v4.widget.DrawerLayout.onMeasure(DrawerLayout.java:1079)
at android.view.View.measure(View.java:12865)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4712)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:135)
at android.view.View.measure(View.java:12865)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4712)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1385)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:670)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:563)
at android.view.View.measure(View.java:12865)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4712)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
at android.view.View.measure(View.java:12865)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4712)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1385)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:670)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:563)
at android.view.View.measure(View.java:12865)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4712)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2242)
at android.view.View.measure(View.java:12865)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1240)
at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2632)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4517)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760)
at dalvik.system.NativeStart.main(Native Method)`

How to retrive the data ?

Hi,

Thanks for this excellent library. After the wizard process I wanna store that data but I can't figure out how to save the data.

Thanks in advance

Correct way to load dynamic content in wizard

In the sample code the AbstractWizardModel is being statically instantiated when MainActivity is created. Once this is done, the onNewRootPageList() callback is immediately triggered in the wizard model and I couldn't find a way to load the PageList with some dynamic contents.

The workaround I found for this is to make AbstractWizardModel class a inner class in MainActivity and have my dynamic content a global variable so I could access it from AbstractWizardModel. This generates a side effect since I'm no longer instantiating AbstractWizardModel class when the MainActivity is create. I'm instantiating it o onCreate() callback, so it is being called some time later in comparison with original code.

Is there an alternative way to load content in the form (PageList) dynamically?

How to use ImagePage?

I am trying to add image page to wizard. Pick chooser/capture works, but I don't know how to handle activity's result or set page value.

Thanks in advance!

Not able to import classes from WizardPager

I have added this project into my Android Studio like this:

compile 'com.github.TechFreak:WizardPager:1.0.3'

However, when I try to import some class, like: import com.tech.freak.wizardpager.model.AbstractWizardModel;

Android Studio says it does not found the reference. I could only import com.tech.freak.wizardpager.R without errors. What could I be doing wrong?

By the way, such a great wizard for Android! Simply the best I found on open-source community.

Loading from Sqlite

@techfreak i've been working on this library for the past view days to create a student form. is there anyway i can load data from sqlite into the wizard and what the student select in the first page will determine what student see in the next page for MultipleFixedChoicePage and SingleFixedChoicePage??

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.