Giter Club home page Giter Club logo

studentinsights's Introduction

Student Insights

We work within communities to make student-centered data systems

It’s people closest to the work, within school communities - teachers, young people, families - who will be able to build the next generation of school data systems that they need.

We need more than just systems for counting numbers - we need ways to more deeply connect and tell our stories to tackle what matters for our students.

Learn more at studentinsights.org.

Demo site

Check out the demo site with different roles:

All accounts use the password: demo-password.

Contributing

We'd love your help! Take a look at CONTRIBUTING.md for more information on ways educators, developers and others can get involved and contribute directly to the project. You can also learn how to join our online chat channel and submit pull requests and join us in person at our weekly hack night with Code for Boston, in Kendall Square, Cambridge.

Development Environment

This is a Ruby on Rails app that uses a PostgreSQL database as the primary data store, and relies on React for much of the UI code.

1. Install dependencies

You'll need Ruby, Postgres and yarn. See our local installation on OSX or Linux guide.

One you have those set up, you can install the Ruby and JavaScript dependencies with:

$ bundle install
$ yarn install

2. Create database tables and seed them with demo data

bundle exec rake db:create db:migrate db:seed

This will create demo students with fake student information. See the demo site above for the set of educators you can use (or look at test_pals.rb).

If you are willing to run a longer (~10 minute) task that will generate ~600 students to more closely approximate one of our pilot schools, set ENV["MORE_DEMO_STUDENTS"] = 'true' before running the seed task.

3. Start the app

Once you've created the data, start the app by running yarn start from the root of your project. This runs two processes in parallel: the Rails server and a Webpack process that watches and rebuilds JavaScript files. When the local server is up and running, visit http://localhost:3000/ and log in with your demo login information. You should see the roster view for your data. You can stop both processes with command+c like normal, and look at package.json if you want to run them in individual terminals.

4. Run the tests

This app uses Rspec for Ruby tests and Jest for JavaScript tests.

For Ruby code, to lint and run the tests do:

rspec

For Jest, run the tests continually in watch mode with:

yarn test

There's also rubocop and eslint for linting. Run them at the command line like this:

rubocop
yarn lint

Or add them into Sublime with SublimeLinter-eslint and SublimeLinter-rubocop.

If you miss something, tests will run on any pull request you submit, and after merging to master as well.

5. Write code!

This project is a Rails app and has a typical Rails project structure. If you'd like to get up to speed on Rails, we recommend checking out their great documentation. The only difference is that JavaScript code is not managed by the Rails asset pipeline, and is built separately by Webpack.

It also uses React for much the user interface code. If you'd like to get up to speed on React, we recommend their great documentation, and the Tutorial and Thinking in React pages in particular.

JavaScript code is written in ES6 syntax and JSX. The build process uses the the react-app Babel preset (the same as create-react-app).

If you use Sublime Text Editor, we include the studentinsights.sublime-project file to standardize minor things like tabs vs. spaces, indentation, and generally make it easier to work with our folder structure. Go to Project --> Open Project and select that file to load it. Sublime remembers which project you were last in, so you only need to do this once. (Here's some background info on how projects work in Sublime).

We also recommend Sublime Package Control and these packages Babel, Sublime Linter and SublimeLinter-contrib-eslint. These will give you nice syntax highlighting and show you linter errors right in Sublime!

6. Use the product locally

Users use IE11, so if you're trying to manually test locally or the production site, you should too! If you have a Mac or Linux box, you can use free VMs designed for just this purpose and run them on VirtualBox: https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/.

Useful tidbits:

  • Visit get.adobe.com/reader in the VM to install a PDF reader
  • These virtual machines expire after 90 days, so take a snapshot right away and rollback when it expires (make sure to log out of Insights before taking a Snapshot, and that no student report PDFs are lying around in the VM's downloads)
  • Enable "Shared Clipboard" in the Devices menu
  • Disable the "Host Capture" key
  • Point to http://10.0.2.2:3000/ to access the host instance of Student Insights

7. Use Storybook

Running yarn storybook will start a storybook server on port 6006. You can use this to create "stories" iterate on UI features or components in particular states, separate from how they exist within the product. To add new stories, write a new .story.js file and update ui/config/.storybook/config.js.

8. Add guardrails

  • Install git-secrets and ensure the hook is set for the repo
  • Update your terminal to show when your git working copy is dirty, to prevent accidentally checking in anything sensitive or that shouldn't be checked in. One approach is to put this in ~/.bashrc:
# prompt
GIT_PS1_SHOWCOLORHINTS=1
GIT_PS1_SHOWDIRTYSTATE=1
GIT_PS1_SHOWUNTRACKEDFILES=1
GIT_PS1_STATESEPARATOR='  --!--  '
source ~/.git-prompt.sh
PS1='\h:\[\033[1;34m\]\W \[\033[0;33m\][$(__git_ps1 "%s")]\[\033[0;37m\] \$ '

You can find a copy of git-prompt.sh in source.

System overview

The project is a Rails app with a Postgres database. There are background tasks that import data from district SIS systems, vendor systems like STAR, and district data sources within Google Drive. This enables rapid iteration and experimentation on new product features with minimal risk to these existing production systems. Student Insights is the system of record for some unique data (eg., notes from clinical meetings and information about targeted interventions that students are receiving). Authentication is typically handled by the district's LDAP service.

District project leads have access administrative tools for adjusting educator permissions and roles, for doing data quality checks, reviewing health of import tasks, and exporting data.

Understanding the human pieces of how data flows through the system, which is critical for understanding accuracy and representativeness, is quite complex and varies within and across districts. This is important to keep in mind when making product and engineering decisions. With that caveat, here's an abstracted engineering-centric view on the pieces of the system and kinds of data flow (from "Student Insights - How it works" internal doc):

systems overview data systems

All districts share the same codebase, but are deployed in isolated instances.

Differences between districts

There are many differences within and across districts. Some of this is driven by districts focusing on different things or being at different places in adoption, and some is different by inherent differences. When trying to learn about or understand how Student Insights handles these differences, a good triage process is:

  • check per_district.rb and PerDistrict.js in source code
  • look at differences in environment variables
  • check for differences in actual data (eg, fields used or specific enum values)
  • also look at EducatorLabel which describes different feature switches, which are often related to important differences across or within districts

For educator-facing document, see also:

Deployment

Continuous integration

We use GitHub Actions to run a set of tests on each pull request and merge to master. See the actions.yml file for more, and view test runs it GitHub at https://github.com/studentinsights/studentinsights/actions. There's no automatic deployment set up, so nothing will go into production until someone takes action to deploy it.

Production access

Access to production environments is tightly controlled. If you work in a particular district or have been granted access to production systems, talk to someone on the team. See CONTRIBUTING.md.

Static IPs

Quotaguard Static, a Heroku add-on, provides static IP addresses when needed to connect to firewalled district servers. The QUOTAGUARDSTATIC_MASK environment variable is a subnet mask for routing only certain outbound requests through those proxy servers. Read Quotaguard Static's documentation for more information.. See the Procfile for how this is enabled; the socksify wrapper makes routing through the proxy transparent to Ruby application code.

New deployments

To create an entirely new Student Insights deployment, ask someone for the "New Student Insights deployment" doc.

Ops

Here are some notes on maintaining, troubleshooting and performance. Talk to someone on the team for access to more tools and docs.

Response latency

Look in the Heroku metrics panel.

Postgres

You can use heroku-pg-extras to get helpful diagnostic information about slow queries, index usage, and table scans.

Heroku Postgres supports a maintenance window for standard database operations that require minutes of downtime. See heroku pg:maintenance.

More information

studentinsights's People

Contributors

alexsoble avatar amirhadjihabib avatar awalker4 avatar bdougsand avatar bran-van-d avatar bw120 avatar ciscomeneses avatar davidbader avatar dazzaji avatar dependabot[bot] avatar edavidsonsawyer avatar erose avatar eudaimonious avatar gabivoicu avatar hunterowens avatar iamctodd avatar jhilde avatar jochakovsky avatar johnrobbjr avatar jonchar avatar karaajc avatar kbweaver avatar kevinrobinson avatar marimuraki avatar nazwr avatar pauledwardmitchell avatar quinnlee avatar ronny2205 avatar sentientmachine avatar thfield 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

studentinsights's Issues

Umbrella - Productionize STAR change-over-time graphs

From codeforamerica/somerville-teacher-tool#413

  • Add STAR math
  • Make it navigable
  • Some test coverage
  • Improve STAR reading demo data so we can test locally
  • Add option to clear filters
  • Fix line interpolation issues
  • Investigate reading data points that are close in time, but very different scores (eg., https://somerville.studentinsights.org/students/197?column=profile)
  • update charts to show homeroom names
  • precompute as much data as possible, to speed up server-side load times
  • add axis labels, possibly legends (see #79 (comment))

Consolidate risk level bubble styling

This is done in .warning-bubble, #risk-pill and in the student_profile_header component (with #108). Let's pull this out this styling into a single SCSS file defining these classnames so it's defined in one place.

Sequences of integer codes after a student name is confusing.

On this page: students/8/profile?column=attendance

After the students name, it has two integers. After you click on it, you can figure out later that it's the room number. But hovering over that link should give me an idea of what this will tell me if I go there.

Gemfile's Ruby version out of sync

The Gemfile has ruby '2.2.3' but when I went through the setup instructions for Docker development on OS X, I ended up with a ruby version of 2.2.4.

This means that the setup instructions don't work as written (you run into an error when running docker-compose up). Once you change the version to the correct one it works fine. (But I didn't want to commit this change).

We're pulling from this Dockerfile, ruby 2:2, which has 2.2.4, but I guess it was 2.2.3 when that Gemfile was authored.

The easy fix would be upgrading to 2.2.4 -- would this work, or be convenient?

Umbrella - Redesign student profile page

From codeforamerica/somerville-teacher-tool#373

The graphs are the first thing the user sees – but they're not necessarily the most useful!

Mockups v1:
profile.redesign.mockups (2).pdf

Mockups v2:
profile.redesign.v2 (3).pdf

Some options for next steps:

  • Build the interventions panel
  • Add tab selection by clicking on panels
  • ELA: Add STAR and MCAS charts
  • Improve layout and styling for demographics section
  • Improve header styling (@BWieber in #93)
  • Math: Add STAR and MCAS charts (@erose)
  • Attendance: Add in charts
  • Attendance: Add in text summaries for behavior incidents
  • Attendance: Improve styling for behavior incidents (@bw120 in #139)
  • ELA: Add DIBELS numbers (#23 and #283 and #291)
  • Profile: design iterations, add full timeline view (@erose in #117)

Notes and interventions flow (@kevinrobinson):

  • Design: structure interventions by what outcomes they're attempting to move?
  • Improve initial rendering for notes
  • Add UI for adding a note, endpoint
  • Improve rendering for new interventions and progress notes
  • Add UI for adding an intervention, endpoint (@BWieber and @kevinrobinson in #115)

Data questions (Related: #4 and #1):

  • Fix bug with assessment dates in demo data
  • Investigate nil STAR assessments (#91)

Action items from @jgeiser's feedback on 2/12:

  • Show the type of note (eg., SST meeting)
  • Move 51a from notes to services
  • Finish adding ability to save services (#115)
  • Add in read-side translation for older student notes
  • Add in read-side translation for interventions
  • Add in read-side translation for progress notes
  • Fix layout and styling bugs on Internet Explorer
  • Improve how long it takes to load the overview page (#3)

Updates to the overview page:

  • Filter for services, show service count in table (#212)
  • Filter for event_notes (#221)

Final set of improvements to close this issue:

  • Simplify date formats and transformations between them
  • Add ACCESS data to the page (#292)
  • Show multiple years for absences, tardies, behavior incidents (currently just one year, may require precomputing) (#324 and #290)
  • Remove v1 profile code paths (#211)

Future enhancements, split out to standalone issues:

  • Add grade-level equivalent for STAR scores in ELA and Math (#229)
  • Add ability to edit and delete notes (#228)

Improve color mapping for lines on charts

Across sparklines and details charts, particularly on the profile v2 page and the STAR charts, it'd be simpler for users if the colors for line charts had a consistent meaning. The STAR charts encode the change across the visible range with color (eg., red is regression, blue is growth), so this might be a good starting point for all charts.

Design and UX feedback

From Code for Boston!

Hi there, my name is Mohan Wang and there are some suggestions for this website.
First of all, when I tried to back to the home page, the only way is click go back button. So I suggest add a navigation bar on the top of every page, and there are Home, Profile, or some other kinds of category in this bar. In this way, users can go to any page they want very quickly.
Secondly, for the search bar. Users can type in the students' name in this bar, but for other kind of thing it does not work. For example, I tried to type in Level 7, it could not show anything for me. I would like to use the search bar to search anything I want, that would be very helpful I think.
Third, for the student's profile page. Each box about the information which "2015-2016" and "2014-2015", all of those show me too much detail, I mean they look very long in a page. I suggest you could add an up or down arrows in the blue area, so users can open or close each box very easily. In this way, designers can make the page very clear.
Fourth, in the room page. When I tried to move my mouse on the student's name and the information after the name, it jumped to different pages, and made me very confused. I suggest add a small tip when users move their on the different area in this page. For example, when users move mouse on student's name, the tip shows "go to Profile", or when users move the mouse on the information after the name, the tip shows "go to Home". And also I have a second solution, which is the color of name and the information after the name is different, so users could know they maybe have different function.
All in all, in my opinion, I think the good user experience is never let users guess what is the function for a bar/button or where is the button I am looking for. And also make the page very clear. I like this website's visual design, the color is friendly. Hopefully my suggestions could help you improve the website.
BTW, if you have more questions or anything, I would like to hear the feedback from you :)

^ this was all from Mohan, thanks so much for the input :) - @KevinRobin

Fix MCAS "Math" VS "Mathematics"

Sub-issue from #1.

Key principles:

  • Apsen X2 is the sole source of truth about MCAS assessments
  • Data coming from Aspen X2 yields assessment subject "Mathematics" not "Math"

TODO:

  • Migration to delete MCAS assessment with subject "Math" and its student assessment results
  • Make sure all queries point to MCAS assessment with subject "Mathematics"
  • Validation for MCAS assessment subject names

Profile v2 - Improve header styling

This is part of #5.

@BWieber here's a suggestion for a discrete piece of work we could use your help with. Let me know what you think!

Designs

The initial styling on the profile v2 page is functional but not exactly nice-looking yet. :) Here's the current state:
screen shot 2016-02-17 at 5 27 20 pm

@alexsoble's initial design idea was something more like this (from https://github.com/studentinsights/studentinsights/files/122155/profile.redesign.v2.3.pdf):
screen shot 2016-02-17 at 5 24 47 pm

Starting points

So it'd be great to improve this! I factored out this code to its own component, so you have a nice clear space to work in. I also added some comments to the pull request about what's going on and pointers to starting places.

Steps

  • Let's keep the links blue rather than changing them to black
  • #108 - Make the grade level text look nicer, like "5th grade"
  • #101 - Add the bullets in between (can try a Unicode character)
  • #101 - Improve horizontal spacing between each item to match the mock
  • #108 - Add Risk level text using the real value
  • #108 - Use flexbox to move the risk level text to the right of the page
  • #108 - Add in the colored circle styling (can use this as inspiration, from here)

These can all be a part of one pull request - it might be helpful for you to keep each step as a separate commit, but it's up to you whatever you think works best. If you have any other ideas I'd love to check them out, feel free to try them out and submit those as well. And please let me know any feedback you have on whether this is helpful as a starting point or if there's anything I can clarify more.

I'll be out of town tomorrow through the weekend so I'll check in Monday and can review anything you'd like. And I'm happy to chat more with you over email or Slack next week, or work on it together next Tuesday at Code for Boston so we can get this shipped!

Thanks for your help!

3/8 Code for Boston agenda

Last week: #135.

Review priorities (umbrella issues):

Help finish what's in progress:

  • Finish any work-in-progress you own
  • Help anyone else with work-in-progress if you can (keeping in mind that sometimes piling on more people doesn't help)
  • Check open pull requests
  • Umbrella issues - see if there's a clear piece you can get done on one of the open issues

Start some new work:

Help new folks pitch in:

  • Coordinating tonight: @kevinrobinson
  • Talk about any questions from the project overview
  • Help them set up development environment
  • Show them the agenda issue and our workflow

Fix STAR "Math" VS "Mathematics"

Sub-issue from #1.

Key principles:

  • The STAR SFTP site is the sole source of truth about STAR assessments
  • Data coming from Aspen X2 yields assessment subject "Mathematics" not "Math"

Handle students who become inactive

From codeforamerica/somerville-teacher-tool#447.

Notes

  • Only active students come through the X2 export
  • When they become inactive, we want to destroy their records or give them an inactive status
  • One way to do this would be to detect which students are no longer in the export file
  • But better would be to get the actual Active/Inactive data from X2

Umbrella - Create SPED referral packet

From codeforamerica/somerville-teacher-tool#100

Teachers and administrators want to be able to create a SPED referral packet from all the the information in Student Insights. This is a laborious manual process now, across several computer and paper data systems that we can help automate.

This will likely be a PDF, and will require working closely with school partners to iterate on the exact requirements. codeforamerica/somerville-teacher-tool#100 has more background on the types of information that might be important.

Rough first steps

  • #137 - "Hello world" PDF (@eudaimonious)
  • Verify that download UX is good on Windows IE (@kevinrobinson)
  • Add raw unstyled data from text mock (#165)
  • Add info in the 'Additional Notes' section #497 (@bwieber)

Research and design steps

  • Get feedback from school folks on text mock in #165

Work based on feedback from our end user

  • Add birth date #498 (@eudaimonious)
  • Academic Assessments should be grouped by test/subject with ACCESS at the top. #499 (@eudaimonious)
  • The DIBELS test should show scores not percentile rankings #500 (@iqnivek)
  • Add ELL Status under Language #501

Add a button so folks can access it!

  • Add a button to the profile to access the PDF. Be very explicit about the beta nature of this feature. #502 (@eudaimonious)
Open questions

Do we need this additional information? Is it new, or is it possibly available in district systems like Aspen already?

  • Prior school enrollments?
  • Retention?
  • Grades?
  • Report cards?
  • In-school and out-of-school suspensions?
  • Health, medical, nursing?
  • Specific evidence of RTI?

After that, we can learn more about what else we need here, whether it involves adding a separate UI up front to ask for a few details, whether we want to record all packets that are generated for the case history, or whatever else comes up. It'll be easier to do that working with school folks as referrals come up, so iterations here might require a little more communication.

Investigate nil STAR assessment data

I'm not sure if this is related to the work in #83, #1 or a separate issue. I noticed it working on improvements to the profile v2 page, specifically for this student (need authorization): https://somerville.studentinsights.org/students/59/profile?column=ela

screen shot 2016-02-17 at 5 15 49 pm

This is coming from STAR assessments with percentile_rank set to nil. I'm not sure yet if this is expected and the controller or UI should interpret these data points differently, or if this is a bug somewhere in the import process. First steps of investigation:

def nil_star_assessments(assessment)
  all_stars = StudentAssessment.all.select {|sa| sa.assessment_id == assessment.id };nil
  nil_stars = StudentAssessment.all.select {|sa| sa.assessment_id == assessment.id && sa.percentile_rank.nil? };nil

  {
    nil: nil_stars.size,
    total: all_stars.size,
    percent: (100 * nil_stars.size.to_f / all_stars.size).round.to_s + '%'
  }
end


irb(main):066:0* pp math: nil_star_assessments(Assessment.find(21));nil
{:math=>{:nil=>764, :total=>2199, :percent=>"35%"}}
irb(main):067:0> pp ela: nil_star_assessments(Assessment.find(9));nil
{:ela=>{:nil=>775, :total=>2532, :percent=>"31%"}}

@alexsoble have you run into this before, or do you know if it's a new issue?

Profile v2 - Allow saving services to the database and rendering them

This is a part of #5.

Rough steps, using #51 and #54 as models.

In Rails:

  • #132 - Make migrations and models (for services and service_types), test in Rails console (@BWieber)
  • #158 - Read path for services in students_controller#profile
  • #158 - Add new controller action to enable saving, update specs

In React (@kevinrobinson):

  • #124 - Factor out RecordService component
  • #125, #131 - Update read path to show list of services
  • #131 - Update read path for "notes" to show older interventions and progress notes
  • #136 - Add actions and api to the UI code to enable saving
  • Render custom intervention type in UI
  • Fix UI bug on IE with note button width (see fix note button width: #126 (comment))

The mini-charts don't have a mouse-hover info box or a click event to explain what they do.

On /students/8/profile?column=ela

There is a red mini-chart there without an x or y descriptor, they do this sort of thing on etrade for plotting charts, but they have a more well defined square outline so you can get a feel for where the line is relative to the borders. The border of these charts should be descernable so you can tell the difference between a high horizontal vs low horizontal.

Clicking on them should bring up the full description of what they are and help on how to interpret the chart.

Capture and address assessment bugs from Eli in chat

From chat:

eli-rose [12:52 PM]
@kevin: Hmm. All the math data (star, growth, score) is still null for me here: https://somerville-teacher-tool-demo.herokuapp.com/students/15/profile?column=ela.
[12:55]
There's a separate issue where the STAR reading data is from 2010, and outside the range of the chart which is '12 to '16, so it doesn't show up at all. I assume it's just something about the way the fake data is generated.
[12:56](the math issue is showing up for me locally as well)
[12:58]
and there seems to be a third issue with the sparklines in production? e.g. MCAS ELA Score and MCAS ELA Growth sparklines don't show up, even though the data is there and the charts are showing.
[12:58]
I do get the sparklines locally. so I'll investigate the differences when I get the chance.

3/1 Code for Boston agenda

Trying this out.

Review priorities:

Finish what's in progress:

  • merge PRs for student profile header with @BWieber (#93 etc.)
  • merge migrations for services with @BWieber (#115 etc.)
  • catch up with @erose on newsfeed
  • make progress on saving services

Help new folks pitch in:

  • Talk about any questions from the project overview
  • Help them set up development environment
  • Start with Help wanted issues
  • Next, help with new pieces of current feature
  • After, start with a new feature

cc @alexsoble

Refactor charts JS in profile v2 page

Just a TODO list for myself:

Right now there's a lot of code duplication between ProfileChartSettings, ela_details, math_details. Ideally I'd like to have these components:

  • mcas_score_chart.js graph that displays scaled scores
  • mcas_growth_chart.js graph that displays score growth
  • something for STAR

and perhaps a component that wraps those three as well.

Improve generator for behavior incidents in local development

These aren't super realistic, which makes it tough to test product improvements like https://github.com/studentinsights/studentinsights/pull/139/files locally.

1. Generate more realistic event distributions (code)

Current example:
screen shot 2016-03-02 at 9 58 26 am

This is the real distribution on 3/2/16:
screen shot 2016-03-02 at 9 53 05 am

We should update to match more closely. There are also often an unrealistically high number of incidents for a few students (eg., in the 50s), which affects UX work on local development and the demo site.

2. Generate realistic text instead of the placeholders there now (code)

screen shot 2016-03-02 at 9 59 49 am

These should be full sentences or paragraphs. Looking at real production data, these are typically 2 - 4 sentences long.

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.