From 04b5063117bb4ca3ff6c686e8d0879b0de75f49d Mon Sep 17 00:00:00 2001 From: Jerome Cukier Date: Thu, 28 Sep 2017 00:03:20 -0700 Subject: [PATCH] adding instructions to setup a new coding environment (#16) --- .../1-install-tools-windows.md | 69 ++++++++++++ .../2-install-tools-mac.md | 105 ++++++++++++++++++ .../3-cloning.md | 51 +++++++++ src/mdRoutes.js | 24 ++++ static/images/setup/empty-app.png | Bin 0 -> 6488 bytes static/images/setup/setup.png | Bin 0 -> 12884 bytes 6 files changed, 249 insertions(+) create mode 100644 src/docs/installing-a-coding-environment/1-install-tools-windows.md create mode 100644 src/docs/installing-a-coding-environment/2-install-tools-mac.md create mode 100644 src/docs/installing-a-coding-environment/3-cloning.md create mode 100644 static/images/setup/empty-app.png create mode 100644 static/images/setup/setup.png diff --git a/src/docs/installing-a-coding-environment/1-install-tools-windows.md b/src/docs/installing-a-coding-environment/1-install-tools-windows.md new file mode 100644 index 00000000..fbb590cc --- /dev/null +++ b/src/docs/installing-a-coding-environment/1-install-tools-windows.md @@ -0,0 +1,69 @@ +# Installing a coding environment - Windows + +Before you get started with the lessons, you need to have number of tools installed on your machine. Here are detailed steps to get everything you need on Windows. If you are using MacOS, checkout [our MacOS guide instead](#/installing-a-coding-environment/installing-tools-mac). + +## Get a text editor + +First things first is to make sure you have a robust text editor. I am partial to [Sublime Text](https://www.sublimetext.com/3) but there are lots of other good options like [Visual Studio](https://code.visualstudio.com/), [Atom](https://atom.io) and many others. + +## Get Node.js + +The next step is to get [node.js](https://nodejs.org/en/download/). Simply follow the link to the Windows installer and follow instructions with default options. + +When you are done, find the node.js command prompt in your start menu and type: + +``` +node -v +``` + +to make sure that it's installed. This command should return the version of the node.js you have installed. + +## Get Git + +Now, download [git for windows](https://git-scm.com/) and again, go through the installation with default settings. + +Likewise, when you are done, from your node.js command prompt window, type: + +``` +git --version +``` + +and veryify that it's installed. + +## Get a Mapbox token + +If you are going to follow a tutorial that uses React-Map-GL, you will probably need a Mapbox token. Go to [Mapbox.com](http://mapbox.com) and sign up or sign in, then go to your account, and finally, click on API access tokens. + +Either create a new token or copy the one you want to use. + +Then, using our text editor from the first step, we're going to edit the file nodevars.bat found in the same folder where node.js was installed (probably C:\Program Files\nodejs). + +After line 4, which should be something like +``` +set "PATH=%APPDATA%\npm;%~dp0;%PATH%" +``` + +you're going to type + +``` +set "MapboxAccessToken=[your mapbox access token goes here]" +``` + +(you'll replace [your mapbox access token goes here] by the mapbox access token you just created or copied, and there's no brackets.) + +Save this file. +It may be protected, in which case find it in the file explorer, remove security options and save again. + +In your node.js command prompt window, type nodevars. + +Then type: + +``` +set +``` + +And you should see your MapboxAccessToken. +Each time you will reopen your node.js command prompt, MapboxAccessToken will be already set. + +Next, we're going to download the code files you need to follow the lesson. [Continue the setup here](#/installing-a-coding-environment/downloading-code-examples). (Note - this last step is the same for Mac and Windows) + diff --git a/src/docs/installing-a-coding-environment/2-install-tools-mac.md b/src/docs/installing-a-coding-environment/2-install-tools-mac.md new file mode 100644 index 00000000..c2c3e6fa --- /dev/null +++ b/src/docs/installing-a-coding-environment/2-install-tools-mac.md @@ -0,0 +1,105 @@ +# Installing a coding environment - MacOS + +Before you get started with the lessons, you need to have number of tools installed on your machine. Here are detailed steps to get everything you need on MacOS. If you are using Windows, checkout [our Windows guide instead](#/installing-a-coding-environment/installing-tools-windows). + +The following instructions are written for a completely new machine, assuming that nothing you'll need is installed yet. + +## Get a text editor + +First things first is to make sure you have a robust text editor. I am partial to [Sublime Text](https://www.sublimetext.com/3) but there are lots of other good options like [Visual Studio](https://code.visualstudio.com/), [Atom](https://atom.io) and many others. + +## Open terminal + +Go to Finder, then in the top menu, select Go, then Utilities. You will find your terminal. Once open, right click on its icon in the dock bar and in the Options, select Keep in dock bar. + +## Install Xcode command line tools + +In your terminal prompt, type: + +``` +xcode-select --install +``` + +to install the Xcode command line tools. + +Then, agree to the license: + +``` +sudo xcodebuild -license +``` + +Type in your password, page through the document then finally at the end, type agree. + +## Install homebrew + +Homebrew is what will enable us to install node and git in a minute. + +In your terminal prompt, type (or, let's be real, copy/paste): +``` +/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" +``` + +## Get Node.js + +Still in your terminal prompt, type: + +``` +brew install node +``` + +Then, at the prompt: + +``` +node -v +``` + +to make sure that it's installed. This command should return the version of the node.js you have installed. + +## Get Git + +Now, type: + +``` +brew install git +``` + +Likewise, when you are done, from your node.js command prompt window, type: + +``` +git --version +``` + +and veryify that it's installed. + +## Get a Mapbox token + +If you are going to follow a tutorial that uses React-Map-GL, you will probably need a Mapbox token. Go to [Mapbox.com](http://mapbox.com) and sign up or sign in, then go to your account, and finally, click on API access tokens. + +Either create a new token or copy the one you want to use. + +Next, we're going to put that token in your .bash_profile file so that you can access it when needed. + +.bash_profile doesn't necessarily exist, on a new machine, it has to be created. So either find it (in your home folder) or create a new file. + +There, add the line: + +``` +export MAPBOX_TOKEN="[your mapbox access token]" +``` + +(you'll replace [your mapbox access token goes here] by the mapbox access token you just created or copied, and there's no brackets.) + +Save this file - if you are creating a new .bash_profile file, it should go in your home folder. +Close your terminal window and reopen it. + +Now type: + +``` +echo $MAPBOX_TOKEN +``` + +And you should see your Mapbox access token. +Each time you will reopen your terminal, your access token will be present in your environment. + +Next, we're going to download the code files you need to follow the lesson. [Continue the setup here](#/installing-a-coding-environment/3-cloning). (Note - this last step is the same for Mac and Windows) + diff --git a/src/docs/installing-a-coding-environment/3-cloning.md b/src/docs/installing-a-coding-environment/3-cloning.md new file mode 100644 index 00000000..62ff01cc --- /dev/null +++ b/src/docs/installing-a-coding-environment/3-cloning.md @@ -0,0 +1,51 @@ +In the previous steps, we've installed: +- a code editor, +- node.js and npm, +- git, + +we've obtained a mapbox token and we made sure it will be accessible each time you need it. + +If you haven't accomplished this yet, that's how you do it: +- [on Windows](#/installing-a-coding-environment/1-install-tools-windows) +- [on MacOS](#/installing-a-coding-environment/2-install-tools-mac) + +Next, we are going to get the code files that we need. + +# Cloning the repository + +All the code examples are stored on a github repository. To be able to follow the lessons, you will need to modify these examples on your local machine, which is why you need to get your own, local copy. + +In your node.js command prompt window, type: + +``` +git clone https://github.com/uber-common/vis-academy.git +``` + +which will download your own copy from github. + +After this is done, a copy of the vis-academy repo should be in the vis-academy folder. + +# Verifying that everything works + +We are going to build the app from the first lesson, "Building a Geospatial App", to make sure that everything works: + +Type: + +``` +cd vis-academy/src/demos/building-a-geospatial-app/starting-code +npm install +``` + +This step can take a minute or two as all the dependencies are downloaded. When you have access to the prompt again, type: + +``` +npm run start +``` + +And open your browser at this address: http://localhost:3030/ - though a new browser should already be open. + +If you see: +![empty app - Edit me!](images/setup/emtpy-app.png) + +Congratulations! You are ready to enroll to the academy. +If the app cannot find your Mapbox token, it would let you know. Go back to the previous step and make sure it's set in your environment variables. diff --git a/src/mdRoutes.js b/src/mdRoutes.js index 495794f4..bfc9dd7a 100644 --- a/src/mdRoutes.js +++ b/src/mdRoutes.js @@ -1,3 +1,12 @@ +// Setup + +import SetupWindows from + 'docs/installing-a-coding-environment/1-install-tools-windows.md'; +import SetupMac from + 'docs/installing-a-coding-environment/2-install-tools-mac.md'; +import SetupCloning from + 'docs/installing-a-coding-environment/3-cloning.md'; + // Building a geospatial app import GeospatialAppSetup from 'docs/building-a-geospatial-app/0-setup.md'; @@ -42,6 +51,21 @@ import layoutEngine from 'docs/graph/3-layout-engine.md'; import interactionHover from 'docs/graph/4-interaction.md'; export default [{ + name: 'Installing a coding environment', + desc: 'Prepare your machine for the Academy', + image: 'images/setup/setup.png', + path: '/installing-a-coding-environment', + data: [{ + name: 'Installing tools - Windows', + markdown: SetupWindows + }, { + name: 'Installing tools - Mac', + markdown: SetupMac + }, { + name: 'Downloading code examples', + markdown: SetupCloning + }] +}, { name: 'Building a Geospatial App', desc: 'Learn how to create maps, layer data on top of them and draw charts with the Uber vis libraries.', image: 'images/geospatial-app/geospatial-app.png', diff --git a/static/images/setup/empty-app.png b/static/images/setup/empty-app.png new file mode 100644 index 0000000000000000000000000000000000000000..084b6e40da02f2942fdbeb7a2a6e6fc0bc84c4f9 GIT binary patch literal 6488 zcmeHM{Xd)M8b>)^dRo-XrYqKM)oI1l8pVirHEYm%scOV@>a9vk1VPYgy_9apHanEG zb-YHTq>?Ua5{l}kYAq2GNs6MLNFvp|NP_dMwSVCJdi-`h_vgN^`?|m1>%Ol0^L@%f z-~qdgERD3Zv~~p^_dThlrGwPc(hfEF2RQOI;_-@>)`!-CzFuM3F{0`C)~0#xqZ!Py z_7=@W!nd!ggY^XqHDt)hEl z@YMFU=H%!!Itn9WMRLK1i<-ek3-T!=uuY8!+yL0%zZlx(JpCt`m&KJo-05(ysV0Uh z8QxgwH|820>R2JJU${Cumttu0*szp%vnNpZQF(6zMmzvJ`0i?~#N z&SI+Bi7%gRYH9%t{K)U0it5rBNn>y~(GLtkkOO^u@bUPmU|vkl{Lj$QuU7xLBr%?^ zAkyU=xn^~gvSatLTj5_!G;X*o-pt5a4ai%*+rL}%r;oAd;YyipL*m{GcfAy{b$*Hi z!>*T~Jy)sCWp1eO1kzJi(abgLi=*y}vxIL0U^A+ z%0u;v%t^-gRD#_6XHDNKJ2pDGt%(EDz*?wH>4aPdo~7~QD(s=0MSuM~&^d+3+@Ok> zn;VUq?gU&uxq@IsFoPev%?g|{k39SAd~H&5)>2aqIbS~2LZI+-cSvN?A?vgX2Zpj& z0Srd2_YFHRzj}fAxaW~&N~Uch8;Q-gK+0UJj?I>e)ey?`<@(kA6^EY>uurcA4}|Dk z0^gpt&OdlY+=4Ug(gCcBZiWLCbA; zK3|_|YiZ!{F%o(fhr zoeDB|i@Q#M0f~M+SG5Gs0fcFE*#u<#B4cd0dOp2)~Wz6|B9vSQb{%ybH6ruAteh%h*URn3z*~Y3}Sg8Ir#V&4NA) z)6vb|suRDPg2I~ajb0SHSxmN;4KneG4^~#^n>H{P_y*;SM{5C2%qAz@g zJXhtGRdW<0JvzISQ2kr^EQ*bwus%Csi=0zpf93PD?QIy3gw{-Fn1_L8uQc4&2bCL9 zqXB%IXYu=Q-|2)f!}C}pFUP)dIw7nt--j9xC3qx7DPWb^KA4gyguKJ7N9AU2iMkv{ zl+~m8NjKc(rv*7M&5Dm;(au2azVSH&Fe{^*QFE~=M0yr_DLqWe!VuSIg;j3i#Kn4a zjDioGsxptK<9wpR?#Urtza)If(zgMAbCWzErGgyH^(W`v(0vrGEj`NLctw{={cb6e zhFsU$tLylUVxRWK+?KdTx3%`;?dlG|HyKYL1L9Mh%ft4xpafYy@chhRQ2k97vF<)t zSg6$v)JyB&CA2D|im#}Yb2qqt7Kkrb&LRN3dQi?o3&elHjmjYjGGsGF)L??x3m?>c z#TwNerbyqHx6;S^jKyy(ZV|(x6K|JrPB`<%>pfWN>72!S+N}=u$(gX0NU(3L9+&he z^6jiJwn#yNIyE}IPmk7O*9}}Tq$|&4&y>(s4y#>{9`09>R8-YKBH}7x>>>4gp;uw= z{m(%@MsRqvU#w?rm?Do=jpCfdWpxC7YkuDRQxx$ej})eG+r?NuEe-by|M6rCQq~&M zHe8M}+Z59z{QS6XohGq`ke3Kkp2E^C#_LWgj`K3Bz-Kc;wL;Sgg(*xln0I!7}*!im-mME5sxv z*t)3#)KRLyG{Q6jXZevv-Ffx3x4*Ll7ZWsiexx(laknhgc|5YW30`ma6sT^QUjpG! zegeXQ!}XxQj=io2e7aN}?D66KnSx9~YXQ$25z$fIO!aj+aO2s?US5Xm_df1L8lg@& zR(x*1L}Fs|gNX^!Fy6^P1G7+q;GE$Ng)w&uaaJf~xI3_C;a3lT=d^>w_-_`~7*Hip zI_M3sv28+(*_N2#4=#@=-qIYlRf28FV_S^cR@Syq^+rcl|#X Uv@j }}%WKe%tFcWm*00cqjNt^fc4 literal 0 HcmV?d00001 diff --git a/static/images/setup/setup.png b/static/images/setup/setup.png new file mode 100644 index 0000000000000000000000000000000000000000..a898f69dff80377b7ac5746e50c6c3b4b3f479c8 GIT binary patch literal 12884 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 literal 0 HcmV?d00001