Giter Site home page Giter Site logo

railscasts's Introduction

RailsCasts

This is the source code for the RailsCasts site. If you want the source code for the episodes, see the railscasts-episodes project.

Please let me know if you plan to use this app for your site.

IMPORTANT: This source code is out of date with the latest changes at railscasts.com to ensure the security of the payment processing. I hope to open-source the latest additions at some point.

Setup

This is designed to run on Ruby 1.9.2 or higher. If you're using RVM it should automatically switch to 1.9.2 when entering the directory.

Run script/setup. This will generate the config files, install gems, and migrate the database.

You can then start the server with rails s and run the specs with rake.

You may want to install Sphinx, run the index and start rake commands, and set thinking_sphinx: true in app_config.yml. This isn't required since it will default to a primitive search.

railscasts's People

Contributors

balexand avatar benlangfeld avatar bryceroney avatar garethrees avatar ryanb avatar semaperepelitsa 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

railscasts's Issues

Script/Setup breaking

Hey Ryan,

I tried to start the setup but it stops in the middle of the migration part. Here's what I get...

** Invoke db:migrate (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute db:migrate
== CreateEpisodes: migrating =================================================
-- create_table(:episodes)
-> 0.0021s
== CreateEpisodes: migrated (0.0022s) ========================================

== CreateTags: migrating =====================================================
-- create_table(:tags)
-> 0.0013s
== CreateTags: migrated (0.0015s) ============================================

== CreateTaggings: migrating =================================================
-- create_table(:taggings)
-> 0.0017s
== CreateTaggings: migrated (0.0019s) ========================================

== CreateComments: migrating =================================================
-- create_table(:comments)
-> 0.0024s
== CreateComments: migrated (0.0025s) ========================================

== AddPositionToEpisodes: migrating ==========================================
-- add_column(:episodes, :position, :integer, {:default=>0})
-> 0.0111s
rake aborted!
An error has occurred, this and all later migrations canceled:

undefined method define_index' for #<Class:0x22b7364> /Users/marclipovsky/.gem/ruby/1.8/gems/activerecord-2.3.4/lib/active_record/base.rb:1959:inmethod_missing_without_paginate'
/Users/marclipovsky/.gem/ruby/1.8/gems/mislav-will_paginate-2.3.11/lib/will_paginate/finder.rb:168:in method_missing' /Users/marclipovsky/Sites/Rails/railscasts/app/models/episode.rb:19 /Library/Ruby/Gems/1.8/gems/activesupport-2.3.4/lib/active_support/dependencies.rb:380:inload_without_new_constant_marking'
/Library/Ruby/Gems/1.8/gems/activesupport-2.3.4/lib/active_support/dependencies.rb:380:in load_file' /Library/Ruby/Gems/1.8/gems/activesupport-2.3.4/lib/active_support/dependencies.rb:521:innew_constants_in'
/Library/Ruby/Gems/1.8/gems/activesupport-2.3.4/lib/active_support/dependencies.rb:379:in load_file' /Library/Ruby/Gems/1.8/gems/activesupport-2.3.4/lib/active_support/dependencies.rb:259:inrequire_or_load'
/Library/Ruby/Gems/1.8/gems/activesupport-2.3.4/lib/active_support/dependencies.rb:425:in load_missing_constant' /Library/Ruby/Gems/1.8/gems/activesupport-2.3.4/lib/active_support/dependencies.rb:80:inconst_missing'
/Library/Ruby/Gems/1.8/gems/activesupport-2.3.4/lib/active_support/dependencies.rb:92:in const_missing' /Library/Ruby/Gems/1.8/gems/activesupport-2.3.4/lib/active_support/dependencies.rb:98:insend'
/Library/Ruby/Gems/1.8/gems/activesupport-2.3.4/lib/active_support/dependencies.rb:98:in const_missing' ./db/migrate//20080702045900_add_position_to_episodes.rb:4:inup_without_benchmarks'
/Users/marclipovsky/.gem/ruby/1.8/gems/activerecord-2.3.4/lib/active_record/migration.rb:282:in send' /Users/marclipovsky/.gem/ruby/1.8/gems/activerecord-2.3.4/lib/active_record/migration.rb:282:inmigrate'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/benchmark.rb:293:in measure' /Users/marclipovsky/.gem/ruby/1.8/gems/activerecord-2.3.4/lib/active_record/migration.rb:282:inmigrate'
/Users/marclipovsky/.gem/ruby/1.8/gems/activerecord-2.3.4/lib/active_record/migration.rb:365:in __send__' /Users/marclipovsky/.gem/ruby/1.8/gems/activerecord-2.3.4/lib/active_record/migration.rb:365:inmigrate'
/Users/marclipovsky/.gem/ruby/1.8/gems/activerecord-2.3.4/lib/active_record/migration.rb:486:in migrate' /Users/marclipovsky/.gem/ruby/1.8/gems/activerecord-2.3.4/lib/active_record/migration.rb:560:incall'
/Users/marclipovsky/.gem/ruby/1.8/gems/activerecord-2.3.4/lib/active_record/migration.rb:560:in ddl_transaction' /Users/marclipovsky/.gem/ruby/1.8/gems/activerecord-2.3.4/lib/active_record/connection_adapters/abstract/database_statements.rb:136:intransaction'
/Users/marclipovsky/.gem/ruby/1.8/gems/activerecord-2.3.4/lib/active_record/transactions.rb:182:in transaction' /Users/marclipovsky/.gem/ruby/1.8/gems/activerecord-2.3.4/lib/active_record/migration.rb:560:inddl_transaction'
/Users/marclipovsky/.gem/ruby/1.8/gems/activerecord-2.3.4/lib/active_record/migration.rb:485:in migrate' /Users/marclipovsky/.gem/ruby/1.8/gems/activerecord-2.3.4/lib/active_record/migration.rb:472:ineach'
/Users/marclipovsky/.gem/ruby/1.8/gems/activerecord-2.3.4/lib/active_record/migration.rb:472:in migrate' /Users/marclipovsky/.gem/ruby/1.8/gems/activerecord-2.3.4/lib/active_record/migration.rb:400:inup'
/Users/marclipovsky/.gem/ruby/1.8/gems/activerecord-2.3.4/lib/active_record/migration.rb:383:in migrate' /Users/marclipovsky/.gem/ruby/1.8/gems/rails-2.3.4/lib/tasks/databases.rake:116 /Users/marclipovsky/.gem/ruby/1.8/gems/rake-0.8.7/lib/rake.rb:636:incall'
/Users/marclipovsky/.gem/ruby/1.8/gems/rake-0.8.7/lib/rake.rb:636:in execute' /Users/marclipovsky/.gem/ruby/1.8/gems/rake-0.8.7/lib/rake.rb:631:ineach'
/Users/marclipovsky/.gem/ruby/1.8/gems/rake-0.8.7/lib/rake.rb:631:in execute' /Users/marclipovsky/.gem/ruby/1.8/gems/rake-0.8.7/lib/rake.rb:597:ininvoke_with_call_chain'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/monitor.rb:242:in synchronize' /Users/marclipovsky/.gem/ruby/1.8/gems/rake-0.8.7/lib/rake.rb:590:ininvoke_with_call_chain'
/Users/marclipovsky/.gem/ruby/1.8/gems/rake-0.8.7/lib/rake.rb:583:in invoke' /Users/marclipovsky/.gem/ruby/1.8/gems/rake-0.8.7/lib/rake.rb:2051:ininvoke_task'
/Users/marclipovsky/.gem/ruby/1.8/gems/rake-0.8.7/lib/rake.rb:2029:in top_level' /Users/marclipovsky/.gem/ruby/1.8/gems/rake-0.8.7/lib/rake.rb:2029:ineach'
/Users/marclipovsky/.gem/ruby/1.8/gems/rake-0.8.7/lib/rake.rb:2029:in top_level' /Users/marclipovsky/.gem/ruby/1.8/gems/rake-0.8.7/lib/rake.rb:2068:instandard_exception_handling'
/Users/marclipovsky/.gem/ruby/1.8/gems/rake-0.8.7/lib/rake.rb:2023:in top_level' /Users/marclipovsky/.gem/ruby/1.8/gems/rake-0.8.7/lib/rake.rb:2001:inrun'
/Users/marclipovsky/.gem/ruby/1.8/gems/rake-0.8.7/lib/rake.rb:2068:in standard_exception_handling' /Users/marclipovsky/.gem/ruby/1.8/gems/rake-0.8.7/lib/rake.rb:1998:inrun'
/Users/marclipovsky/.gem/ruby/1.8/gems/rake-0.8.7/bin/rake:31
/usr/bin/rake:19:in `load'
/usr/bin/rake:19

Any thoughts...? Also I'm running Rails 2.3.4.

Thanks so much!!

Link Episode on User Comments

The user profile page shows comments from the user, but it does not link to the episode the user's comments come from.

back & forward navigation

  1. go to http://railscasts.com, click on an episode
  2. click comments
  3. press "back" in the browser

this puts you back to the main page, instead of "show notes"

another problem appears if u now press "forward" in the browser, an AJAX reply appears without being properly handled

Static identifier for recent comments

It would be nice if there was a static identifier for comments.

The easiest way of doing this might be making the relative time display into an absolute one.

e.g. "2011-07-27 17:34:23" rather than "1 day ago"

This will help mods be able to pick up where they left off in moderating comments.

SETUP: undefined method `[]' for false:FalseClass

I think I'm missing something, I don't have Sphinx installed anyway it seems optional.

rake db:migrate --trace
rake aborted!
undefined method `[]' for false:FalseClass
/Users/demo/.rvm/gems/ruby-1.9.2-p180@railscasts/gems/thinking-sphinx-2.0.1/lib/thinking_sphinx/configuration.rb:267:in `parse_config'
/Users/demo/.rvm/gems/ruby-1.9.2-p180@railscasts/gems/thinking-sphinx-2.0.1/lib/thinking_sphinx/configuration.rb:121:in `reset'
/Users/demo/.rvm/gems/ruby-1.9.2-p180@railscasts/gems/thinking-sphinx-2.0.1/lib/thinking_sphinx/configuration.rb:80:in `initialize'
/Users/demo/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/1.9.1/singleton.rb:109:in `new'
/Users/demo/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/1.9.1/singleton.rb:109:in `block in instance'
<internal:prelude>:10:in `synchronize'
/Users/demo/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/1.9.1/singleton.rb:107:in `instance'
/Users/demo/.rvm/gems/ruby-1.9.2-p180@railscasts/gems/thinking-sphinx-2.0.1/lib/thinking_sphinx/auto_version.rb:4:in `detect'
/Users/demo/.rvm/gems/ruby-1.9.2-p180@railscasts/gems/thinking-sphinx-2.0.1/lib/thinking_sphinx.rb:239:in `<top (required)>'
/Users/demo/.rvm/gems/ruby-1.9.2-p180@railscasts/gems/bundler-1.0.18/lib/bundler/runtime.rb:68:in `require'
/Users/demo/.rvm/gems/ruby-1.9.2-p180@railscasts/gems/bundler-1.0.18/lib/bundler/runtime.rb:68:in `block (2 levels) in require'
/Users/demo/.rvm/gems/ruby-1.9.2-p180@railscasts/gems/bundler-1.0.18/lib/bundler/runtime.rb:66:in `each'
/Users/demo/.rvm/gems/ruby-1.9.2-p180@railscasts/gems/bundler-1.0.18/lib/bundler/runtime.rb:66:in `block in require'
/Users/demo/.rvm/gems/ruby-1.9.2-p180@railscasts/gems/bundler-1.0.18/lib/bundler/runtime.rb:55:in `each'
/Users/demo/.rvm/gems/ruby-1.9.2-p180@railscasts/gems/bundler-1.0.18/lib/bundler/runtime.rb:55:in `require'
/Users/demo/.rvm/gems/ruby-1.9.2-p180@railscasts/gems/bundler-1.0.18/lib/bundler.rb:120:in `require'
/Users/demo/Code/testing/railscasts/config/application.rb:11:in `<top (required)>'
/Users/demo/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
/Users/demo/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
/Users/demo/Code/testing/railscasts/Rakefile:4:in `<top (required)>'
/Users/demo/.rvm/gems/ruby-1.9.2-p180@railscasts/gems/rake-0.9.2/lib/rake/rake_module.rb:25:in `load'
/Users/demo/.rvm/gems/ruby-1.9.2-p180@railscasts/gems/rake-0.9.2/lib/rake/rake_module.rb:25:in `load_rakefile'
/Users/demo/.rvm/gems/ruby-1.9.2-p180@railscasts/gems/rake-0.9.2/lib/rake/application.rb:495:in `raw_load_rakefile'
/Users/demo/.rvm/gems/ruby-1.9.2-p180@railscasts/gems/rake-0.9.2/lib/rake/application.rb:78:in `block in load_rakefile'
/Users/demo/.rvm/gems/ruby-1.9.2-p180@railscasts/gems/rake-0.9.2/lib/rake/application.rb:129:in `standard_exception_handling'
/Users/demo/.rvm/gems/ruby-1.9.2-p180@railscasts/gems/rake-0.9.2/lib/rake/application.rb:77:in `load_rakefile'
/Users/demo/.rvm/gems/ruby-1.9.2-p180@railscasts/gems/rake-0.9.2/lib/rake/application.rb:61:in `block in run'
/Users/demo/.rvm/gems/ruby-1.9.2-p180@railscasts/gems/rake-0.9.2/lib/rake/application.rb:129:in `standard_exception_handling'
/Users/demo/.rvm/gems/ruby-1.9.2-p180@railscasts/gems/rake-0.9.2/lib/rake/application.rb:59:in `run'
/Users/demo/.rvm/gems/ruby-1.9.2-p180@railscasts/gems/rake-0.9.2/bin/rake:32:in `<top (required)>'
/Users/demo/.rvm/gems/ruby-1.9.2-p180@railscasts/bin/rake:19:in `load'
/Users/demo/.rvm/gems/ruby-1.9.2-p180@railscasts/bin/rake:19:in `<main>'

Log in and mark video as watched

It would be nice if a user could log in the site with an existing account, like google and facebook account, and mark a video as watched. A playlist would be a good idea too.

Undo comment deletion

Allow moderators to undo comment deletion so we don't have a confirmation dialog. This will make removing spam easier.

Increase social aspect of Railscasts.com

Just jotting down thoughts.

@ryanb Feel free to pick the ones you think would fit well, and tell me to create new issues for each one, or do so yourself.

  • Support other ways to login (facebook, twitter, google etc). omniauth should hopefully make that easy
  • Add share buttons for various services (twitter, facebook, g+, etc). Gets people advertising Railscasts more.
  • Add a 'Favourite' button, which stores the link between user and episiode and allows users to search/list favourites (as well as allows others to see someones favourites list).
  • Ability to 'vote up' episodes (for new users to find the most thrilling episodes)
  • Ability to 'vote up' comments (akin to stackoverflow)

script/setup is broken again

SImilar to the issue at #4
I am getting a Fatal Error when running script/setup:

[dbruns@Daniel-Brunss-Mac-Pro:dev/railscasts]$ rake db:migrate --trace (07-29 17:49)
(in /Users/dbruns/dev/railscasts)
** Invoke db:migrate (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute db:migrate
== CreateEpisodes: migrating =================================================
-- create_table(:episodes)
-> 0.0116s
== CreateEpisodes: migrated (0.0116s) ========================================

== CreateTags: migrating =====================================================
-- create_table(:tags)
-> 0.0130s
== CreateTags: migrated (0.0131s) ============================================

== CreateTaggings: migrating =================================================
-- create_table(:taggings)
-> 0.0104s
== CreateTaggings: migrated (0.0105s) ========================================

== CreateComments: migrating =================================================
-- create_table(:comments)
-> 0.0105s
== CreateComments: migrated (0.0106s) ========================================

== AddPositionToEpisodes: migrating ==========================================
-- add_column(:episodes, :position, :integer, {:default=>0})
-> 0.0271s
[FATAL] failed to allocate memory

I am running OS X Lion with a brand new install of ruby 1.9.2 with RVM

Overview of new comments for moderators

Moderators have to manually access each episode to look for new comments. Perhaps an overview page of all comments or a regular digest e-mail containing new comnents is a good idea to make it easier.

More spam prevention

Seems spam is on the rise again. That fact that people are creating Github accounts just to post spam on a different site is very sad :-(

May I suggest implementing the following:

  • Assign more moderators. I'd be happy to clean up spam if I spot any.
  • Report spam button seems to have been removed in the new site design. I suggest it should come back. Moderators should them be able to view spam reports, weighted by unique report counts desc.
  • If a moderator deletes a spam comment, then block the github user from making further comments (don't delete, else they can just resign up).
  • If bots are getting to this stage, reimplement a honey-pot trap so bots that fill in the first field don't get submitted
  • Implement a Javascript requirement. Hidden field that is remove through javascript, so that Javascript needs to be on in order to post anything.
  • If the Github user has not yet made a comment, require they fill in a captcha (i.e. require_captcha if user.comments.count.zero?) and their first comment is moderated.
  • Implement Defender - https://github.com/dvyjones/defender

That should catch most spam. The only way spam would get to the public eye is if a user posts a legit first comment, and then spams on the second one.

What do you think? Too much? The spam doesn't really give a good impression of the site, so extra effort is probably good.

Again, I'm happy to help with the moderating if you'd like some assistance.

Searching with Category

Performing a search and then selecting a category does not further filter the results, this only happens on the Thinking Sphinx search.

Markdown for older comments

Markdown is disabled for older comments, but it would be nice if moderators could enable it when they are editing them. Add a checkbox when editing comments that is only visible to moderators.

Sortable episode list view

The header items in the episode list view should be clickable to sort asc/desc. This way one can see the more recent episodes first if they want, or the longer/shorter ones, or the ones with the most comments to help look for spam.

Comments tab selected by default if moderator

As a moderator, I've been scanning through episode comments by starting from the bottom and scanning up to the top before pressing 'next episode', after-which I need to select the comments tab again - which becomes a slight annoyance after 5 pages. It'd be good if the comments tab was the default selected for moderators seeming as it's the comments which are our responsibility.

Comments count not updated

Hi.
Little issue.

When going to comments, watching the episode, look for similar episodes tabs then going back to comments successfully updates comments (content), but the comments count (tab name) isn't updated.

Please, keep railscasts open-source

Hi Ryan,

We cannot see updated source code anymore since Railscasts offers pro subscription.
It could be an invaluable source to have it again, especially regarding the way you manage subscription (edit, cancel and authorization through it) which is not an easy topic for beginner.

Thank you so much for taking it into consideration.

Can't connect to local MySQL server through socket

I am also running into a script/setup error which is not related to: #34

The mysql2 gem installs fine and when I run script/setup I run into this error:

Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
Couldn't create database for {"adapter"=>"mysql2", "encoding"=>"utf8", "reconnect"=>false, "database"=>"railscasts_development", "pool"=>5, "username"=>"root", "password"=>nil, "host"=>"localhost"}, charset: , collation:
Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
Couldn't create database for {"adapter"=>"mysql2", "encoding"=>"utf8", "reconnect"=>false, "database"=>"railscasts_test", "pool"=>5, "username"=>"root", "password"=>nil, "host"=>"localhost"}, charset: , collation:
Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
Couldn't create database for {"adapter"=>"mysql2", "encoding"=>"utf8", "reconnect"=>false, "database"=>"railscasts_production", "pool"=>5, "username"=>"root", "password"=>nil, "host"=>"localhost"}, charset: , collation:

I'm using Ubuntu 12.04 and RVM and don't even see a /var/run/mysqld folder. Has anyone else run into this issue?

Indicate to moderators which episodes aren't released

Since mods can see previews of episodes, there is no way to tell when an episode gets released on Monday.

According to mod guidelines: "send feedback through email or the feedback page, not the comments section until the episode is released"

But I can't tell if its released yet.

A warning flash message at the top indicating a preview video isn't released would be handy.

Ordering railscast searches

Whenever I search for a railscast, I can see the most relevant at the top, but on occasion these are also rather old episodes. What would be great to see would be an order by relevance and order by date/shownumber.

Search recent comments by author name and site url

You can search recent comments by body but not by authors name and site url, so we can't search for comments by the same username and website.

It would be nice if a search found comments by these criteria. Else, perhaps make a new recent users page/moderation page?

flag comments as spam

many older screencasts in the web site has many spam. however those screencasts are still watched and comments are read. for both new and old posts i suggest a "flag as spam" button. so, per se if 5 visitors flag the comment as spam, it would hide.

Preview comment shows spam link

Previewing a comment shows the spam link (along with edit/destroy if admin I'm guessing). It obviously shouldn't show these since the comment hasn't been created yet.

Email replies to comments

Send an email to author of comment when reply is added. Provide an easy way to turn off by clicking an unsubscribe url in email or editing their profile.

Wrong html class with autoplay param when not logged.

In the latest version of railscasts when you are not logged and visit a pro episode with ?autoplay=true a div class is rendered wrong. I would gladly submit a pull request but I think the bug is in the private repo :)

Here is a screenshot for better understanding:

Screenshot

Question about user token in the Railscasts code

Hi Ryan,

Sorry if I post this in the wrong section. (This is not an issue)
I have just a question about the use of user token in your railscasts code.

If I am right, the token is set for faster login in development. However I am wondering if there is another use of user token in your project, as I can't see it.

Thanks a lot for your lightning!

Error Page Problems

The 404/500 error pages have the About RailsCasts section disabled. I think there are some other minor problems with it too, I need to test out all the links to be certain.

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.