├── LICENSE ├── README.md └── content.json /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2013 Jon H.M. Chan 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![Bento](http://bentobox.io/static/img/twitter_card.png "Bento") 2 | ===== 3 | Curated by [@jonhmchan](http://twitter.com/jonhmchan). Like Bento? [Leave me a tip](http://gittip.com/jonhmchan). 4 | 5 | ## About 6 | This is where all the community submitted resources on Bento are managed and stored. The main site at https://www.bento.io/ uses all the data here to render the link share on the main page, in addition to supplementary content on the detail views. Read the instructions below to submit links and contribute. 7 | 8 | ## Testing and validation 9 | Please make sure that you *validate your JSON before submitting a pull request* using [JSONLint](http://jsonlint.com/). Invalid JSON that passes through will break the site. Also, there is currently no way to test any drafts of your JSON changes on the new site since Bento is no longer static. There are plans to change this to make it easier for developers, but when that change may happen is unclear. 10 | 11 | ## Make a contribution 12 | **content.json** (in the gh-pages branch) is where all the resources are defined. In each resource there is a name of the technology, a short description, what the user should learn next, and an ordered list of resources related to that technology. There are a few things to keep in mind when doing editing: 13 | 14 | 1. Links should be free (no pay walls) and take the user *immediately* to the relevant information (i.e. for html go to the html exercise in codecademy, rather than codeacademy's home page - the user should not have to do any searching to start learning) 15 | 2. Links should come from a single source on a single topic, so a blog post rather than the homepage for a blog, a tutorial rather than a list of tutorials, etc. 16 | 3. Links should generally be about the topic as a whole, and not about a special subject *within* that topic (i.e. an introduction to CSS rather than different ways to float divs) 17 | 4. All names must be lowercase (even in the "after" fields and descriptions) 18 | 5. Descriptions should be no more than 100 characters long 19 | 6. Descriptions should *not* use any complex jargon when possible and should *not* be treated as a space for ad-like vocabulary 20 | 7. Home should be the top domain when possible (official documentation or the wikipedia article if a concept) 21 | 8. Next lessons ("after") are meant to signify what the next lesson should be (1) **immediate** and (2) **obvious** (3) **next or related steps** from the current box 22 | 9. Prerequisites for a box should be in the "before" array. They must be clearly "necessary" to know in order to be included. Topics that are simply helpful to know, but not essential should be avoided 23 | 10. Each LINK (not the box) must be categorized as "easy" (level: 0, no previous experience necessary), "medium" (level: 1, requires "easy" information), and "hard" (level: 2, requires "medium" information) 24 | 11. Only the first two "easy" links are shown, in the order of the array 25 | 12. Link names should be the title of the destination 26 | 27 | If you have any questions, please don't hesitate to contact me by tweeting [@jonhmchan](http://twitter.com/jonhmchan) 28 | -------------------------------------------------------------------------------- /content.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "name": "fundamentals", 4 | "tags": ["bridge"], 5 | "description": "How the web works", 6 | "before": [], 7 | "after": ["html", "css", "javascript"], 8 | "home": "http://developer.mozilla.org/en-US/docs/Web/HTML", 9 | "links": [ 10 | { 11 | "name": "How the Internet Works in 5 Minutes", 12 | "level": 0, 13 | "url": "https://www.youtube.com/watch?v=7_LPdttKXPc" 14 | }, 15 | { 16 | "name": "20 Things I Learned", 17 | "level": 0, 18 | "url": "http://www.20thingsilearned.com/en-US" 19 | }, 20 | { 21 | "name": "DNS Explained", 22 | "level": 0, 23 | "url": "https://www.youtube.com/watch?v=72snZctFFtA" 24 | } 25 | ] 26 | }, 27 | { 28 | "name": "html", 29 | "tags": ["frontend"], 30 | "description": "The very basics of putting something on a webpage", 31 | "before": [], 32 | "after": ["css", "javascript", "sublime text"], 33 | "home": "http://developer.mozilla.org/en-US/docs/Web/HTML", 34 | "links": [ 35 | { 36 | "name": "Codecademy", 37 | "level": 0, 38 | "url": "http://www.codecademy.com/courses/web-beginner-en-HZA3b/0/1?curriculum_id=50579fb998b470000202dc8b" 39 | }, 40 | { 41 | "name": "Dash", 42 | "level": 0, 43 | "url": "http://dash.ga.co/?vip=bento" 44 | }, 45 | { 46 | "name": "HTML Dog", 47 | "level": 0, 48 | "url": "http://htmldog.com/guides/html/beginner/" 49 | } 50 | ] 51 | }, 52 | { 53 | "name": "css", 54 | "tags": ["frontend"], 55 | "description": "Styling your webpage", 56 | "before": [], 57 | "after": ["javascript", "less", "sass", "bootstrap", "sublime text"], 58 | "home": "http://developer.mozilla.org/en-US/docs/Web/CSS", 59 | "links": [ 60 | { 61 | "name": "Codecademy", 62 | "level": 0, 63 | "url": "http://www.codecademy.com/courses/web-beginner-en-TlhFi/0/1?curriculum_id=50579fb998b470000202dc8b" 64 | }, 65 | { 66 | "name": "Dash", 67 | "level": 0, 68 | "url": "http://dash.ga.co/?vip=bento" 69 | }, 70 | { 71 | "name": "HTML Dog", 72 | "level": 0, 73 | "url": "http://htmldog.com/guides/css/beginner/" 74 | }, 75 | { 76 | "name": "Treehouse - CSS Foundations", 77 | "level": 0, 78 | "url": "http://teamtreehouse.com/library/css-foundations" 79 | }, 80 | { 81 | "name": "Scalable and Modular Architecture for CSS", 82 | "level": 1, 83 | "url": "http://smacss.com/book/" 84 | }, 85 | { 86 | "name": "A Beginner's Guide to HTML & CSS", 87 | "level": 0, 88 | "url": "http://learn.shayhowe.com/html-css/" 89 | } 90 | ] 91 | }, 92 | { 93 | "name": "shell", 94 | "tags": ["bridge"], 95 | "description": "Use the command line", 96 | "before": [], 97 | "after": ["git"], 98 | "home": "http://en.wikipedia.org/wiki/Shell_(computing)", 99 | "links": [ 100 | { 101 | "name": "Don't Fear the Command Line", 102 | "level": 0, 103 | "url": "http://readwrite.com/2014/07/18/command-line-tutorial-intro" 104 | }, 105 | { 106 | "name": "Learning the Shell", 107 | "level": 0, 108 | "url": "http://linuxcommand.org/lc3_learning_the_shell.php" 109 | }, 110 | { 111 | "name": "Learn Shell", 112 | "level": 0, 113 | "url": "http://learnshell.org" 114 | }, 115 | { 116 | "name": "The Command Line Crash Course", 117 | "level": 0, 118 | "url": "http://cli.learncodethehardway.org/book/introduction.html" 119 | }, 120 | { 121 | "name": "The Fundamentals of Bash Scripting", 122 | "level": 0, 123 | "url": "http://code.tutsplus.com/tutorials/the-fundamentals-of-bash-scripting--net-32093" 124 | }, 125 | { 126 | "name": "Explain Shell", 127 | "level": 1, 128 | "url": "http://explainshell.com/" 129 | }, 130 | { 131 | "name": "Advanced Topics", 132 | "level": 2, 133 | "url": "http://www.tldp.org/LDP/abs/html/part5.html" 134 | } 135 | ] 136 | }, 137 | { 138 | "name": "git", 139 | "tags": ["bridge"], 140 | "description": "Simple to use version control", 141 | "before": [], 142 | "after": ["http", "heroku", "javascript"], 143 | "home": "http://git-scm.com/", 144 | "links": [ 145 | { 146 | "name": "Try Git", 147 | "level": 0, 148 | "url": "http://try.github.io/levels/1/challenges/1" 149 | }, 150 | { 151 | "name": "The Simple Guide", 152 | "level": 0, 153 | "url": "http://rogerdudler.github.io/git-guide/" 154 | }, 155 | { 156 | "name": "Git Immersion", 157 | "level": 0, 158 | "url": "http://gitimmersion.com/" 159 | }, 160 | { 161 | "name": "Git Basics", 162 | "level": 0, 163 | "url": "https://www.atlassian.com/git/tutorials/setting-up-a-repository/" 164 | }, 165 | { 166 | "name": "Getting Started", 167 | "level": 0, 168 | "url":"http://git-scm.com/book/en/Getting-Started" 169 | }, 170 | { 171 | "name": "Collaborating", 172 | "level": 1, 173 | "url": "https://www.atlassian.com/git/tutorials/syncing/" 174 | }, 175 | { 176 | "name": "Migrating to Git", 177 | "level": 1, 178 | "url": "https://www.atlassian.com/git/tutorials/migrating-overview/" 179 | }, 180 | { 181 | "name": "Git Best Practices", 182 | "level": 1, 183 | "url": "http://sethrobertson.github.io/GitBestPractices/" 184 | }, 185 | { 186 | "name": "Learn Git Branching", 187 | "level": 1, 188 | "url": "http://pcottle.github.io/learnGitBranching/" 189 | }, 190 | { 191 | "name": "Advanced Tips", 192 | "level": 2, 193 | "url": "https://www.atlassian.com/git/tutorials/advanced-overview/" 194 | }, 195 | { 196 | "name": "Git from the bottom up", 197 | "level": 2, 198 | "url": "http://ftp.newartisans.com/pub/git.from.bottom.up.pdf" 199 | }, 200 | { 201 | "name": "A Hacker's Guide to Git", 202 | "level": 2, 203 | "url": "http://wildlyinaccurate.com/a-hackers-guide-to-git" 204 | } 205 | ] 206 | }, 207 | { 208 | "name": "javascript", 209 | "tags": ["frontend"], 210 | "description": "Make your pages interactive", 211 | "before": [], 212 | "after": ["python", "jquery", "json", "node", "underscore", "sugar", "coffeescript", "regex"], 213 | "home": "http://developer.mozilla.org/en-US/docs/Web/JavaScript", 214 | "links": [ 215 | { 216 | "name": "Codecademy", 217 | "level": 0, 218 | "url": "http://www.codecademy.com/courses/getting-started-v2/0/1?curriculum_id=506324b3a7dffd00020bf661" 219 | }, 220 | { 221 | "name": "Learn X in Y Minutes", 222 | "level": 0, 223 | "url": "http://learnxinyminutes.com/docs/javascript/" 224 | }, 225 | { 226 | "name": "Learn JS", 227 | "level": 0, 228 | "url": "http://www.learn-js.org/" 229 | }, 230 | { 231 | "name": "Treehouse - JavaScript Foundations", 232 | "level": 0, 233 | "url": "http://teamtreehouse.com/library/websites/javascript-foundations" 234 | }, 235 | { 236 | "name": "CoderMania", 237 | "level": 0, 238 | "url": "http://www.codermania.com/javascript/lesson/1a/hello-world" 239 | }, 240 | { 241 | "name": "Javascript for Cats", 242 | "level": 0, 243 | "url": "http://jsforcats.com/" 244 | }, 245 | { 246 | "name": "A Re-introduction to JavaScript", 247 | "level": 1, 248 | "url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/A_re-introduction_to_JavaScript" 249 | }, 250 | { 251 | "name": "A Dive Into Plain Javascript", 252 | "level": 1, 253 | "url": "http://blog.adtile.me/2014/01/16/a-dive-into-plain-javascript/" 254 | }, 255 | { 256 | "name": "Superhero.js", 257 | "level": 1, 258 | "url": "http://superherojs.com/" 259 | }, 260 | { 261 | "name": "JS: The Right Way", 262 | "level": 1, 263 | "url": "http://jstherightway.org/" 264 | }, 265 | { 266 | "name": "Eloquent Javascript", 267 | "level": 1, 268 | "url": "http://eloquentjavascript.net/" 269 | }, 270 | { 271 | "name": "Introduction to Object-Oriented JavaScript", 272 | "level": 2, 273 | "url": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Introduction_to_Object-Oriented_JavaScript" 274 | }, 275 | { 276 | "name": "Learning Javascript Design Patterns", 277 | "level": 2, 278 | "url": "http://addyosmani.com/resources/essentialjsdesignpatterns/book/" 279 | }, 280 | { 281 | "name": "Fight Code Game", 282 | "level": 1, 283 | "url": "http://fightcodegame.com/" 284 | }, 285 | { 286 | "name": "Code Wars", 287 | "level": 1, 288 | "url": "http://www.codewars.com/" 289 | }, 290 | { 291 | "name": "Human Javascript", 292 | "level": 1, 293 | "url": "http://read.humanjavascript.com/" 294 | }, 295 | { 296 | "name": "Learning Advanced JavaScript", 297 | "level": 2, 298 | "url": "http://ejohn.org/apps/learn/" 299 | }, 300 | { 301 | "name": "Modular JavaScript", 302 | "level": 1, 303 | "url": "http://www.adequatelygood.com/JavaScript-Module-Pattern-In-Depth.html#show-last-Point" 304 | } 305 | ] 306 | }, 307 | { 308 | "name": "jquery", 309 | "tags": ["frontend"], 310 | "description": "Control webpage elements with javascript", 311 | "before": [], 312 | "after": ["python", "angular", "backbone", "ember", "sugar", "coffeescript", "flight", "dart", "d3"], 313 | "home": "http://jquery.com/", 314 | "links": [ 315 | { 316 | "name": "Try jQuery", 317 | "level": 0, 318 | "url": "http://try.jquery.com/" 319 | }, 320 | { 321 | "name": "Codecademy", 322 | "level": 0, 323 | "url": "http://www.codecademy.com/courses/web-beginner-en-bay3D/0/1?curriculum_id=50a3fad8c7a770b5fd0007a1" 324 | }, 325 | { 326 | "name": "jQuery in 30 Minutes", 327 | "level": 0, 328 | "url": "http://screencastaday.s3.amazonaws.com/Video_80/JQueryPresentation.swf" 329 | }, 330 | { 331 | "name": "Treehouse - Build an Interactive Website", 332 | "level": 0, 333 | "url": "http://teamtreehouse.com/library/websites/build-an-interactive-website" 334 | } 335 | ] 336 | }, 337 | { 338 | "name": "sublime text", 339 | "tags": ["ide"], 340 | "description": "A popular text editor", 341 | "before": [], 342 | "after": ["vim", "python"], 343 | "home": "http://www.sublimetext.com/", 344 | "links": [ 345 | { 346 | "name": "The Complete Visual Guide to Sublime Text 3", 347 | "level": 0, 348 | "url": "https://scotch.io/bar-talk/the-complete-visual-guide-to-sublime-text-3-getting-started-and-keyboard-shortcuts" 349 | }, 350 | { 351 | "name": "Getting Started with Sublime Text 3: 25 Tips, Tricks, and Shortcuts", 352 | "level": 0, 353 | "url": "https://blog.generalassemb.ly/sublime-text-3-tips-tricks-shortcuts/" 354 | } 355 | ] 356 | }, 357 | { 358 | "name": "python", 359 | "tags": ["backend"], 360 | "description": "A programming language to easily pick up", 361 | "before": [], 362 | "after": ["big-o", "flask", "django", "tornado", "heroku", "ruby", "node", "go"], 363 | "home": "http://www.python.org/", 364 | "links": [ 365 | { 366 | "name": "Codecademy", 367 | "level": 0, 368 | "url": "http://www.codecademy.com/tracks/python" 369 | }, 370 | { 371 | "name": "Intro to Computer Science", 372 | "level": 0, 373 | "url": "https://www.udacity.com/course/cs101" 374 | }, 375 | { 376 | "name": "Learn Python", 377 | "level": 0, 378 | "url": "http://www.learnpython.org/" 379 | }, 380 | { 381 | "name": "Learn X in Y Minutes", 382 | "level": 0, 383 | "url": "http://learnxinyminutes.com/docs/python/" 384 | }, 385 | { 386 | "name": "Learn Python the Hard Way", 387 | "level": 0, 388 | "url": "http://learnpythonthehardway.org/book/" 389 | }, 390 | { 391 | "name": "Full Stack Python", 392 | "level": 1, 393 | "url": "http://www.fullstackpython.com/" 394 | }, 395 | { 396 | "name": "Think Python: How to Think Like a Computer Scientist", 397 | "level": 1, 398 | "url": "http://www.greenteapress.com/thinkpython/html/thinkpython002.html" 399 | }, 400 | { 401 | "name": "Python Module of the Week", 402 | "level": 1, 403 | "url": "http://pymotw.com/2/" 404 | } 405 | ] 406 | }, 407 | { 408 | "name": "flask", 409 | "tags": ["backend"], 410 | "description": "A basic microframework for python on the web", 411 | "before": [], 412 | "after": ["tornado", "mongo", "django", "heroku", "memcached"], 413 | "home": "http://flask.pocoo.org/", 414 | "links": [ 415 | { 416 | "name": "Documentation", 417 | "level": 0, 418 | "url": "http://flask.pocoo.org/docs/" 419 | }, 420 | { 421 | "name": "Flask Mega Tutorial", 422 | "level": 0, 423 | "url": "http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-world" 424 | }, 425 | { 426 | "name": "Flaskr: Intro to Flask and Test Driven Development", 427 | "level": 1, 428 | "url": "https://github.com/mjhea0/flaskr-tdd" 429 | }, 430 | { 431 | "name": "Explore Flask", 432 | "level": 0, 433 | "url": "http://exploreflask.com/preface.html" 434 | }, 435 | { 436 | "name": "Discover Flask", 437 | "level": 1, 438 | "url": "http://discoverflask.com" 439 | } 440 | ] 441 | }, 442 | { 443 | "name": "sql", 444 | "tags": ["database"], 445 | "description": "A popular database language", 446 | "before": [], 447 | "after": ["mongo", "couchdb", "neo4j", "redis", "memcached", "postgresql"], 448 | "home": "http://www.mysql.com/", 449 | "links": [ 450 | { 451 | "name": "SQLZoo", 452 | "level": 0, 453 | "url": "http://sqlzoo.net/wiki/Main_Page" 454 | }, 455 | { 456 | "name": "w3schools", 457 | "level": 0, 458 | "url": "http://www.w3schools.com/sql/" 459 | }, 460 | { 461 | "name": "Problems and Solutions", 462 | "level": 0, 463 | "url": "http://www.sql-tutorial.ru/en/book_Intro.html" 464 | } 465 | ] 466 | }, 467 | { 468 | "name": "database design", 469 | "tags": ["database"], 470 | "description": "How to organize your database", 471 | "before": ["sql"], 472 | "after": ["postgresql"], 473 | "home": "", 474 | "links": [ 475 | { 476 | "name": "tuts+", 477 | "level": 0, 478 | "url": "http://code.tutsplus.com/tutorials/relational-databases-for-dummies--net-30244" 479 | } 480 | ] 481 | }, 482 | { 483 | "name": "sqlalchemy", 484 | "tags": ["database"], 485 | "description": "Keep your python models and database objects in sync", 486 | "before": ["sql", "flask"], 487 | "after": ["postgresql", "alembic"], 488 | "home": "http://www.sqlalchemy.org/", 489 | "links": [ 490 | { 491 | "name": "Object Relational Tutorial", 492 | "level": 0, 493 | "url": "http://docs.sqlalchemy.org/en/rel_0_9/orm/tutorial.html" 494 | } 495 | ] 496 | }, 497 | { 498 | "name": "alembic", 499 | "tags": ["database"], 500 | "description": "Manage your database changes in python", 501 | "before": ["sqlalchemy", "flask"], 502 | "after": [], 503 | "home": "", 504 | "links": [ 505 | { 506 | "name": "A Practical Guide to Using Alembic", 507 | "level": 0, 508 | "url": "http://www.chesnok.com/daily/2013/07/02/a-practical-guide-to-using-alembic/" 509 | }, 510 | { 511 | "name": "Tutorial", 512 | "level": 0, 513 | "url": "http://alembic.readthedocs.org/en/latest/tutorial.html" 514 | } 515 | ] 516 | }, 517 | { 518 | "name": "heroku", 519 | "tags": ["bridge"], 520 | "description": "Easily deploy your applications", 521 | "before": [], 522 | "after": ["git", "postgresql", "javascript", "ruby", "python", "php"], 523 | "home": "http://heroku.com/", 524 | "links": [ 525 | { 526 | "name": "Get Started", 527 | "level": 0, 528 | "url": "https://devcenter.heroku.com/articles/quickstart" 529 | }, 530 | { 531 | "name": "Intro to Heroku Screencast", 532 | "level": 0, 533 | "url": "http://www.codeschool.com/code_tv/heroku" 534 | } 535 | ] 536 | }, 537 | { 538 | "name": "cloudflare", 539 | "tags": ["bridge"], 540 | "description": "Protect your website", 541 | "before": [], 542 | "after": [], 543 | "home": "https://www.cloudflare.com/", 544 | "links": [ 545 | { 546 | "name": "Overview", 547 | "level": 0, 548 | "url": "https://www.cloudflare.com/overview" 549 | } 550 | ] 551 | }, 552 | { 553 | "name": "json", 554 | "tags": ["database"], 555 | "description": "Represent your data in text", 556 | "before": [], 557 | "after": ["mongo", "couchdb", "http", "rest", "xml", "redis", "memcached"], 558 | "home": "http://www.json.org/", 559 | "links": [ 560 | { 561 | "name": "What is JSON?", 562 | "level": 0, 563 | "url": "http://www.copterlabs.com/blog/json-what-it-is-how-it-works-how-to-use-it/" 564 | }, 565 | { 566 | "name": "JSON Validator", 567 | "level": 0, 568 | "url": "http://jsonlint.com" 569 | } 570 | ] 571 | }, 572 | { 573 | "name": "data science", 574 | "tags": ["bridge"], 575 | "description": "Get meaningful insights from your data", 576 | "before": [], 577 | "after": [], 578 | "home": "", 579 | "links": [ 580 | { 581 | "name": "DataQuest", 582 | "level": 0, 583 | "url": "https://dataquest.io/" 584 | } 585 | ] 586 | }, 587 | { 588 | "name": "less", 589 | "tags": ["frontend"], 590 | "description": "A dynamic stylesheet language", 591 | "before": [], 592 | "after": ["sass", "bootstrap"], 593 | "home": "http://lesscss.org/", 594 | "links": [ 595 | { 596 | "name": "Synopsis", 597 | "level": 0, 598 | "url": "http://lesscss.org/#synopsis" 599 | }, 600 | { 601 | "name": "Verekia's Tutorial", 602 | "level": 0, 603 | "url": "http://verekia.com/less-css/dont-read-less-css-tutorial-highly-addictive" 604 | } 605 | ] 606 | }, 607 | { 608 | "name": "bootstrap", 609 | "tags": ["frontend"], 610 | "description": "A popular frontend framework", 611 | "before": [], 612 | "after": ["angular", "ember", "backbone", "sass", "less", "flight"], 613 | "home": "http://getbootstrap.com/", 614 | "links": [ 615 | { 616 | "name": "Get Started", 617 | "level": 0, 618 | "url": "http://getbootstrap.com/getting-started/" 619 | }, 620 | { 621 | "name": "Getting Started with Bootstrap 3", 622 | "level": 0, 623 | "url": "http://www.realpython.com/blog/design/getting-started-with-bootstrap-3" 624 | }, 625 | { 626 | "name": "Introduction to Bootstrap – A Tutorial", 627 | "level": 0, 628 | "url": "https://www.edx.org/course/introduction-bootstrap-tutorial-microsoft-dev203x-0" 629 | } 630 | ] 631 | }, 632 | { 633 | "name": "big-o", 634 | "tags": ["bridge"], 635 | "description": "How to measure your code's performance", 636 | "before": [], 637 | "after": ["data structures", "algorithms"], 638 | "home": "http://en.wikipedia.org/wiki/Big_O_notation", 639 | "links": [ 640 | { 641 | "name": "Algorithm Analysis", 642 | "level": 0, 643 | "url": "http://interactivepython.org/runestone/static/pythonds/index.html#analysis" 644 | }, 645 | { 646 | "name": "Big-O Cheat Sheet", 647 | "level": 0, 648 | "url": "http://bigocheatsheet.com/" 649 | }, 650 | { 651 | "name": "Codility: Time Complexity", 652 | "level": 1, 653 | "url": "http://codility.com/media/train/1-TimeComplexity.pdf" 654 | } 655 | ] 656 | }, 657 | { 658 | "name": "algorithms", 659 | "tags": ["bridge"], 660 | "description": "Popular methods to manipulate data", 661 | "before": [], 662 | "after": ["data structures"], 663 | "home": "http://en.wikipedia.org/wiki/Algorithm", 664 | "links": [ 665 | { 666 | "name": "Problem Solving with Algorithms and Data Structures", 667 | "level": 0, 668 | "url": "http://interactivepython.org/runestone/static/pythonds/index.html" 669 | }, 670 | { 671 | "name": "Khan Academy", 672 | "level": 0, 673 | "url": "https://www.khanacademy.org/computing/computer-science/algorithms" 674 | } 675 | ] 676 | }, 677 | { 678 | "name": "data structures", 679 | "tags": ["bridge"], 680 | "description": "Efficiently organize your data in code", 681 | "before": [], 682 | "after": ["big-o"], 683 | "home": "http://en.wikipedia.org/wiki/Data_structure", 684 | "links": [ 685 | { 686 | "name": "Basic Data Structures", 687 | "level": 0, 688 | "url": "http://interactivepython.org/runestone/static/pythonds/index.html" 689 | } 690 | ] 691 | }, 692 | { 693 | "name": "http", 694 | "tags": ["bridge"], 695 | "description": "The basics of making web requests", 696 | "before": [], 697 | "after": ["python", "javascript", "ruby", "heroku", "json", "rest", "https"], 698 | "home": "http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol", 699 | "links": [ 700 | { 701 | "name": "A Beginner's Guide", 702 | "level": 0, 703 | "url": "http://net.tutsplus.com/tutorials/other/a-beginners-introduction-to-http-and-rest/" 704 | } 705 | ] 706 | }, 707 | { 708 | "name": "security", 709 | "tags": ["bridge"], 710 | "description": "How to protect your website", 711 | "before": [], 712 | "after": ["https", "cloudflare"], 713 | "home": "https://www.owasp.org/index.php/Category:OWASP_Guide_Project", 714 | "links": [ 715 | { 716 | "name": "How Encryption Works", 717 | "level": 0, 718 | "url": "http://www.wimp.com/howencryption/" 719 | }, 720 | { 721 | "name": "An Introduction to Cryptography and Cryptanalysis", 722 | "level": 0, 723 | "url": "http://math.scu.edu/~eschaefe/book.pdf" 724 | }, 725 | { 726 | "name": "Google Security Handbook", 727 | "level": 1, 728 | "url": "https://code.google.com/p/browsersec/wiki/Main" 729 | } 730 | ] 731 | }, 732 | { 733 | "name": "https", 734 | "tags": ["bridge"], 735 | "description": "The basics of secure connections", 736 | "before": [], 737 | "after": [], 738 | "home": "http://en.wikipedia.org/wiki/HTTP_Secure", 739 | "links": [ 740 | { 741 | "name": "First Milliseconds https", 742 | "level": 0, 743 | "url": "http://www.moserware.com/2009/06/first-few-milliseconds-of-https.html" 744 | }, 745 | { 746 | "name": "Switch Your Website To Use https", 747 | "level": 0, 748 | "url": "https://konklone.com/post/switch-to-https-now-for-free" 749 | } 750 | ] 751 | }, 752 | { 753 | "name": "mongo", 754 | "tags": ["database"], 755 | "description": "A simple javascript based database", 756 | "before": [], 757 | "after": ["elasticsearch", "couchdb", "neo4j", "redis", "memcached", "sql", "rethinkdb"], 758 | "home": "http://www.mongodb.org/", 759 | "links": [ 760 | { 761 | "name": "MongoDB University", 762 | "level": 0, 763 | "url": "https://education.mongodb.com/" 764 | }, 765 | { 766 | "name": "Learn you mongo", 767 | "level": 0, 768 | "url": "https://github.com/evanlucas/learnyoumongo" 769 | } 770 | ] 771 | }, 772 | { 773 | "name": "couchdb", 774 | "tags": ["database"], 775 | "description": "A nosql database for the web", 776 | "before": [], 777 | "after": ["mongo", "json", "elasticsearch", "neo4j", "redis", "memcached", "sql", "rethinkdb"], 778 | "home": "http://couchdb.apache.org/", 779 | "links": [ 780 | { 781 | "name": "Getting Started", 782 | "level": 0, 783 | "url": "http://docs.couchdb.org/en/latest/intro/tour.html" 784 | }, 785 | { 786 | "name": "Learn CouchDB", 787 | "level": 0, 788 | "url": "http://code.tutsplus.com/articles/getting-started-with-couchdb--net-18801" 789 | } 790 | ] 791 | }, 792 | { 793 | "name": "elasticsearch", 794 | "tags": ["database"], 795 | "description": "A popular search engine for your application", 796 | "before": [], 797 | "after": ["mongo", "couchdb", "sql", "json", "memcached", "redis", "neo4j"], 798 | "home": "http://www.elasticsearch.org/", 799 | "links": [ 800 | { 801 | "name": "Getting Started", 802 | "level": 0, 803 | "url": "http://www.elasticsearch.org/webinars/getting-started-with-elasticsearch/" 804 | }, 805 | { 806 | "name": "Introducing Query DSL", 807 | "level": 0, 808 | "url": "http://www.elasticsearch.org/videos/introducing-query-dsl/" 809 | }, 810 | { 811 | "name": "Reference", 812 | "level": 0, 813 | "url": "http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/setup.html" 814 | } 815 | ] 816 | }, 817 | { 818 | "name": "redis", 819 | "tags": ["database"], 820 | "description": "A basic key-value store for caching", 821 | "before": [], 822 | "after": ["mongo", "couchdb", "memcached", "neo4j", "sql"], 823 | "home": "http://redis.io/", 824 | "links": [ 825 | { 826 | "name": "The Little Redis Book", 827 | "level": 0, 828 | "url": "http://openmymind.net/redis.pdf" 829 | }, 830 | { 831 | "name": "Try Redis", 832 | "level": 0, 833 | "url": "http://try.redis.io/" 834 | } 835 | ] 836 | }, 837 | { 838 | "name": "memcached", 839 | "tags": ["database"], 840 | "description": "A way to cache your data in memory", 841 | "before": [], 842 | "after": ["mongo", "couchdb", "redis", "heroku", "neo4j", "sql"], 843 | "home": "http://memcached.org/", 844 | "links": [ 845 | { 846 | "name": "An Adventure in Learning Memcached", 847 | "level": 0, 848 | "url": "https://code.google.com/p/memcached/wiki/TutorialCachingStory" 849 | }, 850 | { 851 | "name": "Distributed Caching with Memcached", 852 | "level": 0, 853 | "url": "http://www.linuxjournal.com/article/7451" 854 | } 855 | ] 856 | }, 857 | { 858 | "name": "uilang", 859 | "tags": ["frontend"], 860 | "description": "A minimal programming language for web designers", 861 | "before": [], 862 | "after": ["jquery"], 863 | "home": "http://uilang.com/", 864 | "links": [ 865 | { 866 | "name": "Home", 867 | "level": 0, 868 | "url": "http://uilang.com/" 869 | } 870 | ] 871 | }, 872 | { 873 | "name": "angular", 874 | "tags": ["frontend"], 875 | "description": "A javascript framework for data-driven applications", 876 | "before": [], 877 | "after": ["ember", "jquery", "backbone", "flight"], 878 | "home": "http://angularjs.org/", 879 | "links": [ 880 | { 881 | "name": "Shaping Up with Angular", 882 | "level": 0, 883 | "url": "http://campus.codeschool.com/courses/shaping-up-with-angular-js/intro" 884 | }, 885 | { 886 | "name": "egghead.io", 887 | "level": 0, 888 | "url": "http://egghead.io/lessons" 889 | }, 890 | { 891 | "name": "A Better Way to Learn Angular", 892 | "level": 0, 893 | "url": "http://www.thinkster.io/pick/GtaQ0oMGIl/" 894 | }, 895 | { 896 | "name": "Beginner to Expert Guide to AngularJS", 897 | "level": 0, 898 | "url": "http://www.ng-newsletter.com/posts/beginner2expert-how_to_start.html" 899 | }, 900 | { 901 | "name": "AngularJS Tutorial", 902 | "level": 0, 903 | "url": "https://docs.angularjs.org/tutorial" 904 | } 905 | ] 906 | }, 907 | { 908 | "name": "ractive", 909 | "tags": ["frontend"], 910 | "description": "Live, reactive templates in JavaScript", 911 | "home": "http://ractivejs.org", 912 | "before": [], 913 | "after": ["node"], 914 | "links": [ 915 | { 916 | "name": "Learn Ractive.js", 917 | "level": 0, 918 | "url": "http://learn.ractivejs.org" 919 | } 920 | ] 921 | }, 922 | { 923 | "name": "sass", 924 | "tags": ["frontend"], 925 | "description": "An dynamic extension of css", 926 | "before": [], 927 | "after": ["less", "bootstrap", "angular"], 928 | "home": "http://sass-lang.com/", 929 | "links": [ 930 | { 931 | "name": "Tutorial", 932 | "level": 0, 933 | "url": "http://sass-lang.com/tutorial.html" 934 | }, 935 | { 936 | "name": "SassMeister", 937 | "level": 1, 938 | "url": "http://sassmeister.com" 939 | } 940 | ] 941 | }, 942 | { 943 | "name": "node", 944 | "tags": ["backend"], 945 | "description": "Create a backend with javascript", 946 | "before": [], 947 | "after": ["express", "heroku", "mongo", "ember", "angular", "grunt"], 948 | "home": "http://nodejs.org/", 949 | "links": [ 950 | { 951 | "name": "Node Beginner", 952 | "level": 0, 953 | "url": "http://www.nodebeginner.org/" 954 | }, 955 | { 956 | "name": "nodeschool.io", 957 | "level": 0, 958 | "url": "http://nodeschool.io/" 959 | }, 960 | { 961 | "name": "How Do I Get Started?", 962 | "level": 0, 963 | "url": "http://stackoverflow.com/a/5511507/1043674" 964 | }, 965 | { 966 | "name": "Node.js for Beginners", 967 | "level": 0, 968 | "url": "http://code.tutsplus.com/tutorials/nodejs-for-beginners--net-26314" 969 | }, 970 | { 971 | "name": "Style Guide", 972 | "level": 1, 973 | "url": "http://nodeguide.com/style.html" 974 | }, 975 | { 976 | "name": "Node, Express, and MongoDB - a Primer", 977 | "level": 1, 978 | "url": "http://mherman.org/blog/2014/12/31/node-and-mongoose-a-primer" 979 | } 980 | ] 981 | }, 982 | { 983 | "name": "express", 984 | "tags": ["backend"], 985 | "description": "The most popular web framework for node", 986 | "before": [], 987 | "after": ["heroku", "angular", "ember"], 988 | "home": "http://expressjs.com/", 989 | "links": [ 990 | { 991 | "name": "Guide", 992 | "level": 0, 993 | "url": "http://expressjs.com/guide.html" 994 | }, 995 | { 996 | "name": "Introduction to Express", 997 | "level": 0, 998 | "url": "http://net.tutsplus.com/tutorials/javascript-ajax/introduction-to-express/" 999 | } 1000 | ] 1001 | }, 1002 | { 1003 | "name": "grunt", 1004 | "tags": ["bridge"], 1005 | "description": "A powerful javascript task runner", 1006 | "before": [], 1007 | "after": ["jade", "coffeescript", "less", "sass"], 1008 | "home": "http://gruntjs.com/", 1009 | "links": [ 1010 | { 1011 | "name": "Getting Started", 1012 | "level": 0, 1013 | "url": "http://gruntjs.com/getting-started" 1014 | }, 1015 | { 1016 | "name": "Tutorial", 1017 | "level": 0, 1018 | "url": "http://24ways.org/2013/grunt-is-not-weird-and-hard/" 1019 | } 1020 | ] 1021 | }, 1022 | { 1023 | "name": "jade", 1024 | "tags": ["frontend"], 1025 | "description": "A templating language forhtml", 1026 | "before": [], 1027 | "after": ["less", "bootstrap", "angular", "grunt"], 1028 | "home": "http://jade-lang.com/", 1029 | "links": [ 1030 | { 1031 | "name": "Tutorial", 1032 | "level": 0, 1033 | "url": "http://jade-lang.com/tutorial/" 1034 | }, 1035 | { 1036 | "name": "Learn Jade", 1037 | "level": 0, 1038 | "url": "http://www.learnjade.com/" 1039 | } 1040 | ] 1041 | }, 1042 | { 1043 | "name": "regex", 1044 | "tags": ["bridge"], 1045 | "description": "A popular syntax for pattern matching", 1046 | "home": "http://www.regular-expressions.info/", 1047 | "before": [], 1048 | "after": ["json", "rest"], 1049 | "links":[ 1050 | { 1051 | "name": "RegexOne", 1052 | "level": 0, 1053 | "url": "http://regexone.com/" 1054 | }, 1055 | { 1056 | "name": "Learn Regex the Hard Way", 1057 | "level": 0, 1058 | "url": "http://regex.learncodethehardway.org/book/" 1059 | } 1060 | ] 1061 | }, 1062 | { 1063 | "name": "vim", 1064 | "tags": ["ide"], 1065 | "description": "A text editor in your console", 1066 | "before": [], 1067 | "after": ["sublime text"], 1068 | "home": "http://vim.sourceforge.net/", 1069 | "links": [ 1070 | { 1071 | "name": "Vim Adventures", 1072 | "level": 0, 1073 | "url": "http://vim-adventures.com/" 1074 | }, 1075 | { 1076 | "name": "Interactive Vim Tutorial", 1077 | "level": 0, 1078 | "url": "http://www.openvim.com/tutorial.html" 1079 | }, 1080 | { 1081 | "name": "Vim Novice Tutorial Videos", 1082 | "level": 0, 1083 | "url": "http://derekwyatt.org/vim/tutorials/novice/" 1084 | }, 1085 | { 1086 | "name": "Vim as a Design Tool", 1087 | "level": 0, 1088 | "url": "http://hackdesign.org/lessons/49" 1089 | }, 1090 | { 1091 | "name": "Vim Genius", 1092 | "level": 1, 1093 | "url": "http://vimgenius.com/" 1094 | }, 1095 | { 1096 | "name": "Vim Golf", 1097 | "level": 2, 1098 | "url": "http://vimgolf.com/" 1099 | } 1100 | ] 1101 | }, 1102 | { 1103 | "name":"mvc", 1104 | "tags": ["bridge"], 1105 | "description": "Popular software architecture pattern", 1106 | "before": [], 1107 | "after": ["codeigniter", "laravel", "symfony", "yii","cakephp"], 1108 | "home": "http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller", 1109 | "links": [ 1110 | { 1111 | "name":"The Model-View-Controller Pattern", 1112 | "level": 0, 1113 | "url":"https://en.wikibooks.org/wiki/Computer_Science_Design_Patterns/Model%E2%80%93view%E2%80%93controller" 1114 | }, 1115 | { 1116 | "name":"What are the benefits of MVC?", 1117 | "level": 0, 1118 | "url":"http://blog.iandavis.com/2008/12/09/what-are-the-benefits-of-mvc/" 1119 | }, 1120 | { 1121 | "name":"Model-View-Controller (MVC) Explained", 1122 | "level": 0, 1123 | "url":"https://realpython.com/blog/python/the-model-view-controller-mvc-paradigm-summarized-with-legos/" 1124 | } 1125 | ] 1126 | }, 1127 | { 1128 | "name": "rest", 1129 | "tags": ["api"], 1130 | "description": "A way to architecture your applications around verbs and resources", 1131 | "home": "", 1132 | "before": [], 1133 | "after": ["json", "xml", "http"], 1134 | "links": [ 1135 | { 1136 | "name": "Best Practices for Designing Pragmatic RESTful APIs", 1137 | "level": 0, 1138 | "url": "http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api?hn" 1139 | }, 1140 | { 1141 | "name": "Designing HTTP Interfaces and RESTful Web Services", 1142 | "level": 1, 1143 | "url": "http://www.youtube.com/watch?v=zEyg0TnieLg" 1144 | }, 1145 | { 1146 | "name": "White House Web API Standards", 1147 | "level": 0, 1148 | "url": "https://github.com/WhiteHouse/api-standards" 1149 | }, 1150 | { 1151 | "name": "Architectural Styles and the Design of Network-based Software Architectures", 1152 | "level": 0, 1153 | "url": "http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm" 1154 | }, 1155 | { 1156 | "name": "Create a Super Basic REST API with django-tastypie", 1157 | "level": 0, 1158 | "url": "http://www.realpython.com/blog/python/create-a-super-basic-rest-api-with-django-tastypie" 1159 | } 1160 | ] 1161 | }, 1162 | { 1163 | "name": "bottle", 1164 | "tags": ["backend"], 1165 | "description": "A fast, simple and lightweight micro framework for python", 1166 | "before": [], 1167 | "after": ["flask", "tornado", "mongo", "couchdb", "django", "heroku", "memcached"], 1168 | "home": "http://bottlepy.org/docs/dev/", 1169 | "links": [ 1170 | { 1171 | "name": "Developing with Bottle", 1172 | "level": 0, 1173 | "url": "http://www.realpython.com/blog/python/developing-with-bottle-part-1" 1174 | }, 1175 | { 1176 | "name": "Developing with Bottle - part 2", 1177 | "level": 1, 1178 | "url": "http://www.realpython.com/blog/python/developing-with-bottle-part-2-plot-ly-api" 1179 | } 1180 | ] 1181 | }, 1182 | { 1183 | "name": "django", 1184 | "tags": ["backend"], 1185 | "description": "A popular web framework for python", 1186 | "before": [], 1187 | "after": ["tornado", "flask", "heroku"], 1188 | "home": "http://www.djangoproject.com", 1189 | "links": [ 1190 | { 1191 | "name": "Want to Learn Django?", 1192 | "level": 0, 1193 | "url": "http://elweb.co/want-to-learn-django-start-here/" 1194 | }, 1195 | { 1196 | "name": "Documentation", 1197 | "level": 0, 1198 | "url": "https://docs.djangoproject.com/en/1.8/" 1199 | }, 1200 | { 1201 | "name": "Setting up a Django Project from Scratch", 1202 | "level": 0, 1203 | "url": "http://realdjango.com/" 1204 | } 1205 | ] 1206 | }, 1207 | { 1208 | "name": "tornado", 1209 | "tags": ["backend"], 1210 | "description": "An asynchronous microframework for python on the web", 1211 | "before": [], 1212 | "after": ["flask", "heroku", "django"], 1213 | "home": "http://www.tornadoweb.org/en/stable/", 1214 | "links": [ 1215 | { 1216 | "name": "Documentation", 1217 | "level": 0, 1218 | "url": "http://www.tornadoweb.org/en/stable/documentation.html" 1219 | } 1220 | ] 1221 | }, 1222 | { 1223 | "name": "ruby", 1224 | "tags": ["backend"], 1225 | "description": "A simple scripting language", 1226 | "before": [], 1227 | "after": ["rails", "python"], 1228 | "home": "http://www.ruby-lang.org/en/", 1229 | "links": [ 1230 | { 1231 | "name": "Try Ruby", 1232 | "level": 0, 1233 | "url": "http://tryruby.org/levels/1/challenges/0" 1234 | }, 1235 | { 1236 | "name": "Codecademy", 1237 | "level": 0, 1238 | "url": "http://www.codecademy.com/tracks/ruby" 1239 | }, 1240 | { 1241 | "name": "RubyMonk", 1242 | "level": 0, 1243 | "url":"http://rubymonk.com/" 1244 | }, 1245 | { 1246 | "name": "Ruby Warrior", 1247 | "level": 0, 1248 | "url": "https://www.bloc.io/ruby-warrior/#/" 1249 | }, 1250 | { 1251 | "name": "Ruby Koans", 1252 | "level": 0, 1253 | "url": "http://rubykoans.com/" 1254 | }, 1255 | { 1256 | "name": "Learn X in Y Minutes", 1257 | "level": 0, 1258 | "url": "http://learnxinyminutes.com/docs/ruby/" 1259 | }, 1260 | { 1261 | "name": "Learn Ruby the Hard Way", 1262 | "level": 0, 1263 | "url": "http://ruby.learncodethehardway.org/book/" 1264 | }, 1265 | { 1266 | "name": "Treehouse - Ruby Foundations", 1267 | "level": 0, 1268 | "url": "http://teamtreehouse.com/library/programming/ruby-foundations" 1269 | }, 1270 | { 1271 | "name": "Code Wars", 1272 | "level": 0, 1273 | "url": "http://www.codewars.com/" 1274 | }, 1275 | { 1276 | "name": "Why's (Poignant) Guide to Ruby", 1277 | "level": 0, 1278 | "url": "http://mislav.uniqpath.com/poignant-guide/" 1279 | }, 1280 | { 1281 | "name": "Ruby in Twenty Minutes", 1282 | "level": 0, 1283 | "url": "https://www.ruby-lang.org/en/documentation/quickstart/" 1284 | } 1285 | ] 1286 | }, 1287 | { 1288 | "name": "rails", 1289 | "tags": ["backend", "mvc"], 1290 | "description": "The most popular web framework for ruby", 1291 | "before": [], 1292 | "after": ["heroku", "coffeescript", "less", "sass", "sql"], 1293 | "home": "http://rubyonrails.org/", 1294 | "links": [ 1295 | { 1296 | "name": "Michael Hartl's Tutorial", 1297 | "level": 0, 1298 | "url": "https://www.railstutorial.org/book" 1299 | }, 1300 | { 1301 | "name": "Learn Ruby on Rails as You Modify a Craigslist Clone", 1302 | "level": 0, 1303 | "url": "http://www.thinkful.com/learn/ruby-on-rails-tutorial/" 1304 | }, 1305 | { 1306 | "name": "The Best Way to Learn Rails", 1307 | "level": 0, 1308 | "url": "http://net.tutsplus.com/tutorials/ruby/the-best-way-to-learn-ruby-on-rails/" 1309 | }, 1310 | { 1311 | "name": "Rails for Zombies", 1312 | "level": 0, 1313 | "url": "http://railsforzombies.org/" 1314 | }, 1315 | { 1316 | "name": "Install Rails", 1317 | "level":0, 1318 | "url": "http://installrails.com/" 1319 | }, 1320 | { 1321 | "name": "Rails Anatomy", 1322 | "level": 0, 1323 | "url": "https://www.codeschool.com/code_tv/rails-anatomy" 1324 | }, 1325 | { 1326 | "name": "Introduction to Rails", 1327 | "level": 0, 1328 | "url": "http://net.tutsplus.com/tutorials/ruby/the-intro-to-rails-screencast-i-wish-i-had/" 1329 | }, 1330 | { 1331 | "name": "What is Ruby on Rails?", 1332 | "level": 0, 1333 | "url": "http://railsapps.github.io/what-is-ruby-rails.html" 1334 | }, 1335 | { 1336 | "name": "Recommendations for a Rails Tutorial", 1337 | "level": 0, 1338 | "url": "https://tutorials.railsapps.org/rails-tutorial" 1339 | }, 1340 | { 1341 | "name": "RailsCasts", 1342 | "level": 0, 1343 | "url": "http://railscasts.com/" 1344 | }, 1345 | { 1346 | "name": "Treehouse - Build a Simple Ruby on Rails Application", 1347 | "level": 0, 1348 | "url": "http://teamtreehouse.com/library/programming/build-a-simple-ruby-on-rails-application" 1349 | }, 1350 | { 1351 | "name": "When Should You Use Scaffolding?", 1352 | "level": 0, 1353 | "url": "http://gun.io/blog/using-scaffolding/" 1354 | } 1355 | ] 1356 | }, 1357 | { 1358 | "name": "jekyll", 1359 | "tags": ["backend"], 1360 | "description": "Simple blogging", 1361 | "home": "http://jekyllrb.com/", 1362 | "before": ["git", "html", "css"], 1363 | "after": [], 1364 | "links": [ 1365 | { 1366 | "name": "Documentation", 1367 | "level": 0, 1368 | "url": "http://jekyllrb.com/docs/home/" 1369 | } 1370 | ] 1371 | }, 1372 | { 1373 | "name": "go", 1374 | "tags": ["backend"], 1375 | "description": "A new language for the web", 1376 | "home": "http://golang.org/", 1377 | "before": [], 1378 | "after": ["python", "ruby", "node"], 1379 | "links": [ 1380 | { 1381 | "name": "Tour", 1382 | "level": 0, 1383 | "url": "http://tour.golang.org/#1" 1384 | }, 1385 | { 1386 | "name": "Go by Example", 1387 | "level": 0, 1388 | "url": "https://gobyexample.com/" 1389 | }, 1390 | { 1391 | "name": "Writing, building, installing, and testing Go code", 1392 | "level": 0, 1393 | "url": "https://www.youtube.com/watch?v=XCsL89YtqCs" 1394 | }, 1395 | { 1396 | "name": "Effective Go", 1397 | "level": 1, 1398 | "url": "http://golang.org/doc/effective_go.html" 1399 | } 1400 | ] 1401 | }, 1402 | { 1403 | "name": "java", 1404 | "tags": ["backend"], 1405 | "description": "A popular programming language", 1406 | "home": "", 1407 | "before": [], 1408 | "after": ["python", "ruby", "node", "coldfusion", "scala", "clojure", "groovy"], 1409 | "links": [ 1410 | { 1411 | "name": "Intro to Programming in Java", 1412 | "level": 0, 1413 | "url": "https://www.udacity.com/course/cs046" 1414 | }, 1415 | { 1416 | "name": "Programming Methodology", 1417 | "level": 0, 1418 | "url": "https://see.stanford.edu/Course/CS106A" 1419 | }, 1420 | { 1421 | "name": "BuckysRoom: Java", 1422 | "level": 0, 1423 | "url": "https://buckysroom.org/videos.php?cat=31" 1424 | }, 1425 | { 1426 | "name": "Eclipse and Java", 1427 | "level": 0, 1428 | "url": "http://eclipsetutorial.sourceforge.net/totalbeginner.html" 1429 | }, 1430 | { 1431 | "name": "Java Video Tutes", 1432 | "level": 0, 1433 | "url": "http://www.javavideotutes.com/lessons" 1434 | }, 1435 | { 1436 | "name": "Java for the Beginning Programmer", 1437 | "level": 0, 1438 | "url": "http://www.heatonresearch.com/articles/series/15" 1439 | }, 1440 | { 1441 | "name": "Learning Java", 1442 | "level": 0, 1443 | "url": "http://chimera.labs.oreilly.com/books/1234000001805/index.html" 1444 | }, 1445 | { 1446 | "name": "BuckysRoom: Intermediate Java", 1447 | "level": 1, 1448 | "url": "https://buckysroom.org/videos.php?cat=25" 1449 | } 1450 | 1451 | ] 1452 | }, 1453 | { 1454 | "name": "scala", 1455 | "tags": ["backend"], 1456 | "description": "A highly performant language that works with java", 1457 | "home": "http://www.scala-lang.org/", 1458 | "before": [], 1459 | "after": ["play"], 1460 | "links":[ 1461 | { 1462 | "name": "Scala Tutorials", 1463 | "level": 0, 1464 | "url": "http://scalatutorials.com/tour/" 1465 | }, 1466 | { 1467 | "name": "Learning Scala", 1468 | "level": 0, 1469 | "url": "http://stackoverflow.com/a/1380699" 1470 | }, 1471 | { 1472 | "name": "Coursera", 1473 | "level": 0, 1474 | "url": "https://www.coursera.org/course/progfun" 1475 | } 1476 | ] 1477 | }, 1478 | { 1479 | "name": "play", 1480 | "tags": ["backend"], 1481 | "description": "A popular web framework for scala", 1482 | "home": "http://www.playframework.com/", 1483 | "before": [], 1484 | "after": [], 1485 | "links":[ 1486 | { 1487 | "name": "Your first Play application", 1488 | "level": 0, 1489 | "url": "http://www.playframework.com/documentation/2.2.x/ScalaTodoList" 1490 | } 1491 | ] 1492 | }, 1493 | { 1494 | "name": "elixir", 1495 | "tags": ["backend"], 1496 | "description": "A language built on top of the Erlang VM", 1497 | "before": [], 1498 | "after": [], 1499 | "home": "http://elixir-lang.org/", 1500 | "links": [ 1501 | { 1502 | "name": "Getting Started", 1503 | "level": 0, 1504 | "url": "http://elixir-lang.org/getting_started/1.html" 1505 | }, 1506 | { 1507 | "name": "Learn X in Y minutes", 1508 | "level": 0, 1509 | "url": "http://learnxinyminutes.com/docs/elixir/" 1510 | } 1511 | ] 1512 | }, 1513 | { 1514 | "name": "terraform", 1515 | "tags": ["bridge"], 1516 | "description": "A common configuration to launch infrastructure", 1517 | "home": "http://www.terraform.io/", 1518 | "before": [], 1519 | "after": ["heroku"], 1520 | "links": [ 1521 | { 1522 | "name": "Introduction to Terraform", 1523 | "level": 0, 1524 | "url": "http://www.terraform.io/intro/index.html" 1525 | } 1526 | ] 1527 | }, 1528 | { 1529 | "name": "swift", 1530 | "tags": ["mobile"], 1531 | "description": "The primary language for iOS", 1532 | "home": "https://developer.apple.com/devcenter/ios/index.action", 1533 | "before": [], 1534 | "after": ["windows phone", "android", "objective-c"], 1535 | "links":[ 1536 | { 1537 | "name": "A swift tour", 1538 | "level": 0, 1539 | "url": "https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/GuidedTour.html#//apple_ref/doc/uid/TP40014097-CH2" 1540 | }, 1541 | { 1542 | "name": "RunSwift", 1543 | "level": 0, 1544 | "url": "http://www.runswiftlang.com/learn#1" 1545 | } 1546 | ] 1547 | }, 1548 | { 1549 | "name": "objective-c", 1550 | "tags": ["mobile"], 1551 | "description": "The previous language for iOS", 1552 | "home": "https://developer.apple.com/devcenter/ios/index.action", 1553 | "before": [], 1554 | "after": ["windows phone", "android", "swift"], 1555 | "links":[ 1556 | { 1557 | "name": "A primer in Objective-C", 1558 | "level": 0, 1559 | "url": "http://courseware.codeschool.com/try_ios/objective_c_primer.pdf" 1560 | }, 1561 | { 1562 | "name": "Try Objective-C", 1563 | "level": 0, 1564 | "url": "https://www.codeschool.com/courses/try-objective-c" 1565 | }, 1566 | { 1567 | "name": "X-Code Cheat Sheet", 1568 | "level": 0, 1569 | "url": "http://www.git-tower.com/blog/xcode-cheat-sheet-detail/" 1570 | }, 1571 | { 1572 | "name": "Code Coalition iOS Bootcamp", 1573 | "level": 1, 1574 | "url": "https://www.codecoalition.com/courses/CodeCoalition/iOS101/2013_fall/about" 1575 | } 1576 | ] 1577 | }, 1578 | { 1579 | "name": "android", 1580 | "tags": ["mobile"], 1581 | "description": "Build apps for Android devices", 1582 | "home": "http://developer.android.com/index.html", 1583 | "before": [], 1584 | "after": ["windows phone", "swift"], 1585 | "links":[ 1586 | { 1587 | "name": "How to Develop Android Apps", 1588 | "level": 0, 1589 | "url": "https://www.udacity.com/course/ud853" 1590 | }, 1591 | { 1592 | "name": "Building your first app", 1593 | "level": 0, 1594 | "url": "http://developer.android.com/training/basics/firstapp/creating-project.html" 1595 | }, 1596 | { 1597 | "name": "Android Development", 1598 | "level": 0, 1599 | "url": "http://www.vogella.com/tutorials/Android/article.html" 1600 | } 1601 | ] 1602 | }, 1603 | { 1604 | "name": "windows phone", 1605 | "tags": ["mobile"], 1606 | "description": "Build apps for windows phones", 1607 | "home": "https://dev.windowsphone.com/en-us", 1608 | "before": [], 1609 | "after": [".net", "swift", "android"], 1610 | "links":[ 1611 | { 1612 | "name": "Windows App Builder", 1613 | "level": 0, 1614 | "url": "https://build.windowsstore.com/#fbid=9lOGdzuGAkZ" 1615 | } 1616 | ] 1617 | }, 1618 | { 1619 | "name": "parse", 1620 | "tags": ["backend"], 1621 | "description": "A backend for mobile apps", 1622 | "home": "https://parse.com/", 1623 | "before": [], 1624 | "after": ["facebook", "foursquare", "twilio"], 1625 | "links":[ 1626 | { 1627 | "name": "Tutorials", 1628 | "level": 0, 1629 | "url": "https://parse.com/tutorials" 1630 | } 1631 | ] 1632 | }, 1633 | { 1634 | "name": "firebase", 1635 | "tags": ["backend"], 1636 | "description": "Build realtime apps", 1637 | "before": [], 1638 | "after": ["parse"], 1639 | "home": "http://www.firebase.com/", 1640 | "links": [ 1641 | { 1642 | "name": "Tutorial", 1643 | "level": 0, 1644 | "url": "https://www.firebase.com/tutorial/#gettingstarted" 1645 | } 1646 | ] 1647 | }, 1648 | { 1649 | "name": "d3", 1650 | "tags": ["frontend"], 1651 | "description": "A JavaScript library for visualizing data", 1652 | "before": [], 1653 | "after": ["leaflet"], 1654 | "home": "http://d3js.org/", 1655 | "links": [ 1656 | { 1657 | "name": "D3 Tutorials", 1658 | "level": 0, 1659 | "url": "http://alignedleft.com/tutorials/d3/" 1660 | }, 1661 | { 1662 | "name": "Codecademy", 1663 | "level": 0, 1664 | "url": "http://www.codecademy.com/courses/web-beginner-en-kcP9b/0/1" 1665 | }, 1666 | { 1667 | "name": "Interactive Data Visualization for the Web", 1668 | "level": 1, 1669 | "url": "http://chimera.labs.oreilly.com/books/1230000000345/index.html" 1670 | } 1671 | ] 1672 | }, 1673 | { 1674 | "name": "leaflet", 1675 | "tags": ["frontend"], 1676 | "description": "A JavaScript library for maps", 1677 | "before": [], 1678 | "after": ["d3", "api"], 1679 | "home": "http://leafletjs.com/index.html", 1680 | "links": [ 1681 | { 1682 | "name": "Leaflet Tutorials", 1683 | "level": 0, 1684 | "url": "http://leafletjs.com/examples.html" 1685 | }, 1686 | { 1687 | "name": "API Reference", 1688 | "level": 0, 1689 | "url": "http://leafletjs.com/reference.html" 1690 | } 1691 | ] 1692 | }, 1693 | { 1694 | "name": "velocity", 1695 | "tags": ["frontend"], 1696 | "description": "Smooth JavaScript animation", 1697 | "home": "http://velocityjs.org", 1698 | "before": [], 1699 | "after": ["d3", "three.js"], 1700 | "links":[ 1701 | { 1702 | "name": "Documentation", 1703 | "level": 0, 1704 | "url": "http://velocityjs.org" 1705 | }, 1706 | { 1707 | "name": "Improving UI Animation Workflow", 1708 | "level": 0, 1709 | "url": "http://css-tricks.com/improving-ui-animation-workflow-velocity-js/" 1710 | } 1711 | ] 1712 | }, 1713 | { 1714 | "name": "three.js", 1715 | "tags": ["frontend"], 1716 | "description": "A JavaScript 3D library", 1717 | "home": "http://threejs.org/", 1718 | "before": [], 1719 | "after": ["d3", "velocity"], 1720 | "links":[ 1721 | { 1722 | "name": "Documentation", 1723 | "level": 0, 1724 | "url": "http://threejs.org/docs/" 1725 | }, 1726 | { 1727 | "name": "Getting Started With three.js", 1728 | "level": 0, 1729 | "url": "http://aerotwist.com/tutorials/getting-started-with-three-js/" 1730 | } 1731 | ] 1732 | }, 1733 | { 1734 | "name": "neo4j", 1735 | "tags": ["database"], 1736 | "description": "A graph database", 1737 | "before": [], 1738 | "after": ["mongo", "couchdb", "redis", "memcached", "sql"], 1739 | "home": "http://www.neo4j.org/", 1740 | "links": [ 1741 | { 1742 | "name": "Learn Cypher", 1743 | "level": 0, 1744 | "url": "http://www.neo4j.org/learn/cypher" 1745 | } 1746 | ] 1747 | }, 1748 | { 1749 | "name": "rethinkdb", 1750 | "tags": ["database"], 1751 | "description": "An database to store JSON", 1752 | "before": ["json"], 1753 | "after": ["heroku", "json", "couchdb", "http", "neo4j", "redis", "memcached", "sql"], 1754 | "home": "http://www.rethinkdb.com/", 1755 | "links": [ 1756 | { 1757 | "name": "RethinkDB Quickstart", 1758 | "level": 0, 1759 | "url": "http://www.rethinkdb.com/docs/quickstart/" 1760 | }, 1761 | { 1762 | "name": "RethinkDB and Flask", 1763 | "level": 1, 1764 | "url": "http://www.realpython.com/blog/python/rethink-flask-a-simple-todo-list-powered-by-flask-and-rethinkdb/" 1765 | } 1766 | ] 1767 | }, 1768 | { 1769 | "name": "flight", 1770 | "tags": ["frontend"], 1771 | "description": "An event-driven web framework for JavaScript", 1772 | "home": "http://flightjs.github.io", 1773 | "before": [], 1774 | "after": ["ember", "angular", "backbone", "meteor"], 1775 | "links": [ 1776 | { 1777 | "name": "Learn Flight", 1778 | "level": 0, 1779 | "url": "http://learnflight.io" 1780 | } 1781 | ] 1782 | }, 1783 | { 1784 | "name": "meteor", 1785 | "tags": ["backend"], 1786 | "description": "A framework to build realtime web applications in JavaScript", 1787 | "before": [], 1788 | "after": ["angular", "ember", "backbone", "flight"], 1789 | "home": "https://www.meteor.com", 1790 | "links": [ 1791 | { 1792 | "name": "Friendly Walkthrough", 1793 | "level": 0, 1794 | "url": "http://andrewscala.com/meteor/" 1795 | }, 1796 | { 1797 | "name": "EventedMind Advanced Screencasts", 1798 | "level": 0, 1799 | "url": "https://www.eventedmind.com/" 1800 | }, 1801 | { 1802 | "name": "Meteor Manual", 1803 | "level": 0, 1804 | "url": "http://manual.meteor.com/" 1805 | } 1806 | ] 1807 | }, 1808 | { 1809 | "name": "react", 1810 | "tags": ["frontend"], 1811 | "description": "A JavaScript library for building user interfaces", 1812 | "before": ["javascript"], 1813 | "after": ["angular", "jquery", "backbone", "flight"], 1814 | "home": "https://facebook.github.io/react/", 1815 | "links": [ 1816 | { 1817 | "name": "Getting Started", 1818 | "level": 0, 1819 | "url": "https://facebook.github.io/react/docs/getting-started.html" 1820 | }, 1821 | { 1822 | "name": "React.js Introduction For People Who Know jQuery", 1823 | "level": 0, 1824 | "url": "http://reactfordesigners.com/labs/reactjs-introduction-for-people-who-know-just-enough-jquery-to-get-by/" 1825 | } 1826 | ] 1827 | }, 1828 | { 1829 | "name": "ember", 1830 | "tags": ["frontend"], 1831 | "description": "Build robust single-page apps with JavaScript", 1832 | "before": ["javascript"], 1833 | "after": ["angular", "jquery", "backbone", "flight"], 1834 | "home": "http://emberjs.com/", 1835 | "links": [ 1836 | { 1837 | "name": "Getting Started TodoMVC Guide", 1838 | "level": 0, 1839 | "url": "http://emberjs.com/guides/getting-started/" 1840 | }, 1841 | { 1842 | "name": "Ember 101", 1843 | "level": 0, 1844 | "url": "http://ember101.com/" 1845 | }, 1846 | { 1847 | "name": "Let's Learn Ember", 1848 | "level": 0, 1849 | "url": "http://freecourses.tutsplus.com/lets-learn-ember/" 1850 | } 1851 | ] 1852 | }, 1853 | { 1854 | "name": "backbone", 1855 | "tags": ["frontend"], 1856 | "description": "A framework that makes handling data easier in JavaScript", 1857 | "before": ["javascript"], 1858 | "after": ["angular", "jquery", "ember", "flight"], 1859 | "home": "http://backbonejs.org/", 1860 | "links": [ 1861 | { 1862 | "name": "Developing Backbone.js Applications", 1863 | "level": 0, 1864 | "url": "http://addyosmani.github.io/backbone-fundamentals/" 1865 | }, 1866 | { 1867 | "name": "Backbone.js for Absolute Beginners", 1868 | "level": 0, 1869 | "url": "http://adrianmejia.com/blog/2012/09/11/backbone-dot-js-for-absolute-beginners-getting-started/" 1870 | } 1871 | ] 1872 | }, 1873 | { 1874 | "name": "underscore", 1875 | "tags": ["backend"], 1876 | "description": "A utility belt for JavaScript", 1877 | "before": [], 1878 | "after": ["sugar", "backbone", "coffeescript","lodash", "flight"], 1879 | "home": "http://underscorejs.org/", 1880 | "links": [ 1881 | { 1882 | "name": "Getting Cozy with Underscore", 1883 | "level": 0, 1884 | "url": "http://net.tutsplus.com/tutorials/javascript-ajax/getting-cozy-with-underscore-js/" 1885 | } 1886 | ] 1887 | }, 1888 | { 1889 | "name": "lodash", 1890 | "tags": ["backend"], 1891 | "description": "A utility library delivering performance", 1892 | "before": [], 1893 | "after": ["sugar", "backbone", "coffeescript","underscore"], 1894 | "home": "http://lodash.com/", 1895 | "links": [ 1896 | { 1897 | "name": "Documentation", 1898 | "level": 0, 1899 | "url": "http://lodash.com/docs" 1900 | } 1901 | ] 1902 | }, 1903 | { 1904 | "name": "sugar", 1905 | "tags": ["backend"], 1906 | "description": "Extend the functionality of JavaScript", 1907 | "before": [], 1908 | "after": ["underscore", "backbone", "coffeescript"], 1909 | "home": "http://sugarjs.com/", 1910 | "links": [ 1911 | { 1912 | "name": "Features", 1913 | "level": 0, 1914 | "url": "http://sugarjs.com/features" 1915 | } 1916 | ] 1917 | }, 1918 | { 1919 | "name": "coffeescript", 1920 | "tags": ["frontend"], 1921 | "description": "A language that compiles to JavaScript", 1922 | "before": [], 1923 | "after": ["underscore", "angular", "backbone", "jade", "grunt"], 1924 | "home": "http://coffeescript.org/", 1925 | "links": [ 1926 | { 1927 | "name": "Learn X in Y Minutes", 1928 | "level": 0, 1929 | "url": "http://learnxinyminutes.com/docs/coffeescript/" 1930 | } 1931 | ] 1932 | }, 1933 | { 1934 | "name": "dart", 1935 | "tags": ["backend"], 1936 | "description": "An alternative to JavaScript", 1937 | "before": [], 1938 | "after": ["node"], 1939 | "home": "http://dartlang.org", 1940 | "links": [ 1941 | { 1942 | "name": "Programmer’s Guide", 1943 | "level": 0, 1944 | "url": "https://www.dartlang.org/docs/" 1945 | }, 1946 | { 1947 | "name": "Learn X in Y Minutes", 1948 | "level": 0, 1949 | "url": "http://learnxinyminutes.com/docs/dart/" 1950 | } 1951 | ] 1952 | }, 1953 | { 1954 | "name": "php", 1955 | "tags": ["backend"], 1956 | "description": "A server-side language for the web", 1957 | "before": [], 1958 | "after": ["python", "node", "sql", "laravel", "symfony", "yii", "phpixie", "cakephp"], 1959 | "home": "http://php.net/", 1960 | "links": [ 1961 | { 1962 | "name": "Learn X in Y Minutes", 1963 | "level": 0, 1964 | "url": "http://learnxinyminutes.com/docs/php/" 1965 | }, 1966 | { 1967 | "name": "PHP The Right Way", 1968 | "level": 0, 1969 | "url": "http://www.phptherightway.com" 1970 | }, 1971 | { 1972 | "name": "Learn PHP", 1973 | "level": 0, 1974 | "url": "http://learn-php.org" 1975 | }, 1976 | { 1977 | "name": "I ♥ PHP", 1978 | "level": 0, 1979 | "url": "http://ilovephp.jondh.me.uk/" 1980 | } 1981 | ] 1982 | }, 1983 | { 1984 | "name": "laravel", 1985 | "tags": ["backend"], 1986 | "description": "The most popular php web framework", 1987 | "before": [], 1988 | "after": [], 1989 | "home": "http://www.laravel.com", 1990 | "links": [ 1991 | { 1992 | "name": "Laravel Docs", 1993 | "level": 0, 1994 | "url": "http://laravel.com/docs" 1995 | }, 1996 | { 1997 | "name": "Laravel Ins and Outs", 1998 | "level": 0, 1999 | "url": "http://laravel.io" 2000 | }, 2001 | { 2002 | "name": "Laravel Cheatsheet", 2003 | "level": 0, 2004 | "url": "http://cheats.jesse-obrien.ca/" 2005 | }, 2006 | { 2007 | "name": "Laravel 4 Mastery", 2008 | "level": 0, 2009 | "url": "http://net.tutsplus.com/tutorials/php/laravel-4-mastery/" 2010 | }, 2011 | { 2012 | "name": "Laravel Tutorials via Jason Lewis", 2013 | "level": 0, 2014 | "url": "http://jasonlewis.me/laravel-tutorials" 2015 | } 2016 | ] 2017 | }, 2018 | { 2019 | "name": "phalcon", 2020 | "tags": ["backend"], 2021 | "description": "A popular high-performance php framework", 2022 | "before": [], 2023 | "after": [], 2024 | "home": "http://phalconphp.com/en/", 2025 | "links": [ 2026 | { 2027 | "name": "Let's Learn By Example", 2028 | "level": 0, 2029 | "url": "http://docs.phalconphp.com/en/latest/reference/tutorial.html" 2030 | } 2031 | ] 2032 | }, 2033 | { 2034 | "name": "symfony", 2035 | "tags": ["backend"], 2036 | "description": "A high performance php framework", 2037 | "before": [], 2038 | "after": ["twig"], 2039 | "home": "http://symfony.com/", 2040 | "links": [ 2041 | { 2042 | "name": "Symfony in 5 minutes", 2043 | "level": 0, 2044 | "url": "http://symfony.com/in-five-minutes" 2045 | }, 2046 | { 2047 | "name": "Get started", 2048 | "level": 0, 2049 | "url": "http://symfony.com/get-started" 2050 | }, 2051 | { 2052 | "name": "Cookbook", 2053 | "level": 0, 2054 | "url": "http://symfony.com/doc/current/book/index.html" 2055 | } 2056 | ] 2057 | }, 2058 | { 2059 | "name": "codeigniter", 2060 | "tags": ["backend"], 2061 | "description": "A php web framework", 2062 | "before": [], 2063 | "after": ["mysql"], 2064 | "home": "http://ellislab.com/codeigniter", 2065 | "links": [ 2066 | { 2067 | "name": "CodeIgniter user manual", 2068 | "level": 0, 2069 | "url": "http://ellislab.com/codeigniter/user-guide/" 2070 | } 2071 | ] 2072 | }, 2073 | { 2074 | "name": "cakephp", 2075 | "tags": ["backend"], 2076 | "description": "A framework for php applications", 2077 | "before": [], 2078 | "after": [], 2079 | "home": "http://cakephp.org/", 2080 | "links": [ 2081 | { 2082 | "name": "CakePHP Cookbook (Docs)", 2083 | "level": 0, 2084 | "url": "http://book.cakephp.org/2.0/en/" 2085 | }, 2086 | { 2087 | "name": "Blog Tutorial", 2088 | "level": 0, 2089 | "url": "http://book.cakephp.org/2.0/en/tutorials-and-examples/blog/blog.html" 2090 | }, 2091 | { 2092 | "name": "Community & Help", 2093 | "level": 0, 2094 | "url": "http://community.cakephp.org/" 2095 | } 2096 | ] 2097 | }, 2098 | { 2099 | "name": "yii", 2100 | "tags": ["backend"], 2101 | "description": "A php framework built for ajax", 2102 | "before": [], 2103 | "after": ["twig"], 2104 | "home": "http://yiiframework.com/", 2105 | "links": [ 2106 | { 2107 | "name": "The Definitive Guide to Yii", 2108 | "level": 0, 2109 | "url": "http://www.yiiframework.com/doc/guide/1.1/en/quickstart.what-is-yii" 2110 | }, 2111 | { 2112 | "name": "Larry Ullman's Learning Yii Series", 2113 | "level": 0, 2114 | "url": "http://www.larryullman.com/series/learning-the-yii-framework/" 2115 | }, 2116 | { 2117 | "name":"Yii Screencasts", 2118 | "level": 0, 2119 | "url": "http://www.yiiframework.com/screencasts/" 2120 | }, 2121 | { 2122 | "name": "The Yii Blog Tutorial", 2123 | "level": 1, 2124 | "url": "http://www.yiiframework.com/doc/blog/" 2125 | } 2126 | ] 2127 | }, 2128 | { 2129 | "name": "twig", 2130 | "tags": ["backend"], 2131 | "description": "A template engine for php", 2132 | "before": [], 2133 | "after": [], 2134 | "home": "http://twig.sensiolabs.org/", 2135 | "links": [ 2136 | { 2137 | "name": "Documentation", 2138 | "level": 0, 2139 | "url": "http://twig.sensiolabs.org/documentation" 2140 | } 2141 | ] 2142 | }, 2143 | { 2144 | "name": "phpixie", 2145 | "tags": ["backend"], 2146 | "description": "An easy-to-learn php framework", 2147 | "before": [], 2148 | "after": [], 2149 | "home": "http://phpixie.com/", 2150 | "links": [ 2151 | { 2152 | "name": "30 Minute Tutorial", 2153 | "level": 0, 2154 | "url": "http://phpixie.com/tutorials/learn-phpixie-in-30-minutes/" 2155 | }, 2156 | { 2157 | "name": "Developer Blog", 2158 | "level": 0, 2159 | "url": "http://phpixie.com/blog/" 2160 | } 2161 | ] 2162 | }, 2163 | { 2164 | "name": "groovy", 2165 | "tags": ["backend"], 2166 | "description": "A dynamic language that works with Java", 2167 | "home": "", 2168 | "before": [], 2169 | "after": ["scala"], 2170 | "links": [ 2171 | { 2172 | "name": "Beginner's Tutorial", 2173 | "level": 0, 2174 | "url": "http://groovy.codehaus.org/Beginners+Tutorial" 2175 | }, 2176 | { 2177 | "name": "The Groovy Goodness Blog", 2178 | "level": 0, 2179 | "url": "http://mrhaki.blogspot.com/search/label/Groovy%3AGoodness" 2180 | } 2181 | ] 2182 | }, 2183 | { 2184 | "name": "clojure", 2185 | "tags": ["backend"], 2186 | "description": "A lisp dialect which runs on the JVM", 2187 | "home": "http://www.clojure.org/", 2188 | "before": [], 2189 | "after": [], 2190 | "links":[ 2191 | { 2192 | "name": "Clojure for the Brave and True", 2193 | "level": 0, 2194 | "url": "http://www.braveclojure.com/" 2195 | }, 2196 | { 2197 | "name": "Clojure for Beginners", 2198 | "level": 0, 2199 | "url": "http://blackstag.com/blog.posting?id=5" 2200 | }, 2201 | { 2202 | "name": "4clojure", 2203 | "level": 1, 2204 | "url": "http://4clojure.com/" 2205 | } 2206 | ] 2207 | }, 2208 | { 2209 | "name": "xml", 2210 | "tags": ["database"], 2211 | "description": "An alternative to json", 2212 | "home": "", 2213 | "before": [], 2214 | "after": ["json", "http"], 2215 | "links": [ 2216 | { 2217 | "name": "XML Tutorial", 2218 | "level": 0, 2219 | "url": "http://www.quackit.com/xml/tutorial/" 2220 | } 2221 | ] 2222 | }, 2223 | { 2224 | "name": "firebase", 2225 | "tags": ["backend"], 2226 | "description": "A realtime backend for your web or mobile app", 2227 | "home": "https://www.firebase.com/index.html", 2228 | "before": [], 2229 | "after": [], 2230 | "links": [ 2231 | { 2232 | "name": "5 Minute Chat Tutorial", 2233 | "level": 0, 2234 | "url": "https://www.firebase.com/tutorial/#gettingstarted" 2235 | }, 2236 | { 2237 | "name": "Codecademy", 2238 | "level": 0, 2239 | "url": "http://www.codecademy.com/tracks/firebase" 2240 | } 2241 | ] 2242 | }, 2243 | { 2244 | "name": "apache", 2245 | "tags": ["bridge"], 2246 | "description": "A very popular http web server", 2247 | "home": "https://httpd.apache.org/", 2248 | "before": [], 2249 | "after": ["http", "rest", "nginx"], 2250 | "links":[ 2251 | { 2252 | "name": "Apache Documentation", 2253 | "level": 0, 2254 | "url": "https://httpd.apache.org/docs/2.4/" 2255 | } 2256 | ] 2257 | }, 2258 | { 2259 | "name": "nginx", 2260 | "tags": ["bridge"], 2261 | "description": "A popular http web server, load balancer, and http cache", 2262 | "home": "http://nginx.org/", 2263 | "before": [], 2264 | "after": ["http", "rest", "apache"], 2265 | "links":[ 2266 | { 2267 | "name": "Beginner's Guide", 2268 | "level": 0, 2269 | "url": "http://nginx.org/en/docs/beginners_guide.html" 2270 | } 2271 | ] 2272 | }, 2273 | { 2274 | "name": "perl", 2275 | "tags": ["backend"], 2276 | "description": "A popular programming language", 2277 | "home": "http://www.perl.org/", 2278 | "before": [], 2279 | "after": ["sql", "postgresql", "vagrant"], 2280 | "links":[ 2281 | { 2282 | "name": "Learn Perl", 2283 | "level": 0, 2284 | "url": "http://www.perl.org/learn.html" 2285 | }, 2286 | { 2287 | "name": "CPAN", 2288 | "level": 0, 2289 | "url": "http://www.cpan.org/" 2290 | }, 2291 | { 2292 | "name": "metacpan", 2293 | "level": 0, 2294 | "url": "http://www.metacpan.org/" 2295 | }, 2296 | { 2297 | "name": "Advanced Perl", 2298 | "level": 2, 2299 | "url": "http://docstore.mik.ua/orelly/perl/advprog/" 2300 | } 2301 | ] 2302 | }, 2303 | { 2304 | "name": "vagrant", 2305 | "tags": ["bridge"], 2306 | "description": "A tool for building and managing virtual environments", 2307 | "home": "http://www.vagrantup.com/", 2308 | "before": [], 2309 | "after": ["docker"], 2310 | "links":[ 2311 | { 2312 | "name":"Why Vagrant?", 2313 | "level": 0, 2314 | "url": "http://docs-v1.vagrantup.com/v1/docs/getting-started/why.html" 2315 | }, 2316 | { 2317 | "name": "Getting Started", 2318 | "level": 0, 2319 | "url": "http://docs.vagrantup.com/v2/getting-started/index.html" 2320 | } 2321 | ] 2322 | }, 2323 | { 2324 | "name": "docker", 2325 | "tags": ["bridge"], 2326 | "description": "Create lightweight, portable, self-sufficient containers", 2327 | "home": "http://www.docker.io/", 2328 | "before": [], 2329 | "after": ["vagrant"], 2330 | "links":[ 2331 | { 2332 | "name": "Docker Interactive Tutorial", 2333 | "level": 0, 2334 | "url": "http://docs.docker.com/linux/started/" 2335 | } 2336 | ] 2337 | }, 2338 | { 2339 | "name": "c#", 2340 | "tags": ["backend"], 2341 | "description": "A popular web programming language", 2342 | "home": "http://en.wikipedia.org/wiki/C_Sharp_(programming_language)", 2343 | "before": [], 2344 | "after": [".net"], 2345 | "links": [ 2346 | { 2347 | "name": "Learn X in Y Minutes", 2348 | "level": 0, 2349 | "url": "http://learnxinyminutes.com/docs/csharp/" 2350 | } 2351 | ] 2352 | }, 2353 | { 2354 | "name": ".net", 2355 | "tags": ["backend"], 2356 | "description": "A web framework for c#", 2357 | "home": "http://www.microsoft.com/net", 2358 | "before": [], 2359 | "after": ["api","sql","bootstrap"], 2360 | "links":[ 2361 | { 2362 | "name": "Intro to ASP.NET MVC 5", 2363 | "level": 0, 2364 | "url": "http://www.asp.net/mvc/tutorials/mvc-5/introduction/getting-started" 2365 | } 2366 | ] 2367 | }, 2368 | { 2369 | "name": "lightswitch", 2370 | "tags": ["backend"], 2371 | "description": "A development framework for the web and mobile", 2372 | "home": "http://msdn.microsoft.com/en-us/vstudio/ff796201", 2373 | "before": [], 2374 | "after": [".net","sql"], 2375 | "links":[ 2376 | { 2377 | "name": "Intro to Lightswitch", 2378 | "level": 0, 2379 | "url": "http://blogs.msdn.com/b/bethmassi/archive/2011/12/01/beginning-lightswitch-getting-started.aspx" 2380 | } 2381 | ] 2382 | }, 2383 | { 2384 | "name": "coldfusion", 2385 | "tags": ["backend"], 2386 | "description": "A server application for Java", 2387 | "home": "http://www.adobe.com/products/coldfusion-family.html", 2388 | "before": [], 2389 | "after": ["sql"], 2390 | "links":[ 2391 | { 2392 | "name":"Coldfusion Tutorials", 2393 | "level": 0, 2394 | "url": "http://www.quackit.com/coldfusion/tutorial/" 2395 | }, 2396 | { 2397 | "name":"Raymond Camden's CF Blog", 2398 | "level": 0, 2399 | "url": "http://www.raymondcamden.com/index.cfm/ColdFusion" 2400 | }, 2401 | { 2402 | "name": "Dan Vega's CF Blog entries", 2403 | "level": 0, 2404 | "url": "http://www.danvega.org/blog/coldfusion" 2405 | }, 2406 | { 2407 | "name": "Ben Nadel CF Blog entries", 2408 | "level": 0, 2409 | "url": "http://www.bennadel.com/blog/tags/1-ColdFusion-blog-entries.htm" 2410 | } 2411 | ] 2412 | }, 2413 | { 2414 | "name": "seo", 2415 | "tags": ["bridge"], 2416 | "description": "Ranking well in search engines", 2417 | "home": "", 2418 | "before": [], 2419 | "after": [], 2420 | "links":[ 2421 | { 2422 | "name": "Google's Starter Guide", 2423 | "level": 0, 2424 | "url": "https://static.googleusercontent.com/external_content/untrusted_dlcp/www.google.com/en//webmasters/docs/search-engine-optimization-starter-guide.pdf" 2425 | }, 2426 | { 2427 | "name": "The Advanced Guide to SEO", 2428 | "level": 0, 2429 | "url": "http://www.quicksprout.com/the-advanced-guide-to-seo/" 2430 | } 2431 | ] 2432 | }, 2433 | { 2434 | "name": "api", 2435 | "tags": ["api"], 2436 | "description": "How to expose and access data from different services", 2437 | "home": "", 2438 | "before": [], 2439 | "after": ["rest", "webhooks", "mashape"], 2440 | "links": [ 2441 | { 2442 | "name": "Designing an API", 2443 | "level": 0, 2444 | "url": "http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api?hn" 2445 | }, 2446 | { 2447 | "name": "A list of 40+ tutorials on how to make an api", 2448 | "level": 0, 2449 | "url": "http://blog.mashape.com/post/60820526317/list-of-40-tutorials-on-how-to-create-an-api" 2450 | }, 2451 | { 2452 | "name": "Debug and test APIs and backend services.", 2453 | "level": 0, 2454 | "url": "https://www.runscope.com" 2455 | } 2456 | ] 2457 | }, 2458 | { 2459 | "name": "webhooks", 2460 | "tags": ["api"], 2461 | "description": "HTTP based integrations", 2462 | "home": "", 2463 | "before": [], 2464 | "after": ["api"], 2465 | "links": [ 2466 | { 2467 | "name": "7 Reasons Webhooks Are Magic", 2468 | "level": 0, 2469 | "url": "http://blog.iron.io/2013/09/7-reasons-webhooks-are-magic.html" 2470 | }, 2471 | { 2472 | "name": "Troubleshooting Webhooks", 2473 | "level": 0, 2474 | "url": "https://www.runscope.com/provider-guide/troubleshooting-webhooks" 2475 | } 2476 | ] 2477 | }, 2478 | { 2479 | "name": "stack exchange", 2480 | "tags": ["api"], 2481 | "description": "Access all of Stack Exchange and Stack Overflow", 2482 | "home": "https://api.stackexchange.com/", 2483 | "before": [], 2484 | "after": [], 2485 | "links": [ 2486 | { 2487 | "name": "Docs", 2488 | "level": 0, 2489 | "url": "https://api.stackexchange.com/docs" 2490 | } 2491 | ] 2492 | }, 2493 | { 2494 | "name": "google", 2495 | "tags": ["api"], 2496 | "description": "An enormous collection of APIs from Google", 2497 | "home": "http://developers.google.com", 2498 | "before": [], 2499 | "after": [], 2500 | "links": [ 2501 | { 2502 | "name": "Google API Explorer", 2503 | "level": 0, 2504 | "url": "https://developers.google.com/apis-explorer/#p/" 2505 | } 2506 | ] 2507 | }, 2508 | { 2509 | "name": "mashape", 2510 | "tags": ["api"], 2511 | "description": "Distribute, monetize, and consume multiple APIs", 2512 | "home": "", 2513 | "before": [], 2514 | "after": ["facebook", "foursquare", "twilio"], 2515 | "links": [ 2516 | { 2517 | "name": "Codecademy", 2518 | "level": 0, 2519 | "url": "http://www.codecademy.com/tracks/mashape" 2520 | } 2521 | ] 2522 | }, 2523 | { 2524 | "name": "facebook", 2525 | "tags": ["api"], 2526 | "description": "Get data about people and their networks", 2527 | "home": "https://developers.facebook.com/", 2528 | "before": [], 2529 | "after": ["foursquare", "twilio"], 2530 | "links":[ 2531 | { 2532 | "name": "Explore", 2533 | "level": 0, 2534 | "url": "https://developers.facebook.com/tools/explorer" 2535 | } 2536 | ] 2537 | }, 2538 | { 2539 | "name": "foursquare", 2540 | "tags": ["api"], 2541 | "description": "Get data about places", 2542 | "home": "http://developer.foursquare.com/", 2543 | "before": [], 2544 | "after": ["facebook", "twilio"], 2545 | "links":[ 2546 | { 2547 | "name": "Tutorial", 2548 | "level": 0, 2549 | "url": "https://developer.foursquare.com/overview/tutorial" 2550 | }, 2551 | { 2552 | "name": "Explore", 2553 | "level": 0, 2554 | "url": "https://developer.foursquare.com/docs/explore" 2555 | } 2556 | ] 2557 | }, 2558 | { 2559 | "name": "sendgrid", 2560 | "tags": ["api"], 2561 | "description": "An email API", 2562 | "home": "http://sendgrid.com", 2563 | "before": [], 2564 | "after": [], 2565 | "links":[ 2566 | { 2567 | "name": "Docs", 2568 | "level": 0, 2569 | "url": "http://sendgrid.com/docs/" 2570 | }, 2571 | { 2572 | "name": "Codecademy", 2573 | "level": 0, 2574 | "url": "http://www.codecademy.com/tracks/sendgrid" 2575 | } 2576 | ] 2577 | }, 2578 | { 2579 | "name": "mandrill", 2580 | "tags": ["api"], 2581 | "description": "An email API by Mailchimp", 2582 | "home": "http://mandrill.com", 2583 | "before": [], 2584 | "after": [], 2585 | "links": [ 2586 | { 2587 | "name": "Getting Started with Mandrill", 2588 | "level": 0, 2589 | "url": "http://help.mandrill.com/entries/21650603-How-do-I-get-started-with-Mandrill-" 2590 | } 2591 | ] 2592 | }, 2593 | { 2594 | "name": "semantria", 2595 | "tags": ["api"], 2596 | "description": "A text and sentiment analysis API", 2597 | "home": "http://semantria.com", 2598 | "before": [], 2599 | "after": [], 2600 | "links":[ 2601 | { 2602 | "name": "Developer Portal", 2603 | "level": 0, 2604 | "url": "https://semantria.com/developer" 2605 | } 2606 | ] 2607 | }, 2608 | { 2609 | "name": "twilio", 2610 | "tags": ["api"], 2611 | "description": "Send and receive texts and calls", 2612 | "home": "http://twilio.com/", 2613 | "before": [], 2614 | "after": ["facebook", "foursquare"], 2615 | "links":[ 2616 | { 2617 | "name": "Quickstart", 2618 | "level": 0, 2619 | "url": "http://www.twilio.com/docs/quickstart" 2620 | } 2621 | ] 2622 | }, 2623 | { 2624 | "name": "stripe", 2625 | "tags": ["api"], 2626 | "description": "Accept payments on your site", 2627 | "home": "https://stripe.com/", 2628 | "before": [], 2629 | "after": [], 2630 | "links": [ 2631 | { 2632 | "name": "Get Started", 2633 | "level": 0, 2634 | "url": "https://stripe.com/docs" 2635 | }, 2636 | { 2637 | "name": "Making Your First Charge", 2638 | "level": 0, 2639 | "url": "https://stripe.com/docs/tutorials/charges" 2640 | } 2641 | ] 2642 | }, 2643 | { 2644 | "name": "alchemy", 2645 | "tags": ["api"], 2646 | "description": "A text analysis API", 2647 | "home": "http://www.alchemyapi.com/", 2648 | "before": [], 2649 | "after": ["facebook", "foursquare", "twilio"], 2650 | "links":[ 2651 | { 2652 | "name": "Getting Started Guide", 2653 | "level": 0, 2654 | "url": "http://www.alchemyapi.com/developers/getting-started-guide/" 2655 | }, 2656 | { 2657 | "name": "Interactive Web Demo", 2658 | "level": 0, 2659 | "url": "http://www.alchemyapi.com/products/demo/" 2660 | }, 2661 | { 2662 | "name": "Docs", 2663 | "level": 1, 2664 | "url": "http://www.alchemyapi.com/api/" 2665 | }, 2666 | { 2667 | "name": "SDKs", 2668 | "level": 1, 2669 | "url": "http://www.alchemyapi.com/developers/sdks/" 2670 | } 2671 | ] 2672 | }, 2673 | { 2674 | "name": "lob", 2675 | "tags": ["api"], 2676 | "description": "An API that lets you print and mail documents", 2677 | "home": "http://lob.com", 2678 | "before": [], 2679 | "after": ["facebook", "foursquare", "twilio"], 2680 | "links": [ 2681 | { 2682 | "name": "docs", 2683 | "level": 0, 2684 | "url": "https://www.lob.com/docs" 2685 | } 2686 | ] 2687 | }, 2688 | { 2689 | "name": "shirts.io", 2690 | "tags": ["api"], 2691 | "description": "An API to send custom shirts", 2692 | "home": "https://www.shirts.io/", 2693 | "before": [], 2694 | "after": [], 2695 | "links": [ 2696 | { 2697 | "name": "Products API", 2698 | "level": 0, 2699 | "url": "https://www.shirts.io/docs/products_reference/" 2700 | } 2701 | ] 2702 | }, 2703 | { 2704 | "name": "plivo", 2705 | "tags": ["api"], 2706 | "description": "Service to send and receive texts and calls", 2707 | "home": "https://www.plivo.com/", 2708 | "before": [], 2709 | "after": [], 2710 | "links":[ 2711 | { 2712 | "name": "Getting Started", 2713 | "level": 0, 2714 | "url": "https://www.plivo.com/docs/getting-started/" 2715 | } 2716 | ] 2717 | } 2718 | ] 2719 | --------------------------------------------------------------------------------